From 2e5077e8d8b62eb5f03307f5b7f38de64d096163 Mon Sep 17 00:00:00 2001 From: ShirosakiMio <852468399@qq.com> Date: Tue, 24 Sep 2024 08:46:54 +0800 Subject: [PATCH] add Boat lwjgl --- .../assets/app_runtime/lwjgl-boat/lwjgl.jar | Bin 0 -> 2950774 bytes .../assets/app_runtime/lwjgl-boat/version | 1 + .../tungsten/fcl/fragment/RuntimeFragment.kt | 6 +- LWJGL-Boat/build.gradle | 35 + LWJGL-Boat/libs/asm-debug-all.jar | Bin 0 -> 321450 bytes LWJGL-Boat/libs/cacio.jar | Bin 0 -> 1391 bytes LWJGL-Boat/libs/fake-vulkan-module.jar | Bin 0 -> 6017717 bytes LWJGL-Boat/libs/jinput.jar | Bin 0 -> 214859 bytes .../src/main/java/org/lwjgl/BufferChecks.java | 292 + .../src/main/java/org/lwjgl/BufferUtils.java | 267 + .../src/main/java/org/lwjgl/CLongBuffer.java | 407 + .../main/java/org/lwjgl/LWJGLException.java | 79 + .../src/main/java/org/lwjgl/LWJGLUtil.java | 632 + .../src/main/java/org/lwjgl/MemoryUtil.java | 441 + .../main/java/org/lwjgl/PointerBuffer.java | 804 ++ .../main/java/org/lwjgl/PointerWrapper.java | 43 + .../org/lwjgl/PointerWrapperAbstract.java | 92 + LWJGL-Boat/src/main/java/org/lwjgl/Sys.java | 181 + .../src/main/java/org/lwjgl/Version.java | 127 + .../src/main/java/org/lwjgl/VersionImpl.java | 32 + .../main/java/org/lwjgl/glfw/Callbacks.java | 60 + .../main/java/org/lwjgl/glfw/EventLoop.java | 58 + .../main/java/org/lwjgl/glfw/FCLInjector.java | 170 + .../org/lwjgl/glfw/FCLInjectorCallback.java | 55 + .../org/lwjgl/glfw/FCLInjectorCallbackI.java | 33 + .../src/main/java/org/lwjgl/glfw/GLFW.java | 5176 ++++++++ .../org/lwjgl/glfw/GLFWAllocateCallback.java | 101 + .../org/lwjgl/glfw/GLFWAllocateCallbackI.java | 83 + .../java/org/lwjgl/glfw/GLFWAllocator.java | 342 + .../java/org/lwjgl/glfw/GLFWCharCallback.java | 86 + .../org/lwjgl/glfw/GLFWCharCallbackI.java | 57 + .../org/lwjgl/glfw/GLFWCharModsCallback.java | 89 + .../org/lwjgl/glfw/GLFWCharModsCallbackI.java | 62 + .../lwjgl/glfw/GLFWCursorEnterCallback.java | 86 + .../lwjgl/glfw/GLFWCursorEnterCallbackI.java | 57 + .../org/lwjgl/glfw/GLFWCursorPosCallback.java | 87 + .../lwjgl/glfw/GLFWCursorPosCallbackI.java | 63 + .../lwjgl/glfw/GLFWDeallocateCallback.java | 98 + .../lwjgl/glfw/GLFWDeallocateCallbackI.java | 77 + .../java/org/lwjgl/glfw/GLFWDropCallback.java | 101 + .../org/lwjgl/glfw/GLFWDropCallbackI.java | 60 + .../org/lwjgl/glfw/GLFWErrorCallback.java | 162 + .../org/lwjgl/glfw/GLFWErrorCallbackI.java | 57 + .../glfw/GLFWFramebufferSizeCallback.java | 87 + .../glfw/GLFWFramebufferSizeCallbackI.java | 60 + .../java/org/lwjgl/glfw/GLFWGamepadState.java | 350 + .../java/org/lwjgl/glfw/GLFWGammaRamp.java | 361 + .../main/java/org/lwjgl/glfw/GLFWImage.java | 345 + .../org/lwjgl/glfw/GLFWJoystickCallback.java | 86 + .../org/lwjgl/glfw/GLFWJoystickCallbackI.java | 57 + .../java/org/lwjgl/glfw/GLFWKeyCallback.java | 87 + .../java/org/lwjgl/glfw/GLFWKeyCallbackI.java | 64 + .../org/lwjgl/glfw/GLFWMonitorCallback.java | 86 + .../org/lwjgl/glfw/GLFWMonitorCallbackI.java | 57 + .../lwjgl/glfw/GLFWMouseButtonCallback.java | 86 + .../lwjgl/glfw/GLFWMouseButtonCallbackI.java | 61 + .../java/org/lwjgl/glfw/GLFWNativeCocoa.java | 81 + .../java/org/lwjgl/glfw/GLFWNativeEGL.java | 220 + .../java/org/lwjgl/glfw/GLFWNativeGLX.java | 158 + .../java/org/lwjgl/glfw/GLFWNativeNSGL.java | 62 + .../java/org/lwjgl/glfw/GLFWNativeOSMesa.java | 220 + .../java/org/lwjgl/glfw/GLFWNativeWGL.java | 113 + .../org/lwjgl/glfw/GLFWNativeWayland.java | 97 + .../java/org/lwjgl/glfw/GLFWNativeWin32.java | 158 + .../java/org/lwjgl/glfw/GLFWNativeX11.java | 207 + .../lwjgl/glfw/GLFWReallocateCallback.java | 103 + .../lwjgl/glfw/GLFWReallocateCallbackI.java | 87 + .../org/lwjgl/glfw/GLFWScrollCallback.java | 87 + .../org/lwjgl/glfw/GLFWScrollCallbackI.java | 60 + .../main/java/org/lwjgl/glfw/GLFWVidMode.java | 202 + .../main/java/org/lwjgl/glfw/GLFWVulkan.java | 352 + .../lwjgl/glfw/GLFWWindowCloseCallback.java | 85 + .../lwjgl/glfw/GLFWWindowCloseCallbackI.java | 54 + .../glfw/GLFWWindowContentScaleCallback.java | 87 + .../glfw/GLFWWindowContentScaleCallbackI.java | 60 + .../lwjgl/glfw/GLFWWindowFocusCallback.java | 86 + .../lwjgl/glfw/GLFWWindowFocusCallbackI.java | 57 + .../lwjgl/glfw/GLFWWindowIconifyCallback.java | 86 + .../glfw/GLFWWindowIconifyCallbackI.java | 57 + .../glfw/GLFWWindowMaximizeCallback.java | 86 + .../glfw/GLFWWindowMaximizeCallbackI.java | 57 + .../org/lwjgl/glfw/GLFWWindowPosCallback.java | 87 + .../lwjgl/glfw/GLFWWindowPosCallbackI.java | 60 + .../lwjgl/glfw/GLFWWindowRefreshCallback.java | 85 + .../glfw/GLFWWindowRefreshCallbackI.java | 55 + .../lwjgl/glfw/GLFWWindowSizeCallback.java | 85 + .../lwjgl/glfw/GLFWWindowSizeCallbackI.java | 58 + .../main/java/org/lwjgl/input/Controller.java | 290 + .../java/org/lwjgl/input/ControllerEvent.java | 222 + .../java/org/lwjgl/input/Controllers.java | 308 + .../src/main/java/org/lwjgl/input/Cursor.java | 284 + .../main/java/org/lwjgl/input/EventQueue.java | 83 + .../lwjgl/input/GLFWInputImplementation.java | 183 + .../java/org/lwjgl/input/InfdevMouse.java | 26 + .../org/lwjgl/input/JInputController.java | 537 + .../main/java/org/lwjgl/input/KeyCodes.java | 276 + .../main/java/org/lwjgl/input/Keyboard.java | 582 + .../src/main/java/org/lwjgl/input/Mouse.java | 659 + .../java/org/lwjgl/nanovg/BNDnodeTheme.java | 428 + .../main/java/org/lwjgl/nanovg/BNDtheme.java | 576 + .../java/org/lwjgl/nanovg/BNDwidgetTheme.java | 447 + .../main/java/org/lwjgl/nanovg/Blendish.java | 2472 ++++ .../main/java/org/lwjgl/nanovg/LibNanoVG.java | 46 + .../java/org/lwjgl/nanovg/NSVGGradient.java | 225 + .../org/lwjgl/nanovg/NSVGGradientStop.java | 162 + .../main/java/org/lwjgl/nanovg/NSVGImage.java | 172 + .../main/java/org/lwjgl/nanovg/NSVGPaint.java | 180 + .../main/java/org/lwjgl/nanovg/NSVGPath.java | 207 + .../main/java/org/lwjgl/nanovg/NSVGShape.java | 409 + .../main/java/org/lwjgl/nanovg/NVGColor.java | 370 + .../org/lwjgl/nanovg/NVGGlyphPosition.java | 287 + .../org/lwjgl/nanovg/NVGLUFramebuffer.java | 188 + .../lwjgl/nanovg/NVGLUFramebufferBGFX.java | 188 + .../main/java/org/lwjgl/nanovg/NVGPaint.java | 448 + .../java/org/lwjgl/nanovg/NVGTextRow.java | 311 + .../main/java/org/lwjgl/nanovg/NanoSVG.java | 276 + .../main/java/org/lwjgl/nanovg/NanoVG.java | 2923 +++++ .../java/org/lwjgl/nanovg/NanoVGBGFX.java | 205 + .../main/java/org/lwjgl/nanovg/NanoVGGL2.java | 190 + .../main/java/org/lwjgl/nanovg/NanoVGGL3.java | 190 + .../java/org/lwjgl/nanovg/NanoVGGLConfig.java | 121 + .../java/org/lwjgl/nanovg/NanoVGGLES2.java | 190 + .../java/org/lwjgl/nanovg/NanoVGGLES3.java | 190 + .../src/main/java/org/lwjgl/nanovg/OUI.java | 735 ++ .../main/java/org/lwjgl/nanovg/UIHandler.java | 76 + .../java/org/lwjgl/nanovg/UIHandlerI.java | 50 + .../main/java/org/lwjgl/nanovg/UIRect.java | 370 + .../main/java/org/lwjgl/nanovg/UIVec2.java | 338 + .../src/main/java/org/lwjgl/openal/AL.java | 386 + .../src/main/java/org/lwjgl/openal/AL10.java | 1909 +++ .../src/main/java/org/lwjgl/openal/AL11.java | 426 + .../src/main/java/org/lwjgl/openal/ALC.java | 355 + .../src/main/java/org/lwjgl/openal/ALC10.java | 531 + .../src/main/java/org/lwjgl/openal/ALC11.java | 253 + .../org/lwjgl/openal/ALCCapabilities.java | 297 + .../java/org/lwjgl/openal/ALCapabilities.java | 630 + .../java/org/lwjgl/openal/ALCcontext.java | 115 + .../main/java/org/lwjgl/openal/ALCdevice.java | 121 + .../main/java/org/lwjgl/openal/ALUtil.java | 53 + .../src/main/java/org/lwjgl/openal/EFX10.java | 224 + .../main/java/org/lwjgl/openal/EFXUtil.java | 254 + .../main/java/org/lwjgl/openal/EXTAlaw.java | 18 + .../java/org/lwjgl/openal/EXTBFormat.java | 36 + .../java/org/lwjgl/openal/EXTCapture.java | 199 + .../java/org/lwjgl/openal/EXTDedicated.java | 29 + .../lwjgl/openal/EXTDefaultFilterOrder.java | 23 + .../java/org/lwjgl/openal/EXTDisconnect.java | 66 + .../main/java/org/lwjgl/openal/EXTDouble.java | 18 + .../main/java/org/lwjgl/openal/EXTEfx.java | 1867 +++ .../org/lwjgl/openal/EXTExponentDistance.java | 23 + .../java/org/lwjgl/openal/EXTFloat32.java | 18 + .../main/java/org/lwjgl/openal/EXTIma4.java | 18 + .../org/lwjgl/openal/EXTLinearDistance.java | 23 + .../java/org/lwjgl/openal/EXTMCFormats.java | 31 + .../main/java/org/lwjgl/openal/EXTMulaw.java | 18 + .../org/lwjgl/openal/EXTMulawBFormat.java | 24 + .../org/lwjgl/openal/EXTMulawMCFormats.java | 23 + .../main/java/org/lwjgl/openal/EXTOffset.java | 24 + .../lwjgl/openal/EXTSourceDistanceModel.java | 22 + .../org/lwjgl/openal/EXTSourceRadius.java | 23 + .../org/lwjgl/openal/EXTStaticBuffer.java | 126 + .../org/lwjgl/openal/EXTStereoAngles.java | 25 + .../lwjgl/openal/EXTThreadLocalContext.java | 54 + .../main/java/org/lwjgl/openal/EXTVorbis.java | 16 + .../org/lwjgl/openal/EnumerateAllExt.java | 26 + .../org/lwjgl/openal/LOKIAudioChannel.java | 19 + .../java/org/lwjgl/openal/LOKIIMAADPCM.java | 18 + .../org/lwjgl/openal/LOKIQuadriphonic.java | 18 + .../java/org/lwjgl/openal/LOKIWAVEFormat.java | 16 + .../org/lwjgl/openal/OpenALException.java | 85 + .../java/org/lwjgl/openal/SOFTBformatEx.java | 37 + .../org/lwjgl/openal/SOFTBlockAlignment.java | 23 + .../lwjgl/openal/SOFTBufferLengthQuery.java | 29 + .../org/lwjgl/openal/SOFTBufferSamples.java | 383 + .../org/lwjgl/openal/SOFTBufferSubData.java | 85 + .../org/lwjgl/openal/SOFTCallbackBuffer.java | 138 + .../lwjgl/openal/SOFTCallbackBufferType.java | 75 + .../lwjgl/openal/SOFTCallbackBufferTypeI.java | 61 + .../org/lwjgl/openal/SOFTDeferredUpdates.java | 66 + .../org/lwjgl/openal/SOFTDeviceClock.java | 132 + .../org/lwjgl/openal/SOFTDirectChannels.java | 26 + .../lwjgl/openal/SOFTDirectChannelsRemix.java | 25 + .../org/lwjgl/openal/SOFTEffectTarget.java | 32 + .../java/org/lwjgl/openal/SOFTEventProc.java | 78 + .../java/org/lwjgl/openal/SOFTEventProcI.java | 55 + .../java/org/lwjgl/openal/SOFTEvents.java | 112 + .../org/lwjgl/openal/SOFTGainClampEx.java | 32 + .../main/java/org/lwjgl/openal/SOFTHRTF.java | 135 + .../java/org/lwjgl/openal/SOFTLoopPoints.java | 21 + .../java/org/lwjgl/openal/SOFTLoopback.java | 238 + .../org/lwjgl/openal/SOFTLoopbackBformat.java | 43 + .../java/org/lwjgl/openal/SOFTMSADPCM.java | 22 + .../org/lwjgl/openal/SOFTOutputLimiter.java | 21 + .../java/org/lwjgl/openal/SOFTOutputMode.java | 37 + .../org/lwjgl/openal/SOFTPauseDevice.java | 69 + .../org/lwjgl/openal/SOFTReopenDevice.java | 118 + .../org/lwjgl/openal/SOFTSourceLatency.java | 490 + .../org/lwjgl/openal/SOFTSourceLength.java | 30 + .../org/lwjgl/openal/SOFTSourceResampler.java | 58 + .../lwjgl/openal/SOFTSourceSpatialize.java | 42 + .../lwjgl/openal/SOFTSourceStartDelay.java | 74 + .../main/java/org/lwjgl/openal/SOFTUHJ.java | 108 + .../main/java/org/lwjgl/openal/SOFTUHJEx.java | 39 + .../lwjgl/openal/SOFTXHoldOnDisconnect.java | 20 + .../src/main/java/org/lwjgl/openal/Util.java | 86 + .../java/org/lwjgl/openal/package-info.java | 21 + .../lwjgl/opengl/AMDBlendMinmaxFactor.java | 31 + .../java/org/lwjgl/opengl/AMDDebugOutput.java | 335 + .../lwjgl/opengl/AMDDepthClampSeparate.java | 29 + .../org/lwjgl/opengl/AMDDrawBuffersBlend.java | 45 + .../AMDFramebufferMultisampleAdvanced.java | 54 + .../lwjgl/opengl/AMDGPUShaderHalfFloat.java | 44 + .../opengl/AMDGPUShaderHalfFloatFetch.java | 52 + .../org/lwjgl/opengl/AMDGPUShaderInt64.java | 449 + .../lwjgl/opengl/AMDInterleavedElements.java | 48 + .../lwjgl/opengl/AMDOcclusionQueryEvent.java | 53 + .../lwjgl/opengl/AMDPerformanceMonitor.java | 284 + .../org/lwjgl/opengl/AMDPinnedMemory.java | 23 + .../lwjgl/opengl/AMDQueryBufferObject.java | 43 + .../org/lwjgl/opengl/AMDSamplePositions.java | 58 + .../opengl/AMDSeamlessCubemapPerTexture.java | 34 + .../org/lwjgl/opengl/AMDSparseTexture.java | 62 + .../opengl/AMDStencilOperationExtended.java | 44 + .../lwjgl/opengl/AMDTransformFeedback4.java | 23 + .../opengl/AMDVertexShaderTessellator.java | 100 + .../org/lwjgl/opengl/ARBBaseInstance.java | 205 + .../org/lwjgl/opengl/ARBBindlessTexture.java | 389 + .../lwjgl/opengl/ARBBlendFuncExtended.java | 106 + .../org/lwjgl/opengl/ARBBufferObject.java | 5 + .../org/lwjgl/opengl/ARBBufferStorage.java | 742 ++ .../java/org/lwjgl/opengl/ARBCLEvent.java | 65 + .../lwjgl/opengl/ARBClearBufferObject.java | 403 + .../org/lwjgl/opengl/ARBClearTexture.java | 344 + .../java/org/lwjgl/opengl/ARBClipControl.java | 59 + .../org/lwjgl/opengl/ARBColorBufferFloat.java | 62 + .../ARBCompressedTexturePixelStorage.java | 41 + .../org/lwjgl/opengl/ARBComputeShader.java | 121 + .../opengl/ARBComputeVariableGroupSize.java | 67 + .../opengl/ARBConditionalRenderInverted.java | 26 + .../java/org/lwjgl/opengl/ARBCopyBuffer.java | 59 + .../java/org/lwjgl/opengl/ARBCopyImage.java | 60 + .../org/lwjgl/opengl/ARBCullDistance.java | 26 + .../java/org/lwjgl/opengl/ARBDebugOutput.java | 393 + .../org/lwjgl/opengl/ARBDepthBufferFloat.java | 40 + .../java/org/lwjgl/opengl/ARBDepthClamp.java | 37 + .../org/lwjgl/opengl/ARBDepthTexture.java | 34 + .../lwjgl/opengl/ARBDirectStateAccess.java | 3433 +++++ .../java/org/lwjgl/opengl/ARBDrawBuffers.java | 79 + .../org/lwjgl/opengl/ARBDrawBuffersBlend.java | 112 + .../opengl/ARBDrawElementsBaseVertex.java | 332 + .../org/lwjgl/opengl/ARBDrawIndirect.java | 271 + .../org/lwjgl/opengl/ARBDrawInstanced.java | 120 + .../org/lwjgl/opengl/ARBES2Compatibility.java | 148 + .../lwjgl/opengl/ARBES31Compatibility.java | 68 + .../lwjgl/opengl/ARBES32Compatibility.java | 63 + .../org/lwjgl/opengl/ARBES3Compatibility.java | 43 + .../org/lwjgl/opengl/ARBEnhancedLayouts.java | 35 + .../opengl/ARBExplicitUniformLocation.java | 24 + .../org/lwjgl/opengl/ARBFragmentProgram.java | 74 + .../org/lwjgl/opengl/ARBFragmentShader.java | 32 + .../opengl/ARBFramebufferNoAttachments.java | 177 + .../lwjgl/opengl/ARBFramebufferObject.java | 719 ++ .../org/lwjgl/opengl/ARBFramebufferSRGB.java | 39 + .../java/org/lwjgl/opengl/ARBGLSPIRV.java | 166 + .../java/org/lwjgl/opengl/ARBGPUShader5.java | 78 + .../org/lwjgl/opengl/ARBGPUShaderFP64.java | 949 ++ .../org/lwjgl/opengl/ARBGPUShaderInt64.java | 888 ++ .../org/lwjgl/opengl/ARBGeometryShader4.java | 164 + .../org/lwjgl/opengl/ARBGetProgramBinary.java | 113 + .../lwjgl/opengl/ARBGetTextureSubImage.java | 307 + .../org/lwjgl/opengl/ARBHalfFloatPixel.java | 33 + .../org/lwjgl/opengl/ARBHalfFloatVertex.java | 31 + .../java/org/lwjgl/opengl/ARBImaging.java | 1303 ++ .../lwjgl/opengl/ARBIndirectParameters.java | 190 + .../org/lwjgl/opengl/ARBInstancedArrays.java | 73 + .../lwjgl/opengl/ARBInternalformatQuery.java | 74 + .../lwjgl/opengl/ARBInternalformatQuery2.java | 219 + .../lwjgl/opengl/ARBInvalidateSubdata.java | 185 + .../lwjgl/opengl/ARBMapBufferAlignment.java | 23 + .../org/lwjgl/opengl/ARBMapBufferRange.java | 111 + .../org/lwjgl/opengl/ARBMatrixPalette.java | 200 + .../java/org/lwjgl/opengl/ARBMultiBind.java | 336 + .../lwjgl/opengl/ARBMultiDrawIndirect.java | 267 + .../java/org/lwjgl/opengl/ARBMultisample.java | 70 + .../org/lwjgl/opengl/ARBMultitexture.java | 724 ++ .../org/lwjgl/opengl/ARBOcclusionQuery.java | 350 + .../org/lwjgl/opengl/ARBOcclusionQuery2.java | 25 + .../opengl/ARBParallelShaderCompile.java | 49 + .../opengl/ARBPipelineStatisticsQuery.java | 45 + .../lwjgl/opengl/ARBPixelBufferObject.java | 65 + .../org/lwjgl/opengl/ARBPointParameters.java | 88 + .../java/org/lwjgl/opengl/ARBPointSprite.java | 40 + .../lwjgl/opengl/ARBPolygonOffsetClamp.java | 52 + .../opengl/ARBProgramInterfaceQuery.java | 319 + .../org/lwjgl/opengl/ARBProvokingVertex.java | 60 + .../lwjgl/opengl/ARBQueryBufferObject.java | 47 + .../java/org/lwjgl/opengl/ARBRobustness.java | 1083 ++ .../org/lwjgl/opengl/ARBSPIRVExtensions.java | 39 + .../org/lwjgl/opengl/ARBSampleLocations.java | 132 + .../org/lwjgl/opengl/ARBSampleShading.java | 55 + .../org/lwjgl/opengl/ARBSamplerObjects.java | 380 + .../org/lwjgl/opengl/ARBSeamlessCubeMap.java | 34 + .../opengl/ARBSeamlessCubemapPerTexture.java | 37 + .../opengl/ARBSeparateShaderObjects.java | 1597 +++ .../lwjgl/opengl/ARBShaderAtomicCounters.java | 136 + .../lwjgl/opengl/ARBShaderImageLoadStore.java | 158 + .../org/lwjgl/opengl/ARBShaderObjects.java | 1374 ++ .../opengl/ARBShaderStorageBufferObject.java | 88 + .../org/lwjgl/opengl/ARBShaderSubroutine.java | 362 + .../lwjgl/opengl/ARBShadingLanguage100.java | 22 + .../opengl/ARBShadingLanguageInclude.java | 439 + .../main/java/org/lwjgl/opengl/ARBShadow.java | 33 + .../org/lwjgl/opengl/ARBShadowAmbient.java | 24 + .../org/lwjgl/opengl/ARBSparseBuffer.java | 71 + .../org/lwjgl/opengl/ARBSparseTexture.java | 148 + .../org/lwjgl/opengl/ARBStencilTexturing.java | 24 + .../main/java/org/lwjgl/opengl/ARBSync.java | 245 + .../lwjgl/opengl/ARBTessellationShader.java | 151 + .../org/lwjgl/opengl/ARBTextureBarrier.java | 32 + .../lwjgl/opengl/ARBTextureBorderClamp.java | 31 + .../lwjgl/opengl/ARBTextureBufferObject.java | 86 + .../lwjgl/opengl/ARBTextureBufferRange.java | 65 + .../lwjgl/opengl/ARBTextureCompression.java | 345 + .../opengl/ARBTextureCompressionBPTC.java | 36 + .../opengl/ARBTextureCompressionRGTC.java | 39 + .../org/lwjgl/opengl/ARBTextureCubeMap.java | 68 + .../lwjgl/opengl/ARBTextureCubeMapArray.java | 48 + .../lwjgl/opengl/ARBTextureEnvCombine.java | 58 + .../org/lwjgl/opengl/ARBTextureEnvDot3.java | 24 + .../opengl/ARBTextureFilterAnisotropic.java | 46 + .../lwjgl/opengl/ARBTextureFilterMinmax.java | 38 + .../org/lwjgl/opengl/ARBTextureFloat.java | 49 + .../org/lwjgl/opengl/ARBTextureGather.java | 26 + .../opengl/ARBTextureMirrorClampToEdge.java | 30 + .../opengl/ARBTextureMirroredRepeat.java | 28 + .../lwjgl/opengl/ARBTextureMultisample.java | 165 + .../java/org/lwjgl/opengl/ARBTextureRG.java | 59 + .../lwjgl/opengl/ARBTextureRGB10_A2UI.java | 28 + .../org/lwjgl/opengl/ARBTextureRectangle.java | 61 + .../org/lwjgl/opengl/ARBTextureStorage.java | 126 + .../opengl/ARBTextureStorageMultisample.java | 98 + .../org/lwjgl/opengl/ARBTextureSwizzle.java | 39 + .../java/org/lwjgl/opengl/ARBTextureView.java | 69 + .../java/org/lwjgl/opengl/ARBTimerQuery.java | 148 + .../lwjgl/opengl/ARBTransformFeedback2.java | 176 + .../lwjgl/opengl/ARBTransformFeedback3.java | 133 + .../opengl/ARBTransformFeedbackInstanced.java | 57 + .../ARBTransformFeedbackOverflowQuery.java | 28 + .../org/lwjgl/opengl/ARBTransposeMatrix.java | 161 + .../lwjgl/opengl/ARBUniformBufferObject.java | 481 + .../org/lwjgl/opengl/ARBVertexArrayBGRA.java | 56 + .../lwjgl/opengl/ARBVertexArrayObject.java | 119 + .../lwjgl/opengl/ARBVertexAttrib64Bit.java | 299 + .../lwjgl/opengl/ARBVertexAttribBinding.java | 225 + .../java/org/lwjgl/opengl/ARBVertexBlend.java | 398 + .../lwjgl/opengl/ARBVertexBufferObject.java | 811 ++ .../org/lwjgl/opengl/ARBVertexProgram.java | 1555 +++ .../org/lwjgl/opengl/ARBVertexShader.java | 1268 ++ .../opengl/ARBVertexType2_10_10_10_REV.java | 705 + .../org/lwjgl/opengl/ARBViewportArray.java | 282 + .../java/org/lwjgl/opengl/ARBWindowPos.java | 339 + .../java/org/lwjgl/opengl/ATIMeminfo.java | 28 + .../opengl/ATITextureCompression3DC.java | 16 + .../lwjgl/opengl/AWTCanvasImplementation.java | 59 + .../java/org/lwjgl/opengl/AWTGLCanvas.java | 416 + .../src/main/java/org/lwjgl/opengl/CGL.java | 1650 +++ .../main/java/org/lwjgl/opengl/Context.java | 50 + .../java/org/lwjgl/opengl/ContextAttribs.java | 476 + .../org/lwjgl/opengl/ContextCapabilities.java | 409 + .../main/java/org/lwjgl/opengl/ContextGL.java | 265 + .../main/java/org/lwjgl/opengl/Display.java | 1057 ++ .../lwjgl/opengl/DisplayImplementation.java | 200 + .../java/org/lwjgl/opengl/DisplayMode.java | 144 + .../main/java/org/lwjgl/opengl/Drawable.java | 77 + .../java/org/lwjgl/opengl/DrawableGL.java | 157 + .../java/org/lwjgl/opengl/DrawableLWJGL.java | 71 + .../java/org/lwjgl/opengl/EXT422Pixels.java | 36 + .../main/java/org/lwjgl/opengl/EXTABGR.java | 21 + .../main/java/org/lwjgl/opengl/EXTBGRA.java | 25 + .../org/lwjgl/opengl/EXTBindableUniform.java | 57 + .../java/org/lwjgl/opengl/EXTBlendColor.java | 40 + .../opengl/EXTBlendEquationSeparate.java | 41 + .../lwjgl/opengl/EXTBlendFuncSeparate.java | 37 + .../java/org/lwjgl/opengl/EXTBlendMinmax.java | 42 + .../org/lwjgl/opengl/EXTBlendSubtract.java | 26 + .../org/lwjgl/opengl/EXTClipVolumeHint.java | 22 + .../lwjgl/opengl/EXTCompiledVertexArray.java | 43 + .../java/org/lwjgl/opengl/EXTDebugLabel.java | 99 + .../java/org/lwjgl/opengl/EXTDebugMarker.java | 76 + .../org/lwjgl/opengl/EXTDepthBoundsTest.java | 57 + .../lwjgl/opengl/EXTDirectStateAccess.java | 4024 ++++++ .../org/lwjgl/opengl/EXTDrawBuffers2.java | 109 + .../org/lwjgl/opengl/EXTDrawInstanced.java | 58 + .../org/lwjgl/opengl/EXTEGLImageStorage.java | 87 + .../org/lwjgl/opengl/EXTExternalBuffer.java | 69 + .../org/lwjgl/opengl/EXTFramebufferBlit.java | 44 + .../opengl/EXTFramebufferBlitLayers.java | 33 + .../opengl/EXTFramebufferMultisample.java | 76 + .../EXTFramebufferMultisampleBlitScaled.java | 38 + .../lwjgl/opengl/EXTFramebufferObject.java | 375 + .../org/lwjgl/opengl/EXTFramebufferSRGB.java | 42 + .../lwjgl/opengl/EXTGPUProgramParameters.java | 68 + .../java/org/lwjgl/opengl/EXTGPUShader4.java | 862 ++ .../org/lwjgl/opengl/EXTGeometryShader4.java | 98 + .../org/lwjgl/opengl/EXTMemoryObject.java | 275 + .../org/lwjgl/opengl/EXTMemoryObjectFD.java | 33 + .../lwjgl/opengl/EXTMemoryObjectWin32.java | 77 + .../lwjgl/opengl/EXTPackedDepthStencil.java | 84 + .../java/org/lwjgl/opengl/EXTPackedFloat.java | 41 + .../lwjgl/opengl/EXTPixelBufferObject.java | 31 + .../org/lwjgl/opengl/EXTPointParameters.java | 100 + .../lwjgl/opengl/EXTPolygonOffsetClamp.java | 48 + .../org/lwjgl/opengl/EXTProvokingVertex.java | 53 + .../lwjgl/opengl/EXTRasterMultisample.java | 78 + .../org/lwjgl/opengl/EXTSecondaryColor.java | 425 + .../java/org/lwjgl/opengl/EXTSemaphore.java | 259 + .../java/org/lwjgl/opengl/EXTSemaphoreFD.java | 33 + .../org/lwjgl/opengl/EXTSemaphoreWin32.java | 74 + .../opengl/EXTSeparateShaderObjects.java | 96 + .../opengl/EXTShaderFramebufferFetch.java | 42 + .../EXTShaderFramebufferFetchNonCoherent.java | 37 + .../lwjgl/opengl/EXTShaderImageLoadStore.java | 122 + .../lwjgl/opengl/EXTSharedTexturePalette.java | 28 + .../org/lwjgl/opengl/EXTStencilClearTag.java | 63 + .../org/lwjgl/opengl/EXTStencilTwoSide.java | 38 + .../java/org/lwjgl/opengl/EXTStencilWrap.java | 33 + .../org/lwjgl/opengl/EXTTextureArray.java | 88 + .../lwjgl/opengl/EXTTextureBufferObject.java | 59 + .../opengl/EXTTextureCompressionLATC.java | 35 + .../opengl/EXTTextureCompressionRGTC.java | 39 + .../opengl/EXTTextureCompressionS3TC.java | 33 + .../opengl/EXTTextureFilterAnisotropic.java | 44 + .../lwjgl/opengl/EXTTextureFilterMinmax.java | 38 + .../org/lwjgl/opengl/EXTTextureInteger.java | 253 + .../lwjgl/opengl/EXTTextureMirrorClamp.java | 31 + .../org/lwjgl/opengl/EXTTextureRectangle.java | 13 + .../java/org/lwjgl/opengl/EXTTextureSRGB.java | 50 + .../lwjgl/opengl/EXTTextureSRGBDecode.java | 50 + .../org/lwjgl/opengl/EXTTextureSRGBR8.java | 26 + .../org/lwjgl/opengl/EXTTextureSRGBRG8.java | 21 + .../opengl/EXTTextureSharedExponent.java | 42 + .../org/lwjgl/opengl/EXTTextureSnorm.java | 54 + .../org/lwjgl/opengl/EXTTextureStorage.java | 89 + .../org/lwjgl/opengl/EXTTextureSwizzle.java | 37 + .../java/org/lwjgl/opengl/EXTTimerQuery.java | 119 + .../lwjgl/opengl/EXTTransformFeedback.java | 231 + .../lwjgl/opengl/EXTVertexAttrib64bit.java | 222 + .../org/lwjgl/opengl/EXTWin32KeyedMutex.java | 50 + .../org/lwjgl/opengl/EXTWindowRectangles.java | 116 + .../org/lwjgl/opengl/EXTX11SyncObject.java | 53 + .../src/main/java/org/lwjgl/opengl/GL.java | 739 ++ .../src/main/java/org/lwjgl/opengl/GL11.java | 10174 +++++++++++++++ .../src/main/java/org/lwjgl/opengl/GL11C.java | 2664 ++++ .../src/main/java/org/lwjgl/opengl/GL12.java | 734 ++ .../src/main/java/org/lwjgl/opengl/GL12C.java | 745 ++ .../src/main/java/org/lwjgl/opengl/GL13.java | 1486 +++ .../src/main/java/org/lwjgl/opengl/GL13C.java | 489 + .../src/main/java/org/lwjgl/opengl/GL14.java | 1292 ++ .../src/main/java/org/lwjgl/opengl/GL14C.java | 318 + .../src/main/java/org/lwjgl/opengl/GL15.java | 1216 ++ .../src/main/java/org/lwjgl/opengl/GL15C.java | 1337 ++ .../src/main/java/org/lwjgl/opengl/GL20.java | 2810 ++++ .../src/main/java/org/lwjgl/opengl/GL20C.java | 2963 +++++ .../src/main/java/org/lwjgl/opengl/GL21.java | 270 + .../src/main/java/org/lwjgl/opengl/GL21C.java | 277 + .../src/main/java/org/lwjgl/opengl/GL30.java | 2669 ++++ .../src/main/java/org/lwjgl/opengl/GL30C.java | 2908 +++++ .../src/main/java/org/lwjgl/opengl/GL31.java | 658 + .../src/main/java/org/lwjgl/opengl/GL31C.java | 740 ++ .../src/main/java/org/lwjgl/opengl/GL32.java | 896 ++ .../src/main/java/org/lwjgl/opengl/GL32C.java | 964 ++ .../src/main/java/org/lwjgl/opengl/GL33.java | 1607 +++ .../src/main/java/org/lwjgl/opengl/GL33C.java | 1049 ++ .../src/main/java/org/lwjgl/opengl/GL40.java | 1705 +++ .../src/main/java/org/lwjgl/opengl/GL40C.java | 1862 +++ .../src/main/java/org/lwjgl/opengl/GL41.java | 2628 ++++ .../src/main/java/org/lwjgl/opengl/GL41C.java | 2795 ++++ .../src/main/java/org/lwjgl/opengl/GL42.java | 610 + .../src/main/java/org/lwjgl/opengl/GL42C.java | 617 + .../src/main/java/org/lwjgl/opengl/GL43.java | 2206 ++++ .../src/main/java/org/lwjgl/opengl/GL43C.java | 2382 ++++ .../src/main/java/org/lwjgl/opengl/GL44.java | 1169 ++ .../src/main/java/org/lwjgl/opengl/GL44C.java | 1239 ++ .../src/main/java/org/lwjgl/opengl/GL45.java | 5682 ++++++++ .../src/main/java/org/lwjgl/opengl/GL45C.java | 5639 ++++++++ .../src/main/java/org/lwjgl/opengl/GL46.java | 373 + .../src/main/java/org/lwjgl/opengl/GL46C.java | 424 + .../java/org/lwjgl/opengl/GLCapabilities.java | 10780 ++++++++++++++++ .../main/java/org/lwjgl/opengl/GLChecks.java | 109 + .../main/java/org/lwjgl/opengl/GLContext.java | 50 + .../opengl/GLDebugMessageAMDCallback.java | 94 + .../opengl/GLDebugMessageAMDCallbackI.java | 67 + .../opengl/GLDebugMessageARBCallback.java | 95 + .../opengl/GLDebugMessageARBCallbackI.java | 70 + .../lwjgl/opengl/GLDebugMessageCallback.java | 95 + .../lwjgl/opengl/GLDebugMessageCallbackI.java | 70 + .../main/java/org/lwjgl/opengl/GLSync.java | 47 + .../main/java/org/lwjgl/opengl/GLUtil.java | 277 + .../src/main/java/org/lwjgl/opengl/GLX.java | 483 + .../src/main/java/org/lwjgl/opengl/GLX11.java | 105 + .../src/main/java/org/lwjgl/opengl/GLX12.java | 32 + .../src/main/java/org/lwjgl/opengl/GLX13.java | 609 + .../src/main/java/org/lwjgl/opengl/GLX14.java | 102 + .../lwjgl/opengl/GLXAMDGPUAssociation.java | 199 + .../opengl/GLXARBContextFlushControl.java | 29 + .../org/lwjgl/opengl/GLXARBCreateContext.java | 107 + .../opengl/GLXARBCreateContextNoError.java | 23 + .../opengl/GLXARBCreateContextProfile.java | 30 + .../opengl/GLXARBCreateContextRobustness.java | 36 + .../org/lwjgl/opengl/GLXARBFBConfigFloat.java | 26 + .../lwjgl/opengl/GLXARBFramebufferSRGB.java | 20 + .../lwjgl/opengl/GLXARBGetProcAddress.java | 105 + .../org/lwjgl/opengl/GLXARBMultisample.java | 22 + .../GLXARBRobustnessApplicationIsolation.java | 34 + .../opengl/GLXARBVertexBufferObject.java | 27 + .../org/lwjgl/opengl/GLXCapabilities.java | 652 + .../org/lwjgl/opengl/GLXEXTBufferAge.java | 23 + .../lwjgl/opengl/GLXEXTContextPriority.java | 30 + .../opengl/GLXEXTCreateContextES2Profile.java | 22 + .../opengl/GLXEXTCreateContextESProfile.java | 22 + .../opengl/GLXEXTFBConfigPackedFloat.java | 37 + .../lwjgl/opengl/GLXEXTFramebufferSRGB.java | 20 + .../org/lwjgl/opengl/GLXEXTImportContext.java | 140 + .../org/lwjgl/opengl/GLXEXTStereoTree.java | 37 + .../org/lwjgl/opengl/GLXEXTSwapControl.java | 51 + .../lwjgl/opengl/GLXEXTSwapControlTear.java | 24 + .../lwjgl/opengl/GLXEXTTextureFromPixmap.java | 148 + .../org/lwjgl/opengl/GLXEXTVisualInfo.java | 53 + .../org/lwjgl/opengl/GLXEXTVisualRating.java | 35 + .../org/lwjgl/opengl/GLXINTELSwapEvent.java | 29 + .../org/lwjgl/opengl/GLXNVCopyBuffer.java | 52 + .../java/org/lwjgl/opengl/GLXNVCopyImage.java | 46 + .../lwjgl/opengl/GLXNVDelayBeforeSwap.java | 65 + .../org/lwjgl/opengl/GLXNVFloatBuffer.java | 20 + .../lwjgl/opengl/GLXNVMultiGPUContext.java | 47 + .../opengl/GLXNVMultisampleCoverage.java | 25 + .../GLXNVRobustnessVideoMemoryPurge.java | 20 + .../java/org/lwjgl/opengl/GLXNVSwapGroup.java | 178 + .../lwjgl/opengl/GLXSGIMakeCurrentRead.java | 58 + .../org/lwjgl/opengl/GLXSGISwapControl.java | 45 + .../org/lwjgl/opengl/GLXSGIVideoSync.java | 105 + .../org/lwjgl/opengl/GLXSGIXFBConfig.java | 265 + .../java/org/lwjgl/opengl/GLXSGIXPbuffer.java | 230 + .../org/lwjgl/opengl/GLXSGIXSwapBarrier.java | 88 + .../org/lwjgl/opengl/GLXSGIXSwapGroup.java | 48 + .../lwjgl/opengl/GLXStereoNotifyEventEXT.java | 229 + .../java/org/lwjgl/opengl/GPU_DEVICE.java | 335 + .../lwjgl/opengl/GREMEDYFrameTerminator.java | 43 + .../org/lwjgl/opengl/GREMEDYStringMarker.java | 76 + .../java/org/lwjgl/opengl/GlobalLock.java | 40 + .../lwjgl/opengl/INTELBlackholeRender.java | 28 + .../INTELConservativeRasterization.java | 31 + .../lwjgl/opengl/INTELFramebufferCMAA.java | 43 + .../org/lwjgl/opengl/INTELMapTexture.java | 203 + .../lwjgl/opengl/INTELPerformanceQuery.java | 347 + .../org/lwjgl/opengl/InputImplementation.java | 134 + .../opengl/KHRBlendEquationAdvanced.java | 89 + .../KHRBlendEquationAdvancedCoherent.java | 26 + .../lwjgl/opengl/KHRContextFlushControl.java | 37 + .../main/java/org/lwjgl/opengl/KHRDebug.java | 632 + .../java/org/lwjgl/opengl/KHRNoError.java | 25 + .../opengl/KHRParallelShaderCompile.java | 47 + .../java/org/lwjgl/opengl/KHRRobustness.java | 335 + .../org/lwjgl/opengl/KHRShaderSubgroup.java | 51 + .../opengl/KHRTextureCompressionASTCLDR.java | 80 + .../lwjgl/opengl/MESAFramebufferFlipX.java | 31 + .../lwjgl/opengl/MESAFramebufferFlipY.java | 65 + .../lwjgl/opengl/MESAFramebufferSwapXY.java | 33 + .../NVAlphaToCoverageDitherControl.java | 37 + .../opengl/NVBindlessMultiDrawIndirect.java | 169 + .../NVBindlessMultiDrawIndirectCount.java | 117 + .../org/lwjgl/opengl/NVBindlessTexture.java | 318 + .../lwjgl/opengl/NVBlendEquationAdvanced.java | 95 + .../NVBlendEquationAdvancedCoherent.java | 26 + .../org/lwjgl/opengl/NVBlendMinmaxFactor.java | 31 + .../org/lwjgl/opengl/NVClipSpaceWScaling.java | 76 + .../java/org/lwjgl/opengl/NVCommandList.java | 659 + .../org/lwjgl/opengl/NVConditionalRender.java | 51 + .../lwjgl/opengl/NVConservativeRaster.java | 57 + .../opengl/NVConservativeRasterDilate.java | 40 + .../opengl/NVConservativeRasterPreSnap.java | 24 + .../NVConservativeRasterPreSnapTriangles.java | 58 + .../org/lwjgl/opengl/NVCopyDepthToColor.java | 29 + .../java/org/lwjgl/opengl/NVCopyImage.java | 30 + .../org/lwjgl/opengl/NVDeepTexture3D.java | 24 + .../org/lwjgl/opengl/NVDepthBufferFloat.java | 65 + .../java/org/lwjgl/opengl/NVDepthClamp.java | 36 + .../java/org/lwjgl/opengl/NVDrawTexture.java | 34 + .../org/lwjgl/opengl/NVDrawVulkanImage.java | 126 + .../lwjgl/opengl/NVExplicitMultisample.java | 96 + .../main/java/org/lwjgl/opengl/NVFence.java | 159 + .../org/lwjgl/opengl/NVFillRectangle.java | 22 + .../java/org/lwjgl/opengl/NVFloatBuffer.java | 41 + .../java/org/lwjgl/opengl/NVFogDistance.java | 44 + .../opengl/NVFragmentCoverageToColor.java | 41 + .../opengl/NVFramebufferMixedSamples.java | 137 + .../NVFramebufferMultisampleCoverage.java | 48 + .../java/org/lwjgl/opengl/NVGPUMulticast.java | 306 + .../java/org/lwjgl/opengl/NVGPUShader5.java | 490 + .../java/org/lwjgl/opengl/NVHalfFloat.java | 636 + .../opengl/NVInternalformatSampleQuery.java | 76 + .../org/lwjgl/opengl/NVLightMaxExponent.java | 23 + .../org/lwjgl/opengl/NVMemoryAttachment.java | 99 + .../lwjgl/opengl/NVMemoryObjectSparse.java | 41 + .../java/org/lwjgl/opengl/NVMeshShader.java | 122 + .../lwjgl/opengl/NVMultisampleCoverage.java | 33 + .../lwjgl/opengl/NVMultisampleFilterHint.java | 27 + .../lwjgl/opengl/NVPackedDepthStencil.java | 30 + .../org/lwjgl/opengl/NVPathRendering.java | 1713 +++ .../opengl/NVPathRenderingSharedEdge.java | 27 + .../org/lwjgl/opengl/NVPixelDataRange.java | 87 + .../java/org/lwjgl/opengl/NVPointSprite.java | 85 + .../org/lwjgl/opengl/NVPrimitiveRestart.java | 52 + .../lwjgl/opengl/NVPrimitiveShadingRate.java | 39 + .../org/lwjgl/opengl/NVQueryResource.java | 73 + .../org/lwjgl/opengl/NVQueryResourceTag.java | 112 + .../opengl/NVRepresentativeFragmentTest.java | 38 + .../opengl/NVRobustnessVideoMemoryPurge.java | 32 + .../org/lwjgl/opengl/NVSampleLocations.java | 129 + .../org/lwjgl/opengl/NVScissorExclusive.java | 73 + .../org/lwjgl/opengl/NVShaderBufferLoad.java | 307 + .../org/lwjgl/opengl/NVShaderBufferStore.java | 26 + .../opengl/NVShaderSubgroupPartitioned.java | 26 + .../org/lwjgl/opengl/NVShaderThreadGroup.java | 27 + .../org/lwjgl/opengl/NVShadingRateImage.java | 180 + .../org/lwjgl/opengl/NVTexgenReflection.java | 22 + .../org/lwjgl/opengl/NVTextureBarrier.java | 28 + .../lwjgl/opengl/NVTextureMultisample.java | 55 + .../org/lwjgl/opengl/NVTextureShader.java | 162 + .../org/lwjgl/opengl/NVTextureShader2.java | 25 + .../org/lwjgl/opengl/NVTextureShader3.java | 52 + .../org/lwjgl/opengl/NVTimelineSemaphore.java | 119 + .../org/lwjgl/opengl/NVTransformFeedback.java | 287 + .../lwjgl/opengl/NVTransformFeedback2.java | 133 + .../opengl/NVUniformBufferUnifiedMemory.java | 34 + .../org/lwjgl/opengl/NVVertexArrayRange.java | 52 + .../org/lwjgl/opengl/NVVertexArrayRange2.java | 27 + .../opengl/NVVertexAttribInteger64bit.java | 311 + .../opengl/NVVertexBufferUnifiedMemory.java | 148 + .../org/lwjgl/opengl/NVViewportSwizzle.java | 61 + .../lwjgl/opengl/NVXConditionalRender.java | 38 + .../org/lwjgl/opengl/NVXGPUMemoryInfo.java | 28 + .../org/lwjgl/opengl/NVXGpuMulticast2.java | 123 + .../org/lwjgl/opengl/NVXProgressFence.java | 108 + .../java/org/lwjgl/opengl/OVRMultiview.java | 120 + .../org/lwjgl/opengl/OpenGLException.java | 89 + .../main/java/org/lwjgl/opengl/Pbuffer.java | 320 + .../main/java/org/lwjgl/opengl/PeerInfo.java | 97 + .../java/org/lwjgl/opengl/PixelFormat.java | 424 + .../org/lwjgl/opengl/PixelFormatLWJGL.java | 41 + .../java/org/lwjgl/opengl/RenderTexture.java | 251 + .../main/java/org/lwjgl/opengl/S3S3TC.java | 26 + .../java/org/lwjgl/opengl/SharedDrawable.java | 57 + .../src/main/java/org/lwjgl/opengl/Sync.java | 175 + .../src/main/java/org/lwjgl/opengl/Util.java | 95 + .../src/main/java/org/lwjgl/opengl/WGL.java | 281 + .../lwjgl/opengl/WGLAMDGPUAssociation.java | 324 + .../org/lwjgl/opengl/WGLARBBufferRegion.java | 123 + .../opengl/WGLARBContextFlushControl.java | 29 + .../org/lwjgl/opengl/WGLARBCreateContext.java | 90 + .../opengl/WGLARBCreateContextNoError.java | 23 + .../opengl/WGLARBCreateContextProfile.java | 30 + .../opengl/WGLARBCreateContextRobustness.java | 36 + .../lwjgl/opengl/WGLARBExtensionsString.java | 54 + .../lwjgl/opengl/WGLARBFramebufferSRGB.java | 25 + .../lwjgl/opengl/WGLARBMakeCurrentRead.java | 85 + .../org/lwjgl/opengl/WGLARBMultisample.java | 28 + .../java/org/lwjgl/opengl/WGLARBPbuffer.java | 206 + .../org/lwjgl/opengl/WGLARBPixelFormat.java | 278 + .../lwjgl/opengl/WGLARBPixelFormatFloat.java | 25 + .../org/lwjgl/opengl/WGLARBRenderTexture.java | 192 + .../WGLARBRobustnessApplicationIsolation.java | 34 + .../lwjgl/opengl/WGLATIPixelFormatFloat.java | 37 + .../opengl/WGLATIRenderTextureRectangle.java | 25 + .../org/lwjgl/opengl/WGLCapabilities.java | 523 + .../org/lwjgl/opengl/WGLEXTColorspace.java | 28 + .../opengl/WGLEXTCreateContextES2Profile.java | 22 + .../opengl/WGLEXTCreateContextESProfile.java | 22 + .../org/lwjgl/opengl/WGLEXTDepthFloat.java | 27 + .../lwjgl/opengl/WGLEXTExtensionsString.java | 46 + .../lwjgl/opengl/WGLEXTFramebufferSRGB.java | 25 + .../opengl/WGLEXTPixelFormatPackedFloat.java | 26 + .../org/lwjgl/opengl/WGLEXTSwapControl.java | 63 + .../java/org/lwjgl/opengl/WGLNVCopyImage.java | 62 + .../java/org/lwjgl/opengl/WGLNVDXInterop.java | 196 + .../lwjgl/opengl/WGLNVDelayBeforeSwap.java | 69 + .../org/lwjgl/opengl/WGLNVFloatBuffer.java | 38 + .../org/lwjgl/opengl/WGLNVGPUAffinity.java | 170 + .../lwjgl/opengl/WGLNVMultigpuContext.java | 43 + .../opengl/WGLNVMultisampleCoverage.java | 25 + .../lwjgl/opengl/WGLNVRenderDepthTexture.java | 40 + .../opengl/WGLNVRenderTextureRectangle.java | 33 + .../java/org/lwjgl/opengl/WGLNVSwapGroup.java | 165 + .../lwjgl/opengl/WGLNVVertexArrayRange.java | 55 + .../opengl/_3DFXTextureCompressionFXT1.java | 37 + .../src/main/java/org/lwjgl/stb/LibSTB.java | 46 + .../src/main/java/org/lwjgl/stb/STBDXT.java | 98 + .../main/java/org/lwjgl/stb/STBEasyFont.java | 241 + .../java/org/lwjgl/stb/STBIEOFCallback.java | 75 + .../java/org/lwjgl/stb/STBIEOFCallbackI.java | 55 + .../java/org/lwjgl/stb/STBIIOCallbacks.java | 339 + .../java/org/lwjgl/stb/STBIReadCallback.java | 93 + .../java/org/lwjgl/stb/STBIReadCallbackI.java | 61 + .../java/org/lwjgl/stb/STBISkipCallback.java | 76 + .../java/org/lwjgl/stb/STBISkipCallbackI.java | 55 + .../java/org/lwjgl/stb/STBIWriteCallback.java | 93 + .../org/lwjgl/stb/STBIWriteCallbackI.java | 58 + .../java/org/lwjgl/stb/STBIZlibCompress.java | 78 + .../java/org/lwjgl/stb/STBIZlibCompressI.java | 66 + .../src/main/java/org/lwjgl/stb/STBImage.java | 1389 ++ .../java/org/lwjgl/stb/STBImageResize.java | 565 + .../java/org/lwjgl/stb/STBImageWrite.java | 611 + .../main/java/org/lwjgl/stb/STBPerlin.java | 107 + .../main/java/org/lwjgl/stb/STBRPContext.java | 356 + .../main/java/org/lwjgl/stb/STBRPNode.java | 283 + .../main/java/org/lwjgl/stb/STBRPRect.java | 385 + .../main/java/org/lwjgl/stb/STBRectPack.java | 149 + .../java/org/lwjgl/stb/STBTTAlignedQuad.java | 325 + .../java/org/lwjgl/stb/STBTTBakedChar.java | 323 + .../main/java/org/lwjgl/stb/STBTTBitmap.java | 359 + .../java/org/lwjgl/stb/STBTTFontinfo.java | 234 + .../java/org/lwjgl/stb/STBTTKerningentry.java | 254 + .../java/org/lwjgl/stb/STBTTPackContext.java | 385 + .../java/org/lwjgl/stb/STBTTPackRange.java | 413 + .../java/org/lwjgl/stb/STBTTPackedchar.java | 437 + .../main/java/org/lwjgl/stb/STBTTVertex.java | 329 + .../main/java/org/lwjgl/stb/STBTruetype.java | 2223 ++++ .../main/java/org/lwjgl/stb/STBVorbis.java | 990 ++ .../java/org/lwjgl/stb/STBVorbisAlloc.java | 300 + .../java/org/lwjgl/stb/STBVorbisComment.java | 266 + .../java/org/lwjgl/stb/STBVorbisInfo.java | 313 + .../main/java/org/lwjgl/system/APIUtil.java | 673 + .../main/java/org/lwjgl/system/Callback.java | 237 + .../main/java/org/lwjgl/system/CallbackI.java | 43 + .../org/lwjgl/system/CheckIntrinsics.java | 38 + .../main/java/org/lwjgl/system/Checks.java | 552 + .../java/org/lwjgl/system/Configuration.java | 723 ++ .../java/org/lwjgl/system/CustomBuffer.java | 433 + .../org/lwjgl/system/FunctionProvider.java | 31 + .../lwjgl/system/FunctionProviderLocal.java | 31 + .../src/main/java/org/lwjgl/system/JNI.java | 1088 ++ .../main/java/org/lwjgl/system/Library.java | 642 + .../org/lwjgl/system/LibraryResource.java | 230 + .../main/java/org/lwjgl/system/MathUtil.java | 171 + .../org/lwjgl/system/MemoryAccessJNI.java | 323 + .../java/org/lwjgl/system/MemoryManage.java | 495 + .../java/org/lwjgl/system/MemoryStack.java | 1127 ++ .../java/org/lwjgl/system/MemoryUtil.java | 3127 +++++ .../org/lwjgl/system/MultiReleaseMemCopy.java | 33 + .../system/MultiReleaseTextDecoding.java | 73 + .../java/org/lwjgl/system/NativeResource.java | 23 + .../java/org/lwjgl/system/NativeType.java | 14 + .../java/org/lwjgl/system/NonnullDefault.java | 15 + .../main/java/org/lwjgl/system/Platform.java | 172 + .../main/java/org/lwjgl/system/Pointer.java | 122 + .../java/org/lwjgl/system/SharedLibrary.java | 69 + .../org/lwjgl/system/SharedLibraryLoader.java | 360 + .../org/lwjgl/system/SharedLibraryUtil.java | 37 + .../java/org/lwjgl/system/StackWalkUtil.java | 104 + .../main/java/org/lwjgl/system/Struct.java | 281 + .../java/org/lwjgl/system/StructBuffer.java | 318 + .../org/lwjgl/system/ThreadLocalUtil.java | 236 + .../lwjgl/system/fcl/DynamicLinkLoader.java | 168 + .../java/org/lwjgl/system/fcl/FCLLibrary.java | 54 + .../lwjgl/system/jemalloc/ExtentAlloc.java | 81 + .../lwjgl/system/jemalloc/ExtentAllocI.java | 73 + .../lwjgl/system/jemalloc/ExtentCommit.java | 80 + .../lwjgl/system/jemalloc/ExtentCommitI.java | 67 + .../lwjgl/system/jemalloc/ExtentDalloc.java | 79 + .../lwjgl/system/jemalloc/ExtentDallocI.java | 64 + .../lwjgl/system/jemalloc/ExtentDecommit.java | 80 + .../system/jemalloc/ExtentDecommitI.java | 66 + .../lwjgl/system/jemalloc/ExtentDestroy.java | 79 + .../lwjgl/system/jemalloc/ExtentDestroyI.java | 63 + .../lwjgl/system/jemalloc/ExtentHooks.java | 312 + .../lwjgl/system/jemalloc/ExtentMerge.java | 81 + .../lwjgl/system/jemalloc/ExtentMergeI.java | 68 + .../lwjgl/system/jemalloc/ExtentPurge.java | 80 + .../lwjgl/system/jemalloc/ExtentPurgeI.java | 67 + .../lwjgl/system/jemalloc/ExtentSplit.java | 81 + .../lwjgl/system/jemalloc/ExtentSplitI.java | 68 + .../org/lwjgl/system/jemalloc/JEmalloc.java | 1011 ++ .../system/jemalloc/JEmallocAllocator.java | 68 + .../jemalloc/MallocMessageCallback.java | 89 + .../jemalloc/MallocMessageCallbackI.java | 55 + .../lwjgl/system/jni/JNINativeInterface.java | 1141 ++ .../org/lwjgl/system/jni/JNINativeMethod.java | 358 + .../java/org/lwjgl/system/libc/LibCErrno.java | 133 + .../org/lwjgl/system/libc/LibCLocale.java | 128 + .../java/org/lwjgl/system/libc/LibCStdio.java | 148 + .../org/lwjgl/system/libc/LibCStdlib.java | 249 + .../org/lwjgl/system/libc/LibCString.java | 612 + .../java/org/lwjgl/system/libffi/FFICIF.java | 303 + .../org/lwjgl/system/libffi/FFIClosure.java | 262 + .../java/org/lwjgl/system/libffi/FFIType.java | 338 + .../java/org/lwjgl/system/libffi/LibFFI.java | 659 + .../java/org/lwjgl/system/linux/CMsghdr.java | 344 + .../lwjgl/system/linux/DynamicLinkLoader.java | 168 + .../org/lwjgl/system/linux/EpollData.java | 310 + .../org/lwjgl/system/linux/EpollEvent.java | 290 + .../java/org/lwjgl/system/linux/FCNTL.java | 858 ++ .../java/org/lwjgl/system/linux/FOwnerEx.java | 284 + .../java/org/lwjgl/system/linux/Flock.java | 342 + .../java/org/lwjgl/system/linux/IOVec.java | 288 + .../lwjgl/system/linux/KernelTimespec.java | 286 + .../org/lwjgl/system/linux/LinuxLibrary.java | 55 + .../java/org/lwjgl/system/linux/MMAN.java | 256 + .../java/org/lwjgl/system/linux/Msghdr.java | 378 + .../java/org/lwjgl/system/linux/OpenHow.java | 313 + .../java/org/lwjgl/system/linux/PThread.java | 24 + .../java/org/lwjgl/system/linux/Sockaddr.java | 310 + .../java/org/lwjgl/system/linux/Socket.java | 46 + .../java/org/lwjgl/system/linux/Stat.java | 62 + .../java/org/lwjgl/system/linux/Statx.java | 699 + .../lwjgl/system/linux/StatxTimestamp.java | 294 + .../main/java/org/lwjgl/system/linux/UIO.java | 101 + .../java/org/lwjgl/system/linux/UNISTD.java | 71 + .../java/org/lwjgl/system/linux/Visual.java | 420 + .../main/java/org/lwjgl/system/linux/X11.java | 839 ++ .../org/lwjgl/system/linux/XAnyEvent.java | 374 + .../org/lwjgl/system/linux/XButtonEvent.java | 566 + .../lwjgl/system/linux/XCirculateEvent.java | 410 + .../system/linux/XCirculateRequestEvent.java | 410 + .../system/linux/XClientMessageEvent.java | 543 + .../lwjgl/system/linux/XColormapEvent.java | 428 + .../lwjgl/system/linux/XConfigureEvent.java | 504 + .../system/linux/XConfigureRequestEvent.java | 540 + .../system/linux/XCreateWindowEvent.java | 500 + .../lwjgl/system/linux/XCrossingEvent.java | 596 + .../system/linux/XDestroyWindowEvent.java | 392 + .../org/lwjgl/system/linux/XErrorEvent.java | 414 + .../java/org/lwjgl/system/linux/XEvent.java | 586 + .../org/lwjgl/system/linux/XExposeEvent.java | 462 + .../lwjgl/system/linux/XFocusChangeEvent.java | 408 + .../org/lwjgl/system/linux/XGenericEvent.java | 390 + .../system/linux/XGenericEventCookie.java | 439 + .../system/linux/XGraphicsExposeEvent.java | 498 + .../org/lwjgl/system/linux/XGravityEvent.java | 428 + .../org/lwjgl/system/linux/XKeyEvent.java | 566 + .../org/lwjgl/system/linux/XKeymapEvent.java | 415 + .../org/lwjgl/system/linux/XMapEvent.java | 410 + .../lwjgl/system/linux/XMapRequestEvent.java | 392 + .../org/lwjgl/system/linux/XMappingEvent.java | 426 + .../org/lwjgl/system/linux/XMotionEvent.java | 566 + .../lwjgl/system/linux/XNoExposeEvent.java | 408 + .../lwjgl/system/linux/XPropertyEvent.java | 432 + .../lwjgl/system/linux/XReparentEvent.java | 466 + .../system/linux/XResizeRequestEvent.java | 408 + .../system/linux/XSelectionClearEvent.java | 412 + .../lwjgl/system/linux/XSelectionEvent.java | 454 + .../system/linux/XSelectionRequestEvent.java | 474 + .../system/linux/XSetWindowAttributes.java | 556 + .../org/lwjgl/system/linux/XTimeCoord.java | 171 + .../org/lwjgl/system/linux/XUnmapEvent.java | 410 + .../lwjgl/system/linux/XVisibilityEvent.java | 390 + .../org/lwjgl/system/linux/XVisualInfo.java | 466 + .../linux/liburing/IOCQRingOffsets.java | 398 + .../linux/liburing/IOSQRingOffsets.java | 400 + .../lwjgl/system/linux/liburing/IOURing.java | 422 + .../system/linux/liburing/IOURingBuf.java | 326 + .../system/linux/liburing/IOURingBufReg.java | 370 + .../system/linux/liburing/IOURingBufRing.java | 367 + .../system/linux/liburing/IOURingCQ.java | 540 + .../system/linux/liburing/IOURingCQE.java | 361 + .../linux/liburing/IOURingFileIndexRange.java | 310 + .../linux/liburing/IOURingGeteventsArg.java | 326 + .../system/linux/liburing/IOURingParams.java | 528 + .../system/linux/liburing/IOURingProbe.java | 371 + .../system/linux/liburing/IOURingProbeOp.java | 326 + .../linux/liburing/IOURingRSRCRegister.java | 346 + .../linux/liburing/IOURingRSRCUpdate.java | 306 + .../linux/liburing/IOURingRSRCUpdate2.java | 366 + .../linux/liburing/IOURingRecvmsgOut.java | 326 + .../linux/liburing/IOURingRestriction.java | 337 + .../system/linux/liburing/IOURingSQ.java | 609 + .../system/linux/liburing/IOURingSQE.java | 1080 ++ .../linux/liburing/IOURingSyncCancelReg.java | 350 + .../system/linux/liburing/LibIOURing.java | 1787 +++ .../lwjgl/system/linux/liburing/LibURing.java | 2237 ++++ .../system/macosx/CGEventTapCallBack.java | 78 + .../system/macosx/CGEventTapCallBackI.java | 63 + .../system/macosx/CGEventTapInformation.java | 358 + .../java/org/lwjgl/system/macosx/CGPoint.java | 306 + .../lwjgl/system/macosx/CoreFoundation.java | 268 + .../org/lwjgl/system/macosx/CoreGraphics.java | 1001 ++ .../system/macosx/DynamicLinkLoader.java | 290 + .../macosx/EnumerationMutationHandler.java | 75 + .../macosx/EnumerationMutationHandlerI.java | 52 + .../java/org/lwjgl/system/macosx/LibC.java | 40 + .../org/lwjgl/system/macosx/LibSystem.java | 29 + .../lwjgl/system/macosx/MacOSXLibrary.java | 32 + .../system/macosx/MacOSXLibraryBundle.java | 90 + .../lwjgl/system/macosx/MacOSXLibraryDL.java | 54 + .../system/macosx/ObjCMethodDescription.java | 277 + .../system/macosx/ObjCPropertyAttribute.java | 340 + .../org/lwjgl/system/macosx/ObjCRuntime.java | 3405 +++++ .../windows/CRYPTPROTECT_PROMPTSTRUCT.java | 223 + .../org/lwjgl/system/windows/Crypt32.java | 269 + .../org/lwjgl/system/windows/DATA_BLOB.java | 282 + .../org/lwjgl/system/windows/DEVMODE.java | 780 ++ .../lwjgl/system/windows/DISPLAY_DEVICE.java | 373 + .../java/org/lwjgl/system/windows/GDI32.java | 286 + .../lwjgl/system/windows/HARDWAREINPUT.java | 326 + .../java/org/lwjgl/system/windows/INPUT.java | 343 + .../org/lwjgl/system/windows/KEYBDINPUT.java | 374 + .../org/lwjgl/system/windows/Kernel32.java | 124 + .../lwjgl/system/windows/LARGE_INTEGER.java | 298 + .../lwjgl/system/windows/MONITORINFOEX.java | 342 + .../org/lwjgl/system/windows/MOUSEINPUT.java | 418 + .../java/org/lwjgl/system/windows/MSG.java | 388 + .../system/windows/PIXELFORMATDESCRIPTOR.java | 795 ++ .../java/org/lwjgl/system/windows/POINT.java | 306 + .../java/org/lwjgl/system/windows/POINTL.java | 306 + .../java/org/lwjgl/system/windows/RECT.java | 346 + .../system/windows/SECURITY_ATTRIBUTES.java | 343 + .../org/lwjgl/system/windows/TOUCHINPUT.java | 384 + .../java/org/lwjgl/system/windows/User32.java | 2842 ++++ .../lwjgl/system/windows/WINDOWPLACEMENT.java | 395 + .../org/lwjgl/system/windows/WNDCLASSEX.java | 554 + .../org/lwjgl/system/windows/WinBase.java | 311 + .../org/lwjgl/system/windows/WindowProc.java | 78 + .../org/lwjgl/system/windows/WindowProcI.java | 62 + .../lwjgl/system/windows/WindowsLibrary.java | 86 + .../org/lwjgl/system/windows/WindowsUtil.java | 18 + .../src/main/java/org/lwjgl/util/Color.java | 494 + .../main/java/org/lwjgl/util/Dimension.java | 156 + .../src/main/java/org/lwjgl/util/Display.java | 243 + .../src/main/java/org/lwjgl/util/Point.java | 170 + .../java/org/lwjgl/util/ReadableColor.java | 146 + .../org/lwjgl/util/ReadableDimension.java | 60 + .../java/org/lwjgl/util/ReadablePoint.java | 57 + .../org/lwjgl/util/ReadableRectangle.java | 48 + .../main/java/org/lwjgl/util/Rectangle.java | 581 + .../main/java/org/lwjgl/util/Renderable.java | 49 + .../src/main/java/org/lwjgl/util/Timer.java | 156 + .../main/java/org/lwjgl/util/WaveData.java | 257 + .../java/org/lwjgl/util/WritableColor.java | 126 + .../org/lwjgl/util/WritableDimension.java | 54 + .../java/org/lwjgl/util/WritablePoint.java | 45 + .../org/lwjgl/util/WritableRectangle.java | 63 + .../src/main/java/org/lwjgl/util/XPMFile.java | 302 + .../org/lwjgl/util/freetype/BDF_Property.java | 292 + .../org/lwjgl/util/freetype/CID_FaceDict.java | 282 + .../org/lwjgl/util/freetype/CID_FaceInfo.java | 390 + .../util/freetype/FTC_Face_Requester.java | 76 + .../util/freetype/FTC_Face_RequesterI.java | 56 + .../lwjgl/util/freetype/FTC_ImageType.java | 190 + .../org/lwjgl/util/freetype/FTC_SBit.java | 270 + .../org/lwjgl/util/freetype/FTC_Scaler.java | 214 + .../org/lwjgl/util/freetype/FT_Affine23.java | 213 + .../lwjgl/util/freetype/FT_Alloc_Func.java | 74 + .../lwjgl/util/freetype/FT_Alloc_FuncI.java | 49 + .../java/org/lwjgl/util/freetype/FT_BBox.java | 327 + .../org/lwjgl/util/freetype/FT_Bitmap.java | 329 + .../lwjgl/util/freetype/FT_BitmapGlyph.java | 188 + .../lwjgl/util/freetype/FT_Bitmap_Size.java | 212 + .../lwjgl/util/freetype/FT_COLR_Paint.java | 373 + .../org/lwjgl/util/freetype/FT_CharMap.java | 191 + .../org/lwjgl/util/freetype/FT_ClipBox.java | 265 + .../org/lwjgl/util/freetype/FT_Color.java | 327 + .../lwjgl/util/freetype/FT_ColorIndex.java | 165 + .../org/lwjgl/util/freetype/FT_ColorLine.java | 163 + .../org/lwjgl/util/freetype/FT_ColorStop.java | 247 + .../util/freetype/FT_ColorStopIterator.java | 283 + .../java/org/lwjgl/util/freetype/FT_Data.java | 282 + .../util/freetype/FT_DebugHook_Func.java | 73 + .../util/freetype/FT_DebugHook_FuncI.java | 47 + .../java/org/lwjgl/util/freetype/FT_Face.java | 480 + .../org/lwjgl/util/freetype/FT_Free_Func.java | 74 + .../lwjgl/util/freetype/FT_Free_FuncI.java | 48 + .../org/lwjgl/util/freetype/FT_Generic.java | 296 + .../util/freetype/FT_Generic_Finalizer.java | 73 + .../util/freetype/FT_Generic_FinalizerI.java | 50 + .../org/lwjgl/util/freetype/FT_Glyph.java | 181 + .../org/lwjgl/util/freetype/FT_GlyphSlot.java | 352 + .../lwjgl/util/freetype/FT_Glyph_Metrics.java | 250 + .../FT_Incremental_FreeGlyphDataFunc.java | 74 + .../FT_Incremental_FreeGlyphDataFuncI.java | 48 + .../util/freetype/FT_Incremental_Funcs.java | 315 + .../FT_Incremental_GetGlyphDataFunc.java | 75 + .../FT_Incremental_GetGlyphDataFuncI.java | 51 + .../FT_Incremental_GetGlyphMetricsFunc.java | 76 + .../FT_Incremental_GetGlyphMetricsFuncI.java | 53 + .../freetype/FT_Incremental_Interface.java | 300 + .../util/freetype/FT_Incremental_Metrics.java | 190 + .../lwjgl/util/freetype/FT_LayerIterator.java | 271 + .../java/org/lwjgl/util/freetype/FT_List.java | 166 + .../org/lwjgl/util/freetype/FT_ListNode.java | 186 + .../util/freetype/FT_List_Destructor.java | 75 + .../util/freetype/FT_List_DestructorI.java | 50 + .../lwjgl/util/freetype/FT_List_Iterator.java | 74 + .../util/freetype/FT_List_IteratorI.java | 49 + .../org/lwjgl/util/freetype/FT_MM_Axis.java | 185 + .../org/lwjgl/util/freetype/FT_MM_Var.java | 285 + .../org/lwjgl/util/freetype/FT_Matrix.java | 327 + .../org/lwjgl/util/freetype/FT_Memory.java | 328 + .../lwjgl/util/freetype/FT_Module_Class.java | 458 + .../util/freetype/FT_Module_Constructor.java | 73 + .../util/freetype/FT_Module_ConstructorI.java | 47 + .../util/freetype/FT_Module_Destructor.java | 73 + .../util/freetype/FT_Module_DestructorI.java | 46 + .../util/freetype/FT_Module_Requester.java | 74 + .../util/freetype/FT_Module_RequesterI.java | 49 + .../lwjgl/util/freetype/FT_Multi_Master.java | 272 + .../lwjgl/util/freetype/FT_OpaquePaint.java | 260 + .../org/lwjgl/util/freetype/FT_Open_Args.java | 428 + .../org/lwjgl/util/freetype/FT_Outline.java | 291 + .../lwjgl/util/freetype/FT_OutlineGlyph.java | 164 + .../util/freetype/FT_Outline_ConicToFunc.java | 75 + .../freetype/FT_Outline_ConicToFuncI.java | 51 + .../util/freetype/FT_Outline_CubicToFunc.java | 76 + .../freetype/FT_Outline_CubicToFuncI.java | 53 + .../lwjgl/util/freetype/FT_Outline_Funcs.java | 365 + .../util/freetype/FT_Outline_LineToFunc.java | 74 + .../util/freetype/FT_Outline_LineToFuncI.java | 49 + .../util/freetype/FT_Outline_MoveToFunc.java | 74 + .../util/freetype/FT_Outline_MoveToFuncI.java | 49 + .../util/freetype/FT_PaintColrGlyph.java | 153 + .../util/freetype/FT_PaintColrLayers.java | 151 + .../util/freetype/FT_PaintComposite.java | 178 + .../lwjgl/util/freetype/FT_PaintGlyph.java | 165 + .../util/freetype/FT_PaintLinearGradient.java | 181 + .../util/freetype/FT_PaintRadialGradient.java | 195 + .../lwjgl/util/freetype/FT_PaintRotate.java | 189 + .../lwjgl/util/freetype/FT_PaintScale.java | 201 + .../org/lwjgl/util/freetype/FT_PaintSkew.java | 201 + .../lwjgl/util/freetype/FT_PaintSolid.java | 151 + .../util/freetype/FT_PaintSweepGradient.java | 185 + .../util/freetype/FT_PaintTransform.java | 163 + .../util/freetype/FT_PaintTranslate.java | 177 + .../lwjgl/util/freetype/FT_Palette_Data.java | 291 + .../org/lwjgl/util/freetype/FT_Parameter.java | 297 + .../freetype/FT_Prop_GlyphToScriptMap.java | 173 + .../freetype/FT_Prop_IncreaseXHeight.java | 163 + .../util/freetype/FT_Raster_DoneFunc.java | 73 + .../util/freetype/FT_Raster_DoneFuncI.java | 46 + .../lwjgl/util/freetype/FT_Raster_Funcs.java | 367 + .../util/freetype/FT_Raster_NewFunc.java | 74 + .../util/freetype/FT_Raster_NewFuncI.java | 49 + .../lwjgl/util/freetype/FT_Raster_Params.java | 397 + .../util/freetype/FT_Raster_RenderFunc.java | 74 + .../util/freetype/FT_Raster_RenderFuncI.java | 49 + .../util/freetype/FT_Raster_ResetFunc.java | 75 + .../util/freetype/FT_Raster_ResetFuncI.java | 55 + .../util/freetype/FT_Raster_SetModeFunc.java | 75 + .../util/freetype/FT_Raster_SetModeFuncI.java | 54 + .../lwjgl/util/freetype/FT_Realloc_Func.java | 76 + .../lwjgl/util/freetype/FT_Realloc_FuncI.java | 53 + .../lwjgl/util/freetype/FT_SVG_Document.java | 232 + .../lwjgl/util/freetype/FT_SfntLangTag.java | 247 + .../org/lwjgl/util/freetype/FT_SfntName.java | 295 + .../java/org/lwjgl/util/freetype/FT_Size.java | 323 + .../lwjgl/util/freetype/FT_Size_Internal.java | 173 + .../lwjgl/util/freetype/FT_Size_Metrics.java | 237 + .../lwjgl/util/freetype/FT_Size_Request.java | 348 + .../java/org/lwjgl/util/freetype/FT_Span.java | 175 + .../org/lwjgl/util/freetype/FT_SpanFunc.java | 76 + .../org/lwjgl/util/freetype/FT_SpanFuncI.java | 52 + .../org/lwjgl/util/freetype/FT_Stream.java | 412 + .../lwjgl/util/freetype/FT_StreamDesc.java | 274 + .../util/freetype/FT_Stream_CloseFunc.java | 73 + .../util/freetype/FT_Stream_CloseFuncI.java | 45 + .../lwjgl/util/freetype/FT_Stream_IoFunc.java | 76 + .../util/freetype/FT_Stream_IoFuncI.java | 53 + .../org/lwjgl/util/freetype/FT_SvgGlyph.java | 256 + .../lwjgl/util/freetype/FT_UnitVector.java | 287 + .../org/lwjgl/util/freetype/FT_Var_Axis.java | 221 + .../util/freetype/FT_Var_Named_Style.java | 186 + .../org/lwjgl/util/freetype/FT_Vector.java | 287 + .../org/lwjgl/util/freetype/FreeType.java | 5951 +++++++++ .../org/lwjgl/util/freetype/PS_FontInfo.java | 290 + .../org/lwjgl/util/freetype/PS_Private.java | 533 + .../util/freetype/SVG_Lib_Free_Func.java | 73 + .../util/freetype/SVG_Lib_Free_FuncI.java | 46 + .../util/freetype/SVG_Lib_Init_Func.java | 73 + .../util/freetype/SVG_Lib_Init_FuncI.java | 47 + .../freetype/SVG_Lib_Preset_Slot_Func.java | 75 + .../freetype/SVG_Lib_Preset_Slot_FuncI.java | 51 + .../util/freetype/SVG_Lib_Render_Func.java | 74 + .../util/freetype/SVG_Lib_Render_FuncI.java | 49 + .../util/freetype/SVG_RendererHooks.java | 332 + .../org/lwjgl/util/freetype/TT_Header.java | 367 + .../lwjgl/util/freetype/TT_HoriHeader.java | 364 + .../lwjgl/util/freetype/TT_MaxProfile.java | 321 + .../java/org/lwjgl/util/freetype/TT_OS2.java | 630 + .../java/org/lwjgl/util/freetype/TT_PCLT.java | 352 + .../lwjgl/util/freetype/TT_Postscript.java | 249 + .../lwjgl/util/freetype/TT_VertHeader.java | 364 + .../org/lwjgl/util/freetype/package-info.java | 15 + .../java/org/lwjgl/util/glu/Cylinder.java | 212 + .../main/java/org/lwjgl/util/glu/Disk.java | 227 + .../src/main/java/org/lwjgl/util/glu/GLU.java | 430 + .../org/lwjgl/util/glu/GLUtessellator.java | 72 + .../util/glu/GLUtessellatorCallback.java | 388 + .../glu/GLUtessellatorCallbackAdapter.java | 116 + .../main/java/org/lwjgl/util/glu/MipMap.java | 367 + .../java/org/lwjgl/util/glu/PartialDisk.java | 374 + .../org/lwjgl/util/glu/PixelStoreState.java | 92 + .../main/java/org/lwjgl/util/glu/Project.java | 413 + .../main/java/org/lwjgl/util/glu/Quadric.java | 202 + .../java/org/lwjgl/util/glu/Registry.java | 81 + .../main/java/org/lwjgl/util/glu/Sphere.java | 243 + .../main/java/org/lwjgl/util/glu/Util.java | 267 + .../util/glu/tessellation/ActiveRegion.java | 100 + .../util/glu/tessellation/CachedVertex.java | 90 + .../org/lwjgl/util/glu/tessellation/Dict.java | 172 + .../lwjgl/util/glu/tessellation/DictNode.java | 91 + .../lwjgl/util/glu/tessellation/GLUface.java | 97 + .../util/glu/tessellation/GLUhalfEdge.java | 105 + .../lwjgl/util/glu/tessellation/GLUmesh.java | 94 + .../glu/tessellation/GLUtessellatorImpl.java | 697 + .../util/glu/tessellation/GLUvertex.java | 97 + .../org/lwjgl/util/glu/tessellation/Geom.java | 350 + .../org/lwjgl/util/glu/tessellation/Mesh.java | 766 ++ .../lwjgl/util/glu/tessellation/Normal.java | 319 + .../util/glu/tessellation/PriorityQ.java | 132 + .../util/glu/tessellation/PriorityQHeap.java | 296 + .../util/glu/tessellation/PriorityQSort.java | 312 + .../lwjgl/util/glu/tessellation/Render.java | 596 + .../lwjgl/util/glu/tessellation/Sweep.java | 1390 ++ .../lwjgl/util/glu/tessellation/TessMono.java | 241 + .../util/glu/tessellation/TessState.java | 91 + .../lwjgl/util/input/ControllerAdapter.java | 340 + .../java/org/lwjgl/util/jinput/KeyMap.java | 294 + .../util/jinput/LWJGLEnvironmentPlugin.java | 55 + .../org/lwjgl/util/jinput/LWJGLKeyboard.java | 129 + .../org/lwjgl/util/jinput/LWJGLMouse.java | 191 + .../org/lwjgl/util/mapped/CacheLinePad.java | 66 + .../org/lwjgl/util/mapped/CacheLineSize.java | 142 + .../java/org/lwjgl/util/mapped/CacheUtil.java | 200 + .../org/lwjgl/util/mapped/MappedField.java | 65 + .../org/lwjgl/util/mapped/MappedForeach.java | 71 + .../org/lwjgl/util/mapped/MappedHelper.java | 392 + .../org/lwjgl/util/mapped/MappedObject.java | 287 + .../util/mapped/MappedObjectClassLoader.java | 192 + .../util/mapped/MappedObjectTransformer.java | 1340 ++ .../lwjgl/util/mapped/MappedObjectUnsafe.java | 110 + .../java/org/lwjgl/util/mapped/MappedSet.java | 69 + .../org/lwjgl/util/mapped/MappedSet2.java | 56 + .../org/lwjgl/util/mapped/MappedSet3.java | 59 + .../org/lwjgl/util/mapped/MappedSet4.java | 61 + .../org/lwjgl/util/mapped/MappedType.java | 102 + .../java/org/lwjgl/util/mapped/Pointer.java | 50 + .../lwjgl/util/tinyfd/TinyFileDialogs.java | 588 + .../java/org/lwjgl/util/vector/Matrix.java | 134 + .../java/org/lwjgl/util/vector/Matrix2f.java | 400 + .../java/org/lwjgl/util/vector/Matrix3f.java | 510 + .../java/org/lwjgl/util/vector/Matrix4f.java | 849 ++ .../org/lwjgl/util/vector/Quaternion.java | 530 + .../org/lwjgl/util/vector/ReadableVector.java | 54 + .../lwjgl/util/vector/ReadableVector2f.java | 46 + .../lwjgl/util/vector/ReadableVector3f.java | 42 + .../lwjgl/util/vector/ReadableVector4f.java | 44 + .../java/org/lwjgl/util/vector/Vector.java | 112 + .../java/org/lwjgl/util/vector/Vector2f.java | 301 + .../java/org/lwjgl/util/vector/Vector3f.java | 358 + .../java/org/lwjgl/util/vector/Vector4f.java | 349 + .../lwjgl/util/vector/WritableVector2f.java | 61 + .../lwjgl/util/vector/WritableVector3f.java | 56 + .../lwjgl/util/vector/WritableVector4f.java | 57 + settings.gradle | 1 + 1161 files changed, 336486 insertions(+), 1 deletion(-) create mode 100644 FCL/src/main/assets/app_runtime/lwjgl-boat/lwjgl.jar create mode 100644 FCL/src/main/assets/app_runtime/lwjgl-boat/version create mode 100644 LWJGL-Boat/build.gradle create mode 100644 LWJGL-Boat/libs/asm-debug-all.jar create mode 100644 LWJGL-Boat/libs/cacio.jar create mode 100644 LWJGL-Boat/libs/fake-vulkan-module.jar create mode 100644 LWJGL-Boat/libs/jinput.jar create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/BufferChecks.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/BufferUtils.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/CLongBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/LWJGLException.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/LWJGLUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/MemoryUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/PointerBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/PointerWrapper.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/PointerWrapperAbstract.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/Sys.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/Version.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/VersionImpl.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/Callbacks.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/EventLoop.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjector.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjectorCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjectorCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFW.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocateCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocateCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocator.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharModsCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharModsCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorEnterCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorEnterCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorPosCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorPosCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDeallocateCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDeallocateCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDropCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDropCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWErrorCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWErrorCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWFramebufferSizeCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWFramebufferSizeCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWGamepadState.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWGammaRamp.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWImage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWJoystickCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWJoystickCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWKeyCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWKeyCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMonitorCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMonitorCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMouseButtonCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMouseButtonCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeCocoa.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeEGL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeGLX.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeNSGL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeOSMesa.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWGL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWayland.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWin32.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeX11.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWReallocateCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWReallocateCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWScrollCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWScrollCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWVidMode.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWVulkan.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowCloseCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowCloseCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowContentScaleCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowContentScaleCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowFocusCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowFocusCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowIconifyCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowIconifyCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowMaximizeCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowMaximizeCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowPosCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowPosCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowRefreshCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowRefreshCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowSizeCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowSizeCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/input/Controller.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/input/ControllerEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/input/Controllers.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/input/Cursor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/input/EventQueue.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/input/GLFWInputImplementation.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/input/InfdevMouse.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/input/JInputController.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/input/KeyCodes.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/input/Keyboard.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/input/Mouse.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDnodeTheme.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDtheme.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDwidgetTheme.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/Blendish.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/LibNanoVG.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGGradient.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGGradientStop.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGImage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGPaint.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGPath.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGShape.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGColor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGGlyphPosition.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGLUFramebuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGLUFramebufferBGFX.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGPaint.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGTextRow.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoSVG.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVG.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGBGFX.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGL2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGL3.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLConfig.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLES2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLES3.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/OUI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIHandler.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIHandlerI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIRect.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIVec2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/AL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/AL10.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/AL11.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC10.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC11.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCCapabilities.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCapabilities.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCcontext.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCdevice.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/ALUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EFX10.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EFXUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTAlaw.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTBFormat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTCapture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDedicated.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDefaultFilterOrder.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDisconnect.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDouble.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTEfx.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTExponentDistance.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTFloat32.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTIma4.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTLinearDistance.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMCFormats.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulaw.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulawBFormat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulawMCFormats.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTOffset.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTSourceDistanceModel.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTSourceRadius.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTStaticBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTStereoAngles.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTThreadLocalContext.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTVorbis.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/EnumerateAllExt.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIAudioChannel.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIIMAADPCM.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIQuadriphonic.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIWAVEFormat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/OpenALException.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBformatEx.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBlockAlignment.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferLengthQuery.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferSamples.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferSubData.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBufferType.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBufferTypeI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDeferredUpdates.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDeviceClock.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDirectChannels.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDirectChannelsRemix.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEffectTarget.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEventProc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEventProcI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEvents.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTGainClampEx.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTHRTF.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopPoints.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopbackBformat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTMSADPCM.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTOutputLimiter.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTOutputMode.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTPauseDevice.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTReopenDevice.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceLatency.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceLength.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceResampler.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceSpatialize.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceStartDelay.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTUHJ.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTUHJEx.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTXHoldOnDisconnect.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/Util.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/openal/package-info.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDBlendMinmaxFactor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDebugOutput.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDepthClampSeparate.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDrawBuffersBlend.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDFramebufferMultisampleAdvanced.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderHalfFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderHalfFloatFetch.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderInt64.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDInterleavedElements.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDOcclusionQueryEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDPerformanceMonitor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDPinnedMemory.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDQueryBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSamplePositions.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSeamlessCubemapPerTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSparseTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDStencilOperationExtended.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDTransformFeedback4.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDVertexShaderTessellator.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBaseInstance.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBindlessTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBlendFuncExtended.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBufferStorage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCLEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClearBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClearTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClipControl.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBColorBufferFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCompressedTexturePixelStorage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBComputeShader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBComputeVariableGroupSize.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBConditionalRenderInverted.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCopyBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCopyImage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCullDistance.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDebugOutput.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthBufferFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthClamp.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDirectStateAccess.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawBuffers.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawBuffersBlend.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawElementsBaseVertex.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawIndirect.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawInstanced.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES2Compatibility.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES31Compatibility.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES32Compatibility.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES3Compatibility.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBEnhancedLayouts.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBExplicitUniformLocation.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFragmentProgram.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFragmentShader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferNoAttachments.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferSRGB.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGLSPIRV.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShader5.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShaderFP64.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShaderInt64.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGeometryShader4.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGetProgramBinary.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGetTextureSubImage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBHalfFloatPixel.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBHalfFloatVertex.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBImaging.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBIndirectParameters.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInstancedArrays.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInternalformatQuery.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInternalformatQuery2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInvalidateSubdata.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMapBufferAlignment.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMapBufferRange.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMatrixPalette.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultiBind.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultiDrawIndirect.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultisample.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultitexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBOcclusionQuery.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBOcclusionQuery2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBParallelShaderCompile.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPipelineStatisticsQuery.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPixelBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPointParameters.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPointSprite.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPolygonOffsetClamp.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBProgramInterfaceQuery.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBProvokingVertex.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBQueryBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBRobustness.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSPIRVExtensions.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSampleLocations.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSampleShading.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSamplerObjects.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeamlessCubeMap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeamlessCubemapPerTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeparateShaderObjects.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderAtomicCounters.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderImageLoadStore.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderObjects.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderStorageBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderSubroutine.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadingLanguage100.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadingLanguageInclude.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadow.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadowAmbient.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSparseBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSparseTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBStencilTexturing.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSync.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTessellationShader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBarrier.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBorderClamp.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBufferRange.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompression.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompressionBPTC.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompressionRGTC.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCubeMap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCubeMapArray.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureEnvCombine.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureEnvDot3.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFilterAnisotropic.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFilterMinmax.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureGather.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMirrorClampToEdge.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMirroredRepeat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMultisample.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRG.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRGB10_A2UI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRectangle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureStorage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureStorageMultisample.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureSwizzle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureView.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTimerQuery.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedback2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedback3.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedbackInstanced.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedbackOverflowQuery.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransposeMatrix.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBUniformBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexArrayBGRA.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexArrayObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexAttrib64Bit.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexAttribBinding.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexBlend.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexProgram.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexShader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexType2_10_10_10_REV.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBViewportArray.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBWindowPos.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ATIMeminfo.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ATITextureCompression3DC.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AWTCanvasImplementation.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/AWTGLCanvas.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/CGL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/Context.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextAttribs.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextCapabilities.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextGL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/Display.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/DisplayImplementation.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/DisplayMode.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/Drawable.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/DrawableGL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/DrawableLWJGL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXT422Pixels.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTABGR.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBGRA.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBindableUniform.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendColor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendEquationSeparate.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendFuncSeparate.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendMinmax.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendSubtract.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTClipVolumeHint.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTCompiledVertexArray.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDebugLabel.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDebugMarker.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDepthBoundsTest.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDirectStateAccess.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDrawBuffers2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDrawInstanced.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTEGLImageStorage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTExternalBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferBlit.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferBlitLayers.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferMultisample.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferMultisampleBlitScaled.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferSRGB.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGPUProgramParameters.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGPUShader4.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGeometryShader4.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObjectFD.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObjectWin32.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPackedDepthStencil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPackedFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPixelBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPointParameters.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPolygonOffsetClamp.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTProvokingVertex.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTRasterMultisample.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSecondaryColor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphore.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphoreFD.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphoreWin32.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSeparateShaderObjects.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderFramebufferFetch.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderFramebufferFetchNonCoherent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderImageLoadStore.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSharedTexturePalette.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilClearTag.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilTwoSide.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilWrap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureArray.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionLATC.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionRGTC.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionS3TC.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureFilterAnisotropic.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureFilterMinmax.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureInteger.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureMirrorClamp.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureRectangle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGB.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBDecode.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBR8.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBRG8.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSharedExponent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSnorm.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureStorage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSwizzle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTimerQuery.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTransformFeedback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTVertexAttrib64bit.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTWin32KeyedMutex.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTWindowRectangles.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTX11SyncObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL11.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL11C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL12.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL12C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL13.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL13C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL14.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL14C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL15.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL15C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL20.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL20C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL21.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL21C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL30.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL30C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL31.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL31C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL32.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL32C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL33.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL33C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL40.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL40C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL41.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL41C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL42.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL42C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL43.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL43C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL44.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL44C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL45.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL45C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL46.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL46C.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLCapabilities.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLChecks.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLContext.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageAMDCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageAMDCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageARBCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageARBCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLSync.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX11.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX12.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX13.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX14.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXAMDGPUAssociation.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBContextFlushControl.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContext.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextNoError.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextProfile.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextRobustness.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBFBConfigFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBFramebufferSRGB.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBGetProcAddress.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBMultisample.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBRobustnessApplicationIsolation.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBVertexBufferObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXCapabilities.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTBufferAge.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTContextPriority.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTCreateContextES2Profile.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTCreateContextESProfile.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTFBConfigPackedFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTFramebufferSRGB.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTImportContext.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTStereoTree.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTSwapControl.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTSwapControlTear.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTTextureFromPixmap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTVisualInfo.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTVisualRating.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXINTELSwapEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVCopyBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVCopyImage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVDelayBeforeSwap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVFloatBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVMultiGPUContext.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVMultisampleCoverage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVRobustnessVideoMemoryPurge.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVSwapGroup.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIMakeCurrentRead.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGISwapControl.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIVideoSync.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXFBConfig.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXPbuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXSwapBarrier.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXSwapGroup.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXStereoNotifyEventEXT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GPU_DEVICE.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GREMEDYFrameTerminator.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GREMEDYStringMarker.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/GlobalLock.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELBlackholeRender.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELConservativeRasterization.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELFramebufferCMAA.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELMapTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELPerformanceQuery.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/InputImplementation.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRBlendEquationAdvanced.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRBlendEquationAdvancedCoherent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRContextFlushControl.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRDebug.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRNoError.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRParallelShaderCompile.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRRobustness.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRShaderSubgroup.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRTextureCompressionASTCLDR.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferFlipX.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferFlipY.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferSwapXY.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVAlphaToCoverageDitherControl.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessMultiDrawIndirect.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessMultiDrawIndirectCount.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendEquationAdvanced.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendEquationAdvancedCoherent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendMinmaxFactor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVClipSpaceWScaling.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCommandList.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConditionalRender.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRaster.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterDilate.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterPreSnap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterPreSnapTriangles.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCopyDepthToColor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCopyImage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDeepTexture3D.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDepthBufferFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDepthClamp.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDrawTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDrawVulkanImage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVExplicitMultisample.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFence.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFillRectangle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFloatBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFogDistance.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFragmentCoverageToColor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFramebufferMixedSamples.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFramebufferMultisampleCoverage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVGPUMulticast.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVGPUShader5.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVHalfFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVInternalformatSampleQuery.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVLightMaxExponent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMemoryAttachment.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMemoryObjectSparse.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMeshShader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMultisampleCoverage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMultisampleFilterHint.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPackedDepthStencil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPathRendering.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPathRenderingSharedEdge.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPixelDataRange.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPointSprite.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPrimitiveRestart.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPrimitiveShadingRate.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVQueryResource.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVQueryResourceTag.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVRepresentativeFragmentTest.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVRobustnessVideoMemoryPurge.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVSampleLocations.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVScissorExclusive.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderBufferLoad.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderBufferStore.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderSubgroupPartitioned.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderThreadGroup.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShadingRateImage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTexgenReflection.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureBarrier.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureMultisample.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader3.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTimelineSemaphore.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTransformFeedback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTransformFeedback2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVUniformBufferUnifiedMemory.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexArrayRange.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexArrayRange2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexAttribInteger64bit.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexBufferUnifiedMemory.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVViewportSwizzle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXConditionalRender.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXGPUMemoryInfo.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXGpuMulticast2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXProgressFence.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/OVRMultiview.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/OpenGLException.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/Pbuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/PeerInfo.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/PixelFormat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/PixelFormatLWJGL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/RenderTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/S3S3TC.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/SharedDrawable.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/Sync.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/Util.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLAMDGPUAssociation.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBBufferRegion.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBContextFlushControl.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContext.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextNoError.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextProfile.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextRobustness.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBExtensionsString.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBFramebufferSRGB.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBMakeCurrentRead.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBMultisample.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPbuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPixelFormat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPixelFormatFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBRenderTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBRobustnessApplicationIsolation.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLATIPixelFormatFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLATIRenderTextureRectangle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLCapabilities.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTColorspace.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTCreateContextES2Profile.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTCreateContextESProfile.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTDepthFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTExtensionsString.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTFramebufferSRGB.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTPixelFormatPackedFloat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTSwapControl.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVCopyImage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVDXInterop.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVDelayBeforeSwap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVFloatBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVGPUAffinity.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVMultigpuContext.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVMultisampleCoverage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVRenderDepthTexture.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVRenderTextureRectangle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVSwapGroup.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVVertexArrayRange.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/opengl/_3DFXTextureCompressionFXT1.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/LibSTB.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBDXT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBEasyFont.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIEOFCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIEOFCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIIOCallbacks.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIReadCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIReadCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBISkipCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBISkipCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIWriteCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIWriteCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIZlibCompress.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIZlibCompressI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImageResize.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImageWrite.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBPerlin.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPContext.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPNode.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPRect.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRectPack.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTAlignedQuad.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTBakedChar.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTBitmap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTFontinfo.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTKerningentry.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackContext.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackRange.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackedchar.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTVertex.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTruetype.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbis.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisAlloc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisComment.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisInfo.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/APIUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/Callback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/CallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/CheckIntrinsics.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/Checks.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/Configuration.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/CustomBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/FunctionProvider.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/FunctionProviderLocal.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/JNI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/Library.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/LibraryResource.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/MathUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryAccessJNI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryManage.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryStack.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/MultiReleaseMemCopy.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/MultiReleaseTextDecoding.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/NativeResource.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/NativeType.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/NonnullDefault.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/Platform.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/Pointer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibrary.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibraryLoader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibraryUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/StackWalkUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/Struct.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/StructBuffer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/ThreadLocalUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/fcl/DynamicLinkLoader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/fcl/FCLLibrary.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentAlloc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentAllocI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentCommit.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentCommitI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDalloc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDallocI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDecommit.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDecommitI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDestroy.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDestroyI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentHooks.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentMerge.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentMergeI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentPurge.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentPurgeI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentSplit.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentSplitI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/JEmalloc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/JEmallocAllocator.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/MallocMessageCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/MallocMessageCallbackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jni/JNINativeInterface.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/jni/JNINativeMethod.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCErrno.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCLocale.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCStdio.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCStdlib.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCString.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFICIF.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFIClosure.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFIType.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/LibFFI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/CMsghdr.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/DynamicLinkLoader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/EpollData.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/EpollEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/FCNTL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/FOwnerEx.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Flock.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/IOVec.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/KernelTimespec.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/LinuxLibrary.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/MMAN.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Msghdr.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/OpenHow.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/PThread.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Sockaddr.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Socket.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Stat.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Statx.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/StatxTimestamp.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/UIO.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/UNISTD.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Visual.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/X11.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XAnyEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XButtonEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCirculateEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCirculateRequestEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XClientMessageEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XColormapEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XConfigureEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XConfigureRequestEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCreateWindowEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCrossingEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XDestroyWindowEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XErrorEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XExposeEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XFocusChangeEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGenericEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGenericEventCookie.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGraphicsExposeEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGravityEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XKeyEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XKeymapEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMapEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMapRequestEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMappingEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMotionEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XNoExposeEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XPropertyEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XReparentEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XResizeRequestEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionClearEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionRequestEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSetWindowAttributes.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XTimeCoord.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XUnmapEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XVisibilityEvent.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XVisualInfo.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOCQRingOffsets.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOSQRingOffsets.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURing.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBuf.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBufReg.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBufRing.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingCQ.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingCQE.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingFileIndexRange.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingGeteventsArg.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingParams.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingProbe.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingProbeOp.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCRegister.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCUpdate.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCUpdate2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRecvmsgOut.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRestriction.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSQ.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSQE.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSyncCancelReg.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/LibIOURing.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/LibURing.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapCallBack.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapCallBackI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapInformation.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGPoint.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CoreFoundation.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CoreGraphics.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/DynamicLinkLoader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/EnumerationMutationHandler.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/EnumerationMutationHandlerI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/LibC.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/LibSystem.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibrary.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibraryBundle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibraryDL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCMethodDescription.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCPropertyAttribute.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCRuntime.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/CRYPTPROTECT_PROMPTSTRUCT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/Crypt32.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DATA_BLOB.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DEVMODE.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DISPLAY_DEVICE.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/GDI32.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/HARDWAREINPUT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/INPUT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/KEYBDINPUT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/Kernel32.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/LARGE_INTEGER.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MONITORINFOEX.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MOUSEINPUT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MSG.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/PIXELFORMATDESCRIPTOR.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/POINT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/POINTL.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/RECT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/SECURITY_ATTRIBUTES.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/TOUCHINPUT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/User32.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WINDOWPLACEMENT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WNDCLASSEX.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WinBase.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowProc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowProcI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowsLibrary.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowsUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/Color.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/Dimension.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/Display.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/Point.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableColor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableDimension.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/ReadablePoint.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableRectangle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/Rectangle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/Renderable.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/Timer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/WaveData.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/WritableColor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/WritableDimension.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/WritablePoint.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/WritableRectangle.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/XPMFile.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/BDF_Property.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/CID_FaceDict.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/CID_FaceInfo.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Face_Requester.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Face_RequesterI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_ImageType.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_SBit.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Scaler.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Affine23.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Alloc_Func.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Alloc_FuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_BBox.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Bitmap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_BitmapGlyph.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Bitmap_Size.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_COLR_Paint.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_CharMap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ClipBox.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Color.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorIndex.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorLine.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorStop.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorStopIterator.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Data.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_DebugHook_Func.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_DebugHook_FuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Face.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Free_Func.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Free_FuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic_Finalizer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic_FinalizerI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Glyph.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_GlyphSlot.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Glyph_Metrics.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_FreeGlyphDataFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_FreeGlyphDataFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Funcs.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphDataFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphDataFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphMetricsFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphMetricsFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Interface.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Metrics.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_LayerIterator.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ListNode.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_Destructor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_DestructorI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_Iterator.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_IteratorI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_MM_Axis.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_MM_Var.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Matrix.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Memory.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Class.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Constructor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_ConstructorI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Destructor.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_DestructorI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Requester.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_RequesterI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Multi_Master.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_OpaquePaint.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Open_Args.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_OutlineGlyph.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_ConicToFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_ConicToFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_CubicToFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_CubicToFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_Funcs.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_LineToFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_LineToFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_MoveToFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_MoveToFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintColrGlyph.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintColrLayers.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintComposite.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintGlyph.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintLinearGradient.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintRadialGradient.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintRotate.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintScale.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSkew.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSolid.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSweepGradient.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintTransform.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintTranslate.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Palette_Data.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Parameter.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Prop_GlyphToScriptMap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Prop_IncreaseXHeight.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_DoneFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_DoneFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_Funcs.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_NewFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_NewFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_Params.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_RenderFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_RenderFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_ResetFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_ResetFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_SetModeFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_SetModeFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Realloc_Func.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Realloc_FuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SVG_Document.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SfntLangTag.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SfntName.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Internal.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Metrics.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Request.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Span.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SpanFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SpanFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_StreamDesc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_CloseFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_CloseFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_IoFunc.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_IoFuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SvgGlyph.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_UnitVector.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Var_Axis.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Var_Named_Style.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Vector.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FreeType.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/PS_FontInfo.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/PS_Private.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Free_Func.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Free_FuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Init_Func.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Init_FuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Preset_Slot_Func.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Preset_Slot_FuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Render_Func.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Render_FuncI.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_RendererHooks.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_Header.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_HoriHeader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_MaxProfile.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_OS2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_PCLT.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_Postscript.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_VertHeader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/package-info.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Cylinder.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Disk.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLU.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellator.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellatorCallback.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellatorCallbackAdapter.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/MipMap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/PartialDisk.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/PixelStoreState.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Project.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Quadric.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Registry.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Sphere.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Util.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/ActiveRegion.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/CachedVertex.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Dict.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/DictNode.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUface.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUhalfEdge.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUmesh.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUtessellatorImpl.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUvertex.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Geom.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Mesh.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Normal.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQ.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQHeap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQSort.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Render.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Sweep.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/TessMono.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/TessState.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/input/ControllerAdapter.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/KeyMap.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLEnvironmentPlugin.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLKeyboard.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLMouse.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheLinePad.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheLineSize.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheUtil.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedField.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedForeach.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedHelper.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObject.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectTransformer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectUnsafe.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet2.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet3.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet4.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedType.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/Pointer.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/tinyfd/TinyFileDialogs.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix2f.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix3f.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix4f.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Quaternion.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector2f.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector3f.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector4f.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector2f.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector3f.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector4f.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector2f.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector3f.java create mode 100644 LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector4f.java diff --git a/FCL/src/main/assets/app_runtime/lwjgl-boat/lwjgl.jar b/FCL/src/main/assets/app_runtime/lwjgl-boat/lwjgl.jar new file mode 100644 index 0000000000000000000000000000000000000000..4029e1ae3892f17a70f20477df758f4455f070d7 GIT binary patch literal 2950774 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ų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⋘tJ6XUJyQT^wuWvZ?0$sy%mlj^?P99!IZ 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

S)YaP8k$&iI+eF6&W;CIasef(IH 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

^Lk7 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

YmkpNev$X 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

MVRR$+RYUl1S)kv2qI zTRwoVt*%|q<*=n$qc;Zsb^to56G+{sLL)z#C9zDHuGY~%dBjFCPLeLCkAN;h+D*v0 zm?jilQkSS-)i6!baEog|a4WEyWBnE9bX*sV9V%#^p}-`@DO8TJO_EIZB~|4IU1^;3 zs8?;26K^pciOTHvAO4dKsCaeDZ{rQgH|hxgPulbULmb0DA?KsmE(gkpk}aM}LNn=; ziz=E&06b5ikZBKrLIH#rF|(dN6j48K3r9%UPp=q2@dCsLb=M_Q03!W|+w5fh^Lq_3 zP+gEJKAx$Mj1gVXD-0UMxsQoTr-a1uN-d=B_zHr&2lQ zZRHYEFEB3Bm$Vk-kb4Qv&%C%z>&TkDayZ#Cn<|+PnHKDp)P6&M(jrip4kJwJ;9|cf z$o5@Jo!vk8qsN6(q>8=qtqIZCr1>tY!L$SKdLlgb7?SfRuil8EOtGu3(3>}G?3e5m z1jBY$D?oNR(7`ZX9xX>q*tL0SMcK!TDS~krhWsxU{YvbFf-VL?t#B07?RQrFYmr)^*Q>#03hpj|4t1Y=#cJJ-+^-euYvj( zH~1*Y$|DP6`094pc#jPl#bEplVq`wF3o7^Zj7^eD z^REU)+;_&u=MbnitO)c2yc?#-CMuQgqmawtjVwpdC2z^G4ig zU6+u5m%UPsr86Ll9^dr3p_fu`p5!VatKSPi%#))Ko=vw zV6UlX(0Z;>#M-u`DI7XRr&uJtc&whYY=kX!FFan;*`j{*sXFMn)NdJ?GV0Ma=j{^~ zi_2Xgo(XU%QvgQ$`i~_NVf^h4f4@VG`h5!g-@i$we;or#vUZCC2tHZxos4wFq{RVB zQWp7={y!1e5rky5jwr54RXv3_II@hhrfrS6Azxu7j$8YH5x{+c_@Nlt1UUmVta$BA zPrEa4-$rNcc7b`shx?IQ9NU6yE}yhXCi``+I8Zvwj8;eRf}WHtF}n>V(4}cZWtN@6 z2Bm~89k}pXMD0g5BZ;hF51p0|0-`@W7?7V##`Zk5qVg)-F`yh& zGBRPrBWM5Q@OcT67U!e`&sQ6Et3_36DVKAbPV`;C{NY}_4kaS072COrJ7t;X01Veh zQ+GNI2SM}gFWn~mNr5cB`5j(n$HjKj=?*k13KtvWgD#qEovgz%M2sHi&{y{wM~CT( zR?55lTWyCWb~ejbKe@uOcw-Bn0p+tqfc+k{pV-pbFM;^U9EVg$H@a(IA|ihdF|KGH zroGLFv;ZRw>r1lGfsS4&iy7-HB_~|2oz2XVB5_uVd7I!M0yFHuTxiM(^Qm$K40mD% z6&{{>^AoaMg)4>1_(1}mu9xTyb46$>!m2^~Xgy4%E?Pz=6ME!~>s~U!#nYDHcOI;e z=0J$ZDVc4;v_5iceWH0o5lh|Ue~d-{!w5V9|IH6v{}njQ{~~jxf94OZlGi-Hl$0oF zeFO+dY?LpOUBL~J^Mo7)%D%n*ve}9UOKS<&NKfh-b=5$366_*00z}+=kc30H>_|VF zqmR5!cG}~ZM;|^`Pw9c!>T?9KoGhk{2!k|fsGPp*ffYJ}8CG01mlQ}%+_9%3Zjceh z$2vj{C+wtzW}G?RO}h1 z3kw3z$jwyIbQKgCb$8kaheG1(aE2%HrbW2-oq8H(GgyQ6Yk^3K95&0zC+q=}jAsoE z_Ry}UTZvTq>)_@#N#;+BSqM#oO(vMA%hrlzYr%oZe+xa zv9;bHPltz)EtyaYgfn+L9C8A1ryRV&h$A^#yFVqmg4HnpfJ-=b-T^lO zKTZG;$~{fm{x;8!W3|%QOTtAlqA5f(BF52D#y(mDm@%P#zprd7?&+Q#MT*rF-pY$GLacsB~KNuUiyy{XYa&oSqTaV zs1xVE(Gbf&(NwJN;f`a1>1Wp1nPgoenbndXzfhuJwa_H{ol!%soS1LeBq3$RKLTA` z-59%VY-e0gS;Hyx7nZr_g@fa{=e1A~&`J@j3kDDcen0L7MDoRbo#B5T^7HiEvhU8w zk?r1`cvyGr_Uzt$?!0~U`0U4s=YsiH1L82MLhZ%@*BD#y@MC~HnBDS_FhhiZ#wO?3 z&@dzWpFPrp&*tvIp${xm3jiOkcM8S0d4M}E53u~m9te-XCeS`NV}ZmRX9@ONfG};YN|7~TIHg38 zx!iPAMY@zz4~83aJ5?Y8JJj^aM0In;-t#rjqL{l;d314Ij=2`|Wx00qwTi2;#mb63 za5K|Mz~xc0x>kR^gtY&@rT_4vXd^>4#`)AG;!tbhoXmzKxqhN`Smd$1rO}J4{1|te z1%WP8F($e4fCm8*Er!GLekeZEjH+;vG~8pW>_jqN2smqpBWA z5Are;>{i{8x@`0=`Ac`pT=F&QbCh{VHR4WY?>At-E}22=QJyRokPyeBG8ghi=(@4Y z?C#A-T}5^(9NqK-4tpp1DXN>J7U-CYOS54}OG`?b&4sTYbrYc_ZWH!Smro*&F2t||MRMHuF2375lHD^`Z{r1o9L`5MSgpyf;epQ@T{JD|5YpSwD#kHAUDLQdJ5ZoQG}K3PS|w9onuB#p5i}WHld}*jyLz zXh)ibK3ULm2cjpj<&oi1=~}aZVuUoMnLE8H;M!gtlddQK5p_pcCLX7@uQyX#ZcMJ{ zv$3IS_*1w{Lp1EAWVw@XkFu#$UwF@_oE;k(xuR4m!36E&W@1sJyhK^rD9=i!nw2JP z6KSLmQ32U^KVF$CChI!R!%?e@21?rxTfmZs0h6vK=K==xoDo_m%Wd1fxgD4cSZ+up zuQEc0ky)#FA7BXD-Y8vDNs(y{w34mYvK{4m=bzSm!Brf;8u6ASE1}L@jK6(yk^H5R z(^o{f@?Lhnj)2Vwt)_%MN4W(x8!KA`JaEI7sIja;E1a3csLb>(5|BH93RM+AT_+|* zbuQN9Z(#PE3&XFRhwDq%KOqHAUzO|_BNa&f+z{2O+Nuq^XrUUTwq1w2EMZxFB2wwa znS_=JqP<7^-B;j+!XcLV0iyE57qVB0K-h}x2=#?ETWJq<;{*1Q8lZiaw(kaI9jtEh z5(MHG%>R8OzTpA;hZ=y6^$GQ6@{$FDAIOd3{#%U?E>~fXF7xwuv|TwsWY`y@Yo1g? zJ(e(M(ySRL^?OhqtrNUqbvtDEJWNMUuT0C!*!m%{Obc_a9OpqC+qrK(Wu}i z_)hn8cP?(m<#scBeH>hoCNFCeBeVueSKj$XCwv_?(EuIabM-fJ^;dFji-s~1^I+bZ zmlL*)WRKF&={hLCB7;-o-Zg)!A7<)A%MrUszTzvn;O8_*gc?ys$!NvU0J0*~XP~Me zw)fP!$dyA%!yZga0Q_EJY$*W?H0xn$zQGw|IF4;(4*2VU=7&=`7Ors(FDclghbs(ki^tcLB>Y2i#t9hB(EVdYITwGs)WmXiYvl1C zox)*xzI#uf!5MU)k7dUuv$mo4-b>@1fd1Ia-T$yav&abP(0Bj(VQ{|7_e7lY7f~jf z1GxkKkGkpszYyt9^uAX;!qYhrj$H&tys{b03PeZUQ&o5Htl2o{vYAl|kLbZ=Ozhxj zyU`W}&Q>Am$)goPwH>7ByekEhb!xDNk81rUuA$@amknctGuW?6Z7U7~!LY&@5p-K^ zBmq0@iVEICxFiz66{`qU6px2uzMxP-6x;R}#WGonkr;PkX)pI24qkyA^qY!0K)VSA z&S5s6rx=qp0nDf18dUMVz7lSs6Oh;;?^oJzK%>VDEVFIS=$4+C)3t^m_$|rB?WNE z^s}s52XhJmu}$^0bY$_>9nezVX(yIByHxGt@&Vz zYvPaM(R)gRNKV;GtQq+UI^CQJ>Vouh? zc0viq4KVq&t$S{BP#pH7iA2L2(%^23>c9r-z9gip)uT&C2EGY^L-RYtMDR~loX(%M zUC`U(tIhV)Q@7}(9+A6ex>ZP|F8QL*dxD7~g^%Y!%A8WZoe}-#F44YA`MJ$*tJ$yx zoTWXs{Ga#;ce+SNyrf4TdEsuN@y~FC^q*u|vtAZ+_uL^}_@QxNZ{8n4z%!j8KA(lq z?gU%JNAKxlE0cj;&rna@PQXgH$Wp_*l@AYvq-VvI3`^sB^*cl{(X&ENb+}pBxX|F8ap>CKR*xM(snr&fjh1Ks4do3$tI6?g2 zxu-&I`_a5)C%lq)&rfWAnts4NV?p-x-jL$_H);FSIB8hTG($d_`!_Cbl{_vIYBA)K zJ{R7ooAqx??Qy&=@AtiG-6nd!^e1ZqYME#3`Yg!yV7!rcqE(PYsfe7phq*z)<`cy?~ zf(I=QXl9$!H748<_l6h^S5ZHPVapc~tcmPu_|e&kWKNrI9Eh@F%lG;W{LmlrG{I|*J%HDYgME|)KX zGMnh@gdV43NyIGucqI(-vmDW+i7l>1pK{5`d4MdXi*v4$p>w&{MGf^^@veDhf7~^+@J=@C515fWRE;kZMqZ=XX?zfRdp3x-z=7dK6c>)zT`dt!5qVYQ0g z9#+j_O%OKe8<{O)hsLPQk~FC&FKOu?^nXW2KD9%H`ZqF={u?s>rF&fzCgngFQFzl< zDPnJ18|)2WIuMYzEt~`N8P3ECAv>9t>J_vXFbRB9sgcor{qaq@m=oI=SS)T2AG4h{ zYj5M^fygOP6NWp&VBxcZ2Qrwb_{fbX-{6CPExVE!^pr<;;dV6@ccR-&|1K_p4faKl zBYkSih{{zJ0bq|vs4o*mlB5-vxEP4Wb>!Eq^|0X3sV=P^xIDik<38;4b*<-41K)5W`_w7nXo4Ax*k< zt;&Hk`rgldMjOJ*2Q8UonSQYK)$MOFWq*Wj=ql4AQ4GjklZfChCyt4bWD9#$iLUb( z6>HRx%9zxUELN)zB{CE3Ns#1J=KuGgyq&v1{Uabu|Lrp4U-B^~ancb<5GC~Mgb6t` z;tmNGiA8q~$TB?hcWRVCfv~J$MIzB9@J9aNoa{6Vf&3obZ2`1w`&_sDA+kn}MY&-L zmDl{~?c%BT>ErQg?kzvi)n0K3&do_(fESuno89|6EH4dDpK#Q>338kak12yLH01$1 z%(+zabi73wo|%S2$Whp#L0A~ME;+%hi@Hm9-gO9(=Irl`HhQ9;n+b_wF?~@)a+8Ub zLcMr0v+sE|V!skCBF$0U8}DbRD=3acU@11snlh)0${0}_N=sm>M5p42MG;m=I2RYV z)DG(=pGB1xatd2!x+275ZpLl%hzLJG@t##@he~3g?%8lz?FuXlL&@244l*KWv0bb; z-DA;Vh9|v@Dd^cg_6D0iSGM_Wq6Z~H#HlRZ1?TQMKtl&iV7Qdnk91`|Z0QVxabk?7 z9g&V<#DVc0F}>;)5((3?iS`@{DsTKs=6z1Q@p=yjZb$zj;)WiJ-rq&jF~}o^<*1Mw zj=8|-JYeO+EpZ%pAshaVY}-|!x>9tmY3RJB<7s`6V$V$AV(&?H=^+5?;bF8+8uvR5VInDWIrZNdUMQt#5TSZ2+mc+<{-oN8% z2;VLG;rk=U`EPh){hzAnq!O|q3h!?jrg4U{JP4w2_+YSF5x$JINBG;ab<-?$Ssl`Ds#=GhZz>F>-P?-o&p_OSP|Ee zX3jL?{hPGZPPqu%;6q9iR}(gCjHI>cRO%-#9r4DEer=Sq;Wc{kuvBnIM# zz8)?&fv*DA2DVg)Fm_;)+xQ~x{%()^cypTb3-+Uy+SRVhUvyu{ueSg+nE=``E)4^n zQCAU}WJa?_^AI?vGd?_m+c_-4+5E6zC}SPBXl!?pg+VerqxE{`QSju?|G3*)=Q~FC z_y!E;e>)Y}{s|ZtrEw`xMvPD2O}R^so41`Hi6?#4p{RpmE%XZXVIe`n-y>Ktk{K4X ze5vHaLGXLR5q=|q^tIwn4{q^XCXDicKPigWph6XOuCfwo z*1|}k)DvS-Gs-$*>IF6J%xd-dbE`y3H8-q_*IuZ|fyzeTUJs&J(llsPY}Tlbx49+J z&BV~b{77xBuBxk>`U0leKMC_01Dewoo;oI2Ez)_+LVspLe`~O{RUp1gZ$=1ds>#uw z)m!s~oAu+x$^7Gv>)}_+tqpNh2v8IN#CWSd*koYqOAeyaZ?L525-pDU*pjtg$rVpZ z=&}O>ACmd2zV4YJv0(b-|GnT+Z((bF)q!em#$ro2ICZUzW6uK7i)$njcl`atK4--= zb9X-CZSm-Y_wEan%WP|iAj}JZ6c@js?J2DN8}{cn#5RF&E2MDFFzzXR&}1lMVx1?( zFowJ`hWs3I`ce8xt|1mEBr>T6!SjDu(1rGmjdH)krvKl<#{NHHleI%;MDR(nZWwQn zw4iKC_9c9ZcO*~^83GQD2NA4RqN~QDgI zYLxLiyx!E5)=~SBqmO>0r1~r!d52Z$g8fU;eL330 z@77xl#SCq);ZCdHg9(dOv&oXz(E?$?B~n$2r&1-q;vlLIg-F!J4Yj1iM*omW8|$?b z(Rt|UMQZog@Mno^{>m6nprNzIG9(@$yI{1m-56jqxHhm0p7}Zv$(`-c`}wgym&FaJ zIpNKJO8-Dm!#~)6Ajv=pd7w%ZIeDG=+~NDGoH2I`=2dxx+EU-|ZxMjtymTZ9>-r1) z_hu6|M+ci^?ue&H&p({`=e$tomiNefLJRv1!p~g<6~6)|XByR6Bu+-Dd7|@-7R=LS z(xgc=z*=K#eK_e2-rrNCcqd{JG`=;{|?!h}J043C1jKj%X&@{Nf(6rD=N* z{6%okmjL>m#JdC$5iTe0c6oHZnYuRhe!agy>ce+>&>X7aX_uLoS+-U0%i*~xGS}N2 z;1ND6{h;y{9b0=M4xER2OH?qg6zJjRz8)XnZY%`s)UJ?_`hhFdaCb%G7t0Dv; zWMsTGMY7vH&imqnS6-knc?z?-Y(aS=! z_8FcFdt$hFJ`rv(_tRtp873-55;)LW@dV*LJZS9pNQwcP;C8SWqhR6#Bqcuw(Q$BD zG(5iZni(&ld{$$bg1&3aNar|*i_v>e8voIV1x=1afSX$?EXIQwfLK#>3b&A`)BnL z-Puz;P@{pAd+OJ2(8-pU>*|Kr`>dbe=Z`%uUrBwCbGGQimUnml0M#nVCc61h5jTUrJ>HqyTW1+)=NNH)@s`6Ap%CZrwo^WsRn@n=R6cv6oMBDqqJ86vslc|>Xcq1zny z4k##1SLGu$bSM;7P#f?=;|&#;oT}Uk4DAM5A<4d7dUMJ@c>S_Fx)Ww<)G?r;+FDAr zQX-)ZP$&7IQXVZ#CfTaB#Ux*-lJZlUWi00oS=U&urCwE>+vCWW;insDZBwO57tQm0 zOH(PaanNIQ9yn|)O*#dGtZ9?5VBBHVSQjZyd`fwdw+kYrWj(veG7gXx&+SP&f^sS1 z=BVwwgV!x}O+dAY>>#~vL)a9Ci^+sNq^ zW*{U~R+=I$Ze6~@3(k3V8?7-EdU zjHTCi=!&kyVUxnC)lV&q7RRCNnsA67#i`xL8imZU?~1*|(L11yWoH<@W9`{@N49g| z8E$p(9=+rB4L=l*&1JwJorRiVU*oV*u_Y+36eDz@Z>4WS+AfQ~je^rXh^DB1BVUkm ztnQc5(n+`FY5ptcMGqdT&ehePi!$GBIS`Z643F)+iAdGFMNvPO&w(=s^XqEbGm_6# zr+W{AW7A+PJbKFjf?bHw8<1o1-AN%ajbIyW`cj1lZN3tH_4cGvx#r?x1^zA}z{x?_ zdNKaD+=aFB`;NTPXUD&Y9$UJUMl>s z+*9FKHqo})ZxGZ9){5zbRZsA4Ss=zQqTO%BO8u2Yc9u1rf!s*~hsuK5B+$C2GD`AM zmz}rUf@_}QDpID(m6$aiy(Ob|WXeRuo&?*TAu~2@ENDvx>d3qvmo@IaC9`s9%7iz; z2<6C6p+S&bP^Dm-^9nj)2bNhUkxP4TaHZEJo9+chv(GzW)Ari+V%Lgke-9%&i{RAP zKxgSXwyuNXHg}QF1`Y||%)N(qVLx}CPY1q@ci}L1na>CQfrn+!aF$O9K8T0qz>t{& zt+w@Jb{;Y?;k1$Lu@Qp|LpYK35X-8cD2jMmtA2a~;7?jNxnaN%J6aXg()jMp-Mesd zyvqa0!BP4iiy_J^nq3f6@Vg+WAgUm&AkNU=Fgy^AMNM-Ssl%Li+uVS+sYKVgf$y=w z7p4I?`ujiIMWAaikf}$Us#Bb5aB5m%oT_)&(noGeM17uY3vr_)FT3Ob+Y!9{`gaD) z2cfWA`5t1;Blf?{vi=u?{gb+yJ>B$GRR4T&KFi*llF^3*qX|KZLI6X`7D0dn==;wF zvOvR(lVGMBA4~-wbf8sP^@m2~Ro28TtD+;p2G#59xVh-KEW4~W{LyuFS*>~JJMCs? z6&`zz!w1ZCKX*IbQa(3%h4FuRe+i4QC{8ZD`u^s2_U#j`y$=Gxa|Gp~*~{}6KiVz? z!9xbL`ICe3Q0~QnLd=lA$0qTol;@hW+pMOy3`7OMf5&A(0Ans70 zPLK+>de0!~LpbSK6y0yxrc^s_6{*y~;4)1m>83tIOVA6|XA4cz|b@ z>(Y7ZJf*7sg*cruAo%3+u3~x>itmN9IWh?#dpAj;!0FoE3wx`e>&`D{K1s z&-7!pM%DH@p3&-)3aInx#brp_j*Q$Coieb!v~9~CErJDFlwhh>ts=Bb%ZRL-u1|!t@jk-) zr7VSnh?Mo-S0OBg>Qs%|I8w>lwv5`iP$|88F{uz8P$~GvIhhjS!=ySGIn;-m$W}c4bC&9?d)Yy^7b(uCSHz3i1s^Ha){=mImIF z*T9Yzxi+G=3Sy}#_{ijO7)o!fRd+20Df_$r-O6;lK4`KNf9o6iK}Otdmn|&n=$m>?*0B!fvGdaQj8bO|-m3%#SsU{1F+%5>1Ga&99bab;=Tf@4H6S zX&JtSUk2;mAtS4=Ft$tz5gB0UXvpZOmnN|1sL_D>Nu8-WQbo z9J$e3G4a-3(AEc>6*55%_I+rjU@w!{j-nD}5fg)XKhgTKf&BCcm3(7+*|~`sGpzZe z^T1~ zX#{mQv_YV5?<(^BOvJSX*7~7sHmqLXgmxh!G4WXlo4|5I?AfJ^)!6qe9C5va&4VX( zu)vrcK-1vnEX#b^JWZR`rOZ)NO=erVwJc~=wX4mRP*g`=UZsc_5Yo=2uV^vB0)kfqVC1#x7VU;f zZVwx@uAR&G>!`~Sg0qSZBQWqtkb?Lug(J`>dD~N|CtAv9TPON?BiK-?`+^8inq$&e zWorKqU*8mDS-WgoUAAp>*|u%lwr$(CZQHhO+h$ka+V|{pBhDZ9>{u~lt(WyO=9oD% z^BXx5;G1KVS(PkizOe`?0Dk7jH-sEc@}fnTV9UTlp+wx2ARIyhRk1lbO+A;PkuCcs z!BJCpD!qC9@G(*akth5)C5r1@Y!Tza;EJPml*r^faAKGQVUbo3b0b)LB+#7+XTu2$ z$DcxFC0K?QfmPaM1#=jFE0a54jll`PIk~+)c?Cdy-TbEQ9KIn}-js~5*YV&w{fi~y zYDi~&S-v)5<~ZIwO#iYou2J4oM4F^MX+jY85lmpmcxO>V4|<^W25S9SQdX`aNbrN} zdwq=hxt~um@u(vqA_9`25Cnv`a7SV%=Gg>y!B`>Mtg!B=sBLj(2lHiP0?qqL<}bu& zz&XUR!ib3^S~^V2Q;pu2VG3=MpGK0^;FwEzu`o*yNzAr01kfOw#8--8X{j1loRsac z9K7^c8Cm9mkiYh6r7eU=pg?zN{XCGsW#E825;g`FVY1~M5~SuYQ2!4i!+I?S{Aym|MhFUQJ<`-#sbcLny;6nM>+*OpMyso}dlh;AYkAF)5#Fdqo~rmW z3~yGQ9bqseL@*>Iu+iVJB+=4pPisT8iAZ3IMsX;G*-V(JOqjG#BO*u%B1nlMBzS|1 z?vfm(VbYQZZe9m^6KlUgqNS6F#V6{+GcYpCFrc$Wm*1{C=CyImAXeNcy-w%{b}H!y zu(!CRX)sw~^@*hO0`Z1+Ls|xku_i0JqW$+)kOp~r`EwUdLA%9mF}RW%p>YZG(EWPy zeX*XJ{bJ970(+8nd;!$zP3B%1zGV7ZAD)SR;X%F$$Zcg6S3CbZN57RYR|B_>gbnIE-Qn+o-)GdP<-iF-^mZi><%thglzERon2rG{?WK* zT57gHi=&Kd>1rO{_Y#(#tquJT(98?C}g(_^t;#LOY|aDY`lq=ikKd-~nHu)XDNu0(9b6 zSsaRobf|8dmbvH{l>MOyn3&mv0^S$k=f>aj`Go_ByJw6_V75W*DzSbA>Lisr(Uq{t;4_dFx_x?G=L$Q1L7!qlS=4NquGsGkG zwBP6)N3fgHc8784)8TYs_$VB-o3`XBFzpHq@jb;Mxu0@4@?&^#qamfFu67;^js^cc zzkl+#gwO9iL;8tYqj=e&Bi>}!-11iF=k|{Qxxc7De`7xu5_v9*pYQhnRb#p)>#(UsHF^0#E1Y9oWIwlcAT1(1;$GRwr;8;+pTYIJqA zeGCyxqS9*exW?3w2cp^YR7ARyIXX)-GKHRzkJfNVFDOPP8aOrd$oG#pcewolwS|$W zvgP+^7NzJg#9^xxI-a6$DUm+5{Z;@3mGSeKYgY8eTZ=GV!{ z%uBG~y=MzH1iA_pS3l{AK6poOdq0sI8`Wf;vE)_37@aM5#vsg!sr|Y|EV|5C2S5ev z;JcU4rKL$=X}QXPHe5af>HEcsJj1S&{5um|C;Ah!M*tntX9)eQPb}LBjM@q-IAceT z`I0=nW|8)Za?rBtgmcjHG$hFm=>>6eatg>x3wqUK)7zlEb&wUyL?TTpnEuLsz|7aX zgKKK@d}s64;cM-ym>jjt=wkre2oqy~N5DOXxo-fOEMI>TU>2N!|DINRZ|p3UIA_6ct3!!D1+$j|X6moNW>xM<+2hEEA5uhq9@ZdS6BM^zLj-UEjn^np$3Jv)>S) zu696+BwVi$WX)HT3AMsC=QftE{?NXvm=H3G#$s&MKyta8{jV#i8ykqYfJotwrD0o; z#A5VpoAijMHAHp!36QVvx34DG(q(b67aVOTbcu;pm7zGL=-2j@e)4>yb43MqhCkds zwww2gZoxvtkBie{uQOcbUt+3YPhoK~pw4N+T=4m~mX;U4UjQ}7QR1Oi^=`iJw zF7FVDi$!|HF1=wSSk}@2nSDuYk)wD=%i8#4Py5HsQh`_6iJQhU+Wv+=<&w{s%2VAU-hYK{WC{E8f@Bu| zGgH}6Qu$DUFP#nAVIq7Q>IM?7+IzebKf*Ff(SFuUMPvd!KV;k+h9PrG*fwjFUt+%fo8&3eP5hVM84K!3VhKXNj*xDHhsS zv9mpWWnslu!5GLBtD*SBNRouhz_YOPzNI|P`T}4v+dOz-CTML+`-`ucfTcNMqUY*V z_CL$K(~9I#kNrd=YyE#iZuz(Nj(Cmkjh15jer$`2Gr9xTnI4MLr-KdTU zqyKCmN8Wmtoofp`lBH3boS5L?8^l4*M=0=QDL+Z$=>COlEA*E{3Ku?m3ZupB8G&M5 z+K`CJ0WO)wtXRI2tg|Uuq;+xLvy6`73|(@LL2?2-nz=OU(qiK6N86jyj&DRRoqu@d z)|6sl!e>^ndFKq*vkMfpE6=jc58_0+^{?u`u19pdT>Jc7iOl@p{V zI~-&uPtZLbI4n}`8UQb|5HbZi+1-B^hdww>LR}DF&E(F?{vtdUzP%-!j*t<+&A_Rs zX}8D+j9pzMvpcXEaHl-nU~07R<5ljwW#*qb}Ec&XwE}^My4LTMua? zYh9#qZpx{mu@|7@Sz zKEK8qzj9^uPIpt7D7W}};hb&hu;*C+r}?;d6O+Isp;C7!L!}5WG*)dy98Go>#o|m# zpr^pP0GBeP^ ztUt*RBFePrRg1^+no8wq_;Vf+Za;B}^qc$d)B$v%cI6`;U|JQ9*adec<1??O#E-q) z8AArxaN!MIhQyvTt&lxdvG8?MaJx)=AjHI%M0p(GvW*E7}<(Njuaf0#f`8ya2yC4 zc&9^AfMc#SM>$?+#bKWFbT`tXj(EUHJxsw+NDNC#Ib_%+cgCIZE~r!3B(u5A3ejx{ zUL_^T7TTOH;fyOHV_5kehhQRQJ&^qE`k;Qc2|#v0InkE@Uza4tdFEM3>-^G{U{4ND z6KBcoxq#M3VRDY&<{4uMR>gBP3pjN~j@Tou$<<4Mw@mw2Die0?giYnq7Sa!$VK1O+jh2jG-PkK$PDD?e zDibQK@;YCRSjMdh{;u4J@S9_2d71qa)QZ}{G?Z*hH>H{gppe?H3kxnC)pN@t!3Z7Q z(JyJ4&z&k0?g|NP5jb{QJ2I~LSVWyJbJ=QVuhvX3SYE1JJKfTW_3uDpp_|6`^eFiH z$PaRueS>D;fUDrRzZxm{sW8NkxgZfv%rwRg_l}I0z+)l$k7z^Ub%&A8J#vIvAE7rU z9nXDq#9|$pxhE~pP+ss6nCD8dOKRVtlUz;*mKi~23_DJVFLpa}1eEf8e z!QNqf(s-3*A4@N2ODMCVoY?$w2R{;r{NK!fBrSu)qIxIDz}zqjxJTtCZ<#Zm?wB4J zac?p_u-#H(pYXDwRvdVO2zG3NSzbT_c=u9mi9sdeM@ydA0!GtLXIzo@VD)?g3SL!d zqkn{M&!Wy4J5OVSPR@R}I@z~p!+)+r$g|%>7z;4&mY@2ul7_7Ajsz|v7a8<`Pqm-Z zJu1@c{xSiXy^Lx%wS_#f?BnvMw4Q?5(+be@-86QTvob~Nw|SLA)p@22s2;VhW@VDN zkannO)w{G+^!G@OSo(zMZ{nS0l?7SQ^vgkc;xFU_+YZ(;Ueq?og@fd~y;14l#8tlu zPh_N2c}8Gg8cnL@5f2Lk=@Ns*aiK48Fkw*9osu+os4V+xb}b$I%TAX%GLh2XQo;Za z^Bt$qP)5uDPKm@l@xrn|MNia(My#}gJ0UW&+v>68W8vMFt8UP&&YU}RRFom>Etv6< z;`B_^zWkb0?30&sVR}&sD<3aHk7DAVV_=k0`wTSI?$irVJ(4+K!6P$?x+XM_ti03BSnxC~T_#ZSps zlcmK!o9F$>=v+)dd;8+BeSvPc@d3y3O2B5gnMv#wz7EoI-Z=-{p}5%1tR&0mYgFco zb?%G$Jfn*FEQz4zjpk_~5z3i@ip}jzikYI4_twQMyGb9wbga<7JhL&{BoT(VP4;pm zyxqDn+DsMTYU2B-nQ2!GO6g27Jlk`QvUqZTw2h&uS^-4QbMApNSnr-0nMK^bQl8H) z_dFCTaN%YONaEs2TJYlRz~-+bS;HHh!fTzwbb-Y5zRrHHB8WAQ?{Grd^rpoIH9#h0I415CCe(C;=XBfUX)t|O z;-Tjf!%sktNVYBXq(e248)QVqdaD`vPm2jPQ7vh#mNYvPrLH8&@fR2bdf$XC1c3`AXLLjYvQKH@i~EW9=z774jN{=Q z+^U?J9_E`;^AXkSUMcSHB;AekhK;VU9u$~Z9{yJ>JgX#}8!A}~Hw8tKEZ1Ma(c~_7 z?j<8Lu_X-HEL0&_a;vYKEs-+K7`g<`_X5Az0#{-%aq@X%EJ{mNVo>#P!Q^~?;{wAv z(v=NY@#-(+!UM)13EHDb1vAFG&@0(N9Gj;KfTR)_T9*=R95V@Y28dXy%BQ<9+smUP8}!w()O5q#jPnn%!0g0GOCHU+HLmzKCU*ii zsc6IB-p@Z?T3e7ob_+Lr25pI;mc6C)b<5)$+hUNfb6VGMOuCzrlTF@Yu+>ftF0|Fl zH-!K(dZy-|=U&$U+SS~AoXuc{p1iCrua8JC-x@tkEw7^rCr5%~SASQhWfh){&!_g@ zl^EH;r>^TcjOuW-80_GE2$~_?u^~MP!-tOX^REERws%g1&ur(2DeNWt%XR)J35;hp zEuqlkifnFOAb8lbnwQT%VJr#wMq{d)EMTeRM>>>uBJSw}?8T4$x zs!VZC=_R*aG1rr68#R_3_a4F~AF5>rOMZC%4(?tAHf|tbpL-_QnB)=O7xGO7# z{gmj=X1`zNVSU<7Ek*o{5EItv=4v`+UY?eF%x=Hcy)%MsiPo9^N2OJMHi=s5$&Oc+0Iqw;$-$Jce|}PFK4S~qwV#Kd{Bj- zyQT-n`gWnC=f}FptI4f+?QYf0`K#->d1t5SXUtQh_I9SX=~dcNZWS;1%Z!^|u%zNC%M~fnCkJlyYJ-DAGq@v=@_S$`c_U=Dw30)8>J8u6H8Yb zH>s(Xo26%xlkRPH%CxlCpMOh+uIIoqwjz-b?tib<2CME>W7EK$^agCl9X0^PL(2AS zh3`S^pO^1xyFs@*^)W)pvg5Mirf$jZjSnV9p4v=#=S)Y=`To{ciOfDsH`dXJTt6Vc z-8p8atGAGBV)`JJAhPnkN@bU;4nK`t6!)Rfih{N$oUx}Q%Ty^aQx9fvWJXyaXYyMi zY^^OUG~F`LHq4)E16k?-m zD+n1uF$L&}wh1lpb@g1?BQVRUw7pcOW8KDe^IE2JTfbFxe$M>+d~^!o2V)tt<%O~5~5zedoX4bT6tmDc~I;O>Tr2LNnEvnQZw8!1+UjzN)xB$K-QE_swu&tW$oc ztOEgsT8Yn~Z^5iZzQ*$l` ze5`fV=pSFOfnFqp&lD)`z@5q*=weV$(q8AxSmu>T z@tZjciu>qI0x5RQmyV^jhE5Zu&2rn!0;3ykFzVfWvRj2rg{E)hK~qqml6H}M=Gf1) z)0~v}><2Dm&BW!g!7e(|C}P2V6#+a-bTb>=MD@Yg{;6G&vnEz@Z?9P%)Ymy8o<&oG zZTzZ>k+FC~)=y~MZc}RjXpOT~3E4}d2#P?cC*jQ|LU!{~9FDU<$bd+gl$xOh7;aQr ze%nA%yeG{`zJNfwr9FD+)M{g35$YIXH{$+E2%W(Dkg@QiC-JlfHyj%#H!0FCn}Mid z%{?YJqrH~qE&oo`TVggS^~l$K|KU)GNKx^Tc3?cxx8MDxchFGRsH z9@zXSbW_p$fx zt^3aFXUgv1k9|@Aq&eiK!-N1GsbD+xekL6leUYE-XargikE84aHIVeQLLy<7{6>Le z=&V@=XzsKG^v;%Hi%6m!q+q>1v znIM0}X6Y?6O_3tYbtP(8vqmB+>1>*m7l<;aQ58LH?yR+$tW93Q@n$tDa}<>s=HR<9 zA5{(Wadb(Q>BUOMmW4{<%NHKW6xK`^DAu0-+a$!m>)Ype4b{&2EwySI`!fM5t(oh; zbyMeznNGOk8a1}r#bRRNt;>ouEn!7L#~7yix+I^Nt}zBJs4h<$>}6}k|yGMs(q6ng+1_Ua!Mp@Li zFq_n}hB2eq?vco%kc4`;eX4mvqzHCM6)jw)rL6v&485P;H=>F>!`CfJ?u0zi@3 zR{kiI*h<&B)97}IL)MsvzrZMTh9ryTxjI4xM3D|}RPes_JN3`8?Sh~*Ss*5x+G_XT z#@k!4olkq~rIr^YJH|nlnH%#Ltu^vtxY3uC1Q^4RB0~weQ)| z>G9w#Fu-UkFu-fMadhsjY)8KUe@nPyGmg@M{WZ2EQQ*s$ax5seJ8wCNL?{BIC6cBa zM`}KtCB+q7`fC%BRHB7=26le%aml>%IVka>ImYeBz2!1Y zTC9bde|(h8w$^hC?+I{eeTZPA-~s5(N097dw-|l~$S1I%|8PDJsXOUxSCovtF4oS# zF4ytw{u-&V3r@K&*}82o>lfW9Q7z&S*9=i0R9lE@+_9HKTL6ehBug?mScoX`rTn;u zQUh*sm87tm0k032WG7rt?|e8PyuJ9>uXB76jv&2K-~^g;0Se@4W zGMNA<(E;|T7BX07wAvObTuXIq8yX#3^(+hZDkijD3w5s^WBa0Zw%rCd?Ai8V&M8zw zSyJENgfEcm-9Fk|VqcNZ0d^UFDFZP34E=sfus|jhe+Mx637T5c+tElbszeDhg~04Y_ZAOe zrVdY^b--_K-baajlmxydgcL65%^~@o(9F^+h+E)QnESEhG-l3KtKosGf#goY?rDsN z?Nfy94qN2>Nu1sKA-oaFg};#$8&2`^p-2nWJzc6QMch?>`t)k%GWmW(2&!HjB4k}%) zsj$3(im3kycm73G4=X~KL`F(3p;?vUukM(!jLI$(yM#oYX{^=dkM<*=zKUd;l|{C##*Sdvf;;@ zzsTNV)N)X3XTy#=4c>F&yi~Zj(fVHRyCTq(y3qO15SQJ==Te6qgsFJJ_fWbh+;kQ1 zJ(z1i>(F?SA$@+Quqt(xA5f#%QqC=m8xMA|S*}BQsPx~I8IOWZ6}Pvs>lH^Mj|b_Y zrq?cFP=jO(r@3=X2s%{IQzkQ~ls8#2>JG7Eg(uWs_#08Ab64bXIqhWy zM1(OLl9`2(D2|j52b&M_6v}39na60*Z*!Gyir?SZs2CxQM+MwWlZ04#i{FW1J!24E zItuaInn}tQ#%2{|`6;I4D9<&*n1J{rP0|x(OKXr5Vy?&dC-}3cOmB>zM+xO!%tQus z_QvJrj6iX1qjA)6KOsjQDYSH^#qpXuC#rL^@RpPs<2rym#{}TeZ_YK27zwmSW60*B zN}|`l$DcuLwpfv*o~LOoEEaOL(4Lb#qGO`;tQfaVK1^6s7D8GK@7xcss}Gt$TL{;? zc~lAv4h{;)<*WSkXV`ofs}_w&8q79DC@3#4071~6+y^%+TVWRG7(+_Mv*{VsH#?;4 zf0j0vwWHYDUpf_YA|0p2P{SG~OlI#e`&J+?Yc-<=8*TGh))4hXE^Pu3d zV@Xz*Dy8PMoQguKpvijaA`Ppy5EtZyt#}I$v2;@%_Qdpw$TepR`h{|9`38Vz@rG!| zL=xqaR6_@Yw|@$_NvrgwFer|_atCAQsm1jNvUkN!yDMjq2y-T~dpFEjf~t2|AEkHE zj(=@UnIaZ)M=gmSh?uFxYAA5K^N)jVwKVPa)uE`=qeIi5^X#XaJ^9Z0zs@ z7>w^wuF}?AU4SeTmwzPW%|s>!voujnrd4*;KG1?EiN4!K00cLZlsdnw2Pk1kBj*+l{%1B=y8*Hn6tH8ne9OSMqCO_+_0K0_jl zvx_{^==hny1{3Ovkm zxhR#Ql(jOnCcCxrYagqqW1#Y3sn8Vq1kB<~LLGb8GgB+u8f-{GaQ7H?lG$uOpbu+@ z=Dn&ZwW%b(q!}X-y9;s@#OPm##R9R?U5y|j-vu{^d9h(=QkUVn+)D5V&dOL_dwm}i zm9X-$+hIt0aN=X=-_|EcrL^rghnabh=El3!N!54x(7Gp>_#iz3E1&Iv8G}QuwFwk& zm@#pJWNv;+cPhIg?@QE5TlY>%;^{;RJ3{_~pUk7bpQnp>2l*Jn_F zagtf(ms>%bZxxlE|AH(Zw}oeLEqIK(Ct>0VaN?${1jIC%Ru49lbja_C6`A3)A!_RA>J;zys8V*nBLXfzN?t`t^oN<`u-C+mUYQX7RNyE3Pyre|vQS~V*W zjHas7S@RWG6wun>2qPT~IiqMap{k#(GedbkLY^+GvtyIzC6@uk%q>C|i{^jeY5}Bk1+Z0z0Vx92uh;eEjU_;{0aOzm!O_xhu{OG;|bdlWZ1gSh7l<#!+a9ZLP@4r%zD5Iz3KAU&~?9vQ*T8;5#PrrMe!AwA~00h|kd99KWAe=difE6Cpez zn?G49PjGh8&t5XBGE>844guF`Fv1CdvYz%Le9(y#; zx*HYf`fKawca5ogRSg0ZWfc$UW3Dh*0pBxCP(Gn-Gwk9sM+C)~5h}>L>QoRmVlY8M zjxzrIBgdj3qcD~H$*&@QM&W+{ryNU4RpS4p3<{Gn13$LWKw=;W@LqnHt{DyWSgti* zaslQA5aBhU97zV&<4$f~nNYlau?#yh;NWHh1}8rw1zC)yxVpP|xd1hG276bP3rXY#_XlnCvLC8M8vQk4+9Jk#}##l>h&?$H!4S`0XtEIy( z<2uQd3@U7r5`0)!CWLK=7u(m@_%f*w>`O-NKG4iph^>~B11RUu9m#c0ivl*$ZZs#& zB{0N8n$q9M=W(1#yw*tKupj*h3|kUMWTciiM~bR%dP^}B`r9Wt2Y|G z>2Lzv`+pPv{5FD1Djg6M@UYw@K*#y3fH=|ea3t=;oy4yT%}mL>i3f2V#y9Lmg1MiZ z0ncK^i=O#0gJZea8;=Xbx|d^mp>r|LBkOV_+AoG%-d2$zb<=U6f-EPHUiW>=7$kAU z+ECqZO zGK{IEeg@yg(AkSI(WA*ZI#g_k8&tIk#C zE+y1qr7Gi|uM)1xx5tG9r*0gR2JQ7&RY>WOZ^GBS=@aM(g)vtlwfwatfv%=r7&w}@ z))=cALBRGw^m>Eka=HT2V!vZ|yy9B%6CaYO$_|8^^Rzs-ziP3IiZgsO<-^0e?&H72 z{Qig6{Nn=04b%^0_WuF4AJq8&0h{^%h3#XPR1OZbKax?gjBh?vBRHG#zA zIhhOMr#QbDfA?X#bm)8zWCI7Q$J= z9LAA{2Bda~fbs&MP7nCC`o+=^^an{(jAC{QDX^s}>+iL|FCD}V{)%H|=5Ql=#CU@R zxCgZ|Ipp$tN3&G8^Q1bQBjJO}Q!06%Z!%^mTDr)XH`7*k<)H^cW|*CFyts1Dta^ z>t#D2Nv&>m0PQC=h)L&)zyI*ueXLXyiTsJZ{Xbnf^8bZ>0zc!b|0;8pZOlz<9jyP| zm{Z)8L6S$-E~TbUA_ON4_%SE}iTBtS4;PPI98WX1^niL>fIe=*WynsS0vYzbGxQoT zE4cLu`Kb8zx1W{MvzTWaPj6i1vAo_KfB(AtBMN}ECPo<341Dt&pa_qMqtG_37 zWWxrTQ7e{nxmI!u7JKpA?@YyFk?OJ|$zy?H0&7)_v;n#XW6YRJ3>)o5Zd{NZFMYL( ziO1tAt+x!1jL{ly1%nY4XtNp_o z#*?0(j$}!O3uj^PmhC0R;sL02572bgsbWzhkPdefTk((3>^8JuqJk7U z6}tiRYSCKz#76cb!fiSb5wt7_rQ_&)2hsykHsrZjWpe)}{e^r`FK*Pqnt?Ub!?kQY z;(T2?2kpD5vl-W5;0 z%1ieX=CO@z-v+nvo|2qU9+6<(Q**w|XRj~+@cs1;Xp8{HZXhVh_zj8b-9LHCl9owmxlQ!>V)f%4Ou>lWgg{c~ar!^r zzB@>iCT>kYf(P5Z0N$>yu9E&$g^Ak~6et37KZ@JeG_=qC${ z6*2~@rA()SE7o+wW>H@`UQ=al2DDYIeoH|&-GR>1fyM8HKF^Ul0SM>Tjh{s)xGdjs z7DnN^UXwH5kq__s54E_843Pw~4LGG2Jh?8i^hK@3q=lx?;|C^@{S{|9dTEYDq+9cK zL;)nXWCjm0Hx55G=1gx{JP0av|JlyeKCkSwFSwrISKl@+Iw#r zR|hoIijLQMN5T$d8VpHBowGnZ$noG4Ii*Cn;vF0z#o?Iy;^^V}oeVif6|JH`JSXf_dlZ8q;gS)ae-`r5V!U+0;?I`7 z5r(vtc3pyP0kJaKt3HQtpZ&vWU1i{b`YMGW#BbYNhtL66&VPhNuu9gV;noZ7z|o7!hk_A#OH{%vW$$)-zE zTnr+y2x_Jw1clgc7Z8wyj6|p|&bt6EGe4pp9G%r%zv}OBFt)p|1dO=#E+3}e8XyJ& zA-R+8&S|?dW#RMn^#Ic+xK$r7NF1BVaw1o657qj(HdZ)Mx8d{&vue(J$q6?4Y*V>- zgU5p9eQKQQ-;93p3W#D^;}rWDJ_djn0d0vU?(F(kczcfQ_z)>%t42wI*Lck8_6fbJ zTaOGKRjXWxGaXuJ=@=+Cj+phXZTB#q>7L!}e3ikZ?G|*t?4%bb_DcgEQaA({vqw(w zRC=HpdMO^Kk)zrTn$pusAwsJnEnfSwYf4*Q1bG78i@;8beg}Umw(vVcuoV!1_C;!3PkJ#p01^ zfP~M7?mp0lCb~Rhbzxi(I^@N%lD7pZEdkJ!^nf@J0bGQUv6P$a0Po?gN=2id()38D zjANkX7P(=RMCX)9Vk)4ju*x=(G3NmlsdSVN+o2-1LsYqM>Xw+s*$?PTB=wYtqlE%v zj#Y*IXWjov8PdoU=l37VX#Y@#@;^~V#M#F1pLEgwS$6TW2#01{ArfB+8Kj;}L8^(C zhn(JAvix_Zz{bXzBBM2_bH??RiEB%Q>^E^PUB+4Ef$vWQ!l&sMB27>CocY7y%0Sx7 z;|p>Jyvc4P*Yv{}$YJc8{hnxPEI4#Xm{L{ei|Oqho6bc`=8Eo*N?4#x)3i!=iY2Xc z8dsutP#!PYkyg#-N4LYz{yMLGm0@--dG^-tQ!(;a4%Z7`# ze(x$d#ds~6npot-lvuI}2qT4D&Gd0&F|EE7=;6N>i8(W}kclS|-_ptx7MMQ>EAg={2^AFJsssyp9nbvRp669sD&nDc@@kQqH2eM5>B) zYHV{Ru~E)*6sj5Z>4!mJKMW%NPYjYax3SiD`|o$xzqV%}XGw3d(UVhC z7kf1&74a#;9t}WH6fsE`irEZ^A|@*~*{kRid0KxVXvlmK%LwE5XX6FCT?Qcz{gT|- z#+c1?pWVRY?ezk>1O7yHAWJ9H9LqD(M|+j#qPvgNFE)pZ@x1=Xb8%ua%W}a`i_~ww zsU$n0xN&4fP~S6*=_foFudG(ipg)zmeqv2DUBf?_vuPT?G_GB-cBVN73EA>jV(^)X ztG;^0i0a@)T=J(*HY44U3)1Fs3RiFR4(;^Dm54qqLg-CK5FCFQv|sk-#pqP#g^yr? zWOE9}%oaPoZ!}fnbx|z1r`fN6QszjJH$R_ys1zDrK=Q^AfAH=Xya`teVlMt-Q&t>% z5fF329UiD`Ip0)rng!zjC8_vF(=4xqTIqoP2oBqoC-ZqjRzMV6a{K9Hx0^fXj-2)Y za|Qk7sr|x%x#mSF3D_TR#9#?Ri0$%y3c;TzZH=;^fYRlgk$vz2Z+6CxFe{DYt+dQs zF|kAahdKOtLBt(6e*T(t@nC}fa-gXDlu&JAZtlNyiMty7RO5-^GNRL*4RR1i&1iW# z06rt8GNFumOD8UyE;7NB$_>!4G?;%^sh?3jce1$-vOqURt3^!n(vH?o>Ae75;%KD8wfo7ic zSzA|NTL7ZJD!!0jj(fsrOybI5vJc`-d{~|d!hw>{Lx66RP@In~Itv zKU?^XR$IF5iQNhG)adFaryt`JCYfPnj1A6aP`5u`dk<^OK)kQ#Htk0}8gxNEnpDB} zb`T$K{;@`*M6kGEKBGEl4lhJAl(CYBI2j&pa8QKhEph%eB~hRiee$@F6f>pv?ubAr zq5S(7rOEdHOFH|9InQE@w#49GVU5b<+=UfE=tR+J&`9)jf|^dbm-A`tp%D$P zFp{Mj>D6C6v9lwn7*vy!s1iqvQa0i6zku*A^8Cr_hvh*WuEkvG>w3fbh>ad!kRIez zSX!3BYl4ZEkE4F5ERlUK`xjpSkXl84;-dWdftKhe`ceOH@Y-72nOhkfsTeyr8N2a2 zIOx0oyBz)Rgv+Z9hWrnphMATlXt4WUO$+YJ5D_(9dpj%Wn-~$=^8igKcG2o5fX1_MrE4l=8 zt)_W1#prg0s<*uLn|AFv&n@nfW~fiA#}Q*4$6y!M#gLsfhgP&OsN3szZm~_{wwR># z23W{f&(Z>y;n>xUGkSx~8X7cI&QbwA?z7O0br-VvVIC+m-X7!N<^ZLN&6MF>b-vJxSb7OKbs zBB+n{{~^RJLiy`14jtL+!Rjf95Eqlo8)1nHWBnsNju+U-z^+Cx3$_{Pr$RqjDC4_N zmb6Du_YemnfC}Owh>EA?;R5*#NI(2Zz>0qou#IG338ngA;>@1}%(x1`3U<{lI}R(T zdV{6%shW7mZGWer$e9o*y3U@z!@rUA6JkBqNL?aDHnVoVJssBWlk|V)VH7w~D$hT1 zJvi9^y#N$4HgGnT(l;=+`Y-xqtNiN}8s!`GcQh03VI4YAN*bFrp%R@n(jjmyJ`@2V zUy9!b2|dOT{z!_*gjrBvC$0EKQD$eU^eeHpPr0WDcqw=3d$+In-=Ocg#V1eM349EM z)1}k9lWy1B&ewl^H2!|w?*259%)i730cNr?{;bXE87NY@*IR`T zBTiPs+Z5*6lS3M7lBEXaQKh6Zv6X@QSLR1t!{6)~=XVjMbYk*E&w}@xDtpNcpQ1ed zRSKSrmx&% z`w{6H5Hd3V^}A~b@PSl4NH2bCZZ4NHx$tNl;r_TP8CgDdJK>jC=`Vyy`B{9-m8=!U zYT4aWhHtmiK>b<}@G>?Q0jOKmq))+?(qQG7uc5`7O>EfRmsz7kZi=h|J&JhxQ9Qfd zKmi$|NKDGB)8BO0NN%`Im8Cd0F4?ZD)oXmBl}^i?AVqQ-v?>Y< z`AIId&Cn8Uzey1-d)s#6 z*R+o=yvUqQzDd&_Vj0f}A_ya|k(iJf2eqs#mvtgR07X~sUKmB!AU+{K=zN7N&Poh7 zAmR78f~#ckqO=gPb!*PE;5ZcW#jn>Uj}rVOG3Bbx5@JM*D$|rrB)~B-L4k%E!*zEa zxz)-{^&UBRo0Il%on4o41C8YlXOKXqHV?Px=IVxQ&eau`N*9^5w2d{pDM%QQ*;B~p zocV_0ibO_Js&xWsW?zl9WrX2TWUh8NkM$a*$>W5>46I1w#rVAg+S93qwX(N{nA$xQ zl-dh77~SQ22(N^%vo}ng)q7B#`Fm$C!BN(GYMk8>Zj{~mdu=b-(bs#R`=d~f96^cE z*t?P#yhBooorV8H*jE6>^(=ei8Z0jwB$Les$*C!_CYXTV5)v_52qo z^TUrXXz1iQ_LVc=$8n`2X80T-gl$I0)(_H!Y&eO%VtVykg*SN|M@tv+v>D6NKvLy! zmSrGi~tD;`vH6`(g_O>S>`?i@#Go(J|N2?0lc2yET+mY;e8NeRO^dxREVD z2nQzC(jyVu=MByN!Z$Tur_-u3)v(yx6IFv5;)#zGGU1?|op=6v>WoZ=@X@R(Ra}}A zj@Y0>5}Jkw2~^%<_-*{g!`fp=4H?Y(i?k-l-KtkQE9}ce?6r5<_8a#ki6ysR(jhg$ zgyIdMC3oysm~1@S4*dObic2it`y)Q3kC>*@%ba)pQl0_zHzBA-pE*Is2CFu_!9hq$ z3Nz$MQvQBJb=w&O0^cihNZuEC3AgPp>p^~K0k3FU-bj+qB3gu1mb;%=MJ}i)bZYq` z%}d@H9*b8zIEK5Ou`@O|4VE?yl4zLbmER(1MBWt6g!S=O#U1`|ajtYlP6cOEpWEd4 zZMAfB37HrV`m}T3aPm?GHQI7NUHIrsryiF?`KbA>Qoc|ZfP?6Ki)3oM=;b-l{|;nU zIfbfsjE~n#h#wazoM6>65qU~0$XqZ`!?gp z&aL)>n@^%rTL=jZvpo0~4Q74FRzt{E2$2lGI9oAInnsm=J^bnuIPk)|D1Tjz3eMWM zhJ4=)W-5{5M3?g=0o}!-T;w??z@UX9c9Rp9gkYcszpEXsh&~qRnCrYdLmwyHvhAV0 zwKH@_XD}odtdC!v29gk!awV08Uyv3J%1N z+}(3M9$ZO}7Fike#JetVW}C93BViT(iop~|?eZsH+l%suPwbE5aZihn%ySpqD8aQ)@@O^4rfGCS za00G>*PPoy5qd`Z)AhHQGZ5zPL+XpzImwSOSR3&_s8R^jt>2i#rjh@*r~58OFWVpR z(CY^5z4dPElE6;SaQNviWjS?J1b(C7X*k++weo^Hwk#S$Oc2RQUB@NJM)g%RxsS)fKn z>h_w;(U65m+^AA-qi6^!hkdUmY5UST?Am0O*KN1FrdwqTkwe&V1JCJI zJfUC9mOsVF_SS`VgkBEepc&`y&)-zdS`iz!{q=SZG%NO4Sz*(ya%;%9=VfeWNMWRm z=o_xjR2pZ+q7becX26Ja6C66F)neqP!}l=FZdThr6v(M#z14hB9u#m1PM zfTj4v?jo*KqNB`~?dgnQ~I{9(br^u`XnPhldCb z&qy1L4j=^3*p9CtcbxT3AIU|bF^Wbg&>XgL?-ZIf7me)=X9Xs%nvXrdPCCFy=?W_Nr_`K%#g+I4DVB zm4(HK-rN_=lLwSih(TfcYj5H!9Re-DKj4>~CH87;-Wef=F-L?fCF_*&=~w6D|AM{m ztr7A5*_qfDJc06mO$UmZI=EPf*t^=9IIEdD|HsCS2HRhl;JC_*Huc8|GqDi1xkB_} zy4>gi+`|32>q>DNC@M`D0^$<`GDNKpR)P@M$lQMv{~Pi?w1vg)+zQGze>2;VdYCjc z?1pxax`%MBcxoa3jzkY>_kDg)o}?LJ)NA_dSx1E7r=M-`uRrY3-8`>zZh5JuWdEF1 zad?o*P2;vDacuQUikupvG`E*42EQ}`%G@PNY}ZdQJM{Syf?K8VTMdcPOmQM}&CFQq z!l!)VX~QO^s<~Bow(U&n9d)}iqg+>uW*oL5bLArQiFDJHiAOu!Wl~8_olUSkJn28J zuMPann+${z&@~J9u38H&jFdp5+KIL>!bw3)zgS!N6SWFY#XLJ_7DDK%3IcCxKkJcF z14R2~$5nfP<@P~NNBw@fN~B=&N9{DwfqAEfso}FuXNuM!dpE&a; z{M=US+t?WEZ7|QyN{1iROK52?=A5ru=50qi2?W1MKRH87)vN(S9_-Yosx7)*xT^PS z-Tvd7uAbMiWV&q6!qqLG(i?*hl>gT@YJ{X0I8uXvs5yrGKQU@COD9uf7gg{|CR1T! zV^indh+J%Uf{L<^lv6#y_-Brs{-{c(L{qRuj9CCy6Y)jO7~T$+e_!Gk zv;6!cv{FwFx;FVqCWmQZZ4PLU14)@_0utY{hFzwU?~IW^o&eS1Gl`;rF?K+EB1pju z4g@kWiwDV@p#hwS#!%c3Agj&0%oU$L>5lw8G7la3!3^+v6?omMqUM~A^^vZIg`D)w zdOtpdG{H&WiIXD-iJRagZfmk9YKxfBf=o?xh8U=w(Lovj`k{t+OX~WBF**Q|3Gc8= zytcd<3Mgo}g3=iQBsxqeao_-ujN?fdQ#OgAa{dG|9wwADBLeLXX9yjL0jT47Kx4Ef z3Y5+|JRO%>ue7B!U64Bqg5ZbvrQnJ4D#M1~g2n`g`9Cqwy0O{yCr6X(`SMa*8@@*$z9{9w7u>OQHphdt z<@y7K+Lk1RFI2VP4qOf=(zz`kLlTR}vYK^|`nEscM%!CjAE$j~Ei{|T`g|*AWp4%4 zdbk5N9e~O;8LTc+7h6iOy>5z{neA-W>ud8ve69He^hb4gDLEZHy#{BtE8&?9S9m*o zOr5`cY{4b!@}}Xsjh|bcS!K1jJ35;m#(bvNUg0fmENrc`Hqz9T9L*aZmnG0_{^>Z7 zl?Df;Bw+5Ut2r8RAfU^u>kzvfO%zR^)}F>k)zsKXUWy|{R%_7qKfxVeiy28lv^lUzJ^z0%Vd5Mjn*6sZ6VW5c8JG;5) z2SLCHD+yh>WolQ4qx|kw6YydCzVbX;zrD(!uAtRel2@=MFk2wVnzk}dEB?OqiuF$0 zdn#%mIW4cNbT)leV>jZgbT(xQq#j9&P-YbkkBd^#~b*Z(!+~^4_NY2-gn3r%l{MlMeJ;{rwQ3-yaNK1TyksfsLq+5> zeN7vVePrlTtd8YZ?O!0=o1ocjH#104RXx2VS6FXA!W-UlZO8Y6-Z1`hIGvZ`9?D+}Ek>i^K3t?%kCtkt<_ zrw}V(Ntab9L=@P8V&c6F%M-`&om1b|<|FSMQ!v`H>Y3~KzxCDq z!bCxWw=&8qE!06!QB7~Zd)$4Uwf+;sQ1h)&Q$7msVA8G9A+8giK8jlGWzwZ{+N(2~ zI@Mc~Sa>!SJ4KxDXty8sru|My06s~kvRa85y!Q4aKKZ9gG~&~^YY+Z7{R$uIHV54Z z;&XWYs)xbZBkGOUF;4va=r5hZu!2U@`OnenCI0HNJi2s@ymTd7n&NAgyvalonKM>m zJ$Er4bp(75#FbGAfn7SvBt&TvoJhpyQ8#HNka+u^0%>s0!z?O3V|9Pfs!gYJGK)qF z^Rd?D$LULhFRVT4u9r`YJv1l;Pm`j)9h-Xq6KzzCQz~V1ei!|kQkW-?P>~}f7%_O& z&bG(OUwLVe;;@+kj7)F7uqP5PEMH2gM&}BbPh76dEQra+2cTdA6RVGfli;m5VWvvV~gL&@whrdPtA^|4$hib2H zo%#vTruS7IQKt?C>3Y%ZX@%nA&y*ttt~r57+gL4qHFGcJBL%Am%aG-hxS#4Cd!*3l>G`=U-X>AO^c^9b zuk>WhES`D%C)0rRd}UR;@H8jcxukiPb4*a3DP<+y18rx1=I2)l##;Nie+~;6{4>0P zk}L4LQmfwy@i`nC@;iY|3YPg3D2=myTxHa=Gb*>Oc6EuIagk`4nhKKxgdDHWioXqo6-HePgGT%gU?@@Rlla>P1MV?whG*P`*Jsc=Yx zJaMPGLoAfLjCKu-=q_EZ;=CiN`&&^{i+4XJTy=`tiyN(Zg(rGhQ{QW@TlwXM)@Ikw z8c{X(X*=a^_&Pf=zQ|4O2<1Ne6JQ(^xLm8?oPRg{f~`ug@sr){CnuM-3)@|UBY$Uz z@7Vsi&}-j`5k(PEv*LHLD42%b+zSwBXRI0dqAYS<4s9%|KC5d|X z-Hm`UrdkCh9SsI`Or&fRb?mYzSCJ%&6C+AxT()qG+Jq^Ek|w!7M`G}YVu~db!XmB; zp9!|V<|^^yW!l=AfZMr*cAu`>$A+7!SMkHQ7WNU=bma6ry(N>DxT&S}>7CT^5P4-L zo6pJKS*NA3e@*7TKKc5|_cmCftc)U+V=5tP#J=KOLzmE0Tm(CHkOX#D>4A6N#-q<2 zHG3+=*u}ofG<>tLj5amx_b%)TT+iwJs40cx3f^Ekr6F}8vkWsxT+M)%nLXQ_4(3&w zeR_qc687kW9Z=|+`IR4^TsK4?jS?R5D<62NX3kzUSBs!7%=n-(?+`csYHmnQ(hIGC zjJu;Pj4o}HYTG|S6))svJ^M$gR=_)Dg)pD`qqSP2E`s~VHiJp8bk1< zE4fzT$kZ>el%YYch^Iq>NLN+cM*ux((B;%1SgWO=mTaR5|n?Y1f$*o^z(3tU0)W# z&Q1JvWG|pOqS|VohvW@xx(EuYb8EldI76EY99|o@=aQq8Fx1DUd`3GZ{8N~A3JD}} zn*@aH@3BT|3|O_lq9Q_!)a0oz&TABmwX;hbH!b!=Mzrb}n#1$h)pdQ$v5fjvqLO+(mYItl znscG>Rz1XA`X&LRu9As|Jl@wxi4_C(nU6f>CfsoH_q+#v*HA!QSIk7jO881*gYvH#x&o;-Sx`C?s%v_OWcQtyJKbbO|)N}p3q-(h* z{KAs~*=%x$$m<@M?QI0O%(~NS3#MvbC8M`&z~D)d)duAZnp)DBL?qk|TlCg)?OmRH zQ_7X%?awj-cyy93l8&VpsEK?8Xbb9=B@#b88rYJYlJY4R^r^jpXjMmh9C&FqpR0b0 z1%hVRO6>KlE3MWM7b;I^sPF0oNyUCyD^v%KqnKN{SP-#cH$j@=8mw#|M~7Lsl-W#{ z+Uu>^lyIa4s%qi`h@e{p()rrb78TBpEcnINGy1_1peS6!z*az$+fj^$1Yzb(Lqls< zqhsm${u>eK!eXz}e1;-OV|DJ(l6=L5`YxKA)MzdJqGC$w$Z{ppZJqM|TsGSLF_Qa- z9owJE(%Rm>jujD3*EHY-g{|IW*Gc8;ior}ydlAjuXAR~G4Z&%HK7v>^ExkM{!U*Hr zkhWbN*{^>T-!jX(Cam1%+KXy^rf-xYd%S_;L=BGD9H_vfjtZ+gP1!5jDCD znA}GV>%@)+!ri-x9&ss>^6UNlt#|*l_A3)5G%*VII{j$CsJ!&ZjUCTz?u*+Md!NZC zj*zR#(4p-6c){mJ9bkb0{>yaEU*+n*zpIt`DCeP9IJ-pz3v}dJjAEZNJZFisd}DlB z>eH0=s^D&`Ja3rV`x*+p8sqnmd!#^z zA3_dtV*6yW7CpoXv%i1moaW}%?Z&(AAfaR+Ztfb-qh)aPIPqyDY~&Sgzjug`i3B4l zHqRKmVg_!1ch6P$+5N>M(A!AqoA$Rqmzmgi6QL?Mv@VzRh$Ef=+&I#(p%nCffh4`T zEjhLk>WO9b@tH;(1Ensx7X}(bg++bosXh!@0l*|>n`sC4VT|ucv2?3{3pB+;wkRcN zUS^WqT}X>`l64a#Z6<53thu=;eSCg#f4sRkf4soFyExTHPZFfA?aD*;D_(tr&1V4s z@X_!|z~BNTK$w!PWG|lftEw0n&%y^G0g_G1hVJs|Y2vVuC`=JR=RgdZx%|y`nj`%)TO^tDlMAz#Rtg%|?c#>eG0;gsq04t|rM6UG zriUh&!qNH4eG^o&Ss62Nr8a$mDT$)YF&RL4;LQ6;04gBUq;04IRVH>O+CV9`iqx3} z)M$c=C}Tf09Xsq@n&o7n^dhm&%Ruv9U`M2IfB=w8;Gv^=FC^wp8)G$zp>)<$LM?&6 zYS}ZEWg=58y5Rdp^H`KUZ}Jk4FI5B_a{#!SG*Q<>gNTOD#LUbAn8R|EvqEOPAZ?R_ zIFOfCVT{;9;ccmVj4y%o0A31DMD2@X`3?Zaik>ym3%o!GpSgV1j81eo>ML6U7(g^0j`Kx2E|w!>3;9G_ zDn~9VLsw8x2M=mBky0?V2Sg4NikV@9W`{Clr6%(OE4%X>0ZQ-)xc>DxjDyN*FZtu{ zNm{;75gwzwD`*;;Ni>}LeXo8cf!vnOw242nWu5IU&~C~I^!wGgG{|c5JVHt|fD20< zIyeXyq0bnrR}X`f5@obN3-RN{87orWhs)<}>xr>F?~SV_b18vr6+m z^V1^$-@jiPrHj(B7igM3y9c*7orpLR<9|VK$@dT^r^{oHS>*E=sk$wO%2+BMP!Hhg zdA?IA|0R-7_r`B2uN7>i$yb)oD7%`LUer8W>4ee#1MkFE#`-Khgpx{{dcrQplR0Cv zr7pyP^LoJ$p^xQM^7jYaGY&Q?|0%*)sPx)>&{+AsT;{h@N7LOr-~zA;Xr@zK>=vau zq(3{P-$hW#s{DP2!Q@3>X&*}-scF|5?>i`kT z08x?bT>8<9xenQj07{X-eUX3_Z{B`+;pdO_?@#*nPn8DQ%K6>Acjcrznm&EZ_iaMa z7jX}woidwxa|zK)rj8n&9x0wFYeSsn{atX8KKD4UWJ;6st!e^s8st^G=_dw)u_?Qi)#SF{++5CRKF4q-H z`?@yHk9N)W7=W@xW9-I))~>peGNCe=j3f2RN>wQPDhvNLGsK&O6SdDTI&+4MP}{}} zrt-&`yrjGr?S%*)Dg<(y;1=|?5Qxdz$r?>$I3<5*S_FG8U# z6WB9a)H10~EgiVDDEmgKQOE9}7Jikud>UXcjZSYmJw%B-^c+)V6fBJoJu)6-CxQ?& z%EKOGOpx+ncb0UxLz>qVIQKlQloBj{utM7<%(5?tgqMO*55xzZ$wbj8&=hY;-ODd;@;PBP!S>k5mc!)&u=Za@d zkttflQ-f_VojpXxn_wJ|sT~RV$fB%Sk%+k;&J{I7^>Id@{}?%;h4llIg8Sub_lBC| zjOq54D#P}*vOn|K#ZXEHgb=oi#vBVU4BjLSIm$BdATjQx!t$6s))1B_Fv3RwbqiPB zr=8ke!l*{E8G;TA`#rUhW@TnQwpC29%$SoLy_|mlOHvSjM1-*Pi=-Nn%GIJ5X|<_h z7NyGW?dmRC{K0Y#pLxQ;W;@o)n-FTIjG%V63)3l+Nf9ah^v3v0t(0b6BoCIsa7B?? zIUue?NJ{N11s(clY=m&6U@=&cJSftC$o?tc%EZp4=L& zOHuRMjmwklb7zc7=91Wx7m9TXD{Iy1YLqN#)pUUD$v`l{%cxwx^s0k_ive>{Agxc`## znwKwqL(N#cM>yOc-hP`r%9v&3{wLBNn4m5&fe(5l*FoM_re?%4*)o;*FwZOD8x>c^ z-7#bkpo(Zi$t!7}{eeumapE?nGWm^{*mZ`Nb=a9n&m${xL0T#cic~Qmu2^VjR<$zG zZg@AxRmCcI3Kk&;IT1%lSEV#A2q;|?B9bDME1Os}^`b_%m!rPZtaOA#<6=64rIRHS zLf9Zxag$q~JH;WbYM~y1B@*z^atD*RmXco8_SYeuy0ExmwZ#(+!(R83o41ZX{n`6evc?SG3)R?2DbpW(ceyzP+88j98&*e|32Eu`0M6iosx3CP*zSB z6BLgwj8hZBo(*vh61e1Hoj9u{-FeofyPh(NSG~jQ-3^SVk#O$#VbpQN4Um!0YCj$S zAPULJLC3-h3=~mPLO?d)+F- z0(Dw{`2)in4nr1Xq0(huI|AdSE~D_iLkO?FyN%$R=vl*5qF{YKWG%rekeN zSYmA4gPsexu6w%2kqZ4<@s_X5xFk6{V8`rb|B4UR& zu65~X@O3c{$uGHGYhG(}N`&x4^{m}8!*HG9UJynNav>Il63>SFZ+TrskxSvDw$O|J zz6?nn(lPmhBG?Anxm0>1V)UWYON-3!i=@LahW%R`_*W~sJ1jb3BYp$+7UBz4r{u)G z%pTjZ{n`q>bb_I$p;67>0bBesk-*0=y)rAxBDJe?$uxVxCZdYnX|#n>&Xi_noqzS=go&zgIn8N`+Dci545g#*sgc%jaQVecj&J7 zf9JDXtM{u>_JS#0TV3xeFEY31(?ZfmGV`R-g~a2noiYOaAFp55=)FLS54AZN12TIq z3NA@${yCa-N68W1rAe6TPdKpc)J{|Rz8$&gHsM)^)rEg8zWx2ISJLbO<^63!^@OzA z>-R5W%j87GeYKO_$%bw$Mi|eMcdlq~$16KKbStdUdlIKYG&C>nX)povY@_k@u!fE& zWq#<{hWle-`!dD}64!)l?+msg0ke?7D=^ONKZz7h8T}-#FjB>nqF~E)HV5 zzV%YwYW6yD{Zs>jtspiyf)n~1slEVSEyqI7A5q*bGJV1&r_E{|`}E1a3oCPlZ$8=C z_WJparLrC<)S33myOcdVB%tj;=P^z*er74Zz+YwVi^3gWvF#+TBcO0bqJMZ!$67Lu@zAh5!SXcSF zQD!U3kJaoa<#)65z?^hc_RFna&cGkdQD>+yYgcvowE@nHZbDI$FL=*CBNz6! zQKcvi+ZJpW-Uobzz04N#cx z0sR}+2KyqwUzQZ}Yl}EBas~YETO)4;WB|w48aS8*{~iK}g)f)^>JznzO>j$|l z?20~$z~HYlCGIA<6NBe2{=TS4=G5Y2h7pe?#oM!AaKW;1!W&v4!AEjsBZ4^j`MXYWDW3;nu3*_Ub11ti9Pwdj1)F zu*wU5*dpKlbZa&K>fGY#=PShmHjN_jF`XhYkzZCtRFM5(Z!_QTX3VWs{jF8Rt8=ES z^FA#Prx9;Hx(~WN3r2<}H;s_B4Llq+bR0GeoO%o#uNImzXzKOet*+MVNQ-XkKaY~@&(O37s~g&hIBd$K|~O;)v=z z9XpId30W7{0G5vE#P=HSX}ThjS^CcOzjdVIdAYTnM=8Yl{ur5}g@w$g=?akGC@ic2 zhNlsE+B~&T%Q>1o4N$4A?Ld3ncup1PKX@t@)=oTlGAde46LwjK9Np1Ie>5Iw#Et~y znRf8z>u(Hir|I(Hh492+)1Ka`QiiY$>p0UZgzq3`WoC?7aY?(7jcO{)Oj_Z7rnDZf z%t{20F9(;?bg4oV#L+W>4PWcPx0ed<*^DzL%9x83)+ZDtfZ38(AO7d2rtBA4!L?)@^N&k_)DDEHWkvbtl4CK;8{*hjk6w9Jr zr>YhE_TXRRL1|#Q8s!~lD4#-;9=Hb7@7=^!RCkPbPdMY?JjA}bxq&&In6>Td(-s5kh1fPdFxR`%&{SQOuABX%2hCbyhTuZkF|T|qxxbh3sxm*3f8j^E_26gd-8Bv&_DdL?S8(PCwJv@dbnsBZy*8=SQ^YC1GO72? z($k3S7QJ?BptesZ(rj-(SUsK?aFAztY5LT~7-sMFyE$2!Sd*`J9e;@;bh|#a=bPi6ax@3COY0faHbwmk z6KHTx-E|+Y)Q`HZ`LdG>nQ#{4o=R-aFQ)H2D$lP(%(8f&rrYjfKF&C46PF$2o*L<% z8s@%)dCh`$T|>R|gBkp`re*ik;;L54Nwd{(5vrha6wZWIV^IL~FbLW!ANE z+=AQ8%2rbqJ65DIDsV#v!kRfPtjR<;sT5c#fLl0XGZtwx11zaIxGKs-CXT_CbB!A4 zUP+5S305q%@Ix1HvvNO2w>L%Vs|PnU^&K8ChZF|XeWx-3?qDq{6atSWyvnTYhP_(B z+M$^r6;=zF+p;c)X<3Q|*_U+xt^?}cP0CmFIJ2QO(%G(z^5~Rck3<$s z-Qk@CC6aq3+qTKLmggup?-;d8pGtTVG#4&?X-vLPW8GuY;Q4`YsdAT;Y@Jzq_luPjI-aTlnpSU&egC0;tUOg#Mwq>EXgB`?xmj6lVZBw9`0m4MXYM)OjP? zZq>Xi+OGjLE++XRr{%M!5jPQC(&X`>91w|Had{HEV$A~-$L#WGx~vww8^sI=Mm2{} zslNE!D?XiIJe{yUojAgG>Flp)dJl(~Iz>)sT2dL#hj@$QwN^`9A^@Xr-uIl|_o&|Y zb~c8?^lPtWC`T*%$;v*Bxjdpn+7ez>~6mKYToT?9_?yA7Nd)oE8gRKaU{Qk&YH&-^VPil)%@kvJjvC( z;eY3woE}@P(s$}92j%lIH$CepT{kbF$@Bq02c*WzSo&mHXNb+$kAqE*f7gMhG> zA?V`4ba+qr9!-v``L9o9I9&u#hVy?kMYqaxIX%A5c*A0&ikm9mPs0=_o(^x;B8v9mQs9kr%lq(xBhO~ZK4kdpXOC;zm90S4{aN-KWCxOO zWYH36>-`UeBVG-UfQXu4Q;(Dr2~^Y3V%Y;y`$daPgykFjI8n!^cv{ijH@RnqgS+(3 zwob{uHL(?QYv|Gm$0oUxje$QU(6v+He=IoY@2bM_q_7i29}QAprOZ%qY9pm%fYJh* z-Z)0XL>V{ZihIxn#cu$}>`M{|$%=^(jx17`W9<{^; z@jBnrg|So}9U@Rm0+r0{%t7PW{RB_xY5yJa(hPXI{)euEtJZfzS82699HoDAdPCP1 zjxzMA_)IkCWqlE)tWzbVjb?_`@_s!w>K%nJ^>05bUnbVMxJGC#!QM{mk zWyXmrKFh3d!`x+*EEzF=Bv{H+qyRvw0zxm9`=v%DMu$n3e0`Gap zg>elkQaZF0l~@THNYeBn1^*^fqBUOl+%~<6s7P((%TWM-4gObQ|ECTpe8&6LX^D#2u{hHk1Fd8$ z0&)QD8>{etfEKXWumQ2~0pU%t*e`EPNM-1@KEl{}mCPkZ zkFzbLvQ?eZ)+y@@E2gInKeY`vnCSP;>uefE>284brtrsK%ql}eLCnZw_1aS@y)xd< z6)T!K)~WZ{pYQ&ilI^Ft#$*UN$6T;1H_peu<|m}W^HUfQ^gK+*oe-&wy>)#iYGV&z zlFyOFJeu*pkQnTY^;A-N(qNqI9GA{&|AWxLHTtMdX%ju^t`o@$&q`U;=$?MNkSATx zRWY}yn0<&8@7dIt`rT5FV`#N;VTY(zH_}!@9SY6givH!UB(*>_a?+xal6Q3Gw_g^&P>{8fY-nVBo;>b6+ ziIMUf7$OX^&NFFPv)a{BJ#JJs;xzNxGFGwQWCr79XPjB0u z3_8p^NGMq_Qj`|`;he3Zv`$i0y0G&;p%Y29f~>4Wbd;A9 zQQWxXQ@6JQ->|R~1ip|77A~c>u?4HL-_(M!DW`EMVqpi#$68qmUDKMCO4o|V;guFE?Ck@S8+}s$puNG3Yr~m{Ot+uO;@yk{Qp^7VupHKJ771CNW zP8u-J@Fsr^9vHEF4dQ7CffK3RplJUIh#WS^BO3@_YEmSDB1q4*coFMpeFj*NH?y;qYWIl-`6G%PmAocA+=* z2%q0Gj{rrRpM`CYfP-I`f%fwEy`VwS@Es&%yv16E&3j(FWhe>G$%Us>7SvvT7KKGz z=OBy$WP+$?f++7m$0LoOsfXx7w2gsvp#A5jqntftnrDA7#J0wZO2e!p%tNTu0Yf>9 zG{WfbRL+=m?9 z=dB*9zL7lScy`5T^R?wRwkH^O@6bslG7Y|E5qTux%zX`gfGHIwyhrq8tCP4+djl#- zgv3w&D5>R3QXJ$I_P`q9H_Mkph#=^@$my^}6pz+-6$2uUB>LYZLDQV-i#(@LCXtIM zz2PWj!6qFN3Ta<_9^nHj%`K@9!l&hQAkZ-L_}7i_U>~-a-gJAs4-5kK&@3|8NT7j4%Rbi$r9u%$ zc+^rPR&g3o=!P}FL|4?s8#>*jvPCX6etP3+;%r~}K%&1O@pnMP30%2ZsgU`c{W(7Uk&!24)vtHIKvf*xdwVhbf{B{LuiD&LG2%<@Ya}- zTAmtz`<~H+z&YNElQkS1P%eGl-#0NkHcun52V9EQ;@1`r-L_V{=U21?N-Em0;Q%3$PRQ8$RG zL8R%#)FD&WeGt6y17V#9EH?UBPV{iyG>^Suo2B29 zGruc*7__T(mzkW&lB+%oe<;g}cL&#%tC3;8Nh>&4KvcT?6&#(kU(F!#IG(&=j=`=` z+}C{O8bsojxpJ!8qy zcrGwEe^F6=XGR&{gc>JAk&lTOa4v~BG$GFdF{}#8hEYpy4P&@Ft?m5gA&ezk-o9=u zb5~&9S;lmKkl`lQ?#*A?zP5VFu+UDgc(Df zvprnXyE}i!GyCgMYKw<%+dWW*YA~_T#M=E~@#VKtJjqDDb~>CZ5Mv6l1S6~D^m-iI z-w8HHk5Y12o&JWuCO-xZNi;DwD(ada#k5Pv!#@8DErO7ig5c0cq*t0&!*Tj zhRJdZGuCm@!!Y$7XC?d?E!-mpWB(cbHgNBkc0n#f6ZS0b=UYAUu~E_k>|u<0u^?@N zF9#kHsf$ntMSDFAv)_TM&uh3h&z|HX>07tyiMzK*D5lk^G?QF;9mq773aBG8D5mzh zDe$69-8~4m!YyyPdo3L@LCe&fW604gB=BR@3DEVt|3%qb0LRfJ4Vz+SW?5iK7Be$j z%*<#pGg-`NF@puxh#4$q#t}0!Gv2)a?p@q|Uu;}lM8`}|=TuDhbXI0nWoJGb63Z{< ztAAP=s`rZ*4hb30OR*i_?WoIMKo5Q}vASkI8CnW{64Lj5;?Ui7Rp#Ye^YC*!VXFOM zCdxM^JwkdNkUS#=dkydYV5td6;y;r?u0frxS>(;a^NmD*UF`lKHTr~E>XI+K00nG} zG%LPna(I%S3a-JVlf*t0t z4rFg@V%SOPosK(^SOt7t%D-3lQ|FulXJMolKU^mpf zYSl@+O+VE-ezeN^)I`*I4!ucrODC3WxL~y;#oOoKitZC&L<)As(Je^hwdCc`Bhx3i zvdrcdivH@}EeNqB1@T%&d7|*V|4^0thpz2fE_Q&817&JH&a-52HzV_>r8R%A>y&okMbGBF5zC@KW3`PB8ro-h9 zr3-*0AK$>4nz4{Oj3Sg9e^FSFfd}Yw2u7bGNXsS-6> zts9g(omY7=y~)c2KcXCNK%U7>)@B`8T^;mmJUq^9Reoam)=E>7vYa2M^2Yc$u8`nhrFs!Fh#xbqT56HSC~pq zBb0)mdhoCO$gjSZOAhQN0pLr9P!DN=?0f!PEBfN4?JP%iv31s=LCo5ZlLL8Uz5~J{U-ipg{5EP z?~T5Su)znXBtzF)r?4E(Bn&-9s{>rw#G*0QNGDlPVj(y1%upgE21|;#>%IKxA4DuSS6!g@@Aah;>^Cq^jUT7{VWL=tLhQaTz` zPsLLC#JkK%g<#yQWPgZKe(1+(#2G6SRxi{L75mwW(vYV87(GqiZG^JZKyXQH^2Z9= z=A>>>T3`sp%t_Xu=HWTs)1sc)^^5xTO96;5G)IIT*NlfaG(khuobUJ-KXjJ?J#_at zlAdVFQJH%K!(-bM7GbDeiF+fq*NF~c$VZvmUSivm31R5f7S#He7I*HS=M#FV&9PSC z5kP7SAhit`+6GXYywbirI@9|}Y>p{Ux?gu>>+ZfAD7>&;0bQNE{W_M| ziQvaX{il;x%0@5ew8F_PYew6lPx~{denVpSq$6T53m=Ld|zRGU#Wegr4RzbcP@{>qVE_y?dUo?v|2-6A5`{P(tgpU#s!;9}Ce8bPQVe|s+RuBhP_|)` zYVhu*rr$YYTAcO(7w~Eo&VNjMiF)&+x9EUz4iw^ti(D{8*k(d|LWKH&Ko+u_dDA3i zuo}*II?sq{s8Cs9ojK^I)uhp^`@v8!3^iN)byR)jmsbdVQr%=v;P{VzxY^$cYgLWBsM+Ubo4$nt@ii)D0P^ZqtWpV6Xo~~mFPO~*(dEt zXO28=dE-dlOVWyd%t{w?XvZeHMXjB`iy^myaku^ylONqYVBD|}mdK6^5Qj#(*@U}2 z%i!7ioZf<4YE#?Yt;CLTV3WLCM9|qqnAL{_gaV|l<%cNUJSf~AP?Oi)JmB0O3V(Ag zX&0@z7k4qd7hasRQDd*mgroUGk`15)?f1EHYnuolg`@^sw>6d41O#B& zhy%9bpv|O_%&CH=gi*6 zF_8qPP#C)xc&Orp^w0RDU5v$BQH#mfaC0ESk80}B0*JP80=$B7-2I$vV*4m zEW2+C^fN?bqh4R>AQU??q$D!poXqn^X)G-X3^rGY4J}!S}1x=IP ziGK@_%;thwDF!uAQ_HW&ua-14_tTx%OIj(0H&_aZ3Py)ul(ncsW+{kJ5V{~);e z@QZf*z&hcDa}x+@0~fUmQ_}SoFO&a+brRMms4WLAN$N3GtpU5qy#%y6=(tvQUI}$`Wx8Rrg7)Z}v%6 zYdw&3(rEJiUZ?iAx9@$AnQ!|zCBRL8Irat}~fkyJ!(wl^ozE z@Q=`Y%O>I8ZTJPo%nz}yGv^;6Pa zte__qi>NF)rs$3<9r4pfER()HbX&BaR4@5Ps&=h1+%Lw?cR}A@3cvd(eWK3?oN(UD zj}&wQ8Sc4a<^!PbH-+Clls+-%KS2WIkplmC-4h3bGRt9l1~Fr8d=ia>ZBswixAl@v z7X10m8ZV!l)a~;~>e1C-F-VT6K|WM1mbJ4nL>f7Xr#t5(S&_azH#k~;wznmxc5HO3 zT>AK-M(R)+14il)8s>+mh9T{vbwydIXkalX$_K~bn6^2tSETwMDHjbU z9V>4-pCRcAt_bx&EmAaqg*pDa)@RH|8`o7W0o-8}3YNy zWb0JYc{`3RDN4QH)UZ3+(n8R=Q4KLfQ(w2cXSOZZJ)G{%x#H+M!D@gFsXbxua;Fd# zD6^Y&Tpj=A1MmE^nT3r2ezK_Bi=8{(IGAnlMDUDL{EC?T2?gCZJOZVXtnisj-1P@C zdR{XTxu642h@~N@6V+9_c1rAX_?gv`F4FcT`w?esivrT!GCaLo{Z&XJ46jjRqT<7M z_(ZPZm3(n&1X-Y?999mn1DO2>gxF~Xp`#YXuKy_g1&>mc4csAY@){tGGQ5tDiJA)8 zsn371r4fXUnvw@enwNQ#<#&caeUO4@~={>rTC;lGH?S)a+P}CJaF;`ShLXbZVv#+E*vaeca;E5eYsk5h{sVf38Q561Qa(;9< z1`#Qdm=`GiEoaD}y$E4yNR?|_NrG=S?qnbJ$1@Wmsv`wojyLIGi(6$h*hZa4Ux?*;zD04@_3q`$IS zZiB@yxtL>@^@EF~X75YKoSHw?6XgS@7a1i5E%o3vGy{P!HEjeHoI$|GDlMK%)TogY z-x^v~l6tdyQZ~S=XvK$(nH!|mI-EvUk2Rv!IuaDjV z>poGaX+x~IfC2b)pBQLXU=RfYInkdgv*3KuDo7vz;XNm$M)z=90w+=GK@>H4vDKX} zb3SjBS_04-iorlOqkAGPfxPmy9flf$AG?6d^*fR-B#r8yK!DLbfmR2&hC>N$b3W=0 zaAgliC|!H`5a;qIu-)jMM5_Z;gY+jb{M#tQUXKyS8WluPDqn}qJ5r#mu*77?ODE(uoe#s+1HYx1p(3%v}S zzZDtbl$i(Xpp@;`2KM;AXG4q7Vc*7AEDza!@SG!tge~00n^^zI4#1)h3;Q}{_tcQlbOON=`nUG~ALx^KxbBE6-9+C-`{{3#JOh(l$gc1Z(KC zap4VoA}cv$=ZxQfEr5Rhw~URz#e87Hpi^njNP;`U@5=Coc9E5^-``JtKa^F98%cal zgmre8=C+We`7mcEgBpBLfZG4+ZN6*3eNFL+HCiEx#Mf}g#qOA`+I%L6~@?gc18{`|;EH3?kR?h%j zU!00uNWfvw33QD&e1(C+KH;7==WYClJJ%=86K_NZxQRp1l5Pe46B9ey#>~`kN7~SDZk}{E|00_ zna=TpAp3I+2DWQv3JcA*IptYu{cYqyq__-q_dYza5G^O;GhDCD$ z(z0@_=InqyIj7yXqAgOTH$|EcTsmQuV7B7_C6-f@V)dh^n?oI#EAadR9mNN_O#}mv zb)eH6xt|G5bSe~Mj)oRXsUSfaV~ zDEAfUR)l_92kQji@_>ChM&Ft`XW7?WrO7)`dtL_Xg6*CHe`*C2BHem)1rtOcB`xCr z6X?(_rWoImC#d|jn6MKjvz6)AoN?OEriZDwhe`N(zexFH1f{X);Erb@_`LXM^dFuK z#KdLdi18})jCFF2%;o-awk!(XpQ46UGj3ob1&R*sgtnx&bcyU7hrXwiyx;l;ln%#n zYIIOEU<1|Zv>F4|+vzmc_35RX)53TSK^8xs(9kVN9apOo2Ebv|h*N>`J+b-;(&$zj z>DydvbsQLgqUVIBhL@ls4jQnlvQIbqi?Q)SE2U1)wZbA7PJ=oSIAY|6pp^roQ95J- z3`XP|LDda7k{oq^D##kIPn^pQ&VJC_YdEY;8oy1PGf22XT_65z_?V7O-n|mz%18q{ zEbjKgcQioB)`U1zhyR?8eJhL2ZB@8mgUeooIHcP8i^A;yHc1GY0`78pAMgNgEw=tb zb2~s!uKv75+4{?N?JZc$U%bsv0zXYL8@@ZPX#-*Pmr9BAsi*Rcd5SEUP6?NWS!3-I zeAXxMPVkH0Pjz#_G63uyy5ZYNaL@zH$KU(Jy#1*xLm%*B0PJ4IDR^7y8H@m8&_{#n zkpZ@M0s4y&_&d6A0M;}q>>agjfrAY5ou!^A6RT(d%yb^~-67aJv~a)-&Py1SSir(J z*F1!dCAfEW;Q-`mL)bem@OK8?BSK7scaD7?TDG%er zW>NWr{@zYwvLS|kD;SlIsUQ)BfA`)Gd+~DJT`F4Kt5t?2E>`^tMeK0WQNn)- z(V;0}Xd(XjZ8`wvE)ViOP53hf@-7P_=mYxkXe{=q3;e|)@PjY^6Z|N^^{2m>=ycZ+ zM2Dh;p|SWU;`ArNT^IN}sqkkh8+jX8#|RGpqa!+R(y=aCZ{Ih7fnf-#ve*-z}ipsof2Ra{_RuH6i>Q@-HFp zfd3X$a(HKjbJ~DSqe8t9(RICKeuV@7eH_EfWG+NEdbqe z`YS}Ywr71YV%4Vdk$r1}xTO^GQEn?Yg>ub6nNmX1LkMv65srSZm!Atee;eq{B>uR8 zQs|?~RrKnc|A083X#Ln6XODUD{?jL5OAxFDHDo0gWqxB`z7gJ|4fz6mVaBd^9cfMW zr_VRXX0XQ_%I(RT9)W4zHu;v-pY6mgnh+kajviF-9;r7;VXySRCBCAP-hBh&$>iP? z2v7Rd{T7itgDqOqj&?poOXdr&71Rzt^{y?4ey|Sg&>2y7ZWPIj)p^#oP=#2&GYQom zmXZ{#dJdXiCLn8cs9KPtq3!^N&CD3NBHTVT3HA>pmJ)W2J3|Z!@-#6l~9LhY8^fnr{5!N*r|Yq6VYSL@3&)kG29K z$`v?0@x_%6Zaq~-w8PHCo-aBbab;jl-^i5<&knlC2i@hdnDyXgiJ4$KY(~uJjv4PA zGKK`aNJ@32tZO2=kQdiR-dq4)QZaC5&gc$_Zo(U-f?T6S_5fG7Y|^NnHHUo`8Iaa< zf?eZ{U10zT;Oah^z^YZT?k-;l17Vn%?&~(d0UkXk0yW;G6@p*@RMmZeVz+e}GGNAD z%MU>#FA#WWbPuiN2d!aPI;z>%Z5@IPIA0gvYBstj*78Hu5c&yJG%~Me)mPC_QI}k) zA=nKAIvCyaX_3v1zF<~-SOAypLFYqB_n{ZtWX!Q30cGK%rPGvVZvLtz(v+8CQ5u|* zm2!+BfcPEXrq3FdtD>%(maxLPn-;g?rl{(uV;vSgO$(aQAIUHJF255q=(_w#gw->>d|u(*O0&n%%i8JAMtWyw*X#C zIM^fe7D+DUnyRhig{fnP_`Efj)4(SHC$es^_W!D9v?la!Iwz`mtOuY|SZs4zA*|UE)=>*6_{Ao?Nuv zc8z@|HtPYV$glf{A+rt`*EuQ|aRNElb*U99A=mjyuY9zyHH$Py;5heaA6d_(7Q_I8GAZ6=^izRNLu+S0lskuYdN>Iz`1;OeGvpUiXIl`n6fh9#+eq zTFV}L%N|n8o?M4)a!G=0@_|_cJF1Go0?3(y&DLbsXO^Q-$N^?0b&;#09K$owvk^VA zVLd9s`52ANmvK+RP*V}9_D2x}+a{(EV)|fj$NOO2$mU>t0k)zRT%}|#-4Y{307yA5Hl79rna!Mb=L-i`%eKJ>CY^A4ys z97O(ZMtOE2U;Fdzyess->Z4ziT&(Jvp3LE7W{N zSsfy?wMe?5{TLm!`Goz?f~kR{4{<CCc47S&PNG=D zMiWyLYh5f1DWrflh+oa1iGUefq5(lVB^+;0UATO90c8XYhKdbT-O*%I@zvk&7WYoJ zs{w$heXeugE>zg{d(3?^3$0i7%z9xor}Z({XHw87&*j&UqW>qRFswgP0gNfZpcqZB z);EJ5@rXV%IMo((QH~NZPi(FMM_Ht1vGg9BopU$in=s~9iV}w~BO}fbyq#iZ7V5v0 z{mi66q0qIpWjzZCYG`LoL}QoAXmHJPbV{#lEq{zQYxdKNGWIHtY3Q{qC|NqkAW0?ieKtEQp47dLqs&G6<3|_>gc)PW;f@EHIKHMfBa~1$b%<~A;nA-ivo`Y zY|osZG4t%vVqGB`vpdzlp0M@T-_e@p`WrIhDUWA+>YEGE50Pix6sy3B$@NRNwg^Xzn^EgAlc46B=bq*|?Z zQ}-%E(O>q1(HWWyWP1Cl-a=nh=9Hs(p{dO>o3<%e?75HSX!pH4@kwPfa?L!q?8oII zagiO4uM!rvDT<8053ydHa0fDn&ejI`@NNw9@oo(G%*zkGJ_!$nKS|^HSL|Z+@(T8p z5(r}YJaYI}?IQaA*`^~FXkmQwX9#m(_XX_o`Bv}3g4Z}zU#QmvP=wbmL$eLC3f(lQ zP`vZ0y}gv*v2k3sjxE11ga<`BvrZVUMoB-{dx|r^8{`Ef-%y-jpa= zP0NxVLy(%t>xpg?uZBIz)L#_sSOYe&3TmQho2o7RFt>W_yirjwImskmU$BW*lifB7 zr=;=!sRf^!VevCeKu)}YERYK?cZAbypOZFRa`BiTFI5Q2R>TWBTs&So%x;}+rr)rU zAVQHxZALkNHrwq+N@ZKs!4Ga96>Hr)qMKqe+A*Z)2_Bljs}No)RDA*G{s&mH$_2Yq zafS_U)U$KU=HZ;D@$UUoZuMR7#_w>IhWwOksB$k!q$}-vx_MZd$TAz6Dn24@F-PPT zrZqTePi%Hb197xcrLeiOeth_P79Tun^u%wPGgRaSnlp8=A_}skG8z3FL`&T+7DMbS zkr(uzx=@sDU3eP1^*+d7DH7F_AH?U?LwJF0eT~*Qrj-O*63dW3P85|O52GohGz&Db zKiBY+9U6P2pp-{_SC30`a#wG^a}e_KMcKpa)YB)so{!n>J z%`Ef&a9OU)h7I0@{!Bk_m)>49ZywVY>tYuK6i@)blV{OSS1M2yjy`*55__#H9J=vo z=j%e3sh@t%mFKC^`QYpO;S`DNFsu-KKB+2>5VWQO5?}WU(x<{Wh@OzKJL=R%vlbk$ zO3Kn?77(e`34tm@yx^Y^HtD-xQ@;@3{+-9snv70b()eyEmOB~d3uI3?qv^B$3lZ)p zAZ3X*x>=@?*BT;2bMeyX1+|PCNP+=}-HMSsbHWohOy_#{KWLBf>xW)>AY6hp+<%9z z{o@$E+q<|L+nbu3{TnotY^O;mfi?8`%eKxub~brh6axE)U0OKjfMhhZZs06lrl=i+ z)Ml$~7;_6MPdlOYOQo+Vk9S<>qnOuUwr$~%Z{BT0tR9zZe4m@+9rXe4@2jL>v`e+j zF;S6B^uLvAui!fyuHa;GI(tnK$Fx|k8$+pQ>tjlBI*)Y$I14rQI~kG4VP{cr;x{2= zc2gIuc&EnEY)Fd|-OX(uB=MP(xl*|{_tS2F^{Fv#-uta6VaY98)KQDvmwjB89!8DB zVcBhcH+^w<9IQpMxdX>^$B<0z6x%e4hK~nIF|me?Rye$We~h2nC&1-hMrkGV(@{J7 z=3f2afa~r5E{>P5vG>zpEgJJ8t@+1A1eXu7f=mX*&?$yNlg^>YBDGY?!>SBenM zQUyQcTN@J1tmA~G%l(gtc=m-u_8Sd)7u#N6`E@i-idMcA)-ipjMONTM>7~KX?x@N$ z#UqsiK!3{69$6e^Yv^76_N$Owiq-qj8}7stF#LFB6$l3mv#qJidMQjZUP3uF&ym4x ztXy1413h*v(>#7B_LZiyUh{|3c5*0>8DlcZ&AWI;GR(G2y8vHy3M1`!K1cgKoPF&I z6U9_V6+SKFS@i_ORyX+e7*lM-UB=a>BVJL?`F{YS#qLQLw<<^-AE~Vajh8Velo+SE z(O&Ch&oV(7c1OEuYp6vV3grB}DtWJfN{xO~9n;B4sGwWK7 zn|kUtMdk#09({)+f17f8$Zh5&7wS`nA3dqlYYG}K$` zd*ujf@}qwK58$7Wv>wL`sE><+`uKmNAxKEceYZ2VG*@+Xa0b2od;FK|pb8rQ4dx+| z5%wYk;UEkP{b9*R(`{@LuEi6TLjwPvPjk*J+tNQUK~=x3bTo9-?jPgMOEEXuaQT|S zOPuEepAUmw^15@;aR?gvUGhAhecW!627tGOllC6<`#~Cp&4j#Gdj72LCF<1ZQ^T7} zhu>xGRPM9IL%p`6JGhcQAM8t)5@o=hmz?c3h5Qz{6?4AwQ6cQ&YAgQ*jmbeaFfQhN z)V8wWYsX(uA)nclZ@Bc96F0VvRfLcqi0!nF6siwVEQdqug_v}jzsEF91oEUURK5ae zT>O`JZFGzh_=Xn#?qe6{rM=$Uk$jP3Pf?(Y35@4{m}RNAIoD=cWE@hd`Ydazr|7V9 z<2(XoW(VEq*kT9YHV9|!zvgx{9xth17zmvH?JmxCz&2piNongprQ=v^mUW(}T4ATx z%~en8ygSfqKGW^gch~+I$c3OJQ1()XHRkM~cz{YP<2jbQKaWSBJ}%v?VS=L&6}Qlw zJPdzllm4FWhQX0q$rC5KbZG{bA|`0Yyg~-M^HGS?={d)|Yuvi4q?_RDp~xpp zgAC6}9|jt_uHYZuavbRf7PmY$QrMI)ohauH5uG%$=9fmmX5zqyBzhp=y+>HivslEC zRZQH#gH}-Sd8T%di7g{i7u#mc-F7oo-Fz85%X%%;=zC-!YP+!O za6}MClH^XKQt&;Pcb8_U{l%y4k>EdPk7Pd+55_VIMs^{~H z?G9Q7aJL>`ceX4ZtP-Ws`e)qrG5eUO)aPJq5j78Ne5(opTa`sm9lckLXl}TST~8H# z$c<-B$qAEy1v=*7mB% z-YuAS>lR&X5=h;zLse=gfxoCZ-F7(=XI2vl7P zZY%tH9cJ6SiOF1IKY@YHbxvD^%DL^XvyJx&vzsXiG#x#GbyJ*YwP|Rg=0qV9Nh*9Ptsa(~3->tL!@r*B@fM66$*c%q`Uk#=R=NQ25LdZjKoV2!)_@b->rG!i5l_OZn zO^O?wYwooMbgYJ?Q#mM-+HkOCPkz(etAMI0(8(#Gcyk zdX#iTS{-H_j(#E01wzAP>_`bLq+j2@zMw9!%(I5;9!QVdc60|af z*r%YRvr8xxOazA^synlHx14z)d?S|hyZs}H>Gvpwe@Wl?bpX~d+w5_}<+2sDW#n~r z`omtKJtB{j6Av{7!p*|4w%`sa5NU_04cG!@pG^RIQ$h^babx=`9qQgQMn>vkdx55} zQLE)6mBQkI9;Aa`2fRO?_c3xlhHI{yT?=&RKpsJ;;n8$OZCAEI5vl%lHuVHvjJ&sq$ZfGZ_R&*cg}&|1)`c_ zR0UC1e(KYxTZ%u>M$2Sr#(#3hUC6`sHSm--7h_#a({tOin2UJZnmTSB>cLgwg_N_u z#?$H2*yjr`s3I0^MLK&0iH@^uC-zc5QitG|u&fAE6r|e_a%MQgjBfbe5qRH}t6nGr z@#KpyepuQi!xT{<=u(GjjYGs=eu+D&VZDMb|Kn~>b+ejsZBxc73g{ZIwft3ld*yMK z;a2(0%=r7yy^U5!F6r5I7jzrEyd~Uz!C&UvSM}R9fV)j3XuEfq|1`L%t>Bz9AbwRJ zNWYl=%W~cS&@VY-FVMo>zwGWmS~kawC2+9ut2B_& z06kq*np>Q+hn*1ib4dH=(4?;><3;sKfg12=f6sKT-)kHuTctj(Z^yX6P#ssLh_gtV zeAQ}>i$V!W?7dqCls40JR)&yV+I{rHPU;(|@iGhMcgm#6jd}T1)U;9N(gBQIv-@)< zz|It&z7A%NVBroz6tx5k(O-Pr$3z6V5oJe@pag>H!p|p;t0-*ccDw#ikOrvWSfK{TaeVl7H?iC zsihCzM4_;HRVf2S5>Y}KF~aVJZfUJJEPu#HOk56GmuG*{GRV=R6#x2t-#l`O`W(Tv zWt_Vm7Y#XZ|HZTNmV8XbRN|5wvxMk)%a5KF*K^6OL(o~I1WAM zW-1RW1_)d5w3*+d7(kW0Ai6t-L#@{Qs}rvlnJt?ZPUz327SF2yRdV_2yyLdeNOhs2 zmq>oP`--%e){lFY-Pr#zXFo-qlB57xA1{!0F#msRhrFAutCfqfoulo)hxM^4y8jrV zk1(6)d5x3G)D7V5;BYjm0RiT3L^ADsZN>#^)^4nD`u41K?S>DS_pgG_YDJNquSGGI zKeaGSU6V3+4zq4^ZgYM;{~!H`Pmm=GJg0P5i7?^|)j#{{#1-j-bZTC2ir;A3=RHH4 zf&`eOQB#yFnqg7MLaOMkQFF}^c9LprC61!G`k?3opOMihupZY+(W$NSk}p!V%a|Bt zk5&*3LA47*LN5=Ud%k?erk!t(0?*BQH`p-i97HJK=~35gOYu+3YK;osw=H<0ohp2c=N5^fUmtK>65 zN36u{+MN2XserI`i!A~*5ewy*#g|R^@5OQ654H$@!U$gkl#|*zCc50O9fybbW6dj= z&usV{Tr3kDctno8s;b4iF5m;mCp=d%b2*b*@&-FCh(11B@H80b7Td*URFMDyS7TJ) z7a64ORTY;&L{TEN0fHngus(7x^xwl>tcRr|hMBk37!)O|$>!+ zCCh%nnF%Udj9=x7M{C(Mt1r<1X^tr1_qMq~<_JVv1LOVwrEvdvK2=j=5bFHj>qbf- zhP)A4_IW&TWkn}IcseWmq~{A3Q|*xGAI^P)Y#7|v1?hcw_u9i5RZ{TZex*|2tHQDyn>F;h( zDWxd^`;17Uzqp6Un2~rIpgjcO`sn*D%d$Cyq#z1i?aGRFdhMYhcylL*WFEuTrO654 zFZZgRv5z}`Nv0qd0?O8-2|c;=X5dSj$_vO3${<>@8tp*lNXr$c#YnQY$*Y}B4Y-!< zrQDcCbB%2C6xfD-XHOs&(qDKJJ2WFFk$^U@z|{HVktr*sWB(ddyYNWmjJAu#BNi6gNH3TzwhCd zW3O0E7;`^{(VL3Yiw$pV17mC|x-?iuBY!>`f+d;yd&MQLeR(tW3p)#~{MUxowMx4W zsJ@Xh-jwZ!7k$BMNaN$HMm{8KwxS!g@+sij>i))&j3Y1pgyMd~iyor`#;L93t%|mM zuDvG4NSa7W-`w(nw27O!5l1^OIz&cjj7CWv21|<9dW^N|XwUW|U$)&jV|7<^kyYi` z@#Ve4k(?Y}hX*a@UoC)}kLtO)PUerchV=^iUK* z)n;UPWWF4TJrUbB+HjI+hEt-fKwscnBlGJgCjHLND;NjVi%e$60 z$w0yWGOEy>2ZG=1DMhHIxDEXd9v*J39hLY80<7D-6ZVenYs4E>P@l|263fpzhU~*q zvsphY)(*K#xsGe_{A_#S1=EUn%zKq9$3`&QI`r3ba)VvzvGe`|zg*_nSo#M*9DNbe=p6R;KPUQwjd&fWd>~rvhR*_*mK1rMOb^9!CCZn zS#UtfvvQ?=sovjfUH&$}ky{yf9$36>WcG)T$N{5p?&jVs7tF*Nq=}tTe}CEX zin-qKV|OoJxgPBD0KyY40q64*CCav<=&^z+#)usBqrKab=n&H}%eI0EQMlr`W zb>z}^)pT=y&E`4wGa}fbMkFYv7%*YaXX!PPk7gfGbTPPy*%OCujCNpT z^wYHTZk|=jib>+tDHRy67FHoM?C|8&I(4&D*k&Y*gh)KiW$&w$;MQLRG1xe%yDm|} zC|eCXm<2J^(>QEeaUwA@*rK(}3-T&v*hW)r>iFeTrqy%%WmnT1b*!YZq=<^!&83lt zR56)kWU;mtrL|Km$l6Kr@mM4$INh-Y$W3t{f= zaCwmEDCD3P7Z_MZAXd1nGl3sV1yLQ4yFoh3*IG%(igB)~8}wHq&FrLKwnf$b1tGTA zecOlzjYMySI4%|mRjSa*E#EXfD=bAH_W{uN);DVF&Kdilm9aiqQjhQc0qt?(_hTsF30NqzY(Fx|laBpfQ+TcBIid+oaI;j5tysEtt_+e13K zi7_sq1a*4_w;17H1KYo@LHfppEJ8XYTuE-pV|>6}wPFaOwrKW}LZe8xptczHLUxyj za6zKVcp^F~_38#Tf9Hncr`%?C6z}cpK9uD~Ao}G<5G0fMET~l zr6~RMt2;00sx(lDVtWcAK%o~GGQgnM5Uf+Y*AVI>DWof=xi_9LMlUK6h-d1#dTLMR zPPlK|5-JA^bqnyk3235xp|a4EG~A_+l{GANK&$1KW`x|;#mj;j*?)RH$MXyC9Q$tT zyN96ECAA5=m9&%XG?FqxnQi)IZ+q(*{m%L!!}WDg`p>G=fuGrOmdPei>phe5)n87i zhYuK&hcKaenmLre9K)5YBM?1A^B6NwY?^$iPSBu^lNO(N&YRh(gKqeBG_WH*Lux=R zP#gP5=*v(g>>j=o=J(Ud>WS@0(YX8kO(W4{d7L9tJ0%lZ6nlTBfZylm_$-j4ei)=rb| zkBuUmjmjZA_?;${6&J;7)xqJ7s(Bm0eAeKPm&`WSe%p;nVAPZFmH62KyaR6UYUsDx zcI4U3FPyLF?T}l<{ZHUED22MD7@QhGLcb6~V|gO9aw6~^y%QtwFwwIl&LBwyDUALA zpIt(1nAU$Ungl1+;uKFAO6R3V5&qJ0K}ww4sfBL3(!<#hXRFFz^EM})pl6s1VzH^- zwh;Uw{+IyWTw&Gn4SV`MOg9}=OJDkFu{wn9?Nnp?!?O`8$BFVAZ!THTYW--o51+O1UVGr;48cs<3SNweg6g6{3{4z|OV zaN^fJbZh#M&}CSvkUx#ihj_q3BR9j)pRd~60z=cqs_wM@!%<6{;Zy*i1d@6WpHkvN zF<}Fve${yi&o{eFU{WZs;N#>^0tcQCWPR+1x;W~QU7NIP9nrNLV2S5D@@u;7VaKb8 zxAf(DxG~#iYiyah1EjTA@$8q(X8hE&bdEXM@j@S60tD=hP6j?r-Nq>lx@v1eTbnJ5 zElqhb8FeNKLS2RWWdvHwC*(d2W#SEF&%9oO&_x?Zy$Q+cE&pqM;E$(G&{p}Mw$L%6(=Oi=r9qK~AWFM7#Ce%DrQ}3eu z)EYYN1Bf>UcJY~Za#>)twK3%_6-F%?X^k0rKgkmpRn~Y&238RaQFcS-9#}!S#-p07 z57+wI^cj56vJ1UQZZ-XovR5`SZbZ#r+Xn>pS=N(e^K%YsM730ADd{shf9n2UjJx{*IX1_^a=q5v4|?oVRFth!F2 z$@;kN0Y)VqM4f+)JCqJ5x?>hZo12c)51n%{sJ$FL@#Bo|&$EDuG55v(Rjvg~+&&^* zb6ih6N29tZwj4RwCIHA&QKoc>A{LJSk!_}eRTUk>W-S+%F!i@xp`Fk^k^}0aQAHba zVb)z=&Yl%EZK#wA0)D)5-;hD4Q6Slx zB-0CZ$)EJ|ztD1o!q23CzR$XK-}nEI@~)h$5Z}K}R}s<^lD)hb=}~B$}H77+HulXtbn$)_G(p@Mhl0a4$C5@ddoLZcGCDY8CEI&WElQvQCMeJ;`4U} z6PBtpsv%hgR5b*sBF|$|BhZQ(o?pio$C60ok@%xy_J^a*H0$0OsmLzBF@l$sUf1U1 zLU>5e*2JJo!&2<$W`qY#-~6S|1x(IG)|570uZDNzIfIcxl?l#2 z_eA*=n8tbi_3lP9L}_{uZQpIQ*8?Ltp950pm1#bv$J|Ft$PSS>NEqmj;5B)tRPx7_ zhsVJcF~zii&2fO$z$s2jb6v{@p?bRu%^Kwk~qUI{F5-jQ{%G z1qo_)Yy2ofQzVfYt#DKw0Yq>TahkD-i|W8ASgGWZ<;4lagkvP&hW@+exCZ(ogkw2} zAlJYjINgL&2HN18E{9;oE$)bcb+P6&jbjGYL$fazpHnM#la>2dU(c^ayM!`O2CHC zcy~)Eb*imQG=E+0s32RSSF7OmZFM{OF_TKdc)KE{Non!p0(=%iGe(&T(C+1yu@^!0 z@*KCs{YVGhn4Tw?1Wn}67Yd&Q9fx&aPaeG!E6~b_`o9dI1xK`4A5X?|s44@ry^k6M zG^H=9oX{u559W)M*sbbV2{=)Y@T6c0vV&kF2&_|NnP|o&qMg~$0ybr`f3|006%wm| zW961WGU3pIY9K+3cu8tsWU1e(3S8hf(m<+X*&@IIhOba+NMrn(H;}!UQxQlnajT3I zp0z)Cwc#{GTS;<~RA%+%6Azr+ARhLpfJb208vNEkNtBjKL6KanvcAbg%hU=S6I`d* zi1*>Q2VRB0G}FP5d-xbU40=(XkN$ZFv7@Lecx9hiavR> znByife@t_zYR-4Um5XC_7CUG$Cc!6Z2i1Ltmg7j-l2FNJEkkka4y3iJp%}kW!d<$E z$}m4W)rZr(XgdSuoPH|7tHuRX5^mSbEvP;cl{&&Md<@Zj>lBHV>vs%FdDw!HTI2^} z0CaSJ5@$DNvY!bnIBOUq&`=Bm&eSiSzMG%>aX36-?xA~g!$z#!VeXN8D*H#QnSEEB zL(s!2k?1j5N6(zMNJHq+No<;bJBM$G_s4Lw{%RgL!@iIYEk$c>KeOM$M%oS2*uEn@ z()C0FN0#pmr?CnypIx33{@Uv1zd#iCL?_oWu##;D`ExAezm!Zq+k0k>?2Y5cGM&{; zg`<|quLt5~)v)u}y^fRYBu&$;Sl*S1L9vR1eE^5%ZG;%7L+15E?s;JU5WP0c2wCgz z?pTih7U1Jer}r!di66&jn%sXvJJElU-}oXM_0z^XT=BQ~_2Imi=rxVO=79RhS7>cW z(7UErTrGk}^&*)f#ZNPdKnKblg`a0MpFjUI+SofL)0BT#&Qlar{0!Syx!fG5>aN%*z8;6B zXn-hpVnR_Y|2*>#AXpYZqll4n_er1*SN0cVgB@HaD5!sOV!>uovoFU}r|}WzwDUAX)^9 zFWjWEou%y+es}3C=gO?B)k-fGIEzj&D^mZ$KD8`q8YbtSWOisfy~>G2z)|T+-`lpR z$55VlIi?d0oz~3I**03+3XIXcKV;8rZ`P{gJi%6tcz`P!2LEiE%!-*wXhXPpK0~J; zw}NP-QFYg<2gALgJWaLW=-h!GDqN8B;;?$lzqnJhj5}m^f9gM|7b(|M1{y*BW)$Pr z_e%aU_r)Yrz^30U7r}n1!wgL6#L4OPJ4){y{!8wt93O>kRw-IRdhVLIk?CAp zsV6hg!@c0IkYb+?Oi7nX1YQ2Cy_(R_I?>LMW|CE4{*W4Yh&D?fG;aYtTl6aIrfqv1 zmzFY-d|1;Yf5!9_84uE12GFW(!l^fTZF<*~wSpE-J41o#rga3N&QC3C7X?FVYn^6J z-ZZb?i6TbiDV{(3_?ObBU4_1k1qqjBnlaXTAZ6rf_V=s`NeX%NqN5bf$}luJpmIl-y_#b1Ni>pLRg@u{$TxtI1cm?UK=euwG4qYSA3A`n!yG7r* z$J}8=H2jmx_woX%vU;XhJJ{nnWPGn>eRgCG-$n4G@mrbr(yhNk(ERKR+6j1R@{~Pd zj&yZkEjBX1{)SdHbyYq2>&y%IKi7S_oy##5;*TF&Y(IVw{qws2j|5{P71~|?Az^6B zD|3Vv2-qds2@;Y39#{mFKmTx|A3+!C7lK7P5dcHjaCh84XuuS|%|gkfDQd%_Ns22NZG!>-SJ&ogm~)adf%Yw9cWitXs@ zYwN26ACKE}XoFv#hWjiRjjoSuow_y{^W-;R-2U&lZOF>+Ie`gXxUd$=T4nvZVV#&U zUA!<(=E12xeVF|jZQCwjIrb(=7ziFwX35YOAWP5UQ`PU_Ya>!wa>4;oN}#PHWFY=BAiAiuyS^aGV+V zpn+ShzF7`8fM9>sMcUZ5IPFoDZLZ<8H@K)cfa|nLTFg3A;kL-cXtm5~@KC2*w%V`A zgC1X1XS%w)tXtizHO;APetv#a@6gC-cRnm4cOm~Z)BoWh_W@6IS(SC_CH*rY%>l6_ z1Af41(KG{o$Z63eBkIr3MW@m2`AeaMW>}U>OOw-#T4!E$F5fyZ9 zU9ySVd~3^$pQ_S7DVN;XAzE8m>K$0h@w-bcPB50IS6Aog!Ct}AOc$qFDpE9}^&)t- zqsmeBskCZEqASQ)&yg9+`tYwEB*S4}`8qaxWa`IHAmLnuSX=;}iwlBk`fWVnj832c zLZ-Ynr||Ga&>;_?_wK)HOM{sgn>t#>pXPs62=mh1bAqj;07OW)@UDq(2bsDwPtMC0 zDo^~scJc2lZi7CW?UGpbaqk4&a{_sPVcZD5FFSyuo~-*n1rm1Fq)Ogj+&*05KJ^57 zpj(MTmQ?8V;s z__7K|A9RqbOx-#+ziF}B!aNtYNKQI)CTEa#eT)vpSs09C)7d7neTINS;|M^jZ!&CW zv}ME?aUx5EN)97~L<7}%7yo6_a!K`#KV4>%%2Bf|bc@joFtVO8ACmSN`u-;BJ-m<| z!D8yQ5p>rvLAbuGetbzVQQ-O_e3G0J)rZY<_T7-bsbDFnqsJw zhh}WSCQlr)3!P2fYyPOMjit9i-<%Fx=-zv4F#ywvWX%W}vmg0m58_>WwGFUN?632Z z2ga#(3W*IAawHOgjl?7Jr%jA&E9k(%!oW$9`C}Y-FrjGNbr+N52q$@wp@|?g^Os?-%`&jhPE%mG=N^9XZGMS7w|WAl5=4B1^VvfV2;66|%W&ULGxh7LD|4nN0F_a^E|$`?Fc4y*48cgKBvzJ*c< zBsKf4t%uR!DA2e<1){R;Tgd*vo;Ki24q+dVTTDzByF%GNfRge7Iu*M(?*`I$6Kyv) z?Abg-r+1BEnZbLJ_x6^9-21QxJqQZI-2&bB+;>pa)^*E{ox-5|10-*3nlKR1TTagI zVOcZ=c1_WEv~8%u&Qx&pZID63cdms-7qZhVk0Lpg*GG0O*>?+tPUz0TEa`{>H+o4M zTLyxcFHt<3mI)kN2Z}N5=I-v3(=`1NfDrBH%-or%sU5?jA=^$QT*s(>V~AW;Z@5u% zYult-aqSF#53`dyx0&mj1KsZZ|8S-Psr@LUw4H$M@hUDY~g4bY*HF7Gp>f9{@4ttB(hyqaUI z?_l>5G+Vb`pmM0#^IttmTQ}Kmj)}A{Rud0yRG73`8IwwN7CKN#9O-Q4TrN8_qe2AO zZiFf-)}_0Ekw{|`e(S0X(rqO(m)MOVb9=151gAN-86Q>j@9TtgGQM#3kocn~-x8C$ zy*3NF$5fUSF>NMP-_PFg`B$v>RbjLoWD%P)BF7i&5foaZ#^Fl$f@rxGPE779oynPO10S1wS}kV7ZTNG(2h!5EI701ECyESB33B;H^At@9|DI*541;uN6lFnl0E()DHcRGM zc&}zpjsRDSCtTBR4zGg8Y4)#%#~$n+(DxPW9r&+c>>qr`_)8}s(=@Xun#X?Z9+0oq zl23oP3g?8ft(Hzak2&mLC6DviJz!jUiy(5M&hEoKQl-`onC*(CWqdNbWTDwAPjZ0X)onwZfCF*(=YhTq=K0sdeco$RJbyqR$Ypfo&<%@>Lghz*e!{~< zYl8V!cD?8t(aIeK=?I<3q}sG)f}J*8snk8T?X(>uh}25Uy&4<3ZG6o=)i`ym(pKSB z_lDDfFr8j2s3$z9QVHi4%R!Bh%WOEOmG_auH zieToI&k^~xI&3Bg*$BL*8u1jDebp#~Ki5*^R`|PbZ!Tw=xHz-lF&xbN-5wW=HeGi* zHgrDt1w;Fwp6Q-Bx>iFPD}ct@?9zQ-^5WQMwn5YfX2ow!x7<%jm0es+!4i69Xu`Bi z>AvAYQXlgW4KnQ0oGzrfkKCVg&}%gUYP_{y-gnh)|B)28;&Y@s*R(Ck}OI|ENz^ngGjUs_!MCoCPc-^bS zda8$NR@C8-f)SHwL$Bh*0Qm-t!KbKrDNeh7yu49f#kOi{%W8@GAzReCuUd0)GMe7A zuIg{E1ZA`yFcnwCA(GL0bHUcv;^o=|G}Tv`iVAtZE!8mFW6dxKHEP2#Z0F89hBC>p z`tJ)a=JV&Kxjf;SVZat~ttB%i7n~;P_U5F+Tb*KSKC*9VM~ISn<*L?k*8a@1U~ zXAS=?Q!!;VIW}blt6@0|$olKVk=5(eZ?^fo?ndh9E>i=fnW$E(+!)a5ontS&Vk>Mg z5AO%n4n)~U$Qk_Gm&kL^Xg{~(@fNaYHT%o-a$9@eCF+$aO*PeU9%tHt5?(IYXxbTH zAKjEKSPPZX>7i=i`l7I=2EmqckqAmxac9x1ht}O%;cEu*$11f9XO_*2B@=h#uJJYrZ|vynd;`JvpO_3|lNA!nt>3z%_9?#Id3K)CJBYW!8bT^^K@j>pGwKw5} zf_&IgT*pC3lEw6BaSM~3fbXcaH(|#Kt?g-Ouf(_xnMjhE=#nMn#`C(}eonFFi|}uKS8#IzBsIVZ%v94AC@LKj-*T;y@zri+#zXYp@L29#I-C)m@LAi znq-KmEUw7wPRvhUg|maHlzNzuFLW{{m};epo_OlSRpH#}Lp~Zqs*pXali(Dg?V0L@ zuLOTjG&%e|$l0Ill}Z;HML9TR)bu;p)}{`kAi3GX~TJ zdX4H`1?tYUo%D&{efJcRB)+{g*u6HsV+N!J@$A~2_47HwTMHHBs}}rgG$??@J>5lV z?T*xYaubT^eJEaoT;fvpCBf+qtzod4eDTLSj&~KK@); zrDT5pj9=?NdZ`f{{i;bH{7J2V0y!g<{o_|ngcAWWzh@j^rAgicoc@O&hhS80)4?{~| zt0?)}goR5?>vsFbV9+^|t8+J}YIbS;o-;!yyvpsEvZH(0s(Og6@$t8sTSyEI!;X?V z<5BJ%@WMk7Nng*!&dtoWzB1eh;3F;@6iMHw6nKPRPzmYPA8D%8F?Z++-I$5_9_($O zSBiC+g$)A-2XBLpZJh%F#(zbU|#Z-cfj*)oG_x7#19S{haY2;aE9JzFiwD;pnE)=L~SAG_ZD@KNNR8G&?C z&{FUqnurk&ze9Ef=>7FvVn&ZL-p571!q>%i|V=PlZwgMUrJp@B5`y3nSW;qsj^7n8Lx-n4* z#54Gkkn?cf%TH-XC_`0u;0nq|$u!1mjy3(hp4Zynn!)i8GbI!!$)zCPiNU21tls5` z-FzV7k0mzFx)Bb6W$G%K3R{Uy#H99NC8d~Uw5Ij(*}P&fKd2BF<;LA=Bn;Px&m6Y} z`UDxRg^}177^SZt{t^$AjSJjSw|aAj4IG3oU|vGkwIjzUr*8|m z2&5Lqjx?7Ng$IMpmdcXo9w?(0_Hl2LV36*b%ZBCZXHSx6P*6?`o6Rk(z=q9svZ79+ zAcMb`eop5qvn0-?P%y6?!we!65BwP~>oM*u^dIZ~aaLCKyKQ=cK1|wz5>F96{A8pa zNe{83BC3uHCd-@|bl$N3O`ZyUTS5azqGzzjTz!dtRGhrh7B?X5@M z6q05XYDAeLAvE8{=%_r8mj3fh(d>6$v2B1D<=P>(r5w9tWxJzaLLJmu0-Js`$Kv&Fh(>+H> zuDJk1qSw^o=dT%V!Os|%8QTgygdywAnSg@AG6|vaj`zrGd-j$sRu}9sbF8HX*4@az z>0^_ljk7|~v5In>?$W3x4uXGyk!xy&z#0{=Q#Ph13lbY0mQt_raI{-qsCP4TS`Qow zrqHDZe_sqX5N3uCpLf^Y*+oyd%j{tw2vqc5n1_H`1YyM1l+XSLEhZ=+IK$ z*lK9T*MB0&cgNx!1D>dCsYwx~Wk=)Dmh2@ae%RbG@nakVp*61lo(2J24~(Saq-v$B9*^J|=`iGz+p1!J|PP;}^NzyyuQa%|>^={hdkm@bdU$e

`D10z;@&QAk}nT& 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 z z7Xd{LrpOgQ%{XkFQLHMC2zNr;VK-UA10nU4UG1CU{^JSOb1)`M_I9HkX{=yF_1^5} zWFo+ib~bKslqR5O9u8kSTh~>l;lv&NWA)cPPTmS=Hv&m6xNBVba&=;KO|;7S$WUP| zgct0r4wEy_>`HpU208X$e)(#KI0*sx6MR7dd=d}P?g_NNOywttk!bL~6e-%DXR5?= z8nh~;-qtn5yHS|szdOPYlW*>ID8-=XRf|&_k{PGeUS03WlwK1~!a7l~8`YyVNl%lJ zUoVtS_j_kda^-WjO6Ca(75vFhS_406;r!T7X0S5}jCio`r=4au)Lv2dPFsUNeP;JR z^K^f_!Y0mkyD6WPMjJd)3@==PejMg)$Mn~Nf2c{#Zjgs;vHAV2jV$d&xL*nWgoNwC zynjo`^NbK29qsVPTQijzJmPV%j?Aq-bQ>4 z4kNNw^V%@1d|t@&KVlTE zmUh5vEP=DoyYZnj$&}YwpT*PPPK8EN(|F2vi z$Cv0sIdm6=)-zdv0Lrxlh#%EX9LRga;E&!o0{=1DPf_ss;m*U5d+^ql6M#Iebf8epcP`^}%UO%(AI@d0afGA!lk&ClL(9}N- zxdT~M1T&nZQtFTr;)RPgfEFCrmSX;*8?Ru7+iU8Zv;)3X~p z>)vy}x@TMrjxy8ly00dEROH8A#|7d9!~jwruD6s-)*Pwpe?=%iHwHzhmqg<-ipWhW zC`!CM7q_elS>x`?e3$$HA9Hv+N>CNSNXoirhKQ$m2>loNfI*~Cl4wD!2u2tqR$*#k z9AWMOEZ{z}ydWpC5$ymc@CHCZBrBK}&IrA08kdo8PHakKN^B$Muc5gU?Nf%02S$oSXQ)5I1Q*6!-!%8{%zyo9ANwwN7(>(dKCs_rc)5B0(VRn zAOpfc?a9iaMPeZLxBmwcI0T3R$N|7+C&bdM#j!$WgX+MISO=7WW`GG~^&Rxe-zE?l zH2>Qrv`hQ#2bvb*#N6ct-XYTqwjmjzgYN6ad^>;005(X=#JZ7=*x$|{ji0&^j_3ou zNHyYZkh|M}6=K~mN4^1g00;3V(2-?;4)7(^hHivEU53`RIWVPbPpk65hZ%^j#@nDN>F& zCqifT!z>G6hL|_(n)kc=*@2iy^GGcuMZ{g<*C+!MfZCs3k=Hl_2*7MWCz8IzYRom{ zKqkO}s4M0gVW1OmMbs5{4KhFgL`3Ene#Y8G1$G18kod)(;dWhs9{_`&J`vaG11kV1 zq#mJXj9nh!6|$e;Gs8d}01DYp_!)Z_6DR`cC4LXR<{2Oa_!GZ}T(?SmNbp@aBZZJ2 zqN}FJeb0Rv#w%$@DaR{EM<>d&QdG2440MZ-$P9>Xv>x2#rnWkcthUxM2xI%TLrD9~ zw9t!-xx@~W$%=|``JjFf5u#a*J z<6}=s+v-Sr0~k0pJXGQhSd%CC6iTyGl;U%-;BssJZlCu!9r@ofAy zhRjlE-L2ZmqVzQLkuXioFfcLmxa5d3j51Q?Mi{GzGouH|qQj`=ZBrcnnWC-FiRB5i0 zQ_d4tcXF~~C(*4^fDWEayGSM*!jd$5VW}_FFgt4q;XYi5$`@y^{9QbQAQMHyA}zyW z{#^-VW{PpJ!&!4y$spOF4N~C;b84jlG0&~z?=3J~&}1F371uy5##m4{I%%4r&Y&pi zVc*=S8xRY*-Wu(O0-LSI^_q~Vlkr<4+6?+~CauUW z|8FTcxM9TbF+T5NpUK-&@ew+WkCyUHbdrD|i4UVu0!s&B1#fxscmGROc45$+mWTw@ zabrpelBmO(rDMGBj#Smn$W1i> zcU#`7U;si4Ef7J%I6FJ-tkf*9&`3+SO>W$u!Y5Wyb}}C)!GtI86^zgG!fm^3zSfYU znWH7iP79KuMw>P8mQvCXR+yQ}RZmt^jt?*s(@czxbelF8#BUjENr`J=i`q!Nm^R|T z>wR;H<(Br>l&e`OFmXLPd+s$Ocfu6|aUIrFtDM4wy~5c_Oj04KH_PMG65riEk0M}{ zR3Hc0Pev^T8p*}RxW}=x-6vqJ}1*(AYi*> zx=7C7A4phIIo_Ccj;8L|VkNNU{q>q1u#s3_G=3=9%IGEbmP~8FL$R!C^SM35M0GVQ zf@3qu?O?NwOq#8Ll`qm&=xzOY*qg}cR)dA@h8HLCiqIZETH#=KG42?T(nY{JGrigS zPj1t6186E3WUq;wT}~}mVZ~bSpHh!l;m{zKb{f9MY%O@O^a4x(NNpZYXT1?z5|RE_LT8_n7KT^`5ork08h`?k)d4Q-`^RaMZ0chPE` zf-GvK^}U}Se0-oEH*AYY3>O2mrHgPTLFx84-5aTbYs$;niu%to(@=!9pU^f4 zEL{@Dajm*QqMV@?DDQ(V%*v}c%-2;qGI6`zuTrIN07WVrXxTtBf^8IJi=GKCq&l^o3xnC?=I!YL`d2oQn=fL=0?x zB^$~LHjB$-2>}l{v}%B4!`T{)tvx-<$JHh*A}iS8#8rti&%SPSuZwdpVCcLj%!Yzg zqM@zUem{fdBCLkZe1zV(oe(nhK5>Z<8|2LkOO5H^^ahnooDLFSfihPiF- zoArwB>$*Wf`D^p6ds^!i(6>OJuu+~dgMgko?DID6yQ2ju>)N`~BaL)e?@ddgNNGcI z`?QW)M>?B(m6f-rD7G?dtT1j?9&a>Eb!V7t&o)ya5w+zIMzB*#p>BBv<#f7+7=wI0 zy%}*sZ7pM*aWPu-4fAATzr@8jKpWfL@8cMK88(L{AU)3&aB(&&Z)ml=R|IuM~^(-lU z@9=zpc&MxHd=FF&s`}ODL)gH_(bo`pj4D7K$CiR6={|(6unpr{r2z!txzrSGBHMy`Xors5#PZ&i;?Z zPJ~3B@>yQDne0(IYRH5mR7xLFpcE=4Ys;7He>Gd3&!e|Nk+7&gp?7~ z`4pPHjIlauqH5?zRnqAK)Rkrsje29`T9q+7Zj!Y-27E<2&Sb*+pT{U>agr3Z#)b=9 zDJ|`~$|mxbffOm6+bEhuZ<$*2;`usZ7~|+2Se6nJZPZf$|(fC8vfm@|~egU%Vaeg8W`Gol7dX0#wS{R``=5CdU~4 zuq>bygGe#B_Hm--@w`EY)&oUo1!K&#adM}E`8O>~TZJt0#08#e@`DnERZWp|Vv}=X zSA&5zwo4~W@|1+N{idwN8BKg;p#N+N;hs=t=2km~BmYD>B7z*|54R;R^NsqlMqZvdXGSEPzYDZU+uG!dQUud( z>@%?#1@iN{h0NOsCX!_B(EaVoh<8NrHn2LmV|4Xi{LQP?$G%sA&; zW)L;u8b)zI@%~aj+hB&owJH(*nV)j82;Hk%>z5_(G@!I&T9KBq&O$@ zdRz}~n%wL<^HT+Y`QaG`P4M8nEFa;O_CpsbZIeK>Nx6PKVyCHk+4>~SU0jk`M*#ER z@#SjULJXE{s*dy3#0u+}RycwW#?14P!V=tVlxRVAxwSmrym%qI#D;>J^5T3D3_=4p zr{LP(@Ve6t)CR%){T-59oY4f;RB^K$dI)MRoOtpvJ@OtV)We64Rtr0&b4tB$jB|=l73MxG)b;y%?K^ONy7;)hfd=LQAuP>F83*&vjyt@upI29mw=Mv z0wg3EByY1GA|5Kpz2LH{fRd~A6(v>Rxc%g`f~$xUImw%w)+~k<)&SZA{#qf%JQj4b zdEs4F&V9NDh(ql*Q@PfClcDo*@WsPyT*2|n=Tw2N|CuI=Vud-P42S{~twO~ck(`lk z8Eb#!V>QjHSW*dx_@pUISlz2uv4d4k<)PzbM;zgKWr!=3>c^VLd;obYSy~@QI3R7+FVZ4gPYYSIw?#1y^G8x@iy2T1xjji#!p{O~Bg;pU^l*GZ zRdkph&`NTKX>x`ZT{InVOZ5BZFVnn`Wef%uCp2GSO7w^3R~VbYWIT+mF_VOUU5fw0 z-NpY-ioChuAAnk|_dW>&5L(@vT)bVbKIQJ@T?`4WMFlq?p8JM^U2~Q62tMQN{`e3t z+@8B)dj)I2FA@OBI~KvR?lnpJ0LwEzq2^H=#VsCSl@q}Vb_5;JT!L_cFajMQ1Rj1nQxbs|fK{1rEhg!Qge7@Ohp4(c2Ij1`Q0|3vTXS+B%g z_%d*3eUPT)Ecv643N7u0ZcFEU5L6h9&&*^m`xfaXsWyJ!s+exXbs1FDN#m*VwBzBk zNr2K@&lg+6*{(N;U}QlCad2o31#g9;y<#kJ(AQcH(~UNcwo(>$bj*cqD8`{>E^MG} zRJ%lq73D7VQ^e|rhW~One zbFDPOh3bU9qSoVY=<6=}@e0C$E#S>08%vTb4M$Xzb+4!^O{;{)p{aTkfIqT^vwD;D z7vbVD>o3SfY*zLUcZ%tMaPFAX|6tr(*)y{c+&yZ#pjIQYvccV%HF^;)a&$cz>bzYJ zXM+ERHKqpo;%W3UtbTBI3ao;0djDJv=H!96=+EKfks9C&W04x9H@t@BkDkQ`e{q`SOTEg%=}o@c$mz|# z>caWPT1Uf$yFW3p=F(rYcVS)Uo5hECfis!>n%5i{va{$W;sHM=itLskP$(UwVsNsK=KqUyxNy=SS)~ zhP{g=Lxah+)PU~L#+4vnDhmV1$HOdNh*b^eM>WH*sK#2zH=OBDj@1?CM>j)*nKh08 zUlNOL@W-hvU)a^J-3y(5{gJiSKwln^Y$%&p&@XF|7NkRHVGCQLvxTZ7aY4i+l!o7&qvU3&%k$^dh*XG!z4nL5hf0Gp zY^0%WJKF~b=MkMI7KipI3-v5q{NzmKGO{!Du>{lVd!mTccN?)~0XmZ2^U?{UCX-L5 zA6{lGWn{F?5N?gCmA6%2@z2pj zH}pUI=t!xUq%g~we=o*kE=cRz!91i0h@p%v$o>`mP*%}PD5oD&O*O5MVO}B&?68PP zw89ZQF*+H*g7`XC&Iy)RM;J`D!=`?pU=?sET^nQNft#vFnc5J%gH^KGB42qADtieD zIJz8<3O$O-yZhbNTA186!X@}}O%Q({?K04NW{%RDZn@yi$&sOy(x+(<7^P2!KW0Ok zez9}^q^{3=|71?5q2o?Rwe!cj+Nkv~x9}L;vOoCJC#z?dq8nYXM zej8Hh3XepICs{AF%$l;lMggxQy=enShtqY{eBRG%54C78+DJ!oL_MKSYW5D~&maMc z0zWC=sD!Kn;osofj(iHGHTVS(`wc0IL-<3v*?sjb<*iU77+DWhz+FSKYsdCI!Ju|s zoaaTwisBX%?=a<61H=IzYtqxh`Z$y=$S;{SlO{4k*E|#rk;;#&d8wNuqeMefFB=lMx6nt8l=^ zAadKsq9e@}khH%#s4@X3P^TNUN3n->Q=Zkt){;gFqkFhd`lR8{8b8Z)OOR;D%d7NJ zW$DQTSkIoVuboLxPs;fj*{d~F&wAM0L$j`i!<+`_^BJ1>3P^hme?e`{PNfc(9@Ifc zEUGVAP;C)oN6+u`Gn&^kh#s%+8)9@d1m-jhu9q01YaEiVii|c4T-lN6aZI5%e9c$= z5HlMIT6AL8u7hJXKnga9cHAxh*nipVyXT#_gSX*h*KbH95yH2sF&<}MJNOtYk4!U- z@i{%=lX5GBG@9YK!a@he+=q^Kwh)HJf(+N{5b;re3#CZcPv~UohbT_s0h%tfYH6ypf`2*GGXtku)fNhOuZ zf0H$(BOQg~K@i4bN*>3eso3rjF=S0ZoAej7XfLe*dZ3PPo9<$;4z10ypxQDmjsm3} z)IYdJzILo_H*hx!+V1j#pr?EufjUhAvcq&pF!dbXYSvO6o`yJx{nnK-VG$Aki>|K>$|Ppi#cgqScXxMQ92WP*-QC??7uUtz zS=`;7#ogWg1uow`=lr;*>Q;3n)zdSRq-N5SWYW*0!i{+X-IU}=`h|WYn38o?Pw8JZ zMpSvVMM$nk?ohI9)g)k*QB7!ytwg@%TdQFfxsAZBF%kDs^% zqj1m=y(JJH6-GG;7cPqqOiJEpOp!x>)d+r$z62ZEiC=ns6z*eFD-*8A;)p>+f7qCWR3^AFbjgWbSiLLbj4i-hhYhe4}II?o#v$BxwL1>OJhXh}g8EqWbr+p%B< z1oN(teGR=Vw*yKDH+Pss=y8bxZ5!HxUm&j~M2EI5h-LoH<|4wf}@-ZiPQ)wJiPrl z5kimsM6-QRz)Tl*im3op`O|NR$UYoL>v8Oo*jA52ztP;e^OeFW1T2o&UUlI#-q6Ebg^2P4`lz%ZIemG=Y#thCPmcS0 z%2?kTW=ojNqwL&+)^!uRzIcPW>64xh>Fb%ESNQ#T+q>zTeTg}AY@V>l)jyO!g`>I{ zmWZT0C!v)o-oR;q2dZzvR&i1{Xbw{5DC`v>Nh65fI*yk& zlW}XD7)WxVo}bv^^reyF_Tg}nX;Pp*P_e{;-esU1!b~T`8~j~~EwnWonTy?l??Aa& zl<^^bgqVOC&jqf>?8vR7WK+4_m|*w$yu!?D9l^9uqGa2~?0nBjTp+9gV2V5GW^6%> z&JgD7{OHYieKH9SypKt}?lSEm>4RId@j~*|Z-8L_Ik~ zz#>un^aI7j9pkEdld2zpe-zDUd<2lz2s!o-tE{bzh@ZCMBLy|nH8nL?>J5tcUCz>- z`}|iws@zI~+>S~aE+-Xq*6Pb^8af#goEjEY5{#A`2;KM7xEAdp6sl43aBX4+yz6FC zt;7*DlDJ3IHjX(m%SG5YEZ(dkQ(HoP^@3?W?s4gdSezQB$D$MMbf5B5w^M%^Xo=p; zNXL+5PYKK!Xs_$^)=q$nY%PRy452zjN`*an#x-k5sMi#zeWvsM>2sg6OSCBj!| zv?F7s%9G5DDMG=z?aou^X!i)LBjdh3<9T3rAY4%Ymv76|bmMh|JE2d}s>MQD ztWn{1utX1$qdwx1i} z_6xrc$33#Xhw(2D2?GjDHX-VM%n$EjT_<#^qT)NWd1XUa2RFVF^Nr$pw0TyyVO>V$ zXTCMIE7n)K0Su$-ILe>q6~(?;Qv{lC;|cbN-A>v+HAeM#s?j4ULFdMr0d!($IiLXZ z`9`^dUP}u_Ivz1{T8IKtor1=1132J#trJ2(#Uv9Ukw@}#NVhfZ&p*8;my_=q>S^WQ zM!;LBu)eiy&wP{u$jH^MuP&&by37{tuegQNl^tp2BqS`?Ln-+9d#WepBQwt^Y6~x7% z2UIat$ZSDfn^;2jRz7^@88o#`Nu!)|25T4Lly!XC7C}||B_!o(#fs^Af*y`1`-vGW zQvs2U>FQKtW8r^FT@3Li^b7;-sd`q={ZC*@=hlB*!>j+Ll>Cq6|6N0dT#0k+jOgJBo(>EBri`kq?v;NMFPPRh(BUy@ ztllu#u-K;d_ifX@!6-yFhyQy|;q5!t0+$!NO^)STFNOXCaK&6;U(zxP&?kL6gYRx% ziSpxYI{5;bt9F{R1{9DJ%OH|@eNX)FkzZu$F}j4BPSyiY5Zg{<#S2h`*;!*w z_zrg+Gfu4WUvP=!JvJz?eA}dwK>-@~%0;1&b5!Zs+^S)(-xsVZwwv%)50-Zn$UF^B6 zgI&kqlXJhDza*JA9#V{N5{V~<#9rhvC*j|<{(W+8dGjd8zIz+->tTv?&W+fMCFVr( z+Y)_pj&Sp6#=cvx#rP&fI`=O8Ac8%obC4IeLHo9b)ZJZ&!SL!5f)$$=*EB9(`#t`F zEV%BE@RM7mK=aKyIp?~0?5IAW5{vf3kH}4k?$#yemCI&Cm3UBZJK=-Sui?HaCiu1o zp3r>j;sp@I-(%y4g}X?Pw3AA#mowicv|AivFLlN@yF?2RWCVD!Hy%&9ZL&99gzgJM zqtMvX<3Nk7Uk_cRbCJUAoG~X@-|fshp~Lez1fVUf9~LY}15^Ubh`$Zrjp;eD=6&Ji z$aH<9Xgfh5owF2H#gTZJxV!NXe)tRG!w_RO<}J?nCX#5ug3J+y@=?Lh&l%M{4WVx? z-ssgyiPa@d-VPGM2v6n}&d*PX>Z=RdT@z#WxI%;VQ77fXfUJup@xbWm!B6_uPT;eN zGIe&#yJ;Iy!;w2^`L-WdGp&ACCgn~P>0I5?d5JJ&`V@w(4#B*PjY!X*ms<*bVg;3vVv!?fUti{E` zAzBqYIK*3M*Izo)1p9IxO8%k%ornC_ojh&@;%exR$}*!b(o6T^q57ODlfx>XXd2N< zr-i?=3va;SAYzjz8R1Jq|4?^EAJ*mfg48_Lr9z~gN}sK^N6XOoAeP^9pu+4!Od zh3JRh0iOpj+DoSqCqjrHoAYc1Q8eU&Zf7iCc9z~{*QvP}9Fsvj?C<`!9mSVV+YAC! zordwcFFg;N^KP&1vNL$w44!~nx=$hBmWN2-#Gq}z22K5O*ek1J?YD*n5K3Ep<*8so zdmitR+hAgQ&}3R}cC(%x;mv%J+@-g#R$2}Jb6KJDVJWr22AKeE)j zDCc{AJY0)!R4}E?6j!g2w141lT*d!UdndD7(h&aoD_`jr^{@@{(XxB8dP<<<8sJA} zyTmwmX}|OI46|W{(sHKr=PS;SDf)exOLKqglE1|9D;W6X(K2i14!!5%evonMKeco& zX?!Ul1>S>Uk_#W+l*9$lkRIIqd882bAgM_j^fT z6756+1o;s2TY^|n&vlcET5t)sAL(1}Xj8&qYqfsAw11kUYXaH3E+N-vQO5<&{Ch!= znT2(MeD6)5E)DIu4QnQ^C2(lfeGZ}$@piUwb)mNR1eyTJAw1t zScQ(vSDO^lvCOmgooliXNanePNefIU=fk`BTbFRp%+c8R+(KS~S5e0(7U{>buz#-^ zR$mucl+aL9;!QF2F0oYItM3Li#iY_h{zuQKj^0UaM`lpLt7<+z;M}${jc2t3LsL0)WB=NN{|QYz9rTtQjp1So%P-p|xo?srTJRuON0gisrn+y|lFoSwyZEu|K9_Z# z`=Let1DRX1Xt#?727Go%xo{xs8q1RN{E5zM<^L{T2vCp}c#>Lp$qVe?=kbjGM31}z zE9i)C7JpIuj%3IDpgv4?Gh1DzWZ{3yW&{HP*@mG~P(^By3e zLNU=#Xx1ME)b|9f{AF!VmP16Q_Pa}ie;}dEy7L!2|A1cl**8;<5ia#f=jh?rC^!;k zmnz^Ar^c7{67A62!rPoC$WW|Y54NOH)@^U;*4r6FKpO4vxI&?}IsOi(4nP+4IOv@m`I zZT`i&Ful~oEbK6HUvkarviaLlsZ*u%=)L7^f3?x(Y>#cQasB@Fdg?vneRiMfJncQ* z^&6|((}c*lO0|1x=qi!XK?~0PM6$wn?jdfcTe<8InCvp#XFJimrb)vv243c zd*&#Ibc{4tYY|>?R>X#!XA5_cj&b_k%u$kEAtU2&KVbxWDktbfzQ~Qkq$_oqYmz5D zQtyZj$pb%9BxKKoQ6$(=JsAN&Va)fN8R<%qOc6fP2Xv(RzYqLN7lot>{F8RS z#4mbu=lzT9jf(9}!)RHlNZU-bnw9k6i!YL$kR4GYDfSA2xMkWRW5`ey$iEp6RA>{W zP!mng*h7`e0rTJR-o=#2W5k@lm9>&HrOIur62;1Yk^YX5E19QB&Xg%$h{*YQ0dHiE znk9KbPx=agi$F)EA!W@P#V2)+oFr40o06eclR01}y^o|PcH&M91&l|~lQyJ}qAc3L z7N?5(-z6fpWj9u>y~X`AJygpbUWaR4R3Tz`S1-SvEQDB zv%jv3hj(K%m$pz}-I`b4T=_S*F|WF=yd_L=?1)+Grnxyk*WBKg>6FEd7r#+)_IB2M z7Wc3DuK7uQTqvaxa8_ELzp7Hpv{K`ua&7smWj{zO1@`7soHl^x#VSlaA;d_ ziz`-Q(e*EZCX=Yzq&by~eOZj>zJl6W*TSrR^cPX47AY$qx9qH`db7qitc?VVMx91J zup~wG2!Vm_Uz#f|VzlL~dY23b_TkLF4eH%kfz@hRcmfg^hY=@?M%g~SYm=VmgjJ@F z=r5(#Um9gD1ut+IR}apq<(LIU)m_Ey0}H|`sNj)De9$~u_-h-TdpwWX@@jNox}l{g z&bse28+;H>lAf}%uV-;*!*@|{R;+_@G~-c5>efw# z<=Lh>Y9j42s+ne+@$D5C={3~-RWf99L25>^y-oL;)08Kvl?hObbMV$0SDk6Ry)>Wr$8%9q<=LE%C+lo7v-s}&8!X+fvN2M9u}zP|O=n6kg6b|H zlXbCEeYs7sLQR>9E>_QS^U)+Dc&PaGM|rsT^JX*#O6$?20Rq1MfZ7D5mX-b<;R#k0?Rlfh6 z)~czmYU})qakaeBELTYxs~el7DzA>uUZgGSiU8~WyCEzT-EhIKw7SlfXQ?%#5#Bg9 zrD%Q*uEoJj|Kj={iD6f6Ix94GOnr6xFt~E@{oN;aAdA;G*mi4L?|^*i+5YCK<_7UC zQiIJ_4DSO}?)~kvFPEoFC;sv@XF+J^e4wzo+r#dV)Mar&hv(!T@ii0r-5aVaYmhrV z4~JpESL{>18{;#8NH^vA@e#>090(IwXLH*A1D^={&Ng!)qJg2ic^}&6gw5=SxKx0i zj?l$59%``atCw%Ph>a&Y4gK9=VOf*2|0Ci=dV)d+8 zZ(Im3-W)1j1TCUW0)He1j*MH#E zX0B178pbT9+C93O1x_jr{XSnxFyXa#doq$HH4i$@SVr~ERg{|Ta1p~=K)zB`*Z761 z{mY1&5rKh`1AXQ`9Q}t|kY4s|d3iX-nsS|&X8sUG*xvlCQ6D9AG+yV;lC7v}!vb#p zBYERq75@yb_2CF2g4a73_y_2uclWRfOg^LW2q{~YRk@a0B2Ik8-)<7qZWs{+A1ISL zWy?unqEv70WsvH3P!>Lm{4uOIShvEOQO!A9owpC&ao!js*XcRt+hO>T-jfh~Eaf7p z(#Olw^Q+qHYn1s=bIgnmG3MI67m~c6#Nqx;rWKY1^|p|}Z;V#*LKWTEL^-lo7i*PD z&Dye0%IjvY`cb|E+I-?UeDH$|E-6^0SW4*zOS=kXtcQ@4tb8F-17`PATK3;X~;%1cD6EStPP^WFgmpoTtUD&8oo8voKKEn5#X>$(D{r7 zR7`Q+WnsQnfpo6GAIf24m1hLR*XF)2=#QMHXuL)+Fy+ehyYxi7cj)kbI@d@UH6yaB z>gzKiOp^3`bw`iuA<+8G=BTS!Q{959it(Z<^3KYnfE9qY{5$O_YN%RCPD+@&IxaGb zXr-rpv2H<=%q8QP;u`nH_kQ*p1+{etDtuiQ#j@^}vdUgKieA>#TL#KlFr9un=$Kn+ zIvkl}C(9#oQfd?lgc=eeh(IbfX0Y_OTz876k~2 zSn6{CxJ2_RO(Ry9$kka2O0l$b1l|8qiocai1YIjum-5xw|EnNga+RNORjybn*E>&O zuP?#XE6l;etnsa`oI4z+-ei!oqAi}XsqY798IOllBH(TCb^hJ1`m5=_Y6b~Qun5hncK&ON4_VG zHa;fJ@fXY}ZheQ<|mecn)?!P2J^4u`TOO;^a-7n)?Rn zg|(K%w4o;r1*iLN%qzBWkQ$ejoJMIjaV1ojPRbJ~N?+*Bsi(T0)j9qZVg!ctV1MTG z#Hb{nhiYwYZKc$$u^Uu>`vqZUF13kjoU3(%)a@Mve5}bCf_*>x z>Q+GFzdet{mASdtPnbYAqA+AT+gRm7iCus%z}Pz3hxe7vQ%lu?2RvJ~LN%K_vx=ay z`9$qOL9Ce;L>r?XCRjoCmT23 z`a9SFIJl;(kFGp;w}@fTnJu0Vc(TJNhh1B$&`v^Hn<Q zj#r5*_fZVHSL(JQhL$@wn_n0oA7YyCo!|)F`LQ3mfe;-VoO*U6#-TcTG_|gyk{ySx zcU~0boNdYzD`03 z8T#WLuY#ZHSwa)~F8BKR4E~ubX%W5|?YIfw_09q^wD40yZ`>vDUmW@GT(=%Fun()d z%xoVLb-YrASZ4X~GmlZVzM6-8$evx(xlmBZNQYblT9PY@emco!NJ+N=DA6)xOn4JB z0A?sO#L55@#6(YkOawi#vcv%lsU&JSv9fqk*eENhE8wgcs-+1xpvV=3u^ReUIXJ4c z-uOA`y!=VW!F5})F^y}358Rkzg$`~)68@cAi%+IcyO`j>RQ#b%`Ci6>C?EcvmYrv5 z=fqTP!A0Yt^9InX=p`0lN9k0l>`;@n{qrIRa7Ec5Ny9xep;0oT=;uTc6fmOdr}6vof(c zPhPmVB)p(|RHB*lS(lz0gEhjvQ7M>b!`9vsG{ zaz>l^*DQ|v`kQ%@=$x1E+`_@?uPy$?c15R&6sMM79ZFd3u4ci&TkXclx&wZ7Ldrx1 zU0O?+Dy)_fiaNp@r)NF=T$kSkl-2UtWyzyL%!1&-^^kV+Sc|kyUg<$- zPed6$BK)I0uCBc0K3uaRRP#!i;u4LXjsaDXsn@?xJ*QSLAF+xm##gIX-07nutP#;##2^LuBH>TWo^V)ZTjKNPyeH0wE&nVGrY{|j4Bhg zDsJQ!kLMV#tcgJ;2dJsyB!}8XwUNv69Rjc!ry=0zEdn z(J9KK_^(dY*bGR3H(U1BOutwDUPSRz^`aK7<`FZZXP41W0{L{;Y8 ziRvYcR<*YJxrKU4s+t;C<{iW>bp~S;*~cF7c|xu8#PS4}l2pi!-TWse6#aw<^y9Pb zsn9f6=~hR1<3zN@?E2*n`ZD-lBKwS|F+vd!NvseIkf2F@hc}pct8zAurH9`H|Hf-l0CXICKf zj?m&QQQ(*6$QKGQ&jm=eBeZnu5A}sb@TGC%zi^uu`1NbVAM{g};0xoW))lzj_a!#+ zg$C?#0e&xiOOE)1f36eH;7siN8j;;GC9nr4D%`)^A>iGD6;vPT=p8xr;CgZ76(sZt ziX%c2R2rcQRQPvGv!mkbgZtt_AOz|Y7B>TtSG-RZH1qG4XUEwUNPhF%6^MSL;tFKH zS#Sly->|v*5WZ;f3KIDQ#xX(Y7www|=N0ZB2j!LSNB5wG3}RZo#n_>9gC}yPMP$$#SuS)I`;E9zG2&qFv9x5U#;4>OeCVN@7=OIKX+?FK zR72jRtU#W^=_EuuxOd=(4@D(_#LD;kcCssPwZ_CT6w+I35~lI{2d_a051eGWbI4Fq zqDlT6Idx8->!ri0N2?`b9+@1o^l8|0f0aVRCXyy&Gv*23~P^T~(I49&s zuoHdL@D)Y_0`>aOOr8wznPRfZCB@dXAqE;Bh!XQ&9=kw>Mg#p!hAH(rCbRVnLE(}E zm}sWStqD{+(J@O|L*e^0+8;x!fD(l^%4c4qnj=ARZw zn|zNmj(V{D8Y47NQ%wDVBM>7R{SnNaHi#LgZoP#;Kx&m`f#?DNQYgh9D^s(;(kNdE z?MDdZ&uB$7hrI=c<3*fQ3Ulq$i#mFq=xg>2rH-JnMx|4HzZz}JC>uSRrcY0x&tJbp z+nz_UEWKVP)ht3nXJUCV@3v8woY}{QA1U24OoTeLVjr?E#m2Ixn-8phuPe&pixU_? znff~2p;~owX^ze~&Pd0mWD4U*DICM{=g=$Sr0BL{?%hF48B@R5v-bTL+HP+faouRg zT9uJ5J-ilm0xpplYd#Sio+)l8#^^N4Q;DCm5s$%x#j z$+nB)d>V&FSt=&cV#vIioi_7he4=^ps)3wrbmj&dlPIaC`0fIQe0FqnNHGFe$ip9j zyjPcNtt6=CFm%QTk;94L2_B=$doU8+Vg#>0qZ30@Se%+24|1?Qm%ne7#(TGkNj6f( zdW=W=|Tm2t1ue*pDN<2r}Tgq7K-1(eTF5tM$)JD zlZ?K@dqqr|Q4ht4zbY^#i<}N=gO!E;jU+i5QoGiRnlryr&tC4w8)}L^gM}4?RIpfAS`wKJT@rYHKZNUKV}$0kmtdbPmVIIG!lxvHU`>Gbv?Q>>X) zn3OtDznALiJ=>;D&^UUss1YrG73J>F;K^fpss7-}>q4e~EeClkuxkDSp;n#5^kjSYiVuJ7QCTB=vl8@pv$6z9IjT6iM~yPqgY);gP-h79-=mLyU8PJE%qltf0k8q3{TuDcQrGc&qm>N z51CpoWY}|~P4aftAasN?y9bSh&eSjee3%b>QK_HH`xz{hgXqtT_Sr->n3o&XEY#)V z@TrQ=;QuBFJT-b*D84D3*ilFu$g2qv(uMSI$NzMp0G`smEG%JuJ}iEv3U!$rDo~JB zEuJW}guX1OB)%_9R0wtT>u<&jnU;Nq9KJCZ3JJjZuR;5J;eS4agnm;My)K;Z>d2UU zK0tx=jBTR^Y#;TgFEzq#DkfyogYbbk`guLwNuy;rWb!nyo=oettxRQb(!w8;IdY~3wkK>TaB4knidvwqwr zXJv~{1)HBWcc9;`h!f{XIRUBWDQ<$W(=*`*mNQot>IU#94%5ZhRudB>|R%r$VEE2 z(kK%VQ$#O@Td^yW+7Pl?-LsSERd1^DTaWm#rvs^7UcJ-&t6CxS;W!LLjQsM$JaV9R z$V^#^LRw$l>Q68XBBL`}(->%-&CKK{9fZk5mbfvNOt{(b$KP68={djU* zW}tDMQ;qu7!ei3KtyQrs7y~xmOYfykU#0UuQk9-06-&ESODh=r7mg?fwBKtt*v&9V zj*`M}B9#rgbm=~RuZKm9=_7Q(YT3L)*u6&ca|kqhiWc$7#_XNY#ud)SmDc7jK{GEw^BST~&bQQWH?F$dS28WF99M!z z7SqL2cEC|~;8LznHP|d)J=;7z<`2&66a1pr#VOWYbAyKWqLQuKjIDkqyuf@mdhd#7 zsN0;}PU{Ol1GmP#Uz*Zs;u=1-b>_?r%yt7yTJL?ahZ9+>7tGf9_`O7+Y17z*A0brIgJ98@k% zFB^hKiR6$TByFy!tT#{46YqG$G4oCa5`Q@OOn=!*rPL7H`n+D;pDyhf5B^>iX#U6E z1!N5GDW%)VzfEam7PabRxvss9gdTCAg!bRUwJK58jv0LYXn!!GXvn*}-XU zS{4p@!UfAk#ZV}BS@F9e*0kr^<3aOq1DW}`vuYZ7{0j5PM&yB6=7AUwF#|`IOBZ-d zyVC~c;YP%o8``T%2|!es8qHBRbSbj{2o#I(QFp!w<`^ z@V%lMekL@pyu+hBq(T_krH*&o3CCXxI)m4HZ>9uOhZR}<@*EU@9Kg(-98>}Brbxonk3r?u zgS38`mn`?Rmkr$GF2Gz}^++Qp%G{IuN!xy~5!qurz?|gKUVp-8`1&t zH5w{wBc)mC+Tt<_L70Lgel`8pT#5Hb!XFW-9ip-p7g(U!BPPFy)e%xeWj@3y^}#Bj zLcG(DI3(rBp1?)Jy`72PCGQ%7skK<0L_C;QoT=zfhd>LdxOPk=jG#q>4pop2T3>bK z&Od;IHEAmc$_BEbb(6S7BPXCb5?#kI!ZzFr=EWho*rFwsbO8{ho3M8w=2jYLAzRQ0o>0=q&q`o8^@0C(Zukz3l^}0t%WIez# zYuO)g+`1 zH~Pf1pt?-4)0wfreVQdhs|f^OCD{s1h$Mo^nR*O9`~@K}`mip;Lh$z#s=}r{3_g=s zoQ77xK1b@6N6sPlmdOIXeSL<Mdl<8-@C0?TW|9GX2yo63o}k z*Ti++X?(B`)pcH1IPh~7XX4@~RZx-^-|7YA!lDJku7nF`?qE#TWEEkGePd= z^x_xNw$K1)$#ovz((?=+JQHR1!l(O|(86{qipp6!j9}X-tB=!uHWD3^0b}Xs8JSn! z2FOC7kJEzdPTmH$wPuww4&L=c9lJTfgyX-)a*yfW#?jRq|J~nsZ;e9zf;lK%&QCaQ zwC2$CF7QW&RI-kCFrLT!?T(WB-UgNfpq9Z@f|C%eErx4U(h#4ZNAg;o7kQ8otU$2TKc(Sg=OQ4Xya-J(H!-lgP2qO36{J` zJ5Ff1|EcIDq4~`-VfUvKle!jq9PcS!d0fySIf;lmUQLOR>QVdsLn08>;X@+%8T=4j z_*LxBMu$)`jPyGq{vqX`^WSf-e%J8#@5YiJxy*1qLUw_B&z3Cicj-v;N+NWRCvwJxOcr`k(o&-zfllxvxZu%FtUKA9r`LN2}yAz;BRnqBg0! zG>Ww<%vwt{xzEY;Zw8>i1oMJUm=qZzPeOTw5#oh4Kp)~p5(J348T7mOBZw}#Ht8pn z1GFrPLox9N`FeU!Rnc~>)k|~5O9Ny#3Ao@oYzd5YKpiGb8mJ*b7Ix)Vj&ySvvyNE0 z+YXFNhSgr^ddv$as6NrnBlxzN$L^nEtXvOfJ*mb6Hw67MsCcf&Z&)lUkljdO4^-q_ zc!XS|@;)>qiQtf%pFcvV(!C6^`x^rssF1I~`ke!AHcrSo*THrpOZ2eAZcvFk(P5at z`{@F1#!tvL$Z{%3`4QwTv}RCX6qHk4OEv$o{dk_c_DTHAMcG3L@E{}Jf{19TyI9e2 zJ@<%%Vv&3ov5re;ZHg;o-u|*`RnTxehTEXRbBNvs&jRg%?!AV*5diTM znuzojhUV7*&#eTVSqf0#Cf`BQq6VUaJA{Y!`$KF9L0w4(zOzsRZ@-fIiBg*@TW7%H z{`4!TImD|x`2%{^*&rQq*yuVwok2eN1A0JqgiKHCg@Wh(2@4)}^eb^<|2aFBaL@fZ zJ>A`@_V0fyf_zyZh5W+p?LoY;2LWb*d~x=E@j?JqwsBs}ix*UHjw=(F;XyxL1U%l9 zZG~U^Gp_0r-NTf^o{0zE6L!HzZ%9mD(&ghn3V(*-WP+MS7(_=Wzf2JiPyJ2U1@RNM zAQ{PkrXDd**moYig*hK}6$u!bsrDF-7hh zN*@?np~o7JWI9WFCBFjw^7?(#zIQ(p6}Ow3xf*n@NWCV=-MO*na)@Z9`t} zb|L3EmB>5MAby;^GvB;WAo}>AFTvW^@I98V<3>5$*S-H>HE>KcA#gCo!pMjRlsPwD z5B!!pY777Vlp0$@IUtWQUvPW7Pua2GC{p5?9xFPz1|##6Lra5xIS=sXx#6m_(I{jD zo1DAybt*!C#80w|0a+Lz6aJ8l*fYK$C}Cz|@9&iA1$Ltx!S()vO|JxT<}j#%oGfH8 z%ymU(E{4C2efp`Aj)iBaM{1yF6|xGMF4%hkHA&d}0De@T%Ir=6KZ*b5vfh7^7TOzA z|IMXq00rUy7<`4=PBi9gu*nY4d%fNbG~dEw9qbRQ|CALEax@U|3S;mI!%PG@={v{el^^>3 z?F~GwV}EN5ctz{=L1fN@p3DO~ivF&L&5y!s&i*FmH@bjVT7zz=^jh$vtbkYbhgiYo z{*z_g|CB}0>x0F-4LHt4SFe`CFgd>XwSq5_C9NZL+YZ-Wcj={h7xz zCYys9zDoq~z>Yf)q2cOH)@3e6D!B+GBqM1@!5T?~kpafdYR#T7diOoY*pA(uKmpprD5w#2IdC^EM$tkT#rp zQ50~^i)}ew70Tah~3pOl3fwo?IgL_$}Vuor>N4X#p}=Y`n!nwk0u)a zjRhZx32N5s<6cXj7aN|O+5O%eDtPJ_uhr;hzrmo5=|8Nv>99hQir17rmU~2>C3|=q z%@ny1ADHcq-rlVMb6D?N2t4ld*umpY^oOOx6Y<9~y>oMii2lR}QSP(YH*h{WGaUE} zncH(Pgt%|`TM;N|x7t4z5h6soJ~kw|Fyy}jSC58|vGFaZE-r{SGPj4^>;1G#UUL}l z;l0erwdSYUPO`ZZ4QCHE{#m$?Cece+AF3(I!&XwnJcuV}D~`id09sKl=KmGb1`nW! zGqlQRM1>~FmPfF5hmxw8m)s`LDoiNrDNXzcDv`pHjh-Rm z{$@yL0;n;K8Ge&Iyr5Pg7$cjl!rmQ9^;wXYKUO-u)r=`yBt5J4EU0Tzwwlvs47uANq@>dO|UfLZ7DY}^; zs)|-d8r{S<_im6qvv9=KW&VKtW~?v=50ayw68e~h&OStET;OO^0CRKmXmd05Kj~N3 z#$gIEfzJrsbeAushSg*`S^45(Hg>XwhnJ})XKjy;z}Hj z4C*LqAGBauJoTb+2zIF8T^5rYIjZt)rnL|X;ihsTfCmAp3#a$7~-^y z%DRa%QOOKzI|Njnvg;a_`}!u!rnyPVIa`B zO3*RHyyLsZ5!c5z)O#$5@nn7h14yKP5d%nMg44UOgH+u7kuNBSc>o}FxB`ir;|u#9 z8-A|n#ZevftuekI{w*55VDyVLVxAcP)Gp4Tg5wMSUMY_cXnop%;GiGk3@M@m_czDJ zF3(9gBd%b~r11g%Fm^W|)iuaFK5y!k@Nt@#DFnj@A;`sQr~p=3h29UPh+S`{Sd&5p zxb|B}10q~Pob|Ap^)N!mIzxuX^g%mKXxI&m6Fuc^B2OBr^Ch>@-p1KTce%X zL42Y=L5Hk2GPNd56Ar8uwL{@0m_{|kS}bt6?)^~!W>O30f&;ZP9!$uhqnCp&5RvRF zeC4B100x}_;))H`Ck9N&vZJ>%MYuHaOXb4P8wu!Q_;(dEqd=L;2dna=y8+R*n8zy@PQ@ig> zQjV47zas&tg6NPDf!EKjHB8njw*Z!>`!-Rw-p!P4|rqu-&XKl8w zDwbXUll=SmnDs&B;(|YMBKINg?iW@bAvGcz+YQ_RfF%*>3RnJH$>`ro~~4_CS`E0spm>N*-tYo@zZeX5S& z;L3i&aI15SHmQP-rcC5SS=pqn&J3K9 z{LBKuZ@F9>jhUHQx+`r77#jvqu6CX|s^kbBIV1xc3Ou zi9cb_oUyyUF3P5wmK8Exrn&QpGOe`Wgh7RJ_((iQO8&;2I7ile!_XiVE*-YJnG)uo zUDLH6*(!+Kj4=~h8S1E*F072WiPsux(=15~iLUFZ$$Arb${qY7M(_(`$`S<>DLzf2 zP}4iuIV~;EzHXtqm1`kR0KUp~DPeRwEb1<@zE+jy&p; zqlY4lzq7+PHZK=`?}~#dej}jiK_yEi`8i<}E>v z+d-ETDtbM4{b1pYoDiB&I_aS_z0+6UwukwWtGi#o+)J zYRcKUaQeAjd@kI=prk{h4jylCf~x$}m;jjGl+zlef+gAIkDPS4OwN!n&PWEjzud5$ zXYkD_0=D|rg?^jDyy6uIywX<@GjekwNI{ZAk90oCvC-4o zIZw<>qhvW<@mFfoLx+ZscVs>hyKE8}CHnfJ50J`Z>JVoR!eIT#!&k#H2p?L-*6u4& zRd>CK*cKC2rol&j;RPkS;q;6qlOsq7SoC8R;01U97wY+n6kQkHTh&n?0=wmK3`{i_p+;Q3+vFaXO9z=FIqh6bQ zV6CL-_+I&XEa8z3i>7^*AgqhddF3f9fknHtTbA%y6xoC4{7x2b8 z)za{XV7kFz?98GsAROB_2Q&0#8{N?xcULy6Q!7+^N18`e>V>#pkXtWk94~N>FPThj zcCth2JWI)RackL<)>K2ZnG15*$Aw&S?L_3Y@R!6(8e32=?Nq}AH{WV`1=jwJ`w#q4Pr zkFQQ^v5DY>(e|l6%V*y-x5QGR(Z=>kt0Hx%rMO{s9b2kL>@Q|wZGyGrU&KVa1n;mz zFA71DSJZI@DPM`d@QH*{zT$uJ6L%9n0uB`@{77H%#|5RnAorKzx#CZyaL}j|DJYmI zY$?X2l;exYq(%3I7vQDsC^|{cf{K_EeWl*Wr6m&sDA312D8LgCMA&e~Q7A+c5JcGs z#;>I$NN^*JF%tRXqb1m&#x*It$Z*4qnJEquWQEvJ$0;bh$TOmi;S$TG8sd$~$Aue^ z6MYgc!;J9~&!nCt*}%tTDWFL*LW}{4;0f*thh*cTiE-bm$RN_BiQG~jQpaT6Fw&@r zh7^=iKNFHkxpAaHq`4E}C{m;<;-^H}h{wSw!br5j4;3lGNVy55QN~fFM5M4t%O#Y9 zD58y76Dg%q$s$O!LXEi-wJBVr&J);4EW{is5~(PrrL^Ol$g~2CDHGLfPb^C;uIQCH zj``@+Hi5b!%aY{WP~-Jdv7(NAiRkg!;YEn!(o*sgj&O-83E82>h>6Wo@{*2FiLMkE z@!1iF3=|g$*)fL%6encd$m6e4OhS&NiHK56B95$yGV!{RhinvS(T{9ltn;t=;7b=<<3{NwRh!BM~jias)GWi1>CU*`CR zO^<0q8-|~XVJq0@GIUWvJ+GKOXjROTBP@49`WDiVEP;^XJ0kjmTlq05=RuIg0UkR- z0;*VP9`qmW;yu4=dcm}5&Lwfe9f9di`S(P%12r@q4N)Pr?$3f%VL6x^N@DWA?mF2m)C5)v^y- zwG4ZZ#_As6@E?>RTja%*J&ADE_9MbbHeBrf4xpWS`Q6Y(A)d&?ekuqu~0Z7r?f$8=HrDt9_ffzd1j9%LQ9-!=)DyZh2%snXhq zYR7Ld&w@ydgl#D-9&j?=ujXvdl*rH~+bWhsv6CI8%X|cxF0(L_Mru=z#(em*WBbu3 z`?%}bcU`xLCcmKL9|J}4QA#O~JJR;oml~Pjd$lfG@j8o>um;XGcr8e$cF*TRH=4tr z4miR913QW7!*0@N80mY9)xPBg=^UDfxueZRmlco2-0D zPg|89)P?H6w|He1hmlWH3j+nfQ~vui>L+Vx6(Pg-asUZx_nUPn563H9lRj{I+q@w( za-QLKHVi2_6=P3Ki&yq^;yFcaDq^_lvI=Y~$PQJ)kxCVE^0(jkJ+_?aPBoGZ#ZP*= zM|FtC#wryydTK7jCXGGSE;UVKYh1-F;wnwW(8iwbI7K28OepUjw4`+nnm9J6C^{di z+T2HBJEe7k+VM+f3C0PAieNSWge~iMTN{5+yy#lZUx2Z?NbH#iwjaakS)U=FZ8*o+ zQ*eh!_U7e%h#1G7A?U0AEf`8hs>VZ^vfF8^2!JdcOi?i!1ld2@C=6nWye@FW37>=; z*MHxj)loKqetY*%xFwNi!abxd#3ZTFNBus5i?4Baa}4wK=C!}Q`s(Sza!B1;L@#0v z5FG}nO&O7{0}Sn7#Tpwn>@cc6{M~Yjeb% zb7qJ@f}5Rma3fV4WYfrkth^4dDR1|Ce0lfKtscQ)Yox zkjdspc6Vv@h~m?5lIQ4ZP?6<_Fqil?4fh)cYHQ!V65F6ChNDE0Y!v9ui%cDuN5P?z zGBOr?MYfb<^p9+W+Hv9lH#m8kSXa0M%Hufgkm96^+nszoFpoPtzKIDk{t+?1cefXN z>f4)q)OyIQk+N!_qCDrRR2F zT9lBRg@^D>c5`I&0pWgyS325MD)_;J{Fj>x7R#wS<(iWaR+Fbq)g~3qCXwV}ayk|Z z&4?&b@hvmYnC|pZ_Abqc&gSDGBasq(KdsRR-dW4tAuRqWP7kIpd?jRtaofF*S`r<1 zUFDW};KXhSs@=PT?35h;mbLsRJ3Z(m{eEIev>Vi`cwa((BSRh$|2{)_pMsd=b!>%C zh#PxU;_36QUdLmT+aPmhUKdLcq{Y9@nVR0mWNG&xbWuV=^H2cPdt_Ekn z#DEL#QsXH!VH1;_w%H-`zU&qh>@`pS!>PsA+{zaPx|VyV0L(!@aN>bIEY*|UMb zqut2nnv+gt8Ou70E-_sHpgLf+F;*U|ku9b`*=35zopKx5Y#QQ*SIebxIb0TY&^WY! z05gl*s(&$qK7*wNTP|pj4dxCdQo)QeE#4x0&deT+eY~)NIHCk*U9gNDG149as_j*u zU(fQ(!aL$I_~*6G2DG-;VPvsSoz%i4Sn)kJ4L*VrN8SK*#G_%3{V-1*J8p%o$TC9I z_CdIgpv+F>r0I0;$RE(5VE@`Kf>7u%8b!^7(Krp{$Vr(2KuK@$vM3pwB56qWWGyVQ ztNGv(n^fU65+f`$Jht4XKGO8?Y+GAUa}1{<>4}`Zxos?jQvvAkS({BF=&(nJ&CMwT z`&v@r8c=~%?4ElAuqE zb>QRg@GsbZj?0+1i#87`3(N=|eep0?s%4SF;Z2L_OaPd~Ld>~CqH z-lirWgF^89Skm$OC!KD2B7{z z?68Y~j6PXKcY-mCJ%Bur``bbO?E+;&DA>a=+NOn2-ejzW+fZ;bKe)tNVcz%W*XWcrFDF6VDlD5^lz zE1g+u;aNaki6hF%P_5SJwiLNKiW;>M`C?+3C-VRXhHE#Ij-zFTe@|G&4*G9KM01Dpq_=w1u zpDHEFkHZ=)SZC=tR+X*0psf=XI*>FN9x+{+r8D4?B$GEEX+L}}aY$X=_w4K4X{p!L zLCIHuw+kKXPs2S?(a5j_QPLWm#V|p-6LO(*;hxW-ybE>*>Y1Z~kHm4*!lX}N8!3dh z7ic>zPTh%h$0G$|nJGeF*azyn&Ul?Kd>d~s?o;%;p|?l8&NMIE88Zl)#a4v*i+3fd zM?Fbf$(vX_rFnfHvq4Mq$B?1Au#IRqUTV3i!!y%JWV%wKIgSr!IMZ!mdQqmm(WLUN zEa=ie`m%FXX$XQuXyRa}4Whu^Tc+Auog>S#Mo&}zxT&x*mO=cq=6pn{lQuT( z_c6d#m#K+S6(I>Hla)W~$Q-pgM(*a!@tBggSwI^?Wiu|`e(0fXbjx%TI$JV){UdiU zA_ijAWMcuTGWx|W%Nh5&nx>h_kyb3kSq# z_haa=y!kn=5FUXaKdjG_Vp7=kEkH-`*1YL2$fNKx&)pAy)`Y|mwQ_`&)TWE9^M#(# zmn?KxE2W8FIEoP#J#}A{TR;4C5vAYFEb?4XWZ2V3qe5&bhFW(FA}AM*ZLb!7j^WWi zvbDC<1S=eLBaK+y)FwBzV>+aVl*^}l%}-TKI4fy758Vi*N?^QuEw=@@>rywOtNT7K zC?>h6Ct}bbryuQ+>-PAD5S~;w#-5}A2@HH<3Q&)!hVv!zSwQFpys2||(@LXiQWX~yS*Gwc z2KR@jyAdF>U2ZLIE<>*`r`jaU~$3LIql)8RwT@$T&f_6&vlypHX# zVk3V##ophz!0^o(mxmNy7KB2Lm7Kp41uV|J;mkyT*fSQ@HW6i?_)~jwXkD;bZy@2A zVZ+bUkuTFAtjfeas;CX*i%v;u8|*BAsGt)pW=XoHQ?@~|?#XE5mhT1iuoGxCV9-g> zSowH5t zku3izGpmOzsnmHyw{1~>Qd{a@n$*Fo(U-TJ+&f&@V33%aO{4s+9<0&a1PCcT9>hRu zZVIkQTM1z`FYW6=)eFDInui%F0(6n-T9K2}?}jEIMq?yMMyd7!n(*}4q?X&Hh8t%t zeVzYG#1L3P4V;SVH}aY8_1EHR~5wQUaL$UE@EG17T;OU^Mso!cn)UhKT+h(d^+cY)IZy3m(ZAE*;hjF zhJ(T4vZ(%k6x9~g#Oa2e$%oq&eVX7_j|7nPD5pkeRVBy`TgYl?JZq?Cy&H6mAY^%l zIFqyPC$!=4QOEj(^$8LnKovp=qa$CTgb>OA|B<~Avo%KRqK1+S$6r?k$N@496(urp zYaFo8P4@63c1cUb(tqz!ve*RD7ZjMwG0Pw_Fm9RMor6zQ;X!j^2Eq)9DIN9yqQqMg zn_4qoPj>&w)KV;v{0H9>X|&}%vP9A6hr~&seVeIL8J?+T?MR7~9z?Br5o6}JCOuY&J>f{yTU$_vTK&ixOd*YG1dgko4H}|A-wDhdD z?n_cRn*eHI@MP%(#X$b6ofiyuA%_TFj?og|iVgv*NXg!xy&L&gxK4g1K2BCf+krqYLP7NkpF( zpSW>f1z(Ahe&W0P^R4H#9uJ%kocwP(n$Lih?jV;N!)>p(ccM?xPx81g)>MK1g;LFp z(Bj#;2kz9KzJ)Z+H$0im`Uk|+p5X;I%{L+$!Cz;RpVV0i)fxQZxt(AcH0+kSC2^r9OyUQRx5H86KuKup!frDnmL)O&i@OFx=LOqA-cI#S@}AN&+mIWsOk6Xp4heFp5enH#476HGy)K2Q1y4pY|Ilcyp2(Ge zcV|%k7qzD*KJWP8j2Nw1e#>Lom9_I)JIt)8yTAZEihj5~_=Y3uKoqKe;H|Q2Mwnid z%W7emtud#^+B6KOVUkYWc(wV7a`@ICk!vV@%!_m1peXgR64b;@I-wHGi%{*d!ZYshG{LZ(+4L$M{ZdCjY;AW*q{9s z-wpW#cN{>GOa6*B?n<#s_DVEfdufv%Bcy5Po?1+f3yA>0`;N>V#LEhe@I5ibQpe*3 zPu8o39dbPpwc%dOh<*pFq7tmd{$d=g^hO=`T)6IBI@k_{)JDUhFtVjwk42R*ne0{HjQYU_)PUIm zdr=E)1@nyou7dUo-)8y$leyLL-=%sX?7KnxAOb$aeu3PELHI$u7zGM~e$e)Bg7`_? zp7{5YyvXz!pnh-wuOJHjdMICb`*zVkz=6cD-`SkA5dXm3q5FHmzG8s8p#Ow#bN#<( zBfGwTC?B!H<69@yO??_@Tgg0it26#^>&)%T3z%?x~pxd!nT>_-OijR%H-2+H1?_Qj!m&;Unad0tQnxbx22?MYeL66{n78VI2H+n&{dOR}Nx*+#zEQwd z&|cBoPXAr<7oR?2ln+v19LyKaEj5H6oI8GhF6dV_kQu~J`c}igm&%m_+QXJhu}QlHV*AP2JM`P zd>W5@NW}p5FaH;m@c$3+Ce>F6vjcu>9ykg@By*eN zKZ@Fg4ZMR;0O3mjO8Y-kxw8RjArv69#q9w=g1~3cF6RDs&>V?d=e~DzKJZ)FKx7cU zDB!w3GQ}D^R~nG7?-k-51RF&c#vQ5Ox6cVy0LC7*f7o9Jh6z$v;uv=d+4j> z-jiJ13JQxpom0L}&c01McKn!Lj+?^)Eb<~e+UilzXm+UhfoPWkAIbO_huG$QZ{s5f zwJRvFp3u^ARv_z<2UXTmlw{Xart9~~^S+d_^oz&O-vi%#^{$tV0NsDb48wxfw!OME z;x->D(yDwB%7{0Q^!f7z%P-aJw5$Q)(`SKe|D4-36awB#AI%URF(qmfp^i?%Tia3jUM}t}o?Q304Y@u1Yqr#uL z8KN8u+i5)T2wK0c>*+kjchPP>@(HyKv=&iGSdAUNBo<$pvt~vsTij1}3oqF!b}M?Z zzCC~+z71az@xDdFulRB&z1BRr7bnH5DKo8&LxxNEZ&{&AlIGI4;8b}^xHCxAz1Axc zb3HLxDdgIjrp5oq;2Paw?Qs8W^;t;sn&b_yv@W4j>b2Z6q|;ouxfJ}$^W8KpFdoZf zf{xH|_A8J&->uK0$!Pf66neY*$BBNV_a4C}1dy?Y|L2E(#Q*6-?mo*lGRxuqjAWB% zeWJpml+%(yLo75j;=CvNS=c7cnJ)2^;+- zX7hlewE~EL)N+gdQnh(d)S7oye2@bxY%Px=qMCd|H2&NnEEH71=hsz#s7)Pef{^g5 z0eHGeW66MP{NO87xW_Ne3Y|5Rs(!ibUk z_2Ak(?={v?5?EFBjf&Ygoo^_x$TRo+MycWROQfbCH+XNezVSBC8<~hh2NV>1Kd2Vq zsi3vO7thhlEAcN6;F(=@YOjbP`|Ba@O@XfPInjg>Tx-(Cr?X_D} z`5yyX9yb+eto#fE+LB?2=L?1fYq0818*gs8YiBBFPoXrQ4BLarvxYT(q03XEM-!;B zS=Dz(zx6Z~&!sf*B@Or=hXS(;iP??irhvI6J}Hmpx{Pz#eg!eQS}fCv%*g&u%B9W{ zs@Az78PQ}7_^gyqu}9IX8Z4yvN8*z9KVgfNkScx+<$_wLC&j-fDj|7g7$gu|d$rRk zv(##fx$wrX|F-$!KU;wv;Qr|+%0MX$z66Vat$=j2nI`erV@OgF}5Zx!!TTz$Qu!iqEa znx9eH6>(*Yph2o9=UQ($@6(NiQLn;E6Yiy7(KkkA(||kYpmvaZ<6Wq;naUDUM zdi}+*X6uYNe^GGV+0)L6Y0LV>ku9s>;Yhe)&5uJP@p}>!bbEZtlsh_aOg@jIc$6km z+@-JgOzl=VcUlwBe&Ar`X2+5d%~&$vPu_~M|24#nGb9JAsYKb3joRYq8=Hmpb}U~4 z(dugekSlIhUEvv*r+2qHX_nV86Eyi7K0TM1XsXSAW5*PL8=+tIE0bgKgP{*b?jwl* z>zC>Qi6tC+swzx1@~_6|6=;0uk>vi)xGAagIj{wpe?^9gGkhkL5?pDA8F{rG2xAdxwm9{e^V71--3%yP7@rS z&(Rr+#!;0kWm=g3m+e6_Ooz0eH*j+ET9nGV=0UK0kf<9&fhDZ8_unE_E9a<}ijr^* zqQRJE1&~;_>EP^)ciL9+)4og-FBjD$Hrx42`y`ks&jP4jA{>?N78sH`l2dTO*>PpX zjgp|;%=UkgO)OYOcq;+sU)?$e-7o4}oHY!s3|c?=6rG z1(HJZg;?S#B?WZk-ZMt`h=q-X^0>SCgk({k@=jFzb`G+b*4x_I#6A0D*kfeLuma0ZoPL zW~G!Dw?Szlc`7w3uan*9xwU!B!Dm8ulP5#-7pwhQ)3!;<4lx!DvtU}a&pO5Q>r^&M zI%P^6j)ksA?;rv6k7gESRn+m!SEmN1SP5ovEevmB(uy#tON`-ZmCrUXq&oA9FsVt7 z)m<(+GLEbLUTmb)i-<>c>C$AN=OMs=wAmkKBiCop7>S~6C<{M!W^Cj#&9Dj9t%;78 zF-edkY0%oUN*U93i6d{AGRhwvr95@`(=a+|tYp>K)g0k9MQ;3uPJ}6qtmuM3Ex5`I zF;ZHKUSWcsF?C8^_NR|Z_KE!h=LU2qPy3{sNL}Y7)f%A%R43JsHIA(Q8cN~1M%tg$ z^XgtY7bZHy&^oyi%Rz+7tzv)e{5gVFoEi7tQ+rI@WbQZPaEUHJFR*bYS zP*?sg(B;e*ZhO?|HE%A2EI(b_CiB)IZhdNrxN&A(+p=zVTT*Y?*j*^OMhqo16!!{| z)ell7gllI`#RAYHf;w}g#vER7T&qx1=n$X_l++lmE&W#*v_cSO~+~e?+ZA#o`F<;x$+D>GT z)VoBUMiHjZa?00!tKv^+0dUWLYMIv@JD#|3lk3?fCDbGirv|Pys;VBurQ9WxQhoD-r32%7vw*cneqYy(JON%pX6RiRuZK(LgcxRp zcwQew=eG@}_rHet201iQ-QYtz>xDf-U7u*p%$vpr0$YVWUCDZ;X>NZgp5G}Mhd&!A zZ#uT7I%|Gu;CZa7DWZ9-F8}Akp?H3o#KsWcmLBN0Ajy4AJsH}A1pW}}=^uU5^?Tc8 zq|LzY-tiPe>vELjDTygut(!oZD)kad(T}`Sn&Y~3;^6C#=hk@IO$X0)I@6Bz!Q|qh z{Eff-zYP-u+a@hhD~kGYStm-~&hLK-kF00N-8sq=u{y;&W2;os$D{JC=E%8ycCfj~ zc+zZi-6ruEBGOiao<~%j9Th|FyeSG6V>>@5>8gR)>@u1dJfdl5{F==u!M!@D-rSgq zz;Jb3k6}SMF>2XN$my%-FY{@HrgPq1EOiQZUh>j9uHq+|nrDh*s~nF*i8alk`8a@E z+qwW=v=cDjUJ0OeI%_mOlHo9O97>egHOi9Nt@K1~*Y`xt*s7{O#4`6GzF^VTzKsb>>QoXrMkpS;&2H=Fgx-R$X)Z&Nlmn+jUFr@b2g;at?WzRona zYQ}XHiAD%c3OdAtsq+oz#P+Uba#_SXp$rAX8{-qrFC-E->spK3+@=HEh3*GOhEu_7 z3Eibf75@HpeZhr9C4|!hRL=h8dC5qJmcCopyyM=9If=3Nq>*l*+8a$^PS)3;)@cyd(Ts}_y zhk20d7xg#wpQE&Dq^MKLDb~Gyy-#hu`1%38aY8u>TQxktL_%$amv=G44^f$)w~$1$>7M!o_Y6`r*Y%@6wICSB*Hmg$WvJ>nfg<z5dQ_2vR!nm zU)O3l6(4E~5Z8R5LtVzqB!QkG|KKw%{NmC2)K&CTjH~nu>@HXJ>#ph{SkiD7{`Bjt zBKqe)7_AkW;v4Z}u-zC&7F6*&^G zqwv(Jxgg6#oL+do;+p17x!Sz2>J&oJdB28kpjP4gTkjB8Z^FX(vqLDpTY1TK~*` zH2E54QeMdJc22~5??~i)y+8T-2q16OYOw%|-Wtjw;Qk`J=fi)D8#{Lr`V`==Ao`wf zznc^1$RLl6p58m(B;GGpEg#S_=1ZkVE>g~oGCy5)1GsaWo%}^k(1;}&JFpzXo6TJU ze$q`A0~r~;_?KfC8z3cg4Xpk`{zI?3Q1>yT6De$h~2z>s)nkv0!Q8P3my9lTN3Eh_avk&WeCVUag)%}&iXN)AMr zC-2ShP4H*eWQqE+w`d)m$&r&~F9Mi?dHarrZ=xOVsQeC)m>Oswte6_}ZGv}J8dl%I zoz$Y$`Rzy5EurBU)h)5%Y1NP9NS(5_l*nAAJ15UeY~QQ24f(*<*JeGE;2b~k+b4#R zrcU$dUFAF8I9E=Gjrba+l|i81emibcbs(kdHXl2A3>3R%6DY^ z?`ZsYZ2cN#?kSPqH7x!_a+bL#Mfxe-VPXE09PTZ5&x&*_b5DzWF01@ExBaf_Ei@da z>Mb@rs_HEw>ihFbfc%9U(_oIl&C9u@Zt5*Gb_95SEH#>`Sj4flRm4JBRriqDv(uk% zelwS8K5LJ#fk(@}5t@Z&Q{E%>8(nF4X=e>pdlk#F;7uJ3BMRCwGi!t7w9E=-<^F9P zE-OWKS80_%3qN|PprM{}4Xef$#zi%3b1st>Zt|p>G(4DxEWabRVH3T#+HQ5bAlLQxuQTB0r-q9f)PE37UckdnfF6DBpW zudq(nHp)ev^o*ff#5^F_Dlp-3uf($^;kZOm1)qcK0wqLF0(=d!;tZyxS$trbuwROz zt%n?ee>IG(sB#uFHAcOCmwK>>)?5?&rX5y(E9DSWfMWKsYU5f`}bKB@f zfuVDh7iKDTbD2dglJvqZJp=TDE0=Bc zDe2ojb74qqJ}zy=aY$s??J=-SkO(66wIZcL3f1Q^^ZKfFLD+7s7oG7hlW45K$3mkf zlm}uJ%>hco-?a&xG;Np3m5 z9B@%yt}b$6{&4O|(b#8ngCq{d%q*&nj4ms4`i&spO39#`D8GOxe+=UUj-N8B80jwt zAOPJmfJIXVm4=8|hi64%z{XTj`Cv&W&!3||)ZPYVK&q~M=X-NfOwCblTU!}a5)IgS zsjwBsu(s0+0ohnUsex@B#y6(I6FRuavQ!t(%o+#_u{=O52{$ou#;+1?Gv^?`YN!0> zZz`V`lP;<5wnQ4MNQ}!i=klt(c*%hy(5osfZq3P}9!`<{PUyJhi8r^kBr(d>Vi3`= zDJ!;7BV$riUz%s~D#QtgS6ZHrrfjmh&93SL2O@? z3rs+LQqtL+Z|Mo)bMq>};bW?Z3l@Sx&mgX`C4pV$qhRDZW{YS+F5xZ_{wfQ@=u%U$UV{F|VaKwQ-B8ScOD~ATe^jrDw25j-Xu2M8X4lCn$L-b~ziO|LFLi^a|8c;kUM`h~^F*lu{LQLH zJXE6H_Lyh`KcB58A9bkGV&;kx8&CKlb8l;5UzQxkbn(yTge^zn57SmGX#8=)#_Hi^ ziN9hCH*m71zb*aH~n@Bna01 zVaEg0ZuxaYa@gT9DLj^P?}sE(^T&@DrrmSL6~*zh>wx4C&U00GjN>7vyDre`TX9UJ zCjXf*SXY#o3#L6(z!}96(dUrl5btg6KTZ)r@m8lQ(4?z#X8&=Vy$VUu6*c&erz?II zzrhnM=@qFgAGX1f`W{9?D$d?O&A3#66yIr4{FGSAb7*w*w4_}8IE%p zUlV#QR%KfEq$Or=MV-e%C)dOB!IX-B&?!f(J7KYLB2ryO~$0l6>*;ioM8;m&#==6PPz}T z!`nXMxgbv+Nz0-iypysJJKC)bNr3rShOcbux;i;60AU6dp9 z3g5Dk!wsa~V(mtly#3gY|Gc`S1)1(rUj9Zp7Ie~e+Ck1nYr8&!9l-jL_{;Qzvcnj!B9{^jK{o#ODM8sG z$0`aUOZ$vvLkSyhSsmI6DFKkyI1D>jk0_$WGQiokI5e5Ts*QI8DUZ!t?IcROl}oN0 zlbeAr($A3|@2)i+^yzv)>0CyM0~@Kw!?Zz4&`pVEi_jXf8m!HGE-HtyI~?mC%4NQ8 zAD@%w<_@#8nC-e4!s>{%c{m@tUSfCY{gW^17DND z7Ct{xW}5j)$+bn5gD>T0BL0?eapW!eWENk$Iqt{5PNX=Ls>e+#AKV_m1Q zlV@X8@h5q!tr!_l5>Kg){(Qw(3J~v#Dg61^e~tbs5L_0M!XF-H@&5N=G*>b`k4jTF zpxS3!F9H^u+9kWHbAY1V#pWo|W_lo_GsUO5(!kp2+INEyiks2#fvu)VNdf1MKKgF>)G_` zdmvWqrBBzf#RF1>VHAMv}r<~cL+fnjYAP=Yvf(1- zA*4@#R&kcEGIajT775-Rf2inQ?|p8?+vQbeR|8y+Y`bQXem%shg<%DBghsU((cs}#&9gpnT)C-Mb#>AO~Qj= zb$Pvuc7?4TY&yl{q0BO0!t|p()-jA`*S#U>9S4wjJ)bhpzX&ifW+;@Hs;`}CDF<*y z&yyeXENwp68bk0!b4WnPp^jDz-Xd${;N)vV)LkPvai&^5FkMP~#B`ya(kPbdWa82; z{U*};!5cz61nAF+kUz?FmO=E+b|vRwKiG*&iGm>)@(=V!adF8)?L%wwFr^=GEn%pM zMH)fV`L!w3mLUo70|A$wDP~{e2qnRZ!*pK zj9$+lJw-9XuQ|_ymla-<(kypJj#=gEid%p0D6*b4JH(Kv5N3{v)~Qk6B09vFvIfuI z=4D5YUXB#z>!_&%e>S9Q>BjxCC4hzcUU$ZLb5t2`+*d5!mf9S|hwn$2%xpO3OJeQ% zQuD{}kxyDQkV`?f=j$EXT9f`tE|$6{@yr*+LOb1oY&S)ot4CrNq}J*=@P<6g{o~n~ z?QCcqbq_eVyTT_rjb3(9!P`G!7J4on1+$FuEE_PTc3$7%<=WbfyEm<>Y|jP2)gcn@ z;$D&?QHWi3sEK5An4ql2B3^#5400d?WU zG*h|LqwA3zhE&xR8>XbW6*Cp;mfey=C=(>>S14->jl5X806%A5p5_vSdSKw^%{wvo z6q;SW2l9aWB!*^wvSTUUl+53gst^~=|C1WdEqj5-j7w+|Vn!%anAc0tCzzwYpagxq zITr*wuRON`^@$W%E>wU&U3|m^ef+WiLuD4;obH+(nP>sbIZawTKpkh!R8fx>^GNkl zL7dV>KqfZ^1=-fqLa37L+{xV51eCF;epxBqi;KAhyYq)i~M zLMacQVmcpI5abFQ}LJd5L-&W+5u3)h)E}F)Nqw3n%4GA1D&$F~u;zQ>^bu z*=J3C;8cnugT3B~_242Z2Kv1N2g}8>{+;-VWLVR?z4W8q$O-0b+%=yRDGB-orc)xj zBl&u)n}VXUyEA)4$7H=5xwr#YTqHXQ+ntsDwDij7Oku~F4S}-IS1L1L$**91|20M& zhWf;pJaBN_?{O@gOO^<+E^168ZA&ME7q*lR&ue?J*VkFfO|1D5;#^OBQc~jDeoWtA zlG&EAIo5&h;(Q5N8x3NpT8)vk`$AQ+IF1%>;MH$(zKi2@Bq3(+WQ5 zb$cEKYOJ1EbpiE5oeC~LBCTNLobrE?$W8zNE`=L3v zSzEBOjXLK#WWD!Ac(fPkDpdtl;GxM)O5Uz;ZRwJN*!OM_hnK7LX?v8*Q;;{Erx9~_ zrHUDpKdxksESMj_Gt`3yj0kIk1~KehL4jy?F8TzifxKV=z&k6r1Mp4?_5p~HL12)K zKLL}&*bsUo1~OrcX?Lz*KfVrR!hWa>h{E)I8_7H%{*V~ZhBcg7a z$v~vGbE$z`U}YL03b+RFP5_>v`R77nEay!Jb^vU`zcL|hp}*Q8eIP*4k+zV4nPGt_ zuYyQhXu!mBuq)X2(6B4SfUg4>Frw5uk-;DIJJLZP)H|ZEACd$A5Ip}rx50t8?}XpnkQUt_{-{JUs(mV>vF zz`1=NDPaA+54xQ|*j|<$ub{1TuwUOtGWeyBOa>ypok;!40j2}IV?(%*0?}W?!@Qb+ z;WX@TTKcLq)zD`EPv}mXbLa=T6~yyQXF}(%11Eh1fC8vIhMnj>UBEQLbh0z6b3qs# z^cCF>a2o~*4+c-R9pAe#Og^Yw#+wn$jiiiNK(UkE*F-Hu)UNRla5+J3fG(sxa2xcP z2?lP%1B^ZyQ0&NUO9G5gyCeqWgEM8l1)S5vw4v(Kz|eh&auD+EP#R*m+6-qj=bA9_ zJ`X@Gq7lswJJ=S93}&5tM{1iEi4V3-2BNYZ6{a7&M!k;SB{g6dye#W23^oOb5JNs8 zks-bEAbCNN(d^KJ5sN^pgZSjzi6GWUWU%X0J1l+OfJ@lROmIUVEPxb_ zGzH8K)p5wRJ_RFW|0)kF%($y7@If4xuu8(=gL2pb?a5Qz95 z8TNtn`XkI3CO~(f4yu=NXF13?6HL_SBnL6>bCQL81bwjVv;}V^gFE}KWFew`SMm_p zZ48=MOz;Tc9S)+76o~NJ5!MT}ncv4~{!~e6ildWSkA9v~Pqad1%2uyD5U|aSgc!6y zlLsv%Hjv$iMUw}g$Ff7bZGdzHt(*c5=z9XNLb0YfV>&m4(ZOcQcq4-~kd$EySa%5e zxM+k>yj#QMgO6m|QQHj$+=7o}y#u$O07g(Q|RE}a4SpiDV$0tfZXVf-9L)cCjJxh~)4 zPN+Vq|M_HF2}T8I;L>--QzTWKIhn5-c711(6D>it)6q6kS^Jr8UDaA;r*c(XN7X0d z(d~=B;2jw6{cVJ&rqCI0AynOyW0^&EqkCd~+^?&XL7}+pbccKtk}pHEK3Pgy5rC%b zQRoR%D_s;zPw#}UA-Kq@p#*c`t;p=siCMy1ktqlhbj^fiPvDX+iAXCbkhG=39YLR^np2 zz^!lVAH5b(FSKMLusu3Y)o@4G#0)nQ6vHPx%9#T#NVJ*{SSsaig?DGw*YRZ{wWIVbfe|plx8x zvm%iQ`bAA*fIJBYso~*ju5?Xz-mh}qxi10^%1v^%fzLfNr)zthRsRlk>jX0zz2^LT z$zbd->(NQwxe>p!Y+*>P*_KO&YExr75DjRB3|LCbwdXkZ^V0|;<=+pU(0 zOgTi^k`tudf5ZiTf&qFaqJXXlfYb6rfwZ*ObF}Pj8DsO!%o#P`18qc(LTBI+Kq%_h zplS<|g?=jp$RrHt@7}->W$4UM1w`4C6I8n0gbJ+evl?m#cl_RVvtfKsO`SaY47Py+ z(SmJA@kBBSfIW5ZCKy0huZAuQ5t3~;Y=}J+NJ&~GvwZX@a{HDlbOz@%-EW)A25*fm zdxji>8a$%~7MM<+NmSo=!-2g1o7RKzc})4x4FO^g3%UxL(cSw2vO^VFF8curu@K1& zo_Xv)as@x_v>zXRx%ZtuLb#U-Ri-Qb)n0~&jf-=1X220HAu*oWVq72eAg^SSY;6ya z(RSiYDR)md^8NXmVB}@}dWri}UfE?Wy|Gjut4(yzy^img6#kdvuB7{|J5g<~mB@ui zbk)}WDPPC4Vr@Wb6`4UVFRMY|Wyz{6uRAEr7PKn8`0j0R{5}v}yBu*@Rrs;KMq)4-_5tTtvwrNs(4AU6M3*;|wt=srjh*P5IiT{M0Sa3HV7+bV^wT2fZ#b-+7Nptp zu#9Ovb0031H*x#ZPRv>P^R)iLI}hl^Yt3n$X{`*Z!R^L)R>3Z{3FIF3|4rPsiSGqNrY))(C&cBmFRv33 zP{Dlz=eCbj5&ueOzAq{mcYcXUH6us*WEuCmz{YiB9G6Vyf&cgWq>ty#=%dNLU+?5- zA_0|X!Teh5{67CJ-0oy*6qhp9w2*l;mvWZN;f{Y47eGFSOZieVk7478|CV!ivMP$J zj$*nif&Z3vck(QX%ZYOOb%J7A$aFY6vUi?eoK2;G)Be8sInK07F``D|+j(&Ep|d&# z28%rJA|CsqnxD=Z!QTGO!e@ zn@kV(v1p90jkZr=idFRd=QUGnz)Q6J)UMTj19?T4P~(mE`E!(;XU(dy*riamb_vH6vT15@>8_=ecFD!Pb=MrLG1Y~C2YI6h{( ztHE<6<@STXf_T~f&@hcJ!pB7Ad}XR zsR56Iv#)N72Mr32GCzu|LPvF6$EBul1b;9qavoAz#1;Y5fv zrS=g%#`Jp0vTpO5@QywnZq@y29_dIe8Q2iFYJ!|<&VFe0_-dLY0h(#TTUS7L#!%Z*n^@cWcs~T{s+H z(4NtW<3?8y1Q*ReZ=^BI6QSFbZD3CM+e)n~ zw_oE373S3SZvl~6Yuo%wu>SSWwTE?+t<4U+#8EYFCpm(HA0^yFhW+c8av6t4ldkLX z%mfFyeu1tnpohA?={CH75BN{fZ!At8)qc;u{LJLM++cI5Y0q2xy`9xPl7w@duXjAP zif7p7JlaEEe4OV1c> zd+!i!hw^vH%LN^z+9v1xJrTnMmpo9E3)V2r@OMJrT>gyB4C=EBv*U{t>^mtAN3%)} z$1#y1{>Sv$4b9mN<-*P?%)Q$1Hsg4FFBY?P57)Ro;$DlmiTOt9P6zuxU1Ni857-Om zPBnCFEM5k_V+*td-GAC28}RHRUoPNTj*M;|%|>MOuHf}39@i*qR=~Al5Zs{#ALz~oi6VS+B(fAd;p6yb7ulBkPBK=$$ zzF;5MwgST|=Skss8x*l>?2TcFZ%^zMw4;mEfi(GT`?zuy*NV`O{=?g+M<9uy_-o0pUU#*rvUILQ zrAoim&ktSV^W)i-id^eIW}L1B_k3PzJ-{bXwJ{eV1*Rop&P|gz71bpSX+I~Yq)v{?NrrNTltpsdf1kpNvl0Xsy(2qJus_1IR2*} z`v_~HM`Pft=Ha8U)1=Wq^VK;+&^e>kIXkRl^#HZuRroFTlwB6AWzXCaWt?<`;&@+L zEC}^}|L+)mz$wi~c^J@QdiblwHlW2e zs8!deRX3nj_iylDz0)hkifxgWX==GF!CyMRE=jiZh#|b}x(^bTg3j0)g~oQi_>OMq zjKe7tflVZITv19#7l($|_dtbMy0Rh`=+4qr&cWS4F6N$jvuoI0T)KqyT|}b+p=Tb2 zWnvcNVa8cy_-Y-~maev>r>-I91;K0_Z+V?;FUH(NJNVj(?gi=zJc#ww;6nfoS&hs|PQXD^(#y8ylfLPPs()z7N?DNdi znDq6eA7|s;It_>yXEFCn1CAc``oia}F^adfmjAs(kDq;pZlbB{R;YUBapYUSkf*ni zAePM^lUE}~YBQS)dDP?n6FfX+cQ(f6yW3=ya!mvF$7TmsZ7-V%Rw-VGqHoK2YQzfQ z8?3o?x~z$Jv}AnNE~+CqK3D!HF!yrJNOs*A9C%%tQ5-oXG&u*DL!2mj<+g~sAK7~! zADL(T$e6C*gQspp`VM``B-(v~ScY20Uy`zi|HZYMG00*2K;AL3LUXpVdw3Q-v3EuG zFpI+bAwQW-p0phSQ!)B0&Sy`6ObEw>`y4F5}QeyHLFakV6*P2^XsomFW? zKF!#wuEeUU@e1NaU$lM;@8$1{RYGxjJ~Nkjx*9pss3wNb%eUHiPrstZo@(>$abVoC zj4Z&%(&fc5uaZ){j} z=~Zhu@lqPoe2kyPAl?dzEcmv)F}4CV7nW$<$v0}{*K3b#*#q86iQ#xkif$ciBT!{w z!3B(X45l{#zCbKB)q^pw9Se7v^h~3a!eG84!a5bj9=5W%UCuzS~Ue)-;j;isrcjx{N=|_Fm|#>R;lt*QDd`ZC_?f z-UjeO=FXVwT8k4va0znvseMI$Z?b*Mzkxlty!~GEx%+ni0EN6-A!p16N03z(5ZsSL zx?r@u8`;8zS^Z@l-&pE12d=xN{E*FK`=#_#y5La}e*hTmtC#rf2D^J3PVA#M?|;SK z7o~b2AS&QV8Kwcd*J2Jsz9oLRYo@Q-W|O8<=ZsB9p9jP5MBS_5!J`?zT8tIFo|obG z%d{owmH_j{qhZE@AYQ6qqT)k78%r19_9&U=aE40$585iN!u;UF0`CGy23%n}7cfkF zQt|#HHNffgYe0T@*GTs3qu4tld7!}P$LIYzs3)cm`TfXdNBx_#RGz>r@<4CSr!%p4 zgrr`~eJ7YFP{=C_Lz3vTe2Qp7KIq~D89TuPpl zXMz8S^e|JIVz-*JK!;bGf}^ioIX|3w&~mPV4m%5(M?6rW*BQAn&EW#;&L zp{6#NHxdp1)YZ!d#N)i&Uzhtdz)ns70WOf4kOqFSwhTIio6Y-_qr0bktA?0kSn*WW z3&o8h*7S)xR;&q*yF5;Gim91YKc~SWhe%*bag1AD%njW-BiK^FdKz}>jl{6k!+2z5`J&zT6n04c&Mc<15T3er9ZIF-K!?~0NUvq6oZ z^j}jl7s=O$v9>T5(M{6afin%i$%^hh8JzKqk~sjM=(qP@FmO*ouD-)E??Rz2Qz^0n3o7||gcfcz+!l!~l$JidS zk@5$+(Gf^w77Kf!^98>iDb04EAiR;F`nC-fIt7en9ltV&Y>35&GW@(20|$KSB15>6 zE*usev;D*QFkgs8l7(8@x6i=tL#R*yoody;-{EiR%J!k(E)qKSkEL@_?nXN(?{Te{ z9w4{S<5<9MGba?HpBn!RxP3OZBzV`>N%+uI@y%DfrR%XMmS6a}FeUmq*YQ1g-QCgX zSxlLNu7*zL=!amjO-0>J?)*)E&=vwPn{Zs z@KVmeEUfrl*M=}R?a(ZBVf_RCX8*4n$tWm^@d-5v1a*^5E{eI|Bqnmyi%otgm?X-f zc_T?~jCzwQ)&sX+9`f4!0pp`L#zZ_CD6Dz&o!l7x#!W1MbaV#s2_Aia&*@mcdFVw- zG7Ze~KVTVH(IIqTM1p*x`F;q{JbbPE(*}7xzN95BJ-)Pb zz*?3`hb)DwGD6NbqW{j!j=T&mtD^f2Gx%+C&9nD6vnzBGmN^6=6SDY8xwCoIu_DrL zDFn+3W>rI{wwN@MDxj}f(LQq4c~(CKvgrQ)Eeeitn#+>g<-+2nP$cTpTtv7Jj|==W zdt|45hO#c=AKznSJaN-v%=M1>?FDUhvuLAYmar5+kXKJOm3ZDVD$(`QfwGw$*dB zc4cSH@#gXHwl$fX&Bx`mx#qvWA$Upqqtwh$fG38)$i-U#Cz{~EtSoEDf;Uw_A;H9z zI<+{9c*=q`^$YE7)})o%j0JQm0xe25H>W_v7$t3NHuH5%>5xRHR>lH1_-h9Eu0bJ# zLwDK&J~drIi$izH0xfmV+aV~k#>|y?hGb?Rj+TxSiQUF*-hfq4VwOn{UbDI7QBv#9 zBT|rxBt$}Hw*64Ul^RRl($_4y8lk0=4RhbBfmb}?h&8-0&rXe&4U5|dgi7C(Ni>1S zGBIPAtY52SWW%a$RR?g-D$>aB(VMkU@QPd==+6)-Kx>XvLTY8dA{4{Q#ydW?#gKZ= zS!!!VpfWLV?=56x|F-jU%wT;U4~bVg`{idL1FvJi$zF(MNQa2Mj{DqoN#Wqe@0;-g z05_7_RK8)i4uSPplPBB4BaJQ*Ws$YY4$HESVX}%eJ>e;mnS&SiXVbyXIvkCQ-=T;s z{qf8$`K0OA&gSm^5~_YXKz|!)lj8X3;{t$1w6EC0V(BaaavK99?x!z}U%iaw$qA3o z5+M5(V)K}#SwB14S&1L@u>M@?Pm(;0Usn?3d-!7KqdtpjE`Hd>U~_)5-Ug@1 zD48;|1ON8y=#bZQ*%F*FjmFGgDDCRc|0m|xM5O7mgnwyz(Ye2Neqlv8Ob7L4PWf_q zevMz3T@NYorj{~$$lE^rnqaQ-sb#ir_q$FR%gSHOI4NI}65Rb#J*wc=1oFyel}ZY> z#r40zhJ^(vrMQQsd5fLp_SQwSpuD?r1^Sf&2^S;`Q) zJo1B+VWY%s-awptYpW+>vHvl@gQ?MEiah*OxJ99Efyf!{Uo-w$%yT=8h_xSfy01E7 z3kJVScfR|sO>q3^Hsn;8s9ESZuBpdOFq_a)ozFLrUuhZF8+~rgYFO1P50;^xjpd9F z(<|xV`E@JcDGikukNm-ZcBA5DT;c}%d&y(m+_lT2<1)=vPH9%TJ-v<(%e{t5eqXS!CMW*Dw5ak z#M<5shAaJ|;$7zlT}A>IFReVM{vMT#jUS`%O4driv&jz*o@$!wxuqTpOxy3{CO>FM z)<|W_%>|{u-8{|K70LUaeS@STM3(f=vs~ZFAb{Q~>;a&j9e3a;{!H{Xl}O3`Z|Pn3 zH5~boh~~Hqbn4U!1!k;~COCh?Yg3CO87U%L)X+A?*h}K2ZP^pvfEJTphYLMU!LVrF zbIjFlhYPCfre=OQwhBKY1#59V&f;hN;rH4FlIgD$8AGYC*8yl5LtiBNJW2!g8AaHu zKp>^2*>bzWpKo_7tvcqM1-AC9*>gFK`mNR{i)xS9(zr1_mr${`8kUbs8efWCtMYt~ zf1Ng}%r{y$Vj(K0_Di_gdY313Hs$J@WoMD*dYmm?|GH_$C5jrJ4<&@rZxAM#u@<1# z&DU>@+t(G)7`Tok%}&};ARLfVqW)^%seuiMdo)zH1+=f|ntMzVFA9&KGT` zr(aA9=7ZuZ>m_GOzf(fvr;@IgrYCKGYJ26@GR-=uFMb@F=$eB0~uiq=Qk-ANs zur`Z$QLxngvRri1tWqkI3wq8%ta@QzV!*CPa8>Y#5qAqQ!$4n zLI+2lB6WKe6_&^zgdm)X33;%>RZtG5lk3FWHEE)DI-FzCwIByj@y->8pSDC{_-QJv zdSJmz{h-zImpqY$@Lo-NV!_F0i;6fmwktA%!)RSZK|~$hDW(lMi=4G@c>q4IJK<&G zq*#C!T`uHO7X3$sMZTpKX<>zZN`AdH7UiKh*{AS3q&(9&g9*uuQdZs8GEvhm{P9lp zzwW(Dgh%B;iB7NK)qToaMOV9TX>5`AW69@Wc2+WnLN^`x315`Ua z3yCL=q8oLoAWom8F>wXbhlQCFyntsk;gj<6W3PZ`D&f8IqZ4HXBa@pSAfuwd=M$di zHqd5C+v^?Ka~){2^zo|%N60Zm<~mkw=Q@^i2R0a>O7R-NVMKh0hgB${5C%|1qWPhQ z{W3(|`qq^NBWT9RR4_cSkS#dHwDc?)^>}HGY-~|UY}j|^k^&10efV|694SvSM{(h2 za#TX`i90F_rC4lmj5QKi4W108OQC-vSexFP2FwUwhhS7}vJ}`A@}C5JKlC;&{J%^; zJ^!cm%5C257G!kjI(4vY-v#m|6gpEoR=a#Z9jr9=IvTMi*ms*0-U({+=eE(dI(8Ql zL<2tX6J!wi5>`a9pJRIp`4W*-r5>S6vOly>ABPxG#IWBAiVj-{E>FW5*;}XI3Z@)K z2qsU}8P_{Eqz(2;1+28)g#C)SoyZ8W-%ezJ?Dc_Ezyf_B4RCqTj3&4|ct#!k)CW=p zTLpVDKw!2}aDbTLBWxj(4^JkD+4c+*1f|bd15DGG$q3=xp1}D}z8|><8Da}>3=6CY zNrdT9>NkdYZw%>$dDVmuM1!0mzaxP8aDc+#Htbi29C?~`4h}b1OD$8S?FG>fPk@)2 z>eYn?Ffr|w)LK9U=~=$;@rAi`VjkmI3i#Zf_$}mKfX1{c; zB;n~7@diwtOhN$t+umFaKF-*j13u2e1wLO|kU-3bC}EM{&7k1zVCSEr#Ft+U9SftO zfzHrMQw3^Y5rxSNohV zkw(5^k@XQqnoCxg^Iy8=y+!kIwjUucv_PHQtP1-hoUERu)cQ@jZ^&bGZMl<-Rv@C4 ze^cpSyVqJ?PEgC-`P60-&|CEc zB58bzB$>)wn~YVv`IK1oB#k~NWF!#rgx{zWF%xr|qpL}yS)f{3-^m_3K4f1CWI9$I z3`h2zq>n*J&s_U zzGwUL`i|S3m3icgify>ydMepFjp%C?_eV(a6O!kxZr0YJ?YmQ?{kx>~grPezfwIRN zy<%5?^QGz3F0oCATqZk<->jPv!pBu(l;Y4w61oD5t4rUAF=|}%@OINOzoxoer89%Z zDqjGF(xPOBddsqq=1fkxEy$A%s?ycMJlk+YBxu@=xxy(sG4q&az+QZIek%Yw^ftZzTq zbFw^){W=rbRV+ZFeopZ#8@P)*LDIe4Rs5Lib+>j%@|NHu-D^<-YYa`|s9RDz?s#TY zvL}-1e$MCg*UMt+_Lyef)%OdoK)E>v&NU%y46q4H@;r;)Q(^26kpqK|{bX8~|15)Q zgqN(b9I7$QCqgGD0}n+H#e+N5Z_0HIes|5TA|u(P@mxY*vTmbWCye_U9$yz>cPa`5 z_+b}xtoy~NaSi~?siU*quleu_lVc>*Z#_|g-db# zb)w3&!}+Jq8XTFCagGJkRu0{V$jxC$B*#b^v5g&}WQ}>*erPKPWOscyfv~h#+NO4+ z*zw;4-tP4d_9+v4Ez<>sQ~M03WK8&GjeC2GK3A{a{zeKez}2ayTv6D=e+^L3 zycH5bjD-9^_9>5Q>khtUxi)K_mHbt-a#qsLq5U8C{dx-7KY0Vms%YLYjK^>r)hPpW zY|xQZ2NPmeKcN5j58dn38}14g6chvZ|GW75e|*`7bP&A_7SlznxaVbxU6N@g{#l1w z#8rMLdPJbIp-xm0PZ5m9mpAvR=cclhVoiesq%`&>DvW-m8j*;Hg9>nR&- zpTbfC^>>Ok3618XTF#i5DyE(70;8)UvZZoMj3Z=O1rTfN{apZvR;%oCz@ zAR&lVbW>MiefLmnlU_97#Ln%S;Km^{{EI}7x=CjB9E)8ZgTL_nGE@D`P%dW_dTqw# z)J>D5M4Oylu8cz_hy-RP1*9BRudN440|oGbrhi?$7J7ko<8q9DU+@q`2hX{b*T6aQMUbkwpRi`0~EZ z^Ev0Gbb0M^>(VZxK|lM(VsdS6M)QD>PPz%d2ai`?2F# zg(h_=EOlekoWy>`{KEvBB?#t1m%CZ?kdgU#q=vfoBk$xLFI_~fp6No1-QB* zXI|YovbA${>-1pi=mct$=IuG!nu%10%V+6Dj8J*lZT&(>mX7Tfh=V%%1#TCa@KpKsfo1{f2*&JTO8`1^lcsGRAvm7p66Ur#WDztzybRt5sYK}ZAONWR1zJf3lKkWsAZc24K zu(E}ozadFaPk{rkng>!v2C0)>BnERnvnD9X_VhFeXZzNoLK2C=uQOdEbSImdL3e=D zkwe|%)RIB#M{j2p)~`yOO!mbxr7R2Ao3v71b=tomp#zPwm@&)~Tbq;n`+KUrX3uep zWP@RMWa@6k(>od>20>3>LEzg(&-7AHJY`RwjU%B;%QZ69g(B*m!Z(DD< z9m?<3Uw=6MCJAk*$O+Pv6VM6ytjo}rb(a%KQ|MBTo!-a}j@4=@IdYrvrswfbZ0)P> zDk^xS{`Lc!gw-`68Q8A#is_EwNXc1S>bb`W;M!p|0Y?hHWAbrSh1--dn&kFRT5?U2 z?U1Q2{Ziq_j@;v_tmNYo$fXPwQ>hTfM)ypJKSz~%ff0J zeuu`JcY4AX+by;>IYjn7R5H+}ABT2#Qq8rC=vj+KxK}CPMyAr@ti*3CadNL?69}7Z zZ#Lvl1$*~7>+9?1PEKfDlEzDCua}MB1PONTq$Gt^(tR?P+It6^IE%h&m-0&V4Qmv- zMn=4Zyu_2t8h&pqhElad8|Dia@1&f={0M6@w6((=Z6h&;A;O9~Nic~u`NKUjEulNc zLl}=54E(f_)nGuE6*Uwy&l>J`qBB0d;JX(bEKCxtdK*PPhJKDNK^K)oF41b*!CiEL zE?%|s)%#}=(oJ{2+eiqxk)Fe?2T6Bm=$wgyhGHjr77^BzN*W!gG+|qY+V`ssx>zEB zo5f>pjWyvH|Dl;gg?or#D&NmxEDCLPx%qE|s$DUKwl^KhUoMpd1i|^3z^kCy5mXoE z=4Fcl#9FLoLL6@_ko4PbRp2lhy*rb*iooXs23dzJ>s+&p53 zg6f)H5P4yYSx$}^snp>%5po#vRS7?YG#<36IN zY975GE-nIprfv63xHug`J=RN?vQV10aUf1WJ?HRG(hYZhqMK~Sq?b!Qv6!FaP}~HM z-|d@+*QkF7?m$!9*Z*7@ev^~4{&AXw{B;gnZHO{GLBPj6wI(~)k%PF%{S-eUT|of3 z^(;SL&3{1LJ6I|C%JZkh=?b*;;r-(kAqvJPoa(gX(EYtfqHp}0)}`MwepFFpcRQM_ zbn&)cJXNzr^Ta6Q2{JN#W4=zaWMb&x2>T z7Q76F4tKh{W`OA1RvaLX+SpD>mky2)WD^oOmB$W ztIx@6NMwLmuLQy^xb#&LgKXcwP{W)WkT_HvJeObs^s->*rHWz>&|f|8w798*-PTXKy~+O?_;W@GH)HWn}NL z@d)EXCJlz5z`~$_(BR$i5MhWdh(?t%fY9&4{*vr0m|0y{jNRHbb! zfqT3`vWmmUij}32B2}z-JJA2!J~j9+e$3q&;+M=C!q zi%i!43``~7@-OUGx|ag|T58A+60^xQv{YzJ@kE0a?5HiW_OBxc`>hw8$#GMO7GMP9 zyEX!%S7F=$%{jSB2#4@e;-}&L?iuld?q>Z?R){PSE5>hj$5iNTC}i`xmhq_El7 zO5a=`CTegOn^)iE@;RvIoXryUO>p)%`&cXNk#Y!0bg68GcdEBG*T6vvrw%uJpZ~0I zt@W5#RmBUwWR!?vx)y)RwaZlMhh<%BLsrDW6t(i0jS}RQV(!MtFTmph_FAUf(?U% z`9Gn=O94iQX1*mp$XLv*&@VjRf6YR{54Sfb7vd+5V_~OWRzmmv6@5zM|1ESlLw%;E zKxh>X^boOoL+qV!vfn#K+GSLhQJnfSWC?5MgL3t2Ip)I2SM(bgKHGMrcHKddZCtcA z7^gq=WbKNBR#0tr?Xd0YgNA(@gd$k&(u3W7{)C%wUAlw%L2b6)L|{*}D<~29K@ik? zNyJO=%#t&dcX;)Xn}+fN;G5CR|2#^TnGRy5FK($_znXuC48p@i=i1K z06QY;pnB8>wV{n`cI<+BOLo{`jjMLfg6fvRXnlOP5Zdirp8u4v5Z1!=C=Ry421*VZ z!@uW5^rF9_p>06}%OkE}dh`b$p|+}aUV^Tcok_qHXn|M|XtY2Sh!~nE+-rRV8FYZg zU?Mcx5_r!YS>Ql2xPWf93BftG9LFpKhCPUD8$4x>p zpb4QD4lS^n)4r0}6L|dq#`WY|2hhy{#q7)&jTo{r#6N=S#4B8Rzwe0J>lvu|&Yw@Z zxQe9x7!?(J*DM|79M|aH3biTG`}i4`w)8mX`g1Av4)Fcw(!}wEMojH^v*sQA+NQQU z^xQpSPOTCUCFTrW-Exfod%m_BpHeL+QO!sC&9y6_#x71EV+mePTdM}oG+(?$VmYoN z?@M|}T@LcYH!%+3x^`UTLmX$8W~P?8OO_m2C#H+>c%%$ZA2~X$n#^=%$?}-EUd3dx zRfd#Q?IdW)be3u3AZVz*>vHhij% zBH zn_;jdcXllZ%Ak@fqUb{>z|E~ra5kWipG1KIg+)-7^Vl`^b%sxcRm&tm)Tt~4+bQ> zBh0}Ne4HDR%I&x2D2!QG5zx{Nd^7YGF7ORl#2E;CSJjsti1JsuQ6u*tikE-a;a|Ui z$(02F_fgM&n|QhB`WIAR-+n%$!hpEN z+Fk)mz!WH+f0J@+lhesk+^U^-P#ww_vt)rIh>|a zvH4SVT4nl79{m8$xTqT1FXk(cxz0P%YPa2adXdy_{j?d*v>D_m(GX;%_LG^6-XyJ0 z9L=vccn7@#=zbqN23;5dV;ztr5zZ%1iVlrUR=#P;?h=e!gZ)ZkwYogb6kqmBXuHdy z{&vveEd|R*rao>u6H_?G0feJcOMvT{GbJ&~=o8?%(Nc2P-3_7Za$kY#E->f;@chrj z7wdl4OPaD-TQz_LlOou)9pU%06l0$2Xu{JzQ`igdo%k|zx=l!GSuW$!D zq#T)`AB+JxxVNf$!B@7x?$@}R0V(UWNYw_e)Wh8h4$L#l39hNU?^?r_3tUQh@_Qxi zE|vf~8si^5goxo!_+o9M+_Fmh#7|7czsXqI2tIBnA(<5rtK}V;G@Q)7^c3Ag3P`O> z4u}wl|GQ3=^#ktiqXPGpbK>`Z+O+1_SE((@v6c`})t!+U5s;hYyuaRNxH(L6A^n+4 z0jA3e&{u~^E=~#3HTKOK7YhPVJ$!@ZD5ak$?BmZ*8%@S2YwTmyCuH`}VnSFg^23K(81>4D8@oge$7{_Iz6)5UtZ~SzGi<3bfKV3mr>V09HQV^g zX5){dl(ZC|SbJPGaOrI2SU#z>z+arEPw#%qOI6phAdsXwnSWzv6$9f7McCM8!gauFM@GpI}A+NS!T} z%=f`m;_>_x^S|eB4Gz0VJ31~@lcr;Fc2`I1xreZN<=No83GGW4fBuR!@vfQiR#ko1 zJNX3?tA-KqHsS`Rd7I%|2z+uW{aF3;`ARBE{L?ilzGxopTc)DY$EkY&@k#G%*h1jN z2gjQrI{D=h)g|7n!AQ8q0R(&3AG2o23$}+PA@*XSms6PME%QyZ^y7y6gbY)<53jT& za3tMkKJYJ6=|`%)vFpQl55+RDmc7CkEsqhg!Z(kQv~(ywrh!YDu$)GJYI%MBw;lRM zIjyxmbC1`$80$zr_mm6Xl{mj1A&zSA#T-&CfeAQX&Z_)`qlUS8r` z5gft9y_OpakbRB|)e?Y~S;LZ9|3t%cGAX3d!mhh(*JL<(b>8tGT7y%RtsEqdZV*(qjlm;#F+Ao z*W;9#E}#ukH&kD2-B`WHORLw)EFvN!-21rZ8@jWdEjLBgU@(_%IKEE zNg%V$(A4|aY>MWQ^-FPDQ@Aroyh@psv07W`KDUDU+m}t(iP$fX*e~%ut+6eH)!4hP zOg4fWB3N>(szqTkQ?4;8>#!CDlGmKYCbn(IybMCye*NJ?G#;t}dT61GPR)QZ8F!`B z0tpXkM|qnPb3c&(_l@9YBH7|EOeiQ(-v776gOkF9?CU=dI z$r+uJP{JDfoK2lVlS0KQxz8eTBT*KO9X0tmo5nR_RG0E7YW>@Ojl`zZz7}O0rjKB< z*JmHPt7?|=jFtX3k{^^%_7E6YciWN;m#(n zA>!A!Y77r;csJn`5&9v`^i;cT-v+{ZP zAD)5u@y@N4kU04(PXxUcQy&>^~(N_B77@-4tERo*<5_2AHIb@OC=1*1^ zS>KXLB#!+MI&HcUqyYV21F5sfi?6~~4z^|Co)JHv1nYcbnaZYkV7Dw$dCXZ?63jcrTI>+G5f;inzY)@?4_QW%>ZQHhOo0Exc zn{S-Fv2B~1y}P&S-mTiI{&2eL^!d=$-KXl`zvp=j9_w~ImRpUTOtD}F_W}$IMFgz1 ze`!Xvg*K=hej9KR#teB;BR;_c)Mwr0=uo4yK*?Lww}(;X?Cgm=MkCB%%;+iNVzUvU z_D+u#Gn|GzHar{CRBKqkZKtX=0v7oqG;Ei z%Y_!7^$KfauAGbK`gx2n%Q(hl901$Ddl@mtZ%WJF zz22K!sxMd8=IatfM(pR*S;*?({8l+mMfSffcro`bOYc`IvrJ%oB$1I#Y=U zrmK!;IEsLi^iRW8a8;CKNG@5Pr1_dvP0L^-?`9O!VpqaTM4wNPnSC-9sw_8nZD0f!Mh>Mz z25~+SlO1p*m$^-cD*cQ=nto})rXv1E;KS5@52piOj#0(U(F9`%0xEZMjsL- zV1PY397>su%oRcY1?CKPYB+6{pOX0Oj5@z!kWOZZzb?hh0h6+Cphx6|#tk=os`b-R zfHr-qp@Xn0c?+x>Vau6N!c#t-Q56oQd)l8& z4IJQ*Mui-!>(eOei;I?ujFw*7dL4BR;2#X2-ONE7SOyX>eCeo%JefF+%%jDX$= zt2EMR`4NSsu-_hrqj6H}=(s>embTSM;+Fr}&?~mhTQ*zJ!6w^ErZ4D72-5sHb!0E@0-y(5&@v(t$V`_VO~)-Mv zn-95ZOz7*j%Nz|Zb>Ay=&OER}Ss7$R(W|MLL79Zn2V4)Oux6KK>Opp(p% zh9455eq6^UhKaYAu`t+JiZ}0wyfarqUewWG#~OH*O4?K$0J*v&4r%r$0!7vQpbO9o zO!_nMuc*vf=+T4M!tL0YY$|&lenLlcOojFg3t#C0*)UHQv7$@r0M&>R3r$=XZzTNR zww5BZqH4X(k+TtZ%Y;jI0>B1#jw5kZZhTD3Cg-*(h;7v_=(tb+C7(I@u-FP0Wl1yPb3lJjFym3ff2kNo-gnMxEjB zDvUw%88~Qtfs$Z>T8%8F^O#09Rw5G_gN9->;kfK^V%=k}`Ech0klc~=MS(OKBP7_? zMlDGU=gsPo(;XA~jD_p79kOAbRY|FIb6DMad=!o`$V{T{X!iOh&hi{^PRRDi{^%0p z6Xm02v}LdbTvkf-&KpIF;FH>yz>Tzb8S_JZp-xB(@2sr*GW@El`%2mW3V)9t zosM`HHma#ryQ$pK-qXFDcc*`{^2XMyzM)X>Rl8NevD>@Ax!Sg3>&~^Cd8WV`Z27Lv zY{~9hZWiBIg`aQpvUg{V68KgP*O1nyUClrH`u^Hmx(mYT2?*YVZgKbj>wHHL6ZS$J zLwJbt40sz$#X8{^o=4UH*UcpN`aHtsOE^@wa^tIA><1N@L+XbVSuyYfBLRaoXPgM| zZNBNR6Q{NjW6jPxYO9Y&KdepnW4&sdU|SagDnJAl5sXl=7ID2~d!QEu;t5Ow9S@8^ z{u*VwH4v@$4+Ih@67@6HH8TVf7@^uV%r+;@vrMm@>NWJW46H23H#I|bogRp=?EoS7 zBTvyD=h+k@4|0mi9hIwM8}B+fa0@hB?V8PAsE@U`0agIaTea`V-%jCLD`4w;-2~Vv zU9Saf6>PhKZdGr)f%ItgU4e9q^j$%8EA@SM<@&Cmy0!X_0zMu8>6l`ySf6_yIaa>nBFQhBYfrhwA3OneZQMve`l(ADcpYNo#A;mNf%-57S&En z{!IH}_FVm#Fd!E@B8D zvIyu=w2s-gvsvR9;d8Cq3S72h6h7zd{g5-aD-~K2-23v&FpcBk=z)3QDj}-E!k^o- zvB@&pl+#-6624^>c8c1sW%H7m{EBq-`E%U^1E$(ujy0-D?_7+X!53>H_^# z^MkS3e|8~|7|C-z_xZQ*?q+cIB%_sNnhGSr=Q&K@GNrCD6R3ufYWXbynA0>M#H_li zBZQW+3h`m@@4mPUVJYe_B~;x%UVP+MHEXdzzqOuV*$c%q_AuzjE#u4+ngr^=@;HOG&Bcl~ zBC#s5S|?QHCkh2d(z}kAwHIOs4%Y7Jj8vgw__Qwmz19w1E!M1!%Ad`o=)GXCZYNK(fkzWzRRp5crN>fT`R zK&Wu5qOVXIl875Vi*$iavu}{yp|K^n@9gXBHSbJd%=pS@1R#`bDkd?8zyY2e&oC&Y zY>Z|hXqxd|DP8LzmoDqIz5~t00sl|y?x*XB>BqnFZmE^BAGy>}N?Cfq>5zI$Uux<( zPy7Jxl4o&Z=Jj=obyuHAmF}H+R_Rz{86wfsVbo-KTwNC5WwZ$U;M%!)>eP6Jr*u{8 zjMXo>C^RfBcvIJ$VHPw6)iCD>lv?W8J-v|KwTi1u3g<0!s+u>`Dz0lmiJiTKj*rlw zFC)0BcpN&(q@gbxk}TfRM#ic5n$-2~lD9mMlsi%i2NWZ1$TIizKZ*^wcx4=^Y2>=` z3})NqQXZ20)OuEB_3MzX%4K&tAD3H6-Yj0E=|<2PXY$~sSo-Fj%=5f!28^?Eq%KmB zQr}LDdMwr%#6BtBNPO^y?$Kf)bq6{sEwxeYQ*?U4kgxNDeo$t)Znx3dz-ERe*vY)T zaxYpuy%M{qWrCIgEhwUp>}=afUQZ<8S)&g~IM>7k>VGFR$2^t#91Wn5!&DyP>I1%i za4OTvTFuKwkL*8lYZzCD&WIKdh+Hdl&Xthg?n#CiHY>Wk^G<+54cVSrOH*|=t{2mV z^?XO#^Mhe>h#GG%0g*IKF0nQ(08f~D-D;XMTtt=fcQne6;NtV@U6ox+FMju`a~xt9 zE>+#PuH8@?3AMDzBphuXOK-Rw<{_kkd#|j$S(g}{bJ%bj&ERDS0r(zuf+l|_>atPGN7w_HV#9I#Q-P=x`pZ6yjiVf;?+le9bHfoSrm5fJE}vMJ8x9y0KF|TCrf9<4)4p64&OPK+xi54i~U*$ zc6ZoL)w?ThPgk0s?a}6w!`hq2AyVrgl+Lb5Ach-Mn2%3Esh^v3tKj+)I`nIpS66}* zc!YmGMEAn8G7m>CK{R>Eo@?P=1q3}X^!c^l*GXG~2o?o3Fw;@g^Q~+4mjn@3IN||d z6`VfEy2kD4I$sd}Wv4s9{L3E)h{>l?XC#!yrcs0Md%YQ)e0KjPVr|!x*Juv=n5gOiS2<`#MDh#*`>x~BKCqlMxgkCwf)|01129Mq zgl0DR*}~H04HrQNHtm;r2Mxo+oDMVSX{|9E2ki@|KIXdZDc5%X5u4CnK0QFZ^&bXH zYVx$w(axV-#a%WgYEYF9$HNf)>-aF}YSI37nE9Tzg|W>n8_=+P_B&Y9CMOz3&1>p$ zojTguwXKZ0U$xUmCU#OnX^y$4uv+po7z;l@%-O@_Bl3aBIM8CC8^o1tEsa{-tC~a= zI%WAPPSx4y573sp4G#@Q7^T0|7#<*IqZX~A2brWqj7wVP3B{*lPago$dNMZ;b-j&So-T-bW{job5-+7FeBqwhewHf;r+;YK~31~i3e@5E+TfS8w) zRnnZFbXweZOOx?tb$J!}0G$rTQv}V$AzZ%#x}WgD`5i3{BWHJE-qs3^wD@giT&M_8 zuTC9ODFHJ(2rf`}P+kkw2`5dN`T-=7mg{F%SjVSPK#!y}S;A7LNs`xSC17;w+ezG^D`EWDT!2yV(@W@rR7 zKAh-s`jK9*1ZV4gc{}TVd3_UiPre+iC?tx1sOC(VPqA?&b9K(3VN8P||27xu%ACEe zeV~29_GXRH9HdYACd}9>H}Rw6rh$X0RDM&n&MiTF1&+6WM{6LhfNTgxP z`J1A^NFkCLG^S4Z-{Z^_Mg81~{f6hRR1BjjSX+5m5k|yM0?>pU!8#j#WrHa<;Lvxk z0EuTZz(0G*hJ2!f=f*vC9@}S$xzgtI!~}Ww8O1JEM<(`+MK7z$H+^g$b$vcF`4knT zPGc-qJY2#Ut(EafjLGFj0|JA`4>D=PxVWn{5H@=H1)?LWN?V`1>%~WSK%5{*wAhh77HDRp!j|JZXGc ze97pz%$GH~2MPMf;W)@)!=jr<*|K$IYwN%>{Rr4qe!7s;CdL%WVWT~6QjWt|rhaV% zjlboc6!t%wI_AomIbS*w%hGM(C?#Rhnv4D(?pHBTQ4?%KifnbNM9-~;I0|M)k2Y^E zFBAmN#+t0lGbaedhf^lFs1%JcR0H1j&*eG!`Nx1VG^2CH$l;{54J2hq+B&@-j^r zmZ==l$72a(JE+)dZ8~;Zl@>^|Ii$N$C1>Ok44`O^@HndQY2O70pb3WQ^}=?!>G z6(7$&Fgwj_6K2X%yqM<)N+0M(vFVzcG>1L(TY)j$D4=tBk?XDLsuvo%Klk20Lr-6B z^!Tv|goLPZKs`djszr8zu=D6kFBa>k@v)SZN%b1o{er=;Bm9FC#^pxF&d-f{B{}*t zC9Kvdqb#gjTyKP1uU^)WQ&W&hfSsQ?;1+vpixVX;dG#$Wc98OUi2U+8JT4;6Ymjn~ zQfF5-u2pLNqTp&~kIU74uw<}=f0w|apY#&_scrCs;KqOX6a^_Vgy0qPwOGn~m{fpP zwsr7`ZmOuY&@=8H>2*z-JP#**7lNu4+;Da3GUeBQ2Lr*{Gq&??K@KJYPp$wHDK)v6I=zdBN z+!)=U#g!`H3!1c*@EO7lP!7!#)a7h39Ol_whZ9Db@$G83{)%}JYWp<;>AW!QLM3`I z>B;74&*C!3RXH6iyKt+)`hqwtfk=!O<<0xiEk)8Ac)lY-(9*9nxyn#UNC1nB^P5t> ze#7X7nROzKO=}6kSgei@;Ci>?<8in8BHL}7eH-&L0TZ1p6t^Y8*fO}}AOzG3F8di% zgUtxh!^U3DVxFO%%ZX^3V$X<~46{bjYNsd~2J<$7D|5FXAt(aOLIoPEjbjFp)jEi# z!U;YN^9&3TNn_nw!+mCt8!HRetgZjIm!o#Bl7X?G+@&J77W1oQN`OhjI@lt{YD`7t zY6?jELTuQHq_Mh~Arx}1$qJDI0=Z??k32-oqsqU8U6>lngne*oklw9=HRBOQm0^Zx zbv_ZsBst-728kwj;r1~b6^K_V4TbfT;BgqtE1yCxZmSip|5PR$M3y=EQ)FXK%7QY0 z5rzleyWdxYJRhBj5|^0TH(t>m?aBvf9YNMk>}IXWx1nvEq-TdY#3)jRltt*yC_2)? zUzTH1_++CaelYp6`aPi?{vGU{Xk7U_1lv+>YDKs!oKu;C3{;|x{|KhGZE(Vv?6 zMag+r@sJX{DvE3^sze+rU6u(8=jf-JL&HXu_W0_6AQyoN$I3t>0^PuI#Vfg)6_f!Fht%$o@G2Eg>)7(rEq^ zczcB!d(dOAwr(irX|1w8fv4|GEGqBp3v@xCM~xys!(bma)*)|$eR<^LGfJ{!{LRa{ zm(Wh%rUlE@j?CmAA>Ku!eC$_&; z6|StRydq?rfSz#o%UDE+#Lsg@^m8Ecw~AN_nrL}dxHdEiFD$CZ%>lB|!Y%{#-p8~% zjj%*QNp_h@_*1B*L`=gfy9oP>wd*`6Gug^H8KzX0_4qNP_zP1)X4U(;+FV; z6INl`U~zP9JaNqeX1?k`SYd>|iM8>5YW^G3JqK_tTXWDfuaxy2E`T=8{@n<#RBFVX zthD-j6ru%bN&3?rCGxf{%|}B}Vl+|_pepz10@6r>1_$Cx#;TblA=g&QfhR4p1(F9V|>FY1SOlD$?eC$yW>i#o08JAUajWAI*WX#Qo;61&rG zwhmG@T$4FyCN6LIMp>HG=5hG6uGjTDq zhWI^Td}srYIKZbbR?Yk!XQN{h>xB{}N>~IBMA5h^(diRKXme>I-zvE)Cy=%~`gWAI z?UCpkbJC;2fb}+pIoglfd?}~Q;LuCOl0GZ1=&X%2dM|cHJ0rE%dzy>NI8nE2uhJ(& zDW@o;;dJnzcKgLBe5nuLGYt0J92JvzMZuSnu^aNtae#ZOw*6*x{Xws?oGYj`WhQ&$ zU8kYAPQt)Mr7Q00a;@}J%Y@%DWlLphjPgY--W!JOOFYWjFOAG9T4XQjFd9+5wh&-C--fwHllQ1PRRvWZ=$9V6FwJ(KakbHBgg z`MUY_z}LMY52~h7sm+HJxWXB*V)|dF@VOSOxBJ`II-F~G)ZZEg4BY`WHC(l7ijxWm zmXxJFcq^QPi!NA$)d|zG+=3>JCEzud7j*Sm(AjH&1J(`ZtZb-^X&~nx1e^M*f!1Jl zm^_c#z_)SoD+I&}PgF}?d!$KYE6kIwAgCbjfSRW_ZoTuayj3%(YUdX1^T>k_@n-3;~qTI z@ILrA{m>6(JHcNvj|!{ig1^_!)#RaaefdNlMGm`aB2<5aT_f11S(NJhD{#dQE&q4H z@)J+}%NrY3)`BIueR+PrUTz-r&7i!IP{@EMwBNZH<0oLEW&$t~cLF$mD}(~Hn@6+` zR(^4Te&t~Be!C0vT*3$iy$8vMNZEFf`E6p980#tRC8NxGI)-vA@I24zE@{S5EiZf4 zFZOk1)xWac!ar7&E`O@hH1r@eoml?8XK(EH#aDdsynx)Y-6UT<;Ve`;UHH$Z$qrH8 zE`MDHetJbYGu3HyC!LV#ZCzrdU1F)FoV=^{$#EC0TOBvN>JIGc4v1*)5V+gxi`C%}&iCGQR+|1ih(!EtB=8-4B(QbwT(`LXfAp zz&HHuPY26dKjAe=9GS})mSu1(#?)w=2CV72GCRh20VGypdH?K*e5f|d5AHwX&v}KqiSE420azOex>0{ z>-~Nen=7SXrY9NvdNR28`=6p-kN)KY)E_^7$^7pKAM1aYbF*Odm4U#KX&KW${ou%` z!l?a+7@$~xNEnDRbNYz&QTr)m!}iJHrA>E@DFT}=(W@dms$BZIRQkGDO3~5X#H`M` z8zYaGFwUy07K^{`HjUET?g%_~a7kZ}Y_GDnxSzV;F0-)nK6V1aB1$FCM+*dI4}Zcr zQHeAjgo_z615i_o=|<}4jJR`$0Jp3dgaF4>*HlD|km97`C=-aNJQH#NP3jLRPN{hE z!MOoPP^t9dH1d8_lM^HE1QT`uPHK|6@0248fKgr6fIH=YEp=XFN}oIFfG$<9K0Akg zG1AGA=;$z9FXGOTie}2J&EEtc5JHDpr#;~a11P3TtJ9uxgaFiN_zpOd1MF7bRp`_j zveXg#0SDr#S?ac?Z6OD4bUkKmDF+;>YZ@H2*2Zl?2ePRh>X)W%loIQ- zmjDbuTfEOkR}!v=T%H3DOg@Pjxyqy}pPkKh9Zf+wuB=6b%VTW~-Uom?H?XAls-4CaMHOl^6mX;<8HWEEL8-|U|!z9yTm9349 z>ymp#R#pY3*V($wB?kSTpn01kXOkywXSmi|OItTW4rV3he)(VXE5x`6za+9B zyC)5;*$?Cc9KYHk;`6ieJ27u-vRx#IjXp$^ra9tKjZ@c-qgpdFIj#ltM;ADpIRe<= z{!BL^SHZZDn*17Eh9Nv5@((O})1uszZUH@y8A6&G4KxMI!kipQcSzoG&T|yDI&Pfk z=Z+K(zZ$~X$tMu;2&$b^eWsrZ_(Thd!SY^9_u|Qyw-ome)KylVKe6hbZgTt^IXnwL z^+ji9#O2;#_1wLAx2X33@rfJuAbPbGofuv8<1h;3%hjdcMUy-bF`_)UDWlcB8=9u) z#iK-*!zki8A;lCKy$~T|D3lPEcK4<4Mv{{T28N}QKdoB|&Myk6^zwkX zSK}$67|E9uPEe#UO37vmAX=J=+)?UP*S2SHFU(tSKMG}G^y^)533FH3lzaFD(3=%o z+HajjD?6+GJ6cTCVmi{G$8GQFkU~Hs8B0TZX&D8;XUi$971l-5^Q!$f(e?O!D1yF6lN9v<$J%_G2P>w70Vq_rQE^<6yjj`!AN?cB+%!bLNLJ5EzI z#Llj67$+Bk&J&cR=Cc5+XR&+~T4gTWGFOjs&vnX}9%jnCdJC!89`h-T8$HtM+&E{V zq~Xh7Xx2sYB3h`d5ielza8>%PEImZFvnYbDG$aNwFBR_(qNRYucd0eXtE8VNDyy)p zmJE`b2D$RJ0Cy|7V}+#1KUum%fAB5z)uxZ}Y&OW8R_l-+s@adbs?jD@s8|XIMHIa)=unplv@hI$Hj7JJ2s ziR-(nOGXvt(00uoM<&l|O3meuCkv&N1(hp8TF|R=Iu!+k3v!PqFTxHiN)D*9o9lj2 zhc-RfEu4#vlg`!}Iva%CglIaQUQ6!nq)-f0M2A^Tsu#)>*tam|%h@p1Rnw>a<;iVq z@*bZL9kH?$cMO8b$-EdW*Wo9iK&+4?z<{z*xaK>#zF98N^ztDPT01R%~CmN8t&ig**t!^+*3m6M<+c4Gr#N@2d!(B zdC+2VUrJ~YZ48teHsYe@MX?kx*@Vu;3dBOCX(8W*?HI_d=@RQ%J{x+m_uwiXbm7fc zb$JX;+qDc@&t+M~Yh~*7%P(on0!D1$LNX}Nt=ZZajXNA|uaNenB@l7lCsPOcJm&E} z_{S=9jRZ`E#MUeDLK5lw{3XZKkyz?DcDwgV<<)WK+}JDhIuS^fVThbH#pD4BB*_UDNgq`#ddtYHiF}+dP^> zWbo-NMrylvdku^F90TU?J?q`qMG5SjmaM;FKlx4p8Cze;)p`umzIK}JjZJ`c`thL}l~`w-rg#Op8R3 zU^s8bZbP{svC#;~qNI4$1&mk5Z1NmW;8N{G(MW#E$lioXby9CSMz-jXWZCXKZyLN* zD7{aTZ=zqd4a(aROtC~3#}}s;2b<`nx(&IearsLX)0xmIY5c2GuEQHwq|fAzHjT~C z*de~U3j}a_b8}eK^dg#Ybz_V)C#y}bqD#KftV6}Ft~@l2G+u9x(%0r(TNc}apXw-P z8yZ&6;ltKwAm2dQ?>W_kS7u;3z zbRffBnnw2h$YlMq@gvpJPR@h++$nS2o8TG(^sdRrxa<)$x%iUak~!=Nyr*4o9z0T! z5arwUh$lfcDWAR6Wadxl7hi!d%W2Q=(!9XeGMI;Xc|raHU&vE4iiK(6k2IKv1_iw= zc|oWLC$!TZ;g8PX*OyYgczM0B*ASS8DES_)0$-TZG>QdAk&oNpSM<^^o`O$Yk}r>ZnR{#9&ZzojaO|t%8Iu!erl;=*Ui_i8Dgn-0)meBY~gU9Y)!j1v&30 zvI#nRTm~}f+D2jwqGMv=Dpe4BbP?_^G0PM2lsGBQg5-i!+kaYAXau!ig<^O5^VPv& zWz6*eg8u6nULvHH{s9{*xu$|U*Y}o!G>%8LPLYuId8~0_ksQd8)Qo6GnTkhPfumN<=MSDrHEtInYJ7ta*^`nJ8nJvaxV6ok6dt}rmoGy6c3g1B zQH7{3rcG%>=Hb?sXp2I0JErvmKm7Ct{=OfthO~&Wzl7U5M)RbOVvu5%h?4!?SKvOE za5ymAx+|P zJfSV+>)W^g4s5j6mmS|?rGDh>7m#)0xvhMLrH`EzV7YT+dh<~f&xqPGKuwQ`E6zA2O`X+Sju)(tY z?Zc2w(Nz!pX$WJz$9m<1);>!d%nd2W%FldOEOvE4OU;m#qpqA&GkIBR7QG6#j^H|u*MVf+s#`2!9+BIO$_;ZGPdbg?IU(`h zOI^RpC27Yd1$Bc9=~;58@yc8t-qf!=FnQ@{ULD45f9kn&;Osm0<0~?7{$)?gOW$`a z#Jlf;eiZ<;y)PK+T+(LwfSVG^ytThixa(X})&OiQCJ&A%+Sc_DUroS2A`i5E4H5xh z#tm0}=Z}qtiE@2bb z5Q07Bes@m=2Ha_oQcD~ac)nl7{nrVk%cV~tg zYfF)`E>eo-gt;lupYpBxU+8RiCD(}F5x5gTiB(UrF2GJZXB^31uS4W|^*Y&Ux`&?d z4OCs@(cD=>Oz&-bpz_HThnNx4Ch_!-=O?H_9%x`E*BqHAr{LjJ98k^wiJhRsNz4!- zWevkR`u!80N}|XmSD2PB48S+EjSZGtw~d{KkxP9| z_J>rm#CY;j&@H6=Cir-kAI~_L%ebOca)a^sn@}4}a+c6bubc$;pAxzTQIBNl7d)yw zr~|ls@0*gMY-^Ld+(J7@r7CMk2|&WRC>bGfVq6`zcVg<~HWBU2fhr_^r3A;Mq%ly@ zxEa)OS$rN@3niuzJxf%TIe(PKC6|VlkDX=O_*xodT4KA)w8AN2Tbg*H5J0LLR~L zEnK3*{UAVEAbkB2#gB!&ML6Q^H#+VXbF_1dAGmDX_N_K~dT+XMO*+;xc^cUEbzd#o zGT8MEIQL~+$NUH6pZ*A=xLh-SLfhW#N5X^L&h5!qwP1OIGkG$x7v!#Tn$~0SwM6|O zS@9uXS1aa!Wt3iLOx>6cej}Yf&234v6HO|3Bd>q+Y_&W7DspC?u7A6FPVz>3k}`Rc zu@_{_xdh7HHVk=he2l$<8CgficEqKsRMcR!?HM`0llb;rW5|fVn00J1M2>=#hwL{p z7HYp4;uz=&Lp<)44tCQ8I9k8c8`0VHPCzqZgd4rQK|c5l^ldGoFTZ*nU|9y9G=!J^ zXh2KX>D30ANa@v1@txSANC(gxK7z7>PEawu`M2SuTg}CBkApXCkQ|=$@`0tBf!@*S z=ORor4W}3CUopeUF!9nE>OxOM`Fk)kF@hYL^mg)nqz_S~M~Y2Y`FqeaErH$f=x_d* zz@3lNFbrI=K)G|(xBYP_uD=N~(c$mm_R9PeBZ#ngYPRn{W2zPt${oO5Qkp)bB(Fj2 zWD9u&w(X6ajTCTafMd0lXg`CG`Q>k?{hrS&OFs4E#yo|KHDtNJ#OJ-O8m4oL=3U9( z59fON$EQZGAkwo<5V)QtXwMwYJFUMT`gIM+r%P`S%ySDQO!ox1Z;HzE6G#u(HQ|p> zk=`%->n|*_=Q4^G)85^x7wlz0s5eagFVu6ry~TI8SG!3Iiu4T(WCCn}~e5GO7si62hJugpm7eefECbdZNw`l&yh=$J;p zoP=MQE5sUZC}H{MK!D6Jzf8bhL_y@eUW6obuoqxhlp*qIprFe8;A!YYCVwnU^aW(v zKmut+fFR|*O!@VqQty5)xFV~9>W3(hlJ9=zh(yGi*ot(|g#W+56~H=XZTT&5-Q)b< zX-C%orX43U;k=cBIU`?YhZITDp+7uWVB+KbgZbRya8PpiGMHePlY-ND5O*m4vp_aM zhFr0+s)OF-(m_LGsJAGgbrYZ>-2~C%+Eg*5rqf{qylfUI1^TE6^#MOVrn@qvDctmh z(@F{XpFXEw@|?QAMm#2BrhQ+ZK}a-dAgdOB5o#WXr%2x$@ZcB6RZ+IOCX3NTVc7oOYj?(|qBGU!Gca;MJu|soGiLZ_&zurP z$55}qJwoFsMiBL)ExkwJ>Px%5C|r@wU|P$S6h*=i*_J*e7NL?HxpHC{%N10TZG~=P zNDy_Pt!%GDzNAvel{W-I$6)M$f*IAO-an+sFtu-pjS0|rp;Hye8nR@VGH`(C$pH*W zGE5l--qH6Pps)v0u($JFHm{21uCiCN+XM!qxit0t;@U+J<>~tL1xh#G8410}YtJiQ zS-3Vkw;HwE-!TuEhE=$v1ZBm+(Fi*=80C~y4+Oj{IyV9ry-rv0toYgS5fC11Y*pVx zf*g*2jRa98=*r&4*$q)0WZo2)V88jBQ;xmb^}NVpS(gbD$tr?k(MT>5PCZLaYi)8e5@#e6f#@9A+^ivx|r7S7lDF zJR6xKf#x*Hs6o6Kt;7@(C$%5p~HHQoWSJOZBul32EAW4Cs!MP zLsz@9-b=?EAv!ugW$i{s>UGORo1gmw|Fs1c2z900(Npyvfej;O$TZ=wgaW!fWOjcCdc*9Uw>g1f?|eKxVnP6OkkRl zGM%bdn>KM`;UtR-&r+ak1^FwAU?^CjxL^cKOo%t)07vbivop^W$B~IDAL)w3y)**T z^MiaE(Ij3Nif74nSi0!yKCnoXP$AYgHwAidV9%KBC;qm+zSpC`n-QTVVO#8!D#j)t zvNb;2|Eh&$s$fCB@7qvf_Q*MvSeH1=U}>gNx*~`vS3FFnE|ZIB`H$qp0|Zg&ZUI|>x<6;)tiJi<6vE-`6t|=RBfs|iqI>mIA~-M{+4c5a`xXKX@<~;2jqiSfw$)9K~KnfqwdChCy0AWb$wlp-eww z8Jgns=nDHNa88go>Lj`73&$u_;nHGWj}^0bIA-ZItql=2EYYfVL9@)!Y_rTuc&(l3 zb<9xkIcCRfDuy(1eS$vwC>A3gI0nBn5nLPGiK8$hqHONLUWv~~yq3oTRj-QGa4Y6{6rmc?%jSX=@D4Xzm{4uc+?dn$ zH`)Kzr^mrKUeTAj`dozSHpK1fpE)qY+H9dDNT#0|vhod>IkC3%>|3~J+2K97=4yPT zs9JS8JPzYdlsm*ORztz1t8`TKI#y#EPj@p@AH|kg0H~YcaA*^oC^s(&fnAn%Y)xn} z{VQ}ek;@t2=xLL@D?@XuMdJ5X1g*dOD8Lr|ik0v$GNWZOcNdKeYj#b*#}mgY^jIO*hQH zn}rNXJ+DI>Fa%AcBtrPh70xd1Y;RwDQ1Wnw;l(Hwc2+Xoo3ojz7ZyPMO6tk0Ru9`1 zIwJoWN-Q=jwA~>tu}3ek!!NPNEU=HYJKLb8Ua4*d`rM8dXei4eh_Z#8FZ{0f9gmh6 zkx5h&o1hb)WwehmYGt^uI*K_sY7@V~?8v(xi`9m9yNcz3zyH8|3pt8wv=2wD_mfl) zeg%zG4|D~W)Glxxo%BEGddr|Vx~N?nch}(V?he7-3GQye-3b;32=4B|A-KD{TX459 z_y7ZZJm34CALqxZx_ehm&(!qps;=3y*1Gq#oFl78#stI;)7M7y)Ja6>R4uqkykg{wJb{#kcr!5%eg^q-;_QbF>qI87W(q z6@*18KL*ZxO3)Im$Oxz0c9|DYfXPWXPDvI zuW>zFzMyE9AW<-TG)L6-mrhCuajEnhAaK`Wa?Y(TuCmkle<#VCO00qH_yKK1F(_>3 zyaZMfj(+UR5yCijmgl-_a#BC|W5qu#$KU%aJvQ;oIbrCzEIhF*@7>tu1vbylhgFI? zn+bC?H5Hc=kV-67O0EjI^=D~<0KvfNeA_-IpwR#giXqpUQlGei^LYt{KJj2HYUQ=T zQy2mSU)YMy5rCopy1N@ys;;>AAZ+V$$sdL*XhL7l7-4m0&7fuszq9Ds2X0zscAeeF zD<|GW>SB_cfUh~g57w`)=pEPg6Do7>Fs_U8Hm>_NW&1;HvQ%vSTwozzA4%CPc!pL} z!ekrH`)Xy&^ELW!D#>-Nm_^1@lFKToz%9wk*sG_v*&MeH>|akO>HeSzJN3#YJ;t(0 zR4a{U%AMVcz=dzmTH(gh{Oy2!!v{$H_&!|O!aEM-a*H|87giCOyHg(zqFfZCV=l$# zY)%qf+lECK74yGUhuWO4>Y3T~5$cpT4Qk>LU z!v0{VI3yQ<=Rpi)kVnOWNAD#8cJbwZp%lpITSFIuUjm*pR0L9Rti*+na0|ek^u16M zOseQKb;V>CDe-jDdS6t1spy@dj#$;U-TdhDA+}Uc%U}9mn9G`h9DHu|w`nFdI5-=) zar3pnmQV1vkfG+Iw!>(($hS?9VmD73`lf!N#=p}~)|!4I;* z5Apwu0<79%FT~~#DWp~Tbj`JZeTxTL^9MZh2Q+g}(0xr+FyUwiqu`NeguxH~AG##c z)uIyBzbLfHD6~g0st!y-JRh1!t89`0-&_r=m6GX~Q{)NC7*Z^<{QS&^SGP@KskDd7 z37HmA6!>uGaWpw_GpyC4D^ia4^?sdDE?%;It$u&DOc&7h(?&mazn@Ho^;p439fEIy zgRGJMdVx6?sSYV(`DN~8lxz;4dJElCkgm*1M;{3(#xpNtv!?=8_}>>a#gsv;qxz5o z1zS3?x0rhkCDGEj@$!Ye0CW8DfUIuA$?~q0*Mp#X+8H|Z+wquyjqreT3DJtNa@NCS zK*0I0$?}tj07351=lef-jJ*ns-;RgMC(y#JF)D6pN+yoV>Ao2!dW=+X(usca`f;-H zv8uIq_F+X_!FiIRX@#$Gq+K%cT`qM?E>-0Jj6yvS6}R@By;Q-Up7CF&d-Cen{{=D=-yvMXz+z^RrvdrmYsu5$7A4LENJ)+pZWq`S6G&Q)r0%E z*dY(xBzJqYb6+xD99%9o=1k`6(GE^ywUAA^oK;NtUEXH9 zG9MFGQtKVzTTWdeKC1dr$1U`ck9M5P$qgT0V;J)>VU}fWDYLuC`ZOwsNdfYywV#gD z)cU=R+Vc7ihg?S>i zo*I=r?X)?Ts3iVAN<_UaOnJyhi|IB(4sxhFrVDFXz#R?u;$fI5)x_I)PMpxlsNG~lW#1eo->X6j3j z?;ju^H58a7q!$&~NeA(c_Dz$?`9lO>!yJN>Zyf*) zC$lOmcj!>>6n)pw;K7h!7+}0g!b!e7gh?(l_|yCh0fdMApx*uL#a&Jd@s9Uw@gRn} zHya&gQrMqQg#JOi8;l5&3<)L$vO&F$6Wkxs zZd2F$bHV7zy<~675fsI%kS)vx}_gZ%Pu&UE#a*2LNjF8Vl`_gHv`^dhl9j?QJoJT3ww-^iw+zoY-(Ihrwn0YB?)TIg4VBtw>R&8WeqTmv@wCIm^zO8O(ysdSD|L6ZU(a-BA|Adr zuN=JX_-{YwA30qs8-vfI%MmDeS{fC`VeipdUq&^|i-YM)gNuS?ZU_Lg>R{Mm6Lm1^ z@QykddRR;yj6B?{4u&7br|*%vF~Kn@1QCYE6%^1r(gW1i)cMu;)!Wo?is{AG0YxYg zk>+0jZa9PL#Nqp8Z6MnutqRko4T*wJVj7F%rS@1cJJ^v6Z~Q&vL6I4vyw4OD8xkz3#Bj|(&6 z%^?ByI6U;fq+D?TpQq#Yzu=4(@uLk(;KZmA$D4Biu+?&Y4#XAVMZimwAh7}ba8T*f z3V?Nt__x_g`Yv(VX=|ml-Jazxh zQl?Y16ec(xO%-c)HdoFcnETXvar~&c1s@Wk&clr0dyY z_-97Yq!3#+*Z;D6b$iWxmp2c75FGJ!a}ry8ih1Md2(oYzJ3v))W54I?B+4!ziz%NC zVUbnm?EjtNSzoh!<$O~#F`p6(hucbb=@7A(wxL!}bBXN3v2Gw%VwvPvUqiE7g&s+m zxgeWDESR8?ou4m-`to;rd8A_h365|eVM`BsW757zTfJ&pTC8!9V z(ALiJ4u&Y(6oSjKxfOMSpEP9&No`g`Eku15YejP6VWOTiBc!l?wz!IxA=4IZ$@gN5 zB`603sp}c!T(uf67|2OdaNw!oCpfr$Z0*8~fd>2bdtnKyWv=ugb8v~UE3{?Altept zQ(r;m_HA0(DPGjOC0BWzKL}ykSJeSI($uE!#xo^$Z#4Tyy_53b1p`Bvx{3STPJS+` zAFFAmKl`$E}HwKx&BbaIx8Jl*y$|h6>IlGl*X*&PEiAR-81*CGkhOe46)kEaEK@T`n&E(4_Sm zol6sSWJAEi;e2&BOA1vtR!g#X!=3gNq)pZ%Ja@FGmg%?n3(e(4jhIbO&1@kYH#XRa zDh2w?5r!|`7}4exJw`kcKgwB1`iwJGe&_2^ME{T(*D8g&6ZT;|M_qjK{F}KnGV#z| zL^F5k(5Hb`Eh6lX{DYlP;-3sx0-U!GqHuEedQN6;hp*@6{S`B@8+?{t^hNh}hkomc zC2>wInN@q(+iDN3w_;=ZRaw-b<}$jrR&Jq{@1a014K0DrRIJYOaw>&!mtba0)RImendH5(3I6+7;8T!9pfk=GvBM1`8U+t%u|W#JQxwhZNOu6kmsQ-|mjL)7q~a3wd?2AJf!dssVme83 zZG>AW#g$jBO1B}txx7kXr~1$*(!V^vLpWUF5*agJ@3gU=?r4*iOA^SiLLW&QR`}&5 z_SkmJ(1_EmMJO}2`udJW(0tt1A5eNp-K0s()p;r(t6L`0vv6WUqDNGrFyvQhzgk|@ zd^R&<>qepfg@q)Pef4oju&m{PX?jT@fo(gSEpeYYHVL&4hu!dLq(Kk3_O5^fY?%y6V-f6dR8ezmat>6m@E zU|H3y>D|jlWWkI&&r7q8JhIA23VgIP3nEZM7Mk{X$Gdo20ji=4TEEfE{C2X8{`7`O zsHz*uT@x;I6oqeS{(ANl}`4 zYVz~HZJ5Qps-hgf1msxSk5Wa~GNPmK%C43aM?cd0o95W7vE>iru2B|W=ssI+$^8B2 zC5-3}j<2~Ai(b?B9J-Gp?)F<#PW8v!2J=Ehx;08QDP|)`2SAV`BUY<^UccGmaNYO57m~yX zX;*00nxy`@^NKZGzGt^d$RrT!(`^vvh%y>Hv>!=>NH$MVSuAn>I$a^B!)=|z`+`Es zKvJjnjev|G@m21l8~qFVKLDS!##Pmnkd2a@{;252gkcuuliemY?2jG3#{8*{&5)vf7!#wKkLmo zGz%?%%V&*A%!6~cO-5hR&l2qF(|QihHhg}5)oj zujQ8o=PmO^BsZ^c9(N63>Oj-7(Xbp^L*F83moB5T*vP#RR|C`HSHB!n!?UJfUWIPJ z;8@zwjAvkD;Xu-|V&MSYGSj~z_T*WDQ`VfRnt>UqU8>o{ZaR@-|8KU{zVw;#*E z6+$aj*DvF``Rp?m!tS{3+IgYVT*B_C?U?<|dN}Iq!R0%i7l_KMugxTk%~`&Lfl2Rj z#pp$<=oX~CQO`j*dlnf3*NeG?({p6D_lPf&aiS5$sum0Rg|qhe0^wrPAj&|*;Yq?b z*a01k9tm$d55B-}#l0oTJTFW*y(4tSg9<&N`^w?H;&;8$cg}@uF=v~)z25ao{tXiT z4gCHMto{wuul0nl^%$@9aIfrduk3fP>}Rj+JFo1^uk4f8X8WJyvcM2u5JYhRk%d1z z)eFV}2!Z4SX6p@R3p8gHW7o3GuU?v26Pc@>rGUVuKD4h^m9=iWoG2bUpy4hSco?mqY6IKBG31$-S$P zx&z=ti1RKmF2s2sI341=2doMC{M=Q@^)4_s_}?><+m;0KSFv4(~ZbzoSKc zhINo=|3!&WWKdxCC^AT}2$~oYhy!gEIw)sw2fizLkf2X&7l<7aJhn#%`SEj56*4Gm za26scZBPsjjEyD+5AsFpg#eWkzZ2}{yMv_r*jzzYeZ9LtrVwveAHH230kC3U@BU{5 z*E_Pe3fbGg#|QZlIoJye#*5m4>xvq@hS;9m^M?GKmVe03$$ucd!~b^R9s}t@#EyX1 z5FdGi!4P0sv=2mJz5tkDcUAz5-xquY+=2MW9sGa*tD=1%1A7I)WPK(sAjQ6qBcM)5 z?~J*^n2&;hBeda=nUE=bRBnh7F)N(mz@A2*74ZrL`hknU?jEry0ONLl1 zU39No3qjOo4en~R!`5E&$DI=TVaFhlyO5HVO;=^y&X0f%>=&<<+4$~6X zwlqznKbSmt!9wNnGt<22(3EYuU!+7eq<|;-I>X`71p647k63iR=^V<-%SyEPHRis3 zE5f$xUrz2RVap?edVXv(EPNoIepDBjm@ep`Cy}yh!o4BMl|ZkD1TEP5e*&P;d*A{G zgn!TTD5EQ!sYk+>-rL@XH2(_K#&jS-W)ZqO{~{Yyr`0o%JDZ^&6Q?D>RAwpHuuI2G z4DYE|HpJ|%z+5yMmQUm3IhASb&Q&7S#6#jpQq<&GWa;Os(n&Bck^IxWLyKA;MT!pP z&?BfwUr)-4a-Nf1zn1#;knV>=i#i-xwQ;AYMY;7)T2AS{eTB)`T&tNiKlc%H7hZN` z{HMPWF1nE@*wapsjRwf<{zaA)V|3}+^Zv?yqLprmL3DFANHO+m_o8<9gVHZgA@6Tc zry^lRQL806dV)-nXjtoFVdHo0R=1$(@kKf4q;c#i-s}(r1-W7$krvkO)+W-+gjcs)vjk+6P}n7tn8?sMFeKpAxOZS=XjVS(+T&cT`(JIb zt>`1M=*+MhhD71nq%)*_(9h4etMw1!;2Jv3ED4OtWG{K2niBMx&J!`#-E;Uw2rag1c;aklwvX ze}0f4eK1Lt83Tir``=}c-c>PboM1lqNPd3gHcbM>94}3WT`aQFD6pj~6{9CxGB?Em z%9Z9^A?6)`kqoL~<`ha(UFF%NJlJHZ9}X0fo45oLjc){knr?V5>ccgVUR6*z%(pve zklPJpkhD0EDwv3*ArRguz9Ax&5aj@{5Jlfq5X@Q?f=iYhkQfF8PJnNd!QJ&p4916P z^B03sVuTWwqV^$z`pb0)`B(v!Lvb670vYs&46+Odas~(S9S-t6a12_h3QAb(@FS}Y zFct*Urj5DF99kepHB)3JNxHjU3Be@&-hi>&_J-h+OWC(h*^h$Ya{PHAW87Wh#9kz* zoK`YOCp8#;9co<|NK&yw$h=}CAbVmjB$VOjg`BiteA?tNA|VVSh5M8NF%y`SZ*B!* zTN1&w^4EN9j3)&6sh_LR!tY9{#;QKYYKX=^zmFB5yD(1Kitq=CG(VmM?m9QRqLjSo z^jQ@Q{>hzWc~g%lv4wi+tpNGpUdHfXRz4Rms#E*=UwJ}hHe&%Chse?0rW!Y%j{Iy=KSrRFqP237m z{re-E*Yxv#kQ+(&w%h{}xhK|v|K%6|NMfqmG^3Id+twq0$6m$KGR4w+xI6#LxZ|g_ z>;fb&)6UFo%GVbm(zRc>>)Vhm-LK=v44{j;t|x8a1Fv7FdMT|1*1j(ngXAyl$$QyJ zJ@;DQ6-S=gtRS`+Pqw2?f)9dn2pdJ9tZ%WGs|LzPUtZ~|Q!JMx9^e^_&+yqh=FWqo zs?pl7GBeM|BvKUC3CxO?q~1$7cRU%M!>OoW#1CaG>& zBcDA7K74|%)TZkM8yw?4il3VYb4-GOFb8ZlcMej4k=&MJSo5<-fA1Oj-k3in20VKx z*zdW(X8J3i^T;}>-uCU*>>tHJNwDsF=aPKUGPUd4D|7lxP?bu3>WO!SY{;qqtx2pZ zUNkS{d^-~5;}h%iPttGH6KtGDDA65KiNF8ihmGQhLGl2s>);w!aZGtm~mF6O70#OBhZfGB~$+1ol1ypA$@4|N`Szv z(sW{v+AC`Ew&Tq`W1+onGoC$}Erynf^N@S~(1qPMVVD|@jqe%RcSun>8+T|gBY|#T zrv#G?TX`Dh35|t(e>8L4C~`bn3EwTBV$wBq;S$PI>xfyz=ku@IvhMab!#^tcc&!IM z@sKc+)IS^X6B7SlbVM(Y?(fEicJ$ zSZS40gnz?>m2c8jKYvi;hR)V3*Wnw3Z-GDB(R)-ZgP*B;Ln+>fkY0Yu1;frcH_VAS zFYK5u^s>vn@EzG1GyK^>uCN~3+dWp7oGfp`fenj zGvExw6i`>9_QU`ANP?i=nPb~5ch7+F_V4S@BDbPOsiIzpc@y+-Tb?btTuRr(Gvo|P z6aBKEVA)h}_=jQz3Gp44Iiahe&sOOIfptGbDHhP7Uv4SNRT)qHrCvC`ig}HlX(GKC zCk7$Ssgk(8G$Xz6PzKV>&62vkcp|-&$cd4i;-d(>!NCUR%LNn9u@Sqy#38+;$X!Fe zbWoIw<@eB)s>a+06*y~k-QSY&S>B(Uh&Y#BR|TEwGWpF(DCE?HfkMVV<{E4ef==6_ zf(l;N{8~;gGIt#|3q)J~JqLrPo42Wo#(-q*Mqm4Yku>q#y;Z4#bENx6W&LJ z*8;lUxbGO5D}y;ZYJKqC!mS*8VcXdElF!Xx;=~V$eK%w7-{>a(k57ZET=!IZw|oFr zBgpZcBCyllP2czj;;ZpZ^kG;ZZQ_Z(xwjL(D8i+BK%I}Y{jK5rVU6i+3zU-RjBzdw zkDzLkAKB9ByLh+YxV=^%oR*RpPcOa_^~;ATLw^37ao=|K81vU&3zhfx4~YLe@Bh9{ zj%q*(0dZ#Z|MX^Zv;VI*bNQ1*Ni@8kr&rU|QoZ);K+!AU@DURmODG)?ay^NJro}NJ zJm<@>HgPBmk>1R=38MlWs1ylBJ3B@6nT43L$djC z3|xyPX`%>)wWf+G(*eS*Np(}R+DIv|rX@HU>WA8ZRIEy-QX#gj)OjO;EtZm^9{>f$ z%HM@q|M1isG5|DM%%$c8xRVvS;?k(N&D=61Tg!`$OlP&B=PDF!fZYnM>N0aw+_lbZDJ+#!8|s&HNZf-0`L)kgOM@0eNiXj5B%ovJ#v zHQe)vrDc5gmM1zM0go@M>JetZdL$1~SyNEUwb| z**2~KNH=Pli=tR^j>?~0bmid7SCOAnl09_y z%s4G2-`yj$d6C#0MUE~I!MD5$zCcs|$!nzi3DST4u{r;DXJK)92OkA?Y;9F!STDlp z;A=4b+RE}GLwL~O`fX-7oZun3{i=m`2X}8-UmbL8_z1^7J9v zk;5*#bzS`3+-U=%%mCfvu4_WeX|8| zoKL^0vB6sbl(oc|wDO&uJ8oc^3a?j=WHUP6tz`m37Fv5cB$#ziV|<-(bJRL6oAGU& zn+DzwO1BZZQ2T!24_9D7AnHi6j_~aIM!PVBx||4@PQ=a%hu{L85{KClF&Cz~v@%ZorC&g>Tnf<$`Ea_BZOVF$6818nBbF0-{ z!RlOd=+TFfjL1RS*+jLE?h$^Jb$6_m5lXxx`e<=@oC1$4IpCqb$%0w5%l>fAcaW-TWQ2;ta6>3d<+}*##U@a0 z^79G8X*1=_`T1+OC`Z8Ihd80V>#QX+CP|!Qyo%Jkfj2)XX&g1Bs|ho28pgnBhs3$x z{+JXcX9r_=OITtL)dA-HwXmF!^XJ`j5X8|8DO2-C<7n6uwDWQP!oZ(JAAN5h26iV#!X6~gpk{!;a?co*h;(RY78><`Nk~R zQh6jtxxm>T984XQRS)`I@1wnx!ult5*shollT^5uOV~+w$K8clP)kHkHsM^5SgszC zF%=$Z1Z#mm!V8su_X{Dc3}tbmt^}pBHkJaeO%i>Wlyx^2FhNa(sx)UW@m<&BLpQ+V zA)&r7-#+(>WFT4ZibT>PSz<9|H;Y1i>RL6p2XmS5o56W@WcVvsX0R)RdtZDnm>_L( zCOML!PN|-qN3t4u^k$_6t`W4CR$cPN(UdFV~j}p%m83TJ|ucD$q zwpn<7_z{oGy!*s9tzC*oZqN$gp_X;<|d z*uO_A-<9!_k`c++4|f&D@(NO@NXR5;_>?`^l-P*XVyArPugb{_6{0G(xS^sXqBs%DOisln(FF*1~y-oWWK4V+WCoCw6btZyA3K)r;*IuNRYxTY)BS2mh zP~iJ|eb@t9vxKTj>Tep%iS^4H&}($#9iMteQthPcqrh5iOd}lBr#5CsAw?L~bZ;NH zG@~XaGF}FZY>&YvC$5=Fc_c~B!kUN4ok=#aT4OAyaNWzv9mEU~3NTal*KV+fJ11!O z+9}AO)2=dbTrt@sv*7>9#A@WKj6Wk@z1qd9x(o**|7B+8I6&}2k|6J=jj^UC#e%lH zSb}{zUmw<4wj|GY<#97JB2ys_*_Sv3R@M_FR!JmNQ8g9i(Q0f--P=+t5Ly$=)L~CD zGElWQ;=6P6#?mzfCcmCxni1VFr$uEcEm%Fa%r)Q6%zY+2i7LvX<=w30NAThval#H; z4FmmCkPgjXqm&{S38ka92{!)3Qk)O1Od3y(u_6E@0yCUM_$X3QWQ#@yN@amin~#5# ze(|jcUQms9lgi|X2``YSppddZWvT~8E7bk1V^d#bnmp_lCpx0F`}|tk5@)LTQWSLO z=029drlBO?4a&sAK+5^FMHObwACTod17TKNJZVdof1;@br3hMOE{$;&I!gy`IX0a* zTXtO_u<=miVdxw)G@m-dH#-NDu@?ydeP`kUaU0F4r<;n|X#f8fMISeY6#68=~ z>Tx;nPr2k2&%M*Hj`ZC#2z>2H19qX`YnU*9q03^8hbTDUK{gw-9y#MU0{<>ywyAmlgcJn$c?*4Sm za)0`zJOWSkU428ebJ*?@=X`aLCvSKipyhNPudMVdK7JTGv9R_=&ah;tZ?Auhf6I0v zlXQ4=Q$!(Vp^_me9!qUQxGOe&(Wo8{K47#|K2q$gAl}i_6lr zJQ$|sSX`70U}c;sDoO_gG0v2k(|P)K$gY=p_@tnG}P zxG*w_)8oyq%~2);Y!5&t5D#fktjRA#r{KN^;O29uFxW4tGZd#g6VQ6MDXb9Q>M#)$ z&#A->H35kpj2=63U9umhrF65&O>?e3qdBvRlVCEIo{%bA5wbNZJkjPB8nvqS(1!H{ ze0bRkkIMfg6aKAWX!g8qi8XoIB`Zy+!Jo#wSNl zhBMe}p|QI$Q)r4D9egdKnwR3{gcSYO_%lJEb-|XEnbG_gjtX)|4TWyMG}^@qe&g0l z9*ZJ#K!w4_${|+kWSeYx(0s+F?vqpvZAVd$Thj7zvOIzCIv)4R%+~j!31tT(Zs8xw zdj)Or$-e9KF&r}^AvnBf0iodseb`tk5UL6wav%lbCp?t$6CPTZ42U)v{8SlPQcOinpuzJWql34HTKv`-#OnDSg?Ax|-@@VTeQNsY0Eu!p=3CHAcgWFd&kB1#9GQywLg$-Z`Z+RQ z{Q7_E2X9zvOS!5`Y@GxB$E+k4`t)I8 zrZD#&~kbd@G_SfRG?rJVdcaa^_HBpFS zjiy@>iM>37`q_$Uc#ON9-J{3zv`RP6t(m*xcDnG+m&h4Enb9O6 zLv)b_%V6Od236ERS+pB2|M`b%(Bn^W+n&@pA-x{APAS_S`Tz8eh`nKraXw~B&SF;p z#grf4{}nyQ1KN`?Kq3?6P=U}kG<8nLtUy+^BeVlWVvFFvbHC>%PVhhXh0$$&wIK-b zv*uAtOr6^?E$GenfPNqhf8oTurAEXxKoD@#?HP1mKztwyZ<#%Az+%dmW}a;TmH1ye zhRy!cL)EgUX(EN&a9KcYT9g~@te$+jz9Q$-MQJ<;xoxvu#WedP2&vmGGSbHMy4Tc>h#eZac8`ft@aad+hb zf7RNlp`L5bw=_YqrRr#*x<`b|jA^_^L1B|oZ9rA+l==B$L$Z~S*WiS|Zl(oW25LQS z+saLjZ;+TA>T%0h`6w)B{J}A%Y2n zo%olWl%hc{k|veVIyB(#h6!Jv$|K>XoLSj$d|BVA`o)4h>AW!vr4 z2WQW$N{y)Tk%YVRp7zks z9`oxEF{@OMfL!u!6$g5W?^cOkChloL7t@sS9sO;1v#WpnTvJ8-M4CDhr@gx}Q~90D zmw#oiyBRvT8eO$X+jeHQ>moAkVy~46v5+dCZ^3k9e_=Q?fFG&G?)etM0vKy;<}d57 zN+#G6vbpHXher)2&599A*M0Nl1N)+L_g;T{aqmY2-OVAsxQ{d4o=DD}YXVQo_hzH^ zW@r2I(FgPML&d~i318i3Rzk(l@2CdyWuGr%nf(!cu*B+u?jI`svW#@a^-$ouN>`L# zMfe|Hrw%|AOrGE|C7F9a`ig>8t+`3Ip zdp907I+AKVbbpP{5uQGF(TO_1! z9oc^^F9bU`ObH|RijCS6_u5ps7=>Nf{Sre6b2KAlvP_jw$G_oFZd~V{wqE4UMqT7z zm%)T(lrfSKu2l2fmT8?_g8m`RJTY0SpFaUtk692&$0qsj;y!jg>VF27W6hS2Lm zE+%p~5SHn(M8H<-+8`n?4;xmFxGgzqmv)ra|K|0q`yUF!($|0S0+1wpQt=>kU6&5ZOisu#AZ zY^_4m@gYjjZReD7yfr_2I_z_hVXczHIlPq4AF$hwl}37RStWoZ>7kEUV#3xCItc`inY>+TZce{#tZ zXe;V-qyws&f+|OKTl}CWb(}4&&XqHaoy}rgYlb~b{Te+wT#;KmI_%haY%#P;7nN&# zJM4=ODtI!Ad z(EHi)&6!+k20fc!>?X(EGhJ_$DxXaRd?(;S>$Yc{v3vaBgUk1-5P=k=!xb>9o2zhU zKdq}8Ny8dRqZ)e#0ZZ3Nf#>(-(*%Z&GrQ&uY??zPSBJ!BPT3-Zx{npDcise~U`+nS z&M?%4ajCY14F6m~&pORdt4)rI;S&!LJnq|DC=pjxsBQhXeMbMA^r@QntZAKmsk9&f z%eVYU_ps zCjTG5T$hi`wCaD=76LObP0j~Tecp~61{v8>vrmK~WcXDKMZ}3Kp*+Rl`xj1XU_#|= zJl6$2;kp5?xAF4WHcd5>>bC~zea7Lm#zZTj)z3y{g4+9k`|t$${xBM*ALw5=^4e&T zPGW)SF;{M0!v(&z7!F~|e#A%-GsqZ!ov9rlPfN)y!@YbIA9Q+}wdBiRcFL_cutoFo zuR48}l$m`Z@)Cme+Kk+ui6oz^zdIdH%#BxzZM=f6uhlh!jR4K{ao(mvRJV379~0Itw|qYxRg2_ z-_70=&o<*(7Vkf6RP?i0y?;O%u7RekW?IL(7ThVtAHQV-tSm< z4>~_v>GViyQQK-gMN?ZyFL_qOqNW~p2R_dI62`Ue-4j&_M7!reZ<0qi4uK)hfdkEV zmF2po@NXU^HPxg~R}4F8^JUA=@MQuYW5)vdHn1~dW+QK~T>t78;A$4Y(h@Xv`}vW- z2$}ZKWAfz_MAuGw`xKVegO)W0$v9@SRLr^<#oZNSRNOJ=OLml+%#aZ=nr;Iig-u{) z)BEnMwDvc)acCShmp3xKE5J*1(p>so&#ZB7b5S9V-cp zMgV4n=|w{pd-%;Vh{etfE6MgHtudlD0&5T{*(_qb9yCOdml$eR9#QBpl(whAZU`4S z*9DN=lfTen1nQ=N#A=$k2+4GM^!ndjCe;G1fXgkcq=(I^)YB z+ns&>=qNo;Je)rCVg3F!aNbtzJ}^U1VIcOOvSz?LW2!K38+M=kh&HCM{)1f+$ZbTR zC_)&SUmVJIa{um|I}d1>JP7fp3DSQ0;I2-W4BYkP*MQE{Hah4V2XU|)3|+y}(Z1M2e*ILRRM9l|HI|5DHR#zO!0B_)VhAvoLDXvd1lXeT+vi9PjywW}lX zEvgNB$FJa?vueTkfjSV>pacG^QwEwX0L>PH*a|?{YG55T@FyA?uw$DCxj0K_mVGBb zm!+OJI0Po4J-+7P`1n~6BzhIVX`QFK?MVE7>?Ya}z}QYRxaXYD<7>$eZhuGo^#L^+ z9Ci?#AZ#pk>%+j}8@o;$uj2t~4AAg_|40&lw-#3ZWkNZIUaJ%LTO(Ory1h7bH$fV5 zdiW1_+>yOrwc4b$F-sK7itqybB8@dO3x|bW^fRqh^cX&xlv=x*bS|Da9XRU^?cGYU z${}_Yjz^;ECn+ZlrRBm7)-^sGMx4w)3&B_dz!!k5zDIcd^c@RzL1TxgPlIC>K1@SHG2ZpJ15P?jcnC zkCywOn-{7sIfKwIkttffChRZ%*nIg1dPh+zayR`^Ton2Ls|8PKrQ4j=8Tb1Ba`3JT z8*z3TVU`Oc&xTSsuwV%Qyf2S9k+k+Pw#Cl#S0xudsgJa}k)8g)Y)v=|{`wkFG_7fp zzOGPE$KjX!_V5Aye;1|o<|OT}$siz}0srsKXdM5G(>6l%!I8$RJs;1pLlc0K|B8Vz zz%m{J|MS?IJY60EW(gxn{tMsK(0I5ae#*CbX^-L89%t#B5KK%qVYM4w@qQyVVMuf} zbc&LpkFLtv+K=Em<8L}o_ftJLtC7m#80BZw@XvCBlZ?4n zF&KDM%;Nm$dja9SRLs)4kuHz}5eSo*@1ZW31H%aEaP~OEgDI<}+KA0?2XGN| zD8a~kjN!`&I#h;XE-V9{2&+_oLtLl^lo9x-{{C=b8u6%!O?r z5aEeRI0Q&OAc=rZCHwMVO^@l=49{ z!ydRpU?cDP3B($hM99W87Wcv3;|X8IY$5Lo1=0=}AQ)h7%lN?W8HN9UbbSMiC|$7T z9ozOD+qP|+cWm3XZQHhO+qTV}fAf+}Ub0Cm-NlofbRE=JFYw<{w>fQwdalkndcm!VI`h5_1L|%dS6a#1Ac|=!(ZbAA}z;*FGqi$jPTfjRI zp8sA7zryZ$1meMa3$2FK;_Z5Mm3x0`0-~=YWSGd<(Dv>Jfk= z^9#`76XB;KP=TueWBKFs`Nc;5C3NIJ4WEU{p#FWooL2v zq%JKZ;f{>Dq$D*qJwaPDMomrQfO3?gD4?C_IQHbG3D~sFr);HIffcW}gqQeeWs!A2 zF-B8UO-@ElJ6&Dbd(fje4;P&xMT^?PE++0{s+h^$P)yO&$>3u=^@xau8)9H>WX5jc z7#g1_N65CLtWe7PPD%{4SO9Xg7BuumoFtNkU3|!9dQ3q>IX=R&mQ+2Dcw1N6*jdcQ z%UM%g-%f?+@IfL0Dr!|aI#SH4Xb?~gQl0kZCU;G&NFdl&>L?=3FHdgKV2($;C8y(^ z4F#B|d=nBX@Pw?om)Ja>LuOZc(jlQXH6y|JWZ86&CJ`@qQmza}Rwt?|YClQ}J;%_E2*Qf(yfEv|or%+^hyi9vuZQZ2o~ zR{a_gzc?!62oo(g4~1D8PEgv)SS$o2`meHGVb-ZV!ByJ%sOPa9wi=0Boy-8wHaswZAPL&XYlByy-cM0@; zg%|=b%(T+5q(!VEM;B2|elb@^VQd(O3U+3 z8q0F?NE!k^Zy5U}{$-$MFRU^xuUtO&=kybtw1(Lh)|G8;9adY} zsZLf@xqLWyJ!Ei8Tl3QKQ5MmR98^8g28*Zer9=M61+`7DoWsZ&Sm{&y`pX2Vv!^s! z-oBlz^z%<>Jqbx7$$=ir&nMm3JBrM)H$jc(b)VgY0B%n$~iT!m{iBMt!NtE zm?&i@?t+o^1t0@U%6_}1kc|M_msh!{$-04U{aVwhp_RkB?bU!XtALW3*iZKL_+CY1 zYwp!_MUB!b#pn3{RmYw{z z<-SW`z9>hY@zt~~@@lbit`8}4;llK2fs9kYVc3F- zn#Y>Us%(2~+lpHhEJ{aZD}KsCW@9<-zzTMpRIm#wmn|>XYi}qX)`5x`hRU}<3}Oms zBA5WT)Gyu^>+J1Jl9`y8m#G+IlnN&SKJnQtg3h1~C~&HFSvfV1UwholqU4&~+Vlto zQWzqSwuWH`CY~CIN{pbFtDYeI&!VX`lG@D5yuXY!PMchVF9l4{Qc)qu2u2c>u00?o zlOq|+(%&h9Eg6+XBC{}C!-0B)n-8RfY@ullD(N;QiXCd|5w*o#L^!v34raj2;+d%< zLr>igNpq2-Rc87L7?bOo1pRb7N_x$Sja~qwG}@P4Q2z`F_UL`9$?p~v3K?IKJ}W-) zu(=ud6W4|izA#kg3=U|Cg?7R-7b_V?+W<1A9!h1o%o2CPQvU^ll4qB;qnxp-a})QW+7 zTubRborc9U{z!hgKrVwA)GBj!xVljulX`JxF*aKzhTp1K-zr(Z3dw@-%Tmr@a(PJ% z4htC$DiY3wnQR*cJem^=c?MDlW_XG6(rxmFD_P*FTg9jZ5x-amAtA+t>c1N)+jXVt z;9(hzyBp!iZ>Dpu;()5;*B#9`h`c5hLC4sjahzaKQ(RO7G?oblt1~8xaZ?vzmzhx( zx~eG443l*>xoNi1CYR*wrrD-eRrKPv-XU3qG+f3JNUQ8@jrwrNsukXbq7V+7po)qG zoo#SbLnIa_3>Ie;R!jw}Bd*0q5PQyuarpEHkN>~RYmqcn`7c%?<0jB=ES6~o>q{of zN%I8)Oth7LW_tuEPE8Jzx;0a{UX_-jwG}`~pr8p+^TY)@sfIyuf_%dO($f?iq^#3O z`+UarFsfz(+4H2YsO^MM1hjU4E(1t`iq|8cO6h_Vh z2F`-4%gFJ|$mvX!Bz8(vhelua0x&8?3}L&*0vP4wc+GuNQ9Kh9rQ=fZ{r^SR1fi(B zaadLpwMs^bBWjJWy$z}x2lxD-B0DM(vu^EJ$tiiAJXO41*z2F=@1eY9B?!`ylsbBy zvPMm$<;obTi47Fp_66{gfB8pgin`wm&C+X)XB7Gc^IAC0iXo{htzLZ}&Y0Yzj_aU6 z#)uMi-E7Z_LlmyB7;2S-`kv2Sq|ri4$b`z|H9AoeV~1&?)GS$Fu|!@`Wi7;}d|Ne` z<^9q;X|X?>xpsrw6W+uMmRSNJYbz#;S_-%mQ7A&vhM0HYy;}8IOJoVwO7Ksb6LkBb z9j)c_8_=4!&y|6xp7rgkCSa{YC|6=Kf)UtqK~)zN(u8)+CQ;xuz$uqeKrgET3pi-g z>z~5>>4o|IhY(=Lh|)6)uBzDDj%BqgWRa4wt=?>|cR&CV5>Jrr-HOj)`5P2h6uOgD73I^R_?~Q zAUnxr9K{@&G%a0dq{+1q8=XDbaa(hN*m+ zv}_5|38s`|eB{wZ;ga#j#N@HYOqEeb&@A$W2D2!s6FI#M$qU1EUt8F(45^G$&oq_= z2LwQHD8u$tnz%E!N6$2x0<^z;cLG#2Bm4I5aZ+mTK!dRtX$E?CQ3GB>ejS&uYn+tN32XI+mxY1^`Rv1bF12x&YL zE2EF}@2yfR^Q4CFM9x1<8W*z~F)Hv?CbR3l%MGShLKp0fEO}2{8nn4j1RAt?PYfCv zXOs+HI91f9U4F|Mrd>hHDviIB066c}Qahp+SQ;C1?|-V`=GOg|W!~eYc#CsJ9~B#U z1TP#Ko%5bRG<4@{4BweGc5;4~BRgfH zI_}jIcT?!5LeZ;(_sAw_(^C+m1F$b581*VczgMO3s}xovPZAKpuM`9)u;g0}t%cYF z2~2@!k)#Xw4gSMwQTA}kun__GfPSNUJjo=wSMUz_?!@8&Q^HG;)d;5@!q3p(_}wHB z2)su>ApkrC9+nUrAePKuy}VyX z+_${yHrUZu`@O8(x4P;#$T*nek#62+M)fCWBHa1758qpC^(Sc}+{L&L|C^X*8e+Ue zSv3{^S|KGV|5_!bX0GK@l9gQZ#W*Y(>BTrhV#n#YcHXA6>NV`qKgT0nx$82@7k_&j zZFZ1xFUO;9Ihm!Th1|?)%9j9pAMH0aGPv0!Fo8EVZ8vzg9HPCVSUGpD#Y{l@fWHWC zgYE)3#0pRDzdP=mupv)<3j iRQ&Z^eKy|r*a4OYH(;{&3S>s?sXMniK>ihP#d#u zNJ-`atM(+yo2!XcUPZ<1*L}aq#k;8a4Rj{rXo7ks(9051>&S6ntl^EL^8Tg88oC26 zrlm5&p2w#qK{%o223W8>hC0%i22@oN&WnPC1(j$(OwpPs0VNsp(Phi4V*nT}vvB}S zb0A#ulh_^*z3z-rKPIv`7-XZx9D}w&w~~7`BrxNE)9xQ8v}~a;axs5 zEva&HYoq9utnKCvR$?Dl;Jgr&ha|}jGg_IQ6^MX^MVYh$^?Q{>_Z8ExGJ#^zMVeGu z_0nahrZyBLKyxpqy}2U^qx6=MQSc%^GeLKJAxI|#-Bm$AxrxOnFZ@$}oE5-cVu>b4 z`1d#7XoNZ)Gk0tkz10OH$M4hK?lLxS3>!k`j)sXqzO8inBO14P^<8ka^0^&Eb7 z#p01P0EM;->l6$4apd;V%a4aSvRl3&=NI*FIRE9;;>y)yaAvOY@$Xq*169tKg@ zD{jSrqX+XA&pDX*CZH>_=;WBde69B-4Kzk`p zrESb4ZKWCie28pxiN0b3jitWP7(!jG0d6l&OFCG>l4naH40wFEXAUhNEp0ISgUeJ} zktLYH2$qY^cIaR6qYihZ!!8sO8}e&9g2Sx-cBXr_s2h7M$2M-*n7Rq5C~ldPk56Rx zH>%)~2^j9{5tk;g!>g!)1D{$NT7{0wk@b3QL!U{?@`(yv0v15q^PxvXX7Z79e)*pj& zSFf$Ao|~vu`Km%vMr!sk2Lmi>wVMpa2VQARls*u%;0j?#CeP>jCM%TLO3#voy z)2#!v4i#rhaT!P6Ujc@6GdY5l3e|c6Nc%11pOfvNHUb1J69mNi`PD@$W%afD74b>xFut=`)Z>7M&W?g>UrRG)&Hl~Kc7B&vC z*fSMQ35I2UWm%PtON-;_8tRIa7Uo96)D6~v6O)c78tWCDlR+6EMH_}Ixjx5edc+~8~H`MwmMf|vHoz529V*7 zA#JvtU4#rEA;4qcI$s=OeNT0Y@Yi?;()^tjoeA40Y5s!IaPe_mKNYe5HA6D|hpGzj zm9C1h9Uk2o+erU?y#XR;3r~5%FWik@B`+PfC#z3H2BzFbrb009O4&wB^Dk|JE8I2J zxw01PoU(ShGfrMKJItD6UO6MEcfH@1@ff%z&8(KD4 zyBPvK8~L)n!PQ^Ofc|J`@*&~hRlO5}E97YoD*Nf-n`Cd_yfa&?%bAJ~(WyUYyvQWVW^hvbL;juCf9+gQR#fVc4024>bT_corc68NjgF<49aku+~zo z0W%TUnUfC#-qXk)yl7{;P=H{v2N2s}U@gR(eQ3h4+0zd`fUw@{uwc4~Y^hU7mmpw0 zlC1%>5!jP^Z$2PkKL5!(qYQ>Uwg(m`F%XvsALvs(aK2^E_0c}m!=2elQcGxW8t9`2 z1bcAvceJh5?Z@#HJk$f2;YG&A{`Fx8nN4jJ$&MXcw(++;ly`F@ zNK-*!QGYFI5r&mHdaLN|!??1&{f*}G0v25TIc#freg#Bq^!WgNeGq^}xO&sFo&FlM z0St@!0DR&Xa6-D-cSQgu>H7WK#wfq6Kz;#5TzyNsyUY+Sw}Np2MqEEuySrCcwzeU? zeT=UDA$@(Kh}XNn!QuHX_EX&-57;o;$;1c9Wdx7;_f$AP0UC}|AJbFz!?E)UM!W@C zXxyP_*m%fn3&y~Qq|`m3U^zD3s1Nql@LQu(MLTc`H}xAn@a-!(a2})}J&u_t`oP_U zX^6g)eR!q2`tBh3%WFAs=P&`ffD`{NRfWqgRRMw9AU0q|c6DQkOXD&@{MUGIBW!>3 z>snMuOn>9HhV=gZOM2Daye3WWP$E!tb^gN?y#c`?F`|Y?i=Cw z!+);j!DAx_>G6yh)ge_3&9URZ3StA&(pI3=X}Y_R0fz|T-`;5j`~?p9Rpt{eI6FCk z34@Qm@XLi7w5yeEK@g~?@T-j04*avT5)hnU|JMv5WPjA`3Pb_AE=2*~9afZ}zr7RX ze(;lLV&JzCRm1qEM{UP~;GJ1WfMd5-XCR&V#6)BEI-WNn2P@8DcW5oB_ggwrmdTR+ z+p-W{L>4RE&j0>9Q{orp(upMp3!38!{0$LgYtz-JRH3$iV7yj_A-96NZ5fy@x%rF_QhDBuU|UH*>R$HI)+WqmDA65TM#?MeTEuFNUaU)FCv(5E zmN99MrB@qDr`&%h-VdX6#~MaGlPGi9;P0Vbh4rZtCO>ez@Rwh*%Al0B+%JKDc6TQ` zx7&<<2Haf8o?g_}*1Y7G;Lx~xMG5N;BB)CbT1toGb1bPn4teTs<U+y(4Cm zfrP#f!e?1ixr6Mi{5`d>6%~46MD-$8HC^3QF}D<)IG?nfxtoVs$}A8q<$rp zb>^tkYA}V(BEl!GdB8c;#6{=`0=^G|(n!-4*u4gY>Byye$}^e6yzYvsN9Pvx3jLW?A`ia^Uuc?Grd`D%_R6^2P*gq#cRk zlxg=1-tys&@a`_Ys*3#!i$FBm#I>Lq`&aWoCYEZQBFR@*{T+y&wewR7qp&Tp|4eX5(?tZYab*$B?$ zAb-inEYB9k+>JClM+?U=mS|#~{1P#m0=4ZYbhL?gp_ zd8VlHr&JuABKlnF6)Bms#o+F8c0nkd8}}9PZmFOZxFG9(`6%%H{FU`#ogKOJid1{t zM3Y&DIK|sP!vlC1MUufop5>if;Dvd-K$Pj>=lcPd?SVMWk!AZ50r)E5`m*5raThqV zW3WP;t=T)<0eOExl=<=Z{ie_Ug+K90w0%zjevEl|?C|}L2wbp99)~_#xqtNVuFbMFXJyIc-j=pjtPn&+Kb zZ~=P1wwqP`k8{x)X}0Fz>;urty#I_BezxZ1EC%SEAEIOjKNs%)kqp`KByF^BS^}>=R)(zD4$|1jU^Q zp|0MD`+(BqX@sW&vBika(g(i9w_mazu|>(w(g;4K%N+}e(9#^?{NGAjReSA z4njDnVeVOIO#njN8|?Yfp+Z)B!d=k$EH2?>pFZ?-s867@=hW~`O%6h7MdhJUwA}~K zBsFH7mY%%uT?fTHB$hjz*5vch1u?SQ`zW3Qlh3lkct2vVjGOd4JmSnG>*GjXKtemt zfn-~$r&igfc<>Os*byP6J@j*&Tyy+?-wOzZ27q5gZ|tRD!_=^gSMk0^+IjbR-tow% znC>6Av$@k!aq3TzSXzaKKEd5G>F0Xf@^$zYHPL6;LhB373G-jv^1t~UD`yML=EAZK z@TxHptq#J10q5xQMD5_S%rhf4-16)A9Q|ht*zD;=Z!?d9vd@S{hZ6qz3>&>>ihR21 z=jl;+jxLx0dC6cuiYW3wB4kLX3k&|3;C_YvH`#H?XT3E;m%tw=(I6k=c>KSU*Ka>h zT)K$={Mifn|0l20|4;JzP$q;Yvhedrg*ypj!q_1Z{viQ;b?hJf5MN)tQDM3iaXwgL z*fC&{__S0YfUTYu*P53$+}$?H?eIGRZP{BLZ6_zVn~#3wm5iSoidf@#GDitvv3kwI zebX`_j$R1*i1>!AdF(SjLu}tHfln zkl4~X$)-eY(Uz43b)Yaoai(}vf;lMz@-QPJSi-u@LCBIu1sYEjVmMMe;IJhkjm-JD zdu3MQl~_~aIgx(B{NEIB#0xQ3acp4&?l4%yEFw>$Poj1)Z0Y3v+pm-tnFwCjQfZ^V}bSKoWw!iEqrE-3@jFi|lsiG6xRAL2WG*PUjdawMWL2i-#HAG$r4=P6`{4@q2#@w#b_UcAEVM!yee^zD=NZLPs4N_V)ni>|>4}>P_vt`uU+x3Pi{%zr<`iNjjcx7S zuq?}qtj$a+iODTYHKwJx=so@o5c()ao(f&@j9^NX6)CETgjtvSlR=KsU;5NZ%ufO* znKkSYq@CgS=4=8}+dwe{9(GPk`+k!)Yz`DJsw-icKjY@(TN1}DnM1(W%Jtm`RG8{f z$`P=sPJfIl_o%=yV4|Lsql%gUW>{62SXET1D7BRo{WgZGNO4G53uGFK^Q+6<=&NnW zlQKfnM`MjdRsTU%`ZT7lMXACQJ$J|b@MvRkEn1| zGbq#3XGNT*qMn#JU_vHone^PJ6x#R$k`NC^X{+Y8w+z=JehhDYjigavilPpA?YHcw z5zngYkI#)z08rX%{TraCq+ym|P?(pTP!3b<18K`D52^6s7ne{%m={?gMY9?uo(=!j z6q%jngAS@jK?4U396c+bpf1r?QQDZBQB_qS%88DGEGAa_qWo1;@d@4hH~LUms{sqs z^oK4_Jd#P14GTm%QCA+~(|)RmkiB8*<-M~Diml;LMteA|X>#Y7zjnpdE4#gWnmPO0 z_$3|okZ9>ua|>r;b4y2pGHrR=X&YBf;owF`bJlKB-hvbIQyUi#R+*VN$moGhQhQ_W z^z63PgG>6i9((pRgO5o{%fLbuMJ~w+_5J(iR>mxpLq*Cip8nujjr2?v`*>HM_U^+w zRJm7I#QXXN_trx>7z3Ks`4d^2l5dyjCTy!=0oL5mN@)DX*H+fGPOE;Df_%7soUQY} zoSK!5Gxg)EyZ&cTmzIu&g^M$qr?=0p>t8$t<-pQm1nvxXckV0@r`G1ah0d~x0D*j# z*;=TFa`X4j?rpm&Cd`-#!6#*ATwPt#T9(%?E1)+FTZN<&)n{SBmJ*bv53eN1M(&n& z_c25UR_@Go$5IUTKC&1{hw<(U5Ju4IYCb!Aj`EEw&4_=E>2O)aIxZLQ8ZIe_sL$n? z^{}62B+9Zw4P@mZ*ZY>1r3>cVS>M;v`AX&#d8@mkY1!5tkI~xhD>Pjp{Q((7rNoto zqOnz1WG{|S)fPmj&WmZ9>g4?e<;7hCveSMd82b&HrThcwl*l4u(Ke^gHNt`x1jw*x zxUvlGI_X$-1yh7Ak~B#CbAHu}9Wqf%d>-qEr~Hng0xYPl$`erM?;ISZ2*+Wf;xR4_ zBa&CUu?LcY>7jI)M7=^dJ>X<>00)BAMPSTDu$I>TvRKr9vfZRuuN*>>(TQn=k$JRDxL^Qlqrdjr}fq`9jt2l0a|N_;T3bnnChm# zP#TK+;z+S7?EP2VU0XUk8nH!bWlRf&x&CF)w$3T(%A(cT-_=$ zrNlDi-HlaM8w&v%uZWGZl2C|VIJffYXIsuXL1Suv2O}k0#)=kFEmgvmC^sXWt)Lpy zS|%3!0CMtmUD>BZzlwpTN*7KMsPQ>^(H)YM2Kv&i!>=)C?H$XOqEWl1&@>dn#k&PD z_#OrwDl~xgoMQ6WDTQU#4qggUJ`Vq2p0)xg*I@EZ2>rpZNR2i|-q+?CiA^|Rx z1|_Fu1vN|HAD6C9X&n1|6fRIt+bGXU2GcsY`s27Y=hvoO^GTM3mvwH6s9}Jxg|Kdr zh*hp-S*m4Osbx?~Wv?gzbAc3uZW2fcBQq(5N2H(%M6A`#aFOS_QW0Mq-#qAg zZWC(zi1)0KyO|p*rLz&tsG-d46cziCwXmnJi1n?JR~V+G;>|D@gk# zWL;`Z{+ZF%FE7q&K|AQs^Umv1#-ErS1*1hAwW+t=Eg`y@qo%seeY97v!x;3Vrl-YW zUE`w#tq{zJL>^*6LsBzPD0x?(DgWX`M!+abMk)y#m+L6ILBUA91JzItbEFB3FhN!> z#*SkVdOb9_fLIrf2(aN5jrL(GS!8elFpfKyHvk2y6QmtJVJ{rrTvK0NJKOjR2$-t4 zTc?_-DRs1Th<<0nx7MUnE<_0rzEqwaB``6>NQb; z=C!_)ppsRaBcjLDKKg1@_~wbQY`YW2uzQD2VG(R=$mCcpr_(2`>YuPNkd*YusY%*) zTfF)ENYDiNBNoP!znf!*FW*+5t-V>0tvrsRL@{R1u1@2Ul5}tMrld7K3Zn`JN}?Vm zLjgpZ&oJ`2413hj)-blSvUOheIR8_IO>Ba4(jqI4+{7xg= z;<{I{x*9$_7^dw$LhRL>vQY%5Juf;xLd4S-dSTF0zjHZXLUYFGogw+I_1-_E&9zL^ zbrIj4*ljPa`*1{K7V{V-`Cju_CHWq`(pGqrNBjjBbQ|UwA2D+n6R*{o&Du)k zyf~e*ABi^|V|$168b;$y5k^fk{nrjP%t7okZt(3>sAC9#K(aAHSByO+uGN1q=QKT` zdZ_hvDbWEZ3`=ZNXn*FDmd2Yij8lA5+5jxf8xbznHFQu0F(&?%^1onFcpn3?L!3)= z9|Vy$&NXPHor(rZD3f^GNW7NFppsE-oh&bqGx=^_6~0JURK;wW?vFf_knx( zck^2NE8JmG4n7gA_LzW)Ge<-*BU&Kw7y~4Xxwx}<0a=;>hV+zTCWDqG zZ4Dov8pBmGRfVWwRo_RW3*`5QN}0~M0iryLPA5;b_J5!*q<(V-z4uQ*S} z{(i|^(1LiT_`W6LNjzK3AP5mne3FCqr@e%Z_&x>V$|zcK`|DF;XWZZvk#!vHVcRQC zVrRr4x4lkx#E$6Lhd7tmzCL11tZU@p0Z}&59aES#Q8w`%SJ-bvEVZvpVN+?89^pgw zp~r#3J21psP@x<98a^0f-vvVR9pTBcKrDWb6O>40FRmiNA;u;?7%xV0WN!6ZG7wuvn#J>+*O8K74o4B-1Qi<`$2UvN76TSsHKbj% zyY>=KPDw}Qz}A9bPA4g*TSa4D`nq$zJ<=rJzha=3j*dcQgA9Fb!@itFU zr7T1+pgF)vAAQdmw6fum8OlY{Iwrb?H}^-Vgw!2$Ol#A($XJLk7lhl!Z(n3!x-^1GtnZ)QkJqT7*fWshxHF?*YDR_|G*_L6 zSAmm#q1L@!|rZx#!01m3Ns-*F3XmI__|dgYL8#XNqcKLUyImWuNRJ`SWm z$`sI%Q#q(54S^;C=Z_&xG6ow3GwOD24i&i~98{zN_cFrBr;d5b1^qn*7l zoxQ|;^Cf)4pT#hp#l(FJC43{F%`lzK#C;1Sd?TLKFrC%JZ5N391U&jMpV{oeP<9pJ zpZJWXMQ}wIP~Pwi;~CC}f21BEmTeBCX3bqUCU)XXrmxK8GZa5DZZzUdZqH!5oKvuc5H~mogB%=Yu$?5znxF#6 znyBCo5m^toMF-hgkK`19B~_G6`z@g3O4~#N2cZSJf}Fb=2arcbbwvp4P8*a6KQW#- zQVMa*2}_UY@ zbVm+>b19Yt?pJ*1()(@U10;84TGw$2uGxqp2|}kA{iSk9B5$W?3$qAGhmU@gjG!`5 zdh=2`WKtCSL*e2udIdCSDb;7WW9_ixRaB_JKsZb?M^OiE5}ft$D)**yV8xyqt14U1RhqLzl# zy2PFI8Y+iSC^m!l0dC~u%OFk!gG!!wzc0BJ+)Eb1&eT`tN=)=Bo zEF01?R z7OrS0wQFRSESz%KO*8^vCoi>9-n1M$u*oww0Up;T#B9^Ub^tznjMqkFH0gu!N@z*t zG!#dYulW7KU}ZGv1uk=zd->^JjtKd!$txI<2FN>4o&19@d7biS_YP+82r-^VbDJ{^ zPdMLrRKY!EUWX4P?gSx=@YE93iW1v?@n)rhdDWPX*{cEf3of;l92K92QksM z4psY9Q}3f${di^Iw81@h`(!PGu-s>_9b`XVs588JWuJtNBO~BzG4S)7)vs(lrKBLg^S#(}C5x->&=5>_*?Ugqa2v+s?6ov032R&@4b?tcj?RZD^ z+JuC~r%)2_6u(-5ema9o#AM}&&fIHUFtsI{JwoforU2v^S>;%uklJS7YNO&3L;EBQ z$sce+XbaodxWl~An*I{Fm?x)fYl?S+Sf%=o&<<|AP9MY$cN+aSP^#6lE&O=H= zK2F1)QoT*Gt-bE27zpLc#KY(6NN*u~t`Xca*e;p004+BBqVm{fPZyezAkSGVG@}wp z?~5<;&lUgIFn^@*8h2heCtVDZok@?tV`;kF6x>1)Fm0`5F;Zu!H;ceXZQ(AGu52vT z5U#G0$TcnWYjVN}M#iQHd#FPAqS=0_Re_snL4cZnqi>NU)ErNdC1kW48>&P^pdE2& zBychfbY7W2n7MJ7L2=TQl4!E$)M&iWRq%D++usKAgpvXzt0k6ILKl@=!u5d-l&`a8 z{-*#N?THogmgz9e@v6Qe*Ee|ya-(K1D&p4OC&Al4!Y(85T)7$Hj<9_|Z^cEg!Mgwn z3jR=!57nXEd=JM3ZZ3nkv(m#Jt~P_X=r$S>csuZQU{VqgG`Hy8^agO2{@=#lmV>yf z$etH=pKu5sdI@IaKO-?Qt3V`0z-X?3yz-H2q-Fn_pN9Zu1l?+JOFVEjV2$gN6%x=w z5|+@wLeL8dA8yEV*_HFyrHjmzOc4z+FO1VnIYPTo*xj>XZyjMdXD}dV(u}#}!+l6j-DCh~#s;PxlKUN;Ur*CYOWL649Nub0;HEC8 z+~NF{f*6eCl(ewqfXb5_#d?p>8FZv+obZ^w2B~}WvWAQZx1hAD_Kx&nnZWA z^6s?qZneyY3G>0Y79P3McE>QCvw6w6RMYN+$iLI7Psjmf?`j{ks&2IgYM3LlF>-&) zi7`GgMW|OcarmFEVbV{r%xaa)YSqjGdzb|O3P(P7QyJi-MsPJT}p3ZwXtlmdN%H{5X++IGFTD4E3zf@j3m2y1`;&+!-$%c`6)SG`nm}8+fV_VL+Q=pXXp@ z#s=V)XLq(e$hzmzsN;hu%J>Lq5to?k8pwEoXz+avFD%0B;;liOT zS*k2-bemj^8#7%E2F7Fw@??oLn6#$eESFl08!eqncyV2M1VilBR*TYu;xf5dPYsq-~S;2sf8+`CUto!+89QdiY zZOkv2^M%jIj!P?wl#gmB4djk)ySzKkXT2(h{4;oOlSCTWxgxRc^pu6peR}CZ?=IAA zUaWrNW3kI5vU@FW8v{&}bWEhRE{)uuK9zrUz*H%dv{Y8lp{!CeehzFgR9pKktFK+g z<##a8h?tNyzQ7vT;ybi%VxHY?M`4pWjzvmFZ1?;HpWUs&)c6fI{vD0CWaC==!O6E? z2_@=5-mr#Nhwi~H*{lkDbps9$c5}1J@%V+q>vwMwbdUC3A)sD#`4Lg#<}8F7g0YaMENm5rte=;e&nYa%J(3hSL$}o$v_TT>boN3&5WX4gVhd8 zv}yh`b)tdl=b7Bw)F%XC^2L`M>8BgoFDTHbTTK~n5%`z5iZJE3WBEV#SY8t~)`@{P z$Sz)&zMKx}uQujRUV3*)dcln9SsND+vUf9pF4;gnC+AL!K|z||knUtbPZJ}LW) z-`{q*J(70@ZzGL8oKe0-z_Y{>;`%QRRgjk_1R`}g7q{&9-qnkx8w6W3Mn3>CAe}7h zKE`Lyx@ys1tSlfST-Z=o9!(!@f%pczDgXUok87__<~e|^m?g|A4nv2J2_3DD#0*(P z5hLt~8Vp4xfUQuREm6^^I#_a`1)7l>8USjW>@%N5#ombk*B z*Qa(~91SwLr#8Be4Mun@p`QK^0qcTHR8iT~ShwvQPR4!-FZ1x8$Se{az~PN7%-eQf z?;ucm86aa=E#J)sDCs1r+$3Pt|!q$ZXnZWn1)2FWB+4}6+P4@{nZ9S~Y z^1wK#nj2ZAr2!-M6ecCqA}tAsXE~FIntJa8G9}cZZrC4_@USGopE2;O>tqHL$ruHZ za7XU57dHPJaNr$t;GHKTa`~u0n?Iyk{zG*DY$Jb6 z2yI#Flt$`Ie>){Nqvn@&eATp5Lz`w}V^-AM%jDv0wpn-G8xhJk@KF(!V(&-O0A#BR zqFc&#T#4_eQfv%i6-roHPq2T_cV4^&$lu$QXcZk$b*NcfjElDRD`dB>N4cW*h~Kj$IvTW~RajtjHS z)nP3k1d-RIeP77Giw`d}t{yMot{JT}jCD^4%Cj?PJd_3d68QsDU}6u zb*-_r3%2?IzsT->V{G>HZ}bT7UR~~-S?zbv2Y#p>oGv?vZlrRrPa72AP?4{X)#v{c z3H_izx;}_3;0*LYZcXUR0=!nTjlsabwkWg44mf=+lO|7VOn#6xeJLV~2ckBa_@DZIxBf!6-OV9sUiLIL$)v zi)5A?SQ$kh6;RQ-B8f$5O%4iFO}Akkl%BDZxJ9*PXAry+w_z8aY(mEJZh8Z5iu1OL z%lS_zLC1DTWgwWvEJc_aM`0qCd-GM)4)xjRu6~iQOHrlesMB*bnE0E>{D>CN8Jod)7#FnPa1 z=gTy)A-Eqb9Q^Xt{a*fC^}pS!nVzcdndvSGI^WkW5X~(i z2TkWVgf=XeRUg?n~2JqMVWn84sLvcpZfE8$4-BuS)#%}ZE4Rz&G^ zLVzn7$Y*DxLxnT%&!74=Jn~{x78`O6M6d4!Bx-{CZ4h{M*X2O|PyxHVk z(i$}^@v{z?R=We0wN`s*su;7A4^fxOc{hJcxD&sZPkR98M6|J|7(>~L z6xg+)TyfaY;g2x;?I4em1{0pb5s&gh*z8OHoClr49;x;lpie3Nc#a^wW5k}S3Sqk} z{X-b!jl#wY<%-Rg0DI*8c}dZ;A)}Y-lg(SFk)+8OV%$HH~{kT;u7ert@ed_d=yP0Hj+hO$a%c_+n7^c*Xs#8~2xfa69Tw z4~eQ%sP&hh*YaNs7+RH;*xe3LBjWE*iM<)=9H9>{^SiO*yC;{D%>E50mHk5ft&T$M zU9^)#vN!hNBP{|k1Ro5>z#xsFBn_q{<#s>#kdNG#e7T=5{ZB*oWz?r`V zJF%VbhZgU*vy`;|IGnU;)mPl9fW5WnxZ(*uKS1l#ydLihz2Ro-MH}G-j`Pm%?JjtD zxp(Qcb~3W+M{BRxP@IB}HtCZUrK&`w1@wC0!HVe?o{3OOuScb4sz0jr+5xv|OL8d~r{!)uh3sSeiGJV&#v&mf~vE zZdJv@YRmsGJ&Zhoe5D*Z1VlRf|4t9X@n3qFKZt(nqdB9Nv3Bd<*%1L4wPB0^jQ)m# zFbuM!1Is5&SuMA(D6&IMuWS^J2NR9K_j1WQ_8|qnZJQ1W+eX%&UD{h_zHPE&^QD%* zJ+8M&d`Y+MA8lT;GRn&Oa(9}XdAmR+Uc0;>8Bf!J?;jc7o%hKJfzj-(k+aWF^rEaV zYq$X$v)8C>q@u(?NfGks-*gj&f4&UMOR8cHr_fav{=prNrJMQnx0-Gy>aU1ux55`z zykSO(8#&c(xi60~f0qlrzI{QD{>xqHRYPY)8@(Fy7Zvhd>YYY3uqm%Eys2eghlL}B zXuPCZC6FbX`0JcnM}6+eDz@rO`^-8{l8bevO-kjUl=Ftcz}iz!c1;zx;O_;_%%Yt7 z4&C*iY6TKLKj?5~QLXd>`Mz{e;zj?wH$mk=cf4tqjcBy4F((f;SZ}i2d|*o6dz5nh?uw zyk~g&`Lbk?-ij6Zcs?mR@874$E?Ddi?e>K{LNiH-zYrUpM8%d{A-y?<=N#%lY%wC8lWV5Td($;B_Ov+F<0uXKw+%)70OaLH;rM2IMsUoA}0IN z(4Z;%kCjAnP2bQu$?OU}YDwBJ1kr?ph!zbg!AyDdi04#Z(tW!R^VaDfEkBaRiX%*m zBS-lK+y9U>@2M~mPMnA%E{tQ}@#i-rm-Bqa;VUo~o)-?=NMynbotcx!Yw`~4ko88z zrERaAFJ(HP>1SH?TT!n-4mVtug4W0!{?}5oP9CAlW4X0$59#MC|L(hM`qbK_&?roR zUmedaH3Pf^qzU{r?F*2-Br^kQM4n%-5?741yJm#~5-oPiv%LAfW%@Tc9I?Av|6^_; zM{as*3qM|R2HIO)N;R%t>ujdka$rY_))A#Bp4>vXU4MPEkq&=Awn=VMChf648aUfL z(-=K7Z=`1~8{J=5pd(szF-7p!Gd$U|>)^%{CW*HB{!I!&pf8~*E8B>YrbDH$@9Lqz zjwVC%(qYd|Qas^QMF>AxaOEOQ;8<2;T^LDr;pq2bQ3AcfZ_`tyIX*$C1VzY*+xAsc1v4j)0`?H0U(0r z>iaQzdn@ik;Xg9Vs!SVk%xnUeV6+a+O-y!uwfD9rk>myEV7Zd-lpSpEi{^gF@*~SO zHtdS#xmk)aYI?}F(lxW4kGhZo`Q{X%N?9Hy(wCcQHr)7Shj84uX;dsBi>kg|auLM= z8Zqlp8&)oT8}~LYjk4J{nS%)0CKc;vfaOwH9@`(G7}2)1;!l4z>b<03An-U=6f zxKYQ};z~7qt&wGYqJMX4T{5~f!W3>|f38&Sjb7C5I;?`R)W%}WF2lqp6$fL~?@BkC zV9qqj&ZI4yReD%v^&~e{jR6@XBqXD??vtXqP?hEd8<}+LX69^~V=T?^4ei+q1*)TO(`4uyTJ--hZrOWoPirXuq(xSWXms|GSTJAI%@p~vR7ufo44wg=^ z;uU39DOWPNH@J$I%ZG(L&S~)vF_k3BZcE^Od4~FI z$EPoPq&+v$p~C-ih)v8n{?}37LG|Ug0*&&&)p`p(sQBkGDWmmglcwRHiMY96xf$`z znt$<5njLnl67ev=0#@XWA2dvm^d+ke@UQ7}`Gt)x=#?|6U-9BDPX|vsF=thq2qv_V zIW5Zda_J5z4^P#WtHa8abGaD9@n>GQJ8MaCLtkha4{xG_HzyZVb!*Z`rkb)_l+t1m zQC4}Z^KqeX2iq^1x9$k$T`!v1&F)i>4oP}6G~L^x0b1>vKNQtZirGxi@Jf;Xn5o5D z6|SmOXw(ucfA0vpSxrV%&dI9G#1=*rM;On};+mH|j|CsXg%mZMey?C4om$|cIZ7C4 zT1MS;)-?JiN`UyZ={BRqYh#o6H;W!GaWZFrIM$oTkXbv{xv6dUwvvTrLyMbXzZ652 z%W{fh!wq+ckGjaK(IA6OWznaUO-q=1SrO-o6FL670%+Hd|}0LUId|K3XO`d$E9|m_3Y*=5J<|n4CA%`b0nOuyPzE0et^AugZF**lEdU<$`=<0PrnEVoWj4P_NN z&s6{Vb2vJrFZRorGQmr%zj;}$iIRYjIX$K{_&VHtf4H4rwKf}>FjY=$?WOaO?y~3% zmH_UDad|G&A4#_!HTymv@y?hWRr96|w}$1?ql%^x$s7H6vveELL{>dZ zSu(@i+Jouf5I!n_A>Dd;K1}g;qAy*(+q>5t^kZ*CdDQxcP+#H}yp&tHxP|$nG&x2i zXr`mLU|O2IFSxuwcab68$*jn?EWI3Kb%(34Pc*&!V{JE=V!ff)D7Pf>N{_!heTTdB zpMuHy6miH^B_!rqql3v3ZUJOU1iD+~(SPXv7RtapVJO2jxQ&LslH?-0h@?ov)*Uf2=d~ zqUrK_5$;_A2@$U$uBp0_x5U9TPON((Acq0pepd2sJU`Aof1p0XHTKq_O_ zhLj=B2F+rKAd5(YML?4XeMGNF19dQc(V#b=Hg>?Lg!JBOkg+`29k_}e01b`{+l2|> z+-nOWrFdln3+?HCGST4y9I0QCfyPv?@<3ynS4N;Q^{Xwg4KqLxyo%Td{i-z32N{63 z=NY;y4(~~_2G~x#f_z~el1dNXGK@L_O za0Mn{zVm^x!$c9^KRLRg0y9CD{dv@{{GemRK*(3g0b?jpDX=pLJB&3rkLvXc*m__# zs80dR2(&~D#Chc&FoqBOq!0w`QoIs@y$4u>`V_%}Kv9}kTA(QPt0hpB_7xA-4+O%$`wo0Syh{&!z`R=yd_cWx4~W8i5bg!SfBXU^06xUP zqJR%ca3A19983$$Tgl*T&2$}L22zLl1GNV1FZ7PESK&vz;dd_5MR7TBx8CXWZxN3O zy;D9VIrZRF;8Z5-M@0TH88cL;Fr(ixf&wGkHFVy7>M*`@tn^x3cE-6@UlzrS%K4(^ug|{G(yx=5HX~Fh$=huvPn|bzQeIYl}@N@ z)M}u9B@nv4H^Hj9ah(2QeE!^C``%7c=oI>0om?(d=4P^nwD3shg|fAjhkpmXBo}pJ zXl1|c0h~(G3pp!)Zf2L#$iu9wqZQdc*1>1>Ms)7Phfn}Ku0ciHFcm!U*%aelL)(Zh zvw+9ccJuAN#K4o6UqWPLf%>kI?idf7-Prk~PiLvs@_vGvT}`@ zXYu9n@-`dn)=mxm3F^&Px60kg4e&H7`?~Gu&phJfE^`F|@kBb^O}I*jfC{&xtU z1fH-Tb;Ke59tgcdXn<|x@O)n*1XbT2@%lyjbA*fk4)bo3x6ghKdm!vIsvuk$TfMEA z+W9%?Zdzex{n0;3uC$)0+}ccj z`t7d+cDZg-XOha;TpotMdfxy7yUOlB;Tzp^f(PG?53~EB>jUS^3eY!@{eMN`_06SM za4)3L^F}M^UTFx#D0Bdm=)aS;-HDq|Fe95!_!T~HOB!B&c|iN+Q&vWIIgG;%WU&cX zU!uf#Fi}>mGEz`g6|p)z)m@42i*;XVESVG??aW@NhrUgawGQQI6R@|=@#uBicv`SN zmM_a;%`r&N_%zo^RD&oY8rKnrF^3^HC|aJi7U{G%>?1Iz?}hNq_s{OU-d>OTD|zZN)Q(-Vx)AqRZjc`Js^quS{FQQoXD^xwAn_4u{2mb$LXob5K4QRuFfUx*nf)hbN zKsdTsvf6ptSlY2VI+;6s9;6kxIR0CC)$_Rq*I!N@xlS^lR1J$G-fX~z&*p=)bk2^m zgNbIEY{io0X*?K0loy^+!KtP!g%=CtI!QgJSFQMAc~;;i^NRqxc_HOUTg>LZHk_j>D; z=Y`h1hX*RUT4#ucR)Bv$$p$LXm7MGm1-u|+HrxsoIGyuhZt zBNfI2-a~Sxy&iU)*PwV0bdpN<>h<;Mzvq8LJ-t>x*3hRbQq8$Tch(a7q-{22nbc>I zP^DhQ+wl|b-F^4BLsgB1aHVMJJCh}R3#Bp6cVIKP}Ahx&#>@06$H zQZ!V?a^bSz=F!ZD!ooIk=pKOY8J3LcTvkBXMV z8z}yr;CB-be&blNTup3;YV@wwuY%8-ZFP4=wa{IuD06V=T1mEw7$YP`fb~lp9#HK_ zT=Mz;(!qMpw$|G8;Bm#cLFK!xvP75^k@r%`QxPkd<#uIDrImv7;8kQK|KyHkXrB66 z1Idjx?yyVN@UYN1Tv8;`clO2?#cb{?{R+O1^yiqNyfF!+I@`q~J$w9jVkIJGdMx=b z&a^cjL7Ea;jAtO3ssDs;FH9`J9@PY5mgIhPcwj?Y*K-Y>5ULFHU0_a0b;(M2Ov z&W`Q0qz}P5ZfvD5mt^xQY=0AZxxQ-PoKF?+9Isb4N~O@yPcL?!q%l>h9dbT-(;2Ck z{Izr+LQ2!9IP2)1xUJE6@H5gRAdnBgx4Xz{*)+hqspq9yojc8;%9JAreK!eIX*H^P z94OSfMnK9GLeAMS-_&oNTsfCvVzGXBuD2~m?A)nc*Tb}25O~*Gk*0(s%BR4*mgy!m zhHU9AQA^BK44kXuoK@PNOPgUiFVrgYzT(8QsuMjsXI;^-^>y3ksacu%!nk?g#70ft z!55?FI5*Drb?q2kFG`QDLlLh>*VQz1ZU0S@f+#$7`Us(w0G>-eAAp7QWKVkdrE_g9 z+Y32-dEh-?jjWTXP*Uv+%57RfwDyg(X#w{p;o%uS_CXs@g+6(JZBr)>jWfTxiReSc z1A7o2a7S&dZ*`Pd3~OyC?H;ndr|? z9X*)k^YSuwqRE)4K&BLirZn_NaILjRoteJli&t8>UWP>BWww`SOcCMvsbJAan~LsL zD~$-xDa#)pvvXG1mSjbLU*3;-+@OGEUSL6i!>xpJ$gw^Y*3dATofj1CXzV25U6sUy zWgk+m7nM?(Z_l}bd(s-jKPh*>p_>! zjg?$I>cV_)(G-=uxbk*2)Xa|jD+`H7?z>*h8@<_r%<;r{>U38N@g?5!Ab*8gnTx_q z_7tju==U^*1lm!QuyhZzr3yQjg)d%G^TO8dk7FloapQUK2hmoSz{&2HpEGRQ6+9L5 zt*H3B?Amo&I|6Qe$sr6(1C)m;B`E(MYmmqO6#pZp4Pe)lzKC zM_rz&jpRRqG!NT{V30Qy3b3LPrl|_{^b@jGFq_x9CXmk{4D+SqOeW^^Np9rm)C@Le zErO1*oA@}2`}f#p2U4NdOlsGY#D}$KR{XlGK9XmF25m707xR}$;Uz^8bkv17mgirQB66gz^P|EV;+rLyd5NTX zZu4bA_YnRY;+Wnqkk7G^B8+b~jl0N`Ty_%T=LX?K((8Wtg^^7e`#!dM1`Fe!YhMMU z>8oxZUi^KX`pe!L3C6pe+C!;BI%1cxSnn=$SfZfgeHZ>Trw#l?+qB2itkJvV@^`sx zaj(vGG2^$(W1Av7_}rf?n7l zlSw<)UuHXggbt-TMsyy^!(g6ZceHiqT8aq51Hiv6nU*XF!}sI%yX>rT57aH8FR0J4k_ z_7mbeLOEJ=!}_7_*8uHf+d@6rb`X2hZdgF>v32l$5jUtmSoa<36P(f4X4~<$M%zh= zesmLdM>=B=nG(UFvys5;j`2Z}m=eK`enk&`*<^2&5Z6B-161@rA=1CwJNVf*55 z&H;`;UZp@;Uw7epb8d)%yqp2Z;F{Q7xB$U@&!F9Lup!WsvlrVBZ(kj_82gD@aEQS7 zX5IMqKe7d|g8gH6(R7e8a{ezhOjg$zu;dFBBbISv zmhkDCW)w4-EaQ;rh0;sBFu^TvBc`ph3%6Xn+?>?`E9W`BNBZJnK$|g)j?l?{K zOSjWW+*Pys3Dix25_~>XH$9_TmHl_Dnm#P|KW$o5t8%}MdMN~M{85u`pM8c3l$sg( z7)q$qJ~o*@+OpmShjBYYYQv5l8ge(BW-BNfWag^8+^8em=3R(N44XqX=Ihz6ALVc= zad7S;kX*Z>YoWeGrorCWymXyxh*eG3ZZfi#*zVEUTGjAJ*PZbal{odgFIl6FQTBJX ze#-LB;z7Ou$7>DmB!3M0!L|MP(v4DizY*)0V?@7)b-Njw+R@$6*l-q7?%&R4NY9A7 z(A-k}v(tecFFCUIKTT`q_(6evv!O;gqc^BpLtD^U)BUueZ)FGPaDe3~#7}1NxBKz% zp*-uaPW|-SF0!+9ZUOu34nwX5;)x9A&h$ftWEU~*2z$32UHoEXoHLuUiCF$pAjM_x zPV)=dMOsTmz_{L;;p#VA6Ss2?!Yt(&0fE6v-5zt-p2n1=Wi(f)v(yqC*P5n|Dc`sp zZ&Y_w9JadomF|}xJ8$OGU3+b|xvMkXrJWISf3)pwcS6~&3mT8OUstBY1Kg9954F*I zTQX=>>PzUko1T_WI>~VHvcT=_vAHTV|Elb&8x*P=II2e`>IoPJZK_eK$e*yZN@|Ot zSq{IgJ@n1ApoU}5iT6x#K6M{0G}~4;-`v19{4x5eS-gJRurAka!FZEdGi0lk%fFm@ zU+q%M;BtC(pK(PLEXa|F8oo|vD-*>iiW_r6TOGlrQ_H3EwDzN>9PaR2cxPr?ghBE0 zn}^nM^3uv#-r$*WO3QP^2YeOuXP4{h%xA<-=fEkgrE~9N#isb)VZ+R!TPWj#*Jg#= z$~V1EBbK5|`XsT2c5-!YZ;d7x<JhrZ@G@9!GC^^H7yL_6>IjdKTH78XKZKg$b) z(qdBmqVRcWuSs-hZH)wXMnqZD>|86;GcswIz$GsSjEYs+no*Otj$HCT@uW301Wo@e znal&%81;xKO~cJZCnG)1f9^WuTx`}LI!J%}H!yG0kn+!DaW1~l<8RCCQ&!KB1XG=o zN!@Rw7W%qcwjRCwp5JJ~l?I(0*J{aJ>+DGBBfted0|Ba9Hw8A&jcRY(rlXo^m$J{T zV=X5_&6C9xM|<(t!_fxAJ*k32GEFi^hg=5P`Cve*4SWFV{{%c9TwDaJ=pi6V;{W%Y z1J3`Ob1-cH??*JeoVU$ym^9O9K(*P(ys2Rly&u9(otW(QTS;U)YEib;I&xxNq$na9 zxqyLc2?o!Hy$4PP0R{#}2KGB**p5EdcjUzHj=R2`O}>tg9@LYVPyRfy|N8DcjB*|= zEVKho&bzM6W0`L+vS;HDSD(S|PYTDYM|bB>sB5oZvIrYG5VNuxp741@M~`sr0)nS& z*0v(1SsOZtvjpq$2ac5Nt_F@A>;l54h1a%Xrv2Am39@#7-09l|L{48fJVEn3n%zP0 zpqt)F+mYPfMDm-3Iv(ChgNvT*EZ;G9-m!TSOz!x20!NMz?Q$i4)83rX+vScN;oId7 zAMxAejvm3<84Vp#+Zl}<;n*1sA933mjUJ)ey@yO2H#`yYIGWyh+U*P++1u>^jtuQ~ z29HSBx)Y}1*Zh7>i#9yr@qCONiLUvPs&Oy$_WBSFli%ctq6^%TbYE(^0Q|<~YI<3Vom561T zgHaqT= zW!c!M7g&kgTlGGT>BU{{aUD3#Rxhr_67i7JOEC~tN@P9|Y|dL7u&1QDg^onq4^HPf zy8Sx<*~BglRdY$(Ru8c#x3+1Uapp*qN%$|+p+?F0Q{h{ql?8F(%TcK>Cmntxh|&yC zhu%)$B-n&J`QCt2F{0ux&b9T&1|dp}5pcIB;fjzaHNj1gg_816a9H8QWk4EF-Bd(G zO$j+bww{7eM)B~VIIbeel^q?CH8?MYlBUhgBPP3@f)eusnKs{SF-MJRCgQ%c$c^-i}+_mt-vS43p{sN?Ea|s;xZ*Bq9xr?V<*L9tsRPNWIm_^L@m6$pZ`x zpL*`}ISe#sA-GS~+!kv)OF|Pm{JI1UD7$Ft!6*$$b$4zBIx2@%o%Q;m5QdtD4&BOV z83jIbK60%iqz0y3oy^MMaz_Y9?omcS4p5tH2V6U1(SeODHmC7;G$A*ZlEbrI)}Z!x z+aMaCNwA4c$5b1h50e~bmYT0S9KE%+2F@M%H*(_Ec<>ATLmbXrv$%mgrMi09DvoL( zRrW#XQvr^)g;2H<%JG*%>rLoI@k}Em6c<)jO~VbJQhQ+q4UVH66r$3=Y6{GON2N3D zL4kx2t|Jyp)!Z5vyB*3tza}y2GMx{1Gt20=m&un0wqy3(qCFkOM%*}KdUd%pDuTKS z%myYp$sz4=h4T$ktu%}`_AkS7DdxO78F2`*wM026!O~R&sJ|=4rH0tPZ< z45$u=h-l+SOEH29Y{quJc7P31HCCnOVaAcvv?(+axJ>w4i>+gMsToY7xh3kW^k@*| zS2;kge)!;0cKlCa+p%#Iay6DwgkKVpuP7^O@QjT=?Wt75e^Y6b$qofmEzM!XjaB@j za_4AfqPqE6^Rpqv=C{E-hEh0oRQpNv#DPR-e=A0B0hLmelYKcq1>(6mJ6V`wVn>yv zRDl~ier#ARd2WydNt9GE$BjXV6V$OQLMb^G*MW>JgG+riX>pZEiVnkz*5XOZJ`eZG zL_Od=)<8-J#&*o3F6luHA45(F>OgT>%4X=kyfiec=V7l>2K(7ZJ#P3_Dv+xeMbOr~ zepA5g=4WxH7si<}METSZ2RO6agr*3v%ALk~=G-k6enLoaH<%NeHGpWc*(b9|AFUx? zOil!gZnA28IN10tW^YFW5gtqXOS*oNlmc#OV0z`>6b>x=l!I3Q3%`41u$WE>->*;= zbuL8pd^v?lW=WR-zWJpHK=GK>B#b9TqBL$jGj_>k_OB&9=n9(g0iXo+D#P!U!m+e* zUCGnXQmkPPmCH9>Sh;M(#sTFd?=husFnJ7?9x%3QOkZ#oA-HU9`em_ezx#R${^t5M zk(x*){5v6zid@UR(S?LL$D*iQHf)eRxpXy2RkE4h?)N=E8f97?jba~V+}Ik;bkKdJ z;U$&EUzw$1Jx1suC2BlfxOoBXZRdE(;b#*!UMrsVbB9DC&e$us>Bq?V?Rg5>3zh_ zN)Wu1l9Xb#A?@UnCEbt9S8`%3T)o6`C&dIq(L!;(E~N%E>q{Zc83BQUYM8R|-$x2$ zs1#+>r;V8^-}8S(^>T7)>4a8`t3;BAkD-obsIj^5Qolv!h^8UUD-C9eCbf)qZjXt0 zrxC4e*b8;3Mp!8Foj$+PSpPP_GK-!5^aP~|&cq8h?Ag_{tLekgNBRZoDWfz5zWtP{o2Hmkqt4DZZ)YwJz}|C$^8W%?TYblF9gZX z^b^Z2%ciF(g2Wd+QZ{9#WrC5gLlsbyF^J=N8Yu%L7?!TLgF)eszDu4JKt!6Ftd;($j5O7h5OfbB#qygij97!iMtfIJ+a8%u5Q?F zHTSv;&KtisnMe%I4ykWi-0;IBK6$O&7&eWzvs5_)GHcnXarH~;5HV^FgZ;oVi zV5V7@=kdSsqVKTeRXapW#Yw{M^omdKsJQZVZS=>JpEt|&p)1T^*%}MI{s{IxSz)R z@Q3dTWV|aac@aDlEjYVA2uo2)dP7bFiWq?RAJvE#x~@%|?$G&jV(>C@9*^BvCeU8K zDIE{MS{#S+=O8x@zO$FP2599+7U#%VrX3D)fhCOh2Y#AY+IYK&koZxIQ*sQqCxs;* zscL72(@f_XSpVa(CP{Xn1%9Ev6?hZ9U^&iwh#O^edI%Mc_b3 z9|1@6A8zG|n$!(uK+bf%I%8!6vBusT?}5KrAZ}EJcy8YqqV?8n?)$4IE_sW9H5xUA zO={DVqncUjQv=x#nau1Rjo#$t=7tKWe;u+NI9so{6@R3}TGYCkwRiqy+EDvQ6D%`T zt?YQ3*Xiok^jxni4KU?=sGzk?DlxzICixM&=cka4K`VM1(%nS5IA7&smpqqs(6^jR zRlKJPo3)+EM7`HA}wk1DplfIj^$^Hdd3fE(ketWhROT^aS2Jpy2Dy?~AE<2&B zefF8%jg4Iy5reHkRUelhn<6RxpDT%EI^6$IEQ2w<6NtFC#&9)Z_I1^ zsJGj3+$^my=BU%BJOvFv*+k_4d#((1ANje+*L4F8%lx zcXPX)$$eCD;h-!|6Km1A&=5Sc;^x>`(gJ;@5bM#_;>Oi>Z-G&jmHWP&Au={Uf3>4| zC$LhZyUbqKMY|0vYEu}4dxfqHa5tCkENL_SaX8`Ts3{*9GxBGi%;F|$zgUHv^DU0=DjDY^0=wif`8gHnZh@nI>}6HVZQ6+*uG=nxi2&S zcpocUYk>dD$3C~5cdEc^`OJ~8DlYFRZ%F`y=I~K+ zukP>7;~`@dJOWA;g!j)_0#S#I1C;~o*3kEK@F6V@g{<0ErihTLbX}zD^&twY7#3F- z7j|1a8@rk;^GStcv<7F$z`QM$ZNB+stSvi8ygGaA6eMupP{#=P#icqoID1Zcnl(D= zvqjBzG7zNBuhub6?Q~Ol6nRv^aj$?#KmQ(kb_5+Al0i*1MQTw4=|$T`;**G-*2CLT zq^Erhugab}V_{hBBXuWxA=vcE!vvh$QF50h^NfG*%fEH)1)6MHOtn(40Gr+e)~5Wd zLT~^WcJ)*TVja!At8-|3hOVw>->zWsZx%t~5>xl?==ZH9&U8O^vrgf~k6PT(fht0a zXm_*eR|6G`XicOr^d9)?3h=aT$SmOtc0?#B5FfhnN|ZP_l|rrn|b>`@qZ!TNP-+ry{f9k;HE5bH+H zdOg!klsev{4vK-D`DWGulg;|PUoPXD9|s>9!ficD|LiAqDn5+JDNOgatW?&;)Iqz; zC>Z?jYQ7rIMzIN(P(JQvawB+ePrHC2R6~K zj<2J44i`J#ayebPsh)RE71L)5@bO>05(hqC}8=y>&mX>;kIIOV5$GypES%;TlSPY$j z)w0?nI~#9EmI;zl>TgM=nCYp%lD6SKEW)i5SeI9NhuzIo!lqXtKV$F;?5JnV2$5q1 z0KyBf=VK^Lu8ZUMK6J09kYwtV^iOZ64{y*trUBzNm->!OoqmKnG zIjbyH4?hXThZVn8>N4pzZnqv1A}~YGGomuzH>u03DR+EDozA5u6B#hzn8QE2cC^;t zMx=)^Eyxcqq_0I+a-TV>T#NZ>qqX&V@dv0B!^`y521{r>TodJA@R4L&Lj#NsEKm9`1CznRBaJY-+=JNUk zu0eIuJ7LwEX6HPmwTosY4l&=8Aah7LEzBjJ8RdV=OfDl>Wf?gZH~eynVodTqjEhzA zcK#v#&*qXPea@8R$egOF;_BdT3uRA_v=j+$CbeIcrMXQ(OR4}VsLF@I9O8J-J#YHt zem**hn&>@OXOd4YLK?4qCIm#(>lEWU7YeHA{WH$T7ap#gh! z)A@s3pdevOQ(586wJ?kt?!cnr2b3QfHpB|NY)`)2)NpUwOfDKH-GR~wtz*bIZQWG0 za+~~G!NElnYV(|cO0S%rX|Zz%MwOB)O%Gc3Cq=2Q`3iZUWvP5>Aq177^Lm*>n_WK) zy~DnF-r827%XB>_$Ng{HRe_E^ht$lfpa=?T`hxHG7J607Nr^fvBork5Hju*6B7Mm8 z0zaM*l(*=i zNi}o`HP3frCh<}n#o2flZLFc-qi4{WiY;5%^K1B6kGiyTymyuoP0c!NQ;4pjE}k>; z4q=e+H7i9M(7F^{jEy1>W(Odm$f8g0@Qh^8vl{ZlnST_(Z9;DdEIFG86#emB#>ag0 z+G@u`!&(Z=&#P`QY|^c&sB+9ND^}=Sw z)OWyS$%j54KI4eJ*}M_h)s7y)*#!_RIW9ROo%PK*qMr3FIijDTp9P|vC7gf4X%+eJ zvF~;&fsmuVVuAGKeT97lOS^L)SWCN0A0$h=tD*>Jq^G3t56bt-4Npwvfwg%=OMU&m zyTBetAc>^`vdfI{+JP8?07=8MP*Z3we=c#z)-1G`QGe*#7q}-cqb~>8UdyJruuc5odf-Pe!?u*e*aekCk#<^ z`v8&5D=4nDaI4aoIk@!vBYo9ndDXT_m6}Oa5TnWwqkk@OXl@SMJ5f&y1Xe^59%Bya zA5l`8pbl3Z>VGSTriL8j!33UrY}_0aZw>r*mL5!I1eS|y&KF*#4cMSn&$Xx^WeP70 z5ITYgJ_sH09TTXIAc6z3hRH(%qlC=DyqbjsLV=k=c%gPAKo zydNY0532VUFb2~2J4mZP9m@|NIEmN`1xkf6h6US%)Is_&16Cn>bAf~qA1OdW$XyB0 zbWoraXclt!JBSrxR}N$!6etV247w)sLICB!?81T_LIPpIBq7(Zex!gtxL3lEKxD8d z%m)dG6rq36h8DLjmK27{k620P3IvLV%IUF^MXDkL4A-Pk-!9qKm`zOkSH~nvp)~}6&A>f_>Kfxg$W!iwPuRp)`7DT z03@<J20q!6I zBY{srco^LnAc~Mjxb8nde+X7`FXR3f%x+O2G{QRz5E@Yg;WK?24YHQ39m@#^VA8(~ zvkFm5%?H&U4=f2Pf?0)*$0UN^`UV07VZ-o3DPe8Fv}XX#gFa`20+GXzB7xaL(Bb`H z0QCLRSX)r-sX(6oOPDgqIw~(5;4+LQL>)PpuAdmj6Y7ehozMv#APs#*-Hz@g3V;q; z#p*@_`GoL7h(rLdp+(Yw`w*ncAjBYLDlk=lD9i^0XdLDP1C)Ru0t>2u$%6yCh0H?u z(Evo@Ua>=Fp}LcRib1^C-LRl_m^^5(LC7q$p9laCqBjv317WNHq7G`q@}mb%BJ>i0 zaA1rP!3-gFaDJ$ORjA&0;5p>(H;^*qt_(;q$dLwY85F1lVh#!v1JwjMQi9Wi9BIL5 z{o*jYh+vkGYq(d&kZVXkR=^|VJ2#*Y@>M@1@UzAf<^vM+1|tdq77O`60F#H1!o4B@ z5}@9(0SS-+*+5a~fDj-pq^KllF-Z1pHUHhV_}y0JgIn!`yZnQo;)7r*Fm5UE^YbTl z)(7`sO!;6O`dpXvTqpLnD)ayGbfvRCv0Rmvo3HR5vG}o@CjRx}6B*05c2QEeP<1*hvQVK+IBt1%r;UyCFc|L+~JX zvVg-ukK|s6K!3y?bkI8tDFnC+h7>c(^TKacgu&Q@2aQx>OTHvZdtBN=WI=x>~2wWDYHpiY_{uu9Ro^m;N8_i`=U? z(+@l!3dSW`!~)w4^l`<4(X8(Yt94&Mg6P9Gh^s zL46vr)?`w>hOs$fv4$fmu}vAqYn*$8m7>#R;MXP;aJs#46d|u)UeDDG% z&$ijBeZ;zaNcU|afUQ4~vlo-J*Ak%y$Ev_cl zveK?f_I_X~Sh15W-K}1_Jrz~Ad2-vbKKs5!?3H%S%#sf2S5mUZ3d3TR*xg9ZvorJR zCgWw97?M}E3#VlkqN-AaivUFC;68A*6M8kTMoD&RDC0x-*ScUu`*Mtj_XR#?6bBEj zfkLpZYF*)t0C4X2)Ep40)~rCP7M*tLSvh1-x?6(fnh`(xm&7@o@UM`wd%~@CMnK(X z6F<5i@Y%N?)ILCY>*pMvwGZVSK6)Vb*>~Xl7b#%^`TsEYRk3vhU6Xdqj+xmpGc$9{ z%*@Pe$IQ&kF*8%l%oNAW%yiB78rR>iZ>8ObeP5}%)jIPqt?3!fInt@BuBEEh=VzaBe+Mk9BqH{LD0h5Q90i>= zs^D2&HlBj*vVs-OeDX2w1dmz*g}tf1UW{+2eFS0MiaFmSYr18BHU~CLyu^Ogq-e$n zP z_MyAul4wn4w)sSY z0~mN7*-&zWcaG`N{d0Ham2W^$(7#t~6(a#Jo**6Lh#Q+KC)z6fA?5lA;sJYPbA#`yhTg`7$<%FO7NU4-4WEv+LXfWv~$U=}`-5R_t>@Y}X6b z66|5a31e$!f^j zl!Zy6>xgE!s<|RxNbvx6k3+8#`miMBIAd-V$7W4tKUJmF<{UefTy)Q+h*x(rO+*en zW1F9_Q(ny7kt?vve+uX>v zw`i{a6rK6GoeT!HkuSfhkz;Yy*)WP7lpIIP0NjQ?U-73>m$hi(YF?}qs3&8`U}MMa zaN~A|Y7Jk?2Bw4NX|JR)lI?$IVs?f0Bc~lxO(vY&J`^X)6t(w37k1AXlrfjTKEY*H z-^mDdzw?N1M!{lH$YriVY#sv$U1V1gGBbQOyanJWE@@=p_!j7mp_%$7rsiZp@iyVt zXL^IVh<)g=t!z6ZjlK-M6BeMAJU@p?vL2z%J9F2ux^6w(Q?pf*UCQD}A|u2`zsvBK z$hc=;IZk#7UoHwQ)PibAy8SLXG0axm=Y7X*9{9UKk)mRHfM$u{zpjY#~4``awEiLF(Y)sg^Sp#x`H(nG=%MPwZ0Q5< zu&-$(7Y*jcL;)lmD`QalaHUkqsnyw)yCHV@qYELTF}Qn(A;KaYLB!g?8Iu)h2GY{m zijq4)Iyb!9sgv@a@WJLyK&>c8JqvaLD>9^v zWt8f2qW*`$@!Ul-y`XK{8~81fDEc$0%sE&+x(W=SUCpJ6fcsaZ`YKQEl&|;6Jgub* z03xDUJuN0v9f=1)_lVJL$%p2&mhW8OI^&%2@9Xvac~6hZ5?@Z$B;z8TQI)2?e5*UX zJm!HjCMg5$zH*li+0e{!*CyF`T@Clzy`BS4ITi?^ z@_%sKmKiTtnJ@3`nJ94DTLZSr$2y@SqIJ&SD@w?wAeNw{}FIqx>_t1C(kumE+Xjvsc~iV{~% zx$MdGFPb(C?l?mHngXjT%Nr5=w)o-ve3An0-9k;jnBcYJol+?*GLDk%6OWEQ71A+; zl5ua4kD}#zFd1)=8vh6o)tf?XU!3s{V$fQ_V;(Xb^A4_hLXXhu_X@qqboapR-uUzO zV2*maAbRwA3M=3=9YTgU_D*o^9Of|1#vCSHX~q{^@obm^o0l}U>$;bPEf_GyL+s0W zwqGT48ySvcF|l0o>Btm~H==B-ySW%#GyAH$zVlj<)9DA`SjxhKYTeY?;KPL_g|a zm3!wly`CL`0$%?Az=&}bP)4kROjdgulruYDVY*;9Bo#5n;IYNoc-uQO8!`5hWwFLL zO6?;mtNqkF7dv!dn&s@}o2v}Q^MQ8S5HUvPpK{2lPtSG&>2ETd1%3T9LaSPTVJd6K zGwew2fc!u%##iX z&8ICt#9)a#uHKRk+7>{*AHH~0Sl{yp72Q`c2Jf1-7|(7p=bnA0&=wLG9c9kBC?3Cq z!nZJZry@l2jw#jF85dK2EUJFu7b_zc|@4WdlYi8`!eV~(F9SpKZO zj1>g?NvwmDXU59wijT9`r*ME#{s&XX-tviN_{?(S8K3Tr%JdPR^NpU%n~l@^9q&8v z@ha8xAakN?LVlaW!~0%jJNPSbk2B%J!6jJh{$U?cd@1^svVBaLK5rnQQ16^GxdNIa z)a!@pwh@#ZkH3=t+ppw5*LdlorMjK1f-AgF3d$I0U-ir_v~soy9b=QB-`r!wI)gv6 z^0u4Z_>ukT=fCZ=1Ma!e#`8hpumc`qcg|<@M`Z_`&inhLCyRDe_4Dre=bUFhkSY5p z-RTXidhEIe2snmfqQ==$+A!dP7hwD3yKV*?85>-}u@C zy{)&$0~Jps^l*F!w~)CQIBSK}N4>%UB>Fu!`^oGyvse5AeX@V`4s99W@YYs;R2<^p zC1ss{VtDp653Z1w)C*N{sJmr2h`hSy-uNw`eM8oZgYEOgu_5D5)|G&IJFBiWrVokW z&-PVbC0ao2b`~dKYID1_wmHU~^zbC*r~gVB<=SeWt?h9J-(29MhqNLDM804)mvLrR z`;EL7UEko<$S`!5R?a}6?$3LZL3$_CXA{z)dN-kY!BNIr3Fah5qM4|+WNvCRO{#UR z{n01!jk$W(fI<`Klz{%-ow*Ouu!>pW3|1eW`u@rr@&Dc9dCXjD#PLOFy-E3hlUmvS zOKP3*g)t%+d3?6(AU&hkZ6ep5N$(=pt!r`y&-tGo&$J30d@5M&bo(HBI81EOY-v%e zfiQ(r1{7EZma>RY_J2X4*$QYnKS+XvMM3_K7LM0j){2ZQpS~y#C++tZPp#fJGncdp z0ZyMoqLD5>&Q+@>_V?Nws$tglvaKFke5xZD7j8Cw$^Nsy3l!&j6w7rA8UpV%JlZ76pg`V#!%u^28Hpl}#56ubwj3osz zk-&Ym3$zOrJm;*r&P_Cv71_#V%w^5UT^T%Y%+|WH0^8FQolZ}}*1GaNt`Z$CT1tl^ zAFhR-`hPvTR@=>I+qDn(94{Sl{to2@^$YZ#N*4+*9Wj)D@R4_3IR|`BPw*e^q_Yu_ueGdrq;JhHUcO)a6{OQw zw(MB(sB7~ckMr3x_Yy)9Z9{s6X#aS{&^l1%Bqr}ezN)lu6b zQr1-O=~PkdX(cZ?=Y+j>WG;4SNZI>e(pU&hZpndT@=b~s z{~{+_jDexB>ghN;y7a1Wc`~eIlSE7|_QoOVf|zsIE@MyL9x<)8wsj`Xo}=|@KuXo# zDTt_P2E}!=jKF@{LkuIXP`jCf!M1 zjDN;Dd|djFYMIX{QuG-YXa0ASt*YxE!A(2^bQ>6J+lG$T9^P)OlD+V%zdC>OcI+c7 ze}Ct!v2}!7=8_O)xRMv)v8JFWwlP32nHTqtCTSAZCf3^^iVi&&L#%DoR#49exY*DM`O;AFA#b6?uqLqt)snCh)NSa9{aX{AIbC%vK#Mqz^JwD;t;Wx}*q|eg zORKhi$cMqm$)$c`zEelAPD@3O&s9+UTatYG^(3T!d=r~V>=abnSw+wfRU|L;w8xRg zF^_jLg;@MCa=|_v3pr?HYwGt0t)aG%V{y}9UPC_)N@5rvk;PigM0&|Q@*j@6#2*nn zb9PG3IJ5oG(c`5n4!{egmaV)g#WY-3u-9{ScxG;{7OQC0FE8@?*y;I&d`X0)u^PT) zlNAfG)F9H?7AKhs@(Jg zUj{|#1CSQeI^`*XKz{rK+JqvX`st5;8cTxGVSJ%(NQ0Gng|zY`bplS9Nj1qR-@SM+ zW?|$#tY950PL$f;-!|focY1i5rNi>St;8BcPi>Hv(dDIPYOQqeHnQm&hqDJ4)oZ_r z>#e{wxPEom%FEhH#n&sxkj0O)@OTSzlfGMOGH^ABE$iSr)R8Late{G-hLNu>V!&0G zN|C!yw(d*e>Dn%lX}C)3tZ;;_i_Of$HPICXqhAC&?DY<4=%5v@?`AiU)@V)yqPCH^ zXih~Ap5djkv38b?T0q`8k=KM;6G)@jlsys*vyumwp>EoU2$tQ!TvQ=*)@%6b{_(8x z-q5j0+fWKt0{yE~X2TNj;CX%A4V z`s(M)8I&)Cr5D#{sv4jbnL7KZF)M0CkE=k%+Vp&^;!ugp5>=oN83?gY(g6NS(+hYV ztqj}!sfr(bP5pK`C8dA?SErg~V_2q=jGv^chO*?92EJLLrd(uo0J)ZdiJpqQC~8KR zAa|Jnmw2FnV(K3Z&m9FBdmCi~7eVu7vrYDIheTT!y*6G6^Q>zwtwg%4!b0L-eSV7Y zKl&-IG*U&?pR&IztdYX-*k=MSLTE|tN#t2idE;tSIc5^+;t*!CEwr>blrJ?(Hl4&( z?NyPIrAn(Rspp?cnifnbqX~=0iAvY9^q#0E&i=Cm9a1+*TF>IBKT$80BcM9zQJp7t z3C86myDIYS)y)mVy1%^I#VYX~)Xk0LDzEse8)IxR%%}CphDA+|N}0Nff;=tQfyv~z z`URRSjI_eOC)mK$iVBpb3a|1yraPL0uG#1U*4}$ro26SQOhu=*N&Ra`84{bd+~R-G zRFD!OmwYQIXB-cwKhPLOBiF5S%W+ISH`3lK?tLjxZen%rr)VdJZ|F?On3NVqJtfDk zHR`m{ZRC0V6I3Rol1~YI)MqP@xt3tebvCdO^%3nw@K(XDem}&b>Q!(fwY73~x*K9_ zxg_Zum;NkI-*RtskzDVWk^kExo60xoL-k`qI-OCSUOj@Wmi9)kuFS3NEuLV}SwhX5 zfuSkW-XRunT~FPYzE#LEAe9pf$laGQ&&*ab^{c?-V_tSoI}iT8IBrjM(YcP2RYPkj zutKfyg z28{gI(2UaBxVQ&obazTjWyUJL(U5RanXFL0{t}Iul%igprtNjC*qGn59V9tp-*KBA z2TRd*>ci9C!io})f$#LIZ~hfxE81ui!i(e-Go`&gwXxF1R8(A}{~ULzSHX8fyw)M? zDYz?m6-==R`u*Bcbx-nat$s3OvqY}YmHI-2yVlOU{#={n_r1t3p~?t-rCs>LQP4d= zcVyrwZj7<=uS2ML-%St%>K=x9O%vWwJq6cRnkrhGdTi`3zVYsnClgnrq{Na-u?tDd zG)pbKvD3_$$ltS>bN*b=ThQtFy*2S5L~M+CZV+jB{vH-RThm?yhiqjl+)(^MwfS0& zT6k3Dt#VbEyM=arIg)OtCqEd4vGp0!NxT&qhM&8TD^vxA+e6HE?5#{eQqHT5ZimFD zKD#YM6O}iv2p6QMB6Kzvf2GE0Z(ZFV-ll#9dg>i!wO}tCRqd{!y&2BMQ+$Y4sZyxE z?WwOa$kRUXF_h)Li@tcPHU)@pcZ3@zKpSe}av$NJAF_7P=K>w8xIL4iRNwU-WzfwJ z)Eq~V77ol0#Xp_cw+QU4l6qAL;ngQpsc?MqXsez+RFBq;%pd;f6CM8L-F!`VL8&^& zR~kJJsXHAY>hW_PmFSU-f7QHv$dW1okqv@ULvJcXGvyULcQ``pe_Fovd}?6k{}MSc zYwr0}#xyW>cbApoz4x)9O}j6GdGp!Pc!CYSxAa(3dfZn zc+KnG+oDLF@`w23XF=ZPEnHTN$M6uYI@HNSKnD`||5x%g&zy$s1)jDSpn z$Me(M8NqszvV`B!&$jXxs;vp%8J_LruQlBz`MsyxIrO9P^{2Zy^s9I~`Nz+Iz3k;i zj&>?c*8A@!hQddGQMZ)QZ}3ec*-^xiZBI2iS@j+?ri)Bl`Pe7K)|X|@3Idc#_*i() z7eG|0!*%a(Rv*&lqMp2<<(P_ml^AZgG&G-QrX?2c+CSXHkqKLO?-TVVOuA?_N1|^n zv`$g0Ber_b{KW>Q=ip>|W9HM%Eb(Y>gJD3Pqj|Xc{!QzG1fTj61&U;}J`^&dC6{F2 z%H*)aaQErNG`BSS&HNS7?j3*8rZo5j zWCcC|OD#BRFwvW62hZzA5^PA7BU+&OK3dtiF9;sVFr%+X^E&#>6+wDe>mo((KB2zFKKK4jx@~;ihh$8#Q3*f@kCic{~zm z>uUG0DkZ7ePv!`3pnK)?AVK@t>C=T5-tKUUXLYsuH-s-MsdqL$pMwx$D>N_X>2LbA z2s7as{wjaH+b-0c_K)|r3$JVSZ98GQNEB4ZgvXW{r*ST?uJFI^a(xkI7be#>kQXAR zuY1Dr+fi4Ojwnc)f8$gZoxh9n-x6Op=3}z&db~H`uXJz3ApwCB=0upbM|Vg1^OAbC zXc-ot;0gxa7wGWJ8lG!?FPXu9Cnnm>m{Lh1a`uHOS*bZrQZO6f8qq3-VS zG|ijVlsxPcS8MIo3qRHtDncfpyA*GdnevP_KMKJ+NQ!*6(Bz0%w2MaJC6$J&Ee;W) zbOL2H+>xI=5!@XrFE`eO_{EngW~41_Nr!e3l8hkL|9F}{3u{t!7&fX&QDXdC>0|3| zHFeF zx(GJoL-2=)5$2T-u9IcR`mHSY2IVmu5|!BPfDL^0)xOq z;on2%MGCTf`lO@kgRsxVUrGK zLgudbG=48~I4|R{dM3RQQ5C3SQZ+zN7Y^J}`!@LD>^hmKgq_CR=;_etBPElM^($9W zF|jd&=C`@k?=DZa+|_ntFV&c7Y|c{kn(BS>R9qbrc`*ni$?bh!`-I`%&Hc`jSZ!8x zZ*x+nQkznT#l%4lOrO96BE|y2?bg0nHYeEi$pPQGWJ@yaj;(@*j`HmDJVX~H{nsCl z7}W9lKJAri)VOoRY4luCJ?5PknnWj8<)|U7H$2~InLs5Ng2o0lcTv$pPI{n~o)X_2 z3_58=QI*(-M+Xaf^RB0HD5Tl+RCGt4YgftY5MI!O6BGQP14jOrx*T8PqxqBOJX`ur zGukNuDa{U^w(f8z`Xmj%>`9_Hsf021l(dvI%eS(5NX~;_l$~Ra*-W*ju$8~2G=}3u zvh>Wk7biG4mJ#*G1n|4Z1jIGsl+_R8eroT|D!A1&LVOnfy0yF6mP#7zDy{apPuI%( zO$26e9^n(-Sq;tG1_J}l>wz>%%K>@BTYF!k1{%2@(2i?qpJYhs(_JXH8zxtvyhAb> zu@^VLx5Pc#8lllXX#ObD$hRO}T%d3#G##pcIIihYhW(ywj&A9cT#CEw55eV#ce;U~ zD&@GdIKQ@3i=CmXXwVd$V)5`;jT+hV4rf{%V>6sPFM+869h=1NS-FU0-Q^)(tgN-p zM5BCni6X%$%Ir{%%sO{*^!_-~k5IyX!Zsw2Gee$_GC2rj+6#z-0 zrsR8n0btRSbyqHmQgenOJu(mTRqQn}l+a6<1i|K9YJ4ZSO)b1EmzN-J32vEvx_Ibr z$Y`ll(!E{{F@=X-*YYYK-Djg6VYS^y2A7ofUMO`npVzXzZ3Pu4r-M;&wb^Xyn#jSI zpRHfodRyG$RR5?6BFH-kIt^$XbXaue15y|bqTMDs%}c8BOII`r%*D<<{qjsY6n4cjX7f4*rrEDsD6IV5aO8U zxI^&bG4L_`u|3ec)f>@c6a3<4IS2fLcv%QyS$BB@{K8QDJw7cy7qelzbmOz=?3(ii zPV2Mn1HECpdAs~f5H=Gz8yTtwc_s&{B=&7-@*By)Q*X#g`h6g_!x|O?e+%(*glDvci2Crp8<&hSvQcEfsbu- zL=dx=4}lavDg>5^B#|dzwM<2f%yoIdzZ`0KjMB79!EG6Vjcix9;I@seI%YuCI9q9>W8~sDM61~v^k>)V+(Rt$FX@1>EKYxi&?wFJR_m?(c-O7Sc@Ro|b+2-$Qp85{ft4tec~x)zTk@t2-pUNBt0mN`>&d~?)y}QeQoEaC ztHa}6pr>WzS&h;ZlYP8>rTW``H-HfxnM&P9N+r9Rb65ixf=M8P~J1UlcUpBW(2w2MRv9#X`1KRC8}>9Xa$Mf!Y`nRZezxZcBM| zU?&>V(5+IOth%JoWFG&>MJZPaPXdo}vX`@_I?5~?0J+1(IWrCMyy9Oub5IY@_?&qYBQDzHp@k5C%m8@$Pgs4403d__T;R8GPly|1FD8IsI1^-V z+$ljQ}uAm!ZAb$UjnU@ft2Z0!@H(~EJh}Z}yvKxWpj{`&v?}K`y z9#ReJn*n$R5}N|M`gcr$ul+(sz=-|?wl}g}VzxK*-2&D(w%r1@FOgs>9Dg(*O?Uv@ z8(nw-w14=XWl(`B(0dmf=Ys>_i1Wb!xWV}l01)GRkO5*4KH-3K2%k_uif}_{|FAvH zAVX7NeSbaM8#G`C=YtQBgYXFfEI|0$1Lx4^H~)w|&!Ep4KtSNv9{hHZaXyp|@kqlF z7gZyTS?s_!5PSlA5MBe{5z4{JS#zNYjJyz>c!x}b##nN}b0+{^yY%7BL9RIYVEjpY zdb|AL_d(xr7$NhA0cN|T;pJe8=3aOJw{T0aIWsRTCzc_K{!)ZF==>okT!3Eq3HY3) z7dSvP92-1?tsBP+ZfFdQ$=nMU;1aG0Mmz;@?x({wfb!)Z64`|hrwgjaK?2ug(}U2P za>Dr&zqizn8h#OkkK+L8U;;GlpFwB`YiHer?hfBW4_smGMgoe5uRsLk?kR#53_I}w zCJ;Qq9F6{4E8u1ITwL5U{}&jd30uc;fcX`q^;u;rL_r zOm@-2WrHl)_+kFU?sfFv{%;Jah@j{50v1hIhJ;hNv- zO@LmzKZY>-(-1VlBXH`V>x}UZSbAohn9H1Oby$}I# z2=!0~V}Pjs3)~NG02PiP+@HL?lpsEwZLrM=z|URAa4v913$O3Y8=pDlUal3DdC>|qk=jU66gV;rx;Kz^Kb&>0V&i1&LLC}`D1%F~jB+Eorg+9=~1Pht^L zYc;utgJ>E)ty>Zvg@fmI`{t0c3;4Vi*gb<_VDf3SKYUr!dl>2a;L{EHMAQ467PUT1 zSkwK!A~5MYUpjtsyf*X!G`LeAN%Ul_Fw+lYW}wUB0ao7^f_uHQg_EokzM2B?YZa%N z=_#hk#^#>2UcElI%T)0X%SZ&*vco z+1cw1R*qLB%JF)4L^v`@<-uk_ z6F4S3bCm5F^3VS{kS(L!zrc629=xS zg4nR+*rqQC*(@^)+@^Dlw|5~I5bl5esiM&3%Hksa$sE_bs%a|FF4gAfzWTwpO8Knk zAq<)B<09}nl1Z_xr?}^z)Vm3ze5pr2+NhGKr`YD%hvV6d)3tfi;`*Mj3B?IvQk5AZ zeH__wXCv)g4ljfQgmD?uC7trsmE+h!r8w>~L8^;!*0=f4tt!NI(zU*aC`zFAx4MoB_Io#ppB1Q znPziOW{6FA@S7gFb;|4{Oto71*a|3tHNIIZ(ygpBzA)ZuJ-Ge-XuYL>fS`l(O6xZxWsQ5k zQ0g79kjzGQrQ*hf_J@SIZ9AWPae0;x!N3>Myf_NDr z3i=g`Nwk2*bkkUriXQfU=jv=^^O|GJjDNNLQ+M0i_jQZDk4XC`zWe8Y8Uf6or&ecf zPEss|N~27l1UaPY{#mT}5;U2007eF1O4Nv%k-wk)ES|;vV5$~j`MuVZ84iXu*QYfJ;YP$G@ zL@yLLtN6T2fvNpY-ZbD#rDH@!u2Y48sebcX*7*5|bjSd_icHqi-2|$R&bhWN zVZ~!k*!ZC+wi$gyj)r$lphg{InHD}LAiZM=i^Tp}efs(!?3M)Q7LZKKqVjo!(z8oj z*_%P|SUcD}&Tj1u%2Gv+w1yde;Cp0!M052Jn98!w2CGUe1u!T2uu z&N%lYQEADkA#tAtW;S}L(A!PRJ@g;~dK7>L8JR|oCf)MvpV6fhX0lLm+(HNZJw(K; z1{^z1UZ5Ow)_BWq@))8NH9%$-y_Z?c8ud)Yu^wr?On8Ud=UTZ)IQTd-dDE4B(cf*x zvNgV8yH_{*2*qd@y@V0>G{5jvM+$o7NTrJ4arR5*Vv$2HhWlHEQye-hZpP4)u`ndM zE3wqrHUU;Qa#h6XN3Q#ue|nB4vW03bLs8hOCDEf&m=nLh`i(87qt_TBWDtFj&9=X1 zJx4h|NfeFuW`=#x=)}|T>c~ZX=^~O>voXw`TaoO`-xo}d?G4e2xBS89VAPR|{*Kj* zM4@G7in=sOVMtZKIlCfqd_i&_*Kj`*nPwQ4=O_~V2eYk5KGdmpq;;ZKf1?8o+z=|x z+9Vtak3mO>L7@VNuBs(Zb2JPd-9r$|Lr|+i%H*-SU#tV2ScQsbuaKLCe{&3J zNEI{ZdhUPE&*_$D0g|>N0APeVb-Jxo^2Qd=qk+1p^6kr=AD4V8;K-xF;Mms^w=4t(>FIjn?Es zlxOv9&Q6tg7I>w;_D;z1yEfbtXIypIcWAb`^c-r^tWG7+3m$%K`%9Os)*BJ_(B56H z46D7mV-VLD0=)=t4-k762&wK$ezfRKwPqg0XSQWB2}I_XkcR2lW~JIC&LU^qCX0jS zaA_XOA-n8E<@9TQ88WW@h}o$4pR9vi`v5LZrD!mWWRGbr9Q(S8lF5k;>mofW%EBE=&*0p z(uBK5s}Ak>lt@c75-&LN#5(2ev!!uXQ+TYwpj+}r@TC60K`GS+&oCN@1X|Ocj%l5l z91c*yqr9+Ton;@?AdGQ{{jKl~OXl+F(_+?ToC%AH?~sP%&(Urj*dEo&YB?h^m)1Hs zx>w0N5ePp~R$_{Q3iq89@yNe|3=d;P*rXq&*DNGiA)|}NNP>wVEzf4G-yBgur^y## znPnrtxEFgdKsyz-KwBy6CwpA`_@{Ez2BkEyf7H{S?pwVq}$)jf8o^+ip z9@TyD4r0)KC@hq8(LR$mNgZ<5PA>VIbO<4p9DM=LJ92;gi^c@#((^CUA7_5feCpBS zH5a`bqdYHXKX+GN5s#%Vyi1?1iGL;PEFT|*!Qtz>5g`b={O?mmv)`h7f zNk`zSLRVG%pH)k|1~uW{4#mGq1E-SxD8+2QZ&`kI0DK3_4oR^}rxfXBvolJGWemxV zmEZy`KOTP%k-eiqA*7e)@9j$d5eH^i7(^&XaB$oAs(X)ba))02B+>ke4H&E=+2_<2 z(Hw}6sU*4!gd=i|7FI$9G&RVmVahz(Y=~l+ZXlHBVlH}bT#l{WtVO@*AC<`s^5+C9 zC-RIXY#(>x&jGSP0Y^4Cl@>^v#NBT+BGIYBL|!s*mt;pa=|fA8@!RFnJ(go)@D7jY?(N z+A@LUa#!y24O?oBs}VFB=Y_@IL|eOf^|+jM-bmEHW#M%lDP5{EAI;`=c(#@nwueFx z!kP2ePyUKys1bWYU(UsH5`ysB<>w{Rb4LhqCKcC%9W_bk&eP=YXoi5KXyq7mg1;L~ zDm~>a^Z#0`taV!0&!X>?grhB{mJtZuKlv=C2rO=#={aO|Y(#@gQw=AhceXUJhcq%G z`ESfk%AQ>)|I#!356+6eZu{j3A61)~g4f8mDVw0>%YCWm{@Z4z`S@b963a4v{VcUI z52@!)ytRQ``F!KY;}z+QPsI4s_QbMjd~1Ia@0iZ1R9NZ-CbgImJA?YV80Qx|h-K?1jtL2@dQoBc{15ciGA@dKIhZKxd;F1bM^hhYi>amf z*EXglODN#Z+qFt>t^141Ef!t~X87Og#c#KwTS3GrL5Pk5Q~XtW2KDrG+9}_lg22+w zzGWWnu~&-nDFTH8=<*gt+7n3=W{qXIJ8=Y$nIP>9MrXOqt1brT7&USk=3epXbWMku zj2}yM4ae0c!OtAZhkk@~PaMj@7vFC1*R#>Z%UTJHBWkqkju=;5GQ=F*0|gCrn^U#f za%!}by#oD**MkH!wZ>$8h%9T}mTA*WhYgkOYLAo07VytcWrbEfvcECoTd+p;iLf)r+q=O*rfZN42s*lRy|hw`Yy@;oNVn$QdwtC&60 zD$+GQwy&o!!3}%I?=U0385UCC%cD*CNsva`V%9zO(pXLG2p9As6Kz(<%M z!|C5~&e%?xb>+WSwKJJ2vN(kn9wZ&ie>rruv|~B-{c36qsWOh?YXqL7(T2ij5rW!U zzjsW@O6uhvE|}jsk$%QTq8SQoET-9@%Cy3kt}~ZvjNe|USgYx_nUN>_@)CyEI1q4a zHT6lJUfYRySW>X7<4IlZrX}HgT_-u2AYE$T>x-SyB>MRkx3UuyWaO;pOz1_T3nk)01`5-`)5KAjm=1=4-I5HJt+#uCirX&AA%QxsrfDpAk<8#AN~@ zl4f&sKbF!OPShJtmKsi4|M%?vNxac~4e0f6(a7oZJVm}xEe(4S=;IqPEyeAY9PKU%4$m_>eLau20ahbrxGy1TY4H;0SvF;A1y{> zsJ+IuT`G@TtdsG|J9k9!4=9#;=8B>ZXwJNJG_GuwDuBW|Ylo3|QG|+qD1gVvvede0 z416~!dUVz~ciH=OHb>DE|8Iw1tALxIM=Z*vE+UsW;>!{s_bT!JkSz7SBtdKTX(*+c zS9z8pu^Hbb{~M3bkCWxED~Abcv-dSfe&OkqLgslSM>RZ@BS~x$6O}?;<@l{pgGgel z_9z~Fp<6U%uZk-Y{CW8jVR?mL=<6@|KL-indP2bW(r+q1sdvdVjzC0cVIgp_4ZP%BCql^L*w8M+G71(c=)D~<+>E7DUwVQe~<*H0^s z=)5?cS@o;TA0v%|2sI$p3HM&aYmI6?Wvq^9t&Z?mX1;ulaTXq73Kt$h$8PT&pKf2} zdI*K?xvhU6HIV7ss8zrNK%jc6(&`fy=67`4&&hSCSj9 zLOBkp1@c_H1@dz=Q?0H7cYM}(|1juQj(CDTH7X8lmB#Fq#;!(h%BgR6 zD2_ol#tN#%eVKJE0kG;g|E>C#R82pmjuCC%aTpTpCYZ`t=4dNf4du-5FF(&t79NZX zTBE$vH_c`311@oNZTJMn;{EHFPJIuh4Q=PQjxz&}=A}MElupHzPKT6E$&^lul@8n2 zI@BsZuo~0?#v^+=i-%PnAF=*q(k_{eEvDKMgCYtXb#e&7nLHtL>7eYKAqnas7Y$1} z6r$0aI4DcrdbdBhL*GzC-&jK5;6mSMx{ptara!-X*a>O|_;P5*aD9PIxm)_l*uV0r zu2q7Vu!<`rrBu!y^Bld4M%j4Ts2<))w5T*6Q}EN(B=*xg=`27*4)6&r`j!sItUWe9 z@q%7HaqOdlQJ_kz#R5*b8u8JSVy?A?bZU|v_`9fQkz|qs29X>GkQ|4QZX)?VyDkrZ7|JF)nolMkplc`FvW>cz`8Cu_QECYw z1#pp^gWS)x0%BK`+qotSU%mwa#?W!(Swe+IFwSVw$7OCKt!WINR>&7PiWdlfR${)# z8+CsCcia<-ut#}GX6{k@1u2`^FBSZ)@XWj~1r#{>G8lr^BQ;lS@0?;@6lAn`XwH;| zwWv)9Fp@|t%3`taRhlwCXI5_DPIMOt%%@iz8&0aZR#Cb$K?S~w+}d6U1xvO#oIO;R zX-v(Jgt7(+hxTp0Tyl`zq%sA!A8qNzhkDMe6I zB%CKP8mY}`>8K}LNhjS!lo{1cCN&3IfLrKt7mP9JdAGn(|=<3mY&U77k zYxETt#1K$rQ9dr97JQph<7Y@@u@)=hl_`v0QyL?vD3&`cn?_evJ!b36ESnoDJG*bN z=4F&mX-s<~6_UQ@yIiRn(=O*xDXd7=U`kPO=haZu)L>GL+VWl_-(goC8x;qoi}so) zI`SOqf`j7GT~#z#T{EmflP$jHFLu3hWg@a|hkR60ykw33(}dbWL=)dDWNd{4;1g*f z^3l4d;Ji%L`%`Wx@YK^M9{J@;N!{&aFuL)ASA+pNutZqiG}R>BpAgR>unu7@yG*=k z##!ublGT9{ef+N#y@e?LUn&m)X&A7N$iv%mqIiwi5+;?*H6(iSw!lyD|C?@swchNF zivR{T$@Kr0)Mo#$q_)m?U)3W_A+DP;?8zaujbJ4w9q=p8d3gzo^%9E2HWF#NSbG+G zM_Fe1PJVa^@#8WDD8eF#FXAef#8z1m8u9N)Y9Lm7rO)g7(Aaio`6l~FKID&u%sym~1Iz?}xF$|VSV8_EOJqr6Noh=MOm0kSOmR-6Av1Ytwg>^1lwY)fIL%y`5WHyhv*-H z(>V4PE)MUIBxu9xv6b~$2+mp5{*g>bQgBD+!|!1|wZ;S}qYB*mft50rrW>S=N(-$b zfijnO^p5WBK)fVR-M?Fx>c5hNrq)lN=Tiq2(8ovU^n4i@u8hANH2K(Lt>#d60dI+g zAbEdJ*T_ywcxJu=qBE#&qE=2%=2KG+wAC|M&M3sk&JZzHqgO0xi&IBiw+KJ`S}jA_ z-?f+v$|ok^7D+ZDp0=>1_EGHKJ^9d{2WV+-)ni?;KN*vIHGpN2z)LC_tWk)O5 zu(*zOEe1Ps1B|!6z<4+G#l}eOZ(NFsXK6#F}Cd9^T ztn+I1sRQh1t2&pcO21@1+0ilk*U=N6Opc?C7woz7X7VwoDOno@E6LL1NwS35F|Sfs zRVMSK$l2!Q5atrV7C5H=g`CAMYVJh)L8y2&7>fEYgYz0>wyrTzH2HZob;mM4PKdSYV61C-DDUQ47qVcly=W>KTC5C zl?WLtbW0 zqQnZSC)T3R%}fSRQkE$Tb29TRTAP{iBX*Y-zneUp9CQ+97Ecn!*zn?~CyR|f5qYLw zl!toeo276w6&!7qYY^m{>mD}$!rsp?=5r6^@ub!oo;+|6XuQChS1dr3Wu9i?D-}SA~{2ID4_KiTM z+AHjKt*B8ddgk9MeYxS2kyuJF=Ed^0BD>GVF^D14X?5oEZ@xcVs#WDt$D=qVaw{A2 z6XI5QlgPh@zga{(G0|E8R~E@_o&;wq1(PlX6+caQnTot?t}hhyld7Y1@SxSOogWu? z%G#(mI4dDIm+R!UHM~hnG3p;g48^xo4dup_;!%FSWhhX=$V#o3!w{A~>UYfC?V=jG zb}$GS)X$7;@hOium!%EcdFBpE8MfIyhKy1xTN~T0PHC6XRMZeNL+DrXR6A7Q#0B9o{(DOdp0}F(r}# z{_2=jj*F=w8`CaDT(*(N*i0YzVUw95li^3EOnw;pZxQ!AtzXT@8P4uuDgG`)4}_WO z_rU(aY)Ue+J+?-h3ghxC$ddkTAvVDKjdSH(KG&;$+r+UdSM9X%pwFEkodzC5wu#1r zom44-lErj`kw2D}HH_cS`ryv24o~!oc{?B!vMrQpSC`8njHpd!O1!f<3}xL2@WSh> zg;~ym@HK%q~2D`$0pBhQlS_1a7?0sI;Kx=Bu0;%WN%dAy-Qd@fxjV#Cj)}M zkLyV9<&-axINMkL;-3xMc9L+fni_vuuY64hTX`-UdZiC)X&?U)`#fn)-X8uMrzDy> z%l!CjpcJR4pA3F4XL9MgH?$zmo>6pegzu(hSz=f0R1?Rg`R&=CPB>x28{R^lVIhGI z<=d-RCG2x;Nw!4`qljv$+&hEOr*jU|ZlWtYrG@mv`CjJBpi_(XEX@7VmRe+18C}m~ zxegXEkS|2zFHPt;w;5WhfnY*vXCdJ}-Srr0;@Es*i2LbqlDiImks*AYAyk@y0K!-e zxy+c6R-Ai^&%S!Op&wf6D!X&)AaTNVw^!-)%n{8#Bg^NXf2w$ptV&xHYyMT6msS4I z&>H{E$jjkURQMw$kX#Q7y-s~hASdQiwS=u!G;f5=YP4;ZyremT?n{Kjy8>&>BEk(l*MASV|R{@vOJ*x_Poz8QQ#tuV^;G6Z>0CKjZ%O|y6{~YX1 z`P|F#(T6mgf6j!oJ&S|rW5*aw0i>gCyogaZjwXnm$LJIBQw2Rdf~Hji3($Owj-;-* zoy0$;C&>qm#~lv#w~)xTVCyq5h`N4YLN9Tg3+%VN*uE}akE6uCK&!XIlRvp9xy2n} zGpQ$~Ey(+0RPvKqBc^7J6DCHSxzSe&Nv1`W<1;cwB)6dpGu=2#OeV;-4U!JF4R-C? z3Toc8d*uHSYBLoanme!8TE}pI-E#^fXI$Opz1=(CYQQg(6MHNgfQ*bjE4M4CF$c%j zWn_dA<=)1aa^-2(+ZxPEb*dRPcdB9Fmabzw0Nt5~R2T=fh4~O?AFFdrdAu8{)2@L$ zRp=hmuc@FKj`;SI2ckLl9GTNWBAlq|ZIO~l(kC90-!|QZ4(&tvkg~$H#qFS1BI|2CZ*%lckz)ZNC`?8k$*YDhbprdk5+x-wKf?6M+{pPSo_V734W*cM zPJuQue}}r9&bmXoqNbWC*OZq^=J2&?JTxbBybUp|uXHcJt-m<;<2qG6Np{Np!yD>P z$as;d=5G48mtGRTDK`+yzh>;I89f&HJcc2?7f`b5fZx;SW9b@Yz2oa;HxS zaaV~W-mi@;i?0>)@NH2J;~XErsT1pzIbXSt!`}22+N9fCHKf`U{?J7|>YkCSfYt9V z`I0^UGVzxl(gBHw|5zn@#ufIShk#ezpK=$wn-^{@iykwl^oB}2Cr5gkH!#=;jYvf& znsg(QbF_x$-6r3+PufW_j@DU320fI+=94+P45m)4u)SkRpG@=i`xhveK1ZfEQ1xFd zA_|5e3X=D;J{G5)hZEe@aoqT}EA%^e{DBZr_m&YDTigd+JH){T6~2{)+flst=lD`3 z;Szo(h800MSNXJ^7YO%%dK7|(28J=1P*9mX|L+2B?*CQ5t&i+OJdd4gQ-d+?AowVP zD_DlZ#QXgx7Kyl}oY&rHE7fm0%5RlR4h9qo(#aCy2KmhlC31EQ!bqxqB@y_3Up^ZS zD=>|4Y%5#``eypNY-9z$`5w}#bi2JvK-FhD@eL|y zABCq+Kopn=x2%}>w{*09;Demt5qcX2s%W|qdTH;xwI93JAc#yaYCqmABSgn%Ov)db z&>?)uZ^~fN@<)2S_rl0vgKg0dwAyzT$zyc&_oy1Q`UDO}lyY`eN>e7TWXncQt|maE zxOK@dDkfY#4m?`TRCSI-eHF@zIFLIdV|jUTBx7=AMR`Ht50HR;dD#__tP_o=h#ab{ zJyk_UafBvwp*hDVwt~nKINOYj1GxsUD<*A2uIOs6i7(ctU9c6?&T z3^TV8`k@$MQPJ=ERh<*c@J<1NsXlA+^7sx;IPBv4CMlA@OTVg4ujrl!Tn_Pih^lGd z;pqs6(Ogl67|Z<^%zo%z!MV><^ZWNv0>Xi;DkgkHXGZ<`$<$X70nWjFxJbXALv68! zq?h{g4eh?(yL^4-QPSZoAD~-Y5Rs`HiD`d+O>l0T0X_aJSFVftrRc&8_1OnLwye#Y z;^^r1*Q_<1KXlkhoZPSA^u=k?`~y0KSk6Iep}f_S;RDFCu#mKSD|F7pZmDyWs1odg z3EOX^?pI}*soBk_tGlPCXIFmvGqd{dx;KJPFtScA<>TjGo&wofnp1(S5BQC1G}OOc z80b?KyWJJD5ZB&nQrkaVrnyCOfyMq1;|FYn68omLj7rh!^R$$n)7tco>Ex5_#%PWGDEA*zZyG_=z;q*S zqR02iRil!O{b}b(bFz{k46gDf-!6g(@9)sa+pdgpH*$-iA??&; zpPY#b!E52;HO7LPrp&prb|aNDE`wIp=La!Lr*dM3{#+#ZDGe`R4~96{_Bq zpm|>+x4J$_!6J2j>{KrVx;Fn|Ul9dIvO5(_bk$Ou7FCOqaq2tnvf`YI-*B14MKc%- zARfV8YHGPmnggTCuX_5N#zdc##y;>vYGv*igKE==MjeI9K9$2tWaOFGIw^EnleWJGGlF*LztSQ|O`Ey{$ zS%Br(P=O4buyd@R81*l5I(R&B;*$EYE+|;~ueC^0Lz-BYhL>4~R&Y?x7gcTGvs4+L zj)Jk!aFQ&Q+~*C}hdu_zGSMdK@iPD0D2pL=O7G>A+@TJHtZSe7Gl?F4fn*#Rhpi@~ z+~Met94b<2i5q|u2(|(;1@7KPwlc{bvEjV1%qSn@Ts0_d)I{b1venRRezP)HXf&|D zeV}M;Db}pIjShi4N@^bPbq*wJf>FSklS6S;?&~YfSNW-5f^&{vrq{Hu)oUHL77%kq z*?bGR=`~_T*)i3(IVEV6N1dR1B=8+kx2n-1r0Faqn$7qlqp$(Kd)zv`F}Cj$Ly?eWGnY}4TG%^BwHvj$9Jrb^q`Zg(b8fY)TQh@J zC(h8Gj4Z5eW-j%Ua=`jhOQ_@&c6fN_n$-p7HAs0OlbL!^qYDj9Qjb(?tc`bPBuP%D z7@S9d?GL*p92W8oDN)r83)RsR1mPDlvt~`|&`ZzojQt*(L$x|8WW7M$sPsociVZJN z^ETF%<1S(45LSMTRz%}np^zMXCa`o4e+igH^xH`#Fbi1fc4-1Jb-kD~u{xp<{_ znt^ANh>cI-u`DS*hV?VR`LyC4eq^d54!b2{dX>-#35mItYZA*P?H`>NR|6Ka>lmd4 z)7f^j!is`t^$H~y95Mud0uU*@7=PE}A|-AOl>gO3{mWr@WG;Z9X>T=-!je7~J=%tx z2l}hjuGDbDPAV~{*J@%p-pwsYpHlJIevh$KZc)PQ_<78*uFIt3uaFqK&-eqs(Oy8u z2G_u+TqKu7N$QH|)FE7#el{c+7hl%iqNyzP9V#_Lg1 zC6$m=kIyiF{n@Uef|oAK9f!mb57O z9V+)zM0phV)2b?_!|i!FrroXC9BsTv=u^2gxrA`xG+U?^#nf^*&#tZq{`(U&MQuAK z3dT3H(?ANLKP(oy`d0+?n0L`BX^yD4uE+}gNPI>e}FU%vL0D45ZcZ^Cre|Ak5~=$iVbP`sH)$ilY8}|TYM*tA+ z!wqu6M|@yzo6m;~oD{_I*yg8Jsg7ZfIb)OrV5n|XA(kK&5F&%h5oy1vhWZv53fllL zXT#L9Bh?ELtuV!xvk1m`JR+}ygn=bUU`f@3W3kWCsu=qbjW(>RuE$#u@oYH`+hHih zt8Qj^+b&K`fTA55NX%Q_84E$CoV~ru*C_HC87>?o>NaX6@<_A0jCQ@$A zFye|&|5Z{QQv;C=pMdhxtbu5>xalGZ$r%cK`Ig%=BB>}HlH-G8u-#oi+?n`KSEUwM zE+Uza$~C%Bd0*NX^CUM|nkegp(z{@=?NLA~P`;fiRM#S(iLV*IjygzPuP8(L>f}l8 z1={oOX`OsOl(^>2gSxK$95ecS>o{69L&+AhNBeP?zcR)(WUCKRSd{;M@DP9##f|_f z`zc$E_h_b;qqO!c#=JBbW57aOHH7y;H(RLf%_@|&KV2SSFoSZgZ2Kp(A6_B<0=|!X zQUt?LZgR?ub|w<<8Qh4~PKCT^g$EpxP?`j;QEdLebT7f!3q$%h^)cbGMiER&zQ;&9 zx+yifnMJ)PJOazfI>@%OAvF%ccua;_kJ24gkTdEIM6o{$h@7*wcqaf5ycl?7F{`{gDIUZNdVw3@d}Py4(Z`>!=C^w^+k@S zuwVB9+*qqV?@lyB2np>VKVtl_-}P|vXbJ@@reSH3`$Pu@TDLWfPulRpau0poLSx$P zn6%KPk4x2=Q3srV8Jmw!7R#z0EVdB0pvfM?Am4G?iH)x27Pm`!N+WE{gS6?;2tsX< zu5>F?eXp%N@rD1G2*Ne?m`cx(s|AP(6kWnE_iTpscpqN9E;$C0YX*>KPJ3&#Uiwcx zbi43gjBF!cJj*>s?)bCiW`6Byh5Xibc1b#1lKumGNi<;DsG=stzRrqAMye4ahDK^@y8t z(wmA9XGhfr;)A9no$fCOe8W0u{Ufv3*p`kvL|^nn>gMQuS9r*1;^1gsR** zue;*bszuLEKclw)&*28%3cLc&PAf!X!W;PQ8gm%e%kDjVz8seaipz_P%S(W+l^$MI zf!d8y@f+?H^d8o+<_hBF>>>LkiU|9aVmF8W+Z8pv@a|@o;BL)w+yljK)^|5Hgr%ss zhdij^Ji*_eHZeDK2z#M-^JO#ncby#KPurF~9>XkRZ<^2eqd1h2cS*!#EeLHa6Wqvx zVs~G*8^FGPUfJoU*~oERG2iJp{*rpc-HaNL9402P{MA}^Gfr?b4skP%`CdD~zbQPz zpXaZz+XWj`J>;8qonax8=yBJ~L?t}7dJfD>BHbtJBEJAXZzDqd9>i<`BE=o#e|0XS zZsyY;0|FRG4;}_jgdPU9T+Rhpt$LsJMh*kayJ$>jDbhyD)%p_5bJ=B5e)?Cbj~&$wB! z6E?jO-@3QUP-xQ&3FO78%Peaolxw#ae%ZJQHOL*2(}$3x(xF}3T@7A=_VVi)rBu{O*XBevZGa*@%k z?6c!{Zsqqu{@1+z<6yXHQPkLoL$el0=z)SkCy|t3-ff)1@g?~=M5&sKqC8EAlM;8? ze0w4YtziqE_4Qqf=*wG}nPWaXA?D!F_EP-|{M1M(!8_*v>B2L)gj2_gLqW-iKtmBj zK|#5=+psx$+uJy@xwu+6e+)8;+&usFQ*hr1(FYHVpS#}e;o{tQ9Kl@~pCH>%phAI+ zAn^s~d!ac6L3^?_3JjHQ-nz|03~49Ti3Z10?h+HPCUbQ6!$y6#hxLQ9*Wur_Vf3fK zvBTegFV_COdsrWw-3DGi_%Gm!OV7Bdw+IT8u7=SN8b+zIGcD3T7 z(Jx6cRH#zCAQC_a@LF}R2>4|hR*Dit1pou(RZ|O(VhRaB8^EXhqu4@n5UJ`}v^hOM zuxJThDi{E(iYCc{1U3aosG>=6pn+?Fkwr`BU?c#wTAVls5%>al|D}N*)UA3JZ;l2E zR6UE`AqU<|aNvXa0lR9c1wa|K5OWyNtD0uv&*&W}fEJLhpj?{c6BqzMEc^*7M37sV904}vZ;vB@_ejtXJ8xZsvh#{dCWzGun1)iwEss52^fC7sH!~ju6y5WV; zQq&+izywfVl_aDPPl_1i1t10D7xCkOaR49TI|(-cXdjp$-2elY2aM$N*l`3L=JOMPeSv>v+@L|IYA?iKDWG;i zJ0X}B$SURb2{f)|7_uV|s8TbG*s%vJ=C|X6J%P0{Zm=L?wY6|_bWoOBwUiqw$Uto^ zaz_;CEaQd<5>%^}a3cUI1H6mc5y8P~FPPwN;6hP5CioRd_T`EK6s0N@w}TBxEc8JG z?*enbT+x8gfw|&W+#nlOq1c_z0Ae+v#2t75Tj5gp4lRJK$Oj%=1>`OAK?mal>WX|| z!CAl!@he`Cw`y1HjxgY|=n)DW1r!m#;sB|r27q?B0C`1^FyM4xkN6c2$VD|Ec1IAf zS@Z}EP6P&tUvYtIfI(tcOrTBGmxLWmtknD|)gvGp;OGvhRAPLhP{J^mSGg{xp1MsT^m-Tk7eZz_Bgf{Ah^hP}ZwY>Et;(Oj7Y&7g*LtKG_# z1lIT;L4X26AdJMq!J_|{c*L&gq5~M@=w64|!-0~3Q`>4^eE_6nQc*I~|G)U(`!KCl zack}ulV>c?b~8JEj8{QXt5{NXtmSiQ-}MWjt`=N%3OVuX`UPF*JXDnhu}3#9@F+T3 z0}Akg{>B&nx9Eo`-GfVA_o0<2U!4It#8QXS(;d_AlvVzLU%L}G%928nwLB`v>Emi@ zvW-P-+&%wgul#vo*CieYiU{JX;GEmaO84tKBn@<^}2G|#4CbBypWLNCtGScfrjWErOVkG-C(!}y4W2(`|=Wy7(G*?!B zwo2n^v8WnJU+f#)4O$pwEr?2?kFTm`Wov3CGBBcx>CvKI#_DbjkUnp&Fr8}9pif;K z2xG33=KM?^^xUq(tsd%?X&5gG{X=Wt!eQ(%j%hRa>~`$82FDm1(J?XQST?BAj_3I! zkCSHxmP+}jww{*YEOzg3Xk~+35ZOKe?IBNAY&(5O{+>m4Xw_VVPF0<)u<0Ni6?wTgd&}MJa~eVtVQ94 zuM{LYM9_CQJ>c!j$*w%`_55fXr5{Gv>f*OTfUw$^tTj=C8p%WA`xqK&Ho+1?_sCUX zzgON}V9snyxQXQ$ax%TKvX+m%(%Xn*)-_Sn58qGMu10QaXHuRNq#>BO5*8nF+}}z; zBV1D3Qp+(#W=py{_W^#mNEZH7l9Y>)-CE*w9x`k;4{>zM_p(!fnmRJC4*LESUin2s zh8jSS&)LJHx=2>;RO4WuwYj#Ui;XllS(DXP9-ovEZOOf526wuhz^g_LP70bS3ZCEg zj6IFyfzOK4;%!Mh{V6Is^^1=#nchD?DHU0Zw7>LT1U4h2UklKI=Xrdnw?&nuese#feHwbqla4=oIz)8jcypSRlv0*e**`Ei&wuXVZTUQ zX^`)JYdtNH?PFClT{Oq5`wX>X;b)#Kg>8;!!Hh>Regvgi2}2}|gUb-}GKa1F>_|hCJ-p4;SYnMy@kG5y`qpw5qm?xn{n$1+y!t zCZ+6A`OLDOTGDLvoK4j>sG#rkiI|VtUx6GRVdpntA(4L83#{G4Ea=-8MhxX=KE>F$ zRpNQRkNQ$I3fXpZ%#O}Z-gN2|!NVx&%%aPQhH~26+=~^-Uq!;syx*#;J77=hZ@h&8 znEfHY;tj1oH5bL}u^L?evEq~Qtv{o))EhB8m0=#&m77eF`KC!P@8rB{S-AG2`l3De zS5=gtUV&j}isuS$-j83ozp5h>`@Q2_ob?!I;n&k^oETGWpBtoS5**PZZyU*#TD!CE zfPj;byJAY!MI!5fgHJ5!Nzk5bQ!AQ_-|lKKg7(pkd{(x*VXdUnWEm7Bot*A1f7c7V zVGw?_u$=l5 zu1q+&q2=aa%8;%+P1zm@&w5ttHE18lUl4?*7N+_ z^9G+6p`JEt_T*8?-{=(PcEh@gsbI#H#wH}c8XNqQL0H3EU))`UcdG4w1mcCmM6^b(^-t+IZJ^6eJwf_B`iZ@i zT(pvB7jJy)g6~uToOznkR0@iC78_RN1V|ErM(~FXX1#2cN92>FirGjs@Pbcmw1?=c zdvl5DA$8c@5mh%TY(G3IrGj@fLyfwW#gy`g)$86@qNk_-=`HswO)Lhmh0L8w^94jD zsn{mKX*8jyRY}@v5(`nioBbC%PXf`idyhsB{e!G^bEQonXJszdIj5uBp$^>|*5fnV zWeVFwr4ZQy8s>pp1)IPoJ8iI1+nA$HkRr02{*owg{kt^(BslvfXwgnO+AHY;)u=clcMU)RGq}FS`!Xo&C!|Uzd~_7+&9;R5h}jl5KWzo2#VOih~IV$PufPG4;5zg=f-(RJxRx`N|@A)!TNT9RG0bcIKRsc>yGkCREhx6N|=*p zJPUv0UK1-tM-WC6fAGF~y$hP#lVq#~5AAtB`S@?xAbG*wKPbVVntb_%vewIpY`a|7 z5oefv$ZG4t;J9uPrZKNma#?4ZoO1%OX*fFkC+qXFh$H?f@?T6=8xhG zWJ~Gx6uFku$~0vSowJ0Fw0PcURg#6q8y4hvYF`5=ytJ{jx61U_s%WFAQQ`btGme2y zj3j@tzyb4cPf=QVi_)KKF?#lF=oO^3EYg>QMND_+OfgjUYX&$YHBHQTYNtWT{0&F( z`>cc8T`Uvn6+9#4w;nHFDxNWBWDD;DOB&Xm#x-zQ>WjFwf1=mN^Y(N!z}x#77gIuqlRZ}#X z+Pr~Hn`RWnM=jh2r5U5;#GXp5mnSOeK%|bR=RmFi}d0Brcd;#(R zuPl*`cf)hVV_=q%$+?-QfauZ+0$$c%hl{>`+`PL+7Yid1#cCx>MjGvcpBow&mKDZl zdIkSRS)K^rvCG5KXkj|H@J#g`q)JR=n#*OT z6-ZiPR#6F)*z6-!^(I8!pEqvpm>O_lfaarW-D`HvqGR`YWW2Zp&*X{oJ!pgz5g}ba!u@(}5cXz8jhgiEEOu{F@RugWI}5Qj ztJ>>#VfaKIhN&gA$-Ygvf@J0#B3-C;KK60L(*)tb)%|Yqb6T@}T5ft^?2^Hi{y8XV zV>3s!&Q^5v9?D+FwjSJ!#I026P=Q!8YgjPzhP?`Ri_}b- z4KFxd_osJgy_qr?24VanZ<9)5T?FMy40-2K$pt78En5781&m1XjfD9s>LZC7cE& zIJ{14)0YI^t`VZb0-7x1AFQ^{m3Ek|_5I;O|C~%veRjV%;5tZo{)zDVM5n%FvaCJc zJR1dLoz7cC`r3}|2se^RDe~vr5&s{jirIrBr~1NdRw4BL{>OvJgQ=aeYKTGe`V&+2 z5mq@$SZ(1l%4hA_or6dWlAjgzBlP~jys7*WosievOep1a=nPdjh2EHZLxUbF?Mqc= z+JAEk*4Z}oE2ju>eY!W_6fJOjPg@4s?aSe9pvKb{qF?F!S66?XlRG-tyk&Ox+C*G4 zbDc3bq3aeYJ0j~6H@#FNeM%v#OzAHj761yC3hEAV4R3FsU2B#H0SeJ`s0^vUdCo7+ z*lQ>v$9KEECD?wt5Hyo3p#Fo_x%;LSxKtNv){7GPI=1a~CisWVGGcQK;9OvnGqIxa zbSCdWHHp$lSAOGOh-XI?%l*->SScQ_xy)p%av(_641WB~Gy^Z25X9%^h2DGei!aGU z3sS||)kqYy;Bs~+uKUKG_dKRYKRb9S`saq#ET zHZy8J$T2XG$sjJ|M-@^=ed)OU!v0TR^!wzwxy*xv1>d6vn6rI$_c_(-$p^82vE{v_bh( z5Q|WV930`}g12E1(I0!Kp!g~u$OEcUdL{akamrrg+*d_>bwbyrU$p6X(stCA`9%7Z zQ~E}6a>Y(}hg5k7L?9pZN!(@2?NbcGkrRoa$rDdjp>DDHzT)xN6#v+CcxA(8>WYiA zQrv5K!d669XZpzxFZhb+%^X$T-za!+ZgXLi;{%WMLGe}Ml^Sq%Vgbm@e+0mn-*vo2 zR0Nj<$A=mPhV2*tHVYm%=7Oh!x$pAsYJf}gY``F?D`L>5(krIy#?(*tue0nF41n2c}@H_YG6)dek~e@ldLjev7* z36m4>p-UY2|KerTA`92b+2iFc3hfkmznR3VIS_GC+{As9c^8B>sgZ=nkbz?U_Df<) z1bL3SuwG|H_4`54q@jeuILIjpsP@Fe(ac@35eUrcp;PR`lVNvgXKe>ITl4v0q?kaw z&6ZIOOWX;TFpb1R|9ht_VjAYSe{euYAPn&Vd!(*NL6=Iq!1KUa-P+faBFv0ivzO;+ zIr5UkjNxfNky|sxC;q^JVig#!Um+q^GiAqIbb$*;`$dyxL-D0S6Z=qH(YmLh6Xa&u^75JOA^=&vDnnC)%vRh4v&I*YG%V#4GPQ&*~=b1U0Y2Dw<~a zVbziKtKR^B5LF)yf7I8{`V8=IaOVzfA^e#xW0%Pr-r^z*zzuqVr5dP#u>Uh+`E5o3i;!>-ilma|#hiP16&Fkhc!s7dcU8^D1e=l$S0UmO zqh9q>0pj}r^6wA8pf6X{puGBa3pu{}Vq)DHbfAgL&s(LZABjCqL`==(fw!b7JypF{ zGY?14B2OW5qQ$DI%CkX3Oh6SIeH|#*R!?}^(|}VHT@zcQzy$bfBfw>W4>?$yIrG0l zrKN5;c>hoVCWVhEv1^mMQ~9ONU(R!(#d?Q-$oG8pkK1{ZJ?fMs%A1mP))_4GqWn5u zonRXRuoTLd9Z}8~n@XrFToE54z2U=jQAZS)5gq0!>jrZ_^mI#( z<&;h9DVCp;*!c72geX7ClJ<8bF#_;gKG&G`!BzmER@By`IGLW9pueRD1dY3uZ4IrX zJN^S?*nZLSj)WALk`1A>-~US?yXjJ560>_KY*-=4hqC`00eNl6s0a~PV!v;_Lklyz z50mrPbwjDM2;pZPb?baBjD;E!lgN}~SWCgq;l-A@33Oh#)vyp=(+xp+z?48WNqvdV z5-wqH@V`e`d)H9t%lsI6s@bj&yp!tMp=|{A{Z!Q`ORr_gjn5fI+wH9g$m&lwt7kKA zZPtbBE>!^7w7=i(b~Vr9;g(;Zj;q!S*5!~GD5O>d&RGlXaX%wC+$&Q)%!>dh?|UkN>8-lYSUWH2M_iXw!-32PQ4|{643u|65-=+=gyW#9!0JGl z;Mb*pVLyNV?ZLv`^@~*yh&kk?j3^0DwqlNeVfu0Z*_G<-1a7MH zB|AOn%ycFEffj*-Q1wz-Tq++I>PV7c>Vf14@mwbVawMoy$qz1EjZ&aK#Rpvc2CtvD zKb0vCV}NX?s8kcX!N&aCMo7GaFZm^`iD$3%2!0(YVJg@_guk zO_&wA7pkz%n7p+?!Zeh*C?HoUdmF?)4~wEv;-O&$#Xy=oG1oNUVd_dRhno^elpIJGY1tL9$WD+<^v-_5}v!cTcahe)sjnL7`SXhx0Y@aLODS3CTwstR4`m8Ivv=9tjl- zpE9byqy@psFst``tK#%ZuhfLiu#EG=(WgYMI@vUMz0eSD%qu(Y5N6VzF#!SBE z>Yan9-k66D@Hnbn+OCA$FD=PzUE0lV$sa3nS2C5tY>gjJ*)G=k$k+TrMs0EArYlK( zFKt+}>#G2zB*y2Kf*!p+TtX!fZ-Q>ohb&6(wN4xQV@enj^n3m7F~u+&YoxxBWFD&S z4)sn}ME1uJGiQIS)FN^0AeO$(!f%^$rlao>d!Ob+xwpWh}dt~--5aA*AvK% zjoZ8d+k7xDH)^L|T@e2x|Lb2)p3(Kr7QwdkNqzX`t948#9~emI0OPiX9~SEy3Y&sm z&JtCQHrQL#QxJ=YNRf{VnNroOL1m3dqS7e6u}JTveZl0gFH`*64@mM@1WsVD&a6I@r=!)@pVqW5z4)Nl+thJ^wU1 zAJTnxn};TkZtx33t3jHI1lguQ)d+BKL-5F~GdR@8+eg+((tjDFJL$=2Yagd*1w_RJ zV8Zu!;Oq%<+Xa-BKVC3iJ0bM2ARino6kiFeg1y^E9|*Vn9YgO)b7^`s?ua^Dnc=l7 zAbcrW=K(G~brdBjXLQLTF_wh%TrI8BP0ssNpSHk?vjXDE0LL9z2d zc-y&?S;r<8+Mvh7Vl_B!>1b|k==j(a8Q2pYl%_*X6M+A(b)`7%+W9gWO_$>Gjfwn? z6`D%E=B#-^V4+`;RdfPdx@k=n%b=g{6+j z0ZK*70gl(~5V&8Nk}CU;G{aV!CytDWD{q^aR`BcZ#xS1}Wu_64ldeuZ&T)2ZnuYB3 zyS0is!f~_87FRn0^4T97+P+WcHkaoVb#!@fuaZ3?9o=+nT**`?jb2w$wBU}-r|nFX{rbHMkC-ZRIHuIC(5{sfg3>frRVpOD(X6G0VYMkP zY>P{dPgKf!LGz4qL!K*aBrzA)$o{9AoHaqOiSka$?*lJZcOT!6Fi`NfDBR}3a-NTH znwmf1A9jv=_WJ3K@}JaeD&cu(5Dfsthzm{Wp2V!lJi)d4=UM;vGfEB`;!P5>*nkAr z?4J%|5i*L72@s?RmXTQbwr?{sLyqIx-AeZ3oE*zVlzQ`BA=G+DAtUw**}?WvZK*>) z_6u(Wcq&@YRF@jXHJ=<+pR#{Cb?Az!+m9ogH>QgB|fe2~tbT-BqFFsvZgl)qpl9}l5|EI!Veeg0t? zr6Iiw^z|mqQ3{|Mi%9axg}=jXi7K67<-oI%7gphK2g5z)B@0N}^p8g!(V;@-B)U@R zJfktT6Mv}0s9;ZXA(!ZZ7_RW{KRRI^r#^<5tAmFm6b#Sf@x~ag(i$1ADh5*d*VTAw zgW`g!EqNp-mDQv7Fc=xxo*J;*Iy(ODXSCwv8Kh z1ZEF~*hprayAI^RLFlU-IhBU$ptI(rTYfXF(UlE58QB;(wLT$0ntIl7ti}HwvgH`D>7)t$6Afj6R?~d8WaeXGDm?3+S znY1uDh+hurZGi}1dq`|sk(!CV)v7}oVJRdSmX9WdNfl>N$}BKeUiA7V7+M~VGWsTv zP?h@eL3(BS-wSo!Ez{Oiqd;FUVW+53@^>wMCw(}vvbMHMnRoqWbpa|O;E+0HP8rF7 zAC^;xhJ(hGLyFGzimRqRo($SnUY;52{(tA#4q;7o>Y>?1FPxk2oa$xp|LlkzX}h{^ zvnLH^(ZuVId)>F}xMP%B8GCtFoa-t^I@VW>JMq#=boKm+ zLQ9EvB8k@nh1a85j&&WsY82t1Sw(gTy6uhP`-=(UOX%O^UyR(~Us=4b968lQRXIdP zGRC~}wKGI&U=#Ax-SVUG43j_iOVT9z&WWq~ES&@>G+I|3`T#R1Y|_lK9wdfyeR_t433qN$Xj> zcfz^njIJl7EPN~w`0EZ2+eH9LK4Dkem0O6zy6>vElWeH2QDd`X+RBao> zjN?%qGX`8E#xh(Tu+F1^-ODqMJn z33k_>BU2N&#O7HhJ9SGda>mDIg%2O!5szM0iyaOUZ{R4DYQ9$j1&HJxa_y#URR;Wk zR~d_IHt0#Qbz-(wAF%uq&ab5tNkk38o)Aeo1`BkeFOV@YPQ!)>oq5QqBc z&#yZZAUj1?2T!Ek(O*~B?db)7o_u23IdVp2X|$PJKgUQ~pocU*&D}MkOv}&b?Xy+M zZ>;xZd$-j^UpKnfgZl11N0b>b%6_t)A_uaeY)JiE&jrj!L=ZMu@r)NYRjXX9%LhK^4|Jg5<;E+)zbd`f>{Yn(mqS|L5^4r; zI>)TOdPWHRb}PhLO#Zs*nc!B5Rx631Llwr9)SouGC2y(wukWHjV4-r~{`k6@-(#p` zx%0`twa&yGv)^sP_5ALt(3&sI+5s;!XN7 z%d2vKnhMs-m+6zZ1?A?>9H!2)XbzSaoafGFWixY_ZGRM|+yba$e0jTwd7hb*t;?b_ z_d~6H<>nkEKc4du(mF4gY+Rf?$>_Ful5zrTCq zzn0+nj4i<$2;WgG^S5MHO7INPi*WU|qdDgz!LRw+HPSYUs9wT}FFmSYbsb|E zsuyqh3+9kUx zP3aAKbJY+MP$%c(mzu{HAL^EuZcDwDy-p2v`A`+C5T@H`(9@z)?x@Cg$AcUHRfVk2 zq~55;RmB+p6-{A#RM$e|MF&b14nz3(wGju0Q*4>g0S}4xmr1A*MHeD_$^uKb|26gD`me2;-CCKX%j2~GT z8^!9HYsfc#YVvv7biGGl9(?1%6DrhiZG4iAc*Jc2Fe8JV=T~mtbh79V!U&$^-S85n zatNJ4y~V5{*LgoY9ma)e6ww_clF!*hoje#K%#lGnYQ7i4t`~mr08)gFu1TQsDp7Wd zK;G|@Bh*X(p3>;o+7qm}iqVyDMQHC*p6*Hm%YJW4a+c6k9wfqOI!VKLF49`2n2M3L zNJ-wQ@+(By(;_jyn&uegCcE`-1pS_0IyN~H_3JR~wjSFSAN>lpEsCq3XUuIh;ukqd zc_-(ZTlQ%(;;x2^>ArfnQC391y&$|L@%Audh&Hegq6oCbrc>Z-uoHPGiFXc$S{HmT zu|T#U7l0a;A$a%B5-(8|z({BuP;wVC-k*%B!Vx|E^B5pju{;wj)!vPFq1 z6_i}~msOW0^|O1`%wGrWV60Z__tWp+X4mqfbGt&p_0$@h+#(Im^sf>+Mqem^0wf#t zz+ENO-F<^jqTQEGvX-4+#pRzo2t4qXv3L`tJ8x~*d1bK!*8=P#9fbTmyvqc*{^T6; z2M3erKl3551oGe77OM`@mz_fDwer+CFF&-b)ji))D>$JqkzngN&`qO$*6Jpkhi!Zi z@&oV{`vd;ChGlR<+a|$#x~Qar!~f<`o;CmWh6GZjmcWNTrhq5dI*m`vZy-HR1$BBdv=B;K?Me-Xh4IknGdpF0-AsPK5*@1K;z1I3U+z-_xr}02d-7 z-?m3vIbNq+wn1;$>V50$&R(}ligyM0{R$#VZQPekhxVU z_3bm_G{MHVXr{RaOYb`72rzyF1Ys1suw#pFL(K9Vtg3Wp^w)44teA@P^`G1rwzC)!%Sxx4^VvMizNJzyI>CEaa<#Y$5?9n=h2V5l6D zdNpPq_oPA$Zj4%9W0)QEaI?ANK0;Q;xR0>~GkG=%RBKfE%qx!)Pv2XjK52F~4h`O%lbpl*>hVjKkB%GQ4dG14>t(dzf@k-`7-Xlx60saB>Z=5c>egQ zYs%VevS=vs@7YXSC+F6tw>sU315yFg}>=kRM3AiR^4dR7!1NsvB>=ka>2{;w=M$y6* zvRq>nh6zk$8y^`V?q7&Duk)rwL#8~-Ha@~HC-hk%CAgpv9EzT9F!?AS_vk-jGjQ)( zw!LTlATx0dm`VmWyZ$JtiF=%kX(n{0sJIEppZuE{+&oCwjKX79hoyw!DaH#gf2%ul|hxt3v zYoqA`srT2gp;nON9bbv0`3ig>M0_FKs4+dr%&%!puQ#(Q`10?ln)(u9^?;Yd%TBzW zbg8#wv00yYTfkrWMh(f2w;%YbG(;KuCWh}cPq%8yVP-CJUfp)4H1 z`^MwPlUj)9DCQTj-74gb;fWv$T$pn@f`wt;W_^!_tsRf{!Br1NGf`JBN=%bbu^BZ$ ztS1Qn@VLH+|FrNu_g(rBqoCrU#dp%x9n0!Iz=maz6;~svCx;+cwf$QIm8WW`LdX%JZt99HWJ+?t!ERJ#+Kxcipp z&I7@sSEjU-zyx#9VOns^4Pw7GEe6+|gWf&00x-R6i%oqhD9zI#pk`KD9}3;~f}D;P zqg|R2!r43;9VI+-#V_9kl^tS^;kjBR&@LQxwJ37S13K+3y6Y&yz-Pd2@a9o<8A8|R zs!T2;)fw^n`hsJ*PFiAROhI#(;#M_1lyi`MqKgb?-995xUDRe}Y^XBS<7wwN?urkL z?@x#rg7d1L;io=9MrY#B@eDELL)v`eI-V5*d;Al4uU|b|8w_pSF=;~L$)KwI!gdeB zE2pl*wtGMK1Ou6tpUDy__K2xz1mFC&DS;Cv>E#H~MS>aOc4|Kv4iq^Qr1#2}*HdC4 zQuLk7PxK4J10*rf1PVn_>nIq&(dsfL(dzUHpL-cd{7j&L`YEw3K?xLG$EzLf%7rd@ zM&itdqsYVYU<3+<{Dt%Ug^~f1B>|Etq=uu{JOm1p)r<#{++4?#@zlfd=h8GH8kDMm_BLxE!1s)t4D!DZgtbtX0?J2v!<(H*oS*##*V`*>{XKuR2MRE&szC;zI!M zl(rIyxiO4QVIFXl?JrP2&JG@{pXNizvAI+I#jE;D$RAE=bT>%cguZFV=!v^pMN-?q zUwTXS@2Z%g;;-;SC$zlkJSs#E12SLtHqu>ZkopWEM-4GI<+QW<%IH=M%?+4JYX}wA z%qvjKw%A1D80o1cCj@2=TqX{Jkkk?BDVap$EWz3GuHqHf?3I_1IY~D+&swH12e(cZ z-uZLP>GM_M!<6&;cVbhBi4lv34@efWD!;BB=p}blZ+BdBb7#8dqlZeZ+MLM1gLvl4 z_zIF04%;UWF19GqO90E3ZHArSgd@veBb}Fl0sCokoLJBQ6oURM=VsOOt@5^$KbeZYGInnjE@$okkbmH6CP+=)UFoS7ut7II{mHX^TZJzZA{#J!T)TJN!ap?Tua1yRhv z-nu1`t42>@|7!mG_eVf5GfzzV@iKBziuNdF%=HkM*)r&5*>{N9l&80{fa8=#y3`!k zPRwhv{5{u8aD4kv*-)vLqm^NldYD|s06RQqwni}`K~ZR1@pRP*=Y*He~}=e9?e z{*`xQ*{}oijgig)y9s{3qFXlv7JqLC7(Dr6j(MMuzXr%oqYDC|i@lHl(t;3^Do^%YvPKM;4Prif&k>KYjKdDUHiirajdR(|BNFJVDgcktB zswjdk68Uqih2Kw=XfQ#Zq3#^~v{zR}w@4orake4+H=HF|I-MUj1VeRbVnYItiaMQ( z!eQ!OaK;~mAa&f6CL9~a8(KfTC$%2w=#!NgCQANNN!xSx6alo1H}+7Q)a*UPn9t%U z>n5WOhr_)^QUj zxyd<+pF4K*3%pif>ui9Zq9h+CUbLxnU(XMXKs(4E49RErp5JX2wG#JNl)+z+NqyQA z5~jkxQu$8Feo#96pdFOZbLIK14m8rwCF9%7Iv;iSJNl3w9CO;dDi>NQ zg3_Vw%>utRq1s_3h50H)?&SCH`n|0}vBOFR^OcJ1>HE72bGu5u*GBA*XFcK76WX^} z+B37GXOcD`y72 zXV!x21;Y2WA79ci*I0Z0UJ_6|YX227i2(6bNWZp`*eMFW-U5Ahrth|iMEb;`c=sWE zuln(&0duXf>s!UJsU-DJ1_gazes}7jRXAJ#Mt((QFF|3eTu{9a%^?3MnLOx06U+s5 z>q*hWLa-B~o0XBT6Dw};=^x6LdW;SHwnj4k)`ZxuhJ}ajotC-Gp$TfzeGiC@h1LU8 zj00Y5%-RxtM)G%@5ICDs?p-VA$~AzyH@UAfKC++nIc^9(pf13*fF^`sA|@T7)d5db z%BrPk^P`ycZ^)_Dx$y&cXz?aru3MXr8&PcW=ApGxmD&t*8bN6T>&;=L+_U(Qnx~!9 zgnC3&!8N0h%dy^3;?R#S3S*b^D{7T`MB|X_xF4PDB^CYx813x|e>MEG;I4m>G$iQu zjA=mr3cI%d@mZbUh)C_?O11L`!IPl-SKO+2_4dK{147S4KRTI9Dt`LwP+XW#A@n36 z$Xv=*Rz5-*sk~tm)#DGj0z;jWlMiqF4>Pyf0SC>~$uXWRPR@j|2;X6tvVC4h!s(MA z4uPP@xvJikO#IMxt{C6aSDD-L1BW7-6o8;2YHDoXL+S5ZbK@M8* z{Z|huJcT8YvngZ`{cf32ocJMr-jN0w!|KPMe=_v`RlRM2~$loj?y1obkp z4@&AqklzmB&ft7Czv7jo>=l)7Kdu3*`J)l>1g6l0C+LKybgpq)n_OKLq1hs_X<|{# zJttR4s?`b0L?=Toj&nA1*lI!Sd3(KoBcsT>Ki$>%LG|lWN7glLlR*6*Ts`UxT#If{ zyLDsV;DvRN=@5>oNU#$*ILH0DF^A>mrBkrey3ZozsvcQ&-{kk{oMvqWjt47e4~{Sc zBEKP|5ncTDF3{?0&b!;@eWeIQP5F%gwX7jbc@3xhku04PT>G#}uK~}XMm@;1;iKE! z;Ol3Z)n}OMMUiTGqiVf6iK^9ZmTm)$7kC-Q%HY(j=X^|VN+F_6<|&oJr04u$@|)aq z%(jORt98h49;|KnND%HvYi!T_dRdSzMgOW_&%6vfD@i&MDA!|x&%)j|;;oMyrAIhX zh#1tQpY23iclz{RFVRyR)@v%53HFg=LX}iLXY`Q3jb!A?(U-wIp-M8aB?ZL&Rse-& zQ)zSMpO#Em%_*_yvqWNBoMOx?4GIP=ArDuyw!y|+k6gM@m#lO=4Hqs+=542N(Nju% zM@P+kLipwpv6_d5Hj4Jw8p0yxZB=XOLKPDhjEZZEp^$55(D&B-SLS(78SwWT!gn|C zF1nO!OO#7=@OMbUcY_~aF0&0=GVIH4xxYWLZ}zPm;2JT%WMLaI<05o=Gk(6|#y!f= zZ>aQ$SvqA*;D6vEQ4U-JI*0l*Y-&4)9Eu6aq!GoszyLX~)}p;*!4d2U7Hn$$U&xw$ zCY29|a@@NJ6U@b83uTE2S%k5#aH9Y4&`O5Kf{8rT40GzoGbtHfVMoueDjC{%)r`@^ z;y9&58MY)iU$|9bgQ(&xUv$u*W_lhGhaD9aEaQZE2l&dE)?sIG{k{txma9&5?P zDeZxaYx@Ry>?4R>IJwfb>13-r_|<*k-yd(IbZx&y5Q^}z!@hwxECbcW{A8Cvo9?<- zJv1F5#XpV)uPJZT_tzdTwb&zBUNN1FCZdo4e_i!;t|tw zl?9fNnQ*IzSY101(oTydNv2(~*fN&C+H1Lbi*6&ccKiBf485RawE#z7yds zV9Hr-h%Ccq!s=^B{RoUqEz+kBi!;FLgs#S}?0~ z8Ku4=Y<|%q*l{ixzT(_==Du$G@%(}Htd+mtL=WOwZeo{n6BNH?4%t;E=&1tQwa|S< zx$O*l-KIQpbs%`|jKBdd4

6a1649==Dhxk^xGA6`NRf5;mQxR)HJaDZCFwQ}aIg zvqd~GA8ET3JGN7K-;KxiAO1J4AUOHiOc|74^*>(N=rTi5cI(O|LG4WEj^QWQVs1L( zt8Jc>+je3cGjvziP1s!HDj#Ew*y0pRSMBf9elzEluw2~}Z{1Vee@y|I+9m~DIA(`d z?LU&8yUd*7?XNsJ{o%Gw3j`M36JdI$F=s}+q~&kB@G)L=V%y)V#J1jTup7$oyy~9z zM1mjwb1_y9T~JTIQ5#2Y%^f`7afW0jKJ$-5$w}m-2?aFz@^^XjcN2a&%N|EHBd;b~ z25^U|$ar6&fW0Rs@6?=heQTK5rv2_>?7l(-^Vo-kD6;8Zyk>-Y{tCYC z`{B7{*ehVbFpzg6vlWkc#zS7&MAW!vz+(7!hEw&~A?n8K|K_kDji|j3;rsC;lmg@j z_WzH=;(uuM~0{`T1D@j?>=#2w?Wd6E$=Z3pQ@k!=`tfP;rcve zTakt@&@WliY+tz!IsT8}ojA9y4$Q3{{xpMkzxv3D5?pV}>V@X{|L&-+>XU-H)` zMekvVH)RT+cu#8RmDQpSe(=L&a{%a<^8LCP1F|8$qu60FC)IS+L20WzUZ{bV^h8Ao zOz^pp5qvVFU>fVtiQMd8Y&6X-GicFox75 zI#7HBLt+wlKb)v2JpE=rK2Cv8ngpPE(yU~s>;5F%)TYD2~q|}XnG!n3(QL-$q^eclI-Xw&{Lu&ZN!-nKo(=qpvN6RC|$5^w*MZP zz7==(3n)!?1S1Y41(?Lt1*F$e>|)WhFXBwyzd4B!*!XX8VPL7X{ z4Ni|VW*5g#dES;>lKN)N`mP_ouIA$GYq{wa8FOr1Mw`BaD-jb8P6hqzJ#~%`cW5}v z49?m(GG4{E>waiUbgGNM;qpNtnurOBQ#9(*DuMHq6~r-=nu)t!qVy#oBC7 zr@i*WYljv@EQ9FD<3v})JHnH7H3f zDh1UE^GZh1&$xbu7!SFRS)njA-f1;x<0U$N!9Xqj6VNEO4%eXmTd^Y72?t2o$&##w z>du0~&u%pd%p;m?;;)3|;@@KGn1|HbF8CzxYWgdpZ0>e@=|W>nCuo#W>cygK%j=v~ zjh(J?F1|vDV|=~?6Tg_JIPw9Uo;CfUf2R8W0Obq>3}|lQ6t$X7d&-3#>XPJ2Nk+8} z$H4}-X`%(!jeHQ{1^l;ycQph~SjJPB+l+eJQwN~Y8pcZlMxiy#F;9fYOUW@MgMZDM zr3vUi{sYbM>HHuzroe({TU@PV;X#~&ba+jBTdKN!qBhrB@L{|JXq9PjB-TIvBrngb ze{A^W=3^(VGPN3lBT}icMqg95wiVKM4u~t7pA;NXU6WfwI2L|6K07&$POd1giOFPi zm&fX?O=E0?w3+LY?}_xXU7hS1d0WvbAG z$J%6-y$bH<)igxSqLcrP z-1b8KW2~rbri6`3HfZVz3bZ=M(rzqqYkr6YglBVM8~pE#x}$rD$lG5o_-LV1k52&` zWYv7Ggk5YyoKm#2$xxkk6O_MKHbTnzL`I1a?QMyP9U4ch7BnG<_ET~!dh&46ak$7? z`Aa#)jRL1pk1g+PV9djQp(bYsF8vkOAJL2|i4#L$Bvc^# zMb9EeEr5)8fIG~8qGy6#=F3eN%i0HOCBELUQapQM7n)tx~C2wTfTzq<Bgu)4Uqgh}W}3Lc7(;2XOz4;P2{ zvZ_I2d3Aa+w>f5lJye$$Q}H51&}4ahY|h+Pzyhbn@2;k$!V_Bc*lHOkI^UeryJYv8 z0&!&d(V=<$=Y`4DpGU-I@Kb4YU_D$4!Wf3MTPqEQ`Ka(hy{>R+YiPiX0W|@wI(m7U z0olzi1cEs6JDeM3O13YHf}f1l&*Dz#s9a@}b}=D+ z8?BDjt*}yxl7fPvt+g#a<-G*x(ga8&V?n9Q!}C*93&=&UN4Wcl*HsdhnBN1Acsl5O z4H3#^de`@<`NJym$?GnNQ4!E#?p8y)lMn1-6-E(zNq38;N-Ai#;$&AbOb+)?jbKVm zT{PI}%zrrDODYOU1CHS#1k21&Esj2XwKppmB?2`ucMufFY_@fY29FYiOw*tVwW!&} zR$U6(nh2Iz8Nzd83r@I75mwC?m{4E%M{0A^kUxKNa=;{!FX*9#pjRDpGyM^nk-0|C za;kuYL@kL3C!GQ1VVC3TVd!-?iYP69%~uawb?FLPl6o}^d&hcvb$<_(QP?}Ix6Uo1 zP-aqE~wdVCm09+RF;Dg z0Wmfp8x#U@NP5@vZU&dgB@;8d==+=hucNCjirvhQAS6N9gWvQGVctnnG6^}^p>sY> z^w?A)P4}4y%t|q2b?w8a;o_f%VD~TL;(y5YEP+kdsYf?@BK~Y9SmUTn!lewW=;tb_ z8x2{s6Jh9PPA93qy~!)Hsr4BneLgVRnSamT8-p+pvDyY;p9ZwME6gDr&lL@IDDnL= z5@M;cdaB~)91lJ2xPPL=_^WDKtzN@o)ZJ5}`PA9yzpS|LR`C~Gi5bd+m?cxxkSyXXeDSw=z)Z>Sl-)1R z9W!ISOge>NrT_*(u7WGEY(>+{FS=g3LHD{pbFydtqYQJYY}nV#1&?g(uUJfKfBoJ0 zF?6F*Bit8+*RM%Sn8=p%4WEe5NbLeIY}agA^hCn;ARO0fS;Ry_%XTAtu$5kt(?3WA zaRhO`5P_&0J8ArIkUu(SR^me#P$2U9<$n(M;z#KIB|sbq!PnN-8W^(ZJ{Q^QMJ z$pe;wONw@YTwn>mpn*)9>_l6bKdl8WfXde{Qf3jO~kuBuf;Pb^?2{Bq%R^2Wa_ zs7yk7cUeuT_M_)sjAClTd+O#P6ueqvQgN$BT>VT~A>v)rs_)wK4j98k706D6L`IHd zK0pjGB(tZ@xK&T@pI}&A?7=qB@u_Im5xFf?kd9%DqXsg*s}S9yNG%fV*R^vY&E@H! z!ivn)3M`RNNS%AdbJ>gG#?ntSZixm1Bb^*q8vg!#!8T9i2MY1+AMfjWHE2o(W0As2 ztFa1t>f_%c{UZAlo;N_gOzvfpHuxNFFt1h=*b{(|hn-=7YxFKSdgV&Wdag3WSZGHo zbH-X^4M(gi&Xt{kp}Kp;*JY$EBXdT2G0uBz=3aKn2j2{bLuIHV1$y7;4qC=m_bMI7 z_N`v4v9(h)*^;~m9irIY!)Bx>k+N{bB(+qQDB_sQMkn735$8xfhk-dqQUF__Rkk<- zDwbW81kohkCnLeop}R5Iw$wAw+>=VJg##7@1KLMyAxoB(U~cScz(zx&W$-sgZa-Z# zMsWh1ed(5=C`3_a37qApTbr&oHOZctyzC?pD`OmngJRV8(2$6x|78tg%-2pcQZ2oh zu5YhU8n;|vT>oy|pn)hqz~g>84~GCYQ~VTVQ`2tXJ+rcbT<;ES<1><%41;Hgld{Eq znx}cx*_KDVNT+R-Y?2%(Ya15}epI1;q_e?Vtgov0g}-(^_AF@Dxe~yMx)56XuH`q2 z$7{A+-`&MBy-+fb>-QjD4V{>5HLKQUmln0yr+!*5R(+*-DFg{xxY z!e^la`kg$jrzFY&oR^GNu1aPutNMNhSVK~cOF|4gVs=_--^m`1q{R+LtAtj@LY_fj zyRdecEMioglrzUCAv5n(5R_r(K;;UVQk`ePtP_a1?KjeEy@2Xe#^P8@$zRnEaF@p7 z5m8b+Mp~U8tfM^_^Qk7g+0;D7C`dP(ye>~g@TAmo4#jQrRSCEa6<#kWFp}~*GN08| z*3f|0fyxy#BZ0I5)Nhg=^pa+p4)8y4Lnma<9+B$!Va{a#Je$|eK(vG^v{0{+eTJA~ zhWswUTZoY<8A`BF^vWBYQYb18GZCjmFo%Hzzbd<}Nh*O%PxohclKmZ)2FI=Lk14>P zLjlC)YrLBQM?))1thyIYy_y|UO3SvYqu04lNS#Y6vuffP z)ap9gQeD<%($GcFeH8e7SoF;?DvOh9`K7jwc5ExwBA?kmc(Xe@v)bacyF0o0d1)QK z^I>(@YR2oMsoG`79Qa)rL_O6;O(&{EI~JChq&bT_%NBH?mULh=#-o|2a(rKwxTKl5 zRB)x4$h!Z5oye+{*hFp9Mt!Ba=_vLl{??MeGV9}T<4$Wv`?A^Ov0d#EEJ2Oek}ovN zmgEpzKd<+aJnOMr?QvS|aaijSDeCXcMy)e_lLa@{b^Kf)!LF%(8rzz0opeAoMn-#L zdh(sQhJQo?{5*-3j*)g0Gx-)wb7Ng5ROT8W(IR4Qrv7St&+5CyOFFO^W2HR-J>gGs zAnEBqg`4)0n0lKe*%0lyqTykq=4s7eyVg8`>wQOK|3E61@X8DOq~$t^)duA{Q37g{ z9SMX!`+H=~q3Fn8^Vk}aO3<#56tx;wo!gHLAY%*kaFMfx#7dHyU;-FN0KAz8v1ei( zU+SAIISok?nPd}oBfsQpvuL`ad%IcLsYWiNZ>L(3=Os*eqe@^Q*m5Sgk&%;NeQwU9zM>edMeV{#bzyTp!-;IMl_Q|Mgw`UJd4uGlDt#ndw@|`d z@DF#Bgt;L7tk9q<;dkS8cfW?}<0j%J)A`9^CcRCtnbkW_ReCg6aen7YKujiFY$ zTSzt1tx(BoA3~NGdlxnl(bB ztf?CTM5hZUc~A&xmIyMn?4MD%Ac4c@hK`%G!_E`yGY~=%T1EE%)vGqvoZp;t%x^_u z_Bi%;Yai`v%pi*y}khD?FQH!UkEumsfH9#`$Fia3d}|p)N&(eclF=Z>=gC zx1)iSr$aHZkD+A@VHLudW4WoPRGZHV!%cqpb1QL>`9pIGD@-3t!eajEeO{Vvsqds^ zviE7o_+$Y$v`!iM=`{S0xh^ax$zPIVmK(iqlWf8)quUfO3hd1UnJ`YIh6JNN*xTYFJk!armBWW zA*M||QD!lJl2_#oVNRrRrUa1M$0qN$Wvb`|jhOJKh>axmA31wmG zp69|IkX|Sw?XjLKMjb#HNN_WZz@LaNzP+ls=QL!mSYXn&l`UROzS$qhcPUISzd@a) zd^k3jC2cIzd5CxkO?_D;OiLJ8%8(XxDMI6cZFDR*CewTL_9h7b-z*UVu8~x}H4O-5jA7w~uya^_zltEge(h8-@7VnLR7U!Q+qq)i z!Ta+mhx7@#^JU)4L-Za-`cBpRg#{xKejpx8N=;-r<6rT6jY*HA7fy-|a>r0=Im9-U z^qikf2}xRjO$%v~mrVi5i734Q(*4h)dGEBs=%T-U{$6qd#DHY%t(`Fhn=i6`!dBn@ zTe8s#*Z3>GjM|T-5Y@r=@zF)mfOv5+DipDSaIq2j5GJT6j0pRc<_IQ;FA4X88caGw zJ>-a=Bj_LDLskhv>hnRH6P5>H=Jq={+#uirQHG|_FvmblrI@&^BgvP z8CGo4=(=LRb}mQW;x(>}CtDW94=556+tfxq4_=%ZRdyyA%h%(edl@8*1Im$A5^K4h zXL@VGjm2!IM9#sfGqi?lSA;~JAt!bG6_cu=oG6A=eUAzm>4wM!DuHIcOfjl;HM7LA zI;FzoeqvvJMzsQ~NHEy5+Ovk~QW(UH;6SN_!jja;MwmfK)ch+J1!)U&U4 zs5b>EWLv`oeU9<;%>*ghsV*Nv1sX^Z(`;TVk2Ad>0qa7YyCD` zX|iWaJyetWuX{vFm~>3nHU0NY7PYCgvYGk{aVGe&7z!t}Dw`gwkq;1=kAk0c8jZXH zzk0#)gx9)ExJ0Z$iSGIjT$X+r<$yA{l4dYWM@?ryO=lmHm#+3B(UC%>CXMQ|e~rg1 z-}T74h$T&qaapY}V{} z(O4uS-B-h{V7A$k!>h>B{qJA8XjF5{G;HfNYCR3#NvpGz!qr8SE+gSs^R;}_#)?3z zCtoYFJ~sv3HM8mqR=@ zX|e+3Gy{x@bq;3WV~NVO{3m}|Fo)!^sqz!Qca2Q4`Uh>>5ic=t$`dU7%#$~k9;K3| z#n$ESP(=G1RlBMz?&i&s0H=T3OE!A$%Pq(PZN%`HQfu zr@r+`7bdwHs5ol&Ga$bFXLdQguP-pegoxY;j2sAVKbBA^ONkg*yZBq2?~iy6LVSWZ zu$UtL(Ld*Bcs4RfXht?N79Rjic9JQemKK4WoIR*asHm^}IR4m9a|HWVNiJ;il`V8q z_49pLhzw?sC6ROsv*EZrN&pUA_&yg2!ia;~US~cRi6{Q}dwtZv`_|>ZENLS0Jl_}Q zx!Y~CMks+4!2}>2L$|<9yi1Q(qAZz#SD%kUiCr5fFkhUkxUX9A zq-nkzh?gKu71R+$e_lhXt+pB-nKg(yBuUjVf-vZ2v>Np;WUt! z{+|RYFc|xB6Zlb#-t8#SQ&N9`Z?e3?ncPC`2}dV$`CBE^Q6TJ?O>K9#5+2G`8)w5( zyBKYfQD3BqW-TduJke8qE#RI_-B*VN%7@&i0_rVMY%AXv#ge?S%x*d=Tdv(K>bPoz zed_&NFw79=<{u>XynC^J-UN#m%TwnHZ=%&s^QwlYVZ1`hQ^ zYJSP72WXnifNk(Yj_T zJ*4`9{E3Wt&dj)sHY&@9I8u9(gi3X=gmbI(LBeV7ni4%ttJLhog9aG6=9y|}gP&{p znE>jB@2VNvMy0gF%tb02>INxE>#^}he{6+F9n2X$x+LzHutwB>|0Arr@ek*&E$GkC zh}sjQZd58+Ic7NgW75#;SE*=P08}q1FQ0NQpT478GV^$9%pi`#n({+fB_JD@m1kG{ zCTdDBN!6#yx=6%;8&HlkZEQtsY{hJBg=lO=ZEVH;-=5E;?4_++nYFaBRjhSoUD+L| zalzb8dS>N_XX(ge`S8Q?K^La6mBdrS3anKlZ`oXYTG>Bl&DnMg1W~rs7I?q7sfurx*o`!_JVD1qVhy#toMo-rKI8CVd z<2X$>a+Z`9t3-l~efey`tbHiISU7Tw@7)EwA^+K2@Iw|V$RSq32k~Dl70jp$F9qJL zSY-vdkaMxbn6t3DdS>NNEuBQo1zK&rN7BjcZAJ|(jf{+`*$PV<$r`3wYek6B8k~MW zV~ZtIWC5GNm*z=R%T4sS5kN5r4;7##K&bLDIr2&Eo ztrRV6$Jj@p`@KWMwaz^19moma!svr+vJBVFK?#)gYR3b{G5cYy)>Oov!chq>Vx6j2 zK|qP<)W2jNoA}pukp(-W1zoJ*a7HkzY^4j0%L$G4Gu2a=0+jIvE*Fj|Mc42&FlD@o zF-2#5g^d9QOE2LKTX-tr2>|BM4V&`nN~zgt9n9|sT6ri##fnhCLL`rEWo zicx6{S*#Yiy#5r<{x6M$t4w;!SZr$Mk?_(zbISV9sCrw79L(5#_7iwTQgVAS!wZUJ zI@_c_h{>}3MLig_fsJ)PF*?227|qh9qpd;Vl&JDY%gA~YT?p)QZ;eQ{Ol+JBLZG;za zv^qZ?mXko5i1iu4&>hV8g2eMGITFBMnl|yakI| z&YNls-*Bk=JjnuoJJ-w$;GudXDebTg zeDV!{?v)K}-r|3q_aq;3VlAa?!5A-)WDj8=`C z#zzQXSRtr$2nsObC@-JZGs&}~9;oTv`HeyBS##&t?=?sdoO8tdM6ud`9=&<^R1ADBX7)c+%bu-d|eTV*;`xjp(EfP%0opE5>AKzE1gsKd)E@}(;M7QTl1)z@mi5Cb}i?^V;MjDW`46 zsClQVx(L{3yqAGsM*!2p`j0nQJdt_~wZRZ4!m@<+kjigalS7BFcqyr}N>0xsZ{;(F zLc=fYrIw~SnQm=CT9g#enX-*cT2>@G#pCVQ)^G1YeUv&8LJUVvvvo(ci4if%mI!3-He}+m%Gm(xh zS%%7a{@rb<;)>W(BK9xWx{@jM^9%?vWQxXVZGu5(csTJL35MyMBqP!XGY4B}oOS+R zP18Lz|1<2v325KNF~ecVGYatlqmbrHWOGce^Y`j6uoa2xwZ~J`1c)T;lOFbxN7QIm z5N{IO04w8IN$MVI+b4ms@j@fk2mAyQmC+c-1QL}=1*4Gz zc@jH3v4nAh5?4E5Nu;=#WNC5fKzvdyK{ny~!=K54=gJe=9S>=+g-*lG{3@o>7k_i^ zoK%_OL!|$A7{w~w7G(ZXW7za=yAw-8O}5esU7O~`icpDLCsZGya+$aJd#(-IU!&cbYTduBVb;eTIG@s}h+B4Q z%ih7~Z!nn+*8;~-<(I}P84;%HbUUCK0Y2);AAy}C94SjAQXE4xKa60$|C<@uJc6U? zXC&5_4`SrcH4k^wy!`4Y<@O3Tp5}2ie1GNwvGc*6$>$`NQ8dP~x6h!|P?m#%lI1JA z0F0wJBfcyDR6thB; z=E|%#^YV9PQC^vIv^Cd;TJQO!9Q6Po&^3KE%GosVmEi2;;-;#o3q0O^ps6R_lgqCz z6>*N%2jHg6tg8gA{Ghw=2dwO;6J$H6!@ZIM_(s?%t&do02LQaDejzcb%6cLt@4T-i zvS32i`DlOjB~X!UjCBobmopiV0j*YOk1*y;tCyD^RQ(NB?b44mOIPCdkllf#kfCuu z2gKxQ6dv~#L%9I%rjPqBrekJi$C=nBSwwYaHzSXOy!Q$<&N0@+rMAx(zx2FS`?aB{FAIWm{u)Qv#Fq|URp5L?_Xjz0Gu89Amc`1jZ|dFOCZb7yz$ z#y_Xv3@J@JgWJ~sOHy+ejFh%T*(yrQV~}Dov-L(*e2&nP1Zww;^8&y7ZG2Qjwb(%K z04MA(VHG}FXX!ut&Eg>1;AU_H)-22$JBz-5nMSZi~A^a9Lb}1os3B?k>Rz7Cd+eu-XHJQ@6T`5?5Fxn&&=7=)u+0rXHE~_sAoutjO$x1f+`7=*60a?SLpj`Fs&sQ zikUy=R#kn-`|gB5Gd{*DO(8k6;$m(b#R6+9W42i|?RH#rr;c%)4=Dwu+(OcSUhLPR zX*VnxPgfc2XA}&2q9$V9%HQk1zI_1->90Z-vPkk1_bN+wzQkd{98^Z}NHwjY*Vvee zX8Hx@+^lC%UZkC{>raBtzx~tLEqk@x|GGE1Tz_Y~i{$mU=Qv5?NNMUE)fond9}S;! z&d4F#R5k}lbW|e;s-oLs!9&3@nM8~jJ{6VIJ6%X&zX{h8!PVP#iT@KEGt}9}T27|5 z+nApIG3PlPPA_Cf=-tbAm%Qg>Prua5wUe;G z#s$myH3HBzXpBgo;f*QE*ffgVOivf=Oj!6c0(R*S?Oc~Sq-bu{>2KRt?AzX%7h2(& zS@I!t2_$j}#Bm99F>OouFxBG`+km>`@8Q~Mk$YWnm%cX8RyojS|D(UhA77dP+|H(6lfBvia_zV8dP6ajmZ0s z$*?vU4DkjL`nI{6)aHHHJ+g(eh1!v^`8Ic_2hJnX1OL+@&{(Kn8eFM&*?1$MXh|si z;K0~EvyuJ6e)OU(fc!sZBG1#15Wmhly^YMl#@`|SB@{=xs}Xgp;dQH#b*mriB*Xp- zB?VUBOO>>V0$XQ(WxKS>y4Sc{)f`*aJcq|=qK6GKq}!i8=Q^cn18xdc9}%M{j@a#v zFs=pn~COFcRUiPdp%nL&t28#4G1l3l)vc< zy0o&m2$Hoe61L^yn5Zwja`{konwlMCRF*aPdgjB5Spu(S+9eZT$Iu}Y-?9k!xmF#) z#5X6)+MQkAmHEwOj;?mH6^EVXr;11Id#<@&Mlj#eva0o|yLFD0V*(TWs}Vt6=F

!IyLVeNdS0aVaOhcx~)hh~rCq6TfsvFG7AegsZzVi)U z?e9XF_#9cR+@W{^W*3VPv|cNG0Cupo;e+y4jR-AkV|fh(&nk|{03|q0S|Q>pQYG;Z zEI(mfetM=1BW;6<>D71q_WPWfIqwFrbexSHog_GoM!&w#PhGUUC$xI@cl$%<71KqR zsOuIlv*$zTVGZqn0P{W~E?op|5(3;y;9Ei~aGL~ac2dFt%g_7RC!o>3=zJS$n;Gts z&(F4%Z>}sZORtuwt)55g3U^J?4YU|m+z+mUU-ar|MhR+S?gbZEF5Zbs&aTeoehRRt zw*O)$o>yL3IMAfq-t=?&OiRoy@^QEE^YocqfCbB8(D6b0SJONOXsZFwTtf0e1zv}S zK!&qdt!JIOT74Jo+)DBRHAE1pqfM?J8PZDSxk5re7c0gyr|g6s;yIW#y>t;EF=1NG zligirPCcNy?`K}iQ{B#Tof@!jGI>IUxaJ;J4o)Jj3_*IeCRciooR@rS1ySAK9=J>G z48r=l8`BU+F_*~iu~!{y5%6v!>yi6JHPrq4>2gH26r}R3)+dVc-s#DVGXpL;Liu1I z(lC_;_<_=Cn&rbgs-gRaJ#oY2(0Y}FRVZjX=9Ptr^?+gG{ND_Q|G4}q0;uB_=}0oj zN;eqaI#Xr%rf<~l^dZU*e^*FJS?p!p&vuh3o%T~9jqEaKBdf)CV~+#$bdD*>ElNu7 z7#X<;Qr}=I$9*c3m;Lph)eh}`6pGqB*XB^FuK`R7`|y&k(*Wh{5XI(=78`-vjF%58 zpF)^q`v|^R#7;H<5r*{V9Qgmcx@+iw>2nBrBSLZXX~cxt>ee+p#QqrN!RNt*`Ey8Q zBf_v4Vdzl2COCP#XjZ&dAG!d9H?Y2Wa8UhpI{tiXy58e#tB1B z-s^dHqp>HyF4Uq5hN8L@n0FZ(8!S5KKFn#a!tfUTKlxC9DNuCS#b5OIo5~wZf5jS| zxc=yD#?U1nB=8$0MvfVV9gLh!ZnQm$X+{6Xvcu8BVf7M1NWYDla{5WhU$#t~PNxu$ zO*1B)1vo+x!NW4hkWixdHx8MkI^g+4yJBYDoA=V$^nKs%TPy@WAX;BUf4EmyKY}{%ZuTUoTMqwj9q4G zh&4oV>&&S8E_p(DIojnuWi|VS)2_l=G^N6pOJ+`p#xt8X#o<5Ml(<3YUO0Ej16mg2 zO}`pmE`Z2^RIXWjH&J)Vn~GEel3Tpf?I;(nm?c7s(UemAq?dHjUqXjp;gVb5 zwTGKaCvvVPgk+Kg=cF>w-v01X~rs< z?T3Omy^_O_@=zd7Ih`5gU6ca2-)iRi!h$2(G$$`H7bRtuSRC%qT#KNFguaEfKY6cR z`^VS^D7oamwxw(0?2FjFHTF^X9A%TZp3U%f=VhWu#D9_5LDui9-ZCq0C}rfImiO}} z-mDw(exgk16?m&hS&;Jf4J#$~tG5ObHZyph0=Mhyc<+IN-YK0?9h5)y&ReAMY zmCfSTSi7bLcblfvP&!R+0YPu@;@7qVGwn;wBrD?YGUzoMievPKV1>+l528`X+uUt? z$^oz~Yw{`f+9~8MkIE#IeVsUkpfL1D^q2g2A!Yj+yK(jq~2doHHmDIN2hU6(BsjHbEUXtd%|%!IAcw^@)KQfi1Fu zej5I<5qRZIEn1&SxP_K{zs&`jLSq>W&dKG4b7q?i`vN<9IssJTlBER z9pN*2={~ec9>K_vT|7Bq?uwnS(Zo~ENDuF%`(97FBb`%}zM1+G;by8frjN@};fr)z z5EepGy!Hxl1>~xbLw$I86GD9JxX;3=DssM7tsc_!YipO-kc}y${ibiOG!)PEQO@D) z>9f!iz7X@7_N!Z+@Ls+9YhN~==IIdQ3 zIiC-}A_n=PjZWrCniBB`>vrk_VS#Zg9QLSQ97=&$i$#7Ykc)WiziyS1OL`ugihi#6TS*mEK1bcq1(dP694Jw2C`j|XJ2H&(_ z=(h0+-I4a~+lzk`7uqsY$k-h?IT1IR;3pQJ`oT{n&fh;(Ks(_&06R;$_A4yi&A}+V zSvN*1lwUW_r=1A5+V;=AuNpb?`CzhYH12iKVw+*#^s{-;UcW7QGS=(Db~xOH43dbk zfMu{>Kh0^GNNhWd)nwz3oZjKiL@aiM9rDh%_8R$fqqy9Z@K@{(B&Zb%C+}la%VkEm z%&}zS=xIBet%xSis4WD5-lP`EIYl?RD#tq7W=211g9-8MHP19oE`QN9Et?qt`NjLG z3Fi>SxE_%6_Rc1r(EiA7=lz6D_0bLNk7PEei=>JEsw6qKxtMh^wz($ScH>a=#zXEe z38J5-A*@deH-za24c6ai&rC&>2ZiD_v~xw&2fk;P!Q_8)Sdbr}(xF(BMK8|#D8k2^ zB38dQQ)&kW+b;wQO%|b^n}k1#7fXeriH>3gY>s;Z|6CM+u8P7Q0mXfkhz7LV8inF! zHN>$%&Qs6Z+xvz)=4m0}(zXut*0DOyxnL8>{jr(H_>&~9)ED|a`;n!?8%iisGZ7=x zzPOCMvQk~0G#OHQATmg-czNP)!V-hRM&+9{a1b)*M+H1^&4H8OlOxS(CE-yJHxXt5;5=pUdeM$p$6mM z{AJo2$V$PrkdX}1Z*H&9L*mj8Pdz4UtuY6dAyJyT@r!%or4OFm}j zZCuWrwT&3He6MFoaRJ+Ou1h2yZLStMwuuKeW0Zj?*C5c{^aSLFzA(A>pE7? z>%C(a(N7GZuRY88laGbi_e|DMT_=O>V`vvlXwF&>T3%RU(Thcdr$5XGb^qN)t zP9W11lM8;Q#rA8&vTJ~T2)4eETn6En5vYslEL-ke#pow?kZcCvi%O1PT7#N*$><QI3aiHj+(Fl>`dvKdO@MS(1!~SO)u`AtIH&DCQwgT)UA(%RT z-4jA0*QZ*%Rz7(QK=|J99teNSLtI%~->y{89S0zMQO~>ZZ&z?0+{o-6+K%7cf<}3& zZ+j|3s;g5EeCJw-^!tc;$PKVwaYROC z$PTES2zizJ<#p(EkD0Qq+SL;ktyKN<+q$5C5CyT#2{Nh8nLUhl@UYZht^~BwL@g#s z|55yMX`^*_Vpe?Fw({;zC}aJlL_llN$HfV`KP1JMs#!cU)Bu zLen7_PJI}yYisCE?rRA%^_doe`KI56Z9V(@?WY_(t-3-ye|yEleJ$f3(ZPr(+XZ8b zrjpu*mNabHtx0HPctO6YUtCDbFI&5FP8q$dVn;;{0HRX;wEHhm}5Uix>jS{1Q23Mx-WQjS-poO~*D4nOE z#XRb3dNaoyp_bf5ARcK0q$7YBQ7H6_eIAk8eH1Rjt=rUetY8-`d$i*=(BDoJ2I z5KkIx9N#p?$yJp;!<#f6@st={aG1dQQxZ`us-X4COi#(7U^tmJbgFB?wt5TxHd95s zrvK}!+I!2^7qyH1?06(KpE6bA#|(x;^I_j{PlSV2?S4i7r3?obVqA@TLBEzl{wEpY&`Y+^Z0PCwS}6~1fE&^gMfe@_ zdM`SiUp+mUmQ*O9fWcqKmEbg;IXonNw|YJ4^v9XNQ*}lqdxpi< z7l8?!4bGA~zas^CFI@IqWIchaCX@*up;<4fyq%l4iq^^d!|-dX!oB+o^_(K?N8SnV z4msB+mOYcWMyv+9n+)pPaI!R)3zyo3eRtjo8{Uac-U&j8fhN6)1aWE|%8LajrPYv3 z;T!?HiJ>X!ZnUl*oUR8{pFs4R13>}2hG+pi85EmAO??N77__wzA^Q*U(4~oq;giee z-RBPzk!mH;YLb5J6MnlD;5NYQd2s2p*Oy!^!}6nxVqfRjY7AvadZ0O-pQAlfS0a8d zo3H=Fj*yWD9JXaodxNeN0&?TA=`d$QgT{K$i!9i7Je8AX-t|=VbZcbpt0SlDW$vo; z8z1p#26a5)@TouWscxpJ&QPw6!kM!iNFnywk6#r3*eI{MWbTYvQM*&;ZH>*rc=hAn zRK4>a`Z|Q8+nR0l^$ow;jCEA?yMGvD6;6BudR%tdUx!RDu2k z=eZ$OGRJ}r%bt29ce{`%^}4oa-qVP&-P8m?S!7O~lzLehi*TTohbT}CA7`kAvX*BT z`;Bt|^eS@ePUiH1?uJvzycwHut(QWzSKg(=??vupsw;8U{e_Zhn_kk{hb7^2Phpv( zkF-~mkQEqv&zZnMo4)K3JDqPva+eCkjA^T$z|#=3qvq4HzV+JBJe_%ag5o>*!CgW; zc*W=I3iClZ+6|rOO~3T@VKE%h#)Gb1u`xV{pJLqiks6_kV9ZI9&&y1RXcaU)hw{J-3qzL+sH8yof18FEJrtB)|Kma1Tt#5~3%Z z;c@ljLDI%)=^+V6Fwq7$MgVOr7GsL4PJTu4X*ZX@Iu@i2;EFNFC=m`rBw!LG1UoXA zmymqs+7)mqEu8h!I5%q^Yu3}adA)dbZhMThASQFko!pa`;eQN2ET-a-v=cWEg86k{ zXP@|;@NJ%0WBl=J{OHp??<>h3Mb#qK_faind+#l%vAU_dA!}O(a*Ahr!(r=>)+8?a zsp;A785b&RW#XPUiN7)~4CkDX&D^CM#eQ}&f4m&^tTyrzMb@MzLO0FCm6OEDu(&}| zKQXT}-1xBbx3^!X#~sjq<(hds6S7b#9VFNy9YoYB%_-!+`Rt_8%Jt5Bm)}Rx?I*=+ zh1M!QU}}Y8O&1|wye@vEe=)t}OCT7GbrZl>O8xnkkYRdwUpw^G^cvDdyYz#E))OA; zzN=VtuBPakZN%-Ak=7ll*EM72ep=3wJ?KVq>1A=ft@3G}4mHZB&M>ynS>#KyFKKT@ zyM7siQt#g+Hr-!7q5hvK97uh|5n&ieNKC{?NEH8<6b?e%HZE3PUOfg&flGE|p&4)6 z(%!B(9Mq0}QSZtCISP9@3>&HDY(VNomriXL)Y)LVR80CQAkECFG85wkED9Iz{1LK3 zjQaJ|n(g0y6U6tp?}u;vkSEr!f^}TA=wQjLy`TKpn|#m7IwU;&DJZ0UI-+M^aj9SVYO8gZ)(5g zY;*qMRw1G{r`R2{g~OsMOJ1K-CAVyrq^2Xk42uzhqHb&AGd$zkUSVQplZ_amLC>YO zG`C1sRrO?>PFlcU>}$MW$D38~0@+h-i)lkX zQP%r*)30pC+G!a&kqh_6#XaBPWh&)``YO3!iQ2eEOEM+cJZk!0dcR*%`5GI^-bcGJ z(iZ^sSC-M*&sqHtoUTK&xhDQ3q7Ne}PkrODy@s9}sc*oRS(8g-b&kuk>>|URl_KFX z@OC|O;eM*mVM(FdNtohcRI^6s`N+I<6>h^6fqeWpkc&m$D;=!PvvS}uL zeWN{rd97dAqZpq9J}Ut=wBzVyIY*s(Uep|DVtey6Z(#QlnV3V|Hg9;@ zf)QBmA#NQ=K2r#`W=_J(4|>9mhw4MOih@ z`m(w+!e@jyeTq}N?`mnouI6)viuK8hO{teeQf`YCfwINFZ=#)1hMMY#<%$EbDqPb$ z$GoCS_jWmJ4>?=NJN2ii()J#$VG`~>S~;?##-m0gJhjF-220=iPa_$Us0bZswyfto z$CwoRSVa?i7gGKZPw|nvwav7eg{PjKR_ivwf`vPd%l1sx@gr;+uN9YcH!# z5)ZNuA*=0Y0Dc}4Zp1+VSjZ%2NPW)eu)dyroNvu5V7)>bLoZ(_PhspZ`{nmqv4E-f zuM}JUWY%;sM`5s&#Pl{VcqG_WeCqii_q?w8-PX2X>`n0)2~O7%km!KR3sm3FJh6I*TOh;g%EwEzMH*O}Et&d&&p-}oLDn6nZ@5-*N4u0@ zobD4(IKS}WTDOQ5r&LVJ5(MD*Eeh zZF0JPO*!fi_n@I8#Vg(RhXrz zC6t?dtxfsVZ{U;#Zd5+=fm~tSmccGvJymhxH<9wEOTVg6?U^I*r9YXQyUxs(n?@~XJ=(l3mdyF*GJ(!tRLzn?-nlP>XAnI@wgu!2O3 zC&DIPocFBXq1;klKZb=M-G_%g(q8w6J(~ZGM!6Ng9zYI8zSokL!g*AZ4kZ#NoLs|r zd<=U;{)_wKoMBxN_10#c1`Cn&G4yS*6mke>F%8C(lC%`^BRuSp@jK}xNq;kPaIB9` zd@HHJsgXa5Gm4+nZ*_tY6*>FWvfmb-qiMy5r5Tede7}_K3<|jlN-BRS8gJfQA<};& zIRrVaJ)SFx_R2TXMAwVpx}7>FPQK(XCkVsOB4R(Q8QybL8ZgyqJXp}D9s2#6D=|;p z*W*6BOU`T0D8M#O;pb5yMkw7cGp=>Fs$K3`FJakAIw?t%X3%}n-sJG@#zOD)N$+)R zG33XaK+A!S*yw(9)X+^KPp>=6qF9&O9BN#8-vki%J5y|VIs40A=rF0;*^ zpJ<~zly{k?#42>~cj0=9`uV!Xq{yQKuky)njrZ$(+|}akYSupp-zS9c??O-Ga&vPf z4-G#E9NyT!yxB#bs4m>qoACN9yos09c96F}BTQW7E+okdIu;1@qq?TU8Cf-Y8)bny z;C`fZdE|hj;7tY|pu2wqx?bT*|MKXTiF|A=g+?}>-8C4FLA_j}NBYqB`$~%PA>Teq z#>w*>vlB^q{TB<}D~}+IsJq14mmcZC=;zGsbLiO`&1sFwjPL2uWMZbWlfVBCcfX*% z_Hh@Lh!%7g6$!zO*To>nTfScXTRQV?;4)P=`n6P(yx7m)H>`A&8@+GDy9yf^gZyp8 zFmcTrQ~zp38@{=Q8%Ygb^!njPQOsY?jC~vVVMdN~RLJ|C;0IgEdSM^M`rqI;B00ye zHpLQTxfC^aMty?;n___5jv!6aKg|N%i1xpx<{`pGszK1H zkz^Me2`S;(YX9GIFA4ou?xi|IM{kN5;@*i&fhNvq7oQELe#}USMg%6Kj|!_^reb0| zC#JH{Yaeaq)A=_Ja^x(0AazI8a5M*scbPiH(yZP#zF*Ks7Jmhoa+$G~ABb=fbw2z~ z4mlok5NKrbe5es&aiwQ_aj+jrFik2@B>M8kJ2>+5hJUZI8Co9f94Ps8o^6iBFr zI}moAL-K#lMOHgA+9fA2+%}VzZZ=;_{zaF3Um15)(si?m6uLY>W3iPKXy#25T%Fjf zX7QW9cZ9~m3;uA9bR3x6PQ6hVee;9i{)F{7Z+ohj8*W1&G47xo%8P%Z(DTvLG?6(V z`aVQtBnF*S@Y-{sq{6nC@;p$^?ucPfmP_ zeJY&6O;4H^SC)?eNhxw^3roKv-kmlwuk93|OHDg&BkGsm-zF$tB6axO1Ek;fl8u)3c7Qj2NJq|>X9Qb7mqYWMw=d;667sl4Gh zDc}xcTdP|I63YJ$na9G97eJI%^Y%eebB+WDNH2{$@Vwj2atswC04A{Q<32_=Q*NWXCv zF?y8v2x6F{ez!hxDqweHA$Ys}q+T|+EGNltX~7_#q499f_{gXi97)4uf^j+tgV80P z){|nXf1^+udD$s`_c!<{Mu*|*`HDJB((k_-x^5#3F+MuDxE)vfB*PNQ8zh9WfBb@L zCva#(dqK=E=1huIL_-y%ySNwcBtbP0@6x;ceFTwh$zBsx!7nx~Yr2r4FtK6DU0oKP zA^Ukrp;A3hg*YXM*D(7~-~=DlcL`7PE6xBHi37!m5i ziJpwQQ}433fz8%A+KU$`$i3Gi12=8{DE(*Y1uBL@83+3X@afgPSj^UML)q@5F=Jx7 zV9xxh&qwk5;6|Vh?#K($4*n50)vVGgVjXckIW^tXU0inmlyAT_%N9|rEWPKQcEq}f zI97C~QYWYWys;etc~u!LEp=@Ap`4NmyG~isrE0MKDf?{u@m9dc$lH%jKBE7m1uO?I zrI{uyilxX(VHIz;qA*lT8L637RTQhv9-wO@+kywDkln-a)sJKMx;Yoq3c=ri`;0xnt_Y zY|q%LD5J*BrvvKWc<)=zEr0MR_i!if)LYakm!zK87KoVH-L5srj@{Cs3`4*9HHK_E zy)v6<)!Z`G=^V-{Qcg57>XJ#u13PN7q$GlM=@Ql$%C&Xd1g> z#ziMsGnTXM&|;j~LkD~Vts@{K;_}?z)EcimEzX4!+YQ3QN=@E={_Z4G!onD!Q&Ndm zu7Ijg?yTUkz^%f_T+yst_{}${yZB8U!5`2Tin7`;vA&8B7D@luzGb>;ekIdXR7Hn% z$DXXtMdf#+j!(=55c@7RS-e}pZ6&#d4R6UJ4u^few+(NA`dcf?f)f-3!K3P$Q~YiL znT2Txf8ieKHJ_;kfuAO89=e&HZUHI12NlQgtCe%qfN^!HEz~Xt;q~`ZNr+*$Tg-=P zb*a*#u05vP$h;8czElKA_#roh0q(xil0Xm?zIHOqLGZAu-tdcNIemAf;g_>p?(aIO zUq#m_4d3@B&PjwHGIrs5#vwI0EZS_pLCq=#zB?Kmz)YM9pmH(>pRv072K^>AH#+*T( zvDm5hGveJKI*8t&_&PDnO^)THfIQQb#s@-yauxI~z5d&)fi`9KCcVAF_wCT$o}u9Q zpTvOz!MU=pWGw2-^D%A{uZJG;I%W;TNO#}2%Wvl}3%m?7HIr9W%TrwMDns$mq91&D zeM?H^3(-)=ElM@?Df`97RsQB?C6tt;cM)kVe1PA{^yS$vnwM6`1ij+FQXtpq&x z>NkPdhf|!F7?wqDjT2!HGI4(*SDYJzzuj@R;Vii~-dVY~&LhvGzPVGImx+^jDQ4R^ z(30(9>JKNBpQuLI_;rcVFkQZ#aS2R!Dk3W66TfLtrYGiSW*zVGwjeLDqBj_xA@QNI zJ)`tH^}|gCzV4nAmu{n|c62SRgNG1`kZ_AjUn<;9b1s<7j;EFuTur2UOPM+k=>(Yo zvn)@`=TEm;Z>bx%6q?T73w&l&Y5^nUtSOukrYbS7>c9LUZH>*0$Sm+F{_|z=W6P&Q zwUV-g-;V=%RD*iWm6=!H-jPRN*@-FW-K!HhHZA9~3+rz0_|GzHh7KxO$lMaFUT_W9 zJGBUl#uL>!gpeOUWKQpoP4B0?lPxpg(WxP>`$JE+x=}5X_|tAeSm^GXcFk+;nr$y< zP~T)#X7jt&*Os>u(<)ae2X~xoAF|m#(3ZC-RS(n}L>t#7j?9dZ&WvRL2lCoU0g$BM z1+l*TwX=tU8dC{j`?>>H?n*RFL~Tq*{f$@VYKAdO&QzBdH^BenxAC`2|G&rR;RAap zMoF#dPT%ahCpct$KIDr##>*s9*2pfv^ zl~Z*NOsj*#S;;y~_U-}Cn{_?MU)lXfiI^8G8S-k2o%Km!b3e&1FU^yKLw-A!wiJjC z?`9h8zU8TJe&=B^%)EvKT|+ZlYhqkf7(}t!hZ2pF6O!>P5yKXY4A#dS@ejBf@WgX^(5MiS6 zlv4SDo$=^9kGc0r+o1iHzn_dV^EolTpSGl%Ays{DiFM3GU2vs_xKR%Dpd`DU&F%@g z7r1TCdX(VYp=Ixcn=<|V{w8_?jJwqe4(I$Zb6U^P6aGou%%1j~oKvHhI$X;u$(EMU z;}d)A3?L>$i~Z;qfTSc22|g5tAdvQEqwUP^T%b;qFam$78lJADMmBg>E`geVNV(?x zYtJ1^Wt7?vqDBOHNtxvnSaaG0mt>u*(nm;bgEhS}v~!C#gb+cY1+;b?eW$!~VkUhj zllDT~dQO|RRGXjmD0YUZ&CX#9=I_QYwZ*y;HLT}MBprmZ?Oi`st5Lk4^Cxj6pZs@e+D%L+=eCSamxVzb_!0aX>YGyN&SuE{F3}EygsXbNDkk$|TxN4Q z)Dig$Syl&~5qIgzAwk4;xLRbR2B{SOPiDQ9@8z*8FRR>8^n_8rnp7pMs8IV*6n7Q` z%v0gjim^eCN_bbF7h0OS&_8J(c1OQ?`Fq2O*DgZD4r?wOb0-_qZW+mom@!>78#Qo= zl~IkwN^GWA-L>uG^#k)ByAPNBDm;acC3xgMVOrr<3dxt#9+xorZ9GNM@3_KHf+q zgdd(8Ppeutw0tZrq#R28ol42kF`Bc5G9O4HFMrs>p)y==d2B``Gqf5we42N4=+@M= zuz58xeswcG4&(oGA$|s9E_yn~km__>>4eT^U5W;6N+zh{O1T|>@D;tk?s>h|a{QZx zGGxO%x~N4{UovNl4OmIw${fH8cLbWmXt0QWM5vWC$56|jYn4RfOXMT)fk})3MDPV* z5_2xSXtVWpjPA}naI%-ut`5fbN*o-1SRzmhWUx5<`_beGIPI07|U0$#xR zV+-ZaT}pOYt7^_o(ZzBklSC$10>UFYLwNMQLC)#XRn;uYEJ>zFII5ie8zatgdV&4u zY8E5p<_g}J@X=UqeXY4$Vywa+=NVXqkaK;k!ol+ytU}niAm_=uk~y|2=cfR4O`F>n zJKZS=b)Y+Q05;qtc2(irr^FYpCkF-E9KWB5sX>HT%V~S8IzUt=n1sNT!aTn=RoQZQ{ndG2P z4h&_v#ehr2KFWJj!24n!<<2cip4iqANp&>ONb(d%l05QIW%R*jvRan5&@l?`ySo_S%Lj$4Fmm(b8|d^>)NZQ185-xBH@o zU$WbXXXoZ^h>ix%#Un2=geu=lRV+PMQK%1)zE1k1=SMp={M@+;*`rpI%mWUGhgT+*>m*&M{wOkKZ zfX8&5@h^wKtBT$taAK_Ep>vhUi;ECquYca1mzCgph5#uzMvSD=Ib8`ZAsi)s=0$Kk zViPz=xFUUy8L7zkz?h?nADoNe2Np4X)xQzfu7i>g|C%Bjc;q{zx%>Q6U9B;+whi@e z*opsJD9+t*uevt_+&9LF!j1l``gh~sb`|ZcWq|^h!I71G58*#=$8Wy;oXT1K`mHxK zWH7ZA%}>ez`!9bauGOsDYvS3?j!`~c=&HfZEx3;(m4x#8BNXcP9J-a zz*JvK_3>sXYZ;9|)Rm2&luw@Qt&Gi+fl{>dp%j*V&Z8k+aB<@kTN&>3;3M;uGvQs{ za`l)PTN%Y{H$T}Ce8(KPTrk!{d}P^~Bzx4e(~Gr-DtM)PZB%i`QHC)s9>(;YBM;-B z?&3zzBkj=r!=K~$=UR{M%Ch-O^5eTHEl9z<0P(LU$9J_*W=|qdMIlGB+!h@5qL{9F zGWH;>sR79Q2EpN&Tp+%-S~^}ikPP2fyP1|f_8r#VnqZO^UF0sO_tO;Gm2b(7)!vi7&?EO`L@s@O_s=^usAuy@(j3>5A+7W|FJC| zRKhfBgT%|rvV*Nl;&OC7MLRiIdk+E=I!ect%JzN#U2a}RvciKHa}@Cl)CY+d^658J zTnzR%71Fpv(>T5v`zO(ijRXdysf#|U->!|R+;U_WD%vGh0Sc+L2siUCKD4D(_5NgE zNh$A8s_1P(JP02+?*~Pm3+9oq0&{mFvGzQK{9icC8cq=sg?!p0B;L?CQ^t}4pF^?W zm9Z!4@$S|^&*MyJU1L^E=qb^(K+~j~dvyxs^eh;}Q3dv>g!y`nE$~U$fK@wjkZHr8 zL%<7S>1Y48=th<3*O_ClDV?1lkN!1rh2L83gx|J=kKjqKagk%U`$jO~ao%%fw_-DM z@Pl2j(B6UY!I=@6=0xR+*TDyTs=KyvKrAF|t& zPNHasIOt5Jq=x8MpR0Kt-f`|6>pkX_GjWOenP}vBVD9rjJUBa*iA2oZC(8y%jN$TE zO488iEA>?>i%r%}3|?UE-3YjA#l((%6)awxx-XNpbvb36EE`_fQZ823Y<_;&G?wrk z5+Z9*vlAiWM!=CU_u`~(5e??@i&@}cQzdV*Ox+oW1 zjyx~STVwFzhjRfh8cVL$YLkA|iN>#Lo+*mf3SA7})h;y~(-hoJP7g<7gxLj)?|+nW zo~*@1sgr45y$P5&SgF6tNiXNIWMa6r$1iApdBM;L!rxc)hR_Gt;F~qZgct!?I7P#7vy%}1^4?wa zx2E`1^)agkKtm3|b#W;TyzBG2cu5vbN06oe)>-(rHU#70?j@v@Pclrr#GVG(A2=b2 zavD<@jJBoSkCCi+zQ-Ucg)dPQ z68z!1c$3=72RJMdfJYNX1y_ts+}R|ROx*rh7yz_qltsj7D0!pMcuz98BqE9x=PCIf z39P(;7z{smV(R5Tjo}x3MyN?5(iP7c=#>%?DT>LI5)rtaoA}g<-op&yiKL9Nf8Sc) zGnFXfg?l{v4n-{cek%AoMQI8?1AJuHa~w&8n&QL;sx`yAjhEI80l)AE72+j< zcob%X7zwVQ8t_*TFD)24;rP7@-lYuhrek&lO1Kg%1xtt%%*QY)6a)(JD->`@fZ61H zegr+SxY7v@6b#Y{q=Ye~crgyx46F$VK1Cc9;M;%r@C|tZUwnz37(4Et<1ss2B@L8( zE(GurdGSfb^9+V>@ecj;xeYPBo@i-BJdLw zo?%S>8ImCQu0S9v{%?y8{#ph7A$MWl}e~EvE@ITOm-xg7!WRIZhtbd7rh44SngiVXYP?5*&>#To? ze}(Y>t_g<`z zKP_iC;;j~-~W|_V&BQMg~oN@|MNSOF~A|fc+04ABfE+Mzj*&KBWl22%; zKKUTn`vu%S{arrcxaI^^Fr*5cG=1GjE~UL$>2$A_P*ih*Ef`V_ZkWDqCGXSTY5N!T5k9`ptU45wp$5 zcucZ1z!CQ*HQ<1k|m{h6vm5?ErAY``FLz9C&qk!=&kMMYGkhlhT6C^GJ zCIpEqgVR9b@?c$%xH@HFz4K~CgVvt(ILx% z_;th^Lj79f=OBJ{@pDkWo_Jx1UunEB)UP?d9pYCL-wyTbiuZ;1RmS^5{o3QNAm7!% zfuL?p@HU`6*`qwZ#@3W;lbmdB4^ z1;O4@uFa3nC%sJ}!N)pq==601`BPeBQv8E0CB02g zyc|ftmK2~y78|by{vIC)_4^*L2=Qx)XCvE%_*KN)L;Z5%RYBddU=C1_3b+y!qyV-D z1!;hHK|wNL5>SvbI13ac4>kndE7Z+>qiN9BGBfYXI1wZ3%R0e8pD8z35pRcHx5qz0 zt{dW?pr$NdxH-Pb{)#!iss8pkfg{VR6}CrQUNkv(Bg>jQj{w|c|6UQxovWxyb`~WZ!fLJaTW+03NH?`vJIFBFxQf z{HbK4E>LmV9W&ci{hbwCw`37+FWH?kSl4KGG%RqWI|~*#+MNWu8|f~BVL*b4VHi+x zogHmJQl@`A%m(C^?w=3a1i7X9N5BX{g^XvmIbUD{w#)$CoE(^`9bI#}e<*q-R9t?i z8X!DcyKg|;4iPuoAp=aL`)9(UAwgBJXlT%Pm?9*o45kPbH`ysA)?3R@^-qM=Js+bw z4$05xP~YhQECFa3&ct)P0PUm8bYA8=8aYWB9kgEBJE<@;Ko+Qw=L{u>WF#mbHar>> z0b>~nN`2 zu%JIH2Uswl5#;b>`B%dXAwlIZLugPdYz`7s2b+Ti^}vK7L8UNZXizh(9THRnYljAP z!F(Y>l`vmuP&@1j(yg`=29W>@hAIWjXKDj-mkr*UMh zj)Cede$x^CL4DH^v-8JV4`ae6X3&b+tOQX$(*e+!1uAMh%hsfk(P}*V5mdnJ99KI9 z(*IC3YZ3g1u8Ercz^aLw`vAX*n(aWlX*~17!C1FxJf&5CwxyQLxVfnfDrz_@0a{U= z?E$SQ&IW^4G-n?`64JA%APJ?}l%~Yg4=uGewp1L>rL~*3R6NdUwS=~#qGsgVAl zx~Y))V6Ul=?jWbBkm+EdsgU8Iqp6VP;HJr(_Tc&OgVYOpW1h?pjkQ^jfa=;TXeV%X z6lBJJK-^@`cA(#6&UGNzWX^H$0qZO3X@IeN@`Zx2d+LRqv3tsefw6nqg^%%Z@`Z-+ zaq5Me@o~zBoZ73AfTG&xA?OZNj18fk?`8#?>N7qR)LxC=hSlPZ+$R4oy52mV&E@YO zKIinb&e4{0j;gk{wpxm!s;IpyttG1VEomug*H|KgoYogrTUAj@Xsfk_#GVF`s#-#Y zB8VkwiI7NAAqlehxqtV4Kd^#FLZtOhI zm}v}q%~f=t&x_8jWfR)mC$t(nbr=$ji5D0y?iR1OzU~$|Tt|0{TyCU0{w3GO9si0O z?2gajdb;CtxiEM5ORkkW{1rFA9iGE=b%#6N^F9GD;7Ysiz2@q;V+gyL+P(f=bnPAi zs0NcJL+<_jgA93{phkw|<0{v2k8F69Mt%+sy)Jsh))D+dmKZRH_UX zwuT_A(Xd~s!0Zg{K5x#?)v%|W7m7o1;|{V5B2!AN2+-z|))K`=wz>e=$kq~=H?lPa ziH-XW__a~_g5Y{%_UnY#>*apRDgrmMyq~g~AeLPGsO+@h7Fms8?#@$hw9mu2^OF3^ zRAK4sV}5041h(V=LgMrF)Pck|>#2h%DQD*~D}uQvuiVd`U~a{8A&)f%JQ^OLs0zHu zq2%nGgwk~*@{FG=x1<2)$n*8n=?A{Xor4vu`;lpbo!5BDjr+B3H15}#)>w8Sax1OZY)y~U>nQS1UrqO(}LtiomZl>WS#tkhV_E}#On0|Lgy{s zpdUy>AlnF17dSV9v;_K%AWcDNqfV~KoLrz;6|*c!b{*)n=8+_860nxMmPT~0DDfZ( zkZ_GB;RnCNOO>N@0g?<`t%j@$4=?D&y%U+7^lFMF+0?B1LB6o6Gt_Vs7 zy%gOhgI|jxX6FN90Jh$Q4DB@h?R-Wc({pFd3gC@;peoE=D|~zZ3&wNZ~b7 z>&miD5}Wpod$m8-Bx{m(@R|7VC1B)_Th8SO$W>KTndw&^-7>vhgbQrqR{KL>Skn=mB_%j=o}76;L@ zm2quL%5%+>ehIj6I!;enxDm{#i~pG&<{^Y69f$L#7xD7V+g65J;+2*ji?+ax`J*1f z^5Wxrb8n-Kl!b_3hV?=8t0w$2*FmFe#HV1XSCRG4CNESO=b&>VpO)tLxFXz25z>HbOn4gFjgk{|2+p(okTQYCuxS6C)Y0 zDs|SIXtq4-NW?AAdJ+?sXI+V+ou_U<4p;fDH&n z*NJIhz^ll{6368djew>Si9sVf;&G$OK_f?^J6P!~?HyQ2m9_v@Iz!6=6Z7@X(-e$6 zskVcKIeMA_#U+tcQ%fQgys{ippr=zARAPRb)&M?!EdCzx{WEFxD%4_4z^3j&<$@*~ zVq?iB)oWjn{NSYKr|Vs6%cg)XHL59)D6?$pK+Ih>btgJ5n>rK6mQB5hddsGcfau#! z1>KR$rmleKGo~Qo;pL8dfM~6bJH&LV*TsDyKcGfs+ga_LO|VhH05rM8b)XvH9^F|J zxutG|&T~XmOb$YmN(=|8iQkK<9k;szmOGrgXw(in;*4y(Lsx-p{OztuYR65Y3AMw9 z*iLl{*t~4S-Y+;XNcB2XX`J9nzzmJa zRD2;XJNw~>|3Q)>PsWIpg9Q?gf@^L%D5ln=l;t}*uQY+p)hcU-<(A_ehy}~>?nKw+ zcxU3|e*CoEl#=j)>IqOC&(dfMi%*wp{z=9 zV#N=dWa7IY5OAV4O%9x>PICn(YS9cO#pf#9>h>xbzAZfQ1dr*`StLS`g*rhS>xvOAP|YO7xrEV_gSJ=fj@Q za>3HhZ~8;~^_PplTG&=EE0pGBE@SZMa*CuQHkDxJ#dvgNPgxO-S)3SzMAmjVEm{YnsqW#_;OXZZsOWwV1+;2FL()|G(s zVCjR=d7h+A5!m81KM8Dcj^7QoILj{wTd4Avz~};4(yV>I=)Bb0!EgHz|tCa}E^5@|-)Rl*4vvE#GuJ7 zN*pwGAh=&|xsY=a+G=W5syUoX8$7(6%#q54eCp7J+Cg(V+<<3w@(KupR9TKSR10d= z-=5ylKG0s=ag@_bwd*f_4S_)UFCq3&{wqj0l%E3uLHW55I8^#2{~A>K734!l`Ld!G z`vkOaVCDk*DztBK<{bNXsM>(ZT?&B%$br;!3~`h$vadirml4|RBhY{W6C29SV=lq4 zsxLvw(z*PIWUEmZkQV!IPEC8Ihp2oRQCB~GC;EW%OyMg?)|a4QPgxhw;(SAua2JXJ zlr|7N2+Qc$Tpl9KXoshEK%pj7GZ)IUj@wWhP7J{_AJW-zc-i{``w2%$hy5p~^aA@X zr}QFQol~m84&;<-vrlqL)!FWxQZ2R-r&N;-<&^5M4|0GP*k_?SulPPtxj|T3N5KHB zu)}5<=SBI*0iI#!ae(L9Bo45=-uMJMk8cb`7w`{3!(a1Nq2c-b!sUd$1Xl=4D;fR+Ty8>Uv|l{h<1Y>X~CMYK(bF;pgMCg$c62b8w4fInDTLp-2|^ z{wIke{SyB6%Ot_#&H{s~d~xruDR9T+CE%v6)+ldeDEOFG9?FaDf zUmyecR3S_wzCZ|5kH-jMnjN;{gkwPMy-rE=Yq-S@zhLi|WY@v{rUWlr+!5z+vR}cQ zg}%$mn(%Vr(y>mEc!Og|u(&QxvFYM)UK*ux4z{d*t36jS%C#b{X_z+SNsKe(6r zC5Q|k*eejuEbn=W;mdojiKL^#yl2spNb?mXN!Hu9aihr64OZ;~`($VPrnqLL5}oJb z7Ols3s7F7eKS9Nf8ei*rDk*jUo|(Vm`?qmzHA*$7B$0`ax%d1u>W@uH*7Q}=)obVv z#CA{7r|-E%d*3{ms(#h0>&>%@XLqjGo_2Vt(SK}NQu5%(XZg=mj?Lcg@|K;o>pFCB zNmBKgt;VPJXRr&ODxbmBKVhB;E_^~i6R3Z}f0;Sv1nJw4HF2*i>6qBQD@QWxenj&# z-(w2M2jxc|!U8g|LP5gcYn zaSXWrn!lgFJW8*z(Gi z6+n=VHmNBtxhF2vYIw+2YrP>1A2wd+jgH+C&c@Hr`ufLcBicP?n|9gjKmXr5yG|AM{!6np5={}(KOrr1iY4?V&e;zkLM z=`>~o>vP`d=(iiNAXH=!A*3{%T?IxsTHrUo3^5P;ue5O~`i7V%K@8i3+e&(RhD}$- zaBaMgUf!1wgY~ZTkRW{6T64AHOwDa+Z>&|#;mWoV%tdGC)%f6tbm8uCH!pRimf)ED zHiZ%O7ei=sDWN9!l1*|ECPRO%j9WcCb`x|$*`s^==c(S*iAxkS^f^GOyD6mmT3`nSV$G$5oVe%`DLrj~ zdE)QCTT)#|<7NS=J-xgv-Xd22fIKbcZ>Ib0&6#P0lk7$Q{U+RaNTrgz+zRAkGyoR; zCcBvY-HaxfOjdftO);7L8btr4vvFMF7Vg`q!{(;!SrcO2Go-6|pg+__ zB`VGv!l4(g<4AVRuH69nMz9@!kyU6`jq|P8YkL>(0xNQfD+`U*gO88RWa*~&e(bE1tU%lw) zPh^*j;et0zo+bcompuRPm_MfsZ{;@5A1XpRacG*cakh zil=`W#cp!LLQ6foOhvQFJKi(Kh^E8>9!P8A0=Hl$fvRP*d03D6juVpU=53zvFsRRm z6wy3cVO&`cFbhfS9K+OUw(W}p6QQfWO&aM)pkCV}5Z)#3^xBB$*Ld%Pa|v?6uf!~Fx$Q4!v!xS7P0X!{Uny4QE-RNu`Tu*7#bC(@IaPDkzKhbL90CQhtbpM*gj>GQ`^WtzIvP;;7TY440}kB}bvR7uI)jDB+h z)%`U>Q8k5eN!Kftuun;m9)hc+a`!0(RQK{emCCrsk3eolO@AAYLhFoa@r)B;4zq3J zz%-Z0CQSzk&Ms_FbN`Q=SKCjaLK=du9ygYI60LQvb11)# z+0(NFKu6n+rg>jSTGdio&5S-V3Hy{(7z`XSleG=wQf2~qRn?ahIw+w1&5j98|8r9Su*>a?tg>P`>fo3 z?th^sD|eqWs>$LihDViN48F79Gh(gj+ssm3@8JjfDg`HWecSxYm40Psft07Tlmt`W zjyB94MZ}rfozUoy{u0)RWY-lf>0|AwpIp7pAR()}5}K2Is>`3op9GJ`=MCxzEhf^Y zN%NjcIqOPGT6&%|h^@Vr*Qd+GP6O;!4YE>RiDF&}3i9{@VQT34`eJ_w%!yY*bs+cT zka_*<>-`ti=p%n~6%jxMgn!aXL>v55EcN_gej$RS?oKy7S4yJjn!&~Nn~OpJGbl|J zxLSDA*KP`cZ&GS)(vSatN971ZWizIRpAq>W{KThRxAm+cmYe$J8q5^`*7%>JG{rd~^~uw`UG$?9 z54}D_J*@2Pc+EJ@ua(snQLhs?l%fk6!H0g$qF)EBMI_T#O@sQJG_=gFm> z?!Ey>I30P$P6Al(V$ea&8DdFMu)Y0Jm)#6SCV3~BIhWHF78w8bitfE4g$tpNr7s%Z zD>`u@TDi-m6*CJ`P`(H_a$HR!U4A-gQ0lnap>*5?+H<|x1_$WB2KI4k% zgnfe|830GV_$OJR0{+Jf!*8@twm-S~SjE88t5{%fO*N>s(xW?2lqZ$X=1_%xm#~c_57l z%=HfagU^Q3I^7`854DXVz00@>2Xc|*-p>&$Ri@oV$eo+1-`D>zDk)uk+{T;9Eg#J- z$D1{@hx0w2?S@c8&6BgT#ReJunc4kz8U1#xlU}RE z2J5GC6qNHyPUMv+ONvrQ-CZYfsM&g~y(IkQ;I(ViGxX$yAIdWbeS73-Z!Zu)B zZ|=5SVf68O;yOaJqk#zzcJcbAqaA@yRMLPwQb41xNbF5m9&=DTCUai*4Ki!|JB=7( zhSnL>$%%ftfj8TckZo$ScQz<0P~fl6E5z^PXF*VxkF$&SQv#HIVs? zHw!WI+FJp`B{ik;kPsxXbDlgo7yt01kM~oT-Qx%bN~aw>cXWk*82Vtraxa^0K(dIO z8}O8l{22gAh-~xSxH(Mq7u6)dic7x*>X8cM^4lyF<}l_YoZ1#wEGV}zX#v|X>O#kG4 zY?H1)VE&$)VT?Gui8|zrl%jmgKMc+E-g{gl!@^wFaFCOx<1kl)YjERtoeh5kJ^TTz zlV)`#74C|eVt}UErluzeVeZL;J94_=`c@tGIzS*TMNE2-b zX>Ua{JQANeZqe&p*3vuefC6^nXQFIjSlpCIH-JC%0F4~i+Mmu~-XBRiI{X5)l!08F zH6Lglf->4~)RUTbzwPT37it0D ztV%5#DpyK0$d21ybBYj6N23yKr%XB5{Wkk0@>nRvD_g6xtSA{vGdqkc=;6lHtWjYw z&@gILl(`iJd)L+wBzI`$B_*R%cYN)s?)cNuuh#;>aX)nZ<02HI>aXg$)uyIQWF%!- z12U`ufb96*vJ(iU9cCJF#nN;)+uA-$%zG4&dqAahZnt!n)p{ZWHi3Kg)|ZNkJiY?a zYJqI+${>fGQl%2!%?N)_NO-Al6Dd-Nfq_=HoYr$dYv1%-V}hcIizw&0$#3i41IQ%; zDYw71Fl;Yzb9{6nG8N=5wd`+FXD4#C4u-W82SA68412B{+z&PxMu>k@^!$x%n%YJ6 zv;-p|XgY*7Z5{-~=$ZIr;fswt^N;(-rZ;r%eH^y#Tl_(SSZHE9Cr#$OFpB1N(|a{z z6DM`qovv$e#(hO>buw{#Vc_%b3f(+R$7S-nWrsIiOtNF^1R95Ly6m|Gw@#AQNn9c5Xd5W6LGvW{Vhh!BNk$LS;U*8p9Qs) z5+DZNH!a-llmj9)FYodj3Rnixb0PD^<@$sT2SS#Lv-)`~aqzA2P`D@kk@>Z3IZLAxA&&p5D(qFAzYp-a@Si{WR*i6?LH`;T` zyj6u^df7zxvWd}UPfS+uq{;tHkQH;3zwvO_XNNk{W(p0VCY!zC0WcYi9vW5IUK|}0 z)KrX}YY@z7n?Ow>)xsge})4dwly)`|%{e1T8^V#PG2({2Rz?s7qf$>iNcQH?|f4a=fXeqlgw|0l0c*X+~ z-_BrGw1uvRRLYybUN`+W8lExlx&1cJ7H(qxh92VE@{y_4-f4kt+!iC@U)-_*3L|{0 z^yv3^9mw*ikjI-~Ep5^nABmg(5Zj`Ml&4>}Bc45+>y8-y;xs{ThPEFiD=6sUySan|BZ>z-rgZfU zJt3)W31gjxVF=y+n-XBno4FE`2XH29Eu*68mhrV4(o~nSQmM5g5fl2J?srA1izVJO z`&$!UwH&KqwwuSBGKN$qY6U4Oc3(9w;=&Vx!cb!i>t5@kO}hN{TjKm_(#}#%=?;+v zy2o4}cAE4Iu%&*ej@(vxMclVrX-plmIXpMM+ZkTxKlF5=Lri&VV!CVL^B{0Feq6;= z74C$cm>%= zEAnThf$4^AD8fDAEuC0hYDQP?j#A#Nb=cfZMWy;Tn1_#NkR%4W!^2}BO{@WXtg+XT ztVhb@hX2ebR6mps(z|pqMEZ-~CG@78=4|s+JJ=8szD1Jr5!LWZ{ZdkXGi0j5N5eRp z?M4F#K$IVJ9xaj!D3P5uxC>J0JG^jKbjTS(;RmjjfmzA4Cc0MvUJG_ zq={{6fDLmh*wta68x{Wb}Jy~89!GDi)!*haNoRnX$FcbW!BS*c|6F@(_ zjM@t)<*nq6B6+-(78Cry8;0=kv#$B0+jGhXYO90za=)h5m5S$D273C@>nkk@<&f`3 zM2TP4ly-6~-am&}M817^HNHi)U1ZdAU9+?9bLJkw-4!vv4~e&fW4$qkaN%B|#rGXSBdcuSC>pv|vN1<2 z+_spe9QYQt)Hzu(yENjWqAN>_a1J5(pM5fH{lus8j!T2jUBJ294kfeg5W?Jf!?RdM zXk!UwaDM}lR>7yh*tq}tFx&b0o5e3lt>gT7K1>PhPZZJ~Jh?}K{Bq=9V)&}}gu=K| zmH|qez7@@?p`4LN6@KFyFCr)AMQB$HbDIhelxcL zCzfkByJqnZ>_^p)B&&nPQV&;u7vR1yM#qj^c|3XTeql+wv`mAEtMOmKg7{X5juqIl zeN9;(lRw3ayWa9`+T`|Z?CQ0kQz8#?>K~4vTImsEiAjissK0k-*~2-Uk48J&jaHby zy>QZ78SQGp*uQUx!=AL*-nrgHW<$`=UO%&ct3}P^oezG4m0N$RO~xRlS}o~Osjlvm zu+clwK`Y=H65N4%DQ%EDc5X{;5J}8-&fd_ACQ-YY=@JTlbC~EScr*2Pj8C^`+B#2t z1@Gv4!UW9B%T)HXMqKXD!v$(XJDfYWJdqwYwEI@o{r=kOFnRf17?e}JZf~o^t|6pR z#ykfaib;w|Ci1k{OT)!Quq0c)lT~tIyHZ=gU)99S*MA!(#(fY^{5*2^q*0-l;$)}W z1WmqrE3LPJ8hef>pIx2WJ(6>B+=jxh5Hhlh^6ig6F zdXPr>g@!xP2{W?Lp=m1jx4i7xIYuIKFz-J(l<8b~1e+v1r6qqc^Ga;209ea5m#v4THDjuO_FuC3%GtLP13Ik;-jqg}bZ zB8%X@v#H!;0=bRpwIV_BcJb{q(BQm!+zoi>nc48^5}} zdMIOM`02~B<3mRP2K(rOx{{pdzdy_U01ts?n5QP?=j-QP*fuI=ZE?eZT`(?C$KD&^)imsLCX z&hxeX(r{?VZhFp|PSzW-Puy;L!x}on7EXP>hPJi0*qP>vmfkh;zW(_4LUreCctRsY z^&JXr#bSJTuCzXBVn3R=UUp0|t(j&pTD=Xl3%HTnwYw60_BQR>Setnvp*5eOB#JZ& zV4XyVmoD}?S$68lj)~q-zexe)^XxCtOD=nKR-U{-u_$o4=29N{Q{(nML~vSR?f z{8v?6)Yi!+u;Hf-YqgY*%GcBX51rYm|fo^J6nq9ZZ< zePZzYL{Y@nuy*#afV179^FLt!O~Couq4Ph`OH0r-XQyvKK^emWA0LXG%x34CH~gNj z9q9dxf$jeXZ1+#3?`Q7Aixph6n@Ct6m%V0sqt>OW^z8mBq0ir!5Z4J}s|8kiS^zFK zMAFiHxY%SdGk@she^MtXQ@FL|hQsah!Hl72>t=EFM%UzehRpIGO&i!FmB|Ax(3Qtm>rvsCH%Yx?|4@SG>)uq z#XDrBX%F+5`hvS`05&e#33j_BQ`PepxRg1)i;cRgGKM2xNb{OWc-eR zW&+Ajoy{Hh9)pg0i;&YZ<*zE#4s~-G$`iARqewTF>&0DJO_AhX-9k&e&v&$2AW>0& z^T`y_U1|K{A$`rHB9C`#J=I-NhxGrv)n0kTppPLZ!{rJ;MVUrQJC--p{XQXR^E zCF6x6rD%)pb=*Ac1L)s=Ev&Xmx-{GbMcYmFn`KJ6Sp0(H& z*L2vlesb>%mub}Yf%ga>gLF^f{&Jg`18i$c#+${tdasqrM8pQ zP79W%_EpcEMb#>OxJ<)+39C;Vsm7Co;pH-W(Iz9FtHR1C5d# zEO&HMLVWRwl1%@ue$leB{<3j$-goupR2NY|hymg~kz=G#M^QinmFs{?W&ND(Tlsza z2Fv<=;?JgUq}66%fJP=jGqGB(ltX131t!6T$#6ZFazV=B;-6oal}q=JhcHnipfSg% zxa!X?k*gyo*K_L60nFW7j?l)WUF#M`O!05m7QDuwXRqUQAxf6@u7)9HH|t$J-OJdx z_^FZW^6)o*C@FDCL*<=qWUp4&*8p0Ncz#H&+jV<)aW z_jN_qv$it9zh$*Vcmg#aa%ttkX2jWgbJ?k&{8`bGbYETcsOii1EVxt|tvKrEnANT- z9Qr||kAVDo1j$QrF7B@3#w~ng%bu8EW{!tujn^qliNE?>4NqU_&`Q~CJwcrDc|Gxjm!uJ;!-;m|?nPiF;OO7&`8~WRM@F%+Nhfb${E~Yo9@=LJvwGdhq%wBW}J% z4Oq)mLn0;p?4VjdeK1+MQnUGPYQ;;Wk=HQk^qb|W6ES7u(iRSL7G7D9 zyESMX_8HbBu)Li-_+5#l(5%Kq+WaG59DKX7GQ(4t3hRFBh(Eo=zAsa74>5ZNqXpO0QMZab!~o?a`|D|J*F=c##bH^01VM?}ZDg9YR;#7lPoJPPt*qUr=_{WU%f?+# zK6W@zCwR~~U_IngcOqOEY(V(HiukZFai_cP`c0s4GTg26$bR~VeF0iVA@J(<81?X< zGRD%hgnJg#ortFEqSdHreDHMP8Z#s2;$_jtA%aez)T>~pwU~Ky7$4o%hAGduwWTB zzTv3Fi5mMIMbgU8leUjHPukw`T()Bpw$jRr1I9!2yzzleb>o3DHh$~G9~1*qB~a%L zp>3qp&U2G&^wguB0lTeKRhCJ}#$}sI-PU4zL$}WR2Zp*w-I6G1v&JEg-s5t-K3haN zWA8n!8wSV=SNhwN-D_MqWtjcEZgNXOJ}10aY20D#t>AQK(IHXa<8zv^!n-F$%=m3g zO4298K1P8WeSe15l;H-ns#aJy;NMh%$TfUcm#<{s|2!D^X+-#6`Uj8ukI9B%#c!IP zR?@fTP2*1QeqY#?u$8`L(bn~TM=+*B$_}dse^kGSGEI(CMKioBLU^*wg}Zf%3AQ(I zl~Ok(JOe>N^x`L`aU+1(k;AaJa|cr!l88}i_+tD2NLLtC>q*G8_i~&b=*qeoJOY35Seb2Ahio1%hXiMut5tD-_UpNNY^^$5Op|h}*cnE_;VDSGu~=A{ zgKo8lTklF)%?2NDRyd?nT}{w$I8k}rCqeSL=P;dQ_B}-~9Ct~%_St{1Np1=!rC*j* zv&`o|n1T?u0_OTY)t1eFVlPhb5YPpw9(S7s7$o1+7JxHX%)7Fh6}wu}TvTE!dcpi~ z9dhRuKlHD=O>4g@<~EI=9LZ@OuvE%))PrwdL&Uk;nc7vROpNEo{u2P1xDEA+zp7M+ zzI8rGF%e_#qWpC~8gR^38iX5@@O6_(*ACqrsN4FPD5Q+V1t{V8&80IiHoQLW&f+v{ zrxE#TF(L3=X~w;py=(l=MMIZi)jH`qOO`3Xv*bj_*V@7$Oxy3DfjH^xgN#hpNw<|< z@!_BJo*B3Vuqieb-G#)D!exM>JoNyV)MBeOP8&tQDmq9?pn5kI9HGRy!r$>1+v5aE zaK1P0v6`aMDNpmWs(QTy$Q%igBtQ$>+T&WH=l8`$lcdlz+gSfy*2>=&Jm#p9@khA@ zeu~w38N_$Wzc~_7@iSq1JTN5~cRpyrw5@D^2TmH+AK!54w&0PAs<{5KckrpgFlI?0ePZ zrsB7u%<^~Q|MaQWzbXA3K@`5>FvyHO3Xe1OV1RjWQ$l+K{4{819s@)-H1oVM+B*42 zm^&SM;y;DeaY}J~H=oZ*c7Q>v_I!nR5v?u!E@JPHlRcfu>z)S^tr(wk(sj!cXy z-B68Qtmd;tmnH%Z@+yAwlzDnQNi=^+cB)7+1aNRV-63gS_awPEqq&cSlbbvLFA5kY zT($g;`&5scL0RA`8a+Xscd^w-%uvNy=%WdQrn+5L&=Umk8@W&ey{>usQ%r*=g5(+J zSZDUg{EscjtN4!FO=V7e?`WW&^Dt1qL%S|y)i`9H89aw+fU}+{xfaH>jj6Rv!YejE zee+j$%Es0xDdJ-~fs%3VF0vtQL2H?sez!%G7vMUJkt5IV(4~sRq^W9BZnvD8+WS+2 z6h%wAj`vK$PJjLWJ3I>aDsk_JsEnYzj{oh7S;`5c+7M*!%}s^??S(SwTMG9^nVk34 z0is~Nxon`eywich71J49n6hb;xd+Y^h&zD>2BJ#&6=u`A@e$DXiMkFT5Q`OkSlP7A zbNfeJA6^D@0b_jqQ`4kkRnN*)%#wJkyD&~Z034HXRxC8+`7OXWbPWS zPX+Ey^|C(J4F;R$?w^fUZsV6ikhAxJE2!Q}23$iqz1F74jkWJLF|HO-lit#%!YQ1z zOSYDl*f!xLwx$+sXONmxgGN2#1&^t*o!Q$+dNF1p^Y`gW;m4;u_k_UE=&sGqx;dQ4 zpc(Z*zlOWulV9O8u9mIr^zBLm$AoJ05_xCUQt3im>jQ`oMmUBhop3#~(Sn99_nQn2 z#=eOi`*xFW9_JcbzA=V%PWLJ6U@Q`oTl!iVxh#GN6Z9iIFFSnc%&WC-qc-WEzbN+@ zV62eE*|Gnznr7u|0_wcRuOyK5-aH!nr1#t*TQa@_auB`w=;r&KzoiY%CDK=Er&{f8 z?3C}hiAZUcr~W}Ga_`+d)oe&>wO1O~yPs-*?%btMvoj*f-_oYF$}+|qrZ?Y*Ej~$! zyBLBcw9e!y-7gO7ciQ2Z`LLUDn4SfCd;U@~2{?DyGJsiaZPr*(6Zhn*GU@F_d|YTM zIn40aurRHaO?~=8Y=yNfa)*UAUdE+`+4!n=vI zTVf-E!|{baJB;0@!8@6EKN{S4(T#V?d_2~n28xSXipQeIo9;awIRK~JQA z?P1}8s1N#x)$t^Mw%@tEJ5^JbN@iEvyStT(Fh~lnrL}TLr?Uyu0P7#@F{ml8f~`w_3()?RWhJ`rC#$W75IU z-O$^30vJ!=yd}J!f28}kaWwor^zI?e^LkfeEhl4_sNZ`BmonwbGv$^tT`lEJ`2MaqKaeuG~})BxrlR^G?xfktW}ntesu+4|l}p=~FE z+fIbGU7m>g=zb`WNh#c*Q#a^6u`Lw{!*bkA!7Z12)jVc_6yUL|z4+m{9T(V*OFAS& zDi`+x5;44LDM5|pB6p6k@j(7@cmdt&2CaGHPSkpi>g@wLk2%$9K|WTcu=n>$VmWDF zCS9iCkA2x+e3P&6KC}V66TaoVif-)6w9@Sj|R zc7y6VPx}5ddHnq+dp(s9?e)O1P>li9D;HNs_ZXv^E_ITs zoc6z?WjKNeWo-o4pzQ#ElRy*0wpq5hCt18-1$Ks3#bK)HYo#r?!)soV`?0+BTn*L! zrWeWO8=i&Gkmj`5dxevbpusS|XlpxAb#b_NhnxNCBS+8Lw@fud`tH@ob4TV!@(s2< zDzCeQU%IVaRgx2@RGf+YH)JCz_vm5+XQlST`_mW=l(X7J#3sXe5)nQhOfIaxx@~Py ztIVBB&Kyj#xGJC04i~Jfu_0ojO?J_}O6mi($1&N^%Rk?`-KPu9BcQYgpg~)mV#P3= z%G04`eGQTK-t>o7N~QgkXhi6CTgC3XOdp5^W>OUC?6)a1J(10-MaU=sRN-~gH(I6o z7=lgV8x~U@87k%b!tA+BnY0(cwe~K(J-AuKln(PUpI^m?z$SZ`gEU6Ukm&PlTGzF$ zoPnN-sLSACOU2O6-zp@=sx@F^YqQ-BR#u=Jv;U;sd?sxQ?`-TQz!CJm31TomOu3OPUAk&#O{&aF{QW&| zR@3}fhndSV_}Dk*d-pa!P7>w?y^%f7mjC>VdU%;(9-vc|_N2nj^;R3LdHNcAeI||f z@NQrWaqXiDKZUmS>T!4t3K}!J`XP1L+W1b^S5+1*u*j>7^2^kCYm#wFcy>`@^4PL` z#;BZB9@-aGdVS{)zRv{BcI(A@vq!ea#EsFV9o17A@i>^2ZkmhdFe4`V5PjU~CrJV( znDGO#Q^aNLuz&6PmKunj{3rU#2A)gvM!EfUW&6bPliNY0?&N4BgIQtD? z8U-c$!R9`<4}3=SNcm7ZLZB`iGpstXunQp^-DiCu z8_>KyshQ$uHh>3WHw&LZs>06X$fU@$7!zA;*Z;b|~!J!5f(6bLFCqkoIvZQ8$6 zeDe`Y01wyE;vv}oiG;W6=oud87)gqtFAmCZN76Uk8V=95@VBUu-A&{6PAW&}57-KP z8B%U(jP`Lw>PqvD%$(i~H)8@(7xco;Z4PxVZmhpRFexluwJ>g*IuTX=oj9%1z!&MQF*)O{W8TeU-hnfy=1|w^R?WLJF-k7eP&aIo+XcSGr?yYD zPBj-kavmE8fDq(@gSee)N}3hx>8cR3sA0N0iiQGeC^vVuxpxNEPo0xBE%0jh^sbx% zhAh6Q+Z4Bwm`S3=dh8UqX!`wky3rv|6l={0#N3)VTv-nH&J_ndFt`yJL|?Rx6jPwm?EuV0GPPSt)c?fM!pd!p=Se5XQSJqY%;a+p>h z@loONpmXg{^{tS+w|3aJR}in-Z%k4}9oB#7GWrqA)9t}^<+stctxsITvi6nJ6TiLe z_5U5*bSORvJo-8_FLvq@^qwEs8Tb)`mrD z1WK~O(3wF%<=%jXYd@7wN8b9*93RTj@3Tl60!P@Q6*}u~n#?lh&=|gOv+4tiWOF(7GW3glY2US^5&vBk`YU(T{i=&?PtX5+rLIf1A!p?) zeb-%CqiaiJQ+2n)wN4bN0y$ z8sxkoAhQFR7sHn=6BbU)ZXsV$e6dPSzwFoEqk}5>)KxidtiSf|C|&$Pbfq_B7FZUM z?lQT_AVfex$@Zs#Sw(# zt*~SGYe%M_vn*b?(R=QrA$;_FzAxv`?Sg`5Z?f{rD=nHXe=Y2s|8e|7$#CO`FA4C9 z+>^?36}g2(UT0PZH1&W*gaI^=OR=S2=l=kwYy9RW&JeXYTh7BOnNd4F>d0Qj7G;{< zy&G2>RlLd%oDbw|?wqgu)|^w<_@KlNvJrk_0i3pNaj&TE8aAI^V9 zjEp+cW1nBsvOfU; zT`UEKHqV0Apo6cOR=IOevhR8|t{Sa=AIJpnY5N7pX}KGL#*;WxWruGpM{^S0ADn!2 zV^21NIrV8@BK9i1;EU|owSEx#%}r;_SXSMUeV;m~<=6K3K=IglgWZMNoehict8nUW zfv&oyhK1YqXg2(*pmxGhMCh6xth4oLut5Udu7`bhjQ~4@m&=sR59w;)F?-5*gYSa} z+?0LhTm{gY`r68J-AvE~aki&FtGkXI6Ed*XiYc}k+FA~Zu5Yv-=(@URWV|B$d2qca zXmkt-J$J0RF^ftI9a5x z^p?T8)zt~(J(}VrQm_J3LOK1h3EKcZ&YGb7;!Yih)Q+_pR$s?i+zXozHe37g-OFc| zaxbjRE++Z=MbJ%U;j1}UaJ*!`%VQWaIyyEs^bRsc^%%S6Kqm#cvOk0a!}W(a@wP?% z00uh0vo(rDicLtm6A~tQJ3qmCcR4yuV@=%+q5HERzhI0XTRrsAZU(-qqJClSB^f-N zDPR92;F4fe`w97c$ks6`J76e0R`i`b7`bxQJnW~-^(Kv?3ftDr%&@{I8m^fsKTGG( zG1^gL`MlwBL*W+JKy!!HCTqd!hu^|H$+9)3f8?A@?ix!M3^PfExrPTeqQp=>L=;o@z zLd=h<3l*KNz!-Gj&tUEUkReHDsEp zdL$C9|@(8=Aq;85_^&Rr-APkzu_}?tmbKpNnhdhd{^jjI#lo_sA5jG(NKTRU;Qx z7UkkDBvyNcK$~X388WiK&>RiR$Abq-MEvS+4^)&58$IHfNcg7DKsoR0ZQkYdrREAx zyzM^cu=88oxT7(p#__2)0c8&6XLnU0gwAK)n#%QFdS16O|1(U^DR0!{?(18p^2U@m}c0hKjD}iGjPV(1?YZeS@F=ayr4;S9^_F_k#H(rS|Q%jMdLKVDqMD zhbExI;r-X&54lY)dpxgeyDy!jG6!OU))csvC2jH~5^EVc@ zFCbdm!T#4}H-||Y)I;N;#LfHJ7s(Z{LYbFO40FHmqt$j^&8J2FzAfBlzuJ+^kdUE9wLPLmq)8)bxj)0{veiR-h^p;e{dZ6H2#>wB;SABX?lHd?~h6P562AU zx49Vv)DZCPr!(ig$ol17Bi`=Updd#>X>UIqGKy9N{xf^=GfAPn@ z#J~da&hD0(j;CFVN-00TQ#!R{!NfIiA8Y`6&4SyYGvs!=F3CM?PVLg%L>qYc0e^ex z4u6IMc0Ab1tmYlGOi>>^Xo38q^NGRFNG(uB$LK=3X9$!J2_@*Q%BU(5K5g4wadCbgqWL}A!<^&ma**l%PUfCI`NDKZoql!bj$HBiMJC$YQEp&gM4H+(JoEE_Cfl4>GOG=la`M)n75p+7rfaz z@V1Is0>R|H&tm?SmN>p@5FJ!AHd}LJztO6!dwJ8KvU|p$Q5wJSa#*J2nQOVEu|bm? z#NfrN;5MZTq=oI!odN%Llh+ZfF9EV(}vkeNrefsOYXFT7~>2JB04)Keo;6 zt|WlaUYF$UFcSuyv6|01^ezQV)+c`I=5S)G{P#Q_lI_rlt$3I9`&Z9sg@l(MKlZ+y zjcO@-c@t4JLP@Lx=k2l9_o{g4>D>kUT_#egb)d`jg%Rmuqe3$a8Z+8rNc*WLY*P6f zwI}Ippo0bFEIA}F3# zfd`(|fES@AMk?I3u4_KWUEZ_pFQqdBg#67WP@r2Cr^iiwrv^ZT%QRp()!Eh5NAmgV zsZME**ucfW-;D-?xS%y=U2a{qpsub8{EfdWT+glbDu4HsNZK78j+XZufl8$z=RMK$ z2+m3#aiVFhRXvPpgRgio91`%{me7cwWaRQ2C?g_U^gGkj?CJ#ES*s0j&s-@5KSUFb}+Y8yJDzlYG#O4S(+3xb}+1=v2G&MEoEc}q+S1`>%n8E zex4#VoJ>;4o0R>feDK6EbhHI1(4Q|#;tUN-4-b>0Fx*A;c)x0yXg`WF?y9+QcUr6~ zE?&Od34tMQR%wHTh?TZet2GjYGR4^}FP_IC_Ksp8xW zwvjd?;%eXG`%oOJO9}XE2Klc8^v({24siPL{K6IS)ecC3uwvJrnf(~7PUuw0+KsC* z`^PPRNBz})YbmR4LYt~fBY$n#)KH^;E>^y~Iq2klC5Q3){aBO+Ptc+i68PJkY)Yfn zPUZV;9Z5koD$t#${8!t*SIXsId{X)x`F#YdtpAJ)U9`d(M#aZ7+Q|2B`>A5PRn#A) zxtRniE{wmwzj9J93jdW*>mJ?9_1WLvGT?2a&Cca z5+yLLv^Q<#GIs5|09dzNv~c|CBr!YfY|w)T<7y?Jq(8H)Kp)UN{+LDXBhGKtc{@in z{%+~@nN%0_0i$&Ix=j&q>zdv;UgK8g_BQCQ7l5%_n3|_wp>kGY;gZ}>Ioq3nn^c?b zL;=o^qZg>M1Bt-lf#}tF6Z@cB_ZAG-p3E?DHtZoxX0#ce14#i)&r zJGbXr@#ML>*KIN`d6)lSJm@Hn6}6{!G*e4}?@rIQ&ED5u(LZ_0`Si<*u3Lon5Qu#A z4!>I`@0@lqf=b$#}{l4E)(ru6mDcSNXk9WIPnVI!|Zu}#Tce0QC)7Xbg zXMCZmL#AI3KP#@ke06f<67tR#r3}aF-z~l-g%ybkya;o07Abz@SBK8;Ym|-hYG;?1 zY=7`lk8)r#qckn;w#Vq{k%7LB9QDbTIQ#nLt{nxb1M<3tt$KzBw}wtSO?V&d39_tL zRHBE(u#z}>PDbTkarZ|7Bg)Z}O{-%QzXnH;^SY+~W#44|%HQ@LYe)tv z0zUNB&dVAZ^zPJCaTwk9Le3QP_N_^<(7Nf1#n+cK(JfdR;hFRS0{v5VVTfy1O=I%$ zF}1U`My#UTmb6cR`Fy7Q(vCf89cSmC?@k#egU+2^D$Jc5+5Z$;3mW=MzxUH4pM!rI z=6D;8Rqf(fhhDT?emWD(r&o2(17!<~z=N;_V9v)6<2sy)vutnEHr;1reF}ap_fP&X zz7EFLc?4SgJUVXD%$#p@v(R~frDgg&=slKWD2ntHetY%O7>bR$$Dt_Sm;0=I|4+E5 z@D**fsPx4*+9v!<<3Hsr^HLjQ+0CuO1fSy+r+Au6so6aH`u;PKvUkIaUC6^p?k_Rn zwCv7A!L(B+$dIp@qF{QXdK!0PEH_8a7`$3kcws9r0;v8jA+@_gZ!q!P2|D$g*eH_`>kGv zl_}n9BT4F0P8S;$H)&RM9f}n*7SF}t|m6 z<+Hr}8vvBkch@H0+%KnZx{tPEWtvahWra(nC0gNL&}^-6>9o$ZQ8|bp*ar5Ry>}}P znbHIo9R=#-g)@CZ9jZ2@5aEb!iQ0*8Ztr+=Y`PXc0x@l@3*NK1FhU&nG z(-QrJ;+vVq?f@X3rhqQ9R0d)+!$2KvfXT`D<>fZs+8(&@o~c;1IOR3lWov9U&8JLY z#f;5N0a>zE24a2>!=GmqX^D;&rxdVl^>}xYkb(uTw*psFu_6GJoPzIaqaNnjA*n}s zK}c!=p{<`5!CQ-l3%8nzO#zaJH2JrJi%jv;J`E?n*Ji{8R;en&f;Fv*Fhe<%5Fo5& zw3RrU2HOGu`4PUD{We{k{1+7^+(G~$g?oA(RQTQLrn!B1M?NTBoS`oH+SdJj62Gzx zT3dSw7dqJFUt-`B`h@!luBzQfBlQU(R(ZB8W8^fd`5}#HS6QJ;cyLOSlLbJwsp zThr%veJMF}uQG<_tG2EV8e`DQa&qtdw1!j*IIfJMo=tU=EBnP3)FpKxwGL9&Anu z=u;cmg)jXeIr6n^xXye(8*cAftf_c60MgPXv$j?Phg;f!EE#p_v3Y%Q>9LQT8MBZ# z?32Zi!ap(7R?*4m>9VNg;^`ex9*w*#KX4-ttT{0i`IZi$dr6C;EB?G;t&AIDS)1Za z1j_j>omwb$HE30w)(V9)Bi5dxri)RCtdw(+$*Ad>2g%Q-Uq}lF(ILB@<+s$*Kc&^l zl7}hMBK0@JJg*-H>g&aCc`6ewh>LqJ8@GK4`QHjv<2HPVFq)ad+y3{6&z6_rOb4xk zNdtA$RUi1pwo>scX9f-b`idb>S1ZF_tZh?_l4Sp8pI0Oe$;Fmb@Gt+^yXEJVKD^}e9-)yXcBQXTazS~> zWEGumvnp09cE(EV-(FcnI9|Yp3`pxk2BMjuo!_Z0l1n>xcBd`%osu?KT&`I#S?uHV znGh1%%nmdyoHSTJ-r{M;_-E5r4;UEu#m^zC&1_@SqZ7r`E*Ji`vUz<&V9}rJ5y^<@ zvIxfGt&WQaXS=Ev4o-C4pYO}r(^_ZSrZq8Yke%x_Qmo(=S7(Bd^pyh9`SZ`-b~jDF4l20QmLq zeLVQLE@&0*i12&%+h_O2NB`Y&W18W6qqaudgYn<07W#$N z60SsOK*41Q5lFZKAp!-LCvcH)0D+4V{zQ;R3V$KUql7yMDM;z%Bn2hhN^n35ec2{)47! zZQ*Hk{F%zK>LXPoP4x`YfS`p`Ln>K8RWZ+K-pH)f=5*RVq?@&e1uGcYuL?6`WvVu$ zQS5`C+fvOzsk2?<6vC(wed$CGLE*5i+8I>;t#54&J_0#=oq zMsZ*%B4w<`(`a?7@<`*0tdoRUtMO;FTk;ABFBSLhl z5Qvo6SKF{aRzp@@$X6=YHAsg^ss{h{eZV?T6=N0rjCPu!Pmm)hS%q73tT@(kR&v&P zMkE z-8jSnVdwvnuHC{jOWl8gwn#RN4H5nc5{?UNmbyQKc1bpj4H5nc5)KMOmbyQIWF#BL zh6w)z3C6;erS2Axykx`J5aFL7VY6`8lI~ylpClW`h6w)z2}gyAOS+%&J0u&%h6w)z z3BhYwE%<|C`jT!u!a&$L0g;nzxHgpdmoeeJ1lun8|8KEPl84|&r{s%q{Zxc-AjH9B z@txOjJ-5fy5fnX{Esm+{28p(`IY_=U0FBI%ngztt8UtV|Qjxlgr0x+00E7#j?qf{a z?m|W!HZTuXkPf-StXUjY^wI0;k#2t<)*@SbSO)_M%BtwYk*j@-sp2h!Grm`ob+NCk zM1PzcFSrklj*h^_fHR=iV*KM8fa%AQP~5Bud}>(~ z|J5YFNS+$T`$ohmbpu96$=YC&E$l$Ol4PoHuTSZv-PI`G$cS(*}OI;2F{nSprBLSGTPcHnRDhBYNO=#Wz3 zYz88Z1-l})>%d>V$m!?Iu$KE+W~MCCwD-~g=TblEvc5X z>39??;;Q&5%Q8bMse3x8Qs|xmDiDsP<2`sy+6Z~N#EypmRHNkm?N$n?!d#bw$S4{@}0#NbO&t&ip6ynk9SZl zd4gjI5PcCX+>(xX&60N(f9e2T40+K zWICdm<=`lO)&a8SX=qD+r{}*D_NOBngCq0Z^gC{fyJ?ck|5*h>MWV!`wo5F;Ko&kt zk|dPAwz1*bP~u<4gto+uN9~YY6*sW(8IlSijE>lFZ7A_CV?sk>#G?`<_TmT@9wp7) zwMav3xHgpdmocF$iRMu|B_3if3!f#y3K!{!4cCSe|0*UVhb1yRP`kuTEYCuuO4AMk zXdA8#CH{3xXi6-3pbm+XIE95smlO#BbjgNmLy3PG6VjVzy5!$gNC1ipr@NB*b1iEx z@!j7n!Yz?@r+t1LqG;(nc2=!DzwFtX`+cABxyOf#KQ_rNIKT0|uX%%l^^FYIS(qM- zAuVpeMh2AlGt$Y$p0*pvzR&2AqH1VGUgC!0tn$>W(p#P@7?`(Xew&D z|M6enT{Qt!JZ5zB-+=&30tHmgA;28Gwt$);TI>)<+?6y{OWaA4|M%{Bs`8hAb({a_ zn5gNQRO)}M{@--JDJnvCAv<^&Y2>mn8Z0@?O$i=OYpSHI(xhqT`N6={rUFV54SGCc z4<@HWR6`-spgIw|Fm4@VHVY6M^hAUbhTJh`zrYEONNp;jzi47J|8{ zMz#xi!CYih10{yGpdA6i2s%y9FFXpCM@E03kb>pYqRS{Pv_m@F9T>|F6PtyD7|Tu* zi-oG-6jXFGWe+V+ldFnBWJFg}T%?oZM8Bi-)ADq{!|(mZsz+cCh7AlkSp*BjH& zj&)rK3WjAx$5V{x<7!+ehTDz>FT?~dW(girWawh^1@mA)rr;^Xk}h^x@CpWG3I3#L z&`s62ei#W-@SNg9H`U-qVszVMoEB_@A(?^%3ZgT{bs-=ak|lUT0n%}5Tu?AIQ;SF&IF*$Z^3k7?de^Msc9Ws&hjykam&t0yr3-DM+Hg=wk3fL@+)}5Jv&f#j0E% zj07dj+80`*s z>xGVBgm%PUOnHYWmoi8bdsNQFVxLGqjW;;>Oc7f8KJkY6zpM_u)smvS63b3;N~Q=P znib0jNjgZ61Tm#&MpNXJ&l)a->Uh+68Ewg504)yW82S4ThKAx9vOvmc)w>XfwiCBY z?PnYM%iRodjII1kdrBx$A~_diXdw zIJe}C*X!xDyolG+s5}S`cfSAnz3-EcX_JrXlb5o)3XzFtb6aI_Re!?02#>@`Z09Z5 zTK4HJ*!S#UmSq;qP}{0kSoLtZs&9R$~(bBzJ>vE@a9ao zamef8OmWM3iBnYWBM)#C_K_IH=5N71Vn5k}O=Ev$O#=N4b8N&IMxg#u5|OUtwws;V z=O)XBylFTz6ZED*d1n4iLl&UMyq|Rc`(!R{GFK)_f#FWqZaSMgrpEO(tWo6#8b(_$ zjD>R2C=HA`4Gf~+;5_TEl8{u|Cp#a`U!cifcs>UWd*ZDDIuL_G#zC#fEB!CeEF~4u zmD+Z*tNPjq;AEJghE?83sJ-IaR|s86qqD74FBh`~kbex2uisN@n}4bYfiewwEzya| z6!zBSbQvJ0^>bHLyJ3b3RvsgvI>_dajGIRz{rWM1-%H(fK=VKI);dZ;GH8Q#(~5+E zoUX7f5S#}N-g2I*IkuZ^*9VkmpXh6lV+Zv$$g`FEBIMZaeG&3(lRmB-JEo7@3F15| zS$RzZWp|lxp+2~VTYd@``u6imXCIF8YL zaw$oHuB0o=?(9PgB?21NZrYW{53rjKBLK6za*(jIxe_bfSm<~fyn)dST$&uu0&pL} zg}3{8R;lQmtaip<<(@I6Mj<#KMK<{XFT($fr%_ z%kU9>cp*Qdtp8%~0OR_bSdnob3*&c`9J@dZ(an!nPf$at+mO-hcJTH(`8fLRr*J>t zJ*)NkT*CBqL29S@5y-I|-xstcb!OJV-is<^SPBvbo;L>{^5^xomIV0Y0z9lsBMXzZ)**F^`hyu{ydO-#U)j_*^e@zD1Gsp+xwsF59<+HY%OFouke2PZ{z9(8dl`44bxhn%uz0 zq&7s?76_MpRT34U8PY#*COB@~)GQ?r8CtZy9HOa1eYz8_x}!&gsg_ z)XGbfq?ygPd}5t!ib++74fPcqh6!huI1@V}QzK$Suk0cEfwHn_WYzvhXZftduV3QK>PlpVlla zTFJ5U5cfWo9*$(@hkD~1(SfXv?vIyE@y*X@^8k0!MQ|Mia|3sDQ8F{C-e}L_t2dgl zzN-7H!u$(!)L?#vZfepL(`2lKO zFhJTnI>4mQ)cBaZBoJ^272igV*Pu-hI1^ft4{pRR;j^vu4@cEMyR)TmI%j4ZK_O>G zjgXZylfm&3y2XAipKl3Z9ai}T+k5f!=3X~DRjE0)ZZ_Gm^JoG)Ri$5IMlM!w>TUa* zIeIa_PLkS92OQP@C5CjddUNlvovPF%UzB7BE1%(DlJD{?8AN(F!oM(|+7;68rPJw6$MkH}&#NW*Yn&%+EeqeAe)*wdpXu(5`0%aLAb-pAgdJst zF`9HU@AI;-^luLpd&|PNOPB9xE6}1lTL)$=lF|;6HDCU87U#4_RYTt&NuycVrM((0 zL zX4Pau2Tmh9_20$tv?F=io3J;koHj?*1sBDVWAEd>)j=-4`M z!Qo0UivF}gA^Jr&|UrWr{u4^Rqo7o7PbWIo}T z^`NskW&>ziD;nyT-n=##l+=h7CA@}=Y2{M~%bL^{rC#n}Oj09W#M#0MI)&$37L9Uo zNG{HwDzF(B*o>eL1zZsffmuV~&4|@2MR`z=g7n{ugUA?4e{O-kD^{yz(bGn-s-JU^A-)ZukY>* zZQ6Px^E_Gu!gnbmEB91yxe>dwN9pW(nWNV@_R|Ta*FaP^5XRmoy+$uSU|(hNAd1*9 z0Y+$aNLtqrP%G3vgf%a^yNPX|1VwD?VQD}7uf=$bKYkF%Fi|uKc)h!B`uuf&^rPT` z@h$YXG24$h3giZQAd+d(sBjfQ#S2R+D91NHk@&>z`qj>4yZ{=WL4%%~6ZIoYT_oMLuYMXxJMR3C~e!-!pp9 zI&Wl3ll4Yln}rSvC!omh2`-}t?Ye?Oc1QZ>coF(X4_fApPd#8g*Vjlz1cV%o^v*%G z;~NZK8kZBbXrv%}wQj!<#YkvQKVfC`m02Ej%9yq-sLR%4WC~8Z6x8M5L7Cc2Qw!3u z@)(`EK)V~HbJ=5j>L_h*kdBQ9Y08u48l+?IF*fxZ?QD>awFh|$);>FWGocwrEG8(8 z-h9$rMZ8NWA=2A(MsMadV~Bg(-9~SwHP;a{+R39gUp8ZjRAfXg=I2PCoN{DD9nXlh zpbu7A^jqQ5utAmf&^c&PAV^jLH@*t=!ZfGi;HX8(W!1Yea(Q<+otZ;)< z_B6yOX^oTd@9U>-X< zg`@cdEm+2mPl;&?L5I%AlBOQfz(I#D#+syJbK@AW84|mJeT0o*m@^h73DtF>vn(_Y^U-8K>B;>}!1gsDm-GCV9Bb zyz>xChd1a_jb306ilM~N3N?2qh833f0{iMX65WAT@&xW&=*+O;X*kFsOfg=`Vqlf8xggB{2IjSZSnW5mx;d*u6VdsBLB`&0Tldn9kN ziUCDgMS#+*()`!p*ZFV2Z}JPlh504m63Hb=X6zG>$FZ3n8L`P?WsxyfQM6eU&A${C z##f7y<=>66^IfBY_-Fa@>{&K|0h|e&0W!iE4Ku4Vk{(1MwPd)IS^#`a zEe5`!76A*XrN9!RQ9N$)qHOrIm=;6<J za?E|tLFI~vWPMf-?n3kjBYXwbya|&aSu$}HLm()S*)jJMs>-k7IXuBmOcGE+WM50o1-^8DsEx`;51abk}e7E&@w?_m91@j|&aip43OA z`o4g6y}94WGm;%3Ue|L5`t&=Fy)yR-3(=7sB1Y=n08aPc8@qXaGA!hX>YA!@P|qN`po5ZvE0cGKJ|BIJbZI5A8w3OL-q zG)6f;84;o)``yl5=kPeirszS4lI$dLUN0FK(Q|&BVyzMxq998r zj_G9rxjnbWDYiwCApqHFqDU_fDBtsN+}KJbYDHeLFDKsjGVD-^88-4yi`6M7#i1NT z-^X!di!ISB=aS}#d-Q674t*oz#+TxvSM-t=htoI&O82?o; z6{NV76XE*>HeP%LADQx1I2EJF&XM;WfSJCzjpsf6Dw^_AT+4CrrNK;#3-G+>U&T`) ziozUSUp5T)W&+Pk_$t{hv0S5mm+X)z2>}y`IEji7wuJaoA}dZ=!he$dDh95BKL1|@ zElYz=tOvD9gBsR@_N}+{L)wztdP|AxEo}t-2TGtVJ@5E+95##%5&kEUASZ=waY;(u zhVdUSLclr+U!^2$7#kw|Pa@&aI&8~Q>Nbr3coCG=N%$lsVZ+!E;eQedo7QjN)^FH0 zjQ@BMq_^MecjcSb@57fQXh{t8F9}|((6~t=;ZtX}3njCNVx{$p+`m<1Nh|&joBU(j z4dZ{W}+z9$llz_WV!J%~uCZ!ZauS<}!j>@tW6_a&T+N7v#1Z_z0Z>8Xe6gro6=n~eU zTb4qnwXS%pl+4m~GJjtub0g?KPy+dN3N}e80DYHIAS0zf@=%HjU`dL~7AY!-zoe*a z1Z_z0@1%elCuMDMeV~c^U5a1yl9W1=bs`U~gD5W*A1@WVHr)^d2p?Jyl-1m)w&e!# zO&N3JT)*kRaNUL>eAC5m^Mb+D~D< zrR&>;Q0sk`!#>ub;7p4YZzeO3MurFS=n%A;yb&mQX>pdAPAy8HNs zzV_f^&26Rw>0aHXA#`|`MVY8NjrlY%-B7E1fLc@8s9HX_O7ac!(YG*pmE_ueXL4Yc z^kCIV-z+A_Zoo<3TE0VlRvegcDBo^y#k-%4B!yyw_07?_#3CSJYLI+)g<(>|Tb&Es z6cbqg+Vq5*Ret`7_vns&y$yE~nKIR_Y!vASpB}hVWMBVAd{mGmHgN0sLh37N&phQ- zeV6z=(4gi)ee-oKw@=@`UDZ>%tNpT~CWE*@f)O8)j(OYHzcWx1FcKgLR-de#Q4yfwGfUc510ogItj@n9ZRezr zo`m-Ysx-ORSLJ2|dHVR|jC$38$o)0MxyPg_PIlm~Xv_NI7)^4AX^yBBmlqTS`c_{h zA=Zbfle=UI^$|tY%9Qj#%Ld1Kl$$!4B+?%WDE82L0ciE2zJX{6&3Hua@O zy5vsx-1&KEH|M^*kD$?~T0~JIi5H6Ie&V`^ziuFz#rlSS0K6n}P&MYl&!mD_-rPyN zclbxDrqO3ut}=t$p3JJLF%YlK`64XBpW{y&4MDP$rx!btxsq@8OS;|~e90XRo$KmAB~f~a_OdS3{hu$87`HKV&p%jj8a~_(_a0FfM8C+$-781vlGC^|{U_dM z`blT?%4a(gZ$dox$I_MX+Yin*X~JK)AH)%Kp1Fqm8LKuOKa}Bq$bnG#RDn?W9Nb=+ zFx*j@4E$F4OoDV*TFi4-0K9MqbQ7RY9SG3p-GuBl)?CTj)ZEk>ZZ30ed2VQpK3Bh% zJI7gDnM+=4o9p^=H$n|d8Y7g=<=t@(hgCa{hd(P!-@9vVjoSTN~ z(Wbe1*i@Zt>ZoDH}CMJ_B%h&4O-WF+kt~>FQ7b|#)4IlY_ zX=Ne~{7oQ(ewnhr*~~O}=_;@6Qxk3QyNI>$U4<33MBvSQnx6974#`MShTED#mqfg^ zPY$#_+wn+;gF>jO-x8QdJCY0UNY%?Xyz{^`sQn|HpUPt$FwgupeW2RLbTKuI#d{K% z*A2Qe4S#e*FuhC8;55XyU5oeGysJ~;K=57MOlrk~?rt|@I9{_KeEl&xH(hJ=`^ zyHfl_h}1RFBV--8LF<%L&d~*iTHu5|t*pIIDpS$tLM!0K1xi!e@?+|f`JU^%W9IT* zVCATr;--Sq>2g`DrbN^eure4wo`*igo`4ezx@iHjF(>j3*hTR90xBIbQ^x~D$4||& zuksqPE-R~13Pj03lP4~AF`Ks?t3*@cKyzUOO_sR(i)K7^tmSkLr;8||L_=}c7hQQ% z*an&#dpsXT5?sW&E^6~2QPl2+1(7nU7s*lCW&jH-Sm@+3qK&Byi*z_1$7P8G zxGwqjLg8P5_hKD~@&T{xzWMmraRVGB{00{Y-@~uQhQ~U_+M8;CBECDk0!qQ)sqwb)R(X$kxx7of7G5jw z%$EG-Oh`5&6_Sa_h2%+)5GPe$#-%if>+>$OP6>VZ_e9$8zE1k^UVJxNcc>GlsoxDd z9{w%Ib5U6GqenRPV@;U(8 zAEiQE-!wNXhPUNz2I!i7m&8fu1?Y-SF6d@uHpp3g3Qs+*V;B ziASx2*8lT5)Y50cNj|&k`F2$_mKLO-PXSDw!M6`5&LmY^`-+Lg| z{a0Chkz)(s7<&n^*L$t}v9dUJ;t9faZ9<}b0dez-C^C&bd}$O^H^YE@+&_R1JoOP# z=V>KrZ0!*f6UN2L2{Ng6TLe~U5x`FH1prM8Ht72EIRs|^ zpv2y36(P-eiO^yGdjC|^MW^QnPL=F8^0YVw{qm!A?N{x+dn~>kS5F@K_(IQjRo6(OnPu#EFdsk8()LgsuMWgi(6`bxq zMZd(ymYjWw&)+9pvb5LQr-Zpzwbo8gP_wA?IBpOu`Tt{k<`3@JE9RNb~9eo?R8QtZZ$p%&gVFh@VJJ z$##5i>M!<8ao=#Iy#XnsRckF}F$th#!{%!~1Jy(z>TOCY{G)jBo!+%wUC*|XEX z*t6Wj$t`r9@Q&!#mScFh9vsEioqI31b^igE@#E=2d28C3d_qwp_4g2F*}29;R}Q*x z721aOBup}SiIcO%3455XiF;QNH0)EJ7pT@A@_tJrQg^*cPg3D}8LO-)Jp?|jI zToJBe%}w;+zPHGEnaj`p@t&XfV~#)l<5lnfpysWD>gc}cK_FjnC%A^-?k>UM;#}M% zxCM7fAi)CxF7EE`?(Xgo-0ecpz`yy;RL$Geyw0s!>zuXsUi)-EbT`#ax0BQPVGf_; zP15%BG-o)9G^?RLpLhOt&NOF4gp8xUK8N?}_RMr`_^9+G3k$iQzEl4pXE>vbk-9$j zW6SpOvzM`;AM#Tka-P1^GWYC*T!=2;#w|9Ku<>HLd~%2Qtq5CiAhL{&KSf zMhD_rZ>OiE+X%q{JB>Adi^c5-S`i@wzA8dO`>ET%t5vTKm&E!-2mj(nN2RL>iMYRPhgHktD*rO5_p~_`=$|#? zWqjdwAKXr^e)=%^OSsL`;Z&|4YBtGWNZ_M$wY^l}X?@z>KWawKYDoB`c6CvG@uBk9 zzZ_5d)5-pmo$c)?C#kFbCiZ^49g7dIgpHn8f14oT9s}b{8>Ed+R~t?C5qE>*3?c-) zt@mHoocd*UCg?=SJXEiSn@+-&2iJ9cdCq@tL!BmZjUs(&@156Z`?YpDSUboZBOC|r z@HT%{hQI#GRP*Ka|FivcHHs@5Y1Dr2^!(Vbywk|wPu6LB)p>>Rp))cQ>^?BboO^Wu zv3b_WCkwE(9uU=Dxl&GacrMK+e-$Gf2mlY@`rc@~p! z|4FY&xs+N?zjV=2jvSrFiEtk4W8Yf};~a6q!Dk&*)-O(DbF$!f+8)@;3tLTyqn%(V zR7f*WO83;~x8Ek*y9vXGaMBoRO>kaKIB$eS$3qo;E7AhCQ}^I-MCtLa|yHSamc zO)w^Ax@t7{|M}cFleQ&8NK*l2Rq*m zLlbQk3`_J~u1ofG;}+>Hl{U)seXf7)k<(m&U!1Q0>Jg@QhXyO7`c+;^H12WX&Qxyrp4kG5#&HeHHqs)b6>JHrI z77vN^#EE*!%MEK5BW2F3^tGdB1teMyqI;3fA@ukVL8a!3HS3Y|y$LWGy+`u3e)CB@ z@927guiClD-jj25aYGt+edC&ojm9~*8>sni?#HNK0gKkTpxdo;XYonmlk$3rknwTF z-ZwA?9Y%^kp^)eCn)BZ|=!istp$3`2?ZS0cF-Ag&vR{jk>2c}aZ?Gs`bjqV5zoo7^ znXtWz*I3=l^^!Ht$WFny5t*oc@pZ6uX#%a1UZIfniUsg-=QHgLA^XhhcpJU1NTIUr2xq~%-i!Up&R+7YA;YW4S^9OEwNbpK@>8>rrMG^DU_0Gpsz`xQ zz+>d~_oIkJd?lmeHmk?6>+K`r#6*S7hBnv7vg?|o+R@QMaxFvlf05TCNB9se#mG^fBGiL;Of1#6*$%+&t#j_j-;E{dZ3ynPU3U<^4vsV;NNTt_W^(pQ-HeSb zJN(fPi3krz4uwNTghLM1m;Su_D=X)JKb`;UXQHa3qpGT^mh)RpC;5K@kUBcksgT>V zdVFj{fB)B;m+DO6PmdYxi+ehg0ue-hhR6glO})1XlL?DsQGOm58oak(%*Rr=8YVr$LMByNbo$7pe^r1 z4Q1OWpFX0AkOy-;k)T*ZAK3EN4{~G7M94#2A6$Q?-8@k3)=d^>8;WH9@O~n}K)ZYp z;#xY0n4-&Mm5B3g5wG>_KxV#r5U86uNSz|eJfBh&+5G8n`@m8+aqu){AVMpi>g$ha zfBV3G6EmrtE#s&3lkDz+|0Z~nHM`K)pY-5-mh;#BGta~kw9`pUq%%6=lAoKU`ykqh zP$b|N1zpB)w&_^|7wVOHk%0SsB^&>G=K>`O zQXRRxk^^nsGnx0@W1H{ZgUsjdiKwlfY0Pi#%SV!~+(wqJTI08_6hTAxn$)h(AI;b9 zb3se@J0tg3wDCwg%JhG5)*zusl3{6E>NHA-YBY+WDmgS%bkjH-@kvPUM|P2LL8rks z)DAt;<|Dz(py%K-P)~3=XggTi{5TlTd?h#tG!u+Y?Im6q%aN^@ERroFhlUR!{KG@d ztPh^)eFurWWTWO3(scS!$iUg_0x7$6rWR}i4I@=*Sp0C*bnb1WukAenUOI-S76tB% zAUcAPdsiVjmu4U*&qOtBe>HkE(ekmdOSKWoHpq1-jJbnk6$dLND4G0sp1R~0dK5}f z{0}V1NKPnGK8I;s4WDUg4ONbk4pFsyak!OQf>a&D=qGe~M#^6d^H_rr2o`O;23BGG z{O@y+B9-cbqyVJ;x7bL_5Mn+LhnNm|a<*M4lL|{%nF^1zCS#(sgE~vZT8=(hv%&I* zW^glQjcPMTjZ`zkbyf|3jYP9R4Y--6Mz5KtMrN5qRlOqB3S5y{M9-^$s@|Z43U){% zC|%=X*J$=Kt*Eg#ZFU~*W7t~=s~@q);bmN5XH6 z$k5Ewp~dmgM=PzA2=NpvdHK$;EfYhsPa_yqGNMaVbaP7}_&GcbPq__r2ssUm_Nsyq z{9GbPVvcTnVlFxZLaso(R*nEfE4Kx*nByHUF`aYmU8l%TQcmwEiNJ6+Z8GxvPz8;mqV2V!mdr{BSMvqTluJ6Q3pG0V zSm#A2^w2_4R6+*cm-cSw%>8kavoY3B5TLA(Bqh`;{uN%T8nn$*oV(LdVzzxeSMAg~ zx79?$O;w?R7A2VXD?+g3XFsXd;9$B6ZC|=tZ(&m@7C4lMzrR>14LeUM1v^_>QBEbd z@JkUp72X{63DlmYdq}XyYr)2D zhT`!8q95hTWrx)8sp5-Ja2V#LkhpEkduZI8dNkeS#M4{2OcHe=Q+X`%RvL-4Bx+hz zBpRhSze*W#l!{8Rm5NJo*5^|sb1LLqOKfq1=G?-tZ0t?Hw}`MytjB0)8OCa7J1CTC zvMR0>874GIwF^15w$M8jdP|w+dYhX@cx!Bnxw)8zc)OVvdMlbXdfS^ux0sg{8S>5- z7>a6u9g~QP9MXvjHu$(T+pTR%yrFaYZmV<7w+Y1>$K_z#`PBjk%|_+*f(?;+!*(;9 zAn$`Yi+Tr})D|)c~8?YvJxhUP{3e*OmUxZXNH^XK*e-Kxi~I=b6# zYq{eJYn@|>SiQy9T2gfk8n>cKDz}nK8n@C)>f54_SgG6FFR9*q zI^a!NboJG^-nmc1)yJvB#m9QX%{DU5&5!QRkVhrw@<)eji(9K}p4;|a@7sU7@V7y` z7Ps2YsgEYkt&ghL?6*6+EcKiZd5?0}*0-}CSZ`}TINo}K0w29VRgY4j_(yY4>>sC=>t1N5)~UE$;-9Ei=$~05FZ_EZ? z(rscq__%U*eLmwz@}GSR_}}IY#qHe@)^YI>(lPlg=bUIEeo=s8rHZn0rRHl!hw4Ae zM?A%(4g;LRi#euQV(yb0ym9+Sv2j1|kbQRGR$JOeIa<<2u2+8eN|$;n51qzr-rVQ$ z1fqgvuo<_EO$klmz718qK5?3E{`8!#z3j2YxS(6=ew=P4eKA@}%1W7av3*L$N(Eu@ zAQxx7yh}mGoG)0})}OPD>y>arw<{9H{xH(mekqd9{yvh5`KxpSkEwJRkF#_>kBxK` z9+z1hkN1G4{aB=c{b{6u?qwtm^B3t-Jb|4U9)|%{X1f6=`{ziUm0-fcx=St(X38k5 z-_}a@rn)ga^vvQBAo;1BS&q7-Iyif0-5+?Vn&tiZ_HzY!_S4(54Yo+ug7tlM(!kLi z!NYu(l@Py>Od9noUfS~ ztv|hCV5V)?Ooeplj4Eyxj4M?xUe6HMJ>OWAQ?x5GDmX5N&qQ1I9~tP%J<64H{j1}l z?UiR7y<8aKgsW>N>|SXD_S#=MR`d7oeC8p#X*>&cn+Oh@x{*l5mF>v#l~`b>tp`}j z8FJbRhl||U!%Q4W|?__S>-Z90MT+T+D=<%{yvdm_A+qC68VfI=L zALsp#XT`}f^##d;^@WxhQyIx#pw;xf3T{iRvt_2jzxtXn4YZ8nw!@&QzZT|JPc_JO z2ek}!3uQKEKgyz3UdotPzLlNn>Mbap^_NMX<(J`|?UedVN^ zR2qufGwf&4Ep1nbm%r)yxF@+&32ORq3TpT;3TmAUu`F&(RLpD)SIlpWZ?R0WX_2Ui80sCJZR*a`6jvJg_3AI2kLxa6+^uPyQ|ic_b?eDp(5*%H zNamIHNf!Ml__P1Tx`3YC5?U8HBdj{doo!xIar6F(Fp3LuGm1T#Y5x3sPzHBase`+6 zq%*&=S<7SdI<}I7QrmE{U6$Tru9@qQKA+P%E>P4uc|0X-;dY!++j0wA>+M>puS%X| zJBzSq(-KcywCddJ>f=y$KBPFmx2B)In{X23QtFzbSBf#bUgmS)Fze@h;zr#lrsb0A z#@wj5=(6he=`P7(-~DJ}Ew07!+@5eY?&5LnHSbCD!|KiQ!>zZWe^5r|W*Po&7*Tg@X^CN9ON0yuHK%MH(rzGqo`DCs}1@7?Epk-oK}Q?D-DzQx%Ic)Txp) z(y!7mQd22pWnRkH!sR*|Mb^FDdmnOx`(Ebu`1{V|$akE_lJDThV{wo6f|x^F_U7ld;$v>V-tA!c z$<1Jd$5B+j;v-If`D0vv$W38*^s!?9;B8@q^5Nu%%o&fwrjv1M$$*BwVo@#ZybJoU zDLoMOO*=K=V@E99zlT`l_WC^Cfb1{19i3ky{IkBaZfMqk1FG{>1B&yc0-ATT{HyXL z0`l{~0rh!$0p)ozqUsFCm5D1iz4<9G($-lUhC~JA^ilJhOp5cH4CC{HpwZh#`O+H? zknOF9JnxB&eB;ptWZ~o@k>`*+p66r`w0eUfzj_-DiasJwbU#YZr@d7MDW7CcT+N84 z?v#^f;$#Jg&}zS$D#gF-rBSupDkZ$kr(yp);fFl(y4c*D^QYc89@x!yrh*FtL@g8j zO_kzadeb!j4f2QFWbTv9D^KuOyb2uzzl^4VA1lqzy_E^40~lS7Ul~zm0$3xalp)lI z0rBRC0SUN=0T7MD!qJl3&QYG@*LZvO;F`0a+6}W+@!UiUHF&+{r&)gt7fd|k-H0;G z*9QV?$a+ilx!@C4BgOVoK0*+P8m`%T4asczM!;yzLW>l8djnh73_%HtL=q#s#2b67 zsF~N^67-I2bJrFUjEf@)|< zRFfBR6g{+o;0oG6j0ANj3WE|w6+?9+t)b{da!`TDU9WWMkv0dj$2PK0ZXH%*NsgQ| z`?k`L&!0b;`6vD67hU)|uFP#QG09!CpGdq6Esacjs2?bMNR3*1SdCnUo?x zTjU!1r>gRGuG6IijL~Imn#YfcTE|a_+K&}qa*QyvMO}x(m^nyQu~$-#BpLnwqOSgh z5QPC0`2!a+kP}XnTVonm-DFx?otHDAty?`>RAR-EpixIO%7{+L$ncA39(OPbf=e5z zfm;|kkFpk(^1e^Iw#&NA0P{ku0c6CE3ij*5w$zKXqmi*c^g@^|Ke zJ(LFGRJ>EJ3hgN?{pPIxCYx?CGw65po#XfE1KcPrQMULu1bTSk18ykx1GgyLJ3oJX z8(8>ZG7yDg7L|%uK*Y;B#@)co#Ot7=ZNAo0wa{e$$HMHX$9~`pZn<;em8p5|m700PmGhq1jj70A5s%Er9$O4mHv$*S6_tz*f8#ITIekqMn^ z1wVvP25*qakwuAnLpROVm5GIS!%*M6t+r{w)8oow=WyG8z$fA)>JFcmfSk#J=NGdB zr-=TVgKyn^($&>AORme6+)iA7VU%*BCt)V@70)kLBsLKvY&+j-s*!tVx!CD?s?mEJ zxv;C-SkO)?HMjI#tl~hUd;`%Yb1`R!QOzh{b>8s3iCpQ`POQX$vivV1+C&mwe?#Y< zd-GxXoyGif=}9%y=Y~1!XGiOptEU;now=F+cB1nM2QuYRB0Cc_2?`T6i33>It)6RL zBj}md9m3^3QWEl`3f!zCjv8*VjymdkZ?spey;;t95SY%`+e;)}j3MJB>iNlP8d=t* z$ed>y)djf>^YNw5ifS4T=oKX#)*9vfc{a622KD1N#U;Fu5_oXA4NrXu54h5XH>$*} zKxf`upj0WPL!(f!)7-G&mBW$KSSOI*Ri}#IPA8t8%Fq5O zQE)tLG-yn2^wU_;9+Jh)H7cit*EfDIuOEc1Z7Y#_9n)zwz7d3-zOBhszJkLKE_e!AFWA9aq5F}zJe>AFED9Zq#|)~+)7o=3#`LC*_baVA z9EH#Br`fR9maVKZRid*UXdg!qy7Z2~L1Q7f`vZ{q{d`8=l*IBiQ^OAD)@JKHC1^M#Y9GR=H&&`i#>HEC z%2sK(Y;9Ouv)blv9^GsXu`+BNu`uieaXM<_S~(ctT5L2iEVNl`lz2gbMx6 zjs5acoAFgmd!EM16^o6Il8rVqjUcas5{p^~jnrl{jaIM460`mF(w4DD4cc)Z&2*j% zgERAu#+B8zW`VA@0Jo}#u46iA_q^PG#k|hGM5+8(h?Z7LbXf&Ev8E#jxk3B9ubo@^ z!~L;=#m+GeG;F?nKduxbS-D)qhNoP_L8SdL_+jiAynjyQQQQ18X>x&Y{J`e>m@qe% zg}mbT=0=*{H7&5Qh!NPNVL?5WbFnY{9dLvS&TOH{{Y<=M47 z@nKol5qiG@1BKRi@8jF%jG^B`D2!DC0`&;DYeC7l_sHYt>TFBrCFgS4dTlQ(+@g!~kb>V$-XJrJN za=AR)t9GKvOLIlnv#r4oFK>hThr5=jebJK!z8`L@>Dw*oN~0~(g>D8Bv-ay^g-5Y{2Qx_7!n+34#cVn*7%G z4O63jX#fuGsQ7dLjwGE?3Wx_`{<-%t-dKY^)Mi*zO z+T>d#Eh0<&c7E|L_m5PTTaQc!p|{i%zfTy`a~Br*f)*T|e;Ibp^IQ0(yPQ56Ol;jM zPQ=`nPfXp0r0pz_yZtN|JtygW33lmu1W#O|olk_K^$|9AAEh;Y9OAc@2bl3LaFm{u05qKzWL}Rvs;Q@*lzz@Ibmi>9S6Q$y3GJ zH80gAWM_KXER;@Ew5sd)oZ&04J5r_-yZoB&g^xAEnvToEn&iug z<>9A;ni_vCOKA|QG!jE<=3_#t=i@_a=jjn@=C#PWHATIs^#1Ls+M&e+EeWWTjW3v7 z6EvVF4%Tq1pj(_E@&}iH+EZ!x6+2kXEsJh;V&x^IH#qdij+9ZRid*~F7u!&wu<~qY zAUKRu+}XnZDc|28nr=s*xD{CVRo75lVz1# zP1^8+_HzFMpBIf@;gF79RATLN3dKPUw`#`tLa{TMUg7YAonkD?atc#o6}MEz;KI?h zZ$rTdu3h>^R%6?gwwUsxYsv6RLxAKQ;YCGl_-kN%qj`(t^YjZnhnw~vWP-s<{7(G^nFxENxwC022DcK^n^*lpykjq-?oon23HvG3<@{=(! zmOq^DZ$w&HBg&r1KvtYT_+3Gg_qdn1ls7OPpx{jyqfb2-fgzz^kuTjS)8K^^f;(Y1 zDSAW$&m=#bX&@jB=DZGp}nvHG^P|=tdbs2J6^m@DWTIb??59!#Gu1_R+B zK+RX92{KW4W+za}Pez3+j_)`A4^l%InWu&xq^h3MPZ0`gMwJFz^8~T0kC=5Gr~ATp zt1}p5isy^NXR9-qvi$<}qxKZ3_ZSO7K!gfeGbHeT)EUe$#qyouf2*gA8dE~{*^?ym zA5e3O)VnECKqv%#D%Kx^hShcZC=x&r)a|0Wr0x$4%qE!1`T3~WMe6+&zd@tG-px3} z&lc5v7sG~>5K@7yse?W+l$)}pgGveW)QW$0qcW76#7O7Yqs|o9{St$R*bshEvlf1b z58+`;lFOGT_@Zk4Daek&V1yzBl*pbWl|M?jt7eT8w5;CpU5pG;@g+t%zm(vEiZy4D zID^4>Rw!tZjjmv(9u-tn_d|>xQenmx0$Svx%bh_(9VxDZbn7#$4;hm|98B3VLA;zr zSu;HFC`GO)K|j=6fD<3X`ao7JXqAwuVCD=pLFEV?UcT6sHi&^?o?TlypApy+oFIclG_aMiuxE{NR8>TIwC;BBk!x`)vC?BtjxVR4gl7`_7IPrld z-#O%}F>W!dd&6F8GMpi_MS&1t8o|YAm+lPhh@J=#L%6m$5bL`I)gy{6bcS{~Pke~s z`?ge2CF}zD2y;tV-JA5%kbxAwEgIwqbDpOrxb;t60PY?Jvhkm949F4oJVy;-OG4e7 z_|k--{oOqxWaGVE){JVGOz{obmYKRY`K1$sAIy?$zFDBM%8^7DZSf7(7Fhj}pehWM z9;ggH!s)Usx}o24VDN)qQpn#4oK!n<={hL7dA~)*;D@v%p3ln;D^$b3EG4u%bK|hv{x5^y{Clu!}x}QMBzFV@-tyD)Q+gO7}XyMFEtqc z!QB%<{ND>n=96_T7T*wWnK1mrxI|<4hrXng4-S+mxS`K6~ryAIUa&bTbta#O_f#5 zE(aSZ{By#JFHC1H&-+Us8!)W0N-F&QyZWO*QMFXqdz|{@K-%JQqr zwNz1KjQaO5FVglBu&*-qy)XfV4Sxa)iHuo?`i9!{(FvCk%rAEXrSooEVk#` z5}o6rLAcLc8Gs9)!$Y;oZovG^SpNgAMRk?$vxg1JyPK?rtH6vo9@wui^*`QutLpu? z_1PxkKN3lM99U|b)c>r2|1S6}STFTXpop2qGTPob-EI1i-C3x}RTH75nrO-ZKAFYm zn^NNE!qsLakFV)UO-h+vZjX``v$;)5(fb0z@UAV5sY1<>^0(S7^E*xInQ&_9|EB9W zDi&OtbTj+sy_4n*GfX*2D?$Y-${SP~EUXlGRmtEA zF)plZdrS$*Lt+IQN-lKMFvRpAKFS_y<&Qa|)PrWfEh2tUj^iOnrPw2Xux{|Ao3TSu z$y>(u`fZUq62Y~~Wtg`d>-pP4eqSnu`3Jsr!%>@TZT>aoI8P8D-m)`5>F5@ajl;L* z!DpSZ<9rKj1A$baf&{3rxS||S7zLWy0pc2HHhLhHQXU9o#eqOL5MTtlmj?p@H6XBm zNja`L5W%I#4>WUm+mJ!P>kDKUfKt6KK)m_zfUcUufG`C_0^n(g2O2QE2_Vyu1_)eW zTQ#77hy{cOAj;p?`3VT_H?aroG%2t~{hI(b$^IQ65l;pRIEDgGA z14sGaXI1%pvFNuLmlbBOEtAO;4*dpmm?sdZ~>dtSAqql?-XlyDi8a2+)9 z2f;USG#|bfPD8U8__1!)$grctx&)p{$63{|M`*lgNTZh~mtqWX)_) z1*{b!#TXT7D0g|pC9R6lfC(Q+(yAQoBjwFPTNvUvH#w!ahvG-dx*mpkT z&B>`y8;1$oCjQF3WJ{Dup+%GZW-`u6v?Q+v)BR>F&Pm|rgTugBEgI(}GcfBPb0N0K zI0I&bV=f358G`K4Ig|b6Z^;KNV?rKg`^7*Q!y?0n9l92hY)Na8@x%@l3QRr_8xv|} zg9-&FADD~@MH}y1Z=urbkL!1%7?|LB{Lnu~u5D)AblrB499S1_FwOQ3ChnX^h)Bi=&CAfV-skTc?gt$ zRASo8IpLlj5AZjl&3s^HSEgI@tbp|8uy6g5a>e?^&@epT?%>O>x+@G}MkvL0p>^JWz5LEl_i;b)Xk^Pbpa$htmzW4^P-ho6xk zki{^g5dQvcF7Vq89sGC(VTFO@-P6ujJ*#dQI7U z<$Zo>y?W{Fe|kl~c=fs2$2lAazFPkpy77$T4VAmu&zw#T5OaLNZEr?se`tKseBP$y z?tdB!Cud{yr$Toj!xZzT0r18U~wLuGrne) zH2&g|Fb{cNV>*ew!ncX@_ zg756&x~DGaW>E+-G9h{FLc$+nyFz#)nKz<+qdb%^ zN%ysH6!Au-04?pn5z@TuZ*!nh5yhEwwl<*(?g8RI;y4qEr6kmM-2-2itnm{~0)WiZ z;CqfS%BIghbtHjq5&eMb>8mDDW>O#@Me5t0p!lsVM4&*8SCF`8-3JG}3mWAdDe^$Wz{h&xkM~e8~6n zM5hD!7z6YaN}>|~_cwnQ-C3^lXVsOUH@4ywPWAX zRR2r=&z=6}{$HAK4qY*b%O<2iOrTz3mLg~++d4+>Y>MlvsvsAdg&IILMWiY4%Wq{Q zKv_4_TP+JvYs~Xzh<-CD0|vS*cPpX~Z-($UL;sveX~4_Nrqs0u{^+Jr_4E1}*|E?W z+1cp}Z$Rr{+VCcD#_n7`PkSEk1m3f2jph>!h(4Na-@G~A(6zW)tG#YSnA}W&8QM(9 zj_G9Xr3ldbDe=i({n1+9a5Ltahf)m?edPWTq|CqBLdwBbtzxsI_ zsmAy+e_vlTD7wDIUU+D^1NYVYg*P=QV=ZPBhT2Yo`=FB||CU7l5``CftPV~HqD%_L zW_o-Ob;K0Cu=3wve{M75H`4hIK%5T%Fb+6%)C2>FJn%J7?s^!(o&eAdVEAE#<2Mvy zj(xx={{a9O0MrA<(JvEP3EBYo0MMsZGF<^c0uTlO3^XhNno+&MrK2YAYe$U&&{%E{ zXbv=u9RL6<5c@U<7TDef;=mZ&4`3WXFR*9?6hfT{EX)HeNCrRz04#uy0I&eC13&^m z4{Qtxun`;poB=csX+dKu_dgkFP#7_P?$8bOtw($)!G5q|zn;h5EzKX&(iqYjjj2rd zWK{mSqeQwxH_W#l`N4+!S_AERo@lqUen{&irqbqjrq|}bHNs$iFsnP_0e?5-*>Q3=z?MJW+FSe2}_Jpu3-yP+jwUFRi z9Haw(sx*X{uVj)v%RhplnAj7&vV74Lf4C_A2!#hj39u)2Wci|G`IG@2HZ$FQzF)jC z7x@4!M%h;u%;PX>T~*qIX>9NK8vrd>?cnr^JM)Iptft5DKJfm#-p_PE3!0cn?e+uN z`?A`SSa^YZ+M2%|jLUm&tPMf;^MxD@2cY|VNxZx!8*OmVeMk~-B~U>K-JfUCIgZMt zArn=G-h2HVoOB=)9T)P?=)dpvjBM_Z@^@%RGTsJ$BI(G`5+7;CF zT=$R^ec@jl6b*U0Ke+UIcDYaU`Jg+|JQ&mA(^jr^1%GF)Kg#_~R=IaK)cOu@gS6`M zJn%g*J4M&75;Sf`y124v8?^U~Zlri!3x9SYzMgd7&0PH*aQ^wF8Rwy}LV0J!XbZnH z)94x2|H}S(+h`a672EK6)bk4AYTKwgA^?~5g}d!uBB{x6u+NPEXOTFmX@%X1w7c(? zhNhzNrCxndC*im$G`~mkSWu4Sgm^*u0RHZ1ZA&Db*f(PWO=M6l$LUwT_>-=`qsi!G z%Ej78akt%w1@G^ACvpzug-!J-P4yZ33*PYM^~B}#kqh2<<+midwivpl@5}4)%j+@9 zZ-sPAam#PvbZtd-Phd1r?6sNOLg#zrfgy6fN30Cbu-oR31~By6{K3>jsWhwqx-k50hC}_8sM8_svbDyk=;JM~< zt%?SxRHAdUiKbN?v$9vFRb-}A9CNZa#3kIavNxn9+IM2d4QHSG6kTFd_bnY#jGC{0W}kl+JdmgCdvJ}@bB&W*rHD>*1!P+*Vl5(7d(Co}#Ya8v#iQvH%k;sav{4qZ zUzo$(4~HAvmg&Vq>CG%+w_IYs2!|Wemg&1gY1*kM|IfUSSUdk{BRvjT*xg{(sSD7v zTKnc;T@#Z80?)C*2vY{8$1pAO3Z$Ps!iwMhzZaQ>;kL+k_c65WV!E1!kftsDfuVID z+Ui4xQ#vI;RXWXD3nP_i!Vzq1#u4-d#t-Lx=n%nbi5;cWDIkOj$T-33-Y})p2&K~y zrPF97l0YS)59yu+0#{#Mw?DgXV;%N=nhul6#zDAx-X<7_M!eG{?U;itM;AQ~)C>`I z`&{}dP#|lbJ^qa%-zW_rELqa2V*;@^l6xa5fDm)gt=u9D-Y6R&HrilK88)}R8}KCh zs??kd4|tMaL3pxZ?rEZ4Xj|~fNU4tN#_fXmvE>f!z?t%OpXt`F`OHoU^#nW#^_h3U z@R=I6l#&;T#w&fF^IqD1Eo>ew=eg6;7?KjDDeFN;d=y7%NF-$kOFFlXn?Zaw-qejYMtL|Yv0JLPj@R8>f?e;j_Z7> z`Vry(8McaI-pTwR;bYkC0^+}r`M;_UeajU`C&6|8|4nM@b7&#D6$O}DXBTYK>S@zBP<;}|R=3)VAdlcRb zcyG0-Z)FldSrTw`d>+aNYR7=1gJM^8(EcCi#csrxjrUAYmM_U3)q23kG#ok~S`IQ6i(o((FMFa(*zb)^f0xIN5%jY?Bg#;z7ssdN>{F zC)-@upa~}X%!6Zs_?#C)V{K4&sOC+v)8LuV$oZD4J8g800GYXeHW@wwzCkb5(BjxI%Q1S~}T>Lxbma&-OJIW6@p&G-<-vd`P{pQ9`Nh86C{AxGQv zo@XxOrF7}DD1FT!{Ra4EJ7(u)f!!M2-J07WbK;m$7BQC9PLAI|iqw2+ zktkHKs6n<>aZTX?F<8?e+pf4~^MJ@qX%J0mkV$EIp&INtxk98}A+&5CMZ=ID=oN+( zlVUOlf}c@ocGr_)QrSO>Mj$=#D-8LteQY!q--tl+BB$9sVE@=?D((-9bM3D%gaBkr z#Qm{wuH}zF>$ULfmwg>GZD?M1TY&6_9ei%CQgc3eH!fghadJ$PaAb@#B|Gj zlwtFUIq`90qcWql?El7ToA-GQ^tid-a`3aKktX3N9Rh<2p=hgyYR+lt+w9wZG)Te+(X=pY^}D< z*Nk8KyBTDrcQ8Rc5L52_XJn4@h{061IYBw zJy8~HB(mLhL~?9XjD%{bNVkP^Y;(tBg#fc(9NTOop}Z>6b-9sz-#NAwe-6x*vb^A(zKcn*Pv~Wv>=z%nR1e##IBAO(7=(R|;f$;3D%Q{;hT&`;CB8xcL5? zWO%cpgc8?@<6-m0G)IIIhc1G);Y-}uopM>c(Y z<9J~{w~>rAfjw9t#j2G4e`x#apg0=nNfIo$yNBTJ4nc!^u;3ot-QC?a5Hz?2clQun zg1aql3+!+B>gwvQ>i)f|>DRCO$xNz}K<&=XUVW}M+ZELvAHiH?uaC7RSe|N%Io;He zN^4C^L|A0MGORW;9czja3;{~n0K%;aw6}DmG=MS}P|5`?pqm?zxxkVx0Db^o0lWhs z4*21YOq6H`I#Q^+I#Q&)z^Wu`0#EEkb|-XTy(MsVHlWc2Xbc7*-U0yNVPNQOFdi7p z>uHK11}=*j7$zQVia{nR@u3$FFAo^|V?oVkeFX2>C4NYYN)7$s-!Ik>bfE^9kZAoL~6?kf%QvR}# z&7hP#Ms%s8X;#^dN!k}aqZSY;#Za^4$lX5%^`~Y5S(cd#)4YC9x3lz0%O>|ju~)PYc06u%n3oktU%w9d7<2LmkF_n z?|!DK&uv#en%NVHJQEBV7m9oMQkPrm5I*euI%C80*`seq7=r)%8k1j;`$@^XJ+QBa zH1xI3hDTamkosx3F87m^H}YkEpBs1Gz)O+8;Oa7jN$4RthfYX0=sQj1wn3jEhKAS7 zJjl2Le80U6E8iFDw=AhB07=(d3xnEf^Mu}Ndjy!y;>`|+p|bcKl*Bx#^ zTI4&*xH8E26q~RE?o>VoPx?c~nIrK8cP5Z>RQ4?99td3hq<(^8w4Y;^pJVu*V_w3W zcQf($c9c$IXqE~5%`BdCb1xSmuQ6&Y9z$zLIWxN!E>|2+z;T0GcETOC*kvc$apy`j zX>HKV_LhtTiJ?BYE%ah#ktqcz?|7V@;0^)qB~T8=y*8wAL<+w{H_QI8glv>8z2wm_ zDY5iWJNape)&>ifDAl&m=x3b*GDJ_~_f|KVb*%!Ujr{M(;Mio_lAfV-+ijzrVQz%l zON(rYC79aDIrenH#>L;xEw{O)ON<1{;g)R`p~~n0WWfZ+^ultRH9d`%pe2(3~!AE6Fj6J+Eu5y)lsKOv7aL? zXmQB37o_CB2b(8c4mzqihTLfC?;cSu&3>sbjW<>z8_yFy?)G~+^0m!MSTEg}&hxw0 zw#^cKco-G5D7wgD%RPuu&*Lz^$Vm+2qa<;bg4>UgpCDkKAmGru`mv7Gk`=zjCAeF? zN6{P_zUB&K!wK#0#O)Zu)?)FUc#KB=twG>;40hqLmQbkciR3Z!F6FTFFXWEhgTY`s z2mcL}a}f~Sef}_ge4cN3Io?fxE#5^yr7&7cG3465edM}*>3Z69I=^3#Jl^y3l>gZ~ z4(5@_X8i!HhF0j^8^>+iwTM-4{_a9_PEkZ|QAVyQ>dt^?4A#N(VorvesKA=vJAsMg zhJKQl{MWl^!56W+o9Lxk79%&Usngos?%(21uxAbju%`**XRPhhsIF_M0#Et7Q_(r5 zI0Bbzd=G{yIIZMk&pbUdZP zdzj(ha{0M1gW8zo4?(*hK6!LV9wm&sne`DCW5yFHR2g(~Y-&@z^4ejU^~4nwty+4M z{l`|q8k#s-dQ1+ZosccI*1S~+X`Vc2Z}dhuPu~5?)JueV7M?XzIAYWVk9sy7$YO5C zDYd#e4PUNk7g*wrUama+1=f5q1azlQ9iSWf75eD9S0#D6v!7y>+V1}s@_B@h{PeqC zj%?&wnDOai55CB5c;tck8th)C{(2-foEloRM(6I4;?mtWNVgtz$E9TY(mcXccoc-> z?nXika6qphZ!C>5W<~*LVIRDYBFhjTCEcPG?}%KGkz3an?WX&dguVL|<;+Uaqc!xEJpJ4Xt#oYOT5x zwH^Q|(!a2ioYj%8A1oryT`c`zHXaWVx1k05%Vf73k$<872t>Y*l5TD3OGo-fUC;d2 zdz!D-22-u%;B(=8-ztHr+M1n)SEX+7M>d4 zzdfXh#(Ub|YkY`9$=<&NG7IV)nT1T|y^{5w+hd3=UrU0&y`Gd#cW=&u+CRhG z4+iXP0lPpDKd;}xq#6GE*BnCf5XRa( znoJpgG3y9BFnOoXi_7{a`=y8Z!7rhircM|}0Kp9{{n9vZ8h)vB*}#f+=T?vmBVj9g zc+8_eMF|0Ui0)mK+Iw*a*`C$xmwdrN@8VkP?MYQo;J_0nD6P+Z`ofLw)a}}j?ljA@ zAKPvEDvs_nZ-+?@Bs$O*elKsd*q2>$QR?lvi0uaUSOpsT?PyPRjChdUSbFSuPw)Df z(ew78PNjO>ZEJ}T+VPBd5ZzdMnLoI(^xJWsqW0M#PZ7l2rbXO-efYSPt+!xZi*)%L z>x5z{wC~(?DK_|@(Nd^qgMbgT+m6v9YC8h24|-fbJO)6K{qR_h4~CeiWD;8!qMWE? z1DhAUro_S#gImG8#KIXt{qUE(J_!N+@R1kKxflL?I0tAYThF4HQ)HiZo<$L-$mE9~ zgVl3HG6JvRzw`PhoHJpaEMB0Q^_&wene|l@xiK&KBDH6(Pl$E}>!tBrCxVR9Q8sb| z^iWUz0{$^By?kibU3!6OU#=BEXcv6A_Y2b#KJ^RKdw1#=s#n0{+)lcLgUs!7Hu>lejq>-qW0p8M^E6wf&T$ zMB=eM*9(=yf6-SS9LVd+`k@qfhl9U%Yc7za6qT6Qm3(LJU2l1CFR$xo$790}iX7?+C1cEk)f1&iJkr6%)8fdPNd>U=7eMJyafyox`62 zoWC4sgDyq=3v2`aVC(<^SE~z{0M!GEs1()7;n)yYkz^M*lT8l)2(ZE@ho82mJXj1M z;Jn5F_3{P#hoc#;{XjNHe@gUTg&p;+{=tq*Ha6mmPkE0KH0xi4ekvjxaf^n@{``ew zMnJ0Uij2YL1`YT3Q}~D5*8;Jh5Z;1$5qZmdG8UI7C3MAyaHP@~N{MX$qQjefS~##0 zrpe1sq1hKC!RzOro&^^OSDqWvq8luQo_UXwoTU~uySPC@!#8o*173ta>OFcR7sLZ! zUYi^2X- zMe6=I9hmsO;NOlHgdLv_onMIiA-y42oOi2kz@K?_wC{WTM~J7*mjTG)dN%xux*uc* zoa0Tcdyvy1pd5|ZNIewZXCVf0cMIVyjDZBp(XEdWc5>o{+lL4nNfg*)kJnN@r z%KlUJLDST~yUv5UPJfYhkimxky0@=gKEJj8iT1SD0{u}tcN3mySVbWVPZN)5-`9Vd zTuo@AMw(a#k8`UCQCfspmGK8dmS2Mg_j+4kbdZxE_Rlpn>WShW24>sfyzM`1bAm1% z_VYRSHh=r7i}?OYJ9{Z_uV!OzkSfx2y`)5f;G+iI@i8~Hq_<#rzlMe zd3c=<&N}D&c-a+PW}w8nW5!ZO4zWq>=t=D0AABeNAvi#$nZhLk6HAsE?g9NyL+d-A zo%pzr#Q3MeJ-@$|$fWRy zq(_NSaYZ%uk)mDcoTPUWqoo?M@A14-@LLYO*^!#^SCr*m`EJ+s_8)HByp|a zGv-iP%SjSGp9R2>bkwnS2B+p-a7ZF-vdm&}H*7;PQC`PCK=wi)h*u#MBUsfAD_E#1 z#*o&&_;~g@NMBUv zmVk_kE!rBng+DrklWblI^zCg#EMDhccy)0oo@8L{9q_5V%ftE_b0C2Oq*NY?>g>~z z^rOy&L4q{&p$8J79*QYb&V|T%SX8??Wy-vyMx>uZGNV3RlYgAxL{`g)GeYEWnCs1< z5Sb=GyvQjq7PKhiohG2~bq-7NoKlv_ijpdD}ybIIc{y~v@UI6&4m_4+H7 zeV-(MpD2&k!Yt>zG0%G&u$NUG>8Y?d&{1NY55W;4B!6BWt4h4pLu2Xd#!=s`)&_xzf1h*ZO4bf_$@r8T7&11m+jJ1 zJQ0)b2R`s1%My#@ifgq4!g9q&aFB^}2JBuXD{L7E!;)Jslso!dFlKJ(z zH*~|2`B%C(KQcSckfkx|#%a%u)hOV3pQlwBA8a2FP5^{!t<=mbZNowwIfI>r{W6JZiJ>)u+X6?rgXq>+V_24{nCw zR55lJr0%)fnLP%7(|+C6Nb7D%-LnT|I3Pn84hb8j+(oTjcp9aYf))-*Eo09mpXYod z^4rLY#e@P>3-pnT#X5OqL%k4E5N}NZB+=p=ivo-d09`h;El#z-?uU9A5+GTDHW;8C z8{qF1Q?EWo2FV(6F24njY^a*^(srs7G)AwCn+umyzRlQ-RcXyFZnA_LoWdbmA0Ey< zsI%W!ddPW>_$Uz=NNlbs=wyxQw7t`5!_a9%(0TgUctd4*G+tSptu1F@#N?aWbi=jq zm#MP&o3>nYU0TSLUONG~eOLVbd)vQjau zTTaVDQZog43y5nB7u(S539q#=oV78vwK1->F}JlbsDMEb^srm2YXqB2^{_oxX~z+eiYmysS17N#!yuvh@U{wj zz9CVARAnxXcC55^QN=pXE!oXi=gT-7^K=pY+aWmgRf%_KuRP9CTe5GR_v`x-9%XE7 zuWTXM1r<^+Xd(hvs;D*$Ng>*ICkhA|JH_*tvZqA!wLD0ObVQX)JdM3wWJVkLwPX@Y zXq2b$e6cTjzZ}=RC9zNu#r0f-?E6Il=*RsZwp;x#xhn-_n zOtl!6CL=N4DKTz(g^iX}nsM4#+Vbsd$Q%(3E`<;+vbV69yl_y44>sGQmMDhmm;d8v z#-(u04wU%L5xJr*aYlT$& z=j7S-YyImUZcaZ#XN)^0r0+)0TzkW;?O3esN``LveW$|W^v`^yeFhHn&r|?8(m!*R z_R;X+2oIKD@Z=!+kC$J3R}7s7$|R+I8_x94(4~DMPV~=M06Ek9q^WHg@Zty$mtWN6 zAVP-9FF*kGmS5xp1Z>#wF$9OB*+8;@XSiuxkXLPqRtLg=hemT^!rb|tgKsblJfI;5 z|G?3BEe>mkh?mW7I?_>?Y=+;#cr7vBlE=w-EfQ;IDhGdKAo6k&puR{)JjIxHz>kf$ zYz8P7Ylk!k|9*Gifm^unc6*?Ohi1t4A;L|7Z01SFwYE4G)sBK>O_smq->uw=aC6%4 ze@?W{nXNVB6TW%~;q01X7`HA)OdZpV?>x7;IrAH94JepQ4?y!pxL$gyNS$`&q3fT@ zL-ph5#A@(#4sS(~I$t}KMI{c=JW&G#;l=WT$)|f04$#vMl+zAa87!Wb9rno`_t72q zYq`13C~fsujG|qqc&ePczUN+JRXY0x<>zQ+aNIL=j$cTCwt;86?V&Qf_S;^FC_ebh zKlsb8@5x;;=kuTGQ8RQtM@X=MnBeMgd8XOi#q=qwQetWgcCl5iP*j}4I-cWq_ojKz z_DX5@SY@~Nw91E`d*2RAOfRX_DTI9#qq6oX4Pyusn+rmEuHYKL!WjD z?>{cKptTOY95|!gpqKs#=YqfJ3v|DdbmzeJgY=tBumo*-;NVA(wc5}-*rpM&ILR_4(Ak zAE(`M%BQl4C`%Yo`dXIf(aP$xY&M*#^7n*mA!j(!l^ss%&X>}T|A@AzPchq?v3ZPW zPS*cg_Qj>lb(%Sh6CoV0*B|!B6&#U~en`RKAHWM;4xqewT4Ea_<^ z(VSE{W0MPyaqhy|Tm_GJOib+gLJ1(YPkid+J3Ad_pPfD%nZichUfb*9^Oo=tx z7n7A^%P=?Etn%Dg^H$j}4SKPKeAU%6^wnE4zpCkGtg1t2j;otyvShj}Up@)xU`chx zR@L;BA<*L&+7BQ}v)#MH?j)>{VaJF&*)!mW@9L|tqK*oc8WJaY>-O?~a<2(;ls>OO z9HMAtzyW$*w1M)i5l~r_A`RaqJlBco8pdA4UTmEEUhh8B^oNVxmEQ|*vCXS!Dxotv zZRRy>@Mx`ikeD!ALZsx`Kr{U#Y(wTRA~Ro&?b!NecFbV)UGML(JY!EbmfPZgBu*0E z`KHBIOi@)?%InOiTjSU&63)yW5$$P@edf?itdyKIo#dy~ZYE$vx0PIKrarAH{+#?J za9^hsdeVji0Yp6fifv@zA?B2@vnw{2gu69$i?G%z94W9k*y8LP1=3Bw$URZ*a`w#v z(#zZvCm;<2>E`bVEaG?;7z#eWhHTGGAF}dAqb3{tF>*pBq3(7HAGKdIx)N~Dck z_6MW^Ab9}UPeKjR@wDX-;>%L%IRD&nUPKb_Hm@ippzYy1wtGvLyjY6q;Y&|J$ETaI zik9ik(Pd;u6H94_N4SG-)kml8SY%3-kVHjE#Sodo7?HvVyEY^Nxz2`iaUcqQiM}?3 zUl>pd~3=g)rG=$gy+xvrGDu9t+ zzzEP+GZp+|4ah7&;-cMk$H0RP-Ynp%_yLO<=ok)uIRPXbASux9><5BhoPl$g@GXhV zeagc!h|OuCa@y7yiTp-M(*?)pNMr}!!o9&S-_6tvtvh@MwdgGHnY04VTUy+G8C!#6TzoFo0KA`GlFK}_($;zJ*GH)Qs7@TYFQ<1S|Ky%Bf4-orLVk7HDjJ$ zTn|R}t^iN~C;(u3Fanuf^skR^g?BaqaNPs|@GZc%0HXkm0&pzAtw7%p0BQgXfK~u} z%|0~mnjo?}?qC4nWOu&<$nNw}L{4oH0KftO@=j`&6dWZzQgO^X-lW=4UR1_D$4vxc z_`Kbn9%Ert!NK7`Dj#C4vEjhdN8Z|)cu%JREoc6q4ehD_W%5 zvaE|(9AaHi7Nr-RVqHi8a*lO@UXNA4><0K$&k zF4%R&4Mh9WZ)A!m@hg^B#D8~Ni$;;wT4zevn0_vNzbT<^S5R=Hv8-?Zs*=CWTsVH6 zD!k_!s+4K-lp+?2db`RxEm!K01tS;dhwY|S4JzSY&YIk+<7 zODAh@eczEaK3viI?8K!hilJp!d}TbTiDxKIH20eUu-4kBeMhvb%(lFfTz+R$-}k!Wvm|fo zQ}=dGtS6aY{{8G*#h(txD1T^X6!ho)ni*!_JO1{OnMaj*PAcCG2)Dv$_VjHj>OP=E zu(xa($nNx7x~ZQqF1J2hZt-4jg}8~|I9JKt4EPHv9I++uJ3B&Wh;fq9nnGQsJK~dn z;%WA(Ync!4tn#b0MY&keAX{j{?MU-RqL~!p{eC_u<4mTQ1$O-FldY5mU$w?(Xo6~h z<*tb7-ZeiY*}X{prMoGkA3K>tO@2yVhBcfHVV|{wm4#HZL?0f9gseLN=U`&4f_lw> ziGc~;*77mal25MjS+;yJKgH|i*yXrMnV=e#u5Z43KUcOO+xgb`+t8~46QAB}(2Ql83-l9vTysvMf#y{yC%E zp`9bK2Nv~?yq?pt8(T=;i8p^G3pU2%zzZLZ7Niby3eF@R&utaxT$#rkPa z!o;?)E-x*AUHT+VfBMlvPALe1}h5;J7E+L%`QaeUOl2<bR90fPs9i_p>P3cxKsy&@2|3bddOt>W)c_KkQK{E~T{|NmY&C%1Xu))-f z>|JZR6iw1ET#0{Y((e#}hYa2gGD4!U$;&B0qfuNF&B2%H@+N*fPn-gu@5yddc{tJI z$$Hl+twg*26>e2%3pj-%Z>JcsgQ>5IPIAqrDLrz>ip7c?@*Z_pqS)}Qx$XiJn5BVZ z3wxGO)(M-PopZp{1iUFf`{Q6nRfn@e#=r?Bo1 z^qjJzhRh9K>x{v!lz$@8i=-VOKo%#&L&e!!KCZkGHK;TPp;5!vaS9^>`V#Axm{)P> zj+U!2;;RfkmfxlpgQqWU$u&uXL!ZKI^EyjdsH%k&biJj%rFE%(OMZ*0j8mr}ZE$d>Qn$=J|q5vsuNi5v#P{4PSNn#r+k2=H-Efjq%8p;!ql|L{K6=+-E{DgC_%TYLUI?3#fyD2wg?FJq;><(fglMD}3kC~Y(v6aC z*&N?k-uBq5w6m3ON9~RMN2^Sp?pI`qNM~7D0;*Jtxaaiv!bLhms$Ekm)3TIAjSlhCx0gJ$U@=LW#jz z27bgDY43e*?s*n6eAQ?5C(G#0kC*Pgu}PE zKKH|)%IJ3->Ik0BpnTvzQtVPB99@+8DX&xp32nLH+3pjGK!V6t6K3uH+Ip{v!qZ~) zDX=08UYDywL-_Uk4pkf`Sv&@rQUc9$kl+@=fzX!KydQ3V>C*J}AQ3amx`XFs*myLL zu71bX)%u`rc8_j*b}M&cs~eg@p91?!;8yws$NMBtDYj9;pS&5G?B|V22y4N z)2W^4iASHr)&LfEvi<0ZFApEDRk}ueVgPv%JrN32B3Rh-H=`$L9zQy>0i%O>nR37= z9gt4qWsUasEA?K53Kblnzy+A|z~o#HU|<0T6JR{c zueJ~axh;^p0^M`KIu$g)@C6JMz~GcHh@AQ0OC`npBpWky$iSBMqh_GxJz%Kaq~dE9 z0s;{b9Dtad(KK%SY!KcYRaXBiNg1-4L;(*R+DiBcZc*PHf!}&O7*s-u?pJJ9s&?qgU__ z&Kb!wIDDCiQQ0$i7$D|d6jBrW+KA3xtW%UcmjR-SFiRHuh`XyW%M7!xzvr!ND&~t5 z!>k6Xu*40EVzU+^DOmqXO@E_73k*!mYgQzE4^631`yUC}=L*8WNqMdFH!SgUd|l8^ zt!mJqIH~Mg(9W%Dfcs{l@TIar=$nP`Hw*aRQzy&(tM#t>!wcX4`B<$v7+FWcHtlLf z;l>c0OV*8@TbQKb;hy7|?+hR|I2uce?F>YP3`Kf|R+-sa^(rTjTo#Z|eoz_L_!AZ1 zS~RG>y|ZLRJgnd2XoC`GV(l2F7tV3&CERbf$#E(L&^E_ubS?h99Ds2E=2|ge8~|Sd zaB0POBQXwj;^6MA!$muGqeeU0hYz;6_ZY9)zoE}~O~8olTn`wt1KOE@b~K=!hee&v zFKnQFi+mjg{?d*&!o6R#g9z2H=imtKQSb#Lzcl{B^NE&|*8`c5SP&Hj)ejj3H7@`T zUL+7eD1cx9;c)QXfY%)YAP7Jh9K4cPaB%65-d_7R6!iAa{@L6luynW(0N_pf%=YAy zKO+3WN(APX8^#qXi2s8qiLq#Be~{O`Pksda7aW#2dST+P&%D229MtLH+={T_1yp6V z=CwK>aE24L_{$w*=6J{Ts5Hj)STq)WzcP-qOBH37k4?&dwM)}sl`7Ki!%sAqjHC2# z(|9e9rDc~k%{}HdUMu5``(z~i`7a9ZYt!&03)yftD(|Z+Oihv<0DjT(WPb7TWIOhF zO1jye)}zfeWCuHHULK^J?8zMO2tFS8s1$a*s1)O~U>>_hM|hOT_}GYeg+{YF^OY22ljtPyszNpLlp&*%akEvog#t;G0>e;@WG9tlo&~qwD}A z^~NH9;K1i0zG!`2=^7jhn%3ASdpEGN)KquDI7|MP#v%hzFNQ>?@R)bOAHW46FCY5+ z%4V0k%Le?)-h<=iPpi=SVhgyJ;;B!E(eHK;z>y&@9;J2uGLfCfd=D5{-Y3ou{rh|# zr^0=&etoa+`uzBfAOXOF%CP3O-}O^H!eb|Oyku~B6wOo^#eHNNH){GC9nEs?@VEt^Lziz}co${>p-ps{77 z6p*B}X(YlW#JCgZ{iT@SXgijGKGp`4x4KeF zr@8i@r@8Fc+v(`nnHsM<;vW$6;X;2#Dad4`Bt$Fc)kA4UB<+WYBK^~_>C;Xp;3d6g zd{#+#_2}OA{LRKUm5V*!O%0z0dhpywWtov*&`fb(S_z4=1MSVg}WkJ z{Oor?I6|fi{g`Y`?ho|XR|h`#b0zpY7G8fZ3w+Q8um&JW8T!)G6eZ-4KjjDC+Vp06IwaO(uEf;)qh!P05N~y?B*ng{XS`#1W-fx0FnnBC7hp z{-%O>bTF{@V>Mv5NW5(kfI#vV^xlHdTkw4g&~HKfEl|FN>JWOFvbqp@xw6O*RVtUz zkiVbi)WuW~^yms)5cH@DGD5OsXrWJPKBdqV;9`y?{h7xcOH-CZ*pn_x4f!Qq))ewf z_K*U4h4ua?(C2xVjlLJ>&^U|C#DC@sq!jTrDBVAVU99!YZhbzkT7OFhn0@a+j z*rIeH7Avb~^LxDb~6+^)~W}Bjz?D`Awq5l|A8 zyF%b(%YsATWXgVqz{wp-A)rJ)xEjzPprk5WAfP1wQNSc*F36^G2@kPL{PO|9HStew zV!-(ceL*5-Qfxqh3T9GOK*0>=F>?VMW|ELYK^^8XU4bKJn}XO5)tsD|yG&Vg2(@%s ze8_p)pEH=F6$ykpSdVxZ@VlH(y{}N9)J>>>dl?7v9xxT}hfPxiR5)JAAaN*Rbh;97 z*!vv%ULz>7lud_#*-swuJx7?t?;OHlKrp-KcS}LQvUeK=^cJ&m#`@oKt$E@VUrp`_}zshf-u4b6#_HdLp@CX`xZXT zzrJ!%T_1akp$t+tXQ2$D58LbsdYCYEQ5`CtSp=aSvSIRJAKG9vq1J$J=z}^>*t~|? zNZ6DOu$Ohf>B+^^MR7=nF@S3M7Gw?8Mb+B`buaBe($k5li{_9I!vnR((i;o4k+w-4 z0RQRXV^1)q55gt|LKpG{34$HmLp6-SQQj8@eU9!%umbVK|O znEp*Fd^na~Ru6=*UZAQUWOVWWF2xMD9(N~HyhgViLtr#t@^^nhjH{nS2ERh6bZ-sD zzCucYdQ8RZcNsIvf<22hqIg$lB^C1H-4(mhNOO8R(wk;NULO4V1^?>IOz+LS4WZc3U%(6V z@m~Inzk20JbMGa5zWe)NN73#JkgSgk=dNWxI&I|FaTuI~Io$Tfef@{deOf`&9t>~B z-R_&Q{$?ztv)sQB)RPq#v+jcPHTrlH-ZcF6UYE#@a@X3uMMv_R0os3?*!ph;%iD_e z>2&ZbvNoSR4G_9T@#~$|^?{Jb0!R?~TcCX_sJseq`rH z#7Nli4xy#)P7a}E?!HG<5%U9Kebn{?;T0A=E8>2n?N$qsPTYVG`7jDnr*L`nO^A{4 zD@CB#b#FsAdd#JeknpoWRFUBPa~?x`DuP|%zPH6 z8Q8l5cc3@zxfi3m?z*R0dVMtVq#s-FSwHvQv2MhT8bU&)C5EATILrrmokit4ltCb7np zjViImqzzlK#;>s2olBR1QlU3>zGnSyKR0^(Z|3a9&b?k zHiiYuqO4Y8jGp?%I-C7{1#_oPe9AYqW<%cjkreLoZ)`bMI_&Z3mnX%3Cb_&0@xxLthzDa@XNRtPtDz!_iOQH(wrW?;ykB^(y<+K z=`lKS##0)xqH7oJdqJeAk3vl@Cqzp~F{w|Gi*7SLnSBUGN2m1cI_W&vYDV(1YvukI zBld%nSwYXDG%ljg?OXC0NKhsZJ{L0l4gM*OR{LEQ4qC)m^mACyb=1c;-Ij$E6>YgG z>G>dnqm>^qjJ7UPZP%cR`(IX>h2M;sX733jHdK|zv72QHCEXdAtcopkeql1rN2F!x z*h$$|nMo;>T4#dgWrd@7dfcdGy|nO#qw}KfW4fw5rVm%myDYGq0~_@<{(9*?IPv@x zPFx6(9-pT-=bTwF*DZD(vot>9;=)_E+VA@|sq0bUF>R?w%E00tU9rw_u9>t7-rnt+ z+O-o=vLj2d?tH}Rv>oZp8nKnx)feB@m)qUPXkC0=-0iCRbrjVV$)&du7nD_fXi+?} zKgB|sPka0s+x4%N`C1{@*x{~=!hOKsu_uN~WX-WI9))G(02??Rx+8n>(JBcU_rhK7 z`uf$;F+1m#F;x0JR%wdx+!A8AZ*^p*!7osKe&j|XA-fLnqec<4PQ0e;XG&2UXGnd1 z(i8?Y98c}!5&tf3?RytNfi)XQ2Hj|qMjL+Ep}zJ%X-@?L3Tr{+QGH$Fw20t!QI(~8 zWm3+q!g8Z`cB`qf0lm2>{STfF1($ zd0(rld{3+DTC8(%?NmRexJ?mzR1tet5&P8MbjB__`;fNXQ>f=G%S5(cqQfi;X5k-^ z(7mg;W40LW`DVeeOQV-yv=cHPEy$*T&IP{IW@va15?UZ0>9+7m)s!g_Aq`fnTEq~1 z({oIwPBZdJ5nVWGe@8_JSBK^nbX?%jP6=91J*tu3g3+3__&9N)8S_kifKQLfE;KIh z88m9e0^9(|6|n~8!pJrN%^KP#|Ff>5AW?h} zCqBr9d!4|hgJaplqV96ae8)E;)*Y1yq|3eTY147N?15K%Iku9(98!rwAU3jso@-!c zOUno-$&iGm0#(2Qo?>ijTNZ;}&#kWUL7Rx41}LWDi7kZDf1t1y#|Z`6WZ&A%fHvB% zK!+^Wwsr-oV*N}njWm4zClcN5Cn}TFZ{u3V-&b8MZF{^+ST=|@h?m2B9uc!)Xg~c( z@l&8LCi@2Sy!3H%826pX?+*{2(E<6*A0A$mW&NRKk67S}Z}7rZpX8*AE6c!+lp0A; zx)HDlJ-%9q?^;kPajtf_=)|SD@{6q8?GAyZ_O!BCaD*)@wDyrjXOOvZ_PPQCK)Pu7VZ;_LlwrF(*|1O23iwU zyYTchO>La@k}tO(Q>N#KkfCiSSpSre?>SSQ&i9EhWL>pJozHt2WLkBkWmr9gW?I?Q zsorG826c&IcgkR&m8hGL6%)4SDsl-cm-u|c`qwFf>>87C?ngAY<;pA37m(PT*E8k=J3kUqt--GL^@7k-DK)~HRj7AV7 zBM6ZZ1kVVPJ-bBq)fkfY9_&PY=Uutf?P_$&fe!O)|pXj7MRk=Z*;8k(URo1x16DHroo4(?03e39TQBLEu!!~p1}J)gf$ zlM&zb&fQUlbpW65gJRnyHy)vgqX0P|d#0O=7y+3hvS+@@2t2X4@Gkxp#&7~9v3Q&l zGM{;4jF<|0oA zz9&G3F@0Q%IURUMgU^9JPbXf~i+KW`eiBL*y3g<9c zNtzhLJ=3$Y0;#Hbr&C*k{=x`PGES7nr!L$V_dQuz}^rzi*bncwZE8_ zb2-F%^404{k?>rTsAzxj1MW>u7-3$Wsu{=Lr)$~5WBS5hp$qg4O$)*ep|dFI`SeXE z0-r|E+dYv|hB3J$n)@(2FHc)>Uiw3*q#uS2gDN z`l*3K#R*I0Z)jtMz;{i&(xwyVVq!myk%Bt9@CJ=j+XZKfyN{>dSa-fMsL(Q~zPV}r zc(SMdDux>a1FtzaU;~?4GTFDgCBLBG{X_s`D4IZuF~J5np(+i025Z1uqMAgf!&rCj z7`cSL&-8<0~SlC=N} z`@X@DiNS%S(g-RgYaEVr>ty!)S#wk7<~6cO&Smyl({cIhS6auBE&2Hul^KfgQgub) zoFa#-s@@c9#2g=dkZAuxAl=p{qQDyJV}0`Dg~a3y2}Qr$S;bePuVX}a<*ND<(Dx>! zEo9d{FB$OX!-5X}q@^8aEl(>E6*aBqV?;v%DXefsA#CJSG4JS%kfjl>15zA(K96A( zbquL6q}xapn%Yq_cZ%t*h|z&iWj&jD^RN6W2!(M_U*r2rpLqh@&wAT^E~=qD7BM>7 z6FnCr+cI>9)@P%;{-?4~q7NhDDZWcqa^iPa`@E~A@)en=~@xWzH&S&+Z zCvL2()*D#*DEZ zK}N>;MuWoU!JVQ@NPS(vU0-pvEPFt;JZ^qVez2~M=6TxI;iMBWZrErla_MD_^y_x+!!e*}8i-h)i$aX*W~q+)6echg;6)|D1=4 z(}3pFxinOO7&`ljx6rpJqv)2!k$;62{Y4$5&V;I(?wHV)6Rd8Fs_I%PSYh1XKtIs% zYoLK}rM_}yC99HfYTBN+Vs5t$QGwLh%1Maf)z$W*M(Kfv{MlJ1IXj8^fWKgn_kThi~H4 zgOo!+!`OV7enilW%QWxmy=h)O9J`XX^`5pbQ63jfUK4p<)5pwas?265{r!U!cKaU* zkIHKMC{+(UwY}XWTmH~n8-b?lnWpQ#-!mar#{Qq;fZy=C5^=mqzwd~mtg6XJtzjj7 zyvJAFB~8T3*T=G=+as`|0>HFK&?Ys;F*hV@OG#waj^3mfxpKZzrQO;1s{N1Yzt7tk zstS+?uDnC|+Xj5(rkk!|P*?IdFS4C&OC}R{Sh$t(fA>arNyv#5n*B)2=2ExLk?8He9(T;UpE97KrL9nh=t*p_T4vD9Z&_bjItL?=u0 z;$2xHS!ztGdvvP%L}F5MzO{o!;#YOmzq+EM(#q^(MMbc*bb$2I4J?sVj5QkwT?4mv0s z0pkM>-n!Ib*Hvq_-~0c4iD-|56PSRgEtqR zH@DxDFX_=6{ruH>`94fz_M|Rn)|5AQ6yxvxtB?<{ei{E1#^1PfjK6!CL|57dpt^t` zL(nY)(AEYxXLFp>ezv(Jn_ae+06lBa?zJCpyF$F)-1L72eH`-fufkv+?foiMY#S0L z&=V)r5+_{K_^nze#~Lm+oKA&!WtG=QfkJ$EpzC?e)<*>xr?|?gdHO-fcvy@A~p2OsN+9ld6Ja6KufClhyuJ@NU9iMOR8w_CA{z>y_iLQ z>P31o&mP$>9P$kYd8d%MxNb7CW6q{NXBhahqf4*0WNqZtDzu)qyy%|L8j}#EJCxM8 zG2&P*ozfbkT)nm6;5#p>xEX^{PQjZ?Y>Yxu9oMS7h+pR8Ufa`>$dIQ>s)znf%Vhd< z29Q7|QgOj(NI-Nk881T}FEhbGhthi&%+7Zke4-Ein+NVUt#F-otiiKPKNN#E#vwEC zT{}*IB{9e%uiCHC4TVgpKP5=bOqa_S*42KlQ@1F3S^}Kv){#OGx!~P20@qF@@NytA z&w(RCb{r+EbE+|?6>`o?#CTQ0TpE*>c(f&2!e~AE^`R5rJY!l=4QhhXl|&;L@r_k` zS*F$Pq0~HBVDiBI2m)owM1LR>Y-A3sjXP8ao;U0ZfE@~m917~$=-;Jm99@lJD6%w# zQ`B@U^x}fG;|Fd6 z3EHyk;9LgGnF(7U2wFH*q0Thq*WoF;gDS2HPR?FcxlFb!Cue!sC8t(dpS9@|<;#`? zA8Xl6%MErQe(6GeUy+2?NtYFQ@LAxF`tnO!=n-ijEU|uJ5EY~m7NijsOxHE5 z8(7sgRCkY@1kri(txlW-*?9B0XU{@xOuMk|y~baFNIV%zJRzkY6f%yEuHq7$9QqMa zd`EG-`UNI^Q*gfOTQ32=IsLeh{c+l$^P2Db9nLv=6fYS7nTO? z#A4C2zCQH4chxa8UrO&uFvHN!qnM1psOTA;|BxQAU|e$8KmnukWD+!)gKNL046gH} z0-naZ)MqO1k~P4?Y7c$?XNYP_8K#tR)|4Z}gML&QOWwwp`k!(3B93IFML=3I$No95tf9pamLKA8wNrm;tPoDF`Dt zT?!DapfpLIhueLzI;7o>@Rp+KWdOC6yo#n>(i_rW@K4CcP~YG;0e+!YVSXW>e1d%6 zxi|$sTzFwndk$E*p*=^N@4qaZ!-z%lxw2S9WWN|~a zywae{;N8wn;vLqd@cMZ51$EQCZ&v?DwgP=YTPfG={QcCLcKUQ1?0W^ZBHMTOVb2sT|WOA`3*LbfM|g) z>{$8~21=AfWGM|Hfanh+;47hOIzG8ajH z1@fDm&=ToGcW{ODY1q|qPRxyC+oAbxVs41E9&p+RuFl>4MWT9xwB9hi2W#gc#wuB@ zVOm$}In#L?eq+u#6AqwAIA_WuHsx{f=I41E_I zIfgGDImR}863n&#c*xE_5jFfs`ZbVFbqHG#omnEM<_0OJE z$jMigwSO9q{%KSd{ikOIF>S7A{MSS&{*vfwhZ9eih~>y{RQje1OOuhs@o4h|tl8zi z=KMv?(>aBYV>xN4lX_Vy%$Z@7t!COZjFy4WEr0${GoBS0^k-o`Uzb06%tXIO{R!nU zAMqh%RiF9IX?OF&4g=fMkm?;U&Tz#msv{ur+aF)8h@C&$-;~3PgB3*XWn^wP3$#XdOO!_a`4UsRhKFQXcFmt# zCgaYH#!eDK@@vkjqh`ItAZ*E;Zw{idUpN|f+!}Wf8h7S`vG`w@xE#Rn-XQSazlzt7 zHRYbv3OsQXyMr7bbdw9O?fJwpq_Fvw=Uy-@K5$sRK(W7BEkAHse1Wlh!D5z6x%XzR zEjFcDu1K&E5M!>9V<56hnXHequZK#(H^o@cJ-bjQfD?dq>>zGLX#B(0fO)3icMVwXA9RsrJ$uo?i=fA&WAVTS`$DI$Q7 z)cu$M=o7>M0n{e|b!vbpA!&f#vFd~K66)Wp{sH~@UR?xX@}#YaFm}PN`p-u8pG^gz zEwcu&!C3@!nVti6F}?W%`e$`btwE8cg_ z0pdH0bORCV&+iEK5kay$iwisp&_YOdIb;2M0a^^n?lms(_b%iMg?L{t2guhn(hWhZ z|2Hv+7>h_>I1Ccwz8F|EDG`VmPq;r41F^wS7$oK`35Xa-xPO8XK=uKG3=k8MJ_$*H zAR;j)20~&&X+CZq8>&A+6rB(x<`B5JO?*vkF~66Y;`iH_g?eWG&fiv3nY~RLuqvuy zs5(JfnwAui@8X2gfnx2g*gYmSlIRx;4oM9MWU;f0Oty+lx@p-y$!kqsTxa!gQWY1G zR^=68QCiw6Ap?^YS0x7nqB`QqA5zI5g2^Ak$sc~P*<&>4gQm#ZM$V#{aQo+yUhSpW_r~n~=_&Rx_3%F`C zIjU;K*gfYCWi?fVSQUvX2na1f_-Z7O8mck~acUv#l%n$}jrSB1wykB(qwtD55mmBk zRXG)_T;=gIPkT->)pF>H8$=TSFwB4!a#hPbYUqlp>^`JSzT+&J0_v!;3L%vx!iowG zSyhkX=^<1$C%m$b?WW(bb4ixPLnSmECyoV0Y>G;8)+I=5GQ6cWC4s+9++vj-BPqwJ zlRdzGC-cNFz=L!E{}%T$!G9g&;j%xTPhgJ2;k-W``Ymog!(+SuSIq`c98Vpjb}2B< zWLn>lLp0P72e}nhz-}k}`sprSLEKpqa7YAZ=XN90C=0ET@hP1_dSW)Irt6};`U zf$cMkojCDhU)P&~9w=iiQThtx)THS#Ys=k0Nf>)6-R(Ztz9_eij-0rSqa62%oj5gB zw+l*0YtQta-vDeOZash4n~58?O* z(Rfe13I9DQb~`e07c{Z;4{luMuRC*SqFtp4@WEZbLFX9KTE5h-H;K}2&y2r(WD8;r zxyYDc4L^dah~m!_#+)%txU#D6;h#cCRx!56d+bTy2Nb=bacs6rMQXt1*8?e51m9MK z-#p@dx!HDcR^OY=uhV9?YeBtwV{d$ste$m?V&M2G0JHj&`^qio&3XuIq%n`bz9*M0 z?6@esb~5drYS=sDa&Y0}cEjLi_u+QGcl8byj6$OGiq)Mm1&YQY(RxPT6pTu+(=b?j zzB-nmFqk1Sm?iaQ%759m+<(#Q{$}2+7{ekDM0-x>6n2YWAC#J`W^3Y+YT^-VqAkeU zqnf}%=gejvlHpz(58+%{5|NZYpB8d#*-woYp9Cil;Hg@K--M9dL69`gb~S*Oegkg7 z(<{YukGC<$-hi)NgrC~wF(N-fYHSPaKW_p>Z~!-kS7$uFqti6lehqL$nqr832>f~o z{dx%a+Jyf+n|xc0o37^1+yG*04Y0NiTHXBN)W8&+6q8?uDiWHngoqU@C3pz00!>V! zKozdhnMcgaprbgYDdwmn=ctn}>XhTgI;DB?E8)J&G;edsjQ!x>1f0xF-E%;oy%Mce ztR_;FIueVT05i=DiGYK^Q3r^V50;Y;gp&`NlW)Y)JL?EAzg1iK(F@q*tz_!K{ym>P zY4A^IAuPE3=m3QgA<6>{$^%VGw|WKgI)y8NB`jd$PR;Dz}EmRfJmzMDjuo>OB8K1B$@0u1* zk@r|QYMUZ;`+z?pJ5p6!gu$?^Noa~|W=&OAp~yQ^!6%rhwZ6iL>%eO?ow%xK+>}gJ z0Ynby?QGCX3Zbv6AR6yan1_N)ia^_(@a9a4pNpX*Ng@YS1-DJ9x%WZKbSF*sst?o^ z4%Z3o782|~5a48K-s7C&to|Mzg) zb5n)o(*7ZQ>38(UN`(qi0=R?Yq&iam3XB?`T76SBDiP3_iUX+T*DbYxOkQKNhTc`X^Xt_w*Lpy=^?$lq`*psMeYoN+ z*_D!N`*!AB+NHGx@6>qB@8sCMZ;YqiY&<6S>Mq=EJU!{&A^Udr+_mCp`@U0b?7-^{ z*s-^r+A-99UM2%h7dinr5)GDnzV5eXHaoI}O+r18` z>I14S^E-NgD>DV0DO2~N_0g=QSN92UVXwo!8!3Qu9ew$Ix6o9B=T&|qC`f~Xp#lLx zLIQ<}a%e934iZ#@0s%oo009vI0Rh=Lnlo6t{W7;^u(LO{1r*{k!WO2+R!;QB)`m__ zF)Eiz8)B%uQT!&seaZ1ZWC+1BM&y*TSmqEU7O;hITcOieLz8Ec>5Z5`h&&EmK;jbB zPhaFqv!NDen!fL)&YV5fQ-ic+l%}h$x;xFUdCi}tYQMiO5r7&gE!*<(qJ$(FH_Ndo)Y0#5xGr2on z$f<+>3j^zO*G4|Ey|fMECx+6Zx6`_=l(|V&;=f-a9bZ^v7-sz zm0BbCD3a>c;m5B7g*M06F=SRtFZ#jaNNu}6zj7FcXAY^4#xj%sYOox_(i%w~d6pTj z^^qJ#)CG)ETD*+(wKBr-DE3DNsG3IoSZ1``rIHDqce0B#yh&dB`_xl+idfrqQimxf zhxB;Rff}}^Q?HP~mhGLmauMmZ>&dX$;6^C1{Mh87RY>ZyQB9Bf)BNNVvXfBNPw!MH zoO(XyJ9F8Y>wY`ROrj~)HT5dmCdbLHiA~MrP7tC3oqI9l)_FC!ysJIMtD~*i_}$rE z+hx3Xbw8EtugK~8?@cftOhResbQlNf@w>*mZ&{%^dP(wa!E{#zzh>ZX%^@4u1$|Lo z#W!h%!9c_Gf=&~xwbdB)@DCX|1o{Q-Pbq(25QJUfyJ&RCG)5t|0L7vKuwE3g>b3IR zz=ur8lCY!)Ex1uF4r)B%;o`ZSQ;i+igBT0uD$(dc<`#)zLKb+Iftd+0r*G7t`#h-u@o5DWWu3MLN^@$nI@LcUNT7okFI+eAfw zn3jbGY?v+|V_H@v8p)1u(Wr*bc;%_Dk|ITwZqrrLi;Rke`)$Jl^@fDNNq3>4?4US^ zfSFSMfu=l^hZWgGcL1ytWFwo|Q%4IsfG zrqyJ)_=0^Lk{3fL(vluh5@z2n8ukOD6?)y1$zEg`v3=wNb`-zl+osB?7{FvqPM)(q zGafnbP0ypV4En$q2I_-g4bYC*Mq?GIww7}a+QZm)lBg_I#=`w2KhV|;PGSSA36Brt!9Q!~7`SucHk)_o zP1o(@E?W=UK!z!uQA;}Hmc(31iodRkEon?d?K8 zo7BZdLVb%QE*Doihna~;pe~|A-46$xEKAePqQuU|&tQCQv7n9pZ8hn-a5}$q+74f( zurdNlAYgM@9mh)aO2y08q3NWXMTYo^$>l(0L{q0W3TuXi{#~OwN?PJ_*FBm7)=9XRVQsOpw<-rZiZ&(*54O>y ze^;*_LH}#@K{WfuHtNPnx5+t1J;(W@L7vp*S2~uGnF4nIglieYHw2uGbg3GwZ=O4| z!h9=E1f@!ykehMf6|4t-o0vz28dDLY(Dfn9FlPm3GS*STBTQW*qGQayg@(>Bk7zec zA4rX|T75W@LJ1e;io@g8m=RdEa{8kd4) z;PQxuya+T@uVE7`n|ODO_6FVV2aw@k%0`JQoVTAg(eK97&~jZArET-sJ$f zs)O7F4jhXyMIES=sxOd#HB6Sx(e!m-ARte`ZHVi?H%t*zBNua7Qzs`wb5lWC5n)4X zYa>HrD^g*A!5UiHnmYcw$z~^R*)9qohRkxw;Zl?U%YZ%*P*Q@W1Of;`NT}Rj#8UN- z64Vvj%)agU>KMPE&W(ZuAs7Y^5JCutUWH?bNS(>`$=YvD=EnDflh$jX7W>KoYBilz z4I3l468Zfp{No-rO>)1gHW{*lE`q|KpUn;@e)RQJ8E!sI`K(O#8RMNgn#klzw ze*14o@9X>|M!R`qTG1nIlyNxkhefN(EjGlcW*5ah^PIM2cQntecCHwy;g>ehh=Ed0vEmXXCA6*9;CbWE}xpv%-Xa|30P>G)xM{@ zcGu?EfYemnN+(==a<(s0dfjS__M#6l5$8f~q@0)cL7D2C37jToP@CjyO>JQuXSKD4h)&l52S}F?v@{0ueQn-E(3|8|Y^hmpmOl zb7V)QKU@i->E)X#HiCf4ToG--j}VE?C9eqM#B=7BUCp85tIq5>6h$!i z(BVJ-&c3|~{bsmPP30q0{B5E=7v6M1*=xZNxs|i%>?PRd#-NrHV!Dak#t~=*a?~1! zuHpH&C&LtfOZl>=mtQWCB z<}tjDTW#&`8@jm$^-4?iqX%j2SN7Uex7=a5T4`aHR`m>IVs_&{{kylaMzWhj?6SQpf35r*mDj*TO< zV)YX#h_Nn#7R^`Cb^-%6J;G<$WjhYnUX?ZRFHYkI_q6H=*bNxUU6QWRd6S>H#@~GJ zAaeKo!_Ag6v?gBzMFGtE*f0KF%!kvYU94tB&$7vpJKvDPJVE`i(Igo>C}8Nw&@@=` zMX1=T0wYzwrj)R`CiTuUq+NW(bv+klUKQjy=bePkslEe2Cf~>u4LxDPoz0<+gTPGKKxYvj#m*38J`%HOPD%*^btH zaQ)B>L$uVwx@Hg%?;-%tJ~y;{a`kFTRr?nYz*V5pyaauCo^MNtDoAX{C}qSGP%1w# zl3t*YLhSjobo$uB~q^ zsbG~SMBCIXRb3J=6oV5EW%}c@&zddG{>&_G&3b>=?OQ%de-7&t_=~c1cFRNp(;Cao zY<7e9ANTaS`aId;|Ne0UG|f_z7vGQ3Ry!7{q+TkCZ*qeexA1}-=i*)bvJzQEbth8o zQ+QAwYv!h2t+bDd|g7}ELJE0eLD*67K_y9?z z#(BZg^&gR1b2pLtmYTjM>ywaiQY!Nz3yH(Zr4T%H^l*hBHB%YxQ${l-Ptb30r=olE z-uxBs!t0O*8dno}WPvUCiyDIf(b;=p?&O})>{bS~_VMO`RX#rCsT|Bz+uVR8v`U6< zM&#g?>tAy;YVu#yMWK~wlbm%yRfFM%t_ggg`YkE(p8IVJNqfphGc+>4OLh=&6;msS zoa}16Ugz*vv2C*$_HgewrC(8XHqKEed}bBRyu5?0kZK-d%x7sHN7N$v;imTS@I*mp z6@J#m!hxEqz;5^*u=wS%=TFf))&=pg1V$lu%k=FpzmY74Ah z&bMFP&cs-dd)euz(?HSX=kUdsQXfpIIaL$Uux z{3K>vYx&jGFIaH)7BV;7!5N)dA7{dBUC9(3o3QP+{RdaNWtG4vzX78`*6SB4%i*@` zZ?Qr)rxtP9^}iEE#q14JIhwKF<*^yVhGhK39lC)0O8I$b^{=;8v)`O4`v4G&{$GNalFcd+>Ak8m?7D`%!9@fT`p@Gk&?i>YGnNMB8C; z>ivhRZxOir-F7KutTOS=IPRaYVUEtL-3$sIc_i7qsBIg6r%^qf2o2o!nOJdr@X9e> zP0A8^Ibkh1SK`Ef;*N=6oTC(GU!JSvtw$8f{3J#yb0e9_RwyaoU+%`DUgeM-q{qI# zvq(PUSdVZ?M*A%q*L`MzO`x=9fwompazIj0JjyeyBCA@^X#5t8 zI{O5kHEw5^nq5l0mJpG}xI>e)UrxWS^=cK-ig2j1ytl7~hsFV4v*Lh{0oL+eDjV?B z8&=<#diJyo>lVrV(Kzw3=pG>2Pa2gQMNNl)Mke(D^y_ko0r7HrwvG?G6nm7@7Q{>D zCSwNlPrDX#3-*iwKBIGLc}Tucp2%@TR?&A~efsAUg+`S0WY1+T!Bn{5#w0 z_lYNf)(V@&&J+Rj0~ZtnPUoisWNzlz-kqU|BAw$yNUX-fbQ(EW&FL`>s5*FLb6;HX z-IhY%ua^s}oM>Wp403dTn5*vv_0|1%jzX4g!KR{M;`QzV#>^Un2 z0A%w224ss5q5kvV03d_>VK`b%^KU@bnTKS#Cg?jahuY~=dh`@zf8txk12fr1Zf^^_ z0yc3?K&RmIy}LLF05aqiI^2Fm7@9W2J*%p}&8%DAX8EC+=skkj&3CD7pnqw3(bN4t z;XFvB(hkYIe7YL;Ua=glXbu~TFki$>tl-QVZ`cw_*SBgM|33a8k#L>(>cxcPpLct= z;;!#xJ9T}OW;d>7Ux2<<-Noh6lKWfW_pSFC*;nv66YrL+c13EJBe~6@si)$B+Psv7 zcVL~Vo~)-!c}a8+y{2}AaOmr==@GICqtUxJ7o=p0@tPJrzAxND{?mFk&%f~{yztDV zr|--72^{ytFVw0rOLOca#1fREhxG=^<76yT(*1l&;yRNWt@j%#)Ezho3loCHgB+3r zDkLSkR0$f+n$UQe#f%Cr+q~9=uBZcFF>RYgeS1Y&?g4k+bD}q|ufbRLkBN~`igp^L z7M@|Y^dYP!g?0w(=)ebysa63zo(AQ2^gjJmF2_tXhfB&vsyGk~N66wFKe}6Fz0ljC z^~8NA#|QZUbn_GY7)9#MM*lrWrjf3EedK+kSKSlits`XXwWSkS1td-slnT-j z7|G)aD7`}XiGr&Jv|Cc!SfBp0S!!d1TK-~9hnH?)1jQxx( zjeNDp63)^dghf_5aT)Vs3~8i30E->LnU29Mf|jY_0^aBP+wv6VQs#Z3^{Y&778;IC z7`Y^4zWs9TAMd>Qy1ypy1J)370!dSty9Gi((^UAoPntl6r@uE3)-z%Zw?p|=O*|RN zqi7}1%CmTr9eRzmPu4gU-^|miZST8&%@y)x$dA|^NV3t{*`Pq5d00Oce-@cHgg5F8 zx_9lU%{X;v&aj4A5b-B3jHD@afKC9~@?{wVTjZFB9oN5#`b2F$Br*4~e{#*I+N z2+c~h31Z7-{`$U#l1&XYovl?rGnv#z99sCNe)Wv4vSAM-rbdd9V=rLcmIXY|TB@)d z_9eG{wnfagfQty5wY1>88J}$w6~lR#ZhwdcC(HBdd(&kL8%j0=1h8Ux_;%*JvGPc= zO+g0K9}C4FTEl-Qb3;tpbm}j7ugq;CF-=Y|qw^`aNmxIJT#IOe%)xkTuRr6{K3H?gSI6MLSR9K ztI9JmK(qQWQHI$TV+l74ps`=>hJ6EEA%3%nW$;*KhFg81#4e(G1^xEdez;6AJ7s|} zfT(bJEBj0_-hHo!t%L3Z&$m5IJp5pB&Z(-1!iBT9lo&~3?aV@vOjf$Ai{pfdL-bpy z=7x^d1z=^}Ws96K=S!Vaqb;6@%6rf?Sgv2#gT|!S8`r;L$u|BF3I>Chut_F;vmi6U?N8ck)t9mJB-+s$ly*mpxv9v&M@`(S11l<#~*bme3CHw zL0>&d^jbaekfu%QL3rUfg4vW84rhh3aFFikCs^kHt*%awO;~x-dOo6ogSyUdciLkP;Ao%m_m~B#vTluhjH_=RbATs9gwuGqO5gQpmRG{m z&*5r_s0q8ABZJTBXHlMU7vyVlu9?XuqrMtv9{E_xbC?`49}yKFtF= ze16Ko#Y%62J*Dr`WsBdmYq7WdnAzhoI0aFL5iS-8nF`{N{Z26EgxH#`Tc@cEz*Es~ zPJM?%L+}d$KpA)FB~HQ$0LsjXfp=1opzK2cP$pG@*&zmivZRX8^^$``H3@oSwU})e zmKXq(H3lE;{Hw+M6w|Vm1z5`j;GaI-|K4K$lgPB~P{c8Ljd5zbt&#I=)=3Wss@K|V zTbhW#LGp(T>`e+Qh!UtDO)sjZi_UeMI&Cw*`(ZwS^{5!2s#WG!zDg?gr_9bV!-I{b zop_yQp0i(hzD|1izd-7Oy?*qtFhz<2GW2QzK{5vreE^YVCjDE83@t`udAb!qWPgt{ z0?t8(rFKV^UTrB2mb{kP`F>bU0f|)w@vGn z?ujK_w4t4O$gaJ4h!UzpwRrrhl3Rx8wq1lHm?#-dVSdab>!!n^=9R}7UFYpZtL*#c zQ}C@CL_7xpKN7Eh&<0BmO{r1zG9fuGBO;)u5Fq-5$x)v^cL3>xBR{Fi?p^#?)Mr79Jv=*I)(93%Wt-_9_vW&d zRY$u?ejqpcRl!7qJ431P7Of9jy3f1$4ZM{4PC>VCH1u8wmZKNY|jh_>(q?4tTaRpDm8{;@O_DG7gmv{A5Hatr-Eya(pp{|Sy!y@T)_xCL4z{lj8W4xq}QJg)fisNXpj#lvGQqwUbz|kh_6|_OzyTvkt z%ITiervMLt(C-pIgr#IVRw?ndXD(de%k@mwP3YLdxo2N9AEHRVT=%`F%eUK>=nSuo z`)Isldd!z{-!${`gnF#3G(Mwg&iRCBQG~ z|M!0RA0!r|vf+p$ipX2JF>yzZzL)AnO5so2CuNNS((YfVVH83OGwGT#7K9~f?2)xp zW7Ujoy8TLEqz9{dGoZ~Exj&_4I(|fIR@q{=xaiYSYOeSBezF6UI+s2Gj;hoa<&{Be z;o^{CLKVVb?+2~F9}rQ?@~xE=mcg@N6(`HXbQ=?42PYEcIxbN1_jN1q{$6i|>H*;` z-~tVIX?;yGL}|QaR2cNE1~ziQ!J0k(E7n39w6VSY{&_f3FRX`I^=M)}Zzb_7)Pl1~ zr^3@_&l*bK(#IqkytBfNkRNGfBaL3O{Y|Fj$Cm2abyUqC39W+90kcpOuOiIw6Y7+9 zI<=$8K7U0+fju`Y#{A9v=RhbWPHn$Y+s1QHb_L${;vWBl8&s7X!(kyPQy6xK$ssp%YZV!9yZlJi5#PzR^KFeX z!=-@?au-?OzK(#+Z(hyVP0V*KEBThSg-UZrxfgxz#x`oN9KSj&%F(`%oQo9Gy3Mnf zsiE;P)ng7qDFv{)qBwAo<2nvGEhWg~soz*zi&n}<`M zd)e&r3iM22T9p>iCkyS_fPjmQt9gqVGr6bJGcBF;rU&uVhX~Uh<+pfE*gZ5KDiEyg zhwLmL+nSRT&n&NNlqw_)!RU|L)B62Pv_fyF>%<;$o1D$LWns+T1o0a_OX8-ZTi|k+ zu2=+z-#Vl1Tf-4h|XZ(=&l$m4sk8uJblF1W5{f;b$lmp^4_MbFR%sJyO3R}H4bq|QtXtX#-TlG zO(qtVzfl`L%-`ESwQgsustIC-<3{%>B#6V>6&o|GE57gv0>CpY?-@ul=Y?fhGwS0< zgfk$i-jjZ@tfifaDL)%`IDnnIVKNM&%*9C5gA-=G4Tp*Hi=lB*s@mH)! zORIi77(YU4&6m&luNNzkHCf4o@u$uq7h7C|N!uJbS_Z4}%uU$uoKmnAGcD6Q9ZioW z1HAPmA@>`o&t9w0(>^lmucSZ{Uz;d?|2o4p?*_d0+oH+R^aM<9h}t|&Cp>$X%sqHd zok0SS1LVTEBmG-f;~x*(^Btz2Fzb!vR)+PHtiP<^{|lE$ex(Xu0LD)MFphZt?KsLP zd)ONP`xv^&_e%{5pk}EX7g#noLkuV3tNtN&SB560OePd6&S7^b*WR~XEsD%NlDwHi zxG5ZxMCExk*qO>?w=>}Hw6V_ltRt*z%=bUUl@aA;uH$*mg6Y$P{gZZ+C%t~;tM zkrR_`?(oZmfw4fi5CxIq!!QwBp`nS1@9qM^!^2;IM1~-Ui5Wg~ofcVa8monG&7V7; zy`Qu0yT5kadhSi*di-X6fPM|t!(TY=IzsSW_MypH_oaliLFYQ`i+C?bY_)YDuIxHt z*SI*o-T&~gwcnR+n~%`hOoq8gCo9in_5Mwe)=S85n?T$8t8LmpzOy$l^Kc69?oky^ z5|p!TGNN|RmZH3N@{AYz3EQN5G{Wmvmg2Ric#jY6nOiZ+&dOb2(2a$sY_Ag=f8mA~ z4#DcBhvf_jF7B7R%-{ib&fEF+In{jGnwxKHfESY@n0(2P5K9Eu_Wv3{F+FKrLOku$BY~cFB>>mh4A? zZKYM-irw&mS?!WRs1V@&b8g>M12|UJ?d5Iol0It_tp_ORo=Dw}7DhBgc`ZF|Ea{X8 zBXY^iSr6SY)^Q6pGq2_n4@#^+V^CAfoWi-3cgorOay78$xzLxc@up_w`(sti~)N2{ELv_jcV zbj2L!jT^)^DrKaUhb@ia4`GneQU#dbd)w61P@!Ju5P|vlG-}*tM3d1|xmoUMQ(-<4 z2~>@|6$_TIo&JS8VuHKzdNld=mQk=n9h{0f$GY(`#e_NQgk2zSi0YjSOjLA3T!WF| zC>!8S?itCMHfPZZ{zebwMQZSyhv z={5INU10q^+R0#r9ydVPf?>*tn0B^{5!e&hjBL(e`i%s!T(4sA)ZWG*%0Sf{6~&?#Dv07$x-VE@_c~EGG4$N61P-?iMy-|=y_i{%4O>t7Dl=L zs3gZ)fZwS*j1QL#flb%o$I31JHVP$o`@CC4CCQAlW3z%|;jF5%=H)tSM0=G+ z^tD1!Yg$wa*Y;>{y2@jMMBvFn^jr1Nv4p(05imu_ZhT>sPQs{Dag?`W9!%Jrvm#{{ z2%OZoCo_6UQA!P$ItQ}eACgZe7x4ioEA4?LJKGcMfnn@F%yTyFQ#Y<@-6REsWq(8y z=3JNrv3*QJ=dCh9vY$rk*%r%$ag7S-$@h45Wm2nBu&Th;%r2W;OwtS_T1z;F@)xR& zbd$r&J2#rX zbf-%5DsEGFkV87`BRF}eXmme_r`lbrt3Xhey)w7x&UI~Y*4KG`w@qziU2Nt1mge^D z9^ZI?OU%8J*mqrF`@Cw-;4fXK2i0V$E93n_E4GOcbr8^SW!c&+n<%s&o4Oruz5RwD%7#Uev-=rTjQ# z^}xwIY#qJ4%!_F6Nqwx6n5MhjUb2*iK8v9-6_}3){$=`?Z-VAt_p}RM?x|XzBY_&U zLxXSv&nTasdZ<9=v2f8!!zVzO&N+(){Ahfj@_b$jaE=IzjQKo?uFEtl}4IoZ))EV z0`RTt2Oy5_?`{55$-ay&7Z4I_+OeQxGSko!sSvg%?CloTe)`-kmH1an6b&`b!S4eJ z)qAdL;dOn7d(&q@%E{p@nj6;JNN8>rkvLoyf>r&|_bPZ=sm%#1$O-wM4QS5@pU9L{ z_ch}ajAYV(Jd7&|Sni$!?VQid;he*L*IE z_1Qd+$s4)zJ3b4(_87wA(Pl9s9^gbYDZ2I;vtfVVwpAU*nQO%-nzu&Fnzd1w44^cVH-n?7RSV;iF#73y-IPv$JsU#F4gDDFl^jc;;{uc0 zQ)d&qpbBpf%Cn8OBrUvu+0AxDx6o#Fb1G zil9`0X`IV0@KTCSou+gpN&EKa{*nKRz8y2LrD4JWp{U}Euw;mc@_`l-#4(i45ia?9 zq7wr(Vp4-WLRg|gI&Obz`v-HFO?aGfP=y|^1xNXLT)hLQc!VX>uH!H>|HZ6gSkuv= zrTa87%IVMkW@M2Ahk3{YgZiu653{>&e?&SFBUVwu5tFcUI!E5!)o@GELsVZ3tB z9-KOKI*TKI6bb_rkW*pqw|aaiF>~$%C*b+D@f3N&aNX6w%C-Z~UmZx=4$ORk8xAGV zqtwJ)F(Y;J?k~op?+LBFmsa~Y?*k;*Uu_X@5t#+>|{U*V8 zxzoAr0B(xQ(KSnc*OCtowxdzU6rNS0q_Q8Yq6CnbuB?t# zhpR&l5%si|xG5~D6ftOpQ&}S>Ac;IAZu!t|##B!?DzHZ2z&LD|8d*tf(*Ylm$*L#5 ztGB(mw|@RtJQC{oMjr$vQE_ueqnO_mBPieZPgeO1Xe$@!u@MezFu6q`^78|wmV3-i zH=0^6xOCn*=sk=B0|6K4Ik_#284Yzjrh7cx8PtJ`OXc9lMI@XH>B!4|yP{KlleCVt zb8YHO1huA^3OPsvAcuf#@oNdIUf$xZ+=ZEswPB|^>0>{%++y$4Th0Db^oFSbQxtm~ z@k)sr6$RDGc(Vv|&J^HUlx=p%>r4)4J0>u@#um@xBX<$_3=zH1d0+HmqQWSJ zHV*R_5uKNvL0MFzP|5*oCSa#wktvL%=eP~h(u+8yb^T(nGp&>EvMokUm5X5}8W?Gq z7-K-Jq)lq(de~v)HY=Skyo0xlq8S1%$lhs-*%-0XrorKuFvEI5J4-#0Kb-Z0nt^UJ zsCjUBW2O^v8stG%3l6SfEeFK8UXg8;41*5l<%>5|quC^Qxt!|`rF#^Z z(`;)(uv#_^^&EDH6st|G9KFFl(gFdyxWIwBy7C26}X&;bP{shQK)WzFf5oSS4mBm+~m_)D7f>j)G!GvhilRLmCL+{(qKYb_%89#u0 zRZ35))LRyR;#Fb!-BTi=S zea>2Yua$txZnHYDuakErp~$M_9Ut6d`d&Q2_D9h3BkA$-y*f<;1|wTgHSC$8f)VD! z%_dBlwY0g(MOz#0O4oZ^72PX$T~38k>&#H81h=x&?NiU#_-{oqu5~{3sjnRW9Bs7% zZ7rwwrrY*F-uMR5(+p1z>UOh(1-Ej;T=rvSl1bi~$AzM?w=TGRrsbk&uTdu%kHf$9 zumYU2Yj^QM>P=t(Q;}hZzt}>dEtFO%<}82 z-cUshy!Y9>;N;@wv3zxxr5c{#=MC6pt32Tf8@D$WHTsrG{b-QU%4yTHcgBZu-NaO7 zKs9Ix<4CrIO_a9$A^2Ymcs*uLV@B({hJG4|TI?>fyN-Sw2z%_VAM24l+h|>v`AJaN zM?ex;6O{MNH~3{Vg1_jC9$ikKZpY*akWaLC5J&q8i$3o~%!Mi+w@p_rH zU&SKBBx9i|wtNY|xacPfnTBA+J;Yjl&bWvyE1r%&51?E$&WK^+t2u`*(YNqQIH!`8 zXTe(qz%4drX-3~|LBLTVaKrn$IBpf_GgQ(hTDr>f%O@$ruN zv0iD?|7D1Mik*DQjeH70ZUl?^#=O)ErWGug)FNeCF( z==iubN$g#{tHnK8?8x^=wu{c*bG ze0x0KdfOEmrWPKMijZHb3y4aEIkQB>lM?trmCnWWeEhD8bLSdq`A&aItHBwn3oty# zq-ndS7HIU|s6L}cKeLMU9Yz`257oDxt#jUSa^AIX{^22dCVTtOcKh$O2sFG=e0`*E zehn<>Yrf$~`)E@`{_b2(lge|(vz7kJ{p`n!-6M1c*$gzc37 z9U3f;CrpxU(eFD#*AmWVn3#|vM~EH#Su!9k7~L4u;;j*()7xZQDv53pCxP~5CXxV~ zhoH-uBMuj$%UXi%CxfP*#9m9CLun9)qGs~qHrk-KmDXrMH^3`wreNi&k#*3{C)7`g z_OqpFrTKG`c|EQn6HCe-LR>hnyLDXG;q^3DhJU#%FLQAZ=FUa;TUX1b((cj`S}Q0g zP=c3>2|1b!FrTAgL9w?n(nhyry%AtWOB(M%%k9-dIywTtCNIQA9uD!wh8Gsf!%=|O96&_KJ!d=2_-Hl#X4i|Y%`RV({5C;*_A1;^*) z&-Qgc{rV6-8jcQPYfCF)RqM)O4vNrmdd}3smbw+#>{X+JLn?!{76j7EG>c+$vr)QR z3#El#M}Bi}FUK1DT&~zgw;?AZSd(u*{C11y-~OIJwMZ}4Ci}CS(LPoZ-XgRB83;{8 z7sM)zBVOiT&}1>_Dr;>v3ULegc*}+*G{5FM6A!fk8Uo_@E-s?tO?P?du=RHA)Zw;7 zS7j457B<$-9;?sQ`zL2X`2C3Jn$eO-p)v9o_2qpg!m&g31ocM7=H{o&Hr%Tgl>Epm zC3WCD$R2#?ks~3k7LM7;*<(D)=^VVgW;Z7*^Ydx=r?OGkoDIg^?1seYspk1;(b>A2 z&DmPcq`zzt#87OR2h~rlwOgR?$5)BUDmbttgGQeE6?lV+wMgPAsRI=?t!!dOOAnxZ zyV`Mld7i$?q4AvYc-pf9N?R;gY0Kz0RbtT>N1lT4CmYVs88ymvV_x$m{`mW%$Nu%2 za+qPNv5g)1$MI`_cL9qe!gE23&+y7^4u0ovg2(BM0&h8RoVYZpQ9j)`7-PkHVJwIz zOBQS>@%Z>jz7Q85CRSt(!ig!W_0p^o zUFcxG$G{!0_egwNJjUu4V|!?5yvaDDjk+{T;&cXD{>hCA=M-0H;3Mf;T8xx+Hu;p3 zdECC&;bv2s-5-~j5TiFJu-z%D$x|`cQ}PyS_V(ZLisW>lWOeO&oB5f?+}*=*ixZSm z9M8`ZMkq~&ave!Hi5rEe%Ijl1?NFSD^CmVyk8UdFcN1;syMY>H_4O@cfcXsv)<3_f z{sbFz4Z2LtThNa4)PpV>%|}_TLk=FB#b9w(+a=+9sKqa*178Tei_s^a;ani=XL`JC`S=@fy-6|jA zD;uWyLx%dx`6U~Hx#1l7!C1#vPq%oFgh2C=w~87#{mwNILZiNR3pY|tnrp70MB`6Q zD~(`g%1w4kEmIIJ*2r7%lBjV>RR)`?UHt_X`^x3v{MwQragfs$-s))eUvDAf zoe4NXtLOXUdOR_^tipW7=vXQ-KFU^bIq*a5{9@b6_0fPymwrl!5q$cD8TXeLOXIgH z1A|`Dzw4M6c=0$p3fMqKF{j#c)$)rQ#%%^UHlmu#os^Zd-cwlHC97u9Zsydr=M-g> z<8)nSs|Fnr@DI~YX25P^hCZj$%Kq8s2Q=dSe+H}iL^Y3Bv&*~X@GTBRky9p9W+>Ch z(YE>2LIR<8r(n)(wrqYm#VW#>&hg>;E4vv4q@y;JC!!xxc|qB&NS8$*l#<+~Xiv+t za-+N{vVU5fjjjQV^IJCn>}S{P-Jo85CAEP)D~($0d{9NHeQH; zLt8Hf0DtBVqAwxjw*kUeG}pgSr@P#^zy8VyU(;Ow1d{%K5B~fl{PpLA{1$h`5)%&K1sr$IBRHZI4-~3)PXTFl@ERaSzrpu z9Qi-st`9d9cg23_R^|O}CzFKT`F~{pD*I-$c_%QXJ1r7&cYHuH+~kNkzL4p%$cu-$ zWMd}BuI1yM$Mm(!Rk)RpI^w^x2&+^2@dLpjyBPkw@OzA{q)t8uyD(p$2_oL1uapLB36m%fQj`dM{tLQ11?HGsMnvn+^CDRhS%3?-7d&BbPlGXdcE7(a5Rv)8 zH=iSSBG$dK+x#F$Sh@`Qbo4k&-(O*P`kO%FmX{OHCEvjaTyR!uvsl8$pZz_~t1nQs4= zlqF)CDk+phsTBHUau=9lXJuKM+=&vC@0Bu5(*-QQie2Wu5kWR(R5fWjT`+Sd(jAL?IfwX zmc0{P!dT-0)G{M^qRrf#;1G+?J|ACXfc2mx%mM&{8HMl+6@cZ))j`$_>!&94^LwU=-hrC zx26%drtngB;PMQjv0!D5x*`;YD^PmZoUU{JCMEQFLDsCh4Mg*5*nW_e&dO0*|D<$r zlxt`_*R66PyC6fGHuR&*RTP=4?lbZ?)9YPDHBzw(-O0R?qS<5##AG|fTgSN$XhlrC zEPNSXrz!igB*%8TO@-PHozm(tTIv3FH2|JPsk9%7f^Y`gKhg-76YF-Z_SZEJi-uF^ zp6xZ#`#`JKzZT4%YmP}z=f8mQz#Qf3Yq~*|{9m)^CE(zV|BmwQ7i`UJA6?WvPP)%X|xQcQt zD|jI8o;Rg6S9u-bs17tPGe)6(D}FN?YkQr=_^4ezYUx5&_P?}vkyPziZcC|~SJ4|* zO54|0O*AUN4P1yhMdtIS@Ns%SU|Nk?TY!a#8A{ArpWXN{*=0FL9fmoAFv$^*@E{*b z4tZFmVCsMO8%=fj!iH7_I(2#~y_Z;OMh^Cth1_ydY2{o#;REqRN)4~KT;CRY%QEu6 zwRn=ho$;Kg4v4>u^TdD(vBX$HsG4m)yd>V|hJH_&Ecj<=27WFsnW*huiNsdkMP!l4 zXFqK+i)O@1c^I_0ex)wMs>Hxmlf^vKQlbso-!a-7Q zmrhoW|7IZh6y~GkyGweFf@+E?a1EDaib5s;o$)F;ccovSP>;{p_!}q99`s~0kPCdu z9q2K;Nny)2(kd~y9U8G}lyp(n!+?*RAw=34_F1_2sMnh$D|NQL0P$?g*Wt#G^93l& z8)=3Q>=Zv|xZRodbmp^{%N@C<`&|03cFJFJKOiiO7nt)bA3N4Z{5@Zb9_}_J+_cLr zV}~0@&KIyO?*!^$WfhW~dR6#N=X1UV6F$L=J0MS)o2laV)OYM--)=GbQ9gcDrW&fJ z4{SvnHgNgCzjuUt8hBd=M-xWgh?qOPkoGyD91MM#7>b&DrlC$ingvfWSgWuu*a zP|H1LWgjQ7M4dA}bK=6ld{j8O1%oEO$S#y~O$y8ZyX|mw=k}5QN8cb23J3`I|JYPA zG5u#-nXPL5(_x6|hXAb!C7p+1cTD`d3Ah=#tUyqksE8E_gbYc!YlsZjU~`(hu~X-P%Z=j($y0#9qD0aFMc zX~^3*D91Zso~IU{(Dvw98MR&HYJIhejG@wp6ukxfhQP$QpsX~^pKxO>Hj=3;Nvlt#KC`D!yfDZ#^ zq|6m)P~bxe?zK=t$FjT-=;9U)8kv!K?lfQL6k<%>UIXVvQ9{F*M$a?qc)58xs@A0w z&yHv`Jw*!xr#L21Ep^K4c_O*VrfI$6Ec33B$JdgRp@lJrAlqt$b!ro;G)Bj*v;o2a z6I@uK3&3pf@i>!6mDtvtrR-T_rG5f|sQnS8YADUcDHYpdzB=@folW3|0Vl82!mr#c z-^kHS;96u$w_k6W%*h9WX1f~A8IBHN&MDVQ88A(lFG<;UUQI0a2$3swdg&^-x-PZC z1o65bau|uU58fHn-XzTyI zuX2$qev~30Cg9(0)!u~k@unFVSa({cniwrH;=Pi8&T(3Fgd7BM*AKl~w`*3S;>qFN zs*o79r}R`yLUWz3t3IT1V>NLdVk|dQAH{d#<`>r+WWjs?Cp-#PfZelnkJhvD3M_k( zCaN;p)p1>zcSzzhb>6bW>9#r{h_79?{1(SoXoQ=Va-P0WY#l8VIKHMbS#9S=!EyL~ zB4Si)BX#f_U4ITmidT}HyM2k5C^1tmD+~Zm=xPDADrjjnJ9uL?oAz;7uQC-z)>(qlkXP)Xu%PeEn7hXCs?eh6&9*mxWOx-JZrv zav)#Vcy4oI`o~O?m%3IWNd88IW7I}z1#+tOG$br-67#M-(y1{o!X?R(k2JM?>;W@ zsLnrkK38PU=+f5=4BoKGPrd|DKdvrid`7{DaujpJZ(j4{MT-R1hK9=$i0vEVMIqgg z_bZ)oxNh`!7@RY_$84gR3!ehZGpRZI%6Rx0`d7Q)sPsr4mg_TCu!r8N>>C34<*I!Ws=ZT1D8`l72FI$8CN43UWgJ zUi_bt%!Wn5PmD3niX3948j*dT$xdf6x0{)Y)z|LJ9J&cH{)L2xQQ!okJO>Ke0XZ#KOL-tjj0Kf))L^cYr5IP1nPjn-R%R`KvDyR9% zKO`B^uOxE~+xI;_8=mZX?UV7;*GyWlv!$N!MLO(VTYf9R^2x9Dlbm;=6GUe&V6jZMg4_dT#e!q*ipSBiIXGYAGrEVL?PJKVy_xww4 zJwh)Ao&D%cyB?0N2Y~(>c}(IO)aVSM`E{Iz}=f z>K94zn}?bv6T)Emy$mu*)sSUj#|x;KLCMIEZ$`LuRI8QeAWy+`kLz)>Yt2Yh$+O94bUh)fk+YNp;ZHBF-Y%G>7ltu-vR5%Bo=twW&%po+$A!|SaHE2 zjVc~7A6xoX(P4`kr1s%ooNMw$Mq_inF%6Rdb6;v>l@dLVum44T1V@}%jiLVJGUoq> zcZ}sf?^v}aw2$_1`nQ-L_vaO93kb+2FFw`u9AxxRO2FX0x=ZJQ#%^=niq9%JO_-a|_DQ*9y?3#aI9aqUAG*mW8b0Nt4?DU z+l)akKdP)vbpwXkW1%9VtE|np$yb6kuJ%^U>|CA1FY3=rN886>7R%Z{? z&>`E{#;S?zY!6q?w>D-DXZBXot9T-{2e-I0uOsXBc|69TA`7>Wk5}aEt`BmzKTr>I z`Q#j9l%t@j?QU_g@!?!spWqN$L*Br{&q>GB`~Z^>@CVBcPB|S ztx;LUt+ZS1wlLvJmoo^nm-nC5dYR6B&_VgK`SuNI(QuiYl2_b8v-zs4J=|X3*)iHY zBp;lM4%GY&9;aTq%+#N)ZQ7;NFLt?$yxtac zoxzix)V1qc{gqd&oBvF-*VYQG;X%2YJ=rPPzkvo;>uUO9z-E{`EOs+3@#Eehf_;8U zaj^0tU2I<5;@<48;2ib4S`~cN^>)^-5+H#1blBJD1+V);EQ5Z{R6C8K1n+Q@;@V8Y zX=E73JUcM1Wn(qSFxlfRMD$FB9dnW2yFc4Kn1}pBGE9(q)&mlOLD-Ka#GvW)?(m!& zE;6dDMUA(d8@zBKd=9NIi=td1Mmn9q64^J%6DVX*c-!gOTWQIO(o=rx@$>hmjGNzF zzPdL2ZrSe%=vB@*kjONOI+0W3QLU3XZ0t_%L=rdU>h90B1K0QDSQ?oS7Q$~A3xGC{ zuGsm^E~iv-TtI(DeADLnd#=&uQPY4i*+R6maN!B#((!lK&^H{rr(RVw z-*Dc?v}Ec4fLlxrR^6U;L!+G6`H^0Q57+!;e=y^eOuRB9D*{cioVdJp+v6Rv>wP()2P}hJ(z>?cG_TqVa(Br7GJs= zLuId$0I3KZrBIQxoCQ7BO+NZIjQpL1XC#m6Tqf%G2n6vs=A=}4vD+xQA}9~)xUQ`6 z`|}mHwUo^7Ll1-YEV=mz-*lRs9pgA|A|B?X7Fy7TwH9|CmXZqJQxx1 zfxeO>B`-Yp+(UJX0mvDWCQFUD!Nm@f_b+zg8mk-G&|@Qr`w|UpAn!b^2Q^fk-A$4e zqv4Wp;&X~E8QBeHmH*01J@K;!?oD3Ii;JhjTD-P_fV-mx{Q;RxY>b(i?63}5!pf!u zhDJrq-mGcSb2oNbO}daHZe@Tx;zf^=O^v`3<|U}PF(YHipRvlK$zY#{55x@Q3HqUU zoQSU&rNq4QNVe-}7jZTP@Y4l%gRG{~=ZBTk1{b2+F;~#DWynw=7pNuSD~5R|uXu{c zn7iSTe%yULeP5?fLCg`d%r#l67s=<8tnJbx$Pt^!NZzAR@(zM8S1FT5HZ+YN#76^= z@zV2$mG8&bYCK$;)PkXnVH|&1dZX4W+JKNZ-JJ1*iBNYCa2+J5Wzi>6U`5A@B@R*@ z(dNnC#E=$JC*l^?o4A0%J9YqX_~={9k~+xH4<6~pI~Pb1q)8byBw^uuNDnU56&R2< z6J%lUmxlz;Cj$S;*vU5%Y%ru}GY=`j%;5jE6R+Y>t21*)(sut_lZh8U{dYDkb2*mu zP&{xkbzqcwVd2H`D_67X)t5{Q7&lY!Ff^Lyo54+!>N?42{C;SaTxSYcv6}gLJjRf~_kzDLzpHu-VlF5qT$2|)k*Q}$J@=8- z1TW^SD*H!F(GVi6@8)cb%jXY_4GaYPOFlwu9Rzqk1&!T#6bE+)^0OT7)`*w4H}d5J z(%+#V;2vC@RRBpWB;_zbM$>B>g0oc9^nqkOiMijE9PX(TnL{Q#jdVx^Citz+MSSBgfroi?9FK9 z+)c_Qyz{rJjFUKEt>4wZ`aZu*9+Ysv9sll*5rmiFJ&;G@{@F5&=McG>!ro10>)9lJ z5xkkk?j^JK;k5qZkK97^tQ5r$;I)VkCA4oGD;3$Xi=PefF-X@Fdc+ZKMZAD&q=wUWtRlG6vs1$%hcLZ~AQN%#ulU*d85%YN*(tHzeDQFT z%T7VV#Ol#Jnm%pVGjEIa@ZJv|i7s(Hcy>NH`MgwHFDzet-cCmkUb=`?u9YS4j#b=<&s765m1m@{tXH)p zU+CFG*ol}-qCY065GJEAyz2Yy2lt`c0)R^7tI{fGiZ1crKu)g=TX zrG_J7guY7qG$f8ti5qPDMY(&s%0apQdASAF2;~2;a=xL|dHE#2e+z^vOxdYs=u7DD zAC>#K!jp3N1Co0(Ru5EqoaA26Cdt-!I>6Exf?MhTwsKTS>I@UQ1?kkVZ;`tY-t0b%1A9unXYgC~!sX+lh*AoeP)P zbCuXo)46MAQqG+onqCzgzIJP57x>^TD@!aI3XmLAMB3tG;E9(kLi) zwSBjtzW?OC_vCGOvkJ857kP>!^A8?iZ?SH2xoe8+d}(?7+F>)hT6daT`rU_vIIiO~ z@zk{-+`3wWS0vRUU0lgwtWghFacl6ekWwO6Ga_V_b;KI`kS+RtAk9T7P*^vi{dZ%6 zCHr?GCCLYN%7Il0XEzvZWAP+uDXbRjaCyo!l{NZK?(k`B-*7DOzU192Y8v3zzmM`D z1sX#-79v_@BpuBDElbU!X{gx=3Mtg4SbuK=t%?b~N)fsd zRfXk@m$@`5uhPW>Z!G_`x(bDK?qAN(9cKoN$}f;8c| zslwf+=HHu_1vfiBnn_#kGab#LZsG6ZFdhuwtij|3VGN9xad)dRNp~Hz13$#UZzi;e_C}Pi3uKh9x1VD)J*XG>8)x|9!II42 zeqXvT0a8|h4NgxbURp)DzARtK5!X|cZmg!T*vK)5`R>ASqR%kl!8PrJyt~-wh+3x4 z96guS(=t*d{b~%21kzGdEhx+ja~r5IHguk%?@SDH+vGlCmUYeCYnb9tc(9{+!9`q6 zr%U#`^ne(KZd9{90#aDt)#aL=^Mtn(}(WglfS|CowGkF}-C|Z#Q zO2$0puH`CC_p;;s-4FU`oDbG&w`H|}UpUOv^J$R(s1t$JLcp&Qg4K#b>DddP63T$; z*{TID7YKTKH_w^;bDX5d%^MS?&~U5rqTUna4Prh7^7$Z(&JE?1NFJciT@T_UBa(gA zoK3*AWY^6bkEV$gTC|NQ5tCdDk0>#Ml}-Qbq>@!SQJ}rGI6$~_ruf$m`>_S@cT-Mvwlx)|p4n;$VU+rND~&sjsZ z1E#nSzPJzHxDQSVKM8`4^kacjW`?zj(Ri5;K>j=-a8#NZ*i3DMvKuUKws z)v~fVBs2;f^I~O$g^erUd%mHe_popg6+4p2*Mb4o{~E$m7|H3634TFvUazPz8hQNt zRlp&{T^t4cOjzQDD3kM0Xm)t^NeH!nIiyNgi8!RxWmO9?hGkFlOIz9|xAoND3gz-w z6;F<28}0&|y*jENL)sHMERZJQ3-aJH)>iAF*?+8i5+iKsshiu!tsfPdWlO!Zk*k}g z^Wj_CmrQB${dghoc{kbhA5b9z;4eTCF(Qx?%aI>JXQB9L&?gw;H<#0^Vm_RBTn#WZ zX^Dw=v1PjgNkGZ~Ez>Cw7rmQL|Wyt>!tX=uj9 zqof9WFIj?ri`7@740#G|fgrUa4XG+dS7)TG#Wbq4qmk3mOjWxDYig*?EfR)RW-;*O zq*{nS?H{9UB}U;r$f>qxF1dpjI;oqf+x1A-u+S%Oxo&)F?xlciF$ZWPIPeElLbgF@ z+3@s()Qp3zn*6b5W_Xfac<)lDpQYcAG{52}I0*UH!as|QLGxnCs|5ip2l%1n)dB<1 z1qDpi&T8>t0f>&PemES)pl`Aly%^Zb!^<^!n~izaC>`pDG4Shs@}PI{KsS(gYCwoU z9ykH^O-ZJguaxjziUZ42%JH8L4zbVNuQg?=p5C`jUDW~$T~Fo_-Caa$?4V{825!J+ z90t!oW(*JPGO{f_yzTEZyA1A)_7X;RITK4hQ_0Zo3OF};>{~*%ZGSf$Ae*y+gUpY` z%<(<>c{{EiW04};Fe5v9f&VAU4A5kFXa8Zd7JiDK|4)>e^*;z;w2G}dj_5Bx2oUKM za4E`PL27y%D1zAa7HDtiMtO6BB!NjrbT;guw4|Mmjrk9dABcX71al1dh{sFLSML6a z;=X3#UATX|p0Bpjy>r`VyWMZ5ZvA`S;rmD$Xut4P97LY0I2oI{y0N!sAtOD4 z&_SUL3O-VC7pe$Av+lIwZT?6m6X1=*1fkgJ!88@yh|{Y^aGh7D zwS%z5Ct0TlSDmk0>8gf&;C0f@Wjl3WYwSPWxDlPC6p08GgpXU=9U9rny;;sSAG~%^ zOb&$>z>>g%$dXZ~P7&il({FOHw@}9%Z`L^fu^InY(%fp1QW12`*5xX$+bIr&LuWzZb(&snNVmI7) zR8=ii1u5<>UXOLw4+%0@I#nsxu0-9Q!|*sOwE){7?PorokYS<0R2NYdatdK*EHRi7 zh@ru8#|FXL#d-&?hqcyM0`WFuxF-0sropL;;~=azHNfG4u(`rs6A{X*bhFkqYm*ka z7KR3VYI}ll%e_=zdE8tc#$1*O4KA*w_zlpeb9EZLx6meXE7lbs!fr*yEOjB6@AF1} zeGfqCbRyXsiEDW`v6APIqRKDJ>Yv_gOVKzyf%q7PBMOn!+7eBd77%qf_*{d0EKCd? ztA`>A-I5J!J=x|&=p_v&!mj;lLaQZf zx?DnY@i9_#`;1spatkC31MSX2UtZ)V3B09S;KJMT;+e-+FR#T_s=B`a3(MbM;D8z@haEq}ffWj^D;7%+BPYP@V-ztsqr%OaqcEvV|X`6aSzNVQA#o+(Di- zl0WfGQIG#2M=h-pY2imjhak+qWj(f}1B*G<8dlvRsdr%S$XNDQiF?n+4Q|z-;1WO0 zN#^|xY)ozH89?j7%3dR-9|f^TNj8R4L;9eMTpe%XFHtLIpUFl|A{zOIzF}TqoMayd z6`PfVX5*Wu@9qK;2WD5F!HhgY7T)+|<0 z<^v-@d0MS@u9G`SX#ZGpp-;v-G`1m@Y$~;5PM0+sS-8v0l#(@L$83>c)!^X8%FU3I zlRYgxY_C6JwU=Et^9HILgvQD(v+t#ze|~c#=1b>PRqrBKEUFosk~wNDw^?v}?)a^1 zcdTM%)Kud=I1F~_MB+Ma8tzublPtTeYAto<^a7 zQKQ~IW}3;tCSn?VT4!lV33+W~p+b*lkSt6}MRi!^60Ab>z06<&LpquOh=LAVE;!m* zN_9Gw74*w%l|&CxrRF@OrKoba460lHJBYGGa~T~Dc`DX`SSu5)Orcjq16j=y+2i(_ z>oT|z;CWoYTxFfSpJW#k_Ca9!tvme-r5VJwsc##X&q9%80h{872^k`Sm2q+D3<;1iVxM{!}yqKfhVkczaUDjF&%a zhzSKoCaRB}GatS2;8Ywznb=mrC|mPu$rK#~P$5%0e+ld*QeylIan3Y-r)YNqz~eBq1LH*ER_>ML2oEA3z8Zqgxj3vreqb35;vKGRUs*MZYSzK9}?E%5c*e%vLn z_~jfl-6~}~7ZiYzZnr?k|CKL;rj=ru?5ciF^8C&8cF;0{wXoQBaWvrB9I$k2;iOWK zElo*ps;N20_|Ce#$EC2KQj^?W4=P()x`_)N^+kab?!^wDKg8AS0F3Q_&~I|E^s9vO zZ9sibw-V5P%$|)sOL*!B_pXGF+BV3SFgh%QUO_uCgwmkauYpQT*kxVqc%Cixic{CfhQXAZm$DKl($*CO~TYtD-5p6L4AlJzXp!1&{Dg@ zT1x$$IcR5Ik|#dkY}(Sp>qwRhW&nDLf8LDI^3hXR>$0b z_egzVlyz(C74~h}-LJ7B-HZ7k`;#I;iwVa&6eTzJyE{yf6g z7AePRGVtZlI+%-U`$a{U<&`%{M)mJju&@%N7V>jl$ zMdyJS4YjfP%((ye;|wPV*Kc#bO*=gvNp3*DJo01LAxtxLryQu>+){wh!oT2XDw7*K5VJF);V@0$CjxLbamyE@95K z_0qiHJUwPcaOh%Lq9=y6t{i}#!V9B-hTR%JVPKjH=fOrOorE69GB84Jq#NX%zkjEt zE&1M}aF)<+6s;?D{Ib0vP!Mg1f%slp;)AQ`sjE%6)uO<6&dC@&&V#&C6bLasbaC5D zcmv8`u`jjw$x`o+KCHz$1UF%T8#`nN@}6i=FIWH#P#a7DVkZy+Cs3y@P;1#Ji|o8* zTRmId$-P-AAINshA&9O+YjjOz{G*&>xH$3?)1DXZB}KL-W}YnwG+Uet`*{?S-=8EK zHEMR6ZeqJ3BQi>j^UKl7_lb}(d6Eg1un*dm*>>t03@~l9Rq2kjJ75i)JyVtpmfWRM zb09Q6M-rTOi1_#rUDsWM^492Xn>>cQExf7`**&Wpml5O~ZiigA#aa*BMel)6 z-v{xS>1x`UgP;p1AvZ1(9+WRMVOn9g9tYD=PG3wL2xp~s(@D*D4co5hR}InZZQ$@_ z*+=uYr}fD_cyjnGCdC)Dx_ z6ZfM%eZ&jTuUmJseZQ%J&|%URyFJ?@7lTOq@oPA-@E&@n&uD+p|GBqPb1V@S`w<{Q z`>EpjKP*Hvgnndje+*`R9FfFqT%9fc>)gryzXf-q6(^+z6_EHA0r}0%%{|CPIHHl5 zVD1rfDNE?WAhz(^!JF6{N!G-c1z+J`AvFEL1bgD)iEE-95t&@h2a!bkO9tD zNBIUUq1Cu8(971o1{|`5weW9l>Wj@@@{KrJop!EMHM+O#P)kI=GJ7~+gE6#(#bQ8I za-kvpSFlU+hvC=YkPyCETLGDR-ZwQpNDZkqry=TK$7gHAMVVjKB9!Mfra7q;XDElTl)`EY4KOTC{z+(>Q5~f* z(A}Ayyn^=(Xj1P4I3}Yd$78ZIbIe&AQ8`YLAK*{m!U{lCi=u~`SVPiObuO3|NF`O_wrL!R~cI!(=UdWmT<%;qik8p2tETbV`T*; zu_?fU5DI-hZ7qd9J+D$AWR0*^66m|Kp$GLCI6%rf5t z&fM+EPa;N9Mdx1NQs4fjz?2_1ug(x)ioIt?t^?kj*s?2KK>ILDVog&gVwH|X7u401 zlXW`cu4C~Hptjg(2Rmo?B4=$FDX}_dutH!%h9j@dqIuA&%@U4%`d8STMV#UC-J>H~ zjoX@x`rTSkPg*-S%?9ioBl&{@SH?JX9y#y#?tSe84YPDIN291_oue{nBwT1v@i2jz}v8Mf_M+ZqY`>M7tb3Xwz-pdvq@y#OQE! z);^{nsZ@#A1&UL%leC3fqQ#PU{P_*0{ZDCF9oZ+^3T#(USus*jobOL%8VWkS4}3`Z zH?tRb#cLG$Z`%UX4Ypr9)(e%&@s!_ScsKG3T2- z6I`nNl$crQrTjSR81I-F{zCKNYH+X@c53O-L3or;Jbexlo{F>TM@RM4vFX3ODSEY) zCWxmyr;nxA5*~w(-|J{QP1%24XY+)(7mucI%Dt?KwB`s(u?qeeLK{ir+IER!TrleL z`9&Sj&IG;@(i7_tej4Tag#+UGKbgy^HH_z7`JVT87TxB^xB%m@G?Fl4TfOpyOC zh{`9dpQOs1@C${#e8+g>K4pkQ+_!+5&!-;0M*~qm>W+-G2Xp^D;0{`4@eaO+SnM;R zfH9f!F8)r6^{ZJ38RQ;BD;k*t&Y52E5gO~}Etd9C{GjyHk&j8z<3>SAT{rIc)-}pK zMl-j}u1Tw}kmOi${NDXDG&`|93hAGan1AU-*}&NMS|l|t7pB=>h3m{yG2O^z{E93gzrYot*6d+X^i?PX52N2Zwh7`b{k@YJ46S%K{dZ9?D?w^-x6d z8p8I5%BdMBjSbsn`qI2m_&>r2l#VFfUU$sB>7$vRlYV~P{y>}~YB;Vo8kibuq;R7< ztZpFw2XYjS4%ctS49|bp;0Fn#W(Q$Gbdft^CQ`+Y$Wb(jF8j`s=eT7bm$HyAI=zwe z_sg^;&pa*ZKM(lhy@(T{k^@W4h$DmKCSTQU(mGuvIRQyIo9l~4IqMffCvbj9r`%dF zBwQ0L6DID@^_;;{FW+#3DV`+Ee)L4NI)=ES+1LJe^&f03;| zjDZXx;aSt^a;)mwDwC0?*lE}k)22T;=A=zE4>u}?Y+c&i{NT=vy1CaXbw2I?=Ugk% zJ)P+O%rp1TQsDpXTq`))n_1eJ{wMn+E9y#v2>s$)jip^=eP<2wilDWE_M!pNWld32 zcR}{n63ezR-Hdjv{t^=?F3k(|6BMBCuttG+nj75WIdz!HYG=76sI>=@t4sd<3kTYU zJdWZQJs_qS+qH3lsakBY%*t!HB3Ua{tz45lPE4XQhX*DIrzw~vMRCtEwT|UdIoj-a zQ)gvrZju`*|DUqDb&^bV)p>^JQznt{SVKPT8~ko(3m(_;Vo*EFX7gWXVVBx9@*$O4 z2578pH&b7q&Ey`c4g?mi?MvwY4`Xi~RClv<3n#b-cW2}7?(XjH?k*w0-Q8V+yF+ky zcXx+CaJV~1-tRrncb`+YYNmGaCq2LEUejxJcL}WzcfT?d`uZ|SZ{Fn-=zu3C0`5S2 z0v)^D9^66-aV(EHAwhuU9VOAq?Vzu`+QoI`#m^#fVMlr;4WVF%>lmnPHW#XB2gvXl zyivXH#v+K(xWd`$xICVZ4BK11uW)(>nVCHik;=>*6YUZnq?ejzsF(e`T^}G`*%HaE zld{7gPCCl^AQc9zuRIm9DrY(Wc~;CY0!CKAvr++`70dr4L{PFfa&>mG15OY8_i+KC zn*b{BT*$(zR^=27oy!4eq(8T)g>a&P1R<8RZjdFOm6Qx1t<3skIBC20Pglu|CJAsP zo$*Xg_eoB7e1aVNE8uBqis7G;+9XaJEO#|m zjwmebQK%9t*&-pBX2-+8LGq6Wn>%c|wRjqy%Gz-?T{$+7M2(%%1k+5}23L+7asT{5 zPRxj;8Ex(pGWUC#5vdi9*<28{)H(R|5+5An?oo_szJf6R_jMID3SAqK>Z#f~ilH_@ zaFBe!zYSg~n1ovHS?iJGI7G{bo&>~7miJBshV*1oijR{05%7qC^f|oY>|RDEOkN&rmhfD1!er1l60?#=+?!j} z9CE$1T~)1vI%Om}B~cQSz=1dQnv^(`u){P(M@ZLnYU9tzwL-%+TuPN+|3YU7)h%U` z0MD)xxc>{h6Z-?Y%`DBuZ0rsHJ&IJmN3Ivx1QZe+RS*&F=CB9z-oSWQ)>tTv6cB}J z6Ple4zEo#&k*;*t&V$AK_}Mq{rqPRGFd&7UyPlc*Ws_fT>l1Ds@VLrJE0SvDmXE#E zdvbx(#+S~T-@1Qxalo#Eh6wNqH5%t@66c#x-02+pRbmMJQtv-`vh=q%L<%RTQW~Ko z`q|D7(7z zx|){3hDo|(qYzG~Zp)XlT@Dv*szHGZ3+70(lhOHnA{gb!mBz3;Yon9dp7OeH9CYrfy4_5Me^|RJs3|uf-!m-8(&Y8x+Sg z6wyD7Z#udi;ZdCtQ3N;kq;t3+Ne*TkpY$ZtrpVg$P;y3rE}tL3T7mNW14HImU095G zHpmfe&`E6@6aJm#dkrj_tXV`m#OkY+%85)AT7cyE;SSDmQIm~>?LvMu!qQ~SXI+~` zzs}W#kH5TE((k6Ip@Hv}d>}vfxA}4^d>1p-^ku1xy>w(=hJ{yfL zxTm33-235@x9wrQ-Cg}#=hrv#@7&9CNIkmnIcF9h6rbH7B}I&*r60*%hkI{+gZgu1cap z=hdv7gt?n*a`a7N;0mW5!~kEV)|pB(Z9`Y_ZfUXm0nCmiS zZI}cX`@go5;YmaEw|`VlW*R%Dgpc1cabT&cW`PaTG3m#fE^))1{^8+%Rb9m5pG{5< zTWQS3qD;fuP1Ns`Xsddau4Hejfx+GFP_5+(noayzq(WQzW$M^U+)238s!yY-hyp(b zar>y&7w$(P#)=A8VKmXr70k-RTH|L9!FB^2W&{8F-4T?4Vl3W|pw@JooME4h22@l6 zlzSO1)vFpE_1H32XLBLzT;~YtXygJNsp~kmw~HaYyb#ir-jm+_v51 zrKuubr`SX~WQW}NrugWHCi4aLjX$!x5!Q#F~zGHBvVv&1Ct9TwV*#OSnIT+#JM$X4~BF zecB=lt{*~XehG2XU&f1j@7eTt;pM)JOIBw)Vu#cAFELKOFoE2|-b_V9T)|i|ci4j$ z#d(0=Kx$=o3Z3Dc(qe9x+8NjI3S$nk266QmAqpqrl{udIhWqIoTw~^K%_Kj=@959q z^9DCD4%WVr+E)5aNqo=v9*lF`54isVx&d`FCr9)X-ZZp z*k8o;O9D|!8n+-I#y65WN<%ks`-nJ_Wj-V?PB_q!jG`J+BQF8YA*fiAPg&Ke?MF?1 zEi!EW(AkW>a+C5VS8!YwpU_djiO4aOt~}?JTuj11XVXa>$sJrnXXcFmO6>38L~acx zv@?ie5Kkc&VuvQt@-Y1DcVCTuNr;Bfc!_I#g?$tnJ^neV8WyTXZ5d;(<#`Uie6nLh z122-OtSG5PChs&{Q!_nMh=WgS2!C;yo zYGblgI#*e!5(C1K*x!WMg$jPUk0kGXZnz-rO@xBrhXCmin6bIL5XJ9aoDoBD@LQTJ zc~ck4;`FRy6fYrpkwT_7Tl55NG?b<+hV+%^%^XW^o#F3cLmtMdry>JJUDLO*2GM;i zxBCL7s%P>>TNv*7Feuc4l^^r~mOB4RQHJ`dlCC@C2E}c8kUg?+3cs9`a+tFseXlh6 zAe*q((dY@8@uE(QX=nT&jLFXRL8^nN>YrR$QlYIq%bxxc9p4v>W=Me+?gDP^zqj)L zhZ_YQ9BeF&|3P<3I@{a)FWxgtVN42C5V2x%4O2E!uLD{y5)wo3CKpOFw64a4NK?pe z?3}9~dQWCK#5aY!C*V&Ku(OAgcJ`#qAIg%t=661G8#bEy-k>5V=xRe_J78vyYaZCoAw`(LgoU zevJ*RDv8WIl#i1EL9#S^&W;Mw3l%~8MXx!AuPW7YYg6ZRH|AA@*B%$_7qh#b7In+Q z%p@C<5v5i;oXBct<+`GSvg({cUfZD@w6;wzZEk%-!)0L@;qX+gAyj?s(7-@F6tl=Q z=@1PQ9)gIVD4bQ>qYN&4NhOMDoPiY*hj~_FpSz?~H_@mVFMjNB@d{NFurXVsUFP){ zmiY&auMQ2+@+H7c|M%8cGj#%HUWNVvPUMZOOpX7I1%dFS_YXX|E{F0z4h{;Fp6Qp` zl{21ID+2_PDNt9X!|K%(HWfFVMm!Q$$>=?)Ks2c?7C;Q6g-31wpzL2TDb$>{I*$Iz51L~j=&0X55>w0 zms|^FB>osS4(eSUIGcvyal=XUbIT11oVOz(uJa zeb?Jwl7pqsqUv!fqP03OhRI+D*0Y+VK%>iI#DKf z2U^pbAgZO)(eK!7_1#{FR~2oWtT^J%G1q$*>cQdqNR0=$r)>n_mY=u@iO|uE|%psIUgoBE03Q#W8}9UKC*b3-7h(r&CRN^ zKc@O(mn!rK>a>xZ}){$bI$Ti*LT-h}rVqNJqLx$U8DqcpszW1ezT=&o)4;eb~ zODqcGE+P>e)?`0Ig~0cVbGo1q?A63Qa`4`OY05h-%lL%%q3_aj+K}S!7!bXO_p$BH z;a2qPJ0BDA_2s2J(uDBsI^&}5{=$6@`>_!}-scB=h{j<;$4UU0!u$ZifMh^)U_yTaAQli0hyx@P#umn7O3q5i z08Ri{fHZ(6UrO7A>F$I}Wjj+Tk#h(C70n8Gk zl2j6A@hb7-#6O7BWSK$=(+h)5=t7blXL%4Zg+W64!7RH}#)`oExe&@Z0FD|HL}|h> zAu0%B2$r}qxU-xl4#WGg14J3Z2q8KMC>;Ba!$;EtdEW!lgo#4JaLF7gb`{1AnL>~e zlsRM$YLfd{5HdItoiMiMC~+t~n(hV$c9ak^1X^6VgXz({ zs6Hix3*2N!j;KB-1Uy{1qZ(p4ElhG+kYr|t2E#^m$Ee0gFVyz6!{dg4^!TTW(X(r$){| z;+2lpJam8w>lP-*yZP=rP&BZ2b?|`o#>v)R(O$tT3{&IsHj*?-7uj17>Gj<--#y4R zgcz6D+n|-Gex^v{1%#yN8FEQnQZPmnOUa9umgIErWOXlH{sd){Wukrb;Mn%~%$d?I zbHeA26=8+Ps6s8pRb!^kLSqK5LLjEC=fdr7b@~`Zcj0%u#AC%t-actDA63^o2DYssqpGrAZ49`r6zP<&Bk@ z(I(SAYy(ZhF_GF*_~KZTwG37AN{yGAxt-e=Rr*Sea%n~XuXin;DGMvnbW5SG67Fn9 zMAeF7Yax}O;irX~7rmOzZApmyqKo?u(X3@>Hot$fX!9;6oqazr?31GT-c?$ew#(?6 zOZY9gsb#TNtY~XTiGs~ZSz-*Ajr+~cnX^Ogn|^pgW|UgWSaHj6R#gskPgecgCfcH6 zXU_$Jn62VjH#VQ$d1A5VI}Q0Y}(FM7VYPdj?0Tv`V?a*X{Z|tQ#_HP7F8@scb1Q5!5Z&3RtjjTx`?P@M*^o%t|z#+Ak z`h#1!bS>O;Jed2$gZsc4!LPbdOg!EI4MYu=`AEp5t(cN1sH{xCkvdKtwlBWKsAsZy z^+he_A+nb9a(;Z^?|jdRT$P=`Dde$fs%s=>Y)e}r%xmOwND=1aKSGo8*)qJkAgM&Z zK}idDDA-FsG`HSdE8?Pm*#yxzX~U4_RfuSvSx1jC8Za9B)jZRprxWeFeuG}}m_4J< zoS*#}9Y;^egD1#Sx5eR<9s6lby~^@rdb7}C3+>duQYVDoEn4$#D&L^QmZK*0_^e>9 zceX$e<5Yqe(MG96ivXbQv5;R#TQ()H=MbS*wHyjw)Kx0d0I{$Ol{JxUXu7GGf6nB-CgF)p4zmFKJ%I1F6+cIE>90q*1 z>LY#@5eF{rf$N56+ z(aQPfbdyTfAaf;bE7hsRxngOSkF;f0(A8BDj=^O)&c*|N=vhhlv+j4ruUn63iPvSD zfJ(BDh{eCno1$oDNH)dVkk-c9kkrQC#ooo=#Zds>0O~WJKuv7PYvXiey9DdpVs(W1 zLx!=*Y7;mls)``UHJ9QV6DrO|oZ=41Zel$o#U$)<7j;eW2(1$dc-(lM zcxZqp;0XW@2m+u;lEtCMp(e#j z9t|;u-R^M(lbn@IQWp8WncldET#{Ca`hD&G=Y~BIsB8F@N^9b!|9)&A=9S>;p;`uB z&Iru~)Hf;K)Or$xC$iPTN0IP0?Kg2gF7&q=97E-o;$dxpPD34-tVU`ZyXI$b_DYsI z{RVPPw0><=4j2z-P z$~XoMA`NOL1&3sfM2&_+ok7?(YR?bDI^i;Hi=soqwpkCYzcx6n{~B1OKd*nM|5yKTgP+^q zx7`FYwsW@;dWd=q1>19lrzu;Mr%8{|@1VTE#lhU6qhX?)zM@t$bS_idrGa)gdm8Rsn8&Zn4`HgzDZBoHV!jA zC@u`qsO$Hk5&c#CoQl+G*=sGtt-Fk6VGhF$dtqaEl$%9;4!ug@$(J0n39>^g;+RAZi}OM1Sd#p3K!f!)d4 z%Z+j2*_&N`UwU5)eq4#N8IJu6eexYh0PWaA+*eTD~!q zY&dn0Zw|Ri9oUI{A!k@E<`9!&1IB#AdZfMzB_)sqJG^ zZl>vDlVPU$wW6d#sOqkEvknF{zq*1LA}>+3pZIxlA8g-pm}mcF*k>PW7-T9$Aw&?~ng^o4ZJ9og#7M?x`XJB*_+cQg) zfF^*R0kQJf8QXVCn9|q-)`We#j6Q76Mq!{wVd8B-+>S|BOPw3K0XA@spE{23hx{8( z#<03axKhvBblw=92lYqZU>h-)$1zP0(tpH17eR(&}05zR;V z9h~&N+P|1O7^{cYZV@^tzwFU^g4qwJ+_>?C%Xh^z@0xp%_=4Xf3j`!WMJbW7NTTG4 zro&V!fj3Al)TopNxcxv%mb|FZ(SpZQVy}p;s8QRe%i4VxY{hdME;p383^rVWaa(~v@FeFrU|goW`kc~%v3^Us z9rqBR&i9GrR&be=z+dr+2s0taf8*BKA^epplZqf{Zr^>!<;j>sm=D2xbgLU5v|BUS zgJUfg;t11eM@JYb(>xX72&ZftM40xRm8Cn#fvw6d&CR)+(}C`t_>6}m$InXllXqJG zZtX{q1JdF^OpS2-rW@lX-^(;fPmCtW+gj;{*!gGlArlkr))TjTKzsPWuzT`E=vS6J z?PTtD_~6OQ)YQr4q2(UCl{;tW<{p=jR_;NUk|#m8B~_Xgm*$h-kSn||nwdLnX0ca= zrKNzI*@&L_j#ScJ>x3IuR|hQXAnAD)GRta}0P`|Yq5!KOmSFzsyr{48GttJu`IWfZdnK!jXWQeFFoxc}Bu-Xb0Ir2gKOM+`R(n+W^)LIs2fy8;)@l zbgAQ@h>D$zP!u~^0U4&U0!q}6Qb{oqt2#z_)&UD4S=M5A?5I_nb@{WWPn9K8>v-1B zL9N`AF3al^vR~32J?4Z<9g9O0TThVYJ?08Zp^JwUP-J5Y$kMU}WZ8Jb(v7@eSQqZb zx>2{-CsDWjm3^q?ZUldGtp|`#^yE_V70cf+ehrTimAR?SrHme;d{6E~c3?$Q~YY8{B>X9>%P)g8HFs2i>1pT(-* zg4NzMweF8B7II2dKcd=B=}XJs^MOC$Wcw$MWc$#WvE+_I(KYqknjMPKV6ww}Uxj|3 zpw!VD3H=tWIJlgqY-L*2>cVYJ4tj6&Aw_&1+Y5XL34SLIeut?#IBQ9+&OC2iC!oDn zCjrel{_@)F*R797e$CEsU4Z$hjrqt3_ga~N_o(W%O&{LfoSdNti;!9FC!dc^16;+} znKG;zvm=crdL>#fcnhmnKNjBw8h?us_ACubUW3Y93(H)SEQ06knvaPKLfb8%te26u zuoCxFB8fKAund$JR8GtcH>U0CXYfM^@pH)?>l+*oG2YQT+I9^#KHZvBPq2DzyN7k3 zjmg?WK;job@FgvpX_-f&ziBsMeuF8zKIEYE38D0n->bD6=}wlQp$PKg{j;7!QBV7n zD89(zq_SseVbGkHpU z8awI~*uIKJ@qmEH4lCHNVWP}gkl-Y5_o<3Oe|(Aao4SU47bLuX7=rdehR_QvNHo|k z!t@v!L3oAWy)GcW?s1w6A;KtlKCq%GDf^KtY)OVEmE=M(ksnc8Hb=o{_90VrhryN3 zmtSyV%$5EwwX{v{XTpz5zTza)1hT~wVVhKzCYz3yc%Ga6XBmjp1t1;GwN1Nx5m_V2 z5xb0ANxZ=Qz<-KFe$gfjlOK{a;v-Xx*rV;|Rf_R8*%{d+VHcxroFb8~T-CSI2LlSF zGP^SvuhDT$DU-DzlUHXGbgkG$GhX)Mob`pB`Iq<~zLm6oh!Y0w?G@I*C~HLRRra)Q zeRuwOXfpLSG2=FtqUbipGiu0pk*u{!3v1ClKVzp^dX@Z5$><}0;}-2Ax!SVXN4Wi9 z%g^K|@ZXq7JxBNX#kNihbD3;Q{;hdEzvLxeVoAyFne8^f6v?zbwN6)PWl^~a{{2hx z6~)vQ<x9tSvoQ5?(0ov`e=NQbDVaE`_G#9#LJ}KRs!&t@ z&*CJGJDeVs`2i=p$Hp6_EsEWk8ccMnVSzp*#MKWrV24Tmn-}v%6Z56DLTEMOCI<)A zyAuD;vK2XRG^|Yl8$xhsx5E3Yath0MA{-f*T6PBRzsqupYN-4(u`Fo*F9}ajte|{= z0AkRV0!(;iW#gcSHO~*ourT&0XqIWrFfy%-&0&A-KtfEI=XRbnk88+BZyp@TyZwPN zA8z}tuB`E)r8VyF#&GZrHF?Il#tAjNH-}xeQS?49i>_JLTj?BK%sI$Fx*P9kr4Ch- z6UCBLyZbmHH)~K+CmTu2`-Rz`Yw`+^cQlaJQGpMlDI*$N$8>$GP{^#<@A^SqcJQ?W zaPH-aly>5bTx9l6!3^=G_hS{P4P_aTcbcpw2aQdFxlQQY8MIf+~;mNiC9VJmzd;GHbVtW{bhc6oh`zl;Si z&SVX$9q<2IimC*PqbduuC=F0|^LK&*pjH1R%2jZ(w0E*}@%)#dKymC(#-4ZXRsl@V zM@YdPLU%c}Wv- zGWM7YxF$AcwMn8uHFNX!=fN|K3pjI^zgY@O(wdv9w94%2MF^u5EWqA5oL+~WI>KW8 zND!M)n60dtQfe&}qs`?gh;LI$O<9Kg1l!p+q+AtIn%d9vIkZYw^*>7-d-Lz3Jey9%>I zZ5-bR#ML^o_=NBpcXZNY+rq3}gIyjo_7`rN&`aYy@u_{iF{HR255T zGeSC6=mV-xdE3;6q zm0tb{U0h3mP_W4o?!8y<;ezuUQjoq2pCLyK3>y)S;7061hBxU5og|$^;VtTb z5JLvG#O@wH4W~jJvSLLxCo#@KebGH0lpU&a@T%@|5uk-42a-U?^VXqbF~u_)=!dbZ z$DhSqaI04^zfMg{59Gf_W?Rq8c@DSb-Q6j(MeuNz0WKfvA{GZZytMH_7?a6P zc8=l5w`Sa8pZ?0fWg}voa4qCo0|$$BS_cmdje4GWjc_Ipz`~_ zbp0GOdbGd+S~?H7fgH*wdna>x8+R*n8+v;OQ#;^~xQxdC-`amQ_CLlMFBMiUE-tP{ zVDx0bU%SjdW~^b>Wyid!0d1tv_H1))I#Z)Hj$R+uTEZNj$tz0esHMH zku)S-(t0uq7~x=cml|^xGB&!kA%ZNE;CvkOX+xIJ4}-TsmU~wfK1OZMMn9R2IHYc^ z;SdHN82V#t(+bA&+)3>s3PYQkT}EW%dteV3Ev+VxMXA~lvZ=$E&$KoveiyR~Pk+(Y zOi+-lG63y71KfXCp8>S>zr|t-hQ`*WCjTKB`{Q&_GyAlGJ_lfz*dK*#Yz(9cK_s9h zK}D!~RGlf8ylR0o;j?Z9kR<#g8Ea^B5Z*l;&l(v|^XB`*%w`%lhq5%?E>9YVC|qHq zoE5KGX*ItoR=S(hmGdyaRgp;|jlb4;|Q zKy*qORo+1(`s%_%X0rM&gG?2CYr^l9KH80{oRXBjv(}3jAu#Z&J|6hRN|1x`wR>iL zsddllz5WifC6oIO{o`DZQ`nGyH0|=4xPuT?+!u9ON&P1LEopMD)dPtXwN}pJ_2+km zsDN~89&sF*qge#UVANf2`u|lwCLrDTf68b6=%d2mXWcdj=B=y*W^=NKUuSQi-JiT=OP4JL>!dfk>^k_2Rnzyci#?mKy^0^?#DyjMxehuz1zdO^Azuq`;_qQOAh}BjKQZElH=}{ zXc;hg%oxImc0-wMJs`IfM;g-DWZTbEc_$h@4fL4M4ZO*{DX)(x06 zwh(7>Iu{AZo{3P}qdOHFk2IFRwcx0U3QviQXkJnCtm@F;C5`qThSXw`DAT0irX*G^ zJBF~jRA8WALb0p5;u^Las}<=mxG%V3@=E_cIA|=(a<7c%ZEHIXg~_s>XP;^_^F7Pf z{JlG9R@P*VCOTQBp%S_3Ho|&9xtdcR@Z(%fNAWykf3qodjTV*(tl6}VC9w1Q2GAPX z;qa3xQ#XdyxH<_nC41P6c}0&*TYsauByo#9|I3^!o^{dbtp44VPG%e(8QX+y{Zy0G zSFE*8Rb6eA$(lQ_(^7c&qc3_6t1jdD4nfY_#YkkF_qe1MD^(p*r_w%i`lM|b6 zBv!A66KFghzFFEI){F5q)=}Ov<%nmRz$|JK*4tERfR8nbh%V+CI1*!0&3NxKEM(O4 z?|zu|W%IE>{D6~I&iT)MC1nCpX{#qL!Yw?#Xb6_MOJM8QCNyRjTfOb~&oQ3O<&Er=RVJ7_Rf`OH4_7U`zMqgQUBQe+vulwmIFTyYHAbeNwXP1Wlhj@A%b z24J0!pLZ>=}SN2xAm7~HGh8Dx?*?x zxwZUebKa0%7ucpy>Xvue{c-FR1xosD?eZ1;Kjqg5n11n0{{k=Me-9LuT}+)!?Nyvi z|K|}3lr{;V22B;c0-<>5H)?nsSHnM`#Ylp&9|qbMsw(|6xq=cm5VYw0L)p|7qrI0k z>VMoj!RtKf<8F891c421gH|J3s=p>YP(!C0kF{NM`;>5!D0Q!JOX{>$i9NlL~BY9@d~wX z3T_D@agjQVFdRQttZ4lGLVYeU4B4`uorUJqX8Pf>%@ev+Vwg;J;&}SPOaVzalAdxD zTvTC$br)xogZA4dWZ5Fnq>0dwAAI7aR-14l9E{!tX}Ciiq7Yt`pzXuNCGN&4f_`tK z@%pCvI=9w7qsKiJXPK!L{psAk;GKmMLDqcm8Kq9NZ=aS0Xy5w1q-=fvQqvoPo>(#i ze4s`FHQ9fso&<(dWp_h|Kf&~WYI%c{wdGL+QQw30l9La7oBhERS7A_5ML*9Js}vhNMq*z@O?ut zK$kBFHPR6z4kwEgj}xKt=S~eZKvq`7o>i1F7VFUkf57z0!5B^2JsTG@H3g1c)Eq^n zYQ04V)i$)4&?-K2oTGLuAOaD1#pufgRG85bjeOsN+Y#NE?<5TtAl5X3GOJ8Cu%JIK z*04TT4XPg~hal1gm);W#<8Hf?@5ybhY=<)jANx@f6_C{y*JNWjD`NUX?B@Gg;ixl> zv7gd>RGo;Lj6BE7`gKwW%F}CjMa8_!65At@E!otxj`L%WWSrR>OLktplIIcwt94mVvjMJw1*H*$8!x9 z*Q8aIx_jUuqlBx!t#-uaUQSNWqVBitK?9Ctfy zgRT~|x&D3~eT2)2{mDFQn36W>t>md+Hf+T!_I<0+R|^}P;pDi^1o>nJe<)s(X%uV` zSQQ2JM?IXUi=$VB=YU%!s1q`iY#*`ubS{vW;9_=hsMl)}Z;M2E@Nz(pvXf|zJeBXcUU_y$Ct2p!jxaeh%U8nHgo&a`4w%ts~OLKDOnVY zZv{j5l2M+a?#y8hMe4JQ!ceeNhJEgG&8i^V!Y1YwG#Uy+5{6=jf)9A>afoFwU=YX` zKPGT>{56hSKpL$5u4e!7mun%_=X8z+^hQCz{aT}8j4 zL^E9<(JG*iF^_LPCVu*UR%R2mULsvUBs{6B#5ixTx6t&1dhu6@iy)@QDj-@*4&~su zbsWgqnlXj0m_K$S3vlcd2%H&sKg_~3Cfr)uwq2fA&AL6XDuPXnQ9T&Kigx3@Oe#riL`S(C#J%oh*7 zr(IVsw-{Vmd`E|y>!87OeGXHe+3w$_yyZ5Z&Z3$_OQZCh;t%tS65VGDBStB%@(Wm0 z1?TPzzPEN1{K^S;-}+*h)wp9x&w(x?@$Q4~-99v`l(OVvA&L8hop+ z{#j~e(K%%yODV6YU&xJ!$FRU>pfa%Vd%%AuPXK^@%tA`QRJMaWS5r<8EG$W%jX9Kn zwUa#=3T|+*%E9bR+v8lvpeyqkwJ?Q7EAZCYtDlwY7yHUbJ~WYa9Gpf{%Q?HKISU@C z7BMT)O>iI7?hTS3KVgxL*bVhIfGcUOcuQK)HX98eR1G&*C85uOeFp7<*8a>|U?q(V z?RG^O-euUJ!f%`N?TRMD9^SsqAbG?+m47UQFX1x382oEMUxrM=6|G(U$eV#zHd_t@b8ELTjo}M+NzCx-};sdvWND83x-yHOinlIviyyK((yT-{^3J; zaucx#Z&X!;Bjo}oHmWGH9+msTJtZfJQ7T-VLRs#LeayzY!uq|<{h6?vLiVgURhrO1 zOhr$rG4q2e8?J?FnWDmRx=iH$KD_Ys?+mH&gQlHXa`F_Ya5r$7(4;AnQga^QLXo2= znkN=Ssm3h)Y-HwGs#596s$#~Hq$N8R#ZGJUFj zDf~Kfq4dO#viRQ+s+GcDY9h>QD-ypeDg&ymq@?hboM3n!q%|o?t(_K2$}DAfISHSw z^6*+uGRaCh42Q`Mj$OopQCd6M&_BLkUbw-DB@ zO(JFe4prA}7LA=(R(-=ID%)|k-p(t!s{P~>o=buhiJe#WRn-iv&Y7r~bVcsh0u(1) zVMSeHd$Gp7y2BKv+0u9w7SYK(^lwUWs+biIEGf7~ig=awuk3hY)OK7xABLR1V8|ig zc6aqX1b7YzeQ$fpY@+}MZ zVsdHNGpo!xlUapty_-MkxyrG%a&U4bTs=>>Slp73ybJP2=4FW}i@%KV@H670;<&I* z%zALg4jwj%$TMB=2FO=;sQZ<>EU-xge%TsazaRuND0#5s)nC`+BSQrJU- z#==7gd-@|YfsMTR4?JPjf`zd);oU)j)x?IIfSAqApbNKx&fiKGS$U$)8QyTRoY9Bb z0?zXJttH(#g9qFssC$&ad8_DqjNz0+qy!5Y)J=&?%Ia+Pyd8U31>e=T^Kr|UQon@g z3D`y%yM2EBgpMKSACau#%5rjOe#0BWHCYf1Te?Sl+7c*!$b=t6-J9zX(fE%Axi`?m zllx^9qLV5_b%AT`gNHOYZ`}qHuX=i5t&*&2r zw;UGMrl`g1=a?92P- zcf~RIH zPOflCmaU7Xbl3Lc8Y4}!3`-_1s`shWUPG+LRYqP|`)Hvfv~f^oCJGCOGDWv+V_W)c zc$V|aMt^;f8tVR_IUcGUDyZ4_c<2hTZUO~|h+LF_C(w1_3$N{S>s1tOGl4=$nHVU0 z%|`7Mhvng}{5x1)p4eUHbFcr4i=(5ucVGV6%m zmEpJ3eumL3`f)s?qGB?3`6dTSp!d9vORFyk9tcC0;}K@OE{9la>gaJLG-39RnU? z_eh>cYXS;a3!??lejLhw`{bKLNq$E+o?gA3xOsr{IlGs+3~I`JaYg?>AFYxD%(_y* zPw3BQMEUnP=AWOC60io!&ivo}o-DA{1Zw7zeC3bIN-b)raH!KBLJ#FYL@mmGuvN^? zAX|7xX&Hd*-KqX9;179P(4V4}cRbM7wUUq>Y<^yWW%xk}B7tEf{_|tbUKzP2pXZpk(_$LU5!2Jy7%I+kDLRc22KS~cWQtgHGki8mv-WJwi5(%H zXMn}pd&#ebe5xq~FLGSI=x`o|j7t(?qXXXHiRLLpYQ}lpU&}Crk*0q5i0o_{t?rpJ zmffpiE@}!G+})u*Hnq~+(Mk{Jws27Gg10bAiu-Us)%pPW&jWcE7B*1@9tJw_N&9!t zSxGq+QJFu;UDVCg?q3yBL5i~Sy#k0|rT-9mRH5th0bVtXH^q!S#iB+}p@h3XG#vs+ z8%c}0RbR!kWq2MzUlj)}4+Q4>`zFu5e{GJN{oea^f!7V)gc2JYV@w?l(r34FoQlET zR;8OUv8L3ga<&kh*T_<@WNjI&Ny}P|sS!j}1kBAJMQ7*qKmsS3#ARPMA z8YO{s9lv>Py&i;z-1MUdoADg0YDxY4B-ft$Qh_7U!h)lS^FY{^822NQXvSqoPySfV zVB$>)7ydDjyf&PrZ}I~ki^)&0wslVZbi?oXi9;;V?aMI5blB{>Q6O<{PWLQ`9$BVF zH+5hFEQe^b#5M9LmJ#Y`q|@Cs+Bs=rg<@oo36f^`i2diqS|s0fv(nMOwlc{5eR(4b zoc)&z#QlFKGLTafws-LSr_SJ?7o}7A!VX0ol{bM#Z;fV$T2q4P2ef4^Xq4Y98EGP$ zjZo+rS1GijK+^Oweg^#6#)5BPq5bTTg(~#C)WruM$dr;QZ#@wah&U9{Li|%-*M$NM|^cN`76U5YZYDs;y0R!B<@o!_S%3%=7|o5mRxhidv1*|N)yr?rsAwjVs( zIcXcz=xAavWad_aMK9^ zu|g$HO(}gXsJ#T+napaKQ=G~Cz5%TN#Zj9(^p`OSpo~ejZd|=(3Zm<_X?Hvx!TYRO zfKIvM7H{kKT0bnS0uiy=LRL^Eh1occ!?cx6>Rj!@RjcNv>z$6&&R=_;5JTXu^fRf& zkAKTfoQf>OxID~;_f0Rjx>WWx_Bm`#`ONNo)9;s;%j2aAOd2H`>x1+ z8T@n8{Hk2(@Y8VeosyoK#xkjDx{;?%6v|`Rs+nMGQQPet{t0dEo@A(1i%ZMXk9)x?_&p7qinFJc*iaKCL;rvHdI#>#)}`IMlXPs`wr$(&*tVUHZL?$B zPRF**PV$d!yjgqi=RNybgZi(X3(0oa`jkbVB&lpVQafG00gUf9k8j{A$zr_StkTrRT1J4GMYEmHh$#zhh;Wr{{;! z*M(&Lx{##*@bmijg_N{0_#e|xRicgEy2@7*twnZ^q*dO+t^=;Q$*5A29Sx6d2yX># zj?OB@1eI2CEOS(nE}VO~*}BB)nampoVU8^Br<;T~SAD?cbi=!|8MjJeAVsregPAI^ zP!;5irMR}i6oHry9qQu>2?A-`QjkBjG=|)WUg1v>gq{XTK?Ed(j)kcg2R)nN=OSmM z0T%!>S9&al34zsjAly0LKf@7iZr4)I_CzjD54f>Hx4>Ln!FB%ab@r|rYNdCi2)O1?E*PI z)ti%?Yx3%N*$S~fv`4O-nnPgCLU>BLCyZ+&{3$Q#av%iV` zo$N3W{8t_NhO>PZO%`v-IUuw4TvTbdPgY`ZSE-`7cUGwQ4ucH=1Crj0S<%`aiP693 ztke~8OD~kWM^*5x)$lLuKlbvDhcu@o>U8&#=sFKo?Hr{V-t4o^&u!%H_aNtW>6>aJ zaC+9B(gmoxf$YOtJ4U;5S(bkZzXgSN9i_dAYRNi9_t@*l<4LE5S0QOl7{)LSzowOd z?uT_WYUEen0GHv%b<_2TA8N_akD)WHncdeDDKpVB&&B;n*P4)4mK(L;BsTk#MKj{j zhJbC>V-zQu{l>ziO-~fbdJ(B106E?o^gsyEsS)$=AGhWzO zJYN`9+#(rL>?ZL;)=Yv^)(n%h27u#IT#P!GRIEDJSbSTEDSMe<%Bn*!Y2g{GGUFVd zq|z>?so#yw6Max4Vgt4ZPg7DW_fhrxLwE1fG3;^J-6ZM{qc6h{{3pmqO)uYz`kTh| z%wo^q>`EmP&u`6NYR2s=OZg{YikzB=iM4@;kcp|Cqsd>&=074++2*fI#rI;VN~^51 zr+h~s&W1`@R8W8@3O(HkAr$&0c*7-C@p!HHT)-FV8vJQce&~CCxbGu7=Dr0XCPa8M zfcJ>+v6JU9YyMYHk1sgG*Sd5lG2;zIgubu{kdi? z%8!Q_eWNPjf@7Mfy)y~RvWlh4V|}YTCV_Deokb1>1Gt;pzx)$g3OZm4JjTmRqXIX} z!c0!>I*BwQ^O7F}t*{Vjj^o;^P3P!bUIqzcxtBs--76f8ptDhDP6Zd+cD?m5A$gH`OKtsDeaKV6Y1f0wC*dr@ z$U1&?y*{KpHX0j73K43Xvjg>b2%Y6(MjhV2D$E0F4BQ;{(i?NJt+Oq8Y#GKa)}S|SNs5ua;%sGART>_e%C zY?WWtZycIz&hYBAqR?3#_mPC|8lQ}%bJ)qb$i0n+217bKcL3@SaC#FGVp zk>@{CxX`3a&mK7I-i)EDl_9hA4ZXD2JR_${R~aHWyy(4=e;=*kHcv8Vm-P};lEn}7 z5k5X=?BfTnFx7nbgFYsWn32re2zLs)@P-2GyAJW$~1}ITi{sd_L>zVIXMYF>4iEC(HLu?DkD1+9J}Y*bqR1b*asRi*LnU zFns#kPijgPlosJj(7S$}e@fEj)c$2+`fu479M}7oXH4|cYEI0^%1UJ*drwT~FV<{s zZx{k{9$_o>JXaN@k=UGwpR{@a^p`^qNiUz8-F7S8jnfJ9@Lzr!#3gGCjk+BT4N_}u zuohzeu&KRxbe(OHT~Q2paRZ@TYN6@*=S~!lbO=>RkQGltXSq2ZT6xH!3p}slk}qc} zeqkF-MQ9z3A){Irhkp)4^4Hq#$L$%K%Xv-%@|nR2)#+84wim@OhMz>*lT_qQXNH`K zgG_B`I~CcS{AuQ?UvQudPdFV~t;EVlOAJG)k9xTGq1e8RoD@#}pdSzdn?e5M+0|0O zV2PT}L?fp|`hfLikH0RqNw`@FB(AfEtKav#+6|NkY^$rkmERS>4%p1TUTDl$T>0mi z@-Je_*W!ZzWul3W-6kX@xefy{>ggf^q%TE+Iqcyet_HgR>2q)A8yDQf!e1jX=(W!QHhcf zp=K))p;6A(n3caUpe(BfNrHsrF?`X{eqP?r%Fy@wh1bAI#Y`tjTFIaN>HxfNh=NnS z5_VEt$TbPz#HX$v@`1d2C9lVge5y+6_EGSf&fsgkR_rANVb=0oAK&R@fRK=2fqk=6 zZgPjxW#T|e%W1Qzbe{vbuElVmpX4);cJ##UZ9jLV>1|`Pmg7mROaV`^x?y;8uXZ@X zLo{?To3X+coj;v=BRhAw$L5VeF@5s?Y@#Lna}SYX>lP$cVb!Q}Mm*pL6Ga#ZA>K`{ z454@!{!N}~7?@`e2i`uwgX_1XZgA%=M@buzJ=tYew)#wD&4eS)V`N9#KE@{+LoDc2 zkm$DN%iprva6-h~zwjUJU+16jA98B{MYs{Rb2V}N|213m7wHCA5rbE6Up~D!os>2p z<;M&{BQ-FlOn{=WkvX|~hm3l)lSx(``!TO)kU3)GF_35Jab{g`X6_{CBhHi?U-!QW zAUIy28Y`m(DZ_MmTdtR(a?@7#ndeLPGiMv^RlT*Rh{qucjxr3fA_yKr!*jsAJqVWL zh%L){qguaru?gMEfKhc2D+|EfjB#!WAWhUk>#^mAdjq-RA%SApj(vKA< zA<3&DeYE&xy=^knVba`&>AN&j##DO$Vhbn)5)YKfq`c{!br$?TxOblf4`hs^A z$0Hfhv7W9N($IlW6!gig$SE)4|8I$0$^kf||9a^yUx)1yYbbKnd}Cgeod3s;y;Yu#blzU_(HnDlShVQ`IC&qbX@pQZI{k1iIFc zk$~a(Mn4c@56o@I`D?mn`bgvBUk$;KDzLGY(k~AyS+Bu%w~^0@!lk89y7;hjpLXbT zpw&q|A#VE?FZQOV<|HpD+-byj2NF6$?j-WMjXl$OX@ZsM2+jk{%zT)d7HX0`qkx zNOCPOqMR!NCduU`WxQve6pv4AwYfGK2ssTvJ;b4I@@JusNU-L`%)L zhW{DRSyY?jaL8^&Sejc~6== z-m6O}JOXfAztXi-JDqxM)Vn*gN|I8M0}xhuYKK5hH@bRtLOa;oydpbLFVsBJ$7y5n zS$)0ri1iBEh3d$0mn~$dQ5eZmP?Txas|uSp6wA|> z(^i(C=Dyb)TvL&tq(Gs6UCQ1GI_8=VUR5c5e7SEb*0SWt@oLt7IOmGl>R73jYC)^a z5J~D@aK@Hf)O9?8gE7-tw$kVXb_!kBUt&Ln?Z}`tJZtvxXfOpaylYmqV5-2JuAoQ) zY@Fo((NgU&c*XT1GX>cxNQ62E0<0o@p%uCTt+2r_z1~9(;}hOPH$KA;q;AYR-B=im z$YZqp>y7V|aLFvCDiksT{@psmB@BFi^X)b!I>X}`wnoKm&8DvRnSN9?STR{$(J=(yaVzTw%RcKa5h)2-0pgQ$GOCgmE9jm7G0IcF1naeN1X ziDh%#D9Jwq0DZ|5Tbm5k?K$Ls8*66%wz`-vP&ghXlv2#vUIbI_-l^bf0%^Z_JUU zWXl}-D-qW0P{^g6@7!vr5m!wi`RZ-%voQ4x5KU>dpk&MpqyZL&hT4S{4Dc9LX^B8) zj>$gm!v@f zi7`7l7-S#o(o~`3f(Cavzb6ZKs^ope#?Tj>?wKRrK;H2x3HH1qYh%=n-PIUUyTy#$ z$q_2|Q4n7{#j!rZW9;HzC`FxS8ZvA80ih0&M?bkFV<+zui{w)oM#XqjWqir-NzLSVme?M#{EyP6&fEmeQP#C=X%@bBW42& z$?foLL@>>MfJqd}172KCK6w$iZhzXs!R1ye^; z%NZ9l%CX1IOPd#5CnfJw_1F*gg@3#FU1P)=h7W4b5+;YK7Nq5dNN=wcuCi-sj&E{p zdXBT~y#izZJ?h(XQk*V_{=p0ibq&-XcxPo_)Q*%~jdV|oDp?QW0kfbdm>q7~E6m?+ znnS!vm*bE?nq+oB40Qv#plfM{TM_K-#q_tl3U#_^u};*WFNNMx9niZ1 zo?69)!)nl8t`Xi_MQV1txyVFdsCVMZ-H78(03^RzjRo^RfNjI}d1)(jWPbDUV4POE z5;ej{tU1P6Npp=c&vCCB57^r6Jxf3Bt3!mhARyTl0DoYu-eU(1+O5|+a2d1VE~Q&c zP(roH7fhjuvgM#y8__l=T3&uu9Z$@GQVtC>fjib8f9H&|9rvds3`79&PeXHi6y{dN zKwR&HKfo6V-WCkr77phB{UKg@Rl)}9m%U68ysh7Ad zG6^5nLw$KuDdVfUQ~uNwe^^Ih5?HA$S&)NmLm9mj*PZX6Q&$1qbS?6_i z6-I^I5N77NaXpyQ62ohbu;r+|PD+520TdRC0cMd^xoCq_h3OeNzp~q%)alARxg}N7 zcophBMD^vV(>_PXIekO93Sg1k2w=0`<(vZZKv01RU?`RsC~@V}CUY)87`@ zcdp8)NI~f|q~E1njJXH?_zZMSdmgu(lK0^n>Sq`$oYFt*rFEWfVo@G%!mO?;4YjHx z8jeB5Y;0=RQbd8kd9GXVNgpvuE;|U#C<=F33M2;3M&TD+JC(tiI#En3Ta?-P_D8eRCP9Yva*&Gg zfJ~hi)k=RqKT^8YdOsp^lVZK~WDl#lqt!o?ZAfQBXmb!@jE>A+d1vMGv|QkkEYJ%& za;#uRXZ--`%to;z>Q4avQ+kb37pwm?7qB?>qK*9QlKq3}l^Y}QAH8-hzw%DfYLpW{ zxuwsHKcjn`r&o=sI@K(9#g`wX6^#8cN$$siuijyihf!?hZqD_t`wUzj=XZ&rMIAu8 zxKnhuNKl$?2e<>`2Y6k=AIwLb&Q1&JD91)(n7mw;yl7o3qFRP_54Abfw*hr<=f_?e zcC(CX-hq8iXUEjtp}hS1A-#MRHMzKhN3~U{wKp{|*|xXga52LQ0}N%V8m$q&A6T9f z^ujgKOvTpUqYUX4r*eIX#&dl{Ko8*!_!SYsVS3-x@3eS%2*EkeNnU}vLzQ40h0{!I zJY%f;_?v^jI{RTLPGXnDnzDJ;cPX|QZG-->O;e|rW1g@*4Yg$j&_|s3uieRP#1Gi2 z88$$B)Sgwp$}FM!i;0u}jx#0cC}WrZ%F8RhuGl|yFu$(Xe>o5TeYJv>to}0O@(Sax z(^Uv~H0DAW7SU4O`^T0tCcu92O_3rCUxH;?j4)R&Y+XwT_y<3C$c=z!MS5N{qpsyh z+rg)F0x^7RWTkyZBU5x~VbAsHGg)o@yQK8MXhInHw*O|{LF(`_R{!Z}6 zh8ZoHOFY38uGCmF4qNvXXNX!TBFB2y)e6GyJXa!7e#E`7y-~3INF6bAaJCD!1s=g`wj zoI~aM3DX0nty+N%-d(F*NfHq;^;{~iCXGI23TIK0!^QN22S)fo#qQi@_iRpb&bQ69 z$8xT7OW6(=cTu@I+1wksq~0>RT+Cs4v00-kx%|#>{x0a=4#Hv6er9LXONNiwiWWD( zXLzPVc)%A<0o`J88aFLBN;1lPfuBZx_KUI~_ee4A57oQR9q_o(u6YdZH9pdrk&SBt>Cv8CiX--ngnbaoh^a^#j zq7DrD9llZgdN5oC*Mm1Tqn~HkQbs;pi*e+KZX{8uClcx~q%Z$ZX z=#-OS$d{nfdyaB7S;k0D#GyHw3^tx6knlR54?48FBSZQ>`DVCn^MR8MhhR-{yR=aJ z(wsP*De9)RrvVYhKx-}8OObu$XtP;9SuEf8tZ!6IuBNiPf6cF~&o$Z;am+Ukl2)E#ST@wJltnX*9#Jjqw5;$wdL_W47 z-r(Sg7qyf=$j|~d8lIC*SG}E~(#j#VLZMV`CV9NJ^}blMxNz2M2a+v;kKRuPlIltr zTy{p1;nkAmomN)XyE$%Xx<)d839a53J8&mDzD{OWMQ65T3gHgvT0LOl-x;NTTs9eW zm~Q5+keRF=kvdh}ywYWg2ACH@&drpz(ojgJX5b)|wFKU^4e)cZnX zl7uFKB$X|D=_vi0mt8V73`>_#;`~5+)IPKi4EHcKG<4K;nDt7Jbb*R55Moz-(bzYn zez&K7uiYDVgXVwtbvXwXXMW0stQ6|#8C2W}?^{MT32D{wfkb*;|0a%*+a&PCy&PR3 zoq8DQ-e$y|7!9@L5(5K@AqUZ*F$ z$6cX9>V=<) z|7Nifl9ZBoES45ZxsYuS3Q~ZwmBj(Fwg~Vpq32!! zAUy5F68MGipcb$`X{vmE0o*_A)#GAjH{V)A@gM8Ad@3Jj34EgXrsm~qcM?0#l{?Sp zd0t>*FOFtGcwT5OpS0unHu6ZF+Cz_Lc*4g##O0+c+lt6*rt6=P zRBNrJsA%LM(O0lr*w|c#n#HvCXHCVM74kW0PHj#sEW!u1z+T){lg$Zh9>k3%v)`|W z%(oZ7608-~opTHFDg;!BX1#%Go9cQIB^uL~Gq~2dz4jQEnZ8m_`vvHH%2W!K&N6{K zA)@U?u`z}gi37;xi#Q2eDR=(n_g-3VAXUIZEn_{VL@m!ud8V>7Y;igx810)>YZdL9TI9Y` zNYt6T5_ed?6-aB4LNY}zWSAHTPifUNW7oX}1U+l&+7 zog0!dFEr9Bln!ZnJ*FD4VmJ$|is2UNj0|P4FWDy)-JbZexrPC=@c2b%T1hL-Mxjy#N_n}&I7(zTU(734>@y% zzZ#K4wT@bhR;Ax*%)&xyt)%K`(@t2bW|QKJ}nn;*5?-2U0$5;{JJ~S&bexF<{KTAER={fO#x-N)PH@+;LRURY_U8 zmQ@BsJ6DNViExoLEl6xWsIal~*usAiC9>5aq?*3gppO+)-q!9y2C$QI^l_ zQ)Lq?7v0{W2InXMD(+Zwymj*IO7CP}QlzxXREu~~Q~~RExXC$%mqdsvFL=B~bMtpT z$zRK-Q~=_YYw{o?$jQDk{E7ffPqm_>V~=E*tvBFzm7+$IL(ycon`5&^^&$|Kycub# z_blJMIoZxP>6c`wp5pD&JGBgbmL3!B9;0pg+lOspdEF{=X%_lv$)g=z2P<@$8mv|* zbZQWDXAfqdg7iC}3O4$zUVe4!P3yU#CP8A0w2+)X-zBk1OoquLw!bgk9$o!SaqMFvDQg39k= zjtLt)!|gGgWg+21gwg)Km=CAGAIWE^w;K}UB*%{o9%1gI`%^oz*S_F0I#GXql-X~e88dyVxS#fw#C5rFG9)J)Rac*O5ukDI8M~qPc9qi z9%a-Fdk0$ik{+tJ9bz;3Wm|Pa-g+*--KX{BN#Ic?*tt&D48373dqXG3Pb8yI!)k=< z%l2vMc!d-;sMO!WcuYZ0it#)jfhj_}S{IQm)jOAAT8RMBr8Q@JF+%Tjxh5PaA5^K! zC0t_AR;rLmVwN6?M`J9ij3n#o-t$A)#9q}0dAqyD{W4?$Z)(qK|Jj~dUZ(E8DWTge zvrZvJB4&e;95(CnlsZ_7Yo)uQ0VJ)cq#voT?ipNeLU0;1iR8}$g82#!8RQ?Qo>Ta3 zAIgKAl0&k{L*FT^=XPJA2S^YeiXo*V4utIBCnTr7(6@P521Wx(r84lqWTw)SK|imQ zmz)0cH)12pdJu`(AJ%f0wVXPX9I7^QN39%Hy3HGg4QH(&?Mk(*U}Q=V1h8zwKot9i zjzu88r03rckQmp3Sz|HIo71(`CXB<VWQw8e@4v^32D%GiymTvkRV1;x8_wap|ZlhmkjmZ{#1#!+90CS zt8mxqtr|=wX~(pOGjPV}-2$F;Bbba4_@r=-5qPB_*ro&C0t-7eN7SJQ22vrvv;BI4 zwqReK>bPSPQw&^~E#f>4Ua4kgVf`2#s!4mHB`|-{P_mRN1n30~BLEPlgWC)`&--x@ zhjsrr;B%vvM+L|SK4^OHwbbMLi5NI+MV|P$!aYYgl`0)J4L&osFdfUCbwiu^!kGE8 z|K0+5dTgV!S%Ks`(_UjZ@0S>w!g5&a4(OZ}4R*RB7ZsuAVb(pUdt(T$oojVf)1coi zd|DtPs#NIG3qmcwLl02}OrnQDfj&z5{xpWSq8$a-q?Nno*x?Hjz!%FUM>rcJ1+*w@d&%#A3;|b z_WW>;Q~p`E1V@m9GSMTKi*Sq;HimCA#|SOCwWfH5Ei2+HkeFW;f{>$f&vab%Ulf+e z^8SM*Ix%B7;wH_+be+r4;>?BP(E+WZqzwq@JM_kxxmwl%YLEeR4Un1&5(<+vZ#;qS zzd-q?{eKVl-Z!jSY1Cib?wn%T3WYRHak*N97T}5U{y;rS{?I_ zZD2Zyt-T?SyD^KqL65spul%wp-@B==Yh3Q=UK%fWmK;@yPjl0(iM6)I<=(#2!`j17 zEn6~V>Q}++1#NyS`NhmNPIbZA9T)2b#}#?Z>3f%jKqVfhs=f?P1w#0#GENEmOod|0 zTtrTEvY_!Nr2**o>uxoERo*tCdE(D2c!6hfh!=DSA>u;6eL3x1&8%~52opy2F0j+pv?Mt@&8>7f@!H^~IBs0En{i*oTL+vKi2t4dW_+ttpEJUCy)hN*; zRPw4SeQsC4e4wZoqAg>esiq`(i8p)kf48yAFoa~zeC66$U#lnn$(s3R2i`{yTEA*o5Lmqp@0UBAVFelHCGrASY$j=^luK? zJ!eVe63G^4hm1x*4u=DBiG@s7mGoNS6upkTAHZ{szo4XK+vgSoRw!wHUYWyu%Wd1| z(dW_YaT9U*!{wfph)c*0+#EmqaV`+3Jnt6h1%~&aBoxr#`-0=c_cNCM`*GwQL~J)o zF8#bZ@PdqM;yPIPzo)@+b?@*oYak_1zC!ZYm z1abN6If+EK{k; zltx;SqZ1U%a&1g3eg+y1frMNf!_flm3BNjqKu*uwjR;pXXUMn6piY} z$l-W3Skks+hwM>%iEH9yYA%x1>D$!`632+x!4ImyjU%_Rdol&rBCM%e#!(V1T#PD{ zyBn5KBQxeiYSG|yARaL%A+~tR=F(3JQiSR(>{WuFLAK`oMZuI+4ApX9)A{iuCJWY5 zw8v3JvnEpj(clMi$KchNv$;3xX5!Rk7@k^2J0>pGjPzM3c42r8@&Zs@9C)a>Y%{i!3oUY0o`+F@jC8l`IO|gsUGhJ0Hk(EQ40LTl0 zw8E4{CR1xgW*O=raKeF*Za_dg3ABSCZB8=_peb7G+I4e9{p@RV^Q4}7OHr38PjS=XI*TrnUil@1)>@nR6C zn~U!O7$nfiOD5C}TWyy28t_@NOrKHss*UR_xGzTxy4zGRZxr-lZ$=fnD26r$Ya4jY0VXEL8*IJPdRbIMpQNx3%vGbZ$nw_BK*l)Bw z93hMpW|9M^Wo>v8ts!A7=0MabFC+S_ck#dV?zg`E3LD2DcLk=M7@N;tvnh z!hOZ<56^wo@zc(E2X03W`~ujw1*8Z3DGa0s{mBPz1NO}q{Nvk|ESxvJS#qbA5XvL^ZdBc{(lrf$uKq^9${FEA?D@!E%yC+`g zCOka+dY8~|D&w~ENBVz5Ev9hV5`UbyVmZ{$%pi2eguP?g=ti^Eh-Io5OjaOvn%43W z8&Wl~L<-V=&+7lBTj(J|&UHekRsUyK$iti?lr^cJ2=aF10*>nU$m(WnmqttAo=m_d zod;R<7_-6n(zt8!q)=kR%%Pm|J7d<64o7r{0e|SLXU#~bXsN@@)Efb+=pmnb-C;Fr zhLi3+tLkkAxJhS+F(xn2!El3)!q(Dxa#Gjncr01h+`63sgyyYt4>hR_9SyKk^- z(&#xt9{ulk#f@LXrT%#6Uo=2oV`Qk+AR)Fq1c=F>ag~|5aSfAA{#hzum=;a8DuJ{6B^xYiH;Nk_={KCZgR`eH7VqdH3} zl^@D`F_(209Mk8t_$Cz^pW@yhkO6O)0dJrIZ>Rxpu=M#o`xT@7IJ~9vXhrkgH`x!# zmjlT?@^`uRCPhtcACa#$x#&0JZ~lINBXZCICUoh(S`brTUa)@}wfsvG{nZ!~GH`UX zF!>LTBU?r5Yi%e7Z={JaHmDE;!f)58L=h4$E(it^Mgds=ksmNw~O5hj2Fg& zJzp4|v~UA7`245uPKrDO1sJ@1(YuU%$j#)2?DW>qj0d$C{i-zK`}OvfrS9cK(=+cQ zjk2GN!W4>h;%};3^=95YmMR>DMY)=dCn`C_$(h zL@cWvHckpJn)XHob6@qkH|*9_x1GUD^D4=iK7GM@j(K{p2t?kyiZ@^_({Qc}re+<1Z~;Wvm;RJfbtV7A+Ed2T(RXS}|$^qoP6 zoThS8{LyK@tW`n7875*XK8FUTQr(`6)YRz+qEU0quuZ1V44AqajO?I(v1kne3V~c* zXF3DlHz#$u~0$}cp)=Ef>U zSXLN1>eE)d*6xQsvrH2Z)96O%rpL5>2X|rA<_&G`b{nbS>;Fv}4#N)D`imKBD90kb zdz6mC`xoO)7Ckkpx(x=5tNw}7yJCkY6Bf)+*u22#wO$MMO+s9HPFs@0phf1?%ZnQem( zyhHg#7e|2-Whf!iWXKqW-6%H7EQOdq#jXGVH=fFU3%as?5_j(D{jKl>V@XPhN7*I~ zOVx+=>~APsFJ7M<3Q>PNNTQmV-+r0+PFE(K>O&6cABHKc?Knap*g@AOy+`IjEHO(j zcQ!P-2KxY>05u2f6DF{o|GAELk!81?_+6s=T+n-yEH34Hz722}?)QXi2ZsnBd;$D? z*WWO#J@PYVWm6yle9J(bxB_y>U71LZ8Qu=%2zk5jus2~sX~kjQ5{8ZkCP0wkq)b&= zdE}VC_yS!+sO@s8wgn-x`vFC$8pTS~$AY?j5|Ua(KjR_vNg#$;JhUc-d41$DWO0%( zCnS1|e{%496ZHD7fW6YH0*Y1b;1w*W1t7sFt{#zm4Nf{B{8Wl-=C#?v#>h}N^DR=2 z1KhaC%E49cen!Z3#~z4~ABdnzQboie2wr~f3|`fFgI~P=4N9gT?y?&9)r=?l3OxTb zeegd)=fCWy!C!+n$btyI&9uClavroh&`qF8R){Ci5&4XSpz)e{brR)zBM1ktB>*V#pE&SR)x> z$nTKZk}?1hOA@7u;3Z<&TBR9=@h3OKdvZ*U1$9vdvlkJ zo2YfVkvPWZI20fYV2(=0t@%;w+LEEx>kuqEuGFTcqgk!$*4A;rY4Zr#FEC%8jAMcS zs`3qyL8>T0s*1JnQqw!uKN*7y8*iI;0?7_iG$_x_Xy0d@4Fs@q8y!OKJ?2w}W$*Ng z>K028-EF(>ZyoLekakpQ9o8a3*y^<522xi5j?N-FyL|RHM^!Vo6R$jP3n+Cxv#*d1 zB}IdyG`WG%aV`ork{d0be~`J>rXs%ov?*zMf?J*i%{CAMfJUxQ_F=EvbyV+z=GUD- z(Hl2B^`cZOvB;cK?8Jn0aJ|IM*~<_6OdNl8=&?*)c>0V&&Vq|fk2xjVG`EpVf6w^A zMH#eG1`xS<=x8#<^_3Jvq@b_?4MlIX>G0ypC68&N^fNdYFAd5X*v`v!J{i_M)l0$p ziLze6iy7JL1MW%2`4CyfWv~WKO8Y_JbCu1 zy$tKz6u&dWa7izG;r&S{1XG|TiaV4K-qlD}3i^(cH}xDQ=Lxj`t*+)cE!t1;4fzFp zAAH8rf|MyQ1v83L@5n47I)rm>MnVo@jet88=;gLrKjBUJARF%XFdQgb)~oCa4h&2( zGH4CKf>FpU%m~V%FM#AV+8IV&589}xCt zoesE0^FhhpM;8-W%tu>oZi(W4KJU0csqG6iej9$5ZbcM@v4d{F5hSlyWTIBobQe!k zHP}Kml}*d+tAxJIVYrN(#D};wxU&01yv4@io71N-mo`y?E*ngaZYxVqF8Y%Rg@n1j zDyR9%y{zN4EzL$<`G%evcFDHlZ zZr$G4G?;bWs|tD&m2Kv%G<0BHr?O%^6;Wp~JE4rpZKhEXVie)#r*vHNiPI~h|!h?*`5)|ebQ!abam9P11an4(BXRhvQn zRTC*Q|23_EF+~Ry!6pcj@|mB`dhrhk&Mq)0tV z#%?lB{%0Yg2PU7xjWnkVp-e)v`4Sx`C!1Ns?`igLQ4vxLwPnPijIbWKFz7DM2GVJ* zF%9mT!=T!Wb|7T_L_C1t zr-TzwhSO682ss{#Q;N~oycnv?BJepbh?hSiRu1x&_m%Uh^_oOIuZ%ZpRR$x&BX9+| zmVkXKqw;Bg4c(~nm#{uvZDPGmyIj$azA9cZz3Vz$Q^D34Y>>-52c4Vrjg-tROy`0H z)e4|q)2j}g^Id;`4=}gvDqhIB=7LR(77@1+{d_T=wVSc8QbfzNYIxGxq>*FoJ8gQ} zKHV$923=6Xp23%gGY<(_6>FJUJ4XB9*`#fpR$487%T4rM1p`DiueHB-MsR45kzG;v zIDWv|@&l#yb<4eLgTasRmH1wY3=>Xyhwt#F&kV!3QH(VjXAf&RPUNZ+m^USU0DREm z{r)y;TPs!c>HC#lup<34mG1u*82?>)jYh)|73#`4?}_rc}&|X*px|k3TkNstCh9k@r_gZB(T( z+taahTY`koCuV;<;WDBJiFDMr6FNqpbe76m-J;&{#IZ(dny6I(He9*;m-1sU5`HwO z$*C@-j3pyeY#K{X z{k4_e5+g+ywZT&-bX~HlSQYg5e29T&Mo}i%?}zosnxaNEGpglMl{9h!qQQ(A8U{SL zh<9J1l~jlcy~1jK;)w*2yaB~z8IR&@e9)DCpPM_YJvEgW!Ok&{ywX%%J8sHzAH zf?l_yay5%@j^h2LrzXNQcj__)Q6Ng_LqdWKlIxSGGNW3W4$t|`a~o9#^WVWe1Z!$k z8eK^I7V2ISYX@1Szs<1-s8_akE;}3bYWGVDF^O5NWq>T`wA?DyS^`)34?Ovp&>xQY0hG>ViU@1Jym;8@^Bnk#C}MzlA@WQgg)ggRnat4y`3TA{>4t(qU^h{wIz_Ggxr z&W?#qTonqiWpKttnE{S>{7IGr?reS9DTtZwSrfO`RMI!*l5zX0<)WJ!e0Ur zVmO$;EhG;gTB#L)5vAt>%r1SjLfnmRObgUdj-0plL4cTJokl2HrdvBH%1v#2hUTcD ze8O|$C>(00P+w@fYG%+a1oF0L!J%MhL4#Q`)Xn{agh-pmtZD0u8Z`C}nI@%^+NTry z&wOiUXkP+_D6!%Iu~6^fAC)skXP?4DyuC}3X!s7dC|ZFuat-cTgA}`B=g@0p2ZlLz zjbTOh8L7l#!eV6==4I(1Or}Q zy7VXI3(rV@$%Btq6<-fh3d3OUSz{A5CL}A5NRDqrgeXo3GUePza(J3Wvq#t{>P742 zWz;Rvy|-LiR?>GI&|9*1O9O}fj`M!Rh#^{%p3phv?^m}A!nY3@sO#h&D%;O^%w}^5o8~iAx6{zK zLhyR)*6fgIwu_Fl(ab6ay?8gWr{oLN)#-Ht z<}G)=k(YC^PIhI&6M?db_O(ESqhw~VH?7d@=0_^_ycK^ED zz_VY-v5op7k#pNwo#|BeX@!4JW7}P64X=Z;lDTJ>;Ndr3;K9!9U*vuCf#SILeXm4J0vry`i@+^=8^ewm^%^&Ce`j;bWgv)=j1Ys&MEm`ap zb5c>!FL88>^bsY_kBNvqeuy=SFZARSlxL)7m#fD=eJZG2!*KunsJ?nbk9IS)QvD3$ zPG1hfM>uJ)x_VdsTwCL(se_F2`#&xVn;a^GvwlJx62C~BGPEYFOHUHp zo_=o3{81<9NG1zE1JY~ZTJ!eCh8wPi7S+hoGfW{SG5hWC86St#o}Ywy31O(~>@M$v z=eO}%%tu-SXIlz|6IeV|>&dMJ=K)y1H6lBXDY)SxjGmADU9UtUBnL zgy1EsE4J()?e-E`G+3fwiq(_uVTpE|a)6mO^OfIoZf+X4Vq*7bm1Kinm&oWH_RC(luhhq4g3*H^|DpWp?K3_|I)3^!rK&W8 z*W-BE+L@+N*d(0ulL9vS3~kpe5PqQN)1RSZ3POL&k3adH#41c*Ue@zKJ68O5S&@FW z0)tx`CcDBW;-7y4Vt!r_M=^sWK`ovm5{xpEefC#m-r41+xht3L3Fru+?m;``D#gi> z+18N`Bc!5vWa45Jp<_8dakM0X(?i?03!{MUXlo4&W-Q@AYiNPw`;$2_x1F8&@}lTWxH5;sDx~ir#v3I5I0iX6y=nA03vZYA@o_ZW7A)}vY(3IX3FXSxRsquL6>CuR+`Pq z6&xGD-Yjc*kX%D=^Ra6E6~B9ARnUD~%GB=w_maIrIn*DB6W;0z;1z1G6E5@5PajCb z4Bz7({ZJNepf%wilOy7GLN9)SNeqONVQm~BBjfjN7mj@d9lNqD1o_k(wvF55MMv*T zzx!6ulDuU*1ni;7;pbXm(ceinA(D`OnTsk2OxJEmMXBjM4ZfPpxQ|l8 zpLxRj(mrovR?ZAC$rulBBwAt}X-R(&1LY!q6oP&4!gLP}?5O^ou#5HC;do66`TJV^ zqX`{O7S53m;g`)=2aKEr-F@WpelSCbyaD=)yK<@N+T{ikN1jSS!D z-jEF6@LrLug}E(ojc@qyK+g*(_izk!#~r6v4u4PYAsv~%$vr8W z8~e=mz@gsP2UB8=+nws>NY`IXuaGg$FE78bKpC?xj#y5yw+wK2`@ha)@anU-v@+Mn zGvaAH=R>luV2QR&Zzwt2XLX1;(+9} zZOfP^^-cQ%p*lm?LxuXD?X>l|@6z$({l64imHjIUTdJ4~^8WC1pq%4lSY1Se{N30X z2wFvAHcD3mh3&rHMqa0+H5g3r4^+n7QZe*hhyyZb;4DFQwVj+DSQ{+M!I~92V5$GZ zj=8iitVK1v<1m}fiASuv@2#6MAe+TxH3Gf2G;>h5>k(a3l)8Dg+T`J&<3F$>vPT&ilb{Z*N;kWBp7*H2RY(qG zn895PFC$xDU9GIeBmJixPS?5h8v$H{A2ssakV&ggw7UdJj|$$U=?Q3FhB^z;Ln$|R<(^J8kCb>BssfySn<|1hm zm7 z@+v%`xehn(@IEE`pdUJ-D2)Q75Hc&Si_u zC9=H&VA6-@XeK;#fjSiJ?i&j-3e;&1Z|y@mpPjg5c;vV@<_+C56Nbc6zZ58=PZPnz zCeWc6+asa5tY;lEQd9lGa;N|sszn$f=3)((>C}WJBPd3)xomwp66K$JOhlxMS-7lPA_Qp01dtp~ zWM*BR%Abk>A4FG#yCY_=qUnSde@7}q%AH22=TQj9bqhTn6)hj^)IRWxUzgfo!XZ8>K|A$E z%QY(75{H+Vvdlw<>7g@H7pz3%Wn2~efHG5_5}zNwlN3Akkruhp_cBffWW5}Lwt-5- ziiWY%4`!n8H=!5AQHqBh2i?jv`HtY|aGUMs1da@s2&x!LglSt>&qP+B37ty%QP0sU zx`x{_h2CD%DtTz+l^u7AC?XK*EnM<0-s`maq8&MwQ5^G|?a`-x06+Ewh=HB?Qbbpj zx${ESgFd2pGPbkqE-m5=VP68OqW}-5fV)*Dh5TYPaIoxUS7KI@8W=a~y}Sq5QK6!s zjtq2|x(_HYR56o4G*GPzSy=;6Qz#oI>508pGr_lo8?Qg(RH1f=q(IARK~Bv%`Bk9! zwZxFRVp36O?1^3%{9pwxi4nUTepUA;wC%G|_XE^(ev^WIVVN&eeLGO9j+fwem~@-3 z?QC#buV(e~Qk(WT^KUvL8AM-{c&td7w!Zxa?k$C@AZ@RMMy*YY!IEU zv7lD6IMhjebrF4YXP=6NGd*#{y6Uk7NpEBX@IAoMOkm3R5`o}^A~7}kzzC@q_1Yza zurhb2PgQh4tX8c<{vKZ8&sFV^X&e}-nqVAF*)jpInPAmK;j*NPbSskR9utK$uFxhJ zpa}Fytr;Bb5alOGGUBN97;$32=M?EGcH~-aqbYk_!X=>Qy{-@C#(6_2t)MeuG>n1} zHh1f=QLA|hq`AT}2h@aYVeR$4(V#i>cyv0!GgOLzj&{`RCKDno)ej05JY(R-X49~6 z?;!=mUYh5+?nw$#*E$~E;=P|*tmI^^A4!nZ9_+$GdAh&3s7phEXfn?}d{nS$+}W9v zqO^D2AoNK|P;$a>PFv9^*aA0GnLYy8(7ujCE@DkJ>s#xxW@ba5{>mKHu~rwUc^XQZ zYCXSOr#9cQ%-LPVLqmE|n)G}e(@JG|#$ch5EpkefymG%WtutX-`#~fxwN0cgh)y}G z0I5I4vdZHCry1?6sFfDu7hWLV^PA(?;B5wmqnj$Dkb7TSl5i_s&CqXBAyPuC%;jHp z!(y;CphZmZ4qa7P8&*pS)=RDVMba%B?M}s2(lfha*t}kq;>vY+OVCecd?KY|8;6j! z8}|xn!95(}Y}%`iu|WkL9-LbS+k{Wdm@b^bE#)U{ z<~+=+tbx5addTSm*Ldv~SDfJNte!K5**lDp-Y2zVHz-$VJ<^REA2xF~FPo15%5G#UDeS)K?t>J1tiLEXQo`C27*>E13Z`dgLqi+TEljo-W zuO~?*QCU$D&3}R`RZJbMEo}^)Z2vdw=7&=Z#E8Nh9Pf_^+6PWG*Q%t$fvqmJNzsZ) zsz_p}Ic!Elxgd$T_^Mvbka4;l%hU`!C!*_?xvhT9$$RGg?dAho8_NognPioOTcqGn z8%Byf!KMbm9O9pkIhF? z=B@-<-FgAupNt6Y%+Y0$#VXe>D+*pYwdfbhl5!rGhZKfCbw(lBd>vViaiSEHG?TH} zS^veprkA@t&tqi**(`evg#~u4%7G&qufo`2BPuhOHc@MT(=bZHM&({f7UnBOM&aYw z;^BQf0&=utARo!L&x!isZwSr&J`r7Ph#5^VdUh^A?{}KEgB#dMu!KweS#p7bb2a7R z2OGUQSec$NdCm+ThjYvd|48d~r^?890l8clL$WtU()#ClD9CdU`QK0X=)DK2zkUP& zw11>|ss4Z7iL#T!kEFb;p~LV0UF{V8&uS->uVr>a(Kr^8BoqnBeI(-+j;;^{p@|_d zWlRdT$s${!Z45+h2h#MUuYA6fV1_H1hwZP@lAUopg6OSbWeRkER$yufhYuV^sH|(Ey@YRL#XZ5NWLLrQ2+QUvu`^c9H}+ z*<0uml^)KNc1un=ZA+H853q^hs)Y&&NU%P8jfU>zm5Su-IjUkW2yo!+=7!66{?+b zc#TDl5}=5{-=A3#TRS%Fg-c0avU>^7aVJ`|n3BHgFFf*5xpF3uO6ZaivOw~!P@BuR zQ<@T+P2vvgmM&}e?pl*QYdqk5xV`cQQL9oJ0@}~Oa$Pl_gw}U&rT8q4@6R+_ zRRo5x0*fZG{J6j&9MDVc5>WPw)b;;is- zB)JcLo^En`4}G1ZjoWW4aNoBhuU%rF*U0@F>9x_gOVwg_V8l5Y310P1S=P2vtY}v* zx?uwPJSX?yMFX`{X^gqJ|N0s)V>9vKJIrrYBp+)Y_3C~o?tSd`pWq-+8`$u+qR__E zidX!-Mv>9_lWkvF@(?+Q+s#C*&_jasi@O)6llGPo=}_z%b?_#P*E{(2_qK7X+@Bn( zT|8bU3{^EfJf*JHCF9w<4~G zi++^v7GN(N(VT11ugG}T`+iIoX5WZ>@;99ilrz$tr_k{7IuPX}a(VkBbr^al`4*)b z{dwN0SmNy+9~6YG z&A$S3ZzWx2WJZ*(J|S%i&?Kse9X~o|xWD_E^7D7bO+SI?Eavw7wP~iDgi8XAf)5t_ z7l3cl!4%u7)*{d4T9)TEFFX6&-NQLIKxar96t}8dUmn|TGq*qzjE!i=2uucM`)5CA z)q1-^brCX{w0GdD13NGGJA^G;QPiHC=?yx|SVMc;G_OrlI>tz(e#U<;QMD zx%P_-n?)uF!_0mdj2_8Wuhu^B?|N(*CgEzp)%2sWzb_qWxZM-FP7IGV`AY{9zy70^4E_LE?;l9Hpr1kg-+cN%xfDWHKU8iDTPsr~QyY{2!6 zr8AHH3voHDhHGlII9qL)INOGFP|fjTTMbTx0U!7!%7F9oUMPT2CT{V%OrvZ$uW&At z?0+IJ^u)qu?;%EUa}^3Q(xNPC5wTk4|2#g_6Qry(F|5GO_f@nCJgQ zRIAylwex@NFZ9R$rmAn=h<;YK@@M?lqNabY?vIqMqp5?-kM+5jDj7QdutY6A{vT6J zj+^?2YH;w3^?TtDxv$-R@6QiSl%ll)qF4kn2xLAkIFqSLI2*~FBwNky0=W%I=M{iY z<&LZ!ZFAFhdT)}~uBRD47l6)wF(@z)%mWq&>Aj`T2`3ntUQRqb*JHtrMY40X#~3wO znO~;UPk=9d5(fyu0Kdy(Iwa}2HfSc(lc?u#mVfV?A=uTvY$=%gE zDVh?YgZjQwxene$1Ot>vzj^82HmdVL!dh5K`)<;WsAg?Kqo#Iz9vnO;EaYgk{HC*A zW+eZ8^E#wtB?8U8O4|BeN#qo{V?*}XA8jVh*@BVRj}8JcQdTfr+3+W?uSQC7z^eX$ zDO{7=7rZMuo;T-do<}g!{DRz%?Rg?Nn`!CuKY;TE?XHZPKMRidb9DTlxAgx*JQtP~ z6#SRhi~hHRBf3~2U07_el@28%AxP911a$nMDdvQNk{Oxs-P8X)IVvLSu9mzkdCJLq z?C|I41L7D>2?22;yZ;ne)6f`=4c3RF28g74>f|5{y1uM~h%NP)fna8ORx)BaX{;9D z=2LNQxRzNg#9er4v6#fdL%LY;J4x?1-$W$fGsw3!h*g-a2y+=^E4EDZpSu@3$S638 zl0poA#%4w&EuO)qkvq!=5lf`tGA^0wz820JI#=Vnk;5PU;>{AtwI;wTN^XRtCB z`|Q-S$Iv2#P@>{iawHfpeHkI357UiC^i_6;NvZdc>Mi;43~E1WGfO$Z5>O8j;O8dY zugi>@!^lzMN0NhyVRqQ#X2jRQ^8aoY*5Up^d_N^EXo&xVT*g1mLe|jkf1wut^>Uh0 zv|X{)QAfUwr8Dj{=M+3YpXwm75ghLun}N>TAu6jbgWnviuQwRbmm#*I%GnH{6qm@pr( zAE%_&pRE1Tf1Mj=ddOIq+~MXOvMlQ$pxA<4oWx&+@T!77)bI9Ls`+GN%|%t3g+oxsPcy ztvRwNPhvhtC^ipvtYF%)S4IT%$<%e?HRN_Q*^ESxF6;@@F&ZbOOwzV!vC+@CRd@LY3wDR|gS4I7RnV%&%9@nu!sFsus4P*W<>lq&soK?$ z4h~Wn-DF~mPBTU|wj7aFSy`UEFIMv&c$yw;{_W8PrP5-Se7$;HV!7Z;oXSiM!=Yk7 zk+K?{qXx!lgS|0C1w327R43boZZhoj2b7S{8v%n>^HN-be*Nw8kJmxYbsz9=Kj^;YzDlMH-=+|nJp_Wb~5IZ>GD?{ zjG2RA2ED-(RWHIQ`h96CJ*b0;*NBLk5ce>BM7AEXj8s)G-YDDM%>H9#s&3Tbmb+|* z?nw21H`P|pcc0S40OF^xV>R1!PBkU{1Nn3t3eCh4X(v+V+}mFcPG!aUpXeORL^wvK1ZRgq0pcMc zne-@NR!LE+6U{mkm9wMef6KxqMDex>&Du93a!OiD%)`Zxy3A%~m~pv31CSqL*lfWj zid8B#h+2+<$JVYM+g)PsMA4H?Fq@r61~Gk59`9mc^YG#C^!x1X4~+co!$V#|DRZsd z_(k8G2L56?&4FFS@W$4kAYUrK!o+q0AMrMBxq)BZNKe7nq3*B(>@*#0>H6ZI@)cYP?5ql&WM*y9>BbU_E(?V1 zXl0M)W0MW&B^pN6rT*Rp>JyN%50{WYr)-iuI|y2!E0#_IX@sCVfVzqqQ%$n*O6WKI z!#`GvzS0WwZdB_$>&&Q#p6F~ZG%w-K@+E|Z+rRU79^%T>Uho25OsH!euHTt##B@{J zs%7jDE}dtlOm8=WUWyKSmLyx3&X_NiF?S+u#&q(4sHh^1Bvr7afB>aH6jwPbpBJE_ zZWi3MSi(3!W1ZL~bpy;Gs3p z8sa3C#6W7k0#2?YOJP!W;xDv~iS-7)qZU3v!mo@Tx5)Fal=3;bbLqL#F3L*edkxaB zmq>gaAZxmbmq;eA(U&YplM*iGUGvJMjK>rF_Efjuf4VW@m-$%>tQ{efpkLMV`6hy96P6i0awT#@J$&I?`4$H5Xq}d)6F4%>$ z$-H^=r-5eQH=7rpHKvqu+#2r>Z9gb>?h~(_Z_oA5ap~MQ9>gnDJ$C0gV7T|F%;h;? zI*&NMi{V>NcJCZK2W4{aK3V;up2Iz99R+f z;?^Fv*Alz?GcDg8JdaoA*iGvh{#ggzJNY}_PkDJLe(PE8nW3I%ka_I=rM}y%`t~Qg z-e1DR@975oyGzEL&op!Xy|n|cGhdEVNbpaU+2y|5Lkqjh+xWZP)#SuF1rr9GEEo~u zyWP516Nube0z@Pg+)=apV387rc!`+`RDj?Jc=(XQ&#&9@fk_Gw)@lQubNKWPTMxn6 zW7Lh%frC0i$8UGRD(YwOf_RJ0vf~9lK?tC{_nK!vazqCJY3SX17YL2yT1H6`$!sj)ZfjMo%`dZpw{%>rWPa^ zk$=U-WVg*hno?7i@n7U)0&kW)Wv=zB$GU85#y)j8mq=dr>=tbmuihT?coA@KLNhTp z>9bNh__1KMhkWW*gVr(bVnN6U`bG`BEF1=XCl9}q3G~M{CUV@$H^co6XcX=T+lNk|j~$Ape}MauSZBjmnh={OT`{!b;EO%|G4`N4BiA zf-+AGe-t4~HPX^=M3pPKcVo_)ntCj%;bl#{9-A)5^g2W?{AI(HnJH_Ma31f@+F~c5 z@F~--pDk(XCS85jXMF*2_kbQfWe!!Y=}eR?zZX0wLdRHvwwT4AIEIE4j8dSl5P8)0 zA=I5W{VY=JsufK?S?*SN&q5Af#)gq2ZweLWDS;I>}{${0t+kUi^3-nY}NFXVk?kPWC&^TOI<(xQWaY(+&= zWwsH11JvV2j`Z*;R0uhi>>l&cmguX|0zD zrtc?~8MMg>W|D##S4Bhh4MeceK)&HyZ0>Vb=o=hECeaH$ii++rE1K+)5AW|iE3@H% z6zX#6@#&Ho;xL#&WywC7YCzW9pqn!lCl9U~B7$EjuE@b6G|pYWs_h^^nI9T%A)#a2 z+9^|8)k3XF?6-o@ES^X~Q|WSe(nsqeJ6LUZT2jNOO1g?*-ypXD*jQ(l> z4Q?SqVa6|Nq|h$e?}5GdRMw$PQw~IKrB_~OxlbehLrpr7io%?UF%@6(Fkb%(H~*l1 zy^3XmYImiR9Z%6Wd!;U%u-k-g-qw!Fx_aYONFmQJSg>9m`kpt` zXM`E5M>rX3drGzPDVP~gDTGmudGM}bwos33PvNZfBb=xTM5d6hgl|!pl%aZ%FbC>8 zg7+$+PJ~?~Rj2|=M#;;8x8l@*M`)SiAXuGZJ}8ZGvt&MY`kq;Ig&LxBfnNTGdy60o zl~XC(M&+z7&qElQC<`;h75efz0g7y60l8ecWRd30+c^hQr8|)iQ)-vm1vHivHg36V z(>F1QIxiweIay5z{06XaUoR>nNl?Y^tfZc3Ni$d0G4;G;#)Jfyo<#8;d&7ApBDU!- zuB6Ws*|@{*PTZO){rkF&YaF{ zfTc5&cHrtvA{qu4DNXzJbV#)lAF4<609MaY{Adut9Mcm+=c-u>>>2G?90kDr+)Wjm zzY)$B;Jy?L1ZJC2Ik0g22X*#EsIsYw7J2N}>cJwHD`6dvx$zR7tF=wD_8<-$8!*M% zT8>aC7clTOb6_SKB24DL?o>T|P0jenu4h}x8WZ|9)*VLfC#`jW3rdJhw)3nVr=>{e zM=u(axyqq?`d8vZ+bz+3exCt0#kd6eBnNK;zb~PA(4R`vJo3%{rG5M@p#Ll1QxLy) zHr1ccA|KxWx?wgo@LBuRXBH5e7l7;MuRy%US>ZfkG!KkNR5UIak3k`E0dd+#ic?}V z4;ZIOp%KAY?Ni8K#Mmb;l{(?cdXiG4ZSEj*c<62I_m@s*Y})Uz2WRA6_=nDw-;v zAg!g2{^Uzh?}udFBJI{=9#lEBrOA&bVAnMjI$r7d(uz+}ayqnfP*jz|hMmy}CoQ$c z8KL=74g|ffUa$3t%v&F5+TdK)rxUp67punRb?sCBJg;$enM; z{Tf+wIgitqJ&qg=kJlelfHf_TKkiK}w0>Ka&hl}vrcT(dQuzsa_gM3-EPIGIAFKhgmP|E znpy+<{%HOww@!$07c*i+UCm=;Bw8C7TNOGVSp%Zj&USqbL*KnW4KaK%8hjw@yzv3N zd@{ru}%{S=jqv-03bl5aKHeH}}90hBo)~PO+8m&`k zj4E`OHrHZ=!fA6=@tY^jx&Y{h7@=w_a$jk=9g^+C=adpCC}vHyvb;BTV`~*VszqGL zk1p0L)~}ROPsg1X1FC z6&DKVC!-;SY3$c6tgB9l9a;!o_{HaX9a-*|@Y#K)&H^s*bnAi57P0w*bO!Q|))aTR zlikqOH-f7-#PVMNAMl0tZXlcRg|Z$XSF?pmZCwgp)InbONT?g<1dAWa<;Q}$Q&^i5 zds8*nNqbdmznE23?7cQ{9?jw2{SXhUo9;4iSevXvo_`vLZK>nFH*!2an z;DNg)_ZyanWjR+A$B2fq^B@7c#Pa5%V`E947_-SGU0ZUf?+BtI!9dTtwh2DjPt`wb zb0ysRWm6yYF|fAh=Y%Ye-Vq)p@O%F^kQl370<4Y-C&3g=i%6#Ij7>7$3ksbVRy_|e zMozH!H_$k5XwIE``7_}aCvh?E56$xMvamkw{?dl`248@8R%spZ{fBiQ3sSR4Z=g@D ztSjKL&v%2&g~Pr}>r>?%&hw&}s9&J8)hseK!V%CZo1NB@hQ%&vtrxI;QidgEwg0V6 zK~*NY8pY;suescedS;0T&#ka=?Z3wwC=`iaKG&>fsFx>yZlo9Z`)wbM((K|WBTZXF z#-^>4Po@P$k}~Vi4_XD9y{IxEY3UI4f>yH>REci?0${2>T(ut6)sQ`duo`yfqZ|EW(avxliQ5`Z9 zPpfZVQvH;7=Jw1^^!eH(zVPqoPqy&ycQEXO9a`L>pmcRtl#VF)G8dpFy1aE+yg6a+ zAsgacrss*L9rH!sT*YtivhT>&nQ*vEJk4Mj8J=eKS(s5M$C~O*Z32Ky(@>Ra-AMmv zCa@H2pc*TPS|@wOc@$4Xs8j-!XF`-`5Wxt>|| z)~g}&_`4{wf^SPnTjEP@E%4)daHgLM&G`2G0vm&d=O}>?k%a9kFbhZfP*A(r!|YW3 zVn?gM$!!Mp$kA9=17(2X5}^aouDkP=fjC?BPQQ`|q*1dNrxnRn$M4;9rzr9(d>N^L zuIZdkGs=5{!3~_dt*jkw;GBT9x)0NCrA)B+$LZK(B;Bb(3PYL!sI!vP257$XN2S;K0d|c|gH@L4g14gYeD?XVXg}%y{kr=RRFB*8 zCmG@N)BEvXL3z>=NDx-21hw8YjVA(%)?rIdu$ghADizJkWKYUvC&?e$e1YDyRxlhc{D z=@?rMpP|}JGaR>%Ad&h%oT3Qh{)`B@OfYd2>L8-yHjPW>@vOP3%k9f2@v2CXq*WE& z1{h?lws89oHK_Y=kOKd&OSySLEhdg;T2`1 zG`4tg>NOZH`Yd4~kBlH2_VgTp} z&~(P>UY4L8Nk8sYh8X(cG00x}u@m9A`xX1&cP&PCZwT2>8m;PQu>ZHr@c*=Hg>5ZN z{{h(f*KN^{5UX6j0K#xj{)Zxn;A0-TE!lZr$f>L`P;o>ZC1iqLX7QH5SbK$Or2H=Q zD_M>V&rkL;$zHn)oBkp5?S9H@%*&_C7l30x4i~NY*Xd%d>}t<*fA`6IU@bd@NB04o zkU5LfNHssCZKyHO7D7f$g7j1oT-s*+Db=TGiI||419B2=E8f{4D#> z&-ky!Z$C@_zxbzOR?dzV|Cl@2TK%sarh=?AkRl52$_$fi13ZNKT!GcxKe(ESjKzY2 z))wqMSNX&>?u^~#%b$g6f{{J~zU5)pGPGJEjhrVr1Dr43ojyE0033s2fR>fVbtxlU z`7Xz9Q+loz`fy#{SF6$fSJ~@VAsc5;kc)C+@Dh#2Z+5+(kj?ETC5tTjhEFzfcW z*>T*@z&lw8^BvBqahB)Qk`&xN1RZlv5+TBjN|!3QylCU7`S=&M%*G{OSqiRB9CeFZ zRs}TP#K0vFF1aKxX+m9eo2Q}x%GresAfH%L z6BQHzr9u*b1LW*Py=}hrwk2z@Ep4zIhxg^r#JAn~?y}wf?%08G#cwyo2dFeo0PnnQ zMb5ePgT;I4t=W^r$|=~h#PSgyU}oWw9&lvgk^dNcT#W|*#QoayKiDPJ`XYz@F4)^)`3Md9p0^7Vft$ND#le{EwWxL1 zfNkK`qzyC%>g%&WS|$pTcyn0zp2eiLF+#*iq9q;k0S4iK!6bYf^GJ-mqy z5#AGtT0A$JjUxK8qoB*h#lM7n2Wt09MG^2cMRR2g?CrZIBl#K#*zV6j=gMokSi=f~bx7*bLp$uc#V z272TR)tt>dNq4Xa3N)fV36jc3H)h~F21|x$|D9g6QKE&Um$V38QsErK4iuAyT3c{; z^tc@Rz)`HTQ zT6uB-(D4==d8Ma`FgmRcYCe*RmzxQdD#Y2#)2`>$~sk>sKCtqxWU+*va4B#xB* z?*(18w8Oibt<% zTzsv(oavX7MfKTIC9|qHxT=m9oO?nQxL^~7qsdt6;7V^ON+Jnuhpk!)j@>e3+7f6= ztMzsG5YNZ1$I$0)<`6GrOC0Ahp^I`#;^Kusf~?9o4M^RW;yf=2YIB>6TG~fRTfo)sXpZ z%ks3x^2xe$O$~YH-Fbmnw63j&MU3j+ZrV)hYTo5`23+Zw7mo)nGQ2%yW+AFR$M#EX zb!JoP2{NUj2?H9mP1}4n>AzPs9MI=L@bG2oe$7gEXI+9>85 z!|s!k%bF<@o60NX0sRv6VoSpv2%Q!7{@8)Ke45VRx8QRo6dNs91t?LcO$PY#c*K%G zwEM+ad}P1Z7`#k^?oP}6?b|{|2A8p0PG&j}Fd}hk{w(~N`O^5eBG_<*5AlSe`VyJpwGP=xS z-9l>0uwmT5wb!q>smq;g4U86)YT1qV_n1sw?A_`Nzm84xO1ryilQkl4r%)}O+GsJ; zqTf|gnnbB5#>9}eXnkKTo6_i61V^WLM#FD1D9-9Xngwec>Z;V>^bv69EZz<7KKZAA z?&su)PA;KoUeqHO9qp8mbIdK>3tMI!vRjrMpT0cl%%1P`f|z|(A9CM+HC+L=XS|!O zIa_1MU8L5N4`&L=N7!t*|H$28c_;-)uJ-K?*3XB_baODqPoXZx-v(tIJdx=$RLac` zj^QBbfZQbQdf)nBJxkm&zP5to`pM7RC4=OK%t+k2zXpKl2hdB~0dG?Dx$cocO4%{P zwn*4fU&igSX>kku2DiBKy!D2>_QRjQC7ulVa|0xIoRk*XM%s$)L)0g~XU?)o-REuB z0|LH>&cY+m&MR>VKj#m>uud#@9It_!&fQ~GodS)a92wJfZDKVVjfVYu#i;POJZP;T z=8ou@3Z)(tZC>RXBTR)UIv9B3R(d8fSA$%DxzZ2Lpf-W8)c|#W2}m!nRk_zzpi`}v zoRCkm_W~i8Xjd7rN3pk*&?nJPUc6JU7aO5Rvv=yXMX}eMfKR!XZ%`NLnfMy5HmX&; z7jUo(NDbiy(hYe(&+ji{C&)h^@U21u4rr*7{Fp&Yauj=fl~<{&Z_hbe39Mdh-vy%^?9HTYeq&P0W=gsaUhpYLH;lhWv0z^N=#-X>@zKNqGF*i3` z*9hu%)UfBN-sif+)~EGLXVJQXHp6B-!XIh$#!N`V7h_?cKu|=+#wVd`boRjdj#Y{* zwwlEg??8fmgsWhO*l0`S$8>l8dmB*q7+v1#@I>M!)NUXmMz6!jRGQ1kLwmegSPc?RC%M*aP_?d`8&kqFa|pxwiDl>Uh3Vrw4ww2 zpQ0U8pVnLL@Qz^{%nal%idU~r5K`+x& zg?3mWGdt((Hl)UFqE(qSoZob4PmeQB>uee_js^W6m1eiCb;mDrKl{z+1UF=Nx>2lG z^eFvwnk;c`mY%-<8tRR(+^`ol$q{3HI-liKB*TW80FBA#!LM)}z6{}c!n#`VPyEO4 zlMmBGpZ6}g0_~PNEumN2Ro-7}{y>QT{Qb)()%^Xj z0ztsp)nwm0a>%k;TQ88DWqEvOAcsW4Wi0FnZA8qyrb(l2UG+tl*8AgT&L>+px^EAe zw!N-?b@eP76KL|g3QC7dG*MgR`JIVg3d>E(M1_qNUvnEM9hoKD`8=sEzgq~uTRVTU zHf_DyY@b|Ck~cf0cN5oo=?Z#ApNS4Q{Q4cV#zw(*o_xVTrg->nX!$FGa+T;t9t=NJ&IX76ie3i88V_f*nPaO|cVFnzJ40Se{NnMM; z@go%GRXfMFC~YU4rag9RFoEN!q1?rYhA8QxP1#x~6QoM)NGcL^7BFYwD9a^VH77*; z8J1hu{wz(@@d+tT#lfV8L}9e;twAmSvWDvU`|bJSk}qeLd-dJO$pRLgJ1N*;oJt7TViCt3<%H}*ZXELjex615xor!Wd3}*8~GOG_? z^D?V=H?@z0x85$bm4NxIq%M6%U{d`eK!HqvdMcpXC(`V85C5OVNKm zAtbyE+`*tJKwhZ8;vaJJJwg9_7tJ%w8Hx;OGy@j%badI8=&4R9}O5S|=7h2RF zlOEC&Ul9t0j}~cKLAL4CPEogWlloicOqWVg_PCPvKhmQ(70E#B_{eVcLaWp}!(o;~YN%$a_1 zJj>LLzyj#jp2|Ll&Hw;hm$ z5dSpmaz!jG?ZsI4YA>u<6EpBznFvz?-~Irv7R?y}#?h?b(0jV7ef)hRP^Z9_e$wHe z==8K^8O3xPzn=E$Zr=UMe*ZaqT=Ok^*9hGT)ox?b7;2EV*=c$xItp2&>^IMS+xb7U7!WN~AC`}s}bR*HaKZT-{|!X!6}Wc`8I zRe~~@-qmb^^EgkksQA6#;NQ9TVY2(FtC@M3ziT-;DD&U-aYFjyg*#Coa;KHJ^CAa0 z*=|hl29&M5UxylLerjYGtEVrPmW1b9l|9HmmFp7u0Tp8N20LwW^T0O;SZk){dqt1&>wCXV*)8-N4# z&B57%!Pdjt!j{3o(aaw30f1PP9gN*vTf!)nlyAYaMVz@P=v_^As>Jbmy-1x zQEilDnwl_zF@-JD4e1*-(I7BKW*DUspfDV&nzk6Ko;f~2nrvQGlb1anwQ?R;IS3v` z4_l@SjZ%YX*U&U0v%02NE&Si#r_#7ar@#E(Nsu1rF&-DhBAMwH6MmwfTczon-XmwE ztakPtsj;W5>Kff+XH?kgTew6`;@EDP-lJ!9Jqe0U&V*TYgiQu59}m31&aq zc?x7UP+^qakstx=C{eQbKxDSJIqxY&R})#O!$s^y8RSbrZ9*j2!C?yDIL8ftetx9K z;SVQSgD9zm=u<;Z+}qdw+qs}tQ9DV=py?ozP^T5LCq;S_5=^I3l4FE>r{T2ySXkz4@JrIH>GP=qIAThNuXncwW<{1$vA>@pTO zS7LM8-D@U-H!(d?x{9*lD6@(c?w&&Xi)>!2zrMcd1C^Cd3wxmorX?kVGL$n>n&zBP zyM)wwX%K4$rG1EbnpQ9}n@5M(qW)BCgglNX_~%f1-AN^BqYbsz>Z(c^1a43#Vh259 z`YxCHYDY7qJ184GyitP}f%Mxv`b8`6+*U)kY5mHsGG*1bV3lq&I`M27_7wQG$v#)HT&YKh^%E1_dezaNB@?|3Fo*T=&J)voJ zq4>oTq}+rnC8&PQ40*?QX|VE1+<2pf;gYxbbNx+q#Z45QHToRFjXM<;O#w4$BOs<3qdW(4@T~jv)Hmn~bG_ruG-NAue{|M4A z-e@MMob0W2Qa_34+jZ6ZgprHT!|`;&iUjc!N{h6%2TDHjRwJ6YUbprE*f^KqOpZag zv2#7+g>TSGARj0%0%-**nh_w1mb=*b+`jA{uI`t%PR$F=t=flZ<)1@KLuS_bH2G1K zZCp9opiIbHKXOO52zf(qd~d9So>6&AZa!|TgE>H_$vVHmCH#VS#D+0lIvp{)KH=tW zud~97>LKu`DR(cf#GyXVrasq3o`UY%1>Pm=8GU)!BHFmpCR&w$ma#6Z0o^oW>5yF3 zDLki}dqh9=j&$u3YuAtc^@BbEc6^c4iW#SBV8YJgi7j=roVcNcBTlOkxq+Lf;kx%C zl$trxj<~^-%>2>a{P&O58a3186;|`sN$8q(&Kb;UICCHM(%z|44#rnK$1^m%_EX=0 zgp47W%#A&E=8FifEVqCUApf8 zc4+pvru79P|F!kA@?}g(eTf|B#{prAY6Fm#2~M&a7;pDQVnWmFk+xRRQ2AK8uEG+X z`;r~0%;hs-MRRne&gHjv!t+1nW84rgk%wlR<|&VkYG#8i3(_?$m+n^*rAlWtd*^oF zQ4BV`$;|28&4+s~JkipM0O2V{ZcyiGP%(6GkC>ph!)E!Aq<)9Is#U=rAURp@A@Mw| zricCDrGeQt4@LO)-4o>Iw8Oj3`n;!QeOKg%fR5S=S0_Z&UQG=>^Vdy9+0VMF-|5jk zM`8jnf8Q5(^8@_h08r|D{5R8ez#H|C5=X_&*uvSt&G8@aRB*z${k$S#$d}YyaZqB2 zGW6lngR~A&zOYsRqWl@DIs)m+uvTqd=7KaHR);gn${jKG#?>B^COdTOUC?M0( zeTRohT)?>S_I};tn*=8%VPvS+#bKR-rWNFHeFa>DSqt8{X9*95T!J9DQ5||Ph6o3) z`-b6xS-`Xcz+8HP@Qy+E}1@iY_|4fY@(pp!4E@W+gSxPoX2gU~$A`ua_jmx!tg%yFTiy&15K zvxkU9>Vj4mf_v1nPiBDYbp#e%!-#>}J*KPb8TXprCo@47T*JaZ64O(K4)8hv1flQ74g+GTJp)M^t6MCi3{f@`+&o`tX=VxmXve zXh2)IU5k>*P!ldJWUJnEvwTcj=N5Rwf2W?Ut!Z&;Nw2|_!{;Qv$a|G!nRam!zr*x& zYcspmd}=eh-Tc(Px!3T+K#O*b=P}La825dn%VlcQ6w&$Ac-H=}2X@nbxVs}F;1mjly8e#gV9mfJWIih{>*8jq_#X*3?) zcMPz7Jcq6a-FJ^u`@Z|&w>u_{>^tD(S!m_vz9CH4j{4%@&@F)^92?NJ7$KfS2 z^8>)#(zqhS;S9Mb15&OLFT~t(zEFN?p5S~kzF^y47kNF8*!oD0X01tu^rP1=n9vDMgV`1YPB7YPOiiz(xf-%l2dcD>( zhogguG*kZHTm0WL4J!hP*=-SQpN zMi{ZA6UvEiKIAELP8BJRgZ6rNV-4N%eZ)$AxK%Yyc@=M~U}0(G7_enn66>ap3}&VA zAL47T#cmgv6dKB$@`ItVR@IQk+o0!0MF;y%22TjKsK zwtgE!McEEBF=uiw_sT}0G%D^afAa-Jm!4o&09)BWt9LXHMhlgin46_JA#160qC4KB zFW0RQ0AHxhhFEgZ*#Fzup8BA%ybSPQqyd_n|F03&`e%d_?NqQeP=~)XV!?E6j2l_g zQQ4Y=Y(z2&5yF>Hp%5WU(TeK24beOI(#=-2&~@Iy-tu#D2}rW0f~?HfoBaj;1CKh`+q`q_oOJn8;ISq;fvkk<4e>< zM?rS?7HfOvhd2~S8p+TVvhgm)BBhR_RjhWYQZ=~6PMSZJuNr@E@z$g>8>0e>!$_5F zxoEan(I2ekX8!i^CQjIBv{u|gg(z963L1F2REL^Mo!-20#cDIR$zhF7Hb1DoSxX&a zQ-0mec#@TF7tk@7ye_FNkj++UIv&SvFlMvFmR`Ta#T942#GKXd7VsMKnC!Z&=%UbW zj=-Eaa(o|QY*l08W3Hk;(JUna(v@h}!rRY+720#z(%H!P+!Lo7Vtko@zEh#Uf0NPoB=_Iw6*5>41Gh|Z|f8{cIzfo5K|C)2|@jmOd zj2@3|Hg++tp9Rkgm6dl{NmObW`O0!-sqUv9-1g}Uq*PH|Nl1N&A09;M$%}rQcDHg1 zq;7}kT3Oa8_dO;Kwbz^Kk^%FJ;+q!vXXga%M~~}rlByxQQ`*t@=ugxsgfyyA^YJdu z8`;Qko3SIpvbuqhJ?2G@kiHSL(O&Q4c?Ga5QuUA+vFcQI+yZm$Vv8|$7<~Uw=xNRT z+|FQRiLM4FmI3`0bCDoV?kc_N&`*);oL|XTV=<`zNqZ(t@|#nA^(KjXxB#Gw!Jpd3+q|dv?AUJ6_kab4nCp>&NO z-&istg7`&@-pTBXnFA;71JgwyL}Bn+g?O&@&;@0#lJxrL>)&%KMJ1~xE+C(V0}kzf zdi?*EQ~&ZJ)BM+8KDJl7UlCF4n$;?w39ws03FE4;oe}a1H7{8_NVRBorMgeX*G@%0 zA)fq+= z^%bb6@gb_TQt_4e-GTbjHC%8$+g6{ z+Xx~TLXa|jfC2OSLX{HSG+2K<9mwvl5Im%g&V3d0Mfi@5XHQzTY;w586sUd|o?kv_ zUz@qd8hw(WsJPP)1^gcU)|}`}*Wu}^en|7Us<>}8n9bgQctf%?mF!QFn{^5VNAqq> ziObHQVqO&~kuro3sjEq&l8sD?gAa(6j5VE3wl!NZ;&Po~O!&O&by~z2v6&Cx+y5+h z{b9u&)N`V2Dw_M4%7J@H#c+hFfc5d#yY-r>$OIdujOf!0zc&}{aMf6PuMT@4j_d*+ z^OiUiI3B3ID-myCLDU`Vj2h1Pn?H(7vwOp1H4;= z<(qJG2dgiX&N@P4wnTX!@BGVn_mpgfqi{=~*pJOMg-uZKfVunC4TSz!cFc2gAMJbVI zKgxzpeGz);Zi~m`XshiwGwt&|XZz2$+OS8^_*Q!WSVr86KkVZvAXGC5%HIuGEb|7c_x2BMs5awovjXL8Uln@z%xnH%f%{O3! z-Hd$mM?lZ&c*AfLg01kg$pm?m0yiM`8XQ*D)7N;eTx_|IaupIjXHn=L-s~df*Aeo0 za-%|d6NaqX-7g_9+N*?Jr6}&9yJwUwZjtL7P($%(4D6u~`d*Wnyoa6fyFauk+*8)o zJu8uQ?5Az+*M+lF`e>pD18Fmap{+t}tYOAo-7B8)elK6Pi+Ug1r}#v4yd|(-OAq%* zL+9)@psLrI=O*{jEvTgSt)fOyVzp)oi=bC_jslsDbgq0|O?5-dMF~whUIhg<@ojw< z-8*Y~^uD~On>(C-xWj*+`tHSY?GA1_YQB{5-TE)G<>5HkDDbG1B4T zNF+6bf0O`Kiw4oXF!w8_FXvm4v3wORtCBnTr%!1#78f4^)2nW0K!Y-NYX=dY*I-nw`rw zRaZ2d_5}v2d}922QJ^4%L`?wTn?C^Z$bV$-{x5k%#KG-f?A@k+C6gKtJCkL5gXcNZh41&r(`U@LtzLKJ8l%}BWn?5;@(~vfss1j~twA3t(%Wv_D~h^bXdncb zo;|rWkP@J#qLD1`u-bshafqxOr*DfHf%A2omt~wq;n9+u&Gti(?sKNLBdu>pQTjPv zQl$ljg!-tRb7=AAC)+M7Ad~RW(IB2@zgC{H1`VGJt=e(*GWWw~!Ek8sO<%kmOH7$8 z&gxOqC{@}!XjG_a8Q;Vc03zY~3>VW?(#5@R%qzp6UsOCV!6TmB|V8@;3On8Hp<9R+7mKpcLnM%Z(gr?8Oiug9mhd=SK|f= z35V99+~U2Ny5XXupXC6(YTojvIs@JG4pmu_WkVf9tJp==`{Jd_e4dO68zEyuCDT50 z$x8(roL|}q&4wzm&fbtDSWZCOBGaJSF)ksZuy)SK1j?IkXr0md8t#4 zDmhgnu&hsJVI*nTB9h}F=kvFESr1T1esi*pa$wTWp7HZ>{yJK?fT<-we7yk67ntP^ zgpIo60w$*&~J2E#z{_V`)GlkTUOFcifsddGv6x za@)%hc4$0o5f(L_C6p82!Sx9{)PjnvrV%}3)^fZ;&2YogLwU`BD9@_*KiFrk4Y|cZhC{oNRVJgLK z%{%M6!%OQT$M!`=%e%Q#DObTt+nmWTx%(b#$uLC;*8%N^Ny|N3Si^)fL z0ax2*3t@g@z&6YtIgek;Qwuzrco|qwlT(h5e3rzr1&V=x2Qf7jW@aYB!diqyGLvFv zHAC}8HAThR)RYqc@DD(zD4#Zn=WWk%4+$FRN5$7$^v)V;K^x-v{kNqOi4$Phhk%@e z0P|n`P5y7r`M1SRQR+5-%~dx!NM+;U8-s!ApinKFc8SXDE@3K#bBS0BHSwEs_hNNJ z0=x!BVbKL%IXy{Ge(pJYU1dQAkP0ptAMro6S>!ZKxAo_I{c(rf0s7#q z-U|-&#U<(tGXVc13#qLk>#48!j;9RPuU+P9Kr~x~`0mFgr zHnYrPwe9yAnu*8OH-oguM7C(n*x5*%{ay`h(H?Ov?COTRitZlJV#k2>& zi3%Cp*C*y{R4y6%!HZV?^l6>ST1O6i+lMHy%dRZrU1z@XDC=Om%t<)e7Ol5qEqwiZ z72<=r{Ux^Rx2)5Sw$3ve`?>W7x2;L^Gh6ruTMUs2BtGe zSFa2u?`!uqJMj7{MyZF)ns9u(fD)xaN{YQQ55pv-s|1Q9`+&cWChyD%xXJS#O9g7mOH`Ao(a3=Bzp!UM4? zGg2H!dDx>W9bb{Dg<+G33S^y+UF52V3|*D*p~1o4?At*Z&#FeBqwSz`*SL2T zs9yb)6Gp-qDUUvBO){KPvbtwkb<|oUzB2Y zB^_YCjqardiyAvf9sw;)&DpHFF*r<}Z7dv6ZHyBVh==yfSYfCU3?&l`Se2$V=;5d) zYpni@nwodl(JSq&MPDIT6ur44<40z#oRlUcltq2KVX-*ObgPdZ zCduu{3dG;?L1IEbqKj5l-kKS`D@d+;ze}7<`ZRtB-6OW2P<8Y6z-mq8>*NB{dOPA7 zGHnPl5Ft0Zhr7o=ENch}*h3@o=wlI{5Qd}+`3SSkB&fGIW{{UmpO<7Iq+j`l@l5ja zMYBF6a^u5u=;Gy>NHD3pX^yvik)9M3R}RJ58)kDu<;#-@{z^aR4<>v7%=lp7*1RSB z#XKLr#ep>b@s-Z~EgAp2NN^J<^^ebsXvAhnsHbc5_VB?o)GM5z2;H%n_7Jm(fZ)+a3 z3PzALTyaI+E2>WFRyc_0HWB+H%$@)dx8o0)8XpM+39H-)K^@cFO;B*0(7rj;3q99b zpA)lZn?QNovV>ekmIEas4i-{3$Z4x4vtKBYvI3XOgs76;iU_&8I)Ma}QE5 zd2kDq-mL;-!gfrEUxFaz346)OdXca!?j(~A;;5yh*hE!3NEeg2%Q0r4l_u~ud8I&q z-vH6WxXaetByAO+rX@77d=dP6d8U%ytQ-YMl|%ru6#DBL7uvK;3rU+BgRZ?B?IHlbIfDPe+ zd91fBRYuw*ndbr*v81-*+GI3Ut7p`-ZR6}Ugwei>@DkNvm3hfIww7Nm^$zG2SM@@R zyTQe{GvB-AHNfx^1%rG9iv!sVdn5iSv|C{*>=SMiXCdK(Mo zLd$ph*<|mY-#sOhvn5?mc~&E zDd&W_x|UO#hEHAlkEyW1j9zgRi>rsu^!~F1}S6!UXom#0*jA$ReA=lz~lN4idf1xYU?!X0XTJtD!WWAgND*} zpfXt319$N$R;+jg4BA}hT;JvRx0*#-c4eB-)@!(%L{_fjF)||D4VSZKpf*mzmpIBO zmHupsuOn=>tGMgX7oTuSb#FuNE2cVR9@tbh3zuZi&NT07R>(o9JXDFsh+b6Xa)0lL z76y8Ua&jg1Sb_&$hRPqnDXz#)6reiQH6u#j8J+XmKosW?Mfao&7VgLV;*#0gW<&g)FU_-t}QG|tsbAJRz15+{* zaw975rG}bvA&c5qMRiHDuU!N-z*Fo1Zv;Vy2ZA_K4y?_Pq`$g<_v0a%JYIf>_`zb! zrZ^;yxA_+?z5IRQxyumo5!{Huu}kOx-l3C+0aHv!GFL}Fy>>XmMqLq6$sF?v3q5d_sgoHhr{q&97oY}N&0sWL81J(u zNeuCcOe6d`m5HSBj7+B3IJ?z*Or?5)E6=H>f%Qm(n4s}F)SuNvW@!Lg9cuVXPyFOy z8*g-B04v&pmz`5+G#i2NA~&$yY|@=<;j$v}y3TfGppJC>Y!@IIRa~;ILfd6eZ)W!g zZLHOYwZ%|B{@d8kW-f@85D@cx!1<4xz5%uOUk{3$mA##jr?`>H|20ea*Lva0nx&k@I6kU?SXEIngX7t4jn;Xa2iW_Uwf<% zJ-JQ&_qT;v!^0+X)%(ABAY8h}7s3F>02%;{_P@kg1TeE!aWpb9(@-%nvIRIH{Bydh z{15D3g;FMNZS8G#X-Rni-R6Io$8(5;q&S4Z^iNhSwi3AY6ZTI(wF~}0`G@}x^;lrc z(_$SmTzu2?c+2M~o9kHq=sjlI0EkzJD-;$Q+}$}uWnK?>hdq+-}h7fsh;N#FIt40kFL^Ff*Ac?Of3RCqX?ErVl8rZ#58 zK9X79Pc%coeYQT)U5*5iSSZRizeFe|hKWQ@CzR(g56SO|mNFh>H70?N4# zO1s%rj?45j%W6_jpXG*P{>b8-LB89})r+1rjGpIDA9v_<01kTLkxK3bqd_ zlMDN_{Jk+0ueYcI*?{@g%k8hI?4q3GS%woX_8S=-J_Ux_7n<*#BQ6ZL8{@Qp(j|WH z&N_HK@Zf)DOZe~161?70eDCaYsi{8{&^cvLf2+tHLsxKUsc4wIw7YPBbZ?v5IJo21 z>zaCMZWeb?scDgjb%Yu75bvvNWx&0@1q)rkRTK@3s9j#)GEzJOBeG;iPv^$rcy8yd zW>0D9ppg?pQcYI0y1202h_8+%DW&cg*YGIe`7|LHLbFP)FG~ZX8>u~ha(CkZwpB^5 z7n|v1%`hp`2Ad2hx36!hD=V8{OoAuZxUZ|jiLTlPO>U?-v}$Je+MK-1vNNGvWj$K* z(baz%oZm_-W)xF7IU8bX=j+O{eHlpCktO1Yws#7UScJ&UZ+bK*7jMVVl` zQvY+bFi|vzJuSa&Zy>^nXyq8Xe;(TGpixkvwThe|9awBJkEpuIg&GYZY^^|u{v!sj zyOg1DXwlMy6SsHj8$CX8|Bj=r0c~{%cBkfgmHRc0s?k7a#&uEd2KuxjA#P1&(!0APNE$e@r*ai8mK1R0H`DZV-f( z|KS{=$C;;9!Q>3xx3h-10&IK2my6R~+1niyv^F=#E*<*wrxZJ3OUDLzMtXR`X`xkx zlQ-_B2Xx2WbTPU6&Wc_q{jQRAvO)FYpw6V-hRlS@u8fQ6jDm;4W$LLL5;8kuQ3Qmi zjZI46ST=V}kHrdKVPJmF6rIJC4<9PM3! zTFJsqaS*Hj$294J^YY72@7E?bv5@@lOk}}Sw4m1d7N7<<#B(*=&~yDSLu=e%4@lJ zFz{ZN|0*Ej5j(Zz=@N0!I@NP!6V?ni#^CA;`s}kUkvV0qsI4_@ns0iL;_*x8Hz~7Meqtrm4V3 zg0)`4;X88ywiiozh%aZ?%{T1_rb_z=h(ONuSZrzWUCb&tU^P4(!a6VB{`Xa{$#JJYa%3(T2XIXijy2m zO*&_%o3|9sE+%QZv)S-wo?W_27!^x^VWla9!m)_^!4PI2RDR>r0yO!_N?m|3Q}$xk z7UWMl2SLQZHc}#_ZyuW>qHh$dA*^o}t0AIq5~~o}xkQ))!*;rh&|f~4v`P6GmdGEkbUTeQS5ZkhE;3_p$E=^T&xf5ow>Fs`BZ)CYDAh^ zD#`~+%@bregw(2YkaM)mq}|6nl0!bp3X?E_F`Zlrzbrv-%oDGC%LffAR4qb!dKd2I z7Gs*V#0al&a=+CRei7Bf3Z>8YvtgaZ@7B<3(f%MzYeaMquHzp4^;p+~B&M5?=WRCD za{Y-lfzT5jf&kag$#>{k;nU*e(}(! zRMbT!dC#y%IU!3dsuI)E1T=XDk}QQW(5a5(X&Mwl8oJu}b94yjuDzv;DiH1RH5qKOulflh@6vi) zFKs{XG|~+pumu`%M|Q%1fp}_KT*|tWH%nWK;(H3g(V`nJOj&M%6RYDAeo*AP>U}RKtXI zsPXf;_Au4<`3SDLoqScBxL&p@ChfTOLWc?}XtSy*gqBqja%t%46zbO!vmBd{rUS~4 zg%)9Q&%~%P7UJv zbA|I7m`lS>V5J!xWiY$cgHK3z_(&6JC6=k?qULdM%p)U)jK%_afPMP$oIi=pBl;YwK=NwQqx;#qG@Kt1KdFV0Oc~c$a)rgIn_b*0L znyvG~FPP*EvL9#24IzR&1YJyJ(yZia+9rE5rb~LM!W8#~bCD!GI1)$wagVzrAFKwa z6ruH5Q;OiQQpS4qELtfSvP-9wUI!@>!vz_P%)L+0;TxI4SBzaP>|)In2q(T9VC*Y3 zWbrX751v_7gEo3}IhI|%+y@QK)%YO#RZPr8NS_u@t2 zKPggc;iGn?E=hUYAhUI073c#fQhF1{71k13D--+MDHL*dcXE>CPo*}UBVEn(!v|Aq zk=+`ol{iqSDklmjYrXxvMRfzhT9J{Q(1`b}H^OZ!1DxsT)T;{~#~$ZC;qK_U6N2Z{ zXfvlwxn0gqe@T4zqVOD0G9J=Um+47H-5D%?u8QdUh&%Y2NlbWx$h$Vo6$WmSv_RP7 z65i=1c>XWAfCGT1^_Rn%k?p_PX#Eox0D)0Jz$Ao*Z;Om9L4Wh0_)nAW-t+gV>J!nw)VW`Lh-zO?I7^2 zv!{V}Ze`SvBNEiTex?6AcoFOvtPESj`&H-Kh3huKvW{NGWX~BaOi4AgaCINM2XP!I z|1s7bO7-H4%yJ%Dh(yASRLOef(ixmhdfk{}X75YO1h&YVBsEsIxnweeWVq8AJZOJD zRZ?xflEMq!mdi+kZM)x9V;ciow-femFf8Vi+;R)eRA}C%s;&ZMdnJ1mOKhGinn$`Y zT+mkp>-to9ZBaYQd`v9$^0{`OJBxB2Zg?{+shiihA3t*5O-z!rNOeQ0nNzu$BUX^H zY8@pzdX#}h0o0!%6d#)Qk0u75Ya=^^p(0sz?*a(o70x=Xvp5m_ zlX1Tjv{1fXn*#5y1_J;Pv+dKeWb188@BR5&F(ji9$FIyr+=N(1vCNENbq z8AgXsrttIw{3P;Sf)A!s+k{KDTyjOR%qp#y*f4A~Ay#;yRkP54_@1{eNV&}QTwlosCpuI=HB^a=32{SDntFU`8vDnn`>DAk0iM%y=q_NF%T{R zk`Qy)H|TaNgM~9^sY)9b(6++JR~Uz!$H(QswoLh9echk^65~$(F`T)BmtqBe&%@9t zXDqU5++HOZ`8vNWPK(aW&R`sv3+U-f0qVwIM_Ht;bQn*eZ)FVcRJ^^U7LuZKvAa;g zj+ZeT#u`_tx@s&1L_cReso%fjtt+XsZ9p{BTuBC1ho{~|LZib%FJ~`ZHrJPGyKwKy zov4``?b5lDqvcHp$h}NsNGPsH3}tblIZvY@VTdi8N#K?Qj4e58tFN4k%8(!T<#jU` z4tw#SEo|9hvk`O58Lh}fK+}qO>0A%wgQ8{S@UI5_G}EZI5}Jd+xD!QsbD#G=75Nmx zmTVL_m6ge!c=1QGgF0`>7&~WmDSAXA`^`1|C}_9z7>MUFJ4M!~C=LrIyr3ld*ew&F zcbRPO!i9un-+HTQv5wzA)^gC~NhT+fWK9&q55aNJTO&mt^kWwbLW{T~u7?exn)C*9 zu7Dp)!6<-ox@3qP74Mh7m&n-z;%PO*J*(H^BpBs_{2-VMzkAf-NZ1Z%9 zqwk%X-<#siaN&Gl*ZUUZ|NNc+3!}!ZLk_3R&2+uFg8QFU`>49E&%dggb^t$P_}{Dc z|F543nOW*N{)bi}Q9)Z42{70^Umc_Y%nyQGARP3%ik6*_Vkxo8yxL&cZrP{EL?f7K z+}^$#ZGLO=BI(&@ns@z4zMom>M=FHKwwmcNo#ipr$#(xX{ha-6D@Q}-WpR0*@ifI z*+ACo)H;sa+Bx&`Ek(?d)M_2M;foHedZ=*}g9J81uSHAGjO$k>QR&VQPkp zvX&!z8#&IqJYw*7dQ`GYzCbgZNLeq0625*Ji1xC*L7$2+y;F(qO~6U!)L}2(LtpB~ z5_nL>g;atsn~X4`kAwNwNu~}eJZ3X_Kr)7Ae7CL?tLT7W9}?3X$naBgdb-ye-@!BL zqB@~f>X*~3AEUBTO`aN>*2W;W@8mv@3WPe5rSfRS{2P8>f4OZy1smNYtL^PU7r}F) zOi~)M!Ys=xk3?ki=a2vCStW{x?IeJnL@{9f!#wl<>sfO4MvB&Y|3S0*J6=A=VP%!2(X2|d&j&m_yq?p;m=D_ zHAD)x#To68;4f4qs63^~@$l$XF^=F8=U!6Kd@RljrPZbsTsU@GQqHNNCr)=85Au|e zafaNEXIcD)B=!Ks;K04FxbhVKl9~R~unA z8MjIo@0)X%n{lQsax(lfA8G(^?%Fk@+dMzqgjS$#Z+;5vmg&^%pNY=M!N0?_#Y?&PbD-JI_K!ZFP0{gX6DS_UaNXy1=bQ)m!&&JdY|I3R?woQMEQSmnX_FAd!OF(a~iUPK`K+NTgDO)|l;l!L5y@|ti$ zuSz~#EOLYI(BTP(a=GtoS~`WEX0+WhC?JP1F<60IWD&FKUaqiDFs;qUBVQvasK_P2~$#4DR=)2#H}QMz(&Qe~1@D2(#T zOgSw&?*G$zPG8ahFKr-LuBntvue(ZOR(=Qj#F6y}^YP`C@C?NTM(CL6z%bsbyZ+dJ zgz2GhmKf2m|6NJg1QA(<)WFHMQUFTjh8UfTWg4$ub|UcBYnYLBZIM z>_fD25r?>uSRXv-UM}PoguugfpxnNxH8HRZ$^4Y|T7>a#K&)2LWkQYomyljw_oNmV z3|b)2un>|Y_XOz}qeE$`);8PdtgW||RmlB(X^<_C`1)IcYBejrQV zC$9>kxp=>VfNaI5Dd{kSOw4Y-pB)_Fg6EY|j(r@1>l{-gbqi~qh#Hid__L2T>g>=WXDo~3%zdRol@L!$x0n(&{EEp7z>AN@NCER>hF0VIK5 z=`D8VKdk2AatgB1G+@K^5NKlAtv3=^O*<`C&-q^XH#kt_OE=!~%ck0t z6$AMMA`Uaz>N%NgjHl?lGrqe9Pkw`;ese|62|oOWQ}LqqSUWVc605P64EX|b#A0;)RoP9jEx-2v8odD8rZg@wmlpP!jDNV{;s^c?lxc`wr zwg=KLkY_#7Z+{b}xs|VfS^4p6kYUAB)tpLkHaVz((8g^_QBSz5ys>seBENKRtTJq{ zrG^m3!;uY9bbkUR1Jh0!u~&qRvaksSzD?@12um5Z8w=$wJO+9)Q%!pspPktVH=J#b zh0UWpq*#z=kLJack;|D~NsDaPLpwp;*q$m1jxkpCLdPdc_{cZ<5tUU-=-6gIS0FwR zEFkxH=;pf(!shQ2j94jvAj0r^;=5vANZjH1J0>nB zrl#(^s_~}jzCF#56NVT5I0K7d-xj1tcb&RlXH-H)^ zkV}@c2Ki);^F9!xQ&Hd9jjVYU4X}P_>9vnr;nX|odE7jSiP_xPYty1?Q3wn>eH{z4 z0i|p>>@g@d1{FNzV01+KusX`KaFI}B3$QJ4bJ>qA20=PxQje-y7*KhZ$1W@Ck|oaq zvtw5pw!W+RJoh%CwlRVboFJ;bJ)1&qZnd48%q{kq=$n!VDf0R-2$pNm>UO>G4 z!{PR?gH6E6*x1Nk#L`CZKi%2L|7638NvP%sz>OuocO)Q@kwIX21HfwlzZxFNxc!Wc=tOueSORFX#P4(9O24|i!*Cxd!9)<;&Laz-g+?P0hUq=r_UFoc~= zkKl`J%u!3sGMx(ZbtS@iJaiRu?IrW};8t~dP4{|@*~K{ZMVR^;BkOdSMjQuT#))4I z+ZKuA=0vm`)rku!51|CD1{^9k{(8jCGF=II>nPCiX@}t47kJ>)J7BB?^J(k5&gmXW z5e9M)QPkOb$_|}6Ti#w9_4ikN>(r}n$p-#&t$UU_dpX{ zpm}JEyNu>ji9bpEApw5pAbFZt;B^T946WZYW z#z4{kImz{6!@=>ZG+gefTYkz~UbPE2z|~NoF{65c5*vWUruI z(Nw)ba65vbY_maBY|rT)N9jQKe;z--?;x+!EbO$Ow5|}ou+0|uuwZV>^qt&!Gh++@ zw-Gf6##dI1SW-I@SoDm?%y6lu)}aNi^%8hI&TvTxkSU~MBZrqx4C|M1oC+J0I#Sy! zUv=wkPA!Jjprvv_JUFDC^iUfOp$~YqHr&gF58g%0xYG;s#4ne59)5Ll$qdHd0I2r+ zuDV$QtxrKU48`d)itLT;euVhI!aK`}2CN=T`i+wnQyVq0LjcGGu{-^AsEh(k>LCI0 z!w=rT4Yleh&XnbEe>3H89Bll2fEkwoQT`937k>dP{|8#3QC?aWnIGP(lkr`EB0w{1Gn5*`B3oCTW?C32b zvW4=udSxQA0%vedA~t0|#A36eQ#s44DP($>wmRioz&YTSbOjfwOn`)0&GQ6@Z2BdSaDI}$~?ZUUIOxsG(c2LNG;k} z1@;SRFtMNbMB-^YS8rcKexbnHlgS?hNI zIS%^sN7{$@OW)%3yfhv5I1Y!m#njjiM$a8$)V))1d z(RwX`exp(uQhcwn?+9KqU}I$#t1dnXZPzh~YQB$y>K0cV9LE#f9@*_CfZ^)uuW$6A zlA=(g%u;71{X)pmw?fBviBZ)Ih5MvMPQk2s}2JMWR6xQNCgB$kfX5+3&rw7v8D&6J1Vl@`YAfQZHzr@%>JV3~H z6AL8cCwU(y`#lF&*)|<#sYf8JHEjEKywOMM)+blA+@CHB*WjpCH+pEtI<%Ws^+q2i z^PmfO58HHfL7R^2HZvVA$3zeLP?6M+U=POR#UIVs=`$f`Sqd3Z)?sj?Vh>BHatawa zqfF*3h$a%C@7^T4Or))B-XP_OS=qSAX559#sFGHh;3fhsJVH;!4k&Q+KaYL7%(0NLEOv8vFB-s z4q zV4yJTFi}C)pr+Ey9F#cJnI+q^=(eL`i}H64F8n1|wWOMt_Ua)c!dRp=WRyeQr^;WF zG8z|ae$r8#cIg}LplW~wn_sAG+7~L_z4KYqB^BVoIv$xwCMD$SjrOpqvBva=1uFx& zL8HHX^CH&Qg_(w_FzD}TUSYn$>0-M9@?PlS(JY(pX$PUTEeAEWvyjz5RzF^xM?3jw zPIahgJXUe`y1r3jZ>Hl;*hpOBF`7^DWR1_5zO`j#myi^$r-G|OqXFA;fbn1Kadrh2 zR#zGWU|F`1A$@HE`F>fxXxq<1F|s2;byJ%4ITYKEGG}gC9Jc44X;?&Ou^huL)avjw zn-M3eK(Eo^NQB`rYnP6&;=Bb3@pcE$$f+VD6r$gB9#`9WGl5hh_<-DUo-O^#{enFn}WQV04;mGuqmpb*<;W2hn+3I3`wfQwp0$avrxD@?; zA*2JftYghv@Bq#97K!=Bn#=DgZuT{1Q(EH&F9*TFFpXol1_n<*=1E75$}#F2`>-wf zf#q)vVpM0mDrX<*bsi;x;wrNOoPtke(S}i~JgP5rGRLsUIn<0=oGv zvIX*U5<5uF3JYrlpT^>y!C;s?Bv>%nA7EwJFX%kgxbJ_Y=$PQDC%M{w3R?fl7_CJs zRy_b_^Daao_!_#A18w!jkZ^ea8;IjsViYR`aIju>hV21iFN|027 zAAsE@J$s5Ml-5y}N^IRrmnyldP^$T3Yig!tGIByQY zS=1P(qN^(&94a<{q1I-G;+Q`!>Wk-sUiC{#EU126C@J_Dy8ep+xzC)3mEHtBX*44o z#o>=sMMLaDo;Z#C*g%6Rb$x8~utDl~rtzDe-j0Fa!4A6$tjW%@~EP1f}QR=;CvJ6yu#0EHVw= z6H#ntZEM7|sU8>4N-AX|$Bm{he@|%0I05aS+(jyBs!P)0kU6dNi#U{8ZV(DU6B3>2 ziP|EyLA42yt~WbP%8@W^xrATkI9KaHm>Y5Kb1XVu;|WLJz1^uA8)O@7os$%fxGAfio(5ZwYx*;&)zy z-mD0@GcH~?XIV$BF4F9UhXK7;eVLgS(jtsl!82^4jqZ zgpZ9#vpnO$ekHIy7_QYi+ge9~?QaZEnL8xX$!(a@S&becsK$=>v@v8tT`iiQc%rCB z;gCp$(@E&hLA;2d)3S@-i!^?twt*-kDD1^LHp_(SDgvh1R8$2RA*^7k(vWz}maWD9 zF@|{I_txBaAAHgdPFZdb7P;e|zotEl%?-Y_D6bdED@~-eEM2CuLC8hEbL|S5Wb7io zqoC(>tx)m<@#Z1qkuA(J|8aT@lwx2pj%)CZG*}kNdlk_1EYo!lRGK^Y9i)(;(YC|ej6DC@ttl1D#g@j6W zI9v^A4TE}W;BW~cFLBX>i0&+&zRw1=;{fNI*dXxg@OmkoOPWOiT z$ZijTz#yn6dRQx`QN*f;!vCcEpP3R!Jzp^}AWLF}{q_y_f6tUei~z!P|E@4(s#qv$ zE~99Rwuy;pMMOq2=t7c41_bH9*31X5pubSgag?))l-=f-TN zBfUl{6YqVQEM>BB3SX2d-gSK3@Uddn_B0zwd~eHTBywCk&Erws`LuO>_s8e!lfoD3 zMG@W0mGw7X@NR#-Ud4{6o?#892wk0CMQ@y*c5ntXmc8z{xnhD%@D4uS(asn@K?GqI zRBmA12&JAUD~fkiPDKOL2;A3m`V0isnMiPGGG0%#pik10!}Y_k zL_Fy`%W;WKTFA8|np~yb5v@G)_Qc)_dTw;Rl774Ivw8fsq+hG)kiXV#Y_RI1J=p+*{DA%o~ zXgJJpRZoY9^8dmJn$gm4l(VgfkQA^GX>3kVu3B*7WX@RI+Cmi9W!D*BiR~og=Hj3> zpb<`{*tyI*$gAMiux6=-&yaN8ZD7NAkRYP{?tGA;u43$#A2l|?F|Gnspt5ie!~JG` zvs9ay_*j;XLP)y2B%zWjv&i)!-&(ZfPI2yvf~P~PB&lw(l%&Ag8OBXloAUA#SH)Fm z_|R};5O<)R)H`Gw>=q0udao^`18v}q z^lAqPX`e8)I`oUY4o=#WSXUNjDZsK`1UtMuT_uTv*Q>kkaDBcdc8wgRsgq6DCre$P zgesdL-&!X38oqp)vPrP(UZpE5QSddR)qD}BKTi%Fo99{i17%7*(cJ|jqwx|jzqkF{ zwpE;S0Bn-NaDVQ{XU0oBsUC{c^*zRVO&wdIuYv5;KoxC$$%-V6dhDH-73AQ3f#l^& zSHuK~sejg9tyxgW6+~4P!Zk z-EW*lOHgf84b;@!dM4O!ZcrvKqi6djGtsyiBD^nScE|nSo&%)cm^R>8F7X7&pii+S zrW6=OQui!Hc>G?$JY{`;e3@w6BShU9fpqm^Z4cC#E;`!5BJc$j1hv4`f=nsa8&6-a zuKOXZ3XjwNaCu(wz_wbjXkwGV%Ymy(W%Ug2wn_dIiZ+hMJH+nLT)B?3PisItK`8A(b$k!CY!q zHR4v(G93 z#p=ehvGQsd#!a_g&qM~iO0Ke(ib2C>sd>Y1p)71&a^tP8(c(xHxeuuMcdn9fdSq9UW!0hsYB6^j> zVt$dA-&{R3KilpES`hFJ>$~M#cmUGKGSQJywTNNjjNOyt zCtRpG@cK3^=PkoJ;4YgEsTJOca5z71gaPnN!zFqb48*C?jY4m!164`U!#~^?kxB|3 z#MY9!OS01E|6t3GONj(cOC;7=Whs|7N*6Rc+M=lmiMqArWCN}GU>t$aNd=I_>EANv zDPBCM`BNB^Q8>BAu@G!_1whCvn4`6FkcW>`b2@FGzoN7r6}rw#+FjE|eZXWQHA=x< z?7cjW6eCQLVY=~@z8#UoeKM~70l1aUp~Y)j(SE_zh>nU&ngjf>`r~qE8Z6%jSmu!5 z_38_OSR3xQ(e#IV)YuMb;%oTP_Ajk4=fbi~+?&UvL6Ud&&Au&qW`o5i$NjLLn%+Y_qq-+iWxd>Bb zmHPC^b0P-j7L!AnEedFW4!3a3Oi~|wZjxnx0W5>jgjm{H$O}moFq*e7 z9!Zyws`W+(=ktV@i!OlIl=qt!{*A7|^x(`O4?#+pBO?-FW_13b6Bo)pvkW*h(F37k zm4*6J=mM4z5FL?#i&BEHmvBwAEc>z0kqp9X9=URd+lW$QOsX*>vN44dVR_zd_e|+^ zILoeB3MJg*J>_z)n-Ym+h7@GwvH9rrp@ueMhh}|gQWygrsL$23%ANS@N+0X)O*dm- zPH0G)wrhN4%04#g*AG5+-vC&PP`Uv` zE_^9)C!)k(h@^#DvX819Z?BU|-kI^$za$UY{?Mj=Sm{i^UxO>&m8XMfK5lh*RsN}72(QrRARnvT?QDnQkTzCwnPhVt%?%dLk)@xjo*<6`boHyxn z^p?_G+Uy>s3!Gio*%@>JA3Q|iNl_s3Jh>}@rn8;w-H*arE!(eGVCt*7!$EO_DAuR& zKDb0Uiljd?`>gk#UhX5a?&)<*^Dfzo?7gbO+9XtJ>gQi@O5dtcrEOnQl~qPLw)1oO z_!99X4^_Wco|&(Z*}fc76ZNyfr1!%}p#QOjsQBIJNYEdSNfj7RuL=^^02eLeAsv}( zPz%X3;ZMqr+0nkgEPXaISN}9cZ*l50c$QHXl4p{e&JD*ANN@PNidfOmEg=;qfakjI z73RUoRDI9Mk(^d9b@>brNTp^h*4FH#?fq}oB!2mo^3-&UJK&4Ee5X@mn0z7x99;2G{e@HkRq0TgnGvZz*~8Hq7iNM z(VX`60r1wVR3?Yx^S6DZ9)vXjyj6Wj1%pPQ+=iXI{Ms~NSB#~-&B5BN&0q}}6W)B2 zJcE=_$`WD15ZASnfcfROcO_?X8LJ%3Q_(9;F84AW^x^`}qopZ^Dv{S#H&KGj`;4p% z#Gg*DDLTh|5AhN#Z}Q32eYGJX23R#S%vh=)ngiZr$NB_rH^qV4L}A<{uBonmh}@$w zy$v3*#eYtjwB4jip!3x)#q^yE0qEGF-#cz{ZIMtXCio@KZ;sc{57#~}c z)ynGqw*xMb*_`nhV0&OdOw#|u3j%=p(h8vd`(GB!|Jn6d(6;#3n3!ceb5T>1cSB>T zxN?Q?23mFlI0NOm7F&R*c?L>(tqC2zmao}w`S_6OXn;sEEmc{tuq-_(Z3 z)o`mx%dak<7vP=m)~a$sm4TIzM{?ympl2k^5-Y|fF8=)O-P>++XTbr+bmp;}n1S4N z0XjZ2k?1Sm`}OBf7VNEvsu<Xl$Hl;*5K#GH*rD7C{rp0HxR6X`+<=l|d|E6YRr^DVnpS1KAoJo%* z(;?H?&JvLd)`Q`&-A|)hl+alOf~~yekka|n7J(;zctPV z7&E1K@q6XuPYLn>J%VS-gJ0~&s`9?ahVXSlBZ7VCn~R$UHPI;^b`gEYTn?!+&B1(` zl$b3Cbu#tJNGbkZ<3P09+^k>@-#YVcoylsM2PxMuv+2s+9eA1WCop0ZAD!f|Tx@ZsZoC zubFcwJ$Hi$EL`}zV4Zlg&W%7^&}^|q+;C=MR%3_UQ?<_cI$u z)bUlY^C=WP>wM>1hR2m#mcvym+n={>UY&2Qc-tc@(Q$#CjP7!A3?c1|N45C-OrEp` zcwO+(brE!Wf%5z;5tuDf(ZU!`)DYpfb@wyDqg%9>TI^?8xhYuAx3y`;tGO`Is z4#J>C3>PXm?U$HMnv4~&*C1J$M(BmY=1mDB!-}EyKRH>-hr=~k6={da%&dxtH?|De zI}q04G~w+A4F||%hL4?X(M{MpYk!tbk`%Sk8gZAqTb_5x2mb~~jk&I#Kk`zy)1KbS z{iglp;Qb@ikTDmvQ9&OJ;ur(g-R*2Ol7p@}d+5EiRH%ym<7}ZG%6ko&KHvPcXfzzU zI8cEuQ&kns*rC<3OU!wjWysce)5)P>aw_@V-nyBjtKXC=?-Bx1x%p0H{jjoX)S{>BH!B^mnAP@(t*Jcq zeXj69mH4H2=Fe$c#_d||`d&%nbz%YzL0kEr7Awvx$zg-<%9qM}76XjT&3)nJ(lU&% zDnjXsAPVlo4cfuB64mTcgD~m4X)^sLeQnIZqP}1S$-vpaa%r75^x{=Fvwe4~AmrSK*OxQ(ScgU%aGa_t6C?wDev& zLKVviA)S?w0?5RL@}R`^PSnL1FX)odIGvSWhAbLUZNe{8a>Mg?Fc&?{@>i|G{mzxk z*Ol#iPaDd(%pl)xaoYFt$OHW)bIK1YRFTJP&TG}%H_ccxlg2GpNlQ^CLPM0dkm(RH zA$bNw5iLPr(-5zyOmi#oqr^exQxbM4PjrR*fIuj%C0$E&QIH^UcWVQyk-2&mK`^bU zUNq!Hx4WV-o~%wLRFd2hf1XSvJua+!R~K_8S-eh4Rd#N6&BHdj_UH7iIsy2<6S?XN zgXTMS8&piR<7pjRd$G>3Y7OdVL2)+ns0!yvms`tA6&>Y;hnll?5~?tz^Yt}~EZm2k zA7E&qMVm^LlU*NiCm+h^As$uyUP~#d^QMghYXmh_CJf0hz1z$yGFo5=*97J`&FW0a z=W8ZJvB^%tZFs%JuX^EOcksz!b8)drxzKw=!Ml-q1RpS9cM$qSfnLye_rG&VxKjJd z!t-GC6oY5O?l1*z!|c=t5`E{AVaMz_2G54ufeNGpwS{IB*prJnWK^$;jhrnJ$`1Gl z&1#>XeM>%e3(DGa`Em2TvPFUyZ)E(LWLz1uf3GAa`U&`cnv+eT046iKa;ap8R0-+r zJaiqw7q$^LpTVkZ2KqKoBidI&iGAzboMlCNF=3ERZbWVF_S=-TCkU&jdA`&Tap@$H z(6G#YE5Zp65|ghTK2r;nj*Dj1x?`FIPf4!r*tl!)QMiJG;jc))=t@`rBuKJNqA)K>shnh5xHj@!uQ#-)U5$;=l0( z>jidL3hw(d64%V9KnVV1B{2eLLa`YI_6ks0dD3k#SR748)j)?>@VtFUvcmYioOnSg z(q*g);gl+OR~f5JOeRB5*Sy<4KU||WnH5&(Yf^`hS?5;zn*4@AozYpTRMuI~--?X_axvb*Rjv|*bupM|o=dg*P%Wf%7OMFVNJ z>_+Pi|7c(RMbj6ly)_g1 z@gW!3LZZWP_Nb!iAVP=|mp(iXr)qI`u5UdvHH*Y@zM$ZMkBT53W#4IwL)4qS_Z&^B)lwzdSce@h?a9-F%H^(;ij zfIA%(QER2g(>D7Irw>?k&{L04y~B$8b!te&UmEL6eQ7}yd;WKs8t+ISz7zmCBnTjP zC;8vgM^QQDf4QK6-hZhsCeX+c4XEroLQu$%q!P=uxc9;UY>KJ zbqDhr7T!L*dOmT-ZSNJ{W;3>NoRt zj$Y}-*=UP5@tGL+?yJncTbb5+aCilAxwfC(bd-hoh`TaUeQrHbeX#I;55{}G-*4u6 z`__zmuq0^t%z1USd)5E`!X5qLH~cxW$y+-witMhGI}E(o(%Ju!3Dke}3De)z+vUgV za(v@Hy<>YFgTITw+{}#_MfScs5W}0Y5Ehz2T=FB_oz)eL`_ih5U*{}<`>1J?umsTo zD6~rHsz5|R7QahC4!j<$q@doDi2i(s;I+B7d~$7TZ^sb0+`2ehnQC9<-L-)^ zk6n6fsjIx64dXUl=pvvetarnmBQ^S2veT93OE zVP5nS*vrO3HGBiPgU@!67`5JaxkL}h0>)*xz9nUpR#M}OMU;q_`wOE?f3DQ?pM>J% zX6kC0CNeXKk|*m#v!fWhF1=0?s>bhnc;Kz5GQqaS zh9d;Ir^pYL$M_{=Z7<}Qb#?u2ldD}SYO*PVYsYZH0hrquZr;PBMR3?DH*JR?)CSUA ze^@Anz9Tc6P+x*f#MtS3ek1#~c8Rl3atfrZXLK4p=op|~X!Ih~opmD}48&z^!`eby zYwu(ciWH||S!ZKdkJ`g+C|Ky0wza2DZNWrgggZ%yqq>X>696|5X8)7#N6NY63y`M! zyFAk~xdN9P@14z%2Zw9*AubX5_lGUkiuo^DjdlW9oqD6Z_( zLdLlGNV%&v5)lRahyKt+kX!Q!Lk-gNc=0ftVR%*8xfMQ|HpE^GNb#^Z<_ zM2t6ODhy+9i4`IoAHzN)52)zSVsB@pWCTKk=XdD%qbJ63n}^YW#@P_K*_#_RMr_@~ zH4#w*4K5z5eFjUe`48IsZI;bz`d6GIVb-I_BC^d3){35GHz|BmZ!PUEF-FvxHb%O%$x802pOteyC*72p zGA27Y@6z(De(W6EjFQfRi#0)-B(9)1ieqXx>9m%97r zQB!m3W6=Ef^S4Yg-|PCfXgLSOs?j%)!!xXjlR-Fmme`*dXbwX1cJ0(@cXJjF?YanZ z!E)WjpbDo}`i?e8fMF$stKisW%rP+$3s|QN3PZtRgL!b5ME;0ivLI_MFdtLE)2s3@ zP45M4WH5ag=hS+dF}jSr0PBexO+|AS|M4XGj;cKUTl9gnu(a$ne?eOYx zCrw7_6vbv_Pmzf>4-N>%pwCb5df;;rL>3A9{QX+zwu(&HRlAYH($`65J7yc^uuw!I z8yPrfP0&e+XvN|yxIFrNqZbMnW^co_(%>y|s#~Bl?Guz)$_G`=SBn{+=E82&52vJ0 zhLi5$Io>2#5-by)hz31Fnjzq=v#?BJ>%zQv7lm7EvsPT$Pi@HsKa|XcDV1Ovk)NSL z5KggJM8mh}QM7J1&73mB2B4!D`6OZyUN^m*nZen9&K=_x=Vum{Z1I;BnCr-^#UplJ zOWr_AB0R0zkQWgs3vi&snq*?M8<@V*v6e7%peqbvsOccWZ5#>KSt-_8#Jic6eOL^; z%BeRA6!vSR82aL{zXg>bRLy=XQ~dYi>pJ!+xRC;u2L*qLxR-$qFZ+EU5`^FL>r;@6 z1x|Anzdv%bS@<7f$+*0QMcIy};H^;4Je8txgu0!dE zAxWNBUtv_0>rQrqoojv_1C%8%|$fA=ccH!}l+}W$=%7Lmd9zP;wQM81O{uB>lV@7TC z_xs^fB(=$u=Wq2$*DQ)kvrsscs;e5d`{he(ejP*BeATsR+fs|=*ffbL8fvF4&XxMi z773ethk1e}L3(oKo>c?I>khV&SG(7fk_&tZG)n!_FawUetSX!RkkY;wI8z zUuno+ETleIS=j}$dSGZc;@Kk8q(rs816a1^XaeMps9p7teIBf&M+I&^D#2yBu1j+K z>kd*@)0=Eo7IlrC$QiW#N6CWg)t#YhSzr^{RATFCKr>H}6FLx=RsQa({a2VZ9hfT1 zeCrn5O>0>;<{sa@yj83$ic4rU*Rgs}NiDmO)?`o$E|-Ajo&e$t!ZA-|C?#B@wYQbe3;F-K9c)nfY2D-!bTEnUF0GD&mJnc3YH`Q@{ z#Fd`HJ|K6b7nz<$Ds`{XHqw*|7$#*BOD<_2(IMfQi-l{EjB@$ob4e6FpexVpJEC(F zP*f*4NSCfPQYg2x7Md@UE>xifWW^`VB{LW&3*iv!G?`JM>r6cCJzPYQ$H8jbF@Nti zrrHZBcj8pzo{z7RjHjhSphON@Ub%Cy^G2?Y)3jz>SBFu7+IS%lJJnf4Es&Rz(I-;a zCxg;*G#)rFP(qN%iK+1DE?A~x!`JDJ;mJ{|f>?K%ICG)gK|Ru)6*o!%!6G3rNt&w= z0Ph2t#6)#fCB{^CNFo4|->RzwDRN&Tk{};I-dtlYRckI~G%&P)mWz;jk2qRJo31?B zRX0YtIz8Ecb|avs?5E74Mgv@qSyKj7E^LERes75I6q!*Gl`>jpl(rbVT5;BEj-kfl zt4ySZ1E~^%GH{j-7QGl$_dYUN)(Edc)pKTB^YcfAMo$?^MU;EFnl`YgYQd+lBLarc zw>R=&8e+?kKwIRjZ9)Ju;o;xkGO@XlTRWk@eH#S~!u`WgIv}eXcy*+}uVj6i>jmhut`yvplA+vplXq*L~JoQh#sg z$HfoLro+0Ai+`L*lXXg8v!80aPm71l(xSGjcTDdAq2krO{2m;p<`FNHJ!K*rIIi&C zEucH4Lj6_$68!d-Q`ZGzfS$h@_SGhRZz{aenc;JoG@DZ zh*QW<5E=69mm*trllKz(bH}R)f1Zk*hEvZr?%j)EB<`<}I3Z?o?HT-($*OF1O-0^A z^3AMsP+f3yG=s&s!)tI%cv`az1?^IlZY*uBLX>Va?Fy%M&tw@^_Xw2+O}Stl!;=>; zMYon?IH|+kD&B>025>=My!5gD4^Mqcxaa%Q9BM_SK7to1IT@+M-o<0oN4?}=%0dWNGlzEJ+K3d75O9ZCycWkPdLOWYyYpZyhX z)3n`=4{wPBNNdJeY~Pox?>XqWzJ>Th<$EiIcX!`3n? zbFgrtsFP8FeGr8yQ9M`1Q4q1zwl=fcB$O>K?z@IjS^xn^iaJxP{5Ot|k7^E0ydFex7@2?dMO%bmqKh=Pu%BfG;b-59e zleZ$wB5ei(oGgYn@-vy)5i2DRI}66i zLM`@!!R4H&?FNSdB_)xis-`LfsWL)I_Kq$C%f4|g<;GYMj!#$QOg)=3_vxmFP^&7s z@f4B7rN}aBEM;{zdrj85s@Y{n>P#c)M5D;A1_y)ul4-9fCuPfeiF4z`P3H1CYn4T5 zre>#lF%;*IRz|4TNnvle3^p77knYgs{)3~VoVl$k(lGNl#@x~3%%-VSzbM^!`-WuI zTfTiWH+mZ|+Or%P{{F+Io%_VZE&?x=b z`n<_2zp!`mx@SRX+Y$y3sjGDDXu{9cH%9i1+jMWyMu5dK93&VCI_Jp8K9eG>a^k1Iv!*~y!V%|WK*(EA_I~th zNojEQ?Lo#b^mVRF93mW8vOV+|>8{XC0hiY2Kgpxr>{yP5)s~g^>(07aJ<6XDhv_tz zJT(OO$Dn|uGN89GctF|xi z-_t6al5e%|-vBa5ElgP?v6Fev=gIEe+G@uhT#M%*8}F2@PrJ@5${1I;40+*qw5`mE9=^J?If#X z+g8W6*|BZgw$ZU|r<1ItW4nWnZQC}#Jp0~n)qbD)?y50=to3KqJZsjdF|Ki)$4S6= zWIOdWnb6TW1YgL{6%TLmzedT?A{jl4s!f4^C{En_Af#4E=;TB9{2hs-hr%3b4Qb|6 zQ)etiNmAs>1d8_Hl1-gC%y%y9++L*j4mBCMvnHma!^j6XBAW!#J}Q<8O-`rz+m1b5 zx)xk)oa{5jAA@Eg`HGDyyP;n%GPwjiz>ZF)>Wq;)E|@ED`~Uz zW|c3rSYs~swdiseU9;NdoLMhLFE$#>THA5_Y8Kx%rbI3tIJ~atb2-j`nG@WOXC7*M4X?A-ABJyxo_@zGqceoTDPLl!682!KLf?I25cZefJ^w*$q{oyiPEUB5h81s<+2_Y>rIUl5l(=s$ z-cQ++ZNs)k!xam(b&=2bT=ALC@6w5Y39@URwmRtT{8tBTS0dHRAD*AXf}iLt>WZL} z`;_5s3k!XSukL&MX)e=9&T1Vonw~?9xCr>O1(RWb;3Xoa_Pbv-p{|K5bO$`EYv=SX z?L2{Yo{6Ygt85OR0sPHA!3F{k9dGm_nq}V2qqzdi#jU!JHjBKE)TzU-G0dqEiZ_y7 z5g+*GJWapj>|O|0@XUEGS}k1|w2y><|8eO!n{}dJ69@n++sY4V3kaB>{5R_z#yiqVD^fBPhLV z{bVo`%Dig*s%lu|AC2D0Tm-ztvl7hP^#wu?p0PsjS=!_m5%YE@Emtqqi}<7u+wkLOJGO}6$iPEhm3B0?8}iJ|$X*|ya)L^NS9a)jx&5>hTi->i@a1c`^)rnp0l56vJYtu!s{ zB*Zos5ie%QVc^wU7r74IX7V-k4~o>#FQ=>#k{(!}w2+79CTjJ-sT4UcBK>x9B)Q>p zLL#H>chno6J0hETks_?yt>8aWjC#<6ss9?sb-8`+PLB<4xtsvY1DW6S#AhLo}Gc2Z3N45RZUua|6B$VRV zm3J3V;=J)&E+HQIwz|?_27DndNOIaG4(VrF>mMUu9bqq|SUBuBu3Hv^y#X!lJ)OvF zSr5pM?64QqEbdNk9`>M*!CQV%Yudf5`5O=?=lOmx%kOvm!x!^6 z2m}Hv;biISlfmAQE&3pja-y##zDVcuH`N4r-ZDYU?>H^`kdL@qez0rym!uat7;E7a z>FZz9;jUcs-=;o5!|F;u}P}kUZ=j&p_ z=IiwHFJuM@LmRXI$080~hW0_bM~A$6+%$1d8V?hcgZ`#a8&aH^sT)d7K%9sK2MYZM zz-GsuG~Q>%afS?~WQne=crAJjA_jy4+p(pFX}T}hsIk(%Y$8xSRkc0UJ--~6W9O-7 z8K>10Ak=sJxE1L7%ER$9?V<*3RX0zp77Qx=pBdebW?_*+H7va*;Bd=e8 z)2FAOe@~v!@hQEZ67S>hwlYGV;}d4Mzw;Af_#~H4uW|RDyuRa8Ww?^8ocN#*PDaz9f z?fi38(9{+WkR_=a^5JNDN5@e4CBM1$?!T?@8VV57#4JzS`HN1494IWQqiS^h!7PWq zmlArjw9Gn(c47M_oO?7Kl-(tmg%&GCW7Upr479P`A3)GTf)#(~Q_2$98S=U1Gn9`* zOX+j%HTZrK@zRT~lECU&EP#^YWu@g%Ew8n-Nn>bdO=wQ~y{xtsSNi6yC`jb=-ciJD zA5V`#f0nnY&NHHHQW^Cw+)ArmWcz4LLp=?RKl3$`U#R4zj7iaYZdaFkakf$?d^*@# z{^o`}S0yF6PFij`EO|dW+@_k7MBh0Z>nIg+#WUZmSes=g2WuGx=FtP}n!NRM>)OD7 z-Z7U!feWt&eeS1A(`Q~f|ep7OehcHWvoA_6HHO?U&_5| za4I^<;NAU1-U@b872A>T>i;v`N4|fJl9FM}bX-``_Y*u|imX#&)1Vm@)+w?Iip=q1 znM?9$t;VN|r)iR-=1O7iZ~4el9IF&&>qt!Lk(CkCnQG0-yaefAouz8Q$2u>wt#@Tn z`m1=J-0#n8FSqcjULwPk&BH9{-;!`3x+Ppi)YOM5Cl{%=bI$a;3)`-|_fv;*U0gfIg(n;z?;;=Qw(StfyWJ4wL)kdZ zM~gR5&_gfIGk~RdRP4r@lqP}+DG&}4u7`k(;EVUdRdv8M_>+V(XENNHt7_K)JNzDx z-C=3ikR@E3(`NfO9e>l3P@E7CY@*6 zj&}3>WUi_|iIi}57|yj5jTFuCy2$coRtxoDi42SS33TWyrr0|unpE6eQaMHcBBqLF z?FP0`tKqMq;6m7!Jxu-%G>j6ml_falTqfCjN+|9YC##cDU1R6Yvc=hL#HS)Zs-VY$ zh<=xd?!dnT-7Tte^_=A6Ty#@QSFzaXn;4hhHy_=)bob;veBk_Cu6%bNzrE3rb0gUw zuw0*lE(V_*e|yUbC52_npQwMH5RyjKiWSc4(Knw5khvx8&q02-u32+NAo<)P$_zqI zaUpq(d@M1`jQZvLEA*hilz(N!BQxphG6<@X!dH}X&FCmTYK9+s_PP)@SuEqDrjhE~3o$OfkS8nr&}wN1tH2jLuCo3dz{QV)KVYdF-kgp=&=)? zenPcnMh1|o>WYM-sZ>#GgW}2##GWPAUMdY!ww}Z|vSCtG48x*?hiD!8m>zF4quS;9 zLwyeheBHi~=5K{o(A=t5&*GiavI$+rC;Sy)SzpG%Adyir6 zML+Bl{YgLg^FI2?U+$}89SzXUodTPzvVc=+gez4dku~BivF}@a1FH1QNcu}h0+Z^O zOmk^cBzI+0O4S0knJM8&g+|sq=J1KM$vs=$3k9jBu2GA;e#P3aw2Y-PX;uY8(yZUg z1f^7H2=h5!&sXjz=$3XN>eMs$6zqLUz=m%#N)m_xE;eo6BdTHQmsSG}y?^FuW-}@J zU7%!?4JuSJsoozVuIPSNM`*Mwu0G92s=|r*lWRE|0CJ zaNRe!=$~dRuWK4We~P#JtI42lV$zQ+mq)JuyjWI>iXBt^WQw&i7xXV$L2B59k;3TW z8|iglyC;=7&GibC#(^<@4!Nv(&Eb*Ys*d3b7E;ZxCBbyEDa0H@ZHMc2wDPj-+ED^r zB+>6MvZSRGOful@8<9RJT>ZuQNZTsvDLeHk#_*|GO>_;fP`guzc!b5w2zW#a>=>{^ zMANgZcce+sXFp;kWpZ$&QoQa4e`KT`POXWWOMa%>hd@oQev@YOlW$wjbilMclJ*UV zl@GWq364#RqW9kc!S{jb?vbzV8xjc{sm4Q8L&1#Ktt#p7IK)2D1PNE=EJ`v4O}c2A+xM z$AH*^9YF-xeLJEEup>Y&9|cjdynwLR?v z1aTo0e2jxaV+2vncpV}5X2Btd2ztjT=nd*+BATxUP-uinw*BUXmOljIg_lnW;)Rm$ zOA00iCn&(`zA6Bist4hNoVo?+1euB=1-r)%KwwiBVF0~j7OVleqZX_I+ztK|e22*I zADf@b0_g;wS_SC@Otph_a*#|}wW)&w`|1PzS7qXb*jyc_$RMtzkM?e?d_EG??ubPR zh3=R{^91jxRDVvIOp|eSLPzL}qMBp{0A-pqm2AWX;`TPDU&i`XWh#kpof*49ZlxK! z!ESLGyT^H*fuQwj0}a?r*XS#BK{s?5)D0$v#5AfJHW}vCECy{VGVR2(pk@T=a*VgN z3ZUslER!8$TV{?~E1R?f3aNscFs9fG*wVXn`xROHH>~!l_YnD{GPabd&>*tkEKmd? z!CV*xlYY27+A)IQe~GLL#)_U#9Z&(vjh5f9l5aip&6c&i%JQHIRhmwe{^uGJKIk;7 z%7TlksqIS5$V^9`9lL=XM{|ybS%4>8`cRN39!3Sg+3X;r8H>^1#)-!gq#k)}*?`@! z0JYaR%s5c`#?tbfAU>a=LAXxt%nlu}MnCuF1i)qgm`2ZOumiAhyV$ zk_*MCB_n;X#0O>&xE95t3pJ@i>1v3&s8M4-WjUikgKUA8? z65{rV46O4}*PqW#Liua|-?#*mNW>zHF*-*<7nFXa9$WtZ+gjU}?rR4I#N~YRiYEdaY&(Db4_DIbY z8uYHP!do6uD1aeHj?iv{N8;Eg@tz?F2lk4%#?F!zP2-$W?Hd z{;i{E%iT_*!QpNz4gp_dxZ=w4yLc0UqEIBN)f|q2b9gzA5Pykl5|dtk-fKBVbSv|r z3zO4Kg#~{TBQA@CQ&YhqB|h=zM6kwC9n!Ilrrv1c%pcg_#!L&G%yHw{)}CA>mmH6e zV!w&h%Sc!_k@;T*JBMSnVGTzQ((%?pW5qkcOMl}gX?eBxAE?7X+M zurY~RZgIwnEi>9R_VwVkFkE)uO<0oJ=A9^_1@*T=Vjs(LkK%qoF)`I47&TX!owmp! z?ga(q+Ui{hyUL|0#i1YE?6oC35wW&DRlBII)4)$=X1q-SPv99r1jH-H(mE*yJyPsn zuolQ`(RwFi-Scv&Ay_$fl2Nk+ylod4FLLh-wA!(>_N7#~rubl0dR~S2zjCgGfr*NY zzRrtvz+n_(9{+Q2B$T5aEl#wUvbRKPURn%-`K3Ebyn?Xkn)t`{AQ~1IFpTD+k+fa zR`7jwxOe>wUytV56UPSn2az=HWX{A$&%gJV1Mr!z`2TysD3oup`Tk|K`42evU*K~x zmgW{NvW6aCkP&;kFU!q8>qLw~uUy|3SrZcci&7=Jvz%TIiHmBFgDO&ym@KR`<6w=k zmP~FcEv4w!gLq@I(~Edj6kVf=iprp8=4NKTF?#Vjbc!3`e3p{%qdsIEMJwb0c>Y-Z zqsx2IwJmnPt!o##T)Nziq*EqDju*N5%j?7pb)NT>FK`E(&cD={h^IMr4OHk*(IQt5 zd7Ea6W8$9fB%8A-DXGtlGv!6wjn4_gmlZvV&?tFXWlj90g@SPY9bxRs5hKK`AwKi( zwGFyVQm%&fsaSD|96gjNht>e9XVHw^tNoq}1%W8IsSPs12UDVgJg(Vy7lVf(7A{GL zFg$+@tVhFq5I@6GsVWY?V_E+F8Pzd#HyJY{`s|K?+Dz~hut-X_{kc*3|3MsJ zTJ`M;Sq;6dib`WB3~KFmw~G)FYYZs{g&?nnToVd{QB$K(6ZTm!zrzDd0PKmCAy?Uf_Vy*VICuZ;XjGKd zh2E5&Ul>-y8EdtLr4V@ zK|FS3?XCUN6JVH*dK1^;K+80bBFi)A3P=*kml9D)^<2-{@}=VQBX6%cW~=Gq{V|T_ zrWQWRnWqY7fQbM4Or?s?XR09w9?YDpc8wBle`gc3%t2A9MC4mXLAx_LUW@NG+e@_EI z)v5`Q(Fd#xC8!*)b;jweC@7ZRJ_Qo;bh8TKZILn-f4oC^{yu@-BW0ZMCqUCxFW$@c zv*HDFNF-u@0))X`=5aO;N^~Qij!aRyvnV4MC1c2IrR;+xq|i9l8fj7r27T{d7}F%^ zBY9VFt3}ZZz(qJ>x2u$zdi8k<0}PNhX8q_Yhs5`uDo$w&UUnPp`=S5kA45F?rq?pHcBY$ez=<-_*;6YvRd)It3|N4TDDn*?w>jki6D$(~o7M z;wBsf5!Xft%3%9OOficf7)UQ<0)lPPC`x;)0dZ43TSrSzWA;}Qc=?|oU3qaO(X+oX zOhzm*V>!wtBu-^DtAB5hjFJMIk8#(--G_6pm9B8!Yd9Qsr+gl#Iy@~V6l0pN2)K-_ zhiAQM0_}F+F)Zq8%x4hZAVcE#DE+!9KL#V7o^H3uL1F2@_=EGlgY-dOeMSbJZs;RD zfdwL8f+nj9jU-_kb`xP8Cq+l+=T$#42E6_m0VE!YBqq}@XQb3RWaa!b7;B4^szFgM zNl^YA;%nUpzQ-6|er`phkgvYrg})Xh1{a!8NI(2V89d5N>}z}dFX~H<_Xr00mqBFb zYx(<^kcoemK6xXnFX#GKw5gNx|Mk`mC~4cH2%&wHf~S&5+0r$oT173)@DEGx2D4L0 zB@3#pXpl`egO;Agcbd9kL|uLma~5UIep0~hH{?XnoqQ!i(~Y%A8R3np;q z(UByTPo{bo7l-3<%g?TOb=zv0Cqm=b1x`3`gIl>Q;s4C#M`(@wBNFC1&OyXJW%=$Ru%eXPmy%Xsz412%y2pDgK^P%pzR^GNi zv)oqIHo=X2_|CdNBXTkLhef$Ll+YV)nVU~0T#IS%#EondIs_Sfn< zkpuW6HamW^*!`JTQr8h7*dRI0mJoDB|gMhj_qtu9;x`Oxfew zJF;HD&?xvxLXTZj%kWMQumM$9AQ~q*w!#KeKkh~|^n|IA-5x>1D7$(=t5)i3%z%!< zl=lFfCWTzyvS6puLvVaR_{$$3$Vd%*ibuF@FMM_JF!KM3lkm;YBKMA$Jg{qP$~YTb z_^+r5gP+kN_+M_&r?14*e`yqxHFdW5r&H|z?r739l~>i!h9<#-QKd5D8GZLTk;qWXDW)iOW#0NPQ`j4AkEnN4Ic}xCmuW{F$9Fo?b#bNu zQwZs9?@#m2N2!O+&yNpE5S@@3hi^oTms!}KAQw>z=f8|0d-#83e;T|-2Ei#02|IdDkFXtTN97FMRs~CW zzad>vS5B!m$ivP_Nx|nDEZ7(~$~R?V3r*E?e7K^nkHwbel_1zT7ehHJDv_~PtZ!fK zIY!O>{J^L(3x0ZVofYh&&CU7O{CHD3{$IN0wq+!{71{dvae5>D#+eg}buHa?OV{Ir z188-yQ2|n#*@0q`LuN6>kXAfBy-zNM_0k=EtZa+bsXCn9A5?TSp+;)isJ!d@ zsS~;t@Gk0L-trT_GP1SCU?Zt1z6qSn3#!PcDE?_Ek9;n@zzObWtthj;+enIL;=GWg zNM4Fo2al|`t;2WtEhbOn5F)AlYvQB}& z**&w063mv^S~%04@ArILD5wI=;w^BIiv=f@!HlWolMeLcJs#Ipi zqD^o;2bL2?3=TWBYVD}v?T6BGv|2@5C?-|jf_2ogn5|IrwF_LzIJ9>A> zcfgxVXbm}LRSsInI3c1!3p%VOJtvPn1(Qg~jnqHXITgmc$8=f8ZO2%+nRh=**KGR# zs*HP-?|Pr_nXyN}U<| z%~d(En$MriTMf9~fwxwy##BQgN_nMhhHOU(Jtb=6t-Ii3omqJ%AEq(NLU?n_BvQ%5 zQ(9S2sKNA4h3jvEY=i_Oh1vEP@F*d|5p@fDAbCP=t0%alY=rWPdT`tj^m!*dB5%a` z1YB7ULqZb@bIUwI-6-}A#mAxY2lC2ze0wI_Rvs>c?vC{dbNKd5yX`!D2;CjXEA<5C zl+1X!sU5N@?iYR~wkI9JK&nsdgZ_-O&9rwKGL&GC)D__qb!EGUwaw`iboH%H&;x}_ z@(H0%!UM)L(*cG{Rzo-y+B|-fyo$&ix^kGS&vOsEuYMT3&w2O~*^lrU&__su3B4({ z05wVa1(PE>4Y?#vgJ#&Fg1SzMARXmo4l{J(L|+Hx5Ip=o^pI#JatVsBQQHr8NAn4mo; z5Js8n$2zCl9Z0qC*`Rri?C>evEp(*bQ72yV9y9W=dsr`iKlusx-^Un^@JKTXT(jusDF}HBG1`rZMd*Fu~5P|{LWwLLqNayhIEv?6Wr<6ix>cnPc4A6d4od?*n$&op9Qrr3l|A7(k8-Oco7S#-a=f_szW|oDTCOLL6jeFFn#_rK{;(&;s zn?neyYqJpAxpLzFU)owO8L(r2>6-BM(EtCt7yln^zd%1<sugzdVbn`qgBI|Yh-RXe# z;tN>?8NeTF^?fHl(hWU4B*~f~bHh83r#*AStH|QatM`aLv&9eTnK)2K*cdAdh&~u5 zTvi9waR;3OYnt3ihSpw|O#{CRDQV#~A|aqVX^Qf*)ok`*Cv>VnLZ#_*B+*wzTX-@m zsiY`RUHbeFt|gWqr);CDcI}1*m)gpRNntcTl2tvYEJns|(5`@!In6cM$x<(U!Rw}z zFwN_Mg<Fdai*J9w=E6r-E!Xj&#gobaVFw{f_ zmLO2P7%1kZw96rcIgn()ppl4>w1lC^kf1u7kxtw%#yXalo7)rNf<7-v8DA&HIy?_I zc$_bDn(If3HaF^%nAj)z2F+z%R;!(7hFyvLd-67IdujP$HkdVJg(dM~bPONe=9gSwq7!F0Mq0FK3;k zD%D0u`j$f}D2j?Pp_8j5D=CT(I8m!9AQu;AN2aK#C@4ybp`*{M%qi5`C#qV{D=Ny1 z0hlzz)L#`(t=hCijLzlH7GJ6Ww1Z8$GPVLmJAy%JQ>vu8x>D+pJO*IcN4sY<^{)@-=MGkC}Nz6+GE1tTyh{$XzG`c|f+{m1q#9q9gNsj<9PP3U5rc zTv;Vc`I7jROxp`Ny1AkwJNltQf2)ft0s0~88@jHp;6Ug%hQi9IUo9b#(!W}wap=n` zY06s?w^Uv3t*NUiJm7V8r3YNU0vre6Rct6rIh4|}pf+R%?8{q1Bej3E#6+(CY6<4v zl+3xj(d0p?YWH2>GpX`Us@l|gB(JRp=0GpJLoZySRBcjfAjZcMy3|gO(%?kVRGdoT zT7%uw;8d!$rdJLRh-0|BK0L6wJ^-z(E)jc&qYF@cX)4uI*ca4`NL8IMapOi-W+DZB zk>C@6sU0OG8m203_|2kCUOKe+K$;5c;8%6^dB|*cZ(W;0PxrN0{^xYnlE(Yqo$`fm zn4@gr5wmoPb<54f3QAG212F^ejimvS2<(nLu@1FpN-iRbE?JucPGdqwZa7rXi>hks z{Zfv3NoPjS2O7cmg!@LC+lI#co()m5u}mgoUB<;Tr_=y+q$ZE1_ z=i0d|qS!$+%q%2hxF0nte~U;I+B;ZZKzH$ZcU+{CcvUKknAUqq-D==WA5JPPbWOR( z2`ZISqhdQaA zRPfi$F473c&eIE~c!2|wm&G>!_N<{f9HE}xs} z@6uXk4Ry>at&NrrBiV5nwmw(-)UXE#(GrdE#nD!VLG*jqm_XG)1F`&aVMk8u;JL;l zC3)-muG)f;7Fbj~#dQz2AI8gw$ilG7}gz2KLh9+hW^m)^I!}XgJ19XChL5knDQF{zHG{IP) z+pu{Ru9Zw}?{A5M>oCT5{rkevWLrnhA=gOLD!OWF>Q(}Khck(VjV&Y+v#o^qEWQ}kQS|gxzebvDuxA#X*1QuY298F#gx&&irsS!#>?L` z*dGDuM@j-SU zzhYpT?*_l}_3@j|I)+lKrIL6hbK;sy{h-29!Awb_L|wDwLRYO(E6O`FGB%0UQf+H< z6a(CS$CXPU;2fkY`>TCo4N!G;kSvL*3~i67(k|l8BMyh=7^_Wb9$#i&wBu6d{<;Om zE-`)y(-&7c-7p^wr5^lMAhY1P+3LuBgglYvm|xIklTgvxGax>kxeTi^AIgjzIrYO; z^Ba95yiYr7^HmraBqs7aPT=s#Dj(A_VfVsA$rCcdBlblzPgF^Rbns z)p4Stn;IN?OV_zLuK#EgO1ws~66-RDcKZ z@3T^CmNHz&Sf=VC0k0+D3ES#n9NPA~uJ4gETQ}(UZH7)Q#2tJz)bMjNtlE4HcGfP< z*Z^19cYYdIFb>*L% zx^^N4*fNGnrrXLroT^z}ow2hz3N_3LyrOSvJnbzxMWXJKKaWVv#o^6Bo%q^EElv{6 z+@a^tNyiGp*Ry|&AGKG@!H={x2~JVG7EQu9g|+ zes)Z$-8Mygy<>CD>sBp4mP_hN+hFEw)SCZZk6HmnX(Akd!xTu8595p9Xen#UV*h-o zw4@Klx&~^X)2_=mQiXD_{4V&e_lr0Ah+{`eB)~!7cMW`n2K$cHvAGH6ST<-FZfnm~ z&bA5hL(fnbwRxs;i$$V3w&U^s5ZEURlM*lgnFH1Ei@LH*@&q-E5BBh=Cb!y%&a#Tz~fFxqU-Vj z>sJu@S{i-T)ZNQb2~{htGGEx|!nha1y;iuj(}+;T*yhpQU0qmRt1nB2UuLdrjh&G2`qmPEIuS zyGwA5JO;qGP#9)3vva`&DHgl^|jS0x%aVV9_)_KVO_^6 zgjY+E;KLI5vX1U)#dY2wII=jcSh%<$A-ZdgWWOZ#%`|rKs=pEL> zs&n~8cCKr)!dTTbz15YoYsV-g@@;>3k<30Ba9K8+m@89c?%;fen~zeP|`{IerRpXSFrRX?#he2O6q+(sphtp3I!RGf$<(A5mS@ygYsA z8>!W~u@t;izqA*_?R7S~O1y)&c$L~9UTVhD&9)J4cVz2Z=8duw=xq5qeOXn|7uYQt zTwEXKIqn<6dZ+>es^p7D+q&px#-TY9mO2W4m0^D%%NeXe$b>#9m}=WIe2cHzvXP)T zXFCzWUq6>MDh%O1+2V8Drv`u@wRswwDmUL0E*(@`pITeOHr8M|SA;f1{z&KkWqV=+ zpRnXtf=NEHq~UwBQ#shhAXzT72GP3}WrI93UIww<#R2K%mD#ie3)G2468*q#*1r&p z!+eZ|5zt+W4566073W-oj#M%&FRC<`j)sKE3CY-po6*&1E&f##QMERQr-b$fJRi_q z*Zwmn$bble?g%Zv$uPIjCM1J%{x&jTg^NDl)PC$1obzz+z5m>nF2{v zE`kk$z^B|pqXy~#O{cHGI60GJJ2QE~Z4LM2_@Yn}OGs}VUqWqjc5Yc(dIrN=CYoE{ zUcP>hqi)hJDZx2;aEIsb#_yzs%6!`-jfdxikLBrXWG2%-l3D!R3%Od71V}Ln-UY72 zcRWM(xFh^v`6!S4q_8Sigk>W{O|!O*#L^9TFXosC#k358fH)Z)dv|nYJI`|Etic>Y zw92AJU2&}S_;1P&D+~F0uf}*DG1b)%3d-i3NB5!JS*t6fFFaY`F+W!l72G$&PEu1h z6!Nk+Oif1!9&ByT&mUNnTX^JcN<`M!50*&zVq9FY4KmI3a$xC|oLjDt_@ zDVM1%jDZG<$_%Kimf?JqLKM5hQARa_=w{L5qS+da_((l z?xDt4q$p3TnCsUcstJ}_M#dcaRddb2Gz@_Sa({h7%BhrvP%imXGV63@Q#=}t61 z@g4r*cmT03$rwzE{Cga|gLxfrCX|)pddd;PT@-?;r>J2k>@p+~BXb@tpz?>bzd)

=?dIG{FF|ZSN-)x`B8FZcIf}TtRV|LS+@sqpiK=ANo zr`peH3z~YSclQuEE4NzB!<;F{J5!5?vG=RV{N2~e=n!Frl+xdT@1<@3-NT8esUta9 zut)A@&XVP?|Taj(A!Q+sN5w8gJADOBH|27d`X5oS=w}H1@h|G<;O{8V+0I{`{fT zR3^G@&SB_hKo&~7mrjefDHKo4f!?b5@%he@2HydksWo!r<1rH8Y?bh2S&6DJt{D@3 zug$0K*P=P!UOhqV?-ZX3J^I~UHmt%qR}Qwy@nro-CA9;z!6Q`vypUB0=z4V9PT!f= zm#hVQlA8P`rjM9{TsdCBUPZowu8-V_DX)7SD5Ff3L7rAxrQNwQ(M8x$(YRR@^Xyd4 z-JhN|WBS-kt7oi?;^!LXwqwXzMzK>U&LJ3L*qV624TCb42O{iM{U^nBQsyHf=oH<) z(L$2B=tGTr>w!vp3Yq@Fe-MY7oDDYU=OcwdlBhthl|ZG zEd{;h94H&Sd)W*#l~?-YdynpQnmXN&6#PlCNJsh{&pqQ-fMg2tD588Fk#2Vb`nf6a zDVhKsKmHIkG`j>R3})o{38XEy(8P1#Y}s#dv|2qr74~^``^=2Z<>A5I-TnS9 zbV1!c+$*GvW_>L>hJrp`{0aD@O5nNb$NPfu!Y=>mq~9sDU%=*l*r{yZJ(=nUcm#wm z|GvBL{>#dwZuYAu3gPylv5x+0RoVLj%R;^1Dc5O@9}S@SMumT4vh2pvPjA@#P+ify^Pu^|m@i6`W$97Q&yT8mY_jM#+vZHGlDrG1?I%pYMpkt)~4e z(7nptcfs3lQ5%Djt?RO$|4N%si%{{pcJm%y)!)chYQWsj4*6~BB|Gx-#gR^{JAcRD zuS+!cn!M3(|Ijp`LwLbgR=4Z=*2{CK*{>^8i(~k@>-N?z=v@U*e1NI2cl_<`TTq$g z(ao*xw@Kmc1G~}5NlFhU^hG7dO013Zhuc-?4RZV2r|0)?gz;0ShyEl_oapjO*R1Fa zN~c){mk+I|Z*TAw-re;$~{Rt=T2tnTkS-&rSl{wo(>||6CJw}spD*-hAE~}G0217E$pu&XLeGc-mBk_ zPmL;o6?ypjC{i7TsMubCKbre$vmSp9i*c0f5BZFP+Cdw!bZ2kO@9)bK+MMRiMRrKr zy&X4dD0_RWJIA9OH@t1#E$L%u?9c#<^>zo5Zw8s4!Ij1T024N!W~^n%IC2wb3d8oH zd@iLhVv|zD-K!CIxI6|ulghpMH3h2Li81DfT-BOn2~Qck$ROXFNJNx*2{*)@4EF? zu*S=|WV5;4sO1H>i>ct}D~;knpVM?AtI>PYC&&Fkq6b_t@T7ZKan*uiIGENEF=mR5 z$>*DKWVo)sFW^BH63L`jQ!-c#RKO%VsT<}PWGS%Qet~>Z2g7E z1>>FXnGLvw=lx2I3WN=Sh37@}a0g6+ZS?ol2OeU1&|mQaCL#32nm00y=z<}F`1JP>+j2PTJzK{!^6e&Oor@do`I>yZvbWWBKe#y{L6+j9!H2G_CC zL%f9nXa=)qbilpph1h^vv)e-0k^{Jdy5l|}Z4m$-!5*<&2tAUB5qDBf6^eXWt}p=h z;QV7f;Q&IztvtYIU(XLPLes6Hz&NI>+MXfoCyy;uyf-9HVnmy*YPk39-@IC}r&k!HzSKts`NKYgHeK?5AhKbXb;*o-_s1bX}84_ zaLIb5+w=APaa{31bYVUyG($A3al#kX>8HyS5Z9-{agT`s#irkx{RsN%m|-tWa)a>4cu@0}dD88zA7t|JX}2+kuJCDR=c&T- zi0xfF0evz$ou^*%yv(Eb{3k6fFCea|ry@F&E+Ua}SDQnf)$)C5d0`9!u=;-V9v|x0 zYvmpXnY^fR&i2F=;W-jINk$ImhNwE75Q{qFZ0gSA^E%GG_feOV_x=D!e8=pet&_Ok zdj*H}4r!h4H$5FD#4aaax`SShYJ2oUhy%kNd3qC!AZLtafl7rX|Kg-WMVqQqi(VG_ zjY7}=kFR%(t~^NFy}Q$~ZQJhHw(T9;wr$%<$2L2*ZQFKoGH2#F>z!H8ylYj}r~ld? zY8URis;=J^jdZTH8(uL9(k`wda z-(HbvoPui|B89L=MEY8kb^R_DFqbLrcEuujH0d z`3P&$9KJ~ft%LkYs;XlYKUpp5{RB0jt*GoNEpdU{hp+%qa;uV&07rTYm^T@}%i>!z z0hbrgw%HBo8kDd!tfF=$m$IQnl`=(5I)2Tsz$P6L(7W)wO0CNOPvH?Xqe?;B9wn;! zRy>XL)tNvupE*8{V z;UD*@%(!<9Ik|J$p0#o-h+Qcff!w)PC&Fy`@EM`^IMe|wNGHouhNJyVW3}LMd~R{3 z#6<#}<@EwyBgl#YgG- zlMT5d!VT7IWx?d|;#F^nvIWnm_%dWiGup^PC+2)Uv4o>xd3wNmDkbrN>x#N0L;Mxo z<*!QP9tRrUA3z*h6J)!z-DB4n$FKGL9RbIV_%@N4F?jpfvTX6isllw3I4eFlHqqWZ zIf$i04}v+;`qR_+A6dj2uH`jzpqs_#_nfKznO|J)F8)r;wO)R*QvEX+V!R4*jYc+q z1En5}W+Rd;5hNKqdNUJx6CAiees0EuwT4CQg!GbF0~}sdh+4+?z^LXX_aqnAlH5EC zZqe^t+aYQ1TtmK_K;D~Bs#`LhWkZfXDQAp_guY%;z+z&$D0CxuQXzJ#d?~X^PqwD! ztbdB5LyBd5i)8|fWrB-kRzRe2ZWGKX^&k5el;EzE9j3JibMlI0L2|uud|?%Tn))lP zk5}MWG7?TF!Wbi`pE|mu^_*yr58g<|IcOUTw7@|`cg~IElEBadC|82Bn?#?#4#Tr*_eYbs6u0q9+zyoxT zMj`9nPXp6Ok^(=wY2Cf+*La3;;IJpkh~5+g#YgW9QIc##Yh^XTJM=~jl%qmjSgb$l z-<%HQZ}#nTri==zQNkINasdVKj2hn!1%9dw&park6{L(}cPbrT@69Wu5ut`^YRv%M z==n(@LG@!b@{P0pZr_!_zB_a+ibwKpktpU=zU5N7bt%~gDcKh;*)RIyRkA1K4TDJ? z9kd&7dD!Q-jyfu}J)?M60));zpNzuC2r8}8(t%?U@?-R-q{p5%!o=yZ-747x%c2_u z&!Ox7MgIz5=n7=$GQN9Z9SrvLV;KapiUe6jhjN_O%+-DY0^rBAXyiF7K?VAG>S^Oc zC&C-yJ7_)x^ySQ1nvjE7W8s3JvLTz2)FLc`vkczWL#Qxj*hH;@fZ*QxQ&KS$2dBDhextn?McLH3=2dH)5(z>Wi;{uxv;& z>B!0^c0QNVGNKTcMxL?2~0bm z_BW3MiA^Ak&H<>I<{q73k8n!QI2uozP5~pQ90}83}wH{+-)XkAcHI3u0gbAJV$#KFgq#@{LC$fzCzly02WEmN!D_zS} zRg4`^f@xuvi1uisx{w2Zkc|;ZsumTJO)mo6F!a(?5K@zB%$_s-rdCu+Sr$!`DS#2e z%26G%5$7fzw^Qz@`V%0ZlMGo1uGJ1-qvJ_a#)hf|aQF7Qovr7paH%C*MOIE%39LGg z*sYXdG#CD=G}b6@#MD1@!Jbzgu|k`czcf{b7St^G3(u;UWoHCimM_#SeAX;zET8_M z=Y((K_|e1x-(()yfI^d+v#zrC64k51dXte7e=d&K0O_VC~G-J}WMtbFwn<#P83I_c5#;5>Qo z)8Rd~0_vp6ZT=0*{R(7edSCUca}Bw34Xmh{*?*Ifth0dc%5<6&^gbG_6G?wAfzBdW z>gxNbA=d?MEAP0o$bPSL!3;bL%VcEz87LWesbT8(c*^OcC5k-Zf<^b6s+s*?@lR^% z#d-wlNx)p?-LlT&i%5D0Yqw_HRt8=L>cuAE!1k_r0VKM|orjWsEo--G(TGDNvm2bT z*AOWq-o(R}f?ZC89c6dl1wtcg673j=ukA=E(;QQ4vC zf}2C)Ved`j@W~!+NN2U4`l7NeSU1bAMVE?d*K_<|k}3{m&j~b%y8eYuj;_N5bA{BQ z14PW4h2Fm3#S)SDT*piJGTiUcUpmJ-KRwnk-ULaF)ek93r6pNq_RmSg$1|5QE_VdNwP_zLkx$-4D+ajWmt~6;{LWsaOLSY zBFfxPGqDlbQinS3(2++l(|ZEo`H%_UGTpOtfm2Ho@u-1Pe0ayj4LC9Ix87?qQSG*l&X zS_b)aTBBj@G^vHJ;Q-3}LL9U|jL;SrZm-&_*2Ac0xc#G?-_(meh%@$a2a0zbKzU5s zMTgW?L%yRVcZrqL6N1We6d6sUUKRBkWmwDK09#G3EvJWZ+KO_NEf?)pmw?LRzbcA= zayPpY5It_A}yl#>j9@7}Lweo0}N z{$Tpq`-ASIPCLF}tIym*kvmNKWRbdY$R zc%?_xSDnE~fn$dTa7Sh8ZV!xdN~v>n!N}Ow0eGr5s$Km=z4IwEYfJr-JP3+-856Um zwtEP#d)EK7i4&PyDBo?TY;%u_$Mw*c4Xs>kN;MJPEeul3UHigEn77bV#ZP=|TjlS} zbCClp!%5Uy3i$Yiz;wMDR2c7CYO{T#|iG_D~AT|1P7J(gpvmrY*=SbmPdo% zfD#A`mPZsEG#&E&h(K^wE-GRA2Hz0~JPTNW?EBjolswsBAyZwlyn4Q4OLz{nz)37r zft=eZ;Jm5UkM;zp+RG7=@z}sZsDz>BITOMp_@U+zw}moopR9xf5uRmG~(4Qo;V3Jy1MTlV-?-usTakJDhZn2z`?1MIhIAhHS{3{Qr z%|8Biu>RjkSyRBm)+8osThaXS zq&577i+18957(mC!CUguXr*ekx*#QsaKmI)`C+9NrgC`IH%{S|9?#466|pC7@Pck5 z^~<+NrXMRBiIyJ$NtOWAXdxP9aJ?W9^s~(*-37JHyn3B8!w-)d?;jO-{eoZMi*PW0 zjc+0Khsg(XM+FCFivm5bzCk*_13LVhUkakL?lEIeeGU_M<)sRS=%a8$E^_ohF3F;r zeS-9{2zN9_?{Pscjyq;6xwhed!Bc8#rB4w9_p8f>qq!q$p%I-?ibie9& z;2oIMWqOl(;qxNdHKb1pTR3FKw2xpbf_%j?4xyXDI!UypC1WmBIE`L|MBehEA4rF&R-0u4?H+L!_>V`d>;a-C4s_|&DOf|9mAr;BAD#FD9P>{;8-R#!^%i>}k zr42K3C8$-Iu&NxV^*-K6{qCZII5yz^=~Y3N8}k5s-&*3!vxqb;s`X31)3sLT5&8CQ znXRe)xr$ic6zKC5OXc`eeiCHPZJQ1A9GeGb(iapew@1L#mXx`Lleq(6U z2sFf2CspQ`MYBh(eLILifcEG`w5s(I8y5D`ll!5dDwJBC34!DdwLTJe#0vBjV&4<$ zG1?QzYoL`M524oIX7a7}jJYS7$j8or9JFGGUX3=WM8_9_Hfxd%HpRA|!kVBnkA9{< zLsfwBRCc<+^zxwI%L!zusfQ!dXf`^YU@ zkX!haTUh8oX$0cYEuK>TtMHeqwa@E&EjFn6_~}wB9S1cWckFj5x1DC6AIvhh5 zQOde4>v`UBT$1FEa*e<7$W$A67S_x&Pm78tqHWZaVs})Ltzv$vo?v5o;kHCMSKJ_0Q~LgJuM>4wutpEj}FyU5>p=n175nes5pS&3KIo z#K_5vy2hlMzjoNvbHxZPNKeAMA|pF6BRfDNJ5U=h-Gp9}p#@pi@(KXP` zGU@|)QO$}KcjuSVill5{|8x%GihbJXaLfDDQY07X1=Q16`6+I@8 z5|1+JkUbM`Gm#pOB01*RW8u7hw0Xkw+{0bx`54Y|!_~WGi$ddZ=$_ei@vO4z;$37` z$2d=-trFpJ%w6X(?T-jmv&}+GEWhrGB$bw5d5tGTyJ+k!KxbAUrbFiC7NC)S?-f#} z_I(i2^8nfL?!w`|?D-e;BWzD>_cx})ZKTuyS$){gpou502^IHj2F46XufuwQsUApf zFsgg(ifI!bs{6Dl$gCBm>kwsQ#eAj=?x=C&pC_(x$;dnhW|LB=3woz-L!4jYM?8DL zT?QeT&!3=A4_xa@TRUAkeCMtRwRXPcWW0G1c6-WY;*X^M9Wphrh7)bwOU1 z_&%LteGI_&LvWvWbB^2@qYq>7$_}@FzPRvza>x4M?ehY^#1IbSeHNH~p0K6!0!q@q zp!a#fUcUU_(eS@WhJAhm-}dFbpj9#_y?2kt2O_Ca4(GH?M|;iQP4@&P^skivzq-Ft z4lNsO&q)^Y1hfl{(=U15rdF3yk6b;#*lC@7^iWf(Lq~N_ica?<<+P+rDW^lDOjd_x zfvh_DR+T!Ybtk4u2Zip($?5L{cT}+@q(zB5hn(vKyuSQBRSsnifg%a}vP?q7 zBEvY!Fb8gVi1<{>&A9O+X=9?!f@QTU)8tE>F;dqd;rGUD)(0gwNfObM$$fHe4t9G> zh^?@`yLqwfFgv$mKNAjDV_y?eSK|Pa$?H2$I@qbX;86!cR~ewGjlT|zt}-A~W_?q4 z0c>2dcx4+2IU^u@wm`@j|8r@fU_fd97eA1-icwS ztOO5Qp}C%ZPW^C2^)rERO@`&2nxc7|g4`_rTpg9_xs!S@H%eSpk9GMV>15wxXX>kG z61*Uqw6BBhO-t@es|sYQ^ku5_N2+AesTiNXf-^p40x&(K)ug>k_H%xRdO=jpEw36E z1jTH+6^3mgPrho1AG%EpFD4~d#Y>vcmQx-4)0KTb5cgypH?4>{LUo8a`x{RKe`Eo( zdcS#)j6Ry648N?<6xu!7P1;@BZQeT1&wm?C*=-F?Y8wDF?Q}L^ojNKwWDmFc0Z%nG!2DbDJ1qi~%?@-Efaenj<&+Bs)^|Psj)ye~-Ckrf1 zNMOGbUxXy8-HWH&DDE~=+z3c?sF3JnAXck~p@qX=`STAz)jn*pEbd+yVs&hs>)GI0 zJXtgLb1qVBx|8UrB)V!Qxk~3#)zdUxIEwf@r&)0ddRg}!c|UU{%;azzuN_YTR}37j zM9LV~SshV&@&GK_kxiLDA0+c=vH8f;q_IJjaX(q zDG9bz2HO&)UQwyY_S(VT)HS*;k>9||?V?1aO)-+ksrk#+jWT-1D+4`CDLo_-Ura2= z@%JLAw3^D5XO2AHX7?q#PZ_+q`V543pw%H>4S?SK>UVLI>iqe5USt_xAg)^`wnR0H zPi&9>`YkX?IB}5mRLBX6#A$}exy!ptfJm79y%GUN;sKIz)EQ25tuuk@R&5Z`$?E$a z1-jyXW3G^pMK(;ThIFr+F{RSKy+KQ$dkFbeB+?Y#TA}4>Pj&U5z7-oB z*{Z%!bGNuq^Fuou7;bk3k3=S4wP%crlWuCfCP&xi>c?cwRjx4AGbPW+59jXOC-=QUcTeR03A}t(~XH_du!Wp%+W8z*BW^fmX`9K9o5Q? zzmDuTsr?mjI{b7=b$yNUL0-(QEIz;uHJUV*swzkS;n%&3gLk|CjTQiW3%<$zcgdXG zx8JX&5Wo?j0I>d_P7PAhRGgE8|Ab8pUL*v!2RkT6mJ8oSxmL(cWUQUnDC2Pw@E{Kv zDM~0z%I|t}@k9_Yx!=G$Xd$~0^J6q79eH8dy7X@Mkn#R{`9%8rs{#b!ufM+se}f)D z=$jgJ{0jj7!WFsSfJ^>bsRyx7OlzW3nvAhli}HrH_;9fx&6E~LdeETNFxig;onw)D z&hGczgt>cKGmtJUM(_w7PDB-}LqZ~D-~K_~f*ND?N`+z!Iw@_GbMQ+X;Pf`P^g@Uc zNph(*#~dhKlw0y+d|MZx*fxi$A=sqEaw}bV8#=3u-mT8^+@7=G;?(d&rLv>g2~HO_mLFeIR8rdE~(XE=GpY zG2JPa`^rkUS`b}ktpA$ot$XK6539<`5KY&F5*; zj&}VFGDB>9U>h;~z;+Mux{h_E@9cy?R0^z$FMx_{}^Tz zN+zjea1Sw#>G94z_+ZfRaT^D?kNUvClf_6!im60J$glrUZYUKmJw3v-#GND%#qc zIsR+u2~zU0!4ih|%3$kywkNgPU6fuewuYJ)&ka_9v=Zp)WSeX~!ds3u!y-8ITxrS3 zzLGg|zz>D{tGaFA8*7dN@p;5V(0@Ka{8O|i{>jI=3wx(M zJg^LcE?O-F9^=$;TBPq}$eF#bf~_PXep$xw>! z_%PGvv0Y~Ju2nKeqWlno)$-X7`~_3~oFgvJ7(^u|gbSXrptJ%YHm~{MhZT-%6V{dc zcSy!<=|O-BIgzRFL6Q8U&wJRT74ib-`Y?}z(fQ(n0heUK1| zWNezJuNOF~ACyt@4a1pz)Nk)(wY5sK_WmA?UXbGw-%lNzm=MLSTm$|dW)Q~j>k4;K zVVJh~g9LLTU=7)~w^}vxUVG7jzgRCE@hgq@HnTh(2>IpZ1^&U5N<>j&R+68)roAM8 zRuII20g;ALUr)eYvp1!9mgr;RTDlexpvj`+?h8VqU6|x)7LUD8jeV80?#_4IdsX50 zSEVYU5(Q zhY4O=Ik-8bO>aBU#MudzyXHCZ-1E^oE;f`zq{-f3KYgA@e^Ln2z?X3uFP-TkE?0d9>+c( zmoNnQVUjT@Ay*g43WM!|NuO8W{WnYh{O&3I4MAc~ej)KQb`KB;VMiE-rM$U_(C+Pw zdWD=usByV#%=TuCOkLXD^Lmu)z6e(r8E{xFbN@Y^*gg@*$T<8d(}`^axcYR7ZW^ttC_wE_#a zSA?QM;yyyg8!;%iWADPHq5ssBTWv?i9)E`(Am4NUzfj)f?9Hsq9L=1K6pS1k0rvkx zc~jt*MfxW11k-A(Md0T)O7Qd5xYnS_N=Sh(8YeU|7g=x5ORb5g8M`>wb87aq^A014 zAa%YKMB1R{_q*GYaoTLMUUgo1Bs}dMrP%z)Hdx|EIAdYK9@qO;Dq5~C*VRtQS-W>S z4|$zAYj@9_F-Nz9Wm#7rFwv&~cIXvK4<+8XhJ}7UyY|X`n1rvnZ?NSFAvuo9t*1zw zszL{?;-b{U7Ub!v-4`NOQlCc@j=lXP7}H_i_M1X7d$*XLHDNSbzR5RKg4>J{<>w9$ zBAmNj3xh67Mw&q=q@JO}P!a9fDlyAtglRV?pPa~2c8IE|lqqh24x&>OAGgZBmNSjR zCPy)=B5{)a*o=+SDbxsjKxGwfN2|quT?uo;Hg7#KQZNf{{ouFV=ybp~8sY1RE3Uk4 zcr`KL*&(6cX6Zw6r~=c9I=xa#AFxX_W#9@Ij;AuqgcGuaWx-9UF<@-^+VetB{+#DN zjT!LGO)Bj#7S)e39r^XbuZL96%#`a^`gaf;{m@~G;A;`48#n^>gv>B57A=sWuINvS zo-Tufdsy!imwlKslMi1M16koJH+2Gx&@A<6}YN7~C7>6P^v{9T@pBxJbIryZN( z-&$UaCTcmub(wjosui23sV4gMjIFZd=91VKr! zXF5!cw3;wJee6BJ`~`WW95!f=%wlxLh~`M0KHwRob(&o%5Kz;R~}EBR!A{El-7PDUZ~L*$(lS&e={+K@dMmZgYmhYSPN4B`W0yT{i{_a&U#??=#c}3yFfzc1Hq+WOj{`ak# z70Su>>U+AXeUn^C|M&mk|597Or>l*Vy}`dW>u*e;&6*Oj_j*UmO^3B((9CZGFFzU@ zBLF>Ug;9lFCUsgu!z9!MBrsX$#5%ikO_l(HPXOFISeGw+L~4WA5i3D|t4v}M@hmar z!V}LC&(SkG-O|fh4sXt{78t=^>?R>g$<&_Yz$shV-lG<}9WH0$!rcDYU`#iB!zrD*6&4lnB^ujWmQW9$#=-a zqNB$UH+FD)rgXSeoJl)d>TH>bF23d%&%P%65FMS`KJZd&!`^PcN`etrW#woZ#S-A~ z6Kbx5JbSa=tG>^?*d+cFXU*BOkF~TLs4DtkJIkHtj5xy4x%ZiBnAN^_P1Yh=Vo!0> z#NYyxR{T26gVdC{oS}UwkLy?UK@|TW7<+cl_)ppP8Mf0En#nD8F2^)c9f9oPs&lML zGLQn!iu-ftF-#T-N-&Vo)b+0G9D%L-$~t+ zwRyL11YKid`cQ>1N@mVELgRuFP5@%#T91%IP%`POf*#Hgcjarb@W64+WQlDGlH#AB zQ8zOIfJ(t*Lt2jF@o6Q=BAF;#IfclQX?pTW#&`ij%OfNtMCx=ImvJSTCt@O4*=>!~ zgqIN0{H{tHPZ$?kGyP5yox-kso6RCEo|CsYEa;NZuAm-f^2@J2NUxj2;|%lxLfUOY z({%6&z3l5Eh7P{x2ZndhoiT%F>D~x~XUM!F25eDa0FQ!Ut4MOYA(CklYqo%EaN4V4 zpbqf3k^Aiw<28@lI$=;hrfqHbZ@$o*6+-NSv^GCEc-eyI``^9mNktR9@SEpEv!eGY z^8Kdp0M5`REhN8(j$Xs{xRg|r6)u-7f-h(g>Oe#-Xp5L ziCbpN+90hZ{C!BYp2vm&OvZ&V)SLK)B!$mw`{KC|&41fOX ziyrv=L%v5P#TF)Fgw&daeD&$=h zfvT$D8%&)T+ZNJl?GzwMNYaDYXgx^6NUUM8q!Vz<@!<<;ieb!Q3|rB!#}12~*`vK*Tu zvr$;R+=N$wTvQ2}gwalo%*>Wua`s%DWP|7V(#uEGOQR67EuGN`Pt;SBoE_~qVd&uw z!m|6j6r;ui$6EZ;VjC4nGz|N%etGd1t{M8_wZtI8QxaSA*Ru-0`Uq28jzkJGQKgDp zX{XkD7jkbdB}lNEAj4&Ux%~oxp^@G5f-L6AX#T_85I4dTXN25XV(yh}n}o-g{-}iR z&P<_Rp-646COg-7Sy}G2jwr37&dYujMuvz~Jc2OQm<2ttIIn*@YKvTT-*BK}*Z5_^ zZo!`B>R*RoS5BPSAUCM08u`R&hDwuX5l~TkaEabRGG-|Nf|ZK@W>KZxE^j{@zp`0M zp^7|W<0Z>+#wuj^?SnI#oV3}|kn18TO1fGr-xpmr7a>!tM82;rE0sk9u1Zq%C8L47 z-|K6UAF2(?g+wx*zU*H)-X6BrVxSM(F10?ujbyVejbxLz*3WPG`-bHb!*!^?-F2$} z?U_&Kb6O}S(JL@U+S6Ya#?yG$!4t48iL^FtvrFY^wT*?ewabYVvOn^Kc%F=Qta7Uf zb8@~PDaIsxF;!*@V^Pj3@@M1y;udR0i4)ILKAD9|au9_*0wR`Vt|_uTB0I~--JVcY ze2p>Y*IAy9(}pkpyYx)f)Y*)fh-(ro%w5me;hea7)`VsJYPBRik<}QfzPNC>?D`VB zq@|=MX|eDtDM?=c$!C8W0_r83U-5yNxg(tgTbrdM4Viu+!5^q0Xf_Qunpi*}K*GaW#;Og;|Z#Ifs_g(E4lY=))2e_ z6ur>mk5deWMCqC2KG=kH-#k8xEfm)@ympr1?xblWB!5|YmyP#C^UR6mU#33zwg*4` zV_M*H0}9@!{oOfSG744HQx;i%X{b39Jpr1goXwLjK)gKerVXGc3x6=S!+@9%z0BC4XOG>G;|OFP?emzjF2VxvQ>7s@mel8PqnpRV+U{ zG*_Y0yb^7~GHHZ4P|1(7m(*B_aEqQ8uwufCGCj)K;7vWrS>SQh>H^kZ^`%zLd@20x}Q0f9a;0R?oc=Tv4qKgXe zczEu>8DQXTD{r7{Rez&W`2a6)_z6>qtwN_a@d0@*!T}nLAOLy$q(?MKl`4Hu&coKq z5sl=Hn-(3~JB?kUe_Tl`ONkDFH>f+$$~Gi^Yl|k%v$!ylZ`slRuo~cQks!mTjpbD= zXug1Wn`T`tpSb1*8)=ViAg)a~KQ@m=W`Q)1X(BHZJ5o*=`D@$;Dd5Zi)G+r(g3k`r zG2GSZRC2SZ`6B!&7t+3S-;2tTk*6l~)g-VJ=FdlsiK+Twv(wKr@4iDAP7< z5A?ltEop&-vfi`8k=;3_5n`!4kliq$hB}@2Oc+xA*xE!S1ph}?%!l-t-aMmNOV^*o zEFa_WBhrK;2w`{KaoEO1Ii*~M7vx_Ido;6uiampshMF9(6|}kE{{!dx)=`W=_?;gV zeOIRcJw8=1vb8sI_(oU*{*hOT*aJ-d!LwHS&M*H7bxQgN2~G|^XzHF$LsPRHD&D&;#0y0S)+7ZiVAm9;ux(;q75LaP{;_61q zT$QA97%a!lv!i7d%OfT*q^#jyKA>dmmr8nmzwSsHFK1Xb-EBOw56Y``+>o{rL8S749_hwk7~jD`*i>d#nI%C`*^>R4%997pVx||A1;XTuL+}{2 z-kH$Ra!dNi-q_X;vKtovydapPzNZW*qFur+aK&)Q7_r{_71W)ENK*@|$Sn|cX;JnY z4VD7MX;k+1AJ8&f+I~jd@9xg}|LJlYeJ2M;Ya<5-6*EI4n|}gz<(%yQ=g2!L_Fwl1 zCw~^rEgtg0dNLp}fo;N5FeBjSW(T)vELTaa#a&47!hQODcE#nc!JZ5H#qX(I(@c&I zRxnbhs+-|{kS$y0g+GwGOIyM>fyvOfVZfb726 z2q%qDT)oMdClggx*z?+&r*tZ9jN_;65|gdFz>Rjp=no5zQcFX<;!5(rU@TU$Bp{Lv z;)lcWzQrbK9;FynyexohV~yg{YU5e0u^{nm5jVsUMF9)_TSH1ZWd@@sx))PgTp=t; zHB#(P3z$63_eT9ZA`A4%1Li&kN>4`Lnjp;6aZnc&<`-p(WO~g^H7WhYf7~h*)%7;Y z2XmS_Sbc%34QQ~}C~9oj{Cha1SOaYy{|zf1{ARV2|L-IGpY9n_HU{4#+{W7BpToLH z+3Ft-8s4;l)Z%D)Vx@`6KwdjV4L3!LsH?NY#DJ5-0b)5wb1fED0H8iBLmJu9aS(4C zjrWDg5qs=d>f_SJ9(!s-NDKnrcwEZ)iv2Cq;oD-|!TBGk_N5<}efI`GBoPU{9RVXT zIB3{qtI+=(448nd#7A z^%9J6V->*)qwYczL5Y^6DQX6Kkb=4`mdZF2_KVE*gYABJIrQs11RV%il2nqdXrl_w zX^i0aiovDzGh+xOO_^4`Xc(7>TuCy6vpud{==r&OwJX7@E1}E**$i47dBJbjA;^7( zeH@6_^Ql>&~@q(5siKtI5MiEv=kQ(F+5QV6?G?}K)I0f${+&HqGq#vM@bQvqbtZGUiHR4!<(UhMvhcjwfte84gpI$5A z^G}^}wX5zV7XG1~7cVlPY&Iuxk!PYV+rU$V%HM3Eb>!la+%2*uE)nUPqqWIGa>=s= z&W%EyV6IM{;LzPgFFN)ym@!ULAUM1Dc^BZGJ@4{N5 zoG7^Ts>qNodS*IEue>WEc<-|!^OAK`8-!UeOmk?rGFM@!F;})ol2~zeD^hC%zod5F!lG7Rl8T2^5alWQ4vPcLN^5 z=qx-kGO1yR&bFJhzPiJaH9alft9QN9Q8+VLna@dhPl;(Y$CsHh`nXwUkUF1 zZ}^JrrVy}Yy@#PFPG6`-(jinmc#`&58eR&h%(ucQ-a*%joPU6Y4<56!>|4{?Dk9sw zwkLk)5*+H}A6*DaA$4~bj>R&M&=8+q?7WAhS0u*CL7$r_;VkhcfD&Yi@`{Fd{Q*7g zl8;8z63Rc#GIH7rzmlSH4ydDRUcQRup4HbSuxJ?Ql6Y)H^@uz_qj_XoL85si_Php% zh(AJgI~*B0rk(2ghNEiJ>E^x3qPb;M?JAPe<5KHMWNx174^wwefxr|qYoU3ll!Fl zEYSV;3(1`f))tV3-bL#DO)6`*PT8o5_yj_SbUtcDeW6*yM zq?9Nu`lD8;H8p$&@`e?VefKzbu{YB3HaX&vgYGHa(M_PUg?M$fxy}8>>y|U?l3u%= z*HxW=bBDc6(-Yl#-eKKH(H5+Q6ZoHLqBXV0dHKICf&NRHsAyp3;9z4f>}p`?)`fc6MC6Ud@)9h}|Vyu7&MYH#EHe0?DCMd4DhgP?-sQD*Q* zLCM*1K+)aK4riz+Q|ogF)!p?5)!ng3!UaLWnm!mT_RsgH32u#FX>jbTD{G(7m?`@m z;nAkv94S((ZbnZZ0FZj>q_68N0kmuLKziz$q;jV;%Wu4?rbFkg&$nF*IpzSEo5jWg zFY)Yy?G#-*X07n9bB*y@_S5LShMcjS@%P=grG#XKhHdBW15`G>oY(E|yhA+h%b2M} z1M~2ZyB*f8$=yApwx=i0E(PG1$+$-dlb9mw`sweAOUl{%xSBkiH<7$Iuk)iWXAs~P z4RvnCfB{1G_voZ_koqlMYY&7ohcF0``ZWe%&KaUy83c5VF0Y&37oP zXE&?jqO)R;h5f)ShR#8vAVU(ws)cx{`xI$;u9L!2-n^Tb zD}Ri;HY{5TtCo9R~1O#9~+=@r)C3r+^tWH3dZP4BB zfeN~Z;#5y4=;*g;jXZ^puP_t?z_xCWO?l23?HOx(|q( zH`?iA|34y`S|AZ!;O{5~3GKfg4E+;?FW_WsY-BHG12FvOjBiwZb5T-7`Lt$C6A#A1 zhXYUJ@>2*VhA;C|$u$KhAkGRD!xb=#Vr61YfJ)%p;}R%cSQOQ4Y+6_)e73gwZi`gJ zB+;DARJF^yPi@-n!BU(Tc=>#4RJy$`ZJA<-f!op>57!-@R*ueXu57NntT(;C8mWG? zUAN(##oYiFV-O7~Z4sZI*)wnVbUY_xRMwA%j&49OE>m`X@^*#Njhv6wy`o^?BCiNC zdZ-0gk6!=g?TQwqyoTYTJmMzp+w=BB+Cp4GV)WG1$w^#MWXw$7;rzZe^q6|R*2e4l z1JKqr)!$n7`_&mj_8L4y+V*tCyUxkT$iQ61f3_sIg4C>N)+ZB#RU4`PE%`6Z3-`E9 zGRl(_ghB&tkCBSRKHr@BRey9?elfkhVX&g&{!QcFMqRzR?){Zb)t| z(HkP@I)EBbQ_0Om2Oo@d%u>vuawws~jn* za<%{SrRH{8={|^b?yU!J0{N76>aJ zhK0#e1!J!mY^W%VWEn^aDu?wrW>yo*74*PGNkOY-llzHC+{l!HsLaH-rXxE9Z^v3l}894FsL*eGXFfX zM@x<-f;R4?URSNpolg-PEP$REtFLsoOW)S)| zvQot0q}Fi~C4{C#Qp1uX*)>hNf*7isnBqm8BJMl*2FDSWu?~lptc$q-j8J8 zo9(1+u}xxt8dXL*NnlyRT(_@G-ZSAHXTf$-yk&X3<1kzpuGKH`86)hhHU7ykB?q&Z zGs@mXXf}yHF3MhA9Gcn%-`6kw!TmO(iL0+#FeHYapfWC@X&j!cS(QgPVW<~T7HaTo z^0yjtupdF&DT-=Hk-kz;>Fy0k^(18>bG<|Ne1cJbg@?4aW#cVaVm>Zb4Fab1t|kP_ z&BtNp(}XA7VTa8QPfQ{v2~Og9zSN$gO*`-fqeQfhzzLRw1C{7Y>aYBDhA6B2gX4Up zwV#zh&D%tYo{4oF?8On?I27mOX$mJQ>&eQqjqgb@6nE{db^6|bDgUx&I#V;7uGt~9 zhK3ZX9JOo`c_XO22LFZb98F@8x%(VEN3}afE))69oisu9+&lx=P4;J6aztXa1*Koz zY@M!wD!9TlxQhH1PAml}%zP8DtJ>t0v{oxLV!K5UK`wq^cmp6IiQuPsuOG?VVU< zQ$7{WY!|9p%vAwu>S8EGu1Sxy1)$YbHj5k{wM1uvG|@A3G&#A#_M&R7k}GJ~DKGao ztyvX;t0SWq7rmo$dgTE|<@)_|o8*zMlNYyT>YYn~!n6<6caR09l(;S1hi0{)tvpy8 zg)16DuLKPn`J<;%u;9cqC&*Uf&BqE>++9T6<*$+a>uqA4q-$FyiE3d%z|%Xkf$lmt z+2Nm@y!bepV)2w*9iTXTRZ#RKWmu+iI^^|lTY9hSA#4#!gh@sPaT{1#D^`JaJ(%py95ByxPUp1)=5EEumk73*Gf%UpauOyuIjRF+qP}nwr$(C(Pi6a*VKFW{wC(Vm^%}3_7`y?&R_ZE z**kZxTx)SGx~B+z%n1GUQvvEdaC@UTN~<)vgv>qCrahJ;dk)DD{uyzE@j`piDjLah zA9}YxSprAmD-%gHX_QLtNmPhZf?B7HYDln%Lg+cv4yA6uP49~NO4T_7>4foC7U0pe zPWNpny2$`vdO6>>m_HM`-7)O>rprt%@ot$O?@g_!B9LYEX3HT?p@eb71CWMKiZA_SH^c1I!lSJm(YRj-4;PGRoQ4jgR8ueQedW2Y%dra#jCu9Fx_kXo=Zb75D2d3aag9B z)-aZM!%>5-i1gO_Sgeeo{%&k=P7Zh^4KpDJbW)3^ic1Sd>E(-oDQ zL-a-Ns&8Na*%Z2TGN8i#?!QHUFN%L?3VlyR7}@_-N+~$n*#FP%DdyWSQ5H_s|UtFV1cFzRTU5Y&;LkZR55@Ck54etYVT|9i zxSNsEo*U^`kfzl`4d@ad$#=Z!<2%KYQ`>+=@gBO9;O^wg+NByhL4sLifWox048xsBFJd!i=Gm%Y>N1HX9&Bnt4c9Om8zb? z{Xu<^;&&Ne-wp7eLDpi2hNVFKkiS0-EeW z=j3-I3Tlh;V)-BOhG!M?hcHd00;5Hq0ikO0AgHFO3{%1$#KSjg(xj$X=@$cHlmt6! zw&j|MBF~)bs4i1>6P~oo6Fa}vOUr9mr_qf;ej;lz9GckW8#ZUj7quP9*B)~5ZKkBD z*TT9TaosaRh_pmc#lAI9?8ORuPG{saB87hA(YN8r>%i zB}6a1@e`E{Tvko_fYC%O32A>2z%ChQ!X!s}&(U6A9Zz;EA$g_ouxJ*A>;W2LfgC3_ zujkq3%<;`Dn!(o8q%3DkS~15F>E;D`HtsB^ zNZhV6JBs|l`dNm%p;Uv9R4;O4!uvK;hWP10`{Vhz7fY(RDI(ff2iB zuQ_{wXSFZ3*+STRd2ITRagqMmbL z0QdLY72QQ5vXc}xYvWz3rD{S`5wUUhZg!RhMu#SOM(A=~VVcq(Gkw?{9LpoZxvkdz zNOiMcGoY6@rGf&vk&G6gKYUhqJFQqJV2o9d*vH4w>82Qy({-|xD5u+;*y}_xiaE>D zi-#rORcY>Awd{=QG?&xDA-QU&@C%YD*d@||*SBnJA~p0jCaKgb)DIC@ake&zWRWXM z^;4q%IAG**L_ak)Q?SmL1!2s|i=gPwH3b;lOLQWoGJ~g9akzO|>MsA`H*Qd+N7QwjsprTBgdc02#wyD<*OWI&~ z4#~j53*X+Z6?05GRN38+ksis1HL(>&wVQV9rjV;KAv8g?vjxSlkD^@7AEjbr50Vdz zVTBoNMNpzV%P+P_9xiYF66i?1nP45rgJt2JA(DmT8LrFTOIf%gqeuJL1^#_iRoj7b zz*St<{zOzz@G`d=vz^i9mn-4zu*h(jtl2gd-U1u0au`V zyCBEUbGd-$$17jVAGm`Y*9Wizu^619&x8FHM9Sk@d!A(?&tTyml2Z-yjvMBtFAde< z+XJ54u%lf&zv8weD+z`vI5DjUI&#&tLkm+;@f{wuBBZSy5Q8Sj7RCrJ*Fq#GxbAVY z>)yCJpEw)K0CtwqFC#4~;my_~&gEJwsbfAF{&Yk)+f#VDrm)tLH7>i1a8%xaQ+!jJ zHl~TuuXo4LA`$FXZFkAu z!$F++Y!q@_&?4~&sq(au4E_an#!fYR2Fms{a%tnfDM$ZD=5C006E3r#ewHQhf?5|$ z{)Nm{^cLbhfbmMlgHDMPBxQSpZm(|_7&$i)7_ixJiXLYX9}M9i5aFKC#GN!J!d5mZ z)iXus19n&_Z4YwjnV0JmUi~eYwIY?FG+zCB-4Nk0o-o$3Cpn8;W(ByLxn1|A$1Vo3 zPgZfy;Oi^oyf(Qu+kzxE2K<{hv#{;d3@1<5cyB9$oj(|=;tyxv#olNiU(_$n=cY0i zY5f8cpuo>GEYGa@rZ_x!X7e5_{b2F1b~{*juK_=}e0yT--T{P9zX`ASsNSQO*Z5c= z&_1O&-91V#BSHh#{XCbwuwXAhPQ=^OR;V9@f?sGGIlk`-wq8eiIJWCXy;dmzObt_> zxk3Khg+oFXD_BREH%G`=@ROj|kKiX=Ufj}Cm|i?Kj@4Hcv~Sy`34fx|pV)%OP=9fY;c9&E6J%h5 zt2Ro&!T5iZ`UE-_VhO*CrM&O;4?v2dk*kT3wY-tB<+r8ncYXSIz4X5=@ZJiVns}6l zn!x_;fES3MPF`5H7;lxfOfQ`_Et+0VyYnq%sQL1PJJA)f18$?W&15?5dQ0ywpEkye z#9iHrKxOdtz_%nG7?1()b=>Fmm3=%S*%;Z!N;RT>qP$s&(;u|Z{1LzPO3qz6#NX^3)Y zQcE7dkT6Qyg=5u#Yd*({0DKHgCauZ)RlwSDb_7I;02akhrV` z7J~V=I|t?IZ_q~je#9a0EkhyIv><|B2tTFSI(!XqmC0#0j-gVVgK?SBOY|GRS`~D7^c76}3*x zvJ$z@8g9x5m?5!8jpH-#1~GUIcQr_aKT3Bj$rH|0-%r_s3UZTbtA*K z3(tXz?SBD{srgP)k^vnoKPYc|Ey|b$CTAtxOwb z&VN>^B$490PTxFB&hH`9e{jwF`!)O@4uyXs2?`qjCX#?aKo)@kYR5+SD??B)?2*Bd5r>x&AhEna*T8_S|kco@}|! z>HgswJ|gx&SfEEAhGQ77+7AQ`%gm{tx)f#3_Ep}gFs|Y-B;MUvd|a_^k)a{%-JxDe zR|_4yn`!V4&=LT_DliAxIm0NKHOdrTq?!()W^$sF)C{Ff_h5`trbuvn0Uiu5u$B*} z&b*uCHbpd(y1Uq>wwtZ^-pmN!8OJ@~zv~)R`Rd%GXN;|~+K5D9WCs_Ry$UtO`?g^( zb(^VItrzbzum^p6V01xt%oHRdT||=hJ2ZPGe8!W!5y&ho{DGLy+AcD4VTOBIh`sFSw*0C^Q-d9hS)jZk&!a4`9 z?T#Z}z$%_PnNcn{-a|b-oMea2{}fE~6iPBjjtnM;yFi+g<}txI;<(p*)3Sx5?J`hX zt5RZVWX$?fed|~%yPvLFHY6#FxovawYSsIsJsLH%D_?@Q9P~Ay-8Lytk1eQjTvW%D z2u;{WiDvmpD9d~PrA%=XuRpx?faDR{;iO<4u$??%mhQ)yPNT%UH(9exT$U`vC?kKi z$$>#*adLDocY(<>SeH)0sN7q52B@UmFjIATsWR0t9ZW5soT}y{}s{_tn5YePl(#>-dhwjlA)KR_p)t)w{vCR!n z-ypo1?81lvd(?8mOXwh|x*AjV=iD#p*=KL2dPtuCavpSmEwDlTW(c2sTSET>qvG%E z{j0g~_a3tR?0_kR1bWlbj7S>2fK~FViw^>y1V50MpY2?FzVB386JCsr-#L)5K$I^o zVb(+Nx(oUXkcWN%_5ZvW;*Bj8~MJx+&Y~~sOjMoqlbZkgLKfL#24s%;QwMAYs4l&V?>@ zQ6N<3uH|Ah!gSYm`S4tJdcfN~W>jafSR;3YPwpW$g&$XHkzTfC-gdN1`sAIJH_S4e zXZ%=3Lr6C&{Wc(mc2bT^O)r7qhHu0IR$CcOlip#LkmSI8DL+!+yO&J>qoT~Qb0jo> z&&xH+$}(ZvW_~V@kNG(Tox$FGd>rL9SIdpq*y^OFxBTEa5H0HIa9mxT0AsA>j^wUB+QF05bd%hC zFF_Yl-6MQnkPcyMx3c`ByFs2cVXXJO^dqlfo;e<68ms0*ZZ=uf$l^6Ke@e#xZI;AJ zJv#h@im<&z#Njm}mrahSKnU|frEM{NE|V>vp=V6Y%32e=l2k<N*;!f1Ww`6Rnf>*h?eyQ)=_2V#2$}dS!#tlgPSIQ`4)$ELBrueznPX z28DpCwOpsnEJ8Pg0i*4n)@z~BCA+a+vgVdq0#5;kgCWwu;auCCvT4M$f?N+ZyUr}X zpq>2s15no`{3=?k4UZ*;i+S7424Lr(17G!;jNx1;eNL)YSrB?G6wN|^ZdjV+V+-iu z!{kwpIV?yC=&@6a?mt+po|gwql%ZQjQAKwQ1@X2RQ=fB1R2DM94Zp={Y-EBH*2Jqr ziM_Hl$yL10htl?bEBO~+lPifoLIOM4Yy|2cafO}v5onhxm&rGh!bYK3cH~vv9HYjpkXi^`>+bT_HDktz*RZQ$ zQj$pM4fLscp9}7q=H=j&klr-D_e|IJ4&3e9=P__!L`ox#oHa(Z-*|+Pi3uzUEP$bc zILXm+2Dp)IjBr9;nPfxH=w(CB7-Yl3($V^YrlIynq@oT;q=ww6jdwz6Pj>=pk99(5 zPj!N5Pjtd)&v;^ZvfqQa65f-zGTx)#pd2yoR!t7vs7_nt7y9TlWoKJ#e8cO$>86$QFzRIuaPxrDk0GXuG251?>KBWQu z8u4W7OmV~Q%z1@)5kIQfsYtuOVV(qbO>~3e?)^5BH^K>lWk}fpKRVxGxW{kp*9?MX z)PY?|jp=nd5_=)Lr+@i%4}B9g$=b)txDB{H?uqHiagTkIHR;ml!nh5Tqify!%&-l* zJ@fJ71MgnoW?(X=H->>H_^ZAD7%5tYfFZJ=*KX}-MYNM$=?%WG9y(HQ=FurRukNE83&5WsOart4g zIx9P%j<`v(49>BVY{Opd!(lrqH}kmpCyN8);ZtFug$r;KPQ8ms?SNp63m&x|gwqEB z162>V4g$CVe#9srsqlVD@Og{TK9-CkhRihjKcw@CO=j zUEJ10pq@vy=Xiu9jEO!)LxO`pi)4f)K~4YN@sZ9h83HW-2tqP=$Ja7Edy&l`0XUQi z)|gnd0huS9Z!I*klW_nmu#`8s5xv6xpzinN?+b)`St4?F6vc-Bw89tsY`?kEYIWr_ z>wnf=O^!Z?oZod9#6Rm>{Kv_~_*ZzN60L0JWs!Vm09X>~S?AbF92{t^>5?EW0>Xw1 z6H(}zhPrn=tAdy-e`+isKa#$HP5`uOsUyN>H>i^44wh8#bz9dCI+e7t?`lm5W! z*Mr!T73HS~Cl0(Uw=9b=){Oz~6K9xG)OWa14p_=So7Akz93f%BNw4=88JWQt1WeW#gqQ9)YhT)yKgyaC^V8 zy8Hrna5=yv>d)E4zXT@0p*ofdB!!>WoomcMtp^7T2{`R!P9gE%`9jXUuAJR7zvgbq z$fO2d5uSiVc5pw&k4EvGC)YO!85XP($I*Us24 z;UM4&wn=-9R0Doa0%S#zfr#xvLg^4me^cEuja}nj5C$X$C!j<=8KHFWyT@-JZkdBs z!fF^hg;$`1Z4hc0JtJHLcBS^#p={u77&`?zCvLF!xPqTg6{s+%hJe25KyiB;eJ z?`GRJ9m-zuuB#CHYL`V?GfyEX1v{sw%s;%3| zxfJL)doOj68>@$&g%I=NBA5_kJ0P5Ef`|%kMXAz56M1{cUDI>xoBgGO^bKI;T9C0w zC~(?q>F*pHdw3WS!~$_KsL5|0Q#A`S#j*u^6eosrf9KCHw7OzjEqofE@m>EYwbwy&Raj{x(41)tpaYAqe zUnw`b#r2+5pX9c7*?sOGRj+1t=elSVZ(=uXboW0r?qoLSC;UYsE zZdYkIIdw}mtqN$3Yswmuvy+BR{|U3+$b$70u{iRWDOnT_jJ$$;p*iJ*EOhN}B@N$? zmAs$;Gpq?0cIPA%5w=lBZ%j&$S+t-dO$s!j##AtqS$q81t$$)~pc+JFfEF62StxWI z5qUw-1Te69aT`pw8HwV2h*H>(w`MSwYPp?%wPXL-%M!uXTnaJ0VE)1`{kT9L- z{)^5WHM4QfCj4llP8t>m-p}HfFAXrLAp%1?^8%OgA!J+TW$W;w?6j@nFd^%_u(YM( z#%yh<0fn`>E4Gd4FMn$k$$<=4iGlTB#k<&@6}w!WHM>BbrF(?XEjM++GB;(xaBobR zLOJ0xOrFuSik@Y=YMF>5I%O~F1FSE~0{U&BHP&a*btO6@?40CL-l5zskckEj)*j<2ls)neJ1UqN*nx9OqHaie&z66Kk zbC)fwvV%VD`?-G~mIzgHpcsj&^8+`e^cRl3Y#|Na@Zcijkra@}3*l=2_M&-p)haNz zUt;+U(_u5RJ;xyzhI_tq|_YfU8-F15}@WpIy~;OF$t!_nzlUlRH+|G>CpTM+QUoz4KMC zQy{fWptM6JeQ})I1|`q$tPv=hMPo&)UJ*#@b@ObiS67ZZ6%o|%!F9g^YiB&6efC!^Qja}9vWrSoB+yOT+-bMJ|&lANaX_F^31QOhIgFIl<@NISb+t#^sLK0 zYKzj!$ZEf=&P?r;7U^jbVeJr{t!LA6?%?F2k*TrvuEN8d)WYdmICowH&EgVp?%6&+ zdpZSC0WbIWn_<&^Ui+Mex?J)%&&9rJf7A3{$z5PwJb(E0n=b5Fp3my{EgFi|P5Xy; ziHMGUT5gc)Ueo&z2=E)2$5u}m4~oGF;HtpxnQr99+=3lTvA)d%4XKas5{hd zFVEnZV8vU!5)^!#9yk3bO9Bb<2F>|isVD4arJ_$lAw;ia1s^4&VJql;bbm#%8eN&v z!Qns+@>8ADN`+PBwdNLGnOasdb{ed!wlcEk3E$j6y&3q4dNN^P>J*d{4*2byk`e|O z>{>ffA*B`V;~1FR(fbc=jfoO4Rl@}D;af7mg#r&R1!6Ra5X=eU!Sf>`DB7&jb0f=? z?q}hgG*|p714qV0w){5dJ8|DMH?+svhz`n%i>rKJ2D+vS;))9m3f`||ZE0N=GjwuT zr?#}SfwY8m6y~3kRw0_>Vq-5KmQJRm2AG0cG-`l1#7=JDPW#x?HsqN@I&fZJ44>y) z=8uD)TEz^FEbG+Li$(&)QSN}m@1gr-meOUPUvf`%NFCvR(5o(Wia5~PbWi2SXyJIR0^ z%}-m|LR?ZBfBven69qNAR2DP(bZ+dnhK;XHx40 z_={WdmLkh3p=Ew{0uvMm%f;9mLm~#-*-b--oU0I_cM98kZ*^Gzepe^MSY7Tj&2oxSZcm_W!W(m1|43kAGjH%c!voD`kubh}mtT17- zvs4NwafoAIX2&jh>pd`5REXVn{}`F-TxW!!Pl0$x8Xt~Im`3jU5VhK3FD7{)fyIOG znAx?rE16m{Wp&_2DMT#-6e+H4W45+cAriO+7Jj{B1Z2rv1~f}JFfsns3b9bOw1Kqi z02ehnw8F>Cy;<+GdJtpx@L>j8d)Q!JwGt((w`c#5Yce$|H{K7Q3I-L@pC>39HDIt0 zFX`Iil<6C;_Nsjh0LHkFGn>AR(uIpUW}H7$gu|1Xa^qFROmI0(kr-@mK6ml5oDv;> zUbW%N??-11sUFC)x*l4ZY`G|nO?09v>b3~(7R1L5a|a4_Cq7yMbq9)%YZEKu>zU8T z4Q`*p$BlkR4)Q7xtAcp|EAS_juUX)VWfW$V3*1XbHbF<^lI8 zPQV7NTQ8muQvC|vJKj6=o%?72h#SyB6o?z*!4!xa(i=r}T)euNI~Fe9SJ0wEG~quvc=>e7kqgSr^Ood->!E`1Suk0? zFxRuHWd7TxnIySvKpeHe*6^kgvrDAA5iXAXm>$&Dn-ay#W)!7aB=^~o)H8h~$K%u$ zOa^Px9H9r6B~T%(RnrnS?92{djHgtaCxd_iBwSn^=MR|=51OuQG1DvG69`)|s8n6P zG>a)T(>#0ftNX=CVQWGuCt(=5fc-i3it-D=l1=yuP78)(lZ#HHqmK*1QHwaTnj!Dr+Os>bDLecT3XVc zq6hg>m}<}ZES zK`*WZ13Dm;UA|=mg9`4E(T6GM*->bg)ABB+5q|2V;^wcVbh zzY&r=Dr)I@6iwXV*O{ls?r(sbL3WU>-*Jr!7r(!vi4YDy%$<}6x*Mcw94$fV)jx%; zn+w=6#O=Kf*#uDcKbGg@ILY;knMcBR24&^9$_AXQbRORLl%FL2xWl?ml~VU`={C>uCqW_R^k|`5NK7wz-Y~#8PTRf9oJ

eE_8h`-8mxUK<07Kf{V2QNP~aiF+U!U#qecwj+aCq_!9O zbij0=y7~Ndj4Q=6F}i3p7|!IWemY~;uKe)8UW#xBx(Z(GGwW?zKC8!9N?8(-OKFq# z!1v;L6cNQX;}N~F7bYcQZ`i29-iI}Oe%<~0FLZJhIVlSS7`|T; z%ON#p->DN`1eIpQ4j9tjRRKoj(3Uz_s1x~ES2T&3oO0A)=-1C=1G3%r4d#8-KIpc_ zgL*2LOR`Kd3XCU1`-p~xu@6aidv|?$E*2K{cu6hw$r+2;dW>N!dz2j<~bU_NdTzt|B-oHB!2pykTI|Q<*p`Fkj=ALD(v- zHLU{=LhVIMp>xNrS!PbupjVF4TXzg@Xy%dE(nh&LccZgJ0k=I?UdPBT?>nI#wLg)G z?Z-!U9Hp9PrYy7-82EFvLn8RwZpHY3yXr*TZaj~8x4t#ev%j>oQSjCoDe;MJHnO%Q zc>6Q8tNDikKQeGc%X?oWXKd(bIbohlQe|a}k-Cwu3ezA%8}Ue8pdO;ySUN+wHe-Xl zkIh&*igr`yBaK~5`|y+q(ky?}1hBrhyPaK|IV#b(VciKtjB1k|h)c6BFfwkAUAZ-1 zp_JPAriRjmU77$kXm2ok;hh<}vzhDkQ+ZPO{#*VpHTdd${R?G2#RCzfY#7`!vT}B1 zJB5+^UwxS;twGG#EphX=Fk4HvIMPD5-O(H`ydxnmq9eeWv$u5{?>}>dZ_}b@ZiSF^ z&RhW!LSlnYjDUGHuigyQ#(>8#(in4C@uMOn%Be!D4&Ms|-r?*E|abHq>Wv zbvls_cY$11lPr{-`(O5Y5IWgWIhh3y4G>t9iS`KCOu2G66sBx znJ{0Oip!9QtSgQc3o~Q6;^sW;?iYkgUCy%@Pa=7)O=>Hd~fqE*5mSp zS<}6jWe^=R8)uq!-*YkbA#i+k3A`qs3cxxvfaV-QoY{|EEI-u;3jv@G{uwQ6pIA?0 zc7*0L!UbjH%`HOQjDf6wk&?iq;(!5@Sxp$f$~ys~e$9RGfYrSF0VJ(6D3MvjsI~rZ zQ(x~%QQIj!L7i#Fl+IBf-RvOZz6?Jh61~)kb*d%uLE4xTU0QQB+SS2{PT1zfxg=74 zfTjEkWOkT-Y!gWgvq(DK(WEr)$U7KGQ}G3%uq2=zK}WSp2Y;7A2^9Sly+3m9N^P7! z65>SgggYv*iOhA^&Xai=3)!s$?k2hNo(1=2`H`~uGqhRIupqAgsl(|c%MnI0A6cQ$ z4x@v9f!9cd_mHiq#>(Q3JHN9Su%_o{CJt#y%1QO5B|&|32?>FSg>_8u%A6f{U5e+` z`>Ug%SFGyLIX4Q%3rFdZu(rDZkS$87OVS;%xt5WbmV)kk*|wh+gk>lIF;Yf+ z9N$oJG2kl9C3j5FnIVIM?(C!Pu&7b`DFj!iT^+f#T9sN@;=L=Kj=O$X1>hvGVHI2{ zm47z0CKQRn5@#+BGwTW99J(>%Q!-~%AhUoK$BKu1S}+T^&b zyk`{xYxi`8)yATPlaGp@^`}CYF;^}UJ?VGr<>B_R`xa*~sefSq6S|SE$g-`>^ zpi3lYG#Co!mP^Gd_kv~WX6gw`K~?4nt&)M>a;V?&%8WUbJp-G(gMKED7TZ>B8*~{` zXON8PdS52PELq~`);MVlR9X_mpP0cfx8P9{i4VMV2bN`lh?4I87Pr|F(tXR{z*{S+ zKz0WBm-aLol!gc4fEQMbrhrTkfgQUQamZQ*QoydPE50awX;|1(b~W0(6t=6E-q=lI zK~Mj&!Jl5nQM?J;ry6>w*V+}^HVpK~Z&ztAO*~;ASalCkJaBg&IVkeILtt%uY1$i# zOZ{D9(UnnpQFODr2jmOl@Pkqsp(Fe|MaFG_$^zc;TKFQCp8q=QwZeo5>b_sd-nY8Y zKMam48`(P=x$@cD>$&|Ojs;QwaxCCQ1v;C~zoUaU?`gMJy{)U$18Uwdw6Z%)PJ=yU^o|22N@sfO?J0b;9) z>!MSF8{X3SS#yf-&}R?UVhkt*&t=NbAMnd@Q;7xnJ1SC$noHA^VE|1qK3K9fAD=hZ zoEm3|_{JbYDeSU^S007ikSooSppy)kr57G-H>xT?ISj5P!3?C<6I_p**9}S07xp7R zKi`?l(KNa)KxttHTfNkv6PyaEi#kq}*#>J5)wX^2o!T@OW2C|#D5cd{nKzk#S_2pS zDchx=q>R>>O23{dH(oBY%K%YYXg$Ao7;}0w=4+|&%+d=rt_}(E$U6OqCgVoq=1Nzd zehAKPf+p?w{qSo1c@WrfPC%&a0JVNhV-{kMW(?u9&Pr8{p3TQ~eO_&CHy&%be(SWI z%Vm&is^Pox;Aw57lx}gO-#~(KZ5c{U+<*}+CuW2;Tz=H7_AEWHcDY5CK`n!Lo!PE& zv>r@naZpT3nSV?aOy6G%_h2Lc%R|@WQGE*E+NfrDGgsoZbJAjuFxW(lb0h*yo1`xI zk%)v2eLxtYCUEk?#}ZgzJ4fGR#H90r5i0Oy1kRu0WfXUG07^ zs~4EvKP;TQuC>sxar%m?(s6R(m2#1Dsgs(%UP2>tzy#YsM`&F`G61Osk!~Bvm6YFd z8L+x`yIi}!iem|mlC%qpp3&zfiP>rA9#7M^7#w|34*e>^H+q z7D?#&lyGTvO&xo+EtH+^C6%0?%!^MHU#cLw->P#kF?H1HY#-?fJd z)*nKLU#PJ8(a4nu&VLldO%ExBC&$rdju=L50};O9c~5fvDHIHp_@i`+Iy1@|4Cunt zxLkp{P~w=g)%BcZkJY}wbNwFkYt;(XxBoNJThhO)TETw&FvR@vgZ}?cQ~f*Aj*j+b z`eN3OMkYq~EKK@le{1tirJ6WmsUVMByH1E!$XQmPR;czpmH!GaibAk7h&57Eb0hvO zS7$jiTCt>xVWQz|V)VOkcD@uGoS2AcG4Lk>!u}`$zB6E8>jC9qFX*@*Y$6aY8R)cM z;FlN2+EQ}da;@zwTRY?ZR@e2P@74WWC}Gp>8XcemtLS^S&%@xLpR! z?3E&jV!}9F`xIEL6t?W%n9Gg^DOnZ=f1QX+O`IJ&bB=p2%=Cu^qw1{^CCRjc6e-Q@ zIp-Jmz71^95*|)~fq}W8%5jGiSH4tRKs$SZaJ!~LdbdFS9s1Xu_6$qa#1LXF+vX?K zoTCC&sRe+OWQ6%m!#3tEh@w`MBWM8rW`#v+zM#`Yrm&2#6Z0&0Xg8bFfuU*;;yRYd z55$Z6!Ny#gxB}RO`3}vleZn*_Y!H8JFn@flyam}F=aFb^1wszjUl}Nw%ExghY_2oqLBMpC9$qa_t^*Qo64UK- zBNhd9#E>c>=qmYy1BDBdg$s*=M#lPUb=1Z`o5-?-2tCjfCCt&OjIpbWqRS(Zh7dlA zxr!!CiDtOzR`g9d`1C~(CQQHAB$3tQxSN@gUPJr|rLf45A zcY4mi6`)ppg-xyz>_k&2Wk8??7#BGY;Wad|uocg&DltL91??da=c~fX0{0P`8aA3+ zG=sP#U6w975GXp34*paB^WdOPb#~-tb729VIh*39GJt)+u+?9DnuVXr(I<~ z--d46yJi=P!V$VjqEX0j;Tn3nF$Scd&i2>OjMKbY40!nStmiU4@3>R7?@sv)`2%Ox zw-`1=Rvs$Snv@pAW5Z1?nj!tTe&&!K3TuNas}unT1of<15Xz|rM3*S-*n?G&cCiCQ zR*4D{MBQ`+gjYy6<-#-4S)RhhB{Rx)%BfQj&8$$+limG~2z(R+Dww)dUAw>`ITX~B zcz!+aj!8tTF8_P6e5bKmC@E|eFVnT!dHF%_*haLps6gq#maTE9f^4-V7f4i*nW!$V z_u#nc0aXxg>!Ii?N#ztdHT|^3^cS2ZW}Z77S)i~bxx-2ATvaCEeAQY_Vsl598fEop zbR|{@i47>*2HTyN=MYa$Dh_+r3@qLvwRHMnD34}#p&*X@3E^XwEqO-y#bdr)-J`4D zgmX*eli*P}Hme*(ugqEs1vi_u;Se6@CV(9d`8uuC6JUa0cqA6bV^=XM=Yk(pv~WtK z+Sr;7=_@h$MNzHWR((eH&`Jpj>0+)<7Qbb0=ak0=Hhi~RMCgt8oIn$u=Q*H? zNFB`oRmHl7hJwgt=$7I#U&L)`hxx8A>=+h=zOB*;p;<16SGLp2NY+` zwTLvN&Ix{_ih1K)qQF-n42JpIjQkAel@E{mWsYp8aVCT#+Id;T-P$3iDlS9`JPV!e z9bl3}9z#8*5IemOBE#d#xr06m88fnjPIp*G>ISjkCfv&iksYvuJ_9+E+s9})PDtv8 zb;_Br!v>K}e)DqI-{8|!{_96khH^zXP}$o+h0+j!!b03qdH*1jQ=%N z4F32vU!sjj;`K{RfhQd2KFCa-W;wsuaT_G3OTe-A%|;4p_5jF?AdQk-=ClKkE6$IZ zfE_n7T259>P7(XE@QQgi9DtdE9XBY>nBySO71}YID$d;*ABvd!#;`|)brRp@ zVjwPnTvC7sBrG0kUyS`>@Lc;u+lF7c<8q^3w(OB=x?YzY6Rm@FG%fAeomg;$nR@T?fP)aNNpC+BvI+Z4lcROR#2h-O5?^}rJ z(@5x#8cw{Tmv`mW1WM+dK}?>_Otbu^A@%KP>hpSpB?l?GQ;JU+ip_uzsm%HnD6vH{ zgd|%73tQ+CmEsNionYo=02)z=Nin|1lov*oMn{!?m1riF9G@8-oMB;g`)hW+ZI3Ng zTZd0Z%ZX`P6QL++I>m%89-4*nO(BCm4MyA0=!@x{>s?;$wub`FsTE$qtg4~^oRa` zQTC2OvPD_fZk@7ip0aJ*wr$(Cb;`DF+qP}HP8qlQ?f&AsZ%6lyxDh)ucjV7pJ6Fs# z<{ZxelcHlS)LWOP_XTR{0Xe?$d-VkP_?7BA$$K0JVWJILY!&fJ+WN^z_YFAN1GsD3 z`{DUTKO#kU;i#4I9kjvf|B9NVmr<6uESF_8MtjU}|2`VC7Pql3G&G^`3#A}Nk_e0r zMGy4^&#@o4fxe}Qyb8<&f=<$39dr^>PvsczAq?VpcyqZ}32G9iw-U&Nn-0srjs81T z)IKTNa67PSC&VSSWOFpt+Q53bdGFxdX=>YV7y)RR|J`zprNX?Ui2->g@)=&M!B#-I{m2-kpepm*zoU8Wy<^ zu-uGPIm95By(-*$mwjJ@&AWe_OGcucHpBk0)d#`$_*H#X#aco60wsb8 z%WJNSo-$})3kMk{fpS*ZaHfR9kAy}<30N;K;}CsG_mZh zJI`V+!FI(yb@Q6xvA+Fm5@izA%W^{JvE#Y3b<=_A{juZwh1CnplF#OcX4Hu;45ec> zBKe|`h)XMa=e!wZz}t;5M7?<&YkNP^lK;ZeJ)l}6bf?|9{v(;;rnp7(>csB9zx?8T z$&11pd#MY`OVm&kJH8*240hwmk<=v{bZmP$>h~hyPLh#9Wq?8~Yz&$XGG4}>azbS) znAY&;6eWI)w^NXwCSrWGHppbCZTNaQG@@Z=JwX7|CaAlAXfwi(pE@SVK*UR$y;xWc zqCaF{Slg7+vK~iIo)wG|QkgnVM~rC;ax!rM!-^GS>le(CB8F15;95$2Obs#=N|z+5 zPaAW)zNZ0=?RYD$FVhx?Wu9=2V<6DC3-ziPlcMmQJBV)YG&zI49o`ZGuE+VEX$RqN z1O{%12)mPT(fca?yqR;}`$`V+Db0Yh%SEH_HX;O;D%-k#J>}^4P`JU{#{`BhD;}1) zAic#-o5#!|fJT&9DV9wcF_n6X8x`WQDs{imviqE>G z=-Ed$k}x*uB0zQCaw2kSja)!lWJAm+Zz|r=^H{1QzNE&gzEMopp2NOY3EGr!tm!9L z4x7mK(=%n8F{>S*Pw6bNBBC0o$0BV^V3G8h(l#cXSw>7YP65mqQ%IA>&}gf}h=3>x zofyWZ)G!fmSh<;#F;G-_#ns+&EePj~siI|uU3ZgG4Vr#RY&TK|U66tZ4ft>p^jjH* zsm!3rG>}<$QcGKN{(KD5QR~VemG27Vg!c%~)mc($vR7;wR-T~h@U~MSQax$Ir(Q&K z4y^a8B~K!G$t*yrnKDzZf#LKX!Y&N2_09NORWG$*8Z9Zw*52j535v2l7DW)&fLdnK z9K~wXDK1E`n&R&QU8UhMCcT(1COAQ`wxLQ!wK7F;;&vsoBiOj(Qf=nuO3PuobVZOc z@6Ht1v6-dFg%63CnrNp*G?H7v$YZ;FzEmzOP-K;~)}M2z5wH9zFsuo=JC+c-b*XTo;AA_|upyzJH zlVMx+*3~O_7jHA6F0}2-$rv-nG^M(pK)KzwML~`q3-J|Yqy0MhbCxA<5Ry`-;86q- zEg{_WgltB&bX&MvatqnAF=0g_KjYn{miy)uG^x0sLerQN+j6_JGd*9u^s3aaF8;kq zrEwCwrf%@CXyp%CwCVtbL(`_5hf(P9&W=%rQ(~Jj58-Hv*;I-5ck_Os(m4Fx0z~;% zonM1yRFKM2vXh{zlL}!0&~u*M!osE#Q8OELy@#GAXfY$QagZqcMRbm^>!Ro@^(=EB zC`HJr@GU?WtxEwI*qOL8$zs4jkf&E`id+udGZN4KfG7mq%kA$yd^}tdugOq6{Et#N zUXhnpxDoK!ms_$uBpxo2mqNH40W(VL^xUaub=NoJ{sY81z!|-yh3i( z@pwdE7I?g}Z-3Zz4M7JyUccVq_Z@>={xmvLtPcxhfImM)TNBhnymE7xp=>P)GwHz~ zR2BgJfP=p~PwV+r(J{_7!;)w?QfsRBF)`?aV9N|OX);=Lf;$=Ycw_ znW~@nK+NHd;dxeKO=~m1O^r#y8txn!(rb;d3Ec0rO$i7A;l(-$K|2W#6HU=gMU~|z z?O8>zOC$D8sEjZEr%#vIh^=(NN0e}OX)E1WW%0CKwP52=G?fR8W$yJCk3D~4xuY49 zC(WJ5Rgnk6>Po2!?Gl6=2*c;o^av=**Z8Wx|(}_c|Y=9~r7+BmlU!1?Su^O|$)(&OX% z{%e=LSs~1j(BG6?s5U--G7?yafk*b{(u- z`5bJaCakMwn);eE>r44AxcrF$7gG5igY|Rwg@?Ys(GNeZ8FG3L`5JSTE}E&Yg#b$1 zo+W6r)F_z6kPxvp@1)!ibm+ry?1juSkZ+)IRq5lfx!hoqg7rvNUcO7Jz2Hzzx_>Ek zVvAn9{uW%w#Wr>n&}sA_HN=cPw^v>ZvP5f{yu1h7;sQP3#3VXRKO5s;`V75sC4s?9;oNq_KJIOCR}GE0Ds|Ab84ux$1&#DQo(vo79vLO0y`G{vTHZ*- zq@8Kcz$Ac29yd&dC>EffNEU#6mjp2Jw+=v;7#Hpq_^t^+7Eu=Dh2t(7Ko)5S`WE`m z%Fh;I3-%WK&dcuxeh223TL>YcCWYadyg`_q^)|*k3FB4`-ouc2oJGVgcJ9` zpS7!GNRaB674n2y-Xz5lizu0!P!DrPW1t;3mlOe~9b;&Z>LsOt?&%m8ntja$^j41B zboST3VZ~e?+uHwu6ifekO8-lXT}{x|#^`@YV)|AJ#x_43w|`lw6eMkt=;6OIZ5pl+ z&CK123Xh1Dsj*j~NK4~#DNyDqgo}iZPA_9nMPs_|J%EmM?I{2uu0O~I*{T4_xb-Ho zLrst0ho5G2b$fu^qB!%g#bmKGbHa}ApQ4-NxI9rhzSiUaGfs?;gw(+9LPheGMimr{N*x*$a zDrAE^Q%^!+3HQgK@oPtyk$hbG>K|@__pvl?Wayp)uTT-U2TB0G!@<3^AmvNyxM+b4 z5L9aivyXO>Dz%Q96bzGOtLXvVw7&xzLlzLc`5)7YQt=y2Q93$zQuDSy{w*#8V*eP# z{b#wOewO>cKqJ&d<&^)~>JqmxvHj;#2gm$ z7n2UG7SJ%17Dp0S9BR2${-K%uw7VoSm4?WKSs70<9=;hJ*=lTOXaQVmQw1>{)hA8s z_|&M&RL&YLl8)+i+G>%n3oVKWEJgaCxOtoJ04cex>dVAJ@-34KRo6br zdAm_fx^9 zWRvbS)0~FqwRg^)N!{;<5*Pvw{%1lau?l^SNI9UY=6SHwK!i7VZ#KY3gCL#!*xREc zaF|)q*ZVqf?@UqMeA(Lr(%1VkaPM@U1&N%ZnY+fBha)J2Hv;c)Yh9B^6cJtHM`jUS z(?^)>rztvbN~s#MMXzBBjcrFr=HZYMWJuymcg4KvMr9__iD34HHj~LC{WF;j3_@OG zHdJ2KD16&K2NVx3YtFX0k8uMUUW=4T0-FRyMx>(qB8Tk;hL8&!-l|!EOT%jm`h;4^ zim`xr#=rNQ>;sIu6|??o3`r6;??nm&;?UPjj98Mim=nWhbM>ML!Z%jz8O&J=%9`sm z#}vcX6F2T8rgL2eYS}iZQS$*;sfICzl@yDbwh+M_tFGgtDXgE3?GyQ5)d~DX$O`cI z3^yKHECbpKWKr?r1%3=IfZB|inP=pSfSD{QKlwUvYzI3wFD)6V!Ne2|egW#e84UoY z9~&^=E(^NO>*>#^A9`p~lr3@)F4I(XZ7WRp#6kg~-(mebA2 znbamUdMuj`FV+jKAz9;?L9%by_FhE|DU-K2MG-m~Em0XwtU3E*%qO7+7Ewm-C;fC0 zaBoW}7D)^77+K>#g^Q1a>JFX4%rn{$TPW|PVQGE-8K6irO5fn zl8y4%!`eab>5S7Ti8tMP}R zy-gEs2(pX?lL!Nw*v~O0oUKb(?qdq()V$sID%XqjmiS~B*Y;61no?&LIGk3XEf{#F zp@Jye2u4<|99%l=>f@O!^i^og_PRA&>W>UUQm`{}T&2*!ia1lDv&Rw>@r+gSnI>aY zaf^(pO&MOtCkXO4j7be+G`)J8stmrFY&DAlnF?nU6aqTsC!=*}+m8@!r!srA7;xCD zPHv2HX#w=#nk9DfZbHsHDZF!ha_8aBMD^e5BzW_3?vG3OQHpiTA1U9QQ+*2NHO(VTd&W~%`X4oud_;Rx&Hqffo;fGkFunnG<;@4gewEI1 z%RJpy-_U2ioQKfNP^V)&=K5xY5u;8{B0_Fvw%YO7%Y!}quHV{N188&3EiJX6C#}(Q zsvsXokYC0uT2%tJ8R%^`OPLI~s?>R=8ucvHLk;+PT0z0Gx&K-fBra^(e%0gQJxtV> zm}zd8F06C!^!O9*_`(wgWBV^CNaE3^LdXIU z#A?WYOt%m2rB1E>`W3z+6W)0t!&mFC(NtP#tG%4P;H(O2@tS=+3En#c%3gs!hI=U< z&hX0G@4K2v0WVnawB0jxuS@dQ3c_dcS4QT|R@rFZK1U#&{v=)y2u8tF&(tn2T@Ha* zB=RaLU#^yb9a#m!nvzZcTbSmv74k<&b5YT2`2`MUQO^Qy9)p2Vj^Nm8#fe>h>OyAo zDGfEtIgO^U<>E4pj^#XO3+;8DD$Qdd&t06W;CGIu?ua5R;wBp+Vep-(T^#V9oDkxn zp4UC{5K}}Z0a4;Ba}E*Nv5?|3^IQ@B0zQ0xTObR>N0(d^{t^HFfb3ru2u^^d%Cnq) z1OYODO%NO)g^(Vkaviy@znsB6P)ikO&2wq^P5quAJXqyga!=yCV{_T+Z;GBryOTbd zKxad)GKYBg=Gi&m26&swjXNPpEj|I=@~WBDgUdwyY<+?wJNnjP{2kym^EQdJpU6eO z`Mg`(!>JQ3W6R+Rv~(SHC3S^{3n&&Uv`bLVSzc_(hUrfI2W zk+88Fbh{GD6mLE1mVwswr-$Sq(umBY!cL_|f^?E3jS0+yU_Iz0rA{)zQhw zFsohN?UkpV-oeSWZ7b|a$kW|JR@n>=T(!o(WW^q_*lx90KckOxw^-@uW^sgkS7=oM z1t&oBPx-0;?)m@Ui_N(iygEivwI5e=_TkyEB|WppMBz(XRN(vMoU;5vN$FXa3_FF9 zX7hr3Nq$d96y`a%7tX;}(UmpdqA^RmseJ#9t0Q_G>vRj-BhKF%mumuYX1Q?U&d=1I ztY)UcEw}TI&;7vvei-N|8f+X3E|C?N%vOtScSH}i(eNYDF4vG0_G89aO=!6)Y<)s3 zp@oA;`;3!P+MIoo+keuU@6hl422}V4>4q4)jf+K#PuAKCJGpR|P@y}I?>Ypq4NE|i zO9)!fyOl3`3D7z8iDH~!_^93erY6VL$#NT)fsF9R_|O~7z2+L<_Fek83tWQ=ENAA6 zlv&;^3)aph!f1tRF2A*UbmDOO-!rwb9%)^-f98G4Apd(kBj;di`jeRFC}M2$e*&GG zlCA#{%{uZ8g)g}uF~fJ~4`vAiAyI*>nWGUF5spw6|Kf+5Vh0hKvE|e-H_z(5V>=rw zU!ur(1?{~vvv~ICYm@&A(K5@NF`?r*oBKI)hx=qR;p1+lMiZb|F1i4(fn?s^NuMRe zvK4m(W^#zV149&49m8hG9+(}&W`YiH1cz$y7UeoZM<>M7o+|%${W}9!+>zj%r;)+f zpdrxQM9fK$DvT59Fcc_(xvw(DYKkKlvo2*#>27w{zJdeY37U0_9#~9eM!#6=wGvF` zmm2toLT>pI);MLkBq*q)4TqddsY_>W{!v~TQi*>KTrvCkfmqQm~f3oh0@1wr3zOHidp&YFKc;aBZK|$;F>zC z{W1`&0aO(^raB9Led&-t!EpBD{p=V#Lyh6iP_QggTn)Df)uW)QA@vY50kILm4+P!6 z17mHefB~7_rr(FTT5@kHtx5@Q2KhE{Bx)-589~X@yWP3HDQC>M_mypDfF?NghSAw; z1}9V!t)bVO6PXng;(y~=KR9Y8ed;;VJ82DfRgT-%GtSaq989k1~!0mTx}y866Q2I)}1S(b6`mU=>RD0y$uH;`R!@-f6q; zhZlXt2Z$sMP-H8Aw$R2Nu>tRTOm+%P!-X4CnB;2>TRDvblQy-4(!$Wla54XCZAnu0?q;lC6!^$@D`C0> z-2<50t11%(n3x_UvsNOTrs(?6GSlP$Nxro zq<)?W%=$U3%ls&a{}Iq8YiDdDD)o~}W^DI=VVc28mWm5<@Z2qp(&79TN5;RZKj_bCelaj=~BM?R&_Xx=Qx zyODGqS#2TvL&2%M&m5NZq)&H_m!8eneA(KR@9d$}5HTIzIOhHPxw`YNibB>4v0ez# zVmaGMdt|Eulv*fUtfHF9tF3QO`pjJ<8u7ER(96h+IU-qqC1Ru7a-ErAHhoE_)|4NI zPMZTSU$-awpw+=^j&SGK9O4?gQs0jBRcI7z7Ku|K#^E zeq8tYU7gMQah;X;lWxV%Uuj9bURRin1~a3wik@C=%^ZRMnEodPKmGy#6HQ~s84B7Pl;2kb`{$91m4iefD}~_ki?9AZeq6- z$e1%|n6v8`%cUk=!crgiv-Vu=$czXMNwdPfd}C-NSf}Qs8-@8*epCxV+JDILF=}uH zNtqUoImA1+rZw=xb8O;9wW#Rv7Los5fXwt=M%Mg!z=eP60K)$?l_#sB@IQiv%a2h0 zPcYT51xCYSR6~i<3Ogye;x`gWdlk{%*IZDXrxSmG?8>dyhWdKB<9k2{T}}V zO!kLl%83`8>RiDRP@beV#_4EcI(><;@lS0W1lKfv*Z>r+9=+E9RZ?wQk2p{nw91HM zC|!r1<$Ne#-qC4e8R~{2#F(?W&U(c%#BhmHrogIm$DuqL6Nr*A3Kfv|Pce&S*j>sQZrpRfJO`c1KbM{5W1(IOmgm-&VdxJem z4)V0{sl-V!ul)f1x-0cXgOhqm*qWBk1b5?>05+?;e7V5X)0KClnX5K-DZM}X;;-o^ zZ`M`UqV_FVL4R(PI=G~a(7~v;m1RKT9Nh{jOlUHRyWSXwEgWN8#6}i*iHQ?vN@*yx zVv!Ag2|h{#k#CBC4&>S+Ve%#4Ch=qva;=BfAmUyO91O-OjFT}4$EzY68aY;o>g~|q z?tusLCQMp3R(ylamKwmUC@UWxf5uy zrPw|3LWsM5DV;IJsGd_Q=#JJ4>2t^@mVD~uzkU51;;A@dILY`YBd!@80N{t)0buK3 zN^9k6VQNKd`?Kr*e8?I6PdMB^AIm1ySKpstxNjYXgcPZ5B7E|RH~?{VXdry*W+i_G zK?bB^904g3{W2FXah*S432AJM__L^|5=+h1Rqr~~G^I-7f)Ri=!WZ4nbuLTgRi9vw z2cq03-6^cGV}^(?i?4f=+|St$+!H@uG}oM$8N-raTEQzQUj3oWFGLBlud`vYlrK^c zJQsmzIg~|XGmNi*w7&78aId$-Ug~`V#`#6l^7D1{;c6r)0d;kg9i2XPs@2y zjtvWN8g6CfWy03XAhdGXb}=p@TH4q~9*cVbC#(Ib%8OZ5aqUF><*Zp~sOc!mg?SDk zY+ikh>Qd<`NjBZEcbp6_yG#M78YhwUW)9VB#L~_AO$Wj5;Vod| zlLwR-IghE!lj9gjw~?r?%Q(KfI2&kKWAoZEG0e3ozzi&ccryy_)kO3S##A$j=u`2x z3%aL^a61a_N@G?TU2ADeLk(Mjoz`;E-i1HsD z#E=k_A1L4YLAZM~3uDcBLrl!XwL7}>n~eqCdRUpdP}rt zqKh_xSK2AMiV3-D(aMiAx<^>UG|Xl!L1?mL5usA8EvD42H`P!wr(Z7&fVQwNao}3E zA(9gYLum;^Vz}>qj#i z5}PL33QnwbxPYy#Xw-W8RC#Ehdv6;-^E-@m=4o+$IL-3yQ8Bp;E`w^WhEH{Wo_5q} zs!Q}PO+i&Mo)UI%v17}^Y+m|gKdJ^g%#6)w%Oj4;aMlu+9T4$AQzrClGRt4tNBKC< ze+5`(e_=)PO$zKufB6ghg}J}8zq=#x0SeX={~`_hrLoV-`En8Fn-OSB;u9HYi{HJ} z7a9h~`NFc_!tnxrx5D{?6&B0!Vm;Wx`EoVr%J$My5K)7Qsd{%M@EvJJ9b%(#fiELS z&pqp3uP1F?0PaRYcY;vX8dw_p@`>O$=k1yr)lQgn8Sr=SRAWfWxV;Ew+#$t-sN@!*bOk{cgSB^OzqS zbsv^>d(1v(%YmIPslpXku+}TkcL7JNhu^d%Eq{bPeaHeP9>xkHGpBN4! z(d!9IOqyqN3)&f5K(NaV^-VMm!a~-kSh|YB<%kJ+kb)2!_B2Zo!Srg}3qtMqGg4tEKGVWPPQ(B3@uFZz|Mx~aN%$v)UP4FEXJs{ZD??Z`E-;jijwXva@QoNCK>%3 zLrvbadv5;@!Y^^pUrii0wZKo2@rtxkenWYh^GOX`o!z^yW#piEMlxoOrb)9pB*ONX zWW~N<#C}jj(@+Q>wc--cT}@4zIWB3M=amij+}gjWO$F_}*U`I(*CB@PL8ykIF6!uY zEg3M8T$9>+6pT$#m*7xi$uvR3lKy_lFl}u&1)Mx%5Gelcvtq4H-(g*Z7B2}*8LMjq z{8;R8w|%cM@fS}%Q<_M2ts?FC~xhx zxE;fh%G(~Q!Wd!abO$!N1ZIA0i1>N%4fMa~Yo4rd^4We44o5%pta$&iKr=RW_`hvz zZzXL-WKm>p7@&rzft3hIL}xK6KafpeDP(?_-@nL}bN1a%$~@#1~sBHCPCR<%_h^=({ty1lR2TW%h6zCYiv{4#2p8Vzb;Q|v?u z83!BmQCyK)OY%UUnZ3dhTw==67jpIK{K2?l8q)L_$H4FyrjawuQDPD4m?!m;U5}L} zE7agix0<;&k^s>raV|tDuh@M&9)BkmyjD?TKtnLK`aFdn94!xA@o6;k)x)1^=+Jbb zzmiEDl>V*Ec^3FZFWfrtqdGnVYjjKlU+bXC4SQuUu%^e5nm+88_|d_%xGNK zqp)?xWJ$DMT|zWw_{2$eymPX%UfoEc zB^P;!v7GR;DFWATtK9n?LeByRjYFws+)#XA=~Yk=+s1A3K+OSC-QB|h=>4N1`(`9! zy(c3n_!v&WMHyJgxR1!)WyLsKoxWh3`!~BbLv0z6KWrYyOe)+oC-+Y!oryO@i6|QH zEXXbxt0WVhU%pxKfES`=4>x5#jb!*rS2al{n)TdJWwvP9H-%E{LoM!L<$!+%RQ!?1 zjQj~xCsiND&TY!ABXN#8N6bXU=@PbUAtdX9M;3IRD~T(?%E4C-;)wFwqE*S-AveKrNB^AM*_J(1Cvy+@ujk^pU^bh?~|KpV<7y4kNaMk7!YJwFV$P;#zY zSRk(3apdk#XRpeM_#j-D=bp^1n~kmSmG5_1pD!o^4hdaX#W-kGNh+E;v3fNZ#Z(0v zHFH!9R9&NZXBPoTSxY6j6gtN=V<67<{-Rz}%%Ld2SU=Z#|j1<&ZLm7_0$kq$i zl$*wXnGB}D@2QCvG^WLfO&HAylaLCNWhYGYReb}^CZQZS12Twww)Wa4GFc@6lA}KSaF^4OlN=s$eMK&6tOW@ zm>G8-gE)KEWpRi+g5ut*1B&Krkv@tmZ_pSfx(I&fpJwamXYi!Pc(^yOwjFaATMa!b zGgym6y6Vic8lKW*!RjSUVHMTp!j!2wSEtU?Z19XL3t?J6NXluVkN;SoH8Fi9O865F zV7m)DK|05NrsRGd;NUrRWQ~Fchnk^O^)a5Q8kI!e;4M$hRJ$=5nRyN|!$e|M8I?-S zqi*#I>mtt*+CXV0y7XA+j;irXARAN|G^N;+B5P*&FG8T@4K2i4PhpjX&Kop$zd_s( ze55{ViF)R(LJ+J+S&A@Tqz|e*YN#5v$v?bt9~OLE&{(--ReU4~`K)aH|+3it4#^H6#0iR6j? zS^6}2Nm010sL5|(q7}YY-am`B+fZy@6tHT ze}Rg5jLrv&c?>Kv1~7Z^t8_EjjuMj-d=0^BBlTiF|A7`NgxYJqlZn1CTRjfpvrOe^XpQq5T?VnOJywzfSdh0m|R%FaA zsVtRIltaO5P~cbYGrOt_sFC>?@yk(zmxJ&({VqiXUJB|(eO9VyY^}(g-|to^9LhTS zBPWZN2RXdkr$JTEUlq^ipBb;`pEx=V*v@ZF6UUj~j4a2})Wo+Pc1|UyDWnW}7+G2k z*d(gt`b*sfxinDt1hoU{Ft8IaXold}5uICB`w`H2A+j-}dY-2pRBOfm1+@JI#b{SK z@rD_*XvLU?L0C(L#o)hPCM>J_3BzfS;k|W!QDh2KtbDsZQfAS4oIp~ z)a^Mofgd=0zF_a$!WcUR_U(~93D0NbZ>UoXE#%@m@erFjM0&(_X(D=i+A+u@Qt9&S zBo^U*dvH~^RSx%oe=G}z+F6EAqh9Y|dJi^5fp!YDpUpOgJPUO;bFZ>Em(LXaozHbj z-dV_QCp?im!f+`+K$xdaBSLNoKf_W^Gd7~H@ zVo5xt-Vi$I*=;1n%7_~EB~Psk1v<{*70SUsA#HqM1bTk0?gY%1qN@cPe=0KA*Rze&OfcsD^vuOm9BBED5n=glyaAeRe{Y73v* z+C8|!zk&6BA=Q2>2g>PcKQo(wps^y@nGwNgLZyw)SkuYfG9aQNL-aUpa{TI|v|1NZPp z5Z-Dl1o+>~eJKok_OXEvXFYEy@~(vXlE~t{xc;@i>xrdxt4nB()OHdGGE;k$le)}n zFt8m9H0}pv*AFnV)cA^qF5t?937r&yV&_PIHW)x^26<9JR=aGWzCFQ0bJNWN^rVEM zf>mr_3jpK|1H=>b2eUwak-GxaZ6sb)5kD=Y&Py8(;?WM3(?rQbfX4*Mqlf1J5{O;; z?bOPWM`{i6N&z9gis(^JpZDnu{#p(`A8o;xOMe^!7SoV(4Y-JyAseKe^7X*4P+OU;#=(vWE!SYdsF3TUVzIRpeHzs z#TPf_Xr%dp{eK6oxj0QzSpAeT0Y9(*I2J7Te@hxERS8k4e=6Rbe{ENIKtVx~KwVrw zRa`(>L_n)|Kj!lfm0Bh}Xx_x+(|jg+xGyKJuMDGw&-O zu|Gco7P)>0SI5Qk0~9LplG4*^@9>gSGPePnu@M3x0Rhu7&;f~)fTI2zEr#BKi=yGD zCED;qh9mkMj#5x zY`_JG(B>Btl>(rQ%PabDCK$_6FM)N}e5ItQFeCZ%-KTOw5yBr^^z`#ny@1fn-G$jK z##`9QO;HM<;N&4qP(k4;nMaOc`b9?x4Sz!jKMj~nnI$Ua>GxCamm3YQ;GiEPf!s+) zEEuRx46_WV6+`re!^w4Lp#=$TA7Gp%=_$JmOLUlSpJK8zkLnO5O}Fn`4IzRhBe^b> z_B#dSFp~q=HxNK;j3-oQDc|n>MKM^WHIMn+=-^?XCF{J|R}7)rLWp|QEFD&HNe zNl~ZLUAf!Lmgh1rkRnZ{I_je(AZ?3k)RRV1yhC|8Q7dt;PybGV7llp|Eps&3~_-ykwfL zdOd)+-#|^XPoGP~Xe}QR40v>xR#wn%^1{Q4=Vh)CpBzrvc1cOch~?pu_h@=Vs88gmFzXUG)L`*;h^Y2Q=_7X+u~}I%^5kRfU_?TSm>ZJI7>~#| z$2>=WZF4Pax41SbwZbTp{ax#v+IJ)wLz&22dM-i6$X$#s?=D3sEl7uv(xks8N9~eG zcSnV@3Uapr<;d~3vSRQkJ2R6H#K zT5`!rD10F+t(KufdQFVX$=bbmX|eHBhdHnqn|GDA7k&AHKJ+j4Q&<$eoQx4mb9WES1Bi^yNWosM>yO%Ib_gp1t1z zSlF`zcH!T5cGx+a;K;YFApd+H*1f*`zZvl4>$GYIa2Je5yk`daj_d+E@1uK6+Fl2petV?_Z4C^(v%pked{nnufJIg$!ZXv4igpF2@OlxU%T&vCgSsiO0$dd>2mB@0%NOa4t@Pa6Mi;~^9;)c4j%hf#u^#ZGU z$Gtrm>juTU2lWw!cMDa$r}`1OlZv&XhT~(Z^U(+VF{W{cb}_hPMf%l8raYUnrN9*w zTIEf8hQK9(Wg|}iCwX=L*Pn4Kags4(Nkb-%qh@5%v1ofpUcdBZ zl4?Z)nT{Z(O7?m`{egfGmU1e6xQoN@|E>19dQk-O{g_vvf5ruH{?n$f$f(GuB>2zW z-Z^eUrk@Wvs3LqIv&5zxH6DFy#D?Al^fE;#6(q6`=_4*e}RtEG&)eGVZ9vbG&QcOV|o@XW(W02 z%%XRTn;*}zsaJ7LF!d^QjSx<@UiU6s?gasEMsq{|AWaVXiZ=^Qz+uIK$~QJwd3htq zZL2FTDASz%-pFYwNk`JjS|*}+1Ib0xEqPxY{h783KhLUNXQ$Q{%zMMGrf8r@UD@^$ zeqP%3@b6)K(Z?j)Hg*_RUO||;z*&yGfR1_yb!NByI?iZzEcM`vs6Wwo7~!w&Z1ND~ z2c@8rv;~A|x(kG9h8ZEYk<3^-e_Q${+!b~i=;}e{x;s!0n8a5-7!(= z6d=nptpEMfPnbU_$pQfY9RKJZ#Q*W9H`8}8HWG5schxueKQ6|kf05asiu@6w0(L<< zf9DpJqI6Q~)XqkT2;DKfp{_RxNzSho27Hf!dC$gh6!5$kVE52Q=kb*W!itT+u-9$Aqi_@2BofbwI0!u!p#ZU<+pN;SK-}c!z*N zgANFW3<1}1&({|2)$w@^*Hhml_tquul`0f>eibWCv!R$T(3MO&I~GydN^zlu8E54q zpVCul(x|Mc6ncz%0(yri(oM`r8{cuMMY&fbQ_|HZIJqw=)uSswIiUvH`sa~g0wX?P zfvDe6jkqv#A)L~ZnS0dBq&i#4+PGbg4$36!vD(5<iETYNulTAPH1$oXLZg z9Z_u4ig9n>a&A!Q2^D&bYd6+V+uhhnGln#_@Q*zUR#tb*U_DN9Kn5uwVr~1wq+ZWr z#C}rBoPau95HM@k?`FRfD?Gntk{U}Eh~v^R?7IAr*tGw)$FT&7gokbOhi>|-qZY4ZCKHNVKR+8!-f1|(xoCPqJT@? zOGw$k;VhWB)DXMGDN{sZ1XwU#AJNn)bBG-WBRhK}F~-H$%YOYh*J0{e=ZO$~wjLYfqSQ2p}fB@CoJH<$>){W6j1gZFm&s-iGJQ@Sev8 zL9vZXMR=q9zCT`eg?&x?zB(>NGMm1y)0unu-N=f>wInDD4M}QoF4p`4NL`8Ew`#?- z`B4inw77%Z>spLBaf38q74{m;EG#6QnxEd1YC%Kfb~ngd-Rsd=^WU7n{q@Js7p-Gu z_G0Pnj`jT?x^YT?!SRgGWa#i;lcAfnAu;{m$xwbw2Adv*n*@H&2#E|~md{NQO4~7P z9=9YtL?TC=5;38Zv6e(en==z)TA8=_tb$Mb`m3kX&LpvgMyXm|^wsa1)}z(OZl8^> zuF*??af3j^#_K(OE(zCA<|wBq*eK~J>Y&|P28#Edm^I#Gy8ZMfQp`gx$oW&aP{efuWDUal{4aBa(=iFe=5}O>k!DzjiI|>NFNybT*J1!@! zUWGbAo_YtCfFG%hV6DTIhUckD>%Xz$w%jN~=B*Dup81J4tlA9?x0tszn-6OJM7r1DU z^e2d-axI~OT&whv7}_) zh@dOsKaK@LrvnpuU_1$o_yh2Bs%OG=?qT!lJ{Y6Y#i#ptj@V5n9lSprvQnqId91&( z1=s7iBHaFfC*8N79Xn9^+UFM2T{yV58tBTU^K%Zw?W7=69GXn^1?=|1l?!MDDwN&x ziOlugx$Lzx>?GRA?-ZP&2})JOsjYMrX=d1SXRw@hnRDkLG87~lKhe)*nPXtQ0MT&J z9b=Oo$TG4ppKplhJs%H<#hN3Hi+IX+mXeJ+BUgN}mK$5AD;?pCYowZ!aGV5ydU_=p z7Z8ebXRX5{qQSD{8|8A;_*Lwo&%1mi&k3Vbh3 zmt)Pim#Fd<_z9tfk8~drh?gH0JDTaw7Vz^fDshJl%+|YPh`!m=k1er@QqV7tyavmk9};er;an4<;hs7KMceuO6ZA;-d@L}Q+f8$9zn**&OX`}BA8)fV{u zYg5ah%;~5*)qKutB3 zPOs^E)*G4XQ_LFQpMhP3dZ`YYx!vR6yPRwI56uD=??O=)wxQ%8fg_EVfw#zMBwcqA zISnML)6}M9d}Q}{8tk{(9YU3>Xts&U64)(RT}QMTZM+>nN-ocac$95i=PcK|0XDGI zYE!WJDOhKj9wuI@iSxU@x8DX6kn|Mli5dg1vQU0S!&kDwT>S$nz2l}D^7Zpdfa9}8 z`BZrP|AY1Z+Btu37v+t=2qYiCE*5o_8uE}lWjQ4ju-b;ELHI5p9Vjs*81U0oK%Zb` zU?Vb4<5l|NK3CSOl<}fm*6WL@K+&Y*%emmz>+Cyf=A>grQ+K=mQ^`2f_oH=>OZKCz zt=8_(`QBqR@7Lp@WUMGdCO-{grZ9T)p@aJ}6lAO@!cu)+l7r(k6h(V|jnz$g`g{YH z5uszZdl;;$y&zUWZJ+9UFILBs=>6>OKW#_)7+2;kp_=*_ScfqRu_^>iI6Wm&PMi@D z^LGj<3RGrl11%`(sO+iZ3bCp=(kRqp4Gdl`j8OL}#@{`DSh7XgqRazckPLsN*A7hV zPxq)9$oVql=`HbX+H3XO7e`phlZB`m{K9RD#2IETGHxr1WyXyydaUr%Af*)2uQ9`} z`o#toyywO_m)hAJ^UL`Vx-U;6sY2<@1eZI4B9$51P@-Sc{S)z7d$=rSuO+-VbUT>Y5qdq9{q++#2o$QLZ z!vv@;-Nw@USVBf7$Jm$2R0z>qx3hCsdd}faol3h(PH!clhN$ipJf6F!?09y}R~+Td z?v725TRc;>2h--b9;=8Q1*aO8=g3ZpewnA)+dIKvkVI+Ku4XIjZblA(s(XdPaz0NF z^WaF5o4w~6YastpwGc16Ko|6Gtw-&f=ROQXH_@}tQQqK*-{jW{D(yy)qEH)m4geco)iD|jMVBrBxyrfVm@8T@*Dog9>>8?cUP1n~iT7Q?DL}JuC#v>7 zWZG~Vf&JG{zO@P_uug6_Y?gEx6r)=XL*N4-n_6NqCv|Gojz^oHX@__?AfSf5)u&i$pL_#j@ChjEuVilY?OoVyj=cu?|&!+3np>a*#0SiGQyCOKR5@T&uKOA9wE?QH+@9Vx|09NsXmEjc@m*M@p#8P7tQ>$XTkQB12CPf2s+z|bb&JFqs*mV&&eNW<; z*-jvL7{-k*Nshc$4_mit>;R~>9WmYDv3N?#&O+L6J{Lxg(ULnI8`*jfbhg`k_{y`U zGi(-?pB_4SpB0*@ulL&F>6=gPZ+1c@(HG^RnNFYl3tq;~Xm^ThP@bk-ycvem@|0)f z!RphQny23kkr_zF4Yhuqsxl&vi8J@q8d(M(iv|KY#27tcog}q+;Sq49+<%g z>?)cwzF4CuAfT<#&2}k#Yc+fxNpx3w7=VH2KCMA7Eh3ojUhtIICeRRcBNm*;yaR5i zS{S1aT8b-T(p`RMW*Vuw-uF;Z*RJDG8Vwi%r@&d^l?kOIIaz@h+rfM*98xZLeA$X5u(6N%TjY22fA2YztiSyz z{_HvUKYNb+;d6J>Jq-n{Ncwh8+i&8WLPj1;I&15xoU%E zwrx^lea`4X)W_*Q{af2(w*fOkTW{aqF(Pj!o512ZeodyfIvlM#Or1ybehO}<3}k}R zkl2#@j&Ztr_2}Ti9yQD&ya=t3LBdB43Nb|;-lECm3YU5IlT{i>66yq|4 zS1pZt-mOyoj<@;tnK)|46{(qSP|w+j3MuB^S(4(J#lLAgHP2kAZu`=HScfritt1}% zf_eg0fqQxrIeS0Mj{ud!#JycW1=l8evjo$u#qvVz%AlXMvrHY`Nw%vvVp?nNk!x3c zLfk+1_=F4L^7wCV|OoNZj+fzT+_rvG<{*S`~RZ%Ho5hrWIzX((g|61sg zifam=3QXF;nsfG}g<6y@U{>;_WKd9fF%rW4#^A!bf*wVnf_=o~Bi&EPQSb~rPhY(g z_BII$gmH$ANGvlOX;+f>kE*YDzlJ=_h`nuiio2GlYeX2*=8z z<5{Q~XsOu2+zSgjilAkxV5l;m#ti>nK`MtNc9zBPt*~7thX)K~w~_BqfN`AhU@*ve zgPSK@_9U-PSy0VI9L#;nR zH-<)P%}-HnNT#D(4-o1$O?i;apo5ai)tRo_&9qk*a?F0}^oOiZCVkXE(soZC&adBT zif~j*1T?HT!S1!vTdIyYtXkC?HL~#K&b{0!aJ{c_^q3G--_6F1Im-wd&lWrCG@993 zMWX714@1fAkeiWQ0kvP#)R)W`x)?@5H^neMf%8HtIkZizQOdjE*qqC1_|*fSZ2#NQ z6hM&r72s{P1t7A#=r*V_4-iqm?25r2qNR6!J`7?Oi>OZ{Y3zav{ceQ3jD+#_xLjhC zCDqH4X`%1&A(v=g&AntG0bZ(%sx>69OsXR62BO&N*>CcPkylPMkaxq3-G3=V#f4=P zEJ@mdCAw09+vQI!_2D~Fy*#ZC>orwzTSD=|!+WLW_>3+SU$+^O`X*g16)odHE@Utf zPN*$YUoGS?Q3hmfsP#+H4?6K;klY_una|)i04CX)dTNwlI%!$Aou6wd1oO6}aPLx^ zp30Lm3FbVaW2y}dKxlKnQnXp(IVG{R)X|utROf((cym>;_EZyr)&2(70xzv}NXzsh z{hw);#X~QprQa=%Xcijym@8w4N!&bhEYigeye|o4Q}T|zJA~j?w*EbJ_tqtlpMEyH zjVNEfVEw12_j76gy`a_HJe3wu-*pb9Nm4t`jpzW=Ulfo^f)+;d;$Xh|#TSZ03M4zG zaK-t4`i_Hzm=!v2St(0MJ}R$L0HskCtc2TDFS^Vwy3`7nyKm)=+~iy+xd{=^^o(@7Qd;5kgLCTh?xp~ zS}fCs+zZFzA)Qo+!H3_6i0LAoj1hVXS9mT&SMQvGbngta-jrzJ#gFaTKPPE*QOkOY zDs@rLJ_@~b;q&&udp*U%^FHi+|5m8Ua3jW%7E%nOmU+{X2{Y7Jnjo!K>tJbSCMo;a zBUe)2p1<{T#yp2hY{8K&3lCWEx z+{%F^%vnPM^BPkm!l*V8L-{9`u&!xo5U?q|12w=L29(IPjnrChXZs%=q(g~ma)d}x zutD+iy_0#Vc#(CI-*ScQ3jofxTVfRedh21gy&!B?jy(ubgWdvMnYHtk1}`#T&su|* z$DQ*x<$CgZar&&89mpw`!qeQ`&PgjXY&@A&a%+{%Y&g*em%w3M{L@#48%M`+yojPa zEwk`pEZ5g;siZAv* z<+Xw7rC2F&)F@foBW)N$c5@Fhs3O{5!ANoxU45jIJPdbQh_zBBBV_mIJ;#w@?KYM7 z6$b^FuZk#3i5U+tWyEhk1OC?0_;?@Sx;C@Iy^W$*k6V8SJ)KI;hX(-5QPbbqYLjs0rwmH72*YE+(C+NkBGW=#7nJ1hd8xBlAUPhTHxY#m(` zHuWDUOz7&qN;GfkS<7n;=x)T5O4szjtuV)6vJaVpd_r#OS^CeTtLsp(DRoA_ow_)^ zD%$(cJG88ReCj{neVVS(*Nu0opV9-n#~fVt0s?(P9N}f2u4SP=;^+=rCJ6CHPmbLm z&g+TBFF;r)#u}4jf4*YUO<#9YOxbb1t@oHQ*wJy8jNTP(tgDOolB~O^q zb#HPt*2@Io;C4I8GU0@88r}VNBG4`GwdB?bDEtEgjC&MeLZ+R&w%^foT$ae7eV~1AHTsICZnY$v}r3bBr`eSWMt>^B1 zjv<*lB3l&u*Fvk8Y(rWk`!@!-u`U7Lp+T=9ugqM09fJM-1DwpB-)?ANuSmR0gLFmy z*u!@Fxr+5y6T?}$!rKY;_YX7$Jt9S$xuSgSinNciH|AAcEKj!W(Qw8Z@+Vt$!pf?b zU>qv{L;TH<33D&S%-9K0)bGlukU=I?GFAu*&zM$9+l{>`WGgXFwd6#9dTW4z3hQN}wausu5KF)X> z$t-Z(67jc1LVT7ar@DLrdnwY$72d(&*|q!d#M;gtevKp2yGr$Kz1H(einL)S=Cw@j zIh*I<_mnIT2X6=^N0)1NQkSmqZu}^Q*x`h$F(oO<8}Q-BLf3qWaxt6T;eEw$B@`W0 zVR9~XIa8I}VjZ0yHY&bUx5v4yp*H%qe>jwztcTYem`Adrp5tq7WksLQW9kZ@*s5LX zQApLoWG#w~cs6%3;@mG1$d)K4>IACJAP(p<_gOpLPi2ZK#MoCx+m~rGg$A7*t8a~T zc-N<>@kf69?_d73C+p50L7o6Qj4qAj=B)~j`?D;OP z;UR&I!rbtNw+T<7-Jgx$?_sLE?`84$$l0Fl`{ElxSwzR$@CSva-Q=0!4&~HE!JD6R zjb-{&d(#%`4rDX_%uAx|F;kgfyx)MQ1w(S4`|Oy|_}sj1s)jSm*d-%>)6MyT-6GR8 znJf7$i6iLu*M)`kEPYS8!V*mUzTgvca++aLrAJA#M!KxxuhH=Mzjq8HhK3nEPUO`2 zy0FSXy!{|JvFj$7&`gg^1$l%)^M zzK7A|EK<#5IhaNiV;()>4bONuL~S0jwHYBnYfP*-NZ|PB`;r?g&D~%nU^bR89Og_y zn(tD$xOzJkUU8q8<&2b^Kz`X;_rW;8?5YH+z*;6FRhEB z6EA_6x5oggKmI9q{*bw%_NgyJ{K?_{j{=vU9TLB^(5L7jzk`E~p}GG5tD?}T>ZYcp zipmRb;=99-#PCh<=NEeOpJHZaQVrtqHKrqU+cm`IW&8A8+kpD*asMxkmopmWDv^@f za|OV%B8yqTGN7_uWlf{;QoF)qfhOBWBYCU!>XToA5qIr{%CpIRl;tq>mgz9X{&+j$ zbIBd1(o^KTZkf;m;l~mYtb+zBhk~fX<$3J9fBtE9%^DopjI!V^LH_qaeDb{u@=JyIz^-NUtj4Wl8$}~QuDY`Vdd%Rxt zaJ$6uIefZvO4=Nrf0N?waffGc%HoB;InvL11y|g1oNdmy2Zn|{I==*Sct8Y!uYCh@ z_vRj6vV;<63k6oznhB`pz2qQeDLI6eiRIlEI3uiH^ge9M>H18gAMYDi5Q;0sE1jGG z;eX;-!9P5^gJ6cSBPjz=In!QW)?QzNU()?EFW$HoOv@HBV$9Sn#ttv{@5Mt^h>JDf zxGO#4{4@c##9+R@m$^E+HXftPK%~~nJ|0~cO$Fz601_2+6EUEeScBb0xtf-|O^|Td znY!$RlX$eU5<6jJ5er-1ccof*p~uKbE%K4FUw<6s)sO(dRWiVQI3b?SQw1Q_xQZSe z#_AV^iwwjzM7BWr#xj7nT*vQ;Fj__)M=p-j;R2*$Qx2+s!f?{C?%q@>fW7I5;VqKq=ZEsJsl=oJ#Wpip5(&s>rJG}V>79z zB-OM2=n%Ci77%a3sF>m3m@!0QRdf_T#m(xuu3_@Jrlr`^#Ub*IMO3NvZ;cYas2A%- z%82ku4K^SKwODjzKF?I8(4IpMqm;K0w?nRByUKUBaR6~Dz5vTnz1N0^`)&}1HZtG! zC}ki|EA5nL7L4jji4HX!Qmf%w8))3Wa%)Fh_KQ5Q#l&cL@X16_+AYk-j1)owx|6=t zKg?Ps_Npu%_jvlEEtCtc=d;C}3#DVJpu6OiUs}LWb8~weVK%fU_Cq^qlJ40tTTqqK z_nXNWGl!Q!BtV%p1vDBBaI%>OgDK=HDXkqyzS$<*MiAetcwvdggakimTSvT3*lm%- zA0dVbMA>z-Uosx4TZfZ{_SdkM1r3M=%wI#YhJE9SeSq*Z z!Nlm`cgDzr3(W|5{%W^d)wOKIRp4y4PBL28SP<#S!qA8?Yu3qDT!Vybi4#IXLP}y_ z2U-p>2vAxp7CZ$-mU)Si+A6$aKY3;NtkUNF^LD4OGhJ{7MRf9xLgZ9tqi z@x=7LK#J!yPCVB->1|!SJLV+$o|5!UqiAc|#@Ib9E9u07W4pjK#cfu6>h_5s9oXQAx50$V!0lbi`T!-r#>Mgtfs2#T4QYm-Tr78i{>Nh-oh z-cG|$ayn_vMk@C#j_HV_7B?;`Jzi{Ga+J;qvY06#er@a2lu`anu-jIFetd~Dp1KNZ z!IHNn7a4v@kSC5>vrkuRQ+)>U*svf*%f_5;q>~`Y6B)-ItEn5w1l4;M5k>c?9-no| zjTInFyO>G~F2;rqg|7#LFMstB= zfD6x@{`PJV0~wYW`dE7jc=Rl+D|vfKgpMSvE3GwXvS8#kZS!?{53BkUWsgnMb@jLI z!9E+X4|nJf@M~3#C*XFo=2LmkRn0YL?^WIPL_?g_dL!LjP%0%oseZ!QRIDTK!8xyJ zEByBf=N)OdE?BkNSPr$Z=|Y*+Nc!ybcym$_=RZh^6R{W8b;PP$(Vui9Voz?;1YKV46;~lO4`gI?f)y*uumxC6aY6h+8CVYP1{uHKv-!dA-++!hW`{Y=gK&86Z50S^ z`QjFFdktOFC+k)&$d;zNi;$J1s+6>xLNo5@f>8dTfC$sBADMgph0gf}Yi`5BJ)VuU zXcLA)R8BC*9?S`Wpr$uW6|_GVE-2kUcbZOxuFsNgjI+(RXh(;lEG6H#9@e43GfKq> z96%K_kNrYUe2IeO0u_q=8vHYWsA17060sQGLk1HadF35E9*Zb^hj%oF_ z#dC^R`nnB;uMO_S^7!S_In1fzPqbElpmN@@|M)02C&VW~(>d@*jLZ z?aa9a`^_Uq!>s6u8Xs>()UQ?N}6e3V}&t*-G}f57smgU8Q1z7`FP z^?UX%kBgWy>e9g;VW)IaA?xAV=i#x}er2Ee@x>aA)T0)CoWEyEx>M8YuI+Hv`U0MI z!vA+F9#gMB<#w-$YmKou-uiu+YfMgb%6EH|vlV}=yE+CgGA6DbY5DM1ztlFzY6PIv zDja&1A2jE7pUkbqM3Q7V$$^OU>1s)Dqkcd)6>^75Eaij36+$SF#2=2A<$q%D<$`#r zQa*2{>prjX{-g2fUk$2)z`xvh6pT$j@2LO2(Nh9CU@2p8V<&0+857qaU(ZN(~VPAE6(BxL^e4T8;*g&Sv9Xh zh&@yV@S>2{5$YG37sU8zZ7MPLtktAe=a8z^m7u1nBV#XyDtY56;GZ;0XT*9+y;b^p zCR0fbVw7v15=V(__c|F1Z9MxkNRh#uyj4SseYdkpU!jW@C0?B~k)4pJptt2@QTrn) zsAv4V4Sd5|DIjPMvzeyu;sSODH8T>6s6SO?rL>YWi}GkA=hCK?8g?!srN9 zM*E^+Yu~m`Y1L|JtV>I!)HQE#BN(bn(c5{++*w?Df6ZxY1MSRu%=m{+HLIs+mENTi z{M@4V82Z`_)z(D_;aI%Bt!UPllZt_Q$<%_NyJ~bzCoWUXr#_EL3q9jsB!i7gP0NU_ z#1^}du`f~@?pCf81JCX>jRpD_;v6K zsY$fe`lissz{Hew>9|ZtC31$ii-s6j3eIH)&^^iZdV$>`$boIrG9vj4i7irp4&&`;59Cok_Z|J@ zu*YFBTlR6PEa3>2)fbT>jMmANp_#T@kX0KD*J}`8UZq1!o`b~i9mA-m&qgYw$@LC6 z{Z_%ykR=>jecQaY?|^$<1g&YGpc|awq5EXIt8Dq`IYoQ4mss_$%3cv#Kgk4I!VIl) z5C=w_bS@kNJ?gM%46x*mk(6P`98<}9l;cx&G;!-Au%_RK0w$e$eyDd%Z9!0bhOmQ^ zfCR^ubVTV&S1I%}U#`wv!&?5*E=~xt)e^_x@F@97cRTm>O&s8gNV1C|;8$R!kzLR@ zCefFY#~B!%02=Qg?y?59MMCcHH34i@mt?=@@u#H}36Hc1}j4=u7}oWFD+@5Mw$ zwCIrX;xhe>w`1ptXwg+_ID7gA3D*T>LsMc>E4fMtT6_5Dy3}4PZz{wwunHMW{Uk2V zm`q(Cbe|lC*20FOJvSi|)FZL;1^O=UsiXW__CYJaP>LK!1JVgKXj6&JA|j2!{TxW4 zxqql=oKE3VVlP`dPWfQ~L1Fm6AMHe>4MGN#7rzmsOiBs264mGBwS;VjXa%^1i11U7 z@DJ#JpHQ?N44{a7;uKLo2XJ)%WkT_p-ab7hKE0hCMXa10%>MeexA}YG94Y@l)&tyg z_qmOYja`TZ*uvo$pe|w4NlMTJzD*)7J550>2WetyB|drGI})}#5Kr>E#LhF3gA*C- z!Hm(Ik7uuY$UWpuw{kUE{UUJb0jCp%)~wR`#TyUjQAL)&t4vrM%G(xLIGsD^e#oWE zS-or$qv)7@$7F|+^CCE(sAQHB49Bj){Bb_T+VBcGbi9M4fww z(`3YiIq0@M#wgHrCfeI$-f9=V!J9d3ctZw7mLpd3=JO>N2fa+eRdC@vI+H&Hxd1^| zw3lUeH)SV${EpExv|g#>>mCCo1rfc8#Z^x8fWmHy^Z;%GJDNAF8b9DU za$%tH;UBUY!cJFu#-Ale?X%=i{2yXsZ>;ZV{C8yjRdWiJEfuj;F}$O+(7rO4g8QpT zB3Vw8%t~UVr>uey`cY!=%`Yd>*v>Q8(6xup=uTI6dLKt0C(D@bHZWd1z8A?9U$GNb z&4_aZgmb!c3~f zbXK=?Y=I8(yel&#ahZ|F@EW7LWK!5$D-|%-jyzH@CE221w@srezj3^gdgc~fF4d9% zu*@b370ok$F-+;&&ZM;(f|eYpt{j$34M?-sc$9BZ%H?BYY_->#py~{JgaE%n-k81+ z23K_~8sC;_I?d1*TY$|vV=7;#GG71}-;~p2u9RPt(!SQtUE5ru_A6)_?^N3x?A0M! zv~ci;0}*GBBU!SN>1=q8?c|%F*EwgVf!u2Xo+?YSY+_HC)HAC4)#+Bx;DkVFyr#LC zjBPI!w3cZOXjLmYbBatXYKnB|u(k?|frmAzcytvtwtpGcNv4&0p8s|s7mn#pnM8js zWa^Tf4h_;bq6}qE?g*o4b6aP9lJLVCgIW_AlI$@cA9}IY_|Ak%v`tWl!`k8YH%^## zo&%r~Ee@ucc1UAMs`3}mS_kq}L!EHWF7%MB=(kd>R`Co1v%>aI>*d%qwdD~ie*xtS zBOzEX&W2y_2IYo}Pjxh_c6VX5#vT{ih9U)N_ZwJ=4<}%uh>( z*8JqInLwoYJqeD^fdw!R&MVBWig~FBo)Q7Er z>2GupdOrPH9c%U!XR1;7w!Y`AU}>q`nY+f(%o1oz!QpUV!2w(98|zcAkI~7rw$D?| zO&a+LikGNDGuO?Yv9c79z!y=Xxg7yiTSb}d=F^te%J>w|acIB%beu>GTcwey)wH35VR5T}W$s`>0Ne|iOOxfu(!l8VP`A+qA8*Pb3^8j#I4Q3a zVvu+b^lts&+20lo?LOJ=zmH&lvfJHqyha|7<#=k|E(&IeA#N7GO)-j?+&-7A*_v*C zL#pB}IKXueKf`Yk#e1X&RLB5tSc*>0(Zd%b?@&GOzqrV3zk_ADT}@rThxEogf{rd0 zcnS+x_r7=&GA6^|`-#4i<@f$8gzXP0WX2vwKue$M2#5a{7324igh2Oa z!OlMfqaSz&+41jGKOaLOH zrys|*1Pf;AAcH;RknxXzPf}tKo%bl7iu;z4E09Xg|ANJOE6Puw(P934of!$+ zPuQ;x3tm4GhpvUJXNUjUADcF~QQ>?RkiWq0|IxPlU;VM*|2J95*a+L(+x+cQlo&H1 z(a(nxICW9IIKNm1t-A5zALPd=JdGd>89IQp5h#vhA(0k)qU1$wN6_+#dndagX>-~+ z^mc$Vy~I4cJA3=qL%_mOVpti;k9`)fGZBc+>C5YEGi+yj@Iv+W!?~Xha&PWBf-gCs zDnG0hF)&o9E5=FhUcwC5RMhoMa;WFk{CCd_~c}dV(AD`ZoR@s z8mvS1#P`>%S!7P1G#PtM?h(IU_+1@QNqyoatY<6F1B=Rg#9W6;G>*h0^;W|tmwP=5 zyud&J74pNoJpXYr>xC8yGN)J(12abM5HC1F(==cFih;6Vx@=>e--`aQ2~vIQE4X_p zAtje)V(a(t;@`-8=;aH2I*F$~|ELRHM2r}wpTAk~vsVA#{_0PCb`$ge&G`ANSo5K9 zH^bw9*6K!u=|nYQ|7{t>)ny4fpafP~RbN9CGk^q1@i*)G6Mhvay7y0fz-EI2#c|)@ zI_Ht?EL3UQwFQH{d73l;h?-3b6k>yx77%c%D=}@B2^0z44;hAU@b6BG<%w^N?8v8F;;z zU4wZ^Y*Tdkwj`6kDpjW?bs5I&Dr67ohv~Ty^zfi(XbozsHD3O~1eprpmA3edn$l;~ znEo%Txq^*>lY^u6r>_3L>U!eeftw4CUe(yr=nbs${3&l+3<(sI{6QQOp{%N}5uApE zEM9cF%4-j3x&HQt?52oXfgco|(R4D?VKQ@g_-KvuC$d#i%aJ~wYzzD%fKl@Moy3xJ9N=bZvOwcT}LTW@~qWX;iZ zW!F3zx#)x@m~_O_uVPZ0xixPXixEyW%-Gd$?y-*%t`$^T{{w2CUC`Sl+7H^@lL)g+ z1wq`yb}9BddS(oTq{=#~z9upM(D0yN8>~VQ5v7c~#?$gupoS+c5r~B}_q`Al;AB#Q zhn)2iMgjE~6Spy$+s%)YQInX#^FO6L=iw0YLtJGr!5@|bH8H7;azfk_C-=sxI~eRR z_;}1%!qdnIW4`Z*jL4ozuI7GIh_tfTP?h#8rI6?)d58>syYH0CV{&z3ck?wZ{(!VG zqOVD{0wXmXN|j#!aCA!PFS}g*jN8>`H%9&6V<+tDXl(897dlPR(f*V8@%IIQqUHa9 zF~0={I>oYrQK-40DV6=CGPGZT+CiS0{1kl_Dl;**<0;`oK1O6ry$+jLZ=7N z)A3V^m73~FzU8aG4GpQx&;xdmRw_t670Q2!Szppz_lY9`eF&^b`sU%b_UzI*Tc6C) zl(DgeR2l$4T^f$r(QxLm<`CK)wyJ%Jm;%DyO@B6C*r7S$HI+7@S-UE$kLhGWd|6~O z*$N!AdG|rQ=J13ZeQO6=3#9xAI0i>;6s=vnDQNNz=+T3E+Bg{ZA!_#`SMyR1BGv4Z z7>OA^*eb^R?8LUyr$K?<-vuKyXaVTgGWaQZIV4zkSf7V!tSk&OQMLXQUppxb*Dw>< zc<`*9R$r0>Vi+j`f%T6S!=Sc$Dl}G?0P)~;wK_KvVHXNgqd4@ZB4f>2r1v(chk>dt znIm7vmKh&?j6T4HxHYsxvI<3f{ij1XW}Bf+sdP~o15;wp(VRm-p`{HiH6jfQ{`#cY zcWeHA?JHYl4Hjlj+S^bmduy8hW>D)H55}A>`v9eAKAZ3kdiTPJ3VK)22QXusD7p8@ zKMeCTC7X295}d1Y)pFgnW_&~|77NM9SzP)8Mx0TIF9Bf#pRg-I>3fXTvq`-i^MzMF z9mM7wzacUvi3)ISq2)+A_iwRDd=36qDHS43i6+JgAadUyzU?50HxmhHNw|kCCN#(h zEPS7x;nkwhOZgPqvO6PPN4?*IY~dU!2ds%dkR+n~CaiDzEuBxlZe>s1C9SB$gHR!D)9Fn`K$QLAp}m{lP;{TYJklst14*!b$*Nq zD1f{PRyt!?pI=L{O&3c$W^8r*%xs_K-wsK;&6aU1vpu2OJ7+uY~XZ zw7Z=$Bxnp|hYqQUq?rh-@eLy;v!SCm8@$@VwXR6G6?%y^kKK9#-8i#}VghdzAqP~$ zh!%fDzvx52GNod*S}I-&OYkgtoTasB&Dw>rJsr&(inr$`+}ke0cLwwA(#8NMyB&?J ziIF39{nL!)?w0E)9}&0x##;4OM4H>G>0$YTMs)N zKk@6m38w9#Nm8edjTZU+HbFS$3>+dI2176_1`HCw zr+B>|_#99t2a4E@9hUgZ;56HLJ+J_D?KN!F?wh_}uICW3I88$gA?2FU5cU~8of6R_ zt9WZ`QD;I?F!++YYra=M07p|wuezT=QkwgRqBUJ*y|WoQ}=x8>^+{^ zjjy|*CGPREra^1xO>4lgHjNJV+#-QQL{+;W8#K>q=#+lVZI6&fhxsY|xj8XDMa8@W zpvL74$rH0RkN*>_qUKc06Vb!?wbB)SOJ4}pVd4^RSIa;}50&Wy++8WxmSGU@_N0SZ zx895OttoM~0YSVcoR@<^bvOq`l z8IzV|N7Fi+@;IZYuT!x>mFAx^i#z(ImBf_O@m<8ZdD-fb0>d0>1q(Ye;Ay5RaGpI) zONx(QN}z*JMY{%af3;+EeW}aJ>0qB3_#q7_Q?7!#5|8Y-n&fzq``{~ zmNq=TG^tcD>mcCvp(j;xzX$QFCZEtPal$io9ZJ_>)^3;YxK>Q*vb$e`Lms*>3z;;x zFuN$XX}2{(ttEmpC{<=bVEj-c3kl0Q1K``B+-31j5LL7*k71@4So8W37~tHcXO0-S z*vOm6A7+^F6yM_jjjGf;MX8nfHcQ(*UaYV=U}0-ei)8ux8th){hjdmW;rbAT>>e~9 zG*G2agWrkgAN?7=a}xIx_?IuvaQ~e;@OgXrZ$1E-%C8RCpGfOP_X4L;I4S=(x8*|~+ZBYRJOWNc$bf#|;W6N|> z_DkM}Lh;DpLXxHCDZOpf~&&i%|lm);5{ zVbGC`MOz`fRGcoHmMIjP=)}W)@)J7|LHFii1ARxH?u(cWQX%gOy4dWkho`(~OOIwI zE>3zDbSvJH9a~oq(ffL=w*GWZBHn^rOVRxkmE~aO0sLmGF)sl@BRyOGPpNTDL@c-j zDorWo^0B^D)?~^C9IAy;6XRY-s?yh?l6GrmCL;-EQ)QwL0Y`hi?_M zB``Cn;G`|8QL7G1=~72S1Gs9uRJPJjNf~8^ATyj{nPelC=7fKc>s8HDRz;)DYLlkE zR%Q&{#JQWBXx8?yrk84(-ejpf=(kXV;j!FgSw&8J)YwUYhLsMhs#LGI-cEkVdgf

?d*^7CJzo>UEhf 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%0AeFeUA}N|0Z+} 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�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

Qb8_RLx^@1485*ts!O$oJ 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

-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

=5U=@{6^FmVy6v`s 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

  • e1qw7Ad2&_DN%2 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≷e@ftdSGUeh`wqMt`PVRa+=4ld#CGn0VN*KA8OTGuQ+lAabIjDeI^% zF_2X6FUcCs=ppr0C1YMgeK0s#<2;)*RHddd^zLA&Pt=gj31xYVBnwTtez~uZY55d) zEtuFgz*QsgqvTf$PsUPz%m#n;eemmEiD&UaKDLI2Xi zI+v=7p$9b?!w$SH6m_ksY{Jz>mbX+(o?l&MDpyeaW>R0n0~2qf6t|-YGo0hJXDZ&W zU!o)IEO}HQTzP+_mN|3X*P~jA?ARzu;kiCskn-jr%6Z(_2IEp9tXS_!(X##D+*jXW0MEa#t_yQ-Qu7#B4FE?Uo zU9-8bn05rcQLu@~tCP|Ty6=FQb#eQtJ#F^ThGEn~HD&zSG zl8=-wtHEB;5Zl;0;4dmci4`7cHX|}ZRKLRxc*bDQ z1Z7=f4%Aa-WRwPQL8&S|AoO53B`dJR6#q@Yp$D@h2K=fSr7B$ID{Of4xk)OBtQGc- z>r04e*Gt*Jy?>wYP+<>XoGt6rw5W~LjW+&?Ar+f}j*L{Gwwv(J*wm$!^tLj=M2dLT zr5Qm1D+ilVz6YC)2tB>Ft3P$IWp}vtcSZ8j^>P$V*F1{SbuBcN5!sp`Yy90MYhu{y zgk*`u8uwX%S2@I^zzRTG`Fpx!O=J2vON)MT1KE@*BEul{n+pJ%Jm7eaXplR-Oh*|& zw8k!47B-78XhSV+D#&B9mzueCQ>&OcrIc0^qC0Rz{IR^#Pkh zWuV`Gq_=HfSFvx)cm{kzu&>Tw1)$%!d1D!84{7UVL)WhR5JWZF;MZgQw5ipB*XNWA zjpVA)RtFD_zxfqeqQ0--7v7ALCHL;dRm9RqTy|_S>4Mo!M)Dfw}C?F-dx1h zkRinSB~U6tlXOG|egpweh&B>RtVz(%Wbir{K=%uxsL8O;5m5^hj+J$UFm(2oP}Kj{RR+e<{_tT@HdA zx1&G53~9IT4;0*j2iz`Qy+nO|H|l-C^YmL}HyZSsfy_Tm_(9WE_*O5|SIF&@fv=;9 zLu1N%;K^a@pI~WXIVRl*9+9s}F;gBXkv5zq4BNQnfRmMfPZMof%L|vwnxVVh^lL2B zj+bYu>RVXsosO%YuKB(BI+!bd`o*j#fA+FYw$hIwipd74F~dY}-jYRg>B>G;BopCU z1x|>LHrF%)45W4}soUmqpqSDA` zS^<@%l^sl9V=)w%!Ge@2zSjF+AEB`CZbCAmfPmBiIh+3zH0|H6p#PE3Wy1n}9PNPK z)X5YDhZI>E5iqcrWz!0&MZJmgwIJBka0M-teU^6E&{TeBERr@YNP`N!>SaA!NXSJw z%vsj7_2uOrZNHW)eMFDuT7SdsbN%(_SEI}4eBUD%*JFdPFMsd?e)n8&`}TbPo_@-A z9gPiq8*T;J0ej-*exC+ced)&k*a`mf(hZIC-hfdXSTYhw4OER=ojsm?U(FVEDn>Pg+-2LLxYQULBph= zll79-NUoq_jh8@-)YRQDUzi=?@K z#NZbn1F>Z_vAHc^Qr*D~dUZ;%o`{Tdkz#lp0M5ST7xVeMPOL?PgVxONV7q zA4JScGSuP`2V_5hkIX~LiECp3H@?Y^jRG=q^?!&t)c;e=QDc9q)Ax^% zI@pjU&6$n0^+4E!In6p0X>ihYR`7`y zBNePfBRHGla|b#M0ttV%YxM8marQDQxG;W+u`A;wNC+g<%$xg&KjnrNm&1-?Zo~k+ z9QK5Zu^q$Vf4v;i^ioNxa1(@zNDgr^Ao$7XYdFKC%<_9GNL0>l8u7t1*feegem%?m zv2~11H2Sf$`2u+GPk8#nYI!=kT)(Dyn z1UTLo7DHqIhI%fwz&$}NJuKF@CYg>VMZ$RMVejCOw-hS&+ao`L1kqgP8{~>x31U7@ zL0=xH9B7*8QnXVTMsmhnr4#t0RJN(E7kLh|;LhfYad(^7@dvB&!;8g-M}ty(%09xM zwrjN(*p2e&)$J1O%gmZ_sYY|<42IP4Zp`?&8wyF~jm<^flzw?`QJ1Dd=Q^H3g!QW-jq@@n17e2C@99i_)h1-q?}+FTacO5Y>G5jIME|8j#oCJv;c>G_%k+(i&G zjT3^A#t!965tuO9xy4T-(p$Rd6`3xjJ;c{ns_0gkF2y}UwCnyvOs~WmGZxv3{jeO0 zMQ1TW>i>LGM6*dzN&WjRMbS1jhTgZxAM{Sx0+j&&n=~-wq(_qINSO<&hR8v34F~3E ze~PD6ue8B^C!JvMlL@G`LpXRd^i?P<=SI@-N(63`z+GEKQ*t|U_lMH{Vmoxb3pnmr zTDvrBID+77dZ)BO)E7`)n!UvlXSXkA7jog0I%>hJvzrLeq*Gkw@#IGAib-n~}M_mk{d!Q+G zKY82S*{RU6x-X+Hr>#!*h$uIaej69*Qmg)qr}{)2_+)ws z0TN7lkAsE+BL_bn-WdnDpLediWnaju-ge}{R>^{l2z8z)o%o+ZOR~V|xq=;8gB!P8 zg+IPPYa8^}xclKQfqRJ3FBf_qBEQmC5H*2k=m&cqKnGwhiF*Lx=x^%!gE}vR(zSL3 z!$F@{LA$kf{C@`{m-r0+%jNNBKD%vYx_ABTGiWjJTmC0U^=GKs=O2#`POZ<#(vQUA z-oGl359H(P*%1{%B;!=@@A|=Sci`Vd+yM^O)Ajl}iTMxngZLpQLx(cOamPh`mWlw{ z09(9({xs|<>ldR+2Wtn`mYOU z9R&*aWr@lMrHRDvCG#WfZS^lCESU6J36#Yjy0|>mGs4W^Jwk!C&-2o&Q!hGotUbs5E#TX^MmhI6ej?`D{R=DK&#df{HkUa zUE|v*K@`4hB|A^Y7D!%=Q*~6+&eb&NQcoYq&O8j!Q8I6yki(CveMTuLbyV!E; zS!}L{YVo!bi5gM1J{6a(v>?~gIb2Ft=jbOEbH?i@?zgQto&O)k-Z40`Mq%5HZFFqg zoFo(5wvCRR$;8HFV%xUONhY?9nb^*po@c-NtFzzp)vi<3-K+Xn|66PIz3%(Ez?SqT zI^T5a2;Xrm?}*Y#K3F*KWBl*_aH#hg*~figTC>GG!CB&E|K4{PaCEa1*?WM0;>7gC zvCI%7$zN6(v;*%c&ZWP(IRWCxY@|VMdf)+Lwek9Gy-sp<6t?`kMxRRcQ@l8|>Dtmq zd12e?<$i5JWIYz`7?5^^7_}eOZ7|?ea%NNBMFY@#Y>M_5gOoW+?=D{JN8a<~P0~}) zE4k`zp`rot1W^K&PMcS*@Yvn4S}ssIm?q4alQ|w(0Mv!+7M6ZsjV~ZYcR$;#!VI5U zJGL+mzpU7lw}Q{M^TZqP7b9l*8tFN^wB1#tu8V{qVlSC2&3**%k8n zt_-?7D&E|C2CCg&2XmX!o@sQCDSMd!xsn5+?oU6+ZP7_U@;Z^<=v8#V<^>tB<^AH- zY-L$Q^)I~~$+12f>Aq)w|HOn0+=ZrqEn$3(&9M63{2|BxY33tKlsvyshvJ5-im@3m1PSXL^iqyEh ziT(DEl}2B01ko<&{-VB=_bw?UWa)etUfbb09^PXxNsvnJDZznI#D1b~>rR(1C);Kq>ow>hAUb#5rp8a~ zxTf0ikH4eUo=)%|f5&=Dk|Et8=tZO_o15g4n{>ncwh}g{lmyOj=udYjxURhj(z?)KZ`;Ry7{$(8>}p9LNks>C%2X%#&AwxuxDwWw39B z*R<>#e{%1RIEL;#0XZFrr!Y4sB;8`kI}ijVjNMLYcGwvlYa_KxuIOXHj1pQ}#J1Mn zy>(wJu$Jh;1yf)jGO$`CQC@Y4S58&6QwcptQO}UqMUa2M-v1B?ekoz9(?bzRgMCV2 zs*^$y$bx-pVXD(Y@uNn)BGNO?C490c-s!yRL9WY%gstwQXz45EyAoW7TOOwn$e z?NcK2ji2{yMlkan9bR_?2|iwllNxbcTyt9SSad&QrWQ(+d{lv|aW zzA3%P$88NKgc+j&y?)fnT|c)!^{879B={R zY(AjcrXvW>$Npbxn~IJSUQUj#7XRPeK3mfnRN6%Q(|z<^Zcg~$fW812Wp!(&8Sdnv zCSf%O^?Je|T>9-B$(?dG;wr+Hgrk4?e4|P`pZOtqA&LH6K|bXVZBB3@FNbhj9zC3Q zxAuaT&#kY_f8Jh~x52hX25Fi1WuaW3D5Hq|#`kQYe6MwqhWwHMHTBBc`c?^6D#rN@ z+Qus8&cUGKX2P%nfIk{T4Uh5Xj_c*N1gc!1W~!YEjt$%$7g4t{n5Z3cA%Kf zJU#XOdbEU~jh4L>6P5cUZ7n5>QhIqZ)x4(KM8z%=d`K9Vn5!g|VXPHSvIPi0Xz9|l zS5|l!3cZMrpN9QyQS20WCh z&7g8Mn?b!p@)2w+U=4h_SD4ZfKTfnJva-`82BP1KdNN^LHs83MyB!@bP}oq1oQY|M zV473BTMMRV3}`h27G$Ik%|T)IRI>v1|2=%L}a9m`ow#p=Zg zgy-#hNla^jMi~iOyMua+$xGh}Y>bVn<82nXCp2^HC^KA};bY^Sj-$ncH<;P8aL0L> z%=p6AabxmP85qB_-R<4uqL}f9Aqd6qqVz=U$}L?qJYYxHKHn2ZBVgFO1pZ};0P7h^qskRQ0`GX&oOZ`?~P!C-|bt9ZUKS9{t{nX@wc*Q*I(@m zq42-AM{t^bjFBABm2M- zy1SxiTHdHs8F{Qy4Sz*EUGIpCTjHmT;xObxAv<-Lg2Og6j;(Y|UYnl2H&9~+B3xvr zT`f-(jruP}H%-L4RqJY&`x8IYAHDLk7;v!|99TpxwR`Z-rX>F@b~3{?$q-~~A(rdd zW)rBs<`*wiXe`Eb+d;m@Gu3O!Rjs05ZuEW3Q%hypj5pgsE>E-Uudyk%u1dr+{Mxh> z+57!4uU}EQZk!y}N8?-$?)3=hQ-7Nu^WJ#}x?wFccQr%_f*^4#4$B<0hD2RUNrc@p<=a6YVn+p3tEw>WA2aZS*7xqV@H;Ui?(Fq~V}^7P|ey_XtWS{zdD{{_?gMP68d^_9x`%Aa{ ziLeB%nq__qNgU7+KheF#wB=$xu|&L5B^aqZE)Ttjjm?Yu%SC^c!t8zQBiV@`5)`}o zim@}j@R6+f9y`{!@ZJe~5quo+7Cd$f@un7lgWHy&Nn&9 z;)ZrEw~{jRwR$vmwL-jv;=hZtQ`3g0;o&H|Yk_@~-T!U`Kl-MCDWlU|ZgR-1zCuWl zf|mp}7`2fQh4SOt(1tdM!lGYWI_m8Ep2=^!;JAYvR{XCbtN@aGsfTl-*e6WP$Rfgf zsR3Er-ak=s+NU4&+M+5Iu97={Iu^$%9s~Yp~W&tww-FS?1agl zp_nEMt5n0qWm!r4u~8UuvOk>UMe2t2y?Tx2VBd+#r9)!G;k0O(-7$7GM{3Onc;2GtF zlC zVSl2o5XgEFYT=()jbjekv;|X*v2}!8zs=K#ADJ^Bq>-|=jv=H;g#ViqIp`C=lfQpUXPp@T!Y zjge9&(UfYQyu@(O_QI>YK2-oz=GOWsp z0D-2@yVYgHxcB57FjT?*jFnQ=rbeqEDxEs0ciL5rn*)J3N%jiZN%r|}-jEgjHQ7Xh zv3l2mpIFkQ={~G^(Qhu*F|>tM8iqJSCZrC{18(jhYV%XvQO=XuY;MGjB0#J@F4*VW z3h8qYs}EnU{08w~tiI%Ni2q^r9l+*Q{EO9B<{>uK=m&nFPa&H+**_K6BJvW}2Q{~d zcXHxzzSIGi!lXaB#b7nipjDy;3C>doyWIhrD38D`g_Y?(nNmzLsQn@mDW$bHo9tDU%<5)=YoiH2ne?J*(bsN^p^t~g=!YMG5kljR zxNzUmp;`lFG(tKU5!Mm*I16%H^qJo+5=y8ab76&1F)(zZXw7G>r^0x`ApE@fF0xfU zaT!?G;y~>^9Zdafg81D1WE4TMy!Vw7T*V$M!X}^^-?$t>+Y1S5l+NiO(c~FsM+MT! z!*}G0gs1I^-Ezs9h}-#7p+w`XuN60cpu!wV-53&XHXdu}WZPyvR%SeC2hI3;b|Clj zW?5%^UrsV{JH}Tb@R;m*7*7EC)+zSs6H38nimD_CR(5gPg!g!0b%2|)G zL&q&w+%hf|68{A_ImZsP;nrne`8tNh_KK`K?#5(McIcB;x{?m-Ei!6no(0CkI_4^` zRRi-q+wQis-NRV1rd-7$+)xPlJ&Z5ElFZU`2z!2JTVN3VvT<0K75Q`ouWl=3O})xB zLLx@bGLqS64QzwJR-Vk?R=9fvm9tXQLex3~i$w6ib6F_liVs$5sLk6j^LF zjp-#g8gx*GZZ)gshcIk|e0wUOaqW2S;NQ&R?*bPA0*OX0fk1nrk+u6S_J!U4%aJ!x zeGI-p*L_-*zVI#pKqHJB;)SKH8g#OvPjUUzc6{+h1 zuIlAz*UB&{Y}JNrgDJV9<(Y2f$-J^(Z>7fzqZYLz1p`dQI@xl&Yu^-jvyE z&0vUbchBFz#Rzgk*NUnc_Lak%{s-4rLV^5CI@K&*pjI83|Fd+&8(BiCQD}f8E6G?Q z?zR%%UWF>8yIF}^E;`iLM*qlc+YYjo-&6n?p={U4#dFFy<=ZE+%_^cfMP!EKZ%Ab$ zAZufQZcSl|U0K+^Px!Ak6tkowSN92CH0Gau(0ErFVlO&gG`Ukzz0uLzrW8GMj2~IW zPbTur6>UboU-`ad0QYkQ9eLGhjtbW6np;K?fW>$hp*jOZBV|9PzaXePUzS)L;kf2N z*am15SO>R_$2`q3qNAG0YNE4^ z+jpHexOLP4oJSXudm8M?&@1;tQPr$h8zgQE)JpTmGg;4%fG!<1ut5|uzgQ$DaStPj znX6mP0>Ph#8b1RJAo+S%+phUOz$a@`(W6s{nX#w(Q$GCsDD{`-5ujjqid z1`Qf+MF$yJO-xyQU>lr~8_poPcKntD7>WImLK~C~WJh_qi53B@oVSn*2Tol22WD11$*x{o?6b8tw6NXGr@*ne`sqkvXl)vxN z2dAi0bLC{Dr)2d`Xb^No8LsBoR8 zX-0}XO0pfS(qUiG2VDc@h3s9sNDbbG)K=@c>$#rY)P2+Xnk9r{1^AC8G+4;J)Mo3N zp@WY*+~&27(Hh$mGWY*#X@{BA;xf89YXF)PrYoFmFnpz}&<4YP1)~Pl41r|KHj-2N zqK8eT(iLWVOwwW(!r=R?Okv+*!S}srbAV6gsKcWl;gj}*-1YzhEX1OvVg)`;Ho4`d z&ZXbdvm;p(d1JzwkGfc>06Q-JP?}nP2}Grxbswi?KjUENd2N?qu7^$y_8$(7))wWe zrfQ-fm+M7q74*Hz{Mc0u#ASZ~5~wPGj6z>WAVlgc9jJJsx&wwp??fb|zC+QL-#1$H zMRcu{68Ig&>N{?7BJ#1>Wt-(#^Bj>s|~hd>yLgY^W_V?MJky|+Rf zFX#Z1eVT=sBOa>-SG%z1?YGNmTl|Fp0sfN(yn`9@cg%?d0=|;i2x3+H z3xYMob`W)8gENI>JD-JFGlf{#dL-H4d4JumJ4sKw*#SjXb6c9UeOvR(b%y8eHg$06 z)hp#D&qp&*>I=`A$TQ~$J~TW8FE@>k&jn;BEciP()a9N$*h4|gEPW?ZW*YSC)g!kj zj{xK*n5djEYD2{8DcdMnka|FgI1M7yCw}6916Tmr2mrbcF{r5-$$lW}ObpFNhL={e zUUxQXhDuz@$zH~d*gADh?0naw9i|6r@~omS7c9Lc^_t1TFFHbiwrTK08e^@oEHuOe zs=02476~s$tUH++R{%9$2xGB5)vJ~l4vFeoiZ73Kvd)eici7-QD4|S2U_xkGwF8!{ z_dFIs??3@T*KxygotUBb{8xY_`}QLC?w1461TU-4kNIqp}b{2y0Ymg~MsY=98b zPectSxZ&u$7vO5dPM}897L3jdbP*{upbBie0?hHDkM1pubjB~{`Af{+m2G#P*+*Wl z?&lLs-l9|R%(uSUW!SjgD_z07Jy`!nA=cnQFTow^&sPsGeei^eOAJ|-Uw8eq8l7Ht zldL{Rw93?q#GHB77^}U=J-$ZqP-tHC<06?zv8jaA`u;#RwSm>r$!5_0N-ZfgD+}FWrr?>XH%VyL@S zg4@J)c#7y_n{Eu^M|6z3W{QXw!2Nii?)Q)Q_+OBT=7hF!NDyFxfbzd*T>o+Y|98d( z>qQ6>%a$@QWNQvLnCrP<8fV_N6LKr8G}!BWKTlMG&SlgoNxQe9%Kg$xQ?mjW9*2oU zIRsCc7GR?(9SCL5iv>p&iX}}|6n-b{BZ_Y$Y`N8=cV6w0aQ9{Q(Przchv!cckK@s~ z;GZK*CCEM<`(`MbFLl_&$vbQ$Z96I?tYgWfkGz6$=%7&RA4cE2c+OuapA~39{4ZYL zKLQHA|HJFEAfLwc4jj|^U%b8q5U;Q6AoyRrzR54su+h8!@cKwzcBHP@1wTMr<%qYW zvFWko-1#$>h_~;=UnLH(NxBevsV{h-KJ@ndr4AnNo?!Prr2nDy9dLbrLY(|qg#8-a zi}{E;cijQ?r|5dS>Gx;x54m{9ryUWm#4$Z-T|%BPN~ml_WYB1|brK*Aqo9b9&)4+Zja zF2WYd=y5i-R^0V^3iq^~`%fkGSuyn2hE&*vR@ZactC(VqN~knyV*O8n-D20qK9t!i znEhVz6NZ3|*=$*q%JQGm>;4)ORT5^&fq_XGl6Xr~d6XFo>_4E26NJ9?Cn@+{6>$ipfPc0AZG!l;UfSq&ynxe~t=&9x-V`-e zdlSCq*|NXQDS!H)1e_O{i^cQq7gLt;6`VAV~?964*1O8zX>LhA*vV4WAX2!=Ifr#Hb0rq~P%?sceE zF$GFB3cr3%Q&}6S2*fSoZz8Fm??6!(u}pjki3Ja}bA+NBb#km}i;V7v{X7!!h3cdq zMl{!c6X<({H|M)G=&kI{<(wtZB-QO_Us{ig>T4gMgzm#a)t?lt6{06CGlLr&T@W7{ z7=^W#_|uZ|NL1*jH_W{vT=X3_oH|B-RG~Qt%}4XQsmnR4bG2!ye9l2_9)#wTU7W(% z-6+9btW6JvW1vIPz9)L{_N4}-n$YO?8DA$ceoxQzHa`ghrhBJT218^ZN$sNGU4(R+ z^Ga^~rSlyal0Txi=TgTFIP3Drp2p30sQf)j+HBHR4@UCpGl5*O31rC2<4yr>=;W}G z`XUGP`U6oqkw5+5re)I^>)F$j8xde8N)ubyE6q7*Vg4#(Ey+hKs5B`Wb?jS^!gsmx zfaET?KpK=E&j)XWSf_TYN7Vj+Nq#AU&;eh(jkP-5R-_3>jU zSfPBc;67OpTxyDF>_o#M)j17U*RB@>1J1(H(UUtC>nb@eWZfuC@4N8)y$r1liQ7dP%vzHij+r zX*`61r~uXbEgvl(XW!R3x}sPMW$%_KN*xXqe0e)+WvC$5-ei`iF0Z>!4ydx&JOdbP zo_l`Xhr0!LuYaPL%)DCrM3FUR+b_;YgbZAsTTxPJ7`Q=5MJ-Q9OFq}}SF<}^>(&|; z9Y6J_3j^(;;cw-%(m%}2!##N`C#G8xk9#nMJ-Ja?*_@x_$dkey18N|a3Fw^=G4?{T zEPcsnc_r0F^#%;GGd*W{p#5#!JVW_?*IFW_pe7#c0e_$qP52l%_(MX#V|I{nxyY6Y zNBt9KUX5Lx&>XGYI6Mkh$#|hZ$F%H)tKs@7%Sqt$irSTbTsddrQkb5h?|ZO4MAa+B zd>UGr9=+cw89ffEXzrIElwMg|isy{SGPlESpJtLvu}RGEv_PQs1l%_m(e6FIHC$C31O28zC@ z!Z>R~Ea@R9M*14hpu9$f8?Jw0lnHCA^2ixEmQ^0eUX396n&b)_{K);Aea)EOfk`FY zdj}5GMIKsc?b~KBpd93RA<0(Vh*3YAiV1;dz-3BoJ${q$uZ{J?_#<~c$@*cG5r&0g zGX~ek4X#}dnL-Tx;~lKcz&vdNDvK5TcrbDJE0WVQjOAiINjT&`qv&uNo)>mP$t&YdM#zKy%rm@BX@U`euTqd@iH`<7!dA1Nsi*ed+9>0dhe`X{sBiu!Y z6l-kE`3c4K%hwENB`#+)spIKZC{MWaDy{NCMh#rFg47i?R>}uCW%^1QG|LqT;g)6&hF3mLDddCx7sqef_2%Qy6m8~bjT^+xa$K}H>h(s z7Ny=%MBsP`esyb*s^}&a=UpVt_+Fr_06LIVczU4>;PK$9xxoZ&q{uTimT2D|H(L>sd3GS50t(z@4V0;H|+R99_ThyOk=acbIpTxEqLe7Uazh)1&Fs zaPNd6RVLw=2t?0pGBC!r{|>*{B~zQJT#3A38)&;$^QhZ$3TIg!U8y$~=(LM#?84kw zaz}6_1QJ_({fyJQDB{(@jqLmG1rg*$>*^GyAY;aXC>zpaqYjc z3`Jxn%!njGJ8RlI7f)L+XJJNqfbR@zX4GIx+FLE#TP^xWVx;#96GY1zQZ)5ievXP$ z-fh_;sJ&@F$8Q@f%=8(&ay1Ck>4=O9)=CHX^NcWY;&5f-KF*1z<c`IHJCeM+b( zrk^iGPQZ@#1Z1@^i}T2`vm3?N`*hLLTo`!9J8dgfSWWb}LS9vWU-Sd8Yp55}+yX~n zkABhkcW=F79qrU>#<{#I*|^A^A+_5kY}4<)AWA>tYG#O%L0sQw&rPKl8bEfTI-7VA zq5|G#_@=K~Q7ZF}Th$sADsNm2qfOU~i*p_0+;E}qd)lICy15zVP7vyT=yQ|jPB4?aH@e-7U|=9(nvVqw!5t z6Nw}={+CBRUxb8QyawPiG}AkCS7nprOT9`HXp;TeSE-MBO8Pl+PeAP#7jGmBaqy(x zb)or$%+($mKYV`x1ME4??$3bCcq>=|KLMVdLo+eqz5NVfHj-r+`uoTc;bNgipnzic ziewoU)}Xi7x;~_pv9B`!A$P54`a~=sv6SsV*hDT-1CQ$OEqe6%{x>L#M_H&zvet?tYeQis~6rKQ!lgZ=6>f@evXzRM=+PB;Q8 zf|(Hhp}fwTqz+L?p|-T_74*II-{yPVa-BN5=0#gTf$06vbyJTY<|mriVLc zB@*Q&9)M5Zf$Eom2ql%v!?1?pfU3njfr1H?`9_gOl}3?9qfP1+yrU4*IyOre)cWP| zj3hP}up0w+8F9rN9OlI?L`Z^{Nq9zpyZ+fHq<^WXL}@gs9dlmxr#7p6PApwRMrJ$_ z@gc|eDGd&x=$XmBZHmf<)d^z-N^jAOWYdbO;TIhFt=!CvJs;0eUPu$+36OI=Nki!S z1o8e$nwxxo!ckF5N|Lio>aSH|te^W0fdk&)FuNfYE?Ivz6xy=JrMY-YwF=6Vp<)&S%>=#WcwW`(j7^M)XT4+B{r4XlDeOJcQHRnVpMQ_LRP_yq_KKXe=;46K|-AF z@&@PRWZOU^FE4Gef`XCpj7l|V1nihkGjj+b!MeMD!&Lw~4XUCxpVDg`gk z#He!ogSV!t3vCy9DgI5Ibe`89z;D~7p z5ATH}D>8%69)bazqj>IDvAkev$?cl9jR&b!nr;g%)`<**NA(_x*&K|T7u5Ikd1p_S z&dB3mf*O{J4$-I8SN=i{R{Zu%Z0rKH^?1NSA|#=t6LV;dP&o z^mZtMXa=rm?NJ65Pf!PSo_LXR``THvXin7{gecmCof39jGoFHWF#2^)$VbT8IwI<& zV+HUvooe|KyKJWd(dSAf z{OhV3(%M|*L*jmaNCCcwH9#)G+>A>M2u+9F#|mC_VVcVQ;Y8l&b>@n+?c z0^KsTcz&gTTCPfLS?o{uXnc>Q?#$^Yg1YWR9{Z!ML@Z~MUe$#MeeriNO|5-q5qj4) zXi!%>-9jA>>rBQxeT5q^m+pku!cc7Djc0^a#>e@Pxmw5DVYFvpbybQH`2ZV_)r>(j zVU2(eYl2%ZJw3OAV7Kn zIL!3Gd#*6FF^gYkGdiy9oh}>c=h(X1YU6=tolm%dzeg=S*5r3#p0YL^<=TQKE$Uz& z);0{DxF?|tTKjsT_To`KJgMG<6SiUBA9DDg0xMBI9|+Y?zrVOI|YdNX8JGoKkr+%OymfkEzy z{go4laXSvZnZ_%0Ue)~lkiZ~@tRS9BOo5XW-utPc=W^4%n2u|LthaUSXF4AL!o)wW z5+B64jnCa_3JbBKLq@$&3KkZRb~4il*uKJW9B!=|PG7FRcei(I>uv>Uu48bf+H5*6 z7Wj*9lKsrWW&>7|G*dXVkTWd|VpKJCB`pm(QW<7M8)nQ-kY$zrwuVqrZIkMcbi(Z= z6m7rtD{o_R&{&=GueGsx?r>Ifq*MD-NPX{z-dxvm zwGw~N^gBZLMP0p;`$u+NI<0DV3*A2g@|Dgc{;hE1;I zp#DJq=XE5_JM?58l*wt+{P#@mKdvMH&g9^|2tb*fm7K1g;d+A^O?@IS3T56HB{eLX z)80_Zp?I7r!KZ8Je%hNg74q7cI6^2{o8N@`4)8OgYjYT~yciLf^y;+Va+;EeXMzpy zn7idJMdbq1TPyEvyQ9zlYBX+-y1(2`|MYb{nw-CN6nsVkt1_R25I7A{I3B)V?!a+ql1$72ByYT9+xABnCNiH#6h$42)f=7xtlQPOx|JZd< zwRd&WgOZYkoK!;T3puSHqISRXu@d=9j>FXL|T9aS#k?%~P#7G_6b!q;BfQYwZI zKSIg3yB=DE@&yhBX{d;IybhrMuB@&IrGm+<++Hq&H1$h*Jo2h;0Xr^S#mbizK$wD| zS|yTF7->vSn2c_Zg0rPYumEGHmzV&D7l{_9ERR4vv(c;>r?mR93YG> z3>zOQJ%G2{*HRPxPTwfCQj~Op_)sUJ@Zbb#tn}fF@@Rh1if?LsJ=y&t8$T@649`P# z;SNKCDEgIo0}0wTHrWllrqhBRN z_ZT2XkL!OY7XTZT@cPyk9^sodMj@_<#wSBUOm%~sVCED>IU>D>B@>e{g!`|LEb>S- z%0P3R4axyvn@-5-E&v@!3H+R(LJk{2SVR{dK`1$J)Zk5CDSBuxR0&vtNXQ7%o&uwQ4m80QZ$TJ=@+co;rl|dG zom>N6g6q1PLIY*1d*wY*`Ta;FCt*CX`Pvzos}3z&bRNv z0(8qL;rsb(OfG~h=1Gj)NV|7rbi1W~Li5#~1nVv5eT;^qEO8L}K21LfcA)k1=jIi| z%_z&qrrG}q_HhuBzJFBS zH?!Bhu~zJyT>FUpuA?>$X+k&MBN47GAX{6Zkoo|h+^ZIe0msJ82@O%8qQSwsg#@tU zT7zlinkf>3AUpL$T9YR~v@X=#E$UFKzFuwXo4oc=dA?{%puX;4OR#tDQ#Tt5&c_-d z`1!$p1tI5IE+-(1&D_-(t{hWOSdEajiKyL{6TMUf*8|K6NFzRDz85AkQmb-sD-+QV zr%F)FtuX;p=gKryO4^!=wW??nMM!ucn~hOgGE`3IoB^`Y$`aa0!hdo0ww*JsB595^mM{fd9Ep7?K)v^m~iI)GI3i( z%7XkX`D~KymqXo4@K82k`OPzjb1Xh>>~i=I1YtYi&*ShezkN;kV_AR@_DnGtU;{bm zoOi|LN1Z;AlRj*gP7c8p2~L|e5yx*Y7H%G0JSP0uEw1+2%R$RtY~y@%r%O<{H)^?n zP&WqWwYdO>stpbx0C!Bo-w~+{-e)JyB2Yk`B4c>QD17r*dmhxhDVBUzQS+|4Qh)Xl zP{7hv{GOW_hDU7HMKTASC$#lw(qSS12h_xAB^G1g3Fi8YY=Kz^Y#1uo5Wy2OABkv_ zkl3!!)g5P=91_DHZwGvl-zb<@t+1h!U~1j-jEch;gJ0RA-iK;KHWF@$98XrRcX2p^ zS_WpO*vW2a=TBz@eDvGoGl-an3i(33oX<;sHjXr81AmXRDI{qU$VtYWxy(55B5oMU z-~d0RNHivD8OrzsewrgwClugYVcZ?5&1|13=&H(EyRMcUQ~^|KXM(=%6y!LkD;trN z?uW3yQFB7!hNk1iDa9%=CgYZ%(+*K^MwmKXTCK-w1nl@u2Tlw6oKNjjt#!j_0Q-N6RgK@_hiZo6p@1_}ETG#BVO*7f*~U$&C0!4)HUR&yC5P%6&f z@^jF!qKLaI;x$1sX9RBs438QjLCJdkvGQ+41zWbbIU{%(KJ5BoOH-D-6|M|z3Q&=b z9oS(-A>&&&c5SYq8b!de7t~#JXa$ZF5rx0w#Z&3Uut>FguZ_)7K5DpR;Z=-45z^TN zwpm7=q;a_Ij0$(g8=<59^7AiKi&K0sm)*okX0lnq`&QF`mHTL&IOle+8 z>-SfGaAwy-%(@}#%SwJC4%P!7-i2)Z1zUGRx^R3Atu3TqTtuqnVQ#TuZhQ}8w+O>| z#o(d`*j9=_Du^X~o&)zT^6i=IN(5|9R2HP-Ey}0PW_(cUGGO^n;xcHQt-Rwlz7mCXjm;{VsY}=E(~+t$pk+IFOHKT zEdFL1?>gT3I$ke=g(oUCEs7-6SL0e&8Nt0%YO&g=5wAm`d5~r&aV0~~45oDhPD@Cl zt<&d_`MYtgf0OR`2Y5ZLj=j{NJUfbB@old@=yjhf|FaLMY%*~N5_;g-nrRAK zDNk@Nm^t-Eb;wFE@grAiFWR)Zai#@LAaQ+O&vR{u6Dr<t=8K*vw`I^cubSLsXBBuq%6_(~dZ zxu)=xWIG&{kBnI7A)l1GkABgYd^+TL;$^#yu)YKDg;A#YHA?SV$19_CS{SD#nb$D* zkKUC)k;(%HZ8JK*4q3$I|H>G>k=ls;KpA5iXkE(lUp7gq7Oplv7XNSbJf*0+rKN?- zzy2p?Yi|Dy8b5%IKe%o3nv|hz9Yhv5g(*mBn*i1_#q~@x3lJKNaxR(7_8t=#B@V*> zo|xj0e7TXZ0<+575B?hP^?%eL`7P*pLJWoNn2 z>H&0Xh4|vpc}%rN3ahZvDJ4U6US7-9(4=~|LgS*WhW&BV@tMgvm)|!p^D$(NtwHX}`zr*9WZ^cP)kuy^bNmoL1>IlE;`P zQU+qs1Cc*zGb?SMyO@ah<;}Y4ke3m#MW25x&Y$(qjZ$KdLcpK3ukstbK zYSpI2IRn7x_EZpHLFqm5W$XI^)8qdfDYr&poe2l8d5L!j0tX2^vN8^mopDYKX_z6_ zPd8+f^z{J0M&{e|zyH~0{+)1kBLDIR*X;4mu-SPwV0oyhTt;-Fsyw-<7f5rWYt3fo z+qPQuP;RT4Ie(X_%B9u$y=DigQOc!dLBBxBp=$l5K2^vw8_g>_M=%TcvT;G#O(015 zIJXXm#W~x?<-OCV7C~dpohJZyuvH%-9lP=QS_p+gVR?36_&0%;L;uHFr!X z#ZeEz^aD7H_4~IE43%`6nEZj@0C9+yU2P}R5 zTB6;!|A(@7V6MFT*EeI^wr$&H$F|+Evt!#%$LQF$-LciNI_xB!+5J3os?KlDf2Ph< zZPk7OYkk+XKKFgeMCeBJ2GyGGln6towP~H{RX^0`ACoHkW+15vT(Q`gDD#Wy4lk`C zU`oq69m0x!Y8$>|FnR6X0SrmTQ;$ljL{alm!>ts$8_)4eocmtJg@`K!M0p~6GyocY zHT|%;4-L}R+}}B=3&%k~k% z{RW$r+iS&eJ|L^^@l#Rov8qUW)y2DKsENv`W6NsGC2wP!IKJWI62jy8d-|71TfbDG zn#d>K?)(n@X^rEMn(oEIhK2GC7;4% zIxu9K4h)$BTM9v(T&S+WAMWHQ(AaSmYQ6c|7qk`NL-1ddaWtZ&Qh1(CmSA6>)K6r!v z3cCJBJo^JRiMryAB8j+bpZZq)AV6wQnED!9B0zTA2=&>HOd0hRk?{|s;`=OOUxYBq zGsnQEYKXAv8@BGF7TKK2vy)>xc0T33C)u3rEi!Dr)!s%r0iK#Ef_YyRT|>AG3z60V z&(86Uo$c;y&?~OYBWR!-{v*M551}H*=JMHhWEN*n&KAxm?kh*zi&2ZXKXvgU{>-z_ zFPnIqzBoL-?{V9VJoAf3PL2bdbu%WMxod-kTT6Ir_yowmmz|f}9N3Di!fuv*+4vg4Kq|w1;Y(V_53=X3qdgN%he^OM>5UP>G?4D(uqdvR4xR0;QXbc=Kk){1L| zs;JwFMt%b1l7o0-2A(R4RPCNBDf9seo+`36G^Xx3>}6+N~t- zd7Zam&8#beNtcMwH1R^`xLh%tK;8PwKu^rA>enuTrBVdt^ck*F#Gj*S|7ddWj47fL ze?7=W7E(rSU_?H}xl(W&h6 zb8I!WN4<*ZP3p?Ci=W?yHfA<8ZGW+#heCTBlIs&x@;*PTj5w57uMtE?ZUh1E)o^st z6sag)sP92%*((~wwJU2y3g4L&qz5F}!k=Q-7*43!ZaOxphTw0RaXmyt!hv~HHhowVT%@5ZHelA&ygjA8 zE3zwRT=krY9H{+UN=9!!;$h?!l~O5Ew~EO#^;sbu@W5!oB19##V51n* zb$FSKF`JRWgQDsdnKo{xp-vn27ICr|P2??FV{hrA7_2maDqL~4YARPEy$RzaL>$1e zTj;7CPI52KwW>w4(8sq1U+ld!=Ia~eIGQ3mJWC=0Z0+x(q4pmr$toJ+UlEo<;n_iy zAxG#c%VRf0_ELR*E~$vKn8jKla1`5*;v=So5MME^oKMDbxsI&Fdk?1N71QwwYCHbr zaU=ZIx#9N18S50Z!he#K<&EgsOR(~faw^xfbTAjE6__i}s^}}v=+5t7H~|J-8=dEE zhh07aB>7+bOZL6S+vMZS+$AT-mQa|8HPHg(*5C!h?^lHCwFV?6*#kfw1$9?Y_Lv*J z|5f3tr5Kt2qr#0h$20cWyGNI#p%w;FgscOqa8YBU@m=$ee~}#GsXp1mG`Dd+FKIzr zCdGRM>UpY{168=4A)H=ynebDFS%#z(Tm4Ma;=r8gZgbG4&Ad>iK!eAL0 z_l|V8ki{LDX>=v`eBkpO6Ib;GsvE_y%;H%YSCjFwINRF@C+^PJXM5n#TrPK-e+ zP^ni@yZQsujq)WG3NjqxT=yRVNkGbimJ5bX4mJ(Kg{H0tVO?2=fD_z(8R;$qF~|7N zvwLzBtWC>gPhsO^;^xHNm`_L^SHwTk2Q1NXaH^nd6d*C2{UIeJyh-JxV*7B@kdM9`mu|s06$Rb%TOBIwFqV5INc-j&8UEW2SopHv_VfV(_?<($s`Smb5M{?I<=ROEsc-F8=MyXVe4lHN zK!Z*~fCq6Zt3qqK{+L?zT*|-}Gk$T`FWJ@3R72DBxnwPfsr9d9~ov6tP<=_=0vbehwA;3gzabpU{YeJ zuF-Fp%e79quGihd#obMrIx+R^>}vKjv-b0arQ5}EI6JbGgW;~XYo_1DM%6{&QS87S zP_%MTjRd5J#WRyRhhtRp<99V0HUjQxQbCGuS%Ir&Aula$Kq?$k@MG*~=eH2xCBdSM zLFJexJFFjp`keauITZ>Fnc}rd_NU{SEJ)BVpU1-INiqHadTwD?RJh@m2Wf8`CTZJm zjaeW$%f{$_;pj7kdd5UMLtM}QYq_nzHg?9_F$RWAoum|H$+v9mq-%j>jNz(%YB3&& z#Uw5HS9CXA+9(Hs(Nd;n2_D;v38{ZWrqfs!DU@=xl#?brOe%QJgqXp_SxW}lAu-BX z##}gqr84~}*r*!EFu5o}dLzuBkQ<^}isE^=_9>t>BGB}E%m)MkCmt)ni+?Td2zSr3 z6$kVcOxv-96^HzA`Dw2VoLe~eZn5qDF2r7MO}+kuL;uwM)+29qVpI2fOxr~dniIFzFR!izy&6UP?Db@>8md%| zdt<@gQ>KuSdeELt7{j&D9B0-=J_hv`l?2Q($iqs)4x-ql0D&G8>rfhweXS`EV90cI zOe3b3`El(N*fn{Y_heFcMd26PMjWPTPw(7~_xa%!^n9>^T)eDl|A}xP2>PD`4J@8S z*Wo~D^#O!dJpUhO9CZtO3$wp26LEVB6W9M!)bvIjUlM1mPo7C1ZBfm-vNckr22V`h z_6nI%2A)HkWnPZPp`nFnLM*}X`t};Ev_+S3#pUlnoXbNCvtJ2&%WQKj^E>!^Neys7 z(bR{+v^~rBsbkw;=uMz&uIYJoH}D;H52rWM1nWl91#{KZdhCs%PP&1Zcv!}o6))2) z$t=l=RA;(L+Zb4jHv3O48dMAzd`j3z1tk`7c)@Sv=S?~S%)01e5jVb+d>LgWBjUdy zQ(J?GIzY_-wJgODUwO+qa!wQxr)r&1=XQc|}%$1L*j<;#agj_rWpQPAz>ZPDPL z=vk5uI`UbaX?TY2$H1Ve;l_s`JJ@7oT1K0;&oW>XbzoD}kT#y<1X78@rxn|KD&*@@ID^X1igY(dUkwrs;@BQ% ztqfpEOcc>Zq?Ghx67CN5)qJlNz>lgme&#}9ajh|zisoBnj5&G5rqDiaE3cfQF!)sh^FXpCxo9RuP%@|Ez#!~rzD6w5^j1UxT1lyL7OGXqk z1IWO6hrXL^Sjin)rz45E#c*9sD7WlU{tE7FwB`>+(rlokoKO8)Q=E555p5yp@a1Ro znik^f7-pF%Z#-tMnhSlr#>2=$)Fy+P%h$aT9v@Z|Ai2UAGw>rAqpsODyHdw0XlS21 zKuQ*{h%2Y?p2SnuIi$4{2pg8|Mjdm>jXZP{K;h91JpID|+3^gPr*|3Ke@(ZFNm$Pa z{}uCG->S!*M`|RMFh{X~xKyz&VAFTic#UBj6HWut0IRCQMb8=909(=0!a;i4^`q)U zYGHIb+7vOTl&ut4JNg>Ot7psPPEgr&`P(JvPxuvzSMbh<-^l~_j=T?brwmcycU2ne zLJzCPwrAF1at<72l;3eac=L*Eqa|WPNURYV0(MSZNCz7IOK7L0SnMf6ZeXazV2Tq; z3n=HOUSO0ksgY6M$ZKIJ%8cMSH1x=*ku5`~zocl*CZZRrL*rF8b1wz9%9_J~=i_BM zFGBv2;s_wTD$lr^vG8m9={>#_KQ9(t-Xo>EwiKVda%yuK9=$5-w2$eqaw*S^o$psIqvr?jXp;&usEYqK#a%w;>#LcZ*6}L&+#TupeTSPDIVM34ED)aWk^^)86GCLMsdwp(ZVnGV$50v_@`oWrw85#IWnk+(F!qyj^$-VrE= z-FQLwPMg;rA?} znr%3jcHYI8LeZ5~P91$NeFGQN>55-MAK5oH)j!Xqglg5p1rd&xxiPDo)3t0$HJIjk zthC_q*e2CIlt#M15GPMYzI6KVeJ+?or(jEuzOOI zT26hr76L0`^4HzduZL-c1=auL;ZXVLq2$)eJUPQEjE*JMnsz@2;;4@(92PrmUA@W& zTo1TitUdD&z5`G(Lt`+WW2JjSrwn}|zk4O!B|Om?N<9$&=h}|2a4lH`j&PW70vPa{M4Y@e@V%k%7(oxN>?mW<1^4YB% zkZ?sJV6yUhayG$YVqw8xJ@RL=H)1#Gh7ZN5YI3A`-fzu@6ZEmaf9(GB{uTdfb<*R_ z?)3P8pCAMZLcg|-wsjFY<6Hpo%wL3Y?FI%=P9uK?aVMs5O&+HuLq-LfZ~rQ9W6`}s z$4exL$nSB<641Rv##1DK3fzBErNBWpnIn0LUWFt2Z|}5ZMwIu>=)F)z8GHB~&x+Ix zK~AX84hQ)zgPwa`%O6BZf8kXUaq^XL@j5ZOcY5a>>T48w0Gu%S^-qXD@CO01M_S7t zoGyK&_X0_~iwC<4!#8=i&@bdJ%qZ^#6ff*8fu$OOPYlvI&NeOKMc_ zU+&b!ycRRH@lkXwq9;82{0g`-@JE;w?+u#Uytsi&uIWoLUzKW>u@wYBX-ONmv6Xo> z%WO5d1j_wTv@vKVT=h8=rvsdeNT>tO)(W#vHK0m()bJxC(oQ`nQHy$UnoB(-=T9hu zy-bJEx4V2P&SkHa%a${#@fH@}1hB)FEAW&g53;$d=wNp39=^4Fp(t}qpdhd4(37QMBbuj(IRmuij(gOHKm+Yrd$oODbr!`K*vDp}RIrO(@<)><~I`XY*`i z6wSp~_eF(u-yBP|#v`R)(q&^St`whHXy*zsN&3=Kl=nA1im;cgA_seO_C>16s+E;U z8vk37j4Mag<=BVQYKJ9vb~|@5;>fca32d1_mOGK;rrI4&2S8I@`_3|J%II>I(ajx$ znN6hz2ETtgtSj-03$teDJ0UpXix$HqWnD2ubQrTD)nNN3D~OCSv@4wIfq6zEXGHPC4?HsNt8hLb>0Xwo;G)hLBC>8dEtdMrKZ%WUH= zUlln<$}q>xm^YcPfKXGc&@`mQ##8HELo3NAI09)1WPR|dzF-^y_9To`h;c8 zOVwdCm#DQb(w?VmA3vk};Ks*fXoDkSq7>+nsJ`AM_+|gHgvD#Q)$hxa3vAL*oKbv9 zPG{^-POmLT$}r+yYhc8&-3&!OwFx%Y{WVNBQE!!#KFk-B{KH$k9Vm@>rFEEd&YIL; z-E-{Ls};D>+FL2H*Z~P_)HoL;=OZYwF$gG26L`)8>0HtYnh2g!#wfac2l zje^d7gfJB$Hp^KIagO*ElKbYHGWxsm+4ViNufJe%jPW|(iMxRSrlyI7R9d1lxcEze z6wsY3*R5gROFeSDh7TP~UnrUj3fC$WX6 zNG^&E!=2WUI5fdj5#p!!wI&n#j-QO)IC4Z1tq@FN=fhYkrQl(|lkB9_opBNRM?iAB zAUq0fh7I8OU7pyEreq_7Lzbmz6|C36JnBYXaZ;aB$Tq>l$)KUnxM*GQUsSBR!q+7cyKi zbP9m<3SLXogBM7z*gT;oM~eiE3|S{KaPPZF$XXedcf5`A-xI^$9pAtACkeg~D~ciD zBOZXwQ-j!j?T;=YS-*zTqs7&<1tVewwQ94%_;dkOGa0|~?Sv~9CoZ`5E_9W1@kJ?C zp%_~T8Qa_Tb8wl3fmGjvN|!@z#mw}I1^svpny3VQ{?*S*0%j$c4;5CH0%DbL=zYAK z!Kx0Db0d%Oo&HetYX^&?V7R3Xmfa4ILQZJQcM_~^!A_Tl{>iusdWhdhCN_+19QewI zYk?%pWk{LL%XqrBs#9q^$_t!`a$v1X=D84BtTYXZnspJnq^o7hu2<2;`b&p(C_dX1 z57p6PtAKhGpAU+MHteuEX>-yC+?4t6v~YQYzigXjkmtrwyU;eVo-YxmFWtDUj5Q0o zcG82xg`N?7q3{}#*jVs$?h&R3%E-Xo-V~%5`eQ(x1@YX#4P&2&zP6*{?NilwN%uo? z1EBkm#`}qS>qc1WA)RD{_~%1ddjUDSA$MMs-4m#Q8UDp4z_Syk8?L8^dUWu z31216T%`JXyX`r$7=FZz=BYpuGpTUYi6ZrV+#c@bf&Cb9=;y8SjP$Z5IAK+N%sfN6 z7OfNyUnV0c?X#gcULMJ=9ln-s5EZxoJLbjb`1`$<;%XG`be6WM6TjS9o`|h6DYRS$ z6B&5b1m+Y5Bv~~%nUW0w!>Mx*Xo@g5Y{gF1A{BOYeXlq&myU^U_0u-{vgn$5{l(@a zqET+}C!qN>gvDD+M16Xh9ZKzjAFSH*yW{@C;B6guCfb=!H|kV`OTZK;t^}|!O_v^c z>0crK7iHzMlK#Mx0YEK=0Z|tISHLU+5M{-urgD+(>AXVUGmJjFm9^WV6k22=K90c* z7}+gDb_LYJw%Wvp1<(D|xAXstvd{u#R-?r?sOnvjCPHn6zF{j=xI@|IiEt9G`u>W) zV3D$+)#6S7-yd}0@g>lICH)}lPEfWQ`F?n?ij88F%KRt!pTe}xcIobeOUI(kZY$;- zq#yAer&9K{wGAP9smRZhdZGNWs_NNq0oF%5ijzOSpL7#HfHZK`gB%?A4X^Hy9hfLg z@EyF;D39G(>)V^`UzCBk!2FGZYW4$JmTY=H6W%Kc(bBiSvIB}-Kn5GQJdkCjxc;l$ zZB)4k<8{}e!5`DL4bwaZ#_s0W6!l?EHd<)C!$d(AU9k6bbRM81UT?P->j ztpRNZFjL61ht7^W_*r==>gtU!ZJ5nwVWoufj8{CiHe=rAW0QXT={g%O(`Y7XrPNc5 zsE%zC+740mgJ}Cm@}ZpRF!YS5z%4I$Z^S+Iy_#CdT?uM7kOkQ?j#i-x62V1PRnajR z9n2Z1$R;PU?zRB54$?J*W*^6y=>%7gJQxw{nM7ozG3qc7 z*F|&ljIjcn#=!Hs^P~B2=ve7)&6@RNIyLz5RW_hkR^SbN$s+NWyfUs(pD@`aUz~RH zLnq#u%i6qAbV3Nc*hgm4CXdhcoyY1ax*b(3Wh7=OlMQZe#P{|z7I@8~i0T1E zyFGmd&x=CL4ddQIzmT?qP$YYN7eCNHZ+9p+gDu43m59K?w4+b3|2*%U72=lc16h_UFyzVpzd7&x zA23$>ryIH?M*l8XhQ2EzurckGt>ri-vus{wgn3QZMxO59peLDOiUV)^R@j?b!-aMXk#@F4+hx2r4MS=Qdv^7^W4+rPly>A9!p{bR1@4Wu5s zPX3l^95oYA17VOzK0toUGc8YpMM1zLDMsp&J&cP+2kc6V3snMkr7`^NOdBLKNztZo zi68bxlN{`mJh<8ezmfg`raS9kZlZ3504wHvyh*vaLcCl8eE!zwJOFK7ZY;F(jwN{8 zL56IsIqENxO>@-o7VVQw>BV*vl65-Z2x5TfGHr1LuF=KvV@cj3S|8JI)_17B0r~jg zg6s&Ps)A!KdCkRlvi!nhaW>vcBl%Cw`Ds6J*HuopFEDD)_5l4|O7*y`fyXx3sNMTXv0@@z*4vMJJGz)@FMXA#5_UPqitrI4&EP{%X{}mR zD%1*@_yMe0GZjRH-fr!${Wke)jhD)bahrxMa&@MtrPdTwnH=R};8vV!j9o2HYb!%B zA^b^3A}>u|;b4udK#J(XTcjixY&~QhlsV$-$dS?>TARU9j`$E) zCcw#sA{RS@hD)^LgdrCR!)@-9qbW<9(A&p|fjvp@qv^*Fj@`;))FpbPH7m>dNgcSM zt;+a`9-uue98qR(NvC93-=irS7Ej1?ct=r{-~n1IZmt}~U#lp@Vto(&c2F%r(CdAFOAAdM`{rm%Od+knYjJxMgYDCmh5ntV zI&IZV_7!!(#9r^vpo>2=-dMUqye6a%jPbGxAPhsM$h@y7|DrkeE2!jZBn(2@7pkSO zL@-8od|@0B6KuJ{=%a(t-s+$tYtzLjH+)Aizo4|7pL#|7rJ21F^?! z!~l#?2^B#HBI8?DU>soWn=LQn zYu+D6_wum@?^3M#b>#N|cVoPqDBb=F;+LWGep!2@A7FKN;DJ@hUhP=*Bgox4#J4hx z#?{0xQ|JA()Gh3Ww#X*E^Zw+h&QolbseL?-8QVaq#v~<x^4-)+z*NSg=cJ|$bM0b$_4FRkaUecNX&CfT zE{rrT2W(nQ*N6&zvpZ%HBR5929&XF&1^wwWUU8R&TFj2B=w}IOryhIDDL&olGkzIy zoorxD$RDer2Xf9ceEQQsPKg3tUyweYvF=4VFQZ(NMef%DOPwMp0~Wj+z@bJg_o_+k z42z=d8CwM?4mS89GST%Kgx+!KQ1_uwJG4u|m|U;k!1q(^B5z+2Uz;_1u${ z2h<2CJU!dJ-1RtF?z{!=KF8nmv@!pA&iV;rjH^f4&+cd)!4Bp(iO9us2n98VRs2LC z7?3?|B_p7G&_p35eejE-SL6T^&4}WT63vL}jw~uerd#2Fo}yRoz>cC<=>QXLm*h?n zZI|rM0d4oMO7bT8g(&JK?9Pn)9l{WOul(W4%JFt^PWBDbrtj;}_dR!? zcg`qonfLHvC)&o{h1K1Z7jVHpNy7zOw^m*$&22D$uowTx9XLI_crN}CJt&~~BYCh( z@ke}Sr;P5?eTW}H#S8(l0W5gE;;S*^2?gnV$rNI_4k;{m6j^W-7`^45ehLvmDjLFY zA%lEWx;9T%YVu1j{Ti{g(O3{9F3e2P-fu3SM$cz=h*P^l_B8^rCWGMC7Je{2Fo$hz z2Z#D<^5w0u!g}`l4(jAG_qY@ES zd9!WJRgN7HuaIsK-;S-f`c6dT)C6jb>LD*$hoLE;N{cEOT1q24<)W@{XK{LIkw?h) z*V3KI=eGSp2t!nW0I&d~u)d`qr$d<+i21=zZoJQoI8o|blj0q8&aM;?oR z^BmEV@u&4GgOnlJAg-*;KF05^4Z8bEXqF|rbE4AhsW3E zsNb2qr^8W)Q#9}6$qq|@lQ;*Fj2f6HIF!ue&XhJ<@z(oQwOt_Xu##Yd>`N~Dhv^YY z?@jO3h$wQFcJ4x;u+^L_M39#te&nFyrQ5sNU20j=(L&5K47y=1L!oExr(N|VCTv0| zxhmd3>CQ?wXl4#B2Ce9AR=7}YniQHE#5SHWi-8VBL%qNeabSW+4B2lkd<7pbV4_o* zU=Q>DOiNk~C}iPJ5{=+~`DEqW$wJc6Irqq&6V<%~lC_W}rNkz?g5JFY=Hy3UkjJii zf$<`}P;Z4%P;{25Q_S1%2d}xsIuqD29JXcTDaf3=Iod8mzR%>vf#cGVb>#4J z4_Fhd1=m-$d?nZ#h)0xF++|(V6MD{b8>>MMOrZPqbS_BaF}xDV)vQM&;4(G&?kkxX z@8b4Ii@WNi4<^(w**WYMBg1GPHD+8?Jvft@^YyYHnhx!+$a%>G=INKzIdn7C8$|oWDL2JQSAAk zJ`Ev~>C0~Xpg>A)Pah^li%_k%sSz_zvj!+yu|sgFn`_i$4-9sfwT)XgtS{42OL9g0 zC>%Y3tI;(7wWdQx5auh=^7V*&6gJaas!J zj`60sT$n&KS3VZtvn6$ahPElIFK2|^C`tBfsG^?6w2kzbTxa?L? zgGJ>&rsh~I;Wq-|?dna~P0#C5NX^w4=!o{CUZd3Y!(DWqW0rvG< zQ&1FoMgmPSfgcD4y0#H}usBOiU1F1>G79fhB%2+un9<<_sk3#@qO3%4ZH4gk3o&Z? z_JeNsCY6~E{*nh0D1SYC!jd&?%L&dk`Ost;E-}F{J0W4y)u{){$-Y4?p_2`v3WP># z)ZM+Fq-V91sQ1Px>r$^^!M(g9oI?!s{yz7iE6NOP6C_=O(7f1tK~ zE~qvEVZC4;ftUB2k=1Z5u8W=2)`=8OI9bUwUJ)~q(KZgxxl*tj0z^tCR3XNlxnrlA z5&O@5soQQu7aY~fm>2eNK({K;sLdn!rMDU*{7tv@3av(QSHBmbeY9|XEg+$;N8YX= z=-Y-v_|x?m;*~|p6YaZEsMF$0pcC4YNdqxbMSl?715JN%mq>j9NLL&|(^-GUMgRJB z2iT_>bViM(6#mV?fgF9gWXV$HL|!jkOm%J0h}2&1MDVJy%RHR6DTE;_?`@B^z8xe3 zC)oFFyxT;~c{2#2T)f+Q%=&2<0S?|WwO@FBJ z(p+cccy&8a`Am#Iq08XHt6Dk1>pi`4zECF*zsva9Q~+U#!5!KdmW5a`#R$_w#XR6vCaT%NO}_3-uk$Q> zann)QY@G>;Ll@edJEJH27Sl1FtirjW$1HHwduCf#qK194Ze6ge{@g$dyw(*8auuxB zTAZJ<)8LsD*dr&V1K*!szoZrNZZY8Cr#?i zn+;8{6$95zj_QyvpW&{fYNg>dc0h?6G+F|%qDw*0pJm%wFrn7*hc07(+k=)=?Ur1V z+e~&((2S{W6Q_0Tj;8bK+@?&ezZcrwF@a|)i{YT7kIob@#{!=x5cI1~%X?~>X+NS2 z&(hV}M>3-&tpp9#ap~ktDosUI-Ro_eq#m8*r2b*zMuV_g%tCb%y|BLrw25#RDfhe~ z=JyMrDyMq6zB~`q$%r$-AJoI`QJuv^qr0q$6;aEWTY9^y2yfZvn801)%A0)=pHHnr zD%$4T%!@>l7A?|`u*mU*FvwP0hVPI3R(S#vBC}^6wIheU=wZ7)&VrFv)K)6=Tc@yPTP|6{@!`Z4v(=zqN3$Sv} zi;76=ggyA;{Y~{@dQeOK9zxmbNKq(yh=WwpSWW;^-dWYsxKdWm%*{%}}V%wrw$1@nGyj69VZYL(1f5PZW zPEM>pknuub;@W~(+sFm_O1p?Q|Ha)tl23AY~{2a;PP<~xkBVvYo_ z4CcFx(Yir^l?CyXNn5i{K&1%gOTbLOu3pjzCfBSVBHsDqwwf3}+>}arS}woEtLClU z2Scysjgx8zxhv>V| z%+0FLPhyh34WwxZC@C%p`7|1h86Qe@12x_N^ccl*lc>4$;MS%3Evui$a0P%2dVeLu zl{W~(y88~V_0wN8#MypC$5XZi(yz+`JKh;(~B^~ht+v^AsU zmf8t+w(LyHL^Z3>7kg}e?4ezD1iB`~hGKQWD2B3J`?H(j&{-Z^a(vFF4&mx7`Psj3 zcWGZJ=DoRxYK0-qy8ZC%KzFnpymFfE03SByeqegF5gwM%cY*(TmJ_DS{a#if-Dzx9}#tytwI@rG8~=U zOd87PZR{zY$P|Tm@u9Mv&CO3P3co3QqRB;4^H=!+w7UMjjrz*6Y5?0DB0KAhMpKMv zp`NBiQ^Y{k>AZ`LZgh1c)=dtlw^4v=@`VB6Awp;X!oU4f~+*=r48QV zVlo@k8QX^^ALOr0dy+LMmPiVXw2O~uU}*Bq^UKczs4--yqUN$}w9cUEljvTyTWRQ& zqXrraHa>1=KCbcpjC9vEIX3G!B+V~WcUF?wX%FZ$<2E#pw65s`zZbe~Cv}9F@YzP& zlov}GxI1>LtFmd6x?Ze-DpSmi=)Ak6?&A3nAQl`*lZE0hA(W5naf!}>4YO)+6Oqfw z7Me2FYvH*c&YjuEdMzew#{mT#j?%6e>6iX^hVoJNt376q+gsxx7ALBGYyNhG+RgAC z?>_b4;x|?peEk`MeU2{983>_dw$g_v6I$*-{ofpj{wVB?N$M1_^vz?AEn|t*Gum&2 zJS5e)4p7kU{3M9{;-h}4GH0BeTQxznXYF4QLU;|PT()ydGg)c6<8;~#7LJlVO|-t= z23k|6*I1xuK6s7OIe1Mj|FYTGa8HwZ`_=wsos4EJPc!%H*i8Q~BDsA>SxdvQw2pJg zw&QILqSjK#O?6SLf@W1mYi~ita>m?7U2wL%g7nFL#?(ZzZrtED<2D#4={>^J*nTOm zjA?Szc496GWBdonJ%VoR;OBh+jGs(xLWO(&G$b2w%4_JfBwNOKE}-@sO`<71EgbNx zSR@+kpC4c|hx6#cOsDbv<<426Kh?0Hmu`hUBSkmC?8c0}!_KWNG_dHa6==IU=vG;d z)h42bcR*{1(~L+o4IZmK_EA{?_4kqIerH8UHG(a+HbpR1Bc>=Sd2lG2@@&F2>EC)Q zW~u#UdU75Eekl3+ks~BS2RF}BqVuDp|NdDl1 zfZE;~VsAE|LDgTVlx#ulwymjyt2Ue9S^PA??E)cu2`v5K7&c}P`mq7#Vvg!oJwy;r zq6TVf=1?=by5WNk!F@{>x=sndh9u?Oj#w{5Ewmc-%lpD2H63-4snNhNJKofSc=V>R*yZ{%UK7d}o zx!^cfZo`1n1scqY^1b81DD@N|>CgPYYj?f~-RFANS5tV?_7pKd)Qtv}PX?uYpu5>0 z3T|H?TtrU-rzLuuWY&vz+k)l{09QIVj>zuZo)#P<*~x!$<-7FweG!&NG`LxhUB80Z z-OJ((;pE#Bgvx#UHUj$W4Vuvr>;?~BFtAyHT|bNX?&8v)ie0~h*xkajmx*0JfcS1> zvKK(FHJYb?HUKUI$)M1m&T9?487h#U)Nj}38uY5*uO+w&1CMtT%#7>x*4!lENNWhV zGgpNz4nZ@yrrc}%NEUKk}zw*#1TCY5jbYd#`)WqDLls>%|)7gtjkKI@`;`%I8~NebN2xUaiOK4hF+0CTCSpnZr^F4zKE zqTL>-rZtoi``*&sJNMWh`k=LL^G}2?XLf)zlv&d)X@+xn5}oIg7g`Y@JM7-ChZXyO z-Zr@$*H~Ty+2I$O|K)Adf8THZ8$vwB?BC6}Oq-!t4~38kLP2p~hoO&v4wZ1V9}K62 zT^E6gbZN@!AGGAU9N1r2p`-cItXZicUt8-HB4)a}TwSZNsq4EY{trd;yt-O=?#;?m zu(U#$`u_TH-^v7s1R&N}TTw2KWi5;+s!o zMDi~##6)9GexU<0L%+D;Rarm4Ft;p_9_mr_Djx7t^vVP2;rIW-g;B)GUU9<-GVhtg z$};b%!*ep-N(VnF0z?loj?TWzyk`$P<=*POk3nxEOQ@`W>5laZ9 zyyHf5N`B#Ye;|H%{L2axKB?}Aso$}8$gUhh`ouT7XmIw(&AuHcjZ>SDnoydMn@H=O z6#76aotTGxgI&X;Z)`H9Gx$=SDuFAg_h}G;7IL&siECKFk9?z$|Op z&5I{TF$~d*{G0oYPY;(x7~I#ae|JSxIX%CZiP-SZ!FN{rJlsprcztVgOR%H)H3ZoDKl-=3Th(=Q0r)K%obT=aO_^iS2ObAS6iUrje*hQVG2(^^~hNVIoe9da$HJkrX%nw^D0ydm>UMSgPUUW?)XGix;?TARps?TU3B-^BLsi(qAY2BZc zja)SDlOejd!|7#^F_!|Pjhk3wS&bqwQ}0{c4k#l)_(Xs^&cDNqA!>~zcVUfHLSoBga%#1f**MAb zN|?b8Z{f;=N~u=@!pi46I4hQul~9Gc04ElJVcX~D#?vs29wl#(wzJ*~Z9K(cB}<)F zS85c^1EjcI(YNhSB-!mlF4^@pCE2E;yktx1&C+Q@rbH^PCXHmzrZh_ra^}s-uf`zJ z2=|e44o=@jyf%V4$3MzTo9GBMkf;zeF?bd>wdriE(kh_aXA4JT>qY8RrN>C522|KE zr2{>(HH^{@x44(HB=;RzQRPR5FrxBA>sq8}T4&j)7|UD+zEf43iL;?$8l#}p(@-Nr z0!<9C^YA$kTsbqS#?+UXdpKLv{ouESAjnBiEH-1Zxg>WmQPQ%x6fV)jtT>c0td0ME zkpKPl?*}|a*S-|!Q@;slU3d;edw8>*>?O5J&@dv9H1dRoXf$ zd2j)atr{sIJdpS^r0l;KJGP>5o-{P+2Iq}o!2%;isCyo0z}mP)m4^isMk(?Wi=XiJ zuzGa;mTTr#QxL7W1|h`D4e04*a0CJBcGwTuqC2@^~Y*33hb zx?W?s%LgytAgHT)!~VxX4f3tHrY6KnKNISj?Ez=9wdo9)U2tl@ABCvG;1q3dHX5ISY4^Sw^wQ>53L;^jYF-7gaf0R z3U~70QK?6S@f3qQh-zTU?#&DfJ%i^s`yXF<6g=&amS=+r+t<%u&eS5s6Y@Esy~K1V zge$9uxRR5vtZ>$U^`aNjr-7O?>kE}cHr~S~=JfxzMdyJWnndEAVqwf`j-!F#hUVkn z_L<A?lP;c^UQ?*(Yy8%za7#d{NLkz=!$^nPs z9Z$R`C>AFcSc7A&uB!vCxfA_McKoI!oPqjBxIKYuRvBvfMx?sKu+0|CP#uMeC6F{S zDPQqu+er^_A$b6V93s%{gR*m&faJ^VPKsqIg5n#-x#^$SZP6W<5tce&>k4 z<@(jN^bl`Ve+fdKB?X3h{MvRF(t4O^@I~Y<1+@%2{Q$;;>vdq=Srasz88Zn`c(w( zUKhcMet@T)2ZonH`A6KQ;-~g3{DMz#FHZi|G-{kBNlb=h^IXFzrWa`(d++C>!H+*yvJ41gF1)`;?a#om&H%A`h zs1~Saar1s?(oOQ>9j`WIaRz;CAU+W|vo91=2>a5|;T%~0u>j6KXRS4|4r{;dfq?DE z9m?^C%}A{;+pL6+lcD&%9Qn1*(v{w3ybkCpQUTRp`=7NDHqgrS`x~T7GXJEusuX`( zFFNZT(T;ay2~NO{yC@;dW>b)~6^_<_kl!hXUYrmea82eWvX?wLmw~&X%Oe-;C088~v^_-iZSjTSs@? zF%E6h!$r#jsX4TkOy5^^ekKh6h-U|F>l|zxc{if50UlsIaqCEKzTf*WI+iA>y$3h zA69%!j^iipEG0~;Eik1v6XjQ&rZ$R3gNq$i+8Ov`g7v(@df_W>c(7kqsRZ&m=1xX3 z?%%2)>s1qA!srU{Z3>@cU|=5YQ^Zzy`6k_{PyvDmv)HBasw|SU8p3qyRHiViEII}2 zvg?Z5W&V1(xctj79&zFhAV@n)W2X;Syqm@S+tu-pTK-S^#dJA-);Bc{!-aXA3#?ia zpvz~$#*u6tsyI;I!2Uc6)20?*%`3m9tjF;$8NG>ar_0>?;7U3&v-@WZAv-D4DtfhI zvM0ukdIbG^UfHgOy3L+(tVQ4&1`%M%$Ks%xlxJ%3A5U`p9=mxc3_@hFBdGl(yPg%w zLWZSEL;`iJh#1sz0mQEdgvmi|Y}|%4c{l*>3hEV$>dh_ZPA(h~L4x>z2_LToij!7P z*%zku7k$cSay0H09;9yFNKv%JQmZsRuPCEt<=CEJsCR=1BT;Cy_7hFb8nMif%yw-? z?V@W3&W)x*2=t!tlU&0%DJ-npo9JP^jK@Et+~k=Qg#G_ykcb~z4rgOSVgBq1#OY@r zFnF&{TM6|W_0;$Xu+#{!v0)(wqJ!jNAylFw`K0^Gq9RSC#?hqvC8UKT3H8efj*|&{ zY!r|9XmQ3OwCGt4M1;na=r%6ycsh#bEZ|uq21Q0vT`D~2#Qj%lPzFWsjT$t}i&;)q zi$hQx^&*%W(4OiB@v9}M_B-HYsF#p7N%?C81>0v^;o7_zHn=_q8YO|X*poe zI6D;WEv?_vVDT`yu(pjq?B9Y`md1 zfZn+sHSg2HZmhU~XF6T1Z)GNCYyVk~96#%(*DyKTs(iK=CGdA3QCW{uT~(-)suzo9 zgWI)k1YU0yXRTgK2nyTtVR23Xik=_KV8yGZyXIxhbA7MjuXD@Tz?4M1?C0E((}ZD` z0MkF!=rQ$v%-vy6B;z`T;+uZKpA#yI`>e^q~G z{#)FNw%l{+e&=5S>$W@#Ld;*<-g$KYSRI>TVfbvyH}aEImu;@Z~$3afJm2;47@a~-4GPo zLNf(mBh1vvy*yg?*0Z4pFzC1YqHjN`Y`?*j5`j$8OBM)$=DP=Pn2?ZwA|fRv1>-q; zY0GKQH6bCk(Klw=x7+Q-_PP1*Azx7l{1>7l8Q5x|0W4Gos#P$+pmb^3aL=VMF;+EnA$V4y&aw5On1I$D* zMSLQ^!UM!aGKFFyzkH>D=!5N@;amJGa_D{s3qNrfHqO%MtI4M6hv@xHt-dH9)bkIm z&GPfg3U9{%nOHpZu!%)wb=39yvpiw@8x1iPzV>ByH*tt0ppxrsRR5wBC=0 z3?UCDXgFroShbvBx?(sqW{8<%~VdIkVd_6 zf#}Xqx&jDUI^O!^K6kTOmO3lQMn5Hnl=`YlaBB$0;Z&vn8jmPBy7QUqE4UW0qA zt*fyIwlTF-94dFr;a<;H(WQbn!Qtp_j~SUxW&NA(795$*m|WD$*mfRVdW40Ve=rim zO+|-R=}g0%@RYz+RF!{cw5b=2wp4H${gWjlc|K-i>T5+N>H;4(VU4xQ-@GWXGEERx zjZoDzsH74^onDnC~A>8c$vt;udtQ zG-F&#grzGZdAV8g=Eu_p&Z-;b#38RD9j{^r0v%db)%l7qT_@bM5?M7q9unR~BYw7y z_h|}lZ$oQMu3&zod#BiO+dmMl=9;{MS|Z$LoozU~^bz}Zw<9oPPvxL=BN_x| z**iE_8I({>X{ID2#+u{;aBoU(gx}J4yc75o4oL)oZ4{o_M}$cpmA3*(FXxZo)_zjX zDGKq*m)sM^6-j9I@ z)>tJx6)i1UhYXEWjmY6A4l45@Vf{$-K5r>H8x~9@}Zh{$(?rI6Ny)W2%?AE4fUuE*Wn&Gxt^ppD1t`oOiG^1y-F@CgGot8_*glb0f!hX< zl}=bkvmKab@!ugT?7NM9e-DcZxG85n6LJk7#C|_23=mNENp`m@zQ>F23;7weSG_)% zW2zS!Ud;knrCZ@k{v2zG()1bO;y#$y-a0rmaN!>@jS~!5cj+FrF~;I{L747k`9UPn z^D9=t==iEXDF9m~ZXQ3jUcd8iN3c&z2v^E=V?QqV?k+@Jxh=D4W zz^$6Wqd4VbXQK=8T?sQ&Ay-Q78;PUO%R<)zm$)G>tgOr#JpXy_%9~|6wG9B)W}l(P zSaGEhZKX(Ct4n}>O>Iy|#U1j+b3u{5keNQa7yEhrvHFUaUCS-wAxzq;Rf6_8d@)J_ zKohg@tGMKjmq%Ox_zL!=;%wZW7Rao`>$!uM94el{({fCys_VZ{nJDkwppjCqF*6u7 ztCNySDX#q#fO(8J`y|+7MpiwgbKBkEJ+GNMr#o3heZe%!EHPpbLUYuI6D%b(^lt*_ zm1qh5*9akQz(0L&*#$=8Pza=ouzO(=`>!5|rNUqq!FP{mHYRFszgIb9705KNg;6ob zHzp_n$B{_wf7a*@Q+$~MkwHKvzY%`_=PBs_X5+2|#6URg zG*=!Sd&g&^_|~~D*DlQ$E03xBGko|f2`Gd{oDAfEgQCER{DF2% zK_{h_RG(O%TtTKRKPX%j79vuVCPovRm^30RBlxlS!B7~X>%^J<8(Ew^Wu{{m$ z(39J4T4e|)2Vcsj@+^iIOB(}mLo@`SU}?@{cOY}-5kSi;;eibND=J3Dx>F!c(^|vS1HC{D<5J}++{h~^bY&F zlXa_^$0rMajoWX@w_GUDbfk1V{H?*9(k~B{%pR0u$ZKJA198XQP zBsK$QUa0VUHAYgkuu{y^lD!4mrmJW}q&DqL*^VwnZUmj%R=-scAKvCM_SgW0Me;|t zDq)AuhGz@{Fh8x5vmo}3s<1>3$BL!3-kwc0O6vQFMd2UeWC zVR1+E$V5S*bj&KU{dLEX-!s*EJzqj__JQpSZu!6qvCGb7Z9PM)J&0he5Arb%!R6k$ zxZqW>7{6D_!dp$tgGhn*&?Hm+%%zSgg?Mw8tA|f4NrMQxVk&7JOd#QtinlD~!s7>r zRVZz_0^4zh4x`WnjgCPYX<53?-$wad3mLAbES_D4?xbmhEY`y%tI?W;BJGk?3Hc<= zs+Q1Ulhwxa60|#rHE3uvNmk1hK zs57g(Kb722{(5t#maU1^8WpUfz zn~-9-Z;!SC+M6`NFJ^j2;>chMB;`$Gw3nenIDWB>A&NMqC)5QZ(ZI1~gV3i!zdvKI z*S0^6{lmgLWo5t0Fk3SrY3|A~u*^g&8jShymDgxCi~3nT4FV4-;s&Bi3L{i%+Dxc9 zN9$CL_|)5!E8Gj9Skc&)+y%OXK@rQY8A|H$wY37d1+pof(7*j96pDSF}#b30uws9P^|jAqJ`tlc_XCZ_B)aoBfJuN_KdP*lX5>TrAJVwLca}naD^}9}4%29EM<@sX0=jSUuiS6P z+y$Q#_;c3w1*Bd1-E&hd zLER$-zx}W#WZkl{Pd*>+8{uLeyDQ(In9HTG z6)lP3VjtJgIG~w}q)025iDhCPD=6Qf9orkk2}9bkC_&{9WMSK2YHe&!X$nD`D;DcO z^#v~kQWi*avY&b=>ju{C+1&X!vVp7$!nYOJlza$oMJaxPJXv218!=D9$!M6Q$SX}q zI(35_>jDa*4m$$BqvvE}6iNI4yuy7^!s^~hC$C5zhtCZ-pi`?Ae%T>iq2&vLKWP>3 z>pZ@=4DtLU@x1@Vx91Y%&HB5TZ`^0W>~T7$=xi1;bRWti-SJI@;aoeF4_w_v>EqjS zRvY%IUi5W(Uk;^vGn(%w4Ftn_(E=s3*s~i6G#oxKpf`%e^&HF8Zr_Eg$O!bv%?yQh zzUKn9nRan(gBZVKFrM$5+4_QC_=K)~UCn+AP~P}TQ2&{8@{54G=@&sO7-vRc_zZ%l z5I@N;B2d?h{?Q?$-<||?lM{>1;6PAt?zic8)XzOlO%F!4_@dr*H= z_y^D&{}C{_XD{C6<2)3xBHkVXGLn7|{+XDF+R^zLP({(1S6Opr2l*((xc>Z+_Sgh} zrkHNaXJ9>ivHk0+k>TTtM@!{rz-W@-^h^F5gSITZmLcOHuhoQ(M!$C*%w>W(L^^hT zuZA-OvhIQ=#+)HdW}JttaG$|&Vd5BRHvY*TfnXG?P`4FMDJz!@dE5hpV7c5ph1>Xh@eQ~r=H)cFwIuIZxqy{K-?v;EW(+oxvz92fSLfBIz@ zu5caWJF~0V>fzuep_m4XsKBf5Gm`?N8!D!L@^SLA)kE1J;@v;-5sR`ua0o=1*48oqBhRv<&bV((g$V}ul0WXCg0Pm#hq;zE;2QWzw?LlT18A%(t80q1dr ze2{fU-S4b2`rzv39OSl~F$BY$V4IUYoxe#t5ztVt>DPi|T>;ZYKH(j2RDc%*e&)`$ zV1Ml2uF(y#td|^e)|5ohp9uYfc(`>#F@JMOnS!g!_`lkBMtd&V(V-vWE?>bC@vVff zexO6oCS(k_L@Ve;e*j+X?5ZiSpb+4PsXR-*k&=TNv>p8mg-H`*j#+Rj5M{&YbFswc zQ2dQ4t&Gg#XUP(@WYHTWDq^Zw>I2&N<_sLnrRLgWbH-HuE*6J3?0=7bG00#oT4gXC z4kLbYoxVF@ee0ODuc!j;ewfUQ;kqgAK3dmP4=LK;+A2_`DSV|VtEH^#46zfZrL10}GB8rGZzUmIi~_JS z0v(bU6S^vVVI}Tc^eu;Ww8mO8+$5CUrsoq8OUc11iaV(rtaL4h^-FOtB_ZEm1YBiM zIs-ezW|;Ze=8@TdguvEsBgAt&LC_i^h`sYDhGknWK_RF+MxGwy<~L1LE_-+ zQ9UzeU=Lh5L=C*poN<*uDIdc`e+Dkl9K2o-y5_VGgZ40T5bi7;Jf8;4cN&eG2HL+A z=FSc9&N+4XVwMQ(Aq|B*sy7uka?t6-OX>PP;;wd(uEkH%^(cyPbC5M2a$ai^H@em8 zXfq?fLQ#-pR0I`0iyCLC^BDCwensxiP?o z{bS-c+$Y+n3|DNf2v%(0mi8B!?WT@DSY3WFevmGGql~#mgE?kbF1EV&esknPp5IN) zBw+a>a_iYl@BK6XCI)-t*i|^PzFo?$A7c zb7sol1C#l~zWmc@?s_TT)}8N3611%;i(a^GaUhknttpIt$i93q6}7D?jlS64l2Egi zL2h;1k!a3Pl%O6Jd0e0#Vm2FlPx+bbEOhE_v=7M_*i8J+0#Zyf!~(;2Czu1#i4U>w zjuXUpAL|Ev6kG#C9>gK|ZlR-H3u_y_yvOhXzbPfv+vFO2TYD4536CcM6AFg~Vph}; zP-TLt*5H<{|A;uT@FD(uS-orfiM`Tyxbi9B8=bxzCe5%}@5lIA(f(ssa%b1*w;hV{ z<=AsS`&Sw85rBBt+b-)+L_#EANVwBBg zcLTsu$$JmDFEG65ijX+jSs!v!auzZoTV2ZiNqe$yPDkk@@duG2831SQCK-lL-5_hh zM1BYH$8fah=C152wV=%B$;-Uu+vRbwxEA_){Xho!y?2P9aj$@PYr+^TT?4PGKpriN z`y&;BQ7zO(`b-!JI`}N&o zb)l#C^lzShrn_T-ptF=zTQP zJ{?>`IFB=Zg9@e0(<>2#YEk+Pn<{N;Id)7GYUCE?Ikrardo+Q0i9C_R+ss{H=pzQi z2TAxaZQV3u7tS_+$u>Jrnn#~iuXxPwrf$9U5Wn|)?R$=}k?3sHQN;l&jWX(I6-K;n z7eaLC!PkUG)znASh|kt@wZxdmmf+AoCmJ!a!i*m@7_=XY$d-2rckjin@;aNR*PnR_ zbvO7LBuI^nuu$M(DiT$1t8U4PK2k7cp7r1p7?=%{%b) zp!Ili;(pE1ieccB0VPLf8hSgS0f+dd1@a3+=*3{W!fljir?NrFpxO^WI zsm{FGji*VAR9?#0ovG@=jo>^LIJbE<);FWQwh+bXgtPXoJHQZR7QvwvizIWswD%h; zKRKM#4#dAjZedQz-6|!N;(INC@jlU-{&3A(#BO0GjzZG(`10>NjNZ}3qg;ZkQQAKs z3qDw02WUC7q2JK~D!n+}bfXr3ejl=V${jvlUuuXYN_x>JWljOPps3hj_E5K8=^=GW z!40}w)Tk}s*+gNYvO|msSNMzY{MBH=P(sC)c)>FKQM;0#smBFFDsji_LG4_hgqc); zlsxiuB41`)1$ z!n|E7L--qCpj=Zb^OE5C>!=p>T~YF`66JSz>>Ze&!DB?wzWHmYnQ};_p(IQ|9Eq9d zlN0cf<}+RLJ~_Pt=Xa>507IAz@Q)QoFE^M*_#T--JcwcpC>5l`-ZTn7b60rh8ALNQ z_cQ(y-;XxYFy>0roury6t;EAk*Cw&u`Kg#sq8y3W|B1I)+sAlP@Xa3?`erVE`+@(r zzL5W?MEv)BF;?A16WtQU-@uvt60X8?06wB1wjsf~WhJN?2NayN0@S+Mt}{elYwK!Z z8xhT?Z|!Z&|LmOjEd4nLYgSmnXM=c-czH2%nkpn zODrNW2)l*2p9evFBZJ~eFSoGS?HeA>fPDKVY#Q z78R8$PSPzWsg$|y&(z;fM9g$)qc#qUw>4H~0VDvO(2P%`mV&XX#_Niaj5^%X*tJ}* z+KN&6MI9nilgWq1(hXNbIrtElvV9t}&@G;|l(_!NP0AtC5b^1i@g4aQm8hy>ox?C= z-l*bCs6axOR4x-4JGL~sb6#|c2%{Ml%O6Fqw2pV69J^O-UUBO+l@%y=O)rGBAk<23Ot^RLD&koe|g4DcBk9 z8RsOnXfZKanT&`1^K@~@*gbyX9ydk1#Y*QGQgYEeX8<1TW0r%$6x7frV+fz#2AL&`sO>JjkG_Dt6F9b?8;ccP5 zplTNC7~GHdoNhZHYSBldsFt0Gf1xLhy3r*SS)=%NWzKF^4arX{E}@;3f6c+Z;zG?0 zNlU9B_cih%d;Trp%6C6y0`jcShr!gMH9ss8L_H%42yfm}wC*#+qD}W#!yLdBQRGsH zx+0$5k?qNd;*{-D%d&Qhm7hu@H6`^!;(g?_!^*h~7V}6*_+n-`m%RYduk1=H zmwN(IsbrJY$n2Q*VdL+D!drqJ39SW;n~++%!Zxl8SCsRu3lzTMbwWNcReG||JWFhg zn^*xdd}RFB;u-#eL}2L*69Z z1AK<7`mJ-@Ksd?ErRv<$!v4)lDSPi6e+q_PUfg$hXtrK?f{oFA*HL1}@?U&*hvNv8 z90&dlR1@ewq5rxMT=0ul z_4qFGrr*GH=Kn*HSGTt_cKlxfQ>keIF6ibcV||J)6O@26W*WGbR<#iJPzhxv(Q*7wq0dF)zGy#0- z2wgP)x7&{$i%WaUq_ByGWzxtPD&Lcsh(BO^`ue*dhn9R7Zv$h zZ5@5}+J=2fP{8D$$|F+=wxtf0{Z4B}x>Yy4^Gw#JsNNDSysu{{%F{3j)KEH*K&=fH zH5(aCTiw$8M5+VcGal>+Gx;IqappkpODGzY7|R8MvYI33H0xyKL{u2FR5Ab{@YA!b z&OA%d-WzhHQyfY>Sq{8Y0|h6G88=QtDV<%nxP*!3n_Nq{%xj8MR?M9Rm|GA`_vWiq zgHCp#)IZfPsG!hY)`W~34cC=v=ljh|tIs&M*PP@gSIyv9K@0WfIw{T@_|rFI0co8s zH~QwY#U2@|MEn#(|>RvA>uj|vZ7_&D{+heU!3EyCyU94x%FXI?mdASdV2Ti4JlzZq^h>l~Emp zOPp9^kTz`!)3dQD))*uHupff4`)pg0`z|ZJM%PTy%-X&qrsfo$6Hv_3cS(o_jRUfr zp0Ke!u^uMeacw3*yj>Usu3Q?-50@8pBcpIXlr{ZRjl!X(C9rKRJg)J%nR}&q=8|;P z)ACC3OT&R1N=$aT9!6ztRhOwz4UfMdEgoIUo6*L_8xEvH_{p)gCl~DR+v1v5VLc&@ zX;s|pj_n;cxI>`cj8DRQl&?3Zho!3r1`E(EQV$>>Sz#fZ-tH6<5=6rMV%eWKfza#= zVWdgQd6=v9vNWC}E$*6!BuL=8JTw(O)%(~R*DD_tv>_4Or`vdkdzBM`-LGq z0hntFke(qwYY0aw_+&?OKnb**SAQKG%LBgIxrY=e5`z+WuPXS>L%-@HVo~j3 z^W7V_Y`j`=LGfq7?G3>ryTFbOgzXDBmpfEmv1BJI%L(+34N?Zcb*Ah6^xbaTMKJJ1 z;0<=e*M5g)^TkeO>W%)oD+?=LLzgN_)xa;#cvRLth>o>>1aGax|FNmpVf=t;-y#Y& z0Cd{>vD%vM8}&K1|kB1n(qj% z74Euo+4^>4V`^u4r?%(HytZYwsH%uySJXq}EKLB)6GGz3B z1m7krH{6@N5YiWc#t(?9L9G>zmTmxqkbtFyMv(mL6k9r*Shk zcI~y~Tf6vx&53?;i*E4!o47nsD0Tc-?^c8`?@q1|F8f>ZkQUZ&PuW<(z%J%``ITmn z4g;<&@oYt>h>ec>_W*&jl(`aNB*5B(vq4hcPW5@%sf;rzhVGtFhEBqi^?c?kw(umH zd}2w8MX=R@f=DjDoXwgHCmyg)AB^p=iZ*F=>aRXkBW#{pSeTL}0ktwxK$f-i11?Hf zacT2n$jI1GV`>=fB2J4p49q7rB}s|Rx=MaA36~OG)*6O0oXrqdEoQ>VgOi9F5p@t> zzETFtP5;u&4KO+T%=h{yJ5IlpDjc`{ozd8N5?CSAME6QJV>!PSW}+I!kin%LYOlBX z+g_9+<$C@1a1#sCAs6REK5NSBE-jE)xQy%4KUER)r)wj_)#ThipxJ<(8rF9k-=*Dqhbm3R5+;9wW64oBkBTyHKTIOLvLOp z2>mZj(+}&D^ZNS}ERICE*uRLSuk*<(`&m0UvBJZ|pI?v)+;hd}ZHuwWcxAF#(&oiD zYDpUHb` zq#ZWnMra#%gs@ND=e*cf=;4bXpmdHoK^k(}a1LrEC}*U$nu7h$<=z&I9_^3;PP%Y# zwV9MMv#6O+BCE~^aW})zH@TUvo66YDGA5PPik64h{KUlm$4mPk{y)(IRMIti7MOpi zhd|qv!!9ETeq~pNo55#I(j`Vt*k=8y(rQ82MoH9){ZrPYgX?WIgs@PV-rblQ=Ei;ms`*k(no$g{ctx2;tzRgXFu=FJ29Y1(-z@ z6D@|&>WaDD1BZ-7n8&>CZvX|f(9d2-(ljw&<7FKVDPGEOiU;_WG+djQg9maR)7a!{leFWy#NX@d-zWs5mnTYN<(3*~;Mzv}wMdXwUa z*aVvoWhW5_yf{!6kR|w|XoxRs`Jd(by~`$S0hcaF20{C~80zE@@=xr*H$+rV2v{dk zto5{iMK)sEKQPYEcetetK{EureFnETdEbUn2H;ZZj{3~#7%Yt?AQR>SKY+I4(rY%+ zrUFuDsZ2clF|!QbGo8xUEDZgMnX$miCRn&w6{F7u=)x<|tF(a;DZe$as7JCzg)5F?x^_hO0ZNc=585k< zg#Rd)m%u-ChZ{wi}SkFp38j7jKA89C|QU#p%9*a6&B+$oR74;AFRG-el0nEc8n+)&0Zw&9EobPXUztJq~`ujZb(AKOH zFn;BN)k{Fv@WUm&**kVgv8Ka%4nycU&eD7qe&f(hG;kdTsg6sUZPmSZmt@KtCb&Tr zn!u>ap#GRN?ZVbi!g1^1?PVrme>=l)?t3LfMqj~zA`#MjUoOs|s1 zwI$zY;9`%~4oSIU)}Ndjzf#n&N-}g>yAGIHAQn_ZyxJE67+0H71ic7$9bgNcl2dd< zWf)~T@K$Lv%0#t?Kk#U&2eNTfI;i1S$)_foag*h`UYq3>hyK9!*rUC2l!w-h<)HtE zgKndU@ArrGmxY3e5Q{j7KDYy_Ry;{sjGc{<0+IzHM3xJS4~f$4jPTG;qcUpf*flAh zj9__jq>}?3bEFf*3^Ar*8t8UZ@jmE6`ygCLHueM60MIQke@|wJeT_N=;@ws2ip3}o zvcYA$k%*n?RJ)P0t}N_$4TR9`jG&72fxKa#w+77tAJcK&3Hgo{9n`d=$F2z*kz{Gr z9x`8)sy&79s5_0TeMx-YJ3FxDS+{-;I*SNT7UaK~G=M)x5Amd{Zcv)=GYfs^!^ey3 zS=VbfqOAf@x_ofO>%4WZLDR#8{SR0)RfV13i4kRaj2ig>yTQz_!&vz4<3Y-9G%nU` znH(-k`kqg;!Od8y9R`$(EV?)X@W^dMXVf$vSbpolDs(N^CrX;Xc7wXJi&dIS&JXv( zg(sndSGdSSgSoL=&*En%qtM0;>bu|YAB%oIAbvQ3;V&Kf=Whaf@Zeu}DaDKgYs3-( zs09sz#AC!x5lb}Mj^{7e;D+b86pftcEz9LoNrfNi-q1S#M>dYJ)G{2 zj2i9OG9i2+%7=9R1nkb2ROTnx(L~VRzt-r_ezgxr0aYR+!dVzEBd|$?2>aTcB4fjt zv%!Yx?|xCgWIJvfXzCtGXZ3n-j6>gLP?f^SMN;qEcBk-YStl=Kw9$y4g-g&DfwU-8 zsA~RlcBwIU*IE{*t^MT&f@pCNJUKO8c{%~w@QqIrAF=&`WW%y<=&)wUd_|23U!M(O zn~RI3-YlxG=2{5<4Sl~bW*FkVpbOM-Lkp@or^sr&{x_*3N2O`}Z-sskmEj;X z>tIC{jV#AUX=2DL4Vyz(MNJhBrj6&KVM`;vwAFjdzIqI9;n265NLW|kre0hNU?W}4 zIH;@}qTUK~x=u#m@;G9xYgkkNH1Z#vpGbQ=+|Q@siJ9pENMtP|jZBeJoqi=|Cb~&f zZc>odXks|JCsF&EAw2puNUC}n@S3DPqbZ;lAE0f^psPjoyCb$xziX~eM#y`~-j0Z= z`Jk3$}w;8B45PCV>kFA@J9~U!JbbS^lz<1H3kkhDIjL?{Tg?7#}&Raf32%s%Ti5-=y`scU))l0gx#Le;}#-3OG77>BPo)xD9jzZf}$ zj>kqrwA|EtC)XXI$PVey-QD`A37%a)lx8;71M&QfpF&hS8{+27nZHG@X?(;MLo&?{ zm=H!BIpN|Ch@Xb>m!vg}`fHnTc2<6Tc(_40u6yBj)PfaUM%!x<=Jv_^nJ95W5X7L~ zg?=frUHESbUzgFVC&bx&)bm`AJslhKb9YQ;?QJD}?QW>c{L zA0BQr04@L%fGxn)>witDay0`~|8pdJN5W?PwH7>h7wcmKlq5)%!)Hj>tUOx!ILu7HtDNH-H zIFHUvUr3y+6y2OnbryEDTxD5w7K6>Rehd7Z0!1s|t2)ap`&~+QlQ@|3JT;ohrmrdqZ2%IU(AO|5^M06AixHz`aGK=HWO|@Hy zQ3^~@*=^6v15I7j7ni59u+t0mRqa}8Iw6+@?x2<2`Heaa$TPGi&jnh#|!( zd9oVF9C=$Vle#B6yGlB=Md=q$Qgj>{yQo;&eaN0~R_N3c9IbyLkz81*Q4RT&B=fv` zJO4gj>RKFQSYK&|JUDDJP>rQSy{*oQGx*VB(r27W85mNWIpTxo^RmS-Pye@0$CIU4 zqcz)fu#pC;qk<1pv^3^G^Fk*eOGIyVx~N5AQr<9<8v|oNLZ!oldmwS?k*_dq2b40+ zilUNG2h(b&r5ciHd|qQ^qUuoR7)sf;#t29*Eh&|Yn_teRv0Wv9dZ)|x!0T(fI^D1e zF{Vp$A;4PBqp{57Xh?A)U?+1bLmjL(#82~s0TMGO`92s7Ulh)Jzn;5t4@OXpKjskz;M8yt$VofV@lwz8 zix?CkR@?bR1inc32&9LQgNgv^5dS3D)~L%h>XQgW&)=V%ar@}~i-IGt2PQKqvpm5# z4Pb=lf~asW&%M7eD7phfv>svJP){`RLkO2#0Awb1D580(uZc=>`s5clwYlfL$_PsX$3?nA{g0?DT(PFu}*!j0N&Yl z4UaBjZ6sf){pneE4N#x_Oh8M#{;^MlJx$#`$(~o3nE98YU?-j4Vaj}#OLX^T*uy@N zH2-jnlm2f>(=pWnQ$FyAA34l*A4QNLl~txKwksKq>+!X)VIk#aTs^teS$D2uRNC*2 zRB_m}(v3z2%SzKrpc5~BUJJxwyshzWT-k4C}w3jQRuVZ=2n@$m~@tE1vdxr!V zCqkG7InF1Y5(Uvc)IY5t#9NRVc+Yfo|MpA`Trrk~DcbHn4I}uUbpBzArag4uG|U+9 z=wdr=O$C3R&3%=}qkjEQ$HS)s_un!j5RefP5D>=y|AqN~454Vjdg`fT3UW1dPaK&8 zvYO>}7CFJ=DEyvI1u?f1xkVxq;kmI zp$fSU=A!v7Av3ivA|nWD#Pt-jcSnzpMfwJfQ%7#e9}$t|lRW^)UeG$?$63j~*Tcpw zBab4t6wR{6Pb2t$9tkHsqkP-?_z%Kohp;JtWVL=1$g=xWOK)&bL{CGS`!?+FyonAd zUNPfb((4ZM7j2RJ3PaQpzGKL{p|{GnZxEm07as}Z@m4_7i;s};mP2X~OP_tleU`)`R8AG!=xv4x`` z9?|*DZvU@PT&e5CyHP>B4(PBp*G21>6-S?tK%tH8RgMjTwQa6no1KI6jET?2dc<%q zZcoUpcVf^R&=JOddeN4fIP4JKgj#<|44#7%0|`xGj~z;e4NC$ z{P?SpEs(7xQB6)7f$p3;cBF)_i#{%jDZXR@y>Pg98$D9Vf-YG-xll}RN*`}S5NCGS zV-)@VO6|o!eX33rGPR+hIqUyo?46=4>)JH!ux;D6BQnFtux;DQFm~9sZQHhO+g4`B zTU9-}zpAeK|2@WDXKNizUh|pvCCIQmk;|7nUk@`bba7#mWN1IWoS7U&sS=$e-$G?U zUS_)F+)-RqFU65Pk7Uhk*3DLkm5|r1O(JMX62zITnnXvld2Q?ojX?*)m7UFr+9NF! z#cB_p9CGGfOresla<_=$g<)e$)m$>T>m*Z4Hfi@JChZptH_3s+JqOk&pHsoRGH05g=mv^enTtX6VxAdTN|d5HX(X% zjXX(&BseSiC-vlZs{X@;0*=b?-R4T7{q;m-$9@ELf)v~db|ZuoS2_qtvHZ7d51-FR zzJkGprD|Bdju`^>aaN9MUBuj!095RHNudt!$C)s52N{F$&0nw*# zJdaa0flN=oE!+ju)}b{I=D=z~V}DjLdgmf~`WwVM+d;BqxEx( ze8PiYK^zi!-u)Iducj%Qd$?7oTLREb(?NsC!^UPC|H?e@CanvZw@qcyhgjIuNd&Nm3t zcomAD4DgrNr`y1pNS44HQa|`qIhqTYv z#2sBX!Qh8B`M{CL^T5)gFp3x`HW8{(rL-x-adIA}C)sgaT8bo#bw0d+BAt*~T^iu% z-*6KASEZ0C3tpUh(PX)OluE)9@9va4byhw!e?vle`!`Ff1WYAp(Ca+DLUf=fb_phqIKS$S|aiiV$^r}?B+S8s+dE&uAr z$t#;#qA>Pw&Q|C>;Y1B80WQhxrHUTR%ay3p53qrgN^|PO#EX!`yR05zm`S6g9Tp1| zQ|mPrG3AKxD4YqWBVOb|Ww>i|4r7D*U&T4-J-Un|6y3MCC6e0LstGVC?IdZ@QAINj$>c|cx;B`9h-}PkH1x_y;*IOm zM)z|$8qtEMRJRh2Uk}(~i^RRxfukLX76X5iB$!tC<~|~z8~8p~-!_$1tS%twa> zv)u7eYfshMn-C(pD&b+?J9f{e<;SuU2JC@!JdiXCrDh=LjtRDFSuKpX zgUaR%Wmx)bj~|F-zR?B{gbT-$>l1vOb?qEo{AD0_(gnsn-nOi?Y`q@8!U!`{5+T!m zw)P06+&6`=_Q-O%7lI&=xI-cjs?AcZK>TwsaG^FR%&}Lx&v7-?D$dd2@8dc4Js;pgK-~=#x0-0TscZ&Tv;sZhQ*Jt~<8>3Qcs7S{;R{ z($F=t2||}Ea=%to?iSfMB^pQEfkEMg`KCl~Vg#H9OVD)fAt;G&zi(mg@lMcPVy9ni zgr**X)*c9hiUz(ZktyHt@W-BUMK@xa@nlHL!wWFJ7qDg5s@g;zLU=-pu;*fsvK7%4 zQ!K+Evc`5Ut+P}Rl1CPU6FbRnnQ91MblD5Ek~TY(JRt>1mlWzJ`mp!Y>6)K@M)E4v ztMQ!oQp~?mqAcfN`*{w3l|wSr@-<1hH2Dj-MIL`k#}!_>YaTy^^Zor~N1{zG_=(~@ z_~lq12s?o<^i@R1XIlJKxrX{5RueuzN}>-&fwTF`0&uMj4+)YZ($d>WE*rD7!EBS#^f%dODJX4vN(lwc3Yy?- zn|o~6ALpkl{%qY=h*4?w%rvYRfp7M#q~Kpxe^NKC7>R0zs%lQoG>x!NC?L18p@&}8 zbc8~HO_bdfKkM)uX8d(;f9#Esijh!I0S@;>A;RB^p~u0q`?inTCgg^^Jl{~MPb;mD z4xtY2Ynkj|$8FIvuG=w-x4xxszCzqsF^?azp2ZJ;qJF2Ec3TeDNh92cYg1*@)Z#jY zx4eC5ex>=_YGvBsYU)<^KrkOtBMG_K{KjP3``*Og;I-4owB^JNf#BJFB@f{HKMcl>e3Lck5l#q$^6&Nyb>$ z1ST|T=hcBQy{Tkv2+k)FxP^wnkp3Lfla6G@0w+~A3S}O~GW<+fbTTd3xVnVv=orgx zbGrHRIo@=-;bwjL`*lPBbQwGY?hbC+Z;wI-+}uZ(ri{fyM4uZ6j+aWBK61nu2!G&U z+GCJZmXvCEs)6v&k8@I;IO}6PS?(+QiKDx}_gDxj4>51Axbtv0KlAgS5 zA-;OHYwL_vjv68W76`&H(@BF+m3$z!uBQa1r~NX76{>{IR_aw7tf`e}w3kqFaBM0! zQTC$Ve?}h~;)$9%q>3xBS)yMBdnBi+v$8NpP*7IbqO05(+gbLot<2cOS+Y+QKhBw& zHlto(u+3DeINu?2-BMv@sL;^Nny#iC4g7K3Z1fy2a4YUQ9ix+jG=sD}GpUW6rbt>w zPrtT-2EyjJ(`7_Iqa~lHcPvA##$joGeSFD?i-S>){?OdvkB8*cfo=#)V>A^9?2PI> z)_{atJ{QIhKObyro#Zz50Nj1K3GN3p*OF6t=RIW|*%@PUP`5nh8TjvIqH{?39ULgJ zu+(oRz6d#;?9_Q>nHi}zY+>%0>d=Pp@3RJDZ?Tz476~yLu-s-FiyExyZHasiV>>e4 zjNBy~B}y6o9F`CMW-l(gRLy1yDELBU-Yo~p+tUzA=H>Xb6=uJc&Ry`gpX}nbfG4f zH2vi6azQV9pvVG2G2a1elO`-`r8lT7Iq_{$-YcWp0W%VH65#@hk8$}iXc2|#WJ4s> z?-KsU*jQ+Jgb*UF2%K2XYWNV+O^{;va=O7(%<4CaoAy>N+!4V_d1U96mx!hZ#-D?u zuT&TiFPwsT!}muh3vYf8y3*lHdSx&IXk?+a+Hj?y6@q>nM?|A37lNrZXh9IVn!sSX ziXiE&1rTiaOQQO`s()Zq^w&Lo$xd;8_K=}6ca;A+^7%wL?fo$f@>lD0bPsbt)%wOS z%iL{mi|REOp+;sdJNw&eC!FPpd2VMQhc7YMjeK{1DJ->nfw?J(Fw6pAgzyqgmBYB=)fTJpprJZ#XE)1Rp#Y|>3G+1;U7T2(#{cTfp!||H6&iJcQ zKx;yukk4ww7*W@P4y_B+pB#$kNiXSCxY=hkoH6k0m5^f>NLTEZt`$Uhhucq24MHF! zB@n4a?F0y5$K$ut3WQD8`52(|x2ob#Y)W@uS`Rpxt+&eMl}zwRuNDTNA-|0Dme+Ge^UANn$J zA?6-%EPy0li8XrKLy#Q$nE>qrz2^r?C2hgZL*b1>9%l5%!}Ge@+jcwH#l&fk$NYYEwyy`vM2<`?&Xsb~eE&rM|Tc1V-`)@T*P!nS6g34$j@l$;a8G&@b zz{JuV3AMFpGA}^+sui0m8&Y*4^UL3wJ1Qh?r82cE1DmTn{!5da^^WK2<@G;4cBYgK z4Xl^dp4Gi&gNdG6oBn!hA>6#U(yjlR6QHm`{M z-NG?{hj2hqCi`I2iI>79(7v6ywFy+j3R3-oK+bsIHIrb9v~IO9s$pL&C0R1LstKog z;g(Cv8JB)e)-YjZWR{ne%hScowd~}O5QSKveUuZ5leowS4%E>%f!#9nSygbUG5%f5 zyH*#ulpCIUwI$5Gxguq+>1Aat9YsZff(}l67h?>uAEv{|s;HnLF%?l{b zg)NkFOGK+ue)EE6ZCyp_bS)C6&mC%Ee#iTrU0>N+2|b6`;>lJT%OBiBx`uX$#Nb7H zri-D(8@}9wUtpto6nvosj{j6o=7|^fRF)9w(!lM6@A;X~4i7RLPeFjB-rPbH*B6g>(G-O3#( zm$@=v>foiO>=#Bc>|ZrV!9oow3_`O?JTe!O4k}>jFLpTMCs6o(b|xW4VoXe8otH{R zF}sYeS};BHTE_4zXKjD)qUaPTP-q1t(_n+4dPF~YBEBjYSu26NKhl3{bosj1uA|U} zbbzgKU&oM)dhUI%(UVg(se9mS6RYPrs-}voT_|3mMh{2UnsQ|pCMzP!P|^1$7HcQW zii&zk1%XJuyqweQv6GOJ>;th7my!kZY_a#T{L%KcmYef-!-6E$;q)gk~@@S zbn4OWZ7Pd6?e_LyJmvOwZ>@oqf&$0m7}a<4@b>AG=wbMk{L{Om(yCeX$C`)9dCRZDjbx{`=~DnYkiFY;UO!k1TIkYt<9>sS?ib3ek~RZr5KjG_8(Zq zVNid;G!_h7==2pj_>n>+&Cm#s`uaDLe7;j`-x%-Y;76V*3Iy8}Kz<$aHj&;6#t6Fh z)|&+!2*b|boxN7jD@PvZNr9RCWz}x_>`-#yR{38?cQ$%K={`b5ZoFOJCD0We+YBWw z-er87ZX z0*;zav_i;F>H~h_eOx5bA_>sE8PQKbHLRsAB$FzdM5Sz@26ED5M&>gd700yq8b4@L zw1%#1sR?9;h0r?i1$C|97nsi%%NR)zck@i^Dm_v5LV-a2@;qE^wZJ$6m!NBrIiRg6 zDlqk-Y%zAZHW~jtv$}5pgiq*OiI?zrt$-2}$0d3ro4|!&CSjDwHXT2#G0*i2r=XBo z>igl4%qD;7{{mx=y2;Q>Zyy5G62JP(kg$vQ=RQ%G@Z&WT3`fKi#wy-r%9IJ_+8Uq# zlo!ze(}>SsXT zV)Hn)^HtN7!Jw~6nz)oo$%;{&}tku!lIb$Ir z;flc$P-L>W$T4sKvgd)Ln5C^r{odPPvgLbveLM0v;MT8{5jyU+&8d=I6Dx!*)MCaB zF|+RyW%hovXI18@VVtwlfnXQIdPy(LxS8rRe!f~1pcQUkD$no*UOMuC_l{OCTQlSs z+H-rt2(CX)aoJ@Slcu)3K)BzVU7SI2H1Eq83K3-|@(b^|k1mjoFdOvx(8AZ$zU3y~ zj+s9hr(CyQUv3Z^lpcp5r7a}kah6DX$hvW6DnFK_o;l5!FgkaGAgN4J!adAZ%j%8r zbUskI5oOj9y9iG)Pnof};)9#oBQ>16$aQLvzuL)1g$eUwsS(Jr4cka{8_2Z;6@v~!Wdqg_>I;| z#0!oTAI2T1mOZ!iJ`mRG+YNTlI26!O0VlZf`qLJTc@xz3`pp~pk!*vHM&{D#{2c?y zok7sPs^rQsjmno3{i`NpnK8qyw7{mB`9P%xb;3>}M4FF*aNPvao{NApNcyuTjYmX1 zrmxtdloFG1W|$oW6q^WGhVVXshVBV0LX-}F4)GKzgU;XZ&#Kmu42NCby+L@`vUmHqa zGKY|TD3?$Ff{5E^(JEuMAoVCb`wxB@?HXDl^gFXYgIMA(HDcV(0Z9|lhvYZ+N?(yH zM_5_PtYUXn?H6~f#5UtTAiIgp7r-5uI4{s@wl)=LQT+v)?$9}+SJCNLD&aAW=jkek zU6tw=3F>H+X%Zt>UP>b9!o9o%Mq*J9=2^DlQB4|uN0N_L+f}z2*>dYzXB+0_1|d|K z>eR%4E_9l$txJyiGIVyjLam)Ozqx1^px8^^7*r5vUxaDe5{X`~@!XDl1VpnbkPflW zYkK9!tx!SG!yv^`hJXh*K|Nwo9?J0DZO>O#;Gk=Qpe`=P-nv;a=cE>cjrq-uyO;Z1;@Knyx-7gg@?%P>wt$Vm2)S~-T#4_bL_Z?pwJ&E{$5G}>SK^%yT zxdm0R7|5+szDMU0f|W;LulGYt&+8__(ehme1?)5CQ@f?MVYmQ zZ0U;2>58)H?}cNFl!8h*-!{D4bQDi%=$JH=bQx$|Y3LFWQsh^XRjE*nV;_9APJ zBD@hVmMkdhHm~4%Wky-S4XjE5n_TN9`Y*O%OJ_B@-3nLbBb|ajiYmpG>+j6B*ajQU zwJh+e!;FyNUcfmj2D*zx2Q(v?w~uJAQN05AwThss_juiYH72yXG*0@y2)od~^b5G{ zi6Cza%l@WMezow2{3T!y_Lwr@b?hZz4Q9_6AmP?8q5E1kyyoN%*^$)((VFrf;P#6V zmYT3jveC_p*t4o;|CAbg{>hCywrx0VD*ZD@K4EyMozPARiK%$xU5V{$pla`B0R<~? zhRT)sM}6s8gY1aXYjYlIwCyU=4}p+Xj-yTqOMVNIoh(uA!|0uyewRK zljP`a&8TY{qklUBp}OCx{!0C z&F-t9Nt)?vQeWQxfcV_-yV%1!_rYjd&x3q0+4KEBw_!p>xir2@5r9Dcd3^t{zW;WP zW{lQumS)zBP99FqCN_*V21a&H?u?*7|N7nv%15M90-rr? z?(ug)?9P8&!(cz{5tAe$3s_P10?TpTz_8kd0O=LG5Sg+z1{+6P2%|dDGaqh`o z+_vPdI(JLt*JfldZ|1Du^tNJGcZ6(h*hQG_2dE&}r!b9t+ll1Ktu>oJ%;z;rJX!B? zIR5^pc0q|wlRo*~pbow{^mpd!f7_n^YrFXO){vwmBZsPh#$Q99<%(6AdrvJ7)UaZ}nY3_COb_?<0&ckxxb;-x`N?ayT*$c?D1yetgO@3=H{~Q*F z;q{8Sx#+}RT)8NwZVUYs%`dRzxzu(SRqxj_fue{fw=8^-k{3Ng*pNdM8#@Q+xY3Bo zj#3~tlA0CC)Nc&yuvs=c-A_U0a!@E4d`6|RM)5_nU|&5rp-Db33?fC|?N9SIA=fN8gddT;%mG7>h(X(e zGK8egP*=F^*)c^iNPm8&61|(NAm_TEAWQF|WW9g=#!GPseujdeX8Bns*lq#!Dby2? zHv$8YbPI9@?Y51kiT9|hJKcDZUnNE>|M^CVS`6af$e8zbqAo0iLJL)@G3L<(j9;Yl zj$`%eDcNm2Z+<=~H~z9f`&HOYBvjx!z6jm}jjfnLIxZb?UTRlT=9x#OBFsj22bc$W zi|v&-N6i zGE=zh8~4gs=%isHvJfKRKlhAkrq(v=@6polTT}Y~j3WMTM@-58=o-p@9dT69{%`;% z$5t&iFBjLri)=6)LUO1SG)JMpI8e)^2ANX4Lpl*-wx88!Xkb_q^kUvYTYpmW6d>*j zbAMe63DY#Ev0S#DWd6Q(>vpbO;4OT^1PV%wpH??A^H>+_4P2;jl$^ruatZ^O*G-mt^5VZ}nChXMzIKZQnDiL0Z(C5hizEWpfF zZD5|uR-CQtIzro^U^T^79yKI)c#$rJwS#Ul#UG+dT6(V~47+B< zd+mz*aoD=$hTn{5i%tv9YpS z_b9x&Gj`+gRqd`%78l}{mB^4U#ELtMsd}}`+7;y;5P>|qvQSICr@Ad{EA%1-K8~eQgM?;euBrq z^Ys-2f?ra>r_V~atA_op@7rr)fYAU4{jY0vQiN zteF@E?It$M;Tuo*7b7Gkkz7iF60WXDqAN|zr(R1qyFNq+R{;kuzq>b+1yu&7TG$H> zIag7mVNAXh>Joi5%a$I#6)?6dpd1xGr)%dz?1ei|0thAS9-fsWN-wJFQ6vYykVkKg zW?8D7419Pv_c!H)Bf}hkFTr!L*@ZsyMN54{e_#raLU&}Rtrf&D!*lKw*?#2+6$@6ORkF<;lPOc**`hm+NT!!LMw zWU=fqNR4SuAAg4;K-^LJem&n3-r*ja6swSIo$4|wVX?xDTd#ePrXkIuIRbAv7h1fH zL{i+!JC(|o^Tr@BWadmKDweH9`t-cks`P}gmNp7!HPaw|p27|AiERCYS^P{wtc?*jSP#ZInTX3!@X5D>~YL;wG` z*!kyh)zQYl*}~5DU(Q&wRBY51#n5~JTPAv;MCy%F)Rs*Q5w+-L-@(TL5ez!IFcPp$ zhNB2p)+}oj8pa={A6D;0S7pz5PmjXBKYf)qc!jlzj3Z*598Zq7J-*LY&90|*{(in; z`XPTN_K{o{*9Fb6aQV*^smmU4sj`rDkH#Kkqv=UG=!L6L6G-I!s-p-d7S(`ZFt|`u zM)?a7)A&QWUwU5wMUUATO)B`Te{%o)a4KwQ?ac(>HReF;adB4=p7e5_J#*Drg&W-P(Me5shVHj?Wr=rf25Ps^wW|cj{rl^LE!hGh%gdv59}BXBaBS zWg<=X%c3I-J<_RAoLKu4}DK!Z?ngNlD9%x~{HV zcsA8!9nS2;s-M%Q+t`!h%1+kJCF5hWi#q6_0?EQM#&B!$0^Z1{*i?gs7)@pKV3}v2 z$@;Is%eKazPv1U=Oxhy+j>8393WAh4ANHSduZZWAtCGab&8{Aujq|OJUbr`oSHmtE z&g9kEDja-|a#NVU_qXM8n4#Y)c-U=_6sMJ&jxzSnpRa!b|2N= zEz3^Vn_H6ztbkkgofN0*?cX!L)81LUFJWrY{4hWhsdRlIAhjshNxR)Z$^%`%`nP*H zblyQeK8b@qC@%@GSYa^>>_OX8rjKt{^% zY)R4JyIfuX9|587;WsAkmG12?UXxGuAm-@_rlc1&kRG5${;YzGfbtG($va9)k1}K@ zcb-#{PZEA7f4=2AF3$s29Xc>8RBju?YQ8RP$>6Oiy!ZOQk!S$IcO4n*Z zM~T{*EEzVKM~tx>?(zu7VEn53udhUr-!p(~bGk6^bCEK3K+__Ya5~zr#>U|?<&7e; z_xL*V&LYm_&}SpjiQ(t*@akk4bo6c&3x1nQ(^;(ZP&+m8#n9|&QB869DZHI=a9nKn z{5IgIzD9S=6_lY%Rr;L@+bMk+9ljJrR@^18be{;Rm^%6>ROGOed*QfAlZ_CTxPJ4# z+4{K3^l@}ovHYt#WEoD+B?D2y$)kqyxal)m2cq-dpSrZU^cVW_3FBvgZ~}*DGakV3 z?j*eEmV{YT)R_>D_e-ex6r#IJ?CgHPb1Ka_)l73`zIV)NF`b0n{%qz9=-yrC|*!c z>T(opvMqD1dFcQ@_h;Ay8v!*v7PCXM(*THocV}CNGUj0%dOIXK{)rMT7N4say%c%`csNSNh zCbww66~WUov1LE5Ohp_(Q*PC8J{=CDr#fZqNDc8zC_#^0PYR0>-bH$wN8dK1kSDZ3 zfZd|B3}5G*=?8EsE4DV4A_a7o-uBX;M4rmxd5CCx(b5BD?o=Izrb+DmJA+xProB!8 zu3vI)-)14U3SoHUO2G#;b%l)EsmP0tCPxb45x(r6yE`mJ+gno~90LONU$vbBRzA@d z0zO1rpy27^IL2c8o8{93@sXMsLe#H8R>5L-s^YU}CnjMx9w47CFOX43R*iMeAMA|^ zf!-fRY8!v_9Pg=V$4105tW;=76$J=br6jRk*wom_UZIl@Iw$qBaSgiHKn2;y9%HL< zhWH5l@NKu$WE|Zpb@?dn?n1ltulZv`wqAdiA}-% zlf_%u*CMc<_`Q`|T!;x-6WWPel+R>{dtPiGMBm(bLh{!HIA1`|sD3XyOJpq5t|m>M zdETfVML|#hj`1t+r!YWOowVBA0I;i=IHP zei*YVxiI9COZ+M1=JJ&72IPq^?bfM415tzJKUMf#0u*DDh$-Wh01-bK1N(H?kiJdm z=P|26`SnBp%48dAZ^u@hb@%o_t>(gJi!%JVJH&X==`Ln9Uf)tMmwQnQb}2F`poKD; za@9o-VSK)vNj$_Yky${I)>@~_@Elr8#X=d$HG{*Phj6%%GoucT`~BA{gMbfC*%&zM z2>Arnt9a^KO;W)etlY~LjtP2+RXfYcFV8dCl*f7SD_CmN-R^FY`XYLO6DA|tlLUv3 zgy{Pt$abGO_mpbzRtTGL9@#ch{ie&7R*O|Cw8wZ#tvFu^Vw;O#j*>$X)9bweF={#( zXM!pov#Z6#p|aYHjn{R0hj3!{$O+$=e2TF1l0S>|xk zV2sjZP*E}*#Y^R|UGL_uz98#q!BSuxjXgwnxaxj}B|3$lm{jnqv322Kze~leLf#4t zK5DznscYT}bQRPVu`}gLM4zw)PC1c(58CIEAbs!&0}qS}WSu(r78PhIFo!>4gB)V= zu|eo6{PF+ z7Q}?ozy90ViV6^J12Y+eZUP&C9qH}3MS30n>4>#}Bpqn8sS~)?bICB8wW|fa9R!@V z`0!?jhj5Ru8nE3*UBAXa1-Bj9d|aE7U(DhA3iUdYJ8YZNu=)}Fh4Gmaz;4&)+XSSg zP_*d>%**tH*&ZnA7$VaU5`z)~As?q7+68PJan+BP5~5ha#tl@q3A82^s})pb7+&29 zQrE??m+o}B*W#JG)6-BNVTq|z#hM$J=`|PLJqk2-Z@ptxu4UuKwUM!PZDsB1g==+X z7g9lCHRP7){y?MzKW6HhIkj&v%?x8&#++TTS<|oSku$3jq*$XXVNI9qf-$2hpS8T| z@fJn;=mekZhNVx7q8>_4WonXGWy=V=J1sY~78Ux~ z=M*jI{W#s*EpYHTP`j_Zx%RrD_8i;_jjBWyd|A?-dxuIO?$SKE2FXB|48VWD#rDW~ zSC<1=*mOoST|3~{zheg79%ckie?_rOI#nA{=op&hjU#A|Js&Up!(zezCqIre9hiMM zY&5|^#RU~4;}Z6s>N;nHuB=tz=NFSsp<%xs^=*a27>uD;n99Ni5Oz z3TcN(o}g8SNHj{9MLp+*su-0nz?bT^)z*@&Ft6t=uWcD14Mv!`yx~kYS{{{dUAMJa zdeSp`28O(%w>~YzA9PZwq#r_C2RaS*Hh9ct)G?M|Zw4=c80NV4j#nLKvdL^QuhY-R zofihhSF9-o)Z%O>;rH=!VI8WoUOy#K-1?dVT0yQX-n?aC@kzY;>IJ<5#L02^ox+yl zyo3rFWz!=W7g3eIlih`x5D|}%xdy09C32(1z7WT_z)6)=_^Sy!6`~pxAYe1 z3iP?7U==@@S>3TPlW&VB*mU#OZRIk{p{9FED{{44QRaaJG>@XKeNpCxM440JW@t(k zE4fG_cykPq>WxHOo3sXCr-N^dgt$`+KQP!;NO*`|gJg4Gf@>y@X(G;^c9Q}s%a9D- zkSxNS>|_T#-t32axrHvBWG1_YIedUv8Sc&bJA32l?>*NP>To3Yx+~hyDc8(=@9ISI z=tNWTas2AUqUb~qO2q)HyJN4G)~jT7T@UeHkPm9!4MSbey)^<&pHKJpg~+g>SW%rA zNYI$x`ahPPNxCVQFR9~JG3h4h7- z_YW{JYI}pJ;sM?a5LZruy0mj}pB?aFerbmc_*BopLQVlh_j1=zpdqJ<$@lc(8R_tS zQ4#jVA$JcpVs-=#c?j7yby% z22QW-2L8*~Z)4B-?#ZZ0FZ{(eTJxW<1{5b4Irul$Fn|UEqWd3Ny}X@;t@FQtjHILw z#SJmE;hrXw2@EMXaLU3#awI7);!+#Wkof?{!D?o-j>f{2NW-8C92CFF0;YATv0iN}Sla`(AuGbsiKcBF@AMTaAu$3cq{+$8PXsy)4%+c{e zrb>Ce!nWg^%B^qlkmZ}!qJQ8CwsjNg=#9jO)!@Pmn_5*W*$GmXAEK_dya8?H2hD63 zDJAs39@?|*8k?H8ojXzKd)f|Cn|u0^bl7bc^o&wv)pE{9+D$W}o9CXQqNexq_NtAa zu?jn#^k;!o7C0=ko>2#EPUYwdVsT( zi$Q5Zikw8U<7uv0$Q6-9P#HmzR2$bWs3gQ|1&D*z!U(sP5yq*RN)*uwvrasQwl%rD zm`QOtQn6d7*#O?QqOUS+jAkCC)90eE&us=cH(fSdy|y^fNCw zk`A$#iG?|`+TN`xH352!kR6bVW?vu|r-xc&G_4tI<^z z1##iw6`JSTT#_)mRu8QqvSQ`QJuUPP_riT%+vhv}m(k6U`f$8tb-X6pUA2 z*a0S9Lms#UVObcJ9rkr+7?}?8qDYZpHTg z7rW8xa8jM!J@W;2=Nw~tdHch9MgEa9f}&qxK6dvg3py3?IfL-^oM#na(8Qj4GsljM zz1gJ3T_Ug8O+idDs(T8_z3d#(T94iZD;eh0Ki%yNlGQUkDD`cL#gz5wcqfGRl+Vcv z1$W8NILQ6nkdAdedYMu9<%q7gh5|z8A@b;=uTgl!ZbV$4eH5j{;^zwaz@AVr*}>K_@jaqw7g!*l zi?M4Q;z(CajbS!LFGfH&H|dQ_9h+V~4Qg%#qVH0goP?i={N#2l*7yl#OnF+a4uxz6 zwyV$yW<@sc6*SJw@JJ82pY29P@GG*scPHndITgDgu*V;J@Gt1UQc_SO*i)$Qp=28q z2#EaudpP;`J$#Xxg){03`k!IVVT?eVTKH99ToC3!xKc7U+~FvC1JVtw0Omo-Fy7EQ zWC>C=9OTSqjrCa$$(KT{^lO=UavOEcJwQ;gMS8LG&CZ|en?L7g-2D9f-yw<#d?>8B znd{;&U1@GNZYgdz-gec0UY2NqT=yAi2*UMgr%TmCiTqfRsoYz`ObPc#5Lw@#62w#a z#t)e(Vp!j(5@PBGQKhF@-rT`*dMQ=-#;oK-X8|Q1&(zu8JOMMi4WF;v6gg)1;1n~p z{bn9d5z^g*F?y!=Nl@M4C+^Se+59t;dTMv@1U*BC8_1IfywcqhhrelbN8vK*lbYZgyFwM7Bn*$IX@=TR^h%f07`0gDJ=`fFR_*}q?RgJi%AkQ>PGvccQeLO%t9m#8 zieCgmqjTaz=ZH0cb`r2F9&J8=QRRM%XRd5po&T-aN_Uiu{Rs6bz?w0^2nA@*C!pa{ z-&zS#j9pClThd(A%C4SxBDh`$rskK$SZwVhX#jUt09_q{|CF*(7<;mHDraIGn2)o+ zKaK_4mS43`o*om?7VzW)m4Sxz8u!nSgTRIbLh^0MN(yoY; zWX6?s;#@2|b#=|sOpxm=xpWpA`0daUkd2F#xA*bt4|vfJ0TAwsMr zWbYzJp(xlcjqZ&;MFwcOO7{2|O23b9OJ36gw%?o8grQSb+eP7jj8yP-RPM9G*Bpcc zge5GvCJ&KJJ;V-GIj%A39wB_n_GCV#25eUI_UYk!hBt8V2M2F)I|~e;9Hdlw;0sUj z4jzaurP)3))Yv}}dRA^B;jCUs6MpQ?z^H!wbO&$roTx77&NPUtOv9(kQSs@@iLPBv zOIw6yb)o5Yj<jM6c#F)a|2n zD6kAGm#uW6YdbF8l_sUs%&KlHO#ixPw`_Z~%CVjz=1((zjJ;l6mbkcAzB(i)Omz{U zCzAAqYk2nD3T+G>=IDo9^Q*Wb7vK}{^2lqA_T_h4K; z{;4CByD4|@4$8Uz0$KSel$4oP$P2?xnGSDS%4#YTv5V`}(BLey+wm(_`j;W74p+-O zz8h}9>0z|6+NmsqE%P?TNS5IxIl;M}c`yEBVqpnUlx3sY202@1i3R928BQKD8|(qY zJLGZ#jN!o6DtM^I57z{#Z1`R8Mo+}44E0c1@qEE+EX4`kprGVY6R=_pgc&${;n(0`CZ@C!L?}$mJn&q~^rBsx9MtHKkVQQl|s}{_h*u z8$+yZ!tRVKSo{?7Y-T$7R6#vz?cTIeoy%DCc@D@jHH)J+ZeyHMZ)9J|a~TTnQRqyv z0|GyKCFpni-hs|KZFL9h&98=~+enVKQ<>{^kvH$uz7zHP?&T2kf$`}4DO&Oap5O{vHLw0-Hc>FLxMAHn2P#xFjaCh(9} ztmQR_LE4AP5x+tb6tLr`-;Ec^rb>@uo0L#gFjW_DFhPm4bwnyiehE1Y4O5g2pqJ4< zCjV8fRUSmv+9PlNX()_dN31w(w-J0sJEG1bb%b11E;#bPID4lc+rp$>w`|+CZQHhu zRa|A;TxHv~ZQHhuRmQ3A{{J|=J7V|6zM3&(-p%}SWR5T2_sMAS(nS0!lRpth`8Wi( zF%q3wOeFd79jLKVKK)67a-U57-a)%0L#ZMbH?|&6oTcN^v*oowbd@DK8dpeGSep)5 zM4qaf^zqy@o`54SfR@L$XD%D2jk2zgI~$afx+$}YRyWLaxHfJ*r*SwhOe#Hx+LXD| zg;`H3CX)u>$|+t#jBV#>}pxq zJq{VHuBy9$i}GO42Dw(u@pJ*_nH!|-EtSX@HPsncq`?gV{K2NCFuRp-jzG0V*!m#8o57)dblSybl==mU#=40YlBRe zdXO8}A*9G%3g3#Vv!;trP*mRiQj6TAzaBs<)!XR}1~dzTGOX-Kzn$7PqZ)Y-<=*nG zA4OhM$f3MNq!T&r?r~LWFY504ixBb4`@C>X1u$;u$ zmT;>(Tp(K(L%g#l`tEt(@lF+H0%}qOS+A-oj1^13k|U47qXNS{8Ua zthcb7h(mc^P$(c!utgcOi?_j@=HA)fY{)m=`#%UI|IWY2TKs1#l~0pN&kPO#F!JN% z{jYCkb`GXucFwjY|C}`ctD}lmcX!2BN9{2lTj!C)Ay>;Rbjd`~VsCU#Xe=VhGnj~{ z71yh^HaDa^m`mVoW+65clhZi`LOF%o@&lsPmRb zs`K>v*xowc-s!sO<}QH$dQa&=oC|#P2>?5LrRe&TOXtBSM?WtONkdP53irlFzq5CQ zs;75!)CAHcXUFhYSFd|y;u-mo?9;Cdf4J@=tgI!~BclwT`7d&@&-mg@>Kmu>4Z~kL z<({y4PsO()p}nEtqDG%T8+}hfC0$BTIY64^k#UFLxuIQ027m%F%8b#A~WCXfPRt8 z@Ga3(5qD0d>g_kVGeyFoMcq{gj^@I@PD*C7f}j1j9&dd@7x6=UED729Q)cwiRyLbD zJ5-UN{<`m%$?y@#cnE!CTtHoi(gni_a;s5kwjXOf1yTH3ijRa?&?{MFeWe{iJ!&f*Dyhc_HEUX$t^M18bcDuIIMwgjDAnRR zY@1Eif&i{_2)B+#@{y_Nl-z{C?zA^W_>b9T>0IVKc9<5(+<|mLj3`{Mgw{lQAi<0I zc6$@-v;_=aSPhe%xU1Bl!ZPka8hJXJYeXFwxY%jaRaP16rIs262inybHE5Cj-30hQ z0HA@&UsnD=5Z?j7x!uKU16=a^CKAO3Np+N#>iPGt9Tg?>}Rf2s;AOa zHggA5ypr;wXU|lh{&Z!D`7^gnc}nSJEXtV0Ofs@etYeEP%E~gPY2!%MgSz;(F?s4( zoKsbm1ujsymhNm#WRI{g(GtI?vf2|zXl6A7_$(N+5KUEl$52@QnguM`xvm4+7-&7fcauvI}0Y^O4=sU>`Cd?hBl#dUqhdh#%*0 zKXd`VY;TDHzwmBLfImihcd&PFfPH=a@Ik)?{P=;tto``Gzxv4DLxDa9cKPvk@d3ZX z0eta3f&qLHKgfYU3U>LI5_d{~c~*>RdSe5{vB$=XK6wvr62AD3ZZzBA6;iqJ@Emrh z2SNjMdA%bOdz4m|v{BwV9(e+j_)Q@HLKMI?SRbv;<4hfBQ}^k@i~*VOu0FizJ6S+R zIFXAMCm7Wy7?mdwZRjDMa6=kqRvW;N(a;mZPZvJNqWB~j3A3Je2aq}-*Z-Mx;=fCo zL4N7=Lb}d|Gue<Gg{vVB`tuk~T`UiY0vW!4<|omwAL@ z=!^iUSpf7fX2-eeH-Z?erC#k?Oxa7^!h7t8o2b<=o@(m}Y`r16_GB_sGUAnJj~Y_} zR8b$Hf`B}cP~RoNGC>?w`xMsPxKP-i>iq&SXhFD`;f^r8^q|Nu;=1Uq-BT}7shKwR zagIkC;0w>w%NGF-cV+noh=)fw&I$Xj5lD+yd74NhVb&<#Hq%j)P8*a9bJLXwW8>r- zr2J^y-wn_6v|41=ApUFi=_6*s_(husGhsw}PM%DVQjVk-z{bcZG^Mdjnyj4HEbh`J zxD7zl*-KJMzo71=5s4z|wzwLY1hZnH&s_U0VNgQq)dVL~1+46CAj1o2)5<&e-tQ^2 z$q8^+>{|_P*pUPWH3UjqA;3+mZ3}_zpT9poYIb^lS(=ls&PnQEMAO%kHvQ<33x+Mz|}( zrXJ%YZ8Tlfpp0QI0crXF#&nOoKi*g(c$3&u8C_rNXP9dF2UI6gxrVYcbZ zAGer2;{6er9E2HW7-W9aR)NmZTg*Gh5a~gBjBXO2pI$+RUQj5WLmR) zD+;q_Hp|&{7L;*=0xK*?W#PD*B@+@DSki8Zh6|DSIm+%+HFE;n@#YXEeXmH)#S08u z2~B3NWIQL_jqNq_^kxThy`d`E9Q6WZ?0JT*ojy$aKnIs!jfWZMW<+NeyI<Fq0- zi4Ij^nDQ8Lspty}M#x>AF60&@H00%ZlhDrM@EdA0W+7so;oAtrd3Smq4K_gsdfM_$ z6QoSc=YPC~`m_Ei=f3o8vDi%wbvkj&QYydk^>Y}&=R_dL8M>gRv09Kbwmm^bDf zHOEY^nT)pY(lYTZTsGwv)T^VxN7OnTqIjpt82Wig?JjP`|zyts``d*wg;1*i9A5A$1|> zaVNkkoI*-(5i2O(u)w}+rA%kNiou3k6@MRaA>c!iPmL28gy6a}_7@vr)z%?iHU~XG zEdxAfseQ|>I#$V*DLYx4*YfJMjD36&&H6IR3P$lDddgZ?OntmUn#5$vi1Q`MJ)sPQ{S8{8H`qqZr z<4B~YZHTwWz(k&*!ounLO4M-ik<>Xb`!S1H_sb z3(o2BDML{4nCfc+BYzj8FBdabeQ|NoB2`;6Nw@2fZvd5i?%WyHRYIj=zA`FgdigrY zG!n{akmiRUWdxh|hkAIqwwTFNgT8FR8LaBh*>Y2Cr|`Yol4`g--VtZ$WtidsLaa`j z@#!Px2^RXqpm;Xh-JU(&c&Q4Ms@RgELxxePQOUl`5N<@fQHoKEQS83lkZwc=>NCZ) z>Sjr+{+-{x;E-@ch*6D^0%M^C6`mRl^%JF5#Ak#!$`3sLkm8Q|YfL~`rV%J0eRoy# zBrhxJ>F@px2PRD@_1C=#&^`u=3CFoJo+?rOP^^m+MnQx)yzwMw6e*|NI8VIHxK})= z5?cJBQVcn#;5bn{a#5y8y&DGU2}9Z;3TBp+LwaHn$wXnMoI^+=vt+U~XXK$ZWep*x z_;?%1iKM2WLw6#y1YKf%yh&1Gqy$~E1LRndl3D_cgr=}VT4EDPiga7Rp%kThoDS^~ zR=ib_j(ELXw>IyXm8lc&7_5>l$r`~CS$wn-Tihm12Wx_L+}wpl2TPkS`5-6wajt?r z)iI>1KWS?0l7^qG28EnY5l4~gz6kBlW=ss>e%_cOj__ZZNanjNzwE^}(;`cUOld~! z_NA9@G{X67p?o70zxuJF4Xe}woY!d|nLhA?x| zwm@CnH~oW{{{%@OAvsXm7&VzdjuDYyNJI^W!MpX6dA5NQW~*kDH{o^hc&sjOSCOwr z*ff$yVKlnraU{KNv3LIUuV4Ry1!i~C)we>-il&*1tHePZ66W_ z9>)OY&Xj{69{~6BR^OnSyCbS<_72hjI$!?+cqj9PR@oWs zuqz&FufDN0cL!G8yq!ItJ^;FT;lKO%dGimB#NOT+U%o>&`$Sab7+##LzJWID^)A!b z{iU}4#M15&wCNcdxk32C)281)fQR@FtK#1~nEC0hV|(@w>^S;%;)eNe?`8l#(LdSw zz5@HdMdQBnMx_Bg;t??nP{1$(0gwFwkB5@swLw>@2GtOoKUSd(DloLQ7^(N@42xFP zL%fe5s1ekND*Km_tW}LG!0@FJ=?2tj`OXoRft8p2V#P=ngBobWSECAOUo`yfNt@MB z>z9d|+rzRD4Q#As3AMFHmlgMK#s-Jy_uObi!_gv!qD&a_OO(L+celN{U9T>%R&k-= zl;$_l<>g#NVsO)W zUc}vUOyV$ec%!_)lCrJ=SsI7*d}*7ql#UqPIWgeLibS!jd~%yQ$@Ad$BdS3)AGoyc;OxR%32 z5Q`*qUI+oNUQ3)HH)4zdwTDoY@UG9G<`I~>EGZ?G=jmFyp+Z`W6J!dF`O9@#*c`nY z4R={+nZiSfBj@=lHh2Me50jWE^Azh0dITo8VDkEuB3|?S6jrR?SR7ojD6Ei|=?@50 ztv-bQ#%Di^BU?#~EphxZ{PAVipLi~DI|*ymPU5mwxk61d7Fa8tPGCtctd)cVufiXY zEqQcM-hrBML=Z0=B!KbV@9xi6QM}erPK^BrcCG0HPMe3TbjT7mT83_S|2x{zyr6hh z&L9s0w*%k^xA5tGOp2{yfgIMfroE`%{jCwSPy zbx?85*Nk=cN)(EeY8~4BIt~;{q-t?QOeirBdeRPXzqOW(xD`U4_I!Z2!*4_1;I41# zoHSxrski>xwlL!2F$--OSt)?QVbtBZIVfj;O}W3dDAaGBx5NO65-diuu^gf!dka-6 zHjPq}%@7c-B>HkK@S$kSNm}963F-xwwP#RTW~?BM0X$5zgchq)#}R|&WWgnFLB2{%UoBzmTZMP#4vlalF~lqrDq=6 z8Tg+!U&7P@p$IaVia|kpuA{{Dxsh?2nS@s=NI10>O3fA#%h_8bhLaf$(*8SG3rU;%Vlxn6G zbFq*LRTy@;sJjbeWI>htZJ4=7G^G9k>+a`*jqE`dkCxaVmJ|^kpY$M+N?1$+5Es9K zFq+%U3azi&Daa9(hcuKfGMFPTCE2%TNTE8NH@MJz46rETeaFb_AP~yq|8pBB8<><> zIjx4gG_qfo7DIpn+!60#M8%T~WO_6oqAP~=fZjrv+J#;XM@)=-|Fy)*myM!Mc3QIq z4i1eH4BlVHV3GJYrL~CF%xVkRcmYffcHC>hZ7RQzV%3<6I_@n{GB8DDyIF5h@6Wy_ z$TjnYvoX--$s%tq`Ckg1_;@&^qZppU8&!@(gJ$5AX1(gM8gZgs@zS{583D>u=%-u+ z-xikD1yiZpm|r6%ykl-EGN-sF{K-Q&2QCo-Yc^ekFQHn{?g#IY{7j7NKJ!v{7>notV+mi8i_l?l=;Uqhs8+v_o#S!!~v&dbRxQ!DIFq z=v@Vv!86dcw5KGj+f(7YK_V3`Y~wR_RHS1ZU4 zxLnF~81jDLSeaCAK1N>>8u;dhz;Pr^j^yxHmk|W!iB(jn%Z+C|I6G z$cXktfS%-}Wj{L$l3@d>n)1VzDkoXD+cC~}1DLegzX|+u$`WsYn|pIfcQX+9Gh~g9 zrS?At+^Df-$Oq~qvtQ?zOclMw9-lDl#vV~-mq+Z=IJu>nrXiE*ON|l+W)1Xt*xHDh z84XEVo^j_&{>ErK80{KvQ|2olwUD?C`6#7LV|M#Q(59aHVoxg!=fhs zhIT9j^|sDsHlea(QKJtEbY($v7We6fkF-xOFXPVmh1MrJZwLjp1=*L|W<~^<1fTT~ z@)~BhezC1CdJGw!N*<&j>l5W4Tq|S9rx)|DmpQ+?36G3XAH`4#lSa24F!{ zZ$|U{Vt)O2s3f=mO|=J?!C0SetK=_IzYRM-TNx<^Bk=pktZp1i#O=Mt5g;z`I;pDl zd`>6JIKf~3PIOu`m2lixXPvSc=TW%8wfh;1OGEoPc|JJt@N9RYLEQk&1+XTd2IFzu z3>@4?F&fA9W~Y1Qn>)-YyH>y#<4ST9H8GP-(~OoFP9_2gyHIRH6$LG}a(IShRY#S~ z-y=Mb&f-4lnRAW0P(T&X#qAzR-6&*gt3h6`nQpZqd+(v}m-NxQ9qwI|m+yBWGeE^r z$z%wThFCUGfK%0zQJL6dQzAfT#(y=7zQ7}MV;;RWP+4)q3{`FcwPrbcEc8`TuS6N7 zeL&c$drw0$qyd?!2Iex}!1-7pbWOp*-s1}9UX@sW#Z=mIfzskAO9*5QC-7TEOZ;nNqX!=8uqZKaD7*i2$M18h#5IolK_otrQNk z%@zwS=ha0!B@MI9kwx1STd_8SYHP2hVR1uiXWiyzoE{53F-3P}vJtH2*V%A1XJu8@ zso%1%abj_!lY12nw_BtPyX;nGXets zFk<(CkB(UA7;{NQ&$|&~FRXGfv#|Lar{wKR%7w^U(oBxk5@T^kR6#`kq8XNCP9^rQ zlGd#MQ^ewd?430{znWmUfaT5IrENSCbQ(1rV|>Bn(l%V(yPRaSOBJmfU8TNvfaOA~ z)D1`3gH@J2d;0kZ7~K`38w<7t;I$S_aj%8a4SD?%*_PTb2VsQWim^zFyC0|&+DYvC zxZ8E3!Q;+yZwLcQ$$-t-l{S!&Atlj#5{UcK=TCF5zbpDVS4PT%C7p5vPVrw-iX|=Y*0nl@R(U=*$t0-bm*zLf^%obm%yk8%+BMw=g3>9wd zxN_i*v~;|fN+>fC8|AjvyjhOdxS&=Jt7;EoG&=iHZ{oeTptoObbmLm7J4JlQNgzMqt~cQ;ufKr>8Zt*Qn9PeZAZ* zwWsG1`IAInf>jS2YG9!n5qjVrg{sK-Y8y4D0-A;M{+vSp#e@2-HBq0ajh_V^*UCrN zJ)q>^Z_+C-^7YKJkpvg_$mxN0x90Ili5piKj6=rt~{bq2hgq3C)rC0S^{W}!UOw~8ek59uYPOlN3VX1>Q|$3tLj(da_5~C zPy^^y74Y+?`~uAZ_`m|yhkpSB-GO*%g6f96y+H9|-ql9&qTby=`S9qqQ@F(j?2+uV z1M}(#xB>7g3Ah3JKm+YTz5V&wrPr1E1=nw;o^QXZzxQH@UN534ETV+4~nq7K;ul#@QjedSwbzndxZNA77f-(&_1kB_Z-G93kPl+@ z?(fwfxyJ9KcX{2{FXo@Gn@Kl43b)XHzGb`mfL~1kzQ8XnP+z#aJJc_ty}k;!KVt;R zK3}j8bkJ|q+Z~h-*WPc1TYkWA>Ar8UkDu8C`t3K$2hwf=Tk#9HsY)MAt$3eaFCQp6 z0G*0GqCrmpuwNu@Rb$y?#k^j}G8oQsBp7faGAqC~nr{(v9vZH{a5EI8!X zl_4t+wA+pC{*WE4k^^>Ubl3X2IOIFWoz4rzolm@DFFO!})M>|VwC5>PB2s;0@-pJb zd#T4dKs<*$xdhW?25Glr#<4`7ceNxRNP^dD`k=H|V;q~{x5FtV7}M14cQT4DU_*6b zMOf%eJ1|HW#}EzW<*#4a#G==h_#u|~dkf3f_Kw-brps=vqr-@mJy(!zS?wMLqZDsY>S@G1A-x@+K>Q#s^h&nK0+ofO zUF!ZJYANlT{e`K0<1%kTeLTSDX_8Vqa-t@oJE&sLlmFmc)SNvD^c~8y1U$Vgq))KL z0E%+7kcGYAmy)XJgEnpE%U*mO(OJ>Trb#c7Zg8^9y*Lv2;G{YqKZsP-W2LP;X6p_j zS%o{CF0T1=7-AYFWiH7%Sel0zsIuoWveSqAtw52ig(7{%`KTjTm)ITe0{G(*J##hlXX~;l5?m=uk0R98Rux1&Q%4SKr0HRC&!Ug;pjBLxJ_Yd z6(OoMZb^5Bc%1V}Nxac57esb2|(kP~dY;MBj!3 zme(IW3Ru1zyOG;*8q0OS_YWM+Yqn>iS@%?s)uD*Cq2#t9r__^L^m-&rw_|2k>{Gr( z>h7t{O*B_8SOwnSRL6RW3!4LN`yKsJH&QKqieYvz``9zcJCW%4JCVCixOpiEJi6k3 zpw0~%pftZa4LmC{hG1$r;ArS3283Me0YD3!WYWX4kG>JbmANwu9Zj6y1Ln*qM>F1IHIPlDa`&ck%MYYN zT26}4884^5)=k??@)}Hb^rb!@GMX_>q*7uf4?9U3f6S*oh3YhW0a(B08b$7;ufijr z)PWAi9BQduIMP>$8)$kTsw6MXWlm7VTWQ*ic2wr3n#BfgWRD&+pYEqDDbC^*{Kjl7 zFi->VQJaj9nI>A)Q&v!B5oc@1^n%0SksM!BmikmSWGu~voCeTNx$iZk9=lM%$B38IbQ%>!G~x###R=@{Y3x6kX+bC_|E$4608IdWlH^olOdR$vK1? zjTR@Skh3R(CHTqG89l+?v0-L$SYBMg1eMFRu!d3m!&eSd(c!)OLJV4t1h+j2ypy;1aka3F^f;1L%gv$ z_5&jA*Hb{MTbx%Or!{{d?NiOY{q;tb_V@Eiuvr(!#JpqS>-o19GYEb(t zFOh0sqMBmz!XxwvAskz%nqHw!(1}~eO}#ICw^!2Iufl_718v`E8W?Fy=pLT57EpaP z$O{4^WU$wj*$YzgAeCc(A%)5@tSR92gZ?~)JrD(P7>1})P?gZEV1?yIQ-`x+|hF@JN!s3bE zk=!9AMhpx)SgMX+sGvp2^PA8a#f=z{qM)J`OF}Dg;KokawqZf1wrG>%*}?Nd>E8y60h>GI-Q!I$9mISA7b~H zYJ=3^qn+R@w`<9GN!s^*{G8uwuaqq}m()*@f*nu%@(e#He3SuhFz&SmOVusTL|TeZ zLRZpBq^3eoi4D{&nz-sc1#Xi{;eECB%Dy1vw_~cT zya_&$)=>DKitLlQQjqh9kQ*=qGo%s}+OVdAf|nvfDQZ3Vde8%H^8tt96O8iNE0V>t zyQ;N(h$~#Xvb_68Y$P$mCRipfRVL=8W>P3MeKk%RaSD&j zsc^M=vVZlALyB)qlp`}HCTZvx#;k8p(?Tr5_kRx6d&va{41UN*oIgA8=>N;eM8w_J z(8khO#?sbG#?H{>e<5+vYF6slE2vxO(JUTOu+6|BSjZV9um%FZudr5JBx+&UG$2Nh zUgp4Y3mIV~nC~ruWYfhn3S&EWYV`lmyPUUMaaNjC9UHgD5AVw4G!(%y7O>A5GZte}elByat@?prtv}j+u z$YgA?Bk5vHnL0+Z{^7AX(Pb*&2p4@eOK6T(J4T?@+^Ewv0Am>im-kH6aZQG+IfJKd zUz@x_z4|taX@0!8hhVn7475cW>ZQ5T?l^^P%E7Ppz-#I5DxTF?-I_`aXXLN!j+raS zlWkDe-gbSGHl?-`re5+Cai{4D-Q@-HY4^$+=K`~IvYq?0+g1U9o_xBqDU&iS8Y#{j z%RO{)3qAcBA+HMx9wh`dLx$|px_I60A=1xPFdwclww1--e)}tma zUUg-n3Oo7Xo;`uBEm_et*FOo+9|I3 zA7If(k!}oou59NDy=|-p)6!;G6P!fCwL02gY*!niz_Gizy#p7!#aU8KIxf6BR5D4l z^3HCL9@|tC!7=8rA9%h$w32N0Tc9rs0|;?V3t->=9M}&~dMr0cdTcjPWiY)VD=;R9 zzg*i4w`AK)x6M4SF+6Fa)4d(@FX}H%G0!la^nH(CryFFm^>ALlZ0E)s472z}5dC#8 z$Q_`wJ*!+|*V%4jdaq%(m7vvp!qExixtPi2n@(l+}l-GfWk*?Ug!p&PqQ zlEk1u=PT|9nh!-)>Rua%Dxcy?zeC^e+$Z2uYr^D~2Q$w$SLd`ct8Vs9E!&Mhod9C- zsA2J%vVVv33w~V4Y5%N#rc=;ZDj3#F8`W|@b>#JRZxgF8`z>a-^GAC<`$5Jo7@TCy zron>W(vV-j*yYteH?W6)uc1l2oAtD?u|@DY-^(|!Gxq)qtS#dn*sYe1U*vTUtS!_* zKhVqXULcSM0yw>sYw;s0-FOjlT5N~h;teKGI!EALM-y)!;{;}S_Ewp1r?Gr(|AeDI zl$p#9;RwS=ke~4AhREFAY{e#sKWMup0^<9Tw<2u2kgIUhHq=WP9kCBdI5F{}d7Tkw z1X7?1Pt_8>LYXLLq*X%Uj^kU5iX$8al{>@j5(VAgg~g83?IS6=L$qUq=7m;k%Pjn>`kpI_;aST*U3QiP$;?g6)Qx3Sp&faoGQOin_L=Op$mQny^n7s`oRJ@E|i3wY3yTT+Re+G@N){ zfM4?WPB5Tkh`qXYszvCdznW~lV2?YEnzqXz39goVj|o!f>b~&b#J57%FKSFgSqTW( zDxv_nyaH{JIq@gH{#S&P10ux|QFfPICS_P@oxg>lX^)u0mSmVDv_es<6&87ALXG*9 zcepp5#b+-?Cg6j~hpXi*m-zT}OFcXG)r^PMy?>HJkbYZq{l4i!&607TPw4E~OPEFK zh386An1h|e;Eh;&Q!hbo!nZ-S@lE&+q<%&`Do;AFLuH@(&tfIWmoy&u12?7l!SxCK zmtrMq>uh7{@K5cvth3WUKP3!pO{`5F{u6Rqq@+nNEQrDDsNJsnYo`nxekmy8NH8q7 zj+Hd%(R)1x%ho);L&GOI2m;>651+I<4MLBnG&JqTYa{JpYI5U!g4)mYaQ?Jc0_t~^ z8AHe&2pLkUi3D2^c{&dY3^nQ%d*t?%=>j#Ft00Be5L(T}ZgXove)6q5MH5$)kkxbB zFSmYv4dYXt6sZtwn2J{iZIlMp5I0G73E^g-+xjEyd}hcg#ynd`|QGj@7h9l7Q(r5ykZ;M*6@oRDO$75A5%3U?#7-QPRwQpXGjw z%ovdo9L`D+iN>+yArF=UjiNZn8w9tBb38Xw2z#=V`pXin=I`6I9?EWLfa#tB(wvk2 zGK=FR5KFB-P3RWsuA=AZ9pfcN8({Zd|FuTiVO|zm`JLb~tHhni$U88)PG@F*KD-M4 zf0`B7fA^)&|8Po~e|i#*|ECcDkDxmwYdp|Xqdq{*!Qika@gk?)soyS7Cl%IHWEsrMRhDjL2#NSrc zBEKQLatZ}Z;0?T*>!cUyoKjNw!1Z&xj1@?a$KMP0A_ElA>I##<6ZP5*B!h0hQ+oE_ zxo$ZARux-H(E#m8KdPw4Mue;ck#;(V7!YZa`FEiQP)$B@;9=4Dmu|Q$lwr9OhBCZ< zM@1$2A94(-GGYBdOBa8jrS3EgG>^Fu10Syq7|YW+EE{X?unD8T!uIk*L}@HFh9e%U z##dl$hA3}w*r%Xqkzox+ZY8Rjd!qRj9bVOtGrDLYWX1NH(v4fI`EB3O0@{SK4bNG! zDXIRp&px~Yi6Wd$VoJL+k!ixoE_@3B=gr>~z$;P$YX+KJ#nW~v-^oMZ5Nk;Jil5Rh zJ~9f0&UWYDX!3Xm-Fikq8ij3B0Wskr${ZkVg={>T>f|v8Al~bc?m%c_0r4|d8aN5} zVcf+a+x4DIDT^}Eqs4Z+g9qaZ`^Gj=lGFzHr6;7Wtmh#+jd$-~ zb!RKna(5h-2*|rIPoiGc@Iu#H6o+$nZVmbex^5lQ$rCBOg^2mZHybCKr zYe4&fDFS`!k>lll^tX!COYs3Bcylj#X|^TK2KXkf+DH13K7z=ffL{~`SvJ6guzyya zj;FWVo--Yvr>Apz_g{!f*T9ZV;elQNQt_N(_rDxS4n5NMr*L&R|;8!eWF&Z|jsCzcI5u(}t@m3C2k)BGtKiRO`@Q8WL{oBU2{Y%|=%yPB=z~3n=Nep4V zWwT7HpBhOMolpza_L^akd17LXmTDFm5Llbc`g#eHn=q@mqo9?^uy^r21X)7cT2eng zg!THjwn8-L$Zu_sM3!Yri=?M?BV#*tgx{TGRbYlB&wex0$QV5kzg*Y&^;+ zg;b2*Vvx)monx3G@={!RCi#U%Fp=EO1+(@tN5><>WvZ$fvV$^9(fygm`BdeWf8I zT-m#2F`zU^ZH_t9BxPD%5!Q-m99GT1Mn63Q4F{V6r6ACu&ll+NS2kIG-bUqQoME#sO8e zY}?CI63nx1T^`ez46t5%MQuneT*T7+c_y z43D!IY9oGhQ5aR8bK;KtyiPX`S3hJhsVwVTU>;mzQHx)kMq)*M+M0Q?^i2Y=Bgv~ zMbF|J?R@-O(fCI){Q0Q6%J}IEI(`!3zuB^6ERBT!QxP7mv?etmfWlkQBx$^P-fgF< zg%1+|FC_XWARh#^yjwnjP)-s#O-7eb+DpOf7WjkWj;#4DHwF`$_Jw}KQW_W^2 z1>qv6UClU3NxuSzg?M)IZxPpbiin`{U>-@3zIyD6UP!wP!Bdjw za5UPIp)QU#N1e6Oq;8xFnB!`6mtS?~zqQ@>1&Sr1${ZTT>{?-=Kf%y!XbjhSBcfFk zty3v5G>kRA^{GPkSW=PiDeUF2W%n#Yj`+PUFa=fTHX*30uQAoelX9w-YFd$e#D!^P zKNT)>aCI#(nW7%7+$o$|%Ds2giSpK6e9|=3or?Fd&!APEd$3EbNDFec^7J{M)xTHs zQ5h`wF|L4RqilH}=LN#+AURDi*Se$0YeO#|0J2`AaE1u7o=O0ODdJhfueeeqviP2u zJtDehMtSpZ2&JEJjpJF2H8+1p{b>rDGKL#S{rWe8`9FfZo_HBM@)P8?pCA+cmnYso zg8Z)@z*|YzZh--X_j*3W$=|yc&{Ws3@_paGlYkHqNES6gO%*plF}!44wsSvzUGXyU zO8l;W0zu+-I#x(01qvYnZLF=E{UqDb_7b1J#|!utfm`*Z^j)JSKgh$6+Ct?wxU0AI zOY4bo0wD*5igl4%2qBM()L~U3HZesNPm?b!mT|R1$r!0~fG4YcDicbct;y6xbwWtEd*e1?sE{9nUAtGTz<}?}6br|W- zud&HlpZLRm1n>fnE7iP8oXBjJ_?PFT`Q#bv8vVu7`Ic}Fz6lV?L~rw9Ghr-On9(hgr{0t>o3oJoM@=g0c>mugXx!t`_Svn_iWqTG}ZY-Wi@+B-EPtt zv`VcRk7EwqesQj=dH+|C{m(H_{^zEIf1QP3r3tx>pEOTM9b^pgn|S{$$I>t$tOFVZn@jQ! zb`Lum#7qmv;l|=d`HC0;0#WKXDJb7&R4kP$nl!r3JaD{ebL6$_(f0vb9o7N`POVqy zbHZdsi{P40Pi1DbGX#t@rD06`kp6zW4Ko~*Ryh^pPd7X)Zm}fOs`ed9vT&=fZf)N( ztrd!MMjVi`>GBQv{f7lacqyTdHbwRr3126qh&Db(^1Dl~0^yWd^_=k37*n!Mr9qP6;lO#}Hj3ad z!{0J9yGFId+hIo5-?HefrSAA+;E3`ITRjl`%1m(I1CO7atNAC2c`5x21))MEM26VH zgD}YH1*Iu>04^yP<&7y0Ewz1Tr6@%Bjx{7(OnB1leqm8>5-o{hx)%nTh`E6 zURmQO<_?Aq?*ID+aHh1NfbwOloxv7Vb-AnbrwAqQ8hRJVv@SKDSrz1at2hM-0+Ot3 zwBQBgYly#hH0mET_UsIz0+h^OX7QVz*PJ`gS){LD2N&!Bu6339sKii8R6-chgtR-x z_rHaQey#va?3qKf9UQqsxT%IV6NcZR@JcQEg+XIcWEe$CWH%mj7@Ue9WxxE*X>3!N zL3dcM?ic4zp@c~;5UB}Bt@Ij4<7aULwW&8*kG=*m?$~8w4Mkix9fsF` z2;9W*OKq&x{Et!xR1GwrIN7*KvMfQ!T)?ST0B{eOK`!rqVD~rh7fCpV2y! ztKDt3P$`DzICBNg$|Dh|kU1H~5ZY#OhMnEBYXmaq%sPGE^D7#+ZFNZ}+=8g3%`m_E z%34D-7y^|(5%~#Ott4`z^DZjC)*>vEf~aH5sH@rsq)lYCmS)EaLrUC=4Z#|q>amU) zY77JiP-&Pbf+GweW)^O79!Lz0wu<(zxvrA~GDAo^XBh}^#m~nbzrm2(VwdB>crkjH^np#gFv9j!?XRO30JTRzXd0 z(*ZVT1{YM8sbzm~VQ@_sc)I#$#kajZ$B4eo3GrjQ2P4J_LzmNBIW$JjYD>nF!uNI0 zG6lhTjPD@KMp1ye%u`AFABNC5fipmP%t{kDEQL-S;+EWXc>rk_c17WHh*?}A?1>x# zq|7_v6L^T2h=-kpzaTEweJT%&5EMqQu0z%ZVsHZ=Pg5aPBjTTm{w{Vgt)(SE3|k#P|9C))2&Val`KhWH_ABX zxZgCF+uL~3=>iU8!C*0qY8)gbl(b`r)b?kr2)Pi1gk@?e9iVJD9Zq)ikojs>jaM&1 zm=et?}d2lX-GAngoky(oINHtiG>|Gxabp5jK}Vbe)KN%0 z$!xV+Dy`QXQtBK0Z(5~=54zM*OWkWssNKx^e_xfIp9fs&*P)FkHp;q*R(LJlw@uMCRG;8F{NQZ!16?6v{T=dqe^Zu|cjd&l5j zqG-)Kwr$(CZQHhOnLHyjA_7yFYa8{<8L3Yd`Dx zon@e(^h%xhwpMh^DhZ#ymZpQ+)E;W_IwHiC@1YVRSOI#JqQ!nCL^xoGFg&vHaC zsBIPhN=%jM*Dsoiu9T`jFqd2b^=<9$w0alqtF7w7!d8^VOJHX+8v~&LDGEI${2Lja zKZ7|0j_Tkyl*vWn&?DYJHj~P%VKU$0t>T)vt7WoW^CsT23k8#B1vHC|oSqQ?!{Qn| z9A@B!v+X_G0ZRb-hbK#_Bxg5M3!IZ+S?OI>*C9J4ZIBl88xJT!Cwc#aY*E z?it(4c0Ylu)t|9~cB`Sl^6-nyboHSbyP^i&L$bR>9gVjo;-f(Ly#A|*)}NINBE1VjdYjqKLdR(x-IgsBN!?-Pdo-0O zYh*9pG_K`|w1>ohu&f?N+zgRQO&98`V09W*Y`XfosCl*-Pd?Amab+FEy;JSvn_|sq zd6SsO78G|VTF!*?S}n~Ed%g3%W8>qFQMUMkN~<5u`g&DSaw8&xMR_nsCD`Tj+MQ?1 ze~pY$U3c^~C-c@=FS#9z-oa-PA*c4z{ESQWjw4A6qwZx$kkU;Ux2ziFyuBUcbI(q& z9r-jeA-Z49&qH1oUO&w&@4d5om@7Xdt;-odk!A{<*24b1pzR3kVwp(oyXuwA)8!S6 z!zyRamP87VRAXZ6;GPU)4mHX%TQODDU=Oobs>&!_&f1CC#x4~idM+UmE+%K+4l>Ta zLXAC2O6dhgrE|EV*0I@cjTA+CSPKN1Hwu!769`e4~&xfTc`u!kU`CqP(>(*ZDW2@W4pE;pFOM+ah;|-L1yT4aD|g zB6z4E9!K%B{`M*53wFTYPl)%g`r3@x#Fy>gj)y(k%MHInK&fpM0WG0V6`f~hdp%CU z>^NmhXtd|e#lW^ck?-(2n`IZIlLAE-h_#KC{t-xdhu3Jzmhn*^IGUdrP@#M{U7O+3*F8HG;s06V({!!1?mTk@}+WBfRtE-+uB zI}`PzNs)uwT-d;r;B$!J%)A#MiqEfiA-#pNPsYE^7;h%MK!fFl4@7tRYJQqJVcwN80&(gQAS<5a>@D`lJ$dT{w6ZbFZuQkD0lgQ(*K=!YtG{OYyL0O8@B{s z;(*FC=h>ISmf$V=pE6(;s!;Pk-r8^d+qsp5UhN&xEz0kDYPicl~eAF zJR?R+4~u&{ux(0S+0m>SZ|WL(8pIB6M7Op7y}RusVdcmY5-;%p*!g%X@3Q2o3ICax zB*oY>Yv9>mIL#m7-{F&ZB`1v<#UHRdri|RPw543US9MGK_;@DgQ?Ly42`bDYb4!c2 zZ4}up#G89bk6UR$A((%G#H!%$F`I~W;AAE29H_zP+2tlaZ~05)XTrgAH$@&r*LkJg zOD~?Y>%|Q9$>HuHV{#tDKLZlM5!jkPGfoYH~9QjjHd>Aih@q%3mUBM50zLTg$r2XWgoph5P<^U)ceo zP)@xO8j6ccyitNnG<%5IW40J&qCCJk9<>u5Ld9mmAors-mX?4`57k26X$X;u?pz{T z9`VtS2!RiNYKyCog54>{YA3UkT{VW{o0H%2o|r?Iy}UQ{8rrpBNb<1TnwB5$!1lXO zuV&tqIxTP4V7Rb;qS#@b0OU8bY_1-+Gc4!N|2up{5#=*q>k7N|6SO3gNlPw4M*+`o zl3_%t;cLkcNC!OIIcQ?2EVPaug8!KI-okCcC+i?}|jM?kH%x)qFq?E4d)N*tJ(e_wf z&!AQr?GwS~@~hausyzg2ALflo?2!5eVu$7h;YR=qEJ*VL{fy1?7kYDgW7%~u3?zZy zX1>dIiVj)3thT-iJ2rqU;j%Y^J4`o)1zaBv6+D#q|7;v(np9Hcl)>vG1( z+;gBv*|ff}W2!9KgjMZeny=w5d{vU6+0wh-|rwkJ{Fg_a?+Qt(j|7Wu$f0Uk}w7_>t+3TvRYwG=`qSq zaV`+YiD6v|K0^Ppy`&T5k4GbZH@{Wz*kb9hrQc+Ta?=8%_A%+BZFNJ zwN0gtZZAkGH&}z?CD)C}Pko}#C&VHRjlUiu{f)ngvki@_ZEz@41f|DP%z}zZF^hSV zQN(2(TFK=0eoK=*yc1&i!kRzR>v$wO^?i;J>zwv3KXKqB%rlhZv*8urL+Mi{t=ypY zfU3pF{ppw=m_751Krs-3Id9D$A@$rkOlCg8SWr|3MZ+X^6!a!tCDpkLyT?r;mcl7- z-mqeTDpCN1vd1B3bY?K<7viJlKeOsw61mB2_@hXia#9cjONic6&tFlN5OrAS7w=FH z%3|WT(aTpXhS-8Yb&B42GATgJ@Ao{Q`@^76ZjE=omM(Jo;%40!TigZX2p zy?0S&VADvPkdQS>1@SkW{~lwYVpKzwg)-dDuj!@Ud@j85whphh4);83;}l+#Gnlx9 zOCUa#Q272Y-B;qmPZjK+fH(c)G5X(8m=sNHMCHxhtQ^h6%w0`gteyUE3X_JtDy}+O z0K-~u^Bo{LJ!C?*CPJwjqe(*;O~fRWSS`frT(*xcqp@?%+=EjqAgLg?$-VsYWsqoiBvSW8BgQzCip@9uo35*(yw$Ndqf9?Gv(!1QHK_FJw^?#r%Y^keA}ZgoW$tk zS;Xg~!4}7ds2~!2$)NnofNib)CAx-q;kBp91NmI0 zpOcf~{3KX~WfiOn#xH@n(Tdq$d?Ih)rxdpn9ZO=0=sW2glOLz)Mj{`%5iSXZzllENIi?&Qdi0fqD~^UNMaMf=G7p>)v z->FF*Pkm&uFQq<5Z{DBuNvjQOE{!8|F?*JU945=>%f9$zx}B;)Y(iT>{%n*hY&YSz;M#Lq_@ zkvGHtm0|tINdOE_>K~7v?5YIgzeg1Pe+HcY%(Ln;-aT<8(Z>gD`|Ql+bHx-)Ih}La z(6p;cxWKYU>O&8>n($teCY)_M7Hd~*brV{D1asdFJ}zD!1PaU zH8|h8GxQIR!ome64FsgbIyygZ$h{+U^iS1gbiNQMeg!}Y?(Pw~{6l95K$E}_Jl?0& z>%|#T6#cQD-L2Z+%uUiPq>x*fc(!a68Kj!?qG4ud@{tHmRzf_*R8bhNOU5gK4iEdO@!M=wAi-`mDn0F|*8jgAy|*2bsaiCciDWmV8l3$|-* zK|*-8BBR#r?*#>E+uB;MGLg2qlyGQ1D}6j00FccuuiE%6GT#c&HYL%QO1WaDZ!m|S znt0B#_zS?2ZF~>EIqE!y8!_Wz+=}#SvE6&hNGHZ zZius-E>=1}sP4pyQUW)F4q~!1czqlvT->GLl95#)zH1-$z`+-d_}o}==`Aj zTI`@aoQm8XYdXX$rrturmXnv2*0kpSJkCMh+H&Cg5GUvB_VA)*(VC_=53~1gQ6Z*1 zt*itzR(I3%ISrc7+vH0`QzeF2IKt2S?j-B(muZ{I#^-juVch|EBktkZCmj5 zC|)kIW6{Q}s0*NQ4%iqI{nQ!NBH|%K@VoCmIoO( zzI>7-99Z~R7ot23KZd6jpT%N{*YU@e3DzDa^YeFbs5jF3=)Fy`hQ27Vw1w=mGQBAY zzX$H?)qMeqd26ig5$h{BR;m}q@0$q*d;Cy~H1XwiEWFaUS>7{Mi>QJiPbE^=Jy^7% zL}!CXJisE-89$9B(b+mFYDiS-2@XelP&xe-~DqA+o?8RZLr#;YZ=yGs*79>%xKCN+SMBC@66+h0;IO;x1HtWadAf*378 zAL*r86Q=+ZV-uKx242BTl;Iy{^QA$kE9wso@2L4FvFq@>>;wC4M}*Y!G_X-9f(C1d z+tH}g2UFD(f}#p%EQ-@fmfdOJAqYP8Vf@fT{13DV?b<@Cxu%Q~`l;h6ctA+$UtSe_ zw#mQ^EgHL6cAsc#G7kVUulS@F8;Rd%kt-cO>CQL}$n?`2-sov>OEwZtcmuH)CfRjm z91(K4eT-zLh2Fa{BqgefSmX13E}7Umj)4z2@ezC_I$c3*nr9P9GCRXxRedj}uvn9l zP?kCGM9R{v#0m53&hWaFI+IKJ)|ooa#=7-wOFbTsUF9SouY;*d0&d41A^jxYYjK}# z@%5`;3OuFviw9{Ps}S~zEXsHzJchKuo@%^@;4qb#`s0n_BIix=1fpYt6t{h?76q5t zbt(2e{BVA2qclAcx^i`>3O;f?r^ROKTz|yfc~8|b+4q%5lh0gM%+h+wsbu^`whVxa zqshf&tm+Yd+=V-TfH8q0QGv}7FMn-rSNKOOZc5P-r#{f5q_?j4eHV@vfy!^GtAG53 zhc0W!`rI=*sbg>q&A+VCYkC^8z1m2=SAqBKjo|m|ZT5LRrE`n*Oi>ko@%0F<`pgXv z+13L=%Mf&UJ<7oUxI*F5>2I-R8SLSzf|ZS^x6T#miPmV!^k^rM*i|^kP?h)`^-5tM zVb;F)X%VWGwz9+qph#(i9N)TRi@RvGrHq1LAE!Bg?db%zw0v1~1#mRQ;is-f;mT6@ zD1U1^7fvlkiIy2E{(;ihT-)J@huw8j5d-K6B==w$BV<}K{z=3;H)?q>df zKwt8HrZ6@nkosbeGL%H1or9DxMHUt_Bkzc)>BG?QdNQ#@g8>xwDKITu#mys0W;ox) z0rmh_6a~Qt$Op-`JbhXOE|=JOZi0A^=k2_#KGN5Qf$ta8-*nY9E?${p1mNhPFEW{F zWDG@>$=d4H`$-*Uuq_PJ5n6X`OgZy`A+m9fqfPkZoX!_a4@a`EZGPVG+Q!r! zef_VQ!i?Mw>Ky^xl{(!kH+}{Swi2Va1}En|kX`UA+=ul$T6g{{n|1Gg`NZu;>*WIz zOsUlPSdtMAISKunH?J=KfdxJHsI7^~u1{R{nk@DP^(!7-J@ywmY%W!YYH+sWPV%>S za5P`83#9uLz@Zwg_E*Pr!}nbAJLe1|=fZe!e_~AEA%1|hRdZU{#aTDs1PJGC4A+6TPlmMQ_b5w?q+vs>gp z5SZZ~2uyl{)G}uGJkH{j`xFXzQ6*ZU?mL`oR`mVxw&790_CCAA&#w9dSqa_K=x`%J z$qBKG*b%$T6Lr(;jtgCbY_HMq!sbhF$D#S`SFvm&MWlqAl+aTgV2XF$w^8>INpKNKYYNIZ}mdJ z$p*I%X)LhxYX}{l@IVq?@m6kFk%{dBrh%llVih&f%x!a#DIOahkL-Qz-b~!)eHOqH z_oWDc10_}|zIXMG-zHIUa4UXL$-JTw0z7NnN(b}_&7jn4yiyR`_}q(KS`5RRYw)`3 zHTXBns?>#7Y>-(%&XlcH;8=7H!^(#t)pTwm0q7roJ_F-+33FMqf06pw#FVJ znnYbN@uL?OO2%1GQW}Q#i6lNkBxSGxM4^PxTkKFUSJ5O+US(X_1xBcd`k2?lrT^Xr zxxz!6fcvzR)KVrZ3dB$Ln~3;uBQ?d zDpJ+h&}BzOPp)@Ka?&1XqhgQf-}*893*z`l`rzzKr5rbKxXx|3VB>6_0})$_1$z5U(fn1%lLoX}vk^dMKef zW4cCP*p4J1JB~B{kV`;5@U;zXY~QvXoe~`ij2Uv7<`pspard?qkSR8xHUCPycvnCz zc??NflJNP=rRnX3 zI*$Hb=e}lQ54UQB%M_tR117O&#VwbM6D<4!WM|40#%1em4+fY_(*UbD%}RcdYGC6} zesEZSkOGXfO2EVS0oclZz%rgboc!M>JD)YkK|cSS@3afx6z%K1HvQ9hfqeUP2cO+*3-iZ?eYass1=3vvR(#e!2Uh%B#oh=Q|L zh|I4bDU5d=jOu$+UR+X#$X`!X&;3I{iQqR}j9jy!4J@xZNFAoxf50hTf%*x4qr!aj zxR{#$R9`r(aQvw9Hfy!{W!IlgroISnG)g8gAoyENeSLg)PaY2!%DcE1CjxSHftEv3 znU^p)qVGM5)|RbNNm7y?^4Z?@(EOTq3g;Tz2E_w zgUNF`n4q|_@N`YKuW2!lfK6supH8PpCjW7Dt%N z0$$I#$>jk1I1t?}N1NLP{`Ig`FSS=RJH*jrsP67e+cal;kyy%UX>eYV_XhMx7;^KZ zBjO@L>OS3qi4$jluiBu=&n&6mzvf2))bRL_L09CZNG9F5Nda&sGedb z^KTnx8=rhZBe%VW-&-swFf004W*e`U-$*1+JsxpgQfegrjMbGYo2V_aGd3Z()c@`7 zeS}5lBJ~(cx$`RY89kz{k}r3)0K%-=p?`zX*+kONrG=`j7G!p?vS1K>%k|LhcTFI+ zcXXu<^7rA$n;IF7IK}My3sxW}pCE+0N^cf%^qT%KQT1{YrpH!`t^uD?CaVwFZ_JXa zUX8{@YyJBN0)6Lq3QfC7PK@kJc??y58A&`eI<}d5=H`?$V?3^xR4JyU+5__|M}NtF zkC)8o^NkzOj^-^~K%vo8n^{H7)C=*(O>GR}9{1HJSI|H84=~2cPUs5t&FMo5tWDD9 zytFTB)=xM=&8E=E0VDH(KQiAjX%55fKmm38;vW*Dj`L;vo-chdf;ZJzCvlD*Q+Rjh zP=p@=H6{CraNm?4+M}{Bu`vV1lA}ABANb#epo`#=gE1M>Ni`=*6W2yEitcC*6b_cW z*s8pIc!E{qijtOB^mTu0OdWa(Jg|YmrHt74h22*P*A>GvISlFsWt{xunxPmF-FcP+gFqu!o}uT+>9`Ze3UOJk~TL&6|%QvKWQvf8WSrsWTR7?5e10J zy^!;XF%JD}sU{eO99p5FF~Y%OMMD0Hps|$2S_wnVE=H^z?dfuY2ND27=9pwE#x!+~ zF25Cb>JW#aKyIBRRpO3hP80V=PNiNUQ&qDwDx>j0AxO1wDo?ql?OCfGE2}#^5aR}x z9STZ)dp{f@eZDuJR9FB-<^hKu1%bAJUbrqe8F23=tpOu+TUVxo66D|$;g_Q{=7s!K zhG8KBZ|BiN@E*dD^*wut)^ZuDl3=Rf?%~LjhDj{?nnx1T zmky;`!@0>7ll`ufbXwzdXG+YB{wN$wp^lvvRIhP#hj_QxVz$L-(ekGKlyJ=u(-3`_ z5xIDVSfy=!_j3SPYGh%$k++@J^J?Q6Svmwm4Emrya9q^k)0EAqK!Pm0<1Y)w?x?pS z3gdSZ7uN-FI_i~Y;G8&dEOhl;e8Zr1>J@r4rGKUW@_rGt64TR>jK)YsT8*T0>cFtO zu@+aBqvunA*wGwjHULfYptFXv<<7WZYbuwT#33Xu$7TAi?j+duCiHpRw9R zz@#&TdFYyCLd-kPC9i_qpJrJ40W%KfcP{5pVN0U*E!Q*AcfUEWEYiNbM!IxzyYcphIbbwYL3fAfkWuCbu*=#D!w|N;Qv10blN(9v#@U!dXQx8s45#Y= zY&=!-3(_oSBsNH`an2`6ckE0V`F>4qQ>SH)*sIL*Ld9k{Jo86CisndSzI5GL1m9tF$2-5b-|4>KkHDDR%vn4lsiAK@aU8^hwdAi;SN_*C z!$gOGMv0%g*AV;vol2^>JGfcfoB!9rjkFAFBQ$ZGh=DWcQYdMu31N}WYu?@PN%PLo zV4^(~@snvb>0!NxX)q9&;;3S%VyYOgot66W?&j|9tM2n|FOr!3;1I7uDgvq)7~N~m zC0DYK)uZuuzE5>`MR!ki&DDU5(|=JXXtz!neRL6)(a0vHrJBtnRL&Z->kKqxeGm!h z4?J8F0NhQ;T)IyuH5nnumE0fNfasLgDZeyy*H79ow7k^uw~lnAP(!Jsa6##{kSySN7erbx$UPY$ z^f5UA%wAeB7?vC#7*qNU`$6^%98QV{27>$(CW7n}B7*!Afg#-u&W#Kol2io=D@`Pb znHsK97zVLZEC$Z03XT4^1hr1cROtj*hAihp ztO1EQ?u`od-R~up!_W-rc?>;LabT}5wD4VY6|`X6GAf9M)M9+EG&J&E9%`AvnldZI z`ix?@O(Jo~8ysq$5Ztm8Faug~%Nri*?x38~6Bq+Van2hE>h92-vJ>EKDsjad3TmHV z-O>~IZ8~v6ry4Z>!Jh}nZ5r{w8xCrSpblAPq+Zb&;oUry)KE|Jm>$+q{t%r=8%&+; z6Fx_(O)4oll++qp0bUdYaXMjpx1zr>3AZ^(Qq3sRYB1RkStbyRS)+e!%;zlW+x*ht z%TcAjAaK;kwWB)2pQyu)$ZR0`mgN?jW^@M9>}q+HO%rS$%HcS6`19?=<@KiyvIWs} z*hp(-#T`1Vm-jO-wff5|?w!-{qhV~O*!h}MO%gB@@^5oy6A3qxQg`U39;%|l>Bnm% zQ!4+q=0@SeP{<^uswfv{_|CFFu{`pY&7A$QRL-?J04Bp-AH#Km_1eDWwOYB5u{n7p zE+`y&IPW}4h<52!!G?OT3qp^}Rwi(f?%iryl!JLASrBDUH|*>9mC{K9fh5Q&5Qfr$ zr-$SMau!#mK!tM`@e%Dii0!}}pb%h!R$ZTO)7oTh$uP!CxdXJ*v4#~>w)ILkrI)%6 zpx8Ef^Sk<)0^me{%K1Z?nsS0!Fz_0EaEM>J^dJ-qs86rOB%}BZJ%(*9pz!R?laAfC zxq@jJoLN=9JJLIEChFJyUR(b70$sjCcvlU3yOD3Rp0Kg2<$lJjqaYL7ukvA=q%sSC zQzFd}m26gYDn_lqA@2yMdl0hyYZhS{nnt!uicZOvdkK~%w;M}gG<&JeYi6O=Y8raq z?lDv4%;DKf*7(k+in8=0z$egiI_cQ-sx+szY}4ZZDQ*awA7kzRpbU92QQA2(L#jB=e4=S5>H{Y8zD*ZDwhfv{y$(a3N9sq*z@j5{$4L;H8h;;@TCPvZ zr7pERFQ$&LQ+Zv_@eOaYD!-QUn)sGmswZ-2@#)Z7e(DNFk?(RcNZWFcSsaDX z!hp29+Cb|F!1T)IeX1zM!d1}vNE+GN! z@N~hmyfBWLnDA@5syS5SgOpX@FrSe~=Pvjz=oDT&J-r4wE(-%z;xcH7)cK1^*rju&Au?4RHHO>3wl{uf zQkL6zPNZdU8Y6V{mz=X>d#B=N0X4w{24YNP^C`LydyauR&@HhE;y&rfcvN4Mf0QE9J8}VufT&->3y3q&E%`p}i15ftlp|6k z(hf<#s9)j>urt;z=|1HM^2ltIA(ABW07-!8M*>#_SG@?52oYQuWKytIuvPSgn3Nc; z7)CKW32sv8gm|m)A@LouJu-Ndh!}D));xl82$guNWGXQa5f2FuF%M}sQ8!69aW| z5Rxx|nr&d^L-@Y&I5At$nqdAz`yO+qBzwT-tNgX+n0e;F*~FeD zyu9dietOQXXibGxRn?{)Fb%M)%c{#N$*NhCU{z!_Y^k#dwkWblvS_m4ok5vVnR&`K z&&FrtwebL4)UJuQ)L3xNTxIjK`Pw`IF6!1KTN*3`XTGvQ*&uBY0Cbi(W=7*g#0n~s zN2Onp4XedFs$>MBEnM2>vJ4356_wKoo=6oj3+QEB!~9*N0`AO@jHVA9EbBh)%44XD zAnVEOs5IKT!Yx|5qAl94gV zv}c3z|M0-^=kGCiUDVWuTDVXr%>WuPW^MtqI@T5KB zov!8|icLFMO=!a3ek^ zsVrazf^Uu}G+rK6iev|gZyqazuazy7)y6HF(#jBJH0y)v4sj=cFj-cglhtAjuea!f z>yCJIIYF`W|^B zdzh_N6z*vH0)JyWXPp~p7J&6ncyyfmr~Qra33(1X7ufs-`$lp;P{i2u1!+hS%$TUv z(C$!dyqF!K${b%<&z1}^M};F}Id4^6_=m=F0c**Y4%`}#9pI%Sk7@-fUrMhg{X9qJ zllr&ZvNFa%tE^q)ZY*gcp11E1`Qk3sP{AFp+aC8GW{ zw-Bcn!h*%Db2l?-tivQ#F+H~a$#L9QEBgUkxA-NbJitnHYvq-K)**EzA zsjN{ZHNz3&00L@k0s^A`Z?wz*p{)6zY59Nlb!Yq`{m|8)zO%Acc1nS$$r!`tM2W&k zz(nLhq>xaEka}LE42XVNz<_wHgqSb2t*Ebb(^8FL_!?@i=h?=-9}k-MNcL;@hfjGhxznoh`*p=LcKF`B;1eVt@^brP8v4AtaBB8PR{3Ui zC+2h)ob&%y@BK7l5WlX$1at_#U(0hfh|KP0uAj{w%UEIm?$*u}ydQ>d` zv8K>2{~BF%-Q2kUxPaZ9jP*Mp@4sc?{D#@_N}DpcpJr_{eZ;r){8EQXB`M+;Kdv3p#IF6pEDXJ3{>lVJMM?JxYdoUxpU)Ds1wBC>Lm+DJ1qGbgO zdwc=a(S=(gizxL$a~6Sl`q;hQu?>PJcLwAAivzcy@}MUzH*WzW>`U{nsV8$AWL0%J z`s1m9T>YU%mGbJWYGa!$NFCk3Yv{Rk=06R&n#^ibo4|5}-Kk(d?x-mQi!-Ehgh#4K z;n6}3*R{Rr?1C2C7YY6hb|>wiDID&e^eT5bcILMHDtI||)}^5gjez3#sda8&Fhics z+LWnou8o;RiSh(98&uVtto5NqWjXwrMP@ntsYPeGAEPj6Kkg*PfqNQC>&=4cHPsgv z8pHOxBQ}obQ@>}pzxjU_ud{e!y}5I$Twm@WD_rVjxo69Auay~;7~E(uxzl3FT^KJM z>aJ~UY%f!#>TK-c-PAbVd3ix6)@^7oG-cEpOY2PSrSFr@S2!}<9Ih^4T2mM6?>)hA z(%I@xZ#?btsgnTfi*!k?TE(d{t&2yFm(};2o{$%%-;p$s43*+(FyXE!f0o!|Jcj$b zUEG)aHmeUqyivN8l)6fL+tcq!$y|sGdyJs}O}6SC6{F|YWK2YF((vn6Y3jEoyXL*g z^Xt}Z)mCG4QGAx?*8v;|Euxjl=MfduI8_m1ag@??ObE>i-B#Y(}Hs|8}#r0UJ_Y=jJ$*83aniIU42%aZBr*v)FrlvT@$U@<1$)3nWj@#G87|L zX9|RW>??dUi8J_zY0HIusZ9hLAH|$CNMkseJx%?HwhMGl{as^tRq3^{vWFIV=1y&}P_*PsZJCajNiCFDrIrVfJ!JoG5zRucyO)DB-NG?fMyg%B7jBALvZb-M zjP#4jURu?*u)D`xzRwt!^5~b$JaLV9$c-5FK z@I3PiyLk!+2`W2rwi31@q)R87#lq=jStsUye7+?DrCSEv?WOHCB~{PYv*Ko#loUN# zx$dLib7VdscF32uW@c*X)zr?7?|y`ulQ2v}%_4njZ5&`6;5gMBZ@gM_@%HlYdZbHg zpdCb3Dd|>Si@(%#fc;EikzA#+-y~KrALqJ zg~UBge=?eKb7IbHYj4S7>A{GwCz_&|_20-_z-|~l^o*>Xg>3|+pj6m+=iXS|DM{4I z0c>aK5IXBT9I%JY@M5Fp_VRT>8LC|)ReEP?46Za8IjQZ-GKlr<4)%}Gr&G<_hgxqi z%;nDx$*h#e`f?*UI6#qA&TLpc?iDWJg+t9tIT8{wVgXLZa-=UXrjL`JkT~>=@NTb< z%Me;=KW*BLb>_l_@|;Y;)X`Mqv(xT+&p8p*I7#9!l=VP$n=GRTO`zG- zk}K(SEeCv=*de6VYq>&7y|)M-6m$=$(W+N*dk_Dda>MyHRUNFGn@Kf*poZnjE&B?} zf0-F8lss$fV31jfb~%1?xe~W%FbVbAATD^AXeu_|uRjm}OqGgg(MqEhH}pYrRff;o zMgqr5J#+j%z;1!Nlj4AcSB6W=OdpqmLGqWGoqD1LdYJpqHQ zzqX{Vrmi3UZ%xe>5&xhHaa&c3QP;A=&q}uE?#1~6;JcI&{5GgiY}Y@qGNgg91alTs)?EPv1np zA|eVu^LpuEL22aaFPSVc`N%yCif!IH%O8yf7ha2cFowa=)#e+UY9U6ip;|fLMGKeK zwC$)!_5<)JFept-oUIH(wX*N`_bF+@J{$sF7uGc*`kA+|mng^gAsux_G?@ps>QeHW?Qjq6<3SxvRWQBWOL>fx8*+6kHm^*j@RCVW}wCg4%8&-ya0X= zme1v`t&d-V%$s&8{U$&7nqQ^kvuP=5)u_gRTS19eDY4yLq0jX zvN~EO5{h$){Ba~ipH(AW4c3t4icw1Li|%MeBC(jEtHTQCsf|?)9c7P?--VBL^wpFURW&7T z$N<%ex8AYZS#pqTI-U1y8P2ETqz~3^a(EF*gh~Z-v_{Z%=*?jr(!Up=x9wk@!Xe7X z45j7=`(>iGGV(N9r;lcv-VP$;oNK*N9Uy^4JLV?vdle&+Fa6=9xOUEhV^exIPWcM< z3Y5+h+QS*sT6cxV!xRv|E}sXRaPq`?o(Y%~VRGQqWRJNYuC__|_aS8IFR9wY;j)Q! z@?&@luazOeYJG328itX>6WSC~xIlwX7DLKuC5rN}K(w9^+ge#+F(zr@<{vHd_952a z&Vm7Ddb%JLnstv{N8t

    |f5oR${Vlx@5dfkl)#@+ND#R^&v(`4j11S@?v)nG!56{ z-+2(3&wYo+;&}4(`~T zv!ysM4KHH@u@9Bj&c-@XHRD-%S$}6+`8Z_81XQXV6y5~9f7I%YrgXM8wwAwJMX2)l z=6#1Jdk1N1R##M+mTuaAs~rj_S?3+<4iXo){UXpO>t2lEw%4eG5+KliLk;;wf zK63O)ts(uMKCp7Mb*P3cioxVEZumUYgv1Ten|kmG4c*puqx62``|A_ayYZ)}{OwK1 z^4~->Dy4{F%URAN=2-rE`&Gi*?;(l=uZkQ4V8z|w3DM0r^R?>wa*H&9vRSn%z3N|9 za#ox5Hlq+deRZKdjw{4XMymcobP(08zxthM0)Kw(P`uiuPVHQ+UN!B!OhR2p*syXE z9?)Oiijt}}o&oym5~Nl`!zlw<1u)L#&t-hnd!4;2t8PuG8jzZ;oRpvBP+w!fuaE(* zny=C;r{SdSsGLMN(ojEDc2G^*NaIyIQaEBz=Se2));JaSKXOn%JN`;M@<fN{uLf}Y9S|QGJ3Jt(^TdX~msImr z^Oe&i(gv!R!FI;qcg4eYouLBis@bd)J|pko!JfRP4e`{7u)2v zelI@CeTG+E`gLV7^1iGM&??pd>~k;oXgrzRISqZdeF;^cSssa05t$yLR1sSez6W^% za$6FaQxu(jzt!@U%LZf=D*-LJ{u-|tG@q#J=?423u9NrG54{f|G<{=i>hY zcMh`bY4*Ka)3$BfwrzX2ZF}0bIc?kSp0;fp)6+I@|ITxsd+t4P-*_WVL`AKLwb%M% z$Er_dW>sZ=k5IIfk7!e0l-2OTwv!c7W>k-yf1vfM_9&a?kq`K*aY;<89r@T zpPAz(&{@=|X56WFoH_(k(wK}_Xm-k-nso>M`qhp@SeOcw-Aa3=P!s${z?%7$4YL1-`Eb$)QvtFzlojRLg!0(FPy& z|YBiuO{P!L-$@bve72 zcSe=W3zc)Y2I9h(D>dXJeP@3X2w4wnQKWHFHZVvGLRZDwhY-;09q4yZ4RX=d+1Q&- z2PYw0zYQ#b2j{ZBii1Xl%wStBs8i~@Mb|leQg`l+HJv(zYY(6-?H>nORUtzJRt#o+ zEyjbhroh)*NS#QrCW7P*BG?zYR;vp*&e%+P)vHwR6S}wo7$I@}9)DhGrbIbgS+7x7 zB~T-Q*g@fd2@P|7E92=PC4UlrsL806mC={QbE90sL*r-dKb2M$ua8$ySJT)-T0)%h zm{;eX4L8ij3|+uN*jMdKY_4a0pBmjfBe$vwEMKn(LSLl4UmYd)L|q~;ER6X)E&=BZ zm(L1R(xnlmbJfmpC>+tjmq1+-7hle`Wb%I_mPj}GubNCb#%0VMhto@Wbgfu6ma}(G{fN^{C8d^in=}-Mb1i}T-ZI{4DCwUm z?Z*D_xi)Xqgow#rI0kk|YihPV9R`21Y!vhY&9r2#c8y)M8pdF`5ONG?HQ;EbKM>$y zf3+h62iU4;0BPS#vr$iB!PHp;%(971H>a*dv3-tr&b$-WSc zo@CvMBrq@@g%JsCCKLR8msIgXy)Be`VH(BAyfsc>U_Kfl64*{=5cdnDG6;MZRq;c< zO_F<|8oeTsW82WlG#dv+P`0FGkdyEWr7{S8msRmY=aaOvY+(%}wWOE6bqM=ve2DK7 z@#$ek&6DNrf(3STtB4XZIiiYUOPoAPqemlEq<8? zDYCQ7Z(^V-$Wd>)6y$CT!!15t_JnG`^&WE-^b<<0PTSlVGDp}v7Hks7#B+NM@49Cy zUMMa23$m|30xlE9C@-m~_RC}uhZKMVUGubH@|-enJC8i8KU#UTebYw{Rh${RhWe=FYbf>I+O0@tgE{TJ273@XLs+-BV(z)&8ZDGfb{ zOO2W3Bvl<7SM3zn(@T<$W0g@0=wOPxyyTKk{0YAMEu3CM%T3GNv?lpiJG4<24Cr($ z@X3&%Oj_tLuzTAiI9M$va7#R>w040Ks6yF zBNiks^bG6`B4oVbZyqxV0>*@!6RHU?)ltgi5V9yMdfYv7=3 z^V*i(hJ-kZdT|u(Iu^qyme*`I$!=v(t$}NB+>KWOS`71R-N`y;6ZKnCJ(iES8y<+B zZ_aL#lV$Z|;Kh3t&Y_@u^ZAko6}4a0I4OQ&n1KBZ_@Cl)uC%4O>cpGz~izshfpHsMjq< zm~Ann$H*-)I$Ace=aJ;g2dDrd)Lg|iTS}^}XdR*CVKrI(D|CV@@V_c4h&tGZ#a0sL z$+rw`xjSybV5kc#F-e*TA?pF%th|XyVYAx<0jnhGSNJUbv@^S;GXYw;-)U^Pfm+)B z&8=b%zRA-MPu!E}mXRp96r#9M$PkWetQltcQ(A&Ev?BY&Rm`M(5D|G{mj;7%o*ALi zwX+syYMHd%@+|Sw!X1KM1A^NYD7WZX+*&4t_6a2@ZOTH2reQ?(jAPq+tW1#Ih3+_B zRb9qasi#QGGWVUDFxxOX$}8e@b0bEX3(@tePf`$8D5^+=s-(kDqoeI-IJ{qU+Hc#3 zIq;~8`RR9xP1Y`Drym~OPu|z42&9;t?qi&q{*P_M0Pk55YQwvP;zvhM8^^at=F(qI z**5kZX5mO44q!3J<(8ode-Bf0lIc4sRmAz$WPV6W5Yi>88DE$xSJbf>_iAdUsj;fB zstUi6gvd3k`6JGdlSm?=#{lH5l@#ijHz{QX#)3x4%}E(IBO>59xPLp`N;-`ej*`T! z*$(8SckPKk4LB4tZo*>Lz=mc)4NQgZnf-QX1hjE^uQ~KKGH+s956}hdp_4OiN=3kF zU|P1RG3w&My7$@PToxU|X{;g)REO+k8n!(!Zh~Xh{0Q9u8fflwsQ!MNLI=yPs(G&i z&=vy)>n?3HfF_20iHdotih0?z#lA^3hEr2U5ZVbA+6f!li5uDp655IU@7{_5=Tg*GMe%R*Po58ni*m+rUIhGF|(@~a`5oRZo_{WBLca9HjTI5bw@P?wUP?u_A% zlW9P^(Rj<<^;m#1R-ZOUz9m|hFJEL&5<0VI|+K9+XdbH z!#JEaPWdiMF0z&#h{obzx@emk7dM09xWpJbZk`cpn3a>t&d^;@WQ7cR;&IZKx5{VC zc=07={KUP{)8WljRi1Q?7;W>d*W(6uE1Nr(#H@&)JTkY6AGdj?-p?vh4<3Z1cR>%BOPRtv z3uJ;*jwrS`(ZZ?4mMTfYB*?2aLC*0jYO}{rMv;&>M-uI!`u18BA~QKtpITO>bFn>` zUHe1`8AY|qldBFitJjrDf}`sIM=bzFEdWQcy#0v!lNcaoN=i!)OiLf4&G5C;x8Kpz zU(jGs_ssI#3stuYu4w~7YX?l*0*c-WgwFHX8!+?$PHW|&S#!XOI@=9ueT-*Ar~ z1zZ`{O(i(&H>QInrr-gGB*!_oU+kUa#IJ+mgZu-osy!*wmUrAN2W9l+^~MXXmS1`M zxB{Y_#XRG>*hfZcr6SuA7N*2<=;c~V3Q0OI5Qwj^FUjWl`zK|XXQD;L<9DGIzM5+A z%W8UNleG)MfomU21uVGrRLJ;IQcEZy6$hQP{w>)FUq*wEaf`0JMPcaYA`E1xOmW!$ z>*x3UE}y`|J7MvcBvtZx>GuMIvtNkDu<)_CK^aOypIQ6;MmU<=c0;#4QjPC4n%hvR z{-6_`ZC~Aew^Qo&is)oF;6tfWZaV0mwrlCtPOtp^VoqK%#PaTvt>QGT)TvGw_AnYX z)sPplpq&SE?o6y|4R7P!oJbRV>I;K@^(9a`Sen@x_pFXOw+n-bTiN6`ZwVVMV3C#N zdDWrNwiD(5@gG~zysb0awwyBC2B6Vpl0wD!T(*HU!3gz8Y`W;dX)iZL>e^svpS1f6 zxXEd``;9c_>)LocH5V`FY2`s^&zK`g%m-WFz-Rj)>=qe*8 z!Xqa`vp4IMcspsq<}JLxSsL}^;5YI{jXPTma@Rg0bQ9lRk2C15;><&Zj_SAML2cX> z+3_)<GYGQ9XN2Xe zJv3L^5q_HVS7-IEvqwA+zd8AqiH7P)f%2#}-s$_qSj_yzA_NsdYw|4+4b@*Nlh)Ep zEUGVRzI+)^DD0DOjVlB^&GSfida{Wn8Hf<{d0l)nx3-{vwa5Ns%Ne4)E%RN}DQpt! z=o@^$=z9*PhIB9GE~J(PhkU%W7a!|AWwPM`(5J^+cK7wKXn6ysLIh~aD1eeI#4mu9fL zVJ{+MH>8i=_f0REFV>H$`)sI^^0D9db@PO>ja?fP%7Kh>QeX=_KntCQVfuadc76B% zyYKnpNq8B*T!4G)@lDH37T6_DhUkHt{wJYHvu02@%NUkrYW}HM`X&FTG&_x~1##KJA# zsn}XHu5+TR{d1W$YySC24f+?2yy=8-on~}QvsEhM6L@stV=FY~a<4eRhe~)}JiL4Qx41b0#6%>Z zACV9OPlQD85M z_ri;!dZ4#NUz=d>i!*X`4^skPqFySGKL{_6Nz->eYrfMFzDpn1HGLYJ@Cqt)X9epM z2=>lOFL(DD5dLM^PZFL{V{3Z3izM30em*>>%F3Q1EoP-Hfy*N0I#~icf_uw#JkKe? zB`3~}c7`hvayDyS<9J`UsVLmeG(65m)`#2}EmEsOg3v7wm&^N3*l!^%uSFnDa7Nfg z4E7st>}MUS6NM)1KoRJM z5$MKY-1YeldiZeZrT)Hr`ha3LVTp@D>!SJ8qVwnccp&AV_=h@hcfEr?(wgIX)};lb$~ujj4Q4X3LYNok2BgLXS^Kp=VI*ZEc0-_nSdQ$P(K#9=f5a^x2_l+ zae;ZQ2(K@)uexD65|q0;RyX2}bo;)&#w>NsKUTS+SGhwQ@J5CqU;UAus*ls=H9CCZ zBd~a^;|8b8`=-?mPh7B1IZ4FdFQTrWwX(~DGW5E}a5Su}feGNkc;f(=(D@FIQ0rfQl^*zL&h57;S zZjb`aVnGGq0rgcYp4bBQ{q+U|+IfTn%J~59``CRJ0@@{_`~v{mRRY>&`gecxg#zSb z{xDuk6Tt!(ivbjX0UVG96rf>*`So^a@FM2VYPz2+;QZcCoxXublm5p8=As*qB>l}; zmGOy!Bz&jrz#)9LF93ht1Ilwm1WDp?o?QI!SbrV49A$$|&O@z)I)6r(g_4`LAZ97Apo!|#+S~p%^elN|_(77>gwKsF zQ~ol6o1~QuI(ms~0c~BB&mt#c8H$id?l53*=+VUBG&?7M#-VrbwU>lwDk_UQ;B}TB zE*R+y+kzYt-!%#r3|lw?J1{hg$T$4xu0hsbLXVMsInU*bl3h{MjX~LXvg*n1c)04C zH!yt{!6Gm*7HxcGIpgBcH`v`hS-HTaKQ)IZg)%!1mPx6cRQM-brlK*MIUDWJS$$se z1Oz+G1!P|NL^!FGNzwzmYlwlRh=GMShFQ+b!nGn@>*CZoFkK7xbrK|j+#)xWuAk|k z$b}RX`PByp68L3Rl8^wS{+Kfjbd<($S{uj{ZLnq|r!cm`W@zvRDnk>L{JdWjG~EIW z#o9dzYRF15FWy1Y9t=eyFhb7IC@KSZE%iNq8+~X_ZgGC%1i2a;wNV58;vC$71J2%i*YT@skSj`3JDWJt3zTBre}PM7KBHgI`7Q zcHYnJyuXFprc27>s9b7k4O}k!p4N*ICkw9tu3Jb$VfQ_$aWl-!Eb|cN6j)pLHUv= z9C<~nuK_foxF2+qdHuubP!|um^o)qX03oL`tScHg-Sh-;#Si-;7Ge>z0-y2&no&o<{wWs!|7evY;T$CaT%@0cav+TYdzOhi4)&Mi=s3jb+w(@&RIPi$RZWAsw zu84P~gs}xC&}L#_zYZ@=sOSByq|W*Hd>yCG*c9qk^HRu7Y7vF@-~Y z3dJrr4mKynBnsvn0fG%&2c9X}5gAl*7o@U2EEU7g6;EMs#3NY6h`L`c28?}PoW&{O)w?I93S|nm9I23 z&p*gcKaLo?F&-qYo(eZ^)RjM(@{_+plkJ7ZTZxW%eB&EdmB(r5irlCvQY^uwp5|6#&}cNk_<@Mhz6qwd{GL?%MnZsq7AV#6}b^e2U zf+1wf)x`OVz|D&Nyp{40E5bi&|1~_kkq1bZUHE9dlw|A!eMnDTU^ZYou9WnjAA7#g zL%d1I>*O#`vY0$t46kwJ{$tt8iNN@x>gnEINi#~@%(M-s3a%9`l!tE8K}p~b;f(C9 zIiB5SPM)iS0T7(Nq~&E4Q=?v>k}Fn>kan<3;+vC5&{tHRYa0afbOSfw;lxBiv)z6` z)t{&2l?Ui25Ae_JI=KNG;{`@@cX`b%Q}V4_U7FOdMAiv~fTP}@M-=_HDuyp--%&0v zP3hkfQTePl&w%?MlOPNr_zYoOwnvUREzmNhwpl3)$9@Rs9s-k=G*@v8ZfS?dy@9{W z4toO&WW0<0>byh|Y*!G}!>}k9QY~kk9Mdn4!|BR#riCS;xx<~YS1U%&N{R!32O0w-J~3}CE1-7 z<8j48rg&Z?pF5@#i-N+cgJV{~GHPNO)-elmYw8ESkQs3_vYw|GLGhJ1_haZJ+$xVM z(yg3A3uqyPy?UK4UprWABhuloqX09{05y1nC$6xB&+}yf9BY56@)Jd&KN)F>Zpuui zv6Eb)VWH`f*Um1zHh&KML=uwTljP|`hoE4J*j7KEbUNm2^1OFjpz6j$62MMJ;*mVV zlBp;SXXZVyOfO9*_mH-roV(3wn5(_{E;TsJlh z_ww+xGiJO8XZ$Heo;h61Bdg*+^Mknu2spB*F@{eu|AgW=?Lo>btq4^kYq8)>u{f+t z0Tp;=vF#)71&Fm_^j)=ao~wJ^l71aWME9>!JVRa(!wVqHDFR#s_9D3^JOR=d1k$VR zDFjkJii8bkW==jd^$qEe+yy{$b=~@z>UqS?O+Ed{*FC6|8xednb3fl$`mS*LE^+#< z5u}@CudIXSEqR-}yWBNK`YyRc2OfDF7WpbL$|fwzMF5oDmJWIN=Vz8&-MW>(W8Tr{ z?*$q5nJp;x&@hT^%xwa$9R7&2dn(ydg{#Nm>+3^~(5EL~<5N#iw|9<~9U9q{{w@|M1b9x&oG4KM20mQJnq{7N+-;%52Q%eZj)_D6L+q{$ zf3_@vt$F?KtIE!?_CSsWiSV)Zk$R0<@OCAPV-3gwny>8e83bFTJc16_xqF1B=WD-f z6;axc^*!IpD+DpcIi5^ad!lHT)Y~pG)?uDpa*rrWwCU&I`UK{1VI0y#z859-MkH{I zPIVM00JA=?l|__07BV;qd_LxNX!$0y*yEeHFYvWpxW$ z7o;swZqkru5w*e(&tgPuRSbQiy!DJLF}kX6ihJUu7UM>+EPnDZCVZ_6zvUjB*!2;S zx`UJO>B%p82~9l4;UTxpI%RB$SSO0t#Sbs;-+h1>gC8ooU$Z)jd|#SJyUCSjzrq64 zNV=3Y(v2yepmd^~-|I`-U5ON2dI7l8sGMMw*w}ruj_Emv6^o#s{DUzv&bZ zWgvLp7L~({V==F4&_s)|6`^niwZ*zem)}2ypXxn}p1iJK*6(iGbsgNZxTLu+IT2unLC|H4RNn9~pn~U3M4mrlrky zg^6}8Ig+eQ{N=w)O3u#6{*MP4;kE^t3h=I!o{NBE+X5fiOhY7b02MSXAHvfkKhe`ma0BkFGXl2+Q2%|0^EJnZ{_EW>2e3KW+ zvu=Yu*b)iTBS(V97OZ27V0PgEJ6SIaI~m2_X`FuBy`;f0b)tw9ln~NI7NAZR;J6)? zOfPoRvXfvg(wm-v#^(!pez8=SJ_cCe&k(0V^EI$Zn7KQ#x|boqF99~_d!3^Nm;RDJ zzn)OH8!5bycNyhX!|G(uJcSp7HS|nfkEi_g5mN($KoR#oL(GqMSccl_&`779>n3Kb9%8Q z7Gfdoe3mf;6k_zx$?Tq{d^(|iv?8Pz3TVoe*J>%0+y9Jd9hh~sL+zMOnpq*MTAnNR zJ^f4lyU#D@i&v7N8;PsbFM{iVCi<#YP7#MRkLFWUvdW;NqW<-O==O)RpfHH6PAqpOII`vFw?O?|a==Jjs#5?@s&P{zm%jNi+Tl!WOFO?Nv%cW|El7UnA(OjiW=sZ ztrL5isgAIX1|%l>&w2GC#X6)&L8|4FCR8d@RJ<@-cR7qCxv}E-Glx6oXnXy0PSk86 zylRB|ehMrC+`Nw@T>D;U?D=q1{mtpzk7@UwtEZ118F~M=KPLu2xP8GtV>s;$5h)ID ztuzl%dio_+&f`AaKj!Qg^B7rYAvu1@NPV6;wHEA=RKxK`5rNhMH0jqU#S1vgiJVpu z-p7&P_NHr`u?G$39$2dg9zd^Dn;DN%rnyx-tr81|EGhh_sa~86G$O~N4VLRXn>5EC z4jBw4kG#j5orY-cqq$Nt#v=2sRuCB!r&AR$X6Ex*HeB_C_)iWi?^hbIwaKZc@4bzu zZSWS7kIf^O`fNRBt-2TCd5-S%%RRc(6Y6;+NR!zMh~`{4nN(=iSb0g*jF)_d@}^co zKQ<>#c7TWf;$oc@1i6LS%ZZ$h>$hJVC?_e$BtCLpL7n9!ucLfsUwI`7t3{Al%sqG&l1I;NpCJdV~!dbK$5zB2z5G2i_LVA(x zKtOn*-@fxL!@RNuX1=_)zq&-2BBq(sT%7n@E@Znmb+L9!KWIIdysE`tMTXj{b5<)1 zuQaMkhI%VBe1z<=|A8HIo(n zBPbmB?^&lA4BheGH3nDZ4a3{U{$M4@uWGO$>DU^zY+|YpM!ux({;p19YUl8oNXD5+ z4&`O>k+@95(UVVrRzf<`TMGmnrx#z6E?}!1hI$gu7^of=HH9gMuNR)?lb*UFdQ*v= zZcLnA5ig*6J}EPYH-;qb43QpmJ>*Xitw?&~R0!EvB%aQoI z!B}i*q0 zPMJb2P>>pRmd%wD3WzSz>3y#6r`ma7@!6g+gC+GAs>bpfOnHZM&|gDYKVv06XRi!^ z+&u?YeT?v{o&VfP=gA${FN!`^Rg%v^XNAoBm`OlfLs@8l_DY;5Z6EG_?^n%~8#mhLE~ zs3Ttssiblc7FrYJKRQW&l+&V{B+;v4OACP%?Ncv~z zlIfw#+>6?%EY~znVzH`Vv%6`zRZ;o*QKH*R$CTh2x1EJE*{l`P&6Oochjj2fS!klN zWE-buIKcAQ#9~z#mL?7wxbo&WOacl=WHUC~$r9?a!;Q6}E_>{bFSnv&Fe${7z&Z38 zkt0gmcjl2MaLX*Kpjg4JL8wx{*YB~HC-3cQsBov&x#p;k#vENduO1 zZ#~-2md)0dXgqVEIHFJ@T^@&7Hm7NvbkUIQu`ugAM>29cDHR&Q&6C8WO12#7AcM7!GVbKPn$+`m=l>>R z0miQ7+MDW{CY!AipmGv-GaM{(>>_NOqr=FhP57+5Tgk+E$Xnd?w8LD+A4GK~Ez`1Z zar2hx|IRZl*PFQGB_=__i&-to7rH3%AVsqNmJ%#Z zl47@p#g)Tu@nVG6566~b>Uvfjk!Y(pFm^dx4eI7zpRG9%!ku^2^pS9s9dQhH%}zFD zkpJTW7I*G}Tg46}A^{u3Jxx?I5V$u)!CeDLitVh|6RnQru0Q|QwyV^y08`}l#dB~~Jmb!N?jo42%c$JawOsT% zptIQdb$CygynWmO_M|wz0$e7FRZ%C_(9mvS4-;+3#%RhIISfUdF(Ld;?zcqK_f7VtTaSH1t=f8{N50EkIn*F5tewu!?Pep`@ zS5!|qy5FBAZVwx)rm?Sd2opNx5UW@^_ZPi(!~R`YBFFaboC)62DsfPlyI1PLUkjH`v-#Y_)b+YZlGtBho=+e3rhr;O7W5KeICf)KTak z21kM6OVMFxS?nPxWL#ie3}k?3fFfg@5=NL-GQu4Vz>j3|D)_}%J-vq~_>2%%KoPnm zuY+@P-zQxF>J9_&Nj@pi_*?V}kz5qhj}mQC>l`YbS@Kn@8Ijl5TmS~3E@xJ z)I$~<;sG;e8zPZ~D%gm2EZV0M(vvPKnLDh<1b_e*e0=_q|4y<>u!qrYoN(lpuD||G!MYKUH~YrrLq2z9o_oz8z+=|8El@2e1Q}o02m9%VjS9UcE;VLi|ik z)z?AL@e42h*3g(QP_|{|mke)4C%rGTgc-gTY+0FlIDd@Qtwlu6`_S-FM=_4xL%5D( zp2i3BKrA3?U(2v}JI)&0oUYvwfCuIkVv6`PN{Tq58dy~oxPWa($ygYhg>A;RX{5=9 z{U&edD%)f2(PKOMQ9~E=DI|c%H-O4FBd`jK>uHl(bWe-VnX7}*nM;64w(%G;1=`Qp z)IE%7&`@;1-OnsSnzmyUp4!c>S5gs6!w%k^dY#opHpZe(M&3T;E3s#MB1y8l?0rr) zxX38dum|TOQ^k4icV7mV)VYZsrPnhO(Xp>R|A(i>HuBd&Gu!5};c2>ryacj_%VGVm z1Acr)6E$ferxkh|kC>lJT8_as8a_LBuDq&%C{4rkVky+$QmC=yN}M_?9+SUn+iR{T z5})1*X5#ses+&80Lt~oJAI^RYf1hQ?`{O%yx>73=zSdSwL8oTa5! zsD&O)%vi}@zlhl^Y1A?hIjqIa*U z79od)pEKrB(toAkh=aR3#NG2odPs8zq9To;^1TJHu8EKq<_~ULVFr0RDPDVEGXAtK zDoihOjwO}haGaMMiRcOFWNO|~Jsnyk_`k;*sWU76^7mK+1qT9R{r??nqNYZ!=0Y|$ z_Qn7gd#8U7y%g0bc@!a3J`n<$Kg!U=VuwVU&2*Ce7}VjZ!u4`W$oLU)Me-YG4Q*Rw zojP!SDaZtaq5^$!%-fbYf{;UY?pNF0&L@-Y=5{Afc?7*cn_}z%gf$S3z#JfL5$UXs zKOzXp8LXT-|>H$d|VlpV5OjY*T)S zxa)Ha-Dx*dUcl+IQqE_U(i%r?biCVvcQ?R?p0zATOe2ofk#DkcL|2_bcm9?EW5{Y`m0&jW5io0gQ!*W!Ss8GGuWL&B{u@g?ce?^m7@dxxRPBh1PD93Og|;XRFq>p{^yyfM0eh9CwdT?NMX|e@BfUw1{ilZ)ETG#^Io$5JZ&3@T-um!oQcR>vgY&=Toqspw5` zsCp=wxk#7O;3%ND{R4LpA;sgA%IVoH`8um@0wXh#v1sO37_VIfSx6yE^&@SN=0dyU z0xYy%osZD9gdCGIB~g1qI`sZzuhVNCeG_ew0X9YRQMYU5#Oz(dK;JSSM?^zSRUc*RQMV1Vu^5l|4L_giiBE}{q+Cd|}*VeBZs6a#~5U1A%A z`xF8U1;wBrd1vk>qleoeqAJfRK;x8RV`o$t3{-F{$)YKxExKQ%YB;*b*W+>T;WPNE z*ku`E_sa$3K@LyN_K-tKN*b1}p7r_HEDy6AP{^g$j>SHVX73daHv%Fj@wX(QsvwX( zRN@K%<$An4%!CAUSkku~Qhe-A(Jg!sD_@Kkv(h-`0K2;zHI7(zn=mH$H2q4P0&S!1 zazTs#55oI@tD{qBYWy1p6bMNEf5Hj#zozIEHCq*AB~-tfuBzG8GSd<&0O@n$FD>=V z5Xcs=^TUbgho4&4ft3?Ajh&0D?q3RA-JDa42&WQkIWV%Bv6y|id{2{HGh9#YGxWWF z{$Egr*c1G^LW2lcN(ADJ)RXDKjslm)zvD3Xi2?I*@Ujs{pim3Q_|hJOyRL4mJh*As z>3i$M45|}QdK^&|#@etAMwpw@=M}cjSpZ^d?W6Qhzt*ae3($?d6wO!-**}D(*j5=~ zUvzn7*IZMx*`A?e7S_ciS+JKy?NeCX4VnFEl_?;t%S(as2{p8)XIT}+5w0Ys=x>JM zt&0@AVj|$x-jxN=T)Ry%w+EUb(71pIh_kr4*#@C`OSWFEQ z`|zL>vz!%bC62n{&B8D`Z-Ql?Y>ifEp4upPZn^l@MjF1Q^Xe+%N*uORlqYSC#@ z!&TANr^wsc!RE}zH@d?xq?mznA@P;E?Z&a13$UrAi)xAS`!d81d7JS5fk0=CKL1_dLoNmEyoYE zNw{-#KZng};jD>$!X7oF%stGYyh?bSKYaWjV)y?zJZC0xjL_e3Dg001V)<`y1<*86 zS!GyCV?yb3xDcxb>wX&mhn80Q#yVck)|4GZy<5Q)$K11?SHf8g3q{s%6n zZ@8?Nh`-?~_=XGjUvM?!+(-H{l4hQxWDqCzL%SQ^i-?$qRFLd8-b{(Vn61TDeY7igC&gKXKnt&!LxP4kVJXlpt=!~y@z-% zjCNlyAr3a$xSY&6>o%X}d%Apo{rI2=@H7F1+&4o^bD#;>2#+A5Cn7p7CoFNK2*)A~ zf&{4l&JONGzGQmd(%XudpY{!%rDnLWrW*Lp+8jLbG<#8$w9KrzP=HD(J=jK9m zk&3gfzLec{r0EK~s>+hb{m!)*h{3$vmY!L9lq)*+4&b_^8rl4G>WtjK-hj%%TZRs^ zX(5k`wU3k^fOknM_-`o<+U4)vhNb@rI9t4YVS0)Pp zTpi`M4(=<|W2Yk`SbV1_%Op^7rnE*Yh<-x>zTmvo?=8}q(U!emL(^-72fEK;2@Z8(l zrzi^Y;kmoPv9llZVbcXny&b7iwkIvOb=jqP zu{%cCoCxV|WiVr}w8e_tmiBWeD}sNxx(?^S@OqcX(zh-oInvupalI^&Cd=YktlQRP zr(bWiao*NUC?T6jOr0&WP12PdjqHU zO;E@L>+2W<=OAHB5FCSUKcZqQ81@p12GizmD^Xb7erK@SCkUU~v1@yLkyj7sW_5`a zoKHE`d4!cLO|gBdIou3RagGmkpNJX5pq^UDcQVWhiaU7VuF_=wMIw~z$U5{nNO4AO z0rEhm23|z>Cr&N?28wgdq&A_(wCe)MBsSTv;M2@2F^(5@euPtDgKLOSp#M7-T6a+6 zLjN{HI{yarR%B{g)ox&^SMk`IZtOr_2QNg(-Y*l|m@9(rr1 ziF;+g!tmh8jM9Ek`YFP-1lEZij=`YS#-+=p$?@c-^US5+$Kx4HfEKM-9m0W9nWSj^ zU@&VEbV&hc&>5w&QqB;5?lKp=rllw1&`ObPeXYYmHWnnC|@(>c}rvWC|ym|^VN|Cl+Sb>tbHzkd``>q zmS2R?TH}X^!d%^;a-lx@G&VyP>KTo4s%IWgsBUYZP&-1Xi-hm~iREZIeHSf<+|+Hb z$^jY(Pln{>5L1j(wOP@vCtc-Hc}-R*<3!hOI8ibs>ftD`ga>TZ|KjW&gEWhREzz=V z+qP}nw$WAfm2DecHo9yZUAApoUB;_>=e~)ViFj{f=HHHU{_d44_sU$ELI=Mj%bZ9y z*#MOcbTE+m2h_%rnpa_}$eyAKTkjXY7P3B=%ivF{qO3c^N*G}r2Wu)$N7T_FXDPe6 z!B^BK4?3c7N10-pGFw4L= zcTv+cHTUyltzmFx29XS^QSzhFp+HZC7&fJURfb%9hGBn`?r16z5ntWzVA0^1lSFzY z($gQ_XL$c@Ryn2+$I@q(q4pdyvYy~5X2X)$h!jbZui$E+ByTJngFbWE*OgdC-b5uM z3eypJr`#U&xA+KGif`VFHTKtEbcAM9t>zgZAA|U*u|sR=YcHoQJG;wPt_S0pzlvZi zq5OtxMKiS0sAcohKy2o>4jV(5Mxs0|FA2&F_-k?xkzb}CP~(SJd`f(OJST2Q#KZhb zV7E`&u{~b_3u-o)0?IdN+yFX7hu5#%_e_R^&j#UC71}&ofwd`Y1ld1p8M0i`*g=ru zhPlV-ZzT9!zht2fo3+OkrW3)KPbBhvP}He(`eR7z2)@SbYF3e;*bambfk;7&xFmUV zc@zNqyoWMSiPpp#wC!D@6G6Ei;TUF)LGJzJN@N!~6r*C1F^IS~<&w@7nNt;T#w$A$ zlyVGYetaW^9PO3z+!6ykxMUb0Y7Qjc{LeU>>wS0H|Dhz<{~Mff{J)fRq40yVFNAKo zYFTPDWaSzSdsvlQ5CbIo(0vYZ`8Kj)!l@Si{{Y(5b0v#Z2wajz36StPhm29{d4bP3SLt=z22p;vrv>80k$YQhqo)^wq(3DjnFboMbNTQRb?kL}Lrpij^0&&q!R$~5+$I&@e@7j*Nf zOjVm*?=}H%;)HMu_Dhj7C}V$yx2kNgqRyNJNZN4I#tK{We{Y%K zvPZ}HH2;&8I&zzTSP6$P%tnN}acF{-^vhI^v3WM}t>$hW#+@}aY6>4m%bz4~61E|% zCZkKGYCW5?tN2Q3BGx?J%5;JW#z{k&y3R^1h9}2Fpu-E9)R9md_B5XnNkQHRSk_l` zgwpH0&r>HD4YW&Gu=+EWO0N%SR~sbu2_2K!BVuXvbR*o6(C-@&%pd_-k2m1)4(nVO zQQcwaM}m;lb1+GbEE9WPT?OVjSn-2{r?wkQbfJ| z{Z<0q-JY)Q=$Be8#)T+86zd7XB*I60}U z-2vL{s|sU+V7HpB9K%hr(8@%%mSA6ZR{cv4Z`xLEk}Z7Ho=vLvJFo;RsOCx-(9p6kU4xQ0Ad+MYa$7)h#34#;+^Ot!@(-cgM#ZkiSyI_rRT+8*3L zYuRZojR9rRdtyYF~) z<99s2PP>RK>>-M3X>9JJ&&A{)srUMM&nrLQy%D;EV}?>@n~E$RhCa`ti5q)9E@zzb z>Rcr)dT86|t%>|;{yGHlKf)|E2|7fnmEA199Uh`q;kSfZGZ5xd$xvNKWBApow9Jxl znnelh!6BP-gH3>A;*rMH3Sya7Xr}^VKgPhV&1^Z!pw9)vPgO*EDr5=fv>BZbkqBi| z5-Fn^o*p#@b!{4De3?zBE+;t~4GCADy#6QM80&>lFYKw&h9dIpvgJGU{6_!acsR;3 z9U!$Oc(V{U*oq~ATILI3`LkGxq0F9EF;AF;TzB(nreapwJxJnN0*RTL$CJ6dQ&8fw z-k<`}2J2OwZFvE!kTMQ}%8KlUA0z~%iK16X+U=4!;c{J+X$@^%lxnT&y5Jm@p4N(F zLxjjk7OKHqtr1;pjRt2GM`u-4?~#!SdOJ$i3e-n&-lT^z65K~oh4v=-P^~H15LfI~ z^Z3u`ftqo8AvZL#qMyVP;vYNQOu%!&^*o@@k|G+^`>c`5GDcGiFjpi}o}oJDD+d`y zdrC~}LYEu{6B`SLclsU21Wza+0`EYIwaT4Heqd=$1Bth|9#PpQaiQNcB;zB~a4lY# zWE|2Wt7DvDOt{1gS(qmLAo(YJBEO#LEum`Y0v%msk+Q{`gv*tTE5t7^F$j3afHLPu zSZOwfcd?)8Gs_8k-SL0su`{6$WUL<^yZOPT(EmLqWz9YR3zjMq4huqP{HUEyCYxbt zY)VqF^uQ>P#?bXaFv{pO>ST3Rso(%s=%OKGlfhNsBh?q6p;BBjqzG`6DM=t$3?K0Q zIMWKS3Yq*w%j<*5_7j7dlRQEJkhZXnSh}GX`!JL%U4uftM8qD24h+Cc^?WhF@_5~Vg;k0SVbC9InX&S9#LlQ;g-6 z1JSJ=0Cu{UU_SdhTt3m%%$`^jwr<_v1_>p# zKTSV2`9WGuQ^pSH7NR=RphGmSjHY->1rTOGSyO0JjdZt3$Bid-I z|NkPEb$x=|%VPooy>kHpvHTz2y8m|1x^y&n#z21n3pN-aoSYDfFNcIH zLN)}Z5@aN_D9sWQI3~x#YCN|LZg1P{&=&NLgQ+A89YSTIUS->?)48^+q1(B>{+Fik zQSiBY?Wdr(swjBB-Tl1fecgWYVcB^Qop-Y)E2jFIFg&OaKtAC*6Co(Llfu+~#qvC~ z@u`YtJF}X{J|g)I(3{7;Diof_Cd)a{OCispJ3DN*N(Y2F)g<5@m~h4~dFXK<=baXs zwh2kVuv(L1wlf(AHAR)ElT@pCri_^u@==UMjfq%AHI;Ty^(_>$^Cw&0%Ec-=J9BHc z{YkNGpXJd$Sexhm``7S51{3`bPg{??@noE0Nn}qAbLpNBa%FVX2Xe*6Cv(`9p<)*g za%I9hkPoBdPd0AxKUYXb=U+vrV3@Ms07%BfX%)yk;--4XxF0AV8ALd8`y%T><+H70IcUwdH1V%9_Rjx(sV$qLx8 z_3@7jjn>zR0o(y(M{n)!R(`B?r5k9E^{&@3$kF%*O{Yaz%V2qXr>Vm8@pdlFDP-pI z;}`zGmWB?a{A!Yd9W3ZqCK9on+_wC1tVyznp2J^od2!Vb?{b(n^h7I{*4m)_=5)2@ z4Kw%PK8b5`sIU-X6~Ca9n`u^IV&Tdkz`J01HnO@4{^nW;N;F(BP4o_--b?S`HA!f^ z*4dr~h|$rtdJ;2W8#SPzE#r`?A4kAmi5oN)6}Z@p(()CkpF!GmRi_TO_TM3!Ms;uL znbZG4uUM|T(SvJ*D*5|iM*By7hc0m1Edf!SvjHGRf}DM6(F zhtumk)rNHq6b1K?nTu&tr3>OZ1sblEP@{7c%M!nJ+9$a8}GkCLMw|eBHUa6gJ*F`e9F%EPJ{z)USsL@mQ zV9;x{r~Dd`tJv!J?OXDi_G;Jq21+?n80tq3`>u632kXF;Tsw8jG2rc^+CaFSmaa`Z zCfLYr`@T414spq^R;UDo8L1y~54P_DE}d&`Dy^Ksdvqf(Y?zZdR*J=-u35_0G?N)9 zE1q7pEYFJ#mVKKp!O<4hbAt~#+r>w?;==}2ugt@LZEF7d3`sEgLp-DsPf6Iz5q7HO zU1ywTN!C*g#v^Ex>%KCm~mIXb7BLCbaNJ9B1OA737t1j@u z%9v<}E9LTQs^!BGj%qE64y<(y7&o`cwb}H5l{LdShL3pZ#a|A;ye59>fc9&Rus!@y zsC;P_{zGg=++uT(lUxTF?6FVh$3XR&%=2MO5di&7feh(23rmI3x`3WkN6@slG&!tHR5*zN zr7UccLD5SeZ;T63wjR+F-dBdi-7TJ-!RK=THTLf z5FYmjhFJHD%|Y*wZ-bm3+D*Rx_|rvEZ-8IY^Z5swBY3Xz=Gi0JmAL9sjOqU4@%v{T ziC_Z$okp$Wog3D_iP6Cnx<8zlwf7wxOUj!Tk;e$`9=blXzS|nDjF(R@;+MFaQwDS{ zmHR^*I@h^v1}DBBP1AzA)dRPz_Z}D+O z7=qzqWvljwOjw@@*AhZ5m}JyjyBO3e#!e~xYq)X4B@cdn1WUmSs7|&YqB(}UnCyPi zC%<3Oa}1Aic)GRKpbNnYA^AG1<<+n>76kq7;VS}0s7dT@5iynACbaVViZq6SWy2}=J4)3VDF~Orr zG!LL_gR+)h`Mb<@9&97NtU+?8{lQv4DE(mXW!=VjzB5_^o_o#e;kCu* zO*~rsoU!TNXjNb5!pZu_b^vd@S1T`|Ip5QrVANB%B-?ekr9gKhO#Nsvh1Q9!TbMvb z6I<0ib&Fot6-GuSwbiV}r)ksGxh`*AjTe;{m<%>N8(rCYZKs#2w78g^q{8l5ocjnP zUB0XMdgV_jIU~$C46e`~x!l<>2hV<`By3-hs&_(Si6Qo+b-f2-C^ zeuGP5orh#)@y<>qmqUPQB~_yp<6|kg^q^#Oe$t z$02ooHSVRWj9c6Ce<|Dyq|Q1D+Z)?}kh>R3nHh!ovYdb25;2y)<6M18nqHwRsOj@2mSL|;X%9-MdM8uE+!SH&4W6n_RUejt9 zJFIl>H$Pj|^m8a5>6I`-5DP2%^xTfnmH`g2mS=3uZ)xF}!gM_X4-~yjG>UciWlK3C zqva|Up5*B+8pN%*4>>Z}2zCP+rJ|O~$?g#F13!xZJK!zpeQd&*{JnAth#}iF_tM#= z8GKEqAPINid8=F<_^K7oh?6eRTVvXp4R+}J<8=4Kx^Ju1@r+uf4iWwJD+>n5v3_HN zb=3$5INX#!WB>n5EIsY&B>uy>36l_BnhhGF0To4;?pL02dNHYS7Mp+k1B-5}e+12V zTN6LJRq92KYY)fcW@u#p3!W>T0ZT?*<2#8~k7W90hl{FienI`=g_yO!bvH~9e)&5|W; z=69ZhNOe!Z=3RfyTq`Xj4n%PhnKHVV1|E9_8gK}@5YuNfJ>>6)1%%pbngau)yT)XWx;MJ}rZW8cp=fGW6>71T#`FjY4lT(Nl-HaAW03Z{kr7bENK& zAM~`DJq6bVS4PU5KdHI6plSp!e%pp`mSU%H|JIX%wY?XUrFB>JYj=f=ooRMkfbKjK z^Td2qDhN$`Qc+gT)%9H!My2a4Z_AQ-QnuzywWo;f9PP=XxGt1FYQbmYUP-gPD4@pR z$}4pCuJIK#KR#M_0S+wpbOJ&%cHwT!LEhvF9&Sj5(JqR-%wOP2o;J(j)y7 zXG+-HPN`@M(hASxqJX~?q$m7StbO6$ZK25_)4+j#IycdFOP*D>K~d$#fX4B>B&t-O zjrRS}A(K8Rb4$MLvapsPeL;m|6bX@%GCse6FUgts8#jfhN`!CtjmZQdfA>bT`Uh@8pc)Wo3m|=tKeSMk^ z5DydB(b#T}yl=3;@H#&%$>HtoDZOW=Fww}14Ui)l>{ha;r*oD(R0Z)!G(`ecS z#pA4sG_6IU6GUYr=H9Hl^RJI7(8s9c0!_I5f3qxw6d=0ip@#ZKT8N zS~N`Hfmi+WwjR+^EYt@?@XM$FKmjam@66qS)B_jhrQXxD!V1mVedihbIT}zse>G-s z4$ev&53*>($BomiL*fpm!C0q)zt_r;QY|42th*z@=0rpb@>);J(w`gC;mp5grd}QA z8JQ-exctk_UTsy=S|cb2I(;B>Ko9<<2>eMSLZZPe?};5Y?8z^%dUUXnuu658#pFKR z!a30g*Z871dU(Ap!&G866ifCXl|Pa-(%q4V5;`h9E&hk=C3&S5m+--hYV6i88%%Wb;#kp%-mF$yt*u<*d9gdWo7~6v?(EK1Gz9n{sL+OC;(3AG`;QB~os95^||A^ZoJ=O`qLk%tf)}(QG!J2T}6`%H@^(1LT3A#N} z(6hd)ZLyH2b{UjnisL1D7HT@mV)el-allwQJ)C^N%A--#OGC?bM`T`j2faj!Ki*Km z{0!W;NG_;^Mbo?(6cVy;D`{_`pmKKRyQG?0tOAV`0sCHF$5pYz{}`L@8jAF8pEf3Q z)b3XDz<&nt(+-+WPT>O`8}b;#Gp#Aqixwt9D^t53bxm)gDK}6`WT8ExEe0deK||GaT0dVk_PR@NK$20)vCr7_V6V z79a-4oG7YBOZ<(>Az%&Ys}T9V5DQNr&^pMA5Ga64SB;yak4t4-B(0?2Z;(N~q)D>U>|R_;vE2~2MUAz!vAe#C#TnB)zpxk&^re*!-ZBwsKfyMZF z^a}!4dZB1EV`}_EtFj@iI=8;RZ;T*#KU49`bvPuPXZ-;29byE5W$dpo2vhGK!08=rIXcr=XOWc+{O`tl z1Q_Q)FD`~FHQxD2DgGy@5*lx2gxq>vk%*Z0V4Mc2?z`MtVi?>(zP04a(B)|+8ZQW? ziZ6C&16r63qngRFfnC2r6hluYAVZEfGsjG_nVIw@+XAQM;cWzH;-9GDVWQ-0IjD`k4};B^Y(UYXrHrm-Nbul23H}4PC3Z=jQF#z1P@x1Ir=B zidLR-Aq=ZYwBGlk{Hk|@`IA%8O`$Pr9Bq~{KCql)+fY!_DX2Nn35-Sc27P1FWI@lW zSR+=wF#_zqd5%^X&85tw*EL^Jj@C?SaqS7yrWqPY{aY28g&BG~NBPXN!V2BO&kP*A zD~4kAC%lnE=hZ~zHSS~@UdXt+Xod#ue&1lSX~P>HHPGj@NQWoR&NJORHUMdoT+nV9 z=%mU?TmijQfujUbd#ucW0Qo6=-Wg z*9u-qSy`FxH^>o=l2|*`qDkO-kh8aI3Hfr}{9-Bu`u7;5Z{krf;jUymA0_nf)Y3Yi zHJ9VbZSU#HjMsT%XCXEBP}y66OY6`77Z*7>;^bSY-c!I zlzWtAayyuzG=OUBZ}5SPInY3<8oxi#01Q{v4W61*c3VYy+>|q#W!eg-d>x*dZnL4U ze9nk&TS6Q!Zd^`G4dD6c1NGp!fMv#aYx z25bWX$C=UT+GY#0zpVqmY|8?;q^ZWS`VwM{!<56E z!lWU9UtYwJ{oA(_65^kgZe(MB-CAr7=ICEqypcFaeL{{A0a(Erg9&Ph?5k@{nQlm3|(LHfVL(SPAaeMc2n z9qo$&dQH9q45~zl3Q%d3EQCtktRsX5g0>Ep0G1H6Pi~hKI_1!@hBoKq^WdNV9Z;JJ zIevP28jbiRIn5Mj$r%zBGR&N@_I~j`&40rCy!pN&DEJMr3*7Us0NvCe#&ke3FCN^7 zWM7rAl!=~%!bD=IDuNsL-)cC-D8Qf*3&*~)yr&LaYV|L;lH`b z%m7!yj=S~%c;FeVVsL%U$@Jl9@e(Sd)QTFN zWVjk5tJr>gRyXv4zv}whbVu%Jtbg6vGNFee3#y$|n@3KP9cariupLI=S#g&To*HzT zJhYlpeAo&O;UAd#U31lkv1`oHZG{k;9&7Qdq@_ESLcrQ)SMjPDUdZH+?%Vn%#r*)4544 zP`?fu$ihRT=vHjqGochwddRKs9{qwa@vz9X`!Gt<`+u{^Sm^BiJphppJagNf96Wdm2=_=MnhGzUl zv}cRQvT5rv4QUfKF}=YF=L;{b#vdCS#{|bIv54WRYtPQ~xS}0_?IkglCg)HdrjR{k zXJTz`>PTS6p!7W|--!g_WPH24ReJqfEQcAYu+`7j2=>_B_a(sj%yX^96cM8nL&t=Z9{Ekk|Ks(zz!{ z3=Zb~3(Qd{<~yP$pq1ruPN}%R`DK>6c&P3|vnjhzQT_sY-HtcX6fAC+lD22h6p+2^ zmA@cAfm>5>NbQhac!3FUtXpY&jp~Zp!{#{KbLUNzD~j!DCCW$idn^hT=@q9Xj-r*h z^ASUqCy}Z$o;)C6CS5H|g_BMj@%0H0j{`}*MH&cY3bTs8i{9qb#-lJmt-nU%lP<}7 zuQ zYs_n9UB8uGv7hu7s!7Qt5C_^XC3+W==pW?1yihhaZ)BEM>a988c=A8GxXh1#`}b}^ z{=#<`X{!m?n?l+?AH?27n%ID$zoBZ2EavJg+11~~*mxf5e;4_EK8RN8&0J)J;R179 zk0g>=&^rYC?}}Tp*7>*bFWSbUoh5eF)|Td@0R%=b>9Ae;L6)u!xWW46dh^wFwZQ|` zf6f`aV}AiYImAr%zqtm_VvO%fyqf!R)Vqz6D3a=7#iUO0PSDlG5sP?5Da~8|`fz2LE}eUoiFhY#PqeOXaVecJgSWC zF$6Y>o9yG{Arnjd#nLa=%~d|S2(v|+$YvPdccL`cZYlE)vrn7>kMuHJKuld%*^*5tWBm9jb>eVfh%>MtS9cPOpuFcOd`T>1Eb&?XohcXpk!&%5>@YrHPpJoR@BKtcxp}1ZQ&Yq zGh+X~PEyVlWf!J+G>PHUcy$3(&nBvmFfA+{Bu4a-e!H}Tdb%2$b1Wr^YH8L7#*3_~ z-7&XdQGBoXD4Uz*&1*#NShjf#XzSRY9$#l#rY|x*8wt*I(>>F0xH?re!aL6=-#NtE zqt_`2>5Mx)LdYA|S*_qqn1^{(P3X&ybQL3kCHs7(nB%%0-su3AyyZ^JTeO3iXUMl z#;#GuKK*#QVwS@rCxmUI0}MO#Wqe`@-XNcPg{bPo^AkcD1~Q?Jq!-@FGhWGyB4T{>Zz^%UY#>PU;MyQ4_C9727JQ)HX-2MmkRoGa4|HV`XP^~Epd=1D!X zhQ6d?eN%u+>h50k(WC^+_$a0C$JpNczxt)1G|wc%*Nr<^ukIz{SXa5WcXpsZ z5YKP&@LvfYHIW@Paqke2F`BVGBLYXuiQp$n1rvARVoo@{f262yh&_Z$jj~*ntzN5d zG|b!9A;Fb_gfStRWEOhD8tEO*QI#QcXTR`*56J&HP!-Ya03DG50VVwc0wVeUPQU(# zxKynNt+)C2UtY$J0i7Te(lt5QXtTDnEy@%;7zzorHPKLrjh>P8vYi_=9rvO~(QxPb zgpICz^EM_mdxK8bIMfJarUe4aNz1GHFLNPmmH#fiDjAviR?Jmv- z3%_K(&!cWc6p^?^5QBS^Pf;AFc|j6S__4grN7s)})}&sKz>g)_Z;740`7DDsjL**B zbcK#(bMB{|21(*O4a9}Dt=w@G+!jCP-lVlPOtge7zFXT4jGf(9y5f_Jmu z`!{7$0uQq@-H)(u!R(mkWY1U0$dVIpAyhXfv=)7+Mpj15jX#DhH7(|hk<^&@NX!j6)-E+I+JHFrD#ak=Oq>**pciw9LiU^F z6(MONK`-vGQ>rKY@LkF;;4oaOM(CcDOp~M?W-LDO18ht&Q7`rohwMG^18%HYswQ~V zOi*&AcYDgAZwJ=}%DA;i`{q|8FMrjJEJ8hivvXn!K`E)3Z*jTP+||mv%3D#DZ?z{D zrCR_8-gQMRh@ZcJK*l+3Wm&!2(Q12hQBU1v^0@R(zBy&qOU5~w_Wb8ZjeQ|m5e3Fo zBxKQDno%)lvGAoA)m$cSentM?(C+l^q!d$!xy8fswNhOX@iIXST`^fTbr(5K%(GiK zRfgl1jk0K!_r&CA4Qi{H#na_kWO&OATY2{{=)$Iv!aF0ZrZTb_p~x^(*2?E0(WUO3 zoB{_c)utLw97IRN<`C}z`$Q#mHk@e41LN5Y6vC4=epV{OX}ty9NU#F@Up!s|l!0E? zHCkLalE^jF*Sl_P$hP1v9y zTiY1t4ief%F53rbM($X7e`O_oY_UR85gZ|vm{#ZJ@XrHF0qErDW1srCV)VkF#c`eM z{gX}!%Ex&;C_e4IenT9&Pez(`{CGQ}V|uorF;IIp2k`xQFIh|d3=R-l`T5~ZG;@r{`B|FhV{7IPPH`yrlK|yUBidpw+a?;*pK~C>OwdH)%>;G{yo}KoEezN(zDd zTeyR4;2GD_g6Xi6<}g_)g_~Jkk5guTt`DEXe^1o~Pxklr6#i9FLP&Oq;s?89{RIuY z9sF34L+kJsv!iFVC%r}x%6mbaAE_8uTL|#$eY0Fu(8DB$b?oRfe=|MebVe*+R z!yN~kOcWenD)%L=S-KsC{1W|pjv}~9=`(sC>WBkuYXfNSS(miFO4f$DLCu52t?QZ% z8cIw%H5^lQBK&Wf!b$MEOG=eb1sZWy>EA$Cdp#y2YD2zrKaTo~OB&eEYB%-v<=Sou zMjVql`il4c&H}fqQnzWVkZ+!k$~MLW)SEdP-Y1f8nvD*VKaJIo#z#zb)h(_F>AfOc z5tT_A4aFP-$+j^L=#+{R>|^p9Q}X(AZi8SoZga0DmtFXc@$Ne{EkjHJ`v16$LA-C5 zjcs5rz0CkU3@EUrA0d#cMer9z8G; zmbQS|gqIV9FAWB@BB)O2{GQ;OFXS0yiqO-NO)3)UBDC4g-P}Y?9m|nS@oI}kgk({O zL~QO+i$!Yge@VfTMxW!c^PQ{fDt}G1YD608UhT=WbbOi|gtEsAa|A@}DHF#jENg$8 zY8Ne-I{_UuzrfMX`7D->p6kBC+~`8I0a`h;A4U;vGXH zU*j^DhfXO}p;C-6u;SH-NN3IS>qo{~|GhQA08a~;z(0&*HW}ROIH!fZf;zYAYq;J{);o2|QsyoJ9zf)$Jz;H>%x3XyBM6pJ2bwrdjW?Tn$YK5-C zgcffdGHyMKg6uTLjKB_8>NLYbR>~R9Vh86Hb>M+r-iD3$3sL>pYDK$g5lkt;TzYHuRbweZ?`6gfmYGDPu^gom2v zlR+#&n^=m~jW%tOKKcvOu`os;k$Z9cHWY4c-eVfihCbU|*;_2z!ZXXHd+Vy8gNY{B zoX0#PFt<9{eJx+%OXRB}nRBd?$1}PM#zAoNEJoo=VS9OucJ*!N5S6o2((+k_P{8Nh z;`!{-?OFMYZ;Sxk79mvCl@0?Myokp;h96UtO#niQ%CUvw>7}$6e{qKBi~QX+)3v}rVw@5ulaj>P&@#OG#qwgUwv(Q=sbd%2 zvi2}y`gq&txK~HeRRK%ybgqda=_|UHmyI@;4#tUOChYj;C3X(~gkNmx%-N;q6E3H> zux0paw8N8bPWO;snQH8ZBqd=|Jm86?+n_9iEjS5UROb$rDq(9?8~-BK?Q!wi0nv3Y zk-!e;qKG#*@mKh)gxnFANbkxTE!=R)KnQANNDCOL`j)Pj(;9QXT%x6l`G#>RgDq?- zIIx}OA8)TJ7cU>psu;qW$=S8GDnR+~kFX_SLp-1(fMF<1Hc{>3($tQ> zcz5bI z+i@XRapli2zzdI`VBHpn#eRt$vSp@m6ZI@p)#VI;8%q?7i|uxv3Auy?#NNcF|4@kI zeJZ_5gpZqjwhZ{idp^L)g!jAmbzH9V0-HNW2SaoZf4d=Q*aEF^g`vE->4_S zrFE{`SEy`zHa6{ODuWQVNpJ5J{|w*};c;WGBRH;fFqKZ+>jIer(5n|NWp(ySq@RkY;yKB0h&F8^WUw z5kgodHv7fF9#qZVFlTUqCm4q`#|4=4?wN^IC*K@n(`yW{Zt1*Qx5?b}ZQAyAzH#m2 zQS;J;CRW~9p8|$-T|2*D|6Z~U>EZ6{m)M)N!Et`%u*<~QaY{q|)sT|6&)(vqW`bE0 zb~gQRfA?`-2ldz@wD>J6*yHjTdzc){>JoaC+b%?zus&Qe7 zug*^69BICjw<)0EjnF6(41NuA&wb{D)F>(*VA3p;(2C}NVUR-4gYfnA9u(%C2UgOL zrI=b48m{h;&$oy+^)>ul0S^AQzMpCz0;d()+PW@ss9b+i>4AqAFydDFcnCNJ9)Y5J zTI&7eU9NcU=Ga*YbP2Bl|8Xr6BRKbqX1x#$_EzNb`g{F*>)qBHRgwU=rrf5+v3zT@&B61kqd3_EE_m2saB><8gR1;dcWL7)pJ`zE zX}I#WmAuSfz4=bKW`%36`7{6EG$y0~*7P&&4F;C2+D>mJ=441OWYsDlh9X7zvbOcx zc^@6h$m>IC;Ptg-@QhPngCb^gw#_2+GUTN#z%r0t&v&EI*Abp2idh~Lk@n&uGx?Zd z!HH8ai0~S)Gb?nd=cCu8zu{bo*fm}tG!WtnAFD1(ftH1LYMjGV@LBE}CZx69*3(gd zF;mVhW-1INK=-Sp~rbp4fSupbSgIJ`d-`*_M6AP_Uz@Rc^K* zFb^ogSBqm3r9KYHKWO&|x5DWO61egO(*oM$a;E_f&PPhfEHi7jg+aF^gP(DZYUZ9G zlm~g7eZaP7H!+VdFxn1;aS|Us%d1D5w94 ztLkvm`zTrWVNh=kDcb%b^z{Jyfe8wTlvf8k#;wo7r*O{M_#9wA5)p1vRLLfWFvH8< zj1do(IdF%RZb3tyj8G|n z;^TFO4D$K&_Jh;It^Wr1HY<1psOyXV4z|_S5Zv?o|=^V<;^ZJ>9sD_t&RUqXI>j*fKMBrEprOwNH36A*@Q`=-;)>PQfa^jm$6@a#(&%^jZZFb$!L|!%FqyBmQNXF} zn{*h56bs~Ndbsp5&{$89*_Na;2gGnZuhg)CBFimo#YdhGdd z!SqLFp5EY##2I6MO@m*XMk<uR+g;j_*m#QYojUr_W zMt%nl8aSv}Xg9E=&iczg`M00?`w6+N&ecQn@PUGwjt+Kh)@df`Ij2JN7z(MLCv5Sm zc$CB9*$ss8qKDuLZO2l8{TBPB@>?if8mrbNNCwqWJ^Oj->RbofoBS7GAo}w zle;rdu06;Dq$hZY@U~xxW?JMSBKkNPpd;2`RZk6QILc0&D$~gPg&U#IM~>zk7p%G3 z)#pwwEh+o{Wco{CD;>06^>sFZO+b6rNvy1dEH5pC3|&eZoI)C5;E`?r?*b384ZKYF zPCe6wyvqmLU%8!h)&ru93=#{FyV*#xa0L!+YdW!=O402+(BpB5@p{Z?hhp%zF}fX~ zjA}TH9CH;ed7A8DOZ4%AVVFO*0sjwW?*Jr8(6x<@v18k|ZQHhObH_G%ykpz8r^oi} z%#N*{9pldTz5k6r?iUwvJGweE&l8#5b?Q`QSH+Xh0bk1;b$tk>_(_sqY?d?)q>%dM zq3cnAUoCnvXnnf?9M#k^2|RY3&hko{4y<_B+$i*iD3+5(F_5HOq-D*~Obu^YZF!|n zKc_!7D0$Ci*})j}4^t~(xf0b9q=GY9928S1yv_=`iP+swanU>B0qf(3ehBDe+pRp} zd4&S1yv&lQVG}Ni|7yuHU;I}RgiAMr+9!)CClFIgIJ&1-?^=uzd$uccZw+dM#0D$m zJ>~&4svKIOc?GXb5D`;c zGLdsf%0TV`J-NQ|k3)YN5+m6OEYt>e99i594vC4F82>i%J?HXCR}=bj>7FP#{>8mi zRJoE7RGLO{>5&v7SwvST!dSQsyl|9pDEzdfDs>ISr0kU?sEK=or3i6cvOt=+A+G`L zjI3!M%@{&C@XXkO%ub)psN-Lf-eRIQ-pbB%ft;<=m6MA`TQ5KIJ~5fE2U z%9nwabDbV81JQ1B9-W#Y-{dhGr9m#rKDy{oLrA%!L=%gbXq#=>(i&BgDNr;cP^7=^ zNlx+ufY~q&aRlsgHWX$$Rj^|#?pDkMQ#eP5ZRe^*P*y^tXyS33 zzA#qVn5@{ql^f#dq;0F&Qyel~EcvN&O$UkQHn4F~IWNR%Wby-<4oO&x5F(8TSE7bK zy>jCl--*`NNkyeg6h-HUYP|0-sBzXg*482Q%S5M(KgF`sa1*e=q8rkeJ5{aLW*L|V zsv-w|8%ULcwEswoTv}*0nhr@qE27-i7}UUk`iO!gV&r8PR?t>!t4Q2w%b+~}`nLb~ zzCqk;|LNSrd7fEj)x;&y>?3_{_CNcUY})STF2)wJzk$PhcWm)4;%rD)G* zhiu{(TvKjfuNLqdWq<8N71Dx|%N380HKzG%;X|z3#1H(lsGdhU2$LbSx0_6X^T3fJ z_hpXT!AesrFYOjG6Xy(M4xjqbrD{D7=C61isFO#Jlpz?9RKuhNe(XdZ-v=6eR~Ao{ zes7k;j>1e`oL83uYIb-yL2W}o}+tls=eoW@r-Fl@-hLd`w9MJ{E?sg$DzOlA z-z=k+mU#rt1y_FFG0Rb7`k!IeHihH560!ds;h8S$3yY#$-%Z#YKj)Y*mg1;%%q}3U zuB!Q+wM=s6M|@Ffc$==|)EzPdm2nG%T2c7XP{YY!!^swR5C*tz3CnBGx~iEMGDj9MxEh}(qBSXlSdA^g>IsIhNnwTtB@>w)*GMxm^Db_s z=D@}1Aj`U{$XAonn8axkBK*tb+mecx!C7csuEA1Z_GC8XhAYCs?luWvU&zuk>4&&5ua0J9 z5VWk>`p6_7(YotN+y5_2)HFKD8b8kC?#Kdq#|DQL1tyC+LY|((T$k9KQ+NX34v)3l zeB$z$q&YIrJUMPAH6q2iP>fDz&b$(5-fA0G9D7_;t1T*p{+rNY+i?1QI1PQXHCnKZGe=5@ zJqbKn+cNSTF&HTA^N35OPYEUdt8Ie8K-1*Snoi2{8K2VF`yfAMeHLteHfp_*h0D-w zyzVvJaKjU4eo0TrP(I&$WO}vNMuY8ISJgD>H^C@7FszE2sV1^)L!OxHh-&dF5Bt}J z2&;5S9IQDb&n#`=!Fs-Mr|N39DL3&gEHc+FZ2;Ri!3HzxXWL(w{9oU;q7xkoW=i`L zcR0|KO-kmUtiflgu=4rN$3Hb;<7g)}4jYg=<~aXjlsA4g2U{9P%j|vdCwcW}xwnW2 ztX)lytM+#m0%md6xo+bpb^o!CH~d<8+uo8l(%%SA8a9ML+ZruF4v^a@T?Db2AB7uv zNu!|v`RY!xYLyuJx`oS6z%p3eejt6NDWN`1#)9kB4L9_WA>@&M)P6a58X)Rd8fzlT zjM(7+QTl*-ooJXUWJn89iwY-Eb}NOPj6NF?MpxLaB{J()3gnof@q^3=>exl;po+?3 zH|i)0zQ`=w$GaF=2?|8Wbo}@Fdb~M4zn)`2$)PFToG10 z%ejFU_FQNlsGa$H=p*}>T14uVSI)nib#ev=-8n?4{5(U-WqY}Ys|A8-q9hvdiGJ5q zF2m^uHS||!{&mfq^L^H;|IcPU#Fc-;cEKYdfT7h0g!e1S>e}rLgCFlMMdv}vzjBgN z?JUi|l9n9ff%Y^f=QET1I+6H9DawVXG^(LqIA}|u&v_|dH4>aJ0V~vh%tFGKBXbY8 z%P4MEw2{06JPkS2Z>92@Lv6aVw9N69&6gpu^ZT(Bm^INlXuYnwW;%R|TE^Zo3u3(; zH?7=vGGxWAc_qw4zA>G^6)vzl0_pYN;TjJD%-e62H`Ra;x^QFqk6(sJ+l;KyzXu3N z;Evbv2F1N24=H_{ZD@t#^wp!PBY=7qGCURR?k>^0Z>IT!eU5;TdAh?{&t6h|}mr*B;N$*Qim$nDXWJ$-$(^|t~%yvkqkQ~@m?1^JoSIuuZ zyg$gVG)a&>pIxm6_-e-F=Lt0B+ondz<;XX+(3B|u4I~rl9saE}mlELHwqL%fpHeu3 z7oPvy=Ais%6$e)Qs?rVqpwgWBN6TyAb@|8lI6PJPb2}GZ@WD4&>DsH&&3onqj~!SF_JWq7d-S1w z*xo@@eZ{q#h{5F$c|BgX@OBu!lxDiSccjb=Blj)Jp%A*4rfnFI25=qcs#E^PkN!!P zhVH8LK1)s^3L1|GW=#e*Q+$QCY-fMDrhRd;3H94q-6}P(+j#Dw%>y8jRnW8$at3x?0%W+9O|swne)zT9;L2t+oS||W444Av zoG`D!LDd-Ov9XDTloy~==%cit8sCtBd_N~)YSdqDn(+rCubu-d?uCqjUr{|S<+nzK z_d+$^1NMV~CGpVj(vZ*L`=HIG(9_3+w^2Q68T+7GRoaQPgv@%r1NLX2&7IKvr1f*9 zz5^Pxmj^M>)9L>ggb7GPcx#67Au|e|u)p&a-ZNerCtN)FRdWRMxtQ=pMf>HJ{+_sb z_oaRmNU{M={-uhC)S(OM&GIePkV@aLCBd`I%7@e;IqFNZ0e(o%$HD@<=hKZV*4*$N z2*7weGDkxG&#t;6?a|B&A}c#wfeNWD7|A?>d~$s(o|@girm=!C(0QIpg)XIWdb%o=nxk0B1_3oMc3O*thv=|Reo%|}K z_*%N}OWcRxs($}!a}Oy$!XR3KbyNWr#2JLmOXu=c&E3<)xLg|c{DzJQ=%_jrAV2-l z6>nR5ii^1iuV`O0(iLy%d{iWHMv{hZ=INpDaQHs?)C0;XzMAiGW3&2AgSIR0{Q&j_ z3b&Ec=eo))CP5F?Achop)^gmS{d>X6(Xq70tp%n-BcQGsF{N}HLBU5D+LD~}V+I#G zK2)PUm>}mRpswvdaw^Ti9bnf`8_vL1C!jW;b#H5We2TmWKrsa5?t++aKI@OJkSrj` zXan<(U<9qkg$nMmwC{zOZY(m(gMr|O1(QZK-ohDsHzbuy1Lj{KIO?FX=t!q2g!7~0 z=RQ7vhxifXAF+nmofCg(X7eM!G`NFW#%W;XL*->;&`&Rc3}Jp_^*{8}zp*`d*k2?; zFYF)`zrJBFnr}BNNz^O)sapU^WYD-An3GPU^zsFA169z5K5hpK&WDe+}3i&Zw@lv>}S}uRRou z59z6I=$*9w_Dl3Azh2xle@`f*WOg)o67*gUW6zob_0638@vieZ>HXL-FBUxQ`!=_j zc2(4Zk+Y!(Y$`MMZDgMETX68iR5({qm{83Gi_Xm@Kki152kQyg*^xLm8hI$?J{po( zeJYoR(vjr#CE;USeJfOW&!n_JKFk^V#aoSXTN)thRwIoI3JxOYts6;ptH-C2r=F~- zQ+2PWr?Fg5p0Gkzai5Y)t5hj%$DrW@)WrBlyuH94LffBeH4sCqR4vVbS+!31LF&AJ zsp?|W@U6U~U>$+?q<7)XUjrMTMNa-WPVMVKdpPMt$@MCwY@+*$Ey~rBQ@VSiSC~6sOcL1}uvupc3RwTrzj?n6;v={v()L?o`zd7?nN|8b$(a7S z()PO%FLw*e$!O?dI}*Z2Gx5tltquu}5@pg4R*X{=bJcyONg@&U?~{V)HSq8W;zr$? z99r9u@|#m+XYR$f*b=>o?tn^T%7wFP%7qrcGvsK|{vq^#B}uhJL-93#OMlURul1n) zeq!QhvF>H z+lf%W5VSKK21apIWb!~s3}H|0;uQfTSE;kyXty_09Gth&AT;ezX39`Y2o47BK8Zj1 z+!pHy0ftvHz*JTOx0!WcALg%WM>%ovo>|0aiOJz2@Mv3=B-MZ&-G7KV2}5IiM?p7T zZ9ngT)f#6D({XdZHM@dkn;E}7rGd~vqek4J{W#jT=&Wf!Yjp(n#wOxc1vO$X&L-!# zLxeDU+vI$%=VXW~ZW#mS`AU&FF63+Y94t%&thbt{W zjBf}zn?{F;^$8%+XlP=50sqq{F{5wx-a#l-$!Lbpqn-R%ACgSpBO!Hi#F2yt4)rPu1ZvKUPatKC+1%F6>{D@LR zp+K;pXXe*O)mSRyR_ki8ka=h^bIMHXni5!QJZN^SO!EuB)aPt((X{?I>(AO>1bk|BXNr&1$AK^hsvGRmlB$%Q>3q#;gZ!M^k6!>cYUm;R^W&nRWmS+`By9< z*F%~)v$Lp#nk=JFbC*Ljq#;GfNpUW$x%r&UZyZU!Q*tb}lvt!~cKoJjeCWL2hmMB+ zYFO$b`9_BT&2owb_!JNQ5Hy}r&&-k!e%aXG*t{0-Q%+i{^)+{(16ahGOqUE*ar4Q! z;JVZ21=nfiBCLO;qkkgTSs6z>b1d)1o(yC;6LEM$jT=OXWK{pLgsJj zps|yQ!38H=s2|=z#h#PbKf|~QhX>FAw``nuQz*A2{KDugDRqnWNWuLm7BrA+pF{9> zJ=e{B!E2}Z#q(wziPFjed)Ei7X$Ny5{~rqX z|CZoXwQzQFbtf0GvU0VsGI6)~&n2N${X=QV7&+i~onE^tHezPb9<<_yFb?r^D`ce` ztqXS(V#+9ybXIG+d+ix7{1+e?Wz?Ge{gTL{r=1=qIVsZvxKsDEE%2nj`?z-FBm_!N zj1?MXgX86_HPjG>gY$F3l?_iqzwD4+YFdJ2HBGk=v+D|RL0$O;~u%B!VH*IT2uBAhf7u&FF}Arb!vnB&Mp z#@Ds8FT3nsc428c_){)6DuaI9d&kxu$53Op=_~=g0kF%WzF6w;Q)+Ir%gmBvw;7); z<1C#^rRZ00p&w@Xg>y{8Z)WdnB0<&McKj)$q7(mFZn`Xls>fZu_ZQprv(td7V#Pvs zCGo!=-D*9aRc)s&xG&f4^b5vK$89}bcia0v_5-V}xKl%>-o=sVyn`a)UmVxb;|`KT zV7Jwg#|uJ898<8(Px-24hs+{gzD`VG)*RMI2tv=MD;3h(+v2;Fbg`6f1ig!0Pjcg% zmy~zX;4F3WioH4$1tIqDVb&m%h|ZtMpFWEHWATHrC7FNNN-se81OOcxn2-~YH;bc8 z;_Smt!j!^@##aynKt+{Fs75O5VTeQyz5l>};(ll)sB|RYiR57_rh8?IMFj-0a|n1w zO?*Ngp{n}3Z~tI!M;RsGI1qtH9b)>&H=-;0gMidGNE>;=6!`%n7!@((_XJXmr~~f? zM`Ju;Ev93!79Yr#&_d20L%6`hk9-zdeAAQ&SdWRN35b9gWqg_fqSy}fKfCh*@broA z|3h%l+?0r%6chwx|9kt^90YN4wPLdOvbC~ja`SO>w{T$kPlW&XJokSe?Eh=lQ&x}@ z{mvp__G*}3iUaY7QGdBCIEu4Px`_A;j)ALoZ2X9Y*GbY+a>^pGT0*FR2qXT7ZfwZ) z{%mI?Plns|_{kPukeRxf{TMad<+ifrWl1GKCM-j;-Nw4cirTui|HnmU+O>ii?c3+4-y6&SAHO@f{>R}zlV)T` zn9;+PT9(!~U+%uF+88Avy6+$(f z-5e*@p2n$y=;C+~c@(ijonp=K0S z^nE_G=9{c>Us-!>%=QCy6KqC5keDw~ev(o-qJW!5IgG>n90zrYNbrcGI%Y&(FP9{OS#RtFA9U{}hgc81sLPA?;Ro2F$PU6IHAK zt)zx&sI(<%#dui`wrwm!TwERuxK$aq{KuTnD^5^VIm~Z`&;E5HqAZNj&#TXH_b0UU z!5s(VD4RD#SMrraia?@uVVPf2ZG3T*TS4Ggz_{Hx%7b2Er4;HrY`{Ni57Jio#bw~K zYl~5Cks`%nLgBG2ZPoj2sjk9p*~{|TIXsbPmWY9+>J~k%EriRn5QXZW)Fp3;{m3D$u2lml%Q`Kzb6_=KmI6R7pX4U5kF4)dy znJPUoF|3x3C}}y>To5r%7ULPze@U5g=Wj9+Klc}HhO574$HZ22WX8x<&Ymt}3`mEIAIPxDbuzowM+ z2$Kfts6D;>Av&iE_^0uYjFK7c3O=lkx$C zrSp;KgON49hAzxR;mk z9=7k!P&O{n?!+oK+zwAgfxRgG~jbq3p!h))kH$TcXbcBm~~ zNv^s}7|5K9q=Ho$m|l|YMa;|dYZ#UZuNw{@nH7Kxi*U7-#;n|8Z+4g8$r_jXtnfCD zNA8Y8u~sBsj^v!v1$-UMABEz+rbf%b2Mf1jg`9+>*Q}(?p{wHRRj=@4clJo$h77BK zgSbWv`1_*v98D-bUNM8>>KUU;^ondDv#|%Clm&P^1ykY%smf*tS0DPms%s27WD*qz zX={Y$<7qo{<@C#ih&1l=HY+kf=AukY+C;m+S%%W;GTCg3InruNr%6qYn$TZl?2FAU zUH#`@DqQ9F%Ko#~4oI7gWfNBAGg(F&k*rKgkGCz4*GILUuzxqw{w7F}W%895mNi-` z3Lv@}%v|DWB)~JC|A$a`7Cqr3a_x_s*&X?G^h0L z#3N`hE&4h7b=1;@y{aO^>9^@2owDn*@rshT;j2Wia2PyiT5>$mHNtND$8}kZw6bFJ z*LT;__3*Y3Z{tW-9YgVjREtH`Hr3Yl%E9|snIrO8xX;_-8|?0E%2r7b%kFEmc6B#b z|7=Bg8W4LJgymb^Tdj}A-q|}$RAeNJK7q8feD{m0znKYSY$svx;ykpx4 zpcf{egOdScbI?+unn&q0K&e-DL12NG%>3KZ&dH<~+V4>4@leglX?jrrj7K}*RiYX6 zdp1(2JUwVnzS>N%b8{WLCZudU0lM@D%lZD&klXH2Cf!}0tJP6MO0<|i zmP36lwqNs95J(wZPk~6Fi5@@CzfJJ!tgv~H(q7mgurY>K-BQYYGhE z%jV4*M2S}5ixyh(4(9+jO(L*OUrJ|^&R{Pk(LHgP5?|cUlWYFR(d$yxY!cMXnfi4H zTg!z-E7jG}B2E(2+J~atLx4K+oDU{)P$AJbnVz1YEY|>cX7H8@^8z~u-ZL>ycBhZfXa4sGAQvx6Pz7Of}@?eFpK?E*}VE7nUvH1_UM5RTcWJDX4=U*(ltoa)v%HrN}1C$%xyQG=i`8i87I*GdqalfGdG zKTU4>Kz(hr{Ju{#U$%>=IDD*D{A7wC80;3ivL)u%j?KWp2k>gPJ1orAi+hdZZE=g$NN4$Z>xj5gz^??3s85ZV zEASx0ed4{PRdZSrjF(D1FLOyKNfBj%+7*g&Z6Z&4K$J!dFJpaehC0d@?ck{`Sm6T1=T&7m&=>HTen9}%U0R6fK@shOMINhzMGh;BMUKe!UBY6K!+ni~ zHps?xd$ObJO-%A1i~0szAz?s7uah=nm)|78etJpd?MV}Zf7sF@7b6ADdB#7n9SXH= zg2^0Es+ppPxl??0AEZt1_Lu2hN8_4Yrc`uzOP>%u7RF$AuxQ7J03TdS80+-=L#xsj zJiqIk@`@R-b%8M_fL0UQbU5W!4pgh!fh@)qZA%fD{NiX~6?YD{WsQ~Jzj1%GWdW~7 zj~8>Y*SvsXUTK|{Vo9W70YH3IDW=v8aIgI%|0IpB`hm1uVIxCL}6>&dOj+G7}4M`q?#m2K7NUL$j;uPuvTZEfd> z&n+VJcJeK+qRV3cy{nt2nHUQap99tsfH|dbQj)}s!miOd?9|rA7bdLy;e?k1V(L;z znW2HZJ&kiL0Q>6aU|1}TBOi~G_J+69u$JUVg+-4vN*47gGQo*0^pnIvIB@fgXF2}j zS;;eN#MrXVazz(Jz#zz?@uEchm9u@w+vuc*^$00Nk7Y*7aNH;T$4sh$rXB(5XD;T&repZgqux|G$8C_+E4r!m4A0c4k{^mKxmLmTE7> zJ6R^b_$(fOFtc$-rGD$U-zKJ#heC(Wl5@1~G657VVgHGlBW-aRnoMKeG1Yv>072h7 zn(aphUX%`Fl5NFTqeeY>e+2lARzxw|L$bu6}P15BEr= zlGxZdBl%Sk28p%F!yvZ;p(}T2ir`rjNZQGdAGJ0U9jA=)aRSlfi-%^p08b~}Z)(qq zs%v%vp4l`Wda;tDZ5masc19}=IuF!(pCbP6`DgR^!~y0ykyBtCvqXl?!bgkBL(<@C zqZ)i$a<0v7@e6vWQt3XnXTl(7vm3ji%`L4bCS!Z5{WQq|=WLfs>a^byAMYj~yx~l_ zjepmm74olTYb94P+)GisYz+$H*b9_3ji_ z-VRm@iy6)xHMqJOy%?GyQP=DnGR|-OQoh5$Fj8{~igBuZ9^7N_2VF&5 z_Q`2=&m5s|*uAlCC}#}p8dlcJeAVj*H!I}$FzhP0vtkhG0im?Yh1mWCti{ij+!IP9 zP(oaQ4cXYiwPrZwOaIU@C5~sCN!=dhc}_(uE1XH0Nm?-;owNC8$ z5)_5oCEJ$NPc&NyM~+8?q_=STPS}$K(yaYqMz+*zwEY}_+~o_C^OewE0CZX;dqCD8 z(}@=LyX+^P*h}ucpO{aWuYh7NVX@&F9T)Z_QJN6;B-$hqdqCP?J1t(ro)+FDqisM+ zOnJlJ+I+m->6lT)6%M4;0jnytepQ5)S3M)Ame*)?H(z&5Mr2H=!)Re^VcR~Z3$;6X z;~hRY^LnGXw}*Y(SUtzH)5}f8vw&ji_ev}EJ>GaDr&~P0N!0xbd|MDh$uS}78h)}>v|i6EqjV!Qm-Z?(I26y+IaNij|+Xi?4+~B?o zeD)1~%?dFCv;bNNM|AE!lL54!Qlo3?{?Xy*f4-Ojb7@SblECa(gijKmQk@cm*26s^ zQKeZSQ!h5`rvs&)J<&@kd?HI`a-Eyg9OR8Uy)^6&^7X%F%r7UuRtGU6{5U~bD7D8W z&`EHiB>mM>AQ2f?8NM}ux`n9<&(Dw5wK!+9#*GgX`2o4M0^K#1kK4SP;>lFFZ{t?c zXYx3z7qxjDy|3E(vn8Ib#Xn;nDzdf@D2~sv#H|ExH>$G7pk(XEo+^LonL(Lm4RV+S z)6se*k8#X3`);1KCOmueytGLbc}NyyE8a5MWoob$qXct!goUZA9nV%)I-xV!M&bE~ zbAOe!imNs`!byurnko|F}kE_qoFCzBC5VB8W1?9TCLli4rE-| zIy%b`Juax4=lN%mk45RD<>P*34n{$|vhuBC+QTAbVe0j zGTi+wS>8Y(w>&Yl!O(kQQ{*C*b`4WIw&If+LA>?ZAU_@TEhU6E-#4V7HX{I~i<2F; zdCwtsu;yL|fTwmbNQ@Gw=Sc49*m9ki2Kecvm=lZRE_X{>ZW{zg;rG;2_;3yhNL-5z zB$scm{%mD5YYc*6@L;3HPt}wapZ7F3@^l2Z?r~)+VdM4WoWc0j>HYV5weGe@*^YW0 zC!1hH?NDKVoXx>^NaA8}iiX(Dr8`dSQWgU+s zlNf5!3sFP>^w^amBMY03xlj71Td0DHO=y|$i!RlDdlKkb^t}4W|C1; z3GE#a(O{dyt2?#I)a(>cXH!`AXjy3Rd8};C6+B1`N)|KlqFC5D*k8hXmy9&i(>)-6 zLz2BptoY1kPTNsX!tTPluCBwzkb^-MJaG|Y_%JxQsu=kdhy8B)m!M%|f!)K9ziPq& zpw-bVa_EHY)Zr%C5r3E;qOZxx5zafBEQc%NLdh$zt+OGc0?IRuLvU4HY?Xecn6V61 zSm$)1i-Q{E!aC9x=P6<$@5yIrN3DstPr>5OVPI+4T8M|$rC_NnF-Cnr_q)UT+Fj@? z>?`&6!iV}VeJ>y!5$~LQ;#cfoOgG_f-G$w`%C(&sApTUF z1ToWUC300^_^h>Z%Eg;=&=V2m11B^Z7B%W8X*2cjoA&lvn09xsiRYSi3(JNl;&=?c z2RF^6-PjF>mIfVm6r-OeszB*6P7yCY)wj2) zuq!yfvYG6!Qx0;HK%X>Kt)+EsuAdtZuQnWM|4t$Hr-`mgYI)Wd=yyP9NMByuQ5Rm_*YRb2VQ20IA2ieS<56%vE3$U$}Zw~N_htaUB(GT*+Oz3mnuHwP<@Jo z8AZ`q$f0LUUQ9gw3qu1kBTMFXIHxv+Qmz{Cmf6O2h?TapARQ zGKAD}hV6z=OOF;u7&P0*J8-`i_r8veaHIaxse!ua1lSGif&x}i`#tPAAFHuGj`#lQZ~b%e7D(iX3W&EC{5)2XmD4Ah!_@h} zJotyY^-s0uGyLimqQ}s(TM(r_wC&=^d&j)naqJ@L$`^9qK_md?OZEjXy`KuWt8w41 z@mZJN?{MF4@L8AKPc^lR__9TFm@MU^a<>(~hVt@n{Gzq(BET7B%HtBJe@L!7POF#+C?`lFmDW(Yst1upd`ZM=hMQqBes>Y=wX zWN83|)&nsrsFx0Z=AK|%@ZV;)@F@Ql4l)vVl0^K#NX!?;-5!x0;U74s_<| zZ;bu8U`U}(3*dW!JtMYgAfg}ihA^z(~k%MbsDhb3^72*IWo)(4>2oz{R<&W`O z@cDc)ij!tIa>(jIGQ!EJsf%#o&(|yC0{>SL+R1XFk|)t)14I;phQdj+e$-*5R=81N zv?_gNL{ZFri|0h5kvw$`oRf+7`V9%xe=HM_pwk5dK60^+GiDM!Jfr z4UD^j7*i1h_YhhSNDqoP1^$YC{(6FCVyX(4x`H}WJ&KBAWtTHU-QS+r_9DE~u$CzZ z^4XBbww?<75@Mz_xaSZYGigP38%_q)xRxTg*AQ%5X+^t@yK>BErVLHukday@e;WeD z;xr7YYVUnL!5_(~n<+E+znjq&%NTUdt5EBM&C}PvFIO9cN_UOWby059gLz%8eJUPbO zbTY)S5r2GL-F4g~@z1*N5grX0@a-FhcJSeM+_adv8h6C*FpQhh`eM4Of#SyQLz}dW zpAl}*aB86%KSc!>;Jz?H2JhH`cEgMK+Wem*!GStvjK+`Mnh;)T4_sndW3|XQn|0>?bLgNrGc-X`* zm6%V`4%x>);;VxYu;!V>4oOIX7<~aI8o>He7dj}$wa+k_+W+n1-tu1ud!+LZv2Sjv z&=zMIwM1vDMAD=I!+9j|od;JQ>5DYEESN!+V`wQwb&!msunhL4kHC`VlEi$z0XbB4 z{tM%$&buBD69Hn8OvWTdB-mMim2e$Q12=UO|F1dbhyI_WLT`uX=5@0}pv09+jRX~w z#IvCq_p)8aid{xraM%e~?=4YSB7DW7R0wvgP?M01(l(92cv4dnmB?R*P{1ibEWq40 zfC)eJi*{j;;7^sRIbI0~buAUd14$VYio1EJYH_0w(a5vXpb@1kBlSHEriA#M5xIaJ zg~0I6DGN9qY2_q2&92O%GoH+FatRe=$R8JS0SXyk*`x;molM{roD5-XiEV0$D3y#E zKKYfR@ZwTRNjap9Qg_OOypi<1F1Z4m4DKQM88x(wA8OJ=4f&al$YOIHxd4?6FH(H; zvL~QKdf4WtuV5ELY&K3a5LuEqp6zcq$+RvvscaUrWa*FlG+XQn`B0Qe_#BovQQCYg zZYdxQEfK~iq&?dj7O3(+TlT?VT)&0*$^MUy#u^q#u6ddc9>l>b1>%m3l08Gz5I>-X zGt<{M#vy}yPJZSME%WyMQ)0-^FhmyV>d1Su&FQ6%q)g31OA@dvfB_(77nLQ6)4H z=~MHOpjeQ7e`hLy;N1lfFF85JO}&LBr8AOql_E?x^$EhGC!$5=6zW=YVuTRzt`nhv zp95vwJ8zF0r9fzZ?@hIYOSLN*arO=!ny~U?ewl1gnMyd%7ad-mYDn4xHBK!t;_h5s z)Q~&3FHi$^CAa8`;7Z#`<*A);60QgR~%q-I} z+RZeQ2)+nj)8$e7LZ}k8;>ipuB|N>21knQjvK+dU;ed^d z(tWZa<}Re_Ur&`K$bvhoj1k|RDdtOx51qZ zSF3)V@(&63I;?-9OLy2rSQy-7W_s_Hbx`%2P@o?1Gs18Z{-R%W>hGlOs6Ym?K9GI3 zjhFBdEoE}oe(R-=lma#%Jv%Wq<3gH-!or`uow#q!rkO}O_GQwXTjuB2&V!bUmN1dF zqX0kW*eTq4}woLJje%hxh7ZPTRpj!HI5@AXR-KQ}D}6x3EGs#% z%g5v#Q2}|hRW-<|4gx~D>}3p!-7{Ojn6_ZcNw1eua6Y*>0pI}q(m;4w`@*=|5q1!k zBU&F<_;gvWC84p}Z)QyDO%mJMz?27!bN|fJLp#61mv>}(Vy1i^rmQ?qx|p1Y1UdKq zqlaulIPv(ONn4Ibz;GG{b-0WUpMk0Vv3V_w4qj9Z!a1FtL=+9I9b=UIYQ$4AhebhX ztEq*u>go^jF;OZzDPlW}iOsOSCQfV?3X>VgWZ)*CFJW^DaTQT5g5083+Z6xMycSU> zC%$IpjLuFBMGbXTA33XL=7!F0j#nG63_hcVA?d6D9?vf9nwd&XVM3jawRI?hZFndP zWlkM-pE-+Hku}YcrIb%O^K$(!;0*KB9hz^6{jn%CSM@usnKXtBD55)SD`*xkMiy^x zJ()&AW=b3Yjx@Ek`HfeViANi+Fiw7Q6FJ(Y;{PD*9bjaOqIKQw-L`F4+uCj0wr$(C zwcEDM-L~DkZQFi*a?XA4o|}{Vl2u8q%1mly)So$KjWOrT34jjTel~<8w?{bFEu*bwaQ` z_L??c;{IG->+PoN?N2SVrt9dHaP-sX0rzH^tur_QmGKQWyrb_L1OUphY(nMA_e1OfPzbao=d7x0~`qxuIYmSR4`80Wlw(9C3UID|Z;xlOoV% z4V8;yqJ#N0;F*klBO0HrmLxQ`11Yy>I~lwF9eRS< z$Oz4OlQ~)Whnezm)cZ>V3n%^^T7ucw2+eJiIe`3-4EZ!_okf#&kTZO!$8`5H5tAoe z1lsoCH|^5`UMpPrXUVdZTlui$wR_s8bmTMV;;7#?&ipZDO3lHZnH#{_f`5|z_L4uW z2GQs3pzZRq$5TZRdR5{uv`HE!wO}$~tg8jTq1ho|ijFeA=;K=Wc`yQxURjMj=mNcG z$mGx3QHMPz+nXi_O)s%z6iUXrE>N9P`RU?NJ!DmK-VPz;J(^Kv;(2ruyHPrk@~{=x z0c&cV@jfy%YenZFNGUYobBhn1ZVng zf8QPeVx`0WMvDTXbi`i25x@n3Kn#IE1c5*T5l0LWM+DJ{i+k}+i96}Mt1popwB2rh z<3#}hW)hMEfM7dscDliJyy14d`Q>=SexOh9c+(IRw8<9|q(O)KK|J2)LWiq;eUR5y zHH&lDdqjDG>+O&G0mAu$$oYcF`2x!Mve?&`liM#40|Oydh`X`V-xnhbA89z;dzA7s zHVl{0aOQcmPXI7fQm;GI*SGaEv>FD2LYT8{EF>s18y7YL3nUYw$zf*-Xetv*V~b|= z*^~r=bF>c#0^;2l8e&8f$?rg(-&X)(V=p|Sd%zGLRQSn}1tyKWaNpcB%=5Bgp35cN zxPmPk>O>$0~(0YO$Wl`cK?e} zj0knNcqcr<=fMDLd*HPc`n$?2!Z#N>`kar=cN+i;772K7iQvi^c&h{$I9ybaiBI|?nz5x;rutMCGJh}y2wpp{M} z#cngfgy%FiCU7dLqElGq)cJYphTpPi>V8D^HHqpFV)Zo)^*PG;YwAda=wUD3!rs8d zJ&52Qel|kfm`Iu6Y?w%Vr^4QXhJ%&TgVl!#I%sZ#e+35Bi1sRxZdu_6-)RTmv%}NK zL^n){ZRz8z%iBnLppdqs!&`~=wD7{+w8GuEkaE*8Z^y{@V(&(MBf0k85pP|EyHJp} zulc)11iMBeIMOj4N+a4Txf?R}VqX}AKRAfLK#0EzL2h+nZgna44kM7^G%f(!h=bTeHv!6fW%wuS z;1@XTeUAm7e&nhQ1rzR%J$ngWck4ul8COIORdu(9JZ2(lXpuS7Xl?R@PKx?F`mtIU zfndioNoSC9s`ztaKF!dd>`>UKP*{ne2+t6E3tC5IUj8&uGoCctu+A1izx(1Gfu4!l zm{5wKx4unxAK|%F=s0)EdcPJ5oppCsTvcTTb187#ja8WEt+dNqLnY6a5zEeN-mYz! z^|&}k1z^h2A-DKb9w3iD7~odeunW$Z`LFt2M`7ifK(TX*1|_NBaGJkaEI;)lQf1Fc>ehpTBE=CeE8(ak4`?x2wc_G)4v{v zp>_EeZMWdL`o%mKp=q@yj@acro0HK@tTKZ*bMQH=l1l8jUJ_0`pj>y+JX>_lALrR2 z8k_M~+a=7_;eBxrTVTcDn!a|H?g*78!hTf)jo-LMtHPo*3CI`2g|@$R@-rjoP6>%j zg?bmGwa@7@9Yp+*Ez<0wYjW2K@0w?nrN=F;8pam$$*!55=*Lg@_wCWq2m(&`s7n0? zT8o~xJMcjO4*lB>NJvV7r$oXFFkf|$5O@oSQM!wmy0rfuhptg|Z{Qg<=VknpcFC!L z>oa-8Q|FNs_Vd&NJ(S3D1|jV0TKX;z5y0ZLQ@y@e@)9jf5%nw-h|*XlMb zxWzF7<O zV)?lzg5~Z7ierYPG5yzl^u8e~u2Kse=n3%!uaS|BoSH^)`^i;oV9qubw1B7lp^U-< zp{Pu9(J_jX-CsAFP%jUoua*W*BK=46Lkd=Wc-1W#x(W{Pac<$7aM0E0;1-Sf!j-ML zwJnf-r^cmv0JC#U%thw9|V z13CSleyuh9xde)n7k=Z7?Z`yB*dB|KfD%^0P&NX|pSn#8B)Mgj0sa?$ZN{-xNuKow zgL3TMt}0wa)2fzneXIDmT9Aif*Hrx!5M7w_D6nuG-{>PHl26z-;V zgW^GcUp97^6=h=&gOYi62jy3vkj3sD#LW;O4ru*cB_N8tJqRKdE%?G4x2~37vCEn} z7%%HZA+*4GQmEEW9P<@K-2fn^-Ao0bl74nA=)aT7FJ(Z^$o!nyrTqkpy^rJIl>S(E z#zvu-%%pDA=H58=kFwzrCe11>Ra&8^!Ng{XKO4^NKa>wy&ZRq`7BB)lCNkKUBT>Qhx(zA`FCB@<7@Q9I6ae6Z1jZ(8`f@nLYJW^H8EgkI~*d< znuq|=c(+v=2P4zX_SpajI8=oIIHit|h^oE_8y?UmxcI_sXpw)OI4uG7t4wE*>*zm* zo;J{IiAnb`J7DJevBiZgbLd#F)mRI)2YEAUh|90zU=jK}7r`!~g6e;f>*$nyvmuvF zDXN%J`jA7Qy+?obBMmUyJ>j-)7AW>8`BHy`Z_`9?_ zhEVH}@!XW5EU!Ts=uql^4(~D27{DcC|1rI_?70egq*V-etzL^xy5yXdTMyK9>hZC# zBEm6;CSqE6yeIlsNz+7&Y?Cj)%uC#jXw<4_bm7W~JzUI4K}I4DW0YX}mM*tep=~3w zzLE!9qe6TQJCi1CoY5g@SB$C~_(!`}F8Ym%xvdRkzKP4m$t#sfw_p+(i(O>VQ8;|R zR8B?;6~|ShX1I?}0Aa2RV>6WdHjq%>FrO8~u3~-o~pjDEhtIzV2ZShk!ifm2?eP3nPcRI%R zZe9%&g6WpT(sX3+mC=AwuIiK3WTo41{5I{;v(Pg9xRVeYl@kA~w|70%A+;02udu$` z6*fjxEoC$*M)??cLO>hr{NOG;Yr)@7P)aumMK=Feg**Y0!IJ!>^o9?lknWpOOwBSyuawrNohBn-;5UWhsR{^v}x2A=SA zGUE-eK{sY#p1bsDn0dZgf6-vARfk;I;^xU0MdgD0bAU5E$zhio^Oa`;96W1WoIw)Q zo$(FkJc8xX!6n2&{eV-{4R#@31#AcZ@g^$GwCQ;((+SsUu ze~pNr4G;;@2UvHbLO(iY%JD*JZUCCY1?HN0Ld?$3STC_(cnWQtXPU+-@6bxVzB_4NXi*_J~AcgwAQDsKLwU}dD zQ-13&h+onfmL3vMCo65-6w&o}oeBGZ8;-%Z(|E6_5kX& z(l*_tksC1&Xl;2jPg_8p;|)BS+|n=5<4z{M8SMPOJtM8Bobl{sT2%A*;qaPk`L;&= zb=EvP+y*l4z9bg!Pb&|*-EMLWHZ#+!*LI%!nbA5<9>Jc*le>inGWO~p%5m^)bkkbI z2U>!ZP&}JGM+F6PVgfg!dG~QKt8!sX-q1M|`3T5QG5DLmsMX89u~Sbm1WJ9Ote5G7 zs2?YGT|Xt=rT;?bEYyZ#JX-CVe74@S_-3a#{Q*s*MhO2{*Kd0^P@9(o2E%3JJT51jYgCAs|diFrw=71JUpmS!R!q?WkGUMqm_EpcIq# z#hoHnAvHb#SgvhZUxNSqmQR0#%3!cIA-8PeRicHelFYe@FB@hq-f5nOtk!t6Fi3JF zd^jJsly=v^*Bc(83APFtXV6;B7k!S(qVVw+F~oQrpYgh^)ZI#r&)H~Lu6Wn3VJ^}r z-^WUrhYFAChFd&!v`A#u;bVtx<v#X8TMX_rDDWjvK3mV%-3Eqv$VQy^BCO&Aq9Cz5K11jec^j~A`~q<2@xgaK>fFSB ziLKW1^?ASPrRVbv%|HHa@czWg$D_7)2JZ*TNBLc2R)gZXCnV#o-m<$Y@&Ib3C|75C z2DS9_X+eW`#>`U#Fw;!R_n*H3aa*Y6Y-iJrq}+_W<=pN0@x3k3cGoxjSC82TRRXWMjRerHZ3 z%Qo;8R}dnGOi!2Nq@&G!4JqLxRsbO9=i3$@eUy3QjEWMg8r@aX_Z7D@XK@TC3f&7O z@zCJC1R9)U#!>WnjNi|M3F+Cl?t7Py%E?FP5vpD_D8u67Cpu}Vtr-REFP$zIi=xa5wcC%eGp`(fT|dcgNv89%z6w`>Q{Vv|1^r85{E+Kdc_@S2Bf%LQmQa zdnxWpp@yx$|250#U3P4dO)&Ac1>;)XeUfQn51`%PHN9xcKJH|n!q8-{*2uITyx)y(r_ zzu|UJ-TX6RRsY*q&j^hIT%B;ruSOaL7tMmRCSjKbC1sGJvO8&oSNY~|8kNpplk}t5 zCU-@O^j#OL5w|=>nUAm@q5tIkj%E8#QjZu%m$;v7K>X%Xr_{ZMEC^=`1G@ad@7P)5 zyH9ZS`rFU#*g&w18QDiI2!E<;IUgF}^VASJ62^qJJr8weM zReNv;&7|Oo+REE`Wj#V5oIhXBgFPw$=s#S9l@9KV7GzDKZUNXUCwJ8m29O+LXLi3y+@*A4?;h8f}5Q~LY4 zz5p!26cFys-v5sf`I@>zpe%ZAk#pwXV!N!ZHc!lfaL+HJ#3Y+;wKQa@blR%>nI@!E zo4{t>^2&&B(7}b}G>Rjs$af9(Xv}|?;->57*Jg8DGo}y0wyNA6W;9rFDcivdkxbhs zA?(@n8iqzfjR)`1WZQK`E$X=Uqf|RMt>YLk+XWaeV28CM@^t<1ewbZfNxe6u}J#bxM zaVL+1eT*baf%q@_y8}0IA|xu!JHRgt<4W*gt6x$9@AM#3eq?XS+x!{dR9f2V2Dj=& zYJwsR{2sa<0&ie=YB?Dy*dIEx&xVF}h$H(`HCsEXs0;a1*EYv>8wraa$$vS)_f-$u z5BBlHc6vbfeZ!14bmY4MD`6v&`436w1Il6c7bp02w+k~*a}=65%fI6X?Pe}RM$f}b z>fZ<7A?b{6%y86r&ztFUcOs$W=>-nJ*qPmL)AF6a4#2HyWvo8XY5oR_G+WFMT}c~4 z6L9wRTv|eN(JG|_pzi1EhIl^ZaDsHLR=X5apk$F#VuGHUE62CCDN;U1IS2VZI8wU5 z<*Ckv5qJ1hOs=n^#)tFozhP50GvrOOjSw;IA%EVgo9yeuT{n*N8kS!qI7V9-JAiv; z+nt2OW&2+mNJbVn#R(^;Qr__kl|F16vSkNPJW__-=5*csoU^8<5?0HZSn3a_FMV@; zIRJh!TYUGU%6Uz@`NH4*d-X%YV{vuuos{n==n4%Z_ncZ1vttcPVbXA|mB#2?U{s9B@S>(K7 zLRj=Zq((^$y_eTlkUkw#Dn5hE%Tr%@EHm^DYDphjVM(Sq#a%<1{W7cm4gkf)v_^^{ znD{$D3i2%h5j4Xx+}&>CTKJzj{AwU+%C(+!NY~#alDg0j&5q9;dMpHgK_o&vy zIt%mO+Hdgi&gWppPdB2ackH+fvV9Rqf1Pb!3~-%?pk?~&1q9C>>#W?bjr(YKN$~}O z5yWoK`hcJfBJ^ve|EBla;AhKiI&vF66$tylWG}6~wmuFEsBI9~s+|R)=ZytwGN3l% zr=*u&(N)t$H1AJAWk+Q<28;u}6%-z9HNO5rAS8h6uPx&NA;l)9wDk%8vchk*^ql-G zQ*3+*$>ATDqp8ZrbpM`duq2)gH)dEsv2w2-vf>Tb>jkoS) zulx;N?8FLNcqULUUF>x2K4eeCOFZ&SXhfy&6?&-nh#~o9|?6HrOD+p=2rF_)s)+3Hqz2h9y1C z1{i0f7^LXDC@Rn3JZ)CX=2!2+EPWkBB*aK@;| zbAvUQQ+Du{vGMbGe0LCV(50j!AQ8;B&PDc*NjQFv$hHXHX+_BADOOSvv8UWvj=j$r!>DR4I=25}2D zF)xGJ864M3kpl8!_4JR7Jrq`1@Kzwlzr>r~<^>{oMgZ;LqJe+htosv3j898&P7Yn> zVf5+Vk>^M)YF6O67p$H8s8ggI5IX7>C7NJ1($2LcPc)z(Zvv1vch6hA=|>6$PYH!@ zgyW-O`Za4?q;AWi;@cP=)jC8>tW(RxIaSjt+@TxUgqS)`fi6)05}V+GS%duIplJPo zN1}Za&i8=)Oh$t4HSk4Cl34%I%Ty`sCu`>U$NG0!La+;w0S~bO9GNx^S=Ab8^rO=d zj@F%_)B|zYpq8v%Teh6w(jJ=9V7DkAL-bd?sd1sO6XEt~$gU_puI<49qbRUsBcv=# zWOWd8Xgn!iS_FWiyMNi3(hOyM@dJfd<}T>Pd4)cyQl^4R*I*({gB&%#u4&z}f0L{~ zgS@`$lsT)~^(@*$h{7(kcbcPFH?tkzO?i~Cw! zlRoTpSlVHT-8yRLvW6X1UalS+5|zZj>ctT&f)y(Q6)Qp+I|PYo6dimz3{ba@7LCCN z$&7Ze4`JN8q6sE7${tc#cGotE8Bq~@f*!wfzK`HobGnzHe6OTg%eCE-0eI1F%J~Ul z6cE&tV4rBauMwi2^K0U?b^DW+j*n*Cd`lWlA}5i9+&jA)M`i0`bA}R;|HY0^PaQ?+ z$_S1y*7BA5B`o(3aR?NP7(eeH%XuCju_Q(~EGrpsfz0a)8UI76aJVt*btFI~#v8s( z-1*mAX8ASmUOrjiCw;Z5!L~E&Ky~faMO3WFRP+a!dhsZ1w)&xKYNkT;oRluY#5ULz zPnAAI*E=G0QFw_tMAtJS4xlpksbLTA0onTd(t4KGzi&?eO{?aj4(~>S9;e``A^&JM z(TEavov5I}pddA>dAGpz_p+pLHIP+tfoe4CeFX6bB}Ow*xAh=A;L?P|t#_^4dJ&$Z zG%aQe`1q-TkxO5S9;XvzyzZHUlQH?RVZg1|BY3V#R~#^PCK9|*r7JBybw(DvRHZ9v zK6PfYPFNhvE!gf1$#W5oS4I4pj&~tW2J&O=4aK$Ni{y>FG(mppkN2E!?>8~8PL4xA z^68BU`#|B@pl~oG4|a(89y=sq2F@Y`SJeyYOLiuQDQJ(}G(e?}P;Jjv6$+CN=L=%B z(>e>qE{L%KzG;t874p7|>W<0Qi_d|k8?dnB!-2;e6mtWY)yI)FHos$?3ia1m!ycX5 zf65w=H89?#S9iNbPZB_}bziPw$yd~jq|0_GX|C5aVh-4!%sP1|@4Sl7 z5HbXPC4QP;tH!fybGihXk$*>a=+96p1A#9HteM_#(zRVU`2unwe}5xv&wRtQpS2R+ z5udq1p8LP?e4((yt4J51B~F&feocIW94Z3UUkbKVI?Ys;ZGjMzN<&(jvG@l%u!^n0Uw%>TE2r zNc&nVI>*^MQvYNdF=Fh#fOJ_H=O}V_1tJi>fc%m@{~1VQB5aXAZ#Z48T)$6S_F~B6gBk?{1rfqoTWF6~UEG zVIi{`++X_E4sGHUnkbN|I7tuuW7S4F7!eusqvH;J{j=}te6G@Jbh_1h?;%(FOsmIz zgwD>bd)y6YW>+Wbo=ngShUAB4(s&2pKd_4vqU>^ zb%LO!W1Bc~F`5~NYw*5N+;e4j$udrMc0ws+s~qr*>o)rkA~M*WKiEO`o6Qb_9!zNs zx&+zEmVKF>fPvIXcYE2ZpZT%m5^IJdhQXmgcmOK&_kk$@-I9W~Rz;37WPc`3y-9dt z(W;<%?ncMJ4bwO?`p-A7CYn@wo*u2b(ZlSZKnXxAe-t1ZwcQKfe@^)iEs`)@xR*40 zkqDAfS_xMS+bj->mn0T*NK#bN$oiWk6@jQbtmJUJ1jz?w``bS`bw>O;@#XUk^6uyS zG2=9gXmf2i!9jDhGw7j29v)OP>u3{2gc~;JJSA}y)3i~F?Ue!BLlOmz1#wVDT{*OY zso)G+R$-FxORrrK2Qbqg7@W?V|II7+KU4@5#=n>i3Ir7XgMp;~|5Kr|iMz9~iIJVL zg{|3tNl``08buA2XXdY&9C^KwA#WeQki_{7^R5wKcVU$%ei6#X8ba`2XatV~_=mt# zaG#)}2(mrPbDk*EZ+#=Jrn) z>7Wk*=xJcS4*mU;1Cjq11PDiP>!PE&5J9ZCvxRc3B}eE!vK_>1ToE`NWe8UMYV{Qb z3+!GIj{8IWMC}G|2vG=js=F95?GBfr3e9`EKi4ud-HwC`ObI`OjmqR)`(2a91oi@% zX8)<>79a+PRqAv?G>*q=3Cy*qve~ffVJ^gwQunWB>y)FnagDK-k?9!Andx$uAwv4A zWnTsAJ7`m2;*_@QO?>aa)f;)aw?K!r@U&=2#+-U9nPj)O3Y+;>D<(?9yDmlLl4k|X zg808hP2HBKDiipoinY^AchQotN|YHX1w55iv0{he@WEs|f0e7XT2!hbn@p`q{2T_` znzG_j9kgLJCD$G*a9u0yU8)8=fyJXwFo!H6++4cCZ1Idn#f@DK7;5%mrzNEUhgtk5 zhumc3E?sd5$&Cmu(nN*(+^`WAcpj*v(s;~(3Y(Jo`@fYR{R*X}^ywa2`kT<6mdlfR z#xdO>6p8IgRq#d|ZFh)`+SNK!YpN1?)qd7heuh+;vN9&2)7kEQ@mZtubyw}Cre;

    taYhWS--5KR#_|4GvuwA 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�^4R&V%d=~V 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

    VL}ll-!DyY#iV-KF{nPUSX zT^bP5W&0245p_EYuYWPLrls5c6VVUfk6K^1&n~O|$IvQH8^3GbnJzCzD(hf-Xb`Db zcx*~NH)7wthvX-F`1$<>oKzJKPzcouMV6TOGL!%@r=X=|&sTehVl_WE^EQ*^Hdpg^ zzQ6w+{J_HgM+2Z*_DEF*h`E<^qK8gFTQ-rZ#(7uAX2hwm?K(h(ncPG8EHU_}{7MfI%p8jFkwYFo_ zb~9ol-!k{RPqcsxj0GP zqI|9v=~wo>5aG(-dBuc*H!$d4>+K=KrjAoM{DNN$O_R=k;pV%I0r=?^?(?X4#aU{q z(DL_7wly_}N1jg#4ou;(CRTz+YfR2QqK89lGti+w1XHRro%IeqRq5 zcVIJrEuFBxn!pLaDxsJSlN_+d-}t$2MF~kRI^t!CY<3b)bcxDcq{bx;7Vpr6*Y4niS5;F^IBYsNmopcW zhAoJ43i*%X(TFtvCc&BT?jCZhDj6S7;j+!yO{Q~3;)R81s-J{x)QQvbrl1$4WV<{8FlOj|@7Sq z8S|Lx7IhUcLQK9_`}sRj813SpM#)kO@5z$>FNpOAa!%iVMlc`TB*65^C9KCoPo^#gfl9lyfF^5#ALj zY+;YoC*pU2E^v2@xq}h$+`o8>-Bl*Ypkmzh{vQ=iW}-qkcd158o#!e}@wZX`Gy>EfC@ zoRc%z=C>wMQ$C|mL^UuzH`hDu5da$s}M>U8oGY=1! zBVI*4)VUHnp+L(ai@%94H=cHsnymU~o3Q0vTa(<6_8-ujyncF`+y?@^0sjMfp=nIb zK%h4X%B42~LeE+=#nN6}z7c4ASWhW{AmHc9D53F{|Fftk1Qv>M%Q^eQ08^Bguu}S6}ic^HA`qMBGYGjNu&Ym)ySsICzTXp;r>_oszpoI(B#$8N% z8S=4MtibDvN00Xl5B>e!BNcuSPa8X}qw4hBQLT%MW6|NzGjXE;N|gN4dAf*;x11I z60;iM=u7LkH=l{t1D^DJ$~G)JC^iwo5m9dbpc_xVbbSk;I3(*!yCa&Lc*!3{c~KpD z!jGK4(-idZk}Lf?x~5Y-trEaJZhBWu-iNAVm%F=GeIBUGvqIhHrx6fw(ai~Z2DXzG z!HC&7#8>fR%V)t|+(L$OA?ztoWN4Fe;uA;T`B4K4%k!CzO1)LT^}6XtT{$(V=D#cfNigls6!KZw4<0KXF8(Ca!FfQA3!Y+YY5EE6`p za1?JJ81sTa;*~NMeQjdP_i}nx=lm;W`6WKZJq7yJL>i1{VoN%H^IHD#6e`>Uo@MzH zsm*B6COaU_9>*#97GIWNz482*FdLEOm&gLHg>;*-eEb#kgi02M*JM=p(TKyfM6rqy zjjsC;$LwC6CZ|X3Kp%XBqykO@-eGvRL)dRBui0=6-@l6y9Ml)8hdD!JJq6V=%J{Ud zCVLV|x6pqrH)v!Ya+lvA=QKO2LgUk~y|Ull&fC9BK|BiNjDl5)PQ_CdzGcu4@T|iK zO4I8gIE!IJ)U9Vi3@Q?!EdXnl$H1vAu$A$$0$oNZycV%lx48iQbw7zSUO zJ?tY!tAfvlrnhAXLce7H8~y6xX~lrhFSBCkTke+_Z5v!wT$^@zW3RnmBZoGZ49#yqyMpki3f}Ef%Y*V&BzIk*1C)SvBLn)6 zlQusrKk~)0ViOj8n3Lo zcJJ*8{48hZNl{7+ajc)iBX78DBC?0&m7n=!d@?J;so`|KU+YwYloyoZETb3m%OniH zn`-=u{Z2eyQv_v1*_$%PvsfP*Pa!pbyxn34bN)>B@9qPu;B@vdP_kaZc}lV1L--UVF}YuXW8j*7;lW$E|yX&naoEv}FVGg|&x^*U8I`K@;nz z#Y{T%q*eX-`cB)cCvL9TD$^@5!QoH88mx8~TL4>3<}{$)5~kIO&F%oa??m#A*QfiU z8}_2I3t4OAvnymV=?OhTa~Vas=mOk;?B*)eEP3m07?6jCnK;7B1Bcmij+2HvXY zaf1uulu{(ViYRr5SI}7EL4KB75t-2jQWvDrA1=m-SD3N**%EK|Tr|<@{&{6prsJ^S zfK)F6w#y;KXJ;|dP$G&pdRk2>1B_Rpg%_tGsbUHx1#23|b=_`b#2IyNSB#e*UA#Lh zQHvw6iYn&;68j-RHRK#G5%2fvoroIrzOX$ zFq<6rbJnj^RWn{rdNLF=d3T{i=qVWNHCkq_I(nzVf=&ah&eYC-G5&th*N9L=$0s@v*LSu)0lhgrSo zB=3HYcq}^{M#`r#*XXd_TEYbtFU*pC0^}kaWT)I0g{SX@bqbS70Am2mhg`v#sf-U& zktE)1a?m|VC3k+M2&IwPnRQ*=DyN*Ptd?X@=ub&;+2&guZXcNML(?9*Q_+}&(<>nX zj*AzO@LKR0<%nExZjq`Y@jZsR{AE2j{Yd1on!Iv~bCgllTF(b4hpFFDyFOe2Q*hTq z)k+sq6q~Y^rcl{W_d4>?+ z{`ec*;nq>V5+EaO_Ra_}J={FveKI!r{5*R4`(u1pIDk+e5(A+e5qMY}J_a_vVetE! zXnDJ@C}fI6e0kTD18Qw~XRV#E3v$jN63)Z(2m>!mO1)pr^EvJ8%KjuUq{DaGpiteY z>4ye`j7c$Uqqd3h>J-IP5^E9|WY`aeM3t@Nc^+`pT?PZmBjm;R2znmOA*(_He zB=*|#L5MW$9f>p=FaTv_)U6$vTgpyzBN{=vDMYFkxxecfS0FKf^d}f`I1g*J&%`CV zmsJNG?-AD)#yDTrm8~25u}zAl=Ny#9nx%oU>?8F^7Yhy?Fa9-ERp7_x6?nN?qVCIUA>B>RD{f6PKwXv+l@FK z^o~c>z;B7rRK+Ti=Im0&oFn^CK{5DqXbh7|!`Ue~#(2HA#CMJ7B|g_cZxGUEbeeyR z>o?;eJ>B-^7X`VCW&%Q=3<3n>rG6Hi60pI>tXRO)iwx`n7{-;uui$Cpe*m0*Z;XLL=Er; z%@WMOP2hWlI^<@_1>!IV?Xm0%xmu)r@RD~^a^^rs^lgZL#|`3N(NB#*zv|G<;z6F< zi}mQGM+wpni}8{v&V|l95;{2(%9GDAvu0e!iyPDheU2yvSip1jC-mZfRIP73w0Y0z z^g9V|p~SUZ<;u2OLVqWZ=0u(QdBYC?xIkU5QOynKpoW(f{#|SkmVmWCx;HCuu8;bX zYeG}ri{ZmETGGccO-^`%JQ~>gN${tkdJph;5R$`qpnXdAN%ZHePQ9 zC52f&cc6>@ooV>O+i|6I#bH?y{abTRRa z6d2=V5g1C8)}n62Y!1}gX{JfzP<1F<*W9b3*!qx|cpJ4sv`_y&K3ZB4oL2`9bj7sa9n_?0xK6wO#15P^!O zk~$WQ+T31n=NrF{D~A-b8RJxW)}9TMHYd3bS5VTPCbDqQ{pNGUIt3GLc!8uH#uLE9 za4}$B)c3P!NXIsF%}E0x_nzH&Xa17^GHlBZ%@WXl5*k!1Y^jweIL=tDwQhl+6!B{$ z{Yf~oitv1O4kXBVB zc2n3K2fh_fr^5SY}-h(6a4M~_h&Pn5C{Fy+dC4RIjY98Gp!MT#zm_Ot<}@Meyc;R94Q2hrA9j=PBSy9bV4Vl(v7CZo69_crJT(_Uf{Asc|eU;y^YL{ve?%>9n8Nw*Wtyr~vYj1Z^A z74X5#Bq=}fEk|}JCcwDT})VN_TxXam52|BLTjf`_W3kf;%&_B zgL(LNCKI$a4e}0ex4vllxZ|+de7fyFciqRxR*{M@;no71%vy?GCI-t z&V3@fS8;2I9o_S49rcMJMnQC5=P>87M)gAkLOJ-00lwqjAa)o{xATqjmF-yDqk-uk*1;dp|eNyw(O# zZR!!&|F{5mzw&kyn}gT$x=JS!B_7~MaSPnS1>lt(e>2jfB(HS_ID?<&pLv6n379N4 zs2i={ef~Ay^R`YrV*SqdsK4{Q|H*o{(*HSx{!^1>s=fWQh53mpD40~3vkQVp9>xkv zkXTkJs1U*JPk=9A(ZHh93tK^o)wY6vFHrfthS^B><@foYIbUh<2gs|~gQH1(D1i;= ztI%bphs)uc$>C(?#{1n>whst<)Eh1&hPAjmJykxY1P0<^2eEla$7CNYt|E7V+qB!T zD?QzJJX2RjK=d=dFe3tN-N-!FFG<}!{9)^H8;8!^oSXV?(nD8q!ByR)Qmf;M7p~b@ zyAOhUeFtKUdgEbR2B=!z$WuyEgZG|j%g$=Q*inatuXAE?b zCY4ZbZH||u2W5O55(-vd1}#?GT@yY2)G^GtDToP*g{2S^v-(0NnWH$?$Ioss1-8IO zH(LhGp(qKO7?xnX&~`zlphU~wO$#*>tAa%{(RO*%9n zb%%SwSZ0BKuZ(vLLU=u4>#(s^E56Q)q-3SAf@0PWl1B?ZK0w-)<);Oun0TWwV+lMh`lb#?FI(fYl5I<*d{=SVq~orHX+9gTVV_#s)8-H zu9`lRDp_4pXLMg0j+c@L;RzxG#jzm2;8D>tif4ozGB;edzuZl#KN7k;yS8>g9@f6DQ&fWG;FrJ9Do^U!hfoHMQXDZSYqf&@YL`}*}&;iZ~l!M8i z(5owlmY(_BYaREQ{vOY|-{UKPTMXB`cM8#2mERLwEtht`LHr4=&8DzR#CR1wn(R<` zSM*v!?$U9wi0gE{-17NT(W}XNze>VP=SfyUi|8si00ZW`eE`1k#&uOzKb;P_%+>r{ z7+?(EXBeBy{#Tp?`_{TYKpdI}|G2#^%iFknxAATqnn{ul%mSYHq4*fFsI)hPB3{}g zaD?tBS}Up`l^0sW%u_hlg!T+E3m{azek+UX{H27)Me|Oz<@qrOnr@m>m>~ ztmO4iKP7g)LJ`I>kw4Qh>B$d-I85CFIa2jmsEh(Q>?GaZvHN@E5na~2N9p`2Hq3fvPH37o3al;~rE2;maez~>$y>gfzIOQcL>V6(5xWOr+Grl1r z%|z9D1(prs$Kii=c@6WOHU2|+(g0rb0`vB>*T@mS7dx9SNUgn9&wN5wRb0pZWKq{v z)2wFa8?mpB9Xu*UJsvUqF76!fx@=~AOZoGG|8Z(&8sgojQ3mG@qztS)3Z%CNnUf5? z=Z~{v|2AIHYZi+QZP*6NsP{|x2PBfbtW#m6ir{>`W5Qa_ZUc!o*F7>>Nbx#OcR4#Mm6ea%Y)RA+U<#pJ&^*CKdhL!d$ zppEl81BmlQgck9Un!B$9j7uk#s^c|OSIT41n3rYcX4EcTZZbh+7cg^FGeG)3iL7YE zS`I?^uaqDHtRtqCb=jM75DcOq*KiOnxg)1tv!brUG9L{|A}KHQ{(hs(;2=*}Zls(&v*r>WI)VdnGJnu2-Iw3>jusm>rqwp#0>ywOcBa9sbe zNz=sJ&iVUF@Qa84&zA9o);r5$$HZ0B;e}kkFtoi>{NY(cA4-vC$(*?Q9Zb}8NBZO0iAxHiPvj&UDu^;)DE-ZmO^sLTQqd3Seu-A^~sfSnyuCKHf^*-x6_km90IS~ z-+IZ}Y-|8?k65(Lok@GnNf-uH-)zrv7&M24wRhit^zWIDUIj#Dl3ntVGe$#RJ(*c~ znR&S8bSud^_+R6hQQ-x12g~I4B2PFpmM^9`qFo_i@J@rZUK-8yJJ3qHEZxlmc@Uwx zlV#o)Vm*@_*&s8Ue8Ppnm(46H?$s~_FG88`N}fQ1^fmO5is}5ibGs)1@Hy8%Y|mhQ zXR>d$Cz10v+jG6Cb&RVQ?J~`pi}y)psA!sEzT@XTWaGU`^j;Uf7_U~vCxEHz3T~1*MI*Uw?8u{&N*Guo=IDc;fe^o+7z}uX z_i-yD@bmKupRh7|np21^Z|O0o;PDbz0*^wZ9882JWr#yi&?n^TW5rqD;5GSnT$p{T zA?XMRg**cC=f&oPi7Tau_1sH`AW2Hwg)?(FGPAR$%u>xrlS1KgzWf|NN{(&uY5P3x zPjJ07DWb{Gz`kE(FB;e7jk?EHq|_BeuC2#+Cv^#b0vSZZUkz>X_{#-6gQ@6& z|M6Di=@6VFtO_)Eg+%%Y_{%Nf`p8LAkGva6pGv+H|FO*_);)vE9;^o8t5p0W-v1ji z51FM>ET?0Kn;&g=$R>PMYQSUi947k?JMc=nsd&do8`NwN@j0)}fBSDcGWtGMng-t| zMBCqVPrCnsk^bMq~{#!qEUX(slgJWm(TK^U{%smqFedWwo^M*3V4abbWXNVog5-Kqjz!VPMMMvFFjs@# zbW)K?9U`%ef5xPF^Q{3&s*L3e2dAuQy{30q0My3(h6EHy=*c?gngNAUvm#p=Z8cCd z9Gy6%X@v@HE?aRrw;n~cokvt9dINyo6eYE`+e)Y6W1{9wo(!CbV@y{HBYJ5mLU~{z zQhDTXz0&4Z+1bV|>7~HAc1Cop=BvF)nn;J!QoxnsWV4=o(}Kh;6`)@yDJrPI9u68|T_C092$Y zmc~Sxd>Uk;r2NWN$T*Fm=R)2Q8HC2WXtV8`{9$ zmPF4Tk(nGa?BAObLSaAj3JVo&jA-#mx4M8HSx6xkSl}>}dzScClyr7eu2Q-4ohs4+ zYm|yGoqY|RhPxd#M^TZ6d97;K_OY=folG(~%FRIzsJ`~c@_*_Q;fqyTN=jOMX;3uQ z6?6S`1Ef4EVSBb~!|K^-_Cmv`fX&6J%M2K3g31whGZCe8D?*mYG?A1u5XQ51rBL*C zEK#<8OAj;~JpbB~VxI*%V!=I4u1Ij>(D8ZapD2t71CWF?(oE9#OMvVKb-q;a!MWXe&*o~1 zqD{_8=BuQbaJZfB{&f5hFhE0Orep>&4B6FziDwr7B@QbQ@gvI-2<=49KSne*Z%&GM zC;*`o9~X&Id~3{Fn44}?50VC2Y-bBADi3$qwL5gyE{{2b{325vd6Wh7OtxP_&%p>H zHr86$1;07e9J+HpxOZbG&AU%0`zWAm*)^E3IycJwKNO@TL8TkH#l^Z-mu$zSLhq>t1NE8eGttSFef&HF}*IaX=By;3DabK_?(1g}pEwMhh*p<}_lGr;Ui3B%$X1J8& zL8jmfPnMam<$|*I`kBt9f;wBDjM1|4?F6uuZ@m&avhm$wUeCE7HpyG@^5scSPD<*r zg|Xc{&o>r$;0k>?Y_oKm>9|#!bTK0&mX+Vb|xJyq4sM5iHv~9@lPMX;dpB3cfa)$-;ZxZ z5AkO28dQZoPpAa42!O*6SyIAcR07jgj9E=s3E>-auo?M|!`-VFu1^%iDO9FRWu0(3 zadyyX006vE3gwz`;Y_^0n+(l+PSH2&1OuwK_B31FyrkHut51%TEKhOuOhT&AlXfZ@ zGbR^pPCeR8Fq)b+pPt+PwvS~VtpEC>*szvSREB|C{kDO%Zhp!peVb9SLbI_xgCo=d zAv^HaZwJNwgT4f1Y*%(>UMD&JYj&oO3$4F9#_aow$Iw3+7mG}YSgSI`%+S64!Y;YU zKqbgd>MB-6f7qzpFcHOlpR&E}jsnV^RidwG##nv%k!I@n7N?KJ%v!50-=%dZlVz-q zXM@QqoHsLZ-b)6Lv$4%KjSvGlan}KmtWS~t#&?!=YFBM^OWWL0w|Q$-JY~1TP9B?_ zbxpsISGjh6lKrAxCgFH^Jqky|4*0S6s1xnd$QgNYLz>$k;L&!XL?De*WOIiqRMIIo zGI3~Ty34H1`sk+RYOYfsy!*2ocIrlpFz3ZSUu5gy{E}YlCNT*^nMp=KE6ofYN9xHl zIPYaw|Ju*<0G)&9Q?^RcaU|%1i$<5VpCI*RsyI9^%wSo$Ht@+{S#_q{Kg^t2v7OTY^roOQ@+jPO2@Z zK`W7*%#%>QLuG?Tks_AQ%`g*2qyH|AQTb5GW(~=xG=Yptm%NjR*01C{THYY$x}}uj zc9%F>o1o%;)EE|lM`l@t^rB`)sSUTiO{|$lRj^JzS+W>kYYsDzO#nA3-R|Cr=A5dGL!c ze>MA;St7sG6S+A!N2_ordic>5p*vo!!p9WE{SALLSfE|(r>-MZ&o$x)0PknS7ADZ= zt?TyKeCI9wZv$l4Gsy0dv4kqMKaS=CZG@oGQB_Z4APvL5qPy6-SVURu{wad)IJTg> zU>bVLro}m%L!n#ntu)PhKs!`rrN$CEJ?V9Nh4o~V@!o%?ZL^ug-~Y`*Vp&@NioR7~ zD(wG*3jAlR{BITLg81DuB-;{buiS8hNN2_(DwvkDC}lm{5JE~27cQtcqnQySgdIrm zO9)2Oqxorw_n|P_%Y4aVPjl2l?R#4>zpd?wUcf(R#9)HsZN2N`VvXa!nua3rJfHb{ z2-fd+gurOmmGNV4;vK_-G1>0cjaoIfMPFl-atvZ!HdJ%=eo48!7-ba#Uom=;znWj5 zvOT#D?l&Szp|Tl+)vF&K^3tsvnhykr`92A9B*z!|VzR-Q58i5)5=${>N9g@!=Ap#j z1@1B<6HW zXvD?ND4U4R!BQDph*DH*IE1iU{QOx&J;T93uswwe8{Sl7+^#u`$nMZ+rS2{;`3>y6 zpEN5{jY(q84^n7gmZHN1ZQA1PK%6;^k1ciJo%-$*N@pP{MGI+U@>XI!hi!bwX)fT4 z8OZRZnioU3p}x`ZvpX)tEJ|+hFg8CUc)ol9udcuQ4I*8tSZ74QC}KIrC?fB;SYL54 zW^^3&P@-m>bo*O>;84W-s^CDuON92Cx^U^YnE`-S-U3&~f1ozw;-tAt=Mze2m7!?l_H4-4>u;G#@Mg#0^Z$%3vxJn9u0PaGJU^s#(6E64IvaE zN~BJmwcbJbC~y6vH%p)?iEMxg}Zl%k}#yK zB_beh-!bj0t9GjFQ)Ie2+S_N5k(o7hk-{ooAw}rGFSM z?;S^%{Ee}Ud&Mr5XXP$dhT07c+t!YUACEP>UY;e*siXjEo~4Usd%9m8UCfA)?b!Lo z@*S3K&VvnQ#v)s8aClfo3f7!pfi#^tpwFLS{3(K@vy^EU+B2VGwMSJ67w75Gg1rt z4q3TF0{0%C{(sZQm%V-X->N&jTw;$^nFUR~TqV|}rrB8uyu-rmJc*M>**_wgw z+t#iO0c_%&(qU#;;PjBoilAi2g{CLOvNNaY#BVP#IbTTl%A;ChW9&DEG^2WU-^T}U zPi=(Nu(vjU5DTk>OQ{qzsSu1tIV_eEt|jr;^#Y51P&O$&X{^Ewxk#;?+AZJCPJx>c z-3xC}C%H=gJf?it1L>uU%dL`ISZ@d*?AH?voh!}XX_`J$aF$=QVR;qqcoqY^Q@UuF z?|yj^k=%xNdxSKBD|=f4OLt;k13T3^`)Z{DZEZp3WD|PL*e{urK{^-w$rCBCW#wPo zl|mRG5iC(?JI8kf`}ih-Lz;X92nxq8=!D!@yXR}-gQDw;0haNagj38zYwAgQ^U)B1(I|eXVHamw zwYX&MHku&)V#d~M2c${wc$s`j_%AOat+lKxZ#Wk>2dCTbmw6hbBjY<+HZkY3pG2AfcX@M0irBa ze8Ogh)}sME*UI^%`&w8M#12ulVrH)0{D$Rd5AtTFTX;p!;gVE!!-46f@E7#q-(Ftv zc2Cymd@ISp?>FfGExOst*wN8gPgvhk|6el0M3s|&;6$H;x|zD!>QRvlyy79$T&O8_ ztLUEM!lJx2$U?mYgSYA{HLFe+Q84bPx_)^7RCjw{|LA}o0O3dR%eo;P3j-ZhwU)D; zx?g%aua^5R7VVZ%-dz?X4Wi}^GX!l$9vPsIxL}Ws-fM_eGZKr{5qU&jQESis=0U%5 zxh8bL3o!VvAz(AYnB1mjj@#5G=xkA6;;ieZOttHhSo?VVH7K^6t(zmug0J(YoLw<6 z&t4OhR9M}OtELZ7qZx{`gxMQ;_wpW`i#jM`J5{urmz51@W|TvXka<#%$?Z4@+0c9t zcNOtAiZ>#@N^12Q=8^J(5ER<1_XOsJ_)QOpBI=Myf9t}3vE1NvVY&7tP<6%`8DY;Q zS#=+Qm$W%bs7CPiJcr7LskIK;WaJ~E9imTMw<%A}7aLMP*kmiPJB_obwpPJ7{ACf< zP_{dLOA}_5?a@J5aJ`5#l&Gy)B_u}1a_VBf318%5*;J`0po`H}BZr<8uamq_c)Al7 zgQ2AyNL1fJty4W&GtC1}kRn^D$;p#kS`v2$78E+BpaX4E2DM)Orl>sE-rzzSX2ehO z60ycYX&+&=LAws%8KFl;C+A4WjB`3KS55mn+{o*UpezIk3OgN3MHc${3rWUW9rOBA z#wMBEeM)gNnnmhVW|5TcfY`1bzf)5qu4l!$J)K3bZ6Qc$W}yy88t5P-jX<@A@>eoT zw82Lg(sS#p#nOZ8<}Y=v6Xi&dopzS$3d(PdKxhETur6UW9gA0>~Mq1#bOI8;=WCCrB_t7m3#)vhGaNlIT z4xfNl=BjtM`N@q!v30zjJ*Sgf%Q+M+1y1;=bTdz|#;a3=Z=Cp5c-iJX+bNkhj9N(4 zoEj>)yBUr+4K+8gM+oj4gF9YK0R)opp8FHr>}xzcf7&ZE=?!B}tNA#5Qf~$&1i^Ao|T1Bh?g7jHi6$>Nd|gONFzn6{wRZMQc~$woMa&|4kq7ZhgY_}xY~hLDU}PAjq*CLDsr!iD853$V^>?Ct|T*;qqa zr`ah&uN?eKu82>G1Rv%x-Pt>1hrrc019A2ib<+k8-P*~l0c0CLQ?V3^e=GN3LpG;Y zb^7K~VCxLoy@Ta`J}EzNbNx-@RpVs6T$t{C7F!|39w&Q=e9XF zIavyZtx&`J zMwJXb-|297qz6A;U+d!H9_@H>cVxr)_y)th)MlyV0u^wllPMa_&zc?*kS#u#^n+6uFY|2zZ+R>Ts~ z8cPf45E^Q7ju5gnswzwN^qh2YL3H*@3ui3M-z0n zXF#4PR;(Zua7EG(Y8KxCVw-c(@396_yK)1Jgo~Oe2sq`W`QY%D43Bmeh9Hh8gV+>*2n^lm9 z!X~XK9h_s&0IF&+w`IOHDYMBToddbf>-3dYagDZsstS$*w>fvpL<#a^sPnbiz zD*7fY-fWz)lrHh8l4uS0-SvPjO2jyeV1Glu>!_VyC?AUH(`paGvxL5TezhA!@*@iH zzqIlGLJ?(-R6()0BpPR7*OMQ2FckPh0PlRo&s*Ehrx&Jb2@&i<$JN)pfF5YayLrtv z0?>8pY@#)i47}?NqBbnrNHnf~(N;C^kS6S>Jd!BZ?awUiou$q$F}g_&+zE?;R_2Vs z?!dU&>~p!+fhAb4-0^ts3i8&Tt@$C;hnU1d?54gm1(5#uL1*?%psRcn z7XdX5a*+I7L?AuxNv#l1YxhwO87StpdTN&6;oH$uVw9b$p?`8~+DD~G8& zWDe_dxI_0$Rap2l%Kw86Y9H2-d_SAcx&Q*2XQr}QzT7He2x&}ocYWJ=h+F%`v1P3= zewOApemsf81&$H7VNchV;dcw3sXX1vE$Cps?pYHKD=ry^`MO#1o;8P6KsorsYzUOb z8;_q|$_$S-;3Q~qw##baqT>L#eyR{N;3QiAakB(}7OS7SfqH@3k-!$;s(d#yau8gU z+#`*!wF5(v3=le9k(%!;Age^H^2QnXe7 zEybv^nGsZ6Wl$Y59TkFj5H7^Tz)@MT{m3cgb6?SX#Lql+-6eswSCY*ay`gl(&e6n` zbFx~oN00pWk6*CO;ANCvMJDB2u&xMkXo(;4N($?8|LXXz!DP*Iqq0z1kiGBbEYJOE z*H6mTR>T>&KhCsJ2E3F6M;`m0)hS#GeNJ#Hu1sEmC*?sVEG=KxD9W9}Mkt$t z`Ozlwk=F+3WTB^oGmbD`EpYJ4e3xV@DehF@W>3g7PUFJfxwSz*BN7}iaR~-oP!<5x zC5Hof_|-q4xB{NT1U*Fvx<&<&8I1!5{oyywVIHk|=IVj2Q0Jjp2c~^72&yJ{^^ljy z1E%Y-@&ioraS^tRe(mT`D!o?l&zyUO3d&(eNYqEqj(arr$jsa1R%LtW zfef{$@^^TA(Ejk3ViCAh)t}6Kv=dbx)dq2q&S7cDj%JCDJ;tqp!c%2R?Xn>p-r8zJ zqHzTOi#hwy?W+opQ;d?)yJ^XqG8}a|_L_IZGXeXza?fHF$pd>gM|sH9fwjW4Cy9Ek zsyy>5q2*0!o68peBnPi-$6>P`F5y;#A+(&={Z@YIMy#^AA|)u1)QBQJ+vyZDmb*lBkf%KL}MRy$=%fg@0v!1^=JaM7`es!z3rR+`>%0N_q{lX(W8e77FH-)c zGjj?+Y2;F$mMyQ?@Uf}T*@M>^N$9_D;&x=U7voS)1}VE9rtq+wCxlg6b&srhK6bdE zVrN#nSn0(w03>YMA_o-nyI#Pmc-!tw+FR)Pja|>qdtq4joXUXGPENMM_uP{|rw zghH$IjO%h{3#cN;Wbika=-qf`ZF2KNRI<%{>4!~H@^EfRXa}2pQZ{@6{i`r4PfeI3Ex*pX_Tk$3;wm)?RCg z4;IXN5=bj5Us%^KZmEe|5IvJhnkkX;c?@#z#QCxIc&=#}F=P{I(&5oyI_1&@SV{bP zerw(W>iE<4PY;xWu*48LZ*1QmVo`-f^OEC&XXRfi99F~nN|a6e*YvM)&%+N>yUS6A zWKozxW$H9G$ZVD#g^7);i;spuS}Id~jG1^@xEv-*%TaE}T1o6YP2-BzR|HRP-~TOt z`{A{kbhOqDQ-)QuZ;@=;noO&*pe-BST*bK@+F@4HTzOp$wyi`PM=wM-#|T=4{T-k<-y4QILy4e3>&m^QABkf)MyF88n{5( zwA+@o-TSD$%2_Dy!|diUvu?#1H4aic3p~bQL|@-36~ygq6q;wqLamnIs^j`eA>_=D z%oq*nEo{gt#*xy2J_zZ94pfAloQiMG&vPK?B#a}*sAzBt9w_Q*PgGuA99Ivn5IdL~oZ0) zC`DhK^)_Y1VDw2wA9RDuBY<*K39f_Kw07#rc?bA&oo8uL{9e$ak{3VQzNY!~r#vb_ zlt^0Y~|r=Y{>bxRz@oMYwaFt$y7qq!v~#^Fy^BuUvQxfjFnVd0i#o&3EDgShM- zW@Pnu?<;1I8SV%gG+lR=;jmliFq0-mFKA@jJYx`*6=eLqcV%PxbP*6qryq>I#CR$^ z00c@9Ea(n{6*)D_8>$kE9y)UXc^ih%!4k_ZMSKb|Cc);nta<6gu%uu%qND$zGA~p1 z;y<;oI9EW~{g87g?;!mLkF1_$u-S^^M3QYHQOqQr5{k+a8gT}aam>5JvD~C+=(p@X z%q#2q+s!J3A(EfTthp)L`b1$7GqXWP%x7-g96YDPNBT?8EG*p;*xK8~4TjmW5DFySa9aD6)4&-FxWGpOtsXf^A7%jn%HlFrEn z78p~Mll>2rRT%^iRC!a%Oc_M)A~RcRC3uD+6XmWtB16ZtLeV!th1 zD$4%=hwxvM>VNsSGo^3;_C6pOZdQa^ zy{Un4b`;7y{d=E?^n}Rk+rshAsjYIaqO++-rr#&>n!dJXzm?9V%6|+^c?bK3 z+*~t)$y}d70iJQeayND&1Mw}VL&a`aOq80}$Vzfd4={V)ssl&YZn$0DW2UJm;nH5A zrF3`KD7aaBJLTM-kw9ISLwBC1V7i|1rM3(Y)+iL7!NFIz*F1c>_j_;9p82hbC`9@E z;VDJ2P-G8Qi^H=|>ih2_N`}x0A;4ea%#6H!R8#B2Ex=cyv8@Q4Oeyq8i#6ZA%;-MP zTLUgN)X~gwgVAc*u=CE5HA9yb`8`KGuUilL$ z&Ko~%vLYxhT3cHt$U&75LvsW@sIki=VDJ!C?hJ#+SUo^4?PP2WgGh>cw7~z>b+y3} zQTVYTaY4LCr=DX@vLNC`m{oufrv_n8TB|KlJRP)2jGhm3HZwXmRhw~y6ET1;i@`Cx z0jJ8yrSbIYm-2l&UApVIcy-JeNGCFIbYV4g+PD=RYp(d6Z1VBB`y!)aF2-uR)p)FH zoVtgG+@bgb=j^@}vo&Igi$=5KBFU^)kExTrmrOKSg%cR1R*Y;4>RSsNy+&iH5Q=nV z(pEeRH5ilM>Esr;6{+l`?8%5xS_prRg{+?TZHY5y|2@j>SyW2l5S`4KC1Gx<208n9 zR3&)Bko`0N?^{;4l2~%|pH|VI4Y87@i-D>O9)+x9M<|XPn9+L(FFqmbb?cU4!cU4O zG7bpp-#oEhUCUL8Ra$H%UMWkE_;_s&5EbRZd1lgWjy{MziIwq^!It;9S9ea+mm840 ze1FxNYDB^4f83T~sESgv1IB1zq2v%md3fJ-t>gf=rO{lgbjDB3NGJ>Ho{RdG37?Qm z{>}#`HCyW71uBuEy_7`a`gf2mN{v7B;=Z1;h>ZsZRH= zk%Cx?dwgkn#Zt9;b+h_Ib1J4t%59q>_6UpA`iduO?#>d-Bi6fW-&M*h&*scEM1=V> z5u8tNHp;pNkhH*4d%zWH7_y?Q3`S{eFOJ$tTaKi;rgnrL{cduv7Ta&1mpPQPA-TNX z6BdhG-m(HnHG%k%-PVafjCJ)Qe_raM7VyR46m~HHENZZFdZfK)(;0u>?tXs!necBzKo3Q#rwf`M`T=8t^pb3L z*!Xy6#>Ork^O)VXpNnC2#FZoCSDF66F|1%*2&ROho)iXY&r+e9>M`SCb7(Si^4cdaf&Gr$fBZ(5-j-6a@JOVI)=qI!G83F9S@PX$Jgn6rNo;8i2d#=7?wLj zagO{y(#^P!;%3P!!s8o^uT@$T0g+J+qPM}BfXD)mm5lJ%oVbj$wT67^I-6ptf=mD$ zl6sNgWF|>i7EMa=@k$AhAc}`JZGbC_obyp>LCN3zU<2g6`;bjS`S#H$d;(2@t*Lg`Ar3rUam zUJU)7kzR_>=~b1l^`F;NbOKbpw=FeUPWp|K6?fZ3%K5U-H@?Ge*%8=p&jO`~G0g1; zq?)Ll0T-3~hf!E&R0~gT$q}dulJHS<{IH{dcF=j1lNSeZy0#c+4)Oe7vlyDS2Nz9( zF2WcJj`f&w5I~z6m@&zvwjH~p<<3x=!6qwX=$`~oeA28Q=hF?;ju$lf+gKuCX6^A5 zqLl~&?&9Dl75$XZaX%Mu3esukRUsNx^4fYIcC2?a*Kuhjr(n-XA*}N{wcR_FkgKBk zlXo;7JAP+d((t>1sfuw_{6#7Jwr99fh*W|{%Vn$x2=ui!Y6=WE=6#SkntfMKb7sFFWR2Y~x}B|mPpR-kcNU_}@`Y2*#Ux66X%FW_ zkG|!`!gFHeTH4}n6k>ji6)NNl>yQ3&u@5-$K`q^|e?c^_Xary1{&EIlWABFD zy)8uu!=D|qLTIveS0-FNgj34q_1};4CNF64k7g3YCa(Xs{)*ZUcF-7uPswF!{0URai zKn(xn$BTq0?YWP)_Bzgi*zs26;D_t!O8|YENiWUOgW!RP7Y}#WK_Z8n;~4;;5~Oh* zd;I*sA?!!iPwQV0x?{`v_&3gz8HrjT%(n%T_+HB5`ERmm2U|NmF)KGaGi6&PLkDv^ zM;U#)f3ahQ|Fws2_@8_Df#^i?Ayxw2L>b`$00e%2lvb$-h z2X7d7CGbN@R;Y&qVxjQzn<-sG?Tjn+z{sGQv$F(_d~Ui>?-&FWDzny;rC-x^$2%D_E-u>VCI3 zsn6SSD0vS5N;z50YF$V6Y^`k``gkd|hJ6id9-}avaei^nfAxJce(cVT&CN4qF#Z2H zd&ln3+HG5K#kOtRwrx9Ev7Hs$wr$(CZQHh1QaShRs#g1L)oP!6f580o%)#DA?-_5+ zmtXRj1*N$JSsGVi)UySwTE<^$z@>kHVK`h=1_o6JP+XF1H=Hw?TgNB%i7BB{@G2)A!GN6{4#zn%|mF%}w_oqMTGEu{H-cyM=q*0fZKhBHfK6D$a zZk1;ClzcuVzDM=kdwkA*3q_N#%s*uDj5x9WlQK_6U~(uRtiW6w{6x+QZDqLG3(uP{ z73lYX&U{PS44o*?Y6rIgTA#`q+n4A!a~BkhWtu2auX~;v48=o>o_75}siV75Rce&m z;da#sdD@^z>6x}MI^l5X6?Jrn$hGxWyFqzBHhEs5+;&~g=%eG!CtLmydgMqN`ta^! z_e={Nx$wd*(F2qynhh@k5guaaw;r)LAtZ*^1y;YXAeYA@kn;eYH^Mw0lBh{z+B3qz z-A@uu+oXEHvL6sGdJFnFJN2d6{yQcInW4vtjN0GyF5>U zFn$hwETutN@5lL0CO>+PD-EYBeO_r#nHc3t;2Y`eUE|03PMOwrfo$VZqKLaNpDIyY zZH`#P0HsSrL0Cjl6xmjZ8(l%QJD@-;W6D}0n7f9rLJ^R|xF8`Na?jD}Gl9W~`OPH36z}mD znJ$1dSEnBw&~0G6w1_>z-w^f}vi_K*?HKg#g03CqN<0JIE;M>x?$-4C^i}S!Ld$o3WCI@n9Y)k*;ljO z=fs(v8VpulrB!FfS&vlZMW`%V4T!-8>*ZA$pnafOQ!fV=2gaUlisay3f#65fGEHTk zbt=%hN91A!GzS=z7jVo>GuXl-sp90C0@&q-q4t1T;MGXFug46dz-e(&kdhZn2pkmUF)p(ojW8LN=LLMQtZKvR(q zsKN`0^s!7*rjGar-l z9 z>~9R zmoAq^bPFqpK7!RKD$dU)%mB)+3T^t@hqj!-KC$H3NMx80*jf-sa$ZNByJZmf&9AQm z58`7DAA}tXffu%kABRPJ|3y3rO?$6FhCtO-$HdZ@^CwUqX3uMyIRbZ*!zo1P8&s!8 zsDFlSd!LU8?J1M##6I*zD&h2pQq_8a3)#aMncne2*fpdnb_v005z36md9<-Jx5^hi zp}Sgr-z#V!e2G^nU;{e(8jWC%P2^8C*%;_*{$fXSJ*d|IJ1rEU*m!)wbu1z^A(_BD zr*ZS1!YP4ZcZbNo;0p*lJz3_m002@vt%n=UQTQ4%7k*4Uc$!6!PvmjSY6!M+|a*6&q=$~JYRFXTz0u0eLlV5`2eO4n3_}X1|Xx}8DL^~5{DEai`Hfq8<5CE zXE^*c@$uNa(cefs4qi+AYrW~g(shd3bgCCzMMX*P!^>!x+huOv6As1^oRnLYkn3igAbO*Wo!B!9lUVlxuR|1EUUO0#xQN4>-@jdaGjS~ zA9@ITv&CjpjapcwZGx(6H#|3BtvL5cA2c$cuIbvU$x>^1Qkt{XDqpCVwHnLw4n`AW zDS38fl?I|dAMfP&*7x&IZ&_VM!dL=NT$#0bIP;Vje#1~M7NG@DgeGR^Vy_y8$H(Oq ze`axIMhbC^;^abc`t4d*NOpVal1XZ0cpV2Kui`&z8LP=J!%BqGv+RYylsOv4x{^Q# zu3Q_Fw9VS(!;<v`Gi@g0z2g-_v^Tjka;wJfTXMw;u<22c%g2k)Y)Uqo?W^ z?Ik0ntc9-3C^hUKL}xvuH{T}~mFWzYLCP_l5QcF^0+~!5HCi8}kq52Dkt1HZ30j-C zv*;bl3;gJmNtt)i!mK0;E`Bag>Y=ttEUg3e@mVY?9G@qN?%3+i8n5Y+KES;8$*Mr| z)np?Of+9@)!1MPj8UgkSXL^KKxh<~*)G)6fu?rtwcvSU|CP){9WMYcRi`FW?5)X@CwTm}<=k?PZ&3C` z1`n5U_voL-*byWy2**-%&j|!2e%#{7%%_ou=}e!jxHCpEflht!b@(XXRnQ$gVt5w{ zX2_2ijCJz)+v|%*!>KNu>k-G}8KFA`p3MY{?q#?=oYn^B`gRn<@F{|J-2D+Pj>t%c zFWre4+B*Re99RX<|Lb=1%kx)-n0l0g-O5khBP3jX8sT;nZ_A$D3bTofD$F+}k+6WP5;9iFF1% z5Zn}1a@u#9gLC!=Z$kN$L%fD>VN^cb4ZZN#7P(^_=c>^2e3YjNpXmM_6jU~rH!S#R z6<>d@I$8er6UhJ5DXL-pbc#ZP!O#OmNzJoR`hDsC*1{f2@G=yMd3%OH>Y6ODd%&Ra z5L41-Wh>=R&zA{4y=Zue)gl`0k6^C_+Sg2Jg#@HkS3=WITpl+MI@5@A8<%B^P3tQ`M6f60KC3!3&Gd z%EMXO>S@Wa>c`AdMO9gwH%G_jio-V`1yi8T8b_&SVKz|T>LSnB`}f@YTRC{S^7t8$ zOY2(gokgepk?QK~L89!9)>BKCLXEYqOZ}@yl|8pM84H?|B6PQ1L=aqF9|>n7k5mKw zn_G<|(ga;J4o{|zpw(c99VwU^%#LX|UeE%r(?!1W+-Q3+r#3b8ri7uYlfsH01Y0*U z2ss&YGAB-06N0nGp%xI>NQ0W%k71RH+v?-dVCATkAp6TQuhI_>k6@ROOLh;R{I4`M z>dZJ$*G?uo(@?5MN36I`(yNmiAY3N7JlQOg(F&M?q(#R`gvHD4C^kz^{7+gXObe^o zgrc404(A~O;})Q0=&g&zx6%F(P60<1E=MLcZF&b=es{g-yaUBc?HCW3=>OZxkoC znHN*LW&{Z>xy&j2m7CMNPdqq=qS%&clH!HBC&uA@8;xl4=w8FIC~WdvNi;BWmW?nxj}z&Nj^M(OU7qHFH>N7&eF z4z$)f$=SLGULd0v0XzU@D9{=!M~5YAG`d!NW3)XO(=?IFqUuI$x6;;^sf*Ta@tNZJ zqv}^v(`bmhDK{BgCf#jbxQl+DrUs=6Tlwz<1KF48i!~%Cgww9VMr2@Ht4J~Hp;W)P zVLu<4NPDnwc68FJGw9}>IW`PWe!e~xej?Td$B$Lw1$2ihw5)&f!+3y6ig2U0Ju!d0 z`yTBpQE>E)q|CF28>@$F5Y)^jN|oU3jf-)Jn}aIh_ug>A3#Uw)MYsRfbo(pObMx@7 zx?Zb0>#LNBkqNR^0mNg9o43aXi*?JW6~$u*K%gxgSfGnI3thtS%dJ45v%d$}!3or~ z4eN-V8jiwkNvZ$wS%Y-$w9d>2zm_=6zb83N5O>rLButfbZk$-t`bUGuEz3Gg__`4e z`Z~|v4lIwSl;xT^npN7(DJ0_AxZNctaL3_Gh4ZEW^`sN_&btiJ+Kt@Zen)JtLm&oa zX8dBJtJqJ6`HDc>>&$KFt@!>;>d>atS-0Xir^@~d<}1DJp44XmRutX@d;1p|ym zC{L>lAtVTLH2>wyHWD$9{470Yb`Iz3j;wTiX77>R1kW;O_s9LM4-2If$9NGI zuSxJ-J;}+N+4Br74gB6s>IGI4H`T*zOGvBfeFG)h+<+D}YceJp&LPYNvCtXp3epdj zo8HyFmh)W}MA8zW=r3fK*()1fIr)`Nr##KR`p})ChMI~RQZf2%e(}d(d@&lq*E4bWUIlf+Mw&Q-11f7&aR zHjJhO0sLfr!2c+Ur)c2#!voP1wzV-9b+$1g7P7T*GBCF>cKBE7kDrhgWPlI;26W)@ zcSWXawev$4K{^l(ASDkAM5ha^DwD5uvzp2?^Q1Q-1a+-ba)s(H+8&fl7TDH< z5ae+6ndlmIJN?pxc$95{ZNn7kS{PqES{qjZt=z6{3ZCSY;9gv=7*??T6m)Cx*ioD}`7L^;kch|F(N=YCK@|WpwU>cexN-!csD*Q75hHJ! z%8#w5%~R42huYmyFi(VjXwF&o3cT^zgygqLjq@vwEBsJk06ifBH9PtU@W8RpBg5gh z?r<$*uU;=_R}g_ameWzUVm;ua2tt8)W+f6Z1(5h*!;Jph5*aYAm7@PLF%F;z;HBa{ zF7`dDHMO5X`;HRw9|Nocte?0DgKWUQEhAff-vQ7yN(-pnE zz!7B;xTF>&5n7*?w6u(ogcP(sQUL@9jS@F|76Fq|()X>1kFVMj2whm8TF)5z3r4!) zt^g<8Nqxh!rpHyo$;-|S9{}}Uc6bJ+lXQi6nRvyh*=c`dFnIkIxDl&p2}cR+jgxOoQ+Ag%X6<_@#(eVLASWj70jpbGn@Nxk+`pXr6bj}4#Dk=KDVfP&%ISS z9D|Q~#O85$l;#u14oTlN*hMJforb-K^9#fsDB$RgzFeG-wOy8cY+c*c?$Qk7J&1np zdh3ysdQe7Q&CMg*SFV5-|6$F6dSbM=9&u-7nUE|cTyU*dIE?->r!>s79zz`y;X@dz9Rc*Hw(&mP4Ud=pNke>Y!(&u8%?XSrm|0`>PmRI^KZ zCJ!cO6t5#_KLh{U=NrC9Mky-pn&>3tXOm4C|L0El@~>FwWE0u@q^{3G9zCVDIy?X z5EsqzE|M}#f}648dB(TcUbAB;!;o3t1&+n#G7w2EE22n4z!d^M%vRD7q4*RK^0Yf4 zryOH-QaUQ@E>%rv$yr3vxib6{P>eW@NJhfbzR`c&#XrpI4K@5k2m4QS{0A1?KcYk8 zU*Vx_DTgG0%p-&+HGx{oOO9VtKI>o0dkc}@q^_hG$4`LC$GmXW2y5j!=At#wgZSxB z`u?N)Im{&m6i*qIk=4fJdd+jPxw-cD?P3G&SH!3=e4jKjMd61T3sxVtO@+DcfPcLx zva6li01wOy3pFEf{Tuec?>>9W;3xAI6O5>UV6yXIl8L2qW`{Oz5o!kL<-nAqfpxn&LVHw9Moliz+DkA=p{ zIs}~oUIvHZMKZF&Hs(upBGu*@e+bV=h$|+ic!K3EtZBN0g4+6x^eqF&wlEEXi?$q| zk;TU0#BEru<(7w{t;F}YcWG;&0H=TadFEdX#HxC$usRUOV$01xX<(hihAPn3SU(9vVzy6Wz#a zVR0B>;GDPziExO}mu}TZkhquX0*wW`a=pq0ab{{O4Mav9JM~jPVyb7OIFvq{JE^2C zM#RDNnzz`)@vhiCiO!=vYGst6>)K0uP<4wH?L`Xg=S3{8UwbIYM;TEB&|;3~&nvV| zI^?O1b>l`}0smF_9shk-lwz)hq=r25 zjaJW(4veB%RaDx<5@>8^zT~ewC@iEwt$#j`8A3leHx?*Ms^5O|@zt!CM_2BJdvq4z z?dx6Ie6p=An4HE)Fq6Q<_A>dF<#?0n@n19F*C$l3`6r?Prt5m10f&FUs9oKBG|(&& zu_{sFsDph9R6vA>_U1|dA>l~SkVtj}3+?uC|FJJ1n(VFK+up+v{qn#n_yK^BnkOkQ zR*se=8EHxKF`5lM^yJ}HrG?GrM7qTsgS7L~vU5peaYb0sqra-16IT|wW?DbGklAJ} zw5k6dzteGcb9GsAoElv+_FqGLXO)%_P(^6Jvd?hYXcK6u9IE4FXAcQ2R&$dbY2Jb~ ziYeAtTMi7nYfKQp6aZ++`Fbah@kL0GtYfjipsv!Qy|dY4TG67@VapeoBtrC@S%-DO zO-U$Pbg@LNQ?u!F%VvqcPa|YIG=F$#%c%>OAHQpp$re->Mj5bm$Tg$m7L-K$a+7qH ztY}J<+!B(LT$x8kwVW;p1iW%Bk|dm~&C)%o$jkW!*wlV3M7{XpuT*ZP&Sf_j9ovtH z8zU21q@V-71cc@5P0X)s+*xc-m_t-iaB`#A)jP`5haOe>phygl7CGjtE~E~9ZSUJn zQ2&s|)=cC#aP{lo~&c`;N1{&~A`4eo+7pF=xU2XWJ1Z?Rkzvs9_Z}#QlLM7pfQoUXX z6^zRUBD5}7s|9ALmIuprM;g9zaF4mv4l|1e=C!zaWbOCCjS@QDDt&G(Ie8 zoboR9kssH@TwMfFYalzImXIb3e8&Ialn_3uUY;9fCQ;K!>XkB4w zstLPIQ~5{A#?(%X969+LXP*&7I{ZY^$NqWqrRPh2r*yU}*oyX^=-J;&FwG0)jjVG9 zVt)b3wX9xH4Le4%AH~Y7>phx}+X<>9c!0<+M12h5IIRDE%jlMI3P3k0AcXjG`{_fHY?Hcr=3 zF7U2l9zi{Xx(v`hK`spv0DV9Vygfj6RQg=QMzw~_0_ba{)8LK~sE1#7om+Q(V(tudx| zD>oAooQ~R?SB(N$5x%OXy}QS|W!7_$J|=DOD6tEw*qaP18Ls=3O-z>?+k~! zu6%Z1Zo<(>Xg!?{Uu>wp8BOmeaa9%Lxmb>_WY5A;OIDm|?;^T@rj=R-HYVmXK$zxi z44V#Co-dy^D2!i0hzxr?&?v8cC-WGJ;%${E>CVo+DgEc z*Ip8W0SDJW2zAWO?ZoCb>h7NUa%-n@IDCPN`^@S_&&@;a=BAE}(QvqDpcfGGk&RpZ z!(4aP%lE$zrY0|^CKtG`?ZL&ZkQ~*=kR2|u+Zt*e31KjPg4s+Q78997wuEzMyL-d~ z=SAk|mf02go1EJn)-w3S8XdO8aIS`#E%xz`qi>tSh7FpZoggIXf4rjne;0}WZjqW& zA>6c8P<&^m7@7WfX{5`hI7w(~o=!54H8xr`BhUYymrgJGJs;R8>6X?>yfEDf(a;Di zk4zETM5&&eh@&ho-*L+9@7obd)k||3LpfQuXk?#B zenwjER?;%`u>tADq?!eijAf*Ef5=<8W;dpNK`_|0+Wj{?O37?*FxS@@Hn%rcw&rK} z&n+RIz}|yB00Y=bIlcVke~pxjpm7asby)*|CbdEESo`sUJ_z?zwSbA?Xc1}>Hzf&V zl{8q^)a%_@#Y+mB%%P(W%sl;ue%q?a+SqaNLQV}V5DsG^_{ph2TAmnws zsVAq0?&@~x+zqz!x$ED!E#}CIYBAGfD=Nmd2G<&U-X(dH zyv*(-M2kwu2($M?s7U1X)2M2-)CG{>PAoVQ6RDNmF@P4~(xt25#>mRZLdOgtF^~kE zWcS2z|5Zar7MIQIOzi<1d9L_d3JgiJQzN|a8-3A~tE3sKJaKkuVG#&AoqOoAP>hE^ zL!goxwLnDq_gjSKwpap4uI8`XF}ui)>EL{H0+ywy1&|`fl3-TJ>e_B`9}dv0&3(e$f2n;IrKbJ^M68CIY+4FI4is0GH$8&_wmzat{;4WErVVb5F) znzD0oPMS~5U1V$?PQPtWHuNIT9>-j2i^hPnJBW&f3+$~bsm^&PXP6*BvYg{_ zO@zkLb^DU?5)rpos-*9=0hq)|KBd=u3EXj=%p?FaX z@=nzwu-k1DB-Dfx^7FISZOS#z4Wm6Tq;H)tDSq$f77k+_AAf*vPml3&pvSls!zOMI ze3Np(+O7jyY!4PAx-W}y6U24ll!w`!E^1q>;APMEyBe;=7**bNW&@@>;lf7M%^HZ zZKP7EX~JUF4ZU$@Up0wJ-vW)(s?Z#}_b$S?$PXfs1EF0W+g-?{Viki?OD4S1z;yhQx>ef5 zvh0?gE?@{18x+RTZKmQh*4dq+cv!POXHYdK`L#%!i5ojxe&9pXls7eF($pxB`8#%4 z4NgE7c@;Bf(Cqxy>D*N-N>oyQ)RqL{ycAc}?%osAT;)FaR`k#a%CxyS0^f8*X7N;` zH_~i9rART!P;ZOyi2MaOK-hK9@or96EQUI{rnWW8|5Zp!>&xN}4NhpnL|m38Roe1rojBv=P7w)1M;_dczZkohwhRah^BJK*N@;%7hlkj6xf|F$ zzD`(3n~u!UDl_Uo3K<^i=V86srxZ;n;fiNO;}iphqHIRxeJiIcWndP>cDpd>L$+aMMIc!h3Sm; zMAciH?~!l`xJb3)S&o3&8+mX|s$|GscuZ7Y+i8x7aj7}HssM#HG_+!S~K&eGD+N2|O@@EQaEngkIjV+AwJT0C2isDG(M+ zHwP}UFJ^x89_%8^BOpNr;$6~KKj)6-lSdQ2mY9@~D{xrL9fR)^cec2^3b(ez5C)Z^ z0xV#XK_%>l08WR|me9jf8V`^f=b4odp{Wgrg3E)Mm0h(nnJOBi>uh9HkPMEhDg;s) z2|;gh`qm;hM6Pk6O;(uYUO|mi(6YvldkCI4=r7um#rHH=Yy}11%ai$JG-nC^x&wBx zi>QdzyU()f;;DR6g6oQc^MZom9s=uvf>+cKVALd+EwOgKAHzwgh^UkC^u`nh(6TOI) z<4p1)Nkl+WU@(x24?%3Xglzc>-5?fwq@Bw<;VZ`k>QEtVhB%zuC8=mS?7b*2`5iJ2 zOOP51N+5K3FnhKlY0aSm7`#YRc3%$neUg6QZl&oFC)XqO-3F;h)q=!c<239idiY`T5(1E$#{HwPKr8({LVS1g4{fThqB= zV+JSRchw9U>AGX8qMUyu3Je1}Rs0gu$q}+fc(C9&&t?C^G`|3;N0hl&;a2hzT2{&E#|*Gxsd$T8>fDDLCz$M} z!vGH%18S6^h?_(QFT8-SQ7~-(U&tDwI7n7SR=1wi@)mHM=h`b@<5qIH`E?wLdMDJJ{M?j&UnR694> zCZA!&UJGX0unQYzwp#NmTL>!Y^;=q2svTBK_luDA8&Mm!%&Ey-k>Lfa`O8aI!}hA( zxy|m#e1-n^z0rQ0UT?JWxkZTChLnnWuXW&+0!!RFfVQ`5RHCffQH zU@6>tDLBju-xV0mu+a^C0XN(<#*QMUAI$BqKqky6T@dK!Mlh%+y2j0b3Yz|3uGnv= ze_u|`w1V4a{vcBjKcps({}Fg0YwY^}2}~(!{j6!xc@{p53-Ln%EeQ7VtP|r)2Lw-)Ea8Dex@$bopxaW4Fy3IA&%tFt|ff_ho%B*rbXnsT}ZCSlM_ms!2 z*!ZaBw2Ub9JgDNoObZY9psiMeyeKTc05j5fj7BC^hdo}qx#jA};ROE1b+Oh9@)%Eh zl(7c2n%Q0(GLC>@YxTI6J~}c?sBcQj*|3ww zt_9`q9x^BoSJi=U7nZ_*mVwjJZIjX3eZ(cvEW4N%Po7H|C&U}$940~y(fJ<333AR< z!Ct8eFW1WOf!D{XCz4zfco0)TB6&xZD_$)82x2b!>qztoG5_wKO_47lmvMzd7ZA_v zHm;8=mb;2f8v~9Wj@Zm^nNYyqpP6BVp$@JzYGGoSuCN?SP2BX(=sZWtDaYn*ysT!h zAgpGPQ6W8jBv+Rsk%KM0HeYt;PLlmFjvmCpa# z$1fz?bWkhH$HAFL6$T zi`1yIfw`zR;A&!Wv*RV(aVBkT$EW8TxYm~p^15u+PESBmKvO_e1g=;mF!o9Wo=Jgo zY8+CB))5kyUf8ku$bJA3HbAx3Y$k2fIcNgDn$zFI-+;9#nRb0T+XnagCe3|-NxJJ8 zd=Cc)oTsO$p-)GSo$F$sey6rv4nvT`Bjw#tq+iE&k*a@fA0>e?K%`@QiqRDsgDs&B z)A>)ZbyqFSL_$CE>Ie0me?0V0}s*QnaoW z&?%;^tS2Y6#R{8sm=enSU}m>d$-T-%amAUqEuweb6{&n1E-|_=(E*`Jrr(@DeAN(gu|7jtlUWC%Wit8+x@-CgPg=RM8?;rpF(=3T2Qb?Oji%9Xma@M-?bwgxHQxV1IPpEbusoOe!d_ zB5%-fj*$!`L?wRiG4b)0$r<~VqFQI!1dmIxl3x978gS{P{?hB$8`ksgg-wg$^1at~#R~Hhc{_7~ zfw}hZhxwN+d{qS*)udi07Z;x%VP5T$tGsyFMa2pQ1qBUNPs!-S{_@9_--T0MWYUAS zPD=V;9j#UBAF?!xl-ujdvU!(P;-ul7Bu~||kma%Gd6r7E#2{a&fvgK#s@|5$C@9tpwlfv+`TMh^?#$)v=!Z`c;TGB^4=N4jPEVgqNu0{WUR|QuQb;Z zY$)nqidpgTr&D8Kjid-{G4P5~zZ470hkWd>vxf?yUa!4Ey;yVi21YfcHr~#P!p2Y^ zT644Zi`a3H`Y;$NwM3DTuew3H*k8Y#3@5D%eRbC7m19qxb!)$Eo0;=%mv|Oq8ZF5GGQf*qMCAed%U%EDC=t9scxx70G7NP9wu+;{%R|G@LshNu^6I; zV;f)*;{0fMmul}vwQG^+8i@$nj8I&g;9*28=TT}|SrqX6o6di%Mpx9rQ_!KCk;e)| z>>fa&$f&yIsyWgAG5n{iW~jS{b!aFEra5pYRRi^FhIlk)pZ*MC8`TYx=!*Yy%JG+& zgp$r02R2cY>mz$K5_j7+`_h9KTtss3qqYea(5Epc`X|2Yt52->zN*8$n*-KZOh=rY zE02lW1mX-e)1*FjN^GAe+XglhgCSkU-tZ|=`zCvvfFhJBz29%aRO1qx@bv_s-;AHd z8G~ID*yqQ`S&T=sOXdwUeUN_s#^xv(gEv_F|HoYHLw&0wBR6o>y>Uaa@T}ULJK%G=5q&7^_;6CD^ z!Qb&F@do#tND*OEg9h=&j5CLrK-7zd2rGYHKoi*hez);?A5`IQ!|sd1-+(VZ!9HhS z;9%yQb1m@ja&uC^V@Yd`wc1Kg(6AW0f&|afVOY(MbDea0v!#aan!(Kq`GU?XbfbtLdH_EGOL(=_E-i% zW=#XxSOpZea8Zhy2YyLMw^GDK!6F36rS{(0zcdU8>=B1tv@bN6u`&!1q(onXsZs9x z&aKZxGVPLX^gA?bS`#AbqOxa*D2OGInkA3xu$VDt*)+N6Z$ohUVW+SbdD32C5v}YR zMp6`~`gR?Idj*{(DLdK^?K_mdlpat~ATkNl-Nb^k3%}Mi3f;K~4cvrKQvjbW{<;f= zi7=sAS+8!6)RSbc|cHpGbe%a3=hMk7O9`W9@F*MN%X?{yoZnPs?Z3JYBa1p=~zmjoXfgQTwaca zh1ahJ%^qFbiVu*XFjaF5V0pIOf&hO5o2TPYMih%IM2F}EQ{`M&EQFvphzB9;PqIsA z*pQldYl?8V@^I_?=atj^PtzukNVuniYpRQP8<${*?`9o_0CtfV58kZZ$o@JaA;G`!CV-rQVP*2J#?)+eDeMeQPqk~gs-!BZ8? zo41Rz`*{Q@y9R8aRLt@KOI7oB3ra%QtdE9+1M4&uwKjhYvtDXll#_eabpzy@0n75t zA)bD|dtRJ9wvZRL=ZQ=S2U+WJMtR4PdxT;{1xmG}!6{1GQPhO6+Q?be{o%dp_`03Hc zPqpbo)^!Ye5$_oLxN@_C;QIFc&hEsU0OvWho;E>QaFE&cjYNxS)3_8n{RbF#2n8Er z_;btI^#jJy{*Q*@|E^O1Js?%7Lug|!VSM9KcU&_1k@yLV3yP1{Q4?Dt{@4P71pbBq z=ywpe3K%fK$4b%J%!(4Q<~cLIGH80TXu^GxWG0}g)@*8OZhCHXz0$ebTA$cndj8n% z#4$-p19?yQyzgRr*#7W2`RKNNep|uwf&6v8N(;t)1jxsI4kkpjqZef28{CQ+|s?WW&MSVTM6xyHT{-? zn&FI#RY7M*ANWh1f@}5oZk&FEP}hM!hAn&_#*Q<2qz?jpDHFD5Kr+mKFGeU?$w57G zAc?&L_6erNsf9t$x6j)A@!~X_&{b0BAtwb_<@)Tx)GfSq`$kqu*FV~erj>q z8{%L5Jbdg`R`N;eGovpj^(%(M3={vCmThhk)=K)uU!4G%tP`TcX?fzpYZLinb4xx- zyacZ}`Nb9HYRdFTm?bZ_N)C5*1NlYVaB`fmIRcVpBDkQtss3j(dDxe+I(VLl6xJtk z@T9wDF(abxTM{v`{_a3b$d6#7@cif)itgp?J{yi|%DO&U4$_!mEP3I#+r3o85u?f| zKPL33QbtB0q@;AoA$=8B!u(*-q;7fcKr4=T|J0~Bapj~Xd1iloskglYUJakK3-Q1K zVlu(i00t3Ng?&=0t&@U&4P2>@wSzpVq*M9;Z8;YAOO8laVE3Z77Z(}(D>J>YZoN+8vI=L3tPl*4dRLxG^*FKSw=9DL+4 zV|}rl(R1$9n4H{RoVM)LF}c9iajD$A=y(Ydna*n}kh|5(!o;Dy&BB?V5u^e!8yt-( zt3g6W0YY;J(B&p|vPzHa{Z8)3`u%@6>Mdk>%^U4rJlU(r8fJ`qTvc_HnxAImLYo{1 z20snmNY^%whfI82_~MvOf?6D4>-Nxi=a&_%vH{W=e31$so>aW$u?whDV3PXwA1gzB z37N7pu6Cz2P}ZYXr}@o@2`j?T`-2+F+0Z)wXyCKSa$Fp0UuT>x-OkX=u5YihpG{EO zzF+@ICkkHa<)sW6P{>>~nNdwExe~CSE<(xk<&MPFftNqp75O+~z@=XeW+=^&i&n2H zxpJ4=__l}5pa!+hP9rhyVZ@Azay&aWE$U>?GLVnMNpQ&cjxyx31`#7xu~?aouYT;b ziK(a)mM>~3J69jJHrK_yLQnv)9{pwMAuy;8!_#2Lk|;#Mh%CyYM3xno7t2{nX|ED6 zjF~p0cPEvKHWyyP#Hd57HdCCJjI{EnUXNaZzRq%tsLB4(gwKGSYdwz@b7itWc*kh7 z#U8dQ1w8ndD|FF*R%z36li>^hUln!S7*b`h1iS6&6KKjRcvVX-c(YXtspZWy-2D!$ zO3Ydt5h(oMhmf}#mZ9bR=A^@*jK5ebQ1^Bs0LAHlfiYwsQzj3h)(S#A3xy1Zr)v2_ z8EE@+?aD%2`*)DEf?X%=8rkIllkEyX$o3C3zJpic7A`3@x~Hp>nLkAWr}Q1cs#4bl zS;YbWaF>Z&(W_(e0n{YzpsV9|*|nuQNQqVZB}tmm?bi@pk^_73#XXo0xI+Zbky-&gNL*Sm15QJdG{;%z2O&(Fs`dr( zV&zwuuaF{cNcS(+xf5y;Hz!#qth%sM*5L?auF8T+QTL)(rjj(*gU7dnRVx@bGCVmO zKgIc<4e_v}bLRuoS!91bYua{iFk;Y7%}3{o9O}zs2!%<4SgA)xzH){{Q@T~0VRFgO zAD^Ooo3AoN+-@F3$37}kWJs_c(R+{1R+w;H;mmNB3Y|4FFz20K=dRmSjmknr6seYW z=q>JX$L!2BP}__l3MxP~I}9 zGM!p6L*Ztk30{_2_22@Gs-kIK#g!BGEXZ@4UBL=Fz@(H<%^K{9Ei|b z!XD?>oJ>FV0u5RqD3fU4EIc|54<;-RmHEFY`^NCh-*m~?HaoU$bZpzUZQHhO+jcs( z*-6LfxRZVVbLO0#nLWF6_Is}D{gCH=esxzpRn;V+ZnR1K)EGkk3x!3o6SSmG&R<+! z`kC-g+0YI*wVj!&m$<2$FK$K7+s`I=M`d{7=AS_uPuifr*d_z@phD`l`3yhe55I`FMK?tq$Z*1$@aV%bfObOF2pe<3x>%v> zWK>oPvX$3np&eZWSccUdCC*^Xp>z`}ADK`KvHN;QbS$ZqdmLd)uezk;kG?6_fK#wE z(6$`8igZjF_!<+6BWK^;y0Wl5 z>lqFX@&ymGrQro(;ITsLQ`sbp0fSa}K!ig}BjA6q8#r4KT@7Jt*td^#Z3=B#dqC+_ zJ2zNL26EO&3>9JH?OINL$G{^^!$w3kYZH8xHY?CKkNjk}i=I{xmR+>NvrJbBHYklB zJjC0#=!9swfVW7BBOl~ZfQ7hOG>+fZ32%0HwyYc9@ZRqYn)8jwh&OI+H-kxg^tLYF zukpLNr=q-gPTMFe=-KP$w1-JMOg4r|`;DtoHDChozyjk8+th)MF=VTOX*b^UZm1Ei z4@ygoy&v&EQZCXO#^JnXlz>_p6Nn!^Ik^MWM<2C=(cTIsn$

    ;mGU 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

    x=ZpYrydkzsS zx~81^dW9h`(7s(8YDepFG(2EwY`RLjVK7(LRjs_hjS#QJoWErmRFOYaoi0%|=Yq4M z-9mvK0pX#zx=@w&{-$%4T!l%mY3byP{taw0@u`8B6;Gjqk|$O74K~0ao3y(qF_mcL^sf$&+xGrD-xr5~e6ptxUH&>Jey_eD8=-7F7 zgoBuC!Em`N=zx|}st-I%bLCIBYg4Ama`2g6H9oX3U}qy_K5mZI?;rg4!bo-MJgF$|?9&}=0zw=y0+9TbdPEG-INDqyQS2%In_5Yy2^;%|B)^rP;;0Y=KD zsvw)K0H0&Oxe@wmBFA*Cc-pGCsR=bl(t2ZzDpM~+jiqaMiS}P@B&tZ2O~hqM-RR2c zjS4sNN81e8HIt>=#xqBhCF@>{oskl8T-rnhq+)kT{c1V0rTY2hJQSdW+iLtBd6NCN zufrrOV~8s@)#E!FdyG8IO-rk&V=lRaE}{KKO^RjRHd3ub)G=b}Fdin{GYZ{0>EoN3xkM%13!l!wcBuYZ~A2hEQ@~mS`gtl~9iNl;_{}AVe`vI>z%_SG3o1*>)%c zJlN*gTVslpA}oaoS84e2ECGBw{_cGmm~04?x%JuUFvZxQ+Uj01)w`Qgyn8eo7G~Gz zx)_Wvh+*rB!eNS%{xPfaBFQa4;$j>u)jhEKXX186Ma2ypbGu+^5(2P1S7P3wTZ87< z5(Kv;&9pcdt~>-aB%NO$hVfc7<*Xw+YtD>pV#k-`(orQ+bw(J;5cRtwt#G|;NN>9H z!qdfBf}Pm*{%2S?3?D7F&yUi1{3%lYFLpa%EB2qoG=(N%(?_sB_Qg!oKU-L) zFQ)UgDUx8R*vBusC!^=g84k~<%l?I)KOY#q6))UD&vFt52$B@gdg`GY;+cK#6o^z5 z8fqx{)Ppz#%YiR^p>RR1RF~Hfck+)pw@43oBX{E1IgF1-5^Y193hq2Vh4MN&Z4-8F zhpo<29|jFJ7Jjy=8dFD`J6ro2-JRXV9T$#V!E6KY87x)MaQZmDB5U1dK2E>PYY~6ruexWb=TRXb; zE%L-Hd>FBXX+st;5mQB9T_FElhS3;|LQF&cqfFJR6|~Rf;8cu4ly9i!Ai;Z5bp@t= zyluZFUGZWEk_D>~7HZLlRRA~GsJl(vK(Ef5ug_7R+qg_OqHErR4HM4X#kb}jj|-cT zQ;W%gjEmehD;cCrhjXk)O3pWD(l+;-b5^Lj53U)tu3!oC*AvMH@Hw1lm)i!oxEk~J zlJU2zPaGvR^P8-7iuv+qH`+1ayHX6Q->UUjL>r(f5bEy|^mp-V%Ql>=7$mdpBi1J& zOY7q%*>Pn2!QBl*RL%3pE&KU)AYi<@w&`0H9e^3n5sD~z&gc&e^7P)7z66CK9*RQw zhe|@xIIC!Zvv1UA>8Ojf^uOJu~VF`YG^fl^q{a6xQaXIz}|XB-|^C<+$Kky=r* z*#@Q0Z5h&0g`*6$hfGr=1Xb(&s3<|@5%$Z&nWxKJLoF%GcPTAOD_Y?Mhl=6h0_lTl z^(tm>^TR2mD(v`Dh&Q~G7m2?$QG=Oq-l8cl93ragF5@D!0}H^6n(XLWGE1VbJ{ZR; zu$r(wc@rscmu|aUEdLZ|1czWT>$7nw5hUcdiq|uk@8vR~Xf~Tn!eS|)D~JwL(yn+* z5E89!If2m5D)RFE!9veQ0u$B1I}1Q3bdUBq%F7KIPFM>I8_|oIHRR63hz|rT4+uI|PTld?Ud+7p>CM1-~=+&{P zk_1LvH`a=)Sadlgne7Oa36(YyEuNR)Oph))z`1=-T!BOU17+WK0_3HOv_r-eBSs_W zhg=qwfSRO{+?cv3glR7o>qAK@$r1L=E9~UjdMB<9E59)X@p1A9OKsUT|@H~Hv5gDt}F7*NZ)z9=Zv}C zn~~)g=CZqR?Q6TIVXAkZ!MbZZ0%U5I$^)5d0rs_xb9+_b+jZ6ZyB$d9H)Lru&^I@( zTR^ZY{R)QL{srrB~#@mh@^h)>sJ7$>e3)bEl)p^yJ6i z8QVXIb29DJ3d;HL(h-lfLRHK(aePcywI*$^;1P<{xW;$r5hLo{ef#35vUP46g{H)i z^9|hh%!b?}`|hZ8b~_PPU4zRL)H?cilo2axowRdUkEB3dB=Z>8?ipA&wSQ?fZ^R21 zI8aa8ZU8lJBAn#$zx^y|OOiq258A7f-=QRm@>OPY!gsjXF_FYVp@>D0?(&FRyv9yP z@i|5I$6mxtgmRbt`p{bno>#A&oWydQmEOd>evx~!Xfr)QE#hFxV5=4!>WvCHiBwzyFd18vSE|qppre-ZXwJic*wgPNWd{Pc?};h1 zHRf{`D>DmmS0*OqTa+G^R;NG@%}Q|gE~f^V5=wM2#aE(2N+H01S*a^S$8N2dtxMP6 zK(b7x_vG{BCp(O~nK31gmIM^>tpu~OrK&vdo71FEIm2=$t%c{I5{Z9gs4V0L)>$t| zpt?f;U)?SiO zkG#?&cb_0gAZIYr1R=LWZlkKk0t^xum@<*6PsT4g?Cl^jCSOA$8W(qj%ToebN5zb0 z3u>y%?&DM8C^KR)L>+>3X-~SNJwD8G_)RJ|<^PPhl~$hg7a_tCW%gq1zRx%nZD|t0 zXEFY8VT$_InTzc*bm_*@AZHCKgOS6&wQJ2^J4+2~TOP!?S&2pH?Uze`BZ$ThxPHMA zK<-mw@(N0Uh6wAm)nRu_ne)aBRSKo@ggQ&HeG?eYA5ZsS@~&?oboq#)dn?dV#^^&$ z;PqJ{>NMWM7^8IowuwguZ^8v!%%n4b^jPsc@w9qol7w->5yF{$baTLiTaJN0eYXhL@A2==bxR`#ToE;=mT4}tQ-t0`3oVaXQu3Vma<^m3 zQaeoJaE}F2zw7=oO^rE)ff~OB4XIqeCmq`>G4p-os5MCwpez|Qx>U1r7S#R;KtftG zw0IKwPEvHOXmRb7hiS6UGH`UkKa90lEC8MB-cOZ!zLU>KWjb4>UCcPzw9O*=l43-O z+FRDhE>-#~CSPGhgwf@n0Pr%QrEND;5$wKR3CU6Jb&C@w zke*7u9#KnxY^&z*Byk6OBO6H?QXN^1gY=nKpo+DL-lY>w_)=oW=1W#-1~8#BGoOv)1OYDh4o%DWNo&yDZabbwtW z-&-sCB{^8xR3zc2Ow~_y$Fm|&><%!;AvobufY@LBcvpA;#j}t~kiFl1x5*$D8;qh~ zAc#E2iFwA%Cc&DvAB%)ZdT zXB74P*0&P6cNlo}Vt$9(LU`=I1XGPh@IheSfhKPH!m)y-7RuZ9lI(Q+YET8^hIUpZ z;#-4BwS>JDBkF}^%U#CSD@WK>VAI<>_cbqtb_pfhWqhWk(8jTgT$iVD-O#it>57}O zI78qrFFN;av;bD-fBw~%?=&iMdTIXKGh1j+G9FF8iL+LQqn6XU(!QZmvoL^g%hKWR z#@}J)n04l7BC!f#Cid-yCq^3A1@5cTdQ9o&>jC~n14Ld6r0G?)2yiaBtUz6tT$g2e zE^8&Qzwg?McY3vDJHZY|dpJCfjr)!Dd@Iy)B^jR?(SuI8jg`a)eRsd{skZPx0<WP!Qotpc@g z4FiiD8%2JNuP=;qYoE{-MZhK&p-R~O(!6i&ih9FtS>yiOie{K)=ypZws7(&Q>4((2 z|HxLm`gbn(8%~35n^W`x?euMtz1km3s-Vi`#WGlp36QV?WZe$Dq<>iQFl5~+%m%t; zdO5%SO*6-)#EB@f=Xm!3PXb3uDVaV8&!QL(6bXw%hqqi z=3^s-0w$Ljwof9DFXjhqn!EsZQ0lYxf=n@{0r6TwIV)7xf=iPhzty*vL-$~L3wU8Q z%yR1Fkw9;PeWM=x2K?vs%2tuRNB$!fM9O`MC}~0U9K`4Cb6eRF{=UVqY0S*^>$EFv#hmV+?>jPI%NNFIxH`lE z%6j|A-C+1Obi~mSaWCYOs0;z*KsBW1m>}}tZwOp{-4(g{+C2O?s^ewHq8}85M00Jm zvp}!<)Wdn;>)2DC`%}c%S)#|FO(EB03$s8?ctXF(S-tBHFWiRbf9l;U;4=-g=JY>6cH|<$`#Y zbE(WZoI%nOM2qaH(XNkK@0m?LcR21@70}L}ET$jkq{BA6FE2$h^?DZ{(^G3}7jP@Z zmJCTtQbE_i%$bT$i?{@At=gIMp9*0Tc!QaU6CUZ{Py`#Z$0w(+1>OA#-Z2DX#ux(| zhz}f|!8!x+?4uhSt`^v1knx*T>1EUaAC`Ws?eYReVrdY@~6D zLz?U}epbJ_ffC-IYq*9x>SErh$?mas_<@kl_)2sk@vc=zm^J zBMI}snQ-{@t|8e;I4?p(5i?lbzumNcD zL;Zyt86eA4Drm%xZ0JEHd{LXELyUa;jDlrI!Jka5uRhyV@Y>(N-sVG4SNbbmnttd0 zF0a^0liG(*P{BREbX+^x*y+yX`SbnouKR2H;Qg0P;A~h1z$Rp0Kn8)B8`0=mhCv$Q zfTn@mU@dvD)2}pmqf!A&@l(18ePL=AhRR?&EOmwn2ydQWg4ElnP>Rs6@bR^Sa`0dm z1}_gLQPW^;H!3f0YAY5QF;(o0mmue0 zNs!RUP;bgnN|G8@dgvsVmH;n?*-|izhQ%!%lN5NC;%{lpMz-?`^DQ-0mM$E(bz-gP z*^yVE^&=3!a^POij^vz``Yt1ra=wt~od#;Svfa3WwP$=gXs6fBNmuay$l z>kR6-vW6d_NrHPz1pqoDW zBDML7tvmXHs5|z8nPTKc6nwD1`?E$qT>^NAV>)^aaj>u{-RwGV`o-FmtVG$BUu+x0 zeQn*<)TDmgFT;-O|TCNfIx3V2JoM^Z>$>zHonb znwfp#NMhu;gu0ZXJYfTF4ck$fPbXS}s;b-#@h(2LpjbC}xhf^`Vf7-RP?m{wf55e& zUe)=yfi_;_OzidW{dfVSlCA2Sm|#^~IJ_p8979tAiG~?fRMcq^Hhe+Sgg&u6ki)(! z*g>v8y)OKNr;fytVY|;K)7*x$`GaQeQw}GkFv6dmdj|&Zuv_y58ipdChTs9QPpvUv z=3`FhqScyuhu+`Nnamte%g)&2BBu~{_Rdk2uh%&weFP@W;@wh%3vTOD1%I%PqNK#h z4T+T+5G!qj3aRQGs<9HvXb_e}+-7b2_k{AnaDhPAx7mOA;f(iFax~cdqf~}ILY!_6~9Te zAoiXEQI}}4^GO6JkyybFT%O*A`%QrV3GEJ+JQCEj-*4euJA8R=1+ERFw|RW-IxaGs zX=esIA6g=$sB_AF5AIoEo?cCzWFDS2st_RU)=$8FqIZRVDd3E>ZI{=qBBzO?g!Z>W zdGXcKp%kv+Jg}{JnueK2F5HY)K}eG2^I1DM9ep7_uNcz%>j=A3vQyvET0ci<@)Iu6 znp;sD{8=lG_5ftawjNf(QabTnHoq~Fkw#I5e5M_9ffZJX%X!hcYcsLjLy)NWu6*E3 z)Bs}1{yWD^^VVul49i6VvkhR`7*_6L(*1upz1dZVvfw-Qmxm>BRB~ zPEpJeTsmAlACxNCnJCzbHnC$owZ|GDU9F(Di71Al(Rg8p8|Q!n0ttg{L09mKbz3hf zIQDV(WKG1VIO~gg^*Z?q{`Y^}D04w0)<8ewtkusr`(JW-{=fMihks46%gHtJ2Z4)u z1n6w$8rUcK0&QHth%3dc(MSdd^MDKTSyA$FMUliIZxn8bCT3~oOdq=dZs@^ayDlzO z_Bbm9(IyT~ou)muJ&x)}&wqSAVS2eM8HL2?CIeDeR~0q<<}jM!BfaM4VC?8#3oa%SsW zgutHYJcn8iy#;{UdNd~(g4?1e?^!cyjVa-tjkKF!G&gVkeQ`Otjpb@P0u6|7fn&#! zXQ0-(YQ%FWss7Duev}lxwKx@gjlSQ~Q|h*ZL5uJVj=mUgY)@u;UOi#X29&ZKa-kb(XEK+32iO&%6Bim9KL3^VSVmrl4hm%UEfW zOc#IS6yXVy(9(8<;*4<4sD&5eUwg?gHbbp=?O1Y@qmYHU>(Eg>vZ0Y=Fw!aGm7hM+ zzLrND9Ofab6c`uSB=ss_KA97LiKqCGDYH;;+Fxqcec<8JF$2G4mj0!uAhTGcHf5&X zzG5%75n~$nyo+U+X!&8q>S(HLmDAxeVjf;TWI0cTxeqAy#IZaSD0KVdMKMchnw&rmaxxl}2&BOA7bw-yHJZi&GzH4@apif5F_LHyU1&(*D{3WGI{w57Rdp zOvRQw zHXl`2OfUL3Ghdd{JL~j@Mc&};viy*YLGnrYO*zp2R~K0W71c~{HlZG`=q*GQuw9Uq zmdJPiPY^uEy@_W>7!8Qn4NPH}q@B)R4p(>*6+OZX6F)u5zu4pO1O;q{@wb%z29`N? z{z7!&Fo)U$@sabs@Dg&aVVn{-LabfMO7VF{>=+pQHG1(uKRA!j;1jQRzHCnHc))xI z{}0aNna~;g$aol3L}nyZEA`c=mJ7$G!yS$;`TI^;9Xvk%vyG0NT18DNT;5Y&Hz}TL9+fH87)46Pc41e1R;qODU(#Z!i2g17(C}jauF#31)&Pg69kI{bOjg#76PQ zrp{IHngxOIJ_yh7gi_L-2r&jLyZL#1mi%!y{FhS0e;+6Ro=b~`)qbTEv71m2XV_m}7bl75N??o?@RBLU(_UV&aihM#u0MQ}@dOU3V|5=5GIj+e z=&gng=#?Y}Vket9%CfeY)IFQw zV~I6tDlzyxr#@yY1?S4RIq9=*N!!ypIfjQ!^D0X4Q?Rj{aTfl#An&I26>^^4IE_v6 zbrV`vQB&0^ka($kjT+1~L~|TMl4BZ|wP63xHz~(;(D34_U0>dX!%y?BFw3cM+CuTG z%(y8HA?{qZ5mX6D(4{cdaW#^QmLe-6@1w>#+WDw(wxIR-;r6)c)x&Oi z@8f}61s1B%3s=zd#~{KdrFV#duDPVHlP)|_-Ppqd<_I859@c@Uy! zC7}V=J06%2JGFu5yW(I`_?25`-ZK5Pkdix!Vl(!zz+iJ+AKw<{k6771fp{TzNHD*L zW{^*(g4G9R?x2=$tzm9gcZ-9iH|K9Xr7T{6;EXp_>~w*!K?I+{r?s6*O%l?X921smL<@AJ z)VG^DGrNt7YX)1oX+%G470GVDj|0V(HZ@8JA>`wT+50-~sk7e|GyA4cK)BqfY!)xW z@(D>iS}N`3IKsqkXiJ)`#SIlP&+DYq9W+>nRe0j`9#yvF%cG``N~&UFFnghyOK*Wc z878wkny~Igy4S}BUM(VE&mcsTVDI}V7NW_jKGGY~>6BG1xZO>z7a4oR0;@UFq&+R) zTXe^xAc8G=!Y^dEE_@96T2=yAq_~84%srS8Skj876PO-=cTB3P=U3u;cK8)&{180c zaB|twqVeBalh1}$M?gr9XYP<|z3q@Tc}pXX7@^+Qf~Zcm)b1nCzel zuuDeB=%olxF?qvd0Q@}yWl;EWMn=w@B2QgR6zF9PV1K5uqTr?LdNn zM*~Ge&mrZt3CermgQVOOhs)u4&%$xbbN|kg3ZMjfTX6w}Y9cyKNCrE#-q|p%31i89dxy!k`Z4v((IbGrBidnEN z7aO0KEJ4WCfOBi+;5$D=yahg^(VF%ZL~#{|7SdzKPFJY0A#%EceSE;f z^bYR47Bcax)il43giWfu@^UJSoPNNC$P##BA~sLcGH^qzTu53J@3up%OnBrKDWN7% z&yf!qkDd^gv3?%4W2BVaYy-t`PAB(Z)r-!*$~_mbz=C?wk-4I6{?m)=%c&2s~E#uB-VL45`<4(GVvH=aMlTHKz))Cm} zq1Gm(beFp;J51r>I9;S8;@%@2suT)^Ztl4w?H})$wWtNetz6+&LkM$5-E`1cJfl}2 zY!j?UtBpY`Oh=l(%!Zq7SfsOxiOqPoEojl%S>a*yAm4(6Ds@M*(AvI0m0Kw~`HbDZ z$9L`!L!zBWYBZR5#}0BK#gKn2Pv-j#u&s(0+fo*~b9bnm18hA2yHsb{8(NtF2#87#-mm7ol9>&<}wV z{`y1U;IciA^Dzw7hRfAKa?$7$>8L5p!TrT!nXbwg(Ngj#?MT9K0_189+ggc&d|Ld2 z^QEqsHZwY|^(2gbEBul|2lyF*kARz069y|9vIhxjyUhQwVJH_8s29%V6CpPOXVr^$ z`P&uf!Xxs2JQl)x@nM?6uylJ02zQ{|HnY7%1dEoCM%gp0_T~I;`M16sMQvCd1OZwE$=cfz#m#u>-ot3MFsTG~Glerb0iG#7Rle?WUot?g+rM{^#jk%49 z?Z3wc>8LJP0Dk148EO~#Ik7}UnuSv(M0p5^Fdr93SH_F$K0$ksd46pW%r|~ zhNND-GYOhkEwkjMqI;)UDpPB{Y{hE8_p;twSBUM}NlC PuBn5Kh~yW8)TWGEn1Q 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�h$;75c9>spCBAvL*b6E~$zO^i%`1 zvL-y}050Ve@KObR?g7oS5{Rw|KhX)9eFl)Jgx&`QXe|fEYr@a32e7zrnJhq}@^0w~ zUPc}VnAiin+_!!#Kz=%}yJyjaG*Iiwn%wisdKHBV8>`nD`ApB|@Jt!BOx(kuu;eMu zwnEYtpI^wJ@-L|)xU{+P7QK+GLYux9fX&kWj=)RfRiz*JBDv&*uf!=?%NtFRTlYK* zG1rGbCDE*<50uP83Sn3@1dMnA7^bo?>qD(kA90aeN+s;J)fEom?Fzx!j%K04r3F8y z0sX~eIC^HHl&n+Q+tXLL!%LP*?RX=Yg;ywgEMLt2sqT?9ueQB&BbPQvbPT07E+<}h zQtfGKjbX`*5yz#h=`kpfGB^mRp>?UH@vCjPmw?XYbTnMVgb*MqbrTi6CJ9jRvb}D%tNOW#vl6Eh7olA5E zr8X`mUia_g?bY15MT?o=xjebxoAEfxNMH`HBUP{ zUncts*@TJA)JShaB?Fqrd4zQpoiKwNeF|P<-%V<9b7>A2H@^T+Cuh zOS_qFTg3b?Qod9d#@Ye+1KSfi4?ur0q;oR!PBQrMAAS}I1qLYv1PF*p;{S0NQ~tsE zA6p&p+9V^mBb)twxOf<{+RHH9#bTRmb zj)a{QE_zlYS?H2>sFfU)*y850N!KEC2N{&E9!k60+H%hK?FV;z<3FZ)GoQ{Tx>r8x zJw6Vmx*!bcgvf$FZ36Tll)A`1R!6%~NJvG(4rh4yp zuk}9bPzB&Z=Z89OsIVh@?G5rt=}9{@23*qlVUGJN?8sdQfiP17QVyj6lyseuhdQ9- zlz{X@zV``2HFZnkniG_qmQN=r<(_$n3-AF2fDSbQMRc9U3a{osF

    OmW((SBZIJ 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 *_%%pgu;vc$0gl6)jD=$O**|lU4Y1eb<^L+} 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

  • #Wy+hTF;9OD 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⪻qy4Ak5|T&Jc77@kb8& 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

    C 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

    R3uee2r7;~h8bKZ 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 literal 0 HcmV?d00001 diff --git a/FCL/src/main/assets/app_runtime/lwjgl-boat/version b/FCL/src/main/assets/app_runtime/lwjgl-boat/version new file mode 100644 index 000000000..b8a97acdf --- /dev/null +++ b/FCL/src/main/assets/app_runtime/lwjgl-boat/version @@ -0,0 +1 @@ +1727138748321 \ No newline at end of file diff --git a/FCL/src/main/java/com/tungsten/fcl/fragment/RuntimeFragment.kt b/FCL/src/main/java/com/tungsten/fcl/fragment/RuntimeFragment.kt index cee04124d..096e8ce95 100644 --- a/FCL/src/main/java/com/tungsten/fcl/fragment/RuntimeFragment.kt +++ b/FCL/src/main/java/com/tungsten/fcl/fragment/RuntimeFragment.kt @@ -51,7 +51,10 @@ class RuntimeFragment : FCLFragment(), View.OnClickListener { private fun initState() { try { - lwjgl = RuntimeUtils.isLatest(FCLPath.LWJGL_DIR, "/assets/app_runtime/lwjgl") + lwjgl = RuntimeUtils.isLatest( + FCLPath.LWJGL_DIR, + "/assets/app_runtime/lwjgl" + ) && RuntimeUtils.isLatest(FCLPath.LWJGL_DIR, "/assets/app_runtime/lwjgl-boat") cacio = RuntimeUtils.isLatest( FCLPath.CACIOCAVALLO_8_DIR, "/assets/app_runtime/caciocavallo" @@ -120,6 +123,7 @@ class RuntimeFragment : FCLFragment(), View.OnClickListener { Thread { try { RuntimeUtils.install(context, FCLPath.LWJGL_DIR, "app_runtime/lwjgl") + RuntimeUtils.install(context, FCLPath.LWJGL_DIR, "app_runtime/lwjgl-boat") lwjgl = true } catch (e: IOException) { e.printStackTrace() diff --git a/LWJGL-Boat/build.gradle b/LWJGL-Boat/build.gradle new file mode 100644 index 000000000..8a8981e46 --- /dev/null +++ b/LWJGL-Boat/build.gradle @@ -0,0 +1,35 @@ +plugins { + id 'java' +} + +group 'org.lwjgl' + +configurations.default.setCanBeResolved(true) + +project.setArchivesBaseName('lwjgl') + +project.setLibsDirName("${rootDir}/FCL/src/main/assets/app_runtime/lwjgl-boat") + +task buildLwjglBoat(dependsOn:'jar') +jar { + doLast { + archiveFileName = 'lwjgl.jar' + manifest { + attributes 'Manifest-Version': '3.3.3' + } + destinationDirectory.set(file("../FCL/src/main/assets/app_runtime/lwjgl-boat")) + File versionFile = file("../FCL/src/main/assets/app_runtime/lwjgl-boat/version") + versionFile.write(String.valueOf(new Date().getTime())) + } +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(8) + } +} + +dependencies { + compileOnly 'com.google.code.findbugs:jsr305:3.0.2' + compileOnly fileTree(dir: 'libs', include: ['*.jar']) +} diff --git a/LWJGL-Boat/libs/asm-debug-all.jar b/LWJGL-Boat/libs/asm-debug-all.jar new file mode 100644 index 0000000000000000000000000000000000000000..d5aa15e05123da2243035832b1df72fdda1d5090 GIT binary patch literal 321450 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%0AFLWcgy*J>J{L`J#FF;L<+a^D49@vzUdS)d@z$ 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 literal 0 HcmV?d00001 diff --git a/LWJGL-Boat/libs/fake-vulkan-module.jar b/LWJGL-Boat/libs/fake-vulkan-module.jar new file mode 100644 index 0000000000000000000000000000000000000000..f9eaecfdefa54e44cd51357165ceea3eabe991f7 GIT binary patch literal 6017717 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%0Da*!V#Q2u+F$*| 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 z%0D(0bQv4WhT=FABbU- z%?K1no89nTRfqMQC{p?-*^(PuxP!W?+8=iFR@#Ykjo(xHv=PT3lSkCD(P*CbIC61o z2QBdo&3;L}$^|U;;U6t64vWESNN{0UH1Ch3>$Y2O*_rLgTl{K z>J?%TQK6rby+JEZGKmuQT%j*!bG5ZEG#3Eg`Dc@xn{?)2+in)OVrivu*nU?oK&_Dj z&&};cqPGQ&cKwLea+9esvk#Qt3tM}-7ght&fmRoDOTE3av&v}|*fDH&Y}Zur%}a5g zW+uB5??DHvSdizrxDQfR3(ttqHjrFXG0CLgAUe&H-!@2l1(ERFgSm7qm$3Z?9i|uY z-j-DK`qId<|LQI48SrbM)M~iDnf#E6aS8}4Fr=aJYWvRS9omuuA=vDEJQb~gt;6TnYi?0W>(fl+Z~^?g@yTUO^@FPST6!!tO9c|&=s%0 zNo9J3#ksUZ1S@-NYe8uy;MHzY{8)ZeZC&&jm2Y2is}D#>BG+q(eCaC7;Jn03*KobB zRI6t#Zr_)ObD6|W-kpSvqG~Jom7QJ>&)ZacbqcqrEahHI$pKL)c1!sy)9AEf@wWNW zwsf7M3jWYmj-69&WM{iC|A3!a7qt2d^iQqvxhydiSG}wytSy0!NFiBJ=E-Khq<-SJ z-C_WoXyPHA1d&>#n1p+{HXU3rdy}xX`qw-<&WDM)!<_a?o{j^>x>0spT(bbUGqrKn zv6tdqT$iQS@`7Yn1@|NR@kiC^TKYAfqXGeivWKAs>qRzhZuF#sU*=MVQfVimgplqo zjCQ}wHg8$Vk5;F;d$Z=hp_v~vQzs(qx3j&Sz_N)UUi`62)_@7q4R^}BPY zJWN&kuW64wJfCq^Y{EFR=T1e*;EStBZtAK*)}&Rou4L23k=j4>FY*>3DaXC!)$T0k zf1582mCNid2eezTv08FT)2eCFIht)h zUD@CS(He!=b4DDVaO5S02UO$!G$a43CF_BUtOG*-FQUsfNjc z-b`bwwo+cJW<(pV08klr-S|-#W&!G4A_uAV?AJ{laKq7t$~ABLsL0LbnRb+JwD=M; zyl~Nim~8GS(2=A+uGqjqbonQf6gNHceQCBiCDH6CR?C5>VZ_>YlDI<3;ZZv*!+F7a zGfOYMpn}jYoxEHHopWlQ(it7}>Nn>iyie(Le0DDs*~qB|B&zWJxr~1I8|of}@DXjW zUr`eBR9sYpnryBH84Lojq!|zE8fC|ZXdl&xxfs>3IyXZxAp4*dIs`3T<3|jrzL>7; zi~lk5QI%^iVfinzFLiD>8s4;Od>+jA0z&Td4T9Xhu9~qp&%T1UwKa06aR)ZkbD!=!7%RQ*VIxsM^u3Tia%z8u%-$auMBgC=@R0boB0@#1 zn(rCDOiq)y;G}?8i0p)bl6%m&g6?^QZsi?XN4OjaZmIbMJFwA|6P|DP5~4*pUqk$g zn;gNWbit;+`8#J^LJRvigXX+amk4H@WCH+Ugbh_(?K%Lu?9_dG+89mRn2B)iBW=K- z4!~4lf_XclpaetWau6S`it9if--hz2HDt(tpP3lYfW$nq(gP25@=(zcXVzuJ2EV9d z2hFNU!h456l9-_HY$Oqf2`$xsMX7~P-|BYYGxC#@N6fc{-s6M$c2YiWx`~{KOZ-o+ z%E6u8C{%2mgKLC$9{ukb=35B@Vj|6am`oT7N1D`L6cRya7w}m2My0}GiK*oqF|^}` zkAbvqqo*GTnT*dPxeCi#@I*VC+sM1qX_nt4XLeJ378v91a%fwB5}Fd^eFO=Lo)i6# zNa?S`cgPY>#0?e%q>T^+MDYLT@cldXm+GO5H-a&;9XJ!%2? zTk!9LHu3)HAJFcC0!NpuuBi=ZWsqBMm72bHjBS+Yjl0xI=9r4>L_Md$hmfNvp9P7V!b<>q?+FJ{)Gdw0_KOZJ4xs*K-KSogx()S zh`d8juIc$*pNQg4oyCFl&W+{j>zzEy70DfRntOr=Qrc6z2T>ZF>6XF~n5lr|k%%cF zxpUk^nA8QSsets62_X<(fT5qV^fH04G)O_|bY9gn)B7a~ilNV9)H_CBP~ixU5D3~W zd68W>ms0AIHi3asJ$E;5+PxRx{DZ%SKgM9WyzxKl&US`7CBqf)si9 z_CQ|WBPjtWH1U_gHhaJh6=LSs_tyYAGe>QcB(;W^$q)6 zO03|3i)14%nBl@Xsd!|?Xj@_RU?9IHXH{luMt&Wp-1sayON2^!@zoZ4rHPUp z;=YV9W-l79+zvEPD)6_Y?(%+}(E#-TG0Zvzx{JXqiKG@*_(*ZSv}~W5^u$fFN`1uH z;yID-RwGPMYZU-C9`uI5kd=j%eGZhSL{zfL@^o1af6 z1b)4#E$aVW@ZRsv1c1oD_PxA;AmsO2$T)t!cOIoO$_A2|wtYF(EN06M&18ElEn7x( zr}p^PD0}*yIzvABpzY$dL7{{Ip3xDdn6L`jSS+rrdE#yUtu9|tq$Ak)W+h!O1!cc^ z0Ysp5|F2exd0iN${e?~|oG&vQCy6|8l)U>>m7Sdyw*#&suK8iQkpz(qKb%bT1CMt+(h=@=!mdea z-ZcX?`t?zKN%|DZE+L-Nzy-q$BxfXZ{HXhCc9u~s*$TIN9m;~UMEu>Ma#TcjCt_zp z`t8s^b3J@1`>uA8P~T7xWv)@v1p9IzG|&8zbM3<=+d{l4KD!n2rTDgUEsM zsq%id-e2WdVdj#G==)zgho$PN-h8-ti!Vgz-&*TrpH!Eh%>B79z;V88Fvyex&w$I zS+y40JhzLQ+3^8QO_lrLEekKo5@(I8^x%#d5qXEf?yAp4Rv0|-w8AEgW{!xo%ez=- zWNS$fNu!pPIuDG>$RkdZ5y4a=VxxD-qpHgoTu@2d({LQ`Lb~E5|jC1W@U8!0Fhd_ZC+DHOlF2OjBA5E;#Na}DJztMuwHuZf; z%va`hF}x6>OHri!!ZX`$+2WiePi0J#ji<=Fcffw6q?b=xtb{wG}p8#d7yvlMBZoW{)VQ#H9yhq_!27Hg?~D3x@J~ z_N;IhFvsP#j_V_jTan2oztJq-lMs4PIP15LOPR%{&T9p~)jaHHZ-)PtaBG?G}OsWPSwq5U|xEFJG5fr@@ym^F-m~$r? z_30=)wlWd89lv+zu~$G#zSUC*6w7{Ikq*z%RqkX_@HQ?Qgi1!Q8AHp_rM^+Q#?203 zB$get@G%s@Eq?`TveKL$F& zPG%Aw$%kEMc_upy;S^{M?C-yU+SYPeWQrs0THV*0&5g-Pi~*jSNvgq3H>4q#roov_ zW`wN2+Ccbb!X}#m!M(&L^dFv+P|8w9PMT+{*CEa^Svs2Xv3;tHCCaXl9}stDaewmk zL>n2(_KL9AlfkzDE}!hyu%(h3!c<)c%`4@CX>y(H4u;aSOSCP-$VZ9X#Lphi4=1>?#2> zS{mEpi8lQizC668!m#wt`{+V)nZ6J<0i8u^f)izxza-a@AM|QW?}tSm zwjUD1uo^-brim_23x2|z+l*#<`xk?%=%8sG&9tICR3*3-61i)!Ux$^IV)cqu zk@tZi+GffXT#NO()>}?;M~qmZ$7(B4Xo;a67yV~Lm4`eCO5M5%M|9X1!WpQ>U8av5_nA@6BD6~OCkV1soz^9hdBW1 zIrQ-*Re|%^M(+-ZuD4k?Kk=b}M&v$yFj(q*XAst)%BI;e+vvk=oNlsR!88?vg4Jq- zE*%5mNYFNIi#)Y`l<#L+Qn&UK9VB>Aw=G;%?KfIE%OV)LRiPoRC=|%|4*EuGn3G0= zMj+-usE|Q@NOc>=f)@zuGTrn6Lh=XqkI;*@-$e{IB6!QmncK%hz*U}cz07Zz>|G-d zZ0Fci=vZH|_5HKLuH6>c@`=04%YA$^Fn5qkuU~+qUfnR41IM0k`eA-gdxKd6zBMEIyw@HGh5sCa`&Uc* zN{-xm{)s1;qJV&i{NJ>+%4VO+Ei-$Q{~+Yj@X|n&K<^RRGJ-Hb!JrnfL=cM3S7!e% zOxTY7U5=z`+GSOCZ_iwWvxCaVa{D6Xg!6=GF}q+z@a4-(-r5%LYA7=3W389`r*`Y; z&!xkq4TazP`$!Im;}>7V0ZK_{SxAcP@x)FFU96>D^B%rd1i>Up}W z5LngIJ7#uVb{V#tVBF28*t;1Z{U=)T>x-uOOwLsC@!Z{zvN?~|#Nic7YhqQ#V(TB5 zvhooP+xKweL5)V1nh`j4j{qL(>ZS3wqvyd8z8c2_JerhfY5u-m!7`k5_Msg^wvNI| zDu77Eh=n@6fQg2qnXyYi0B3lADQ5+a_f|E%Q$s1;FRpq{9Ssa0A!ha$H^{Cfld6DT zIS|NrTkH+lU(yAAfVVZowivEp?BIoVBkG?JeWZF)tk+@|X8DAQV`d4Qii{a%J4zUh zL(*+4^a8QYw4JT(vJ`h!RPE89|BQWr zhf}E@`+jR_AyaEOmF4;j=a-6cq{^cqU7FmX z+9^6MgUy{Qm+Jhc%3~mXa%0G2b}Zbens8f6SX5s0n<_j~fpzi|J3KLD1mLxt>bA}M zRV8!F=lpxSm5pD&5nc_<3MJQQjcQL16|M>agWH2w?W`;I36%e4IRSDDTE6pFKbl%X zusS>16o=9Z>Y=+>iTTwoF8T+j;So)Fb2z6b`AcjUfeGcGtj!~{ zYXP2RJN$^4WEt;RO;-r42S>YH;V?dJ)nt02>@ag&9oCAcy;Gz~T@sfv_56q7$4+%E z%6A z#G!u++7o4vjs_?`I3leT$cLG@7)rE9>1U*tta=K`nOZ2qL6;zhFV8{jE6JB+0qiH% zW1|Yl7X_H57i@1I_#R`1kLWEL&F`pPtE)HBTe#=XA_+DSB+9J?ppd49FV9L4E?hx! zxFA*Iz80uAtI%9@(~^@Kkx?1&;Y7YeNpFLodX;D6?3%SiGt~^d4JTbWmw|PgyZRpm zDqqgoz76DmiFKWAH;D;9TSWYSMSq&@6Ly;%FfIg2`RavL-UJrP3$N|Md&&XndjQoJ zWm8=VgK@P(?8`^7+BITZzwv-AopG;5@{`u2yVh_X8%99;*usajCfj$y^KFA5ihw8& z+F%l2-%TH8t4ocE@wkCgFb&Fn8cld zqvGzIjBwZ{{MXwc688pPl;?FNu=;n{^?V>PhCfVFNJtO*K-wcxc^?`7Ykx$1;NplA z?z@nX00Hs+e;1SgY>sHb`s%1*|CP@^I&o@q*Xw+0bTiA&FgGzWiRo|;VUSyM)#A-+ zZHh_UDQ&ZBJt{j{sC|Wi4CXtIjdDQx5hgEV6v!wl<{RyBU;C==OAPhycbd1oTOu`9 zzwor?GRq(T_a*n%uai>W`%DRFeR@^;4j5YCEY!VSCAcfcFo-u-5tz^!aAyDh$;AGm z=)%ZOSa?#r>>HEyQPHsnuHqOhPFQ||x-6^m0L0F^%qLlZsN|BA6_I-f#YZzhX?3k4 zZyBnvbjHf|PM7FE4V@n{R{6%~=RW{#5K3wJNN)WdG?Tth%l1ygZa_L-&%2L%Cr5ks zm#+Cx$Mu2$lEY)^R0U!C-fr_5pXW}G(igE;0alP`Q!oV}(fq{x{>scQSa?#t{5cKn z(LY!D2F~7>0?@MU?GJ`4c~*4PK=jk% z6}j#jguBZ1yY>P31{xgKF`*#eAwcorbbUg;c6;N5^83mOi8qb4>6$`*^px|uYGx|> zYSW!>ac3&IW!2J$z|nmjHB1)Jpe-%u*&ZZhU1%VTIF(VP#L(RTAV)8DV78iw8A<4< zEi|=W#uW7SWV^{8AC0HVavn{!5$*cQhAC>5(ivSCq)9H`s0^2MVca{$vGBFqlOeUG<$K`COdtm5=&!AxMA$) z9do|1?7R1`doHI~q*hC5HJ0(eyUIzLuVEK_)3WuAhaD6z+%sA{L zO~>Pm7j~DKvWmkErV<%FVusggOK1ilPZT(vu9MH{|KcvWo>MC zAgdPZz<*bQ-4OK>H;;!wQa<%%Q`C9$kLJPX_1X7@+?wosM<}_38WU$HPnILD%sxdI z?P#7%FsY{09kmM2TRo&cfi(;4jQ&v1ro^HHZDFY`qSaH&qYe8zrXfe4lI#3ay-Y<3 z?mLy0K;gh}D>#I4jufPHWl0YrMnyrw$PCQSOo^*lH2z9yv?JRXc*L;WVxY>v1}lNT zDu#AJ(>y6?Z%L1X2tylA|2i{U=D8x$)H=za2#;NBDYU=9${z*}!8`abA%(e^#gb^5 zfWyA^>@k=QPx7Sr0w(^Z?P4pDeMVUWin0po1yfppw*IW1d`dI~1T8fxss(Qvi`ntS zk2v(Q-dSCYOx;{-EHccJfzfm&9%#GJx6}!Uts*C-5aV27OD8jy%o)i$xHu8t>4FZl zL2W-s5Ho2zElY+0Hsvb13zek_TN>%oMAm7ET;|Dq8wKEwppqd&5$f=FUWhl&v4SdI zX(Y|gw1yL4**um|Aem2k*sc<|zM#EHq(FIWf5^UcVz_{Wed~7d@JoOlQ0(jCiGM7{2SRI5yf z>TRkbO+3rM;Xlatv(HuX^=K#^W`)DY3c@+9yi{b6W~+)LHE03htFtWb-4%&YgM&Q! zi}L$YAx`0U`{ItA$_ma-&|+0SSBa+NKC%^kA$ng@TPSjL{mQJg_-R5nxS3*Y`Ks2e z6dn0(v*b^+c*#q3n$AwK7_r@}b_V^pr)~mTgr;AjmT(YH^Bu;$zG1=(&LiIu6EJYu zlod^j+Tt-189{lDJ{CY`*wPm41|(^5?-0#w7zE?)Y6EDy9;!2;V@cFsXW7+1@|sOm zqY_CxFQC%KRbA-wtC2T;IaiYUNHSKWmV|4~3gpc=HFvKQq#co+HAf+lt)Z{jj|N9gS;Co{ z+8`Grk)|n?b%yCE8ob>Is7fv^jJ={s+%&-~1|H|Kjz1J(C|sn!o=8OYl_Zk@ur&zr z8d||{RFubn1pZ-I@Q4(kdbeM=J@JFh8)1V$pARwk@%hV;(Mu!u9!PaJehB7lB<-sJ zLUK4<^!cCyo5l(^2hs2I)(NGo-rqDx9F*y2^@rnCfrw`2BHPJkW|uvL?PZxz7O+nu?{ydrnb1+%`3Jo7 zN)8kbgDw;#*agH_?AniRAJ~kWQ>tIR42oFf_D=4oH)ZTy9yoZc0J`o+fhDglr!OKZ zVO#K1y|70{D(5exuTDpbsJBVmv3P_~pt#nPBQup6;i{WIdMaL{!v(L$)c&qfMeM{ZE+ zPeiI3KoZq#g_RU+8$!v%(1-0`I3i4J$%9H+F3I~iQ!qSUe8qfe)B9e{WOJzP@+b67 z!cX}0;c+OHnIQzUk^VJMopn=EDpW)-E>61|)BTIwcM`Jt7c2lh;cPaXQ6+H7X3ZDn zWNXIoHJFvSeS#=R``b<{$J>XxjPOmrUDh(A4FS{{oL%_4I)B3B$DVhskX~H$ zT)^W_MHIBZ7pMLe)^90Q1Ih{r%D5pxPBpEnm8Nd_Q zARU-PASa9_;@MvbCAk5)h#C`;Vdmt!x?vRu7WozcokWR>{2xufMw7LJM&iSDd9qQ5 z$swH~d!FkN$J3eU%6E4A;d$TW{RI@dgME0e-E8n(b7VFzQ+s1El85WEjDj%};dU@& z*QO16q;0u4TnEU=9dKuYw2hHnlR;O^;ba&oWPCJ_aN!d?_k(O~vb?6J?iT z*)5D1+%KOO(rjO|I@*Xo*FvAWhO=J{9JnBj7N$|s$z)uU`C8BfMWj{{Efy-x3B#p9 z4`kIYTnr<+P#~Lf8?S0hs0XKxnQy6xw$%z|6;H$5(2jW3#VgON_HO!nkq>H6yKC`; z(H}rMemtCH>;A zIxGi566!C^p-YMNBLn?s(=7a@$@pS8NE%j#s2=5=rK_gr*otG5(9JMvsBV)#j&Ems zIY3q#{sq%eTQ-9o!W_Pyi>Cd~0Xf4zNQ<4;ciI^j7TAuWp9ZucDjgJE7qJwGe+0Nx z1!xzj4Ms=}sL17eM{#wjlx9(zA2icxsf1=BW5SJnc5lRdZ6WW-j9Fv+D^mG;aw~HU z$2+J0@$!Jo0hR2f7>3$o4O3-*(rR5lha3JhH;`Q)_EzCV+w1mz({qo-=bApF6nIv2m&2HA z8w}nNqh?gok!RLxA1`MoN^lFnXF1Zo6#lXvcXh*bb2tJy)x|WIboT`E)N?1W+egUL z;L!gjjuuP!5-t3lf65ln^?Pw26~k06|q6MCQ9Ouq+fsZD*;XF>WJ4B!eeawqO2;`B;kh z#zndRSjgyi8E?%)i#CSE8wx5gR=jXE+tbv8>6*qG0qgdZmb(_S{}u!8r2fjflAM_WqqEFJ*9d$eo#PD6?~#Sbdv^T;4o>zw zb{X|i#i>~|k*#L?iyOc2sfq2@&T^VEduo>thWzR@%a7%Gh!8dfDABwnxnAX3TPGjA z9hPyFIjt;f+lp3(UBBWZffalZ0Wiaarm~4^FA+C9`RA}EFupU15u^pWB{gayV@bBy z9O4w+$*9*M>qbkLi17^+5k(absVSC6^7Jfk^Yg>puA)ueqXwHqoB4TKI8Yn4r4?FV z5f4|MYtj{U+U?`#8Y}I(i;FZVoqF$zIkXmYRrRWH;zbc9DFjYwxXh#ZH`Ai7>7C{Q z+HF_XsuS&JfuWG5AXMven`;bd9?qyRl+3fwi9)&XxbA9e-l>bafQ=rB2PZOkKR05o zkGLt?NtoK}`=>v8i9hG_tW}|ld#bW;)-4B0n{2h}Y}DeA461o@T&EbY(zF;9f6;<} z=#8tUcB(MZH}&VA$5m$^-7$4|$yb^cy_^Zen=T1T@3vHD$zEzb)xW?fqel(lE z`iXm$EJhtY{i^I#%a*@WpuH1$IcMED@*+FSY{+;H0V%AUG|jO1sw98SaBrz50$=9qSaTvNxz;wIdFUZuZNh(8jl;aTA=x)RD` z@|Ku4V~>)}q7DQK$m5kPJYpY&Ph{Xd!~mu#GyrF!Lep&L%+Tp^!DnvYUYF9=a}&rO zC9NOtkvV-qzM?-&RS*{J<9%1i8cddG(wnbe0U1rlCJ?j2Qjn6U&@ZT@O&VNIAH+Mq zVCx)P=4nq}GE%XK9@!pbFIwJxB*Z{e)3$zK%=(U*@pnOa=}*bu%|?sDdG688915sL zp-$P4_C|(S10V5Z+M|N6^o+=8(idLz1sq03YdwZXLu!IpQm#3-+y_3=jL6oHJzA%< zZ@q9Pk9+4#lvdtREp^K_&GUr@*&Z zY_AN3A3&G}#E*m7h_}eXuCL&T>~e?te1wb3=*3A3b3-Wa$Z!9`y8N?rDg>1QPk$%l z>EZsH^WFdD#lU|oo&VX;Nw;#v)j$ut)tp+tAWJjjtu)q=T56_(iOec3U6#j@h%@2- z)kG!Vu%(JWWnyu)5R)ighp*fw1lmkzW)*}%#cM>J0FJjbFT4TG`+33{z=ekp0g9K_ z-{X)sO6rBiDKT*RI=htp((7~E^|JGFa?z5m4;-j>r-OU~(f}_XeU}F032+4h<5~)= zl{i1;iyV{WlRu~>+Z8{!Cd(soN*m^t>`or;lH`**phmf+*!7X@P9OdNxnt`#2t}Ol zLWCfKBP?2FUG`3E_U8g342n=C<W;YEnVuHG<5X`2$ulJL%O!){6||;iZ#xC+kNl zt>NeEc8fJ7aCT~Mb*YO(@p=jcG@b>0FI&2Lv;?xp;u$RwPP65B{nkz#n*PyZu^m;H zNvD>ABJzmi?i>|a^1a&2aO&);LeiR8xxCmZcMIQ!3M*3{lFyB9lI*i##g^lWg=(E* zHH{4eMFrZ?cA&g7^O!a3rHt8_>L`vh?6HX&AJITHE0tM!`0*v*mZ4+$^ta7@rdB2m zrc_;Dq`eucv6He1oxPYE^h6~CRX3N@xEN}or3#}g@j6*2pT+{it#J!Bk^FH$)CtR5 zl1m1LHE}Vnw|J%+Y+2P|XwO2T_L>ydz)q9^CK?+JGX6lHcA`ZQJFvCdE%i|o)=^H4 z6$Hmk{3^_&1-G?BbDz3;|KvwAUmP$$lHBU>mg(*Idkr7Gg_?_eV6WxhnL=YTbbzU= zmo*|4H>u!QtHjK}Z*(Y9p`&+eFvX&Yzs2M-wAk|!YRPuebesBco=Gs_nT+O60c;nk zEhHsfSBD6H-f_7r7`G+_qHtEruImf&oKKggsbKsy)DI(I(->$Rv-m8~#5hsfd*+JP|1+rjn{0ND*hgJ#ee`#K<3)%>aCp3rp(a}{q}cPuUXiFZk@ zDxtTMcY5A0G`+J!?rv zbbpG0xqVEOPZR{nJ6e>!@I9!8Rv6*HCtA~Cx8?LC-UJorol+awmSRE&&H-5pAL$8s z@-zl+ogE1ic(=Y!0ES4yPZ-ouwpE>g=DxmscRfW)(z6oD1Q@gFDnhRI$X&9dUmETE z8(pj9Yjo%-)n}sfJXC3_$p&h%+9Q8(0F>3a@rKH5fDo|Js(c!%3(zWbCqGXzLJap;Ga>rw4IKxp~e($aOXG# zm~yL>2NB|w=rwNY?0F2@q^q5=hR;P?+<6&o>G_TJ8(R|;Db~Iu@BPw;)u7kPG)1^p z-R1}7Ag!J3bT!;zF?F1yWA}ApYYL26X`x$pJ|?*Sv%~k;Wt+i!%0`kM7RS3}orn686pw&%yA4T+*n~0v* zR@^OkHfS3JX~t{!x>7`6Ss4I~XSh`2OLy(~9MKDR3YaZ9u#Qx}US#0vwS<mpbdde@{76T$I<;~977$8I#b_zQECY0oKIH`{)Z zw*Bolxk9HM_%3GYi6DB*edqo2(8*C5L4G33|5GAB{T3ZS#NjZIPW?$p)lVdVptgiu zQFb^Ff61jQH%7nWiq~U=FHv=#P<4*gX@u{o?u<{FD2j}j7}uHEP3d&xCZ7%eH%bcEXqY8l&fLbK@FW6q%HM!VKymYpZ0r*mc~K1>~kQy^m9CF zGGr=6(6uQAalolJfKV(0G2gDS72J{s*~TDnK2mcGgf0JPi#KM$v8Zh&My-(u<$RWk z5N18nZr7maAxX8n7S>i3hina7Qzv|JjyXr$ep0y>yp71;B~7&P6x8h$GG{B*B@A6i zZCE;L3(Ue5qd>Jnf&m!zOU)<>9V=9GbIb!AL#(CYLGetZcHD|~?QwPx#>QY1C&D2u z#Puc)6Gqa-nm~5D+O1|vNA1D9R>V{#2UyzrHiD83X1cbm6@N;~KMUDt1ENQHLd2S8bT+zRz zLpy~CDbQ#M{ry|#aRi5Fwr6(idqMX1-KJmM+NUoWM084f7`a^8M8b1Bn(xR}F$pn^ zE1G_Qj?eb;%<+J^t3n*{EgxzOD(i=FHxoQe^1MO) zWg5HvkeDLqF*2%+ZToUCzd%io=XIjv@+6D^zaxZSp+8Sr+s9Jo))C*Vh|V?q$YjP8HsANiHJVna3Al@kNGQ+Je!UrZm1zI1p1dT0Yx2)%Y1pvHSsW~S zMjtoH(m3-n4j@~qC5Ydb6`XXs%;w>G_iYSwe^&ZHaFU^e+<2Zsesfq~9!_ktr>WN~ z{7*dXL%tcMYb5rsOci_Cy&6mAzsHlGFEFw*<^+K06UnXsjF5qX0FN+z7oluB%O-I6 zXG2w2{p?m=fglWkTPkl^F`Za#Nc#b82?1Qj2}Pc9gg}4pZaOi~6*8ugi#M_{^CH{1#4R{XEa-r$Jqg`@hGj05wzsg0PGKJ3|8QBJ;BX5(vl!``>$1WdDDwfM6Z) z{*fZIc=SA*H=zDRg&c#22It@~m64SF{&DM#xyq$~s0X*+@6O`0CdT-cj`kh#xqiC?tGKGgZj)DDL4REu{D)4!lqV$@}LdKlwfd zPbIDyMFAsF-DpAS*v+NkDjzDOZ^GV0nR9VFlLa1{OXUZXJCNlmug#@+C@Zhcx<}f4 z78qkv*hfj~M{5qZJKQufWu*@>+Kca4Y}biu8&?+d$hZPj^3hIes|S(T$&@w9k(Yit zW7wfdmQhUzQ#6E)laTFsn21#C&R-1_k(2Ee-^xF>@M&H%&;d0dP~ze$T?LvVBS+i4 zE)s>l>-M1nu|-uCQ3a%(n{$>BM_Ve9IEi6nrBjI6$#5(-X=CsfxRAQ_gmN>8fal<; zB7Z1&8k{T+8t2S`G-et0V-~`6cPtF8flEsr5Tth#qZ;a&^nvl<#yE(i$ z=&~ojL&EN-4QX_+WXYRCDnUkCn9`&%#aSnW8B!VHES%qj8CVlL@jVpiM3~{GtP>A~ zS36JesWM$jHmzrd+*w0>jDZEL=W{nPEk$-tO30>CQavY>$v;HNo%%G*q~(BfZPM^i zu6su)j2rBYiiYUV$+{v(;9kHq{RB%pbNEW5mS+JYVkXG8Wd%Xq9BEKdhR}ni!9Gc_ zSI~L4-E(?aNc>1sUJP_M%KqoTmJDSTpj}Etlii0Z@|?Q zv|Bo~yl;CoO?`8>JXnX}=I1DS&zHU4*DRu6r*&J+{V*M8Kk3h(920oRQ*6?U|gX2COGg&GP3s3 z{`wHvv&hyEn4UQhvI;zmCd3rgDxQ_K!yeX)K0|Imbpvz#dQaqR)(RV75NyD_Nc-#hR$Sake&;38*q@t!5PD3B27hFOV_~rfN z+68EwF}>_GTE-VqMUVJ7XDLGsz=dQTF}DYR`Gpv!YLXPbL3B zPynR%Mi#SgY3arDK_m+SUp3(ITU zemGetLaZzkz~tPnq9{`g_R?eD=uz#W?O5jKp#^EI&neiAZW zK=^mC8Dfa{1XXYM*U!OsBNLh=JV3zM0~lxFrw@5PibS)_VjT6NKRc+hGhheKr;nmXrhu0!H=GVq(EUWg?m<5T;d!4qe_;&L(` z(Kw(8$D0+y=XBdCk)kWN*@$!cnJeU&(|VrECbu}$v)Fa6*S7a^a?PSWBWe6Z+ef(f zJsP$9mv{H6XJy4hzZVK`R_bVCB#~$&_Lq>Z&_Iaz`~fj5 zsfZvB5dvjL=a*Xi6(l)~IV`YVQh4PjL76pJ(E7+TZBSg@m8{LOHd`>VgfCE-qrBN{ z+Bw6Sr}DIZwaGNzf1-d`xz3xjyuAB)=ERPw7FT{J=f{Pwp&TMjAvJeUO3#@zOk|H( z&N^gQxkMSRVpsmVGC6A1orb%lZ0l%yo=6SE8n01Lr)_UHKj!o|HhT&AViyx&a$Zq< zh9uaH)p2A=TmHugmuzeq28$-=J)y{!RB5e13K#{4{X*29FSfjJarZW^wt z^0>&holfLhRIcxYZYyiZ z5V#yhSTm$>>PRy5+oAI&Hr%^S;xIGm~znPy7XYPL_m#KPh2Kcbx7(*-h%HB(I(;alpf+DeUPwzDL5JjN9USF!o=&FJB}j4`m78V)Jp^AYqhM9zfkZzS7)G`7R4K z1MN5;cRH;+YhHz=vfSQ<(jbbn-zdZB>y95hzWEYwESJ9Z)vWv1vP{uxXy(og-_PTy zDOa+oyQ_N2-Y=;$xqElghPOYF>Zqf%t71-Zll%XYz&`W=D?5UFR^wS%OGkjQ(8X3c znAqkDK~Q)BamtWn#d@6PGw@kna5c~2ReS?1n^p>jtTa7f<2{6a3Cgx(uys-V&UluF zZ1aTLXzGv^h>LC(Ym&FJtq60*nc;!ATBUnP(5~e}CMKXTsczm_Lb49$&5{{XRr`+h zQJQg{Awjh&6UrzjVP~tI{~Z0@OOjo&WL|>m!z`jFB)~kL`Ywu%Qab&hXzzw+-`NUMus%avoS>Gn4I9erT2FZ}uqE2lmI#c$L z$yM57pSi}9oMKp$jozL~GGy44%Dm7|6mSC8$vpxch=~-f#u>N~23A~PWUL(-g3=Xo zodh6IBx}vSP9z%JB+m#=C-VgFWf-U?V@UFZ?ws)d`+b?UHSwRqYaP zp?-}6yA6BcUe}MjHo*t$lrE_L=fDa5sAp_Rwo4K&en9^pUq;8sJdp$_2ZqQ9i0`RB zi@@TCmQeVB=Oi8DhP}`-vR}zD41Ywr{rZEjO1^)M%NW>&(SR#;1q7>NyO*MgcsYV| znGE2fLRe*N40(+e%b@#_vnxu@75&2m)K)Q=*xNhLU0VhGc}aq;)DjA?w?r z*ez=#03ElyPLN)`q^yY*iU~?rx;1uMswM(Aox%YcZ>$F)ELI5ai6(3lma^{9jgnh) zv8O~^=kCGy%82njGQ0m`z%@ibwAW?A%JWZN=wS8Pq%afR6i;3J;^>0Fax}a4+S^xX z^cV8YpLmw_g8Uq_ob5OE-fHEEh$$hj6T)gaq!l*Qe)qIX0{dU%eeC+tG4{mtdNDt8 z^CESdat4jhmyD6q2ogb8JcWsic<*~&k&D9gwOkF%8aX5G2s>7Jw)W!&=A+)SMQF{9 z+!Z7_jVwk^VT2*PkK<;E#F=ttZ0w3BY`g7*ri|Ug#n;k$gs+FJ<7&oCmQ2@Q6YUAh z9ylykKoG4cTN5M}v8OmZg&9Zh+2Ukj6^^D&cwIK`xC3`r?ubR2#(oc8QLu)6J~o@+ z+P7Ju3P{S^lE87=l@N}7)fM~&>I~#X;A#i{C|)b$ZtHFLZ+K%t&1d>CQBmCfnzYH3 zZ&Yl|sx@b^ex-u|aU?$HtIci9OrHD=EQTA;p1f?cYbe;bQezibkx@8a5fAy?&(S)<1kmh?dZ;X&}?1^G0#LR3{^n-anH+i;H; zPpI;Om)~Dv*K}2&hB&2g@Zf}|F;whpZ`TK2Gf`K)SxY76io{{3w980ulat%Kki+S9 z5Sl4L`&B;J=YV{SN;%2~Ee)3=SBxMfb{>0wBz5xCft}KILlPh@&wOHkcVg2gW8|Hp zN&+y^#3v%oy3lo&ILq6B>Zl#ld2=})J<{F

    8paXfOLJbOT09{zBgUCGmYg`pO?4 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%0Dj*W-Cc9hUO7UTEew5qDelpi5NIu z(Qj17mdx!NgOxHWhyx!`m!_vB+u3oR`M^_RehtBG;w)Sl^2^RSKV=b^`a}>Gg}S49N#!>*Xs0o2ONhP5lv-MLrjcAAaT$Bk zv@Jl3!%g*;ajw^sqNiuGQo4hNn~0Lq2wGBKn&Ky)c>>ZOzV$eHMDU2@q8lZzh6q`e zGnDFmy58{~E-BL|kCme57`&PkEtR=+HaY3<$Y0>TR5(Sa{qK6hvf?0z7LVbs>f{3rskhsN2 zFi-8 z2+;xt!CqqWn>o%pzh~TOJ)mOW3zE@LWdM~8LvFVsxXoxS1Q)W&F+G@@z~s;!vKMsQ zw6twT__}%ADn92>ZNp9jqnq&BkhyM0ysjr~v=4o|YDaIPH+y*fhUi7kA6SlTKvRO{+v99M3KD+h|@B%ihbx1>CIvvRKv zIbS8-;KQcHw2kZB&FmhD&v%vL{k?Ct*peFkJKTC$;s4-jh zeu-<==17G1tdzab1?0M&4GKmp=SS?Wgs=orH0Ld)R${K^_c$B_V^_f0y5N48QeH-+ zO*(v53-%uAmmh@A=D7X@@ZJsQUX}{X!MElP$zPW#{6uWkn;4;Gfx`{X? zIL$@G+l|h&EV&xD;}bL3wz3Nq(dGooYu+E2>yZ?dC|>NNdfD5dy?TDk$8PwG-dKBk z?K!dMYS6@_=3PmpKi#rB1L&Y~elvUzF2@Grj!&7U@pKruk8Y-eTg*y&VIqXP&~vc1 zj9^jupqLToklgX64rdL#p;RhJb1(t{OpmdUj0)!>5su0uy+0_LLtksS#HIF$sxo7enNy??5^Uck-;ikGVM**1#$y2~N(&>%oM>Tg z&(*mu=!{QA8IkUMQb{T%2!mse`sAi2-U-spA4fjGN?=VBetZ6p=Wob2`9p;y)(}V8 zZ_Q?SfL6I+A3Qz|7rbDAGcI!5+(kYy!#AkHT11DiF7gM;Te*3Xtz>bDd~A$i+jNWr z0;#jBf~}1sMEM{OJm2ADq8}$dcQ23qJ#%*AFCTlil6Lpo3ZJR>M}+r+i9sGJw+vK< zX3R`3ZvC%2n}3B$akyHUZur%@(>LtkbyW}u3~-(V09PJh4D?W29ZWaxYJ58oH2|os z9;O>`HNKN(>LBBt9?drD^c~HMpz)}-&7q(D;X?u+1skKW7@h<){!l88>fup|kJ@{` z@p{p38Y1$$b~Q_#lmQ*-jbVo4`C(ZsD9z6Bm;6{+N#!&*B%Yyb#FO~b4*s#$eGE0v zh^V~8Y5N!}-R5{26F;8);y45)E`4XHwFsmX?o(Y(uKUb+{2sZ!P#%Q={fQs#h?@vM z;<;w(vqk$3q%`eL%)7Z~ZH{M%J1IMHeHHE(T~3e<&^Kem%GLE)!#@gb^wnQ1TZ&aN zYI8*c77{<0@p(p1Mt9L!Bm!h~{D~-<&ES?E!j}{VUOr|zX;x;4b#}9Yc>sX29dE#f zYC|I2G{%NdmJ898TAW1qmA>%;HmXTcnB6x^C4%ZS>H}c|Cco6@w#^9J z7YWZ$MT_4wF0ZXK(fGrNxmqG>Y;-6Gk0zK1UDKEB^6#j)%#0MTYH4=1&7Ru2Arafxcq%`|B~HoVh@qG!dNA(lB+|;W*bMI|^^;HUIh}q=FOAa$SDsmv zi&*|n6%8NbNQtL^H7c?j)ody_?a(`{Ss-_LjZTh=)aF^fr66~$y2PEien~Fmb{#LV z-d12_jbzL~1X4PQJGMSqQGc3vi%5&~4<<@C6@^3jM6g&@3z3~lt%G)40PBG9Pm2h{ zt9g?orKYXNnc|%R#bA~G#=M2?rUq;B^QL}oqs-5W@YY}JX3I{@ztEeF9(e>02ME(wNf*RY@bwMyCt#O#7^ZvJ&#z$lfPJs-}_|j-*FVBQ5l8 z@S1BwB1tppXbt51v!k#Nj+@y7j8-*U(9TNz%*v8t^1q01nCAZDD-SlucoABTAQ@K& zc&g(=r1E3pJS5tX(WZquSg`z9*7A8eWR+jPg!h!QpZ}Hf?BASFZ|50|4cn$3CZz`5 zK5$j%4uSl~;0_#iR_b&^yEceEe z(LaZ9FO(x|e;EH3<2`EyJDyUq`Lkf<$w8dS;9|6__%jaH4bPs&d{YG_(;y-7nZQ>W z?XOH%n!-;7^07KtH#m3f!|3*L5$&vUzH6yf6WOn)1Hr(#;KFRI*LY0e`xyL<8T6Qc z83A<}K|^WxiIi1CDM52-_kk3*r7X9ptk>#nS8VH+U1MoCSRXA-*MWW|`OiYwRHWj; z;q21Y;ELvN{)(h)rx<(a#-(hbOg5482g{cT)-AUCsYxR(+v!x(nkQ>49X=&ivJtBj z>+NQEI?=Jb#?1E8TkTd)RiVwwf*f_;=NO@ro*AJWyKy^u2UrVy@kk zne<88?D&K!5QH>P?plHBUWTbsyJKPnT%eCD;9XcC`oMZ_kVm+kS!2U^vKuE*U(h-( zkVkmK5*!>ih^*+>BC>`7qLnU?8w$xCVIRY7u>N#H?9y3(Wd()?>iR&Epe%?bd68GL zolO~LXIt9MXY*e(9~X|f*{c~xwVf%i`!p3p^9`WWS`t;`@oJJ}n+y)i&iyjX2g`>E z;22psuXS1YS?6#^q>TvOm>R|#e_mIr-l(fheVy$@N|p#J>yK4s(@**qV$`x^j@eu> zePmiz`q&ip0RlWLs@s7MGWzvzwGEWS&+=~bGk!^8({wFauLVf{e8}paplK$JJ5g+s zH}l&RRjH6VG@>uynTxh9*=u`GD1g>SFIB_?dZkZ}HRm1w;P|;A z@FCg*6!;Mz3jfe>y|Z1wbcl7(s*#NGleAGk0{MzIi2p=2l3+05BLTt8Wlg9JISAn( zeT(M!&R0ps7(xHe2YCm+t$^52)2~ZCFPL*da1I)EdS^*-sA?>LF+g>(0^tfZ_4qjspIh zc9pu#cXUk@f5k=;l(g>{4pOM%2*Ogs-)XT?|r z{VQJh&gPLXA3rMAGR^S8$Vo-=sG6EArn;|lxLKP%-(HUmKW#@Yj7@(vX_?)!N3&ynCH%BubgXl_UXxq?E`GCH(F47k{Ra^YL5V`KTe$+- zTv^7_bWQk7=)3B8jXW5+Bf72}7XK}3{7U-i6}5?lH2sAdwJrL(A4weQ)fMz|8yyc? zntIbqjpo0{aAa09F)TCZZ|ABHh(F)s*G!BTBoiDiVg&p3Bk5NQN9#im8*BaJubZ3X+Pg~QDHeSyDGCz zxG>SD9>jgD2y(0@0zWkxEW1e(>mSr88mRy)?Vyh#W6^24_cv8d44-6zDy$A5Vh^dK z*D$MIPf_h@oPvd4&5De;3;S!(m!oU%A4k`#?}CAfj2&~!1uhg-cu^9;BsDCbTuhD_ zk@r|uHb--mc_*&88@PxE4`gt*BESsEe%i-r#8>NlamULK|SIM!!}l-Bom;`kfky3XQS#Et45{J z`aDgq;;c%Q`k5q`m99y*phnX@7i`|Fv_dU2n*Ks{hj+osCu|DeR)%Uxk^Ip(cP**T zN3k;m{a9~ZRd0=L}4E8RkmK5uAW;@_$EpF0BGQHy zIC(CBejlBsq2I^sz#Q9@#qxYS%R*=DXt&^P1d!6SOIr}6WQf$oBg4n1dD}N2Igc~j z;}r8wbgfyug?*T!3O8y8M?FsXB`*(h67j`gXRpw~Bj;W~mwZ*x0aprUwuzOS=LK(% zLSzI#)L=#iCO;wOhq|svIL;7APyXs^tZX~j(;7-08kWgdQ%ly8;;X5}{Y_-|8l^rnQv*o<_^ad1h@2jvfbwIWlOK_IU4r;JrRhocVW+7 zLy3cLq^@<-JND2xn?!o&%k@`lC=oKxcS3Y2(8DQ?(+`sWeIy@Pn z^-AxtMADM#V(w;vY}M(qRGLC26lIl}cBwWRQA72{i%WVVJ-~evgGAwdEq;YM(KOR^ zZQxv+?|UR7n5(m{S|t%Osi^;K<|C10Q;&C*&x{(jUH6m&QEU?^gHhV7w;mH>;IA@; zKAgqqt-M@DcRtI=Q9tDjIAvC>tmv*an2wWFIaY`-Cq?gAz}1eHt1yWoip(?_t(YyQ zK)@-v5>Aal7V-qMIlIrawe*qqU%MZ!i^O9>YxH} zjp_@x%1@+0$3*d+YTssm(1BT!`mmDd{IDpbE-1e+lJ*Q2o@tOFxez$(N@qG?%VTNS-Dy3sP;2!sx0<#*^P#h zCrU7B^zh?N9Oqq zoFx=0j#5B+3VV46hIDBABWK=91S?7&E-==)qIHYlLcW2qZRH>#^x@t8%VNj77rD3a31c-?&r0e6{%b6=grHF9klFp8#3-9xP$Gp za3+2>eu$8%(6l2P1!7i;B~QDd6bVtLGI=87;!jwuuiD=O*-K&0Yf)jUVk-BufqRv4dj*ak<{36ALW0MxI$u*>XAJ$ED3Nwa}+>=Xk%H&CEg@A>rU zJL^nj1Lub25X(jy!TdMP5LR4dK@uWVi6l;GVt5E=OcjF#NFh8*1c4@K1Qe)b%u>b? zL#&RX!PoswXnfGyn7ck`zQq3D`tydbKwYN+jeBwwr$(CjSSm1GLYHvRd-eW)uVfi?m8EHtg)~5 z%|3gsxt{sF19_64;D4z49{^CmYV`5gZ3=mFj(%E_?kBgxC3eUjvM|Gk5z0~rGOt^< zmQf!TG+j4s6kC>107b*L+yTHf{PXkk!U?Q}2^b#Dc5xsZI~qQ&jxg`GlOV>8_peok z)69~c}1hBw1sx?eF zT0f>Jtv?pep@pf?I|Tt6=JtqU1-s*x3C&g{M8cT?6>b z?C2?YS+qIReiQ^+-tYQ992So|ud5xI#=C_9`f7&lsqed}2b`iE2GoRj1MW&S%hz1c zx|{w90E1nzz^u?Vi)mW{PX~108fm<9xKe+_-2Aw$AS(L66m5L}_J%xc&28TdeCK~< z0`JnO@F5hQ0z4)olyCOnIKIUp2nYP{O)hc%+d$Iw-`-gQwmm4m*wn>+`jW$O+sp8j z#fIYK*n!Poj2cp5DpF&2wwIVxB}J9Vu?d^M0>qhC9RZTbsx8IFs(M2-H1PU#i%yFP zK`m|wzXlDT6b;_3@~d|rsYr96>;d`H#Py$P!3QQ95}waI$M@VNJgxZ;{XEAHIZAx( z`45?%lPK;|zvlxdtxqY{Z;~Gl(~H#tI>Q<0`LqYC%<}CxaI*v6_Z^ntSm45Nc$n+q z2+)}8eK>g3oz)w$xF+G|OB&G|J@_y+{G6xz5uz+`)&imVrg1F>Y;ep@+V&O^o4mFI zFBzsUykQ|sG25Wm-2*oGitc5@(($_<|lmhN=lI2K@%6DSg&U{JCJ zELUz{>+=MS6e9fttv*}wwKzz1PBYnxDEarRacV>0$uT+Ah(~f(M^=}vJ80mTI@4|z z!!&iBuyaFC8ZOs`L)^7Vd3%i2>7fs&Us^yigl8g?IQB0XfC@JM9mF35%>Mn zBy@YJhhQ!QfiKp~u_|%cJ40RdWA2?X?rs2Inzl3w&kn8&7Cn6Xzv zI9s(|0-@45!H%o^nXM&P8E>j&TD$h>^LX&78^)SZfO-BPRgWH(W|brRU@E1#$RMU_ zu81ePWj5yd^&hBBE>KGa2zyP4Fbe$!75k+1{jWoCK>+=~dquu*wQq+DBkY#_(7@Q` zYuYN_GA1j!I9$(FHRxINL%#hiSnXAB2e0;FQ__SZ?&ce%%?B2R;WJGRZRVXG?@_Vm zg}k~=W%j2_)RtZ&&8L5i`u%YIrEv1QK!?vGJ^j;kfU$7ugFrvQpx#P*9--(lP|JDt zZJ>n=w6euLR#M_!5ew@)I)Q2hd1A`aS$lBC7EY>iwIzA5h1DY&OkHeZP%Q6{WsU5D=u2D3g7h5=D?OwSL-~rt~m~8C)0b2try}(|HNUw^r)vG*SSm5rN z8zMV4HKMtOn-xL}d8gO>jO}rc+yP-dbj<89$GXN~?#es}%vQ7&n1`Rm$bTz%sa*iw z_71US?MYmDf6dvBcxK~?ll7CoJBPQ-5mondk}&-5CZkmnhaZf&?ck~MkAJ1<{+XV? zxsVm5`ljj1QU0GyB>!2f{+F4A|6(GkN%M4H68q-qjJf4-1)-2)Lsmm_7EKQhp)U%)8Os8I-;9rY#Z=`o|egS@!O)O1UpK<8nx1Q-* zHD>-8Gjp?)zQ4a8>47*v_#p)XRHz*!AoFpUNNSr0=@dXI&_O(m6N1Hvq=n+=C66R@ zNDbqidf{d2&zvHLSpln(s1n_B2N35yf(NCy`lsTTZJ!RCi1zRMv=G;aD2GXh%1skz zXKPna)8G)oD4hw=maFJYS{4(F=%&b8O3FHjq|?i|vZEn|Wp5b+MdD^2nK(KWJY4J~-R4UHF1F?IoJ0Qo0tO80xs#iEqdeG zJ=s`7UQ^#_K*oDWHJjp_zx>G0?oU-ln&GrV1f`SNzWKAVRI2HrAju>_oC_HoN*RFw z^*@VVVWm+rfHr#TF3NGZ9vP0&u-L@KRJ0P7fh4O7E~15wY`bx6y$vyBu%rc~^(`1S z)ZS6%Ly@3O_jOCK)C#MDW>Qq{s4<7MY8uwyP&^w&T=eUAt2m?jn#O@WK5p5QMXS&u zcu|93Eg7L1s0^p50s5-Zq6KqS{8Jo;xlptj&aHZhh6?_2NSe%Qcj_Vd-dl-wz1ysP&uu2u3%`J1-l)ptua93p z2=arUhc*G-pv1l&>VdC&`C#6AKLKGRX93%Qt1v{8HzdBqJ>xf#KzT_Yu>NtyhPc^2B^k$RcSqwZT23^yclPcxT$e3!b@1kbI>+`pNB&_9(uBy*ml@(b*ozd+ z?ltTdzQOz}N`uEldt{Q6A|i6hzR7{}X&mm-t;&J-l0?yQEx{?6&)^^i&j~ZRRyC6f zLRt+qS2&M5r`@V?Jh=1}gCmtc;}BAB5Q~_FjT$0N7EajXYXRQa@oI3+8$$kI7e$5i zjlSP4`!=A5B5$yY!lM9sEavCe*Q@__2-!8ChwoSl*;*KrfV(CtTm8}o7Y&J&ofcY!Z?ygCFx~@CMa^Vkxx?ipsW_@0+ zpk_0#u{!p{P91gxVKwyXA0Cyg9rS$q5x_bZU$rL+%(M)lH?b-_RvkyBb4D6?_B6b1 z1M4Mt zlS(r}wak+D{RI2HMZ6HhxfTDXGvr(=7J;jCg5Y zNR;c@rqx;7<)Xf0fxI18NX}DY(kWqC(tCVw4>pgA8fz~RW=z~b72PN|{vf9GEfWde zVNYw{*{RxE2b`{-e_Sl7nixl{z25ZWszB?QC)9@h=w1HF9ZmDUvTFZ)irTh!0|ViJ zfC@Y1c_`rwS9`R}eJs;RNvBXdXO3_}kfY043i%gOv89Co`B=}pK6 zb6&PNYH5mSX5vc3l%g!Qq%0{pwkpVmCTR{q$5oit^uq93>YDE=!RV2`UF>D&PE~)X zh5uFOcQ$i%m37;b;mK^THrMwu%nVeYyCUtd2x@y*4i@K`kA(jW6y$>ZOK#ziBVtUF zNAN%rAfMooIm}GLCwHI;$op|W!Ffmd#cAZTjk8;(ML+(HG(ul-v##O=2T(VEXkW2;C`$4DJhu{`xx)nG8w8|pC_Ua0_aYru6ue@G3lEu4mb!16NI z+K#OJZ0l_4H6a9P&wzlsa=l+Z`#jV9>h9)b|2DeKh1K=W`iKES>kC+03xsy(2WGO{ zi;F$MnKitdqirptUt^3r4wOw7(8qI&+w%)p7S}zp?ppP^mJ@7{l)d*U-?9I}YD;>b zCrbr3pMB-_NdE!=M+FPj-KujVC-O$|@aJSMRBN*9=%AEI8esKIlZ7kMn-zC!bXLP> zjexV=p5uT&KJrT4|%ax(c zH!Fh^D%n*EHjBl^J_f8M=M$l>ppr1kv|A_y!{w{@l9SD8Vn*+GKy-@9+~vyb*@5wA z-K`19C-PMA$UXu%Ji!t!b|mQPL~rBVtiGBLNfu0@Wl zspCAij^K}0xRb^0(TRkd`M|cwL%u_E##4S@CkXsNf;m2v^l5#0)a)J<;fX%ARf!NW z(%>}zMNT7+9@sdsnG5+{++@cy1uOEiC#wv8bR{GA?%x4M^F3eg)siM+Zt9r|gIkU$ zg3#@~cLch<7~A`~zXgO93mQJjh(vj&PGsTz`CeYIaCFZQfB5BOu8^rIbcd@}cY4JxL|H zn>i?BqnSu1&8Sv;W2=%h%8~NmVdiG`!`p+5sLF5@MX+K@5&@q$mpR?D1|4_>qw@j^ zi*lx|(4fvC+a(m`WJVPp>2zYbNOdii$t2ch0<{I}16k#=TQ|eO1j97L-o2KocH_7{S0QaPJ$eWaXiU?x|f{HErAtX5IY5}v5X~Fj~ z$-f-u1ms^R#eRWL1V2`UnXW>rOv4ky6WZZw69^@V!0nSVk~&Pt7~7^J)5VRPO~{%$ zJY*-W)hBK6sY^Mz=$Zg(k*sQD!sIRzHoeo6_jpwXuqJ2U&g2pEttylD zbn5uLFv_y@fe)$;WmPJnL>!@)&S>h?6-%p-Sy>ZyM$W)2$vi$!@>Lg^djU@|JF^0ZNN!#umOz1UhU5`Kd~%pE#25>UOC!PxHr&sHK%#S$G`KW&gZ6sLxF8%x z?k-_j+nOhHL86k6A}yk;-3s!%hX6Z_Q53r&LtJ09H*MdD_5^tP3OEs_F+ znZO(vGm=$_NrvWmsUZ1G9Mxb_Y0}&f5)~#H&5Jv@kSI(v?UqpbgC`tp@)MWa%LSnu z5nuazJ(i?iUWTL@iyfhjV-8F#Ygyz^uE{5uS z{$#pq=OERz;_3?U@B2bPdRD?}B|)*OhNh4l9cXh&3TyJA zxQOO(9UR4DCc{aL2NRh08aRd=$qbXw#80Ke>g))!os14KK_-l)z7%3S8QKPC=F=$- z#BZ$NLHRHj*ngsj1b2cs<@5(B8}IcLFio`<-0`fIxZCLAZyYHm@t#Ub|J=y@?Xl?U zuk0gV^<69M3+>}vYee+>KtUQHvVzP`g2m0mDmO-M0-fv-ur=F*LQfOi!scMdz|6o( z?Sozxsci<=R5vr)o+f&(1)og(NZr?NB%QK?R9EJKf_}qX6z>T~U1V;SM1y<1Ad3LfXXhbeBYm_lp zZ!TNyG|&lrMyIs5PH5<1A@rWp&gWopG#$UY}T3x}ZPoo2{tmFAQyH9q*L({^G8xNw~h$njn^7xgb| z&3)E^P6WPqXCRfk5FvEhEj^cMqvwoG7I-wHf^sp9QQhqR8>BTSW^~==!cPg?n87+vbVk{wqo3t5}W$s>iS~bpbs007!gkD zG$mun4)`04WVYp^7|m8Hc$}CN{GcXEYTiU)Ez8JkCc#4NZ8F%mP6CW+^Z}Y&9e0_H z(<2aT+5Q8#`gHv?7!Rm5;8iWqOEaLIZ*I{XUWXU-4xhsi)Ml?=wnLzg_KpD(zXjZ` z9-=k}`1=H~9+=H(??lHSi1rQ&HQ8q9>5kB`xQ_J;JU-Ofc~0n&EdA|s?l+A4VagHl zV2@uU%Et!a+;VMEKU|Ol;xuOHmqMQ~c37!G-x7t67$K+UK3gOpEojow;-=qQbxP8~ zu;H3y`5k6y-V31i8@K!EBfDGY()r#gNB+PxXl`Z-z87#PdU(|BVyu&3I`u=CTmeqB|da-i&n{NBf4>0M8GieVVAkZcg|R0|Ei<#WIXEOEg#9JPH#Sh3X1v%pr2F|p^!s5E zn`1$|rivuyQ#T=re z8)*zH;X>0y8Ipzy9v!lv9yB|AGie7+6rnBSNqfleh^omd)m3W-5=YX%pFc<4O6uFY zdpe%6hGr74mz_`2UN6jU=Gk9esogD>+jFSBTkr^vYASUPtCrZ!THo;9+f|Q6t>@^{ zy|!~q!)LKl_h*>1rPFTC!@OphuC|nx4yFI#+vd$&F;Gke3(QJ~jfYE~y2~y` zCtp?C-JHb|_JV%fD-7Ggwm=N#BU49mOqJbr<=#{DKzeaSMv$sDQp=PDjtJLTokAtN zYA6oWpS5Q8={U`;;r1(i1(Xs9Q}iyaG>gSgw&!zxGI7*Tu-IV3hfdJ$K14(8GU^01 z_7rh@1$l32Hh)Lx@ct8_lP>Z_Ro0f$0l&)v&WoCI;N%=v5I>uZfHLHIb1b{Fm#RKr zm3z&CW%mprSB~M6wo2vQs?2CxrB{H8gLZl@W<;E`Zi-3a?d9sH%MT^x_lJXfOhVEX z?1)V_j@=2T*=@Wn3oAo=;CbZn*#B{GN!cD!QVjqD|siCAGS`xl!4SmQOJCw1|5SPGuZGhaUz1$E+oy8=6 z<&N?UU;BcW_o4ygVUFPs|2lKDTL)tKID-AWuCa!zrdubMnKxA0&8U+jd!J@L=+f6> zN*f|);U<-7&)W~Gb5>;e<_m}IqFeCyn~FIG!9D?K2DpWfN(#KM$Pr2W5iIPaC)Mvb zoSC5Yii$7;L?k8xLZ3Vq!t9i;kqdjw{#%cb;-;Eyjxa_6DU5g`ngCD6ejRaw0+6qD zM|7AnrMUcTu+N|qe$qYC;E`W!2K=n6q#%GrFtTGRR(wt9Gcv)~h3xTIeOamr38qYy zuKvHGj$gF<>IIS4wr?Uhe1yb^(&tQ^O2toHlE{=jf=Vh9)J>(TK~GOQ3cQrsWw_VCYEVd!)T2^)tyH@Yan!q&Jkge&*wYiY7P3URE`q_X`fVMed-V@C&`8CgrDAJatf> zeRNsWDzl0IbDtxA#s8n+;6MLe4f-jj7T?;UTeSbrf&2e*MDSm=Manp1c>UknB7|9U zX#+zXxW*)o3jc3!k?eIKo&dzRw@6R`G*%kXF>t7in<^(<^4nXq^|W0qOCb3!rEj;? z+)^--X||}(y>#BZWcfF@dG~hbf@1=@U;u9_6w0c-xV?s614Lr5DDuokV%inoi{$OFWo4CVT zD?S1D`k9b9H+jeT#xwH)@@%Jk8@1d`GLUxm8_lYhYKX`uCbLfY5gxjia$pJ$L^wo7 zY>H6?fIE2HI1l`XV?#bD;_X8m?Y_8MIB6EA4L^vyBOD#?}r!p}A3NN5L z{ZP<%wWKUNP8c3lIBhoFpqdn?-mIjW+}p1Rw7k@`RhzpkpHQ}vo3Uz5#bJ@1QnTG= zLUv20@5NHyj%%0*G>pFphbnf?v?@YoZrM^SQxz{{?ZF+toU>L74WQqMxxb(}YAFec zPSIwdarOkh9;Z8!lHjw<9r%-6Q)(|$Zaw&VeN0Eu)IC+?4o;4ug(yJG=&SOWU!d^#stJX}X)zkU*(82P~S%n=Ml0#nf3<7Ey zfE^yYGL@LKEM0*WJ&kDtQ#+7R#a!s0;@6fWhnt@Za%N|DU9Xx6`k|#^@fcR?UK{w z20%;9u^-;=9dsGfP%bj6z~Q9~Ua_G8L}7(t8NSLu`VQtLse5kEgLV+w93n7N`Mt4X zBLtVKP0`xRPnWTKS-t8&#?rGYURrr2LAjf~Q2F=8pC4PwN6a)wtVVpsm!Tj8p-FJ> z7xQ`n_5*Eb;X-X7b%XAx9I(5pd)U*8&bk4&1FvWv@OtWd@NWTN{3?6jgb0N2b6F+` ze*pUgNb-a78`iULtpK8n^c^g?ucWd2o;u7Y_Ks418sA^BfVTZM7#`t`F9ctCUL7A` zzR=AwHM0CR^m7(?4m|LiL0<4y1ML9*eo^p05;F)}<__%;fddV%5x4jU(iK$ZEmsET z#dWS+2jD-N>*Mtn7TFKFUj36+%#CBJeEIv~gML7RkJhkOhXtIitzljl#7jykkj5oJ zZ4@>4IXc0{46ig2ZuR<9+pc~)iA?dak)2?E*IG1Il`4IN=%O5uSVofpMC=D|59k)< z@~miXD;0$SZ{nq{H>y|*SZ3!8$*q z4)q5pa{9lnf+GldNe+z4Pn@nU4k|-arYcgc!Ochat(e<;E!@;dPKb}q4O*_Q4`HQP zIq-X4d>^erw+AT-uqeAD_HD7fgCJ5Ts>P((H8bFLjLt$&`!NO}|Udoh0%eOi@E z`Uw!Pn-zaIrSW(5%eO#b@1gdR-p$0xSDda*e9Su_cEKYJsg05wL_qJ=#f>$%<0f#x z%MD=x?QlmCN5Arc$nTwrH|)wpVP=p0lJC-$zzPwg6ZM7kaV8n}TSY_Ni+{u?Y@`-( z3mIPtVPGji+)PBmhJJoRFKBRw1rd#}Tw@95_dd|sA~f%%rW+2~gGYYfFU-$9xV1od z*r`?U3RXrn*HOUK2_z3$A9^#Io4s*1y zl0lILXB=cnRFF!#1olaT1+cnodsXK>HTfddx@K$NMkA??+kh@x@ZgzsI{9>fqt^YPT~Hyl1VrMv6`w&%PT|Hk5k8Ua*S}(qO`gx;|vY zHgHMwF}&5l5De@upxtEn2MVzSa(RI(^oM(8p_!<`tDsu}huWY`d?9xCt*}(7pX|I$ z2!l)Ak@1Jp<-Uw{DMfa$bLzxBM}#e%#jteemOjK&n|L8wNg_vG9RsTY{Xr?fo>-ZC zX!3e3uofsMDNSk6{G@kj^JaM{nR`0LO_7229vUU{3UTG|JQB)863l_B=p=|MIK}L| z%k|Rmu$AOG6_A6hUk2?Ayloz>Hv-x%PhM3tI?N2zgRIwH0~r`}1)tfj<=EC;G(A$) zj$3ob;Q29-Fq)|CXe!lOPrJ|U1+rj~Ucsh1BLFuQgCRYdN{yKJG^W$ka>KMpbp=6Q z`f|wDJ%%WofrQNqgl2X0=RQvvKA=Y1LF zku2Zk^MSa(aD=*5)a7`ms8moQ3fEWVF)jzQ@NtDm{p}3S7d(gXi9h^zY~C`;LtFZ= z5{j=6Zqn~xGFSega$iTvmVbPgG0ph@-7T1mrL&8(q@9`l|BgG@;JSZH7>#eeuAi4@ zk9A@v1XpaXSa8yiK;*VeuD8u*HV|G$i{TBqGw`~Sre`zPvDiy-k8LPlf2I_Hdo3)I zg$(mrz{*Ke-a!KX{pa`3S}5ezOx$~VmSg8e>mh6Rk8j_r=dJs+x4oYC*E$9eZomDI z#_$KX0|p2t_;-VRWK6>+dxTuWCvk+A=En4%68*K|jU{TX z{*5MTj`89#=MAKHoWF1QV2Y-9@SuvOcl6+UoMPZ0i>7zvV3X#?yx(2Jhy9KJH14Ah zWAIhj<3}(gxXYOG{r#H=R}u$XVs3V)YJY;tPI{D;dv4ZJA#AFf-eM7~mD+@O*~}Fj z`$1>+9MzaTmxqB=hANzBT1v7O1FYmvHhz-)>-x&7lY0M|gk?@k!N?0MK5T84lyp|< zrLdQ2D5z+pfao$6-HduCb2MVwoRxBOT`GF%jcAkd&&_kVboX*_5DZ|D;o@5A(Qq;} z7?|fcwu8IpSalGtqi#E?BP7kU`zIX%2BuV#zrspv))e4ObkWcjDJ7m(q~K4Yqdcrh zPv&*p3i{Gr=TTp2mv(Gcg06w`Q!Cv2j(5N`aKY zo2A+v(FN0H%U2=Mt^C5Vm9SD|Wfy9O@oemkZH5E@l>L{piz3Bk4rIj5Iks;06JaGOF?Fa5%BP#)eK{F!MI@xvr6Ju9=% zwTkKCiF+9;&YW495ft+?6Jkj{F@=?;$q*`76MMW4BOIJLbMjO1hvsFcQv=geh@oFN zWm9Dr&LuZ7kIE@vBNTSBQ2eM2N~e^Jp%jkWEa+40mUFD9H~DR~1~+GQcV_jIIFZDU z$}2Z%ct6YkXzN3C_-uD&o}0Sg#<2KCWj*zdX5RBn$Thdhs7B3db=rt$AZyj89F}k6 zs&AS?j^FM|y`1r>l!16r=D7T*DfVc;@4-AVVW^osPqf4`x!p%|FQtUYYVK+iF_I;M zMs=0@IJ!O2;J}w;n_Bn2@J8zqQcdFF{1u$;ssFR;KEhm9OW|irioMNs4a}lkYYrQ{ zG@GSM+3H!iD#K%k(;f$nwVbYGMUGU3DZhbYNx`a9IaU@s&yl);3}r~S>9~$baM`t* z&~g7s4z2Fn&ri9~?^#*#I}50|h&RSik*kqI8ic5`G5>I3520cCyW;RN2gPAhbos+F z8eg&lrZzg~Z}ya?!6S5}$wO}Vk;XR`1M{vh9Lx@SpA@;TpFX2?y4e&$*Yut#sJ77~ z!*WVS+iad1&MQQ)55O4N9*!v{(jBROvN_bGC62 zja_?eK<-8iGAaMmm+}bfue-bxg(G=Wqz?@?FEm&CCm>)7iLOAjEAUs;@=_qh1VbFm z+&=&7c~MPD#PA6{m_D(YJR;>*TVApvMbOZ=Z$D^P@2sFQp?i{ zdQB4R?i%di7dL}RoRS*}tr$I^GbeZZYt#M;`U%W?!%GPN&C~^2-S*Ql*ux8YS9j2T zGq-J{hS-F{pe?ilty!C0xoXC)0f!K`EDDPlZ zE3=W~vLjjl#LB|fsRaZb;n}Y*-4MI}1vHKh?oRdv8+_~AzUWrc;H~$*x_Nv0a{}?j zb>%eQk3+gIevh-b^;6=#oTogh`3TtbJ5aaw06!f(2LO3@fZ;35Ul-fGE}Ok%P#&Sv z+1K`fm9`U?RD_$aO;;h8Vo#Jw<@-1EOsvJIE_VVSG z-4{(`Y!yt#^{&g74S1a=&3B(Q?`m6}(e^$C;XfH6O>sVvn1XVJ_&GwXXsHZWO`&mruPmSAZ5z0NnBub+LZoV&k!xqTjA^?y?VRh!DM?eAXQ-6EWY>2L1y;~E6%bN_(! zRSxgjT|D#y{KiZ8OZ2cS!bkGJFY+gC{5Ikf7#fr)S^^T>}uMh@^6@ zkzOfrYl}G(IQOGn9WHl8d&#L}(7H2VXbYN<^42=luT)2RS%<4|uN_~(T-1;{kqYV^ z8{`>Wp50p!<&iYzjzbXPMA#I*);iYDRF4i=Wn_(BgnQst=d%7leA6XN+y(d;6CQX% zyF>-qn#wk}W=KSV&MqFJ9L12An;X|W>ES%rwluj73xMAh1WAx5&>1zwcx~d{!Typp zflSD8Yn_^{HICQMI=fCOf+MLb99MMbK#H1R#C`R2_t3h;VxR~0mQ89a2+4i8$g;xr zfkSU`Vf)zRefG8AcJo`p_KWEn+C08z_txh6xiWfgb?AaD*W$S?tEWGf8BLx|JwVR4 zu%)%SabkCEb1s3Xb_prH;yS~6t=&Tlzu{omHFj!w`>;&7*4+xnBJV95*48pomQ~Is zGi}eDUt0FS9-OS;gA(L)n))58Ss;)Ch*ViY7&Bc7y-agwtnVP^WeU=iB^0%jgu6;D z!VB0o#HF;11Owf#6<`sWGnz-gMJ#AwXA>>_sk;Bu`+ZPVIO1-{Ux^jqFgcK%1Np#VPA_Sp=yIWHl>(WvBMe}1ahcVXU-uYJ}( z0u1=riC>_Eq{vk#Jl2jVCRz+b4rpAIMnetlJPIp-AJMVVEKFETLOp@0j2P{f}N%ML@i3z$8P7*h~A z7!-!!G_ntpndqItK2rvG5Ji5@%2^~v4Kipq*}45PgAK4maM1|9r75t^-l-nxa`l3o zrU5do85M;J2rDfM74?`@OX`e5A$B%)%5E4Ih5FgjQi?O@Qt#&FI6IB_w-3mVgdBf* z@kaEpvIZkVa{5fWVMiok_}*QLnYCP1{t1 z1QB*|;O72e&pT4d=SfNtusiE|#DEp`0@p?78#82~J)hv9Vf{Q&r>jvf{XmRE{J=ZS za*Brkb?Of|PylQrKD3>ABUs%)8;J*AFY$nT#CKQ&@xxE(S>;=v=bhq+w(xG*Bi(-* ziX;#CpW#5hGy}X2bve&c)p5@#8{k4+0s@c`-SYo-vA}@31_AylAV7dLFAsG{34IfE zO5%||?&zTxm?ZK|7FrUS?@a-C5O%5;yeF&@=#-u3=emjNA3UGk;hM7%8F) zXEn7C18l;*K1dV{`e$FHZ7@&QfZd9~kg)}4V)N0~Wv|SjAuNy3Beo~)lJ+2)Sw$xH z+M0yjUMwSGkZhtu4@CeXq2X7=jd^-KK_S;y^~16C+}Brh(7mHKsRrq#h)6GrN250h zYdu$d5!-Y4@oS7P`8m8K4PpD`!?8_s5?9DC6r7hJ_pnJW?gw91u9FT)*QHz>`qvUy zVBC^N$-{EWw@oC=SZ-=YdBhNL$e!6bL-{rV;|3EXV=zn2G{!qDJvR6kWDHVN9GnnG z0h!AfN>z1{+L)*xUjx3J?W;L|d^;yUZR=J{V+a8O=yD1NMR6bl`8*PX?dJ5sEa{Mn(Y!5ZWN8V9x`Q_Zv;kB^%Q*U>^7JxgHc1~ zAx5mkvQo3BjVhMl3{%Y#lukK&^n^|$ptqSh==s3YmXg6`LPm}cNBF^-EDF1kVhW2Z zLAw&AZXR>=RFh}ccP_(M)(@&GUh@UBjG#-bexSmtxl%F8yeqzFh7zI{%Eu-F;7&3; z63YCU=NY|F(jJp{wm1&s2;IphQ^suT3R%Y;Z3*UNm{pI{k>m0m3iw2C?v|z_kSmN!sDGc zP4cF}fV{oqqWCdUL{EZZ3MzoOsBpcPlbVD`GX6q`rgTIO9bdAIXfFG0sW!Ln5A`_p z#+miTB=D2oRqmL!YnLEg4AjD^qGn}tao_TFDb6q3u=2u@+g%RAWJXdN_gft!OB;^iNuPTCre4TG$k7TRT%(yTr znuT;7Z}A%8)@KnW>h0fFGmeA8Iv$X9HxVVzW^-LjTBYZ|by}YV%1&IeI{^$5kJz=3 zex)iz*8|ZuXbaTs&W$UCR{m;~at~PRj8NQZ!Y=Yb zSgbNWm`~?mAwzH`gH!E*wTy(GLG4nD7W@;bSRW@C5Fr=D04pnXby9I_eHF=x!h_?$ zj*C`a^_#ge$YTyOIMx|eG6#bq8X(*7;^dQc0;3~IfeRX@c>c5V8GPgYW6#%+ZRnkd z_%A5gB|*QRD2Ef=UtY|huzJrm7zHMf9TwL9!#gbJek?I~`yAXmWQ4bJpsjE|vNBY_ z-XLSTCF*_rtaC`_Da<~Yot+ukl_a&HIaWxIvDIL1GivJ^#Z}G{+Dmdul^IS!oZO6R zSq+eMwEwFt{9TipzjL(zSSf@D1fMyAhSk%YBW%Cs+b_e}_#nQ}nM1XF=a_u*QUosq zK6?bNIVdkLr;Gh+o1BW`x^}5=73{UtAxE}!pJNw0H4r2L63fw(DKCk!#jD7mbu3Z=bQuN!e(1vu%i<`vq~q5 z*<}iJjK<}SLi!vCUyn;-V_w^Ec-K7^xbMoTXT)S@R!AR-H%cW@)!|dU7I0Lf1N=2z zw~;JwM95g>;#NlvV$3Tabi}2al#L#^W#*+dVi3IM1jl_Np)|dx1&sWT&0~BD5V^J7D?1p7z134_?*-_k!Aa z1W_}T!xU2P4b1-rug!-H+N4mQ3ktAEwzovYzeLXM^19QBHi(q$QRc{+^Db*JKkZ?* zI0M=7#`O;Ac1Mss+$*hc5ID(G`QxR*(*s2x(bXR{Pcm%7f;LAJKQxZ1a{i=-vi^FP z_?|FJ*~FS-Hk4_y{xZ#m}b$hZ;4TgXLd(}%dw*m)7?VUb_zah zWTqtWDdv7$X$nf{1CP9n*RJ{_nU2oq3~X&Z>4&Mox&0WTt40aPWt~4&4z73+-k;3f zQH}8VYV@W_UqhG z3=@q#7a5rCxL-~)sB=VmflalCQ?7{tYgdMeBF`vfF-KyS1lAQhOADCm5{Z(=_?T`?084nIJQsqs-ahE0V4!YZ zyN#`G#8|$qc3a*uGheYK9XJzPZqm+S&Er2aGB9U zVoV1yk(pQkKa0rC>_J+_u^vOEtyczq!$SvcrFLfyyDDUMvp{LW(=m`L{9WRr)M^=_ zENnNieJ!bkT;?C}=U1AA>rKHJGn_n7x=87E0i4u$!3^TI>>xL*z_W`$<`LLo2MK6< zX3qVfNkF~8kl+S&KssD7z2XH9q&XY0DIPIZgb=n1mY4Eaf;|-Giy&?&C&%obNTL`9C@wGp)>l!lXUl^Y8k2+XI zODfLP*c0sB^XO-wMKZBMHt`yzwJ%~e}@SD599 z1D}NrQEh{wpON&a#w7$QW4Ky%5>KP~=2g_t50B*%0I$3-*V-+TCtk!$UA7%Nr{jCK zChEL4RyuC`OC9j;=k~~z2ru;puBAOHwK8nok&x~~S2S*qvUOFRVQyN>Bt${*#Tkvf z)x8!SSXf2}njkI>aQteJiv?5ow`C|=jeeUj+Ik#!am-8uq}Aa9G`nCnnx&0>y1N0! zvwr1Y&~btoJn)-$$+lr>`8d|U@H8~9hVMFH>pm{$?^dn%ts4fWmO)%eE!QGX+~ z_XGECa4oQ|6;Qt&h;d0>d3b?Vo7>bE;QwSU)It2xh?DqN%FyDwxpXkOE9U!68TNcf zD9Zk~D8v6~F8!ZSLtEwV97SKdMo9^c9UK}WA!OFzR9nhl7)YMdQWpMFNVF}Z*C!Bd zHf|Z)@c)*hID*(Z+Z;{s2|W9zj_c>IHP^FV3Jf|z$lY|ByX8FRymNcf=I8qxt)Hb= z&H!23k%l-)0I@M}E4B!S8k(pB3|bAmgIGc@o|RAo!-V*O$7A@r>bjI-_2R$qDTL_ z-}iaQ3$&(c9nhO$Wpr?JUa>G9Z_kJ_XlomliM({rWWNQf8;$*h88` z8IOf_TmE{tJ|uSQyo1=h`MDGoh9|o9sgXw}AD!R1I?2yU4^2-0~g!SRW z=om%fz}s4zpkYq2z2p}mZOuj%8h%oqI3e)rSH~Uy`9i!24ZQ(ZLu`LpQf}u%tPD9Ut`6^dpnN+IjByGOIYN{%B<=rS- zLCIBhj~^Z%+<@z2^X@;706Lc9Mk^r#U+)!>KS#64J%RAHdeAqnd@R^r9lD^-X7_!n zx*)KXgd0TicUhihY0}*iuBvd18M{O0Zm0Sn28=C*UX5?BYB^}r9G)hVeG>gyy~pro zv&+DZYIIKlw4rKFzbBebW@3BV%5Cd7U&RexsasUYSxbd=;JDLHHo7XxNM^)hJ^sK2 z-M~;*4CNKfOGk{5zN#Y_AN}>dEE+O+dn|H4Qg^5{8d_KF9z7baT?dW1^)hS42+Lng z9P2%Mn|T?8zF{8Te6tm}7}n~mn15+UXZ+ffy@}O#hQZCNF^R1UO5)l@wk=s3JwMOu zW#mo_KI4jiB!{>xhJ!AxE2ppEsjleNP08nexGbOuG{7XV<7?AO_=jBgN*)d^V;B#XY4cwyMZRg_gQ6k}MR_1*ZS0gl z5~!FGw|;kLZ&f^^8@gC2s%LsD=yQ=^`;t}~K3}>jQj!Tv=2b9#A&MBuH}v7*dv0G1 z{5~0Pg7j@3Q^}<5?qM;~j9>KBTnFNCN5ij?@Zqfb{Lz`2M0YjJ$j8#}6=g7u;B;_AKWFI8gVYrU( zIF4PQxwuc_KXfjO%w#Hy4yoIgh*!%_x9qsKCEKTO2V9(8L|a}W(goe#!O?wKSc%9f zTXt=1OUsd6Z!4dR+apL)%olH@Nt!vaUnXyf#HEZ{0%>`0cWR@k-%R}LC`UU}s-FqL zmo`GrB&I!|qJQrtM5IaBd`fwPvdAYdxl*nC&F`HGd8vmA8#_beNnAf;$4xf$7?8h8 z_s>W#DKayzKz0*DMk@!WutY!p7nb3F7P@T|K}&3CAfQ#O{~^op|0zlQ?+e}k)ij#% z*8^AMKR5YPI68TrbBDu9>E&YTlBsd@ro{TF8%;~1S~wBLqYvZxqBxz|Nw^gw@G^t) zS}-kUbUK|F)lZUY{b` z_dH?y`9I`GT%nM8Ykm<5)8)ep1?>p(MHs+tPdh&1abR|4ot&a@%(*;*G`sMWa7*#p8ApxEGC9ENtn-qnhj-M&&c9^WL=0HneiQ zOfISe)ukmB^l(>8%xL&!vy}G(;swYrwbxi1>rinsSQHi&8?bIH-sOU^@4;4FKCiJ{ zQ#4IF)Qg1JddRPoB`w4g^jky&ph*j9Mf!2PoMvKZRjrRyFs|xzrq0V3F||-^naMq0 zm)R& zBiuP!FoRQ5%8vXf-vKqv$Lon~_S{xWGOHou!J(tYI1v#_nIDjfsYg#3O6E>s;-eds1&H5a*fmIOT`Z6) ziLKSxt*{Pzcr{4E1o7rh1nE@8gWQx=p|-k{`b2YIjXdlS1Qpw-e%xz5wE z;d<+J`*$ImMF%!-UEv-PLz<&Ixyqwu({X+0^acdpm<`KOXMC))Bv2icAmq>2>4!666EfrX8S zcig*b+lb<8`P2lpJEhBH=?t6jbV(-CGBdJ%Nw%bmoSR`P+U%oC8)e>IP2DQJ$wrG< z*Cok2`{eyj?_h}kQ8oDxr)Dje`?cOOdjdnxHAGF&SFOg&9+K2iBYd|k+2m7L(31#& zRj0MttXij^#35&F{2qB7SUUcHMyLw-ptwxJYQnJ%90 z$%a%|z`g5yV}LBwU&ifD9DOd+(_So)2HhGEv3vN0QCNYq({jXaZLi!8;Zp^_kP;9H zeot>5G!t5C_4I=E<5xU_Mj7d)xVOjIQTT+=FWm=f1>U_@o>W?frYhp8G^e-T@@E0AzRwg%7fUI^tUwvXf4LtUc{ohQSL zSfH!o8R5wi>A5nKCPYS?!OuW@4--StZT@#r1r>*(_&YLOqX?p&SaB*>o6ur>jLLdR z;@ec=$f%1=`IQ(4ukf3MeWOZoy?PuFebNDDv_@m5Jq>9#B$0>K_ z1i4b)?xslc0wfN*3Q9YV;;Iy=Hu*vA^45_|~|GYf4%mOUQ6{*p5(EV$OPXRU4)Ma6#=# zO>9wkG*Mz2l?iut{FyRumt;Ihja(yWEYTJA={Pu9EBsL`rU5>zTvo=cGic>8(AkPg zQYnlbz|01W2n*7!2~y45cZ9Y!o(Estogd$~H1+ClW%#k}I7wibc={r_iOyPKmeDW% zN|$Q*mZ~SX&XeF*aJ2OdsaeVeM->yTF4t4+Z$1R}#CvxM(4VM9gs!UScb+8PE698h zH+8PU%WZ8qT7ZK${L>tncTA{a`z5I`MUB-Y(4$+ojh)-kQEBIGBwe+3Ky#V$C?W{77*NP%TE#FAPZg zXtWx%Pl5MsfHp+5Ppn#KwAc?H-0syxYD9WjAdRzK((bj=H6~-3g0$6%05|oHm%HH{ zc3sn-{%ga+nPiv2qvA&C?O_0ottZmau-^Btf$x->!{3f}-v-^?{;8`|5QbFHuS-x? z&p=hPziu9M-#TJ{pFqXwZ_B)L+vQ~B3tfzsW|*h<{PgXTv2O5_aD`q2{hUcyBeaT6 z+t0W`T{18mJ9FO>l67Q~*8d=n@f`+|wuSS6VqTqsz3ic9ebaKW#!RaxWIbeEGv^HE zxnX8u)k1x&Ih%95F0iv6f9+j&`_LQ8c&WRmhYs-lnXC_ZmNZeW<`DZ4Fk0@*+4AYs z&>tQg|7wF@$a){A1G~6Cr>l)wrQgSIpYJSn%iQ;UsES;KuZ&^c5!$>R7VpyL7v{$J zshDq2=>V#i!EWS+mEm<+m!Ern>W%vQh=|LF`{(BW=`d?*S38aXC5OoSzFaQuFjiGELPzXq4lnEmO6td_r zvZ&-C-b0i2gw3tcwNSCgBw?e9nM##30Z~KhLRkE%?S8*PYA4OWrP@xT#R5t9_g?k)Br_AuYCSE9)e?g6>~h^yzfMEt8}c zb44C(SDD@WY2WD|>VFV%PiVGkOfP5>XP<_O4+IzVK?%Tc&bv*l6gHIgH4ATxoxS+* zy2g<;Z6{R6@CPY!JLXUoYmeK1E0yVavSoOh-NF;A@evlAQ;bZ<+Ie@DUtBdRO6+Okjji)fX|>X?sq*c0T3i(s112e-2d2v%uz1;z(~hmh z!-#VTeupx;YOpa_SeBc6)kI%z$j2ESfS3yFvs^dnFQ^@OPSmF&xVD=9E!SC`q8=gU zlP~J_=0>Q9FW_$M)^XvRnYLZrE^5=^*$0Lqqz+fmVt!x5y%`&gl53~l>XOzvJ^dU0 zIoYREJkdo$rqb@~A>N^E8u_>DWM(>zH#*!%X9Yzs;;%E^kTiDyc96alCIjfu_`!h6 zE2?PaIalB1LiE*)d2`>@hIt-}j$+*Yj4~Xh%8^*FHC6ttqGo^txB$BWXMnx#+ege} zowA99i`|}*mp5s&u+EAX88%M}-^`vi8ltIh%m!s&%01tx>C+J;J%3`7XhAG4<%B1c z*eJg$wi!Kvai|B|E?Lq*1amnfT}d$Y&?hWG`tAVkZIIDm_t>80+pz_?xAqK>`(ix_n2Q*m-u)2=S+Pb(P%45<24#iWMf<*TNgK4sd)uRWS# z?(D;b#@mI%M+>U@r34EGtor%A?vM8iiO!TKf4IaR>0UKS%cBz1l$5!F{Gu7ppm`M> zD-u|u0ShfWeA*zP%UAq{Q8qYWVcc@P%%3DW4L=+S)1m;^*rrJR45CZ|0EJ$q3LJvE zFLN{GAv>oG>UiNF9i}B?&~kE(n`g4_CJ!%9R%XtPB`uM=+c`Jo1Nj|JX`nymv2w3B z_?S4q*pfur;i(;39S1Jsws{x1?_1M%-7 zrfqj7iJ7sEB|Iz}uw72vH)u8w9pIz5{>FCDSwnsx`o-RRURlTeedN|SAzXo^x~TVS z3dfwA|6>XKzjLRR>wj|R?QolEO^RpK;c(P- zZE5tjD5soAB|fA?+mVwgPophlMVT>e!XK&9q$F{BJ?(ViE+8`-D#b~8DjBOBFue96 zI-asxv(J7Dekab{p@X}mq3=HI2@*4MDkjpg|G&Eqr%3Iq6vg#P7)8xg^e(_s z7bic=Ltz^gmxw1D{WlgKQ$SRr!{OR2QJg-n_$RijP#lgAm#fRtI$c@Mhn%cB-rRyU z>e8gE=qE5PY1`}O$sft7(B`NvrC7_KS^P6=<*E?*r(?3QZAFLdfVHH|#OHuuVet;n(!LIEvyzpSn+_?ClUzxk#U_hBcu)dg zuPxnTQfrv$EuORd$i2*2bh;dCZr!OrG@e~uWdYyc7CGV}w!AnsE=inc-WzmB_S0uK z7|g_AP&-;GN38Ju{_wt|%}%DIW{D`glRYtePQ^!sCTpq^<;9o92$SV2Tp;yJ`6N9Z zd;N5t@pmRitE?&59!AUkh!=aKxsV*D;X!@zXzdk1WZUvGG+#9K5hiA{QvM9}O;edT zX(3LyPsI`^qq40K*ZgcCG-@Vo7N;4SlUF5|X5k>Qi8=!xVML=$R{V20At1ueu*k=lZ_Mp2qF2~C8hLM|oD$ufJ z)Vn(BKfSV+db#RHYh?~hvP(qxPsGH^dz3r`y)23$ZSou)wD4MbLpCpS$z^{xY!tbO z)b9)&8U$OGdVRU-Mnp7vA@lk~(Q;d6UYGoeUnSXa8LABj`?Asevwmk+ltpbLPQ+Oz zJ9)BO708pYYa=aPnRJ={-Z)2@STZd$F@ULTU`0LM0yfp=#GzH)yX;-RPo|rT2kK@M zZGN3`vd(3QLu1y$$E=Qj+4FvX=yDYaaE%9-mzaB_5Tsnsy`R%Bbe>{m^I8nbEiSmS zyw7`NT}r21(*@@oStK9?%>N?C37as-De9J|Z0i=rF#F~7ku0I;JuEfJ&Mm=GHq>la zFzc1yHhCp}{^}hr$uR56dii(Z!|Ye^`!mp=aw*|_jM+ZK^Ak18U%Fx36&ClA#apdB zg!i56Q@Gq|&67@+zeEW0XMT>rJfRbqHxcQk zcO0K1`u)gHd!}X9?xEb+Rd67zqR6kL+@)lT5}Mb--kWA6;+!gl7u6K;42z^qxV{KY6#&?+cB~_oaUs33l<#doJv4zCUU{lDeqZf%lj!T zhFQrLoRJD$`8w8`RPp;@0JcxWEv-Pr&SIeqEhPca!o1yD_ANYZnxTMBj1Hauvf*-$ zxX`Snt(F~o+F)9&L-&fJT+#KLSqrAXz>5-mtE1B(Vjsq=-vS}vpU$7J!gCKrwl!gG z5r@%~;0o)fue;UW49giWxV8B@OVD#@5<<5Ffd%%+LDtLiAyMOH5ecGf35OzmU%qH3 ze1>4cd36`;#xgizfpnA(Sv3{f%JqJls?Cn)IDP%vp>kQ-srOyy+zLFyx%T<=ik<+4Sk(?4i1-*hA2E#A`C{+A;_cJ27hQY3kPlIzq>4z&2X*b{l@0s~XzwXoI0;zsfl9 z&Q^?mnn!BmHO+Ygou3S?mfo%EB&|?-w(NF+yA>m?m+3oIOCs>McB_B(9Jo-c@?7?) z!PjmH{PO-6RLN7CY6z<&2US%=5BOWFAYC5P4cv z*OITY=}s|gfapjAWsdiFd40FwwemmkO>cR14i3aaao_2SOct>&C^Z4Y9OMb?~>+Cpp6&&y+4*mUXMuMcn*Zgm^22<;g~ z@fG*UL+u#a-uP9^5v)UAy7wOu@K8984!6T(T+lqGizn?`avnG-I=#24EIk&A&u_~) ziuYn)XWnA^N60(CYrBv?H6*_f|NGWXUy->0>_?Mi@}o)mpORV>txV*MoNcV^E&jg( zuARn@C~52)69wgvI=EO()VB~P7^hLvMkp}?Oaz)zNc(!oUC#dS@Mfo@yXYbBy?E1Q zc?r{R$>USe&Vt=$I1!CE(S@0(^L6%iHjjrT=Ld&;qyThuhpH*whfAX=x6eud@LZ2m z(UeJ~B(*fo8zI5KrR_7j$B!AK%?G^Yk08?en>H6{o-YIpAtrp|g&+?tVMT-RWu3_K zH#gN=Se&hCtP#L&>$z`BZ@!x~8<(|PueykowNEFzE`tAV8ITr7&r9wJurcb7ofY-a`swUXI`9iU3A&%%dJV9TFk@SK#H734PrN7Pt&d1 zP$=uR=WVqtb=aW7Sq(qP{@}rjeVda_=ywYYOjnWadQ3m?N*={TIJ|Q_PZRW5Q0fyx zSU~us@RPQpZH@28p?HZz@q?k;CHpW5-c~YVY zcXKzi_2O$)pvN0glbYe)XZ-K+8D8U}3qppRP@}qdIj>2d zEvBn_Bi}x!`ZNwa9u4e}P35l%YL|jiBc9sAh54V?7;t%CESksO3-b%IBDiQCYBYac$GWw9-|64@ox1>@Waep8KLTos~lOdv_uqJV+ zC9SafSujd)X7_8uYZ%#V4?7`X+aN{;jg-t9qiA^VgDLdyhGFxG?!iadVh_?GFjetf zAQ3@NZohX^`sWFhin}Zqz^JfwtyDtFKEcQl_bGc}U^*$XR%qFxS8p>5HsLpeNO%gM(`$(iHq+G@{B{cqT@DLkc6B~k-e+!h%WgRMf~np z-G_tehz-?Z(lCj}oBKRYnc9?1$Sk%Y7cvJdY1un2Jnl_r=hSQ|%# zKCSGPh+fhTjbCA*V14c#P%5yww?b$Wq;QnkfxUlAGCGC(mJiWKao58#U%w!pB-kyl z%{p(NxQcH1M;y*-(Z@@0pPb+Km#+K4Km&LXk%sbbHoVJ2WF`X6k`)UPi(k5}MJI9d z%nvvV=36{Gwj@P${dTgUOr2s1`7sr{g;)5-zu7kwZUG4qF9s0z=x@<|9=yJC2~x7H z5TiLk%|4*FizZ$8fNty#fWW>ik6|%(M~A?EuX{hqOn=!Yu!9LZn7oR)QyD21=N-ak zed_paWrZk-0BVQG26?dUlISD+OluM0j+lX+Oo4+?gMkLmd!yb{M1gF9mCWsi7=thK zr@qenz21{Vfw(}Qpjj7Ex)nF=66JzV&VYscv1AJZ`4N+;HrDI)P$mjp%*gzk@;<{~ zFBFR1qHhmT18}>2P@_P3e}TeN02=RaVw#^m#ijcB?!tfn3s>epAvzTGUNrfKhc*49 zNfP=WhUouorTxEiw3jF97<&Jnc9SU$EI)u4!lXa(*A)0j=sX&32vQRr$%J?lJi`3* zuZC-It1@Yt5Mok0ZEw2i zjR)=BkyDkc+sB-R*=dK}9IwaS>Bn!ccP*fG=x^6S9X&^y?W0g1J;M+m-Tnc;6-^)9 zPhXxWk3>(3s2^!k!7wN(0qMOx$}RD|J_=%zCt*~CR8PS$q$IEKq0(SL;&6nd?>abP z&{*!BlJ&n#*zAKNRi9kz0wS_}#{r5171I3Df&%h;Y)oH_{Nhcq>KWy0l&HC+H(tM~ zln&WSE(+hENgC3=^Wg3SY?Qg=w`A15KcNkd`|AZcnTgDJcS2%G%wM6IGtycg1hBgV zSmy_Uu+IBWVZpt~@2y;TP>7-uVE~51EBH{*B;o-9BPUGKS7l715=HSa z@_MV$#zHk4EA_~T$wgY795gyR>tdJll4y#Q&p1H1T z!LD;MzSdV=TF%kXrM+m*R$h8S)m&UMI+~M;j7$vO5}vs#G*MaxyPVs8OE?EJvun4| z#+|%ITFL=ztGuizixpdki;mpc(#A!|W09MdY$!!)r9qA@QGB{XmRnj{7eyIWSUVn8 znm!9XxhZ+dozcw%PxZu9?0TK7@;ompm6>XPkODSuf#>YE+khzEIut}f1X!IU3dziBZTRL2GcX5n^v%MX{#xVvr9)=mQ-1Dz5W1{L#OEP~&gK6TOa^^aM>b*I>oTcdB~b;m(?xXW zt->`|h55kOI0r)#{y8gbhP(E9!_hrCSOMfjob6xnJ`HeqDiV(kS#b^x!9_Kb&L$}y zAXsxMz@Jqe@Uj&~4%m2df`A}ONa2w<&T~M)`;ofo4B;Pk-k4HhvVj1n<`BXsHZ4AN??HbiyVlA{D$}pyL-`EA4J1^=4M>s2o2ClhLmf`c%q{Hxf zdBU&m-7lYnM%|zAJNRuXzHF)4Xv?g!BXR|XGjK7C%#Z`p9oEo}L_Th(5Yii1vkno` zrFIn&vXL$H*&1h92&*h_Fq&V6P_;=*SEHX@8g-+9TK?EDQGbZE{_sD8{!xmP)eOnZ z2*tYUxn)ks>>n-XX}^{65^-e^WsZI8>Tgaxx*RZv^L2`9mG zg<~duao10GNNF3j0zvg@VVCPirIBwMzdzKsLqEgNn?Q2dkS5+he7T?o)!q7H|5hWX zHF!@E8YL~F=QPZC28hDXWE-ZV7>$w+F_KCL(!B(8p{*OL!yZB1TiVZQavx9J0B_)N zhzaqya}ghf_M9!|oPzGcgxuAxyY{>_<~-^LcGXDz1WEEW*IG3r>Q^2igB*9e8z$xS!Afc!W6}LZm^lN zsgFH49>m+WRFsI3|3Tb#%>j_yMlP-l@oYS&Bnk@V8|`z$zpSYM*5l;zhz+?$R)qaZ zDI-dD(~P8xlo{-{bsK;PN6k`BTY+Zi!l1BKH%O}%NRc`VA>OrVPq3xIl97^&P;}ZB zkR!Q^o;>eJA|6HTvZZl@GVlYy;7sRR>KrH)g$s=%R+XvDtPV{fL@i@ zR+@f~-g$mA02-4LvCjPFc`^9fo6hv8T;x4{6@`CDv=HvD9*Md zQ4E(OEIRA@>o?rge5C{03e*%6I_x?>{+8izakTkz0E6Z>NNbVgNCZH>SFWNyH;hhq zigw#oXnKf7TA5)CTUH->>HT6jqXpcIMrpeYEr-f%G?)=Uum8ptX^f22nRK^Zq3ViB(`10N4vI3FEvu=MUP zHAhT+Jl5y>Uompvpcjnw3AB)~ykYyVrhiSon8{&G9K+dNs|$PUy#ud!2u$63LE=H?#V*47hH0&X)00=Z?)pc!7s5F zSkj}(5C8GM6Np+WO>nn=TuWyd|HBQhimjE2nWUMKshRVCyEHG$_~(JDhBS88Cbd*9 zGgZ@LZ70;hI=-9AbwByJDBnTt_oH-OzM*oaokp$0_j)9km zU%+2Vm(%9Z6XZF`7*-kSOW`|9`bBX63 zq66fkBcZ=T39^dC1(8vZodA9oW1+OrhlS%3qOB=HVi~29-W(xreFxb7@vk(>gL^y; zF}>of(Ja{&SRL<*(H{8eXim$K5n^u1h*Rs$&YZ+|4`>b2Pg|F+7fZ?E`)Gl{n5t+> z*C}3dsEq-0$-FzZokNAvl9b#D`9xjx4O4L2eMLlEHwPrhYRh-^wvj@e{S=Mprt|x_ zlQnRMW4`;G4YS2WS%Oxbv?JKII2>qt(J?B?1{%C#HD}qx zpMU3qkj*sfFj&8nRVkkN{GKfXD;S+g331$5SM>>4e;)OcH$+dSRJo;?nXrVTS#%g^ zVxq3H)Y_Yp06|Jxvcw54zXAKGm!HQ|i^*oZqk_HR!gyOC+QjAX*f+WOH2=s9R4OgJ z^qgl?gd4O08u5Y?c&*=WZ&6<^`x93=#gmI`CL**=@fXgDC?8tV>84z}w^P(FCrseA z($jFUyt(`zEGB0%oS3NAS)<7QP!CdZF0>Rf@Dlmsiytf2a3c{sn<#0VKA-iFvv6iw zswO4%M2DsFVqMna*Yft)(=xD2IrL#Nq$m}8oes46a?PxwF=IPg?tExf*@YY(T>L+2 zP3SWE+u3CG1EZRF>@L!OCE>p^t=1zH%!jM;)6R9v43jKRFuIWItN&a^)+~AlMZiFJ zOMAZCS0|t<%O1FijNs}~W5q1qs9F=fz6Y0)c*}?}(t?U3$MCV_N%wjn`?$MftXZG~ z)mX}(R}-Ieb}{W)78G4Xy@jZ4lZ~(TC6pm~^zg{{rn3JC7x$@2_#RFc7| z6)JjCOk-fk=-%YOIJc`%d+y^w5(+gy@}KVWx;g^D`H3IVAQJ}65%NP7xH^CeobI@E zkN07j4F<^&`hGpKWlb%=!e==gz{q{YhY+k^1>JIWzz8HZ#iiPn_J~i~{O7^0+?Mpf z4e3*u6C!_pxG&KWsX~ahT27=8>k0J|E^MDrx$gecUOVH^cVLI20j_8<^2SWrO zg}B2@{EoHC?{vgJ#I6%=L?GGeD_WE%p-JN%L&j9T=T)vV%_q7{6P5r^HcZm2;mkv} zM*l}#q~2J7LZF7h1xu^a^!m0V#^>+ubw03U2i?ul7xNC%4bexUk2Fk5kaJnPM)fE? zEr5}a-1wDQ{~>(L_xXO#`NO{9G)Oq~(A2TL;y@k#XMx^n~MUtY+*5V?FxC z>4Oc3o^r@WPR8a+&#=8vwh!`zqptQd$}Z>o#Zxz9(Fd?JgL*5SN@BXiXzXD@mj_&mAIFoUxlQdeIrOUewxV z`ly{-J-3IRSRMu97uYf&h1?&Bmz6KBLGH*#Zf%x-LhRei%5lNzJnWUXLkUZec^U*TGGm7Kxf8o2=aguXdn0l4>j+<8ZICeKx9 zO*6=R13b>i3?jG_Nbl=@*ci})p(y|=U=yL|&9NVug2)0=-BQa5{aAjT1C46!V)B0mG*w*GW##^Ryh zc$0GC@(EHqdH>f!qJYOSHyUQ_Pt>ufL7vEW8KpOMjWEJf7v8%={FBDxyb9H+s6mRz zkD1{;lElvr;nRHKNolO3VXA14p8BRr*0s1{u4s=cI$v6bpAf&Blxd}dS2u*xp@@dyu)Y`m^1lh(u|2Jpg?L(2uJ z%7_)UyE_e*pXkdddSU7K_Hy)SXuQ_quN!7w|IYlGofdG|?csP- z_qy4uC;$$0t6hRIXbd6DZy(gSPK2J@3L02*2E2gq^+_I*p%_ry!=vnx-ZMuzB)zdm z-6p=#N8KiQh7G@3^ds&^sQyEaB20OMjw(og!;aFB`p6x&A@vtJ%pmm_J6t367ddPv z)u*`ULHSKV_APjrK>B4GAuwc6d#7RTGlW3znPMGKvbkqP<*;!;c&C8!T|5@>L+OD7 zjABK>@l2U&sZNm_6-m&n*pfO+u1if55hsq1Xldo=o&3-x_RH|l80G;WC}Hb@>?XG5 zdFYMC%V9H3O&iNsbl#N2Oc8=ERqS&Jb4`CqrKM;AO=0TpOrS9oyGtYzSWv~qoJFE&*V8m%pA zYW1Vy4O>SqhoQzcg0)Y~nFdtvI|K&k?k{iIJoX zQYXY@Xf=k4hqaH_X%J=1WXlGp*wGW!@NM)qCW$B4x9Ql&|AeErv2L%DN$Qj}u=dd2 z-$Rr;{`Cj;zyb zHp&yggPCk?T8?`xGAg^diNq5Fs~H-B_?MO$ihAUZhHE`;s3fBs750AIrpOvf%_@Uj zr4T=X++O@NR;pQPAhfQ_|JKD!^|z^(i2xyGHWC0v(u5{*jr)VbUpdh|W^Jt@!|Bq$ zxiw0>&fLOaD^O*;c+!pQEvfiWTA}@QHQo*gqhH{-c$P8r&R?a|!OWcAG-VtI2 z_mx$JHj#YW|7+n&dEDu z9rZ5fO*e|ANx3uitCjUyl-lO4YRrlnLkKZhisDsz^5iXk3(&tem8~V@I)P>>LFPrL z^Hau}o0Q6rs3Mh7G_iGGmBTjHaB%p&90Htql^`|X2fql!L2bSU=PtYQnL+9Tr=y6I z7+kcD1lrzgpUpX)iQU3Aw%ZNwY!F}?$zXVylY(D%4<|i##?moK^~Ipd>A)IOT*iv7 zva`KVGlCK)b|@4(D?CEfJt53XuE>Jsr_HQ^&G21F?8!N!K8=##OUCyIpvg?1OcLt! zVPmT}BQBc++Yql$&K8rMJyJ=izRoO{ClTmBX36Q%q~lYy&w^t*Ssol14A5W)40IcV!JGiH?uy_ z#_>v!%q@(&{MS^5q@YO11IiH}4`ZJkg=44}WLw%;APV&9h8-nhpFfDsA_LkMT!#w4 z+%`F>4r>dq6JvGG8jl}TXL2>+Z2{gEWH*enMJh<)s<~kvWH-RxmX-z!$l0|;-N#{t ztufpJ@5tT#gOr)$1=ax)2dR+^-dn32SaZ%Kcxa7+5=D<9bg4X|uC2w^C=Xj3z5*j_ z>IPC{!B1m@q)9@Lw8iL0$L6B9{YF3OKxZvxC|8>`EFaW559hy14bVfv)WnT)Uk&>C zi?IX2&^>N=V&Wy!yA-dT5(2|BeMa~HwvnO0UdIRgb{`8aXkvYi@~l4o#y7?nb{?6| zSYlFPr9vt;7{e2!r|veD*Y`5#6aN0tF zC|&+QfIrKVJKA2I>iR`#8rCOj+Sv1xHLc2vlk|0P4^1FV=i#An=K~bT1xoT>YwsMc6Asut%l%ns?x@qdQ#F0h%8C)W6tsEV0MYc|yjrJqN)GEI-0{C6gyMJhKWd-6>SY-#cs! zz-8CVRb`-N$nP#u{t(!pp42eSi5G}lo8r8{cLDSoTj<_~Pn$C|JO5C#o_B_64$eGPptF;)`=P`Z|=BN?tbW31s(T^77On&N!p#_aa>N zylSD1tk5o-CR*{<^7yEM#z5u|23t|MViQ)fnmvH*pCkY#4l5I=GFWJgW?hvCavp^9 zsYB-Y&xz({OW{4vp|ckqIXhOSAce z;kqm|_aa%m;#M|Fc9lzRK`pR6A*&Xq@fAIuFcm+=1FM(aOXQem+gtvt76s8-WKdN_ zdO#?zU$SBCFSEYrWrA)>djh05Bh?z=3A8}YS8KOOAD7l7#a(TmlBp&^C#@XAT5aD= zfZeQ@5Whq3I%h;F0!n6>7UaVuG3m}1E)mhCmq1=uXfM7%NgdOyj@u}$yls>EOhh17 z1u4k1M`^k+dMz{p=Uza!npLE^MOlrU?u0JU*oxC8nIMK9S4pEB%Om~sGYN-YTsT=; zm!s(jL)jsVP_=Rvb#hVD6fNVvC<0I4M!2dq`5(pmvZGD8vVzVX#7N-wENCzVNY zk^cT{n!L z7ukII;?)ab!bRf6IDTNJjuQMeOuaZP-#sKIeacw~Xm0%Kd?I@sG4Gl95qLC>f_ z5lkwK5cY@t)vksiRCiF2{AMuQ#&EXTKyNKnjx|h7F>llzuj&w^kD3Ke9w{RdZI zjjf~?P_%9w=PXusSNyb08ej45J&h~>44J^p{0Z6xc*0LP`s)fNTwe_Sip#L1D*e4P zycZY6wX7&$UbttH{YMXTEs4T`y{tNnbXtAQmBDfhgzLJYYIo=L7G?`9oGNw@x#vuO zjshT93?2o+EE*PIIts%$nwX3$y^Wsj^QJrJl&Q%nI(l4&_AWeYkIa%~`;yN=Ch4m+;tkq=X3a*QcMp4wo1Pwy@z?>mB5VOUjR+?O4AHll+Z zKE;UBsxb!?!fg=vH?@UGgC)6+w3$r(>tUTA*&Ud`yROaRXm=4TKcWGcbj|V}P9K=T z>50oYL}tjX-dj6t-hme0KX5!XNPl-^sBiH9UVrv~kakZ&mVN7*@GEWGm3CIzwr$(0 zv~AnAvC_6GZQHg{o&VGQeX-AubF;f6=G9!WBG%O$YmV`}zehFS);9cmy2|j|@DTmK zeAE3O@eZ}`o-iM>Rbz>N@D9ZTkw(JCD#a>Qin|nX`kDWYcbN9lW^QJAhaZ-{zgq| ztk?7t=+k8_P6Jrb%tp=v{Zs@_-cE)Yr3z$Mgb=6R%_|ldA)1o9XX< zu<8Hm2h*0uz&B@+X@b?#;k5SD!4;FxMa%JUoF{bY4tcj*Al)}2G<+4|UT z_ediT%CXLxUHe(mHhI*_v|N!|1y7gma*mUfh^KyFM&W_k+gGPDgoS`TBaQeK)6#Gs zzZJi>45v|bUkgGdK3-jh$-CeD9&WsYRp$;ud9hvjbq=%VNMFg#tbtKAr#Mt^L?elD5EQiH(1RkUNt)~QPkqQF^G1Q zCj($$g)0j77xKTk2c8-Za5N)P<-HI4d5VaW|w7LTmw2OHw#0lC@Bbg-fShsLOaY?x?%m zt694giX0uM#A4fE9(ovPB?$R~9?+j8dWCu%;$br@-*XsV&`+31_gDq7=41hpB#C`z z1Sh?@m_Ms~x-(}&{P;aV27*ZG#RMmu8tOUG>ylVLKt-HI1b_xIL=!c2Zl;!rvK)7YxAM|7)I@Jd`2zp%4?6^~P$=T>IV$yU$Aj9Xr=jS`j}Nl=2r0IM5oM+FG!qE1l!qk=2#_`oeE)W`WlDf zWZHesLVd1Mb8?=(r$~K;=eOREEVz-88&%F6Ken=;w>~#NyGysb9^W#5JngVil?a9H zSfIH;M!Ru>f(4@&;C|8E(GLue;+wjs?eAjY=N#^G9Jvu7+;eji^qX|*4MDhF2NF8% z3Q6l2oPiC0+CvibiMhXE`ub#r$_3p>ctuQijV_d?zriBps@!tq@J$b32-4q*;Oidk zqM_ARyd(tdsivIu}pWlFo!j~lnDjy3ffi$j9 zTFeC#?L0?b9yw!HYu@w;!}!Dq{3J(6IaBI%!iQrlAXw&4|e~EMfvF&U7YeSWSxnp7!&2p0TQQ z));J$;kr=3n{j?@<02E*It5}3qcnEueM(`X6X3Ur3JaPwuSO#-lUWu64B6>zknK6g z0K5Lq( z5wR+#3IAZC;jJpsi|_2m*K_Wg5@MKP+)blA4Xw%dB!wZL;3qiM0 zW-pLabOy$|;hAf7Dq6{&&wH#n9ihUCglxl0Tc$!!iCsz08;R1{O@}MjG6~Cofh!<( zcOZhDihukq837;&Ew!FXr-`x(>9F$~#5iKuUl?Xs<}bHffvgyBcCc&FSmuWC7#WW` z!6Q4TXa5z@N_-*lp}Iz} zlI|62jyx|S?SXhVwQooi#{F8exN^!b$_tUUO-I4z{w~*YY#bqy~phZvb}Ia>!mf|YOgZn%HoBv zt!7`hHL-95qHPo@zJ_p1T;fw@0MT68TC)p&O}kSPlDkuiZP?jawu_#^+!?C!iKS~6 zk@g(ONTy9qJ?gpdl@6gJIAHUkJ%Hn;H1KPtb~ly#1G-1Gt{prm0PZ>LNoO#1jx~wN z;j=hYwE8@Ki{P?c+2fD69g$41Uw{>SMW*EGMUxQO}>Uhd63S0bR+M_tL#Z%&YmCva}n#(=u=T1ORndz|Kza1qZm1NB4>b z6d64{LjEihyTuGQwEVRt(%~)KLZ2Am%?#eUR-9C5j;tuyGV2xt23F%45CCjkDUeE3+C z$idF{PFeO35#G_e5J!Uog98#7R92#b>rA!3gx?)&k$PeHhw)GX9j08x)@cbtGb`+h zH0Qz5k=;_Q=Msg^BH!jcl-g63^H;q)2$Qc%p1?-Bf$-b{C_JRU84t-7NHEnRX0p(Q---TIfojX(p0UC#BB!J~ktHz&4*dH| zl(J(FbH_Pr`&2brvuk4J@>c&JNpHP}v6Fs{*|61H(lYNm?NYyXA|5@sQxgKk($L0j zAx;53Yxmg7nF>(ih>(?;)|4M=YTySf%<}`kIchyf%$W|8*Wt0gB%pl#tZkiy=AG#_ zv_$%>c&il6(+n5Dk&4Jo;$)?&06$;lKLs>z@?AX3Hjx)GY8+jItS+YP6+Gzl;W*5Z zcoyf*T{K#!_BR=|jdCzH95+eJ{CYLD;Lcl2PF4Cj1ttqRfvQmbiD=+AP$^Yu-+G?g z42oe#+)l^Hb@^AJ76&7xg`~6=fpZH!^RARk1jJ9c4wbHsQcyF{xdvm>i(BkvAw||sy zt^8F~;r;ZBzW{NHxo@^vg>w33-Kqd|ua>K}P6DeWW=wd3zhj^Qd1;_p_F4V9)%$Ts zYF#D#p|x6B9JF#p7~>fxgj~FjD&qASAk`4GdTLPOZQ7A$v%6KIAquMs z_A#S;ci{%PFw9d>zkBiI``@6-^x1wf!yf(Z*%NXFNOCA-<@bx-<@dxQ3PMj z#KO$nN!h^A+T_0{lGI*(QI?T%lbzKK>-`6Df8zq@3#<6kxfPfZM z6(@I^Hl5d~f+u!NX6Hz(1(DfYvAP0F^tQzw6^UIm|CQqVEWVtW7ai^J7`}VEzjYP6 zzVtfgx{f~L$$r0nCjjYnc~OJB^5Y7$$JoFNu-YL9<%8QBm(?=syZIfq3Kede@e(U4XSy9evX&RxH) zfH3af zrC(G=9=bPircm~=JU!kK+|2ajI>H`&3S3_^=s8a>qc2zFC7|lp=vzY7ud%m?s@l=FjH=qPw~#8k(YKT;yD?6&B@O^@P)`_Q zsPK<3s{ZYrYt(bDh)2BObi%Y^dM3~YRMQasl>Q0C3B@$501ap+A$lnTQ%FI{Ijm3O&xE|X@wtzweLYu)pow=xCTcaZ@Wn z5o7$mYGQ}TL)QRGVXj5vW|5IG>$4(<6&yt|3`!M(>(V6B4#2C12p?^S_gJNI;d&rC zqb#Z!GV{J)n}pi}*9+_+l=t_cTyQ_b^!^2U@`&v19p0ToS!I=i+ax1{7%Dr z4b}alW;bw?(YPy4w~S-cq**T?98ia^QM#|q*k5qW`lW>BaM0psUegg ztvXatu9l!!g&g%+x@LC+L$Nl))U_eo8dd8E^5!Wzm-FDE5-dVF>n@#(#l?tZcf-`x zp)2(?^>k{NHl2$a%OO)YL$#Hm=3iB?jN0`W-yfE%TBndd8FsAH1cy&L46&{ZiB_U< z4Wo3-(KWjon9vWSb^M`o(Q7h9%UM};sSkufsk9%esgLaH)~x@H*&>?&AIT-WK|60B zzK<)F6dx*iK*$a$whDy~u{g&OCFdb!EdUsP-cdxLZ_Z$Bj%Q@8A0!imXU#t_QR`esa0GBw z)BlC z@SRb`qq4y0`V-HoFNTkP2-i5x#CAxM49FN45+`Un zTbR6r2jM+rR0;z&gjqR=WR$bTQ*y-{0=MjwM={yr(Zxs_&gQW9$sLjdedbh%pxNRl zW5h=)WrcUi0Yd`5hPUA~>ybV9u^PuNpbha+T-X7ewX$b7ydi{8shqA z;E$g75J3OkedhMvefA%Pxc=qe#{b^vnbd@F!&yw`U2Z1P${CEG^$m@J6_?f(BC^N$kYuD#m2Y~j_Jv?X4Iov5+xgdZ1vF&s)-zl z1!|fBEY`H2ACT$J#!HE9;S=DDIAhj=6mDz?lUzXn4upYrFfTXGja|Nw646h%_ zjTmiuwei^~d-V-?C3!=1)ObHOO;x;q8`ak0VJv-IR(>3xBHn{&;TMIjE0^mM^CF|Z zEO?4!s-qS0C*xu}RZBY-YKJBc6;Dk`btU&D%T%>9Z4NCw<#cStIfk;<- z7W;b0uv*s`Egm~Q&2=Qiv!~FZx4*1!>jvJrHE}7~fzV33ij`W+JIJP|QRh22uDP9=*&u-k zr0Vp~X$<(GPE5>sCaF}y!1Ij#eD%DMZS*j3M57M2z02E?kN7|G6u9@pz`KY6lZV*| zDW1uZhtaqC@}Mm5L_T(~t8CcO1IC9F%{VcY9N6p!2(ApH&A*1QOwXV_I^s{s-VXv6 z63(0siuK^mgi3qf<4{Rs3sm(X0e&X?^XN@KWEc=N;{FRA78cJJSC#a zr*We8DKz%{<*l>HL+-phi48vO=Q$95(}pEBg9e|P*@wfnjBf&l=8rZM=MM;Nazg&# zkNYfvS;^T2V-~Xm6*u%o}<&`+<3bzL;{6itINxI%JCLkPz?Jm-2pA__Ork z;pih2WQNBn(TpXRX?5Q##ZqSWDW`2#z{Mmc%QW5zyt~mYB)A8~(-{IPmd#V+K0_7r7h-&NkBUk=!9zdBxn~{ok9tA~8zlw%c^C-V5`=P$`>OHcZ&U z2HS*plxR2P$Sr=HBpJ4e;UQ4iX{1BHy?45rUb>Z^0Y<2 zN|CX^==-QNS^)a-#UdZOmFEXFv$US(sWtLp35nk9SOZAmZ$KDpCG7n>VGeXiu8G`JM>~YKOz!9sU4uKR4|GVcsoa-GJ4ClQUh+W^`psyn zR19sZvJJar>vc=%L5xKyCVr$NK{N522KB?nVdei%w|t5F%yuQ9y7`Y3UfMy$#&C%p zvnHSz$;YyY9I@fn`#4FO6E721#8z!#I%Ev-UAWL&l+;^Ej!Zo1)h5X6Wsk^fr2^=K zXsWafJ#X=0>b#L3=8`{=H)1991(t~W@SMOjII_%|dA|WW(WlODU)Hb_#4COm~^rg;W|eTu7c6Trko* zNS}V+T^WRuK0yr{JSSio=MD}n{D|u7|E*iXESwPO*EF)Nl+N9XlkI-XZFleH<@wqD zxmY;zhV~}M6`f+K9f4?Wo1uw2GIW0b>KVUG1BCw&(mtN~baB7mFG`&b_Np4{`Th#6 zp(mGWO*qH@D8a(;;QFUSnum7wq0x1MR$KqIOQVpOn5oE>Pm-KZw>XNi)PP}uSq4@r zuq;;Er8IHowK-_R;kNrlP(iWSa%4YRxbu@+5Rg#Oe2raO%FqaiRWjW07h;!1 z_DB}s#(jPfg3P7H`1QaL**(KqoP}>{G-O{H&-j4w{X00H znb^LOUHl(ccp-8>o$s!K1v=j)9`4If0^etjX7*?b7W~7->Uj}3@K8q|l8{Fy1fI$Q z)RTXzl7^}9K?+eKQHcQ>Wyr^{=`iW_8?9zBKad zjQJMg4tfd-wWk(}-+BA@m$4&ytL@G^{aTLq>olmd6cJPTbWHxr4W14+n17gF9=@JG z{p2_&toaRR6@$dt^gQ`8l9R+=<@Xf_)Y>v zkD^zQ2Yi@E8cYq@-LBr^^JQgcwIQ8TWjDojiIp z#e58ZEb2l+2++`E94nJ_K}ifK)&!6eHF{?O zD&}U&<_Q60eQGJ{dkLx_98%xB8rH;# zF#_E3P91odO{bZV0qmr6H$lO;Ea-Rns4vGQBnN5vaR{Zt9tMJf2a~h%qY0=l7^Nf! zt@((al0~UxGzYEqamAE3+t~?mC?SHll<`wCZkE~f=l~k9FHa?8hdKGtyCm^iY4uSF zqwhs>XIf5Tlv0S0T8XHOb+_F4kGi-!^v4h-6o(DPK}eE#Dml$TV|`o%>Pw{(@*VRP zkJq*-tCwj1I^75Ww93+TLaI0VGUhwWws}P{Dbb5Q)srk z1@++2=8D|KeU&XZ{ikdG(N8?v?*y^K={lgxnr|xc`|DA zO08YRfF8Sz=&Nft#b#lh0oHUREf!ZBd>jHMF$pjSJpb|xzT-9kY}fP>(Z`oeqhFpY zxdN+VK;`?BFvyN5fV-;&DyRU=Jr=hwOb^HcHlJi4%g0h+h`c ztPrG9j=NHevmMea>Qp9c91;opFp^h&!Ue6GB{N1l0N|+HS19`(?R6&bfgycF#?kc4 z+&xnU=+MiB?vyZ8CU9pRAX%cz%|#MPR0CT{Cn%Slk*HM4N1`qe`Bz9Tw<^>%vocfL@9uf;%8t?~ueg+mBXpfJlUAp*O8hrU0F??0eP!ws+%EI`kp40=Epx zmJNePI@7mN?2ex6z2cCTpmgU$^>Ktym-E8@O^&D zFF~^)6EVYi*q98|=~R-}^v5Y<)=}9n&AU&TEd+uaF$`8Ap?nRA>F!Y z&yX%#^Iys8IAFkzv6Pa#F0&udQ5`HnI=n)j;XhtLM8&q-sX;HoZHQ>o68AC8Vr@?8|plWzMMvCh?YK&W(pqezWUy)6t1@ z)a?gru%kRxQdbd#ZOsn{_;{fkDw{>k=j4wJn?<@T(w3fUMfiB+<;zaxmoud<+NoMbk>*Kb3cVms;{jSq*WB8-8-ggTN(wgGN3#P3u{AR5-$y0EXBOnNVL}lr}Z? zo6%d6L$f& z3jut_B@@kHv0Hq|BZtt7x#c9ig`e6j!Yalje}zTvQ;FJcj9xs`nb*l>2l$!~ePL{` zM~D0MA#eCwMmFOUnP7QcLnUk{IGBOBHt|x55;KkVswcCYlC+w&hsLG08vjhuzqD{5 z&p4xlk>tJ8EN}u)>Yi!X@i;o2Iix#noYLIa59)53SL44^Yy)K5=D$}CxT@hZy(%XS z#`k4A222m9VrCT(`n2D_wib*o%Cy5s4O7+eO{nG zqNXul|H6IY`t+^q?eX|=xOE{jwG)uf;~@Iw8rH58_FD44{R`l3@x2d|02M9g`yDaN z{RZ6sqln?Z?8E#I5yRB?{{rrMQmu8*spP|h4I|{M2q`N4rhoh)rpyPT$ydK5)=7|3 z-@I^m@;~%FLs-ly%=()7+TyFY+?YfrBtaX@N?cuSbLDkC+DgZHdC%qh0;LbP!O}R` zdx4H*L>`5yM-@ZpPLV)0##To+6bVxy#D}?!Mzj({4OYiU>_Iam{;<12dLmcw!Wf#T z$YF3Yg;_nk_~Svz#?{l^{**+hRCiHf+3BUrvY<2VmY;rBqr01;=|qhqIF?~j*^e=D zEzP^@;k>T1%nFyo)L4;d5GH+Eay3Q&Py#*Oq$9)PES0_P_?q=yqJB9s3LeNT_toem z!1fxUwtmnYtN&7@pUh$;)Zl!Jk4fsPcumLj3_?tS*FVu`+jI>#W4=6fi6cNl#@(DK0O zLdZ3_LnCmx_4KF_V72NAJ8vd{a$m5!*f=NUn`gX1V-ugv`jbV_bIH{SB<3KSyRo9- zxV5vSW@d#>Z+jgnJ=B$Dpztlsz5P@+Dpi}a{jS-jN&UhcvIW@c{sP34HTf?^=Blsp zegJAj&1JFwkIBLj0dEU{tIkwSr={j#%3B zof7*y|MnTo@n}x)jn^ENJ!|UCeCdcRin?mWt^%Bk7ZOf3rA#wztsJ<_D~;|Ez==#U zt>{R3g?5;fX~9oZ>3}rDyK}=0^S0;c=H5@D*W$Mv;${SlCyf*K5%t>aDP>n|%KP)u{dfNB9ZpvuR9^=YRm_!|wfk z+&;A16>p<(gxEJEm@78qZG7*UB($9hEW^2q3B@Nn-Ng1-B&IIUUyL8Tm zH+UldE*0mHWSbvC2bs@CAkZYZt+``=N- zHuF=;Zv~0LxclvqHFo}??xZAmo%jc7$A!P?X&`ndy*~2iKR%hdxR|)!;&MHjx@hv% zagPq`e;_B|*(*ilIV*I1D-XecOcab=EPSH#@yZ%Pp~*46wMD-+xYb2B)98#Hde`6{ z+5@5C9o-Y6;hpF#)$j@$68n5$cx#Q#*>#}iE0V;FeGbnuQ@7RA|!_4&~CDyk4KJrCp?$fE(lj&RE}_@ zgyM13%4(2jB14ls6NRElHZ~2IP0W<&PZz3pGUYVR;$^W3I=UaOG7ULOO!VMHotDYj zkxWhh(d@eYbyJp;l`|H;yBWfo%>#PfG&UBM115H=RK^?6>WJNFG?jrjsce33zcoRs z^cHT+3N-_wDJpf!!831>ahjDPRU*@?Ikdw>SiOLWJ%Iym1>T=IdZGzWH@HbwNR?}g z&^lGemgyxdCr7D_vf{r|%W_9)^U=s3h2uF~%FiG6hlj?|I&l(kA;?-H@#+_}a8dZkJq_Ik5$+aLQpQpA|(?P0A}4 zYoLQiqDEpdwoM+eCa(W9bkZ(1q6yI$)X*-tu6W>~DsxIl_kM_wR6D5<6syqbpz_Yu zHSx`VW_bfz_9>goq`W93D1R{Wc}DTjDgJ&LP+ps!V;|ka{*)}n zKO0JM(qd2Bf$9c#tB#QDDcLT2(0a?3>?!q0{_5R}eFzae*Fl7~>Fx_?jd|Pq^Hlnv zY<3&5=Tf(SG{?@HlQxUe5MK;4L3g}0nm&brbMed1OCD2Vny|+M#M|4u^AKBxH2@(3 zvT}yJTHAlB@>NEd+B0~QZj0qtn`!yZ5HvYG4A9tDMZy%;E_{%%w z#eNyO0k*ax+}}`sRyeh(HVjy%w?&WXLxpqWY>=#dT#T647gzl>g8+A?BuP`0d?cnw z6vPM|s&B$xb6P}Zs*;f|#8fskgiQ8S+)4E)dt8fWiR%&ZssA!bJIysEw@kM3ISx~P z;yAu{4Cm1mBIT|O!FKR>_@Ee=Wi~j#QqrvOd`?NJ)$sOk4rIQ-38GtC@a1h)NZ0H5 zXV=brWw2`{#q;QEv?@vm0*WfRTcK#OQj1Vsd-3J|EB zU=t&Z`QuDahl)33N**m>aCsAo$WpHgSo!N^{<@&u1k zXSTPnuDzb+{U=5N1)A5SA_8kyskYZbW7lT^U=>Tv#KfddkANB#PDztH-H;rkXmmX*$J*$sbl`eE!*=MU%&iq{Wr>EHOXS zQdx- zNSK=z`JRDalN^gu>MgCSFl?&G#yrBu!()20aE7)hg= z4M$|a{jjZo9iyhTCY2FkUnnrVz`vT>rnc?5V{$dE5H*Wvr| zsP>c){UKJ@%2M~G)6x}L!n{*+2R29lFJc{JAgkan#yT_eIREeH`Uv{^u*>8XGA?v7 zPKCdktlz}CQh0@=CfnJZLiebB$_#SJj+A--fo%2-&esj&n&1*P@Tjc*9o3 zW)8)#U2%yv#bz$WuT$|p*XknSnb=f^fw|5d>9%u0u%qqfaN9V{8o048hI43ZS5T@y zaDE}w_L)p|N8r6l)b<@rbx$6>!|(B$bBuTwO`A(FsAbwknbw39TMN{56VB|#1Sv;d zG*cP{t=B4R4Bz8IMfzS7Mrci{yJ$m1mlq>#?|_*H0! z&3S4`>#5osvHOwc7#FM2CP@9F8$vj{qv(xI1AW;q)~lg%$)5ESF?%S*2u%iFIjB4q zBdxGC$XVw{V2{k%NQc0~NH+YQFkhYw_Zl~jm`xyuY7(FSMy^MD&c?@sf48}!{%3_^ zEYfziX38cGHs7tT-ypE#e@h}(t47+Pnjq%ZcAY=gh>cgyC`ulB+xRC!qn(1RpC{{f z@m^#nhql^YH=7vPU2kks^9(-2pdzAzMo1bO8Wu1FfMX*^F$`lGMlpQxoK0*UwO(C5 zd5=v_`E0ZGyiR&;PqZNX?fQ%I zB%`s`nfZlIwydO)f`9}}WKoErw6*@cB9$bO>TH4JUtR$O$De?-2Uk<(d?p@FDhk@i z0a#ohX0d4l1@yQ1a3q27J7VORDp+!(PUZ<}qAr|3_{-KZB71Z{e>Rfw0OU9~6*T)! zqdw~v%p}ZKBMFWDc({Hw%{kMZhsThx&dAsiGy#$6s#JmBQF8g{hVtjO@1S!LnFUVc4vU7Z3>AlqSvb#va;M?m-scm9 z+XPhMRpLakK)oKN;zH1j0??C!f__?UdPz%BVS!gi@{@^kWbcsR9?{o;mX=Vs>3Nd} zo}Ko|MYgd{7iTE25bj=&wEZT`kWg5d`mHOuKWkqsqOm?=;pR~CE|KpFjxVu4_#(V? zt_eHnVU`J-R2XlL!G?PV4R4PMyS)563SM%lOrVjIhX>v zlwu?p$|+fLm|X&ImxN@Vo}3?8D6gWCYOpOH7DI{}8c7V&R(WsaL0AMc33=_xG{Qkg zJB~SrSP$wUx!*C&)1+#PGjO>^pM9+l4jy!7H{n@L{cgsxOwtxu zRSo6uVGI%R9UHPgtM~z_^WDJ?L!NBNoXEH*!yz_0^KXYCx*p|FT27v!wW-*LRI3$2 zsbjCS?a--HPVX)W0zQS+DVLe#uiwU`*;%@kNr!0|JQpRvGSe#iNHQ*|8xlk8!9R`Y z2K!11M+C3~2#S6gYR1B}?)%HhdHrJ22K0EjBcu^)x4Gj-xR#L z5di;!i8?=rtB<96fDcM!^NabsLA}~sWCkmUZpchTXmd(ZthfPCG-m?j3-xE!1g{%H zyOA40FFvq#CLQB^jo0a5rm0lk@odd!LDDJOyfqK(5slezoAKu4I8TxlcsrjQxSZK5 zmsnYl_@Y8~I5V4Nl)VfIGo=GoY6Q9iJ!}?S{mh6rrm=A7hrtS_10&E%>2z#%K*^!vC5o7@BGzN&M0X1UqE$x^W5?mz68t;v+U^!_c2=^QkAeFqF?AI_0}*wh_XmpO{C@-5k1R~w|2yQB% z&vJfcj&x~_b&YlDyG5;fO*N5oPqSl1q+@0Bs>$-xK-=Yn=y9Rzu&&<&J--ON5kv)`e-RD*UIhW|x0y&rP7B>7Fr^gMSPJ96lHU}G~jO%EqRFJu;SOH?Qt5E>@1tEl;hV-CfXxk55Lnz9i`*Pwp*2xb=PaBckZ1symAY=(h7iCfLDf0-#$}vti+%a}kK){J;;NNmz#x*XYdAP3`LdB`Vk?*DY&H); zi}`e<$Y;vnu3#Utnob$q^oR-tkOOO&2d@K`(xQhaXUIa-STxsBmG%7Mr%=Km=EHOx zM4?G($QH_r_R=w6{Zs+82ayPB?j0H4JXc34*}MgpR(2be zFvn9Vs`zuLV`}=w>>Gnb7f=386TbHgv z3sr@_8G;TOA|uvTIQZua*h*J7Gcj0KLavIu$QZ7S3|J`a?uRL_v#JZ6-<@BJ4T@QK z(J!~7p$Gc(QQ4d$RWnsS{z}*8nP_o3Qa-xwh>nA}cG6D-mZ_ock|O~D0!%rZ%h5fI z$!rdvcXbyCgQ8fC>}y{Taq2YmE5~VBA8X0-?2LcHCu|2C3WECb94zr*-|(*fredMM z(+ndt=+45+x{x_W01Y#Xk?OU6?SGli}0^jl1E0ayO zmQrb;iGa?05ebWMhtP8?*I^6HRA*lsZ&M0ed<`rp>l^oz545$GLu)`a*qZVk6inJ2S>%k73%U9LjGgVz0P(sHMEdNX zY3Z7b)B@NIkjT^~mdjL`dFXDt8ewBtrx<$UXma(5G|BzaH5u}@82a=ASbT_`<5qOr z(pWvBMp)>|aQ(Z&HB9DkFz<`TbOH_L@{y`_>&RLo8@n29V|GVLgnwh678FKZKQn==V-&enJ@eTIMB9Y9-V;T#!PxqP|p*?%vQ(1h=*-6)@JY^{X zdfGU7`eIBlNQ-SnE>vDA89Yi(E)7dPT!(dZbLYU$)=tO)P~_CggBI~#-MvDUhEUN# zbc9XG-cT+B&3C3wY%Z3I2bbHP{)0)*6Tm%X=gZX>-_YP`%B`?al9~EvGC;= z7YgfAghr|z7efpUdsdO2MBNR29X?m)%`iBg53V0;`uQ*&wlSA)UtljFS~LY|%;MK5 zE)!-d%rIQ5*C<5zh^KC%zAHAq_Pgfu+p(nR7?A!1sPQIv1+f-&2cGZJ3@4=QPD;zL z{%4pOkx@N!#EUu9o$oRl0p3VF(0f~HydWnXC@dgAi1%2CTMrs&-92iRc9UVjJ-SVz z#apynqoudUPFS|5kO-DxoRU*OtD%)Uy~Y!)iEzjsLpLzV4--VyHWUE>`kW@rAqPr$ z4Y|*c{l36<`DO$pfqs3qKmrj=MV}%Tns$>g+`3K(DZ@xT>B&_3ds2wUP5PRe{5b`s zyAg%XoH*cz7a|Umt9E2q%LCiy^qYO(l^bmzwNj^GMxm1SSehx|fCvwz!sd;2QK$!! zC1!U{iOf#7fT@R1B|EzIG1%O6_xQoYUx&Fm5PyU341gkrg=H z90DsegSjB3lOD1hGR9>98CWykTU36AbRhJIiE?QqVfN9JdhTpc4J&8*_xiB;*z63O zJHX3Cg1aEI5j=BDd~R*M`XF{}48vSFUe@87eO=dP%uk=X!l*X9n2w~&1oJmm7u^jjSEohF8{qC-U**E2 zFuWi*D*~h2I?_!JIPuOoNdv1{KcbtE8j$vBqSyzqwT13*jGxUr@%gu7xrQwp`SJ^S zJ9=d^e4*`QpQM9OCL!KYhnJn7TE~Vd9RH+k)v%9y5??L2+#|rHYVe+LUrhsE{0s|2 zV!0b*Ps{TT>e)7Df)@;xGY)C2rz#}PqVX6TH$2+4%o-hSH|4&<-s7}XHY@zXTyW@Q zka-#orzW_1>@q4!5Poq`6#BO-?jN=~FAeJz8hZ+oMVjt5+th_73&#ybYb{io;`Y&= zPnX+*6?rSg1=s;#jYCc%pv12gXX)4$aZTyqY zdtxUZ2X?Uy(+Fjg2xr`F21O2|JaRN>WRCcWP?>Qf8H(n=JaAIsPT>RVfkyJgnlyAm zIbvY0k^F|Hi{iP((%^W1>rfhf7w0=_Ep-b6opj)0d9AFs)miH1mpeACV!BapSswi9 z-})I)>j&q*%i*Y3Nk?%&qtdaJ`OKsn^QcxclwIXS9$E^W;3>vhad12~mpj5LV_g(X zwxMe{*bFi2i1vdbRYJh0OA*b0+OB|Ll>@+wM2kSpAUY!Af-3-_4u{YlvOBv@}uS zwxm?---~TW>;#>YEv9eeYYbvR3)3KjXjzdy%L19kKo3$no2@Bw)C5zTAr`bm&TBwf z-BzhpEH09R5}OeUn}b;0S1+)gY%-#BusY#M+i5K(Z(69^!>l?+6Lfscw_&my<-0YO z)vsIynJEjnn{(^>saW=7)+KSEaOqZTjTg}0LD7qjiK!_^(?#cZ7ET&3GR zy=yUGtghFcUw_qwW*oQ_sy&SveIR^}IpvFVqs+S_^zZ$Q2OZ(rI%)&DCo+e(X5?ud z+Ij4HYTZu%wC!qDz_ZD6Re{Q|NxybBV2c1?yN*z{gKJ-*f9Q7=B3g*)haIpC!5o&N z<(&nXS&b34fj}*X=_edmqh1$OX~yG@;)|>dKK_C}DR+nC9c_?8OI{f6#yWv_)$9BnJT89hn)Kba3#7zT~T-Xw`@K>)S+={SS@-A)WxOd^Cc_CNU5@ z8PPOZs_w;ImKh4Jh&GOgrrL)tdw1?{Mu)**7OVujlxmr%UfG_z*#I9AF4Qb27L=0O z$$J3_4#fC7J#3U~Ej~i9xRi<BfD z_zo}ehq)|A?PbJ55pj_UdoR&(XO|=+5 z9x`ldVq;Cwe3zjra4@YDgw8O&K)Rt+RJI6=g3AgX2D!?T1=bT?f^>DN>ImA+GzjwW zaa>MV4BhBVCR|?NrXwW7V^pUNhehRPR2YjnTyi<-Pn6D#2~BAiCX3$*Rlx&-7x$ARy-po9RDZK&k*nas9ItxO zDVMTV|E+Bp4#SA;$O|OC&00PZCN3;kuQyQ~b`-!~O#qnk~8w&j7oi$1KoGGSYc1oN1^L!@?0hNv>#0)1C-o>g?<`CW>;G)i@Df1}Cfz=5nEwv!(3 zZ#>q0v|)wEi@MV~|MI8<)|NkrZ+0CQJfhkk+|O26_2En!^<8R9zvA6%2^pO;$;N*a zd2D}cM3=O0R(UemW$F2=Nqv)y&k|l&N3SnhFq!U}8m79KsQLRP|Mlu$jDc~s)G#Pb zB4@Qo53^8jWi@TXlZguflmd#G@IunT0N7q&=K&_Bb*TF=P_T~hc$oX>0JQ+r`z)aP zVO)?NsZ)9uhh)!ioG;nZ{()|g9>_abM-=(QEdy|@5PTsn`T=Y%nHYQHsCi5QoW*8nVkR6|}ks2?F2`kwd`e@|RM9cd5Qj5AfpI~05jZ-o3rJax?zXUS7b zj`>_)GUTN(Hv<{GJ;MQ>k8 zv#lJt6=mQp;QWh^x7N%Vkx!+F>;Z1JXH>v1s-leK=mXJtS6#yrE-2tu(-n!fhWGl?S7eYj%2g|QcYt8S4>;ruz_6cP``e~=(HxJ;Fx9J3)gtx1LDeCZDu&2*@DEDW zKyT<&mm?}M}30do0$%+$b-n(SxTkFvkT zx(T15Q0u9|urjxA>0%_x(W8H4t>#cE~r?Bw30D z(2leb>wW!5d@GWg(wYm7SMHQIPNyT=S;1*Z8U4>Oose5n&tRuLm(+;we^A~z^PWH% zo<4hDiVReRzuTCM=LYFyWnKYgp> zd&8M>^6VDLNS}ZIEg^I*JX1SPfb6Xe`Rb+Ab1FO|C%+N;)`I>AsnB&Pyw?tZGzZSA zWkmjM0qiE};1Lv$R;i{(5HqVoe011jO)yL4*&b-mTit7kmBU7u^b-y0*Kp= zDC&~S5Msq>rkrv(;+A--*V?qMGbo%mJ!Cf7>^95z&-$ttmZrT?a9Rys1!jBicD%n` zZaZJ{JZ=Zt{T@&1K?baS7J&sl0wMYx2Yv{KNPY((A^!BGn~ZM{dzzn7qy5dVh#39m z5BYRo(WCy&ukg{|#DN1KT4)Varb=w^(TyQC2pIAhrF6PSe8FR*gu#Cf@2)ZM7(RvLajAxrDb-p1KQ5qfh z(lus{DTMqCx?xkD?gdYa+19c@WA)gA8e(JOST4VqJj+89@w2VR)=1F@eSk%XMx zj=H(k32E19wB_+fpVQ{~~~KWY}#@8-aBI zFtrG_#RqJ_UhAVp!D0#QuFiJtumU3t7~Y!KZu=2cdJAWLZv;ZJ4856_PaK|FLpQH@FLiu! z`{ESm*RcO^l1y8bj}!F%BXIlsHZu0PmJXMh|AK0Mu#L^{1%O*OAZP+UHd5p@HZYDOVuTOj8 zcgCpk3wQp^m#HLL>M3X=MgtB?sY^e~P~dWmBKMCt^B_XBOiXC;xv&jh;yE3c(8_v4 zThbs%d%Gs@kO>IZpjDPq+9B80-piTVi0>LD2Y)I@-VF-Z?B2q<$uqClvDJ^P zxsq@Sh?KYZ#PD_~kh`X%DOAQWY8lh8kWhd7J4Ge)5f}}=`h*0xetjdNisz~qO_}=0 z^hNU~NvDvhM7m}u_bU6cF*1_Sn0>nZePFS?{UIz_?+CbXY}Tk)1jQ%wYMgIOJhJWN zuy(t41zSb>)q0cf8U2P{^{6-ARW>zq61`iEd*o7S+To%;+wg0za-G`t944Q)>t|g0 zyIlf!ESaA92Vz^=eT1gG!*C&2Y>UJx>V<*6XFBiR3F*WkKixP5+%;m9F~k`JB;TbX z-Zd(g?ZMfr_=h+v0NaQ5Cg%&rNPk){^VINfm+UPnN2w6dZ`; zb)3GftZ(B{emkGk=t?sEVy&ULoJEo|%}9U=VD}D_Z<4Fnl8fvF84o1+xb(SJyXWcA z4}`)~x+e-l7aVBfJGk+3qb{LhQ8xvuG$LdJuN`DaYHzj&bc0XH~75F^z+RrI)K zj=579?yU0--e=%XYS$wSA3P@7wYc0M!Oxd4iQ`E&b4Q`gbI2c{78nv80#4hFU6Z?h$%a2D|U=!S4nY zr~r(+X9FMTK0xO)!LLZD-kn$YPfD%42rZci53wyH6;!WG0z-#N;Dkq;R&8f+0(JXZ zV|gYIQa&I?ZScqkP0(?JT&pp71{(RR8iIdh3U=ZxXP|BsseCkH3IE1@$pcc|9Qt=S zV}hUpPvcxR$j>Sc8Zaok&7}dVE8bU|2>1&_;Uv4@2PPLDy`6KUeKXYCtvRWe;=qGgq%ZT|U{@m}W6yEVn2TrJzI(V7I@MG-MCUk_8-Zql-LTE8ActEF|%IX*lf8+#tdC(qWTm2o&%Mf8E@lz_O`(ayo+EgZ>x z{|r}1aGOUQ0rSC5VzbPSh30F{pUaR{2}r@B7o1r;g?Ju~oJxkqs}Iu@9TN9{uZ;;9 zfBtOBT%16KE{h76iqyBXzv+zjU%tM4gbXG2?CE$Lk|gw&$yN=0uwiiv-Ktio6UII% zLmi+yj(K@eRiF8bQ;}r<)lR`lr@=4CXwP8z13`s6_pMzJi)|8cUmF>-kG#A!}4yi+!>0pdHIu*M_;KC zZIOlWkT=D`LrfL5z(D;QIt{No%F88ti4| z$pfdiGyh8wqWz3XIyog1XA4P0t&-|ln>=nCW#pPX za_eNrEAoc_SU2O}F>TLXoX-{37w2^5V_h61>SqfD*{$A9+McrT-j|Zg^4m)1W(xhi z7N1z#s(Bd0zotvnS0d2e+ves91$nKuF3Rl1%2is3!oRq6-ZAOV#nC)>!~C=m{ynxm z3Bh(DD>JOmW1i0EH<$WP1kFC2AR7ISU_38Vg82&tNP{0N;?MIGX#m7qd?D%fjk7je zLZvAx@qrN*7MViT6$~+hX(%7y1#R-@T`m%9N{8A&@u|w<2AO%wKG&jL*C*sMs@zm7 zLi>weY!a&QJh6A6=ojK0Uo}AJhsxc<-w);gV(p9^Gpl_Kd;Fxw~e$ZuT&?owy+ElS)N_wEw9KecB4mcrL=6dw zuq9{|PUA1MGzb z$ryt?F7Kc8DZ*2v_#=+gQ!lw|of#XI;sLB((nFXf;4EG=6_OrlczvFmq}W>UwBWKo zFc-uUX7)w!Z+oOFiSA1<1%b-(#&O=gOToQYkIFNVBi-oKocjiwaWKl4-T0PvVuqb@ zpvuha(2F{Flk7tcW|{iJ6BY#{OEMLEu@cS-lmB758a}uVnn{W5FL)?B zm~L(>QAGgileV_&3pYN5JRl~re7UbAlfDFde6oRFpn0!~mX#ujWnRlssXouPjYt^Fp(?tHX{dnS&!$$&TRjPXu(g+mA z?1XT}C>a`~+TSl0#;aL1r?$EyYVl zdOqn-TCE2zU2peR(x0|kdVLw4XHDhZK*8jcR_A&uQA@tkF8tyBsa<++Ik?f0SC@%( zDWeFH5nC&0r&H#N3G_x5t9~oexiqf2f1xq_d*OtV_pOT^EJ5~Xu{|bOpBt-s4o!7* zCOe21#hI{HX$iR-2?^xKdVo0)l!Syd+X!oDPk28%V!7q`f2y56P};H0+)#Eo5`6h$ zmmHlHEJsDsPU*Brlz)9Eo}|r3&!tM2Yx!~4O+eI51JFsx8Ii)Di{Krbfo>-u2-?8& zFbCG`0(EKwB`ARUj9|CT;bY{1e3mdY9pINKf%?q4so+h-Wsgt|WZj{Z4s5ec^Lv%~HZ!0yhp^#~1mWBQp7!b0up!|qDy z?52a=flANA?+RgOTgxdq@9C?wpdtoN4_A~)>m&A{PTn(A40az#vwfp!*jT!8Dx1Hp zvEb@jy|ep5JzH4JpQhLzr$5yYw&dP(-nai*^i-zsChSN}KN#o}jtUEQ++ors+}04q zJu-AOa7v_-ju|pSlP`8m$MW6&)4HWKvPCW0x+v5!2soQuE}Ph7s^GnV@i+%bQAF+o zvf&FAnfC==^^6kjTu`B#oXJB`vj58^+BtKCX4X4y$HoTO7LQ&#;>g0`zg1S+xOM6l zE!{ZEqo4^?YJVB_*?($*Yg7JegFhAKrz^8-OqqRyu`FTij^E{2pa<}}D#rm57Uzba z&`Oz|ECWsErSt5c|ZWbcT$Bd)lkSIpOFL84ipBgFS^{}jNiJG50Yc^C!j$4<8Q9Cv=R z#~r`-_uI={KhQpv4{E5#{*HP^cqrA=us7LV`w&A1o>(W!C~)X8C`zhnqA2M^l4BB{ zRNgU7q`Y&iY2*kIbpjMha*5=DAX(#(!YAS1Eo4WMeR0D~Aq!_3PXTWJ>Js_*IsJ@G z3no4@?Y9u8f7-i}blqb~G$>PEY1xr6$+^Yi%9iG73UK&>?n-NTYll{etSVty?cvyL z@#n%G;@Gyaa(XK1DVqYa3xMp5>F`%uPr*7$E!76mWB#*DV3FD zIo20Xdv_^0)m^cH8lX%GOTvye+lqGCCg1DP<=uO8kwVqxFcPD#Onwe4J=h^8$ySpB zMdr;I?Z`6}*dc7K5w&c=ee0%bb8KHdPa)Pc)_fVf#TC59(lY{!I&M6%2lTs zt1!XIxX`i8W;^P1aSxsI_ikavps;Y8tZ`NJxf;=5GP`Z=6sxko46t|g8}aoeWslZb z^7W_}(L&PIhDWjJ>lkuKMWTia=4N)%gX+8DZ4IgId{D&0gVPq_+U3?3ExE;5 z^=V6&y7&}%0Xc0JV0BZDpz0*|iEx}ol3~90%oE7i&jb3{DEB{Ebo(mU0;HXCf4CYQ?7j!f|=kGQbMC%ELtoLI!M!;rD%2eMgw;9szEHqTWL>b!5g zM?!T>D6nm-l;NEkHG2Y5)iFIC-V6`;9)>0kf1;H2CG{nZfGfW`A7~hj8rNf6 z9tT?BnE<=;(3rE#oAq7D4<&;!f9iw+=sWyiNJIg!XP~SY38Z&?@2q|FWvbXFnfck% zpCHw}CTnBspXCE!hn4=t67`a5LFE6`by6nX%#he(914Dgm? zb#GK)#a|pa&*BdFg=pb=!*h%t4}@pJ+f=XN-kIJ+ngd1=$nL|?`~axT^dXP5ArG(2 z@SasAFe&{jthOQjE3USzUW`)Yz_rF5IefU?01Ls$w%YIg@Sey4RfxNE6zejAwsUgQ z`ndNA$(AeMxsE$({(yV0J)g|_mg3HfqombPg}XyQ<&G6*dT@FkQemYxz|;g*E#q=kK93#A@J{ngnLA2qYwuje`ziq_1>XsK34%?%xW%&Z^Bu? zv=^?q&sp!T$^L~k>oow**Z)_BylxGhFb<)>kyvi1%&sp2#002>#~>fvuPgum6z2$VqiBprzX(%yIDR@VHxsI#%Hm=K+o0*96^=CY0C4*CBScGrJ!$ z>ZUqX>Eu&q$>see-`^kJ-&gQchJ_2z+J9`5Ba*Y^c59q;Q{=z6p5 z_e4&6O?M?u|C!!WJ_2PTCcF`4LQeQZOovbSgiMQ=5>PxUu@I6zI{kFw`GilYGEGbc zgie)Muvy|0Gf5t$SmKkpHMVT|el~Dp!Jke#|-QVkV`Q=X|>N-Mx zCQQfw{>%tJ0|4?sB_wF@(hl*U{KOIubCH=76Hs1z=K9;O7VQzZ1R;IA>-~o@x@fQN z9qyhz{?-YuDeA|r=$MMhw>c}G-CW?KNQ{b$#j(4`P?D$a_4rUiKF?}O9v1u%2ukQH zE&I{-7@j5WrOX`YsKni)oHB1)!=H}}V&d3d#tuPa6RX1@NMegCe>YUH#Z3}Zudb)V z-INHYqljLQv0ts~Q$QwHb{uOAHU5}-5-i2%Mir?T$Pvb;NGVqq35D@V1{O4CtOoMZ$wkk>qD7FP(`ZYM>F{&o`O3UZQ?HO73e zfiRKxVbA9K}x?bEde8cc4UNv{YWx)1T=FM#k%O(hr7IQ z7&@{s=SfO0jM2Z^t8NMi2=mk9qmxpb{%Dm+d=7F%6N4cBx_CnM6FLZ&D$vwuP~(Sz zlCs!P`&{C&1f3$zBvfM}$5KSo+NzL8jiMw-$m6Ae0zne%_$i5FL!vb4xRRvJWH0hG zUnE#a@k5plzpZBw0I%VS^7K(Vt!OqS(6!jJY8CXx;>u2=a>e;21bON(&r+DQRY(hu~ ze3Y06MCX6M_dYYQMbZ};DTkZTpbrv_#;u-JGNi{;gtk#&Q@5eWskj%4g}6OmD->al zBw~#Ter-z&fmtca69}i#h?zjCQ)7slLjcW9uz)L&QVY<8Iu=<<8O`heGsr>NynbqQ zDo))%iLs<)5O<6ETsOFeK@=QxW~43lP!BP)h6hXiI{_Lc=`ud3roN(c+CZd}T|1j# zr%aL-1$lwz^tVyDT^4e2W3;l`vgaPFO|y?T$yqc&ZhmSo^t<^Cqz6b4y#SX3>Ynwr z6KHE669g})8oVQI+K6Q>u`_QP-qfDV1vN8!0xw9aiccz)vhoj^T3*RyvZ`kije@cn zn+DK39tmk8bTT#(tE4yutEhR#G~z7D4 zLNADa$znd(IutJ8wHe62(8E8pANroAhaw=K;9D=?Cnz2~qX6M$-f%~_bnU?4$u`M; z;W~^TE3rnMbXHsN#1x^GXrTWf1ZW8hkqdzVvjc^NV|I3s8Uu=NCc366`L{)TG%bzT zR`XktT3V=82`>^9g7o0QY^JSqsiz$u%XG8sb_>*@QUfbT(0KIl*3y#5$9io7sw!Od7nD7 z7PqJ0MV`T8c#lVfZna;g;qVAyNi#G6@@x#Q9={dv@i=v+S8IO*dSRt$tAA<@h}e7(ovi`U4t!2Gma z!*HG`t=C9hiH|hBf19o0dRq+$W8zeSGk~*kUS56AJu6zm;3SC#O%R=cK2n+awjfZ3 zK$*rCH1Y-;TV zZgHLQ%R2rsf6m#Hx;XOk3r^^;q+jXk4MUIfbTJ%PdBHWo{taT#jyPU+VDs?6gcs_7 z|MgrE2f}W|DEO=L$oCf**aJ$_qNA48bzWr#`;aAY`EJusD%V%`ztaz;iKZHD$@u{c)=mi42 z`bNT|qZk>G@-rA8u)^Tjr2xoA3_We{X{Lq~3 zaCD=v`GHFhhtmVt0P3lM%x)i6?!@>7iiLwMrt4nx+;05G_I4vbSI8WA4`XF#%$m^d zLh#)|9#r*}zq2iej-px?I?Om?t*Y`vNwKLznoZ4%KxxuiR!A}k>Pd|w&5KBBIW=rC zr7WvwoL0WiCU%GFH3PuqLgQc;_h@vit|Bw-x8punz{43D=l1G`>swJBERu$B%8mM` z2xFeo=xWEfT=YiAaLunsZPFLDX{>9BlC`?l&CSzU_=D!%f6ei!#1*QwngGuf);Gh) z3+c&)RXYH*ak64UQ9e4;2@x8H@qHijOISZaU=at ztk*yPe8&ouz>ltBgCGQ=trsrUSeA|Kj%Ot2a3oWCtlH%_qdb-$c~%P1dqqt%eIo6c zLFOj%6V4p11ROLq+;Em7ucT*=p!*Gm+l}+>E|&o>fJ-?%pNWA@|tCcG_D@=M03>kHxp-Z7tk5n}yz>@2L2G&RAfJ>J zuhcA*+{dihOyth!>gi~KAs<10!Ds(4iAUgzOemV?QnAAd#j~kskkd>U%o}mpZCjC} z8M2hBogp}7eqMs=*ec%ptC)cY=FB;-xZ%AaBaq#b&~>{qjDa!8re()dvb<(&Q}lpe z#W9aRch9G>kh`9JVv$RngdXFRvt#2vn)gy=MmYi zBRufLNJStNi?>5@0C+edi*4J%eWDwN>!`UDr|6R|TNb@^TG_ReS{}35(@0c)EuGFf zL!&$s%e&<*1;enyw!0B8wE0O3cgQlPGr^>AEwgp|6Pz&Vf7&5@C7^3I$cr~dDy}4Y z4hjmggWzu?E-rrI6DT`858AowwaB#mf1eu{*@nNiQaULp`=?lF-A;{I%`dR(SqwPM zIM9vs%UL-sr)d;=P2fDRg8R&2^eh6@FXn0Ry?U`z2#4jy3+gk38L2>e2jMR9hJAk* zF#arQKzfzJ?U&=nyf~lx1mxW#ocoD^iUowuSK9U8Y4`8B`}p16GlN#;UVR-Wm>u^^Z?I~fHdyBU;M6~^uQ%D2BAXl5j&b6N?T`sPQZ?&F ze{BJs4YPD0%?3u_e_F2kR)Zt@VeEjXxa`bOIgBfibnOP4Kr~?Gdq4Q|JKqhse#_gg z1g+f#-V^?xvc>FYmbl_oh}`W*>T*T`0uuReAUoNALK@7R&FoG7AJfDdHae&hXnx_k z(A5B|7HQq? z6>Vp>ZNwvB+KYUMtQKcEkF%LBnXI1=XAb?K9WjKcuUJz%uVDEUj(8q`j;&aeS305L zUNB~XvjYJ{T0Wn_;IZu$f^(`r<;R61BAM8T045TDa6x^8=mR4-b2#+C-A~&ubw7J6 zGcTHUwthzmL!VXm$*MQYTH7kzyf?+>W%yz$JGTXT2G+!O*KR6@IDKrL1o8_>nRM`K zQwy*n)G)J-WRUuD^R*WE{{j`y*mtp9rAo4}_Rt~CCbHb{+Gsk@R@X>dNa?U!o&2t; zwK;7%#rnjj3)_JdPYtjE0+AkUDoJK-wN_hvZ}r{u;$V_2&}paFAk~55+gP*=l(a4z zC>w7vUPx5i)R=|}aka~>2>Ru3T~=xy==YUKoAsE0wrZygp9#_VZ#u}LQ(TMzS1lOf zzevSVuBEJIT5Z*xVRng@`SI_XE0@uiITl&h*iAILspe9KH0;}rs0it$*_>u#+P5ub z-EGa(_g{TZ8z$r`v@Sl+@GLVxA!r7iPv{;lxz5BXI20E7>ldB)2v-j4HCg9M2%#$S8c_a zp+ycdX&D4gKv1_KUffl3&VPd@`(V=Hn8_TOBE4E^_`7y#oZU{B!F)qXwz(h)h0eDZ&jv5* zxZ*2#NEtVvbDpW`bvNY_pmt%iAy(0Mu^F_1)>K||f@C7h@n%|ijMM$Dy5Z*8V~rHc z&*I>+n!64334El3kO_=^z*i9JsuyImdUjRe|@^kzKPxNT7&andRdn(QLNb6c~mkDDrH}`X7NhJ zudM&lq?_9DE^8hWI=k39DJpWY?qXQ06e9;s&&X0!KhszvTcN04x}unJQS~S}U4&-& z@Q{QEe%j-%+1UF&*)77KkE zg~~-FZyeAUzf$6a;{YPyhT(vWVS)gj(T+r^T0qH9)Fu4yA0v`I#I=NQ&L3a}(vc#! z0RoyjG+<`-n3lQHAyWFVU9xkoncj=Q#|cN4q!Tvx7S@BpLz$+ z-{rFl;zs#A3aTUJ3`ppIsX0g?Qhmo^LGBDcFi))!5d3C6z%rA*O6?U>G)58}Vw8^{ z#zNj$px79}vJNaF*skK(&ci_U2GeB=c%>Joqs#M2yFxXa`!)**>#zEw9|p?h-XHR_ zpCok7`_IP1cT1nrD~*H7s&9b0vw_E-A#zGCaO&D2WZ6LD?%=sjy6JE`Y?BUWJ#!2P z66q(G&CAVjn)sFGetfFG-wJVtV+T6Gv$UkKiJ4Bw5nKl)VA%`w?0%{IB*Onu^#>tb zjy+4w7De~5G5=)p#ky`DKJBBgS~t(GZ*Aq4^O-deV;ir*_qwA!SNVqS#TeM&I1kqs znrjv7UjgyGoQJ2$>mL>ZL%vfg^0_yrln+>z!d`_lhl(IOT{ojjV#BD$DfBw~p4Kjg8VSs=*34wrq z=sZ9U&K8We9@ZANjP7o>Hb(Z0?pCH|4vZ?Urt1H7BW7>nU}`4G!ttMf_5U4~2N^9v)tEmuk~)z!)CA6SIcJQ>$}+{yZ4A;eY@OqdU|%&=llEZ+v4kc zV_Y9_jtq2#2DryyG+@h&)gB0AI7}eA5$&L1Ke2{0jJw5zccw_7a zzc^p{>h|PEBRV=EV!k*(2r&qZ93#3o5n>WP92UQ3K)yV7o9Hha<>-ue{&h41-Sc`#$>I~>&Df6W5%aPhK~RG?852`i)wW~NVFR9PlOxY^j;DEbARxRbRh zyv6fcSyNhTrK2h2sX^7zUfyq09mKtSeck73B`EV{rL~M`i)MXV z%%A3K*UXRNl7p}|QD-is?)L#lI;N~R{N5?yn*HT(S#s zQABK!$k-MFJ4dF@YMkeWkX=qjt4-Hp0uU*DM$1bj%m{cSKedVZ|iUJ3= z_|WpSLH9Izc)R&G(BTFz~;iJGgmZsQx zcLo^ipV3=~NVXR=ORPRhc$duCFtDU?ksH&4Oy^vCI%1Ux5|P}eU0KlRehYXX!+3r% z(!=kfycSdZ$-27Qgk>~wXbmHYhqY;li zmJP);d0A9t5oV^Z8#RWu*5x~*q5x?sv3+XA2z=0X;;(^U2+PIiX#G9tZYP?9-eo~$ znfIoyWq+3cCxW9$tmrf&sGz>pl1NVs?fN+vCu{33fP|X@Ln$VEQdw3}QLq;b{KKd4 zJ03-)%mtU_M32RV(*mTK*NkEbna2}-O!e6XIi1C(G%>r}9DDX@Wcd7;L+P23hF(dY z@rd4VWk$E&6PgpoYO6sL=&nL8F{39->F_vOSQb~NL=Le}{)S^gy`crksFOYDmw6#E zEBqWh1`V#xH`f5`ZH3yiZBv7nQ%jUtG~#czE^-&X`U1jnaR(TCZj+UJR*F z`3m3vLGM>?4Eyq_FNRrviuhU_CDU=HK=T#TUtxL3>^N_EmN0@Y)^azn{Y z%9E=rP(`rFnSoVky8qnT*5iAK>=jL zur76}jLo7MO?S!GD$PApValfvX=$p`!0&O{StIa521c|V>EHb#hC({gZ!Gasj(uhp z?427}EgD-ol4TTg4T+A*&_1WL*3w0BA_6%vknR{XGcVA-QXQH*8_s)d zT#R8tY+eM*p_D18g448S8N0s4U-f+b8JS1gaeiA`5vvMy#E@^fzcGY^Ab9`gWF+MlV4K0E|UMd8Un8IqL z=|-Hr&6I)%8GiYy=lFa(kp#z|x}}fmRSw@PF{K0g=67FNvh*C-#G-p`?o`x6_H$$T!CNJQ_ZG!N-glS{$BiDK$0EhUC+KM%x6_je zPVmE#Gjm1c8RvI6KK|{xNYuyrK+OQW+-EeakE&$0A&TBLnlJ@l#pc-p{?8&c;aGwv99Xx_K6@#0~Rkb~q-c18`crsRy>6mV2{dFm9ND!`9WgwuB#^A`8g z9ZAK`tMlpN7|$vZE6rx$(@%<(_okpqmYBB1tzHYf-gpyeb+G=X5?h>@48m&Fs&|2h zTsX(eP(xB;$h~X4T*P_p-FqilH{{QJlLj0yYnyN?O-51v_o8909pI`FJv+&MS=L@r zN)7U~o?qe%k90_ux>6=OPC$|lk6p_IhP*>UeTMy}av2A$lzyDlG&wO&6a3}%;@Yg{ zWIVTHmNY?U>#5{Ovf`(NK-p>Mu_5FD*-jS~8jv(4-o{0^L-_UkdTB|}n3{jtWBg-G zvLwedH?WY0{j!|IIL%Xxj5$X6ojFhK!JF2KRV2&%wdsBjYA(XM6ht4V;R_o%-% zFC(j8wZqlKUbQbZ`?FMY1~@=2t-h+snpoGsoKto(k^wA0h$2Sdw&b9UAAgqMn3Tpv z@1Yr@<{5x>Xd6^ysVOkvKb}(Wo0KlHCh^8!CY;veX#S2i4rvmno;K!5aAvekBunV7 zCD9L9u$*F_k`Hyb(zgaWK0G=$#ZBa3J+$Kwr=vS;>qL1QqT@5y3;&&R=cP0D*s89e zVTNP7Uw%(k+gCr%K6Q-YL!BY?N71D^p4jFVHBU(GG}H);q`_fKBC$Z_2uKpAM*>@o zg3&6BUX37^?)Qu{){b;*5kM_Jfa)R8Ca51n;zU;>;kczSv)X>^t?aMZj+$il&e*og zW3Be_+n5u@YMZ(eaG1mC;+3$^9oz}6zczGDlx@&e6VzG)9Ik_gcZ)4P z?WrGAWOnlR)s9@l-n9Otm3sTMlwubzwPh<{)W$1m3fB?(3ad$P^IO`%J+jRBsYgNE zBYxWCT{cH`M{?RTXv4DpxKeZ7TlS)M+)Ow3wuHpv&kLBL2B?Z61SuxVd#nfCfG0Ji zAJKFF^?Z-XPtpUqkPFQj>gg-W=j-NpvViF zVHTm&$&Jxa^a3RP(y)k{KR_svGEsBnf2H^W()Fr!u1Y=(pzD5h)#}!G=8&5A&8woC z&}f*R;x+xV&Fh)tP5S5Se*GGtdVif5tv0m>$wB;qkZvFg#G^KoSYB*yARHkFQXa)X zS*jAU4$l*hx6em)@R*WSDG{UHad5-J#=0RhM|VSOyLH&E;-r;j^X*H1a_$+}a=G@= zyI~Bs>p-<7Fus9GCW%gVv$L+(wRQXwif)BVW{c5ci&@ZXs8RY)vOc|{m(c}wyEW%q zpWigPKduHZPxoLhH4;!9x^zYj=wrynCNrLf(J2)tYX2Iemf{CoRQPw+DdG(xK!8fE z^%bo~@UeY8T@&(+8V0Ih{@zMAKOmxDx$yx^-Gl`HKn>Pn`8W@uDHY6Yc%7(*A3>J7 z`KfxY=v9YJYsW$DajfM6<2g(Lw%=ujbGNYv>E%=PE|&9^qw7{P?)HuJaB-0!(j)k$ z8OCE%PrZ-_IpyH~5}Y6}lMid!NtOL?(_7A#&rbPU+-Kii7tftQ4~84Jrq2CVi*7Zs)saYBrcA0=5o6cI6==ynyKXMgBqWoz*q78@$`xE6CRB76?>ehC<= zx)|(HtRM?jnuhX{N`eFsCm1BpcJ&dq^8KC0uOe+^{?#OjK}zk%fn-pfA0X#9bwM8? zG=FL;Cj>Yh(|}?q90525?cBD+(!QcC9BhH8)F42k6Z=gUjq<8d6i7s6>q_TSl{k zd}1ID`4>i++P24)ZKuQdK)$R?R49C5i;RY}3C7&MER0?$GGU7f21dQp3uP8zcc^AW zNRE6}7YlGOD9CwKud!g29z*y+@q`1@gHjfO>vVnlpdzpvhLab0Ue#DJZ9f36;J25ad%UbB1JWZk!KB zzhh%EA>F5ul)vX|-#pYlG2&da$$x)YNSI%Q#$=MwZ}zEs0-K)YU~WKVi5{|+T7%hL zA#DC7d{WDW<4=#kB4qtz)*gJ6de2VFQ*s(S>67`IoUe?$P%7UzMd3=2Q$KSOt-KJAACMnvb z(@Wg4Q<)r&Q^#G|&zau)ld9E#D}LJ*ZYwb~>;(o}@bFVFc{_0$XI(M6(+>CKY|tCr zLzDX(ojDoscK0APFTdE1TVG@G@rOi}xJS2n&qSGchq_`MuaPG{3-NRMO4?pw{_+k^ zntr-r0j{-Po^k&rRC@z9$ETK?456T1!UNk zyXg!vATVn*U%9JQ=@#}#Ga3|Ta#1!~IOkTT zcw^op60sEZAg>73Sxy^Aj^36jd2q+o@9i6jI&f!+hKn0QsR%WASec0BBz4YT|7GX+Kkq(r?QEi^>wE6f%vENvi@qnJTYDDCp|lTi2Jswj9v0lnt?rGRK# z(6DV`@K%Y()POSl)zh;sShQEZBeXN5gv%IT_RuNz93G&Yr61`Zoe?3g2SWHQDxJ)8 z+Cn;Uk!Vg#TE^{3v4cnpzUo9P(qWk8d@nI$k+fAbE?0ivgtn+a#A7NI|B6FR$-cfN z5S73x8bph8f2AgnjiKb%YC-bwszh6{r@4TS;th&DhRC|c1fhh@vY(tiStLIH>M-9y z1@&-M?SOh68Yg}@$58F@ReJK6rp3$Fg?gp(go#URjATe`Ny@wt@{a1HoZA(A|I!?6 zeX?+a>!sTN(`qM(6C7-AvzNMy$MWeW*H2)hGw{sv0YGQo>Kj2xYyMLTpPV=fZ+mw9@Ep+1;_e!SfLhun1hpaL&6)fv zjJp`s6&b_baS}Dhz>kr}u1mYQQ#O`7T~(rz)YUhWMHD0P+g+euRMyqg)AMan4;YlV z2}3YJ?2KxYnK=;oLRy06orOc+)<}_V5VmuOM}&RytEEoAq^wwgGGC76jw=U_gP6B8 z)6z*ci6m!TJTKNq?m+;A?q%2FT&p4`*cA*XG7KKl-lDy|{ zFXl__g>^ncGpzO**w8K73(~la^?{}2sy=sO-P9*qmW@P_&0}Q8KVI;DUfhqH?gV<<*~-L-Nu)O2XoF1*@H^Kub1=-%l=(G4Z%A4>3rQiuJUu zE{Igo;Opq}uH3Deoz8pbkP17*uTP0oVdprYXCnzALH<9Ia(%=aa*@J7h$`bCY_;?o_uwJ0s17#mib;B}aQ#17y_2!tsTeFB2M`>_(=h!E`TD^jG6K;t|gWgeLRH}jOfSoAu zEx5J>;kFYwiNpvptyL>@NK$Sg5H52#2?0sb%lT;m_6y}as%5>3Xh;_}8Nz3ZoCbjJnEyi>TT~1Jo1%BsocWEGJ8INw1 zQx5d9QGy`cIeibq@pY>p6*xwDlmW_VETC#ixRLwPUg+vhi-Z}hF{%z6#;?MGYtjrJ z7qfIxt~E*Wm-vVzc-ZGu4HADR1u%1=dMN*c{Puu{`iQkXIZfh4)aqO8KIgL`J9!VC zJ`0B#!ZnGahpf1ng^ovx0?hPq5G{B0QM_^6BqE{XOz{>`^=NxM&@Xdh{9`ZPjK)rTVr)!5t6XqoXTJ9WRqF$wv z&U{c;Qp0{N&q;#CLM#eax@B8$Xj|*tGV}4FK&%>mo?GVo%~*Ht)?s*%aAI4#w=4zY z3U>4p#nt!y(8uCLZ&Tap|f05#AhuL&l#%h^OUI8h)OVjVtb~;eV&7jUzo^!oEwrUZ!%b`GGxbaqAf`$ zd{E|g1d|XFXdJhh1*kn(ShmIA2==C@$Niq>i<=K0P>tU}|6b1dM}L+6CDY*X!>e0A zyejv9#jDb`M&>5whWbwCwl@DKZar7|H*OUd`+41Hh1xK`}_aOflxp(l7?6UT@CGoz^nVi7A$MH z5}7wJlR{&%Tz{^4xS?QTX?Tw(*!+X7lW$Ky*!qOMRBdDVZW6?$F(qER#H)Ro8X_-@#S#kJ;>$-YkQYrKYR&E!T?DhpkkMZwvs&LZ`JOo8f8pu=(E= z$l(&8YmB{M!*@;&k>q%5BE8T;D0f6rsTw7%t2pG!9t740p1nI5!!iNQNp2p-ulB2} z_`Ynxa{cj2CMg?MtL@5r>v<-MvyS$P<+kZfl64oaQ!-rKq|$A34@X5!TeV~{WcMPs zjdI4yl47omI6tiC2DBQ-_36{#>sD|WS5Cvg8M?MkjV-3AdSeftwk?Nzts)}hbIKxe zmahI8#XDz1SLto&H-iJWv1nt9%0aH{o_lv~O|n(qZO#?sw(yH{l>qv7tl~@E47&GY zJELfQqNe%XgL>R_iSmm&FEG3muNM6mLea~@wBTc|M^d@ve0|Ua(bIg=h?I%+s(09w zzK_cvaD5z%UZ_t9YiqL80Ay=BX4Vo!VUUm4nnKy6f2K4s8N?Z^E!tzU8op@@r=u?- z4D4u5}97zF0OG8C{As@78(grTi?fieyjI0h=2`rMXah|GyY56)v% zg>MQNKXVC~w7KkiDaP4s(AAS=xG-9AT~?2UZ?K{4UNy zphc1vJIy)i)x{vNc{yRuivo=IMBWc1p(g{HU~xjEoXNs7&AVAyaU>@Lz^sZC?|}>) zoF&y`Th09ndcBQ>X7%z#4o|I`v6l}f+J^&_&MTajODTDB0oCe`Q@~JqVSGuBae;VmQ z44WxGZ~&U#;8%PH5|_~4Mbj>kJD$615t~3=C9ss^6MRBouuW9_0YLIWbQz>+7p!6T z2As*^K?L!*Ws;ggVcIHk?F`Rm*5;lbRXuM7^S2%r_8OEG4)YK z?i(WGmUsTgOBYE|9Fb=scR *cnHnxewZ{d@eUde{NlyZ?@nAkMKd=#XsaKchf?A zHrz_HOwvgJ9wi^7N+166pEQ5s{c#OwKjaGbL$2cgf7ZEwBiOE#S66IR)ZxE|<5-$m zZqs`M^2x=*@?s0b+M@!vgVDz0Q~A_Ug7k*&MzV}pZF3`0^Lxd7V=Cm5e$AD}(2~9b zfWyp;9gclqB#1%Q0Oyn+^K4Vy)7=)YP2p->Pcr5hi<7P7_H3DV&rvNON)sMOo3Zdow5t1d+zb}7C@tzksq6!pzgeUg zJJq82944{E{W91@ZQ@LZ#m>VMtH8;;$}55%=Lre!1$;urp-!^LR-$A)BWp>@s4BIu zYO^jAmG*PgsfDwMJT<1U!z0hDE>nnB{#D2kbOTP;hE|Pc>Q+Dm{->RJTt*YC8a8DK z&X$BMU3k=~=uuiC{DwwUgSLuWBazdor}pF2?EC8YmfV81_U8l)j#9nhi3KIoF(*un zzjzM6$Q}DVa&Uv%{0)r^3z%6gadI;BMVTkhRN^ouh38#duCZLN_~Wvmz=#YV?_wE6 zxDuqOFo?MjF)OfNio~?}9u-RJVr3O)8rqEyOC8A-=?~Rh^W)qTa-3Rcq_e^dq@&h@Z(`D4u6*Ji+giS`yfJ?SXKe4eLa8kCk+0aLXtf5sD0qa_i!|3bVU|1F z=W;2$zqom1aRaa)EHBT3m7U*EMa_2*bn z>*^L<5ue0JpLZ#Kl9;X(6{t5!l3CEl+bKh2V@N;3J|v*W2j%0Arw2J*1ZwB*$APpc zd*z=h1}D@~6jm5%QEz64<7Ts)$~8G!-b&48)wQp|lR9vO~?= z*5T=tA7moU&OqGp2m-svZvp87J^2~rVD&dF_%fKp;CdmW)_Q zJ5->!GiNOx0na?fMpIzE85ATXSEY_3niU6SPo?di$No|PVl(KL_>I^(#Er}`)U`?A zRM0=aZ9hI=&Ny1K;r+A>A_{G`Gcb8M7p(f%%t)pPzUj&^g}Gzw511~Ios!`>Ul;TO zzWrAE#dYehBPmjv969Ss6Ci^@u}>YhqL@W(s4d=ybQPgf5$mvUyeu|QVVqz;C;sKr$gu!By?TCkixNubu}&gy z7f%seC^kEupOZk{nEy`xlV9UTzJtf2rSPrK`K{S5Y7>uEVj8rP0GuYjM8ji~5_%ca zi!a!6;@+RDrXvsvVrk8y@^@m9YM66kxUf5*8U>IrHQWX>g$m8vpSw2wA{dlsj0y-; z$rb*v%O^weL5qdoDI6_Amrtcm5h)A9Bu&nM=ZQB!9(3msYP#;UUxTI&RJ_DLQ?KM- z?s`#JIs@(Wx*cA1y~mYpUjtjbTC}$M#xst9r(xxy%AdIrpfP&gdG zR!h3p8v4A!cU`}v?|(m9LMXwOTUB`KGUo%nG{1NUI9FFFgzcR*3KX68EbvvPt z&9glBO#2oSKQG1kXL`1L^1%yq?Hl0VA=B&!G6QAar{sU8N>}{^UsC_i!PkGX_o+rW zA{!%Y*GQ+6@@VKBDpSJa2ckjz`lUe4Y7InT9wAKwI$)<&y}RQ;@l3w({9g5fhN7h8 zl}m^cI2IYrG{wGeID|QDkMnQeZwTjS2jqCk>PFVI(XFF*n?LXCU7t^^y5EksOaN-2 z$KJ8QfOHq&i{KG_M0uXOSoB`xVBW3vz61P7g2XmN_FQ3HVjJRnv`DTAtsw(l#8*W2 zzw@}|K;ioYAMW*$Vq)F?qw@$MtVEn!5MVmqZR)e;G4Ju1=f)pg=b=Xu#zJ6LPV^^3 zjb~$id3v@rluMGXk^uPHvsH+L!F=G|iS%QPGvGv+NA4;NL?OsRV5`z&pA`!k| zR_G9J3fZRFA6qcf*g4eENjhn1I+=SG!vZn|z_3FUMqE@$TV_UFW|K~QP)1_{(;=uj z;f@!eYZ6{%vU^`ALJ0_wC03Fb1ggy9Z|i~2MbnqNwxzSc?2W5>*d3e9yg{K z)YEUtJ5i9hNMeR0+Ul$Dl2{OK5|*Fy2qp^PM1Iusou&ojgjFv_A)rbj9s7h?`;3rG ziJ}mfhaWYNPs!ju|jPOf9+Grk_JCac-WHivc=u1L9u zOXGbzmBF<)D^^Lig$s2(0CgiuF49s+JP_cH7u!ROS!3@Ndxl^#{Dl1s|0;QhBcbM% zhlDCJcP0=_JL=~nh&YijAKo2_;#}~P%SWM>qb#2FVoZ(OKC11jR7t^@wDT5Mn3M9R zB_%=CVN-H)w^#s48Z(8w?_9;FCcuJ5GN?=pbz9hnyY8NI4|^jjk`mO`A#29clTwA{ zAKnBVbkT&BmMx)8`u5;&-uhU%x)FYkLe?8H%1xvW=tXo}1+KBPLs_z)ffyEJwy(v&VsC}hIox4!%L>@P0Ry*d`VRQNyzLr>goYR{{?<*wByPoU#_#nhq*FedkI9Ea;Cb^!r;@f10-QG;6s zN?oH=i&6`08|u68l@J0gwMZQv8#_Oz^BsqCL-D#ug=EJcJ6)pILv1c-f)HAJtex5z zR0&c6;R&2ca;q{=ZE0LmKCiASeMIs5gIm68kL-i&cJf5+C5_fSWTazbaXuS2zF@;Q zX>BoCs+@{7d(#89P%;A)fW136Ec`hJT?k{9!-(_52@S!gyx>pFwkXU@1RBeM6`m60dT_^RfFPlHaQ7S6b;x`a;$ ztDmd*EGx42MYqu>j<_rXviHlM-*LoeS&+SNx{U_wWjIe{&{*N?vqkqb`jg&!!?n^u zUjUxd=4@lQMDei@v+ zFq@+1e(!~Lw?lXo7C2S_$~a1 z2dy{!9yq}nTL8YEAwlaG8DignWdB5R#a2!EX~_e89|r=RI>H#~_?7$}!WGML{B;k# z^ZoVhCuP&0XBM+~3lxhPzHwsVw>fIa(Y2ao?>|KI3zb2K9n8?`##2AXxN}Adw%CYM zivvhC2lN>;;fN%VjJ{o)v>b-wzI^9AFn+}DXbYaI=lx%rxc=F?p$CF$k>CLUEExWa z#@+u_@&DKSu;c%z`l~~_ArGVa7>>tN)2(128`6V7hzGJqDprHo)f!`tqw8UE!2#Bd zSP~IdY2m`j%;Q*_0W(X_XA(=#Gg~JVn`23pV?gAI&N1=Ky?0-~cV|3wt;VTUxme$; z2gR`2x|)1F|7Byc-3p)XbU1SdQ0sr<*kOWusf2#pAp!TA0%dg@1r@$|Raofei_s;% zWelT>dtnT#iG86AtBHHz46}`WA^lMbzOaT}$G*^pUB|unV15Ajh^@tleWVV^ihU#w zOpASF4$z5x#1GVneWVZAihU#xT#J2V58#V^#0}(#eWVTOhJNabe?$#zYu~`XlmLGT zdw;w1TD-uUf0JCI-rXvr0}qLz>=IGAFkn*=Ov?1_8px4^^6xq=7$7Sh)qxo+N00xSfFQ&Tf_op9P8biFH}6#`VI&np~tHo_@l2F zAW4d89q38oUKoHq6))`MBANbrRaOr3Byu3kBfjzO`O{>p`SU7Fcg!wsY%lXm;*+C? zssO>7w7IwfHoKE^|Gt*%4WH>1vbL%Y0nxPYBSZ9WcN&DrSoEN`A$igdw*SU-Dm zefVWBa>%Z*1+3-PRFrh!M`2{wZFf^t1}DJ6SZrA1f*&BZ$-oYurHdqlA1w|UcfnX~ zt@!rkb`n)mYL}hxl57!ON9<&bMXQNLKaAbd^F*XHAAHfbZ?7Omz%L3{bJ3%eVT%h_ zCoQ(e-S{F^Kof&|h~JhG1X_1lZLZmX(ok54okqe2g7*_}U`CgPMPdA$O!`$#j1bk7 zH=UQ7o)`x_IXu*i1?9m@aU%yH_d{`Q#5C27$Lb96rnetvK<-d?Rl zEbxHXhZj!efP{P60woT}opIhA+0293trG^zNbW+{pQXr%5f>8spz`c=*^Gd&R;{c! ztEYtt6ATUqMpO~tK#qwg?>}3cF0tU)Al-`Z0Gx*W7nGAQY*t7iY{_{vaF&Tv3XvK! zj)(##mk3oQ0oz}^VAP{vR6)y#gf}0??C92s-Q41nGhH)y$_hS&voDO;X2$|1;B~Ge zs7c!|`$(_m?`jK;SRRB6s}5>m|9~qmUi4<7zy+bMpUZ$w9k$}AU7-zqQSeLJO@5qGBOmq_CX!jBH!0)Lj{iobzo&#z zvR@df4W$@0){Kw&FYdyzQ6(H{URHf0DB}hMKpPh}RG?rMM5Wwca&FNz^&^f!D<3w0 z__=9i$Wx8GbyF2L7f|S(-O}lxcaN*)A8YA3D%cU>cS+Ebh~h9Px6E}dA$?4tTTNUw z32wABU=d=$8NeqXh!1C)vhL_*1=V7h%!Z+j+D(#8Y-vr!@R9|056A=HTs3!N>v~Ln zb==#Y%aCA2#5lA-)fbaM`Ww{R87RW^*?fPeO}3S;Da&&-$^4NuqLuI@#FP!9*QS;u zqs_N6YoM@I)7jlua881s>`kO7;{cu3GO*RTO`I_?AItJ%XHpgfO?U?qeW|Ob5rdr{ z7iSJ*?HN}k9@Jfs&GSOz`qfh)L8h-rPRJ`(3rE}-%8eySf_s6qz|}gX7l+!XU=0G) zwPi8lRAbd%T{X6CLxLzdD5wO~0i19FE9O6b2T6KWT_JiCfbKXzX%8TKX6u;S$&d_Q;`BhE*ghv$aX4}#GIjj|)H z_s|aOHBb>Z$5|6vH-L2PVu4%6t|YAtH`j_lKFws1LLy;s9vM#}ft*Ik8qio(fOsA}!qA5Ba36+2Sv$d_nj zxbL-n^!u@*5@NtystPQ7On>6k&UrO%Q#u+r@aMiFCq7}IbD$^$$1URk;>9iIwOhZ# zk*AiEvvI`Mu(5KFIqGO)ca_VHf>R224#;87)N`(-3-jo3lt3$zUS~McGGYmGwqOK6 zRY7qKXZ9JK&ch%k%g93|wSM{t9JhctI2!zYF)j#hr`AJLE42RoMUc7{c4Z3_o?do= zV^K`r(D8|dY70n<8@RrTYG!q-FU5sK(L{?S6L{uQ4q3Sv>(jQ2dWWG9e*o^ImQGFl zw>XQPxb`=itVUF?r8`)4jt_~2TagJ~|A%4UGEQ5{4T*q4KLvmJ+QhHFd|B)wwT!rh z+AUiuIW4%abrpz71-6$QEv6hz6Z$>74bl+z+q(H~@qK3q+obYwn8|n6jP_rAwsa1% z#)(82iTn2MiJBvc@;cAeqb3@HrgWYfyL>MmFvWoyh9JMU3)C)hi&l1i`E1U{m_H=M z;G+e=z5)D}>;+|UN(0pE(EO1eVxwH@%#P)6lC8y>feTgKxKJ7FD?z@x^W51+a+7O%3jCLIB*+Kv60b(|`%Cdu}RCnIi_XPh=fC z?~|ZPw4V`S@_NkSQmL_90Ip~eS)zhkhA445A% z>5_}iBXmSJ+iy6cY(?BCpa)upTu}bN+~n^hgDnJS4=;R#MiFW9PxZu%F6J#EgDu+M zVdUf~%($MI`irMS)@PEcYts0q$LI_8r3PlZ6YqO7)iDVO>Ox<#z9G`cmR+}Av~olRYjlg5rCyYJbc!|JyZ<$w$3nPyOzdf9VFa&< zm}^+bJQdhYbJ;NNkiPak9_8em)|!QsWqNx{FvNZu=CLvu$`W z+w@Dpg}5SH(QGs40;7QqXC zhD^^0T5pi;Kl^guc=mv~?=;y(K6JE{oV`q5^kxn04YU&PI?LxxQQ`6k3qWZ2-8Df zIzl#@%52OJN?;bC*^78+RV&N_qB4zhDs2}wU~(>1R$rj>E7z=kKBielejN{5cZ69o z@SUrjGV-iD%RGDo;HF4E53@pP94sBAe&wkQgGCOwy7vOkkO2~laVg-LbfRuAEeWaIH$#P8H-oD8#r*061c7< zW={KS#Za`(Cm(nrC!A*lZYbVl0@(Cof@rl7!qTj%;{;SGvEi`kUCrsMm@rVi9_u0g zPBR55R@F<+;Yw4pY{CL`JqH+X@IA~=FA%f z3I^H91<>LKvmVZM0BM>lNeXwAj(+pcyt#Q#3(8B!omrf7Y%nO?70c5)lXac_0^%XXEUGJz4G#Nt0r$k! zBoWF}W!x!RFc8MM36}|1?->|R z`gQm|6&O3JNWC^UqQ>22H?B@p(M|BI7gU$4=#A(EsTsK8!J5c88Szx%N;{+F7F6s^n+jTMbet&MG* z#EkWgj2-@yjM3Z*TNq_{d%z`=eZ82(SrRf29L1rLrBF^nQ6XJ#J`jfll7a@swE?eV zy?R-{3l8?#d;8g2uq}_qx<6{1pclOR1`zUJK4mvs9+nr6HU@^8cYjPxk3NqsacsAJ z91j9y0d|~T=D<7j>(Q!xsk~>vRO7U?p{wko;14zMS+ztRct&A~+2S{Z9GFIFh+E<} zL>#zAafw~yH-sJ7MtKH0THvk%-cO$ZJORz~B8pd;Q|<%mklDc4pAPOrJ>_)%e=HOr;>D3KO;S zu~K7+xDhdyhzgV-$`uIv*qUp24b|dEcqa_)tIx38Fm^S-1J0c5DbKTDqOGsiDP%$c zm1RKMNu9Tn!bR#t$H{?R*^umRc-0Sq%U&>+MFto^Eu&8*#qt>`Ef_a5l5D&~GKK8G zdiYM{m8+ep3>Zi2zBU|ict;r;nQoY$pJKmt7?5V&kibp5V6@`d zql@ssq$j(YlX+g4vbkt2I%f2^{fcRYqnXq=6BV2}rbG`5BV{|p7Y5ju+nV{6k=skh zAyGS6u@*J~88k65#3-Po;XMvz97x7~Eo>;HrKMu;d&uoBpdgX(EdM`(UylY zXjI>c5#;}xN+~R^<>iRx8d%)$Z}?09hw|Q}mcn%6z)0cvwg;eD`UVjs))hHFULgLv z6n=G9G!pS6Z8siMwQu#YMtroqyPT(Te=7+o+<#s5IIec6K%b+2{iYK78TwH}Fzf7n zaIGxXsVe{0qQnbA`^LZbldwy0gx1&Pg zhsC_R*7!{!Y{=Pt$h7qcw!2F)pe3Q!tT1=PenuP4dR~U8vou9ShG7_0t<@S_#H|zQ z<6sqxjV0}$ccqhDCuIX7Nt0Bm(|V-PVx>{`t<9I#GWMYHu~rSDG(JwK`KXYH9Q*+L z_lyWC8PnG4kG7LSa&GEjC3#tM_N{Dl(_%tk6*HG<%d0YsvI+s>VEf~8q$!Cj^U7H0 zif>zLvk7P-lTN&)ro=+SbEJ-?D*aL)7l+kx${8%pte8fXTK#$yI=p2X}3NMk7 zra&#p5oUtHm1aP2J;OEARU&5ab1?yQfz3%gPWX(}jy(jk(`|-mG@?f!^1g zJ6gT4atOmIahLoEpr1!GAb?=P@&ehMs9<0+3e&8~f>gElXe-=E)!D+v<4}b1NcCPh zgt(NyNz!`+%5Vm!>DQsT+@(Xdm9@@L9iOv=%SX9)v*W^~zmuuoS>p9U(*dk*jRsS; zx`oe}ql&m-o>1Cn5INJA2%JB6rlkH35sp>=kAVfCkkIf8hmcmiF7mS}RwZ^6X8CYT(5P3`Jb<@XeTl-A(d#p^^q6y1}bhZb7vj=_95N)>*oF3pI^DqSLsy2Ev5q-M_eNZQvWkQ?{+fw4I zp-bytjPnry^tKs&h`>FKfI5LCnWwWaq@&G!m;7lUDx{;xr6W)CDI@YW2lUn-eW)e+ z902k#9DTTqtt~LL;x6;uIuOHe$%~ofKv(P=pBTaRm6AB&e`B=7+0H>8=E0=L0_SgF z;BA92^ui?OXNyX~`pVC_-$|q}TZP9Pt5JvB1>kijy(`x1Yt@0Ph$1t58MFt@1Z?`( zli2@k`f_zyaWy}q(wN!)i@kOK`=!`2eH@ zd_V*P$;O(|odXUR7(jdKKFvuZvLX>-f?@;+pp6(Ufjws6m6-NdUEn|vyN(NDScEwHr4@yv`YI!3#{gW#YEfc)q(T!r)rA9> z=9Efot3R*m+G^4TrG&P$K~h$g$+Fy;29o8;J*Pw!i9Ju4Gx3?&LV{g_*{@xKS+V@E zbQZ-iN!F&7Rga_o=$&U0a^Czo6(noowYo%=&^kD-^&ZYqt-ndm`pV2`zuUzh5Ui1l zJT7mrU4X-|#jTp_Gb%4kz>?nvdVGRIu2v|^b$8(2P_tptx#+oe16*PaNsW!HCyO^^D5V{uX_O9LpDHYK$Y?KIf z9CXtkDZLT$b8OIv3O>*<{x{CvDM*y4Ytt;-wrv}yY}>YN+qP}nwr$%!Ri`-hb@#;d zKhty39g!D1*4`O;u_JP4zUy7S_)K0$gPB_=Md26K&I@nwgcCV^ljSYQI5wGFj z-IIZg!xFZBima-A4igd>se^%|w(QnO_-N457VGHauN;ma*0hHh2**lm@YDXX6cWPB z-pi0bDljPFMu9FM#dTE1Q$3VymQ^8k;KYk8hsc`4wyR26%4o5Puuqp33ns--Ip%;f zEZT5B=B#weE^V@o2x+BG00aw}EoqO70v~)Nz}nuQu9_1q)F1ncfeLzPM9k5dIh`?? zo*&Y=YiQKa&ZNB+YEmSL&L$%NP>v%@(X1zOcj4Q`(WQAsQHqHuUROwqsCcAS4KeJn z1wwqlaGTw}h#yV`93cP0#&_wd?NZqiNu|;}xn&n0n`=?LIe!V z2wJ6~_@Y#z;B$dP+awn;MMOW3k5wW>QA(ViK^vVG^w6LFpZ)4u`@i?A4=Hxa{a(~F zd46ABJ3CQ@SwmGvN;?3Wyrv#QPLif~ePo}`>>HbW?@QN@?eDFrgE`WJe7h?_0ocC= zmm?13A+rPN&A>q6EWgHB`wnJYJX`mM>_=nRwPSurtA-~eKXdt%qX>$>ZuX0moYc6d z+%;F(yPt?J|A;WSQifsR0>8^owq8~IE+OfU>5f0l4n945UM_yV{m2Z&bc@EjJ_glU z!rO-HrP<+vuAaJNJi-a&ud-?XHC}7BAEbfbi>LiNaI5>&S8>d>a3G*3L@`{3{ovDlKgSBiGDMrR$?ZuTw&IXlMdSo zKk)r-KmvOhac*bPp>NJ(5ellykRZpT!vJK1=@R<-v=KZS%RX6hFAO)@KjV(x?$6X$ z=Xqn;Efo_}$BQC4R7LA=jw{2YVI!tlup}^_u9nm-02jqIt&5W-MUxN?YF2mUmtzez zUrCb<^TM1#?){Sf91?{oBzXhbp4i{ysZLv`l}^>iP>y(M$On0C^o7(7z?Zxyero{X zCw!p#R1RDd@0LA;Mfx>qL=A6|>=HiEMZAi81K=Z_m?7~1#c5^`H2|`Sk1qxD$c#e@ z$|5)h#v=!36C8sOl0$F`{I}2}y0DjK;MjgK$cOlKn4S2&2NJkA4v9nfumO^oI1Z^p z^so|1tdOFi(C>TrHw`d6XuUpZe~!o&=-~I=t7_QRNI^Sg5iz2UqeMd}0HREdow9DD zKHA#A2q{Wo)&=5aU$}8&9R|{-IE#z4HNi(HfRYAm*i7cu*hLb)WEMC~5wRt1P0T22 z$Q`jIaZTU=&bl>no2pM1DxasF0MTHH}yBP$7a>bcbg)H-0^-Ud=F%tRc<^ET;rAdZ0rICtU(Y zBFF8co=H2cQ*GL}zYqP!Cxx598Gk)iUV2Pen()t<=mBSRK$a#u~ z#!E)V0u70rztjHwVIyO=fUVHrl}ucJmb%7^D(oquK8HRgBXf=zC<3S!=X z)#@V5>-BJbXEy3$>elKJ;DE-CVu#Ta-q^0#xVF7Y6<~Yn-qf(rbq&FGB@;f-wbP)p z7t4uUn>{uv$7!&O)EchZrPmRicWiT`4ZSrUWVlVL1TQKHcZzp&FuP)z!9CUQnPJqXs~i{H6kMruBfRn~^0W9B9=5Z#}ku*=@*& zy?OFG$#z@`ynbge7Na|Y38D^0VVWt$Y0r9I*r4uZ`FV!37#du}C09ck_kS*Iw?TUf z_yTDcK~lK2Mh6OAS0I`reO8Pmxbl9=g4}=3vw_VY~e-_s!&Q!sf7mORV>ED+2O_UObrfHQ4SCE&$=v|HDg+lZE{Rsthvi zkF?%LUINBr0_JKA_$USEu?EXdf&ILG_7|J>Pub`P{+(k5o}C55%f!1+$E>Hqc6avd zFPrvX+2}v|oeQJK0zNbT2rMfD^Nrw6D+_Vbh}we>m-IOwe25t`el~|uztN*;RIHEkml(w*a1#vSc7vaZb zo5K(D;AG>svTTYxIsPI|z1f*Qe{wn}Hxpjd-eH$Mhju(KlfEc}InUfjdDEqGm-S0^_R_c!U9u5c)&MS{A<3M^JjgNZh+otav@Rln#YRxhSbR*drX}@ zO1$Q&^HNy@Ynck*^v3&T0cj17ON3Hu9v2KHQXUr&CD&Z8$O^?=u29N|vfM#sOgY@K z3%awU4_b#Bj|92Y>A{W@H`39auCW8j9b(+9e8oaKe^;F+r8ZEh+ zUH3AFlkRW#1`OEh8WQifZHL|S*dQEtU4d@k8i%$4;@5mCn^v1MhhA+;#oC)*<|729PQ~@otYmo|rS!SHtyY{P0y? zXAcc}K}$S$ob7B|yCI!?rbAJm29n5mf;EU!3KI%lBh%Okbc+d8zX@=QMX=Apgf(-p zng_%LegtT!Gs64MYtRZ%>@My9WG|LOKP0{IkiJWtQBZ?9M+A$TeT&E=Njd|JAD~poLDES#nSg;gDVJPbcJ^RltC_^EYoQLT4?+jZEI76F` zV6q1onAx$}$HA#5fT`Yt+XB8~nD&br?F%UZ=#A_zVXO}aup0xvW&+7M>|2%osbjof zp!BcH0@8{Oh?4{K9zto~#dteL>1US-;4|9qrS!MU0Md#H_$UMDwSlr`2KyCO_PI;@ zU5)kwDE;p;fw-dsz<=k=ptkj4cz8hXeY^`Xfw?*FN3Hh}mG|<`A?-z1oNGM=o^a8-Kb2PZ71h@XVt#1W^1HC;yMIz6 zF4C=ic~C+IT&uk?={zmxr8a*5_KQQm<~Mh3KyL|8QQ@NMg>8FAD^%kJG}q1RYa8c+ z6Y#TZD5Vk6)?hVRN)|fi5^g0<(IaZsIae$oEtraAjZu^0FBuikh@)Q$NYWQzbw^t5 zgi2y?M!M7%(PnRt?67s#Xt#CL==j@dt=-m+qdDN2CPe+vfupHVHKj0!Y(p28L%yjK ztC)Lk&q)rh(( zfSuYb1peIzsVCm{ha4sVUo;=O^@!P+ymc>x^i_!dIt1GQ-+J`*TjpM*9Wyropm)`7 zz$_|y!5)A2P=JT}tDPM6O$?*o>>t4=VCcOLwqcXLlxKk3z|b%5g*@LZ+VqBhsL%eZ z4ndR`{z>hqucjT@517zcVqGfS2IL~{zm^QR=16UOg8={(p#uQO{O^k%4m#xseZU1Ck;5ivT8&}(cP5msT5|72^wi=fn(w=MC77rP=c{Z#5KEAR_?JH%Wf&DeUw(~0X^)kk?WTs_gI;vr2 zROwtlG6q(0)_r6{`Yi0UKP;oYgdvnx5R4{}kO(pOgVBz+;&K@yL5V@RR6-KWYFvqm zlI$boM*Kr6d_-sZG1=N{Ri$ZUX>|pMOU;QV6~!r65V3_w0qbD(HkjHW3>+92RXa`$ zq-`jw?9o@DvE@5V5HKo1zKfOiDy$NNd7!?r8AKyhv9Uz>5sr4|pD~i45(TB?(y)=_ z9!%9ay-E-2<;1jfMx%5dOq_uR82mhm1uPGy!bH)y%;xG$?pA2BAQ#5mL(Ay>C#8wg z`srH~Rsjiek*>CX0(H*PYmQ$wmRywQJapp?N!grvD181c3Y-OzrkZ0l_jO4gY~5xLT0MqRjb&RF zUU3dWQddYe4tmR$FH_Ie&b&-TQIb*UbZ-a07+vVQj|1TKn=rU`@yBNT++crv*TFE~ zb`bo32S$lgBzf`Pl8zzA%!zXnwTa#WkE9cj)#E6l}r`gpsfc*5QUiDA@l! zgl5A3{BA&h{WPR@&l+?_)m*L4iq{EzuRz^!sZJW1?6qymC3mP0D3{yvaBsZcwx0cf z5Dh0AD)!L;hsLi{gA8UNq#Pres_v#A{%EOyuM3)1B{H=SwNe1rT2%sVP^762iM<@C zxL%uD8)9QQVfYsO9=>9qa;Xm2R(`TFWGQiGK12{*)&0f=bo0j6hIp@g-xZ1{?)_su zVJ^-uYUURkGe1TSC2tTx+sfr=>X_w= ze$}R>0+y~j+E&c+fId9WZ$_(soxOKM6GFP=DNS2&WqF8Bed4XD$d$>qQqI*l4fmoK zGB>0F{mF30l_rRfL%&V}qmE^D-UGVQY`_b)`}S_&<{k1w+k-Fd$s5Z$kHME$UZpMW zKsKLrj4EOe5E$%%>3F!@!BCqr%V9o3;cB>Dla2Ur_@0xoHf09G)sW_Qiav|+H^R-> zOPR%ZIjnv;{MKqcN=Po6gM8H0h#8iH@gf_IKWQ4x$%vJW!Jj%4&c%q8gTbFRgW+b# z!pUfxJaZm&W;3ebTqsl=fnjw9(NsTOnfWhy?=d#JR2$N6u#hj{XxJ*aGW>%NRhquL zKYwzjn(M|48d`($?Gfm$Msff?HJBZ}-;5eGE;+c4!hf#<#k-xv+XV3QRdPT~a!?Jm z|4tQ(PZO!P6X08{WIs%Da1EvZryAwcUgB*N=uIyrFfJvyj@ti6htj>7q`L&*TdrjP zi1Z-t_eK?vU3-8%Bfa2jFKdLxy9T`AHahQwoLO!b9t}LOyAWcLz%4vN3_nQeK`GaJ z&nvcj@P0@0ypS4M%jKmYZZV@puiOo9af zc&7Q^!~y^R9CQD}U!MW#jk1C}_CvpMof2Rz3lR(u*$zSo0<2OiC@9DVBAhA|*eUBu zZeZZXc8!Q+g>DtHi3W-YKmR=Mi7#Tlrp&XsIkagB@3k?ty4zCIy0W=y`To-G9j29Td2(=_lUs}2pnzAr$IG6XEEe;*I*1pnJf z-I!16lp{lIBAdV|ar$iBJ6Ae#+Q?XR+&f_U$XGVPBXBy&IG5;&C4)ZkA5sQ=l1J#Y z+PHVh^xC+0&UBM;ufQoM(;mqaEz?|*N5FL3gm>7q+k|)Abky%^!3G7ub zNHIO|{Ou~^Z|k5w`FE_0wH$l$&zR}GiO(T0yY+n;u+>yyyE+sT0(WDL$kxzdb?L|h zue!3Xn?hHx>7oAC%Bdz(US3X3o~%t?8=Wfj^G6wVZw-04(O-4l#m)5w1$lIInnLOd`2dfyQ{o!(AS<#qTo1+uu}HvERZsJfJ8(TdwN|{j zjU@|RKaVboevR8;RDg&MU0d&HrF}pMS@T}>zeJx&Wgsp1m(g+{yI0Ph@*!c zBWA>hQShH3)D(KM&zC@79lAxgHhU1{Zu|LOi|n-;cp+O8HIt`)=4{BiJPln4_S#V! zpv96r|BJwcKZYd1P%gye!xQ@ZAs&2Si9GFarr=4D;$C)Qlp zi(g1K*hisa4IKvNU6`Npg9uoWC32?>%^?IFs8>GePLdK!K`-Us2;Rb75oOlt8?wdy zt*>5j8#~#EPogv~f_#)Tyf|+`xSyK*?b8dG5C?i=%B%ubh87({^o2yyX97ZMe@B3w z{1UomzAvX7VK7m`x3kUye$23;q}oVh=JM$+-8hcn4u-wM+kyoc_V!L^Uf}&}*Ic$@ zd??CTp|3W&LBf09fTf#2xoY2}m6ID9$hk66nA-J7$2EAwSBO#d8 z4sPi1(XVKMIBs@=>ZHMha|C#*5X_N8j0TM5Jl&`P*|xKvo$Q8Kmr33McRP6~Pxr#VUctFMH{wVzt!b$k-6Q!^9oK?(YQ{YLf^Gtr?ym$Ml z65KZ8IFTfWY;WYJUG8{Z!_f>Cw_;f~9%WwoD34j7$zpkW9eFf8+nrcN6z_F;MNFPFYur>yJzi>dOQS zCiF|Dr+E6P|LMeankMWYsUH~42KsH{A+3)L!j_N%S)ZWW1)@4j1;X*C=dc8>7uTse zQDvdaz*Cr55I$6=$sz`LSIEq=DiKkgwF+^agiS-gg#gkTDx;$Mw>qB;g2&_}qpU1J zu8!MG9jZ<;?{y}2%pKPLA493cw@!^wTY$%Ci9;GoFX{fJSUfDK7V%emk>*ZLP7Vr! zHWO>0p*ppMe18FLK~k7D4Xvs7p!#s1N?b>&`23*&x%Q-ozI5g%lg%>7N}bDPMe*>> z1Hw-1-3qn@Z4Xlg-wX+X=Y5!V757eTWDa4OoEjUa4_#v?uOxDH)|!`EOPc|`^9Yio z5eLQ-yKSnG`>eo0W3`%kw_K!`G0q~Ei?(3l_L{rGoGj!}edEAi@?@l>XvzD(gyxpm!~@==d$&O=dZjNQgYwki-te6(81imr;Cg&Or1cqkb=~b6vEH6(eQwHjxMCw8Fc;1W$mRA{kc8%npDNLjEsps>6Bj;;@ zsGIvq)3XAQ)L~i$*a7Bj!lV=u9n%I*-d4gqz*P+GK{cUkJXK17CEFvPP*CiM38x%n z#wQ7HxDd<84wr?qM~Pr`9*Sh5=F!!Lwh<{Zynw2S^_lN2fRhc@;F zi5YBTc1*F5XIS1xYYY!P))HK9IRl{ zEtE4YV4}5*;xa^2GDhdyS?_r&Eww{QBEwOO8Ch!>fL36~nv`o7N9LeteO3GEmd&*5 za3VWtiqa_?2U1`n?~^4Pvfyen0%-EwWn$eM3n&QS9biF^Cx4;Q)*m7Ip_sFU4k>fCi=-^QRw@#d)cXvIGN6bvJKj9fVl z+fgLH{n356;5-b2BJCxwdyB?-7z#o90T8wHjWszVum(!KXOos0n680!q2#c#8fr$# z?rAC5ObpaWPcGiak*=mpkBOiKJu@_v3&2JegF4kelokLcE1^t}iii(BQ6S*2c;RC$Fv76%x+3q2Sn)fczB*hr;RUs*#_#>htTyYd2Ijl`fqRHQhBh?XRI`Co+z!-l#2Z_U&~pHc-^HqDwf2uIQkK? zhi(;1c}GsY(r0%Tc$YZDsIY-Jx3k+{olSi%nG>v-y5` zYziLMBw|ZA{GzW*JX=+Dw7{Z*OVF^S^DAQ{jy4%#R|N|%A8sice$s;qN561z6Q9xxj%Lc zV5_kNoPGo0em$7EDxfS-`?Z7>+(BS8KnmHmv7kMv4QDWEXfQEZFs6hToIwWRfoV*= zIBBxu;AAoNS_~?ea7Adlh!Bk`A`s!^!R2o(A%!b6pV5}pfI+;|QOAPOc-wT4LNJs# ztYI_WVL8}9Ae1?5!FHU(bg-Vdh$U>nV7z_DIfj;9+X!!n)iq31qr7!EmR3XI;X7Mo zwW7*y?GoSLpv9LuwP;_Pt#$E%rR{NnMmmkoIk^I3@)X4fNZe*-KpXfc}=idONK*v0chY1`+zLboMcwlSkM z3+-)KjyFLlu^g{E3PQIh9_?+Ij<`W6g&eQAMz^RQ?P9PUvjR|B*&nTpZRGH;>4a_0 z@q(CVy(ZJJ#|OK%SZb-*W2lsJ+8si`trf7eb!Q2+q#9uha9it{G1oKgJS7PyP>U^C z@Ev*b@TD@HKWZiVE`K52Tu1*2cZ8UHO^w6l1d$C)Ke=RsP?O~*)wdULfaZ`JNCbtHO^s!z&(x*Nl($0we;Y=#%$!e$Fupa970$_irQnwa!scOhRp4^Ym`t@&Qoo%dPKf>)8%9sdUp0FJ*K(LDnXQmEKL0|ZX6 z9HKW@G;m%7fj3(qa31j+&j30^ulPM_AU(2o$bJ=w9`PI306Rpl#64}G9kO@Weiz6d z@f+U&JOp0ZAAW6c{y_Ytu{?y&C%uYvW>+P9*@}_k z+GGfSq|Gy}pQ{ubD2_ggtQ0$!5{dtC6j_x9OU8Fjs5AluoXZCWhZS3|#z$eOU?Anw z5zpkOAmp=h9babj^QYPiFwGVWMaR~gYJTX>=S~c3C@uQ{u^6@9t~6C$ zd)P6#@bD&Z;NeRt4PGSdCS5Fai7gIA7*p}$;d4ZBW68*y0*XvcqJx<0GyWRPDAJ6q zb%`3O+>`MO{p`K1i`jh)+uc}ld92RLiQJ~DmgowT$OjqaPaGI83*frZ+|tUhc#Luk zNtG0gIucV2^ag!t8WjU%nd1&GnbD9_t{nsHUD9%6)W=r;xqEVs*}`wU&R?V}KV}-I z!oWPgHCi3eCa#5a^KPD{2=?3QMmkw|6yL^>@l081IA&^wX)dxzVj_#Rb;bNmi!9Y` z*R|fkTrRV?$=OXHX#zu``oW!gye+wb z8CW9H4yYnbM?b*CKskWmk%~t+II>p{=J?bJKHJA9;(`A`InV>4?~ekZkGN;jpig>% z(x{7nq0*>Je8JMFOL*bZs7rbQ)3A$oiK(_S<^{Klj1N|Z_@*87+wViUqK$k(3(+7@ zFJ^!Si9#_A&`%hoL7-7g2MrW~YWhwaq zN{a-zsk+VpXzTn>_F%zq9Q3*ig?8=|ajP8IY9WH%iOGSBkIf%9;G-?AMIQrDt2N*B zg^YKB&~8SeY4l3=Q#?jYBCAzVY@xWr4M|IUiz$X8k=^p|YQDzN3s`Fc6}}o^4%}Z^ zx-O^U$ukVL5xiQT?WRU^Ny6IoF#Px z^kf+*Qy2}VhRoRN7N$;p?(cCfh_@riAG^XNP(Rbrc|M@LKi7kD!296%eAt`ZT($o8 znBJEv^(DExMGbD?45V`fHPTe)O@O8J!QD2@es z@UXpLqWlnqnYsmb)${C3Coa=igC4%7I}xh>8bjuw87|;Pm;zqFJqY?JwLkwZ)SHm{ zQfNU&?fe>vD8%i&u`@6lcq}6xmMY9WZd-W1(g^imZE7E1w0ePXw^Q$Yvt^84Zqx`k z;0e3@q*DBRMt*G5>sOag^?rh9{Ia5cc&+_FI3j+^BJHv8UmqccTnBHck#h&eG}`BK z7!2p^&nAN{MBV#D+)-Y0E;*!wX`kw6=^WHl8p5bYkij6O1niNyCy=Q(M_TJ-uSwLd zJ-gO#$x#8UtL9U1-J`ZR3Y79j^v%hP)$F z2B*wQ2jyA~GtMU~=*wB=`oyc|cr^BE=Tx76$mGt=fL_nB3C#85fb0=btk_y6BAH&ymWUho znNu!ed|R0BGMq)liHM0mA&&FB?04M}S>qI|6(wRw);OM6F*GZA;XU%kReoRlUtwF0*gm{D ztyfo=$v!+_3@TG-qHe7f1CU99c@G%6c8)u(5aw1&C;J7*-GNlFG-G7v*&!P_fqkST zkDLSE=~{0)egOE!Ga-9!Enz^o{vvyr!Jq%vXU7oZ;(-_<0Kng0a4XmU;b+HxSD0rs zq1~}pQux+dNwji@V~^Gya^Z?&3VEW163LDMTaCsXjk(o*hb4mKjW-mCq(tG#;pmc4 z&?Tkt|4a!c%~*XH68bkmpi`7|6@(;rM{Uvi*m$65PTF?Oxw>uTI-ObaV9ks-e%-v< z^wOW<%}jsI{p>lN?K+WjzLuTog7~jo<3WEWf%;m2@^@PVv{lCg+i4O)@6HO{;lBT) zX1YuCh?}mP_za!?F!q%?1!nq@KGhrljGexl_@vJ8BYwIw{tlYNoyr$M*^O9gPRf6fKRGVa>#8ENwh(Ok?agah%YQI6+RFkRfWyl>x*QVr&{uNyMBa z&6uHKEIFQ>m?2XdJ&nWUG%-CyXz(;aL(nuoIk`au-4%MPV--Txn%)hc@M?g=(KE{iSVcGPMEqsG3+&-*}}?>QObWEf-%^V-2e%#m_HjiktCbY)jA-FfGcIg#fiX zBlHAUU_Coz%dWVWRb3saf*gYdy%h*g0QspPW=fsm$plB;J%BZCO?=c`FA8mCs9ziF z;`T8JLn6j-4!s7#lMqfHxTX`E(=y`%lO7aMGI_DSDcmRRGFw?g2Sz&EI!e{n3oB5t<`UM_&0`BhTFy?_9bnz+Zq?1#n+AE(3QtZj} zFSIfY&#?rpV-bS$_rv$Eidx&XPG>1H}v<2bhH%I;R6Ge z^_yQqx!O5`Zu9&Laxa;{eEb5k$!oy>g@*1_==H@hZIx4CFDJ6!-<$hK#E+(a54rmM z)$N}kYOT2%H)o3g{orbyW>@LZ+1&>A$qu`|B#(}cfgT8` ztwjWA(YLN%7yqGH^i6Jk*&6ywNLAo~{4(-OSRe#jnj4?`fdZW>%Lou4;_@}@2akgB zo-qqtQVR2yDM#&T_)k3j@(jUNE6Q161^51iKxvkB611w=4x^z2!RnO*xFB!UHu#&4 zTN*va<%vNh`f5hbH*Dcyz@ca`*v-hT*rqa}IZ;ok$uz z!b^LP*AU@X{^@Yi$YWA=wmXTxQy0q0WtmIFwo_V_OH|iRLrLp~OyEw83iq~*O^j{X z(8{H4Ma@=>((EaL37KF0lpDexG#>Ht4(`JQqhz9ZW#Cq{P`H~(S5sxhYKvA>0npl# zN(HHcg)q_Y-iQseg?KPrKz12OCe_JEzp5|em!HRi_I%1z4Q!xZN6l|qD_ zum`znU6O5|U%`fexBE|!kD(NNx0{rWnb}9pJopJ1SkF%jC|p|ST00{DDnLlEW8LaH z$zU;+xj4}QQ)`3!?kSVi`Mx1cS>l&z6l9W|f#@JDq+%BH<)`!83NH(!@)?1;7U8*` zVk>8&)z)S5vdvB{E8VstE87**`RZs(V`7x_f>K0{HQSn>_HY7Z z)pddTgCYm2)uLE450f>x3cDH?9BO(8uADH_mD6ZaXcQub-OX$D^RQ6Y6no#1-q zPFW#mliYHGdgirEKYrPi9scD-bCQk^dtRY@2xYI~C(v>0KV<#zu!2F;mNh|st zBmWk;0KU!!{XkDT2%3Hm(zd7?g8<cl3+YH2^n71EA~ppl#YZfp_SkH&mKm5j%9*23}>|Oe1kaTm$#`Hf2Lxk{dcV zO@kZ(TvygK!UqW*JD7g^ZtN3N31Ol-NOe!|ZsqV8K#`L(aF8H7og3fXcV>eeDD`um zD+cXxI|||aHj4^(Y}DA*%L`$h1`y9af$yN$D|n+euCRReqcsgt#ZErBw3|^6obN2h7DZC}vKTC{#mSTQt98iQvXz2x{&h=|Op(N?SO+|l_-KG_I|fA9w!66Y$Q_ZT}@ z&_v#~+THWuOz-_i{vz?fzWVj>r2?2X#sKS~!dv8HuQpC|o#oa>s`&}ux;8*)Wipl9NVD% zJwx}9#j?9Q48d;v5x#gXhW7BAIGWia$({@k6su>1Wl2C8xr#s;oa1;Z2vtbKl^_k5 z;06>Ye9aLA&Smqx)*#bUp#w}n9bB0}^8P|H2a?BUDfS^e5VJaOEZ(B|wa0x5aEH9L zggavjB>#H<7%1a}_g39obf#Iw3GG6tw-gdres@Uz%nh84)LXotSslGzJ^uiG&x}#S z@9%*V-y^W;u>d7E`vV^V`$A@g9n?JomRX>}#lpWqfO{(g*bd?-DLz8j-$F>QDRwKR zbnuWmdEA?1Z%fBrBN8`)YBq*36MGHETNk8W&kIlBu@Z3$N&Ve@nD}M|XCcxmCjGdG zNaQsYb}dc4Hv3&U9dF%`dW}vd`L`W$LqoF>-h>S{7CVu4A<@UZ&{z&5fp#U)hlRP3 z9A;v6HIbJ~p^-dhJk??XZ_XMkn}vj1OzQ8l@I)>X5x1Ju->QrRUK4TG+|+A!GD);K zKSS~jn);gHn5`}EuGHHjD*G3(cLMK_JN?%pf($e0*5~AAm;p3zWHeJiu_@Jp9Mu8| zs7w&Opt_?kI|^VSH9Vm^JI<`Jf448e;Yq`oV?{h6PfDTLaz{R!m!zdTlhO0&CHe4j z5IVbSxywRh54~idUw1GIVb1d>GPjf}3nC%1d}n-iAhj|9aaETE-k^MX)2NT)qG<3e zI<;Yme|d-rqm+nZq}9g}jR^521N>|y1!J+G{@F_wqmz*c@8ZCQ&`1RMIs8U3p&Ckr zJuL=*N6;FXKtHcaNRHd`;k=}a8<27}N27wNCH;PGl7g}rP#U>N7b%d?oCY+;B2b?l zl#rYj6vif!#cO0dEwWh972*MX45Wl*Fd^D$NEeI2A=yl5iWxw^o^rw5(Vnoot!jk4 zg!|T|UK+S6uIr~md!H~LUmR7p^(n{0dN6DyoK-`k*dej{hG7F-whjmNI2m0W+x}6k zFxd6uF$1Hp$SbPYFR9~CGEX~!U!K|6r(67MojzoDl-b&=KI|tJ+n`-O*lrluoBtIT ziIbu;X9L$8)Y{4L*9Qx}GWl&wS%)wAt+vqT+wE|PAB5b-F|NqmbdS-wM!OqMkM?cO zANn{i@`WbHI~31<-p;e(m7@U=C{|!_aCMpY(Y!1`S;|N!#2@(ggP zq(&I3rSd*`lwW2KwWu92%z2<$HhWL0Fq#gwy@^p^y@4!?KFp#z{8ooPdWuV_h>Jii z_CPJpyhSCaO$4`cKqmOXOitzo`L}EaR|jgl_E_qsK+bDtt38$x1o|N&iL^_6^NG|$ zpI#trCpS|~3`yV>m_Cs7P$Vvs)h8wv3#yP;h=yoZ=c7R@t916}B-W-WE`=;PVO-k# zAJ(hbd2%K#zTncJA3OIHM+aut9)c*tja9AT@2O75JozUBZrC3FedDj3TD*icUy)p7Dpj1h;V}Mp;K6eU_l~g zhVg`e64&cgk(Um}D`V6_M%%m<&XdrgN+X!z0q$78Tq$ssV_hl&itVP2Y&qzrX-5He zY`IM2u#>DM=5FI2#dqb$YY~s15SLqx8!aBVrbTM?4&DR~)(F^BBW@#@=1#Mbu*1Rv@E|j<~#A{km9eJlsTiP9ri*+|X`t!#>7l2y0yXJde~kwE zrlH+mQS}3X*8jo5G^b<-vR(xDw#MmqVxR!%0^Kh(csnPKZ_6gzzdcb0oTy@s9iip) zLJlHW!&s^S_5zxdDl5q5t$=C~hinPYt2)*s#;y-7NiQNgm7ONYfiu0j26{?b9v4|- zNN!}Vd|I(4owiO8d&D~~gV&sAURX_()xv4vjoK7tT5;W#*P7zk%oVetH?F=3ESw>4 zPI0p7n36GC)V?V8!G7G3s*m>(BdyVn(8&EIkB3Q%U!g2YD!mf$nwS*?_f#vUcA6%n z$-6Qlo77w+_XJMrikO@+skko4Ygl=joGEOCM5pLXn)9`mB)MXq9ie8&sWIoorNNvT zZE-v~pqw4SGv~&oF)yy>%5KFeY+;w*kY`wSS(n%N;Mnks+4PO8Z>30^8jEpR*d0cD zLz^9MWz3FKhcY)3e?@zvn;m;$&W%@PP;4d0ZhVwqx0PQ9NvG(rDz_5%H0~8N?wOTV z+e72^_))}8rBwcuB7wL4b=pBvNl193r^@`HOoZkS^h=g#@;PMrEE@c@8>q?IP{)7) z#ykJp&gJAN+JAM)G7-ZWMy8)uwUlV@=p@}u%R-KGqH0ikctUEcX<`QAy>;zy&KCr9 zIPU~@dA;GV?gfVP7iX92hHRH@W2W1tRm*+LaPFjLN|$2Kyaj#IZSy+hvBuTQ0MCu< zIz;vM8Uy=cOGQ7#DkLD~!XyE1S@9+tZPSshsGUY0gD^(r5%Mk8q*yJxpM0^T7UKd$)gmP~?g{@I>Nc za5aToJGz?mBxmL5>FIcl##5@him>TgtHF58F}tED?JiAalA`ZCf~hr@TBfv&JWNEC zW$IRRUQL!3oWPVE8ehc#? zt!jdrrM0Z)?(Q)s>=k9G=snz{^CDIzRhx^e#ZrqFjT>)JUEe0x$9%3d5}!09nr+>W z#$$jjvi7EeZU)1emFtePR>ex*P^l8J8RaDUl0tWxy7bVK?dGe_^}h3CnG^2z6El6H znR|eBrh!N6q>KX1hqmlVweO$r8--mcg>UjbvTtl5$pLyX$+N(Lq55Fid5S%77Lsx@ zskyebgTjHJNXk~_w(1ERk`YE4!BH#-?iNhkT$cmY&JQnYXu#|7uN*caBPeEP#oAfo z+_d}0`GV(dU;jds_B78-&1pHLrq1$bwb0}|^@>r8ts!3XP{(`3ddW@3HVoF)@cRHj zr$MCGT)2gGq=aR99_Xyx0A|rn52%^QhySQVps!Y^_;mrBmAvPKAU`NKZIPI`Za}wS z$USIYs?m9$N+KbyQCHj8M||-k<=xs_*7|J|p_c&7Ocy?VDjX5DJswXVx4`%jHrRAu zC7k90xQ=kRjLjdt+`W$kVa=B4Bu>#F30>?CnM-tT_PPHiI39wWD8d~2lU3U=h|d>M zfv+dv&U&BwYh0)|wKN1o51Wwo+Nw=F>J1B?IC87l%?WsjV%G;`muq0u?q5W{{9+$F zP^3L{*8w>3idc|7$gW4gnfX3tw_y7QyU(y1gg55x;$E?*?C8bBnBm1*I1a(PR#Kn$ zFhAOx+}l5s^x`{S@Yjond|ZZA7#x1wdjoF$ZcGjbF8xwmd26uU-w0hP&^`<*5WRH* z@CSUkbCw*TQ}O4BC}%`_m<86^2w}r%aBGni`T3GrDZjN;pL^i<`Si22)_V!^^G4G` z7h3tPSzu>cP$xWcPZK5$9_NTXuJkMuUW@%LR|s>;pwTqgtdMUviWz(-y!}7;V7+&r zmso;@*)#7;9<)!hR9os^=FW`^L(D&){QortZc~4>Y4{6dtHc5T;Qv3=qW{~=?tfUG z(=43-gJHW<&#I9%ByULKlFepuQ4}Fmz}aT8KvEKWArf<49EY|wpAp8}k}OW3j>&FE zFb|kVqma_dN1@<0u^@#0zc_mb=1QaP+c&mt+qP}nHg=4T*|F`UW81cE+h!-}YjUdty;A|!87L?bB^(&auAu+XsJ_8W%M~=&EvvDfPCBKRD6)i9S`b1ed{T0 z{k-YE-S*hcs{HQwq(OF@%L93OAre263)n#>L(G9r6uGSuy+;1}OBLl&@5veUTE{hc z&`n2Rde0R_snr!X{Gsg=Fq}juFxG`w|Hc#*2X;>F%_B4m*p&=kk|R9a7;S%{v;Fsj zyD3s^ctiXCWQ#fte!_mITNM~Rc%YyX6as)Z;QGBmw+!(fCsD+clv zCI0RoIQo;TDiwnrmK#;l>|-!n#E;zB`vHg(k&!D9(&Ss=9qZK?4u|X*k?b_>_7y$6 z&pG73uQ3SCEcBH`AGEqvjE!dLmGoI`({Y+i zr!(=U)vOlhgN#d9-lb^rK+b-rF0yo#pLW2J+S*vq*aEGPP~^p09gmC|5$9M;3%w$C2Q4A?WL9xYZAucE)4sv=&lONa6mRIh!gpNmM~3X&rop647U5&iA~)}UjX)%D#44dGw@Vg{&M6ZePt;jTiRHL2SpEmswksmS>|v3Cm($a+8zbC zj_${hlLWdEjTK~9spLV`0tRk>?4p&mWYJ_ck*!)rx%Ay@L?TSc|!(GCd}lUlNV#9ZXO^9WH2NYloXmlOXj4efy)ryYU6jF%z$HfaTofI znjN;`NOUWmhdKbUbNg?+sY^6IpDV4nx!tZGZjMtqE~-NWcN@xn1uEbIrJP!n6_$JG zl)82QBdu;a=VNQ(P?${E=8+S{U6 z?BZ%r%&8JCgLzgcqyI#oqA(|&!a@g!p^ZUl6}D;7W*@dmbih`%po{^HAxhUHFP_3M z-zCGicnqYke9rq6De_9k?yl~g(lhzxr&xTuh}iZbnsW0e7O1;qA+GIq^a(Y^PexGH znv>H|{rvO^Hs!|T^rdcX@*wSrHpROfQF4JEP}ev5S9q_LhUQ zB#hK9c?*X`)#u;Vit+3*5@RX%VPUa5azYhx@>NHr%Uzfra^)Ds*0@p9VJ#sEkIS1& zco0LV$)QdjsdBf{lB5MVAy-YhCGUB$gcpgUax>I^C+7hqSqlp!6o za0PwaxH=-s)%`qr8fe1W4!cc(>WOeqBs3J1Vt*sDJxQXS*ly^OP5ououK5!PJxLvF zVvSUW69lE18ag!vY*Hp@Mh2}7C76zSKR4{I#p}Vo zQ|QYJhU<+@=$Vabsk&t(ZJ8a4+;dk&5I=DV|A2D~_;#44=oa;77?OqtPVFPq(G5%f zx*Qgz#;fSI{1|TkXnXuA{J9&HI`}4-7!Cuz8VJjz1@H411B~j>r&|#?>Hx=e1ff0R9Q zU&*;>%~P28Q+ZZN97#x3n_#fEKr;P)DoHgKd@b$5#QfbmNi_~Ur&rVxmyK$x4qQ&) zMtEH-w~n;eQC5)BuCejNg>GFt=|C5T-Oz8Q8t^C%k{Lf(JiLBm6V;JF)XV^{rAT{m z+8O}b?2KyCG|;7)U{KP(vguQF^J3aFzok1naj{-;6VU;tY;Oe_4CiJN)g%+$;Zf$x zz=x`8D|E43^rn((r_2|!lIPS?{16rgdo=6w6;VFkXg2hkvCvdpMdD%seE~{f9f}1M z=$+uiRpO+av9jt&Q3>A__k}9Hi4Z5Gsyl8n=$LA^Sw2bNV{jE(Edtz2FWgGyh8>yg zciSLe;OstO?j}hpZi&(249Gv5l{HF_YdZTMI&_a4vP&xVx3C=em4GWAu!}$zn_j$D zmHe5B6c3V|#srO2>2C7{-?!mhPF;xVC|2byZ1&t{pqkp9__TxyhRuTtZ4p~!&6Sw` zH|U7lkXZs-+ssj&Rc@>|o#FPT)FfNEYUC_7VoqzV1{#iWiDt(Ib=>B9Is0U_P51Mt z7F*|gcVa$9C0dL!DctOV%jd}J%tGsS{iI{{x)JtNC4>Hrv!QnvanBU3Q7ZKmpv)nO zz+qfY_`z)VZ^jmLt3=#k_7R$aA(R$H6WnX9^fR%4w!;UhWijS7J-1|Taeo+kg<7e# z`s6K}Nwy7q5x=HS9-L(+7c-oSo48fJZlsuhOmX-3b95D z^m^+U+Ej123`766+811shuKOFsrSnsLD;!~(M-4ngwX;TS?65vjaJaxhOy5&G3xdW z{-lPR@mRHXuSB6$AS^t$&{K6URT4}!x8*!8bfpdP%O*p0iRg~<^?1Qhj&y14H^TH% zomg)YZ*@AhN%^5|GOF0Fss6#ov{qfCooK03OwJngQ+Ch>IC0i67GBp`LJp7w1-B)w z^e4nv*$y&qgw3Yvzp1t38oMLqQT;2!A3l{HPvV$jJx6n@;iWHgd8(t@4f7JSo!^Q6 zcCYdQ{?wk@h(yVF_+Q#Lz|UJ%+2Gn1?kA#F_s5^j|Nq{;NwILSNjaM-89N)>o4cAj z|L+X9;#4myJaxQLf5!D`f^CZK#1i?%ru#Dr>rVU363GP{g-+(Qb*yXdAIsW#QzNUB z1&4jt&-!BXicPn?4Wo5%zCTnD6;u$>e-6oiemefW>*wyQyr%A1p+2YPJD&o#AHQy= zZ>LYc{oa^?minm$hlF1OK}h|yfH@P(1lsV}1S4-oW5LF$#(@)q$xO*O6Sm}>VaKb< zS`)SuoFT_^$UG9Zv!tp2Xw(ujP= zfu;O+aKVKwGc7eOH-0tU<;A_Fj=aGe3gY+((vUCkvIX-YO?hdeMJ94eBFOw4LNWHu z&u*JbT8y<1PQsXK)q%poMO0Dm8W6?(Grpfxgo)zhOME4;(-8&4!uDl2Mte5OCLpnE z)Dt2eBmz`r|333WJWkwblnrq9)Dylq9Xp=73&Zxv0)&a^CWAIe?lUR&{>gK9b}cmx z^kJ%-fw1#`G0!cG%TH2r7XF zH=Q=b6+F=sQWfQ7EVLvh$9!BRor<2bDlR@EISF^skCfMeeW4(QG7a6~Y#qclluxY1 z9{hBQ0PCGaHUzHicv{p^7|UGN2}M!}Q$!l9r?%4GMn&1woNirLkV2$`q0s5-6jv_q9)%(?N-F~9D@z$ZEu#0`}cnmR6ZO@N)Jlg!k;X?n$;TlHzPmipt$evTdn@KN} z_6FlP9S|S*>O&Ws#lqsI=jf_*97g7s-ap_9tLm0Wi>23SB`eqzWQto!Pz?)X6XyKDVuQ%CYyieCSwL;l z&B#!~Tw{DrCF+T1?R()tYr-a)Ux+@bW#%f1o+#6I@Du=I>^lKk>Wd<|o#vX5(6As(-24LZ>j?L%PP31kU1KNsj3OvpNL z1&B@91xTS!8UmNW8Khq4`&P#!G{eFVd#csz7hupxeE?M}xn8Vhd>P*lT}l7SdNgU| z>zXarXe-mx40C*ibprh=-$aK@cQ)my=p0fu;tJ3}Cl==0%`AX7fOY}kdOLzG6+K6j zJAs7SfSb_9^p$~=G@wxYFbn0=-_B#)ME7G`mQ&Tu{CZB(=&7#+^2J^39ovUJ{}hEN zBdUPm>V#WalsnSHHsbc%ssYL-|J0SMCGtzxH0gxUD6ARy-slJS@}#e-Ddz^gLOYVS zB>pDb84q4A^SdxVWXh5kg8F8Z7J#=k!Vj3Q2!0+TvFIMZ0%24Ewouos>-v0nXxwW6 zi3`rlVG5We$|H~mwlq#y`%PqHA2cn&h=CMM@`P2`?MYuzqosaD@Ks zXsntL zIu}~@lhXR$fc1;U)DK$$F}Mx_-?M!K`m7m5a2jFl9PCLuFwY$FD#+ni{w|NXp&a5B zb3iu*0M-F)V@&`gRepf3a+q<^y_c~$%Lf2|18-sex=(&!#$m+%q3&)$8f#&xJMEWK zx$f7tvSU}Ue8st#h0heQ%AHQ%@MBQHY;1zB3BP`^IMtfpm3K^S*xd)qwgvag!v~b2 z0&>ycMBV%J75e^a?8U7EZyL2iZ`stu?ds)$V>e%xHi18sVvHdguLb{8!vLMqk;y(A z#(v6kDe>T0kYzdRJ(9ZxnTa)Eg@$E4>*ZN+tSg|TMQ~gg)S8S*n!W2WLy=*<>*dCa zALk6#F}6F#21QSVlm&K{F;gCq>OIYt8sbhE#(opDNR|?W;~`T?WnRdOji_psCeto2 zREVG(@B2;>C;4TEDveQ-J~%=@i*@ceD#o!%mRMz?@KlWb-tC2Y;N{gZueNq z(4zRXe(TId=blwI;K)(~Dlt#n;SXc$hCsFk&$cuZ1ZRJ|Jir{IU&}w-xE5Q_`b|6! zb}v!7?TW2U5ohxdWFN|c0cXj#ZnsTF>zbN1%hx~cZ-4f1sBLqdhI z$My8_k_P-x6j>$mB34;!uBiEJ+X9X2O`A{1i!=^I){k`doF6+5o!1VV+xDHCqYkgj zzOJp;+#WR}q}CAY4u1t^x>;Rr{b$@4MYREt7jS%Hq_TZH4D{kmJ=?y%> zu#gZ=iU~#b2XCb=Qw7t@9FCirA;wO*tanE5(z&iek)$ONHz{2OU`5oGZnik9om9p~~#I1@LiXr>K)K7TZ6@-R7OdH0ZU_5C z1HTX;=*EO>;K6x6&aB(Ng>;v8F(Y0eJ|G5p@5FVPQ1Go{zzU81ZK;TKlukckSA~f1 zu&`j7OfPkco|SB^n2eNcViZDebG}*vtt88ullo7L44F{u;Kj?&h4NbobtN`I3s&~6 zsODC&&slh?88-{-@pYdNB@o~ws&LgLgSrE){3Rv1kdSu)QZFOTo+Y8e!L7WmYTPw! z*7s(ro30Yeqk!2|Vu+Nlqp}GjajKef-}P~1c64P4l(!O|@nNgoUzVy<>qK=k*eCZ*7(7;kPSK%0_6z9i%x2eb2{ww8Okj8f5Ph6yB;GbhCSDp z(&Wj;48*uhsMW{wkGI`T>##I0x?2vbJJU--$cP zJQ-rm^UCZ6a+0VO9Jv`xbXtZj;)hf%QWmVL>(Oq(Hktia&USRw7DJp6on7`(Ix2A0 zw+}kiPA^TB6P?7y#v^K+EtbxUQp#=Wlk%rNZJmwoT<&@ zftOcKTkkEL#0I~E$n|^maa(n1W_cu2dMH0aRDXKqr@+2evQ>JM~%JpZd zfHd)@*WQh6q0)Iwky0bel1x!XV|?#ui5$75%OauMi+7T@pk5LiNXA`5Wj*~MW!O+ZWkXo5v%2ni9=~nfKVXK z|6Ei%5VtA-fGU7$OZgGFRBeYX>LTs}%+jbt+kTya6&8P^Hx1}%yf^me^N4oTXy z#e|%UEOTR1vm4fGwPSRBJar>H=2*buCi*M}qZ{UOZ@%@e|f_t{5`Q z%7%7GSix_S)}f-L?bO14?X^0UuiL}w5t6!MI-Q|sl-tQ!9NLLkIJv7?j6$UlF+(Go zHZ|@W5m7h3)tZRMsN|KUN!QUmpxTztQta+0A-qV8TG3DPoHoMfE(^w4_pc3#Cr>n~Qt^Y`H zZ_Bg`@iY@U2{%Kp2Ry5NsM?n|mv)6Tio0{o&6>Q9PE1Wc?_}10#m4sGFDSSmJ_f4s zf$>6>cq-ZDM;7Z#gy~}<5b#^YYvY+}EXF`Otj{^f(d@g*{g28b`?Cp$Sz=3^4DMXW ztXyJKYq$lzxVqGR+U9uF!uhY7_J3j`n=>p63Y7Hwxnw-iE=E?h_ur&X?mWOh`Hj1J z@dgmKqGzCLKp$DA82byjmF9^fKy~%s3F4^u8k~$r+2!Eytl(d#7qAoz&G#V<*^^9M z3^mg|bi{!kcyZKKsKGr3OA0R&SxB)s$GJM8m#4sf00Ni_XvbX&Rn%e?8 zG2EB*2-*X>V-2sT!8iMw3fU6{N{G?t%XQ8s%K%c75qdmK(KF4K!eC0He+O0Lt}*4u zi4nJf-C4M{26EPG*=-y`=8HjlTITRHD)bjhUQ`Fz` zM|8!%AM&VX2$_h5EF+@DQ<0((_}x7rUxDC@ikl0#GG~N3O!&8A8m@3Jm9l4q^~Hk5 z!mFe+AM%nU_@c7y*S40%^3Y$>i`LCceT?Y5!8V8{_RyM5dV6XSU{! z;EN6K11@@7sRUnZO!CRYkj&U`(H6AZ3)i_vTZh>LFJEySN#g6cE5qGw~S!$3oj?l^O|lYyUQKHmcf8Gj-8Y6ciitl zC=vF7+KBRXXVgxq_ryc21?P`-rH+ZEfoFHqPJYfpN1Lk7Fvx!1Jq zZW-lyG>q?5xGtzcn>Cv%Ps&tHj_9SPtVz^y|NMemxPBAMI!>|VkEm~F0$O^A5W$e&0>iOj|DZ21E<;BZXCGj3Fd^6^uVc5M z%d`@|ror0cYaYp;F)CXvZ-u&e!1iRd%?{)*O~$*Tm+{rk8$Uk2)2`) z9$#0{p`!*(O+K}w{-CEemYtyUF;H?pj1WS@hHlMK;ls5kX!cBol!sd%@-$%bcAA`b zw?axKvZN2(u<0X|ECLyp*jBEy6{LL;1Dy@DD%Edbs~sHa8caRWZ(y%2%J%X|VZLSQ zGBP$ObuiGZ_lhj`O4}FjKSMrQhJNIEJZV4FK;^MvshMH=IXAF(;#uG*Kj|-5ZO0&9 z9FAGL(c-bAsH<2PcWwW zn!lg23xn_hdF)K;5b2HJEn1+g<^i+oAg{WhjphN3>B$#;%)nb*puV@Ds~kFY|28f5 z1A6|o9`CtZ2Q>(*6cC0_mV@#JmOr!E8BxktaNtyMJX{v~(P;oBwa=`E&XBe#Q~B!K zV_PtR5>mYbr)!N>8u1&81TBX9^$*pBVJ4&$m10I>UdAy>{Ka%4gf=U0r89h|sqe^g&x4K`CV) zKbYvXUvfRmxHcE?yBB{us`i*~Bd0|WA3_C`y5JD3>qc=r zd*JTSb&bYwJojyc6nQNs3^CTP5f%+~oRO$|knK1^S3eE4Bfr-6hoUYt-5#~n$Z8!u zQ+t4d2hmd+na~JomZE670cW9P^NCzo1nwua1d`@G6w*I?wA3 z)ieDCQGmu;63B4I0RlsE#@D|UKlmG$JLg`-gJXLEN=9BEf`6i=vqk>U?|kp24tb-) zwEO~bS(+j)!Ik|u`Ar+pA5Kh;gTM}ztI1uFkts13|K~Gff4-Z z@9|hbK%)P5!hn*ssjHi_`Tx-1Rn1-h_Y8rw7#CD=w7%UI>BX?%NF_8Id*!(%bdh?a zVkJA9%JPEY7L0pZ1I8=>pgrV+Y6)@ZR`K)e3qxF)4TL9P=8Wr*E0!nr=Qha(f z^=`LCP0Z-p-rRoOY`t~g?fLkdSKA97;J}3qhRy;XAKERf1&;&W4XhD}EM^Q*Z<;wI zfbt|Z+&A7KC{$Q?=WNdMYiOMgPdo6>jR(Ak;-1b=;WDh%z1duj4r zQ~4G0@?BH*UdCNpLi(SH=Sxm^$29W6r8jqF)Wxm64K7Y^>?QkD_4PATfH75zZZ^hX zMK-jg1snl$l61{;iz3S%ycr7KY0NkcA@icDUKUa*njN=bYJ!-#%95FP3$E`7gSI4q zpik&`1Rer=1)Bd#;$mS7Bzgn3TDAHSTd?ei+;aS)kIIUhN~pZYXbA+e zYxuB;sppUy+5?=<@nUK2xo=Z}jco(db=KCHjQtsy z*&F6}Vm>l6HdzO&A#i_C(RZ_^L027z8t;1liEqEJ-rpz|rz>mWDOY1! z5Fl*I3i*})y%?zO6Lby68k7*z?*A#5S((Qb`j}=DudjfwNVCJR-)t`#SmoxWIWTA; zHML_Ho<^^3i#ynB%T^I*$@uBcR}HBo)OYJ5~TCCOS8y_d*+!<_T^tvFqvvqc2)rG%oR_HhP9e^gooZE zOJp5DL5CXlQYDLxHUtkkJU_rU>3}q2HlSLlJDMk`IfUATHl2V;VzNF6PyGPSJ$c}r zpjL3t@S#q!9a1N(9n3w@3Vh;w;)pmYywEu5YgAx}y$v8d)IHU=Xe@4%qu&Xn60um@ zLu1IKlF@j~&O>i{0e-)s>dWXO?P3STok6Em8M#nwL+y4k->9XaHpux6M z1jn3OkQ)3toY#er3}=D{%+goO!Fo_zSh!W>_*KEeYi9bhmES=BMpQ<=a9709s5~}@ zk9Eqm9#mOocO;@MT)ND}M&raZ2g58g(EJ*{;N$KmSx!K6O*>bXq`DY@YcJ#_+%Iz-cS}HMuRu-~_L6 zFuH1E1i=2%RGRCX9oDF76@{Eo@WBBgTrz4eD{6d1t4mTU`q_6uT~h(o%!gB9`~`#2 zAX*2Jmv$^UsB;EVXLGqPV}{(gY2gs;{Rf2Z%*vd-nV!D1{}fCBR`?|w+%8xLM+b_i~k5eag zRi{~=D`B?c*<{*rnZvYtrXm3wcrEC8c&RTRapubh4fs0L(3l%U{+!EzsVr7!%{G-; zq-T|5L=t#uMbFmuT_I?<{KGw=W_HCKt%L!8ykx284>e*74r%5etEU+ zeAWMAPVk`6Kj+yGt0PTVE!>#S;SPj@D^PM0bfhalnDS1`tIyt`4_v{hhHnolx&suP z@^0v}?^1I{cJQ`7a3Noe_Pp)oX!~uHajT*%u6j;OUtBX_xPupW(^J^RB^H z9QxmDq}}W&45POT^uM^sbJX0YD48>V4Y}U&q#YHJ?@E(*G5{x!L_n16ng6eaB!;J~ z*-nhcfMk5bf%sXFPbo*YAVf5AT7QD*30>o~C}&;l39JXRHG5h^ll3TfhR_tty#>ZT zMQU_f61<_5)5A#ur79Nq%c_+9Q#v!J_ptB(WmWq><@X`o76|7@mycou0{Su2135Zd zGTM3ASlThVyV={P z-$%E!sQ=QcZvGFi)wuU|deVX=gBbVGc0cX**JJGW$Iffb?RDd~*BKd5m3by^&rRs| zT_JAIeyEA(JS?06&EV4H(_eX%+W0q&2u*39tRW96pR}PLR#4s$qSR;nP@L3f`jDd3 zrz^xKoS#CuVf-6;gki!Pd&F-18-2uX!W(~tVEh|tgkZuOYeaAS8*M~y!W(adfBYL| zgnz;tXTnGcU@*X)p1EOB;>?ImzFsMbcDcUcU92zpX9h9 zI>xN&6Qzp8AJE&QRJH_oscJ>!|6sj!7+jfK){&0|YfdP2$Fw#EiwzKdEmZmD@+NltqVm3~ktK+GY*n@4slVZ6POJGIz=&teY{~ zp4-JXhvVLvTGBP}Xb?J-T}QhP*@)shYjUm7wYo}FRxelNR7{^EOvY^T3_REKv{&P& z=n)R+UFbL@@S5;$L|53Z#7)M;9?!tq+dA6U6lXfi`g&ScH5UNeo7Yj{AT+lujb=|w zZWaSeL%PcAW)J#dP@P(vo?*N_LhiDEAUE=SPy;bcU{4O052ewS3z zuLlyaFBd$KFuA*{_;Zi#kKxy(7(_lCCPLHG3`U{nQ z;QL<6*oH5e5eA!l!|0V2`$88J+QYxYUOF&s3&GdLO*DC1+X0$(wREP3nhavA2iNg$ z^PC*C%`T|;lV{36`!VQv^WEX#6HR3hsUqm!hjW&nroyx!I&qc`IP~ck8$s)nH^K=a zO(T};4Vo3lDOi}v6`IxpN-P(bS8SFQmQVCbZ2tXXwQ;PH#FZ;p@IGwnkuSQ%V88GL z&zLxkw{H4lnudTwwZTxMJSjhXUVq?q-(7wbAR^D!t;vri`|`Y>U)S0c8CA=9qGlj~ zHT+zA{tuZxM_4o0aIGo>w;(u;D}}y)W-)^t7~p8K|mwI!<#$y(a- zp^stc+}%~*6Gsds15uNh;xeSd-kS^5YBg6BNvTbnwTx(Wzu!cmPH#|<}$KyE`+hau&v8hW}bxOa;<4F`s1|s=+cW4{#TOpr=VmS&6Gq|%i>uR zSI$7vB6~g=inN@b*50z|r1LPic~P%54pyxbwq%OHmi6&`G|KL772Jb-j4)4d$7-)h z+Ho+1q8_%|fsVy*;jvvdd!n#aIQMtTos#Jbp&#QjBy)~6jXY{#|AFdjpHZCQ*DeSgFKcB*%5phU3)u5~;*OUi}> z+KHVinN#Ks8V%hFWdu2mt1MG}i_oeLLZ=O!VJRA|5t7b@V+E=XMRyI;$eSwSrWcdi zlD8L{{LLjxRR&!;1})n}8u<03{C$XLiqVq{v$F`cj0LMh3&bLF?nv2qMBP+bV1Be} z%7BAqmcCZwJhhgC=Hj>=jRJ5Z=Y%RejyTaIg>bIqPJe5}VA%E0nMe>A9Fx}fyItzq zU%P6sG$A>Y%QbK4g)0!~oA6obJ0LjOJEDkiscfQqCO(pWX&HW*17?)CBu|jsKNgD8 zcNm_PS@!X3xND(9Si~bx%o4wuMWRb1elBE_Xe84RtXZW;4_N^C7DN9sSq-rheZ=J+ zD2kq9Ij;1U*a1{T)_yR`<`{>x9cyL68b-_Vv<-Q*-raJSmyTq{(1mvT=SR~JjuvUj z8VB@?(A2aUG+~}`guNv)G}?r9su9%oh>lhz7=Q92MLm9%eh?QArnht%+56b4@(QuA zpzjTNLBg7(iC~I*0}kgU$zBr5r3Ei}OVoAhn)sCo=dYq6hJGiLbz(lwYz^+3ID*I+ zeF+g0=9cgfl6ry*;u&x9l7VBCOVat-mxKEwAXC5y+2lJ~ShR!GZ2*rF?>oT5`~Kk9 z4(1@MQp_!44F9F(`sxVn`d540C`b@SHp!PnFV%e;kJM^(043Uw>wKe8aac4=0iAOL zR|etW`u2g7{eE$xbP}=Or@6&bvyX)L0SaOgtJx8*nWP>Jt4gPemMz<-qFg-q^`-L^!@!V8KD&1AB;dFfWTV!Jf6#;Zx-A_n=w#^>B zer)4nnZ?5-BiHaI>@?OC468!pWr$%ML)GAQUG>1WT-eW87jED7&!ofYy}20sTh*f% z0g|pacHXI~qtDZ^_Lqo_w0*TR>^HsY4*tn@^oSwxw|Ek}$H^(9c4lvxI}|>paRo;p z;}LL5_7O7)?z?>@7=6mV997tM-yR87I88@9kkT!(4swU&S=(H>Tg zD|C0>r8iZwC%1+cP7}{-Ntjx{0$I(GNe~CiZ-~WDIa+vTY zvXo-oMaX;lCXA`{z3}t~_gb(Q1=1sG@^4PCpC7mXdQ!rD_hK_(EZ8*t@-IiQ%PGo?xKgNAmewvU5ITy3lt3DZhm%XDlS;CZyLh zcgwW|v9&_MVJ@w)}zMbSKs?j*uJ0;#ZVMD>isL@rbpp?LwJipXt-5^ksop+7o>s-+yhlr@Td_g9|Ex_Nah~3K&oh% z{NH-9J2c*jQJj946D&e&u-On(zN*N*FaD9iI;fjwQ!IMr3m&~ihTIN<$1OfL(h@#C zH`I~|&kLxMEp$f>W$-AbfYa(Gu%hWyxv>LR%% zScljf8A>#Iw>}aLW*UAs{MOYWQH*KEZINM?R!Yz_b^cn{Sm!i+-bpK^I{z4NJL(OJ zg#*T5t_z69ZRYH#L5xH0H&9jm#s{VdQT#`nKdeK*PY!ux=eS3+ap;gqjU!`Z}N5u#nc3oFdRNS#n>}A1)ZRk)y2e8 zAb_$-c#Y_)f(rqY<&Pa-)sayWIgLdOg^YOaLq4f_BfWS_G2f9?d3~{6YjHN@t-1kx0aTxx?;WyDd=^T!j|MwJnH9`WCh)c!`S3H`r^&h z2QWTrD$L(*y0IY;I;}B-b<-WL9vMW(USt2Tn6Tm@sw7XBuUuS+aB=sz*yhcBYeQY@ ztwpCX$Ykb&%YQqDBlp8WpG?(X2i(uQ)83(=0xSr)k|aIEeJr_vIX6LH=2hIfdznPk4y(p5UQBm@f8~P7@%j z^POhhLtU+@M^g?sSrLX=xoS#}Gr5X+q~J`LQ?(ZGIn?-&tWq}k5)@2^j1YAtsSM6F z;~PS5zXrlC&wLo^=W{`J-UP!3{y^*?WZHM|08aX-0GDp^y?t-nK1;MEa32Y2sy)`o z3(y{x+@IVMgIp`D$4Ug)w%18!zlxzgOJKXe;yUy^nC3bhOD|A{oNA@GdkL(KyWd;z zF#zb5+y1mv2v-k|qFJ3g`Q=E)QVt*B>j2#X{8P@z0wYKXtQ=1c*L~tmc*C$9uhZ8) zzfV74DmXSj;CC3Gl*`(FT; zfdc^{p#TAK{a?Ph0WSXsL$rpj$D#yMZu2o0GX*D92!(Zk3IGLi5sATGMFz$0U%oLEcr-2wfU;(x74h7jm)+P!_BNDws2c}#j8AB-p z!x4@pQUt^aQLa&}5vv5}BYB=1EHMTdK@?zx)M7sktKQq*FF(tf7+e2)-=K$Bq+XmD zjsDp5BGq8P=G7aT=%~o3Z&KqdtLJm^dy$w|z~Xb9Wj@PX4P{_t#)|#Z;*~KP;xK|i ztD;MH?3~HYS>G?D&7uxJtkN;3Asb3Rt#hgi@d8&eMaRj}R=n7`Sw8lwBWCCq7~Fs~ zF`Mo9UQ4y{w;eA+E}+|JE{Q$#=nRMjf&DpIn5ZF<%s*I9oqk$^xn-a)?^xW996MTE zBU6Xs-uZwIU<(N!Ns;*u-`%(OrXwxYoo|2E5<9=Whrwv2(ufhlM4r|`4Y>F{*nxYv zJhNsq&Sb?sM?1U{jTiiw5YZatLsUE7R)Ee%jLJtVUpYXuLV(?Xmx_VuKGOt~5!H#w z3O;2;5pIfQWoDAp|J8J~o@3i}W^q4O8Q6<*s}<9tUtg^8yZS&&TelXC`amcHm;C6A z;ans)XIu*6Rwq*jg$9#Fb*V9fj-Oc^E9r6=>SR@dka^GsVwz3?Rn6n+PsPvB%v}=m zubcuW6EOA$VygAhJlxLe(Xr08=FpNwY znO395p_$!buE%?O)6+K3A#B2Q>lEwe(7;HjCwcSDLrJmvgiN+;)%uyr_{d#_*!H9L zAid2L{mo@=Q!b`nD&5pLqruUylSg~|%2w#7h3wTE?M1srGjnUm&;}_kB zb|Nj~I$?+cv@n)z=t1T-#XDiFk$o$y5@Sv{bWfx(M<@amAKAO#d(8bFV7sVlL^6+s zY>fZwg(MIXHvj-;2-}BzOX!#ThzcNo+MwH$u&tMXLtx_`XIf6x=))PfJ|`nY>@Mfn z8dT-Y*@`w)+$-e##^X9ALpf~cq2r4~BX1B{I4o3Oj*DDP{YQOY;^r^JM*C?!Z*WYA zyi@G2)>QScrmEN}qMbYVzExeS&0O-{5@c4oYqy{~N)T^wO#osPd3UfCjB0Pt^7d$H ziPcE4-;xjV`*!Ux81*+XjyY^y9{s?_o1c{X>-8a@r$~D=BSX&$!dc zV_XbBWN|JN0&yw;DlRDRhvE5Z?3N=zVl%uK%^H~!t|6u`eBt2pA|I=WNG%#zP*Y%p z`cC%LfFACL9mLixv#VKr>%#ZSTaAsTlD(pB2cEq`*V2)V(T*JAvPO`P@Od`yohHJ5 z2|?h70ivJbqvBQ;<-JyMDCg<8z8(F+6B6I**&$F*mwjd(Erf@5BsL|v~c#a(6-$& zl9(nDmo~E9!d~NP9n!_-xryV%7~^YzW3!0^%@|XcCedRbQ)z(n(aqMfxuW&5aQ3`F z)l|(4DXn>kz%pOJE`>w-P2JVUdL*4AQ-AUsw~7G!2QRAu$bN$8OH(mW353{Jg%Akk zJ{3t{##Era|AKI;R6UTTABMykGA|vfZ9*foLt^xh;oDL96bgQGC>=tjA4cT(EqIpv zww!t(3V(peOWw1k@~IU3RuudD)v({uYT{qm$d;oO&@kevzu4>w9#J4aKU+`0H%-jQ zprcW=KXD~sn_b{0Bv6nLa(@gK>n|wCljwjA){OBTC*I1e(X>|yu?Pki4-75<#`_EW zfB*VxSAI-}!2$s}lK=rR|9|`X|36F6>0Umlqv)f%8x1QMu&Ic6a3k?xzmbfb$SH)N zNA|Qv@PzT$froT-vcRp6WoS)NNdUN3NhRkg9FlQQQnE=U@RFoke~7ymOEecc7 zvk1=bCBM%orFXONt2GxGBH!x;U$W+Jre0r9ydRG&4SYXQfT}|LBkm9otHL_PJWC;I z_8AbN?rLzVy0Zj&!l!>`g-ekMW&rE3?pU(tLs z-g_j`Nq_l#eX^%e3En{Xq^}v2uc<416Qda0)jI1H!Wuq^c?8ux$ z;)rr1fF3&;>|1fAlc*sXz?Y_Jh*fZO#_`K2O5bAd_kO#s!Nv7= zm^M4z=)zc;LS<%;iI)~;K6|;?qK?|i(_K6cv}D=Pxn><(S9&OIya=Hae4+7GYI3=7 za<4v;`nzew7_vGp9AX)B_A^tp77H?M-x8tvQoksVd()G_R^HsR7~U_Mda6Z5vZCKg z&38cbCcvg)B1Z+v$-fix&1+7SPSG4hUi4OyE~JD{i+j3{84Bw#2jOZ&W%?s*UayY@ zk4;|wPFyH4^suBv@6|+3GV4JBgY-B9-$31VEUl_K7{)mPL>>Y}RMF@vzxf`aG$oIS zxeG6fK&l>|KmF0*nnCRD(Fp_TW%v^C%tysop+eKnt4H~?i$>#;?BEi*BL+5 z7vF>^x@=fQ?)!TYvPQRXql+7He~Dcu)lsU#a7Ek&1N9d>G50x8J}`VK1R?ppy21SX1*8~d zK;Kb6GOX4-aBW7{_M7Y-Zr-Wt0k}Wqo`Jm*cj~WMV18loU<^tBAU{x(z#zeLA5l6F znIGC?t|MsfV|5meliLjFPvFBy!ji`lW+IYpB7Cgj_MR(n2pGU3DAyt=@WpQ~&(8}` zPnXA_J3_f7g(7hJ5pY-Mv*fsL(Ft6i?cRpw;Gj1~IiYF+G_n$lZFo7E6Qj)``a!Ba z2JvUhui0fG(@$ds?>1rKs6&J}T9d~$;Ms6=Zcb5JH^i>*fuXQBy4u3{x>*hwp30VV zNb1T7ee`r8t#mM}7`y`~L6HPY4w6}~9YZFzjCIxDb%B7HHtx^`u_&4=Ek-}U8lZ=% zcBXgk+VvJ^g~*M_<;{+Mc?a7fR1rB0d4LqVcg&!gBvg>CCVp`_A^=!sgwn&cz*?{k zr5C<>ghAW7&Zd+zco!w>JinnKD5bJbGy$I4fW#N(fC4kM&~GL&N&$dSiCza?4Jqw^ z*&owKUo|aC${vJUfa|{;I2WX(vI*Dy>I%DJU7iG_J>PNG3y(tYa=q z#1T~08162E97lCfkBRI+$x$#JF^600H_xd;$BlRcK(ZZKf^QBdYbP)2raCnxPCpw! zfC5)y(->!Sx}f*>H7%ziHD)&^m#6%rzm5EaeuFa zqzI=zYT4(mdTzlZd&_&eD9m4a#vqhKxs$22fnm^)7ToP6qtr5>2=Hniyh}xLphb+5 zOMClC-j5IiY#W9UlhN|@NcmYc5B3ueWJM3g$58|{ls+Pf0X_{w$B73lkwak=(mDaa zzG3`fbvU$}pN$Q3U8B2+AsJpDjg5@faef^%uyh(KriSboH?&PgL}rEv7|WXJoudK? zG_(fkt@&lGhGSeIdO0IqC)Md3UGOyloA(Vppfw>p>rl_wi6>ASOm`w{P@7CJB5SW3 z^{T3d=XRghY88J_P}2m*HAsZB#IURqtK?6M$8thJh=XabBUbo z!aui!t=J*8Ws&6Ar@--O+>ftK3#TosF3*nW3kiXJptT!2rG5XCAzTU2$Hu1H599R3 zk8NMj$o%J1O~;PFZ*O><8fqm{Z4kveglUOseoU7bVx?P*Nw*}Hv@uqZdhDq@??@Jv z2HSe-(WeiG6?N6JD(x|uGLUXXtG{{h_YFmpZ9pWqqls^IB|zxYo`F{Td0i7D**WKE0)L$|2_#%Sm0q&$Y)1uNF^f?6)el^_+W`n2FW zIXmQczdEj91Dpp=^xYztl~Ssqbzyk*Vck*+)fNBrf-Y+(AxmfN-nMnQm+FX17t&rc zkd;gy-7^rAvMN}4D>xnpFb!9qFp#~=h^~mm6s!W*Ks5rGy%;Sq>pBWELU4P=1@Qo! z_5gH}1098oVensU`+G(+EhJ@`AxTsKzPLnic~H{N+HWmdxN#G>K`e7;BOVygW>hbj z+gH<57{=;US*=MXmCHkb=@OXT5ny<80^-@KbU1~J3t4)3-%NYea+60jKL7=*DdHXk=nt@ za1xV_DHZFvQ2gv*g{m}+ym4gH*y}ow`r{U5&)6aly4(&|KhOI2w{_}aw~@Ar67H}1 ziKrmSD$OgT8k<>TD}Vu!C@PcQfe)JIoq8D1#?FecYCDqL@CnjZui*mx@ijrK;|IJ! z-eqT+VTro|lzYd{t1vmgiOz^SIOxs0%SB;ze@-=(e6H1#^Y_PkKQqB|Zw8(oF?)Kr ztCiikScmgy1ueW}^$H{L4f?+i^~GKS#Ew6bPQZ_q;=gI5P&PKSv9vRnv2=3&f0PKM z*{Y+eBl({S3F+zdbNoS5j^DufEt?W<8Po(8NDtrNkWi@BYTYn2JRN$oBdYNJ;J1Oe zoLiLb`yWBaipQxj#&8^_KRaoCyqjlsYKzCs_3=f(?+YBr@|6q$CfUdVQtf~dXg5(K zrXRZvR~*0)i~1tzEq(wT5k{(lvYRv~!Aq=2u1Hjnq(SmKW$5s(cPDHl2C7PYPZCT9 z!snlmFOxoP#Uo2&Ny%|1Tn*ZVE1N05Zf$0T?5cO6W`%4~;i@uBZB@ME<%NkBm3671 zDs1Rr4sB2_)gbdLYY@x$Ku1eO32jmCgsl_bX-)OHtE+Q}phb(`{Jdd*-BY2qSMes< zbwUIQ1&m8^wMC0yZ+AbEpA9FJ9ng>2!SwvOs)8#v_Ao;(i1$`>;FnsBw$9+M_>En5 zEr|W2Kp7_SCaK{SeCII?Ea$Xl_$3pFh$A6wX>0-F)l4%1!JruKOxG;2nEtT_Yd}$H zEmmv*_Rfk;b*a;KZhaN^YMWx~-HM>#wv^>`zsfwDtQJZ%_0ic0P7p(4QP}L4yXvWj za_u=r-s(h`ojptX8D4lXaM`^!8{qeLpQ%u()*_x1FV~+v{7&Va6wAWlqQ+~7?o{f7 ztx~;>oqV0atju#Gd=cHj19fuM8G|tw=jOs%%b%e6cg`xS9jG>Sn|8)^Tq>=XkuJZR1~6q`hM7;VxPGIy~J zmIY4Uvh`Ee`@o^NpBFHzRRg6!XbI^%)Q>5H2Zsn_g4-=%-rn~r*q|ia35?eD73;Oy z`MfoEo8Afp;i1!T;@wGxX=8aSKX#E-F;3Tih}CYaEeehS+?#dH_6!$|AJb=W8$FjE zNsrhO^nole!|X_RLj~;wO*7CXHkUY~Au>soax?@p`&k1(dobY)7??eI*+P84gavp5 z`j1F~^j*)fF>$>R&oCWR9CM#2;vEK9rrBoeaCoL%#lYTkZMb54s6YiiFqrY8Q^lh? z!IVnCvC;7LH8&y$@WCH_yhH0-l(3*$8W4JiYbGdA#6oThd;{PZ zIH2$N3OUbp4KYN9^eK$^+CwY}lT=X#Cg3#cF%of??@7MMd4_x`(5*S;#s{X8}D`Ny+v5KqEuCXax(gh;(2T|cX(1qp-%jxU+o!@oxxwQU+T-C zG6%v7Kh8FY@4Ehw;QcIjLfbxIH0zGjWS@LSSy6gQA4>3PhtIju_>Gldoc-w@pLfx> z16`tbE_8 zfika8MDD8pagf5%2BC9qRS#3jLzgnTM(!;~rfJEiZ67R#B7bh=bqP57{*G2?o`nEe zI!M|P=FM&Ii4e(`YQS5%Ep(j@`oi{AOebx>OGCsP;ZT1sj_8^2f4`OwXCbSs{0KCS zzkq<){(Az=|9UO|KSdgKXm{LUbYJW7M6%jA(wTh{Igo-eDWilvtTawboAp@J$(i~V zR0`Q)F+H9v2^x|g+m{e-X7F!B&v~VMNIw6Txm40>hl07FTr|(tr$V=L-JiF7AA48Q z+M{hw*ZY@$(-vks-!mTe&-JGS-e5qP!7vYPWoN#=OF}M33xa#EbMSGEDeTPJ|kzEN+dycF~Sp)J^cFg4j&us`oZT3HO8U-0|WM1fXxdOw>(^I zddAN5SqZYvD~g%*+K0Wvs`g3PBXk=?W%bP%QxErEhUFMs4foC& z{?shl4N`@Z%uRxyqiY+qA0Y9pqrcggJIC)^m|ctFwAfSn5t8adN7d%snr3h9IRhjwIpg^dU2>MWfRYQwFQRrwRA@}Dgi-G&^ zAT>@CQ?^7bxX~&eb`&`ILVZyKM!JG{vdHfR@lcC}?uvFvAy-vg*h(tCX7KA&aj`@x znD!6?VBY!Q(n(6x?&c*WE@1kNq!nkj8n_B7^pe}eBuAb36qBq{GG|S7RGh$N=96*% zY;CxwGGitsOd_56V&cnk_pupp*gBJt*_EuCWKS8%Xqde_HiN24We9W9(5eIgtN#3x zgpM4(DFrESg1vFBC5>!HNvTo?3gXk@PB1ego7@Px{8&BfhFYQ;n~$-R$Y_&fS@Kvo zGj*A@LV<$#=?s(yNn%<{x@W>y ze~*NDTO;D4I(N9_0W4cnk>?-wLK&kyE}5RI)bUi2#+kg-fw}u+=TR&WZ>#~tlM&pE@(P(d9sBL+}t6L z^yzs@p5W#YXs`!~i*)kKbJ7#btsD2tE@gvFjLy({aY?d;aY{D$+95Mt>gLB3SB;n> zTwt7Q6|6HXqh4&5?q7w${@ZKhwGb|B>mdMUNnm3ZhcK!M`!~1@5w;zK2(+p$Zki-bMO} zI7PAi1-rgn&%+WpMP}*Jn2CX`nW>xs5Z40+n!M%2_jKqb(XH)hd|n)Cq6hhkF#l=QP2E zx1}8NdUYx-Cn3yAWYJ;w3Hz6FYNv{nn`{PMt=D%hA41?%b%H*XwACp*NwTG^1KKhp zAt0L3*wxW=6zhU<;;1^DITMEV=ns)2$2T+#P76q2)a2D(C+DioAXOXrt!y{0o{S5A z%VV<47R*p4Xk39Akx*jGo2O{mxs04a_utGIF#Mso5?6reF$My)ooTd*-M=Tpcr%ie zrv}Ic3ay)PKZpnorJo$i1e(9 zKr)$wS!se@sXs4E`a{q$z5BSMCDAC9R@!twH&&EB9 z4z;IY@EH~lG|xKd-t1tVNkn5ar4V!?{xG+SKT zH6^M@I;aYTOP66(Phw$0!X8#wmNQWqEUj}G<#Z1p?TB&}L@~a+Bh7%S8|UKG@t0z) z7+4`gm{j-Sh8R4Y;g6+E0ND1Zg-Pja`_;^cT`3yikJdI6v8vVT$?F@^+CJA^Mzczpeui z!#y+*P*<=~)zC*Xfvko^ckDQH24Rw-+$0|EN!6WbIK0M%6$Eq!ZS+IzYCM3{FfZQo zB}Y)wjTj&uy)pizJ!iTJF9w6cY9#)z&*^i4dP3+6Hzi5d{}j>-l5qF_KD zI5A!*WIR--f7n8`(OfW{*nLF)pp#Jp_R@CO|?o(Aoye(^a4H*xC)L5YeWg)C{Q23_H1OQm`>pn|`C? zdCW`~svRrD4gSSz4k=2_3&Di?Yremr>uh!y0T0lWqWUQ`orStFj8UD z(g{du9F5c*@)n~BND(m9v^QI3*H+y5H@z*iK{rl%6*lEIH_YV7Xg1mNZDTOav`ryf z!qguUd*+`$vjR#79-23j@7L{j1LfyX+|j!-t$jk(uexu-3?J)?+;K8X49l3%c&OOb zB?jp!upL8K;pw_xeLeTN&~gK4X8VVI#UWab~Q+<3D~}Vqf6i zb&DO+-4WwiJ9HD^H^K)wvOM%+w6h<+k|F)C6w3c(XEym&`hj48fKJGPfJFYAe-ums zE~a+I|KHiw>U3ClJXQ43S<)<d4Jkm@9KFx)$uxzH;1Tjt#3Uq2kV6xe zEEygza~>94obr6A$U;>#QN^anNMZ}Bwa`FxWMrEE^hX}N2R!%&!Q`^=Y}=Tfn3*pe zy+8E2-FBb4&35y=Apb^{4Gkru-Bapad=MRg$i%3$b|9g+Bbna`g^6 zf=IMa^o}|bOSDhg5^-c1ca!LmZiqX=Nc<#iP23WD;7bH0g_IPNu%qA-`LBw}-Li2+ z`2fN`-KYC7Qn#d!@FRjm!lW(f2h_xO312D4;3IR=m!yyEBj7~+cwUJI>BKMzU(pA~ z@!B6qjfbD`gT=b`3}N#(J4~GDzMG=Ej{hI{99(wWwJnn7YWwT;g=SfQWgZvfUj@2# zKEI{mOq=nUrQs?*BXiGM-n=Rr0K-(39Vt1QA!I4l4Mb(=(o7xbm6HAsW+@dbTEJF^ zIh)5sT>UD1^UO9>bn7ZoOqr=qFi4im@95cW%BB-1HXZUzo=5!f+Geg7lA4z(@G1N} zG04^mY{=Q5P`_GOO0lXlZ8Bk6YO~54M|lXK6*87G$ck7bYM=jV`8T+W^ZX-7d4Go= z9*PJ-0G3K}gs{E_nTm6J)oMA+>pp3+x%wRx9a~zGnTcVbsGh26rFE_{veV#{aT zL8kp@#=#;-b~`2hF(zVKQ?{sDu$H*AumsE^f`RKs*)lHHrP?|Pt=5O@?OR{28qTSPBu%wwJhMhl9<4BdZ{PS8hn7Tg6 zrna(DhP8turzN4^Ks0_-=Wk&Kg?9kv9R0TWN!=uP`B-d+WDo?pi@{uj_&7FI)au;X zTIQA*8N5zVX)!HTEBz3rGgiyzeC|acf!5pn^G2YnIYX@L^ps7#^(&k+RRudvnDXIb zUN81WMv8!gYV14g-5XOiI6R2VwDaL-Swn!_a+AX~4Jbi22+0xs-rpEGm8^T7hHgz& z|7KKy2aC8x4hSsviwFWl7dDvzzE;*FT~e+9TI&ie;uKTKcNDu}aFa!}x!CQZ$YRi< zD4VYKJ3|~?qI)bJ#Rezd!4m~(J!ztPZG3}<6gH%8^DTI&$=u*itC&`Km=aSIN)Wx{ zZa^<6KlI)D7iJjt)fCzeOw!)e1GJ7PCgfwXQ<_ZRVt=mOjjkHU39~bEl-=YQIaROb z+3IE{8xv`C?)6FWiOCSw3lnlz5ad*b%-Vjb@pe_SY!~StX{Ntb3B@ARE4Hf}DjiN3 zn8FN2qZ}~3nETM20x*6^`*C%u!GG^465XO4xT{bNQ9m?;d;9c7UvYnk;ePQSNk@{e zX;9zf9+5|uiRR^pnu(_pxn(Vw5_+T_5gU5s9wA4niK`NN6ds^oBm;i?e#BkS_WQ}N z^uV_PPDO#gV9121rgtSD-4;G5ojP5^v~s0Y|N#e*C7Y!u6psG05vHebT(jkkWDr@j&EGn7W~+cRRp z!jZ+;i@R5WYw!tD+<#VgerCgKZ!miN^EX#mx&`|FdiotPZ{;3^kySX527^uRX)Hl z7%}sPKN9b?My5wDHS6(y^e3|Y=IE@DRYo}+{1WVTWsG4cqa==eU?p`DqayaT|@!E52j93fB7|2dPfWWpZ5w$Q5E|0;H3dLN5H zZ4K+UO(_AWyFBvOiy0T2v(x>}qi5$I{!m;nhT+>dJzCc)TZfdn&)Nrz^?j-+0ph=` zp^r#cUj14DPplAl+!Q)80{ZJJ4CVS)@=hQfnFEAXw5PPEfz^0M9k9Uakyw!~kH7Av zzZ+3hdJclqk0%e^KuWkBnw^#sDzajF+1=i3t6O@u5S5e*gsM& zm_W=KJXIC`uXH8Jvgz{ivLfL}J7e_`FK#b#AuDfO?ZjcF&8+mb7N#6pz4f*RO`|oR z22HE=kr>*{&>NgpUlo?vH!<32c1WIuJ=n}{9mA~xS99`M3yV?BDu7(baG_r3L__RZ zIAfDt)c_Y@10H!3dkupp>w^vtnePo&X!m{%{*3PN{Wi$=hB0+Bf!Kt&5-Fh|Ha439^Rpi;j!0~%?!=fJp!K;ZBP zw~Yr&;Sjj2Js=GXwA4diDh1cw67XwK=oGlDGawBU(yVT69CXG3v=$12)!mD85x$Fg zjUbbEkCwwho-uzIbjB6576xMK;kj-DzN>@N0V)dCy$^@uF4Le-mv;}3<8H&C&yb*Q z1-^?O>rRNkp$4~&1M7~Mz#$jc-G_0{&OJ|{ZU$e-ZV#x^0S#Oj(vt}zt?&J_z}`vN zp7!P#vaSt{{|qtv7Gg&S&mCLgs0+_A!HF)^Ps-c~%my#ukQd;kFSvj@NrB81zc2i2 ztqPH6#>G&wXh;8P#wYi{v|K>rDb_~~HLF;dbyDBMfK$~XO~c1ZBHUC^_vqt;i%a6fkoEjn8Q z#p@Xq=4)@!(ZBs7hWObt_ipESPT_ebF0@ET?^6-x>u2Ga+Ic(4`vfU;?L|MjH;+p2 z7F2NF+4hvg`xGX$7}oxDOz<{XaE|GCPQ&~3vyb6mLEZB#F0}MEwDRK&t6JUTEDms< z=XkaV-Wz?qn2jy>JaxzE7Fy}^F4H)88H7!`JTZqH``3Cm29Lma_lta&qPWmkINKNYcZZ(B3+# ze@AD1G|4l%NR#-^6PrqsojZbCsH~}E7m70&H8Uj_Fy;)IGe{R_x+KldLBgSkqi`do zfkPt4$f3aSLE7>QDX9y8i&COXDVm^)ihS98JKcC?bWLq-j>pe_KQiQf&1AgXeCBp` zx!roC@jvu`3PAXanFfS3YwlCGj1O#7#}Bh>1~7^9d*VMm!l6(|Qb=M-a!4YMnRh*V_1tKW;10)lXDs=tC(Y(;kEkQ)=SNG*_E?Ybjw~sM_B!2_+Jha*Kl<@&=WB$A z9&tyCaowN!H#%uc_`xTUFn&n#hAiV(d)$$4BBX?`!~@CCRQwT~`I(>cnfw{umABX& zR&|AWm3G8uW7=!fTPnu=_(L73IOajcT z-Ecuq3=AwCx!GOjYqQzS7s)Y$0&{n6*uxr^uh-TFe(kPv&s{8iCZ;~`+{}=>X}j5* zE9d!EZ!LGMZ!a!wF0F5@Zd|%HFStOUPsj4VjI8ALxVAPDRyuQcyy;Rfm1lO?^^xB$ zadvW4ySlO4y0jusZ7=Uu>{^>BY#dqu++OU4far96ZhCC_s^O?RH#aEpT1K{)w~udZ zZJms{Aeu{YeYW{tSGTveS68>s?VOsp>jAK+1*J|oH76ot##H=79@aW`;_6EKskU@- zHlkF9rD?;0m$oj=&j?L+Iw5?eR@!*D^`m2FHm>JHKP}p#dyKdt#*6p+7zZADB={E|y6t(JEHMl`c9yIf7%dB&6s(9R2h_!?H zb)(CH@{+6MKMeD*?#i2fu3P(SD@)la9yRQ<(K0Hx9Q{Y})kB*VH_lcsR}UOkzw!bP z`=v60s4{wdgZOO}oChXK*EcqObz06d*cT57Q1_B0><3Q}(A>H_UtG+_q9R{!3whVj z0TTFt?M-nI_)en$e1dAjG`}%SD+kdqh%rljAEBbjR+f{+t{wvUHPk0jAHy^TPip?d z+=7BShCsBHfX~07P34frhgph5Hl#tK-Ar^Bh;I-d$O0|I{niUj|Amcb4W2$ud0}-& z!Nlz_3IJlmMQ-1zn?)T)uu1(9Dm_(n8SuBa!oPL&Ez$+mK9#Z)viJSX!EiSf1RC9q z6WIUwGr^1u6d3yTojxOa0EEio#+m}s?TN*o#R_{2gfVwEk1scQ#Do(XCx3|X5-OP_ zf6tsD`+qtOb$k2?%C~gJBv(BWP;M|uElT>2LNFu%U-&TZI0Heg@%SzD6WyTVk~SK?$+U2 z8*kQGTB|8vB1gyh`%he~s4Llg3V+bl;EzoSzrqgV zGtnMyY{y?;q8(?FsZ05t3dZe%8hO21c3qAUqX)Hf4UU&P?6be{t%_W5F|$4gssM}m zAsRg!RzF~R$b>Txo*E}(dL7@7jqpXn2&3KAsk;;=RiPV@_3nz_%f^MPp1)4a>wH6* zhW|2sG+?7;S&duxh(!(9q*kG0(+ga7e8*&t1)*TX1Rm z_4+FFGwcqtwUC|8Q`bzE*IqKo^-KyBdKA_(7BcWz&9a!zn&q!7^O&i3d$2EK*DP-T zEo^mTUvj*6L`q-JGVonBUyM{GG&Ei3Yb2LS4b_xAx>_lw?cwcBTh}^t;LN;_v%~v{ zvp8WU82zqgiuOHP&r)5hlE6}q+{&jwf+}#j5Z~2zm$NolS$3NWHC}cyPBX_!>l9L7 zI^3Q=$3CQ~3~6Su$QbTumPZGT}P$6!hzVlP)^#G(`Q86ne1e$ zY@dig0(q<`3NzTNaQh%^HnMthWILSPf6bWryR?&o8xd-(=Y6VbyCE*ZUU-)^^e5xt zQ%N>{UESi~Czj*o=n||RmBL~Bx z$auTzV6B$Edz!rkx{Ge+pH<6qlqYK0)B<(u1+;FZq@y#oOkT-6t4AyTtH9*$NCM7% za@}IGlCu~VANI1_;-90S0zMehSv}j;1BhSI4OSmkvjyN%tw08uC5ZTX6@#Z?SZoCII3U$0S^GiH(I1IAU_Fp)2w7_`1 zgzL*g_`-UU-e0N6NN882e^HXtJR~S%$Yhv~Vt4mQP+~kUB!n&xce4w0=Zuyb*A(9y zGO9P2y%-nP4)ERiKv4J&sa0NixN3yd4)UjT_r;bw2zV))npWwUrc_CpE|ap6I<4uX zOp|2DD@iMfb6~{Nl4^>q#u91DGz8b+iz~@DBoE0oM4NzXS2RGlc1@_&FQYle!2Gz2 zwbt}ipE;gUhV6@AW6*jN4r)tYt*O4WB70L0IFvrbB6lV3SCu}R(fsKC?^FJ-b@}{P z3dN5ks;5h8UO4;8JMBbqNrIs7KX;ttsHF0Vc=@>U3B0loaJoDa547V%9nW~N$nsJlQ2%dc*)OjEiC^i#`S2uhg@I508y6On4@2KtzW?sImy;JK*tJmogQs)nF+(r1?C+dV1 zGKwnhd%m^j9chzt#CvD`2xqtP|0SH!{SUoNH*r()=GQ-h|G-#~`J=k66dP2@#K%?9 zqY}#ow%4%8@-p4JU=E)Kr3BO}r2-27NEIj*Qx8YVs!Am*>1?W$z!5Z19{*7i1oedB zL6;tsKc|#wK-;5XmC%1^?xaq+|yF7ATukHrKGYi2%XQaYDy`8=G3ea)ExZ5L=SiXsx4w%=$tp4#lZK zP>Y#FD$@k#-d7aE>Wpajvi~4+Sr5LsiGnk@#MRnU6jb}j9`pA5pC4@VoO!V^R%P%_ zlY8m*Kuq**WjYRacSzIPKGxckynjXNVx7dhiUpi>+5KmN@~s0BA7U-;=oOo@q>@jM zNmOB+)Wt?u5!oUq*2d9kl4#Zk$V9cj8Fo3Vr zm%L;t*G?SsTc9qMMcX5N+`caLt#Ls$?GZHsgU_7)yPZ>r+EW(TTPu(s=bM+WvF!UW zIfl-qPiQQ#(!XEbfPP6q48;H0YEaL3%^Ln4e$aQZZWa64bMS`asuj*F$gtOT4Hy0$ ze{jcSEeqZ&%Fv$e$~N?~#?YSQ3P1ES*YKA0N;kB7v+i)~CctK5^>+Z_9s}gp#7{bI zwYm*6xpQ9iSFDvNEGJewC)P`0D^M6jR6p1jWMB9DJ}@5j!_O1ufzGEmrH2ZXpuBvu z#S?Q8%P>5G;Wr=?+oIp=Ze$?Gj${1FNY=#RY{)~@2m^IA0>U|PLT)zCrl|3aHh7K{ zeZ*&r@Cwn&zxS#CK14XM69n)33512gT}XZ5b_R8ACgJ#?mX*Kx1PxFIv0l`SEI2dF z5`=X@kICOWRhPbbM7$vy+lZ>{X5xLj3V!PE?}BtaSbw}rfcXZUv@#nAGT;3`Om_=B zR3KE60uIjudc_~HJ_O-tWgxzO@!iE)5TpS|B?h3ffbtW8Vo-n*reohpV$Y?*ecVs^ zLz*NhCBl7JdhX@T@sfe2l7kXTA%3uAmYMc7nCuPy>>IWY_SF5U*NGBF^o4Dt(n+KJh~h54>;%71p!pKZKPU>43@10p*Kj+c{V50-gv z%VbaA41$*!bVeG2AQ$^i^tBR;Q@{h(LlcB{M5##-XRf!v1Nw_TbcI}4UwU^UZN3Yn zHZs6vypLl6R3CJMOCQqbR3}cG?|NDdJ)ULwoDQp8qTR*^Ba)i1zlb^u`0y(K9%CHd-<# zFqQrloUE58V@_-QmZbEyfaa+-@&vk|*<3c~#GI+hM-xAvRx(HTvmZ@ROg~p>b~gPh z+IdU8cn+4C;3Y`uZ34~HaOBCn0ao(zymnfJ`Ti9hgV<(@` z*hv!MWFiyFVI6o6e7-!NghY9hqhdEL}uLw`EIRv)9K6OKM#^9o|o- zd;SODbcyOF=0UieI~v+&Wo-v&#EqbYEzTbe8-iwjaIzNEj}&0b3gT(al>^qoOBoTW zEg}!*LQ6RjvgXzf=3+}p5fE5Q0B66IF~V5pl1Ka7hxL?^!{k^~0B1tV=wUZ>rTmCW zUh9_elPku(a$!m>z*ZWlvJ56Y+)n*2Re5ozy-xti=u_XRjjw*UtIu@x>%*dMLZ^J6 z4-E@}6Pou|rUlXvSD1A9 z2kA+7;81#Y-(kMtysie>5fWKe+|*H6+KKISss@G$szck@6hl#n4VgpXmQ1x=^0`HCX_bI zh)b58#NK2HO#qZ8(&Haew>Z5MnIAfn zBu+@`m4bo^1X|Qyb5|`Gwc*U}mvY1OV=>7=r^^h6p$(Y6?bKhNDL_4k`T|+|aHt#< zer{Eu*@G)m{(1->D$I2nFy3LHr;-8uOm(F24n1g`v=FH!z$;P#Bt{0JI0iY+N@BxF zN-1Va7!m=#Om*b&4h3j!x^UT95N#6Np*%yzoC4EW1SH@PLwy~reZxuy3UE5<5bjlI zLX3M7qYw&k3Rw43ryX;!u4bj3uxvLNp5?uN(SD|_bIBDt9c(`qNV@zy z$~4)K^5RC$V^&I)72y;|?kQ#VK9G`eG{*wu2AHZl7|%#s65g>DY?j7}C&c#y2aktu z6kX#93-WJ8{RN=Y`o%TRZqSL@Cu5}N{OS{Nhv635DZ7#VM$|j5)fSscFz=maI&qHn zj(QWPq%vIX8pD{$7T)e;y4^apK@6-H)jK50kUFFHlKjqm~qA73S79k>= zAV*HrlL5^-sF~1`J0?y7{@99MT=qV$IRt{U072UGVSQo7NW@1hxIqG}0NDFg)4ebn z0R9>zkAVQ#9tPBaZhrqKQear!QBfW0S9mkxZ?xPHEWCj2JL;7$j;oNDJ)KneQzrBo z^W!^cc0zgs>Aj>XVEQ5TcjYQ*dLw)XCa3qj6$A0s4h_r@n2kcHHdh@hF^sC7` zO;>99}W41Kj@Yi@k+Gu7qs ze&v_vjsg_hZ-01a)>aFC6V^JkkJObiw5hdc&ul<3MD@{;(0 zuD(lj+=HX& zlirh|=#$^0qv(^}vmN;43~>}Pyb1jIHiPRy53(QKGlaNCWkD^YFvC0=pT7@j|F?+^ zH=C};Zkf%K#Fj`?15n!^N9U`~7*9^pD;}sQI2={l=&l)2y~Y?;a?C8!q?*=r{)-Bi z8R}BQLjvbYVKzfaBb9h*=4i7#Ke8nw)+qPHz#JZ(WeGo;JKxTJd6LR%EvU&{XSNw# zK|NAvbpCXsE|zV&E#?5+_dD}Ir*Q;+xP`5XuouJ&@l}k;LQ(dH(gG1-PIK7-Vt(ie zErU>b!BV;rV8cG0uc-Q@ zxwN|=Lla|cVj+su5QVdlsZ}1I)}^}Ykt$f*VUxin+LEHPGiNfWVhX8C#$%>8bC#K4 zR;NE_I_`|e^75@``%hV|qYd0)%6K26TLxCWTz+jW%6!??6B4T}LaSBT2VtD8`SyTJ z0Iws~j+BL7z1xX5mIdI1hH+`6-gxnN24usEXP5Ax5OsMLw%HzoHmHk0hDunlmbuWV z1JHpzN3=Z)o$Om31tdjOcm^o_1+GWyAGrV^@Pi zvs|#JQ0=nS%!JVGj1{UnI4jCXaQOM&1f`+SUN}^S5R1b_)X{jthHHdvMUzsK}nLHZ~Zoj^8d0*ZUE z4~0O&gjc2riXXsV2e0UXrKeBmki6ta^w8`+X7F1H7{{OtoG)2_?Y`y#0_qFb0l)Z` z%RvpQTTa{M5I*@0BVaY6Q|`Z(UN}%>`kTNw`l+CE!!WU;_3Brd6ztllu%2uhDBbnd zCEpk?G_?>=rEVR&zaFlKhB(+}{F=d&)n5jsb?;pSC8Hyjj`W z+(EE66^Ey?6MnJtkM5i_ARG|X>=mh{oNdG$!P_B$`7l1O*Pc*Vcq89>kt(mMzDSee z22jU}-dVv=tb2{N1`c<`b+B^=I)NkN^`*eQyTAua6S-k@SKw_JyKWesg8+AQfAtOm zxnEJ~gZz)ItR(39F8N_>tgdeQff7isJmHPIUVVBN#WkV^G$RYhV2bAuoafC(*`jnp zwZt9RdDozPVcaA+^E0J08t5N{`7xjKgL#2iE(`~oQLnDE4`Q{fp`fB&3!JHidgo%a zY#wCHBoL??H~BDAG@xTpmdSJnj2Y$TY! zaF#xuBJ74%O`W-3JA~J=HZmdUg%)v!0^j_o=I!Y(@S-*Av! z%3xb4U|%$Ncl5}0bWk5|oO|1awu=N{U*=AGmv=-_{@Ou(n1jH#$g=GuKsFXo9HydR zTNq$sgTQGbeb<5pPMrDFAU9AT+JnH0`Kpkv5P{OdnP}79Q@d90?&sA&zx8GK=CV@!khZS z$x*D(GyPh&98sexatJb8&7)7mraOe?Qzvz7Ybr)A<#Q*=Yw{Z5!@>Ix`oMk;;C|@| z_G*Qg#^n(^YC^jzEMM#m;7{plbKRk?1Pdq=L(lzFMtjl)EN?ujx zKE4CGt;AmRr!Tha-@>FA^B>e_8q2bM5@(ry=uaVRKH|s=uNre7Hf0RZ=aAHAA#96k zKfbD9-V3wNtsJZ8nI3)>1?QnHXjILy=r|0+z2p$CCM*6nES40&k`>CQ?j$P$XQbW* zJFTXq5T-m-Ylf+RO?~xxDaz$32!Mwm459QxXh0cc;d~U<4FK(#_xS}~_h>%KXwgTg z4^8*K%Y?Hf`X<+rfq*K%ZQlg{zqTX)QPS_tg!V-}P3_+ex06a6YhyfN)aXdUN;D)2 zO%Rkc)oL4COG`Ax6;2u_inR-3b#?_J=b)Mva!ELmxB3m70>mX*-63f8^4p%Hd)nM% z@jCHCUfQy~dpd91b@#)Z*3=4O^8RK+pzqcEoqhOXV~cd2 zS|IOk053D_mCbr^0J28C!KCWO>AhOUQ_Eqgjm^WU11JGbxzdCknYi2&n zyN*^|Wj_lNcA7R0ri^3z7q3m-q}}C}`HMvDUVEyBx*-zq9(?8EGb=ko#?=zZUJj(Y zHuzNPXRl8JgYhsO`pt!Gb2X8tUuHGYB$*1P;+Vc{LkaN{Ox`&y2d~?2++bjCE@hE1Es+^i5_a z4kh+3)J;m~OKIBf!kM5GT2J#QoHDQwF z0dqX(A_HjhQcie9nDF3^o*@d0wVbKn)<2jMB&p}S+jc1CL zQGZT6DVyaQrb~a)y*6lf2sg_S&J2bmOU^hmE80kOCysWkW5)U))~(J;P-Dj}J(nyI z2^84l2~%^wELy-`5N$kISVMA*IF5zUl=E=hW>RCEJT!^-ScCVL5B65&$c`lXuVRn= zWxF%UX`HkkVM6^hA!QU$x)_rdB3v|>gU0f28(q6fs&~nXMuFk394h9oFWNPT7buc^ z`0H1(33FL5^~J=lpAvD%^BX0V zjJ-3z8&x(Ci#6^#W_og1psiqw0di;@7(%XTCK4N)G8tFl`^yN(dE>q2aBkxtaMp*@VOYXEY!_C zO-(hJ02&9`sYvE@sn+&6u0}yN$(P#c#<~Icm|8;m6g z;ht4OGSMCwmSh;}Ifrz|cMrd+UqM`&5rAg`-LfxsG-|g+lCst%gEz32( zGm<*gXr@qL^OO4Z@JfybZ%)-sGTim-fY*Mq%4Gb`>?!2>dZ1i}rV?qt5zK>4?~9HG8Kf#LfVK;8Qp zKt7VZzyc_HRwzDFS0s)3QFui6aC!u!P7%XKD6@m{;AzI$;B7zc(AR)A&COP!ue{ws zL02cm;C)Bk8ysK~N_g6#8(_iovp#eUcgz7)2z1u=2jgrd5J#lhtU_^3v9h4GhV_yt)G4C@SH zMxbmR@qbkw`yMV}>0ku}3o(QiSXulwa@0RER6HN^ms{FL*1E2Jv|o$3mA=8PT{G~g zAsoVzv6F%Ih(kyn6-3U=_O1wJZC@955T&L=^a(n_vut;d=Jwc=*HH!qUc!F-B=ajTY86eYtpZdmC_YBGfK=a=SI z3!FH+I;{vO2Tib(92dQDa?;e*f>^O%rLn<>inaj-F56)FMwr;s3=YOYy*mxYg13!k zSl>%!H-6>f_AzeVLc9CcQI!@dar7#maZgaZXbOUlptR;f82{j z#Hga%{Y!Fr`YjVEXl0IYC#;#c;5aJO=YDJ6cGH-TFQaZDeA4);5~{fns;FP^Cv`<3 zCMD2CXkBub{JD2?UHh4LbseN@uiWbD`MbB?Zowt4n_qIB!^$&V*G}D~PUlUqaTJ^( zo-b;>Xb-ixom-yU9~s6QaMrN_JId<{U}M7|{|@|GElyHe2#@|;psfw)-N7G8ZkSuK z3b#VtDb!3Im}X49#82v3g`wXqwh&^M6@>?)H?;PoJf^}P;(a=ZQL8{H?mRg^DpcZn+CTcwHt z!Rft0p_QAponc*rC}j1R<7v9sWPT3FD z??|aP*T^rA9cuC6J%|0;1uuW`Qq-{X<{<;x&zrz+F2#QnVs5{LkOEt$!E!_}l{=J}EKV$Zrb~ zik!YYCXY2HsLAFsaT&2cP^oZDY3{z}5r^|~Tag{gp5XB^ zy_*?nR^BINYu|j=Bulj2Yd6Tmm%(bh#WN#4qTf8y<@&K<>*B8>antu5_MQb^! z#urL`LfejP^VM+8HtY@l=f@bZ>=EowTI~-0tBm;z8m&b}B?HQ)@0ucJc*8Vz8#ivW z9&6EPnA{CgE4PRrsDBz)=E%n23@->g&ympGQIqnJ{E5H?#pCH6Y;J?@t;PtlrKzOV z#*gwsE{Y)|ohC|j>!H@N4>BV1zD=^(FcwyKWoOmegA65M)D1ggeBHF@dkY&u_3KzuuG_e zc$H}@9h_=baHoGxK7`en%NtiUH$Ch*%ZCd@Lz(hP7~wpK)|sYUS0&3f zck@F_^FYK)mF}L1R{sQCL(-|xVaM* z8K~XSCe|B$A+Ig_E51CuOL{pk1w5>vPW+i1&D99s>-A;?W^FT!|3oX{`5n4U& zs+*hK?|M#TgW6xt;B@dsrmbM_g`&4m!Xai54r$J~B)5QGEm|CWwk}V-R4mG=p}?09f3b{RRGNU#Uo<)m+dZc|6z@Mr>X<)wO>rrnJg?XjZ(mdzkF6Q;Mw)@} z9#0iP6Kg-82<^TKHi5_G`)g47s#BpM)E@x(Tr3g$4pA{gf62;~sWe=-^* zG)GwbZEc8}4VpMLu^ZX4JJbhUs<*NF7!dw>;>hWGA2|R z(L}7MZAAs%sa+a%`C_k)`Qo0w-8=Z^-?tlei&;ec3%pnq^?!Yt#4wFwnZ&&N`D|+6 z*mu!(%G~t1>|T8aur#ymZu$S24JQN@#O=|5m2l=8hbQGo`nOI=XP$9Pu`tQfxP;V;#NTHDv;bO&__4i6EZ*^gU&ZAnG7=8?3!T4u9WGz+;nH3*UL2Ko zyKOWT;*OrSs}k|%nYU!iwqym+*<0(ZWwhkW>kxQsuv90r3OjAEbJEV%OXDh}L|Bq> zALw@zaB&V^vc$gNO59n7kXMSadpOeZkKFUQD@;lX$7HL$`>buAHW8(7)UrZG!9gMJ z>4)~*yX&|S#yoX05a{oG1`62iaO$G)1;<94_{@;xTs@QmOsvUGTp*2VvW3*NTN{=} z3b^L=+RQNhdz{SGd^p$}WNo!eZL}aB+fU&%CLjE#=N(-)RduGF(>E{Shg{V(Sm1kF z$6dD5RmXzIcXH|$T@C9=!!JeP)X6Y%w|T5qsj^M;smvbbgjJ)U;3 z&lFU1Zt2y*8G*+!H(CY`9Hms3c{nK1{Y9SP^W)s=r$o+h2LuPdy&8J07z5*w4hCKC#l!>UC%>!sblel62{_cXwA* zVyP0#RS!E0q87nfW$}N05~k!iqbw^t{W{x%Th&u*Y-usxz_zEU`lT_=GqJqI{-tBi zwKe#>?@VTQVLqcytH&l@2pgt0IZy`>BuQ86i4-Q>-kOxyhkemZi)E=lf}P=H9>Qk6 zu3^q-cZ9^>9c!`EPBVx5nCC*+E#~YXp-NHH)7dQ7>_B!r26(W>9U30wtqt5Vq5PEhjo(>u!u>pQKjX&2rUc;5gMBEu zo%}p;uAp;b2G#2pZvnKsK<0a9u?y-=(70Le$WvRi$1I4!NR+7O5g6_lQ4mkK>X$B=v|ru#fYQ-X`Gz zWqz7IB#$eQ3;f>##8TLP7fs3imDCI`HnLzLN2r`Q9T4dWS<==7}ew3z=4*m3SHl(;i&AdCC9CWF43xouo= zK?BadF@;I6Q$u}rGC>2(pEE^YF#(dOn)<-C6*Tu66p}~-mnmr@(YuiDV8ri`iqG`o z#DG=wf;j7S;EXB#(B}JBs-N9P=sB=^sWTyLXJUCxx1HeDbLfW3lXw`F*7kpZN{oln z3*&kZuxEZ!cezbDqL}BjT8fs!8s=(5uS4l1x)Idc+-dJJTUZq@VcFH#$D}q2z^Sa+ zeRe+_3t zT}e;!nBZ5HLHSHx%JwK;dWe5-JKA+m+Ed~LTRN`io$Sc^=t8FF4riqx^(*bICqESZ z;EWZ7Wx2tWmvOPGaZX)qb7oa{EnxkNkusa&gz7nt;o1&7vOzKT&AKC$NQ`~avJz34 zti@vDMOfZNW4MtIljmZh#bTt0N6QPbzlg@d zK~ELv&sFJx577N)nY}(W7=J0Eo=&hoKBar<5Q7Q~L4TE~0C9qV927u)YA_<$;AvX_ z-zv1vCP6?C3Sc)i*nj{k-vH!qx$<3Z&>c(EzNgC1Jq@ry%#?nT)L@#RyPsr^mCAQC zp!*hS{na!e`CZ7nWGsrF>9WH6ddyLG%~1yAgxIeVKeYFZ4q=1Rt#UYnMgi>nU_<_g zZ##^4WWErz+z`?6!YTSw>zv_VoPcUx4S092)$N8XZNqC6#yz}>uYc2D{}0RtQvSx9e_xW$H=dPn2h&r-pAO~hwza$^PN>+kLq zLUu0p$~A>A|66an!--$OEq~bREZ-X(kgS;sxaS~n?Ho=2DxM-#FM{EnDfFoP{A{`8 zzeItoh`EOKBTA$b>|KOIyA^A(_K`zN5@msOLL%K`$txtHB@)vv% zN#c;&A$~(1kC*Zneo#ruPy9CSfE#C!^p|>|Nis<8k$b>R+D-b5J9;I(P3Vz%fJ_od z`i$Jzn*(pzZPY3-2|M$mRp#PurBN51)kVgQ) z5McxA9fiqLbHUx`8~&$IVZSZfh7=eip2Y|$87V?gD$I8QC7H z{cT%G%WMX(J1VI5#~M8grNax=Lz8BK974Oaoxg0QErK`MUuvqW;$7_`x~_rnlf&$g z{Tc7SC$YJI-s>^~l1r96-ZqX6{bXAF(8Vwm^7vcH(5#+hauYK(`73+*XeAgaYzCRV zL!?!O1!|Uw7K52OT*YJ~-$5Rz4Ti&KCQBR85{jKY^NPTVm6tG8k=SD_;#Ot6jlY^Q zb``|LLbq|#N+~hC3)P+)~R5|G-02 zT0ew;4{2j{o} zk=#!@WyqPhYTcWjhxnEBLgRY0q@G`v93j|sWq;#?aUnxW=?`V~sUd^+?SJ7MZFh(v zPmC749B4w&=-v3c{+eS(D4oVUX2JHr!F5l_Rv)nBJQ-=^l4LRfYF?z!Dp6>Y%r{Qt zUnb`36@*u#ZxV*rp#LSRMpb6BL`n8a%qH8pM$IPvW;wZpbzEGlavp3>r%IBVL!%b! zJYQNB5ypSxoXkHcUKQJb!H;4IG5zq~Y64{+(4zKUdSggS-2jZ`aNml_@hQYKXsKgi)GQ;NAHJ3Lwirl2)DLp&HUJ_HOmZ`HR_dZv{f7P#bdN1 z-&Vh&E?mKRk)8Rr=T<8xKPrE6hb1epmWBNP!b6#Vj>^Rs+f-zo5hD4~pjlLXC`?6wR7`zR+%P5<%?Q5+eT_0v zFKTwp%(mtCXv3tKroy;J#MH=WR0ASz)N-Q}+7R`-AxT}g`XTy9Pb@;4I~#Em&AMlz zoZ&NZHWYB89C7AU86%c)P=B#loRSyv$5W^?*inDaQ{m>tUX+DX`Pkt$kq-x(E@x6a zM*uE|z+*ADybTz%A5QW)#uIyJ8LpAu@-ooi`P zv4tfHe8EZl!)to>txzwiliDY2^uy|wal$p8Vn%9Bsj0~4PSj@P+EM8$x<~w`Z`Imk+1;2b@ zHDfV)NcY7sOddZwG9XQ&?XiAho~ZY@*AF*jtq1_Yty=AS6Vw6Y z)>bG2aU3vk{An_xT#Ci|3x>uUHxF`Gz|9Dj0qLHB$YEqlx;-KU1ib;|IR$%dDaM4& zeP=~6Dnp4H0$;(Nb)7Y7OnE>br=r-A7Gpc+M#2-$YM#OAiW+Wzz{oL>%xNnumpzAS zvE89hiQ@rs)k~DIWW|*-ShCkZLmr4W;R7^t#}!k@g;MB!!j*Dc`jBiU?I^?{0A{2hT1ZA} z_|Sxj-wuJEIzg#A0msR8}K)iMDf%_F^fYyojSp>IsxwE z%bNA^e#-;Y(RJhWMDgGRNlN>eJ59VaO}yj|0W?i~kUD{$m(NwhLq*fW+03R%dFmJu zO}yRrRMP{N?QtWCL;SWnfk+Ln`{{M#*u)_UO?+Mt-yK1L*H$3uMj`dMiRMNjX4Pe! zMdwypW4_wOhZb4f1%a=;Kf22TaBfo+46ZLVn>_!E!U^tZH}6B4)+pN~mj8~MjXh{xIQ zxwf2>Vz`r!_eozL`9~S}lh>DYFXHkyGl)mfFSB1HUAe><`3fV|CC57Z)BepWXl=#d2MzC=M7KaJ~hJW0cze8 zvkXixfYu+aexUIb@m?>zi&A29Gtj(w*v|~P5T7wB;3@8?~XXEv0aEuv8`b+taoOovf3j*ES zjOK1`F{}fn15|;CdS!&>XF2ct??U2w^Nn(ZG^U0b!#ahF&d~=5LE>ZQigoiWGauaM zw zunYSkQMG^ikHPYUf|(jJoWiO$)7xI61{0zeBeR*>S7uE$oM`hDAn>>m&P+gKhW>WH z+)aOToc7eZb}M9F@VZU-L)YwpIl()aZnEBv3pN4hKFjAOCYvt~n~YC=Qn7bS8pjW& zA0euh$-dm@+@E4>_3E&!?U@muxT-??ieNL77f2_e#_EYobyaMZOmQ^NuxR_YD|app zGe50Yr}TAnOqBbLuxngb6=N#Edy;QfxUEV@FBYY+mty3Ni z*Yr4f75aT`3(#0I;26|b%e(o*$7ox-UoL73+%?p2%nob7&1odUDmAbo$>0AmgF zz-TQw;WikW_X_Y7V?$Wsi!lu{>kqTKH-^za)S46+F+GlB(s=N;H;kbo~)A0bq zYF$HHUL`6wP+qE#+RRiqW9Ka`t#=xf%MP|j5-+_B8tV}Ad^E*e1?PPQ=J`dX^@cWK zlG$!H0Z+03k#XKSLL;7qTHzF?pq`NDj9S-B3Z{IcBe{*c!jPbqfO$~mO~mSE4I{V@g!>ZCOrm8V^tkibn=HB~u;#fDMDkMgT3IPH|caR*H#H1})xBaheL=7Y(yCbj@HU zXfuov9R&h4386Yfh8@*4O~J;(mBWtDLTr@w7}T;C1jvQ2@k?4qK={VHM?S#HAP}f! z6U+`$V%unTh81dxZo0o*_JeP<9o8Hl{?RQOOTOwR3g0Gzv4flOm# zV|!l&Hs)_R0r$!^R-T#4{m9Q^uB5A&NtnT0%#{J@c0wG>)zCIdFlH7lvdi()-AoYj zVlIgL$)BYHX)HBHWHw9qkgFhks$j%PcZ>5WhRRh2;S7}9wb6g4!pZpSv}$RwY{|~A zZP@4eQ9R3Avz*;(X+RSFpatUL&DlSkiX(9Vzs3dfatl(fbHqs-lk0WMOXX$;Z;PaC zD~Yo`psCo|-u;=G13{t#z6{lZ-3LJu<= zeFof9!BduJQ(*#7|A|IB{R=Vn+GSXUp-Jm+wm#f9^47|1E0EUv*?DuZ!Pc&D4tBNe zY4Cx})8N+)=^B%!6UxaddRf6SDXTuE8(rV1fFgIefErPy0cWT%gCF;=y3r(lxVk5v3tfo1I@rO#r;HuHPp)W{J<+NV zKtS`~?m;~N%}zr{mv5cJe}S1z|8PN7LmQj5W0%7fHb{`xk%kQ}1IMA=U!SOMSx9P| zTcTEr*_sp8J&K6X<4?;u}QbH5TbsELSH^+jU4?;L(j1zd5h&;7T!^*NX2uuXB`?l}4XJZ5bCSV&37O4q~`{P_f>aEcvO_cZ>!!ALb zTq1>rl1eJ#oFz&!F9nxGD;4*B4%JHXN^&7}Na&Gzz!>*RYKQ)VFy6f*u@XMhcNzlA z@3{*}$XG!bgAj)hCpQ|7fFK*EkYm_DS7lw<;CrGfjd0rZfL9;tqAaXB#6-d*7E990 zL(&+-pPCwG%3u1*RB@AzHoi7yC`aiXHG6L)raTmW0)MZ_o{84_tBwj{D=-Tw5i=Fd zi8ebAxmC(ve3V5_Np0_#NG)Q8PWevxCjsS-Wmn(+QrOHY_dnhm_s*pfS znq`eKQ4NlYPF|`j6qR?>##ftF^tzy^0>VMEDp+JwcD32)mm@Q8TB?~g@>JBK7}vO= zLWRwGvV&~oXaQ}R*a+4ExXAJe_EXo3NU>W_9x^ydol=^UlvLIIH_GLGG?^330{7GGP(M0_-He_Y3|fbL^gb^fq_DP=G(Sw2amyGzL=bbYV>8NW1v87 zIx>s?PP!9L8z$G6ytop3OFzu=xt8S=bG0;OaMB4BI664w4OmLoFQ+((8VshY#`-?A z0yZn9a0(N=4&9uMZFj z`waKY;=vGL;uMl@q?B4KS2u|&T`1;MDK{Idq;aE_cP-V?>Sbu7eM~IXtfiE(n^kTs zRdQmK%a1g2tHD}2?6I%K!Ct-ahd%>unxV0HLw41>D(~!SQ8)GGV!N;d;DI64JZmm@ zdfo^cx)sTGA!qA7%V63H-Ye5{!%}5KY60C`0yy4#TtLmsu$%MIyd-I-luHFP{ZTgv z>c>_NeTZAeL$m;`8P+Q>M0h%^y8can3LGUH%qw=EMp8pGt=VEXc!JAro;HZi0uD|5 zr_{#$aPDt3vH%D_j($Tu!`fhD+WaYt2?n%@L8N!_qJBaN6*##}UM13-9fE2c>C zORIB!h*g;V9-zKkv;AK7hg=GYvm?a$5R(>2efkwuJpGOob4e_ozT67Oo#rv?Od#$tmvz{O?lGzEG1+z4V^>&i z?lHG|EODDm7uQ$<9pr6MRL%=OO7>s!mfii@HkW; zR*>*&g7m3Sc`hOE=z{d=Pys4PJ}XfGx2eJLT!X7A{kLi`{5MbzR6z`?F#c1>JK7)t zic|n62~Qp9&v@wp3cP(AnLR`r@b7PL%IpQG!|a*%7_Sqh>!tKz4zQx)Q_pN_H{-;XspT!EB^rQI%4hV>u8VHE>|9P?cKQpbi?4awR zq*+KHJ2HxcwIIrpMCKxbrd*^ImkpVupxw=rGxoCDxRvN=qCJv2*T=Eio762bRcb!p zIo7qwo#mYub)WULe`Q+b%{?rdwtWXrhXQtHdj7t?{<#J8z3z=9EAYVrMQgSKy?Pbm z-(Y^Xi>3^I=^Ne|a-|Uz@0&Dt9^2CeTfcVjj+2F^c8Z$$J zSK`zvWn6vo8$_mq_dXdQ4QRK_VfTK}7eJr-OQJNLYU9>tAM#FwS)eFifcz1a;Ss&)-|MkLTGYKjfwq_T0G zUx*N0tGX*Qf#6tB)m#-fwLx;%L2P=}r$(vAQB|ZGj1{jQ?$;?0B^YXvtt|*- zX1SfVFBlMYZJO~@1x+$a$Iq2#2waU)8^{A3%X*CsXzRpeXzzACu4EtRX!)z?GEc3d zb=&KhR@jna?o!s1feR#K+QH*_bgE~X4W>$rb#_uz*T|I$I$?4t-rgupVKX(T+1PQF zQqW{f4ceP+Oq?zz(sI;FUeQHVl)r?eC6&0SDAfOH4WVYe*{jm=tol2i1^^ z^gKjB}~gFU0)7HBtSL z9do2bkqPxSrOQz~SbD%48+8mI#z+-T)Lg4mDmQtG+OT-7Y}3F_@e%H2MXxYmNrLA| zDM=e1hzo1*XD$rwtoh?a-r6THj~ZoBmXH>b%Y{U*Xj0hc1LE@2&4hp0X~h&T0{xHu zWIptqJ0SWwGf=WJ4eC%fP8t~x9|HCh)v#kI>{U466l|;ay$W8smoqv29dv|vhFv9s zf_9{|Aqmg8VQQDl2#MSm0{8RH#vvCkmMjeLo-1jPZgmt1YwpV&Lh~6kj!t+*J0A(*aMO>mK3SVIj$iegvPFi&(OI`@tyjq6$;*NiSrI@AjC5yGodududZ z9+)lN8)9t8NX}NC8X0+I$PDfTV^tja4_E+3A?ixh9j2#V==5C})W<$KGD1S<&nY41 z_9QOR6L#kI+Yq{AG&9%rkyPjQRtWtT-t$ zF*12w?nDky4HXd57k!5aC*uSJ`7!^yBuSK*|fv1dF zOqbA2!ny3dogV&QS1+1N!ORK_%Q|>=kK$yqkltJ(S zn!r9?09uxXz9XJ=-mo#WZrn<=LZD1PJdGhqn)wfuY9SeXVLXuGn6UQ zTrf9ENVdio!O~YSN!5#&+0Oj*!KdyWIKmKa^nYW&8*=Y+#2xm~l>XW)VwKsAL;1k- zV>>9}@D?ljb3oOR>`{}+SN?1s9~^Hnhx{|*SypF?G-?d)e>Kq81knpPb6L3Kwz8$u zF5Z z_+_c$2`Lig7V#;m;teSh^%n6hDU+;Z@gmFEZFw9vd7R23wz~`~OWmKO6A{ZLOnk+R zFs;)HM-_0|4;HPN0@Xqg@O{bp=qaw9@|#VFdcbo176^L#siy z&C3g8X=CRo+n=hPW?67tSvk?xz?m79(88G+2nt7UyQV2Bn@~3LF}Gr z4wUhQyNA3RxX&k<^AJuZ3!V;OPU&-=24GBPHlJ}w!=IJ+JYq=6nPHo_sqRMO(=y1k z&^>4)N#W_Lw5gBEa5DP(Q6`na>Fy>{M|$qHJ7%67&MwPUT%7u>=APhdJTRD=AS(`N zWB1}r*4RzdED_XOR2)C*@WLE77rqlGnp?T&%q1kJ%!ks$w8?v1Pu}V0Y}t@uq7M%j z_H^#{v&Eb4i?!$@XLj&?2-7+;JJX(g)-zop=SDq&d@n^_zDSO|XWU>p9=QWLrn*f4 zxw^>ptt0&=Ji(_AT;!ctFhBGfHYhf^4Ln{4{A*x5;VXlat_@Ucc$_f+&^AzDXE~nFO%T%>D=*56n>8>ht-&lWr ze}>F+VP;=#<$PHX1#QjLoML1JnQy`iR!Gabp&9%){}-Edly(UxS=&UBZs<9$XTR%5 zK!>9@!B4U^A*+r#b8jYx6~|u8#V~$dj*Q-dG3{ibPR>hWo|TrG^Hd}Fft?&M#YspQ zEmp^`HOB0D3l`dKMH@J@)PMYQSk@3gbxcN#QLigb&D`w6v`v&>2jn20i9@)bDRrl^ z;szIbm2uLJKa;_Ec2OQww|1VFJ9kT_#x_Kev&4-$Z8%r`>PGY!w-GaLVBue#of&Z5 z_0nN8EPzw819h%|2OYHt41?(Q3ZOMjfqKC1yu!Ayuf`tfNI$rMUWpNKthBV z8TeDu*kXHdGfF2Y<&9}tO?FHM?F)x-#Lrt#a$fb{5fu~1H*TagB8tO_28Cv#=EPZrg(GO8xU@^et(^So3}tg%ouhL z(cE4-!=c4JS!=h;%+(5?f@|I|-7y}c#YJ;Hfz~nC06q~)_NpAnSy?(G77PD<$S&NmSLT7Y##jC+r2XXEl;5?J);%&<%hKsa{)(VeXOVyce458=HrZPQ z^eV4o|3*XxIpepPx2YHClTNqFBMBYiqOj&tPutIDJ6VfWLOR&#u-6>|`-11p=cZCCYRvwL4eaI7EE zzdh>Ay=I zW)n3tQM57zo?fT?DBw9}?%LAT3pF~=7JGD$Co2(g6P2HVub9cX{w=z4k1O9wn zIskP*^^F!lwHGS}*PAdx?IvhO4+3pP7IxqcMf#B5Bm>eyWe<2zU?Sa6s3V!7<&8r` ze*zIC%nASXBE$*63Y%s;Gpb-dn>=FXV0kO*VeM1Y)zUL@{9&P;n)2t&NKC=5`@PJ# zq^*^iLj}BCm-u*e=~yOOx3{#?%Hz;{B+F=yry4tpWz3K$)2G6ghDwA*8z(LmZ;jIBN}N?#eJMDc4*S1)&ZXSgjw`v#}6HIB*j#^r6xF(@#DBOtxqU} z>ZsO82p#e)2v>MezNQPDIQ3()>6N)5ov2dP&Y@bbAx8X>d0EhO1n8yQlm#r=V?Dj{ z1fuGK>1TL|d@_mG+pk0z4`%Lq=OHa+)v*?9xUz0Y(GtX}iMSdX1dgSw8tkeO^z2EU zE*k?wN4y`nz!Ny~CVvNdjn)qRiXwmNHRJ2c9Xr`)W7_B(1z76L>rKT%Yp~>;Q>}OE zP|{D7UKyKw2?YeQq{zI5q!_GELnqv#C_2Yz&@DW4$PW7Wgg2J;I2E zlF@)3c1zY^C>#v7Mmi(K2u4AM1ug-C*(SxCWC&?Z>i=!nVHGdsvM+%mFh7inqF{9Z z4ZTD^UAIAGH0iCP85_{HgYg;q&Vb-*T; z`l~7Qy4J-mLI!x?9tE3uXNg0BG~ExUyd&xCf@x=~1>%LMW!GAh#;MrlFSg~cJc8o9s`-J~iK0){zfc{coM1-8Eyd8%}Yjx!H61ilnM2NXi(`30>k z<{hUHAxQMyYl#!;Z53(;j$O%rnFy^cS z0RG|Ps~i3{V_IBmy1FC(y_?7M{XMEZzH=FNMa<9aZ;IHGl)4*hJDOgzB<gq3D{h_;d?OuEB_0zY* zuDio1@UC~Iw1;XVY+5WLOd9b~A-g=5GTc_kZXmVf=<>Mf-oS&LRu#+ zL@DgREK-c_v?6B7v^VnNe10hV6ctwT+g%g4wPmzLw87a+wdq{zUz^`dD=4C z_utNL8+)*#NzwEZIqqHg-2VG^D1Pp}_D&u%^1Z=;*qOzU0c#*UfyQ|FDF^ljR1u~I zR3W_l8$P_feIeQ1m0pzWx5cNsD?Jg}uPUyb?6)PSgf@GMv(T0AKiG+iPYrAYT zuR|3F%TJ${R%4du&#q4&UPua`V6%Tn5cqDwC=X=WKFk??N6-Ay==|k_DbL>#Z2Hc_ zwhweyd~>pIrS9}$`^E=$^NDa4Spa6@>uqvWRTeEem;nhiK0~~`I80$dE11gduS>e3 zireH(Qn~@1oNVZ--lBeo?N(gvv@FQ_^My%JyhBAB4CLsxL}yokSL)tvQ+^pnqL)Rd zTOq|-#-5f2(jCd=Vk>J~5yfBa%-^D#cD-189nu+!*%7A(-3ArcN4$2J_@9 zTSg=~LYLhuvDr&5I_2`~%iQc4QkO98sf+^HYO_Qkz3*npXC$G#`HL&~sG7NYOwi=+ z{*sPeEm5|uPcYya0qhQrqB8v0vLvAV0w}U)ViYx_V=3=+H(RLxE>yXq^I6^3u`U^s zx6KZ7@+MAO)f%zJ5v~599g}q)1!m8b?4|pP%;$9wr+2e$?W5qS@eJ{rl96K)SS7R~ zgnbq_MWS9OC^H$ve_m)tI*N-Bts$~h($$VFkirh@@Nwivj=#7>!}_tM%be+n)v1du z-qaDt(zg&V#0!&P8q1~V^A|*$x4KzqO(*)T^zS$-rpFiW- zfV56*6@|~{v4oqwuV0ejH#aIRX^6(ZD^sg9oZvKPcfB}D7c@ZoNB8ge(6r>i(ZA<7 zC6cmbtZ2C}xi5tzva&dA^MF~SiH4quHAOG$DgjlOy0W-7{(~DkhLnV3;;J9}CQG(U zmI}`9;!5J&@uCM+y0zPuH9WSfO{KKe=$&fRZd+9?e*rS7PR6OSg-V;aiqRwq7!eD} z7h*gGDF@V7lE8vN7s^oeF#yDa7+OhJ_OvBap{l}i#~hDFdmGPcjR1YloaK>POONv2 zrQ8BS$t0{T!F%{14<+0mf{?E~#&TKtTx2E%d@!dU8B$XVkl3Ju+EdAgpLgImTf}6; zNQaUvSD{4HPB8Tqr;Px~0|^_4%qu zJ5?NiD8=bJ*S9c;{?tRwJ6oun-yT|KZwP#%Dgm^^w+Gr6e+<%FFE3{Lu^>BzD@O0%l}(LpDRGV=)QEv2O;mF^r{#q|(O5=0JvT2@x5P zo<}ie!DPrqvX`1}L#wBh#{dL6)DSYN2&W4z+p;LBq#H_pJP8`~~eh*&)sS?rDELHqaHVL$(M} zySAGK@YGp++-6>}>cE9y#o+7U&f_iFTz5J>iF2?des74VZPfoFmyaG@k&_txVW{p> z*DecI$2S9a!u_lN$?Y)@bhb;PFaC%VCmiWzD_QGA1$VMeE+O_npPL_y_Kwsaj|oVv zCd5zf4&v((X{p7>JL<|CP(RGB#Zw6Ax|bj9aPgH1GPhL>z68BWA4Ie}Z-4>83c^DW zYwW<+V?*#R%=kwxGBni$FRyxQayGn3^}^p8DJ=M>D!93#aVhL;BKnn>iikuM<25II z2fuXJWW*NtK3k&aMdI!l(!*4jNrY5Ah+Xx-z!krgy0UcQXmXv|TJbdN}003b7BkfORbk6Kp>9U3&CQM{NW8CFAhF$GeQ_ z`+pePklWj-YFDyV%)kA?jTe_)hkZ zhCn|q1!l$9w4=-oNA5v4n^Wi0I8`Nn1pgVA&eN>BM+nag{h(eJ2dg0G&S(*`^B<)a z*=2t5A|H04*!RgUsLfWmz7K%Vvv!f#J7?6R91H1!wnS!2;+TrTgnx!2OPzZY3Z`5U zs5Oj@7O3f0h^=xW*Ea)O(v{oxP1?i1@x`{$fE4wEua}*F0-M%aZ-*PV#;-q}3_m)7 zL|cU;vKkGj8W>{5O*U*(NPyF^VO1qZX6w=|Jm%FsvwO2P>uOwdLF|Cj z`eGVmAr2;G+RRa}hGBIt*HxRZG}0xSh9octOQS zW)q#@wmZzMB~nZU>#zqvXox)tWj|n)tpx}94TG!#3mhJ?UL1_X#uYM5pT+$3xRA+f zpkC-nv(c{o-~()Jh)`SS%r^NUhapAziz})2jvK{8F0s#|=mOiyKpSUC4xYkLvr6Bq zwjEut?fXd(zG2`N&FQLBhZH5f6g$OIV3ZqkU($nj$if2*@dJs$DTxiO4CgOp zxr+qtqiTad4HG>a^4x<4w7YGkmg$Y`@}g4-ykJH2JdfeLmG1Nk@vYL!5efvD+G6?U zLLJU?Y53}Sv1eGdX^&ptEstK44-aD?VMNP&4@?u&{Ht;yk;QH zZ>^fE#(W021~3gw1N~$W%*Qwpx~)!TGK-GSd7Yg`Ej#pQm~`i8$PEV2%a$P$ao&~R z(Yd-p&smib2i`$lI4$_I$vFwbn-Qxtv5l@Wi}@We>4#9x97u!4L5m?p;@buR_y$9O zTnVs;Pa}7cyij)Xbx0`jMX!*JPw)H#>f(4Khg^k*(ZY`QP(s(uCEnnlX;CZ23pE%| zI&e=tVh;M$+#O+hb<*`~WS%SOdJ93hzcJUFgrAMHz*euc1JL6_6)1-0Gmyhn0B6JxxA{nctdkNKC(G6T_*~ATIFq;6_1xJ z8{UgbdLXX7|4RGEOsl%Pkv=f468Vzea3#gb-@07ef}1|9;XFBEO9n{4=L}f$j0Rh{ z_Q!4q{3J8+6?Uua(Q~5_vxH;V3F2&8L$mTkZO;#E0jrnpJcGz3p!z+ZE(93>rFgCv zu`XxBk37=s%Rnc7GkxbrZeRh{2)jQQ0dEA~YFslAMsc6!gxEv4H<9PdE9ryQlO?zx z>`I-jzYr<_#39)acmIvhX#+3NkNEKawutrcx+evEt4E>V>d|)|9f+fgC8M3Ejinu< zhr6Avu>+%rwVAmiqpF*k#(yrPSUA|FT+IGI{9zjQ|51+ebL^xdYkH{KWtffZ@i56T z_p6oAO-L33Wsqs>;-*h2=??5z4m|&2keRmNm4wcbIbx6f zlSuDFLuE|zLM2EPgHxyysggH-Q00wSoVEQcd9Gu^Hl_+2G+RiSD#cWlrTzIN=W=rM zKnjJ$lCCd@y`3XYs(c?yzbdEp#MgnU&Dk$AwKK9x>*^t3Uny>xEWDoTaB;&Hf^?iE z-&RZ^w<|NFp)YWW0k@NnuW$Z?ypB(@Io9EUyrFgO8pC~eAnk8#S=Csz&E?a+Vd@UT zuJD0A2-HK5wF|FxW&E)79~Vl{{Kpcbg*xr>8WWI6t_3y~sG_$azEM1lN3R@SsWD7! z2==zvExwSVHxbo&udgUR+3MafM00rkkZ=PNCyz~5{oWBxcggXqo2qu5BZdx3xn&o1 z%?>#>0`y8nG#h*7re8QvY2YQv_zvjUdT|Ma43B*zo~lrc&dc&O*|wYNP*HOO$mAB) z5)Q+2zo&etxqh->!YaE$who3Km)HX0E%ep5b=0Q+F7vhZgM2;^R>urh@h~uwr#m$a zX;zz0@u?{zATg8VJ9K4GxG;n(FK&gRxb{5jX|L~TvFpU%Xj`2;^TY3=(_&XSV7el% z`)v;f|4scpnqSw&r}+yQ+=$widasph-MG1S50S%Ncl2iQC%i3h+EuhJy3hlwVRRkw zU1$^6g9&to2-V1GfBBWRz};Ta)!DOj(_zU~uSQKYQqDSj|MmNq{$p3W*Q&bS^7#0p z7vrt|Q%#ccmI+5ev7JY2dZ&p`w`3S&7LL9yMs*9|klV!qNC%jA5`^EHHyZ1OV{?(A zvH%8gaK;AG21B9&+hqC4mC0{GBMD^wB!@vF6mVHoX2pq7|G6magfg6Pf~=pqWBnR3 zDt=sPs@T)*rJ7dp==X>7DsPnhQ|g0d(iXq zhmjdDuY5UjACpo!VUTGGK$jRyqLnW$)tQA7&7RW`wbDh*l?S{Les{i4G+l?D}rHfCuUd|f&45&I=vq%TGyZBFBc6gf6%zLq3mTdMq2>bwr%Uq$`%2KwYOes-RIMu}Ls zomcd_H)i}dO>hS7FB1~+hY;!Ad)FS^HCV|b#sr(Qz&qmHMqy0jFWv%-dy`zsgAf9) zXROe(*@+9}voLSX!o85sqdq`E^voIjA*e6d?*E!F`X4J5vRg$r@LMJ#|CWjVYa6To zqp1IPi6|2mi1wdobDd@lO!#zjSL|43$zbF`7E3E)2qunnW`$s82rH$vB^|m6TFHne zQIdFw3VZMHCm8-EQtK@?d)U??Sm~{D&*VLO?=sKj?(^NJ&kyz+pO%tmnXS=EBHx1j znVY$<+e}VJ3BJdvV@1#b8lZNl4__mwLX=YjG``amI9N{|oR4G0xMw1eGU`(*m*SoQ z^_JqE5cQVaSupA~2`Ctal=$`|3R;R!>PVD~kmTMNm5BJBDJmfu7&6tHw|2SZJ#}x(t^ac?{$$y9Ln?2?iPADkbTR{MFyb%w+ zus*-oJ)iOxZ0d_YM)1a|kYI>@D7)exHo{8SiI-1)j~~?#eaDW{#}H`iTHbFc4fi9A zO_kmQ`tUPL=-z3BAWF^tPPJ?rA&@;B`xXsZ5SHOUL}~c^3jVgTPvz_Varxi z;Zi*l!y|>Ir!NtBa_TBG2BX_ZT3osaY?hU;s(kn6rbeQ&CjTkDjB3qYNAV4XG){>K zX})LK$cq}ER1@nYkrr1dS+w`K$v7XS>$gYOr+(HTUt|m%?uS^n$fp<|hE86*GupdR z10sVLTAe!yE^T!7g2`P=PbZ0Pp9mA~eTX!`=jPcqbFe4N(1H&-d~uXs;p32b(nkCO zLgC!RR+nkk!&EHB7EO>@%*dL5429U3nW)`IlE0%Q4fcJ(sGB-2sHn$;sYXwY&z);V zq)~mQk4!|E!qqcNi2U2qdU|e*o-7R`6{Qv!z*59VluYa78=6@(Y=3)A?^YNxsAXeg zRlAXslo@QSyT2U`C{o&7Haupu6?tDHC(X10cj3z)P*^Zz7{EAG)&0slnR`C#u9CbN z$M5c%Szus!Y2zh9nnGdcCmGNQ`2A0E(1m`$BjDVBqaHw(Olqf?MzAx5Eg5a zyNtMm%`7!Mb}3OAmqkWY=_<${)`5aJ<%|>sR6UpqHf-eaI~2VSNigvs;*J!>An{=Q z4h>WzwZDPvjruDVEHF9%vA=MSk$eNJj^s-w80&ny;gA#c3)7!c7_awlFGN6~po~-K zj&%h{ZsA_R0l7D)OahgM2xB^2chBI)>*C2+nJ3vB>z8=&_ZB(X8}AO)prF(@&We0M z4iDlcL%R8xSl;HR31PqV6j&vC6sx2O3eGy}w%OK^>)z$VB?7AC9>iAixreG+AT8d%2 zg#3xW{qG8cGNJ^x((Zfye%!TX+MIJ&dm4pE2dFch;ZX%pKzO=fr8s@SP1hIkE`+9| z=Y07KN34h@O$j9QiW=EQP1&83_~@#5gA-6rI)Y7a3CCCes2LO9VBJ$`kf)*mJp{*Z zM6L#9#=y-dkn(hB=y99IXT1sb{jp-T-?91rMW`e;`b+}JAoV^1;e}(gsS=UOtd)0h zKS7hRONe)|6?tadP!jL%b+hdt)Vo^rO}07zh2C}>xIMSU&ILt_uOp@6EIO+iD2KI-pM(8J^UL#?9z5k6 z=bcS<1b!YoWV{5QQ)?)~-EIW5oroRvrZ)H9H=Iqox%Qy3Tc8yf;3u-+G#&#NCPq(7 zfk5knfgC1a>MsGXxk+euz_4#QRU`9q`W=q$P=s*Qp(mU(f|?um_#_DmB8<`@`i4hp z=+REDoR@r*%d-o02BrE9t+M}_3-xV|nwNdlL(p^?K4X~PJ5>G7aB70EeqrYpg`CXn zs)t}c^4e1+y`MMipY-PQXnH>hSblYmKR@al4Q2`kv>ohp!CYOKTs;ekp<6tlPfrW| zJ&n3pp<9}&W(M)?^ti1CBxVM8b}8^M8{Z`t(@ll2JctaOF7M~|LN#ATfu@e(-I;#8 zZv5eX^qrKZGk-C6elT13!CTnI<^kz5d6+#!+7EczO_)mz(0v%zR2wN-6pwaNko}1z zW|wje=4LIP$1&`7n8>_yr++vDJkqFQC+2<;)Yq{TABZox@(HLcM-r%6s z#J5;=M=Kqk59CcFCBlP6iy)3>Y!#)|q1OPI&CZgo!jWB)M^HqcASZf}f^Z*gD%P zLF6p|@7O$WtIXAlf7|Hc=e|Xil3GDond2T#c6m546go;_(ZL6&RqjyFFgs&aw%qPp z+AuJ2md5AO+|ZgB`VJ6_zaH2+^KR#Ag|*{LqDVO6zdN#apm&;emzA8Ljhx|Rh34YZ zRPAHC$pAW9;S>md3smIh6zYJQ?0_?PV>CD)#9dcQJ*tSiaL^Q*!Uk0HCQG8hw9uaM zxl|+6n5@Woi`y>+@WyQLa^!*ar@3h7JhkVN_=b3GQG8Ng9Y% zH0?0xk7&slrWQGComu9U?Ri?+H4ulxw9)Me%(FDR5LO>MfCeU-CDxbs3|cSLeWkG7 zZ!tsD5Z6wY>BfI;W*q1{;E!?zgM1dFwfLCsrvY?XaVbm*cr$gm+S?lkxMMSB3mNo9 z@)TBepmpqply>VCo8Eq>ip>I^T3VB+p7_lOsl8Sw)h1^{(zQLyfgaf7(jn{ov6C~X zE^Xw`(ZSK4-OjncswnBJ_Kas7CG<_D^?jMEJ>dyUJnu^!f1U@}x;VKzXF1YT27d52 zoC(V9-01)bI_{~Ot|vpZqv#r3v@+p`v;7$7-9@Ko)OP&tNo zG``d|!ftQA`Gfwo7rWU7TJ(Wh){VYQ|M*{nXZ|zo<=A?b&HCmRSrLJN@c);!86{&E zV|#Nqa~IeD-P)7!u8FsfF@6gU8^j0Yh-?}=NM;SOL3KcnC<~`GLIP$d7Mam`@dLr+ zYB4h2B2xO5qpJJ%v#&uKkGD?#yJP8a+ds>GL9&{+p0^G-W7NMPkT+vyMY5oqJDgjd z=`MKnbKL8Gon!sy_h1de1rvZcJbahU(+SalAc}4vdHU?W0PYA=;$@0W)Dtz6Guab1 zqdVCXH?uw26Eed)*%LFHl(00Pko3-#rI`3m zmZg~V&XzTw_)eEKpY+a`^}P`hI#cqWJqcL|zu1|RgMYPxT><0}2@wa=#BXpR;aVgd zC^@;(aR>=>a`FWh3mFr(o0Sg(@3pACg>!pcV>8)6< zii14+C|?~l3vv1K{k7S^z8_e~dJs&=N7XdeCDB?`Qow(ej%giQD%dM!kJSvta3dUD zQ|8FAvE$NiQZr_3Re_|<&QPn?&M3OhP<2Vpn)6(Lvr=ZGwjkZKW=d?^NPc6x$>CKq z{4Ul0`QsQ}b}C$*y&uw}lOJ1}{C2{UIC{zsZq80(V6jSx&WQ@e&3-R-@>2Eg zV!NAr2ugwXl4p$TNszeVzp^|d3)%YJsS;otQ5{yv*E-f5G@&Dn>nmzDDt5cs2*=9M#;^gz`qckc|CS@j{Wl zBQlh{EgDF^87(Z?nk)Vt`#Le)mo#@xbXO7a$5I#T>vX+Y5flk&S|=-CG$ogI2iTPn znL$!*3d$>~A#6(&mbj8#b20l!rU{Uz?53$Wx#_l+OsuUo%1J{+?jk#B?f%@LqoPDY zc>Z@i(Q;6$$*M!9Uz3YhDl}aekRQjK#S!Qn{^7OhuS4?-fnFX*Fqci&lm#-DU(W)` zJ`Y(B;{dld^Z*t#KNJNNaX@o27H$FF4{Qh05bb~(s1w*Q%n9*Ek>!~5&XIMS_|A}Z zoAfS_MU?nX%qMy(3HF8UFLGJ|_66`~7+{>>gX~8)0;3SUqXqRx=qG-o8PtUBletq5 zZb0=-JE(y$B!8oE4v;9*abFgjfNAHd8I9vZ< z%|P}XIh66jC=FDMz4mN2FTnQq_8*&(d621ps-~HiyQF#AuA~IEPq?czGL8wcpLH^x zmG$PQ^k_J-tKfb$`I`8P9SXE^$ktEO^HtqQvry(I)N01P z0tUVWUU|h;Lu1w-g!qHoaudf+@DI?LH4p$vOr|KNE0|3ZTw_&DoVt2PyFo}G!J8*c zOF-s;M`d|E`2ocY^t>c;Te$IvZ}d;FUYOq4Go2m|x3+6X02>sZEv_iTTYw1vXGWAD zBJqX65NGNgLivMDi#q@sF0&51J=nq)pv!I%V-|YgVCPtd2Pj(q2bKy`8+FTy1y<(9 zuYsy2>bcP`&n$9ZMNT2)HS%!P#0ReV!|L^qVwU5;gL&#U-M+w;{Jc$fy~r$FsNG-n z+L`|LUxJX7wd`&0>jEZ^NS$v5Z2L$d)?bR4Mo^5e4}tC;MiY2W>Ck}fAY;dYPvC&O z$AN|8fGS_15wycS6yGekLpykf4|x6|=;ieQh2uaApHT?G#uWlk5UFz%apxKVh-h$t zxML%TZI1`8N^uv4nK%R)*3SdhUOT|iJrduHt*sf&?f%0A!q~y&_m67^k8b^|I=q*$v@-K;c ztGXP2oUA{LrGibMj$tRXkIL_5dP5yTuYJL?YX(ZyGZqn37ei6yK`65h(^UCz4+o=W=8U!BkE5WV{y zKd2e}5<&#da{RMp9bFf0ALIpx%Q|?^hWpMfe?IjhepEVs{L%A{2qAow7lf8|aEk@u z0w(&{johctwGNRB`VG;3AVyjNIafr}c9Q3ZNL~GLH;E8(MRD<$5b!p$}?b1Q7?n z4a0_%UyzmtGn5U%nmOwc2MVqh06{v2LFLL%!T;Ui*1O|NO^I<~+KVoB!(5i$AmVz1XhOCgQ781_b+WM2Q;ad0OW3MD3Jx@e;t31qeF0ba^ip^B^)K6Y; zt~dMVtKjdQlO5M_zw1ZJ0?5GS%}Wo8P3lT{6DonnDfQR zqhQGtNSKqvFrsWw+5aE-Q59KvQl^3lR8$t30);bNR6}ZGL$kJ;Yf`5Ckh}?E)K9Y0 zB(5|u`lw~88Oo->k#(tD1ry>Zak9A|O_?KEWOF3W98u(C>B(9WN0(%C#LAMz`JoYF z;BmsFQ72>?Tv}+4TiUF>y61uBGm>qX)on{sZQNSCy5hwl{vQOjDelU3IU_dEy2EQK z_5@MSWE_cH86#d~U}STY#3>t6Iw6Q_!y->D8U8OA!5@qXPB~{@nIjh7KSu{iY76{n zN_~8pqn%eA3bBbp#6H49#I<8_#|h|y*nPXxy5cGB$|T z1{=z>5g=NaW+Zjyj$n9rl;vHU8PzC0y@VG7$Qp`6i@&4oV!}+`c5e08H`;SSA6XjL z-+O3v&NUBR40quKL+0I<_wzFJW4Ny4_#!*faKLaKNogaDq5``(5`wA<>cs z2m68Ti$UnPx;#)r)63{Nine!OC|2A?dtFUSAI%D@=syVdQy0B?LGfL4V}bjszimgL zO9NwN`LQeb2lkFO=^Sf1mSZr@bW9KCYgt)07p!c;izH}a4~3Cbk;>UWI;X|1L>_zX z>$nhu6cW~oD@zvlHx_p{1`4}&_tg_t#^TH4!(Y1MyVA$z#t;K+^X4D)JD~SB(?ipo zd~rBj*grX@bx(B2`IL0~`3Y4hpRYD|0dRca{KQZveT}F#@=uNcao&?S6knA?Jea8@ z2X5T*{Uc*xUsY_&fFQ>oTbg*A?LQe+y4g`SNod=2hxv7Sd2(S&Jmc0WC_^2& z@bMM?utUA|6|Sr0ueFyKBQawnu^Y6KiZ3~t)i7nk)U4J^KemnuV+0^Pu}pZ*j@2n| z;3a)7OzCL0N2jYouP_S`B09i6g?5CSf-edMXi1M?I@$0mSbYqX#*L%r9BMWQ>Tk;395`;gR*U_l>s()*wW9UP1av8@OOGJ^9LMfUI`YdD>Kh|2IG z!&3X*%U8p;()%=C3y}z9M#hwH>@SqtnQ{?E9t}X7bVe%a;!qbBN&kYUTr!zLeQTt?{zdh?aR;>%0zo=BaCv61vGha23EvaW74sRP2#Y_@@%q2KkvqpK-pa1IofrWO_QWlES z{v@guRrHt%6v3HsYBc3u_Mjxpq4TOP)8dvi+GHgs(ad=Cnz83rVJ685U8%KbODSn~ zEKAl|rxqJFGtxCyjk76BB0BY4Hp^+sXfqdVG9Si6%s>WoS|C5Xct^N5_6ilLS)6Q3 zZa__<1LW_Y2fjU(C#e7rSEP&g6L|i^G~7S-jMvzhbzf@Q>3K9U3vq!Yx#vzu{f0|m zHyU+B^sp$~OY@!(kcH%fk)2h?&+&kfu%MWcIS=FA@k_2rjZoDUOc<5gY_puM^Br9e z4+^pFCfFJjgumT~1vUgahj)R8eomhRgmh000Asr1WB7Z^rpQl$S)Bw_( zeQ95XJ4Tqlkj@232LeFt;NJg?)R?0D$X-&ogpPhhNlM`dYmx!+4N?xUdx!^@sW#%S zD5CsgcIldQH|jh*az^@Q9W0&3u;-zpb_Z`pq>X*ZJg~ZRZ1$55Ogbm#Zjv^7-{So; zb}0wRpMLqEUJasHzP3PjR1ByAvVJdznCZp5g45>xv| z_0lyRmmXuFHZ-qe%eDSEqGp~N!yC+2Yjk>w__$Ol*skrCS(llx5s9Q0fFfES5^&{Mozp)bF+NOJQxo_ zERsmtQW2=5S}W}Fd%$0g!#3gf1yDm8#?%!D4iz5(On zyR@`3(SFQr^y+!y^vME8h9&DlT+(JO_YIVU)>t!~mf6W6Q^c16iv;DdT>!TAfBQX|EZeVE#{R*)qr{8plm=oWh?GQz{puBpSdVRxD(mm^Hu{Q z+wHT}Q%Ed;GC?7Sf2P>+1Bax*d;+T8GEozkG zihU)jWOlSHt`x5-bfKWKZF`Zc2kSuphPXpoS@E!chWLPp9lJM3o%~^-gl%qGd<$kL ze;d6cO+^S6v3O4F_9v$G@9W^}NF&Zi2KMtU%Xxs{U(H}e!hwH;v4gKo8@7-rC zphV4J>9|4b=Fq+ya9S1+dzl1I1sIJxFg@J72mZ8$%P>9kya%AP2VA6g@mGP+b%7WX z2m0T)HG#!*g56Fc0$~W*p*3(h$NWmbiH-+`!8*}J!LLtDz!Y$UVI|Or7VO_l?1!<2 zQ2@|0GaKWFu&$tz?GqmC<)Wo6O$`s%<%(hSJRr89{l5X)2zdEd1v>_f$|U{>5i(zfps)J8{D;o!Py`&kg&i z(Op4yxUzZ!3n^VWTFeAnVQefrhqL>+(sHHE#9@JO5b{mpTqKWquq zZUXHE*RFazKy1Z(JdkZidtPAH@OwO9IF(=<_~U7nj@nGQCdztV*w&`r4*sTa)%H$M z%8ngwJh(wR3iC!B(Cr%C$zp8j&t*Dbj$6ma4R7{B;-L@c+%bY(f<6C>zbO4IjONRU z(j~?-z^aAu`J;Eqp2Hg>c5$NAP0xI(5xx6jwR@qA6K6}_kHVlY-Mb4Eb*s=9Rp+D` zm>aXji6a;fa|j*q>PPNb9_3Flw5VvFnWn2*IuX0TNQdbc3+^J;fD<`cInsSC9P9m2 z*5q~$pHpqB4!711w%hfHFYocjnQy1O%=@~ zacC|S=uItdm(@B#F;4nb8SX>>WTxriR~cbK^LRE#2EtpVN)RbmBeTaT&oxbwyC7)o zlik$*kg;D@rs1}!D7h~`7vL;EU(TElop@pMaS2IVG3groZ9V^Bd~;;h?_ZM;&a0n7 zuMTX%oz=oyO4p2jrua%A29Y~J3!}^Kl()*Z~3=jBg@egUlTSaOy4}BD2jNrTU9}% z<udTE-Q-y)KtjAK?n!W6bsjSCQ+M2aY z&q3yWAbH6_=I2uCLlL=o8nt-_^$Dr0Oa%3bjq22RCPrndxXG@J)ZJ}r9yShd9PKME zf#?#m07`5cHY&BAJbL;MOO~K6d}G#>`gQy2C@{%3QW8XexBw>RdR=yhw#CjIxwubs zRf4odlGqx|G53ntnoxGLJ)RP;j?%ENRIk-+uYjc)U8)&c;j53l=GhURKUhCeXS)Qg z*WN?j)rWXS&`eDy0sEfo?a*xt45>33ELvvpxNpB48Sc z-SWiWofxDUcRMK&?J32fFFPM0RF=xmaX_h$`<}Yhp88z_qZgl6KC)bbQ92T|tXv-_ zZqVy_;0bP{-cA#hgAS->Hux2}imOxao@>eIly+`NI48;`{k6PuI_G z`vPI}VRHyW9k|PP348V|-mhS4Em-b*t5(rAY_~RV<8i)(Q>uGmp`Ob>J;hz^hv({u zCVyrWhV}xMGyk@%xyk>2a{DdQIhE>q8RoibQ4x{l*dT)8BmZ0X^j)GY)v;g@Yl~mw z520E)A;p;-5QYO!^F6_hFxC1O%U^2pgaTTNo3xFjzC_A;W^b8dDi?^S#4B7u(X z8en+U_#by_v!M{eXW7kDb}5ZB#{gkE<&DXsdqA0j$jIBfReZhA1>;J%AUal)uSOy6 zl!0c0PVJWVU%*qt?0Co>6O|~_fuXJv6GX`0wlEuGRrqcl^r|pbKKJPHxs^u~Wga*y z`v7oT^02CGH7ixxvIyd84qCJ};>bETN@9PAURjYN7~syk^oBP?dN(}q+#Tz|rEGgl zwqSd18q*VnQFmA2Sv+UEs?XY!cU7}yXU@dn+=-W<=g5;+7Ff1@oeDJX-PWF>#oL)< zF@OaqE+aUxC_N~_(cX=%hNc{cWi0?&nD_Y*&?-i`E`JNr_F0E`eC_k}9KH%cKZOvr z3sdTaub<^@1aQ_0@96*nE)NZ2p?wbZxFCKHD#Hx8ItfTn~t34ESS z-{lkk{x5(H$L~33hf?v;2LuSn>Ua8^$bU`qlXG;iR5N$6S24HvPBL))=574%!%od_ zH@YOcKh(nw93-GpO1Ts_I5Aqi=0{q_57}Yal++KEZvA9wz1^$REBLg3D@d#PCAt1* zNM{Mvy{y`#V~{>Z^OL*XtgZ#0JG`DZ4u9WY8~Ql7uW@{q!>Ro0d2)kawQ1Ur)-SQ=aOd3!0^Hz8E!|YUZ^t+3AJI8au z=9~F9IPK!H5#$%sxqE~&_HX6XsG_wb44k%rS5`F2Sz*IGAFmY7&Xc+`jCqe2>>GTn z^gD((h6Wp6ADvN8{5oqjw&mrW@|sn-UIm;9Ii;mJzuce%Fe2`QtzB3Cy$Sn;9R|i* zcJZ@C{oSW3F4R6_FHQ@#1mi?Kt{#eBcKe638<-3>;hyPOyreMl& zel)@t6A6Cqlf#5+(v9Ne-)|TR7K~xD4Da=poLewaKcjJ;;Hsf{$R?AOJKW|ytqk`G zq4rn`crDEH=`P+khpU?>^tU}}idj_2tLm_eJ@o}}fjU=;_=2>+=qxUO<-)`0VB#;D z5p_sw08J-Ae-M!duKM76@O+%Pa3R8{nmD`;SI$&7FyI>gGbL0y;&x((HP)X39so`} zo5-3@N+C;TvTUaVE=UA`w3KP&j;UW7hcI`F7(*-ZiVte!hNjri)o>&Lj zKlIn95C-GVwuKZ~e3MqOes|Ky(`fmFqV1|kS%E~$T3qE_S9t7vt7ykg2=vPHo+08 zJgjL{cEvwZJ46SvSz;gU6@mn$Qh%ZU=QQO%m6deD1t$Ow1cdsV8TeldfM)+cE9-w7 zskCWXyWweK^r1}>%4TgS9MO5;Q!2OwUvXhdXO}hEHk$LMlQK5hRVb*Gn|hfklEmrF zPDIHT(Xq>J!lja%Gs*@*S>Y?mEvL89K~5o>M>MC21UMl&A$}b=-R4x>OA(UeL;J?> z^<=%?c)t4VKcfBfe`5ye1kFb~Oe5JjiST2h9IE*`2;&y44b=Q}dcpPfqet*uzT?3) zP#ngy0+J#)79SGg?#T`7M!wXs?Z^&qf8BWiBVcYz+aCS3kX{$B^x1qkoq-8Nd+@g< zhku?vKyhzghoKKe**=+!eMgXx1|($%J|35j#(m$;kDvYsZ#fSl6$C1x-c^VJBl92G z^okFc{X4-0L`BoXr%C7{@3cW>cvF1xZ3$L^15*#zN;QwUGedK(ZUr z)wMpf2f-xCZ-u?D!>P}{30;BuAgMslE~B)nG8nI|+WOqi5sSEoQc9%;Nk^Vl_h<<^ zwDHlxSKLeIOj45r#?o2G?Yv0U^OhDCz)@5_n6WrNKA4g7Bm;AlANFFo3d=&2T}@J` z1bxvi5=tJx#+EMpRerPlREp6=hgsuFS&(O} zjJJu1U_+*}rmW1e>C#_SEilu0n3lA8L6n{)-$+{yu>oUlO9)RmTy}`dX3c> zSAmU$>t-s3o0m!q!Lgu;0v~gHdG4pnRC#1XXvJ#hF-yMio>*s-2&CW$iKyW&>rHRN z_-8Y>4pkBqPY;xdlD4hYfMz26Q({1yq- zJ0*3iYfYejfHzfLREEL7R4&&%8M-YR^k@#Zin{q?&T6g`WqncuK^(mEdvy4OeBgFq z@!>)>x$=QQb)Qc_&E#tkguABYx1iYl=YNUD3l7j7Rhl$2d`*_cuF$NgrzB2sN$=JMLLrh zyF#|%h_4x6ihMIv%l?VYo;>Eo8Ex;VU-oxXCtCfTY+2fTk+tgWgC^VE_GeDJA#r2o z1wh1=)j5J+YMno{Kvgu>si7Swss>$ER(c+h8=)akn@+|Fh9qh48xd$v*-I|utDiy$ zmYi%NY$$B90Xs)_;eHMDyHhi?GG6lD{S6F4AG{%GZ|bH4-Y{ve`i2uyr=EJA@|jOS zl#guAae&+UkrBZmOq^VRcCg+0lK(#qHQ;vB_gMTtf}w@ONP+WWGH-Z!82i*1Zz)_K zpJ^q7%zNn=Z-@c%RUeXJ<&@8i55TXm0&hRDW0*Ovd2)Zq)J8$~hwjSWz&#g3&kf`Q zywbjX$PF7p6nl!J6G67=Q3TbIi!&j;0Xf(6_?xi#FACUFn~1ViOfAJ?;JUW2x`$CD zP<=9D-~r^rN;W=e$6k)irIw#=zEUUxI+FVk9e0N}XKh$Y4`mIBo&9!^4GvPYrdrYB zIa^E(u)avF_Q2=QEv%+kB;0rA;p;ag?U`B3tE23glyavvI>T1Y>J2Mo!PQ&|!BrDk zC}Y{M#iS1_Ur$^eG83~0BNcX&LGN2d8Pw_b?~GYYRoK#K!HGmcC4tkxD+hqGx{dW27xnAB|^d5*|C-gc7lLpHme z3mJPCyxKhS{8!twfboqSjbywZSwi5P)Fa+j!GFm6XNf8Z7XhSVTB6U%y4_ z{X&9KFt81D7U^#Naav2WLpo2-W2uBH?9jEJI2sNH*IR64@ro z@793S@Po1oQ+u%nsmu8f{H*_XfC$=lVr7dnlc3U2$8&vK!N+(6CXleykBM!Z-yB3<@3?nQt=vSW4jB+XW zuh(M1^XL)e+P{fln4zU@D|>PCTQpWOV0OPeBb~t!KbYqPKm^j?PJR1`$7cykph512 zs$*y|dDsY|Kz2%j+6kkgBz%TLhEb zp;2k)9+kw_IC|NK%@4II^;&nh;H2YtJMqf%TWw>~5Z5BBAH_^HV{jEk*o4g$q9V$d z6)e6ZQ3gp|B4_m((J7X?nrPV@f=Ea4T){Nkm4xNxF8GX@DZ8m0j%*VIDTT$3WJw;4 zykw#Z1!}i$J#<#>*?T* z&9$<(8}g=+>WNlr3vjW5+^3a)NW^~y z@*bNh)L5_ZT0X3ZLCZ^ssUe6HLcFY`=xCvS2iZQDqx06qgpA z$BvO%u`vEM`emS>4}#uq0C7iKdIcX9?^n>D`w*{bM5w)qFtzv5wE;s0mVZ9Q#H*)oBSE?SFP~9e5=?%UOuh3 znTiO)D2tNZ@+QpTM1rrG_8Eriy+0xj6)wI2+fhO^BNM&ROkj*~%* zHh#VnY~aJm=@;k(lLWsHO0%?Z!E__lVrnE`=D{>cX5STNx>n2?$oVh<&%^ab{NYXn zuA&Crn}Rk>T{-rPaS;I{*>-eFf7YIq^*e=#J2tF{y!rwCk}f#GJqbF}tzfv<^l$2z zLd+o#|69+)|44Fn3V7spf1(AqoDdM=|24$m6DDwTcQOB;+0m-zZvPL+;6EarMCzX+ zo%Nkdm)j50SzL@TizSy_XQG9cASw) zc;Pqb@87?VMF03-qhjx$aQFJv?6j-}!Q(yHai{O_@5jHV6XJg}g9)SoSP&WwsxkYY z?f21%!t$|(xxBKD$|V}G^Jpbsv{`WkWba%-zoY|1?*zciK!a~D*q>UR{Z!sjN8AAB zcFUe2t4gnDgLy|2X5D7>JBmnYDf=Uugew1XG z2>^r4zJR}jfPiFRS)v?erX*W#NthWdSPrBOXa>pvC#6pc{?z1{IqXnZq8-oC8)3uP z1wiT!7^#@r9;S`8F*R1!6;}7U5{534^IL@Ieru)_4z=k8VXEM!#tyd)ayW9FefHqQSP6O7s8hhy7B+hEu%yXk& zyv(bE-PZ);B_j1GHm&*0c{xftPx^?E_%i$IrIrlZOc}Z1DsvonLnRqY*iDQona^%d z#{^9qQw4P{3mI_6GWm8~RW52P(^Rx}V-KRRWNAm zuB}#OUF=7KOxvjhT4w9#Dq3ZfMMXVxKPeZKQX3c^r&OS)e6cVuwWLeCwqn$uqR!b^ z$)98pma&}e7VucBtPqOF3~D1Z?J*eXoD~H!mAetshZ|nl$z>et@f4J-ziY@Na5_A) zXUGMF`_c%nY{qDyS)OHTFVR*@jah(+Sc{N<9>|o~vFGG!7mmH!)FvsZYhxET?NG;5 z35ZxvF~P>v&?#Hz|2Qnd?`0LFBj`@;SSubI>Xs1al~-8J<+t*9*qp2;TIl<@g85;2o|se3+x$v^T~R;FZ{ zzP3Shjv+p?N$7b%P;FP{$)vbIekXLU$o~ETn!Y3IEI2tu?9Y{uT zmMS0L`D4nER4)F?Mo+F1VJ~&Agh?)ZD~e2-ees@6P`_yWkz_J2t%mwaogAKUHaC^m zxbP#xq0G{bm~kmfo#dpZy0cZ;&dTxAr(+%|aKa14`~kbKqW=0i(*h~vduE5*LvJIX3d!egS@3{X;ub_wF zW#I;yY>SLx_v;#31*MQ;lB&v60(4*a;7%A$8|oZvi!ger??eU)9dfyr+iC1i?5lLIB!ap>$G1LR;II@SdGcg@J+`8M0qdrub+41JjpBG$BilJK#~J%5sWbT@ zQDUWk4Y)k+kawt}A|i#t8%O!L7dXWeR1pnR<1dW|?kb2`e zgzj`2^qLCj8<-750MY>+1L&nSKsDsN5oVm=M!uU8CsfQXO&+cXM38l8mz7=43)&4Bbk#Jo-8EaOH{Tt_!_g1wjY zUbuNZb8*_MtejFt{^#u3xPl>hUyVAa5<7V+wzdhmN%`N|0K*J`jzhfc&mWBq_z zEU)%f{77$P8BNm}&339K>0pC*<45piQdaxKibewAhQbO_I=R`j8tZ1yEQoW(yWl>~L}2`Xn7B$3sB*%XgdHFG#L=oEEIRWEU_I=OqSV3`?? z*6_kF5OsuQVsh%{bPOFXw(AEt*}D!8pcr^!UTv3@HH{itMe6FT!xzFjxU2BQvWGzB zZeXheea&OI5&^|*6YygHWIQ6w;wR#|43cTg@q8y*g+^Sh<>g`a4{wlqSjE?6o$Bf zh*c#G%kgEkB+7}_kt^k0W+Ag=m45b@Y~p$dLN+S(DMZsAxlm+n7a>!D9MhaJJ#?9z zA`R2yXMrE(onkP8IZ|5Ya1x+tKoU*aK&euX=4P{#I2HYld*G_F+(Sv(N$E}bLJ7n4 ze9XdX86Lii45KC(m!C4G*u*f`s6yb8Vq0pGG1;u*EO)F+%T^5WXyk)vZWIO;Db(r4 z3*_xvBY@{9JxBC@x8tENxw)mLD~a2!wy9Gi zZyv6WCi3wWYi)DYyoFh=oiuDo#ni^u&?~+6ohtn?zwsn;(DK%?A2NS<{7k?oiP)=$ zdk0L6<6jb{gS>(jtN!)t)z?}3~V;(9gDl?&7TgKKy$f2p5LqX@At!O_B3`?;S7ADV zl)V_(-U&*-31YtxnIXJUA#o}r?ieS$VS5hYcS`dY=9Gd9SomU)_oZ%FH9}#A{7V|j zpj~&AFMIq-(Sx!&wBb-_WT*Tywt%VZn{=Vra_RQ5QdK=0OoReu?G~DJPKgBFv;SL9M5N3?NT1<8*_^H&2a1NyjK+BF( z3eJKHh$jkQ7F!_vkgf*re3!;lXCdXbEwx>Rm5^^Q)r7UV4r5`6xpwDT@rM=YI}jT# zmYw+0`=&($2e{vnnR>@WNk2;pl4a}N=Sd&sg=1t5uL^_@vIDr%`-VgVe{#PQG5ME< zeq=EFunFuhX!4#W{B3&|V0y=cdq>!9%bzQ)_n6OrknazY6v<9^3r^3M(ZsBwHP)qC}Ud*|JKnA#KN=F0;T5X$b~?~M@Y2ZQeV`h>g=gu`k!05}Dk~s$P9)fSx|u}(9RHL5 zhB*$LMBjP8y?1(MzI*SFo!$o)4IJfuw_)mC5Di>@B5_7Z-#IGiKgkYYOb_S@{pfOh zb=P~ffO|*TJq!>`-?=F0Kg$k)O5Zss=s(U5phyo03H@kue3jSpsSf>!cYK|>`D(ee z{<%9o%Jjfb?HB^>M+&+%{tEg>KPm1rfyy-ZgXup?y<1lSY+1xQF1 z5WNF{RRN000^)a{1QuW}xku!V94reE2E3qyrvUYdZy86_0AWh+)FVz%eo~LZXNYB( z*duyJ1=jtHmwLqSu4o=f{!)7PlY8eML4nYKLgX);;Bi1d*$X3>8jufqi$B5xTLSv2 zUviGn0EUTvz&k0BaFUM6%f(8y$ z=J;j|AOKZx~O1493Xc@nk{#RW$_LjhjT~P0bs3ML zk)&}zYtlGL3{;gA+F~l7-qE783l0!7Dz_xlOIB6npJH*M?&&id==i}E#+&}Er8(}? ztLS{V7brfNpB;Bw7eAvxoA;h|L$<+|Sh4xJ!GWv4;P8`get2;i-~c^O^RtB$UIb0i zKvsUkdcNyx7)rEo7tlv~MOokA&QH>#`-J+8@{HZ;H_8SqY^8edPmzT?DW`xlD4I;l48G#&2Ku~HT)xPt_|Y2HXA8ZbJb%E+vZlVaXS~k z9cR&mgP^R6n$>s_j&5A5sEU?azuPBw(9>DDXk6c{u1kzmo64zWU~W5xNUdU>+=`>9 ze^rsaU(vXt!BlJOp{Bw8`4f$&Y>rQ+uK%X9W~sywsKlgWm{ozQP78w zt4k2u<72Ek44NFQ2*FR0!2Y>@L9_Czi* z5^d~Js?QaLY=wCYHI=|?Yjmi52OPmpMU0@UuVE>Bk%wYdB=Ys5|F&^x<0Htf;cPoU ziJ*e}(};4tmAXRJ6C6z=-Ie)Z;jHyLJ6q!vg(Y1y%8EkWn?!xVuGo#>tC}Mkr@lu; zNu}}n-u?qs_4dY3lUjtQ#`dO%-^5dPoLaz&_gkHwU3(-PE-6fwsaQ!HS>5+9=dk|I zFiTk8svTVPIHj|mzFQwljlEO2%eBsryz~NBSJ72*0qH`EzvLZ0IsWbKlObcJUymK< zzTFy~Ju|cFxn6+gy6)xm^@E45vv!`03&YDXT4M+O_V(f;*Y~XW+33EV*;WNbiTv)F zWqsqP_SVE^rUdSAI-HhzwgMx7>A~Hx&;HMHR6^O z;yEN?F|&LG13c5KM=xDXzmgf0jxSw$zHV=mkp7|7?e{K@*$w;gW}b^+k%Q7W^@Z#8t*$QGhvBy?r{hK881T&1WI> z6C2M*k5}SZ4aBj9^bT-D^V~lIA;02PbqjeY?AJ zLX~0IX=3P3-To@+R)Po1_?b$cxpQ^*YnFIvBn~kiATl14_^BAJO$mos9nihvkDjR%rgKiz;=^QHoqQ8zi07I z*Mr+v;sUz4V!Ag6nQ}r=62l6^CUMH0t3RQU%@6lPzqjq-kw|9Hu37$`JJbvRG%a6X z$>pVv7eW#$xlrznM2l?s2Fw2yYN+u1O6w90CeeuTEg088Rx*K@fBEvPV)!ql?w^t8 zlb)LxmQ^-&ZG0hazYjK~8TGiqc)OpzE78OUW#PZioM)TwemB0-I_GfV0j0dfnqT2b zc$YBz{1`A3Dhztw={9@?Yu{e9;)0(%;x6{nSLnVyWZ>7K=A=f}QQxdntYEnh>+=W~ zsws~9EM8urCM27fH@L2iV45csH{*7Z^H zkbmAT;>ofKd=vf?&fRB`qQ@U1lkB&np(pIQPu@nDt9t0?AfsJb8^Tuaw*dcH3^Z=x z*>=d0XZ*ykyUOJJctaf#Ol+YPUY&6b%*V^pSk%cCoYiO#qzFB~lc0blXo*5jOP6wN zPwVLF>Lv8Xpg1eTB1LyfXYoTpo@H)---TvfbE_n2%*;i1LqOT!dQ!szaQC1h<_T{Nwn|*@Gtsx*&pdHVi82Ezjd9)nI~CxKo0!#B+Wcih zcxQ@p2`ufN3n9y8ccUHi9are3Sm#6?Qv4~^5I1P0IHKX?k;5)IatCkue*Jv4&w?dqFj4<48j?BI}%!wMTkG9Ll@P3{3V2ZUaO22XV`7gl|YtJ=eFbkMOP8V15>#W@%9a zaibzjvP&Y(h@;X+qz?Y$5m0C=HU*nefMEdHYvBOg%r%QUu4GSEY&)`bnWnfS4A3Qj zU)lqtC({&T#@roimLGLV?I`RGwuau)X6zR1oC!5wrtj$EwXYO9`=#I%}RZnd5_GN?F|yx@;EDHtHno~ z^nKzP)XWzDjev)iDft_!9^?5s7HhZ$IsOWL>yY+S_(xB~or;ZRoqmL!GK$rV7Tea} zayO_uvo}m&UqCzC#Ds1BIwwP{58rA+nd0BTo)CRO?m37DBm=IIJyJ zzBhdEHBgB91qzG{Fa*6N9Vr3~llfpg*4)`Gx-Gi$H{5)WD8$|J-P_Q+ zAkWCQ;eu`83o*ywE^TY~>9{)8rNbpj@*~uxL9$1_$6CR*<06UC8AmiJhZS08OJpkr z)n&!w51_9alF|VGX_uNFW(Ac}4p3vEx?OGiQ?keU)6vgvp`P#s9eB(5Zj=a$V++dO zi7;w+5cDMhtM?GMD*KA)^N-pH_ zRgGhsU&xNg(w4ri*vT8Pm#d&CB{5vZ$>jHAL3JwVR>Skj?kM3@;?3IXQ3SHbK=PO|L z=fXn+-w?1ogB^xl&#IF23*w8MxZQ_uHScDtE%Y5iIUM&x=<8DM=utQ%>h_3mk zxv<*2aBBK)hy0PhK0a0iR)dsJ8bCXQvZxHgPZ~)0G^&G&DT4Dy;HH%!$G?9`7=@cw zhnz|J1oEIxDuYZZf(^%DPl{=kAlX07QC#Cf#0+eNH(5V)oXVi}qyfhRD4gmb-lT!R z5jX~ANLPyBf6-`KRbNgdzWl>9ERR)%yr&3?9ff01g+w9`2H!%CR|kbBiHQ3RAYAb9 zHqe*|nUAdvL=k!QK;%Wt5&A%vU^ZAmL{o@Q!}}_fMCM_hT|oP#uxUpss=(-C;Mef> z8Bx=QGR7fu(JvTHsq1qxVdN4TYRYRsPLT)0+(I(a?LA8yIr~AmL?iN$Vel{s?Wtkk zbV%=oJqInR4MZgk93I*ZpV95zCJo#@2Vv9gAtVjZ-a=Yd1SOLPFC9Y7szFXs1han{ zCe)L`$rO=)F4hLtiM&82TDs)o0=!Aaf^ak7Dx>o6u)a1IM!#GN=+-Ke2J_Oa8p@5n zE*h0f!1`Kzt`}w|uu2CnQ3NkH2AALedBZmm4D6cNkrvr9Q_~_(YBfHKv^UMbFSg84 zrwy?cleNq&`(`(G$f63RAd6Vch+Ld0#(`NqG>>160HY{X<5iMYWQ_DoVp3RPDLuVr z+FWE}P!hWyQ39Av*ix!ErIuXyjZtPvd)8ch`UhdDIrSmA=rj&t$u;GHSNWkV?5tDf z6|DSl5_aY-^SVXjBP-_S?^{%qk0D{0=X4P+^IEC=kcu#FP*O4%Q$I|%d4n43@zE9Km_zpeX%J`UL`MVE2An@4A zo<7S}MHkg8FLEO2?|x&97+ei?8>1ody@gPd+UFnM*@{ElmpW7QyHX|~sJCkQIB}Q= z0H#XItI6kuVP=*nj1Yuh<13RNPkz+JRe`ge0u?nDalbFTBP=n>ybjU$7!J9PU{P-4 zNbDxE_*a4YXrco|haRkDUJqzq!x7s5x>5ErMfdR<`-Fq~0MUJv#;?efy+YA_jK;5W zl)YrpeS*fX40@@P)VX6cuL_j@QDJqCm*?uqv)anf`p$BED2qU;-Lpyz>*y+LMX{*U zO(ApgN18Wt3YjA;J=-Zv>-Z|`ezv4$K-8)35EYESHP$;KW*~}+0-}087FC2kixtvJ+!QqkX=V+gg}E8a47LDDUIRkoaPR`6W8nze z2qkL^qDCSaH%Niw1@cr(^(zEg))0hSF)gA98UeBoF+uD`Ov56?^L#8)5UIR2gwH}O zn#gWbL)xaeb~8jt(|ChB?6+h=RG13{8dJp~z$2ENrQ$H~0zYFeFWlylh{0rTSo;D- zYt{f7&KF^09j!3t9scdYd~L)a*#2U?A^RP=&PX`icCFe8(--B+OgMD-!kuR_09CQU zaNz#4FHd+cLVa`l9`PfW-^5O^;=1oo-wyu$-mmAqrXANp$-Cj>PL_6u{=Uebja&ik zB*Vnzae;XP5#8d1B~Hw6y=qs-MV5O8BtF(#^dii;zTv0%otj}gG*{TgmInq1KKNVo z5{?{CV};xizUHTyo!lh7ja%74F`05#@?y*}zQN_92flim&Ll2 zZbIA{9Cba)V3!dPtXYe!&zb3ojd4a-9I!6AZfWD+xQXw;LUNKa10|et^XBZ(4t{NZ7UcW=`^T+@3rq6xu&PhXH=Q z^h}d@h~OG_>8r-tCK=-!lw#Yg$*(W|nX9o#C>H`BOh}5yq?46##N^XU-#4@shsv0?vy$xFkeE%&{OrjZ_k zxK`1V0w-2Mi0EF<-y^L?6U$P=wl!hCWJNrse&FZd%+6PLW4${f!RzWUAUG{1Mj2ic zWIab!-72_5E9lT^iSyCM66^q%hAP&{Y}yo1uItp5x0eaF^}T#af*IFDAlK+Rds}$L zyQRAzJfLkV|UHB7Lcyno3=o%8D#4E)DIw%A_Q%IcB$# z(#a3}$*?e651yGyC@1?PqE^~iV?~vj#icjpGX$c-Kk_{MHb)TTOAhxEw(>@%>^mPpKc^Vo0^BxN`Jj(t1;ti^)7cc0>Aw8nq5P!!Qk=Zii<|-O} z=lB9qf^*4j3$*xf^1tntwd;k*Y7?5OweV>QVruey+_c+ z0}(8}H*7q>O16jhevf3RP#x5LG*HYMq%X7QzsilagNKMcA4U{FPA7R){bJCj~ZI)hvMpSzYItI zw95hqs9D6s(u-#ItC6U%#XAML4y)#UrU5J8qF*NaPMq=n;2 zn}z!>zND^yAzc5m>}+w-yYgdEv?s8(?~dedj!qKp`@F>60AmS_V=%lziJrUh25M#Y z;#~GDS%WrH2C|O^=1d`&mA^QqLG}ND+^U1#A&2{5g>{O=@Tw+yR!81bpuFMYy_sVT zN~a5Mp9&8AeBe^(9WuB8OsEcBgdSDYH!fJG1PrfqqUR^Pf!+(9Wr5VvIaS5eZrq&m zJh`M<)qf-2=Y~9r@4CE-jQD(tm*%Tcd~@jcYK3m;VeHGQN$kskg%H1qaw-wUv9Tj8 zs>D9R1*06jQr3@=Ej+z4E~LYl400k$!Uf1oaM4^H&`nn?2ZCbM0hCG6h1bRKOiH{S^1%s&XxL;glWKo3RE zQ%)GS4!GHMC+?zb{zH9t9Xs3}E#Hu&ZN@j?<(uC1gx-YoWav=ITf@6Sl0j5wL}^2| z=)Ve1_6yQ4aC_ksfmH+_<4*^qkWwGITO1xp-Rfu@Xa4Wmscp*wx7J?H5*QA|2?MfF zH{ySzkB%Upll'aP*+=jF2;rVlE#iMZer%8_ibJW?8{jM>A8887gRXNKbC%Z>-8 zPR%2F7?jf(?cy6chfWZ(neBob!iR7WbQ$cT8cK)aWeW@CIa5pLS-v^;h%#q8K^rXe z9)@v42piZT3@FB%NI~zFOBu&d(n8degv&C3x2{@BoVuq#la~%L!JC3<91c%9(>{ad zIL!u4b0#Y>kGj)mTb)}bTrR&5W4y6EQMIP2u83MP*gITHM+LI@HMOTrJ6u~w?M@W> zM+MUOSGA@yw|LE1EuDY)#PDYGb8AiWZgno0%pT9mJ8-TGMCE8w)S9N;>Rd8mI-b?Xx#zjsvS&?q{?#xlkjMX|JB`_KUoh%NC2YWALA$5)ME39n@f zhEBY;y?-8q8a(iud$1kQS3#Ffcpd{34VZZ$vip<_{@5PFx(#qbLA^J$da#B=LeGTr zq>TErD*K2z?x+oZJQGv{sdjXFqZT4)*(j?G-cF3wA>wxEdUIKOux%I)X4QLCZLkg& z1|2Z%DD6#`PK29q?T1S@s6-u}O}=|fk1Sg=c|pEwF*i_;bX!w95r5aDoHG1jpPE0j z6&{HNDy(l3xe!TKn)ZKae3r9g?xELyAz3~V6R8dxZ;@arSl@TPB=Qn-9Zb%G%UfI- zUfRI%qT;z)x6>GRF!fxFW&S7x>t8rHTnFbbLB}o4Q00gjjN||I@QT|G*6f9^C!2cc z|6erne@e&Na5JUp_H6l{|~}YnMhtl>e%CR7Zlkgo0=Q*mahSJ$!)r_ zv^KV-j0k`dv}}w^D}DtFOYWuVo%Px2GWn@$B^s!j7|^;>MiLY}k|T2NIwZs#l{_j>nAS%3`~ zO9{ZJ{L8>_c3dVQbNgAFh2z-P??F|i1WOm@Ut;B39MgP{0ZXw*(L%cVNs8s_uHYO6 zNOJnPl;{SJxXSALb*5!KX3sM%)l~>p@DFSFC)76sxzrwcG`3+ z%y*_vk_+JwoY8}J_$Wpruh9xHKd3fzz>abXrE<$+8S_*kT1l>2HrNGZ3mVR5^nE$r z7Us=xa7V~Q1S_pI5KAk^nYHH23NwpN9=7JHvsG<2OqSCP=DO^79=Utpx6@Mo(kEBn zcPUH-*O8}HmBVP|WVo8JlV&PkTIkPIO*%6~7fMAEh@-$CSBf zPoSO2M{w3sda!}wrqr&!%(l&i$_SZoRe!N4Q$@`i&~{`_w7r}@98(;tYiZl1W55ez zT$c1Z8EaUZusVU(Twn56rbdQ^f<}d6p--6u9xrX}S%){JHY*CW206!~8~ua3MnTVg zP0B_op-e(3ty}rjPmYJC)Xd8(tB0zxD8g2TBe#QY-*S%XmQ{{lQiIKrU8h;*xE|9Y zr)D+{B@9gJI;uIBIxEH21Et^Gt6dPa&$)EX)4HF$LhcAGanpdTO}wGXobM}H2O@B@ zPC74KbaF;U<*+8S-b*PiS>%~ET{VJHPK>GP?mz`FZ`a1xT0(DCzP35I_zZ75(nH#z z-4WnbHe?*43#pz7=Bg>Duz=sKlHQEv635l-Z*=)qB0LoIX}aJ=>h)$pZOt%fcm7j>?3#3zyIWi7=pNgA5wQX;D5j! zD(}c6nrH~X7vK+o90pkwNG)kZx(a9`Z3B!@3Q89N*ph2wg0rMozBf^UIFo9k%;f+7 zEFmWbU-48V#v?f!S3n@W|NH6HO6pm^4?JnagvL`Rs~<$MuhQ-zJs>-?bCwIv@>?4w zsw-BvGgu1It#)xaHIv7~Yp&6@OGJBM0o=sP4T&rGA81)Vdc!mXP`cp z$yp*%gfQ_&=}N!+sc~Uq$@Hd#D%L9X{iAl0i~6&9@@0U5Ya*;5>IDpM(L7iN9fc^! z%R7k7RZ(KZM<}Pk67F3FA@`H zVH-&wnvr2SSn)t7-31XAZ~^!r%SAG}9^r^W+V>QVzR}r-$t%$Bb!rmdF9cmR6{q52>W8k`uBj zH3)#{prr>JHNzadN2BK4alX97wLcM76=f-06F2j?1UQ==L42PYw~!f= zj5dXtH*$5B&$>@5ARxK>x++@oaJA9a|_c z=G}+iD=@}FVp{Gvra@xLlh8QDZAzHH8Zy3inY}P>8hgb0_-tYKi}lAN%Yv>-neQ&pvy|s&K&i_+pVWXBxZDTK8wBBWN6N%2e-Hc4P85 z-ngmWb+$8E0&CuQ#{%~uIf?0)1m|YQF(wjI@&xA?$FWfXNvH(pY{xN5fiVDyX}{x` z1BoeHg7fE%l?seuksKyEj+qOLsgWH1a2z8cF(pWFPInwT78r9QIV9PQrT2=(7a04z zMPKjOOo1`~K70bds)@B9NvFZJ@p$jlVB?Hqfx;A(D`xMW>feESRZy_`V;%=_VM@M7 zG&o|c9V$Ue-<|TJ4!)!aa(E3|cJHCV!t5R(D0b|j!N70}?z`&UM23dw=G{o*z9kjx zwNdwgVFEd5yml~!R$&4eXuRsF{qm4Lyp(Qg^KM?4o-suS+r5X9nVyqH2mcD}BkA3g zhlDsjh4s(D1oF{5qbfd&;l5=S?EUf@QuG+iM?nmzqxMTe`p{Flxfj?k@7SAzgAv}v z>|28gB%^tT$-7b2zrhU+xqb-i--QX}rFjm|yFu&NtA~c^pTPVO#eG{Y*y|S9m({yj z4GA&4KrlQH=_kQ@!%%#V)Vtvh3Aug@V|E?fMMey$q<$M_de#*kWWEo}KMCn4#_~&` z_Ul9n;GlUv&bz@rzG?W1^@gbUEQ2dRgymOH{pN-%KmhMIa+Vl8C$eAP4#4{Gi6QUl zeCuy#m&xlbh9N=K*l)&$ZAUg?Q5#mj={(r8p5=hBks8L2Ec}D|WAR^x7%)sD=j~T+ zh2}7B&K$ECb=<%TR|o8DM3(3OmXY`$S8_Z5TP-aX1O$uHe_4+1f4GwWJq@uo8^up` zd3*d{IWU_G#XhTVK23$Lz7Spl`n%|nz7A3m_Sc`I9KDRe4`o!eW#=KTrc0f?xef~4 zh9|#su7euSv6Mf{vp$F4dS2(aWkSN0vua}d)j#1*6yO!F-j&cTMgP6x74Pn@cjr@% z>$QA4vF`^ZM8-thx>hdnm2vsnni9X(8m)(soff3z@Yx|eC<#z3y#*)+o&(1cb7a`k zKABypPiA*Xnkq3zfi1}l18nx0Vpo=!19ZUwtAVTmmdSF|ypjL2bm}B=nle+$g$e8j zk_1tK?xnMUIEf4Z-h4CkPof(a)RL(8y(z;C0jvUw0j4D}P0NSA;>#qz_K-6TSZ!ghDm>AP5QuF+F7YZ_g zQZDJa>W$sNE3(eju>eQYC)SDVW>LGSoN#2lhmE%9oS`3yNqQ_WsK>{;&hgVS=2UK z~uuYIH5@8azo&9 z;;1v7{r@8E9iu!6pDw|&ZQHhuU)i>8ySmG^ZQHhOSC`#otE;x&ojGUbzh^(ZyYn^j z$;ix;nQI{mG?RgP}T&T}&bqI`u*J0+eH4=%<*!^)&MzuxlM_R5YB zC(C`;KkK7M=v*ju-gW%*i&#e)1xy4`HQIeauFD%me!HFUwWh({6AfOL3(omdyQg

    xFLrxFcX-&J~RkDodUx1vgPd^&GYCU4!u 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 z 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

    $Gl@%b_}!82 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

    C@vaIPetbCp(qoKB%dy(*thrE?75RQpW_I8@m6B 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 Dt+< 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 z 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 bpfB7YO=O!Brec<%JY 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

    6zS#+#m&G%qLl1DKFYH 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�`b(-YDff#5xd#&NVYoveX)n-O77mERPa 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

    k^Lkvz@67eH(2|7AQnh|H~d~<>p{%onL zV)zz)?BfvVau?NO?=_aiysrnPdv>GIlW|3vBV~wVZ_veeuzPR`fErq)Pq~>#NRc5b z`|*KV3KS!=+-iUk^9q-g&!$2KL|JBIpkaeo*Gi)Ng7NID3Gdn7Oht8mjsb3tnZazU zB@8W6#nVytb(OwU?MQi@?5|M`1V8BjBf32miNmg6OwQ2M(5dB>d-K9`&cgsvLS{MC zQ_)%c3AY&d)~_A+$B?X(_w+t%V=pn280c5ftTnM$$A0`V@CqU?Y3j|Sl3nC)tCD9q zUkPn9A{f0t82^<<`OjIl3Fj#r2bzk)KvVI5qEY^f4*%yY|ECszQ3bXHfgy~Xk!J9S zb3H2=TypeY!9k8vZAi*NmzZU%0K(>QZrC3Yv0@_F`g5$>>n0a*1rv)b)^Tjwx5DX; zVdjoFifNPi<$OukT%7?-+mYo;f0n(GUztVWmZh zRh|#nrc~UA17fXl-LCk}eQMo@Z)yhn>JffMgG}M#haq7vDpNG~^=ad?DS4r6?XEQS zJ;PtUR)rBi<43= z-3#^5OuyzBYfi@aJ*ru}H+EK$TTv%B19noXx&@vp{JJG*d=~_2MvNVF%R}FY1?|TY;Z_EB-XTRT;f`SRb_z<28(+kgMN}PjCj&TkGvJk ztj1x>S_FITf|O|s%&EBYu$;d)*kTrwo2_P}Y%1iAEs0d-=SmrqT+`~n=XAv-vu{0A z<8!M|f)1=GI0&Q{q6Nf#{fw+!pVQBJl>bVO1&T9Ah%r_nf`HrTS zkMDgF+hH22BgXNeZ>oZ}wt3;Y2Ch)=7ge#a zH-{i(p3vY3cAt3O{DY$H7$f*Co>Bh1F@NUi!|si5*98gkl;#o~S>A)MNXjxU%3@T- z&{k6j+KAV;|D^v0h}jK9_k0T7#4E40k^FSBrj&7?`CVuenqq@_h>a9J3Nm&4=wM*6 z(SM~!LZOcp>_ zU4GFH2u|DcR5FPBTn5|Ox!IqKKhHK?c;&DLNJAJe(`6>)V&)fIBYu>*VZJW~ep@2I zM$B&_=>R*%ipq97=fnOKn*(>6E15+hLGP994^$(z6-JnZOkqGXqW>7)Q3o+Su_Txv zrYYFQjr=}oS!#?bm@E2$8hKYiajh!V9qDwL=;@r~y%}Ll{uzXB*0rdVaX^Xqb%h$qnTXYreJdn`n5-E$h!;n?&4y5a$D7A)va}$sR_O=*Odu#E>OjZ5oXU>i}k(;c^8Han9x zs|-EQE@+!5<#v{s%<6kui-y*)a99P_z!7I=L6y701~ApBF6BJ1N)<{QtJX#C5}I&h zfg@=}$Tc{7LyH@gj8(K@_3Axm9 zj~@?dof*5dC8qWQsezTm?|%7Qvr4iEphyRIW{F@i*zsOV!tJFo1`pVi{^jqWTmH9|oL3j>1dKqTJb3YSetl zOW*vqD)sBTuQH?ZmrjxnX$7U1v-ppYuz%K5Z307-!#=ybZ9+x`ZX)#21ZzRLsr1+0 zYeZ_1Pfd*{X>(hR5)bvuimD~&eQpWalO)>n!!`FpGk<0BSrXd>6aCfq(gw-c;L~HD zQI_S}kMC5LY;9pXA@mYH#L51M6nX`Hc*HJn&2|W2m*AZK-ya(n0k$Bj?Wfw7sk7ErCZ!2jQ?wf}V(B~!&y6-6BN3(lRUUs+&4gV?Vc8JQ$ZrCgBa zwnPv=X$ro@+9}~kZP^IXegSUczDzs2H*H+C6;KeYj}L}k{235nC$RFm>Dn1G;-|DuzjD; z;-74o1}5q(MVM8%AVXy_QhDy!Z}Q#-!G-#=eXZc>xsDbt7B&_>CnNXI{j^T*wwTTbZlyd5i{*nIq+C4IlcHO=pAiGfLiVFxWW?KW#*cOQ6>KOSE(}LHug9F zELYr1*=4c9Uh_`}H3tmTA3^YQ&R+iTf z*$Ke>_#C-44bCPPrByR<8Ksh`uVtY7rjm(X11+4!Q_oE-6{yu*|3j-;D&+A^VLyzV zd+Dw9qV-d0>^xHSNl@J5cWI;b*KWwkb z#yP20`CMU#_OH&GqwI4ZwMwi{oBa`3|M5A!is#NGam4JDhn}8&_1*sH}71U$TWj&ry!_jf^y?dLLJPQWyYB-fEWK8|Bt5g8iNBSwz3yVi7uW-J($c)%WtP|NC^f~G3`BF%GPAc2|?{viS zb5!_xl2>!DyvFnx`fm!YAy1IfdhitEoB$LmJBp2=RiciLY9woL9)HlY_`e?^A(hVE z!U>T6pdOb&^00RYf@GQlRrt<=l5d6bLLhkj20`t^}rKxXpwQ%>lG^YbK^SFsU( z>?|o41y!MboPok<9BOi0PVNrV$cBO64s>Hz$uO<)bBq({Z^~c-CXFM7sQhu3RrBp$;`m`7R+Zm{oe&S5@r$wZu<|*)CZ26W4M- zT<84e4eXkaC9-ZyTL|3zsIr*4DyW+LmEJSjZ-Ie(Vbhq}@sMo+)ABaIw<7H72{}+6 z#^koqwejLri|aEFH!HVR(FWwC2^MsB?3kUZd^1$Y*~3D)T1p~_B&%%0nM$#C9;^1j zHDk(KY!qVG^gT?%LAtO$CaaDWnMy8yMJ=V!DbTx|V1b;y{@AdNF^dHU+<>!mL>283 zkCFs=ZJ-#K1Qoo+O;|0FfZb*6W+?aI<{L(_%`M=pW0m6xj1s5V=6cZtFoBJO;8Pqp z#<8pa!5wO{+jZ^N8D3iz;}BY0HS|ICI4J&=wX{?BVfAY z56=I+hyz~h{}gfVYFZ0uU%V+`K^TOf$b>l920?@)ER2g_G9&>3gbakRh>Q(4jP5a# zCY#gh5;bkC4KB5f7Uhi=7@BP+Q+u zZ7nTBk)G7t_-=Xp{9AM5Kw6CbQ@-w3v6AX;7!g?&=efj>ha2nK|0ydswPE(MwS zdh+FOkM+sCdi~{h=GJ+7v&mahAGT5X`tqlM{X_9$-r?QfI&Kk1lh;Su3-geZ{6~X( z>--~{*}Eqw?=S8)o!dQ?&qVCHyN6>oUIUTURCd<#@-oLzU>4mB_ad%J(qs=L6Tu)$ z59ceT0#Foot`86{U@v1>*!Vc-xjqcbju$n4t=$4kRaw)+kGWaXS+Th`8V=545fT>V zeq^?~U;5S>cQ~=lf8J!I*d?6-kyLh0LkOqP7H`Bs_%cI-5B)W4_=TyjpKfa5Q5K<) zf5s%mPk#ltS)4_alYPwO2b1T2o;clym^_O|gBq+B;7di5-y88{LY}3&KEXR9j;;3i zvxpWa@PRGt0QmtS=uoR_36x+M2!)YKBt_9;aY%VwC8U6qtXUN8AS8M7Qi=7SH3z%b zj9n(Oul^@y2`eO!svNnNlm^Y^3CA!o+d{UI7cFtII1kSOep0qLsY9u_S*b*2vM-LE)&N_SpOAKNWYn+4matrhOr99mO_D>!*I|HoCy8bn(Juu(7!l z{GQv9lfqjNMU}{$Z&L_ubFN6)&+OE*h}h^O_C!)ZXp2Pi?ePN+x(!W|W7q`4v{0qY zcZh$iCe)xQGl3=3{VdU_1gN4d76I%?So8J5n{0O=l@?Gz+mDKpzw@HYk3+IykaRMS zh@)1d5h(QN*lv^NaTUWQ6FQdq$BF%Au9OIB|2g-Q{ujQMRYv+(yD=FydYm#Z)hplS zTDx&8`Nf8kn0@RjgCeJ93o~w_aq2Bca!d&uihS|N0|0YxsF}NcL1YD(2JH?gae|?elRmd{5tF;(jdOEqC`*+*@sdNeDqn|)lTdP5VlQ47dt1*>Ob5?XmX!J&f0l&`9V3X26 z6R`HQHrrUT19Q(+VONaLPd7if=0Fpk=2{5{Mx=dx5jVc9pwM^sf}#W-ER zZlrbI(0nR)+1*qIRI)xR!?t#ws2Xc4{^-3fUEdQZgQ^en?@UpB_Kri;2K&_}7{-(h zwG20p`-UA|w}*8x9Xmd!hjr}{P<=wpp2Mua!+fdKRDh=VEgacLxMPmI)Q}eqwK}+V zDY#NVZ@2z{=ncNVj=gM2-wE1nqa;V~Vx-G1PKXr)*r{a`MPZX#DKV3Mcn%_*p~m9+ z+3W(i`9wpPMAZcfe7XEvj-0k8+D{-jXRg_3ZRL#M;&Scfu*ek8Z%JG-)hQ2CjAav0 z4P)o~|5h-|+5YT4R%W5Us+Z+a-hCcLKA{l!Lo*ll;=p3wGmOU76kF~@XWMPm!-@>+ zd{H1iu={DWdObumQuC)@LII4Vw*gEM;H@AJ2CMKgOGJh7;)O)%n4DFIYb1-MFV?JR zj^e7$s6|Nn1EJ{XucSL87PjT>nM3U}q4|6dukW_q)bw{BH%c>Ldi{!$D8BsH#^%S- znlASA=#`Cveuxf6KVoESo|AL<35|!cmw{iE!uzRRjKFs-k?PU06C@9?471$?$>=jO zInKN-syFMpF0uPcJ3ApUu+|f50bTghjm`xex%^!cIO-aI4TOiB^|L%$UKR^N1ppj( zEevA5j>hl)5`;GMhU~!wFNvOS4e*m1aZ>a*LrOfRzc>d2aHG`%v_Ooy#rh4AZq!70 z212Kq5&Y*5L$0MVt9fBe-)OYdo5P0z2n`8usp|@kU7}TTh`C2pj|LKXHmF-9@H@O( z-SHzVnhp ze;b-YaKm#}0xxs|`^y?=!l?!tL)xyx1W1(W<+{IqIZ!X@6bg_`FS-cABQ;eD;8Z5n zU003Mk-21(yj<^mg<&e84TxG!anv0Dt=^R4nDW^_UO5?Oh)RS@Iii&V=~#5iGNP4r zyl)>qB^aG3LVzLHK%hTD$qjp@um)A}`J1NnuRu8<7l`F53oMEYb<)VLVd-IxXW=4g z4xK(`7%{)aB@`ili0nKlnDXvSg2jG(NyEirxva0%rT2TFK;jd#V^$M-q9waTxr;=< z5xWhL69mN0<0DqE#;NTAqDRC?SH2P6tnNNWoS36Z57nz#5Ss@brc<)m){e9+6E&m& zTEe%>^wlnR(CU6IJE$-cCQ~vsQLs&Hh!yWHma?Uxg?Nn`;;G7hTK^B z4^zvwy#S(bBk1WKR$$~y0KniGR_4)s?uj|6d4{QEr;A=9Ddt8t)WNwt_t>!RZ0Cdvz!r6+UTE7XVO z^gAnFSX5ANJ$uCrp%n6#Yjz!fWjg3~{NRAC-B5&2A)GGe3k2(r(Cu^f$dDT2msA#%vJ6q@;~x zA*#KNFcNOSIWfnv@DE)5`P=$1jSo1XF~y3}azvvN@5f|Dd8jkBpL&KF*kWFlpM*Z{ z4aZ3l+}&D&xmfRhnb^lBW^OW$p2>@*9r5M~>E0-UCK zY)%>=4IFqKXn&q0oW5&>?Bx=>MjsaW8bCa@ra@{oC*an-$RMF+GUHbNrf9AxTN$u3 zQ*v+O!7tryecPyJ2)z&&SdBPt{-eCM+d@RL67hC}rpHC<@^r~`+Gdm^{6Px?nsI|| z+ykaw2X!{A6%Vy_$hg_MPTQ1u`PVUMClPy)AC55^TCOHZ@Y9Id>V*d`&Jfjx`m?Yh zDmXpL4|03%a9MRLcw_q$n=(sHxgOCC(8kyV5G_eB zEm4dq_==y_P1CN_<}I0*r|G5pTB24~#T(xJu2FX?T7FI2)xsQ6G&7c`SW#mr28!?XCP+CpMvdI2%&EtDnfp9 zkU~ViNd#GA!E(}WEUK<_EwQM2SQzTo@Iae_7tZ_Am&BW^{(0aHN5mD@Zi|8qbCdGQ zRJAen8n-8GJ?UJT>3w$g!ozrIIe|TKy{D4dbt^@ivh;G1<$_2kd!R8rbASqqu%il= zO@Y+ZGt?AjTB^D&m%#=v59;FWIGukSD*|XoSpk;8n6*-%@{V#QjcwvM_L6H$;fU#0 z35PsudN=Jie+>p$ePd^vHNSJ1WCYvQXkS7NX1L(Fv(V&YEOKE6Wtw5LzW43F9QRZz zMv(K*jOJiLMrF%$^#TO+W8h6u!#m3)OMk0aF^gQZ`ev{VRO?wsFOZttggJUOm|^F3 zqD-&>PQCe`aXZ$ACSwcE>abx_wShjvH3@0%@$EyWy(1@igs|jOmQm)cScl+(NW_B| zhQA%zT4?K~Cw@^5P8~VZWg0=O+pI>J88w<+iYTQGG39PUEorwreNr#+c<3BCJ4CSn z_To5@xJs)`IKpAx;QJ&J*9<1=+~#1ygk}#?SSg`{xJ!F+7EE@v@ZNuoMI9{Srgf}X zvYo9)t(c(@QL}Db`INyl2mmS;;4Yid51uUf-Nw9)|MFt;v@IO?wAJiYC*x>70@}&s zwd)8RbX-g^<(1z57BcuK)kY_T*}szvM1%pW4g#v~5$-9Druv-Dq$oj!(oQ(@UE2l@#5)-J)U(k2^+yWRoWFLqm-FBIs zSHsr%*=fILhfYGHe()aT>V*u(-k+aK*I;1I>JnaO&wlbpPGSh8*s zv+-C%6Cg@66?-3&5s82W&Ba?$#K?5|&BBcn58}IZKOx0PuXXENR769PG(^YVnv|Xl zOXsBrL``GL%TJOfh%g{Y1$b_UW9lRDzJvEVxZ@Dm?(OO9f0vh@3rCetC#5|$Z<2s< zPlF|n;G7*Q@NN8VN+8*@A;!VVWba_+Z z@ISvlcbM)eV)LCrL^%D(ZpVM- zgd6+#J7cr`dGMF|<8Q5v-h)H8sMpR9)lwuQ!yyv8-2{y$PYe<9x1rSw)IMGd_(Rs< z(N>t%=qjC@C5XJHvbAWR0}ySTl+M{?J_lbP7EJGZzK4&pttYImD}Rw_SN~)#7sh3f zct>#EM?3tE0Op2XRkgd!;&wO6NlQ%bfdzg>x|NumFLxo7_&z?0pbfOA2?S0ar@WAV$9=LL-@L$X5D zWBnGhEc3O7F=*Ve#N4F^9QM#DwLC8S62z+ED9J??xiH4`fP_Mtz}eYZvfLtcTQ<4T=` zVxD_8`j+E_WYpGt>;~?a8#;8?dN=NHPqlXc0dDp7@PRh<_TT|e_4eq2j(@_=KgQdl z2Y@8e<3fmIVfLo|cA!Xu-tH7PS*vDr1BSqRk$VT-;_0ZU=%GQ#YK7^+ zl`zeO#q0lQ_AIgW=@XbxBb22_(ry}(-QIKT+c`a~$IvRDTh?>!E3sv!E0T-W(PO4- z=f=T-4i)tPm!D4|{DuG@`E3!8eRl;v5Zn7lES9w#4Cakejw@ez`eNIv7+M)*A(?Za z1+l#_!6+&D{e1{qtiV{A1XU5KSc6kWwy~k;qZzJEqqxG!iNNmjxDydWvNY~oME7y6 zokIFzeoH7IOY&frkvH%EqwJi*WBvLx9ox2T+qP}nwv!#(wr%g&*|BZg+L`?O>zVGs z)iYB^byXeJL9KT^Yu&&5nZ7uaLEoPxBcFrd{h^)DH73Ta>cdX4ZMKvw4jlfBjU>HW z@F4%%0@l)!KG)>MWr*a_i`d-n-8JjY1^kQNNad&dRCp~CF^p%s(&y2!eyJ(9sZ@?pKj>eNIYw_IU$d+`#lQOO!8rin9a zS#1!sRkMLHVGOmSu=Zd_NAp&d$yzeHyX+R?_5uEe29A&|z;YG|(RXlbUaFh0oSvO$W=`e!arm9TRzR;V9WJ%v4gy3TWj+L*6U~_>wn<_E(vG{| zmb@KypNy+;o+4_HW<JjKmp~R6%WnLqCfmSDYbzJZ>JjG9jU-7K$kvXNad_kCB{S5twn(pivq(kGS z`3IgxDG!R22GE@k&Yjr zSF#q9`ak!sT}1Y$>ag+SaF>ing`~y5(LS~%{GZiyjY_TwkJ#VDEBX`j^tdPo*9{*h671uH z!7M@M4+P0UhQ@AwLcb#T^m-zhOWtym;hz|5pVT7L?;#i@yR-~Tb7!--7B^lI7mVU! zosq1_IJvHtZBmr`H}1o(H>aj0XrWi0_r{L(ggNaiY}8i+DYBUOGHy}Rfp#yQsk+v+@pAaLo_^$$?bvB@*qrepE%t&#z;!(4ii&J`3D62hY zlB}a)Re3ZS4$Uxvvr3pDTTZi2jy3 zhd)pcPNnc8#*_&Nf^-1zk`Anx1coo*xCE)D1TC$D;W!3Skq+#j2Hqb^?!%Menn_Fx zoQ`VV)bDhW(>R{*bP=oHL~SroDRB|VIi;p6+|feY!qFx7x)Ocdm?(|ooWJ<_Opoo$ z%&SG`g}gvDqH%4fTYwt=ZH0EWQuyx^bn|=s?*gO1b9l|E8bsZjfHiK$HupKIPVBd1 zJVU>(2+DN(kwZ7AmrO>)oPiEA7_G9^k7K*+^3q{E$?&Su5cxf}hT8 z6>aOXXM{x}&=x(6gJrLT)Y|pYb-!Xte?>Z$K@Skhr?~;XyIH4%REb+M68kP0H=?3e z3O39q$VoZo2MS~(g7iuAJd(vWm7Na&&*Wc{v_>5?)nzo*UgMc0a$l3(-n?U_gN+w_ zh9=pi#aUe@t5q|~2O3G?J&=Q&F0q-?Up)p54Vk6Gn!~_(;;xf^RUqfdIG)_|O=$C# zK$J=ZTOs7J-E%G$x*-w!QyRxsKn}iVAv|#^PeG=-tWp-J%PF2l41ddqUI@(6I9X$i zX)kPWd>SnDGY7|8EE{k=5@RPMxhOP6lS~S<$j?ZjTY3d*(o`m0hNVlb!K(fZohES6 zDNYq#SLiJMmKhzo==KsSC&yjXmR|Zcs^Sw4Q-L2VYMrOI)gHa9OO>n{5@e5>-^S+F zv8KGXR}atXuXIGsvymn0tdfrKr{`Lm0yVnH2X-{3yu(+Q$o|QXj^vM??_080YtEw_}S5^sR0%F|L_Pr%<1M%Ufsj zD!ee)y!^+sn?!_wTg4D1)#MOmlu*0zt806?=}@fUipKW73+?p1$))DEP_pe`DaH3M zJH=M|&~{*TvLJdqk0u~;L*N1JUo|U{tg^CCl}bDPqL3@ioKzFfsK$?F|SvBV|hamn{YL7$$8{YzyD(kD*m$t743CFsr!l4 z89&k^*8jIHsFItlE!Gx<6IzxzvRX6>?=kc92*&*5g0_x0P= zKPr%yf6e@|R8ur+oDc9G7PbeNqEYK|#4S-od?+&cOc})tb49_T<<+m6+)+l&Xz&=^ z#c%PM--+JpfA77~557`G*D&Bg4$XHwI(eBIQ#1c=Z|Hm$AjoLC6q@kp)@M)>Cp{3z zte6hAQAAtxvfNOMRc(B*lFbBVB}T|xlHJNd_TWv}NE2r=Jy)|TxU3AFzpiaG4`T-f zidv2>WIu9Iu1SvEnAncr0Gob1s_tfCE2(+#_h;I@K7$LS1^}eB&YaL=DL$ac%(LL^ zyzqkn()FBlA??X=xC=9c0zsD6gkz&|cY_eNN0J80@${6?QZpcESe#{+j!QF9Tn9gN zut=~jD?kUWtx1tlr>~UVnxky_m`@cwqVnEmp;hnfG@YOKi+gvKQX^NUCLP@E$u9?r zWpV>8MH;M&ce5AluoOm3IWsfaZn0YNf?(sm4EEOke^bBHeN+BWu%%9N4W8 zjnbo;9h^M2)lPM8oFd0!^?0mVh`6k>QT>jvy%W}Vzf#&Jy;u@k9!@;a8m1y-%3}Xi z%l9n|I@MZ%E_IP+JNmF@_89hUeImBxZtKV}GjBYmKQY#OX^#E_>(K$}m<`PeQ(=hB zJ~(E*DySsPj}nCli|!~nxUssV(3cCAGt3tSj0P436t>DR6h_Df(-1g>Qpzf0pd^e~ zDo{DiQt|lL{TC>hej_x{305;ZZc$C7i|eVGAiZJIew`+^CDf$jp)sve4zsF z(v51{MggOUuFGi8M(ob%b-eJ5Cs~2#Oge}oTT)#p<7kT-boAQ!vVEXarm`JUKKXZ= zr-bdeNfPi=eK0_m+0`T*Oi!>o6xlyKwTC4NFYYG7?LwmOA>m~bjVyn z#x$H9Xz)Y9cM3e40Kb3X6?ngPK|I`3@u>}uc8_uM+9vCv+%_}L2j#NKX^ky#L^CKA zzubrPaeLf>v`>5uiTA|hDwK&`@;3CJ3H!Fk~Ymj8i?TdaM6d+YjO zHy>Y262)3Y6K4>(#9rIDzDHUA$=ka2{-E1MJG9_83k(Y|7!}}t4^F!@u=p&%ZcD(w zZDBc9U@&UH{Z_DU-IxvBd2c_K1K4j1;IoS+_T?g&>c278D-vG|O7jYr-lO-?RI_d? zWs#rA7o+`-QNBi7Pg4%8#BMl6zbkCtb(Fm>QNB)E&)Tx)XL1X_=kdNSajh0Sf6FTS zWr0O(Ys2eRRU{aI%KSmru-M&P31UWFC%S(9v+_>}Uvap`xcdp=`?|pN5ZK9{>qTa_ z3GCaX^nYX&T3=4JXP^GlK=D5-;HQ15Y|&2$$HD^up!@$=0sngjw{$^XK@GUcH?{GM zwyh^*8$l38CNx&TNlf&BY-AwNW-~BU{srbvGa{yeRWU!dTki^KyIyQ5Ww~Ce-AblA z&z7#nQBWX#n&=|=QtG|XBiY9PwdCyOb@P+JS#tZ;g7Mr6bLBfag6u zd&Kw2m+Hon{x8j?r`OH)7-)T%GI&ZLI`;*_uW(Bt zdVmu}lB!8_7_nkGCF(#d@MfyCsS07n85o&c#AQbzg_LIjm1L}%QKYINHAWMopH6!v z{sh=@NqON8;tP@01*2PT4QWUNta=-F&gMq$6yuJ7INPus5qO+QN`+d#vonSq>0^t= zzLvl~GR~q)Nj`yB*-9?6e>i%f$`l&v;4RX|%S|pAdS-%cB9|q$wR#DY!Uho+@^D!6kfKy0YRnnxWGnry_$5*Kk(^V$L zYL9Qjeu@Pd)&%pyDoaz{6?0ozD_Q#Kq42j41!vt0(NC%+FXGl2(hu-= zvH+lL5F`>5P6<{d9n_h6@uT%?3X{k%$W)oK!vlaGT; zg6;{AfG>4~X$3pVA=%ljtFoYF*#$4qg3FiV0yq~?(rT1bcxwIpcH3_eNWCz7PhOI} zyiALF*U1L!gE54yyS27OsA)iNiWj_VR*0xkPYe~O@yiM``3bgMPLl?I{=O0h;MZ%J z4rEpD$PF@!{KaOs1R~Q^3)Gi<1r~%8Db(FzMdmN7h%)0>UUYJ%Pk7WdUiGIA@kls!^`DQO!Xn7gLz^ug6Oz~o1w8bI8)lp*qRG@?71%Te`* zJZfoua>;l!fN;UsM)lCv)^jXw!l8NqY8Sx_okA^s7=6oI8ua9(fY13ZO4qw;Zh=vn zcRE0$5SUJUKVjW0KBPaq%wR~FVZVWm$bbSd*^_ut>B>3-RDBYr-CVFa{ER}y@S4n- z`tdKQ^U@TApF|%Y#{Q!0CFY>uHZoaR9CKuGn=_Q2xS~3I7p$}u^}|uV4cf%?dl~Gz zsg6JYU+UXw>pT9$z>Rti1MtW6KzlumS1ua6Hej{%Kyx&39t-f~slF~WaGVxkwah?w zdbn_NCUCbsszS>b1cxOWnx~AF{hqL4L!Bt%c7KpoAkuywVYkOh&&Lm`!ixn{@w!}b zer=|&eA*r}yf2;cM@8-T#-A^xOD7pd+Rii=os8EmwNrwRK73<1%eQW{bAmg+db!Nu z)C~3}`X|1?s$gXf1e4+SfV?nL`-#&@@rP+1F&>Jg$H7$5f$uWlomQ$wJ1qy2n za&zikj&LqVnVqW3MyQG}L-X`Ng%$WhwU9w+VQUyjkkH1}E*q4%VJShIS2$e>Prig?V?0Yz z;gcA~QDu<`qjEsP?*#XyX0!PO_VLl{9lu{^w z5x9{;6Gv>6hADQJc}QP9{CDiAJl%0a7f0)IxF~u}xppL*ORko7K3=e;+}1>ew7Eg> zEDLZivlE<_%nI)wn(&zP9-JQ$PTNnAFLu#Tl3P{MqNUVLO-^b}mQ78zO-)vAMfpuy zvXSTn!_VjRGW#d+fCH--VM26oL);6Td)o>b3SSth+PxNjSi4o58A2)EDQ}G zzYfH%3H*TuklP6QUK9AG4y;bWBi=pfd-hSc59z zUQ|jAA3HVsn~2)`3DNaH`)LUJomDr=f-&y)A8f{X*H=v!-d_9u3rB3dX#0_w006yT z!XAb@QEB^#-IEjP759LxeX_S`9@Mk8ySCAO=-oLfHvw+>Rh_^ca58&G4&-(b%;igA zN9cm@^#2j~|FIm)SHyf*{{;Tc|665`yP<=zg`uV0fAsbIZ=8PW$3K-lzx<<2p}C1b zuog&?u_!E~Au%K*k!1>Wkh#H-WVXn9iU+D=1X3|1$@VngL2@k3GmC}O|IYo~0JZRT zp~X7NRLn)Y&s?ATc++{S{k^#1{|j=9Ie}<$OA$?@Mts_zX|X&QzV8^4Nsg$siXbb; zl2!O7CCV57e)fWUH?U%Kj6KJLI%r<_#`YTb9sYKs;#0Q|jyi+MmDV&_HEEqSqkfFe zzQUf%6m4!>mdv7mnL2eSIJ~(~W8z1zyDZJ~BD6z)c^cMo>acZSS!KcR)t+DkF^!SB zH_fCIW$yk2%xj71=Cn6^0G(o#z+JJ&6WnNF@4QZLt>IInw7vhQwAXZA#(kOY)J*SR zjXn0G4v;#a3>KD?`+o{6y6DQ@X0)3f$Jj#%b?Ry3QbAeP7d65Rc#_b59*obegSzW+ zrWin=zInwg!umW5D$KHRE-lsE-o^FyNmhL<6EMNpsFTbSJofEioUa=0k4!J^%=VhC zW!_=7b5%Ww?@SddWJ%Vj3n++$RVY8@<6$3nd(hlFs{7lGCQuHA3FLz(Ysseem&<>2TLs|MEr5TO`&t2*2{VQ11)u4GpgN6!@eW#v^` z{#tNu1kCq<$lC~O&{T;RGr<#P;qGzRc#%*STWepm$H)sPwS%MjMa9AQ zyUK6=T%c)bIPzlc2&=%i)Zl$sG%$Y<^$#YgG`gYD>l=-Ss&DDiklyUf+M=f9_HM1N zBNWkGLUytmjN*3i_c$)HY5u-AELW+DjU|PF#vrUs6j{L@)=&Kc3MDL#C@krv1%t?- zV^ZvQ-kT@^xh~H5JV~XBTB{f?oHnUO%fxA)r zf|qYGgTPKP9)pj>Z)~ER$GwYWC;ArrISWvz_441@7?_+u-Z5+sv_N$hrLew>VnbBe zqTtwrqb%1Iy)hVIfRw&Lghr6ZvUwemZiPT;NQ}#9rx)JPC5Rk>5LwB6ejr0tth=OK z4s8%5#T;QrRJdaENT{t&9~K0!Ctd)y^QfRr(_ zVv)&qNhrzl6q1CLkjyI437e#37>OP)6#FtCu{)`O1jUhb|i8<Tr9!TSt|Jz+GK<%)uUpI4r(k5y^ko$DuT-V#3o!$1}w0DOm zKKsqdF&_Ult*z&7gQ4Fm06YHSvG6|>JS13WUKV)!n*#uTf3TlV@{TV}fR<0Tc;4AU68mr zrs;efy|aI;x^JksJct8$?%^?|UGDQim7kAnpuMo2gMvJ@0&!SD88?y^S&_L#FT2x2 z=~dQ0H9mizug6j;_&vQpz`WQLcaXQ5yX5<;w{@?0adWN`C?c9iVmw-91$FDIKJwX0 zLt{Lsx(#`%vbeO=9;t6#is4S7s5%eA@TN&$F3$LD{e#So-O7x#3iYK&-!$dC8V4Pj z%v9Z}cv0kVxHys_;*OArGZC-xBS=~ZdtTz%u&|f+#l*E%8oh=vWNfcC=Y+_t!QqOZ zU?8b=P0VOaO)OElwGOPZf=alZ#Mp8dKMpcDC~xNGwUlPg&)fzjOj~StOc7Rv2z@xJ zHIw!%=n@R9AqUWr)hJGBT7ehbi`g_>=zTL@5qVk5^I6)13J<3rW8xC;JB7rdF7<7g z37B)o&&M5-w`0y|q}IEQwTMRV&hXEsOPw2R=xVacx97_JIH+Cb!YYj`UIWF}mtit;yy; zf)`RU5+cqpNClLnNtAfP#|8VQ`t)q$h1j~-tA@o|EsF{>!>>?u_`fu0ny89tN@J`V zJlu2yrR%Ln1ct()CS(^vLrtE=d|7HnEv^7TAEra(Ek+bPta2aIMlYFo`=OmZvwkk$ zM~8zlE-TrMh3Gpt8iTg_$G+9y7Rf$fG)M3zwjj_u%7y(1spIt(Ai-d?=R7&_z6x*l z{hmw_;#oGTo#E`QX$Ud1BeUN~3u4NgH2Hhw4(u4!W;I|8Gdc=G;X_~J3m9D~Bv7=s zxwdYbTTl*aalOb=q({?#1N9g+bN(qCosR-yd-#h`gdTD5$A+h%5EmPTMSe!<-*EQk zeAVH$TU*o|3XDlFz+s~IM-%ohb$6zR3$#e z`(-5TX;or$QP;TS!>Um3g*!Y?#kE*0!oXK$tT2%pR&AzxrGHl@UX^F50Cg&2fSlN> zw3|_pGj9A^>cJp=exw$q#kkeQG>b>AyI&$?ZqhO)=n}br|JibGxIL*E z0_(>O>tH+^+5pwDYJVs%_&b3g%(p+>vfkdjxy_eZSEH(vnUgp>+T3U_M=UH>Jh9qA zX6~Ml7n@Py<}?2aVZHY|Uk--y)Pv2ISJUh$IFF=Lc|?H`vDJ{pJc!Ogn~*I;(c6hl z1&L8n*HpwvfhMt0s+NXlX-g_%Q`NgwywEqx?eeIqCw>N>7Pp@_4T(P1evZ#xlz!`H zdl|Ei>;ggJ`rJjs$|0dn)mz~;HV;vo51(j#7JS6zp*Sicxnt@&MOA2@^yRg-L-9`L zkshNM1m_hwoAk@ezufRhGda7^5Ry#^J3m+dV>VQl#fn6=878X%6ro7Yt14U(y>))W z4r|7U5OkybiGf*?Hpc|t8Zuk>41oHc$BOc&7pPoTvQG)AJ{e>)h2l^OzQvRDvy^F( z1=4=O@|A4Q{mzn|ih*Epntet4oGKLQeZF6Il~6Hjn7KpPBaS1wSM;BY`iR0=!zSU* zo-i*zb+k-@H4-zJ8NG6Go(q*--Mj#kh&_=mp||Ggh6%c@w>3|iA??g zB(G7^vi)$docAP0T!w*-&LD|tBr>7qVtaU$6k0MsV4M7YO_B)ls!hcHfEoNc(%d0~7)GO#X_ZL19@EA4$DTS~m{x$Q z)u7i{m?~{Um}pQM2-jCKy06n2TY<=^;14uDf8}|iz^y>x)XlV(xrdC@8{a94W^Ply zgl5$u(h^F229YMHsYSKO3PGU75iy*ku`hFG9>M!cPtQj+w4)%>-B0;9yQ)2~83lgQ z_z!ks=au(!H*L9|Njzwz#sS#MZix3D(;m!3=KO$hrJl#isfbU*ZaNe4&{iK&xH<=- zey5BGFlU4Z@3`};?~^PYTCa^XLf+5;qIVri!xHKnkhFdV8}q!W;O zr{a1QD2gFi3?&i#64{FCNdXU#bq4nGZ)ghIIMKY}Sm83Ucwj?DO_(G@yXXh~tZ&xT zZ`PkaTSoW|O2ewFdXqxvN~Ws({D+^Pd5)3OKz8nmBaDW9iVTz{MvpdC#p|GSgj1CpUn$ zm%QF8Ke^n)^#)+6AB*u;E!B}fqDA|RsO1{QXHnM|Oj@`Ex&0U>^%qYed{}oOyllsk zOjke8Zkc_z)cU?w<)-N4ro@hm`W(3ebH(p4wbq25tTTRlSK`!zX%FhxdM>)z>tboF z7khHc{M=*fvlp)QBkoh_ds>o~$oJ8LzyE1|Q~75fn@BD(f$<~ZIYRrd_pvJWvZl87 zPM*T{4xazJ8!bj1MHS`u%$BJkrl^99C{Tn5ltV*fDT_ z@9*a3=0^BQmPsbr>AKj&vV$`ht{gdkNqo|BPzU(SsC>*QgHeu*FB3hI2c(R&@ou4GRi?TGPhJ>% zkaM{&-<)`RrAcj*Z8GP8DM6+ig`2KW2M9RjC*I0l`4VCkE~#T+Cj79!E&hvdiWsq> zdj||Y1Nr3@HJ0Ma-ZR_BH8H%nx?LF6mJ5$2GHdL~Dn>=AOf;1Z+j|~TGE%(jaFiuy z2Qlko9t(eRxxhT18mY2iVN%65!iE$XODD8!Hrgp|o4~+GdhBHBgAIz7>Gwoz8>w2f zEBGXD5I<0CC@mL|3g@ZMnU=0b@;NE6C9=s32!>Qu=dn@e7)We(7_=Q#TYbXA!kM70l!S!teME)oNg8`Qu8LpXv;ID+pjs;HS_`Flr_%i)O)M1(B_5|m-o zTs12x%Zl~Z;vG$M3h7Eol;_(jE6pNHt1CE~qnl!fMameL?I@u-fK)+YB{2=^DY-6a zGjv=Xm6)MAy$w4ZhZY;a>e8r?UkQvAadI!=0t+&jv<@8TB=$^@= zoD(8T2f#*t8pI6Z9w$*X>3|jy54`|64`vuXNIL*}#8)DK?yRixCxrk!4{4uqy=nlM zhf2VtLukL3Ki$v+@74C6HAnC-Od6;076zMhC8!4uO<5)lUTMX2HkVO%c2^c-u!G#f z`%hZ=mZThl-h9W(jR?pkM&^tn-SRv(H)o9v$+ZIH36Zj zs8_oMJl|v?%#iVdAh@R>sR;#yaR-E=v9c1vrQrL}wxbY16-9Vs7vElKD{D2>v1njZ zj#I*PPviQ4+>#gC1k%H}A4TDO5!LZ_OMW>N643KTmmttD8B)fjNr+*bH|WT~!r%pt z>&F{K^xU>=B2tvRM-o%SX{|ESiAlVy8wH_6+8laeV|IfT*j(Ph*vyVFMF+*S%CqgI zz28^a3v7dg(3|bao9#Z>e!5-jgUPf8DRc- zzi0kyC6Rbdnva{=klT-|8v?osa%LtL0UzI6xCtWkQnqJTXzaAYX>?|0MBi!n0Qe+U zKR)L7W#nktlA8qZHcaOk;y{}0Zs??0dnzJ4(VwqK1Ch0$FBfePwx4StVK@%{9WN zhtS3hK3Icg9acd+(4Gyxo&R7Kr1ofdo})%9W%L4|NfZW zys=1qJ;J@6?Isd`z|YN0(s7RKI(BlO_J5z{IkiYdw;M&b8C%9_(yvF5b9QgtY>0-& zm68wG1;cOyRG$KhCX^0LhSeK(Jvc`fJ_4!kge$1x(UW1i99=49t;)ZU(c=&y#ckow6{NR{>%^4?94x4!`G`MfX292^{p)T<3NRkgghkA zoUxhk&+IY!@J}ZE?EvY!ZHR8teY!Wl@H z)|Ovzz_aC*?Ru@Bhns176R8ZRsc&qmxx@iWjcF(#B%Km)0uPpI@23|hk^(v5y_VL+ zje$we3T)|J>gmW4>&U(SD~H~ib5$$dnNZbKF}Sd`wr6+a=E_K6<=o=x^5pLN*wVSq z?#|9gp=iEo`;?_COZRe2W|E3~tTr|3rgRuu#>xQGb{2tVM z>IH@xd%UcBkJmwV3cX~56Gc^d=^EvQdB_q1hKiEEgs!q~90*9dNeln#SlY~bnDW)* zv?^}Qn1PIYSCAN`CA_zX^}Ve-_&1Z6@!O75W1(vUH~v@3wL%sWMCd4%P?0f(IPSUt z9u5pO;-S$r%zbx(fyzkJtkY4L5FoLlq+cB!F4)>fjHEb%sP~*Aqq7Pkf_-lzo9FkDvg>{; zz2!(OJ9TsqUs1T%GS_thI}-!46Y)3?2Y^e;tengp{zU7Wp-}!te4u#&X_l(FU=3QeEC&=fQs9dnZkRI(7OpF zukw6tmn7~P-e;B89|^PnE>xpa?|G!Sb`cfJsBvcT2L~`p1G2OXdG48k)cM30v2l#oV5QD z$nZ>sbDn}%vcDLqU?M~x9TZf&P=euLb~s$eDNJvhO<6m*!~m=UlM@ZYSw_tBfj4Oe z@nyBX_yP9bD>*ujdGb#_4eH-~w7|m?>mEPFSz}O%;WB+Z=;1=OR)mk5?zk{UVU6-@ z0fJ$hD9=tA*ZU{eGYl)#4brLblU3gCmD3_9gILCSrADCIOrBsom{}x>0MzFJjvRFT$PPizIYZpC+)$2Z z4Yv=cIFQc+;1IVcfVo6{Ngy7H0C~x~065K!qDan-Rzm(#K^MDUE<+1QI`Hfg4xpPP z{i-6hWck(+I05i;y&D#jx=7knsS-AnQj=DzplYo$Mw4q$KGqqbAQ3et=!uZ>QZ}ev z5Z={lLALcv6Kc{nu(b_bt!hRWt6q?FMQ5-`UFl2G^*J={3DqsY-t|f0GA03TtP%)h z3!aws5nvVrf>`Yq4njsTHcdmByU8gXq{}iKhJ81AQq12XXW*}8QR@jB(AFs$*phPt z>!i#5T%@g_&l1&9;lK9CuW67OJ|ojd_{$JT?vgJtzRr>H>&);2F(jkhFK=ThwzpuD z@>->%-Hn}?{vPHqi*g2`CG_Z-qL5Od*ZXmD=qxbSOZWE)B=kil&bJ(>!MO1Z+&bvV zd$t9dD1%WtEwFJ~#)6A47Wm9#R4P2)D_j||n#w~-r!uG(31}3`l6>m?+K@eE%SOjP zL}f7@;F}?#>b%20V{xxEiBN+eqk^+$P;}D3u~P++mhUR-oeNd7h#3lE1=JtXUO>FOk`MHY7bS6=7cJJLG9V%V%V#R-6_@%W<@mgmSmk9QI&MkXLA&OQ%|+As%nf zk!b$2T5NGv7qY`&dw74bkB)*cbCZ2YG<6!I#D&JMdzGKpg+X)J#zl*cmqa0sg`-`z zVGmbc!bGi?G}?wwFEgOmgU=5G+|5@X+Rk}amVu)(1`ADq?G-49zgiH~2n^7=A>y53 z(H7kdFb$4L z-8Dj&TevRwkev_2GB|>0CP#=`WX=+Dyf!afDr7y@sS7JgKkH|E#<|~ByOAHn;5Xwc zu|nECV`Z?%FQpK^F+~zr-FyZW(>Mih&emo#=aGIkK+lR#_S09}AbD zyz4uFYFWUV`LlsM4juz;hL5S3`#x3rvdX}H@Y&R}Drib7Kj+Q>>-vwinEQfM`m|?Y z5Ug<=3n&9ZD{?)u011jB$I^dOq;GrWCS3Y zQw{WRoh<(@`Fj0}=`V;R{ag=Ucv3!3i#)HHQ^LHjkP7uBnd6`)%TW!_y63b=E;BHl z7jVzA$7f5W(EKK!l73Qm&<#EO=I+nG)y_LiT z#vj%46h5PHXNq_e@U=d^8CrXtRF!!3a@0T$&7s)_cbyP7v$#O=7SU%HhOhJuVtO;E zN4tXs{{;Sw4LReabo>)kIm7;hN#C62fyX!l-kjh8H*?DUe$+cHVk*UwDK2Zmhdu4h z%Q)i%d-78PjA^H6+=u>|FVJ2!<&9KiYP5Bk6I|aVuZapy)%Q;Zr=!N~2~FG3o{del zBS+bcreV~ekj?$R10CBlNA^nD!Y$93@H@)HGfVC(%v1n$aBcu@;P>c1Lv!20f5Yk(SQ}pdQBJKKEv1`(hWGx7s#$K(FON&&BPCYWKxl ztXu6)S%{zAA#ro!c{`R0qcVPWz=La0Rm3-{%xB#>j8-A!&-8~S`@m7ZuNH}m0jJ=1 zWQCa`A+C%Hos7F^9pTCs)(TNA2oX}6uBo=k&@)$KC~Iqs2gY>jUFGna(576qQMP1B zV&w?7MGkulhfOGuUJJlzm*j2@N(%ygJ5`2Y|5GYmVwEWxp^sQp3oTGVHPcNhcmD() z2qmQSO^N+Q{RGG|umC2}$zC1VGU-Na)Th2Ii0>HzD8G+u6;`6S&(FHm^wZfUGix*VV z0!I$jM`9Y2iJR1cuJ}HTqyWheQ9?AG?T9E-r_UEIW)$e?qP#(-Izu2fNddGAgN5N@ z<+UUSWD1iki-Qg#`O8p?1CAQ~RHKGRf}C*Zr7A7eqGe8m$0$#(c*8#N9y^?s-UI`c z!S^6K$x0nft;H`n0v?M91Ug(nOUYlgm! zib3kdTPW7<_KMc3m=@f0u?^$W0PAQ#@G`*c0CG@+A^;j)oL{n)<}txhR#7Tbgt%rE zVVVGB4ssj+LtUOOD^F%0e*M%&YjdHs=e3G%A; zbc_4I+b^V)zf0;FQ0gV#H)ys)Aa67iic`=0j3R}dt&H3;eUwT+CyWQ*?>SZJS_KaC z!J}-+^Goacj$$=n7YE?aueXa3~`J9>Dj@5f!mJ^a=~DJg7|SIs^{Cn z<-6JqWoXZiy%^Zu0jQxvUOWkrr|#&3PQ0I+_pR(+bbo;n0p+H_F1@-#>ODNPe}EoZ z1?sV37yswRMc1E{$(00t)cXTx!Tn5Q@%|UH2x^w5?t&&JKdp<-3QqP8rcN%Frp|I| z8vm2$q$KtG2hTzn{r$^yk^=|`mIbnaOaRLm2nINn0R2nxabAvjoyDN3Vj%?Z!(hT;eX{Cls z`$a9cTPSyK|CY^P$wWdHV~sHONeAB6#-f`u$jN$S=MTKRDm!~;a?WgXh2txtGWJ>w zv>CNY?aj5tHkr&btp@1Mj1^qr&5xwWmw_KV3;17nR`Qj4^)dI*f))eqTsb|2 z)~<>!n0^g1+HAEatjNHB;H(}Yt;_=YR7LToh8U*7KCz|yXeQ26 zER_Au>r>NfM{?7DXS0fa*et4o6>{XYO3TRXc=gE1Y1=Rpn^&Yg_tf?_i+iTFZqlCJ zwLg4=U(g7mshiVZP_}9WY%-i3j!b>Xj!(FQT_3fhlMysESB^hy7VlPd|IxVnEL_O5P0=d8xdrt-Z&9DJ_=a#8G`Ts-%4@`BOHpWccTPkJeNs0Y z=G`pN&T>^LxkJX}u9y7bmb?rtV6#`(+PTk9`MgsOLM~;x-;H8e`Ms92*!aBYUktrG zu)2(yZ2uX0oC}-#W~kL4M#~kd5Q>Pif);Zh1cNJ>hm1>fI5iBYR0W0A0miyL!j^C! ztM(u)EG}VDVE`Hy%#Gy|$`DF%05`1PKU8@4T|3RS%EBq;&tWnHy>Y3#XsO3$9*i(ew|gb#U?&yH1_v*V^7H(zE%AlV+|xcE6!l zurD9w{abXH_sODbX*Nr+YB|!S+>9iD*I}zDq9V#g9;xjtX&E>S{>)w3hS`^$yLemr z9&L+OP!Kxi>MkJxxW3JTafk3W%uH)moQX(HlYV`b)<@)px1|hm7=WNf5C&12;pTNp zH6#K`Cqi6PI=}7)H(AU81#y`^@Czbb{GyLqCEOj7q#5G}*FvS#gnZ;H7$ge!aB0>) zgLC`UxkUCV*xW=Ip&v$N%s1e^c!xXx5U?nADjK4Qdd@WjMeyp3)iH^}uDreca+CWzc^k?Hyw+3!p9CI<{@w zwr$(CjXJh%+qPN9HtN{6@lM@-oqM~J?wgmF?EPye>))Q4V~zQZVL=H?8YyH%hQz5> z8ws(k!?LyH>h~o2uy3?g@d)D+_S)eTQKfXM{SX(?8&B_6;pCRd&gSIe&)BxZm3kvZ zC;m_wz0+b;17fAmh&y74v_JiAAl+FXMCZK^a7y>;0izSz_JkE+XMAuCfrI?qP*f5h zzn|({5R|gT=lksD>(c%_wct)nti5@L-R*YV-M;M1{d<1>}UYcjx zN>BeRQu=o|ThFAtT$y{qaqZ34g0#-l9(T=+eR61R#Y;wn2S`r$Pum+&IX_f-Nj&tQ z2jy|`IZt-ys^cAA5J_?W^(DM@zEQcWo6%KyxGAAP9x*XwWtZoukN_T?zkdgLcIyDq z8WG&Y7NbhIP?+D|-sH|3J^P|a0lkjrLr7|V-;;M^NlT+cTD}#QFr3wimdMe-VG;);gQLBPQL3`l-9VUI+c^7^qdx#rX+v1 zDamVBB64CP?qS$Y;)Yu0QWl>oo)_h&7x!ueZA@T(uEL$Lj}k2%JT)dwm?nmSTH;|c z&ys=CI8dCiCghyEDD_UGH!Vacq&l`UyqMN=s830A!e*qzSL(Hi?^M)ibxaNbJ!%)-1>w0~evF88L()B}}-{_!d^()XV*I#urYJo++6?T**?_r*4Q<|*I zJ3U&3jCmFOw!4Ljxl3zM*GUQ^pfypj=^{9fVk?`im^0|{ z2d`}4(8h^RyVy`(-c&Gr(wxT(=zEJI8b_kQroZ zt04$OfPt7a7bh$xm=X#J1vW*o?f}T8w+86$;6PwvhTcPO%$(xp1z_!H4U(eFq>`d*YIb^$TfI$9>HF+H8?wK8L6gP7AM(aa%kP7qB4= zk0EbYj{5_{S7BBjP^>>hgzo?R^2GyaXMkES=CA}?oUb5 zVxeRPBR(8xD;=`o1Egl^N}8xHWq(hPa4W=Itc|8yy%SlYfc*mFWALyaNa`BzI^a7$t;1y)*xpO5^PGd!6wK4f2XD3Q~`;R689$DrUO2;D~ zA{#Mvl9;cbB+H0km$WhUJec7vcv8kQc~gL7ZnRX6Zi;VYnv@sgAJ&4NnSGwgd%i;u z$@dB#{4Iv=k1po6?YMP`%i4U{S%gAl43@Q$h@oS`6@#~vb9@QGrsy_Q^#esc4lc7J zP$68Qs4bA;7Rhnvfp=@x#&8z|?Nutd5E)PK$(Tsv*>>F{<~S{qMhFkHrv)f%oS#ou zOqnU7L~TBl7k~iBoD3!XQsD2V&fF78Q^i@S!pQgVqsM zq#5I%z)*#}2MGTHjrX6xP$Yf+jP7jHt;(C3Lc+*#!7m3e-{1p2@o$qRM&WNE3g`vo zKjIGj*NGs0fA;)BEih?7+N$7h7We$b%sDk7<*9(Pbg}KFUvAQXFN*Sj zU?oYVDA#m`Ibvrau~Q^t5m?t`Sbl5HUxxL1;7-J{6DvclIT4>?pSo`;2rRV}Svs0z z&K6}nT%jK2^kEeR!QVERx@a9$hbbiJjT#0Eg{d$-D@}3l&=*gm%7bN-cPJ>b9(SD; zN+LfF9oh;kQ#G8RggW68)`U$pr>lYxI(g8vBoD9BB5IAAZb%KdH|rvQQ~*t0mV)lg zoHM3iz$qcqtud%5kU-)BUgL(h3bi22Rc0g+cAqJTsjA~dAdp^EvEw70Wm3}V22^mv z(!f=2`ah-tRq7gI5N?cjbyJdxIJg_P8sW)Fu((Mzs%eW2u3{RzTRPrnSea8VK2wB7 zp(xMW08$zXxr{!iK$Stw-w(&taKxo-h!bF)!t>N0MyCi`yF4B0JpW!M_NL*pgiWE(rRqhy5Cm$--^dsEbIQoAt@mzfZXD_|52B2v+b!z!D_ z>AL1E{~YllE+Nz`umxGY{jpc@)a~bVoaJ6dld4s_8$c1#4zXH)3V7804LeR!7g2Jy zeK$`P$|B3d)C*9B>`zDyyGfx~rT*}JWj`p1L0*Ecia>d!??qzWjg+EH9r6~-eS9Q; zZlnB$n^@LKZ25>{EuT@7_Zq+(y8#KeyNw~e6T+%}U`3*OjT);DSq0O|P?EL8VYyyNHH#E_T z7+NXRSZ5Zj5_pq{E@*=Knb~ZY3b@kVkEXFdC7h|cswFewtctopb>z|!Hxo+en$EEc zRr`kW#G8vurBhn{;|$?Z<7H%giMl0dg#1;H2;9vkIE`mHYj_#Rxxl6q5>CdyQvH}N zcLYam?!qnH;|KabLhTisY^6(E69of0S+AN;Zcka?x1`)QRm=}w_AWB>W40kO;u48n z7Zbbi=}>xHUw%1Rej)7=agJ|=Tx{LFH1q*0#;Xfi#ya`dy!-HQoX-rOkh@o!{rWF$ zkN+<78A_x|8h#Y;+z+0_`QIsEC1oLD6C*og6Pcgy|9;n$t$O~CPWnQf7-ju|lgtq% z+mR8C0AYyUM>jS+K-;b!?Rr4uLNOZeV?eJ-$Bdbw6( z?x)GmM!C-DPPcBiS3ewY_kIKH@cyHdOwcu|L}vq8=Bh&HqDK%cdm?5BLd+ct#v+fb zP=fjQN_%65L+pkoOU!e^c9rIS@;*m=hd$gWd(>_NBg~+2#;hG#+EaW}G_|K|?YIrX ze&8fzwtsNa%YVR0?gszhq%Qp%w8-|4J4m|q4e#Ww15@7qSTR)5ES-w0Yg-~Z4L$ipQ+CV*CaPX#Qfph{%0KNpzAo~Y`Xq+n&sWhN51Te%4dDOK zz77AOeNQ75u%A5WgCbiFPlf&IJ2M?kz(tuX`qh_OTXC-D9jFK4$+UoTV7Q6P1#5qRQR#_68qxuVugxjfA=&}wQ{E9i+jZytNm z9A^F*Psw|ZPN4>*oSqsRTvD4-8C{b!bj4^q8yv=IUF2Cev6+0ErRX39g$L1Cr7~P5 z3VJv#UMHSi*m{M{K(xPr=lyL}g%y#X9CMT?JW)c`>I2`cK8nd^@VBkNTIzZD^PRf= z(S?jV|AY}JuS%`SYLrgJ7Mx0PmFi%!bPc#YL{QW-rv5qOIaJ=hsqk;&T(x#--}7{B z4}s61%J7kh2O}>X;3zac9pHoJ%LUO@$?eqVr!zbB-m6-*wO^@W7eUw-mzAUtN_yCN z*C!J`t9(%ii~*x;VMb=C*d=WdL0YiKVPoDD6a*TH2|>)Uq7NEk5PW=$feC6q@f=PR zV(w5!3)-uZ$DX4P_QJd}R2;;W4tY;?04jd*GU}i8jY&o4HFr#v@B5LxUgQ5{FIs_U zt10a#b9+v~y0s6^gjU7U-Gq9+v|MDpo}-~O%Zlle8phvnjB*v{wyU|J#o%)ye}Omn zN55SmPrHb)`IQ=>@$N+*;X-8OCV5{HR#sQwCrp|nEnwX_X{fid=r9%5U{_Z-yoI*X z4y;dfz@i6;5C|##n3uFla0JR()N?Z$|DK*!c}##(1OqsdonL^4RxowZj#sPz5EKy# z?UJwJnt*R{c|rqW>fi3I^Eel_m#Ue4GkcIy;xBZ0l9}Iu*Jb@~;zvJ>(wsm<(pB6K zqr@&zt%%61EFHH=L3-j9ohXKYaf#(4#u-pHv(MQhy`v}my`)ey$b2iZ^eeDkR`(ChQ zMo%aIh5EH*-Mug!4}`8+cEG z505~bNJ=U3*|G9+f!qQJ8Fe9_)Y}Ly|BK##O5T5y&;#E_N$Q7D^8R6znEt;`!vCpv zt=y5-Fnq|o(v6woerb$?B=94oM%RG|*npQ45ZA#Aj)xRcK;p0_))~_|xS@hq)9B7x zo;R!1H$N&it7_2*2vN6eY0^Cgw0iyrrR4jzg2(H#o!*$ZW`c@|`|R~rll z?Y8A~l>W{8MeHZzt}^@%v>L^w?2Z2m?h2g0AFQ&>g^X`&csR7}g&qxWcdt;}TY7ke zN9(GSeFDzS$pH>6cV{nA+dIO4+Wyvp_6lZ)*IRV>^W)0@*V(Ox?e7?^T(})5_c*-X z(c#p#7e+KVhS=JhjnMWNNsF3KGF+akd4mXFo6c$GYn1q-5$>_sOIBC*f<6B!;aFBEbG5KA>ZXE8p$ zSHnOeARcA7hv!Z9GW@#kQm^Z$9G(ZV%ot%#16N9O@XIr<3cLlPQ(@8un{j4pGOcA; ziW^rmQ5X=G-{DPjxpFwH4S{dF#E;Zh6GM*&aXB(KjTa9YVu(Ye^QmJ$xWq_o3>neL z-53N94n{^;$%BItxdHZd1dOX4+g?y-=+}@Hl)|!@Sfgl+b+Qg*#a?<-d7>C3^NFNP zf5q?DrgU)xLt23zu!pJ~MroprWLY!mztYC@z{|u@a>CA?O!K*Nr0LWGFZ&uoY~fEa zj!5*^>}NtIX7jmHSlvD?zC?4f1g=GPGfOt+P~lipdf& zY==yU^i6c6@e0@U;F%s@hH!r?TI0{NfUHb;p{QY)}HJwkVovX9nuT(K~%bF{yNj`&Dh!`1~l9N$!(Jr%iu zASXFoVlx$yuvq$2l`-sA{+DbWQgec!sznrDUWJ+=XIX<9Svm=8i(zKzbW>5b>ItJ= znitEgA96^zlC3{WQipX9zK3nO=M!5#>UgpbyH|bMVXmIZDwo75vKh5U9AQ17+@wk<$ zAM<8B%zxJ8CsbZd5|>xxKGm-FHCwpOSguU%P)A0#Rcg_lA-!jd10NUE%X9dLyH&fO zPkQXjkKg@V=ByFLBI=Q2nmkCJrK+WaUQrtL6hxf}pN=rl^kx|+pyl^)y)4?mw1cbE z16Q67jFpx^iRJPkH-o=FKaX^Hp2BvN(WT0XDTZrvH}GW_62((nNp_gOv>Avl9JpDG zIy_wPcrW4`ATxIPmE@$Yz3${rYN1YSQVTa(GsfjIU=qdJGeYL9hs_s}d*ir^G-5qT7-swD_>nb=Dwr`I!deB9{FOGy{1OXxvo zo*M1R+~oT=NAsp)ssjuEB{;8cxI%Wp>Z-~u<45BWIUSQ~#6RHRT{vS(b=OdG~HzZPL^GiJlA(!yDXD zU2X*dbSDrfE)4*;qe&lDIVQzOT}RUHP%?lWA^~2UUv`rycR2v4bw)5Mtt-pjVAlqt<0Pzf~{I$id_48;=(Fs&tBIL=HPM_sD^H0=p$6G;le7V35! z+JmZgYP7ckso5!y;Atc;aJGqAq@b%pPITLX(a^zaCUtIXSWmM$mgh97? z;mr^dc9N_R5#L!?%pw*mw4wlJ0WRQTe2@j%{ncvPzoHP~+ccJ$^$9^O{XfAb9NL6>hJ?2l0b$TjNB5J%50ibJV6MxK&Tsw zZB5Nat7cd?M5o(YWyJ>?{#xUZhJ&M>#-aTAOk#&ywJ0+5j{^qp3PiL^M8?cFor;Le z;5iW&mKsFwuS0TZ6)v-?={VLc8yA|5sN;sM3dK=(L9~)4b{Ekvjc};P`&5MUh=~=? z&@x$-qRsOuQW)CeU)XfVjV|^s#ojToY%T zMH1W6N3c9I63$;i$q@zA*6qNTi@)N&9IXU}(3J2nDQ6k{rI3u;*Sn#f$2~$ z1*|yRhs#h5<737}*6HdaP{;hww2RDe%3N42vxQx#SA@qLNhqXv26Q5S75F!*GejQE zC;7lq+;-^apdO_&9?=vZ&2(mvNifpfhjAZy8=P)%n9;GLE`_@NR3<`Wv9+ZrwxQ_} zX(u%NQSz2%i8#@eLeQh+EU5x^AX5i*FrnC+s6}81&k{ZeK0176YiXzV9*)QN2_K<} z(WMytfsqhPYNxT%d9mq|!4rlostRN{0gaIm)Vk)WlJwTQ%*{Z&g zB{Tsddkm#uv-9A=1`O-j1&6ee#cnzG;MQ-!Og^ORe|0JiEOQuy7hs(Y6u{{4S2rri z9FUx85uXiMbje!e{K;5&gVxn^j8{CvCZHQ)@F2tUQXG(Oez*J zlLRoRppLDhiuF{(C6$#-vc()JP-8-yy2EJ7rt!CMl$MJQ+Fj05p4)E|0o0}Aqpzs$ z(=@vcQLICOt+T|c($wyt6plJv4gR~B>oGn~d4pfBVW5=u#Z+Sv?WlZ~#@5 zK&#m*;b}H>2yybr=l@8Ao3JNt9rV=ST(FBY)3{ofd8L3g(=WG#HDjQ%$`mMbTt|9= z;zE9bR3(I2qd~4NWaBPd}_JZ9EPc292j3 zA|cLSRp%rxQmSoi$(CCiNpz9VOWbqzxO~=7EOrldoJQO>nV&tDY1z}otRzB?C>B^h zEkda3H&M3_AvT;5oxFO|sL&t>WMFHV%qh&2X2&=dP^Av%L+n>xLPV%^ILKzIU9K`5 zaj7l8m==h3Ab$nMH{0x%P+xfjESt$qxzgti&1Se+=OSSR#IhDm!N<@TlXzs?*>(&R zCawVrk7PdSLv`xysp2~2{%#S{)!j^@ z>t+cf3BhQEf$g0lKW7`SbTPv&jj?Iz##DTy;TWOG^>9~T6WM+3j^tv%qwfhj+zUP~ zV!z3&d(O7v;#IahVwN$vH9)s$R34~$HJR0J9Lw+lM-DwPyJ#N_2;0rY8hzAgwU5PG5`oPgL=DC}tO&qAz@IP&gT5HP zZH)dU#Vp9fT|T%+;Q2X<`ENoA@zo9yP%DG2J{IcWB*vgn^j&Vc(FqrUCv+<2rjjyl z4f!07`MO9*_(DUGmnX|RaU-|f)Yc179_^qhR~s7hSxQwF7!URF;t)b-iOuPej{MK& zX`dT~n^ioV&?dV*XiMKE)@#Lh{4jSZ?+G{dY{3c#Bg3p478`XD*e#g&h?$?-G#{j! zfY3hiHaq=x3ozA5WmgCX`nE#Mow6TlAhq0F*@FyIsRtU6v(dWL1R zawA?p@L@u^Hs(dycdqIJJMQe#zRn-s_49l)tJSk5Z)w98Nm(V6;?YMOd8;L&q8Jjk zML%tll#zV5uHc+ky^{sBg{0i}zDHsCPy@kUb+}E9efKs%=|8RUmin8ouz!-ynHl|W z{r04|=?c$(rTPlJ6i1vB43OM;>E`>0+R%(p>)6jTy-`W|KEBWW*KnnObCGNf8@%+# zrgp~o^^5oa$6Wj$^1WHj>qow$e9JU+CR&5u;rj=Pfd{utD6R&mlSA~!0jI?U^@Z^B zOOa(ts5fw7xtRf#SKFv~H}h&WSN|?kv1(pIWF9g+uY6R%dsNw0{ha9i+_=8K&*E|; zYs}Os6MlYw+G29Mdd+@rchh}+zNZ6Rjp?myBMY->QycCKARp-#Aa{2oQMle6x##Xm z4Sl}7@xkTo8w69?RNHzRD%}6D=Y#t(s|UHggF<5&XGh#$*x}%SZ}EBa_Yyy@lmwXf z2ug5G&k#_bPw{bwjkvj|W94pc((!pCXBZxdjl6Tp>2B81JlrEzdWIGkpdU?8^mbo0 zwjNbVdQgX$bM|)u;g~3CD_%MR`nE1s)6!M*PE$-uxR69ijZDpXDsoSFo8Bn{)Iw!vi8urErYLp4$~Dl75@N`JvIwUid{Feeh3&c(>eA!f|AbJUU&g|Kj2(CCTn7YvW?%NHVdgKNnma7 z3NLTM%xjBbO|>LYerdCU+wiokD03B-E@863VC&ppmiILLdeVLhBWP!kJLe!zI4*YS zE+~ZMO10`yy>68@OajxY9~#2ptt3QdP6Ht|NW4|^<5VLqjxc?djM=ZCphVpvDg)(;u$oV zk)>>QL^i7tQue)C^3<@KQX{obu!4lLnPq~erQf*LqFeOvUVEb(V;e_BUP>xwbQjAU ztax~chZVN+wDElB9}eWB;(7{_M|DD((?qcdzM}IeU4iqvki{V>lGT-@6A8}G)siK( zv+4s7Dz}ny)hl_ZAZM}QzPT^+5#El8ggD8n?`KG@l2a}&Am!dyb^;Qy#?mw$~k~5Dg;_{zW&A%KdNeyeMfQw*x zXRCPh`S!uoq3#gZzTQXB?OXRgO40KO^|gsGkHP7|@-+Wq>t&`Ud}=6}5OyXm-zb-1 z?IvPr9aSUeZSWXh!nr)xI?no*;(_#GzLz4VXDYKvIpkfL5#UND#UL?l=EFJaCY_JCIjzlBhq`SedZNZia@(b|UjksHdc zhVo>7L)`YmjhgtE&_iuOGQb<&^bWX;0yHWZG_Te#_qQ`YF$+ve5Oo!Bb_bU}qk)5c z#JX(5Az2v4oeB=~-2rhe+!ZgP-)Rj>2)9c~-tVCff}lo~%4#qxG}$691P?`GT1(Mj zIIA^|yk!0A?afX}6v5!93F9s(3e&eH6c6hlCr`e?(=orPOe&2$v+97D*@D#K4@U-Q z8q2s)b+0mq8;o!TTneVIimKh>iMGN`+Qh(NA|FB3%z=ijL**;{u@^~{E%A*y%<&?- zWg?b-B>9qUhD$=w_|6CR84qE0MMrGKnNRHR=9)6iEW!xe>bAcy#$lE!%GhkcU=0HC zHUhWq7XW*V+BMMwKtZG00--h@3@xEyGHz>63G}+vXfy`H0!Oe)k>JOV1S3%+syrgEN$bEgJT^m`@a0^#!8+OIoA^2w!nhX%=BbvaM^ zOHx&7;x`RD04Rk8xIhhf4Y4xiN46GE4HM?rx)j!Sglx54LCL{y)9%L9gK6w!tG66w ztnIb3{Mo5FbRo`bfy&2(r?m41o`w^d*ukogj0GnvCWllI_AUnex&=M=4P><$#O5G} z$qUsOKH3AViBpHN=9rK+1jd7gm}8DPy@BGsv7 zIriDQ@HH<3KPL9HJ`9IBs>s6mW0!q)KJ8@?)s<)enp$q)9Yj_0aNSpYsxC*>Mm)Ls zFBn4kpkaS5nFy4~FFqby^EiLQ2m_RSL)a(3pz7y=got7J@8si6Y|HLQ$!%9emr`LJ z&Op>+576^ztj4yQomCa&*fFX2ge3{QP}|?{Sr7O@kH^s**5vG{$#-3E(*#92L4rIr zW<0j!!nbHkfxI##l4O_rz*RY|rjOLNUGl$_b{*uJgAC5 z1?%#_s>VSo5yh0#>*k)!kMGUJSm)E5>fz<7%5eaeofUjcOuB6zwMES8cW%1cM|XAY zv8wuzrzIb8QNb{5AiDfy1`p4$Z6jcnaI8^-dP@S1IjlLvLp2Ww0h#}LBUlX_Hm-Ui zoDc9a)WW?Fdw+ImXpLfBNG3n*RvHmmG-TvxmErsqhp~VvcZ5n`l5O4oy?E-R*}4Oo zHOM8r-=>uJSLB#!#%+I!xwhz0^v#ZpPHtiN0(Ng*_@3#1F|b8{RzP+*QEtAU6;P7s zzqf7vGg|Y1Ioxhm2lGZcM)}UAdAD}ZPaH}@NL3Jzf(AztG?&rl#~pPC-bnie;K-Xh zyt^R5kqs^TEZOlazFy+RW`Q&hNoKRqJ>UH-{=DVY>*fZo(UItUr1tIOx!w7G^|}46 zb?r3+_jUXQ_RD&tchH?ecR6gs-V2@U))BSVe2B%}By9-C;LIH*QmxS)CUT|09Vc?7 z(H$s~t-(DpjID7_>t(mPs+%UNbzc_M?Pg!cpbO~QSRmGI9~ZSK`={nj+zV}MDxe8_ zx*p#K_PHMa(x)pF#Nzr#o5Vf++L{?SdIdnmGrlE2#WTG{czT}`c|qr$j?LW}k!x^| z8!kQjI{$JwE*0?>9WoQ~mgQHP;h)i;nOzOv;;FCSjUNPD2URpBtjOg}o-Jh3_^ruW zu)lCylqEmH^5{INY$6qnrBp5p@Yu;L)Yt(`ZHL89GBc_mBqj1Zt$DU}v6y7(YKx5q zA5l!Ia>ta1aVF2ok)L7o)23@jiy=1rkZbBS>)%KL7C}5>;z4|a@1me4^VUCjfZCc!3>Up zB6GnwPBz}6x`qU#3Tq5AC52cMBO25-+j?ALNpXrNB)-8|N($rQloIPvT6wxR3f9CW z+blpmn6ZMFB(KoMXh(ofrc5=qhE!$nEE$E$WEwI|IeL&O0V7jp!Ev$0rs%ddjW5l^ z$eiZa)TAjj3kFU>4@NQox`pU+W7pUILSag}N>x=k=c>yo!DE!kd)``#sp9$pre;-C zGpS&jRsy0dokrQ$U@Hf2xnktyCr}w@TNNN-310tq)R2F zNTR?SO_ciUi^7>epRk8wU^~k$pG|?;>OI%e_WTq5GQ)MP0v{k^=Wu~a4TYP>9 zaZ7`VPMS6(fc>0BN!p$rYgT2CeAxCeqviRB6Xj+33+b>j(*_AyLLe?%d2KCOxp4s{ z9|k^%VytBu;m!$+s|rhFoh+XiO9-JO87h1&*Q_N&(A=29FaKg<4u}|Bh=kW6pcy|l zM7hhU{?Y|F>X$OLsfm}(p%n@Ha<^(VJL=4O#WAQ%=hTAEB_xwRWs%J*u#>bGxH57t zIQEp9X~kYyP`TJ_DC>A|Fv3xsfj*t-Z*%RJOh}du*FuszcXppWR`6_U~c{zI#tI z(zUUtJVOs}X}Wj|?~y^kvJo$pLA|@zlaF|a%vlNaA%TdZ^pv}~FK8ye{8a-2RMued z^<9F45$(&x(j^5(l@pZ#l|JC@MO?DV3^AkePBE^E&t^JXTB)`@2WgOnl%t1U*J#dO z+H-UNa@K6wpErx{3#OA|9#=Mqh#Jr=A1ST7Z{kQr&s$nMwU3Vykt@7z&jg-=Yd3+f z?(SC_)+@Q%B_R{4Bzfr$OEK$f5d55Xv26{H#sn{c0di8kQfX-?;pB>~>kYqjMFv0p zvS2ba{_8z9ZC<3)i^VZEew;#Siq#I)|Qwh@s+WcXGYmZQj z;s9t^jrV@3E6Fh$k#7dk;lExodNxIqpVE=?hB^o21Cz2?)x7&Ga4>U!BjfQxn(0wp z4UO2pAk zn+{)!UUP`L!sv|ZGTagmxDjV1m5dA9?$i*id1V!LAkPPOJ5Bg*?*BW`%D0=R7Z7&g zS{ziYJb!Wmt8TZ3u+JtLAXdp~AlAT$VX%@4XiGf$VuW6M(%#IZ55f|eFC;Po!&MbD zt4Q<_C@BJ0l&S84Zczq?#W6AO~^zuG9A@5q5rD!%T6X1-r>v98s{2k zZk};yD+5qTL7Bw5_Q*;>iGmp~$}8v!BHwIcy@l>=%(1>I`G$vUYx;JSaqW=hQ>^_`0T9%e_1Lv`lH-A8qbV zabWn}JKbgFZfwdxY}{*4E3iXo;k2)*O0#L(>nw4={%koj&-6VNkVYMGdVXjff6lG9 znBOMqe#3HIiQt&^3IYTO7rL-r1C%Z*{nwX`L9UbzkSSjaD-m~Mb;0R*W?Q3j4u=GS}&kD^!B#0h*;f7UbJ(P`_Js^g%5D@ip` zao*838sRnV)+>EI>CHA)ZFM)nalG~Z`}_L4d)jR}^?1wUNb6S}0AFptua^Pv*5Xd9 zE_n!Bx8Dulp>g+cY_HKRYvi}dtrzNb-3t%|FzRSQm;b4?DXgWhHj>t%j7xgOrU9#Nk+S;;xoRo0f)x0mK8p1ZS#7Va*h1_k#lKXv~}Q$T|mIcte2m5$sfLHPtHiLU=k zDrn-xZs}Sg1~w&J%YdHG=Cp1^Ks0YhJn%uSms0c;RF2g1q;A+o+hBKXUt~*-gTYYX z@=4^cV6=Jxm-&u~R1(h!G?%|hdR9>H`Brmm}ee{)N9to<57a8ofGH*_*)a>)dj?54O;o~Dfr&$G8Y~UlaKmaux zfmz6i>Reo%^7w}dSt<&XLf4ImX8s|>u<%y>hZh3BHq3Pd$0Cb#M!$7u=alBDkSqbS z02rDNk6SYmZa-By8xIhouVp5vdH~U$T%l%wn#hEId2EU%r3=6^98)g0pmU`X?(;8X(%fT8fp{%(2_cIf#~|GyrJ| zBs$X6UD!5}K$H_DW)Y^ikN{x@e#F>wQKwE3H6fXOJ`FNaFnIGNW?C9!pG8K+;XbOP zDfnh0aCf(?9}0c;?xk^Gy79mz;73D`I^)kqV1{?GaQWR)aO@rpSE)=yM^K} zmq@x<$zFeqsrg*vRWH*lyS6iJLSg@_GKBDJfiT=zNa z)!=LA)~&IHlf0ahbLxiL$o5R0#S&1CV~b(ne|!4A}HA#|zCGaA`Qx50r&3%cExqz~tGl*5(EdOdpjgf(B%g?mSP>I+7nD zB{j^PVHMU`&Kh8`VkoOJ1$e2CMk#0SnhZ$cb$#`#fmG$vwJ^ zfGTDX(CZ^M^1M66xh0rA{JdX{i934>L z;7eFctYaYDeyOuJG+*_;*^Vp@-^8B72lhZatUkC@sm8q$eEMegmV#50!5!iBsc0m( z=~9hOK96Zwm&{X!ZF2{6w!ztXr%TN>H9RZl%cR9MXNk5F$O?kDyPQ*RVaGt3lgEf( zok54`A{!Fc%+>TSg9YbH8IN6hlW$};K&F%2H(Z0_$d8Qq+fz)6E?o6}T7R_uv`W@0 zX@>>8_=rd@3zJOR1dpW#H(9&v)XyZ2H_cWK=7Hjxje1b$Ipi@I4+SD*#{GlgqgQK( znnQSD<-&M3tEgd$wkLUbl7g}daxddMub6*TS<)8BQ;nF;POl9FtX4 z8SVe{*FQTu|86XLzKAOqE~kUne_-^a`zEN5)8kO)n;~F_nuU9|xK(ywZYC7Gv&m{$ zdP4@#vDK~-A!EY(`4hakdjmw)mDVz?&dy64E$2v!or?~R$?NDbOHd#zRZV({42MoB z<4aynt4YU!&za55A~jwh6e&bMsXMQhLprqCg9^}toHN1rhMREP)N`vX6`>oHtYx>% z6;YzfnBdgUn>&gfI`|scT9!pXn14K6)$p6yInB_1$>9$$))SUgi%dzEa76c5l~7$n zr$ztqfDG8hve0*Kz$Dx?SjXe$Hu;HMll*x7)+AZX|CI$dOb-Z-a5Eqn;{YJOjqf6O zRp3KB5m*My6fz467Omroh`L z{U(LNN|@Oh?Cx)h*oSN22;1MOkHDhr@+c+aaud#SAGGTzX3lN610)>Curne?iuO%fR0V|1$?krU^hPDy+y6By>=R9 z!=RYt3;DG#!d}{hKeCYa3ZSV~@o61|Ke~iJ0+9ARFw_h9t6YRX3WPrrkoM-G7b)TC z?1jAr34PWeZa<*4^Z2!o!d_6qUsTA3pqT2U{o6JXZY9FqCn0Ws9;Jr=hK&#_HB`$% zpqmAd3pjTj_Tmzr<{+pY56}zfkW93v1bACl*r~2jN3_!Bh?es0wtig+IlI!ae!Xn4 zGxXa9;LTHQvpTUK;rgJG6Ms_Psdp{VNwU+Lv+lETqFlKf)bfn?s zLR}3wux33>^;SrU*_^XGYLCEnFGQkl=C*fal^qnTFKJB4HM_m8Uf(OD*z`6^7M`M0 zkMNX7Bh>WvgyWY}!x!L}q9dtYX^!1h&GmQ{dbBeIt|sIxjOR>RmGZ<^HL zH|k?g&b<8qE1t_EpaQYSCa8Tv*qTxtC%*xe7ThAYjJlXO71F9g=6%#HA?6s}x!&G{ zPa#CMfBPE)^r>U(DHhdtLUs;oVXQI%| zQD%kEFs9-7IKW#*h<1U{pCUf>z)<&4(i?loRF(Qcy<>0Htl{$AMISc^mbVVGPIVWR z52RSC%|maz_8&?Ie{1@;BkbcNw`egr0DQ?TbZI+zo;6k*8bu#IAu*3KN_WP+ds^4l z)1Z9m7};=NB+8~3gVTueV8`Rt2>zM~Wh9Dp5Jffx=CmC{(Fnp^Mv*g?73^UGZf5Wi zJPTp)>T9V%k(gstQ&IUEzTg?_h?l$I(_bVELk7eiwZU7luNf{9GDz^nB`%WHJCcrt zSmqXu*pw}4ELw(JX4d$QX4WJ&Nk)n|Ne!nd^h20u`IUT-d;)(IzHn=N<_bUhx|VHa z>3vd-pONi)XmrC?4K*&(ZM4L$CALV=1pE5?l2n@(23Sppa`6iNv?EwXI3=cF&UL1E z57izM(<}ojAUX4Iro_H1LL(~k+zs6>Rw>haueb1XBgWEP@o?I!5TeolUS_$2 z$S46s6QI3Cw=R`Q_xBqw{!KR`qMrDN))3J$(iveXQJw^_QYHBD6FZeP+$DfB%j;wk zY1+STRpWxdkTUkZtNQ!C;WL-)eFmA#pjB$sl8ahFIlm{VF`rDKvayV=FP7M{TbSn< zy=gbWXx3+TlwZsz=R2c%;<&GO3~5*7#o__=cHenAoiY3dNeuU| zByKI0M_1Bed~8FYg6Ca(SH7^vTD+9}*ddx^k{Y&xXEJ%OVnG)qpGuT9UaYn6m-e?N zN5jwZgA5K7Wv{|JV3!0=*GCaPD}MMwUe4VpN=~u;YK$B8nNz1YQ0F3^BSSY}0pT9p zC0<>ZB6SI@oelSt0#ii@rAok6Mr*CxTd~o zO?@M~qC-2sbb~y4SXuuL)uozI8keyXT2x5|m++wn#d&VaeU0m>@GE8_Hrzt~1SU@1zf%ZxpbxT@9`f;*!Vc5j@j+LW_xxw<0EarNefxkk7f zq--AG*yUtf)$GVm-q~v_AuUtQ3@ z%HR9iq&lTKo4Y5j>znzOs7et@0BhO|b|UC9{jFi?K{C$xY4+|zmsA{QJaPNa3eUlx zKWAWOevA>nfxi_mx!9*AltogSQXS{@c+4K>`4Dj@_kI4oV+O&#mLs6oj5R{cA9KR+ z!s0gJ3DR*wYuj&j3?I?MGN^w}8sW!!;`GJL`uKaR<-ZKfgl2$ah+?2%u5O|c`#==n z`&10B*i8&W3@jWu9I=V+Xn8&D_}g+$-v&vQM%b3pn8!z_RiVAS&hkgqpIn7Yn$2N? zS|&`d*>qIj!}+hyBG@~7ncYhhSol~vF)k;$S+@L{^j5k?<@xzSuKWSy;GMkEg8F0` zqs#Iw_-QRJGDFtyzCRcU^bYM*g3!rEpM|HW?Vu=g?5&JjUX#~+Qg_D&J3Whm$Y2dY zCa+L-3f;SL{&1qBO}LL=UlC#&-p#4M;6mWULz`pze|feRn}rFSrI-zs{tTo0S9p`b z(Ye(6)jX5$PL_8AafowbA^kGP?tAZUcAQ)tk;>9^%6yLOVP)FL07>0oUh@hhQw;U? z!RD*X&2yX%cE%sb5vQA#Gt3DYOFkhbp2l~{4SBYO!H2Uv=E(|znq>;` z3|01OI&5KolVy)8$iA})sPD?-<8lTULaeJcaash$DPA9%Nl6yHu5yM2BT9h-MfY&E zT7|)!JU(~$@OCO$7Af>t)B@rgy-Un-7TYuhKB_G8%)i`3qo?c17<61KKu zmAZcWxOSLhHUOoE%3CV(@GS7CPc;6}0Gv*IQWoU}^PwdLFo0NvMvk4q7a4zrC~-ysw)Z z*f+#OJrY+u!^tjsjDGdtP3<{b7~Z#W8Jc+jsX3~uw=etYIi@_mJ9oeTYS{{e z=U{NZb1c{zdb#XxmY!G!;gLxl$wjjOHZY!im)_e*^N->_XOF|JGsr@9pDtaS}_Ty^ns&kuBnw|31xT@-xIq4y-d z*avR)1%H?*1llbLaql4iDfnDUzB=uJUpo9vVpmZxNiHh5hNN#TrCkC_wGaQ?9DH+a zgQJqmw5YbpB2e*0DTur`hlTVR_)A3%y$(i;*F#>ZZa)l9aA@Pq^xj4yAV8k{@qZh& zW~4KF-d{+&GBF4U^MBYv|J$hjZ;%t-6Jr@ufcrJWl${h5jRaJfL-Pyd>@HCy;h+Ge zq98RFArXigGDl1MGgI~o6S81Uk0Ev{Qlr*<1>L$_X}Ahddu?oKZMj~aWxs!Dq7aaX&!@f#1>u7- zDEXZZ^X8Q0m$}U^)Kr)7OvmpZ+bbZ|RENIJP4P?>yHf_aQ~28h+!5S2eprQ~mw5o0 z;+Yiuv+U1YLYgrNeP?aySC<=aP3euFXh(_Pt2vac5lM?HolfWJIQA+2iPcy`d6%CC zaWGqHm6?oB-$HNlKuqhSq)pwzVq4FuCWV-Gr#J7052~G?Y`j?(?h@2@-lqx^Yt4Ad zq3luiEF=G|B!8&wm4kxOf=2c-o2}o&M2ySjmy!F~TDju@yekbAR&Olkp3ENBgWpS; zvWVgPuTO|$LngnUBPzpRB~n6os~^Ui-*wddSZZls6dSt&R(VZJkdVrnInEl8D2V0G za4~BNUpeENadI}Ym)RR2ib_o^+a%;FU>S=`wO#o$mDn3f;tcOPZUgJBdl5V=_MOP0 zP(CcBRoEpvmZ$#~`DS3dZV3hOx+}^cv0g)@8?O1D_TDHp>*$<_fIfs`ZJge?ipzv_ z-E3rtS6WVUmyI@Iq<$nyQl-Y4H_}f3c!+hkfo9vpx-8{Oi$UZ9hLy1+l5VbR<_QEl zN3&;825a+XMa7yY(Sny(29!)cN=sKo&hvzpB1|70PX`rntM2Fym#_U>rY9C&hQGx z-3t+jzWk(SEzp_KFSQr6FYWYd_r=Kd7jU0z-(xsSb{qphV*GiSZwFjx!T_K~mTyeC z$Oqybx5tkW@HSDf@aa(i3~2Z(YIMv9VOwc+%w)#X=bO?xb!qbEDoS(?fiU@YaY`~; zUv0B7?vRt+GO8Y?#!k4cLe#;O7Sjr0#6t?EmZ4m@{&0fHh1f-G1YzWC1fe#j?P@%wGUPDOTZM*)y4#Dy0aGx9F*dP!-Wb>qoY-yMnxtJI7uF%0|j?Y+floSNoEnbHTUaOO(YX)gzP zbW@N-W=T09s7|;Y=$YNeN!c7k(Z|E>N~fRj^%fMNc+>V`dlYMX9~Sk_l`_#jO9(LX zsI-XDcRM;1u56;X0?a~}br$Yol^5=E7l>6620sY564RzVTXKJA&YbOvG7utO^#}2a zwv;S9!lfhI;EG9fxdf%fwfM~nAlgvZ?P0b*{F<7AhUMf1A#;oQ@6UgMNd_5jrjG^6p?@!Z#T~0X{%l4DJ-wZfL*F|W7Xo;6Dgsh9u zZ_$GyM8|O+O!(YFd~8-SY)CE5tVU;KM*rNN+AjjcB@x;7krnYrD$|;W=uNzM6O$~Ea%Pr+~~8GE|>E*|>EmvIu@TLV7e>KR9zeaSHl$QxF5wZ$3o^=kpWf zSfM{AfggLvSPIF8Nk8y7{05<<)jC#@0F6vf9i~&+Qe6$ne7z7^XHD9C6zDcWam*P9 zlBmN0+EkX{Q$^nq0sf7A-TtJhyud&OqZ8G;Ew&~v$iEs8%X!-$>objUe;&OjFO?Xg zgxZRa+J!JSI_Dd+KBFjtbo2*d`sT>+az-&$5c=*~YC`BjKKeH=2ZAH}golZwL*Q>m z`rhw>YA^2crI`T^92FeKSglT#u{gId)awzuk=N^M5jwxAIE?Z38&cKw9-8jPWmf)FC5~Zzg7udNi<}Xh$sd&f7W{;}Oq$uL#x{>) z_0c8mK`SycD@cSENO|k0!gVGUJ9NC_w&iXP=1uW+QikQiAb-R58<3aJ0xwMp0I(F7 zCy(h`JvwN%OPb&1gf3n?E_+@EhSY{?nJe&XrR=^4o3JL80AJ6CRXxU_xeR6#L%g5V zuMYcoSGkYv7y0=7v!Fw$o&S{-Kn&RLHTjsS>mtVcg2-p&sTp-&h*6aBOhAevxj@l`6lyHc4!+NUY*`nr!2+Z?_6%Uv zie!`$+1sN+4~C-8@qk8O(7y9^CkD(^^+i@0oEG`#>AgcrJcu}^Dk4XphcQ#w>OB1s zlTq}$Hn&v;4vxZJ@_pZwv4Hh}X&O~oi#c!isB0weRi2B9g>a%e3G(bkOl)Wp<%7_G zAC6YcAH1rw$(l&;Vu0Pl_T(VH%7oXDIG~mF6C*EYl~s|3NE=o`85YS5rbMEQRl`Vu zA-7Z|yH%Vf!&vsBVIG6~W;9JpW93!N!K=IGYVGOtgMkjqCow~0#0U}V(?<5wCgf9; z6}d~TUtPy2u?XE70Q_;RR3-N>vve&cfL&e)y-E-gn?T8>e#!mQbdr&2wtq5Z9yM-n zgnCD%TU<&w#7trd7G{Gf$JR_pVVqpohHTA?ftrZ^4^0)J7lF%zd1*1X4S`av%VFb0 z;-t1j%8+Lvo1(T8AtrEQJXbFvc=>7Fa79a4jn>f8Jrr;vvD*%^N#pODhM&F30*bvp zz@^zgAy@D0pGm*_>bE&KV`CKl8r#;!>E0h(`v;-lr1rAb)xFIO&!f)8tbHQW=sXig zy~W7GFZ(2do;j=?dkZNPm zcdv@>uz1Il88;ri-X4Ejcr_nN5D8yigympd=+3I0F(E#FQp8`N7D38am-Ez( z{Y9KpJP7ISum|x-h}wOYiHEq4Yxk7}%^;ZH7kry}{RV3;RQ}J8$Mk)9OBO?3+)=fw zknErKU{`x5-20(9qdM0UQmd}WOZx%vP=`=cJ@`sCjBz_)fBXJtWAcxag)wJQrtgb; zh5zDS`ToN-Ue3y1*1`0DBEJ7S?pm5=qk^u1Gxiy7s~HgugGr|h2eyI|0z+3CQiPI} z!~p?sMfYf&en7!w>wbC(b+~cw$6V|VmDzhDyYnd0;x{vnM~bLT!v1a5&;K=m>6jwm z{r!~~b_zcyQqZFOe#3%o^5v0d7}7CpN1L%d_win0`*X6;JCJP^AyG%U^rMO^_e(B=0VS$dF6=qQa3#(C= ze-Z|2<;p-80W1i08jQ1m1c6l&Wa5)J{aqptEXK)4*V%eT?`8w#e6fcYV-6ioIaD;| z()LXT)~V33nM*&7Odr@}jrK#zhaijZuLx}l$QZ27F0WlF6+b*<$QC>{drb5Z2@3zQ zGtLLP^TMwyTTl5GpcOq0hg zuH9AAK|I|{sxB+9pmbI!IyCvX-uyuBvmxhMsY)z7uYJXqTi=bpOS!yx8e8^LRrx1? zW`jGXu{0XU_U4M#Z7vXS=FL;p2H%hzWs=+FzDyed25a|AX#s_M=-0+T@*YIR+Ja)g z9;O%~feBu15k*!+82!oOHL5Y*glEyf*G7&o!`M6bKbm#Gfd4qB2Sqhw<&h1co=Wl)ZlJX zZ`-pbEr5{5)lu2_l30(mys1jNPN7Oua)O?V5urjs`iD?&>h27#ygtI}iAF6p!qwta z(>^u|CMZKc z31SUXG=sdhENY8l0sW!BNNivc5W0gFU~+y$$VmfH!1m^Ouff!I5y2vra7>)j=~Aj8 zyz}Sm1|xp~MdKIH|5#lpWdq9{6Xj&y;8aiVYt7wJ%jZ(IFd zX96QZS9;*}@2gOTMX-vVp0n7^KdjKqu+bjh!6Ee|D~!p_E#jM9|HOwTynH@99N zs^$KkElIYy|BMrNeTm>{VX{Yxc5{lVCZn~#PLNk7Cv_=m$Cn#k7H&I;{(kiGixktJ zoZp9xAIaS+GpO%RQ;~lnWTaaK>SDm~v>~F%Xj_7%@#ceI3~i#6?-4$-j9bYWTPL#9 zUv3D4Uo^d>2nqT0Nm;_$kNJxily3!}#rIdfFc+U-|2`Nm<@*q8zNm+nFF!Nq|Np`G z-&+nZS5*z%&mL2AeKs#rcvzG)3XW!^U>4zqX1RheDKKUVQWnw#=z@CHN~!gEty|Ukw~zCky#1Tk%dWdyb2jj#{T%i$Q&sQl zd+&SKQ_owzg#k!C;iuva5p%1N{z#9$s_`~F^sUZo^XBuSU{aqm_?}+elujh8`cpy3*(V<8Fy)mZ1$dZYyU)G4Z1(2bi@EnFGn-o&Yo6(uO!uQ1QSYFQ0;^kEVV?SpTHfqU?VYUN^&XRNYcA(0^k{v0Jf75@`OvGL`H6P(+ z&4NZODGQNYmdN$+Y#P*jMiCkt8CjA^W?yO`-lfKQP;Wy@5N6J&#AzIQ4a!=i$k zBw$Msn~}+tymjMAW>-QU$rD(EI#muH)`NpHAzEC`B;+|L3=ir34Vz&gNv*eW`@V$C zBO_7@GPO4rgTlkw)IO}F4MSVmu%9;^s-i=6Jq9xDWUG3-nqr#YMwFePaQ;-0Hxss; zU20L-Z5AQ3d{G$7OEp_glxlsvroy!=pCb}>YeYvn=|aGdwrm9soa;U#S)59`sP>5w z(yXg4z{=K7#z^JY=0u9r`ZjR!H64O=x68V$G@?S5a)^MI98Zn~H7#UyVm*OXN~spH zH1_(wfR$W2VZ9(|h7!UhSWjKe$Yc~oV!;Kj)AwCQqR6}g_|w7Z1u3iH%gYStp=kT^ zGFKKn+|I#``o4T>y#%H6IcaqtGP~C76vd11^_5dlx(dUs=DqsZPB+U+#OI zf6fJ!e08b0RCf+4{T{A}>lhG??GUA^*~1q_hS3)C`4)n>f&^BHBv!Tu^@If3;JndQ z%d6SNJLy&zY)+T>6$TIX5(zqszJ^_J@)~CRLwa^*Ht0=57-@YnC=VG}wWK!G)Lya+ z^=IyyAa4}~qK1;Cm^3majDzisM~03`nCg+t5>bR_FsD4@t~m@P&KhUL4o|h6k$q#&0$iwuE5N3(-;}Y8)(4NH8qqEVZh2Y zHiGptJ#xU%4rVn&aB;x}+&5=j!du$Q*vy8@H^`z*P}$KXVnHGSqpj1qv72AIDKp83wdgisX~UgPn}2x46OJR#mTrf%R*D zKg*IQpi^%?{KuOX>OEl(nva)nmq*n>49XV06q?eO(%AuPGGd*yto(vl_*FL3g6f#} zOXZrl0paRUESA07J>v4_LaK_iSfJ2VP_aBx~4g`2r+VQv1-B9V`vzkhxei zaGVr?&M-jBv{Vlj^`->(fptl5ucrng^h5W834=me z!Z@^uC;U1P8J%oE(kyW&O>GSb%{y0A!!igG9ZylZ=4jzTfqS;kECP-ICqsqrd>06R zK&8dSLR3`XrU{ETWT8G}! zG!`9~Tot;3r-a`)7=-(}7+zQtRonL4hoex^vX9I^@fz>y`}m_rhdxqk8PbT|`?;dX zI@5ty zI90f0l_^nClGmD%TrguLD3p@x&Tu;+SAKoyL}b-gkgdAuG(FNMpSZ43wheg=oaoW5 zwk^GM1HX`M=X7g!$c=R};3@SrV?*KLirMnZ-E2W4m)D#uE>;8ZfaxwqbLjd*R;1QK zN2$H6C9$rB_>a4}d4n1?OS_8L7o*Y{N*h$Y6#P60yh_SAlPs6M+eb|{>g?f{`Itan zlJ#YZIdfl#nn_jY1>?cdGIm3!=FTwzTbjz#25G?{mumXvDow#r>9GuH&%qDt=0sQg zQ;;urGvk-L845> zVp?=0(~8%i2u1xOAx!#u?mHLo2H$srw~UM1B?00bb9FIlPe*o(?)l=~4hk5g%T@*9 z2QkHD|K)9NsiQ?cMANh@t^ZI<(D$l#8ji;M(FB8G-xq*F-#fnIg$&F!!p zcr+juPaG9;zo6HjU(hQ_>d&@c*}Ac2nm$Oq#`RRtnz4xLxr@Wjcb|+ z?M2n@V~R>UB7Zrl&+V%A^D;+@iW{4TmGoVgtBUSEE|hyDhJ~Q+z4FG&8l*YHxx+>Q zNL=uPjCn3=jqx+hUs5$#kt`XmhAT^y|xCJ^@(sJE-Oo8;L zbZudI8z*p%gjy|`af{rGcDB?H@%p@qchYV18{eJcPw=l$EU$*UhTrVhk*mud)b4lW z<$I%<^gPg4sj~6|9}WKf{>Q~wSjPzk0 zko$KER^wa)T>|41Q3@tR&3D8)5iG5hltig{8P1p#_f@!O7<}XC8^*b!zH8VuD$Q?)_0Ff!jHdCvwa{r{j&mq z3>#6fJAvk)XsX{4B9earTG#U-R9Ry443Xm4a@rhW*ti;>%pMv1E zEg1_UldZiac!j@9Ew$xtv|@Lns!pqCn4K6~3`6B=wfU?m*s+I__umm7z_SXqf)Sv> zOrp;k@z|PWEj^d_hTPf4r$1`7pgefkXRUTvr-A71-f`LNXF2lZKBH`~YWZq%a`(AH zZ7l_dFg(cp1)_+-*+zQPhdi|WG0$)PNa?jS_=qyU)v{u&+=cdT$d#Z9=^*0h_Y>^UuNTrGo+(mFs;BquBFqdhbAqIAk~>ur;d8~A_2 z_8O1#pKzoc#&GS(hi5je2QSH4^LDVyVnrs~(K}3;vSse8@4#H_Ptp&!Y;^D4&SOSj zAKZ!$$ty4d*kJH&r|aXMwn&(U0xd7f8$@{PTtcYTbkYkN)`jYzD|rhZ5w+VKuidCA z*V4+ulUfrKZV1Z2n-03snuC&gN`Vq@!;WQC z&gGBySk|30_uyc$xe^y!dXy*N?U zHSE8UBK8~66}bjITLr$ih<<7(`Ue*Wh`*#8C49^rUE}$MvFH-j@3x`!XX}86or?UO zYp8{&Z&(`aVEZX+I(z%ltNi}A@#UD_3sA8nQc;5#C7nJ-&@U8)?}Y3NR&RzlQ3h_n z(8<^{q!4loxrGR#M_+r!*9%jpvRMtGa9B->TnJ3 z**tZ8N)cinv5LJNXPy)X2l&W^f+}#nl{Ec)UWUp7k=zqB#GVLdohlA{S;fAZx0HFW zj*f_o0sSrtqgT9xR*igDiRbO4ecY%CX{>Y>u-zg5#{T`YuFd}*)baF{y5J!D&+FR% z=TqswSU^o!Py7)~e-jyPpB{PJF?r+f;lX;9G!$eK9R#w3Bc#s0s3YzOA@xctt!P$< z()83}Nx~I{&=UCeFpApR+ONFXolQvOBLpaC^+L4?`SyVQwR31A!74Njuw}E!?I?ThctZSvSyQ)m=*8D zta~Yj7O%}<^9mgd5{+)n%MZDXI1VHz2B%fcanBDt_kt{(ph>XimxWG z!QOs~3#NQ!M^R(_W$*ljRs5w5i0MX-gkGYGvE^z4s0L(~K68#fgQ)mq;`>TqeedaU zFT)H}?(nVs=?AVTp83IN!N;lsA4fp7uIVR8S1Repp|?0EDh7*fj)BHUPSg<9{dHzUc8Z%z}k(r~btJz7!Jf!SS=xR010{A%{t zZjc~Ud-tZe++i`dEPFdT^h3}Me727r*o=#)bt^UQY98it)4xSaxXKDNcioh;ql!4WHs@%Yht9e`L_K~t2wE4zQvpVf2Gq`7s)Xj!L4!kjmN z`cBrZEKYGoEPHB1v;pdBOUKpK&j<^TLZ&1M75w*i2S^Xu?ZAsL{3^C;P3RyM2JV7d zlo3=hBxWw`IpR|d=B7ilgI(9rT8#xG)j47Ki0!#Wp$4mV?tp+peNTY~99o8)u_TZ8 zAIp^)=~Gc06>r&C@qG@M=s??*v;^J=AzdQ2rR!~Zw~#AjJ_gn`$G30wO2+?N(9a!71QhxkZUiFsySFUAVL=D0A4HwT(s_>eIx;K#5+=sOm>uCzqm(Oi3#O+ zS~wKKIc7z5T1@#;VHP_ik#6S8VALpgltAmq@OQ^q72Y0<)zu21XN(*tZdf&d$k!5( zTq25rf&=-OC*ekrNP}*0n;_hDj_8|T?{vp1u(tWGV8;ldMGmEq;m`+)JtICIiF;B= z_W_u|O?eUzntJF*>1%9A{m?$Ny<9j^Qt|q544fbeIhKp&8xMiWi6t2te6#yw2>2~-|VTTV0Qq8BmrxGQT)bhzErC2bzcP zl)rxZD%K$*vRku-D0|=lT34QUB81juF-A#6xgpjX8KKTm3|eG$c!z^%xkXc*Jp&|# z=|CT+%&JliuQcYFWboi;30_7zRkt}f@3I*g@3J|cZlUC$@;3UVPFUuRRKoF;%XqOQ zqky`+VQ>(*yzD!;a%3xUMTz8D50-DtQiqmPO`Jn;2`^x3{eNw!K8u?ZQ)ul1lR0X? zN1jW`MT#Vk4u@Gy2~_i3&@CyQo+2$cAb+3UA;@YcHrEX`W-H|e@;j9M{R>*7OkQX- zJy8V&a7KAVe&w^$hdUZhjxK~lgX$5YjL2Cm!C|dwNx=%|y`o2gr- zgKMUpr?Eo+5EuLH)sxiqVLbNWEdZZ-tbNiy1vk<$E&*W(KMM0rjjI1eDr0}L)HQSZ z;ZbtYk(q_aK=twBF#w+;q_YZAZ(KtyF>FHjWYW%-QbvcbUGqTK{3m)xX|f_`?53x_ z^9JFs%w7(N4u)kX_^IqLe>44ijQCrA7P<`kkvwx+dX(xHQ~)hloVu-uPduVr!yE>} z;QO=RR3k)B2aE)^3zx(3jf)h~%w4&Yzk&V?G|w@B{TOm4r%nKB=Bl2@V8VpUAc8Sx z^zXU}94j1f5|}$kwo2L=;#XWpL|(nKnh>_`Z%{*z=(g6esJL@gbyH%b)F)?42nWT- z;saDK*uUlD3AwT#^ZxogT^Q`+)>g%H8iV+@ERHaHkz+~TDLB&PN{;scLZyOt$}>9z ztIq_pz&>54o5nY=Q2#ZtIfOZ&cmZA?;Ss(D@B(eG0tRIcs7pL<4m*wq;L( zt(%aR21=S^F)$u|Wnc|@Y4|F4bSpnaUSla#QzhzPs=DuPSpoW2Sxm~i_gqY10u zI-*ts!Z^^*cFsLuU}lEXmgxfPK28Q5RA+jjzL>*7wnTPWQWcWy4XK`%YzuIw?y(lB zX;rL(ten=16u5A0UViP(IH|Wf_!`<(+fZ#dQ#JFWgC}hjG}^0i zkUp3biTIZk2)Iu~<)boH2lBOE(*MK62R&YTx|WHi>{N%44OQ8cU>OTRk+Y1!X7)@XXR|}v><3(g&W)}O+rApkPw3@EfGp3xOxyVf zE_eQ^vqP`RerQ*#vQ|4mykPpalngPLo`rfL=~~SCrthASdeK)3Vrh&#O^9lzqGsN# zLzh3!Ej2-nHNn{?^5Dw*!*`2+bo}O<+yW=we;?bmEeKX&?NfCSKHiMgIFAQbveyUT zru<)JBL6%navRja4!-gqGyfm*A1bz1CT9O{`Hxh)fA(8rpCVkgFjZfG0vTj#8p@Jt zy*1*V2#g&KR44|q^)hAVaOgDC)>eUUPOrU>e9JLSIr9tXORWLmq9>W3HAED`MgDSX z=Fj_dz~$!m*QdUK4@e-|8_y-lPB7$V>^{V0gVvt`YR#x*+F`3bAFfH;%Oqry0e z#QWLtfae-w&jZ$M;@^C`4du3ZVxRBjg}wQH@_4;m>A7=EiOrLpC4fM>c)*gp!9GS2aveN$&)bR=W# zv$oHm9dlM`;|BNYQfHE3=5J*vFxyNjfjnlEII>yBJjI;C%odNE>JnSj=i-mf9};5p zwEqiH3l0&JvoFbPlHJQ}^>(H&78fE7;T=_roLkIAuHyTTOR*$GE<$x5!?_maxq@<^;}O zuN$sUsJN6)+r*kNv1*$wB3#K~ux=J;6WQ>7_2DQ6rKO`@iawP!(*M8(N%e$ufb%zW z+KsnD(m00f_Vn?>Ze!UHeQW0)TubiI%3g%+rxbpf-u{xNz7AZsHY>oZaVDyPk4fJ3IaLR@di33HEP9s_QB%tnl+#V`%|FWo^6C@K~!Aobjc zlUG1up|A#Oac@QR@vFHa|d)U2*sY+8_0%?Z+L81 zB;u+C+}|iV$%2C&3R}PyBcf>`3B*GT>_B{Ina5y;dniVi84ek|SiO_ySgl`^M2=ru zJ}d(~`nI70z@bOvLO-#1`?mX^IIsPry+j{o7KO9U^a}JsXjGN0@Ow{fHp4%cZp@@aH|{OCVed+R~JY*Wk=%Fq5L&)@Lk{z z$}UytEZcD1pGH4AJA{E8lwj2EIf39hDV;Ut*8tl0{aDwieLTu=#c`vE3(#qf+dX3% z4F#fa*HF+p^YPhBXR+XUgR&wyWw)x4`0GUn4wQVSH1^f8?Jv8o>o0|b_ZB|u-tQ&6 z^T<~Pb$??0EyE_L@S(Uc)8tZ4B(w)iw9p(J2P%nhKqgS* zIJr0dc~^<(D<|@eNMLa2tEw9Znb>0U%X*H3oPQ5gd2Ytf-}Q+1nTw$Ie4wZkm|Pb; z9yq>%BFnqMDfeGBLm(%HJFs1%(;*Wn-JgkaR@tOvWjv^?Nbd!A}JiJuh{sm z8{|0cnj?=%NwL$QteDhmLfX=vx36F}SXro|Eq3ro7IAhu;qgUR#u-7=!XzO}ru3mb;OF-A8H4nC zPLnpn5Gr0SQh9QwByaMPoa*t^Pk%Z_*F=fs-=eNXp_^IKZO=5!%2R%h&TOTN)MlB0 z#O)4~oHU{vvIG)wxb>caRL=tCwdGEY{3SNlpx>u@u+m*^0hGq2gGD+$10TSsUkaWM znwDl9$*9s1?O4&2o~ViN@tH|Rc1gmTxbilMr@`wn0Oqp*I9?5uB=suu39|JVtjMxs z3|FsLjW|&|r2*2b+f6>e82b1(As;b&r!q}dp}Uqs%owlWPm2o~eP`T87Q&PuAtoIq ztvBHnj6PryoAU%GFN}!%f`vYFe;G4!oJr1Xijbmgnv%_myI1Ty zL6hE+Hf+w?U+Bl-SF3lSlZzq>^P|@)B6M|Elco=Ebvat5X^2h=HG{gJk^mW(KE4ya zPsF-=;#^!wF)OAAP!8^m`^g+>TF!Qbji{DT>q*XQVxf)!!*4{A$mKu6I`3|0i+hO?MRW?iieV z4TFf<8w7Jbw&c9R4ZHrk?#RW7<32W>{((o|ungT-YNYDq;9>{x{N+e5ijMu{zgwHG zvM16XrKkJozZc<=4Ao#rr2!dx=5f!2#|#+GSAEMQ{Rrx-e8vw`eaj6G0IEUSM1NV+ z19D?Jpu$H&o`xShXZQRH*SusNwD<*xzST;Ufy=Z-)`a$zscSx`?NX@)4kK{NVlOw) z99Rc0yL2J3vgE90zxk)*;%#AGUM>0dqRg?SPFFM+?L9Yu?QhPFDDCH=+b5g0eo3e z&k`{hxrQa}bPmx1`3s9e_6atoG{#x1hs1pD!sThyFLspQT=Mf;$^K-GXQ0`@OTm0F zu%&3Bk+uz+4cbrfv%;Hk-l&E{1%nUugpd8zXFR~p_V4$(_ud=1se$@KRW;=LN-o!Y z7OC_-?%Y;IOE`zfm);d+k;J~x0Q}-!WH;8aFz*%f9j@~D7R#kPr|Y0wXJ*TI8v)uw zBBdZaFX;ZD;P-`2-vgU8(?TPJkLCRwg0&peW-LgJwj`xrSkDRMa3%6<1X$f8x-9LB zmEMdn9Maqg(44g8Pq>QZjjqrs4!tv<39U11f{(29C4sq;MI+Tst6SNAiV|+iOLB$7 z2YULgb}C)$H`v78VKUcWHrjxU4|+>#+0P-`m^qFp@=#EIg+oyDT4YaZIg=3_^#gW3 zH^2U_uV!xq#c62Ya~tpya1}6jmAP-yL{PT6KT4Se-Q+intrT*Nq&>taVk!@K@25SZ zV=mpLRxfnaQpMZ^?!VjGZmIt~J!t*)Z7Rmh`5arZDP|K~Z2W@$#|(lz>!JpuNWgWN zEH}9tg5Lw%eG_+#KQhPZ+G5CMQOEeIq(A?j&3MscMBPlH7@^z@!wNyesg6h~JfG+n z64^#PV9gf=m4p7WG15gP6M#-B5e{4xOYYu8-2Qf8s&EpnEZ7aU2DQ$yNh`E)>YIGQp zn(YWr+L$tiQN>K*9ylzVwnk)xu1LSGJp`KesFZzoc(1$|6P;3Zr+(C_M7xd$vE4pw zlRmBNdSG7qL!#Gq(ys}beXu0;6`DfW&gE~%7*KsiWO{(E#YnHkXj!_NR!N02@BK@< z%-B!q!~4oZXLXroUe_Bm+5lzbgWl1x%eHcO=eJ#E!pZp;3A9v4QSY`(4eTuD-j}ol z+fK5Ip(G*HH6m~A);n3zB?5IMQ$>0G$ItUS@LRT)P7PZxHD;knnz||U@ZEAsU+&+! z)?sB%)g2We0~#)Hi>}mlI4z1vVHypVaLt6%C7E?isI(v(<(VDYLz$PYYS!_*xA^3q zo7XWw*@FEqRf(zFLY-<=FQK_N%3vA$IvCgS7G_Gzw}+kx7M+yvHj?<4AU=64F)R9r z1x=Jte^Z$h5Wg`i-IjyoG6rAlJHsqH`Pw9wZoD+N|AVx546cOVx_x8Yw%M_5+qP|Y ztd4ElPRGfLZQHgxNuNCXee3SC->Q3Vox0!F=T)`ln&Usm7(b!jKJs1s`*j_ojxsY~ zo%?=mTSIgV%}~zYG9hJA4G$RRZF}68@)+Q@v~a85^nK^ui^|tYc7~l-sd+;e4;LrT zAS>Bj(eBt=o7)s;d~%u}XAysBT4Pf>Fze}g#gEP~VawhwQ5Hb99e>JiUZw38T8)r5 zze+c)dO_Flho^JAWgCD0+Zx;JFgs)7>rMjXz$(YmTOM5sGwlE1S~{Sz?bR%Xt&goT zoICrR(I6Gt-2c!kz_42r^>}GpK#%R*!2w7y0zT+1hc{eFjuSQFoD>a@*0xEM8-*E7g zI9-%PgcZKr25I-80++dZIETnRZPvCj!gHsI`U6@C0)vWF=}oC$m{`fh-4kbKT!8&I zYqM~kjrUk79zU+m@+|Nzror_c)h>%LnLaik2znE(O{vU|3+MGbhw$C+tLoEfermkcVw@i_Fo03> zrTbqnPA>3`_97mSFfZ**wpy)aK4ErqOTdxuB(*CX2XB>DFdj&>Lr3P3d-ARy#;Gr< zztfn#LUr`D8NFLw29X>PWnYK4__^~>!3qx!BQGqbxJ{;ZsZC!-pFGKP%bG;~A%hp# ztBY}?J-6|eX+KsX)EPk{-hYICM=$(W5bR7m(g%*c0ZiQ0F!H9c3M$I7S>74?Z&Iu- zLMN^=P2w8=N?-_%>myn1{*v(n*g(vm)tHx!RbH&6a0{;(&pk#*@(RA8tuv3OGJF7T zU1)DJ-;H(lx*|elBGsL?4r}$?qDWfz=&4KKl}1Hsgv!JQs$PYHW5LmRaH6nQ96>vc zBdprPE^zq2(cltNBG@ymSi<{QMIioZe*tS+F&!tMP96%I_zOS6D5DdAz-Q z6bDpP%-_^T`><|(J7x@5>fnE#Jpf}`y*Hx+6iES-Z$D+`4 zn>QmRSmy4o49fapC~k_UEH$ zi+Z9_?zxXRl;N!_yaCfNAbnMSf1(dMMYD>0=SpcwXIb10F?(Dq2$%steS-ey@cUp1 zG2s73f=hiP!I}Q=hTs1qo;|-47XA+AG8CAN@!v%fQq=oDki&>pVTjp6$Ydpj$H@Yd zwYy~P2gsTRwNQlh&V_4a^wzB#TJ6;?gj;^Xn=~xy>7;cmY1`Da)W!vTZjF44=gFy@ zJp|X>vIkz5>E9>0H=o-#**9G$n`Qc5mnc84UgIDMZ;c_ZZ+CVfa8Yn zFNUmrziHqn%a~oSBm{>ej81oE3_SxwB9jMIAI~fsHnV9i;%V>>44AES~5XFAS#SHju-v{ib{Wpzq3Am!#dnMqr#dHU#={D1hAPx zDXrZuy8*U(f4RUTj<97u0RT;uYL~tRMNS?v}O9|Ek|X^#h|<1-ZXE3YvjL(j_`d4{zpX?G*b% zXsGG6C<@{7ahD4{VBmqq{o$to%Wrx6?w`Hoo(aKNeMDCU%4@}kFI+42to9G@Qv2j`5- zGnsLIfWPi_>x)!_g)zo~rZKz_VL>jQSE-6t{2gzFt91PEkWA0|HSCnElvr0}Lxrssmm=RYo;GI#>Aduy`HSa?Ka`Uj%SIRqqOj=YBbn zj*2DeT1%|wLP(?<{l^3w`>P@*gh!Rms2H@%viY$@lI}}V|H~mCmGV zu3^mnaYWv2r~)M@weCU#oEwL|Fa3)Ep737;aD52fq+lE>{j-DAiniKED6=w>Weqi$ zgI;Whl;}BzGjEWm2}~swI6gb03#OG|dGn;~1<4;2D~Uz2)Z!5-WGfaT)9Dk+1uJ@C zxm2{SxvNERsZCFOHEjDaX%1N}wy*fB6C z`qL&F^AP218a1`cIypZjStCrF<)b;|ra1jOCs|G4pl>5`I~K%eDNEUg)gnwc->h4# z6scA(iJ^Ky!e=LB_d^MntkUeac~mN`xYjw+wKfp?Q+KGq` zBlj5QB1 ztg=p`Z{V7soT?+NFMrbHL^8Pmog<)<9Y%&6^fx&bP+HiTqpagtdWei6eGj#IU*2|< zP@oeOI4^gg`DmS5sMQ(K+9dXaf8udb63aeD59MbuxNYU+1>(IG zXEM&(}74XQfZ5x>N&kw=k%)cPXAWxi9hh!zoX2_kEaB7 zR`j##EC65b-Y(>ppmAOJiDdEb|5!#HyHl^-zm+)4_br^~|85zTkyQQDg;Iq5%p%>8j8rkPXlOP~wL zVc-tLRovn+T%h`fYmEVG9wBnVak|rD=AmomkCVLr`$;$<@aBL#Ubp5E021F5+QtdT z+3B#MHXkYD&+!GP!P+jZ82{#RoyY4fF(La~{ZRPT>B8>b#x)HU^{b|^aY=n+gYsri zZ%6u8Pq&xCfM&n@Guy*nu%8Og{S@fdyfozRsGb>V2p`WCa?*<*TP9pKGx`P_*-1!Q z|MVclJF@9{<`bS}nys!YFPX@EZ4MIupQiM3YV99AT&#sW>~IamG>a@zOn zT7d375|z~$2OYXXZs%K#kGa6Z+{Rv?q8~F^ z%r)97yufV~*7yZ|^D)DtwdXkGa*>tEJ0~}jek2jtbG=Udnbcv@3f0=K)PJ@uquDcG z@Z}Y`c7KW=XU&>!sip8P&f-sa%rkPVsvV)xPAC*G-h{l8Nk(Yp9bxq80a)92hWsfo zYc2azDj^##_B?vvd|xx66lZJV5x)+2f?ydud+1JX0%FLoD(#uss2i(S$dTo!xJBby z(#??%)OHaRe*A<)PA*mldH1fFTdBVBb|-&a<2PUrrX@~1mLTad`y-!GgY)57rmvZx zi$Iquq_rKsw#FLJ95E)jX3iL=tR^q-e^kgmxBYT6+?vBfGYYcgAWGMw?X~0|^>+ z>O}zErWhKmc1}Tx@snA~GX*oOnxL^lleI_K0oJlefG8E)3*?MR%dQzUB6`UHdC1|E z^g`MWQy&0CR4ufh3Z_A`yDrFMn#scgs;pDo`xkos96F%v4N-_Q0%`{b#a(#<4jH*^ zdr)Vewgt6-(=DZZ!%E&1!k+BNloeZs2LAN#Ao&OR=}P|X6|o;lu>#Z)vQf!c0$sIH zW8uJfJUS{yT7hB62{{j?urBwjSjZH;RCl=NzevZdiuIJiP z;k*ldvgfy-essL3ej}&Vj1w~!BmwROICpXfTk(t}&d3vRcp`S84q>mQROi}O&G}Y^ zXnrfvr-f|XAaNWBwLR6CC@gE;vMAd&M91@DgLDi1R%lZD#)j}We+g%z>Ag!gETGqb zvQe;$-Ot5dpuKw}4wZ#HOeA-2K<4!9avbO=ozz=c&C&BnFZtpFuz{AXsY?l}7rbLb0 zQPio|>#fcg-|2%~pX;aIzb`KVAe>=wq@z`yFb~LBG$83GY2erN&P`~6*pl5ZvEz&! zzqO7_`{WXEX{F_)LW9uld-~)QR7Mg6~D14+JTx=bO<@P?f=Yml&&BeiU0}Jf{ccdb+=t z_Eb{RHzj9lHo;2}xml_U{m{$gK)cLjr#C6p?lMYdyx@RgooCYJIT|wETb>#cc5czuT&_91bS^Dt#AzyZx{wa#K5H!45Fgg2l9SVyrj9s$crYsx z9*|ZSVl`;A%~4HUVlvo3yX;kMv2BtZjglH?JT>dKTow1)Y?N-b&mxaD^b>w{SN4ER zVp$RntRWZWWUN;Fu|@|{!*lQ1Wkn~FGGRkod}Ybo1n+36#;7W#Jw~;9f?QXvW?Ph= zO?;ycuP*4~F~x9l>CEP!F%eeeQa0 zupn=+TYh58*Xyfqfcz(z2EwlOy}4#$8MTIT7}!Ig`Q!><>Kk%Txb^*6Rl<5<|&B`TLAs^mU1y*?)*oCcvIz@{O&|#t~ooAjCFIr5hh{T9V?PdXJd}c=~zjXZ~qrBm_%)mN{XcTR7&Mhm(%j0 ziOJv8Ie|%Anj^W?$0$1t)OgCXCC>H!iY-3158{o> zO)!*y(VobMx(I{|PUEJjV~o$@M=bmsAM7VEp%rIv6VC80I(*SzhfG~f&pl+Qdl6jKxbuRu}hy#9|(wu?3mY3?S^Acg>izyL_(!|p(KvQv5y2O)296i|g7i4B8_jWA+sHSeIofz>!h zMTdAGR(OSj`aV(1G`NM&WFJyaVS_kjfpK9Ny(l5oan=em6ygH0Pq@IUYO2?YDk?f6 zNIq#*jmUEvrOym94lc!dAk+Ms!PuOr5|Dfl|S$Uz%twqVEJEJ;DqjdZ!y4e;JeFM|Rr`@zmZa>&Pb@V>8<5Z<7!%f1J^ zM%z=va`9w0eERsob?LN0<~TaXRoEFPFpP_JkZ8F@9~O9Ho{1o~Y?QdmR9gIIV58HB zZDb`{goi?s+Z4Qkc*jwBH_^q&v)R`Od9_8o>yFtEctoF>OLZGeDvSj!2wA*}S+RO?Y^zIn#YAk-qloAYl#BR`8B`!lOb4(@ z@hb6%`Got@b!m76ar0g`yhx+!_>E=Jed82w~F;)eK?UKco*4r#K~ zC9y7N;;QQmgMnE_^{)Q4uHA(XmzPC@GE-T z!7`C|%Ps{8(7PAsUAcC{TZO^810vk?1;4t8ixOXOo7?U?=^ugm1c>zuM4bNbHek7L z8}Pvl8tK5d^zr$YKH~pxyMm*Gv#XH3sk4KXsicv!sfUrXnXsF=xta4nd_f_3QDp@w z(f?3EH5&gi1p9~CYNB8wTbE0##2d>6Ar&lD3Xz2rGlUrimM-HBGE-<$t7o zg*<0ho)DE0t}oPm(taX-$K98qn9yi1xqiD?nBTC>_+^C({QY|30Lm-G7~;JaQydgV z`=o+yz!HLcDI)8Mm>*6=nh>srx+{rtrg}Ia42Z<+L7_E(y%Urrgt?P@&D%x3*r|M# zA9|r7V0t`^ehc-rI#MFe($UiO?u)19zV=@CZfvkGX}ef1H7c9P^0u3B`mEM-!*B9l zaja5+OPg6pXyDv`93AAU{#% z!q;Q9)301n|J`X^t=&AY;Yt&x#;&U}87wvwVCxOG31m3yx^Zkj&CDCO@P663fDg^d zBuW!|g)16O9J7 zn!y&fSJH8n#rADDPV((`Xcv$9vpKcidVt$=w)%MfQ`9e$Ju~`Dd8<*>F(PH($tK2# zA%QoN^Rd=Nz~K(3?K4Q}4&Nhu@7XC|Y_lsRhko3IDxsJvN8t1xSmEH$^qo6z-pV}r z`o=McAdwxex*nRmm&=;R1$yuGJ%qbw)nMNHJ=}O?t6XvzRY|Tua^biZJWUygPkh<=kEjP0Urx8eC-)-NeCXu>F)8UBL2(qufws z7)&A#Lq3hDG=M96<(7#VhjW>=`k(8FJqa(-+gU3h z-GFY^ZuX0m_+~<$r=1hcnp|%(m;%$~+oU(Ng_q5CV=unYe^Ue{K=LJ93sq`%Ey~RQ0lvtV0WiaK5Yejvayt zPV$QM7gB0p7n&hMezansN`=rea@2@{uoXC-NOFu!A92WFm0X{SYIPd4q$M=j5d%82 z7W66p_q9^K7-Ga&nhx*cSB2d!rDLX?^lPVL$xPj@Pv$LOqL-v~k!w6j3vF>|3A?y< z*&-M``a$ta6nGe`zCcv@Yu_C$GmWC|!1*>bXO?^K>)#T_yT+lK)R_-&e;kMu5d*=iVL#d|SK~;_8zNtl_m~ zA2p6WAq18cI2|55C%s+|Dv-R&wkW?-;=9ixRJ2H0t|2c%$*}>`mZ{YmEram`d`#5E~AjcfJDYS-sm2_Y`?%;7VMQ3 zD5v{QA|-*cR*WKf%T5WawUt-jgwhFP#A?2fifo{ySSp9R1)V4LV71na#|b2)f!7^PhEyUN6;j)h zxSHNZ6GwVNnJO706AW*mITVCmv9&QJ=RV2hb;JQ7+-HY3M&h1|8p}0yyYu0=`{w$k z$Lr2Ofe&^U<3nwT&%b$3AN}UB2=C>+U{^0iH0NN%#e1j#&KT7=Adg z@OsTA%p1W>_YPs|8C^{Cyi)T2Xe2b~H~Dq1h939u!M1(tR+{^GK*w>vtyMmguMld?PGy#F~QFeHA)|=J2*{5D25Jf59{aFG5?ly^oo0)%6?%VYHl7P(5 zzrL`*Cp);^jy>Z}Wr^_kl(%^D7>}(G+Hu?zHk9wTkq)B3$!0}WeifHBEXcrRR4nlr z30A}USZ3^PEUPf`rp4ghNV!iYsnN;DOQQ1`PaVEAYxMbgTEt_(HSdBIij zW)LFTB+$gxm&kW813JPE9&9H?I@2MZ&FF)Pty2wm{e_pdh#HB8$|Ut#;~0Cca`<>| zsUA0lH*X=9s+^!Y+fCwN-@;NyQaW?q;OVX}q>z6T5GZw|*5A-~4<%qqrgG+0Fb)%Q zJoO_YDAk5V2?XB7Dii!*tW$TNzsgz-|k%3 z4K16Y#qS2jcXdv`5(EJ^LzMylfaWv~rjl|x$7-Z%XnRb($X;pSrfAJmScK=9X7#~f zqHYfcgRKj=lhqei!Rl04RRlx|o_f-nb4Uc_@buY?mrV2p``n>4x4ziftb7j%fyFos z*$Qj;n{mmjJG6k4Ys4_Kzd_Sew8!O}X1ym}qy>1n^?ca^{H=|t>W4UBqH7aYIwn=QK*BtIckos# zBy4Bj1IK?xF`$o-?F0G~=W7yRa2plGM(&7a+aa&3Clclx^qM5z$Py4rz4S_*a}i4z zm-EAzWv>Kw8sTM2Rbz{hpQZt(%)H|Ly&NTCu#P2z&m-_hFmBS~v=?x_VZnh<#3w zQxj1Nr{DbD)v8D#D{D`TWrg!y+~ydE=y=O{oAhL3unV1_wt@<9^@vtLi8y8LxDZQA z)hTI;&29O(00%b^PJBsPnW8zzz8NSlsHg{pYE$}Ll(qegq&F6hhL=AFFcWn?BY#Ve z{!24Hl96yCm6f3I^A~6Os~v@ZR^(0&w3^-HT)M?~MO@GZ=H8Y+bdOj$19vxe3n#;B zP3!Z<#4SRYSz>xYwHA5+1-5%j7Mzj4t!w&N#B zvtdJ-3c>;pAD`%41=L?_>4Gnb9}GEj6hmsk@NBT<^kMu*@#-y~LN%)x(k`ZJP zM1qCK+;Zm_lEVniCTTjvkayBlbEI#p4Ahb+1Pp9KrewyCE0b1-L|f93!JG3oMol4M zD@S|e7=%=H^(_f4w_cH6?<_SwGhNDlHRa_aeC&K(bnFrE{vcarQ!Pb23?7BDZR5Ok z3Od0E-*E?goh$cCVD4ob!V41fu5~Kufy`iEZb@F!Cm|m z&$dxv(n_u9edQ?vC$K`b?=xka$WgwirELXo0C43!RWnGnGvu-fLbZ4#8!<@Ncp1V zo){epe4Pf&Ci;lfSuJWSdbMAS7gb!}`eE2pThQ&e3I2$z60jvoED4?aCN#?A z)SthO=><~UQPg2-ArW4y`p_GvA>_zgihs2XzYF4uz6;`9P~6%?Ykr5QmmHz6=Ph75 ziYRTUjpNa*^d+xJ83eog`&8c&h0vcoirLazM@N+r^*%tA=_1>^irxMune`|ag<9Z8 z=vgP1W2f6KjTZZng0QeCja3?E%DMnq0k%oW=&hEjTodgn$E2A8T0IU?g>qFPdzuD$ zk!Z-4>JNtD*k9$oyR_=b#;%`=W8BlD`CQp>B^DtO#b7UuTA8vm;iu7-S7;?qVV8Bl z-}%#Ss9^EfS%j)XS$&svTJkqTguUe4xerADowFPAM$tjCY#n-t21@j*Q@r-U^u+BP zTF0-L{(JDQYi4#xKI3ha$Edeq@)-9-Jt2^CGGY9+rVQ3K$(byvY@jjZ!okjz+SWhi z8hH7zX8M;??a&XNSyTcZ(9N9{6AvEAkXnZ1dbxamKt`G4LG|BaqoW3}s0qykG&)*+D26aJ;sQrkSFq+PY6%Q#8{MO`jsZ2lsLw{EEXK!5(o+R&s>k{@NwnB`nEp z>O`IAwUjaUzCPG|__ne6Ov}B`^agyw?|N-QAHW}a-%)JCm@qOlwl78tb>UOo$)}^; zGCDQfB(B_I|cN&3GGQR~;;%O;3L4yj?_MB7x;H_ZnBeIv}R3o#5a467%b z&C8U_k(r{`msgNy%+2ei`oV3ZT@vDdpe?1aSm~|Bg!0?Dw9!;sUYqUSx+9(`>Ub^V ztyu7--Q03Ir0@FllC7ka3~owRwubXuwMA34=Fn1JFq0jY#*VcL`&_rhS*!&kg_e5? zZZgwLY=$~@*d##Nxz?IJkniWuY$mv+%w_Zqb*rya@f@C0AEMbT4tR-zsYnc~ixR;f znN#(3#3hRLs#)wPT7iQ41yGT{`V?6=mYGEeUw)wv(IoXJN|gfZRY6_m)#1ddE4gIW z%#ATnr7A1oFJ-dAEhynlv09$x%jn5dJ&g_Os;zLL9j2I8c`NODx&k!rPZu|2DwF1y zqO3Ws$Zyh@qXc~qh+-qV+Z#nWP$FWL!E*I|vf0Y8tn=4tTZ`0DT#BnI;0%@J=Blzm ze%}X~s6EIpDf78ITFL9VZ}L%XJ5Mdbkh`Gu^ig_m*%7iNYxT>J~iepGWf z>KCG>?pS>#Zzins*CD?ogV{h zL)WximB5D_1aJW+Zzz%F5plhxO#3)&B`&o)3z1W(;ZE#A?Zz*+wDtAozSC+C2!JA! zzK4tZEIe{b9r4dm9;q7SFKR#og;>GvuGdOSZBrd8I0Ix+Wsp73rLF2Kew;cW8u0kV ziI)oq<9ORxC5MGDSho%D-$5e1%#{d;?h;J7?g5Scuo;rGMQ(G9AMWg0^2AW;yNV$Z zr!yb+JLY;sLO+d$kFM>TofVOs>f?cmR?yvr0_kc-xGWmv6(+ilA>Om5wi=6?qYb$( zXcb`hB_k0FO1PFRhyPNsMbG>FiXGzVg}-Ak^3s_Lxw*}>F6rzuQi18}Ls`CZ^}HH` z^!WwU`Vi6w>-m_#S@#)C=ng7WJNQ-3vpB`F@3Mluw(veJsf*Ebl-=w#2)qb;weyN zQPu-v9@riB9&^j)^j>4izk4M3(;9pQ%8}YxJySnAq zn^u#{IZ2xXPC2;xL(do|{%5C~3GCBeYx9x(v%-JfR9qR|xWU~eU_Y-*K`xGzDBq_s z-fyxBeWX&J>S{6wtO|B~@ccHgy`84tszd(ngGIJfVVkg%3C;rI@1!PMnEb6lhm-eD zoccMoZ@eY+uLiHxF5gi5eeC`DNOa3wdajjE8g^TwIS+G#{U2rnjAsg7{07)z z!nqJk%SRJ|O$Y(vdy<4a>01_P|LML?cEY$SYzSw~g+*Bl9S?qxCTS0A4DPLi$n;>uhGFzuXKl;3P{ z+8}-jIpYlE#pLq^ElFHzD_z!iM4%oP-lArTm{OM30sJi@Q*cx~iLa$hiLumULgY#L z7I*VGxH9>X(WGaSmQ-F>({rYl8vIpB`w)O9kVy)Iz?D?tJy2gk;&ZYqZEo46y!z4i`kiHv(2vZW90KVK~qNq zogz_p%!_#n6l1a>x5Lbpi6X%~*}8Ro!3&_VRVPyv&*f*Fpc;lu;uA^u>Dhuc^hX5A z*#2QsF7C`(Dk=s3AFVRvN{h#9C1ek13H^7L3`ucE_ts2Xy3?iddL(bAGrd1q)R&+X(}}_pkAIr0q7ZANSsGw zDcH%8Mq$Otrp$7|=~%B%o4;tBbl=x46))xO6y~YWkfmiW5Ns*aviH#F z^!b!kCapPmiTy``w|}KB7QMaM8q&7X!;IF?d|Bop8{p4G2>GIO!a@BUmMo8_j^-^- zJgF#xvtN)6++p0LI14p^VeZZ~l~rBofK~kx$4$BOl6EmUV{e&)-6=!F-r>M1V=2Vh zLSbM*m#p5;Rbm%2)#Srmet?-UUxsIyasqKoIKn0bKYB)t)`&g>j38jks0EuFN!D0M z00`}2KVy+*kwLg+1;e4C#;6WWSEb0L9#~0GMg2j0Q}#TH-(PMap}(jA6W=BAGPE+v z*k5n~1y6!%0inHfr#C1cB4Ggow9K*t@XVLQ%+MV3P*Ulsdj@2W4zF==bprurr@{Kr zSHyP>C6sA8b;>4hMbl-$;)E%4$4pR!;5QbsRViDlE7$;OIk)6k5_x+37njfHs|F@E z_H8aVMXnWpb_}gQpua*Yxff71qq^I--u&xUB>B+CDw=TsjTV(9m* zC~4Rut}eFR<1kp2h*MjY$e+Q7xCM9Xycgl~dDhxRm_BGzrHl>>>on83D<)Srbq$;q zSu<1@Y;ysttgN@2ltsBEYdmP{dN)swLPC?1SlKN~h1jN#UgVdpP3^)8muKBmsG`j& z*_nA78`3Eor_s?le7NgCZ>4b9!Mz~5I&90YfH4@H%jN{qTA+9gb7X?ji=ipBltWA4 zOWC4Rr+hq@960fs%vr6(q=wyD9}V~r1vA_V!7gcb5w~$&JJ_SjD?GSnP?&5M8 zK-*VdDuQR-QU6k~KU8-7`i&^EB*Ix8M5Qd?+!u8`6vY0s$ek6qtRDjlY`2JbHHu=+ z605eaPGi44GXzUFbWsjn#_|jtab;fsxYkJd(0^9(@Q7$7Bl#7c++QSeM;}^5qm`7N zx`6SipIq#gjtgR&M3SAq8~=P)yw*OJe@9VcCS~^tx)wq#pW$fc6k&hMf$1F|Pi(mt z7A>qs8reQCF1zO~2>cekV4Wslmh1-gp6R2mpM&(Z&YU>b7H#+v_!ChR2yq53U9fcl zx_%huwKfBIB!N6fH?@Xghn>X`CgT`P(*~TEo5c`kEd*H+c9)KJ_m3SAb@>WZ@UkI> z^7^ZkzdiDK(6Vk1AX)cVSDi@=d&V#$MS>Gl%V>+)Cnbp23#>u;tvw%ZRq_>mAmCr33qty%Ny&IjrI#)ve)TOjwM+3Pd zS9K+#UTaPvE9|RJY7YC*D6OvpvY|2oGT4O)G%V-}oYRkrb42fFYJp)>8&J(?G03FY zF>PNLaZ)Y&B+O5eb6>EgL#1?h%6xPJ0K`2f*shel2xA^9t1XnV^NTZXaJrPv?@*y% z@9O%E!B_?QgGCAEqw>3>BQ-thn)t(9WNY=s`405eX@8;|!^SwfKlnqBUaS_3S+T-c z`|R=dN}xC7tpvd8%NGpz+z{{^VwqFYV(e>UAlq(_}T}KrZ0Bzu)>cbNxW3 z@$8R!82ilZ{je~!ul&}EP1w6438^giWE880y2KG$6so)M=V>X5#X+sI0$sWI6He$m zgrZ48Msa;os?dQAOrW9kOMNHp#;Y)Z&jDTY8{GW{4z`+c`r}ZocH6F?Yt@bLRg9D| zP%TlAXWq!g^dMDqk`$^c@tR4{En|XqDCMP&-D@bd-RUI^wf6i5EZLeNO;L`mb0!NIszWNHuOb^xR^D-JZvb$c#c>FuiSVkujkb87PCax0a&Y zERZ^O31wP1soTz#FDvVyIV&9LaX4DAq}V z9fbBM<(SZmS|f(kHarjoe$v3xO?U!Yi--4gT}G$)dqA7Ek7#ZBiAY9k{3TE)I@6c7 zGFl4M#GA%Mnpf>VFE#DOup3(r@{2ey*S%S6qn$^Q%|hwNQ(CFoxC^VB#n#ND8wnZZ zxTPtlicp!3t)Ye1dWdYx+OZ25Y|Kw4C z(A)`?`e zctX!}zigkUm&9q`Z1laxCr@$zE2mqM3r+-?pjwb>K7@k&tOqk8#1l-g?ra0BWKIL* zN2eZVYh>?RUr%U6kO;)XkX>Yl6} z^Whc$7xLdvJeuFKVTnL|=;8Z`XA21ki0}VXHfUJcvoQagef>Y*dP-9NI;g0j_08yQ zbl3R&z(#{GweK6O4MvBESmoO4SZ+yXZqowm-7WH=kL&K?*zv*7+UY&;Knh^Xv@8^$ zf;J2hLq$PFMMW|B#WeidTYj?nLZ$b|`fR!Q#GfzEXS(|&`}tU4X9wu#=WPR_`~XW0 zQ9reSt4QjgEbS(IBca%I9IO{gnG_Y-bbLB_K_XTBtmG-kq!&qEb{5f;h1D>TQDVI$ zn$%Or;=lt69Ul z!GdcI=havO39oI1n9Y@ps|6JTRqN^MQRckp>+nf!P1b@;J&C_QrM7z9d z<{A=ij~yQ&Fg#RM!8tHwrs_hKIoat`03{rgw@A(*;B#;@pg=Y0-gUGra*d&#ZloO4UlT+BYYDVu?YUT}wZ$nd+nh3wr z+T=r%tv;q-xrIE%PjXRKYJp1Ag|{yhf35}j?WSeQrQjgIRBP{|6N4cq!6oB?h!0K+0%`z_6Nx)(?9vn;hi8k!a<=g4(1*wLtvIX{)*Mfa>3wW)@ z+h$N&YFuQv-p;!?xL|@0`vSv30iK-I9pG-Nn|>v{uGx^Qb;W?cY=#;IQr!r-w44iI zJWB6YDSj|Es}_!ou^j82#896=U2U-Lq|xc12oF%rMCkeSi&L4rdU`AUI?x|@AD6HQ zm%xa2^uQZG^qz?#ynT$~>x^j%FbXh{w}R|^%6&ZgaQ_!)?-(R&)OKl>ZQHhO+qP}n zwtdRBZQFIqwr!lL_nVpM?wRQ6j>#Vx8Tl_GBlfdn-S@h#JJ2lPAm|@yjj7&)H%9~u zZ^&J}!8Ye9-tIPh_=krbz^iwUTfQsSN4!kJe!;7{B1o{;q3if`rzuAt^gaj{QkM=B z1?Jyiw1cs*=K|xfWZ8uU97pz6^-lFdk8bIis}qLVf2|`~(8jWc)CD#xUEr-$=wBDp zH=6iALccy3ywTeT$f7k7!)e?#rwX8U6?}{#GCk-uEy%9|zB@#lQR|MYI+u4bUjv|Q z6Iugp(z~&b{-L#Es}35q&M#%(Jw%&Dhh^OMQYIBp|6sZry&TeA&;O)8&3tfbSLXN<649Z4R=^Bs)fEZP3n{+ z5~%ppn8yd5(@|IYfe)%fzbeZuJoLjWfI87#1<`*!gq^t8Ep%+ZABzg2TZH@2e2r1R z=fck1@RmC>WmTX0usSihDVgkAU+D$SQNM4qp0??pBD+TGDe#?z=&n#q@fX?EgXmL0 zbLPN`9tb_QL_Mc)DU9QA!;#}2-0bK#IsorPJ9|NQQSs*5Akh~d$vK`SJ)+v=g(JL2 z@7VQ&_$pf8WAk0RR?B0RY(ke>_e8TNXw_2XecfxJ z-nAy$wKikd`jYc`)7|aq8K1E1qd%*=!~0M3rsH&rd+z&nfgHd9b(3PilHVrO5EAb` z7&`2`e{Vr@%{wM6kNANjkvzgDcN{&!CviMI!Y6ZFJ%UH_h!Qf_&9?pe!VHT?_(+pz z4$(7rTs^W|;K*8}SMCT~q*wAtTclU^h`V^gJ<=zB{Pp{esGDQ}{%jNeyB@($qz7O5 zmfY`+vRh^-5AmHdQ6J%*6!QVf_Zu})f9Z~0#P2d(eV_H>JFeefzK4H)3%}x(E0G`Z zojI{@KB*7s9h=rO*vr3chyUwN{%w_n zcB^ZPEGtW`b@j&9WWT=tN^?bnn*PxWILwx;s*l5pW0McUNy~4AB z)Jp1FeL3#x-{CG5uw?9_tc{eL%^I?elx@bG%tefNiUv1Q#FB;#m$DZT#ZA=Mdl7kx zR(pGS8kU5(XDY4o9`>zOeEH%F71}~Kk(N~I3)C9w(y*4Bx3rHmSc}xfl~je~@mZ{S z<;3l$lA%-eoSmXm}?%`pPdL2nr*flf=c9xJKd*dxP@XI@2U-Sd6)-K#D-v2{@g6L^iPQPW7I~6Rtj<7`Y-ncY z2=Ldw-1gYz&xSy;Zud+AQu{LRnkvBi47|rm4yqzXh51IkB`WyJV29@^!#->FN4{XD zauCo@s1Pg_tQ$p?DI=H`a#Pf!_*kjfIZ%?(SuthEh*V@hYCBcYNn_|SfE_VDA*6o^ zqgu-f88PXCqA_Xk>spzzhrgI~Al9Z#8)3Q#DTittvSHeWaGACwkLa-QNS)YWZv(we z+u?7@T*okSxTVMr%u;FT)WZ1MlN92SFC2w<#mdJZo;eEiXoP`klL%!^@M-Z#oG@YG z`vo(P8+sZ-WaGG$FgVgAb9y^U9A$P$m?Ca=4&0ee@A7?m((PnbcrBfYwZ)O^i?WS>a~V z9#NaJft}EpnoVElikPtBO@yrmq6dfLfH{dnY%-rGbUyj=wbEBTaXNQlA5u}Nw^lca z$2zaU?C_#%(Z_Y`p3E=L^593qpeIAmm4;$LlGp4D>#yKJSyYKlVjW9Hq*CNDij9*h zgLtN!mp+VOVH#14=P{gAQ`F!MbjX;yE_ZyCd_H1TrRbAY*D6M74SQqqKFd=Q!lHLae z{v`YAH*y!AiFJ5tw^!7(nxgYEar&2P{N`y`(c7526c$GZYCbRdBv+~<_1(`EM~wR2 zUD$PvPdH9RrG^>d@y9i9Np^$jPLQPj05;m9n`9f;g|_In;TG-@t;)^Zp4z`*nqUHO z`W{6LF?*|$!_DGSf-_JT=bc=!pAFzr2l@_h*Y6)%xyR&zPVsx=!X_%mdhQe$soP%5 z6On=OO6a5{hN67l+gJLE53EWC>A+_L@#Gv&B_s3`j@U&wXhR>IPwA0h7CMs_bhu~m zK+6NUWsqQF!ws8ophahw)whqJ{xt#w$I2}ZDXk=}^#l^ns zS<``2Ujs(d0F3{GOQ3fMVnB+A6Xn7WIExcDn2-9PT>5Ch=l7k#gu(B^GzB;LI`BCH zNr`?TH9)Bxo<9!toiC|9!9n5?$dclGS(clU%?&eBl;SF^*kLGiS7_z>eq0k?4;_ulS;@_r!<=RhW=BVKO))8)?CSJeB4bs$*7-j$`_Yr1bCtg3y4`PZ- zMtX9%0O)~~>IoJ6Xqf>uCqT&)P5R0S(f^1Lgx(%R`@1b#V8EGMg=Qzf3Fa75r5^`~ zz7JZ96I=w!Siv5_8~I8%RL3<5$TB-8`<~B08dC*XgA?XSruy9YOq5oW zF2hI7qCyp7T`%5Oiq8aR3J^{BjjAxRLU_uo=$>hbt|wMI1hz_4%SD8gu5Zpg7I%$m zvT0neTEvh=d%)^GfOY_91Pf<|>a`uCzCd1wNhuh_qvsrWs7rdM7AZAb2ko3OhAHL+ zTMXqOnv!-21&R$Brx)R@RRYm5Sw~QV;A0y>Q6~jj4tFfk4~O{i0@ROW>w2ouT;nuP ziw$aOoNc+0yFj#p+bzBvA+tr-(9AXwVzouewilvhQiukrwCv)uTCXL>D50aXqkF}q z!vTYt9Z5?VE&GA}at`}8&iNJte<4+S$*289Y?rJL7w8lBVrrb>(>B^rf%n0w)7{ID z#oa=p-fCrgPw|gk_#x08(EXG|EgpmE&>bAL#w19Zb-?ihv=dzX zpF^_iEwXC{x4T&_Q&1d-WjXNfsf8`qmy;X(p{=60fXiz@dR*W;yP+ei{XQSw_Idvm zHaZ@I!728;2iWM_z-Z7N(t{qRLz3k!n8hT+wc;`87akzZKE|UZE;r7%byS8wx|T@{ zLkSGQeauhU!O$7_qP|G_1D)kHL?*z2*G0D89%I7Uu;(=Z@umt`Ppq%!FW5huwI^BbQJe) zzVl<7umeEf!Xpv-S@ltXA8X-YD1|4aXQ50HgP!&1X~Ohq+ZcaYP!CDsp3CvG?m1h4 zlPp}I)Jq-B0CtBy_n?Yb_l&6yGpyEN;0Gjo?aSJm=k~ZWHVB6Se1OZyr_!Rnt z*=UAUzd~DpKxu0TDJmqYP=_Cg6Gb4o(oKGip}+T)u*s&UC)f?=N?vfz?;`kl z^>gm#9`{D_Fa(ro&JJd7=GUfO@6*|<-G4vt=mC&#j5LI+v8FsR`$WBFO^dPc^;pDB zXho6sYe(xoQzwYoV_dl+Wd1*=EOj4o;=SgNDKqdqFEKNZXa4)~W3srHTu@w5K)e+r z%Su#jFEqT&ZLQr88UzhzUdP4XOJ?hGcB@ykOOhvTOsSQZpwf*8UfkzKqm&)+Xli7j zTxB$4P^F-Bqv-52w#?@mc1~{O2~90Zl3vNgo`ANqv{GJ6g~#JMHH~yVtj^n|iA~XV z1I>@6=J(DV<)GMU@_SqY{o@>QPbW4@ucWcN9F3j(3PA$y1Fk^HJ96zitxTYW_cmc8 z7iJA-l6gBMjX;S(nk9N-1_Zgbmzf25P>n`j+D8hm6RbwssDaeftmO4nO!n_+p)d1K z(@`+R?1vn724HEI^NW0^;wq;V;NRjahaC}?%^SvBkS@l10_~TMc;?A2%fHE6w*I4R;e%7paR-ySP z6I|R{GZW~6Uf`x%Yi>0M2(}scFr*+x*rm$NL#gTy+7;+20%OgWO6XY0mYXzlT7Zz} z6pE_y!_2qI4arnn`<|Li)^7b7SDywSFQlB)V!T#aJzI8ewI|?qC4y&JRBQVKh0O|{ zu60_bV@Ji1Urrd^H+;Y1Y(6)erQ~qi$Ec_6EcLybxSC46jf2B2e+b8zDZOwOg+W?e zQ($Zi)_M5o8CKx*d2@oeE-HYcI;=OKrYn8Ze^poV zWECY>gM?u#l5FP&H)Nm_D# zIk7)@YVIm!$avzhe`uww*8N;R@A37lC zh5tx*R6f@J6!`Ijjr)nnTUwmuzo;0wxS$`Pa$T)PbQdSW!6e1rS4$igx5pED^(yH9 zG7$xy`3A~{jZRh)Izs3Qfyj}93yGN+?y$6|8KN^h@&kk;?iRuBKvK6M0^8I3%d<+7 zNa)3G5jvwca)E)R6q1%N zRsQ2sV4nT;DVQVJ`(dFwVZ5=XLL?=<^$?aPiw{>K884d)Gh*ch&pXpRE$b0(Tzr;K zs6+dL{;AS7lpC!$?x-E6<9f~iw{h^Vd7_W{sjudN`i}Jb_AR5>49a~IxXaHPkk6mp zAuG!}obt*}Rl|e*j@rr$f?@;ExJF)tVZda!W#xCUIX?Q)ki(@5f#|Ej4eOT78mrzdGv|Y3KQjX9(uVrPO&O`k6^1i@$=7ZE zeG4(CLgr@4RMEY+a5=H^k)tmh+MnP<>3RWs5I2gss9cjr;hKm~%@Ly0DLr!joBzKJ zS^jf&?)-~J82@ELuHgUx(EWeKV*ih`^Z$y&)V)1$R8jepePtRm6N+WEl5CO{gtqM@ z($ns2Adl8<8fBNdHx%+^*qhGDx|$sE3m{vYEks4}sCp^*6a`BJw70>i%HP0tgX~Ap zd#Q*D^YZ?^dCvanN?xCk$$nyxAlI#v2_Ll69AN~|=-)(q5%Y^!HOc@3y;S)FrCgBq~ z7$V^lYR4zNCy0#q+&jF3M8qp>2w-HeM6Nh$qKU@Kqw%|mz!fo=NGJ`)qtvTC(F+*bTFe! z3oYCftF*lMM&i7rI zkmbyiqQWk+Fcn_PGHG?BEZGqMSPVbQlwf~j0DPLb5{;VI;%49M#7mb>GS2+b^R53? z4ZDdfNfc8s5eh`pYs_nyM>eL!X1N>ExHA?erCYhcVV?mn2K zk5gcd`o>Q+XasQ??%Z1tveSq=d{2cfIeB;1V&yhl5&Z1w~`LOE#Db1u-T_{&QR8m-(P@1BTlY z0cKBrgY!`jx=oC{9fB9}&t*rxX#fqIw{CM!aG z>0qEDYp5v#>y&Js!$)xvT&0D3>YRc{>+K&U2G&LwoiOS6=_e0|ITM!H6*a7BZ6(ZU zn#w(*QBM#341KqnS%8NWur_dTvCi<9dDHCkQ!Ak|``3=;>-%RB+QQW#4`mVQHS2i8 zjX3HfWk({U0cyByfzeC6J0+Vq2Qmjdk>Yli^>+b74TXJjQz2Y1w z(fQ!Mptq^WnlpO~PEgUY25k^+MX!3$wNS9p0(9?K3#76FA$)+#XJH6R1$%6my)(C~ z^n@gUV2VE}TJ5QN4vf^fOM4jP!n0$p!ggRzMFSDy><0_69@ViBXOj$*Ifz&lckJ{5 zRqr6}=mO1mmPnI^_{?om*>%}f24Z)xK*S7_itP2fzgtqgMnt?b3M95UMSCSkuB>hB zhSJ6(KQt)x0+E{hhV%3%AKdqSD1BFh|L#$A;%DsI2e9Uyr$I7!*!N=BwoJzAm!}z= z?fQAwwyNpVAr+W_cZ>ifq{*CxY}?10De)HTv;&y>IF(LdwasHv9G6iwd?bW^KCVL< z%-a&1kiV%Xn-mPg{DK2>%9DqL>XMzU0Huzw(DI!iJAzw}gwT$fd+MEiN06R`K|5+~ zW2SZ4i|TZO{5~}oKotlE8{ml2u(j*@;M5(<`WT^AxxZItX;h34CkHG4fIX>t&;j0v z#I_x7?0{15+m(lUXSS%ZovhS&GNNo?VAI!nM>yUeV6`+n?Th+vCr*J-0WFv>utG_Z_6g66h?3>ET5 zXeoF8^=hSwkkG=Dtr?ZNHdNUxsB&e<1E|!Pt-L0;Ue zg|QDhY~XucYs|^+N~^7nmG!!l=(>Fi>@@#^4qd z&DBFZpfPOs94uv3-=vlo-u9q<+>V~o@rL@F@y=&l-+=UJh8>)>SkQXsNsY0L z*!!R+F^8F;b|%5?QjGf+%~Q7ku@VlEh?+tqP7B1A!G7d9ZA_1GP#G4CW~^g*9I|Kr zWPG-$1TpZ}n--!s!yTsOxEQYhtwAQ z_{G?IW)#Y<2J>dcbdZ$M3g_LlF3r=u0Q0`3yRi&3f>jWEn2h;=KRq%dgfq^A^%%+M)lEUYb#t5}jVACl4q*FXOrWLsy@k(YNMp*C7 z2pzUSmW(uxoZy6e9CM@L_evyzyVLrLq*{&#ki8=@X$%0UR|cfkx9cNnQgFM_tlhBZ z25u5)_rR?CrRTsj7D7$0V!NMgSa`6T>KA;D>gwAivi0mn?#MU>&w0Z%SX@xFcH)HejRW z^y1P<`*S0%&KBCRJXefqb)t9w8kX1z#?_o1q4~5eHZg_F33x%A_-Ka553mnu2U1;b zVqE<3C@FcNTL$c2=E{fr$9}l68+iNJmj9Q`rVnD#AMk&?6GLHIWIp`n2~fY|V!r?N zomj%&*+s$L($3}oWV48BsQeFHmXcIouht3{~O?!!UZQgx1|I!VkdLQ>s8O|*UN9W z%=vM3*Z&K0kL!!$`+V1I$e}Cw(iVBMAuL=gxc4p?ZjhWrKrW;ewlY^n=-bTzJn)2Va zY*FeKR1MN?xnt=LrxC|*&7!MzZg`xzJa?H*_N|IBW;sE2$F8eKuMP_L>@xBF zssRCMO}0a_+MTDEEPkhZOmm@HAV#2LFRn>~TRWv*poNj=I8|!TEv&0|XURrd1WNPN zCdVKj$V;-k&QIgpX}{%4IMi?*;xtV(3@r$oT^el9C1%U`$IhyB*hO~B&A7VHQsbpX zKFMvl^Ok{S9Rp1q6r~c6uogOoTnxYT?^hI9eq&72p_eAFfwC1KcDUdp4o_)rRIWM+ zqm06bpB>tpbxnWV-OYQSqMWRv4%*<~fMKyF0GUKz>uEcG54={4DwrLakyGvLxdO@!XE+RnG7_ zser?MPGc2#%6#XE`~KqvM-rpa%EIEsrfJ<}?_I7#>INq_4QbTP)gf`sSZl}-QO^Xtpvj-Ls<4ivq5&5_HmHL+QYE0s`k%DgO$fVR(pidC5{pF1zPFDY?TTht-gXozj@nyD@r%&)_b) zl7Z8`Q+F)vz3VnW{(*=OD@XbRq^7UlZL|8cso*94HT_5+s!?n#T$D;&p`%SJI3WI& zHY#lF%@jGbhGX}U01GN5^{s%kJVt1w8Z}?oP>AgtLGp?V%O8^##`cbI>61Q{r1aM? zkf~RkcElY~H{S|ML4Uhr9#F#Ii_ z-^PEVbWN^78O25g`vfjCfmtGS2to=(=AP~E)s@;FRbH!={^vpa=b&A9g3!dt!pL6W zcIDwfib7o$@6s!jIQH!JV!5&f7*D*EOfJ!rY6SL5>46=o*Pha@J+l2`zj@`=evIh;O|}@RW1C1&Q|`xD1lEqAq1#>o@i0_+bMUuCpr7= z!HJpO&diK=dxz+Vx9_E0M`gNycYOA%voke&o8u#(9pCs&IL7PH*4FHdcu+eqzUn=r zpSw8%Y*$A9o0#{9{kqVtELrnv zJL1&Y7}w$^HG3{YEip1HxRS^Vt|%dVoM{ZrMs+UK>8LVUY4SQ0?;3JmQ0dlV8R|r) z59D=__uCa_uStSwv?Uqs&QytPkiP^m@FFg!hQ;LRGE9a+5W~!2c8JfkB}oiL8gdY+ z(-s8T?aLDIly{+N3tR6^zQ#pIeYFf}K?rg#j^lBrw8W_A1@50PY^3%-zFtgYP0Rd9 zO-vo_sZ$timHy3R90rj3Day9`T#RcXkuzGdhFUn@F3t>;eL9Q$i+%w{49~?eQ=T1^ z74U6jG(?55orNU|Ab5l|u%hN^WmJgYi?O2#xzb2;%)-n=n%EaPnFaLL37gJB3$tf1 zh%X^#25icWnH;9PCFIGLc*Dm87W4-hd?Lu2s7+6A5^a1`FC>zcL62rEywZPs)eu+3 zpFIY#l;?3SzVz!QY*AG<03mWk{E8T}7!QX16$XI3H%VNbIhfvaC{#wb*&61TaSglB z@TVDieyU@8&q@YRbuglScE9D#xDBKvDau4~O$QLXv-HQer|B)Y)w6D3bxhIhIf1gV4!M@y}cSQOeJz*X46phpe_$3HQ6MTHD;4OG`P$wew&G1!y1Chlp!TA z=pZcAX&7v-YE+=-N_lm813YYX)Fo+~F*aQ3kxfQm#zxJQ1FDxP=M3sjY2`^N8IRX$ zL=^?ND*o!Y?E0|rhuK(J4T3|zC|OwDc8wuHo!WgUor--bJlul?L7ketWlA`RB8m2i z@G#s6=0VmN2Ugl1u^@t0+QtmbG6(8&d46yw6)LvLtzp>7}4 z?k5l(m4+s;$l#vk@`9A(h+T}qv{>t5EJrCEWMgBc%WdQp<36!sT!B%TUW zs*OhNM}cMX4E0GTx98$b5%LjPIzlDohof{f9m(i{h{cx~{k=3HydD**%j(4Xm;4iL zO@Pt@3EuiTti`s#>1C(RW-g`_X~WaFJ*~7rI>jj(fA(lN6qR-4E;z2b+~Qd9I#5KIo1a98B`zr zJ22$a_umjgmowMH+C}tBeLyNAX7DUjlunuynA|I;UKAE~!8$B*sd zf zxj?U|9<_@Cx4*3^;-!*r@!}m>sNj2^ZkQ*?+gAkO~o*#W*xo2EIk>gpnRF!*b3e zEeK|lA)wmsajtWoCH=a%E;*%(2rZ@zh0FyZJbObWsSZ1r%^Y`ObS6yKTFE@%qTw)} zx=EcjL7UsZMR`<9DOtN2oWsjmB9zAt`rR^y+R3Y2(mt0L^z(6eFuTMS!^_lAM`)A! zG3o$(>?+=FiNnf0*m8VWzKy82hd&mCOXm-5aS61VxO+*t$!@@BC&Fuo^s^e_9vk;h zObZ7aq)#j>(r%zOv9VQH($b1S;w+FxH>6rg~^KwVV%k%d&M(zTh?q7 zr%4SFS%KK3#t&LMT=HZPRLd&dF^0*%uE|MN1yVD(A3Mpzx>y5BRIk{B;^Dit#r~3k zxH#vzNt9@rCd>73Mj>^x0M+1KM(oPKkw-p^_n#mO z%yRS^Hs#Fo>;AA&Z+xfE^jMW>&EfEA!QZLd6Ug!*rbj)A_^yN#PKiyN;>UAzaXoWn zt>ux3!jqKu3rGjY`w$*MrPpF>-4)4SK$g1Oh~ZmIh<#~>@5?d^42{(j!JEp!X!Ftp zu^26Ka!O)yv#t@UOcL}8ucUmJf;G-ER^&xit<8dqX0w#<;Ioa^PQMluDZzv1zq}Z{ ziDeAmbB@GIe>^LHy%=~Sl+Bc5j+NoXlvaTvYssTXiQ!ghE>;f;$3T~;dKxRBNoiw+ z&_0R_6{rUS8Z>C$5gFkJ6wkG9)_>ltO}}Iq;Wr5lt+(n$7NA`%2f}8H{&JLqpR<@1 z<T9|aMYfa3N)u$FA4kqBw{Y2@`=ik9&oHwR@U ziMLmh#G~f&sChkb98DOPkjF3adg2VPAQi;+8n5RtXU2~@io~G|RJ)OS#D(lH$W;uf z&)?61Z4uOIrn*^KwB_o-xRpXzF9KGfl+`dLmMC4Rc{FibW4VRnxYZTA-6-G>UI5~!X0kQ_ZXB9N1@8XfCiIclyFufk&2fbRxSHb+ zQ5x=Y%yNdA?mI2e!+(nQ5#bia`YW>nb zt21XCvnAHO&JeccBd5iY3$0JF@68+n{h|eYsdvaeE+uXS%#HD}&ir{xzO@$rvL~)s zUGza*_x+EzZ&Z}e!ua136)F7xR+jO6Fm(4v}jh1LcT zEGnH%{k7ASvb09@88GD54V#@^&Rk!FqAK@c{I3_5am;F?{~PcZ@elNK4);*w z_N>;1UE^tP$7}8>-)U}oX5Y{Ip*#Tnp&w5Ay%=xpo)r$QNAigF^ICY@A<0hU(jY6^ zZR5O#j(MUngeTPpk!k ztrLY_poU?KFiq->>6oG}mtqXmh@)oDMJAw{$OVNdnD62?(3wo)V9#tB;!;I~vkVHY zT*dh^*i{1jF;;Qvv)r2}?X+vlTtn^V7STew(&j}It7?lZAIf2>i;I(L0sBH{<{$gH zOTCR{=+0wUYtDE#=$thOlHFwP78d#YC=#x7wU=5K$58Vc)3=+X%k$7>j2hZAn0^W9 zEX^a3%-rm!9HUukuFiPeZ2Tp3UQe(Q0p0r8OgE^4%NBCb19lQ(fAg^?9k0aN8?2vrtGLWG|w{duqVwL3$GaVPRed+)hH+C3|i_3(ugvAcCBsvRxS+}-Yx~9 z^2?b_!PWeJrHN&EEKljfdgw1L*e&+kZGl?5t2P$Lt&{RJDi_H<(#B!&sXC~36 z0b$ z=?lHuSAxAIgjMsrw4k%qS?50MVV)FuQS9(M3d0hHe_0Y2ga*ki`o|~7 z`axnz)B}4>^18IdP*`5zXx&(Ki8w60oDq-cDZtEnMu2&$x^EPHcL&6K``~^E00*cf zou6Ef!Hj93CxBZ31Utc|h-_)=8)HGbM>{-H2x221(v}8*U5){Vj9@K3Ppe*`FdkKq z4$&DmI%=|+cw*sP-O;KE8Q2$Fa}XDTA2_%veHTmmCN{xC)RKOdU%nidgqFO)xM)=} z%7TJJ?#nF?@lomh5$(hX8i${TE~t{!mkRMKcWtMhDF3k%Ae(H#&~O7!TL_O(-PoaT ziUn&8g8FiCARn_hYUw;8UZxX%?-=}PV*2dt?-k#n_cfUR7Zc5gHG81LVX#e)8jx29 zyCy#*z#8_P3e%^7?T`>wUHGvx&Utfdt(Z$p% zMF~2mRKib)o|;NB(L!tdN#(SwPU_APl9R``qO;oo^&RfoadWD~dc&<=@UNZj#?L4= z)bUnJY>DbAud>iREI-}`yRg-f5ki~F0-I6Dz82)~R1n%@;KUoqsBnxsZ!qKWIjIcD zDDE#Z*Jkj>^y(Y80i20Em*{BXQ8JP%boH1c7QMv$i>@;$xcuLL*KqpJDn}vYh=={} z3fwK>|5niQ|32#fTg3@`1l7-2Q%hS%p!fZCM?9}4n&L`P0+ zcPr`?wYqqOthUrr3L1qtL`YEyx;kZZ0?NKn0WEKS^HZVwxvrG_+4dsv$Ig{SPm=rL z@W}2dds7qhzt7!n_S>0@Om%!;Ab?o|YSQ*8Sig4dAn&ccfUfQSy&a(|-w?c8;(JA; z*JO`?;V}uHoZ(;+JR(PtprW{$w!X81aQOs}43Vs1ViGe+pQPdc+Ss66eCCKGm+;wu z%?q59x+CfN%)!3cdtCkmdhR_7E8Da5`a+5{m+;9PR*$%7dU~lM=@pCDC%=bf_d(7r z+G&IM+FbsGi@Z&G!;AIJ8-};ofv!`VPDCNnRy zFK>p~+Sl8f;{&^kOFLM*XY-vc;$s|vYkQq}N{d93WMis$b9KE^c%$Z_MZRm5C0EwE zI3EJcK97m1fR+4eLt#tF+^g>SOx;n$(_F>|rCbCe#m_WhPRPfI$A5jvG<+w~dY$Gp z7n|8pauiwi21E>;sL|x!%M%(tUJQk{8oLD+#EPu>v7?<_ZZ=}fDT#^gS^dw|$%2L) zrKG6KQKRZwi^dKQaVcprGL^uIA|TJNRF0-fvX%E}veBfeCclD04O;!~xiXC4UIQvD z(m{xQs4-R2$mOmpHbcc$6;B)Y<F#y=93 z$-M-#Kw zT6vxi{UV!uTimjd7jCW?^qWPK8rCF|hGlgE;@0g;FlpXcwmQVFuOHyTzT67XvZ7ju zwlRXDW`ZgUqdp%LvpZ*yG?>99&m2p%R6dRtU=8hcLynmv#*DMduL<2dIs5TIu zK)8VG%o*am(Hd+T(1wRF$daX4u!`g~T(&+Kp(%?nSVszqk#f%zOFjPfBMt23h=TT8 z5pO{aPNpEmk(6Pwcys;3r>RDPiE;tvkSFO={S#GXc*H+wkV)xxI+`e?xYkW}l<9Bg zy5ciP)V7*Azo3qboih-c+kaW>Z`Y=qC8721VFQ%1=<&AzooII+T82Y3i*w|+q2$ZK z%ImMP(9k4D@cWIu3Knt`a(HqMZ~vy86*L2~n3#tUITXjD3y!DmReUZtWmaoQQ6Zbr zL2(YQYN>HWF-YH-ANwtHd7H3C&745~pn{2vG6gPk#JcQmV}ydmj*U8!TY01g6<%rM z9^Ad2cS!43N+`qX0-a$;Gi3IU2?^DZ+t~;$uVF9K7oc8}A-2o-9n+U$7$8RSzE!(e znDssvW^LIH>@qh5`{ZwTsIZNlnZq`hN@S{5StlC?synhD4tZ?`#4V%W%M>HD7zWXc zTd;?s*yIiQOEau5p|@{vm*lMr=3jt6(^~TyGvN^R9sLIG@|XP^{PPd>KowJWm?*m0 zo)jh>F(a_LBD^R-TM(np@I!{M+50r5Fu9AwG%0f=>iE1UGE}4y`?VH)BtdM4W4H$5 z4MMVJ!?e_1{jij&T9~pXr#4Yji9;j|`oKsA*%c7V%(^T(b^1=CCTLa4I#ZDTY^8}B zY?q0eaA8_aKa+j%P`+It1rJ#GG^3MzWioAMcHVXmq_gDuor8xCto+;QO{jH^Ik*iy zY5636_8`&zpwGaPaHiM=rQ;`L4wDZj?0af8W3GOJ$Z-xU7Zon_k#6Z~8>g*F6m7hb zp;UZ%oSZy?z!@k9U2V|{i%FADiL4a#9{zgsfkq~N%NR4(Cr!a@Fj4T+-a@Vx+ue{6sR*~`g zK}sn`JAOLGgJS5E6FS)UGLaAN`L%`JR;0TkC9Z7?D*hG}@TK$w;53}+m9f{+DV?Ca zuV`i$b+9f0`b|8sxZZ1W#?{qLUZSxR& zM09W)X1@)@YEVxaMS7-Ks!I_88+Rm|#Mk(UcnKgUL_fpt3vC+;NktiLH2%p-O0fGH z#WvldOLUWXgTS6$h|ko2JoxdRGC=-)O={Ag?8x_`(m;k2?hfrOc%%%*I&#T z;r0h-k@*+hv-^wg0kuhI@aAoOs_oAX3(};R*8Qip^a0f1$Nq!9FM;t-94X(3Im)gc z#DzZr*kfcc;BZak3Ipw!$!BaZz`H)P-k9Q)soTl0AJ3+c!4g&@2b)8k7N*<~IhfMA zKS`(m6$hU{PZ`93IgE59F&n_zykI#S+OvmpWBQk`!8qk1F-5a^>?jfOW{u=RdYkmX zLNgJ{XJJH*Nf@C{8m!anR~n(SO+)iX{C6JTAqef{^|qF&#|Zy@g3P2FPs)9h`Z#aT zNqFOBP*UA)JgUJ4|IMcTL((I34wm7}Zj-i6Z0L9I*0_O5gK)w-h zbG|px3fSg^;7s&fD4}@(@(LLQI9&LCY`yrQ*#G5bfMzA@^5pW)P&(CYNj?ete9REb z`^7ORk^!j>uO3m6!qfxT5fte&C*%FeQQJAKu`&)TETVP%H@&7=>xG1_Yh2@R)TBjo z(CLS&Zu3TT$8NT&feUl4&}SYSTr|iC&nobkG*maU21ZO@?2J2wq6dz{*2hT z8)Qh7YG}9}aO5_y6I$9($a4;4m5@PCDE=Xjdw9r*VOxe5p*jh%EwdM?}e3WIMh+8rQ*kd+ye4rKa&f{T2!VU7$E` zWA3^`i%9O6%Q+XR34~0fcs?S$DONWcW$cPs3BwUJka$B< zU21+D^qkQj1yfJtw=#YB(`dYEGGq4%bY;h|)&k{5+Ig9xej<%>4^w4UU5HN%f-x=u{M6spcDjO(*&-y=hT#aq8N?9jn~y>P%yS&SwT0bVgXo0j8t!LiqZPoEz9zwkVV zZv#8K&{l&48S%Z+orLjtj}g~%ANML5mfykm|7$f;fX$BUHAua=0ddU#c=P99I{JTM z7)8zhY~E;|X`*SNzawUTB}OErPK!dXR~J(*iYVcTI7mvFM#f;)^lcDxffhSVnv|#J zmow@ma<8#j64ea61AA7sf8@y=LQYa;wl&Wac=`S|(c(z;=Xc%K$0z2`LQ(jH9y=(6 zQY_yzNEX|#!4`|ibH%O6mi_UT|zsoL?GM6i|%r_MG$8f54Ti;<@ z@I9|8Otv!hXDwMVey^Lr;Vod~A%sv1{m7sNQ^YyX+3Q(o65}=XrS<2in46 z1y$S2-HP$b04F;hGU+OxhGUob&0lFaqMy4&bpa;S&FiylVnjIAB^~B2<=p$Y ztO(INqc#f<2+>CfQ~Ah5C$$dFc^$6J7fzPVF1;&Bfi zt)Gyk`Py|bHWHcY{x~#kYZ({<5w%?WmeQ~CVXgS$RPYPHecq+NleAO7EGWhuj#U`Q zme*u+jLO|lG*+Z{;xACBx)PgPGqz+Xu#69|UL{XBWCk}#bXRC881*vrAgyl~h(cyo znumHw>0L0Y3v4xTx%Mjef(aj zhis2xkgU6kOo7J-^`{h@03#b$Hbb+aq^~y=Ft&`j+YXS!o<|1yBbaC4(l6uU7iffP z4siggr20n=khoI)Y5+y6-<_;eo?n<97U_ z$0Bw64loV;00yS5?y4T_Y_^$472(!dcZ)5ZoqtF@oM@=oVQ_Bn;p@FhVFb;%CaY~e z_!8Xq809{K$K3PaJ(bvGWMXEoHa6DkdX#!zz`Ry+N;{x< zMOAn1MBGvfze*ezQ|%C8QZ4pKZmge2EtV*zv;u8ExKP2vx7=J7MNlGv_b{S~sPFbH z!bpUM38a5*Ty+qZL}5eq+Jxs%<$~sV>9)Go05_6k<09DqnxxsVgtH~J|LK%T;e8P5 zW3u;yEz{`vOnA$eFsX5TJHWPgQcK}m$sU-cwfA(Ki5461Vh^k*-@KLpXvHRW=GE(+ z2@Lz>l!hz9?xFq(kx==JQ>$Qh`hCWSPr^AqD`ezwdU+?5aq(r>Ls%>J(fw-Aj;(R6 zSF;Ao3#x*bN8+J^oXbymVk>65g@S7{Sigq*LR82T(*H=jV2O4i&i4xCZUfCZPpC!O zEEy3s8+wRR{@8z_7YTP3w-zkw}jzGPiE#uCqx=r8~EuzPyVw+rOa?a-VHLyyZIjv-u(YOrT^A$;Qns- zyi;Xw$Z#cd+9#*+TZzH6ZY(o094w^Gv&&>FB-_iZBG4G;I8dH&cKkFUvKMPWucyr~ zk3j0h68!Wzr8!Fyd7xz*&yTMAIxHe0;^|2cH2e3Y`kAdGTJ+-YdzI7n_!7fX(U7)~{RT8lI81Cueuu&`wL#Mpv z)1OWDx__}H*jkhPY@aw8-9mTm*(Aa1!&{Rscoqb8wr9b=R+-N@z423Pt1Nuni?-33 z-&T8dks+Rz+EEDs2lnuOK!Get?vitM?S2Es=Vv|@#vGc80Kt*vpC9}kREmw7kHxcO z1q1J0WRcU|`ljk!Vly*NF7&CB54a=hK7Pawxn1pYT;Zsa%lL{Cg=Z1ng6t`rtmL(B zbQx%JnL0TsNi$8g=jiljV}DzfB8J$UReKba&Sc1Ji`V4YQWt*Sq{tW}h&~BRw-^CP z+r)$apoTJ~ao*9hTrnPmtYo;z<`)b3XFg#_+Gqz+)qgiVoUkJzBD;4FD@E6Kstgge z;7{gADuAB2VAD=%^nN^v#2=>SUCmQCGF{PMtyk_cL)jD7JSI)Ic~QM7puDxETthEb zXpl;1*388uxZoGAWxEeG*Gv~^qbZ30N-DpBs_djl%um;%4r7+h7h@ujPONJS{xg_| zYFdDfM`?(-6`3mRnC%C302%h>@VJ)ta|wW{HAIp{ij?-+LD4 z2Wo3tZK3R5_O+u5($e@7P}h=vUs%xP2UygPieTC3Zey8wzLX#va}G7WCH?OtCe_mc*|gnnDLQc{E4?JobmoWuKj0yhU?$ za`VOXta;-rY!0XL(;?6?{J9=6QXqH5NK+fgyL9eZS+g2PW$`*87Kc%PP%BSvv*k?> ztF=`}InK07#bB_fidr>mB2RyRe~PGZrBpRe)9rrW-&<<0RcAeCW3ABV9fFzJVv@|> zJug4RA=dg4UoM{leIIAXUr>Oit}(@{(~R34du3%c2!#;8vNbO_G?ad;C3D?W_qtmy&FK`9u@yKyg!dU$^H+XdJ^|wX$eTWk*9A2jw@$UjCf1bS^bGf zM941oROwau^;fk~M#VVkjM7&cKY!cC8`D9J-XITcqW{6bMZxO-Gm3gPMvL2^m4^nY z_arQA>mntAVzs$u=hwqzx54WI@&0d(G6AO%`Q4J6i{iQ@qvsPJxh$*sw0zVA_T|&4 z`DHJ>axz!??{ethB&sV;vN)B_bZox4%rtjWGMqxN*5hRLre+8e@5sejR<+_C3@+9FrS z$_6ka0hC*Q={i2aFcgV6-(_3WZ;#_mgpOj$R z48pszL3ltDU8a4jL3fKw$^*lrRKcL%`U!s_40ekVp{-i}eBx{jqN zCgi8O&SM9}PK*-}U#7i}?Sr~K6Rx)g=YZ&2y@i=agv9cus<-Mba6}<6*yf$}74Uw6 zq94dsj>ijo=P<3ES=^G&HVfHal1@CvIL95a#S;fulf(JS1h<_h>i36^RUNj-YriDL z-6qP=dmz`d0vS?p9Ne)5wlsN(oN;HmzSmm)=|V#uptf~V{Yk8(^3_HS-=Q<7Skk`Y z;7*hHN6Hpzl`C3D$iTB*Lu@}~zGQLJGXp(AF*_FhuaYzz&*Y=42G80k+QdcTYxu|( zNlLlI#B^##oImAeS9;zVD5wwbE2JnkY2$5wG|NYGreW*(5v$P-w@Uia zX?m$#d0)6GtPQCr44*#XLY;+O#O@zHqj5K7TmcaY;8-Ya2>1k%nhb08i1Xv5r$Eh4 zyTZE0WcMr5STksPhL$M0v%tTqjWfI^3O~A)^9Ip5 z=GNkwux+%@U*=q>;<20LAx~UziV0Awh@}zLEfaFx@)wuOIZzi+YTZ;?SsUd9L^o8y z#NnuB*dynnTJF?-MV)kdDMnn;k#tvUzglbEz(2^{B+xHx=FeZ;t+2)A`&3xOs9jAC zAvox;tp8*}V-)KcQUj?rVeVyEWP)1CI5h~niuI7Dt}MI1nb26o+$Tl#w;q9l8k34fbTd7*7z}hU#h{tZFC*yCRBrxn^4} zC6WeXz2Q!9i8^|5BR{5pFBV3QZX!N(bn+k}>0y#{%4ftETl*K=lDEII4TXvAcaUs@ z(A2Oke57J)Hy`50*PuL=UhW!Cl26YAIFP!7fsAGh8D$M0alO&iK|$Q1?I=yrqlrY; zjXO^EGM~9nvSuu&@eT!2cvm|eIG57JR~dL$yB(l_J|HhihkED^Tf1(i2;ov8^Xfv* z?K)la!vKqNSdobOn^2uXUdJmN^~K8Wt4-@M5bI^}s#VvUM?=$P8}xQ28QCE^s_Z@R zC_38GfDs$CSix2JUat0?ZJd2eI}rvpHJ`?tAV8uGmVY=6R=%tbpFqk2fjXQK)7cX3 z@X-mRCKk~#2jk=KLZ$)OPB6!m&Nx&|CIV%mft3(KS~lC~FDEg1WKf1@D^z(@&X<_& z^tqn+f~S*0acsf4F#1mTV<88HjxatT(dHQKZIlLLs)P^gSh9Nd$eP37mWlFSfqhQ? z3VeW7{NP@n_N_+!l?!DLS|v7V#oHGAZpE8mBdATdM<;(Xq9x+JCgn=l(+mmsxF>f# zK;U2zPx{pEvv__R}Lq|0Or`%V?RVy<-pRZ-1X=RsTQqLGf`Grb0!rm#eRY>&Qlw&=M(|;#M zlz%m?W$o)x!#mU<7i;17V5N0b=DL>p@pRU*1-33h5rZ#?KoY;e45fl>$`A@o7%t<7 zSsLa}!Wl{pd(##*A-o%Y^?{D$M`Do+eWSiEh_*Ynz4cCU*rR&W6y>OH$8uNl`((kb zpfy!T7Gr5Kk9Bj4Oi1aG}A`Ud7HLy~@Ya(B@?YIiEv*twRKJ7%-9CA7%3w^i@~ zS|6z}uG)4`TcM1nf20lOq*Qb;mi_6-;pX1)?L($rNh?c+5RYlROCiCYFc0gg?Ebmu zlx{fW0w0tVAgr5a!kuMnomnC`q%)J_&&pjt!fuR<0l2xZJix)|wr+)zc+~d1gMDoM z`BkU6%okukQzVx3Oj^4{wHH=t9p#pw6*V?t0C<_H_${$%bZEG`kKy2r)3v`ci6Yj? zmhmfAkDoXH6tYk)CDOJG$cr)I1hFFEB48MaWp$AN_l=m~)Iy^Xc=!%DQkOGa*x~TF z&hItyx+O^QyqMIj0?`z6TXHF%Y|5qqD$Q<*gaD$oKHI}+0*&AND3oXy zqwSLh9j7Vc)<8VfF>F(!_{Q+br~s{-8YqHCbvs*X6Ir19IW)?g6UGwzy09py@Dae8 zYs(zEo$(dhe=N{+w58hq>L%&P#w|_|-NLs&W`O_FDg$Vb@WPC9$fxw_{ytFi+pYka z5PZ5GKB2lrxYn^TYc(s-?MvJYN?W3Tn&H^Ahn@e!s943?t!J%hR}RMGJ0sd-<3ztE zaHtTCnJQKmaY=wR>&!`voLQ3Sy9jfqSkGBu!kxxh@-y;?=LsXkX9IS_7zHJwkS@{m zKe$2Z>~mozNhS@WL(^kJH-sBVi@8J4LtqtM@i3+^hs9I+5=bgRa1AJn7}$gX2qie& zk<1+=K}FCJQfIwz^EO;C*B7GbH5aGD*T;CL^tNoTS%X!WjTor(x1GU1}oZiwxQ3A25h%{CH-+KZ1+v;UHWTha1fgQAB?_q);dRMlqf#3ig+u%XcoCI-y>q)C1wLpR6^hX%l2gL zt)Ni@sJD3n`_m_u|F@U$-y?^Anwq=KKc-{qxaaYRnSo>3dpTN+W{r7q`{%d$VI}GF57=%ZGM?)KE< z?X@5w;r7lOzu&iTq{=&E^OrrO&VC}I-5nsmUubyz?KLule@uA%@9X+JL6P|KJL)U{ zS*5dMHTfK~(>eM}79oFt;23c4^$!oB;8hvbF{r^gk)?ZJKHd95=KVD)uUpp0ETv4{ zC+n#0caS6VeRbYt!Eb*3?VUo|sfs&=Fu$CYzh%t{m@Eop1d7L*F^PRX>@GjfyjnzM z#Yviqm|Wbx^>ohc-1ISyhd>xm0Wc~ri7wCZPcAQU!N>Yqaas^*=24F?_==`ZNZ4{= z-6!<`3`PDg<)XPxHnYm*wM-7U5G(sMWCGQBvc@G1OrW_!kq__WmdlJ;PMla~j(^3S z8@2Oe=83o!V|K>O#PqQ|IZw8%-W#BV%I-CSCpB30Vp{8;j%Fv?u4$GuRtADwV{=!P zLG*SLYFpi#Viw$~0TORz&@chWI!jQR`NNGamldp8ggFo4WYQG0q$6El`R#ge7T_Rq zQmcBHZavs8EW`B7dgB{2pCXzXbP*BH#l|lLH^T5obDySXghGHVuOa5E)hAz9sGp)) zo{CCed030sROoVIbygZpihL};#QaQ4`0QxoTJiK1Pd}?+HQ32vR+gJ)V1)QM@~K#~ z10vByp%w*T$7d>kvH~d%06!o-N4!fLQ_W-{ws9n$)#E(N3HpIOxNI*A^KH1&g*oT6WZkS0V}~-yzFU(%-~DQvKjUSue50FOK=buccMwo#z88 zERVPPVYJaoQJj6l4L^>0jxlFpI~aLnznHw)ITeBRoDcy!$Op-EHVYqeWsVMj~&NX>UAJ-ns7b>a3_-meV0eMalARdhA;IAb|FB^VnZEcBI60XZrXPQ%~^>(}@=DMnC0ymV0Yz#n!YV$1{Ps`g50L;PwHbC~ZsH zD4N$FbjyY*N_L;j_wt!M?9-_`tk`#1f84Hq;MVaKYz;$D2(l3sMQwo?WA>X2*-B!^ zqMSi2bJg#(%KBiR;(zVK|`2$&IFLW(7)M zj`?aAA`r&I!+RnqT-$12AGHT?I}P72%kA;KX@waTdX0*pmd8Q1JI@+dRjI0}d8J*W zO+hG-HGXz{67br)qF`!rI_r;5#k>SF6(l~=+xM%=Xh{suCexUS}@+Sq0;=ZxrQ@j-J(hN(>MN1m8RIqi4gI<~P;?UfXkz)Mv1$tRM# zF)AH(#@zQ_MA=6p_Gcsskc!ws*=1rB52ES9b`|w16Kpk$?BruiaEzQM<&0G&h=p;s zJ^vlo>O%tAgLI6I{zJtx(lG;~vkWdpkVcu^*Qjti5yEioyeq@Ij?K1i7^Ml^a?U!QC=)bY6>@qXwe+KV`QpNlwkE$pl^ z@_!OPyj`=ijcO2pY$gn^LF@Nwl4%TW8qVO0z(g586KlqaCw3-upOr4bok5k}&Pnm& z8j~bz*Qru1&K5Y774HaV0VOb_ERoamx^LG!s;N{mW57x`6M>z6ngCrc6*}>R(ys}UPu6^Hx_);b^VWo1 zEGsnpMrnz;vx82j!IK#HC2P>3%(hbe6e(kSM!>y|q0d1*|(FW1vGv$8M9&5Xx#jWyT0ubzhfN6447QBGzmp-WMu+eanh(0lk) zMjJmU@UTuwfB#{Q+I3OL2{o}%wqOegmhA=J7PO3VR@z4zYC&tBfa@K6t3h2-3#(`P zvPjcsWB>9AlREgweP@B!s|hhT%$Ih_$S!b!_Z@sUGB`Y2Rg6RSVicr!iEvJg6mIPK zOfk+r^sBEL?uRK~7gzV!cx#@zE3N~6X>MV_#%Wc`HInhhnfi1QcP42U<_tS=T((OK z$`?d8(rC9ycQDPS7jOP&H-g)pcZXZ(EgOr8w25! zZZ$tD(9HQo9DWP(E7t;3Ev)H&7=DhfSxqKG$U$p- zz;I%HrbgVEN^hfyz%kXgJ=0*VoX5Ot;HTz_q7W@PPWusvhcU4k2Q{1T1q4iRJWQ>( z_T-veGWkYsNI^*4!rkRKSnt)Xxv{S(vc+y);yB27Vxi&*?|j8XyU7Nma3TOD_zcl} zG-{p(if4K5R(s`+&|P(Ck=a)lwE@QT=@^t%&x>h510SL>7D(A=Mj0JIpLT7H zMH=IYjfSU(w8;|X!Z&Mm9LYu7G)r~w87Bmn>w?Q;jZ0_CnICpakML`SQeVjLy+s}A zDQ`LE&{0UL(9^Tc0elTNYJ6LIJ0K+1_&-Q22$Ub@MCE~yw@HZgNn~|yBC9-lcM@g1@(VN!H2L+DO})gw^oXTz{#dx~zC4)l_Sl*~v(jr3gPGWLQ7#lt^loB`OJE z)-T?|NK|>gy_fd>HiYyqBF>9elE?qnCH|L)u^MN?L~zMW(+z++oKf+|-97K@0A_IM z6I{tiii{=yLt0Vs&yxe;+FHg=*BmLD+t{S^ltDlc5##l;sk@p%qN>90xul;aHbVO3 zO_S`1`yETFM?w{Cs5Bu2fFCUv4+J7=JikJ1&GkM?k3pzrerR&|fbvDP}mV2xbG z6bt4zW4fjxa_`{04Hti`0iplz9<#p>Vv%i%Y$FJWLDvgEvHw3mi2uRFXiFIHLuu^I z*mcX_bS9G2BZ9%nLyf_k22F9y@W(ha8r_F(e?iNUN#XKjxGBgbIh-UlDp+N^$z(GY zAWXw@vCBQCIh<^|IR-v@2Hx-AZE`8?CDMyrs1coY@i}h3T?TAr+tvwukbcv<@x-{g zGvgyvzF`!qy!l21yJ;Xd&lBL65FYO3l@b1UeQij%S+@JOK%gY>iWKnl2`T>iT7*z= z02q#QOvcYY3N#DwLnl(ZaSnKFC8E2AR6ELihKznGCd%ti=I0-b&pX^<3-H6tGdr~& zdg50z+HSIZx`__(gE6v5sVnzNJF2?{)Un)uC$e--4432A*SvAZ*izm;8y(z}lnnX{ z!)S`9E7gf5_g4G+eP-e4)F_{AEFJfqh=jb0Ldf2}SYKZ8d6_DU*zaq*S#2v@W-R*o zqFMB>mgO@{&-v=+Es9x?5}al=!0Sm4ADVp5b@EwPo}SKTj_uaB8UF=;Y9^y=eW@^f zw_l$tbNy5QPP+`Xc$}f@WL%uud+Q|fs}*nh_xXwG>#yXX9$jrI1UaQ7)HZqjcpMbA zT*@w9X>)%+ezUKUIwvF?X4Z4FGUPa`x|&>{@t|BvQ>Af$k#@nMk7qan=Gu~_bL?|z z4ivMLK{cr3mZI%Hu}{Y+lB*d+o=kDXTBNToWeK%gN$9{a{7=RxCvi_&gHL-cqLR4y zxY;E7*P;+;W&>m8g3jd^Syc-JeYotI>12K@o{iuSTY9nDn7gphrL)+nU#aIg5260} zRj}&D%d)9xIH7wXa_dOSfN>;Fi_K!3;J^owD4}gYWw+wi8*$b~F0+B64f$(Qc#5>O z@+TBbCj;_{4*a9GaRGm{DhpcCb=lol)(LTW)BwJZLZ9!u%2-Wz%lj(+vh%3!Y@dBG z38NJh{pSbnXav&gEzsQ{eJ~Nk36w+vjROb?IaE)^W0ZYZ1aB-d)%sS?$mqCHB3=W- zrrLg4j-uWvA4;?eOCa39=?J_Aj}AMw!w!vY;$ylZO>wA)L^{t%dGXcQeGsiivJcei zA}(!et3H^~>Re*V_*3TmRNs%h#ApnDkcG}ZCxBGPQ;^T#{EIEgpab2)I+?+ZPW89_{0o0U+Hf4J( zsxF2~gJ3Oh-I^Xwer#-=_eK63{P!{lGcC+H@CThO##r$XAh;_`BEqYl(g0Z4rxKmT zyXFX6L!RYu476w*epp*(wvo?*0lo7`9P4ogv;oCC!>^aP0fjqdPnm#?&R182o?bfK zOJlmg5u0<9Q>~{az!q`UZVPU}@YqIvqoE#+<*y|(KTvch3cR}cf>6ggPjo|t5GYv( z=()budR6GVh2@4_+#u$vEfOR7`9?#wpwkMW&MRJljwdB$Ru;4T)$0;a-}LHW<9*)jdlqd>9~C#yVBD7{ zm*S@m2XP@sGW#IZj77`fF=-eZsTGWgAIID4`ghgJ7&5~hCE8#jk{c15R&C>*Mtcwz z%9*M;a#{jF$0q36zgnE+llCD{$Tj-+*OO98IA_93sB%$>df>Q6Eb2;4^4n=EhWe}V zWSe>OAQlMyygNG7J}k?Nfa|(}<$@h9`6}y3FUUJ~AfQutPZWKJK!}fhu=aDC>HDXh z-VH9(x|pjw)6`eg5;-Cn(n>a&93J!f1&$N1@0SdIIClx9DAi?rA0E$?%V12at-dqE z3V4s7Sgz836S!=W9V%QqMT=ux7MDQ_cw1?PoHZMYEJ%=6)yGQ;O}ws#6P{C5=7`U5 zc7o-6%Wp@foRKH!74h+nIM%gLb;^)LYC)kX$-XnAd9NxbG!e-?!WR()n>|9^^$dL? zAbGzPJx&vSrinuin8RLYg}X|VyPgnbFq?y6Hx`f3v$*mc;D9B$V+kTVPAy*>V9ONq zno6U7lME_cxuS>?z39=(>I$(4&_Ww8vcPOAd3|hsvLz2BdP|!gWqH20bjDJEh)DZ# zXG9Gavw`iDP+B1SO->eUj|&PPlaeU?+Y7bixw;TUZB`g2eXLvmfsbeL3k@Fzije|M z^9N+u7~+t}Uns7fDk?ztnJuX~9SE8HHx#$)jHalDs!JU7oBxGkm@aEVA0Lt9^W_ej zVY@lB(2Jrrj@Br8Aws*UqCZ|vnN;y5!v?`w5;+@EdQ%Bx7WL?la0Ma_o2StBB^ei} zvQ0@L{h}qBtd#OE+UMED+76#yYpvxr6;WwJTz^_QM>bZSid0sH>pyVt6lPsp6dp%K zs!%0>Rcfd>uOr+2(v)caJb2I`6>&xwZu|546A5ejmW7^X+=Ytina6UwG*7MiMo8$+WYjCo6)SNry{eQG3#E3{nM;$He7*`7ani=> z8vk>C^#dF$3GD^O>M{du22@*la<9}Ly^^G>WIZG}k|OMMn@yStLmvz}NlnrnzSx$F_n*skH$z245TLzRa-*buml`@y5x1*Pf@I>j?FTW0L_}J+r7i$@dwwnrZ8#hMKi!>vN2h9@z zMmIAqItP!JmD&6bQ9-o#YEGC!Vji&JYDnr3{!21a_w&yY4r>a+Nursr#;c% z^@KrRal)ohc$rpypFUk%-4%L&bjQz`LfG-)oT-nbrb*?0#B+bqFc*T%nLB6MP;sa2 zS5w{%2mP2P(OQ8I{+2G5&muP&}&kNHCib`4lGnE%*1DJ%9!vh5@e?H#jV0p<1^co(Vr54-6-(aExT?+1hQdz8 zx;cYs$IuvaXP8#`{af?3Oc}w{*vnwX>g_ z6VDyVyls!Y1!ypcn?%2^T+DAjs73S1(_+pW#%G_X2S!^7Ibv8j0@ns#5l4BADQfES zw-j%$bZ&><1~7{MfH!`C|7RT&-SbeV6NJT(|GU`^3W(LLOkB*rN_dz%xczrvT$1+k zHzf`aj5hy@4;D1Q4pX8J8)=U!FKs0wpX0((VE{qnVVz`HUXMkVKp~lA?G@53VU(Zw zPe>duC~O3p)`Ga$J;qEHY~tyBrgpN-b>-(RQQ+GH-?x|Y(8R$bf?p;)F@n|54XZ)W zxuG(CD5YT>B)6jIp--xVKE!|K;sc|;bfdBJk=;wQk|iw0mjvmV!7M@0`*94GPusqIaJIbZE^M0D!qzHer*(RZuX*twMD zJ7%%ZW&ezBZ>#-RSnRmw1fvhZY=twnI~n{>Sp3EE!DZevtf0sWM8<~5oU^kA0Au!S z6vZl^ihZZ_&0jy@g9^K)KyEv6mc4amfgF_HOpXET^3Q*T#feS-gvAc6P+?Ev|AfVC zmj4cm-#}q;!4ef3oyHtG4@n(}jP>A0tj@uA9#h)VIlaRc)9wl_`M$tEPKluFxWIk! zRj(Fim*i;+;O{kaMquCGfLPi~9e}O5a0Npy_TQ+E+Gyy`e*A7TQ^ngkgm_tVjg{;7 zMMHS4C3Y4WWBMMj3vYl?H^T<&(3W7EvCJ$B|8r(s;&y>11m9p^&u8HdlF=7M|D!?u zrLBBWz6w~QiB(x^sdXAUZ8vkb7MmoRT|?%W!eCGwvvVMGo%QE@Wz6qVTWuscs(T2O z7Nbk-0KF?1a0*YPlt`2!4wY}Zpa|w@IXTclIWYtU$u4f~PCFo5+GcxsR(YryN(?%V z1yJBgN>b{#aC(Ty9EnWbTye!7FUN3p!8p5gK_sae#qcwK|WAk0%Q5lFa@C6{N*J z2LSt<76WERB(K3X9v5r;ECo(Tsw@dv~KQ<2Uk{!B5k-qq?rK7`yknB^IG`5Z*~kp!YYz32-H=b*6ofoKL47PkR5aBH=MVsI)c zlAGq2Z=Qr|(r;?7YH_a?5NB3m46Uv;YnJv%4o@d(T=Zm)pyJD$vS3coayl0J+jJR~ z3O#$o0{tj`PH#yUEH{w^cCLWLGfZ3|b?lIY)j=a(sBjE1zVG2I3qB~;TVCSNash@C zS17gbQQLHxOD&<$gI(km@f9_L83hoE;*x=4CysxRdH-u#?6p$A3Vp4PwcnAOmX${BOmdcBaE+(xu{Q8BoNy8(a2nSsd}HY1Y18N=4OBoQyXMA?Q~ zIZf1>1Rd6#W*RfAxV4nTBwRKBJS8U=C=~EJ8hEnvFG8jm$alTl%y~Qv@a(yoh^`Y1 z#ONjLEZog8Jn!$K-8_)sxx5$c^G_9@_`TQR?S+K&`1>y&4+CE`_?0&wmfr%8!jb-s z$KGBEL4y52DQ~Y|(eXPb81dJe!(H0pO3d!L6-qx^rMjNb1t)-JuTMCHf@gz!Pxxwi zmN87s_Y#J_!9+d#gXuRIlHRI=YW#tzMo+kEQ(n%9SYEBafD{;0l~3*9N|qj`{nB*P zq9dSUmZ5w3p;#f78;XC=fNP0^$1rx84-THWJ|v3wc`}5p@IO;6%5GJ+CSiy62{A) zSetd)E=p$=?2AXu+mcP(-`q4Nl6aIziI}sevb&?oK5$|#DE28ptQ6zOVFMfFV+J12 ztOZOmK%z#bd}ce290iPBh_N8v^u?gC5htOgKTJQG0$#gJ)?>-dAi=m`q1JGNd22glccUgqE?@Qld&(`6hB;)q2mA0WN_Q)qT3>Y^!BSwk z7uq%4LYmRlor`gkY6*|pzJ+zFgYyx3HPohAZpAArlQ_M1gN~*m<5klcbBu;QR2fkr zRpxt-qhdaPj^0>D&RFAdpe}xoBY?|xgpPlA|B9qMkB$NVlxAsFmndCw6uL|IJBAO~ z37b_HTeF?QboYVTvrnz0idi1b$}(_3M;pWS)&2$wLrdXD{rC0rWfPXiYkd)OTs*7^ zfVY+TQs9hhv4EzD>;7ty^Gb6?Wn00(eVh8CdV{c=Ht2$xEJ>rTBeJqNIcMg4n-;Zn znorl;5SeFrjd}+zGi!w%?L)!2UxMf?xjHx zwwn03XD?~|aO{5;aNSZP49iO@rZmk2Q4`%2=+PR5A6^a%B2Zk%#npQy`ME8WvUw?1`agz5557}$ z+14=jkjE;}R7j<=muTgpI2ch69Ah*xIdf0Cqf8@>H&ST zD%#nM?C4Aan>j0HrU-pC|J=gV-}MHnJyDKcW{<&*fp)g7ezbRP5{35n-sYzHT5yRz z^%ZePKqLQ-Ca6&71y!N|f|!0{Q-SSD;|WW-A!1bYor~v*?k_EC&5Xi4KUz9{0nsx0 zmpeg&Pvu5Le`#6uTNNzWa2*miy*y#!xA4ET%mm?}9eT(Vb5{(!pOk)7^PnZ|&PsCp zkck;JK2JKWe1AUuJdZ9qjK5mx!G8?doa(9rGc;;%SS(K?p21k5UmxL;#w1s;#2}`$ zj?ByVpx7yrMM!3cG!grb@bynbk2%;q**iz==W0S{=t?a2v=S}L5fo1|j>Ayp9&N|Q zFizF+2bdDv5fPCBRWcm3;z#Xsypm;Pk{iQ~htG5}=Q-IJIN?U5Nw zE}RcRWOIFVPcjx0PUB42FefdMY6XMrRYtx^_!pLKHKW{qN)bd_-7`y0U#RmiqTpuH z5%D5vc!TQ_YPLa~Ie*a%8Q^6=?HpgLA*DT?A$uWt@zSsKR?g~rW?hV}#cJkC%w7@- zzYlvBJV|K41#th9A$$BW?E03K{x?IehN#$-JZ(cG zsZX*5i6hcSxKPtbJbKm-Mep$b^SZj%`TLlO3rErq-V?d0TF3NM!q9qmLnCq9orb5Y z&gV&zbq(~L!$RmfOo@C)5Gxlya{sYOqhD$LrpLGsq>ch|aG(Mz0x~D=2x!5O#-cZA z$I8-cA2htv+Cp zcR;CZvK0uq#RnxB;#J!w@H)E8}Hj{FN2Gf~;&dIVYF+3WymR>n+1OKpU zYmc}{RG}?hg6(IBlsM;Bl-iq=yPigG4OMu*{k-l2qxZ_l;&|UN==VEGf^VemdmZh@ zr0t2tra0D$!d+*WhkxRh-`CSB$5q}6$+yD@znEO; zIO}nhYz@zn2s+O9a_+ja_2=PYf2t?&1EQDXNoBubIX>JAeGrDeLHlx8idtO852qxS zG`dck-{K~8a1Oc~QQ_lm&&cl-r_K+!tA{z|eZhw*`INW4cb^I^i&8B~{25BEZC;et z$SXHj4ihsy7h3)hzvX*5Tq63jIrC+QdLwyJ*>o@DNCiUB!j zXVWjg+w*nrWXCB;g=3tKh0bWp@7tyg-VkeMQPpq+WjEaTw+FP+zok&n%|6UYj(Dy! z1dSOKI=glDYo?;2N5!hq3vOO4GX_d#<##bmrKgJLK5$Y%Fwd5nEVPnF;f;0c(cK8R zpF43VEmiVS-#(X`)yApp@(0pSW~Z6V6_6ZSryP9ON~I98$2stxE3+-a_z+qIhky&y zXZCiegI~TD#Wy#-|yYNWnnDV4W2<^^H!f3?* z92r#`xI(`sxp9)m7qm2C*)I2|+wXhMWy&kX2@glhz-MFwP2JUf0MW~*Q*tgzNL${~ zR-8UK0!m7^@BO^d(Y%VL+EVbI?smPiDnT_slbX?0C`ROWUkBv+c3Wrj9N1rT&JZ%q zZ@KnN^$gZaP6os1wWm%ZgYND`eff${#)6QNj}fW8Gn`0>6dS1+KI8Ho^iB*F%_7x%Bo&|pr`2wsYW=;m zry7me=ZeF=KwbauCFg$_yGVjyGHl#x-x@E&v=~EFzxs6O!`hIMDS# zXZdo2O2r?h#|*)jMb6BEKGxEBut@ia605yiLn6*neOpqY@m$+q@UBCmyrr$vk4Y7* zlZ(Sr(}-)dtmVmq$ME?K^X0cU%A5_p#2Kjv5!2piA&7Q$l3HNkbamq;%(OCqkB#)I z`i3}F+5Z^PgtPnHv@$_Vsm6Y5Xyk|2#TW59YZ}-y(#=%gQ?g6vlpWy7FF(f|(s2Ry z5?~MJSI@OgkC5kXy1X^Y+{3kf#6IqBifs>?4m$RFV*tN?;+6~R4I?n`-65deSfoeK z8WmclE~CCwc81o#Z(k;u_Kj_CMV*cvh=;e^Gp2KEh_o+G+{P)!-DlS*i&{TM#0aG8 z-;3KHT1%*+DoZ{K-xLd6O+CApci#?H@yG8hBgTCIu5DABJfV+9uBt`-zkSEWa?}O(o{{HDfejk)vr zC<=F{kx_T7u`|vtF_<$CTd6)T%*WX0ff3->x%-&(_otQoS^bS$yra{rs=T!a7cgB{ zXW`JK<$|!^o#+PAic)3qh+|0M(C5n=)x2P|GCRKfZr}GKY%IL1T@l}3yE!63ThC2T z^NqFcbrx~v0EC60R&tcsv}zdZk8M86M{GWZL4zv!Ypx_# z|CHGHtn%q+MaU5fWMQ%_Osk`#iQ*BW$@bvn`=VP*QpD>zhZC~>Y>(xZBDaL419o`&9H`AmF zrvXhwlXxd^osaykZem{JdjdAbCZ)mU%|Y8^(_smbiX#O>8pOAZ6!DWWn9v!;H{KCISys1Iac<* z!5Ed{(VRXoC`{{Khff__9>q=NX$VuM8+uc-rPhzj z49DykZfyP~eK-?+U=)iG*^~KZypa{}q@=IusCjf7p(c)FYG;9EHYTV(D{`bQD(k- zQ_N2k>TSIPGuXV4+H3sNkv?wLf1GcbOcpqLGx34(t_}cb++xE2GArxdzrpzo0LA$n zpYFYN0Jm}3qgtyIF3|;uP)zzVk*=h)Qyg(ySp})bM2E!U?w7|5%M6)6x0Zu-7|^RK zFUO~q2%i;S{rKr%mbL5>eQoF%G&4Yxb3T_k6@H~aW{pu@ugLW)+`U+B2eY}Jn#(gu zO2zB<{@z`vaFo96!~M1Lqzc#2>PZYUE5ru( z8HUz!qV#A`y(A4DUPS5X8p$xamdfL6krCkFUp2U@2xZVpjx`2&YgAVID&rNDcj;ov zkTwT&f3Dc;VkF7rqQX#!I`2UAfD=>t!YVzV!YuKfJQ(wP9=_VA@;>dg8XD{ICu<8#VIog;;ML2NN`FF-n}MQD6TA3 zYlO%R%(M|n|7}P>>acPnjF!=qBxXXQNk;u%*(S&zc1I2=tSURT(uvpb$8)5*TbK4} zLCO8s%C>@?ICQNl1Up?{;~8ETtfHPRcOXo~RF!@7Q%`k`GFAQ!!Xqj%tXrf9g$vY8 z_>Tn>5V6LU@1C{A0I=1c=%oj3Cqsf^SgP?9M4qF_;&-4AX)E(MKM`s;6^=lWYyTd~ zMj%Rc2)yEJM|wcLlvY&d5%k(AEHV}P>YDi4JAgC zTg4)5K@Sxp-Itd1gthWR_vT` z;Y@4+PMLaEnUY`nz`PxyN`GCMnx8ur$rE~oRowJ@jR#7nxQAa+!Ve#sb*9jZOi_h3 zHY2_dXO?#*iu18LzZ$kH`f*2Uhd*e!4fcYO^3eg+=Bee=OF9NW(11^@K&Gyevi1rI zy(H(yk#L{x2ze^f{=JS`=5cjbQ8jO?e=`Dzx>;K)&7dzrVWn-c8l$DChQ)?)`qmw+ zu_{|znO2+zbwd+10tdgKa$?Jpcm{gdkKc_$*4sk_B=!0_ReEb+s*w#X_JlH!WmDiO zOUjc`5@Qds8|jq=vPo=Eym|+AiNngOM-aosBm&oCzLf|p15P}@{zwI%0}|c{gDZF; z?4Z^2K`*Ew)tiSR!uZtoE|i^wlYnZg&MptBrCdr`y`RLEqH9oFRueN<_4;0Idoc01 z)m5_BiSsDz$}s-!&;YYh^4$O)yFjgyqrcHD{y*jV3dz#kVA#PFHI=S}KW+o)JxFqg zOiWira^7%~#!C3$Efe&vG&`ntemSmPnLF{zK|-`ud!j^?Hc=p2q7Y7krcB_Gpc}*) zIiz)Sv^Jd*{(b}ltcJ1YcWZk#KOT=YwsL#nBAI+YqeR&zgx1Kr->a4zRE?~z#%a*Y zP0Guxjv{V~28fMBF?cwDM}BCl;EOO6*V;7CW2i17FD>9Ip>A1Tv*0vP`b+-AT(Qzl z^%W|)tW|R9-la|5iZir?%a@>boI4G@cJRoV8?tI!%Ao$wCw;?05K>L%BIfNzRiY-f zenT${RH^g*ZRh=M`+b_*@A~=V(Bp|9{yuVH$nH^U-TKqmS5L4R^L|xMJY8ZV4_2~g zFyA7XKE3-19qaZIC*aJ6{t7(9Vs_1P&c86hsm}EeosBx(Ae~y7dYz^k_FPeGdN;y# zBLN!rhsm2@yHTxcX0tGY?f5{#yh(19>MMn^R+oxPUz2dz7Bul<1Tt z3`2X5@Miz7Gn5yUI20|2Z+ZHXt+oA~w3o5<-M~9}z&!Tg5AvpqRcY-4?fDclzIdIP zBn`MleZ`6Ui3B5>GhuNCoRiX%M38H4y?@%SwN zUlUYRO>0pVv@Xf_YQwrowbrbQ0wzahbd;GivE5R=-9_49KY>A%#aGc?q!a06^8c!2 zb9#(D2sM}ewcAnPYQ1s>BmbGBw_7o*OZRsZ?pDmROfSRp5_HyqfP zZfPE=w0k^sF~?O*rNNphwN94+!Jd_jsl?%2#5X6+qgHQQs7vY^`OM5JJngYyOHQ+&??DsmQokJ0Dd z8h%Y?oLidc8ee2!UYR5jy>Jz3Th7kF){^xg7L24{vJCta))v!%`^75wyJ3fvS7up8SX+d8H*(qIvR1xo!L#4GkIe*KTgICH$bbVDqs?1_dM^i$Lu9+)`YyW0lQGQS0^DqEq|0+J&Y5&4Zy2>GBxl!Y!lNmD zdQ!?Ld2fX4KYJk8=EFXVXWA8~+Z)r$xlY_+MxE>}@p&?{Iu}>k=P_p5*B4@Tc16Fc zNjoyRuRuC0!~I$d`#LqE(}ly%9npn7Ed6fJ7r%h(K1LyO@5F0#*1O}s`AO{MBpSp*vtK>9g>uJ&m+B26 zTM#~8#C^{5h35R9F5G|K*=rVjD}TQ?c`&}E0{`tc_y7IQ{+|p%6WRlJ89B!SpLX(M zP5u&$Clo$dJU%lFEJ4v&7@zRFHO~}(MTP{0>uE=uqAo5GMr}uIX9*3ClF*_{S6nPe ztthFzkAgzgZIw^ScM8mRDt5Ebsc62#U#)SmjrCO7JImtWzWdJdu+x?9>2PSWOUX*~CS?Xx9=t+rWG>rE+^w3c_aP({w)sGXMU!;)I z>QPI;2Z3K9)_~|Jc8~iz2#5?50Pq&?4L? zbj;3`_;R=k z5+}K#|9Ge0v6klm@6B4cS|MXAv$`oQrw-h-Jk%o z6bw&eJ~P}P|GUU-1Cen$;Z6SxcUsalxD<=OgO%H0K~1m9fO|S<-KGgIV4t-ok1x!| z#)~vxY}aH@Rd-XJ^{DNjoOIi_p6FEhPMFhOkZqw3i_D}>o5=$aE6w2@gf;_1pJnS_ z?!Hhs4xXK^eKEKje|BinUNGv-Jq;PY-Y`kJK7ZwRGy_t~x?F zm8DXo8AuPfRu$J-d?|HSL5ys&LZ@Tzl$Oh%xqW%#E7=iGJ8iqo_jYFB5t%;Ed zJ+P7-is}dMPTcY+e|f(If&EI_SGcu+pp`+?$NmIiSlr0#_%;bxKDtAH5)TUO8!*fE zu`%lknS#_5BPTG@jrK~N3fxA()eihJI|a}~N1~ck$pWG|1KP*hprW^?NJS8#pHS9C zZ@Od?(h>R0e@`(C4m&~<=$BFr@oh{25;jSp&Z26a0*lo1S3~x;|`jFG}X`2rP z1*60#u^*5Lvqzn{&UyZ1c?m?aHkb*HAmOg4hC_tgiY($JFU915`Y8duo&3fg;{C?M zev?NFmCB%6)zT-%63%mo3m%k05~0UzJ)mR*GAW@<-s@YwZ*)0X=KZs<*r=op&jEU=PAjQ^9IAGa1XiP8|((%2ld3JPfm+q!jOeO+g<2hMQXxMB{;|!J(1s zP*!;?eJc%-8c3p;`e5M-d3W84U*ds;NIzh-h{ub;5 z_eFazdN;>dp9C?;*N;Um1KZ_ws`Z1WM z6?m74c^_JXlZgnOe`A%u`v%ZLi9Q9KcBqo1(IMsEzln9$=GI z9-)hI$Sc)ID^mUIY@TU$Aw8R>S*BQ_ba6&mIs(F`x`$*_>E>JAF(Y=(O!Bc9l#d%$ zr_ag3HK8$!11oYOy}d;t%ZFpozSpdekTSxnLFdf%cIuCwi*tnB)Z9UMml&Gg`-xol zhK~H=eJO@21oG=BSr;=RA1Q{}9Ek8^MZ8lI$CHDBbQF4#j5I(o`7@)8(lLX0oWSt6 zoEUMGL_iA8xE(K9c}5~gL7kDCSVNK<6LfF~H4eY2dBS*>LOfU(;MSe+{lf9<(`SVOQMkQUmP~wSKNuJI zF)rToM=EPzDa*9?he;~?=~d0kUvi;!t|95fPMq4&)#A(HN^yrZlWD5fxpL%;CVTXA zMx&_SZvf*l(B95qpogdO4cfY>c3E=IdexH#w_;J+7Ydf?srtRB$F1=ZVH&l|YBHqP zS%a@6^C~3$?Iing$i(EvqrnX9fNGvYxs~GrC%?VY=PLl8+P;s>xov$jNrCUOch!}j z7s4Re9Ol``wZvb4|5LIyEzTTQ67&1nL-o|J#ckpg4(qB*ZO1{ng_{I0GQ6ajMpSwM zpAWVzOmg=dnBi&0=1f5SoDV#MI4~RcF?{-6gq)vpC)XiuyWrnPvq6ShVU@VXi)vjR zpiQeNx9Qew*7?UcsiUn!yvLl=31x>7TIL7wG{ykW%Sqr1Px}i$DaC1$c^ONb^?CTPNlGUV`te??^sSP*aZ?Re#GZew~XPLQ9Mmfs<6i{Cxe`Z5)0(E z>giD^Cv9SZUJT{CNF|1rw-OGfsN?VKQf2m2lTM7f+Mg`|0TVNu``_FER5<2|PMW3T zU)+OV-1`FQ-wO&Tb~* zgc2tkZ*vMXf-m+V3QO9al7gXV|4=8^Ei5!PR*SI}`#Tl}7&agNXgIW`od{|9iRbue zo?OkbX{Ut1T~O5`);@&sn?fRqt%WLequ_E>CoN_H@IV!G9S=|5Kk&!g|V2#)+BSPt-ZgT0=wrdkesmmune_>b(z<+lPh2m}xiH8K#8(0|vA z{P#NIKV|#>X9!fBa^Zk0hSXu3!xB`Oh?tl-E)Gc;ig@U&AJWkL=A8RaI%_!j z?Df_4`%iOs^J~AClgV1(J)kaRe-%dqR7po}ApAITrgbnKA%wg!a7Pja?^SCmO<;UO$ilXa{iVb z+jdCAHI|B)3nN>yc+^QkJ7R}gJE#AZ_WM@#d+-lcO%Gd|<{5tNL284G!aN)OPyyOFmw^2~D2_7*7xs-Pxd_7PM;kV3P!WUjx!PdIN)7JOFo1_CqlE{DY z;%AZDL&x|;`6Z4t#KHt~p+fgCkoALBu|?G#6Eu}RpPjK?e>l&CpDT^H`qdNBzqk# zUUDyqk6-JDWi(H`E^6zy)dB6pItEW|s-B3A%FW_5nC{z$rs!ysU?u3>6^02>esZYz zAB3vl{&DY)*^2R%6vJ|BebSVpB^VryA2x`T7Apl!@!&`$U(AI`vH-WhlLwfon#E?7u zC`>0jOWc9HnW8wFqwY{yySz)&wkP1fd?^w`2oaEydPisG1KYYa=nd&e%5bwC#z%OA zKa`XEJO&4BKk$iz)0fJn`{7BwiZ|;15G1G~d@>2~*DBa|AR75fYZQy2xT0|V(9(+` zuvYuI5k{}JFml&w?j}o$p@nr7s{`!Q6N$fK;j2KncYa=AU>4Ir=Y^2b2q}{at{oIt zpa#URnUfJ9*F{iQj`K2o(6?EKU321`xAEHn6Oy71yByNC2EwnE^OlNz+>1VPnf_NV z=Ped{q2m^QTLrhYpDrFJVET&j8bMbN{{3vj|3%!{|07LS6%Pb#i#e7{JNmu7AQ)_d z8rvV36>tZJx;~I6o9bedYf^)x-Fb{sRW1IdY*ei%pFp*x#6C0Wl8w8{gm_^c_10YD zkI$UNRR{nbhXf-EdQ&XtRoxpN#5K9{$rLrJ1QFu zn`5){B)=N)siF5ufcd)SCZd@{nH2}iBeov;D7U=FK?^ct5v24NY3r<@>n~0c)2Mu( zl!PZwE9R9hq6g_!Zr}|_>`7&C>)b;p=aYR~XzR0ZnD@wSHiHl*>j&h2JYdw9wR6+p zzb9QNfPlFFKM$CHBUa6t(7JfP(SH$6UdNdckp+;&!I~6gPS+EMw}(+7LCN?NO(Gv4 zQ%(Zmrf6-ELPV=qHnFK!M^`Uv)_Ratui()MEv~)Y)^sCYSs{8`B6@4tyzOx8A~X(0 zk*(do-Ss$__dNd^eeQYQX;tX`7)k`Hi^!(!cVb{22m_1t?guB;H@qDp%gW9hokii2 zI+7yECB63~`FFxZVnBSa2HkT^v-@>y*`XuXHJ*FRsK=EiU@?Wla10>H7xWDAS zAL#K0i-!(jUFRXY12^BYdyp^CY5hX?+QrLQ(NEE%SFhAzjn_ApaaCz&ZyrtpALn&s{45$rJ`IhDg@CGvPh z)E9oVE%nCY6ku59I2zo*%#71|^piq5nk5OrZ476puW}Y=;`FTVVgY{_hay@-={}CXp zguVFHz3fiiOag6J)-Eh0*|HNQcCOJQJ^L~`Z=@2}_%28A@jjbxzOP2LNnsx3%D4YB zK$90+`7JqMM^pDI%#v1PiCSAj72bNge%g)hw`KOiGP(vTRR8&WfupPp4HcHJvS}r8 z&|f-gI_xuzP110vin*$xWIwj@5n4976xD?IG=O0v=fkzXaTgqGae>kTHZkx1x8Gdp zje=4@b}1{JU!vCwC7yOklLIu>0olHiXP%qWp9ak$BhhFWFA*oaUsU-Dk#)aSkEXtW z^_iYLqoCXR2A2G=+>sew!%g*BFtLMY+$>+`w_d%Z2K6g@{Ew%?R8%WmtRs?()5K1m zipRXYvy#@1_2ySd2L=vJ%!az|T5}FBeU*ZdbM8YPCsnZov>9$xh)96Wupz)9esD(` zetH={e+2_gRA#;`Y-KQyaT-ajDaZd4L!VkwLz3!% zZ}bF^f~4jkR+hkgo2DU{vAia>;z0ZnQINF3M`!S0LI|WBN03b;&fi+h3>A<2n z%=P?pnV9|B)Z#U6CIZg#r>0LFLt0zzHnd*fmivf>V>rXhm!i?q6@i@Tur05O&_p_K z^*m(!+^Gm(F{BE@gC&XGZ|mbnGOM$$!qBpLy zCefa>MR}NT1m63RI?jCQAN)-llD-W4@0b0`Z`aFF?FhgCe(#)jVT;0^;-s zG1T6=O>iHMbi{-tM}5l6 z+lZl(30oXmQ^imEnB=L5HCN{Yq4a4(7N?O2a&?kME!!42@BN?H_GAs1*G1R~NbNQV z%=PWIIaAW>*vw7BkweFmm$EH_0Cw%VxU6OQ#>TaEX4gHq7L+rxhG_nmxnx`9j)cGK z#_4oIly$|n=|dpQI`ZNv_2|qx&^%_RAy5=VrBI`mYeIba61iix=sXhUl~N-(E$ZeM zL^O?0q7&;7wv2d=SW~!^fL)=`N3L%}??>`k$#VJbAevg8uXmdU{IgnYOOwo%1|a#aslsx5n(RW=Kew+yKjS-QDJ0M(Veap6nk>3Aph04ZW%%91dp;bsmx6L4_ z-C=b564)`2(^8^nMz<4O!b+yBohOh01^LY>*-^&0*6(3bpUcMc0M4avvde~(G1)Z7 zcKUhub5CXI$cQM;tV3nNYmJJ!M3ZHx8QL0oAukox%`LWU5qOekBo=FTF7EMD$4OEY z4X4a@o*rvae8{}2ahucb7~mSK%c>3|xMZ8+SBTw9Zks*b23b8UEN?WOq!IQ>nXO=% z+BVuPi{vQ}rI8-ZHv@NT*>}+-67&fBYB1#cRm>6OwFcy|zlSpzNV)!D6af>~~v zcfvTHD7wNiRgi)Dn8-%dnOef@^`h{Nw`fM>nd}cuz)e;70)Mn&Ff1=twz%t$Mt>wYsakUk3@qNs}bDp=L`jpzrdp`koTD|Rzc;$nm? z-H2zfHf|}!KSm;Pp+Ruz!5;9$`XXVg`cNV&KS|_Z^BKTDhe`MJeb9JGiPqO#VPye` zPELzYPk=TMdN5F^S0Wn4)H@4S$UB01s_xjru~+wifx2Mvkab$eA_uNdqcQ9NDfQ1y zxp%HWgTXIdAJoCG0I=_gGCY(&{yP$M{_Zh|X+y-n!P0EN-(Oz*J007$#!c6)@4F8{ zuSbmLpc!XjJPdvMXdT-Y#=o;M#}T6u*TM%0+9n7b8`zq@KY6er-1HBc!)h9W`y4F+ z)hDC+qkA|~Ep&r%+JKe3RL8}p&jkH_fj68me4iWt!9ukQyBdzFOtF;wu2Kpwl8^ox zCZ#jZNwy}6Ghud7nv;~t0U~CS#B*GxyC%-X*Oxt48Y}cQWtD$1e|@xuZ88^|n_}`b z=PsPf1@UpWD7-owkZ2JxnwQH-H+vdtJSOixHA-$Wr@&oM$$pA9cN6p+8OIZT+K%S+ zsfFc)|G8k4w!EL4!w1*M^DdTSlok}k3g>cXHp4h|af|64n%^{7G~~m}4Wy9ItYG5E z54yOgMHO&Tcf^m#?*R;QOQKO1QcKH%_G8dxc>tbjkO;x$X_9eopsO$0$gzotVj9AU z;%+_pMNMKoXvDLfnh>c3%!$oNR*Sca(4&e)gwzorrPgiR9c*@CmN;92MI#r0>nPs4 za>IsDj2KD$fvz~bOnkzkn2J@Upw=&1b?$~Y{jNdEuYa#XUyh0 zaC+!!6z6i5>ahd6HeW%XLpc!4v+EdSv{Qet8YMZa71kwPuJaZ^U4AMDLhLgKbv+G| z?|5Cbc?}lM2j>itG8z0-0$r(SxDA$6)zIaJvNh#WDZz?&bf^=YaRSp=n(ZHwO}_P~ zac-J?bl*0zXUZ&r3BEHH1Hr8jxLN3wIavfAdUlg|oT8{4Lb*1;75LleIou)K10j3_ zuar^=28^l29*i!8kZB)LX$+hZh9_OLb?Wd2q%s z$C-M)lpP4INuq37iJY-Tx*{z6l5l|aMh&7)iw&W8d1Pefs4oCk0w~C(p1kPJ{ul07 zmiZTy#a9{V8w%|kv(6viwZpSZ;JG(RckPySi%Gf6b3klAKIevw31sUKOzQ#K{vV^I zHfEg|6#H#u+JlOy6cI!uZ*Y91R4rtUT#^HRTWhzWr?GEpN3CUBxUa3^?*T?IJ?3?s zS4nq|CAXT(ey_h(!bA)ksY*&;|BN{;^D`MtS#mrMRjZIA# z-HZu8^MhNAmx~C4JW^kEivF-E{gQ$Ck^$vUVuaNiH?WQ+Kn(p#vDE_al+`*vpo8!l zrOXE0`cp}>|Ck^oS!9B-s$mN>&6=5u@P^JytPS^?$y&N4Cjn_ci`WcIT?gmaN}`g= z0@O1Olsex^9Dz+W6|xTBwM&zEb~T%C3)M4EK~<~RS*sYA;YFgePVSJc@BQ~ViL?S0 z%qzOqhb+FQd!cS%4l>RnNDvsh3tTh+lTZh~jtB`Z$yQTn% zt8dO$P_?x4uA>ArhtltRoB*`M6>O$8@QOX)H;!R@m(a{Xy~|jUUW*h@6#k_aZMDA! zr*$dl&WYtUx3|l4l*#o+jQ_$-pGX?LB-Xp?@UU z&hSAG^8=OYF7QGE@>+u96HZ5Av zkwu^HJT?F_bb6F%&mCT5kV*4w_V|#?kAraah0jO#B=x0jCwFkv`B%WF(O{WDMqLE3 zsN!z+n$#a71MCpxF5c|uVP`J=iE6U3C|8z^3(009aA7xkXKsg<*tiK~c%ot=@rsf(%Vrz z{b1&BB@M%sYHMve&~{~@Mckdcw!TKIc~zz+&z_s_o2Q^56iQp&CU%+ z()}?gQQRIVh!CuGfiw{r8QH&Zq5S1DOtdq5$sfgB%3f~)?H!T2d7iY5FT`hXhyKKFljvT9TBu1&>+igyat(EqWBM# z2eO%XP6ZN~M#OlJwddN0!aE5t4^{tBFpn&u$+e-i`TDh~^1J=psrqtMIQz`GM^#BK zclP4oV>&Z=Ws$q~u#6`b*&o2#}VxB#kqt-3rf@E(W*zQnpw$GbUdrfIg|vHRM+&JY@u3D zadxCEP(~!uiixK>5^RXkyZm$6E2m4NxwJV|6=9XQ?Q3fmPy-?y;z@Ao?=ACyTr(wz zoZzH>{a_&pqVo#u{@m_^rlQ$=VQ~?)Sdvm~R|TyK>QYZ#c2nJxq9Pe9duLxwH8vGy zGr3_6j?JY9Vrl`b2(1X=7@^882n};=JebFo^Pm+pj#0Fn;|eZ%a#^`q<~0Mlly|c! zQfXhSHH%ClGiwq>^=de3hA82yTF?nNV^4n?Z z4e%zOv2kvIZCzmO4CLghl%yVdPGWg!BQAd7>_!{>u$msjt}%p*8nbp*PEWl4E(nEy9sPO39im6fB7zD4Qeei?48O4L9++NJ-=8j4W5=d=<-5{c%t~(| zRGN^Ij&`#Y=cgg9NdFo*xB1DC4*-qND6~xOzThkLQExy?OqcZ&G8@GXV8*0ARmC`d!WVBb1}VD~*eh@j>+WZK)WYr3Er7=4UAzAi@9 zbZSj=y&1VE{_N5_*_36ppl-ElL zEHwwl&!V*CV&j!{^cCjws9WRP4(nWE^o0$5QA~(*Dc6qracqS(K<1A0!@8}pL%zM% z0CmE-O@MgN?@Quu1urNxUV>^4^9N_%dFox;tw9I@b*@6T5=EwcAUsg95~1f&uZ^Gc z;^V{a(LwmZ`TYrpzXU<-&VXb$DuyBs^Wrfq<%?7U`|iPrxq`OP_0N3%bm*+@?$LAX z{{=IB$%6X}49tr!)?xfm$99tMrvr!In9cJa!&!^xKgP8?*YVgOTM-}XIDK0o#kr~H z5skN5q;pAotDZsU-we_om-N^i-=s@51#kK)rsSFVCBm(jX6}i*BaOjv?hg7d;20-R zBhL>xm?7e^mu}9%@iEl)i@6Q|D-;fE#2jqkx(~n*=?|M6P`DPA+*nt?Hc*)yaJYs? z5BZ1*+FJ?78z@(VS67bpB4TEUmdV5TM=!wmuH;h_8*A`blM7Y@UFT)-NsANOy#q8e zlJ32o*>NIf&cwBV2U!iY0GOciU%m7w8OdvPGk24s0JqQ5 zc!6(3%=e;e(jFz6g2kLfKWwzy)W5%$ejMFvOH_IWRP%R z$p305c}3a;|`?#o^6hz`md9(|DQ+FzcWZf)n)W< zhVdx{3c>~?5F=>d0(k)WB@{3#?yX1~nJMW8&Myjq@wjvWrxZca$`ul6%=%{aY7BIA zrFxhv&Ip<6=9Oaa3++yZjp2=9`i+g9x6jP+siR*Y`DX3UAFWyLJHF4|-n+bC{e|BX zb1*9;{e=jY!G|ck$NsXM*FX@lCx&OxuRaMw8j`$X2bE+w6nAVWvvDun;TBRpK|?Mm zyt!I#L^36@n37$R2bp9&Vh5XKJt7C4WIYlGZ)ASoCMni088Ur}y9iMIkX15|>+Qqls4iu1V8S~dlP=;0()i3{5QDZM*`|IstCALgLA zOv?j--o1*u#Jj)Yzgv6WoiFZ2h6KF|!Nyia?PbuntrT*!yt9*sAq=L8$H%K!R zrJiXm9pB$&hs<~RWP`sGhsniSDYRT0(rnmV136&5hC7FBOF`IGsVt|e-a*Pw7%vXh z8JcJ~XKEG(U2D;?xX|z??%9}bZj@+ID}cuVwmBM(I5c7DspyBv&u@$>Nmccic6*Jz zYF;sGn!W0kq)7)qsCwUU2sH+b4Ro3PXys?fUtLQLPtLt7I*~)bfEm5*gp%2v4r56l}k=4j=LK%r{5e{1;m0HO01>@m_$sy8FnCQDTt zEwi+#;U7E;l%T>@Q2MZob8v4KB9s$2cmxYYH}1RMF@FE8XL#Q3_RH@9dr$@gR#+1l zBtQ_wlsW!Fttx+e9kH4-^)Q9VU~j-fgyCXAmWZx@SzG2gIQ_;vr%3gz$#HhLIA}4i zyH2XfWIEAUQK{ME<@-R$5q~MMSP-|L>vsb^d%`NG^zn34)U{{i%U?^17Fybzd;o61 zSoy&h-Xv&Siu`jtWYyD$qowIP4**}QU z5`dA8UMGz0MMO48=U52`xyO!eU%G%#hLF&PdY!OuPlF%mUAAikQNx7V$#dRhR4cJr zWYiO`@-%Xi+K;G#a^D^7lNN`Fdg>eO-U}zxCJlgcTbDBCxJ=%6ZWA|G(TtxeAt6?u zDv`47n37(D;}t7)nJ{BdoF+NMPg%EBk05840NBlu)HA0~53_%#LZ)hQ@rVG_EBIB+ zEtpE->`bd+m=$^Vm$p?XSh(s`#vn2E|8^oA(rfAGsz%*u30%NB<(`nXcP4`}p zu>{h8uEd4RFV?)$?TENf>Rim!qscVk!?o2zpF_YAg18Rb*m{&GJbbhKecx4i-ZOf+ zKV#~>fcNOKcDJvv=Xisf3v08)j=Pg#B3EOBRhA(DjEWm~=0~k+J@Shxbv5LU)tD?l zD=O4f&R^sr$Vy^rMg)r&!@C}$IR&_J>4p-BkSq{}9ZUu+|B z)%yjSO0*~=GA+URa!MqRc5qW$hte~OVp;r0pRetE+suzkk1NdGk+CzsCX{=t zGyTf;4-c)>svq9(06K@1BwfJ-tLNQVz6vAC&4`EH28Zbyd9{eUB#*d47|d#9C1X_q zcEgou1crOO>t-xz934;kzF6Jm4N6bXj};yomA(~}Q4-LL{9mW3Lm5@Jc%b`&9ZdNKF!QNviy@9-?W zaWzhI7_qZC1@ii2lu$4O4rphsk#b6B7h^^@xb{-IaZlMXYy|t}#{;I**{p>Hc!yTu zTy}_$brs>=VLrE7Z0;Sa#nC(gi*UbY=vRrhR6UabeP)OcaG6J6iqj)!!cYaM(l*HX zMx{<&mU&8UJu{`W`Lm1+^pNy2Tcxz+Gn#q{BX$~UnBr`y#?*pbpswH_`r^Hw;3a*P zjG+31WiQ;E`|vZ?EH{VJb_7E8@K%YP zR&vp*&~5YM!C?zV&IVX6P9vrEd_~hSO z2&OP0gJ~u7@AfObp%&6`%83>!A(*V`HX7X=)CCOH;bcWwM|uEdwT6gyG7@zt7u3{8 zJv)BfP|lQsC3*mX#keQ;=@1Xl#BLYc+Fp+QDx};BTMKs7I|z0_h7v30THS?1;Q@1o zQ8!0P;e)P}H1y5b#lw!7M)3g{xc)@`7#~@M&A1qDD8&o?tH<)PF*!fQLI7Y{_>T!ja8ckfScvln&U*SkW)BBGID}d(*$uOiJJE?tGkAXT+K;|?=Q(nT_8Yml3R#v z=}j9wrTo-L1RLjTqqc(g9FT5t{|9I96eLO*ZE2QmyH44*ZQHhO+f}D*+qP}ncAc_0 zb#HXf^zDw0nd!)gjL4VFmy8|%UTg35*-xjBtW4cdW}67w8%!XwPDzjmPVZ$p2dx#k z1|&B~NR*9dHc>-1lLu%L%O|#6IvKTGj?{04TzjBondgx!r?so8Ot@}?utojrU@!nR z>Wn;)*T9)H2~|lw&~>P?+JCS>?^Etk2p7R-^Bzz8M$B;={SdEl1?F+OEHmcpUPj3 z#7e;*e7r?koaQ;AFY;~*OALrg?0?--)VPo|1E<6pMjswq+(;=)Mh8~8c>XGVz6BHp zDo^uVD3rr?!O&P>|14xdA3%&gg-oxEh15C%=xvVSe;R&jRI|@*!l0fA=c<6DZVN=6 zYG#MI6<4)J!(fJv6}F9=;x9D~NOTB**94+%3fJa@)5o>X3%K?tVb^eQ9!=DMCZi6; zMFnQ1_%N1uAC1gD%A+H-|7#}lOwy^KbCkdn;+l;hlD3T=>=JYymVuoN_eD{v;Dh}d z(Vc%!H^9L^fylRSg)CNUdJ7|~)91RXQ2vYDlo=stBlt#X@+_E%T*}a^Z=@!Wy9GUR zZ8?oZ2RLfIrzjVN5)=}<#D~b+!DFof`;zhDlD@!KLAbwIf-g)spO%N{IjzfN!8d+v zgzQ>qLmp%Fjqy+)b>3|p&{p4;XCH1p1eEy=j-%H67`Y&KO`28PwHKTDYd z%vBk7wC{W(dLYH9ZZ3KF$uKqMl7yCPRZ0hGby9m>o6hYR8r4;mW0(CJ_!Zv!R`0*cqRnrN_&eYL0LQYz=7<5mAk}g1S%` z5b|sy$Cyq{jWtgyuA~%)q;y-G&`AMXKt)jef;sta-Rxh1_i)(3f1}U1m{N{445?N) zI&RLVw`RLJ0!2lWna1zzQ;xFPXl2O(b}(&JhN9A4FNrbiFm_mPcr z2p^c!Qm#}bX|_HpW~nxv zu|TasiwuI%3^o3hQZcXOj_IVR6h)Jpr^YhI#Vnzrweh(%jsHYjn#3YLG)zD@Uy#(y zN~EITNSrh$6rqsllC=vb1=;`rGn7_nv&EowY-mD8KkSX59LpoRZ? zmPr*LW=StBDpYK*asno5kO13HXo~K}3EEjIsx^b-TQROo&=m+Xfz=s|)HbnqFDc1z zOhz{m8ljMt>QFu=U7anjFqJH+DtEVv6VaI#f9jXcFCkY(o|2?*Yv|LbcX38vywN^7 zX&b22W+5v|C_lG?k=+H0uP~mfra3eWQ4*^sb+gXiOYwMO-HTxvJX)3ptgW^OLa-1~ zv~1#vOx94UO`gh_v2itS?^BbZ0;}E7`^WvxLor+`&D zRcy``s3NUADG!Jex0y#ngNev|5L!`&0g|m9 zdrRKZm+jgbuQ|CtBuOvZ6?o@T?=^>Jw)#PT9UeiK=g7^a$uv!~SvDLt8AYtq!RQdr zJUba(B_f9pOf7J)=FQ%x=|NCYq ze@hKItN7n;% zOl_s>SMt+lP7jCZq_^bvez5hiCuqwY%^*pUIA5-^81FG+(%Lrc%7&I-OW_sRW+IAD z9MsPhJ*6UXo|TJvYTeDxZsoq5yXBrCJyK6f?{Lf2X9XQ13%kOO=TtP=6>2?q)#eG3 zZM}E@N(J`HI!LHfBOtTeaS8B(gEMB(m6`crBiV7~*xFMr%>(-40jH>O7J}k;y=3MSx)N{U>67 zAni$gTU8*WNqm}f8r``ip3#1ZPIVXt;D?Rg={I|4r3z`Rj*{sD~Q>JNZjdjJ*;Nc{RO-(M@Jq+ji7`MO@D1UyQ(kI)Ify{# z_8b#e5M@e(3ho*GwKb>h0mwg%FdthT*zHw&^5IKD{4k3oYg37qv6hJ}O|{EJ*@<~) z#~+ur!5H5>f z!Ph1pxeAigZ516A_}3m1^kZ+W?B>z9%rP}T$k?uEKxcM$b7mPcK9Dec@AWS3m0`T-;%vB{fo~FC^1(zo z5W^)z z1l@3My-{2*v?H+9yv(jUjP!>KKS)`n#ov_O$T=nkseoL zDK$}eGPsbIIcJMWw3G!JNE#FfVy!%EAXHinNsG*s7b1R!;v|zz+thyz+qQ013!sR{0Khvy}|{W zmo&=TKtM>*f?#0^NaP4cBvT|bBvqtiVryb|tq5U~2uh@7;wxetVoUL*gfb!pIYYdN zH)6EE>f(lo5yQkO`lsuPNR#5!t@WtZ#Ua%NW|cN`V=I537#e2!QR;C#*>(*%<4H(&@>j z${4dGE*lzEPsu1WYp8Qsz;|y5sFuR+nCT+v5PPGo*ckA@Oill8SaQtp-;+n;*hPRK zLvjSXeC6m|U$cTu4fZV@JvDutRZQVyTsah8-?h7eVI+ZfaBcHG<*ehMxv;t9&u_1s zxE(5q^>(uD?W|wjHG6vh^WlZxsZ_aXhI`NG;HFs{T8y+oe|mgtZFTMXVob1IosV?y0{i;+}=L1v3y}Fo9CTrYdLM|@7eQ05v}bc@qYnIA5n2f z_6o!`Kfiu37>vxh!sRn)Q2UbE;q5T7g`wI%Vg-ZF#@(6U6Rs109L35YOKixPpt1VE zOw%+JVhpmhQ;+v4Kf~j|gSd{^%f_;!Mu~m|KQ!n-W0M*0Hkf)7{RKuXAgr@-B3Yz~ zi;M(H3jL&sVM2`_%Qujq#egN}2eYyN=E(!sGicmB+4a{$!odz7gRq+6vg75aCBPIY z;mmt(pJ7y8$WV;iD__Ht4V?9mVZe(X7vb0`CaE)~!Hl8=)11V-uz@tPVSAU02Oo$8 zbD*RKNkn%Il7l;)PXLt~@J>hE0&=iU%diW)L3?xY+*Wb=TO<57P4}@UKDt28& zNkM<0jB!61ETsq|J)r0e_GLg(jYG3ti&k*3a%cUWx0fEfE9&ayh=wpJf+s`u#l7fW zks!f<4WqB2mmz{NMh}woW5mF^go=&QF#3mY6+29bZaXw<#+|%2DFj0~o^#uV(@&9C zf_`fMqyAk@vhnie6(r<{vrpuxMa&*pUfG|7va{53j^Te%?+g&FP$tr7#HJdrU zG-dNU9oR#2QySbnWKVtff&F59EzfnjkIZY%h9sQQtE1rPJ0T|!u7<+L1vi!otAV@f#~YV z$^B}Fo{HD4_G26X!)3N>DH|(^e23uMF|SXIL_|aklc@>u)o+mX7UPtzX4P=s7#euk zFVD^~u3y=B_!BT70~MreX7F{HP+0#;Oh@D-C8QC!!Km(P${M62JDa=lC0#HTN&Z9n znZVt|e)}#1FMM1AuHIo2S)#6$Z2h|>n2x1gc!sjiDbfl>r#ho-l1gb-Q{Eh@`{hg? z0@|cHUzxWo>06wXl%>d#I}v&9b}kP!X^1&p=Uc-iPB%w;lu?U>ui=mn1Alj%b06u( znl)TOH=?bhY2nHiN@#c(Jc&tjj+ny%y&2$28buWiVYS4D@cSRekqc;6W0H&3vd#Fq z+HD#(8Jr~}*DG@iXM$zsYS|cQ`mdr0Py(YNWh%u80KzL7u- zmJI<_$pvEXOCe5=n^?(3|$iM{JA6jR1a(w z&kD2vs|l?0{;IwgW+!f)Y#Sb;U`UFP4de?G8++S4^3KSTOMI|!^hkHq#Bm56(uQx{FAip`i1IUc?wd3eeCJ))2W2>9A7P!T*x~2(}I)VVf8s z30ou)Cb@&sgvVo$InYF~M}TxAnM8s}bV$di{i%-|@#M>-;_9nOTqA?<Q*R!1YJZ^+6I|&FRZ~BQK0BpAZbA` zk&O#GQ|+RYRe?TF5qKyDYfgRETq-3o({!~spS&`lmNZ2+a`jw7nDXKEQ^Lke#@!K? zv{qsupHKB$O%=V2$X8sr-Ws1I^zTTW51%R zGjs2=6?1`C7|?nO|2cjj;D@{1EvjLEWVX*W9PpCgu?wM|2=9Gzwct4fp`Ho<*}o2m zPY<+m4D6?j^ZKWvP_*yed+)&veV^ge+9lxOKI&)^tk2Rrsv_Ut7kF7nbnfkKZqW?f zCrzzI48$3G#=0V#HIOzZ5VXeoDl-GBlIE;+pK!<>GgaL-{eu(@y!pfyfj~=}C2FCL z{TE?KYADrmb&yYnoh6|oM&5R;R9Ez;tra$?Q-X}W*%-^k#{%#xTf;@CI#=}31oY9( zOhhfJ9MQ)E@T*&65gvO%4P|aOmjzd@D$qAMZ`IzjWK6bS@>)d8+^^LZItHn=!~eTdgG9D^O7xKh^by{a zhguBg9G@!h$8+To9OnEKWsWZkRflFz^wA0WtT)}|YIM(mhtpOf8}xA(YoV9q%(X;q zBZj+*=JvKz!z+(7HGnwV8oIcV`j6BN5 zbmMQNqp7oZm*i*yrAZ%q)dxxQqYdck7VXUb-l$x_IK70c;sxVa!vt>Yf(bc}<%Y-9!&R-@bP53F(vf&0LxZQBi1y?v)_~*Ee zISRH@d$0nTTGNnP-f%Ov5_(rEeRxhGHW$gj7InLZ2Qnro%6+%hFaw zwb)db21TA~hU$r4=Cu^m7yG$g88>63-$cq82xo>u-I8;h&=L~AsC4+x6Qt_QAB(aL zfk^W*7Y)noJj>9_PSC+8>3#eCM{Yowv^-|!OPN~b8G9f29=g!WbZfMw{ffyv>8#~~ z(GCJLPZM>ygLAT0fTf23K{VJcT^MP*N4u4xd|en6jbIb*AsE-rz7>mli~_u;=d2^s z-;Z2SyyoZW5|*iu)fv)p0bU37GdCUMX0Byt(5mg1OMh|ZhMYF+wn}8!eH_>2O!FQQ{0PhRJPnmdN6(->K9kZx_IjkVh7r=Vt zK;GL3XRF{n${??y1oV0E-o+5NGOrP3tkVZ%>6FdE*=(R{XWkRF7Vatu6svz&8YrWx83=wJ(>oc^u8_Ft9;Lb=y3Lyoq*bfHcdl8rDU|4Ds+cGwtEjj-tlHLVsSrKnX`5%xp$bX~s+rzCQyRz! z)FIDydEo&wRm>U99Z|{*&Kd2wrnlL;B|H3cNN>Nk*J!(T)@Xn3xVi|UP1W%^a9Up$ zh?sp9D z<3I>`%Ih-?-xtuw+1S&(6~K8X08|q~3MB|}BijSG5}MKFuEO!3?RQ}>tO?_~gZl>( zw~v53Dv&Wyx;rf32N$PVdRO-Z2e(0I-^4o<|HISr4#7KHbqjjpuhjtTO|%8&2hDey zc!bWqp*OJW^hNauRtIszcCZT}yZRy!+B>MK7Btlo^eFaUH4>0lE>YrNDhb$csy_Sw zH;qKe`FGsh=6~{4vQ=%AuvJieZ5uqaT0kU)v=H;fS%^dQwaTFi5Rfu41W6cLo@`Q% z0=1q)*0=Ls-9E3PtC?sH!TtRCBzay;B?w?w>X^KquQ*<~KeAH25_`YD59I*d?y@80 z>QnkS?}(%j-)jd6jC0Y*;#Xp@*0xmRUavgiCQ_$T$ttm7 zcUXnL^p(BxVc-F}0bn#G*f_D-UF3|8`??_nHUdJ23NP0CWJ4erR?sPhig#!uc^i3F z9y`YIj!eMpm-zB)Mi?;aTw`k#NS#=mU-N?Eu%lqH!bTaGcG`S|4r7O!$-BZktF^Yx zZnJEFXEFatUw^oO4i4JT-b`OPJlGG`StUZB3|*yNz9nffMGB<=eKD&)s}K=rZ}1ki0A$L!0tAkPiBT(O9wh-0z&7PPg*x)^|YMC6{1Mu^vnRlUa)9 z(R$gWMf^DCzLkBQ;9u?*53QU$Rq@F5lHIh4l&oYaM}@7gEtvt=L3ltPYzf7>VDK)_ z572<6@Fp3Ofi-F?*at&n;T|G_jSF!PuMH73#Dm6aXe-{w_MWu&x^*@;|8C3~`es>Y zjDA|rSYl4qYWfH3CD#(~>fj3C$(-K2a5$hEPulbIw!%SwmAIWh*OwBqZ=827O%X*h zPfGAE?BviFuUpa)H)kMMO0sPit~v)FDC!AyNL;(1g$O11h%;l{INP5?VBEw1N}(ax zCaQ?4%Ni|39dY@{yQ3jvp6I`{Gk{_MIdu-;gzO*)8p^0djgph)4OonR%c#ss3RsGW zCe`ULB5BL2qVY8b=lsJuyrm|(AD2!8492Bq+7#*ERwB6rV8V!hogtuxba!P7z!Gw9v z9sg*;625S42*PBu@W&C^+(?x`bjSV)`yWJpC?o`Y+EulJQ$zfHui4k$e?Ec9-ZOs;BWBEZXKxYE(DlM&Wao6{#0) z=O@(1w}81+QPwghe30yM(Ci3=cX>K`Srx(sz>+;`-Yev)uQ+|mQ!#b8Kr>>!0}s&D z*!WM}_|k?4Iz+*wmq_8Sw2D7DxqC9{n1wODv5>^yp#Qbth( z(c=GJdH$O)tEOZBYvq2gq%_~V9_FgcTC>F`vKB>dsmqYd^vU+AUWqnXw<=uiH4*4c zTA3MH97|HQ(#|RVvC02zl7~vVm!sgbvA~g+7W(Kz9>lKYewacYg!#QV+-i@K2}y{+ zX3usSUv?g{f1GN6K677q0qpsB<>Qy_;jK|QV5{p`$knaLE*!q69_07>_w&aFIpO7Q zZ;9ctr|wYTb5Hh}uy~_NRk#Peau?@<%+lYvmGtzt=q%d;Pu<;f`1JPnrLcOU(bM0d zl=MtuYs+6bXXzepVPPj7ko)B6D-o zvX%3OP|J+QUxS!FkMVOev$EKQhOUl`Ef1&>3sY=3$WR}{kjE!SIuM(ywVk~O8FY@~ zg&v^1>$eih^O!8wPox<-%}-{rqA)er)2E7Krn=%=U$to8v!u|Kr=;AQ2Cydw2R=K`xWXiewLGn; zNcZcQMYb53OnX%7#~+17cg3^dGVz&ia*WznWy$EfL7k8likdKRDoq)ys|4PbO7sXx z$}uzcN>IHIz;>U}smrCen}AmD3!$L?6u{v6B=mnRk0`I#triL!6z-+1pTYdA&NO3N zS&M9OAyOhH0(z)C_P#w$Nrf&EieTvVoX~DvFpVstYNN|CUnx=za3an!&v=-(SAvsP zaAZZnf&YzkL9rx-Dj8%W>u*Y*K4uHn2tK?v~iJ~Rs;&>;mepA+Yv<_c}itqbrcaBb_*9@GdyX;C&Dj&S>VhLAJqqeAIcmhM?ca|AdnkU!K0Wwy2aL;iw2i+% zO6gm0So)eCSU7ze7Rz?)wDK;4+uKK%{+=8=*rqmI>(VvsWp{{++uPsC8S3#?5i6s; zh-ebx7qxrN4hZE_rrg7QdIISDjQ!wir!*sSf1C1^HzB_;8*s2ddwzJ~()Kt+Z5&0;_INw~XQI!BUyAj%% z=kMN328p0LL$>jZu0oyE2(i%`)%^PKWYRv-fXjuZ0^YjLjkq9IPO^rF+f#@Vor@TV zP`la4K-|`~w^5&DrIFBFYq zi&H?Phx&{HL)aP26MoYkxzF(Vq*x;sCbu^(jar0tf0)IRIT+HdQ6%0;A1{)?=q(~Q z0K^4GY@&DxZ)Dv3HN^bCsUrO(QT)`dBu6Y8!AMu&YG~@Q7h93Pdj3j7g6^eMj7=de`7*Dqc`Nl6fZ6PHL;oCS)rMRk2_BDz$>>QH!iL$>h1~6y z$$bR!&aQie70Q4|i`K;~PP+Mvg8R@mc5C+8xIY2M{UUwc<|aVCNTJ>TmMq2qG;8)1 zZvu~mghE2PCp@Cjn)UV5Y$2AzPDPF??es}U_Sv&L7prcIp1uE$g({s@eV`;TGMYhl z#+<~C=|ghOh&-pxIm{5{3ytX#NyH^eLFIs4mWf~d(QAWT5%9z>)k&eJAsLEDWx2$o zY^N>7X=@0PjYD87&M8Uq95Iq~6X9nw4KFZ*HhC37Vx?XxaXz%PC+I}cK#m;cm_=M2 zM6D5OqC`lSa$4`WtnU`LCZn`IB#u@KD!_AR3Fm=LB2OX4j4tRREj1~Lt1O0G&vfasV1psE#6*$LJSS-$A^+zvubQm3$=wV0Q! zOadxBnpYq&Msre}Mqaqe!9LT#KxhFUp9Wr?*Q&h1#>3=ELzhXw)eFT+K6QmEqgr@) z`nz-Y=U>&I?6N;R(t6e&y_It{#6*#%%L|1&P0$B+qJ7b^XerRz0{02b<;Z0=;O}L+>H00zB3IswHa~SE%u-EdaXz6EV># z9Jw6zy~}NTmi*t4keJU+!LXjcNJ!5zzgkCIOcr&4;vYcb3x|k}`UtM%Inrls2FW!o zFOkndBS&!Bi3{&40?9Jk3BJpMIX?m<64BGwft#%r6FtZvH7ot^V}=@~0s7&8y&`4H z5cJCUx4W%CSDYdqE#%0b;ivmb13j9pVmx3e_&h9jaR3X>`yCfNQtIB1>YE>Hy>lBP zsSi5kpt)Rj`_~j5JaF1Uxh3#ALV88b!9lBaWCzGj=9|$$#w@8q{`YNBIjjN&A7v5n z3E*%GJnYgX-2AK78lAkJv*~TblnY4Ysr8g6FoewTbDr>DaERB8-H2-8R(#WR0zd!5 zGOqIP=2Huc$8PIyV?^?cYy97(``KDJTNqedc$&zYIGWly{%+(NnF!ch{0HDcLRMKs z`oAC^ic>z+ki~ux4??We5m6AR6^c-bO9+4S3Pc8l@bbZg+(k714Z;}<7GgZNnyi z(|y5jI92e7$oie(&+$z>&lqD1!3+z|j8AQ+cjvaxN_=~MjOGH2$VVF@#u1I_Q$*4l zAJ^dskf|0hSBY8}$-rGYj*ag}#Ky?qm$p{khtM5Qs5!b*;^&UnFK^ZJoHx0YF3%22mSohJJN`VI5Ck1E2XyP!Fnk&a# zL|b=sP-^4ov6z<>8yR=93hFHJhC^fd2{}h>1Jb8oXrbBSi1NzGdm2~L;6z9pL>T94 znH@(GbYo>sC&1B?mKt>FX+DOElQoHg$>*kvPcl7=pkZB-UKHcdKDwr*NWxKs)i90E z_p7%4FjcTl%aO3Hu}?)0q1(dzZJn-vv5mE^R2P#VwX~!SCX)#c1eMHk>Y$uvCeKor(gY)9MkX%|TuFA)XR|q3l_>UKZ_iGMROYR1usM-htAL4HOtg(_m}0 zp%ogw{cyOAd>=Yj^d`+MO&BHdk#Uz@pPn2NTTO1#pMd`J4ETt+PR`lG*5{x$S`xqw z2CLnlf^z^yyWbFSDUO9ejM+?yOC5TI2_&?Ao7--9#zSBWgU`|yT=qv>p$K}WsTFfX)`-Am-t%3<(j%aw{jR#k zw%wG=+&ku-kR~^XG4iQeo zo9^{;mr$-ut|zcpF80|Gly5}mhY7RsLA>}ACT1l%GDi?pJ;1lxqADq@S!Sj2?Q zV;~`*8{Ukn`@TB^R0u|rZ>!}z)AoUpWCl?aHhR%S86@*qkc^x{tpn?|D2m3G=qQC>spuH{e;-Nr|5g?M+d8P4mpjTYh*9R5 zVchf&e8OK4hyX%bY=hzjaN^)l;$T=Q2x}xPdHXf#frRb#HuyhFV#@_8mxY>I!z*Gw z$~Kjtmf<3|)y!MPhh5;qtir~+`ca={B5V)$6WY-@E5t?v*6(m9zI_|ZF|P1Q`^Q6wKrxIo-p*} zb{)WARy-V67Gx_FT~($wjwKTU7V6%2Wz@#Umcq0Mlz$&zGhdiGD@xm{c59OFpWxA8 zLYBfHs&|f-##mDF92mnWr(KjbeUzrQKw3j0@a8T%B?|&xch9mRg|K5bIm2x5&0FG~ zTFn;q8~1rCkznMg={wdFLVPF+D=8fdE)jHt>QXmlBI3!O!HC!c=;pHg4;CZN@}WlT z@|ZDk;)E#EdXhoDX9-yJA!dG5iwajpbWHQYP6<;r;Kp(JepCF#JQJq|iSGQ7sGs?c zE*(No)dj=IlXX_p&Q&hklBnNLmx+!=P*UrM(AUGS8T63Y1y-n}03{?CH=4*DJ`pfG zF(1w=yRVHfel|az{hq|`G86)3n{L;odMu~tp`5!=SU=SiNbC2*GJxntS=O|Lu#y1H zGom~Zo`7xyg;f=VxH=uNx5cfYfZ045{Yp3emMuz{o`D8^(mR{eRGfEw{|W{7D)a-7 zeA2RQHBop|q7Bc$5Z*XRcT|3i?riN-@-NSmU682Y=G6B~MLv~z=Ku`OU5uHQ3IGw< zNl`mj)|BbDwjI`CP?^(&)JK(FS6{IcDkI0}{;3+K54E>KV>8>0Nyt*`DC{z0kN#?VyE1G?AB&|U-i z!QJ*Z@b7Yc2S^;y$=bidsr3YI2;PuH^U0k#NflSlvX$_7(Ri!{iQ7)8sm(K$5k}c` zER^LJva*QCUgzFXz`8aKo+Tr;U}kXD`{lOX`m(oxm_4NxAR`3Qxni(OqzEO*L~cP1p_6vBMZ7U##|$xRTk*N2ol7jAzV1PfHBwda+m zwU-~?g;M%=_5;LMSv$a2gBLZJ(!z@i`wf_6mXnApBTLNRg5x36i(32bDwR6na2dkc zL8a*Os>vqr-}bU6G?AjRiGy3I8Pl?n^JS#R9(!u)Jh`#~8y@@TP{eYgwzG_$=T*wCu45&A}nHi zW-`)1gm(!(rWSJvp9UD)^~9Z#2~5dvNRfV?|&1FDeUC!JmBQ&~j`7CtN_E zI5fZuHL$Maj(J7@skH5i{7QElANZTD(%}iqZ5M3vImMhgIFwA-YbG zo(C%V4b(6 zYAQiO%mtei+e(fBkBb_pWU-L_fmLe6G~_L~ol!+2_lj0Sa0rA_Z`Ac*Wc8gA)LH18 zk`wMNvho85xYW3RA|X(2{~nKYC$YaAFNzNX2|yyagA?z7NiYXaYodU&cJ8KxqlGa9 z#>*w+BIVZCx_*s>bF~~!*A4G5U;d}-!ksHCdV$~wL6E&BMlo^oS2?J7d)8b z*r4^W&9k!Q3OUtx!*4oM7btHM=Z)OU<2ve8`*Tvb?LeM8U@O|-QDlj2$jDuJB$~`6 z&=W!R&^oao?=2koYya74H=nE|h18VwFsWx5#E-wtK5CqVk~uV=R0IdkrDhLWalH>$ zm=yjSJN5@wsw(i$y8J%@&y7&cRI%#BvKD(8v=Ay;jSHlU6zD&i>`^9-<`lB$X5l=q zsmN?0?hV1O_l9?7xWk8O2?qiiC)|MLn>}W;>wy>jT7Q8g)ek{hyD+ZbDubhxR@$H@ zl^btsnlbJ|0vSz6!W#of5Y$kJdfb!49g0W@!7~PLY;2wCZb`HP-AVA`*1U>?t7FGf z)!*+cMN8mEr6>Z)?_g9H^0WF~WRsq6fFkPxM^NH}E|M-U9OZ2TnkOJH`9PCW1`BG} z3JR3y#sccnsNoU~WTPMSGJl>telClDtPSB@JAX_Ua7BiW1>3}GiZDvqH4i*xO=Z)HDf@~4;(NfZsYMR}3 z7}kMdtDE3eDQZVd1pCSA1De&1Oa`dD$Y;A(9z8#`%;sQL(ae;yz@d*9(8W1+!P=#k zWFw`LO48qeR$;p!f`StjCjHc+1IOV^8GgZa20a#Eqfr6ZU|O?BEd#cmeF4Uu z0Xz9t6J2r)E5El@mV6z@b(%bO1vX4n<|$TSVNE|MK_Nm$}OG0lDd4+mBG--GIy+o+QEZ~HFz3;N>y-}##M zF3tkZ&IU&2HYT>t0#5e7!CHzYrY4RizkU4w(z|1e{Acej*CL#EE+njJZ3PiRzBZu+ zEMsl%E{;%)>Hs0sVbVCh4xaKe?$q>@m2wFG4fw5akv*QnToi$l;pF&oJ+(EvwR&~E z`}6sR?oTHlX#fddFh+erVhp}U|+N0HX8q~$wYZEYP3fE5zc)13gTZejmitC zjRrk+{e{YNaQFC&G}bwlveeerK?}jnm%y}-B|AtBFveq-38dHfQ7nBjpcf;8=E@v1>juN`z)i}55(08(vyiW!D9ZEN$?qMV4<{xbpQQiU-V zeGJs#ZKzqhsE9RYtN=reQ>I!l)m5~Kiq18bN>mCQ`NadX9ZZQD&tj4UK`pab8aRy8 zc>GI5Z!7gy6~$2o4qdy-N80|5$loC-t{vT&$xo03qNLQz(jacsP5niNzdey z*r5{#nT9~It;e!w#M!#7@d%yN{RW4PfUah`9HyZ*N8=E#q(ffE#(~L#YwejMlMO50 zbiZ00*sO`L8=Lv&?gXhuw#{i;k65j0W{CLqg!5b|N!VuLCi5hkYfsjYS1mI4ZSQNK z<~H{x=*DcQMuMygvr56yNXbded*>ZqXdc>5_UIdzPyYz|78mXjTwJv~;Yc|bVtbKM zvR8#sINybOs^MA1D}D7HxJfM}3-1ymm_ttXXN(eBEMk}4AJZ&@vuGUp$5xJ8WmPTZ zGXq0)lhE1Oe|S6xk#D2x%{aK(&$F^m?D=p7qjE!*S*$ee)Nxt^mVW#l)hEbElxt%4K0-Oz z=hEuA0*Pt{47&l#x&Vo41!$Q8m#U00@!AJmkbcmU1^|;e+sJIVDz%PaEywNSEhm&~ zUR1Gs%RXMWp2^L~O$Zc|?}la#wwl@X--_=J(^Maj0yCKZ~0Q^6$ z=zr9$7Qcb{m zZ_kbc$M-h8-)Wa~6wjC_a%*($Wp}cDv-7djz3cUG@0a5jA8uR9_kLFG+Yy6zJHPpP zln?${G`DFr?*$IO`#Y$K24BxUc%Va#XL@Igc4Kg-i*{pl=L_}<5Cz}x`Zt$X8vkyd z=<}ZfAIrSa)(80u-pk_X*&+8QNK_*=@A!d|_0Qtx6BBjL-oBZJ_l#U_DV_a|1e)C4 zZB*4=Q(Vu`KPKv)gHjF8lwmau?`bi;mwAqmF0XrJWKUHB7E=sQ){F&54xX@=yR~i} z@E3}rA(VTOccTw*kE5u#U%FDnC@Rzt7<>$jSZEm0JTNd%&|rOkH_r?CQQQ#xlW-U~ z;T^C4l`NJ-qgMWjzTFR`jVd(uxU~ChR=JjHCo8T(8D$3MDr&`z9M-!&FHebCSaUtf zPSx2ganlkaP3BR(w}y!<$^Opsx3nu`7N?6LBWlicX$cFFw=t*b)X{Xfg=Iu}lWki3 zR&)-1m@~#gOz;lqP4nGdRZdXPLZ!S7p-~!E72&(6*b9m#UlQAtu_j-_6p6vl-<0Kr zj&d`i(0B$GrgR2?7ESV8IIH2*{eExCVL0G{%(06M$kmT6wEO~fTd0njUlw7P-mEnF z5v1+G_T=%XDRXQ`J99?DA59zGqZ7xH960!c%_?4Qw!!BLvu0&Hg{7m!&~~3q2V{!B z)Gmys(U+z1KpFO~{F5?9$cU1fnM>6G&&5p=Ya58sDrik)rGwWq`qZifeadw}&5}OT zq;=>PG|3ZrixbDJCrR(@3*W*w7}j`8eZ!`Od4EXJZR?vH?*|+Z0^-}8OMNwYk zWK;SC^^_|HpQuPGXcognVWLrRjt?es2cMN1B*Qgg7&=6tDSO7|sGT$VOp4K!Jreq0 z6Khz+mOtXY(}II2(apcKz4+jN@fYJS#3^GHQzXaMV-#Cl3tZ{n_)SUj<)^B6hUluC z!(BYi%c;C$erXqHa~q&X>CMrpY{-Gji`sGos^A_Hty{S$zoUL>7Vpm4sd&b`E5GAL z?JnY@XdVOQ&uv&8^{GsuC#>bJEXEJG^#7|HrYYEey&Fo(NsFb`C1vHB1!MZZ7<;E+ zQM+YXaAHl{wr$(CZQHhO+qP}nwr#A5wR--&cf>g-y3f8hVmy3!9iu9%Mph=L9;3V@ zz~g{EGZQfC3#gZuS4Sr%v}<4n%_M0$P{%2Q2ZvvTB}tzA`k~g5p?NCAto*M9{T$$^ zQVv?Rvee0T(BlWC7@@QUt9#v_xxwElQJz&$UBmC^qUKh$qw)2G;`R>=3O_j zvAF^iFB;!bMTkwS9Wx0EhX_kdF!vNaJ2_80)8xtP-I?95HJ^3>qkdfpp*v^;J2Z&V zB?9d@P7EoU8UnSE_u{G!w4m=q_XTa;t2L%nR%B#=|K*?2UMlPnYUMKNl4>TXG#o7= zX~rr-7gaI$DQL-}TS$C5r!DBh|2B_^O-#Ejuzg+~KrUUly09f&h?>VuKh;fsJ+y-R zXsIrq=N+d!g|s*U_%fpUGj)t%BBXK_8QKkW%$tSaw-DZEK73~_EI`gM9*FQ~5&lv= z|1uWpSO-5(NE%65E@@CZiKWlHRsekf5A;PbPk4uL6dcTbE|tSaFu#1&Euzr>=+k(8 zYyPn1P@l7Q~F+*&-Acl$F$5TI}x*SRSoBW8{8FAe`P}FqqYvE-YJ{`SnXDN zNACY{hKvIWFF|6cUnyF&gckp@@fhoFnGio>f@&T#U95~0lShf$9MsZfZo!7OXWO@Q zuxVEt1XZvqG;GhO8Bd9%wi;>GH!E!|y?%kIwYiNw9AOvW7nRZnv0#49 zYeUnqQZ8xBuPLJ;PO~9M@oF~2rBlSefOt4)FUKj~qgG#}7pFRm*C}Zg7R@5Vy^vGe zjuEz$Z*Lq~F)76mxo1E2csHp}s^H~JjwdugDB$KUH*cz7zr>l_o(%Sg;W0{Z1f0!-~odkRY%jG)D z+fu9kjwtwGR~uG@oiM22B(~mIy{c`MswyF#p?0_*{aVw6eQUc4#u8g~myF9mMbOdW zINXzp#h?<%#&H(V){1?PyAsAOvxsmfd-nM3p}~R0{j-#cuNyJO6RYd+u!8U#Qtq$I z(D-{?S0W*Q1e!Tcq+_nFYhklrntX7Jg){<4xh)5syniL4`V~$+a!K$ar22aWHJ39c z2nRsagdt=s2YsxfSyW#Gx?fRro(^?CZhSo;7qzytpba&}Ign+3c;udQM5j_AZ5MwV zxeZ$RcQmV9TdGcQ@=9xb+QFe|4mgHdGE6LaO)NQ6EjbpB!YXHBvHfS0d|~?7uv#BF z0xj0SlL`Hmjg&H-LA#qgqs1tSeGrrWCkud?HXs`(ux&f0{*Z1qmd3=3mQ5eSQ*#CP zZ?_HA>U$`qS26`5j%`<(H(W4Oxt%MY0Kp<$c}Fqt=1I#+ktY7St05c9Cy~d(4abDl z5bh`BUh$g($^~0+l_=LELuoC0t5f3F0^ZaExFUqLaMNfl2R&;sX&iR#wj;>3kSHVM zw8g-wn&yB<=gjxvOeFKSBf`lWE&9B2kh`pV>mkIsL$`b6WC6A_V(s<=6m23C zLg0T2T#KIq_kX>g{!az&|JQxa?jHv4Xr2_S26)w1!t!P~ay6!+B>DU%WC;v1F>^5r z{ENz2qxN~~jIHS#E$iOorS#TA2wwl({yX4h^z1p*9{XiS8jE};r^$x&EKi5m++FtP zb%%uS*XJi5fb`K6^@qJuhL+B`2#1s@ZxqP3s;NQ-3CmjrbvWCK`>_^_a;#4K6 zs?4^@xkfc@E$u4nEnNy4>us&ih<(c?SQp9LRalp;1)t+vyV~YY6D!V^i$eI7etx$fZ#4oK)^n+G&>Jv=~>jy{U83fckwKh)E4+ zZn?+{4TAMOO`7RPRqxD>3@-bn6Su`Un5_6dFhG#X12+P7J2y1Q%$~UNMMyh#DDBo8 zahW7|j+GXpP-nfOLP(ak7Z*H%i3t@nMHbt56+JYn>ZYjb`65>BlYSf!CT~cocG)a_ zBdW(@MU)Jgvw7B=d;gVSWd5~B@A2XTk7nlDvKYy3CiM#8no6g!`uUg^>g-Wj_C!T4Y&Bi5vJk+FefhJ(qd{e&O_8jUyXB#%>MD8mCti>)Hf z%k71}99f0G^0Q`4-qYrrew$k}1d}U%J8?)Inkr&m>l9h+5dAme^MW135XVdQ_!UWB zF3twivjr^9GZ5oQl-vMr(po^LsV4|gH%pibe6fvKL_lhh?n%P)gt)`b;Pa8<{6x~}LHLof z%eYWC`W&IEbe5O@)LzSnv+&XvYCD!?Id>&Fm_@wn?xo9$amVViFy?@ka!4zgl)3Xa zObTzGygl5?Ca`7=3U}yb$@mYkf$0Zm`hYbycOgn~EP6lI-24-cV%*DbcH%E-DqHhQ z>__I;q%|qOkhy}WUPLR)FSP%vOaBQsw>a-lRzD(4lBoaT;`jd$ZvK7ooA%oYNeyw# z%lhix9lSL`!do9aOK3a`92*~q3znBY)tc&85JY@1^icy1bqun_@%}bi$J~t1ck*Uo ztD;ud1l(v>#U|eCSk1S`-|S`I&zU86;y7}7M70G^rl*gkojaE|udlN-zdupou#0U3 zp4ufn&%)uk$`u*8`(aVso{=H5hlo%?BS26|BZgGNiIR{sP2=_L)r*iO9?4J%BTbK# zH~Bzuxu*&WC5Rhe>ZT2ohZv}8>8+!Bc_t6oeO|dEPz0U|1^enA4hz(j#UwOS)UjqS ziWAfa-}a-E>qL+)VoFSDFDg8?CXWvdEL+aVp|3Mk%Z#~t^eCIWNe$D^9BvcTxvO+0 z52a3|cIO)&J?RH#zZ*w%XZ^k1N%gcN&GI_BlVj>qo2WWb^7JG$LmGK3w>les%p$#- zmFZzVlOcpkP12W?%0iJLFQA}AntlZ*DweN|Yqi1--SU z(p_>au|^f8rnI?mCA9%up-ieBc78JE(wa40Gr{s+t?RkRFQrM3-5RUv1=h`wAYBSA7&kiP)tDP)!eCj`qQG1`%FdZSp%WLv zBn5^VV@H%?hL+2A&Rj&Tx7#?ScQIC>2?G{Hri8{o_%QdYBNty zK;ywKWU1GGZUAAr=Jc=|nKfeW$h?s|*C%}I?*w6fC+IGon|O*8scCeN9>U|Snum|j zN3Bs5EU0)26|r5=#O#*32|m|~-YtA$`taiwLi~yJoz|-QgFCz8$*2Y~3az?~efpQ%pPY zqi@#OO(I}VAL`s?mQ zCO=DWg`ufR7KgZ_zu}h;+a*ywq2?k4uh^Tgk7ZdWU5KbzBH5y0L(L>0Y9r;CygYLX z@=iq8uI^!9S9!=(Q0BQVH_5|t;GVqoo6lOsg&1@eIb_9QT0UyV~f3QJ+9sIngs zq#6}576xE^-!CKJH41sG3Ey^me)NrtX~&pfAed~#wDuSG;L;D&EUmHwyD-#pHA7+C z)OAB}ia>iCGBF8a_jdz`I3siNI-c%OJPuRO2c6HWG|vTEg?zzy&PW}TQ}c&4(Zil= z57tLhduxrX-F^0i^8S~9zrL2)92K;Wa(_kID z2%D51sMkTvW!g1A?^WS7q+FIazn60ZH}k7lL4T?mb8GoAW~;HEnG97GSXp$^N=t>{ z0s%7NE#cV2eVnxJpnVpV$V$Bjib|9;c?uFz>A-#C$!22V4=uj$OuH-#)8GMqu4i;LE{L zn5j>kAeWWe9(;>dxQb;`n9dS$hY>_~uGpI#L&Jd9qx?!vaQMZL z$0U=os*{HI1-XR#v<&y{ z5;MdwJA{i-mFds<$A$S-aRTDt#<6>r#Mbp5)8zhfpEA}qY-LLg!OP#NR;pLUlkPRkW2Qe<~YJ_4+)%Pv<~~~Hn_5fTuntk719VHgpVO-)z*yf z+Z%|pPFJFv$r+0&9>8t_KV2=N?xKC1$Fqu<2hw`UIEh`rxe>RV+inEs|!2gxPMSoKG8C)0e>koJ9{wIYK{BNygC+B}itpCc? zIqERpDkd0z``(PsZtY)P#z4{R>C^4OrlG{k-HNS^`gt>8NzIdHZ(+Ag-ljeoNT?(w zJ{PHHfSRHin;YY;rHLD)8JQZXV;bR@mKq!7W{%fB`p&d(Z(Z-ex9-L~<~(-Ke%909 z?zFMLPVWQ&R1S&)$^z0OjM^239EX&M;+5hC?eMJHCHt0a7<(iWcd89gcL~*ZDhGot zkhMw*(L0p8VOJ+dpcD6h1ib<9oDYN&9}Q4|*ecs0@Ei_IC4QF&##N+;XdTbiIG!C* z+76K&?~;+|YB>+tfDxZTBL<*6z}&6S%EjK0J(NM zutj;>kAmzi-k$;jsR~Nae-sQL*f9fXUm3!xj@jHlb0e+SSA82qOd)e zC?aX((bU@_+Bc7U#R4L^83UN;&>DxM!e4Jf=V#znuJH!_V!-ln1tlVyg!8i+5hW(f@f zEc$&}jF2GsJbYtQW3yKPch#%Ri2mq;C2@(u^-J=T?1Azfa%dxcvv(&P%A6)49KjCq zA|e<%oGxzwW24rc*>t$1jU}~Pdiu2;mo*hi*(8G0l{8Uwea#@a=pm<+ZV{7o1~nQ& zx(zz!S5a@OIAc+T_qThdyJCJpUmobJb!_pVXtu{W=5~huwqWWLv#YPEl_K}(4RSq} zgC#|T4CV>4XH7o5yN-yLqG_)pjbf)wkL83QWD^soqV( zkmqs#IxY-2QP4}eYBFl_cgij80YH$qj10bD5u11HJBZf2I=Z&l3g~X zfhR%F_By?~j6w%XbWAucvZT?`90?+v9?jRXRvr|H@sC?$bP&o%#z|g-(3oE}N?k=2 z?)~a$$qSSicKuGp`Tf@vlvYed{4X9~n!VCPS`G!FDD36?R+zVAYa61NnDm7Q@R%9N zOweFjt)wK zFmeY7syFU6)|k;^b%`St2V?IM%fFjL&F+;@b3>8dGeYx@G$j6jT*(j7nJmlht6}=a zoH2iiX8z&!ts)3UJ087L&oTqW#?&2_!t{;fGhdGd1fjEfC;Ay1tSPhEt*}+PH-o9$ zr$b`Q3!0_A%-(4k5SEq$1ue0{nvP(Y<@xJp)WE-!HOM#kc)=f6pB?3#EvAGICpX6x z_vluE-C~xvaBm1Q=7_D6jt2h-P1e;{P)zn0Udl!)I*8v_PYhPf-;m_46kXp|im^i3){9X^st#F+J+K`ky{5V?Vboeq6) z;xQ;5TuPI)(m+AN-6~x{?N-a`HP`=|Dq)z!Yx04v$qR+lsM@I*AplgzCZ|psyC4W8 zNRFw`!@#+ly7@KK9GzPWC-V6$uf&XPN=9!uk_7SFD!;~*P|s&~HDg)?8y9zyYaj<^ zM}~%)Adk&TodxFd!S-k}*&y{18CVbo>p*%!dM-lBimZi_5nD$`Cwp^ubybzaH#9qfEPb%bl`kyN^@OWywe;U zf{{W=?evR#WGPvaxago-3F=5x{p^N|Q6Fb1bJi=(Bx0(0n0W+&39780Q83?1kmRf) zzuU%dlL~jLnPse|*;JQP5pVwl6ASslbO#sb9Gn!flqagE_^4*6iPDM^k2Ir&d2A*mX0nN>V{kW#eJR^nAu#W$FM#q*|{*w z*oc#OKiNN_Iss0C-c~;HrmOm(A>)E-*Z-K_&2}1*S78YZ;FddX#03V)t8(B5TUo6b zAOoSqLV|IuC`eafhPZ-@fRS6X!DNU~3E*X``!g=)@F!;{oziHtLKdcIoU!aRvl-+Y( zViS=+afu!D;+>qKD6e#s#pN3!r=)-sr90$C1!rvhYFSiqr{bwmhO*m<3UL{;jvRA< zPI=yL((680W#TX^d%{Pwe6MmPXDJ(NaHv60+9rv6Rt*0mI18d1mG-_W`@`PsM zCVAA~K6LYv-7+}cJ8tD zFSls~AOfO7E!YTwL;4lu0#&S2kL+N4z_>LhIYlN;gZS4@M15<0HkM`Z^o5LgbkPEa8E19RoH>KvX)ztuN)0JD1xOUuc z?g9i`OGrcDO$AbK_r&&92`)V}OjgG>^prys=L17R!4!9dwE0J%_u-}U(<~^f;iC0n zHk7V%2PP6`Yy_HfgVxCW4b6s-k84DX`juhyv>K>1h9uVR7(Gmaxx(i}!Qg^8s8RAm zNAh;T0ag$@wR|q@;EEXUJXL$drjQp_QRW{l8wd~|cnjIA`xu7ok>BaV6oUPRYQ&#c z<-O{@)n`V)e`5-;OUe>JkB5@oq89=zJUjvzLgyHI(_T$aL}!Q!cLC}&5(8C(QRGgHz>EX^!ip$4%;NUC^vh(p~G=Vfz3Ri+}w z(hQRlv#ClE({hA&@{l{{4e{u`^kn=#WIYQ@Ls5#_$R=G;&t$nrH9nmLy6%Ucp(wy0 zSiC-EE-)ZdxY<`*XJ!p#bu!&p5cH{u|9j94wP%vk6S?+)$<4gzcz|=<0eUyg^7p?@ zss96-O?8FXTYmap%@_axKQf{Kc8+Fr)^3(&)^x5e)>a0#bgEVow*Lan|K-B?Ke%Hp zYM)O3jH%mFYqT~-+%U@?m5xeevNmoD%PyuOVg(sZ)o5?X+KkyK;#Z%vG(K3WUDs-7 zJ(^E_!kjE9=ELFA6weXorwd9I@SA-AGkx_#57Ga7`2pI`S|;4A)RJTjF!8=!_jvW) zb-ms4oSnz`^*lrRXWe@uPr2JM-41;go)3I(c;{m{c+*Rs{vn6q?mrb^#WQ>|V8t_d zQeee1dU9aR3*S%TzEJwQw|M168Zmp|V10W!IxBhy!Zj3%(;H4(kAE}q4uSE2J3?SR z_Cbkjba?L@J-xE-9XMqO^~|0@I`HfA+x~0(YcG0V3&C3}pCm&zmSn7KE*2VAMou~x zl|7wx+FG#d&0AH98nqcjLvEV7*m)}TC7RKgvazQ4*`r7(B#fx9xjoL?7HyNqZ zl312{YcgW+tK0C^Wez+zG@2vCe6g}N8qKjOl7nW>a=D4f#@N_KlvTyol}qTAV})=Z z(ceFL(PadC(RfO+{I9*uB5eB?&F~R{;OBvli0oA0YKa8)5-Xtp|T8BOb(UqOAmU;sg z?53sJyxhs_qMX{xE*tcWg+uE8MmK<{lEBK1k=R_KmkMv5_R}Cc4n^J}=V=mXPi^{1(|QI6S=L_@brVas zj6|u{LM`H9ldeu_1zZP<*kMH%Kk%*WAa45V=_!yI)98gxhUE0UXakeh_#EZOPz$(; zOjas0R8=yvyWHEVtg};@1?%#=53)>s{6R{6Slo@Yc7R})Q5lpP`rlRAOvXS99DVRz zmLw=_=FfTi777AQusRq8mHb4Vpb#gik~6Z(maA{GOZ$fe_De3lSxUz~RJrHXCNwAG zlOj!!r=iUz&XbQ~%C!Mp-Uo0_1qlN0#N8o_5V&a$y3pg}``^~PWd;ebQ|H5y5NY=@ zAm$D^Am*ChfOM1X6MCfDsSiG{zx{il*kvus9U0uPFH+(MyU>ft4S>jq+6QkSv)sh) zg>3aA_rctV*?(I8;yZaYllIHL&@(#CW1`5|vhNBe7A5`y>O*dC$n7b% zG#Ua%KCf(CNgnW-WdD$qCJ`ec91#n+vPu*Nxm3QCb~Fs0o$7mZfgBRusVNprc31kk zR^|EPo}9BSSSnRhWd;LIbU6XpDfnEb;d0rtJlT9H-{oqTf+Lr9y$VQy_z?x{-ZaV* z-v?>~rEUsc#uINB5Umw#cc8tiVVhFifFD*R;lQilvVz=3>{nsg8nv7W0}2CT4_qwU z^QoM6NKUFcsy!V-|HiK(A(&0}?E*2S>n+4EqYDIiF9x_S!dvFae;4_?W`7MbFX0Q+ zV;ncX1TMHPc=PHmCx>u|*lMmeZ=c}Vx=+4A9v4|wFT)*U^xR$b%xXKB1vu7)Vn;wd z%6)4XTM!{1Q1d|BP*TwJ1o_kRfC`T^!|v}f-&dRR*P`HhMuPXU8}Vn7%m^}NcxDt} zQ`kbh<6OqIgll7K74zQD8*_aK1oq=1{PM);ErH%UB)7BgZbMQSe*m3;;@X9H#Keg+ z5vCXR#c~6OHhQ5OwiwiTkC_#XPkxUw5s29)qUACyUM!~~9o87l@mSBn=nSrRyPeGJ zAaJ8a;X-$LJ0@@8UPY!WbO1>(<9X84W$K&A@e6C}1G4zQYoeEhA(8j%FFoV-uTur< zPRg9X51G*osZ#;VE;Pj~`vNT5rSakcs1Mma9C8vcEAOBZKT)llWUH*|&dOY3KY}Co zQ2A5In(`+96pNp-)lKQAlQroETCshr@;hr&MUmw+@UiEFAHigvhss&6r@l`INw)Ch z3ZrD7f&a*RgSg=jFppNRSx@cpsC#)hE8XMWD!4869vUUY)TZEUi(9ixjlNh&>mHcp z)!Tw=SrBd4X6TOpCgvT%S5@S?hOiexS2wnw`p|;rsX0lk1{ta}K2or|3qqF<{9p8N z_A^3Cfp8oV?W3UgGX7x?GzP5T_OfuRpP$&_?z1AwLGWBr?n!WmdO!$sUExpy;W{GM zF9Kgy_=TtVvY@^vpOn4DeJd|1X@T0aa6M)qpH%aIal>o7&T9%84|75h`t5Z*at|$5BPsxuguJGN~eG0z9}Qwo{-6^~R z4gf%d9sq#q{}u%Nn~13n;f*x5;x`wz8qU(%0JH8-00AM$Kb#Q7pZ`chG!+X2N_L<= zWknRP77H7g)J!2`vBWBov@5gKY$27@N+Ba&Mec^=iFe_%_vYjGUF)m2^kypdXxS5G z;v0~+H+?(%wdZHL+xzjA(p0>wb?RqB9#;FBgaI@M8-^?r zUF$*9S{jq4=swyrO{grCZ5xt4uDF@sy4?V34Mk8J+Q%a+=SQ2EAm7@xN3vHPt_^6p zV*pt&)~uB65(6{fxvSIb>AAx4LZJm@TZfvIC1vN|`sbOky|TZc3CIWR%c%zCQi8fd zKe@`U_+&5Md8ctm{a!3=bn4T@PFg_SnW#UT#9 z0-_UQWzK~fl%u_0tt4y&<*p|34Tu*tIaBGutt-yGsq;~EK?yV5vn3FN$tcP3ukEqi zC%)3&wasReB6rHkM&T!YtjvE?DRq^SPM9e%{3YC+qVZKys%Yj#2%m2&;&daiOZgeG z4plQcAJ^y1h$v-}*b%PDjy@k-97LNb@?=K9(ve8YkgR)N8f$20mA#L76>!eHvmy&h zN_tRNp5G53&^~s`2G-&#TxLExY2M@9*~h?xu~KTLKxDQJu9Th@x7&60uY5^L!bt^1 z&=k|{B%J$(u&gD6s@j9+DJFTsE#+a6l*1WY>`WjeT--Vgj2c9{7`=l^>786Lyiskr zGSVcKt+&cH8*8ZBTT}8p`sOVwz4;I~_2$o$CSJ19? zZu znFgnkJ0*Hif>S_)Vj!iw+Ituvn0V_|QZhyP0r?=I64@||5jXvJ?)Ge)=BKm9nY^UGt`A{C zHX_U^y-NxOQp3r$Ke$iteAJmxMJ9z|2XjO9gu{j2!30xYlVoJ#|re$Y$d4;0#uD z3>IM(k?>BY9TkIQn_W(XKIASSPs%uP5w&MeP~j@Z5tL{W((DK~Rx!3tVLC`KGH0AoFNmk&Ewrl+- z)Ab*v>)%V)$biR?Q$VO z+xmQSMWQU|2X`!!H zm~u3ODJEm`)AnFGkYO-g8g5hJp#gWHVK$F+et}^izeD28i}(y`*FJuAI*D!62kOmL zQ~i{k&|NSu!t`F$j%|7}uN542IPRiEwcK9j8dqEC()4fEp5NHDz~E}_#ixk0h_$eD zgimG;?ypdTp&gX&ol)%`St9Rt*-i9f?b9P`)q%Tem5-P%IBrX}424uzT>|M+`JvS;>TSf+;Qyrg|4n?DbJ48HUFx zb%w_!bz^9Z5MHigpg}n}%w`A5qu|oRiVOX=L?Vglo~!G+3QrC^IEExm<7Nqkrq(tn zj5V31x#=j3bHAIS&=WP5E6DpYGQB%w1h!mK%@~auHLiz6r-_#?=A@T2=yOn>cui;X zo{1KZx{G-QED~HRlt|GIMlNN9gVg^*cyMaVdwbb)3Yvpk`stB3RvGOB{2izII5V-$ zy4&37>^eeAP8Eb=Mej-gtyH8zC);5uh{~HsG%|9&I?6+(3bz2C4RTzE0w3BBAx)(L zP`*t&0o1@vE+L&l&=57@pp?={H7c|YgG`l`2W9YtTu=f@iS!%!5G%Mgs7xI&Xw;1KC+VI_Vk*M3Cb zGi7XS3wtvZ?i47*)H#4XcnyHNEL{6j73{a8_Psd=SY}|}ASi8vR5^eupPYRwAoZb| zCBoR?^GM3wlQAYOIVU_#P2MahZ3}@MK(zHu-EGXNbtQ)`w$xVF)OS=dCpSM&H`H>e zvx&A8h|XL#gt4AD^+j`Q?ETS2wkh_KtbwDWhV+w2b$U;OVe8tTa*BO2<4Zw`|r zY}?Rw@E!Xm%~aa(S&j48{_pWrKlb5=Sv&A)rUn_nhZbtXZQ{diodmRVf>FSSW7-IN zqzHSrq3wiFR5(4&ffxzT@7aah(vEkIf@MRd zE6~qmItzCx=Pm3^M+-80BSRrf+}t;p2RyX6x>Si#Sz%G8?(f4K9_?_uR6N}LxRvG4 zpA_L&Z|@wUukTnC4Ar|wc9qkCagcJTtMUcL1ASwI`60?6{b=D6XcT(h5SIrY=Am>+ z^dFG#`&NM(ZRSUG^iN8uTV&~<6s?GXZFz=oOv;0hiP=}HfOv6~o1-0{ z1gT#FEmPQoS!Qk@@?tB{iXdS?f0xvu4q-@|yc^AV{_P(FiLcU9qu@`d2){C6bMuV1 zQZN32PXU@i$~OJ)rN9;Z23&yD0+U@^5MJ_F{y1&U+#@)NOtlGvH9o+A15<`q80MLo zxIs}Yz3Te+@-R54ooS@JuuakqYGiq`<7qAe6|Hzw)c8e^;;M@Xv0Y=tO=MHy0==op zEC~B18v%O+%XAL|?9$j&1GCe)}m#u)s5v8%HP3j?r=x!vx&q zsAerg6q-bkl}7RQ&A?50ew+C6)RT{Jn+{op$+#Dy;Y7abB$$5_uyGsdxN82ZW%bXP7(HHl%TeoP1*iA7Wfe>9!Bks{B8ox3OB?ajSuGxR|*-2WvXmKey zl^((6+8@C=AK9x)#m9m-vRyY*BR#P<7h+2w?TF$U5T+S+1*yW|>Bx#_`h+9}a zr_AJLoaGl<$e-(B9zms&SH;C^cc|f-#`cpC?Zduyta>r@sGR1Fz_J?sXXyNA(A;Ji z5iD)5181*oGedTg?kPCJY90x@`=dKuIMy%t?@Lg-K|s1e4ignj|CU4>&BxevG3{xY z9(+Q3Yd*$E^wOBJOZL)S@d8W!{?4zS5@ZMKiMB(57^8Wo0r^687@!vs#7Txx>F#Gs zfdt_dLN$ZE(pWQa;efkZ)d+pbKC18B2}NmuyBdyStezV@JFX`^4%Hme`nr+VT7Tp? z-sRx;U`o%*_aYZIm4K5eK(G++>cL7)uN37T`kDV-hXjrq<<>@C7f@&K|lb2Sm6J_u6H(Zv^B66u(q}{ zGH|xAvz4`TwlKB$*E6w@ovpKhg{_I>zxn_rid(iw49M7LtsT@8juHWm5>O(L3HZ&E zz>0tnAOts*!p#;>x23Z7M%R{ZNWc74Do_H!c>Uu9v9rj1gadwTZ09)4xSL+*^!EG! z&h@LJxo=bBhk77yiw+EihDe1T)X5nRD)i5vrMWGtVUM5^>I^SygZ{(_RYPsEOnHkkruiV{1lX^z1Cp4nMK z;yvSybl)!mm>UwpTXP69c;gFXw65cpVaQ65>23N@IKt5BO-s2|C6q5C8x@=zo~g{ZAX@-xMq5EmzNhQuqQiK*xdq@=yssT8>Bv*{TWlYZ}oeEn4)foa40ReQ$KpVC>1`vJ{Q z_NUi5J*%5-8GL_zzkuq4RY2O5&D(463-BxOOA4Xfl!N1MMd6ziI%g)pb#UEKrkRA9 zT2CAdFkpjHo6d6>I<7Ejh1##tx0%pWk+LSbZ+_GTx_We!_{uXrw-=*6Ii{Gfqq49{ zEz&y3tgWVAg+-R{te^{`dxYNAbKl!6R}v4p_eqktzdeA`MQ*_@*s>cWXDFqPnY6@B zL0c!_5mK)ls-yv>ZpadT%C}Y?-Cer-wqDsD4rt4sP8(f<(}OdXDI}F5a%}+ytW*;( z-rP<4%)KM9ub$Z~S)VG?%*3d1k;0^6PAfBa9rZ!4ad>IssAZkInEWqPE-aXtWcFp7 zuG8e0>UiMv4rn$qE&&`46lXY{x$;YpB1^6?IvxW{^?t%3!A}{3bUUo!`c+ob9|1c| z()wb8P%6w@1C1e{YVkc_59tL}?Q*6enI_>WVWM>w?$C%Pz0nTx4sWW6nOM|d)1vzv zoH2VHzujk&UrZg;LSKcs6p|^C^GzGrBJronhmGmR49pUIz%av-e`9HdP0+?KiLBzR zFJj{Sg!X?82!5~$;uVz2!E*+_BI(qPE{%cvm8Ro=Tqq;tGsS?LGVr$v?8P2Y)-G@b z5%Uh7A}r#N?D*GZl|&QMvf_TM=bI9r#fYAx_n7D$#dPW_=^!$vR<0#IUR@-;6!#Jh#&aqu*X;$XC~A>SuAr_k z^ktV?+6h#KnwuTMl$cZsfr={XA@GELgxm(C%JLAdi$WRvN@|DrJ-^Gsj+@vmjh~&# zF8byXI;K38l&Tw+1#Qqr65YMTYZ?lfKrR{%?@9lN_djE48SSB`@J}2y{5dNBtHr>7 zIw}(XIx8v4TaH*F@H|F3tE#LK5NX=d)>FrX7(c`!b^-`M5%md35mymWl~Ax1aZC!M z8dsgF6!NE8EIgs!CgpkxOj;(C zNgu^dCUkSc*rfZr;2Q|5ZUh&0yUxXlBGYoO+Jn%}D$%Y%tp=zwR^tYW zxUpo3b<8^u3S>B<&{Y1=yu=O6H?5LJvpu#^)1&u(NN1U4XPw4KEVQv4gWB%X7d@nG zUsYLwYCD^9R~T4i2a?bQEIKR4vx}8SinQL}>PuCZ^B& z3ro4MIB)`^NNJUCfq7*Sn@wjUOSaY56M0B&Uz|;=@YKms(lg1rBr4eMQiZ9B--t^s zIff;?*@=^*9@ARx#z$7(MnrLAtdQ@kqbk&z>x~M-NKkS%?E4hdJtq3na@O8qi7|}? zbMgr4es2={^|J9cY_BRwW%eh^hlB3w=6&{-PZ^iL2M*o}TtQ}EmG2@TpK4U|KdiO6 zl_n7*dzx;PUE6Zks%GJ|vKdA*urwNb6HrvrWJ6}}*o)dJJo2jyrl4({C!2M@`d*V= zf^ZCJkS__aRM?zI<9)Yau;Wg@BIW|>WUkzCy1Dq9}ezhEjSWY+{&M9^;j1 zO8ej?N=G-rvya_1W)SmQIXvDS09|}0|40NC@dUodTtV~V%ZPSvy~i)(-W(BWA5W$- zEsnpb702&)c4YF7LjS!W8um>v;uSa;QI9N3s+07?H#j(vXcbXkaN-&wd&XvcV7N6z zc}w>T%KTJ7nF`O4KB9zn1A$U78TAEhXs1^T%p|$A#fYE!TJ))wUY8@iZh`Q^X=)G1 zGLqN&W#_wLRBt-<0oCNyKs2rLc8EYyt?WW)an3ON1^d8w899(Z2vq-wVmx6&=&doS ze`a=X5llGwzVY7-QvXR}6KDhE|DYV>pVP_pzujy6>tu>Lnwb12e3PRnW4FYQoIR8F zWPpeUp4=Lb>In{r863$j|B_glSOX78(P6hE(>c?qwIK`tMMVrB2+Ze?7vkO(vxyY; ztncOe+T+2r`~CE`W(UxkNS+5yLduN<&E=CM-FdmRA?$L- z#B$Qfl^M#36mfb|A?xS!-$Cy+J zF-aLZklUoL{`I-Ze&Bdh7!|@JamU5|-5#<9O;?8!doY3MgItNTku8_TA+h25BX(OwRk_e5o5i2^YghgOfVYMfM{Nk^m%k9z zKlldtG5Dg4`gm-3y+Gg$%dw`$v_az|qC2b#L&fZz2NRw1TgQy8eHm_E`y8xYi2QC| zr<(Ti7J)KhG*d~N?El3#oU4BT|7Xy)sQxHg{J}TRApgOg;s1YY{5x7J>Bu1|!1J`x z?6_+DAR9cz$o$rl`f&fqVDZWr5*mg=8R_SPR_ljB*R^X~g+F0*A7Jh(diO*O@0WIr zqa9L8ki+RaVP1FArn4DLOrKYCZFm5v_0{{GkT7h>#VE$e#wyMRnj*hCY=aq)%GRo* z=T8{Q_DO}f?X+;wQV;0OMWSxICv?{AF$!76_Hzg5({$&OtlTeVK>d_s>x>C49=Sv_*-!}6GEf`@EAfMm+P8UCGThLsa%{~23*HnB}mh(|#h?aQeWd_GMOiUB=uHQ%Px z9xmlPMlYN@b&N$QC3MaPiUQ52NH5r3G>rA=0i~QUEk%5E$IEX3CSMM85=<%y5@^c2 zKQ!)EC_)f`61?0!+`R~iQ>1k%+3MVbufu3T?Nv>7^@D0W8}$&3#&Z!@uGkDR)>XkB zJAz!M)0RwcXrxxbZKNtknuR%y^{GEG9)!yC&T%f!mwhC)t^lG9fYb>1Hrr80DHo=I z3O62vobyE7`89D}pE);0!#`*Yj&mNJY7^iyM#zc&AI9D(IMcS>){fD!ZJQn2wr$(C zZQHipv6Cn6*tXfd@~&_GYog{?_3vaqmC9Myebh0=2*Qu~{4ZkIKeto-X9$Jl_uZ8G ze%1V2G3R8D0DDLU3Lbe;Xroi9$L8sz|(bqjE%L2~hAKu3MNZKjlJ{r2`?Y zZQ^H!FSaat-BSBrYWd4b7%WSlAs@w6d7Ime6hw-&wz=J}H#<-AxZRKQ{r`UA3}CaJ z7#yhms2<0;Y6JA~2w%zlaBpM_uWzv1%fq_Cxoc(OZ@8TwB!St18jg~aB-FhNw%h)) zY`-{${0LTfdZ@E=CCB4)+`VLRy0$`mMui4a8?W8#})2-BBa)CrrF8&#(6H2hFS)(#}Rlm?#Vmo0NyuUM3u5&F2F2 zmEpO;0c47;N{mNb)xgYO=WClus_dELI;+NG^>{&aidw)ACFW18DtPE3#LvFh@ncQqWv9F!gA)rHzF z76CFByzhKND^JO-hjchBLueI;Tv7#&OS0K4hu?~Mz5Cci4_djI;Ve77!)-ETm=u^* z05dlxxymH{T+0Vb?u3#CIiUlbe(Ev^cW+V3e}OP48JyZC6)`V>hwX9AZ;4Eqo3=*9 zQ=UEW2o8|N({d6=z5PXhK*wFsWC~B;=5q>MVsHXba(eQn_cISSn)wqNZjYgCk<=b* zW^XHb!d-oWyfuFL?$-nE2`7nTGX%3t3|p!-BA8kJz(kCMcEYyM0^Ft&WFDqq8+cUf z<(K8l&&@MNPCA%~S_SWq)49Q%+iLn5yHU6YbZjZ`B^RWY-IB!c_or_V?Te}~@u`@B zSoFo>wAl934{&QfVf!L9L?YP#XUr*)$*M2=yBI<0yBLAte}B}-7pac0#S&l)nYkF73x=5SOBTmy4FDxtf66Zc5}Dj z1Is6YU&B*Q+Ze(hApaCE^Jdv()$8ltHg{PG!?6KyqIUE*>qyHvuAv?w+cJnG|z}KrB9(D zGyF~(bRXYdo&Uya{|@WGDlPCFwTO$cc(iHp?WyT;0w$QVm{dg>DAUNdd5aHotl5B9 zfiVwT3>|1HY1(Ec`W8Uz!R?*H60ES}gg%fJN=O7D{B0QMEFe-Am7_OWAUBL}E2TnP zScO^JRsk%s@!ma6M!HGDBc$s2b*Wg#@l|2Psh)z(Ke?6)ji^ko9jvDqWyBp>7Yj;R z=+7CTOATdAs=Mfm1ZqgLFU(=98;{(%ZY3hQsdCdh_b#ccjJ1A-jpQ+kw73{fBCCf< zI-TRzpREkF=1{G-BB*T`UPql+qd8LlO)XM~_LbvRub~JHANi_1FgoYRpFCcG z{B7iB&9C~6vC8w5I$6gLaiv+LU=Ql4&Y~2hmTE&d4b(fdcGF~0DS;bJCp8;Yy%+?6`_l)f1lDLiZ>veo(znU;~&?mAgDRq%kW z-R z405V(EQ^%O^@O&PFQ5z{Fz4;-0r5{#8YzyF`XL)hih-dp^Mw!}fK|mPJ7AepPHTKq-z%aVefyEd0}U zy_Sw+#9q=`bNKm??E7g+k}^E>P+T2r%>&32j%iO4lJ-fi)Oji6bRnH+CZN9|?cbd0@XE!8Yrm{s93R+W`bt z0|=edzIEuuv83wS|p^r$01|6a7@ucg++^=-(h$3Wvyn_|`8yYI4 z#p>p~Oh^Hyc_&#XRJ`H+Tkd@m>i0fae4}^_W^W7m}+dxOXK|euWxIn}FtU+~p@g0K0X6yp?+y*v!f&G5dg@Im)>-FQ` z^1U9oq@FV zw5oN4?HwE^xaD`IxrGZ7v28ghDmxWII$(btuodf?IL)_1E&QKS+9>>#a@%)P;Oe)T zPWk`q&ix08R`+&6HAm|gc5_df0lTM{BvQy4G($qSph8u$fx>B;Fq3SSBo&1nGGl|i zoE^>lJ+ETbioNk(w}R1U+sbEUTNnmKxANV&U;p0LN8taFK6Y^D@#t~Gz60N!jMclha`0BrLm~tL@EATc4@OY9EnfN3$e0rvzj%ux!Y6sCEW#(- z#3x*xPj=6V%_n0KkNCy|*Dr7gVDv%i6X|6@dHZq4M?R=t`GuWG5y68M#^Mk+?nx{k zdFzUV4hD6_VAdQ(ACNN7Dta?B5mt!FkuSH2#J@xlkbo#~DM=1rW}%XNnHdpZ;uW?J zvQ!p+(0g!~=(7K<&7=*_J23O1%Evy(?1%8`dlTke<4MBCHz`(VFRM7`1KB199!h$u z#aUVrwfWDg(DFXJ#lj$-(#cSP)JRojB~c&8)4W&s@PxC(P6&z3#!huf8S`N=%2!l4 zm^T&3k2#gg%bgfCk8DzDM#tt$O*%*M)nJ&RZmFOdGh`9V%brCA!VUsuB~w|H#Td;4 z)8)NGH5isuWLoKAsl%ax!%ubPsLP1n09t~mvaJM#8?3P&a+!YT#gs;M;#x)^7RJ<# zlb^3&nY)@!*2lfR)0$McQ-#(5sV36LXvoH8C|6Vht%`K{$XL^`*G?C;!l%Y?4yoKX zqSnn&7dx|F+`CLa}>nLAABDbhUut!-6~N>W_SLXK1G zTD33HorDh;w?!r^&Q_+#XX zWMECI2(46(*Kr=hLt?JtEEk|*va8Buj3(5tsm3C!&lQ)i+uLg!r* zfwm-q`8VkiIJ=#&&@~FlQJJ3?Ln;eY6AWqF9uIPWHGEnb;FMS}8^==p>5r5kYEqHbZJ{h<4kcG1@x z!X@|(*xX)4@p@fz?1mDS6L(i{qrmzDccgB)Uwgs)14_XBN$)9MS+?o;I6!K&$rscC zg(=y4JxMoIx~qQf1l#-HmR}}{)UnD<>Xc9P%XP>O=NO8R0JdZa^{TXo3jEpQz7%Nf zcL!g!-)O5L5U(k^T8@RcaLfZT>hdhfFy)z zt$eA(0fJvOomxnuR5kbnDizEkJXO-3is-EiS5#J|+DxdD8d0l-V>xZ@jnR|Z)<`dL zvCmgx&y6Zwgl)A+;*@+&UnRk<39GyJ z4@+t;n731Mr)|~cKYOPEo_4}&hR%7mrsWcp9`&l zNk4wq6lOe5!xUIScfjjEZvfpuLJ8ue(tLVZ7OxMi>-KETY-oFQhqodfj(A1vAh+*R z1{MRg8M$nw!6-bDx~UKFl{_{A&xeD+4_Y_2<5yYWY(nq?)wC0MDT1Hl1#r|o8}^4~ zfSCY`j6@BUJ_;vDLhA<&fIYc#OsX!~csh?hXL`c)zX}l?$8DtO93JkZX z7`OvmPI#@IT@Gn}aKmVAYuG(&awOXQGi?N+02>zRn^D32IHNA{so9j&Q}bJk?e9O8 z5T3NXfrtIB2m77ykepfgt|Rk}>+29#dgp zrZJu|nTcqJK3FCv*YF(M+bf6qgPNV&BAG>&g?Sr$arOp-K(zJ_Bp!1XW1u^8MKPNS z`_Afk!ExtFZ^A5B0=8|5AI_N@ZsL(`nozBzkV&h#s46#z-U0mhP=-Q02emv7WNjFP zo+p%F)XtE@}Sox-gnq#70L63G%8t%Nd$yxjZGH%SHrd+=6 zODHQuxjjcn0^6S5^(}`vHK_EFno8<={;TOO>#c~n)MWx1!5*|n!S8))pFW{s+C$EL z{KN9w@O5@?i`O6$K_T3DFO%Ng;%bU}WLbTm;IL*0~rfG^S*=A)y2|xHN$u<2mSRxQNkFBhV_-)%%~zhW^pE{xI$N zDzv|zo!87LXsb>`-`kr&b%ku(6z@LLimwOFVXvw#I3O=hjv#>h!|R=gzP1b<@uqKK zfcxXGXhuMwwF#pee#PF#H_?=a1Q4v^8nUz79dUN(38c(=dIH-y@RR*H6VS9QM)g%> z^D6qBLNQ%gB+LHPxwn^3&v|y4AeT@7G_RCCM=(gaIRy9VKFI9@LSp}bgMVJY*?Ll` z3*+pFzHrXVPldk2I?by1!B|~%773)bIdc|SupA=w5Ph2^=tF1A8NZKVaN((eQ>zuQ z=BYsd*U-j-ZE`hg5z(4m*VAb)77kRVgXs--IQ?;RzNgQB z&Ktu%YslJfB9E%SYahf8x~2HSxYRzNt?A9M8DYyk%U)>hRxmWTD-PHiUk<%GApAo3 zPde-L4WH5#JNuTuzi|t{$LTo#_qU&{p|QNOva6Gsp|RO`B2yHmTdU6vwqM~@Arx>IL_CJQ|Cz65JL zM%g9(AzB&aYB9|ioCT!!u9VJsRfa1qJ7)voP^VNQWqV0NPe8geJIPMF3Aa;;%3i{L zYqP=fXfsKh@v7%clLrB#bvN?}#Q{xVV4NfFQK{|hBWcCHeb|AcglJyVA$Ncj0_^u< zLX`k(-VCGR*5>A8iF|uxjX;UPbwU~vW`sG8mf5LtT$-$XHmsWtbL^U$=I*4{2y{); zw0589H7_e~GcD-Z3|AaZM&J>bON)HrHQCI%kyEMB1}=h8>DvPR51CPMxzqRGNwDZP znrU(gY%qZrS1_9vNU_BS^*1*PLBw}RQ6u5vc-;GQ14I`7I|wG6okHH-Nx+zvtKSYH z(%Y5JuIdlLk!01&)7hv^m?b<^Pvg~Aws1;EKgN`TnIhXXsJ?!rIo2B_#nEx?`_6$a zkK+=g3#D(bcdAIU5j1Qv54Gw>qF~5ErMGNrD%MRIjo)GFXGq*x5FQ&=Xy{}Oi+Sp| zGeUkV&2n4y=3*_$ml)5YJhRYC?%TeP#&Oh`v#@~P{yML%FxG+QA^|EYb54on5vBHz6%(>>It{yVJ&dXtSY zP8;GoEr#4KhX`Bs)qX5&aEsT7%(1f@Sy0g-+bUgVkNJ!LDJTPQgIu2W2YxPT zJ03WR06+@|XUm!=7ZcYPN)+)@Z1BIOyHkBoM- z2iu6gI9MT2IZ_aSj)my~SBuXWo8eIa6ppx8{BuBA#fJoJSPP`sD*Z=t4W?Iq0k_4a z9IW0Az^jP&iq{MDl~yiV6#Orl3!h%_P2Dednq#C=-STMG(%3|FRjs5Jw^AlJJa!JZ z9)Zk(Z25yEc)b2H5J44W|0Sr_hbRqIlbCZm39*AXD7rBr=_|6Lr?!i5o7Qcz0 zCam(r7cS)bc|V}9cCHWc@Jnu?k8bKdkbJ;RUOW|cnPWeb!Pt#!fc!Qbhw#wJ45r%( zi_g2=0E0z_?I@$#oWsEv<^l~G$gBd9gW(uv!%cuxJ0Hxw!rPeD5$X^xHGE;z5TZC} zR@L&zOhR2A$LiCM@{2<0@U`<+FnQxXF*#+|s&P1cg}YS}4cUoURzh`IIhNHqT;UzN zi6^VFEJuEC*xpU-7nX-5HW)*LWWx;+=r0}K+u_0nvFZU69y$4K$AgC(Lz&dafbHa} zJG7B>550jqr34pwN^ND+4WZR5Sne09%vH|Kxlf&bh}1HdX~-*@d1 z8Q#AI_5b!({_9BAs(X5RuXEx3;-8wkp+v{47yA)6?#@d|9z`YySRpw*70<|7X_Mo!p+> zK49;{XJ^xUyZhyH_GZ)hhVzB@YlmVM8Q}DuE_L%fPu-%TLlgr*juvHzUeP@&r54s-!0*>Q=Cno?M zMvU%K@}h=~fvPbkKfb)4OZ#c?Vwu$iI);Kmh44Z@8CGJYd%;%$x!)Td`@%msduAe% zXnwOWK`gd*+8s9J+cV|oNR-7W`eTfa!l{M+T9YAqkR zts!UKgNJ!7;-_pGwl5}b)cH_=eZxa(@YpV_@uO&r?+>~sh$y{q&B5+6*U^N$xS+A+ z?INNyFYf3SM^ZRU?Q1v}h$!{#Gdj5g;x)3tHOTK|7PdJNEqHtP$+&Rlk!;=AFH424gxt|ao?Am;<>r4zVMepz{jdTw(0MwINI1Liuo z!uSc036NZGnt7bC8Re5Bd#5PA6fe>Ygy53L$C@Xnbx zGz&+Cpk$9>fl@<>hnR8~!-Ysf%j&7<`D&|SOzUmMnDgX9ID-*0yv0|uLYt}*85ONJ6XWs62ZMAni-g>~z83Oi}KrQu` zVlh7;|EJXfGy`LID{ZUu1BRDkaeotywj~a{P9a>V!R2w*6&rZ0UQxg0BeU>lt{&i& zV5u5Vz4@7}r);4Ij2nucXMT|rENr&nEfx!Cn=UO<&>aQTthLhgj6vPl=Jz?#w&lk@ zTKc0Y8dmZ0g^^y2TB4725|18pezdZ1lut(VfLbaH$9f8>7yy+>l1>5-x}v*&!!3+ik2L}=>+2RvRTrwQ&fLf z*{T?43Y|Vf$P8X@*C}X2!aJKXX2!jVlT0-9v!{s!h8$n^sAurmlz=d;)!u1I0n)Ze zAQnm_rkfic4brv{t{Yn_ndan#J*KF)&MeVr_bWEH(@)S%x>z`!6aOv zljPMP$*)9=ZAXBp3t6y;d6W#UGKcn#LTh|F;{=$IqxlXN+ z9%k7D-X8KS2?vWZi<3sxkt?w7>V@TvPkkq^bcve0e-fvCFIDO%`0Ld3JMOPQlATC< zuw4`6BTo_}hnL>~d(nnwgrO(jP~!vWwUE0rQJ5Cr&|xT(2p~0}7K%%JVkqEAnRP0? z-*uF(vBfSI_>|gc$U^Em=vwS^=9E6wMRh0Vcd|+%LhsI?+6)BdGQae!<+TQRyF(PU zc>=dWg3f$c4pxp(-CSnipW`AOb`sTyk4>!8@TgTlucL;snmDZhA4oTIo zKC2T_)t3(|on)0o`$qNPVrdsxx1F$MKkk`Q?uxi=s!Ik8V>rzZxHa6`Abn6`B-Bgn z2CG`)A=ZH*Le`9_hC^f^`nf8bOx72&xO)IqmN}7uSy*=>)^#I?Zst!dNpHeEz1V1V zvl|a^CKEV0EAqqAC>h%*Q>>ft6$!O!tbZ#1J!M+8xLY9$+J08IslAG*kS%C!k*_=x z&Ad4|Ri2FsYrGx&&aGacO~wUMkk>>wGeK-SLu@;O;;mk6ck zL6BgcaGuwCS*-=F73FKHh8sqZd|P|_+c2!m&pEt6Fw)ItWVQvL8G z^mjA_yX1tfLRE8#I?@VyHT!-rb%5R#${7Y6kz7vk097}wzf@n~{X}1kmuzVfdS3=`JNpU9Co${QYgK7v7t1JRhr8-+ZDZmN7a$(be>MkcWWw6)GQ-7)weF#J= zhwd#fO@2U$hW@v@`H#Bv-%KM2x8ji6roo^hJS*MVz}W&dQ$>V%I%L;Uk={d6&s1=V z%C`zW$-bVcf&~l5H{?y;=_m)pRz79r95X2pp(#b*sJhASFRExKD=CP*l^`DUjeCox zBgeJ0F=TCg_4RuW0dZ0x?qkRG9Nu1hxa33rM94)O&E4O~VWq&C;Rp-1$hTf^nW}d5 zaB>&RZw7Se4fnJfo!hu93HUa=}kj{0Mu+fNAueTLudhX#o!p|a@Af9xOk-h$$a;>5XV1M@mZ zI!il`TEia}S*+XDuc34FU3!g1{q8#~%&7}|O}R2RSCTa8r)J1BoqBW87O5to1BXkF zG=8NFoGtAeHyfGZPR;1-Kp#FeC?sqTJID!SJF=7YngW~-oix@HwzE177pEgd+3nXk z7n@%>vzCIy)8u!lzi|Oq+@qPz;tSbKeCy$Fg-5Tzx}FO#^4?5^UN~LUh;sC%%L+R? zJFkWE_6YDmjcwZGG_+HBI@Xry1#!Fv6EAHO1-A)SGi|a!XPQD34YJH;pXfN(vB&8o z*b??D4m$&gw2S!_KGCh&jMj;1CyNbS$a|@WQeDLHlCTY)`@168V;jvRIY#?q&~?HD ztHeRT?W)^kN`!`0#;l*&U%}_Moqou(o7X^E(=^LkVyuCZD9iAix6Ku+-Ox9}N0U@M z28O9Cf!<(ZTNNE^=LF;<$Y4t;U&%L;`P_}HR5Tif^rFZRZOYfA%NTW<>J@h#mOgCy zlBTQC^9ruZ`5M}cLOe#JLS2!azIidnioA5SIX10a=&u2~WvJX_Pi`xcA5ds2t5vEl zGVtjG3^Ti`4-+d3>noXMY8fp!AaveWB(9=12`tnjI2~8~Bf3Dy$&(3Dd&s6dOa*i>)6aBe@TgvQaY zJHMCYQ0%u->C*Iz^NP-|>~uL%jHPhOF)XE~642Gx!55IF zjM-guNWVDbp>zf>;zvbs@qARkgLEYS>N!*XVlfitG*(e3F=xFF9CzYrTFN8Qv)A4< zuKo@OV_#UICQGy4Yni`;BX`gH*EYAmthtLl6I8$c@DbX9CP-%08B#GeII(vXcyZV* zXZ2ZuT~kGPgol({bm+xm)I@+qfSjFY+<^5c!SC3@PO$5S;t)+8$xSjb*rAUBCA<5| z^OIURXNiPX71OZ|Tgxwe(<;=B*<4;6LuQ!QjsIg9-|kgwRJSKK!zqi_=VWJ)-c^}* zYpi^-0GCs3){XVG2K+8>3#hKN7vuK}_|rn?)e4^lkjE|fyNUm`M(g@ELus2?F?Arq zuZhstNMU(Loe{%8vN73Fd4@%(sMhT3b0s#Rb zKe4O6Ndg!KtpRHY7&$30GL%@=qv<^|1UZXg8dOUw8V=H#QMKyQb+nse_53L1vYi`X z<+|0o)!UlAThp5E%Ky6i!QbKa`eg|ATV?c8Y$P{nFJ#^ zXwNsh!}9y2jh+iVeR$+}=^NP9Kip3DxSZPb4jM`Rd`0v7P`&0I@z7U3yV&$grtpdO z-hl_qJmR76nBKKW?I@pp`~Y7)hJ=WT5z?YfWoDj{IbdpBzJM9o^O7&Y3em;li`4$P_>(!8r@F_ER6Jm|0u-fmf6G9OBNpBS#mi}>#ate|ugBWy4P)3s=9jLQ)w~AWikH9t=(v!mrLu(-PwwOy zBbdH=?J>WXWTw z2m>DDQ_cq4$NO%TcjuwJ3-oDnc+4~4P@g@n5Q>DYE`Ln&>gY3!Mm-Cb?5+IoHamb^ z4-S(C+6oAX7xP@>>F>qw9g~AjpHW6d(4pMXzMO_o(Qj=!NZGnZ=-4BpDzP98a`qk99j%IEKu)LkM| zZ;l*&HR36ppwxvsY?IC@9e=21u!7?#=$ONr$8cyo)3A=o?2x(?m5&;>65Fj>!pTp| zEM{dWymx^&k?$5Q9yksg{Y6MFPh-kR!kLe^iN1SA<&MxF?;T=j@LWj`-3UWI4?ncC(}+9y?wU^1y;P$|mGt%J%2z&vJZ+Ee6Z)wKB|VJ=l(mqH zDRZU+ihBN#)mPRs&RX|O&8sWMmOD4h=}~A0u$FZw%)j_WI|yw9{^nQ5OFTsMO?#_aw?rv8zcvwp;QuNI?Qs#(}!edqoXE>_FC z1!>lr>-ArV#db(gFIGOTLkT#{D|xhI!vROI{Z#t!qv! z)}^1Tf^j(q|2UXo)9iXzYWqr7=R6B5$9f+Y-)bd#bU4hOMv4I?)fu~oW~R%361#hU z!nn$%R5%Yi(1CXJ^awMZJ=qHXUP1p<(bed+Q65H4ox@OcY4=HI)oPGFwW)#!e26L8!9m;HU75x%iDkX{O~r*WF;=|2w29-ZfOCr}J}qdA({Q7+xzfHp zaFVj>{@b?6(0nTpD(20_epE7qAM!+bq;1DC62x?M-VXbLhO(?GP6}bfMCvYSdsleX zmbzQl=BZrcY%RSi_h1M2H3+?kyX{EsYVT9M`Jj~1&H~q4MjG`u;g?@}b~&p4&o2Y) z;^sRlK!kkkltif&eg5ld)$u#=I{NRnNw;1b_Hj1yb(rzF)U3%0Jb5ObH$YY5h%`Y_ z6C{AH7=9d4s|XKOB=Ab49-@pXmJMJ=4A>CTEg0;zTaRkrn9m=S`tc<2-l-%>gF{JJ z6C#&TpAPp%&;Sb#K3;7rCX|+#U`l#uClW~0n*dJoS;nlyFBkZ3jEYOKJn{`4a-X4` zou}W@I;9N32xwi%c-R%wBh5QNd%W>VltDyUcBE0kFIt7WdO_&=Y2srP-#BC)&&_S# zkCgsWf2tZBT76zk8|k9rn)qG^6n@|ays?0e0v^4A)i{7(aq2am-{0*exaNq{DEstm~b!P!tekp>|<;F+6Ib z%p=JE*qR1qc&vgx6(^773&FDqyFxbzpI;F>Cb8Ne`Dx7R?QIh0A9GwFNIEB^%qQmD zzA-%;Y*^$jupO4LE!TWXIeIOS+9$1GiF#vAN8LI;XeQW-PIQATVvUqXuZUyan4+s> zjNx?@WT1r{vj;bqugGs^2cA+4aI9(rFja4CRoK0(sTqZt`a!@Ihu6dC$ikdqi_IMB zlVO;lIOP#fH5+Mfd=#cOww!~>5;m!gt7PAlx#3!E(6zQQjuxvHu`;ZUuOp?LO8`6# zx&jwu5wx>KODl_5lLw@wdSFa{VU$l2j~uCZPPc7MH-{iKsVUi}e6PoqZF*5uPV$zZ z8NS(Q#BVfIk*dkr95l^Cpq0K*bGC|O{+1?5Ixbzf(xk93yy4mVAf|oj3AboWzENhw zX+Fhv)O#4jC|DWyWC35Q(D7t1DYunip)0vUUqI(+JXt0$%yJV$Ju%CSugtxI9cPgk zH@Edvr4yV=R6nkqxcwmYA@O<6EYw`#?tL8_*h@I6CF z$ZIcL+oVuUT1BVxfw#vMK>Gyk9Q_R?;ubj%R4!!BFdRbe>I?p875?Eucp{T~!q8nt z*u`X7F23(VijdfN{^>n|z68{pw=Hn^YZT5d66N{`c@Lh@+GiyEj%RO+CMSX-8s3;i za1+{#Fz-TO`0oND!tN3qlDc625J8SQe`2AMnRG(I@BzMey@!LVXx_jQzvW>s)M5y7 zV3J47>`)nQaf7s^a!V2NH@qNPXg z7ML#Gr;N7!GuQT+PxoaW1-=G{+%^dh6J=N7DvHw;pk-Q!Kb$%#(koIV$1R3r3Sg=t zSROm|8B5iUT-V7HvrnNIq}(#drSfYg1vWgZ;FFue#gHp4Je8p$#BD;%;VGIn?nF5P zQO9TZDq`&@(m9NBT0=1nrJ0mcPYHHO7O@=Vp&wY3ue}Un>e>~AoTk>UD3iv#zDhy! zMP+A2xn+I>Xd2Qx&2Z?Rf@vFrRyPb#51ZD>)Vv_!aQDaJt>Cn`N9P2@=3UAR;P3+D zYyvazgYFv251?HKSj$6dbi$WkWFJPZ8GKj}6i4T(uHnxOiiaI^cjj!%*e5>b0iny| z(fX&TJ-<6R=q_wUSKUbgpjFbM*(kM_ZN@B@#dL(#3CanxevX~>MA*mB^U6IT^;@Ki zffU7x1r^ywR21ntPF{&|j4ca@7FG_2f9hrbVm5~6&XRU!_WxagNYz&V79hs{hRb9i ziXov{i-OVB5>ZllSc5kPl#oJ*2xy&!!tasBWlrx-hfJEEDer8wR$VEn5xfJx7p`CX zGSh@5pbpif`qq88KVRki2grydj3eVYA7sWKbHt~iRqMV5UfCzj8@4q37sI$q83~KC zCr;-7x&ys=Pc!c`zT=IS%~OUkd)&D_c%#Gf#M|I15t#F_^KV4Yd$~0ZJncPW)d3|=?$bo|rOr9oRU^Ngh z$pObgcC+kGI;(#%+((!&30T*C9ZH4^AMi&OHZ`KG35!jgot?e+LV2@@8etNl#0Qfy4(I{8Mgn|eRu%2MaQ&`9!b1geRiY#nK%qJvNseg zhj(jQ0DpP&7D!v3W?`$&93a_Urn{%5!B7jKM@FE+qiHJco_07TkSnOj?xt()9g%bl zDJ-c)+we1`t4!_3aQjhRYI<~;JamLAEky@Yqh!NI~JZF4;)!vqo_75fLW6T{8JaACaO~BoBK&T=p#$C?HPf(0`d%{3(2&o3Rls!y` z&i0|AkZKiza9s}$KD%AEV~ss<8XZ$`WOm1?0WdqvTLCiG?Y0+{tG_rtfxk$CNF2&0 zf`zcYw^HzFrl@|9?(EQev8uD+Jj5@!h-deYp68ys3|`bIDw=!X>ha>6d*W`l*_Hp% z0z71>o_oqKRDx7KUk{VgFX{t46C5AA2hK|T`}EHBhk+)fS*3)9AzLYui;L|E^}hK< z^f=A`UnjbKief^%d z)hoWKr^r*?qF~l}tRh2|7uC6I6@GT%fpQ$4yu#7`R=J~Sc$~g+Afa+n|1#|PA=aG; z);GTpHfHTZEIihzsO%MMQFJesQ-^Uq^BvA*Bu81g*P?xc$o-i2x18UpS&R>T&#(OE z7jpgGeB_mxgT2QCYxQsgwZ(ypOPltlhU&$k_ZGVtOVceNqd0+caS*drn6se+megSM zmmHuUFO@Dh%?edCe?4k*_B*6Uh*TUg_YDLHmd=fMSk>k8`0gMmZ~#YK)=yeN<&63) z{|FE19&_ zX< zN5rR?2k9M|61#js{--MT&z)4nuXh{y)*n#5^@s2J+W)P<{@>im|3@rbaF)@0jp>Z1 zjBO~|g3~$3LsSxttL22CNHK94B5i&<5^wwpB*&UE)^22F#-4~o!A=s;>JpSXg9xqr z?zw9Y+)ol>?*c6J&i9t$Y*Ch`EG{lOd%bVx*WXFxMHc6s0?fjQ-yX41Tp!1B|r6R6z>VxPcu2Ef|l z(nk~IbwGW>D|KZ3KXHOQq=8<}pKN8MUbK`P&zBRWFkR+n{aro0ADP)^f%=prrLKa%3UaRDLvo)cE{+lv7A4dUB)Zp; zl>)%^(zcwC4mjdgvSLP74kOkAgL|2R<}4#k70Ip|O?F~NR!6EyqawJS8kP3fr^Y5L zgW7|qKs_W92+w_a<8-WCb%Wc|IxIjYKpEK64c$0gfG{hYcW`Y((cDbWim_(VQi^>0 zaIn!LQf)cTN-L&XPcNKMU{3r&p$si5?kf941(`IBPG81~7azm68)Y>CK>#0zWUQku zEzig&mU1U_g3_jR{H>fAQIJC2qXgD)@c~QjtIy*=NEon;1P;&1*Dz{|DCzwY5PEkFh zoVcMzUeZwFVGNMEXZK$U#OV+a)Qc1>mPx!x6`{i4#ULtYzwlF+9sh26x9H-sU4ZpI z9B8yplOJ{`(aVO{_A^!ifo>1{ox9x}>{9h}$;He8=32YF1OV~7vd+uSeHNfqAEO)< zZDAVOvbWM@m))ED?gcmXqS5Z)k^ANc)-8t@T8{S8ZZOlrnBHUS=E#TK2zL9w*OzN%EHDmB}-T%@2gXbbC(ZwG*sA zKwqi>;aQqd(ue@J1V8FxyjwqU0p`{k+7Glpb=S)RZO-aTkCp5J`#^%hNev6Tz&eMCi-&#$QDD(v{WZf;X5 z%<|nUa=R(0Q)jB(IZttTPuDdX3yM@hiSC(tV8=CyG;KUm9W=c?Assy$=ZL+CI}aB! zKYN=L^{tZaL0(Dn&*@WG06(PrwJRpsJm{QM+~CodWkyhzWhR`xLAeZH4D>5%VdU*S z6{IWwXo$dkK&rw?6IrDl_Y9sLNHG@_ZBf@(-rC^&E;o=fsq6qt$IryN+s%_Y!vloI#>?G$JvPHJC!vn_{;JVeE>ZL-v&4gFhIW+)eFHIxu{Tx6Y%6k7=c=` z3ggSs1@|FZLMp&7MNx`wXG+tNfi~yq0Gmv7LN%0-9eBxxb%!a&6NVJuiqtbJ3}reB z6`S&gZT@T717fq8Q0tWyxD?Uwxa#pOtdrRcj9=OS2!hj!#aqlB@g@;>K{1T@>;PAE zz=>&mOD~u%7VUjOfdfXg^Ie(zOQ^0N=tapo~8TvVsBa1J2%Z zgN=5^l4F4FfXwc73s9opogNHe)*eEFUyI6?>pmnJSl6VyI|`enE9+$qpJhD%L2E!t zRWy}k1;3Q&&%Ml-o}J^0^^Md*jih8vvSmRf5%=>Xk1i3lMyCkt7BEU`aZLR z#W1( z!=;)>v6j5_ca#MAp=9JBUS=HxEJL8=xAP%H ziBcL`!eQnO-mTo3OfWn38YCtXu#fcRg+mir4f`R8S5z=`o#-Kkh6_v%I%PD>W;alC zsKw+~g3PHQsic8y@{})Pk8#decWy+_312zDJ@mq-cOK)?&K!NTOpF@I)YigUEd;C& zpU@d8jJ-{26Y*LLX_*k(vM011pm^%lqEsOu6IXMB$6G#;yfL7o-=4ySvTZYe|T29y>-|= zWc3=Yt9<84guvKrYIf6327A2{9k9h>NxGR=7;ot3M1AP0na_cZWal9qMd|nX8ITo& zgK_V$m&&i)S6Q_fKhvoMHosF5hrI?v%gCPii~c9EG5UiK%3x)~EDqrKldLr@5|%+E zG@_^3VpPPS%adm+CIvaL7p`g=N^1WY5ayn8fJ&1I;6_SK8A7J$7!sAt&wAF+`oljc zBe0ih@Y;r9qETuUaGH=@!CHm|_=DBSab1DMdQK2MLSI-Kt~zqT3@6v*HLRUJ&^?Lj zAwv$;ipn`&QbHl42luo!vz_@rwrjGI1UZbRiYJo7=aR-0wNuQbQx!*AtEi(3wO zq;gB0t(DRt{+{7t_FE=ObHYA_dD8R2wmS}7y#61`&N3$QZd>!vxLf1y?(XjH4vo9J zH}255H16*1E{!$rR=88RGrVVRa?ih=S>GdnE@V?NCcN5?t-4KljY zZF*Fn7%!aD$(s@-x&$#waUjzON+Y5<--s{gOl!1Quv42APV-@h-r-%_(Zpp@yKUe| zYA~#^?$42_UE$2|8b$8!<|!A2n$ZbVd=_K1u&mS{_*IgWX?vY1W3@1m)q^u@@=uGa zfrgR7RdryV#8XcVsJ)om@D30aRSqU)4x={o%^n4aJH<<&%}?7AHUUun1HBNLix3L<6+Q$G>6!>n=Q9Bje@D68d0wMXa=(i^@9^%pyPR(YmdI}JKt6!7gR zXQTVb!~e*Q_3df-Q4l0Ogg_jrLC>~{I8HBl$o#t(pVBoG+vB1~{PQ%FuSImU9fSMR zR=D2xwx@{b_;$~sVana!_wd|zwSEiOo?pniQ`Po0haT?B7-=2^w)}~|{%Ak=|9QGO z=}F+Zi2<9ELr3J$9&U)oL>Q#8X3%AA@}o3Kt&Y8~=7ve|+FaO#fZ;@KFI`JWWpSfz zc0F$(uhlbu*pLzq>atD2YM(fvnD9yAH@~v)Y)gY}h#F6CpZVY<0T0@5DWl>d#k}@wDJ!w8; zLbXjszNDDW>^T?<*H>%C^cWpRR5$136kX#lem20TY*i<;ebRtUeqvE?ljX#+R>&`P zE@(<^ixoZx*_fPnl1esRI))9`=SaXs6G6kMq_YHFpNElnlL~JpzR|^3iak@_H1iNu zU=BW>>BSl(%Vg9nMJ-1}(0BtPI~pCaMSq>PBWJ3@pcdw8khZGID@;}@-0NZTz_vlY zQ8}Kjn@y;Cw+&1>i0)Q(fyk|zTuk;{im^d{Dxam*yW>P5<_b0RWCYduFrb6^(jrV1 zA?0e)zKWQa<@h~5(6HRv?D*nGck4vXo=!@i*_rR`wL_#*P`tG3`pr3s?)-BXQcsnV zi7$g%SJ-d8m@-dvPPML3eTaBX>=c|3MwNlh&|)Lt0@=eXb-i? zoth}N5%r=rjgg*^adRB$el(o2unFQDVa!QOQGpYCws-EB^bhF2!zl+DvFZL`t-qVI zaj4f~l*nQ@`DoO7_ZJbEqzpOv@AxTpDQeNJHj7l>r5@%=A)5XoAxm%hgPw3((R*f_ zs-1rXG5L!VTJbNcdIlpCHxYM9W8vAXjIN2%n(C}4y{pKU)m}m9OoM$$oLzl$1R?fk z1F zB+e%vPoQgBFA5EH4{wV2%Y^_@SmYrg20QBbFxDmc-ggxthMcm$44MzUoo}chQQdPt zKGrqtH^IEE@&TED+p>$JyV{!ag!Rm=ok!&PcXl6Ue@iul(KCK2nE|JWB#IhV4mGfR zhD6WKyh%y=v&iTF6vQwyLPsO?Q^w;k~ zvyZvIg_wU0t*Gu^o9OhSzW$u<{KDfv~;)(B+ZCmhLc)L?S#vO{1w*f|f%+JjncWLmj6&H{$ebEdeC%fa& zPY(`wOnGWV%tPf)#pk@(_t-Q(;=goz{(1fOut&c=;sjyq8GG04f>+&;oMhgMYx$3;?dCmEF-d6lX z++q7b9f*oD(Lx|D9|%|XZ=b4W$0$dh>-l&TXdh>!h=z}L!!R^UFiS8oT1*(LRI2L- zaASC=*#f-m{pdq#Z_6CYxFRsy?nzpE$^p8bk%ormK-lO`x}K?~tLtS=?XD5OufYR; zjN0&PKZyQ>x0{9p^}J#E`LVc?JH6>K zs_S_3RCovkR_XcliBbpb)ykLZ@Aqsorl{W5!ZQ@l`tC2)i)0BVtQqGrboUzZ z4K{WZw*D<)C7EvshDEj@fhhk#C%`M65j0kc3+y|X;hN*F`WIV zphy|eGH-%-F&YV$U!5K83L{^LveWiJ1pX9CGxD09U$VTd8I3WnwsD6oMohUQ9CTGv zx~skee=HEz_XUhzj??R_j#N{Fw#Eqfv~pQ5wa!1(?*FVwP_!?|S7tVL6b|Ve&NQ{; zSi>%mn~-KOncr_@2CezdH4&V33b*)i2k&P{`O@@+V{OH#m8*2a7&83M>ykNp%RrOk zP~)9Hyf-t5^^#SrnmRo*o>vmi$Jff7B8YViTq+5IODOMlE~B6> zYo#RjErp52KGP0HPyLQp=OR%2o3{SKpT#iO@k}r7TuyJj4XZBP5z3jP-NmCWXjtkk ze{Czy(Qt8GN~ZoaRn1bZ`AllhRNW`*`v`#u%K6dS%_p-n=sArzm(t~}PBw16n$ z6~3nxL4nv;dVElDSSnG9I zSgUr-54Az^52k(qKD_l4vwy*E=~wEq2hadoaQPbUO=Yn5x+iGfXPh0Ocf?^up5;mR zEl#%=X%`HE5P*bZ4r~hJ#%T0R)g}8F^MCv5^T))q4KWw*I>Fm;g)>q|2(+Q8Et8C% zXd!0aK*KrGYwsX>Q7MfkZxYk`be}Nn_CG(VrZL3NGv{*56=t~6ND9v()5KET!z2|} zN*KqUMdl`EPqG8kl)LwnnAp@C_}o1`560~a^(|X(?y zhO(erwE4nC%z;F(5-W$_5$7+iv7Q*e2|8dc>_p#TlyVC4i_X@dJu2UFS}*N@OQ+=Y zp@0La6jUmIgRsFfXQ8GeUt|k(^f{j~cQCy=hON0(746VT3zlX#u|)o?EAWThcH`Lp zTw(tH{g(*?X@!ZHTTI!O#P_WcvehwU&}UhuH5bCbn~b|eIKP20P@iNIGOE9>i-2wh zd;$_xKABhyttTvrD11YzMsM`)ArUecmS!V)+|G#hO&NQ%&mx=vDrwrIuhwL1YcOCCs$%qx`?h&wxEMMsNHZ?un+V6E%#gi zok)3oxU?8BqkJqS&o6GgyzoF#5eU&3xM|m#>C~c6yboDXWj{5Iz<7zm^VY!1818a) zQBv^vwBYjW)}MSwfpvNHYf5>2ZI~GG*CSVt=)+V7bJlAV+Du7!Bz-Lm!P)nOrK1@Ok!59n0|&zgwqy!je(d_ zdMEkR@T8~K%dn7Jk+-E?^P#DDFV085XaYC}`KD~Oj^7xsAB~fj{Q=M4-3=UYOWnKV zC$djy7#X=AFDz-%pRB3OdWwwJqD328?}r__bT-}vjg0oxKxO=nbooGlgw!g7X!m=R zKBrryUsLf0QBkluQ?B(gn>ilVuib}IoA?l)h-$=$lNLc@Efr@&UGNrkUxs;R zNKRfoR*(x~7Oqf9g*XH-u9u1PQqKzLJlsB=>{Xx6)u%J2BySmxCCBV8`=nm|D_(I? zHOD2#u=Q(!wWxno#jmNbb8%+$cGg)d&8Fx6pOxa6$Z!E-?78rj^8>B<#cGg zhlP&~Gk)gw?oPD>*9j`hu=8-Q|2LHYBQ^|Igkjz-9Ekz~iuws<;onW_|BRX^ch53A ze*ubSzvx8&7eeBHb{_tZ=4^8YoF|?-`siots%hdyi!>p1vd(K=3Y#C99cbu+NM`sd zo4he9*!Q~ZONBW*bBn=C+qE6A?W;#PbY);*(08j@D{%4e;=*G8T2&F~C|`@u!d)+M zs=Jf-cgJ>`%QWBgRhG}uboZm2z0c(fE@&2s0yLoUNe`W2^eEVJ1XIhm9@b)4Rv1+i z{A3_a+c$JLg|5aJsE(j{ivab!gVWN3G1Sa81b`Lb!y9sY;(_CNgT%uy#qS4)Yv_qQ z)BfcK)-xPb<*+A#Vd@9PSxeh3THy=hE*cM_ZC$pAwQp#Af)Jhn$lH;&&bk%3c-eD(4Elf3(l4C|}!Zl{*bPRP3 zjCQN_ZOmA*!)5y2-YW69EeWVdn@t zBQ6mU;+k+w>LU`ktKvGXSgCErW5K?qoTQsMY&Atk;GPZi_}Ip+1JtX(oSGc^5~U7d z+LX7J>;=p{oNHNjbFNa4Ka#E-bFXB_E#xdw>ae<6;sih8rj*)VK8(pnljiRu!KmVIF`|drb>$TF{-q~DBxp68uT7nIZ zwvs`)EVuArIUZco z7-lX1l8f0bzz9E8~k)eGgee^;S45P(5 z)?CD}$!Ulp51^3v|af_ zk1}7`Qf^t$&{!eJVSBPc_${q$2iwD{o@h1v^(?Ade!kHBPp<%JiWDWO-Z#is{Yw6k z#dl+Ddoay@9DmFK(Ut1mM`FI1K;*S+D2!Ufe28k|E?7}wykSC7Pw)WPU1f}b!@4NU9Y)snaEWZRs}I`LTCq7v~2nHH49?sXL%Injfhsph-dAYW#;;Y zkzQ3tHpZZ5p&Lym8% z8+I-Qenrw9q9o%Nur~e`W*O5QPDv-N5lN53G`p0bbO)(fj3qE;Zd^9G6e3p+T)m$d zs%j{fjVJmA#}|>;HUhyQiM^c(F6$1_}EEAGqI+|u%(AXN!LJE zxl;N%oGC4H;0e*v*9XJ!Yb>ZUBdvXj2m-ckY1K5PbBWtjy$z!@e^;;J2nZ9H?YWD& zL*KM~?Pf2jM03Avj#jb5I^dK9V^-rm4(1BV-2NtfJbLKNhw*B*nw(Mc$;(nZB z&bPW@OL!Q(snX@mA#>mG%HE*WVwB3h0&rq)Tqpk}$YCCWd(CCVKXf##Khh;&pv(G?eZdBkj=;*E`)AMg@S$ z0M7UTXX-;{h^ev>NHmcS*AbYN5wv(!$;gB%sN2UV+eIWjL;W-`KqGSC6akQ)24D@v zn1UStwe>#2K@~;OU5S!dpn$Arle9ymUoAIC> zxi-BoV>v&owZj;7m&N+InBjiDZE`VJIBlIp`1j{TJ-+(qzcH@=so=WnS9g8Ca*wgT z7(=xG6S?T03huvTqD&aytYNpl?Z%?_{Y4A1^#_NGXIu z)=Z`1jZUS0eYmYC7_meaF*4DwUxnP6ha@oR=E}j+Ysj4PIHhDlzYDE?|7GKMVe3Yk zdp!KDAJCb(x;ew~VP)R4_rC4JdOOv{Il;O8G?xbYgV%rMC*dnGydd+Ao1j{s;@i(_ zPPp=W)t)z92LF-aZ71NP-WwR^=h(0y_VtY3XI8YKBT!cG4fZ1xj`+?-@QwBj7t{6m z>Y7kb=}d69w=HieVDQsXxcW2nb1z88q0gc1DT5F+0oIbv*F-Zuur)O4;-=)mLz&YLrE+#X;s zw7fXs+8-^c!}n(DE?;-sw7cQA)*M0cwlyayb7FmwtT=Ds=r`6b!U=!SV%q67;kJ$T zbwl@To&cSA1Al}WGxN^kG$%^)Nb`7;Nzr{>6*vS;wM^buai`)S*cL|AGBJVSm1bFqtYgB9FQ%Ilvu9Mz z3~}@d;7N^=TOCX=4RL+YhOzmhuo{`FMVHf{lHeKhgEr*4-kjE>v7Hh>wjm+pIuwl~ zI1KU=^C{=k?INY)gqQo;|KJb>YBGF9B=huoUwa!ryU}DzJVB>&>%hm_`dp#IHOr z{3{Ksv^Yk+lrDU+T8)w{1A&PnF=EE+E$&+N^~c<TP-GEhhS5Y77=n@FXB8|7BNfRw(CE>!5hGMb4%zyG1h|XKOUf?@P0DZ za_P0knie0gbMc;ZA^dj6opnYDOAgyFd=#sWEE>HymtoY}e8~6OUe8jtClnv+s9r>& zj``kYfBUDp8B6C;9zCHQWLpiU!#>4*$h)*!ciz2{eQMS=Itek$#DiM%gr%8CE-O4? zi^pmCnR>2T88M#`C6bb)oG*Jz1L6Qj9Zw-ca<1fOfCIt#YG3}o00~ZWUVkDE9 zp(@GAuBjr&o5B+3k66_|jg~}ap_HA~Rtar5*E|EM4QScT?WRpUw(`10r%0zwLaY83 z2MBt>N_$u|=ftGz=O-cbJtQFq3ijB|#%NO(S4nG`b-L!Yok(VD$5iNyp2r;(MWTAz zcoBbbq4kloEqvxMlb)T(ivx+LbHsxtkW8&7kf>U#W6{kU-RixbZP1ZM>dJWAw^Sqw z7`q)&Z3x!0cgy&Q@~bk@Udr6~aul#vgfAFoCA9uA6>Smy9S9r~n*>~86Ic1@XIRoe zS}n&tgCE7@Z7Yn-M>6H2Jwb`tD2B|K;;3cGZ{R}HvITP`M~TTt2;=QWHJr0Bhh$U8 z^%oXYaPOx6n3^Y9d_0#3}eU0de3D;#lK(}G?gL83Z z5EBV^WdhR=a%;$~HxNt@35RRwzAlhd?~2ng`Rq4BSLhkompAvU702_}Su3`sliye$ z)3OQVnqE9ESO2{c7^xm1vt!~}S)i)kD13|yzuiu?9woe-bGGrafyuG~`>ufJN(j^# zgxp?Cq~y2-U)U%@*VNEDu$5{Oc%z*DuOybe5+3q_PSQ zH$i~KWB-!MQ0#8pqeS!bB=HrF8)oN$F)Nzl!?^-9P`kA6qJ=z8f?i+U;5{8!X)ITYQ_MpiUI3=qbno*?k zbtp{@6gpA_;*kg<>~qd2rUa}8<(jC&TX4>r-f6fF$0E_@B~R#c1Bj`jyE_HYq%ni6J6 zu=(63gwhvEt&_% z1U`wZzL>sZ>H&#TFj)tn9wr-lohjQr53_O$8Gm4*rzu*71W}!ulmaq#I5}owd7sd< zEXc!o`TPvw9=_#~(DmaHByq-kqdHJmCi3jLy(+C!9)_XoLoi`53r8eyGXa9al4E1M+~KnufCiS+lE9 z%3nYLD2;@+@&PNixB#fvT=7t@Dqw~hSeZi9e&bHlDDxz(?>LC3X2%87!_D+v!0)^D zu8GK|^U-@&2Twlu$u_=YX^}nZ@;)Lkhk@w@Ey$Q>h8%*Lv{$vGJH^^x1AkKJ9*>SL z`Ljv3N9WJBcmTWWQTCk&35^~qeHPkDzTR24P2e?Hr_e+9wcc3X@N z-v+j8;o0!3#6EqtV?G&w$eQ$E@&1AGTk&PBj?!tE%u6bYn8;`R7vwJ8xJz@Z8b+<` zz%`MZTLu%qc3^gBxJ!#V4_d07F1sXa?XT-soptl?Et|B*@lxw+5e!GHKun7t(vYd< zc|A&_aGCAC-?m5(FX{Y-aR3eQbehP93#f!iL!)j((X5Vu8t$lSdf*FKhuI)Jb5ROJDL!RwV1^?ZF&2UW0;)PAy$0s_cR4{S_)YKmLQ3Y>xk ze)SYU)63 z9*RHxodf1frt`~hDoAd+bDM&#T$Ckt<=UwTp_WKKKDzVVU`A~@41f)D!(DnW5G9cxrmm9*bUAyH4#vCZ|Op`Uoe=P}c(s(-)d5dQUWQPL$WPtPEsks4DJEkG( z!sY9m7VkB})j+YHiaZ8$UAI=Gkm$ZqVu^b~k%O0FDOV4&{)W196NsiJby6 zhUTy7rMq(Wy`KDHald11oo5mWjPGIi#N+6u?0cmWT+0cF53)H#=8*%*T<0Y-0tprq zIZ|82xPnJy#W0#>8Bp%E)rx=IS7@nv$?BxKMd3|vyQW4C2WoX`;ZY2#(M~I;eNH%k zFeZI8MrzxJ4=r`pn-)ZQYi>bh7cU)^S?sJQdRG@2xT3x|9!R%YE&UM+=tlwFI&*#| ziCW0U-!+S>YxIdi1AUHUVzQa)|IuF#v6b6eY6`PGg#vqlWy~7}M~y^t;VFJL6*2ca zJURIbK3dc?=hNl7lyiY5qwpxG`_pS^al9FIuo}&o-ajMA2g4^NYQo=C+{v-FQpe8_ZYy>@s3)lQODZcUfY6C3n2qBKi!3 z6|D6;WLj%ShoFzAwqux`r+K?qnOdXs3E*^gv_nbs%?b^YctKfnhb z-iD;n)_M*Yq56``U;L`EzWk$|k{`uoP(kVi1h6k+{LV`gmDD$6yr8q*FsBOK z6Mx$G)rDulpG*fr6nHb4mU$ocPGg=EV>5XTeTRVAJ3d+O#&4T0Uo_y`Z&&1+ zhM7L*YxNs<0DmG(8(v;l;|8ic`u6oid#z@?j9T^9B2A`NTOID!(^R=mOK*&sL2-Id zqh~QaN@S*nIMQzN^*cZ5vm{C#b^-(Xzq-!ZeMP#F=4HiR-+-nJ6B4I~4=t2_9m4zI z#^f$(O;vqTEX$}F#fsdT?A@@S?)pI^wv{r0>t)=5>M7zAtz*TbB^DZHMBNahPGGEc zdf{=1v`d;+jrHl%%eKEwgfy&rnmoWu5=)&t>ga;abTx|6Oea-@B*8~`f9y~_g}&>< z`qObs3m6KV_Mvo2W*)!!3I1Ai&3SkrLt~oHv0CO@AO2&$vnV4xmE?B$WN**|`-K8F zGMQ;^8Kn~TXG%pqzU`h9DHr<^+Wn#|4C_^L&21aymLKe1g>OHmOdr_tPgFl*1%L6H zPa$IE@FMs=NqrY>J-eK}T-4~4Wfyd;L@p|3zzRB_YM$tkfCaC(>>wgkr4_kpB=qQMgZQ7&=P`|-g#pQLvr!gExLKOB@G zBov`T`kpaj6*F#4QwY!}sNrI=O%eD_f3KEKoME37m{1%r3Py26$gaM<~{!Q*W~iJ`(%}RVcMeP7HNcMbDdqu z&CKNa=^4!MN^e|iRSZY?OYXWxODtDwfNF|yNznwJ@S6LDe4XP zg7-2URS*E49nX3E)#d{GbCW)2KPR3!XP@we^kK8wlrdp-E#h|XB67sN5{RAPbbTv< z1o~1el-NPjVl z8922oIZ^qdi^H5UD^$%kj*0KBll!f0^cq5)?)RHq{C2Q>4%BLvSr_Bp&zT=iPgZ6G z@>;x*Avy3{m&rb8aT2XJc9&^#e0==+X%Kvc=iuD>8Fst<|Tn2sOFq5(u7I$w6U zLH?V!1mh`^(h+o#dW)d0srmJdf9Ie5a~e*k9kEw`+2MTgKtL$|2dClxRx^wLApmQB z5r8u?FewssOz4o zq*>e975_x2*V?FFs&-rMSgig60AC#CzC80jZf10ObxDTJ_!@ropErH{k325yp`Yc02_EK;j!_7{;6Ar> z3iX~b*x84xtaQ^i*Kl+MkMmgBds|$=0SP{ebzC!Oh5!demOh9t@b87D*QL$IYe%kq zu|wSxMYKctUGhKR-{n+XJhnMlt6kGMsn*eZxskCQAF?i=y%u>`YNODFrJCzQdjc=g z?stCN*#}pLjm1hObyFW78=uz^DN`GpBD6h(1cS4cR*KXZvt?>E%;RI8JiU}Fk1T0u}kKsfK4~F^~smIe-z!OV1E&Ae~pEu8l$@6T|CLvh=vwr!V z5|#gaV7}+E5`#b$rKsPaZmbv$|5{1uJoAs>HUXwz94uNju2gK~nKI^XSb?3a_^Tl9 zJ`5SLqxX}{IH9!w0yVU-Jq{sD`2`fOHR?kwodsgOPkF+_g z;Mqr=i8AT3{~Fgh!UP{6=QbqQv)=jvf7;F!!wDs$qKkY?Wu@;m0%A#odnSM-Afe*Bj>?}AcFck{l8X4_SuJ<9 z{8XV)voaE8YBj4lG&&)>VCF=Qf*+iDf9Y7M_Pm{`*ns#Lw1pbkEq%j4^EEU$nRQx+ z5pbI>wp0=P!0S&Nd*d@-X|HTP=n^JF4ktoSkuC6?KK1m>CWz04BKo!Nu6w_Niye1u zm}j8|PDbL~{Y*=}5~U5Ho;N2ywv>sAJN&y&F~fWc&Jc4Kh@T~5#-h^MSIu9hQF=qx zuiLloMXF2-ZiX5I{(&nXK4Pl`i}G9tcSvOmj7&L=bUh(ak@piao&@LEAJRX%{zCf*gO)o+Q7qo&tK3a3fK)xHY*4& zb*HwvXWu1U+x!Y5TDfW^dR!PTY2=zqC4Qm%wIu=+mdIB5N^9I9kMKBS1)I;rw};R# zsiKI`QVP+#Y$o6Mjbink4wT9DS7{o1Ie+qi-@*E(IfV0k>=*bK%M!rs#rs*esj-Bh zCunlIz}Uia?dJgYD=2P*d&*NHc`dgUy>S z&{C1GR~=E^Eg;zqf_+c(mW>Nz3gL5zM_=2lJs&^%!L|H9$9zyfzLdzthiOV8jCQ;`T4iyN`9D7)Z~?o z>{Hu&e$+@{^*ew(ZPF^IMKOPIe@Qv!g1-nnN90jKB(t=e263rJG(je6%nGXKFHm$Z z=qkNPpD9lbXrG-d3-RWh7fz6Og4SSia)?h9Y@BV(RZXmT8F<$cY(ASH?7Tlp*o408 ze1!;wPnYgn^nHO=(3`@ii6^vmL@h7}^ieg^0 z5V6pEg{Dm;=#qZ(#{F$1#d9KGJ`tMc!{b~o)erH%YtZ9V{Da{4B7Qu|fa~`YzP*0* z=cVX6a#pb4Cblh3AvSL?E5C_a^a!s6tB20{)W9Nn2LjGjpZ&H1>oH`MXK)gtBIt_8E$D0qe>@|o$gXCBOqGFDdC$hOX)2ECE3(hauoJa zc~7swQ=C$^en1?~xi6!Z?POk2nOhgotBl=w(-qWB<+2NHP8Fl*1fnSC+uS`?{gE3* zK5ZwK@SHVNBNH)LfUhRG>(AuTS2u`v0EU;cq} z#yqt-D5u((_g?PznD~oGDhd_hrsWTi#dc>o-KN}XjMgLamf5RZ{ZoyD-FhS&!ea7X zPG(h@TT`v1Jt}J0Qy@+h$3dPc_`pR}6r_UbjEKs-nbE6C!}GptcG;g#WCV{ZKEt7v zq&MPnpMI-jPvpK%Q9?3&qEl_jCQW_R#qXt5;_2Zd)FepF3N@8eqF&%jB2aY0n#prF zT2I>cv^=ch&L9|+(eFfuznqeBqCZ*TK4y|XScmz}F<^9ULLtN{7hVeBvL&nO^Wp$* z#sxLWWvVlO7iIRaVY3!SEfX#-O4zjZa%3D5(08de^~$ITSjj<&Jyi%xhg%-YS$fM# z_EF;6Z?phog{ujpPMXOWlF6ZQRE4f01x+USrPHU8{8m_n#ie#k(R9D{=#AQ1We)*` zuF>Fni~-i_nd|dx3dFoC#&B9@pj9ee7!yMZ?e)5V$r>|M_fdUN-7HYiv~N|bKUp3$ zw7pZc{k7v}*&jOFHg>J-UY#_B9SU1zy-R-%%X*Y4&NX~Et3@0n`0LFqN5(DVy^66a z(DDHP_`GZ1m>fLd{(ZR9_fDZMf5mo0{!*|b=}AN2_n@b zWw!uDAWVbGcRc`y`mZGdO&kI~S%tI=L^9U>a~{9?e13jDxz_&pxH$vD7v&+UHE^3P zwHJzvxFe2%$vYb@ON`1GDg|VT*3|0y17L|>);gxE0sq2J3%u?48T3xFCJw_!(?wU( z!7mw@B*4Ax`FU=^lMsfWiwWoXc)NSsd;6a_I~!Y{ybXv44mLvY;&Rp+PGka`3o_=b zJ$X1OZy|jAR9fvs*9u_*AD9POHk<;-qG6`B^M0}k$Q<8>L(5)!L=DvND4>T0f znDC9~pYyf$GV5ZB{6q=55ZFZ-AS`7YD!0JY?dZ+w#Wp$5(*MKuU zWsU9X%MUF$!12o9zzd#s6>h!naxLaJ(uUCVhz$~#^+CUv&|_2_If^bB7bdEGi(}IS zj}s5q;l8S=axIn5NK5^_z{*gK!ZimUw6{Z7U90luH%rWOAFLZ+H+wv}KR#V7r!~ z4Oj?m0GGc7r#uU07a65Wm6}+6-}A*6WpVVT608@TreBCO*t_DykXs<3oDjeqwfPEm zza}`i!e9`@tE}4MaB-HjyZQn07!LJR#_8A1HMzV_Dub$0^(Tw%exewR+hTHn)i-}p@cy`S5YNBI##lxz!P##_K8`R0f zF$h)8U2AS_Ru2;C0wEDXcP^XEKs<+ar}5xmE3tk4R2SH`e5Tc)Q6lkD)C>xS;g4S< zKC+cg;L1YxVaTKytl|8JcsvoX=MneO9EOJ5_)nFAkI1NoG&>-^T}|*C!qVJdyd8W= zJu7OX@u=CekjuOl-X%d)pyaoN2dO&54_epATJ#UPpsuc%D~2z3?UBGDuQ2YjxGMrV(<5Ge)&(c@IjRc8^K60a0NgzBpSnnv5ZtMOmR9X|PhJ;a>+LpF+2 zFkXS0Z~ndfj)|G&5`ELwJ4owbGfJ$R&{!3aA8q_h(o>DGKY1$x1=){wS0#k1ah_aU z2ZsU z_(5>QzbE>~@Wut{!Or-z6naAq+auR8ZQ4&*Id?F~8WUK@gZ=)!D4-**;MVXzkLO^7 zuwGa=5RlX_JP+mnmr1u>488;7gzo+4m$JY zoZ{iluxiPD?#Xd6KivAv@tJ8q+PX-(+Vl|wp)+BCsR8y|w`l}1KJ`H?zx?dSl>OTg zN6;$<@J2PHZ~}|OmEI5o(306x0M%jaovOQle;4nr*-={)+hT_<$S#S1Zm1rKZP7zU zsM|zNoUz_Wk)&jCFFRPiszDC3tyM_ogH8=$<1ZY~?zKn?eI8O9lJSp8o_$bA1EQw< zaxs!)-pO115=$P^zVSnQcb72MH)Pt1D9=_fImGXH?4CJQn7)qazPUq4Qe9O2vZ!yr z0xjfAN+so4ehp@pP>4E_r>Lkt3840rx%=URVVDywvV|@;|5bG=>TYbtaI=xUC~-eW zw}KO2vsqf?SQf*o!b9?#sYNp(K63Su~o52l6H#YhWj{53@Csv;HlnSWl_p>cQSlj-UY|l4BQI0Ozu|Fhn1Z*vJ#R z`=7}Dx`8_na$SbALHO@er$Qv$O%l=+Cf3g5GFfSJo7rlrD>>{;RFM=-O+ke_)^bg5 z;r-Zl*!1|gO1#G9SaHi0WGSHR)f6^t^a&bs^&w$(R$aGodB$DvEv5h`XJnKdOBMCG z<5QVZY0UlC@4b6bUMlt3)&=2#6M}?=npxI_I72|1TfZ3>uQ0301tpqlL~z~fb@!AG zfaUOdif35C-&sOwO4eCdit^J1KtG0?WM+J*4V8o9P)DUBvFb?$h(Jl=td!1)`tKAq z!5VAH02^DS*gc%vRyU_&&Svo2Z@(AC3bA0iH&^2P-y#qj}VDSa8ho6wBfSy4yWlX-_ z)8felDI8Whkq?}-!M+nevQ6vi@*uKoY{4AVu+<9c?~sGVKf>luqQ!p+j|sAD-W_f< zf1}jRDj0z`&%qhVnx^}Pej#f4=GWJ)RB>SOsWtV5*3|LW ziC?7i(wDPY?{@<`IsHZxmY&liORZK};G}Hk6s_VGK`R<5rxQe&zd2+Fsjd*x?hOZ? zB4*s3DT15Zk5PJ92^+C-nxZgVA}>$QGERk#XBeXE#!PdHRvjbW1gm9+UDU~%n&?Js<1I8aOW)C^zSR|)?XT2cc4 z71KLcg*0}}>ls_MJyC}tg8C*LCOFr+ysOCahQ0MGKh@wYuP3NC)v(s_&w&13vlZ~{wyP`^$j!3?(S<@>mM*Z*gx%gDFU+l^UB4AN zR-%3_l;CkhJjh0g@g&u!U$VB_KY5grcn`9tDH#jwQ>} zWg4kI{ugEM*k5VeRuD2?m8xW@JC-RnR*bT%waTsmhb zU$mv9apNvOH7cyltb!Z$UaxVo>T0K|ObAQlJ~3i=YyK11itAIE+Pd2v&CrlmNpTc} z)M^1m-V>)Y0X`TLr&GN)G_Od0vx&6QWxk^I$L;TfbGXpXoCM$Wb!)iH>dkiE&3T=T z<{+E(PT%WakZ*K&RUJ$_r7Mjnh@BAo;$};Obsq4g%(k}qCEzs_P6AE^CHkL;`~AAo zFw@|4N(uynx(Z239Ie%;?XsuNf-BItXzhL%zgo*~1reDK6ftr(ON)9dgGTaBA<{)= z{pUllc13P`rE2l2D4l>Z1gNwidaGDNbES-$2Eabo{ahfO4QdgKGAv>-itxhU$h(nu z&kOxFUod{UvmY8S{Ngo4$YBVb@j>Y1>=hw*446&1@AcOw*Rez49{9C3d8SN0ASgW` zGrxg7kn|vM+XAKqlL6|C=sSG&>xMRBp~gPE(ia^ixMaeF;fkd6EQ2i;^oBlB?W4!$ z{08+eU*z}jZU)V(ttAwSk~TsU_&c2DAKOT{OVJ`upb<4c+i18;fu#$O#H!vFQE(d} zR7c=s4L@7-WBnXtyGqnoS$({HT)`izh8hZZZxHO(7~{aphdwKb*2jn2;n?waiGYo4 z^nm`?eT_yd73grxM86x=yLUoMe4M{q5JRTpg=ctX1`7;wX z87v4)4RGo;LAD{#WEI2<#~*iuJ!PIh3=zAPqv3f+M=JOlyw^`+fh+n}LOdfhqvsv) zQs>$FsrnAls%EV4XLfUOOlj-}spfs?`ZbMn zmb|VQVT%(bt{KKF))X!qMoyXm0dt&6w+BV#aUS5et&oRV=I_kO0fQ7%WaWp=Sm^WEZ#w-@#R%V0Bg^()PM3LIo9;5o@xVD&ez9f@r~VN7oECu25voE;vg8)K zLZq@4JExBu#x9frI}`NEPg6aIo3bV(B*y5kXR9C~GB_kd6<1*;-Aq=GQS!7+I!+Sy&l<4BF-HL&Q1^r4?1 z8mJ96rwRIBDwzp-d601Ge#UD9I8C}*R1@lUGqEmGTYJYvsDO58TI9tef6iy}NmHg6 zLA{vxAkbtgoQ`egqdL2`)vS&^C_~?lr$_$&HP1wSHM2I`TI~C0*XY`jUuu8VgndA& z5;Ls+u3m_%TS>L8CD+fyDOgLj4JFs_#MKWbJ5iVwfdWJBo7(OQGccr+@?kBA7A@T!4?>JPq zwFR!6b~QwHbv(D%@_#;X{Fa`3i3)zaZ~>>R{*1|jQtL*8z9kcxt7QGlI@J$esk$@3 zs;WCNBSfbKnS*rQ&Luo3}`SB(x%TwU=~r#dB5D}0=|I_HhE2V?hFZd$^j)oA$9CnX{U(@oa2n5MWP#lq7W9PiStx$@!!`?OE zNcXkx<_olmDe*3VuNQys^{11l>0^Ly`N<|V0da&4eHQP_<(6ai!=~qS7uV z+`8*V#sl0MNivGY$DhLkSD--t5#`nE6TmQ{4dC~AI4jCT-5y2_OXpv_Oz5Qdz^^Nj zzys9k%BF1=?lEZ{_u0WrKh=fenmVn@A1|ffuS&{;23dfC3LC4L9Ay${BKAHT$&3$V zJ%HK)rU2u~NF_woFkq1UG-gQDBf&l+G!sNd;8&D3e-({CduGEdj8S~uz4cbf^tlFl zrE-cBz>(If&YCn0ofc)Sl{9OK6O$$;f-A6^&B{VzD+JT;)U+#P2W{oWbG*5fJwuJ& zK>KrHtSOtiMlOE>K^#%nQKLE8njo8cA@}STR*fK2{9CqZE$}qS#p$*a08A%5m zS~~DHZ8a(n&a;CJCX^9fXBKLNt*EYc!tB!7<5Y zm#YqO*5hbs6!CP{WvIpaVz+C~GPD{G#Jx&L;r>fCZ%@ZkO(TlnWqNC{+&r(Vr+ilu zr)lF9bf6rLInPRwOy3zgr*pQanK_CT8rHX0uq`c?$`h>PPtsWt;m4am-Q-!pv(fS_ zsLj>$=6FsNOEAt|AOp8peT^VOx8)$nx#4!d1R(R(id3$!9a~6R!EGgS1=NAFdViH7 zc*(~48$-r}RDe){NP$GyiTQWj7K5~mF#^Hw7-4IZ05=;fUOYcU^+FqMN`ZBrIi2)^ zI+vW?@s7{RKA)a=wy4@#%;Wv_QhYv_(Z*DgCfyk2*?Yo~U;18vx7i&z-Ia6!@0P;fGe0dmqLo$nG+Y+fR;As&hMQ zL9$o-%jhTw-0r$A0<`LdVI!G-6yFG*5P4zmz{M=~U_+t> zL|{xUoGOn5RPUq;BRQt z18XyKxaZVf;kF=>Vcv@9D2GhG_6!PFRYb#bu-C%V>~UW=y@2a$J;CzLAe2*WCXf2C z$ZWn)o#8Ef7Jn{B$F3#0c4;>%LF)|aLO-$OH|tlAZ67dP#1qSuK8i7#;m>^rCssvp z?7=W+d#TPGi~Ucpn6}n9|GR_ukqJjdlR=L zv9?QDH8=I|Dw}WbbQQK^S+={3UhuKDh}-sX=9_K2z-m{jUs1Hb3kG&Q-B_~2IlA6M zG~ipw7@)l+Iw$674XWJ`69%aktw|7V`&L)E7@2%R>R-z$Kx6K32M-)UtFwD| z9dGBzB+T?)F?k#^pAaJt*#9iEd}drbpZ3c+#0~rY_^)?~qo8X09&kWyFxvk+;^<$5 zxc_jCF#;aa|11dlaK%1f;W352YTPNjk-lndQ4(vX^1&=12(Or{3i)QsH^bI} z`koq!8U|o2%b@O_?l+P*(61wJ5waR1o{ONqu3t?)Bk@QR+kseMb6;vP!pc{5d!&r% zo|4>&I|IxS5uTsB&S(J7gHCEUoxE9bXLE5H5{1OT?BrUf2BkU4q}+M1jf?~{f&|UB ze9K~L9=ajZMzRT&bfhsc)FhfJOBg4*vyfB@bPLNvx(8QGTK15E%9N>+;)$mzqn`EY zuN)2P^ozRB2-oF@x+(|W60ACD8wo0usVmGSX6GsHj@VXC0(muUZI&h^rNTtvtF?Un zGJyF7{=c&M+Z%*1 zk%eW+zeO=>yF>jYMi^_DMy-j37mLVHJJ ze)r@|oN=h9I7>z>U2~1O7WKwYlCt#8D-K-U^w&mHQ)RWi=q=&eW_&w^3wSzMvxfEC zveH$WiInl;7Ob_pv*OhGaA9G@$Psp|lI>$RCN`>jZ7<+%ksb z)IJl3n5W2@M+^W-ACdT>88d~vk4MKKAAugFQ`~pu)NSR{l}GF#AE_Q8ipv5A6pt96 z8N8md*^ft{n6KPfd~-%=Uxm||&r6|q@jMh7@<(cK`8?=H_b^$nN=T=WQHYVg4aEDHoi1vOFYON1r~~igF%r$*Neuk%_B)8Blwg%->J!KPES_0 zPSX7vBUPH}&w68LIep@cV-MD;uCix9*%o@oY5_8FgE2w~**elXvW{NS*Gmqyv!%`V zwenX-c@T;UPQbbfC853rD7#zyG|bT*#Mi*B!385ZUg9*qBeg-i;1mbr5kgM!*@I>v zKd1{9P>@sUUBq#AoVYoqPHrE$hp#G$=M-asXjw)i{r&sHKSMQa>+^bdw1fzNFds1D zw2A61g`e37?@WS>h!lU^C;WE$Bmi~o8RKZR)4@1vQEd|y1dgIZ+n$RaP^2HKI5Z0q z6yk!Iu?fj}uI+@AnDv*86X64y@)rCU&H29BeVSq~!CZ)6UZA_( zax)hEIL+x{vD00^z$J2rxC&K0cZy(PK*FhzSDj?$n=8208c4YqAf*}PVIN1e*s@>8 z8_7v9-W!2RZ}XdOt5CoLsN+itC9eje2FXBX@rg3rAqPcAEN-s#mLvRhWJorO(A56c zEwQ&$CNdsltp7q}ch3li=ePB5va{@4r;cc+1tihenXvh5 zxG=qz`7nuwl1mcq}gF+TQg! zT&&3DM~V*?9YGXbmlxAiPT_}NeHr#{Cw<7My}9~hB^zDmYkMv+hW)55^JqANJ9Zy` zT`8!&#U)`YmIgew2F@MTW+JBN2+8`Ll9IEEnc-uz0c!Ens5&&RJXB4=7ng=e?>BXN1p4|a7en`?1p@fey!h$#+;&)Nsd zCE`QQW#)gvH_a41b12ERtDMg}7w~G6&ww-g|4=>+)OF`6mspWu2IkUc+azDTcrP#g zqsOy1@~$f5uB>j(oV*TZr$!7#ExQSZ^Dyz{%dO9TNgOT~nG_hIY}McQ>|SR#7xTW8 zzN=E!+@P?++`g28doI!m@v=I7IxFs*%eS~QT=mG*;YY@OvuXZ9p%-sf=yE*st0nX8 z_ai&jozD7FO=SBryiR}4iYLN0$?fr9cOLL3+v%JY@893Wf8Djg_on<`sJ)jYETz4= z5JByKL|q3#w~uv-w`iG`=R^td?ift5GcB=%pgpjJpuc#@tDYX}^wxsEz80v=F3N=m zAGHKc?*AsS_kbsO%_(~Rck}o^g@Ix}Ord50`&2Q&JkIt1wND8f8<`vGI~g1OCvN4x zmHA{PeW)Uf0l=|BtZN9WcR|W={>#e@oyHTySOrm#gWq&-1kR?Ry^MdBTJmrGMIsi|(r)Y9zKIZ6r zp>;>4QI<0s5dwA#4pk}wd&Z<~s^-7U<%=%AN-Qoe<|klKK^o0l25%-bqqRzvR|;D! zs@Iqu8Rf`3^gPh`LJ~A?C+{J(z#%ZyN8+{{t>3!~-!^dH-8h_tb30Bs{Umr18e57Q zfad_-a@q@%vO|fSZ88VoxcoK=4V7HJG)wceq8v_(rAJDm+Ov4`!RB({lw?a;J!Rv* zdm7H&__H)+OmW+J`^{b$>Xp1I@9=j*YgW<)XqJuR&{)-Ux+`ZtuCY8J{4Zg3u!iPJ zNwQR?2p~*|Nax7|h_{N3jKpGbhtPd{oA15ntTJEt&7J3;>N0e*>&XDYxLLYm*jc`` z5=5s8W070kRE!P%Fap4i&9}8`Q!$T?KLHP*&}b|-Nni?T-xW$jz;>^vYr@z_@ zYE|26vCI7qLu^0858CWUiSv^-LIw?0E05Ion;c$D4Av{!oYid_Y-a7xpv)#CeK0l{ z_wTE1P9>DmW4=@vKfj;;#CGLFPlA{)MoHDQ{}{`ijypFSs3>& ztfInsCT8@J?;WFacAm2ynzv5tCn*;4$Vv2%8Tz~20P54BON~NFm{}=_E7eq+pSl)J;MOLZqP znkJG}+7-9pcM^I3&=s--;}sS>M72Xe++P2Im)DO?h+s(pQ=v>LS#R*jns>nbTnJYE zWYIOZtyZ%Q+!JbOAhCzfe{u!uCHHfufIEi#3ad+8aUH^3zNkndf+A{b);`N{1R1!% z?Pa00ejq?s+3%OCf-f^p_+6x$@-)WN(kx~aHc=xEBu$fQDC-9Ax?x2SfD?P=f|0<0 z2uF`wojt|BMcjM|6o=!u~&=sZAsa!v#>4pw0JnKPDgeMY+ZzFOv`cq z4thG(5WO$nVOnIg(bt~UTIUP%t-*9RkX6ocrbdp~^#t9Oed|jnJ^ommeT~0Q`Q(mT z=wN>!%coOb-bQ3}y3Wk!71oJ*cooi)o~`N>4!r*Uw|(iKhjQ7`@!$yHEB{BwW&S^Y zDF1VF`WGB_F8aMkRu8wzjwA&LyAFZuP5igGR z8Q~i|RV}zx2O;owcLKD$gF_*0uMp_?NBeNcK9LbIj`pTMa(cBXdB<*eQTcyfA20K4 zwzK{Du;b&y+ux^07i)F)51GbMRyxP z=Wu~2>Mb#p()L9O|BBVpjo16+mKb4ccb6J&TmG61{N3Kan+qst6`40D+Q?pX1rgDnB!Gv?ahO$^dihfyDjQ$S zU0dN<(=7*If}D2SKG&&FX`ww|(Yuk2NslslDO(t2MzCaS)N=M$;yi6DE9_!ShbLp# zbnR^FMj}?k)Y-INXz%dIGbDb`JLs@B8}0?pmQ^9`^3=od7vjppFux{a+MXyePpUad z$CIC5WgL-yk(7Wkcf#~VVSH!Sg;|Ebh$i%z7oqVZsRN|Kc7f?rVjNq&^_dfC%?WZE zb01dV?N_bNIgA+e7_p`lgfF*cEF=_b`&92Dt~!EKmXt58eNY^x(k>)zUeWzgb5wNf zeY=C$_$A+x0ly7%3Y)?ndDn(%ExGx_)j|TOPR{n88n0&P3AFk^;k#)5@K@)o2y*$= z1Tk2;xr*c4F+!Jg;UfW7;WM1rWO9!#n5yxO9U#mJCtAz^#1yC*v4S1oK_CHE2_gH_ z!KKy`OCdW`07?~5$G#djXLX>qA#7dih~9!WBR=yZ zaw0b9v^Sl3b&_=CUG2L*QHhDoJKJvD<5Wiy7z-APPrMQq#h8LR!)+BiG#gQwI}p(_ zh#-_urC^GjWl5moZ3a~3oa2@o+mGt2L}?XAhdFXU4f2=Lb{CB1ApIuXe8>knDvzJN z2+Q)2u~Dcq(u=UV18yu@5iD7};CEJPF;gtq|5Pw*MOiXyO$-Up!tHW$=8!J1(dbt1 z8Nk%`Vn9dM{Xp%YFWh6KeQ$dO!dtloN$?59FMF*E&e<)2nod&zv3SMwna0yC*+YLN zX~|Z)qxz>YmYJBLoM1=no7Y((D9CuEG1F z?FpT`ATL1Ecc=mDYZ#9wq{lMU?;2gk#$KfO#WC_@DmeJ$4jz_{{v^juexRpTXh2Hq z6Z>19ekZ6vZ%<;nMCpABTTY< zorx&X;cp+Uqv}ebIuD&T*8qp{^nSHVSEU@WUv>Q`V;RnZk!zH@63)tSb?Z8VPP z9&@)IasQ*_dCE!-=d}YO-x3Kjz-`RSl1-iwj~188cH6dz<20&sw5BeDJ|n`S&5iN5 zFVwu&*OPg9S%Pgdj;UO(Y*Jq~dy5wQ? zasvs{)^eRQ+s@x0ue(}v_-pR8R<0f=kXxm}(`L!^(xv3Wp9IFWJ4tDM0`10kG|N)S zqIOu`b&d1rQx>oCBN7R`$LH)#p&nV48^&Ea%eeV)0~457sH@^~h#vO}Rl#Vq-Uz56 zrRoA%{C_Nd^F9^8YcE=mCNaZg%)*8)n+T7A*jNj|cXfrXD^nNhQ6=e2|5lg~eGN?R zWpH~}i+lNsC+zuiSx*j`m%2|O){;$X~`Btr68OuEPjq&uPiN|wv{${d)sO0+n| zG?KEo1VQr15~y<-yJ)fYRg4@*~t@h>9d-VIeHvYY3+y!?M;$m zN9^0;ye;sH%h8QSxx=oEiQX;-HkF6Nj!ikG4XEO(w|~r!Q~9qA{}kM&uY;b}O7GXWhnYuePAZR=UMkIW16bGhJ^oRL_b2d(ED9|?O`0FMpwFV#@TaQv4j zRCH5+x2Q%~X>E0!2@NHqG?6<7>hn#Xj=5A|w)6IaQ2|UiZ)sfE8UdZOKC0PC+FFGMQIb#z=vUz7fp#n)6$s!=Oj!Hjto;i3;Sf?go zg-da;tr53;&Q|9XI|DOKm8OW~kAiC_-v&qnM{Wn7Pf*(PB>Its65uroOz zEuOM(nn1kBs=VburF0}~W=tIuUpRs)*_rMG2_9zn#dOcKqZtKL(w@;ux8o zRi*Q?Ei|w8MJQRn@*d1Lgfs4M0#2gLQ<<=D0JV^w?nFLgfHrptL!pYJ%_n>AoMtX9 z%Lv<_EW2Gqw#)Mtz$>Y`4J4^PCvJ@2ALq8m$Vqr*IcylwN)PTX76t#AL%orD?Bozp zhH4P!;1Jg=rLsn-Ub-yeF)mm|BX3EvRIlZ};ebjm$s@QW2$b)KY?j??4sfDleGFdY zza9yC^+dc9cDyo0?}J84-qmuKdlQsxaGK6&pe=<^oi6@~V3BPVaoKdNK~T*ty-UoA zeCqF5xEef}kQHU(&xCa%plwFhbqg80&t=asfgVZ zOX;RFrtwyhl|V>_h1i2xkK1>S6BJRP8dLOZG0P%~EMl3sN(>IgD_OtB1bZNWM=bzt;u{T?z)5H2_I5R@_@bw<+oVxunF%G0&2UQko~wG>|8I449l)X~7Z zkw-NwxTaWP(WfE1w=Lr|+jSf9wajA*F%$7V^5Bz54e36-o#YVtX+BnWaqqyUI{yL? z5LP2;Vp(kXb7@8Tfu^V%n+dZJ))h{zEkx=P-y#1#dR64ud@2*$jj^t- zck%YG!hhmes9}HgHHZE#WGSREmo$HaAkT?Mn1{ls(sh=wIc3ezHUWsY+FlS9OpObC zUO#pQ?tlQwt<$2TZ8E6DZzMGKm&0qGo(C>nwt*Pmt}mcoo>TotqJbd~@chwW39G=k z0U^*B;D(*f?tWL^L#_-hEBm^s7v6osnV}Iaul^xJT3*<%E1u6wQz%~5+oHfxNf%>7 zl9s5$m$c@G8npi8!Sj4$_15aVP5V5%G4ivX{b;B$MyUE`f6Gd86=k8 z){ZKIIXyv5Ttv$< z@XlLR^=p~Xr4}DqRNDZm+xT;N<;=cJ2vu2NvQhp;WRVab8m2|^odFCAF#ix)%2BoI z9TJ1Rhqq?i#Jf9>)|dP>o7ATq zQ}pQDCnYtO>>$nQMzT9H<&Om;7rmwE;1ny^ukAARp2C}@t`ogDv=;=qbZnbXCd8~c z7djUVV-{pqc2`}B-#+oNcdXYLFkwF@Mk|!7SRbD?0ND-YktWLSjc294+v_O)NO&2y ziSl*O=JE&Z-S_V#i%hxjaH`hvq113Td-Wk_Zu#3JDA)q#tta^^vII&}JGmh^D9Ugx zdfH=#0>YsoW^~2Y0>ZEkN+c~Rebs)YimSq1iYPUyBgD463bM6E+wp`$-3-+ zkXSH)d=|kk3#;1&03;T41^|gA8bD$J5@=b#3WMK@9-q@=Mp4G<{q~c3RqU-1*cq9(H8?UpF~$wr7XUW`PXOO3SUc_cDty-OL)o8N z*h`Ff9XQaR|EB-EG_e9b8!dp9YO8S zE&9`;p|NmU7=9(MXAb2ZhvvaF-*q|fg)Qhy=LJ~5`zCLP;POvuYo1VPN$lN1SSOy0 zCQ+x7VQ004PrkVg^z^g;9W&vQeL?<|?WvDNe;kE0PG674X@l0I1${?6>-7@AfVXP zItKP!fij(wRdgVCB6v?lfM5@*jdz-+F63UtD^^eU`2Gd;b?qzIg3durO~Whci+99O zi+U&GpeqWmWz5 z1Sl`$H4<%shf4kPhoDIr9#@f$wBqdMH7iLevZllRd zl0H3U(k7xftz*V6PbRIp@U_h*I$Tf-y9C!>{lWNsF#qwu+U4rn>VFaUD%8@`wO(QY zrKG@J_fkn%mB({ZPv3Mx{;TRNM2QxX<@E=78-oiCQP!+rbF9=EIxMeq_Ny+oL*$(k zlG55~MRJ@9;?R$``jaV>Atp+&J8jgRfea_LE8$5PxN`OgN6PLP{L)u~h!(X-L%|_X zG)3y|;m~l`TOw4xVL7GFh#auH?C_ku6G|Vy7gTO-OX~7h5}%=J01Rm56}H6(dk~zG zcko7Oa<4ty9nH}#PLtSYru)+`=_@owX)x~h9n7#&=I{bk^wkt%c~D$|Qz^K#`|DfV zGjW>`9?@c4EtllUA9c!azo6F#bXx7g>d5T0(Q3srC}E`MTeO7tz@ji^o~B{v5wS9% zVvV0Iyg@7q=Z=L92Er<1&}sgeGq`o5Ixq4)w3U zac-F(*rmEUyzQ+O;b{TN^F*?~od5>QIJ!Dwl3jSr)K{pOWKzn&?y8lSg${MII%kW& z$=NQH@Tv)L%-q&J1c1SUPX>1mz#T^{WW;3mne8OJ{C+{VSl*L}C-49cLFheT7p?LE zo~0kO)6(-# z;t&yxh>vcB_LoV=M@1sV_JHL7eA%tZ9Q)NqPaNsAUVuXcOlB`oV=LvR7^B)Ec;?Qn0Cn1@!WsDkVC^#!&Pfsl*j;iIbn{Xl+~MB8#T64X2jqp}}kzx>}-z zQ&e-T?I6&S7+k6j88I4&CR38tp@$Gz(w^o3$$W}SL##{{L7mE|qRF!iv(RN-9-GW? zb3+zO^E6fe>J*K$z!=j?ZlF+YiZc#-kT*^Rp%ZfKK)H%)$xmmf08XuXwWT2kG9~jh zEiUkRd$?s=yD6WQBO^~)#V7PLXg@kl7(8dC2}d3!%>&GZL7F7+*zZLNA$Mav39f2R)aK7 z?i5C8#SN*R+);3+OxbNTRdqXYqu>5`wOeG*xsqH@R%+xGtS9@ckGjG7#28KSa+pjz zCEHoKQId6h#QAn1yw;*i$U1FV^_8TG)e51Ac^CZ(89%cf^d1dPCCpjOE#_TYp^r={ zpRPz(i^AWT?DL3L+J7-vJ^>7tE))C?)+M>LFW`SMSe{h&uXzCsmi*yiSO9}1Pjj-m zCjM0wy-oluv?V|}^l#GO{!b+IyL{qo8r;pTpLlpSNx18*F`C?-Md3Bshq&3>J4|Ud zTU=5gNrN43k@5ARLOLW@H^wCW+sw3xB#WguD>{O2AQ$#@%X|}(8et-QK$LJI{{shd%YQbz%v#8qZEAUUP#;bR0L@_gHt}d+!7~}Nh5?mu= z+wuB$Ne22ETp91p5>!`GE-GwH?S`SIzVdg^Fe!hee!ys~*S97xJFgryei>)sfO`|d zM5%AwJMHu5;4%< z%@;y<>9$Vsq)@D$zEF=r!5F?6Mn-gCi-9{$1)d`aA4yu6&blva0p8?s;L!=KncXHp z{{ejVn=OKnj`0n4hQg#Pe?V%rF97wcKY^9}Jx^$3^l1d69Uez^yVcl&saOJ%cyi3O z1tXo6n#3!D5aZ$0+kwICuNTGU$*)!mf9J6ql9^a2PCuuE;w*2A4MvBA{|`X zhq+8UAnv_cI>|b(S+?X}ezu;a_1qGBl+q(ek&QOvQx@W}d3|3myt5e6x_xAPi+F_SLsEmFg`gm`@J_EUgmkARSp?DYW| ztT67CN=#*g5Eqw+8Pk^3m`9ow1Hna;9elTOCdciI{vD$6(+6+r(l78E3xL|@drfBa ziZH^9ou|iCD0E6F%uTe3Ly3>i%`*r*WUcE(80nBgWZC8NQ3UfZ9rU3?h6+P%CLc2^ z($0w_lpI~bxnoIMfl#@qRz9WdrY#W6d^BW~ZCHgKiALn~d)G|*8i4v+Tk{k!z zp$Bgj>jPdHCeyXhOydLdE!NVbH`ZcEi9%oD)l-fxCb1^=ASpQBz_~!`?m^H{u0Z6+9fXcA{nY8=wPw0P0yQ=O^N~)OO zU6c3yhjAcS5ReGKMNX*@ip}K+f^WehLx+ceo!bu3reG%e%Bj2z^6e0G0aOK-#2{yAhnnfyoF?b&JB-s!q&`{s2< z>ow^t-q+@}>cgenz6yYLea+qFc`$p_@$tfEyE!@jx#<;~!PWMLz=p44pJKV;El0B# z($UrylHrMYK(x6zG9~8yigB%aXYca@iEnWyf#)4A2LF0%?iGxWe|X%m$vrqVVAX%} zdPTI!Jsy*Da?F5_H$s7zWpc~J{SM3~cN;;G?HLbLtn3x{QS!Ex;`SH`-?B%|rh9x$ zMcG}xZwb}O)j&ifD(Q#DC_}V_wz6POB=ZnAn-}fffkI9IYGKLV*pZRL9oOBL4R`L@ z&IR{OQF?QBwYoHiZGK}0-_-Q%+}IL4@L`6qzEY)UZaebz_1iY&LDSZ8GSXNBW$~?} zU+f8z$80#hFDn6afYE$o9SHQg`LH%GmlB65>e|X+RQ%~o$Ua>iLss`Y zRM72RZgvigi|K)VbMmjwxkQ0x@>6P5zcsGugA#?4wVZND;;|E9L|lOtf;-&JFf##CG!B?Jy&& zRtEkj#%#vXY^UwdWw%VEvGc)oA*f?9Mh_>e8eZB24PN?YrnE@gb@4rE^=Zxs+xw7X zgxWVkn2L=kL>_Fi0Jis&AN6B9EZ`KX>%W3B{^qqoz`vPNF_A$l%8%;^p3pn?jr+}% zZ-(+3AUIR5a(>L#Oy3mVm-1GN8Ky~qZhUGxf)Pe5|JF~VlnkA;Vk_Ma4D=sb9uB=Y zHnTIyepD5{V&wU9wA`MjMVllE&u#<-3_wPp;D7VJYwpv2dCIhHZ7G!#kp8UG1<1T* zpZ?9~3J+eIPHFDjG^cx?u%X=%AF${GR`W6ue62X?1@`WY2n6)DLr-HytOffQ%y1EP z{=*6o6;-Gp%ydZDEY8Kmpmz!r8KxQ2$<{^ebt~dz4Q1pH`E-P$9R|{R71PkI*#|=U zbO6Ckn!0+AvXN4ak4uWh>*vnmt*F(~Ee&^tJ{z0`d+-64?5+na+wG~SP4pfq=gG9l zPJ@0xunvxiUj_>ffCXiHz=f4<_;$1JN!eYq2mYGpPvclF1v_&9`g~0a%hw;{{)mjq zw{*+&sWm`88bY)gY2YumXk}>Y(#P4!G#tdN$VtiE*{M zL;B9%in-|1o$k;5E_WE+CE&g9TIL_fxiy9L)elX%Q-!V3>k00$f1v!T&TR&X_D4l8 zjeS^+t+3VY7jHbiCN6?=UawvXfftLxn5%0}!=B(gSrV?CX2VQUY9bj4^XY1|9_p@Q zRp+t2WCb&Q*XmWY_UOx8J=O+oGR$*Wir-pVW?(3Y(xxyU@j4sVaUXU2%tI(hS?KH} zU%FF*ygMRkB^Bm-HeY*7O=^UQ-<~3KDA@7KflAY0aWu`hIEE9c;WNU#yt;{Qyw2CW z_qXG;1VgTKVqUc^KC2}jE6=CU;I%LkBt6rm(Y>uqH;`4lRBek zgA$qNN?ByJrWX0r|xR7k{cI_*>4(7KkcHOw9Ue|G~HtB}?lq zKxjX`!o!*|BmmX7*pjAEkRsz2jJPpx1yhgvxa%aW`O&sqJeZ=oKS6cJK_x$$cVZX12%QDl&QP81HBqdlua= zr#7){)7DEY*ewQF(9;apG$c_MPV~`=7(=zp)iJg1w#s11@z&tLQHpAAy~TM7r#@un z?O9fx1I;s(59yQ?iJCzqNk*Aay&;3zz9be=H$0b%50D0j)cgEq1Xw1Vp+OfVFx|-tO|8YDAH+Q$#6Ql$cxoD8 z%Hf&vcP|-Ld4OnXWJe!_P3Tt7%VqtO6}8nPr*0u3cLaGmDi;^wSg9T9Z-@M^Oo9@` z0KH-HiLnyrDQch+^?BECi|)V*Ej%VQ>+$CTfWKT~?J#6@9>#T3M4*(yQY+L< zx5wUAxWS+=N~X7pA3L@ha9th7T@HF!>R_Pop|In7*OLq!+Si22FP*RvqGufneL!s( zNAj2F^5`RpJFN%;N%pYhdZMD*k+AtUMJ@!Dxilh2DOy`KDfkhZS_-Eg#Wt|yg#MhV z^;}+qc78fL()OB(!VoDrizRz>?K>0|P}7Mx z{jelgY8PfB7GhjB)L}?=!s-X14w1APXp-1fhUb;(VPo|a%vqHF>Xy(BNr8LvJ%{_q zt?Iznu{o5eDsEUMckKqXq}XaAc$I>i1>@x#XR)m!NFQJut}`ghsH*QOAynFPC1M;l zMV=YP>xO|tQXfmEwLY^VpV*Nw3U|5$V0ag6RPE+gs{oZY%5=BLW&yJjrnR{C4TcuF zRm9i5m*~9-sOI!1ldO(}D&nkrNj%MxkuVL%B0s)*g_#X3ZpFnZR!bUf;MAcV*OvZ( zQ`$vAOh_i3<*DUyl^gc!rbh?AH@G%TTTfOz+~R^4&0k$P`<^IXdb#*TkMkV=XTJY> zE9iJL<>Uw43S0nvH2*U(_TLBH|0c$&SgT@-p!g(j84*}bM97FB3dLE7LvNsHXy%gB z2_Ok-2u0fBb8i^+(qw3FqEmkl;p;!)jGu*k{rL7D!OuN8<#_L-%P!bXvtomghqQ`M z%Sdz2{@CPlC4IY|F`WUL++6?xs~gNX!UNbC1!QRblsiidWU@cb*AVc>9^!yomfaN( zr@(9_>w5Y_YFcad{le=5yR{fv;;58)HMO;>H|cz-_1jNdH`}0-paFjl0WMV=yK#&?ct(jcc7`bES zUad|TM}%kqu=waJY~ld71nVcs&?0E}Y7Lfi=M?ut1xoQ)%VAn|cSxc$K~1A3k0R+$>6{`2fYuI0A-n(LJWM2>N!1LM|A6rJJ=m3D-BL+HT(-v=F$}4iG2wI z5>l0@bU6&jmTAGUhePFOSM#3hqKA`tlntiJKW?JYv2GvP zGguyB^R*+b*cvOUTWgP7xyRtNmLA=|P$Fw;X^8$W($0b@ueQt50RjPnyA#~q-QC^Y zA-KCgxVyW%ySux)TW|;t^Ss^DHQirLbx+m&h_lbV_FDT|wO)qnG<74qYRc>>`On!# z%VJE*R$0hR>Q^qAD`+mw_nFPTY+NqVxqH5T{qJn|G7W0$Q?x&_ubBy3w(eP|I)5HA z^FfBmkl9)NUOFs!J^w254Oi;{5YyftmjhDlBnD7_mzSD9e=Be@loM^rp0b>^7ZO6n zw`>jGz|u)uVUaeJ9AL5W{@%WMmDz-&>?J66D6K_s$FC;VY_y{s;NsT4@1nlwM1$(4 zdccx`DBOR^q{3mnsBHFYJrLye7KFHSoGrN0r{1EV)H|)4CO1NtpWE@0qL2*e&xfuD zVSFGmya%a`wr^^SP!svp>WYQ4v#*$sHu>9-FFu(nDyDEV-l6D>K=~Gbq6@G?r_n`0 zdP^Fo%aNx9 zKaz4N20fx_Fc=h#h5wA0kY^D1%dcHXAGlm_0}2b)LyIJ!$fze4uy1(iN+4=A4KPH} z-63$G6sFwa=Z*e2fK-L5L*k<|kVPYh#B(Ba{00QW)E#V}ZLPNpCx(BoM@c0HU1)vF zco_3YEw&*Ir;sAQ(wKrN2lBsVY48zCME6f2#r9F+j0k9*L$i_h_rEA@Dx+Fk-q6E7 zWJi4hTTK+2%D{-D$*$gr)^(MCb9G~G!Uir4Sck@~Z-3=Su$)0w8nGhX??b}oNH3NR zNBPu@_%89^QHF|eh_BH;h^GxmG(kz3PhC1O1_W>D0(up`UBAVRJ%ZcPXV zLszt!X~Vb-x;jI$ZoU20=y>HKZCT1BNe&;JkUr_ciK2kfCAuu;y5FL^4Gxq~5S0-&5(!HTDo1d@0_^9n2voek# zETvJQZR{HQWn@M0(4L^7D(}?jN>|}CJVmZJC?(YoM$p^Z#-=#g_)OR3o-gIvUNB=m zGBZ+I-8uZ#PzGm`l9OSy{FCdb2k^$uhVm5(Zv_?@vk1U1$HL06U(>UjCk0S?TZKuqGII&(w25%n}CU83~HD0Z?^CQc5veC#Ybx^;p0-|?UT!0$c> zr#s314Z$M{c22c=941@pRFQ;tzN!t6Z95px)q3dYt5om^{jC0HQ_ZIz3rt1Y(cs90 z*-fzV1^V^tgp156fn()VSX8>&dL$tw@oDR;bu2t;gnsb~cI^D*)#$iHIoWv})tG+* zySG|u8LwB1DwXPCS1xt;K37ZY3R4`S14iOm%GI+NY&f~2!q>HU$779f}APScC4| zz)Gpc%*wt>R<*eNERrL4o)juOGAgd}43Ya+q?((~0yDMZN0mB?QubLmD!Ik_cWx~u zJe+$r0dG~krH0~$YJGB!+ppTvzvQb2va*x@q^y>e>i~L1yWXj@OdB0J+o*&fp0(U5 zF9%P>cF@5eEVSO0r}HtJxYfID#>d%jJDQgXEQJ(lkJmmau}fh(*D`ySD;)f)2T!H% zh~>6F$T87cSmUBN^~l#W4m!t5Mgza7aJnK(#&t<1Q*f9{_B`D}8~<=F{(epch~1O} z^mbV|y_$(g-(HzB`wy^e_EN9_K%C)+@HBQ)-IL#^Y~H-6lp=K6v#lV;ht89Z`i?%Sg=D5_uH z^lD*oCPW?mN5qnz0j*Q-rowcdB%#PAR@c?wA;~B#ZI3QgZO?;6jqp9BrGM5tw3NBh z#x}Mq)EX-FHB}$g858zyJ+M+*f?V**_mAz8I%j6_>H6|IR7ma!p*O*Ke|97gcoubz zlK@H>(M<;pwYKdOYdi1BvyF3*TXSgr;r+g%3C6iVoyF&s0NMEu8RE`74nLf~a&2&< zl`7`x>`?3(r4(v1zCB=i+|>3Gn;SjM^CWp%a7)_0mG1P4Dp!|AIYdj)9fU&BowJ2% z8;H%(d5hVDxRdV+KW3G7BeQIV^?N32x-bg!`yk6bZVFU7ka`pE1=%_DevG>!p_{jh z+=?a#gp8v478SE1TyGX0m7#c1_CiDRMln5Pn^;DA1$@e(Gw|~@UKh^u)+14+SX!+5 zX@>C<&8BN>qgUBk-wugvIUCyRWUMyGZ0f7ncM?Oylc?U5({aol7M3HX|+%6825&fW+|y}pG{J6-@Rmyg(}>vsMAnP z-%w$^e4UX+WX8QNiI!oWZG5pvs;Owwb}4HVmv8>eAfsO+&JMYq5bqlA=DZEZkstIY z7Tdql?g<>3_F0300;)<3i}w`<>S$(mTs`ia6-%#WQl)*Iwez`K04Os79}huhB;sb0 zyQ-`wkizL(BsAHTl-zazw@&$3{ln|e2+9%IV83Unz>7`<|5iK|zNiNaKX5tu!Fz`3 zv7gq`5dbI6P!|#~r-Xj?Yu7so#2xw3iQ4u^r6XurNw=-Z?{>jQC#-EFs!j|p81lXK zcSqaA7!T0H{3SE-ODDdv{ug*@->)q=c`a|tib9Bf7A3@L4QM6d)(fOxuXe~k*yeQ8 z=6(AY_M6N;Bk6N047U|5KHW=SsI4_txM{*E5u_w``dHow5f(8}v!oudt4U#26vEyn z;OrX`S!l0vo)WzJGMNEePAJ;QS2pHbl!iZ}VqB{rz35N&2#h22UCUUVu#!l6~wFfQ~= zNT!VDWLo!UEs%kwOxo1R66)$hFRb)mtiGSt4xiL>1JP2ytq`P;21<95tj%N2!&TA& zXF;8R^nm4T8f3UVTS>Xqm+0Ra@%x`llJ+8y)Y9C_BjBz(G(1~!t<^yHVfVum8=CG} z?Y_3`81yD7I8AvNwwo%M4yzlG8Ng%;l%sPJI=g$LoWaCgYgtiKLfj?UVV+4YM%VuWqh z@i$M1!~4LG8x^k~j~Qd>f-nwij*R!0Z1*3>Pg|zy`^A_fccCyA8 zgD?SL;-&=i6hDOPttY1i$jat;c#iDpn#z*?;tXW8vbE}JO#?_5jL$agYh^1OT>z|NttQ$F z)Y?X}EGFuCwwQiLG`mPH1~%%d6-#wngsUS^4ILe`4yf0ELEE&bwWhGRCu!-*(s?!} z8QdU=6H;ES@8OYpMEaLRN!O~ltB)87(WIaqQETmIYj4MF^^{Vak~eMjdJr{~WL zT#Z4jv(OYxfa-FAOlB2_NCkXG)%0t%nc4;9+*m#41FXBu60#NxWiqW{|ILBMF3bH`#L4x1 zw~Wd3_&&6&^$taZ^srh{B9m~-HXoS1x^h#vEz56x?IBkzCt?;SeI=L=tgHQOfS6l; zUL*}H&IT5xAZ0;H-V@&>6q6_al+oF7&kswCfkb-mGK230So6>Pf&RFF2NIr=*N>fC zCZ`-^41ktQ^^ft&feNQb4Ao!)cLmi&h>92VwIZBH?R!s^Z4N{#bGcw>4!Z3?Rix`h zDQi_D_&FN2*kqHC3p@=tonmlCH}ReL?-*CJ*SK*)uc|s^ZGqdR45u_dz-a_CurSy` zJ)_X>VFhc%7XsdxhleOVgH)G8XgzwAHlkdiuochyJcCH+J;5eLgrQJdlg~|Q@~W%Z z)HNm+>l~>021wHV_J0wxYR(^jV5D>Glk#dG7Nfc&Blqi+i4YA9D zm3nqBHT1;ou7cYkO$#YZ%nwANfQ>~-p8q9*NCAaK2@tnIhXxpQdZQ=|`yT`{A_$W_ zN@d9dz5P<+f+bZj#_-dCUI+GCWnH38b1wUSRjA)**h0RXmJFCh8kHhSVxc%fA7y<$ zcR}9FwO{hXDSJe(GOf?4#UpO>IP|ZMV7m+VAWY0M*+cZpqjtw$y>f*UN+7!^M>2~B z+TUF87B(>&|Abjatu)||d_RgG)3*H6_$7B?fdh3~UY4B-vC`jtsuBNE-D2_H_{XLbK5=4f(UbvtXA9kXJy0#jo58c3I@LoNHI04iw+5tTjW`hL`F)Adnke@t+xP;b$No%bC z9$Z#1|B~g>V*6rI6_!?2hrI<$1XB8H`w|V%NYu2d>hOKvv;BI0_CCqRypp~m-aX)+ z$#lGGJMrv!;@WYT?z+p7k^@@}?x|ou8j=NeJZPb zOf6zfQveO!VTcR}xa$tJfGIQ`iF&T(#VblH?^aiji9WxDB2%8ki@6ao+1glOb#NN7VWE`6pVj}x6Hk(C&i z#S&eKvdNstm=LF7#2g}J%c4dv~7@HSC}0+C=I&tD+nFb!<3OeHe57~Ou((* zUPunW+({T%l&C4A#~GvkQBAmi{=o|)zHm8dU4q#BX-CuLB`pTA&%J;4D7*X zTVG-RID4gl;_uk0G&!bRa6(zDL0g|;Eb3LY$0N#X-(Y=B zg9j_>_80XJU8-!sSK_uj=ETJTrjOUmQD{mfXqPIJj0~nYU6kdM2Rq`nQvH^iCttr@ z!Q$M(d@6OsC9q-bO-SSoDDWoLT~TL8%34Obbg6!qG~Jyg28%P)pUcf5S3%(GcGlA1 zLfyMxQkUb&9@1$6!6@MZvhs04?}DcAJ-H7QY>o@VQ?wYU-gHkJY6@J$R#XaW1($oJ z)E$XM+Q0H&4XKlq?bC+64J&gg@C6&10{p^-;wY3(Hr43UY~A0^Kk9pE^wuyLk?NGW zCyPd~kqWXQ(chxnbDM9o@3~zh`#b>E8K#?@(sqI zd|$@U#qx>FskQ!zRlQrn{hAh@WAzN~Qzj5nW{`=E>v|iSzS1BvQ$JgClL-`d?y#P9 zVnepfoqju(<_F+(j14Y$A8>RQ&ph{6Lk5z0UIv2HBQKDT>R_;R2k=D9pNK#&;uRkDh|tNd8}j)nd3?|>V^f6>`1mzRe@*y!^MY3 z3Y5Ty>qy`RIt-%+;?zWh7_QtA;!a{o?f0`0R_jhx6=ItFUcAGEhOra*$oh&(%VIgE zC24#!JiS@MKbV-1&JVLR_4Radj9?9M!tC^hq^GGwV|STAW6*>+ko2tTaSbk+=wJZ? zl~2J&%HkqSgA|Y3kwVI_Dv~&s@1M|Zn)%;aW|d;Iq07`hqN>mp?4kkSZeUHi=l+2=y9k`- zi^ApRn4ELqp>rTk36^+|vz+KvVBs3#1j-1MNhoDU2)9Nw+Y@$Cb@}}bm?C%}^JYr> zQ{=a%iEdd*e+q)3Vv33h=sf&(8-&e9?M8 zZIYmK#8Dg{`G4DjXfWapuJSY2;qOx9nxgjA@7UINB8on-pCrtVR39NokP2*(h-UoP z$Q*vJk04@YT1 zA0u`hPQxw|YL9A3GuRDJ1c`!qrlbOTblHk%&~ohh#I=rj%k zK~n;{$2uZs2OfY3k8k0P~CouM3pdD|A9ViOL8mDO- zC6i1Tp(K-DW)mNhq29tR(qmQo#{L(?1$c*{Av8PLcu78x^cWI zr+9!_hL(;BEEH}UEYBLm`&G9csZK_5ux1&T!xEygF86XiLkXRX2_KJ+KmM#NQZ_0F z*~vw`O`Gzt5AM$owSHu%aV+soquV&13EOA+i}e@f0aD!YP@;18T_)wnV$40#&Ny zaFP`}y&hZ6DBguxsC5=bQ_}#s^vIA;o(*2@0a`iZJer{Vopx;>==Gr~XloQD?8%8g ze;7ARILKV84~YH>DfpHjJdsP-%)nNdQzY2e)99ugI&%#C`lvoL3!a&!Dez*=qBrQAH=h2uXDDrj z8o-SX3`5x{(Qf{%2+AlfwKvJZeC%%rXb++{Ov6y|XF?qd{GJr?vPcSDXq6(oB5`-= zDe;K_8%VJR*^hJMHoQpU*2ayiF?=0Qk2|BfI!6*9x#dnLr%16YP?C5PQw^)l93~-z zZPKf*kQG9OuFS}+{Y+AspI3j7NOL@04Bh7ks#RG8hLZ4m+l&tu%r~pT4`~KiPw{@$ z4TG?Ju=4$J$x~)aXNV-;O_FoGFijUcHY(VYIWI}Q{t5>h7RkD)Lq_7GFn+zyG^V0i zN{OJ_m&EQ!wG-{e#P~`kk|;YyI`|x-7)3EWdus7STFnuW8n2=BC@FJ}6fh-&jcf;~ zfdT>z5he9Rzn0MrpD+{k1;+O_eHGT)co_AtRuEKWoZLH~7V5DL>l`?#)p%@Z8n~3Y z%neV(?Z_5!%Mz%Fl)rA-{mTsKD$~oe7{QmU40aJGCg0%}nod~Ick^uCz?olkq*m=g zralGdZ2xwMTx-=?V%wYfmOf}G3#@fy^MFFo0wny~WjrK;yAb@T8RDgPbzUJar4yzRiupJf z@IMyJ&X^i`I#h8EQs-gJhs|cL&b{8UHlRP>-&S_Mc||&4aCo8hL#qy)is*(mArQJ@ zklwndvMvX&A{Z)#(kY{WhT;2sNp;>7slP~uiW$DDht>psJ;$hji4L_;b}QWm&l$4vLdHY2m)-PmF{_<`yu*RmhnrJ~!MRX}n@qfRoyDml@viz-}>m;%zH5h0! zYU5g)Yl|(?nrFIo5$zhYxI&X3B14{*t>3l5^=Ipohq4OGI%rECAA&Jro*OX)MSy`| zLt!!DbVV~rQAdqEzw#7GIM*|$WFttFNALN1n2$Mar3q@D`P=%dKXHBCGQ}VZ>tF$>~!6q$7cF3~Qh?%Ia_#q6j~Sv=yf@3f(X|r;$xV(J9{dgyp;{U7eR7 zOa)+*Lm@8M!LG1)g$6-HTf=g>mG>b87$p+i0z!CgUSqM==cg#+im92~U-2Oab^OH* zvG6TY`>kO;=`rI|5O~fjzNF~~dO7+`+)BnCMO6-O7 z;ay7>-^9Dc8emWwXIBxi@%bP;{n748KxZt9z(0rw3{zn9vtakU)1Op#hQ9$o%Dnv$ z`;k%$c#kR9AyHeAu=Q#DKR;7|5?lhbA=riMH(GCxK&OCjfuw!p?4%Rob=^vRzd!HJ9 zd7`~~_S=uIhBZYXM) zBVP%>UE-&Lw8ekzAqnPP)KGQ`FZjmsG1-JSto(cHVc%_}-qMyUnI$P1!p1bM&*xPBJ-|PM&mUJg2+w za?JF;)q?q|-TJ|A*lP}Pd6SP=;G=X_go|Du0~K{=NXC=HJ+IC7%+wEMuiDO!IP|YE zczB0N@;%k^cR=SG%6QW=DX`uk&G7qTd@Low!C4#vit^m)1<$&*QRtd z#sNdR#i^8Vm;>Y5PRF zIB7nzXVl>!6cI)6*|KrIRj#L-{Iw0)WmH&LVH#oLd_^v0eC<301wShr>XLGw^8h9l zZd69WoN}TvCS$zlrgX*_?Sy1uloPW7;_oJPFGh3rgg$?1>fv_eer$NJB}CbyMX8f_1%%FBD&tYhBB3w@!bLjE6E93FljkV{PqtM%60&pyJ%p$$DlG z!)UfYQ7TR<%zBt`K$CvFekmn^n|aV^z;Y*^ajrnuWdXywqwfJO^_E9}ZNRy_l^?n` zZQt-E(;IuMQE>*M#ig?ml*wB~ha%gANvrm?n6HqHz^#iQu`lU>M5bt24Tuzc@DfSy z?YhQR=jN1hzg8^)R zak!_ZwQ`Ft;*LRA_7WR#y(L^4vWgwS>JGVXNKnM`@dGB<>j7G|N<;80@1Z*%7&Ye4 zP(I~*s@b2wTc-nbEE^-&&T+}6`_q(vGhW%Sd?v(l!y{b_T5}=m;Qhq zpc?-it>xRB!TJpFf%QE)c7B)X8%M$czo?EkRGTGe(eY{&>TpQOP<#SmEWSFO8)aZ( z#MNwl{Y~-7g1WM=MwlcVjKri2+o=pLj9GdBIyY1z5W0696yT8!jp^=~ZyAdu^K*Gs zS=MR3W13eSt+0-Q*KM=s4`E1$eNHZK%&S=r9+ zy;TBSDe)M~f%G~|J4i)yE~U0ulEwhnl#$iRq>e5qOd5B*wX|`t7)^&rP-Z)7qH`zK zw;Fu|$GDo6xfDL~0S5ml2hq^`Di!JlUeDUyqT3O=ma5-rj6{O@JbW$cYMb=&k1GFwaBKZm0F(7lxR4Oy!BT58 zL6VqNVt{#-yDY{-4@n2GBa2!WNAU*G{sA2%53)g;D!}_w+~R4jJrr^3BU}|?6_r?@ z@?b>KJwc9dB#>=}BcKa{X%BVFA?Ov2pl46u6seEj#6j?0Ok3-Yhnhjx%LU&QDkCNz zQ6RVp{pKmAorNICS2P>qBe6x9J%+Q-qmuj3nrr^oQ$pc%@-)TNwj_H;1){z*Q%q&= zRbu5;vJEK9D=bVyKc7nIrFBv}l~7JS+rMFSao&7$E-3O_3hrH9^8XP$7D8N`U^poI z$YA%#-NK*M!33gV5s`c5bcCc4(vUOu^8z%oe(mbOIh?z22N1Lw#?| z@I@dc7ou+Fsz~mdNNh9ah@B<~V$dsrs4>j2S&4i}815X6k|mB|>j5`{hj8dzc;EFg zqroM9mX)0;Ml?m-Q;kQw9R;?zdb+5}yJ`|qUMuHenib0k&NbI&;vBaWn^EKn2nQn(kLK>n<_ zY&ub3*O;Z9c)QTLoZN5sh^pChUea(69o6n|KPzakJEWzo6dm^^!n~wJHJ2vS_ryWh z_^Bfo^YjtT6%>V=rA{96js!7j8f1a=cmd8|8twuP3R?mmQzF(*rBU(c&?|K!d*QTj z=tU>sl_Wn*6qvhoXMV2OOHbH|;L@$`upG-`xMeMu=-bhh}Ui%pt zH{=XHQmuH*=#H5s_V=oACu;ih@9LRA5Ug3G`)_J?G*r3m&uPSXxIFn7;2j}0G{ttl z$83$N1k{{sreD*~<;t=B;d}5@$`nsa5`fs7iRi+N8dRr{?%#6jf%W4(x*(Mf{Ux|c zO&kT2{^3R`t{5q<`nc&rnc&{^_;tkE>Wn)oqNfek6&2sq7+c7i1? zGC0Q9!8dN!n52q(Hzl{ozkO&7rKJ^zK6qMBb9rc;kaW&$I)m%{?r0mdhTgznEUZ8D zoL-Oqvg#d#IQnv4bfY<`TxH$~E2St~Jn$mBFyriaLqf%eO^4V~vtFI!Gu_ph;^mRu-H@hHWjY6|2?X@KL<6m6qhZZi83!sE{0!nDc|KUw2YW$C0 z{#Q#nDd|ELSq)|6D?}P2l!!bWh&)D z9^s6J-Szw}g8>QNs4>>)mLpF(Sso(}ReCBr)@*N^t5k^*hXltC|I7-si201{Q7H3!8~>Ow&1mg1RbXZF zf|upOB>(bMhRgH=HQs;Vj=>-?FoC$^&VR!lmldS3qGi*~X1Hec78ZoDtj>%2n|o0V z0A0zvU5T7%L@Cg?&Ni8@$X+|IvLaIeuk%3oS(1do2FX&WwaRzeDz&WM^3lvAEvFim z1tu!S*lnE=doZS2?T}_Tit~y>jU4G}W$O%F0ac6c#t6`redMg|7h?$s3N6(_(cuQZ&lw#XC=udb0XDu@yDD&-`mO$F*RTGS#A@c&VvK$gT*W#^yC>t={%TV{ zROFUd=PprSDCNy!Yoc&hC?ge1-}RXV=4!|rzP~ygfwvhQ9XYTgdYW>Aa~W%oCn?p8 zmPK2vETdmUSZq*FX@I1;@noN^`i~@m4Wk*)Rjz|DC3Bj>;M%#JW~L*XKN?mny_Dm( zCUNGOk=lkFiRk8YUu@M%Mvw8LJlElN7V|m|>btsBtev^s>ZWvSJ>KEmuL91CXlPFy ztL&6A|8j;yNVb+8q=EcQfS}#wh@gU)HX7x}X@N~Nz%K1&*sWhZHo!apHM+)>-3?re zrNwy0xv%^Rc+{)?Y!#rpG=s3&MFzto7pQjH2bFyJdhF;OCBQ>sU)rb1+x4gyyiPny z{7#EMMqHi{HCeD|nZCLC`l3>!)PkJcAgYnMXRq$TUA(@K^;LeEx}dJ}KuJsS(MdMt zM~Wm?9blnd*pu1tYv9y1`#|E$j;zcVWPq5jPyq|8z4TH_TJ}nyQy}F7EpCN*As8{9 zK^Ij62Ymvg=r(QLhA;-C+!YfaIU?uXo6)@eOx0(m((eq6 z@--!HVc9myV}5x`p>E509VTaW-L+c)9%1Jj^Yq@$zFH#DXyRavb6~r>=x++6$aPEe z$YBx$OWEM`b!_1bXMDC(%e?B`_;$?KLx`r%<%CtCC*FsgjE8&JSDw62^zj~0z4`0p z7z;~NyAGDxlN3_@Tf1Fq7QH60zpP+Y1OBe1Z5vnPb;nd2Az&wo@FzmM)Fhx}E|LC1 zZ;98vk*C>}NS`_VDqZ*+7)9p;=A@GG z);Mp;Pt$;%<<>B?;iZ6uXrFx^k0v4y8pTT-&pV#iiD(=yS401CQd~|}%w(CwQ?RMs zHHa2bD}BXoe@~i3Ib4A>MhnC=`Iq?mls`Zk@*Dd-c7Bb@;x^*d>{JTMBX51V&al|I zX@Kq#3*p1(f0EPx1bRx)g4N-GVIE;14Vmiyb#(rRwGHKlJ%swX!nqvBHYoAO4;}|u zuz;MH5Meq9VML62L^U#LH5H{_QjeJ#UeLl@91^wr6NPeZQgDoQQd{w-1dN(B7PBD>x`Qdc-AE@D3`z0Pg{ z5jFO=&Zs-`KsEhY^^!+GRKOoms3=;@QD)X4n*0iEKG$+>q>v|sUM!v-Z6@b?G30vd z&?>u%Zq}_$05~_fT%Mk(A(-2SH#;?_+kRvql?mH41f=VWo$z{V!kw|%fm=%CCa4fvo>K)5q;-=H(zx+7eK*_al8al5MMUK1I`@J z49yM4Js<69I)^W-eOerz;x1Hm@!GA4t88T4OuFJHNn=dQ^OUTy5#x&+Z4QI9@{aoAY7TNYdCa;SC&Q}v*yJ&m(4euhyqcZ#wRi+Wb||(^ zJyETi94slxa5ylM_mMc3n9aP?g09z0^0-$OhNA!jPUJWC%!NaRi3Lm)x zz%1AI%2DEMVo#Ph^2orGJvzsojg{%R3GNxs1CC0n&=(@!jA4XHB+LB+m6{3NMNtkm z#O!s2TqU(5*r(%+)1&UA~fTrAzEx9Z`|~WvRA}w*#x)t_}d!DmWmZUA9L_TYWqN)+*XJu8|w0 zKSsx>GA#OIC2OK$)k<0IrbE*#&=4O)(h-JO?8c0le% z2`**V7m(w4flldDwx{;o1Rw^|9vtEZk2dr3!w%kIv3UY_ET3_GY7D5FOM#qZzI_eY zDehf4>55=2-(fxGMu!Wa2M#!4PwxRb=?t^Zxqa49hzB6No*$+{1AI3D0AI%Gi02eQ z%52Hrj&^6{7diVfxLDsEkkm+IM^63l?Xt1B|ETvewTMQe%}ma#1`*#PyN$Eb8BYfK z%&SO#OvTY7(xoZqZ_R3NQs-QT`bj!wCb&I=E6W9mw_y)**m;_{w6gB(V8?vo2c|7f zI8{tAV8jPiNhtT}s5uEp0w>9{z~3FYz2PouF^at-v~l6GFKnA}L8C z^^)>l?EMcSQiHE*^UAWQ>QrFX??u^-IW8*1wW!|dIqry13mq1p)gcb$MF*`Bhm#B9 zFD7xMU@W@gd60<+Oi(hDbTuJl!ea8BycNKP)MxvS=wzLo#hd< zqus(TN=Xy3`}5MX&i@!CeO4Hlm)Ox|p{B{-ro1rKXc=u+Su}9d$W{Qjc!bX;q*$^v zdR>B%cf_QdEJA%Rg^(!5M=uD}j5-81QF3vD%$*A+lG|DRXg|ArS=8+nh4v_Ys27x= zyS#y-^AFiOGZWkPjEH^*HSXOfmUluT=Y(SCQXo&%QAW$W$rztaw|HL03Gl@#7m}8s zCZsTRotV58aZT!n^6t$=_eOHgax1ojyr#uIWAM*UyCw-26qCz=c~dTb(Q!A2K3Y)M zZ<*2fGg0Kt_d!*9BKUeez2Bs)BdoLwiP5?N;dV9$@+9vZhOHlrdsANkcCHND8eF+1 z#B1l&+d8_J`+XB=fHk1#_qJP5!>pxD3ruKhrcB#tUWKdErz@t*g9$mftVp$6nvdmE zD6i+$)Yqy+AWJ`m5^~hE8K!OCSx{$-Tw$p>DEx3ZK5WgSOAGe7?3|rSbCCKouW@Rd zu4d@I{+Eyd*%LgkLU|?RoV><6Z)F*w=1M1Bjs{I8sWM$XU<<9d7Vijqo^;QmFWAg%9TU8`hm!l!9sG`dVC)l%!@ z2@CAYg1yRs4RK7HmhWAyr%nu_r6TAKiZT7`P|${jSk#uJhxXx#tV8j`Tw|7v=1u7y z;DlP>(hXQ-4W6Uas>~ab)2%I%qnej4&2Vv(!IF)OFbDJ|pP&2VDs}RsSl_p62RD8V zDUv$`?&preYc6+}4MfILR!?6d<&_)s$+YmRT=}U69M$RbnD&*&t6S8SjDucMo|*UH ztP^Dt-*QUaYh(VM4^ddrqcW^1VP4_&JGk`1Z+TV^j|2{=TkujDhfO3977C{8pocn_Y0Xm!(}?@>;@c4g2rVDsIc0CKDu|EYvgS$8HIN=tg&-+mLux$~a|B0ST$KcqV`KWT55w#b)X;#GWD1}i zZ>pFxJl1?s=-@DxrpVt~9;$y*m+W5IP*CZ3Xy0VTY%pRjYcI^f&&G;elr~)FM4LV) z@qr@SHUr_9PBIoj4AbHwMZ+5^0p*tczF1EG4=1?`_m9(0brD41_3g>Ha4{*(pH4KF zM2dF9EXyC<3rSf}ZcSFL1}Aniyo#+!G)|E^R596)$#fGGnWj5;893F;%`qJgopD#W zq+Om+5g~ueWAuf3fTZLFqmM?O83b58leW^2d|xaxn-Z&SjgY;P^FIUZ6o+a393gd_ zhp3O~v2u%6LOu#1X8GKKHd4PB-`%w&=5WP+JUDRX%N2I3plorz7V~8B!p{`ZWvjM_ zxx~?4=2O`bq^dCQPq|S&n|o*Qdvk3QoV&(%`q?z$EzW&uOMW^(z<#0Cuk$~qsDRZ-pso^Qb^LmqOOwaf0mduX}(s0zM4V~(l5zs&`Ubh|rUyDX`s}ji? zuINQGL_~onbt^o=7Plz(S?G14)pnPKvLkh?T>bG2JmwRb*Wn{AIzGA{u5UJHx+rD- zrKuz>t*z;(-w2Swu~I=?g|DYvd1yLS?m(tdNei{{*o+^Z%P;xMblgPl*=Je9^?nFN z=qd3mwU2pV&Fu<&=TKtADWPG*Keei=<|iGCuJP>gX8n7A=2@uMln-eq%jaZ%l7FVw zzG|Fjab`$_=FR29@mmaTbld~BXvRSm3071}bpw4ngo zy$-eXI`$vJ@t9oT|3;7&e%lX^S zsHw;yss>Yj+T#7SC-HOpr0_cTx@jxbUltM90@&-0I0pUaVR>6WFI`S7eRkJj1!t7U zpt0i_#U58XELCx6@5gT($=tTQ&S#747R5`Hvd;5=d9@rT8CwskCM7c*71^C_?OxQo zJ5^$r?q)}yKuAktu*aY)YO~nE2|?_;>E}XE_`#0&Q4IkyRqccK?z;8whPsZF$Tv27 zbtWZxrJ&p>K-6H`2l*K6ezw56<)*iLHg?MQbl&@6h{B0u50tT{AglP3{ceAjF6ocu zE_7V9saPXBJA!HQc;nL5@!FDgqcUFv)!=~VQlBmhc0TDT<~e3&qtI!M81FuW!kg{S zB5IU}Mn7%2q8=4_%}f}P;j1E(;EOSc$DgAHgVkaFOF~NO(yLoA;So4WrFqs5IhML< zB7tMZMlX5K^w<){4MBd%$V-}RtP7PUbxJ^KN6paRPB<`No7)6xOEi2%zDrJcw*+y6 zfqKa9Uzpq*v|eOLLKU`6>I5J45f*0^xUTP1>nU#=*b~CbT6Xhu_UHoE%NJ~?=HJ?y zyyJ=+FA7DHl8LLdEaqWx*^I9aK|e@(H^dT9@gRIuNCLDa-k0r4wW@0=jv^IyV6*0o z1A~%RgrqK6@~fJeWSTY2rM7}R4P2}U%9ba^q@D;(I-K}*UIj15MJ?aWgo zTOLuMWsdNz5`hORW$dYxaDkUHr(OlLHh`=1F#iLtQ!9}g7WWD^I5+4sfMa^O($VH9 zEvhe7-s)W2E$j3Wu!-kmkoUDfXzqe+iK33|X)XtcvaW&bxXhZ-z%apJLpY3g7P@;j zaoHSKdbs7LHtOFSn;QLon|mp|Ncm(BpXp@2;LfR?FK#2zDjY_Hzk)khYWI_%Vist* z2SaxKXENeH!&GPR@PZkbz@Gso@c-MRBVa=6|1wPfV_V^=j-!Uk2iCzw4+Dbq3xqX@ z)S_W6wNkxQOus_yBNPRVE7%RlY54NMBl}kzp=uix^Hg#82J83@;u~()@_l2k z5%Nh~95WrRqbz zAy&vCiYy7`6tXf4;}lzTUw`ISkVDqh4f@IK>kr2*v?u~~6+}0GLk*iE{2ULdht}J| z#m10l@;w$+XN8eRf+b_Az7Kjki_5A3|L4TlfPRwN*J5{P0LYrp11nomn>;^ z{MTX_0SU0o!<#)xTnogDu6V5ob;fFl!mSJ`SjA(-k0^XRk*EDdV-?slbUCHWLr1*s!S-m25$=;6L7 zZ9!V;c3P;*rhffw!QF38hHZe&6qdEXBJofpg1*LYj~LdBP%AJmfpo>kTjCLQ?2Id( zXx^oz!nPeV>noY^gbrkg@>M+fMc;6xAjdo^>M8fn zBeCQ#Qem_FNuEpmf^e1n0{w?De={;Qr5vK!CaZ&+cX2m}8_`Jp7A zw{Q9=hTVB*4kjhH_;X0LXd_}msynK#E$6uEO9*+NG_^=J?>v&s9eaec1T8`NWS&DP zsOA^0Y2!C*8_0_(WJqO98R>IMXLt}rn-Q)WPE{RTn-44TiDJhz_D6b(@zO4+cA;e* zJo}&SkZtrK{IUS8y;c}U=FD6< zFdO9Eb&;Dmb^96|EV(j9;XQJYOk%%;?{*n5AqLU_BIZrOj-8+r<7c!!U+ir3JuXHs z^lq}=zePpGFgqdmvGDS(7T)qM*bkm_(-uTsa$qw%hzqK^adPK?qfp? zcfB4eG1FoHDV3B7v*KdTHn@l9?WD((aPyX7M8qgqALNObzZswOt}wu8;aRmUo=8`M zQuPx$2G740VnLnKCol=9ac1e0BA)3_g+x%3mJ`82v3Rl#-TUg?Zk{V+n^$wY^M^w} z!{QW?aqrV<fvS%?W9kl@loBy#t^xhE4z#yczIag~U}8lLG#-e~_QvReb9mFBC`1^G*cu zm{Je)hCZm32{VR>qb7)NfCrSp7_7q&cC`%3IO^*-#eO*waIUq0w#1(rWJy1!acGhT z|H=#qq90UfskLJUyUiw7@C?lRd&Db-Fk>dPabd$guPZ_ihjK5kG3GZhtk?G%dfNl3 zCVIn{{9A|}Cq%)F|8x|wcOePTZum3|OJ9XzXCetuFLa*9mUO&`)T{>j#q(&O0J|0{ zNLC>pyw(J_JgBIQ$ttpl$Hg%93P=iFgWUB5i~n$Tb8HbMXx!>fUJKG^qqxc(6g>wh z*%6n?NTQA9UcN=V4XJvJ0(LB|&p}A98~pP?B`+h+(di;WX*YzD=nn&d|A7U2NPXgqTJ+wWCoC_St}mb05EI8 zIdz_k`uRJ2H6m%%1_b?3t(CkI6T#25a}xwB8*i|-66&(3wn^9^Nt(5ctaU8D)}Y~f zbia91c2m>Q=OE4?D;o7#Q87kr-Z5Saqgt@#(vtsfv_q%s7PW?$Eeba0ol^4#+dDl0 zaplFvG{Tt{)wLJA@UFt2$l5U*b-DH0Gma$&RV5R}9Ps%{&=+?(GCZ=jbgs5lDq6vD zbEbyPSX=riQ!PNX>}*1|(n#X&*NFg;_Bgfe-n zRQS~_CDpAce=AAgJD}!vG#ih_K>;fInhC7X9T(W`->fMac@`Kpk6h$0iV6nlSHuzW z7Cd7tq0~GTT1` zvs-uJpsG0YqYM%rqyBtD`D1cS!Oecb!o11 z+%7f^H_U#M!UdN#QTtL*M!^RS{)jqQkq4-7WLPngQ;bKpRTIg%(eyVFxsxMIC;{d0IgsC+Q?Jg)s+LK6i4Cr<3S{%xFIAHOmAa0mD37y3 z8Ln6vt_NgYw+t!344oz>K)Kd*EN9kbKMp6WXMHITBs*X&o0<=9YYLfH8`$a0_)u5S ztrIu<$0>YNoapdrLGwoK%uqEku{!P+#(piWK2tocoKTzh+p(@M?iYJYJ~*4cJMIm8 z+$As`>u%Z;6DRx=BPaX5u}gQS*-5he1x@X|uu6f)rQNk(jjm9v(^&GeS)~Sanq2-p zY@#>E{C%k~?t7Crs!K;(!}4-{>#N>qoxhGvwe9-8aZWzC6xOu12~VSM6@J;ltz9%!gNxX=+06B70GkIgK(+T>g_@eq&KpKed9^gT1m0$hT@xaz_w z<1^#>qTxA>@B8Z$?x*Y-s}EW+sXj0d-d;yLAZEp08V2Z>_I!B*53(lDmAp6 zSBCeEi6G}gWZI2##AVPtwDH`3vg;R^le(=Cr&3oD$ka$S7k)T6cI4{l`U4z%f)0E( z?jP+P!GUow`D)YOx8wXcy4wz0$zt2SH)=;lP+h#14=B8*J?dL|hi2GqRzmm&W^iQi zPDVU8STkQX!l#cRy}UNEFsJCr@29HW_10=%CHvNPf5b~hbJAvOqi3d~ZZHh6q$qyd zH{jYJ^yU=nM^~L?UbrQ%;hZe6zXZ|K8)7cc3j=a>RE8LX3#2FrG#1_5bgpLKR}h8B zEASNQhGwvI%FojBb2iG0Iy@ZNo&T~JW1u1 zv+}GFmC@~cS}=Ai(#s$qC>FVIY#6<8b9x_6x*fFU(6K3#b(FOoHRcC|xm!^B0#`rUEJo4gZ7t-%^+)e(W z$!KKdvSi@?;|rZ6gyfN-(c}*5W99GNp*~?fT@xw>aGLiX$?w&r$-Os23kHj`HjV+Z z@PyfgMWHoHB8Jx9=ZC;ksFk@z1D@k4LU1((>PF9!wKMO&dz=bk^Yp270UE^(a*k}AtP@vH)Z9Y3^ELdbm_{n zzP|8)4K}!w+5pXidDvcD2)8s0sx?dueW+pT2>igz?<)8g@3X&XRxil+Kn}$4Vn7Uq zvzMRp1L(snt+~OT?nSNgRh{?l=x?+TSObrg%ZP{m<23De&|D+*nmMfHjnNCLhAa{) zx}UZwY`O(F+Tf5yev(l^dniWbx{F^mx>^@^Z-p7I5^rWY)$hyk;b4P-n*!PfBhl_vVFh zL5#17yrrr8upv{&%?T-I5YLTZ^0v0v{y_DVQH)@LF@rn;nwYMNx8XH^bmi#nvFzW#VXQOf7)BH zO5`CB8uCHlV(7a8u=9%$zt-P(Gr<>^yjYIU6=fL6mSE6yV1X|PI|Jty1C~2v=}+p` zGU=Aw882NU4NQ$vpjt{dEHUQ}dUN{y?V9GNwDX-7Md!nG%6DoIk#50V4r~2Z1k~!p zVIPuCX9<`=74YG>ld>?ewB}goIR2gjd~6JT47>wP5-5HV2Jn=raHg6q*iHROROB3? zA0HnydN8x{>Q9?^w|d=T{-xB$cU1fpJF*OJow>D@UAj6&%zMv$G7rs3E9v zXKFrJp`D1i%tn%_P}Sm~o#^TWWOX$2n}XJf{=*$C|8EuM|8|)E$Ce(-9eELjH^E1GMOxgS_z#!_NTLZ*CASm=J^_TWQ2ih^ zF-ST4s&qU_!m2Y~oO&L3A)HoK(NobPZ&lUeSOIOB@_Rj<)_e8S<{FxhhE-M5QnTK4 zo0A(OR~le^&AX4+br#q2$1&gWhSyXU+1LADBY@gpUqt=uKJsv6!tSAP+V=fmKpPBD zV%LQuZVLCdmRmxTUS(|w=^dpWIpA&`XV;v1VsOv$_r8|A{F7j1ukb8*#YaTJUUV#Y zMMu1N-q5_X{htq4NW7)NVCE0_(Y&WYp*zGp+4)DzEM}#z$g`fQTc)KPQn5%2-fLj7 zy&RZ6A-#A-vqsF%8kjyYqB$jKdbzV`5N8eu-NK)0=6z}w4=i{aKyvc;E|%Q{{RxEL zN&weO&VD`d@cfV#>G9^uhsKH$d)~y2Egr|LfWdzN4287Jy;8He<8*j%CRf~oGoCN{ zO)e)dxwyPQZkm{bGuF}{TehMZXp+~c`P+J$F8#SF!J5>$TV1G&PS(y+Tp)IAqn;^% zkeh~>NiuP-R1iB3bWzNXnuiMN*GR|=A125)%lgpg+RJIO(ZS2vu+im%3M^d2mjZQ! zF30S-8Jcw@Tt*rfD>RL(RzHm(F)Hm8lKnd%DJj8huE|YOV(0+VN11lhmuoHkYrsNI;s~sm!pg^4=#<>&G~~ZuUWS9fGoMwv{;S_is|5(K=&E4A_v{%~HYq(n%)D z3X2H2WqINxaWSRS;QRtl(f+YMCF{Bj9Z{sRNqYl7&rB} z{8Fqg41`>M6{@OYGT1uLsh)^pC(TDD)lk`I4!aAG+pa@s!y8aSml&PRbM*+$;+@C> zvQG7-Pev!BBV4vM=z zKbfZxH2qcHlbl(n(yqw&kmP{YHXxgjd=9ICQtm4ikDR6KPMtdoaaW7o*2oCZG7CQW zgbLnVm6$bmG|>e_J}cQS)3%UxnX9NvmIOnNEI;wh8-aBVRq0XM1+W+80FU|?EWu`0 zL>Z!W&?Qi1Dy|YlH_Ue2j^zqrpWCh%V&i}dB6i>aB6dIq3A^MZgC{r02&g(IC=P=o z6ZJenAMOcJm_r~sS=c_JHWVe_)At-~5dbf-iAj>@FElW!CI);!ep8 z(;eX1E5}EmXbIuAL9Ln$A9V4HwV__+0^M*&I zCLG@vQ;ja^*a*ulqhfbqjnp^2$DaEqlm(h~GU!!1nt_j8#R4d^8_5xu!*_t@?5O zpkbph8X}WntbH zV^5jpw2fR+~MARpKzOa@ymOUZ?ERh9{bN43X5xn4~c!s=!uvk-)0T!?k z!-U-E-o~AsTjGp%nUNWJXGNP6pAQfHt2K<}!*xe$D^s@u@?R8$&a-?{Y?e}W!Vr{t zF21ep*c7^UppG~TaM}U8Y|jtUHE><>66T1Upu^`4~X=uW#mAExu5o#IRwkC{L@ z0&hnnx?h&bIlnuV*e3=g0PvmwcuMu@8uv<3RrVNH0Br!Q7hnwv`3tgU0_*(u;14e(ou0$E3`s-yN(!JkJ1wAGU`z^hf>9T$gbqC0 zT(^)P_U9d`f7`&rC10%!gwY!6p_B^uxPn<`f@@uq6=waaM_-iR# z+nijs^l`W1Q0{=t_k?s+Fg~d59?ob%HK((gzoFw;N%~+2rySg>Lvo!h+)%(5sZ8@3`MZ z&SEW2GoTS7uE?uXxgmSuiyVn=sHK20nOxhbS{GCZoO%Sr(WcC{Pw?;|VRRfJ|91|P zz7sH}C4@{WIj#aUBkH5p;`-bp6`tA1?P>>{WU=9@6-juP_m5+(Hfg03X(eI|ikTVZ z^fI9#?!~SYR~jOU?zn~Rp6N6fSP~D)#1o~n(~yR``Qdx3#0a-|t)^Jaw4lww`4MBO z!<7eDA(@Q06HH-PfHMql+~FZ--WjW)F$>wWN`ODhl0WzFvMY=EZp!1_*VdYc2%#GZ z*d7cU*VDYRi?Zr^f*0wjzJ*N*BEd-`0m(c3%OiCT0mi)aAm^=MO~c$|du63o#bo;; zhm`izcFbSFP-MBTK(r0Er)G88GjvqGz({;2_}zagzcQ=bF|8tKaSw{tkapT9dA+uf zmEktPYk=+bjlf#|LO%DC^cOiSw>nZ8fi~FIq1+B-j+NTMdj-OVNmYi?=@1%XN|na6 z0v=L)Y(;Qlh0tZNhNbM!hE<|rx2_S&8N7`(#@)_)T1NCHx?|Fg2&Dy3Su3XRj7cDP z&X9{3=dn6*l4y{#4QN`1k{lK`Qlt7FYemRXNWq4Qj2gm+uNq_LO&I%?8Te7OB=%2>%Oxrt~RgKS-k%Yt>EnBB#e&tUIL2osU&7!)&*iG`vXToZ@Gop!O_p_nr3N|}`Ft#I98vHQfhF?>E_viIms z3V<=w*XW&mYxfU*90%520wb%^4s9XfG$G_gAsPY|ulhAgGu&3BUa6+vrW<*|npZUW z;zYrYZ|Q)LG=@m0i~>JVO&_h;g$NlOw|RjYoaY3{3dn&qIvm25fU|nK2rqV z@cwh9{ZF_VHhlVR9vA?C@~2`-`9Glu;wA?6{{=jVR?)Ki@q&M`Zavbhw@RGPAxfvi zN9_MWUvrcJCytS^#x5Bg2G^Zgz{s$9LcAQ(Cmw_YfFO3?`He=r#h+ibpz5;&c2nTb zw4Y?9RXi%0#=&IPeeHcbfpL88hx-k>L&__=hht6hV?322{B6TCmHY<*m9#%M1(4r%)^JvLU?q(rkW195a=`*-fg+kiK^bx zwyxhIvzAuDNn^^IW)hK zWBX3BbT?X~f6Lq&W$Z0N5^JnReo0j@CI(^_QremQbM~M|q?f|xNhVmoWMaxM?RoE> z;ueisBV|}+Qy)VHEYD&VT9ERV{fdx8;Iio!l-$FREp$Qyl6|cnw6UK-!*n44DU=dl ziiMN$8XyI<_ARy*YL~5;*RbdpsZ4w>yVLAG3Qxlwf70H1hF;G3iD8fm zAEs;4^`bh9vnwD8b$?-}Co4wW+2Im;Pl8U(YL z+~?Rs%uM^^gy&!gTI>Whrc9jR0q&A{M`na{=3BhoH~zsZEPNmMZNZR3gM!9b%FTh2NXGB*9%?87MMpna5Rt>FX~n3m=MY2X*&+f*9^vxm+-M^|jQ(;0 z)jV}81DWc1YVX?(U|~FhrxEn8Wdd*R!J6?m%D?m5RJgiDr<}IZq*33zqA%;G!EDpl zimo-kR}Tj+m``mv0LZ2RNG0rcCgD4Y*8|q}2#fJ{H+;<9Odhl8 zy@hCQl8t?^upGArlWx)`X8fMV#XrFQ>u4Z)^kmQm1pq+#IngBg-$ui~?YX0WS^-F6 zKdpdHIx1li1U(?iHF&79YgKZVd~rj5D}Pj*$N|Q1s0^L<4gsTWYp*xBw=%z6y)`FI z9x#qei+|#Ra@QBOdx%K4LPuL^ZTA~ySL4=SpV!lV0NTB942j0r!`{$PjDo2t1O^NO zYa@nl;poYO_Il88hA+yZY`jRnav}{hhK1uWF9Fm~1D=umLj=6?m%zRpsErjaO6M4#4FfJ zoLV9rqdiCEq?!OPQmB|>D)xXMp^}|*K`#i*$REWUP-;-3)>3^)He~7j8GE(V}?qIGWjK@mwyhY*kS+U5+t@q zQHa`Swh%h-pSXdY^RI};7t&MA%j)ZBq7FBa!4KyL8?ob$XpdYm~awqL9lWv;r3Lp-^6*i$heBHMtVEi z#h!XEHM+{I7IN=t{*&#ZfNZxd7I#87BJ#awU|qQYOb=f&{~Hw6L{JOeJs?|pC23Sm z$0OaA5_@P=h^}r^&XX_6Gh*xu`EibX=!r1NE=Zg2a$`6%qnwL&Oy`W4;Ch#Qbf9rd zriUn4t8kS%YfY{m`q1w`hqL0(x(!pmk)iPCx+&-9l=OdWyolR5Im_Ew*gBgy{-<+U zL|ys6tmTS+<~HWf+!jSe9mO<6oKu&QsjLfAC_hq(3MW)Xo+WRRcr#SPo;<5RU)8Df zy?{IAGndPFz~29QXH&B3iuxwv5_@8;y2ThPc_fQu zWa}`-%%1H%KhYFi20eLKhH*n0x%rWY#{|RG@~wA&esNOfst`;SBQdJ0?{qBC;MTCI zekv=z+cy5lvXA!ssQe1u@RADUx@i~D9>!l_Tnp9h$KLQGUf#c!YnVRnpV4imkt4$l z#HKkZ^l|BuiFGHt}jVTS3LSOfG$==&F`RsVJrh{8tV(0~#qjAo69qZK$hq zlxpM7(Q}muE9Ct+0NKG&3alfshTqUXf6irY2q}9A>t+*pc|S=x?&+!ZN4)ISu7Ltt z-`=ptu~@I>;ts>rs&(+5-5KNvzt#{PttAmMjv^tOna0Z9PM}Q^VN_t{{2)Q-mj~}6 z-tuPpQmo5DvbFL1rd=+0*{$b@^m5C#DWj}CTc?aDm~5ZFAxE_Z>aR@zo;WibBiz<`1rv+oxTC&Fl!-&LttoA<5P4R7k2V_WBZ|6&Sbl!`oD!xE*hECiWjL0>z0 zbJ97R+x|VhK>v`5KpkR5gNr%VGeGt5W3E6Q`0F)az^gghGe&zjUibkN)`%^DsFhM{=eL;BG^`S2bA^#?<0 zOFq>$^K*Z}N;2)h6I!bSZ3*&YR{`thBVLf<6Zk{~Zxr1TQvv$$&lsc^jArMhB0>!d zGBkmHfYUZ8K=47SVAl+Yo!=;oa^n{f>lBJx{Q1egUd8`g_BHH4HcuaY_*M)7<%-K! z?I-(6>{o>Z2?67UKWg6ekM#+2um$^xCaDFSb-ftN8f82A%XmgFQ&U>h0@Z8xfIv`8 z-p{h$Z%H5T>GFE~MbTjPIWJO-nP=GDs`qAE#y_nAaGqHvbGWuE&EU$qmu&7(0?$7F zj`WP45TGO0+!j`|J5Q77@j~q8kK?E@EsN{icgZ7j%!~8lfyyO3&g9HJjP;@?FYdlZ zRwm)NWc)ct{*tArI(w3~AC%)M6_c>V7+K046^Z!Ctm)3xFUvkmdW;hK&Hk6MZ~9_u zWBPrpXUXotdrr<+`%5;EZSmHIwoJ3Kp5JCsxcMFrxu5^nzV)B^7iwJ1 zg!e;zUj9&@|6@ny|7-sJ$0d=KJGKgjFImQ>1Z#p;Mj^3H0zi>%OQTiI0x1ot#hR_H zOoN1^X00r1f^ov;YHbR$fQUjMTW2nK*bXRNss9}6ytqvlRsJ3f0s?}<_sjD3+l!Cc zl&xt?1C8*r$5SSg+0?V|wOjW%$Nhz0b~m^_*;k%nUnEYe)X;mE{VpvXvUhHxDBi&c zoWs3=?bXo{(S~5Iho-Nd%LKQ`9!UWKkZq~`vF;g?^gnB2_<+skbR z^?PB&{6@~9o80Y*mhMK3i0za^L*d>!Wwz>$g^_Oi!(ZeYaL)D{si5%(%CHgue})nHWN6IJQ6%cJyZ zgJ*BlAn@fq#em{My@k4fgP8Y(y!Lv**Z^@2F`S%E^j#v&5j`K$pC!mb&IMrL{x zd;t#6?VvEer==w!W~z)>i3<}w_omh0Uij<4t#LUYE`yS2J|99317cZN9I-Erunr!U z6uLybT03%L$iAs0S(UMU6%h~UGIZgjGO;PNSUkeqb`9A>s=!~HVhp*{GVu-K+9pAF z+FUa-V4qX-LAxGXcM#BJJPd2Msato*Fvsq>@3wO>$$-;p$=l)vxO(vgVZOM~-p2vw{BBM#) zh~KI7{>zPGiiLT^GNui#NX{fMie5o< zt%9!-+mM5*k}L?MeuEF@%u_+N*zQ&K(5L$cop3eaM%RUCN6mSE8I*;t-2YWlkGh+ovhOUzGPZxXejK0iLe0 z(*-npZCkOl9tM5XofF~c>@sLpy5&ipAVR6;P~YMJbD?ifo4m-qn0Gu8K0$`qG`^%>irqih zF~&)m+*C&a>X9g=ps=dGk6^)38d(?eC2MVU+c<XyfY-ertvuvt7Xn?cVNj{MmS|U9VL)rog!C0ph;&MX^6<@_P$MVkUAtLTn z|9F^f-DiSWF~sUY?lIhxb2(R>v6I*d78W(m8_vpu z5#Is@=-!CWRBxq^;J5ZY3b#q+na{g~6;9+&68>d;N_s(4s1Kg=epSfu4o|!;@xz$J zF8bz2BslxUZ~%ScLkKt1%D6-CG6Km!J#NPCVbYrsJW7OU&-WU}wm9x@m6H2<&%z1{zJQf;26)L6S^3%AT8I7~P6=*%W2z@VbR?ieNjlvFoB(I8lF2 z!+fB2)n9BC>kKD0iD=Uz*4avaV~QFQ)qP@DxNsMfp*0DN>7}rb%1cuVzQYQ>5^{CZ z4KdwLzH=p%Lqa}+8{1@eE|aCmxw%sI#N<$G1p^dhQE;<@e661-Sn}38zVe}hIfpte z))EnGC1yAaX@1pTFZH62^AxEd!SEOd38x%puSbuCXlC&BL*3 z2_jW-rL1lucN;7s3TKFC=|9y~Z6K67msf&MZWV?vlfeQ(ZdHD7pY9i^m^~%>B6t35 z4%?muo9zZP8(9~nzH~syT8BWb9JuGX^Wcp9QisEA44D4*Vei2dr++gsqw-siiFqHo z5X$bVhPS31tbS&POu|CzHGzhS?cIh|sX^Mi2zLjcTG^qeb??#AASfeF=cdIwBB*gC zHToSTf{$Bh6Ee!bAGW7ME7$e54?~>magfjiiR2`DgvwTt!v+rx8ODcksAT%BU(`&l z=}}#pMPRH9AT|%fN+ILOqp*s!>$e1}DNmDdSA`)0@&!pTGcSa^Fra2WG!^@%^>^dDNT>d2r;0T`+IBz{sq19@z zMaYmn?ps)CE>Y~iG3QsEW!7P(?!`K^>6u`x^nm#CuI0p1*Fde5-tdnohn4r}kx4$V zX_gBWv7Una{f~>ebKMJKE5J?C5)K}fj_0J!|6EL4nWH6Gl-#-{B0!6qj$lS+Ih!r# zcWAqf+0Pz>#_(Ok`UWl1w_uybbGu$eE1WAQjq*?pg=83Wt~oh7BWzBTu<7^3nn>s} zFK0JrxPFN9kChp13z%2)3f}yB=v~;4%vEWd|K8t0RW)?pAJN24DA0qt}`jc#tBK~MA+EB~vZ0E5HV|18nvPU@Txzsv;Ueowb5p_=Mk=Y~F5Zf&;>kdl!#i(9eD3Ou zb}j;Y@?@PQO3nU-s=*=`HC;+H$T``V1CT(arT9XT`gV%ru_CWI-GwU*=6W`(Ll&Zv zRZhP5Ac5!ZEBIDOc=`Eaic1P1Cv1s*Gfo88IX#_RI=i%LQ79yeHN`xB@??nySrIMG z`XZsouqb}~8UnoM?A_rYq=V zoq^NJE8>*)%B|w1=%Q(pR+KS@;zJnH<)u3T5iFGz?ti<)Hr_KQ(X1)aQP|grbCPq1 z$}6(fZfO}OR`iF-nOIZn`k)!@_Hj_qZjvMDZj<;s@Ac*HzU>}BLz=^rdb?5CAaUww zq@1-*O%-;8!2-!2(dO99s*6iiwe)(oU{F{;>tPjt@ZD890pF>c20fRE*Zg7Rdl8x6 z6P75mENQp;9$J>PFoT@b5yUaGEz=0{D<{|Vc#J-PqGf#2OwJl}N{|8%@*PyXoNv&3 z6rNGX;M{p}xS9A^yBZESTthIKg~z~)Ee?7B%dZiYmo0L|TOKUrM?93iYQZbg9CswR#p>@V$UI&6{TLlJxI;7 z=haZOVm~BloTgtLlU}yI%vLtTzS?E06s7ti|1J%Jc1hk1!q^zfCA8YDMR2VPYP0yP z+4$HYeXdtG>rNKAu06BN_MA(4vDB^2KC{jCTu10m*1JBKBYlQmoph9(DyBas5bo+p z66E8VgP5Hu5-Nix+=EUu+4HUhFsbyZXy0eWdU;A5`(m#R?rtM^?wM>z2_`>%=80vE z1TNF=HMTIlL5P2wbVYQ31N`R!=s&|4qodL4@#g@*;Rg|=`2RPI|9#7^{_kAq#g#QH zQanEpF+X@jfl;q)~x{5 z46Q@7!|CStJTo6W-b&ZX@h!AaqmtTNzo}%SS`ugEGrRzZXan=8@L&Ah#B` zHHZKZ;QOy2Lt9_vl9`p3)Kp-&sEOS_;V#hh6;BdeY;A39t!{>jnn_8OVr;X61LQ1= zHi|oT0jO*>@8Ft9-&(|_+U>h5F5DA?NXpdvxI>f$;-mGJ3Zb6MVo7kysTEZ@u@{X@tpj_5w=o3MTGFR{lABq$_qHfxE6dQj-b>OFe62NSvpW4 zjcQ`(!HOmk1k*9erH)q!mom?%St#iN)0{27s0(Z6N=O|Kuc=fUVb zJ>*u?a<70Ew9#e#UF~+hcN{E1wK2ElVWr~%Y}lHKPC&Pz9`d8JJ>DWUNmoT^5;kOI zNQf0$8Xc8)SAIpf96(se>TOxH=jfyJ=(!e9@ zTi|9Azx)GlM(?ETgx(NAv=dPG`L;>~0@D-p3Dm>JxugyvAinRC7q2ke3kzv)3Iu`J z1(O?K6GasSJ4DgPApDB(4U@=KOd+TzBo2}IK=&o=b2>OGx##s3~m^rW61+Dib>Lb00ywQU26}#3A-j=!ndno{!T=*b^&<#u>G0#(ZVS3$?R;3E> z>D40v|FbB%XLsWU@g>0YLiQmQcsY~OguKcT4Dx<@;d~kb@*Sc^`~tVz3HhA_;*S%L z|A!nNl3|6F9f&%cz=pP$AmJ2u!&WA3VDl<>5Jt1v$;`b46Zc6D=aZ_+%P6a%8!_x; z3=gZwXnei+dWUiCQbyVD6QmjzTwYejm!u-v#+_J!g9QsGsXl#5y31M4qo8c%j(k_i z;`sOWDGUhsX7uI9u!4vT>j2uSau&eXY$mF1see7t$Y+G+(TRfxFem8pQjEM3lvVG zQuMKNIJiHytjsWNW9^XbH6cHniSrhbha7qH=Q=mv+JssJ!5Cq7z(fgrVIXP&H{?ZF z5PIUvOC9MqCtRSGGumtqIeT5O=6UVqQ9^*sM@j&AIpibn_L9u8vQ&fNAGTBb@D`GL&vFI_{ z(8enVgGTJP=(5~PvLKmbEaXhGCo*ZBhKQL|vO!je!jT+BxyZw*9c`X|13DN^fjQ{* zG#5LiE*BUjLGEzJe{jvnCz}>qqcIIvQWv(|IF*g$A6S=-b=iS-x{BXV^>P*PK zTuJx^7U2x6_@_s)ds`-<+5IJ(jMOv7Z!VdDVe>KTjmQrfx!IX^Y?TqXdgHZwiI{+| z1X!%W*s0KNjy?cxQTqUwjWiW;J;3ezh!e-!MtveF)+a{0px6p~6*Up-g?NE5r+YkQ z)e_B8N(@|SA8bgQ^Wy^D!x{c^Jn)Ddpvv`US{&H6kf7D$mz2bAE>IQc^}Od7S0BgY zJdatNxalIh@zh<+9LoyzoafIxQa1?Yu)%z0M~dS8X1gt94_Fy0HSqvE8f0x_g}HAT zO^RVwwn;eVoR^Q5lpX+57O_xoojmCJbq}(`YwW;xGzpOk49CyH9cDHmwDUV5N`>m2 z2&>Xq+KtbM#>n#q!@rwJp6bUGb}Uc~@Ti<= zeVgYnW1Z5^UmA}ygGhW9t*=sc7}auq7qxlkFukS%FE?<3(Rlx|q`79x5Rkb^Y7zA8 z3ua#DU$e#6iI!u&r_7qE$0w+7=*g|c1f-jU`75P9qsMxvf&%7ZqSAubpI(bUghwNqMb-{qm%YMY5m zD?L4Lk3lPsN!ub$m&Z<}Z5PmTXTND)8OXaF0i76R;89geSwBY=lr(51;R;x493V&y zxnWCeitytiYlKeXmN!PI>?JqV*W$4L{ljc(=6N=tvIS`xlrqV9pz5YPYFcr0k#nb#gT z{N0I*+#^a%m;67 zFU#BD8^U)LaW9r`tsuQ7tQ)FEP&!>4^&_uaTz4GWS$tm{b9Ydzf$6k~i)H=jZqO}I z=ZKA|&W(U&+qvri(uKtp*>8S#V9|5c3oopgcF4!&{}=S>ogIMM^aBr=|Bzjx|I^x8 z&fdVm#YD)!-r2?RKO9s7*4B1L2G0L_x%yuqf~tRqze226h-nEE<&zZQ6$If4k*m-_ zJR~d)!BNdMFQIh${r|zg=#;;t{RF&Z7nKekgx_{`#elorHepjxGWS#o(MzK4^&Sz#S3y!Ym3UB}ffbM>uFkDVg^G*YiQa>P>6f z4Zm0C?n5}3vfC3RHsM#aXN9s|s%~OFiOdLd1~1&4M>f{h1YBwca;GQGk^-oZp-5koXfCR^bP1+Q&_G71cB8OoeZ|{sOjV5HYf{hBis;$O*T;7N}-bB@rP z;od^y*gSLR5m(j;eK9h{1oNfz4>YgIX3FlPKPbUt+|>!nm4n%Ey|vsk^m=}k4&tMR zWQ|O5#81R|=U)-$UjyETH`IGG&7)mW|F8u0KP-V(h*wDfs)Li-lPh^_-XOln>6}7J ztoxeJ3AWqxqdSR8VUx~3C8=uLw|sla_3`Zel%X`0iyPTEzWW1=L?oMK)+H~BqW?qM zI|WI?HRzvZyDH1*vTfV8tGjHQU0t?q+qR7^qszAK-h98AiT!3bV*V4m7kQbHcPGzt z9{g%nGEGkE@ZwCuUP2Bx3BQv!%8|HJ>{`dyJk8uAZgP^_eaSg=#uR;nk!Oc!@+zJ? z%ewY*D-JKkz>Uaw9_VmHJsVQ zk59000+oyD-8y7|X8a;GC?93D8Zz$iw+S_0;C04@`5_C1DdZVfPfZOSsdkp!LJOF< zxRy(-IXm1)oH9zu=)UC?G6z67%aZ0*D^T?1uG^>jVmtnz|i;ueo?fr}59w0JfSpvIBW^9!Fm>;Y^ z9Qv@Oy%|mT0IJd%;RnnStbk2HiopQ5QZEeU^RKQnmCitGNk^c_elUs{StH)y0}eqz zVd;Mfx644vYJhpg=8+DBo6I=qg@^7>J2r#*pdJ5-3;GEH#78muSR?kRvmi^`h9RjG zxdk@WErv*2r)1>i8wEXZF!#p|oJ*oU5^?#7{wqjOgKCAzN=FXFM=kkBk*rbH;lt7a z@lh-5F+>gOV7e079<*WO*wIGx2^*64po>K37nDeUB*EU-S$YtN7OrC=VR5fWHnExR zR0(zt#{Co7Hh7Vkbdb4xS$2|KJb6H}3cA91qG0=Kz;Vw5IlRksjGHe;9YX&jN3i(! zy_qcr%4Nx*Q6`W=Tij%BVy_A>NdH{1IQtdWqB|mYj3eUynUyG{3dy*VoR^ zd`11V(vK;qn$iFs1oXFHubmjtn9#~T6CZSE#HjVHfix%nSh*h?l&@$rNKHg}`{V;N zrh4B=T@tpn!{1<=o3Wi;`eA2IB#L{#y2HNyjpqDM8h%S3Lb@7=k4gmMqXhr|9E|_* z)X=PH>4Lrj_!>ze*CyPD#IwOP29pk=Dno%IhN6^c5gzHZ2^7`EKBz}ck&wW}$zp(& z-|Uu7WwTA-knbSVm%_`#W@mG;pLbDgb+P|y`T5RU`rPA*E71U9xp{`)?S4Gnxvjt5 zZExUp*v)%+uPZh5`S!+-P++GYdUBnx z_d(I`1qGStXcv@_@L-n|;X#>DU}SLA*8?W^X2;O)S(+&0hPs5%@Jt!=ISn~?#N5Lp zi%4*C5M6*Te1`eabL0g~_4`3{sfS0#O3%<@D$W@#p-=L$xyQ;%+FJ**vqwtkJ)hpq zP670`(#}?Dde)*U++v;KNx71qEHFP(Eji%sj_5+GGyum((7pTl3B*R>;1FFDc-Hlv z--HE({OXU%pQ}+C-5EP^(3CVkcF-gf+3+@!n6lBFy|_N*FQ2v&CQU)O%4Btw)mtxN zhOAL?646vzz+-**lG|&`!JUg4wJh%8#97)i)}a}hahfyD35z$d?H*rLWAb}DP~+pu z3|F+4aIoo6R3uY%24`I>k0P8mo05~cPD_(IJ#~@fQ_w0Q7LPt@jzqbZag zT$JKT-_}x-hvY;wM_^5v9W^?|K4mT|ZVIwHD@PiX%E-Wx#f50mVakQIdNQgLM2~IU zgV>EJaZwQ#E=poeF;PwIEehQ{UFG+3QW0+di5^@}!q37f>cw`vo@73u6UuPf-c(K* z@cCe;VXl#&!CX1air-v+8kRmGrp*Z7Y*g}H&=^kpK-ZN6C)0u)x^#LO(W9K#a2LE#M*SyZ!jyYc!L?Jn=qd=#AA0wS)JelIa z9agl2^!AgR;^(vXCUBL*HC}>2I>@omdxD@r(aYRh(_=CAatJ>$5T>=D53ZYA6BbI2 zUroxd_k&YNUF$K2y|uQdRR;@wbYV%1aKd>Ihgc%mUv4^lG_p6XRqmuhy;o+%)U1d0 z23&mAK5EwcPtv#LZ0${Oe%p7FIBSImls-h!J@i$uZ#RZY>4HBQ{QTkB< z#(aFCv@|`#A2a(E(Ayff1U{)W8!FCf!_POq9DLP#&@aTQf+~)@Zk{&*5m>LAv9}2k zxjUsaZufUHY9IK$N{-OFud>T!(dFNFO#!_l_G%v~?0KvKOlW+z9t5@Z`>hiWp}8w+yk@PW02Ypp2;7Ae2-*YU0F(=PUcQv z`FRLB+`Rv&_y7&$y;fZ0a5!@FvWkvVxkyoc>pBl4g|PldSV-3{jQP7|F~pN`Swi^a z#MFnHX52w`OB)$!{)%F1--c?nmq9~`=lPBB{QHS6y*{caz}!oV?~{$Ck?o4299D1#kmWb&#~59a6T*SB7&CO58CRL0pfuBmjI= z@l5SY>`yg?`PGU%?*QT6i9D`qv6fb7dK6?w!zz*?NgC5eBU;9=W>*LJML}bV-99}|Hw$1iCG0jLocVf3)rf4 zCmhq`aJs>4wl@o?kev~xE0T(2u{jQxA4K2EPtDe(v^^qLT@cu3 zgW3Sge!6+=H>P@Mq1c>yvVs9aoF7l+-jJhk-8VddHYP^sC?N&I z^wAm_pHSG;VdJU>hOu|l>Hx>O0NO|;VgXqd-`EBy4eGBh9+UK22=d>FZn&OG^fF)& zTd3i!qL{eK(>h5cOBd9VBs%O-s4?s1PD&(fO=>_01mDDh(tX_ofz~m;79tug4O$nl zTrJ9OA!Nt@EeJo5VQGVQ+Q1J|e!nv4a{Ay%J+;0@q75=-fR z{(d;Fh9~aKwx}+eO$>;PYAl{TGmyY|?5OeqfYwkWjKQn98@L>(H$ptB7-%nL?3R-G z@cz-W3ofzjGL=V#{QjFaFoieWXpsfAh#IFzIXoGQ47!3|pb);q3~62q_N8ti4kyLsABSA^RDuvscFaV`8d^dhbL zlfRR@Ard%LCDrBB_Yb9-H}&kAOd+_Lh-Y)+)PbiZxr&q}TW6X$#5; zXwn}(Wb(vGxO165&hzcj*YH9a2=SzkjE1yTc0A6$#uu58pjzBFTi#C*!LV26KQUG- z2(loe{4vdLy-c^Wd=JT_j`X}JgNMV91*r4(RoK+g%oR)o zMVE;3riucYQC{;UBL8AW{jjAx)Rf3+wT-Df0mEdUS&v|Q4p`5_YFsp?eZ(9Yz-f{b^G;%)TKK0 zyeH3ATkuHncKwZUW^VX`aBofSp1bTX)cRRxYa`7wBE!>ospl&gzT6@)aA|DaA5sV5FfKoKd%uC{Lrg17r~G2+{QXa0ex zAvy8VPqf4J1(H37^SJ~4xfjLy`$d@l*$fs&Hxw;pccan$+Vi*b@Al(^^WNSMxIQWk z46b2rJ5XdrHULK4cd>uNjP0qY zXgwl{b7+q+or({W|H!#{I-U{^s?9ZU&X0^fb4ER+nA=#Hb#%4&Ri<=zYb^-ed1zF& z=S;I&TXVQ)MHy-VrVl-xH#2f|Gk%0AoRwTDFzZQSUR&$xtSweQJhV)fc0an>DI%oc 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

    J0n5SQ8a)y$@O#|`=S+4r_ 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

    o;SMd7A;P17lK$ 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%0A;XA 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%0Ak8pTsKFkiLH;eEB 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 z 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 z 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

    39Y9FYxxOs;C|L$is4^oTX{cex< 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%0DjT6e;*o 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 z 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%0Dkc`T< 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ⅇ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 Ll`NmRt3Kon6h>7!#G(o8dJ?Kr}Mgm%+kqZ40 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

    H_$kP^H zC*(B`_c|z8bO!gp1KMF-lj8;(j=o*24}t)ng=2*6a>_tYnt>dft3d}2xi!&f--c3aL#ZtZwJ?N- z)~X6_o)$`!&5*InBYFNP!y@4+$a9s^KoPU6Jda>WUEyIVMN^y=8JojMo)JHiAz+ZU zqsot+3g`2OP{#`NS;=FEeZ@QYy&)a5W^tQxK42J`Vx}z3+?dsS#dMFMB>VS9pKVIk zA>0zTc#M^$wE#2!{wL~RbI*?p2_TZs7+gC18&5n=t$^Y5LfF|>#|5rEJD1}!czG92 zOYy*polM{DoP7t8!r(AF10L{1(Kuhy=5Fn~5_0Recgvm&8vZtCTRGz?u5a z&n50rx=m?E;BoA&Ck+ich{(V-S=OA*uwOwDpQrTsq_WG{W_pILT_?0vTnpr0zN{&2 z7jU{t)>q!>c#(*%ME+xGWj4c}lOQf@8t&Y4!stp3lBcYaZ`Xr4EvFDKLNX%tdaIhs z>kvDqd+_e4yRT_v)mrf8czaSkn2bJSmB4ack3WCEDB*xkqaBcX|1%MbT_>qLOpeE> z0iJ1+uf-0Kgl!rsYQ|I<|J_w*-XTXMWfk0x1`>o(3f;G=i907hn>jfB0JWCQEj^Fax>sgZ5^)@}0nW)G zgf(vU+gZJECQw;!hh(>wKJ8yG^U^VT%s4YPz*FxJ!ZWrW#pZ4wyh7cnY$*B~q%wbs zWmUfZWzNOm`{Al|Z6de%d+$)?d+$*C-?>Rk+8F*a6|-}+F?3dNw6iyLbha>c`X3Ki zRjM}sV2i(9J@t}0qB9zF#eN0wg0h0zG<~Sh;p9TK0v1gSzgOWLO!dEMI_2+apMj5A ze~t-D30}KC6m70#9tY#TF-`|r6B}*+Nz?g!S+?r|Z4J*R9V;Wf1{#+vswEDw1o>5$ zQM7BAz}Ag8kb${0RGYsyE^%3ELI1-VW>Q_~RSPb*z&DgX-?wrP2W|V$bBtkatBwwp z8hcLCB|4khGCmV6ZHFGO)yH$Ct*N%GmAGqtCihwUW^L=!-<6-80cVY^$C=g2%@14* zZ8=qt2)r$QUA+fBF+^;3TxM~4prE>_{?ki9Fijk+kvFWmqydJypkHwXc#jN_RV(wb7ZJQ5(tlkt1o5oRF zX-8$FUL0)Kbah5j3E}?%YL_`p&_o+U_2Xs3kgQ?Yy9Iz%V4ZNLM4i6pkp7|nq=O+_ zw&w{iZ?8OrfbCqws?(c-S;Ep8dWTJKEEnjX0TE*Z??Qx?RwRD7t;d&^K5Gx^?(kS1 zf;D0Jch4A}JckK2mW*~m@++M;q^?CIdRHb_JX&gSpN%)IMETcWf@qp1fX9o2Lz9Tz zHxDw@i{Du8*^6?4*R<}3wr*wlGDWuQse{Kb4f51=D?Xym?#X1@0GPL}vH^$q*OMsS z%<((wD2BNxom2%fDjbxJnTH3$IT=Lda#$zfBoJR76V>lk4!L^hsJU02Hx@opYY6}` zJyJ?<795j0B8AG1h*=c8h?uy(FaSJDBtbXDZ$B)o5U&?SrAi%2LV|#Z&b2&YR7&6q z**WW|Z(^k>DIwz9*wuvKg@FbIz9`}PJ)wuNb#fbmlrVP|6<*okG5 zV3=`s{Ca8~_(~%6j>sVAmi&~F3P}9X;u3yMNWF=idsTi9{V-uv$MQVyE7x_717%K? zd0-7+?oo*0cbzKtOKWuS4^GjPWK#BK`KrapT4%~O8t=b{atuht9Yk%`8dQox1n1!R zmj&oHpotFXk={}AJ%LQ7g?_~|&jkn4Jkv(z1i$o%UWGh9A$DnBbd$=+HWKf=PwjTG z3PVqThvT0AMbz`p@n~MWsi*M$&~SzW1SInRd_4ZwM4-B-+xLS5f1+kezS)9r;b0mdpVCuZ*UP$V^#$e}S zknU?>Vq)Sw9D=Xs7T-JfsqBu#Re-g2_wYw|*V9C{r_XVg=hVk0H$&&ceFIP}>?d8n zB*A&my6AHnf{uL$0$6JyNHI6yhTf7-Zjz#`Ei=Qj?4<}Q*U^PClaq*TxMrL%h;f)%vS1gncla$Ci@29VZwZKj@_^JgW9Yzx{S zm6SQM=%Mw}n!1wUh0nH%M5>KPnn{VAV+8HxR&A|0^QfSUiQ&{EE@rS8D;;Ta6O9nH z&U=6b7W#X*yWG&FQj>ix;=)oUzI#!>TOFZA*GrB7qrU{2!K&p(bHJ{a{5;BVKIf&(V9%qa_p0#p4c$q#5Q7S~QX&~=NCYeE`D zBoq%~syqHcNtxqZ{%P&HCFQrEE0WZ*tJ0T?@?2|i@~(#Y@F zdMN@BssR?3CavkD)?3p4A0bJ4{@YU5)bDZuUA5vt%cRe|o%Dhfvd^F|>!Ncw*W%Eh zBC~M4gtqHS4h@{`>UeSOaU0V< zcqEQlJ3RQ{g90Y8AE2V9CV5J9h1*TTb&W>RLR0{8Gz8N$0!w^fQlXPWjww6WXciSA zZ)NC^h@DuYH8&!1F`B4_r`hQI#j9S+p$Ymw!OR*eu%Wff1WdS(aw5jOA8r*jIAcc( z2GsG8k8!vSwJG8Hvge{j_Kikjm}xH@Pj>Iv<+WaH)K_ z>Y-97zP36HP`dRgp;ao>@f|K}?-kJd01Tm-KqZ=tehUs{5CbKGpjj5lk6MK7OYydV zBrp+h5mBjKwZ}qVlOfk1I?5)0KY}d&jte|$Mm@`r@Xd!!uZH>M!x?Hb3fWnLUbtU3 z=0e!vi-e~A5P*+ja)KZBn%ALY4$%L_2&Wj+p3Q5_5%!ce34jhE#=7E+@S_k(3he^* z^iapw2)X4^S$Qa>eLd9iMg2^FLHaj@a+Px7`^%*}07HXI&guFb>VB zbEC<4>2+Fjp0Yv3+7tr}NwoiWPK zSe45sL-U@{fazXqREd^u3w2kDb~8l3j7|ghw^L)dtE~23{foJDFv?R|hsh-M{-Lo) zL7Tsj4sp6eo^-txmKxIk=hb1q_O^7>LZBM$86S-{@(yVsgRQA~k5ZVFE;nE8s^~Z5 zANVxOF7qg{v(-->c8N9MjT(PqCC2_%oCdepbY-MJE1zH?u4(%hdmTB7(hWNTbWd7; z`Uz2m!ZKBv{vw@b(p-8XitHlAMbzq`S3=TiJm6Y|sA{L%^+3U_|lsO?DOXSO{nw7QtqW|FMH2 zx@FF>z#$SA#WSuW3$pDJ_UqZ<`I;g=I>BmPgagEK@u+jZI`vfwz{j=CejLC ziLHKCTCe3H0d^ZOiPko(<5JXmRFt#v}GO05}_Qx3~_8GGs5AR>Vs((*S$FbGfi zBcOm}Ikx=1Hd}jJh_@gW&n(a71MmM=ptsZ@UETw)r(4~oEJ9~~oWqZOf*zuS(6zu7=+eWY_>}8fUxZs|ZT3bfC+QMzXEw?rgzqzzro!D#K8|y~g z=v8oP8`ura>AxbL%oX9gS-e4PK`3XWV+Oi9hrDvV>CFLk(KFC8nRc1o zl6*DHv8y~gTLt^Az_4Llcz6kAPw?mr*o!muB5`5Kr%qP#f@IvYqi%5LcXSkb|%JmMPK>KPp6hq2GtS)1Y%6_jy@(I#4Wv8N4I=*po0&81lV*0~< zz>|*sV)kwH>{_(ty9Zs4v2dPVt~{}oG7%*yVc(poxGA8rO<(_F&7Lp7aWS!1g{wJr z`=RcvGg1;lheu$XWE*#0QSeqkDugjK zQ5+4NfYV19BB1P`I~=XWaNZXT2Atlq^%D9VCz($^uC4UJ~JpgPLK`beRwC>`Az10LICJDY1C((ULNcb4kh3IF?Yic?9kyhL+gOFLeR9!MfDt!r0 z@XK%7o+o}fWqyX84+(b}vA8*3@YLAZFFa%f6Txi4cM%G{xUxvM@FT$lh!gofL=TBi zi3wle|1S0a$=WhYo}n4vGjw*}tRV6KA1Bv;#qE?g<&C9paFCHc;W#E^E3h?TOlEcJ zAkMqQ#ZFv5h#3>Y`U;2K8b>{%hMD@BWz*n&Hk<8y(G|HjsVsN49K}4qdF=>tf`vKz zGb{J)$=PFSQ8!<=5&x%k+V16I^3<`{Ro8da=6~7l`Gnu0{fz6kL6hHEM0G}E>KsFG zZT)56kPv`{^I@=Z5UOgs)Y`T#7F{gV$7{RPMpZ`Hf0UCb6yEdtCt|?9P5mgRv>*W9 z$16JXZNu8}j6= zqE&RWV~>k${(-i^%l&ArEFh`7elNpxkE#J?4Q}MoSxFED5S~=A^V}41p(*OLO08XV z9C3LnI?uf6u>PB8lf)J53}g7I!GkePw+t1A2Uv&{etCg6V{AMcy_m|$lXla72<7lB zlMIn{#CCbed+iiK|+dJE@`(ZTrm;hPBy#&MG(0e+e4C_)=s%k$fG&k`cE{> zkLN@Tr=oEA46 zLKMR6uZf5A^C=UQxd6ttk6(0(zB)V^@^!k5mssQ z=(&H6`7VCv8o4^pu|ieg{6tw&v~1zAFr9yJ-)^Uhkv&6zrBhr-$V3W5AeYpgmywgu7}S;b3nK)wDjH zq52f=wz$a;pr)|MI57vCUMk-4S-s)mc>8TzVU7faM7rq>U}dQ?HuD>*49!yjgc2JM z1#@?(+a^G7C5rqtnQD`KEi4@}Y=uM{(wwAJ6cg{II?rk?tg|Y#E~_mnon9i9<&awv zw-4?!)B`xQ8`wYB>?z|4etf;JK+ARKD`<)8H>mv9?aE|rAB}4XY_Y?sG|goB{CqFm_@3BK$01oI)kD}o8bc!7MFcYQ z3v*Z*B(Y$SQ}oH_()0$d3oqXX2ZxG7)+WnX&Ldq=$W4)7>>Qmt;)}#S2{n#FSZ<*= z9GgS2Fq<-KV4*&d3FJ1@#O#>}`GMIzgft3@Lj1i3ghJB4M4OzV9hFC{`k98cA=u=L zjZVI6$B9TywJlHJ>L*O8l=>rA|qO4Xh>aYo~yfql0&2e-i~F z#?x~65WMYvFTFz{{7`lT;uG0xz7)}rE(P0_s%J@V`*>L0sW=G58#fpU(Y zsJm-rkE-gdvfLBCc(^8fw{gV6ve0x>boCiOD&^+N2Zh0a)N)FF;T*R_*biHT@OawQhPXC&w5pv#p&U5V#8 z(ADvQ_*DA{Zwb+C{TNcM32Ii-d1>;yxf9ftdO$Ikbw@-5?2-ZM89yso)mTBM!)E?GNd#zJ ztHuVIp(5IG;>^2ez{}I$mxe*=-(p4`0~!gKq91m$Lh9w+8pXz0a(^@X!1Fz5&Pw-P z%kWuh-vR`VjNKH~u(~N7k|oU`0M|ZAE)VF9XHo*4k{kY%Zx{f^Uuu=Jzk^B5yE!2=uQo!H!Y3t2ST% z^3*Q({rl%=ymv1C4lWDd&OEMv>-TSKX7@je$80ri^>6g)=Z|!g1jeKQ_!MHtcqyn< zpg9H%MP`tE>S~K$Rlrr6YqSdS$S?_fX`CPc*EjP?kB#C5Jb>1*- z>U(#wp8o#uMBodOCP)>5Rw))YqJ^qU2~~$L2p3yO+8s4F9Da*zMKTzZ#)q`GzQg}Xvect|(-lFW!eeSaeZXv$-oG?|ZscL*Z5&FJ-jW?y^fJHe zpUy*-Dc+vE!MC;`JwopKJEB9B!bY27!vTJMO!Mt`1QCm!Mo3GqJ$DZOg8Y4v>B?xa zax6pg(^Fd__Ntk}+#`PJ@*#XA##piLr8S^~yvq6LqQKVnEQaXlvtW;xSqG#Vh|!$$ z8+p3+AIQ^>3Ps#ocSezj=0kvpKcg{x+fT548qPkA#ivKy%ek`^7~#A!g2WW#ljs_j z#)(-HUOK=O5*F^d2{vOi^1zPR>TMMAHk(f1yJsc0N4V#PW+UzTJa2)d__rDLu1HT; z27RoA3Ph;#8+!T%*KiYm_PXWJ+Z8n`y>VObG24)>98zA6pCenhlT3)j3^+xByh-{ldA zISd&-k%}T^!^D}x{>71QOz(4Woko1VLty&T7#zSU@_nza9bd%>#1_%k8 zVi`p=K<=tz+d>%gL8`*}mXJ>_yy1)S?NJrk$iMBQh~gD~RVro!-wF>7u><;K!f%C# za=;H*3S{qnCNlJ>U?WS=XHwf*N$4+d6~LYE^@Zy5?@=DYCPj~U;wGlK03{p>I#O0a z;UO>po{>M_s@ol9L4o(k$Twm^YVV0UKTgAtIU!1I^-EC{=wWX_7tLE; z`PY989+?llo2)UAG`%J~;m)A@G5=xk5F7qag9n{+&i)b&nEv0^Zow0xo(ALxq^2fJ zC+9xs=@VEH--b7&7mWYTKK~qk4b>AaPTxJ_`ghOB{O=xq|Cw{D)ZN`w)X~1WCQ@Yd z2!p^RRzQlK)1c-Fi(xIyq5Nf_5?P@A{h(rZ$>1hBC4WH&1xTY+Ew(qRu3Mhb(^u7- zOY|*O*|sifSyeS%y0pBOem%QSdAs7<;oJFLb8fRgZMkmq_Bc)P9=~6DAAfm1QUO(5 zUjc0)4Mw+8__;#t_VEf*x~YRlUmlLQI^E&hZjDdAwYJ4(zJa>+HXOy1M-zPOK_OdT z2-&~opopNn6O*B>FZPJBJF`H1{a1Y0gScK%;snRD6amkqd_%FhM@Jm&xw}UV)+5Ky z7sqYxQ3M3XN3eokNEB|)34QW6CoI$6;h79~8(^_hjAJH1^7g(l>fXWP@(>OfIeSMH z8(wsNHIUcv;GZrpyN0}l0@2tZITrGktCcy$FP|rmF*)!sNo4^7+OE#VQMq0ppu$~v z3s1vb&G3{^%};|6+^?^Nyi5rel9=H-6#=gb>Q6p4GLe|!&L*2~a_q^Knrvmg>p5E$ zG-+GejQ1LRP2$sV=AH>G%JbPVR-=M+i95eI0h1Tfajfx|&SsCKfOKnOo9~%}d+eW@>mBTcza-TFN(xBwIGoWe3571zB~%(4 zsqBv7NqlL4$t7HCQf8Gr;6yMUC!lWqv8n9pTI; zxX1j^OddbjZ}SpkSM)Aq`cRNNDfmzsnG5fVZY*EbF;1%|v`v>qPra4s8&hyT|^9? z2p9o=Bzf&{A%)f6`sJ{ z+CXs?p2*zWlQtlql0El#o!}o@j1$o@Jh5eM$-Ex^!9M;Ns_)1Q<>sQ&Ks`z~KYgl< z=op^iGhK0FeImEZpLsv?_F~V6X`T}!Fg?mzr4A7;-tqbJKaK>3a&Iuud`)Y6cCV;E z{rS+o4vtjcrTfm2IbhKB$Q9`gg^9)ksdyLFT7{Chg34hkTrVQ7=Jz4j7<3p@I==m! z&OL5m5~`jaNtBE7Lo|O{)(jqGTrS|IvN!@u*P04A70-1=(@hE-9}_kgk0k8{aXOUd zVyFRQX6`Z1LbH^Gsq>wk%L{iZ&^Iq+m=sd{j}}|S&k2oCr<;GpZH@m17e~CX8=%H? z`6+Tdz2}!%)cQ(S_Sk@KD*bZ)btgue{CAi{JBl_tl$3LmNpxKNUT1-@t3jyQsr1*h zPqv1ly*-)@ucq0dupepr{ICQSQnMk8UBJ|DZ6dZHMbA4n6=WtwT~iSw1zM$gscI^| z;Z3RV4OLIif;#`0Ze6cjjN9P5BHqS*$GzekxKMUwIY(-psHKTMZ|T4FKX6%o4*3!Oe87&hfIQ?mpuuF>!R zH4o%8BF$}1E$R!nM5(Ogj1qEV64+)k<$)AK6FAv>3D*V-wEjHRGX;|UO*z6mfXBe4 zVd5dB-7-Ij&(5B^>ZhW5*e}P>YkVh6UP=X(yDkw$s1Et|u7qzdCw`8=3n_Kh?YhnF zp^}f^XEIAe@MoZ=b+Ii@$Odp=EH{v=9=<)d3%3-o8W*suKK`{!|6w+AZL-l|Cbmg$ zTcX0il*EXQwq5K!p=l}cUIq2gXAgdd31dcao4@^JBeaaG&>5Q*s2a~nZA;W$2K4YS zT~?8d194Om3;n54R$FTE%rBjwoHS%EyUGyWxd$-AxAGd;X|m~-5F84H23DSNZvS*` zn+Qvh>`lS%fn+4j2@yR?_{bM7X$!oeN>NNzaU4`M^2K=O3CKz|`b9D5@a;+S493Ku zv7HrCOB?FRKOQKmiW2sHh5VFfu&+i+(u zLSZYyhNUti+LV(&cki;8*{~Hu_0m1EAnbLY^5YTgbXrPLe?V@`x*apI3Xzw3R=Zs_ z4l$dW32>)};L}wJJo3LWtE?3?ofCT+%%>lO-a+a1QqeJ5i#p`&}s}hg;a6{o-qfp;&cCW5&K5~`yKgpM&ge&%k@W@ zR7M``BwDVRLS*}@_ueuVJgclhM+%K-_{uqu3e@F-pS$~tnJ#*nE(au=fodGUR?^>s zm&G$cr(58`v)TIbG#K&JM*GsC5a1bvY6J&xX`JyC*UAHo^C7?YN`#>3;Pi#K*eAtw zt(xk@AHHl`5V`PY{#w~};CnR4lf3qoB_*V*03q1B072j03j6}%SOSQBMtsb2BEP2F z{eDAY!yeE3sVYxOPnK*&YQ4+9`wm8p-H1weYzv03G6uS_W%r_>CzI44BIBDKl4+58 zMLf|GxA3r#8~pk&&Er3J*k!D@702%YZ}Qzd^8UMb*#BKL{x5xrQbkyP7`6~m(P1%a zkr0q1lm)oRO%?rafHqsl#3gwO!M<-TmoOIpGw3@?%(n=^S&aX=&*O3unHY@B5NqmN zU6OOmb9`|$($n(=+>6;fa59{Lc-6E^MjI+=(*M^;RFt0a;~|dzx7v`LURdbfLpj9ar!VmNn*V7jFgAO;o^rj_D+p__HX8NJob0j&)qKu?Bv2YKCOqY@l>iQqT>^O%Zr_bvJg5 zX9N0VA;@g5>~GVUX>%CRTG|@&?J^tZlN(^$+se5^+@9FcuA~RZc3^-4Q|f3hi)1%l zI4|T`CmefA`)AZ@>EtQU!EmaiQ;9IA&A=>Fw^tonrSUaWh!kcJB*q! zLZlfwJfa_P_PU1I)!*LVDj1F2xJ|ha_{ALxXDmw?LEDBC3aL_=?sh~S6=1qaizH(Q zAL4o9(U~@({9{bVE#C=A=sruSkA|~zuT>ZsQ)8#YWAq*hKscT25uor$9n@HFbAGRw z*{Y`>K%`TKU;Lv7DmbIwu%?v$idD;BdA>ZP!Phd=a)EC3{(XFyL8X}S{z0v)29R*J zI`n6GDLnw7kLllvnR?x>>j>jDide{h&F_MZL{hM8x`Dc91FyI-a}Cj~;#IkeazC$; z8*4$9JQvrG2cNsg44(_@K=8yO1H^IQ9-(6`$zemtCsh4g3BUYM;_w1;=|UU~TXPZ^4ZZjthZ zM7NM#gLytbVG^dtkH@G+bS~(i!%GIJJ@xyz--V7aHAD~+Rk5|{gQrh*YO^rGOOGN^ zO<*3LxrK+cJ9dqq^uTY3|77rs1wqj74E~Mrf0x=6Rr{xT)V7EwH5yPP!;T6mu*7@j zw}N(*8_XY2+K<4WBN?exr|u$tB1a#cr`aaG5Ni8@jY zZn1Sv$6eS__yr<%(eV%1*@5F3Zfv34%Pf+6ECTPOT2M!FBXM(n?UY<3HK)~y@o%@eiH6IOnRdK6{r4^bUfCT4j~M}Xzf z91q0dI#V3st~Gn^)so-hk_nOvoTqU(C2p6(J51eeqHDNhnn$qRUtD#BiWoOs-{KM> z3I5R4W__1z1c618<`ZL=~jhVWOiqhTilr^c5jr(>RXh~1B!Bf zm}SWMo-uqB^FQSR?z1}7$E7O66sxc#pN-~jKAnVG7#FdL|Cbw&$GDwG=gN0A#V)MNIo>fuJ&zq;~> zW4;F)cD7Pgys*Bx#u#lc)a?5EM`to`5WXMe?Av>Fc1}*InW+WOF#&&7Ox;%-(af>N ze_l8XGNexajLx0ZcK;zZi1VeOEso(> z^5c8|2t#(Hk%F$`;N-_F^b$qTRgtqDBdb0Y>WZF_2;BMtUOmscIedo0VV%gp16*p2 zb!B{aok$6lvzso1iiF-MCC52v68l(;rp#nw=oxuMUfUb=@e0~N`ASJeldd_x$Cl0# z4Y+upc>yQM($OUM5AJvyDLrk5!&C^1(D5k)C4WmdC-V#Ja2j*E%%XdM2>E)}+Tq|< zafZ@@Rx^A=Re>I5QmgUbm{T!rIsK!qzntxL9*X)XZNiH|$aQRaR(sFZ%)m|yBo z`t#A94f#7d#BaWNWdc+y$L-`ige_BVkQ@0um~gC}7C8Ze@V6lVqMoOA`d0l-g5K$4^_YGJpwAKsn8Qvk zg_1>O=BCBYJjjUGV~SR#rzaXinwuNdpYxcc=$l?T59?s;+*aY|-dO9vv-grwCI-`| zQ&H3Hie=%NlGJ{S#(~hbS5$kpC;s-8uwkdNM}GTC@{a5Sb^h^{?9AATMl^#a5-*( z=zQ~SVMEGP0no^iJ5YRbU4kGpELpvh{^3gPaPx~Po+KQi`nd%@QNd+uN;rFdiCSie z=voU1Gak`s!COzLqF@JU^5Lgcio9f&waCHDsak431qD8lC4cY=v~DFD{xlS!TXEKCYhewPX9SI8ktcs1?vsPB z5>#~NZX|w!CI1+I968!2+sHtU5W;p7FPd9Gk3>Ju;sT+w@xwrkQa0kIwUk9Jl9fIx zVjct@HgWG@f^pKgXAP=X*O)~`? zptmQo0uI{ig!~hq`Y9uRBkd!0N{-@?=}EIvy(RkD z`XE$=ES?&3@~O3$Oojv5DgG*G4RhyoQK1~&;j}p71U&j9AoeWLc=1b&Z@d8!RJA;b z=Ei`!OpWaFs;{%Yp>W+D<1!E_f9KzU)%Zi&){dga6 zZXwpLOBkv>NE@T~#_0H?dJdB7Ycm6*F8EOmcDgcfol_G%Wo(c#oh5DOR7d};k`gTT zNM5~`ZQ?g+D|xTGwApqzq83*PZTbPt4$|G*=GX8QZ4aQ`v{C!0hB2@p@~bd>h6>!^ z7FW{bAiLl~Q54&LWqi!GlpA_sFP~sp%OYMX@LtLzgpVsOw6-eOU$#8JT>V%^`8p?Q z9tDDCs|Bv>$$9=1Ms{kY5C8S2)ci`pFZjtyP9b%K_fgNnz>3g4wAgo(Ii0?TTN*5R z@C`GsXk*YoLGsO0Hr$>)T3Q5+mFU<-U6H8IgD31^IwL{NbXKB*(_G($&ekAG z$8LX)Qz>Al8e6$b`w?7c1%Eir3GcYPcRQ{VX}if2Mcfrs%)9p@vnJ1bS8>+7oqjFz z8S@!4-?!ELCYI>&UxLp+tZ?7?gEuj7AfWUgKtKxr&RyX@{3RmaFiaa8!~d3-C<@EV z{*OMhO6@-vDalt&gmnZ8G%A$5DuVJ#3aV5oVTjC)pkR{FwX9MZcgDJlIx;Ewi}l}% z_1Byhata#>UO``*zDggbOrnTFw5CUM8eA`@CcH1-WItbzWBGw~`VvXe>lOk{z0wC2 zE1_;x5%_wSC5bB}xinA?a0I*24!Q}q0d9!d&wwWjhcnMQW0-n+3DI*KsD9&`1(HX0 z7i)l9*?`f>bn5Nh%k6Do8(`zMe~((Y``|@e^X;aPj$6BCb-g50cUA9a_Mgd*#W9be zX?NS~H~+)7Tc;Ge^cdqKFWZpL9b1nlN7y?QxEsmwrhclBLcknJgRPnF`1sU$kXK1_ z+vrF5EE)veHw5Qrfk|7Zj?+?Gk9GBWV9VYQN3+e@A+M#r&8Tz*vYu4(uxtX)5OZvjfoVi zX1ab6H4EStcC0bL?4_8ALFE5o?VW-{3!`n#*tTuk$&PK?wrxAvv2EM7ZQI69cG%hX zp6YW>ci+0zUH!1$*2}8;Yp#EObB-~>JTkerU{9wc&;D}5w00B<4>76llq;qbo-0Id zg?SCujlSoj#q`S}IFf6XG;*N>0F~Qruqvn;i=C}f8BCwTUa2=v zhVtD+&Q((_9{t4Yn+Z8@E;sOTM<_!E7)o;pg20voaAIb#P!TLi5G=UxjlzOK<@ zv2rDEPT{ICDCk)|8Ezd@0TcMHCQkb5O5zk4Pwe1jWb7 z5IYHW;XWmQrF&Jj|ING(Gk6O@`(v)Altwji3Mb<}SsXa+(yxz2DHYQEF@Q5&JM+ua z@nTem^@8Q%H1Ji`Na9BcapAUksxWcQV0SiJO0iG101>*Wg9VSwA@YqG8`zcil2(TG z7RAK>0SSZn8Qyb}M<{5eXKH-~y5=N&l^V`hm<|+UMAZEthiJFLed5^dPuU&DFS(d z6CgLgo`uoFSOPN&x)l>=I@lU)3%PKeq zv!&|m0^(T%xcZCO@rSvotd3;^$h#2qH4iAKggsPzS7xQgC^Tiumn-4@Jk7%nmxVMr zmQoPuI2VO0_Es^V^^|INfn?ltp41^*GJG6~X>F(OG;`TW!XwX2v73Hw70#z}*uGl> zEODv7HfGV7Rq8O*tz2XS5$YX_eWSlk6v~eB>3!lk$@$a8-i>lgZWGA6R79$xoK!^9 zcCj7e8GwlNI+;NhJZ3ulPs@X-?QXI69_{g?j)Jd!ie_WkLV`*)Ch>9kpLjf53CXJb zxZqKT(xAKiZ$jx$<$}NK2z<2Lc`&#m`#Ly(Ve8G9PVEq4;~z~TI{Z5wyTh27N~6iX znFyag{!1|BznVSBtJ?lg*lCOd03h-IPtE?HEnl~ql{<y(V1dx z9!Z&T%r{0`JTueeA5Ri*Ns_rI&CI@*ML(j-MxHkutM9JdnFZu6?*RPXvFX&0ClcP_ zLVD(rMINrvX%F4DJ|}d{V`?g&@SRp|syv3!?{V<~$p3GuKbq(AJ(lSlMw>)f!c9}CHXAhqwF%|&P$TH%;HRbg3qrkbAF?#h>!^4WXD}jK ze5+)zX`pP57d?3<(}SyjOsO))OJJazy(@M(au7QZOm>}_T#HDq1>sj#^}6dUKqEg znt-{*M=8u^EIHQF?M#Wmk;sY_fim_ZLt8y#^Gp=XM|v%qXFtot+LqK}eM94|otNdx zQwVLq+Ljn)&DfuZv}JNu%wL99W(r5vE$n_mL+gnOk!xVcFc=tsh_P@E&qP1l#PSKd z@0HqBI)BIN7XKw**6OTMI}d*@hC@!_7vVcqm}~wdx>2zp$NGj@`e(La5A_JY+tKqpcLkKLuNKqO-1P5+<)9P`ERw{#{4b8q$* zCF)lU81pqUy?d?_l7il^V7|1QS@nak5Q0ld#psHU&GLx$~M5&k+s#DX@0|GwnRIwOiQwKe`@QCYZ%4xvT% z`sW4S^=hb9z=kB7brY%HxyhzCedIUP@G_{9yU)N_u#B-oy0nNkJNd?+Xk2FgoWQ|K zgeg2?BeOO3#24Pyds`oKC8<9^*-zlu&3)~hA3Kf&)|9WS^iv-pI$+~R@( zL90mgv35%BP_^I=$Dw4=Tn7Yyg8TVYNJd8;z7Hzf&{IM!SotAkDi z?*5>CvaPpH`gUHqg@1`YF!?EBy6jO#lhb>$wpk96QgO!_V7e4M7n0BA$9Yl&D?lqB zuwE3{5;1N>po&Dh0*(lEW2iMC+(ejnOQR`H(ovyneyEKx4@7pIT8r=jHf-h(*-_tb zN`Bl(qO>iA=bdans!p0!DHvbPwh3 z^J?fjLkuX;xI_}^2V@}F-igjxr3!3RW)w>fc?iRKKvnd`_l;s;4&Rl>8lhtNP*Z+1=vZd9|PKUhN#$WHhyU!#S6Dr2F!t88}v$e5aob^e&){HAvEl4 zKI|ObYl_QZSsaVYf1v%QA$EwP0tyXHb28S}*cVzyiK3vIk%0ea5TaBCII{@cvaZH6 z#S$u?95=Mm6?1Q@HRe&%WqPDKqi_RsgftRs_0TXYd4Ms(SG+@)TzeMO4Q}=n3Mk9j zyu7h_Nk9ta66ZpbD$4zPaHKr=uzadhzCC%zTP0+1vr5`_ zFwY-|!c2t6GW~k8Hrx=9O(sGcNZ{1n3Y}k8*RpfN=bV~141I>V?|pnP+=dEP)YZj> z82h4en$s$}{1~C1eM1%kx~1Z8$~f~r2#TZD<*JBi1Pw{MNLKd9UKoamT2)G~!pihz zPQ$h-aDkFR9^N+X_ZU>44xKkD6-Y}GKys<>S|o(fD|V{d>fg~ur|R0X5Q%?g)@lEV zNAW$Al#gjFJk)1^yaobP=t83`*YC}--bG`2Pm5ni&z(RyBp48(*$J@M^nr+GtEK) z)KE!}JraDNS(ClWQi z1e~&2g05@c%4XR!((><`qd;dFT50r&N1$c`{>G+_>Mq@Jsa4#hg!7DsLj7*F+@J@j zDpp(d+LL58IBL;zARu)rBv2aJEd`8|lutjdfjVWfNHLg72xO>GWHhpl{4Z+y zHqIqaY}DLlq-WKLj#nU^S{A*$=F(@4j{H5(z;BOK^u?yF>{q&$m)2D(c!DbK>e=}i z&=)LIYWsp+;%P4|^^XhRXN?Vp1BFxb!##)=vrLR6 zty#YL>G?~y!=Y{G-`;0zdPP4b5h=DE;#NVr^R>_^QG5tb5j`$DDHs*O6V|A{FV?oN8TD?w?VCo+@O=)Qh7NgZc$&n{KVP} zJWJub)8U_#1l_=j*mJW9fAs!yEFt=HZKY9H;!Xww0LVo9U+)Q;*cjNG+c}#2CsFus zG@LRTu&25JBM71{!Ef532fG7y)swWXbIhfM(6CpEh-g|D}d(^a= zPle_D&hY1cRa|!`av~1G7*m|y?PPm6{d##{d4G8M<@W`uk4`7X0NM?QiGgSxI6mx* zdowVINL2;#lRaJ6KIXtkywB6Bvlqsr6(@X0fp<7?Fgi-?4kYI&5GS{9K{w_JHtQ&` z;^dwK-JshSr5*o_q^w zu7lM>HeJCm)O6&}sf~-Dt)pTy7h4=;aK|)c@&O5}5bl)8h>Ddm=IZ%$wFGnVnNei% zed9Zmaqe;h2ptf}QLsUoYHN*gBUN{tN|{X|HGdwR308|>J><$6r6R%BMyh^!0u!S_ zxke=M8%TxH1d9e_K*n zi=_)@s0DS4Db~|DSC}VZNs{gem{Z3Lu|S2OhDt7qx!pES+v4Ox1@7u{wB=g2T%5Qo%P*Nlh3$^?x89SJnXRR;5{)@)KC8;~HG<~pG8p}Z=z>%CFUlmFV@1~) z#i*;hr##PoSHn5;N#+u^dBMcwX03uHj&f>?f!eIXy4JP2LRLg??G%pfjkQ8qD$Z?F zaXtI7;8U;&y)-sjFaBm!AM=l_j0U^5k+>LF5cozXLhS1ilEC4G#dXtcLs@1 z@G$iJ3SN7d0B6#HSj&+aTyRt)!EgMFKQwgl{1ZxsL`s^V#Ac{c+2ONuvU(qin}|H& zeUx$*VNMmvav7(IC`01MVvdW_m^fO&71aT+K;)-#+Fg&|s{^}8AoTWR;aS79m46%e zw;+-nY$btiJal+c%Uyo@FgH4@%yh-64Ij#FnKx&9rH4xF`GwGd(T=`R-@AhM9!X^R zzTan8cT$3bmMc>ll(NFV5l1hUUo+}g5?f;y>x11)y25lJZzo>?UM9>3!?c~p)}qUz zyTvD7A@C<(L2@Tvqkl%YVKwMZDle^esfeS5Uw@o1KgA_q125^@F;ebOSM{V`Loe+} zy+@y4kbL*v#2|k;d^QH_wSB1!h}6(KEb%gR%o7(vzngr7?ph3jV6jSWKgy=?KLQ0& z)omTB3R4dhdt~NgwM*7Xv!w2-F!UN{NTkiI!Lga#K!|VOFz= z#{vm?^#`(5{>BnIUPC-hF3H1Dq3Izgoy;X)>nv-F=~gz^=|;_d_IU!8mGTrcM)kP$ z2(GGBFEf+Bm+0J&7C-HY+XHpoW=-%|)$>9GLPeQArllE`pr$~wH}rz~sRU}XEZV;E zYy@dO2!pql#y94A4U%Jp?urbJ`K4_Na0v;ujdX*iq9QY+hEN%f$3L9o3_weMIyc3? zb?&z>d%#);_zPFH^Hw5y;bU-3aR=W}kQ9TUgOJaAl9t4j+wjUwi<94i_16W{@Fnub>@*TFr7$Pyc zmJTDKEN0Cq+bXj&>b~PHaih0TO>G{}%4O_0Tt#~|nLnOXXB}P0JO_ zm?YC*fgsbx_9u#H>@VN;7Fe4)?TStLH3026)ia9J$tOW{2&4{#W*VFa8MQ{^I1Uzi z4sKrI*!E|{HEnoqgKWZ^;k`}%Z$Ma3>Z*7`nW%;ND1`xr(Og#5_+lU7t!Q;yK^(_Y zI8G5_pW)O{=1&Bs-VvkP2M)guCV*5u5M=ZYAX8uS@Eu$Lt$4!W-;wYgBgj9)t)SIU z1*YDRbO&oIj0;s5(z&h!jAlJaMZ=#UfufaZSzXa4Vhx&Iist3$dg zFQf9YH+C665CAgi1Cb~ohCwob%u(r+1cQ)a3K|Ovf`p77kz%HKB+ej(uV_X&*DKo$ zSD0&UZd6ob>xU^<>Ree~>t63{Oxv#fTZgZH&U(L*-jUvsdU(z7Zhz@H{y6>R#(C=J z@$f8$2kyT-Mc==TXCC53(zXf=*ER|a!>18iC^vuXv$Q2Q4ZOr7J}tC_le!1;OkVDh zmLcaw09{(Pe;enq$9xCD>i(C)I|U1e7c5RGsPHFDrM!P0eJ^Th?+o%4iIwAx$vXrK z?pejMM|7x1b~qmZSqu)}9s z&R1|o?!xhG+23|>U%=j?`9_d0YOK$Uo6k@>KdF}9#68Z7Z~oaY@xosod$O<0tg}jw z=#aYcd$llI*i68{mI(nkODwGGNJ@&7tRXLh{Zd-3EsXjCV2Vx@ZRLqI+WR*>HL6#g zT>tjxchM|&P)1f)MVie!A_SUid7I=g6@WBZ5Z4$oR9!xrr93e>w2(fjf+FRWmAIMj zyDb~E*0Be<8-*gmkuDVy6gtq@v(NJ>knTf}#{2oN`g;1+^+}L7Ys~|4J`GrFVBkp; zETt4x7A)nl#j8XzB>nspW%3cN%;eD|%q>854D5B4WMO7DQsx)t+cuD8MCL706O<1u zHD%bWG>NK<3L#hO#{qkq_PH{Sw6{(d+28O}u zA#Ee7QGPjN;HsvB$@6~^3_4sgr>Y(S&VIEPCRKVm!BQ~9)Pyfelr<$fmsVU>&>76W z=x2EeL8go&DfoQm$Sim6#>a;nN)iapx^loXWo{o1`k6Xe?nue9%{MSE)`ukWNRC~rrE7n^f#+BLQ*yLwMNjig-`F7_0r~I zvuhM8ooC|+;$1XY!d_Ob-l{VHtY6G``8xN|ubWKLV#v|EyNgdye%BIHruD(vv?%s* z2J0@#q8l$8pO-)2hnR03Gv{EIrpV@XJ)>y^oys$Nn35^|dUAbMFwN4NGLWH&3mpj@hTkK%AvY^xjG_*hN)% zGvLGd`O!n6XCXyAQHK;!BE~55R)X&Z2hfZh*B4yZ<|G@qXOds^EjW{tHwB=k84g zUii2K{Mwl|vN`IcE9~WZiCtEx3ZkNeEssU-(>$RuOxm;f6ngtt>c_dWKokkyHQ4llxZBo0#`0AZlj=x#!5OMWzjotqfx!` z`rKSPw0dq>|Nbd${EppSB9x$M^3Kg&BNPuKX`fi;i{ z>Z;VuF4X`4jPw=!xmLbV;!f^DFL_UIsh6z3xBNQ}>cj-e$!`tLL`L@YjTolPe$$06oJ0-K$|1x|()x9#%)ts{4iNSU zds^18Ju)nV#em2DF7u(21`j6gAeBjkK-Y-nF>5|8fo(3bbe?`+0T6HldkX zeTmAY_tI;ZSeITUidpnMLe0Wi>O?3QQt5y6S&CisU!C$Ytu#~UnkbJ1U-Ht>WQq7^ zA=K$IMN*eOWI%cHGvb=E43e6%j2%7#*>zrCW^L`&sHZeZ6XpT#EU1vytBPeL^9==O zXgz#o2Pq=GPCj6tC8asd+Urw&Ng@LSzk2Y0 zA3G2&5@bQbnS+Aa>;+mPApxwph4YcT(H7hueNx#cNCqIafz$@N9}nq1tkQCWl8!p4 z18vql>%+emVC%simf`8_Tg}040=|}kd(N}Qxboxkb)$@$7!T=_x5!eB4osRJiRtph z{pja$IPoXA9i8HBgOKHRBFJxtjBbJn2Pf;NIrGVrzd{-9S+f9MFvQ6ib>L9zGCMOX zdvo2?#*w^QzW-`}Fmw zu3irGICmoU^!%WdujDt=fjw{Nfudz$If8YTA`Ltk2iKPT-`&UFLG_Vq5M?UD08Zlq zuIP2ogAFcXsJG)f6YrmsH4Hu&!=r}HQJhKrOf=9;(S&-}`&1`t!7KK8I7@r_!?m|D zl%)w$8%S2I1Z~3$$wAsh8gs%f-%5B4^_~(%OJq3 z6On-$PCz->qMf7@#A*_ifEtcK-AB_XXA22SZO|^H5o+s&y`%WMCZOv1pv^J}@EU}@sl}o-@rE18uKo{B5H2ul#A@(d7-;f#he5;CzR>uBn|i=!8DgitwM6T} z6@!_ur*n!J9yRLsC;}=L${7?+Hw?w>gs!fc)}rn2#Q9yt)3I*I+~_rLt+rzg%vIQ_ z(j}a|DX`*8qwy8kQ5JR&K-K{MXdx4b*(D4(x(KpksqpIVQf)%E{A?g(xMW2|h%-Yz z0v8~!qUHL8A%0~W4_$`?RwV|bt^#z4%MaN))Tj~Y_VBic_MCq5suOr3LUhF$7g$>x zI@$wL+J1r}y_P12;XM`L=Cmz{oExM`zLPnf4;PirF624k&%zzoL>=c0sjG0b%#|OC zKe^4gSS3C^;z_QYB2J>E_>7R1Yv#<=@uSdR@$zU4R!_w2U0ZImvOUn`T=DZLt zFZD{KLyl(A*+=ygX;|U#JBK+>^;n@2q{5(mN2y6$%s!Q?t&!$)-K>A1d_0UiS5)Jb}8?9(fe!GaEk{4V^yz!*&JJdB%Siviqz zokNNw8CISS)ZuV?^f5A@pfuzrerp<0ZHb+8j(#VP+B}2${Nbn|Ts_8{6s*3SMPa=gVzk@81oGTpVWn-H+U@E%^ zijV8y4EjPuMkf=24HX(N1P#eB!#rT`y&mtqL_UNW!8NY<#OT;JcYWSXvW@wG-L7{b|L`0z-3=&g)e$_|`+f&tL5WX86-Gp(R( zEqNtJh*pgUb)yNR2+FuZd+EHUJ+GuEs*ys0`<6fMh*OG#Ps$J&SkF;3p3qx#0Q6}1 zUB{mK&qj4M7}o88RXp&jGrxc&-J?~nR?-@^7%@91V$|tx5IB40?>KWpq9SKi3&+7_ z=g}P~D{|l=JzE{`LFP_;VKUxu(jw{MUiLZFXTj-wdBLV}%L>`DK-gVr$qkBke}}}7 z?|b(qzM#MAbm=kUEjwnx_&<#;DPyLb=?m3%5aRk6&#DrRY1P)27Q42XUn1f1J=CSFnvyb z#0&X9Z3pZBrsWVbaTYa}_;DThzls*Jli&Y2o{#nlvC+^}LPQo5fzqZR;FX(OQHz60 zlVBhKTGUs&ijx_bG)8q|C;cieE&UeoirsLEU&Ma{e~N49W?mmbNO&0IY=7*^ZFj<$TNTMV|y5d&=rg(4R&(53H4ZY8dUb+)(Lj&jPt2B4cl6W*@Q!TMQAqK+&&Y4pmbN9{ppRZ z7tm?FUo9@c`H(Qx8mo{T*|Kdl9i~jeMvoR2RWnYUa<9%vnP%a}f7zZFV7lx7c4Sz* zl}n+uw~9b*(v^!^SB}}cv>$<}DpYCoh^T2D;L%6&yD!Ebg7MU8hqe5nxTplFl_o=z zYN7QJP_^i(dxT*(6e?|V6%zoF&_W48E^=r4XLSA>Ilf5kV|m*KN|J<4nD6yCKu=g{L=v{ z`#aYJ#zw`J2_tiBe4X%cV?*@;wS8sZ)nroJgxBP8AR0A3nce7o(fuLXaj=i~_bDlN zeA?edeNQ-!Ur&nb*iD|rI~UgD@LPrY!m#W=tO&5W1?lJidE! z-mT>kqWgMiJz5V9OrX)I%TgK*Q}pZvvEz<&zu6V~XmK;iXkaqiqE8j0)7paZkQuia z>p?e#5o00MB5gRg1_%cC2p=K6DSjz(BI_Bd66uN$K}TS)oKt=c3~|_|-SJZyy%Fd zT8yKlfhFrg$hF)oMt|BRXw2IWoPohB;Uc{U<&)bXa5Dd$07LHs$6e-!*-i2*UjYg$ zql_0DA8!ZPD~jwLm&ne%1k#5Dwta$$V-Rgl?l9_jTNn>O`4)?hIK>z)bPBWy0o6R} zrM^Vm?v~rUxsMd%>Nn6IVxm@6f14zKA&`V_j?iT)QgRE4C%SyCGMl)U7*`9O`I-~D zZa805vvs48+#tGEwYzIn@6HCE0?$I{_!3W}rKk$sK+ow4^69zz_NVNuJa|&R50>=V z{b8{r;<2RH%SeG~$IxnOqp1f=^Jub3!X+GN*5=mml?%S=g=Ik<(PJ0tr*V#E$7<4^ zuoIuN-sLm1$|o(s&)OtE%$|~O8+_y?=>u6G{mEO_zK{7nO3NM#5bJ7CO)=nGMdt0Z z3DN81>%su$iLgdO`$!}KvKGPs-uI-AW(E7oh265E#DL8t9BI<9aX79gT~hj*u#=1X z8D=jIttejwlWJYaJCX#{Lzd*yiMAde$uG^o-MO}Wu94)R#chBn(Mf$pywOjtiPN}z>2#Jb=Q3}VbtzZfz7QYn z58!!rDocC_xAT+7$TtAYWx72j7iQ7g2P8zzZ_xiao=r)GdsZ!OdMQs8ZBwVaQ5? zLP(1#Il)OSbI_jhnt7aMhT;J`#ZN_U`EFA5o(htb#dAIE+?us3oe|GI%P$tDuC6=Z zUoR)qUX5~HZ+C?Na{#sB_LbmR`(+TV9({mfyaavqpd6m)ygRbfo#h_zthdD{aF#bk zCq6`7yYud+mDX>-OWyGr@Cr`otZqt=29|t+ZTQ6}MoU|V0da%fMBafrJ`2Fh_V_V3 zrSrgeuP8XBqsU8HMJFh%@JQ8ii<>a4rRNTz8DTtk3|aZ}W)L5USiF)>ar0-5EN?j7 zKbDt0{PKDz`%+7OA!t0Zg|(i0Xzqa-wF-|eh&_Y@?4b6oMPi~!!2pWR=v)&8oSWyJbdTKn37jZY6+*r?YC549#7q|HEl#CvRG&%Au)a8Hn{kf2K z=jS)Wr;hjcgA;@q^O4s>4=p7{P0Z~=NT~r+UP_jgNlKo?5)hR)iOG-B5)_f9E3o9o z%f+=t>MY5+cIht@zx27VNOK_e;mA=qL!z~=tY=4qAG=$=oXCk+sqYa1adueSWNMCT z$|04t(yavH9*e=2$IFc+BmM@x+A0z%ES+Q|6ycY z|MnGz7>eTw+@gmmI=Xjh<>-S$F&F$;sB?H0`-(#iJ_O^$7L|ak9ZipdYd}cHU{GM` zj6jv!Dv=>cVyweK*QrPSEvt%sGdopqQdpx{JkQ3S*_NcqNi&3gc+96R4_L{;Rr1%h z+xsqdT`9Ir&ebIcGxDEd~+BV8@9L#$8BSy z#4(}7p5rXZq~Jl7BO7r?i{n;b58&boLEVfRql`sVSRwsa$RDxuSmtpzk2c1&yi!eK zWHExFm|iYCW`kIn!O}W!B~gwcV)M#Cj|wR{54Qz+FPoklvIka9(jL@0d5`-}2eM;d z6B4d31_>uPlY~Qf+Q5?sKnz5k7aX1O#CYV70c1^}L0}qLxJ4ibQ9mmKRlmy;%>3qU z{|o6WAmuCJhj=i))E&xCFu<=_jHEsCJEaC})(;q8*+RYWJ1IzC(B2dRC?%w!vWNj# zmVuJ=s!v!*Uf|y3J-0hANKO4p2*3EfxVtKl>ZU!pA#3cIFBreyc`>4XA-xiJIG9gv zKlbYgdnyGhbOrWmp=E}h%>f|a{^%sHg}Zh`-GC z<72$!q$60(YEfL1G2t!Fb9na|NqKg-y!O@2y0H>VpGAa)RjThHrR!~ZX0CWrD~fU+ z^r!=r3TO(;RXNRKas5aX7_DMLC4a|sNi`QRRK`fxA1h4BoS%>mAH#w`bR(SpPpT`7h%-`{CR-3cl<@yw$Wi&TMxIJs;JXd zKkLPru5OhQ)v**BhFC%-#gdizMY^N9Lk*jp%xeQZ5{l0Zoq3rS4+VrHYTCFg$pvx9 z7O>8cDp98hgEtb{@(RL3Ehz_qfM1A4)f=QQV(N z@^m1@H6sDaoDZ^92Ja-jU6}Q$_#tgE6KJlXgdj-|7unXg=&GqrB<-2OKMewi>CEQL z;|z7q3VR0Ti*I|6>=q$GEIcf!e*HA=9mI(-78t7^MI)H1dH@J znd3BHlQKHH8nH)L?-LiS5kke-@9g}&i0T6^#UyVT%4e)keSsaV2AQ3u6s1noY7I7V z63=ZYMQ1J`yNSd76yh{zHv_G+Ny$A*ml5<;(uE_n$p(gavxbeRGt@Jp7UPS1w``K< z-PgL79uNtr7s3r31rGCub~q2(hWd;rVz&zxwTGeHe=Y3??4?$CS=+z2Hu1W=Ckukv ziS?uzZ<2=9WKVtg3(Si%6@YKCqTwwXE!91#)J#7jz&{1^W?;&`wf~Gs#{x6@5aRYU zjklrx&}4|gN?vi1U>4oo5*fy}3%%H|V+kwEB%I`Ueu%1i2#>!$o^B;@!n`G`xVZwC zXs+(Z33f2;&qy0v9p4#_b$+wODr#4s0)c;MIl^@;$j_0xnmEKG4eL(gbf)=du4)s zCMU2SP)gg2p=}jMc_A2Tn!|*zBw@ROY}`%N<#<)q^#rfdGyO|j62yYE`k6^bnM2Nr1u2fn%$I(#*oXN~AEnHK{ce>|_M*VX%J*$2BhYLu)aBhNkb$g;${2v}u2zGJM+YjJ;a$ zvWw_T@<3MJ$(!!6qEX5qI4K6VSR@fO$ZK(AKhPv48dSFoP)$o%XwZDju%l)}rQje$ zB@AOAHI8uzCij0qZGS=8{!*A4aJ64^B&Jbp64Xg|%4_`j&H&c^iCRioT2ey6&n6yVE16XZ0~=YHaUz@r#3`N?#JFeE zq~{bKxJ}K&)+W;+(h0z>dJBr`wpc~8@hUk>rn>!L$P=QVL@5rK7}rN_Z-f%gJ=71S zN^vLnoV6I!IvKD!BHXI*?Ng|<(h}IKEHKwI$}U44bFi+Vlx#5fwH58&=JwR=>8%AD z^%2{XVza{iNhV)0A?`BKTMond1>bu_a|~zwkTn#np+gTw>^4bg zja$=4X8Uott`i+ksI4^}S18rLIGAl8C{_2I8hW=*^}gA&)1Kc|$>@hRknu1+J1GS& zr$zy~p`@OmGu5J(D~IgYWFI_R(Rw^K?#S08T}xqVdsU2;4#S!I)%?ZJHZafEcW^7c z$cxZ>)hmF@ue;GRy`a7OyMcJbV;2ssA2}t6AfagIgT)~7i z>sKY6*uk?0YIB7)v-voBuYe!oJ@U8GD=fi95Zg|UX0E2Uc3)1n+2gr>-(TSV^avPf zqk`0E_ss!O>ItUpsQ3oM1dlNS$dwB`DJKyua>X7chnr((a(>;v^?b<1a-<%+S?G_} z;1}-Be(e*Ft~wjLR9zy#;Eqc_C^-5ai(K?CO$;n3h3-dR9wYsU)8gc=*J*g%lBhaK z6$wCR*OB8v={K6h#LL*9>7ZSh3FT&QWSN-bG38Wc=(lG~SwGn1*;ltUbYw?JERKQQ zkNH!}WUh46q0MB(Y1pHzj=Te<*JyEMJu>a+mF$(`4G-R|zxV*D4aSgWF^ag8H0`4| z_d0fO@+U+SL$k34**-yFYo@~!v!H&xNxAy**+uTPi6qk`+}Pu{r$y+^nzha>3$JA> z=*{tX{#k<6Pzw}{TB@Y1KI%}#u~yTl$jyBqMDR?CPGm>oUUL7C_jrqm zym;~nv{#S;&B{07`>#Y~fdw?seGtkVSZ%x1{XY`%OtN1Sw!a@xBc7F%`S{v~fw?bh z4&FO`37{f8GB(kW2qZSQ=*EHaRe)=gU?p=X8ViR#>XFM>DZo!!tg2rWp+582Wyhbs z6UXc;BpHJ0%bQX#S5+U!aiLlUuP4Zvlm8}7J0+^}Q;iy(!$;a=MvCn=t?m6_imr9| z0~g#eDU4P}Z}UHr-RtEE_-!Fj`6e`0VWo*c;>GJ7*2g$>gOhhw#O~`pS0Jno58JZQ zY*fEV_d7}HsV9fjRlAc+QXAiVpYnKQxY(qR?A1m~AfbWD=!~Q?u*vB1Cxu}S$sX!t zQ1;U7izz2od1{!4;BCVD!XhQAZ4Tf{NREq(x{{JE$#ia8Wnc`}g2Acky~tq^vh!a| zqw-I~Um3G1oh%e2+?)7NBNC0;T&z8uW#~(DNzoOZ0hfBemy_47g55$y&4_4s2c2kl z&-JlopA}py0;SQdiu8bY&7oXm|dpBCOj9#(~Kfd7M3=)$MR%?T>+DR+gjiga}D z3RZ&B_31}Jtwn`@Gy(C59Iwj}tVbE~Pb;1$qzd06b%bohy3bC_Rx@v`ZEN$yC5xFt@2b1jh!{QIs#aR+2PHgdA2`fS0)gb z{Ai8LGvyq}p;N$vO&wL{KZaoWMU8;?pJn5yVB<`rFL+EagWEWrZ(Ge!9Jryhvg!!sjR zh6=`-h=)y~Ah#McPA!C06D;u&0dK{D@8wrkd4g#?Ty`y0chMuy%Mc3U60-n!C({ob|Tg#MbgA|74q}Yjoay7P|Co zzk8`GF2k$5Juc%#=@HP9PrMDk;AC)V>ox#9qXpceJ)c(~CG-PU-MnY1AGv?=AG`w?R>YNS)9kQzO-FMYiku*60eZ(ceFEm z@%2#rQ~A5C*MzFr918mq48*==L<|KGs*|_^NqRIic?i#gBa&IF7-d%9LxCo5+q9g{lfeT3m=)%0Kval9W zCtgexNfPNeM3#jcM@@;zQe;$$b{bjVL{C#j#BhS21XJL%+fgu#$?<()-Ukrww6Q86YdvL8)yptib{e^{eQ`@kf3n+xgQR}Jg<;rI&b}+* z!_B0KU?kCZF%XKy8Chl3(T~SRb3xxV3gibm9yH$nNiNVZb=4GwYWdjP0KB>bzB|AE zns=(qK+A3|0UE-()}4d?T6hAQZ4zV6FB<<05&Z_mB&~Yg6|Vwn+pI z+Bbr<$~y()!S^cwdPAcSi~w<&T9ULui9(oU$d^DKmw~MIrGcy}FiYF@!vBij3oAMl zyE8(>OWlKfjR4R>?^GdurTmBv45;vh>&=^|7kNzv=?&c#M+l*WG+Ywi7yVh^kk0uf zA=n$TD{<%b8U#XHClvfk@($%gB2ZQH&Wx%42U!I4O3uj^_VzC#ePr`^fqfAQK-{@1 z*|gp>s0=#0*;@hsq|f!RqV|BwsT({-KGIzlHN9!AoY ztoEN9E$kf)`t>F{p4tGo=4mb8WtAH7r>0(nu<|liE`NgSVY%68k2vYGa8@;lER2@4 zQnlj>ju9kFf%6VFY;p_thECCPs)x-{WHm16Rx+M$w)PIc|D2OU&TiX;#e}GL2&@X| zofw}=c9e$#H1WNT^0HMo+EdE((T|x@NkK+=iLD(!^V&8(4D0RCrK5uzQ}vtCZ{xMy zTC)0y0^@uOsMI*ha{oxr$*xeU7BBbSK2~{f==%N{ zOCTR&{~CjJzl<{ymAE8+xBY%zp{sDddOacqY)|n+*K+8#+-5J-kx1zyiH6+Lzz6zP z%VT%s-F4-?U*ZUsb1py*(A&|F{>^eFJ2WeiW2#>Q0R9g^tsv+sKY6UB0x4Y(-5HpE zAs$2lB+CYD_v;@?oYUX&06uG65&wl;5Q)qn|05T_VgCoVs2MV<7UoxbtDmOGXBX*t zg0|(qQWJKKu(fNE1qoQwNzStMP!Ke~g3jI;C~m9IB1gI-|RF1GLGI5RWSl zD(d0NZtoAC!mLk zr{ljVe|wE_ZB&PH;}6vqb#AABTjBhv(#Gk^@Ls`yEMTgGDoQ(sQ3A!g)qjN__PLev zk6awQY1rr;DCFb>nScSan6{y(@ACyM4tFdV8pqfMPYRukUE$I*!)OGF%LHlD+5eCW z18;yIa-obn!z7&WU~YJ9(4;yqvcOlwsfU(oX*;EVBzMlO77Qf% z11?55bb-mGM#h!{L5XKE|MZLu2IpOLHbxOADW7h8u!j$P5||ip!l;|Us*~bS&&(*t zmI?(!iUQisoTD77IWf07wWj6-OyonIc%g>2AFxz0Y`%vJj4J-)76G&THiwrf3}qI0 z9@IsnFyd0qMe(uDqPV?H^YMUa3?j+!L zgZa3dmXzUC)HE<&jaT}Y27b83w1I@=1Ie>fRTT-Qe2m1;%7tb@VT!%7P={iPbFo7z zS6T-aSTOWyo+}(3tKE5NJ^wsCu`e(3FLUCa1)8tuVt1^lB(j^+;*I0Oju=L-m3U?J zEr43Uy800)+hWX{cIaTK!x{%;wGpV3Z7Sx2M~!5KO@bA$4T2gr;vV~eaEq!5tb=0; zxpOzQB`x*W0)wD7PP~{gul^BLsUy&o9_RTVa?u@66pv)44~sXU;hqj!40%HnIhP=c z@;kut;3Ua7FAK)18dcQ*t=OdQj(b*yp*%DusTVrGA+&vQszC>3bQ<0%^c9&^Bb}yOzj?!S{+Rhj_B4R zX&DF0q+p2W#Rr_OE$3{Mi$+UHuzfV#e(O=L2BU6Flk8$#G3)MoEziSNVNMV+PD$z- z;tQIrIEiJNu7e^-(?Y_r5S&m^FHUs)5vdF?chK*piPeE1a@Qcts(yf!+MwgccWt<+ zrKWza(tfUJ6y18Z48Ybk%~C+TdY4tZ>zfs)cCDpQlPj05Cu;_8jhO+m$KQ5MZJL>U zH;(sUZ(z1NkV6H0)~Wra ztE)eDb*+BZ`r}vk+@aYwdura}zcWSWp;Oou8v%iCgsdA!uxgm7AL?wqQ2BJWZ%$ja zd57A7-{<9Z%f1o6mEvelSL;F2ja}Z{8(PqdzBBr^nV=73--1v+{N)DsS%VeAQJ@O? z#{l@;|6iJ*=|9XA1@aIR-)9TSZ!^XJ)@J@s|F#Oi!p_L%ALokyky1)c{ZjugE5$mJ zIx?EI5X>inkW@jr8q(BU7L-t+a!acVG$_4|+tN0Cs>C^AuaLKV%QrmU{}K3&(>I{? zS-zDiq&R_(!rk2BkKf5>&fnMP8-F0I(4YMvPBogt$zb$*RM92sJ|V|ok*Q#|J|o7d zBWtwZT+7-+G1JQ#1N)aMdyiwXXnQT6F>7nu-uO>c{%*V9nrn$`4Mg+&JOW*e**aR; z**W@Jx?c1NIqp3*%^!z<(sFm`)_F>k^|!Usz?)tspN<+^jx*dw*ImZIj1SXHz)?Xk zlO8rtYBSwvIrv&I$14_3N*_ld)WMqp?jnm^4{0RMC4-%h>eH^->fEQ>-GI8Rypfyz zLX7T4ACPol5b;sRVh-EvUIqZ4ukdDV7z9-Fi5>;xxlNGk3Y+qetZDOKs@q$?Zi^L8 zBdP^S?J)pp$Y*lq7gpwHO7s}A_Tgwz|Hn%4!@;xS+e#r+tKBOW$H&Ci^aJ! z?h>5}Kk*3Y_3O^a0^xOD2mI;zuOP-E*T!b*cj~AXkk0w#qPmxQFEo*C=GL5%TnFk3 zA-4I;wIyq$Fzp{--?;f;Gk!X1A!R;3>8W44%x+_As#9o>BZR6XE6zY1h0jf!CQU|GT z+tD#sL8KX5c2m1v*TsEUd$p@1Xm)#*$y7fL98Nn_^oShj_8C*cFevEeFDAnx!+xXv z#$TiGzgLP%1qcY393WMy6-`5lX%etTY(Yt0ruz}|+51*f)>H?-aBTv6O@fFWT4%2W zv7gQqCmWi`96n6h7iQXWJej&UCFC@|q}4Fxr=j0fiVkLOy?@F4m7hs*sNA49389l* z(^UtY@&O>489nY735Uqua65n+qy4sXgx=PE=f8?QCjAZBIms^w9bKvz81Rj7w`|xY zxldEqo|j-A=rYDC8-{v2|L}RWCN=S+-uHR*i&CCo)wqbs$t%$e9sSX_K28xFxcckcEV+9O29>?;Kms45I-AVxgI zWGPKz?(HmNM){De5JIyyctovT%c@*j6g3nTw&6{fg-LEkRNf=-1;0APzm!t_c$dF) zM>O^bKCa)fij43Oe}f+OEdvn}BIe}p8<7}V(=od9-og^#0He0_myLl^sKJ#9?}4F% zV7dhb@J#|?rBFRQAITjA=^h0d#GQoAQ<&v9Bc zW=S=d`tS{*{KXo24hM%rajf0R31?vrub|H|N`F?B#A^)sZL0Jv*}}Zs)_kbHbf`5F zrKbtQr-ZtCfjJ{Z;%t(q(&rD@q^gv`qOY=gZ}lY^&)ohN@a$LEnNDg8VuPqwIkp-|2f(6ugUn&(*wW-R|EZXG>uG$V9o7- zR{x;AMhZPsl$7ne5ijzPvjI=SkxnNP)iPt;L?@D!S$m6<%2pF@n^H#$hf*;O!xBag zBnn_j#Y5*kgwi@a7Q2aBqCuH(_MtAZ=S4MaCgg38;z2{o+msbMewZ%O@`HjUr zFgc;=Jy0@B%sUY|p}8;);eZ6+3s#@^c(l1sPKiSOqg3lB6$8O2i7fw2{7<8MEe3)S ztuz9Yn7M{WPkry45@*`nQ%p?FH;_Z$gTE6`efUfbq8M%VjZ3?7;(%w#H zZpOR{%yPcbS;bC!n*0So8xa!m>1ww|5Sse-5f0)xaTB!Xy$ zD)F=&;l?UYGX;^XL`Sfo%;c9AUHko`%DIOpS4j?hsTm_b49v9o+ingwF6UHZ^VQ{F08n9q#M!mPs`pI{!&&>qrmEy{Y;^$1Oe zOJUn*4?T(B8%XA(m$y36FK*yqXh>x>6m2&|_L>x>Y=)}Mn`cTy4PLjdY-Aghq>Vaj zxp4U23}~RUbfWsz{c_Z*Q=^Z)Qrcok%Tl%X{iP=XTl!F)J=57#_<9j%W}(Z|ll_Te zwWhS}VJ-|JGPwORd32)Q3ftnNx61u-L$~nxSD2l@FMswKr&Zq_*Qrm{;f**5k#V;< zB9`HU{TW-s#F~|!g4~vQXV=k|J#)t6mUSXnSbbg{reOPTVRSeXlKCs6(~Cv8oSxZU~2kTQKEH>!X0@IOI6%ZWoinmwgkAWL2;e|p=gDBcl& z79Y&TJYfD+8`)*7KDd$n4D_e|_GU{AY*aN5q5F(;G;kD9c-=!fSD?nR>ue{IEKu=z zbwA%X^bEXOPsn?VLxfc{V%qZWg zJaW(FN@CDCRFr;GA`w}qfbmBO%`Qz*fzcT*=N3ox>dI)Pk&!bzy5w*Ht~#&s!L9|HvvI-#;6jk zUWN|9&pxvXRs8G}$ZoV=bel4d3U81{=jbs-P-*5FMXW%?L^G@>le4et@l=s3zS8)k zU9M00cl^9RTTRTOKWQxJFoN+k_WZjhvf=&jfba->dT>oWxQtHjJ?qR=5Y=elCJjiR z-0^)nl=|$bS+#p+!v|igzaurygX%Kg7oz3c=nIUM${F({9zE69f#(p0T&K)DX}LN)@o(U>+vs*fOgEDx+Qz32ss4uR9UlVt^tF+z>IBi9fZ&6&j zN4e9bePCF{(eE3;su5FmTNhM=kAwh_cRE5D4i_=~PU?R1IGGzPs^?{oQD=jmn0f?| z4`J)fKcy{rWnpa-lPO3-9#D4Xp5AizT<>8G>cK7DC-an6SG zekEg#XN&x$LpdXd*--jxx6GD3ZOQTqMKKv;S^agJ8JLZN`< z3N@44>|xgIA&yyWY&*=jKP_n|GoXnK_+vJpMgydJQ;g)8oeP3}-R_mkhSu&?KHOS< zL97eKzL;g((4?7<1G=EFR@tF#;y!l-(sO~`n>iVGz{Mi7(85Upf$Ark|9i1tx7Kt=8`N@}vHWe@{>pH+Wl!d(ec|O#@?wre^?(<#@~?mE zDEIhYv#HL~pt8Q#?5^)M`+w^w|9{u)|2wqsPtwBwLAt{;f>|>OBQu2v2MEiA7IsSu zOVa%K22w&}{%Tw|`vX1|fBxT~g|ipX4eZNQlFN@Fu~ukDS_!G6LQNt4fsgs4bo9Sdj37* z;Aq5-mx$=_{l1UzO~2|rRPdit5p+iw>KOMI+0iV{7tb1m(pckKf9y71?iXqk`5$9^ zXJqX!>lzB(>Mho7U%nMG)# zc;_G;cV1;LQsmk;^{i_jxpcLi%Fk`hQJar}pILo%_g8Uyb_oxV0YX`h0Wf>d&f|qI zd|Ey|dif%tWWl7JTcPFM9-w!vPDx6VHlg#eJVww) zXZ0u`Kw@-+!SzrUSgf$<^^CK-NR(|6ShlL0(l=SiE;+Gjw8=7Gp_RukY1e1YdWQ`} z3sswjWAmVlCVe~|ZFf#>fd`{!p3_@_uQkS#!mWagTpUyr;?H-)P_Vcbob+l?Y@MWhG>mw(6pRUK9VAB)fAFZ3DvrMdxi1IZ*UfEfJ zk6pVq8RLd!Rd$V>^AWFNxXDzh{4Hp@^~zxK1tm>Z z*2Y2Illy?TMh&r#Qw9?za9u!p^Lmzbybj)4{xBe?>jomyJ)qVdb)oxMy@8Ld|MZLFv#iGs3x}&NMQjM^DaJZ473bbAkgJJLOQbU0|3_ zUQ~J?jWZ9wVBkvIxh(6SL0q~!<#J&vMmE!E7nAWhEegZFq^lfeW#!3T+50=jG1w1> z`;0?k(AAH&xFuO$LaZ^lSFR}VGeFX654*Umm~D^k8-e(aXVfhi)Et+Du1_HfRRd{{ z1TpsesX=`nDs%NjHGLULnl!IqpLb88`I8o?3;CcF*pP)ymJrzSijH(d$BO*^U|s@j zThf|#g$*nHaNmQpRyE)YT;r}Pz#wRF2J}S}h!AyJL|8`Yhn6L1acHPpa&yEyCp>s? zahtd(bhyKx@oxN&Vf!dyq|{{%;DU%>uW|`WGWNdA%s1w{&g0K1ed1@`H&e_8>(8k# z!!K-^rKBE<3(HJLv#22qqF+6iXN5vkg{($WUUR4_o-dn^*zOMDX^}t5knaz$zH_%+ z;)kAR0+ZuZz+5=L0&-}rXvbZ1^Upy#1Q^KHGy=Cs=~U7SCFY8j{OQh~U!17C9>5iHM5>z&R-Pw zKDmkKwYvRqyx75^}K9>C%g9>LL_^!Tbly>>HwK;KZ8mge2yCVt0d@H z@bNR6;3W#$e02lu8TpJT%dwg0Ojy%9EluUmFq2tT1d`;>CLH-p?t5|`*Hy?9dBhhp zWfqQ7r_z%a)^(k<+X@etOvI&sW=dPcFg+xdP?)TmdU>3A)CJ}9GbJ)L7MBg9t5Phc z)g-eydFUy%q1kZfHQBJ3#bj$GU-Fk(Jf;}oX8KJ@Z+6<2(gn3Z9akxB=f=dHBuTlY zAO(t!&f7Y9)-Rt-Z48<0Cm}ytC``{J6xi--ddhxP=S?RTqNvml6lLa4ZHQBIOM7Rr zWyo1uN0?YRLGz?D;W<}@uG2xrO7W#Pqq~GnHS@Dr>9(w2d3Z)`*lgrj7SWntwL%@U zWE+$lrb@^Osm(TD>haJgBu-WfHPYZkk4-hZaqEuW-_NJ6%Lc)al~8=c2uY6wU8OB# ze;zT$uX`E4Meviz1F->f%ZILLDW>pDQ3ui4jcAZPV)GeoIK#Mw9>x#me-;>Wb~nex zVSN(^3u%3D4Ke*JRx zdaeG;BMh+tfGaMFD{;;YaU4HV?I_{NH7*pNN4dA4wiu(NVYu(NgxYzKZ<5Eg&i z5T5Mt%&W!9f`CBTTm^M1J?@|Y)!T`}+o*AgJed2P9@ z&AK*c3vif}l*L7TgefJauy*}xs>t9$dN~XmbORRPEIm`P3a~+}irlqUT^lhNq|To0 z>yYXB8sGR0i-~eMfV|HCv9B3(T4kx<8=UP?8IlQ42E!*VfFM-wPwM88a)_#3J2Ed! zvpW&2-kSwd`_@=o5_SrHpHWCZNE9K7A`LMu-1-SAFi27-%8OSJ=TKgjvh`mU! z{Ck%XohM=xs(g}vvpHN~7d=0B!_jC$$<<5ZuO$MQLHQYpeW0gW{7SfySW^@f%zMOA z(j%#~7NxTj-8Yd)ihV>*_z6agkGN;holNgkpo0Z)QST530g*Ex@?kF-@->aps7Uk# z)5f6WjmFFh1Ty{0wX@!`Uym{dzwaKjM2Gnbz9xFT}~YPJA*Cafm|@rTV= zV}T6~P|%(i)jVS|Qz2PoPr&8^JzexCWlWzW6^v2XEncx%q5(r z_6YSQoDwO&uNP6cO7)wYv>O)6ATPCd_$*Ij#dTiZvrVAr`UK=R9|C8pCjuMi&ALmj zbu&V^rKmv$=jE!rCMU%5w<9yb8r?G=O#zES(t3Qws!U7Blx{`InzHm8Mc7uwE;#DZ z8pw)KZr8Z61~B3BWlpG8DFPOYyXiqmKo!l zc%_VN!hAqO9|te{sxtf&)N(@f2F=s!C?ex zaS1Uq7GNC=iX#O4(5}2rtE74AN}94mrqA+CzK_`f)5}psWXL``&J1}@&*5d5#Nr}m zDGIWxA5sLB98$ZUd9GL#7;FKq#7e^l!*YoxBaL5O6mS=&g&xD2V(l4Y2vRn|m@@Pj zMW0$oTf8fd>J?XIcCO0G?#fyYr@H6>fc2wem5m;p_0y$$>QWI@1MVU7#U@o<&XZtq zD$bSD#;f~HlDT|0=!hp<{NM$}PVYhY_nS?HZvC7jBIjOgAOW`L)?)`h4ox1%4OjB7 zhDGHgSVOYe%L+cpvFDg0SI^$Vle-tE{(Q)nTNUZ~*-ryj?a%In(|R#hXz&ZFmu#hv ze`{s>hpHD)ze1?^jX9wB#vJ@dRnOJf7Vu4~_`g-X^mk`eweNs*nDD_G)E zDzere{K_=80MY_PODl9VhwQBoTaGSQcU0|^sKb~;&bUL)w_t%+#Iu+^IG4Wz0{sHg zd=^b%tcaVJva>zjH+(<6uRXU&{Xag&ege_&JwWY@IC1O@y(8!J!((uCErcTylk&&R z57S|^X>A$ZA;YGQz(ngpc^cfG68arIB}u^0M$uk3&TCfRU*f>>-NrxPdQgFpfU$(Q z2JU38XLe-1mheQYM5a5dBJ{bYYg`jfc=$7MiYBWW$Aw*WYr zug+9?GFw@E*~We3ac9f!R|^P8Vuu6BT~yl2;3!-!v@YcVgKTpxIjC-A8!n`Y!+;rQ zvS#BbKX}S)G{=uay*N?7N)&^?nPjGA0lc+DKDwu%eoLG3LlHt+X$$dmG5{wP z+iAvXsi4ms-k*q`<_`J&+mW!dzjHUd({U`1YeH9Yn~5dEyfbQ~pc$%4Pt0RKTb-(% zW~p=9Vv+^X<+sQLQTY0d9S6$@nXZi=j3w0S$37LKZHf5N}oF%P@`4*kO>8^@jxad(oy#GZoInO~yum}crah(sFnJ}<8(DcD zf|4ltvm(KZi_qPoyo(Kt7zjnAuif^r`P5l=%w5GUiu<*3i1!3+@+kD=ZUIs1BKo$|_knSkNA&T#AXmC=;n zC*>)OmLGRG{DltMg!)*_zga#H=lgJ6>jSZ0uoxWOT-F^lwKjZNgV^iY4pdo|Z3A`V z0J*tA=$@A2F)T)YF?8R9W2@nwbtaK@w(BZdXRg&% z9KpWOcSA|F2uZ(G!g@+3HrSN{A}a75?=P2$6hxPu#AMnPe(m6+R6(cR%PRAkY)QZ5 z4Kmr}{Nw?N--_`TZ_bbloKDzRZj9!&>xjVmbT#H;eN>1~k0sMmqVo#kv1G ziv6Ez^HlzOK>yczqzSEyc8cx~IyKt~hm6LSPb_Y|M${QZo^=okJ5Kz=2$-y4!3f*X z%suTo5GA|06s3+p%39faiIgvyJ&UrHCUzz7+$g?S!mC7M_Ek9{w`c{+CB zZrw%vbMNbk_t$f;yYH^YaViA^Xg|&X(IC%uJ+ge%Ej`E4pcDs`gB3*Fj$Aw8AUCJ*?!N{@(Kpk_jM~mWe zml5>wD;eg+n$eBaYsT4Wt0;(6hcc9Jkl0Tb(l-&y+A=Df zi-)l1t1DRV@T7fUu?IHRZPo%(VWsc#JeK_r{gI5vR?;D(Miio) zfs9Jh`JEXzo}X_JwNJm^X0Z{sYsJ06$De4&+K)#z!y%ObQYR41m-?2ea`u8tmR=$Xuw%Dh%~-;)M(dA;le^Ibx-B*9k;)! zQEG2r%J!Qj&kMB4R?77)n<+!5D%;abzB9WB_ z_bK6neD+pZnDZZvWnt!z2LjE_64cOJ<$)_puXjqsOWK1b^HJc)!oW4JGT(NVfPN8y zTi(h}kDIfh#KN@(=cnw^H=^O61 zv#C^ke{9FeqmP@ErUd4Bv>`u=8>t~*@I9{2$z&6?3E>{hW1eJcNUGr^lA)1%qYug1 zG4i(%j4FByvpRjt6;#S;pyo~5d_Gi7S{pWM@mnhHESWKi(~c18m3$)*0+eO)Q;!gB zCfS9qBtr&KY=X&w)8uBDp?e{B(+y!?NIekzehA@$k#Rz~OF2M^leTA%8xc!H;FVxP z?qmIFiG10l){wc?hDttjMB$S!9FuzFj3h|T$5kwnHbqSIBlea$2)`wP_LHUd1DT7y zRe|<{V1TMO);^~inA^u}_FsOKc|ni$qZ6Wg5q*gT>nm~Z3&tdS;rlBT#GUn71m+(k zAfu@8{smjHD_zt#xJzo8pZHUfBr$!@4Ej@^=N0m=N>J{6D7a<1I98k;w^#0)V37Yn zAK44yemBThDp-JC(hsBwWGChZ~kOt!`+yHLMRJM01DFsGYEZ+EtYWSnW4el$OVa zqsJFl)Es=ez$~wBc?`CZV7Q5%R=CziqQW>sf1wwNExtiq2%|l$i99`u8Y!a(MB{?h}FVPa;uEL%kkL&{6 z5>UFQ!)IxFKV9g0XkA6&Z6twC>2haA{V`9zQ=M;Y)7G3P$)Uc3B5W9*Ngh*W|MC>>}n56WrQS?nP1-sR>pgj(0{%GXWCPw}RJ#4}VvaPE)INK28h1IZD9U^%`#;y0RP zcXqlN2tw18mJv1|C&|D2TXl32bzfbGHa!{EyK7owS^Q(i1nv;eOD@qddera_*rEIe z4rV>0yaFN5;{o(pS!rnPX%hZh4)htKEUcaaEze^I>O5f%MrWRxn-r5h$lK78G>mkI zkO#g(lms##VF&HpSk5n^^s>DT{Ciyq80iEq6~(CO)Sy?MBd%*S+FwSC`eB|Rw^-Va zI1eXq(_v!;XnFlCC$t`hDOxN2tK(s6%%xrNT689M;2AT_Cqe0=W1sU_eH_(;Gm`AVQDfh+}oAKHm#jwcj zjxL>zSj4=c6$Icj^xqcZ*~1Go|C+GOu$@h|kVCKi86LuDdUVGgr>M(*I822UDj_)8 zKgnjqXE8{9qWP}*En{#*)c<7TrV!AX7#rG}hWFWQVi-KARc?L0n4c-ZG?Z%XVaRZq z9vxa8%TIz>_Ug662*%mZYZLZb2w|NP+yMO8j!|fSK-tbOkqa50{mj`?2J=yK6VxAE z_E}HSAj4Y@^(^`M7tB9k$bOjb^ml>QmRhS}Vc<)sDZSBlE-Ude9!4=JuOvPm4T&VV zs!9UbLWs6aK8CZZO1r)Qk*>Qe9A@b$C9Mc#$=(XaIT@OH$c4NIDB>D^80MoPT3G=e z+>}YET2i7upc<^3sS0@7C{UOdMpppG9NE_>asuAjBi~ZA9)yJnezV^wdZym85dC)) z+-a#&H2iX~2i20&n&YyyxKW29JIsAVQczU&W>Eb`^Re}wTsJr3z8tOIE&?AP(*7H= z8JxPQo?!?s^KYJ5hqk~3+cD|Jq3qbk)y24>R>~?`CA&sZF5_rrK%}y5q|@?hlUiEd zwqc|bQk)|iVQo=T78k)!a4Jn-dRX%&sy!AixY$3pID8=*%J>ebUuctSB5M5KI_f}c zM*ls0y^q`HaeX;Hht?^hR=CoT$Xl3AzqZbWOaD-7KvgyH1qCp#F{~y4{ud+kp3-K3 zsupDNofR-u^$5gY^BqyOzB+ zMGF0H`yp5jhR>y2VxADpn#b!kqj*2uZu~PePsk-FkZY5_e&s^?Q4f!VP}xk{&wCr* zN>+6DWkPR+|5K45WZu1i{XU3fd>=&qqyGBe&)ffx{+fQFOrnMq;5}~kW7-agL+6rs zkhqqJ77XMvN*4oaKn_X^ET)zNFDaRkF*DLR@|NIjQ{z^7MEUa;*avC~a-ORN ziXU5;9g`-q;B1M@`R#(gtZPoy&+Bd|9*7Z&hZ0O8kK2$^I3f$NFw-G6Q_;i~m)z!iCC13S~=&{a$KUYOT#v?5`y&tCbQb0G2 zg;cARK*0k?k-AAkS%u*ovvjRSr%uzFS(31Oalf^~YLlWymEHCuup#dgqgX(t_(-Y% z>xySxEa$Cp=%@o`0YJ*SOBu*&W=p1=gaE#7M+yjFFXm43i8BJvz%WOcJ!tX+v>Hl_ zCJ2^=)C8pd)WqoW5pXO7avbf^yCHY2gjf|;%HNj1l~aR&OuSposle0JWx=0YX>gqa zwWc-KShtht#MT_nk;?Kyk0(tz&8n#JA;gc_GqX?)`8gLRdfy+WqbjQVS*>MeH9H;Y z`&D@;xiKI1x+6TbphkJ322_&NaIeCvVrHC|j6)q@+H{OV#$5eGwZd{6Y=TqycJ}hd zIJD$j)nKJY(0H0ClSCyFCCT(A;*6;>RxP2T2fMWy1npB>fVNu;wGdAc>9kEJJX=Y! zGd2X@Tr{Yd(Jw52nzyNP*^AF}PDx9LjkM76ILDk4o8kdJ#%qgWntQvfi`LVUy=+mf z)*&zvd%kC`0hhtcqkd7D(q{9c@QB{Clep_Oj79>^Xj|Q;c$h8K^3%}FB8S{I(Eww& zxUqB)k%w9kG$-=DDhPT|M*5qc&D^ZiE!0j@K2R1IcO-G-oD>#P$`5gcqI&89;z%|W z8qzc){UC4;$^kq8xgoj51|0{ojZI6d^57hJT~1`0?>=1x*Y^2J&Pl&D?SO(t6}5fc z2`ka8{#sLUk81l)%z!B@rd->KLB_^=4PBV`3qfZz10OJ1DRPU@GE)ns#O)@v%RXTM z2kR?dh`rK9kWvai|2vJx9)~H=7JXe1lLu&k_4B@*DH6?Dy<0x+7U!QZ@eum8+gse_!<(?hlMiGqBUVZ6=Mqsr9cGPMXhlnpihLi>N z)WDvv)4RM_6@QnZN99tlHRXBIu5bF)tltYKSFe7-EE~;cRv(aCF7?iXw};aYs9fkd zsFloWaKR9|5sJy;CXat?zVulRq99DA^34>Ydt!)y9)P>7751nNM5gYkd+?&3J-GsD7c8`p9 z_sV!j|uH210;1dqW03~3B^uFE!lRZaSca zd8d=Y$QEnBM`oSKPHB#p)#9$pygiYcYo9Jc^K}$k$o0BYfc^=CcG}hD?jn%kcQ@g~ z-khZ1aHVN&?yxL=oEGP{rah@ElhtWjU2I~(3@3xRsH)N;f#jp2S27{CUFWVI*l&%p zlX|=z={C!zGMSjptoIh0`%N{(-e{7R+UmL~s}tY~eVom-ogG7Wlq}_j7NJONea5bv zSN`Xot!GGNp%NMHgx=P|@Jv;;Di(WdG1-$+I!jc-C#&Ns$F|rQ)}xFrcwKW7EG~D3 z;?if;VHzLJJYE6E+KV3`?GO z>jtcg1h3iXn_gUucIR!1E~c|HWMGp-qG%qiR}}Z=@qiwynM}!IWwlssxuinQ);sym z2H-_lIsUbZxl6T#pRyKNJ8gts){<5rU*eT)2VJk|7W0j53ek|YnZ3Yn2%Oib$CZih zDlR3gs|btp#w{f(uy_ms*vqh@)li9xL2Sf}HZ9yU=Wr;WU$%P0;(($}HzbK}dy9~1 z$56r`&me_yoV^%%)IM-`$KYtD%lzq*Wf{T9fBiWVb&Vt~3GUd*Z$517E zewDAs>k< zOIBf2&Pd)ew!_vH&Qu6KlnMkEBs2I`&Yb=JfcsX=)6P&mqVd(tBl)TnqP{l;|3SGL z0bn<7Es>3HdPP!f^~OeWDvYPq0f*B*%MM(A#8qjM)vz^}>+!k!!9Y4sO3D?pSmF@% zgVn4LZeejWM#7Uc0ICnBB{GMSG5nYd(s@z%hh>tE!NRS9uBz7oq0d$Eh{`q%lV!cr zrO`iORuFVGc|5MPgZMJsaqSo@0ld2bp3n0)-vyWEajNTBIDU9Rx4&}Od;0IVx;0b= zg{ywO52-i2h8N04E;0G!=KlD^F9WiNs4U{&0<^>K;i$*wb<4Q=57o!@0#hAMMvFXB z<_?!b0?`(!prK|k{t*}GMfG$EgSd4;IuutQYyigIdvmIpR#enXyixjq!G-y|!h(j9 zp#KwjorTz2{Af~~bf+}I#uQD^4@LR?TG`<_8?HZ8$f$T*>lhmvnw8(%gP{u{eh{rL zX$2&-(+w$a8$n>-0wB;VdbGSc3Nq2PFa%Q5KHxf! z(uOkE5r9hJc729`Pw8yeTDlnE_`50{WIFWUx(k`n};$IWP zuZQXjfmvgv#G1Nr$c8S4hv{O{M)_^f1*)yw2+h(|_l8;Su5N{dSq_pZ7p!S#MLU~s z+#tuKY`kpRiRC8J4#J!&&!%ySP%lreHD2@2E_|%MwGyvZ;;U0ld5^f&788FDoue+? zWpJycCPqOi0>t19O9qG0cIUbGtk#FI>AWGK#!cZ{b+w3G@t@{=vXMr}{_ncHC@++QSZvXdJ0v&?ty0iIyOzjfzzCGYYiZ2~KiybaEnI~y<@ zo@J(~jo%2am1Mq?p0TIMBbePE*rmaRo(X%gUEM;rqTr0>I+gQR`uA53Wn)bH*mZFh zdcwtBcYof|()cM#Ley?ddVZUT>8^?`aQ!~YWTaapb3Z>E9QW+J?0hYL-w3}}T9YpG zcpidsKGoxH+}!2xWk)EO6$kqr6prJ#)&jFk$8n!3dGjh+LjV{j;S1*Rdq5Z~xaK1N zLxk+jegv1lYd0afsT{&|4Z<)2!MwgnDGT39!a4)2M5d11t{b%V#S9H04skJCf za0|WS2pFisN=T6NcRdb544D=*6it^pHUhIT>jx? z|AxfNRl88$R7d(mNK14C14B{95&n^aVFHB!HXbSi3xUG31rw4|OouKWAedH8x^zpO zdmjI3Z;|B^#`y7V&p3Pp-nb^P#xuD@DZ;+dx?1o%-Q2u0`1*TC5n%M9L~C4u@J;8A zQm?MptQnHfj85_(D2a8&V9@-IoCc4`pw|hT2z-2y_&>4f^cvmKMa#ANjtL`v;quz- zDkmy6)C?k7=H&j=%h1!^%*mFnrK_=ldYt3Awi|pi@?Vq2JFW)ZmaitP#?kt4m~)J6 zITRr|$LX{$zQnhX&3D^smh)H6XJhZHBRq%RbU|4f>t)K_TxZ&9*l`6WJGXhzdMLG} zJ!#Yl>ngR^G6m$hGk3Psc9Hi%ijVBF@PW*NLRnI6vTqfac;^ZIc~`r=K#+u5HpAOo zJNE&xp^{PkfhSXzQCn$m-xVfd5!ozASwxtWhGH3CGUZizmS|+|`W%3VfbRsaWv-rY zO=j_KzN*Q=mmH+Cs>f&j62@b;8CUmSYO+*ji}K_u%z%X&%{6skgG4jJQjH&&sCiQY zV!y%mS8HkaXN% z^T)!z90*=)34Qu^(U=+W&BUxU&3)awiw3R{0vW&&9*=ao8-%K2Ta1tqnYab$B&?e)#CS57Zn)IBN{?1j25U2qI4c zdkiwXNPFD?xa*DK%7V(+m;F6BH@#$Be+zRujM}e~;EIz!wSs?#JQqefvb?yuSS6gb zKgHAB)oSo#nuX z(|#bbC;Gu&k=ie9;-M|iZy?=V@C159<6Phi+m9;;BP1#9pg$`zKrBezaNHZ9I&u7H zQMki4Vlr0<=m>x+0MR(WFC<^y`9zSW+G8v<76ox59{z~|RHu0Hgo0%4_&A|wC3A0l zW)c)PzkzkrzFF8DqGP4A%zTTu@Pk0=rA+bl0mR1yxL1i8QR<2wzgW^Xpt*h-rFca; z7Es^X!J?(I*S06#1q8Lv;#+iD<&|bvqztun5@$0W5D)Cq%}#EZQfv zKiy867s`oQl;%e4fTEl)^i3x6E1CF9a_>v=L}L&6gTNcB$P5ql7?`9l4XBg>BB%KH zK^pEt8k=4h?ggAqB^66t2Akdhj+4$g0}hCy0=d1R2=14gbd8R7=t|+Ac#I9IsIg@{ zVfJwHS#p=sdCXv7J+>WP|DZ7Cvr{pf72&`!CY>K;d-0~H#GRXR>q-#21y1ksK z!hK!{zD1Su52=;IJ?D6DRh8`u2Dt?dnXo9?P^09sXEP=JdSU?h)4&N&D1}K*gLfc{ z-^FE;;In#340qje7iH~tJcIV8D?21EDqDcaH@F8Uy?zR2W}&uwW}@W}$bX%x{xK+v zsn`N>zjLRK-?>x9|6rc|pM&zB*;7vsRSop79#iIII0jQ9!6u}|ATul&l9WZOAFLsQ z`WbKlb|}rmsefYCpfs)3nwwW!taNHtOVqn4qY)Z@t!`_tt?FHF%Wzx1>+mUKJ&Nb2Qi0 z;fcv{b8^DB)t#RG?D*h^cui&RzqkARFb3KF`h$b;;6&f<`cS;uFT+vb+m^lMvm712 zFNDZHYyI=K5c}uRLYc=SlJ!?JCgLH>mQR`h;r@vd1HsVYH|pNRCr`qnoofpAw4G}X z)?jY|6Pw|10Q|adxGQgOL5#s}EWN`sDZ7lN-LJ2hKJS0SH-aa3oD+{4_D&@wF zmu*gzNUmTPFcV#z*hQJkRpO!`#?uTm$c)RVu+aalT-g18Kx{tF6UZu7KmCuj2J$`SaV` zi@L%OzA5eeru`nG8uoA)NH$BWxf}t=C-B|KgKs=!gqsnhg=eZcG$KD#>p-*)mb2Kb(|du^>iM3>e06I4mBRi zJiu9pU3j%uTG{8Q*(NXa*yhT4)Td&GjcfpBH3Yw`&IMU&PS0p`t_g}PiMG+*l_=}f zh*rT5BEpz09oPot1~FtR6KLUMAy+GPiB>)$yw8ytE~MnBp91_vWm39t@zNf?lCL$y zb}NO#gRT@OpgzQat->%;fW$4nN4!N09rtXtov#mXKz%EM%033n%o%Ej65_UJjOzux zqkIQLTV1;hm=s zA@e0aRC8;Af@66EEvZKqV|{qc_EHtTv-eE-*;}YHh^G`-n*%IItu?xJ;91dL5Ri+-}3pGI3{SE zLZZ{6>fB2VD?>g}w28S$X898;rCH0gpdKB`zS$bfOYHHo}t0-NwgNo1n2JhIBDtdNrfWv$P9 z=r1Fw#U*q5V{IZM(N#gjzE%z;$v}?DLYmp6AZJJ6rB{Pi3cN~09#Sugvv`6Jzbt0EL=UluIkM^&i){)N{>Tg@Ra z0Y@2#dLx_|Q%|^pp%JIy8_AjIYDJ>05!OadvI@CjAm_ndp48${(yXF z?JMMS33KcYyOlyP2=q^8c*ACA)tzQOZpq;Ur}`*ebd9i8e_7%$cYq~ri@*Z+ z`ntUDE;PrtyG9m+-XsY+miP-ZS(W3LeJ*FfLq14TpU5|p8f`m-7HDCt*GkSalNW`Z z*q0PEe^HcayX7AUvl4j)W}zd9I!;nsO&R!@lld^NFGY~10+bxVkAMncogRu3{y725 zMxElfk1#;#uaDX++Rw_a7pDJ1v50Y`O>GezE6F=sd=ZQIeBME|pfP)3UBMl^X1pUc zsR%Y9MPE5v`pwHC$0j8SH_-Nx!VCA}kF|ag>xric!ng5%i*hKZ6FUOP5ak_r7r8re zFe48Y;F}>4N4q*;u5LR_NQPm}oC;7ov$c;3+?xyKMtiW(2EI<5*(OQ$SUO)y z@kilv9e5_QGsKx>>$FA8-2^hCCE7JxNVjp5DMke@dj4*c8XRT0rK36iubbtXsLFNI z$zHMbh1)lh%G7$zz5J$?-?Oem;GVNX^Y)lhxhcYi#x)?QlUYR-wr)pa&3Qj^ymcARnc1#bU&Rrrm> zq2y*~SN-cbn12>cbv;d+l5a(h^W9j@`Tw`LeG(GZO!|S-jbiaz6Yx^)jzh32jQH zbEE0IVRQq+OImspZja*(o8w9B2)wV?PY57`*@07m^oS%QABw52$O1;vVl$ zl$OpJ8Vk)zhq^v1Jlndlp%6{a!66V@Uf9nIKF=F6C|;%8w!l$+V>>5?j=Co1l+D(b zCw>7!gS8I8!9+-h$o?$T6AM#aThBDqdSA9tLsS7sa%0+YePUXRa`H+sNuaT#f{O`> zW|$GKd5C)dV%6Y#+{AI0XZG5HUm7Bza`X)#qvXqK4|TmtOYlwWBP$r(ggOi|n&=u8QxDz%*tL#7qN-9WG~|HsyudW zybui%$su_s2LSFjnTpP11T-CYP%l6zQHBSlvyMiV5;F7 zQA&f@%9O}An3~0F{&VCi;vW8pR~XTRhVsTG%cW{Ge{Mm_Mc*>QRB}<|AaOv*YKhwk zyXFj1=0n8%4^hZ96YQrMicHA%lZr>i!#ACpD8M>>2=i48Irvf1RS5T^}M3;y*_FHH!mRZ!GM@WG^Gx|^AB+A>KJd_^j7b9{{4*;*ce+=aD zkGvs@Sn9@$La-p`fX3K=2-ShYmJlI;sO{Tmr^Yv-8v0GBzOa!95a_)M#>z$fL#Wy~ z?>G#86RN_w^UrQ+HJ5+IJ#*jFC*={j&urh(?VkbuC;4A$&W?NX6#d`5RK#(q;{!6Y zJFNj+jgrasm?U)3d4pVu2F%I=UrHj<6mbP^v~dZ-QDAM`NX%J8&(A@J)k*|xQWKLw zWg%2^XD!K#H}i}h1kc9~r+(?JJqxU&sW)$@Yyd8N(&}e)b0Z~h%8H8!vx;E0fHuVK z2*5S3hy;(T3&5tFvuD};wisZ8c<)U_@{S58&q72O0FAmg`s)06IL)$WG`eY~k*h7O zOt9dL!3cdQPm}O8!4ads_a&rV$;7yoB;h*af(wsQ_;e{W0^sZs+^s`jRtU^78>#1) zn(Kmbj72T_QgELWlKRBZ`Bx{3?CisI z2_6p<8K4P@66(L)%z#XUj3O-83k^V{Q!VY9V}N0dmo#PkRaa%z^kjbHvQfQM@>Ev^ zH(GA-m=~k&Nq=i8*pRPnX5}yY}8qr zi@5Nfe|Jh4(HfaH-hK1cJwV49q4v$FPS(+@Y8o@>ND=1o3&aPF5fxF`4mv_gYE{IB^@PW2zC)O9_{Wt-8@#sEf$wFf)R$@fH*{6dwe0ZK8o3-q?~{Tj|JZZDd6aVCjFTK6tB4mQqD*7r4-^rLWd$O7*VvG;(4v znru{1WK#A>eRXBqh`cvZl$Hv(m%#3zv`Ah4%r>jnNt+Y9h88xMbAoqcP%IXIC8cCK zV?R=smmrqs4&?$Fnr;SIB@;2~ncclISp7nVeS|IVe-E6VI0!I0nWSxzE#F`FM`f!d z0fY$DJ?_i?jkD!cOm#PKXH3#Y98n8tc*jsqto5?e1t{d53O0T8@@*NFAW{gAR{-b9 zC0~dc$fzlaLyh1GU|k$s-|o;$16}e8a*hj8W<+0*{p<#Ft~`3-fsx8;6Qa+lj|>bK zy-N+8t_L0$=b_B*y`bFg{n^eAwItf!u5>xzjlyii-++Sks%!Izow!Y}twMpI^`(sL>z#96WRcLHVuq$#6WRN+sL`!&ndvRIBg3K z)i77`hZYLR#EJvO=(fmK99lsZ2=dT){PELq8~q` zcDOXFVfVZlhdL5(8G);)4zrg6pFL_j1L1O0meY#IV+E)HUkXp>o{W%t=qy*g2Dc1K1j?2+y;nwRuve0&>+e^xgnDSkx8Z!!FN zVrSiBR<~7Ny+N?}wc;HcU!ZaeElk&xL-9<^hi%N&kiiId4t09F>Y!kc}USVk$&&YI0tv zhz!5>x62K(ThJ(us$9yMKA*MTe;b-Q=zi= z((O#|oJaD00QpCtwsR>f}RAXKJ)^Kspr zJp>IGg`on3bFAt?G|xdxAV=hVCY@|zmrE&^W93@2oaJ5ZN^AJzVosPum(qA=SZ(Vf2&nw#GVO@{x68d1^v-vX;v{|2mn zwTPuNYmv+N36#;OGDwm8`M<=fQ&<%M2y`_feC1otSgE%zgSVve$o&Z!qYqxjUEY2= zir9j4cHe@$*u4Xtb7VMWkYa5Z7N2Z)xy;;Tk7PW|e5Zy$dNH`e_9?5K_BeUN_vv|! z?Fyj1R72xmh{drOBZN_fQ6;F6Q75Ry^)_J&ecmoay>*U~G^mwTO{vGJ9k*Fj6$QRp z@w9tzf-!&!p}H?Giq}XnQlO=3)|WnQ*PCcIKYcLI5$wwNzErH3S8j$4QBP?~v0l$l$-7xR z(IFAeQ$=AU+`?o($2!U4_rgkn{nNs_N+1k!Fl6jGAOmO3(8mX7UcJGxD3fw_ySyKW zv}#;EiAe@x&A7=_MXG2RRtaicYl9)@~J=*o?3+^1EI|sLBUQ3ZhdG_eK5~PL9Lae@+jOn=H*ISnP!9BBXCqz&Y=cK zoRmdyrBZ#~NV=&Pu4YNmBMi;9Wg`i52h&1~uh{z-oQ-IZ+(k*Sosx{>9s8Khp%>`+Cm&5McToGjOjsiRs*{rKlM$it zD5ugeq0#(4U(ldfer)h4(6F}fKfISfoE30l;6qKwV(p#FhQ%W0ECQovR};|D!@vyk zR86Qa19S$Z^t4l;kM(SiRtcWn<4EQURHu~B0qS<%9yaN_Uz`r6@6&ScJ+owUeQm|ucgr70 ziD{}eSR^a(jn&V|*<0GA5W3n928ibtaAUL4CSdWX-VhBCI(D_`j$S)TCF?G7kiW}y z1!cpyODv{~R4?Ra#iltEDu@{h-g6b-|Eq0pFgyEXbt%+a)5L0(s?UMkbr>v5+CCCX zb>y1#AiI&-dT^vw{k75FO9ts9qgk_NNuKI$oAj;4YR)3aX)GpNbEKQ}&4uPH#p|?* z(n2_fWv<62!dq_zSxfw;LpaW!t_Xhana%&+i3FkCPwbW2*fSB%QZTJu7uBKqkKBlM zy#t>6irpz&U^XX8%P;cS6Fl}sH%+@?xV!QLjE~4dAM%*I3!VS)F8{$=%V2ANWqxC= zjCepml>fyc{_j#s72t_&gyN&~lsaW>-*gs-Yv!xYwlHrc!C}5GFxqC89%vm6KFGc$ zIdA1+a)3+oLzrKK+RBWBn;#yEur!y)QLQiEA0mIBW}9&T$95i_6!#8;Xa%sS!R8adyW`h(~D8 z7Y7mQnK~*O>X|qiAcPygYfwGRrPCgO%PW0I9%mpFjl}Wm5J`wvj9B6ue&ry{A*_ml zcT4>CpKK9v6Ly&%t{c4BL3l;y4~ThwHG6Ht>G;wiz9RDQiXBdPyFzsf%&PznEQooe z4ljhde;Mo$pJ_1PY&^W+5bitt zI?+r-M4N~~I0`S+>p6;x<<+4^2J$2{Jl4@`;X%sEs1~=SWU_5{WNoPaY+o-|d5vzg zr>_sdQ1(}4WVmy=H#f3AKe!x3)N4C{>PU2fNNIf#yRC>mnz|DOtn-_!z&fR1E*6CC z4k4LM(HGX~`TBKmFyu3oUWT8myO4HENj#Np=(96cP$9?}fS5Ci&*;x)ZQ}|@q&Shp z8}zMS;~3QKR!drzltVx`2RF5HcJst7f-jkJ7RHcb&Y?RQ5|nmV1|IB#K@T997)SCO0(~*ufmyEf~*r=Nb-puPbU=Hwfj;E7@T1CEW)2= zjbT&@{{&0{8l(K^kd_usDltUrEH^d%m`=bjNn19OW=AG-C!6_YD3gaFMs+pSgkw*t zaHM6rEg=JqFOTi7JBw)6OVh*h)ckrQQ&>ScO}JeId!0R)wE0H*xT+I_Mc_aMvhrfD z62GLZTy%|@OkhsMNr+N=?O0GHV&M_|ci7qVoRAf&xigiCxY#NV-VY7ZOlr-G3AD`H zhtcFlmVPty^yxa~-ZQ5dkeJM(rn;N6THFcQ`(v@+Yk9~s=lt3#yBpof`wAHsBXf0< z!`@7-B%s83cU*wBt3DGZTTIw} zuXh&~eOoWK40G!%rNI;A5@|0yz9Oohf2LcN&xoNwhM3j}+QZ)#F#&U)1)q$`1YgRG zjkBOs?hDh*A*I9DuxexJNZF~;s7RO)DSP)A(zb|N#LBhoC0m=*Ig1?DUGYjjq+!zU@x zB^H@*UhI%%(seZu(V$Yun09^nev*bEX0nsn2aJT3>=x61lK415jbiUr zEp5`URnz!Lh*Fh=l@|gVT%uSkQ(-k$#@R9hN-(( zH?V9?dsXf2R7rCIcczqxmn#aZe`M{9=HR9A7U&lk!X1Rk^~-rtFV~s{2kb{8+&DNJ zv?MYRiciMo$1SW!%M?9En84q-xg5Jy{4b^ot&m35`?#*^Q$teTfMUR(eKa#88=ySe zw(fp`9BpUIy69Xa>%9r=UEEhyaM-RnPGsFpQPSmk47kRKNRhJ))gF(qc#BF!M(rmG0plqVi>+*0$wZe#yu z^#~UvIn~_KH0Um?4yWp?VR0qWq?J|qW3mam&!cMipurw)*@;FD0`wH$M{`Aq4uX5sL17y4>*(`+6+9o!Iq0-{q_3LHR-svFl)|a z{B7vB=Vw0(MxA@5J$nD_54JhG_oCOgBIyb<>~fVrEV?Bk0oxK4lN`n60HGb{%2Nb) zZpT|KA1dGRGiJ{-Qo+2kA1BB8R0OrfGgfdyH-zUst5qgVA`kwJHp|>#S1{a+$DYjA z-}Dwec(aUTnjbN{U{RQb%U)iN(zF-IVFLS@HOs>aOR5(f31@JDdXtJiHN$cwn#i0z zk^0qh)Hq9V#8@jqJOmPYEm%zs%|Hg8^hQ02r+D1jAR9565Cj$=Ud09t9Ve!y%4|BP z9r6vt{%G8%oy_RaW5xCZvxR#~^&kLxwyWTL!5(T9?{l=-Q>IGQ@Y*y6yUz_$aRM_~ z_8&?q#4+tkk+4f7wtlqMbAsHN9X~%(J9y9&+e!!+LOqCt@ zDxXR(^V_##_*`mg$hXoUe~3O}pblst>9`!+nv`&!vZu~6Y^y$@)pAtRnSruk4s%=k zoNdk=Y$Hm3b|KP=JNmCrKX(pd;{6jaHXX(7a(M9&SAkhGi%fQ7rfmTpV!zTcV22pq z{9N3o3y0X5Zxl?G7J7LBwGz|sQCXWq{2d3eGYXBf=CtbYpdu&@Yp~gb56T3FX4iuc zX{&QrkG*1b+k~3acwpl-D*!tuM4j$5sy9s}aF)moLP~tYsS=$1=u`vSP z?S{^dhQD_O1>z8lo0(4iPr0)18+}dWw9M@a@5u*6IvQTFIG%S{R(fpp}h6G;dAyfk#+N zACcB-rY>DorGyZBhe}_ZWX)J@w@SdOf+EoIEk6M&m^BxsF_IVS%6>2hp)4^1^#SRz z9v7%(6bhpTd8@}-=Et@B(~6d2UB3$9*I0S=Ybm8|6z`)(*=qp+G@ggv}9GI^9f+frz4 z_)RhFjVp($*5z>$YOXobX)Miby26jDda!lq5HMM$>4E?y4vZpUHTDx#gh`I%S`{et zcttz;XT1hCAUb3`AtRCAbBEey^h-@>)ii+eu#F@Mx3lzeRb$KbyICdIE+l#*geKe1 z-CwP1mnOp>wf&)|;nxMwLtDAZmM*{D4)kEwK-}M9xdAvCeVwa^F;4b7 zoLaLYYFio&OwRkJ*+P2;T1yxnWPtfLTn<#6y#HR*LUh7y!z~tF@2X!9UJ%`N&~N&t zh@yQ#2qS@CvvTvb9F#-He!(Ap0sqI2{}1aW550QG@cp4i9S#VH`MKw3j>_SyYnR4X5M*{?^$ zJh4YWJo9%KMh{)+x{tDETu&TOb!t^j?nt1ca(E5pbnE&AOymsf#`Y1QiQX7rYL^Va zG@!&05$|7LH|{4YE})s#mbj?kh%?7Frj3U^|F|wpTK+vwHa1#rzCI(VdLMOu_?y0W zRGIH(VP_;SU^!k3W24?*r}$adTxCQ(FgUofL zQEmz$y?Qvg@;9zFi|*SAkXrLFYz5W)5u1BVE#XpMeB91?71JVaO{|NbSE8$tEiw(D z!5EhpU~Wn@s19$g+dHM@h)*UKf>KXw%na;XlrJ@k<|Q1CKemkfwMM!SY9^~MQ}vQ; zlK8+fz(QW%kzSDGDC1&GJ@LdmQ%l3ii7%UD+<0zmyv8Oa4OSPgwM8wS`nyRpUVSly z)yZaiQKJ2b#uRME*_k-98FrAvPQ_(hF%G&+6XLUABmFGlQ8%ls_{B(Q0EAy%^QDYmeCvMan7x(WkJ_ zI1wx<{y1=&zzR3DV3i)yaR^hv4I0l!A(Gke=y0C z(H|I^CeT*8)(6_y2$T$%x6Owxq|~XUr-&Ey*_Ns0Y1C)u{8pmDqg2e8-Q5{4&6Ztw zIuxCjd6eh__E5#{aAI~Eyh?KE(7B7j`ztty&r}#fThuZY7<^k4GyRHsmE}aj$G5Qi zs_u~}t9QLnbo%7>2#fj+_6#(JkWeF1zaxD5$unEJc0U&=i*4nGNHmr0{F+K~J$RS3 z;V56yjRmoa;4$)EUE78En5V0BQwJ+|Sr-Pi_A7@gcST4mhdWBtYqnYs9+_IZI{-x+ z<=PRdeRC`^npsu`+Ol1u>Kx$-52QT5YOKPDmy#O|3KhD)_P;O03lBq<&V7n&^9ksk2^WG-dU#e6V5qx~!7otG z1~)Xc{_3@-u1(A#m^b}fKdlUFNz(27OS+f>5|%T2JBYhB#I(RgteQ%zGd-NW8fq9j zb^Mwy_p5@I)GV!h*fG0uwITjm#d&TEvT89-q5QBq%)2}`K{y($Esy7cIWFQxf)+>M znv;g@=_k*2pm%Q7tchvb7Ft&epsR-FftrRHYG79MIhQpLZyU{v0Q7^DCgN{Co~Z!e zI;wlMP4H|A@Wb7Dh`boj{l5cYMlm{???=g9vTo3&3}Ca|MxE~O(}m> zutre6+m+){Subu8&493wQiuhJm22xX&>{y0R1q1&`hwT(Bv$l)_%+HGqA*Ck{nlXf zVl!J1oiB_jw3-)v`#lrKAtmE;LHAL__q=n8H@o0rqB0?_ZU-;T5wfpL1 zW9N{Ofn&|PAwG2vMcmmtb<+CU=})&CvFRZwe@%LNX z)T5(eN9y)`>zGWzl46U2;|gZKPOi)6!C>Ha-OfZ5~S+i)55zT-#Q* zh!}gFEc2wIh>kdleBq-RO^uPG!i)^2$nxT(;xfK!4tzJxTxQ>>CqtGo69D1&vC|ZB z0NDjimmdl@dU=P(Xa7y@pQCiSm4 zb%DXn!#cVMfRDdKB$|LBUg9c`j=BdQ010qTPf91jYhD1S$|R3&S#Db%2r5xJr=3hw z8W0f#(5iK#IQbZP#F{>D*-Y^Z`^CNUj#%*g3TL0~lw^?-jNkcC0R#+W_NN_+%x(vz z_Ar%VgE`oVh;$iyh)n4VZg%uL zhL{pX&E5pc>3su4aJc-Sa3#~wYTzFOyxbp}q{*(myy>R+)<0KEBs1i^vP(sVDCF%1 z>`Fl7)L}~YAy5t2Xn9#ALij~yBuyL?3xEqH$Sv4RE#oVWAA++t=T**{1?^;loo`dj zs`eA;8MOCAB}gD3a%hydwxGqkMP!HFc3hE_wYo`{I;>-xiKwW=ns@89wm$MyBS$n$ zH@j~iZe?*;M$Qi8BRBbHGmBRJ28)yrptvHwgSaKzKtD_|r3ne?8H=VMw_@8|pi0gz z$R9P-e)nUTdtrMvCzHPmMEv=YUeiFhlY=e%;|HK4kvtl4NG{)%Dvmv%%!mXD^pMW) z_EzhqLWNPBG!sD_x7L_L{JYb6g;&~PV;3Ml)R1Tk@axuE&o&R3X;ZZh7@?QmS(8kP zJ2~^IXC$_TymD}lz2d$4z$G^8nk!K4SYJXZK(-_b$^jK)r5Tp6+g`n(G;*TTeF`tNqc#@bN4VY1HA6|HM8oYRQr zz)k%NTH1S@oiH2%)MotHt_%U8H`jZtV7=>f+_qwvVXr)4&w-U-b?5E;BDTmSSGhJ_ zt1?BiGIy$-lu|SSF{w^SPfv=6D3Mw=RMj}UC1vaJ$6NJtcoSZc)pb{d!O~Or<@}uR z9Sf~&1g!aH_6mip%VpLxVb?LC6K7!q>={(o-M9yJz#Eceq2>jSwfQy4?wxr^r?A+4 zGgY;_r784KlF|x>&j1I}yYiW#<(C{B$WFy?Jqxb3kwwzILagS5>a|KJvbIudvX3F* zpPY-iQci6bX_zisl}>0uCx6j%e^Txd)ZD&l1a%N6-GgEAs%a-AF&mZQO#5Z!qX6>E!RQ)JRQ zS(&=maB+4)?Jnj9>NVEslha=hU`=s8^`G2(>JAx7C6Ece#vY$xT^Zmg`yYi9Es^Q- zGM%MtH5c@q9Q#xI%0FYGh@`SmfcUWH+T6KZbM666v_ivR(o{Q%ovgJE2xb|Q})6< zj<}FM5qz~~hl*1cb{%705?!JJ!S9<;p{)|Vy2@HAFC-Zdez|uVbaeOng+T;ce>BI$ z!0(R1&y7M)R?5Yl;#)SlAx$Nkhv6;mw8G0_kY1boMk#sLs|G%BfG^!aqt=oK=({l5 z=k0|Sps4@2#{Atxkbj}7zKFA&a45|yQaPuZa0*#0vv*g zX4^n2s!kFfpPaonJMyG_)|5=_V-s?U6Id>8L(BXa-c`6l+i<7!4J3`f9pmbrF&hM4 zFN&sZ_Iu}EW42s6UL-jOA>6_ltc7^Z#8c8g(`kbI9x`zS&C85LlcZqJ8j7)$M~)aD z#LiY`h;I5*qT^-`I<&MswY}Mdcfb27j@TDw<%Zsv`81I^~FUQgwJJK*BJA{SNQ;GCT9%|aD{2tE{E6sLGmsgV z$Q${u3f^*PEsP4}!qk}3`I2V&Eoc}BaSvytNhMrP_^oi3PO!@<8ya7dFI=!hQNF53ERLo~>ybFZa7M%y8k2AkS;R65 zSM4syoe4$laO;0sLmAUlT}7#MR5#jR$de;aW(Y{+6?IM&fI%^jaa7BA>>}m7^pZ{Q z_3YW+T>jRkkOv0ND){b;_waf4GWmR}f%^j9W$3ISEZKwqLn--_;E;t}^)z>h(1-R; z_s%vU#E7@ajr?}k)V3~vUyYZ_JTz~RDn`XEuK`ng@Wl0n8>y#o zADX*oav+77JAm%Kc6vZX(Nk$?1zBi12@Q2JADHKg-I&1$t0-PA|HJa_td8mcDzOpR zi8-O0eoSZYzCfYCk<*eRnJqt;j3KVgtP)df#6ICzDwZ+WDWOxeWDN?TSMZ-F{izMPOd$M(CsPJQRN|>uny*cG48An4VOIM|d>v5|U zb@IIQHf1^o-S=^`;Dnq^3_`Fd&u-J?P@Oc{**FKB8T>LsWf#FmWbAfrXYLB!Y1Qus z>ac{1^gT@OmmahdkK5w_Z;++t$Y3r_9U87RtLgcN9)^=r6z$40ku@4lYzryGh=?yk z7kA|1C!*)p2Hppo$ikRQmDTC`@CVJSk1;`yiE(PMlq@T+20tkc&?W%p>W^H>WG3C9 zq)FzhC~zs$2D=kY{o0iLhOjw`bXS`tB1Vv^`h@HecNO*XSwN>|0xRqIt2d<^+m0rN z!+%>+dV`s0*q`m0*NZp|hsQN^vVakVg?)iVaEAL^?q657TB2_5r^|K?nKq`Rs{Q)v z>O!uXc-EYRgnEs0bW*gS=|w)MzgTcHX{zMW%n~K&p60?i@NPdKRQBdB7CWJ z=;JBxuO6-eogADcV!7E&y%WqnWZOf}vdYLe5Q+nLfPk~p-{OQlLd983KQ%z+=n1j2 zbVsSZaL3bGz5kcf+m{VF(~O1Au`>*>zB%v%)qAi4@8b6^0t(;UodWM)4Dad#G*^ug zAe%4wk#FgN)6>VrDSZHQ1k2W~QicG;J4kApFcAEHRE1s7_uX%&QSR^%%>Zz4jg!F4}y7s?9(66w;s zt1oV8$m!Bw{3)JIl+zzu14k6cKR80#HgbRB71S_$1(_*Bz+ry?S+$t11s5=zGv8lu z`H$E|DnkI`M`H&Id{uEq0Ej~s2|{RuoVfvMr$6`&QY*B?+d`cQg#SY3si7i!_fV1( z@@GRr&Xo%^mcv)o!3RmY`45M~^PXXI*M~h3wIHkouJ;xr^L)%e+jV%omA6V01a5b~ zum=;LGu%lX!*6>yiR-|VxBJk_A;Tcm*gOH!U#U4;{Z2_a&tGf6UJByBs6SffrXfFa zsP`y-uv7jJ9R;bZANKvrYF7Pxpx9fRig8Rd197Cw0pU9rEyFW@(SWYh^s8~D>^ZN-PrvXh!gqLAG?Hxt#xkMf zC#s)}E-dgud^#8eQjp%0v|@p-J|h=4zm&H9v;$C}bi2@d!zC&Ka{5;5!b!Q);`0gu zqv(wCQw{T%T6hGk8&sAz#B9&rzSZttDW}_1Xf^ynV9VDcs(8zVDqt2cYwh5(H2;>-C6TX`d-%e%6>Nb) zu0dBupj6hS6JK?OPgb-He0#<`QIRd$TdPX|MCkenb5m<2%Mh zPgIexJ&Z^q?1=rciYmSX?ryWx_s*27EZKh>zG1F$;x;}mGcL)A+bYXeTeIEW?aP}q z(ReK#p^qvf@t6!5A%+M0h2hme;PhSlm2ui5wDsDHBV@|y3USvr3y#|w(50dNjKuyd zn{+*5#XMr_!WOnI1B^$ALnS_F`V9W)Fn!C>_kn?~pH0S@oAPAvz$Yo~5uA;hLs-q5 z-UIou^B?w*;`gf`FtP>F3;BKf?K=YYf5K`^^$d;d1?`Q#WyL>tXM|N1|C5erN{P_H zRzVq=>Fw`l1O)P@2NDv`JFBHzN|aX-NMWI}YHcDK#vSK{4KPw88Jn=)`^Ktos9RLo zSmbn9*;qA6CFw4`c`vzm_3WtceEGRgXN}c!aiKX={&}^%&T4b$IdM7J<~f;6`0{=S z0JQ>tqWH1(XJGEpx;lW;-Hb;^N< z-jLqor#;8I(WO1dx$&jJ1?~kjfxta+3xAiRWWg!i5Fxli;*vVxX?ZgP;{}M0?j9A` zCc`NFK~IZGcm+)(VLTb7PIx6w8yWKqpDY>k40e@?eYM>3+2m{gYNPk$h0%c=Km#+y zm4?&dh0jkeN0zE;3vDjb3j!Mqwp_$IH!t z&;P+ItWfy@Y#CK7BYrQhsqpZ!n@<9_&csyDFv~^3Po5_;aY|NY`lmE2Cq4>bCO*Vf zWyV8QmJpve+vLGyI7Lb7kK+rZFTOBaLzz|_`Fx;ceqjd&Ih(q~A|bE?Y4MCg!LQ{= zEG$1T|IkQ~aVm4jeqb*8Am&|xmjBf?D=&M@)&r>?LmKm;>a$t$pDT4sYH z`cT&JqoE0jff0|?C2RK&;R(R3vv)hCSzD_E+KDx@5fu&1d2`b2T~q<6##|-O$6;Gp zEC-*d`+JEKjmpE$ckd8!hMFM7ZZld*CFGiX?bI5mmRLGV^tI8-%5i_H%OK1^${pK@ zk1b`kHitJ3Zvhn)D;gshN5$`Q`(PYGPAA|8`)HG)g3+GYo6qoo|3=zd2GtQq+n%_) zySoH;3-0djZU?u6yA#}90|a;H;O_1c+#yIHJno%0_3pfxTT@e0-PPZ_KkVLn{n!4j ze>My+%2tp9cS7R#aTe7$qEaE^I6(80OtmDjRC*0G_T2|N) zKc!!Z=HN3mvlw)7P{xvW+d#x5W9q~Yk>;Df##{R^uIx6qDQHjeNCTo*xo~bVs-R=LTzWke4^?jzR_3%ZWME+LUVD5^?vUBNIVQc9WJjRD{#gzbAR z{mY-qVto(Z5Q*4VUiz0MK`o;Z@}G}KK}Fwu8hZHTd)(w?GWtMj`an!mBqOpxIwFky zn_E=DgWy*1rnjG6EZc-IFAIi7HeWU+B+ppUQ=a>iG@># z#1=%x8YnuA-0Wx2tah*ryPn7m6X#m=F;?uI&T!}D?7F2K%ktgcoX*NSs5iCbPXBQc zcDTlH*VZW5vnbKmEoO5$7e!#oPd2$4Th2c~#A^q&*a~B3f@QcM{LqA;NPd^A!K*91 zi?x1HyL+0}33U0mox>@zJ@o)rF3?N*0`w4vnGTSO+b^XwPy-Z>CN)&{kJ)p&uy{E(aq zo9rebNJ5yyy1=lr6A+jc9YeefmYJ4BT0?Gmv_W4Bt8&5? zxIrsS;Xmg+n#-FbH&9m^N8F0%ziOvXIRj3V>z^6>5$^&Q!U*dJ-mg&|yw@PNy0~xY zxJSJa2zwCfj0j&S9E_$QrMmm=S7As-e?y_J9YNEq!1O{9M#EzD^dD{X(>pYFE3WTt zr!H;u+d5ce-oZLOl61Lybmbm`=k)Zmq159S6dR`^<_${)r~I44VR0|^JtcB> ziD=3AWtIXvO}cij=~Kg>#?K9%KQV2THd?LjgP;&-lB0dB;laS{;E?$o+3Husu`G(K zBO`Dn_H1rYE{I8PGs^Bz1y?C2%N>JN;s-^;riI9)6)WZg)Mtt~n=~BX*ST1sUi&RM zn?{F%d&nGchcz6ovte@3nQrPA-Y%%URiD^i5*JXy=rpD{#@rx$N z^4teXo;BuhA?EY821<-IM2(RoyfEMs16-g#M!rANr$aeCl{_OhVs8np~=BHw!f{ipI_`f)%ZgiggP?*`O|Os z;z=+N#G?B5zi1)<(GV#*SS4g)fPtxfF&6&2sHgvXL-aod5M4x|#&JWzxP8jBY-3Uw z+76waPCuOR_xuPn6LA>`!VqxgZ#jxOYnLPbWP6y{L&8gXwPu=7%)MyTdyNQk_RG}< zPkMFBJDVH&`ny`pPxCgl&ojW2&6FnVS<@7wm$NBg-RBg~uGjCJb)t{!@e1%gCg4tl zr+`HLTtp0UW5XOulq572wp&wJbm%x4O=wmsJH5Huj0Ic@0*!c<20Q+U1#b$vf)qRc zumxud8#hsokoju+YP$Y#17^`Jr-0VJHw}sazY7E=8|#m8Dw+z8Dl1o* zlyQY}R=$*RU4p8&jB$4wj?5_w_SkU;8n?{c(b5QiwhUS36d%tT&?~n= zzd7O+E36^Ya#M4Z(2B|E@Y+~ubk4Lw`kD)Ur>>o8oF!8WyY9>pkj7C#i&b}A{hP^| zSbFcM1vU?h*}?vAyYy~_jjK}-N;>~lJIqIo4YRVY^(dHUgY5tWl4)Ds*svg)6-I-3 zsx-Q}r*{Yyf#EDz#%&BT_tx0E+DK1a+2mDbyf$k`^0+4VmIJ67{r>j|KR?hEY8V^o zZLkGgnd%@`rEjyP_?N9PL?@a97xFLY_^k<#wq~wXbZ4g;fxhsU_lRt0r+MS1pf|*J z{fXBW#fS5yGcgMZqw&V?mAVSuYlf=}DvK-4HD#@~x|E_g-1b6Hf~7uLex{D>j*93P^A?%ZOQn*JcYSzl$3Intl` zU2Ny-ULxi|MlmJF%I!#%g+0_a0&~M^|9zaQ`4vx?pR1z~7lH%lD<0Qe`JS$pYbVif1_KFb9TqTr^NTwqe{y>$U=|3wv~a{CSDe=}bCT4{t4S5;mjMZj1CGUYv?xn=JPz;V^zdR3n2Lh~1;150gP;4w2R!mS%dbpNwUe{Rm?NWU zA17a6sV;VC^6g^yIigR*eHEjW@#oO+5dQh9Ld87=_I*GptnuhRh;~i4_Rqq`K@`iz z-a1~4q`ml&3p@F5RH@nA!ED5??eT#q(Liy!wW>4H^-iaJmILI!T_r{Jt);U`R%%2RYHK zI|lM^8iS;!E4vjYVrlkZ1>!&2j}Cvo@(VVAy$;x#Mx7nNYd%3{ZaWfKWq)k_aIK1}vKx-tX-A@*WC;9H(2YzPc)Ib5XR;0^Pr7 z$0Jr~n}WEc7}iwov&3uHaqQW*Q^+XLopLbi>os5s86ZqeHGLVH)>g3*oUx=(EN*gh zy;sTO_=PFN+|n+F=&sx(jZ~~0`5w7Dc)ieVaZ$&@VqwoanB8i+3#ZC1MGY4;&@SbZ zG<1K9iDp3}AGgg4!kcN@;b19@`%Sb^S4At!&Sk#NiTU@Y{A8r2(uAsI&u%P~l?w$# z4CnagewAD+zSza{Cmuxn4j_v@be(m+8tAlyGhVU00epB}>qpEZ5BuCDP;T<$sU+kI=xXe(hVYh;!<|3VhITcYV3-lU@PO&wgS+m}Wq2KT7*(#46_KjoTqU z;lCh4k>>rx%-w#er$*Ht2Mrd&<;gz=vtM`lVFynByznuaL@~33*jhTRm&J> zdv5tXMZp!1<6I-6m>%y2_c;AQBzi^`fZW!+ViU*$tv++IjAd@lNmJ5d8oTe%}@!>g)Q zML+!**i*hAa^!948o0E1sE4N zES1Yhu0kC``oV|ug9G=acw=jqj_e$&^gHD~^ucSDamZUV89A8SMphRj3AYVf2vlW$!mHe` z9b<}QM)31jrtTHgyN#*g#)UgXfr()esfT)ShnCGWs3yHfr#Ryt$YdNdiT%_ZTJ|>x;1}5YpkDPFK%XCwP3MvLC%&i z-34oqT0z57{UTN{z@#;Ctw=R9!Bi1z7+~faiT4oEoawvP&c!bMO$!8(1=RZ(M17dm zoi>dqDfJ(`OAc6K2dIzc&q5)sNOe2GT=T59-hwr7?=7PGDVyVrk0y4d%fhs@V<|?z zzt)x^gVpqVXeDX8e`Y7dhfqN3zYDQpRNm^03zcJ&JS9SA%JHT|7iS7Vn5;{-Vbd$& zTK-ghu|}j=clrZMFMkkU%8*)9%Eq}*_Do&yoWf?7bsZKDu28(CIKD~ye_v~#hsXP2 zl{>xAo}&=ANk11z9iJn8dhbvE{=)?iJ96Fy&wNSMwHVnDbg-0%0Pwt5WR!zwuw-JpMK$dM38^XVZOdMl6SWz@U@h3hs~CBWxP?4S!4x% z-%$mULtJu?=&;naS#I*HqC_%d89!MDG&R)tjd1s%UphreC~5^1 zrBKBBKax;V{9?oXXt6}kMOw<)?y3B-jZ##1Bw-o`LTQGUSM%&rnBg;v9x~`W>e1!u zWxb|Cn?F!PKB?fx|E#vGw#i*)CgfFfV!P5z=plRHR-|ctNa=GKc}Jr8q!}7=Pdcp2 z>3LSSI((xyf6j>Jcl<+PbXD3poux+fbF&@J;dFi{fRHcwf)mYqR;Ihj;)zynN;T8S z%q;Sop9-S9l(+aK365-7qbhXUmMFmuEHyNvekAssX_{;ePjFK*(_b;dcP%P4pZn9b z(NF5>T57{gBhgK2@4o*E1#XphX{TXu7F?(4iE+H&P`x{BxV8Fn zx@}0sv$Ea(PE{%GOre&V#)y0r@R6CM(wZPYQ+bMX??P!&5NA%Q>^yw)-*D+k3ovjO z@-rdfqeJnqTD7;HaQOiLCrz@dpN+e8$RICv3|I4NrGr{#P)D_Lp^;M#6Xfcm5;hFm z7J1~p{3IbX=MjJ#Fw81vJhI>ZJeZ+w`67i@l#*y4PsGL z(Eq_%D+taQU;aT}Vrx9GtC+A4;e&)r0REYIhqn`9)Um2}e(Y6P%2F8@1$zF2Pxe_8 zt458HT-J32x<>&rgP)9%4k9kUu+xB7$C=!m_akuCi`^ZHro(Y*t#D=PKL@~E?6g4{ zIH0_k!t|puffG)Hi_Cz%6j7U`@a@s!gNd*UC0RW{zA}M=fk>!{sK7`N^t+Y+EqC)Jv zHRP3^B>wuAbRyY2#a z6B#~3G;opE5yHd!0A+mH48LI1)0ER8QhgsKQv!8gqaD-kw38{MYXDh* z?r{rJcnzL>4VrM@s6BVZDPp@G`MSdFL{!W>%1TI~R_K;a5CYbeg^2tN+8ZeV`7fRI zO_4x-fomP)LQf-Qn-XO*!sf1Hp0ZdHp2e9aK-;rxD=f&JRJVJWREg!KXpP) zERhUBZrL_!|2bSq8%bnYa^~76^dT`BPWm|nw$`U$c~?vv?k;!I<|Vrpy(``?eh>6J z1i$$OlI1%HbuUtFwqspZd=0NKYk$Y>X8l2+&+nSgI-~FN^??Pf9WIdqK}T6jRo;ZIDPN2)5KIG7U~Apts{ZZRWJm zL4LpZXY-j3RSuO7#T|M*0SWKxoBPwQcmvZk$V6U-i+##WFya z-py@MrB0G6WlajB)=|Q$aZQshSa;(3AdxFSN zv6{cY!!CAkIh&xY9S(OP^!ukd^LY4s5vhkDkNa z7+1!BR@&In!gy4@p_Qt zoLUQ8`C(^a;rRL5)tzGFBYPR1dmaxBh8iQ+$~^gY+GK89>_klxk{DUIYFcGRYpW=( zVG!SfDM19KRPD?lVwnk6unW%Ilzr&ajD04BF#xV`%03D38wi(boAylpB?b%rGGbHN z)7!&*qAR#9y)Tes&y~9cVwCM{8haCib<;lrS01S=lPZG+bqMM z%6m(@K2CXCB3f?>1^Hxzq(#}=yF+&ti%ON7eb%EFGloD&Ql86)Y5;;h2_^6yzJGb8 zNW+OmAUf1S7~}Nzi4f9GfH0ae6?c$O@V6`a7m`CI-0mpzux1DJKTQ}&2X8hXw%+h& zU}6Lzyk8!m!QtFsv|@Ttqw`~wwWP?8;0ARpJ8%O}@${Z`i4^9Z#qTx3& z#tz{xHAYj zQF3%-co7P4lm(bxyS?>U<>gb7_Zm1Twdl_sGOSW!D>!yn!;9oQb+)c_%3o!l@KAb= zS2X&4_LKF7rCXVC2MV1kK**3BvX2e3z8wov*Q-$p;GJaH7t5zR9@CT9xqr@?Ip~=m zQt2SoX_R$q;x@p#pFWrU3QtN8U-%R$bNGx{0adx*zt-!vp2I}RKyC+`XmqMrE*j0` zhGuM2?LbvsNRr?cUv!e{oPN`y^(o>PC&pE`ympLq2_c{m`|U4Hs~V;Gt>OaN32rpY z*pssvR}01aT>4f$Y=>;H@L_U}tG*m({&(P!7XT8)v43BSRD}CAiW?{~KUz~6;l61? zvOe-$VF>LexAmdP@;F5E=pg>t!R)&QDTJFhIMMrCit**TNx|)stIOL58)6zm2 zCeM{sAR1M&5b%rw4(-dV-fw78)W)HN7L_GoOw50WID;;0E@NhvMwG3tG;lnVJd?dy z=$h*)!|kCf^LO^7s$1#eWjOuI$>G=i`Eir^Y*hd}D;fne5z?m^_$xRE<0X3=fSL+2 zBr&-SMlkSC`gT*kFU|?fjPSE*&xrVI(_RpfD08ctO`mxI!#U8TZCw1aej3? zC>&45QK-nV$Nd=T8TIC}-^bc{^g19{z;B~99KU_@Z>wh#oKP_rg+rX(ygMUgL0`3X z0ecx#iw#A)C4cQX0}m%EJD{0XN)zV6uQ+=nCpximJiwAF!VBk-ibBpoMONxeZ_B-u zws_3ZQkjB}B+jtYSr8|8V(1T}9sm&NErzd|B7jknmAR3xk=9JGFoHpt)XmPHt)Wgg z+KHzjfuW}-`W4euOU(>ZaXn#kW@A7cS6*D{RgtW5V5g_pYO6<4TUr8-Jdh69pA3=P zx2osCj73)s14!~h!(4feWLSXA`f6bft4@#Y%;H2l`tZe%6`qupi;avMkR_Kg2;3{m z)or;*E{Cnv8KR51Pf{@^RWy=R`Lm)+Ib=1ZJ(T|Z%qZ*l_E;vE7L~wVB(8o|4kk<# zOMeJ=)5Kn?9{4-Kq#HD*gSMMPqap-<{yxnOerHvz_x9-Fx5zQE@*-Z=Q6D2|{4f zJ^M4e^Cqz5O~E&9OgA4tlbW#ca$krv_;0Sd+-s!zo8l5btkX0aHkMJ%X)vAoV`1zs zNz0#eNXOEcmey>J4i}w=r6$Pt9kEu=slBmbO5KaD7{`Wd)fs9N5%E7VZQ^yLtHMT8 z&m?G=2b=-hpjD*oOEj%hXEGH@UjAS78hQ9}n?1b^VM(n{^%qE8OaICB@wyFr{mCIm z>{CU&LU51ZDVtM|TKdKH@%+vb`a9(}Ey#J_i{1Tu1yWz6$k-g}Pb8lHcy^+Y9EuBD5oOWHnYTn_?_)Wt%#n&A4{tEQs6w#Zk(S#BIMytv_ekPOmlZOP;K%5K?SDo zvxI$UdmDxHjo*5`z=pPz{jNp&3=8~mTzLTf!c%LMx+lWk4fUC3O7JUf-<6vj&Trl^fK_>1LU zTqA9glmh7_PMx}0P}+q%Eh&4K%K0O1rMbDf4b;CgclSAzh)bsI78m32;LA=vyU9-S zxMzrzVtOJ!Mr`umRhM?srp<@^2mXg>PHpW})wTBwr&st_xj4bO;Smq#O79PU1}(sj z!_T>=v6`eLcSrZ1iO)XvZS6E1{JweE{Le@OS5s5{EY05sVUjcsGY?c9x9o22a=+`+ zqLQQP8C;$m55wYDD<%pa=lK`y{7W$OdqNdRo%LGt{DgLk-aN#8%Lp@C$!UnIZpHI# zYL^Rep&c2yWs)`KLa`tSQNKlOMeg%x3xX211A95UDVZ2MxiUkE?vS6_HoM+`@CB%V zg4s_&)o4b1fOLpSt%9INSQlLw0hh-;q{1LXsXd?pSCJhM*;5oRsP4@atZL2PY_l7m6hIAP(|hFfXp0*IzI$MSu}c74_;jT+Ynn_SiUzT zquZW=50U|25|cxA*ed{DyGob@_w(S*O1bvGVd5SNZNB2RnxY1;$@{7KGI3eOd)JeQ zMhu7sK0w|u6E(bI@Cpn9z>1n#FR+~U8Y+rS+Q1kJsnimO1EnjwR0}& ztJ7j4X0gH+!Aj9d!Sws_jOg3pZsI2JQg(E6VflCnOZ<)X-gJ9zRs%d1b8T?di2aUq zE&?MrhV^LILB8!N7sj&%Tv(4hCY>Ix0m!Ex;4{C#dsfC{O(6An!!U-9)dr};+8?!^ zCTjA}bR1EB7w&xj&SLaza@V5Fpe>%yXUmhB;^P`){h~sF*jU^XSow;F8qc z4g`vaiuVq}nJwf(2*g4@#KNn$Wcpusv5H4D3g=kM<0m-ppL}GqCU?MOKAW->yQO@t}BQ9H;`ujm%B~TgggGK^g66GGw@#VlsS{cv0V-AU*Z(wdj=* z07FNFRq&|=*I!Qfu!Fd6^@6aBQ}iDY-O(a5vBscb)QzYDE1bZ2wRbQB#-Y#y&V3}f zZK;AD3%H+{U2`71`b`ZX0@F~VdsO=a3nc(wWwCbcyd?sXPz04|GF$HU+al{yM!Y_Tz*bi&Iz<~3u+ zOWGKpwJV6$5x7{aS`}?v$5TN&MervW!JE@cYs4j=Q4?x=L6~Y323;LT{<_9RWSZH~ zwx|REoD;(%)(6y)Xc!l48WEHttcItQs`5DHmcyiZEp=iOlMhkr(Y)FCA(1?Z^j^AH z-5fd&*&u(yT-4~*g)5+QeUvc9SCZrmrd^Y)<gF8rm7Q8jB`hzZMm=Dux*_cEP&ka0lmi`U_iasHn^#@uAC4QhN(~eJHH}aR+TZxbG!<)o)C*sfZ0JOIUIms}~0cp1nhyI>| z;K(kxd!sjxbRXsp=;ZkT7Gtldmx$nQH{q_Gc;mK`#oXQ|v>@bNH5F>#PiY}wK1i!MnA>5*Qsju#P6cj=JW^$ z#Sw%FhahA**}&z|RP7hJ@Bx-h^3UK!yX7ozzl18z`6kX{1A@M;+*U7|O+2$Cu^H3f z*Hb&Y?B}G%80w- zt1n(e2FuFSQn~Z53oSdJo_B*fmkNtjV9JU8)_t62sK9z!8K=0#e-MPS_uY$M#CDg| z(@iU^+JuBJ>VCP>3Uz3SjE5g{?`xPhnv zko|?n%&`J)<=36LBXvYF`{CbV#B1#I^OX?b)>l;-#CcW65C?u5Rr76?E$al6Yb^7O zO>iJlArK2aJf;xVUd-_GIjkKKu*dU*UL^~bmR=k837UKUc9yJmjOO7_HVSQXIK&!V zWh~XE?hq+V|1GCK5dDdjkyDMdiUEq;dTZdiwp28#7|%6&ay&~RMCN#2&cYso^GMWp{)*yU4azx@S!oqca-2)!gQx z{t3|0`259z1hEZAH=TdMDR9!2Z|ICstggvXX&l3A38-)reFloqj*a9)H6QNAY8_> zg?pwhuvb?YX_)rXrSipZ0y<;vGNwhAa>*gmFAz{NGS#{?QY>JwYm|-&)4-g%g+7Z& zE`6`RQ^ki%PJXYYr=yTsQ>2%&pMo*NQWXn6@!qTImTKRA_KdB=cv%QUX(t%6NcLsJ zRqU0tfIVk%{FjCEX|oroIFfN~|JJpCK;vPn-~l5Q=m@#9PU;=odDeq9vVo2B2X?3Y z+J4F%W@J-bYlD=RG1v|K7Kb`S<}wrP&rM;M;lW4xWg=G-eFV}mjJ>t>@#_)9ANT$Q zScj|7OS-oHLq%^Q9x4N>{1H#ml{~8%MW`Z`lu^H(;x^)sLTU^<4xa@L+|Our3uGCW zPyybz;Pyzr7fd1zZ=nzsheTa(yk0HneUCY?J#_@7AbS?Ns?9&bU0 zuj~meZ$oG=4_sfeK%g?O^xto?=YlvEfd$<|Gk9063SQQi|HXv*A2pX}yu88cD^xb+ zD^!;K|6|SlKgAqdcS3FKUUPW@KfxUgTBAn3cy)`i=yQkC=)*lO5|$Xub)~JjpXNT7 zam?`s%uWVkJOKR(we;5SMc*frA&@!Qc*|`k_0l1j?TZ{ND=t&7P)`8u&(n+EREcJ} z>IH|-JKb4-w{L#koSl6N|DgiA3=53CwL;&a82Hw%AJ!(f7t%#N7TSh=aDMgpf?+=0~u62|wt)RDvzw ztUcS#U-pJ9^xHX0$*z3G|0xurUC*2{8>~#Ivj|#k-jsQ#4n-PZEvd{@BL%bEt~3i= zOcN}k>~R!oc*zuT1-D7?jp=MQ=serQOjOL0K5-N)1hQLwM2Zl)(H55 z$Lf`Gk)#-jC`K{wK^H|uii-q;KP;_uri|4fw5 zVV)=lC_0%lDc8|IXaNk&-I#?7`URjXWU2<*R6*f2;&Vq~90X79wiZ(OClWitQ(IJK z3+3Akp0->&h|{cU%wOyHPz9F+84SUqF|g?8!hiK z2^co7HPcyqYrT9hGWwZGM(CuMWvHZLS&e0^0$`U_kvv>jt0HK9mu0o8)|8;vnhc&- zb!}D9v}l*>^K)_b7@SwB2Tew?$@UC$k9+huaSE)$GH#H)LXMzx0$mKiVR|Met9%Fe zNJ4Sj5HS^t7Oa)W1Dn~Mey(%S zWqwsz5%_vjmAaV9#Rd(vFqXs4$Xe*i>2MY6fZ*@pqW)7VRmkwH`4^`iH;MM3ns;S7pXNhc#wJw+kag;;_A(n*kI2SWEU zfHdp1BkBeg*@?o;*|)%GE!)wJC_(gkJvdIq`&Pa#u}IP;nL9fSAk{gG7k;34g!97J zN?sEMP(H#Ln?f3(CAN`O3!>{ z!Pu?zOA1mT&0JrV4Hx+1izaHtcaKGS|MX=m8=$j zDb|Q}fi}~oG?6t?n~mNZ24dhhO7}qeGnHC|$WPkAf8dnC(u54(rZ)y>N1IE{Ot7>c zR3tRarvh!f4L}K_*{*E-4~6N?6biGRJep1B)9Z7?KBEvJbWXoTn!%n@WWGVHbqJ-< zr=Z>fmBj+N~W}7|N!OKXM4nJ$E zUiJf4-MB&O(L%ir3!YgRa7o{GN7)^Pg{+;@88w`SD6C3Cb05?d8C{vmqkw{5SrBr5qCWgJCnkoP6y^Ch2rhcpm-K348c~>=v_tZ=0r`uHl<&r4OJBKK>MUk zRpTq78bP~7l|lF2;OuLO1h4gn1*%3GG;Olx?Z0Bw()u1HxIIe3oN1XYA7SqTxH__K+p(`A)!7v+GOGT{6g% zQ!Qd@Ju&>?hJBeEa5SX4uxqk3JX4xcb7EOaLbI%LN9cqdhBd;>RuqEvZHb&|omFd4 zf8i3n?cwWdWo{>;QD|woyM@I(g+Fhh76S;5kZOR0D>cZ~A?A|0t;e!?6nHhfg54>} ziRQV#1DyU$AgXX_fE?GvmJU9H{EN7{xxNYD(a}jzjt9H*+uy6z@O0*E+8OQ zt%~u-DO>oo$l55Pk~b<9WEh7A**8JnBXMV1JNjr&iz2etO$mPij@@2pn)!B-6qo1T zT2P=0X6bkq^O`A^1aV3)e3D>zwWN|9D*ur6n26Wbt1$BZWHz{y+?QiQ!7V@G(}_gM zh8%tLWur8ZmAL~@GqGguYL*rmAlZjvuE^t`rHv4b;uNfdX*K)@-1r&_!!71tpo5dn zFr*}72sYj@rvq(dZ9RxW5>{g%Z-0x^E<8M@kCE@3Btg#=#V-8m#N;rJA2!1>k4x;w z^bv-j&(!%4X}Okv*VN=XvV zCF#pEAjU?2bth1gBOZ@ioD&n4+=1K-l*$6HGl3hgq&(dKBC%Rhs(izOMC!E zIW)joNcHMW@QnkGNg8tf5(JZ_v@^-WTP@KoSRV){%Sbvwzj46M!9)^A2VH>SVPc~m zb!)`FZNQT}Ka{cY!94?1mFGdr9JD%c!PnB%&6yaZ+`m!;ywu+e5!X=*uO_nQ265_AT8jT);&+LWOt z(2AwjiS#on{W@XrI@IiduWKb!DnJs=9H3F z)#IX#VNi}cd1v;D3M^7_gqkftMMQUp*6)Yj<7X1j6x>o4u6r86i#}f9~eS3j!ml&6U1CR5d&hr zZw3y%wK4Rn-}S`cA{m~gJ=*cNy;5)#Y#8VVj@$x?tkfg1j031U8!NOQ+b!4b!o?F= zQrp@(QZmOl=;*t~&Tg?m2OX}qu>v`7>9UMHjGm%A51r;w9etJFT@mvAnqV-@_PSfL zS)CWIdd3dnx0$msMI~PVVx_RtFd6mVNCT&?TDRIyX7l^sh-cFAA)r5knwdZhyQ_5DG59!WHHY z%5vTjNhb-*uv@eCKE!u2P4_0IiO8AfT-O0cf$kV$!LhrHe8JHBVoiq0-?J;(nIxNVvBs6o9@Z#!S0>A8lQLM~d~PL#-{~|g;k|+w}DNSb^V!kJd zRETv_zYB#S_R@5)r85x&X<~&(*|vv(BNvbr1)J-GP&~Qt!~k0+?Ew=agATmPC9wfY zI@j>>7;Se|5%^mR^{6SPMNfFDlpod@_z|=40ZFh|Q2|;+! zrJls*VbrY7FPYUgv>JPA4w)^`5fM9LwothenToRg=ukt|T>bJIC5KQ{&2%(J-mRW1#|(020OepvHhy@%@TXcE+a?Bi8rYU%}&_GP=(Tycc5h)5wNAkkNE&+QViXVr;5Kt)q>y=8)4o0ZgY{bVTh>(Bh|=3UjNxA4rm9oks|EqN|gA$+!=0l=j1#C9*mr>kADl3UVCu~Z&luc z{CF3EzKQt9Q07brTOTSl+Nc%jpk@#;VD(|JdztB4=xjxuB z34=U=>AL|5Inu9pY)-;Aqqu+==?eUJq{Nx~E!>V*j9JCIQ=$@uzqh>4xZcYdK96Cf zUI(&Hy@S)*{x8|6#@c(^xg;bjm|vtB)6?jc%yflw+3XwSoApk&90=-~{?!Haot)ItRFURfeibD4wBS+ga#G6YyM_b1do}KbabVV-4O890kq7|CvB=q=5Zsl@! zb@jua;Lz7AFG)%Z#H!*qa*4!CnEo3Bc+(p0LzH?B-{mDdV`h`^qUd<4FlpW1+86kOMhO zEosFK&vgC=Y45C-*>yxpVE`0yvz zo^!1|uNf^%0c9tmQIId7&v|^R>OyFj+&zBE#K&LV2hb4Jd?fuKA01E3)cNI@t!Y$G z&Xpl^W?Vq;$x+ZqY4IRqUe9V4Yb`^zkf6d{koDcOME}S9n}&K?iF$Xcz!$=qQHi*4 zAE85mrh*W?fs6XoM1_=V^+PH+i>BptP>Wj(!Uk>%;GmrEQ;SqvELUoc5WIN;=fcZK z;ot6+7_MLuV^Ob>4T;Qkn-#KC1+VNX?WwF~(xi-o!ISQ;*8j})(^b?}9bK%+feuAh zmf9S)>93taL^#7fTtpe&P~#YDXaFU4xg2 z3Vn*}HMh9J?5t#&at?I=ZxI~&%2t#3fDBh4;5FnosIOqK!q2HfAVdngACFgC zzq&y}lXKIz2Ak*5BE}y=!^5~3N@YhDsR()m4-uHu6!H)aL)ruVBRz{qLPwlS4VZWD zOSwvZwKEa4Kc9}fb0ZrDKD|WFw@?yzs|WOil8A>X<`%z{6*2+n)~fRz5ctd8VRlvK z!^r{PglzPH}a4=w_o1l*s8u`ROJDyHJvDy8!Yuxa1Bo5}`PuEM#kxq^-9wz&CU~T9T%vqeVj)2$ zv807ci@&gJ0OCv+sSekU2N8cILK{3MP2qIB!J6+?qL9Qk`ZuZ}&d4J9sZbe!m@s-H zrzJlzJmQ>^1SZIliQH}cek&_@QH|Jb`8sF6wx@>g<4ss>%q+HarEh04;$(Cd9}_oH zuR}kH9J_hw^c8b){bu0xmT~*}b?1s)dax~&zt^^KwlQm85Z;NxCuD`OD!fPY8OO9& z@)6#iMY{;7<`J!wg5#;jVEf#Ol2djN#JXTbp3giYEw^Q%JXd9&*?Q3RNA!k-26B<> zWqvCjE4>jBc+OHsMn-WedqZ6FD?=aKSmah&Lu407@pR!(p6bCY^&Jn5;#i8UC5zOn ztY)1dc5W!kt=!VN_&(J=)mT6%v^6YPfeLhPT&mZ~a$6gVI zNUm|t9}wqnx`y^JA&Zm^lQ;Ea7*cQi?-+|R0)HSA*F?8%;kZHH2^xW~J9+o;&!3M$ zXCo;o@K;o3tE4A`d2C=zp19^{MC>9!;EEB(%xe* z+(nhVQQ#8Q++)pudOC}J!VVi9QY6jd!zE-Mr6HFo`9gxbt%n@*N zdH|kS=>FhpB~m)d)bQ4g3NbR;^@+n-r$2Z}+&U<1|T{Cj1$(?F&}75*9!lRyYrPL_5h+j zm4MlM6JQRP8b2*+*g#g*`2)=QBZr&I zf4sVP4s*8-bKfUi3tCvah_eripg%%TZBZ*;8e3t4=CPz~WZzc5XE zDd^<-U+qxX|H+RkcelAAyb8h@>Qh!5`@^c&9Yn8mF*6{&9b;Bcdzv}$-l&1)9L10H z7|zdmxPl!Cu^NuZu^>L-sj{fPYvfr=VcQnl^RY4~rzfvnmod;C)APWrwrWhKJFx@8 zUo8jK)Oui3*c(L}pq2Tn^sg1=gd56nmgKqT`K<6ChW{mR<-ff@?`jvn?zi_>`S$+e z|4H5|nL4<9L#a)aU5v~e?Og1YEj<5|^-taXCuK6)oAzBj)N&LiTSF{_%vKyi7pMiR zLPn>feW4~mmgwE?H5|)|dPUWm@zLZyV_Bx)aeTqMqp9VNXwZ7c!Oi)i(TgXw2ScMX zw8ril{RSIwZF?&Zx_FdgRM&jSEm&jjJF`g7;ho#unlqKN04Hp{(j@B_yD!D;H@n8- zyy^TH;*-Y!wz;{LgSBa*upk$*xZ$yQ9FpHLyq#EYIxpe3LxroH~7FAQ>Hz~gB@vfO3l+^7mu$+IIqGf%$hL?^H!-?(Y968tQkwB#BOO~ ziUpC>UYe`vX|kp|xJ?$8DO`&@Sgl@ya#c`g)^)=~E{IdBt#5|zQS4>pv2Yss~X#vDn7!0fq z17&yj#-$DSt#{c5(ju33%K$7@B3c-uo-;`6RGN%KvrKkp59$GwrNmx?x!%ex9KA(b zWMO1t=nIp~>d0BXI(ZrEXo}IaKlKv`VEHwOTunVN~$xLh4or?ER-NJ~_ zg!lZD>&02gyk^~C5JBUhv6!2=Tr!bbDhrlvtLt_7P}Eg;rqsH)pB8ZFiKxx^Ia$`Z z>{a8V6$0KPuu+8-Vn2TTasbWJ$k8cc_<=aD_{z~cZ6O@Uf+w=@5K{Gid~>86<&s-j zsD`+S{Vfr<9Ee}xml-s!n23xGP^aWMR6y_(irA6%M#68hxsTxM;vNb%)?5XYc@f$I z_Wr+tQLm~8X$6sI@ZR#EyCf;%#ZNGF#S#~)4TTF*iGZZk_yVKo%bs)@Lm2Tm;%5)c zSC@?MyZn0t5hb~}Z<0~d`=&xPajfJi7qTa{K9S?X%ZqW3)am3l48u9@W!sIsri0T zsh2+RhHVx+gijHs{6(S1FMP2Q!5@Qn5qXXM*+o+E;2!Yq+wgv>{{`%v@F(~5-(zwA zOfX46wdWKB5D*#~5YUhRUlZ(q`17>Q@6m|$92juT1#w-MnvAtH zil&-7Q-WdYqoyUZFQF_WEm6TGseZbR?TkYMlL%>?*@G*!-PxE8Q*)$Lm580G9rH^< zQZp~%<`_*^Zp0~SvLkhJDCNUZBaKWrwp@B+_@WUM&RdDOVp0>Vo-!yixD*>DaulyA zc`2zsAtT$8(!xV-oVt7rAepw%Ky*P;S&5ZcU`{=-@pkYOZ-N+F>QsSd5esD(Xw`4f zlFdfFxzztd6UVEe5eF;Tn+T~wA>2$>>L`AQ7!H9;VLhgrs7!dV?Sd^Mcz??i49An+ z@VE1Nvi{@~CpS5RWP5VI0i{9(cZP+>c7BW~&3F4UE13u9SYJvCGAC}hic}XtxrtB6 zfUYKAK$etrMY32<@G|lgVYIaL@7OjXGPSZ|IC=VNvh<1&2R)>n!xYh3MV^dGR3$Mf z$`Obl>3~zG0HZr2dzLyD;Q~y0wnLRWKe@y6zb0)1p{W=se4}zE;N+@q^ zW6OB)-k4wX0aPk?wi*4S@IgJ_@dYAT&FjN8kTtzQ4pE*ErQpsIx0RlyhE+vus(|?o zsh=RDj{_x2CzJfc`BIJEp)gZm%-iyd^Z_CqMRc_D_FlRd!CrYx7|<1MhwSZixQKDd z-2<-LYuE}CYech$YF~&^))Ux02-Rm{52ts8NdV!^p%-3(5sd%&j{R(9jvREj)LX66yM_>#HYPSwKEQ_QV<8r zWiZna;?9N5V3nMoIv`9L`4hTd_O`{Y$RiTKe`LS~;E(w0&RAP2F{b?L#td6_7w~3k zu@P3)b`&VfmPLqGH0#)8jEtMr?K%Ie zDU3ql!yX5mAJypnl6q+{+L$J$#b2z=pYO8_EYzk7Vs7x!DxZ)g;b{tn?U-=}q!zng z-Q|#yVu89}XGOtsola-PiUCK|ko9~NusO#mSrxQ7hejK2i%b}YQju{f+m3|l7xDyi*TSE50Hf3zpMFh^|EIy5Tw!P$fc1PbkwS0h;O4h5R8cD zHJ|C34T~klk!9IqXw&&d#mdlh*Zna+WurZ(RDIJSEXJZUfCs|ijn8I2ZFNu{mU<+e zfX^u*%U-cct~<=J;ZapF7l4WEHHXEgTFVaBqj4E8t^gm0=df%kSjAL3rS;<#y0g}O z%9+I4OdJ}#mqvnPF?)%`65zHFd{k_OUezawP`M~6z*+8_b>3Qz;3n$YM$@sVigpii5|Xi+QMhwpToCScJ_DD`t+E$f2XzkwI3k@J;s=NI^LBAVarjr}L6b1DDkOj9%q_dlxsOYyv&g9n&70>X{_ zBzMbc_9WM7wtf8TZB@P(s4YMV4pt+YILI0f!(KXkQ}K}ygQOmfWDt+&UWgX9o_MIT zt`_>v_SWt%^23E8+Q6E^T+X;zDhmyc_Ii6r%<_{L%*cJJt|U$#Z#m`}=cE401G3)2F4^Gt{T@#{_ktsq8K^e150*9(HD7n~O!F;OBv= z$4#nw9B+~8+sDrko9yPtLOaw+6&#O+HZgXnt}DDsy}ZqG@YUcciMLnXZP-J=9u$ zj}ZGQ6}o%ZM3us)HAh44#FxeV-UaA7=64Ep67Xs^qw3HQ%xvgrlZa5mM=jhRSX)vU zGQo6X>k31Lci2Kbs0@udUA713VA~q~z~)Cf5GLXuNDYk(!5j?^Wzt#ftE(}%uijU3 z|Lduyaz>sO6T5k=+A-FlsmQqTT)Ko4vh`=mGWGkkdz0KXpnH6#r=BETxPGzd>xGbB z^U=6!y^$X%g6BDIy_`{yIGrJ_nw6hoc8W@^jQ9rt1e1&ELQ)g;$oVdzS7@hMewu%$ zV`+U!l{|XNm`ijU{*!x7o|(KxKVfwhld$GjOQt#W4@(AvaE(BZbu)SrA(ea6 zln65goB%|NPcaY%62jD#fE=`Y#(>~wVzJ_sj@T}+_xL$v>`rCjLkBke=&*x*^4A-x zS_0B9_5mXgyj|TWHJF9y_ z%H*ZECx0Qw;|MshD$PFzDh|@#v(UTBKG6n6H}lZ?%P*?&BgKB?%B(Qjq)%uCB*DEl zw}0P){f1urL~|Mb=q{Xe2s0qT=-Gfrvx4~9AiiqR7&IZjYJ2sqIy7=IKI?+szWjyg z5gg2_@z06r6W9RC)h`Z|`v8~y0Eb6Wu&O@ApfK;pj>#TnTpVhzf;WRXqnmo48N7#> zlRX`7C&~5;+#^|M91UiuxY$iya$}?z_26Z=LFh)A+uS8A{0sEI))D_S+5iZl1Y*C% z{Ngv`g5f`l`Tshi{-xbh)ZWxl-H`G^;^7^@m;CnvR*FIuBGhYYB14gc2%%Y}h3+Wn z$H{3)JDuHvj1ax%C$+4a)BgVOv)Hw|reYHKNWqmp7mg)Mu6|wly}_Q)Ll-- zw7}o5FASjUfKlG!?OPBN_xSBOC@c>9cpEV)@kvc$m;^532a$Ub7!ehGR*t4VkZr%H z@M{QAnZ!sD^oT9eF>O-1gasS?9r7>wt1j^cJPw_pmk944UIdAc$cO|^d$^Q88yjW< zkQ7xl5s%3RmhX5ng|=qQovrg;N+yGO?z^#8C`Am1thmrvcGcLg7smA4GpsX}{cA7iF zivW%!QvNeNp&ruq6)|Wd| z9)&paK*oycxJX)%Yrh>;sN63bh@4PI?Ue>xR!^_n9Pnlh32aC56z#eB$=a9#>u>|V z6xfkO!wGOd+*$Oah!XI~0t>|n3??vjMaAjGveIc6=lbBCj9Eeu9wN_bw7`>G;lMJH?5@!A((RsoBwD za5eU|M%?VDSdkWg_hKd3+NLJL5`YtQCuYKO%$ZAm9x}|>Qj|sG`IeMInq?kQoEC>D zSOnKb&BoF3Z*uAhPq~D4QAHhzlN#G0iu}rPX=$zb--cL6lu2Bi=3(~5&Y%IAqGV-K zKNUx_5!Q8k>q5#d%0^MwcjATkdUmfZ3BY4~UZNGJ;!7FGWXTx%r0uhVa%HnH_E29{ z{7LLp{Ac%^faM0`fevpwfQS>Ii6teV8KKjgQMKs^9Zz9_uLsgVaD$3?w@~+J+8F%P zXrGbpkl!+89ups_yG8_Cw|NZ8Sy*XOi{WkjZ*reKPC2Nx@w9Z;>z+P4!qnZ}~ zSj|KTr?l}-5$`N5_Ibg87mMH zx~pIfB%s9M=>NSZ#+1ueGZ~!$W1&|- zt*ao^S-{pKTG1Mao+H$#YEj!dIa*7VgwlX;Hb|0i1xJe|p<8DT0Z%yI7gQ*mI_#>t zNL3AdSgT|<*&wg%!VbWN{L?X0^8t12Iyg}G(|0}&d>LGq!(w!^8?CbRt@>bj+ zMqRag^e^yH8y3P)(^SLPmJAn_xhF;3`7!S}lrRre&o z4Xbc3Fv=l|J?0z!mRu^`BmhRXt@czH$@&0+*{!p(||Nd6r*58|Uj{o$u z{nG2S$t zPTDY21J|E9un>8lg8by}RD9d(@Yh$BYESAn3;7#t~63MW=m^(IWg}u>g8o$NGt3I(q)S19l9z zwzf$Qzp>%&J-_S0D}s=E^pQ~%twpD^x5t4At)G@ZO^f(y6?X-k{rTcflrSLa>P z_?kPCc9q!EGg<-K&DPBZrcbiQmcFh!Lgqrts$NP$>PEKO>#9l}mc^wn*6df-w#-i6 z2C6~^BWniEE7_He;AKrSQvg$4lF1CNqI~nJ$cp>Fy2gDwN^~H#Koaqd9Wzr{vh}oL z&-Kc;oxc;~k?1fxYUbX+Fki^1iPFbRxwh*X>J6ErW)dAyuwkV#nyQ0yMP@jdrQ;+T zi_>|~6xb=76qTh>-qY~5)ugRen^mN2C7DuC8Z)>`E+8nZPMeyw^LON_RE;hB=UMgO zjR1A&EmZr>Lw!zUJ9;LrTE=9hn^+|VILEoc3Cf1Z5>-z_swNMS!$~r53ZgTsW$J0F z^3%vGxu%UumI2DiGY7r$kN1ct&7~3ovnswqjnUU+qoPqlI$MR> zWZk5swY^d&Hmfw)p_vcLJNVc;ey(~w0PJ`&N?ie}Dn84j$JZB>m?aIyjoP8@PTQ>6 zj(UHhUtLgoEv-ykI<>w^Dav;6I>p^G#_k)yRegfC%c6cwPS7dsu;&EI7Wnw?V12`y zlmPt9igR0UMK}fc(Z|b$wQI4G#ry&=T`2qxnfUIpJ6WW@^<8Zl(G!p#0|`VVU9N_d z%qvXjVuB+O^pmF`hr~ohs3#^m1EtZ#Ehgn_sr7?wF;OTO+!zoOI^M*GsyYcwfyr>F z&UWf@(|O#lYxk1h-OCyM>(YZm4wF*h@v7lKTu?97{`a1JI@RO)n@dJC)b zHClvLn)lNrj55TEU<~(%_!Tivj2T$ictIferWR62NCH96a0nZM7{sv!f7?W+{XYoP zulNj!E1K&u_&Q+0D`CC^2k8v$=?~#Z)N{#~DcIOvp3lg)AYVT&jDg*eW4x^ZbrBmM zrXU9!G;Oq9OYdmI1uszCLRMA{Zk+hxkcS2CYmi^!2Tw`gcd{v4%mip2|M^GCAcGt6n$ZnvfdJCf#syV)hIB~le2-*I(Ho=Al~fT zW5^uLw@89^mkez6z#M7=lp|Z2(F+qk3BO5#5s3~mi?BtMGtI;d{V3P>~=)m9$Zcwycf%PZbLac7@`3k0u^nhMLa((~;5k*+|MPD=T zdx#Vo$0DBi9`B*~pG5kE(YpfqI3XEYb$8EsvgAUscgull@2As;bbVKkC}>g>?`5i zLp@tsW97R-8ATl=!E&HyVrNc4qTpIfz(O`_$oMUxHpGQ6u()2ae&@lIB2(;S+=x~0 zBGpvpX-}OXUAzzhdzO$riK~qvIU_Uu^F)k(#)N#7nPpwGFywNEy3#23B%gshK`(Ws zxUJIs4wg;1Wt)p7{je`>3Ei|fTTR8ILrXLMiOZrOnx%75OOX16RJXv4{fs3I?eU|& zsWk22h-R|H(Yr=VFJZ~uR#Ybu-Bg#AOqofh#GrVoFf|>UKPVvq9m8e4FJ=o2vOn7(|5`tz<3DF1Wi-469%SesEQRmL(qA(CS%`w>qlWFcO zyj#gW=Fji}+GK^`0QgC5L?hIE&JJnpNXw<0vOtTCX zs-Ukqhr%kSuJpJx-?8?g*|77nr>-ZbQcHHCce2(k&R12dD)m-eR3CA!>7X_W=Uj{W z%v6-A_{p-r4PTWO#}{FWE~`k`iRPl%Ga<;!T|aFSa``(-2|4Dv4-k?WX3*q|lpOlBve#;SM=! zVKvn+tOo^o1%N_BOG%{8P{pf=^`H~z%#q@fZzk3PCQv=~$GO$^rm<@qgKq2O-@n1&ShsRR|;lM#H8{(jZbKR|HN84jo@} z1x6hdfW77a6!kZ@4-P{FYXiRk(c5{o*Y;;>@C-cV6+9q~P$rd2dZqb{34;f|{*jX! zYuwe97^HFD84fCvEcV_Fw%P@^T}pTjkF|>f*bBPrr!JvXB{eyw5)PtCXe^suAagi zh>-X}mU%`Xu_&gz)YRWqWch%oP-{z3cg)`N&|4=)D4!)q&hw(krbnjII2ND4Gm3Qn z@kgpsd2LUE*YcAB(3t~em^|@w*`HzZp?1v7y;w zg12JqPo-c?2cf#5M-i3_F6OvjFZw!Po1i*>v`k$!uX0R>(2=~3L!vT{D;mZ8G^DKtFE!u3a-3c#P)qC5ynL1;a!&jDj2CszT~OmnC0aAT5g{uno%* z&O_MGU)u-E^9D3GdYtgC4c(72 z2EK4mcAycP!k&E~MOs0HjFBuZjVsIb#J~)nNoIb4;j3&>Zab=|G7J_WKUs;pV_x{C zET1EfUUdQ^wxaUzKO zH7n(R#hN~U496P?5hDEJjV7WbYq9_(10S`Oi780$kbO5mBMA?rWm@x*(#ds}zpC(kLKu3c{rKKfm@~!4+ngUMQbaZ>M zI#2IXbEClS>Y_z$^B4cBn~ay8^2tc3Emk&8$_9w=OQA)UcZ4COwr>H!d8Q5bhEx&` z&DVA9KE2E`W^z}f@tlz9B0IJ3VaC4g*(~k74mFRCI(Zs5orBYN&*+0AbZo{CI6B zv9$9zCQe7Eygz7IKJuhBqm1=CI|q)~^rK9qwXoY$Xg|E$dJA5y(_;PEGV=I)V`*!) z)^ICr0?ha4rO@U{#}t^Ecn4=(e4?%)^WydE@UR1hnY86cDF2#Fpwh3 zM&;!6s$x>c{P5etu#O|;@xvaA2QQ~h5pHjLy=aXkwC3-O zP7QIg^-iPW`;<=KoW)D`HS3+1wncNM zA&d*PIr(JW4Yi2McC(8uH!A7gu9#2Eo;3&4U5>qykk(~~#arCnnkX&uss-xI!Z7gx zXfx3bqcs)95cI*+$X`qqMnG&#TM7=)X{yotIDp-Qh{&>6Ik?@b^nN@5mrT_wumJN^ zk3LuvDuWE(;3*G?NgM9M9~FXC^SN=M3+AnB1+*NS<%Puo&xA~h&$(m@7#kq&0Osdm z*>V$gQHSb}%>sK5pFs<2Do zVhh~jGGa96`ECvlzCYNPfR1X8@Geq$jM}+$v_{$>#5EVV`G>u`&9+D@|0d=(Ih{Z! z);%5JYz>Q&Ey{~X6K1>oY%*N&L|KUeCXwRuzffLdEOH_PnSI6CC07!Zg4?9$oZHIn z^E?)0c(QI~#zc=C^OLrc@1x-ntJ;qh=sr@^aS|8g|NMVK*HpCFCa==g5)y;cZ1@NX z>KW&3N1KNh++$%zCMA2(mR4xJt;(i6!df3fW%v(mkaUblsztP0Q%4jeA|y>e>Cyd_eYzE1^OmA z6;xSVJZD-Sq)ishI<;D2vA56z@e{R`@r{>A`v>b-4*G9;smt-kp$hhzd1E7xlUqWt ztwrE;5WPMlpxpRxY6#F0$>Ue-skCMmYN&7IC(C$8aM=A9mzaskBS!Ss2RzB$zkR~| zXDS6Gi@rQT0|7l@0RhqdKc7nfvNtvA|D71}HPS$)oiXHU#8ZFBX`58qkS$_DB%8%L z?0_rYLc)`3a~_N`a=)fV8-r_+ykbgK0I$%}fJSLbr(HldN4kUzPnWDDr7g8SDYstm zd4v%Ly7h5v!J8-^;e)^}Zg<`Fa_#o=vBUe3Cr$uahx+$+f7;i2(1Kv+APlnXkAl4y zK+)~?0tBRlDi{RxDHu_#v0KYFt zhVS=a+UpzO*gL(V(RbwF%(1)4q_JX1OW_aNJ%u-uzeg}i?X@a$*j69-+F?6QpdRnAK z1Tr1oi5r)ut=zEWdP|RrCv$S!+mH#dGj&$_O7z^Av$GUV98OYDW(A@-^fv3$*cg6; zC=P-A1=fL*Cz{HzQfNg2?fsALDkYd&+$rpzycKanEDnj>`6bQ8w&!OEgAy5;Sn^n4 zEozLrC<~Y43Zz*Qb(vuMF(obw!h+&di)jY^nLi|NJXr3upO%6_V=D03#ubI*9q9{r_7Y-05p%X2oNQzZd zNYo-uATH#qL;Gnb(_n+}NEuz)CIUW5D-V?;F%SAKqZK!Q?J$8z!wWr~4mUlUv}ejhA9H@l=`b%vp)6TbSps^bZ3=Vn zni3>-Egq)PuPiSw2{;>6TTSJG#dPBo!YKhDaI`* zKwv0N<#L3cz_E)^n)K|EhDqw`5gZ7F`T-ZNdwx} zH|M)IfpnF^ruHaBuErn&Mz?x-HtT1^-ViB?Wwo)P9_yy6QpM3i?chCJB~-$(Q(@CD1gSt$on3)(Y+cp)BS z=a`vKMm4h32uuB3T|&WN0%uiJsrg5-ZD{*nb}(E>rN3*?Ihom~W0T`g#Thxc)ZLqZ zR36vuBh)T)# zEtFDsLI*knw0#nZ&VTrEGB2^YXZIq5`F$my!{K(~dRcgXfZZx06*?!7Ns73Tp7KhZ zU$#vw4S{X1z6NT`WrjL{`>b0R+2vnRij#0Cy@y-xz6<@Djs%UeHe8 znK(Oxt=)A5HZ_Z&9eiSaKZAbki_*I!sZ0@>W8d;u2M#>%^FLfj1eP8aPG4cWooZ3=x}3!yQS$r$TF{aOOsbSgI&fV4y4 z$H)>>j42Y*32NR&S0@Rc!$4l&rcrE-bYl*?#iv$!Cl4spxVj=1AlyR##4k-hUbIVBj6$sdkK(hlC%cIPdEu%ZFJhu zY-jfgtaM+vMeZ4IS|mO7oo7K zj7;yAR59~4(xvsqsTioHq^DUjb8C#^OR#=fFQm+}v2adXVf3(xEZaC=c~Kj&fNQ zwVvl}N-&yif;f(^iJaV!!|yeLyaY4k5SV+t(biu>AL`|qV1Jm*mOD`T4RX|0j((L9 zTx>!a((OkHj~Nc1r9*MRT|~L#J~+Ac%G%In_1;M!)QcEJ)Bcq_w+!$IC}p6<%IHZz zZ-KImIO!AR3Tw8dyBZEeHw2H-7Qwg7+fq*pqsGvfw$)$&G&S*}`_uvOxStBSkkBvK zL?hc>veWRMS2v$mr9U)>c`u2ewNHY{0NVr{K{;+}R|`)-Ll?nU^hB!g4_(*VB!*$H+@G>uu;zhLczfaBCwY5IW6eq`^0TwBO# zk7Kghg88^Q)FD1q^>kx!Dti>oU1o!f7 z(rzBF38l=wap{89@NUJ58eiCcN%&6_AGg$aS4ISG%i{u_`Gtr388UZVX}%f4FV47B zgLe0p8JxO^sUwt!1n-{w73A*FWPN$24H0Z>viZ)j=q^{Qxj^k(&)e~Ph=6;sjN5E{;D9jZK9O?Z1&d))vkdrcTllO8>>=mZ;jOQ14E*FUa|=3p7606mpL4S23o9h}1pcCYnlX{bHj2j|QBc2gj|A{aUKk0Huc)**Je1 zAULs=mXNHLwiD6v;TIUOk8m3UTR&Yt9yC70Y;RO;=?R7@c*Jz}cK zIaGa1^Nf-_$M&&pVP;A$6YPd5;=#V3>(A4LYfOAexZ8X53^4j_jV)KNTO4>`?|grDHjXlLf3C*GrcKhwKdYopU!eRK*RLk@(| z@@gAra_{QPj!|yb9z>bi#k|CYKqQJuY*S3T=azf4XWmTJRq6&y*zN|@-4xh~#bYyW zq!}MQ%&=0WVlSdTQR6T~Mh?I`8huU}wTn$_Z0U2mJ#n>DHiI6F;?n5!1L<|~nm%NR z12I*N1Uvu4xGtK`x<#r6A6H}pSjoYoU>Zy(Y1ec@6Zc;p`e=@o)93Gbkxy=5rN+9wFK~_v&IYW`1j=o z1SUIT7E6B}0t|E8)m+Oe=|KsM#Xv4`+Txf%CB04hhJXhjQ;dXVA9|^bPrC`7;W%)* z)KxHQDHpWOH^4*X8AcPh9cVtR4f%v^c3(;IbBDt5x{$D&CDdwzY*Vc)PkcWP*h|ek zBn^*r`h5nZbbGdyPRnLZ;NV(M|JGK6yu;~Jv`48e1vgFn5KdYm4-J#=(<>PFjG2>O zVBP1#E^i^{*p6Ht=tc{3!%pOXjJmTwZp<*5uhID6)>&W~axgHJ+JTi{D1mP%xGj*j1=2f!7%KP;NSg2nDC2M|(6=vM_3D-DXF zVHGvt#Lt^Rf~OV*lsv=idv4ZaYtz-4E`=Qm%8Zz&dQC^5ipUlG)iD!LG~UHs^D8`% zh8O$`jfiOO89qMZKi#_oEcXo^Ewni2{f4Z=l`%kMtI^Mb`LiT*Xoe|5ulYzh`OM+3 zs#rB;{-GqNOp`fUFfjY$ry_g!$GR@3z1KKQ0>?8ArZd%xJ6|(TKkT&WsPU> zo74EV%@2AP<6O#Vh~J5VCBe|$HTZ2sp;~PqG9!{xY>Yj3=p)H7tjC~-z{6?ou7!Wl zIQ)cPOYT46g(%*-^A%WLWu~K+b{AO05a*da=kNc`Q2#R!a}V)xM7~#i{y0EDy#JpE z;{V74ee*iBhXH)E8`f_g($1sd8<#9Wn>cZIZeAfipyko$SYjdExcHAGdU9(Tafw`{DUlD)3E7I|fj*4?~K*V@) zyo1Kzx43XWZAtpPrK0Db9`>>J6~M^bKWMb|MxfAj_uu6^6(ixFtqE&;0_W%nXSh2| zYk!5oKy5q%Ezmw(Y39)m!P=xS{){b-9b$h+*wEhT&EouSpR$AMaNw$z{$?lQAwUkAt)j^_kOg=Sxa8okJDXv??)U6S$W?w8`35G zT@nc|FFR(wCnFjsZ*@N1)+!s?DLyVtFlfR4?bzO4K*9cx7m2nij{nBlJ8);ha9P@w z3M#1Bw(W|oJGO1xwr%^4Rk3Z`c2cofU!I}T zh%#0S^G4_S7z!sXyM$Rz*W2S}VV7|;MNwBiMxnF?Ciz+NLx11c^RQM%50{!Q@-r0- ziZ&`G1sZ zJVa%kNs&gQQo_lQzqB_7{*(EOj4lOsB%@`3ov1=v3gKs9vB};oXj`A6gH877NtK6# zg8yWFc*3bTJpBY>IIzzTdQZ)kC_zWu^uC2&`0B`+jnwwbJ4-qALhO{H!X7nJZ1X=$ zgE<{$?n9TZbmYa%HoKeSlt33{WKWecz7LOYU@LwaXrR1RXXnI@nlEgv=||S;%~A>% zUvGbqpv5MZY3HW?c7A3#ZFFe$!Ml%{6X4Mis_|=R; zd9J)0g_gcqGZ_vGz$(|fIxMN?={_AJz9&PPq@lR>d{zA^4qcfy2Pwh;WN3S6O~T6; zCqrSu@}vNg0=>pR1`3%BnmGP&_NY7b3-OX^*!Fhe=Z4N zCAC9o&@n>P_7k$9ZrS(fpmv?5bQa2k)$+VIGt!8iculPl(5w_o1k==w)jAl<%_7cs znS(>u>|pD?RA>MAIrUw0Slg#6PnP0)yqQ|e5dR^#bcbbhpvfwBs6v8R@=xP#ZXiyM zUfk?>neJ9sMoUG|%PZ1vlp_4$hD*T=Nu40Cr(5;yqq?}?g0QZn4khK(@mwm|Ie7vr z97xcv4>QW`HU!zy&wH~@1MCUn^Y)S{tRi1}0Wb}Qe9$~=$Tq zp=p@b$O5?eixh783Tn~cc*`8X+k*oV?bhcdOLCxqRi160<>{Rn7mk@hc;R#x85)TE zRf2P9C6`Dil*^K0(yoUG^ju=LMQXG2xO!4{feGf8baAGI9(~qzVWfujK}3jrEIvY& z4cG{4v&W32?OUmKuPAhWfSiOvQ7Z4=u+GM@9=4&_Bl&Gi*7u_2gMn<&VU}_8)8DK<{)#hkXtNjJRTxN z`HfBig%eYd(aN&itMW6E1r#CKw3W8om%KX;*(naTTLPhxJ>S)XkGgUlma-%QZQYdS7jMMhY~#nX*UqWOX(zV5gU~fJ(Xtn*%6GY zQDjLqV+RA8n{~7BZ5!xfx~n`mcEw1#NGJ1=$?{OP7`4w1F4&R9h>gMsa|d2=m3{XL z=>=+p)iLX|Ma}e0X_F84`p$zW&-1}gtCis;owb^+@A3?NEup{NY7@LWw&`jJ3F zLeV<}ZR5?jL7fW8E>tn3;%34Ud7=@4s7w2cISSlBx)#j9l5x*6HSAZQCdnS%@8f%} zOm*4u#lQYC4sOTAb_)zmqd3-jBQ8!wY*Vewa4fuXQ+ZEFE@UG$zOqy+Xvh?P1T}>ALhH;pG+UxIm@gwr1I*tqh+~9F zR_7O}(}?$+A6j?MK~`ErZ5h;3A*&hVRVr-wjajryY}qC!bWGl#)`m?EN_>HnqEI)t z#!m|z+KXHgYTe9Y?=ZD^Oo$IRknjqP+m%^x_S~VmyqzxGhcSPZt+_y0>#P%1a|F87 zXfI%Q!pVE46s`d_1n?#3#w=)E^kA#|H9TyJr;DN+GMi`I+X5f)e38JzBx0PXJH6?* ze(-8+(a-SmqZ3r~2}ANTKd{gF{*b=L4RR${*Oq=TFZ~PtA5Sh{(Nr}|j=$!~Uvi!2 zORjVN7u%_wzJsH&ptFgIv4ga+wXK7@pt+6FKY8GPQR&$#rwZ#TD4%pGwCjinW?5wU zbduth69xR@--BlY43XMRD1kPKbV@6Ih-Uf?Gq=JY^HVINQhoPg_<8V)k6P*&`x%2~ zL&tcVj?=EwbbmjlbA3V5LJ)@?4-7{3$A5Xq?--GW;8hNVR}MmG#?VNf>P^Lac zyhU7;N^VWXSk#n;7~|8Kn~<7bsyY6Qcb{C?01weD>#KIi8v&Y(N`~6l`PdW<5ExZP z0G3f%6ty3stQWVGnw-~8Y1NEH=qa0qwgaVmy^A@(v_SRZ9DrqOnA-L@$&dJrrh9gJ zKZGi+(yIl@5KIb+tA6e(@eb3XB?AUkaNA-IF$Il{b6aqPn38SF(hG;57Ucf$D6BM# zvldxG^v{Htwq@j}u!s@=T|(7lR8nn3m!5Y(RjrreTstoOB%*$hc3+%##zXiGuv795 z)hA(~ra@Ec@&$_$>M7 z_Di>&-&n8xkGY@qW$($Lni7qMBgr+GmeZSGU8Yb4x=z+Le-fN(lUepTs*M*A3+{}0 z%&f-1lwB%Im8AzCtN^PurvA$d$Lll|72wADmzCew<#5OA$2&&$L~=Ekp7k)f;avjQ z^TO~+-ou88nn>P*Jdtb!cMp)E*yG|Df+V2UDI`nzlWPO1e7y%br2D{(pbRlmYhg0J z&#T@T^StRL4k*_n4Te+5TR|GMFdY z{D+rwm4wibWHUk&x#F!CW70bXO<1Q5IWbDoF9SJT0ehXwZD^m)5_z&o*3lN`-@mL8Fvo5h*e|C zC*$kl{^(9e>azA%U64lDXxzD?Hludci8>A0*Cr)%tZavB}-5JNe{z7 z1BK8>gd1WEJqS>rBlGVGijxZgGt0kba)%N!*$Psp=(SOjuTZ%tXi`3>qpSLDmKIQ@ zxoKDNPi5xjxy@!H-J;`VJF`2pJ2GUhOxK3zmiN>9ah7M(+f=995#l#$6p_J9ZnbbO zrHxa67+1HvooeWU%cEiTyKA(63~nCojq!eO?vCit=DTY+llI(D*V}74_^s%tQaAc; z&)gq69l2%j49*jQ@Owh<&-!@0ef^-^+#?EnW43%l{q{cGz5NpKGQ0ay-T`I$K$-fq zs2}jVKWnlNcN6jcm>8pSPb?7se5Hivjh<$BP)E((f4Q6Z1P6AV^jbe7!RsFFW<}JL zK9_%Yb!@Ad7N?jA0Gg9%6nHS1lbG|MbeMRXR(vUOerpSOo0A=KS4UOL^Vce9s*FI~ za}CaR&ZgNtG#^OBIx+)Mg=lCCZ|jSr~%MPAQ@)i7!rHRYvP-B8&anv@if_cr5OROn)4=9NX%`-qmZLp z1?2Z>@k~h4Kup=wGVu+PTFihKIsR!{2+p}#3TjD&OS`@q#iGX$gC7hwT)?-8oFXnv z4y%DTlol_TQOQfZQ-B9aqUGJ>XuUy-bo7B7lkvcJ-22PCI%~7I3kt4Mv3Vm=_a}Zf zUMdgql9XTia}JyaKswE?Q1K^%^9-dMR&Ysg!!&k-mG_PCm54fZEeU` zquqOdR`2~ea@aJF+I$96TdeomchTYsLxt;ilx`4pI%HzAp$7{VxxuPhHQo1JI7yS( zWKzP;SiwrBq`7|3%m;z^Yo&BltzDQHWbcE4@&4C5yf0J{O66^%HVvGzBRDdRVX#lp zJ*OdqevrhK4!B}fR@9k^ubxr%fGp&?JEwQy-2@T^n^q9^SOS{E$4U=$(_6q_#Z_YR z%8XS`MF8g7kTFHFcqru*53ow~TG9p=s7z2A6q`ORv#NMxX}Qm-Iuuj%GG~8;SeK+o z7&f~jpn6x+O|ZY& zeLL|vCZdGJ3tg64&7Se5V%O6xWRb66_suP(48Qa_KLmew80$5D31K%MKQyf%KmOqZ ziunVD?<;8KQ@snQRK9_M?H;IM(Hg||iQYCdGdOGhRk`Pi#d*^avb_(F^%=%z{>+U1 zh#s`ELQM5pzH4hGPu?WQgdT~_lpl&bX^n{W8H3L99ys`p{CDo!cE~e6^zRJokNJol ziZt(>Z}L0c*8^BWyH-?g2BMXeo`0!a0`uqO>rG|dauM;&Fk7=}?YE?pH(r*238g8| z1dE>R$uRMItYneLoEv>RTD9c23XwU@WMeRtjK%|4Fv&t$_tkZ43t=p5#ie-3b4ioG zN0VOy1VrgeoZTra4~vQZ)JG&06MU=y(+yD_6Np~>AiAtso^b%`K8|veR`{xuR*Eif z0V#c#)iH94=N_E(k49@h2Z%=P^2VhU>dB_g0!Rf<*cC49>vJ;-rk7B;JRh-@xT+uo zGy^t}vs~p;OG&QcZd>EhT|s6kUVGJGx5|o31I^1WSje@7pIgjh<(BOuuOZIcNqGuv zMf$?z-$lW$OZ(9g#oEV&{lenHMkjJoeHZNkzH=JubC`ctntaajJ}HpjS5wya+8@3C z4Bj|ehkIib*g_=;D=8*rC`}-sf4J%5YwN#Y7bda58o+r2s*4mH!N=sr8?$&TEn7t+ zUH}}rq{n28Z}MXw-$~WPWCc8^iq#*cbsVrr$-`)RJ+OFK?kw5YW&lc{;RV(!e$jq; z0r#Sa3uF!R>yyH&42c17Sdy(707`5LzLY%B@b@$5n6suD?x4!!kjFG*m{Iu zsn(34N(3LpecdF1)q+Gj(>%_V2GGS7$^q%d$K!!TNW!oGD|-NX_RR4pM%_F(rYR4BZB zJB=(Cea=&U$k3Z}u0B0HeFvRLwefI*&v788rg<+ggv3pS&7K~i*DPySNNFVFib!xJ*3jyd zIV6;W3`DF@Pd9~Z)dL7g?Kta9kkMf^#bgAWS%eU|hz25NH7P`6SESO@kQw5=e#h@n zohUTO_PtWvio82`sK+6rrW-|E*y#vq#p5gsYW!om*R7Co)NRUGWpgx{APrUM#Oo!p zGdAZUP35L8reL}%*tbxl3sO;u1PJV0B)d@?twpTK)%;or@w5^!Qw9@V$&GB4M(Wkn zwSV%KOE#Rjt<_?ye6v>531|IAXF!@0O;teDw)wm58gsZP!?Jiaak{U)US@?iIHvWI z1&DU$IYDN~Bqi_svQsZ-dC(>C{j8MRoxEtDtw@5SXbNX;@qQp>Sp!Pxk^{I~3z7QwE69DEy0(E_;Er z?l#LvsFCY53wAM6=mDUV*$x4-;p|tiKsqpq#^1mgxc2i5TIiJ#VEAdgni#;N9ONxZ z__iPO=SL}-+8>Zrma%t*rjLo7T8_q_KkRwrgt5t6FoW%6bqF>{_CRnF!YaaYznEN_2YI{9P2cP#xq&Ml#bMPkBZVy9E*m5F z$((J%auVF(9)L0Z2^T8!>BD5madR!A-*V9ox$H2?RJB-HwK>z&=IS)BMs#MJio##2 zoeu3yoUtV0E@1MLlH;vJ{L6Ny`6CK--q@cI0aqG9O`l(1x`lIw04KSSjMR8Wazyb} zBolkqpQdVOuRvu*rn-ChoA_%`N9IkKCZ(cmq$EMbP_XZsg#XU40WEkz>I*3JfJj}K z&!z^|&38{`%M0hoBRtzflY_a~j}&ucBDz z2?@>i>+cL>+@;OpXW7lyVkGTv<8&D zZyBax{RV=uJ3h{@wWv0AtEymsQ`$P~c%5QOS8`+A%m-!77vw+A0HR-;vFb6EBl*`E z;NUCy$@PEQj3unUYIsC#9jx`83~L^l^LAmHj|r0AQin>^#Pty+&F}Tp;et`x{(!L_?#)8SqOf_H{qWs} z56adpY~-nH+>R?Ad}=`jP%F7E#=t~$n%!{vdrGCZ?c0+#jF5nsF029JoPaq{oDv;dtX$b=ATq-2<@mn4RxDp*%shM~m{P4WW4VG~6g76k^=j{)q zpEuMqeWpTr`8>6**n_V^bfh2owB_Yzlf-P_g|{fp<#BVdSA=!M27A!xuuq239a;=_ zzFhC90*f6UVvmt3-_)to9qI2 zFKD^-5yp(fR3FBN;Ju&H%yEL3-@W3zggqY<3*1aI5sTBzMsjAB7xW_-?h^9=o+1#` zb}mh&!gn9`Jy0M5BExl`XzRNYOH^~Xq(h8wR)shc^+gi4K5pIauIY>hlwn014a>F^tO%1jamCqoltJZtJP{~V2~5u4C{JTx{a`xU8BRV*&&rEmU7T-+{BnXOY1IQ5 zlZ)a}WbiUUSrKt-$OD>nLxh!R`lF*GVm#?U^=eW_*?2d&k7G2iD?%@(KHb=;YhG`l z_r#17C_6DDZP2KSfVVXyChsp9xpL*1p3?xE2O33J-YBrc!pnhhhRp&9Up#|I_EpHN z{tLF9slOm(68QRT-(#tp6RKYIxy6=i!uV7My9}NqX;@0s_=Y+%_tC3EJ460&=g+@~&);1Ck>)l>$s1bYenAP}puj4HD1OR{ zd|%NQ?}JT5z(B%|m>ai44w={pcfBks;D{9e z&D--~nUz&jS~gqd%CnQjP%R8FhZ#8G-;vFnCC|lYxF$11bC2k~zbCRz6IaVrlt-D} zj1#DoFniIpfpVWkry)aT8e=mNIMRBkV`2Uu}18eF4fWO$aCRIM>s!m z9huZ&uX;UE|8%eev3#O(%~papv2^-mS#gG@S+s)6^r2H(jNI;-z7#K~4`MGhmQOe~ z^y9WFiMbo<-NYR*WcivJk5<@DQV6Ph$qqW!T-@Ff+8j^5KGeN)O0f9`8`gG58rHLp zD`4Bg4W@hk1Xmz&+ftli^`nE!-_S|@>?M2Z{QGiQE!WKTkN5b@e)loH^^U&VNepAe zAUdlWDQeg~`sx-zSN}DEp`16kKxj|%tpJw}PYipRioJ^dOrQ9SNsTZXBc+%GWzks_ z-hK}Fwl2PH?0vN(>#WDNG>Xdk!8j3e$V6a{IO;TWuz~O}O23H7YLGl`GC-BuW2fXA z9y%03?Ht3Kp$jN4cS~?PMBsqy>oy&x~Nz`dsn4{ou+h+`@@FvQw)+N)9 zxEmc^*;LS`|M;FoVTD@aHf$ZFIkg{tQs}y-i(i`{M{Hykkt1{e4JgkodCF?~dpG)J zbTr`fI+02o?PNu&<|Oolu^W`o$qu?;8ywf`P^4S+@y)1P_nrsRAx8)lZbqs^J?>T9 z_9;fw%q=+t)(yXr>Y=9}k~k)iWlgx;4Exm%5}~mFmteX3z0VqYo;N=-4COC?b=+Op zf!FuRP+3@rqmJ@a3T={@)NL-Z6I@mu=Rj7N9kYCx=jkrQ!TN?>IwhwURCD`5>3jo zIOf|!yiIZF{AvqKCVb_S=TB(Uj}m8M^|QF3lzIL}Wn_mdIN2C9wV6Ickx|-~l@e6o zbhLM{Qs*S7DmjC4sxt`ccY8DH2`l}h;8ig9m=%g08O0z9dFh@L2WhP>y__Q? z><*=Ys?rnaJQ%o0RyQ>GU@jLcMuFzk`cNw8039oy5n8-zX;Wxipt!OH7~XJ)srW*r z9?sT<6zDhm0hIILM!hS*7nI#^eZ*xw<5X1RkWh;hSq#Uyv;->>qbM%5h4K==EiZ5$ zs6&@p=4dVx3Sid(wm3uhsCQ%ICP9{2X_2+Dy&$`Gda2q&#G=*+vYb>n&7};KIYtA| zoaZ9(7Mh?fGKC*n&S$Y)vkNI;A)PnBhq0y1s0eymi+4xCM@$>vz(d{KIS(u^Md&`E z@`Vl;xk&*lrG{ZTq-glOk`Zil6TO3hX{m(7Amlp}BDzSfX}rc_pIP*Jv{}^0=gzModCF zo)t)S0Lk{Dyr?Qi+2xE@6vjLY+gMf!frhSp@KLi>EpA{!`*@5~X-0wx&%Fcic zFGeaLKQXSmAnRLr*b)}A)dN|#H88Z5yWi|2oVC^QO1vl<2A_|fQPvTXU6SGKqsw@j zL3YNb+!m37N9Yd?-?xXpXS%}U760i`ZvC8>BT*Obb@f2%eNC~O@qy&Tn zEJyiP7IZ0zo|W*)Mt<`|9R+u|Wx9F0wd!Me+xHzx4@(8d9mPPc&jAOjGEAQ}gjy|fz80?}ntq^`FhrWss_dC5 z>GS19cCV*t#*4J5X7HNgUG^IBb(pG4{-!G83WKwLd^P#c*;3+$mx-nIK4SmC@BI{~ z^Wl$#Vtkb<(Eg=ncsA;g^Bb>Kikqzc6jC3OHJyHEvs@m}<&*-7|{>+T^ z{49EmSC`!8`o4{aTc*J1ul6iDEjH^e4caR^*YTA)aYyr2O01=(-3$X<3e>-4r-*j2 zegfm`Y_7~HyY5-{u2TR93cWrAYR)EG1Smo22BUEV8MNDgdW%1oZ5xF!>i&dEEL0?i zn6HV!DJkx+;=1D@p8OD~p;AIA>LwT)rE6X4N9#b-gwXR4%cR!nP4{&dul|2>)sGSj zrfu@7XBEohNQ8tc5yMqHA?XL#FP&FZ_I#E%OwAuz^7pt;Vftr({D?%imgIw(Pyuj? z!XC2iu45IS5KdPkckb%C#hpTQ-@xYb^_4};XR^CAXWGFf!JYXQh7L(rnx8X?qL5W)naC9b9|;mW{o}e3teODf)EtRE&G(ghH3K3BIZ7 z!%|mGzO`G@$Q6N1YNdVmIyeo5$};lxiy@sXPEX*_K!jFnU$Ul3Ky@-El;b#{WgIDoQEJbn&RLZ31^ z0VO^m?+dSRK$owFF?=3N)JACMr34XBT9mU4B@z@OEzYE2%}!7lW&%w!3@Uj@+BezM zjAfPFlX4dEiMVLMBvHQ-35-GH@PD;T^lt0r#ai(t+n4;1++N4KoN+>D{vUqrR3|or z^gInOe23-tC{|CmZt%QoJ30auF>@qibo57Wau#-CBdiE!9a$HgW=dx%pp0S3W~b`( znsASdwDw%g?Cj5MYl4!c(apgRP7V>3coKFy!R&>o>z(KWn@5?ki@!}V6-9hzoCrae1U^KZgRJzIjS?x0ps1o?}8qmSoxvvQ-B2=ypb2e z#`^21+4lM%kb%$t6jk|W>`D51*Ghc3x9(p-YS#bujf&~tMWUx0iYn?~>4Z&bHX%F& zL1cm=(mfNzC9qc_b2CT~HYh?PA+u6iT(-p8TCU7XVuaT`jXDd<#zqb6!RD&PCBd0m z+9uw!iU)bis>Y?)q2>qOzqfZ;T(0c({WNi2mroa+u9q8kT-}bB9LHPkyWO&UFnTAHoRZIy&D_TlcBBdJ%O<(%{*Rv6ntO$@ki?m zMx<|6W@wB1N~G*g%a7ax*WB9zwA`avQ@49{dfw3KyM6Q)_n=I%))yj6->7Y$@J#x< z{rwH@-9goBl2{prX9+xMPkU(HLv-E!R!oRr7Xl$~CGNfHOd59d?6Ef+%dPH1kz6-4 z?Atp>nRs5~fwt6kwt(2^Qz&qY8HRgdRV7KX2a?Iq0M9m8EBQPyR5#AI0L{0TQB*7} z%oCtbUiVuYA^4VmFD~e2piu86!f1n7lz6$2Kz2>Zl^;%yog~URx-b}X zfTG2g#-6<9mJr5$C~YYi4~ph}-J^!M>#FZ<#h zI!as2vRonD07&O{|BZK89q#jC2RI>$Z6n{0pB3dB>=BNs3Q*bBq9sW__wIdpHukS= zGOyIJ!bJ$_+XDN!F zZK8uLZn*BfSPL5Apo)NAJE|j;Zsn$ewM5qVm5`w@b9tW5hlDB*en{rt8y{x7M2_T< z))Grq$~sR}j=Ar@>P{qw*EII$J{$XH{o#vqNQyQwURPZdzG>%U22R|y^H=??GIujX z>In&YmjE3!zUE!fgsMAFiI%;Rvd!iaWE$;G1}?HI^erWl!fsBhKFUt7A++!|EDx*i zkh)xYaGnxAr_eqZgW8NHXvV0TAn&)F(Z);*6J;2x#uo3f_k|g?684V=BkpWSNALTP z0W-;<>5}AQF|BdD0_H+~us;Bi0xHfr2?4zrEoHAC+sd;cE~sDZLS?J|um}kp1;$`v zDx2P_cQ@>8mt&%*riN0;T?ie|_K0)4#0dNycU1b?6Zjiq_ST`35De z)~u;~LcR!}j_^A2H!vOL|DX={{|$Ah)t~a75UkT*qtp?jTXDkQ{=>HP8P=!5fSCRn z7r7&)#J8p(*ZLjwvvg0^N|etK*xykQC* z8@}u;LROB)Me#A>zKThWM|G4A;@ClBQc+uDD{JI2r-Oh=p2I2JHQ7CG!opAy`c{oV zdX+AgFqIy|=w2Zs^$EzCLq*Wl!9NN$7i+EI(j_RVAw0P?HtbS3oiBBWZW9~N!^$K2 zxZ?B{K&Jmx{V8{h*7ig7iF96+08JtUv^|Ohw}eF9JhR|%--F65Zc8KgaAd9S%1_2v zKIsztz{4OVGPKcAl1qUxo=us?UV(6+DwBH~%3R#Bp$2XzS-}V=ClqDKkJ!K+1Gpa^KL79;K)R>5S(S)l#PLgakIS zHeG}Mp+}{q?Am3%H2xpbVLnILEE|%_KkSU z65zxWnv0P_e))eGuFdgV#Bxe^ox<`b8<In0!l;~GqFErFvMb*jVL&hQFFiVhG)zHhnr$UlK;mdS1dz`1X!Y?u)P2k$%C}<} zOl}&S4MQn0Q0ubG6KpS|SEyGT#a;0J_C;VSt>r&yj<`D8&8b zp^%_E5e!$)*UBbf6IsQaLjP6RYg*s_6?nFZ28$~AG+Fc&pH@tHt{yQjCs1vIAwwPD zqL^45IgOZ*Zq`%j^cdP8fbKQKq-mgFBz~n3xyMCQEO&%1X9N(p$zLIpQT2$z#7AIgTyZsuNAx5F+Mva?OI@X8V4YhSAoC-ba4n4ApO-2z?wuZVp{;QgH@h%VB_S z{CJFX-3!(atK%us&V&-dVBjmidTE>cJ00TfAVj3?KN02WD=lk@yE0sb(?Is5YQOD4 zbM0B8hno@5BC^ME+jh76G=lao(}L`!e9;WglfP@>#!u_N4rRrkj$dye36R=jMJFXO zw=9$uWlvHg9s%vcM+BWmoLSXNk^G(0k(V;vNogZRa?6^8OzSA%f(8c-_z)e-fBmgn z>HcN<*T9@laiY&Av6fXut>DD39OaPI39XSVlrvli>47R-gE2Z8(9e<)W6tard67|^ zq#;$^qwh}ig=V^xqGXgrBCO;D8egldcLHvXvMJSrH0>%t17Z;~F4)RqAQM}piJWFR z>D-d*Q)n{%{}#al=k_uHUo=B~b%7GQcCZZ!`o}|{d^BcdQ=qbD&zPg$;ohU7Qe!&c zOHI^yeO?mOZreC(>-qZM*PQCaX0qW{>}F@1j%gwx996`hxhh zbP{RBD0S8SV6A^OX=WGzUcxAyT_1HT*l?%*kmvgaU5D!ZRpA3a&*bvlUyIw@?EBdV zn*m|Z~7Y}!I>DM zAO>KhO6&FY4j4g=$-AhtL57vURMfNl(swbjgu|%zLeM3er4n?H|8b2-gU?^l0HE)< z>3ep)GU8W5O<7&L^lf|l`+3FpaQWox{q(a3j90P{o7o}FS_u7Uj%A{x&hN>YhU`|C z?-NjsasZGANIFoA>Z`*Y9^9S8lV6^z&DM?0FzROL=Fr#pb}{g@`}jT}hlD4bTW3C| z!Z%wxvNyQ47~1@)T>LUq1(R(f!Ivv;^#&a+`(S8xV`*utk1!PyQw+fsf2#g24)sdS zj5*9;_ViDKYHkWj#b48#G1-(BV3SNC9@BsDzg~I)%~WZVvD8Ztysr)BsMLx2ca-IGQ8b@m%j}EH;H4t|g)=jS!4);R7 zG*$|aKI3qv$yg~Y`3S}{a#zRYL<{6(4Xw9>w!9At&5hKqlP5$|T7OLZ<=m4Mu&UH# z$Ez}`Z4(N%;0ZRkeFrMfI*t;qO?WZW3fK3uqZTPBr!=!GkK*T4I4#~92;t(`o;(31 z>a-YTwv7`t!p0ESYs}GMzC)_TWQS_WxdiJK=3}v$=tCPF zgT-J!-vhzRbj@ai>EyY^zz~H9x?FtEc#_jT?<9Znoa9m5>QpK>L(Amia;_91vtUX| zUT)J?5W)1jEP~vPpQ|~O+I1|&U6d9ejQ)WE^0Q`aB5px~$vAQ-_0$@g_8vr`^<1_$ zCvG8tngzIcCM&*Y+95c1_(~~w3Z8V&`3fmy@F1o(ZWb)+=vf`xNaEp{TX6Vmho0qc z`M0mjX_HegzNEK#SC~@CK55Jb~u9jreoyDYJAVvgBFpp1&cH&)U88f~muX z&oLNXLX5H$r&ySCN%v?H5~Riw07{9u8Af3TRX{L9XunvZG8TuA5O_f80p4(sg2f@c z$WZB(s1b|$LHv<;QJHt(fc++4?1@D@U7|Gdpix9toJ@)1+l&WX9Jl_*OZ-CdzFZL_ zAcpZUjc_t{)^%a{mo##nY+(^8w5Nl(5Fn0Phu@{xy9RKJn!XKpHoX`>58ZuatkttrKq_$()#1y0Li6Y@zsIN zw24TxGY-sB#dyrCtip^Db^^n!kO`b*17caaEE#u<#N#@z8j10RX+<}71w1*#qI=!G zK~N{3$N^+!xll;Hx$q~HGZvk~*32Th*TjuLwgkSoyX}9SPr4tx5RqTK#VlywzWw@t znos|~eEtG1p{Sw_cTaZYStBBBe1jfnx%^d193dLmOAzt%R!%-@NO?WKHzhr1H3yIA zZOjDO^=?Jlj6Ja+7Q z`T{U@!gv3j_651$&;6>SyFsxT%Bz6fCF9%J)5*wO#fX~e`JmU`3+1pmYHi)*k1iAJ z#kE0e87&>@+tZ;7;r4xCM%C1Jtm)wq6G4o8ew4eSMQWfgckvk1)F)Cwn8| zwu#>x+C_&#BPN~IWFkP~`_ySu4l7PS-tWq+LN1djBDE5RuFQqb-UB1XME${_Frc-N ztN5E+qjIS=lk7l6wRw@9J*6yOZcK?qkQmy7R6HaA&?v64A8#x=HhX#c4coIv7>BBi^Bc`697j-H(h}5s#ofkzUUO1)d)ukXLx4R8_=v zqw&YW35{yS94U8^IUUD!?ss9^C`;A!4U;UFhljr4bmXLfNPvrmdsj;Fsh;&}?fCl7 z2Xmg95@}P3-tgy@zu<*bMS6)`Jd7|IYm~&c*yb6Vl>yc^Hl|LNysexvSZu`~Z0P%z zj*fjJM}J6f1ga|VDO;Ya#pY49B1`bP{T9Lbv?QAnw0&XMgD2puy)vOqv8Tb9BzdYW z#4Ed;YmMwS03vK>PSs{5(TIt$$(w(fDc;g$i@N{~^c*Il{WkByy}i+5S+ww$E1_SG zBY4f6eM5?UQ;lptB6rm;o==HB0y)b&-Y`o?$TDk(KRfGJF;&zqEv)UnEY@d~D+*2p z#~VvWY2aaT*?w-_lU)$MQqX=?GB#p6#?HIqfY{M_@**M z=tMPcBM*tn|Axm&T#VK|MWkhK;@XcJ*-TIBr&LLGP7YT7JddSOsH1zijJyZw7OOf7 z+W@%Xb5p#|&KMG~Q((iyhq*Gf6KSCC_o6F$V4);IP*kRNyNKB=ID;bRDC^9?WWlKN~( zAHI?5BVeLnB^>O*1Cl>CAKeq2OjOg5Pg|!obpXU;UF-vbt>8n{IxSJk15-rUO}<;; z1ey!l_mm?7dc-CddC{@JLuNsb9QsPZVs(@N+ zv><&g<+pUO*KX)r97INUSq>j`uF;#vvIkWjynsh|!ugOhkK3a|$~0U|J0Y=7Mdlfw zp?l+If!^*vI7Mlhs2r-Ay;~5MbeEzqCuw{ebP632jpsl|9n0{P;G5pHwCZXWgj3CK zVdRRXZQ02L)F0=iXI+tMfugq0l@C$&y)O?)91%5BFfF2N?`aWMAWmDrM?({7mQ|}O z#;rOtaUG;*lbCX^0nn(;c*mE*Q5#6c9M-c%GYWp453+a5$wcLf!;!#-2mxp)<_$2ZpW&?qjIm$00WygQ5S1?1lJ$G zFOKNQpVBnQ16T+Hog{vb1soK<20CqvSwECkC7i)58;P_4DWnK@t2O;j`cb*-0v^Yb zKGCPbmr3vL`rZXm?_vOVv7nPB478Jp1*PBPgYGYM>t($JqUB~=g}Zw#0_<>;TV$8R zGYcy1?SB{}R$n31pI4H6u8UQsLLt%ALfd}0_x#*fkUJPL0C!KjVW^ay=QO+-kK_N z0Gc*vRUA(1f?o)ck%QJqXiD~YuSeTQliku&xuhwzg-GjX!wCZfXRgNBZNkojRMJ9D zf;x|17dlOKa@=m7NMZQHhO+qRt&*VIDJCA&_ofcY%?No1wbfW z>Ay$REs3ZXh|cG{6848t8Fo%W`eBkV&|4>046#{09)Q2IkDH^qo`7og4u-?JUcy`b zrlKZ)eP4#P1|Scm5c0zvP>a|#33wB8GdkBiTRxBN-BN|7enlrlTC$)}(J|*Nlbi7| zb7SQt!l^`*949*qOIbv()2k6USd?EXx-FlZuHjzi#g`q2*O(LQHKs14$dRKJb$ccE z@8)1>SQh)MX@EDJF%4rTjIvs5t>#IMZIs)Ve{9-6>YS)0g}Z>lD$A~-73n0&sT4f< ziB)YH$rzT)o4U%B&PUYDsF8~hZebi62i?E46{NEwUzpsI9Z^*dV`2~Z)r?{C87Eq; zr<3-nhUW9j$+6fH%$%oYs*9_slvKcthi0qO4s%vsV9B&BMa!4|4g4!C>W)nUq9u3O zL#XDjGM@+wF)(c=>tiQfUznMw?pmcGuemfkrw)vww3NQibT3YBLuzT|-W~)-+haJ^ zDn_2ciWXHckH<{ef$-?4avUfI%_mn>$YYU-zA@IjZ?2t97xmdWRt@K+`scS5)!EpO zzj8DrjVii^hT1C)tR>4uNqiGcnRR7yn{*r_`PBxQH*r-MZR1pZ}mV~Bq+CcqNu8<(%x$3Ih%)G% z1_NKBEh4peEVZlxyKk&EZ-f_@6AS;ez;xx$g4#+hW#HNm=`-|e@(z9Jq!x3NSI|p} zrF_|I-a07q8&PVkj#kDx*KZBgJ3z(Ur^`^hIB@`T#6TTuecQx1El&;Coz7MbVF$7BYZ zp%4qP8NCS^VvT_~{!0@9r}sE-(f z7+V47Us@%N`OcOSCy$(7dPNN_4A%mVy3CBgFU-KLt%6#&Q=1Uyyz;BEUmu0;Kdph3 zcqE&pl@6H$JtNL-yg&vgH9bFgvDQ!=P+|$G=z6&Vsl8ybkc^9UYw1R2T_R$(Oh`WC zkSK@rCkEf_Xb-(6N3JPsb~KjnK~r2H(GM6-_N#Dt&A2>#)c_C*O|EkhPfrJ8z%p6@ zs@_v3`kqKH`d)4OUgz*vz76$fA^DYYC`T8h4K!43t*mFXKGS16igYh3;*Ms6) z8flo^0AXnPx10p816HZFZaEgx<`Esjv`wmI&sBw&swMwrjaPN&A09GG|IK+{W!q^L z{LEFldEZr)2djeD@XkMfuQP8_@?Y^J974I)n?@UlIy4m>0e zL7NOlb=yO|7bUK_{Bm9~ntky2#AT;9`d&}+tA%;LW8+IEon5cOs!uZgxyFHpoHriT zFBqHN7j~Nq}6Dm5YHLxxnOV88^ zzf79&dF4;Y9!bya0#+XL9Z_3zec$eVOh1f0J3;A@9*wLn_ zKIuIk@h;gtAMq~5JqWP?={*Ut0Qo&~LS8($0NFhYvA}a5!(JNw3tIK(28hePS>|V` zdGFu8o4x197YO27#8;98fdn86%fD*G0i~n8o_n>o9GRcnAhrDhmQM-@UGNTbmj;XTzANBF! zqabmO#DKg|DSGzx;Ych_9F@;c?d)I3;o{AnDxz|vO`tsp;4RIrEzE{M;5DI7eQ)sI z)X?r6?#-Y)ot>H5@fD5DY--9SBnHR5 z!Bcixp0>~RmkHoTKVsgKGHXW9Gx5P+v%m69tRit}u`Fzw^kR)1$l+yc?9%=Yb9_n)GXDf7&& zX;R}4Ok;SKY~I2J7DX33{O%PfAj6tUjB>p{e#nYY+e}+3eELo2t7UONTpe)5mP)@JkIBn+1$M!?}&)c?-wUu(3_}*P-vj| zTc8l0@S`c(MdEX#vex!VeoTyO*yang8z0e0j%*MqAb=YCV6+?xFA;m{Z*-f8aI`NM zK6OyVx&{m$ZH>l*XP_Gjb0z*AOwj(X@=V!bBxg%q6pF}1K02sBG#1ILk;x3ND2*NU^4LNo;}!g$U7=0JOyeS0lwm%5HW>Oy1D`tVn}+F8l^3D zmiTW3Dn`&7!mlv2aFM{^1=3{lg2kZ#uzFpYDh|r{;4D;5!6U-0-*qmUB?Fa?5bQbA zj`bPPRpyPDFD_j_p|hs{#KXwbT3-q+5Q5S*pmmdCvyh9F2qW-XWohu z{vG;?dislwzD4mDBUgSJKKeWew=oUh(!wBA2%Wh<*xTteatNK-BOD9qA3%3S#(~VWJPkD{LBT>4y8M)5)C=)6`ow(xzI=@i&N?O zZJ|b)M`4~yTCahXXsH2|EYS@5TX5ju>yhUJpVmbE_3+uIaa*7d5%y`!TJC-NuDR+} zm=IDNa}A!UPhlAiz={@UH;~?bJBsAJmY0RBcUrAEGLQZ8Hj=HSU4MBKg|gDOAt%zk zhXl&nT)zEqsz&+Y&s5tuF^Ia5_-r72VTuOO^4oE))3U6BBve`s$t6bt+!R@;X^7F** zm70G{0YSI|2SxS6r6hj0uky{ftpBJ6}J0QpXg&L3x~ z`C#A6AFv|Oi=6i(8B%Zx1+^a9vRD4J%^!gO!4I=feaHg$=H&L{B!o2BKv435DkT!I z4+*q8{D8^%W?A$B5fhV*OKQ6@WMX^3#C|u%VPrXhUz{OlSu)h>2nvl3ALIh6i=2h5 z7=0Ywl2!SDvzc-$hxrxLmoKO{l{b$&#AC1Y<{VpidI21wRD#wp8K1SX)x+8*kw0hs z2$a;d89&-VoA#`Ej39knpE-FP_4{5!@;E6T*{E@hhJyC~CSmMmI6&;>kMl<>1JJt@ zry&IAIJD>VI?!&!pip!ys$&D2@MYK+UZyF?L9TrrXYu4C*TMoT{{DYm1cd*fwMv!D< z=Sq)L^bpg+Z7}MFpLoG5R`W2;b^5_Ca&qxH-_#t{-j^<6wkM?c*1wr>m#Bo@F&A5;0=vsp!@0!f_EdjV zt)?HuDV?VdT%;u_EeqR~L5(pJPn2a#_Y4851f)$kv80@3mLPo}A*PQu$=SP~GX~6L z=qN{7Bte;1gXia$$Qn{~H~hsgvuJ>H`N~;*V@A2>)X@!v(z&`wWoT7IIO*~H@Sm}v zT=DukqLuKh`Auj2tC?-d1^(auJ-?BwvhHxb@4QF|It-C(-TUtBkv%8H;EqE&GNqvZ z!jwi=rdbHLO>>UmfC+oK?bEdeMd5*v!A$y68L%3q!2FK;;fCs!3rEkJ-~)C+-!qQ% zQm*I{!{{?%!q{3Hxyg^Pt?P#UN9V8Kc+)8A3#P-bu{*4C?tYDt0(hv|$#{Ksq7*Di zBM>VV{)FR{4&jq#6k-Rldt5chwm$557EeM0wwx+ypz{%z5)NX}fUpE6n8y#nx@8tp z=$-_(AUBVNXvGK5_-jO=b97BDA?AY2z@c=g<}E=wjPg=Pzb)jNB2Q^N-%c%EK2uzv z8^|TiSXP&QiWg_`k0jj>74`%ED$fGd56Ug7q0hn~n%jtOIertd(tPy3GA5*7G3?Bo zHppg46SQ>KIPpQT5i>$#Y=-Y4GA8Xt575=n+ZsIY1qyFcsKmZMC9ONOvhQkPa@msFA;sDqoJ z7S^(R1?=f6C!07*=Qj}(l-w|1Hl9DO!46`d>&a`!vu7CVk;hw#6VQ0^DkDfSUi`I$ z8`Q=!FQfb8hWo(DOWUtoHtK+hZJM5C$AsWA^-e^`n57u#-FYx?IU_GpgvMwIOw0Zw z%Bwbe6vPIiO&Na854|sGjXV~ZTlOdBA(oY81Mt%Zu(2MU)yRYZaphm-MF&amIxgDUlJkSwc$gaZV?YqmS-+|<5;09NSXwfgIz7|nC!P+K;qVzz`obC z{SFr`hIum4_84#^bxtHL(^qAE5rd^FiWe@$1&64#cgGJ-8MQy-CjI33^-o>yoJwY= zN7ahxt%g$}@=<&iqUzx`U?1*^YS07gfOC|>t|qv3Z9=Qp^q%%7+}FU<@^jJ#>{+Q| zAs=NX)GU2QP^QzH2teL?pK%XVuBBdZ2?XNqf2h6q(|;A^UO5f<1D9y$qv#+V_x|Tp z@E;Ee2YhKd74T|79e}@a{Xdjq|I>a;wbQ_sKpp)ifq^kywiL-+(q76$pO^Hj)Q*Tj zw#_fEz|35O=sXCodf!{uv;7qGTg_c0Jt58QIfXb4v-YuACw688f5J7VXK@K|Auzwb z-u?b~#rUa(sl+QzAIRGiTSx#l|65`%EQXRTODWTnIMYG2ku0;&vSs*EWj;CZ`z;Rh zTYZEDYu4ynttYs(8nAv8t{c;Czkz#-V zCykECyt1GgYDk=i0zP^E)iaH^5p#?MZ1y*}7X%zEwkZ(OC^3z-e>uDFsMX{Ow;7S6db19itxKe*+ryHU2HK z`cAzyeZI9<+F6>ar#*P9mBosLCkLBk62TNXu{{~9cW+S#bd}9T&!LRN>M_weD<3S; zucB6qEJcrZVm&p6f0a}Zd3Hy&vR`T5!Lr!NipY(m&dJWEof0OKnns!`LHM5EC@w-wF-GW~Gv6xM6DZQXokz!ac`7S7sfQi9G zqhFz|Y>!=a-nVcM-56S&vBVI;4D5Xm8eS1803oE9DqU2%AM~1r6BsQx1HP+J=W(TP zp`d5P3X5B$avEgtRzC__f~vJ$Xjz4Y1{US2O=Pt-eRJHtMrqvgGxAp2V(hUhN)#hu zLT1Uf9MU*iI?#3n8feg#r`4^gzUO4v+(mVCv!`KTtYKO$Ejrt}ReSDFgoj?7k+;=z z5VKG(!jMzZ4Irx7;n2_eX0De_^0csrf{XtP`;x5Vkpr?TKY@O$gq_-a9k^qi7)da5 z#~OBzq%Y|JlQ`87{(Z_VI0AZ0azsnR(D4?o*xV3X>8TF{o`^7YX6X;v?oYA>Y(%m}~6?$}tu`|qv$YUKE!Z&7vrvB*j%3XKvF_6MrGJ7H~m5}mW z(ugFqS0bZ`c;XR1Qy*h&lmv3?qKEGQ3}{B;N0GgvWOUtci)iJnzcC3z$4_h&esX7I zfzutY;Ckb$C9CwMAL+6x41Wg3S0QsmzPhCX8ifQdFBE+4O1y=8wIE!U{9<2M`feTM z`l>H}!7R}kSFkZIT<$Mk`~qko5d4lAz(mX#XnikSf2YSR;L6yvXZ@3V0>z%h=+WHQ zzr_l_6cCmkLH$0mXPj94PNd(`=uXeF;wbwOK2^&;R3Rd2Sc8(_5+GLq_}i}(^oi}8 zeA#_nu@MdYyGt@2hk_Ga4g;c>0Ul|LV5s|#1c_;7GsI5~%;KKBV*aDUpJ!P z1poc8n-;0PodB#4cmVJ>=KsgT?%%zqW{rRKo&fe6OA>4xZ9FKlaCkT;?BrOX*e^@S z&EWVSBEW6^lSgE*8D1#nLc(ansV#tIv`s*_sZ_5Cy2&Wnx@x<6`_de+IH29R+3mjk z@6OX8j^WFOufa9nO}Ee2L!QqJ-^q*#gTM>pPqN5^VL5)<;c5M@Z3qneC!u~GYN?J8 z0*B-M9Nw;|FpmdE9E8>fM+k(Q{r&FWPyF~hvx7POzCQ>a0ovQuApg=n3GMdq!ZyDz zD#77s+`}yt{`LO8e#@KGmp1{z^TQz$e(akgY@YGiB5h2)YxcCMpXU#R`%V;I-;uDY z^xuJDn%?O`0vCfPw~#V%fLmN{@7TG4@!2Fl?udrx3pGNV*Bu)JzQ&$b1{Us867*8M z(dl?>daCppl{W#rUQdTb3@}-7-{uaQ_U5$0^<3yva}}Cu4Xj)3`RUo!j<5{Jy-0fS zu@Xt9y~^C_&E-b*)pDRXE0Qi(=87E2${R`8Q|QXh!qAC=fJ43>XGD)>F(w2nagq1PESFM{d+5V|%EE2q!3%_~QWLbx$L~UJ#i*ffs z$>L^LRwKkU)`BjEaxI3S?F`N6cI04+#HD7|dVQ6tZ{_XubB2z%TvgZJTujxy``H4- z_99rq+_C);UyFO+bbFEnY`K!Zo^@G0SIe!@v2_^N-P*Jwk~=;7@ex|<3enuipcVPV zC~ON+7*~YzECaGC`o4Po#@`w5?2{W0SYql;%3aE5D?bB6zGf0Rz~`m&B3&g{;R{oHN9q zPdA4J8{JL%3x(7v-}-&zVu6hcBaQHj#|*eN8(TvtPvEham9M88Uj#kJnY$!MH*sNH zHrRQ~VvQO+;0WJ1{aCm^QF-REjjgq}F$pFwi$v-n#KI+BvNrHs$5n92s&s`Sa>{D5 zd8?)FHeSWXil3Vq(HgECL~VMJ!?LS9%S0vXmOrtQ4?g@>2+NQ_$;v^3)o zj9%3{nh)(^v#vdkm+DCORR6F~{jTyth+d65h!3UVyju&j0HfZoNXB>XxhR0U9)Wk> zFU~zT>>R3ldO{ODimLj7_pNxR!2ZDSp)(wSd1HpJU*LmKirQb$9niJ@D zP5W}--NolYL*rgwK&{+pB4L__k9CdN+c@o^F9){$N`FG8f){~A{f-Z48Ah*S+U8z3 zK?J$%*Boo$Y47kTnTCsgwsDYCTX5agFl8;bvALH}#zicoz%?wle-O^~xl6WaN83SSuL~KBvM#+fjr+iJ!v%Soe<5b8cz;30C5ZfiH zwuse4orjKv1USCW4^`p9n>*?$mb%UU{=xf5k~=+la}4{AT&%ztZRJLlV38GIA48V9 zVmjAw()&P{goR(oNeu{2Mp;Ch0p#P#RNU*ra$vVNEY4nw(`Oj>sLrH~x9d#-CA&Nb zVyVxogy&9JJ%O7~3B)##kfs{3#qekTlDjozS&3hgF15s3F~%b-M&ur6mARM~GvJ8V z9hY`}F09Xvs%mP8eW^#=g=%YQEVzHC6Tt^suwXf8jDDdd;kO`xZf}Sf$wvB8MoG^K z@wry=Y`EoqX+l|^3vLH@={Bno$J|%$!7_^I5adnb3HDF`Is^Jun7K<9DIC+N(a{}l z{-utDDI$iR@{E3Z({QFC`N{v5C+N_!@ZEyivgpc{0N~%ykg@ss_Rv`MBC2wLC{RO( zIr;YB_wVJQ*2Hm$jK_YmG$?|E#QWIlIK(}&BU#1PRvx`8q#?p=o1HUpi+LSLomLc{ ze!`zl@d+ETigbs}amiExvy3Pyw*S6C-38Z)Rsn(pXzf7qkK=H2aorkWw`3NL7z2>qw2f*yV5bVIhm)E%1ez32*$xO^HrAMn9VW7UvsrN|T9ej?xZ;j?pDbYexl@18X`Va6*! z1E#hXqD#9Vhbk9wKFNu10Qhg{%5fo05xHv*;z@JK^x~+?wNuNYKUH8r?jdsyB<#GF zDTQb#Yo|6wZ=s-e#rZp@=9cUntlSA-Ja?Q}T9e5BiCmK&Bm67hAXM9; z01&yR(YsVL^d^zDA>dpHA0&St@0*CI((AtEnQv~Rjxpz8Ze>chrq1NN0}AM zLuj}8d}*blxV;u-W9e>w2+C27c%8u#yeXn}IKl8HH_-Vt=)x3nD|Hm{W|T;ia9Xop6ujhi@c=rJTQ;Y{LU{GV4eN=z-1q9g z{e!k&klNhz`|4b-ZCNXuG{Bkqyilx;9R#X7;qIa-1x@ zeeLt{8Olb?O;zC*os7>1PZxLx*Do*^1Q9snn`z~(1$1m6i4oYnJ5RCTSHQ=`WFhW|> ze1?zsBZp~C>rMIe7U+4w5#%uNL}dEdLN)LPrv%&6Ex@*nbNR04fIF}s@G1h0Rpm-c z7dFkk?a9PX7L{}b?VgCOo9u?{;pQjm?T2kU9=oBoAa`l!b^==?U+t2^`ecc9C3fix zuDYQS!e1GWUvZ>-h^7sGz8U=I&G;YuEpq|O+62%B5CbeP@cm!jjFrut+^n3<>;MUF z|DAs;QGfp@tnCZ@-kd5fQCn16XbzE5NsuOxGHwWbPz1TC8Uc5J)PDVP#4rDaV;vCF zR(5p<@%`hw{5;1w>QH4%CZE8Iiv8ep z&;klM1eA-tWG&HHClZf}KW#^kDssQ~Q({9#$rnkCE0O`ryCLM#+`XzPO-GBy?qm9?KB|LJ&mw`Sp*X9fbIOrL z&2ucyb7ZM{>b#ytz1v!CEh@<@bS~44&~h};K9a7shv5==mt$u-8iKZSjw!RO*?X4x>`d#pwOW(-~Z}0;RGorH9dfn~% zdQDwqt%e?k#fM&{22O+*q+>(aA-T=|$aT{RW(DY&j!mippEsvfCAxK_D@;M< zK}>X3->4hb%Y7d>+;?nhWn4+7py*Jmt$9MhMW^S;vLgGpSy7hgY!}ba3m^|*wIue! zcX19I*c)AT?hcTsSBUj1Tsh&}<4XE${)c6)Y#BRUBg`c8Th`EUItC7Jx1YsP|x7L zzxjku9Lv4slKaI)cBxo7EQ%AAlt{wR*d;cFFPLH~6-(VDfrnCc`3gIie*`I1i7HZ_ z?Pdar6^Fo88aAQS639x<6vt)XB@|FVwwgFJ8;bC!ii6&~t!Zh~`PDzFh~|=P#1h!_ zk7mATO}%p24UYQT4Jv@{ov8VhGn_s21a&^X{ebBYzLT&Eu6TeFC|*6#3XX6esE9(M z&kr2xWA^_X5G`*;`@x{SHb7wunmgkBqwO8o5cZ$Mx< z`~Twf`j2-dX+Ex~8hE3ZK;G`n&UO+ZU?X-#uxHXr^s3?M4+bvWQivsD3}FJg?lUkf$1G$ z)N_L;LDX~O%a14o=M#i_PtIV3LlPl?4j_Oo%!a?eG1~qVfyf^r@p`91i*Isgg`Q`` z68Eq<+wg)b;LjgSaZ9?|({~U>#T)U2rsA6mJb*y<~r5| zCZ%;W+@sCa63d*ic4@bPkY5`Ocd5cT(xj{yyzF}D;q}gR5cI@`@?dD-vC<;5cf)v+ zxVNA{Mt*9hC3Ou2_}`}S*@pTlezS!(cTttIdC7yF`gu`P<}A$B>ajgfTVVwYSh|Wh z>}_%8l-zTU>+wu05-Ux2bA}iL0(^NKEM<)jRMioc)aoRq%w}$d8`Q0}yk=V#E7(k| zq^ajKD?Y0=@s8yNEc0hskm+6AJh=2FLzY|Oc7(Xx!0wfQB+ zYTJESG}$Tbw3I2;5%$Ccd~XgbSXsH-rDTQk2-;~`v6ZIF93J_#qv}oRXmH|Cp{f%2 z*jAh*^DRego2^f833297y(P@XMeqT>PW9w&Jbn|+(ye!9sTz8bDj2LG%RR1(O159|D2R|Y-IMP zxzppK;b&3B*DtPfhS=sDcUMn9R@D!`zW*|q57jjCvimi#vW36a6TU=pLQRf)*k&C; zVfs{xH|9lFpit7_j>w`K7ugZ`*FTuN4B{8H$)EC)&2?5T<5xF__NVf--c^R~N1O~* zcDxf*l*kC}vT+NEMc^?zUWw#cKj71HJ95=akm<4M)${7esB|?a7<;ulJYD7aSRPeP z$%-}zD>SS%>IPbJEnV|F++2i%$jF-mFtAoVi?zxZe0|f}-r57QkDoRS5O*SI0t0bs zxTEQjotn53i8iG6CIkjXC3$;lXq`?rhyrT!!#zErc@=FrI{q~W7%wG}d|U4tFU^tN zx;94hA%jh7pTI%7eB&1OeHH&m0+R=BXuX3sY9By+)L&x<3NMX;IKG_FD|B@q8h1n( zJq5)Hw$pmhA2X^OwrUjeLkd`TcP;HSgX%Xs$v?Ymk=4*Q4@B2TNN38Ix0XsVno`0# zhn{M(T(*TA9}|+)W~`XQ%zOP}=u`YXCRu*-{_m#vaM5Tt%R1h3uR$bqm#8a^LEG!Uj^dP6XEOpX-7ZlG`+Uli-x5BcSx%ya~y8uhCv3IzWFgq{vO zmJVD~isk{m9o#4qy1oV1yD8MdqFy!usJyKYrPxhF--f06zBaR2ICjICp_#VA?RXhJ zp2@x%tzW|}y*Y~tGYf`z2WoJ!$!X?D0%b@U$rrJ!lguFv)~enC8!gW7L4MVjvoi#W zB7AS^#7L^#?zis|6KG0VK6;(B-ftIr^=i{@w61;`;jlndyU&Iy@@U*qsk1-)T$gBR zN_0dQrf9T@QRn)_Rv69f3e_p9tIk+rlWf9D+SF6kD1_&nQ7MgW1)RkeR;$AH zH1=F%OL7E%)rQa0c$XzCPq@#KG88AXO6;Dq`A)Q#oTEvAUOW#&bkw3d8zi?N#pJAv zzN`?7su;+76ypQ3f84pxg{>*d`Z^^HA(4_fA)GzjLtwXfdcGvm2m&XLvf+0h99B_y z<(4rRuw?Mt{waf$j#$)`%W?*{=~CXX0iznwVwFeYTJm47We=l9`Q5Dldlg1mJ66m< zE3rgL0AD^w5`O5w)F~48VS+QjEvA=V;ES8f-<>IpkF>top0@o|>{F*dbVkYMLG_J$ zIuG1Tp4lo}{7}me{UTB;fPoW^{K!f$uO+cg=dIZm`vR@dma}ShZ{)ycSU@+~%nRBN z=UtJVxuoKy_^XV9>_Vn}Jn5c6VWOD9EQ#WH_kl|7DtYQA1#nlksQdNrg!|)d*oJBZz@uHIPLe~*^N7AFh;nm*Y30|PTz&2Z(FUBy@ zoZ!{+8LfZb626>HyL-Lz)>5VUfd9A?p!$;4F?`kf8GF zQhSssmMUhRYa=IT`}HYnJtO7o?LAHaXlekKD99GEYAghCB-8Rh;|J*lOg0W#WMHp`wqV#p!C27ZMXa-wSXr@rn=-l&n0|PQ;91)Ivd;SYLfzIT;6bnzFPG|qtY>5r?cFlyTanFH|4-`06e%V!OsH8~ z6zpfhR<3{fC~Xn44!`rOvztfSX2cyGIGNV^ev{cuooA2s&L4N7U3MuKHVvxtKdJUO z#+OuR&msGW|HAJy(OZ*BuQ{_HA8r&}mJSCHY1L^pD6oTZ?8npk3C7JqZPa$x>)SjW8okb+pY-6LwPFeDYx7sZGyWVweZV#Fw38n0J|RgM57pH@!1DxAYr+ zM^<%;4;PjMA^$a#t)($}t+a~FN2D3v|3g10Z2Cd`^_<+6#azN&jiIMK#<&V!9G;}Y z$({djFE&C&4N|7Zd%Ug)(&KW})`dH{xJ88V1Ncmlql#F_Qe(9SeYce$#R=C%Q20EhQD6r)C4)AC8Y zYTb0%iRPGF_(XUf5KMC*j)k?wDxFGSIB|QSwa4}l!meE4=YWA?VKxHpL9NzF*+9}n zRnkO6A6Ea6UnYiB@ghIyGFADa9~2uN3S=8)t~&^Ey2=>p1t)fCxwp2gH~_U_->D;le znm}$7A{b`Gd^`PAJOcJ}Wk})`B&p=XE-AXr%H&BYKlzDI<PO@;Is5^Rulhd;6$e)diZ3$hUTvs#{#kd>Bx+_G6KE}A%UvN8LK zHf8meV{^y8PK{UREuf&cOk38x9K$7N-UL)W|7*)M&$903@$$sfm#Y4>`*4rm?U`{G zyY3;4yl?mc2xW(Nu|PGW+0tFr%AkS=y534`NIYW=pM>M|vvF{?#W<5m#_TB27OW@A#egGL?K-8Rq ze;KJYcAV*V`h=F}$mx#OFk|31@PD@G{yF$$`XL(?0mJK7fPKgDzd88+qsrCr@kL!m z`yyYzB+nuuA_7IxS0dTAg{FZFL<}SXUE@uSmkazw4L?b$wKf&%2O3z|lDeU8Q`Owu zTykS=*DP&0NWIK|Df3>pqHR;{x9D-z`&reS>+(;Dn|_?&9?;wUJd@+o^N`~*%k?}1 z^X&!LpQyTHK-jq$*5116=hH_$v}Zu=s*M(ZzCV0#fBnJn?BpWAL2&d32!UUqcNVf!*Hii5g$`3>R!It^(_;}tz-?-i3LEpK(xrINC673?e=T)l$xeY9yf$W4~ zFy}oDA55h=QtT|TRrjppZdTD$-6i1olJPgoDBha=m@+G_V9d_8?#+Y#EXW` zGp{|3NfCK`4N1|{B}d_{#SL!_J#}SB|L&!;7e1ew+zpxL`BUP_otktcNY`u#J~n^8 zqj)DCrO1PsCA1|hNYY^O?Iz>~(!4E*Q*)Ohh$ks6>{gLAG4Yj9Y`~J_E-25p2^qqK z+$Q`?&4LYHsK-PByg(!^u%Rm4Q5%D5Y&d2%5Q^(anlJM9)fB3)jbN`PT^Hbzf4jK1 z8)q@94-s)@&R7@)Ci3Pe062Iw8FR)~J7mVG(#3!(SeQdeW<=yIA$d-W-%Vkt=pE;y z$;;%VPQ7l!9DaAzUWb(O{jw=PU&YYp%}q@j5(WwOL?W~1Hqc0+4481u88 z#NvpaqmMo4ryHp=24U20MG2bhe}k3eLv-2LP}8}lScTfUpi{8OHG z123c!#Z3ED9Qfo^Nm+afRhzb{;ihp}fPmRrJ_cOl%ECush*N z9rOChY8+^_d44`D1qxzascs{t4eaB^%Ssrd8bgM8C>26taOL^*NOoKDG<{|RwA~R8 zRa-%TrF!5)-C`m+3<_VBKBR=!x~J~XD_(ZkzNSZ`Q3-h{uJ4l-iR0J^2pIo2gLf-} z;9q<&3SjU$)<>!$^Y+NtZ_*?44$SaBr-C$8KX7X+=Y(KF+vgMhAhF@BryA7F*#N59 z)jJxrYRkJlIJDjo2UXhxuwJvs)rZF$)!?-WKvWr^h7Ap_3rcKKghg8Q^VM_A0ztF5 zqd*HVpKE-HitIgbp#F;GNBiFUljo_@9|-8_rRo!E&xnxXTs4EQS>bNbuI)bCU~Q#mLadRQ2u zWmVw~4)|7ijm?|tsldFZ5=tM(Kq`kYV41zCrYE!1@f6Sy4RrG#LC;3n>9`H<$mj}V z9S%*p`%e^W?xWgA$8yW?Nqq7<{DhL~dEvJE3ZvAAfv^S68e576bGe}(%7jq z`HCul!7b=qG~$}_JmJk%@J1T*hv_OzIo~<{Eg{FJ!cxeRM(3nLf;Xn?KEt9rdS=Q% z*Z8vwmhBuStK#DUD)Ncv=kq!#EL61i8%8=I^HOX1deh}!4BqI^un(-#C}yNWC7oz^ zFn3_9NCbq%?ihwSdS=S-$+Jc)IzPi|5vcPv{e@K%yjAS^)(QWl%UTRS6kXjkrC|4e zGQ^|2;{wj^7b&@=28nG8R%H0<;Owb;@K~)0)tX>+tl*8Ca)QyA&P6f0uS%V;V5m+D zR)*1Jtk>l~G^3tjBf~TkF2=KoTYsFjP~QDX_H>c%nvq6jE=k+?jqJ~|x|=N|^?SYGckUN%r~DwlR83wTS1HX0OvEOAz#wa-yB4b|J5InLS>wgeDS|wcS@u1Xl#tR6N=%d0y8R8{cDxWGN2nK&iu4*&$O9Dv~c{1<|^{>pDV&xG(F2%h#)hc%F! zuJ;bq85E4N8$4CA$cB`Htyhjzc}*6QST!x6gWBi)9%@Q?lGiY#mIF#x(#A|fHaJS^ zOS7(PYcF>-mna4gnl~xKv6#bayhL0t#ndhZf=uI(L|eWh=e-lCog`A7P@Z~)-DsC4 zq@+!|M27~LMT1ZqM_m$q5+5A6sr%}N697QUHTti_qBbG7epG}plF}gtHyyvH1~U~v zE}U>6ux<7p`sTiVyCi2&VJYW#csa%jUHyMW@Ra|51aCFz9|W&w{n!3Q>OVvlubR;OZPN8yDng`F^k$*w@GFjg9eyI=TnP$LFI^5j~B@A)rsm+DAANUmNb|` z$BZ^x>6!r|tV__7XdFdzA(J>Wc~o@GrHF&gMw?-Gj5{@`cDh)|q8wrD-2`u$gp;<( zmywKsM@fZwst*G-xJWI!OI08coEVR{~&nASUbNC0SKPnKM0=A<4wVTAb8yWM)2el zwdMao@L>M)lKKyVmmmqpECi^|O99on(EsL=`ac;w8^A0X(?8U<0kP%SSfwglQ54R~ zC@XbEot`d@5Q?Z8@$RXg1r7u-PCn2#er5WCs5()MC3pk*fWi;>nOk&n3eo%0|2AXV zNhpdCIz2ws$@0K|^RPqy`c-?A3zR-oX7y;I4-cbvI%u33DvT}TsW9qnd`?qMtr6*5 zLRx~xm3&-B9VUJ6^*Dy|?8ZA+KQgC6iJ=aYa&95x0<-*XL%^~{-MQ0Z74T}g$&ORd zJ&5OGV&RwO(?hxP+M))b|t2zkc$H~}0ygB6mcKFD?}JFZDwW zj8d$vIEah82-vsoRC?Bh?Nl00i%8)#1cx zD!Muh0KpUY*n;UwSFis)U@8|E1+j(>#@I?8!UoeB2n9xKq$9S}`wP9;g!gPilGnC( zkOdg)b+%V#lkrrx%R(O;39MTDjA-_X%{dro?he9PuESj6XI_VKJr0<1y6mDSfPv@Q z-Y&`5UzYw41J8Bc`p3A|m+yswDIDT&73WG2@q9uF3rU)5xdWWM>B@qMrD>BZ=Pv5*ZHBk1* zKyFN67o;Twp!j(#bd?TejY5*V7x4Ckoq0CLTvFz0!CkQ$;^Tzew`KgofNb_e-HhAm3KjX%#Z|0gaK2ykPA_~nsU3{E!gH3Tp$1WH-EY2}-$PB5+VR7=W*gH_a)f|dy z#(I{xM$g)covwg$<(0db;hi1WeA@+XM1)%hv4wHPHJBs@6W3jR(Y5|YicXa2#7c0V z69gs$cBW)x^FS*jE!K=>kQFkCldMZ3JCQBnjy`Kp&o*CRe0re179A&|^iTYPV)y;C zZ5!v74|xv1C&pY1EYs%m^)&V2DC-#k6SHcVJSsuhKAXJ@bZ_Lu*YrHsJ&#TKv#>Mdkx|QzoW{I4z`6AZhKHMr1@qP*GnT7$zUo z;3`(ZGd$g|IVd63cSpop+a{+7*6wgHAsZ8o zF`oHFXHKHHqwpAM7S5DrG4U|l3h7QICMHQ@s5yfzXFH4}1>Er2tjSmD4K;_=2|W91 z<<8I;ndh0~r7qGawpiaZV1u(FNaJ3j4lmb!AIC{Gq#X(pFqLSHm9>qzZ%t#BRq|R! zVy}MU-0lk3_^0ynSYx>hk_$ne&vQ)7jWL+pLMWH&UkLX(Oja@& zAIrqs#n@bE3@}{!OpJ518y!>oH$fdtNNizAN24%eEK7%)t+P6XEXJs4hFFw18g=fs zi{6)@o{XLNxs_XZ{T7%(4$Uh>wz?Czk8mFuB^@yGt9qW^;*VfVNjlBQR?-T@ly-xM^ zOBpHDPh=G)1B+c3Q(K~#r|dNQNZD4H+F3HRG00FZ=6y2CUeBeSaU$T#V+4qAI8R%7 z_4?Y}&c9=8>n~kZQ#yXP)s({s2YXhmb@m&uXb1!keCt#ZYtCSrG0NMZ5Menps?{zG z+b6(fzhVM4Ch*J}$P+x5;4l^Jp>CGz%dy;b2asP%-vW=k#zk}X9AQ4$^Y`Gd=WDS%$>qP*p-@I%VL2xYlDY2) zwZi~(gjF zKf4Z-@L`jLdv#!=8IqR4TBvJ?G4Ylf5&Ub=DLZJlr6_UE4y`}m9?VtgDI>7&tamDBG==zQ?mZ0=JS-_W+AoB#Bu_d2&eqvhq)rZb z=e|%Y8666|@8pQleaZ*#CF*T`vHA$M)~&yG)XbgX|?( zOcdc}MV*FV{07J0%^OTyg41q|Y1GMc?32r3#>^y=|3cqg0nm3(|Df+eNNnNmEW)`8 zg&Y(F@G3Ow!9<#uN&^@mXJh|5rPw({ z?p9BB95%9jg-4lg3~pwar)^Z{6=~lX=fp&z=Xw26eFmS`E>Ja2tI8r_*1v^L(O06{4!B)4}rRfml~NqJ0aN5f|$( zaIc!*9c>e1JjKhQ_)+8dS;>|0_;00O_}=>kte%S|5>G*vmDJh?$i=aCD-`^XdyF>P zqL%KGzG0q&7x`}z2D}P=omHEEEBGJmr6nH<$;(^WP6$r$m(1YdHhd zdr}e`2_t9+j6-B2$N|!&p?zE+s7fZE*Msfd@ebk13?iUuC(QcUNWu{QX(k>M3MlPmPgleEHGfcrH2t)2;KO5iNNcv7>gOHooJ3jT zRVT@&6OZ;FQUlzJyJ7fB{WAc4r#bk@ie2R3)pPjtYEvn-+8*3Q(E&i;0e_=J@%qX) zp4c({2l{U1^S?aS|4Fgh+%rOE1J(`~K#KMM%-)u>Gq86y{!gsX|CVJfN&y&HRp3W@ zQmpDF+WGs6n?(-iLI~syDg2QogP6q)-NfmepZug+3!y$jKltBr9@ZaJ>*^>2 zDTeAuLJH6qhA&hMiT&Robah`%k!Xy%<8DKL)I+pd8bllA2PW4?riX3!ida zC_Ox87F<=Bbk=E9RsKE6npFN?Fp|=0u=eqg-j>AFQe_@I8fjv2O+8Tc+dynfX`$Gp z=;TF*_r}`R(bJ=J5Z}0xM%EOSIf2e|n6zbONhV9R9ZFSWNvgamY^E>&uzMLBXypgA z%)sUw%k5Fecz+4;%)~l{VIEn|Vwc*#yd}6~ssA z9tm&B=^P$!*O=v9QjjVU%0lfX^w8Dr#T6Kxg&de1ZRP9beL6NXX~jq7)h20=W-)S~ z997F`3lrJZ5v8#z@dHoR!6jpPRG_&P{acmOFgEQ_7JzDBbW++OqCYe4=h-_XPgwQGvoD*gNqN9Jsmf>B_6`DqAl$xjEzD^MpOcC-XWfI^WqOTs{m9& z6@wt61Fhh>g-SlgH*yfyubwqI^S#zjir}^1Ulu=?-FQl6Vw+LPuenG4$oU*;W z7Jb{<;vS*XKdS3?8N;os#z}{XW6N#4dU*m0?{WhzmViZ*COJVw3rAkp5}ND!(xhlng|Q3)}?ai-3Ke z9HA3Ljaj+Na`q~*bstUP%?}{flZ;1xE+U90>?WR!jU#N6qNayFI3)>NhsMUc0~RPQ z^r^r?MxdfTz$#dD0X8C5Sob?N%cbZNXw`776HtS6qPVyv4;@3FGNeoQh!`a})XR8G z!F(+6`%1;r3m$pIb-jgbw0?2*|MH>4K~Ow= zbIeIEn#Mn#nUiv4lhAog*##cF1=$IG`!CM@e@35bHumTmKo%?lWLp2vSnvP0(f6-? zCI!L`YY1iJ+fqYQOG7X0V33rZR3acBJ|ZxYs!yLQ1$%@w?g~CSy{Xd$S&B+btd~N~ zOi9uf(i+10OhgK9UT_}r=h5j_F=ynFq7?t}GvCYNJ!{nvK_DvVt z!*SPI0o~>|{GX=q{CyhT%%}|I&Lt=`n|r~&sU&7VvUO*8YNO5l7h8*iV{FDot2-In z&HnKgwF?*9&E9dBZYSK0+TG8uD_FYoI{{qpP%&4JI|HvkJb+d>(%Kf0AyoNv@b`kO zwJie=@cmjev0DjT?{F~;+^q?Vdfm;CkGC!0O|SKciB)w_xcgIrVBX6iqF3k`-im$4 zO<%vEp3wq2cYC7l$tkr~j`IBq%I@Ocg*aRs7DUL#TyxB@>C$XzObHJ>NZrml*90Jv zQhw_jSexrTGFLmTkK-svN-lpMEKbi~9`EKBczl6owY-L+iq?>r-a1#qKW6dlv+!=7+8ph)ZKOBF{qxYrjJ2yk{NXy-sp^^jwo zgxD~C_g;u8D3X^>y;^QfK<#!nY4?}%?)&cgsRVV+V6017LbNrcL6syPa>ni^qoufq z*LIkyDyjgV%J7pNhq0xmB4Qywqb2EmLGHFSP8^h^do)!1zzV)g!y9`|n^r^ob%>yu z7dwe0&VhmKyp$J1u0+`@V0g>0GPelXAdMw}KPhiCwX9?wqTV!r@$snvBBt57NV3<3 z2%sGHYlC$XFsvi*#drQqomJH(qf8(%G{;8?vpD51@n<2ksSCEu_s z;qtpD7;ldP_fvgn0n^9dlsS^1ilBcAz4{P=#oFpoPUBSLuk^so9Td#T0XIs|;w>QN zIsnSO$L1z0#1-Qc;Z5mNl84r_0_ba27y!gvVSEj4vc*DqwrlolFu#Uvp7LX0-OJPo z(SqNO59+`$zoLE3Udbxn(7vkn_$EF5GSJT213^jHAyM&&bdg_UzH6uS?XKP2j6^GW zTw|!5A@ZFRxtNi+jRQxxN^IOKGEJ4LUAsTa3d@;z1yK5gD1@;;G!vE_P?(D)IT>eE2HEJ*k3K?r(9xwt{VflC9V1ax ziTzqF5n&>6pC>#YGU+aDe8ryEGMJN}(wUL;mG@nM*(-WBIJDUyOJ{&he4%I+bw^THVZh8)#N@obcJ2rs~vqg;JUO2|S zB>^v|WQ*RHGzFPd0DBOx)J(CmBkZQxVW2GDSyU#Gh;R2LU95M<=_mQgxF4fcZV5h5 zl2Xk(T1`8e@yl#2G*;P@BAjF>?xO)xl%_a}%z%m2&q4A~TE(e?s?%b1h7FeB9qsnQp;xxcP5vkA{FRI!Qw^XS4){Xnxx|fjA>zy1Z*eO<=Lz%zf)HTr75C z?QU(L4Ksp4Tt+*4)bt*7j24iz_78S(v3@Y0;m~scQMxf-0;r4;y z@{~$@J4C7n8wHB(Uq_3$dB33<%#YpYuiW8seM}Q>y?JRI7rM;In_psOMz~W6FYfzK zjKGrPR~l9v9#z1{Iyrl*w&qk+xdcx>@*hjB=G2YpGizX1(;u-J+{- zz1cF~tm9ceu|2ST2uK*I!E7?WjJ*&~Nbqkak{slnGQ?d%_z<2e@=ib_KwHe;dzRXI zX7TKAF0;8DLRsX}Itb({Lw`B6-+z{0Y=unlNw~F9V7M#uFSG>>ZSW%rB|}5X;g#LT z9j`{c(~dv6dSR||s=dX~`r}3%BX-%P*sm&f&n%V0W5DQLBr6B#t%fT|gEa<=$WmN) z1bBYe|MC1PXJo472qi(OMj&0h`6nhD&5;4R%+l!Mf$P{cE(r%R8K)yyzfVp+bLc)z zksMcP5VdSa;=^E-i|TjzPXIskocLMdd@Wwn8@+_Q@sAYjDF!u7J39pnAm>_!sD-je zsjcH*A4x$+)lNg<9Gz%sS5;V9ue36QI;EG^-P*EN zn}-IN6T5^(sfRLR+0Z5-Y9sc9HB<`KQ7=gCL@KK(aOsU?lF&|JE=pU&pVIj3ajJBS zzv=W(C0>O!9wkPmE_O?W^?qASV!mwwJK+{X}qJgvJIO;-;~Cd|B)MwE*x#3Eqo)}ymQnCn-VsV)ab6q`<1rl z_Jm!|scj*M}dER52sG~P& z8UJug2ur@4-Mvkbymh|7YrmioqXh26kvwV-*vxh1sW3^KbR$}OgT|3C4`-`#w$GyN z%Dv6#(0KVZer8QYXjO4yVf^Em#8{LiU0Sd3^+^?Jfx5UVRS#!TZG zgOeHGXJJFO(wOIOo|REfHT$l36(T3uBbgpYastYHvt{!2b~Sr5IY7l@O}ku^Q}Wes zW}dZ6Xths=+*l)xq9T~I3ou%_O;y4vr%mG zxh2C@5kDvz5aFThDQ@Yi!m=F9o#b=Qv!)AAdT|mN8T9%J8l<`x&*BZA7D<@J=-gH_&)E-kI+bc>PqwA!mA+0#3853Fug!V0Xwk z$BrP`v(mqGNid8mR{2|E(eu7b%54v*X@5v|gh~w>9vkPh14YK7A)w>>MCt5R~`8$QzJahYGrL~7%J!v=!&1IK~6A@TGpzIKG( zUa)xC!t7KK!jW5NqC!$$QJNDJ$;6_nVum0H#6R+8!@I%IW#gkY=DfD9gF}+sdD7(4 z&xDRpqE}fw1wc6Py=EhIo8D3gK6P{b@(Sp#>BVY2yBTxFTw6|a3%{)vAb?)t1 zc=1)bs_E5w>^R!D#w5-7$#vnU*8-Ml0T#Io+{1zU3JbF^^{38bx1~zN4a*f1xWlIk z*vFOIP84Un5-zj2V1GTF!R|NQdR+YL7eC*S#S_K=jY^KTb$TgZp2_1i(Ieh^u^da$ z3wGZ3Dr%R9%hYL?*ePEV&WH8n(y3oL-a^Q;-9Gr|N%5mF@cU$#yTyWgk4%D3MsVo1 z8r(EaX`DQY^z=%s#qQ>gKNE^3=FR)`iApE(i4=QVh#w!kM}D;*THr_Gn~unozChGX z9GWR9Ibfeb75)bPPcihLSx6$!8Px|k9pK^q_(Ac1Hw*veAx?33LmENp-O(IbH;l5b z{fT9ikqSZ(fI==q5fUaB8+WO1&@nBta=$*BtXkdZU>EHGGEdqCA*1BcA|bv|2r~=L zme?p0GuwEUv@LT}?3%D`{VulgVj^~L(G@ZDGPHBTR*>f2^RkU?Ym)PI12~@cioV8x z-`w_^u#@(0;o9{wz=7L!f>_=Z=DftZp@n%$bY=`fAl?w%=_1|`-T5Hm;ok`$;t}2% zAmS0&|u_$ugsYx>qx}BLi-KGykaVsU75mNm*UMjfU_*f#M;(pknla?~hnm@xR5s?H*5T;0nM52rKip8wUqH&i#UBV@^%Pi*b^ z^--M2vygxsWGNY4!~kxtpD&aaE}BTMIS49V*Nz4QX{ z#BYUO<9>Aav!wybHe)D=nIDi|DVBUl`)5dALH{cH+pp3IL=LiV3bG)pDKYmD7M<*^ zApQmOp%S37Lfdmi{EPdAFMtJOMm8sqpD>8GCx_VigHH0+^fdy+pm(BU+Qv0EVZh0; z{V5#8H>gMA*7Y?6-_&dUW15Sl%p!puwAse=m_#h!t(${aWcs*)yGASIP*0y0+)x>#IOr@~8C z%$!NhlU0j~(&F!e?taoFklPr;@-B57VJhmW z>)gVn-6nCqw>DHJ+!saV1^_-1YZk}l)nj;w;HOFhmcY#F7;^}96K22aQj`(;kOO!Iapna(-;b!b zlr+mww>S1!Y zCDjXk7|iZuRP|HlfPNKJ;D;)d09?CZlWr@Rr>jv{U?Rw=&{<*SK-DD(TEjlauV@0s zLoa62(JA~ICiJ_*NH+&j?qyLB=psDhW$>rOk93pXB`3^HCVb67C#Xb&b23M%$2$(k zqe*Zd#oiy#4i-!wQG56|1_=wl&_(7yI7E6kj6y@YeoCEFJsan`fl1;robA}m(jC9A z?0*AUwZVSZ$o0XfZ<_sjO!ad`2HUj!rL7OP&B1ruq(17xKL+jPXn+fQ@K*~+YRdAq z`OOcZnVblF)n97J1>@(1seax}Ct3^!YluCa?#wgc6~6?1O)O5A73}9L$->L}{KU!Z zO&f80w~NbTILD(W-I}Wx>(ME!PR!|qss0@HJA@XX6%hc5C6Bx_@?e|iQD=QWXR39Z zZD9mX3g{-OhE_HpFwq~&ttlr4mih%_VmV9S>rH+$g7f%;IyhnV8NYZfB$bM$vWMYB zlE{XL2Zv=p{-t)zV({p!Z&HW_!;-K9reK0(vd??7??*j(ZFq5HcM3xec9x$pnCs)? zBYJU3qyZ_V!!Z?pIE&XHpd#JhsB4nBn0CC9vtD!eO@)5)%6&2XsByWrH&$E|SEp)N z@=8J(>SS?!7QIQeezV;R&HRIY<^3M99d}rX9SP0BR4Gs~StgS_eU3r9fIkXxCxX{kDFQ&No9puE`Iq*h!uTP*64_#U=7 z+gJW*g>%SxfbefLy|{osFvpTC8BNnQgPnr7h#u{G}&Jj zx6PMI5-fyi3?mW`BNk^g+#`PHVxpb-f>{_xYmSu#A4#SqOAY9p>mQ$Efd88A9mi;$ zY%BsrE7WjR^$suF`CYJWriw}ibL1kw6=?nvE1M|D4&Q6m zsU8(IQd?pJPxm;Lt2^+cl0a}}*8A zbsvqe3w*o()OKiwi*hHr{ZZSMpXSSUNTdxa;Vnbnk|jl~Z=Bbt-k*Yh6e086SC0)O1>gU~-qvC% z86iqlNz|wRnzwoQEwBmDha$ zYzTA9rnDGix+)0J`(9>~Wii)^6F6?yfdi$J_MX;|P!%mbKeaLa+rKecS!~LZuGJ~1 znpJ;65Ph%420p?d)yeZD*ul!8h^h2b{e;!U%NObfDMUE}@>2P2HOSJAj_F3dDPL%_ zLU;2i{VFvHOwg>Yv;%-fk$FOxwlo%Uwm{YCrK{?d8%o)bo}cd2)UZg(;o4-iR8=@M zBc>~BBwe2^Mcd2-w}bzH3|9xwFZ^>5>~DY_x>xK^psjGrkc^Uer|lOk1S&R*qO2cU zL{VDqPkf9rX(-zlliSU_5XPiz^^GME9On9p38Hf8RYEaLe;TLf)P`Ck@4FPqIPlbr zo%cRrnqAnufNXM8n55G*V`d@Ly;^)K6mDPbNKZX~{jn&u%6@miW6(Pmb@RE`V8(>7Zlem57jo zy`6OaiJRtoS{bU=6Bu;!=KE3}svD^lHJw=$N$|K`grA(=f)tz3mYGxm;zU)1>Vuef zBJtXWwj&0h7c|V|w&tbHi*`*x!5=BCcM)GVx zI5YA*vo)JcLL-OSkFuJK6sHZIeq29g5el$zf_y?qNXk+X&_LA%aDO*^|CaqAG$2C4 z{iv4L?*|jt9h>cWm~|tQ?aRMAzSG~|539b{p76bx3Ke^(aO-vz!EkQ!ky~J~y>s;=w5g{Esuf*4Lc68q^s{x$YdrKv5 zPv&sN_KAF^Zm-aAFL!o)4PVsX??2$+?oUqK+(rXt4xl>U2?Kn`0z&SLzq|rNYHqg+ z07w;G@1&3#_gW}D(^=cw6E>dLULz<`-=K$|hppO+u2H{P6i7i87AaEkkekj! z?4JrEPD4m#=U+r7a*UlDkuc~TLXAu{T$uENLZZ~8I~EH`t4PEUa%a)Q!VG#-Cy=h@XUgJpQ425QLjV=bI!!w42+0O2f{?{Amc!D;{Eutg-%%o;y_XW zMsJw@DmLVBz+l5nD24%(!SFg!oSC2?(&}COYrHB^*V=jlbdb8Zzuhmx;y8T!nduU@ zzI(dI5i9u4X{K6j?JX$dTiD310gzNx(nuMU#ED%95{%_HkK5?DL60JWK-j2!Muc_AH9H`1W)ZC!_H0@+oTcvIynZpdX{4p_Y zvBT$)r%`%Pk{ z$R5b4FR@{7(Aq??lYA*^{x2A;Jo!Y_si46`Lg!z|aWfk#>`5c->7T>oB5ESO{ot2G zRAZNdOM?1ED|-0q!v#e@jW)qSkP?s)wyWFbl^F6ij5YYjg#>MwM~qDV9AYD=>$}tZ z79Q4Q`WS5H)-PGR%hkWv+Oh)<31x;O!e z4J847tP-;_7vFvK*XH|xO%`FK2-dKR4lCWPk7dY8kb>|`VZ70lyl|AG5@NJQ6h))U zDQwN7#=?#Z@()7aKjm`il6SdILESsGgbGy7DzX}LCipEang9XQlk41~t+YNBQaj1n zCwc}KEfOirD0&Zak7G+kAGusJp=RikdS}Lny32TQmQo=jKzsEh%U)8?Qo4Bz(ab)XZ{Ww?~NsUbb?+Erie+5_wjEL}F;b1M?G=6PC;$(F;gnvd?T(hlYU_V%zj6!qw{u!w&`BCm!byCHBD0TmvlJCocc{{f7}wbZ>JoolI6Vw!4qA1ILU^=v{;k2ak} z?;yN@ygemZ5(ZoguWU(Sk7933_W4Y*Yo#Ljpwi$$;y#Jz&{bns`>OAmX8Z zzaEq%KH|g&8IFl)g~wdf27=MbXkUWqt}x9lGff^Vi~v(f`ZdKuZvt9U6Lx?HcuJt; zM>##=8cpqV$(o83>Er!y+iID-T+&Vxm6 zz4p5|>${?eFYYH@N!G*JH>iDQbTQPOhbg~YHA;c|kBU>|3@JZM<||SzcK_s^Bw$Rg z=0qaqG<0XMMaQB{a_Mn~vUgn2_Uz1=?R$E1j@JGZC@%AdGM+$M{#c)r-ZIpND}HZ9 zT-c-r_D%x2kSllgTG$VGMQkv$;~zDTP0|JD+B^5=$~l$?iWI&){F}7D*qqX+6w;1W zC0HRO%_$|GuY||EsKV#b`Y~S!DuGtz?5OQv?h8i5LeahSD7Wi2p`bZ!WhF|{qFj8;^ZZmveim^4C|aU<*k6$eu|#tP50 zU6qv5?n0&XaT@#Q|r-O)$(oS<&Eu|Vl)~7ZtT4n%{9#@k*u3!SaVUL73y9{@ zL^#bpA{-4t-@94}w@B(Mm8SX}#f)MoDajV&3lX#@+ljVWTZwJ6c2%Hvq`@Z7SXP(8 zBF<@^WLzQul4?SNRko8il{&z5(-mQKo2ulB6dEm593R0dkzbX3g|cajrJv1qfMXN`s;% zB$XtjDOwh18a8-D!VoUvB*8%_W5$=W`R7IA7quazON4(_(?EQvZ0SP-trKJuYm~>I z@X8>MV8JTx$fEo`df80I;yUUQ4WuX5B&s`A6@+5DAW7DXQqV->1bEqWMiV;+;3h97 zb`rJP18aU3NOGh)zp@TEy)2T|uYeZ5Jc_ZYw=Q-(BTeX*&8wW1Ea?_078twFpEM>)8i&YBQdSjWc2cU5 z)kFyxr3(~TF*Z0kNMvox7FagRt|(ENo*}FJobBIpLn>d`;|N&d;y@j@sddR%=)j0W zwM!wBEm&_uY%*j?4rRFwYibrZS0Jp{A1rOI_8?MuaHYhmY~-OUsUu~Js%-vQl%32` zp17~mDp2MSSbJ!s;Q6Bj4oxXfdxK9}xcswnuSNo=?HY?8?A5k<~u z3nBB=aqNv)FD$c*wpL*U`Uoq~r|u9yceOI;#9N8mnNsHz{8 zkst4KO9EH&?4Tgzprh=~SZJGA!FKrL@UKreBYbiMqc#J{7UO0AfJ1j2?S*IPyHk1( z+-J{!?h5h%MG;5~Jo+DuI51#e_#Z*M|8-Z8F|ZS{adL3~Zyt-R(D%_~=uBUO$$Vpc|Ku52cGQgKd;Rq)R_01- zi799Z;VFB)owoLo_L08z_X!ZG1WFYW5dm8x=N%$K5gLVvi`j?dRgyqf)>KE!Cm#%k z&k*#Y9ZYsBBp!6R#rsBl&EUT~!7w1)=K`yE93uxe zxoAJdy;!w4ZEzNv0<*=OeU@#Yb@8q+e4qJFC}cKP3vHXWCz^k&%(twRY*3>`StHM#A4I_kc9jP1f^k>qmE2WUXR#WG7%r-0W6yaN4<~g+U&*tnG37dw zbV7{7q+~(UVyU=?e@X7cid%u%;g|k>6f>FpSaNg(jhe zaAaANruI}kEYX*L4!pK)`H@jSm4+02{ig-5TRzp+-pdhgUG{p7TX?UX2>Mt%%iI~*L8szp0x z(j&OdG(FR1_WPn&#FZ|Sy?^YrW+=1jxYauT- z)c|T9qpI$ls~}WpS4;LIc^nF4!#YLF3S}pG57*=~GqgiJf>@8x$^Vwl`uPm?Bh=Pc z?>L2*;W5MY?&lWoC0Jx5aKi~OZ?B-K{^JU({`FLE2;-p$UaPb-l6NWO?k&XDMuMu@ znQD`UH_C&u6scud-Scb5+{esp1kVDVewl>Y?-hynQHVyS$EoVaI@re$+bRVj??X1l zaoa-tIl86*+onT~)gK9W$Zbx`ulF30W$JhbNIP!I?@~UxL%k4SzGAm+R*Nej_KRx7 z&M4;YdIK~V7@t&yJ*D=--=P0}Y^@p+w>$&*;U$}Iq8Sm9Y)Ii!xY?*A`D&1YIcwBND~y?Oel$!dkJ?#dLJ<-s zs2+t}3NlIvXJIxGM>DxTNl}ub=v}Bpkq3LubP~IY!#_ ziqH6kzN@s!Jvvp=^@!myDrEY$W!kkU4)<{C$o<}#f}2No`xvq56_!Eg_<*wfP2TfK z$)6O8fd0-mzaLPsfp##U$_sLDy+FNkrerDqlp8;w^>tQx0 zw4*lK#m2;tSAq;+c;}S}+S6n$FSy}C;9cQfDu_c+9iE-T-Qew}u`#p5V_ajR!`=*} z_hn~`ztjrS>PEVoPKKs=B3s&te8BoQpQ0a5|75rZ+g$Ibfky6tvl_(=+#Le&B zk%DBt7l*eMD9&04NegB4fAeP2G@eLP!h1nsC>y$qH?>osPA1A(tAz|sss&nKJwMQ3 z>5>JOQvwF)(c5KmWl!W+xN7AKku&Y4(qL)1LM|@Lv`eRbj0bQR5yqCP)Z`AEREubq zQ!4_fk*`BPY&}w4nl|f?(;@tDPNeA-(kO@*42>Cz2I>`qRPj`(-ati#x5vJZF7-jo z9EA06{9Hv26V>AUrvB}$S<~rwo=}Ir465Zd7=xTvp#GJ=XdxjcCW>`74QmfG$g)N= zH3nJC#ia>p%E|77m~aKTXhT`{xuXVCUhILtD}F>5_Bv@G9?!bsr30!$N#2=Vnh% z^okXT#fx-jX;%PG+){J*XKKHO9Lc_d-AZS&fsU^Bj-*6x!AG>#cMr68+%Me{zIl9= z4GAvpC$bdXe7>sYD0FAXN5ah)bWe$rzDDStHUXChP)+EuLTTu7?ny=iNgPx9hp9^?vWBCOQz26+xr1Gk!yL#d7R zltNePq*|P0m3*L2d^BX&;6I-<=~W}Iu3Vsf@XP?HJ$@&?C8|6OPbn?Z3o}IF_h&I6wrF4 zGSWbWyA&TfjkhR1{@T(J%A#!sXrt31JILnS&IyyVM(Uz=B9|g^`k-vj3h1IX@*yV8 zX@bIr&2gOtnPNQ6_;&F6+9QHc@{r~EC>6&5S4K3y;*@tZQd{l_r2}+4UnYXBY&c8l z7gbf*pW@rBLGoG3I^Qdfdi{8$OB@#@XQV777SbtdVavuOjzdMm&mKP>G>)SL&%9_*HfW*>ce<% zq?$h@DJn8No!3$QWbnKsr0E0NCXd{?_Mhc)O1_B?Ux!aU;&vEhq(!z^I>ll$Sw>9hWbJ4lNE&n&Ed99*xnAf%;N#u64dVt1v5 zPCYD|K3A*QGfR?+>LecZSwndKYBsV~^vU2d!V>Ivbxwa2_@n#q<58jfqNa}g=Xu72MdG_r z;vH5Al)xBG6mVA0VYGi};0%GOQOUd!dsY>mcLopSaS54WDz-zO%b~|f>SGZWP19ce zLJA3Twi9OEV~2~=+l$wzY2^;p8n3-bn_J!qw&cw(*)n5Li=cClqh*BB)*(DmyTJr~LqJFgtFes47xO&4~8K_0)Yb;!nI+ zZChNKL-i?3aNxWdDFG`kkK!oeJ)z9_FlNGr2e^q)OTOY$oAO?qO1Z*~SgXdp_ELnB zV?muNfWbi#Af_5xm~(V;QeCqVIf(ltk>NFz$i6djUeMmA;h;uo6_8@vkK7((u4O1m z|IzYr7Fl~MsD0gD*>(zH84uqK3$&dU6vEy_HPdPU2iAHBLo0%VsmRt>SUPyk4t6+(% zAU%0RnKVVn`e%!~j3%*fPq1|PRHc-9kl7XnO%UQT{mC-5dqBi!=nW_xZ1dl;I0hc9 z1ey#wsP-*P`vaCg=?xRwp3Os4(Z)lAO#)Dez6@*q1&(@4yJ^bGjZhCe4To>j^`l9^ z2DFh?kxg4;9xbRILJD)#uWH%Q(7#{Ad-)~aSK}ymQ!t)1c1C(!>1xOk-_Fw%r!HA+J?>foyo4^%VNyZ%6iG&SBs0#=`bu;|JabE{i^$N_^4%R|)C* zt9(0v7v!cv0RS+O{%0?(qO!1ovw^JYe-pbgsUA*Cq8MSjF5V;Q#5e`o1O)sJNP*DF zikZv^fv}Jfzz+0kT9xdQ2ni_Q}U~u@etXT)SIl+2X`b zt4z69mQbU&|pebT>Z^BfYIPF8}=Sh|KnUu9UhQ; z#VtyZo>K&dQcuNCJ-_3oGkk|y*3O><;>#YOFQ3il1imzEI1>E8O;24$;&lk+QGe|F zMbnE2&5kUE>P}+0pLn*d_9`xnpH{ZoyQ#LE5W+#_$=YaUEE5+MACl09AE9=8eS5X! z-#l-CT%Q{ICOk(_}k8MuVim7{`kt02~4PG2#Zh__&Yai_LbkNfZ@ zqhF8QU14^+!>0~CwyDQ;0>>j6fam?JvAR8Lhq{7#UAB^cq*;Bv>x26vSaXH0KJ6Ql zs>6aBkF?Tce$Cxh5Z#1Fsg4fF7gAu+`!lI{U`YBsj|1XvhI|pZokCG zoq&(-*?^*7>Z1YWh~z>P0!dw05EaI5!w;Wt#=&Y&>(^3L+pJgXN-oZFMYoe-Ub1o# zotGLeV%sAAg9@>(o@WPl*`^K_ray1kcKCN0&9)C};1Z$J_%O)n)jkCu>E3_~-}P9D zuy=JHF>?lHTDOK}^D$ewI#177l)`e!gX6|KiCW7p-%ZUE2YE4Y9zgW~gOmh=tIZg+rT*Tic?*Drcx=X^4f= znT1Qci(6YPq!umAsx6F)$hpR?y^~veEVx!R?9vr}&7r_5XsBgu$VKpMyH(qvy!!)WzUA-t!P8Rq44wSKA8&vg*8n4Ee+Tds z{pmn0kK1~+se)@xXK!#o&je#97`{XHrY%l5#-AL2tv7az-fN0_Xv_bztMH#&!a6#k z&99}5lo9}d@PFtk{O>K{e>Dq6CE0ItU;x7(xCX8o!XfaUudl z5=dan6N9wAKBJH+skr66FxJKd=hu#z4;%s65%C$#U2nRZY6k0-+(8` zi2aD)l8=}Y=On&`A3!JaBzlS8peNLb{Yc(2kL-y3$lkyw_$0nX9_$i-;y=+t03nGc z2qs7-hIsYgh|!R$a{j6Zr2IYCf#;Go#_|X`LN${QyTH1OZ?Sv|&QQ`!d$kla<4MdvN60|eO70Jf zp^P3&T@9hzGO?xre6j%NPI23`nAZCQ%9u=&a0S4@clHTIw`(*$pH}nN3*T z8?g^>NK?1kvQDGrgEQsJI08)db*N_jYZj5+l4Id`t3+V=-i?=+MyEAf*ZH6*j?Z=R z5bF24o0l$KC9O~6)(VHoX+$j;q_Gd2vsM}WGVreYMH#6%*)HN3Fb@v!q}~(nKokzo-S(E7X|I4UuZIF>5h{S(!{eDw#}s4 zBo3TCXJ_$KGo4xUdX-;5%YVe!t$GbGY6UQHF|MOWKW$K#zHIiz$?B>-z)!>|^j_p7 z1`YOHJ-_n`XPH^qgq>L7y>?}mIMB}T_KzkY&xzUn9tFLDj94>c3GxyaCzMn%;F;5e zuDO-C{1$ABwWY8Q&lz%MlQ?!Y4om6GuGn6&M4Gz06`ARgy#*TF_r*l>^yF`0+=i>I zso!0;#x%+ZVVE5Ml=ow+V=NlsB4&#@sr)6&_NgaTF$G^ewAMPwJB|zGBIMQdzS6zv z0B)A%TpScr+H^Qqj5biBMp)Lz)JKP7*P>x|CFl|d#;2ZNXJ^$7!d@T2x(evQx+3G? zcZ?^Nbqp_#I#Ng+A{G;mO~fJMkaY|^BA%c~LsVM&@cZC`p(_=Ayc#Hcr?=>4$S*!H$rnV8jXsW;rS&0v>nm$2Jb{63AwCz*?# zruMcPr^g;xt*-ClPC<*0W+o#8>+=+gpc3dBV@WyK*RS47?*!RXvD(!$_#E1I=~8MT ziue>^K!h`z>sV@TnbxQnQmC^uQk!!7d5{|cif%@15QF}1bfd36 zHgHWNN?sm@raGP8w;mToyNmYwoJ5cJ@rQPirOjbt+zp?)l$j$*y!b8K${e+Mu< zs!r6bgONv!-0FoYr~|Cs6L^9hG+UbyCd8bjhk8pqj6k($5BH3BxMV?&nq2o?%CfrL zO;rPQs4nq!|N5v99YSmQbyfqR!O##LO6#tAM1!Ki(ctU7R?G+U{V*K$SUEiJNg*qj z9Ht9|qbm_Ma88A5bHE!==q+%ndF*JJL2G+lZTS8k?7gma;fG%E-LW>dLOp%~7+b-a zB2=+tM%V`riho4$n}VRn*Al44`|;pQPz`1Oc}zhYtS76KPY9mH46!sqKZxA`OQEZi z*la+L)W@N(ZI0(r&JI8i2+?iRxYLotxaDn%T!o}(?flht zsCN+I#h|#Nyq??WQ)5hu(K)oH0_EW^_Q$W>A#QbSy_WcFRFf)Dso-|SRnwfq&ExyuJ zzBW$3q8Hz5soeK49_l5I+9{2^{N68u)u)5HOUCrgV)6O=*4^n>w&HvDca-}i`+-8# zQQ3Q;uKcZ(j;o%OR=5&6FSkM2-kWOG#&?s39ae+w0^{d7!yc- z*lEKayFtw|W7tVUAN@hiI^&$Ak@xxF7J&(@?2-5J;1-1mti+M`_23qX2~M`C=Lkrv zrbHIzsOJhutEfa4>Zs=qNUN$u7VfC$5J;=6L>FDOODW`4SCY$5>Qyz;YFx=wrl{u@ z$V=MxP5lPhX{Es1!P)``42De>YPj0Jwfhbj9Gfd-ba3eT6LCZ2%&F|rqDC=7pjcWs zqxlr!L+Z@`*tNq;#c*f^i$)A^G6&hC#gtIOq83ob_K}!l*|j;jY6fj7b1n1@Lh>63 z$xTM&XL0D$Q~KYkQAC?^>2p&CKvtnEHSEd_eDVXHLpZ8&P8xjYC*OszvB$ByH_at0 z2Mn~!-5%f|4;j0X+{7@@CvrYvutrI2$@rQ=9RfBY#H1cp3(WR+JfEt!HvMyBys#Ij z_I600uC_L#b>VMp1mq5PRG*+a+F*MKZ*0Ws(!IFmo$d_U#b7GHr;0aHqNB035b;FR zTn0=ma7W}?ry)nIg*VPpi?OtT_=MvOo?QpxKvpNPL&|hHld;FAGT1Ylm>xr72FksZ z6o}lx|0EP%iK>@STXTojNQcOb4wlzVy*79Y(uj23rQck*qSI$OaHwmTSX#9h>MbJzdTG4(MkPFXZh6ad$xJ;?|viWbF5V8uxSk`h@-4{^zJMa5Dn3V11sI7*6V#YtO=14%!;uK;j$zT*FdC88_5*fdbj8}}MqR^!vp)JXlSHvnwrlmM8PFy4|!AVt=rJ$Hm zoK&DNfhPtj!FpUsmG?IF8E`tk>cLD$wt!Y`=#O_JYh*4!=9qJIS9478cyaXNG0=+4uF0(FZ5EV>w(h6N$ zJ5qJi_Adx@hULSck%|p&cL&~94X8{8}4w#Ic>;Y>DCdW z&a@o|bSvZBalK<{&+%z*mO4%7Fm~;j{7ANFN?|yMG_5F|YsPHU5*tSBdKgbTz{m+V zcI}xSp$>1zzFYKQ<&3Z!N5#-h&4_R9Al+l%v>i(|0Nyr$#GXocpEbG@*U9x@lcgSO zbx`y>Yz)@jX(#;jN~Yb*cGScgTDG9Z9!ts_wRMQA9+-DnJ8$3n70dO&e|rRK&sG)c zrT*J}MGo#wa{7gs8`xQabH?h6ntSZ}ksjZMPdYEWk5hJ`OdpRsMuCPtE(YNG|HuIS zhjV3^W{mLR*ST{4E7)lN2eIaCVryh!EoZOfY~XD2-DO{l4+w+-u9tjp#hDdQ z5cLonjdhb)6~9T`BJzm)6=(3`s}j7#3*xNelElB^Qh6=n<8i*7xQ#ZFd6M-6{WJkR z(mai6>Y7@!)5WSODk~V;Bbu&k#+%#Zm}T9W^_6L5hqgV(ref@=mB6YF?@R$_Q8pL1 z)Pbgn&)C+o66tNpnKd0=z0Hk-e^2HK0_-+6j@g8DS>6?@fA{`Xwi@V9O?0a)Mi-i1 zKHac{Zrf}N+yVLrBr?g^mchtWs_r z|I4<}#K^bJV0Y%1$1iRcHL|QQ#b}1aP+8v}MGLw=GH1KIrgLI5x`Sfdu2yxV>6+bB zB!l3bpo!6SfSpj#{`YstiXG)$A9=oli?*&fwcakSZnY{n^2$OKHmB|JQ>6znDOPj_9Z_%a3ecff0So}Jx&0rU92(#F*?b<5 zQ-!d58fb&Ffl~(;>nnzOv3VozfO)(1MPQK zBU(Y23V@yqgiA_Ivw^n-}!bb!KJ>ke9A5ZFOukGs)Fd|oc3^;qzI#Kn{!Rk? zf8jq5%=fr?7X|ut`R=BQ0^05pAb}`-_tbI#n*{oQZ(z#-tQ)|_vqy8vv(zBn>*w78 z_#XaftvEOq1)Z=LDyCWq8vNuy5x%u5@LOZ~GX3)<4E^;{d+rqQ^o{loud@KJNE7bc z81ikT_7v0&U6^NC@UzUqgDuXtE%?*H^&X++4!QG>b|BdeQZzpIE@&piM7cQwO|gw?+fY%iLDam12SwDpqXz_N zVj4I`4%s7P8s331W*XenhJ#{x#bU~y$$dO0MaNIJ?p4tAjP6~~cJ~N&jVIfb-&xz{8eVJTYzuB1 zUU{SN%b$c&e2e4Fq)heu#VLzJWR}EP$DWlZ#rJ)Py(P-KL|b~I+LeZ zjxJ`QRz9}5T&=;M2{5HX*ka0Hr<%o3xlt-FWUpJ1Gq(|$V(Db;^N2cj^^(Q1J#rx_ z@boIljlOF1R*T<889cofN5KOALlW`BFCw=LzPlI!uYqskirN zn6Gj#$rPXvK^GreIIUHsA_E~GxOkH}*YPRA9N zX(RU_RhEmTIGz=eaqeREu_WKYj43s>rXm5X6o9zS_3Os5;h9tdqc?jSTJSQ|&mXp!O@?HhJR z)jSag zJ?b&e4v%?CaL8?(9TxqF5Y9GVFA5d~h!#X`NFAy^tnnG>Td`1gwubc;sw;mk65}h? zr!=l-iDUWX^$skDcJeLmcd(PE@*XAXSCYmoxwwK=qCtGlc_Yw#C#`2%(zme7@(%u` zRAhsqc#azLE%LKko&p}M(cEBewlGkbG~#!r663n`8}ZsQ1na5~qpBFYFn`hm=_({Q z$yAj6%2XUERJ(`K zkDqk|#-Z_7#;}%+{*&eTX=7vKy-_LS8px!}l(n}!J^>VTdY@+6vxf}V`Krpr!7>FR z#!RYUbNnN*#7(DGW;*5JGRdeE0W{%Ew=?A>j@##`pm&vMBOEcZjFv;5G#Dv9x!KN0 z_sC^jJ~&;S*>O>k+0l5mA2Ia-FQs#2zIhXU2{w0pJ7v+eGt&%0ll zE(+4dk&XM5c_7|51jcnO0|T=+I@Hz;)s9xGiKYArmVtP7sOG^kezTt!;$xWe!t9e+Vz=EIEMkvT(CKYBW&0!{R~58(Dr;u7ON z>fG;DKYrf+OAmFEP>{!dKW<(tJht26PwhrlR;lJQTzZl8!TmAapTYZ#DmACW8iGBe z0xOjShHD2jLj{IU2E%a%wjAkSI1l)kAKvnBiV9GZh2M%Z9fxHv!*Exz=x@iiw`I7? zT=Z{O6yGx)<^V5^3xFm=m>(%KnMUjVw}dnTsWyzckbHpQSTvU<=rn`d{wY+u4qI4!^D%^H38>7n=;`))NlhbsII&2`Y?+F7+xS+meYOjzcQdTe9(A&` zT`vCe=WtibY|%%&=>_`7lZMOV2g{yTaPS9g*k0Uy*WVpFLUO@>9U@|K(ccHA0Knc3 zf+y~5WI<^}TJ%VI@O3cSqpEQ=KtvNiE1!f_t%mX*p>kMZGjV3Bi#cv59M6|+{~{+* zy^lTyY7lf*kXFSwL&-YJpU}U{Q`V})9$9$xLBnz?dl@fmCDmLc0XjUfOW#*5!6!pmuGtJfoN{bpA%yJId zD#lGzsh41_^hwffP_TMf#*%2USxXVwbU{$iq@AWg{R5Mo&qOw^hqCzkBXi&+`$bvs zZHoS!GIC)OdjWoKS%H_l);j6mY@@~WDV?*mEV+DYH8F!twl(=%nF((R{5psBQwnsa zYuVMPb^@t_Q2)%rbt0&tBKwda!7sWbwj;iGf91Zbz~Nc80^Ez^y}192jH-)0qR5@i zVBmQRM}b5C(DS%p)qg1m-f zG}h=7b&ig6h01K3j0c=;w5mw^KuY6k!s3}Y$C0GQsdz_!f@2YtNe|JnpxC5=+9XG8 zGO5_4Ol`6gF2zi2GEr?ZY;1BokxBF@NeSj*`=9BYEeq|dSuV|Bi;}` zQE}a%C1uU15liKYdrj$vCzn9hhC^K69=pf9HLt80=wy@gzQd<#1;X_Pe~I}TD0iU_ zzPyN+Y(Le86Y$Dv7;KW%Vn|~Di#4699j(nsW3V|x%RJPEXjQ!18bOI&|BL8_|JAS( z+mk2#T$DnV=e-s&p)Yat!G$wyDq|aA%)B30Pta@Qv#i0j&XeszFL-MB#l0`bx6J_D zjv)F%&HP6AKd$00`2VWS4S#EMHC~QXso%~9@o#<3^FP(*juyry#=<797Dgrl#>S2& zPELv@X1}D9|JOLiR39~DF_bVrA=baf8u{UXDTXK&umTW;uV|IWBoq;V)`Au-Ev^!w z&L&O!SGMNoZV%a(a|*Kmi*w>-);NlgMA&|MG`pSAF}LM)I&1y?eLB|%uqCW9#HdOr zPE=$7p$FN3HGpZ%g2WL6h6j~^ZYUG(LckjAPF(6uBTVpG_Y?kI7%79gTfT0HA%41K z_4||5EMw$&CT7qmw8ML*g1AO6SFQTUcYA~7>S)z=!D*V2uI|pKX&8OVB&^FeKy5nn z%f2Pv5P~MX^?cim9es|E?O#l>&1#|)IG$eR?Ug+li-Z)#R10Gn>SO85+U1JPjWyOL z+H>~Anq+8;345vg3m59G*%FC8aDTp;O%~Tw>V9YT`)%&}6yz>ysCb2`7np~@y1AGe zX5hWHDtiqUEDZ1z1Bm1(o`ptegL`d}Nh%(u^@_dggnpf9Dd1E!V>J3jtC{Ls>Uk#0 z0nrdc<<{YBq0Jii5D}flMS1aeCUa)a#B--fM0UJd(p7X}GTo5KHy=vbR%4BI?L z;mXFJ8CIdIbQpRV7xt~@61cj>5rYlXjtOV@>D*;8$|J*n5}rgtr^Syt6t{7{UDxIm z%Dc|3${*JZ5F0UrWm%MD)Pf{o*my3}c_+lh_8Gm%Li+4deb9zeXCF&)?+~*I+;Vo9 zp8}u6v;7*2+M11b<3d1A3H|kwK6)%-Si%D)z=D^Whaz@&6IW5gI``4=N1W$J*hEB)8?evtmR%l00}R z6(U#|sueeT8ZEz#CY%km<2cl!tV6JFi)mY@?4=oUnSSFytigaL( zD%D~+v%N-7=cad6GP`kjD|+h_=X)yrB+A&i@ceT2A}ji190EmgjIOvy_Zz|a*cjMP zqy+qnpLXBt%#u zlXfq}Glqmq)^Y?+)?!E)j|y3esA!~OY6mH`F_{DutF&|G=ncX0PnD zD(PJP2VT-!vj;#@eB%cKQhd_~L{d3Mk4Qk?$s?qsIM6!>@4+~^hqf|c^Pw{Le-^nu zp(Ea`{$_U^qu=;_`J{!{L$W_pGXCc3^Me{&xXq2lz69-aXfU%`^>7(I64?B4Ee zKzsKG4+?Wt@Db3+WN@>lhG>4fP6ZTiSZ70qzbBdaXGC*|%4u3&@OCe7j zJYJGqX@xnd71DxIGZq>_YmQ4ve0K4IVx^3Kjfq|E1sPE_D2h{=nHbwp=FDP1eGHWK z7?9rQ2L)BcIn8ZIN zXsSw{yK`|FXQXwfkQoE6(Wc|XnjcJ!JL4rAdO`N3j9qBtGRL;O>rs_lL$$xor!eKt zGDJXI3Unh?hXQeht`hIBQ$khNo7PI@ZCTRRmJ%%9TMP3vbxfnWsWdD55woI!k!k)+02O%)=PACsTKi?Gq@>v42kB5gFL(mzx|feAMJ07hyi2WHIA zSU73RnKf1k-q&y}XBp{&;vo0&O>qn)v<;6s73}+#%D_`O{FuI zAXvI~|2a8iTt8hUFn!W4jhC@cgBTvM-rB3}xn+$9|0}jEp(Dti#imGkGxP-oXQQfx zx;yfsENm}6@^T*-=__3>t}ie`m_(ceGW+S-W4x{gDwl#C{~EFyivv8k<+;j>@Ktvwyv&+#SoNyfr0? zWAXs~sW?I}TF$(+=&$V-d&`=~qHzB^CS=6!P7Aefs6CP`;}`59Uq1vYC~#_X;0=9W z!VO#e?A&3$RZBxzTH0iWeEK}RI6hkA-T%hyLV3EmAy+8MIJG?IeNdafXu+t#-L`}X zwuX+v{J0vf+CVm$k_=(1ZdBlSlCUGAO12X}TH1cG@JEJ&_M@E*C5Evxt&5sMMQr!D zC_jgi2(!!__W?+MuGQ+h%m>W~Yov~=3TJ6)Fhv`2o@WBOzt#LnHouZPdrGKl)f zmydJ+fLHuCt^vy|*!RKQ#aQ+RwSbGe#DU-viG*P=>z!~d+c_5{vM#R^a#0daUMnSA zzHHB6*$S|;1lzLrLwm1DpGstk_@Xg0#K8-Uk_=H%7UA1d_%wD-d>oXZmLa6#-}x_$%iE@Bea*3>@H?fhHzaj ze`(qW-wotAU(;r-U3aStKMl zPK}pf2`Apvw#&cyNo(){=lEEAxvo)j8^wybd2hRL_V=Eo+}ER4gkL8y*G*8fiJ&Dp zA#_R{ekqd1t_{U9&ro>5-pbMqaj*8me=C3VK9im4v%n(j zcKtAaFAJ5$yd%jhT9YX7sT^jpdbkoI5q1Tym~T^FYpT2kX$7rz%ob|xZ`P2=c}M8> zQ9j{6_Fu*k<=`{k#inZeY-*2wjunl72gs@}S#_Uku^OZm+G!;gzdT4}J-hv>1Vh=` z&&)|^J`BnnhAJXusy-R9bro)^va{fqSBR5Td5wwkyO>xZFS$ZnO@Yw4y3i>}O?d5v z);T_FQky{9O2=8`;&u3goLF)(m1G>zWFL;gnIB68qu^<~6PvC2vdVCdT9y8{k&{AE z@IK})HOnA7TfeOszeoqH{vvAq7-s!HRezZx<)P5(uAx>o6U2|orh>JThDEOj0%h*Y z3;Tc@O{tz!h^RQc$DY`(6RWJV3`aNb9U`$hmfFKyiOwy-wY{Q(7cAE>t0)LPA+vR& z(VKd;XdY}+++sBtv5wfMeYQQ>MPvAyuJX^Df>Gyq<&L~*EMoYWC90-k7xWuZD9i=^ zRL~8t1XQC~cYmGcUC}<^qhn^CIhljbsL?vX|1(h{`m5WBU<5m`e?!UNe*ge}9mD{3 zj%IY$ZkA@&bgnMeRtC0os#Z!ahBg+?|8E*)I;1v^8t#}MFf?$Mj6X4P0c2tqG%*1I zYeS+aq!{oop)!%wB1<+E{C7CDkeQjpU8P&kt>^MbucnRCw*HFevgdMDP3uPGbGcZH zW{YKuFE8HD&y{l%_3Z%l$J?EsUF^%(&rX)d?N?~mx7X%1KyIvG*u80Y3C`MKjltFE zCVO`ePS;&5eF*lT^L`G_&dB~Y&d$(&56;fm{ud5!|9%h-Z}H*K)&r6EokFb-b#&Yz zGLG%ukX)z(k?jG0Sl(b6hy1na)?k38nFAGgr4Lx%F@Fp5tV8|=Gw)b{W!wHEPWeAj z?*!l#+p#ou_r|{IeJY&Z$$dCDJtI&z$5+pZpHKX}pU_yli`UfHE@oxtC+8>ECs^ED zYa47%c6(tVow)00mJzu;tSB~_(u2d$6=rVUbj}3&ZCa~k+XeZ~v1Vzvx=@vcT&2+3YrCtiPE2)@RsIn4Yb)oVZJjCEz2AYL5$!vt#cn3mRv($g<3`D%v?45&Ar)+aH7Dah#LLSqt+Chp)MVgf|LK4kgQK%QAme@qJVTGKRPi3TWGkbKXRF%e=?Fk63 zF19tnmx!~8F#$KgEb+YwWwCdjE zIviDJ6tkI@C5EvgcIvBZH7ulgq2}AhB-*u8vI|a{X>fG+77coQJ(l>@^#^Z53M>rl zkK85Yaju}g9B5wf9!6alEQ$_ko37xtULMM>W>$kZO&_>k%f$&;T)VdQMKvV!o?ZpU zutJI~*Ib)!%x+Lrq_ewz`ak^kBwA1fmKgC>2uY^W+865;5!n=I>Ow;HrJ+-SROIG= zTG4`6=BZW|Ca89JJ>A4$%qkBb3ijUEKnE?@DQ7n6vK2N9B2baT6bCaj_x>=W&#unX zsU5A?hIbem6W9ss7h0ymEhyg97|YdQLn{#ElsF}@;7}>c2*jD40_|bJRFn>twlux@ zry~*dP^e{F#ONe3;xha>7!;2TOwsAyL&2)mP4Dg9-+Rbyn1{iljgV~H>aVCm<@%Rf zZjB8WtwXyztmQQ3cyfb{p~Ex=#_QzuG9y3w)O@r_`(vp^dA<=rU0^LoeY0umC~`zJ z)q|VMlN5TXd?)?L^O)YL&$G43$R#y82OD0T<7jwwJ{Y81vt+ELn-cYR6u9ni6VV%d zh_e@a;AI|H0J?W>pC1JMFauFLl8Ue$`$gEE&KF?-zQYy&CT>sc)d2+lZa?T%0)+2) zWA1fu`>eRl#1$UyY8`LDB%JBI03!Am1jl#!fR00r+jsP!#))_Gu*T^-bZqDH89OEB z{Fyt&cjlfv#dqZFsxr1x5v zX=&|5ZqriAwoYQ!+D`^QbekJ*6Y8o+)f_=G zd^fzowJ&@-+K9ImT6?(kh%b;s4fOVo3M0;PNFg6S0%i=g|`4TMTZng1CQRpu@i8-vI9#D zM}2m`aXd8usxw+&citxuREFsBf~bcAIglVIN>LS^xFff(34I;>Aqft9hu+B_5G4ym z2gwpgiCoD{#Q^2lDm;0S+{r@uJ8)rqP+n)c8C6}M!T*b~cZ|*~jJ9-R+qP}nwpmFk zw!hdmDz=S^ZQItDRBR`eq&lbX8TWMe9cT0%WB+>hzx`wF_0BcdGZ730<0e0>wMtHE zR1Yq5kPl&Ie#~SKpxPhn=Z`DxUiBU=LJ7u|z8&2Y43uuj${17W+LJmm-Zif%nr$%H z$E0pP%QqXIE!Z3DclF6>b8(;rc;T&B*T|Te`^S&)^3pZ&($S8Ew)GQyFGK;WIBY0} z;V2jGqGU1ef;qJ0BQ@oUF3{EKfLRTU{8ute z)-0)>P@Qs$-gW9;3CWUm8qzv-G~;vBdbK)XeT$hpM95mE7p;ld7CJhTf7+J_ISGhJF8^_F~O8xXLog~!KmX1bov!7P@=%94v@7$X8 z>d%)lSX_E7Fx=UJ8()|9!{aqH5oi^Xe)*6J=;6JzB_Mac5B1<+@OZB|7~_iv{K}JT{LC0wT%_0z&?OYq9>* zvZDLFqP6BOBt0cy4IqIH6=eW3yF?fwgD~2#D}x~nOl!`lL@|z_m+n$z>$7ezuMZm-D zzt>$a!vAhYZ1OZB$g#<5W#|E zfYZfjq_H?KEo`JQQJoyDJ>X$-$2!zia5BS9YeKQYbjXQJ(Fw$-cV>gHG7MGMQL(4f zYW(h~a%O{V*qx~0t27T8ur#vcu$u}t3A#feSB`Js7{$i;im)t;290v)VU48bw}H3yI$dOGY$RuXb&Ed!>ZOXknbJ3c(o^t zS^3bJD;kK4TOV%WMCeVk6~dbNSRZWBs%vqs%^l(Mzue#S#=^(xpR>;i8F(Xo0Ft~~!^VXVk_s1`3A#h^OH&rb?L^hJ_P zsz!()ax9Lg<*(lwcb%=62yw91+PVJHtn$d$Y+k$+9sediw>z1_W!;1OJO0)=-)h~~ zyiT8k89!&5`%&{dDxHLUNZ-<)Zd>@~CnHC*zoEXqq0i8HoT6eJ{%>(tJ!`Ade2ul1 zO?M5q_07s^TS*!;xf-#GdyX~-_)COk39*H&6>-=h4wtuXrqH5yt9sFBJ#o}xLEeUu zNO!2#&`NVtTMir;Pe@Zz|Fk&Cs9Mtd(VA7Onm#Jusn##2nc1HJ9}=~tmYw`CvsBch=uJHwoNW+duzjp3INNw}xKFBNfhx%el4$bjc4amjKiXQrQ8R&= z+;-Zw9E*&vjV77KtSx@Ke zzx!5!-UaP`0BgM~er&G@n}P_oj}$Tc*ph&E`4f?5dS{SIKr=bk6@1da_Xy}${EG*j zx|lJzsQI#zg@)!r57`t{SiGT6{Z)tYkip=_e$wWO6?}eiQ8Pt`EQ031gu3l)VH`1^ zuc`-jzk`fhl&n;Utk(j4#p+gW6#OE63gnUWMGdIc_vAeryA3B>tOv=W%c&sy9=tj*m7`cU`ZFRVcmSWS6U3 zZVKV`HoZVqjGJ4x+|y^*^m*%cjH}yp)q_E2m~#kIzrJ9vMgAfhCZTjY{NsW9BqwXx zryfoMB&{z#Oz4nm9fbLaeR#~52r;C=A*~y%gCjgbv`jjiXsB0lIJ|399UUwb6!?IO zY2-D9vTN@lO}!Y7B^vsBltu_E4twx$b-EbSlJ$W|NuNb~?s6Qw-k5>yQ&KGZR%{SW z?%*~lGB)OzV#)afIBCt@>z8q7xZrX0I7nw?Fg0<+8X4FzHrw+bY>W@3=!(Ie`|(H; zPdaInb3$&`A{eXkqsO-E3RzUmX*s$p(Tmva{<+>DD(U3`+67$PT&#!AGcOGpvs22RB)0{piDwR&q<-#!BJnqJ$2m`yKek)3sR@zDz#kh%`ET<*NQzOl!sgk&NuG)U)8_yR>k{I}$UyJ5r^ zw?u2Z5&5UL>aUqd#J7hLx2}Xjz|FA_AR&)*jAcn$+U5w~HnKANBC{I+hiJhG`WMb& z1UcU5ThMm?kxO}an^TAU5Gj+VEr32ff8n;tz+Y)-&h-rv(ed!!1Mz16UJ3EV$qU<6 zaLgcJ!XRLTBVY#M%vm@EfMB$C0FtwCK+;_}Wa2&Cbw@;aL&<+9v|WAh$tM(uOg24p zqA~AGEHo@6RDL)lqqG&5VAF0q#tby$%LyYsy~T=Yx)rZW!ud%Z5CwH`2oM>gzLh2P z5YZSacN2&-UL_qRL~7hR)ChqP_J>5iNIcqHdW}Wme;Z-^c-8#=0!;n{z_I!RRl+`{ z_)*I{e1<%;I{|xA!h`{%yiV8VOaQRLS9AkAIZM$gw9%6tLH zS;_6!cJuw^#5w|`C_9UE=@-r5oK%~`&31*GzboU>njPY8O4tD(6)`++ieHLA<7=4W zc0_XE3{GvZ6neRDN&{HmlEiwl7}F<47+^d3iY0r4C+ zKS>~cD2X*^IHh`#zaM9r5QF|9$a^~#JJkx-6Z)X_C{8Xc6OrFR!Aj+3r zZ)w~yUR#zCvW=rA=L9bVG+3BXDDh&(F*I?izW9e|83*@K>APgR>$fg==ri31-W_?H zruA6SoqD}yv8A-oC7D)=f4ZFK$3@OutGjmTlYh#c=eqJ|ky~uK@c8_=!BfbxP*BYz zEepIll|kBKHFBl-@9)DW)`Y}|zU zDdHmQ@Vh!%Z``5BEVsU=$$7})i&r6b?x+0|(OA16`!=p{HndfcF%@pD9*a(O$d|#B3a;!5Rqj^-Ur>={ zhmfr(y0z;-{Nd0j~+(EC8iDE{iXdlXRvO9%uRsDf$ zQ5go--YG~C%33#LmV*9)+-So5cri)oCbaNua`$a0@7T>k`N zIl4SYA^!*WXX%H6FpRMlc-n?;Z!+mw4p6yy;Za8Xm$*~mP1iSmZd8TqD}2Xw@0R=3F7QlgsfI?3kiR^RxEVqXHxyr4 z7&Y9#(+sCO9>z5}q% z9&k)rBwxSCfiY-zl+?q#wCxf>uY%IU>6Acc>fsLBc8#FdwfIPC3Lw2wWP0hoI^6IL zKUpsws=88S9>%mf$yY5oP&O*VLyUsgIOtVedU%Zj$eoLVUGk$4>`pp9vK#{FKlWg` z5GnX|oiR)NpyXp1rqn1o1M~Pou%Ime=%QihWJ$omKvZ}@9go-hr{F-=nYZVlpwJ^U zJfGL*6&)HeVt532R7y$C;R_Ho@<#vCu;Ed}ldG(GTJ+M{xGE(ts@mf3pn;U{>d_pb zZO?(zhN~+Gc8I30q>&xa+`%GqJyimKwIqAQ?_~Req#AHE!TX?x+|3V!{zA0b_Y6LQ zTBzre|DDFvRl!n}hIM~67^bPha#Kz?bD~Z{>GwiNNdYZ>!VBaV$(JaIJEq>+bC;c%54N&5oEI92PHz+3> zNX?lUXovMeoJ=H$D2JD~Ue@1GeF)VI9WUNKZZNMhLAP4p*)XY=#qFw93q73D2Q;S- zx;iQ${m5d4<*1q7J;sa0KH!1rCP%w*!99vmD8iGrK+`dgf}Z{eLha3sgVv)EGj~7x zqLw*Sop)`3W7KJ4(D{XS!5pZb2lk>DSJwvpbFC{hx#>1N`B={SxkSC8$TF+JkFvvS zQ&z|P#L;oCIi#w6{^1hOKB;hGZvyOmkk|`aNCBd`oRCjZ10p zpfv;_*H0`>6qc#2rkV~`PwZlHIu+-u3(X&M!@x>uCOYpN7cMxC7dr4vsgBhqD5KRv*e16G3*N>Yt3|Cyuk6C7^~^h4%eqj7TmChcudI*>vHD8hThQ?ABOUjP z+w}E?Fnnz*;_t7ay>R031I{0186!rOTjx!2X|jxEwtsIx2-Yk1&##JYI(C$%Rp^#&BVQA`f2rmFW|~5I)P~kJ528t8p6Bx7^M&YTO8P~R ziK9Q+MDZQ)yf(b^aNNL_6pW;iANpaXQ1|am;U5^jIzKD19;$MaHebV*6wW*wLf*`E zsI$S`@ZMW#-vd-84*jC9ro|mQj#NcqE+7)lIb!9-BX&fQbpz=rRIV4E)!|O0g6rA> z9U4M}*yv87|X+N>1hqH9SYsC1{T6s#+GZgipRWM7`d zRKFXpSl$hCP1X}^xi8h?>ei!0-+TOxcwb=tmM$w(ca_q1)O8CF3#k17@Xs2wH!aPZ zLG%9v#ZQOCr|z}Kh~&H+t}~puzNNX`jWCuYu1g~}qRN=^62+_2M)4gD<|d8d7NvlM ze4gv+ZU`t1G-lp+ROu&n4*iz~_XRHP`MPq=!xzmj6lyHrOFGfEX>c|CA_dg%*=L-G zO9+RV$@$7x)6bqJ*r%3kIf?OGODRiZSA_M> zvBcAcQMkV3M~oo(?oZLlk7m=R-=V*k_p-Feik;W6r{tBz8_E-bGe!Z(hR@*@7};}m z(@klWsTs_ZO^%bC8){_wi}Pz@xEB9lom3m2AUM3>)lv9BXLiX{TfJi>H?G~ITnGbV zN?m%|BvSnyJKl~_GKyWb&VdDoia7vbapaG;(byqGk9m`l2=PzIYLg@Wu;UoT3`@S#Nh3ICTM^z&N~GHd9R0ziX+ zEaLq4Sx5ix%#H1TTLI10hIjpj0Dn0!c-fnycgbFMpKp3K|N28^bIB!Zi!MXZl|(FO zicf6~Zo*iftEkm=Zu3V+gf;<-X5JIKOcW+r&$~N ztwo3C-j#nY>Sl5joF-NeITM`g1Gbu4aEmv%v~GCRlL!2Yt+ab9z! zDEus3;ncPj@s3Q~mGi3{449|vCAxzItMIJp(sB)3vCKv5pF5G6YLBubi|sc^;g?N% zX@M~yU@n6!8r8lmzmgW_xp<;EoU`2`D(jbQYP#~6ZRdzl97T1@6A3@wp_vlJ^{ zTX&-6^mCb;ZqR-?H9M%q6S#(%l&_q`Z1@b%`ph(0f^}uTrgfLpG9CJ4k09_|vP@pw z@=4wOjwRlTYC_W?o?q=ghknIaHUL8H^B!U(^wll+YH^k%LnuR6Ex%LTB1h=KJbjvU zS~p`Rxb`?>?6}NZbj25XkSZwIjd-Q0@nWcgjVm~3d)B>la#dYAXGX;b;!;%WOG7@; zkWk00M<$VTa!wJE0JbCoLC^w(#Ok%UOGOU~m1C||zl_~jeSg+KVePbpz$KRb5#@rWMsmpFz$}=W0N@%a*IvHWk)5TjX2hbd~3P#w{;~mU4UUt#kTAsNA7-rH z4)69e^|!;TImBjlPDLm(gvZJw48=$IqV3FD>hBV1LP_iyGG(`?Slu9fhi=;{*fI1M zWCFqxwvn!NH@V;5L$y|7sf}pcp4G_L$j*C=JY0DGn4?fb#dQU@H|b!G7_8q1=HOnH zHTV$E?|@1?C@%ajO3~^Ab#xU_f#LF2auI*b$aklQ@nO%^EV>SZd#U;~lb2eS7ud%) z073@uOC3Wc>|@<>eG012skCeyZIbWxLu*x9*Q;bHgJ$EI?oJkyj z$fsgY&mhiW8i~Xr-iHfER3UCB)tlOTB9| z_z}&K6)`2_r4=!G?e0QGcxXt;-Y_^=M8hjK5aP(;1L=e$QtomFt^bJ*U={2WTEsn`&n7q37#qBGP8(x@$}aw+Fz(Op@W?Iew0sS zOI9(&Qd7tNaC-AVM{Q^UxfxdB@VGw+*j3;}k`$kTlV z-8PkoEkFv2F#jS~4i#-f#TDRe~zSY_YfV$^PQ?QbqqN~I>fu9`pbjXLfSF> zQ13|SW4c=~xL;5ZQd4rn9cd;89)q<4NWNyURozi7KTz7RoSLA4dw!^vhQm$%k@k?= zz@S%TV~H72fn%SrP5RzNVcT!+W-g4&EPRhGC?V$Qzk5mHnGfLSO*q>Kj!YA0G$S*O-7TPOe4Q+jUSApms}ge zhoDvhvr7iZNc-sx%S0>FA3Q1=6HP!IWgu-0EOAEeQo7_)+UD}Wo8StSX-wsaTN;)1 zE>TPN7k+%&y9Qhy+Shy?xn<0fKzi{+~(JA>tCo!`56M4Ja0!bfjVjEmOGTV zn$viQ=J^IJ#QP=!hM0UIEtf6p_3xRk+vnlMFx)6@PlPRp{U5=PX|93WG3HRDzH`$y_aoqlG?G5r4Ycn z6d8o}O3b0Mz0nI%^rcbaMKsocKTrJm6X5ZCH|_E1r5OOC2?}JXoo#Azsbf%<<+8fs zbqBo9byI3M*>NLJPU_4(*$ZB@*7W%cVzBYTnWza=V0RK4+^SRMK2HzMg)v|ivl7AR z_%zXtuTaQ6ISAJ35Pb~xeqC?f_a=-uFBc~E?+O%EP4cyW{W<{>TY2D_H9o^xYLx*bK zD_l!YwIbQ z`SqqQ`TP}XZ#3u6ZthzZGMp9Y$HcmkN68Gg9~1j9FU&K)cMnVvw)!;eLebMa7@Zv+v=CvWR%kiuE&VKur3&9veY4DtQqhM=oxCl z#89sxevVo1X8PMFGv%6pwPW$D6)VR4%^Rl=E_VXWfp?P>$zBB;cx4#m^0ZulkJ2XF zzQ_yEem*^b!Gz?h!XchA6F@I?HlYYbYP*@f>r;Hp#P~f>^Q=;0gk{{tLFq zaCQ0M4Jn`0RranT;lP1JICZD+*^R-p3IO+R@t`bEDbQ%UJQy^g$_cWr>Xxs&P%PPJ zO{ZjkiO%3;7x6U~&e7$DD#0*Fe|YA&`fRgBI!yN!gxpUn%yY09?z$Wc`F1D*Ltq?v z295~$+z>3?E;z~O*w{JOST@&$b}l%}lfLhT$uuOb0m$+OFnep-kAeLiXsy3$Ynh-x%1Hhm)0D%#obV$HNI5UE36QtRY zW$?HW9%UTW?@2~J94Jxdev&FthcRTXG?mwmEQNCxFbH`+BN}toDq@} zbL;>SLR+2!tz52D@#XZ6Jt<131st3S5R(Oq*&C?NFk68VAu-E!Ld8Tm%oDK4I~^Y_ zDo_pNZKVt~!9@HGLe5ZjM@lEl#RGEzPr)!4FNq1wHx^R|3;&uaG&tKp^jy|wdnJTX zx!g563TF8TLObpIbls4rs9o~3c6&_L&KJB@W})Bk-i0;Q`=&mP*Mnlc*CwGA=QJ*5 zmXzarv#7%^_Mr9zH(9Hq*DO^Q^~iI|g}xR!wXb0kzA_nApiHuSt5TiDPUX-yn*(QQ z0fMbN$(k-Zd(0NHG|Od~Hqm^Mv|P7+^*v~SjGH2s!UK$3yzymM&q@DVFK>ZorHT$t zI!=pDqDn_<(60~cblX>M!sJUi(9!peFf|;0 zM)8iN&#h3T4AnR7FMK8ypr(&hvdP7x8M2nu(EXNCJhmiD$-x=H`Ntw}5Y7aau8SO@ zxQG#p^F0l2owkzyva1urz=J=xZwn+WyF{Gwp}HBvsh)~-tN8Tm-5qERV*UEms!>+I z*Ls-{o4UGVXHYCWdW2?Hsn9(45+B|e?0ijPWaE`J&ia5i!PPxicaj>3xC7fMy~V=3 zFx`<_=V*HqHKTG-ay(xhJVeJcT-_|eid?D`uYj8qqy;2ZT2Qz!vBus0xx7pQITqX# zJ;Po!)1S_q(Onvck&CkE3Io1OQuc6YGIe`ge6$(Reh#!N5nQ7J4JF^iwO8_cp%nehlFBL=js~-sl8`r9p($|T zX%Lc3zswlaM3K7;M$r$-?iBBhKhBW_MG6BRnFor>_RDAK7NsXntuGmybXX>hl|My~ zufV{{c{gxTRZHW!GL|d?q$9C(I8zlkP2;RbFY00*{!u)2T$H@%C&- zMbRy5rIzEwa=9ZEt)wsFpj%>xHgAG((1&vFv>YPZrZ=5Nru$#Fn-6!(N8MmbXf%e# zas9uEnkP(`Psn#;N%EV5f7oWXFr1HXKM+rSIgxMA1_KjRAKG)nG~ckkG)(%bE42z6lW-3VQu@(-=ZFB5Pxva01=W3lvN*y`03M6^xu4)wT#LLn;~ju+wMnz zHNM20H*HOeza0Na$28qrcj>Gi>A$($HI^jk!+M7*Q4*6=hwP>WW9Ip;8&B}rZCL&# zTOr4w)*IQ5{YOHX=k@Vz1;Ct(?xa{g5${VjZ%pP5dW_0tt(#_`wcCEjsL8S1rnZlZ z(ZPAi5DAdN^NgK0A0hqFl-0=%4X3D?Si7UmwsB302ZtNZZxrulgtcWvsox~~s*(8M z{jV=k=iM&s%T!DSb4R{lEC9d z>nU;CDN{}W#CHX>@gD@?B?B9-5(iyCwSwUcQwtDGb(2h)}EZ zA0Fc816DH24_=Yyh2K+bi^h?|da4yu3X5e}JPiT$^{se5)qSFFS37eM(OTH(?c4tf?nP+b41# z;G&ayHtIyi}pNU>dJvEj*%pHMc%CIrF$eTxac+dhJaa>^{ch z__Gm1smo_`*2+s+Ae0uwM`5o^TEH|hu1~6IPFg!oGQuuHeHta`$b#5eos9~)#XxH) z9@ury1#wXTcF}ZSB^s=yVw7o+av)54kdQc6dc1mxV{c$BBtOJ!bYVUM<(7p9jkTANa#yY)2LedX=`<)QjLzSzMiptx+5VcyPcGRzM({mvpGcV=o&s+`B_{+e`=JTm9vy zuruUh$g~RE{Dr>FVPgpO1ZQ|mb?zV4`9ZfG5~po)L&*sH_g;rMZ`{R;x0_1&+FymhRrB;WYAAeTs^}C+RYW0n5+lnB!JFPqP z89lmIGHldAww{6%`&k8;GUYRaeX#Oksr%3SBIkI)5IPy8MT&!7IfazgGHDSv4@Tq-T zo6+^`6{LpDOSr==Sq+F$6TZ}tC$+-@rFct10D{=fqGZ4i;>R(EoI+7<#UT@58O4`Z zj9h`@#}Y<+3+0>Gdca$hN?giaFT#N?FC4oly`dc#Q1DST|E2#ZI(l`3LewuB{e-kR zsVdh+-Kf`mGorW9i%9-RS}rCWTaYc(;BG@r_zOU^7u1wWhp#}`jwpGbrjtur-zX_PN0Lil^rhDMq#h>$x}QerkC zAkU9!d-$K1AOjwDW4gm|^&8^4SEea{{lWgt(H~U|YWN?4-s4mXh^YP2pcHm_jKz|b zp_d?jLB!TC5pQx|&R z%2#dI0g}y(uwl~~&p0&>j)*gHFcCR7PKM2fp}vp(bz)WzraT}FZ=F~^dYae>gH|s- zgy%lKW+9N(eU=jo_^^^xuIYHMGNr=OKG~rZcTKh!<>Pm?cSs}^D9OxXpKcIN^De2O zg;j4tGrNfAJGNk}5?t>aM<6HVIi}e`w+@ zGJkGTs^n9o4*oPLa-t;t)^#77eU#@73^fkebwHYm9R`lMwF|<9$n2J znwqPb&yzFYCXR5#DX)KBT0G0!;~YG3Itgd*bdffu@#Q1^oL0p9P*wPoSg&=`*#*t& zz+swuGtGqcQfoYXoe~eCJonL%nQA?Wunj?+HT{9eh>U3nd{3ekx9FnQqpSAKeMjr+q=y$4I6`pS?svKwrOq)t@UM$xbF7s_f_1+ zwI8n^T4OsoX1HN2Gvd}eKCob{yIAB8X}0Anv~e$wR&Q~9Gd}sT4g^48YAjPXMKQ50 z8qpLW80SsncOEVe^&y$juf}*!^X`a@*q6JYSme8;*o2O>!O+-hnMs_(O&IRpSQA`v z9_B+Zqa^2e+x&g?aGf4*<3Y=1nTt&q*nD+p+tW$8*I<)^gK8R&th}lr&ZdI3<;PB+ z^~Wp*L7%0MoWZg+rk6~i&m_9Mygn#+C)GgBXPR$|;g1%%co6;>x=+%aR?U&Z>2GMP z&Ag`Iqc6Ew6|*tj=KFUp{ri=BqW>vtvfGC2mNFkE$OO?lS1i>#_~0G-Tz@ZVEo=`3 zx#=@@=q+1UGAaJTls zULscIv??lAu!~}1{Nj2#RypCJpo=e|BUpKocj!luSCsy0b`Yvj0fruPbrocxFVjX#NEvSjswa|66 zBX`hq#A+xCss-)ts+<>ds2o0v3pdKXbP)6u)4i8O?9N&x?O`(yVjw;WX+)7|OPto= znRLp9;^L`kx?0snIu+azY)aD(x-$=Enx3rpU*E_4Q=j-;KgU~PsW)9kZn7`WU=QUz zo@@G)1jO%4L0YUqJuk;}T#cgcnr}1gLrS!S9tz^GccFLFhjNFm^#BzC_LLIkdv^lu zDn#))%;LSYG>2sMUi zDE*!9i2B?k?a!yv3ch96-A1cubJhSroK^NFkXsG#*s&UgkdKCp-`^Sk?^QjFK19go zn<$a_9qRhuF)9DIs{a3|!7JKl+W2dj{{#~`qzEUkp&D4@(=|V*LG1TW;^J1@;lI{9OXRQDhofm{!7c-{cFJyI}ZaP zE0pRAcsQQv>Fe72`&j?4_pc{N`E6aW29C4|olJx(e2Ot!_g?~LUC55j-nHxP1MHY| z0p{v%fte{rqgBA00JHJ_pO|jnsC3J7D=#jDpcB9w8?!O&VKpGnvkkMmUxPV(A*%lF z`l8z>Dzg`Ll>3g+sCS0AcWBDf>n$(%20j$(AtpvjOC&C{EQwI=ydx*6_~9!wvtbs# zS$dSp;k?>=S)rsj#5T=@{gE&m69%Ca8zCq>D%4uxSe-leQu9+PSt*Np(OHnU+7kWa zngFWi4+JT3mW*Y3(L}i;6J>Gr+flTGl%;mr1GgG1y#-SlF%hv}x3b6rHr8*c_|uUL z5kmocJw91d$t~X%RKV?Bw>72Os2y24iI=*!mNITy5+Tb>bE$q*v+R%DhPP>^-ET@#BqE^h{Vtjg% zH8!pz3AV#)3a5@Iyi;q?>bk46blBy1i_0lfEp^`q7|30^yD>-YH5Sh zqCUIyk`XvKa}&bnmO}GIx8BOJqsEDMfW}Pr7?q>YBmj4x4%wn&LeJB@L-DTxQUfwe zel^9u`-;nh5L@FjAVahsn{jyPt5MbpCOB z6#zoV3IMtz?Q3oH-oXpqSD-MQL{%*#X24*+u3@r2w&TNfUUXl9@qn@BM_eDKlko^< zqAK<+EoQlM_+)^sFXYAYo=55{+-_mTHBWsdr*!k+|t$kfD@#q zQ=nweVoQ3-%G}(TZixKsDT0(KtI(eK$?UJL+yuJF4dcRnv&S(e6(}mx1jXM0&-R=i zk@E~n&La%*cPbPX^sddF2q^Pa2~0?f%(cb)eM2x#@S=#`r;JjLpx$(wL5DA@4_x-P zx3GFcj}T-qsCUkr?&u&%2M|SQQiZdN@_lcB7Z#<(HTC9tGpZnID@3PXd}>mtscM5a zh0l2KaNF*XVHD%e35gB#6qj(Yf8kNLkF3l|Phb=KLYwpc!Z@@ZAyhhP!EM;8cZi9h zW%+M9QM+LXDHmnX)nKBW8&JR4X|?Z#{LySr=!K~)n@mht3^0zrh45sOUNQnE=PhMj zz`;0%_mUK9j&*P~?@L|MVK;mZPZH{kNl&KY*HjqPC%A||;?!An>V^9|OP3j!K*u2o zKjyhFrxzw@NhI)|#sv$xJQBj1Jr;Cmhz?3mQN(JevgnEqntLl~HWwBu3?9|l6}%nG z0AeUE3(L#g)%>TecOW@tt?h%rvW}ade}K+B!eGveA(sZO@+LqTrn2{^luVSQWHC|j7UOn?Yd%LyCb4Edx2oTx1JlPFuZo)2`j53x* zF2@Q?_KbvoWH|A~-VP6w)#;{R;MkRBXVBX<3GR=zO4*egwu+*Sme&q9#y>kBudXf> z{%YpfinSaUoa-#DDKL7*mFX6RzQH({pfD+5I#|NVf8hY{B4iuP*+Lj43|+13_^0o@VzGEV>r@4JpqDcCW`ZMDr$2=RwwQ8YWkx@a?8}?Ek)AVQNHbYXw5`HwIX8}_}b=C9uFa6#(PA0CdV&7ywhyM@s;g{Bh+Ljc?cU#JPn&zfg}dSqqpYV!y!I$6uRyhSj4u>aiBS&sLsu zZF?QHA18Z#|3LT6Qpv`@xn8_AQu86*D7GeUhq|G|*r<9s*rwu~CZnmT#)VhY710E2#%{l}>Rg`tYb9MOcU)8)k)A=Xv z7@^EJb`RWSW*Y##2AjvTWxe)`3fi+wr^jj6IKZ8Jjc)C5`F>0gC`L2gZC$RjA4(4? zGbs3X%9b$Lc2i4dKg7-*#uG_#rYs|0FZ!QbdI^ zEp6Z4HqVHTGoCq|C3{h$Vs@UAzkrUMvK$F@& z3!SAK`g3kTmeye^uvsciPVcMDoSi2!ZiHI+PvOzmm|ke%T%~yB&+m(kQaUlKx*zX; zVoK^0q1>@Wr7?*tA8x3C5#PGXX~U7?w&TvB*e;6#Dx^%Jm_q+mTDk0 zBHwlO`l?EQd$`ag4Cx`QZLr(U7|GZQgDP?r0NCTnBE^$m`#6(=p3>S?`s1 zl(ddXT2qdKVQ?JeyPsUBH_Ox}7tQRaqmy#k!9(r|cBYD0?r7qVq^F>zss4UsvX3oi ziQd8!38##Rkc=EgG0F-AAw7~YZ$v@d981A86OlURJyw=}?UFZwzjko?Sx8#8a7Y<~ zc+bu1$RsL6^nC+cAc_`VRL((*BOCP5oKQd;Tj18E%sHe)#9~Yg>eQl=egz7VohCYw z2|2atpCNg)c~m3rM>xeH%D>JP%H{tHxv3cRlsN{iRGb%$UZ#?Tm%C!Ju2nAOrI{Z~2DjUmbIhzUt{2srO8NVmIx0$n)-IwDQl z^A19$Ku=1i;Dz=D{wOY+NPs-&&+8C3OLMN^RayuKN2JPAxmGqdeFf+#9>ywb$9Ys8rMTRR67gkfKnY=GjOw9+YM&8^aQ6m3NXB(&EcQ&4a9lE^d>nAN?K9REulTJ z+t{*NoCc%kEntU#9U_r^{4bHo|55Q~;5wR(zX3Ph-^f4O|9=(lKMgzD)^6x)n7wB5 zc=`x{0jOyUbQ07el7d1~b6NWX$z9QJA_+Xfg9D(&u7Q@9E+0GLAEG`bk&Qkl% zL@p8X<@v;G`^B=e-ABuS7teqvx3}x;@;jL{5y5h&kKNpt{|WkAs{ZGH2Zg#L8=!gC z(uu^%|VtD`RYW zJ{5b1S(bOuQh$H4hO>V`Cph)M?RBHC;J2lGa*BpLcXvzptG9ab0q(8y_tKJ-9x0<~ zmK0ykJUcFV$dlDk?{yMUSZbu0&B>1v&y2qAg~q4_hw0*>otJo84QwJ@q6;FTnBYT| z?O1(j3>)}IrsbS3llV@+k4%6Nx&3Iu4SEl11YdqmZB~ zB&~W;zHkt#Cke6<2?aENe*2<#4uf7co3qCM!Pr{{#TB+~g1Bqr?(XgccXxMpx8UyX z7CgASHV(nvp>cNz1PEE)so9 z?rh1!{%&p<8{M9J+@=4eQ*DQX((|dpNR~%Z9f`Vj5HZHwgK*aZ4bWN~=$E7y)POQ@P1N-a8 zw+Y-0z(-!>{h|1{0n5oRg@K=Nua{VFn{J(ayA(%nxON8n1fU;y`&c-G>6;z{dx?6Y zs0gfG(6!h;GOhNo1^A@WBRL9y2mj>a+ZYuHwK3DjRQ5PmL&|}>*Q4!*J_!Hs&yS26F%4d>DCT4F(U??wPF=y5QPwa5^-cpH zx>}sN7=&vUITV77B{V;tO(suS{5&<)q>ROMvW?`v5Sj3W%SLABCvKx^V1JcZUNneg ztM%S00ojNZktfs+yB^Az)T{<1z(#m|HONq7%bLa|KIub^&2MVuqAB7cJ_$(t$~qg7 zz+9V9q4aR4=4AI>6>$e7xKQP9*y|{T2e|9znLF~K6n|@px60B1WtJ(d*NtkcchyD~ zZl1|NDGwk1{6j|finzl|*!fTED&xLDt7_y?vpyh@*|*3x zydCtX2bSfq@2H&nM%d?|!__kG4>KQ0^5c%#t{m}=y@q(y9oAqLYzw}_o@as`b69Qh zFz(;%uSEVR3TY8f5zNE|p(k!~QBO4-2@b4^()DW?!#M?nXOkzFv}ConA`=`$($Rb92P`ZSA#~{R&}6+!xZ622x3dgKQ)zl*6=};NF9@#oSC5IE zQe;rh4i`VcW4iVIhY3N3^r~-xAtf8{0O&c!yG^Ux;py+5gM=%`RsHGzTI0Ur15x*# zp|v9Kc~Xm26~@ned`14bQw67Wz{H#3*OcwYsv#%nLl&Y@C&>dTqR|Cb=7I?x%An;b z0>+O0yvwAM3u2=iDloT#0Q=2hP1@BpFnQX?mBpBEwetEaF|hS&(tJq;Cbb6NiF4Fq zlPfC?wDFD|jJ4SNZ1KAPe9M_l>_g?V$|HvD#&NfIfn@xKcQv8uARw|2E%P&91SXuRlGh22+oFbiEA-%Dy%fZM?Q#vQ7O`L+ zm}##d+%h-0^jz;Ijn~$fkk=6aZi}`?o2ZgB&-g&ZxG%_3WN5`^iaLwKOW14}{CiC+qn}IF3fH_G@*9g-A#d_X0dai_V^MvhO!^H+ z_LG)+MUZjED4<|fu@` z_S`3Dzo$l7FN%SH=?bd^klYz zZ@nr#1kyL55nqP+q89SH?+1!J1iVgdMV}H7A^sB|&o&UX8}BQ$y0-63lJAd_^!5na z4EaM)_V<6QcKQ!Fs=%#j?(~IAyS{KK$A9mX_Wx!`%QYR<2{bVSnKvxR7?DYfGvn zehzb#-$Se=8eU!V)(T579DcO=({77%&17xsYMDyLWw}}LZN`OJJJ93`uiKIT?W%vy zI;@WAMhT^XgBIF4O+CNa_EAn{3v`p)WV)c_y-|g~+P$B9AhfOV(V&nNdyiGWl%a6a5KB!en`-NzHYI}ph|Kf)mo(u zF$KsV)ruXjV~V`rzN<>R**y8|9kt*7jT2ve+xd?4XPvi%e0TGcx$V%d-skOXQfL@q zqU$#MXUFZI-U@BnDIw;@NoH~0egciZz~g5ZBKE6!!aa6~DVnk!grGA-{PLxx`QL=@ z?!lY4e;|D$wbBokc^R`p1U9GCdDm;-;QtaN58Fsw)!*I6G24=$$X>-OSTnqPG;0kHpYT|O<+#@n! zR6qu?8DVx8T;2JUUAc&y!_dX#wrxnOXI6J_-%Z+4em<#@Fpo5j_;$~KKYIzmr?6Af z<2hf3O>J1%;?z4sl{uCs4ih4;i(m|C-Tn(L`|;JlKD%0X2lEDAg^b3XrV~cC%C1*D zzgc)|%@ot$KW<|S^^vf;M+E`{3~@p@{Ita-CoS%ah8=SsUJnW5jX z;Lgy@1O5x)cvT-_5yLt`_ooh>lR1H}I;Q=~hc{hJRhvr7OwBDSHVc2MPiNe>BovCx z?qpW?wE z1XlinHaT{tz_;4%p%KejuWF`1T@iD)cK$Cnil9|Nf-fO0E4uciX9cpATdZb$q6(dl zKMS2ta#bhw@|(mKyxTcWDuJEY4K`DUakk$Zl;3!j+K;PzvZpGvzj7YbeyH=i>zOp; z>_LIVx%)dK0_a9!tK=EC--3U$`*grLhc?%DNTEhi%Wimo;21QcNY5V5q}e;zGqUsW zpGFV$C{E!mZD^Dut;+LaS0vimB@xML3{wL1NdjF55 zb9}(QuXd)QiHKp@%dE#Xm);(*;VTl2fuV0}Hkp_w5u-Rn;c(Q}*VM|s_$wjgK`G?H zCgcGD`d1Ar(r`M`p%3k_^T!a<@Z1Ln(&=`eUc*s_bg12!_m`9N)SdWc+r8o6{f~hU zWT0&?k+{*QyH5O|2Ko^B0HdpOPF@CX?fh$AM$p4lfRk1ios0U>SfaYRTCqt&p0caD zmTJgwpB>Vr;3X9nydY>7=0&*ffa8^Mp#LkvrSp#bv_?_=F5&2?&acEfCjA@}Bw2t((K zB~>PSwU&AAD+fX?{!5+OMJa_FYP+=41eS4o$0qB#P0{)JOc`0~5m`4ZIBJ(GL)E4~ zPqf`vzT21i{xWF4itp3N&FN>WC$(Z^&YVGjr_+VL_n-7aQj=VzhHzAKd6io6sx9Gj z)?`%ko1rC;TwRH zs`(n~SZa!H1%^|D?vxHMR;pO#K*`8UgGb113;@e{iu-4!W-M36b@Qp!_=2O6`Ch5L ze^t6S{briLUTW8k8#7<7oj40W*e)_usGeX*&uu@oON;yQXtX30(kT)f={sMWkdoia z(O>qZ$$|~96~@e81ZH9aDG3?|N1z)C=(W_G7pZeE*5^$1IBFVw17^0iHbqhOAI^?T z3)6`Il)=gWG+`fEYV3%KvfI^bFrCg!VQXJ~0&NOSs5KX;<=v;65b#rZD?m2(Q^PIa zD#;=mY+w0}$}jrWovg0PB3oXQBb`Bc`27*uTm~a$k(@~Z1c&%W!0Sb{hv&F@BaCe(Ohm;q^N?;_l5&lk!3WHW zjSqS7jewTO7_W_y9IwHl*81~GSTw%zN?nyqsF85azkP|5BeGzc1<^V>;%qpxx*mt( zvd$|Rb4NXF6JjOOD`I>Nxf2v0h?N?$|7h-BnaZgzF3cD&O6|~y&aIB_BEvM$*j~6@ z?t0_j%u*Y=qV{cT1(_ASHP(b_zzm`&7o{iYu}Uihn~H z9NhT@Ym1(7hVX-Lcrw^f)i}{CttE%SoqXNvS|@s=&7CaQqCi(rT)XBJI8X}r$Snfv z;Wss}pIyinaQ2Gf@e$Kagj=jtP9wt@JM8oAITBuE$%T*xidu@mJl!d1n_yV>%`f)N z67kr6Ysw~q|G#t}K58RHG9+%msxq zn(dQCx&khS97<=4AeCxJ#T25mh3y?w)q!qxf6N&WJL2a8h(kDY59E&f^VXqaY~u0B zyFL{0sVISliHL#@ov)9kAHEGeK&yxg&j6>+MfW})vB%ZyFtWYTI?DC%E6xs?)hU+v zyrSM-;0(jDD=>yw!>8;Ldx7Ff;SBQVPpEKjOdp~jd2h^5Z2wq4iEab3h$T>HI|+wa z74sNI;UW~Yy#a1U5m*938sKP}cgDO;yKECFQZY8!yq=eOhKwxd%#($vctYuYg33b$K!R6uPc?Wm4I51zO9o2sM-D~I)v z>L8x-31w{0Cp`N>-^Q~xIqCRSr!SR@0njU6kho8OaG@xEod5+yR z9NWB%Vp$p3KL+iKT;Q{lr5ym+l=VH%BpEY)k<%U7*^eg@#5Dnxb_<<-34Il=(c(M| znHQNRtMw^KRt998|5Wx7w`r>dOnH`?cDbdOlNCG31lt^7zjd(AXD>P*R=gTu3{Z`n z=0%e@VE!{K@=0v3WhexA5=Nh?b$qiLcww@GA{lh_gVDzb7g&#e7mw>Cv`mN-pt}sT z9=N+vp}0>HHv6fNYyz2w21^ig+bT1?pGa9)Q&94k0vuboUO?24_+|Zjc}!i%5mDx6 zmm|BOk9Q^fWWCUV>!DZKOC2 zSuA8zr%r9MsVLT|vG6~P!hi7R-|}>ZmE;{7NaU$uRR0-v6x(a8>6F{2DorHGUC_mn zkyyC~m}Dm%4kuKK{^)Rh(V!H;CrR_PTJ8y4nEYIJT5PLXOU#3~XFfP2W}&>$(jX}j z82UGqN4^VH&?h%+v^&z$vrk^=ZXH&z;AnornB9%Z|1ucR1t zleidJ3dNx86@Xs(p#7imX|XF8*mrPRC=qisT_u(V<_1Sc8XSQBWgZV+zH-)+zd=t+ z*4n{)rdG0~p#Fr8faL~jrcX{BAMrs!Hey@q??;JJ;T@^03l7}F>Y1GRChmv@)2 zK#C&L3fm>-g#00KQUh>3sZOMSGU~lY|&hA9X?z=1g;DnS!dzAi)G@W zI+HK=4dWbXS$a6#;jd_XhYNDZAP*|ZM3^H3rBj&tAuU`FdN;i9bTGpU85Nmy{#Rge z%|;?&Zt#i%Tx}C34oiRvy(8Tf6}DPr-K@Cnqqk5rDs}FaRFM_3JU<@hHJC&D%!&o! zB5mO?`yQl&g&1z}n>lxP-9t&{>9X2vs=gu8O>*d&;mCU4LtI4<2p-V%f=wb6o5462 zedJ`^Jy-tLseT4~#Qt6u7vdb3P1R5@XN%(j0^e|L9qEEwMgD0`b4VU#gQCdELCcwg-&9571Jmpsu1AX5GtufNK1ft;1=Zp0BP79pb*L&0$u@y9TNcX zmf5CKCA&v~hcqh#P-Ng%jmS_*(X*+E-ZKi)3|jg~g?jG`!K68c$Mby*^h}!^WfPgY zG*A8wmacjv-xaE!;J|errRaTOuhO5ol&$SL!Kn_|Hz@%@uP|LOtl$_Ht6gJ1kFHQ8 zYH26&>PhzvY07;4_yS6bJ-RUqrl?_rLgd>sLs(-;ipWgvXg_Bc_YYz3Fn>#f2!E;i z%ZH-!H(nyrw-0g)B|lx#=*jF zp686@3LlAca4*aVDdLWYROEuozbrCoz0iBJFRn9r?nWp=XkaIA&?sw%f(OC{{{1f} z@b25l@VNB(EmYv(E}RF|Z^@ZrW_(lFb`CYqRo5};l|vmRfz1AQkoQ)gq4lM^1D+tN zcD_)~VCGj8C*&D_IPfR)yYuB$SmNK>z5%3@JMWcXUk9T*2$&tTPsvi_kXG+&VnBR^&RBS&^9h2;<2DR0PJSz_L0 z{0m3^Qud1+fCGNYE6M z?3bHqNb!juS(Eh-a|p`!8<0JKw-c5$l2A;5RXoC11^ z20KRA7C@Jkw@wa^++=e`7;578df;+~OpZOrLe0|1l7gNTu97XC-6is1`T=FiqSx)o z)gF|Qei>(8T|Du|RvnU|Zk_Upk(D#wHV=BlI$Py8$rr$tUoUnbP3Ha;#kF!!M!FD2~)i2PFgWlk`U?6@|E}V$%|OA5iY-& z+%$;Q4&;_=s#7`%Q6)9PnM{7I`5Zk-D@&6TQWKz?qDo=$C9baO)d}c7p7t=l%n&0Q z)=0cTPq=D={_vYGkkWtxt?S8#pCr4x%qf~W*^kbF{X)NfrH~2 z+N-(0N!O}e+AQjhmi^gCUl=?h4&7WD4T-Hf;Kl2}G&gSco1c(fp^i=YaAT9;8h@>@ zD|#Z8LQF4f&D9p;mLW-Jkm_yF01amLhnx99Ij@N=vq%@7_=agaorZX^64L9zS4k8+ z72r6=+0u!ie?ba-O$i*De>2+lbKcIi#!F*N^8KE(n2l$8J^$F9{LL-LXI^JqaVbSu zk=3TpLTQL2I!ITIZQudcQjk=_NBX*qzl!hEGA2m?T+s{1{RnCh8<%4n6$nC#dPQtR zG7e*CyR92m?sBh`TG}`1+a1--QY1KK?q~2!+Q!hz)BaFrXSCwr9x$Qwa1bNN&x7Yd z>trTq0(!w%fdC<@RY)X9O1&9cpJCQtxu4thnv~PGp_J2TZj^&CLaE8}L(I_- z(=8%!jTQ*jUBD+gSZ@?M@!e&_VS3%e;nK#RG@bJBD67i7-?Xxm#$4<^nFsA7NzrL) zlaS2M+IsZ#^v+JOsx6>K$NX|bLusKg2n{5Jp53HyjQm!$*_${W5gzOfB#JXxs4FTw zb@4Oi)>dXY)R|ATO9bu&f*>;%X%L?!u~VWfZ45St5TOn7BSvqi<*wunsTb%ug5&Jy zPh;)q(>BkAL}0cA1R!>$NN#lX8H@cQ#hQwKswbGPO3XkE(+~<5jr^sb6<8~u($4$t z&45ePCL)|aFE!0UFsK!k$2qd|dN9rCaB{h#K$by#VJPqu-x*l}))+kt9cWG2zt(ty zY)(t8Hen-OHb6q6@YLH{Y#Z1K7Zl_$v?pdX5vGP<^;%Pxe#6I*=d&>_|BXf8XXDot zw^4hG8^tr{qV+X;dZy6;pgVqsK{*`eidCJPQFf89GcjC8*AGtu-c6r`NPT_yPw!-kj zXdpvc^)wab;vP3bHwNXf078j0t{q5d7nVGydTwDML$W-mF#KKuKVDBN`$M;6?;nF_ z?|71nZ+w!#r}^QmK79EL_s%pBZj@l@r)@!h*yYq~5Ov`B=)XbSC(~jb@B%4N*arA} zT`)%i@V+VpQs=4}LQV?Qbrnp;VA7B76KDr=VuYy+ZixpIvbQP; zb>ae*63;0?p{^b_hmO7mr~PkRfDr=bMgg%ZzNM(zGs(0wWre(5XW1V@F`vt=XSv?G z3#SSt--I0fCQ^+AV?L+9?(OL=$Wt%;DBu=yko_SL^SRx6c9epSdm?&gy6k46du)^( z?klj3n8q3u^<5Pp=iMpqAWJ(;&I6Cw*hphahHVDGzMkJunSJ^pt#1UZxg(z*)Apt7 z4M+cH*@^jMis8OZ;kV<`iR_kk#LLk5Rf8DGZ??;t`8|I|b&X=@R~@UWA@?U!h@wr> z)vH?UvD^tQH!R~AlJC)~8ad0%jFHa^t~#|Gnp1!VlT07Y4ogYfv{=$ut`Fo0_s|PwUJ3INA53l!o+XP*kuX=T|^9!JVGKbsp<-loEh(7jfDbX6` zdw-zh-#aC<>+tbw6(?#=>#l(bQCRWjN#dF|EzCX&T;I2CPfz`6KFtq%xM6Sq9p{=i zH9N#!+E?DqcLMah+7T!CA+~ZCP%xuX>VG;TbIiYZ#c6Au+lr;%`k*#b)X|2X()Z2k zD4pyMa2TQyDy~!iSfhsGS!8V6fI4J6ci+}|LU?WSs|SaLlg%YytZlVD&2Ft}N-WAl z=v$f6>@QwQBF!KfE`B@LT)pY4?!)du7lZE$^6u*%^6Q2BK-W$WLIapA>|Pu1R%2j?>8n@u$O-=VRCN_ti>)WrKCt+u_A+d=7&M^tF5{Cl)_NrIWPc z__|r#nuyGJny?en6Bs=-hJ=xJ#+dJ>=@>jE!bAgowTmM|CJOCi z9SV7b!{)h|NI3a9 z9&$P^UquyhhBn!{BY4Yo1C)KAfc`*swg|_Qbu%GsMb1)cc4m)Qz5I%sD9C(2yq~lD z$i$}iww3r9X^p?`DzWO9n0&E&e^`fyWu~uGq!TF6MKRLZE70-es-ftst>&sZv6mAz zmDO^TUvZQZww2ZLl*i|)CF-hiXRD!PtNk9v{keR|D+dRSL6d;mGo^&b8s$;14rJ3n zd_Z!a2Xt-{`dA=<$mBuz?w}^R;3%dL`j=`a=R66&K^nGdH>0uyR?GH=;IA+b6p@=*e_ zeC;Frx3&*Y9Hl6e!m95SN)q~n{lEB>|A_V;$Ew&HV8FoCF~Pvt|C>9L{~DB;k!kBd zAc;A?H{zAgn^)r~hborJ%@ngVrl^OK#+jVPKeIyF**c$@z#-eA+c12?@7Q_!-v3MW zCa+y2E7YGEvfVBgq zg`-2Y;MlT%hmbf?mg0yB;RLTk=jT;;dU<+U`A{Jz=g0VWdNUwz+Qm43Y zvfW_qe&t*n>%z`)bTUoetG0>V7&DPH+ynQOLa~u!oM*FtNPHcETGPK6M%pfDa!oXS z!%RRODK$4B$r#rl)Lq1ho3PVa#riV+?3@ISinu@kMG$Q9*90_?W?XyOdY0|#UXc(e z*k;n%IGgF&PbPrsYXl_AnJS|o+}v1M(X=%;;ii8%x_E{T zR&>7^tQiPT&NyXAcUk?OKS&IGeUA8%KkI+}=u9+y=Lf&o4q)Jr?F zou*?YlPb`4=qrm{{(?GrSp2=cXRFk+D8*x(xnl-eOPs3u&(UsDhI#6ihdXzr z%-`G$5)0N%Hz?nGO|CKWd6i;@pKYcpbxU0{E~>3G%gC=xm^l{9VA~@eH%hdeo5omS z0NI%o!Q)yrx`wl?S;}==Y<$g-1)_CxW0$SeFQ3$=BD0bsKB8wWF*+80w3W1rAP4gO z2@!?-)K>Kb(U@TUCLjy;!Z3RN5_vT;-ScoxgA2g>UeLJ|08<2Q#4byFuGDF*eiq|3 zWYJg+TXkZJJTZq&rAST}jb24TltEzrsnIE{X@0=$yavtz$7kV8xH@g@06O8%TcM;E zZ9`hFIQ9g6a6)ls5DxNxH3=BDu?k~95S(E?PF05b(Ow-v<>#{gwg6*#cJG+o4BQDO zKW)=F3cu_1DI6iWVML;JmY?7-1umbb6>9C+{h|&~6$k%#b5w*A8d)US)eh=2;`7ph z4-Tz@J2ZplFG6_-m+k&|%#0S-vK;Lm4Zv@(e;z?XR*(PqM+blpw^;8}CIX-DNP=uq zLz#FwF5564R<0m4Zh?Gu##Zas>jR*vgH(R7u)tl=P_(88<-W&%Q!`7aGEX;+ zXCqUEL~|vt&kb9_iw@!kj6=Id9o`#cw?hUUdkDhMxRhvDEc~0z5x$TapiTHxR(cB0 zcrlF1GYyq?DjuLpb4UK`9zh=1~kH822&UDH}ZanRdSNkKXTN&ssR=MCi z=%Wnvn+m`jV z(W8S=s<7?t?Q7ar_3Z1uECkrv8AihFUu zT-s|2meGW9?-y$R$R3HK3?v_vzf%X~zc)jD3)7alyO@*hl{>(pG@`hd|6(0pv0`{+ zK61aPhd}WICcpsIJ$KAr%Bv9aF)HP!%z-lC1Mkx;VqmdnKvo4Z=;z|M$|q&~yZ?c( z#SaXt`=t*8;J+GYs-DoQURYUh73mc^YJ zvSm=h6Pr^}S^&Oc-GBZ1g{xy{UQl3{9dfn8$#sQ5pAwBfcq)7wal=InGd%^oaJZ{? zDA6l!DDT@y=f5JiNX?3g{auXFTz^Vg|*Y@?+AQhmDCd+_iF)HKQ6M%I+SuAaMf z1qiE-uT4HT^Lw}SRL$-j*}ZV`Y6E&_E{z7p4)41bYAt0&5GAtMDqGih98}xsSM*3V z47YGJpZ6IHm&S^KSQjejD`@k}6*_a&T-zlM2nT5k$YcWm2lXNF>bNNAg&A8o&NO-qx>xXHtiLDjhQ{|7F-(1^E0>_^sC_uSE>&(rs^W9 z{9jFx%xt`lh6-^oe#`A5l)>D28I6mjQY($>OJb^2_;9vxc_RYGT6L7fT0EnnqHX|m z>>wS@lCvAPmXOn{e^5Q=)4Jp#*LIa@qWu9V%t5AQMT zag8$~yqx>AKc;qMT8g(|6y2py4pBy0R!gD6$mm}sMHlBfmCrTkRHU$iyh|6ShB0?@ zkg$(>bF8Svlv9k)H9taZNW$>H|CM<^BpNd*7kZ4oY?(GB90Vd#EQbs(t3%p0`21tx zjyfGIiP6yth8>mvD(s=~BO5~N1M+H=P)Qd8nD}rM+Oktz~vMT9oR}{-ID_<-atgW$x&zb6hEv|fqSq`TJ^iAHV{KDt@ zVZ;SW_=(Oq>k~IuHHcJ134bEKR?kxjOpEgK!8owhowZeN9 z?H_JFPpV70W4>+YYX^4@^BQ@x>Q&hnQm$3loA>R~e(1tDbRJYf?B~Lxl)DdQ;NzTs zG}ZvKq1+xd`fbJbJ7zBz%sP5`{z|BU5*a)aW_q5=qz4U7E95>qrTfjT((AqQ34UDL zmWLx+@br4x&$){F8u1Sw0EW>?gDNQuf%!#(rSI`P7lVI)GS4*aGxIVD9f-`xD6+&W z5xvpzG~9Eyb*?#<-Ae2Rol$#ku>4xx$^X&mUdwAo5*SfL#mE=t1NmIZSy6&EKz@E% z1}5}8f4KW~O{#wkK_DNFA8STxim<8RhbUq8A&gD8BqFaOX zi{CpL)dRPyG2iUPNcP5z^DQb#SApC{!S00QZ_oQ&>g?mkTv zKGZc1WQWrVW7|Qs^bt?#a`k%;=Of?=B^gGGj4qlz^&~`jKq==7NLIJ_+gHTeOGaU~ z&Q*DCm_mUf8K#oI`%gygANj(!$RMg$3x-d}IG||AkMA0Z1Ls|rxL|(B%1rcEEVW~Ggl#OId*2|0IBTNIHjGtxxC=+I zV9N}&jiNN5#H$_Uf!?0{jSMBjH5)fd_MF>@9bR_}rKJ% z&Sjokj>q${l$a_VN8)&EMS82DsJLY>*S4HDCO|h#qPBWE$9r0nR@gI_`^FUZITn59 zm(Nx@H&HaeXXZCR7hnbRw+?;b8O}oLn^4&2@8~nkM5oZaQTR8^b9TEVbHG^Kb0WQ< z&?S*M;sGn7rYWISY4gZn;xGItzRK7GkccK>R99sgZ+=KMCCcL}jW0I|1u0PAY`8QHiC zO?~eS+DyqM$_;gz?-rdHb$xA7Gh=9sE;zCck-j+n-PDi_#u%liS$L6?&AO@iC%1DR0x(Ko^_Y-S-PD96*x(Y2U<3k#=W~Bh4W`q~Y%NtAUbi z8Q@wW<*qT1?Mt!fD_gbzuSP4X7srL~TYfXIi!5>U$Is|f0;;f}pR`S7#6b4FT1_O* z#rS-KfByyXgPqX5zn_!qTAhY~cRd?`{d8UiP?Ki*@uY{Q8pNlT9aA+X= z(n~+Lg0W_@U^d(AbC;S+)sV>LMmCuhS4!xN84?cF1J+|L7`tsGuH|#K$?POU{lIR} zm))T~m)X8tXF@P>?-{&|vQtVM^<`v9q2EW(dr`k3Ma^~;ev_5a*=#@>YHqz{Y!^88 zM@1)QeKzkZCeg-yyDy@%j36uDOMXbE8?}|$u$SSpk*ne=Gq9BLT~9w?FEcQg;j@sd z;wUq)mf>@db0tu7Vl5+NEB8U7vwU{N|t#M&Q?-4z{~pMj%CnND|xKr#iT! zr%x9N7S2Ox*&h8NNKyG!07>|8DUg{l)ZE3u8xN(W0PWn+M-ZLWr_+a+{YY;RQ@i7+K@eo%^XtByLTP;n+)0H1h~L3gXw?b$@lQ%2 z+-WG;jf44|$pzv!RYeCD_h9L3xLT3u%_tAZwf;vi_AHESkx*w#)|h;FhoMTnp+Ya#%Y0PtMD{SJ|3zA9pGq`Xw3n`V_%Y;I2K(5(|AcsC z5&iBjzI;DPJc-qDgrMz0pxajy+o^1X>2}5yEjpDNPB76wi*=dR{!ZG>vx|CK5bv0j zV!*bsjZ^#UW7n#<$X$UQR7P<7T18kd(R&Cj7@u?Nu|ya-?S&uOf0*>T`Ci&ja(C0Z zwG&=NaGc7a_s>$cX^u=eyqc|3otrDB;g?5A{#Sa;N#z3+FS2rqAO$dul|qD27!DW( z;Scrbqt`lXD%4L3)a;}Nj^D+A{TS*6`;p?W^Z-4XMQNPkulRsGi6Xg8xj{ae>X2NU zRwlbDqh+EQOlg1(LSTe%lv(Y#BMQ^W>JbLpGwcUWP zGl8@BbLrI#*2E>W9a&G^=1@y40KXx#2=yP>#{vgx@ZWeX5($;C<*CGwB%&zYUSYkL zP}+RR##+8;vM`-TZhOeL!8k`+{>e8%3=Gtw20UIAQLjY^rI08CA`>{CCy3Aq{v=~6 z4;&r=DfI5hvp|R8g-LhwUADdKAVyH=k8m<>%l$P{ksB1@E6}jk3GtL4Htd7ms${Ew z<};yQ;8Y1G#GT+KMW8)A%i#W;y#8+CtFAp6YsQ(fl33t{DTfxj*x&ks_$>Od#QYYD zzJcJMd|vHjtM=pU)i&Q1GhF~rDxnLIcZuJijHk}rk&~Fu7$wm%UCpL*vqgrD$NyOp z0oExC_(s`crBEcKAz|nD;uCo&aa>Y|#Rp|)?dzH{wvWVdZDeo6wvMn3QhP#X^tP&C z_0Mp6a{UnUJoNo4BLb`J-~9Bu=fwsVv4p~Ar1alR5dZ3}Jvr#VsUQk1U-F^BZ8Gw;_1?WV@}WDb>v|-<&FFyO zi#lymau4!&08@Gz>Ivzk?6ny%F#Byk7q!CvY0PU(6g8;5L$mf^c0rjl;sV$kWa*-G zZ%(sFeZBC`o0PB~)CR5o!~1hgEIoGnQyZiy@S5Hh>hnPuLPI>X+yE+8rdt((D;~GU ze)jz62gjAP$EW0lgv9+z-1fgK%KkI=K^hpplfH5zB8mP_ajpMVQO5o?_y2EInXSiv zOg*>jdROb0Q-=^5I2p#==`K2L`dLI?l^#T_s{r9PV^Y5Is(LU;}^*uN?j;??5 zXq1lN*numya^ov&TvDS?>Zr7?fBfjUu7BvL`j;B%9w|-Invtj*s*7FuSook9p~Kgn)sui zA*F$ZhoiKdO06WaxcuFdD{X-t_ggY6V1qbDFDz{MbQzk82GteOKdc8?p}?a zIFoQvq1NaxBX2v_YBhrMf`pvE&5~kVP^e^&S1B6?SQ$@~(u!bvC2)C`E7?*$iFYtF zilbtO&;IH_Tk&P8DgTa4k)zoXQwFZnqtcJ2bv<||qqMf6OzMB%T4A;CYFxfv18=I{ zc<|=SVID`fzJV9774gJe>4)N{rcuI#GCFNWT{9CUjkXXvW;1PwsK8wiXYFn~)4EDq z>-4Q`rjk#HVS#AyBL1gTE26HKUn9McC0S1P%?OHBa{*b*kpjPyVn!u%7HjjD?-X3C zaMt45HG;-+MfbWgHz%!i?Vl$jx3J$bz|GMZQD-APCB-2TOHeG$F^k1Kk{F8>~$dhA? zf?lrq%V{jqx|2ygKmPk6mZh_+*t<&5eh#L_<9p~RMc-cTM%xmme=GRgKpEWd83t-a zB&!0E=br^jTAXzPm`33=I)(?PiV{A})oO)}h{l;+hh*WN%yY~sq57HMTdqjjIn0H6 z`^nr5KaBWUgowuZJIrT5E!Bf4h9}0VCSAQp!muj_r)JC?bErby230gO1~bMX9fhV` z1K0F{B%0dU=tH82U_lr zzd&$~5IwUnS;P@TC3&AlcQ7QE8{Erx~x(Q(<{aR>Rz-*mN zSsJTM3}kgfNT4u*1yeS7X}?2iibPRcEgQ}-x=E~(vd9V+IeXDK6)g^YSfj{`L{UTBrTVO$MhxzS1NtP^zt_m7{`QJ5nQyE;|4oj7|J47t-BbQ8e-ErEUvlYZ3)}udyP-_u%U%MB8DUxB4V^8_xjx zQk)LVyuz0w;Y&oNoJ*}DU;0JY| z&1gS<+Wm8=^Zg`SEo`E{btJp_8_*m_?KZgopvM%#k=Hp$HYH5lNl_@Vq&OBpiTn>? zT@6U>EyQ!oueET6A)6!csNc=Q`f_#!JqEL25LktqaK&JX)LyoO9ON$iY`3BY##)WP^WQYsr zxnE)-fbsZ;CUiKx2*K9FXDfC%yGX(2>S-k&+_@PhF{8qp8OCQz;O@~9jYBlsKgbPm z)mFS;l7L`wM6qNSH}s-R)WE@J2Xkb>QzEE1T(La9K!79j)=0s>F%T z#NvET+LTJ*O6S>l?Z8@bCe6fQYTlXekWe0()EjyAry7Nbo8ykzV%WBZ0U05pnmo%Y z$IePoq-IzBGMJgbHgE)Gn`3CBfV_iWRn>WlDR+Q}-}Y2nkUdI7D9C;4;2Kmhn+C!* zMVDr^G0w(zg_c5YbKPr6c(K3%FBbO#UhAe3<2>ZW)JTr@x%niyI zxp}S0>Gztt)!lqsR9lj#Yt54u>!zZmU0DR&OX@&9%6b6!60r3SPhf{dO&9KYLvYg! z#p7l%>dR0&5k%|sorE%wpOpEL&bq)Fn4;U0` z8daN^UWw$JS~1L*$}i3kuZAG6a@9|E4Ojg2VO7NFQG^6elXbV+^~*TH zFxtr}e=TB#(F$fq@9I${y{w4Z&g2&j$od%`q8kKtq8%lfk4>0J9+qb5uD^gKn@hJl zz^(YKT+%3ioPOnA6>a;}qQ9#Ah~oS|w7_JK6t@HA6U#ImnRj!gC??KW6*1st<7sQ^ ze7+!bH{;JLsuFa~7d>5N7Z4KefZ_22Iy~n|u5Y&?!n#95&AY~E@T-7OTSue)LfD_9 zT*n-E<$3keQZ!6Pb9pyZ$Sw@7=yeXTVjnI5{3EbK$XDp(pTBuUCof*TJ)1R|Lz&Xm zbhUHYXEeBC{B-LA!-qDt_e22a`HZyz{H-v6V$0LEYM&oyr;YcoYjamRul=HxM_C`P z^Qo;az5P;7t08+=(q4|kDY*J1ZUK0f25n_7<5HmHt(C`UKW^#$%A;m2nCFHsZT4yp z9P;ztgdghPp^So3Q4a#$I*(5L@5Y2O{#KAT{J!IFU8JUA&Zw~STaE|_kRxj?K?INT958Fk~#!i+FE|&Io|1FZ0qwcAKr-pP3>0Os4&BgiW z7nn$`DL03ZQ4G;UMYIr9bovlz_%Sf5nfVI06d>l=mykKvpihuZot*j`0Qy2tCm5h^ znet^=vE6vsFf~Kgm{EEC{M5bL`{g=&dGmUnN9YF@U<`0YW2wUfMxa%)2vtL|MqYzd zMjL*mva3$|BW)s0MW%|vjiUHxPU?&d4uv8T9tBfMm#kj;KpI6c!6S1okND08VDMh> zcsk%f4L2LU4-T<>sB*Y?$a)`*I#_gHb~3}l#ZqEbCH*?^s>a=JIB{8+sH>@%CCja} zI@*>yUz|-`F#!}jmtQP3f)rf(vgGL~Do2x;iMP)764Bl;&>R>C4iTv2no*QNExpfb z<`!vve~=hM>#AZUk&G!OU-eBnUGJWRR2^I(ljy@?;t&!O^f9A(&G`(BDaGOrr^;hHEM5NQP!dRi-o~o6ZTC z(}X1-!zMBm7&I1An6>ve8;UEzCr};Co54OBDbvwWn9FIE3K3NW%p9XbNFL%Jzv*^P z#5!h}w;RbtV2dtuV7t787I;*T9niF++zQ=3+qj!%LDGw-zm?hnY@8sTIbJ@@;(Va& zA{rv?UE{M#BD+#HvXc*4dJ2%GwQ|+ShkyU-trO7c*dU_jUc};nV{Vj~iLIod*T`tw z+-VyIjK?9djffYz2h_#pkb{ zop#hq;e2UX9@)a0#kRHtbtLz+jusx^+y)Nnr=4sza>$YqwQDhfy}prn7_e2Kmgqms z{61_uHnHbZd%D(%NyENupeLL3%P{|NqRES~H-RvAZ0$?4t?&PQWVi2RcjG99pPs^M z>)f?t=$in2(@DFv7^0=nMvXD^g<8%06&!NXW4ma6L{ z7FTRU61!>S5y9!;7-0c0aH0EZ!1}=gzzBVpWN+YWh}R%w`|!X!A+2B@KjUDsozQ16 zk32KNxhqi=!v0YZ9}(-ceU*hX;#dM6pHPJ7xqVuf7a07nm>FM&J|H+42b3F>J=m8- zVGZuUJ|~yOGggak@$3NrdhkudKM2?~+0{Xvf;&1lRcS3#hp{xwwb{iA=fg4zz-OC3 zm8LHmBmUF&AEVYhA)mxI#hil$BBLm8#=gNBguZ;lzzGIy=Hc$XqR<7H-Tb!H7mDG= z5%;%Kw%@>>YOm=B`X{*K0oDa)qq7+-v}`@u47=JZcclmRrG-Y}It4K!;=w9;&hdel zlH-Q{Bg`q!`=ji^93R&uLnDZQZZ1I}NF{;+e^jIZ7(91!9^SveoiOPCT+2TYG-&pi zCaA6(3=ApX;eT=v+pmjA;R-<3E8yD^;_3VxCv2+3G<|Vmv{mIcmhA|@lzX>Grv91% zw!fq$VFP&U9`MA8G9N|qnxjpjo1uObja3fS3QcaKAoaiL&|o|JzM(tU3@|=EkxCE2 zUoJp=nuogL0E*5ll@0)=QI?O{Vi zng+gF#-LvHvg86P^J~_Pts!bf<_dKBqg+5+7=k+u$Ks?32x%7n zHaybA-T`OEOVfg;-eF*IfEy9^Jd^oK0C97h($YPTNPF$j zMo$paRE-HSZh~?j8S}VXAeot+Fm%-B*e#mX$rh+fkA7G5k2W{0$P0M)&u=7zoX1Hc z3N*%_c>)eci1?l4pD^-Ydkp_kh}a~=6nTC;vc*3>nEz?d=l>L<|J7h<)`a%S(n!dQ zw3SvD*mNSHbVQ)+MiJ*0i#sTG!?PKdKH_S*q?O-bOF5p6#L;5mL0NFJF%*^U6bf_# zYq=UQv&3BBkgO_qMTFU;Kc@Lb^~=tUJIz!JLo-hA_ld9KLYd-iwCV4pywmPm{BQ1^ zt_;t&qgz666d;bnbX0-MFl3J%=sagpbiP}Nkl9t`TiB0RkR(QySCk~o44;f~jdY)s zaap;Zk)unwp8lgOxt`&pO}U=IqfWW6l<{8XSAwKl)>q&pLY7zLBtq6#cM3tne}r;= z6Uv{INqNk#jGP~MUz^aqd+i1thUgzr-rs}W2A%ty0G+Q7{G@NwfBtfQvofE7X2|J8 zz6W>|YIfBlI5*tsTp4W<@GBkjvCgk5#>%6`xzeDD9&M{*CIpPRvsC&w?95twVXKEC z2hq_ljq9<|v9siMx>1vDs|Q2JTlyndY0kGWoP5z5EbUR_GL*GWg^2z0DH-W=Nl@BU z1glB?np`OhDr^F1JagN+75C)=&kGL~L{0xEGfm~f96WgcNG?uePIvM#qmuV}*D8%1{(9iRp4tBc;wFPdCPKi*Y6%7qTY z%$DUMsOA2lwz#=D+}KOsjB#duZajkM`LV7YF)}<{c*>#=ddR9p$wHGsweHBHeW9zD z>2Tvfm3=bZjig*bXr2}pxg)qt=y5?2PDC#-WAj%p_{i|A_gCWygTI8^%RFH#Mq8FF^ zfnBRgm(eTcs}23Bl(_voDk_v(&+?HBJ8C_^5T&MF^$VpwE#swBp?KlVBtQNn?tGB4 zR1=VCyssH{WT!6OxY%c(9i?#2++e7|CLr)9Vr211rbrTULb7}QMU`SZL*a)lNb%^w zlRgHhqZMt;;vkS=RWEmuo`|eM=6FelpkcsW8i(@YD>TsJYB8O7MR(b&cz_XvMwK2y z8D}xXDGMq&EZ+a95av&bz+e2i2MX77WebvF3n93%=w(PB=+T=aOh<8E3vdkLcM9;y z^2od3A^Hx1zxed#){Zkr&$3Pg`~yOhr46r^Atyz9r5LQ&4C1L;=2UE7Mo!53 z=*gXMZ;$;YfR>wIr^zWs!PCLXN8W&pZh%)w)9om3;4VI(vMRA!nt4HmnDIZ7-Q-{&Po}=XtD$t z`OUYW7izYU9N#hHq4Hc#G#h1cTrQ+`tE-JfmVI~`Iub)?@efzVI%Pp=8_y(C_&>J8 zSlauk!ZzDNEtPgTTaYn^Wwznvb~9quUlI*CZmKjq97^J>lhw>LPH!7goKXj63GGfS z;DjJWe5Zvxjex+6#waA@KlyoA@D*E_2oK_YWaq4 zTY?K)X+IdAL|Y|EJDYCwCEFSzB%5wLFg(SbDNc4EB%4RXxE96fUKa#r+cVQMfnj23 zG|rL7m6At{yWD-8rTzyOWA4dt{QbeG=Ur0Q4K=(zxc&SdyPREctCd5dxBb!1wcJfW ztEB^Gm*^mTo6?|so7P~}-LZnrvIDFgxqFs8**pNp#@JfUdM$3VJRDzPt9GBZP9<2y zp%>!T*a=2pfS+Ww5xc_z6~Zw*Y`aY*7P zF9heEL;5&Y5>%4+y3FC$qUWdn)nXkXBwH5-Bs<=KA-v=sSC(hy=nGDrT3Jq;;^3u} zuM{x1b#%_(g^KvQs!>B1wypRfiE>9!f+c_i$f&5CorqIb=#Lh5(%eBI#I-RB5e;wh z_LUrM+(7oZSYSQFe{;P%@ofB*+l9(WEFKRY!@%!ysYI1mkYLEnthCp>)nZ~a5$C^6)sIq2@2g=UVIr2!v|9uI$p^NO{-DAMPymJ`)Q)G zG%QL^!hOEY$Cu;&&-9Zi#~q8jn^e_18gSE>H!Mn*z=Io-vRER$J6F$B|K z0f#8fI ztgHZ7fMSiFX$5o56AZQZdvx!o#lhGkjX%I^jQoZjScrX(0$xGJ#jw01ML*mAq2+L# zztZu|z37*=?PIlJfyO!S&&z z{tp*(NZ~8g^sM(K>8N)*b+C{Hq4zC`Yc6RrOw<`W++fqmW2DvA|2iOsX=CF$@|A;L!C`tZv_u5{rkr>yOyRxEGaB)xue-W zik`s8<^fzsMFYTq?Mu&bcxH(nZq( zI1f>>CAoR8j>)CE(*!6b>_b^fwAPdb8!;idPf=(>tg`IWB`7#bBZHd)l(~-8k9#l85`Eg(GKJg{GsSuK3_3% zq?(fyh3Y-=Ifbe{@G`BE{OBWM>LHK3zBc(9Jtjv{D7R)-u&a8S0L(X4>HVf4S<9|@ zqi?tCd$H5IWt)K=Vt|tU>I=Dj<1|XCXicDh5TZ&|sswoJ4$Sie%)Ua>s%i=bPjsjo zFs)H#@f`rM0hflxvf$QmC}tyVRrC63!qs^i&&Y9 z*oGf_rk|buL1J1sYgvkr1DIVVe*xguuioTVVqu#B-2VhtN{Bz_&>u@`EwVe{4qtSMg z(3|aRLZg=|%BIGR(g>hA!9S(@6Q6mb8XR)8Q^WEoU;?{V36Y%(45+5x!(iV-Wd+I& z9xcHyGLeL^VZMPX`E!GJWux^@$5nL$db&Y(HPLT3!kGrGm;um%d7(eBHBE+&WioGi zL;UEga2r4sn}6HHHK5^b-dMKc=MUCK#9X>av|7e}maQ}$es6>R+Y_L{xJ;Gwj7;tm zPXEE$7(6?W1oLv;0+`(x=+y(yYixEa+t`?${(UXEPaTTt3hgP1L3uIWPf&&GJFyaZ zqr^QgxvcQO<|9|>S_TKb$u*G&qDXvkn*Yob7c#QOaj#j#yrPCh3$s2jtKbs|bHW&e zX%O-w76$BV5C<>{^ZIS0skcb)YnjkAci*3SyZxg7cC^faFWnt$tXq8>@y~&#{(f&0 zm&N>G5Wb4s;wO2G8Ii!2g9U)Py z!5i;y_C5>c^8m(Mg3}9t|Ei>eGYF{qTrRYIT#ayx-X-3s@hh{~{A8H7yZ4TXMCct& zU%z?AQpxdCtT}T*@3sxv5fM^!#q5giy4*fOzAez`qt=wR4+2Wz*Ew&;E`FXOU;#jN zqdqTg1V40Omq|kPQYfn;?8um&;FgDVM#E&e|FRq$Ua(Z!;uCtl5dOCm4r3+&Wei{h zWOJP7JUnqu3+6z=1-k(}n=8QAu6gVB6sr3mZHfP!f!h zbdZ9$!y&C=a13=?)8>KFpLXzhLW||%yIm58qjpBAt(U=#@9y(;?)UTgoo`hQ(n8#N z$|Ii-D{trh`%cDsj&IuJx90;h5F}t0=_i-Ba!Alc6C&!t9=^JCNTiQj=wKhA&=og$ z$=ww==!>^Awl9x&a|$p+u-^x$BiJ7T+z@W}05e28YTK^2zKQ)qJc0iG zr0hdxguKevzxRhvija31L;|=&r(igR!ShM;1@+FKqh6y5v0D^#9O*1&ByX=7)ch=I z%jW2$ECRflIa0J4a(S7NS=t*5$`a;jLf1;ubJcc%uC~Ff6WJ)tO{&G_JIdY-NlBIK z&DOd^b6GOw$>zUUmkMm0MA%1@p>wn|Aypj32{q(m<8wv=*lSFovLT^DjKc~tyLpb) zEBFtTHr*rxgnao-HDQh^G^?tl0yA3zv1H+CB10<7sN%7Z%HwD)D~G{2n&I1?V&-QF zjFg$pD@1w3^{QOysq1XXtTnZj@mE=J;B7RSQ;MxBPM8O!v|y}@WjQyNV3AAau&^gC zcxJ&WU`$kfm46#-GVBK1Wh&Q{*HWkrUT7SsPh?|SJWuUokH<`xS#noyy3N0=GU87q zGTYDunVqnvX2!tHw{xce%VnxO(ESxGX_&Ivn#i=u)k`8!X4G^;$h-#V%E;Oj3{Pn4 zY@8nz*UBOLb!QEHeYBT0rK-DXZxBpN!IiNE|E?M}51-VzJYjqMkR}(6R!u8O{meNn zZx&}=(7H@FrM|Pwt=v&fWwetSO>Hp`dI=ILd;g%<=O|n_s*=#9*N(W{V${Slm*p!d zlf#7Xmff^$t6C(rq9~cIkkwu-eP3!~=eI)ET*Op_cJaX68pi9mS8Ghav9OdzOv@=8 zvW7D7pfUHW~}?AB(xPTd}86;ftBKBrm{L zA&pXFYe{F$;BoXRp7d`RL_bAg(hbcmPO!!%&sbR=im)QHxR;AX5!aBskA;iKC8!d* zl3z_${5_!N(6h*7dd;rp9e-Bxxhi*_61jEC8y?UT!$fJ=TS-BY{8Byri#Bhx)_RPB z>GIB2=i?9WrVzMxylSqTTe#PS-umH@SGd;&qmm_!6E$DF0?t{WTjAi9=+hk zNlW1S?E1kM!CKqV=b=Y%7i4~;&i2fc8LK*t7SR%Z>}6a(S(1=Mm7i)B3t9^j$n*H# z>y2c0CVt-F^$pEz7AK$2t?4wEAWeZ%=gQyulI^{T%}HmBAmhb?Yis* z8??~GZ*tVr$iN)SxGn2k5b+Ss4)Fj}_bU-}J=ehT^^(YM@Yp{11wXA9@c>cxi#bBj z@zs0<-BeHM=R;aUQ#qMj&+zAa!9a7`U=XX{0&CDi8Owig7yRiZ)1M_dRU%vWa)R{3{$tK(ejw8fR&gQ}pX&T~A)ds5+w1D;2Ku3}6) ze(TgIsLvJFk=fud_$qF6SnIMwYx`3D(kaYUnn!ijtwqhxLn(1Ut6(FDEKb)u~)rGa7hpj7taN1t~k#FEigGv66YWqr1R$c!OzRY~^uYkS5Qo zvYst)1MY{Ed9$a!FgSf6Y(3T38-H-;3EnIx!aPE#_O1i-`25$`sJcb0qG?d+F#4~L zw}OijG)yM2GZk`2Jd^~qmJ0kvpMXnPTo(c^4TN+j09vjCR3mkV{GGfHq9f{71CmF4 zxJmA~QaL5Ot76H723JOn;I7t50>YLq)Xh75M#MdwBSpl!OEjtB)rKKww!HO~?T-^= zErS~NeJP8rJ(fG~oZZHw2PPu3%OQyNL`zkFVYh(l8m}mqJa0jr`#_y$hj)6Yyh9!- z_u5VuMR;?`Spms#|A3u@fgZRcu(wLfu&sVy2aDsNvSVvo1h4fXy`*m5eTTKpEz#E- z9>-A~bNFb=2^RIlyyn=v6nDduf-i(K%Rwn#tut|)bmS@i0XVj!GlGt8#G&#*m#9xv zOdET+EyK{F@{i8vV9{jg(s}JhgpZV5V4GM#RKmvxfmb)eyky9HV~Dr7^>wC!_gulC z)$r*n@krY5GHr zLDI#poy7)33je`3LHc((k@ zEqMxTS%FkX1E~1`MRllEAF5V0Z`4fK>2xkP3zQcsPpr6IS6;j6T;@9WW@Xr$-AI}_ zX!vJ4_q_W)`x89xIL~I_y^SW#0`-AB<%9S)4j_H#1uEA30`hMK3HDFUf4~-CAsUE? zAypPC{v(Bq42v8p#hidbqE1pGrb=QeHiAm6kzSL(A2&wqRZhebC{>cOu7!?Vd-9Vc z9HT%sR9By-Koz!x;Z1>(QPF}&PA;uK7kg=1jL23vf+Jy#$d)#tNN9{$Ldg&x5-yG# zvmtSgm?BqJJhCCVkC+gAPg~PY?5So#bYwJqNGjIaH|7vB`7`Df`ij;P7-(u~ z^IHg(^;b?{0EXQ^ZxUqsphLUU%+y*_xb&pJg|!>q9ce}Jo80AEjHB9_R5kvwv}R5Q zch+(TZawF?UcGMqSbqLk`5Jus9DaGd?g#K0 z8A3@iZxs!1jn<>Z7{`yMh2`yo8>?GuY22JMD?7)>rVejyo~-Qa3XKPdUi)(nKgPN1 z+A9qxQ>`=Dm%?al)zy|}dq9lG1!&Lj&xL6v`FQQYY5|B)`F_7xVb4y+eAkh%Rm**X zSsuYSISWKD{x1Q=HOX0{I;M`D@ckNF#4yOqPh3v8w@XQ*FJi^~9{VwT9n1j$r!}(u z8fMg6P~a;(mXD&pzh?9v*~&=%5H6e;e>qHAwTu;N@M5QNV7a~K<-NF1`O-18cUW^d zh8-MOkP_lP$r_q~r%E>^x8^SP{rk8~NS()ECS}xt+W9)3NXha!Lh(BPaz0lBH_CF@CGXvK#LpB(XFg)|N5&`QT)3aki34lRW2IEC zvWa%w!Sv@sYHn2!zX&^0!F_KMxYrzMzsgjfZgE#F#D{n~zTV&h_MtPV2PjDG3BJ8S zGFsASV+29b1Zo&7E}PY#K5oM|@E6?%R;*XoWq7kt6E#**Jgvyg!(GIH!@-BPWsFLm zt2LGc{oeA)tQ3Q9>_>2No}2v~A)Ks@#m|j%rxo4SCOadXUyz^-%WVGT(#;#yC*Xg9 z9^A17Z%2f;wWPfk!C+G#uB-L;*Bv!f-j?Ky5Zig9E!zM!3HwOC5V;|^9PB;EOqoY~0Ez2X!mtYq!A zz`#3kzCq&NmE9WfH|Fu5>G{Fx)*BJEQbq>Ox?^k$t*W$T`~ z=;sVmTFAld%Cd^dCHG7>S0DC3?lVtE#!>8#6duqI(F{mGGBIkMhf=AZi{tV~zqyDADTkzjDLJEdW&TgyBC&p+#RNj^UPW~O?)}YEQi2zxH!n@pnBu8?2XcN~=j<^$4kL@`qW2?r zx?fY(aFD9iIiuf&H3a(&6H4{q2_AxPN!yUy@ac6xcXsa}%m%8vtSAQ+*1LkFuA{wa zN>cB^gnCXl3ev5GBD{(7;=T%i-WJtAwMD0*6#%XVB_d@??3MweF{pt4bJA7wfcL8z zxFqWqK9VP~N9Km>Rob^r+#x>yX+!Swqwkc}7XfrYxWc?yH$%|xPpTYH`Q*-eRrb}_ zD(aY=FbcvY(J)HF(+4CX>{Zt&4zkc&LSK$yI)h$POjem2F0s~KW8`=gDDX*>;*z9C z$BTE9*a^$)ve0%Ejuc3|_bkzGNG%zq-y^QV2`e0c{Hhyju4rjGVSLREObt}lR)79> zE%2P)`jLvJ8jaQ#GLuY}=B`unrI6GPro zZf-R1JmNgzR2Y<1i6X&h{)m;b<(%$CEflU=v!JE=2^HU9$Ewn$FR^F39GY+4+r457ONt-g?Sc z&dDB(@Gu2m)EEDZKU7e#Lp~XIS@ArI9WzT1Gj05)3YC${*POR_lt(R_)?JuNT&@TPvQlep!vj zN+GECul8ujv>qOv!ntaPMgBl)L1r4xk`rd?cKwII5#Z>v3Qn2>nIeEf3x4lf!cBm{|e@>lV%h*X|^HmU&P-+SRs<)tzR zK(D4j;o$L51n7JeFA;mV;JaimX8o;De(if2P<|zQI^6EU#3?yU2t84X3O+PqwOpms zo**OqQ3qTvILfq60g`u&KjO8G*u-pR4N!1 zN}gXxzkg~KulTn>#mq~Ks{*d1(2V>JO_L5+B!eJ$?cyn(K5PJpn!0yDGwq}NwrJ;hjxBw25 z)-2%4i~z=Xcn`=1-f5so7GQsNjy=7x9%~3L0aU=QGw2rR^BC|XYwHs(MZob3`n4gj z7h}WwRCSZ7wkH=S?Q^DVw5i{`@gEU6|pzq(7GW~W6M1*zYkGpx#I7k)V^<2)JbQLQ?-rH09eYPa;6(u3n@dOnB4ctA#qI$5&G!oDww-8TQLaHlu_y z?x{H9%?y_%a%G24;e_8Oq>Su?m{{R4=vp#43FxEt&49sXMP}{Om76p(WlRSxrh{5( z;V(6=J1}H{Mz85wm_617O&=oI7I@AjxRit5_8=)b;HNv(?%%lmE`++XD*#1wg^Kn{ zyb&88DB*95fl0d=tT$q~9XYH#Izw!ZWIq2u9AAw1{M^D-uzAXE@^+HeS^3^RISB_5+T)C{njMjV5yMprsuSwtSV8^azA5n2a|c-r!bzd5_fLr z5;V|}_!to69mzww=MfLp1zxy&Ag>2MX?LL+Ur;!w!!6=Lt)*0r1of1eh~HW;@|j<1 zh>rCW@UFW8xkUO^!ZNc_+1Cp=m>@}wGy3>DFeN^4JyG_1{9=6TIhtuIDKB6|&bu1| zKV|Jbglj2Ux;*rNBe$=hC30-?&j&;?v~=-hq7>#Ks;7PpZc|eZlIJE*?Qa$k4pRmx zxTy6ALjyI~IioENuSFSvASNJs{uIR5GPSyvTg_-s%@SGyky1K@CysGpc9`T5rn*U- zB_9X#+zPakKhg@bJnZ;Qe8s6dyZa}`k0`wXD?%K$l>k1e=8Hd!Ni{N*B=R>lrz2X6THi)&okbzs zV?oniT;WDi`QN@OkVl_Do-ZOgb9TrA*DOkenV8gYe6}_|f=&HTmmY{-g+zMed{9!X?<&gLRLD@k3eQQT50eC6a2v}1XdWCiMpB<18*Ii-$bD#7GJ zys+H}(q$qNoj@oCg7r+W7{$Kf4B4+3;Bpb562k0OdHKuK%%|$5Cimjfc1ih0X*q8@ zxy3jsVQ&SnwiKqV9eC_Xr?M>@@&Kw|Q4)s@u`0lZ6(wHdv+`*a`fFYFPn5VJ3-H4HY zI0o}z;ha}mlz+&!LH!i&iTr~4rrzpMH|Z01sknyF`Iji$*P)jD^2prkI8_^8BNJB= zQ(a&e{|QVxD;SjH3#GD_S2y|r6^xNGvvymnk`*Rf{3}?EubEa7hRX%d%@ccSRL37&e-}tTg7CRTOdW79M(! z5I*2pR+N6v5H9b(@3i*7xs8zZHE~^+;!rSZ*yvQSYDjxLAQLWsJW#oWu?@5MM?b!x z9k_KomI=D$a7>;F^|pcAfpuqr7tqiSetD|X56`==yatZr_9EN{Pr_wS>h`3w&k*xO z;M0NI+XX3kGaQ%e*RTN_e;?;3sDAKltoIGH!vhHj5Qva`Ab!E>#nNm1F$DX7`JZ&2 zFm82xhxIyr2_gyk@i45S_;AMPJld_yypA$~-M2MflID+5b&NXx2E_K-EC&73GL1q6;cS6OO_OLWV3A^_5I2zP@gjGk7`cGJ3!Ju+?E>srGZz$yNOTlVsV%a4ng1P^7-BVf zqKiD0;!`{TM`29#h#Z8iCmTH`k}F-*n54|`++^DBJMo(cj7I@QAkiqB(bg* ziY8>hs-$tBDNtP)Np(2-D#6rXEi@2?D^D(t=&H{(A(xh@F;_)L;SmsK;q3K!YbT5Q z{s}%2I_Rh)2{BQEhW~qEv!V8SHRQVBAbSqA}Ko^FL`P)K%5@fC2Fcn|p&K5hWm0khF1>dC2E zX#p+6Odu`2iBh!V98Sch_6WdSA_IBJlx>X0;v#Vf4iaA_tU4My6@?wyI15dcc+jO3 zVZ5ObRtz<*CB2+eRK$)YnT;$mF|c|ICkcb=4ADgm#r>0HQIb5>uz>)5p`)_0gm10>txGJAG5s>rDnqqkVP*}H|9K9*SG z2Z~dFM+H}ro0l}Wtl_K=7^kmG(}Bosi}+RNPYj#*@)DNKBSZ#wbY@ZJ{hPPtp7!qg zw|mNo$nasW!*ffj>jh22M$@i+6#FK_km#B9dz_=K&2-VIiokA3(8qi3#&&4Vg*?ew z!Ofy$pU$Rwpu?6p6?&F}{!65OJj{!06R?*0Sd`^*lK0;mwv_E-=x4Wq)* zBDI1t$>^oEgT%6jJh2XmVS@RxL!J4uiLW7Fkgc`aC8r<-4I61MN#FL&5xgchN6en? z3g^^V1iLoJ)D<5m)MW=JC9``9G+Hv1gKZW)t&V(>`oVQ{VD(TBO!Gt@Hpn(HT_2Qm zmvK!u8+Pb;R~~a0w6t8VqV1jc;j8nJly??rP+g`h?6urM`6R++b*B0gP(%ZQJvMKK z1R=QA6vJVg5ti=y3a$pqgv$r~fp&gB+wS>^*1!Z&eX>n92Z!@QZNGGx8>8ceA_Y|7 z2MY`lRo8{G126B5I7-&VRyj4d?1WX;1mx_UB4h+y?-iDC_u+e7y(337p#lP4F=Ros zksoM8G!8X!Z7waHI6X7FW?;w6~nEvNLw~M**`&s=VENIccm6FR)KWOxt372*_TX-s(Xw8tr7LwI8zTKQR zy^%>HWW52xTXuNMMFGivA=micjf>)%`=%<{c!0p(pWFjA0<(40x&q7|?`}qvC;XJf zJDGE>1>#vP2vf9+YD$OxCq&|mm^-oJ-S5e?j{9%$z1qqAh| z+a|11wS5%23ozFWz#!D(^k~q~Y18mhQXr~OgJvSBHfF2a>q2#y_T|IY&FZ#y%Jv>< zg$$PSl}ohR_K)iSfnTjO__)CI{m64Sb2oQ4_i#gflgKYZjrQh{oa7;1S89fld_kCoGb5W<#^`VvP4I>i|JIPE zKCjXCsAi`JSRi#tFz6jQxTNdpCmC*%{cuekF4}s=ik_tFIWMr6KHAB}Bh)xV85fpU zIm|&OPxys;wu`bd@TMN=^L4X>I?=RH8d_w#Y3{Q8Ypu&mvoLDrES+Y4V5hG1iLxxN z;_h>z9?I*&tB9DKrFv-a!_H0p4At0AEWt`+jX;Ol;xHWDro*Y4Rzf)Q! z)bJoPKi=|&w;Q5O>R3@s?C>(!L$O_CrHGQe#&388&W#T8`B+eCc|^sE!F@3-w`Uqh zQ<>#ukML4)*UH|UWK7uAX8_9EWSn}vR+~H z7fQ|O+p-Ez=eAyEAs;?`eDiNiR4-Ye?7Ijjyv_Yam32#>s@PCtD=_aK{_5E4*f93B z8p7Nyoi!b9e09Yq>PTs}q_g%CUsdzZd<@wO{EpfXic-}d>DJjM3jWh3cP>7AzEQj? zeR0d*?8VZ*jOdK>PVd0$$5v3{r1Ktba^`Fmk=Sl0PsYm^#-LUtI2r2BUYMgDOX&j4 z<)C*5TGRJrQ@hKXt_Yu>Zn}wKG>fDHS17xCM~`TZ`xpp5g$f6qLSVl81!+ z4vdNAK*Zj18vLX!4OOtNt&XW=Bt=m@E73H*%Zm=S&>*rrViG)?4soNY18YcUj6}=y zLR4rzy4mo>po`mZ@$?3L=$^-g8Z#RXNJ>{vZK#l@k4-h7&+oo{Wv2ej|1wN7$A5ch*0<*(5+W;F5D@ricX|$v^cMm6)bRXZr zJhgnoRL0#9TVF1Kd$Sdf7d!T3=?Sa!XZ|%7)ph(y>mycXw}hG^7FyMdt!c6;E0Bp- za5w4vpR;Hwe%%{k6#jgiX~)FhJp0Qsn%v^N@h7K`5E(CvJeiU+Lb*xm#1u%x{84<|pwb@e(l9jNB6bdy)M^ zr>8%*ytf6tV^2U|s-+M)sTPrD*HTn7G?wVVZ!e7Hp=rDXD+W83}r0Q_P9wEGk|x z)v#Ir2_dmTQICU7wmOVem8=!@JHim&mz@8B6Tg z(o|?HV!`_0W@~VhFU^ts*@GIwx)P`LJ6Cb!i^w^fX=e<@?FqLp9HEeGAoTwd%5MC* zKQ~=G*RPiA{byj)e`X%ed&UfnpT>`I^ey$2)ywO%b!=dkA?z$Pf_iFw-i*Xm9ll|J zexYM|zbVqR1=PPdkG-`_kESiHZjDE)+tB_cIQX0uwdL3mFmbMS;Fnb%NQ|2@Z{rSq z@E1s4-e7n`TIB^I)3gb5A&Pt+%W+X_BTx+*07I;GQ7zz};Le6vvWd%_yT`RqcUTI^ zMNsW7hW+mqSz6sex6Cp4y25ZsG-0d1bsfgNS+qN|Sl5dfNo;?-wF$NV=P<5$w@A%r zhIJ^kc5s5|NO?43tH7Z;FSzC6{$GaSqOJgx_N+hkJnwLJjdj&5{=bY00bSL|uJ<#!fYj+>);XlIplB!55w3bCYO{)tzV@8h8Jk82TYxyh z(TYjXCj&|4-MGugZ)@eO@W9*gMyyE0Yq`=g5LGB*yj=>V+h}_^kd*3LxgZ&K}G8gUB2NUvzFwYet@{RD_I$7yvn7}--kOzLO5xfyqtJs`l z)QX^Wk$6*VeyviI*t|NamiYWbWNP4aIoe-FnoJtBzs;EqKhbx&u#X{*fpY2lED(oR zIyTg<(Qem7e>s??X;WDl9s9bQ;%BtjYT1}qwK7GZhw-V_os(ap)(x3CEilKhNtj(E zQxEO&n@X9qs)nWf$F%f>uf@2V!Sh>)i&}6;+FAjz8lNWcR^X-XJjB{2yLSJ@; zEE_Zw4y{*Bb#4kXdUkU*Nn=FpIb+%G*vfT&GyUaSBRTO!PHjI&+Rnbc1&xaF#JR=` z$ehS;Nk6;*xrlCma4i<6E$)D^5D#sFx8rfj+mG)}iwFmy)}EZm0?^6nB~-Ux$g9hy z&V&3r)XroHJ#v}BHEddJH$taxdAOIv2{@u5XUo_uW1VPgyAVGX}8c z5Uyjfxx(tT(ojJs(!zb;^g069N{0Wclh9_7jRm}Fi{_FdYvgM67%{6Io^k?M?=~0E zMwj;{lrUt`F-fwMN|%tOWy9mmSjNNVzICuJ4cD`g2+iYDVd4m~se(X+fJCo^O=lXp zvKi9kcN`31yvQL^tf)Qh0BfNVVqjBe{KZXPT%w66!@+*e61fL}1|9{;VTSBb%ryCl z&HQM`aym;_THh&a9fS&veqHW36C$S!`==xm&Sb1}nqfWyryn(per{_)WB$z2`5#YA zN)J`us`~V^u-EsMy0+OZbE8QGCl+4xJZ~xZWh4KLLXFO3_NGxyek_o30s97H+H{Hs z##GT08TZM;JA?Rj#`L2hUI9BggQ74S>g3eB4Zx0|7rxKqy~EJXD5=x4!&q*sJ6)II z9oV%;)XBgm{EnWdbf`LAVm-G%_9h4V4uJdDlNvLc39?G0Z9CeG>0W-uE_|i#2 z45{u!A4+@7Z?J(dq->~x)(eD#A)>}d{%w|S3l5nk+ujyYw&MOG`~tt0X=a{qF8u=h z+W1*~$wECFY0$r%~H*fPyC` z=?R}3NTb24e~TP8M$>Pc8`OY}{(5?avYWn}!h#+*$`MUPXVduYXzqrewF|9B4aF3b z%QrT&J$ae>TsT}hdRoW{K@F&K^5D*5$g?(^7O60|Jy$dGu&Qs!3l%ovxDP z@chwm>`B*7c}eWCT#$Ly;Va6T?6A38%Yx~^4i)Z01puVA(Ok%7i-;+HA8$4D+9@KL z%N^IQk+X*2yO7oROyR6D6jbq{}+te;r7)!G3 zV;OrsMT<tXJ=V?9TwGy>dbSX%l_NWeDjn}3R1*}>yaZaT z?-#ZgR#)p_E}fE`ls(5}w@U*Zf%l)%b4r~6?HCfUj`w!9Z0+y7y86pGLdjh-MS5cK zmju&4L8?RZsJviMw=>-#s-@Z>4C?WrqG~1|dtS=J*v6l3$pQQTD937QlGs^$Sl8L3 z$}F4d`6_uIDaiH@`oD>jp1?T6q?)QfY-{pB!ryQk>kS0soyD}`_18p8msMqX?#4RKz{a(Nps@wy-?MWFuXK5OUDaoO^z^ZvErG4>pe z5{gi2@tGgf;sVd?!=LV>zBshYBLRO|9MWi9+K&t^seL{4ySc`a>P(m+k4n- zC|iR+#iHKy{>RWq)?tpBXk>TOon#I{vp$TY$4 zj%}222-fTOQHNloG?v~b6$^*zi6Qw99UJ*g|kSLa>273LoY#414$fo>i> z5EiZ_&?_AFj_HHWv>>!07^pg+i;eW+5I;mt*>*?21+IJr{M|;=gYZslnh>e%Np|S9 zfV#VD5v##g60*PSg~FL z{QQlLMEiF|(p%N{xhwB*BRvG3k(?D2p81OPB%bM%YE_@p#W0GNZVw;>;_4nD9r-*% z;i<(DQr>D+h5qso<54ncnJyC}A349U(7R{$r$H=V)~uX?@#;=c>D+rWNzv9e59=4W zVDIN$J~gs_*yMhz9_t4%e#COOiA{sl`~zyb%D#ufx;PC$ z{Olj{1xUtt2=89}4Yx(+kJ}Vg)DJ9M5!JpQAgAE$&?18IG{x2wTIa5mq?}+GEyf^+ zNUkzuVf0G7T@AJ=8t2Hd<8y_|bx|!7++INF4z-(R^jf$9Ji>hfioH9=4n@zwEH?< zA#&_$ko>ZaPC1a=L|SP?HF22^bWIhK%5VY3mMd?C`&|juzTBRtZ`**T;f3&8Tyx z)RtE8%`18vn>)>J&2CooeqTN8cI1s&m`F04)AYC99-}|pyRSaC=jwRAFaTD?dma)o@h?X}cCq*JB#!Fk`(_egV9Nt2~;O5uC@RoZdF>>=~f<`BV_$GTS ztePL6B&_iN_F#B~io_ug8L@mKGv$>Z+u-?t^Gay*ik4@UA3*~6CkLB#Qoc z+ar5NWYQ}?q9XQC4XlFP)kwp`P)Gt6*OgL^r?zEFQBr2dg|>#U)uIbPKohXFhOvvB zO(I`kT*DadVnXV!lM0Ahl{Z=)rYbl)dAXGvJ5kfAiggMlq}qG!n8=cEruQywEiZ31 z)Dxo!65L{`DnE+>R({!BcOD~hmRCgVbtvjGV(4_YX#==P7wRMCcj+!COL&&cOS+Ex zIAm8?%MTs7w`QxHXUTUw>rzQMYI+fIVnp9=^J2iq79V<<(5`ipXWn3oNouF4&{V)( zS_)aIhCb^m>dqTkdPgNn4T&c&Q?zgG=BX$_5H~?8AW55dL=P$IGuyPI>;=+V$f}1W z+p?ArVdpq1;VC(ju2)+?>XJ!8u%+SdpeIj{8<60}A@4%$$B?3GibJ+=oEuRQ<(#@L z)v}l96_J2}*uSF}t@BpY%o~~%ap@QHNSpn^Iu(HzS6`60y#PN2u%nL0`5kofjqCICVSOK4@e+_Z}=?K#FF?+?EeEn$SX_H${2%1pI z4IVkkG{oM|a?y>w#!_M_*1By~Jy=Vng|Y;dr=C=d#QK-Q=)3wcsLUiqsr)>kW-1^z zn$XSqawUsq`?uFd>J;^-IE9&%>(mHXT}p7c{M%ledBJFvEv>ul(ME_P8^!&Y#vCg z`+Vb#gI%~0+8nwmf=DZ9FvqP;4zIzQ{c^KhKd{|wp%vqdgy$k?g3 zBAZsNQvE!GX$Wz;&M5L`lXW|Y`T#&qN3I-hfwK775-idcfNEfsMRQyx##QQ` z_MHu6k1$CO^la1}FJuoqKSI7mB)U`}{y>}rrNqC{J7lacmB7gY$zXJnH_X3ZIKG7a z^!w^aEQ?RIq;IgFYJo1rf#?whXjsik$c3=tQAX@er_*N1$vyKDGuU&e#{7M$ka*9V$%?d$L439!ov3ERTGhouyrZeLic zC>#V(u6O!lorbiz$fVXrSHBx$xYLu5nxGvUff}w8I*2Nsi#?23w}6)WTycEn6v-&c@1MwM&i%AAL7`C5o3o%4 zhh?m>BZH%ngOLHiq?qSITf!nkcAWhF#*p6hMB93r3eZWOK1B%4@8AT8o zE?%9hO$th$AG67KBi|nMpR)Zaw$I(%z*WOm;F<>Tr)_-zcLSrooHgC+ zq5UQyICyy&3ggvN5DHYF9R|)mjHgZDR5Y%c7&!mqwkV$9AgU<_V4NmI-Uyjn;<Ym9_Nm)oJyy7{6(_OLgDE&%`u8b^vsTW++x;`t z0r$~x<2ObM98oBu7ngu`^Y&Z;8!)qH5VPN_X>4wJu$fCp6)$FmZDT@S@Ce|oh-+Q* zl}_vk2MfZ7vqCU`FjQGD{=I2Ds(*;DTr|Mw89SHM&=U zo3tozhq<=F5C`M{nc7*5R}kaneVVEIJM-Wk@Ov#D6UBMwq_Xq)K14oQgS97Pehd+6 z3QO#GCs4dj(5MCce&t$rd0MjtBBGoJ%+Zr|TrZqB(P`t$c#LVa`Ziua>oadCQSIe83_8 zp-u;_`VXy!Dh~DVja!0U5d;^sq@FF;fR%9aSO3@ll2zS8(LA{~5 ze~H7jm7L~`A1Mh+kiPU`b|M+Np%#{&RwwHWZ;m^xY)g{FLbOI=8M>qgl|~k0eV4flPICBi$g3vpTB=^#EkdV8YXSJW9c!^A)IKeQ%9kNi2YE}!#G!BaN4FJqG;C&=qHry zVOpkz2f(>SH3#LUbN=&w=zHKvIyS9V82!{8DoX`P* zMiS;@ox7aDz_H#-n-BF%sc}KE6tFE6=o^JN10NIihbcOlN+KEq#p44DLa6ku{>hH< z-s0V8vGy%m_Nh0b@9BxBrUdSV01rk{%M+X=F)fc#E%-I3{<5D14AXONHfVG-Alepy zS!RK<#-@^p%H7Cr&o5iLT!3!ixPaJKfa>x9?hu!YM7goiMAcIa62fSy>k?fnf$C-l zDfNy;<$HgX<|7I3XmNZqj@MHHjzjKimrF%x+}}|KwfAjwKFScHTHsLlq0pZ@hG?q8 zUyL}~(_wi=T363R_;Ny|*$gY{9#GutwOyd3@zlZSctN9pY**;v+%@#^?;3gt2^xII z(~+YCOgMW^AaZ%{uc zAu)$^*^S0!_djxAzRcXwFXIk0sp@pXF9%@Mf!Ozf->%&+h^~487W@GIkA?W3KzUfN z_dmQ}LB$0D06^mZVj2IR$1>gO=StY(2;X431S=;@7}&-E!r=&DnE3TEb!{MQX;%ZR<$QSU0hk$HvaVslNo1OLw%=-dtF7$+FO4Zl>y^+RSo)1NV_* zGflQf1Q5jZ2V*O9B?6)BUWGRJpN<*~tmdM<3Xurj25$y4Na3SXpr6F{T3ws$%sNjH zebtF%mhoBajF;BTy!Z`wnO3JsJp1@knH6WKc1Ga7IcHDhI@a||h-C%mjlIh!3i|bkM!C;Hs#5c*^bx7w)mO^PUmWe8X@KX3lBb{#2#rXwwVkh!rq;eWUuz zqjRQwkrVn5b6wd5sL)l7f8(o7*y(`<)B+wloP{oO0Jj?9B?^t+k-enjx%9nkb3S)) zvizfZ>>it+;8rrP^5$7VazjoohVWyk#x0#r;`nY)hxR>RRh71KrtqI_OMF3Ex}JpA3+MZ)>lT*^`LAO5qn_A<-yeyMbE!8^!e5$qn8X(*+C`Ta-22>d%ss7+} zS*V1*^gzYes?ZZ@HOY?H1L;1tHsLHu{;; z;qn^^n^5)32#lX)uh6pp-z#^kg$w&66OGvKSb%Q<5v_66vwkoCrH?y4Lx^f$bSuc`yTwLE zG((r3n;Z6WZn!sc-d)K)ytknRBm?3S-(>$_HvjbOk_G~5z;5}u=O^n((a?>r>wp&n zuX3zhMjbO3q;E_iBM-=)3XolrjDN+hSvc<{Y$93$mV?EhC1mEo2;|+Q6vFP{$8q|} zNuBqbOb8;RFFp|p3ek1>BtP`dk$M-P+NRgQzJIqj1!Ax!_z~J z!SCE~i4=~z+YinLN)&?cd$3@P z6A8FW+;NvZ9hTm+fSe_Nq{WEB$$#f@mxr)R{t#pQIP@I zDkFMq;}q33nhBD*v=}Qc_wIIGaOFDmO0OM$9N^?t4%07|E;jd;7K>l_hN{6SJQRP^ zn?zF9^g#GU`__y$rsqGi)0geLzAozbbga1EG zB<~tZi zqyp=mg6I=+lS=upqW2b@yq{zH>~Q=K%s*gZUb{Tw#1iMbp(F2mlx2R9H>7pfnNXWXqhKSh_o$*C54|f;JPPf z$z#M$5ldnWFGtNW8ur}Cn+wr<6Dvw5mWeF#7v~aGnJh(+#!B*;S<v^O@i zsf5W$O7>GDQn$sjym&eUy{#@QVosM4)}>5{%t;Hhz!$-UqvX#nw8+e;+0W|M@{WSN zwhdPMQi>O@L>()#WrQ}a;3zEB_adCedN_+KDYTo9Dl(fGahXkzvgbhAtnJL_`4&?w z&0}Ud>|;l=y-EFE%xEqf{75U{RD9U653!kJwx{e~(8@V0;~(k#C~zS+8Q}8VbSnXX zDV4QyWke{04!7%!mu2hus$V9H=o`E67c=}T6=#j(sCl%!R zL@g4_8;bP%uv@qkTPV;lny?W4BO1x#Cy4jX(!IJA8>7s6#4T)cV>r<(rnrC7Nkd(D z^2M%0!IA7EIW14lH??8`H}GHhwCkHuXWfy|`-|Q4%u3^us1K+le-iO)_A&|XhdX@_ zk(z!vwjLAJ((xwV(h)LLh4P~9>FqI#&ji$kKt)sUx@<*^sCj*mpu(uxhGH-k?ilk*g|QvFa+H;aTi=#;8dgwMLn{p>2@HYQysOzwe$Im4B38 zWMsy$8SfnvZf*>59stLc0%+B(+6D+{a_} zGpgD#F5oAwG6IY%#~2NcT;wR)Tgu54K@aIovy_S>q^4spJ4D5ccY%Tp_Q;>7pry}* zE#oSjeA5pZg5-(>p8>X>QaW3B7cVVGh`qdz5J{|oh0h?pvScu~j{YqaD8*Ypkhv{9 zgKZq<(WZ7M?Se$lMzIoqlUP7qHPDUo+V3}|Iz~FB+8nKPD)DG{Ol?}$ZAUVMJ~<}6 zdI=Na(Gxyw7_&VrV6u$;<(D9Q-6P>_-)0if9*kt1V3lv)B3y^8#=2S4v2+ulZH}qJ z>k+H-xqntONB=vsszm=p_m3jRRCSNf6?!@<)VIsO9HLd}mfofUsd%2Jp96-EJtVwv zLG~{#zy}68EMdSahUdHSLCPy^C9lw*6mssWaJiRE(=yvb)AGj8{~)4v>`qcYLPY45 zji9d`N>e{@QY*97@1?%KItf6)3j>zK9(Ex>%39pd}Lx(x%g0vNQ_4o*7!Hz zz;YsdyVF%zNmIb!hENL?Qyc1Lp+0d%Nta6PU1~VZapMpicLb@#m9w68cJjSBwB*%6 zQ6mlR+Hit^AY1(wgGC(EJHIB`2Q?&Z zPBVQsSnUJa5|CPR%yV_jGLhyaQBRdOvtIR_WL;@4k`&s#g~ds@bLTs7ldd&-PwOI6 z>#mS^efR9TGs__nE>d{NY(eO87g<0Dq54k5Q((+eGI`ES5?&GcOV>2h*%=Nppi>!-qk%l;?Rkr>1aN9QU0o`Iny*=>5MwJEn z&bGRY_pVrV0{GB+AJfpks0cq!f_o-X-Y9o6b&;l5PK`H1K|sU%w$UAGQ)?HJG>wnd zO|nICaf`_OWOrm&%4s>4}J z)R6#i_w27%|vZYByG*?{+p>^ zqI#*cDTeZmHi?FTNY_sZNf<8>&WMigDT(bwiQZWcOa>^G^^^$J=nB$sB*g?PKaYM! z+{7%)C7k|!2K*$BPkFuGJi<8QpJ6^yRkY2!`~I@&6#L`xZ*>=dFBEx%YGosS*b~FY zohFpr<_!Sb5Q}ZFsg5+XcBt;}!KJ`~`m28ZOH8^4RrMc3@2K0MI!eA?^g(zdcf8M8 zzo8v`)iWwrl_LzUq^j{|6W2=*O9u}tpF_&QyUJ^ngOgb=P-b5RwpSPGp6*`F9m?~X ztR~k*wH-NzU^CdsyA#Zh!YZ$i0K8Th?jGl}`w~aK*_@#@wx9;hAk*S3qf|V%rkwlVkwU{bs{xj1C^xq0By*(q zradgzqVe{8)Yjolq3L?=4Q7j|_CL~#$u_;5=s%OClp+Lbk(1LrgCfpXOsCg$_VgAH zM6F%PxsTST@%y&S2twd)mvtf^;DyG{7nkI5_JQvLu(@7mo?RHT3mbsw06^yg?2`ur zl#!>&PI~M6s84Q5Ya=%Zx(S!C!x&^m=hC<>!bo_U`ySoao&)?&ls{i* zoSn+CdI(H4_LHn#gRI?6xwDdyHswG!N=@T_2C&fwGgLHVtn< zs0hnMIxaF&2Ojl7^?(J9wrYz&H%gzg2mZn;OkXrGkRRleG2A9DUu40Toi%?$fi}`s z9Hco>(KxV)GE^)Y`HTp~^e!$4&ci62&P}d7*3rZSqelqbw+wm_c00WzYGxaxnmg8) z2*bKC`_Odc6)pM2Fi)DHHGIlid|)S)tZ=TaP_KXQHLwc?01Np zh-X!Pg4izV8{kU-erzMW3;wjJkM%?VV%g2BLqTZ`SzCL5LR_(GO|e6C6=tBpEMTBj z$q0jA_96J_S6z`EAqr@@F-mCwJ?6%>hpGvIZWsqulQJ;efl2Wipbu1Q1Hlmzw5S1Y zQU;AeNN6xdPpVGXJ|NA7fox0N&aCa3h(v%87ldyB^q{M2hz#%tQ?>kB@Ktv?i5>!4 zNhlHtD=3iMf*JtgeYS=&H+Q zJ{^|TWnU0lyie}1+Raq>&uvtkqGkak?C#OA%130gB&Z z&v=AZ5j!r8hpdd8RgIk$qfIMQQKeE)@fmN*q~h;9FAVNlPU`xhU^r(9*8AQqk!PHH zDZS6RcN4D8j=IlyN1FK&y-AzB-Js$V;YlsAFyDQH4J%NKwj3H?&XZ4j`<_Ywl0}E4h=-YBSeu*7geW(SRNpt0VK0iCrMyK zE60{pSI3R*_D5Ms+p4+zdH$mhedW*cN4{1comG8vPo)9E_rZ!%x^UCd55FYJl=f%W%rwO%kZC@$QAYR~eSx;i>P~}75Y1c}FHoIMf1Z_xIZK%xgqP0)# z**Hy0N24o1u4(XPhNFjq6Jj45x2l_Gha&n)`&B&Ivfb~ltciH?WV4y8?}pmVT`glF zUNjdwSd%Wu%toG^H>T!1O7sPVX-wC_EC{{SQcH^VVv#i`W67r@+{xrV#A2EfSZtWL ztu!e&>kcWS`c|O!9}Ne$Vc`EDLy}1#d~0m5SQl>Sj-OSwwSrT7PUS`Lo0OWNyaj5H z|F~q-hj1>eDo%BWKX}H?ObLy!CG8t}vfDLKSX5=PBWcD0G1f1xr{~CK!C7u^)p_io zb&Q2=cvJChi^fi^=@No!2YR}!ut3FT!Dlgxu?d>HfmJ1KB3;$q>^a*<7>h5AST8hP z4VI=vY(fiiFHj5L+J-H(kaq$qOQXK9VaH5KjE`O&9$?n2L|N(ZhoNIylOXKSy4K<)Tk=TeF~u=_2x@e8qdmv zx96Sas5(PS&QvJ4KJ{n_xoS|!-@rf`6Q(q)@`zsw)~n5_LK-$Y1^QzZ-fK?o6{_2J zEZqC3zIB&%Div`WnklV2M`y_rP^pO@Y|W{s8eJLCDF?G-5bO5@4N92&$4{t)LO1hZ}!gJ zNqtMq!sD}2@|3NOEha}wWn0?I4I}RlFN(DVKhD^ic)`hc_^#sPVSv}-Bl}7 zvo}AlD(kSVP3%rs!f_GeUv8&(LW}b0%V8ft%Up!g@}M?CxsK?W(@)Ncwa@`L>Ow2C zpwFE8u0D$vJD(+7f4B_nm^piHqUTrVa<2+}`+%C3EaPvn*j9o~?lM5V!C9u#;rhy5DvPhW<3pSh%6)&C1TtX6^ zv?2L}$7;hq{pqABZsfuV*`FsW))+-}lv-S!DLb5|-@ZVUyKxrI$Ft&gz~YAi{Vuc{ z2Xfn);%@5QDp+OWlHBtlf&AAKd8vl;T|!yP1lJFC1xXnf``n37M*qW3jFzkIalSSM z?uN!_hxU}$=%$c)Nm4PWbv{W>zL}+}0Cuys=md(^YEIVJ-)xWJbIJS#k`W(&(Dw7`GWKdM9%<6LkcijOV7CBPVGe45nKQxzlzupEmS>qn2`+QjgRA#TY&mMv&DxgJ+QFUWbaw?$gf2+ks^+C3kCBSUYE2yB!-vmvSh4*{0n z*Q*dD*F2f;pglbTAUzJ@+2E1N#_>yc{6vJmS5p_HHr0jiXWjEI6zC0g7F#bTpEW*T|!G4Ntze&7zoF2ByI+41`5>0UeDdr=-ty zY!neKqELY7a)@Y^PVGLU&5_F3ahy;3BPVVc48FyK9S>oX1B*^CsG1w17JU3@p!;CZ zELpus~#M3wYKnsj$m$#u>_u)CT?5W7rNhfAL%QLJxIFhJv8nh4!|;Bd*M**t<6QZ14J)TO82bKK(FS(5 z>N>~zWU=WDeJ0e0Ut|9Ed zf7I&V6ei>UW&!)3K52=Xwlc9O%6Fy=6M`ALe-^4}u&66+07G4rI>Ip$389I4pSxGx zZ$B(e5~d}c!#n*qgnE_61h}6+e2?}wz~2QbpS$6-<;9$JK;b1p@|2sT8>gPfoLYJL zg14S!q7+zwqXU?Z$!R< z!J2Ya zuibTx-ON7{wCOG9^h_`(RIf3m1)HTs^!We0IoEbiZ$3q01T`IAI7}4j zI??{ZsAP8-F2k&%^bU#+{|r4rw1M{Jr&wooQlpukH0gy8Tl2`w&MCWD@8(Z|q+ClR z5N1%PfhaDoZ927!YieW=Dze9pQ8B`tPT&$tKaBxlhk8i>io=DF(KPlmw4ko_tnaZd zGFMc4g<7$+&2E!!x_S??<7VlEkz4?8hoe1P8fXfE8kx%h&v=xr&oiR9k17|!HEzx4Ock<77Bc5zc~Z{}8dS*z9lQ5NM);=d0nPVv9LZIgI$Pge z^;~i_UxVZyth`eFsIx-&_z8JFATJ3ubTA8<$z}Zbp*Z)@>PuRBAxyC1XC5&KVS|`Z zjjXd!AtyWEU>DNRF#Lil+&l72zf}Js35ZpQy0r3G#P~YBzP7CrxqJ#hADOvrmOl@~ zA=QbpX3Cn)z@PMOk@}>cTq^r`{eOtwqD^w+S7@b*B`!r95*H>CQW8`13ycD_CS&UD| zDiAq40uVVxEosJMvJ1;{aFoAOw=}>VYoBNlKdJ~nU<}DkR%5dXw)I}zPTP3T*W}!t z+-Ygl;Nu7-t-XFA>DB{_3~+13O>%V#3ZjIDiJZ#pQap`%fH7&|GE^;xGnA@!N)GjdJ~1u2>;oI?Ng6a1U{&k02oVYD~Pi*ynxF`huuA4IfECz#kD z9s(>WJ|5ZwB7lJ6;G}_2{O09gTaTbe|IIgw-aFN_!c;T$Ls&vG<-3~yE$S!E^z~}X z?6x5+>R5IA>gwvL%&Wu8^CYg*Ju3RGy=k;N$Q3a*0uNJ+neQcVDJ&x&` z@%w{=UH)z@X^UrgdJ&PQh+s=SJ%iB^swvn4tNr^|4Bsein>J7SXz=q z)X+S>NCe7`Po1ttWh_(rK&j-Bm%GRuYI@`;%WQS7MrDOmtqP$ZeK}*`T^%pi7!wRZ z?i6a9(ENK@dA<4>Gau;-eH=$WlN1|kKEO`blwSr-QbdAc?FxB}{+OB&5jQV|1~am- z$I5YG;Q z5JmQhJW}{=_5lX=&`uJJM#Ia=UO5|;T=G}?T|ZNqw4!O! z?z4rHQY&Za^x0%WOJxofw@1)n;|FSGO&TFJ@jWd1Jv*ToRfc-a;E#?L`|Pm#h~#Bv zv9=jQ2bZ5%j0{^V1=-uH1%(}Ot4`kNyv!#)mHL)@RjRt!&rwY$}2PzhY6u z_D^@9bJW$Fy2ZJKS8Y->R|4%(;)p@yBosN*`1`hhfPAR?8t9=;r58(CJQr zA$acc9Zqi9K$q5q#HuZ<+W{SH+Ff8M9?q}X@?zl*NpIy2T5IVJTPuDS8p?j38rpgv z8#seK1_pb3z@+`q75aL|_sSQ(Ck%_f9~lZLWByBo2T0l~Ix$xJfrR#noMm|`lph4# zDl&wBp<4T>?Wjl>;Xadq%4&!Wb0?R7@UKo`VW0scLn;Fw0Y9gi#K`!*;<^4{@Il(W zkioh$e#(Dr(I}C2{Y{969D(pAtr0vaX3Ag#4(7X49=Di$_z`gL_<`$9o?8 zw}6Fwjw^|Shdjd;rOIc7HtEeV!4+1YV$0X+@3)C?q#}-5_>`L8O2A88--4^I_>AmQ zH7EF2N@OW@Ws!(Wa`}!F%1*>mLn0o~Lz;c{BbCrGbwmM*ewd z|E4O|mT;weDweiTn@h%)vhAH7`lQX>FAjWnT_z^s-?^U~-u6@eUozTjBFg=C4dH2| zCC4XSpudu*8|ER@;l?_1FUZ)dEzzu1(VP17Z8>-&+tTnfTKlbo+fOZmjhf<=L2N|m%~ zr=+f-LoXagKE=`E*pfz=&*B4g+zIq70`Y9u%yxA{lcqt)cZ6dOWCT2w295uxVlvOBaXFbUdh zPIw*HFKZ3ID$wd*#2lR_RasItz4}XxdBrI332^j9aN{4bKrRxWy3o%p&@1{0uN@@B z&tuegtg)L6gClZKqGu`vpaJcu;KwG*OOf44YcolkG9M;tK%?6!UAp}(E%)FsJ^sK!Q6)e@=EC*g6}7s8u!^%>_}7hT40=ro&TF&$ z7Kdp}%qDG=y-Spat`+CKHhR4lS$JyzYIxQ}#O^yutg#Z(D|%d0svJCYFFogsHQuZH zvlOT{?|2o>*M8`@^RA9AQ8~$X^mG$t+Meb@s+3ePE(;x^s7hS+s)h(CXw`Jov$mup zb;H?%w(A*7#DM?}9a^JFy87_@cJnvcpD$U*FKZ)2Zj$;KTbhhB(XT2KVf2cYdMRD{ zoOtpaXrX(x6{%6XU)0^>1vF5^>)g1RI%W@rLki^R#@Ss@uJb)w(}k2k7cd9uwC1{p z^qMEH&KTp#FCH zWcf=G)u6U;H`=IQ_*&&Z4Ep$Y}Rk`aN9|L+9}8Bit~ib=kxQO0H}Je zgaiM3n}N}YJV5O}HY)=mzm?5Q7kAKdo18)cbRQja1G39s_?VuY*v2}tZzr7q&iHgr z%8`FjyxqJ-gYxnV^J!)|d6{{+bu~Pbvt;O}r})uZnZJv|6CWL$Y>JjatYur2rLAH5 z995q?D=Si{gD=ftH<&-8G`qOesoaD4ZEFty#NRXUvU8Ko@&VS1`3dd07#qrKE+{vg zm6UP18PO7@g1OlmNpcIb&;p`!7;Os>Rg&Rc74@4fihmDNo-fB=rSrg(qkRRPA=$$T z2u!Rs?-kSLo6LGX86-jo>jC45jy$>Ki}l>sFLRv#{MV020$$sqzg7#e4xMJbg4cepQ06yp&QA;QRP^l-gJ4k|C%G(=@XEAI+9$uBlXnl*2&cJa2!5~hse zt@Gj~{l%TcB;~F39G)h?ZcbW_i3|C)x%*dVy<_6p&}5OwS8aw>TNWbwTIC$F?lvE7 znF1O~YCIaO!R7*20NAG)xTY+IfB^)4L=(lhD&BbeCbO5;(SH!5Fp;$_IQk>UxZ1u- zv98<@ZbelCn@Ym!G-zt7Hkg^CVvlH;m7~<^G01FAX;4E~C6H3CKCPMCm#^t-+ew9}n|3M%hHk1p3#=uC?{NQK-su^@cRh2oay zCqJ3|6MMpE6AwCR(Z*M9>YR*U+?6fROF_6X1M8#4RMA~eA>(_N9im96t*iOdojElR zM#pJV{(8foi6~~e&Tw1g%gPYdW;zUf_Eghz*9FQymCt@BAEbMSxx{To#FSkYe5a$V zm+~j$;%^7KMX+7q5!qQ3!{sR8oT$bPDLP<$vhZncME&rDmas(3K|(jygJd*EB39Xz zsMl{4eS6y$v;>_brn{2v{UPFJjdufSs^{;kfi0v|t)v!@E^LSB9QihF@^yq?M83YT zUBKo?znhwxaPypd_r&FCj@PZs6eDqlj8`ae#w4josY_U+#{vGDgiO(S_Rz%Hx=v+MV5Uh(#J6TK>@4168?7vr{gnU;@R}IF_{V< zJtxXajJ**IZx7*{*xN6hJ#dH%=Bs9Y|1=SM%?p0WT8Oj7l$OcA=ADtb zEQJKZ=o3<$*VEVylZAl%{9S(NXoBh>p`t0Qk25FZruU+C&w^U-KG1|(4H9$C@5l5e&|fH#7kH!3zo#P z_i?jeTc5npiLt;<1@w)illt4EyQ2c^k05(j_Yi0_muqu%roUa?YAd*Lq2Qt)o*zWo zA-LaNgDoA#d@rm5XE%(@Xcnq-31>H2w0A06((6nvj?W?u>lzHFVu9t&9XAyemN1y3 z?AaL23c(-iIHne#NDDkXCFF-*wBRG+VuEyLhwrxCP0L}21VJ0KR z64lv>d}$1mGAV||#%X7lZz^AdBI~2h83%+;MDBX#Ur%r(m3(~JO!I+74^*X*WK)rH zxUu2qx|*uBj^fLcgUG`QG11t$xyeQJ?pvx5S`s?Kz2~~SGJkygX zf%NH253pg3I#Pu9$rpnHlCtmfbrX??f&O>B*i0?#yd1ouoh+#1sz0Y4A^6YEoQEYE zgDq`q`ozQ1U2E`X>K{WVWTb5=Zsm+}>fTW0ug3tYnlNo&gW zSr`CJRskgOWtN2VFu4MD>3*mzcxkcr6w6cU-GP1kS-N0PW$i+ViO zG+XGHxk2A&8t%V2Gi4~=qG3OW)%hPQLDDY61D8h*lF4Qzg!oTL+uCK6NH^J0Bu)Op zJTqZKI|@9G300JjjEHg>3Gl(Tj*-#tM{_kZa)8U2D>FFgJe>Wm2$CHDZ?t^j%AQ5+ z2g5FQNDHREk%CjdJEhW@a(YLt%o2_il$x7k2xSCs4`!@hVgME%5KW!Ef%8-zXi4pF zxy3`i7C!{XB~ z;XJ9*RCF#7F1J)rFsCc#EPrA%)v@fwUIhEBr9rBcHAeZ}pB~OnaQ2-O|wu>e1tad&zZ2T>O|J_4onyUwli&CSP+7*$m(@gxt1PUR8Yk|#d73Dq@&6r zxNBd0*6NiI}Fo-a}m%~3=hZ6iWSxj0rsh2VhQ zFZlq?pRs*$(kpJ~6Fv|0h-11#_byw{ul|IWuMdY{4w;x2(Jl0Fl&1$*t?~YI9DcSI zc5Csi3}QG`0F{@;iY&enPP-Nju>jE{3=H2^n4k(!;y_BEgjl>h5GSv+23?c8&mVb* zM0VJ=Lw1PrGXb8+J0o<5Y~Ph!h#o6b{1O&PuM9prKIAzu;N~c=ebkw;JQn#-uJ&o; zupA7@qtY0H2>FraR(2n8yGvBY94y?dN*XmNURxx*E89b_0`gcPPTchN)pFz&+TEM{ z6JvG~@iSzBBc~lnXBYmorv~ySyZ}T`VrxRmp*1&kpduRn#qpf3pL+90lM%PRHgIkD zuR1}}Qo08YGQo|p8yiag0Jh^g1`XJEs}SC-D`pwG8px8lM4=)vMmpL~x%x_Q>k7wG zx?u0B0OKV#rX(6RC;SQPv^F&N#Yw}f_V~%ib_UnH*^|JG)5Db}r&&9SFh0t;ilnyj zt)SFGL}F;Y^NWBel27|u&XA#jK5%(>mjQUArhVWY5fM8w(@p=OR#im!@K=uvd)~Dw zSq3$EsdF@&r38V5#+Wos1-j-bogLj(+9^aLi)|ezsp&iXcKi4H!DSkR<_2%(M?VH_FTexs3qj#|(GQ`*VFkj4qn>BW0==x@rl3Xmj#{E=9k_q-<6X4G z*peCXXp{TTgl)Vy$NDSQ{@m9z;t|+RZ19pE5<>F)c>^2fS`2GR1Yo12bGWY^;I6V5 zgDk$x+8`0qRX&n!5mvnlR`XT8>h)OkQzfs9@4uM%&{mZRi#SgxHpbJZS=*!-((}ZG zBbE;OBP}^4O(0^-*b~ETK~v1INtTPurjoI#PM!NCJ=H0kHE{r%{n?|rSLe4w z7>oMyvVT(z0DPRdHhrr$o8G<#tCE9`78>ZWUm*W(=)W3>XmKbPg=7J>?D> z(WixL0Ao`NMzoX+HI%duNaA*_i0rgKP&|ZREOV z{`yOED>_;3$TgJiQmQ;{uhFE(6o>jdsr{S|+M_0psoJR%-O+-!dk>GUNC~M1O+~&- z?#{!v*6pJ9jX{opQvF^711k@xUJtf&xkcXl#9^4N9D14ul)#0aFR<9a9o`(Te>_+G zfmX2QR2|GKU!T`{yn&+4QAnYzx~6#D6>5oM>ac~D1tZt0Hi;^!q4dV8WV|&5dYxg3 zS{Spb2x^vkm#b6H;t&q_G0H9BbSE-JsV5%PGPfxumQw6C_Ozx1Vja%;&H0=kvgp}ukZ8q7sA&e5#Tv)UXNd z4Mr?9+OYcc{3~W@$w#zx&cF@V{_W(54wL9^m8Zc9_Mnl2HI8gL2{ce zY7Fq+)d_x$IhIjEvF)2OEQV6V%q#xPYH>o^*7J}}Z5Qq4pIz_(wv$BAtagiaBTfoC zDAz1I&B8M+=kU$--D=8}Jf-`bH2fdxKQJRZZDCxeiOBpPp5+Fee-;kRYB}5FprH86 zu@y}s%F-T^I%K6tRo|SdH1{G>-a$*c2X`+DDNpe5j_)zKx{l@U$65|DO~9(J0B^8Q z7!5qgI65VDbkcb4O|Lc|IPEywyfvzShd1A(Gd199BuB#3&GQ)AGH=SmWix?hare(? z=F`~tWMg=ZY?-$@38`Sw+IjT|g+&yCQ?l`ju(`#cb`N!nx#EG1%k#({N98% zDVpu;#zFn;MN|D_VXE1AvxJoxwwi66OjklFC>J!npS=F<_@#d7Z0#7NHl!V5|7DIh zf{kOEDt9E0)53Oi+6z)Q1u~Hm3sVyGhZp&YflPJB@>!~3tF8Aw%Mp%{PqVQfy%1C3 zwh4U_FJoes@#7b++mh#<2_=8hjPlw+xWGC%KoMOiKey0bnT+uf{&b+;!P(Q;*H~vH z*^fvG+(RLLAlL8NzONUe)mp${qZd9Ki=l{wq1XO`A0O!$nRM;Jt<5NGKD}1j*_IP* zVY^NwubhP;*fQ*Kvlmhf&g3S}PgjA{Odg5oJmG5!Tlh`|m>FPur&>kwq% zMG{l#0_`rNEy?}-{`k48{mbZ=8>z)2p?e$rhI)0G&%v)MyR&j#1u{`}`y3fExpfsy zojigr63q6qE(&Hj{&I84t30$O?5g9uJW;C!VPOb^npvYRu|rZztsA~5sJ02Nx#9L% z@r$eTl~$2eg?UvSVwx~cL?b#vxzgS=XMXFjhsUnqWyn+!e;4ZBiO^AbYhUwHvKo}w zL_QIzOQo*(q`+5=ksiTO}P!R2X0nrV7Te5%7BQfCW|Ndln&w3WIf(Od`(#5@HFo$Xf6r z$?Mc2IJPxQYgT!*1!6b|#!ONTn-L`lh}?mHl>@xWr}^;Lca(06d^jJrpT1dNs7+gV z%&)c|_NSM=n(1T?^q`YLzIdv=%h!3<{6Y~D#c^D_dtAHGh;HHA6k5}A4a3Y=6%;Zd z<}yg}G*f{*1<$d^!yM6zX!iMPh)|ow4@^mV0eEm@GPDiEc@Q4$6C48C#19&H4qeIl zP?O7}mgV!PZGVN&o5cdPN8&rS19h4Yeki8HjG6ZDhar3XCbln()@p>78OGwVFxtF@ zA5Of*-NIHqs0gRO<%yXV&U{CkOBugshg7_KM+tgEbZ4bkn2?^q+>(_(6~FjzXyzZD`&4Kf5!2%)L0e}V@v zf}3>u*`Oq#GbM|QHM1O8IM}a~oe9m8oyD`*CbQYL2hmBQ}JIkl=e-~eT zE-frLc{qApXO!GZNW>b;c}4I1zBjva?dj+)Y1#35bOGA9Wk(}`Ghn__cJKkh-^B3s zhp@7EWc2>vK*-tMOW?^o*b~IZSGuK?A8|tH?nB5q-ZR9he}P5Ff!lR@=?ouv z**f^avIo=Y;jgZ5LaGnFE6Fo7u<-HyhCci*wOg{fzG-C5?K$W6I~Tuqz>n^-eQh58 znd|BMbM7CL`yD)s+vx2@-Ykyw<~Omxr1=7u z=MlL0yX5-LZZ@SM$9aC)+`(s4yR-I%JryyaPb8Bf&B}sKwJmm1IZFd({m=xd6WGnc z(QpOOom-0^%OeSm4V5$DXJd-IS-a+KXH(gdh)G#qY936Po#s|d zSlLsgB`(Z7TzFGaGl)wEV#89?*ur95fFk8~EavE=$Ol}9i=U2f|6C#v1LrGp$;{F; zvrrT2sK=R9?C)s5z?H^6R&P*W&9UD1?S85#O$E8h}M5(y> zZcky;NUeJ|crcCB5jn0o(eN`rAKqree zc-XY-=furb;%D(0XpY%xqy2#wL%$3v>TiC8h-%H2Mvl7P-3GJgR^*q`bXc!ZJ9er1#iLpL4%09B$s;icYysO z0a_$@johj?v1!qXNH*;@bvNt;wM7?Ox4&}V=vP3$|H4Ocr8YgOSzv`0Dt=Ea=?H!4 zak*^Cvge;IMaJj5&LduDJjpFOYxwW~t`eIal`eo>(rbF$RQ1Dm*~_RZw+p%7;~fUL zJdEu7NWdNB?_4zVOhc!Tg_nel4s$fm2+;B?)xeXoAAstHSe^PqZFPpW&lN9A!uqEl z0JecKpfw=vra7Qyvta)NgZ0lqY%ryawM5^d!L1cEGxRSVF!}w@#XV#!Ue*K_vS^%R zP`ng17DG9*GPR-NV7*AD@6tVSSl*Zksyl4Gz6xkAz)wb2oxYegC}wQE zfs4+!FfsN5TPpAJJvi@Y=FYOclb4`iyv|Q)xSswR);}f^)=u?M3t%%wg#a2o2`HzrpxW?Hh;YfL^aoU|88zka!aqmvBJ? zASJ;Yl#jkGlo*>wt~x*W;~6Wz)|6o+_xvs`EZ<1ai#{vSLLbtxtM>rRZ@~g&C@glX z09_XHi+ph!bp}yU<7d*H7ngs#bE9O-Mvco@iuAMLyA4Q)(%~;BDrA}MR1x)+^L~h) z#@K3kRiR7iF~E!@SfNjo`!E z#bm;b5@1D@*vSV14wS*0c;^gL;+YX}G|Bt_re)IB)n^9o&JYQ=fgw3cOOgF)-*;-z zQA3fpwP0Xk*mU|}*{Kck%$stBxbDpU77v#|{UaW(4k!#$)0MOuqYSVuZ{BxkZ@OWf zla?XYknVwDTaXWC@U%E46YX(JZ>t~b6rScj^2|tG>7V#SRBg@5CVDt5(u8ZWZI3L6 zX{;22i29N4Cwz0j@HAVVr7~x}8X+f8`DDmncC3m4Kf3|YTB(io4`A_Vla!zp4<)dM z((yBoM03~wh58CMs+bb*TR^f)0hOpO)FQrL!Xfn{>t$h#-yMbVFA4Di`vt22xnNCQkxq;Ik0a8KYnR+BIpo5F9Vj)V36JPX+u`0ar}A(knvSVMWo0 z;+wt@x7Wi?P9KnL045azrd!>2wBQ8@e!&?>K60%%@bZSQbawDLFG5X7nuks=BZhsS z{=kDge$7@*;yEUg9%d337gX3Mt^ppcyG7po?uhQ3Jw#6qvKkWMN}^FpW-lHSpLQXb zm4)WFX;Uh1rZu!eF7&j}Wz_vL)7a70-BE-RR03C{a-%W|O~_8huohi5;5l2Z zB&MxnNp-bV-e9CF$NK$J5eu6t_kFC=ad!(*jjMUL<)9^sx?s^}Rj}yNSy6`<(;g#& z80qxiMQal^xt2CbwO*uc?n|bdD&x=YDbYtNksF|kmJn7kAAmGpE^=Od_%l+Bc_xUm z5kW37c^mfz+0wQcBvJmVyGo*7)uJC`$_4I2N$OL`|0n>iiedQ)_qfN*V(`+7>z0>H zA-gqI0L|R)L#3)j5-3a(#K;vC5_BrAvD=P$Y+R*L$V+H+2j%udHSickC!&qtRZw;9 zIv!ohsMV5ILcdz~qcQ$mW5X!u`85^eF7HIlSNOU>hsA@}3W0{#a@d=PYP6kx4IBld zF)4H!X^1M&^y0_WMgcVPHQ*m}M5k$UzrXQdEt!86U)qE*SKg>6vcc(ve_1rL-=jme zLPS}S;0@q>ylh$sKwQpVxNmKH!2NJl^uj=_4Ch%+I=aoN=Q$n87C9@v=J;`eUa83& z^N1m3@b|(|J}YofwP(`e?UMY*^Vq~H@<#0w&$c@BQ#FiD7)Y~7rkLs@MA_neJx_Bh z;MaX?5sO716NK^DQ8_jiSAva|JQBK($LJR}0Pnuk9kjqWu^DHupFH~>60eBZ;(+wU z(&LM?F_7ne)fvi`uqJgS*waX_#bC*7AHF@U95unCJ*k?+miA#&ED=DclrdV3woW6z!uVwKY0SW-t|(O$}f}*Qen{(_LpA(KAV*GId-v%#Rq5oJF-9;1QZnr z2oe%V;TsDVb9CG7d}Co*I3OU-|8bd9Hng?3F_p11HgvYM133M644kEItBxaz>K#l% z5?CZ*X+cedY7M8bie9+ruL2oHc2pD}YU|Z!npOytv6bo7cQ;3Hz|OzwAs69&1MyO@ z$eqATD2c+d=EUUWYIemu)8%xXHT4aEZ^?aQ3`gPy3ixb{sG|*SBFst9|XV1E5+z|dqUe7O-k1plO{-h@E{>Pk?te|jh3MzT&!r8y7@>uLvhbLz&hGFl3tM1Hj>3UQQt)+8>|@i zCbVP~aNcb9T_iY2^~bScv^FvGeEuO1`FWm<-f3dOqTQUk1lE;Hgcx(EO3tiG_^&kIhKVIl$h7xBihO9->?IKgK5nQ3+BmY z!uO|js)hG4o0e`aiC?wKEg6%}CbER1G&{^PO{d!Ju(7CBw-ZDI?IcJGAfOHk7`D9( z^Qk4y9)i`!bV@pBz2mBJdF}-!mf6>cH}V+kn^=x5@YuGY?LU3*vkxxtr?xFvGw!|} zvN;`YqU-^85^F+W`zODARg;!~HOY=u|IyL~q$G80HhGC-q+!iSQyPZ~XSV{m$Ym;_ zzC(NWdZMQLgKR3Z zFTrX=v9e`Oh7tW9vihzBvS==l%AfyS5_BQfD!?!y)GR*Zs!>>z15Hj#S5n}Zy$cE4`l^UQy7`&@sKWx%^9IzO;xJ zsl`@7B*n_6!A<&!v_YoY1eiadCSQ{kE>s@()I}(Y=^&U())n$hvY_>G>R(*=f6;KAgHC zV|d~G7hk`_+taY=Q=^hNjD-Qo?4huteLDTyKIp(TN#3@`{-^>?_ zJnP^uW43py_(@yaZa&Hb+CNl16uH-uq`vZK9W5UG1yqnqkKrklzKS&2Bgt{VUz~Ob z4^*WOXwDAczj&V?h2SAAmsil>pPw5Y&yu6&3*g(qR(6kv8@EO7v}pV}*z3_a0}p3lHHfBF5f$@26%qhR$1|L*-_iQ2 zhLF6F%9&~@6DqqBHfsM4xb_697H2A(Qd}w@vZPq9M@#aok%yGLGnN>SsSx!dO<;_B z)1Sf?e!QsqDqs6Ra*>bQZ&p;Z$!}?$`_2 zXp{*WHIkBeO5Wqkkq${O3oHLEik!uKOE<;1Xv{LW3xwj@oiUw@4>6AFS*?~XVT>Bq zE=$+s)C)y8AwaN6 z;m2;jf^tXL+fg^FfD<1CCrgn7d3x%ZM+nn#F%?PTX}T6{e0^iSBa&i=Ns%|uaw>9)lD~#gi^%f zsMEESRBy3@2p*e+N`aWjIDfUyftW~`Ui020)W082u3%b0MGs41sI^qIsmzV*sIbNu z7tuIK4OK|Pwi;-5Pe}TYd-?9M-Ih`*8~pj08yC|4+bMLoqI}@1>kyCq1qXgB3+iZ` zAwz}K3QDKGa%2*fS3q~!JlVOznf61W)W+Ec6<(1s6{HYxg9 zdKK(~LMcPQutmJM1zW=!ef=!`8EKNYD1Aj^5Lf1db&|Jmk7`*0fp>`#{rlbTw*aY@ zxyz4M81Z@qvY+_{I^uZ80!94u)SDlYMf?l;DsR+}6%Xuyzj9v+7Lq@3gOc@)zE0{0 z6Kbkc@h`@8_+hqo?WwCc-58uD5b$oNbmdmoYry-~^|c(VfEIb=^TZ??6(n+eb>RRo zdGL|=%MReLvz&%C^n5?)Tw8zt9x|+ET!kRhB+wqUnH<4ww|b3|pKu4mM!Lp6CNkC< z#frvUObxP_c7&G}%t0ToeHfcpzj}Jd>H@yM^WGX&1{+L4+a=`p{fnIkCh9A7DJ=fWnU&`)V37Q!qAU_SjqtW=XEc%c zjkf+8wF}2upj$<#W*~t;-t;sp`^b7maSRJq`t;F4_cRRnFqiMV-vUg<0Lzw`AP&>E z1WQJM}wJx9;DXgIeDME2w!IPnf^m*W}0+vSZne-QM` zPya^Y{{9Q}TY53sJF0GGrAEnA_ea9$uh5h|IA36?YXM&d@&2a@(}j%gzSSQT=WM<< zv!N{CyZk6!heo%1GP>Ix61*m`@m7f7VKh;G4b|)NWzzCdt}()5#4G}a$PRfwkH~vb zQNXEt(mHr;P>iA~6jY-UjMk!mvDutT`w#8Nno=7Qw_`ZWEs{#k(7CBX$&3(&0Z#QJ z%j~@Ku54Cjm4+1~*Ce-$z+qH-GFnZoq$Q0YNLNT%)!q&Ar&BZRB*u zqO8m!tq5dh`klzm&V_v?TQxyirXh${sZDZcs0*>?h|D8mQ=w(bI|It(pIcyM_G;y5 z4d3ovo#Is@?mA_}i>Ywi0H*9JjF56~4C&wYqdc7CYt9FHi2Y|a_*|BG94aI?!=&3{ z?kZpejTCI2_Bo^pvgihZ!U7EU#wjADc4a(X{G3S;l2d*4$73Mql^$Vegk;soD{|!V zjx9Rp7*fNhp)B_vXHWSsi?uzHFWs1i04{OqyGyUpd}Ac024R7q28Ap~-7H@&N@BYZ z=V5=96w&i3qRT#%-`f`0&Z@ph-^$xWwjZ^OKEl%h&~zGi<%<4lKWk*VjbAjL5K}Tp zCTnS>ZDBo`P7pKp4v`9yLuJFqWU-SqI5SKHn*j3*=!GjBra4W5d0Lhux7FG>) zH>A@393=QqdU6L{T~*Da7@BX6bE7Z49jQbDVGE78A&$XntBUK?oT!EXY-JH}s|p?U z96u@)4fPGfPwJ3)CXJW%Nop=Qe_Y=o69>rPHOA>4+P~~3pLVf-8^W+wvyhv&prT3N1|N;>E%6&6xzpq{Vh)>3Jbk^-&A zg>2F*$J&L*i;1xPitVCAFSXHU=4% zw&|?0RXQK{jMlWNE}D~E4va>V8>de;wRf8jhg)_@V&y97bibO+xHbO5k4;`CTYtee z9hr-Ci1Iic&2+e{?{+(uG@b?WfM!e(l(4=_3+7q}yvKD_Ei?j>JNq=-0T=+jOY<>5 zz^A6x6=hZ)oVjIEiOj>wg=mvi2q9kWPh$h-rdjRN zs==kf&fTu4ZMwIP)27o5h8^E8Yv13%l8(qq*0Tp5Z~FfS_{)8-u#rDtYDd3;zYFYl zefj^q!de)bSOUxyEbUEgECHs%j;4mrrvJoZNvH~{i%R|%CcG-eR(V4VapWt+bOQ5s zRUiRzTsV)BY!@`0WiSvlQdb5_;b);FL1`@laV%*JzQqgMC(xx#!Zczr{rdB#g6;Ek zxv`Ei(~qeaz_r|a$5z)C%E#-9T@T0$>Jeu0Z6Ox5MpPbzb^dET)|N($Vgph^kn9`} z+ElVdcGxjB+Kg}+0m9RuHvQn_iqM-F%TDkYJU-)BR=6$NPQ@(NI`c#td0Nuck;xN z*`|(^!K0CeSlcuMOD}ib-lgQU19H;@?w;E_TSszM&Jlu=8(?zU^e9F{^q2PL%KyY< zS+7lB94B948sW-NZD;Qxw*ni?I(}aU8YPeI({p@$oI*e{Fw^gwkIo*TZ#!_-rx2s* zj{+ad^(Z(ti>lU;g(+%MB*z&ahElMtj!)zCQk+kGQODWJf@KN@85*y&vlaKXgRNt0 ztlJAxT1T=tC+c~(m~A5TE|V5hB)hoMbZ%vpK|?B)bO2XOG=t*w#PC_7SEe$0`^hOw z_t}@Yj69u?T7y$tJX8yu!TSZMMb;&{d`Fi0Q+!u(7q?1|LCf%MK#=o!fHxus3)h+3 z`|Rr*Xl@<7J$l|Yh%Cv&SvF`8sNmFrDqz=TX9unI)M(SQR{*mh5}Ac}jWUsmwMkRieMB6FsqDuCCbs#8!rlz%;~sjR`<|vV>u2-#G!zEi^<{#s(ZjgTt^5 z97KqPLZAA?#N>Tt0x@~c?t&NKI=F=a#F_jI-@2v>`!`3sMk~$E&@Db3VxLV0q3K|Q z!o?^w1sx(7Rb3-gwU-ntv__l-=_Lj90Fw;A^U9?SW4kkX4PIisS481wPug_HyB4=| zzxDj-rFPPhQFsAeVhOL{dFm_+fqYiRMoC)&)E5KdELUZnQQojWl-@8029YP@d|yEo z^MPr@yq8hWFMfj*;dA(6;w1L|2pp_XHGnZalLdyNj8<%u!jjPf_7XWQwI`b6->z~F z=^);+0{LKAUkx3k7fRy$imP#q3r_^Zp(f9BNFq@}F{{YLZc>tA#=E^! z|#4Es#UnJNPxl?8w5$x43( zdR!h>y=>gLRB&QdsagT?0d!XG5I(7Fsq+Oz>cdOuRqViygUP;7CxD~_87U23hC${b z&f8iw+-MIbGu{$snY;N4KkkgJ>4{H)Ao+W2n);NhFG(NCo0Qi_`t)ZH1}SR@>6(wA zYx+&(-|?a^5b)U#g#S7#yHG6_ioY3edn_Oz{{Np@`MGLXlWmPGghuXG@oA!TXu-`b+XLCo(wiky3SqY5=_Ci{u~}Ix6Rs@V zi+(RWX8ygp{yTowWtTlntm&WG{#du&VfTLJy_1om_xs5msAZRcY8$N=o+o!-2Pnzy z=XXR_HPJaQk7sN~$iGDR2gjeAp1v6fgntsGqLX|+{&WeLwiEh|C=bkj^;l^`E#RTR|ODg6i8rJ;&z7$ z{4t$#d2@b%bBMQ&YfL3X%s*Gx=lHm%p<ie*kHQE6Ra!lb#!A~;M(X{u!84COfoqrTrN0OxmHleke!gkFTj{;2#OY8ETdb3DTI`Q zSpkLM&du#?OuVPq<(Ar#V1FwuO#$2P;nOV;#L~_f0MQcnJUNyP?nOk1UX?dpOgPKX%;&qLTySlAbjSi3fk8u9L z12Yu*Ja^1>v3Vt;E2~QESq!TL!F;kcxNEhj;9#yPShL<>SU8QlmH4DRM?jUU|I7YwQk}Cngn$mCuvcVA?St z8#?n(O@yd0%O`PmSIfwT&k|fTK4}FdR~j5$b1aSPJ9ZlkqW7_H5?pdf%oTG| zc_`E=y%Y*)T`(`D%dExwbbb~DA9&TF6XWW8Z}-0xpXHWjzTPAAn1yuVdGo%0B@sa6 z)d(CiTN0eT=SBkeZ@wdC9R-==T6N>M7a-BlIN7njm){+dO1?i<4i!+S;Ij%RQm$q> z#rCR0eZRHt0of#98{1oiL#o0P=f{fru%BuvjpYXh?R$88Jii9(?Jt}xG)Q#XEA4ej z1C38MMGZ}1*hN+|S)1}$Nj7d3E_jmhTpdc$IrLRaPi$ipV{;}9+akiUm=Tnwc@C9|`V41*vM4-UjV9}?Vwn^VQA#@C z)=EbU)pds5Q{{#-m9;I@e%_V&dfAAU8OO}mg*yEKVmw$Ai@TwYxj92b^HmT`s#|i4 z?0jiGP)1`V+9SNVN_1-(Wg@atjZn&0%W@SB(#^v(+zbmRM$W4%I!D?s<$%{ojow~E#9Y(ue{AHQ<8Z4HP3Ztr zyLYef`>5L#_&l@Gld>=q#xgAc)gd-|E|k@-8BA+yA~YXcU8S0=mvso<-7ma1qPo>8 zIoCU!x&xiLlX7oE@EDK*op&0> zwc*gc(0dg9MkBIu21T7;^eI?s65@!-Q%C21mC zw2IdBhF$ZHP*o=n?wbmp1D(f8ZOK%vSy>OZCx$3^nIp+YD|WOFUFf_wAE^a6 z)99DLhPTT|kDP&G)JwR{V&ar9J3k@qy7V9T7;^@iiJkLodteD%_9irN$}>lB=nGg6 zkv@ZC)gLm1_~v#RbC2lSF$8K%lc)u`m(O9fmKdc8=_ z7%a2Y&6qD+A?#2@554`~esu~zTo;~#s4aM+d;-V@cBI+bW8{KLzqtO1_Wuu_T=^R= zdjPEe=6%Cu$8XIz&;NA=bo?%Xc5yT|m9TSimNm6Cws%*y^f3MJRC$rwry7bl>KELa zNkXe{ZXQt)g%X_LYJMYCo(7+gB&>mCdiiIqH0FN4SxUoNVKKr2hQ)8Wrjwr~J`X?M zNW8+=zu9ueLP6*&&a^fs^D8@_XKOZ}&-;-aAhTKwQS3BG{GT|Yu+~NzF}p-;`7At< z^TQZMtEj?qu?QFhf;xk;L15}vR zl*`>px7lfEzyKfy3(Jk;t9Vlts>}yhd1=Q<^L|81u4Z#YD4{49lL^E~^LhUUD;ql$ zlCIeA1Zh#@oI;iXd!B_kCfS&WCY#pZCbieGmc8FP@q!H14d#hX12vhuo4h@2(<=wp zzGl3c8<~;f0%7FGHULY~o5xbUh(u_T(%v%sz;{ydpY7+Q)|7g;w2kd>#RuG$Y5VsF zUm~$2Pp=#%w9uIE1654B>tMwm`h!&0{%w7?+;3JoAW)^L+VXss?<=o1t%qs~du_n` z#YY?Yj^HiA60Xy`ln|)DhJq~WQ?mOM&0VGr*}<7Bq)dymxlP(Nrs@QWMVhMs4i~c0 z&RMWiw2&&hc2nR3qfm@St+RV< zd5ImJGVDo~DVPt+@ddxeigF6s)Joa8^~djuq1U`|s8y~l>z=gbD$7p%e-*5picOB* zi>BbULhto7q~Q z;~o7O?{fl3NqQz4nM@`DC3Q|FNk|EaMMWlggA5f$+3ksiFk9C5wv6`eKLD;Is zE#%yILibjH&eJc0g7)pmrB5j+WM>mBdX;u52-bjUrD1L0?e8~3sSSf~sp^IOK4wwW8K4-#AN2n|`gXF84di~(@90k#H0%F- z^!-QXt@%N{f6PJupx&wEdPrjt$YYL~b5u|f5Uz^>x@ED*0 z?fKfZt9yE$^3C&26oB_vbA%fh;*byZ7OFq^14!ZS2288x7yjF1OD>o?dPr%$eW9OEdu$Fu0p2NHbT<4zjpF*Q~1LVTK?{8=}I!-x9RBCwyrtHOMe`Lvz)^WJkKnN-&63E4X#EEiDu5ZJ`=M{f4e>RYG z2-WQqE%!<~Q@mW4Pt3vNB$l^2WX6QN(`SIm=5zZZ$;F+X!G^*TM5kMamZ8JyhcXFPP&QN!Qmab0?{psXCu9fsr=HB{9LeDpA>CNMoQm(bAYHLq73Ek+-Z2 zc4{0p-E4HB#$=SFK1S%xM#G(LXkLhF#07FNZyd8zbeOnBryfXp1>D+eF|SNH0~0iN z&kZVpp1(Jq^cwd#H5s#hVuYYCzAf5?L+bVf7LC-l*OOOu4+4>%T3tdTG~2M~y;1S7 zn$#sh{PQv6$i+R}Xc&jWmFyG_<8dMc5jl=`U|h;Zmy~ABtv`JpnsUL_*@2XTcVIsy z-17mfqMH;$GvUeQt}|3kj46%aw(MDjYA7m12jprg>YVxLQ-QWRiD?%HCyQ@HvQ4*2#ukdw zyHKe?#T#3V_^_6sJ8g*V3nY+LIH|d8&ZVwk=gNKWWvr~feN8MgnW=<30hyYxJyX2*h2`IK=O2z^>5j&?UK`rvpTAT7D>GDMvrRp1Okd|0tN+shqPKiU zUCI?AtRm9l6q+t`PrhXT6M3=v=I^ve|KR%7?ZacN+==7q4dtO!R|OUsJhCbsP~k{n z;!0qj2QIMpuCOOs)f_KX3|kU2vbXyHuW5d=w6t8X1E;7s%1k&=sVG*^l2x6qaF6ee zHV3KgU@c9(h!`SAv`nq6m1ma>ca7X^Ol_ebLEqE9b~i?d4WWE80MY{{GTa0pm|r77Mc zh|#+tR+=(A7}Eku+mC1>x@C?f>I2|BQbKY_2Eic>y!fXZnjwbtU)|6}5WBIWZ&3V6@>WF#%qU>UeMjkoFMEdqZX5cM4I*eMA+xQhL$hbmM8Ad1*A*p z^9q#s?h~uhe-PiTi*t&e&}R-YWQ#;Ps0{Ybq59i&upOdHHE8=srTUdu!En&YX+^JXLigLNsMlI42IS04-D1ED@QdLFyDNZK% zKV{H#V^xAwI0;`mIc!H*qATSGPP3mR&uZdU+}BVdsZeW1w#&nK1Pz4ZHvE)_+iZ$? z)^YVN;TNnbD=0S1c*PWaN5d*3REl{B9^|BYan)Y)TAj&MHOGcO^fqiLq8z8DqX<#6 zD=W_fg~~Ccg{cM}`idvITGp^v)_7}YzaeTT1zewv+|?na2=N*+&}mOxHYZe7?@F|=h%Fv}4EZW(!N_Ym0<<6wB9=ZYsA z!d}>90FSin9;dpVtHhkwBz2c7)8FQhTk(@kddlr z{zY%=xfQf>mfQY|-i~yb(ZQsX`Ymch0!~}dq~+D4g;uMXow}dt*lmz!O)cmNx>9PT zQI}Gp4tYsOLXFk0g-9`Y(4RwQv|RX&o`$_LDR3WYh$`3s;;k{*+F=-B#Jbd%!r2zG zagx74Pa4swUdTpUD1ELqeB%6$)JfeJ=+{=O6^z_cwcyR7P&1rv+Ew(6>^``akczve_8w{G}1KMj=@&!*Hk=(2D-+3 zAHDaX*EI})ZQhmh@0u8TbRq7|Dh^`thu!c8{LcfL*iSYUw1~ur|H-BTKdapTb652L z%BC`gp7yRT|7~lVlJcR9t%@?%m)4y|i(>UIR9vGWOfkIDs#QP{XArSZIG|x=-4&8m zU%zh3*3~?ZIp&!C1^$IOyT-N1^tFe-hhLK0v>t|lBz)Lfl+=T`?k2h+>?$fBDAXPzOu4wp780Cn@j(|ngX&h<#%pCAV$+~&>A7st( ze+@mt6MLWxv?21KoynUoPMxR3j72p)Vpm;e0jW2o>PlhCyGx5*^s~OOFsJNJb!fL% zYt-t-Yt~qG%q9zXXtBGRi|zRkbyeY7P%5`6Ijf4#c8nA@myJFE4R~5>FQ_+mQmSt~ zq&BlR(*~P?HK_?QKV;TCcJX7nxIIAyS_1&OPOy~l+FPVV7XOKeCBlB@r$?aHC@q># zgG9B*EEJ$f&^!`!rB zb$M!>zC_Jg&|0*qp~1EMomqNp5o?#x>@r@&CvEvWu@q^I(G8EHT2B;HC_u%yVmb*- zdR`2xnOfRZj*2r?3q`_Je3zg#VkF9yENK+ox<7a?6HCgl)nBbb9ZOTDHtt5iUipzN zbSA*8!==pH*G2&U6f}LldylBzO=zVpzv@y}Pn>VjTBEw#Z8PO-KIZ?2AmNgt7Jjh_2EDzfBcIQK?}_$h=|7 zC{7d+3>$_G!-io^;6Qjw#SxcXCD{-v+C2epdEWn~ynp=Lgx;Z4)PJF2y-}v8E{pV* zpdv+_J0i-9pzVpEr&D5i_g$+>7yTql4pJ#WsVZbz%W!PEX!3>?Te@r2rrNgCoe2gC z-KK)`h-1aFL4KcU`|MNzT(&RD$LZ;oQQ{q8hm2FkJ_@4n*J$t2+Z%Ow+8LuB@m-La z*BzW>Xw3ni+>aQ3?qhw!N@uVupe*Kq*NE}4^0$sya=C!LlgJZD*e`wJH5eZVQJ#l@ zG=#kpR|EQGwIG4&7{YVSiktDMc~v2C%PaXxN-*E5nfGM44eXikK4t^j?keE33yKal zlrT7)Af81e|IW?HOZD)fZrxubRmq~xkT1phU4VR!)t)cfp8JxY@w>|QZKm${2YorO zK4r8%Es~%8?kdXD%V+zXwqH!%EhQ|3X9;G8WksqCocP0Krp*EGwkH$H_RDkkPb511 z$RD&>9HK97A^L9Xz3}*wZgd{2OgmRRescO*8HHBNclz*8=>I<6(!w`BjecNjhacFQ z>i?QQ|6{!UJ9MUbdLXYN_M6ujn|cngtp(s3W6M;;GXhCLf*Kovj4}-d92b!RHl?n% z);C{X)H8y3DJ-x_E)rX2#k2Hek;!fV)Hnzyvh^$!t9!BcWIfp}`oF99`SF_V@J&=b z(~a+{`{teW@Sd zkv-rg*^xf5Lwb$(z>j!MdIN~?mfR9Q0E+mKt`Um6fz`apTcdl@9Yv+VRq9yTW76Fz7<+CF@GB8rf9@yr-L?Y{FISGt9Y&_vQF zxCh~Fm+F*{yhCZxC%Gr3&ki=1@W~if7kR6M&`0j?;b!KlBms>Vs;ndlcH~S^Qu5$O z;%a;~_yr&&0nosUv#~0xeiMv~o6yq(#BtsMkeeF}{7a~3Kn}3`nwR%FxFd?!8~)kt z0ovVKCZ=Q)r2O7BRDN99Ng&2DaGTjul)cwjmmes2Bb-RUlcSVsJ7c&$@haulp@+Go zM%3iJA17v!wcla}UR*(%^^lem4MH9tBO1Jn=>c*h)>&S-Nm!DU)D%gPlt%76(>X3i zAP-XzyQ1hBQa(#%g(W7e;ns309%Owdc~Pk`WC?$2WWj{6lad^TCFy!?rIwc57z?T) zJHv4jAg4d`Tu#K;gt$n1k))_xQJbxsBl_hRRNi%ahjN2*BpX%0P#av?WKB$LX);UK zu!J>K5ru1#B7^v}qZixMPT2a4FmLJ6(dp9;4hCyCK9qCpY83XY2`A2zR|r&8?b0yB`!gDb59u5~Pc zsh7w!wpQMxiBd#i8Zi*fViGl7m2qIlheZpG)zbOhjC?wWtnRQSK6v+C1b;sim_Q2gS_P*TPh<<=P}}G z6j?KCmRV||S|zO^$CEM${juJgCV&{X5Y|6|G%>@YDx5izg@;3Kb!}+uw6@$=lY;R6 zh_GJ7)vJg_Slxp_O@X68mxVLc&n3o=kS_o?IM$K(QbFeX*htNTa*(;fr=)A}z(_Jf zl8|x<9I^*$NahkULz-R=sd(8X;O6Imk$xO>1GFTui5y}^;lu3v+DJZGE`7kesQaKl zkDPbW^F0AANeAHfexWSIk-Rbf4e{bf-4})Q1LIE<2uubsCP7Ir#EWEuIz=yjl7348 z=?mMHsE2loywir%3rZtxkI=IqZ^#mfAHLmtMZyWg(_wS-3^eAE(azMqmH6i|8i;=o zzw{mYS<+q|$ro51MEw>Rp}>%9;vUwCbHt@AMa0XNn{}J>{zerBR%9&oe8k?C*_P2K z+Y0xktd@wfpe<5WVb%+*mNY6=Mp+{&3CD7qR3~aO^i9Kal$^?M(IRC^(fM1bp0MAV zMG7{b8pFbz{q6v1^e9A~QC6&6#{;K-X%vLxY#69*BPAjHLn^w|7)7Y7Yj27kR?eCz z1VTqtRh+%E%TL_s+USe9Z*DGQo89-AYGBHktOyXLMS*>-pxjxOXxO)f2GbMatS>Nb zNco1$oE+Xlf>7gNn>jM}>uB1%N}}MEgH9ck_wg)K&bZTsY6HN1+4XOIz4x{_5rOC9 zIFVj94mI?VBO^WHdL8Ekry^=Y4N&na+x8p2TnU6=RVn@smlu@GZ0L6PM6_LZZ_jKJ zShEKwMG__pfa`_cO-9t5*;{k~k)k(f1AQoXHGp!!*~J$id&gK{=?jO_0jzAo8@hyg zf#+lA;SKvyQbIaFlq5lcw=F=@nT>d(;sl$F|MA#~&k{rlMzr4vXSW}=wiW4DAfj*< zJCh9U^F-5`N$cl@E)b*&upJ%|0$&5LE#qTMPvngP><4?VGQyaD zQ-vG*-5Yi+V(wKMwmpXYmLCl(@6b@4c%!N~5#*27$|0iFtw4vkr`@#OMoqQ_di85) zxs26zzRU!J9()xq&O)lb=e+0wD0n~>0mlsWxvce-9MoXV{wW^Zq8tO0VOjPxEThO< zGdVn0CF%us^{FGhNWVH>pq8>eeFqGTDTmj?q=EBV^gT#U4YtLyqrFh4q#l%E2F{c3&X!_TJc{*9+ujw+(!ALWAp2 zs?~fsD#VwN*d!tOBz?1086?3f9TUF{^VN6Te^vCJxhGpr2=d>ql#W(KXC zrM{8b{ojw5cKer-*e+zvp8Yi|tv%3wq)&gl_a2-#M;Slb43%`_!(duhb~N@gr`x~L zA{H5}aYDN+X`}37A}An0yDD-CR^T=e^i9dQB1xDS(@By&$I+6|ce%zx7(Y9P@MXz3(tdbEg2B2Pj~h45Lb5IL2z@pY(jCMPxcs8yqa zlG2V1#`!IlD$hg$Hq`q12|OY}-&` z(@<*FRGM8=0!mH3PEEGtn4%Q)iQ^lXJQZtWgvO@NWZ;HfRGnp9Dq_}v#J1qx^RnKn zy#$co1k$b!yj}&|v4Y+*fQ8Wm_ZUUPs0X|0L8~`{ziG5T;yxrBT6ITb%eeHeGL&=H z-zkMRfcI1E$>@5;X*^qI{HkyEXE>)y~ha%*-C);GSea``|j^fjPQIM_?xjuB;LrQGu`BmgK-DwG%yyVjq!c+&N*Vky&o?Bu@m^> zt`FDz7^gO>t#HN6CJ*e~|36Qv|45r`^}%2Ge}Xvh&yx86zA5>SlPc5yz8%*63F8=k zsWy!Wt;a*9YL+2HRuX}J6Gy|F|H(nJuh1_RQN zTaJ@A1ii9WkDm1UG}5U-8I@2}ZyHfV7|OyNzy0)x@!VLnR~hOG>h~t=Po+`k)zF+! zxv%i6#nW=$#2WfK`j0VT1-4At6m@nX+H`I?1GSAxSD%A?&HU||%nlmvw#@np3Zl+f z@Le$ov*j99T0E5=cwuut9j$^|%5EB=RGMh^ zTqme1#LuE^50`|TXK+I>)0|Mbo)4-8|bi>P)>Imf}7 zvMF=K1$hK(0uC&S*Xu1ldTvuF*TT}RP1MDu`>>b)37pafq#y4$p7O~8O_i7NHvQ^H z7m7SZOtj!QS&?|5dE2bI{Ph+KzlTxzScx0#>LV6H^jctiW9X@UT)b_4?dBYK%Kc1X z@ai)IRp&@UoXOciI8>c}Af)Fj=2|9lcpX~GB94jBJqH= zEt0o6U3;(11+z7$I3mtvx9^&x=Zwrn##nOLS$`9#CozioTYHE+CkXD6PPq&_@0g8(eZBx`grHo15qjqK}{Ni3{H?W$&r>YyGo{a(~y)pO^#nk zZBhvT;@>C|96_0Ov5+1T*W~b!XQt63x)$gH5Z9#gF3X!KIQh~g6`m9cOWQO55z)V7 z=jsKJui?G)g||tQ#tU94KotvKG1cwOOeUnoq$U;^?uaXyivEhqEjxOxPj+NC7DC|A~ zxylE*Jjz=Z*pBv3^hh6Bgdea6u@kkpJK_%{kB7t?xo$Sxy_(&qWY!^L2;?n2-=gUD z^N4Hxn+fS<>K5g)1zd>Ci+wV@jH_bNI}z!oRwHg1I%hCE5r4js|KvD}m40*wxC`Hv zR}2OlWU?orkn^if}Qa%5kAF#2Bv?5{`ZMQM^rLU0R{kI ziS+-aI{)uiga1sVf9Gel&3{JGH(Uoz^%U=t6Qw~7Ye;G`npe>ZP)|I91vHA(@`|bE zWU5JU7A)wk>Sf9ELm~b9UKBGQXOS%z~O5SuO=IzA(E|`)5{g-=|2YF zpIT&pzi(gwusv)@Gt;vWPDs1SyT%_%S3b4XX> zoR&EKPEO`w0VQ;FN8k~SY{8hHmNL{7!rj!uY7Ct0$;{S-1@oBbK&!fn)XW9jZ7jB# z=9&$$4Uu{`x^6tx?U6GRwhWS72*f2C-Ij!V3Cc}sMnnJh;%}ggj2P7=XBM0)2&Vc{ zvL=c#BN#Xj5N2#lZFy1h`9jv5{CgYT!8J9trl!;zi>hNSc-^J6C7T5^2NIo(hh<6M zZL)>?$fF=@OXCLa!Tz*)#cq0>Dj7dEov-uA0AEaLVJ}M744Fj{WaM?pU`yACY&P4f zjmePC$s|l`bZTP$#Rnvt{KRlPr=&J5Wp&k=dUgz$u)}XaAZ);34-a=anX`)KmVub^ zY3@Ln35K&R?4$t|j+g4C8;;^28ch5wtV$BU(_E)DB>?RP}(sP~EV%6nAvpW&Iy_fgt!)cL01!d&X}eg3W_GN_&Jp zQo}1KZ!mmi>*!ECL4c5W)OV!UzM%Tl4sd#kdnnmz`S69u8__EU(2%ct&nPUS{O}6b zvkO6IDeVZS(2EV)X|;Nz-n1oUVvAK8r-EBQlnq%etnwwM?n(=)FQUDSjM=blagHLZ zeH8J5-V~hVm<2)%5E%BkIk5;~eyRgbecF&J{8DA-^FMveMm zXFIdDWkpCPFewse7{5~>OLn+!2FbU})w1MWe#YfWVutnV07JnrV>{p9!a{xUH%jjU zD81n}jNU)@l%k!nc7n_H95q409FuP#JQ%}8^!wG=fOi-;VQHMvA?sVg`kE|J0`xa{ z1D>#uhQj^x@_&e$qXh%36Y_%Wb5Z{IyP|?}jvK}yt*a7sNgW+XVW6VL79a5dEyyt} zbb$s6Nyid~`qi4`IZvu09nHOM3y_jSh^B$IE`mV z=0rc5#_~?!U%vyf!nZ3L#3hxRt`+8$@szQ2L1h`N;ux~mZ{PD`jYcfh2PVw`*8D9} z$r$H+qG+|2axtJ9E1}d#yrLj;#TNP8VMJUWttL#-02^~ig1a78Dxqh`ZDxTnBFbKh zwDb@H9P6&O2TP!*S}Vk*nE=Jeqq)BXN*LX)$w-GFl*78~2aoiDnao3z2TpxG00mjC zm}{&0kRB4)LlTR3EJbIKj+Z8OUG(FC0Xa>bO04{(tjok``A6RWbl<14&|@uiLfXQEM=g&-N)y8Nbt!!*#Xem`O-X8EWEt^L)h+wasbTIM)=PB zlmGIxQR(LxZr(>*EcRnPQv0zU{r^6O|G)jIIcgt2kS4}AY==#F6+xsLC0I%;p-v%1 z3zi6?5F}W0fXejMxTm3Ns7nE z-Km4ny5U%|;%5%1HH0DKh9gItLJF`BA1W~3hq`Zw8gr;t6bvXS7~ORrH^#2!cN04= zv*(=$;xLt+#wg3fKTU-RJ1^0+Gct9yH6E92?liyY?z+_)c-;Tq{B;T=4--*LA5mwt{+Fz zHh@5FW|HI#`#KWJH;cvdoJcgYPY_xsT8=MBvZkl;F0D#?%e*;rY5B;kNok+Dwp?u1 znOUYy(z{M7r(e+WW$rn`47&qufa2a-Gigu6;Tmp=7~F)B%7fww<{XL5pWxeSxYqf5dVt?jF`} zUjXyu>9jq^2BtK+WpOr=Xr0Kt(v>}dJ8UX?7z}RmQGSF`@29~53nLFsb|S4AH?LOG zB*Eyo?zK(nxW3q$;M1AG8J&F_m|?I1NwltKvFE%YqDP%fLH#7g>LCv`N9Tv4@gi#5(Xh{Q0g-+It+ozktkIktKk2Q9g+q3n`ri(WDh{-V3}(V zk*W{zhYO_`J)%q@vxGc@5*)L*ks=lI9_mThv8Y1=@P`}I5E}d~j99n2-*s`Po9HPa zl{T)RA(bW>DPfsiT%HU93#u-`N5@7H>G2UFO8SA0pAbtxRk3>!QfTx`H`!!qqe7mH z1}m_R^Taw#pLn4<%VrMtqca+726mVHkR_@~qcZXgE?GbGNgVshxYtkYJfiO7X&(|6m3*DB5Tr^!sb=D>pasRhhQDhG%4iL0Z2nn;qaK{#b8+M$QEBLTo^ z5$V%7Z>w5AZ@a>9@V2tBEAmkFiDh$~W$mnX^NbApk*URwa24ua1eF{Z!M;^Q2jDWd z_Wl_CIc|Nx>nK+kNY{|SnK|*Osdu;lUD90?FO=_zk651IE5t$EB z*d72RrJNnRw4#fM>h6fHj^ZBY@5zJHciYQNZ(nMk89l~ne$#W?`|;WP`ElcYQc^Yx zxEAQoanFWMH)bohbtA-R=PWp|Ic4bz&fgpSi`%n3>X-Y&9Ub0{+rjoo4g8mLI{wZ6 zz8>Dr;h?u8K77!bFWpugxJP@EXFU>=|TQ1}Bva=zg*zAGVKzQL-vhYQ1#uW)Gm zp)pU7WPJR?eMfY@K>3FY$We}oDo}K}eM!H2${lIONlWqt9{v&V+2qAQZV!);*B|&) z6Wwlr6OV6d=rsGS8(Cjr?@U5Y_M8#4k{)T^IERoHZ}qVG_7(RGYpY7&p3%-up=2Hu3v7iWDsEaLLU-1^s8Eic;a~CCbg?04kGvJB45IpR8GNESWMRZt;0!CW2Bl8Z;L=Gg90v_M_ zwPtpgt238z?lhPg3&h*CXnsz_#lv|Mn*3MG$9WSYZ~IpVYRDQ{xdmtpl{7V6#1A9oXqH-o_9S!GIdYn&HXZcY}8UPEkK~$P>|zhO*YA(&6>0bGSk#+ z=Qn@w3ChVS&K&dda!t-GZ1fy%|P4&0JrD^x=rS0;`; z5FhF0qVPwr)`hA!guco`G%K=huZpUZvDOG~OlA5|47F~+`p-RCtJKfa=oCYVoJpUsHd@;AEPvVLs?j~@@D zU;pGz@xd>TSap6SN7jw(w}!~PyRN(gbE+RawR~-4vrpxo$FIbQz3SZ>Z4YbbD<%?f z<-YALCvvyx3K*j}dJ3J)L}G-6x(0lkd9B1BJFMhl)nD-7v1fr9vm?+dQJBUHW%>(|XY=KMp3s*>R%5yNePyTJ(){GMYrk%AP~$g%Uc% z!qg?AWW2%2V=q+7M2R&eN4Ltzr^{{i1F(*MqZ7gku$v!qu(`FC+|eROzGS zWan99`Y@y<2=VDk;|8bBAMc@(3u7-ie6d#@2~i&DIB!!QS&eqWk?fEugvfdSoK=LF zm6;1qS)$|=ngs7qDXa3esCkbg{ z9d|taqJ1(=^b7f-wlGirGIm5#+xPqFwD#fwcQCT-2WG(?t}1rp44`(}X0ikx$HGel zx+Y4iht-wQ&kMVl5KV8@*tl3@gc1{NS5|FY?#aC}l4z5aI(=GFDOSjU#%+c;WeF{U z{za)1fhbS26~+Q8MmH#LKRiDCy|Fy%n}_X5RANh3wbmM+dAR{@*Yo)U;L z9^TOv%Gw5@$PRP`CtRU8+?bSMdA2tI#VL(_`nNMjrKT z5gJ|<#n%SNk|J`YY;F~z0(tTAb$o6!!E(9;Fxf)O({Sc0CJ^fjV`2HJ=*T66gK(|z ztdcI5c|;W#q?VYYsfu%0UdmmU#HrB`>+@j@EE^DCjw%w2^FyR!R7jFpNs<_;T51wa zxf(gIwO|daqBUvdh;AL8DD=(HRcFncNMgcmROT9k?5Y`o6o_i+ ztNPsEP<1eB2ou>r^;#T}^=ppe5)9n8eHM&ER_7FYjMYRU)BSGJYg*Ja5f;DR>u3(m z6s%=c-t$w+)g_i9L2Xp9(C2)Fr1wobZ2#<{rBFNQn34M;X8o~UvP37e;VLM(f7s&t zn^*mJmSFC*88#>jk?r*2DUlY)H%dB0j%#c{y`x-G7%DeuogvbQQMM#xe>pwc>|HM{ zpzB!FA+$h68B5z~Ad=RATBaVgP#aD4x`3rivvibgs)i|4+BxNMjpZggN*7Zvj$L9N zFFs-Sk|Qeh-pCwF`|}W`QLlkQx8D?cEp^n*AFJ-H1h4rJ1&8IDCzMRy5vq%Z@C{rhxj<%?e&U0Rz{i^ViX=#7?xV2eB*5 z>?1p5Gy5T}ksoyq_{zK=?`Ite^{!CblXgU9=!v}WC;flkdH-|D>?lbyq4~M zqFrU1DJ4a@mJ0ROzxl*Qvwbz{yENLCpPwHT36EojgFEIpItIbj&rlTG_by&>x@EKI z(q)aGG11}vd;78D2a$d4`grAk{RRm5yfcMiVo-zyA~T)?(quBPGGs1iWH~kBU=S4} zP9iQ!VjMr3=$05IF-~Zh;4mqj=oT>}g9=qRooTfW@yXz+Q@B-SsuTTk^*{3Gg|Zjf zpP}d;$){sY=gP#w;$7TL!r^7}i5#dE9GWI;PMbAt8E!6;b>wAaV?9Vu;vr7t`8}p8 z+oEddS}Ygq##DZ#2cgN0cey^7iTyAmxZ3II$>Yc(`usofOv=~i3Jk9&&*L&Y3s`-FoZ z2-_Fg6u}Z#Lb+3skI@hc`qT&*MhG)^OfOT=`7*%X1k2wkgVRpVP++HjF23{x!v@>U zMSCWKaaqaHajav)c@WJkt`?iEO;vbIn_cokCMYdCf>3<194lRQ4QYcU7`VokTFb*% zZH-d)D8%mdG1@jA6zqD+NYS)x*Wr ziH(hQmzDjujuknLj5gdJ9Y$7S6~!xS%1yTKor+jTZ)wMj!qWu87Bmc8YpHrGqV*Bp z#ymM$N6|V6mIkK9V)xjEUE_h-;Czi=k>proj825Ya>~5U^5AwDd7GEW%tiJKQE*-G z-pF0;adtLpbzK+p83-)&l*2SkPT^Yk)pJ#GS{87|buqOfM_oVYS?u5@R5vg#l+CXw zlNZW*)K<#)06tKhnCj5k3W2U_L4!IL$ro4m>kZYI? zv}*LGGv%7@QRqkZWT3bK$;^9aP_6>$A3Z@ikbXZbn0J~k3y;+I$Fu?zS_Ne;Hooat zjA0~BFRKdg6hZG(w?d!TLYeZ|yCTh}e$+##VntUc)@W0FskJ)rIhJU>+G{vI*NL=V z&CPr_Enr!t%+rNS-No{`-n#XiuWOy)D{8NoZ$UfjdEkYr80BgatXDn3ewC+y8jUfO zo$(0LlyaQh)lF}B$m(UJyD;??NPLfOJ+|hsjeCZ80aOJ*)d6ia(bAR=`k>yPXn2D( zQah-Si#23BRNM(3h@w5c%eW#>D~9M9P+?VlO;p>J9Spk|7BzMe-`kYJRIS8c!|;V` zQXgGNeR5{_i5z;I*n`UMXTIc;miY92mU74*hhvhORr^Muc>!ziCQB zDMyCtrc6?fOR{7#SbJivT?zY}2=}9U^ii-~4KOLin>CW)tt@J&eZVQN1n))UUt*d* zDcIlb)%3ySce}=d^lXx6kKk&bM}RvzIO&6>{1ii0_F?+8a6U*`LxTP3=x;L%0hSmJ zm$!hm4}8J)z5y_?AS2W}Z?`^&;K2vh-S@j6qxi5?5;biE{4_NL!h-!=^mnHtfn)WY zcpy60pgUSPZzya(U*$!A*ESMJycP`xxatw;jt-vNZ$<;rz5?Cd$8l%rxgg)!ZyV0hogf=~7 zvE*n_N!HYf_BG#9(8(W^tZj_EW9fnqW!!x02&q;;EWURDx^+q^3S|Jp2O{?wa;H7S zzz6I1z@yzATL%5fI)KK*i9Vr|bgfS;L(C-~aRog<+BL`U@#GyhDoC^7^MAoW{`mt6 zrG;7b`svf(BLx6p_#gcN{rjRr1JVcO7}Z}tcH4wml8rft^qsg@Us^vIdVFF=3c&|1V#^k`MYPxz%* zuBwmpf!pgZZvub&9_$-&%$LZXf9bq__}`TAU7b7kH}IGpk_WT|f22R?3I52QS>yik z3<4CR2%*OXQmMBlpu@P$Cp2RDWf9$S&Y~ibx(;C-;mHUI+0{!ElNcN;rtcpqB*2vU zl~Rq2RAow1P^ZFyH8Z%hFd6}Yi@R7FyK?fO1+_b~W=A>KGuoXP$*rIpz_wq{GcmZ^ z*MHahNKZQ&xG`+(ZU<*(o^(>T`MC%|8j(}hA^jQ7Zf&1m*}#Q4urF?|t{~i4*teI8j5O~h*8e0UfSI3?yw0vg&}qqF7)FNmfvm4xz`Ttmtao0 zaI1)|NP1EQW6X^&@jUacl!+a8I|rHzM{Jg}@xVZ1?)gFmJ*`DlH<%lAr5dGoP)9N# zYwqiDt`m|Fz0i_C&$kg_ZbWPDj{@kuj&lRc?e)nz)zy4?y@fMO`f${+jzhYskz$I8 zrK}LaOi{!1Z!V>&C{awXF;RXUT4{;7dRQRSUK=qGrzLI4(`*Qy?oYMxkHJEGBmEwyR*xk|afD+U?}2optOO zV?x<_Dk5tsr-J^DOg1HK`q$6GLC^W;iu%DRj%KkCq`2H(WD ziIf7al*I;epMo%YE{#Eb`FTlXDQnVLTf&GZJ*=G2d=N+GHsxW)>+M`7_8gtLk|Wgg z2Pil)w`U9bP^YDr*_)FhdaLhZ9=d485iwW8C%2!2UW2lattm6vj}v($ezuJd%^M)k z{E&n6K^cllYY#G7-J!~y=VQ!Pl_{E?n@qgO5i4Y*zociLumfK|ctJr6?$$O5nTOf1 z#kAhVhcK_iJgbm_E|mCO5NwJE`FjPwV$0U zu2XtYEJN-0x@UoG#7I)G&yWYPX8MA`T$JwTmV021kM(`JH3 z3|a#$YGv7TXmY0{wG69CEm*d;?fBM7Rp%Wl^_hq&sg`LS)k@QgN`>EY^2?RBUyS(} z%u+E{c}h^{Krarx32%ds<$4F*%|e2&o~|5JQv7O=R0@io47rlrnw+uPe=vY8elbXI z1`3Q6j0aFDUmMnM+I?KyZ%wpRT|wz9NRBX1Frf0QhsS9VEjcZ%2hEhV8(6s*R9I*&t!{lQmh9 zS0!lBW(BnwZ`qd&mo{3Wq>7WOja@hnV`bZP4x80yAmM~`k#L9{5o`$)lcXt8m=z#& z1?W;VtWOgQB5>u{#141c)PfLhI3R+SL5t7H7XM34CGKRcC zg_A+p9_3(7qE{tR42azE|3lh4MM)MmT$+`(ZQHhO+qRvR&Pdy~ZQHhO8B z^*=o~-7{;Qi&$|Jckel8$FuiS8dQpXlFgN?G#?&Ov};-ZTv%NGba>*Xiqm0iBT?a4 zB8Pe=tUxGuF2>1#eTSXdh?HlZv@&;1A!(h&{+_WLO zKpIntqFk#khj(jC%O1XB9l1QL9%NtgJR$CTk*1DuH#o+~=Vt>-2}3!sE9I{xA_8`x zRuM&bw&W7ZJ%66?gS%BYr-St*^~Qmi_xpMAMwLJ^W4H1VP=E1Xh5@;Th<6bMRsD9U(n9}Y_MsGs~tEZG;o-!Y~#p3}AeFh(B z0-BA^uNO8T(7z(L_;Pi*tqbKhBZ7+z?8fge?tyqGl(ewsf-0qhK?zHvE8N}#$yI~q z6;@yg8aeaGfpr`O@Im&MaU>7vyFkVNH3ZVWh&}H%2I08}UZ zBF`f@0qgns4x|rvhy1_+l$yyfD?#@QOV@{~?x&|cWJHcvm4d4G`!h<@000G?q9*8Tc=z@5Yk5Klif%l^a9&q%xo z@$^TS_oJAA?Dp?HlS;-l9)P2j{6FEU( zK)dAZLahubnuOvrYhEqa5w@;%I)Q2HlO0`3GAyyB7*XdGiME9!(Bhxhr1ZR9}1=FB)20>4oLJy*u{L71}gt!9xZm*!UieE~nl$%D(K2y4k zr)Pt(;3AglU~S;0X~0mTt&FM>F=N#knNt2HPkb@XcsyMeo{34jM>SZTTZSs>rUe@7 z(%Pp(8j00V)$4nZHDKF@u8Bn+y!ohECq=Bhj6}c#r{DoshF9+ex?%%SPwD@F?6dQ# zg_EBikZN#a&~QfNC!f|O*{Zw2d214f~yV@HAsV4r^ITLDZ-7p zgPrr32#GaSE-$& zb;dAdnR6}+(>i;Qw6%^x+qYuX{^dQ0-LILLtHEm7=83~{@|K^Orw?xlWDj?l4riG| zd4Sv|LDVSZ#p^3_uMG*oz@!fs*;ZP`5TwHi@~XCnJSB(^8?d;v)|}sW z#`4it1(-PI>8n6DCj%g1;Kxbo=bwECI-RYh(GUD|c+j;r7fh_ioOF^$QYm$4mGA=~ z=(@FpcXe%J@6=@+i2Hc5L1q~MUMeKQ)~IoZ87+NV^oW#BGFmES7p;=~ zMqzcc=tYw#R->4fS;V44g!3l4Sqs^uy-c!%t^WdOR=LW<(e` z{{yU0kMyh(G;{)lQh`R)0Z1QlmKZ#wjSo7H3zYr4nK9))`sFCE)&vCT7K^aaY>|0Z z&>50>yW3rhlz+6uFfP8FJO%6L!n^U1u+;yFhqkeHpdf~=Y*zyOzsjw z!k^X)H}{t{MBeeLFFgO;J4Qa97v1aE;OE<;J*av2ZH z$e2;gf&#ex?7eGoZ}>#`ziFZZf5Csje_8DAvZf;t%?YDVad*2|9B$8cJ@%X#{QrHP z8T`_IkU>OAuMP^TAbc^-dhglR1<G_eVss&g6J}h3W~KUd6~S7wy7(3!qQkt@%E1t zl}SuZR*YR+J_py{qWoNub>!M~9r-dZ(Y!dk)RcI~rF1(7ham0GOQ;gKzXCZ~QjMQj z5`@bIlNLe3sH%5Ufk0C7vXYd>ThsTVgFH2OAk42H9jR60Zjp2-(b6YK)xAU94XB73 zb5REJ28CfwQ4wsQBJb!9TCu8h8eHSZA#87PG8xsVB1R;S_2{{U91GpWQgQrDe5Hcg zB5YTfOJ+s!iPDIorE?jXp7c~{wTG4VXtFF>(L&i4-KDK4b#FB6scMQuaQ7olBloN$ zQ9`IkU92MY>T@!!k|ix7l1iV_>V| zw9ebA7R%leO`HtZ%5i=>ha&rN@oE*OmRcqa;M`Q&qu&+ox%D^8h93kv)?zF?1v#0X zd`{_+5Y8mo_HH-d^$KqA!S&_h+~>I_Sz;%x&B8`;CJQC#LK6u--fcHaQ7w|bbp6>L z-9;zyRdA69+n`yxiDH_|%3r?#`uAK}ZW*2_;u$Z58=|;X%w}d>ImKC}=7^Bfo-Xg< zCO&X8FAJ8^Y}S+I9WMPEeOV=YZP$fO4)250(gi*FB0jF6>EftR8lJ>TJ>vNld8OcVi}>wpD` zX&B6B_LITWMY~^Z*Pm)1`>qf9p6#v=>7MSc4(2WPbr0q(@Kqr4T(~X#$WwDz;Vq-U zYsILzy6>8rdASbJO!^5v1kDajPhMp~JS>bzx7R?GpVauQNW@pQic_ORy+^%Z!z?B* z(K}jTiwx4g6x%fERP#4$iUIKYiV7wE*-Naa{8+NBZggtS>{hp#MkVofsgAn!ZF>^# z#Jrkcwcb+o(X_^__tbQEb+XsI3bYAlXZOm<(jHOVL^ygSZBuPUwb`GIkZ!$+QXB2c z{E$>x?#_gjm7|+=v48M)U_&6!Z83Wj&v(D+Cg31dwj>pN?@i$TyaI4=o(wq}#CyQ@ z;Jll_Kg;1BmE2*kG$~$|o=ykXEQMJNrRX>XX=iO)GC;~nsq5Kw=T_e?FYN~mps$7F z-E{hM?jIDQ`dgCOHX(;gL^y3@l*NhYVslAc$^NVye0;b3-4wJFtJx2TJH%hLI8YGY z&%=0F5%Xy|>6lB5O(g0gYe_<_FNRN~rj6(#+Q*!@dWY%EbNoCz+ZfJ$OCtHBYL!=!+1nxSa>q>#Lcfq2TG;j)wj=>X-((F2|&7DA(d#mWQl4*AbxCdv7b1ONIg2_gSoK<>Ia-DU! zA)e~^@Zy##0Zi4-ws3KJOcn|l^Q_tA&1E{0JXAfEPnh`P<4D^@)72}fG%Ja)ht|}f zi44ZHGsVfl4=2+&4U_X^Ph@u=Z^Wpi>{=24v_QTidRpWgn=lzkm-X~U6k0IB+5mvuSo}Z{wYZx4~oH~ zG?aYjr01c$qZP@BtpzaYc(tA2-8{;zv&DV>6WkAVv$sddyjUisvxaV5i8~^?(q){~ zhR&$_Ao!pEjQ!_^cGZ`CPX99!bNGK2O#V*->nE7R{UNaQ*}IZ#OSv|S$*i)9Swn6@ z-K{85GZAIkrMfz>JFPYYTIAW2OgH%s@$Eo@w5y@fl=_vSDRT+Kgezr0fgF$&6nP&8 zVUUoJ9>n|ZX0~Ro&B=Gb zvwZ;y?tyl6ZtvY4mifElos=!F@RZ;BHqCHz)#vJgU}*@-nqO|lB0C-cQGOuIBL7Cq zD+$NX51Lm5E`cyavb=w;^v27^`2p;cfQ{=5)hj#GV>+Qx{!Yzi;4)}(?*@fWvF*TV z1m}|^zE`-=mUEByM$gADG?TRK6PJ0HM53^;Mxgj4;{AohX8EG9U&iX4+3zo2l*e;` zaWC_6PviXx3-qNOw5RxwC-eT(INOnfO<|$SqT)Rm#Xjt;{GEhtPUfBhO5bqbQXx8~ zLJ7Q)0av|fHy=5wg30IZRd2DQCJN|@DSp%2SLfqm;+6mx|NO_6-siGL7)wvw zJ7>2wu+`n5&S8G-LgE0Ou6jfVOSP->_bc@$nu2DO=VsYqWo?bu4PvmcgQ=>S;%ZgM z%3o1S(HMAY5+R?ab`E64AQ5TRB8!JcM*e~VEsHqc0z3V%uD9boOAuX^2Y{S;K;9aReUPjEv*sT{K&c?PW z@Vq(93c&}v{BDc-^vQVVO;RAWEsASp4K%RbEXW2s>QX-+_ig|ahx3QNe-sA2I(%UK zOI`fXny@xD_i$sQ9T6|x--Noft4XidXK9VB!+yUMjMF4a3`7%6Seg;DKu8ca+neo~ z#za#X{ryPV&>)X_qKaFY3;gUP?G0x!rIRus54gR~k)yK{12l*>MkvCbxea#aMvWD8$01A?iAPGc0R9fQid+VmgDLch6{Aqv5aonE;XyX4<8dc!0Sr8#ji zPU8|}nj|f*s`vv$U5X*KW!#`ED}WrsXb7D+Q7b@gvO1D3r2xU3v{lx;tic-V!%7%V z%o?XhpMJy45Q?pSj^}rcwgo>xB z`&^xy-(ZJTAT1&WHAPD*ZX=by`&h;F7dM?%0ibLZCqtC`xSx9x#_DI7otX)ZAxEW< z743Pl%C!5)4P(w_rCR?xK$&X*Rk2p3eIr;#Yv56m0a>d+0a37P>Wt)>*oVOnv!YZ3 z{g8$(vJc^3f&$H{32%8wQW@QF{FNR#fG9~w>HyUsWsqv{((&Cj7?0=U+fFYBvuRh8 z_!`QpA;3a{GgK6vY^qWJ;Ms}o7N%&ogdW6ho4pZZtttbhLJZTpnKnmz?Nl}q(U-ZP zh=E1qEP?1PaF~`CoR?I3>QXk*PThZ=!pktL&cEK}6aV8TP6))HBuTm;6IJNBlb&zG z$EKeZB#ANJ?}iz+BD$!R@UbCYx)wuhboBmKq|XDbP=sF-jQt!KT&Ev?W!T_X{T-Tb z-ub6kU(Bn82oVw~Wx&nb@lcuYHJQgwCq(|fA1-fC}y#Yj}~jYRHly1T4_~ zg8X_&r4=h|+Wwl1(|^)K{Wv=!HQxd=noSAqY=l6&bX2t6H1*?sLLNBjY%8+aX5_LC z%JhOj)Oai;;Zzngvq zQ$Q@&Z^3*5JhTGHHl~o-fk+X82lLf+ks}L|j??A>u4lzPlZX~aL)4sDn0vFCr(8Jz z+HP0ukXNLyhl`}iW+G#-qf%B!@p@%3G|R6jSQ;F`I3zekMpoPOC`YWZ{8Z6bg02la zh<(IRQAzcrP$?VS@S3)4Xd*+L#>>zR)KD^Vh-I`$CcsSgA?>tKWf_F}_7Ulb;h!~# zRY{5_L7pLGhd_az^UzLS$m;2Yy(7p@(uDfvA??giE#%=2O`_epguNTk4fIfd$ip?X zi1i1M>O>h_hlRE?l96O~&h0nkISOuAujiC|UFw9kN!o|%*i6S3S?#Ithw*FMQ0;a` z5T;V@)e8o~8cij{Oq2z7)BEA)`l*AF`3Ufbd_0>5?jxInpkWsf2honq7~RPA(#<+l zk|*89mog;Jrx7E!lrAfqm$iMSkfbInqH5StJ~1P2%^g zZ%6ggL2l(OK%vkdOyO}Ei0|1Wkq536=~ya6Ua_1b^?e}^ZZ5JHNf4=Rq8xbPk-I>S zVQI5~Xsr4xQ8mK?oz((eszC4dD>jIzu}0o<2B%>{wq)>w*oN4)Us)KZ*%10OHeUFx z=NmwGM`(D#_`z0)Pw7q-!^Dnf;_+Ds>EuanQ@N&H?P6G zfN4gPLVeZf1fv`cF5FW0>(K9O&YR>6GTDY&Xk=l1xJk6G4vLWq(C@`MwP_dO15+A) z!owqCJ`=$j*&=ml)gfoSq!wKX$F$A%PHuPrip4Ju3zL^rKlI%hfwJMclf%0PL;)I| zFD{h_62~0GSI8h^g$wr4Yp%{6Ek1d8Az1Mb~5I#_X;Y*m-UBPY+ za*`GMoXkVf+1>o5UxPK_J?`=_g_XTjeg!eWc#uc34cm?!arby)c-aVA?{{t zt7778W@azuX=3Z8Uutlx?=+1+5|1 zm!Z{$t-O^>bEbzoR6kUF9#$~SfNH_?_}@;W1f;jmju97G18Ut@GhJRft{v{ab9`S& z{r~+(r$9d>a|nO?vM)1D;e?2`K>KV6X+Tz?CA&DdR@gz2`B|v7_#nsn`IJOrJk(}< z8fe*zG89($&i^9KXS}=IP+e4M5>mimFu6CIhJlZ6?hNB`ddDK0qU*qB@~^$s+Jas9 zhgV^ax=NX^%23N?!8vU-(+M2;7Pj0!jH3Ry*(Anz--Co5t8&L@#NlF)8KSBsKa(?+Hj&K^QG`Y%eb1nWk2Br z#StZ7fRY>j)w%WJGyC+Z>(NuSV`N^%EvKI}ZhTl#V-3r=qN5N}kV8YA_cqCmeGIWC z6D~0lcBrDGHdD;obl+`Bhax0Yrc!CEk|jG6A*a9cNo=Z(a=WY4V%4j^=VucXgr#0L ztQ9|{JdVZOhFPW55mewf<69l z0$VNyMI)>YqL*&>fL-NpDZ#yWsjLmof2w+LOYmag2_S(O>cR6za@U$g(*zKU;5o8B zLoMp^#aOW`?%ZlnIB;t)Z;{(Q!}B^&)0ZE1O$Epd4ek6_oi8O(ux-jCJ;ZGqjf~#G zYt!@apwHX-LVMD5H)yCum5s7L!&S>GN~~06aui)Pr@{h`S9JNqrYq`bftsZ}^C}JM zcq-YLLk12Y4wVYG^hYm%$cpPNXQ$jx`*SrhesUURYE5E0^1opzPlx(f`{35?g(fTg zB+)pWz%r~>AYqQ{{bS?UnnRsHIBp=Z@vDrZj@}Xgz{W_T5J4(d!432c69|UWL_a7! zrsY0F=r%s1SldfZ*aYJvJ~0;mxiT-639o+Hpedvc#j{^ip56={|0 zwo-_6QI!^|iJIzgdgWyO)2+3zK?GNX2+wqYqq+OAHhY?R($Fr}E_4cp^Dz3#mw{3tTBDDku)uYzi+y zSw_?Q(}m#>#lXB2(RiARGPK5~yJ`iUj@ptG%N*w$*;#1!5dm`VslDyuqx3wQaxSaZ&3 z*{6eIe!ZN1lvu*Bk0a#&Lqe`p^U|vaIO*`=};k3y#9T3_^;S? z7O77hP$iw-_;NC8=|Tn-Db(i0xF0X03oze5;Qtu`{pT1)>>X9_{Hfp({fub}|NlIO z|1VmtMZ?QSbp`FOzPXptV*sgX0Dugs0$#)jv;YQRiHV%f2pA_F5JWQwO}jTtbxjpi zY_1uhU!`ANEm@&&ZHdwj!7kHo`CX-VZC=x|s@=6E@Y#05^}6Hb#nLVGH8Ok0@w(fV zedlww?b7#qPo<9kkuw19tt}D(ydH_;M_Kp_e;YF(DC>0oe8}e=$)105W~{vmCa&@5CYx#*m4BuBglFIpkMw zIK#sU-?mRiR-NOM+UWzEpEm=?>%+;9ACWHr;+`;0p6SgB-#7Ss^-hrWi%;nP{zZ z<$3JOD1udrKa!)<;;r&%uv0guYD3W73)ey-17GbKOdnAfN+cZRai!<-F1%UGDns70 z$2ML|I-I7+eYKwK9Qaare7w1lvgj%j&$6a(l7;CwOG)CYdGiu8$y$stJ`PMN(xfh- z2^UqVp*gL1@1tGlDYMLub0BRKcIK zbJ?NAYk86;(4T`cW)RnrjeKYew>U_?MFTrf0D0->V3Ee{>ip(7tA~m+yq`~}P9!{~ z{V3XENtaUy@^XkNtCRKAg<7ZiNqLhP(XPdLxpLUH(z`xM-j(An5~MI4#*K>8Sm>1w zg?pUph`p3OePck(FuRjKh&mY)XVG9njBI_PPRpS_A1CO20J0xH4oGyGHkL=O z&|Jfeo8%XCk=`clM$`3Wkw#=hnnJJP|MUQ1ewxP=T$7L$v7W+3(qKpanZbYDoWDji zm+McOBdZ8n^rlWZ5mJT+Ue%U9H&G?#G1tMMxiQnvD^5!?Haz#Ex-B;}>?u`h`Dd zb3ROt=0ATA{I}c)rthA(>E>`D?>;e9z(v*Rx)4pb3f#(1{5}1s4IEp4)PVIXh3H3# zX!8aE&ia*<<$r(%7G=FpY3Uzx$qf_sC=FE{9X94lL_Fv3CXPvmc5#&A(ba%`9sn`}=GZJdQ@ z4)_xCxDMuIJ!hP!5Mw6sy0Xtl$MwlJ>vV>y0&S)bCs~;}^2uYd^G|nvd{=;Oa;@_5 zimca~8q0~@8bPEM;9KN7;#U6y-7@klDnoK}nu0_mgV%1%l&kL&y@%f()fnrsi}85< z$~_LBT~aHgajs+;g{2Gs3q@?oI3X(}JXH=nl7&2ZxS96uiADj`-X_4)8l=nQJDBe` z{QX&MJ%a&q4A$@*DCz z!o=&rQvhvA^}8cGdK4;BelMry+$W9RUn2WdDGV3{T_P{(Pmi4p?g(G`Zs`>{3R4(g zj|Pb9(bQ7m4tBLgKKlh0YR!>F3iFHv!2ag@^Ht5y8}osDs=7tsxV|Ry$@lD#&ja;= zaLOdQ!>HsA2D_~R#`&=skfy>B~aOf_rFat#!fc#)2V?TOG zrs<|6qdR)hMcxhN@^JSbGZz|Zh1)Jmj>|5>qOMj3(?nq0hoL7FnYlx|3HHqIA)z}~ z^lLZK4O;b6(g#jyFYZt<*GVIKBPRh%7pTQ#dt}|<W^`$j!Bqik{4{gO$_ITy)c;gvCDVIuFjn&zx_=T_hfal=d0M;**{ z{vp!T3IkfQi;w8yHt~@DJtcZvbHut1)r=iNQBCGu4?F>kWsEJdVkz7T)t(KyB8A!M zPCULdA={Ru6V3&5=i#^xov_SdG$m^9?2>qZOclkkQ(`X#uG#!z?9=9iYn6Yb+7FENL>f#!$%={46_@rR;d zg0}~|z2nV_<6ItzZffPIN{32o#5s2*(ofHrss`AJLKEbn+jx7;SR>{WJ8ZuU;4>!_Ufli`JlnB|fjd!;Ax3_9uB-BIbw zBtjCoDl-_Vtyn2qRj;c|Lar?zBe|a}Tu&ZR%1b6w_KX#B_>*UrENOllqRGxDIyhp8c_D!AXGv(f5<22$b+`hu)ZPk1G+|}o zANiEHPE9*NuHCr}}zQC%<7zfnWRVU&(+uBR(Lsb;&_SUgg5f0GN9*W3KQENP!A zP&H$j0c&YniGMHnW)@84WBEwIc)%CJ9re1J8|$>QCmiZ)1SsjWI)w==xdJwr9eiW! zCA=CtHJpX=Hna*^t}-016)c|zhaa$ky;?a}kNkmA8ILTT5-z%J&QEj`r#ap^5g8HG zfs(tM=ANorXSO3uZRzXzI^f#iQ|d9;YSgZOZm~$5CE60&NLg5J zz-=rj|0r$)!IQv(Goq)6YouhFA-6f<(43#MxEV5<2OiPIgA2^a8FA8LL)}RW7wG-E z%w)_@)g2w;?3y#FOV9DyaJw(si(I^Hyj3bi&i!7AzS$%opF8UrGQ0_3+&g>tdIE|o zKsXQxD?lbehB`oovJsorO6kbwH(XkmY_)|OZ{UPF^x6Ost5Z1u*J`m~c2#M}>_6F8 zwnpOvdvjNfa9Fq5iEXmghcCCR`NM-oYvtklp2ZL*rZb8!F377gcY6Wi`2K zShk!+p4f^v8knbK2#fzxtbFW$mZ)8jgU%Qg%xZ z$m05OJ0PZWHt28$(UeextPr#RzPI%l!&irioj`q+i;y&zih*h-u)9Wmb$j9T^OUtI z>*#A++TPnf^D^|vI}5zw>;Jbih~Z@!=icDzp=Th+NX>MkLc|1k{-rz6cWl&8^5CI` zhWGayp^zWgp#XQJjaW1vVolZE`4KHXZQi6ibQi<&BCt(~e1(2OL_jNm$)|7rFZSpG z-Y<%QIlrq8hO73M2RG55!NGfIb3k;%C{=4}yo@cAICw+~sSO_uQ8*pnS zjV$4sxs_xbrtt#)eAxA$wRKTd8t*^@50t=KQ~w*zm8JMURhRf^x^R0vpJ zP)Y(XN*L^iMo`;7Ny?u^{#yMp`kwkw& z<>f{@qVqo#J|U5RA=!f?BDWKSDttV!BL1_&{2NVR05j~5o{Bh=7ymJV%#0zven+t! zN0B{7Mj)R4h=M(aLcgyJNh13RRdWOt)y@k^!h1!5`txnBUVkc;S6b$iHhClfp^nDu#@hbMu392# zIf@{Z<{%fYhyUelHE~6zfczOnj=}%+i{by|Z2ce0KQNxSYH0jRw(dzcq;grTc8lzE zWUX0tSvM#RH8ojw_*u4zjakE`gl3I7q)WH6qZ=Eo1=NtusL)_7(8Q33Mfv&h);LuA zQ6GX}dyx!2M8w3zy-N4lJRa;#OBtmPEblMbJg>V?doHs*XW73A{Qne402$W&;(rSu zSRK0IZy!PsbL=7jeKVwLy)B;W3ik;g-x1}PJth(5mp(QTjYaAR8}AY2mp?`UI1?m% ze&0*IB_rVH-$HyV!kH{{%hxD;9Q9No9BP@KBSw0&P$IYJ=iSnO?%?)9c z{}CfLcpNfu%+xj@e?%iT_)p<34&}cW?#?-U??E3NQVQpDMCBLGetLIf2oeWfqP-Hw zpZsru2!50SZB!hbls3TON@^)BlG2mrC$ujVg6$&e8 z-zWJv{_6a()Dh-QMamYBHAU)XinL9-ih|yqpIuT)vXgLDVmL}FF^ywe2^}AhPSwqh zpPg1pie?za%<1w@K-Gcxw7aTIz{o>(C5=^w!UT2ut-4gwVk5nck=o38Vy&qvXx13u zHKf?bqMRm8I-wBqK+d|cxM&iIK~YOvsmRJoGS+k+ z($%kk4vd_({yZLU=F*vaImG1maqa>VbD?Kk@?-%V8JF0~TJ>%LN_X=dv_a~$Rc7_& z%%^KcF9tX+980K%gV4OQijYe2Hh`6fdM38MRH}%{N_ACnW75{%l(gvLaTZ@rxhWWn zE~cl&tL)^rj`AX62OI*E2E71)oM+BK*;T|;-Y-Rx{Kw@<-H9t711r-G=Gz6+MZTJ$ zSi=!z-2?<={&HikuKC$*MU^s13Z{8*O|b^DFXuckD)_lf`aLQoD;eCLWCo=teS4cM zt|@4giEgMz$PL#2;S--s>O@*`UIeU*X!*~8kud>=apxX#2_|KSIL^`;`OglOV2jhK zN+LIE=J{Aj8AS~tPc=Z4@WWrnW3cL^lFpB>eNQRU zS#OHWjlF;ocuGwNlHQq%C>1liU^Cb;)H-gEdW8wLN_C7gyCN6M#zk$-urXhA$Yh0! zROa>q^a&zoC}skcfi)e7im0@BL00~CAg&(I#LhJmN4SRxBv2YPIb%>qkDg;ur%75upncCfXi5{znvEWe-l&p41sIE+^^-uMl+)^Hzf3M>be@ zzyVyHeK~+}fb~X)bzcqH7kpO!=QjZ_!yv&v7?SutG!iQ@i6dG|e0N0iUlOPuNPpx5 zvbQEkqxI|HG_g0BFEs#pCSpNuUqpQj?7A@DjHq^aGqM#4GTEZM>Ca5uaaRuN^PgXO zINjnRfW9Gt@GljB{{Ri~7Y;qrfqxly&O}2#zxJNIXkt$NWG>!6R3?lxCg|yra>IWxs0(593$c?S-3jhxs zKWCX%&0Ia1e3ghqmyPmB-1QM#6E|EOswe#tUfc&N_UTF;4z8o0)^UPf>5C-&-9qN9 z9l8p(hFPWo9;>3B_f55F`BSyY{Wpk`h?9eZ2J!Y{bZ?ZIi#279X;OhcTNGJlVp9!F z8N!5jva_>WzcO+cg!@D~kd{}vN2<@(`+5ool~Ri1+D;R2fmNRw{8|6h+n@ ze7eE_KPzkCnwAfV5l!|WAlrPToRoz#J;kl_)O$XNGCK^R=Fc1H_AlaPMff2IOE@#I z(V=V(C;S5+n6sJeHpksbFPt-_*)1#sDE!G9MmX*Vnn(lu}o) zuOD-5T3|6<)Z5d4zj81JK9OxDtm%bG&<4zo6uWIa7^21AJ{etWEsaEwqq9d7LX7cX`lqdOLKVw%;Q^IW^6?U;iUZO4(1OdQ$4z9(5}f!)9=# zye)F%^BO)8-uMdwCNUc6eT-3KC#h`|!i;t|@W6~~S36fsv$7HeS9#?d-5(Pw646zZ z@oQrMsq#`fZWo;Y05cp+Qw+WO2)&v*HU(s|V(H6{e|-q|=42w)r#r3cUEJRNgsS|u z&a8D#h+{1m(BbY&&|0k&k>S7+y!fby^WLomd-?0N8)eZ7X0e)gv6XjG>`g3n4HJ50 z7&3wE$V#jQQqyKHp5k7R&q`{94YwK8{83f*z6jS3WmDJGR?f|T#|Hu|uhB3=M}$r| zXO!J4*+H3MjC!3ErqV4bxAn&iqEy9MY1T#GX1C_YTOwxL5dsTI5j)iFl?*4g28%tFM_aumo?lEiW#ziD_kUOT%=1pq*@PANN!?UCsEGp%P6zhUP#W5LvW4clUPb2 ziDVo-C3Vh1S`SgK!^p++@Sn>$iAH)H$?PP9@@M@?ba#4clX}YK7PPu~?43KR{XMy< zr(F78{KH;^q9Ds6ehKZbgrS;0Qfl5xgkRi1-z5Jtr+RdQJcbZrDeD*aO*s@n{-&Pc#RpZ!|w+tC+^+`0Fn2 zr?XSOw>@*)9a&#bcLx3-?XVmnpPuod{b8f&!qUXqo>k|d4(yt=F;3-pYqZMfrRs*Ly$9T!bzEf*(rLKBK2R;Oe_MqX zxLV~nJXYIrZ+xXPJPuq|I{qv@f!nQWA(^(BZWiJ$r-gKlr_p6%QF5`_t995+I&oIK zE6BzLWc`8_UuX^Cv2mJ1VfFtV*BcuK&qQhyd*kvL(ht$aJ%cDShf#9HZJ#fqyOqivpZa4c;2X|AU#H&-l3;Fz`+!my3CA9j}o|QLPr5@jTosb#8#-H-PM>opZ#t=hTL2e~YETd`f4} zcK%j)0d;tGK5OVP%(-Yjy!Gg#G?!{+ry}_)qIsf5@DwKFWheg>qSn%Q4BPCXsLpoY zYM2Ah#f)~yvAAI%*cW~jP z%{F{hjJQS(<(QFKya_d&$V)9*AoXW=PB9>XaO(;bJ33x{O7H|2E`GR%3T*ImWaBo^%sJo^$$QnRl-!DPGu)0BkX|WDh!^0 z#m7+&Hwu0f`~y%Z;hLI2|5Z7sK3%)-p?lLm@lutt7>_S4ZXz8?c8x7=Pb|jaCYQQR zLxI)m_F~O=H`=#ALpqi|wVEnu&o(-m#475*<}R9uLa~+)&D?Yu=60jlbZt>gTfpl^ zc6Lti?noW)7WBdSaKQUWvipco{8xFHc7WZp#bmmJ;1u7-tDUs=`8M2kW4+H*wU` z3M$`%OdN9M+AWJ$H{hTU<|TM6?c0Q#G)W6M=4*B#NPYGzV!YVwyB)qH1hCqY8ui!^sxaHX#3 z@2$6--mYZgJixT+&~!|~L+@;PqFwiJ=8NPz@6Kdf%IBWQe-Mgy#rI<9U`cL3pdIc9 zNP|V>3kM_w<=Y&pbwp(1^^__ySHh|;5v>#1}xx>m>g zu2NY5`-{X@smv0)O#5c5MR3a)Y~fB0yG>Vz&fKNF?;Qg^KE2-0Q!8F%XkNhq3P_va7<@wW*aJZ!vk zaRI~&e)i(||3=z5aA(4HSvnO~Y^!3UV%xTD+j(N!wr$(CZQHD*GI_sVJ<~liYxpDX zv+nEcefB>0>$^5{H7ac|w4>kT#=ynHIK{^~--h??vS+kuqFTf`J!#y>K%{{Z0vP0F?hqMfDEM!-b@(0JvsY9Eyje7rKC6FfgU#r z7-opi`?>sm;1F^MJ@ZDMMw zXg+~~PKT#z=Ds*@$QbgZj=5JJmo}|LY5zbQv=00Ysm5)!E)U*@0yCt&7ty^)z3af- zlJPvt8Gen|3yc7(UWW~cFeGK8mvx|wxG_fN&IVUl%AIEOy?zNA z%sKNYCPTnGa8C{iUfSx!a%P~{Hf2oKYpzf5;3Im$zi{pdwIvL%E(HpUL#)M0u1OCvLp(yE^%A zDF$w+qcL_k|tEsLdOB`pcTYr`m? zi#(`}_;}!!l3RN6xW(-v`1?Ry-gTcMU?ocT7HYQCGLtCCJ*5(z#P+V#;eltyV`^R z%m7pg1+wf2;k6F!i=-UKSU4LUSD5F={Ds24YvL;|$=`ViJN_WZ@NZwYMZku`;g(A_ zfL%dyl}U=3iEy#1e#doj35ukZQvv?xS}ErsV>J2fZ4LDLF41Sl9NLL}ItX=Um6 z$?`WRvf>VVQLCa|3icbcblyO_RmP3d59}bnr^P?< ztp!^fAsGy|QZgct*NO&UC>%sDs!V>%i1!-?6%t|Gz;yx9YGjFbRsrOM6`txGq4`ME zrCQCHF$6VuuJuwyNBN<#y_^JhHgQGbi#@OsVec=ERI*p)BR_)^O1hBp^aY;^WaG*+ zNveP*vLt8PYq5xzLr1@$z6gk8R;zi``PW8}*7g=#`>dY1h0~AmY_=+=O2njtt68Qf8#Pt`-3lf_nNq8-v8{qZFS7pfc^&dj&ET9{lEM; zir6|>>pL<0_vV5m)e99xQIx;InTLE_KXuHSlJ~)wK}md5%JbA9!$^NAh$%Lqa|Zs1 z$&~bp=q)tsNj7E@(SdU+Tc!D_~!F5bt*(kt!U>U-m$|rRL?t=lfJ0+{i;j9o#ApF4Ue+a{k8C0f=0?ljdE; zx%yrlN=Hdj2GViL?|kw_yF01{PgiH_#^_^pCwFG(l5$Y4569tE@P2ElIdx4%K7Fhe zC#}I%(Oer*YF6a6^i|~Vda%G3qhD7UVInaW8-h2$kSRpWyt2%&6=$SvKn`lP))91G zss-^+v|adDQm03&L0vKLCB3B!bBdyGQMOQSG9GcPFZ!1h%l0}0fft;z^-rj8zJOin zUWcxk8D;0yoOApjn*e2AOePfMQvS9_bLi^61j?$Yg%PM6G5_npK|ynhkb9gz!&9?R z&QYA%B#mWYEol}~N>fQ{hqxuVZNwV!=S}oM>koLTl{{5hibZtH?bS)@pk$H*zDg!t zHEfu)MYR-K{52H*ZKP&9f8ZMM>Xw1na|B_L0lJ$-a>Tktj5lwG9-=?5@T~mroZi1K zCy}zOp&@_8HMgOTPbTE`LRavghHZ zcEBq3+&enySl!M-5et=R{>-*0k!yS_9&K}x-X;lOtUp-}L{IIX;iWe1X!^a?1=+6t z2N?aRI2(k6d*PZ1{oT)!b@F*ysj9S*LfmQWkIIyE$OH<*hZ};MwpVdO#j^4*lLiRw zX4JioJk=z0+P3mSe+uleFcvf9`due3X1)F3XjAZJyRlw+YIZFaJ1Bf?jDgA@*wH`G znL&7a6DCjwUO6KnAF6*6aXQkxBf$ATU9HpoXm~yI?{RlcRiaR z{%(TatJvph@|>uT@1Z_G;NWK!)adTyDX>Z=+&x!&G1c@+@q`&qPI?e(N z1{T^+THxn*i1xY!*~E9;F3}bQQ{#McxJs1<4Nth&YpIH51&NuOq-IW)hVGN{_xXZl zRTEG7lNZ;>!Pib(M;fk)KKlr_=}nj8$={u?zh9g&UoU;4K$XKi%AFel%&o#ho?PT3 zGue zy^_P@KkV87w1&uDx47|`_7ghaQEINAb{AS>@NZ7`7`Xt+ArNY*$R958AqgL^-)%uR zeJC<_loPwUyGsFhnZtq~`}*6Sfj_!S_a(V}g5Uv7;c%Pd1CZN)u;61n?2z#e_Aa;p zfvSHrEGas%CbrKFCv_ zUKzBwO7uibOtVXvtBXz6dX{9|9V^27aZVxrBDStKJfFVTF``I+VUf)T4jWw7;Jzt!;^I9*qr%L>%Ps!{(LjrQsSs2rk!e;~yTm2RX)9QHBFj(WyLgVsd>9*poPGY2&WiSh? zXRxWY!+1nVrn%G^^xP>iNn=JH&6xTkYPH-ZG2qV%z{$Kd;BR)yVNMa#~eFs+hF5 z86Ax(5G9Gp2L0x*jwRB3r%Xo-W5B-fsY|9#qbC&P`1|k=1qd9{bVsR=(G!Q6?KR&$ zB*)Oo@HovvQajvrlm&_s+S7`HKD%gfl3@MMp;8)4dE!P3l>rgUT?SRTMHm7V?*6{z z0&#V%(@PS4Vs!@>5)WD<>juIOy<#K`WAx|}vSO9(gq!il?7fwGnsOQB`>T0Q#O3-# zrLN7%gh|1+2b@?OwK@Z?cigbtty%-jtttchS|xiPo4qljD2-V^L=Q8f8UtbEf}@1; z5vzY+VY%!|h_uQN7`JK-A#?fUgwzJ(?}lJ`51#T4Cs2Cl@0Gl!AqVXDmF`h|WIl1_ z@0ox2tIm|Z76qH$QNjMPlN<2Hd)`B+F>4KE21JK>N1ZT#fYX_s4tk*WEZq`%m*|7w zyM+}&-9FziTbXWs`SM!4B2(4lf+RW(2?S5__D}6t(=v5N@>;$^2XsfOGJT->EZn-n zn7=~6e+~AaOws@s>&>wf9#Q)r=5HV~8f3LmNz~cMwrR9@y1LaMZsVtR_fos^NINgQ z88qAjIAi@I!chVpnQ4<6p@@geVmr!sLV@McO{LrB!PVet#~9tIa?vltJOtiZq#T)1 zcM}Pam(r|FHGVg1$S0YKRahrUPaMI5V|K+qAE8#owS>pgQ7bI^KN@DCWmefBqt5}e zIKtcBaiH|~^W+XYa;rq0q*rcWGl99lKLv4glxj_0N*nM0RU<}yh96Q~1ccQuHw%x9 zL^{#S08ZR!tZg?&c>pzoV$cpdV`Uowr%VQLw0Q z0A8V!hJjn;iMi8BC6@P#HW$8}`SGj?jrP5~082V2ElO)_aFgN$)&VYbEd+}8i(C+$ z8|PXcjh98Qvp|xu!WkX4|H~8TDU% zL;e?ehxI{+hP2rWj>oOZ#wzpi)+D!>sL$<9TGbz zlntfz3!>DIN%7ufpB3gO3h(eGwGpHivD3cUf2@7y96@yW7qIIzElfcwn>$FZfkv@( zD8SBteYXv9OY!nTPnn9gjvJU)7=}<_pzg^?Qz)sD-K5S}#m|>@t1~N>HVKwc_m{cv zor1@qSNBJfq1nhM0}n*UQc!Bu1lXzmeB@SWjS8e4h`KeE(O*U}kZIutV`A z3HdcwkHff8ER~`thd-6y*FQKJmq8)AZH@>q$?lU1U$^nE$gfbGmem>O%0nq>fn*nr z6R%d2vX3l%J}FC{tL8JJj1gy93A)l1o;w`JK^ zo}%^}vBx-@hVp1b#=TLOek~*rxv{Vw^esX{z2Qwc_?2_7^A*lF7L0R zpq18?vR4y-i(BZ}c9uT8cMJvx%p)J$Tg>i0RBGHWt}0FjD_#jqrY=_{<1z2Akt14_ zQi|qEVtp+kpO_5o5&?>UJDJZOA^aTcjb(nvA)1YN2oWCJvO1PyPb@26^?U5I-nA(JqB4a~X!046;GgJAk2;+Kw@C?HR0 z5Cu+rkXdNv+Lg75UFr_x%wgdYW>f8U@k1=O*WEqo&1M^NVr zyo@&@HDHTS|DvjvI3L-8kIpquR>c5c>j9EjnJ*a_J(CdNq9r%VuBYlfLpHukuP8qNHcm z35U+{`>o$#J>11AoLW~_s$UW~Lz;zVuA`$j_Pmiv14l~CszJdNMjJ!@%wa212F_^c zLG^Cd@LQfbu1GfNv^-%$-S-roe~FXdzh%G46C}rtMhhyjA1oyjs@)v#b{c%tnx}0^ zhZaO*>*8(9i(M>oU+1J0j`1x9klW!c0iF|_pzBjkCHrsMiRFCASFH0sxax1D0&dvy zRfTU8v;VPE^B*u1cS(7q_qi*{Zh3gb2!mkPtVrnt4C2!@#nZ{h zim7#Z6Q@)j#a~D7!lTQhH#jU{$`q;^waZ(&$!$?IIiqGUs+VwFYxKOFZD%NPz?XSi zpszknc3s>>6LDKcJ~uR@l!I5(%`^UT38FgX+-JGCwyS5xc^@K1fsKmOzbqQ^kpK(m?K&n7bixFd~J2X`#1UAb$ARy4NKvViYFZ%)wgEID#oEsuRqjLgQc1|RMhiChgJ@*c_86%;zg(% zMrv1oTJ2nhHJ_!SEa6_?XWs^O=x;>NcrDbKpOFZEw)chv1bOJGGr)f5B0yG5)W%P7 z>kc+}_S327lUemla&{j)V^+(8$DOPx)1ip6i00{XVT~ZZFcOK?+`Q$hmM(1OnLWW9 z0nG{8fH~#fJ$ti%8$+XyTBktP6VLOybaA@puM=a5Y=S3?Z@_VL+@KFkBK%G`yYz4G znxawBh{5*SzbU=SU!%4U-`OO1LR(YAlj!EU|*yeAqekhh(nl(@#DP zgY;jKsTjw@n`j(Rs*k6n>CborNsu`C239IObXSRGFe5%%i&q7X#T(@tUuf0IRpaAX z&7zhx%l2R|W25tzLMM@6?*_%acIn=9qr?lUtm4l&(+U~IEeuRj^1KPU8XiBNffSdC zgsvAxQKrk59G+D(`)%1|m)rU*w0cSS)aeKXsmA~mMm9t;N_rf;GsT2ylSF1Cem#m` zA;3B!LbSNRC1o(Q$YL7MYDx`CgoW{^Jb4F;CHD`k^BNrK(M3S)hiN= zLKf8#ikhrmb!s6jFwf#O=tbuBtyednQAy7)O5<)Cd^b*|{9Sf@cl0?w^O;}pG!-=< zQE7INVHag=;B@4D*=}>ahWmQG$?EyR=Eq4{ZO#^HjG7#bkjzXz+A=$OJOa#0wFyYZ z4l#|`Y{imLQ@+FL@zxQ;Q2;7KW_!Y;j!-Ja$pr5C@lO?xI{)mh5(uN-RiD zRk2KUN9h-wPPiU9zBkfNU(@)r(!6~fpo@99Nvi({TGYqNjG|B zyJVzg$Cc#DL5ndBmdn9ShxS9Gs7Q7VyZd0y-z(ko8E)*ZW8Hr0B_m)-;)fd0}>DXApt2x(#=ri0XA z$>HqE6PJMHo9LyjCbQo!{_3NYKZl~_i1XD6L^!pry_1$ay(}Uug;yrYip^}6Ivbn& zT|`x2D}+o~XJ}$1GLtFPz{t7;g5^VxlSL_Gj0no6u#=TX$=%48OJ(OGQNo6Xv6JRH zVWqLv>kUNLnHeS$hQmjHa;QNe)fowv3MP@Wn!-2`o>Wt~5wrZAD?C%9G<)JgZ;tgd zokAU%jE#zb^61P}5AI4_^^ld&Wb{sRth?GvWqJTJm8Ldh6DJgoS@Chr^dD2Z|H`$u zgjep!bkc_+A=968mcaC|Y5FvG?DSLoRV5A$G-66_IJV9YIsImXX&Dq>vCoWEGN{(~ z*CSAH8w$9o&{48^FByknu(SnGnpefctakG;nK~peHg=0SKX1U4eqi9d<1+qx8l2d(ClM+SUej&0H^jpMe|mc?9S_7;CeYCXS!{IGO=7Gz0^N+iE-264~u8(zi7%D>)K z?q_1fp4jD?XH^Y+B??25mDB=jj*Sr$R�Pk#uugTkI5?bjl5|J_Ah{h*K4(RLW=w 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

    u^Pqqi4HfN@MC=8kB@sG-; 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�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%0AN!l-L7k3UH74JW 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�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 z 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¸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

    A class to check buffer boundaries in general. If there is unsufficient space + * in the buffer when the call is made then a buffer overflow would otherwise + * occur and cause unexpected behaviour, a crash, or worse, a security risk. + * + * Internal class, don't use. + *

    + * @author cix_foo + * @author elias_naur + * @version $Revision$ + * $Id$ + */ +public class BufferChecks { + /** Static methods only! */ + private BufferChecks() { + } + + /** + * Helper methods to ensure a function pointer is not-null (0) + */ + public static void checkFunctionAddress(long pointer) { + if (LWJGLUtil.CHECKS && pointer == 0) { + throw new IllegalStateException("Function is not supported"); + } + } + + /** + * Helper methods to ensure a ByteBuffer is null-terminated + */ + public static void checkNullTerminated(ByteBuffer buf) { + if ( LWJGLUtil.CHECKS && buf.get(buf.limit() - 1) != 0) { + throw new IllegalArgumentException("Missing null termination"); + } + } + + public static void checkNullTerminated(ByteBuffer buf, int count) { + if ( LWJGLUtil.CHECKS ) { + int nullFound = 0; + for ( int i = buf.position(); i < buf.limit(); i++ ) { + if ( buf.get(i) == 0 ) + nullFound++; + } + + if ( nullFound < count ) + throw new IllegalArgumentException("Missing null termination"); + } + } + + /** Helper method to ensure an IntBuffer is null-terminated */ + public static void checkNullTerminated(IntBuffer buf) { + if ( LWJGLUtil.CHECKS && buf.get(buf.limit() - 1) != 0 ) { + throw new IllegalArgumentException("Missing null termination"); + } + } + + /** Helper method to ensure a LongBuffer is null-terminated */ + public static void checkNullTerminated(LongBuffer buf) { + if ( LWJGLUtil.CHECKS && buf.get(buf.limit() - 1) != 0 ) { + throw new IllegalArgumentException("Missing null termination"); + } + } + + /** Helper method to ensure a PointerBuffer is null-terminated */ + public static void checkNullTerminated(PointerBuffer buf) { + if ( LWJGLUtil.CHECKS && buf.get(buf.limit() - 1) != 0 ) { + throw new IllegalArgumentException("Missing null termination"); + } + } + + public static void checkNotNull(Object o) { + if ( LWJGLUtil.CHECKS && o == null) + throw new IllegalArgumentException("Null argument"); + } + + /** + * Helper methods to ensure a buffer is direct (and, implicitly, non-null). + */ + public static void checkDirect(ByteBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("ByteBuffer is not direct"); + } + } + + public static void checkDirect(ShortBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("ShortBuffer is not direct"); + } + } + + public static void checkDirect(IntBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("IntBuffer is not direct"); + } + } + + public static void checkDirect(LongBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("LongBuffer is not direct"); + } + } + + public static void checkDirect(FloatBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("FloatBuffer is not direct"); + } + } + + public static void checkDirect(DoubleBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("DoubleBuffer is not direct"); + } + } + + public static void checkDirect(PointerBuffer buf) { + // NO-OP, PointerBuffer is always direct. + } + + public static void checkArray(Object[] array) { + if ( LWJGLUtil.CHECKS && (array == null || array.length == 0) ) + throw new IllegalArgumentException("Invalid array"); + } + + /** + * This is a separate call to help inline checkBufferSize. + */ + private static void throwBufferSizeException(Buffer buf, int size) { + throw new IllegalArgumentException("Number of remaining buffer elements is " + buf.remaining() + ", must be at least " + size + ". Because at most " + size + " elements can be returned, a buffer with at least " + size + " elements is required, regardless of actual returned element count"); + } + + private static void throwBufferSizeException(PointerBuffer buf, int size) { + throw new IllegalArgumentException("Number of remaining pointer buffer elements is " + buf.remaining() + ", must be at least " + size); + } + + private static void throwArraySizeException(Object[] array, int size) { + throw new IllegalArgumentException("Number of array elements is " + array.length + ", must be at least " + size); + } + + private static void throwArraySizeException(long[] array, int size) { + throw new IllegalArgumentException("Number of array elements is " + array.length + ", must be at least " + size); + } + + /** + * Helper method to ensure a buffer is big enough to receive data from a + * glGet* operation. + * + * @param buf + * The buffer to check + * @param size + * The minimum buffer size + * @throws IllegalArgumentException + */ + public static void checkBufferSize(Buffer buf, int size) { + if ( LWJGLUtil.CHECKS && buf.remaining() < size) { + throwBufferSizeException(buf, size); + } + } + + /** + * Detects the buffer type and performs the corresponding check + * and also returns the buffer position in bytes. + * + * @param buffer the buffer to check + * @param size the size to check + * + * @return the buffer position in bytes + */ + public static int checkBuffer(final Buffer buffer, final int size) { + final int posShift; + if ( buffer instanceof ByteBuffer ) { + BufferChecks.checkBuffer((ByteBuffer)buffer, size); + posShift = 0; + } else if ( buffer instanceof ShortBuffer ) { + BufferChecks.checkBuffer((ShortBuffer)buffer, size); + posShift = 1; + } else if ( buffer instanceof IntBuffer ) { + BufferChecks.checkBuffer((IntBuffer)buffer, size); + posShift = 2; + } else if ( buffer instanceof LongBuffer ) { + BufferChecks.checkBuffer((LongBuffer)buffer, size); + posShift = 4; + } else if ( buffer instanceof FloatBuffer ) { + BufferChecks.checkBuffer((FloatBuffer)buffer, size); + posShift = 2; + } else if ( buffer instanceof DoubleBuffer ) { + BufferChecks.checkBuffer((DoubleBuffer)buffer, size); + posShift = 4; + } else + throw new IllegalArgumentException("Unsupported Buffer type specified: " + buffer.getClass()); + + return buffer.position() << posShift; + } + + public static void checkBuffer(ByteBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(ShortBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(IntBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(LongBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(FloatBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(DoubleBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(PointerBuffer buf, int size) { + if ( LWJGLUtil.CHECKS && buf.remaining() < size ) { + throwBufferSizeException(buf, size); + } + } + + public static void checkArray(Object[] array, int size) { + if ( LWJGLUtil.CHECKS && array.length < size ) + throwArraySizeException(array, size); + } + + public static void checkArray(long[] array, int size) { + if ( LWJGLUtil.CHECKS && array.length < size ) + throwArraySizeException(array, size); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/BufferUtils.java b/LWJGL-Boat/src/main/java/org/lwjgl/BufferUtils.java new file mode 100644 index 000000000..524215306 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/BufferUtils.java @@ -0,0 +1,267 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl; + +import org.lwjgl.system.*; + +import java.nio.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    This class makes it easy and safe to work with direct buffers. It is the recommended way to allocate memory to use with LWJGL.

    + * + *

    Direct buffers

    + * + *

    LWJGL requires that all NIO buffers passed to it are direct buffers. Direct buffers essentially wrap an address that points to off-heap memory, i.e. a + * native pointer. This is the only way LWJGL can safely pass data from Java code to native code, and vice-versa, without a performance penalty. It does not + * support on-heap Java arrays (or plain NIO buffers, which wrap them) because arrays may be moved around in memory by the JVM's garbage collector while native + * code is accessing them. In addition, Java arrays have an unspecified layout, i.e. they are not necessarily contiguous in memory.

    + * + *

    Usage

    + * + *

    When a direct buffer is passed as an argument to an LWJGL method, no data is copied. Instead, the current buffer position is added to the buffer's memory + * address and the resulting value is passed to native code. The native code interprets that value as a pointer and reads or copies from it as necessary. LWJGL + * will often also use the current buffer limit (via {@link Buffer#remaining()}) to automatically pass length/maxlength arguments. This means that, just like + * other APIs that use NIO buffers, the current {@link Buffer#position()} and {@link Buffer#limit()} at the time of the call is very important. Contrary to + * other APIs, LWJGL never modifies the current position, it will be the same value before and after the call.

    + * + *

    Arrays of pointers

    + * + *

    In addition to the standard NIO buffer classes, LWJGL provides a {@link PointerBuffer} class for storing pointer data in an architecture independent way. + * It is used in bindings for pointer-to-pointers arguments, usually to provide arrays of data (input parameter) or to store returned pointer values (output + * parameter). Also, there's the {@link CLongBuffer} class which is similar to {@code PointerBuffer}, but for C {@code long} data.

    + * + *

    Memory management

    + * + *

    Using NIO buffers for off-heap memory has some drawbacks:

    + *
      + *
    • Memory blocks bigger than {@link Integer#MAX_VALUE} bytes cannot be allocated.
    • + *
    • Memory blocks are zeroed-out on allocation, for safety. This has (sometimes unwanted) performance implications.
    • + *
    • There is no way to free a buffer explicitly (without JVM specific reflection). Buffer objects are subject to GC and it usually takes two GC cycles to + * free the off-heap memory after the buffer object becomes unreachable.
    • + *
    + * + *

    An alternative API for allocating off-heap memory can be found in the {@link org.lwjgl.system.MemoryUtil} class. This has none of the above drawbacks, + * but requires allocated memory to be explictly freed when not used anymore.

    + * + *

    Memory alignment

    + * + *

    Allocations done via this class have a guaranteed alignment of 8 bytes. If higher alignment values are required, use the explicit memory management API + * or pad the requested memory with extra bytes and align manually.

    + * + *

    Structs and arrays of structs

    + * + *

    Java does not support struct value types, so LWJGL requires struct values that are backed by off-heap memory. Each struct type defined in a binding + * has a corresponding class in LWJGL that can be used to access its members. Each struct class also has a {@code Buffer} inner class that can be used to + * access (packed) arrays of struct values. Both struct and struct buffer classes may be backed by direct {@link ByteBuffer}s allocated from this class, but it + * is highly recommended to use explicit memory management for performance.

    + */ +public final class BufferUtils { + + private BufferUtils() {} + + /** + * @return n, where buffer_element_size=2^n. + */ + public static int getElementSizeExponent(Buffer buf) { + if (buf instanceof ByteBuffer) + return 0; + else if (buf instanceof ShortBuffer || buf instanceof CharBuffer) + return 1; + else if (buf instanceof FloatBuffer || buf instanceof IntBuffer) + return 2; + else if (buf instanceof LongBuffer || buf instanceof DoubleBuffer) + return 3; + else + throw new IllegalStateException("Unsupported buffer type: " + buf); + } + + /** + * A helper function which is used to get the byte offset in an arbitrary buffer + * based on its position + * @return the position of the buffer, in BYTES + */ + public static int getOffset(Buffer buffer) { + return buffer.position() << getElementSizeExponent(buffer); + } + + /** + * Returns the memory address of the specified buffer. + * + * @param buffer + * the buffer + * + * @return the memory address + */ + static long getBufferAddress(Buffer buffer) { + // Should be below or memAddress0() ? + return memAddress(buffer); + } + + /** + * Allocates a direct native-ordered {@code ByteBuffer} with the specified capacity. + * + * @param capacity the capacity, in bytes + * + * @return a {@code ByteBuffer} + */ + public static ByteBuffer createByteBuffer(int capacity) { + return ByteBuffer.allocateDirect(capacity).order(ByteOrder.nativeOrder()); + } + + static int getAllocationSize(int elements, int elementShift) { + apiCheckAllocation(elements, apiGetBytes(elements, elementShift), 0x7FFF_FFFFL); + return elements << elementShift; + } + + /** + * Allocates a direct native-order {@code ShortBuffer} with the specified number of elements. + * + * @param capacity the capacity, in shorts + * + * @return a {@code ShortBuffer} + */ + public static ShortBuffer createShortBuffer(int capacity) { + return createByteBuffer(getAllocationSize(capacity, 1)).asShortBuffer(); + } + + /** + * Allocates a direct native-order {@code CharBuffer} with the specified number of elements. + * + * @param capacity the capacity, in chars + * + * @return a {@code CharBuffer} + */ + public static CharBuffer createCharBuffer(int capacity) { + return createByteBuffer(getAllocationSize(capacity, 1)).asCharBuffer(); + } + + /** + * Allocates a direct native-order {@code IntBuffer} with the specified number of elements. + * + * @param capacity the capacity, in ints + * + * @return an {@code IntBuffer} + */ + public static IntBuffer createIntBuffer(int capacity) { + return createByteBuffer(getAllocationSize(capacity, 2)).asIntBuffer(); + } + + /** + * Allocates a direct native-order {@code LongBuffer} with the specified number of elements. + * + * @param capacity the capacity, in longs + * + * @return a {@code LongBuffer} + */ + public static LongBuffer createLongBuffer(int capacity) { + return createByteBuffer(getAllocationSize(capacity, 3)).asLongBuffer(); + } + + /** + * Allocates a {@code CLongBuffer} with the specified number of elements. + * + * @param capacity the capacity, in memory addresses + * + * @return a {@code CLongBuffer} + */ + public static CLongBuffer createCLongBuffer(int capacity) { + return CLongBuffer.allocateDirect(capacity); + } + + /** + * Allocates a direct native-order {@code FloatBuffer} with the specified number of elements. + * + * @param capacity the capacity, in floats + * + * @return a FloatBuffer + */ + public static FloatBuffer createFloatBuffer(int capacity) { + return createByteBuffer(getAllocationSize(capacity, 2)).asFloatBuffer(); + } + + /** + * Allocates a direct native-order {@code DoubleBuffer} with the specified number of elements. + * + * @param capacity the capacity, in doubles + * + * @return a {@code DoubleBuffer} + */ + public static DoubleBuffer createDoubleBuffer(int capacity) { + return createByteBuffer(getAllocationSize(capacity, 3)).asDoubleBuffer(); + } + + /** + * Allocates a {@code PointerBuffer} with the specified number of elements. + * + * @param capacity the capacity, in memory addresses + * + * @return a {@code PointerBuffer} + */ + public static PointerBuffer createPointerBuffer(int capacity) { + return PointerBuffer.allocateDirect(capacity); + } + + // memsets + + /** + * Fills the specified buffer with zeros from the current position to the current limit. + * + * @param buffer the buffer to fill with zeros + */ + public static void zeroBuffer(ByteBuffer buffer) { memSet(buffer, 0); } + + /** + * Fills the specified buffer with zeros from the current position to the current limit. + * + * @param buffer the buffer to fill with zeros + */ + public static void zeroBuffer(ShortBuffer buffer) { memSet(buffer, 0); } + + /** + * Fills the specified buffer with zeros from the current position to the current limit. + * + * @param buffer the buffer to fill with zeros + */ + public static void zeroBuffer(CharBuffer buffer) { memSet(buffer, 0); } + + /** + * Fills the specified buffer with zeros from the current position to the current limit. + * + * @param buffer the buffer to fill with zeros + */ + public static void zeroBuffer(IntBuffer buffer) { memSet(buffer, 0); } + + /** + * Fills the specified buffer with zeros from the current position to the current limit. + * + * @param buffer the buffer to fill with zeros + */ + public static void zeroBuffer(FloatBuffer buffer) { memSet(buffer, 0); } + + /** + * Fills the specified buffer with zeros from the current position to the current limit. + * + * @param buffer the buffer to fill with zeros + */ + public static void zeroBuffer(LongBuffer buffer) { memSet(buffer, 0); } + + /** + * Fills the specified buffer with zeros from the current position to the current limit. + * + * @param buffer the buffer to fill with zeros + */ + public static void zeroBuffer(DoubleBuffer buffer) { memSet(buffer, 0); } + + /** + * Fills the specified buffer with zeros from the current position to the current limit. + * + * @param buffer the buffer to fill with zeros + */ + public static > void zeroBuffer(T buffer) { memSet(buffer, 0); } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/CLongBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/CLongBuffer.java new file mode 100644 index 000000000..4c8ff8039 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/CLongBuffer.java @@ -0,0 +1,407 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl; + +import org.lwjgl.system.*; + +import javax.annotation.*; +import java.nio.*; + +import static org.lwjgl.system.CheckIntrinsics.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * This class is a container for C {@code long} data. Its interface mirrors the {@link LongBuffer} API for convenience. + * + *

    The size of the C {@code long} type depends on the platform and CPU architecture. On Windows it is always 32-bit. On other platforms, it is 32-bit on + * 32-bit architectures and 64-bit on 64-bit architectures. Most APIs prefer portable sizes, so this class is rarely needed.

    + */ +public class CLongBuffer extends CustomBuffer implements Comparable { + + protected CLongBuffer(long address, @Nullable ByteBuffer container, int mark, int position, int limit, int capacity) { + super(address, container, mark, position, limit, capacity); + } + + /** + * Allocates a new long buffer. + * + *

    The new buffer's position will be zero, its limit will be its capacity, and its mark will be undefined.

    + * + * @param capacity the new buffer's capacity, in longs + * + * @return the new long buffer + * + * @throws IllegalArgumentException If the {@code capacity} is a negative integer + */ + public static CLongBuffer allocateDirect(int capacity) { + ByteBuffer source = BufferUtils.createByteBuffer(BufferUtils.getAllocationSize(capacity, CLONG_SHIFT)); + return new CLongBuffer(memAddress(source), source, -1, 0, capacity, capacity); + } + + /** + * Creates a new {@code CLongBuffer} that starts at the specified memory address and has the specified capacity. + * + * @param address the starting memory address + * @param capacity the buffer capacity, in number of longs + */ + public static CLongBuffer create(long address, int capacity) { + return new CLongBuffer(address, null, -1, 0, capacity, capacity); + } + + /** + * Creates a new {@code CLongBuffer} using the specified ByteBuffer as its long data source. + * + * @param source the source buffer + */ + public static CLongBuffer create(ByteBuffer source) { + int capacity = source.remaining() >> CLONG_SHIFT; + return new CLongBuffer(memAddress(source), source, -1, 0, capacity, capacity); + } + + @Override + protected CLongBuffer self() { + return this; + } + + @Override + public int sizeof() { + return CLONG_SIZE; + } + + /** + * Relative get method. Reads the long at this buffer's current position, and then increments the position. + * + * @return the long at the buffer's current position + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public long get() { + return memGetCLong(address + Integer.toUnsignedLong(nextGetIndex()) * CLONG_SIZE); + } + + /** + * Convenience relative get from a source ByteBuffer. + * + * @param source the source ByteBuffer + */ + public static long get(ByteBuffer source) { + if (source.remaining() < CLONG_SIZE) { + throw new BufferUnderflowException(); + } + + try { + return memGetCLong(memAddress(source)); + } finally { + source.position(source.position() + CLONG_SIZE); + } + } + + /** + * Relative put method  (optional operation). + * + *

    Writes the specified long into this buffer at the current position, and then increments the position.

    + * + * @param p the long to be written + * + * @return This buffer + * + * @throws BufferOverflowException If this buffer's current position is not smaller than its limit + */ + public CLongBuffer put(long p) { + memPutCLong(address + Integer.toUnsignedLong(nextPutIndex()) * CLONG_SIZE, p); + return this; + } + + /** + * Convenience relative put on a target ByteBuffer. + * + * @param target the target ByteBuffer + * @param p the long value to be written + */ + public static void put(ByteBuffer target, long p) { + if (target.remaining() < CLONG_SIZE) { + throw new BufferOverflowException(); + } + + try { + memPutCLong(memAddress(target), p); + } finally { + target.position(target.position() + CLONG_SIZE); + } + } + + /** + * Absolute get method. Reads the long at the specified {@code index}. + * + * @param index the index from which the long will be read + * + * @return the long at the specified {@code index} + * + * @throws IndexOutOfBoundsException If {@code index} is negative or not smaller than the buffer's limit + */ + public long get(int index) { + return memGetCLong(address + check(index, limit) * CLONG_SIZE); + } + + /** + * Convenience absolute get from a source ByteBuffer. + * + * @param source the source ByteBuffer + * @param index the index at which the long will be read + */ + public static long get(ByteBuffer source, int index) { + checkFromIndexSize(index, CLONG_SIZE, source.limit()); + return memGetCLong(memAddress0(source) + index); + } + + /** + * Absolute put method  (optional operation). + * + *

    Writes the specified long into this buffer at the specified {@code index}.

    + * + * @param index the index at which the long will be written + * @param p the long value to be written + * + * @return This buffer + * + * @throws IndexOutOfBoundsException If {@code index} is negative or not smaller than the buffer's limit + */ + public CLongBuffer put(int index, long p) { + memPutCLong(address + check(index, limit) * CLONG_SIZE, p); + return this; + } + + /** + * Convenience absolute put on a target ByteBuffer. + * + * @param target the target ByteBuffer + * @param index the index at which the long will be written + * @param p the long value to be written + */ + public static void put(ByteBuffer target, int index, long p) { + checkFromIndexSize(index, CLONG_SIZE, target.limit()); + memPutCLong(memAddress0(target) + index, p); + } + + // -- Bulk get operations -- + + /** + * Relative bulk get method. + * + *

    This method transfers longs from this buffer into the specified destination array. An invocation of this method of the form {@code src.get(a)} + * behaves in exactly the same way as the invocation + * + *

    +     *     src.get(a, 0, a.length) 
    + * + * @return This buffer + * + * @throws BufferUnderflowException If there are fewer than {@code length} longs remaining in this buffer + */ + public CLongBuffer get(long[] dst) { + return get(dst, 0, dst.length); + } + + /** + * Relative bulk get method. + * + *

    This method transfers longs from this buffer into the specified destination array. If there are fewer longs remaining in the buffer than are + * required to satisfy the request, that is, if {@code length} {@code >} {@code remaining()}, then no longs are transferred and a + * {@link BufferUnderflowException} is thrown. + * + *

    Otherwise, this method copies {@code length} longs from this buffer into the specified array, starting at the current position of this buffer and + * at the specified offset in the array. The position of this buffer is then incremented by {@code length}. + * + *

    In other words, an invocation of this method of the form {@code src.get(dst, off, len)} has exactly the same effect as the loop

    + * + *
    +     *     for (int i = off; i < off + len; i++)
    +     *         dst[i] = src.get(); 
    + * + *

    except that it first checks that there are sufficient longs in this buffer and it is potentially much more efficient.

    + * + * @param dst the array into which longs are to be written + * @param offset the offset within the array of the first long to be written; must be non-negative and no larger than {@code dst.length} + * @param length the maximum number of longs to be written to the specified array; must be non-negative and no larger than {@code dst.length - offset} + * + * @return This buffer + * + * @throws BufferUnderflowException If there are fewer than {@code length} longs remaining in this buffer + * @throws IndexOutOfBoundsException If the preconditions on the {@code offset} and {@code length} parameters do not hold + */ + public CLongBuffer get(long[] dst, int offset, int length) { + if (CLONG_SIZE == 8) { + memLongBuffer(address(), remaining()).get(dst, offset, length); + position(position() + length); + } else { + get32(dst, offset, length); + } + + return this; + } + + private void get32(long[] dst, int offset, int length) { + checkFromIndexSize(offset, length, dst.length); + if (remaining() < length) { + throw new BufferUnderflowException(); + } + for (int i = offset, end = offset + length; i < end; i++) { + dst[i] = get(); + } + } + + /** + * Relative bulk put method  (optional operation). + * + *

    This method transfers the entire content of the specified source long array into this buffer. An invocation of this method of the form + * {@code dst.put(a)} behaves in exactly the same way as the invocation

    + * + *
    +     *     dst.put(a, 0, a.length) 
    + * + * @return This buffer + * + * @throws BufferOverflowException If there is insufficient space in this buffer + */ + public CLongBuffer put(long[] src) { + return put(src, 0, src.length); + } + + /** + * Relative bulk put method  (optional operation). + * + *

    This method transfers longs into this buffer from the specified source array. If there are more longs to be copied from the array than remain + * in this buffer, that is, if {@code length} {@code >} {@code remaining()}, then no longs are transferred and a + * {@link BufferOverflowException} is thrown. + * + *

    Otherwise, this method copies {@code length} longs from the specified array into this buffer, starting at the specified offset in the array and + * at the current position of this buffer. The position of this buffer is then incremented by {@code length}.

    + * + *

    In other words, an invocation of this method of the form {@code dst.put(src, off, len)} has exactly the same effect as the loop

    + * + *
    +     *     for (int i = off; i < off + len; i++)
    +     *         dst.put(a[i]); 
    + * + *

    except that it first checks that there is sufficient space in this buffer and it is potentially much more efficient.

    + * + * @param src the array from which longs are to be read + * @param offset the offset within the array of the first long to be read; must be non-negative and no larger than {@code array.length} + * @param length the number of longs to be read from the specified array; must be non-negative and no larger than {@code array.length - offset} + * + * @return This buffer + * + * @throws BufferOverflowException If there is insufficient space in this buffer + * @throws IndexOutOfBoundsException If the preconditions on the {@code offset} and {@code length} parameters do not hold + */ + public CLongBuffer put(long[] src, int offset, int length) { + if (CLONG_SIZE == 8) { + memLongBuffer(address(), remaining()).put(src, offset, length); + position(position() + length); + } else { + put32(src, offset, length); + } + + return this; + } + + private void put32(long[] src, int offset, int length) { + checkFromIndexSize(offset, length, src.length); + if (remaining() < length) { + throw new BufferOverflowException(); + } + int end = offset + length; + for (int i = offset; i < end; i++) { + put(src[i]); + } + } + + /** + * Returns the current hash code of this buffer. + * + *

    The hash code of a long buffer depends only upon its remaining elements; that is, upon the elements from {@code position()} up to, and including, + * the element at {@code limit()} - {@code 1}.

    + * + *

    Because buffer hash codes are content-dependent, it is inadvisable to use buffers as keys in hash maps or similar data structures unless it is known + * that their contents will not change.

    + * + * @return the current hash code of this buffer + */ + public int hashCode() { + int h = 1; + int p = position(); + for (int i = limit() - 1; i >= p; i--) { + h = 31 * h + (int)get(i); + } + return h; + } + + /** + * Tells whether or not this buffer is equal to another object. + * + *

    Two long buffers are equal if, and only if,

    + * + *
      + *
    1. They have the same element type,
    2. + *
    3. They have the same number of remaining elements, and
    4. + *
    5. The two sequences of remaining elements, considered + * independently of their starting positions, are pointwise equal.
    6. + *
    + * + *

    A long buffer is not equal to any other type of object.

    + * + * @param ob the object to which this buffer is to be compared + * + * @return {@code true} if, and only if, this buffer is equal to the + * given object + */ + public boolean equals(Object ob) { + if (!(ob instanceof CLongBuffer)) { + return false; + } + CLongBuffer that = (CLongBuffer)ob; + if (this.remaining() != that.remaining()) { + return false; + } + int p = this.position(); + for (int i = this.limit() - 1, j = that.limit() - 1; i >= p; i--, j--) { + long v1 = this.get(i); + long v2 = that.get(j); + if (v1 != v2) { + return false; + } + } + return true; + } + + /** + * Compares this buffer to another. + * + *

    Two long buffers are compared by comparing their sequences of remaining elements lexicographically, without regard to the starting position of + * each sequence within its corresponding buffer.

    + * + *

    A long buffer is not comparable to any other type of object.

    + * + * @return A negative integer, zero, or a positive integer as this buffer is less than, equal to, or greater than the specified buffer + */ + @Override + public int compareTo(CLongBuffer that) { + int n = this.position() + Math.min(this.remaining(), that.remaining()); + for (int i = this.position(), j = that.position(); i < n; i++, j++) { + long v1 = this.get(i); + long v2 = that.get(j); + if (v1 == v2) { + continue; + } + if (v1 < v2) { + return -1; + } + return +1; + } + return this.remaining() - that.remaining(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/LWJGLException.java b/LWJGL-Boat/src/main/java/org/lwjgl/LWJGLException.java new file mode 100644 index 000000000..79ef96bcd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/LWJGLException.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2002-2008 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; + +/** + *

    + * This exception is supplied to make exception handling more generic for LWJGL + * specific exceptions + *

    + * + * @author Brian Matzon + * @version $Revision$ + * $Id$ + */ +public class LWJGLException extends Exception { + + private static final long serialVersionUID = 1L; + + /** + * Plain c'tor + */ + public LWJGLException() { + super(); + } + + /** + * Creates a new LWJGLException + * + * @param msg + * String identifier for exception + */ + public LWJGLException(String msg) { + super(msg); + } + + /** + * @param message + * @param cause + */ + public LWJGLException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param cause + */ + public LWJGLException(Throwable cause) { + super(cause); + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/LWJGLUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/LWJGLUtil.java new file mode 100644 index 000000000..04f1f2974 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/LWJGLUtil.java @@ -0,0 +1,632 @@ +/* + * Copyright (c) 2002-2008 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; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.nio.ByteBuffer; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; + +/** + *

    + * Internal library methods + *

    + * + * @author Brian Matzon + * @version $Revision$ + * $Id$ + */ +public class LWJGLUtil { + public static final int PLATFORM_LINUX = 1; + public static final int PLATFORM_MACOSX = 2; + public static final int PLATFORM_WINDOWS = 3; + public static final String PLATFORM_LINUX_NAME = "linux"; + public static final String PLATFORM_MACOSX_NAME = "macosx"; + public static final String PLATFORM_WINDOWS_NAME = "windows"; + + private static final String LWJGL_ICON_DATA_16x16 = + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\376\377\377\377\302\327\350\377" + + "\164\244\313\377\120\213\275\377\124\216\277\377\206\257\322\377" + + "\347\357\366\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\365\365\365\377\215\217\221\377\166\202\215\377" + + "\175\215\233\377\204\231\252\377\224\267\325\377\072\175\265\377" + + "\110\206\272\377\332\347\361\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\364\370\373\377\234\236\240\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\344\344\344\377\204\255\320\377" + + "\072\175\265\377\133\222\301\377\374\375\376\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\221\266\325\377\137\137\137\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\042\042\042\377\377\377\377\377\350\360\366\377" + + "\071\174\265\377\072\175\265\377\304\330\351\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\306\331\351\377" + + "\201\253\316\377\035\035\035\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\146\146\146\377\377\377\377\377\320\340\355\377" + + "\072\175\265\377\072\175\265\377\215\264\324\377\377\377\377\377" + + "\362\362\362\377\245\245\245\377\337\337\337\377\242\301\334\377" + + "\260\305\326\377\012\012\012\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\250\250\250\377\377\377\377\377\227\272\330\377" + + "\072\175\265\377\072\175\265\377\161\241\312\377\377\377\377\377" + + "\241\241\241\377\000\000\000\377\001\001\001\377\043\043\043\377" + + "\314\314\314\377\320\320\320\377\245\245\245\377\204\204\204\377" + + "\134\134\134\377\357\357\357\377\377\377\377\377\140\226\303\377" + + "\072\175\265\377\072\175\265\377\155\236\310\377\377\377\377\377" + + "\136\136\136\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\317\317\317\377\037\037\037\377\003\003\003\377\053\053\053\377" + + "\154\154\154\377\306\306\306\377\372\374\375\377\236\277\332\377" + + "\167\245\314\377\114\211\274\377\174\250\316\377\377\377\377\377" + + "\033\033\033\377\000\000\000\377\000\000\000\377\027\027\027\377" + + "\326\326\326\377\001\001\001\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\122\122\122\377\345\345\345\377\075\075\075\377" + + "\150\150\150\377\246\246\247\377\332\336\341\377\377\377\377\377" + + "\164\164\164\377\016\016\016\377\000\000\000\377\131\131\131\377" + + "\225\225\225\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\221\221\221\377\233\233\233\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\002\002\002\377\103\103\103\377" + + "\377\377\377\377\356\356\356\377\214\214\214\377\277\277\277\377" + + "\126\126\126\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\323\323\323\377\130\130\130\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\063\063\063\377" + + "\377\377\377\377\377\377\377\377\374\375\376\377\377\377\377\377" + + "\300\300\300\377\100\100\100\377\002\002\002\377\000\000\000\377" + + "\033\033\033\377\373\373\373\377\027\027\027\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\170\170\170\377" + + "\377\377\377\377\377\377\377\377\322\341\356\377\176\251\316\377" + + "\340\352\363\377\377\377\377\377\324\324\324\377\155\155\155\377" + + "\204\204\204\377\323\323\323\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\275\275\275\377" + + "\377\377\377\377\377\377\377\377\376\376\376\377\146\232\305\377" + + "\075\177\266\377\202\254\320\377\344\355\365\377\377\377\377\377" + + "\377\377\377\377\345\345\345\377\055\055\055\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\014\014\014\377\366\366\366\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\342\354\364\377" + + "\115\211\274\377\072\175\265\377\076\200\266\377\207\260\322\377" + + "\347\357\366\377\377\377\377\377\376\376\376\377\274\274\274\377" + + "\117\117\117\377\003\003\003\377\112\112\112\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\353\362\370\377\214\263\324\377\126\220\300\377\120\214\275\377" + + "\167\245\314\377\355\363\370\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\337\337\337\377\346\346\346\377\377\377\377\377"; + + private static final String LWJGL_ICON_DATA_32x32 = + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\374\375\377" + + "\313\335\354\377\223\267\326\377\157\240\311\377\134\223\302\377\140\226\303\377\172\247\315\377\254\310\340\377\355\363\370\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\375\376\377\265\316\343\377\132\222\301\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\105\205\271\377" + + "\241\301\334\377\374\375\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\374\374\377\342\352\361\377\270\317\343\377\256\311\340\377" + + "\243\302\334\377\230\272\330\377\214\263\323\377\201\254\317\377\156\237\310\377\075\177\266\377\072\175\265\377\072\175\265\377" + + "\072\175\265\377\162\242\312\377\365\370\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\330\330\330\377\061\061\061\377\044\044\044\377\061\061\061\377\100\100\100\377" + + "\122\122\122\377\145\145\145\377\164\164\164\377\217\217\217\377\367\370\370\377\254\310\337\377\073\175\265\377\072\175\265\377" + + "\072\175\265\377\072\175\265\377\171\247\315\377\374\375\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\376\376\376\377\150\150\150\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\266\266\266\377\376\376\376\377\206\256\321\377\072\175\265\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\256\312\341\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\323\342\356\377\341\352\362\377\050\050\050\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\002\002\002\377\336\336\336\377\377\377\377\377\365\370\373\377\133\222\301\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\110\206\272\377\364\370\373\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\354\363\370\377\144\231\305\377\327\331\333\377\005\005\005\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\044\044\044\377\376\376\376\377\377\377\377\377\377\377\377\377\300\325\347\377" + + "\071\174\265\377\072\175\265\377\072\175\265\377\072\175\265\377\253\310\340\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377" + + "\170\246\314\377\173\247\315\377\236\236\236\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\145\145\145\377\377\377\377\377\377\377\377\377\377\377\377\377\342\354\364\377" + + "\067\173\264\377\072\175\265\377\072\175\265\377\072\175\265\377\146\232\305\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\303\327\350\377" + + "\071\175\265\377\262\314\341\377\130\130\130\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\251\251\251\377\377\377\377\377\377\377\377\377\377\377\377\377\274\322\345\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\100\201\267\377\356\364\371\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\374\375\377\132\222\301\377" + + "\075\177\266\377\335\345\355\377\034\034\034\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\007\007\007\377\347\347\347\377\377\377\377\377\377\377\377\377\377\377\377\377\205\256\321\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\071\175\265\377\314\336\354\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\377\272\322\345\377\072\175\265\377" + + "\127\220\277\377\320\321\321\377\003\003\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\063\063\063\377\375\375\375\377\377\377\377\377\377\377\377\377\373\374\375\377\120\213\275\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\071\175\265\377\261\314\342\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\312\312\312\377\067\067\067\377\141\141\141\377\242\242\242\377\335\335\335\377\344\354\363\377\261\313\341\377" + + "\264\315\342\377\346\346\346\377\043\043\043\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\162\162\162\377\377\377\377\377\377\377\377\377\377\377\377\377\330\345\360\377\072\175\265\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\240\300\333\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\146\146\146\377\000\000\000\377\000\000\000\377\000\000\000\377\006\006\006\377\047\047\047\377\146\146\146\377" + + "\324\324\324\377\377\377\377\377\366\366\366\377\320\320\320\377\227\227\227\377\136\136\136\377\047\047\047\377\004\004\004\377" + + "\000\000\000\377\003\003\003\377\300\300\300\377\377\377\377\377\377\377\377\377\377\377\377\377\242\301\333\377\072\175\265\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\236\277\332\377\377\377\377\377\377\377\377\377" + + "\373\373\373\377\045\045\045\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\134\134\134\377\377\377\377\377\352\352\352\377\217\217\217\377\265\265\265\377\351\351\351\377\375\375\375\377\347\347\347\377" + + "\262\262\262\377\275\275\275\377\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\377\153\235\307\377\072\175\265\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\241\301\334\377\377\377\377\377\377\377\377\377" + + "\333\333\333\377\003\003\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\203\203\203\377\377\377\377\377\137\137\137\377\000\000\000\377\000\000\000\377\013\013\013\377\067\067\067\377\166\166\166\377" + + "\267\267\267\377\360\360\360\377\377\377\377\377\377\377\377\377\377\377\377\377\360\365\371\377\113\210\273\377\075\177\266\377" + + "\071\174\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\262\314\342\377\377\377\377\377\377\377\377\377" + + "\232\232\232\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\305\305\305\377\367\367\367\377\035\035\035\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\007\007\007\377\074\074\074\377\337\337\337\377\377\377\377\377\373\374\375\377\374\375\376\377\363\367\372\377" + + "\314\335\353\377\236\276\332\377\162\241\311\377\114\211\273\377\072\175\265\377\311\334\353\377\377\377\377\377\377\377\377\377" + + "\126\126\126\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\017\017\017\377" + + "\371\371\371\377\321\321\321\377\003\003\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\216\216\216\377\377\377\377\377\371\371\371\377\204\204\204\377\160\160\160\377" + + "\260\260\260\377\352\352\352\377\377\377\377\377\371\373\374\377\334\350\362\377\366\371\374\377\377\377\377\377\377\377\377\377" + + "\025\025\025\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\116\116\116\377" + + "\377\377\377\377\221\221\221\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\273\273\273\377\377\377\377\377\236\236\236\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\004\004\004\377\057\057\057\377\160\160\160\377\260\260\260\377\346\346\346\377\376\376\376\377\377\377\377\377" + + "\071\071\071\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\220\220\220\377" + + "\377\377\377\377\115\115\115\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\020\020\020\377\360\360\360\377\377\377\377\377\132\132\132\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\011\011\011\377\062\062\062\377\261\261\261\377" + + "\366\366\366\377\241\241\241\377\065\065\065\377\002\002\002\377\000\000\000\377\000\000\000\377\002\002\002\377\321\321\321\377" + + "\365\365\365\377\023\023\023\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\105\105\105\377\376\376\376\377\370\370\370\377\035\035\035\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\053\053\053\377" + + "\377\377\377\377\377\377\377\377\374\374\374\377\276\276\276\377\120\120\120\377\005\005\005\377\045\045\045\377\371\371\371\377" + + "\302\302\302\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\206\206\206\377\377\377\377\377\322\322\322\377\001\001\001\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\103\103\103\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\376\376\377\334\334\334\377\340\340\340\377\377\377\377\377" + + "\225\225\225\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\001\001\001\377\310\310\310\377\377\377\377\377\216\216\216\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\210\210\210\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\337\337\337\377\051\051\051\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\030\030\030\377\365\365\365\377\377\377\377\377\112\112\112\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\317\317\317\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\361\366\372\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\371\371\371\377\265\265\265\377\113\113\113\377\006\006\006\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\122\122\122\377\377\377\377\377\370\370\370\377\020\020\020\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\034\034\034\377\370\370\370\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\206\257\321\377\220\265\325\377\352\361\367\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\333\333\333\377\170\170\170\377\033\033\033\377\000\000\000\377" + + "\000\000\000\377\226\226\226\377\377\377\377\377\306\306\306\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\132\132\132\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\303\330\351\377\072\175\265\377\103\203\270\377" + + "\224\270\326\377\355\363\370\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\364\364\364\377\247\247\247\377" + + "\205\205\205\377\364\364\364\377\377\377\377\377\206\206\206\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\235\235\235\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\373\375\377\135\224\302\377\072\175\265\377" + + "\072\175\265\377\106\205\271\377\230\273\330\377\357\364\371\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\233\233\233\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\005\005\005\377\335\335\335\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\305\331\351\377\073\176\266\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\110\206\272\377\236\276\332\377\362\366\372\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\373\373\373\377\216\216\216\377\045\045\045\377\001\001\001\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\054\054\054\377\374\374\374\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\217\265\325\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\112\207\273\377\243\302\334\377\363\367\372\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\372\372\377\260\260\260\377\105\105\105\377" + + "\004\004\004\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\156\156\156\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\375\376\377" + + "\205\257\321\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\115\211\274\377" + + "\250\305\336\377\366\371\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\376\376\377" + + "\322\322\322\377\150\150\150\377\016\016\016\377\000\000\000\377\001\001\001\377\270\270\270\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\376\376\377\377\261\313\342\377\114\211\274\377\071\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377" + + "\072\175\265\377\115\211\274\377\277\324\347\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\354\354\354\377\223\223\223\377\233\233\233\377\375\375\375\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\363\367\372\377\265\316\343\377\201\254\320\377\145\231\305\377\141\227\304\377\154\236\310\377" + + "\217\265\325\377\305\331\351\377\367\372\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"; + + /** LWJGL Logo - 16 by 16 pixels */ + public static final ByteBuffer LWJGLIcon16x16 = loadIcon(LWJGL_ICON_DATA_16x16); + + /** LWJGL Logo - 32 by 32 pixels */ + public static final ByteBuffer LWJGLIcon32x32 = loadIcon(LWJGL_ICON_DATA_32x32); + + /** Debug flag. */ + public static final boolean DEBUG = getPrivilegedBoolean("org.lwjgl.util.Debug"); + + public static final boolean CHECKS = !getPrivilegedBoolean("org.lwjgl.util.NoChecks"); + + private static final int PLATFORM; + + static { + final String osName = getPrivilegedProperty("os.name"); + if ( osName.startsWith("Windows") ) + PLATFORM = PLATFORM_WINDOWS; + else if ( osName.startsWith("Linux") || osName.startsWith("FreeBSD") || osName.startsWith("OpenBSD") || osName.startsWith("SunOS") || osName.startsWith("Unix") ) + PLATFORM = PLATFORM_LINUX; + else if ( osName.startsWith("Mac OS X") || osName.startsWith("Darwin") ) + PLATFORM = PLATFORM_MACOSX; + else + throw new LinkageError("Unknown platform: " + osName); + } + + private static ByteBuffer loadIcon(String data) { + int len = data.length(); + ByteBuffer bb = BufferUtils.createByteBuffer(len); + for(int i=0 ; i possible_paths = new ArrayList(); + + String classloader_path = getPathFromClassLoader(libname, classloader); + if (classloader_path != null) { + log("getPathFromClassLoader: Path found: " + classloader_path); + possible_paths.add(classloader_path); + } + + for ( String platform_lib_name : platform_lib_names ) { + String lwjgl_classloader_path = getPathFromClassLoader("lwjgl", classloader); + if ( lwjgl_classloader_path != null ) { + log("getPathFromClassLoader: Path found: " + lwjgl_classloader_path); + possible_paths.add(lwjgl_classloader_path.substring(0, lwjgl_classloader_path.lastIndexOf(File.separator)) + + File.separator + platform_lib_name); + } + + // add Installer path + String alternative_path = getPrivilegedProperty("org.lwjgl.librarypath"); + if ( alternative_path != null ) { + possible_paths.add(alternative_path + File.separator + platform_lib_name); + } + + // Add all possible paths from java.library.path + String java_library_path = getPrivilegedProperty("java.library.path"); + + StringTokenizer st = new StringTokenizer(java_library_path, File.pathSeparator); + while ( st.hasMoreTokens() ) { + String path = st.nextToken(); + possible_paths.add(path + File.separator + platform_lib_name); + } + + //add current path + String current_dir = getPrivilegedProperty("user.dir"); + possible_paths.add(current_dir + File.separator + platform_lib_name); + + //add pure library (no path, let OS search) + possible_paths.add(platform_lib_name); + } + + //create needed string array + return possible_paths.toArray(new String[possible_paths.size()]); + } + + static void execPrivileged(final String[] cmd_array) throws Exception { + try { + Process process = AccessController.doPrivileged(new PrivilegedExceptionAction() { + public Process run() throws Exception { + return Runtime.getRuntime().exec(cmd_array); + } + }); + // Close unused streams to make sure the child process won't hang + process.getInputStream().close(); + process.getOutputStream().close(); + process.getErrorStream().close(); + } catch (PrivilegedActionException e) { + throw (Exception)e.getCause(); + } + } + + private static String getPrivilegedProperty(final String property_name) { + return AccessController.doPrivileged(new PrivilegedAction() { + public String run() { + return System.getProperty(property_name); + } + }); + } + + /** + * Tries to locate named library from the current ClassLoader + * This method exists because native libraries are loaded from native code, and as such + * is exempt from ClassLoader library loading rutines. It therefore always fails. + * We therefore invoke the protected method of the ClassLoader to see if it can + * locate it. + * + * @param libname Name of library to search for + * @param classloader Classloader to use + * @return Absolute path to library if found, otherwise null + */ + private static String getPathFromClassLoader(final String libname, final ClassLoader classloader) { + Class c = null; + + try { + log("getPathFromClassLoader: searching for: " + libname); + c = classloader.getClass(); + while (c != null) { + final Class clazz = c; + try { + return AccessController.doPrivileged(new PrivilegedExceptionAction() { + public String run() throws Exception { + Method findLibrary = clazz.getDeclaredMethod("findLibrary", String.class); + findLibrary.setAccessible(true); + String path = (String)findLibrary.invoke(classloader, libname); + return path; + } + }); + } catch (PrivilegedActionException e) { + log("Failed to locate findLibrary method: " + e.getCause()); + c = c.getSuperclass(); + } + } + } catch (Exception e) { + log("Failure locating " + e + " using classloader:" + c); + } + return null; + } + + /** + * Gets a boolean property as a privileged action. + */ + public static boolean getPrivilegedBoolean(final String property_name) { + return AccessController.doPrivileged(new PrivilegedAction() { + public Boolean run() { + return Boolean.getBoolean(property_name); + } + }); + } + + /** + * Gets an integer property as a privileged action. + * + * @param property_name the integer property name + * + * @return the property value + */ + public static Integer getPrivilegedInteger(final String property_name) { + return AccessController.doPrivileged(new PrivilegedAction() { + public Integer run() { + return Integer.getInteger(property_name); + } + }); + } + + /** + * Gets an integer property as a privileged action. + * + * @param property_name the integer property name + * @param default_val the default value to use if the property is not defined + * + * @return the property value + */ + public static Integer getPrivilegedInteger(final String property_name, final int default_val) { + return AccessController.doPrivileged(new PrivilegedAction() { + public Integer run() { + return Integer.getInteger(property_name, default_val); + } + }); + } + + /** + * @param msg Message to print + */ + public static void log(CharSequence msg) { + if (DEBUG) { + System.err.println("[LWJGL] " + msg); + } + } + + /** + * Method to determine if the current system is running a version of + * Mac OS X better than the given version. This is only useful for Mac OS X + * specific code and will not work for any other platform. + */ + public static boolean isMacOSXEqualsOrBetterThan(int major_required, int minor_required) { + String os_version = getPrivilegedProperty("os.version"); + StringTokenizer version_tokenizer = new StringTokenizer(os_version, "."); + int major; + int minor; + try { + String major_str = version_tokenizer.nextToken(); + String minor_str = version_tokenizer.nextToken(); + major = Integer.parseInt(major_str); + minor = Integer.parseInt(minor_str); + } catch (Exception e) { + LWJGLUtil.log("Exception occurred while trying to determine OS version: " + e); + // Best guess, no + return false; + } + return major > major_required || (major == major_required && minor >= minor_required); + } + + /** + * Returns a map of public static final integer fields in the specified classes, to their String representations. + * An optional filter can be specified to only include specific fields. The target map may be null, in which + * case a new map is allocated and returned. + *

    + * This method is useful when debugging to quickly identify values returned from the AL/GL/CL APIs. + * + * @param filter the filter to use (optional) + * @param target the target map (optional) + * @param tokenClasses an array of classes to get tokens from + * + * @return the token map + */ + + public static Map getClassTokens(final TokenFilter filter, final Map target, final Class ... tokenClasses) { + return getClassTokens(filter, target, Arrays.asList(tokenClasses)); + } + + /** + * Returns a map of public static final integer fields in the specified classes, to their String representations. + * An optional filter can be specified to only include specific fields. The target map may be null, in which + * case a new map is allocated and returned. + *

    + * This method is useful when debugging to quickly identify values returned from the AL/GL/CL APIs. + * + * @param filter the filter to use (optional) + * @param target the target map (optional) + * @param tokenClasses the classes to get tokens from + * + * @return the token map + */ + public static Map getClassTokens(final TokenFilter filter, Map target, final Iterable tokenClasses) { + if ( target == null ) + target = new HashMap(); + + final int TOKEN_MODIFIERS = Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL; + + for ( final Class tokenClass : tokenClasses ) { + for ( final Field field : tokenClass.getDeclaredFields() ) { + // Get only fields. + if ( (field.getModifiers() & TOKEN_MODIFIERS) == TOKEN_MODIFIERS && field.getType() == int.class ) { + try { + final int value = field.getInt(null); + if ( filter != null && !filter.accept(field, value) ) + continue; + + if ( target.containsKey(value) ) // Print colliding tokens in their hex representation. + target.put(value, toHexString(value)); + else + target.put(value, field.getName()); + } catch (IllegalAccessException e) { + // Ignore + } + } + } + } + + return target; + } + + /** + * Returns a string representation of the integer argument as an + * unsigned integer in base 16. The string will be uppercase + * and will have a leading '0x'. + * + * @param value the integer value + * + * @return the hex string representation + */ + public static String toHexString(final int value) { + return "0x" + Integer.toHexString(value).toUpperCase(); + } + + /** Simple interface for Field filtering. */ + public interface TokenFilter { + + /** + * Should return true if the specified Field passes the filter. + * + * @param field the Field to test + * @param value the integer value of the field + * + * @return true if the Field is accepted + */ + boolean accept(Field field, int value); + + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/MemoryUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/MemoryUtil.java new file mode 100644 index 000000000..f54dcf5b8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/MemoryUtil.java @@ -0,0 +1,441 @@ +/* + * Copyright (c) 2002-2011 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; + +import java.lang.reflect.Field; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; +import java.nio.ShortBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CoderResult; + +/** + * [INTERNAL USE ONLY] + *

    + * This class provides utility methods for passing buffers to JNI API calls. + * + * @author Spasi + */ +public final class MemoryUtil { + + private static final Charset ascii; + private static final Charset utf8; + private static final Charset utf16; + + static { + ascii = Charset.forName("ISO-8859-1"); + utf8 = Charset.forName("UTF-8"); + utf16 = Charset.forName("UTF-16LE"); + } + + private static final Accessor memUtil; + + static { + Accessor util; + try { + // Depends on java.nio.Buffer#address and sun.misc.Unsafe + util = loadAccessor("org.lwjgl.MemoryUtilSun$AccessorUnsafe"); + } catch (Exception e0) { + try { + // Depends on java.nio.Buffer#address and sun.reflect.FieldAccessor + util = loadAccessor("org.lwjgl.MemoryUtilSun$AccessorReflectFast"); + } catch (Exception e1) { + try { + // Depends on java.nio.Buffer#address + util = new AccessorReflect(); + } catch (Exception e2) { + LWJGLUtil.log("Unsupported JVM detected, this will likely result in low performance. Please inform LWJGL developers."); + util = new AccessorJNI(); + } + } + } + + LWJGLUtil.log("MemoryUtil Accessor: " + util.getClass().getSimpleName()); + memUtil = util; + + /* + BENCHMARK RESULTS - Oracle Server VM: + + Unsafe: 4ns + ReflectFast: 8ns + Reflect: 10ns + JNI: 82ns + + BENCHMARK RESULTS - Oracle Client VM: + + Unsafe: 5ns + ReflectFast: 81ns + Reflect: 85ns + JNI: 87ns + + On non-Oracle VMs, Unsafe should be the fastest implementation as well. In the absence + of Unsafe, performance will depend on how reflection and JNI are implemented. For now + we'll go with what we see on the Oracle VM (that is, we'll prefer reflection over JNI). + */ + } + + private MemoryUtil() { + } + + /** + * Returns the memory address of the specified buffer. [INTERNAL USE ONLY] + * + * @param buffer the buffer + * + * @return the memory address + */ + public static long getAddress0(Buffer buffer) { return memUtil.getAddress(buffer); } + + public static long getAddress0Safe(Buffer buffer) { return buffer == null ? 0L : memUtil.getAddress(buffer); } + + public static long getAddress0(PointerBuffer buffer) { return memUtil.getAddress(buffer.getBuffer()); } + + public static long getAddress0Safe(PointerBuffer buffer) { return buffer == null ? 0L : memUtil.getAddress(buffer.getBuffer()); } + + // --- [ API utilities ] --- + + public static long getAddress(ByteBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(ByteBuffer buffer, int position) { return getAddress0(buffer) + position; } + + public static long getAddress(ShortBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(ShortBuffer buffer, int position) { return getAddress0(buffer) + (position << 1); } + + public static long getAddress(CharBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(CharBuffer buffer, int position) { return getAddress0(buffer) + (position << 1); } + + public static long getAddress(IntBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(IntBuffer buffer, int position) { return getAddress0(buffer) + (position << 2); } + + public static long getAddress(FloatBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(FloatBuffer buffer, int position) { return getAddress0(buffer) + (position << 2); } + + public static long getAddress(LongBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(LongBuffer buffer, int position) { return getAddress0(buffer) + (position << 3); } + + public static long getAddress(DoubleBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(DoubleBuffer buffer, int position) { return getAddress0(buffer) + (position << 3); } + + public static long getAddress(PointerBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(PointerBuffer buffer, int position) { return getAddress0(buffer) + (position * PointerBuffer.getPointerSize()); } + + // --- [ API utilities - Safe ] --- + + public static long getAddressSafe(ByteBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(ByteBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(ShortBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(ShortBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(CharBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(CharBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(IntBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(IntBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(FloatBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(FloatBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(LongBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(LongBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(DoubleBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(DoubleBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(PointerBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(PointerBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + // --- [ String utilities ] --- + + /** + * Returns a ByteBuffer containing the specified text ASCII encoded and null-terminated. + * If text is null, null is returned. + * + * @param text the text to encode + * + * @return the encoded text or null + * + * @see String#getBytes() + */ + public static ByteBuffer encodeASCII(final CharSequence text) { + return encode(text, ascii); + } + + /** + * Returns a ByteBuffer containing the specified text UTF-8 encoded and null-terminated. + * If text is null, null is returned. + * + * @param text the text to encode + * + * @return the encoded text or null + * + * @see String#getBytes() + */ + public static ByteBuffer encodeUTF8(final CharSequence text) { + return encode(text, utf8); + } + + /** + * Returns a ByteBuffer containing the specified text UTF-16LE encoded and null-terminated. + * If text is null, null is returned. + * + * @param text the text to encode + * + * @return the encoded text + */ + public static ByteBuffer encodeUTF16(final CharSequence text) { + return encode(text, utf16); + } + + /** + * Wraps the specified text in a null-terminated CharBuffer and encodes it using the specified Charset. + * + * @param text the text to encode + * @param charset the charset to use for encoding + * + * @return the encoded text + */ + private static ByteBuffer encode(final CharSequence text, final Charset charset) { + if ( text == null ) + return null; + + return encode(CharBuffer.wrap(new CharSequenceNT(text)), charset); + } + + /** + * A {@link CharsetEncoder#encode(CharBuffer)} implementation that uses {@link BufferUtils#createByteBuffer(int)} + * instead of {@link ByteBuffer#allocate(int)}. + * + * @see CharsetEncoder#encode(CharBuffer) + */ + private static ByteBuffer encode(final CharBuffer in, final Charset charset) { + final CharsetEncoder encoder = charset.newEncoder(); // encoders are not thread-safe, create a new one on every call + + int n = (int)(in.remaining() * encoder.averageBytesPerChar()); + ByteBuffer out = BufferUtils.createByteBuffer(n); + + if ( n == 0 && in.remaining() == 0 ) + return out; + + encoder.reset(); + while ( true ) { + CoderResult cr = in.hasRemaining() ? encoder.encode(in, out, true) : CoderResult.UNDERFLOW; + if ( cr.isUnderflow() ) + cr = encoder.flush(out); + + if ( cr.isUnderflow() ) + break; + + if ( cr.isOverflow() ) { + n = 2 * n + 1; // Ensure progress; n might be 0! + ByteBuffer o = BufferUtils.createByteBuffer(n); + out.flip(); + o.put(out); + out = o; + continue; + } + + try { + cr.throwException(); + } catch (CharacterCodingException e) { + throw new RuntimeException(e); + } + } + out.flip(); + return out; + } + + public static String decodeASCII(final ByteBuffer buffer) { + return decode(buffer, ascii); + } + + public static String decodeUTF8(final ByteBuffer buffer) { + return decode(buffer, utf8); + } + + public static String decodeUTF16(final ByteBuffer buffer) { + return decode(buffer, utf16); + } + + private static String decode(final ByteBuffer buffer, final Charset charset) { + if ( buffer == null ) + return null; + + return decodeImpl(buffer, charset); + } + + private static String decodeImpl(final ByteBuffer in, final Charset charset) { + final CharsetDecoder decoder = charset.newDecoder(); // decoders are not thread-safe, create a new one on every call + + int n = (int)(in.remaining() * decoder.averageCharsPerByte()); + CharBuffer out = BufferUtils.createCharBuffer(n); + + if ( (n == 0) && (in.remaining() == 0) ) + return ""; + + decoder.reset(); + for (; ; ) { + CoderResult cr = in.hasRemaining() ? decoder.decode(in, out, true) : CoderResult.UNDERFLOW; + if ( cr.isUnderflow() ) + cr = decoder.flush(out); + + if ( cr.isUnderflow() ) + break; + if ( cr.isOverflow() ) { + n = 2 * n + 1; // Ensure progress; n might be 0! + CharBuffer o = BufferUtils.createCharBuffer(n); + out.flip(); + o.put(out); + out = o; + continue; + } + try { + cr.throwException(); + } catch (CharacterCodingException e) { + throw new RuntimeException(e); + } + } + out.flip(); + return out.toString(); + } + + /** A null-terminated CharSequence. */ + private static class CharSequenceNT implements CharSequence { + + final CharSequence source; + + CharSequenceNT(CharSequence source) { + this.source = source; + } + + public int length() { + return source.length() + 1; + + } + + public char charAt(final int index) { + return index == source.length() ? '\0' : source.charAt(index); + + } + + public CharSequence subSequence(final int start, final int end) { + return new CharSequenceNT(source.subSequence(start, Math.min(end, source.length()))); + } + + } + + interface Accessor { + + long getAddress(Buffer buffer); + + } + + private static Accessor loadAccessor(final String className) throws Exception { + return (Accessor)Class.forName(className).newInstance(); + } + + /** Default implementation. */ + private static class AccessorJNI implements Accessor { + + public long getAddress(final Buffer buffer) { + return BufferUtils.getBufferAddress(buffer); + } + + } + + /** Implementation using reflection on ByteBuffer. */ + private static class AccessorReflect implements Accessor { + + private final Field address; + + AccessorReflect() { + try { + address = getAddressField(); + } catch (NoSuchFieldException e) { + throw new UnsupportedOperationException(e); + } + address.setAccessible(true); + } + + public long getAddress(final Buffer buffer) { + try { + return address.getLong(buffer); + } catch (IllegalAccessException e) { + // cannot happen + return 0L; + } + } + + } + + static Field getAddressField() throws NoSuchFieldException { + return getDeclaredFieldRecursive(ByteBuffer.class, "address"); + } + + private static Field getDeclaredFieldRecursive(final Class root, final String fieldName) throws NoSuchFieldException { + Class type = root; + + do { + try { + return type.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + type = type.getSuperclass(); + } + } while ( type != null ); + + throw new NoSuchFieldException(fieldName + " does not exist in " + root.getSimpleName() + " or any of its superclasses."); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/PointerBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/PointerBuffer.java new file mode 100644 index 000000000..e95d333b6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/PointerBuffer.java @@ -0,0 +1,804 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl; + +import org.lwjgl.system.*; + +import javax.annotation.*; +import java.nio.*; + +import static org.lwjgl.system.CheckIntrinsics.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** This class is a container for architecture-independent pointer data. Its interface mirrors the {@link LongBuffer} API for convenience. */ +public class PointerBuffer extends CustomBuffer implements Comparable { + + public PointerBuffer(final int capacity) { + this(allocateDirect(capacity)); + } + + public PointerBuffer(final ByteBuffer source) { + this(create(source)); + } + + protected PointerBuffer(PointerBuffer copy) { + this(copy.address0(), copy.container, copy.mark, copy.position, copy.limit, copy.capacity); + } + + /** + * Returns the ByteBuffer that backs this PointerBuffer. + * + * @return the pointer ByteBuffer + */ + public ByteBuffer getBuffer() { + return container; + } + + /** Returns true if the underlying architecture is 64bit. */ + public static boolean is64Bit() { + return POINTER_SIZE == 8; + } + + /** + * Returns the pointer size in bytes, based on the underlying architecture. + * + * @return The pointer size in bytes + */ + public static int getPointerSize() { + return POINTER_SIZE; + } + + /** + * Returns this buffer's position, in bytes.

    + * + * @return The position of this buffer in bytes. + */ + public final int positionByte() { + return position() * getPointerSize(); + } + + /** + * Returns the number of bytes between the current position and the + * limit.

    + * + * @return The number of bytes remaining in this buffer + */ + public final int remainingByte() { + return remaining() * getPointerSize(); + } + + /** + * Creates a new, read-only pointer buffer that shares this buffer's + * content. + *

    + *

    The content of the new buffer will be that of this buffer. Changes + * to this buffer's content will be visible in the new buffer; the new + * buffer itself, however, will be read-only and will not allow the shared + * content to be modified. The two buffers' position, limit, and mark + * values will be independent. + *

    + *

    The new buffer's capacity, limit and position will be + * identical to those of this buffer. + *

    + *

    If this buffer is itself read-only then this method behaves in + * exactly the same way as the {@link #duplicate duplicate} method.

    + * + * @return The new, read-only pointer buffer + */ + public PointerBuffer asReadOnlyBuffer() { + final PointerBuffer buffer = new PointerBufferR(container); + + buffer.position(position()); + buffer.limit(limit()); + + return buffer; + } + + public boolean isReadOnly() { + return false; + } + + /** + * Read-only version of PointerBuffer. + * + * @author Spasi + */ + private static final class PointerBufferR extends PointerBuffer { + + PointerBufferR(final ByteBuffer source) { + super(source); + } + + public boolean isReadOnly() { + return true; + } + + protected PointerBuffer newInstance(final ByteBuffer source) { + return new PointerBufferR(source); + } + + public PointerBuffer asReadOnlyBuffer() { + return duplicate(); + } + + public PointerBuffer put(final long l) { + throw new ReadOnlyBufferException(); + } + + public PointerBuffer put(final int index, final long l) { + throw new ReadOnlyBufferException(); + } + + public PointerBuffer put(final PointerBuffer src) { + throw new ReadOnlyBufferException(); + } + + public PointerBuffer put(final long[] src, final int offset, final int length) { + throw new ReadOnlyBufferException(); + } + + public PointerBuffer compact() { + throw new ReadOnlyBufferException(); + } + + } + + protected PointerBuffer(long address, @Nullable ByteBuffer container, int mark, int position, int limit, int capacity) { + super(address, container, mark, position, limit, capacity); + } + + /** + * Allocates a new pointer buffer. + * + *

    The new buffer's position will be zero, its limit will be its capacity, and its mark will be undefined.

    + * + * @param capacity the new buffer's capacity, in pointers + * + * @return the new pointer buffer + * + * @throws IllegalArgumentException If the {@code capacity} is a negative integer + */ + public static PointerBuffer allocateDirect(int capacity) { + ByteBuffer source = BufferUtils.createByteBuffer(BufferUtils.getAllocationSize(capacity, POINTER_SHIFT)); + return new PointerBuffer(memAddress(source), source, -1, 0, capacity, capacity); + } + + /** + * Creates a new PointerBuffer that starts at the specified memory address and has the specified capacity. + * + * @param address the starting memory address + * @param capacity the buffer capacity, in number of pointers + */ + public static PointerBuffer create(long address, int capacity) { + return new PointerBuffer(address, null, -1, 0, capacity, capacity); + } + + /** + * Creates a new PointerBuffer using the specified ByteBuffer as its pointer data source. + * + * @param source the source buffer + */ + public static PointerBuffer create(ByteBuffer source) { + int capacity = source.remaining() >> POINTER_SHIFT; + return new PointerBuffer(memAddress(source), source, -1, 0, capacity, capacity); + } + + @Override + protected PointerBuffer self() { + return this; + } + + @Override + public int sizeof() { + return POINTER_SIZE; + } + + /** + * Relative get method. Reads the pointer at this buffer's current position, and then increments the position. + * + * @return the pointer at the buffer's current position + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public long get() { + return memGetAddress(address + Integer.toUnsignedLong(nextGetIndex()) * POINTER_SIZE); + } + + /** + * Convenience relative get from a source ByteBuffer. + * + * @param source the source ByteBuffer + */ + public static long get(ByteBuffer source) { + if (source.remaining() < POINTER_SIZE) { + throw new BufferUnderflowException(); + } + + try { + return memGetAddress(memAddress(source)); + } finally { + source.position(source.position() + POINTER_SIZE); + } + } + + /** + * Relative put method  (optional operation). + * + *

    Writes the specified pointer into this buffer at the current position, and then increments the position.

    + * + * @param p the pointer to be written + * + * @return This buffer + * + * @throws BufferOverflowException If this buffer's current position is not smaller than its limit + */ + public PointerBuffer put(long p) { + memPutAddress(address + Integer.toUnsignedLong(nextPutIndex()) * POINTER_SIZE, p); + return this; + } + + /** + * Convenience relative put on a target ByteBuffer. + * + * @param target the target ByteBuffer + * @param p the pointer value to be written + */ + public static void put(ByteBuffer target, long p) { + if (target.remaining() < POINTER_SIZE) { + throw new BufferOverflowException(); + } + + try { + memPutAddress(memAddress(target), p); + } finally { + target.position(target.position() + POINTER_SIZE); + } + } + + /** + * Absolute get method. Reads the pointer at the specified {@code index}. + * + * @param index the index from which the pointer will be read + * + * @return the pointer at the specified {@code index} + * + * @throws IndexOutOfBoundsException If {@code index} is negative or not smaller than the buffer's limit + */ + public long get(int index) { + return memGetAddress(address + check(index, limit) * POINTER_SIZE); + } + + /** + * Convenience absolute get from a source ByteBuffer. + * + * @param source the source ByteBuffer + * @param index the index at which the pointer will be read + */ + public static long get(ByteBuffer source, int index) { + checkFromIndexSize(index, POINTER_SIZE, source.limit()); + return memGetAddress(memAddress0(source) + index); + } + + /** + * Absolute put method  (optional operation). + * + *

    Writes the specified pointer into this buffer at the specified {@code index}.

    + * + * @param index the index at which the pointer will be written + * @param p the pointer value to be written + * + * @return This buffer + * + * @throws IndexOutOfBoundsException If {@code index} is negative or not smaller than the buffer's limit + */ + public PointerBuffer put(int index, long p) { + memPutAddress(address + check(index, limit) * POINTER_SIZE, p); + return this; + } + + /** + * Convenience absolute put on a target ByteBuffer. + * + * @param target the target ByteBuffer + * @param index the index at which the pointer will be written + * @param p the pointer value to be written + */ + public static void put(ByteBuffer target, int index, long p) { + checkFromIndexSize(index, POINTER_SIZE, target.limit()); + memPutAddress(memAddress0(target) + index, p); + } + + // -- PointerWrapper operations -- + + /** Puts the pointer value of the specified {@link Pointer} at the current position and then increments the position. */ + public PointerBuffer put(Pointer pointer) { + put(pointer.address()); + return this; + } + + /** Puts the pointer value of the specified {@link Pointer} at the specified {@code index}. */ + public PointerBuffer put(int index, Pointer pointer) { + put(index, pointer.address()); + return this; + } + + // -- Buffer address operations -- + + /** + *

    Writes the address of the specified {@code buffer} into this buffer at the current position, and then increments the position.

    + * + * @param buffer the pointer to be written + * + * @return this buffer + * + * @throws BufferOverflowException If this buffer's current position is not smaller than its limit + */ + public PointerBuffer put(ByteBuffer buffer) { + put(memAddress(buffer)); + return this; + } + + /** + *

    Writes the address of the specified {@code buffer} into this buffer at the current position, and then increments the position.

    + * + * @param buffer the pointer to be written + * + * @return this buffer + * + * @throws BufferOverflowException If this buffer's current position is not smaller than its limit + */ + public PointerBuffer put(ShortBuffer buffer) { + put(memAddress(buffer)); + return this; + } + + /** + *

    Writes the address of the specified {@code buffer} into this buffer at the current position, and then increments the position.

    + * + * @param buffer the pointer to be written + * + * @return this buffer + * + * @throws BufferOverflowException If this buffer's current position is not smaller than its limit + */ + public PointerBuffer put(IntBuffer buffer) { + put(memAddress(buffer)); + return this; + } + + /** + *

    Writes the address of the specified {@code buffer} into this buffer at the current position, and then increments the position.

    + * + * @param buffer the pointer to be written + * + * @return this buffer + * + * @throws BufferOverflowException If this buffer's current position is not smaller than its limit + */ + public PointerBuffer put(LongBuffer buffer) { + put(memAddress(buffer)); + return this; + } + + /** + *

    Writes the address of the specified {@code buffer} into this buffer at the current position, and then increments the position.

    + * + * @param buffer the pointer to be written + * + * @return this buffer + * + * @throws BufferOverflowException If this buffer's current position is not smaller than its limit + */ + public PointerBuffer put(FloatBuffer buffer) { + put(memAddress(buffer)); + return this; + } + + /** + *

    Writes the address of the specified {@code buffer} into this buffer at the current position, and then increments the position.

    + * + * @param buffer the pointer to be written + * + * @return this buffer + * + * @throws BufferOverflowException If this buffer's current position is not smaller than its limit + */ + public PointerBuffer put(DoubleBuffer buffer) { + put(memAddress(buffer)); + return this; + } + + /** + *

    Writes the address of the specified {@code buffer} into this buffer at the current position, and then increments the position.

    + * + * @param buffer the pointer to be written + * + * @return this buffer + * + * @throws BufferOverflowException If this buffer's current position is not smaller than its limit + */ + public PointerBuffer putAddressOf(CustomBuffer buffer) { + put(memAddress(buffer)); + return this; + } + + // --- + + /** Puts the address of the specified {@code buffer} at the specified {@code index}. */ + public PointerBuffer put(int index, ByteBuffer buffer) { + put(index, memAddress(buffer)); + return this; + } + + /** Puts the address of the specified {@code buffer} at the specified {@code index}. */ + public PointerBuffer put(int index, ShortBuffer buffer) { + put(index, memAddress(buffer)); + return this; + } + + /** Puts the address of the specified {@code buffer} at the specified {@code index}. */ + public PointerBuffer put(int index, IntBuffer buffer) { + put(index, memAddress(buffer)); + return this; + } + + /** Puts the address of the specified {@code buffer} at the specified {@code index}. */ + public PointerBuffer put(int index, LongBuffer buffer) { + put(index, memAddress(buffer)); + return this; + } + + /** Puts the address of the specified {@code buffer} at the specified {@code index}. */ + public PointerBuffer put(int index, FloatBuffer buffer) { + put(index, memAddress(buffer)); + return this; + } + + /** Puts the address of the specified {@code buffer} at the specified {@code index}. */ + public PointerBuffer put(int index, DoubleBuffer buffer) { + put(index, memAddress(buffer)); + return this; + } + + /** Puts the address of the specified {@code buffer} at the specified {@code index}. */ + public PointerBuffer putAddressOf(int index, CustomBuffer buffer) { + put(index, memAddress(buffer)); + return this; + } + + // --- + + /** + * Reads the pointer at this buffer's current position, and then increments the position. The pointer is returned as a {@link ByteBuffer} instance that + * starts at the pointer address and has capacity equal to the specified {@code size}. + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public ByteBuffer getByteBuffer(int size) { return memByteBuffer(get(), size); } + + /** + * Reads the pointer at this buffer's current position, and then increments the position. The pointer is returned as a {@link ShortBuffer} instance that + * starts at the pointer address and has capacity equal to the specified {@code size}. + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public ShortBuffer getShortBuffer(int size) { return memShortBuffer(get(), size); } + + /** + * Reads the pointer at this buffer's current position, and then increments the position. The pointer is returned as a {@link IntBuffer} instance that + * starts at the pointer address and has capacity equal to the specified {@code size}. + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public IntBuffer getIntBuffer(int size) { return memIntBuffer(get(), size); } + + /** + * Reads the pointer at this buffer's current position, and then increments the position. The pointer is returned as a {@link LongBuffer} instance that + * starts at the pointer address and has capacity equal to the specified {@code size}. + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public LongBuffer getLongBuffer(int size) { return memLongBuffer(get(), size); } + + /** + * Reads the pointer at this buffer's current position, and then increments the position. The pointer is returned as a {@link FloatBuffer} instance that + * starts at the pointer address and has capacity equal to the specified {@code size}. + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public FloatBuffer getFloatBuffer(int size) { return memFloatBuffer(get(), size); } + + /** + * Reads the pointer at this buffer's current position, and then increments the position. The pointer is returned as a {@link DoubleBuffer} instance that + * starts at the pointer address and has capacity equal to the specified {@code size}. + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public DoubleBuffer getDoubleBuffer(int size) { return memDoubleBuffer(get(), size); } + + /** + * Reads the pointer at this buffer's current position, and then increments the position. The pointer is returned as a {@code PointerBuffer} instance that + * starts at the pointer address and has capacity equal to the specified {@code size}. + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public PointerBuffer getPointerBuffer(int size) { return memPointerBuffer(get(), size); } + + /** + * Reads the pointer at this buffer's current position, and then increments the position. The pointer is evaluated as a null-terminated ASCII string, which + * is decoded and returned as a {@link String} instance. + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public String getStringASCII() { return memASCII(get()); } + + /** + * Reads the pointer at this buffer's current position, and then increments the position. The pointer is evaluated as a null-terminated UTF-8 string, which + * is decoded and returned as a {@link String} instance. + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public String getStringUTF8() { return memUTF8(get()); } + + /** + * Reads the pointer at this buffer's current position, and then increments the position. The pointer is evaluated as a null-terminated UTF-16 string, + * which is decoded and returned as a {@link String} instance. + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public String getStringUTF16() { return memUTF16(get()); } + + // --- + + /** Returns a {@link ByteBuffer} instance that starts at the address found at the specified {@code index} and has capacity equal to the specified size. */ + public ByteBuffer getByteBuffer(int index, int size) { return memByteBuffer(get(index), size); } + + /** Returns a {@link ShortBuffer} instance that starts at the address found at the specified {@code index} and has capacity equal to the specified size. */ + public ShortBuffer getShortBuffer(int index, int size) { return memShortBuffer(get(index), size); } + + /** Returns a {@link IntBuffer} instance that starts at the address found at the specified {@code index} and has capacity equal to the specified size. */ + public IntBuffer getIntBuffer(int index, int size) { return memIntBuffer(get(index), size); } + + /** Returns a {@link LongBuffer} instance that starts at the address found at the specified {@code index} and has capacity equal to the specified size. */ + public LongBuffer getLongBuffer(int index, int size) { return memLongBuffer(get(index), size); } + + /** Returns a {@link FloatBuffer} instance that starts at the address found at the specified {@code index} and has capacity equal to the specified size. */ + public FloatBuffer getFloatBuffer(int index, int size) { return memFloatBuffer(get(index), size); } + + /** Returns a {@link DoubleBuffer} instance that starts at the address found at the specified {@code index} and has capacity equal to the specified size. */ + public DoubleBuffer getDoubleBuffer(int index, int size) { return memDoubleBuffer(get(index), size); } + + /** Returns a {@code PointerBuffer} instance that starts at the address found at the specified {@code index} and has capacity equal to the specified size. */ + public PointerBuffer getPointerBuffer(int index, int size) { return memPointerBuffer(get(index), size); } + + /** Decodes the ASCII string that starts at the address found at the specified {@code index}. */ + public String getStringASCII(int index) { return memASCII(get(index)); } + + /** Decodes the UTF-8 string that starts at the address found at the specified {@code index}. */ + public String getStringUTF8(int index) { return memUTF8(get(index)); } + + /** Decodes the UTF-16 string that starts at the address found at the specified {@code index}. */ + public String getStringUTF16(int index) { return memUTF16(get(index)); } + + // -- Bulk get operations -- + + /** + * Relative bulk get method. + * + *

    This method transfers pointers from this buffer into the specified destination array. An invocation of this method of the form {@code src.get(a)} + * behaves in exactly the same way as the invocation + * + *

    +     *     src.get(a, 0, a.length) 
    + * + * @return This buffer + * + * @throws BufferUnderflowException If there are fewer than {@code length} pointers remaining in this buffer + */ + public PointerBuffer get(long[] dst) { + return get(dst, 0, dst.length); + } + + /** + * Relative bulk get method. + * + *

    This method transfers pointers from this buffer into the specified destination array. If there are fewer pointers remaining in the buffer than are + * required to satisfy the request, that is, if {@code length} {@code >} {@code remaining()}, then no pointers are transferred and a + * {@link BufferUnderflowException} is thrown. + * + *

    Otherwise, this method copies {@code length} pointers from this buffer into the specified array, starting at the current position of this buffer and + * at the specified offset in the array. The position of this buffer is then incremented by {@code length}. + * + *

    In other words, an invocation of this method of the form {@code src.get(dst, off, len)} has exactly the same effect as the loop

    + * + *
    +     *     for (int i = off; i < off + len; i++)
    +     *         dst[i] = src.get(); 
    + * + *

    except that it first checks that there are sufficient pointers in this buffer and it is potentially much more efficient.

    + * + * @param dst the array into which pointers are to be written + * @param offset the offset within the array of the first pointer to be written; must be non-negative and no larger than {@code dst.length} + * @param length the maximum number of pointers to be written to the specified array; must be non-negative and no larger than {@code dst.length - offset} + * + * @return This buffer + * + * @throws BufferUnderflowException If there are fewer than {@code length} pointers remaining in this buffer + * @throws IndexOutOfBoundsException If the preconditions on the {@code offset} and {@code length} parameters do not hold + */ + public PointerBuffer get(long[] dst, int offset, int length) { + if (BITS64) { + memLongBuffer(address(), remaining()).get(dst, offset, length); + position(position() + length); + } else { + get32(dst, offset, length); + } + + return this; + } + + private void get32(long[] dst, int offset, int length) { + checkFromIndexSize(offset, length, dst.length); + if (remaining() < length) { + throw new BufferUnderflowException(); + } + for (int i = offset, end = offset + length; i < end; i++) { + dst[i] = get(); + } + } + + /** + * Relative bulk put method  (optional operation). + * + *

    This method transfers the entire content of the specified source pointer array into this buffer. An invocation of this method of the form + * {@code dst.put(a)} behaves in exactly the same way as the invocation

    + * + *
    +     *     dst.put(a, 0, a.length) 
    + * + * @return This buffer + * + * @throws BufferOverflowException If there is insufficient space in this buffer + */ + public PointerBuffer put(long[] src) { + return put(src, 0, src.length); + } + + /** + * Relative bulk put method  (optional operation). + * + *

    This method transfers pointers into this buffer from the specified source array. If there are more pointers to be copied from the array than remain + * in this buffer, that is, if {@code length} {@code >} {@code remaining()}, then no pointers are transferred and a + * {@link BufferOverflowException} is thrown. + * + *

    Otherwise, this method copies {@code length} pointers from the specified array into this buffer, starting at the specified offset in the array and + * at the current position of this buffer. The position of this buffer is then incremented by {@code length}.

    + * + *

    In other words, an invocation of this method of the form {@code dst.put(src, off, len)} has exactly the same effect as the loop

    + * + *
    +     *     for (int i = off; i < off + len; i++)
    +     *         dst.put(a[i]); 
    + * + *

    except that it first checks that there is sufficient space in this buffer and it is potentially much more efficient.

    + * + * @param src the array from which pointers are to be read + * @param offset the offset within the array of the first pointer to be read; must be non-negative and no larger than {@code array.length} + * @param length the number of pointers to be read from the specified array; must be non-negative and no larger than {@code array.length - offset} + * + * @return This buffer + * + * @throws BufferOverflowException If there is insufficient space in this buffer + * @throws IndexOutOfBoundsException If the preconditions on the {@code offset} and {@code length} parameters do not hold + */ + public PointerBuffer put(long[] src, int offset, int length) { + if (BITS64) { + memLongBuffer(address(), remaining()).put(src, offset, length); + position(position() + length); + } else { + put32(src, offset, length); + } + + return this; + } + + private void put32(long[] src, int offset, int length) { + checkFromIndexSize(offset, length, src.length); + if (remaining() < length) { + throw new BufferOverflowException(); + } + int end = offset + length; + for (int i = offset; i < end; i++) { + put(src[i]); + } + } + + /** + * Returns the current hash code of this buffer. + * + *

    The hash code of a pointer buffer depends only upon its remaining elements; that is, upon the elements from {@code position()} up to, and including, + * the element at {@code limit()} - {@code 1}.

    + * + *

    Because buffer hash codes are content-dependent, it is inadvisable to use buffers as keys in hash maps or similar data structures unless it is known + * that their contents will not change.

    + * + * @return the current hash code of this buffer + */ + public int hashCode() { + int h = 1; + int p = position(); + for (int i = limit() - 1; i >= p; i--) { + h = 31 * h + (int)get(i); + } + return h; + } + + /** + * Tells whether or not this buffer is equal to another object. + * + *

    Two pointer buffers are equal if, and only if,

    + * + *
      + *
    1. They have the same element type,
    2. + *
    3. They have the same number of remaining elements, and
    4. + *
    5. The two sequences of remaining elements, considered + * independently of their starting positions, are pointwise equal.
    6. + *
    + * + *

    A pointer buffer is not equal to any other type of object.

    + * + * @param ob the object to which this buffer is to be compared + * + * @return {@code true} if, and only if, this buffer is equal to the + * given object + */ + public boolean equals(Object ob) { + if (!(ob instanceof PointerBuffer)) { + return false; + } + PointerBuffer that = (PointerBuffer)ob; + if (this.remaining() != that.remaining()) { + return false; + } + int p = this.position(); + for (int i = this.limit() - 1, j = that.limit() - 1; i >= p; i--, j--) { + long v1 = this.get(i); + long v2 = that.get(j); + if (v1 != v2) { + return false; + } + } + return true; + } + + /** + * Compares this buffer to another. + * + *

    Two pointer buffers are compared by comparing their sequences of remaining elements lexicographically, without regard to the starting position of + * each sequence within its corresponding buffer.

    + * + *

    A pointer buffer is not comparable to any other type of object.

    + * + * @return A negative integer, zero, or a positive integer as this buffer is less than, equal to, or greater than the specified buffer + */ + @Override + public int compareTo(PointerBuffer that) { + int n = this.position() + Math.min(this.remaining(), that.remaining()); + for (int i = this.position(), j = that.position(); i < n; i++, j++) { + long v1 = this.get(i); + long v2 = that.get(j); + if (v1 == v2) { + continue; + } + if (v1 < v2) { + return -1; + } + return +1; + } + return this.remaining() - that.remaining(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/PointerWrapper.java b/LWJGL-Boat/src/main/java/org/lwjgl/PointerWrapper.java new file mode 100644 index 000000000..25bad96c1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/PointerWrapper.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2008 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; + +/** + * A common interface for classes that wrap pointer addresses. + * + * @author Spasi + */ +public interface PointerWrapper { + + long getPointer(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/PointerWrapperAbstract.java b/LWJGL-Boat/src/main/java/org/lwjgl/PointerWrapperAbstract.java new file mode 100644 index 000000000..972fb49f7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/PointerWrapperAbstract.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2002-2010 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; + +/** + * Base PointerWrapper implementation. + * + * @author Spasi + */ +public abstract class PointerWrapperAbstract implements PointerWrapper { + + protected final long pointer; + + protected PointerWrapperAbstract(final long pointer) { + this.pointer = pointer; + } + + /** + * Returns true if this object represents a valid pointer. + * The pointer might be invalid because it is NULL or because + * some other action has deleted the object that this pointer + * represents. + * + * @return true if the pointer is valid + */ + public boolean isValid() { + return pointer != 0; + } + + /** + * Checks if the pointer is valid and throws an IllegalStateException if + * it is not. This method is a NO-OP, unless the org.lwjgl.util.Debug + * property has been set to true. + */ + public final void checkValid() { + if ( LWJGLUtil.DEBUG && !isValid() ) + throw new IllegalStateException("This " + getClass().getSimpleName() + " pointer is not valid."); + } + + public final long getPointer() { + checkValid(); + return pointer; + } + + public boolean equals(final Object o) { + if ( this == o ) return true; + if ( !(o instanceof PointerWrapperAbstract) ) return false; + + final PointerWrapperAbstract that = (PointerWrapperAbstract)o; + + if ( pointer != that.pointer ) return false; + + return true; + } + + public int hashCode() { + return (int)(pointer ^ (pointer >>> 32)); + } + + public String toString() { + return getClass().getSimpleName() + " pointer (0x" + Long.toHexString(pointer).toUpperCase() + ")"; + } +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/Sys.java b/LWJGL-Boat/src/main/java/org/lwjgl/Sys.java new file mode 100644 index 000000000..c21b46dbc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/Sys.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2002-2008 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; + +import org.lwjgl.glfw.GLFW; + +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.AccessController; +import java.security.PrivilegedExceptionAction; + +import javax.swing.JOptionPane; +import javax.swing.UIManager; + +/** + *

    + * System class (named Sys so as not to conflict with java.lang.System) + *

    + * @author cix_foo + * @version $Revision$ + * $Id$ + */ +public final class Sys { + + /** + * No constructor for Sys. + */ + private Sys() { + } + + /** + * Return the version of the core LWJGL libraries as a String. + */ + public static String getVersion() { + return Version.getVersion(); + } + + /** + * Initialization. This is just a dummy method to trigger the static constructor. + */ + public static void initialize() { + if (!GLFW.glfwInit()) + throw new IllegalStateException("Unable to initialize GLFW"); + } + + /** + * Obtains the number of ticks that the hires timer does in a second. This method is fast; + * it should be called as frequently as possible, as it recalibrates the timer. + * + * @return timer resolution in ticks per second or 0 if no timer is present. + */ + public static long getTimerResolution() { + return 1000; + } + + /** + * Gets the current value of the hires timer, in ticks. When the Sys class is first loaded + * the hires timer is reset to 0. If no hires timer is present then this method will always + * return 0.

    NOTEZ BIEN that the hires timer WILL wrap around. + * + * @return the current hires time, in ticks (always >= 0) + */ + public static long getTime() { + return GLFW.glfwGetTimerValue(); + } + + public static long getNanoTime() { + return System.nanoTime(); + } + + /** + * Attempt to display a modal alert to the user. This method should be used + * when a game fails to initialize properly or crashes out losing its display + * in the process. It is provided because AWT may not be available on the target + * platform, although on Mac and Linux and other platforms supporting AWT we + * delegate the task to AWT instead of doing it ourselves. + *

    + * The alert should display the title and the message and then the current + * thread should block until the user dismisses the alert - typically with an + * OK button click. + *

    + * It may be that the user's system has no windowing system installed for some + * reason, in which case this method may do nothing at all, or attempt to provide + * some console output. + * + * @param title The title of the alert. We suggest using the title of your game. + * @param message The message text for the alert. + */ + public static void alert(String title, String message) { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception e) { + LWJGLUtil.log("Caught exception while setting Look-and-Feel: " + e); + } + JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE); + } + + /** + * Open the system web browser and point it at the specified URL. It is recommended + * that this not be called whilst your game is running, but on application exit in + * a shutdown hook, as the screen resolution will not be reset when the browser is + * brought into view. + *

    + * There is no guarantee that this will work, nor that we can detect if it has + * failed - hence we don't return success code or throw an Exception. This is just a + * best attempt at opening the URL given - don't rely on it to work! + *

    + * @param url The URL. Ensure that the URL is properly encoded. + * @return false if we are CERTAIN the call has failed + */ + public static boolean openURL(String url) { + // Attempt to use Webstart if we have it available + try { + // Lookup the javax.jnlp.BasicService object + final Class serviceManagerClass = Class.forName("javax.jnlp.ServiceManager"); + Method lookupMethod = AccessController.doPrivileged(new PrivilegedExceptionAction() { + public Method run() throws Exception { + return serviceManagerClass.getMethod("lookup", String.class); + } + }); + Object basicService = lookupMethod.invoke(serviceManagerClass, new Object[] {"javax.jnlp.BasicService"}); + final Class basicServiceClass = Class.forName("javax.jnlp.BasicService"); + Method showDocumentMethod = AccessController.doPrivileged(new PrivilegedExceptionAction() { + public Method run() throws Exception { + return basicServiceClass.getMethod("showDocument", URL.class); + } + }); + try { + Boolean ret = (Boolean) showDocumentMethod.invoke(basicService, new URL(url)); + return ret; + } catch (MalformedURLException e) { + e.printStackTrace(System.err); + return false; + } + } catch (Exception ue) { + return false; + } + } + + /** + * Get the contents of the system clipboard. The system might not have a + * clipboard (particularly if it doesn't even have a keyboard) in which case + * we return null. Otherwise we return a String, which may be the empty + * string "". + * + * @return a String, or null if there is no system clipboard. + */ + public static String getClipboard() { + return GLFW.glfwGetClipboardString(GLFW.glfwGetPrimaryMonitor()); + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/Version.java b/LWJGL-Boat/src/main/java/org/lwjgl/Version.java new file mode 100644 index 000000000..479162871 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/Version.java @@ -0,0 +1,127 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl; + +import javax.annotation.*; +import java.io.*; +import java.net.*; +import java.util.*; +import java.util.jar.*; + +/** This class can be used to query the LWJGL version. */ +public final class Version { + + /** Current version of library. */ + public static final int + VERSION_MAJOR = 3, + VERSION_MINOR = 3, + VERSION_REVISION = 3; + + /** The development state of the current build. */ + public static final BuildType BUILD_TYPE = BuildType.STABLE; + + private static final String versionPlain = + String.valueOf(VERSION_MAJOR) + + '.' + VERSION_MINOR + + '.' + VERSION_REVISION + BUILD_TYPE.postfix; + + private static final String version = versionPlain + VersionImpl.find(); + + private Version() { + } + + public static void main(String[] args) { + System.out.println(version); + System.err.println(versionPlain); + } + + /** Returns the LWJGL version. */ + public static String getVersion() { + return version; + } + + /** The development state of the current build. */ + public enum BuildType { + /** Work in progress, unstable. */ + ALPHA("a"), + /** Feature complete, unstable. */ + BETA("b"), + /** Feature complete, stable, official release. */ + STABLE(""); + + public final String postfix; + + BuildType(String postfix) { + this.postfix = postfix; + } + } + + static String createImplementation(String specVersion, String implVersion) { + String build = "+" + (implVersion.startsWith("build ") && 6 < implVersion.length() ? implVersion.substring(6) : implVersion); + + if (specVersion.contains("SNAPSHOT") || specVersion.contains("snapshot")) { + return "-snapshot" + build; + } + + return build; + } + + @Nullable + static String findImplementationFromManifest() { + ClassLoader classLoader = Version.class.getClassLoader(); + + URL url = classLoader.getResource("org/lwjgl/Version.class"); + if (url != null) { + String classURL = url.toString(); + try { + if (classURL.startsWith("jar:")) { // running on standard JDK + URL manifest = Version.class.getResource("/" + JarFile.MANIFEST_NAME); + + String version = readImplementationFromManifest(Objects.requireNonNull(manifest)); + if (version != null) { + return version; + } + } else if (classURL.startsWith("resource:")) { // running on GraalVM native image + Enumeration e = classLoader.getResources(JarFile.MANIFEST_NAME); + while (e.hasMoreElements()) { + String version = readImplementationFromManifest(e.nextElement()); + if (version != null) { + return version; + } + } + } + } catch (Exception ignored) { + } + } + + return null; + } + + @Nullable + private static String readImplementationFromManifest(URL url) { + try (InputStream stream = url.openStream()) { + Attributes attribs = new Manifest(stream).getMainAttributes(); + + // make sure this is the manifest from lwjgl.jar + if (!"lwjgl".equals(attribs.getValue(Attributes.Name.IMPLEMENTATION_TITLE))) { + return null; + } + if (!"lwjgl.org".equals(attribs.getValue(Attributes.Name.IMPLEMENTATION_VENDOR))) { + return null; + } + + String specVersion = attribs.getValue(Attributes.Name.SPECIFICATION_VERSION); + String implVersion = attribs.getValue(Attributes.Name.IMPLEMENTATION_VERSION); + if (specVersion == null || implVersion == null) { + return null; + } + + return createImplementation(specVersion, implVersion); + } catch (Exception ignored) { + return null; + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/VersionImpl.java b/LWJGL-Boat/src/main/java/org/lwjgl/VersionImpl.java new file mode 100644 index 000000000..82154a06a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/VersionImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl; + +/** + * Finds the LWJGL implementation version (build type/number). + * + *

    Base implementation for Java 8. When run in the module path, it cannot find the implementation version without reading the JAR manifest. See the + * {@code lwjgl.core9} module for the module-aware implementation.

    + */ +final class VersionImpl { + + static String find() { + Package org_lwjgl = Version.class.getPackage(); + + String specVersion = org_lwjgl.getSpecificationVersion(); + String implVersion = org_lwjgl.getImplementationVersion(); + if (specVersion != null && implVersion != null) { + return Version.createImplementation(specVersion, implVersion); + } + + String version = Version.findImplementationFromManifest(); + if (version != null) { + return version; + } + + return "-snapshot"; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/Callbacks.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/Callbacks.java new file mode 100644 index 000000000..375d896f3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/Callbacks.java @@ -0,0 +1,60 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Utility class for GLFW callbacks. */ +public final class Callbacks { + + private Callbacks() {} + + /** + * Resets all callbacks for the specified GLFW window to {@code NULL} and {@link Callback#free frees} all previously set callbacks. + * + *

    This method resets only callbacks registered with a GLFW window. Non-window callbacks (registered with + * {@link GLFW#glfwSetErrorCallback SetErrorCallback}, {@link GLFW#glfwSetMonitorCallback SetMonitorCallback}, etc.) must be reset and freed + * separately.

    + * + *

    This method is not official GLFW API. It exists in LWJGL to simplify window callback cleanup.

    + * + * @param window the GLFW window + */ + public static void glfwFreeCallbacks(@NativeType("GLFWwindow *") long window) { + if (Checks.CHECKS) { + check(window); + } + + for (long callback : new long[] { + GLFW.Functions.SetWindowPosCallback, + GLFW.Functions.SetWindowSizeCallback, + GLFW.Functions.SetWindowCloseCallback, + GLFW.Functions.SetWindowRefreshCallback, + GLFW.Functions.SetWindowFocusCallback, + GLFW.Functions.SetWindowIconifyCallback, + GLFW.Functions.SetWindowMaximizeCallback, + GLFW.Functions.SetFramebufferSizeCallback, + GLFW.Functions.SetWindowContentScaleCallback, + GLFW.Functions.SetKeyCallback, + GLFW.Functions.SetCharCallback, + GLFW.Functions.SetCharModsCallback, + GLFW.Functions.SetMouseButtonCallback, + GLFW.Functions.SetCursorPosCallback, + GLFW.Functions.SetCursorEnterCallback, + GLFW.Functions.SetScrollCallback, + GLFW.Functions.SetDropCallback + }) { + long prevCB = invokePPP(window, NULL, callback); + if (prevCB != NULL) { + Callback.free(prevCB); + } + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/EventLoop.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/EventLoop.java new file mode 100644 index 000000000..cca6be2e6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/EventLoop.java @@ -0,0 +1,58 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.macosx.*; + +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.macosx.LibC.*; +import static org.lwjgl.system.macosx.ObjCRuntime.*; + +/** + * Contains checks for the event loop issues on OS X. + * + *

    GLFW can only be used on the main thread and only if that thread is the first thread in the process. This requires running the JVM with + * {@code -XstartOnFirstThread}, which means that other window toolkits (AWT/Swing, JavaFX, etc.) cannot be used at the same time.

    + * + *

    Another window toolkit can be used if GLFW windows are never shown (created with {@link GLFW#GLFW_VISIBLE GLFW_VISIBLE} equal to + * {@link GLFW#GLFW_FALSE GLFW_FALSE}) and only used as contexts for offscreen rendering. This is possible if the window toolkit has initialized and created + * the shared application (NSApp) before GLFW is initialized.

    + */ +final class EventLoop { + + private EventLoop() { + } + + static void check() { + if (Platform.get() == Platform.MACOSX && !isMainThread()) { + // The only way to avoid a crash is if the shared application (NSApp) has been created by something else + throw new IllegalStateException( + isJavaStartedOnFirstThread() + ? "GLFW may only be used on the main thread. This check may be disabled with Configuration.GLFW_CHECK_THREAD0." + : "GLFW may only be used on the main thread and that thread must be the first thread in the process. Please run " + + "the JVM with -XstartOnFirstThread. This check may be disabled with Configuration.GLFW_CHECK_THREAD0." + ); + } + } + + private static boolean isMainThread() { + if (!Configuration.GLFW_CHECK_THREAD0.get(true) || Configuration.GLFW_LIBRARY_NAME.get("").contains("glfw_async")) { + return true; + } + + long objc_msgSend = ObjCRuntime.getLibrary().getFunctionAddress("objc_msgSend"); + + long NSThread = objc_getClass("NSThread"); + long currentThread = invokePPP(NSThread, sel_getUid("currentThread"), objc_msgSend); + + return invokePPZ(currentThread, sel_getUid("isMainThread"), objc_msgSend); + } + + private static boolean isJavaStartedOnFirstThread() { + return "1".equals(System.getenv().get("JAVA_STARTED_ON_FIRST_THREAD_" + getpid())); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjector.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjector.java new file mode 100644 index 000000000..664f90cc5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjector.java @@ -0,0 +1,170 @@ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; + +import javax.annotation.Nullable; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import static org.lwjgl.system.APIUtil.apiGetFunctionAddress; +import static org.lwjgl.system.APIUtil.apiLog; +import static org.lwjgl.system.JNI.invokePP; +import static org.lwjgl.system.MemoryUtil.memAddressSafe; + +/** + * By Tungsten + * This class is for Fold Craft Launcher. + */ +public class FCLInjector { + + public static final long SetInjectorCallBack = apiGetFunctionAddress(GLFW.GLFW, "glfwSetInjectorCallback"); + public static final long SetHitResultType = apiGetFunctionAddress(GLFW.GLFW, "glfwSetHitResultType"); + + private static boolean get = false; + private static ClassLoader classLoader; + + private static final String HIT_RESULT_TYPE_UNKNOWN = "UNKNOWN"; + private static final String HIT_RESULT_TYPE_MISS = "MISS"; + private static final String HIT_RESULT_TYPE_BLOCK = "BLOCK"; + private static final String HIT_RESULT_TYPE_BLOCK_OLD = "TILE"; + private static final String HIT_RESULT_TYPE_ENTITY = "ENTITY"; + + private static final int INJECTOR_LEVEL_0 = 0; // unknown + private static final int INJECTOR_LEVEL_1 = 1; // 1.0 - 1.2 + private static final int INJECTOR_LEVEL_2 = 2; // 1.3 - 1.6 + private static final int INJECTOR_LEVEL_3 = 3; // 1.7 - 1.13 + private static final int INJECTOR_LEVEL_4 = 4; // 1.13+ + + private static final int INJECTOR_MODE_ENABLE = 1; + private static final int INJECTOR_MODE_DISABLE = 0; + + private static int level = 0; + @Nullable + private static String param0 = null; + @Nullable + private static String param1 = null; + @Nullable + private static String param2 = null; + @Nullable + private static String param3 = null; + + public static void setClassLoader(ClassLoader classLoader) { + String prop = System.getProperty("fcl.injector"); + if (!get && prop != null && !prop.isEmpty()) { + FCLInjector.classLoader = classLoader; + String[] props = prop.split(":"); + if (props.length == 5 && (props[0].equals("0") || props[0].equals("1") || props[0].equals("2") || props[0].equals("3") || props[0].equals("4"))) { + int level = Integer.parseInt(props[0]); + String param0 = props[1]; + String param1 = props[2]; + String param2 = props[3]; + String param3 = props[4]; + setup(level, param0, param1, param2, param3); + } + } + } + + public static void setup(int level, String param0, String param1, String param2, String param3) { + FCLInjector.level = level; + FCLInjector.param0 = param0; + FCLInjector.param1 = param1; + FCLInjector.param2 = param2; + FCLInjector.param3 = param3; + get = true; + FCLInjectorCallback callback = new FCLInjectorCallback() { + @Override + public void invoke() { + getHitResultType(); + } + }; + glfwSetFCLInjectorCallback(callback); + } + + @Nullable + @NativeType("FCLinjectorfun") + public static FCLInjectorCallback glfwSetFCLInjectorCallback(@Nullable @NativeType("FCLinjectorfun") FCLInjectorCallbackI cbfun) { + return FCLInjectorCallback.createSafe(nglfwSetFCLInjectorCallback(memAddressSafe(cbfun))); + } + + public static long nglfwSetFCLInjectorCallback(long cbfun) { + return invokePP(cbfun, SetInjectorCallBack); + } + + public static void nglfwSetHitResultType(String type) { + int typeInt; + switch (type) { + case HIT_RESULT_TYPE_MISS: + typeInt = 1; + break; + case HIT_RESULT_TYPE_BLOCK: + case HIT_RESULT_TYPE_BLOCK_OLD: + typeInt = 2; + break; + case HIT_RESULT_TYPE_ENTITY: + typeInt = 3; + break; + default: + typeInt = 0; + break; + } + JNI.invokeV(typeInt, FCLInjector.SetHitResultType); + } + + public static void getHitResultType() { + if (!get) { + nglfwSetHitResultType(HIT_RESULT_TYPE_UNKNOWN); + apiLog("FCL Injector not initialized!\n"); + return; + } + if (param0 != null && param1 != null && param2 != null && param3 != null) { + Object type = null; + boolean success = false; + try { + Class minecraftClass = Class.forName(param0, true, classLoader); + Method method = minecraftClass.getDeclaredMethod(param1); + method.setAccessible(true); + Object minecraft = method.invoke(null); + Field targetField = minecraftClass.getDeclaredField(param2); + targetField.setAccessible(true); + Object target = targetField.get(minecraft); + if (target != null) { + switch (level) { + case INJECTOR_LEVEL_2: + case INJECTOR_LEVEL_3: + Field typeField = target.getClass().getDeclaredField(param3); + typeField.setAccessible(true); + type = typeField.get(target); + break; + case INJECTOR_LEVEL_4: + Method typeMethod = target.getClass().getDeclaredMethod(param3); + typeMethod.setAccessible(true); + type = typeMethod.invoke(target); + break; + default: + break; + } + } + success = true; + } catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + apiLog(e.getMessage()); + } + if (level == INJECTOR_LEVEL_2) { + if (success && type == null) { + nglfwSetHitResultType(HIT_RESULT_TYPE_MISS); + } else if (success && (type.toString().equals(HIT_RESULT_TYPE_BLOCK_OLD) || type.toString().equals(HIT_RESULT_TYPE_ENTITY))) { + nglfwSetHitResultType(type.toString()); + } else { + nglfwSetHitResultType(HIT_RESULT_TYPE_UNKNOWN); + } + } else { + if (type != null && (type.toString().equals(HIT_RESULT_TYPE_MISS) || type.toString().equals(HIT_RESULT_TYPE_BLOCK) || type.toString().equals(HIT_RESULT_TYPE_ENTITY))) { + nglfwSetHitResultType(type.toString()); + } else { + nglfwSetHitResultType(HIT_RESULT_TYPE_UNKNOWN); + } + } + } + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjectorCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjectorCallback.java new file mode 100644 index 000000000..2a7cc925a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjectorCallback.java @@ -0,0 +1,55 @@ +package org.lwjgl.glfw; + +import static org.lwjgl.system.MemoryUtil.NULL; + +import org.lwjgl.system.Callback; + +import javax.annotation.Nullable; + +public abstract class FCLInjectorCallback extends Callback implements FCLInjectorCallbackI { + + public static FCLInjectorCallback create(long functionPointer) { + FCLInjectorCallbackI instance = Callback.get(functionPointer); + return instance instanceof FCLInjectorCallback + ? (FCLInjectorCallback)instance + : new FCLInjectorCallback.Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FCLInjectorCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWCursorEnterCallback} instance that delegates to the specified {@code GLFWCursorEnterCallbackI} instance. */ + public static FCLInjectorCallback create(FCLInjectorCallbackI instance) { + return instance instanceof FCLInjectorCallback + ? (FCLInjectorCallback)instance + : new FCLInjectorCallback.Container(instance.address(), instance); + } + + protected FCLInjectorCallback() { + super(CIF); + } + + FCLInjectorCallback(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FCLInjectorCallback { + + private final FCLInjectorCallbackI delegate; + + Container(long functionPointer, FCLInjectorCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke() { + delegate.invoke(); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjectorCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjectorCallbackI.java new file mode 100644 index 000000000..20c915564 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/FCLInjectorCallbackI.java @@ -0,0 +1,33 @@ +package org.lwjgl.glfw; + +import static org.lwjgl.system.APIUtil.apiCreateCIF; +import static org.lwjgl.system.libffi.LibFFI.FFI_DEFAULT_ABI; +import static org.lwjgl.system.libffi.LibFFI.ffi_type_pointer; +import static org.lwjgl.system.libffi.LibFFI.ffi_type_uint32; +import static org.lwjgl.system.libffi.LibFFI.ffi_type_void; + +import org.lwjgl.system.CallbackI; +import org.lwjgl.system.NativeType; +import org.lwjgl.system.libffi.FFICIF; + +@FunctionalInterface + @NativeType("FCLinjectorfun") + public interface FCLInjectorCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke(); + } + + void invoke(); + + } \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFW.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFW.java new file mode 100644 index 000000000..209242953 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFW.java @@ -0,0 +1,5176 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the
    GLFW library. + * + *

    GLFW is a free, Open Source, multi-platform library for opening a window, creating an OpenGL context and managing input. It is easy to integrate into + * existing applications and does not lay claim to the main loop.

    + */ +public class GLFW { + + public static final SharedLibrary GLFW = Library.loadNative(GLFW.class, "org.lwjgl.glfw", Configuration.GLFW_LIBRARY_NAME.get(Platform.mapLibraryNameBundled("glfw")), true); + + /** Contains the function pointers loaded from the glfw {@link SharedLibrary}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + Init = apiGetFunctionAddress(GLFW, "glfwInit"), + Terminate = apiGetFunctionAddress(GLFW, "glfwTerminate"), + InitHint = apiGetFunctionAddress(GLFW, "glfwInitHint"), + InitAllocator = apiGetFunctionAddress(GLFW, "glfwInitAllocator"), + GetVersion = apiGetFunctionAddress(GLFW, "glfwGetVersion"), + GetVersionString = apiGetFunctionAddress(GLFW, "glfwGetVersionString"), + GetError = apiGetFunctionAddress(GLFW, "glfwGetError"), + SetErrorCallback = apiGetFunctionAddress(GLFW, "glfwSetErrorCallback"), + GetPlatform = apiGetFunctionAddress(GLFW, "glfwGetPlatform"), + PlatformSupported = apiGetFunctionAddress(GLFW, "glfwPlatformSupported"), + GetMonitors = apiGetFunctionAddress(GLFW, "glfwGetMonitors"), + GetPrimaryMonitor = apiGetFunctionAddress(GLFW, "glfwGetPrimaryMonitor"), + GetMonitorPos = apiGetFunctionAddress(GLFW, "glfwGetMonitorPos"), + GetMonitorWorkarea = apiGetFunctionAddress(GLFW, "glfwGetMonitorWorkarea"), + GetMonitorPhysicalSize = apiGetFunctionAddress(GLFW, "glfwGetMonitorPhysicalSize"), + GetMonitorContentScale = apiGetFunctionAddress(GLFW, "glfwGetMonitorContentScale"), + GetMonitorName = apiGetFunctionAddress(GLFW, "glfwGetMonitorName"), + SetMonitorUserPointer = apiGetFunctionAddress(GLFW, "glfwSetMonitorUserPointer"), + GetMonitorUserPointer = apiGetFunctionAddress(GLFW, "glfwGetMonitorUserPointer"), + SetMonitorCallback = apiGetFunctionAddress(GLFW, "glfwSetMonitorCallback"), + GetVideoModes = apiGetFunctionAddress(GLFW, "glfwGetVideoModes"), + GetVideoMode = apiGetFunctionAddress(GLFW, "glfwGetVideoMode"), + SetGamma = apiGetFunctionAddress(GLFW, "glfwSetGamma"), + GetGammaRamp = apiGetFunctionAddress(GLFW, "glfwGetGammaRamp"), + SetGammaRamp = apiGetFunctionAddress(GLFW, "glfwSetGammaRamp"), + DefaultWindowHints = apiGetFunctionAddress(GLFW, "glfwDefaultWindowHints"), + WindowHint = apiGetFunctionAddress(GLFW, "glfwWindowHint"), + WindowHintString = apiGetFunctionAddress(GLFW, "glfwWindowHintString"), + CreateWindow = apiGetFunctionAddress(GLFW, "glfwCreateWindow"), + DestroyWindow = apiGetFunctionAddress(GLFW, "glfwDestroyWindow"), + WindowShouldClose = apiGetFunctionAddress(GLFW, "glfwWindowShouldClose"), + SetWindowShouldClose = apiGetFunctionAddress(GLFW, "glfwSetWindowShouldClose"), + SetWindowTitle = apiGetFunctionAddress(GLFW, "glfwSetWindowTitle"), + SetWindowIcon = apiGetFunctionAddress(GLFW, "glfwSetWindowIcon"), + GetWindowPos = apiGetFunctionAddress(GLFW, "glfwGetWindowPos"), + SetWindowPos = apiGetFunctionAddress(GLFW, "glfwSetWindowPos"), + GetWindowSize = apiGetFunctionAddress(GLFW, "glfwGetWindowSize"), + SetWindowSizeLimits = apiGetFunctionAddress(GLFW, "glfwSetWindowSizeLimits"), + SetWindowAspectRatio = apiGetFunctionAddress(GLFW, "glfwSetWindowAspectRatio"), + SetWindowSize = apiGetFunctionAddress(GLFW, "glfwSetWindowSize"), + GetFramebufferSize = apiGetFunctionAddress(GLFW, "glfwGetFramebufferSize"), + GetWindowFrameSize = apiGetFunctionAddress(GLFW, "glfwGetWindowFrameSize"), + GetWindowContentScale = apiGetFunctionAddress(GLFW, "glfwGetWindowContentScale"), + GetWindowOpacity = apiGetFunctionAddress(GLFW, "glfwGetWindowOpacity"), + SetWindowOpacity = apiGetFunctionAddress(GLFW, "glfwSetWindowOpacity"), + IconifyWindow = apiGetFunctionAddress(GLFW, "glfwIconifyWindow"), + RestoreWindow = apiGetFunctionAddress(GLFW, "glfwRestoreWindow"), + MaximizeWindow = apiGetFunctionAddress(GLFW, "glfwMaximizeWindow"), + ShowWindow = apiGetFunctionAddress(GLFW, "glfwShowWindow"), + HideWindow = apiGetFunctionAddress(GLFW, "glfwHideWindow"), + FocusWindow = apiGetFunctionAddress(GLFW, "glfwFocusWindow"), + RequestWindowAttention = apiGetFunctionAddress(GLFW, "glfwRequestWindowAttention"), + GetWindowMonitor = apiGetFunctionAddress(GLFW, "glfwGetWindowMonitor"), + SetWindowMonitor = apiGetFunctionAddress(GLFW, "glfwSetWindowMonitor"), + GetWindowAttrib = apiGetFunctionAddress(GLFW, "glfwGetWindowAttrib"), + SetWindowAttrib = apiGetFunctionAddress(GLFW, "glfwSetWindowAttrib"), + SetWindowUserPointer = apiGetFunctionAddress(GLFW, "glfwSetWindowUserPointer"), + GetWindowUserPointer = apiGetFunctionAddress(GLFW, "glfwGetWindowUserPointer"), + SetWindowPosCallback = apiGetFunctionAddress(GLFW, "glfwSetWindowPosCallback"), + SetWindowSizeCallback = apiGetFunctionAddress(GLFW, "glfwSetWindowSizeCallback"), + SetWindowCloseCallback = apiGetFunctionAddress(GLFW, "glfwSetWindowCloseCallback"), + SetWindowRefreshCallback = apiGetFunctionAddress(GLFW, "glfwSetWindowRefreshCallback"), + SetWindowFocusCallback = apiGetFunctionAddress(GLFW, "glfwSetWindowFocusCallback"), + SetWindowIconifyCallback = apiGetFunctionAddress(GLFW, "glfwSetWindowIconifyCallback"), + SetWindowMaximizeCallback = apiGetFunctionAddress(GLFW, "glfwSetWindowMaximizeCallback"), + SetFramebufferSizeCallback = apiGetFunctionAddress(GLFW, "glfwSetFramebufferSizeCallback"), + SetWindowContentScaleCallback = apiGetFunctionAddress(GLFW, "glfwSetWindowContentScaleCallback"), + PollEvents = apiGetFunctionAddress(GLFW, "glfwPollEvents"), + WaitEvents = apiGetFunctionAddress(GLFW, "glfwWaitEvents"), + WaitEventsTimeout = apiGetFunctionAddress(GLFW, "glfwWaitEventsTimeout"), + PostEmptyEvent = apiGetFunctionAddress(GLFW, "glfwPostEmptyEvent"), + GetInputMode = apiGetFunctionAddress(GLFW, "glfwGetInputMode"), + SetInputMode = apiGetFunctionAddress(GLFW, "glfwSetInputMode"), + RawMouseMotionSupported = apiGetFunctionAddress(GLFW, "glfwRawMouseMotionSupported"), + GetKeyName = apiGetFunctionAddress(GLFW, "glfwGetKeyName"), + GetKeyScancode = apiGetFunctionAddress(GLFW, "glfwGetKeyScancode"), + GetKey = apiGetFunctionAddress(GLFW, "glfwGetKey"), + GetMouseButton = apiGetFunctionAddress(GLFW, "glfwGetMouseButton"), + GetCursorPos = apiGetFunctionAddress(GLFW, "glfwGetCursorPos"), + SetCursorPos = apiGetFunctionAddress(GLFW, "glfwSetCursorPos"), + CreateCursor = apiGetFunctionAddress(GLFW, "glfwCreateCursor"), + CreateStandardCursor = apiGetFunctionAddress(GLFW, "glfwCreateStandardCursor"), + DestroyCursor = apiGetFunctionAddress(GLFW, "glfwDestroyCursor"), + SetCursor = apiGetFunctionAddress(GLFW, "glfwSetCursor"), + SetKeyCallback = apiGetFunctionAddress(GLFW, "glfwSetKeyCallback"), + SetCharCallback = apiGetFunctionAddress(GLFW, "glfwSetCharCallback"), + SetCharModsCallback = apiGetFunctionAddress(GLFW, "glfwSetCharModsCallback"), + SetMouseButtonCallback = apiGetFunctionAddress(GLFW, "glfwSetMouseButtonCallback"), + SetCursorPosCallback = apiGetFunctionAddress(GLFW, "glfwSetCursorPosCallback"), + SetCursorEnterCallback = apiGetFunctionAddress(GLFW, "glfwSetCursorEnterCallback"), + SetScrollCallback = apiGetFunctionAddress(GLFW, "glfwSetScrollCallback"), + SetDropCallback = apiGetFunctionAddress(GLFW, "glfwSetDropCallback"), + SetClipboardString = apiGetFunctionAddress(GLFW, "glfwSetClipboardString"), + GetClipboardString = apiGetFunctionAddress(GLFW, "glfwGetClipboardString"), + GetTime = apiGetFunctionAddress(GLFW, "glfwGetTime"), + SetTime = apiGetFunctionAddress(GLFW, "glfwSetTime"), + GetTimerValue = apiGetFunctionAddress(GLFW, "glfwGetTimerValue"), + GetTimerFrequency = apiGetFunctionAddress(GLFW, "glfwGetTimerFrequency"), + GetOSMesaWidth = apiGetFunctionAddress(GLFW, "glfwGetOSMesaWidth"), + GetOSMesaHeight = apiGetFunctionAddress(GLFW, "glfwGetOSMesaHeight"), + GetOSMesaCurrentContext = apiGetFunctionAddress(GLFW, "glfwGetOSMesaCurrentContext"), + GetGraphicBuffersAddr = apiGetFunctionAddress(GLFW, "glfwGetGraphicBuffersAddr"), + MakeContextCurrent = apiGetFunctionAddress(GLFW, "glfwMakeContextCurrent"), + GetCurrentContext = apiGetFunctionAddress(GLFW, "glfwGetCurrentContext"), + SwapBuffers = apiGetFunctionAddress(GLFW, "glfwSwapBuffers"), + SwapInterval = apiGetFunctionAddress(GLFW, "glfwSwapInterval"), + ExtensionSupported = apiGetFunctionAddress(GLFW, "glfwExtensionSupported"), + GetProcAddress = apiGetFunctionAddress(GLFW, "glfwGetProcAddress"); + + } + + /** Returns the glfw {@link SharedLibrary}. */ + public static SharedLibrary getLibrary() { + return GLFW; + } + + /** + * The major version number of the GLFW header. + * + *

    This is incremented when the API is changed in non-compatible ways.

    + */ + public static final int GLFW_VERSION_MAJOR = 3; + + /** + * The minor version number of the GLFW header. + * + *

    This is incremented when features are added to the API but it remains backward-compatible.

    + */ + public static final int GLFW_VERSION_MINOR = 4; + + /** + * The revision number of the GLFW header. + * + *

    This is incremented when a bug fix release is made that does not contain any API changes.

    + */ + public static final int GLFW_VERSION_REVISION = 0; + + /** Boolean values. */ + public static final int + GLFW_TRUE = 1, + GLFW_FALSE = 0; + + /** The key or button was released. */ + public static final int GLFW_RELEASE = 0; + + /** The key or button was pressed. */ + public static final int GLFW_PRESS = 1; + + /** The key was held down until it repeated. */ + public static final int GLFW_REPEAT = 2; + + /** Joystick hat states. */ + public static final int + GLFW_HAT_CENTERED = 0, + GLFW_HAT_UP = 1, + GLFW_HAT_RIGHT = 2, + GLFW_HAT_DOWN = 4, + GLFW_HAT_LEFT = 8, + GLFW_HAT_RIGHT_UP = (GLFW_HAT_RIGHT | GLFW_HAT_UP), + GLFW_HAT_RIGHT_DOWN = (GLFW_HAT_RIGHT | GLFW_HAT_DOWN), + GLFW_HAT_LEFT_UP = (GLFW_HAT_LEFT | GLFW_HAT_UP), + GLFW_HAT_LEFT_DOWN = (GLFW_HAT_LEFT | GLFW_HAT_DOWN); + + /** The unknown key. */ + public static final int GLFW_KEY_UNKNOWN = -1; + + /** Printable keys. */ + public static final int + GLFW_KEY_SPACE = 32, + GLFW_KEY_APOSTROPHE = 39, + GLFW_KEY_COMMA = 44, + GLFW_KEY_MINUS = 45, + GLFW_KEY_PERIOD = 46, + GLFW_KEY_SLASH = 47, + GLFW_KEY_0 = 48, + GLFW_KEY_1 = 49, + GLFW_KEY_2 = 50, + GLFW_KEY_3 = 51, + GLFW_KEY_4 = 52, + GLFW_KEY_5 = 53, + GLFW_KEY_6 = 54, + GLFW_KEY_7 = 55, + GLFW_KEY_8 = 56, + GLFW_KEY_9 = 57, + GLFW_KEY_SEMICOLON = 59, + GLFW_KEY_EQUAL = 61, + GLFW_KEY_A = 65, + GLFW_KEY_B = 66, + GLFW_KEY_C = 67, + GLFW_KEY_D = 68, + GLFW_KEY_E = 69, + GLFW_KEY_F = 70, + GLFW_KEY_G = 71, + GLFW_KEY_H = 72, + GLFW_KEY_I = 73, + GLFW_KEY_J = 74, + GLFW_KEY_K = 75, + GLFW_KEY_L = 76, + GLFW_KEY_M = 77, + GLFW_KEY_N = 78, + GLFW_KEY_O = 79, + GLFW_KEY_P = 80, + GLFW_KEY_Q = 81, + GLFW_KEY_R = 82, + GLFW_KEY_S = 83, + GLFW_KEY_T = 84, + GLFW_KEY_U = 85, + GLFW_KEY_V = 86, + GLFW_KEY_W = 87, + GLFW_KEY_X = 88, + GLFW_KEY_Y = 89, + GLFW_KEY_Z = 90, + GLFW_KEY_LEFT_BRACKET = 91, + GLFW_KEY_BACKSLASH = 92, + GLFW_KEY_RIGHT_BRACKET = 93, + GLFW_KEY_GRAVE_ACCENT = 96, + GLFW_KEY_WORLD_1 = 161, + GLFW_KEY_WORLD_2 = 162; + + /** Function keys. */ + public static final int + GLFW_KEY_ESCAPE = 256, + GLFW_KEY_ENTER = 257, + GLFW_KEY_TAB = 258, + GLFW_KEY_BACKSPACE = 259, + GLFW_KEY_INSERT = 260, + GLFW_KEY_DELETE = 261, + GLFW_KEY_RIGHT = 262, + GLFW_KEY_LEFT = 263, + GLFW_KEY_DOWN = 264, + GLFW_KEY_UP = 265, + GLFW_KEY_PAGE_UP = 266, + GLFW_KEY_PAGE_DOWN = 267, + GLFW_KEY_HOME = 268, + GLFW_KEY_END = 269, + GLFW_KEY_CAPS_LOCK = 280, + GLFW_KEY_SCROLL_LOCK = 281, + GLFW_KEY_NUM_LOCK = 282, + GLFW_KEY_PRINT_SCREEN = 283, + GLFW_KEY_PAUSE = 284, + GLFW_KEY_F1 = 290, + GLFW_KEY_F2 = 291, + GLFW_KEY_F3 = 292, + GLFW_KEY_F4 = 293, + GLFW_KEY_F5 = 294, + GLFW_KEY_F6 = 295, + GLFW_KEY_F7 = 296, + GLFW_KEY_F8 = 297, + GLFW_KEY_F9 = 298, + GLFW_KEY_F10 = 299, + GLFW_KEY_F11 = 300, + GLFW_KEY_F12 = 301, + GLFW_KEY_F13 = 302, + GLFW_KEY_F14 = 303, + GLFW_KEY_F15 = 304, + GLFW_KEY_F16 = 305, + GLFW_KEY_F17 = 306, + GLFW_KEY_F18 = 307, + GLFW_KEY_F19 = 308, + GLFW_KEY_F20 = 309, + GLFW_KEY_F21 = 310, + GLFW_KEY_F22 = 311, + GLFW_KEY_F23 = 312, + GLFW_KEY_F24 = 313, + GLFW_KEY_F25 = 314, + GLFW_KEY_KP_0 = 320, + GLFW_KEY_KP_1 = 321, + GLFW_KEY_KP_2 = 322, + GLFW_KEY_KP_3 = 323, + GLFW_KEY_KP_4 = 324, + GLFW_KEY_KP_5 = 325, + GLFW_KEY_KP_6 = 326, + GLFW_KEY_KP_7 = 327, + GLFW_KEY_KP_8 = 328, + GLFW_KEY_KP_9 = 329, + GLFW_KEY_KP_DECIMAL = 330, + GLFW_KEY_KP_DIVIDE = 331, + GLFW_KEY_KP_MULTIPLY = 332, + GLFW_KEY_KP_SUBTRACT = 333, + GLFW_KEY_KP_ADD = 334, + GLFW_KEY_KP_ENTER = 335, + GLFW_KEY_KP_EQUAL = 336, + GLFW_KEY_LEFT_SHIFT = 340, + GLFW_KEY_LEFT_CONTROL = 341, + GLFW_KEY_LEFT_ALT = 342, + GLFW_KEY_LEFT_SUPER = 343, + GLFW_KEY_RIGHT_SHIFT = 344, + GLFW_KEY_RIGHT_CONTROL = 345, + GLFW_KEY_RIGHT_ALT = 346, + GLFW_KEY_RIGHT_SUPER = 347, + GLFW_KEY_MENU = 348, + GLFW_KEY_LAST = GLFW_KEY_MENU; + + /** If this bit is set one or more Shift keys were held down. */ + public static final int GLFW_MOD_SHIFT = 0x1; + + /** If this bit is set one or more Control keys were held down. */ + public static final int GLFW_MOD_CONTROL = 0x2; + + /** If this bit is set one or more Alt keys were held down. */ + public static final int GLFW_MOD_ALT = 0x4; + + /** If this bit is set one or more Super keys were held down. */ + public static final int GLFW_MOD_SUPER = 0x8; + + /** If this bit is set the Caps Lock key is enabled and the {@link #GLFW_LOCK_KEY_MODS LOCK_KEY_MODS} input mode is set. */ + public static final int GLFW_MOD_CAPS_LOCK = 0x10; + + /** If this bit is set the Num Lock key is enabled and the {@link #GLFW_LOCK_KEY_MODS LOCK_KEY_MODS} input mode is set. */ + public static final int GLFW_MOD_NUM_LOCK = 0x20; + + /** Mouse buttons. See mouse button input for how these are used. */ + public static final int + GLFW_MOUSE_BUTTON_1 = 0, + GLFW_MOUSE_BUTTON_2 = 1, + GLFW_MOUSE_BUTTON_3 = 2, + GLFW_MOUSE_BUTTON_4 = 3, + GLFW_MOUSE_BUTTON_5 = 4, + GLFW_MOUSE_BUTTON_6 = 5, + GLFW_MOUSE_BUTTON_7 = 6, + GLFW_MOUSE_BUTTON_8 = 7, + GLFW_MOUSE_BUTTON_LAST = GLFW_MOUSE_BUTTON_8, + GLFW_MOUSE_BUTTON_LEFT = GLFW_MOUSE_BUTTON_1, + GLFW_MOUSE_BUTTON_RIGHT = GLFW_MOUSE_BUTTON_2, + GLFW_MOUSE_BUTTON_MIDDLE = GLFW_MOUSE_BUTTON_3; + + /** Joysticks. See joystick input for how these are used. */ + public static final int + GLFW_JOYSTICK_1 = 0, + GLFW_JOYSTICK_2 = 1, + GLFW_JOYSTICK_3 = 2, + GLFW_JOYSTICK_4 = 3, + GLFW_JOYSTICK_5 = 4, + GLFW_JOYSTICK_6 = 5, + GLFW_JOYSTICK_7 = 6, + GLFW_JOYSTICK_8 = 7, + GLFW_JOYSTICK_9 = 8, + GLFW_JOYSTICK_10 = 9, + GLFW_JOYSTICK_11 = 10, + GLFW_JOYSTICK_12 = 11, + GLFW_JOYSTICK_13 = 12, + GLFW_JOYSTICK_14 = 13, + GLFW_JOYSTICK_15 = 14, + GLFW_JOYSTICK_16 = 15, + GLFW_JOYSTICK_LAST = GLFW_JOYSTICK_16; + + /** Gamepad buttons. See gamepad for how these are used. */ + public static final int + GLFW_GAMEPAD_BUTTON_A = 0, + GLFW_GAMEPAD_BUTTON_B = 1, + GLFW_GAMEPAD_BUTTON_X = 2, + GLFW_GAMEPAD_BUTTON_Y = 3, + GLFW_GAMEPAD_BUTTON_LEFT_BUMPER = 4, + GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER = 5, + GLFW_GAMEPAD_BUTTON_BACK = 6, + GLFW_GAMEPAD_BUTTON_START = 7, + GLFW_GAMEPAD_BUTTON_GUIDE = 8, + GLFW_GAMEPAD_BUTTON_LEFT_THUMB = 9, + GLFW_GAMEPAD_BUTTON_RIGHT_THUMB = 10, + GLFW_GAMEPAD_BUTTON_DPAD_UP = 11, + GLFW_GAMEPAD_BUTTON_DPAD_RIGHT = 12, + GLFW_GAMEPAD_BUTTON_DPAD_DOWN = 13, + GLFW_GAMEPAD_BUTTON_DPAD_LEFT = 14, + GLFW_GAMEPAD_BUTTON_LAST = GLFW_GAMEPAD_BUTTON_DPAD_LEFT, + GLFW_GAMEPAD_BUTTON_CROSS = GLFW_GAMEPAD_BUTTON_A, + GLFW_GAMEPAD_BUTTON_CIRCLE = GLFW_GAMEPAD_BUTTON_B, + GLFW_GAMEPAD_BUTTON_SQUARE = GLFW_GAMEPAD_BUTTON_X, + GLFW_GAMEPAD_BUTTON_TRIANGLE = GLFW_GAMEPAD_BUTTON_Y; + + /** Gamepad axes. See gamepad for how these are used. */ + public static final int + GLFW_GAMEPAD_AXIS_LEFT_X = 0, + GLFW_GAMEPAD_AXIS_LEFT_Y = 1, + GLFW_GAMEPAD_AXIS_RIGHT_X = 2, + GLFW_GAMEPAD_AXIS_RIGHT_Y = 3, + GLFW_GAMEPAD_AXIS_LEFT_TRIGGER = 4, + GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER = 5, + GLFW_GAMEPAD_AXIS_LAST = GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER; + + /** + * Error codes. + * + *
    Enum values:
    + * + *
      + *
    • {@link #GLFW_NO_ERROR NO_ERROR} - No error has occurred.
    • + *
    • {@link #GLFW_NOT_INITIALIZED NOT_INITIALIZED} - + * GLFW has not been initialized. + * + *

      This occurs if a GLFW function was called that may not be called unless the library is initialized.

      + *
    • + *
    • {@link #GLFW_NO_CURRENT_CONTEXT NO_CURRENT_CONTEXT} - + * No context is current for this thread. + * + *

      This occurs if a GLFW function was called that needs and operates on the current OpenGL or OpenGL ES context but no context is current on the + * calling thread. One such function is {@link #glfwSwapInterval SwapInterval}.

      + *
    • + *
    • {@link #GLFW_INVALID_ENUM INVALID_ENUM} - + * One of the arguments to the function was an invalid enum value. + * + *

      One of the arguments to the function was an invalid enum value, for example requesting {@link #GLFW_RED_BITS RED_BITS} with {@link #glfwGetWindowAttrib GetWindowAttrib}.

      + *
    • + *
    • {@link #GLFW_INVALID_VALUE INVALID_VALUE} - + * One of the arguments to the function was an invalid value. + * + *

      One of the arguments to the function was an invalid value, for example requesting a non-existent OpenGL or OpenGL ES version like 2.7.

      + * + *

      Requesting a valid but unavailable OpenGL or OpenGL ES version will instead result in a {@link #GLFW_VERSION_UNAVAILABLE VERSION_UNAVAILABLE} error.

      + *
    • + *
    • {@link #GLFW_OUT_OF_MEMORY OUT_OF_MEMORY} - + * A memory allocation failed. + * + *

      A bug in GLFW or the underlying operating system. Report the bug to our issue tracker.

      + *
    • + *
    • {@link #GLFW_API_UNAVAILABLE API_UNAVAILABLE} - + * GLFW could not find support for the requested API on the system. + * + *

      The installed graphics driver does not support the requested API, or does not support it via the chosen context creation API. Below are a few + * examples:

      + * + *

      Some pre-installed Windows graphics drivers do not support OpenGL. AMD only supports OpenGL ES via EGL, while Nvidia and Intel only support it via + * a WGL or GLX extension. macOS does not provide OpenGL ES at all. The Mesa EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia + * binary driver. Older graphics drivers do not support Vulkan.

      + *
    • + *
    • {@link #GLFW_VERSION_UNAVAILABLE VERSION_UNAVAILABLE} - + * The requested OpenGL or OpenGL ES version (including any requested context or framebuffer hints) is not available on this machine. + * + *

      The machine does not support your requirements. If your application is sufficiently flexible, downgrade your requirements and try again. Otherwise, + * inform the user that their machine does not match your requirements.

      + * + *

      Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0 comes out before the 4.x series gets that far, also fail with this + * error and not {@link #GLFW_INVALID_VALUE INVALID_VALUE}, because GLFW cannot know what future versions will exist.

      + *
    • + *
    • {@link #GLFW_PLATFORM_ERROR PLATFORM_ERROR} - + * A platform-specific error occurred that does not match any of the more specific categories. + * + *

      A bug or configuration error in GLFW, the underlying operating system or its drivers, or a lack of required resources. Report the issue to our + * issue tracker.

      + *
    • + *
    • {@link #GLFW_FORMAT_UNAVAILABLE FORMAT_UNAVAILABLE} - + * The requested format is not supported or available. + * + *

      If emitted during window creation, one or more hard constraints did not match any of the available pixel formats. If your application is + * sufficiently flexible, downgrade your requirements and try again. Otherwise, inform the user that their machine does not match your requirements.

      + * + *

      If emitted when querying the clipboard, ignore the error or report it to the user, as appropriate.

      + *
    • + *
    • {@link #GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} - + * The specified window does not have an OpenGL or OpenGL ES context. + * + *

      A window that does not have an OpenGL or OpenGL ES context was passed to a function that requires it to have one.

      + * + *

      Application programmer error. Fix the offending call.

      + *
    • + *
    • {@link #GLFW_CURSOR_UNAVAILABLE CURSOR_UNAVAILABLE} - + * The specified cursor shape is not available. + * + *

      The specified standard cursor shape is not available, either because the current platform cursor theme does not provide it or because it is not + * available on the platform.

      + * + *

      Platform or system settings limitation. Pick another standard cursor shape or create a custom cursor.

      + *
    • + *
    • {@link #GLFW_FEATURE_UNAVAILABLE FEATURE_UNAVAILABLE} - + * The requested feature is not provided by the platform. + * + *

      The requested feature is not provided by the platform, so GLFW is unable to implement it. The documentation for each function notes if it could + * emit this error.

      + * + *

      Platform or platform version limitation. The error can be ignored unless the feature is critical to the application.

      + * + *

      A function call that emits this error has no effect other than the error and updating any existing out parameters.

      + *
    • + *
    • {@link #GLFW_FEATURE_UNIMPLEMENTED FEATURE_UNIMPLEMENTED} - + * The requested feature has not yet been implemented in GLFW for this platform. + * + *

      An incomplete implementation of GLFW for this platform, hopefully fixed in a future release. The error can be ignored unless the feature is + * critical to the application.

      + * + *

      A function call that emits this error has no effect other than the error and updating any existing out parameters.

      + *
    • + *
    • {@link #GLFW_PLATFORM_UNAVAILABLE PLATFORM_UNAVAILABLE} - + * Platform unavailable or no matching platform was found. + * + *

      If emitted during initialization, no matching platform was found. If {@link #GLFW_PLATFORM PLATFORM} is set to {@link #GLFW_ANY_PLATFORM ANY_PLATFORM}, GLFW could not detect any of the platforms + * supported by this library binary, except for the {@code Null} platform. If set to a specific platform, it is either not supported by this library + * binary or GLFW was not able to detect it.

      + * + *

      If emitted by a native access function, GLFW was initialized for a different platform than the function is for.

      + * + *

      Failure to detect any platform usually only happens on non-macOS Unix systems, either when no window system is running or the program was run from + * a terminal that does not have the necessary environment variables. Fall back to a different platform if possible or notify the user that no usable + * platform was detected.

      + * + *

      Failure to detect a specific platform may have the same cause as above or because support for that platform was not compiled in. Call + * {@link #glfwPlatformSupported PlatformSupported} to check whether a specific platform is supported by a library binary.

      + *
    • + *
    + */ + public static final int + GLFW_NO_ERROR = 0, + GLFW_NOT_INITIALIZED = 0x10001, + GLFW_NO_CURRENT_CONTEXT = 0x10002, + GLFW_INVALID_ENUM = 0x10003, + GLFW_INVALID_VALUE = 0x10004, + GLFW_OUT_OF_MEMORY = 0x10005, + GLFW_API_UNAVAILABLE = 0x10006, + GLFW_VERSION_UNAVAILABLE = 0x10007, + GLFW_PLATFORM_ERROR = 0x10008, + GLFW_FORMAT_UNAVAILABLE = 0x10009, + GLFW_NO_WINDOW_CONTEXT = 0x1000A, + GLFW_CURSOR_UNAVAILABLE = 0x1000B, + GLFW_FEATURE_UNAVAILABLE = 0x1000C, + GLFW_FEATURE_UNIMPLEMENTED = 0x1000D, + GLFW_PLATFORM_UNAVAILABLE = 0x1000E; + + /** + * Window attributes. + * + *
    Enum values:
    + * + *
      + *
    • {@link #GLFW_FOCUSED FOCUSED} - + * {@code WindowHint}: Specifies whether the windowed mode window will be given input focus when created. This hint is ignored for full screen and + * initially hidden windows. + * + *

      {@code GetWindowAttrib}: Indicates whether the specified window has input focus.

      + *
    • + *
    • {@link #GLFW_ICONIFIED ICONIFIED} - {@code GetWindowAttrib}: Indicates whether the specified window is iconified, whether by the user or with {@link #glfwIconifyWindow IconifyWindow}.
    • + *
    • {@link #GLFW_RESIZABLE RESIZABLE} - + * {@code WindowHint}: Specifies whether the windowed mode window will be resizable by the user. The window will still be resizable using the + * {@link #glfwSetWindowSize SetWindowSize} function. This hint is ignored for full screen windows. + * + *

      {@code GetWindowAttrib}: Indicates whether the specified window is resizable by the user.

      + *
    • + *
    • {@link #GLFW_VISIBLE VISIBLE} - + * {@code WindowHint}: Specifies whether the windowed mode window will be initially visible. This hint is ignored for full screen windows. Windows created + * hidden are completely invisible to the user until shown. This can be useful if you need to set up your window further before showing it, for + * example moving it to a specific location. + * + *

      {@code GetWindowAttrib}: Indicates whether the specified window is visible. Window visibility can be controlled with {@link #glfwShowWindow ShowWindow} and {@link #glfwHideWindow HideWindow}.

      + *
    • + *
    • {@link #GLFW_DECORATED DECORATED} - + * {@code WindowHint}: Specifies whether the windowed mode window will have window decorations such as a border, a close widget, etc. An undecorated window + * may still allow the user to generate close events on some platforms. This hint is ignored for full screen windows. + * + *

      {@code GetWindowAttrib}: Indicates whether the specified window has decorations such as a border, a close widget, etc.

      + *
    • + *
    • {@link #GLFW_AUTO_ICONIFY AUTO_ICONIFY} - + * {@code WindowHint}: Specifies whether the full screen window will automatically iconify and restore the previous video mode on input focus loss. This + * hint is ignored for windowed mode windows. + *
    • + *
    • {@link #GLFW_FLOATING FLOATING} - + * {@code WindowHint}: Specifies whether the windowed mode window will be floating above other regular windows, also called topmost or always-on-top. This + * is intended primarily for debugging purposes and cannot be used to implement proper full screen windows. This hint is ignored for full screen + * windows. + * + *

      {@code GetWindowAttrib}: Indicates whether the specified window is floating, also called topmost or always-on-top.

      + *
    • + *
    • {@link #GLFW_MAXIMIZED MAXIMIZED} - + * {@code WindowHint}: Specifies whether the windowed mode window will be maximized when created. This hint is ignored for full screen windows. + * + *

      {@code GetWindowAttrib}: Indicates whether the specified window is maximized, whether by the user or {@link #glfwMaximizeWindow MaximizeWindow}.

      + *
    • + *
    • {@link #GLFW_CENTER_CURSOR CENTER_CURSOR} - + * {@code WindowHint}: Specifies whether the cursor should be centered over newly created full screen windows. This hint is ignored for windowed mode + * windows. + *
    • + *
    • {@link #GLFW_TRANSPARENT_FRAMEBUFFER TRANSPARENT_FRAMEBUFFER} - + * {@code WindowHint}: Specifies whether the window framebuffer will be transparent. If enabled and supported by the system, the window framebuffer + * alpha channel will be used to combine the framebuffer with the background. This does not affect window decorations. + *
    • + *
    • {@link #GLFW_HOVERED HOVERED} - {@code GetWindowAttrib}: Indicates whether the cursor is currently directly over the content area of the window, with no other windows between.
    • + *
    • {@link #GLFW_FOCUS_ON_SHOW FOCUS_ON_SHOW} - + * {@code WindowHint}: Specifies whether input focuses on calling show window. + * + *

      {@code GetWindowAttrib}: Indicates whether input focuses on calling show window.

      + *
    • + *
    • {@link #GLFW_MOUSE_PASSTHROUGH MOUSE_PASSTHROUGH} - + * {@code WindowHint}: Specifies whether the window is transparent to mouse input, letting any mouse events pass through to whatever window is behind + * it. This is only supported for undecorated windows. Decorated windows with this enabled will behave differently between platforms. + * + *

      {@code GetWindowAttrib}: Indicates whether the window is transparent to mouse input.

      + *
    • + *
    • {@link #GLFW_POSITION_X POSITION_X} - {@code WindowHint}: Initial position x-coordinate window hint.
    • + *
    • {@link #GLFW_POSITION_Y POSITION_Y} - {@code WindowHint}: Initial position y-coordinate window hint.
    • + *
    + */ + public static final int + GLFW_FOCUSED = 0x20001, + GLFW_ICONIFIED = 0x20002, + GLFW_RESIZABLE = 0x20003, + GLFW_VISIBLE = 0x20004, + GLFW_DECORATED = 0x20005, + GLFW_AUTO_ICONIFY = 0x20006, + GLFW_FLOATING = 0x20007, + GLFW_MAXIMIZED = 0x20008, + GLFW_CENTER_CURSOR = 0x20009, + GLFW_TRANSPARENT_FRAMEBUFFER = 0x2000A, + GLFW_HOVERED = 0x2000B, + GLFW_FOCUS_ON_SHOW = 0x2000C, + GLFW_MOUSE_PASSTHROUGH = 0x2000D, + GLFW_POSITION_X = 0x2000E, + GLFW_POSITION_Y = 0x2000F; + + /** Input options. */ + public static final int + GLFW_CURSOR = 0x33001, + GLFW_STICKY_KEYS = 0x33002, + GLFW_STICKY_MOUSE_BUTTONS = 0x33003, + GLFW_LOCK_KEY_MODS = 0x33004, + GLFW_RAW_MOUSE_MOTION = 0x33005; + + /** Cursor state. */ + public static final int + GLFW_CURSOR_NORMAL = 0x34001, + GLFW_CURSOR_HIDDEN = 0x34002, + GLFW_CURSOR_DISABLED = 0x34003, + GLFW_CURSOR_CAPTURED = 0x34004; + + /** The regular arrow cursor shape. */ + public static final int GLFW_ARROW_CURSOR = 0x36001; + + /** The text input I-beam cursor shape. */ + public static final int GLFW_IBEAM_CURSOR = 0x36002; + + /** The crosshair cursor shape. */ + public static final int GLFW_CROSSHAIR_CURSOR = 0x36003; + + /** The pointing hand cursor shape. */ + public static final int GLFW_POINTING_HAND_CURSOR = 0x36004; + + /** + * The horizontal resize/move arrow shape. + * + *

    This is usually a horizontal double-headed arrow.

    + */ + public static final int GLFW_RESIZE_EW_CURSOR = 0x36005; + + /** + * The vertical resize/move shape. + * + *

    This is usually a vertical double-headed arrow.

    + */ + public static final int GLFW_RESIZE_NS_CURSOR = 0x36006; + + /** + * The top-left to bottom-right diagonal resize/move shape. + * + *

    This is usually a diagonal double-headed arrow.

    + * + *
    Note
    + * + *
      + *
    • macOS: This shape is provided by a private system API and may fail with {@link #GLFW_CURSOR_UNAVAILABLE CURSOR_UNAVAILABLE} in the future.
    • + *
    • X11: This shape is provided by a newer standard not supported by all cursor themes.
    • + *
    • Wayland: This shape is provided by a newer standard not supported by all cursor themes.
    • + *
    + */ + public static final int GLFW_RESIZE_NWSE_CURSOR = 0x36007; + + /** + * The top-right to bottom-left diagonal resize/move shape. + * + *

    This is usually a diagonal double-headed arrow.

    + * + *
    Note
    + * + *
      + *
    • macOS: This shape is provided by a private system API and may fail with {@link #GLFW_CURSOR_UNAVAILABLE CURSOR_UNAVAILABLE} in the future.
    • + *
    • X11: This shape is provided by a newer standard not supported by all cursor themes.
    • + *
    • Wayland: This shape is provided by a newer standard not supported by all cursor themes.
    • + *
    + */ + public static final int GLFW_RESIZE_NESW_CURSOR = 0x36008; + + /** + * The omni-directional resize cursor/move shape. + * + *

    This is usually either a combined horizontal and vertical double-headed arrow or a grabbing hand.

    + */ + public static final int GLFW_RESIZE_ALL_CURSOR = 0x36009; + + /** + * The operation-not-allowed shape. + * + *

    This is usually a circle with a diagonal line through it.

    + * + *
    Note
    + * + *
      + *
    • X11: This shape is provided by a newer standard not supported by all cursor themes.
    • + *
    • Wayland: This shape is provided by a newer standard not supported by all cursor themes.
    • + *
    + */ + public static final int GLFW_NOT_ALLOWED_CURSOR = 0x3600A; + + /** Legacy name for compatibility. */ + public static final int GLFW_HRESIZE_CURSOR = GLFW_RESIZE_EW_CURSOR; + + /** Legacy name for compatibility. */ + public static final int GLFW_VRESIZE_CURSOR = GLFW_RESIZE_NS_CURSOR; + + /** Legacy name for compatibility. */ + public static final int GLFW_HAND_CURSOR = GLFW_POINTING_HAND_CURSOR; + + /** Monitor events. */ + public static final int + GLFW_CONNECTED = 0x40001, + GLFW_DISCONNECTED = 0x40002; + + /** + * Joystick hat buttons init hint. + * + *

    Specifies whether to also expose joystick hats as buttons, for compatibility with earlier versions of GLFW that did not have {@link #glfwGetJoystickHats GetJoystickHats}. + * Possible values are {@link #GLFW_TRUE TRUE} and {@link #GLFW_FALSE FALSE}.

    + */ + public static final int GLFW_JOYSTICK_HAT_BUTTONS = 0x50001; + + /** + * ANGLE rendering backend init hint. + * + *

    Specifies the platform type (rendering backend) to request when using OpenGL ES and EGL via ANGLE. If the requested platform type is unavailable, ANGLE will use its default. Possible values are one of {@link #GLFW_ANGLE_PLATFORM_TYPE_NONE ANGLE_PLATFORM_TYPE_NONE}, + * {@link #GLFW_ANGLE_PLATFORM_TYPE_OPENGL ANGLE_PLATFORM_TYPE_OPENGL}, {@link #GLFW_ANGLE_PLATFORM_TYPE_OPENGLES ANGLE_PLATFORM_TYPE_OPENGLES}, {@link #GLFW_ANGLE_PLATFORM_TYPE_D3D9 ANGLE_PLATFORM_TYPE_D3D9}, {@link #GLFW_ANGLE_PLATFORM_TYPE_D3D11 ANGLE_PLATFORM_TYPE_D3D11}, {@link #GLFW_ANGLE_PLATFORM_TYPE_VULKAN ANGLE_PLATFORM_TYPE_VULKAN} and + * {@link #GLFW_ANGLE_PLATFORM_TYPE_METAL ANGLE_PLATFORM_TYPE_METAL}.

    + */ + public static final int GLFW_ANGLE_PLATFORM_TYPE = 0x50002; + + public static final int GLFW_ANY_POSITION = 0x80000000; + + /** Platform selection init hint. */ + public static final int GLFW_PLATFORM = 0x50003; + + /** + * macOS specific init hint. + * + *

    Specifies whether to set the current directory to the application to the {@code Contents/Resources} subdirectory of the application's bundle, if + * present. Possible values are {@link #GLFW_TRUE TRUE}` and {@link #GLFW_FALSE FALSE}`. This is ignored on other platforms.

    + */ + public static final int GLFW_COCOA_CHDIR_RESOURCES = 0x51001; + + /** + * macOS specific init hint. + * + *

    Specifies whether to create the menu bar and dock icon when GLFW is initialized. This applies whether the menu bar is created from a nib or manually by + * GLFW. Possible values are {@link #GLFW_TRUE TRUE} and {@link #GLFW_FALSE FALSE}. This is ignored on other platforms.

    + */ + public static final int GLFW_COCOA_MENUBAR = 0x51002; + + /** X11 specific init hint. */ + public static final int GLFW_X11_XCB_VULKAN_SURFACE = 0x52001; + + /** Wayland specific init hint. */ + public static final int GLFW_WAYLAND_LIBDECOR = 0x53001; + + /** Hint value for {@link #GLFW_PLATFORM PLATFORM} that enables automatic platform selection. */ + public static final int + GLFW_ANY_PLATFORM = 0x60000, + GLFW_PLATFORM_WIN32 = 0x60001, + GLFW_PLATFORM_COCOA = 0x60002, + GLFW_PLATFORM_WAYLAND = 0x60003, + GLFW_PLATFORM_X11 = 0x60004, + GLFW_PLATFORM_NULL = 0x60005; + + /** Don't care value. */ + public static final int GLFW_DONT_CARE = -1; + + /** PixelFormat hints. */ + public static final int + GLFW_RED_BITS = 0x21001, + GLFW_GREEN_BITS = 0x21002, + GLFW_BLUE_BITS = 0x21003, + GLFW_ALPHA_BITS = 0x21004, + GLFW_DEPTH_BITS = 0x21005, + GLFW_STENCIL_BITS = 0x21006, + GLFW_ACCUM_RED_BITS = 0x21007, + GLFW_ACCUM_GREEN_BITS = 0x21008, + GLFW_ACCUM_BLUE_BITS = 0x21009, + GLFW_ACCUM_ALPHA_BITS = 0x2100A, + GLFW_AUX_BUFFERS = 0x2100B, + GLFW_STEREO = 0x2100C, + GLFW_SAMPLES = 0x2100D, + GLFW_SRGB_CAPABLE = 0x2100E, + GLFW_REFRESH_RATE = 0x2100F, + GLFW_DOUBLEBUFFER = 0x21010; + + /** + * Client API hints. + * + *
    Enum values:
    + * + *
      + *
    • {@link #GLFW_CLIENT_API CLIENT_API} - + * {@code WindowHint}: Specifies which client API to create the context for. Possible values are {@link #GLFW_OPENGL_API OPENGL_API}, {@link #GLFW_OPENGL_ES_API OPENGL_ES_API} and {@link #GLFW_NO_API NO_API}. This is a hard + * constraint. + * + *

      {@code GetWindowAttrib}: Indicates the client API provided by the window's context; either {@link #GLFW_OPENGL_API OPENGL_API}, {@link #GLFW_OPENGL_ES_API OPENGL_ES_API} or {@link #GLFW_NO_API NO_API}.

      + *
    • + *
    • {@link #GLFW_CONTEXT_VERSION_MAJOR CONTEXT_VERSION_MAJOR} - + * {@code WindowHint}: Specifies the client API major version that the created context must be compatible with. The exact behavior of this hint depends on + * the requested client API. + * + *
      Note
      + * + *
        + *
      • While there is no way to ask the driver for a context of the highest supported version, GLFW will attempt to provide this when you ask for a + * version 1.0 context, which is the default for these hints.
      • + *
      • OpenGL: {@link #GLFW_CONTEXT_VERSION_MAJOR CONTEXT_VERSION_MAJOR} and {@link #GLFW_CONTEXT_VERSION_MINOR CONTEXT_VERSION_MINOR} are not hard constraints, but creation will fail if the OpenGL version of the + * created context is less than the one requested. It is therefore perfectly safe to use the default of version 1.0 for legacy code and you will + * still get backwards-compatible contexts of version 3.0 and above when available.
      • + *
      • OpenGL ES: {@link #GLFW_CONTEXT_VERSION_MAJOR CONTEXT_VERSION_MAJOR} and {@link #GLFW_CONTEXT_VERSION_MINOR CONTEXT_VERSION_MINOR} are not hard constraints, but creation will fail if the OpenGL ES version + * of the created context is less than the one requested. Additionally, OpenGL ES 1.x cannot be returned if 2.0 or later was requested, and vice + * versa. This is because OpenGL ES 3.x is backward compatible with 2.0, but OpenGL ES 2.0 is not backward compatible with 1.x.
      • + *
      + * + *

      {@code GetWindowAttrib}: Indicate the client API major version of the window's context.

      + *
    • + *
    • {@link #GLFW_CONTEXT_VERSION_MINOR CONTEXT_VERSION_MINOR} - + * {@code WindowHint}: Specifies the client API minor version that the created context must be compatible with. The exact behavior of this hint depends on + * the requested client API. + * + *

      {@code GetWindowAttrib}: Indicate the client API minor version of the window's context.

      + *
    • + *
    • {@link #GLFW_CONTEXT_REVISION CONTEXT_REVISION} - {@code GetWindowAttrib}: Indicates the client API version of the window's context.
    • + *
    • {@link #GLFW_CONTEXT_ROBUSTNESS CONTEXT_ROBUSTNESS} - + * {@code WindowHint}: Specifies the robustness strategy to be used by the context. This can be one of {@link #GLFW_NO_RESET_NOTIFICATION NO_RESET_NOTIFICATION} or {@link #GLFW_LOSE_CONTEXT_ON_RESET LOSE_CONTEXT_ON_RESET}, or + * {@link #GLFW_NO_ROBUSTNESS NO_ROBUSTNESS} to not request a robustness strategy. + * + *

      {@code GetWindowAttrib}: Indicates the robustness strategy used by the context. This is {@link #GLFW_LOSE_CONTEXT_ON_RESET LOSE_CONTEXT_ON_RESET} or {@link #GLFW_NO_RESET_NOTIFICATION NO_RESET_NOTIFICATION} if the window's + * context supports robustness, or {@link #GLFW_NO_ROBUSTNESS NO_ROBUSTNESS} otherwise.

      + *
    • + *
    • {@link #GLFW_OPENGL_FORWARD_COMPAT OPENGL_FORWARD_COMPAT} - + * {@code WindowHint}: Specifies whether the OpenGL context should be forward-compatible, i.e. one where all functionality deprecated in the requested + * version of OpenGL is removed. This must only be used if the requested OpenGL version is 3.0 or above. If OpenGL ES is requested, this hint is + * ignored. + * + *

      {@code GetWindowAttrib}: Indicates if the window's context is an OpenGL forward-compatible one.

      + *
    • + *
    • {@link #GLFW_CONTEXT_DEBUG CONTEXT_DEBUG} - + * {@code WindowHint}: Specifies whether to create a debug context, which may have additional error and performance issue reporting functionality. + * + *

      {@code GetWindowAttrib}: Indicates if the window's context is a debug context.

      + *
    • + *
    • {@link #GLFW_OPENGL_DEBUG_CONTEXT OPENGL_DEBUG_CONTEXT} - Alias of {@link #GLFW_CONTEXT_DEBUG CONTEXT_DEBUG} for compatibility with earlier versions.
    • + *
    • {@link #GLFW_OPENGL_PROFILE OPENGL_PROFILE} - + * {@code WindowHint}: Specifies which OpenGL profile to create the context for. Possible values are one of {@link #GLFW_OPENGL_CORE_PROFILE OPENGL_CORE_PROFILE} or {@link #GLFW_OPENGL_COMPAT_PROFILE OPENGL_COMPAT_PROFILE}, + * or {@link #GLFW_OPENGL_ANY_PROFILE OPENGL_ANY_PROFILE} to not request a specific profile. If requesting an OpenGL version below 3.2, {@link #GLFW_OPENGL_ANY_PROFILE OPENGL_ANY_PROFILE} must be used. If OpenGL ES + * is requested, this hint is ignored. + * + *

      {@code GetWindowAttrib}: Indicates the OpenGL profile used by the context. This is {@link #GLFW_OPENGL_CORE_PROFILE OPENGL_CORE_PROFILE} or {@link #GLFW_OPENGL_COMPAT_PROFILE OPENGL_COMPAT_PROFILE} if the context uses a + * known profile, or {@link #GLFW_OPENGL_ANY_PROFILE OPENGL_ANY_PROFILE} if the OpenGL profile is unknown or the context is an OpenGL ES context. Note that the returned profile may + * not match the profile bits of the context flags, as GLFW will try other means of detecting the profile when no bits are set.

      + *
    • + *
    • {@link #GLFW_CONTEXT_RELEASE_BEHAVIOR CONTEXT_RELEASE_BEHAVIOR} - + * {@code WindowHint}: Specifies the release behavior to be used by the context. If the behavior is {@link #GLFW_ANY_RELEASE_BEHAVIOR ANY_RELEASE_BEHAVIOR}, the default behavior of the + * context creation API will be used. If the behavior is {@link #GLFW_RELEASE_BEHAVIOR_FLUSH RELEASE_BEHAVIOR_FLUSH}, the pipeline will be flushed whenever the context is released from + * being the current one. If the behavior is {@link #GLFW_RELEASE_BEHAVIOR_NONE RELEASE_BEHAVIOR_NONE}, the pipeline will not be flushed on release. + *
    • + *
    • {@link #GLFW_CONTEXT_NO_ERROR CONTEXT_NO_ERROR} - + * {@code WindowHint}: Specifies whether errors should be generated by the context. If enabled, situations that would have generated errors instead cause + * undefined behavior. + *
    • + *
    • {@link #GLFW_CONTEXT_CREATION_API CONTEXT_CREATION_API} - + * {@code WindowHint}: Specifies which context creation API to use to create the context. Possible values are {@link #GLFW_NATIVE_CONTEXT_API NATIVE_CONTEXT_API}, {@link #GLFW_EGL_CONTEXT_API EGL_CONTEXT_API} + * and {@link #GLFW_OSMESA_CONTEXT_API OSMESA_CONTEXT_API}. This is a hard constraint. If no client API is requested, this hint is ignored. + * + *
      Note
      + * + *
        + *
      • macOS: The EGL API is not available on this platform and requests to use it will fail.
      • + *
      • Wayland, Mir: The EGL API is the native context creation API, so this hint will have no effect.
      • + *
      • An OpenGL extension loader library that assumes it knows which context creation API is used on a given platform may fail if you change this + * hint. This can be resolved by having it load via {@link #glfwGetProcAddress GetProcAddress}, which always uses the selected API.
      • + *
      + * + *

      {@code GetWindowAttrib}: Indicates the context creation API used to create the window's context; either {@link #GLFW_NATIVE_CONTEXT_API NATIVE_CONTEXT_API} or {@link #GLFW_EGL_CONTEXT_API EGL_CONTEXT_API}.

      + *
    • + *
    • {@link #GLFW_SCALE_TO_MONITOR SCALE_TO_MONITOR} - + * {@code WindowHint}: Specifies whether the window content area should be resized based on the monitor content scale of any monitor it is placed on. + * This includes the initial placement when the window is created. Possible values are {@link #GLFW_TRUE TRUE} and {@link #GLFW_FALSE FALSE}. + * + *

      This hint only has an effect on platforms where screen coordinates and pixels always map 1:1 such as Windows and X11. On platforms like macOS the + * resolution of the framebuffer is changed independently of the window size.

      + *
    • + *
    + */ + public static final int + GLFW_CLIENT_API = 0x22001, + GLFW_CONTEXT_VERSION_MAJOR = 0x22002, + GLFW_CONTEXT_VERSION_MINOR = 0x22003, + GLFW_CONTEXT_REVISION = 0x22004, + GLFW_CONTEXT_ROBUSTNESS = 0x22005, + GLFW_OPENGL_FORWARD_COMPAT = 0x22006, + GLFW_CONTEXT_DEBUG = 0x22007, + GLFW_OPENGL_DEBUG_CONTEXT = GLFW_CONTEXT_DEBUG, + GLFW_OPENGL_PROFILE = 0x22008, + GLFW_CONTEXT_RELEASE_BEHAVIOR = 0x22009, + GLFW_CONTEXT_NO_ERROR = 0x2200A, + GLFW_CONTEXT_CREATION_API = 0x2200B, + GLFW_SCALE_TO_MONITOR = 0x2200C; + + /** + * Specifies whether to use full resolution framebuffers on Retina displays. + * + *

    This is ignored on other platforms.

    + */ + public static final int GLFW_COCOA_RETINA_FRAMEBUFFER = 0x23001; + + /** + * Specifies the UTF-8 encoded name to use for autosaving the window frame, or if empty disables frame autosaving for the window. + * + *

    This is ignored on other platforms.

    + */ + public static final int GLFW_COCOA_FRAME_NAME = 0x23002; + + /** + * Specifies whether to enable Automatic Graphics Switching, i.e. to allow the system to choose the integrated GPU for the OpenGL context and move it + * between GPUs if necessary or whether to force it to always run on the discrete GPU. This only affects systems with both integrated and discrete GPUs. + * + *

    This is ignored on other platforms.

    + */ + public static final int GLFW_COCOA_GRAPHICS_SWITCHING = 0x23003; + + /** + * The desired ASCII encoded class and instance parts of the ICCCM {@code WM_CLASS} window property. + * + *

    These are ignored on other platforms.

    + */ + public static final int + GLFW_X11_CLASS_NAME = 0x24001, + GLFW_X11_INSTANCE_NAME = 0x24002; + + /** + * Specifies whether to allow access to the window menu via the Alt+Space and Alt-and-then-Space keyboard shortcuts. + * + *

    This is ignored on other platforms.

    + */ + public static final int GLFW_WIN32_KEYBOARD_MENU = 0x25001; + + /** + * Allows specification of the Wayland {@code app_id}. + * + *

    This is ignored on other platforms.

    + */ + public static final int GLFW_WAYLAND_APP_ID = 0x26001; + + /** Values for the {@link #GLFW_CLIENT_API CLIENT_API} hint. */ + public static final int + GLFW_NO_API = 0, + GLFW_OPENGL_API = 0x30001, + GLFW_OPENGL_ES_API = 0x30002; + + /** Values for the {@link #GLFW_CONTEXT_ROBUSTNESS CONTEXT_ROBUSTNESS} hint. */ + public static final int + GLFW_NO_ROBUSTNESS = 0, + GLFW_NO_RESET_NOTIFICATION = 0x31001, + GLFW_LOSE_CONTEXT_ON_RESET = 0x31002; + + /** Values for the {@link #GLFW_OPENGL_PROFILE OPENGL_PROFILE} hint. */ + public static final int + GLFW_OPENGL_ANY_PROFILE = 0, + GLFW_OPENGL_CORE_PROFILE = 0x32001, + GLFW_OPENGL_COMPAT_PROFILE = 0x32002; + + /** Values for the {@link #GLFW_CONTEXT_RELEASE_BEHAVIOR CONTEXT_RELEASE_BEHAVIOR} hint. */ + public static final int + GLFW_ANY_RELEASE_BEHAVIOR = 0, + GLFW_RELEASE_BEHAVIOR_FLUSH = 0x35001, + GLFW_RELEASE_BEHAVIOR_NONE = 0x35002; + + /** Values for the {@link #GLFW_CONTEXT_CREATION_API CONTEXT_CREATION_API} hint. */ + public static final int + GLFW_NATIVE_CONTEXT_API = 0x36001, + GLFW_EGL_CONTEXT_API = 0x36002, + GLFW_OSMESA_CONTEXT_API = 0x36003; + + /** Values for the {@link #GLFW_ANGLE_PLATFORM_TYPE ANGLE_PLATFORM_TYPE} hint. */ + public static final int + GLFW_ANGLE_PLATFORM_TYPE_NONE = 0x37001, + GLFW_ANGLE_PLATFORM_TYPE_OPENGL = 0x37002, + GLFW_ANGLE_PLATFORM_TYPE_OPENGLES = 0x37003, + GLFW_ANGLE_PLATFORM_TYPE_D3D9 = 0x37004, + GLFW_ANGLE_PLATFORM_TYPE_D3D11 = 0x37005, + GLFW_ANGLE_PLATFORM_TYPE_VULKAN = 0x37007, + GLFW_ANGLE_PLATFORM_TYPE_METAL = 0x37008; + + /** Values for the {@link #GLFW_WAYLAND_LIBDECOR WAYLAND_LIBDECOR} hint. */ + public static final int + GLFW_WAYLAND_PREFER_LIBDECOR = 0x38001, + GLFW_WAYLAND_DISABLE_LIBDECOR = 0x38002; + + private static double glfwInitialTime; + private static final GLFWVidMode glfwVidMode; + public static int glfwWindowWidth; + public static int glfwWindowHeight; + + protected GLFW() { + throw new UnsupportedOperationException(); + } + + static { + glfwWindowWidth = Integer.parseInt(System.getProperty("window.width")); + glfwWindowHeight = Integer.parseInt(System.getProperty("window.height")); + glfwVidMode = new GLFWVidMode(ByteBuffer.allocateDirect(GLFWVidMode.SIZEOF)); + memPutInt(glfwVidMode.address() + GLFWVidMode.WIDTH, glfwWindowWidth); + memPutInt(glfwVidMode.address() + GLFWVidMode.HEIGHT, glfwWindowHeight); + memPutInt(glfwVidMode.address() + GLFWVidMode.REDBITS, 8); + memPutInt(glfwVidMode.address() + GLFWVidMode.GREENBITS, 8); + memPutInt(glfwVidMode.address() + GLFWVidMode.BLUEBITS, 8); + memPutInt(glfwVidMode.address() + GLFWVidMode.REFRESHRATE, 60); + } + + // --- [ glfwInit ] --- + + /** + * Initializes the GLFW library. Before most GLFW functions can be used, GLFW must be initialized, and before an application terminates GLFW should be + * terminated in order to free any resources allocated during or after initialization. + * + *

    If this function fails, it calls {@link #glfwTerminate Terminate} before returning. If it succeeds, you should call {@link #glfwTerminate Terminate} before the application exits.

    + * + *

    Additional calls to this function after successful initialization but before termination will return {@link #GLFW_TRUE TRUE} immediately.

    + * + *

    The {@link #GLFW_PLATFORM PLATFORM} init hint controls which platforms are considered during initialization. This also depends on which platforms the library was compiled to + * support.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • macOS: This function will change the current directory of the application to the `Contents/Resources` subdirectory of the application's + * bundle, if present. This can be disabled with the {@link #GLFW_COCOA_CHDIR_RESOURCES COCOA_CHDIR_RESOURCES} init hint.
    • + *
    • macOS: This function will create the main menu and dock icon for the application. If GLFW finds a {@code MainMenu.nib} it is loaded and + * assumed to contain a menu bar. Otherwise a minimal menu bar is created manually with common commands like Hide, Quit and About. The About entry + * opens a minimal about dialog with information from the application's bundle. The menu bar and dock icon can be disabled entirely with the + * {@link #GLFW_COCOA_MENUBAR COCOA_MENUBAR} init hint.
    • + *
    • x11: This function will set the {@code LC_CTYPE} category of the application locale according to the current environment if that category is + * still "C". This is because the "C" locale breaks Unicode text input.
    • + *
    + * + * @return {@link #GLFW_TRUE TRUE} if successful, or {@link #GLFW_FALSE FALSE} if an error occurred. + * + *

    Possible errors include {@link #GLFW_PLATFORM_UNAVAILABLE PLATFORM_UNAVAILABLE} and {@link #GLFW_PLATFORM_ERROR PLATFORM_ERROR}.

    + * + * @since version 1.0 + */ + @NativeType("int") + public static boolean glfwInit() { + glfwInitialTime = (double) System.nanoTime(); + long __functionAddress = Functions.Init; + EventLoop.check(); + return invokeI(__functionAddress) != 0; + } + + // --- [ glfwTerminate ] --- + + /** + * Terminates the GLFW library. + * + *

    This function destroys all remaining windows and cursors, restores any modified gamma ramps and frees any other allocated resources. Once this function + * is called, you must again call {@link #glfwInit Init} successfully before you will be able to use most GLFW functions.

    + * + *

    If GLFW has been successfully initialized, this function should be called before the application exits. If initialization fails, there is no need to + * call this function, as it is called by {@link #glfwInit Init} before it returns failure.

    + * + *

    This function has no effect if GLFW is not initialized.

    + * + *
    Note
    + * + *
      + *
    • This function may be called before {@link #glfwInit Init}.
    • + *
    • This function must only be called from the main thread.
    • + *
    • This function must not be called from a callback.
    • + *
    • No window's context may be current on another thread when this function is called.
    • + *
    + * + * @since version 1.0 + */ + public static void glfwTerminate() { + long __functionAddress = Functions.Terminate; + invokeV(__functionAddress); + } + + // --- [ glfwInitHint ] --- + + /** + * Sets hints for the next initialization of GLFW. + * + *

    The values you set hints to are never reset by GLFW, but they only take effect during initialization. Once GLFW has been initialized, any values you + * set will be ignored until the library is terminated and initialized again.

    + * + *

    Some hints are platform specific. These may be set on any platform but they will only affect their specific platform. Other platforms will simply + * ignore them. Setting these hints requires no platform specific headers or functions.

    + * + *
    Note
    + * + *
      + *
    • This function may be called before {@link #glfwInit Init}.
    • + *
    • This function must only be called from the main thread.
    • + *
    + * + * @param hint the init hint to set. One of:
    {@link #GLFW_JOYSTICK_HAT_BUTTONS JOYSTICK_HAT_BUTTONS}{@link #GLFW_ANGLE_PLATFORM_TYPE ANGLE_PLATFORM_TYPE}{@link #GLFW_COCOA_CHDIR_RESOURCES COCOA_CHDIR_RESOURCES}{@link #GLFW_COCOA_MENUBAR COCOA_MENUBAR}
    {@link #GLFW_PLATFORM PLATFORM}{@link #GLFW_X11_XCB_VULKAN_SURFACE X11_XCB_VULKAN_SURFACE}
    + * @param value the new value of the init hint + * + * @since version 3.3 + */ + public static void glfwInitHint(int hint, int value) {} + + // --- [ glfwInitAllocator ] --- + + /** Unsafe version of: {@link #glfwInitAllocator InitAllocator} */ + public static void nglfwInitAllocator(long allocator) { + long __functionAddress = Functions.InitAllocator; + if (CHECKS) { + if (allocator != NULL) { GLFWAllocator.validate(allocator); } + } + invokePV(allocator, __functionAddress); + } + + /** + * Sets the init allocator to the desired value. + * + *

    To use the default allocator, call this function with a {@code NULL} argument.

    + * + *

    If you specify an allocator struct, every member must be a valid function pointer. If any member is {@code NULL}, this function emits {@link #GLFW_INVALID_VALUE INVALID_VALUE} and the + * init allocator is unchanged.

    + * + *
    Note
    + * + *
      + *
    • Possible errors include {@link #GLFW_INVALID_VALUE INVALID_VALUE}.
    • + *
    • The specified allocator is copied before this function returns.
    • + *
    • This function must only be called from the main thread.
    • + *
    + * + * @param allocator the allocator to use at the next initialization, or {@code NULL} to use the default one + * + * @since version 3.4 + */ + public static void glfwInitAllocator(@Nullable @NativeType("GLFWallocator const *") GLFWAllocator allocator) { + nglfwInitAllocator(memAddressSafe(allocator)); + } + + // --- [ glfwGetVersion ] --- + + /** Unsafe version of: {@link #glfwGetVersion GetVersion} */ + public static void nglfwGetVersion(long major, long minor, long rev) { + long __functionAddress = Functions.GetVersion; + invokePPPV(major, minor, rev, __functionAddress); + } + + /** + * Retrieves the major, minor and revision numbers of the GLFW library. It is intended for when you are using GLFW as a shared library and want to ensure + * that you are using the minimum required version. + * + *
    Note
    + * + *
      + *
    • Any or all of the version arguments may be {@code NULL}.
    • + *
    • This function always succeeds.
    • + *
    • This function may be called before {@link #glfwInit Init}.
    • + *
    • This function may be called from any thread.
    • + *
    + * + * @param major where to store the major version number, or {@code NULL} + * @param minor where to store the minor version number, or {@code NULL} + * @param rev where to store the revision number, or {@code NULL} + * + * @since version 1.0 + */ + public static void glfwGetVersion(@Nullable @NativeType("int *") IntBuffer major, @Nullable @NativeType("int *") IntBuffer minor, @Nullable @NativeType("int *") IntBuffer rev) { + if (CHECKS) { + checkSafe(major, 1); + checkSafe(minor, 1); + checkSafe(rev, 1); + } + nglfwGetVersion(memAddressSafe(major), memAddressSafe(minor), memAddressSafe(rev)); + } + + // --- [ glfwGetVersionString ] --- + + /** Unsafe version of: {@link #glfwGetVersionString GetVersionString} */ + public static long nglfwGetVersionString() { + long __functionAddress = Functions.GetVersionString; + return invokeP(__functionAddress); + } + + /** + * Returns the compile-time generated version string of the GLFW library binary. It describes the version, platforms, compiler and any platform or + * operating system specific compile-time options. It should not be confused with the OpenGL or OpenGL ES version string, queried with + * {@code glGetString}. + * + *

    Do not use the version string to parse the GLFW library version. The {@link #glfwGetVersion GetVersion} function already provides the version of the library binary + * in numerical format.

    + * + *

    Do not use the version string to parse what platforms are supported. The {@link #glfwPlatformSupported PlatformSupported} function lets you query platform support.

    + * + *
    Note
    + * + *
      + *
    • This function always succeeds.
    • + *
    • This function may be called before {@link #glfwInit Init}.
    • + *
    • This function may be called from any thread.
    • + *
    • The returned string is static and compile-time generated.
    • + *
    + * + * @return the ASCII encoded GLFW version string + * + * @since version 3.0 + */ + @NativeType("char const *") + public static String glfwGetVersionString() { + long __result = nglfwGetVersionString(); + return memASCII(__result); + } + + // --- [ glfwGetError ] --- + + /** Unsafe version of: {@link #glfwGetError GetError} */ + public static int nglfwGetError(long description) { + long __functionAddress = Functions.GetError; + return invokePI(description, __functionAddress); + } + + /** + * Returns and clears the last error for the calling thread. + * + *

    This function returns and clears the error code of the last error that occurred on the calling thread and optionally a UTF-8 encoded human-readable + * description of it. If no error has occurred since the last call, it returns {@link #GLFW_NO_ERROR NO_ERROR} (zero), and the description pointer is set to {@code NULL}.

    + * + *
    Note
    + * + *
      + *
    • This function may be called before {@link #glfwInit Init}.
    • + *
    • This function may be called from any thread.
    • + *
    • The returned string is allocated and freed by GLFW. You should not free it yourself. It is guaranteed to be valid only until the next error occurs + * or the library is terminated.
    • + *
    + * + * @param description where to store the error description pointer, or {@code NULL} + * + * @return the last error code for the calling thread, or {@link #GLFW_NO_ERROR NO_ERROR} (zero) + * + * @since version 3.3 + */ + public static int glfwGetError(@Nullable @NativeType("char const **") PointerBuffer description) { + if (CHECKS) { + checkSafe(description, 1); + } + return nglfwGetError(memAddressSafe(description)); + } + + // --- [ glfwSetErrorCallback ] --- + + /** Unsafe version of: {@link #glfwSetErrorCallback SetErrorCallback} */ + public static long nglfwSetErrorCallback(long cbfun) { + long __functionAddress = Functions.SetErrorCallback; + return invokePP(cbfun, __functionAddress); + } + + /** + * Sets the error callback, which is called with an error code and a human-readable description each time a GLFW error occurs. + * + *

    The error code is set before the callback is called. Calling {@link #glfwGetError GetError} from the error callback will return the same value as the error code argument.

    + * + *

    The error callback is called on the thread where the error occurred. If you are using GLFW from multiple threads, your error callback needs to be + * written accordingly.

    + * + *

    Because the description string may have been generated specifically for that error, it is not guaranteed to be valid after the callback has returned. If + * you wish to use it after the callback returns, you need to make a copy.

    + * + *

    Once set, the error callback remains set even after the library has been terminated.

    + * + *
    Note
    + * + *
      + *
    • This function may be called before {@link #glfwInit Init}.
    • + *
    • This function must only be called from the main thread.
    • + *
    + * + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set + * + * @since version 3.0 + */ + @Nullable + @NativeType("GLFWerrorfun") + public static GLFWErrorCallback glfwSetErrorCallback(@Nullable @NativeType("GLFWerrorfun") GLFWErrorCallbackI cbfun) { + return GLFWErrorCallback.createSafe(nglfwSetErrorCallback(memAddressSafe(cbfun))); + } + + // --- [ glfwGetPlatform ] --- + + /** + * Returns the currently selected platform. + * + *

    This function returns the platform that was selected during initialization. The returned value will be one of {@link #GLFW_PLATFORM_WIN32 PLATFORM_WIN32}, {@link #GLFW_PLATFORM_COCOA PLATFORM_COCOA}, + * {@link #GLFW_PLATFORM_WAYLAND PLATFORM_WAYLAND}, {@link #GLFW_PLATFORM_X11 PLATFORM_X11} or {@link #GLFW_PLATFORM_NULL PLATFORM_NULL}.

    + * + *

    This function may be called from any thread.

    + * + * @return the currently selected platform, or zero if an error occurred. + * + *

    Possible errors include {@link #GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.4 + */ + public static int glfwGetPlatform() { + long __functionAddress = Functions.GetPlatform; + return invokeI(__functionAddress); + } + + // --- [ glfwPlatformSupported ] --- + + /** + * Returns whether the library includes support for the specified platform. + * + *

    This function returns whether the library was compiled with support for the specified platform.

    + * + *

    This function may be called before {@link #glfwInit Init}.

    + * + *

    This function may be called from any thread.

    + * + * @param platform the platform to query. One of:
    {@link #GLFW_PLATFORM_WIN32 PLATFORM_WIN32}{@link #GLFW_PLATFORM_COCOA PLATFORM_COCOA}{@link #GLFW_PLATFORM_WAYLAND PLATFORM_WAYLAND}{@link #GLFW_PLATFORM_X11 PLATFORM_X11}{@link #GLFW_PLATFORM_NULL PLATFORM_NULL}
    + * + * @return {@link #GLFW_TRUE TRUE} if the platform is supported, or {@link #GLFW_FALSE FALSE} otherwise. + * + *

    Possible errors include {@link #GLFW_INVALID_ENUM INVALID_ENUM}.

    + * + * @since version 3.4 + */ + @NativeType("int") + public static boolean glfwPlatformSupported(int platform) { + long __functionAddress = Functions.PlatformSupported; + return invokeI(platform, __functionAddress) != 0; + } + + // --- [ glfwGetMonitors ] --- + + /** + * Unsafe version of: {@link #glfwGetMonitors GetMonitors} + * + * @param count where to store the number of monitors in the returned array. This is set to zero if an error occurred. + */ + public static long nglfwGetMonitors(long count) { + long __functionAddress = Functions.GetMonitors; + return invokePP(count, __functionAddress); + } + + /** + * Returns an array of handles for all currently connected monitors. The primary monitor is always first in the returned array. If no monitors were found, + * this function returns {@code NULL}. + * + *

    The returned array is allocated and freed by GLFW. You should not free it yourself. It is guaranteed to be valid only until the monitor configuration + * changes or the library is terminated.

    + * + *

    This function must only be called from the main thread.

    + * + * @return an array of monitor handlers, or {@code NULL} if no monitors were found or if an error occurred + * + * @since version 3.0 + */ + @Nullable + @NativeType("GLFWmonitor **") + public static PointerBuffer glfwGetMonitors() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer count = stack.callocInt(1); + try { + long __result = nglfwGetMonitors(memAddress(count)); + return memPointerBufferSafe(__result, count.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glfwGetPrimaryMonitor ] --- + + /** + * Returns the primary monitor. This is usually the monitor where elements like the task bar or global menu bar are located. + * + *

    This function must only be called from the main thread.

    + * + *

    The primary monitor is always first in the array returned by {@link #glfwGetMonitors GetMonitors}.

    + * + * @return the primary monitor, or {@code NULL} if no monitors were found or if an error occurred + * + * @since version 3.0 + */ + @NativeType("GLFWmonitor *") + public static long glfwGetPrimaryMonitor() { + long __functionAddress = Functions.GetPrimaryMonitor; + return invokeP(__functionAddress); + } + + // --- [ glfwGetMonitorPos ] --- + + /** Unsafe version of: {@link #glfwGetMonitorPos GetMonitorPos} */ + public static void nglfwGetMonitorPos(long monitor, long xpos, long ypos) { + long __functionAddress = Functions.GetMonitorPos; + if (CHECKS) { + check(monitor); + } + invokePPPV(monitor, xpos, ypos, __functionAddress); + } + + /** + * Returns the position, in screen coordinates, of the upper-left corner of the specified monitor. + * + *

    Any or all of the position arguments may be {@code NULL}. If an error occurs, all non-{@code NULL} position arguments will be set to zero.

    + * + *

    This function must only be called from the main thread.

    + * + * @param monitor the monitor to query + * @param xpos where to store the monitor x-coordinate, or {@code NULL} + * @param ypos where to store the monitor y-coordinate, or {@code NULL} + * + * @since version 3.0 + */ + public static void glfwGetMonitorPos(@NativeType("GLFWmonitor *") long monitor, @Nullable @NativeType("int *") IntBuffer xpos, @Nullable @NativeType("int *") IntBuffer ypos) { + if (CHECKS) { + checkSafe(xpos, 1); + checkSafe(ypos, 1); + } + nglfwGetMonitorPos(monitor, memAddressSafe(xpos), memAddressSafe(ypos)); + } + + // --- [ glfwGetMonitorWorkarea ] --- + + /** Unsafe version of: {@link #glfwGetMonitorWorkarea GetMonitorWorkarea} */ + public static void nglfwGetMonitorWorkarea(long monitor, long xpos, long ypos, long width, long height) { + long __functionAddress = Functions.GetMonitorWorkarea; + if (CHECKS) { + check(monitor); + } + invokePPPPPV(monitor, xpos, ypos, width, height, __functionAddress); + } + + /** + * Retrieves the work area of the monitor. + * + *

    This function returns the position, in screen coordinates, of the upper-left corner of the work area of the specified monitor along with the work area + * size in screen coordinates. The work area is defined as the area of the monitor not occluded by the window system task bar where present. If no task + * bar exists then the work area is the monitor resolution in screen coordinates.

    + * + *

    Any or all of the position and size arguments may be {@code NULL}. If an error occurs, all non-{@code NULL} position and size arguments will be set to zero.

    + * + *

    This function must only be called from the main thread.

    + * + * @param monitor the monitor to query + * @param xpos where to store the working area x-coordinate, or {@code NULL} + * @param ypos where to store the working area y-coordinate, or {@code NULL} + * @param width where to store the working area width, or {@code NULL} + * @param height where to store the working area height, or {@code NULL} + * + * @since version 3.3 + */ + public static void glfwGetMonitorWorkarea(@NativeType("GLFWmonitor *") long monitor, @Nullable @NativeType("int *") IntBuffer xpos, @Nullable @NativeType("int *") IntBuffer ypos, @Nullable @NativeType("int *") IntBuffer width, @Nullable @NativeType("int *") IntBuffer height) { + if (CHECKS) { + checkSafe(xpos, 1); + checkSafe(ypos, 1); + checkSafe(width, 1); + checkSafe(height, 1); + } + nglfwGetMonitorWorkarea(monitor, memAddressSafe(xpos), memAddressSafe(ypos), memAddressSafe(width), memAddressSafe(height)); + } + + // --- [ glfwGetMonitorPhysicalSize ] --- + + /** Unsafe version of: {@link #glfwGetMonitorPhysicalSize GetMonitorPhysicalSize} */ + public static void nglfwGetMonitorPhysicalSize(long monitor, long widthMM, long heightMM) { + long __functionAddress = Functions.GetMonitorPhysicalSize; + if (CHECKS) { + check(monitor); + } + invokePPPV(monitor, widthMM, heightMM, __functionAddress); + } + + /** + * Returns the size, in millimetres, of the display area of the specified monitor. + * + *

    Some platforms do not provide accurate monitor size information, either because the monitor + * EDID data is incorrect or because the driver does not report it + * accurately.

    + * + *

    Any or all of the size arguments may be {@code NULL}. If an error occurs, all non-{@code NULL} size arguments will be set to zero.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Windows: On Windows 8 and earlier the physical size is calculated from the current resolution and system DPI instead of querying the monitor + * EDID data.
    • + *
    + * + * @param monitor the monitor to query + * @param widthMM where to store the width, in millimetres, of the monitor's display area, or {@code NULL} + * @param heightMM where to store the height, in millimetres, of the monitor's display area, or {@code NULL} + * + * @since version 3.0 + */ + public static void glfwGetMonitorPhysicalSize(@NativeType("GLFWmonitor *") long monitor, @Nullable @NativeType("int *") IntBuffer widthMM, @Nullable @NativeType("int *") IntBuffer heightMM) { + if (CHECKS) { + checkSafe(widthMM, 1); + checkSafe(heightMM, 1); + } + nglfwGetMonitorPhysicalSize(monitor, memAddressSafe(widthMM), memAddressSafe(heightMM)); + } + + // --- [ glfwGetMonitorContentScale ] --- + + /** Unsafe version of: {@link #glfwGetMonitorContentScale GetMonitorContentScale} */ + public static void nglfwGetMonitorContentScale(long monitor, long xscale, long yscale) { + long __functionAddress = Functions.GetMonitorContentScale; + if (CHECKS) { + check(monitor); + } + invokePPPV(monitor, xscale, yscale, __functionAddress); + } + + /** + * Retrieves the content scale for the specified monitor. + * + *

    This function retrieves the content scale for the specified monitor. The content scale is the ratio between the current DPI and the platform's default + * DPI. This is especially important for text and any UI elements. If the pixel dimensions of your UI scaled by this look appropriate on your machine then + * it should appear at a reasonable size on other machines regardless of their DPI and scaling settings. This relies on the system DPI and scaling + * settings being somewhat correct.

    + * + *

    The content scale may depend on both the monitor resolution and pixel density and on user settings. It may be very different from the raw DPI + * calculated from the physical size and current resolution.

    + * + *

    This function must only be called from the main thread.

    + * + * @param monitor the monitor to query + * @param xscale where to store the x-axis content scale, or {@code NULL} + * @param yscale where to store the y-axis content scale, or {@code NULL} + * + * @since version 3.3 + */ + public static void glfwGetMonitorContentScale(@NativeType("GLFWmonitor *") long monitor, @Nullable @NativeType("float *") FloatBuffer xscale, @Nullable @NativeType("float *") FloatBuffer yscale) { + if (CHECKS) { + checkSafe(xscale, 1); + checkSafe(yscale, 1); + } + nglfwGetMonitorContentScale(monitor, memAddressSafe(xscale), memAddressSafe(yscale)); + } + + // --- [ glfwGetMonitorName ] --- + + /** Unsafe version of: {@link #glfwGetMonitorName GetMonitorName} */ + public static long nglfwGetMonitorName(long monitor) { + long __functionAddress = Functions.GetMonitorName; + if (CHECKS) { + check(monitor); + } + return invokePP(monitor, __functionAddress); + } + + /** + * Returns a human-readable name, encoded as UTF-8, of the specified monitor. The name typically reflects the make and model of the monitor and is not + * guaranteed to be unique among the connected monitors. + * + *

    The returned string is allocated and freed by GLFW. You should not free it yourself. It is valid until the specified monitor is disconnected or the + * library is terminated.

    + * + *

    This function must only be called from the main thread.

    + * + * @param monitor the monitor to query + * + * @return the UTF-8 encoded name of the monitor, or {@code NULL} if an error occurred + * + * @since version 3.0 + */ + @Nullable + @NativeType("char const *") + public static String glfwGetMonitorName(@NativeType("GLFWmonitor *") long monitor) { + long __result = nglfwGetMonitorName(monitor); + return memUTF8Safe(__result); + } + + // --- [ glfwSetMonitorUserPointer ] --- + + /** + * Sets the user pointer of the specified monitor. + * + *

    This function sets the user-defined pointer of the specified monitor. The current value is retained until the monitor is disconnected. The initial + * value is {@code NULL}.

    + * + *

    This function may be called from the monitor callback, even for a monitor that is being disconnected.

    + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param monitor the monitor whose pointer to set + * @param pointer the new value + * + * @since version 3.3 + */ + public static void glfwSetMonitorUserPointer(@NativeType("GLFWmonitor *") long monitor, @NativeType("void *") long pointer) { + long __functionAddress = Functions.SetMonitorUserPointer; + if (CHECKS) { + check(monitor); + check(pointer); + } + invokePPV(monitor, pointer, __functionAddress); + } + + // --- [ glfwGetMonitorUserPointer ] --- + + /** + * Returns the user pointer of the specified monitor. + * + *

    This function returns the current value of the user-defined pointer of the specified monitor. The initial value is {@code NULL}.

    + * + *

    This function may be called from the monitor callback, even for a monitor that is being disconnected.

    + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param monitor the monitor whose pointer to return + * + * @since version 3.3 + */ + @NativeType("void *") + public static long glfwGetMonitorUserPointer(@NativeType("GLFWmonitor *") long monitor) { + long __functionAddress = Functions.GetMonitorUserPointer; + if (CHECKS) { + check(monitor); + } + return invokePP(monitor, __functionAddress); + } + + // --- [ glfwSetMonitorCallback ] --- + + /** Unsafe version of: {@link #glfwSetMonitorCallback SetMonitorCallback} */ + public static long nglfwSetMonitorCallback(long cbfun) { + long __functionAddress = Functions.SetMonitorCallback; + return invokePP(cbfun, __functionAddress); + } + + /** + * Sets the monitor configuration callback, or removes the currently set callback. This is called when a monitor is connected to or disconnected from the + * system. + * + *

    This function must only be called from the main thread.

    + * + * @param cbfun the new callback, or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set or the library had not been initialized + * + * @since version 3.0 + */ + @Nullable + @NativeType("GLFWmonitorfun") + public static GLFWMonitorCallback glfwSetMonitorCallback(@Nullable @NativeType("GLFWmonitorfun") GLFWMonitorCallbackI cbfun) { + return GLFWMonitorCallback.createSafe(nglfwSetMonitorCallback(memAddressSafe(cbfun))); + } + + // --- [ glfwGetVideoModes ] --- + + /** + * Unsafe version of: {@link #glfwGetVideoModes GetVideoModes} + * + * @param count where to store the number of video modes in the returned array. This is set to zero if an error occurred. + */ + public static long nglfwGetVideoModes(long monitor, long count) { + long __functionAddress = Functions.GetVideoModes; + if (CHECKS) { + check(monitor); + } + return invokePPP(monitor, count, __functionAddress); + } + + /** + * Returns an array of all video modes supported by the specified monitor. + * + *

    The returned array is sorted in ascending order, first by color bit depth (the sum of all channel depths), then by resolution area (the product of + * width and height), then resolution width and finally by refresh rate.

    + * + *

    The returned array is allocated and freed by GLFW. You should not free it yourself. It is valid until the specified monitor is disconnected, this + * function is called again for that monitor or the library is terminated.

    + * + *

    This function must only be called from the main thread.

    + * + * @param monitor the monitor to query + * + * @return an array of video modes, or {@code NULL} if an error occurred + * + * @since version 1.0 + */ + @Nullable + @NativeType("GLFWvidmode const *") + public static GLFWVidMode.Buffer glfwGetVideoModes(@NativeType("GLFWmonitor *") long monitor) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer count = stack.callocInt(1); + try { + long __result = nglfwGetVideoModes(monitor, memAddress(count)); + return GLFWVidMode.createSafe(__result, count.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glfwGetVideoMode ] --- + + /** Unsafe version of: {@link #glfwGetVideoMode GetVideoMode} */ + public static long nglfwGetVideoMode(long monitor) { + long __functionAddress = Functions.GetVideoMode; + if (CHECKS) { + check(monitor); + } + return invokePP(monitor, __functionAddress); + } + + /** + * Returns the current video mode of the specified monitor. If you have created a full screen window for that monitor, the return value will depend on + * whether that window is iconified. + * + *

    The returned array is allocated and freed by GLFW. You should not free it yourself. It is valid until the specified monitor is disconnected or the + * library is terminated.

    + * + *

    This function must only be called from the main thread.

    + * + * @param monitor the monitor to query + * + * @return the current mode of the monitor, or {@code NULL} if an error occurred + * + * @since version 3.0 + */ + @Nullable + @NativeType("GLFWvidmode const *") + public static GLFWVidMode glfwGetVideoMode(@NativeType("GLFWmonitor *") long monitor) { + return glfwVidMode; + } + + // --- [ glfwSetGamma ] --- + + /** + * Generates a gamma ramp and sets it for the specified monitor. + * + *

    This function generates an appropriately sized gamma ramp from the specified exponent and then calls {@link #glfwSetGammaRamp SetGammaRamp} with it. The value must be a + * finite number greater than zero.

    + * + *

    The software controlled gamma ramp is applied in addition to the hardware gamma correction, which today is usually an approximation of sRGB + * gamma. This means that setting a perfectly linear ramp, or gamma 1.0, will produce the default (usually sRGB-like) behavior.

    + * + *

    For gamma correct rendering with OpenGL or OpenGL ES, see the {@link #GLFW_SRGB_CAPABLE SRGB_CAPABLE} hint.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: Gamma handling is a privileged protocol, this function will thus never be implemented and emits {@link #GLFW_PLATFORM_ERROR PLATFORM_ERROR}.
    • + *
    + * + * @param monitor the monitor whose gamma ramp to set + * @param gamma the desired exponent + * + * @since version 3.0 + */ + public static void glfwSetGamma(@NativeType("GLFWmonitor *") long monitor, float gamma) { + long __functionAddress = Functions.SetGamma; + if (CHECKS) { + check(monitor); + } + invokePV(monitor, gamma, __functionAddress); + } + + // --- [ glfwGetGammaRamp ] --- + + /** Unsafe version of: {@link #glfwGetGammaRamp GetGammaRamp} */ + public static long nglfwGetGammaRamp(long monitor) { + long __functionAddress = Functions.GetGammaRamp; + if (CHECKS) { + check(monitor); + } + return invokePP(monitor, __functionAddress); + } + + /** + * Returns the current gamma ramp of the specified monitor. + * + *

    The returned structure and its arrays are allocated and freed by GLFW. You should not free them yourself. They are valid until the specified monitor is + * disconnected, this function is called again for that monitor or the library is terminated.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: Gamma handling is a privileged protocol, this function will thus never be implemented and emits {@link #GLFW_PLATFORM_ERROR PLATFORM_ERROR} while returning + * {@code NULL}.
    • + *
    + * + * @param monitor the monitor to query + * + * @return the current gamma ramp, or {@code NULL} if an error occurred + * + * @since version 3.0 + */ + @Nullable + @NativeType("GLFWgammaramp const *") + public static GLFWGammaRamp glfwGetGammaRamp(@NativeType("GLFWmonitor *") long monitor) { + long __result = nglfwGetGammaRamp(monitor); + return GLFWGammaRamp.createSafe(__result); + } + + // --- [ glfwSetGammaRamp ] --- + + /** Unsafe version of: {@link #glfwSetGammaRamp SetGammaRamp} */ + public static void nglfwSetGammaRamp(long monitor, long ramp) { + long __functionAddress = Functions.SetGammaRamp; + if (CHECKS) { + check(monitor); + GLFWGammaRamp.validate(ramp); + } + invokePPV(monitor, ramp, __functionAddress); + } + + /** + * Sets the current gamma ramp for the specified monitor. + * + *

    This function sets the current gamma ramp for the specified monitor. The original gamma ramp for that monitor is saved by GLFW the first time this + * function is called and is restored by {@link #glfwTerminate Terminate}.

    + * + *

    The software controlled gamma ramp is applied in addition to the hardware gamma correction, which today is usually an approximation of sRGB + * gamma. This means that setting a perfectly linear ramp, or gamma 1.0, will produce the default (usually sRGB-like) behavior.

    + * + *

    For gamma correct rendering with OpenGL or OpenGL ES, see the {@link #GLFW_SRGB_CAPABLE SRGB_CAPABLE} hint.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • The size of the specified gamma ramp should match the size of the current ramp for that monitor.
    • + *
    • Windows: The gamma ramp size must be 256.
    • + *
    • Wayland: Gamma handling is a privileged protocol, this function will thus never be implemented and emits {@link #GLFW_PLATFORM_ERROR PLATFORM_ERROR}.
    • + *
    • The specified gamma ramp is copied before this function returns.
    • + *
    + * + * @param monitor the monitor whose gamma ramp to set + * @param ramp the gamma ramp to use + * + * @since version 3.0 + */ + public static void glfwSetGammaRamp(@NativeType("GLFWmonitor *") long monitor, @NativeType("GLFWgammaramp const *") GLFWGammaRamp ramp) { + nglfwSetGammaRamp(monitor, ramp.address()); + } + + // --- [ glfwDefaultWindowHints ] --- + + /** + * Resets all window hints to their default values. See {@link #glfwWindowHint WindowHint} for details. + * + *

    This function must only be called from the main thread.

    + * + * @since version 3.0 + */ + public static void glfwDefaultWindowHints() { + long __functionAddress = Functions.DefaultWindowHints; + invokeV(__functionAddress); + } + + // --- [ glfwWindowHint ] --- + + /** + * Sets hints for the next call to {@link #glfwCreateWindow CreateWindow}. The hints, once set, retain their values until changed by a call to this function or + * {@link #glfwDefaultWindowHints DefaultWindowHints}, or until the library is terminated. + * + *

    Only integer value hints can be set with this function. String value hints are set with {@link #glfwWindowHintString WindowHintString}.

    + * + *

    This function does not check whether the specified hint values are valid. If you set hints to invalid values this will instead be reported by the next + * call to {@link #glfwCreateWindow CreateWindow}.

    + * + *

    Some hints are platform specific. These may be set on any platform but they will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions.

    + * + *
    Supported and default values
    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    NameDefault valueSupported values
    {@link #GLFW_RESIZABLE RESIZABLE}{@link #GLFW_TRUE TRUE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_VISIBLE VISIBLE}{@link #GLFW_TRUE TRUE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_DECORATED DECORATED}{@link #GLFW_TRUE TRUE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_FOCUSED FOCUSED}{@link #GLFW_TRUE TRUE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_AUTO_ICONIFY AUTO_ICONIFY}{@link #GLFW_TRUE TRUE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_FLOATING FLOATING}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_MAXIMIZED MAXIMIZED}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_CENTER_CURSOR CENTER_CURSOR}{@link #GLFW_TRUE TRUE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_TRANSPARENT_FRAMEBUFFER TRANSPARENT_FRAMEBUFFER}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_FOCUS_ON_SHOW FOCUS_ON_SHOW}{@link #GLFW_TRUE TRUE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_SCALE_TO_MONITOR SCALE_TO_MONITOR}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_MOUSE_PASSTHROUGH MOUSE_PASSTHROUGH}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_RED_BITS RED_BITS}80 to {@link Integer#MAX_VALUE} or {@link #GLFW_DONT_CARE DONT_CARE}
    {@link #GLFW_GREEN_BITS GREEN_BITS}80 to {@link Integer#MAX_VALUE} or {@link #GLFW_DONT_CARE DONT_CARE}
    {@link #GLFW_BLUE_BITS BLUE_BITS}80 to {@link Integer#MAX_VALUE} or {@link #GLFW_DONT_CARE DONT_CARE}
    {@link #GLFW_ALPHA_BITS ALPHA_BITS}80 to {@link Integer#MAX_VALUE} or {@link #GLFW_DONT_CARE DONT_CARE}
    {@link #GLFW_DEPTH_BITS DEPTH_BITS}240 to {@link Integer#MAX_VALUE} or {@link #GLFW_DONT_CARE DONT_CARE}
    {@link #GLFW_STENCIL_BITS STENCIL_BITS}80 to {@link Integer#MAX_VALUE} or {@link #GLFW_DONT_CARE DONT_CARE}
    {@link #GLFW_ACCUM_RED_BITS ACCUM_RED_BITS}00 to {@link Integer#MAX_VALUE} or {@link #GLFW_DONT_CARE DONT_CARE}
    {@link #GLFW_ACCUM_GREEN_BITS ACCUM_GREEN_BITS}00 to {@link Integer#MAX_VALUE} or {@link #GLFW_DONT_CARE DONT_CARE}
    {@link #GLFW_ACCUM_BLUE_BITS ACCUM_BLUE_BITS}00 to {@link Integer#MAX_VALUE} or {@link #GLFW_DONT_CARE DONT_CARE}
    {@link #GLFW_ACCUM_ALPHA_BITS ACCUM_ALPHA_BITS}00 to {@link Integer#MAX_VALUE} or {@link #GLFW_DONT_CARE DONT_CARE}
    {@link #GLFW_AUX_BUFFERS AUX_BUFFERS}00 to {@link Integer#MAX_VALUE}
    {@link #GLFW_SAMPLES SAMPLES}00 to {@link Integer#MAX_VALUE}
    {@link #GLFW_REFRESH_RATE REFRESH_RATE}{@link #GLFW_DONT_CARE DONT_CARE}0 to {@link Integer#MAX_VALUE} or {@link #GLFW_DONT_CARE DONT_CARE}
    {@link #GLFW_STEREO STEREO}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_SRGB_CAPABLE SRGB_CAPABLE}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_DOUBLEBUFFER DOUBLEBUFFER}{@link #GLFW_TRUE TRUE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_CLIENT_API CLIENT_API}{@link #GLFW_OPENGL_API OPENGL_API}{@link #GLFW_NO_API NO_API} {@link #GLFW_OPENGL_API OPENGL_API} {@link #GLFW_OPENGL_ES_API OPENGL_ES_API}
    {@link #GLFW_CONTEXT_CREATION_API CONTEXT_CREATION_API}{@link #GLFW_NATIVE_CONTEXT_API NATIVE_CONTEXT_API}{@link #GLFW_NATIVE_CONTEXT_API NATIVE_CONTEXT_API} {@link #GLFW_EGL_CONTEXT_API EGL_CONTEXT_API} {@link #GLFW_OSMESA_CONTEXT_API OSMESA_CONTEXT_API}
    {@link #GLFW_CONTEXT_VERSION_MAJOR CONTEXT_VERSION_MAJOR}1Any valid major version number of the chosen client API
    {@link #GLFW_CONTEXT_VERSION_MINOR CONTEXT_VERSION_MINOR}0Any valid minor version number of the chosen client API
    {@link #GLFW_CONTEXT_ROBUSTNESS CONTEXT_ROBUSTNESS}{@link #GLFW_NO_ROBUSTNESS NO_ROBUSTNESS}{@link #GLFW_NO_ROBUSTNESS NO_ROBUSTNESS} {@link #GLFW_NO_RESET_NOTIFICATION NO_RESET_NOTIFICATION} {@link #GLFW_LOSE_CONTEXT_ON_RESET LOSE_CONTEXT_ON_RESET}
    {@link #GLFW_CONTEXT_RELEASE_BEHAVIOR CONTEXT_RELEASE_BEHAVIOR}{@link #GLFW_ANY_RELEASE_BEHAVIOR ANY_RELEASE_BEHAVIOR}{@link #GLFW_ANY_RELEASE_BEHAVIOR ANY_RELEASE_BEHAVIOR} {@link #GLFW_RELEASE_BEHAVIOR_FLUSH RELEASE_BEHAVIOR_FLUSH} {@link #GLFW_RELEASE_BEHAVIOR_NONE RELEASE_BEHAVIOR_NONE}
    {@link #GLFW_CONTEXT_NO_ERROR CONTEXT_NO_ERROR}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_OPENGL_FORWARD_COMPAT OPENGL_FORWARD_COMPAT}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_OPENGL_DEBUG_CONTEXT OPENGL_DEBUG_CONTEXT}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_OPENGL_PROFILE OPENGL_PROFILE}{@link #GLFW_OPENGL_ANY_PROFILE OPENGL_ANY_PROFILE}{@link #GLFW_OPENGL_ANY_PROFILE OPENGL_ANY_PROFILE} {@link #GLFW_OPENGL_CORE_PROFILE OPENGL_CORE_PROFILE} {@link #GLFW_OPENGL_COMPAT_PROFILE OPENGL_COMPAT_PROFILE}
    {@link #GLFW_WIN32_KEYBOARD_MENU WIN32_KEYBOARD_MENU}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_COCOA_RETINA_FRAMEBUFFER COCOA_RETINA_FRAMEBUFFER}{@link #GLFW_TRUE TRUE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    {@link #GLFW_COCOA_GRAPHICS_SWITCHING COCOA_GRAPHICS_SWITCHING}{@link #GLFW_FALSE FALSE}{@link #GLFW_TRUE TRUE} or {@link #GLFW_FALSE FALSE}
    + * + *

    This function must only be called from the main thread.

    + * + * @param hint the window hint to set. One of:
    {@link #GLFW_FOCUSED FOCUSED}{@link #GLFW_RESIZABLE RESIZABLE}{@link #GLFW_VISIBLE VISIBLE}{@link #GLFW_DECORATED DECORATED}{@link #GLFW_AUTO_ICONIFY AUTO_ICONIFY}
    {@link #GLFW_FLOATING FLOATING}{@link #GLFW_MAXIMIZED MAXIMIZED}{@link #GLFW_CENTER_CURSOR CENTER_CURSOR}{@link #GLFW_TRANSPARENT_FRAMEBUFFER TRANSPARENT_FRAMEBUFFER}{@link #GLFW_FOCUS_ON_SHOW FOCUS_ON_SHOW}
    {@link #GLFW_MOUSE_PASSTHROUGH MOUSE_PASSTHROUGH}{@link #GLFW_POSITION_X POSITION_X}{@link #GLFW_POSITION_Y POSITION_Y}{@link #GLFW_CLIENT_API CLIENT_API}{@link #GLFW_CONTEXT_VERSION_MAJOR CONTEXT_VERSION_MAJOR}
    {@link #GLFW_CONTEXT_VERSION_MINOR CONTEXT_VERSION_MINOR}{@link #GLFW_CONTEXT_ROBUSTNESS CONTEXT_ROBUSTNESS}{@link #GLFW_OPENGL_FORWARD_COMPAT OPENGL_FORWARD_COMPAT}{@link #GLFW_CONTEXT_DEBUG CONTEXT_DEBUG}{@link #GLFW_OPENGL_DEBUG_CONTEXT OPENGL_DEBUG_CONTEXT}
    {@link #GLFW_OPENGL_PROFILE OPENGL_PROFILE}{@link #GLFW_CONTEXT_RELEASE_BEHAVIOR CONTEXT_RELEASE_BEHAVIOR}{@link #GLFW_CONTEXT_NO_ERROR CONTEXT_NO_ERROR}{@link #GLFW_CONTEXT_CREATION_API CONTEXT_CREATION_API}{@link #GLFW_SCALE_TO_MONITOR SCALE_TO_MONITOR}
    {@link #GLFW_RED_BITS RED_BITS}{@link #GLFW_GREEN_BITS GREEN_BITS}{@link #GLFW_BLUE_BITS BLUE_BITS}{@link #GLFW_ALPHA_BITS ALPHA_BITS}{@link #GLFW_DEPTH_BITS DEPTH_BITS}
    {@link #GLFW_STENCIL_BITS STENCIL_BITS}{@link #GLFW_ACCUM_RED_BITS ACCUM_RED_BITS}{@link #GLFW_ACCUM_GREEN_BITS ACCUM_GREEN_BITS}{@link #GLFW_ACCUM_BLUE_BITS ACCUM_BLUE_BITS}{@link #GLFW_ACCUM_ALPHA_BITS ACCUM_ALPHA_BITS}
    {@link #GLFW_AUX_BUFFERS AUX_BUFFERS}{@link #GLFW_STEREO STEREO}{@link #GLFW_SAMPLES SAMPLES}{@link #GLFW_SRGB_CAPABLE SRGB_CAPABLE}{@link #GLFW_REFRESH_RATE REFRESH_RATE}
    {@link #GLFW_DOUBLEBUFFER DOUBLEBUFFER}{@link #GLFW_COCOA_RETINA_FRAMEBUFFER COCOA_RETINA_FRAMEBUFFER}{@link #GLFW_COCOA_GRAPHICS_SWITCHING COCOA_GRAPHICS_SWITCHING}
    + * @param value the new value of the window hint + * + * @since version 2.2 + */ + public static void glfwWindowHint(int hint, int value) { + long __functionAddress = Functions.WindowHint; + invokeV(hint, value, __functionAddress); + } + + // --- [ glfwWindowHintString ] --- + + /** Unsafe version of: {@link #glfwWindowHintString WindowHintString} */ + public static void nglfwWindowHintString(int hint, long value) { + long __functionAddress = Functions.WindowHintString; + invokePV(hint, value, __functionAddress); + } + + /** + * Sets the specified window hint to the desired value. + * + *

    This function sets hints for the next call to {@link #glfwCreateWindow CreateWindow}. The hints, once set, retain their values until changed by a call to this function or + * {@link #glfwDefaultWindowHints DefaultWindowHints}, or until the library is terminated.

    + * + *

    Only string type hints can be set with this function. Integer value hints are set with {@link #glfwWindowHint WindowHint}.

    + * + *

    This function does not check whether the specified hint values are valid. If you set hints to invalid values this will instead be reported by the next + * call to {@link #glfwCreateWindow CreateWindow}.

    + * + *

    Some hints are platform specific. These may be set on any platform but they will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions.

    + * + *
    Supported and default values
    + * + * + * + * + * + * + * + *
    NameDefault valueSupported values
    {@link #GLFW_COCOA_FRAME_NAME COCOA_FRAME_NAME}""A UTF-8 encoded frame autosave name
    {@link #GLFW_X11_CLASS_NAME X11_CLASS_NAME}""An ASCII encoded {@code WM_CLASS} class name
    {@link #GLFW_X11_INSTANCE_NAME X11_INSTANCE_NAME}""An ASCII encoded {@code WM_CLASS} instance name
    {@link #GLFW_WAYLAND_APP_ID WAYLAND_APP_ID}""An ASCII encoded Wayland {@code app_id} name
    + * + *

    This function must only be called from the main thread.

    + * + * @param hint the window hint to set. One of:
    {@link #GLFW_COCOA_FRAME_NAME COCOA_FRAME_NAME}{@link #GLFW_X11_CLASS_NAME X11_CLASS_NAME}{@link #GLFW_X11_INSTANCE_NAME X11_INSTANCE_NAME}{@link #GLFW_WAYLAND_APP_ID WAYLAND_APP_ID}
    + * @param value the new value of the window hint. The specified string is copied before this function returns. + * + * @since version 3.3 + */ + public static void glfwWindowHintString(int hint, @NativeType("char const *") ByteBuffer value) { + if (CHECKS) { + checkNT1(value); + } + nglfwWindowHintString(hint, memAddress(value)); + } + + /** + * Sets the specified window hint to the desired value. + * + *

    This function sets hints for the next call to {@link #glfwCreateWindow CreateWindow}. The hints, once set, retain their values until changed by a call to this function or + * {@link #glfwDefaultWindowHints DefaultWindowHints}, or until the library is terminated.

    + * + *

    Only string type hints can be set with this function. Integer value hints are set with {@link #glfwWindowHint WindowHint}.

    + * + *

    This function does not check whether the specified hint values are valid. If you set hints to invalid values this will instead be reported by the next + * call to {@link #glfwCreateWindow CreateWindow}.

    + * + *

    Some hints are platform specific. These may be set on any platform but they will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions.

    + * + *
    Supported and default values
    + * + * + * + * + * + * + * + *
    NameDefault valueSupported values
    {@link #GLFW_COCOA_FRAME_NAME COCOA_FRAME_NAME}""A UTF-8 encoded frame autosave name
    {@link #GLFW_X11_CLASS_NAME X11_CLASS_NAME}""An ASCII encoded {@code WM_CLASS} class name
    {@link #GLFW_X11_INSTANCE_NAME X11_INSTANCE_NAME}""An ASCII encoded {@code WM_CLASS} instance name
    {@link #GLFW_WAYLAND_APP_ID WAYLAND_APP_ID}""An ASCII encoded Wayland {@code app_id} name
    + * + *

    This function must only be called from the main thread.

    + * + * @param hint the window hint to set. One of:
    {@link #GLFW_COCOA_FRAME_NAME COCOA_FRAME_NAME}{@link #GLFW_X11_CLASS_NAME X11_CLASS_NAME}{@link #GLFW_X11_INSTANCE_NAME X11_INSTANCE_NAME}{@link #GLFW_WAYLAND_APP_ID WAYLAND_APP_ID}
    + * @param value the new value of the window hint. The specified string is copied before this function returns. + * + * @since version 3.3 + */ + public static void glfwWindowHintString(int hint, @NativeType("char const *") CharSequence value) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(value, true); + long valueEncoded = stack.getPointerAddress(); + nglfwWindowHintString(hint, valueEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glfwCreateWindow ] --- + + /** Unsafe version of: {@link #glfwCreateWindow CreateWindow} */ + public static long nglfwCreateWindow(int width, int height, long title, long monitor, long share) { + long __functionAddress = Functions.CreateWindow; + return invokePPPP(width, height, title, monitor, share, __functionAddress); + } + + /** + * Creates a window and its associated OpenGL or OpenGL ES context. Most of the options controlling how the window and its context should be created are + * specified with window hints. + * + *

    Successful creation does not change which context is current. Before you can use the newly created context, you need to make it current. For information + * about the {@code share} parameter, see context sharing.

    + * + *

    The created window, framebuffer and context may differ from what you requested, as not all parameters and hints are hard constraints. This includes the + * size of the window, especially for full screen windows. To query the actual attributes of the created window, framebuffer and context, use queries like + * {@link #glfwGetWindowAttrib GetWindowAttrib} and {@link #glfwGetWindowSize GetWindowSize} and {@link #glfwGetFramebufferSize GetFramebufferSize}.

    + * + *

    To create a full screen window, you need to specify the monitor the window will cover. If no monitor is specified, the window will be windowed mode. + * Unless you have a way for the user to choose a specific monitor, it is recommended that you pick the primary monitor. For more information on how to + * query connected monitors, see monitors.

    + * + *

    For full screen windows, the specified size becomes the resolution of the window's desired video mode. As long as a full screen window is not + * iconified, the supported video mode most closely matching the desired video mode is set for the specified monitor. For more information about full + * screen windows, including the creation of so called windowed full screen or borderless full screen windows, see + * full screen.

    + * + *

    Once you have created the window, you can switch it between windowed and full screen mode with {@link #glfwSetWindowMonitor SetWindowMonitor}. If the window has an OpenGL or + * OpenGL ES context, it will be unaffected.

    + * + *

    By default, newly created windows use the placement recommended by the window system. To create the window at a specific position, set the {@link #GLFW_POSITION_X POSITION_X} + * and {@link #GLFW_POSITION_Y POSITION_Y} window hints before creation. To restore the default behavior, set either or both hints back to {@link #GLFW_ANY_POSITION ANY_POSITION}.

    + * + *

    As long as at least one full screen window is not iconified, the screensaver is prohibited from starting.

    + * + *

    Window systems put limits on window sizes. Very large or very small window dimensions may be overridden by the window system on creation. Check the + * actual size after creation.

    + * + *

    The swap interval is not set during window creation and the initial value may vary + * depending on driver settings and defaults.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Windows: Window creation will fail if the Microsoft GDI software OpenGL implementation is the only one available.
    • + *
    • Windows: If the executable has an icon resource named {@code GLFW_ICON}, it will be set as the initial icon for the window. If no such icon + * is present, the {@code IDI_APPLICATION} icon will be used instead. To set a different icon, see {@link #glfwSetWindowIcon SetWindowIcon}.
    • + *
    • Windows: The context to share resources with may not be current on any other thread.
    • + *
    • The OS only supports core profile contexts for OpenGL versions 3.2 and later. Before creating an OpenGL context of version 3.2 or later you must + * set the {@link #GLFW_OPENGL_PROFILE OPENGL_PROFILE} hint accordingly. OpenGL 3.0 and 3.1 contexts are not supported at all on macOS.
    • + *
    • macOS: The GLFW window has no icon, as it is not a document window, but the dock icon will be the same as the application bundle's icon. For + * more information on bundles, see the + * Bundle Programming Guide in the Mac + * Developer Library.
    • + *
    • macOS: On macOS 10.10 and later the window frame will not be rendered at full resolution on Retina displays unless the + * {@link #GLFW_COCOA_RETINA_FRAMEBUFFER COCOA_RETINA_FRAMEBUFFER} hint is {@link #GLFW_TRUE TRUE} and the {@code NSHighResolutionCapable} key is enabled in the application bundle's {@code Info.plist}. For + * more information, see High Resolution Guidelines for macOS in the Mac Developer Library.
    • + *
    • macOS: When activating frame autosaving with {@link #GLFW_COCOA_FRAME_NAME COCOA_FRAME_NAME}, the specified window size and position may be overridden by previously saved + * values.
    • + *
    • X11: Some window managers will not respect the placement of initially hidden windows.
    • + *
    • X11: Due to the asynchronous nature of X11, it may take a moment for a window to reach its requested state. This means you may not be able + * to query the final size, position or other attributes directly after window creation.
    • + *
    • X11: The class part of the {@code WM_CLASS} window property will by default be set to the window title passed to this function. The instance + * part will use the contents of the {@code RESOURCE_NAME} environment variable, if present and not empty, or fall back to the window title. Set the + * {@link #GLFW_X11_CLASS_NAME X11_CLASS_NAME} and {@link #GLFW_X11_INSTANCE_NAME X11_INSTANCE_NAME} window hints to override this.
    • + *
    • Wayland: Compositors should implement the xdg-decoration protocol for GLFW to decorate the window properly. If this protocol isn't + * supported, or if the compositor prefers client-side decorations, a very simple fallback frame will be drawn using the {@code wp_viewporter} + * protocol. A compositor can still emit close, maximize or fullscreen events, using for instance a keybind mechanism. If neither of these protocols + * is supported, the window won't be decorated.
    • + *
    • Wayland: A full screen window will not attempt to change the mode, no matter what the requested size or refresh rate.
    • + *
    • Wayland: Screensaver inhibition requires the idle-inhibit protocol to be implemented in the user's compositor.
    • + *
    + * + * @param width the desired width, in screen coordinates, of the window + * @param height the desired height, in screen coordinates, of the window + * @param title initial, UTF-8 encoded window title + * @param monitor the monitor to use for fullscreen mode, or {@code NULL} for windowed mode + * @param share the window whose context to share resources with, or {@code NULL} to not share resources + * + * @return the handle of the created window, or {@code NULL} if an error occurred + * + * @since version 1.0 + */ + @NativeType("GLFWwindow *") + public static long glfwCreateWindow(int width, int height, @NativeType("char const *") ByteBuffer title, @NativeType("GLFWmonitor *") long monitor, @NativeType("GLFWwindow *") long share) { + if (CHECKS) { + checkNT1(title); + } + return nglfwCreateWindow(width, height, memAddress(title), monitor, share); + } + + /** + * Creates a window and its associated OpenGL or OpenGL ES context. Most of the options controlling how the window and its context should be created are + * specified with window hints. + * + *

    Successful creation does not change which context is current. Before you can use the newly created context, you need to make it current. For information + * about the {@code share} parameter, see context sharing.

    + * + *

    The created window, framebuffer and context may differ from what you requested, as not all parameters and hints are hard constraints. This includes the + * size of the window, especially for full screen windows. To query the actual attributes of the created window, framebuffer and context, use queries like + * {@link #glfwGetWindowAttrib GetWindowAttrib} and {@link #glfwGetWindowSize GetWindowSize} and {@link #glfwGetFramebufferSize GetFramebufferSize}.

    + * + *

    To create a full screen window, you need to specify the monitor the window will cover. If no monitor is specified, the window will be windowed mode. + * Unless you have a way for the user to choose a specific monitor, it is recommended that you pick the primary monitor. For more information on how to + * query connected monitors, see monitors.

    + * + *

    For full screen windows, the specified size becomes the resolution of the window's desired video mode. As long as a full screen window is not + * iconified, the supported video mode most closely matching the desired video mode is set for the specified monitor. For more information about full + * screen windows, including the creation of so called windowed full screen or borderless full screen windows, see + * full screen.

    + * + *

    Once you have created the window, you can switch it between windowed and full screen mode with {@link #glfwSetWindowMonitor SetWindowMonitor}. If the window has an OpenGL or + * OpenGL ES context, it will be unaffected.

    + * + *

    By default, newly created windows use the placement recommended by the window system. To create the window at a specific position, set the {@link #GLFW_POSITION_X POSITION_X} + * and {@link #GLFW_POSITION_Y POSITION_Y} window hints before creation. To restore the default behavior, set either or both hints back to {@link #GLFW_ANY_POSITION ANY_POSITION}.

    + * + *

    As long as at least one full screen window is not iconified, the screensaver is prohibited from starting.

    + * + *

    Window systems put limits on window sizes. Very large or very small window dimensions may be overridden by the window system on creation. Check the + * actual size after creation.

    + * + *

    The swap interval is not set during window creation and the initial value may vary + * depending on driver settings and defaults.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Windows: Window creation will fail if the Microsoft GDI software OpenGL implementation is the only one available.
    • + *
    • Windows: If the executable has an icon resource named {@code GLFW_ICON}, it will be set as the initial icon for the window. If no such icon + * is present, the {@code IDI_APPLICATION} icon will be used instead. To set a different icon, see {@link #glfwSetWindowIcon SetWindowIcon}.
    • + *
    • Windows: The context to share resources with may not be current on any other thread.
    • + *
    • The OS only supports core profile contexts for OpenGL versions 3.2 and later. Before creating an OpenGL context of version 3.2 or later you must + * set the {@link #GLFW_OPENGL_PROFILE OPENGL_PROFILE} hint accordingly. OpenGL 3.0 and 3.1 contexts are not supported at all on macOS.
    • + *
    • macOS: The GLFW window has no icon, as it is not a document window, but the dock icon will be the same as the application bundle's icon. For + * more information on bundles, see the + * Bundle Programming Guide in the Mac + * Developer Library.
    • + *
    • macOS: On macOS 10.10 and later the window frame will not be rendered at full resolution on Retina displays unless the + * {@link #GLFW_COCOA_RETINA_FRAMEBUFFER COCOA_RETINA_FRAMEBUFFER} hint is {@link #GLFW_TRUE TRUE} and the {@code NSHighResolutionCapable} key is enabled in the application bundle's {@code Info.plist}. For + * more information, see High Resolution Guidelines for macOS in the Mac Developer Library.
    • + *
    • macOS: When activating frame autosaving with {@link #GLFW_COCOA_FRAME_NAME COCOA_FRAME_NAME}, the specified window size and position may be overridden by previously saved + * values.
    • + *
    • X11: Some window managers will not respect the placement of initially hidden windows.
    • + *
    • X11: Due to the asynchronous nature of X11, it may take a moment for a window to reach its requested state. This means you may not be able + * to query the final size, position or other attributes directly after window creation.
    • + *
    • X11: The class part of the {@code WM_CLASS} window property will by default be set to the window title passed to this function. The instance + * part will use the contents of the {@code RESOURCE_NAME} environment variable, if present and not empty, or fall back to the window title. Set the + * {@link #GLFW_X11_CLASS_NAME X11_CLASS_NAME} and {@link #GLFW_X11_INSTANCE_NAME X11_INSTANCE_NAME} window hints to override this.
    • + *
    • Wayland: Compositors should implement the xdg-decoration protocol for GLFW to decorate the window properly. If this protocol isn't + * supported, or if the compositor prefers client-side decorations, a very simple fallback frame will be drawn using the {@code wp_viewporter} + * protocol. A compositor can still emit close, maximize or fullscreen events, using for instance a keybind mechanism. If neither of these protocols + * is supported, the window won't be decorated.
    • + *
    • Wayland: A full screen window will not attempt to change the mode, no matter what the requested size or refresh rate.
    • + *
    • Wayland: Screensaver inhibition requires the idle-inhibit protocol to be implemented in the user's compositor.
    • + *
    + * + * @param width the desired width, in screen coordinates, of the window + * @param height the desired height, in screen coordinates, of the window + * @param title initial, UTF-8 encoded window title + * @param monitor the monitor to use for fullscreen mode, or {@code NULL} for windowed mode + * @param share the window whose context to share resources with, or {@code NULL} to not share resources + * + * @return the handle of the created window, or {@code NULL} if an error occurred + * + * @since version 1.0 + */ + @NativeType("GLFWwindow *") + public static long glfwCreateWindow(int width, int height, @NativeType("char const *") CharSequence title, @NativeType("GLFWmonitor *") long monitor, @NativeType("GLFWwindow *") long share) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(title, true); + long titleEncoded = stack.getPointerAddress(); + return nglfwCreateWindow(width, height, titleEncoded, monitor, share); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glfwDestroyWindow ] --- + + /** + * Destroys the specified window and its context. On calling this function, no further callbacks will be called for that window. + * + *

    If the context of the specified window is current on the main thread, it is detached before being destroyed.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • This function must not be called from a callback.
    • + *
    • The context of the specified window must not be current on any other thread when this function is called.
    • + *
    + * + * @param window the window to destroy + * + * @since version 1.0 + */ + public static void glfwDestroyWindow(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.DestroyWindow; + invokePV(window, __functionAddress); + } + + // --- [ glfwWindowShouldClose ] --- + + /** + * Returns the value of the close flag of the specified window. + * + *

    This function may be called from any thread.

    + * + * @param window the window to query + * + * @return the value of the close flag + * + * @since version 3.0 + */ + @NativeType("int") + public static boolean glfwWindowShouldClose(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.WindowShouldClose; + if (CHECKS) { + check(window); + } + return invokePI(window, __functionAddress) != 0; + } + + // --- [ glfwSetWindowShouldClose ] --- + + /** + * Sets the value of the close flag of the specified window. This can be used to override the user's attempt to close the window, or to signal that it + * should be closed. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param window the window whose flag to change + * @param value the new value + * + * @since version 3.0 + */ + public static void glfwSetWindowShouldClose(@NativeType("GLFWwindow *") long window, @NativeType("int") boolean value) { + long __functionAddress = Functions.SetWindowShouldClose; + if (CHECKS) { + check(window); + } + invokePV(window, value ? 1 : 0, __functionAddress); + } + + // --- [ glfwSetWindowTitle ] --- + + /** Unsafe version of: {@link #glfwSetWindowTitle SetWindowTitle} */ + public static void nglfwSetWindowTitle(long window, long title) { + long __functionAddress = Functions.SetWindowTitle; + if (CHECKS) { + check(window); + } + invokePPV(window, title, __functionAddress); + } + + /** + * Sets the window title, encoded as UTF-8, of the specified window. + * + *

    This function must only be called from the main thread.

    + * + *

    macOS: The window title will not be updated until the next time you process events.

    + * + * @param window the window whose title to change + * @param title the UTF-8 encoded window title + * + * @since version 1.0 + */ + public static void glfwSetWindowTitle(@NativeType("GLFWwindow *") long window, @NativeType("char const *") ByteBuffer title) { + if (CHECKS) { + checkNT1(title); + } + nglfwSetWindowTitle(window, memAddress(title)); + } + + /** + * Sets the window title, encoded as UTF-8, of the specified window. + * + *

    This function must only be called from the main thread.

    + * + *

    macOS: The window title will not be updated until the next time you process events.

    + * + * @param window the window whose title to change + * @param title the UTF-8 encoded window title + * + * @since version 1.0 + */ + public static void glfwSetWindowTitle(@NativeType("GLFWwindow *") long window, @NativeType("char const *") CharSequence title) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(title, true); + long titleEncoded = stack.getPointerAddress(); + nglfwSetWindowTitle(window, titleEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glfwSetWindowIcon ] --- + + /** + * Unsafe version of: {@link #glfwSetWindowIcon SetWindowIcon} + * + * @param count the number of images in the specified array, or zero to revert to the default window icon + */ + public static void nglfwSetWindowIcon(long window, int count, long images) { + long __functionAddress = Functions.SetWindowIcon; + if (CHECKS) { + check(window); + if (images != NULL) { Struct.validate(images, count, GLFWImage.SIZEOF, GLFWImage::validate); } + } + invokePPV(window, count, images, __functionAddress); + } + + /** + * Sets the icon for the specified window. + * + *

    This function sets the icon of the specified window. If passed an array of candidate images, those of or closest to the sizes desired by the system are + * selected. If no images are specified, the window reverts to its default icon.

    + * + *

    The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight bits per channel with the red channel first. They are arranged canonically as + * packed sequential rows, starting from the top-left corner.

    + * + *

    The desired image sizes varies depending on platform and system settings. The selected images will be rescaled as needed. Good sizes include 16x16, + * 32x32 and 48x48.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • The specified image data is copied before this function returns.
    • + *
    • macOS: Regular windows do not have icons on macOS. This function will emit {@link #GLFW_FEATURE_UNAVAILABLE FEATURE_UNAVAILABLE}. The dock icon will be the same as the + * application bundle's icon. For more information on bundles, see the Bundle Programming Guide in the Mac Developer Library.
    • + *
    • Wayland: There is no existing protocol to change an icon, the window will thus inherit the one defined in the application's desktop file. + * This function will emit {@link #GLFW_FEATURE_UNAVAILABLE FEATURE_UNAVAILABLE}.
    • + *
    + * + * @param window the window whose icon to set + * @param images the images to create the icon from. This is ignored if count is zero. + * + * @since version 3.2 + */ + public static void glfwSetWindowIcon(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWimage const *") GLFWImage.Buffer images) { + nglfwSetWindowIcon(window, remainingSafe(images), memAddressSafe(images)); + } + + // --- [ glfwGetWindowPos ] --- + + /** Unsafe version of: {@link #glfwGetWindowPos GetWindowPos} */ + public static void nglfwGetWindowPos(long window, long xpos, long ypos) { + long __functionAddress = Functions.GetWindowPos; + if (CHECKS) { + check(window); + } + invokePPPV(window, xpos, ypos, __functionAddress); + } + + /** + * Retrieves the position, in screen coordinates, of the upper-left corner of the content area of the specified window. + * + *

    Any or all of the position arguments may be {@code NULL}. If an error occurs, all non-{@code NULL} position arguments will be set to zero.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: There is no way for an application to retrieve the global position of its windows. This function will emit {@link #GLFW_FEATURE_UNAVAILABLE FEATURE_UNAVAILABLE}.
    • + *
    + * + * @param window the window to query + * @param xpos where to store the x-coordinate of the upper-left corner of the content area, or {@code NULL} + * @param ypos where to store the y-coordinate of the upper-left corner of the content area, or {@code NULL} + * + * @since version 3.0 + */ + public static void glfwGetWindowPos(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") IntBuffer xpos, @Nullable @NativeType("int *") IntBuffer ypos) { + if (CHECKS) { + checkSafe(xpos, 1); + checkSafe(ypos, 1); + } + nglfwGetWindowPos(window, memAddressSafe(xpos), memAddressSafe(ypos)); + } + + // --- [ glfwSetWindowPos ] --- + + /** + * Sets the position, in screen coordinates, of the upper-left corner of the content area of the specified windowed mode window. If the window is a full + * screen window, this function does nothing. + * + *

    Do not use this function to move an already visible window unless you have very good reasons for doing so, as it will confuse and annoy the + * user.

    + * + *

    The window manager may put limits on what positions are allowed. GLFW cannot and should not override these limits.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: There is no way for an application to set the global position of its windows. This function will emit {@link #GLFW_FEATURE_UNAVAILABLE FEATURE_UNAVAILABLE}.
    • + *
    + * + * @param window the window to query + * @param xpos the x-coordinate of the upper-left corner of the content area + * @param ypos the y-coordinate of the upper-left corner of the content area + * + * @since version 1.0 + */ + public static void glfwSetWindowPos(@NativeType("GLFWwindow *") long window, int xpos, int ypos) { + long __functionAddress = Functions.SetWindowPos; + if (CHECKS) { + check(window); + } + invokePV(window, xpos, ypos, __functionAddress); + } + + // --- [ glfwGetWindowSize ] --- + + /** Unsafe version of: {@link #glfwGetWindowSize GetWindowSize} */ + public static void nglfwGetWindowSize(long window, long width, long height) { + long __functionAddress = Functions.GetWindowSize; + if (CHECKS) { + check(window); + } + invokePPPV(window, width, height, __functionAddress); + } + + /** + * Retrieves the size, in screen coordinates, of the content area of the specified window. If you wish to retrieve the size of the framebuffer of the + * window in pixels, see {@link #glfwGetFramebufferSize GetFramebufferSize}. + * + *

    Any or all of the size arguments may be {@code NULL}. If an error occurs, all non-{@code NULL} size arguments will be set to zero.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose size to retrieve + * @param width where to store the width, in screen coordinates, of the content area, or {@code NULL} + * @param height where to store the height, in screen coordinates, of the content area, or {@code NULL} + * + * @since version 1.0 + */ + public static void glfwGetWindowSize(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") IntBuffer width, @Nullable @NativeType("int *") IntBuffer height) { + if (CHECKS) { + checkSafe(width, 1); + checkSafe(height, 1); + } + nglfwGetWindowSize(window, memAddressSafe(width), memAddressSafe(height)); + } + + // --- [ glfwSetWindowSizeLimits ] --- + + /** + * Sets the size limits of the content area of the specified window. If the window is full screen, the size limits only take effect if once it is made + * windowed. If the window is not resizable, this function does nothing. + * + *

    The size limits are applied immediately to a windowed mode window and may cause it to be resized.

    + * + *

    The maximum dimensions must be greater than or equal to the minimum dimensions and all must be greater than or equal to zero.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: The size limits will not be applied until the window is actually resized, either by the user or by the compositor.
    • + *
    + * + * @param window the window to set limits for + * @param minwidth the minimum width, in screen coordinates, of the content area, or {@link #GLFW_DONT_CARE DONT_CARE} + * @param minheight the minimum height, in screen coordinates, of the content area, or {@link #GLFW_DONT_CARE DONT_CARE} + * @param maxwidth the maximum width, in screen coordinates, of the content area, or {@link #GLFW_DONT_CARE DONT_CARE} + * @param maxheight the maximum height, in screen coordinates, of the content area, or {@link #GLFW_DONT_CARE DONT_CARE} + * + * @since version 3.2 + */ + public static void glfwSetWindowSizeLimits(@NativeType("GLFWwindow *") long window, int minwidth, int minheight, int maxwidth, int maxheight) { + long __functionAddress = Functions.SetWindowSizeLimits; + if (CHECKS) { + check(window); + } + invokePV(window, minwidth, minheight, maxwidth, maxheight, __functionAddress); + } + + // --- [ glfwSetWindowAspectRatio ] --- + + /** + * Sets the required aspect ratio of the content area of the specified window. If the window is full screen, the aspect ratio only takes effect once it is + * made windowed. If the window is not resizable, this function does nothing. + * + *

    The aspect ratio is specified as a numerator and a denominator and both values must be greater than zero. For example, the common 16:9 aspect ratio is + * specified as 16 and 9, respectively.

    + * + *

    If the numerator and denominator is set to {@link #GLFW_DONT_CARE DONT_CARE} then the aspect ratio limit is disabled.

    + * + *

    The aspect ratio is applied immediately to a windowed mode window and may cause it to be resized.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: The aspect ratio will not be applied until the window is actually resized, either by the user or by the compositor.
    • + *
    + * + * @param window the window to set limits for + * @param numer the numerator of the desired aspect ratio, or {@link #GLFW_DONT_CARE DONT_CARE} + * @param denom the denominator of the desired aspect ratio, or {@link #GLFW_DONT_CARE DONT_CARE} + * + * @since version 3.2 + */ + public static void glfwSetWindowAspectRatio(@NativeType("GLFWwindow *") long window, int numer, int denom) { + long __functionAddress = Functions.SetWindowAspectRatio; + if (CHECKS) { + check(window); + } + invokePV(window, numer, denom, __functionAddress); + } + + // --- [ glfwSetWindowSize ] --- + + /** + * Sets the size, in pixels, of the content area of the specified window. + * + *

    For full screen windows, this function updates the resolution of its desired video mode and switches to the video mode closest to it, without affecting + * the window's context. As the context is unaffected, the bit depths of the framebuffer remain unchanged.

    + * + *

    If you wish to update the refresh rate of the desired video mode in addition to its resolution, see {@link #glfwSetWindowMonitor SetWindowMonitor}.

    + * + *

    The window manager may put limits on what sizes are allowed. GLFW cannot and should not override these limits.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: A full screen window will not attempt to change the mode, no matter what the requested size.
    • + *
    + * + * @param window the window to resize + * @param width the desired width, in screen coordinates, of the window content area + * @param height the desired height, in screen coordinates, of the window content area + * + * @since version 1.0 + */ + public static void glfwSetWindowSize(@NativeType("GLFWwindow *") long window, int width, int height) { + long __functionAddress = Functions.SetWindowSize; + if (CHECKS) { + check(window); + } + invokePV(window, width, height, __functionAddress); + } + + // --- [ glfwGetFramebufferSize ] --- + + /** Unsafe version of: {@link #glfwGetFramebufferSize GetFramebufferSize} */ + public static void nglfwGetFramebufferSize(long window, long width, long height) { + long __functionAddress = Functions.GetFramebufferSize; + if (CHECKS) { + check(window); + } + invokePPPV(window, width, height, __functionAddress); + } + + /** + * Retrieves the size, in pixels, of the framebuffer of the specified window. If you wish to retrieve the size of the window in screen coordinates, see + * {@link #glfwGetWindowSize GetWindowSize}. + * + *

    Any or all of the size arguments may be {@code NULL}. If an error occurs, all non-{@code NULL} size arguments will be set to zero.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose framebuffer to query + * @param width where to store the width, in pixels, of the framebuffer, or {@code NULL} + * @param height where to store the height, in pixels, of the framebuffer, or {@code NULL} + * + * @since version 3.0 + */ + public static void glfwGetFramebufferSize(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") IntBuffer width, @Nullable @NativeType("int *") IntBuffer height) { + if (CHECKS) { + checkSafe(width, 1); + checkSafe(height, 1); + } + nglfwGetFramebufferSize(window, memAddressSafe(width), memAddressSafe(height)); + } + + // --- [ glfwGetWindowFrameSize ] --- + + /** Unsafe version of: {@link #glfwGetWindowFrameSize GetWindowFrameSize} */ + public static void nglfwGetWindowFrameSize(long window, long left, long top, long right, long bottom) { + long __functionAddress = Functions.GetWindowFrameSize; + if (CHECKS) { + check(window); + } + invokePPPPPV(window, left, top, right, bottom, __functionAddress); + } + + /** + * Retrieves the size, in screen coordinates, of each edge of the frame of the specified window. This size includes the title bar, if the window has one. + * The size of the frame may vary depending on the window-related hints used to + * create it. + * + *

    Because this function retrieves the size of each window frame edge and not the offset along a particular coordinate axis, the retrieved values will + * always be zero or positive.

    + * + *

    Any or all of the size arguments may be {@code NULL}. If an error occurs, all non-{@code NULL} size arguments will be set to zero.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose frame size to query + * @param left where to store the size, in screen coordinates, of the left edge of the window frame, or {@code NULL} + * @param top where to store the size, in screen coordinates, of the top edge of the window frame, or {@code NULL} + * @param right where to store the size, in screen coordinates, of the right edge of the window frame, or {@code NULL} + * @param bottom where to store the size, in screen coordinates, of the bottom edge of the window frame, or {@code NULL} + * + * @since version 3.1 + */ + public static void glfwGetWindowFrameSize(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") IntBuffer left, @Nullable @NativeType("int *") IntBuffer top, @Nullable @NativeType("int *") IntBuffer right, @Nullable @NativeType("int *") IntBuffer bottom) { + if (CHECKS) { + checkSafe(left, 1); + checkSafe(top, 1); + checkSafe(right, 1); + checkSafe(bottom, 1); + } + nglfwGetWindowFrameSize(window, memAddressSafe(left), memAddressSafe(top), memAddressSafe(right), memAddressSafe(bottom)); + } + + // --- [ glfwGetWindowContentScale ] --- + + /** Unsafe version of: {@link #glfwGetWindowContentScale GetWindowContentScale} */ + public static void nglfwGetWindowContentScale(long window, long xscale, long yscale) { + long __functionAddress = Functions.GetWindowContentScale; + if (CHECKS) { + check(window); + } + invokePPPV(window, xscale, yscale, __functionAddress); + } + + /** + * Retrieves the content scale for the specified window. + * + *

    This function retrieves the content scale for the specified window. The content scale is the ratio between the current DPI and the platform's default + * DPI. This is especially important for text and any UI elements. If the pixel dimensions of your UI scaled by this look appropriate on your machine then + * it should appear at a reasonable size on other machines regardless of their DPI and scaling settings. This relies on the system DPI and scaling + * settings being somewhat correct.

    + * + *

    On platforms where each monitor can have its own content scale, the window content scale will depend on which monitor the system considers the window + * to be on.

    + * + * @param window the window to query + * @param xscale where to store the x-axis content scale, or {@code NULL} + * @param yscale where to store the y-axis content scale, or {@code NULL} + * + * @since version 3.3 + */ + public static void glfwGetWindowContentScale(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("float *") FloatBuffer xscale, @Nullable @NativeType("float *") FloatBuffer yscale) { + if (CHECKS) { + checkSafe(xscale, 1); + checkSafe(yscale, 1); + } + nglfwGetWindowContentScale(window, memAddressSafe(xscale), memAddressSafe(yscale)); + } + + // --- [ glfwGetWindowOpacity ] --- + + /** + * Returns the opacity of the whole window. + * + *

    This function returns the opacity of the window, including any decorations.

    + * + *

    The opacity (or alpha) value is a positive finite number between zero and one, where zero is fully transparent and one is fully opaque. If the system + * does not support whole window transparency, this function always returns one.

    + * + *

    The initial opacity value for newly created windows is one.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window to query + * + * @return the opacity value of the specified window + * + * @since version 3.3 + */ + public static float glfwGetWindowOpacity(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetWindowOpacity; + if (CHECKS) { + check(window); + } + return invokePF(window, __functionAddress); + } + + // --- [ glfwSetWindowOpacity ] --- + + /** + * Sets the opacity of the whole window. + * + *

    This function sets the opacity of the window, including any decorations.

    + * + *

    The opacity (or alpha) value is a positive finite number between zero and one, where zero is fully transparent and one is fully opaque.

    + * + *

    The initial opacity value for newly created windows is one.

    + * + *

    A window created with framebuffer transparency may not use whole window transparency. The results of doing this are undefined.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: There is no way to set an opacity factor for a window. This function will emit {@link #GLFW_FEATURE_UNAVAILABLE FEATURE_UNAVAILABLE}.
    • + *
    + * + * @param window the window to set the opacity for + * @param opacity the desired opacity of the specified window + * + * @since version 3.3 + */ + public static void glfwSetWindowOpacity(@NativeType("GLFWwindow *") long window, float opacity) { + long __functionAddress = Functions.SetWindowOpacity; + if (CHECKS) { + check(window); + } + invokePV(window, opacity, __functionAddress); + } + + // --- [ glfwIconifyWindow ] --- + + /** + * Iconifies (minimizes) the specified window if it was previously restored. If the window is already iconified, this function does nothing. + * + *

    If the specified window is a full screen window, GLFW restores the original video mode of the monitor. The window's desired video mode is set again + * when the window is restored.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: Once a window is iconified, {@link #glfwRestoreWindow RestoreWindow} won’t be able to restore it. This is a design decision of the {@code xdg-shell}.
    • + *
    + * + * @param window the window to iconify + * + * @since version 2.1 + */ + public static void glfwIconifyWindow(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.IconifyWindow; + if (CHECKS) { + check(window); + } + invokePV(window, __functionAddress); + } + + // --- [ glfwRestoreWindow ] --- + + /** + * Restores the specified window if it was previously iconified (minimized) or maximized. If the window is already restored, this function does nothing. + * + *

    If the specified window is an iconified full screen window, its desired video mode is set again for its monitor when the window is restored.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window to restore + * + * @since version 2.1 + */ + public static void glfwRestoreWindow(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.RestoreWindow; + if (CHECKS) { + check(window); + } + invokePV(window, __functionAddress); + } + + // --- [ glfwMaximizeWindow ] --- + + /** + * Maximizes the specified window if it was previously not maximized. If the window is already maximized, this function does nothing. + * + *

    If the specified window is a full screen window, this function does nothing.

    + * + *

    This function may only be called from the main thread.

    + * + * @param window the window to maximize + * + * @since version 3.2 + */ + public static void glfwMaximizeWindow(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.MaximizeWindow; + if (CHECKS) { + check(window); + } + invokePV(window, __functionAddress); + } + + // --- [ glfwShowWindow ] --- + + /** + * Makes the specified window visible if it was previously hidden. If the window is already visible or is in full screen mode, this function does nothing. + * + *

    By default, windowed mode windows are focused when shown. Set the {@link #GLFW_FOCUS_ON_SHOW FOCUS_ON_SHOW} window hint to change this behavior for all newly created windows, or + * change the behavior for an existing window with {@link #glfwSetWindowAttrib SetWindowAttrib}.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: Because Wayland wants every frame of the desktop to be complete, this function does not immediately make the window visible. + * Instead it will become visible the next time the window framebuffer is updated after this call.
    • + *
    + * + * @param window the window to make visible + * + * @since version 3.0 + */ + public static void glfwShowWindow(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.ShowWindow; + if (CHECKS) { + check(window); + } + invokePV(window, __functionAddress); + } + + // --- [ glfwHideWindow ] --- + + /** + * Hides the specified window, if it was previously visible. If the window is already hidden or is in full screen mode, this function does nothing. + * + *

    This function must only be called from the main thread.

    + * + * @param window the window to hide + * + * @since version 3.0 + */ + public static void glfwHideWindow(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.HideWindow; + if (CHECKS) { + check(window); + } + invokePV(window, __functionAddress); + } + + // --- [ glfwFocusWindow ] --- + + /** + * Brings the specified window to front and sets input focus. The window should already be visible and not iconified. + * + *

    By default, both windowed and full screen mode windows are focused when initially created. Set the {@link #GLFW_FOCUSED FOCUSED} hint to disable this behavior.

    + * + *

    Also by default, windowed mode windows are focused when shown with {@link #glfwShowWindow ShowWindow}. Set the {@link #GLFW_FOCUS_ON_SHOW FOCUS_ON_SHOW} window hint to disable this behavior.

    + * + *

    Do not use this function to steal focus from other applications unless you are certain that is what the user wants. Focus stealing can be + * extremely disruptive.

    + * + *

    For a less disruptive way of getting the user's attention, see {@link #glfwRequestWindowAttention RequestWindowAttention}.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: It is not possible for an application to set the input focus. This function will emit {@link #GLFW_FEATURE_UNAVAILABLE FEATURE_UNAVAILABLE}.
    • + *
    + * + * @param window the window to give input focus + * + * @since version 3.2 + */ + public static void glfwFocusWindow(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.FocusWindow; + if (CHECKS) { + check(window); + } + invokePV(window, __functionAddress); + } + + // --- [ glfwRequestWindowAttention ] --- + + /** + * Requests user attention to the specified window. + * + *

    This function requests user attention to the specified window. On platforms where this is not supported, attention is requested to the application as + * a whole.

    + * + *

    Once the user has given attention, usually by focusing the window or application, the system will end the request automatically.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • macOS: Attention is requested to the application as a whole, not the specific window.
    • + *
    + * + * @param window the window to request attention to + * + * @since version 3.3 + */ + public static void glfwRequestWindowAttention(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.RequestWindowAttention; + if (CHECKS) { + check(window); + } + invokePV(window, __functionAddress); + } + + // --- [ glfwGetWindowMonitor ] --- + + /** + * Returns the handle of the monitor that the specified window is in full screen on. + * + *

    This function must only be called from the main thread.

    + * + * @param window the window to query + * + * @return the monitor, or {@code NULL} if the window is in windowed mode or an error occurred + * + * @since version 3.0 + */ + @NativeType("GLFWmonitor *") + public static long glfwGetWindowMonitor(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetWindowMonitor; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + + // --- [ glfwSetWindowMonitor ] --- + + /** + * Sets the mode, monitor, video mode and placement of a window. + * + *

    This function sets the monitor that the window uses for full screen mode or, if the monitor is {@code NULL}, makes it windowed mode.

    + * + *

    When setting a monitor, this function updates the width, height and refresh rate of the desired video mode and switches to the video mode closest to + * it. The window position is ignored when setting a monitor.

    + * + *

    When the monitor is {@code NULL}, the position, width and height are used to place the window content area. The refresh rate is ignored when no monitor is + * specified.

    + * + *

    If you only wish to update the resolution of a full screen window or the size of a windowed mode window, see {@link #glfwSetWindowSize SetWindowSize}.

    + * + *

    When a window transitions from full screen to windowed mode, this function restores any previous window settings such as whether it is decorated, + * floating, resizable, has size or aspect ratio limits, etc.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: The desired window position is ignored, as there is no way for an application to set this property.
    • + *
    • Wayland: Setting the window to full screen will not attempt to change the mode, no matter what the requested size or refresh rate.
    • + *
    + * + * @param window the window whose monitor, size or video mode to set + * @param monitor the desired monitor, or {@code NULL} to set windowed mode + * @param xpos the desired x-coordinate of the upper-left corner of the content area + * @param ypos the desired y-coordinate of the upper-left corner of the content area + * @param width the desired with, in screen coordinates, of the content area or video mode + * @param height the desired height, in screen coordinates, of the content area or video mode + * @param refreshRate the desired refresh rate, in Hz, of the video mode, or {@link #GLFW_DONT_CARE DONT_CARE} + * + * @since version 3.2 + */ + public static void glfwSetWindowMonitor(@NativeType("GLFWwindow *") long window, @NativeType("GLFWmonitor *") long monitor, int xpos, int ypos, int width, int height, int refreshRate) { + long __functionAddress = Functions.SetWindowMonitor; + if (CHECKS) { + check(window); + } + invokePPV(window, monitor, xpos, ypos, width, height, refreshRate, __functionAddress); + } + + // --- [ glfwGetWindowAttrib ] --- + + /** + * Returns the value of an attribute of the specified window or its OpenGL or OpenGL ES context. + * + *

    This function must only be called from the main thread.

    + * + *

    Framebuffer related hints are not window attributes.

    + * + *

    Zero is a valid value for many window and context related attributes so you cannot use a return value of zero as an indication of errors. However, this + * function should not fail as long as it is passed valid arguments and the library has been initialized.

    + * + *

    Wayland: The Wayland protocol provides no way to check whether a window is iconfied, so {@link #GLFW_ICONIFIED ICONIFIED} always returns {@link #GLFW_FALSE FALSE}.

    + * + * @param window the window to query + * @param attrib the window attribute whose value to return. One of:
    {@link #GLFW_FOCUSED FOCUSED}{@link #GLFW_ICONIFIED ICONIFIED}{@link #GLFW_RESIZABLE RESIZABLE}{@link #GLFW_VISIBLE VISIBLE}{@link #GLFW_DECORATED DECORATED}
    {@link #GLFW_FLOATING FLOATING}{@link #GLFW_MAXIMIZED MAXIMIZED}{@link #GLFW_CENTER_CURSOR CENTER_CURSOR}{@link #GLFW_TRANSPARENT_FRAMEBUFFER TRANSPARENT_FRAMEBUFFER}{@link #GLFW_HOVERED HOVERED}
    {@link #GLFW_FOCUS_ON_SHOW FOCUS_ON_SHOW}{@link #GLFW_MOUSE_PASSTHROUGH MOUSE_PASSTHROUGH}{@link #GLFW_POSITION_X POSITION_X}{@link #GLFW_POSITION_Y POSITION_Y}{@link #GLFW_CLIENT_API CLIENT_API}
    {@link #GLFW_CONTEXT_VERSION_MAJOR CONTEXT_VERSION_MAJOR}{@link #GLFW_CONTEXT_VERSION_MINOR CONTEXT_VERSION_MINOR}{@link #GLFW_CONTEXT_REVISION CONTEXT_REVISION}{@link #GLFW_CONTEXT_ROBUSTNESS CONTEXT_ROBUSTNESS}{@link #GLFW_OPENGL_FORWARD_COMPAT OPENGL_FORWARD_COMPAT}
    {@link #GLFW_CONTEXT_DEBUG CONTEXT_DEBUG}{@link #GLFW_OPENGL_DEBUG_CONTEXT OPENGL_DEBUG_CONTEXT}{@link #GLFW_OPENGL_PROFILE OPENGL_PROFILE}{@link #GLFW_CONTEXT_RELEASE_BEHAVIOR CONTEXT_RELEASE_BEHAVIOR}{@link #GLFW_CONTEXT_NO_ERROR CONTEXT_NO_ERROR}
    {@link #GLFW_CONTEXT_CREATION_API CONTEXT_CREATION_API}{@link #GLFW_SCALE_TO_MONITOR SCALE_TO_MONITOR}
    + * + * @return the value of the attribute, or zero if an error occurred + * + * @since version 3.0 + */ + public static int glfwGetWindowAttrib(@NativeType("GLFWwindow *") long window, int attrib) { + long __functionAddress = Functions.GetWindowAttrib; + if (CHECKS) { + check(window); + } + return invokePI(window, attrib, __functionAddress); + } + + // --- [ glfwSetWindowAttrib ] --- + + /** + * Sets an attribute of the specified window. + * + *

    This function must only be called from the main thread.

    + * + * @param window the window to set the attribute for + * @param attrib the attribute to set. + * + *

    Some of these attributes are ignored for full screen windows. The new value will take effect if the window is later made windowed.

    + * + *

    Some of these attributes are ignored for windowed mode windows. The new value will take effect if the window is later made full screen.

    + * + *

    Calling {@link #glfwGetWindowAttrib GetWindowAttrib} will always return the latest value, even if that value is ignored by the current mode of the window. One of:

    {@link #GLFW_DECORATED DECORATED}{@link #GLFW_RESIZABLE RESIZABLE}{@link #GLFW_FLOATING FLOATING}{@link #GLFW_AUTO_ICONIFY AUTO_ICONIFY}{@link #GLFW_FOCUS_ON_SHOW FOCUS_ON_SHOW}{@link #GLFW_MOUSE_PASSTHROUGH MOUSE_PASSTHROUGH}
    + * @param value the value to set + * + * @since version 3.3 + */ + public static void glfwSetWindowAttrib(@NativeType("GLFWwindow *") long window, int attrib, int value) { + long __functionAddress = Functions.SetWindowAttrib; + if (CHECKS) { + check(window); + } + invokePV(window, attrib, value, __functionAddress); + } + + // --- [ glfwSetWindowUserPointer ] --- + + /** + * Sets the user-defined pointer of the specified window. The current value is retained until the window is destroyed. The initial value is {@code NULL}. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param window the window whose pointer to set + * @param pointer the new value + * + * @since version 3.0 + */ + public static void glfwSetWindowUserPointer(@NativeType("GLFWwindow *") long window, @NativeType("void *") long pointer) { + long __functionAddress = Functions.SetWindowUserPointer; + if (CHECKS) { + check(window); + } + invokePPV(window, pointer, __functionAddress); + } + + // --- [ glfwGetWindowUserPointer ] --- + + /** + * Returns the current value of the user-defined pointer of the specified window. The initial value is {@code NULL}. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param window the window whose pointer to return + * + * @since version 3.0 + */ + @NativeType("void *") + public static long glfwGetWindowUserPointer(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetWindowUserPointer; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + + // --- [ glfwSetWindowPosCallback ] --- + + /** Unsafe version of: {@link #glfwSetWindowPosCallback SetWindowPosCallback} */ + public static long nglfwSetWindowPosCallback(long window, long cbfun) { + long __functionAddress = Functions.SetWindowPosCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the position callback of the specified window, which is called when the window is moved. The callback is provided with the position, in screen + * coordinates, of the upper-left corner of the content area of the window. + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: This callback will never be called, as there is no way for an application to know its global position.
    • + *
    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set or the library had not been + * initialized + * + * @since version 1.0 + */ + @Nullable + @NativeType("GLFWwindowposfun") + public static GLFWWindowPosCallback glfwSetWindowPosCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWwindowposfun") GLFWWindowPosCallbackI cbfun) { + return GLFWWindowPosCallback.createSafe(nglfwSetWindowPosCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetWindowSizeCallback ] --- + + /** Unsafe version of: {@link #glfwSetWindowSizeCallback SetWindowSizeCallback} */ + public static long nglfwSetWindowSizeCallback(long window, long cbfun) { + long __functionAddress = Functions.SetWindowSizeCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the size callback of the specified window, which is called when the window is resized. The callback is provided with the size, in screen + * coordinates, of the content area of the window. + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set or the library had not been + * initialized + * + * @since version 1.0 + */ + @Nullable + @NativeType("GLFWwindowsizefun") + public static GLFWWindowSizeCallback glfwSetWindowSizeCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWwindowsizefun") GLFWWindowSizeCallbackI cbfun) { + return GLFWWindowSizeCallback.createSafe(nglfwSetWindowSizeCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetWindowCloseCallback ] --- + + /** Unsafe version of: {@link #glfwSetWindowCloseCallback SetWindowCloseCallback} */ + public static long nglfwSetWindowCloseCallback(long window, long cbfun) { + long __functionAddress = Functions.SetWindowCloseCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the close callback of the specified window, which is called when the user attempts to close the window, for example by clicking the close widget in + * the title bar. + * + *

    The close flag is set before this callback is called, but you can modify it at any time with {@link #glfwSetWindowShouldClose SetWindowShouldClose}.

    + * + *

    The close callback is not triggered by {@link #glfwDestroyWindow DestroyWindow}.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • macOS: Selecting Quit from the application menu will trigger the close callback for all windows.
    • + *
    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set or the library had not been + * initialized + * + * @since version 2.5 + */ + @Nullable + @NativeType("GLFWwindowclosefun") + public static GLFWWindowCloseCallback glfwSetWindowCloseCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWwindowclosefun") GLFWWindowCloseCallbackI cbfun) { + return GLFWWindowCloseCallback.createSafe(nglfwSetWindowCloseCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetWindowRefreshCallback ] --- + + /** Unsafe version of: {@link #glfwSetWindowRefreshCallback SetWindowRefreshCallback} */ + public static long nglfwSetWindowRefreshCallback(long window, long cbfun) { + long __functionAddress = Functions.SetWindowRefreshCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the refresh callback of the specified window, which is called when the content area of the window needs to be redrawn, for example if the window has + * been exposed after having been covered by another window. + * + *

    On compositing window systems such as Aero, Compiz or Aqua, where the window contents are saved off-screen, this callback may be called only very + * infrequently or never at all.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set or the library had not been + * initialized + * + * @since version 2.5 + */ + @Nullable + @NativeType("GLFWwindowrefreshfun") + public static GLFWWindowRefreshCallback glfwSetWindowRefreshCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWwindowrefreshfun") GLFWWindowRefreshCallbackI cbfun) { + return GLFWWindowRefreshCallback.createSafe(nglfwSetWindowRefreshCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetWindowFocusCallback ] --- + + /** Unsafe version of: {@link #glfwSetWindowFocusCallback SetWindowFocusCallback} */ + public static long nglfwSetWindowFocusCallback(long window, long cbfun) { + long __functionAddress = Functions.SetWindowFocusCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the focus callback of the specified window, which is called when the window gains or loses input focus. + * + *

    After the focus callback is called for a window that lost input focus, synthetic key and mouse button release events will be generated for all such + * that had been pressed. For more information, see {@link #glfwSetKeyCallback SetKeyCallback} and {@link #glfwSetMouseButtonCallback SetMouseButtonCallback}.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set or the library had not been + * initialized + * + * @since version 3.0 + */ + @Nullable + @NativeType("GLFWwindowfocusfun") + public static GLFWWindowFocusCallback glfwSetWindowFocusCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWwindowfocusfun") GLFWWindowFocusCallbackI cbfun) { + return GLFWWindowFocusCallback.createSafe(nglfwSetWindowFocusCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetWindowIconifyCallback ] --- + + /** Unsafe version of: {@link #glfwSetWindowIconifyCallback SetWindowIconifyCallback} */ + public static long nglfwSetWindowIconifyCallback(long window, long cbfun) { + long __functionAddress = Functions.SetWindowIconifyCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the iconification callback of the specified window, which is called when the window is iconified or restored. + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set or the library had not been + * initialized + * + * @since version 3.0 + */ + @Nullable + @NativeType("GLFWwindowiconifyfun") + public static GLFWWindowIconifyCallback glfwSetWindowIconifyCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWwindowiconifyfun") GLFWWindowIconifyCallbackI cbfun) { + return GLFWWindowIconifyCallback.createSafe(nglfwSetWindowIconifyCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetWindowMaximizeCallback ] --- + + /** Unsafe version of: {@link #glfwSetWindowMaximizeCallback SetWindowMaximizeCallback} */ + public static long nglfwSetWindowMaximizeCallback(long window, long cbfun) { + long __functionAddress = Functions.SetWindowMaximizeCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the maximization callback of the specified window, which is called when the window is maximized or restored. + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set or the library had not been + * initialized + * + * @since version 3.3 + */ + @Nullable + @NativeType("GLFWwindowmaximizefun") + public static GLFWWindowMaximizeCallback glfwSetWindowMaximizeCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWwindowmaximizefun") GLFWWindowMaximizeCallbackI cbfun) { + return GLFWWindowMaximizeCallback.createSafe(nglfwSetWindowMaximizeCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetFramebufferSizeCallback ] --- + + /** Unsafe version of: {@link #glfwSetFramebufferSizeCallback SetFramebufferSizeCallback} */ + public static long nglfwSetFramebufferSizeCallback(long window, long cbfun) { + long __functionAddress = Functions.SetFramebufferSizeCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the framebuffer resize callback of the specified window, which is called when the framebuffer of the specified window is resized. + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set or the library had not been + * initialized + * + * @since version 3.0 + */ + @Nullable + @NativeType("GLFWframebuffersizefun") + public static GLFWFramebufferSizeCallback glfwSetFramebufferSizeCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWframebuffersizefun") GLFWFramebufferSizeCallbackI cbfun) { + return GLFWFramebufferSizeCallback.createSafe(nglfwSetFramebufferSizeCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetWindowContentScaleCallback ] --- + + /** Unsafe version of: {@link #glfwSetWindowContentScaleCallback SetWindowContentScaleCallback} */ + public static long nglfwSetWindowContentScaleCallback(long window, long cbfun) { + long __functionAddress = Functions.SetWindowContentScaleCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the window content scale callback for the specified window, which is called when the content scale of the specified window changes. + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set or the library had not been + * initialized + * + * @since version 3.3 + */ + @Nullable + @NativeType("GLFWwindowcontentscalefun") + public static GLFWWindowContentScaleCallback glfwSetWindowContentScaleCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWwindowcontentscalefun") GLFWWindowContentScaleCallbackI cbfun) { + return GLFWWindowContentScaleCallback.createSafe(nglfwSetWindowContentScaleCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwPollEvents ] --- + + /** + * Processes all pending events. + * + *

    This function processes only those events that are already in the event queue and then returns immediately. Processing events will cause the window and + * input callbacks associated with those events to be called.

    + * + *

    On some platforms, a window move, resize or menu operation will cause event processing to block. This is due to how event processing is designed on + * those platforms. You can use the window refresh callback to redraw the + * contents of your window when necessary during such operations.

    + * + *

    On some platforms, certain events are sent directly to the application without going through the event queue, causing callbacks to be called outside of + * a call to one of the event processing functions.

    + * + *

    Event processing is not required for joystick input to work.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • This function must not be called from a callback.
    • + *
    + * + * @since version 1.0 + */ + public static void glfwPollEvents() { + long __functionAddress = Functions.PollEvents; + invokeV(__functionAddress); + } + + // --- [ glfwWaitEvents ] --- + + /** + * Waits until events are queued and processes them. + * + *

    This function puts the calling thread to sleep until at least one event is available in the event queue. Once one or more events are available, it + * behaves exactly like {@link #glfwPollEvents PollEvents}, i.e. the events in the queue are processed and the function then returns immediately. Processing events will cause + * the window and input callbacks associated with those events to be called.

    + * + *

    Since not all events are associated with callbacks, this function may return without a callback having been called even if you are monitoring all + * callbacks.

    + * + *

    On some platforms, a window move, resize or menu operation will cause event processing to block. This is due to how event processing is designed on + * those platforms. You can use the window refresh callback to redraw the + * contents of your window when necessary during such operations.

    + * + *

    On some platforms, certain callbacks may be called outside of a call to one of the event processing functions.

    + * + *

    Event processing is not required for joystick input to work.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • This function must not be called from a callback.
    • + *
    + * + * @since version 2.5 + */ + public static void glfwWaitEvents() { + long __functionAddress = Functions.WaitEvents; + invokeV(__functionAddress); + } + + // --- [ glfwWaitEventsTimeout ] --- + + /** + * Waits with timeout until events are queued and processes them. + * + *

    This function puts the calling thread to sleep until at least one event is available in the event queue, or until the specified timeout is reached. If + * one or more events are available, it behaves exactly like {@link #glfwPollEvents PollEvents}, i.e. the events in the queue are processed and the function then returns + * immediately. Processing events will cause the window and input callbacks associated with those events to be called.

    + * + *

    The timeout value must be a positive finite number.

    + * + *

    Since not all events are associated with callbacks, this function may return without a callback having been called even if you are monitoring all + * callbacks.

    + * + *

    On some platforms, a window move, resize or menu operation will cause event processing to block. This is due to how event processing is designed on + * those platforms. You can use the window refresh callback to redraw the contents of your window when necessary during such operations.

    + * + *

    On some platforms, certain callbacks may be called outside of a call to one of the event processing functions.

    + * + *

    Event processing is not required for joystick input to work.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • This function must not be called from a callback.
    • + *
    + * + * @param timeout the maximum amount of time, in seconds, to wait + * + * @since version 3.2 + */ + public static void glfwWaitEventsTimeout(double timeout) { + long __functionAddress = Functions.WaitEventsTimeout; + invokeV(timeout, __functionAddress); + } + + // --- [ glfwPostEmptyEvent ] --- + + /** + * Posts an empty event from the current thread to the main thread event queue, causing {@link #glfwWaitEvents WaitEvents} or {@link #glfwWaitEventsTimeout WaitEventsTimeout} to return. + * + *

    This function may be called from any thread.

    + * + * @since version 3.1 + */ + public static void glfwPostEmptyEvent() { + long __functionAddress = Functions.PostEmptyEvent; + invokeV(__functionAddress); + } + + // --- [ glfwGetInputMode ] --- + + /** + * Returns the value of an input option for the specified window. + * + *

    This function must only be called from the main thread.

    + * + * @param window the window to query + * @param mode the input mode whose value to return. One of:
    {@link #GLFW_CURSOR CURSOR}{@link #GLFW_STICKY_KEYS STICKY_KEYS}{@link #GLFW_STICKY_MOUSE_BUTTONS STICKY_MOUSE_BUTTONS}{@link #GLFW_LOCK_KEY_MODS LOCK_KEY_MODS}{@link #GLFW_RAW_MOUSE_MOTION RAW_MOUSE_MOTION}
    + * + * @return the input mode value + * + * @since version 3.0 + */ + public static int glfwGetInputMode(@NativeType("GLFWwindow *") long window, int mode) { + long __functionAddress = Functions.GetInputMode; + if (CHECKS) { + check(window); + } + return invokePI(window, mode, __functionAddress); + } + + // --- [ glfwSetInputMode ] --- + + /** + * Sets an input option for the specified window. + * + *

    If {@code mode} is {@link #GLFW_CURSOR CURSOR}, the value must be one of the following cursor modes:

    + * + *
      + *
    • {@link #GLFW_CURSOR_NORMAL CURSOR_NORMAL} makes the cursor visible and behaving normally.
    • + *
    • {@link #GLFW_CURSOR_HIDDEN CURSOR_HIDDEN} makes the cursor invisible when it is over the content area of the window but does not restrict the cursor from leaving.
    • + *
    • {@link #GLFW_CURSOR_DISABLED CURSOR_DISABLED} hides and grabs the cursor, providing virtual and unlimited cursor movement. This is useful for implementing for example 3D camera + * controls.
    • + *
    • {@link #GLFW_CURSOR_CAPTURED CURSOR_CAPTURED} makes the cursor visible and confines it to the content area of the window.
    • + *
    + * + *

    If the {@code mode} is {@link #GLFW_STICKY_KEYS STICKY_KEYS}, the value must be either {@link #GLFW_TRUE TRUE} to enable sticky keys, or {@link #GLFW_FALSE FALSE} to disable it. If sticky keys are enabled, a key + * press will ensure that {@link #glfwGetKey GetKey} returns {@link #GLFW_PRESS PRESS} the next time it is called even if the key had been released before the call. This is useful when you + * are only interested in whether keys have been pressed but not when or in which order.

    + * + *

    If the {@code mode} is {@link #GLFW_STICKY_MOUSE_BUTTONS STICKY_MOUSE_BUTTONS}, the value must be either {@link #GLFW_TRUE TRUE} to enable sticky mouse buttons, or {@link #GLFW_FALSE FALSE} to disable it. If sticky mouse + * buttons are enabled, a mouse button press will ensure that {@link #glfwGetMouseButton GetMouseButton} returns {@link #GLFW_PRESS PRESS} the next time it is called even if the mouse button had + * been released before the call. This is useful when you are only interested in whether mouse buttons have been pressed but not when or in which order.

    + * + *

    If the {@code mode} is {@link #GLFW_LOCK_KEY_MODS LOCK_KEY_MODS}, the value must be either {@link #GLFW_TRUE TRUE} to enable lock key modifier bits, or {@link #GLFW_FALSE FALSE} to disable them. If enabled, + * callbacks that receive modifier bits will also have the {@link #GLFW_MOD_CAPS_LOCK MOD_CAPS_LOCK} bit set when the event was generated with Caps Lock on, and the {@link #GLFW_MOD_NUM_LOCK MOD_NUM_LOCK} + * bit when Num Lock was on.

    + * + *

    If the mode is {@link #GLFW_RAW_MOUSE_MOTION RAW_MOUSE_MOTION}, the value must be either {@link #GLFW_TRUE TRUE} to enable raw (unscaled and unaccelerated) mouse motion when the cursor is disabled, + * or {@link #GLFW_FALSE FALSE} to disable it. If raw motion is not supported, attempting to set this will emit {@link #GLFW_FEATURE_UNAVAILABLE FEATURE_UNAVAILABLE}. Call {@link #glfwRawMouseMotionSupported RawMouseMotionSupported} to + * check for support.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose input mode to set + * @param mode the input mode to set. One of:
    {@link #GLFW_CURSOR CURSOR}{@link #GLFW_STICKY_KEYS STICKY_KEYS}{@link #GLFW_STICKY_MOUSE_BUTTONS STICKY_MOUSE_BUTTONS}
    + * @param value the new value of the specified input mode + * + * @since GFLW 3.0 + */ + public static void glfwSetInputMode(@NativeType("GLFWwindow *") long window, int mode, int value) { + long __functionAddress = Functions.SetInputMode; + if (CHECKS) { + check(window); + } + invokePV(window, mode, value, __functionAddress); + FCLInjector.setClassLoader(Thread.currentThread().getContextClassLoader()); + } + + // --- [ glfwRawMouseMotionSupported ] --- + + /** + * Returns whether raw mouse motion is supported. + * + *

    This function returns whether raw mouse motion is supported on the current system. This status does not change after GLFW has been initialized so you + * only need to check this once. If you attempt to enable raw motion on a system that does not support it, {@link #GLFW_PLATFORM_ERROR PLATFORM_ERROR} will be emitted.

    + * + *

    Raw mouse motion is closer to the actual motion of the mouse across a surface. It is not affected by the scaling and acceleration applied to the motion + * of the desktop cursor. That processing is suitable for a cursor while raw motion is better for controlling for example a 3D camera. Because of this, + * raw mouse motion is only provided when the cursor is disabled.

    + * + *

    This function must only be called from the main thread.

    + * + * @return {@link #GLFW_TRUE TRUE} if raw mouse motion is supported on the current machine, or {@link #GLFW_FALSE FALSE} otherwise + * + * @since version 3.3 + */ + @NativeType("int") + public static boolean glfwRawMouseMotionSupported() { + long __functionAddress = Functions.RawMouseMotionSupported; + return invokeI(__functionAddress) != 0; + } + + // --- [ glfwGetKeyName ] --- + + /** Unsafe version of: {@link #glfwGetKeyName GetKeyName} */ + public static long nglfwGetKeyName(int key, int scancode) { + long __functionAddress = Functions.GetKeyName; + return invokeP(key, scancode, __functionAddress); + } + + /** + * Returns the layout-specific name of the specified printable key. + * + *

    This function returns the name of the specified printable key, encoded as UTF-8. This is typically the character that key would produce without any + * modifier keys, intended for displaying key bindings to the user. For dead keys, it is typically the diacritic it would add to a character.

    + * + *

    Do not use this function for text input. You will break text input for many languages even if it happens to work for yours.

    + * + *

    If the key is {@link #GLFW_KEY_UNKNOWN KEY_UNKNOWN}, the scancode is used to identify the key, otherwise the scancode is ignored. If you specify a non-printable key, or + * {@link #GLFW_KEY_UNKNOWN KEY_UNKNOWN} and a scancode that maps to a non-printable key, this function returns {@code NULL} but does not emit an error.

    + * + *

    This behavior allows you to always pass in the arguments in the key callback without modification.

    + * + *

    The printable keys are:

    + * + *
      + *
    • {@link #GLFW_KEY_APOSTROPHE KEY_APOSTROPHE}
    • + *
    • {@link #GLFW_KEY_COMMA KEY_COMMA}
    • + *
    • {@link #GLFW_KEY_MINUS KEY_MINUS}
    • + *
    • {@link #GLFW_KEY_PERIOD KEY_PERIOD}
    • + *
    • {@link #GLFW_KEY_SLASH KEY_SLASH}
    • + *
    • {@link #GLFW_KEY_SEMICOLON KEY_SEMICOLON}
    • + *
    • {@link #GLFW_KEY_EQUAL KEY_EQUAL}
    • + *
    • {@link #GLFW_KEY_LEFT_BRACKET KEY_LEFT_BRACKET}
    • + *
    • {@link #GLFW_KEY_RIGHT_BRACKET KEY_RIGHT_BRACKET}
    • + *
    • {@link #GLFW_KEY_BACKSLASH KEY_BACKSLASH}
    • + *
    • {@link #GLFW_KEY_WORLD_1 KEY_WORLD_1}
    • + *
    • {@link #GLFW_KEY_WORLD_2 KEY_WORLD_2}
    • + *
    • {@link #GLFW_KEY_0 KEY_0} to {@link #GLFW_KEY_9 KEY_9}
    • + *
    • {@link #GLFW_KEY_A KEY_A} to {@link #GLFW_KEY_Z KEY_Z}
    • + *
    • {@link #GLFW_KEY_KP_0 KEY_KP_0} to {@link #GLFW_KEY_KP_9 KEY_KP_9}
    • + *
    • {@link #GLFW_KEY_KP_DECIMAL KEY_KP_DECIMAL}
    • + *
    • {@link #GLFW_KEY_KP_DIVIDE KEY_KP_DIVIDE}
    • + *
    • {@link #GLFW_KEY_KP_MULTIPLY KEY_KP_MULTIPLY}
    • + *
    • {@link #GLFW_KEY_KP_SUBTRACT KEY_KP_SUBTRACT}
    • + *
    • {@link #GLFW_KEY_KP_ADD KEY_KP_ADD}
    • + *
    • {@link #GLFW_KEY_KP_EQUAL KEY_KP_EQUAL}
    • + *
    + * + *

    Names for printable keys depend on keyboard layout, while names for non-printable keys are the same across layouts but depend on the application + * language and should be localized along with other user interface text.

    + * + *

    The contents of the returned string may change when a keyboard layout change event is received.

    + * + *

    The returned string is allocated and freed by GLFW. You should not free it yourself. It is valid until the library is terminated.

    + * + *

    This function must only be called from the main thread.

    + * + * @param key the key to query, or {@link #GLFW_KEY_UNKNOWN KEY_UNKNOWN} + * @param scancode the scancode of the key to query + * + * @return the UTF-8 encoded, layout-specific name of the key, or {@code NULL} + * + * @since version 3.2 + */ + @Nullable + @NativeType("char const *") + public static String glfwGetKeyName(int key, int scancode) { + long __result = nglfwGetKeyName(key, scancode); + return memUTF8Safe(__result); + } + + // --- [ glfwGetKeyScancode ] --- + + /** + * Returns the platform dependent scancode of the specified key. + * + *

    This function returns the platform dependent scancode of the specified key. This is intended for platform specific default keybindings.

    + * + *

    If the key is {@link #GLFW_KEY_UNKNOWN KEY_UNKNOWN} or does not exist on the keyboard this method will return {@code -1}.

    + * + *

    This function may be called from any thread.

    + * + * @param key the key to query, or {@link #GLFW_KEY_UNKNOWN KEY_UNKNOWN} + * + * @return the platform dependent scancode for the key, or {@code -1} if an errror occurred + * + * @since version 3.3 + */ + public static int glfwGetKeyScancode(int key) { + long __functionAddress = Functions.GetKeyScancode; + return invokeI(key, __functionAddress); + } + + // --- [ glfwGetKey ] --- + + /** + * Returns the last state reported for the specified key to the specified window. The returned state is one of {@link #GLFW_PRESS PRESS} or {@link #GLFW_RELEASE RELEASE}. The action {@link #GLFW_REPEAT REPEAT} is + * only reported to the key callback. + * + *

    If the {@link #GLFW_STICKY_KEYS STICKY_KEYS} input mode is enabled, this function returns {@link #GLFW_PRESS PRESS} the first time you call it for a key that was pressed, even if that + * key has already been released.

    + * + *

    The key functions deal with physical keys, with key tokens named after their use on the standard US keyboard layout. If you want to input text, use the + * Unicode character callback instead.

    + * + *

    The modifier key bit masks are not key tokens and cannot be used with this function.

    + * + *

    Do not use this function to implement text input.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • {@link #GLFW_KEY_UNKNOWN KEY_UNKNOWN} is not a valid key for this function.
    • + *
    + * + * @param window the desired window + * @param key the desired keyboard key + * + * @return one of {@link #GLFW_PRESS PRESS} or {@link #GLFW_RELEASE RELEASE} + * + * @since version 1.0 + */ + public static int glfwGetKey(@NativeType("GLFWwindow *") long window, int key) { + long __functionAddress = Functions.GetKey; + if (CHECKS) { + check(window); + } + return invokePI(window, key, __functionAddress); + } + + // --- [ glfwGetMouseButton ] --- + + /** + * Returns the last state reported for the specified mouse button to the specified window. The returned state is one of {@link #GLFW_PRESS PRESS} or {@link #GLFW_RELEASE RELEASE}. The + * higher-level action {@link #GLFW_REPEAT REPEAT} is only reported to the mouse button callback. + * + *

    If the {@link #GLFW_STICKY_MOUSE_BUTTONS STICKY_MOUSE_BUTTONS} input mode is enabled, this function returns {@link #GLFW_PRESS PRESS} the first time you call it for a mouse button that was pressed, even + * if that mouse button has already been released.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the desired window + * @param button the desired mouse button + * + * @return one of {@link #GLFW_PRESS PRESS} or {@link #GLFW_RELEASE RELEASE} + * + * @since version 1.0 + */ + public static int glfwGetMouseButton(@NativeType("GLFWwindow *") long window, int button) { + long __functionAddress = Functions.GetMouseButton; + if (CHECKS) { + check(window); + } + return invokePI(window, button, __functionAddress); + } + + // --- [ glfwGetCursorPos ] --- + + /** Unsafe version of: {@link #glfwGetCursorPos GetCursorPos} */ + public static void nglfwGetCursorPos(long window, long xpos, long ypos) { + long __functionAddress = Functions.GetCursorPos; + if (CHECKS) { + check(window); + } + invokePPPV(window, xpos, ypos, __functionAddress); + } + + /** + * Returns the position of the cursor, in screen coordinates, relative to the upper-left corner of the content area of the specified window. + * + *

    If the cursor is disabled (with {@link #GLFW_CURSOR_DISABLED CURSOR_DISABLED}) then the cursor position is unbounded and limited only by the minimum and maximum values of a + * double.

    + * + *

    The coordinates can be converted to their integer equivalents with the {@link Math#floor} function. Casting directly to an integer type works for positive + * coordinates, but fails for negative ones.

    + * + *

    Any or all of the position arguments may be {@code NULL}. If an error occurs, all non-{@code NULL} position arguments will be set to zero.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the desired window + * @param xpos where to store the cursor x-coordinate, relative to the left edge of the content area, or {@code NULL} + * @param ypos where to store the cursor y-coordinate, relative to the to top edge of the content area, or {@code NULL}. + * + * @since version 1.0 + */ + public static void glfwGetCursorPos(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("double *") DoubleBuffer xpos, @Nullable @NativeType("double *") DoubleBuffer ypos) { + if (CHECKS) { + checkSafe(xpos, 1); + checkSafe(ypos, 1); + } + nglfwGetCursorPos(window, memAddressSafe(xpos), memAddressSafe(ypos)); + } + + // --- [ glfwSetCursorPos ] --- + + /** + * Sets the position, in screen coordinates, of the cursor relative to the upper-left corner of the content area of the specified window. The window must + * have input focus. If the window does not have input focus when this function is called, it fails silently. + * + *

    Do not use this function to implement things like camera controls. GLFW already provides the {@link #GLFW_CURSOR_DISABLED CURSOR_DISABLED} cursor mode that hides the cursor, + * transparently re-centers it and provides unconstrained cursor motion. See {@link #glfwSetInputMode SetInputMode} for more information.

    + * + *

    If the cursor mode is {@link #GLFW_CURSOR_DISABLED CURSOR_DISABLED} then the cursor position is unconstrained and limited only by the minimum and maximum values of double.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: This function will only work when the cursor mode is {@link #GLFW_CURSOR_DISABLED CURSOR_DISABLED}, otherwise it will emit {@link #GLFW_FEATURE_UNAVAILABLE FEATURE_UNAVAILABLE}.
    • + *
    + * + * @param window the desired window + * @param xpos the desired x-coordinate, relative to the left edge of the content area + * @param ypos the desired y-coordinate, relative to the top edge of the content area + * + * @since version 1.0 + */ + public static void glfwSetCursorPos(@NativeType("GLFWwindow *") long window, double xpos, double ypos) { + long __functionAddress = Functions.SetCursorPos; + if (CHECKS) { + check(window); + } + invokePV(window, xpos, ypos, __functionAddress); + } + + // --- [ glfwCreateCursor ] --- + + /** Unsafe version of: {@link #glfwCreateCursor CreateCursor} */ + public static long nglfwCreateCursor(long image, int xhot, int yhot) { + long __functionAddress = Functions.CreateCursor; + if (CHECKS) { + GLFWImage.validate(image); + } + return invokePP(image, xhot, yhot, __functionAddress); + } + + /** + * Creates a new custom cursor image that can be set for a window with {@link #glfwSetCursor SetCursor}. The cursor can be destroyed with {@link #glfwDestroyCursor DestroyCursor}. Any remaining + * cursors are destroyed by {@link #glfwTerminate Terminate}. + * + *

    The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight bits per channel with the red channel first. They are arranged canonically as + * packed sequential rows, starting from the top-left corner.

    + * + *

    The cursor hotspot is specified in pixels, relative to the upper-left corner of the cursor image. Like all other coordinate systems in GLFW, the X-axis + * points to the right and the Y-axis points down.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • The specified image data is copied before this function returns.
    • + *
    + * + * @param image the desired cursor image + * @param xhot the desired x-coordinate, in pixels, of the cursor hotspot + * @param yhot the desired y-coordinate, in pixels, of the cursor hotspot + * + * @return the handle of the created cursor, or {@code NULL} if an error occurred + * + * @since version 3.1 + */ + @NativeType("GLFWcursor *") + public static long glfwCreateCursor(@NativeType("GLFWimage const *") GLFWImage image, int xhot, int yhot) { + return nglfwCreateCursor(image.address(), xhot, yhot); + } + + // --- [ glfwCreateStandardCursor ] --- + + /** + * Returns a cursor with a standard shape, that can be set for a window with {@link #glfwSetCursor SetCursor}. + * + *

    The images for these cursors come from the system cursor theme and their exact appearance will vary between platforms.

    + * + *

    Most of these shapes are guaranteed to exist on every supported platform but a few may not be present. See the table below for details.

    + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Cursor shapeWindowsmacOSX11Wayland
    {@link #GLFW_ARROW_CURSOR ARROW_CURSOR}YesYesYesYes
    {@link #GLFW_IBEAM_CURSOR IBEAM_CURSOR}YesYesYesYes
    {@link #GLFW_CROSSHAIR_CURSOR CROSSHAIR_CURSOR}YesYesYesYes
    {@link #GLFW_POINTING_HAND_CURSOR POINTING_HAND_CURSOR}YesYesYesYes
    {@link #GLFW_RESIZE_EW_CURSOR RESIZE_EW_CURSOR}YesYesYesYes
    {@link #GLFW_RESIZE_NS_CURSOR RESIZE_NS_CURSOR}YesYesYesYes
    {@link #GLFW_RESIZE_NWSE_CURSOR RESIZE_NWSE_CURSOR}YesYes1Maybe2Maybe2
    {@link #GLFW_RESIZE_NESW_CURSOR RESIZE_NESW_CURSOR}YesYes1Maybe2Maybe2
    {@link #GLFW_RESIZE_ALL_CURSOR RESIZE_ALL_CURSOR}YesYesYesYes
    {@link #GLFW_NOT_ALLOWED_CURSOR NOT_ALLOWED_CURSOR}YesYesMaybe2Maybe2
    + * + *
    Note
    + * + *
      + *
    1. This uses a private system API and may fail in the future.
    2. + *
    3. This uses a newer standard that not all cursor themes support.
    4. + *
    + * + *

    If the requested shape is not available, this function emits a {@link #GLFW_CURSOR_UNAVAILABLE CURSOR_UNAVAILABLE} error and returns {@code NULL}.

    + * + *

    This function must only be called from the main thread.

    + * + * @param shape one of the standard shapes. One of:
    {@link #GLFW_ARROW_CURSOR ARROW_CURSOR}{@link #GLFW_IBEAM_CURSOR IBEAM_CURSOR}{@link #GLFW_CROSSHAIR_CURSOR CROSSHAIR_CURSOR}{@link #GLFW_POINTING_HAND_CURSOR POINTING_HAND_CURSOR}{@link #GLFW_RESIZE_EW_CURSOR RESIZE_EW_CURSOR}
    {@link #GLFW_RESIZE_NS_CURSOR RESIZE_NS_CURSOR}{@link #GLFW_RESIZE_NWSE_CURSOR RESIZE_NWSE_CURSOR}{@link #GLFW_RESIZE_NESW_CURSOR RESIZE_NESW_CURSOR}{@link #GLFW_RESIZE_ALL_CURSOR RESIZE_ALL_CURSOR}{@link #GLFW_NOT_ALLOWED_CURSOR NOT_ALLOWED_CURSOR}
    + * + * @return a new cursor ready to use or {@code NULL} if an error occurred. Possible errors include {@link #GLFW_NOT_INITIALIZED NOT_INITIALIZED}, {@link #GLFW_INVALID_ENUM INVALID_ENUM}, {@link #GLFW_CURSOR_UNAVAILABLE CURSOR_UNAVAILABLE} and + * {@link #GLFW_PLATFORM_ERROR PLATFORM_ERROR}. + * + * @since version 3.1 + */ + @NativeType("GLFWcursor *") + public static long glfwCreateStandardCursor(int shape) { + long __functionAddress = Functions.CreateStandardCursor; + return invokeP(shape, __functionAddress); + } + + // --- [ glfwDestroyCursor ] --- + + /** + * Destroys a cursor previously created with {@link #glfwCreateCursor CreateCursor}. Any remaining cursors will be destroyed by {@link #glfwTerminate Terminate}. + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • This function must not be called from a callback.
    • + *
    + * + * @param cursor the cursor object to destroy + * + * @since version 3.1 + */ + public static void glfwDestroyCursor(@NativeType("GLFWcursor *") long cursor) {} + + // --- [ glfwSetCursor ] --- + + /** + * Sets the cursor image to be used when the cursor is over the content area of the specified window. The set cursor will only be visible when the + * cursor mode of the window is {@link #GLFW_CURSOR_NORMAL CURSOR_NORMAL}. + * + *

    On some platforms, the set cursor may not be visible unless the window also has input focus.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window to set the system cursor for + * @param cursor the cursor to set, or {@code NULL} to switch back to the default arrow cursor + * + * @since version 3.1 + */ + public static void glfwSetCursor(@NativeType("GLFWwindow *") long window, @NativeType("GLFWcursor *") long cursor) {} + + // --- [ glfwSetKeyCallback ] --- + + /** Unsafe version of: {@link #glfwSetKeyCallback SetKeyCallback} */ + public static long nglfwSetKeyCallback(long window, long cbfun) { + long __functionAddress = Functions.SetKeyCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the key callback of the specified window, which is called when a key is pressed, repeated or released. + * + *

    The key functions deal with physical keys, with layout independent key tokens named after their values in the standard US keyboard layout. If you want + * to input text, use {@link #glfwSetCharCallback SetCharCallback} instead.

    + * + *

    When a window loses input focus, it will generate synthetic key release events for all pressed keys. You can tell these events from user-generated + * events by the fact that the synthetic ones are generated after the focus loss event has been processed, i.e. after the window focus callback has been + * called.

    + * + *

    The scancode of a key is specific to that platform or sometimes even to that machine. Scancodes are intended to allow users to bind keys that don't have + * a GLFW key token. Such keys have {@code key} set to {@link #GLFW_KEY_UNKNOWN KEY_UNKNOWN}, their state is not saved and so it cannot be queried with {@link #glfwGetKey GetKey}.

    + * + *

    Sometimes GLFW needs to generate synthetic key events, in which case the scancode may be zero.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set + * + * @since version 1.0 + */ + @Nullable + @NativeType("GLFWkeyfun") + public static GLFWKeyCallback glfwSetKeyCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWkeyfun") GLFWKeyCallbackI cbfun) { + return GLFWKeyCallback.createSafe(nglfwSetKeyCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetCharCallback ] --- + + /** Unsafe version of: {@link #glfwSetCharCallback SetCharCallback} */ + public static long nglfwSetCharCallback(long window, long cbfun) { + long __functionAddress = Functions.SetCharCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the character callback of the specified window, which is called when a Unicode character is input. + * + *

    The character callback is intended for Unicode text input. As it deals with characters, it is keyboard layout dependent, whereas {@link #glfwSetKeyCallback SetKeyCallback} is + * not. Characters do not map 1:1 to physical keys, as a key may produce zero, one or more characters. If you want to know whether a specific physical key + * was pressed or released, see the key callback instead.

    + * + *

    The character callback behaves as system text input normally does and will not be called if modifier keys are held down that would prevent normal text + * input on that platform, for example a Super (Command) key on macOS or Alt key on Windows.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set + * + * @since version 2.4 + */ + @Nullable + @NativeType("GLFWcharfun") + public static GLFWCharCallback glfwSetCharCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWcharfun") GLFWCharCallbackI cbfun) { + return GLFWCharCallback.createSafe(nglfwSetCharCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetCharModsCallback ] --- + + /** Unsafe version of: {@link #glfwSetCharModsCallback SetCharModsCallback} */ + public static long nglfwSetCharModsCallback(long window, long cbfun) { + long __functionAddress = Functions.SetCharModsCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the character with modifiers callback of the specified window, which is called when a Unicode character is input regardless of what modifier keys + * are used. + * + *

    The character with modifiers callback is intended for implementing custom Unicode character input. For regular Unicode text input, see + * {@link #glfwSetCharCallback SetCharCallback}. Like the character callback, the character with modifiers callback deals with characters and is keyboard layout dependent. + * Characters do not map 1:1 to physical keys, as a key may produce zero, one or more characters. If you want to know whether a specific physical key was + * pressed or released, see {@link #glfwSetKeyCallback SetKeyCallback} instead.

    + * + *

    This function must only be called from the main thread.

    + * + *

    Deprecated: scheduled for removal in version 4.0.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set + * + * @since version 3.1 + */ + @Nullable + @NativeType("GLFWcharmodsfun") + public static GLFWCharModsCallback glfwSetCharModsCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWcharmodsfun") GLFWCharModsCallbackI cbfun) { + return GLFWCharModsCallback.createSafe(nglfwSetCharModsCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetMouseButtonCallback ] --- + + /** Unsafe version of: {@link #glfwSetMouseButtonCallback SetMouseButtonCallback} */ + public static long nglfwSetMouseButtonCallback(long window, long cbfun) { + long __functionAddress = Functions.SetMouseButtonCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the mouse button callback of the specified window, which is called when a mouse button is pressed or released. + * + *

    When a window loses input focus, it will generate synthetic mouse button release events for all pressed mouse buttons. You can tell these events from + * user-generated events by the fact that the synthetic ones are generated after the focus loss event has been processed, i.e. after the window focus + * callback has been called.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set + * + * @since version 1.0 + */ + @Nullable + @NativeType("GLFWmousebuttonfun") + public static GLFWMouseButtonCallback glfwSetMouseButtonCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWmousebuttonfun") GLFWMouseButtonCallbackI cbfun) { + return GLFWMouseButtonCallback.createSafe(nglfwSetMouseButtonCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetCursorPosCallback ] --- + + /** Unsafe version of: {@link #glfwSetCursorPosCallback SetCursorPosCallback} */ + public static long nglfwSetCursorPosCallback(long window, long cbfun) { + long __functionAddress = Functions.SetCursorPosCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the cursor position callback of the specified window, which is called when the cursor is moved. The callback is provided with the position, in + * screen coordinates, relative to the upper-left corner of the content area of the window. + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set + * + * @since version 1.0 + */ + @Nullable + @NativeType("GLFWcursorposfun") + public static GLFWCursorPosCallback glfwSetCursorPosCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWcursorposfun") GLFWCursorPosCallbackI cbfun) { + return GLFWCursorPosCallback.createSafe(nglfwSetCursorPosCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetCursorEnterCallback ] --- + + /** Unsafe version of: {@link #glfwSetCursorEnterCallback SetCursorEnterCallback} */ + public static long nglfwSetCursorEnterCallback(long window, long cbfun) { + long __functionAddress = Functions.SetCursorEnterCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the cursor boundary crossing callback of the specified window, which is called when the cursor enters or leaves the content area of the window. + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set + * + * @since version 3.0 + */ + @Nullable + @NativeType("GLFWcursorenterfun") + public static GLFWCursorEnterCallback glfwSetCursorEnterCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWcursorenterfun") GLFWCursorEnterCallbackI cbfun) { + return GLFWCursorEnterCallback.createSafe(nglfwSetCursorEnterCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetScrollCallback ] --- + + /** Unsafe version of: {@link #glfwSetScrollCallback SetScrollCallback} */ + public static long nglfwSetScrollCallback(long window, long cbfun) { + long __functionAddress = Functions.SetScrollCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the scroll callback of the specified window, which is called when a scrolling device is used. + * + *

    The scroll callback receives all scrolling input, like that from a mouse wheel or a touchpad scrolling area.

    + * + *

    This function must only be called from the main thread.

    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set + * + * @since version 2.1 + */ + @Nullable + @NativeType("GLFWscrollfun") + public static GLFWScrollCallback glfwSetScrollCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWscrollfun") GLFWScrollCallbackI cbfun) { + return GLFWScrollCallback.createSafe(nglfwSetScrollCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwSetDropCallback ] --- + + /** Unsafe version of: {@link #glfwSetDropCallback SetDropCallback} */ + public static long nglfwSetDropCallback(long window, long cbfun) { + long __functionAddress = Functions.SetDropCallback; + if (CHECKS) { + check(window); + } + return invokePPP(window, cbfun, __functionAddress); + } + + /** + * Sets the file drop callback of the specified window, which is called when one or more dragged files are dropped on the window. + * + *

    Because the path array and its strings may have been generated specifically for that event, they are not guaranteed to be valid after the callback has + * returned. If you wish to use them after the callback returns, you need to make a deep copy.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • Wayland: File drop is currently unimplemented.
    • + *
    + * + * @param window the window whose callback to set + * @param cbfun the new callback or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set + * + * @since version 3.1 + */ + @Nullable + @NativeType("GLFWdropfun") + public static GLFWDropCallback glfwSetDropCallback(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("GLFWdropfun") GLFWDropCallbackI cbfun) { + return GLFWDropCallback.createSafe(nglfwSetDropCallback(window, memAddressSafe(cbfun))); + } + + // --- [ glfwJoystickPresent ] --- + + /** + * Returns whether the specified joystick is present. + * + *

    This function must only be called from the main thread.

    + * + * @param jid joystick to query + * + * @return {@link #GLFW_TRUE TRUE} if the joystick is present, or {@link #GLFW_FALSE FALSE} otherwise + * + * @since version 3.0 + */ + @NativeType("int") + public static boolean glfwJoystickPresent(int jid) { + return false; + } + + // --- [ glfwGetJoystickAxes ] --- + + /** + * Returns the values of all axes of the specified joystick. Each element in the array is a value between -1.0 and 1.0. + * + *

    If the specified joystick is not present this function will return {@code NULL} but will not generate an error. This can be used instead of first calling + * {@link #glfwJoystickPresent JoystickPresent}.

    + * + *

    The returned array is allocated and freed by GLFW. You should not free it yourself. It is valid until the specified joystick is disconnected, this + * function is called again for that joystick or the library is terminated.

    + * + *

    This function must only be called from the main thread.

    + * + * @param jid the joystick to query + * + * @return an array of axis values, or {@code NULL} if the joystick is not present + * + * @since version 2.2 + */ + @Nullable + @NativeType("float const *") + public static FloatBuffer glfwGetJoystickAxes(int jid) { + return null; + } + + // --- [ glfwGetJoystickButtons ] --- + + /** + * Returns the state of all buttons of the specified joystick. Each element in the array is either {@link #GLFW_PRESS PRESS} or {@link #GLFW_RELEASE RELEASE}. + * + *

    For backward compatibility with earlier versions that did not have {@link #glfwGetJoystickHats GetJoystickHats}, the button array also includes all hats, each represented as four + * buttons. The hats are in the same order as returned by {@link #glfwGetJoystickHats GetJoystickHats} and are in the order up, right, down and left. To disable these extra + * buttons, set the {@link #GLFW_JOYSTICK_HAT_BUTTONS JOYSTICK_HAT_BUTTONS} init hint before initialization.

    + * + *

    If the specified joystick is not present this function will return {@code NULL} but will not generate an error. This can be used instead of first calling + * {@link #glfwJoystickPresent JoystickPresent}.

    + * + *

    The returned array is allocated and freed by GLFW. You should not free it yourself. It is valid until the specified joystick is disconnected, this + * function is called again for that joystick or the library is terminated.

    + * + *

    This function must only be called from the main thread.

    + * + * @param jid the joystick to query + * + * @return an array of button states, or {@code NULL} if the joystick is not present + * + * @since version 2.2 + */ + @Nullable + @NativeType("unsigned char const *") + public static ByteBuffer glfwGetJoystickButtons(int jid) { + return null; + } + + // --- [ glfwGetJoystickHats ] --- + + /** + * Returns the state of all hats of the specified joystick. + * + *

    This function returns the state of all hats of the specified joystick. Each element in the array is one of the following values:

    + * + *
    
    +     * Name                | Value
    +     * ------------------- | ------------------------------
    +     * GLFW_HAT_CENTERED   | 0
    +     * GLFW_HAT_UP         | 1
    +     * GLFW_HAT_RIGHT      | 2
    +     * GLFW_HAT_DOWN       | 4
    +     * GLFW_HAT_LEFT       | 8
    +     * GLFW_HAT_RIGHT_UP   | GLFW_HAT_RIGHT | GLFW_HAT_UP
    +     * GLFW_HAT_RIGHT_DOWN | GLFW_HAT_RIGHT | GLFW_HAT_DOWN
    +     * GLFW_HAT_LEFT_UP    | GLFW_HAT_LEFT  | GLFW_HAT_UP
    +     * GLFW_HAT_LEFT_DOWN  | GLFW_HAT_LEFT  | GLFW_HAT_DOWN
    + * + *

    The diagonal directions are bitwise combinations of the primary (up, right, down and left) directions and you can test for these individually by ANDing + * it with the corresponding direction.

    + * + *
    
    +     * if (hats[2] & GLFW_HAT_RIGHT)
    +     * {
    +     *     // State of hat 2 could be right-up, right or right-down
    +     * }
    + * + *

    If the specified joystick is not present this function will return {@code NULL} but will not generate an error. This can be used instead of first calling + * {@link #glfwJoystickPresent JoystickPresent}.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • The returned array is allocated and freed by GLFW. You should not free it yourself. It is valid until the specified joystick is disconnected, this + * function is called again for that joystick or the library is terminated.
    • + *
    + * + * @param jid the joystick to query + * + * @return an array of hat states, or {@code NULL} if the joystick is not present or an error occurred + * + * @since version 3.3 + */ + @Nullable + @NativeType("unsigned char const *") + public static ByteBuffer glfwGetJoystickHats(int jid) { + return null; + } + + // --- [ glfwGetJoystickName ] --- + + /** + * Returns the name, encoded as UTF-8, of the specified joystick. + * + *

    If the specified joystick is not present this function will return {@code NULL} but will not generate an error. This can be used instead of first calling + * {@link #glfwJoystickPresent JoystickPresent}.

    + * + *

    The returned string is allocated and freed by GLFW. You should not free it yourself. It is valid until the specified joystick is disconnected, this + * function is called again for that joystick or the library is terminated.

    + * + *

    This function must only be called from the main thread.

    + * + * @param jid the joystick to query + * + * @return the UTF-8 encoded name of the joystick, or {@code NULL} if the joystick is not present + * + * @since version 3.0 + */ + @Nullable + @NativeType("char const *") + public static String glfwGetJoystickName(int jid) { + return null; + } + + // --- [ glfwGetJoystickGUID ] --- + + /** + * Returns the SDL compatible GUID, as a UTF-8 encoded hexadecimal string, of the specified joystick. + * + *

    The GUID is what connects a joystick to a gamepad mapping. A connected joystick will always have a GUID even if there is no gamepad mapping assigned to + * it.

    + * + *

    The GUID uses the format introduced in SDL 2.0.5. This GUID tries to uniquely identify the make and model of a joystick but does not identify a + * specific unit, e.g. all wired Xbox 360 controllers will have the same GUID on that platform. The GUID for a unit may vary between platforms depending + * on what hardware information the platform specific APIs provide.

    + * + *

    If the specified joystick is not present this function will return {@code NULL} but will not generate an error. This can be used instead of first calling + * {@link #glfwJoystickPresent JoystickPresent}.

    + * + *

    The returned string is allocated and freed by GLFW. You should not free it yourself. It is valid until the specified joystick is disconnected or the + * library is terminated.

    + * + *

    This function must only be called from the main thread.

    + * + * @param jid the joystick to query + * + * @return the UTF-8 encoded GUID of the joystick, or {@code NULL} if the joystick is not present or an error occurred + * + * @since version 3.3 + */ + @Nullable + @NativeType("char const *") + public static String glfwGetJoystickGUID(int jid) { + return null; + } + + // --- [ glfwSetJoystickUserPointer ] --- + + /** + * Sets the user pointer of the specified joystick. + * + *

    This function sets the user-defined pointer of the specified joystick. The current value is retained until the joystick is disconnected. The initial + * value is {@code NULL}.

    + * + *

    This function may be called from the joystick callback, even for a joystick that is being disconnected.

    + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param jid the joystick whose pointer to set + * @param pointer the new value + * + * @since version 3.3 + */ + public static void glfwSetJoystickUserPointer(int jid, @NativeType("void *") long pointer) { + + } + + // --- [ glfwGetJoystickUserPointer ] --- + + /** + * Returns the user pointer of the specified joystick. + * + *

    This function returns the current value of the user-defined pointer of the specified joystick. The initial value is {@code NULL}.

    + * + *

    This function may be called from the joystick callback, even for a joystick that is being disconnected.

    + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param jid the joystick whose pointer to set + * + * @since version 3.3 + */ + @NativeType("void *") + public static long glfwGetJoystickUserPointer(int jid) { + return 0; + } + + // --- [ glfwJoystickIsGamepad ] --- + + /** + * Returns whether the specified joystick is both present and has a gamepad mapping. + * + *

    If the specified joystick is present but does not have a gamepad mapping this function will return {@code false} but will not generate an error. Call + * {@link #glfwJoystickPresent JoystickPresent} to check if a joystick is present regardless of whether it has a mapping.

    + * + *

    This function must only be called from the main thread.

    + * + * @param jid the joystick id to query + * + * @return {@code true} if a joystick is both present and has a gamepad mapping or {@code false} otherwise + * + * @since version 3.3 + */ + @NativeType("int") + public static boolean glfwJoystickIsGamepad(int jid) { + return false; + } + + // --- [ glfwSetJoystickCallback ] --- + + /** + * Sets the joystick configuration callback, or removes the currently set callback. This is called when a joystick is connected to or disconnected from + * the system. + * + *

    For joystick connection and disconnection events to be delivered on all platforms, you need to call one of the event processing functions. Joystick + * disconnection may also be detected and the callback called by joystick functions. The function will then return whatever it returns if the joystick is + * not present.

    + * + *

    This function must only be called from the main thread.

    + * + * @param cbfun the new callback, or {@code NULL} to remove the currently set callback + * + * @return the previously set callback, or {@code NULL} if no callback was set or the library had not been initialized + * + * @since version 3.2 + */ + @Nullable + @NativeType("GLFWjoystickfun") + public static GLFWJoystickCallback glfwSetJoystickCallback(@Nullable @NativeType("GLFWjoystickfun") GLFWJoystickCallbackI cbfun) { + return null; + } + + // --- [ glfwUpdateGamepadMappings ] --- + + /** + * Adds the specified SDL_GameControllerDB gamepad mappings. + * + *

    This function parses the specified ASCII encoded string and updates the internal list with any gamepad mappings it finds. This string may contain either + * a single gamepad mapping or many mappings separated by newlines. The parser supports the full format of the {@code gamecontrollerdb.txt} source file + * including empty lines and comments.

    + * + *

    See gamepad_mapping for a description of the format.

    + * + *

    If there is already a gamepad mapping for a given GUID in the internal list, it will be replaced by the one passed to this function. If the library is + * terminated and re-initialized the internal list will revert to the built-in default.

    + * + *

    This function must only be called from the main thread.

    + * + * @param string the string containing the gamepad mappings + * + * @return {@code true}, or {@code false} if an error occurred + * + * @since version 3.3 + */ + @NativeType("int") + public static boolean glfwUpdateGamepadMappings(@NativeType("char const *") ByteBuffer string) { + return false; + } + + // --- [ glfwGetGamepadName ] --- + + /** + * Returns the human-readable name of the gamepad from the gamepad mapping assigned to the specified joystick. + * + *

    If the specified joystick is not present or does not have a gamepad mapping this function will return {@code NULL} but will not generate an error. Call + * {@link #glfwJoystickIsGamepad JoystickIsGamepad} to check if a joystick is present regardless of whether it has a mapping.

    + * + *

    The returned string is allocated and freed by GLFW. You should not free it yourself. It is valid until the specified joystick is disconnected, the + * gamepad mappings are updated or the library is terminated.

    + * + *

    This function must only be called from the main thread.

    + * + * @param jid the joystick to query + * + * @return the UTF-8 encoded name of the gamepad, or {@code NULL} if the joystick is not present, does not have a mapping or an error occurred + * + * @since version 3.3 + */ + @Nullable + @NativeType("char const *") + public static String glfwGetGamepadName(int jid) { + return null; + } + + // --- [ glfwGetGamepadState ] --- + + /** + * Retrieves the state of the specified joystick remapped to an Xbox-like gamepad. + * + *

    If the specified joystick is not present or does not have a gamepad mapping this function will return {@link #GLFW_FALSE FALSE} but will not generate an error. Call + * {@link #glfwJoystickPresent JoystickPresent} to check whether it is present regardless of whether it has a mapping.

    + * + *

    The Guide button may not be available for input as it is often hooked by the system or the Steam client.

    + * + *

    Not all devices have all the buttons or axes provided by {@link GLFWGamepadState}. Unavailable buttons and axes will always report {@link #GLFW_RELEASE RELEASE} and 0.0 + * respectively.

    + * + *

    This function must only be called from the main thread.

    + * + * @param jid the joystick to query + * @param state the gamepad input state of the joystick + * + * @return {@code true} if successful, or {@code false} if no joystick is connected, it has no gamepad mapping or an error occurred + * + * @since version 3.3 + */ + @NativeType("int") + public static boolean glfwGetGamepadState(int jid, @NativeType("GLFWgamepadstate *") GLFWGamepadState state) { + return false; + } + + // --- [ glfwSetClipboardString ] --- + + /** Unsafe version of: {@link #glfwSetClipboardString SetClipboardString} */ + public static void nglfwSetClipboardString(long window, long string) { + long __functionAddress = Functions.SetClipboardString; + invokePPV(window, string, __functionAddress); + } + + /** + * Sets the system clipboard to the specified, UTF-8 encoded string. + * + *

    The specified string is copied before this function returns.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    + * + * @param window deprecated, any valid window or {@code NULL}. + * @param string a UTF-8 encoded string + * + * @since version 3.0 + */ + public static void glfwSetClipboardString(@NativeType("GLFWwindow *") long window, @NativeType("char const *") ByteBuffer string) { + if (CHECKS) { + checkNT1(string); + } + nglfwSetClipboardString(window, memAddress(string)); + } + + /** + * Sets the system clipboard to the specified, UTF-8 encoded string. + * + *

    The specified string is copied before this function returns.

    + * + *

    Notes:

    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    + * + * @param window deprecated, any valid window or {@code NULL}. + * @param string a UTF-8 encoded string + * + * @since version 3.0 + */ + public static void glfwSetClipboardString(@NativeType("GLFWwindow *") long window, @NativeType("char const *") CharSequence string) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(string, true); + long stringEncoded = stack.getPointerAddress(); + nglfwSetClipboardString(window, stringEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glfwGetClipboardString ] --- + + /** Unsafe version of: {@link #glfwGetClipboardString GetClipboardString} */ + public static long nglfwGetClipboardString(long window) { + long __functionAddress = Functions.GetClipboardString; + return invokePP(window, __functionAddress); + } + + /** + * Returns the contents of the system clipboard, if it contains or is convertible to a UTF-8 encoded string. If the clipboard is empty or if its contents + * cannot be converted, {@code NULL} is returned and a {@link #GLFW_FORMAT_UNAVAILABLE FORMAT_UNAVAILABLE} error is generated. + * + *

    The returned string is allocated and freed by GLFW. You should not free it yourself. It is valid until the next call to {@link #glfwGetClipboardString GetClipboardString} or + * {@link #glfwSetClipboardString SetClipboardString}, or until the library is terminated.

    + * + *
    Note
    + * + *
      + *
    • This function must only be called from the main thread.
    • + *
    • The returned string is allocated and freed by GLFW. You should not free it yourself.
    • + *
    • The returned string is valid only until the next call to {@link #glfwGetClipboardString GetClipboardString} or {@link #glfwSetClipboardString SetClipboardString}.
    • + *
    + * + * @param window deprecated, any valid window or {@code NULL}. + * + * @return the contents of the clipboard as a UTF-8 encoded string, or {@code NULL} if an error occurred + * + * @since version 3.0 + */ + @Nullable + @NativeType("char const *") + public static String glfwGetClipboardString(@NativeType("GLFWwindow *") long window) { + long __result = nglfwGetClipboardString(window); + return memUTF8Safe(__result); + } + + // --- [ glfwGetTime ] --- + + /** + * Returns the value of the GLFW timer. Unless the timer has been set using {@link #glfwSetTime SetTime}, the timer measures time elapsed since GLFW was initialized. + * + *

    The resolution of the timer is system dependent, but is usually on the order of a few micro- or nanoseconds. It uses the highest-resolution monotonic + * time source on each operating system.

    + * + *

    This function may be called from any thread. Reading and writing of the internal timer offset is not atomic, so it needs to be externally synchronized + * with calls to {@link #glfwSetTime SetTime}.

    + * + * @return the current value, in seconds, or zero if an error occurred + * + * @since version 1.0 + */ + public static double glfwGetTime() { + return (System.nanoTime() - glfwInitialTime) / 1.e9; + } + + // --- [ glfwSetTime ] --- + + /** + * Sets the value of the GLFW timer. It then continues to count up from that value. The value must be a positive finite number less than or equal to + * 18446744073.0, which is approximately 584.5 years. + * + *

    The upper limit of the timer is calculated as floor((264 - 1) / 109) and is due to implementations storing nanoseconds + * in 64 bits. The limit may be increased in the future.

    + * + *

    This function may be called from any thread. Reading and writing of the internal timer offset is not atomic, so it needs to be externally synchronized + * with calls to {@link #glfwGetTime GetTime}.

    + * + * @param time the new value, in seconds + * + * @since version 2.2 + */ + public static void glfwSetTime(double time) { + glfwInitialTime = System.nanoTime() - (long) time; + } + + // --- [ glfwGetTimerValue ] --- + + /** + * Returns the current value of the raw timer. + * + *

    This function returns the current value of the raw timer, measured in {@code 1 / frequency} seconds. To get the frequency, call {@link #glfwGetTimerFrequency GetTimerFrequency}.

    + * + *

    This function may be called from any thread.

    + * + * @return the value of the timer, or zero if an error occurred + * + * @since version 3.2 + */ + @NativeType("uint64_t") + public static long glfwGetTimerValue() { + return System.currentTimeMillis(); + } + + // --- [ glfwGetTimerFrequency ] --- + + /** + * Returns the frequency, in Hz, of the raw timer. + * + *

    This function may be called from any thread.

    + * + * @return the frequency of the timer, in Hz, or zero if an error occurred + * + * @since version 3.2 + */ + @NativeType("uint64_t") + public static long glfwGetTimerFrequency() { + long __functionAddress = Functions.GetTimerFrequency; + return invokeJ(__functionAddress); + } + + // --- [ glfwGetOSMesaWidth ] --- + + /** + * Get OSMesa width + */ + public static int glfwGetOSMesaWidth() { + long __functionAddress = Functions.GetOSMesaWidth; + return invokeI(__functionAddress); + } + + // --- [ glfwGetOSMesaHeight ] --- + + /** + * Get OSMesa height + */ + public static int glfwGetOSMesaHeight() { + long __functionAddress = Functions.GetOSMesaHeight; + return invokeI(__functionAddress); + } + + // --- [ glfwGetOSMesaContext ] --- + + /** + * Get OSMesa Context + */ + public static long glfwGetOSMesaCurrentContext() { + long __functionAddress = Functions.GetOSMesaCurrentContext; + return invokeJ(__functionAddress); + } + + // --- [ glfwGetGraphicBuffersAddr ] --- + + /** + * Get Graphic Buffers Addr + */ + public static long glfwGetGraphicBuffersAddr(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetGraphicBuffersAddr; + return invokePJ(window, __functionAddress); + } + + // --- [ glfwMakeContextCurrent ] --- + + /** + * Makes the OpenGL or OpenGL ES context of the specified window current on the calling thread. A context must only be made current on a single thread at + * a time and each thread can have only a single current context at a time. + * + *

    When moving a context between threads, you must make it non-current on the old thread before making it current on the new one.

    + * + *

    By default, making a context non-current implicitly forces a pipeline flush. On machines that support + * GL_KHR_context_flush_control, you can control whether + * a context performs this flush by setting the {@link #GLFW_CONTEXT_RELEASE_BEHAVIOR CONTEXT_RELEASE_BEHAVIOR} + * window hint.

    + * + *

    The specified window must have an OpenGL or OpenGL ES context. Specifying a window without a context will generate a {@link #GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} error.

    + * + *

    This function may be called from any thread.

    + * + * @param window the window whose context to make current, or {@code NULL} to detach the current context + * + * @since version 3.0 + */ + public static void glfwMakeContextCurrent(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.MakeContextCurrent; + invokePV(window, __functionAddress); + } + + // --- [ glfwGetCurrentContext ] --- + + /** + * Returns the window whose OpenGL or OpenGL ES context is current on the calling thread. + * + *

    This function may be called from any thread.

    + * + * @return the window whose context is current, or {@code NULL} if no window's context is current + * + * @since version 3.0 + */ + @NativeType("GLFWwindow *") + public static long glfwGetCurrentContext() { + long __functionAddress = Functions.GetCurrentContext; + return invokeP(__functionAddress); + } + + // --- [ glfwSwapBuffers ] --- + + /** + * Swaps the front and back buffers of the specified window when rendering with OpenGL or OpenGL ES. If the swap interval is greater than zero, the GPU + * driver waits the specified number of screen updates before swapping the buffers. + * + *

    The specified window must have an OpenGL or OpenGL ES context. Specifying a window without a context will generate a {@link #GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} error.

    + * + *

    This function does not apply to Vulkan. If you are rendering with Vulkan, {@code vkQueuePresentKHR} instead.

    + * + *

    EGL: The context of the specified window must be current on the calling thread.

    + * + *

    This function may be called from any thread.

    + * + * @param window the window whose buffers to swap + * + * @since version 1.0 + */ + public static void glfwSwapBuffers(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.SwapBuffers; + if (CHECKS) { + check(window); + } + invokePV(window, __functionAddress); + } + + // --- [ glfwSwapInterval ] --- + + /** + * Sets the swap interval for the current OpenGL or OpenGL ES context, i.e. the number of screen updates to wait from the time {@link #glfwSwapBuffers SwapBuffers} was called + * before swapping the buffers and returning. This is sometimes called vertical synchronization, vertical retrace synchronization or just + * vsync. + * + *

    A context that supports either of the + * WGL_EXT_swap_control_tear and + * GLX_EXT_swap_control_tear extensions also accepts + * negative swap intervals, which allows the driver to swap immediately even if a frame arrives a little bit late. You can check for these + * extensions with {@link #glfwExtensionSupported ExtensionSupported}. For more information about swap tearing, see the extension specifications.

    + * + *

    A context must be current on the calling thread. Calling this function without a current context will cause a {@link #GLFW_NO_CURRENT_CONTEXT NO_CURRENT_CONTEXT} error.

    + * + *

    This function does not apply to Vulkan. If you are rendering with Vulkan, see the present mode of your swapchain instead.

    + * + *
    Note
    + * + *
      + *
    • This function may be called from any thread.
    • + *
    • This function is not called during window creation, leaving the swap interval set to whatever is the default for that API. This is done because + * some swap interval extensions used by GLFW do not allow the swap interval to be reset to zero once it has been set to a non-zero value.
    • + *
    • Some GPU drivers do not honor the requested swap interval, either because of a user setting that overrides the application's request or due to bugs + * in the driver.
    • + *
    + * + * @param interval the minimum number of screen updates to wait for until the buffers are swapped by {@link #glfwSwapBuffers SwapBuffers} + * + * @since version 1.0 + */ + public static void glfwSwapInterval(int interval) { + long __functionAddress = Functions.SwapInterval; + invokeV(interval, __functionAddress); + } + + // --- [ glfwExtensionSupported ] --- + + /** Unsafe version of: {@link #glfwExtensionSupported ExtensionSupported} */ + public static int nglfwExtensionSupported(long extension) { + long __functionAddress = Functions.ExtensionSupported; + return invokePI(extension, __functionAddress); + } + + /** + * Returns whether the specified API extension is supported by the current + * OpenGL or OpenGL ES context. It searches both for client API extension and context creation API extensions. + * + *

    A context must be current on the calling thread. Calling this function without a current context will cause a {@link #GLFW_NO_CURRENT_CONTEXT NO_CURRENT_CONTEXT} error.

    + * + *

    As this functions retrieves and searches one or more extension strings each call, it is recommended that you cache its results if it is going to be used + * frequently. The extension strings will not change during the lifetime of a context, so there is no danger in doing this.

    + * + *

    This function does not apply to Vulkan. If you are using Vulkan, see {@code glfwGetRequiredInstanceExtensions}, + * {@code vkEnumerateInstanceExtensionProperties} and {@code vkEnumerateDeviceExtensionProperties} instead.

    + * + *

    This function may be called from any thread.

    + * + * @param extension the ASCII encoded name of the extension + * + * @return {@link #GLFW_TRUE TRUE} if the extension is available, or {@link #GLFW_FALSE FALSE} otherwise + * + * @since version 1.0 + */ + @NativeType("int") + public static boolean glfwExtensionSupported(@NativeType("char const *") ByteBuffer extension) { + if (CHECKS) { + checkNT1(extension); + } + return nglfwExtensionSupported(memAddress(extension)) != 0; + } + + /** + * Returns whether the specified API extension is supported by the current + * OpenGL or OpenGL ES context. It searches both for client API extension and context creation API extensions. + * + *

    A context must be current on the calling thread. Calling this function without a current context will cause a {@link #GLFW_NO_CURRENT_CONTEXT NO_CURRENT_CONTEXT} error.

    + * + *

    As this functions retrieves and searches one or more extension strings each call, it is recommended that you cache its results if it is going to be used + * frequently. The extension strings will not change during the lifetime of a context, so there is no danger in doing this.

    + * + *

    This function does not apply to Vulkan. If you are using Vulkan, see {@code glfwGetRequiredInstanceExtensions}, + * {@code vkEnumerateInstanceExtensionProperties} and {@code vkEnumerateDeviceExtensionProperties} instead.

    + * + *

    This function may be called from any thread.

    + * + * @param extension the ASCII encoded name of the extension + * + * @return {@link #GLFW_TRUE TRUE} if the extension is available, or {@link #GLFW_FALSE FALSE} otherwise + * + * @since version 1.0 + */ + @NativeType("int") + public static boolean glfwExtensionSupported(@NativeType("char const *") CharSequence extension) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(extension, true); + long extensionEncoded = stack.getPointerAddress(); + return nglfwExtensionSupported(extensionEncoded) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glfwGetProcAddress ] --- + + /** Unsafe version of: {@link #glfwGetProcAddress GetProcAddress} */ + public static long nglfwGetProcAddress(long procname) { + long __functionAddress = Functions.GetProcAddress; + return invokePP(procname, __functionAddress); + } + + /** + * Returns the address of the specified OpenGL or OpenGL ES core or extension function, if it is supported by the current context. + * + *

    A context must be current on the calling thread. Calling this function without a current context will cause a {@link #GLFW_NO_CURRENT_CONTEXT NO_CURRENT_CONTEXT} error.

    + * + *

    This function does not apply to Vulkan. If you are rendering with Vulkan, {@code glfwGetInstanceProcAddress}, {@code vkGetInstanceProcAddr} and + * {@code vkGetDeviceProcAddr} instead.

    + * + *
    Note
    + * + *
      + *
    • The address of a given function is not guaranteed to be the same between contexts.
    • + *
    • This function may return a non-{@code NULL} address despite the associated version or extension not being available. Always check the context version or + * extension string first.
    • + *
    • The returned function pointer is valid until the context is destroyed or the library is terminated.
    • + *
    • This function may be called from any thread.
    • + *
    + * + * @param procname the ASCII encoded name of the function + * + * @return the address of the function, or {@code NULL} if an error occurred + * + * @since version 1.0 + */ + @NativeType("GLFWglproc") + public static long glfwGetProcAddress(@NativeType("char const *") ByteBuffer procname) { + if (CHECKS) { + checkNT1(procname); + } + return nglfwGetProcAddress(memAddress(procname)); + } + + /** + * Returns the address of the specified OpenGL or OpenGL ES core or extension function, if it is supported by the current context. + * + *

    A context must be current on the calling thread. Calling this function without a current context will cause a {@link #GLFW_NO_CURRENT_CONTEXT NO_CURRENT_CONTEXT} error.

    + * + *

    This function does not apply to Vulkan. If you are rendering with Vulkan, {@code glfwGetInstanceProcAddress}, {@code vkGetInstanceProcAddr} and + * {@code vkGetDeviceProcAddr} instead.

    + * + *
    Note
    + * + *
      + *
    • The address of a given function is not guaranteed to be the same between contexts.
    • + *
    • This function may return a non-{@code NULL} address despite the associated version or extension not being available. Always check the context version or + * extension string first.
    • + *
    • The returned function pointer is valid until the context is destroyed or the library is terminated.
    • + *
    • This function may be called from any thread.
    • + *
    + * + * @param procname the ASCII encoded name of the function + * + * @return the address of the function, or {@code NULL} if an error occurred + * + * @since version 1.0 + */ + @NativeType("GLFWglproc") + public static long glfwGetProcAddress(@NativeType("char const *") CharSequence procname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(procname, true); + long procnameEncoded = stack.getPointerAddress(); + return nglfwGetProcAddress(procnameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glfwGetVersion GetVersion} */ + public static void glfwGetVersion(@Nullable @NativeType("int *") int[] major, @Nullable @NativeType("int *") int[] minor, @Nullable @NativeType("int *") int[] rev) { + long __functionAddress = Functions.GetVersion; + if (CHECKS) { + checkSafe(major, 1); + checkSafe(minor, 1); + checkSafe(rev, 1); + } + invokePPPV(major, minor, rev, __functionAddress); + } + + /** Array version of: {@link #glfwGetMonitorPos GetMonitorPos} */ + public static void glfwGetMonitorPos(@NativeType("GLFWmonitor *") long monitor, @Nullable @NativeType("int *") int[] xpos, @Nullable @NativeType("int *") int[] ypos) { + long __functionAddress = Functions.GetMonitorPos; + if (CHECKS) { + check(monitor); + checkSafe(xpos, 1); + checkSafe(ypos, 1); + } + invokePPPV(monitor, xpos, ypos, __functionAddress); + } + + /** Array version of: {@link #glfwGetMonitorWorkarea GetMonitorWorkarea} */ + public static void glfwGetMonitorWorkarea(@NativeType("GLFWmonitor *") long monitor, @Nullable @NativeType("int *") int[] xpos, @Nullable @NativeType("int *") int[] ypos, @Nullable @NativeType("int *") int[] width, @Nullable @NativeType("int *") int[] height) { + long __functionAddress = Functions.GetMonitorWorkarea; + if (CHECKS) { + check(monitor); + checkSafe(xpos, 1); + checkSafe(ypos, 1); + checkSafe(width, 1); + checkSafe(height, 1); + } + invokePPPPPV(monitor, xpos, ypos, width, height, __functionAddress); + } + + /** Array version of: {@link #glfwGetMonitorPhysicalSize GetMonitorPhysicalSize} */ + public static void glfwGetMonitorPhysicalSize(@NativeType("GLFWmonitor *") long monitor, @Nullable @NativeType("int *") int[] widthMM, @Nullable @NativeType("int *") int[] heightMM) { + long __functionAddress = Functions.GetMonitorPhysicalSize; + if (CHECKS) { + check(monitor); + checkSafe(widthMM, 1); + checkSafe(heightMM, 1); + } + invokePPPV(monitor, widthMM, heightMM, __functionAddress); + } + + /** Array version of: {@link #glfwGetMonitorContentScale GetMonitorContentScale} */ + public static void glfwGetMonitorContentScale(@NativeType("GLFWmonitor *") long monitor, @Nullable @NativeType("float *") float[] xscale, @Nullable @NativeType("float *") float[] yscale) { + long __functionAddress = Functions.GetMonitorContentScale; + if (CHECKS) { + check(monitor); + checkSafe(xscale, 1); + checkSafe(yscale, 1); + } + invokePPPV(monitor, xscale, yscale, __functionAddress); + } + + /** Array version of: {@link #glfwGetWindowPos GetWindowPos} */ + public static void glfwGetWindowPos(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") int[] xpos, @Nullable @NativeType("int *") int[] ypos) { + long __functionAddress = Functions.GetWindowPos; + if (CHECKS) { + check(window); + checkSafe(xpos, 1); + checkSafe(ypos, 1); + } + invokePPPV(window, xpos, ypos, __functionAddress); + } + + /** Array version of: {@link #glfwGetWindowSize GetWindowSize} */ + public static void glfwGetWindowSize(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") int[] width, @Nullable @NativeType("int *") int[] height) { + long __functionAddress = Functions.GetWindowSize; + if (CHECKS) { + check(window); + checkSafe(width, 1); + checkSafe(height, 1); + } + invokePPPV(window, width, height, __functionAddress); + } + + /** Array version of: {@link #glfwGetFramebufferSize GetFramebufferSize} */ + public static void glfwGetFramebufferSize(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") int[] width, @Nullable @NativeType("int *") int[] height) { + long __functionAddress = Functions.GetFramebufferSize; + if (CHECKS) { + check(window); + checkSafe(width, 1); + checkSafe(height, 1); + } + invokePPPV(window, width, height, __functionAddress); + } + + /** Array version of: {@link #glfwGetWindowFrameSize GetWindowFrameSize} */ + public static void glfwGetWindowFrameSize(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") int[] left, @Nullable @NativeType("int *") int[] top, @Nullable @NativeType("int *") int[] right, @Nullable @NativeType("int *") int[] bottom) { + long __functionAddress = Functions.GetWindowFrameSize; + if (CHECKS) { + check(window); + checkSafe(left, 1); + checkSafe(top, 1); + checkSafe(right, 1); + checkSafe(bottom, 1); + } + invokePPPPPV(window, left, top, right, bottom, __functionAddress); + } + + /** Array version of: {@link #glfwGetWindowContentScale GetWindowContentScale} */ + public static void glfwGetWindowContentScale(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("float *") float[] xscale, @Nullable @NativeType("float *") float[] yscale) { + long __functionAddress = Functions.GetWindowContentScale; + if (CHECKS) { + check(window); + checkSafe(xscale, 1); + checkSafe(yscale, 1); + } + invokePPPV(window, xscale, yscale, __functionAddress); + } + + /** Array version of: {@link #glfwGetCursorPos GetCursorPos} */ + public static void glfwGetCursorPos(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("double *") double[] xpos, @Nullable @NativeType("double *") double[] ypos) { + long __functionAddress = Functions.GetCursorPos; + if (CHECKS) { + check(window); + checkSafe(xpos, 1); + checkSafe(ypos, 1); + } + invokePPPV(window, xpos, ypos, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocateCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocateCallback.java new file mode 100644 index 000000000..694b128a7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocateCallback.java @@ -0,0 +1,101 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The function pointer type for memory allocation callbacks. + * + *

    This is the function pointer type for memory allocation callbacks. A memory allocation callback function has the following signature:

    + * + *
    
    + * void* function_name(size_t size, void* user)
    + * + *

    This function must return either a memory block at least {@code size} bytes long, or {@code NULL} if allocation failed. Note that not all parts of GLFW + * handle allocation failures gracefully yet.

    + * + *

    This function may be called during {@link GLFW#glfwInit Init} but before the library is flagged as initialized, as well as during {@link GLFW#glfwTerminate Terminate} after the library is no + * longer flagged as initialized.

    + * + *

    Any memory allocated by this function will be deallocated during library termination or earlier.

    + * + *

    The size will always be greater than zero. Allocations of size zero are filtered out before reaching the custom allocator.

    + * + *
    Note
    + * + *
      + *
    • The returned memory block must be valid at least until it is deallocated.
    • + *
    • This function should not call any GLFW function.
    • + *
    • This function may be called from any thread that calls GLFW functions.
    • + *
    + * + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     size_t size,
    + *     void *user
    + * )
    + * + * @since version 3.4 + */ +public abstract class GLFWAllocateCallback extends Callback implements GLFWAllocateCallbackI { + + /** + * Creates a {@code GLFWAllocateCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWAllocateCallback} + */ + public static GLFWAllocateCallback create(long functionPointer) { + GLFWAllocateCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWAllocateCallback + ? (GLFWAllocateCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWAllocateCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWAllocateCallback} instance that delegates to the specified {@code GLFWAllocateCallbackI} instance. */ + public static GLFWAllocateCallback create(GLFWAllocateCallbackI instance) { + return instance instanceof GLFWAllocateCallback + ? (GLFWAllocateCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWAllocateCallback() { + super(CIF); + } + + GLFWAllocateCallback(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends GLFWAllocateCallback { + + private final GLFWAllocateCallbackI delegate; + + Container(long functionPointer, GLFWAllocateCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public long invoke(long size, long user) { + return delegate.invoke(size, user); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocateCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocateCallbackI.java new file mode 100644 index 000000000..72200f0bd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocateCallbackI.java @@ -0,0 +1,83 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * The function pointer type for memory allocation callbacks. + * + *

    This is the function pointer type for memory allocation callbacks. A memory allocation callback function has the following signature:

    + * + *
    
    + * void* function_name(size_t size, void* user)
    + * + *

    This function must return either a memory block at least {@code size} bytes long, or {@code NULL} if allocation failed. Note that not all parts of GLFW + * handle allocation failures gracefully yet.

    + * + *

    This function may be called during {@link GLFW#glfwInit Init} but before the library is flagged as initialized, as well as during {@link GLFW#glfwTerminate Terminate} after the library is no + * longer flagged as initialized.

    + * + *

    Any memory allocated by this function will be deallocated during library termination or earlier.

    + * + *

    The size will always be greater than zero. Allocations of size zero are filtered out before reaching the custom allocator.

    + * + *
    Note
    + * + *
      + *
    • The returned memory block must be valid at least until it is deallocated.
    • + *
    • This function should not call any GLFW function.
    • + *
    • This function may be called from any thread that calls GLFW functions.
    • + *
    + * + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     size_t size,
    + *     void *user
    + * )
    + * + * @since version 3.4 + */ +@FunctionalInterface +@NativeType("GLFWallocatefun") +public interface GLFWAllocateCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_pointer, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + long __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + apiClosureRetP(ret, __result); + } + + /** + * Will be called for memory allocation requests. + * + * @param size the minimum size, in bytes, of the memory block + * @param user the user-defined pointer from the allocator + * + * @return the address of the newly allocated memory block, or {@code NULL} if an error occurred + */ + @NativeType("void *") long invoke(@NativeType("size_t") long size, @NativeType("void *") long user); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocator.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocator.java new file mode 100644 index 000000000..6df18907a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWAllocator.java @@ -0,0 +1,342 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A custom memory allocator that can be set with {@link GLFW#glfwInitAllocator InitAllocator}. + * + *

    Layout

    + * + *
    
    + * struct GLFWallocator {
    + *     {@link GLFWAllocateCallbackI GLFWallocatefun} {@link #allocate};
    + *     {@link GLFWReallocateCallbackI GLFWreallocatefun} {@link #reallocate};
    + *     {@link GLFWDeallocateCallbackI GLFWdeallocatefun} {@link #deallocate};
    + *     void * {@link #user};
    + * }
    + * + * @since version 3.4 + */ +@NativeType("struct GLFWallocator") +public class GLFWAllocator extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ALLOCATE, + REALLOCATE, + DEALLOCATE, + USER; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + ALLOCATE = layout.offsetof(0); + REALLOCATE = layout.offsetof(1); + DEALLOCATE = layout.offsetof(2); + USER = layout.offsetof(3); + } + + protected GLFWAllocator(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected GLFWAllocator create(long address, @Nullable ByteBuffer container) { + return new GLFWAllocator(address, container); + } + + /** + * Creates a {@code GLFWAllocator} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public GLFWAllocator(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the memory allocation callback */ + @NativeType("GLFWallocatefun") + public GLFWAllocateCallback allocate() { return nallocate(address()); } + /** the memory reallocation callback */ + @NativeType("GLFWreallocatefun") + public GLFWReallocateCallback reallocate() { return nreallocate(address()); } + /** the memory deallocation callback */ + @NativeType("GLFWdeallocatefun") + public GLFWDeallocateCallback deallocate() { return ndeallocate(address()); } + /** a user-defined pointer that will be passed to the callbacks */ + @NativeType("void *") + public long user() { return nuser(address()); } + + /** Sets the specified value to the {@link #allocate} field. */ + public GLFWAllocator allocate(@NativeType("GLFWallocatefun") GLFWAllocateCallbackI value) { nallocate(address(), value); return this; } + /** Sets the specified value to the {@link #reallocate} field. */ + public GLFWAllocator reallocate(@NativeType("GLFWreallocatefun") GLFWReallocateCallbackI value) { nreallocate(address(), value); return this; } + /** Sets the specified value to the {@link #deallocate} field. */ + public GLFWAllocator deallocate(@NativeType("GLFWdeallocatefun") GLFWDeallocateCallbackI value) { ndeallocate(address(), value); return this; } + /** Sets the specified value to the {@link #user} field. */ + public GLFWAllocator user(@NativeType("void *") long value) { nuser(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public GLFWAllocator set( + GLFWAllocateCallbackI allocate, + GLFWReallocateCallbackI reallocate, + GLFWDeallocateCallbackI deallocate, + long user + ) { + allocate(allocate); + reallocate(reallocate); + deallocate(deallocate); + user(user); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public GLFWAllocator set(GLFWAllocator src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code GLFWAllocator} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static GLFWAllocator malloc() { + return new GLFWAllocator(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code GLFWAllocator} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static GLFWAllocator calloc() { + return new GLFWAllocator(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code GLFWAllocator} instance allocated with {@link BufferUtils}. */ + public static GLFWAllocator create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new GLFWAllocator(memAddress(container), container); + } + + /** Returns a new {@code GLFWAllocator} instance for the specified memory address. */ + public static GLFWAllocator create(long address) { + return new GLFWAllocator(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static GLFWAllocator createSafe(long address) { + return address == NULL ? null : new GLFWAllocator(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code GLFWAllocator} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static GLFWAllocator malloc(MemoryStack stack) { + return new GLFWAllocator(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code GLFWAllocator} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static GLFWAllocator calloc(MemoryStack stack) { + return new GLFWAllocator(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #allocate}. */ + public static GLFWAllocateCallback nallocate(long struct) { return GLFWAllocateCallback.create(memGetAddress(struct + GLFWAllocator.ALLOCATE)); } + /** Unsafe version of {@link #reallocate}. */ + public static GLFWReallocateCallback nreallocate(long struct) { return GLFWReallocateCallback.create(memGetAddress(struct + GLFWAllocator.REALLOCATE)); } + /** Unsafe version of {@link #deallocate}. */ + public static GLFWDeallocateCallback ndeallocate(long struct) { return GLFWDeallocateCallback.create(memGetAddress(struct + GLFWAllocator.DEALLOCATE)); } + /** Unsafe version of {@link #user}. */ + public static long nuser(long struct) { return memGetAddress(struct + GLFWAllocator.USER); } + + /** Unsafe version of {@link #allocate(GLFWAllocateCallbackI) allocate}. */ + public static void nallocate(long struct, GLFWAllocateCallbackI value) { memPutAddress(struct + GLFWAllocator.ALLOCATE, value.address()); } + /** Unsafe version of {@link #reallocate(GLFWReallocateCallbackI) reallocate}. */ + public static void nreallocate(long struct, GLFWReallocateCallbackI value) { memPutAddress(struct + GLFWAllocator.REALLOCATE, value.address()); } + /** Unsafe version of {@link #deallocate(GLFWDeallocateCallbackI) deallocate}. */ + public static void ndeallocate(long struct, GLFWDeallocateCallbackI value) { memPutAddress(struct + GLFWAllocator.DEALLOCATE, value.address()); } + /** Unsafe version of {@link #user(long) user}. */ + public static void nuser(long struct, long value) { memPutAddress(struct + GLFWAllocator.USER, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + GLFWAllocator.ALLOCATE)); + check(memGetAddress(struct + GLFWAllocator.REALLOCATE)); + check(memGetAddress(struct + GLFWAllocator.DEALLOCATE)); + } + + // ----------------------------------- + + /** An array of {@link GLFWAllocator} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final GLFWAllocator ELEMENT_FACTORY = GLFWAllocator.create(-1L); + + /** + * Creates a new {@code GLFWAllocator.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link GLFWAllocator#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected GLFWAllocator getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link GLFWAllocator#allocate} field. */ + @NativeType("GLFWallocatefun") + public GLFWAllocateCallback allocate() { return GLFWAllocator.nallocate(address()); } + /** @return the value of the {@link GLFWAllocator#reallocate} field. */ + @NativeType("GLFWreallocatefun") + public GLFWReallocateCallback reallocate() { return GLFWAllocator.nreallocate(address()); } + /** @return the value of the {@link GLFWAllocator#deallocate} field. */ + @NativeType("GLFWdeallocatefun") + public GLFWDeallocateCallback deallocate() { return GLFWAllocator.ndeallocate(address()); } + /** @return the value of the {@link GLFWAllocator#user} field. */ + @NativeType("void *") + public long user() { return GLFWAllocator.nuser(address()); } + + /** Sets the specified value to the {@link GLFWAllocator#allocate} field. */ + public Buffer allocate(@NativeType("GLFWallocatefun") GLFWAllocateCallbackI value) { GLFWAllocator.nallocate(address(), value); return this; } + /** Sets the specified value to the {@link GLFWAllocator#reallocate} field. */ + public Buffer reallocate(@NativeType("GLFWreallocatefun") GLFWReallocateCallbackI value) { GLFWAllocator.nreallocate(address(), value); return this; } + /** Sets the specified value to the {@link GLFWAllocator#deallocate} field. */ + public Buffer deallocate(@NativeType("GLFWdeallocatefun") GLFWDeallocateCallbackI value) { GLFWAllocator.ndeallocate(address(), value); return this; } + /** Sets the specified value to the {@link GLFWAllocator#user} field. */ + public Buffer user(@NativeType("void *") long value) { GLFWAllocator.nuser(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharCallback.java new file mode 100644 index 000000000..3f55e29c9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharCallback.java @@ -0,0 +1,86 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetCharCallback SetCharCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     unsigned int codepoint
    + * )
    + * + * @since version 2.4 + */ +public abstract class GLFWCharCallback extends Callback implements GLFWCharCallbackI { + + /** + * Creates a {@code GLFWCharCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWCharCallback} + */ + public static GLFWCharCallback create(long functionPointer) { + GLFWCharCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWCharCallback + ? (GLFWCharCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWCharCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWCharCallback} instance that delegates to the specified {@code GLFWCharCallbackI} instance. */ + public static GLFWCharCallback create(GLFWCharCallbackI instance) { + return instance instanceof GLFWCharCallback + ? (GLFWCharCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWCharCallback() { + super(CIF); + } + + GLFWCharCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetCharCallback SetCharCallback}. */ + public GLFWCharCallback set(long window) { + glfwSetCharCallback(window, this); + return this; + } + + private static final class Container extends GLFWCharCallback { + + private final GLFWCharCallbackI delegate; + + Container(long functionPointer, GLFWCharCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, int codepoint) { + delegate.invoke(window, codepoint); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharCallbackI.java new file mode 100644 index 000000000..96dd526f3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharCallbackI.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetCharCallback SetCharCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     unsigned int codepoint
    + * )
    + * + * @since version 2.4 + */ +@FunctionalInterface +@NativeType("GLFWcharfun") +public interface GLFWCharCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)) + ); + } + + /** + * Will be called when a Unicode character is input. + * + * @param window the window that received the event + * @param codepoint the Unicode code point of the character + */ + void invoke(@NativeType("GLFWwindow *") long window, @NativeType("unsigned int") int codepoint); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharModsCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharModsCallback.java new file mode 100644 index 000000000..423f7897e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharModsCallback.java @@ -0,0 +1,89 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetCharModsCallback SetCharModsCallback} method. + * + *

    Deprecared: scheduled for removal in version 4.0.

    + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     unsigned int codepoint,
    + *     int mods
    + * )
    + * + * @since version 3.1 + */ +public abstract class GLFWCharModsCallback extends Callback implements GLFWCharModsCallbackI { + + /** + * Creates a {@code GLFWCharModsCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWCharModsCallback} + */ + public static GLFWCharModsCallback create(long functionPointer) { + GLFWCharModsCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWCharModsCallback + ? (GLFWCharModsCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWCharModsCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWCharModsCallback} instance that delegates to the specified {@code GLFWCharModsCallbackI} instance. */ + public static GLFWCharModsCallback create(GLFWCharModsCallbackI instance) { + return instance instanceof GLFWCharModsCallback + ? (GLFWCharModsCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWCharModsCallback() { + super(CIF); + } + + GLFWCharModsCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetCharModsCallback SetCharModsCallback}. */ + public GLFWCharModsCallback set(long window) { + glfwSetCharModsCallback(window, this); + return this; + } + + private static final class Container extends GLFWCharModsCallback { + + private final GLFWCharModsCallbackI delegate; + + Container(long functionPointer, GLFWCharModsCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, int codepoint, int mods) { + delegate.invoke(window, codepoint, mods); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharModsCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharModsCallbackI.java new file mode 100644 index 000000000..828674f16 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCharModsCallbackI.java @@ -0,0 +1,62 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetCharModsCallback SetCharModsCallback} method. + * + *

    Deprecared: scheduled for removal in version 4.0.

    + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     unsigned int codepoint,
    + *     int mods
    + * )
    + * + * @since version 3.1 + */ +@FunctionalInterface +@NativeType("GLFWcharmodsfun") +public interface GLFWCharModsCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_uint32, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)) + ); + } + + /** + * Will be called when a Unicode character is input regardless of what modifier keys are used. + * + * @param window the window that received the event + * @param codepoint the Unicode code point of the character + * @param mods bitfield describing which modifier keys were held down + */ + void invoke(@NativeType("GLFWwindow *") long window, @NativeType("unsigned int") int codepoint, int mods); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorEnterCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorEnterCallback.java new file mode 100644 index 000000000..de4bf5eac --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorEnterCallback.java @@ -0,0 +1,86 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetCursorEnterCallback SetCursorEnterCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int entered
    + * )
    + * + * @since version 3.0 + */ +public abstract class GLFWCursorEnterCallback extends Callback implements GLFWCursorEnterCallbackI { + + /** + * Creates a {@code GLFWCursorEnterCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWCursorEnterCallback} + */ + public static GLFWCursorEnterCallback create(long functionPointer) { + GLFWCursorEnterCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWCursorEnterCallback + ? (GLFWCursorEnterCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWCursorEnterCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWCursorEnterCallback} instance that delegates to the specified {@code GLFWCursorEnterCallbackI} instance. */ + public static GLFWCursorEnterCallback create(GLFWCursorEnterCallbackI instance) { + return instance instanceof GLFWCursorEnterCallback + ? (GLFWCursorEnterCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWCursorEnterCallback() { + super(CIF); + } + + GLFWCursorEnterCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetCursorEnterCallback SetCursorEnterCallback}. */ + public GLFWCursorEnterCallback set(long window) { + glfwSetCursorEnterCallback(window, this); + return this; + } + + private static final class Container extends GLFWCursorEnterCallback { + + private final GLFWCursorEnterCallbackI delegate; + + Container(long functionPointer, GLFWCursorEnterCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, boolean entered) { + delegate.invoke(window, entered); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorEnterCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorEnterCallbackI.java new file mode 100644 index 000000000..c67e75c06 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorEnterCallbackI.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetCursorEnterCallback SetCursorEnterCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int entered
    + * )
    + * + * @since version 3.0 + */ +@FunctionalInterface +@NativeType("GLFWcursorenterfun") +public interface GLFWCursorEnterCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)) != 0 + ); + } + + /** + * Will be called when the cursor enters or leaves the client area of the window. + * + * @param window the window that received the event + * @param entered {@link GLFW#GLFW_TRUE TRUE} if the cursor entered the window's content area, or {@link GLFW#GLFW_FALSE FALSE} if it left it + */ + void invoke(@NativeType("GLFWwindow *") long window, @NativeType("int") boolean entered); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorPosCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorPosCallback.java new file mode 100644 index 000000000..07c58c7c0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorPosCallback.java @@ -0,0 +1,87 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetCursorPosCallback SetCursorPosCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     double xpos,
    + *     double ypos
    + * )
    + * + * @since version 3.0 + */ +public abstract class GLFWCursorPosCallback extends Callback implements GLFWCursorPosCallbackI { + + /** + * Creates a {@code GLFWCursorPosCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWCursorPosCallback} + */ + public static GLFWCursorPosCallback create(long functionPointer) { + GLFWCursorPosCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWCursorPosCallback + ? (GLFWCursorPosCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWCursorPosCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWCursorPosCallback} instance that delegates to the specified {@code GLFWCursorPosCallbackI} instance. */ + public static GLFWCursorPosCallback create(GLFWCursorPosCallbackI instance) { + return instance instanceof GLFWCursorPosCallback + ? (GLFWCursorPosCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWCursorPosCallback() { + super(CIF); + } + + GLFWCursorPosCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetCursorPosCallback SetCursorPosCallback}. */ + public GLFWCursorPosCallback set(long window) { + glfwSetCursorPosCallback(window, this); + return this; + } + + private static final class Container extends GLFWCursorPosCallback { + + private final GLFWCursorPosCallbackI delegate; + + Container(long functionPointer, GLFWCursorPosCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, double xpos, double ypos) { + delegate.invoke(window, xpos, ypos); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorPosCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorPosCallbackI.java new file mode 100644 index 000000000..0800672db --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWCursorPosCallbackI.java @@ -0,0 +1,63 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetCursorPosCallback SetCursorPosCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     double xpos,
    + *     double ypos
    + * )
    + * + * @since version 3.0 + */ +@FunctionalInterface +@NativeType("GLFWcursorposfun") +public interface GLFWCursorPosCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_double, ffi_type_double + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetDouble(memGetAddress(args + POINTER_SIZE)), + memGetDouble(memGetAddress(args + 2 * POINTER_SIZE)) + ); + } + + /** + * Will be called when the cursor is moved. + * + *

    The callback function receives the cursor position, measured in screen coordinates but relative to the top-left corner of the window client area. On + * platforms that provide it, the full sub-pixel cursor position is passed on.

    + * + * @param window the window that received the event + * @param xpos the new cursor x-coordinate, relative to the left edge of the content area + * @param ypos the new cursor y-coordinate, relative to the top edge of the content area + */ + void invoke(@NativeType("GLFWwindow *") long window, double xpos, double ypos); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDeallocateCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDeallocateCallback.java new file mode 100644 index 000000000..67e1f7477 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDeallocateCallback.java @@ -0,0 +1,98 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The function pointer type for memory deallocation callbacks. + * + *

    This is the function pointer type for memory deallocation callbacks. A memory deallocation callback function has the following signature:

    + * + *
    
    + * void function_name(void* block, void* user)
    + * + *

    This function may deallocate the specified memory block. This memory block will have been allocated with the same allocator.

    + * + *

    This function may be called during {@link GLFW#glfwInit Init} but before the library is flagged as initialized, as well as during {@link GLFW#glfwTerminate Terminate} after the library is no + * longer flagged as initialized.

    + * + *

    The block address will never be {@code NULL}. Deallocations of {@code NULL} are filtered out before reaching the custom allocator.

    + * + *
    Note
    + * + *
      + *
    • The specified memory block will not be accessed by GLFW after this function is called.
    • + *
    • This function should not call any GLFW function.
    • + *
    • This function may be called from any thread that calls GLFW functions.
    • + *
    + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     void *block,
    + *     void *user
    + * )
    + * + * @since version 3.4 + */ +public abstract class GLFWDeallocateCallback extends Callback implements GLFWDeallocateCallbackI { + + /** + * Creates a {@code GLFWDeallocateCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWDeallocateCallback} + */ + public static GLFWDeallocateCallback create(long functionPointer) { + GLFWDeallocateCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWDeallocateCallback + ? (GLFWDeallocateCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWDeallocateCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWDeallocateCallback} instance that delegates to the specified {@code GLFWDeallocateCallbackI} instance. */ + public static GLFWDeallocateCallback create(GLFWDeallocateCallbackI instance) { + return instance instanceof GLFWDeallocateCallback + ? (GLFWDeallocateCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWDeallocateCallback() { + super(CIF); + } + + GLFWDeallocateCallback(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends GLFWDeallocateCallback { + + private final GLFWDeallocateCallbackI delegate; + + Container(long functionPointer, GLFWDeallocateCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long block, long user) { + delegate.invoke(block, user); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDeallocateCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDeallocateCallbackI.java new file mode 100644 index 000000000..1d456fd5c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDeallocateCallbackI.java @@ -0,0 +1,77 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * The function pointer type for memory deallocation callbacks. + * + *

    This is the function pointer type for memory deallocation callbacks. A memory deallocation callback function has the following signature:

    + * + *
    
    + * void function_name(void* block, void* user)
    + * + *

    This function may deallocate the specified memory block. This memory block will have been allocated with the same allocator.

    + * + *

    This function may be called during {@link GLFW#glfwInit Init} but before the library is flagged as initialized, as well as during {@link GLFW#glfwTerminate Terminate} after the library is no + * longer flagged as initialized.

    + * + *

    The block address will never be {@code NULL}. Deallocations of {@code NULL} are filtered out before reaching the custom allocator.

    + * + *
    Note
    + * + *
      + *
    • The specified memory block will not be accessed by GLFW after this function is called.
    • + *
    • This function should not call any GLFW function.
    • + *
    • This function may be called from any thread that calls GLFW functions.
    • + *
    + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     void *block,
    + *     void *user
    + * )
    + * + * @since version 3.4 + */ +@FunctionalInterface +@NativeType("GLFWdeallocatefun") +public interface GLFWDeallocateCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + } + + /** + * Will be called for memory deallocation requests. + * + * @param block the address of the memory block to deallocate + * @param user the user-defined pointer from the allocator + */ + void invoke(@NativeType("void *") long block, @NativeType("void *") long user); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDropCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDropCallback.java new file mode 100644 index 000000000..88d038c43 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDropCallback.java @@ -0,0 +1,101 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetDropCallback SetDropCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int count,
    + *     char const **names
    + * )
    + * + * @since version 3.1 + */ +public abstract class GLFWDropCallback extends Callback implements GLFWDropCallbackI { + + /** + * Creates a {@code GLFWDropCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWDropCallback} + */ + public static GLFWDropCallback create(long functionPointer) { + GLFWDropCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWDropCallback + ? (GLFWDropCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWDropCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWDropCallback} instance that delegates to the specified {@code GLFWDropCallbackI} instance. */ + public static GLFWDropCallback create(GLFWDropCallbackI instance) { + return instance instanceof GLFWDropCallback + ? (GLFWDropCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWDropCallback() { + super(CIF); + } + + GLFWDropCallback(long functionPointer) { + super(functionPointer); + } + + /** + * Decodes the specified {@link GLFWDropCallback} arguments to a String. + * + *

    This method may only be used inside a {@code GLFWDropCallback} invocation.

    + * + * @param names pointer to the array of UTF-8 encoded path names of the dropped files + * @param index the index to decode + * + * @return the name at the specified index as a String + */ + public static String getName(long names, int index) { + return memUTF8(memGetAddress(names + Pointer.POINTER_SIZE * index)); + } + + /** See {@link GLFW#glfwSetDropCallback SetDropCallback}. */ + public GLFWDropCallback set(long window) { + glfwSetDropCallback(window, this); + return this; + } + + private static final class Container extends GLFWDropCallback { + + private final GLFWDropCallbackI delegate; + + Container(long functionPointer, GLFWDropCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, int count, long names) { + delegate.invoke(window, count, names); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDropCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDropCallbackI.java new file mode 100644 index 000000000..757011caf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWDropCallbackI.java @@ -0,0 +1,60 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetDropCallback SetDropCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int count,
    + *     char const **names
    + * )
    + * + * @since version 3.1 + */ +@FunctionalInterface +@NativeType("GLFWdropfun") +public interface GLFWDropCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_sint32, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)) + ); + } + + /** + * Will be called when one or more dragged files are dropped on the window. + * + * @param window the window that received the event + * @param count the number of dropped files + * @param names pointer to the array of UTF-8 encoded path names of the dropped files + */ + void invoke(@NativeType("GLFWwindow *") long window, int count, @NativeType("char const **") long names); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWErrorCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWErrorCallback.java new file mode 100644 index 000000000..a68a8bce1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWErrorCallback.java @@ -0,0 +1,162 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import java.io.PrintStream; +import java.util.Map; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetErrorCallback SetErrorCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     int error,
    + *     char *description
    + * )
    + * + * @since version 3.0 + */ +public abstract class GLFWErrorCallback extends Callback implements GLFWErrorCallbackI { + + /** + * Creates a {@code GLFWErrorCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWErrorCallback} + */ + public static GLFWErrorCallback create(long functionPointer) { + GLFWErrorCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWErrorCallback + ? (GLFWErrorCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWErrorCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWErrorCallback} instance that delegates to the specified {@code GLFWErrorCallbackI} instance. */ + public static GLFWErrorCallback create(GLFWErrorCallbackI instance) { + return instance instanceof GLFWErrorCallback + ? (GLFWErrorCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWErrorCallback() { + super(CIF); + } + + GLFWErrorCallback(long functionPointer) { + super(functionPointer); + } + + /** + * Converts the specified {@code GLFWErrorCallback} argument to a String. + * + *

    This method may only be used inside a GLFWErrorCallback invocation.

    + * + * @param description pointer to the UTF-8 encoded description string + * + * @return the description as a String + */ + public static String getDescription(long description) { + return memUTF8(description); + } + + /** + * Returns a {@code GLFWErrorCallback} instance that prints the error to the {@link APIUtil#DEBUG_STREAM}. + * + * @return the GLFWerrorCallback + */ + public static GLFWErrorCallback createPrint() { + return createPrint(APIUtil.DEBUG_STREAM); + } + + /** + * Returns a {@code GLFWErrorCallback} instance that prints the error in the specified {@link PrintStream}. + * + * @param stream the PrintStream to use + * + * @return the GLFWerrorCallback + */ + public static GLFWErrorCallback createPrint(PrintStream stream) { + return new GLFWErrorCallback() { + private Map ERROR_CODES = APIUtil.apiClassTokens((field, value) -> 0x10000 < value && value < 0x20000, null, GLFW.class); + + @Override + public void invoke(int error, long description) { + String msg = getDescription(description); + + StringBuilder sb = new StringBuilder(512); + sb + .append("[LWJGL] ") + .append(ERROR_CODES.get(error)) + .append(" error\n") + .append("\tDescription : ") + .append(msg) + .append("\n") + .append("\tStacktrace :\n"); + + StackTraceElement[] stack = Thread.currentThread().getStackTrace(); + for (int i = 4; i < stack.length; i++) { + sb.append("\t\t"); + sb.append(stack[i]); + sb.append("\n"); + } + + stream.print(sb); + } + }; + } + + /** + * Returns a {@code GLFWErrorCallback} instance that throws an {@link IllegalStateException} when an error occurs. + * + * @return the GLFWerrorCallback + */ + public static GLFWErrorCallback createThrow() { + return new GLFWErrorCallback() { + @Override + public void invoke(int error, long description) { + throw new IllegalStateException(String.format("GLFW error [0x%X]: %s", error, getDescription(description))); + } + }; + } + + /** See {@link GLFW#glfwSetErrorCallback SetErrorCallback}. */ + public GLFWErrorCallback set() { + glfwSetErrorCallback(this); + return this; + } + + private static final class Container extends GLFWErrorCallback { + + private final GLFWErrorCallbackI delegate; + + Container(long functionPointer, GLFWErrorCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(int error, long description) { + delegate.invoke(error, description); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWErrorCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWErrorCallbackI.java new file mode 100644 index 000000000..4a6404de2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWErrorCallbackI.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetErrorCallback SetErrorCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     int error,
    + *     char *description
    + * )
    + * + * @since version 3.0 + */ +@FunctionalInterface +@NativeType("GLFWerrorfun") +public interface GLFWErrorCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_sint32, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetInt(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + } + + /** + * Will be called with an error code and a human-readable description when a GLFW error occurs. + * + * @param error the error code + * @param description a pointer to a UTF-8 encoded string describing the error + */ + void invoke(int error, @NativeType("char *") long description); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWFramebufferSizeCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWFramebufferSizeCallback.java new file mode 100644 index 000000000..bf416a66b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWFramebufferSizeCallback.java @@ -0,0 +1,87 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetFramebufferSizeCallback SetFramebufferSizeCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int width,
    + *     int height
    + * )
    + * + * @since version 3.0 + */ +public abstract class GLFWFramebufferSizeCallback extends Callback implements GLFWFramebufferSizeCallbackI { + + /** + * Creates a {@code GLFWFramebufferSizeCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWFramebufferSizeCallback} + */ + public static GLFWFramebufferSizeCallback create(long functionPointer) { + GLFWFramebufferSizeCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWFramebufferSizeCallback + ? (GLFWFramebufferSizeCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWFramebufferSizeCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWFramebufferSizeCallback} instance that delegates to the specified {@code GLFWFramebufferSizeCallbackI} instance. */ + public static GLFWFramebufferSizeCallback create(GLFWFramebufferSizeCallbackI instance) { + return instance instanceof GLFWFramebufferSizeCallback + ? (GLFWFramebufferSizeCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWFramebufferSizeCallback() { + super(CIF); + } + + GLFWFramebufferSizeCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetFramebufferSizeCallback SetFramebufferSizeCallback}. */ + public GLFWFramebufferSizeCallback set(long window) { + glfwSetFramebufferSizeCallback(window, this); + return this; + } + + private static final class Container extends GLFWFramebufferSizeCallback { + + private final GLFWFramebufferSizeCallbackI delegate; + + Container(long functionPointer, GLFWFramebufferSizeCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, int width, int height) { + delegate.invoke(window, width, height); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWFramebufferSizeCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWFramebufferSizeCallbackI.java new file mode 100644 index 000000000..4489f34b9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWFramebufferSizeCallbackI.java @@ -0,0 +1,60 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetFramebufferSizeCallback SetFramebufferSizeCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int width,
    + *     int height
    + * )
    + * + * @since version 3.0 + */ +@FunctionalInterface +@NativeType("GLFWframebuffersizefun") +public interface GLFWFramebufferSizeCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_sint32, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)) + ); + } + + /** + * Will be called when the framebuffer of the specified window is resized. + * + * @param window the window whose framebuffer was resized + * @param width the new width, in pixels, of the framebuffer + * @param height the new height, in pixels, of the framebuffer + */ + void invoke(@NativeType("GLFWwindow *") long window, int width, int height); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWGamepadState.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWGamepadState.java new file mode 100644 index 000000000..5004984a0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWGamepadState.java @@ -0,0 +1,350 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Describes the input state of a gamepad. + * + *

    Layout

    + * + *
    
    + * struct GLFWgamepadstate {
    + *     unsigned char {@link #buttons}[15];
    + *     float {@link #axes}[6];
    + * }
    + * + * @since version 3.3 + */ +@NativeType("struct GLFWgamepadstate") +public class GLFWGamepadState extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + BUTTONS, + AXES; + + static { + Layout layout = __struct( + __array(1, 15), + __array(4, 6) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + BUTTONS = layout.offsetof(0); + AXES = layout.offsetof(1); + } + + protected GLFWGamepadState(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected GLFWGamepadState create(long address, @Nullable ByteBuffer container) { + return new GLFWGamepadState(address, container); + } + + /** + * Creates a {@code GLFWGamepadState} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public GLFWGamepadState(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the states of each gamepad button, {@link GLFW#GLFW_PRESS PRESS} or {@link GLFW#GLFW_RELEASE RELEASE} */ + @NativeType("unsigned char[15]") + public ByteBuffer buttons() { return nbuttons(address()); } + /** the states of each gamepad button, {@link GLFW#GLFW_PRESS PRESS} or {@link GLFW#GLFW_RELEASE RELEASE} */ + @NativeType("unsigned char") + public byte buttons(int index) { return nbuttons(address(), index); } + /** the states of each gamepad axis, in the range -1.0 to 1.0 inclusive */ + @NativeType("float[6]") + public FloatBuffer axes() { return naxes(address()); } + /** the states of each gamepad axis, in the range -1.0 to 1.0 inclusive */ + public float axes(int index) { return naxes(address(), index); } + + /** Copies the specified {@link ByteBuffer} to the {@link #buttons} field. */ + public GLFWGamepadState buttons(@NativeType("unsigned char[15]") ByteBuffer value) { nbuttons(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link #buttons} field. */ + public GLFWGamepadState buttons(int index, @NativeType("unsigned char") byte value) { nbuttons(address(), index, value); return this; } + /** Copies the specified {@link FloatBuffer} to the {@link #axes} field. */ + public GLFWGamepadState axes(@NativeType("float[6]") FloatBuffer value) { naxes(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link #axes} field. */ + public GLFWGamepadState axes(int index, float value) { naxes(address(), index, value); return this; } + + /** Initializes this struct with the specified values. */ + public GLFWGamepadState set( + ByteBuffer buttons, + FloatBuffer axes + ) { + buttons(buttons); + axes(axes); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public GLFWGamepadState set(GLFWGamepadState src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code GLFWGamepadState} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static GLFWGamepadState malloc() { + return new GLFWGamepadState(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code GLFWGamepadState} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static GLFWGamepadState calloc() { + return new GLFWGamepadState(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code GLFWGamepadState} instance allocated with {@link BufferUtils}. */ + public static GLFWGamepadState create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new GLFWGamepadState(memAddress(container), container); + } + + /** Returns a new {@code GLFWGamepadState} instance for the specified memory address. */ + public static GLFWGamepadState create(long address) { + return new GLFWGamepadState(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static GLFWGamepadState createSafe(long address) { + return address == NULL ? null : new GLFWGamepadState(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static GLFWGamepadState mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static GLFWGamepadState callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static GLFWGamepadState mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static GLFWGamepadState callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code GLFWGamepadState} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static GLFWGamepadState malloc(MemoryStack stack) { + return new GLFWGamepadState(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code GLFWGamepadState} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static GLFWGamepadState calloc(MemoryStack stack) { + return new GLFWGamepadState(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #buttons}. */ + public static ByteBuffer nbuttons(long struct) { return memByteBuffer(struct + GLFWGamepadState.BUTTONS, 15); } + /** Unsafe version of {@link #buttons(int) buttons}. */ + public static byte nbuttons(long struct, int index) { + return UNSAFE.getByte(null, struct + GLFWGamepadState.BUTTONS + check(index, 15) * 1); + } + /** Unsafe version of {@link #axes}. */ + public static FloatBuffer naxes(long struct) { return memFloatBuffer(struct + GLFWGamepadState.AXES, 6); } + /** Unsafe version of {@link #axes(int) axes}. */ + public static float naxes(long struct, int index) { + return UNSAFE.getFloat(null, struct + GLFWGamepadState.AXES + check(index, 6) * 4); + } + + /** Unsafe version of {@link #buttons(ByteBuffer) buttons}. */ + public static void nbuttons(long struct, ByteBuffer value) { + if (CHECKS) { checkGT(value, 15); } + memCopy(memAddress(value), struct + GLFWGamepadState.BUTTONS, value.remaining() * 1); + } + /** Unsafe version of {@link #buttons(int, byte) buttons}. */ + public static void nbuttons(long struct, int index, byte value) { + UNSAFE.putByte(null, struct + GLFWGamepadState.BUTTONS + check(index, 15) * 1, value); + } + /** Unsafe version of {@link #axes(FloatBuffer) axes}. */ + public static void naxes(long struct, FloatBuffer value) { + if (CHECKS) { checkGT(value, 6); } + memCopy(memAddress(value), struct + GLFWGamepadState.AXES, value.remaining() * 4); + } + /** Unsafe version of {@link #axes(int, float) axes}. */ + public static void naxes(long struct, int index, float value) { + UNSAFE.putFloat(null, struct + GLFWGamepadState.AXES + check(index, 6) * 4, value); + } + + // ----------------------------------- + + /** An array of {@link GLFWGamepadState} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final GLFWGamepadState ELEMENT_FACTORY = GLFWGamepadState.create(-1L); + + /** + * Creates a new {@code GLFWGamepadState.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link GLFWGamepadState#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected GLFWGamepadState getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the {@link GLFWGamepadState#buttons} field. */ + @NativeType("unsigned char[15]") + public ByteBuffer buttons() { return GLFWGamepadState.nbuttons(address()); } + /** @return the value at the specified index of the {@link GLFWGamepadState#buttons} field. */ + @NativeType("unsigned char") + public byte buttons(int index) { return GLFWGamepadState.nbuttons(address(), index); } + /** @return a {@link FloatBuffer} view of the {@link GLFWGamepadState#axes} field. */ + @NativeType("float[6]") + public FloatBuffer axes() { return GLFWGamepadState.naxes(address()); } + /** @return the value at the specified index of the {@link GLFWGamepadState#axes} field. */ + public float axes(int index) { return GLFWGamepadState.naxes(address(), index); } + + /** Copies the specified {@link ByteBuffer} to the {@link GLFWGamepadState#buttons} field. */ + public Buffer buttons(@NativeType("unsigned char[15]") ByteBuffer value) { GLFWGamepadState.nbuttons(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link GLFWGamepadState#buttons} field. */ + public Buffer buttons(int index, @NativeType("unsigned char") byte value) { GLFWGamepadState.nbuttons(address(), index, value); return this; } + /** Copies the specified {@link FloatBuffer} to the {@link GLFWGamepadState#axes} field. */ + public Buffer axes(@NativeType("float[6]") FloatBuffer value) { GLFWGamepadState.naxes(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link GLFWGamepadState#axes} field. */ + public Buffer axes(int index, float value) { GLFWGamepadState.naxes(address(), index, value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWGammaRamp.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWGammaRamp.java new file mode 100644 index 000000000..c70e722b4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWGammaRamp.java @@ -0,0 +1,361 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Describes the gamma ramp for a monitor. + * + *

    Layout

    + * + *
    
    + * struct GLFWgammaramp {
    + *     unsigned short * {@link #red};
    + *     unsigned short * {@link #green};
    + *     unsigned short * {@link #blue};
    + *     unsigned int {@link #size};
    + * }
    + * + * @since version 3.0 + */ +@NativeType("struct GLFWgammaramp") +public class GLFWGammaRamp extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + RED, + GREEN, + BLUE, + SIZE; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + RED = layout.offsetof(0); + GREEN = layout.offsetof(1); + BLUE = layout.offsetof(2); + SIZE = layout.offsetof(3); + } + + protected GLFWGammaRamp(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected GLFWGammaRamp create(long address, @Nullable ByteBuffer container) { + return new GLFWGammaRamp(address, container); + } + + /** + * Creates a {@code GLFWGammaRamp} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public GLFWGammaRamp(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** an array of values describing the response of the red channel */ + @NativeType("unsigned short *") + public ShortBuffer red() { return nred(address()); } + /** an array of values describing the response of the green channel */ + @NativeType("unsigned short *") + public ShortBuffer green() { return ngreen(address()); } + /** an array of values describing the response of the blue channel */ + @NativeType("unsigned short *") + public ShortBuffer blue() { return nblue(address()); } + /** the number of elements in each array */ + @NativeType("unsigned int") + public int size() { return nsize(address()); } + + /** Sets the address of the specified {@link ShortBuffer} to the {@link #red} field. */ + public GLFWGammaRamp red(@NativeType("unsigned short *") ShortBuffer value) { nred(address(), value); return this; } + /** Sets the address of the specified {@link ShortBuffer} to the {@link #green} field. */ + public GLFWGammaRamp green(@NativeType("unsigned short *") ShortBuffer value) { ngreen(address(), value); return this; } + /** Sets the address of the specified {@link ShortBuffer} to the {@link #blue} field. */ + public GLFWGammaRamp blue(@NativeType("unsigned short *") ShortBuffer value) { nblue(address(), value); return this; } + /** Sets the specified value to the {@link #size} field. */ + public GLFWGammaRamp size(@NativeType("unsigned int") int value) { nsize(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public GLFWGammaRamp set( + ShortBuffer red, + ShortBuffer green, + ShortBuffer blue, + int size + ) { + red(red); + green(green); + blue(blue); + size(size); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public GLFWGammaRamp set(GLFWGammaRamp src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code GLFWGammaRamp} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static GLFWGammaRamp malloc() { + return new GLFWGammaRamp(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code GLFWGammaRamp} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static GLFWGammaRamp calloc() { + return new GLFWGammaRamp(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code GLFWGammaRamp} instance allocated with {@link BufferUtils}. */ + public static GLFWGammaRamp create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new GLFWGammaRamp(memAddress(container), container); + } + + /** Returns a new {@code GLFWGammaRamp} instance for the specified memory address. */ + public static GLFWGammaRamp create(long address) { + return new GLFWGammaRamp(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static GLFWGammaRamp createSafe(long address) { + return address == NULL ? null : new GLFWGammaRamp(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static GLFWGammaRamp mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static GLFWGammaRamp callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static GLFWGammaRamp mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static GLFWGammaRamp callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code GLFWGammaRamp} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static GLFWGammaRamp malloc(MemoryStack stack) { + return new GLFWGammaRamp(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code GLFWGammaRamp} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static GLFWGammaRamp calloc(MemoryStack stack) { + return new GLFWGammaRamp(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #red() red}. */ + public static ShortBuffer nred(long struct) { return memShortBuffer(memGetAddress(struct + GLFWGammaRamp.RED), nsize(struct)); } + /** Unsafe version of {@link #green() green}. */ + public static ShortBuffer ngreen(long struct) { return memShortBuffer(memGetAddress(struct + GLFWGammaRamp.GREEN), nsize(struct)); } + /** Unsafe version of {@link #blue() blue}. */ + public static ShortBuffer nblue(long struct) { return memShortBuffer(memGetAddress(struct + GLFWGammaRamp.BLUE), nsize(struct)); } + /** Unsafe version of {@link #size}. */ + public static int nsize(long struct) { return UNSAFE.getInt(null, struct + GLFWGammaRamp.SIZE); } + + /** Unsafe version of {@link #red(ShortBuffer) red}. */ + public static void nred(long struct, ShortBuffer value) { memPutAddress(struct + GLFWGammaRamp.RED, memAddress(value)); } + /** Unsafe version of {@link #green(ShortBuffer) green}. */ + public static void ngreen(long struct, ShortBuffer value) { memPutAddress(struct + GLFWGammaRamp.GREEN, memAddress(value)); } + /** Unsafe version of {@link #blue(ShortBuffer) blue}. */ + public static void nblue(long struct, ShortBuffer value) { memPutAddress(struct + GLFWGammaRamp.BLUE, memAddress(value)); } + /** Sets the specified value to the {@code size} field of the specified {@code struct}. */ + public static void nsize(long struct, int value) { UNSAFE.putInt(null, struct + GLFWGammaRamp.SIZE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + GLFWGammaRamp.RED)); + check(memGetAddress(struct + GLFWGammaRamp.GREEN)); + check(memGetAddress(struct + GLFWGammaRamp.BLUE)); + } + + // ----------------------------------- + + /** An array of {@link GLFWGammaRamp} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final GLFWGammaRamp ELEMENT_FACTORY = GLFWGammaRamp.create(-1L); + + /** + * Creates a new {@code GLFWGammaRamp.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link GLFWGammaRamp#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected GLFWGammaRamp getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ShortBuffer} view of the data pointed to by the {@link GLFWGammaRamp#red} field. */ + @NativeType("unsigned short *") + public ShortBuffer red() { return GLFWGammaRamp.nred(address()); } + /** @return a {@link ShortBuffer} view of the data pointed to by the {@link GLFWGammaRamp#green} field. */ + @NativeType("unsigned short *") + public ShortBuffer green() { return GLFWGammaRamp.ngreen(address()); } + /** @return a {@link ShortBuffer} view of the data pointed to by the {@link GLFWGammaRamp#blue} field. */ + @NativeType("unsigned short *") + public ShortBuffer blue() { return GLFWGammaRamp.nblue(address()); } + /** @return the value of the {@link GLFWGammaRamp#size} field. */ + @NativeType("unsigned int") + public int size() { return GLFWGammaRamp.nsize(address()); } + + /** Sets the address of the specified {@link ShortBuffer} to the {@link GLFWGammaRamp#red} field. */ + public Buffer red(@NativeType("unsigned short *") ShortBuffer value) { GLFWGammaRamp.nred(address(), value); return this; } + /** Sets the address of the specified {@link ShortBuffer} to the {@link GLFWGammaRamp#green} field. */ + public Buffer green(@NativeType("unsigned short *") ShortBuffer value) { GLFWGammaRamp.ngreen(address(), value); return this; } + /** Sets the address of the specified {@link ShortBuffer} to the {@link GLFWGammaRamp#blue} field. */ + public Buffer blue(@NativeType("unsigned short *") ShortBuffer value) { GLFWGammaRamp.nblue(address(), value); return this; } + /** Sets the specified value to the {@link GLFWGammaRamp#size} field. */ + public Buffer size(@NativeType("unsigned int") int value) { GLFWGammaRamp.nsize(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWImage.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWImage.java new file mode 100644 index 000000000..262a1672d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWImage.java @@ -0,0 +1,345 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Image data. + * + *

    This describes a single 2D image. See the documentation for each related function to see what the expected pixel format is.

    + * + *

    Layout

    + * + *
    
    + * struct GLFWimage {
    + *     int {@link #width};
    + *     int {@link #height};
    + *     unsigned char * {@link #pixels};
    + * }
    + * + * @since version 2.1 + */ +@NativeType("struct GLFWimage") +public class GLFWImage extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + WIDTH, + HEIGHT, + PIXELS; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + WIDTH = layout.offsetof(0); + HEIGHT = layout.offsetof(1); + PIXELS = layout.offsetof(2); + } + + protected GLFWImage(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected GLFWImage create(long address, @Nullable ByteBuffer container) { + return new GLFWImage(address, container); + } + + /** + * Creates a {@code GLFWImage} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public GLFWImage(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the width, in pixels, of this image */ + public int width() { return nwidth(address()); } + /** the height, in pixels, of this image */ + public int height() { return nheight(address()); } + /** + * @param capacity the number of elements in the returned buffer + * + * @return the pixel data of this image, arranged left-to-right, top-to-bottom + */ + @NativeType("unsigned char *") + public ByteBuffer pixels(int capacity) { return npixels(address(), capacity); } + + /** Sets the specified value to the {@link #width} field. */ + public GLFWImage width(int value) { nwidth(address(), value); return this; } + /** Sets the specified value to the {@link #height} field. */ + public GLFWImage height(int value) { nheight(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@link #pixels} field. */ + public GLFWImage pixels(@NativeType("unsigned char *") ByteBuffer value) { npixels(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public GLFWImage set( + int width, + int height, + ByteBuffer pixels + ) { + width(width); + height(height); + pixels(pixels); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public GLFWImage set(GLFWImage src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code GLFWImage} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static GLFWImage malloc() { + return new GLFWImage(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code GLFWImage} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static GLFWImage calloc() { + return new GLFWImage(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code GLFWImage} instance allocated with {@link BufferUtils}. */ + public static GLFWImage create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new GLFWImage(memAddress(container), container); + } + + /** Returns a new {@code GLFWImage} instance for the specified memory address. */ + public static GLFWImage create(long address) { + return new GLFWImage(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static GLFWImage createSafe(long address) { + return address == NULL ? null : new GLFWImage(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static GLFWImage mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static GLFWImage callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static GLFWImage mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static GLFWImage callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code GLFWImage} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static GLFWImage malloc(MemoryStack stack) { + return new GLFWImage(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code GLFWImage} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static GLFWImage calloc(MemoryStack stack) { + return new GLFWImage(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + GLFWImage.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + GLFWImage.HEIGHT); } + /** Unsafe version of {@link #pixels(int) pixels}. */ + public static ByteBuffer npixels(long struct, int capacity) { return memByteBuffer(memGetAddress(struct + GLFWImage.PIXELS), capacity); } + + /** Unsafe version of {@link #width(int) width}. */ + public static void nwidth(long struct, int value) { UNSAFE.putInt(null, struct + GLFWImage.WIDTH, value); } + /** Unsafe version of {@link #height(int) height}. */ + public static void nheight(long struct, int value) { UNSAFE.putInt(null, struct + GLFWImage.HEIGHT, value); } + /** Unsafe version of {@link #pixels(ByteBuffer) pixels}. */ + public static void npixels(long struct, ByteBuffer value) { memPutAddress(struct + GLFWImage.PIXELS, memAddress(value)); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + GLFWImage.PIXELS)); + } + + // ----------------------------------- + + /** An array of {@link GLFWImage} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final GLFWImage ELEMENT_FACTORY = GLFWImage.create(-1L); + + /** + * Creates a new {@code GLFWImage.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link GLFWImage#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected GLFWImage getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link GLFWImage#width} field. */ + public int width() { return GLFWImage.nwidth(address()); } + /** @return the value of the {@link GLFWImage#height} field. */ + public int height() { return GLFWImage.nheight(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@link GLFWImage#pixels} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned char *") + public ByteBuffer pixels(int capacity) { return GLFWImage.npixels(address(), capacity); } + + /** Sets the specified value to the {@link GLFWImage#width} field. */ + public Buffer width(int value) { GLFWImage.nwidth(address(), value); return this; } + /** Sets the specified value to the {@link GLFWImage#height} field. */ + public Buffer height(int value) { GLFWImage.nheight(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@link GLFWImage#pixels} field. */ + public Buffer pixels(@NativeType("unsigned char *") ByteBuffer value) { GLFWImage.npixels(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWJoystickCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWJoystickCallback.java new file mode 100644 index 000000000..724234499 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWJoystickCallback.java @@ -0,0 +1,86 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetJoystickCallback SetJoystickCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     int jid,
    + *     int event
    + * )
    + * + * @since version 3.2 + */ +public abstract class GLFWJoystickCallback extends Callback implements GLFWJoystickCallbackI { + + /** + * Creates a {@code GLFWJoystickCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWJoystickCallback} + */ + public static GLFWJoystickCallback create(long functionPointer) { + GLFWJoystickCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWJoystickCallback + ? (GLFWJoystickCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWJoystickCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWJoystickCallback} instance that delegates to the specified {@code GLFWJoystickCallbackI} instance. */ + public static GLFWJoystickCallback create(GLFWJoystickCallbackI instance) { + return instance instanceof GLFWJoystickCallback + ? (GLFWJoystickCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWJoystickCallback() { + super(CIF); + } + + GLFWJoystickCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetJoystickCallback SetJoystickCallback}. */ + public GLFWJoystickCallback set() { + glfwSetJoystickCallback(this); + return this; + } + + private static final class Container extends GLFWJoystickCallback { + + private final GLFWJoystickCallbackI delegate; + + Container(long functionPointer, GLFWJoystickCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(int jid, int event) { + delegate.invoke(jid, event); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWJoystickCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWJoystickCallbackI.java new file mode 100644 index 000000000..cdc696eaa --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWJoystickCallbackI.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetJoystickCallback SetJoystickCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     int jid,
    + *     int event
    + * )
    + * + * @since version 3.2 + */ +@FunctionalInterface +@NativeType("GLFWjoystickfun") +public interface GLFWJoystickCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_sint32, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetInt(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)) + ); + } + + /** + * Will be called when a joystick is connected to or disconnected from the system. + * + * @param jid the joystick that was connected or disconnected + * @param event one of {@link GLFW#GLFW_CONNECTED CONNECTED} or {@link GLFW#GLFW_DISCONNECTED DISCONNECTED}. Remaining values reserved for future use. + */ + void invoke(int jid, int event); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWKeyCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWKeyCallback.java new file mode 100644 index 000000000..aaa1e27a1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWKeyCallback.java @@ -0,0 +1,87 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetKeyCallback SetKeyCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int key,
    + *     int scancode,
    + *     int action,
    + *     int mods
    + * )
    + */ +public abstract class GLFWKeyCallback extends Callback implements GLFWKeyCallbackI { + + /** + * Creates a {@code GLFWKeyCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWKeyCallback} + */ + public static GLFWKeyCallback create(long functionPointer) { + GLFWKeyCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWKeyCallback + ? (GLFWKeyCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWKeyCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWKeyCallback} instance that delegates to the specified {@code GLFWKeyCallbackI} instance. */ + public static GLFWKeyCallback create(GLFWKeyCallbackI instance) { + return instance instanceof GLFWKeyCallback + ? (GLFWKeyCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWKeyCallback() { + super(CIF); + } + + GLFWKeyCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetKeyCallback SetKeyCallback}. */ + public GLFWKeyCallback set(long window) { + glfwSetKeyCallback(window, this); + return this; + } + + private static final class Container extends GLFWKeyCallback { + + private final GLFWKeyCallbackI delegate; + + Container(long functionPointer, GLFWKeyCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, int key, int scancode, int action, int mods) { + delegate.invoke(window, key, scancode, action, mods); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWKeyCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWKeyCallbackI.java new file mode 100644 index 000000000..75bc538eb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWKeyCallbackI.java @@ -0,0 +1,64 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetKeyCallback SetKeyCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int key,
    + *     int scancode,
    + *     int action,
    + *     int mods
    + * )
    + */ +@FunctionalInterface +@NativeType("GLFWkeyfun") +public interface GLFWKeyCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_sint32, ffi_type_sint32, ffi_type_sint32, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 3 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 4 * POINTER_SIZE)) + ); + } + + /** + * Will be called when a key is pressed, repeated or released. + * + * @param window the window that received the event + * @param key the keyboard key that was pressed or released + * @param scancode the platform-specific scancode of the key + * @param action the key action. One of:
    {@link GLFW#GLFW_PRESS PRESS}{@link GLFW#GLFW_RELEASE RELEASE}{@link GLFW#GLFW_REPEAT REPEAT}
    + * @param mods bitfield describing which modifiers keys were held down + */ + void invoke(@NativeType("GLFWwindow *") long window, int key, int scancode, int action, int mods); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMonitorCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMonitorCallback.java new file mode 100644 index 000000000..c44c5e6ce --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMonitorCallback.java @@ -0,0 +1,86 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetMonitorCallback SetMonitorCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWmonitor *monitor,
    + *     int event
    + * )
    + * + * @since version 3.0 + */ +public abstract class GLFWMonitorCallback extends Callback implements GLFWMonitorCallbackI { + + /** + * Creates a {@code GLFWMonitorCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWMonitorCallback} + */ + public static GLFWMonitorCallback create(long functionPointer) { + GLFWMonitorCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWMonitorCallback + ? (GLFWMonitorCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWMonitorCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWMonitorCallback} instance that delegates to the specified {@code GLFWMonitorCallbackI} instance. */ + public static GLFWMonitorCallback create(GLFWMonitorCallbackI instance) { + return instance instanceof GLFWMonitorCallback + ? (GLFWMonitorCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWMonitorCallback() { + super(CIF); + } + + GLFWMonitorCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetMonitorCallback SetMonitorCallback}. */ + public GLFWMonitorCallback set() { + glfwSetMonitorCallback(this); + return this; + } + + private static final class Container extends GLFWMonitorCallback { + + private final GLFWMonitorCallbackI delegate; + + Container(long functionPointer, GLFWMonitorCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long monitor, int event) { + delegate.invoke(monitor, event); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMonitorCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMonitorCallbackI.java new file mode 100644 index 000000000..99a5dafa7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMonitorCallbackI.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetMonitorCallback SetMonitorCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWmonitor *monitor,
    + *     int event
    + * )
    + * + * @since version 3.0 + */ +@FunctionalInterface +@NativeType("GLFWmonitorfun") +public interface GLFWMonitorCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)) + ); + } + + /** + * Will be called when a monitor is connected to or disconnected from the system. + * + * @param monitor the monitor that was connected or disconnected + * @param event one of {@link GLFW#GLFW_CONNECTED CONNECTED} or {@link GLFW#GLFW_DISCONNECTED DISCONNECTED}. Remaining values reserved for future use. + */ + void invoke(@NativeType("GLFWmonitor *") long monitor, int event); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMouseButtonCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMouseButtonCallback.java new file mode 100644 index 000000000..59bd1c32f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMouseButtonCallback.java @@ -0,0 +1,86 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetMouseButtonCallback SetMouseButtonCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int button,
    + *     int action,
    + *     int mods
    + * )
    + */ +public abstract class GLFWMouseButtonCallback extends Callback implements GLFWMouseButtonCallbackI { + + /** + * Creates a {@code GLFWMouseButtonCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWMouseButtonCallback} + */ + public static GLFWMouseButtonCallback create(long functionPointer) { + GLFWMouseButtonCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWMouseButtonCallback + ? (GLFWMouseButtonCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWMouseButtonCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWMouseButtonCallback} instance that delegates to the specified {@code GLFWMouseButtonCallbackI} instance. */ + public static GLFWMouseButtonCallback create(GLFWMouseButtonCallbackI instance) { + return instance instanceof GLFWMouseButtonCallback + ? (GLFWMouseButtonCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWMouseButtonCallback() { + super(CIF); + } + + GLFWMouseButtonCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetMouseButtonCallback SetMouseButtonCallback}. */ + public GLFWMouseButtonCallback set(long window) { + glfwSetMouseButtonCallback(window, this); + return this; + } + + private static final class Container extends GLFWMouseButtonCallback { + + private final GLFWMouseButtonCallbackI delegate; + + Container(long functionPointer, GLFWMouseButtonCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, int button, int action, int mods) { + delegate.invoke(window, button, action, mods); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMouseButtonCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMouseButtonCallbackI.java new file mode 100644 index 000000000..d457fd26a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWMouseButtonCallbackI.java @@ -0,0 +1,61 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetMouseButtonCallback SetMouseButtonCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int button,
    + *     int action,
    + *     int mods
    + * )
    + */ +@FunctionalInterface +@NativeType("GLFWmousebuttonfun") +public interface GLFWMouseButtonCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_sint32, ffi_type_sint32, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 3 * POINTER_SIZE)) + ); + } + + /** + * Will be called when a mouse button is pressed or released. + * + * @param window the window that received the event + * @param button the mouse button that was pressed or released + * @param action the button action. One of:
    {@link GLFW#GLFW_PRESS PRESS}{@link GLFW#GLFW_RELEASE RELEASE}
    + * @param mods bitfield describing which modifiers keys were held down + */ + void invoke(@NativeType("GLFWwindow *") long window, int button, int action, int mods); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeCocoa.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeCocoa.java new file mode 100644 index 000000000..9ac2825f7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeCocoa.java @@ -0,0 +1,81 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** Native bindings to the GLFW library's Cocoa native access functions. */ +public class GLFWNativeCocoa { + + /** Contains the function pointers loaded from {@code GLFW.getLibrary()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + GetCocoaMonitor = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetCocoaMonitor"), + GetCocoaWindow = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetCocoaWindow"); + + } + + protected GLFWNativeCocoa() { + throw new UnsupportedOperationException(); + } + + // --- [ glfwGetCocoaMonitor ] --- + + /** + * Returns the {@code CGDirectDisplayID} of the specified monitor. + * + *

    Note: This function may be called from any thread. Access is not synchronized.

    + * + * @param monitor the GLFW monitor + * + * @return the {@code CGDirectDisplayID} of the specified monitor, or {@code kCGNullDirectDisplay} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.1 + */ + @NativeType("CGDirectDisplayID") + public static int glfwGetCocoaMonitor(@NativeType("GLFWmonitor *") long monitor) { + long __functionAddress = Functions.GetCocoaMonitor; + if (CHECKS) { + check(monitor); + } + return invokePI(monitor, __functionAddress); + } + + // --- [ glfwGetCocoaWindow ] --- + + /** + * Returns the {@code NSWindow} of the specified GLFW window. + * + *

    Note: This function may be called from any thread. Access is not synchronized.

    + * + * @param window the GLFW window + * + * @return the {@code NSWindow} of the specified window, or nil if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.0 + */ + @NativeType("id") + public static long glfwGetCocoaWindow(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetCocoaWindow; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeEGL.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeEGL.java new file mode 100644 index 000000000..85aa0cddc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeEGL.java @@ -0,0 +1,220 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +import javax.annotation.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to the GLFW library's EGL native access functions. */ +public class GLFWNativeEGL { + + /** Contains the function pointers loaded from {@code GLFW.getLibrary()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + GetEGLDisplay = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetEGLDisplay"), + GetEGLContext = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetEGLContext"), + GetEGLSurface = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetEGLSurface"), + GetEGLConfig = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetEGLConfig"); + + } + + protected GLFWNativeEGL() { + throw new UnsupportedOperationException(); + } + + // --- [ glfwGetEGLDisplay ] --- + + /** + * Returns the {@code EGLDisplay} used by GLFW. + * + *

    Because EGL is initialized on demand, this function will return {@link EGL10#EGL_NO_DISPLAY} until the first context has been created via EGL.

    + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @return the {@code EGLDisplay} used by GLFW, or {@link EGL10#EGL_NO_DISPLAY} if an error occured. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.0 + */ + @NativeType("EGLDisplay") + public static long glfwGetEGLDisplay() { + long __functionAddress = Functions.GetEGLDisplay; + return invokeP(__functionAddress); + } + + // --- [ glfwGetEGLContext ] --- + + /** + * Returns the {@code EGLContext} of the specified window. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param window a GLFW window + * + * @return the {@code EGLContext} of the specified window, or {@link EGL10#EGL_NO_CONTEXT} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} and {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.0 + */ + @NativeType("EGLContext") + public static long glfwGetEGLContext(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetEGLContext; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + + // --- [ glfwGetEGLSurface ] --- + + /** + * Returns the {@code EGLSurface} of the specified window. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @return the {@code EGLSurface} of the specified window, or {@link EGL10#EGL_NO_SURFACE} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} and {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.0 + */ + @NativeType("EGLSurface") + public static long glfwGetEGLSurface(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetEGLSurface; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + + // --- [ glfwGetEGLConfig ] --- + + /** + * Returns the {@code EGLConfig} of the specified window. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @return the {@code EGLConfig} of the specified window, or {@link EGL10#EGL_NO_SURFACE} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} and {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.4 + */ + @NativeType("EGLConfig") + public static long glfwGetEGLConfig(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetEGLConfig; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + + /** + * Calls {@link #setEGLPath(String)} with the path of the specified {@link SharedLibrary}. + * + *

    Example usage: GLFWNativeEGL.setEGLPath(EGL.getFunctionProvider());

    + * + * @param sharedLibrary a {@code FunctionProvider} instance that will be cast to {@code SharedLibrary} + */ + public static void setEGLPath(FunctionProvider sharedLibrary) { + if (!(sharedLibrary instanceof SharedLibrary)) { + apiLog("GLFW EGL path override not set: Function provider is not a shared library."); + return; + } + + String path = ((SharedLibrary)sharedLibrary).getPath(); + if (path == null) { + apiLog("GLFW EGL path override not set: Could not resolve the shared library path."); + return; + + } + + setEGLPath(path); + } + + /** + * Overrides the EGL shared library that GLFW loads internally. + * + *

    This is useful when there's a mismatch between the shared libraries loaded by LWJGL and GLFW.

    + * + *

    This method must be called before GLFW initializes EGL. The override is available only in the default GLFW build bundled with LWJGL. Using the + * override with a custom GLFW build will produce a warning in {@code DEBUG} mode (but not an error).

    + * + * @param path the EGL shared library path, or {@code null} to remove the override. + */ + public static void setEGLPath(@Nullable String path) { + if (!override("_glfw_egl_library", path)) { + apiLog("GLFW EGL path override not set: Could not resolve override symbol."); + } + } + + /** + * Calls {@link #setGLESPath(String)} with the path of the specified {@link SharedLibrary}. + * + *

    Example usage: GLFWNativeEGL.setGLESPath(GLES.getFunctionProvider());

    + * + * @param sharedLibrary a {@code FunctionProvider} instance that will be cast to {@code SharedLibrary} + */ + public static void setGLESPath(FunctionProvider sharedLibrary) { + if (!(sharedLibrary instanceof SharedLibrary)) { + apiLog("GLFW OpenGL ES path override not set: Function provider is not a shared library."); + return; + } + + String path = ((SharedLibrary)sharedLibrary).getPath(); + if (path == null) { + apiLog("GLFW OpenGL ES path override not set: Could not resolve the shared library path."); + return; + + } + + setGLESPath(path); + } + + /** + * Overrides the OpenGL ES shared library that GLFW loads internally. + * + *

    This is useful when there's a mismatch between the shared libraries loaded by LWJGL and GLFW.

    + * + *

    This method must be called before GLFW initializes OpenGL ES. The override is available only in the default GLFW build bundled with LWJGL. Using the + * override with a custom GLFW build will produce a warning in {@code DEBUG} mode (but not an error).

    + * + * @param path the OpenGL ES shared library path, or {@code null} to remove the override. + */ + public static void setGLESPath(@Nullable String path) { + if (!override("_glfw_opengles_library", path)) { + apiLog("GLFW OpenGL ES path override not set: Could not resolve override symbol."); + } + } + + private static boolean override(String symbol, @Nullable String path) { + long override = GLFW.getLibrary().getFunctionAddress(symbol); + if (override == NULL) { + return false; + } + + long a = memGetAddress(override); + if (a != NULL) { + nmemFree(a); + } + memPutAddress(override, path == null ? NULL : memAddress(memUTF8(path))); + return true; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeGLX.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeGLX.java new file mode 100644 index 000000000..d8155fbe2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeGLX.java @@ -0,0 +1,158 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +import javax.annotation.*; +import org.lwjgl.opengl.GL; + +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to the GLFW library's GLX native access functions. */ +public class GLFWNativeGLX { + + /** Contains the function pointers loaded from {@code GLFW.getLibrary()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + GetGLXContext = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetGLXContext"), + GetGLXWindow = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetGLXWindow"), + GetGLXFBConfig = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetGLXFBConfig"); + + } + + protected GLFWNativeGLX() { + throw new UnsupportedOperationException(); + } + + // --- [ glfwGetGLXContext ] --- + + /** + * Returns the {@code GLXContext} of the specified window. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param window a GLFW window + * + * @return the {@code GLXContext} of the specified window, or {@code NULL} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} and {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.0 + */ + @NativeType("GLXContext") + public static long glfwGetGLXContext(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetGLXContext; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + + // --- [ glfwGetGLXWindow ] --- + + /** + * Returns the {@code GLXWindow} of the specified window. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param window a GLFW window + * + * @return the {@code GLXWindow} of the specified window, or {@code None} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} and {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.2 + */ + @NativeType("GLXWindow") + public static long glfwGetGLXWindow(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetGLXWindow; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + + // --- [ glfwGetGLXFBConfig ] --- + + /** + * Returns the {@code GLXFBConfig} that was chosen to create the specified window. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param window a GLFW window + * + * @return the {@code GLXFBConfig} that was chosen to create the specified window, or {@code NULL} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} and {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.4 + */ + @NativeType("GLXWindow") + public static long glfwGetGLXFBConfig(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetGLXFBConfig; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + + /** + * Calls {@link #setPath(String)} with the path of the specified {@link SharedLibrary}. + * + *

    Example usage: GLFWNativeGLX.setPath(GL.getFunctionProvider());

    + * + * @param sharedLibrary a {@code FunctionProvider} instance that will be cast to {@code SharedLibrary} + */ + public static void setPath(FunctionProvider sharedLibrary) { + if (!(sharedLibrary instanceof SharedLibrary)) { + apiLog("GLFW OpenGL path override not set: Function provider is not a shared library."); + return; + } + + String path = ((SharedLibrary)sharedLibrary).getPath(); + if (path == null) { + apiLog("GLFW OpenGL path override not set: Could not resolve the shared library path."); + return; + + } + + setPath(path); + } + + /** + * Overrides the OpenGL shared library that GLFW loads internally. + * + *

    This is useful when there's a mismatch between the shared libraries loaded by LWJGL and GLFW.

    + * + *

    This method must be called before GLFW initializes OpenGL. The override is available only in the default GLFW build bundled with LWJGL. Using the + * override with a custom GLFW build will produce a warning in {@code DEBUG} mode (but not an error).

    + * + * @param path the OpenGL shared library path, or {@code null} to remove the override. + */ + public static void setPath(@Nullable String path) { + long override = GLFW.getLibrary().getFunctionAddress("_glfw_opengl_library"); + if (override == NULL) { + apiLog("GLFW OpenGL path override not set: Could not resolve override symbol."); + return; + } + + long a = memGetAddress(override); + if (a != NULL) { + nmemFree(a); + } + memPutAddress(override, path == null ? NULL : memAddress(memUTF8(path))); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeNSGL.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeNSGL.java new file mode 100644 index 000000000..1299eb809 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeNSGL.java @@ -0,0 +1,62 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +import javax.annotation.*; +import org.lwjgl.opengl.GL; +import org.lwjgl.system.macosx.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to the GLFW library's NSGL native access functions. */ +public class GLFWNativeNSGL { + + /** Contains the function pointers loaded from {@code GLFW.getLibrary()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + GetNSGLContext = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetNSGLContext"); + + } + + protected GLFWNativeNSGL() { + throw new UnsupportedOperationException(); + } + + // --- [ glfwGetNSGLContext ] --- + + /** + * Returns the {@code NSOpenGLContext} of the specified GLFW window. + * + *

    Note: This function may be called from any thread. Access is not synchronized.

    + * + * @param window the GLFW window + * + * @return the {@code NSOpenGLContext} of the specified window, or nil if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} and {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.0 + */ + @NativeType("id") + public static long glfwGetNSGLContext(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetNSGLContext; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeOSMesa.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeOSMesa.java new file mode 100644 index 000000000..b29d7973a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeOSMesa.java @@ -0,0 +1,220 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +import javax.annotation.*; +import org.lwjgl.opengl.GL; + +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to the GLFW library's GLX native access functions. */ +public class GLFWNativeOSMesa { + + /** Contains the function pointers loaded from {@code GLFW.getLibrary()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + GetOSMesaColorBuffer = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetOSMesaColorBuffer"), + GetOSMesaDepthBuffer = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetOSMesaDepthBuffer"), + GetOSMesaContext = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetOSMesaContext"); + + } + + protected GLFWNativeOSMesa() { + throw new UnsupportedOperationException(); + } + + // --- [ glfwGetOSMesaColorBuffer ] --- + + /** Unsafe version of: {@link #glfwGetOSMesaColorBuffer GetOSMesaColorBuffer} */ + public static int nglfwGetOSMesaColorBuffer(long window, long width, long height, long format, long buffer) { + long __functionAddress = Functions.GetOSMesaColorBuffer; + if (CHECKS) { + check(window); + } + return invokePPPPPI(window, width, height, format, buffer, __functionAddress); + } + + /** + * Retrieves the color buffer associated with the specified window. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param window the window whose color buffer to retrieve + * @param width where to store the width of the color buffer, or {@code NULL} + * @param height where to store the height of the color buffer, or {@code NULL} + * @param format where to store the OSMesa pixel format of the color buffer, or {@code NULL} + * @param buffer where to store the address of the color buffer, or {@code NULL} + * + * @return {@link GLFW#GLFW_TRUE TRUE} if successful, or {@link GLFW#GLFW_FALSE FALSE} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} and {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.3 + */ + @NativeType("int") + public static boolean glfwGetOSMesaColorBuffer(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") IntBuffer width, @Nullable @NativeType("int *") IntBuffer height, @Nullable @NativeType("int *") IntBuffer format, @Nullable @NativeType("void **") PointerBuffer buffer) { + if (CHECKS) { + checkSafe(width, 1); + checkSafe(height, 1); + checkSafe(format, 1); + checkSafe(buffer, 1); + } + return nglfwGetOSMesaColorBuffer(window, memAddressSafe(width), memAddressSafe(height), memAddressSafe(format), memAddressSafe(buffer)) != 0; + } + + // --- [ glfwGetOSMesaDepthBuffer ] --- + + /** Unsafe version of: {@link #glfwGetOSMesaDepthBuffer GetOSMesaDepthBuffer} */ + public static int nglfwGetOSMesaDepthBuffer(long window, long width, long height, long bytesPerValue, long buffer) { + long __functionAddress = Functions.GetOSMesaDepthBuffer; + if (CHECKS) { + check(window); + } + return invokePPPPPI(window, width, height, bytesPerValue, buffer, __functionAddress); + } + + /** + * Retrieves the depth buffer associated with the specified window. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param window the window whose depth buffer to retrieve + * @param width where to store the width of the depth buffer, or {@code NULL} + * @param height where to store the height of the depth buffer, or {@code NULL} + * @param bytesPerValue where to store the number of bytes per depth buffer element, or {@code NULL} + * @param buffer where to store the address of the depth buffer, or {@code NULL} + * + * @return {@link GLFW#GLFW_TRUE TRUE} if successful, or {@link GLFW#GLFW_FALSE FALSE} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} and {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.3 + */ + public static int glfwGetOSMesaDepthBuffer(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") IntBuffer width, @Nullable @NativeType("int *") IntBuffer height, @Nullable @NativeType("int *") IntBuffer bytesPerValue, @Nullable @NativeType("void **") PointerBuffer buffer) { + if (CHECKS) { + checkSafe(width, 1); + checkSafe(height, 1); + checkSafe(bytesPerValue, 1); + checkSafe(buffer, 1); + } + return nglfwGetOSMesaDepthBuffer(window, memAddressSafe(width), memAddressSafe(height), memAddressSafe(bytesPerValue), memAddressSafe(buffer)); + } + + // --- [ glfwGetOSMesaContext ] --- + + /** + * Returns the {@code OSMesaContext} of the specified window. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @param window the window whose context to retrieve + * + * @return the {@code OSMesaContext} of the specified window, or {@code NULL} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} and {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.3 + */ + @NativeType("OSMesaContext") + public static long glfwGetOSMesaContext(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetOSMesaContext; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + + /** Array version of: {@link #glfwGetOSMesaColorBuffer GetOSMesaColorBuffer} */ + @NativeType("int") + public static boolean glfwGetOSMesaColorBuffer(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") int[] width, @Nullable @NativeType("int *") int[] height, @Nullable @NativeType("int *") int[] format, @Nullable @NativeType("void **") PointerBuffer buffer) { + long __functionAddress = Functions.GetOSMesaColorBuffer; + if (CHECKS) { + check(window); + checkSafe(width, 1); + checkSafe(height, 1); + checkSafe(format, 1); + checkSafe(buffer, 1); + } + return invokePPPPPI(window, width, height, format, memAddressSafe(buffer), __functionAddress) != 0; + } + + /** Array version of: {@link #glfwGetOSMesaDepthBuffer GetOSMesaDepthBuffer} */ + public static int glfwGetOSMesaDepthBuffer(@NativeType("GLFWwindow *") long window, @Nullable @NativeType("int *") int[] width, @Nullable @NativeType("int *") int[] height, @Nullable @NativeType("int *") int[] bytesPerValue, @Nullable @NativeType("void **") PointerBuffer buffer) { + long __functionAddress = Functions.GetOSMesaDepthBuffer; + if (CHECKS) { + check(window); + checkSafe(width, 1); + checkSafe(height, 1); + checkSafe(bytesPerValue, 1); + checkSafe(buffer, 1); + } + return invokePPPPPI(window, width, height, bytesPerValue, memAddressSafe(buffer), __functionAddress); + } + + /** + * Calls {@link #setPath(String)} with the path of the specified {@link SharedLibrary}. + * + *

    Example usage: GLFWNativeOSMesa.setPath(GL.getFunctionProvider());

    + * + * @param sharedLibrary a {@code FunctionProvider} instance that will be cast to {@code SharedLibrary} + */ + public static void setPath(FunctionProvider sharedLibrary) { + if (!(sharedLibrary instanceof SharedLibrary)) { + apiLog("GLFW OSMesa path override not set: Function provider is not a shared library."); + return; + } + + String path = ((SharedLibrary)sharedLibrary).getPath(); + if (path == null) { + apiLog("GLFW OSMesa path override not set: Could not resolve the OSMesa shared library path."); + return; + } + + setPath(path); + } + + /** + * Overrides the OSMesa shared library that GLFW loads internally. + * + *

    This is useful when there's a mismatch between the shared libraries loaded by LWJGL and GLFW.

    + * + *

    This method must be called before GLFW initializes OpenGL. The override is available only in the default GLFW build bundled with LWJGL. Using the + * override with a custom GLFW build will produce a warning in {@code DEBUG} mode (but not an error).

    + * + * @param path the OSMesa shared library path, or {@code null} to remove the override. + */ + public static void setPath(@Nullable String path) { + long override = GLFW.getLibrary().getFunctionAddress("_glfw_mesa_library"); + if (override == NULL) { + apiLog("GLFW OSMesa path override not set: Could not resolve override symbol."); + return; + } + + long a = memGetAddress(override); + if (a != NULL) { + nmemFree(a); + } + memPutAddress(override, path == null ? NULL : memAddress(memUTF8(path))); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWGL.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWGL.java new file mode 100644 index 000000000..5ce2e750f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWGL.java @@ -0,0 +1,113 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +import javax.annotation.*; +import org.lwjgl.opengl.GL; + +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to the GLFW library's WGL native access functions. */ +public class GLFWNativeWGL { + + /** Contains the function pointers loaded from {@code GLFW.getLibrary()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + GetWGLContext = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetWGLContext"); + + } + + protected GLFWNativeWGL() { + throw new UnsupportedOperationException(); + } + + // --- [ glfwGetWGLContext ] --- + + /** + * Returns the {@code HGLRC} of the specified window. + * + *

    The {@code HDC} associated with the window can be queried with the + * GetDC function. + * + * HDC dc = GetDC(glfwGetWin32Window(window)); + * This DC is private and does not need to be released.

    + * + *

    Note: This function may be called from any thread. Access is not synchronized.

    + * + * @param window the GLFW window + * + * @return the {@code HGLRC} of the specified window, or {@code NULL} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NO_WINDOW_CONTEXT NO_WINDOW_CONTEXT} and {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.0 + */ + @NativeType("HGLRC") + public static long glfwGetWGLContext(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetWGLContext; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + + /** + * Calls {@link #setPath(String)} with the path of the specified {@link SharedLibrary}. + * + *

    Example usage: GLFWNativeWGL.setPath(GL.getFunctionProvider());

    + * + * @param sharedLibrary a {@code FunctionProvider} instance that will be cast to {@code SharedLibrary} + */ + public static void setPath(FunctionProvider sharedLibrary) { + if (!(sharedLibrary instanceof SharedLibrary)) { + apiLog("GLFW OpenGL path override not set: Function provider is not a shared library."); + return; + } + + String path = ((SharedLibrary)sharedLibrary).getPath(); + if (path == null) { + apiLog("GLFW OpenGL path override not set: Could not resolve the shared library path."); + return; + } + + setPath(path); + } + + /** + * Overrides the OpenGL shared library that GLFW loads internally. + * + *

    This is useful when there's a mismatch between the shared libraries loaded by LWJGL and GLFW.

    + * + *

    This method must be called before GLFW initializes OpenGL. The override is available only in the default GLFW build bundled with LWJGL. Using the + * override with a custom GLFW build will produce a warning in {@code DEBUG} mode (but not an error).

    + * + * @param path the OpenGL shared library path, or {@code null} to remove the override. + */ + public static void setPath(@Nullable String path) { + long override = GLFW.getLibrary().getFunctionAddress("_glfw_opengl_library"); + if (override == NULL) { + apiLog("GLFW OpenGL path override not set: Could not resolve override symbol."); + return; + } + + long a = memGetAddress(override); + if (a != NULL) { + nmemFree(a); + } + memPutAddress(override, path == null ? NULL : memAddress(memUTF16(path))); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWayland.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWayland.java new file mode 100644 index 000000000..99f4d0132 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWayland.java @@ -0,0 +1,97 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** Native bindings to the GLFW library's Wayland native access functions. */ +public class GLFWNativeWayland { + + /** Contains the function pointers loaded from {@code GLFW.getLibrary()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + GetWaylandDisplay = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetWaylandDisplay"), + GetWaylandMonitor = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetWaylandMonitor"), + GetWaylandWindow = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetWaylandWindow"); + + } + + protected GLFWNativeWayland() { + throw new UnsupportedOperationException(); + } + + // --- [ glfwGetWaylandDisplay ] --- + + /** + * Returns the {@code struct wl_display*} used by GLFW. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @return the {@code struct wl_display*} used by GLFW, or {@code NULL} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.2 + */ + @NativeType("struct wl_display *") + public static long glfwGetWaylandDisplay() { + long __functionAddress = Functions.GetWaylandDisplay; + return invokeP(__functionAddress); + } + + // --- [ glfwGetWaylandMonitor ] --- + + /** + * Returns the {@code struct wl_output*} of the specified monitor. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @return the {@code struct wl_output*} of the specified monitor, or {@code NULL} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.2 + */ + @NativeType("struct wl_output *") + public static long glfwGetWaylandMonitor(@NativeType("GLFWmonitor *") long monitor) { + long __functionAddress = Functions.GetWaylandMonitor; + if (CHECKS) { + check(monitor); + } + return invokePP(monitor, __functionAddress); + } + + // --- [ glfwGetWaylandWindow ] --- + + /** + * Returns the main {@code struct wl_surface*} of the specified window. + * + *

    This function may be called from any thread. Access is not synchronized.

    + * + * @return the main {@code struct wl_surface*} of the specified window, or {@code NULL} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.2 + */ + @NativeType("struct wl_surface *") + public static long glfwGetWaylandWindow(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetWaylandWindow; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWin32.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWin32.java new file mode 100644 index 000000000..1b74c9682 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeWin32.java @@ -0,0 +1,158 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to the GLFW library's Win32 native access functions. */ +public class GLFWNativeWin32 { + + /** Contains the function pointers loaded from {@code GLFW.getLibrary()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + GetWin32Adapter = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetWin32Adapter"), + GetWin32Monitor = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetWin32Monitor"), + GetWin32Window = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetWin32Window"), + AttachWin32Window = apiGetFunctionAddress(GLFW.getLibrary(), "glfwAttachWin32Window"); + + } + + protected GLFWNativeWin32() { + throw new UnsupportedOperationException(); + } + + // --- [ glfwGetWin32Adapter ] --- + + /** Unsafe version of: {@link #glfwGetWin32Adapter GetWin32Adapter} */ + public static long nglfwGetWin32Adapter(long monitor) { + long __functionAddress = Functions.GetWin32Adapter; + if (CHECKS) { + check(monitor); + } + return invokePP(monitor, __functionAddress); + } + + /** + * Returns the adapter device name of the specified monitor. + * + *

    Note: This function may be called from any thread. Access is not synchronized.

    + * + * @param monitor the GLFW monitor + * + * @return the UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) of the specified monitor, or {@code NULL} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.1 + */ + @Nullable + @NativeType("char const *") + public static String glfwGetWin32Adapter(@NativeType("GLFWmonitor *") long monitor) { + long __result = nglfwGetWin32Adapter(monitor); + return memUTF8Safe(__result); + } + + // --- [ glfwGetWin32Monitor ] --- + + /** Unsafe version of: {@link #glfwGetWin32Monitor GetWin32Monitor} */ + public static long nglfwGetWin32Monitor(long monitor) { + long __functionAddress = Functions.GetWin32Monitor; + if (CHECKS) { + check(monitor); + } + return invokePP(monitor, __functionAddress); + } + + /** + * Returns the display device name of the specified monitor. + * + *

    Note: This function may be called from any thread. Access is not synchronized.

    + * + * @param monitor the GLFW monitor + * + * @return the UTF-8 encoded display device name (for example `\\.\DISPLAY1\Monitor0`) of the specified monitor, or {@code NULL} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.1 + */ + @Nullable + @NativeType("char const *") + public static String glfwGetWin32Monitor(@NativeType("GLFWmonitor *") long monitor) { + long __result = nglfwGetWin32Monitor(monitor); + return memUTF8Safe(__result); + } + + // --- [ glfwGetWin32Window ] --- + + /** + * Returns the {@code HWND} of the specified window. + * + *

    The {@code HDC} associated with the window can be queried with the + * GetDC function. + * + * HDC dc = GetDC(glfwGetWin32Window(window)); + * This DC is private and does not need to be released.

    + * + *

    Note: This function may be called from any thread. Access is not synchronized.

    + * + * @param window the GLFW window + * + * @return the {@code HWND} of the specified window, or {@code NULL} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.0 + */ + @NativeType("HWND") + public static long glfwGetWin32Window(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetWin32Window; + if (CHECKS) { + check(window); + } + return invokePP(window, __functionAddress); + } + + // --- [ glfwAttachWin32Window ] --- + + /** + * Wraps an existing {@code HWND} in a new GLFW window object. + * + *

    This function creates a GLFW window object and its associated OpenGL or OpenGL ES context for an existing {@code HWND}. The {@code HWND} is not + * destroyed by GLFW.

    + * + *

    This function may be called from any thread.

    + * + *

    LWJGL: This functionality is experimental and not officially supported by GLFW yet.

    + * + * @param handle the {@code HWND} to attach to the window object + * @param share the window whose context to share resources with, or {@code NULL} to not share resources + * + * @return the handle of the created window, or {@code NULL} if an error occurred + * + * @since version 3.3 + */ + @NativeType("GLFWwindow *") + public static long glfwAttachWin32Window(@NativeType("HWND") long handle, @NativeType("GLFWwindow *") long share) { + long __functionAddress = Functions.AttachWin32Window; + if (CHECKS) { + check(handle); + } + return invokePPP(handle, share, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeX11.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeX11.java new file mode 100644 index 000000000..b838271e3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWNativeX11.java @@ -0,0 +1,207 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to the GLFW library's X11 native access functions. */ +public class GLFWNativeX11 { + + /** Contains the function pointers loaded from {@code GLFW.getLibrary()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + GetX11Display = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetX11Display"), + GetX11Adapter = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetX11Adapter"), + GetX11Monitor = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetX11Monitor"), + GetX11Window = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetX11Window"), + SetX11SelectionString = apiGetFunctionAddress(GLFW.getLibrary(), "glfwSetX11SelectionString"), + GetX11SelectionString = apiGetFunctionAddress(GLFW.getLibrary(), "glfwGetX11SelectionString"); + + } + + protected GLFWNativeX11() { + throw new UnsupportedOperationException(); + } + + // --- [ glfwGetX11Display ] --- + + /** + * Returns the {@code Display} used by GLFW. + * + *

    Note: This function may be called from any thread. Access is not synchronized.

    + * + * @return the {@code Display} used by GLFW, or {@code NULL} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.0 + */ + @NativeType("Display *") + public static long glfwGetX11Display() { + long __functionAddress = Functions.GetX11Display; + return invokeP(__functionAddress); + } + + // --- [ glfwGetX11Adapter ] --- + + /** + * Returns the {@code RRCrtc} of the specified monitor. + * + *

    Note: This function may be called from any thread. Access is not synchronized.

    + * + * @param monitor the GLFW monitor + * + * @return the {@code RRCrtc} of the specified monitor, or {@code None} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.1 + */ + @NativeType("RRCrtc") + public static long glfwGetX11Adapter(@NativeType("GLFWmonitor *") long monitor) { + long __functionAddress = Functions.GetX11Adapter; + if (CHECKS) { + check(monitor); + } + return invokePN(monitor, __functionAddress); + } + + // --- [ glfwGetX11Monitor ] --- + + /** + * Returns the {@code RROutput} of the specified monitor. + * + *

    Note: This function may be called from any thread. Access is not synchronized.

    + * + * @param monitor the GLFW monitor + * + * @return the {@code RROutput} of the specified monitor, or {@code None} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.1 + */ + @NativeType("RROutput") + public static long glfwGetX11Monitor(@NativeType("GLFWmonitor *") long monitor) { + long __functionAddress = Functions.GetX11Monitor; + if (CHECKS) { + check(monitor); + } + return invokePN(monitor, __functionAddress); + } + + // --- [ glfwGetX11Window ] --- + + /** + * Returns the {@code Window} of the specified window. + * + *

    Note: This function may be called from any thread. Access is not synchronized.

    + * + * @param window a GLFW window + * + * @return the {@code Window} of the specified window, or {@code None} if an error occurred. + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + * @since version 3.0 + */ + @NativeType("Window") + public static long glfwGetX11Window(@NativeType("GLFWwindow *") long window) { + long __functionAddress = Functions.GetX11Window; + if (CHECKS) { + check(window); + } + return invokePN(window, __functionAddress); + } + + // --- [ glfwSetX11SelectionString ] --- + + /** Unsafe version of: {@link #glfwSetX11SelectionString SetX11SelectionString} */ + public static void nglfwSetX11SelectionString(long string) { + long __functionAddress = Functions.SetX11SelectionString; + invokePV(string, __functionAddress); + } + + /** + * Sets the current primary selection to the specified string. + * + *

    This function must only be called from the main thread.

    + * + * @param string a UTF-8 encoded string. The specified string is copied before this function returns. + * + * @since version 3.3 + */ + public static void glfwSetX11SelectionString(@NativeType("char const *") ByteBuffer string) { + if (CHECKS) { + checkNT1(string); + } + nglfwSetX11SelectionString(memAddress(string)); + } + + /** + * Sets the current primary selection to the specified string. + * + *

    This function must only be called from the main thread.

    + * + * @param string a UTF-8 encoded string. The specified string is copied before this function returns. + * + * @since version 3.3 + */ + public static void glfwSetX11SelectionString(@NativeType("char const *") CharSequence string) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(string, true); + long stringEncoded = stack.getPointerAddress(); + nglfwSetX11SelectionString(stringEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glfwGetX11SelectionString ] --- + + /** Unsafe version of: {@link #glfwGetX11SelectionString GetX11SelectionString} */ + public static long nglfwGetX11SelectionString() { + long __functionAddress = Functions.GetX11SelectionString; + return invokeP(__functionAddress); + } + + /** + * Returns the contents of the current primary selection as a string. + * + *

    If the selection is empty or if its contents cannot be converted, {@code NULL} is returned and a {@link GLFW#GLFW_FORMAT_UNAVAILABLE FORMAT_UNAVAILABLE} error is generated.

    + * + *

    The returned string is allocated and freed by GLFW. You should not free it yourself. It is valid until the next call to {@link #glfwGetX11SelectionString GetX11SelectionString} or + * {@link #glfwSetX11SelectionString SetX11SelectionString}, or until the library is terminated.

    + * + *

    This function must only be called from the main thread.

    + * + * @return the contents of the selection as a UTF-8 encoded string, or {@code NULL} if an error occurred + * + * @since version 3.3 + */ + @Nullable + @NativeType("char const *") + public static String glfwGetX11SelectionString() { + long __result = nglfwGetX11SelectionString(); + return memUTF8Safe(__result); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWReallocateCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWReallocateCallback.java new file mode 100644 index 000000000..3a839c438 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWReallocateCallback.java @@ -0,0 +1,103 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The function pointer type for memory reallocation callbacks. + * + *

    This is the function pointer type for memory reallocation callbacks. A memory reallocation callback function has the following signature:

    + * + *
    
    + * void* function_name(void* block, size_t size, void* user)            
    + * + *

    This function must return a memory block at least {@code size} bytes long, or {@code NULL} if allocation failed. Note that not all parts of GLFW handle + * allocation failures gracefully yet.

    + * + *

    This function may be called during {@link GLFW#glfwInit Init} but before the library is flagged as initialized, as well as during {@link GLFW#glfwTerminate Terminate} after the library is no + * longer flagged as initialized.

    + * + *

    Any memory allocated by this function will be deallocated during library termination or earlier.

    + * + *

    The block address will never be {@code NULL} and the size will always be greater than zero. Reallocations of a block to size zero are converted into + * deallocations. Reallocations of {@code NULL} to a non-zero size are converted into regular allocations.

    + * + *
    Note
    + * + *
      + *
    • The returned memory block must be valid at least until it is deallocated.
    • + *
    • This function should not call any GLFW function.
    • + *
    • This function may be called from any thread that calls GLFW functions.
    • + *
    + * + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     void *block,
    + *     size_t size,
    + *     void *user
    + * )
    + * + * @since version 3.4 + */ +public abstract class GLFWReallocateCallback extends Callback implements GLFWReallocateCallbackI { + + /** + * Creates a {@code GLFWReallocateCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWReallocateCallback} + */ + public static GLFWReallocateCallback create(long functionPointer) { + GLFWReallocateCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWReallocateCallback + ? (GLFWReallocateCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWReallocateCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWReallocateCallback} instance that delegates to the specified {@code GLFWReallocateCallbackI} instance. */ + public static GLFWReallocateCallback create(GLFWReallocateCallbackI instance) { + return instance instanceof GLFWReallocateCallback + ? (GLFWReallocateCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWReallocateCallback() { + super(CIF); + } + + GLFWReallocateCallback(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends GLFWReallocateCallback { + + private final GLFWReallocateCallbackI delegate; + + Container(long functionPointer, GLFWReallocateCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public long invoke(long block, long size, long user) { + return delegate.invoke(block, size, user); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWReallocateCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWReallocateCallbackI.java new file mode 100644 index 000000000..fc9e07e7c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWReallocateCallbackI.java @@ -0,0 +1,87 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * The function pointer type for memory reallocation callbacks. + * + *

    This is the function pointer type for memory reallocation callbacks. A memory reallocation callback function has the following signature:

    + * + *
    
    + * void* function_name(void* block, size_t size, void* user)            
    + * + *

    This function must return a memory block at least {@code size} bytes long, or {@code NULL} if allocation failed. Note that not all parts of GLFW handle + * allocation failures gracefully yet.

    + * + *

    This function may be called during {@link GLFW#glfwInit Init} but before the library is flagged as initialized, as well as during {@link GLFW#glfwTerminate Terminate} after the library is no + * longer flagged as initialized.

    + * + *

    Any memory allocated by this function will be deallocated during library termination or earlier.

    + * + *

    The block address will never be {@code NULL} and the size will always be greater than zero. Reallocations of a block to size zero are converted into + * deallocations. Reallocations of {@code NULL} to a non-zero size are converted into regular allocations.

    + * + *
    Note
    + * + *
      + *
    • The returned memory block must be valid at least until it is deallocated.
    • + *
    • This function should not call any GLFW function.
    • + *
    • This function may be called from any thread that calls GLFW functions.
    • + *
    + * + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     void *block,
    + *     size_t size,
    + *     void *user
    + * )
    + * + * @since version 3.4 + */ +@FunctionalInterface +@NativeType("GLFWreallocatefun") +public interface GLFWReallocateCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_pointer, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + long __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)) + ); + apiClosureRetP(ret, __result); + } + + /** + * Will be called for memory reallocation requests. + * + * @param block the address of the memory block to reallocate + * @param size the new minimum size, in bytes, of the memory block + * @param user the user-defined pointer from the allocator + * + * @return the address of the newly allocated or resized memory block, or {@code NULL} if an error occurred + */ + @NativeType("void *") long invoke(@NativeType("void *") long block, @NativeType("size_t") long size, @NativeType("void *") long user); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWScrollCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWScrollCallback.java new file mode 100644 index 000000000..ec3a3ff9b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWScrollCallback.java @@ -0,0 +1,87 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetScrollCallback SetScrollCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     double xoffset,
    + *     double yoffset
    + * )
    + * + * @since version 3.0 + */ +public abstract class GLFWScrollCallback extends Callback implements GLFWScrollCallbackI { + + /** + * Creates a {@code GLFWScrollCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWScrollCallback} + */ + public static GLFWScrollCallback create(long functionPointer) { + GLFWScrollCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWScrollCallback + ? (GLFWScrollCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWScrollCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWScrollCallback} instance that delegates to the specified {@code GLFWScrollCallbackI} instance. */ + public static GLFWScrollCallback create(GLFWScrollCallbackI instance) { + return instance instanceof GLFWScrollCallback + ? (GLFWScrollCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWScrollCallback() { + super(CIF); + } + + GLFWScrollCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetScrollCallback SetScrollCallback}. */ + public GLFWScrollCallback set(long window) { + glfwSetScrollCallback(window, this); + return this; + } + + private static final class Container extends GLFWScrollCallback { + + private final GLFWScrollCallbackI delegate; + + Container(long functionPointer, GLFWScrollCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, double xoffset, double yoffset) { + delegate.invoke(window, xoffset, yoffset); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWScrollCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWScrollCallbackI.java new file mode 100644 index 000000000..3f0f09145 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWScrollCallbackI.java @@ -0,0 +1,60 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetScrollCallback SetScrollCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     double xoffset,
    + *     double yoffset
    + * )
    + * + * @since version 3.0 + */ +@FunctionalInterface +@NativeType("GLFWscrollfun") +public interface GLFWScrollCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_double, ffi_type_double + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetDouble(memGetAddress(args + POINTER_SIZE)), + memGetDouble(memGetAddress(args + 2 * POINTER_SIZE)) + ); + } + + /** + * Will be called when a scrolling device is used, such as a mouse wheel or scrolling area of a touchpad. + * + * @param window the window that received the event + * @param xoffset the scroll offset along the x-axis + * @param yoffset the scroll offset along the y-axis + */ + void invoke(@NativeType("GLFWwindow *") long window, double xoffset, double yoffset); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWVidMode.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWVidMode.java new file mode 100644 index 000000000..c0745ac59 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWVidMode.java @@ -0,0 +1,202 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Describes a single video mode. + * + *

    Layout

    + * + *
    
    + * struct GLFWvidmode {
    + *     int {@link #width};
    + *     int {@link #height};
    + *     int {@link #redBits};
    + *     int {@link #greenBits};
    + *     int {@link #blueBits};
    + *     int {@link #refreshRate};
    + * }
    + */ +@NativeType("struct GLFWvidmode") +public class GLFWVidMode extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + WIDTH, + HEIGHT, + REDBITS, + GREENBITS, + BLUEBITS, + REFRESHRATE; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + WIDTH = layout.offsetof(0); + HEIGHT = layout.offsetof(1); + REDBITS = layout.offsetof(2); + GREENBITS = layout.offsetof(3); + BLUEBITS = layout.offsetof(4); + REFRESHRATE = layout.offsetof(5); + } + + protected GLFWVidMode(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected GLFWVidMode create(long address, @Nullable ByteBuffer container) { + return new GLFWVidMode(address, container); + } + + /** + * Creates a {@code GLFWVidMode} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public GLFWVidMode(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the width, in screen coordinates, of the video mode */ + public int width() { return nwidth(address()); } + /** the height, in screen coordinates, of the video mode */ + public int height() { return nheight(address()); } + /** the bit depth of the red channel of the video mode */ + public int redBits() { return nredBits(address()); } + /** the bit depth of the green channel of the video mode */ + public int greenBits() { return ngreenBits(address()); } + /** the bit depth of the blue channel of the video mode */ + public int blueBits() { return nblueBits(address()); } + /** the refresh rate, in Hz, of the video mode */ + public int refreshRate() { return nrefreshRate(address()); } + + // ----------------------------------- + + /** Returns a new {@code GLFWVidMode} instance for the specified memory address. */ + public static GLFWVidMode create(long address) { + return new GLFWVidMode(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static GLFWVidMode createSafe(long address) { + return address == NULL ? null : new GLFWVidMode(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + GLFWVidMode.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + GLFWVidMode.HEIGHT); } + /** Unsafe version of {@link #redBits}. */ + public static int nredBits(long struct) { return UNSAFE.getInt(null, struct + GLFWVidMode.REDBITS); } + /** Unsafe version of {@link #greenBits}. */ + public static int ngreenBits(long struct) { return UNSAFE.getInt(null, struct + GLFWVidMode.GREENBITS); } + /** Unsafe version of {@link #blueBits}. */ + public static int nblueBits(long struct) { return UNSAFE.getInt(null, struct + GLFWVidMode.BLUEBITS); } + /** Unsafe version of {@link #refreshRate}. */ + public static int nrefreshRate(long struct) { return UNSAFE.getInt(null, struct + GLFWVidMode.REFRESHRATE); } + + // ----------------------------------- + + /** An array of {@link GLFWVidMode} structs. */ + public static class Buffer extends StructBuffer { + + private static final GLFWVidMode ELEMENT_FACTORY = GLFWVidMode.create(-1L); + + /** + * Creates a new {@code GLFWVidMode.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link GLFWVidMode#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected GLFWVidMode getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link GLFWVidMode#width} field. */ + public int width() { return GLFWVidMode.nwidth(address()); } + /** @return the value of the {@link GLFWVidMode#height} field. */ + public int height() { return GLFWVidMode.nheight(address()); } + /** @return the value of the {@link GLFWVidMode#redBits} field. */ + public int redBits() { return GLFWVidMode.nredBits(address()); } + /** @return the value of the {@link GLFWVidMode#greenBits} field. */ + public int greenBits() { return GLFWVidMode.ngreenBits(address()); } + /** @return the value of the {@link GLFWVidMode#blueBits} field. */ + public int blueBits() { return GLFWVidMode.nblueBits(address()); } + /** @return the value of the {@link GLFWVidMode#refreshRate} field. */ + public int refreshRate() { return GLFWVidMode.nrefreshRate(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWVulkan.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWVulkan.java new file mode 100644 index 000000000..889436b4c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWVulkan.java @@ -0,0 +1,352 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.vulkan.EXTMetalSurface.VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT; +import static org.lwjgl.vulkan.EXTMetalSurface.vkCreateMetalSurfaceEXT; +import static org.lwjgl.vulkan.KHRAndroidSurface.VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR; +import static org.lwjgl.vulkan.KHRAndroidSurface.vkCreateAndroidSurfaceKHR; + +import org.lwjgl.vulkan.*; + +/** Native bindings to the GLFW library's Vulkan functions. */ +public class GLFWVulkan { + + static { + if (Platform.get() == Platform.MACOSX) { + setPath(VK.getFunctionProvider()); + } + } + + protected GLFWVulkan() { + throw new UnsupportedOperationException(); + } + + // --- [ glfwInitVulkanLoader ] --- + + /** + * Sets the desired Vulkan {@code vkGetInstanceProcAddr} function. + * + *

    This function sets the {@code vkGetInstanceProcAddr} function that GLFW will use for all Vulkan related entry point queries.

    + * + *

    This feature is mostly useful on macOS, if your copy of the Vulkan loader is in a location where GLFW cannot find it through dynamic loading, or if you + * are still using the static library version of the loader.

    + * + *

    If set to {@code NULL}, GLFW will try to load the Vulkan loader dynamically by its standard name and get this function from there. This is the default + * behavior.

    + * + *

    The standard name of the loader is {@code vulkan-1.dll} on Windows, {@code libvulkan.so.1} on Linux and other Unix-like systems and + * {@code libvulkan.1.dylib} on macOS. If your code is also loading it via these names then you probably don't need to use this function.

    + * + *

    The function address you set is never reset by GLFW, but it only takes effect during initialization. Once GLFW has been initialized, any updates will + * be ignored until the library is terminated and initialized again.

    + * + *

    This function may be called before {@link GLFW#glfwInit Init}.

    + * + *

    This function must only be called from the main thread.

    + * + * @param loader the address of the function to use, or {@code NULL} + * + * @since version 3.4 + */ + public static void glfwInitVulkanLoader(@NativeType("PFN_vkGetInstanceProcAddr") long loader) { + //long __functionAddress = Functions.InitVulkanLoader; + //invokePV(loader, __functionAddress); + } + + // --- [ glfwVulkanSupported ] --- + + /** + * Returns whether the Vulkan loader has been found. This check is performed by {@link GLFW#glfwInit Init}. + * + *

    The availability of a Vulkan loader and even an ICD does not by itself guarantee that surface creation or even instance creation is possible. Call + * {@link #glfwGetRequiredInstanceExtensions GetRequiredInstanceExtensions} to check whether the extensions necessary for Vulkan surface creation are available and + * {@link #glfwGetPhysicalDevicePresentationSupport GetPhysicalDevicePresentationSupport} to check whether a queue family of a physical device supports image presentation.

    + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}.

    + * + *

    This function may be called from any thread.

    + * + * @return {@link GLFW#GLFW_TRUE TRUE} if Vulkan is available, or {@link GLFW#GLFW_FALSE FALSE} otherwise + * + * @since version 3.2 + */ + @NativeType("int") + public static boolean glfwVulkanSupported() { + //long __functionAddress = Functions.VulkanSupported; + //return invokeI(__functionAddress) != 0; + return true; + } + + // --- [ glfwGetRequiredInstanceExtensions ] --- + + /** + * Returns an array of names of Vulkan instance extensions required by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the list will + * always contain {@code VK_KHR_surface}, so if you don't require any additional extensions you can pass this list directly to the {@link VkInstanceCreateInfo} + * struct. + * + *

    If Vulkan is not available on the machine, this function returns {@code NULL} and generates a {@link GLFW#GLFW_API_UNAVAILABLE API_UNAVAILABLE} error. Call {@link #glfwVulkanSupported VulkanSupported} to check whether + * Vulkan is available.

    + * + *

    If Vulkan is available but no set of extensions allowing window surface creation was found, this function returns {@code NULL}. You may still use Vulkan for + * off-screen rendering and compute work.

    + * + *

    Additional extensions may be required by future versions of GLFW. You should check if any extensions you wish to enable are already in the returned + * array, as it is an error to specify an extension more than once in the {@code VkInstanceCreateInfo} struct.

    + * + *

    The returned array is allocated and freed by GLFW. You should not free it yourself. It is guaranteed to be valid only until the library is terminated.

    + * + *

    This function may be called from any thread.

    + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED} and {@link GLFW#GLFW_API_UNAVAILABLE API_UNAVAILABLE}.

    + * + * @return an array of ASCII encoded extension names, or {@code NULL} if an error occurred + * + * @since version 3.2 + */ + @Nullable + @NativeType("char const **") + public static PointerBuffer glfwGetRequiredInstanceExtensions() { + MemoryStack stack = MemoryStack.stackPush(); + String platformSurface; + if (Platform.get() == Platform.MACOSX) { + platformSurface = "VK_EXT_metal_surface"; + } else { + platformSurface = "VK_KHR_android_surface"; + } + return stack.pointers(stack.UTF8(KHRSurface.VK_KHR_SURFACE_EXTENSION_NAME), stack.UTF8(platformSurface)); + } + + /** + * Returns the address of the specified Vulkan core or extension function for the specified instance. If instance is set to {@code NULL} it can return any + * function exported from the Vulkan loader, including at least the following functions: + * + *
      + *
    • {@link VK10#vkEnumerateInstanceExtensionProperties}
    • + *
    • {@link VK10#vkEnumerateInstanceLayerProperties}
    • + *
    • {@link VK10#vkCreateInstance}
    • + *
    • {@link VK10#vkGetInstanceProcAddr}
    • + *
    + * + *

    If Vulkan is not available on the machine, this function returns {@code NULL} and generates a {@link GLFW#GLFW_API_UNAVAILABLE API_UNAVAILABLE} error. Call {@link #glfwVulkanSupported VulkanSupported} to check whether + * Vulkan is available.

    + * + *

    This function is equivalent to calling {@link VK10#vkGetInstanceProcAddr} with a platform-specific query of the Vulkan loader as a fallback.

    + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED} and {@link GLFW#GLFW_API_UNAVAILABLE API_UNAVAILABLE}.

    + * + *

    The returned function pointer is valid until the library is terminated.

    + * + *

    This function may be called from any thread.

    + * + * @param instance the Vulkan instance to query, or {@code NULL} to retrieve functions related to instance creation + * @param procname the ASCII encoded name of the function + * + * @return the address of the function, or {@code NULL} if an error occurred + * + * @since version 3.2 + */ + @NativeType("GLFWvkproc") + public static long glfwGetInstanceProcAddress(@Nullable VkInstance instance, @NativeType("char const *") ByteBuffer procname) { + if (CHECKS) { + checkNT1(procname); + } + return VK10.vkGetInstanceProcAddr(instance, procname); + } + + /** + * Returns the address of the specified Vulkan core or extension function for the specified instance. If instance is set to {@code NULL} it can return any + * function exported from the Vulkan loader, including at least the following functions: + * + *
      + *
    • {@link VK10#vkEnumerateInstanceExtensionProperties}
    • + *
    • {@link VK10#vkEnumerateInstanceLayerProperties}
    • + *
    • {@link VK10#vkCreateInstance}
    • + *
    • {@link VK10#vkGetInstanceProcAddr}
    • + *
    + * + *

    If Vulkan is not available on the machine, this function returns {@code NULL} and generates a {@link GLFW#GLFW_API_UNAVAILABLE API_UNAVAILABLE} error. Call {@link #glfwVulkanSupported VulkanSupported} to check whether + * Vulkan is available.

    + * + *

    This function is equivalent to calling {@link VK10#vkGetInstanceProcAddr} with a platform-specific query of the Vulkan loader as a fallback.

    + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED} and {@link GLFW#GLFW_API_UNAVAILABLE API_UNAVAILABLE}.

    + * + *

    The returned function pointer is valid until the library is terminated.

    + * + *

    This function may be called from any thread.

    + * + * @param instance the Vulkan instance to query, or {@code NULL} to retrieve functions related to instance creation + * @param procname the ASCII encoded name of the function + * + * @return the address of the function, or {@code NULL} if an error occurred + * + * @since version 3.2 + */ + @NativeType("GLFWvkproc") + public static long glfwGetInstanceProcAddress(@Nullable VkInstance instance, @NativeType("char const *") CharSequence procname) { + return VK10.vkGetInstanceProcAddr(instance, procname); + } + + // --- [ glfwGetPhysicalDevicePresentationSupport ] --- + + /** + * Returns whether the specified queue family of the specified physical device supports presentation to the platform GLFW was built for. + * + *

    If Vulkan or the required window surface creation instance extensions are not available on the machine, or if the specified instance was not created + * with the required extensions, this function returns {@link GLFW#GLFW_FALSE FALSE} and generates a {@link GLFW#GLFW_API_UNAVAILABLE API_UNAVAILABLE} error. Call {@link #glfwVulkanSupported VulkanSupported} to check whether Vulkan is + * available and {@link #glfwGetRequiredInstanceExtensions GetRequiredInstanceExtensions} to check what instance extensions are required.

    + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}, {@link GLFW#GLFW_API_UNAVAILABLE API_UNAVAILABLE} and {@link GLFW#GLFW_PLATFORM_ERROR PLATFORM_ERROR}.

    + * + *

    macOS: This function currently always returns {@link GLFW#GLFW_TRUE TRUE}, as the {@code VK_MVK_macos_surface} and {@code VK_EXT_metal_surface} extensions do not provide a + * {@code vkGetPhysicalDevice*PresentationSupport} type function.

    + * + *

    This function may be called from any thread. For synchronization details of Vulkan objects, see the Vulkan specification.

    + * + * @param instance the instance that the physical device belongs to + * @param device the physical device that the queue family belongs to + * @param queuefamily the index of the queue family to query + * + * @return {@link GLFW#GLFW_TRUE TRUE} if the queue family supports presentation, or {@link GLFW#GLFW_FALSE FALSE} otherwise + * + * @since version 3.2 + */ + @NativeType("int") + public static boolean glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, @NativeType("uint32_t") int queuefamily) { + return true; + } + + // --- [ glfwCreateWindowSurface ] --- + + /** + * Creates a Vulkan surface for the specified window. + * + *

    If the Vulkan loader was not found at initialization, this function returns {@link VK10#VK_ERROR_INITIALIZATION_FAILED} and generates a {@link GLFW#GLFW_API_UNAVAILABLE API_UNAVAILABLE} error. + * Call {@link #glfwVulkanSupported VulkanSupported} to check whether the Vulkan loader was found.

    + * + *

    If the required window surface creation instance extensions are not available or if the specified instance was not created with these extensions + * enabled, this function returns {@link VK10#VK_ERROR_EXTENSION_NOT_PRESENT} and generates a {@link GLFW#GLFW_API_UNAVAILABLE API_UNAVAILABLE} error. Call {@link #glfwGetRequiredInstanceExtensions GetRequiredInstanceExtensions} to + * check what instance extensions are required.

    + * + *

    The window surface cannot be shared with another API so the window must have been created with the client api hint set to {@link GLFW#GLFW_NO_API NO_API} otherwise it + * generates a {@link GLFW#GLFW_INVALID_VALUE INVALID_VALUE} error and returns {@link KHRSurface#VK_ERROR_NATIVE_WINDOW_IN_USE_KHR}.

    + * + *

    The window surface must be destroyed before the specified Vulkan instance. It is the responsibility of the caller to destroy the window surface. GLFW + * does not destroy it for you. Call {@link KHRSurface#vkDestroySurfaceKHR} to destroy the surface.

    + * + *

    Possible errors include {@link GLFW#GLFW_NOT_INITIALIZED NOT_INITIALIZED}, {@link GLFW#GLFW_API_UNAVAILABLE API_UNAVAILABLE}, {@link GLFW#GLFW_PLATFORM_ERROR PLATFORM_ERROR} and {@link GLFW#GLFW_INVALID_VALUE INVALID_VALUE}.

    + * + *

    If an error occurs before the creation call is made, GLFW returns the Vulkan error code most appropriate for the error. Appropriate use of + * {@link #glfwVulkanSupported VulkanSupported} and {@code glfwGetRequiredInstanceExtensions} should eliminate almost all occurrences of these errors.

    + * + *

    Notes:

    + * + *
      + *
    • This function may be called from any thread. For synchronization details of Vulkan objects, see the Vulkan specification.
    • + *
    • macOS: GLFW prefers the {@code VK_EXT_metal_surface} extension, with the {@code VK_MVK_macos_surface} extension as a fallback. The name of + * the selected extension, if any, is included in the array returned by {@code glfwGetRequiredInstanceExtensions}.
    • + *
    • macOS: This function creates and sets a {@code CAMetalLayer} instance for the window content view, which is required for MoltenVK to + * function.
    • + *
    • x11: By default GLFW prefers the {@code VK_KHR_xcb_surface} extension, with the {@code VK_KHR_xlib_surface} extension as a fallback. You can + * make {@code VK_KHR_xlib_surface} the preferred extension by setting the {@link GLFW#GLFW_X11_XCB_VULKAN_SURFACE X11_XCB_VULKAN_SURFACE} init hint. The name of the selected extension, if + * any, is included in the array returned by {@code glfwGetRequiredInstanceExtensions}.
    • + *
    + * + * @param instance the Vulkan instance to create the surface in + * @param window the window to create the surface for + * @param allocator the allocator to use, or {@code NULL} to use the default allocator. + * @param surface where to store the handle of the surface. This is set to {@link VK10#VK_NULL_HANDLE} if an error occurred. + * + * @return {@link VK10#VK_SUCCESS} if successful, or a Vulkan error code if an error occurred + * + * @since version 3.2 + */ + @NativeType("VkResult") + public static int glfwCreateWindowSurface(VkInstance instance, @NativeType("GLFWwindow *") long window, @Nullable @NativeType("VkAllocationCallbacks const *") VkAllocationCallbacks allocator, @NativeType("VkSurfaceKHR *") LongBuffer surface) { + if (CHECKS) { + check(surface, 1); + } + if (Platform.get() == Platform.LINUX) { + VkAndroidSurfaceCreateInfoKHR pCreateInfo = VkAndroidSurfaceCreateInfoKHR + .calloc() + .sType(VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR) + .window(window); + return vkCreateAndroidSurfaceKHR(instance, pCreateInfo, null, surface); + } + return VK10.VK_ERROR_EXTENSION_NOT_PRESENT; + } + + /** Array version of: {@link #glfwCreateWindowSurface CreateWindowSurface} */ + @NativeType("VkResult") + public static int glfwCreateWindowSurface(VkInstance instance, @NativeType("GLFWwindow *") long window, @Nullable @NativeType("VkAllocationCallbacks const *") VkAllocationCallbacks allocator, @NativeType("VkSurfaceKHR *") long[] surface) { + MemoryStack stack = stackGet(); + LongBuffer pSurface = stack.mallocLong(1); + int result = glfwCreateWindowSurface(instance, window, allocator, pSurface); + surface[0] = pSurface.get(0); + return result; + } + + /** + * Calls {@link #setPath(String)} with the path of the specified {@link SharedLibrary}. + * + *

    Example usage: GLFWVulkan.setPath(VK.getFunctionProvider());

    + * + * @param sharedLibrary a {@code FunctionProvider} instance that will be cast to {@code SharedLibrary} + */ + public static void setPath(FunctionProvider sharedLibrary) { + if (!(sharedLibrary instanceof SharedLibrary)) { + apiLog("GLFW Vulkan path override not set: function provider is not a shared library."); + return; + } + + String path = ((SharedLibrary)sharedLibrary).getPath(); + if (path == null) { + apiLog("GLFW Vulkan path override not set: Could not resolve the shared library path."); + return; + } + + setPath(path); + } + + /** + * Overrides the Vulkan shared library that GLFW loads internally. + * + *

    This is useful when there's a mismatch between the shared libraries loaded by LWJGL and GLFW.

    + * + *

    This method must be called before GLFW initializes Vulkan. The override is available only in the default GLFW build bundled with LWJGL. Using the + * override with a custom GLFW build will produce a warning in {@code DEBUG} mode (but not an error).

    + * + * @param path the Vulkan shared library path, or {@code null} to remove the override. + */ + public static void setPath(@Nullable String path) { + long override = GLFW.getLibrary().getFunctionAddress("_glfw_vulkan_library"); + if (override == NULL) { + apiLog("GLFW Vulkan path override not set: Could not resolve override symbol."); + return; + } + + long a = memGetAddress(override); + if (a != NULL) { + nmemFree(a); + } + memPutAddress(override, path == null ? NULL : memAddress(memUTF8(path))); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowCloseCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowCloseCallback.java new file mode 100644 index 000000000..0111ca906 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowCloseCallback.java @@ -0,0 +1,85 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetWindowCloseCallback SetWindowCloseCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window
    + * )
    + * + * @since version 2.5 + */ +public abstract class GLFWWindowCloseCallback extends Callback implements GLFWWindowCloseCallbackI { + + /** + * Creates a {@code GLFWWindowCloseCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWWindowCloseCallback} + */ + public static GLFWWindowCloseCallback create(long functionPointer) { + GLFWWindowCloseCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWWindowCloseCallback + ? (GLFWWindowCloseCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWWindowCloseCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWWindowCloseCallback} instance that delegates to the specified {@code GLFWWindowCloseCallbackI} instance. */ + public static GLFWWindowCloseCallback create(GLFWWindowCloseCallbackI instance) { + return instance instanceof GLFWWindowCloseCallback + ? (GLFWWindowCloseCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWWindowCloseCallback() { + super(CIF); + } + + GLFWWindowCloseCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetWindowCloseCallback SetWindowCloseCallback}. */ + public GLFWWindowCloseCallback set(long window) { + glfwSetWindowCloseCallback(window, this); + return this; + } + + private static final class Container extends GLFWWindowCloseCallback { + + private final GLFWWindowCloseCallbackI delegate; + + Container(long functionPointer, GLFWWindowCloseCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window) { + delegate.invoke(window); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowCloseCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowCloseCallbackI.java new file mode 100644 index 000000000..ebf9993d0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowCloseCallbackI.java @@ -0,0 +1,54 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetWindowCloseCallback SetWindowCloseCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window
    + * )
    + * + * @since version 2.5 + */ +@FunctionalInterface +@NativeType("GLFWwindowclosefun") +public interface GLFWWindowCloseCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)) + ); + } + + /** + * Will be called when the user attempts to close the specified window, for example by clicking the close widget in the title bar. + * + * @param window the window that the user attempted to close + */ + void invoke(@NativeType("GLFWwindow *") long window); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowContentScaleCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowContentScaleCallback.java new file mode 100644 index 000000000..fbc8a2da4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowContentScaleCallback.java @@ -0,0 +1,87 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetWindowContentScaleCallback SetWindowContentScaleCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     float xscale,
    + *     float yscale
    + * )
    + * + * @since version 3.3 + */ +public abstract class GLFWWindowContentScaleCallback extends Callback implements GLFWWindowContentScaleCallbackI { + + /** + * Creates a {@code GLFWWindowContentScaleCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWWindowContentScaleCallback} + */ + public static GLFWWindowContentScaleCallback create(long functionPointer) { + GLFWWindowContentScaleCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWWindowContentScaleCallback + ? (GLFWWindowContentScaleCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWWindowContentScaleCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWWindowContentScaleCallback} instance that delegates to the specified {@code GLFWWindowContentScaleCallbackI} instance. */ + public static GLFWWindowContentScaleCallback create(GLFWWindowContentScaleCallbackI instance) { + return instance instanceof GLFWWindowContentScaleCallback + ? (GLFWWindowContentScaleCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWWindowContentScaleCallback() { + super(CIF); + } + + GLFWWindowContentScaleCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetWindowContentScaleCallback SetWindowContentScaleCallback}. */ + public GLFWWindowContentScaleCallback set(long window) { + glfwSetWindowContentScaleCallback(window, this); + return this; + } + + private static final class Container extends GLFWWindowContentScaleCallback { + + private final GLFWWindowContentScaleCallbackI delegate; + + Container(long functionPointer, GLFWWindowContentScaleCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, float xscale, float yscale) { + delegate.invoke(window, xscale, yscale); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowContentScaleCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowContentScaleCallbackI.java new file mode 100644 index 000000000..584bc9af8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowContentScaleCallbackI.java @@ -0,0 +1,60 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetWindowContentScaleCallback SetWindowContentScaleCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     float xscale,
    + *     float yscale
    + * )
    + * + * @since version 3.3 + */ +@FunctionalInterface +@NativeType("GLFWwindowcontentscalefun") +public interface GLFWWindowContentScaleCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_float, ffi_type_float + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetFloat(memGetAddress(args + POINTER_SIZE)), + memGetFloat(memGetAddress(args + 2 * POINTER_SIZE)) + ); + } + + /** + * Will be called when the window content scale changes. + * + * @param window the window whose content scale changed + * @param xscale the new x-axis content scale of the window + * @param yscale the new y-axis content scale of the window + */ + void invoke(@NativeType("GLFWwindow *") long window, float xscale, float yscale); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowFocusCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowFocusCallback.java new file mode 100644 index 000000000..1836c8f39 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowFocusCallback.java @@ -0,0 +1,86 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetWindowFocusCallback SetWindowFocusCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int focused
    + * )
    + * + * @since version 3.0 + */ +public abstract class GLFWWindowFocusCallback extends Callback implements GLFWWindowFocusCallbackI { + + /** + * Creates a {@code GLFWWindowFocusCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWWindowFocusCallback} + */ + public static GLFWWindowFocusCallback create(long functionPointer) { + GLFWWindowFocusCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWWindowFocusCallback + ? (GLFWWindowFocusCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWWindowFocusCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWWindowFocusCallback} instance that delegates to the specified {@code GLFWWindowFocusCallbackI} instance. */ + public static GLFWWindowFocusCallback create(GLFWWindowFocusCallbackI instance) { + return instance instanceof GLFWWindowFocusCallback + ? (GLFWWindowFocusCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWWindowFocusCallback() { + super(CIF); + } + + GLFWWindowFocusCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetWindowFocusCallback SetWindowFocusCallback}. */ + public GLFWWindowFocusCallback set(long window) { + glfwSetWindowFocusCallback(window, this); + return this; + } + + private static final class Container extends GLFWWindowFocusCallback { + + private final GLFWWindowFocusCallbackI delegate; + + Container(long functionPointer, GLFWWindowFocusCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, boolean focused) { + delegate.invoke(window, focused); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowFocusCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowFocusCallbackI.java new file mode 100644 index 000000000..152173ae1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowFocusCallbackI.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetWindowFocusCallback SetWindowFocusCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int focused
    + * )
    + * + * @since version 3.0 + */ +@FunctionalInterface +@NativeType("GLFWwindowfocusfun") +public interface GLFWWindowFocusCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)) != 0 + ); + } + + /** + * Will be called when the specified window gains or loses focus. + * + * @param window the window that was focused or defocused + * @param focused {@link GLFW#GLFW_TRUE TRUE} if the window was focused, or {@link GLFW#GLFW_FALSE FALSE} if it was defocused + */ + void invoke(@NativeType("GLFWwindow *") long window, @NativeType("int") boolean focused); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowIconifyCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowIconifyCallback.java new file mode 100644 index 000000000..cec3accfe --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowIconifyCallback.java @@ -0,0 +1,86 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetWindowIconifyCallback SetWindowIconifyCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int iconified
    + * )
    + * + * @since version 3.0 + */ +public abstract class GLFWWindowIconifyCallback extends Callback implements GLFWWindowIconifyCallbackI { + + /** + * Creates a {@code GLFWWindowIconifyCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWWindowIconifyCallback} + */ + public static GLFWWindowIconifyCallback create(long functionPointer) { + GLFWWindowIconifyCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWWindowIconifyCallback + ? (GLFWWindowIconifyCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWWindowIconifyCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWWindowIconifyCallback} instance that delegates to the specified {@code GLFWWindowIconifyCallbackI} instance. */ + public static GLFWWindowIconifyCallback create(GLFWWindowIconifyCallbackI instance) { + return instance instanceof GLFWWindowIconifyCallback + ? (GLFWWindowIconifyCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWWindowIconifyCallback() { + super(CIF); + } + + GLFWWindowIconifyCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetWindowIconifyCallback SetWindowIconifyCallback}. */ + public GLFWWindowIconifyCallback set(long window) { + glfwSetWindowIconifyCallback(window, this); + return this; + } + + private static final class Container extends GLFWWindowIconifyCallback { + + private final GLFWWindowIconifyCallbackI delegate; + + Container(long functionPointer, GLFWWindowIconifyCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, boolean iconified) { + delegate.invoke(window, iconified); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowIconifyCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowIconifyCallbackI.java new file mode 100644 index 000000000..a73de4929 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowIconifyCallbackI.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetWindowIconifyCallback SetWindowIconifyCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int iconified
    + * )
    + * + * @since version 3.0 + */ +@FunctionalInterface +@NativeType("GLFWwindowiconifyfun") +public interface GLFWWindowIconifyCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)) != 0 + ); + } + + /** + * Will be called when the specified window is iconified or restored. + * + * @param window the window that was iconified or restored. + * @param iconified {@link GLFW#GLFW_TRUE TRUE} if the window was iconified, or {@link GLFW#GLFW_FALSE FALSE} if it was restored + */ + void invoke(@NativeType("GLFWwindow *") long window, @NativeType("int") boolean iconified); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowMaximizeCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowMaximizeCallback.java new file mode 100644 index 000000000..25942693e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowMaximizeCallback.java @@ -0,0 +1,86 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetWindowMaximizeCallback SetWindowMaximizeCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int maximized
    + * )
    + * + * @since version 3.3 + */ +public abstract class GLFWWindowMaximizeCallback extends Callback implements GLFWWindowMaximizeCallbackI { + + /** + * Creates a {@code GLFWWindowMaximizeCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWWindowMaximizeCallback} + */ + public static GLFWWindowMaximizeCallback create(long functionPointer) { + GLFWWindowMaximizeCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWWindowMaximizeCallback + ? (GLFWWindowMaximizeCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWWindowMaximizeCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWWindowMaximizeCallback} instance that delegates to the specified {@code GLFWWindowMaximizeCallbackI} instance. */ + public static GLFWWindowMaximizeCallback create(GLFWWindowMaximizeCallbackI instance) { + return instance instanceof GLFWWindowMaximizeCallback + ? (GLFWWindowMaximizeCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWWindowMaximizeCallback() { + super(CIF); + } + + GLFWWindowMaximizeCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetWindowMaximizeCallback SetWindowMaximizeCallback}. */ + public GLFWWindowMaximizeCallback set(long window) { + glfwSetWindowMaximizeCallback(window, this); + return this; + } + + private static final class Container extends GLFWWindowMaximizeCallback { + + private final GLFWWindowMaximizeCallbackI delegate; + + Container(long functionPointer, GLFWWindowMaximizeCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, boolean maximized) { + delegate.invoke(window, maximized); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowMaximizeCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowMaximizeCallbackI.java new file mode 100644 index 000000000..0525f7c26 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowMaximizeCallbackI.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetWindowMaximizeCallback SetWindowMaximizeCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int maximized
    + * )
    + * + * @since version 3.3 + */ +@FunctionalInterface +@NativeType("GLFWwindowmaximizefun") +public interface GLFWWindowMaximizeCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)) != 0 + ); + } + + /** + * Will be called when the specified window is maximized or restored. + * + * @param window the window that was maximized or restored. + * @param maximized {@link GLFW#GLFW_TRUE TRUE} if the window was maximized, or {@link GLFW#GLFW_FALSE FALSE} if it was restored + */ + void invoke(@NativeType("GLFWwindow *") long window, @NativeType("int") boolean maximized); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowPosCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowPosCallback.java new file mode 100644 index 000000000..1a88793fc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowPosCallback.java @@ -0,0 +1,87 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetWindowPosCallback SetWindowPosCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int xpos,
    + *     int ypos
    + * )
    + * + * @since version 3.0 + */ +public abstract class GLFWWindowPosCallback extends Callback implements GLFWWindowPosCallbackI { + + /** + * Creates a {@code GLFWWindowPosCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWWindowPosCallback} + */ + public static GLFWWindowPosCallback create(long functionPointer) { + GLFWWindowPosCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWWindowPosCallback + ? (GLFWWindowPosCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWWindowPosCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWWindowPosCallback} instance that delegates to the specified {@code GLFWWindowPosCallbackI} instance. */ + public static GLFWWindowPosCallback create(GLFWWindowPosCallbackI instance) { + return instance instanceof GLFWWindowPosCallback + ? (GLFWWindowPosCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWWindowPosCallback() { + super(CIF); + } + + GLFWWindowPosCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetWindowPosCallback SetWindowPosCallback}. */ + public GLFWWindowPosCallback set(long window) { + glfwSetWindowPosCallback(window, this); + return this; + } + + private static final class Container extends GLFWWindowPosCallback { + + private final GLFWWindowPosCallbackI delegate; + + Container(long functionPointer, GLFWWindowPosCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, int xpos, int ypos) { + delegate.invoke(window, xpos, ypos); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowPosCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowPosCallbackI.java new file mode 100644 index 000000000..c796f8bd2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowPosCallbackI.java @@ -0,0 +1,60 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetWindowPosCallback SetWindowPosCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int xpos,
    + *     int ypos
    + * )
    + * + * @since version 3.0 + */ +@FunctionalInterface +@NativeType("GLFWwindowposfun") +public interface GLFWWindowPosCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_sint32, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)) + ); + } + + /** + * Will be called when the specified window moves. + * + * @param window the window that was moved + * @param xpos the new x-coordinate, in screen coordinates, of the upper-left corner of the content area of the window + * @param ypos the new y-coordinate, in screen coordinates, of the upper-left corner of the content area of the window + */ + void invoke(@NativeType("GLFWwindow *") long window, int xpos, int ypos); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowRefreshCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowRefreshCallback.java new file mode 100644 index 000000000..55492813a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowRefreshCallback.java @@ -0,0 +1,85 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetWindowRefreshCallback SetWindowRefreshCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window
    + * )
    + * + * @since version 2.5 + */ +public abstract class GLFWWindowRefreshCallback extends Callback implements GLFWWindowRefreshCallbackI { + + /** + * Creates a {@code GLFWWindowRefreshCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWWindowRefreshCallback} + */ + public static GLFWWindowRefreshCallback create(long functionPointer) { + GLFWWindowRefreshCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWWindowRefreshCallback + ? (GLFWWindowRefreshCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWWindowRefreshCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWWindowRefreshCallback} instance that delegates to the specified {@code GLFWWindowRefreshCallbackI} instance. */ + public static GLFWWindowRefreshCallback create(GLFWWindowRefreshCallbackI instance) { + return instance instanceof GLFWWindowRefreshCallback + ? (GLFWWindowRefreshCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWWindowRefreshCallback() { + super(CIF); + } + + GLFWWindowRefreshCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetWindowRefreshCallback SetWindowRefreshCallback}. */ + public GLFWWindowRefreshCallback set(long window) { + glfwSetWindowRefreshCallback(window, this); + return this; + } + + private static final class Container extends GLFWWindowRefreshCallback { + + private final GLFWWindowRefreshCallbackI delegate; + + Container(long functionPointer, GLFWWindowRefreshCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window) { + delegate.invoke(window); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowRefreshCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowRefreshCallbackI.java new file mode 100644 index 000000000..278ed39ce --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowRefreshCallbackI.java @@ -0,0 +1,55 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetWindowRefreshCallback SetWindowRefreshCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window
    + * )
    + * + * @since version 2.5 + */ +@FunctionalInterface +@NativeType("GLFWwindowrefreshfun") +public interface GLFWWindowRefreshCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)) + ); + } + + /** + * Will be called when the client area of the specified window needs to be redrawn, for example if the window has been exposed after having been covered by + * another window. + * + * @param window the window whose content needs to be refreshed + */ + void invoke(@NativeType("GLFWwindow *") long window); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowSizeCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowSizeCallback.java new file mode 100644 index 000000000..31a6f3a11 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowSizeCallback.java @@ -0,0 +1,85 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.glfw.GLFW.*; + +/** + * Instances of this class may be passed to the {@link GLFW#glfwSetWindowSizeCallback SetWindowSizeCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int width,
    + *     int height
    + * )
    + */ +public abstract class GLFWWindowSizeCallback extends Callback implements GLFWWindowSizeCallbackI { + + /** + * Creates a {@code GLFWWindowSizeCallback} instance from the specified function pointer. + * + * @return the new {@code GLFWWindowSizeCallback} + */ + public static GLFWWindowSizeCallback create(long functionPointer) { + GLFWWindowSizeCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLFWWindowSizeCallback + ? (GLFWWindowSizeCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLFWWindowSizeCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLFWWindowSizeCallback} instance that delegates to the specified {@code GLFWWindowSizeCallbackI} instance. */ + public static GLFWWindowSizeCallback create(GLFWWindowSizeCallbackI instance) { + return instance instanceof GLFWWindowSizeCallback + ? (GLFWWindowSizeCallback)instance + : new Container(instance.address(), instance); + } + + protected GLFWWindowSizeCallback() { + super(CIF); + } + + GLFWWindowSizeCallback(long functionPointer) { + super(functionPointer); + } + + /** See {@link GLFW#glfwSetWindowSizeCallback SetWindowSizeCallback}. */ + public GLFWWindowSizeCallback set(long window) { + glfwSetWindowSizeCallback(window, this); + return this; + } + + private static final class Container extends GLFWWindowSizeCallback { + + private final GLFWWindowSizeCallbackI delegate; + + Container(long functionPointer, GLFWWindowSizeCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long window, int width, int height) { + delegate.invoke(window, width, height); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowSizeCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowSizeCallbackI.java new file mode 100644 index 000000000..d593b109e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/glfw/GLFWWindowSizeCallbackI.java @@ -0,0 +1,58 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.glfw; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GLFW#glfwSetWindowSizeCallback SetWindowSizeCallback} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLFWwindow *window,
    + *     int width,
    + *     int height
    + * )
    + */ +@FunctionalInterface +@NativeType("GLFWwindowsizefun") +public interface GLFWWindowSizeCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_sint32, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)) + ); + } + + /** + * Will be called when the specified window is resized. + * + * @param window the window that was resized + * @param width the new width, in screen coordinates, of the window + * @param height the new height, in screen coordinates, of the window + */ + void invoke(@NativeType("GLFWwindow *") long window, int width, int height); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/input/Controller.java b/LWJGL-Boat/src/main/java/org/lwjgl/input/Controller.java new file mode 100644 index 000000000..0e62b40f5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/input/Controller.java @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2002-2008 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.input; + +/** + * A game controller of some sort that will provide input. The controller + * presents buttons and axes. Buttons are either pressed or not pressed. Axis + * provide analogue values. + * + * @author Kevin Glass + */ +public interface Controller { + /** + * Get the name assigned to this controller. + * + * @return The name assigned to this controller + */ + String getName(); + + /** + * Get the index of this controller in the collection + * + * @return The index of this controller in the collection + */ + int getIndex(); + + /** + * Retrieve the number of buttons available on this controller + * + * @return The number of butotns available on this controller + */ + int getButtonCount(); + + /** + * Get the name of the specified button. Be warned, often this is + * as exciting as "Button X" + * + * @param index The index of the button whose name should be retrieved + * @return The name of the button requested + */ + String getButtonName(int index); + + /** + * Check if a button is currently pressed + * + * @param index The button to check + * @return True if the button is currently pressed + */ + boolean isButtonPressed(int index); + + /** + * Poll the controller for new data. This will also update + * events + */ + void poll(); + + /** + * Get the X-Axis value of the POV on this controller + * + * @return The X-Axis value of the POV on this controller + */ + float getPovX(); + + /** + * Get the Y-Axis value of the POV on this controller + * + * @return The Y-Axis value of the POV on this controller + */ + float getPovY(); + + /** + * Get the dead zone for a specified axis + * + * @param index The index of the axis for which to retrieve the dead zone + * @return The dead zone for the specified axis + */ + float getDeadZone(int index); + + /** + * Set the dead zone for the specified axis + * + * @param index The index of hte axis for which to set the dead zone + * @param zone The dead zone to use for the specified axis + */ + void setDeadZone(int index,float zone); + + /** + * Retrieve the number of axes available on this controller. + * + * @return The number of axes available on this controller. + */ + int getAxisCount(); + + /** + * Get the name that's given to the specified axis + * + * @param index The index of the axis whose name should be retrieved + * @return The name of the specified axis. + */ + String getAxisName(int index); + + /** + * Retrieve the value thats currently available on a specified axis. The + * value will always be between 1.0 and -1.0 and will calibrate as values + * are passed read. It may be useful to get the player to wiggle the joystick + * from side to side to get the calibration right. + * + * @param index The index of axis to be read + * @return The value from the specified axis. + */ + float getAxisValue(int index); + + /** + * Get the value from the X axis if there is one. If no X axis is + * defined a zero value will be returned. + * + * @return The value from the X axis + */ + float getXAxisValue(); + + /** + * Get the dead zone for the X axis. + * + * @return The dead zone for the X axis + */ + float getXAxisDeadZone(); + + /** + * Set the dead zone for the X axis + * + * @param zone The dead zone to use for the X axis + */ + void setXAxisDeadZone(float zone); + + /** + * Get the value from the Y axis if there is one. If no Y axis is + * defined a zero value will be returned. + * + * @return The value from the Y axis + */ + float getYAxisValue(); + + /** + * Get the dead zone for the Y axis. + * + * @return The dead zone for the Y axis + */ + float getYAxisDeadZone(); + + /** + * Set the dead zone for the Y axis + * + * @param zone The dead zone to use for the Y axis + */ + void setYAxisDeadZone(float zone); + + /** + * Get the value from the Z axis if there is one. If no Z axis is + * defined a zero value will be returned. + * + * @return The value from the Z axis + */ + float getZAxisValue(); + + /** + * Get the dead zone for the Z axis. + * + * @return The dead zone for the Z axis + */ + float getZAxisDeadZone(); + + /** + * Set the dead zone for the Z axis + * + * @param zone The dead zone to use for the Z axis + */ + void setZAxisDeadZone(float zone); + + /** + * Get the value from the RX axis if there is one. If no RX axis is + * defined a zero value will be returned. + * + * @return The value from the RX axis + */ + float getRXAxisValue(); + + /** + * Get the dead zone for the RX axis. + * + * @return The dead zone for the RX axis + */ + float getRXAxisDeadZone(); + + /** + * Set the dead zone for the RX axis + * + * @param zone The dead zone to use for the RX axis + */ + void setRXAxisDeadZone(float zone); + + /** + * Get the value from the RY axis if there is one. If no RY axis is + * defined a zero value will be returned. + * + * @return The value from the RY axis + */ + float getRYAxisValue(); + + /** + * Get the dead zone for the RY axis. + * + * @return The dead zone for the RY axis + */ + float getRYAxisDeadZone(); + + /** + * Set the dead zone for the RY axis + * + * @param zone The dead zone to use for the RY axis + */ + void setRYAxisDeadZone(float zone); + + /** + * Get the value from the RZ axis if there is one. If no RZ axis is + * defined a zero value will be returned. + * + * @return The value from the RZ axis + */ + float getRZAxisValue(); + + /** + * Get the dead zone for the RZ axis. + * + * @return The dead zone for the RZ axis + */ + float getRZAxisDeadZone(); + + /** + * Set the dead zone for the RZ axis + * + * @param zone The dead zone to use for the RZ axis + */ + void setRZAxisDeadZone(float zone); + + + /** Returns the number of rumblers this controller supports */ + int getRumblerCount(); + + /** Returns the name of the specified rumbler + * + * @param index The rumbler index + */ + String getRumblerName(int index); + + /** Sets the vibration strength of the specified rumbler + * + * @param index The index of the rumbler + * @param strength The strength to vibrate at + */ + void setRumblerStrength(int index, float strength); +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/input/ControllerEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/input/ControllerEvent.java new file mode 100644 index 000000000..04eccd517 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/input/ControllerEvent.java @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2002-2008 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.input; + +/** + * An event occuring on a controller. + * + * @author Kevin Glass + */ +class ControllerEvent { + /** Indicates the event was caused by a button */ + public static final int BUTTON = 1; + /** Indicates the event was caused by a axis */ + public static final int AXIS = 2; + /** Indicates the event was caused by a pov X */ + public static final int POVX = 3; + /** Indicates the event was caused by a pov Y */ + public static final int POVY = 4; + + /** The controller generating the event */ + private Controller source; + /** The index of the input (axis or button) that generated the event */ + private int index; + /** Type of control that generated the event */ + private int type; + /** True when a button is pressed, if this event was caused by the button */ + private boolean buttonState; + /** True if this event was caused by the x axis */ + private boolean xaxis; + /** True if this event was caused by the y axis */ + private boolean yaxis; + /** The time stamp of this event */ + private long timeStamp; + /** The value on a specified axis, if this event was caused by the x-axis */ + private float xaxisValue; + /** The value on a specified axis, if this event was caused by the y-axis */ + private float yaxisValue; + + /** + * Create a new event + * + * @param source The source of the event + * @param timeStamp The time stamp given for this event + * @param type The type of control generating this event + * @param index The index of the input that generated the event + * @param xaxis True if this event was caused by the x-axis + * @param yaxis True if this event was caused by the y-axis + */ + ControllerEvent(Controller source,long timeStamp, int type,int index,boolean xaxis,boolean yaxis) { + this(source, timeStamp, type, index, false, xaxis, yaxis, 0, 0); + } + + /** + * Create a new event + * + * @param source The source of the event + * @param timeStamp The time stamp given for this event + * @param type The type of control generating this event + * @param index The index of the input that generated the event + * @param buttonState True when a button is pressed, if this event was caused by the button + * @param xaxis True if this event was caused by the x-axis + * @param yaxis True if this event was caused by the y-axis + * @param xaxisValue The value on a specified axis, if this event was caused by the x-axis + * @param yaxisValue The value on a specified axis, if this event was caused by the y-axis + */ + ControllerEvent(Controller source,long timeStamp, int type,int index,boolean buttonState,boolean xaxis,boolean yaxis,float xaxisValue,float yaxisValue) { + this.source = source; + this.timeStamp = timeStamp; + this.type = type; + this.index = index; + this.buttonState = buttonState; + this.xaxis = xaxis; + this.yaxis = yaxis; + this.xaxisValue = xaxisValue; + this.yaxisValue = yaxisValue; + } + + /** + * Get the time stamp given for this event. As with nanoTime() + * this value means nothing other than giving ordering + * + * @return The time stamp given for this event + */ + public long getTimeStamp() { + return timeStamp; + } + + /** + * Get the controller that generated this event + * + * @return The controller that generated this event + */ + public Controller getSource() { + return source; + } + + /** + * Get the index of the control generating this event + * + * @return The index of the control generating this event + */ + public int getControlIndex() { + return index; + } + + /** + * Check if this event was generated by a button + * + * @return True if this event was generated by a button + */ + public boolean isButton() { + return type == BUTTON; + } + + /** + * Check the button is pressed or not, when this event was caused + * + * @return True when a button is pressed, if this event was caused by the button + */ + public boolean getButtonState() { + return buttonState; + } + + /** + * Check if this event was generated by a axis + * + * @return True if this event was generated by a axis + */ + public boolean isAxis() { + return type == AXIS; + } + + /** + * Check if this event was generated by a pov + * + * @return True if this event was generated by a pov + */ + public boolean isPovY() { + return type == POVY; + } + /** + * + * Check if this event was generated by a pov + * + * @return True if this event was generated by a pov + */ + public boolean isPovX() { + return type == POVX; + } + + /** + * Check if this event was caused by the X axis + * + * @return True if this event was caused by the X axis + */ + public boolean isXAxis() { + return xaxis; + } + + /** + * Check if this event was caused by the Y axis + * + * @return True if this event was caused by the Y axis + */ + public boolean isYAxis() { + return yaxis; + } + + /** + * Get the value on an X axis when this event was caused + * + * @return The value on a specified axis, if this event was caused by the x-axis + */ + public float getXAxisValue() { + return xaxisValue; + } + + /** + * Get the value on an Y axis when this event was caused + * + * @return The value on a specified axis, if this event was caused by the y-axis + */ + public float getYAxisValue() { + return yaxisValue; + } + + /* + * @see java.lang.Object#toString() + */ + public String toString() { + return "["+source+" type="+type+" xaxis="+xaxis+" yaxis="+yaxis+"]"; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/input/Controllers.java b/LWJGL-Boat/src/main/java/org/lwjgl/input/Controllers.java new file mode 100644 index 000000000..80a507a52 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/input/Controllers.java @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2002-2008 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.input; + +import net.java.games.input.ControllerEnvironment; + +import org.lwjgl.LWJGLException; + +import java.util.ArrayList; + +/** + * The collection of controllers currently connected. + * + * @author Kevin Glass + */ +public class Controllers { + /** The controllers available */ + private static ArrayList controllers = new ArrayList(); + /** The number of controllers */ + private static int controllerCount; + + /** The current list of events */ + private static ArrayList events = new ArrayList(); + /** The current event */ + private static ControllerEvent event; + + /** Whether controllers were created */ + private static boolean created; + + /** + * Initialise the controllers collection + * + * @throws LWJGLException Indicates a failure to initialise the controller library. + */ + public static void create() throws LWJGLException { + if (created) + return; + + try { + ControllerEnvironment env = ControllerEnvironment.getDefaultEnvironment(); + + net.java.games.input.Controller[] found = env.getControllers(); + ArrayList lollers = new ArrayList(); + for ( net.java.games.input.Controller c : found ) { + if ( (!c.getType().equals(net.java.games.input.Controller.Type.KEYBOARD)) && + (!c.getType().equals(net.java.games.input.Controller.Type.MOUSE)) ) { + lollers.add(c); + } + } + + for ( net.java.games.input.Controller c : lollers ) { + createController(c); + } + + created = true; + } catch (Throwable e) { + throw new LWJGLException("Failed to initialise controllers",e); + } + } + + /** + * Utility to create a controller based on its potential sub-controllers + * + * @param c The controller to add + */ + private static void createController(net.java.games.input.Controller c) { + net.java.games.input.Controller[] subControllers = c.getControllers(); + if (subControllers.length == 0) { + JInputController controller = new JInputController(controllerCount,c); + + controllers.add(controller); + controllerCount++; + } else { + for ( net.java.games.input.Controller sub : subControllers ) { + createController(sub); + } + } + } + + /** + * Get a controller from the collection + * + * @param index The index of the controller to retrieve + * @return The controller requested + */ + public static Controller getController(int index) { + return controllers.get(index); + } + + /** + * Retrieve a count of the number of controllers + * + * @return The number of controllers available + */ + public static int getControllerCount() { + return controllers.size(); + } + + /** + * Poll the controllers available. This will both update their state + * and generate events that must be cleared. + */ + public static void poll() { + for (int i=0;i>> 24); + byte blue = (byte) (argbColor >>> 16); + byte green = (byte) (argbColor >>> 8); + byte red = (byte) argbColor; + + pixels.put(red); + pixels.put(green); + pixels.put(blue); + pixels.put(alpha); + } + + pixels.flip(); + + return pixels; + } + + /** + * Gets the minimum size of a native cursor. Can only be called if The Mouse + * is created and cursor caps includes at least CURSOR_ONE_BIT_TRANSPARANCY. + * + * @return the minimum size of a native cursor + */ + public static int getMinCursorSize() { + return 1; + } + + /** + * Gets the maximum size of a native cursor. Can only be called if the + * cursor caps includes at least {@link #CURSOR_ONE_BIT_TRANSPARENCY}. + * + * @return the maximum size of a native cursor + */ + public static int getMaxCursorSize() { + return 512; + } + + /** + * Get the capabilities of the native cursor. Return a bit mask of the + * native cursor capabilities. + *
      + *
    • CURSOR_ONE_BIT_TRANSPARENCY indicates support for + * cursors with one bit transparency.
    • + * + *
    • CURSOR_8_BIT_ALPHA indicates support for 8 bit + * alpha.
    • + * + *
    • CURSOR_ANIMATION indicates support for cursor + * animations.
    • + *
    + * + * @return A bit mask with native cursor capabilities. + */ + public static int getCapabilities() { + return CURSOR_8_BIT_ALPHA | CURSOR_ANIMATION; + } + + /** + * Flips the images so they're oriented according to OpenGL + * + * @param width + * Width of image + * @param height + * Height of images + * @param numImages + * How many images to flip + * @param images + * Source images + * @param images_copy + * Destination images + */ + private static void flipImages(int width, int height, int numImages, IntBuffer images, IntBuffer images_copy) { + for (int i = 0; i < numImages; i++) { + int start_index = i * width * height; + flipImage(width, height, start_index, images, images_copy); + } + } + + /** + * @param width + * Width of image + * @param height + * Height of images + * @param start_index + * index into source buffer to copy to + * @param images + * Source images + * @param images_copy + * Destination images + */ + private static void flipImage(int width, int height, int start_index, IntBuffer images, IntBuffer images_copy) { + for (int y = 0; y < height >> 1; y++) { + int index_y_1 = y * width + start_index; + int index_y_2 = (height - y - 1) * width + start_index; + for (int x = 0; x < width; x++) { + int index1 = index_y_1 + x; + int index2 = index_y_2 + x; + int temp_pixel = images.get(index1 + images.position()); + images_copy.put(index1, images.get(index2 + images.position())); + images_copy.put(index2, temp_pixel); + } + } + } + + /** + * Gets the native handle associated with the cursor object. + */ + long getHandle() { + checkValid(); + return cursors[index].cursorHandle; + } + + /** + * Checks whether the cursor is still active and not yet destroyed. + */ + private void checkValid() { + if (destroyed) + throw new IllegalStateException("The cursor is already destroyed"); + } + + /** + * Destroy the current cursor. If the cursor is current, the current native + * cursor is set to null (the default OS cursor) + */ + public void destroy() { + for (CursorElement cursor : cursors) + GLFW.glfwDestroyCursor(cursor.cursorHandle); + + destroyed = true; + } + + /** + * Sets the timout property to the time it should be changed + */ + + protected void setTimeout() { + checkValid(); + cursors[index].timeout = GLFW.glfwGetTimerValue() + cursors[index].delay; + } + + /** + * Determines whether this cursor has timed out + * + * @return true if the this cursor has timed out, false if not + */ + + protected boolean hasTimedOut() { + checkValid(); + return cursors.length > 1 && cursors[index].timeout < GLFW.glfwGetTimerValue(); + } + + /** + * Changes to the next cursor + */ + protected void nextCursor() { + checkValid(); + index = ++index % cursors.length; + } + + /** + /* Returns wheteher the cursor image is empty or not + */ + + /*package-private*/ boolean isEmpty() { + return isEmpty; + } + + /** + * A single cursor element, used when animating + */ + private static class CursorElement { + + final long cursorHandle; + long delay; + long timeout; + + CursorElement(int xHotspot, int yHotspot, long delay, long timeout, GLFWImage image) { + this.delay = delay; + this.timeout = timeout; + + this.cursorHandle = GLFW.glfwCreateCursor(image, xHotspot, yHotspot); + if (cursorHandle == MemoryUtil.NULL) + throw new RuntimeException("Error creating GLFW cursor"); + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/input/EventQueue.java b/LWJGL-Boat/src/main/java/org/lwjgl/input/EventQueue.java new file mode 100644 index 000000000..72cc4a7d5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/input/EventQueue.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2002-2008 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.input; + +/** + * A java implementation of a LWJGL compatible event queue. + * @author elias_naur + */ + +import java.nio.ByteBuffer; + +class EventQueue { + private static final int QUEUE_SIZE = 200; + + private final int event_size; + + private final ByteBuffer queue; + + protected EventQueue(int event_size) { + this.event_size = event_size; + this.queue = ByteBuffer.allocate(QUEUE_SIZE*event_size); + } + + protected synchronized void clearEvents() { + queue.clear(); + } + + /** + * Copy available events into the specified buffer. + */ + public synchronized void copyEvents(ByteBuffer dest) { + queue.flip(); + int old_limit = queue.limit(); + if (dest.remaining() < queue.remaining()) + queue.limit(dest.remaining() + queue.position()); + dest.put(queue); + queue.limit(old_limit); + queue.compact(); + } + + /** + * Put an event into the queue. + * @return true if the event fitted into the queue, false otherwise + */ + public synchronized boolean putEvent(ByteBuffer event) { + if (event.remaining() != event_size) + throw new IllegalArgumentException("Internal error: event size " + event_size + " does not equal the given event size " + event.remaining()); + if (queue.remaining() >= event.remaining()) { + queue.put(event); + return true; + } else + return false; + } +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/input/GLFWInputImplementation.java b/LWJGL-Boat/src/main/java/org/lwjgl/input/GLFWInputImplementation.java new file mode 100644 index 000000000..6918a1a07 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/input/GLFWInputImplementation.java @@ -0,0 +1,183 @@ +package org.lwjgl.input; + +import org.lwjgl.LWJGLException; +import org.lwjgl.glfw.GLFW; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.InputImplementation; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public class GLFWInputImplementation implements InputImplementation { + + public static final GLFWInputImplementation singleton = new GLFWInputImplementation(); + private final ByteBuffer eventBuffer = ByteBuffer.allocate(Mouse.EVENT_SIZE); + private final EventQueue eventQueue = new EventQueue(Mouse.EVENT_SIZE); + private final EventQueue keyboardEventQueue = new EventQueue(Keyboard.EVENT_SIZE); + private final ByteBuffer keyboardEvent = ByteBuffer.allocate(Keyboard.EVENT_SIZE); + public final byte[] keyDownBuffer = new byte[Keyboard.KEYBOARD_SIZE]; + public final byte[] mouseBuffer = new byte[3]; + public int mouseX = 0; + public int mouseY = 0; + public int mouseLastX = 0; + public int mouseLastY = 0; + public boolean grab; + public boolean correctCursor; + + @Override + public boolean hasWheel() { + return true; + } + + @Override + public int getButtonCount() { + return 3; + } + + @Override + public void createMouse() throws LWJGLException { + + } + + @Override + public void destroyMouse() { + + } + + @Override + public void pollMouse(IntBuffer coord_buffer, ByteBuffer buttons) { + coord_buffer.put(0, grab ? mouseX - mouseLastX : mouseX); + coord_buffer.put(1, grab ? mouseY - mouseLastY : mouseY); + buttons.rewind(); + buttons.put(mouseBuffer); + mouseLastX = mouseX; + mouseLastY = mouseY; + } + + @Override + public void readMouse(ByteBuffer buffer) { + eventQueue.copyEvents(buffer); + } + + @Override + public void grabMouse(boolean newGrab) { + grab = newGrab; + correctCursor = newGrab; + GLFW.glfwSetInputMode(Display.getWindow(), GLFW.GLFW_CURSOR, grab ? GLFW.GLFW_CURSOR_DISABLED : GLFW.GLFW_CURSOR_NORMAL); + } + + @Override + public int getNativeCursorCapabilities() { + return 0; + } + + @Override + public void setCursorPosition(int x, int y) { + + } + + @Override + public void setNativeCursor(Object handle) throws LWJGLException { + + } + + @Override + public int getMinCursorSize() { + return 0; + } + + @Override + public int getMaxCursorSize() { + return 0; + } + + @Override + public void createKeyboard() throws LWJGLException { + + } + + @Override + public void destroyKeyboard() { + + } + + @Override + public void pollKeyboard(ByteBuffer keyDownBuffer) { + int oldPosition = keyDownBuffer.position(); + keyDownBuffer.put(this.keyDownBuffer); + keyDownBuffer.position(oldPosition); + } + + public void readKeyboard(ByteBuffer buffer) { + keyboardEventQueue.copyEvents(buffer); + } + + @Override + public Object createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { + return null; + } + + @Override + public void destroyCursor(Object cursor_handle) { + + } + + @Override + public int getWidth() { + return Display.getWidth(); + } + + @Override + public int getHeight() { + return Display.getHeight(); + } + + @Override + public boolean isInsideWindow() { + return true; + } + + public void putMouseEventWithCoords(byte button, byte state, int x, int y, int dz, long nanos) { + int rebaseX; + int rebaseY; + if (x == -1 && y == -1) { + rebaseX = mouseX; + rebaseY = mouseY; + } else { + rebaseX = x; + rebaseY = y; + if (correctCursor) { + mouseX = x; + mouseY = y; + mouseLastX = mouseX; + mouseLastY = mouseY; + correctCursor = false; + return; + } + } + eventBuffer.clear(); + eventBuffer.put(button).put(state); + if (grab) { + eventBuffer.putInt(rebaseX - mouseX).putInt(rebaseY - mouseY); + } else { + eventBuffer.putInt(rebaseX).putInt(rebaseY); + } + if (button != -1) { + mouseBuffer[button] = state; + } + eventBuffer.putInt(dz).putLong(nanos); + eventBuffer.flip(); + eventQueue.putEvent(eventBuffer); + mouseX = rebaseX; + mouseY = rebaseY; + } + + public void putKeyboardEvent(int keycode, byte state, int ch, long nanos, boolean repeat) { + keyDownBuffer[keycode] = state; + keyboardEvent.clear(); + keyboardEvent.putInt(keycode).put(state).putInt(ch).putLong(nanos).put(repeat ? (byte) 1 : (byte) 0); + keyboardEvent.flip(); + keyboardEventQueue.putEvent(keyboardEvent); + } +} + diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/input/InfdevMouse.java b/LWJGL-Boat/src/main/java/org/lwjgl/input/InfdevMouse.java new file mode 100644 index 000000000..5f9fb4732 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/input/InfdevMouse.java @@ -0,0 +1,26 @@ +package org.lwjgl.input; + +import net.java.openjdk.cacio.ctc.ExternalMouseReader; +import net.java.openjdk.cacio.ctc.InfdevGrabHandler; + +public class InfdevMouse implements ExternalMouseReader, Mouse.EmptyCursorGrabListener { + + static { + InfdevGrabHandler.setMouseReader(new InfdevMouse()); + } + + @Override + public int getX() { + return Mouse.getAbsoluteX(); + } + + @Override + public int getY() { + return Mouse.getAbsoluteY(); + } + + @Override + public void onGrab(boolean grabbing) { + InfdevGrabHandler.setGrabbed(grabbing); + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/input/JInputController.java b/LWJGL-Boat/src/main/java/org/lwjgl/input/JInputController.java new file mode 100644 index 000000000..a12c0476a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/input/JInputController.java @@ -0,0 +1,537 @@ +/* + * Copyright (c) 2002-2008 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.input; + +import net.java.games.input.Component; +import net.java.games.input.Component.Identifier.Axis; +import net.java.games.input.Component.Identifier.Button; +import net.java.games.input.Event; +import net.java.games.input.EventQueue; +import net.java.games.input.Rumbler; + +import java.util.ArrayList; + +/** + * A wrapper round a JInput controller that attempts to make the interface + * more useable. + * + * @author Kevin Glass + */ +class JInputController implements Controller { + /** The JInput controller this class is wrapping */ + private net.java.games.input.Controller target; + /** The index that has been assigned to this controller */ + private int index; + /** The Buttons that have been detected on the JInput controller */ + private ArrayList buttons = new ArrayList(); + /** The Axes that have been detected on the JInput controller */ + private ArrayList axes = new ArrayList(); + /** The POVs that have been detected on the JInput controller */ + private ArrayList pov = new ArrayList(); + /** The rumblers exposed by the controller */ + private Rumbler[] rumblers; + /** The state of the buttons last check */ + private boolean[] buttonState; + /** The values that were read from the pov last check */ + private float[] povValues; + /** The values that were read from the axes last check */ + private float[] axesValue; + /** The maximum values read for each axis */ + private float[] axesMax; + /** The dead zones for each axis */ + private float[] deadZones; + /** The index of the X axis or -1 if no X axis is defined */ + private int xaxis = -1; + /** The index of the Y axis or -1 if no Y axis is defined */ + private int yaxis = -1; + /** The index of the X axis or -1 if no Z axis is defined */ + private int zaxis = -1; + /** The index of the RX axis or -1 if no RX axis is defined */ + private int rxaxis = -1; + /** The index of the RY axis or -1 if no RY axis is defined */ + private int ryaxis = -1; + /** The index of the RZ axis or -1 if no RZ axis is defined */ + private int rzaxis = -1; + + /** + * Create a new controller that wraps round a JInput controller and hopefully + * makes it easier to use. + * + * @param index The index this controller has been assigned to + * @param target The target JInput controller this class is wrapping + */ + JInputController(int index, net.java.games.input.Controller target) { + this.target = target; + this.index = index; + + Component[] sourceAxes = target.getComponents(); + + for ( Component sourceAxis : sourceAxes ) { + if ( sourceAxis.getIdentifier() instanceof Button ) { + buttons.add(sourceAxis); + } else if ( sourceAxis.getIdentifier().equals(Axis.POV) ) { + pov.add(sourceAxis); + } else { + axes.add(sourceAxis); + } + } + + buttonState = new boolean[buttons.size()]; + povValues = new float[pov.size()]; + axesValue = new float[axes.size()]; + int buttonsCount = 0; + int axesCount = 0; + + // initialise the state + for ( Component sourceAxis : sourceAxes ) { + if ( sourceAxis.getIdentifier() instanceof Button ) { + buttonState[buttonsCount] = sourceAxis.getPollData() != 0; + buttonsCount++; + } else if ( sourceAxis.getIdentifier().equals(Axis.POV) ) { + // no account for POV yet + // pov.add(sourceAxes[i]); + } else { + axesValue[axesCount] = sourceAxis.getPollData(); + if ( sourceAxis.getIdentifier().equals(Axis.X) ) { + xaxis = axesCount; + } + if ( sourceAxis.getIdentifier().equals(Axis.Y) ) { + yaxis = axesCount; + } + if ( sourceAxis.getIdentifier().equals(Axis.Z) ) { + zaxis = axesCount; + } + if ( sourceAxis.getIdentifier().equals(Axis.RX) ) { + rxaxis = axesCount; + } + if ( sourceAxis.getIdentifier().equals(Axis.RY) ) { + ryaxis = axesCount; + } + if ( sourceAxis.getIdentifier().equals(Axis.RZ) ) { + rzaxis = axesCount; + } + + axesCount++; + } + } + + axesMax = new float[axes.size()]; + deadZones = new float[axes.size()]; + + for (int i=0;i axesMax[axisIndex]) { + axesMax[axisIndex] = Math.abs(value); + } + + // normalize the value based on maximum value read in the past + value /= axesMax[axisIndex]; + + if (axisIndex == xaxis) { + xaxisValue = value; + } + if (axisIndex == yaxis) { + yaxisValue = value; + } + + // fire event + Controllers.addEvent(new ControllerEvent(this,event.getNanos(),ControllerEvent.AXIS,axisIndex,false, + axisIndex == xaxis,axisIndex == yaxis,xaxisValue,yaxisValue)); + axesValue[axisIndex] = value; + } + } + } + + /* + * @see org.lwjgl.input.Controller#getAxisCount() + */ + public int getAxisCount() { + return axes.size(); + } + + /* + * @see org.lwjgl.input.Controller#getAxisName(int) + */ + public String getAxisName(int index) { + return axes.get(index).getName(); + } + + /* + * @see org.lwjgl.input.Controller#getAxisValue(int) + */ + public float getAxisValue(int index) { + return axesValue[index]; + } + + /* + * @see org.lwjgl.input.Controller#getXAxisValue() + */ + public float getXAxisValue() { + if (xaxis == -1) { + return 0; + } + + return getAxisValue(xaxis); + } + + /* + * @see org.lwjgl.input.Controller#getYAxisValue() + */ + public float getYAxisValue() { + if (yaxis == -1) { + return 0; + } + + return getAxisValue(yaxis); + } + + /* + * @see org.lwjgl.input.Controller#getXAxisDeadZone() + */ + public float getXAxisDeadZone() { + if (xaxis == -1) { + return 0; + } + + return getDeadZone(xaxis); + } + + /* + * @see org.lwjgl.input.Controller#getYAxisDeadZone() + */ + public float getYAxisDeadZone() { + if (yaxis == -1) { + return 0; + } + + return getDeadZone(yaxis); + } + + /* + * @see org.lwjgl.input.Controller#setXAxisDeadZone(float) + */ + public void setXAxisDeadZone(float zone) { + setDeadZone(xaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#setYAxisDeadZone(float) + */ + public void setYAxisDeadZone(float zone) { + setDeadZone(yaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#getDeadZone(int) + */ + public float getDeadZone(int index) { + return deadZones[index]; + } + + /* + * @see org.lwjgl.input.Controller#setDeadZone(int, float) + */ + public void setDeadZone(int index, float zone) { + deadZones[index] = zone; + } + + /* + * @see org.lwjgl.input.Controller#getZAxisValue() + */ + public float getZAxisValue() { + if (zaxis == -1) { + return 0; + } + + return getAxisValue(zaxis); + } + + /* + * @see org.lwjgl.input.Controller#getZAxisDeadZone() + */ + public float getZAxisDeadZone() { + if (zaxis == -1) { + return 0; + } + + return getDeadZone(zaxis); + } + + /* + * @see org.lwjgl.input.Controller#setZAxisDeadZone(float) + */ + public void setZAxisDeadZone(float zone) { + setDeadZone(zaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#getRXAxisValue() + */ + public float getRXAxisValue() { + if (rxaxis == -1) { + return 0; + } + + return getAxisValue(rxaxis); + } + + /* + * @see org.lwjgl.input.Controller#getRXAxisDeadZone() + */ + public float getRXAxisDeadZone() { + if (rxaxis == -1) { + return 0; + } + + return getDeadZone(rxaxis); + } + + /* + * @see org.lwjgl.input.Controller#setRXAxisDeadZone(float) + */ + public void setRXAxisDeadZone(float zone) { + setDeadZone(rxaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#getRYAxisValue() + */ + public float getRYAxisValue() { + if (ryaxis == -1) { + return 0; + } + + return getAxisValue(ryaxis); + } + + /* + * @see org.lwjgl.input.Controller#getRYAxisDeadZone() + */ + public float getRYAxisDeadZone() { + if (ryaxis == -1) { + return 0; + } + + return getDeadZone(ryaxis); + } + + /* + * @see org.lwjgl.input.Controller#setRYAxisDeadZone(float) + */ + public void setRYAxisDeadZone(float zone) { + setDeadZone(ryaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#getRZAxisValue() + */ + public float getRZAxisValue() { + if (rzaxis == -1) { + return 0; + } + + return getAxisValue(rzaxis); + } + + /* + * @see org.lwjgl.input.Controller#getRZAxisDeadZone() + */ + public float getRZAxisDeadZone() { + if (rzaxis == -1) { + return 0; + } + + return getDeadZone(rzaxis); + } + + /* + * @see org.lwjgl.input.Controller#setRZAxisDeadZone(float) + */ + public void setRZAxisDeadZone(float zone) { + setDeadZone(rzaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#getPovX() + */ + public float getPovX() { + if (pov.size() == 0) { + return 0; + } + + float value = povValues[0]; + + if ((value == Component.POV.DOWN_LEFT) || + (value == Component.POV.UP_LEFT) || + (value == Component.POV.LEFT)) { + return -1; + } + if ((value == Component.POV.DOWN_RIGHT) || + (value == Component.POV.UP_RIGHT) || + (value == Component.POV.RIGHT)) { + return 1; + } + + return 0; + } + + /* + * @see org.lwjgl.input.Controller#getPovY() + */ + public float getPovY() { + if (pov.size() == 0) { + return 0; + } + + float value = povValues[0]; + + if ((value == Component.POV.DOWN_LEFT) || + (value == Component.POV.DOWN_RIGHT) || + (value == Component.POV.DOWN)) { + return 1; + } + if ((value == Component.POV.UP_LEFT) || + (value == Component.POV.UP_RIGHT) || + (value == Component.POV.UP)) { + return -1; + } + + return 0; + } + + public int getRumblerCount() { + return rumblers.length; + } + + public String getRumblerName(int index) { + return rumblers[index].getAxisName(); + } + + public void setRumblerStrength(int index, float strength) { + rumblers[index].rumble(strength); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/input/KeyCodes.java b/LWJGL-Boat/src/main/java/org/lwjgl/input/KeyCodes.java new file mode 100644 index 000000000..b6cd8f976 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/input/KeyCodes.java @@ -0,0 +1,276 @@ +package org.lwjgl.input; + +import org.lwjgl.glfw.GLFW; + +public class KeyCodes { + + public static int toLwjglKey(int glfwKeyCode) { + + switch (glfwKeyCode) { + case GLFW.GLFW_KEY_ESCAPE : return Keyboard.KEY_ESCAPE; + case GLFW.GLFW_KEY_BACKSPACE : return Keyboard.KEY_BACK; + case GLFW.GLFW_KEY_TAB : return Keyboard.KEY_TAB; + case GLFW.GLFW_KEY_ENTER : return Keyboard.KEY_RETURN; + case GLFW.GLFW_KEY_SPACE : return Keyboard.KEY_SPACE; + + case GLFW.GLFW_KEY_LEFT_CONTROL : return Keyboard.KEY_LCONTROL; + case GLFW.GLFW_KEY_LEFT_SHIFT : return Keyboard.KEY_LSHIFT; + case GLFW.GLFW_KEY_LEFT_ALT : return Keyboard.KEY_LMENU; + case GLFW.GLFW_KEY_LEFT_SUPER : return Keyboard.KEY_LMETA; + + case GLFW.GLFW_KEY_RIGHT_CONTROL: return Keyboard.KEY_RCONTROL; + case GLFW.GLFW_KEY_RIGHT_SHIFT : return Keyboard.KEY_RSHIFT; + case GLFW.GLFW_KEY_RIGHT_ALT : return Keyboard.KEY_RMENU; + case GLFW.GLFW_KEY_RIGHT_SUPER : return Keyboard.KEY_RMETA; + + case GLFW.GLFW_KEY_1 : return Keyboard.KEY_1; + case GLFW.GLFW_KEY_2 : return Keyboard.KEY_2; + case GLFW.GLFW_KEY_3 : return Keyboard.KEY_3; + case GLFW.GLFW_KEY_4 : return Keyboard.KEY_4; + case GLFW.GLFW_KEY_5 : return Keyboard.KEY_5; + case GLFW.GLFW_KEY_6 : return Keyboard.KEY_6; + case GLFW.GLFW_KEY_7 : return Keyboard.KEY_7; + case GLFW.GLFW_KEY_8 : return Keyboard.KEY_8; + case GLFW.GLFW_KEY_9 : return Keyboard.KEY_9; + case GLFW.GLFW_KEY_0 : return Keyboard.KEY_0; + + case GLFW.GLFW_KEY_A : return Keyboard.KEY_A; + case GLFW.GLFW_KEY_B : return Keyboard.KEY_B; + case GLFW.GLFW_KEY_C : return Keyboard.KEY_C; + case GLFW.GLFW_KEY_D : return Keyboard.KEY_D; + case GLFW.GLFW_KEY_E : return Keyboard.KEY_E; + case GLFW.GLFW_KEY_F : return Keyboard.KEY_F; + case GLFW.GLFW_KEY_G : return Keyboard.KEY_G; + case GLFW.GLFW_KEY_H : return Keyboard.KEY_H; + case GLFW.GLFW_KEY_I : return Keyboard.KEY_I; + case GLFW.GLFW_KEY_J : return Keyboard.KEY_J; + case GLFW.GLFW_KEY_K : return Keyboard.KEY_K; + case GLFW.GLFW_KEY_L : return Keyboard.KEY_L; + case GLFW.GLFW_KEY_M : return Keyboard.KEY_M; + case GLFW.GLFW_KEY_N : return Keyboard.KEY_N; + case GLFW.GLFW_KEY_O : return Keyboard.KEY_O; + case GLFW.GLFW_KEY_P : return Keyboard.KEY_P; + case GLFW.GLFW_KEY_Q : return Keyboard.KEY_Q; + case GLFW.GLFW_KEY_R : return Keyboard.KEY_R; + case GLFW.GLFW_KEY_S : return Keyboard.KEY_S; + case GLFW.GLFW_KEY_T : return Keyboard.KEY_T; + case GLFW.GLFW_KEY_U : return Keyboard.KEY_U; + case GLFW.GLFW_KEY_V : return Keyboard.KEY_V; + case GLFW.GLFW_KEY_W : return Keyboard.KEY_W; + case GLFW.GLFW_KEY_X : return Keyboard.KEY_X; + case GLFW.GLFW_KEY_Y : return Keyboard.KEY_Y; + case GLFW.GLFW_KEY_Z : return Keyboard.KEY_Z; + + case GLFW.GLFW_KEY_UP : return Keyboard.KEY_UP; + case GLFW.GLFW_KEY_DOWN : return Keyboard.KEY_DOWN; + case GLFW.GLFW_KEY_LEFT : return Keyboard.KEY_LEFT; + case GLFW.GLFW_KEY_RIGHT : return Keyboard.KEY_RIGHT; + + case GLFW.GLFW_KEY_INSERT : return Keyboard.KEY_INSERT; + case GLFW.GLFW_KEY_DELETE : return Keyboard.KEY_DELETE; + case GLFW.GLFW_KEY_HOME : return Keyboard.KEY_HOME; + case GLFW.GLFW_KEY_END : return Keyboard.KEY_END; + case GLFW.GLFW_KEY_PAGE_UP : return Keyboard.KEY_PRIOR; + case GLFW.GLFW_KEY_PAGE_DOWN : return Keyboard.KEY_NEXT; + + case GLFW.GLFW_KEY_F1 : return Keyboard.KEY_F1; + case GLFW.GLFW_KEY_F2 : return Keyboard.KEY_F2; + case GLFW.GLFW_KEY_F3 : return Keyboard.KEY_F3; + case GLFW.GLFW_KEY_F4 : return Keyboard.KEY_F4; + case GLFW.GLFW_KEY_F5 : return Keyboard.KEY_F5; + case GLFW.GLFW_KEY_F6 : return Keyboard.KEY_F6; + case GLFW.GLFW_KEY_F7 : return Keyboard.KEY_F7; + case GLFW.GLFW_KEY_F8 : return Keyboard.KEY_F8; + case GLFW.GLFW_KEY_F9 : return Keyboard.KEY_F9; + case GLFW.GLFW_KEY_F10 : return Keyboard.KEY_F10; + case GLFW.GLFW_KEY_F11 : return Keyboard.KEY_F11; + case GLFW.GLFW_KEY_F12 : return Keyboard.KEY_F12; + case GLFW.GLFW_KEY_F13 : return Keyboard.KEY_F13; + case GLFW.GLFW_KEY_F14 : return Keyboard.KEY_F14; + case GLFW.GLFW_KEY_F15 : return Keyboard.KEY_F15; + case GLFW.GLFW_KEY_F16 : return Keyboard.KEY_F16; + case GLFW.GLFW_KEY_F17 : return Keyboard.KEY_F17; + case GLFW.GLFW_KEY_F18 : return Keyboard.KEY_F18; + case GLFW.GLFW_KEY_F19 : return Keyboard.KEY_F19; + + case GLFW.GLFW_KEY_KP_1 : return Keyboard.KEY_NUMPAD1; + case GLFW.GLFW_KEY_KP_2 : return Keyboard.KEY_NUMPAD2; + case GLFW.GLFW_KEY_KP_3 : return Keyboard.KEY_NUMPAD3; + case GLFW.GLFW_KEY_KP_4 : return Keyboard.KEY_NUMPAD4; + case GLFW.GLFW_KEY_KP_5 : return Keyboard.KEY_NUMPAD5; + case GLFW.GLFW_KEY_KP_6 : return Keyboard.KEY_NUMPAD6; + case GLFW.GLFW_KEY_KP_7 : return Keyboard.KEY_NUMPAD7; + case GLFW.GLFW_KEY_KP_8 : return Keyboard.KEY_NUMPAD8; + case GLFW.GLFW_KEY_KP_9 : return Keyboard.KEY_NUMPAD9; + case GLFW.GLFW_KEY_KP_0 : return Keyboard.KEY_NUMPAD0; + + case GLFW.GLFW_KEY_KP_ADD : return Keyboard.KEY_ADD; + case GLFW.GLFW_KEY_KP_SUBTRACT : return Keyboard.KEY_SUBTRACT; + case GLFW.GLFW_KEY_KP_MULTIPLY : return Keyboard.KEY_MULTIPLY; + case GLFW.GLFW_KEY_KP_DIVIDE : return Keyboard.KEY_DIVIDE; + case GLFW.GLFW_KEY_KP_DECIMAL : return Keyboard.KEY_DECIMAL; + case GLFW.GLFW_KEY_KP_EQUAL : return Keyboard.KEY_NUMPADEQUALS; + case GLFW.GLFW_KEY_KP_ENTER : return Keyboard.KEY_NUMPADENTER; + case GLFW.GLFW_KEY_NUM_LOCK : return Keyboard.KEY_NUMLOCK; + + case GLFW.GLFW_KEY_SEMICOLON : return Keyboard.KEY_SEMICOLON; + case GLFW.GLFW_KEY_BACKSLASH : return Keyboard.KEY_BACKSLASH; + case GLFW.GLFW_KEY_COMMA : return Keyboard.KEY_COMMA; + case GLFW.GLFW_KEY_PERIOD : return Keyboard.KEY_PERIOD; + case GLFW.GLFW_KEY_SLASH : return Keyboard.KEY_SLASH; + case GLFW.GLFW_KEY_GRAVE_ACCENT : return Keyboard.KEY_GRAVE; + + case GLFW.GLFW_KEY_CAPS_LOCK : return Keyboard.KEY_CAPITAL; + case GLFW.GLFW_KEY_SCROLL_LOCK : return Keyboard.KEY_SCROLL; + + case GLFW.GLFW_KEY_WORLD_1 : return Keyboard.KEY_CIRCUMFLEX; // TODO not sure if correct + case GLFW.GLFW_KEY_PAUSE : return Keyboard.KEY_PAUSE; + + case GLFW.GLFW_KEY_MINUS : return Keyboard.KEY_MINUS; + case GLFW.GLFW_KEY_EQUAL : return Keyboard.KEY_EQUALS; + case GLFW.GLFW_KEY_LEFT_BRACKET : return Keyboard.KEY_LBRACKET; + case GLFW.GLFW_KEY_RIGHT_BRACKET: return Keyboard.KEY_RBRACKET; + case GLFW.GLFW_KEY_APOSTROPHE : return Keyboard.KEY_APOSTROPHE; + default: + if (glfwKeyCode != -1) + System.out.println("UNKNOWN GLFW KEY CODE: " + glfwKeyCode); + return Keyboard.KEY_NONE; + } + } + + public static int toGlfwKey(int lwjglKeyCode) { + + switch (lwjglKeyCode) { + case Keyboard.KEY_ESCAPE : return GLFW.GLFW_KEY_ESCAPE; + case Keyboard.KEY_BACK : return GLFW.GLFW_KEY_BACKSPACE; + case Keyboard.KEY_TAB : return GLFW.GLFW_KEY_TAB; + case Keyboard.KEY_RETURN : return GLFW.GLFW_KEY_ENTER; + case Keyboard.KEY_SPACE : return GLFW.GLFW_KEY_SPACE; + + case Keyboard.KEY_LCONTROL : return GLFW.GLFW_KEY_LEFT_CONTROL; + case Keyboard.KEY_LSHIFT : return GLFW.GLFW_KEY_LEFT_SHIFT; + case Keyboard.KEY_LMENU : return GLFW.GLFW_KEY_LEFT_ALT; + case Keyboard.KEY_LMETA : return GLFW.GLFW_KEY_LEFT_SUPER; + + case Keyboard.KEY_RCONTROL : return GLFW.GLFW_KEY_RIGHT_CONTROL; + case Keyboard.KEY_RSHIFT : return GLFW.GLFW_KEY_RIGHT_SHIFT; + case Keyboard.KEY_RMENU : return GLFW.GLFW_KEY_RIGHT_ALT; + case Keyboard.KEY_RMETA : return GLFW.GLFW_KEY_RIGHT_SUPER; + + case Keyboard.KEY_1 : return GLFW.GLFW_KEY_1; + case Keyboard.KEY_2 : return GLFW.GLFW_KEY_2; + case Keyboard.KEY_3 : return GLFW.GLFW_KEY_3; + case Keyboard.KEY_4 : return GLFW.GLFW_KEY_4; + case Keyboard.KEY_5 : return GLFW.GLFW_KEY_5; + case Keyboard.KEY_6 : return GLFW.GLFW_KEY_6; + case Keyboard.KEY_7 : return GLFW.GLFW_KEY_7; + case Keyboard.KEY_8 : return GLFW.GLFW_KEY_8; + case Keyboard.KEY_9 : return GLFW.GLFW_KEY_9; + case Keyboard.KEY_0 : return GLFW.GLFW_KEY_0; + + case Keyboard.KEY_A : return GLFW.GLFW_KEY_A; + case Keyboard.KEY_B : return GLFW.GLFW_KEY_B; + case Keyboard.KEY_C : return GLFW.GLFW_KEY_C; + case Keyboard.KEY_D : return GLFW.GLFW_KEY_D; + case Keyboard.KEY_E : return GLFW.GLFW_KEY_E; + case Keyboard.KEY_F : return GLFW.GLFW_KEY_F; + case Keyboard.KEY_G : return GLFW.GLFW_KEY_G; + case Keyboard.KEY_H : return GLFW.GLFW_KEY_H; + case Keyboard.KEY_I : return GLFW.GLFW_KEY_I; + case Keyboard.KEY_J : return GLFW.GLFW_KEY_J; + case Keyboard.KEY_K : return GLFW.GLFW_KEY_K; + case Keyboard.KEY_L : return GLFW.GLFW_KEY_L; + case Keyboard.KEY_M : return GLFW.GLFW_KEY_M; + case Keyboard.KEY_N : return GLFW.GLFW_KEY_N; + case Keyboard.KEY_O : return GLFW.GLFW_KEY_O; + case Keyboard.KEY_P : return GLFW.GLFW_KEY_P; + case Keyboard.KEY_Q : return GLFW.GLFW_KEY_Q; + case Keyboard.KEY_R : return GLFW.GLFW_KEY_R; + case Keyboard.KEY_S : return GLFW.GLFW_KEY_S; + case Keyboard.KEY_T : return GLFW.GLFW_KEY_T; + case Keyboard.KEY_U : return GLFW.GLFW_KEY_U; + case Keyboard.KEY_V : return GLFW.GLFW_KEY_V; + case Keyboard.KEY_W : return GLFW.GLFW_KEY_W; + case Keyboard.KEY_X : return GLFW.GLFW_KEY_X; + case Keyboard.KEY_Y : return GLFW.GLFW_KEY_Y; + case Keyboard.KEY_Z : return GLFW.GLFW_KEY_Z; + + case Keyboard.KEY_UP : return GLFW.GLFW_KEY_UP; + case Keyboard.KEY_DOWN : return GLFW.GLFW_KEY_DOWN; + case Keyboard.KEY_LEFT : return GLFW.GLFW_KEY_LEFT; + case Keyboard.KEY_RIGHT : return GLFW.GLFW_KEY_RIGHT; + + case Keyboard.KEY_INSERT : return GLFW.GLFW_KEY_INSERT; + case Keyboard.KEY_DELETE : return GLFW.GLFW_KEY_DELETE; + case Keyboard.KEY_HOME : return GLFW.GLFW_KEY_HOME; + case Keyboard.KEY_END : return GLFW.GLFW_KEY_END; + case Keyboard.KEY_PRIOR : return GLFW.GLFW_KEY_PAGE_UP; + case Keyboard.KEY_NEXT : return GLFW.GLFW_KEY_PAGE_DOWN; + + case Keyboard.KEY_F1 : return GLFW.GLFW_KEY_F1; + case Keyboard.KEY_F2 : return GLFW.GLFW_KEY_F2; + case Keyboard.KEY_F3 : return GLFW.GLFW_KEY_F3; + case Keyboard.KEY_F4 : return GLFW.GLFW_KEY_F4; + case Keyboard.KEY_F5 : return GLFW.GLFW_KEY_F5; + case Keyboard.KEY_F6 : return GLFW.GLFW_KEY_F6; + case Keyboard.KEY_F7 : return GLFW.GLFW_KEY_F7; + case Keyboard.KEY_F8 : return GLFW.GLFW_KEY_F8; + case Keyboard.KEY_F9 : return GLFW.GLFW_KEY_F9; + case Keyboard.KEY_F10 : return GLFW.GLFW_KEY_F10; + case Keyboard.KEY_F11 : return GLFW.GLFW_KEY_F11; + case Keyboard.KEY_F12 : return GLFW.GLFW_KEY_F12; + case Keyboard.KEY_F13 : return GLFW.GLFW_KEY_F13; + case Keyboard.KEY_F14 : return GLFW.GLFW_KEY_F14; + case Keyboard.KEY_F15 : return GLFW.GLFW_KEY_F15; + case Keyboard.KEY_F16 : return GLFW.GLFW_KEY_F16; + case Keyboard.KEY_F17 : return GLFW.GLFW_KEY_F17; + case Keyboard.KEY_F18 : return GLFW.GLFW_KEY_F18; + case Keyboard.KEY_F19 : return GLFW.GLFW_KEY_F19; + + case Keyboard.KEY_NUMPAD1 : return GLFW.GLFW_KEY_KP_1; + case Keyboard.KEY_NUMPAD2 : return GLFW.GLFW_KEY_KP_2; + case Keyboard.KEY_NUMPAD3 : return GLFW.GLFW_KEY_KP_3; + case Keyboard.KEY_NUMPAD4 : return GLFW.GLFW_KEY_KP_4; + case Keyboard.KEY_NUMPAD5 : return GLFW.GLFW_KEY_KP_5; + case Keyboard.KEY_NUMPAD6 : return GLFW.GLFW_KEY_KP_6; + case Keyboard.KEY_NUMPAD7 : return GLFW.GLFW_KEY_KP_7; + case Keyboard.KEY_NUMPAD8 : return GLFW.GLFW_KEY_KP_8; + case Keyboard.KEY_NUMPAD9 : return GLFW.GLFW_KEY_KP_9; + case Keyboard.KEY_NUMPAD0 : return GLFW.GLFW_KEY_KP_0; + + case Keyboard.KEY_ADD : return GLFW.GLFW_KEY_KP_ADD; + case Keyboard.KEY_SUBTRACT : return GLFW.GLFW_KEY_KP_SUBTRACT; + case Keyboard.KEY_MULTIPLY : return GLFW.GLFW_KEY_KP_MULTIPLY; + case Keyboard.KEY_DIVIDE : return GLFW.GLFW_KEY_KP_DIVIDE; + case Keyboard.KEY_DECIMAL : return GLFW.GLFW_KEY_KP_DECIMAL; + case Keyboard.KEY_NUMPADEQUALS : return GLFW.GLFW_KEY_KP_EQUAL; + case Keyboard.KEY_NUMPADENTER : return GLFW.GLFW_KEY_KP_ENTER; + case Keyboard.KEY_NUMLOCK : return GLFW.GLFW_KEY_NUM_LOCK; + + case Keyboard.KEY_SEMICOLON : return GLFW.GLFW_KEY_SEMICOLON; + case Keyboard.KEY_BACKSLASH : return GLFW.GLFW_KEY_BACKSLASH; + case Keyboard.KEY_COMMA : return GLFW.GLFW_KEY_COMMA; + case Keyboard.KEY_PERIOD : return GLFW.GLFW_KEY_PERIOD; + case Keyboard.KEY_SLASH : return GLFW.GLFW_KEY_SLASH; + case Keyboard.KEY_GRAVE : return GLFW.GLFW_KEY_GRAVE_ACCENT; + + case Keyboard.KEY_CAPITAL : return GLFW.GLFW_KEY_CAPS_LOCK; + case Keyboard.KEY_SCROLL : return GLFW.GLFW_KEY_SCROLL_LOCK; + + case Keyboard.KEY_PAUSE : return GLFW.GLFW_KEY_PAUSE; + case Keyboard.KEY_CIRCUMFLEX : return GLFW.GLFW_KEY_WORLD_1; // TODO not sure if correct + + case Keyboard.KEY_MINUS : return GLFW.GLFW_KEY_MINUS; + case Keyboard.KEY_EQUALS : return GLFW.GLFW_KEY_EQUAL; + case Keyboard.KEY_LBRACKET : return GLFW.GLFW_KEY_LEFT_BRACKET; + case Keyboard.KEY_RBRACKET : return GLFW.GLFW_KEY_RIGHT_BRACKET; + case Keyboard.KEY_APOSTROPHE : return GLFW.GLFW_KEY_APOSTROPHE; + + default: + if (lwjglKeyCode != -1) + System.out.println("UNKNOWN LWJGL KEY CODE: " + lwjglKeyCode); + return GLFW.GLFW_KEY_UNKNOWN; + } + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/input/Keyboard.java b/LWJGL-Boat/src/main/java/org/lwjgl/input/Keyboard.java new file mode 100644 index 000000000..2835b9699 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/input/Keyboard.java @@ -0,0 +1,582 @@ +/* + * Copyright (c) 2002-2008 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.input; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.InputImplementation; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +/** + *
    + * A raw Keyboard interface. This can be used to poll the current state of the + * keys, or read all the keyboard presses / releases since the last read. + * + * @author cix_foo + * @author elias_naur + * @author Brian Matzon + * @version $Revision$ + * $Id$ + */ +public class Keyboard { + /** Internal use - event size in bytes */ + public static final int EVENT_SIZE = 4 + 1 + 4 + 8 + 1; + + /** + * The special character meaning that no + * character was translated for the event. + */ + public static final int CHAR_NONE = '\0'; + + /** + * The special keycode meaning that only the + * translated character is valid. + */ + public static final int KEY_NONE = 0x00; + + public static final int KEY_ESCAPE = 0x01; + public static final int KEY_1 = 0x02; + public static final int KEY_2 = 0x03; + public static final int KEY_3 = 0x04; + public static final int KEY_4 = 0x05; + public static final int KEY_5 = 0x06; + public static final int KEY_6 = 0x07; + public static final int KEY_7 = 0x08; + public static final int KEY_8 = 0x09; + public static final int KEY_9 = 0x0A; + public static final int KEY_0 = 0x0B; + public static final int KEY_MINUS = 0x0C; /* - on main keyboard */ + public static final int KEY_EQUALS = 0x0D; + public static final int KEY_BACK = 0x0E; /* backspace */ + public static final int KEY_TAB = 0x0F; + public static final int KEY_Q = 0x10; + public static final int KEY_W = 0x11; + public static final int KEY_E = 0x12; + public static final int KEY_R = 0x13; + public static final int KEY_T = 0x14; + public static final int KEY_Y = 0x15; + public static final int KEY_U = 0x16; + public static final int KEY_I = 0x17; + public static final int KEY_O = 0x18; + public static final int KEY_P = 0x19; + public static final int KEY_LBRACKET = 0x1A; + public static final int KEY_RBRACKET = 0x1B; + public static final int KEY_RETURN = 0x1C; /* Enter on main keyboard */ + public static final int KEY_LCONTROL = 0x1D; + public static final int KEY_A = 0x1E; + public static final int KEY_S = 0x1F; + public static final int KEY_D = 0x20; + public static final int KEY_F = 0x21; + public static final int KEY_G = 0x22; + public static final int KEY_H = 0x23; + public static final int KEY_J = 0x24; + public static final int KEY_K = 0x25; + public static final int KEY_L = 0x26; + public static final int KEY_SEMICOLON = 0x27; + public static final int KEY_APOSTROPHE = 0x28; + public static final int KEY_GRAVE = 0x29; /* accent grave */ + public static final int KEY_LSHIFT = 0x2A; + public static final int KEY_BACKSLASH = 0x2B; + public static final int KEY_Z = 0x2C; + public static final int KEY_X = 0x2D; + public static final int KEY_C = 0x2E; + public static final int KEY_V = 0x2F; + public static final int KEY_B = 0x30; + public static final int KEY_N = 0x31; + public static final int KEY_M = 0x32; + public static final int KEY_COMMA = 0x33; + public static final int KEY_PERIOD = 0x34; /* . on main keyboard */ + public static final int KEY_SLASH = 0x35; /* / on main keyboard */ + public static final int KEY_RSHIFT = 0x36; + public static final int KEY_MULTIPLY = 0x37; /* * on numeric keypad */ + public static final int KEY_LMENU = 0x38; /* left Alt */ + public static final int KEY_SPACE = 0x39; + public static final int KEY_CAPITAL = 0x3A; + public static final int KEY_F1 = 0x3B; + public static final int KEY_F2 = 0x3C; + public static final int KEY_F3 = 0x3D; + public static final int KEY_F4 = 0x3E; + public static final int KEY_F5 = 0x3F; + public static final int KEY_F6 = 0x40; + public static final int KEY_F7 = 0x41; + public static final int KEY_F8 = 0x42; + public static final int KEY_F9 = 0x43; + public static final int KEY_F10 = 0x44; + public static final int KEY_NUMLOCK = 0x45; + public static final int KEY_SCROLL = 0x46; /* Scroll Lock */ + public static final int KEY_NUMPAD7 = 0x47; + public static final int KEY_NUMPAD8 = 0x48; + public static final int KEY_NUMPAD9 = 0x49; + public static final int KEY_SUBTRACT = 0x4A; /* - on numeric keypad */ + public static final int KEY_NUMPAD4 = 0x4B; + public static final int KEY_NUMPAD5 = 0x4C; + public static final int KEY_NUMPAD6 = 0x4D; + public static final int KEY_ADD = 0x4E; /* + on numeric keypad */ + public static final int KEY_NUMPAD1 = 0x4F; + public static final int KEY_NUMPAD2 = 0x50; + public static final int KEY_NUMPAD3 = 0x51; + public static final int KEY_NUMPAD0 = 0x52; + public static final int KEY_DECIMAL = 0x53; /* . on numeric keypad */ + public static final int KEY_F11 = 0x57; + public static final int KEY_F12 = 0x58; + public static final int KEY_F13 = 0x64; /* (NEC PC98) */ + public static final int KEY_F14 = 0x65; /* (NEC PC98) */ + public static final int KEY_F15 = 0x66; /* (NEC PC98) */ + public static final int KEY_F16 = 0x67; /* Extended Function keys - (Mac) */ + public static final int KEY_F17 = 0x68; + public static final int KEY_F18 = 0x69; + public static final int KEY_KANA = 0x70; /* (Japanese keyboard) */ + public static final int KEY_F19 = 0x71; /* Extended Function keys - (Mac) */ + public static final int KEY_CONVERT = 0x79; /* (Japanese keyboard) */ + public static final int KEY_NOCONVERT = 0x7B; /* (Japanese keyboard) */ + public static final int KEY_YEN = 0x7D; /* (Japanese keyboard) */ + public static final int KEY_NUMPADEQUALS = 0x8D; /* = on numeric keypad (NEC PC98) */ + public static final int KEY_CIRCUMFLEX = 0x90; /* (Japanese keyboard) */ + public static final int KEY_AT = 0x91; /* (NEC PC98) */ + public static final int KEY_COLON = 0x92; /* (NEC PC98) */ + public static final int KEY_UNDERLINE = 0x93; /* (NEC PC98) */ + public static final int KEY_KANJI = 0x94; /* (Japanese keyboard) */ + public static final int KEY_STOP = 0x95; /* (NEC PC98) */ + public static final int KEY_AX = 0x96; /* (Japan AX) */ + public static final int KEY_UNLABELED = 0x97; /* (J3100) */ + public static final int KEY_NUMPADENTER = 0x9C; /* Enter on numeric keypad */ + public static final int KEY_RCONTROL = 0x9D; + public static final int KEY_SECTION = 0xA7; /* Section symbol (Mac) */ + public static final int KEY_NUMPADCOMMA = 0xB3; /* , on numeric keypad (NEC PC98) */ + public static final int KEY_DIVIDE = 0xB5; /* / on numeric keypad */ + public static final int KEY_SYSRQ = 0xB7; + public static final int KEY_RMENU = 0xB8; /* right Alt */ + public static final int KEY_FUNCTION = 0xC4; /* Function (Mac) */ + public static final int KEY_PAUSE = 0xC5; /* Pause */ + public static final int KEY_HOME = 0xC7; /* Home on arrow keypad */ + public static final int KEY_UP = 0xC8; /* UpArrow on arrow keypad */ + public static final int KEY_PRIOR = 0xC9; /* PgUp on arrow keypad */ + public static final int KEY_LEFT = 0xCB; /* LeftArrow on arrow keypad */ + public static final int KEY_RIGHT = 0xCD; /* RightArrow on arrow keypad */ + public static final int KEY_END = 0xCF; /* End on arrow keypad */ + public static final int KEY_DOWN = 0xD0; /* DownArrow on arrow keypad */ + public static final int KEY_NEXT = 0xD1; /* PgDn on arrow keypad */ + public static final int KEY_INSERT = 0xD2; /* Insert on arrow keypad */ + public static final int KEY_DELETE = 0xD3; /* Delete on arrow keypad */ + public static final int KEY_CLEAR = 0xDA; /* Clear key (Mac) */ + public static final int KEY_LMETA = 0xDB; /* Left Windows/Option key */ + /** + * The left windows key, mapped to KEY_LMETA + * + * @deprecated Use KEY_LMETA instead + */ + public static final int KEY_LWIN = KEY_LMETA; /* Left Windows key */ + public static final int KEY_RMETA = 0xDC; /* Right Windows/Option key */ + /** + * The right windows key, mapped to KEY_RMETA + * + * @deprecated Use KEY_RMETA instead + */ + public static final int KEY_RWIN = KEY_RMETA; /* Right Windows key */ + public static final int KEY_APPS = 0xDD; /* AppMenu key */ + public static final int KEY_POWER = 0xDE; + public static final int KEY_SLEEP = 0xDF; + + /* public static final int STATE_ON = 0; + public static final int STATE_OFF = 1; + public static final int STATE_UNKNOWN = 2; + */ + public static final int KEYBOARD_SIZE = 256; + + /** Buffer size in events */ + private static final int BUFFER_SIZE = 50; + + /** Key names */ + private static final String[] keyName = new String[KEYBOARD_SIZE]; + private static final Map keyMap = new HashMap(253); + private static int counter; + + static { + // Use reflection to find out key names + Field[] fields = Keyboard.class.getFields(); + try { + for ( Field field : fields ) { + if ( Modifier.isStatic(field.getModifiers()) + && Modifier.isPublic(field.getModifiers()) + && Modifier.isFinal(field.getModifiers()) + && field.getType().equals(int.class) + && field.getName().startsWith("KEY_") + && !field.getName().endsWith("WIN") ) { /* Don't use deprecated names */ + + int key = field.getInt(null); + String name = field.getName().substring(4); + keyName[key] = name; + keyMap.put(name, key); + counter++; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** The number of keys supported */ + private static final int keyCount = counter; + + /** Has the keyboard been created? */ + private static boolean created; + + /** Are repeat events enabled? */ + private static boolean repeat_enabled; + + /** The keys status from the last poll */ + private static final ByteBuffer keyDownBuffer = BufferUtils.createByteBuffer(KEYBOARD_SIZE); + + /** + * The key events from the last read: a sequence of pairs of key number, + * followed by state. The state is followed by + * a 4 byte code point representing the translated character. + */ + private static ByteBuffer readBuffer; + + /** current event */ + private static KeyEvent current_event = new KeyEvent(); + + /** scratch event */ + private static KeyEvent tmp_event = new KeyEvent(); + + /** One time initialization */ + private static boolean initialized; + + private static InputImplementation implementation; + + /** + * Keyboard cannot be constructed. + */ + private Keyboard() { + } + + /** + * Static initialization + */ + private static void initialize() { + if (initialized) + return; + Sys.initialize(); + initialized = true; + } + + /** + * "Create" the keyboard with the given implementation. This is used + * reflectively from AWTInputAdapter. + * + * @throws LWJGLException if the keyboard could not be created for any reason + */ + private static void create(InputImplementation impl) throws LWJGLException { + if (created) + return; + if (!initialized) + initialize(); + implementation = impl; + implementation.createKeyboard(); + created = true; + readBuffer = ByteBuffer.allocate(EVENT_SIZE*BUFFER_SIZE); + reset(); + } + + /** + * "Create" the keyboard. The display must first have been created. The + * reason for this is so the keyboard has a window to "focus" in. + * + * @throws LWJGLException if the keyboard could not be created for any reason + */ + public static void create() throws LWJGLException { + if (!Display.isCreated()) throw new IllegalStateException("Display must be created."); + + create((InputImplementation) GLFWInputImplementation.singleton); + } + + private static void reset() { + readBuffer.limit(0); + for (int i = 0; i < keyDownBuffer.remaining(); i++) + keyDownBuffer.put(i, (byte)0); + current_event.reset(); + } + + /** + * @return true if the keyboard has been created + */ + public static boolean isCreated() { + return created; + } + + /** + * "Destroy" the keyboard + */ + public static void destroy() { + if (!created) + return; + created = false; + implementation.destroyKeyboard(); + reset(); + } + + /** + * Polls the keyboard for its current state. Access the polled values using the + * isKeyDown method. + * By using this method, it is possible to "miss" keyboard keys if you don't + * poll fast enough. + * + * To use buffered values, you have to call next for each event you + * want to read. You can query which key caused the event by using + * getEventKey. To get the state of that key, for that event, use + * getEventKeyState - finally use getEventCharacter to get the + * character for that event. + * + * NOTE: This method does not query the operating system for new events. To do that, + * Display.processMessages() (or Display.update()) must be called first. + * + * @see Keyboard#isKeyDown(int key) + * @see Keyboard#next() + * @see Keyboard#getEventKey() + * @see Keyboard#getEventKeyState() + * @see Keyboard#getEventCharacter() + */ + public static void poll() { + if (!created) + throw new IllegalStateException("Keyboard must be created before you can poll the device"); + implementation.pollKeyboard(keyDownBuffer); + read(); + } + + private static void read() { + readBuffer.compact(); + implementation.readKeyboard(readBuffer); + readBuffer.flip(); + } + + /** + * Checks to see if a key is down. + * @param key Keycode to check + * @return true if the key is down according to the last poll() + */ + public static boolean isKeyDown(int key) { + if (!created) + throw new IllegalStateException("Keyboard must be created before you can query key state"); + if(key >= KEYBOARD_SIZE) return false; + return keyDownBuffer.get(key) != 0; + } + + /** + * Checks whether one of the state keys are "active" + * + * @param key State key to test (KEY_CAPITAL | KEY_NUMLOCK | KEY_SYSRQ) + * @return STATE_ON if on, STATE_OFF if off and STATE_UNKNOWN if the state is unknown + */ +/* public static int isStateKeySet(int key) { + if (!created) + throw new IllegalStateException("Keyboard must be created before you can query key state"); + return implementation.isStateKeySet(key); + } +*/ + /** + * Gets a key's name + * @param key The key + * @return a String with the key's human readable name in it or null if the key is unnamed + */ + public static synchronized String getKeyName(int key) { + return keyName[key]; + } + + /** + * Get's a key's index. If the key is unrecognised then KEY_NONE is returned. + * @param keyName The key name + */ + public static synchronized int getKeyIndex(String keyName) { + Integer ret = keyMap.get(keyName); + if (ret == null) + return KEY_NONE; + else + return ret; + } + + /** + * Gets the number of keyboard events waiting after doing a buffer enabled poll(). + * @return the number of keyboard events + */ + public static int getNumKeyboardEvents() { + if (!created) + throw new IllegalStateException("Keyboard must be created before you can read events"); + int old_position = readBuffer.position(); + int num_events = 0; + while (readNext(tmp_event) && (!tmp_event.repeat || repeat_enabled)) + num_events++; + readBuffer.position(old_position); + return num_events; + } + + /** + * Gets the next keyboard event. You can query which key caused the event by using + * getEventKey. To get the state of that key, for that event, use + * getEventKeyState - finally use getEventCharacter to get the + * character for that event. + * + * @see Keyboard#getEventKey() + * @see Keyboard#getEventKeyState() + * @see Keyboard#getEventCharacter() + * @return true if a keyboard event was read, false otherwise + */ + public static boolean next() { + if (!created) + throw new IllegalStateException("Keyboard must be created before you can read events"); + + boolean result; + while ((result = readNext(current_event)) && current_event.repeat && !repeat_enabled) + ; + return result; + } + + /** + * Controls whether repeat events are reported or not. If repeat events + * are enabled, key down events are reported when a key is pressed and held for + * a OS dependent amount of time. To distinguish a repeat event from a normal event, + * use isRepeatEvent(). + * + * @see Keyboard#getEventKey() + */ + public static void enableRepeatEvents(boolean enable) { + repeat_enabled = enable; + } + + /** + * Check whether repeat events are currently reported or not. + * + * @return true is repeat events are reported, false if not. + * @see Keyboard#getEventKey() + */ + public static boolean areRepeatEventsEnabled() { + return repeat_enabled; + } + + private static boolean readNext(KeyEvent event) { + if (readBuffer.hasRemaining()) { + event.key = readBuffer.getInt() & 0xFF; + event.state = readBuffer.get() != 0; + event.character = readBuffer.getInt(); + event.nanos = readBuffer.getLong(); + event.repeat = readBuffer.get() == 1; + return true; + } else + return false; + } + + /** + * @return Number of keys on this keyboard + */ + public static int getKeyCount() { + return keyCount; + } + + /** + * @return The character from the current event + */ + public static char getEventCharacter() { + return (char)current_event.character; + } + + /** + * Please note that the key code returned is NOT valid against the + * current keyboard layout. To get the actual character pressed call + * getEventCharacter + * + * @return The key from the current event + */ + public static int getEventKey() { + return current_event.key; + } + + /** + * Gets the state of the key that generated the + * current event + * + * @return True if key was down, or false if released + */ + public static boolean getEventKeyState() { + return current_event.state; + } + + /** + * Gets the time in nanoseconds of the current event. + * Only useful for relative comparisons with other + * Keyboard events, as the absolute time has no defined + * origin. + * @return The time in nanoseconds of the current event + */ + public static long getEventNanoseconds() { + return current_event.nanos; + } + + /** + * @see Keyboard#enableRepeatEvents(boolean) + * @return true if the current event is a repeat event, false if + * the current event is not a repeat even or if repeat events are disabled. + */ + public static boolean isRepeatEvent() { + return current_event.repeat; + } + + private static final class KeyEvent { + /** The current keyboard character being examined */ + private int character; + + /** The current keyboard event key being examined */ + private int key; + + /** The current state of the key being examined in the event queue */ + private boolean state; + + /** The current event time */ + private long nanos; + + /** Is the current event a repeated event? */ + private boolean repeat; + + private void reset() { + character = 0; + key = 0; + state = false; + repeat = false; + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/input/Mouse.java b/LWJGL-Boat/src/main/java/org/lwjgl/input/Mouse.java new file mode 100644 index 000000000..1383482d2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/input/Mouse.java @@ -0,0 +1,659 @@ +/* + * Copyright (c) 2002-2008 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.input; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.Sys; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.InputImplementation; + +import java.lang.reflect.Constructor; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.HashMap; +import java.util.Map; + + +/** + *
    + * A raw Mouse interface. This can be used to poll the current state of the + * mouse buttons, and determine the mouse movement delta since the last poll. + * + * n buttons supported, n being a native limit. A scrolly wheel is also + * supported, if one such is available. Movement is reported as delta from + * last position or as an absolute position. If the window has been created + * the absolute position will be clamped to 0 - width | height. + * + * @author cix_foo + * @author elias_naur + * @author Brian Matzon + * @version $Revision$ + * $Id$ + */ +public class Mouse { + /** Internal use - event size in bytes */ + public static final int EVENT_SIZE = 1 + 1 + 4 + 4 + 4 + 8; + + /** Has the mouse been created? */ + private static boolean created; + + /** The mouse buttons status from the last poll */ + private static ByteBuffer buttons; + + /** Mouse absolute X position in pixels */ + private static int x; + + /** Mouse absolute Y position in pixels */ + private static int y; + + /** Mouse absolute X position in pixels without any clipping */ + private static int absolute_x; + + /** Mouse absolute Y position in pixels without any clipping */ + private static int absolute_y; + + /** Buffer to hold the deltas dx, dy and dwheel */ + private static IntBuffer coord_buffer; + + /** Delta X */ + private static int dx; + + /** Delta Y */ + private static int dy; + + /** Delta Z */ + private static int dwheel; + + /** Number of buttons supported by the mouse */ + private static int buttonCount = -1; + + /** Does this mouse support a scroll wheel */ + private static boolean hasWheel; + + /** The current native cursor, if any */ + private static Cursor currentCursor; + + /** Button names. These are set upon create(), to names like BUTTON0, BUTTON1, etc. */ + private static String[] buttonName; + + /** hashmap of button names, for fast lookup */ + private static final Map buttonMap = new HashMap(16); + + /** Lazy initialization */ + private static boolean initialized; + + /** The mouse button events from the last read */ + private static ByteBuffer readBuffer; + + /** The current mouse event button being examined */ + private static int eventButton; + + /** The current state of the button being examined in the event queue */ + private static boolean eventState; + + /** The current delta of the mouse in the event queue */ + private static int event_dx; + private static int event_dy; + private static int event_dwheel; + /** The current absolute position of the mouse in the event queue */ + private static int event_x; + private static int event_y; + private static long event_nanos; + /** The position of the mouse it was grabbed at */ + private static int grab_x; + private static int grab_y; + /** The last absolute mouse event position (before clipping) for delta computation */ + private static int last_event_raw_x; + private static int last_event_raw_y; + + /** Buffer size in events */ + private static final int BUFFER_SIZE = 50; + + private static boolean isGrabbed; + + private static InputImplementation implementation; + private static EmptyCursorGrabListener grabListener = null; + + private static boolean clipMouseCoordinatesToWindow = !getPrivilegedBoolean("org.lwjgl.input.Mouse.allowNegativeMouseCoords"); + + static { + try { + Class infdevMouse = Class.forName("org.lwjgl.input.InfdevMouse"); + Constructor constructor = infdevMouse.getConstructor(); + grabListener = (EmptyCursorGrabListener) constructor.newInstance(); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + /** + * Mouse cannot be constructed. + */ + private Mouse() { + } + + /** + * Gets the currently bound native cursor, if any. + * + * @return the currently bound native cursor, if any. + */ + public static Cursor getNativeCursor() { + return currentCursor; + } + + /** + * Binds a native cursor. If the cursor argument is null, any + * currently bound native cursor is disabled, and the cursor reverts + * to the default operating system supplied cursor. + * + * NOTE: The native cursor is not constrained to the window, but + * relative events will not be generated if the cursor is outside. + * + * @param cursor the native cursor object to bind. May be null. + * @return The previous Cursor object set, or null. + * @throws LWJGLException if the cursor could not be set for any reason + */ + public static Cursor setNativeCursor(Cursor cursor) throws LWJGLException { + //dummy + if (cursor == null && currentCursor.isEmpty()) { + Mouse.setGrabbed(false); + if (grabListener != null) grabListener.onGrab(false); + } + if (cursor != null && cursor.isEmpty()) { + Mouse.setGrabbed(true); + if (grabListener != null) grabListener.onGrab(true); + } + currentCursor = cursor; + return currentCursor; + } + + public static boolean isClipMouseCoordinatesToWindow() { + return clipMouseCoordinatesToWindow; + } + + public static void setClipMouseCoordinatesToWindow(boolean clip) { + clipMouseCoordinatesToWindow = clip; + } + + /** + * Set the position of the cursor. If the cursor is not grabbed, + * the native cursor is moved to the new position. + * + * @param new_x The x coordinate of the new cursor position in OpenGL coordinates relative + * to the window origin. + * @param new_y The y coordinate of the new cursor position in OpenGL coordinates relative + * to the window origin. + */ + public static void setCursorPosition(int new_x, int new_y) { + //dummy + LWJGLUtil.log("setCursorPosition"); + } + + /** + * Static initialization + */ + private static void initialize() { + Sys.initialize(); + + // Assign names to all the buttons + buttonName = new String[16]; + for (int i = 0; i < 16; i++) { + buttonName[i] = "BUTTON" + i; + buttonMap.put(buttonName[i], i); + } + + initialized = true; + } + + private static void resetMouse() { + dx = dy = dwheel = 0; + readBuffer.position(readBuffer.limit()); + } + + static InputImplementation getImplementation() { + return implementation; + } + + /** + * "Create" the mouse with the given custom implementation. This is used + * reflectively by AWTInputAdapter. + * + * @throws LWJGLException if the mouse could not be created for any reason + */ + private static void create(InputImplementation impl) throws LWJGLException { + if (created) + return; + if (!initialized) + initialize(); + implementation = impl; + implementation.createMouse(); + hasWheel = implementation.hasWheel(); + created = true; + + // set mouse buttons + buttonCount = implementation.getButtonCount(); + buttons = BufferUtils.createByteBuffer(buttonCount); + coord_buffer = BufferUtils.createIntBuffer(3); + if (currentCursor != null && implementation.getNativeCursorCapabilities() != 0) + setNativeCursor(currentCursor); + readBuffer = ByteBuffer.allocate(EVENT_SIZE * BUFFER_SIZE); + readBuffer.limit(0); + setGrabbed(isGrabbed); + } + + /** + * "Create" the mouse. The display must first have been created. + * Initially, the mouse is not grabbed and the delta values are reported + * with respect to the center of the display. + * + * @throws LWJGLException if the mouse could not be created for any reason + */ + public static void create() throws LWJGLException { + if (!Display.isCreated()) throw new IllegalStateException("Display must be created."); + + create((InputImplementation) GLFWInputImplementation.singleton); + } + + /** + * @return true if the mouse has been created + */ + public static boolean isCreated() { + return created; + } + + /** + * "Destroy" the mouse. + */ + public static void destroy() { + if (!created) return; + created = false; + buttons = null; + coord_buffer = null; + + implementation.destroyMouse(); + } + + /** + * Polls the mouse for its current state. Access the polled values using the + * get methods. + * By using this method, it is possible to "miss" mouse click events if you don't + * poll fast enough. + * + * To use buffered values, you have to call next for each event you + * want to read. You can query which button caused the event by using + * getEventButton. To get the state of that button, for that event, use + * getEventButtonState. + * + * NOTE: This method does not query the operating system for new events. To do that, + * Display.processMessages() (or Display.update()) must be called first. + * + * @see Mouse#next() + * @see Mouse#getEventButton() + * @see Mouse#getEventButtonState() + * @see Mouse#isButtonDown(int button) + * @see Mouse#getX() + * @see Mouse#getY() + * @see Mouse#getDX() + * @see Mouse#getDY() + * @see Mouse#getDWheel() + */ + public static void poll() { + if (!created) throw new IllegalStateException("Mouse must be created before you can poll it"); + implementation.pollMouse(coord_buffer, buttons); + + /* If we're grabbed, poll returns mouse deltas, if not it returns absolute coordinates */ + int poll_coord1 = coord_buffer.get(0); + int poll_coord2 = coord_buffer.get(1); + /* The wheel is always relative */ + int poll_dwheel = coord_buffer.get(2); + + if (isGrabbed()) { + dx += poll_coord1; + dy += poll_coord2; + x += poll_coord1; + y += poll_coord2; + absolute_x += poll_coord1; + absolute_y += poll_coord2; + } else { + dx = poll_coord1 - absolute_x; + dy = poll_coord2 - absolute_y; + absolute_x = x = poll_coord1; + absolute_y = y = poll_coord2; + } + + if (clipMouseCoordinatesToWindow) { + x = Math.min(Display.getWidth() - 1, Math.max(0, x)); + y = Math.min(Display.getHeight() - 1, Math.max(0, y)); + } + + dwheel += poll_dwheel; + read(); + } + + private static void read() { + readBuffer.compact(); + implementation.readMouse(readBuffer); + readBuffer.flip(); + } + + /** + * See if a particular mouse button is down. + * + * @param button The index of the button you wish to test (0..getButtonCount-1) + * @return true if the specified button is down + */ + public static boolean isButtonDown(int button) { + if (!created) throw new IllegalStateException("Mouse must be created before you can poll the button state"); + if (button >= buttonCount || button < 0) + return false; + else + return buttons.get(button) == 1; + } + + /** + * Gets a button's name + * @param button The button + * @return a String with the button's human readable name in it or null if the button is unnamed + */ + public static String getButtonName(int button) { + if (button >= buttonName.length || button < 0) + return null; + else + return buttonName[button]; + } + + /** + * Get's a button's index. If the button is unrecognised then -1 is returned. + * @param buttonName The button name + */ + public static int getButtonIndex(String buttonName) { + Integer ret = buttonMap.get(buttonName); + if (ret == null) + return -1; + else + return ret; + } + + /** + * Gets the next mouse event. You can query which button caused the event by using + * getEventButton() (if any). To get the state of that key, for that event, use + * getEventButtonState. To get the current mouse delta values use getEventDX() + * and getEventDY(). + * @see Mouse#getEventButton() + * @see Mouse#getEventButtonState() + * @return true if a mouse event was read, false otherwise + */ + public static boolean next() { + if (!created) throw new IllegalStateException("Mouse must be created before you can read events"); + if (readBuffer.hasRemaining()) { + + eventButton = readBuffer.get(); + eventState = readBuffer.get() != 0; + if (isGrabbed()) { + event_dx = readBuffer.getInt(); + event_dy = readBuffer.getInt(); + event_x += event_dx; + event_y += event_dy; + last_event_raw_x = event_x; + last_event_raw_y = event_y; + } else { + int new_event_x = readBuffer.getInt(); + int new_event_y = readBuffer.getInt(); + event_dx = new_event_x - last_event_raw_x; + event_dy = new_event_y - last_event_raw_y; + event_x = new_event_x; + event_y = new_event_y; + last_event_raw_x = new_event_x; + last_event_raw_y = new_event_y; + } + if(clipMouseCoordinatesToWindow) { + event_x = Math.min(Display.getWidth() - 1, Math.max(0, event_x)); + event_y = Math.min(Display.getHeight() - 1, Math.max(0, event_y)); + } + event_dwheel = readBuffer.getInt(); + event_nanos = readBuffer.getLong(); + return true; + } else + return false; + } + + /** + * @return Current events button. Returns -1 if no button state was changed + */ + public static int getEventButton() { + return eventButton; + } + + /** + * Get the current events button state. + * @return Current events button state. + */ + public static boolean getEventButtonState() { + return eventState; + } + + /** + * @return Current events delta x. + */ + public static int getEventDX() { + return event_dx; + } + + /** + * @return Current events delta y. + */ + public static int getEventDY() { + return event_dy; + } + + /** + * @return Current events absolute x. + */ + public static int getEventX() { + return event_x; + } + + /** + * @return Current events absolute y. + */ + public static int getEventY() { + return event_y; + } + + /** + * @return Current events delta z + */ + public static int getEventDWheel() { + return event_dwheel; + } + + /** + * Gets the time in nanoseconds of the current event. + * Only useful for relative comparisons with other + * Mouse events, as the absolute time has no defined + * origin. + * + * @return The time in nanoseconds of the current event + */ + public static long getEventNanoseconds() { + return event_nanos; + } + + /** + * Retrieves the absolute position. It will be clamped to + * 0...width-1. + * + * @return Absolute x axis position of mouse + */ + public static int getX() { + return x; + } + + /** + * Retrieves the absolute position. It will be clamped to + * 0...height-1. + * + * @return Absolute y axis position of mouse + */ + public static int getY() { + return y; + } + + /** + * @return Movement on the x axis since last time getDX() was called. + */ + public static int getDX() { + int result = dx; + dx = 0; + return result; + } + + /** + * @return Movement on the y axis since last time getDY() was called. + */ + public static int getDY() { + int result = dy; + dy = 0; + return result; + } + + /** + * @return Movement of the wheel since last time getDWheel() was called + */ + public static int getDWheel() { + int result = dwheel; + dwheel = 0; + return result; + } + + /** + * @return Number of buttons on this mouse + */ + public static int getButtonCount() { + return buttonCount; + } + + /** + * @return Whether or not this mouse has wheel support + */ + public static boolean hasWheel() { + return hasWheel; + } + + /** + * @return whether or not the mouse has grabbed the cursor + */ + public static boolean isGrabbed() { + return isGrabbed; + } + + /** + * Sets whether or not the mouse has grabbed the cursor + * (and thus hidden). If grab is false, the getX() and getY() + * will return delta movement in pixels clamped to the display + * dimensions, from the center of the display. + * + * @param grab whether the mouse should be grabbed + */ + public static void setGrabbed(boolean grab) { + boolean grabbed = isGrabbed; + isGrabbed = grab; + if (isCreated()) { + if (grab && !grabbed) { + // store location mouse was grabbed + grab_x = x; + grab_y = y; + } + else if (!grab && grabbed) { + // move mouse back to location it was grabbed before ungrabbing + if ((Cursor.getCapabilities() & Cursor.CURSOR_ONE_BIT_TRANSPARENCY) != 0) + implementation.setCursorPosition(grab_x, grab_y); + } + + implementation.grabMouse(grab); + // Get latest values from native side + poll(); + event_x = x; + event_y = y; + last_event_raw_x = x; + last_event_raw_y = y; + resetMouse(); + } + } + + /** + * Updates the cursor, so that animation can be changed if needed. + * This method is called automatically by the window on its update, and + * shouldn't be called otherwise + */ + public static void updateCursor() { + //dummy + } + + /** Gets a boolean property as a privileged action. */ + static boolean getPrivilegedBoolean(final String property_name) { + Boolean value = AccessController.doPrivileged(new PrivilegedAction() { + public Boolean run() { + return Boolean.getBoolean(property_name); + } + }); + return value; + } + + /** + * Retrieves whether or not the mouse cursor is within the bounds of the window. + * If the mouse cursor was moved outside the display during a drag, then the result of calling + * this method will be true until the button is released. + * @return true if mouse is inside display, false otherwise. + */ + public static boolean isInsideWindow() { + return implementation.isInsideWindow(); + } + + /* + * Package private methods to get the absolute unclipped X/Y coordiates + */ + /*package-private*/ static int getAbsoluteX() { + return absolute_x; + } + /*package-private*/ static int getAbsoluteY() { + return absolute_y; + } + + interface EmptyCursorGrabListener { + void onGrab(boolean grabbing); + } +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDnodeTheme.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDnodeTheme.java new file mode 100644 index 000000000..f344774df --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDnodeTheme.java @@ -0,0 +1,428 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Describes the theme used to draw nodes. + * + *

    Layout

    + * + *
    
    + * struct BNDnodeTheme {
    + *     {@link NVGColor NVGcolor} {@link #nodeSelectedColor};
    + *     {@link NVGColor NVGcolor} {@link #wiresColor};
    + *     {@link NVGColor NVGcolor} {@link #textSelectedColor};
    + *     {@link NVGColor NVGcolor} {@link #activeNodeColor};
    + *     {@link NVGColor NVGcolor} {@link #wireSelectColor};
    + *     {@link NVGColor NVGcolor} {@link #nodeBackdropColor};
    + *     int {@link #noodleCurving};
    + * }
    + */ +public class BNDnodeTheme extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NODESELECTEDCOLOR, + WIRESCOLOR, + TEXTSELECTEDCOLOR, + ACTIVENODECOLOR, + WIRESELECTCOLOR, + NODEBACKDROPCOLOR, + NOODLECURVING; + + static { + Layout layout = __struct( + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NODESELECTEDCOLOR = layout.offsetof(0); + WIRESCOLOR = layout.offsetof(1); + TEXTSELECTEDCOLOR = layout.offsetof(2); + ACTIVENODECOLOR = layout.offsetof(3); + WIRESELECTCOLOR = layout.offsetof(4); + NODEBACKDROPCOLOR = layout.offsetof(5); + NOODLECURVING = layout.offsetof(6); + } + + protected BNDnodeTheme(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected BNDnodeTheme create(long address, @Nullable ByteBuffer container) { + return new BNDnodeTheme(address, container); + } + + /** + * Creates a {@code BNDnodeTheme} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public BNDnodeTheme(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** inner color of selected node (and downarrow) */ + @NativeType("NVGcolor") + public NVGColor nodeSelectedColor() { return nnodeSelectedColor(address()); } + /** outline of wires */ + @NativeType("NVGcolor") + public NVGColor wiresColor() { return nwiresColor(address()); } + /** color of text label when active */ + @NativeType("NVGcolor") + public NVGColor textSelectedColor() { return ntextSelectedColor(address()); } + /** inner color of active node (and dragged wire) */ + @NativeType("NVGcolor") + public NVGColor activeNodeColor() { return nactiveNodeColor(address()); } + /** color of selected wire */ + @NativeType("NVGcolor") + public NVGColor wireSelectColor() { return nwireSelectColor(address()); } + /** color of background of node */ + @NativeType("NVGcolor") + public NVGColor nodeBackdropColor() { return nnodeBackdropColor(address()); } + /** how much a noodle curves (0 to 10) */ + public int noodleCurving() { return nnoodleCurving(address()); } + + /** Copies the specified {@link NVGColor} to the {@link #nodeSelectedColor} field. */ + public BNDnodeTheme nodeSelectedColor(@NativeType("NVGcolor") NVGColor value) { nnodeSelectedColor(address(), value); return this; } + /** Passes the {@link #nodeSelectedColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDnodeTheme nodeSelectedColor(java.util.function.Consumer consumer) { consumer.accept(nodeSelectedColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link #wiresColor} field. */ + public BNDnodeTheme wiresColor(@NativeType("NVGcolor") NVGColor value) { nwiresColor(address(), value); return this; } + /** Passes the {@link #wiresColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDnodeTheme wiresColor(java.util.function.Consumer consumer) { consumer.accept(wiresColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link #textSelectedColor} field. */ + public BNDnodeTheme textSelectedColor(@NativeType("NVGcolor") NVGColor value) { ntextSelectedColor(address(), value); return this; } + /** Passes the {@link #textSelectedColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDnodeTheme textSelectedColor(java.util.function.Consumer consumer) { consumer.accept(textSelectedColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link #activeNodeColor} field. */ + public BNDnodeTheme activeNodeColor(@NativeType("NVGcolor") NVGColor value) { nactiveNodeColor(address(), value); return this; } + /** Passes the {@link #activeNodeColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDnodeTheme activeNodeColor(java.util.function.Consumer consumer) { consumer.accept(activeNodeColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link #wireSelectColor} field. */ + public BNDnodeTheme wireSelectColor(@NativeType("NVGcolor") NVGColor value) { nwireSelectColor(address(), value); return this; } + /** Passes the {@link #wireSelectColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDnodeTheme wireSelectColor(java.util.function.Consumer consumer) { consumer.accept(wireSelectColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link #nodeBackdropColor} field. */ + public BNDnodeTheme nodeBackdropColor(@NativeType("NVGcolor") NVGColor value) { nnodeBackdropColor(address(), value); return this; } + /** Passes the {@link #nodeBackdropColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDnodeTheme nodeBackdropColor(java.util.function.Consumer consumer) { consumer.accept(nodeBackdropColor()); return this; } + /** Sets the specified value to the {@link #noodleCurving} field. */ + public BNDnodeTheme noodleCurving(int value) { nnoodleCurving(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public BNDnodeTheme set( + NVGColor nodeSelectedColor, + NVGColor wiresColor, + NVGColor textSelectedColor, + NVGColor activeNodeColor, + NVGColor wireSelectColor, + NVGColor nodeBackdropColor, + int noodleCurving + ) { + nodeSelectedColor(nodeSelectedColor); + wiresColor(wiresColor); + textSelectedColor(textSelectedColor); + activeNodeColor(activeNodeColor); + wireSelectColor(wireSelectColor); + nodeBackdropColor(nodeBackdropColor); + noodleCurving(noodleCurving); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public BNDnodeTheme set(BNDnodeTheme src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code BNDnodeTheme} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static BNDnodeTheme malloc() { + return new BNDnodeTheme(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code BNDnodeTheme} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static BNDnodeTheme calloc() { + return new BNDnodeTheme(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code BNDnodeTheme} instance allocated with {@link BufferUtils}. */ + public static BNDnodeTheme create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new BNDnodeTheme(memAddress(container), container); + } + + /** Returns a new {@code BNDnodeTheme} instance for the specified memory address. */ + public static BNDnodeTheme create(long address) { + return new BNDnodeTheme(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static BNDnodeTheme createSafe(long address) { + return address == NULL ? null : new BNDnodeTheme(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static BNDnodeTheme mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static BNDnodeTheme callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static BNDnodeTheme mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static BNDnodeTheme callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code BNDnodeTheme} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static BNDnodeTheme malloc(MemoryStack stack) { + return new BNDnodeTheme(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code BNDnodeTheme} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static BNDnodeTheme calloc(MemoryStack stack) { + return new BNDnodeTheme(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #nodeSelectedColor}. */ + public static NVGColor nnodeSelectedColor(long struct) { return NVGColor.create(struct + BNDnodeTheme.NODESELECTEDCOLOR); } + /** Unsafe version of {@link #wiresColor}. */ + public static NVGColor nwiresColor(long struct) { return NVGColor.create(struct + BNDnodeTheme.WIRESCOLOR); } + /** Unsafe version of {@link #textSelectedColor}. */ + public static NVGColor ntextSelectedColor(long struct) { return NVGColor.create(struct + BNDnodeTheme.TEXTSELECTEDCOLOR); } + /** Unsafe version of {@link #activeNodeColor}. */ + public static NVGColor nactiveNodeColor(long struct) { return NVGColor.create(struct + BNDnodeTheme.ACTIVENODECOLOR); } + /** Unsafe version of {@link #wireSelectColor}. */ + public static NVGColor nwireSelectColor(long struct) { return NVGColor.create(struct + BNDnodeTheme.WIRESELECTCOLOR); } + /** Unsafe version of {@link #nodeBackdropColor}. */ + public static NVGColor nnodeBackdropColor(long struct) { return NVGColor.create(struct + BNDnodeTheme.NODEBACKDROPCOLOR); } + /** Unsafe version of {@link #noodleCurving}. */ + public static int nnoodleCurving(long struct) { return UNSAFE.getInt(null, struct + BNDnodeTheme.NOODLECURVING); } + + /** Unsafe version of {@link #nodeSelectedColor(NVGColor) nodeSelectedColor}. */ + public static void nnodeSelectedColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDnodeTheme.NODESELECTEDCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #wiresColor(NVGColor) wiresColor}. */ + public static void nwiresColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDnodeTheme.WIRESCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #textSelectedColor(NVGColor) textSelectedColor}. */ + public static void ntextSelectedColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDnodeTheme.TEXTSELECTEDCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #activeNodeColor(NVGColor) activeNodeColor}. */ + public static void nactiveNodeColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDnodeTheme.ACTIVENODECOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #wireSelectColor(NVGColor) wireSelectColor}. */ + public static void nwireSelectColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDnodeTheme.WIRESELECTCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #nodeBackdropColor(NVGColor) nodeBackdropColor}. */ + public static void nnodeBackdropColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDnodeTheme.NODEBACKDROPCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #noodleCurving(int) noodleCurving}. */ + public static void nnoodleCurving(long struct, int value) { UNSAFE.putInt(null, struct + BNDnodeTheme.NOODLECURVING, value); } + + // ----------------------------------- + + /** An array of {@link BNDnodeTheme} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final BNDnodeTheme ELEMENT_FACTORY = BNDnodeTheme.create(-1L); + + /** + * Creates a new {@code BNDnodeTheme.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link BNDnodeTheme#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected BNDnodeTheme getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link NVGColor} view of the {@link BNDnodeTheme#nodeSelectedColor} field. */ + @NativeType("NVGcolor") + public NVGColor nodeSelectedColor() { return BNDnodeTheme.nnodeSelectedColor(address()); } + /** @return a {@link NVGColor} view of the {@link BNDnodeTheme#wiresColor} field. */ + @NativeType("NVGcolor") + public NVGColor wiresColor() { return BNDnodeTheme.nwiresColor(address()); } + /** @return a {@link NVGColor} view of the {@link BNDnodeTheme#textSelectedColor} field. */ + @NativeType("NVGcolor") + public NVGColor textSelectedColor() { return BNDnodeTheme.ntextSelectedColor(address()); } + /** @return a {@link NVGColor} view of the {@link BNDnodeTheme#activeNodeColor} field. */ + @NativeType("NVGcolor") + public NVGColor activeNodeColor() { return BNDnodeTheme.nactiveNodeColor(address()); } + /** @return a {@link NVGColor} view of the {@link BNDnodeTheme#wireSelectColor} field. */ + @NativeType("NVGcolor") + public NVGColor wireSelectColor() { return BNDnodeTheme.nwireSelectColor(address()); } + /** @return a {@link NVGColor} view of the {@link BNDnodeTheme#nodeBackdropColor} field. */ + @NativeType("NVGcolor") + public NVGColor nodeBackdropColor() { return BNDnodeTheme.nnodeBackdropColor(address()); } + /** @return the value of the {@link BNDnodeTheme#noodleCurving} field. */ + public int noodleCurving() { return BNDnodeTheme.nnoodleCurving(address()); } + + /** Copies the specified {@link NVGColor} to the {@link BNDnodeTheme#nodeSelectedColor} field. */ + public Buffer nodeSelectedColor(@NativeType("NVGcolor") NVGColor value) { BNDnodeTheme.nnodeSelectedColor(address(), value); return this; } + /** Passes the {@link BNDnodeTheme#nodeSelectedColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer nodeSelectedColor(java.util.function.Consumer consumer) { consumer.accept(nodeSelectedColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link BNDnodeTheme#wiresColor} field. */ + public Buffer wiresColor(@NativeType("NVGcolor") NVGColor value) { BNDnodeTheme.nwiresColor(address(), value); return this; } + /** Passes the {@link BNDnodeTheme#wiresColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer wiresColor(java.util.function.Consumer consumer) { consumer.accept(wiresColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link BNDnodeTheme#textSelectedColor} field. */ + public Buffer textSelectedColor(@NativeType("NVGcolor") NVGColor value) { BNDnodeTheme.ntextSelectedColor(address(), value); return this; } + /** Passes the {@link BNDnodeTheme#textSelectedColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer textSelectedColor(java.util.function.Consumer consumer) { consumer.accept(textSelectedColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link BNDnodeTheme#activeNodeColor} field. */ + public Buffer activeNodeColor(@NativeType("NVGcolor") NVGColor value) { BNDnodeTheme.nactiveNodeColor(address(), value); return this; } + /** Passes the {@link BNDnodeTheme#activeNodeColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer activeNodeColor(java.util.function.Consumer consumer) { consumer.accept(activeNodeColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link BNDnodeTheme#wireSelectColor} field. */ + public Buffer wireSelectColor(@NativeType("NVGcolor") NVGColor value) { BNDnodeTheme.nwireSelectColor(address(), value); return this; } + /** Passes the {@link BNDnodeTheme#wireSelectColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer wireSelectColor(java.util.function.Consumer consumer) { consumer.accept(wireSelectColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link BNDnodeTheme#nodeBackdropColor} field. */ + public Buffer nodeBackdropColor(@NativeType("NVGcolor") NVGColor value) { BNDnodeTheme.nnodeBackdropColor(address(), value); return this; } + /** Passes the {@link BNDnodeTheme#nodeBackdropColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer nodeBackdropColor(java.util.function.Consumer consumer) { consumer.accept(nodeBackdropColor()); return this; } + /** Sets the specified value to the {@link BNDnodeTheme#noodleCurving} field. */ + public Buffer noodleCurving(int value) { BNDnodeTheme.nnoodleCurving(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDtheme.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDtheme.java new file mode 100644 index 000000000..7f53cc38a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDtheme.java @@ -0,0 +1,576 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Describes the theme used to draw widgets. + * + *

    Layout

    + * + *
    
    + * struct BNDtheme {
    + *     {@link NVGColor NVGcolor} {@link #backgroundColor};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #regularTheme};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #toolTheme};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #radioTheme};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #textFieldTheme};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #optionTheme};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #choiceTheme};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #numberFieldTheme};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #sliderTheme};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #scrollBarTheme};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #tooltipTheme};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #menuTheme};
    + *     {@link BNDwidgetTheme BNDwidgetTheme} {@link #menuItemTheme};
    + *     {@link BNDnodeTheme BNDnodeTheme} {@link #nodeTheme};
    + * }
    + */ +public class BNDtheme extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + BACKGROUNDCOLOR, + REGULARTHEME, + TOOLTHEME, + RADIOTHEME, + TEXTFIELDTHEME, + OPTIONTHEME, + CHOICETHEME, + NUMBERFIELDTHEME, + SLIDERTHEME, + SCROLLBARTHEME, + TOOLTIPTHEME, + MENUTHEME, + MENUITEMTHEME, + NODETHEME; + + static { + Layout layout = __struct( + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDwidgetTheme.SIZEOF, BNDwidgetTheme.ALIGNOF), + __member(BNDnodeTheme.SIZEOF, BNDnodeTheme.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + BACKGROUNDCOLOR = layout.offsetof(0); + REGULARTHEME = layout.offsetof(1); + TOOLTHEME = layout.offsetof(2); + RADIOTHEME = layout.offsetof(3); + TEXTFIELDTHEME = layout.offsetof(4); + OPTIONTHEME = layout.offsetof(5); + CHOICETHEME = layout.offsetof(6); + NUMBERFIELDTHEME = layout.offsetof(7); + SLIDERTHEME = layout.offsetof(8); + SCROLLBARTHEME = layout.offsetof(9); + TOOLTIPTHEME = layout.offsetof(10); + MENUTHEME = layout.offsetof(11); + MENUITEMTHEME = layout.offsetof(12); + NODETHEME = layout.offsetof(13); + } + + protected BNDtheme(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected BNDtheme create(long address, @Nullable ByteBuffer container) { + return new BNDtheme(address, container); + } + + /** + * Creates a {@code BNDtheme} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public BNDtheme(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the background color of panels and windows */ + @NativeType("NVGcolor") + public NVGColor backgroundColor() { return nbackgroundColor(address()); } + /** theme for labels */ + public BNDwidgetTheme regularTheme() { return nregularTheme(address()); } + /** theme for tool buttons */ + public BNDwidgetTheme toolTheme() { return ntoolTheme(address()); } + /** theme for radio buttons */ + public BNDwidgetTheme radioTheme() { return nradioTheme(address()); } + /** theme for text fields */ + public BNDwidgetTheme textFieldTheme() { return ntextFieldTheme(address()); } + /** theme for option buttons (checkboxes) */ + public BNDwidgetTheme optionTheme() { return noptionTheme(address()); } + /** theme for choice buttons (comboboxes) Blender calls them "menu buttons" */ + public BNDwidgetTheme choiceTheme() { return nchoiceTheme(address()); } + /** theme for number fields */ + public BNDwidgetTheme numberFieldTheme() { return nnumberFieldTheme(address()); } + /** theme for slider controls */ + public BNDwidgetTheme sliderTheme() { return nsliderTheme(address()); } + /** theme for scrollbars */ + public BNDwidgetTheme scrollBarTheme() { return nscrollBarTheme(address()); } + /** theme for tooltips */ + public BNDwidgetTheme tooltipTheme() { return ntooltipTheme(address()); } + /** theme for menu backgrounds */ + public BNDwidgetTheme menuTheme() { return nmenuTheme(address()); } + /** theme for menu items */ + public BNDwidgetTheme menuItemTheme() { return nmenuItemTheme(address()); } + /** theme for nodes */ + public BNDnodeTheme nodeTheme() { return nnodeTheme(address()); } + + /** Copies the specified {@link NVGColor} to the {@link #backgroundColor} field. */ + public BNDtheme backgroundColor(@NativeType("NVGcolor") NVGColor value) { nbackgroundColor(address(), value); return this; } + /** Passes the {@link #backgroundColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme backgroundColor(java.util.function.Consumer consumer) { consumer.accept(backgroundColor()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #regularTheme} field. */ + public BNDtheme regularTheme(BNDwidgetTheme value) { nregularTheme(address(), value); return this; } + /** Passes the {@link #regularTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme regularTheme(java.util.function.Consumer consumer) { consumer.accept(regularTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #toolTheme} field. */ + public BNDtheme toolTheme(BNDwidgetTheme value) { ntoolTheme(address(), value); return this; } + /** Passes the {@link #toolTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme toolTheme(java.util.function.Consumer consumer) { consumer.accept(toolTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #radioTheme} field. */ + public BNDtheme radioTheme(BNDwidgetTheme value) { nradioTheme(address(), value); return this; } + /** Passes the {@link #radioTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme radioTheme(java.util.function.Consumer consumer) { consumer.accept(radioTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #textFieldTheme} field. */ + public BNDtheme textFieldTheme(BNDwidgetTheme value) { ntextFieldTheme(address(), value); return this; } + /** Passes the {@link #textFieldTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme textFieldTheme(java.util.function.Consumer consumer) { consumer.accept(textFieldTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #optionTheme} field. */ + public BNDtheme optionTheme(BNDwidgetTheme value) { noptionTheme(address(), value); return this; } + /** Passes the {@link #optionTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme optionTheme(java.util.function.Consumer consumer) { consumer.accept(optionTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #choiceTheme} field. */ + public BNDtheme choiceTheme(BNDwidgetTheme value) { nchoiceTheme(address(), value); return this; } + /** Passes the {@link #choiceTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme choiceTheme(java.util.function.Consumer consumer) { consumer.accept(choiceTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #numberFieldTheme} field. */ + public BNDtheme numberFieldTheme(BNDwidgetTheme value) { nnumberFieldTheme(address(), value); return this; } + /** Passes the {@link #numberFieldTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme numberFieldTheme(java.util.function.Consumer consumer) { consumer.accept(numberFieldTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #sliderTheme} field. */ + public BNDtheme sliderTheme(BNDwidgetTheme value) { nsliderTheme(address(), value); return this; } + /** Passes the {@link #sliderTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme sliderTheme(java.util.function.Consumer consumer) { consumer.accept(sliderTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #scrollBarTheme} field. */ + public BNDtheme scrollBarTheme(BNDwidgetTheme value) { nscrollBarTheme(address(), value); return this; } + /** Passes the {@link #scrollBarTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme scrollBarTheme(java.util.function.Consumer consumer) { consumer.accept(scrollBarTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #tooltipTheme} field. */ + public BNDtheme tooltipTheme(BNDwidgetTheme value) { ntooltipTheme(address(), value); return this; } + /** Passes the {@link #tooltipTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme tooltipTheme(java.util.function.Consumer consumer) { consumer.accept(tooltipTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #menuTheme} field. */ + public BNDtheme menuTheme(BNDwidgetTheme value) { nmenuTheme(address(), value); return this; } + /** Passes the {@link #menuTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme menuTheme(java.util.function.Consumer consumer) { consumer.accept(menuTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link #menuItemTheme} field. */ + public BNDtheme menuItemTheme(BNDwidgetTheme value) { nmenuItemTheme(address(), value); return this; } + /** Passes the {@link #menuItemTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme menuItemTheme(java.util.function.Consumer consumer) { consumer.accept(menuItemTheme()); return this; } + /** Copies the specified {@link BNDnodeTheme} to the {@link #nodeTheme} field. */ + public BNDtheme nodeTheme(BNDnodeTheme value) { nnodeTheme(address(), value); return this; } + /** Passes the {@link #nodeTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDtheme nodeTheme(java.util.function.Consumer consumer) { consumer.accept(nodeTheme()); return this; } + + /** Initializes this struct with the specified values. */ + public BNDtheme set( + NVGColor backgroundColor, + BNDwidgetTheme regularTheme, + BNDwidgetTheme toolTheme, + BNDwidgetTheme radioTheme, + BNDwidgetTheme textFieldTheme, + BNDwidgetTheme optionTheme, + BNDwidgetTheme choiceTheme, + BNDwidgetTheme numberFieldTheme, + BNDwidgetTheme sliderTheme, + BNDwidgetTheme scrollBarTheme, + BNDwidgetTheme tooltipTheme, + BNDwidgetTheme menuTheme, + BNDwidgetTheme menuItemTheme, + BNDnodeTheme nodeTheme + ) { + backgroundColor(backgroundColor); + regularTheme(regularTheme); + toolTheme(toolTheme); + radioTheme(radioTheme); + textFieldTheme(textFieldTheme); + optionTheme(optionTheme); + choiceTheme(choiceTheme); + numberFieldTheme(numberFieldTheme); + sliderTheme(sliderTheme); + scrollBarTheme(scrollBarTheme); + tooltipTheme(tooltipTheme); + menuTheme(menuTheme); + menuItemTheme(menuItemTheme); + nodeTheme(nodeTheme); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public BNDtheme set(BNDtheme src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code BNDtheme} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static BNDtheme malloc() { + return new BNDtheme(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code BNDtheme} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static BNDtheme calloc() { + return new BNDtheme(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code BNDtheme} instance allocated with {@link BufferUtils}. */ + public static BNDtheme create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new BNDtheme(memAddress(container), container); + } + + /** Returns a new {@code BNDtheme} instance for the specified memory address. */ + public static BNDtheme create(long address) { + return new BNDtheme(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static BNDtheme createSafe(long address) { + return address == NULL ? null : new BNDtheme(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static BNDtheme mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static BNDtheme callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static BNDtheme mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static BNDtheme callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code BNDtheme} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static BNDtheme malloc(MemoryStack stack) { + return new BNDtheme(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code BNDtheme} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static BNDtheme calloc(MemoryStack stack) { + return new BNDtheme(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #backgroundColor}. */ + public static NVGColor nbackgroundColor(long struct) { return NVGColor.create(struct + BNDtheme.BACKGROUNDCOLOR); } + /** Unsafe version of {@link #regularTheme}. */ + public static BNDwidgetTheme nregularTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.REGULARTHEME); } + /** Unsafe version of {@link #toolTheme}. */ + public static BNDwidgetTheme ntoolTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.TOOLTHEME); } + /** Unsafe version of {@link #radioTheme}. */ + public static BNDwidgetTheme nradioTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.RADIOTHEME); } + /** Unsafe version of {@link #textFieldTheme}. */ + public static BNDwidgetTheme ntextFieldTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.TEXTFIELDTHEME); } + /** Unsafe version of {@link #optionTheme}. */ + public static BNDwidgetTheme noptionTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.OPTIONTHEME); } + /** Unsafe version of {@link #choiceTheme}. */ + public static BNDwidgetTheme nchoiceTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.CHOICETHEME); } + /** Unsafe version of {@link #numberFieldTheme}. */ + public static BNDwidgetTheme nnumberFieldTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.NUMBERFIELDTHEME); } + /** Unsafe version of {@link #sliderTheme}. */ + public static BNDwidgetTheme nsliderTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.SLIDERTHEME); } + /** Unsafe version of {@link #scrollBarTheme}. */ + public static BNDwidgetTheme nscrollBarTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.SCROLLBARTHEME); } + /** Unsafe version of {@link #tooltipTheme}. */ + public static BNDwidgetTheme ntooltipTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.TOOLTIPTHEME); } + /** Unsafe version of {@link #menuTheme}. */ + public static BNDwidgetTheme nmenuTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.MENUTHEME); } + /** Unsafe version of {@link #menuItemTheme}. */ + public static BNDwidgetTheme nmenuItemTheme(long struct) { return BNDwidgetTheme.create(struct + BNDtheme.MENUITEMTHEME); } + /** Unsafe version of {@link #nodeTheme}. */ + public static BNDnodeTheme nnodeTheme(long struct) { return BNDnodeTheme.create(struct + BNDtheme.NODETHEME); } + + /** Unsafe version of {@link #backgroundColor(NVGColor) backgroundColor}. */ + public static void nbackgroundColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDtheme.BACKGROUNDCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #regularTheme(BNDwidgetTheme) regularTheme}. */ + public static void nregularTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.REGULARTHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #toolTheme(BNDwidgetTheme) toolTheme}. */ + public static void ntoolTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.TOOLTHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #radioTheme(BNDwidgetTheme) radioTheme}. */ + public static void nradioTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.RADIOTHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #textFieldTheme(BNDwidgetTheme) textFieldTheme}. */ + public static void ntextFieldTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.TEXTFIELDTHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #optionTheme(BNDwidgetTheme) optionTheme}. */ + public static void noptionTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.OPTIONTHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #choiceTheme(BNDwidgetTheme) choiceTheme}. */ + public static void nchoiceTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.CHOICETHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #numberFieldTheme(BNDwidgetTheme) numberFieldTheme}. */ + public static void nnumberFieldTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.NUMBERFIELDTHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #sliderTheme(BNDwidgetTheme) sliderTheme}. */ + public static void nsliderTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.SLIDERTHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #scrollBarTheme(BNDwidgetTheme) scrollBarTheme}. */ + public static void nscrollBarTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.SCROLLBARTHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #tooltipTheme(BNDwidgetTheme) tooltipTheme}. */ + public static void ntooltipTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.TOOLTIPTHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #menuTheme(BNDwidgetTheme) menuTheme}. */ + public static void nmenuTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.MENUTHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #menuItemTheme(BNDwidgetTheme) menuItemTheme}. */ + public static void nmenuItemTheme(long struct, BNDwidgetTheme value) { memCopy(value.address(), struct + BNDtheme.MENUITEMTHEME, BNDwidgetTheme.SIZEOF); } + /** Unsafe version of {@link #nodeTheme(BNDnodeTheme) nodeTheme}. */ + public static void nnodeTheme(long struct, BNDnodeTheme value) { memCopy(value.address(), struct + BNDtheme.NODETHEME, BNDnodeTheme.SIZEOF); } + + // ----------------------------------- + + /** An array of {@link BNDtheme} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final BNDtheme ELEMENT_FACTORY = BNDtheme.create(-1L); + + /** + * Creates a new {@code BNDtheme.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link BNDtheme#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected BNDtheme getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link NVGColor} view of the {@link BNDtheme#backgroundColor} field. */ + @NativeType("NVGcolor") + public NVGColor backgroundColor() { return BNDtheme.nbackgroundColor(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#regularTheme} field. */ + public BNDwidgetTheme regularTheme() { return BNDtheme.nregularTheme(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#toolTheme} field. */ + public BNDwidgetTheme toolTheme() { return BNDtheme.ntoolTheme(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#radioTheme} field. */ + public BNDwidgetTheme radioTheme() { return BNDtheme.nradioTheme(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#textFieldTheme} field. */ + public BNDwidgetTheme textFieldTheme() { return BNDtheme.ntextFieldTheme(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#optionTheme} field. */ + public BNDwidgetTheme optionTheme() { return BNDtheme.noptionTheme(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#choiceTheme} field. */ + public BNDwidgetTheme choiceTheme() { return BNDtheme.nchoiceTheme(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#numberFieldTheme} field. */ + public BNDwidgetTheme numberFieldTheme() { return BNDtheme.nnumberFieldTheme(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#sliderTheme} field. */ + public BNDwidgetTheme sliderTheme() { return BNDtheme.nsliderTheme(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#scrollBarTheme} field. */ + public BNDwidgetTheme scrollBarTheme() { return BNDtheme.nscrollBarTheme(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#tooltipTheme} field. */ + public BNDwidgetTheme tooltipTheme() { return BNDtheme.ntooltipTheme(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#menuTheme} field. */ + public BNDwidgetTheme menuTheme() { return BNDtheme.nmenuTheme(address()); } + /** @return a {@link BNDwidgetTheme} view of the {@link BNDtheme#menuItemTheme} field. */ + public BNDwidgetTheme menuItemTheme() { return BNDtheme.nmenuItemTheme(address()); } + /** @return a {@link BNDnodeTheme} view of the {@link BNDtheme#nodeTheme} field. */ + public BNDnodeTheme nodeTheme() { return BNDtheme.nnodeTheme(address()); } + + /** Copies the specified {@link NVGColor} to the {@link BNDtheme#backgroundColor} field. */ + public Buffer backgroundColor(@NativeType("NVGcolor") NVGColor value) { BNDtheme.nbackgroundColor(address(), value); return this; } + /** Passes the {@link BNDtheme#backgroundColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer backgroundColor(java.util.function.Consumer consumer) { consumer.accept(backgroundColor()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#regularTheme} field. */ + public Buffer regularTheme(BNDwidgetTheme value) { BNDtheme.nregularTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#regularTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer regularTheme(java.util.function.Consumer consumer) { consumer.accept(regularTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#toolTheme} field. */ + public Buffer toolTheme(BNDwidgetTheme value) { BNDtheme.ntoolTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#toolTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer toolTheme(java.util.function.Consumer consumer) { consumer.accept(toolTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#radioTheme} field. */ + public Buffer radioTheme(BNDwidgetTheme value) { BNDtheme.nradioTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#radioTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer radioTheme(java.util.function.Consumer consumer) { consumer.accept(radioTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#textFieldTheme} field. */ + public Buffer textFieldTheme(BNDwidgetTheme value) { BNDtheme.ntextFieldTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#textFieldTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer textFieldTheme(java.util.function.Consumer consumer) { consumer.accept(textFieldTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#optionTheme} field. */ + public Buffer optionTheme(BNDwidgetTheme value) { BNDtheme.noptionTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#optionTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer optionTheme(java.util.function.Consumer consumer) { consumer.accept(optionTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#choiceTheme} field. */ + public Buffer choiceTheme(BNDwidgetTheme value) { BNDtheme.nchoiceTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#choiceTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer choiceTheme(java.util.function.Consumer consumer) { consumer.accept(choiceTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#numberFieldTheme} field. */ + public Buffer numberFieldTheme(BNDwidgetTheme value) { BNDtheme.nnumberFieldTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#numberFieldTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer numberFieldTheme(java.util.function.Consumer consumer) { consumer.accept(numberFieldTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#sliderTheme} field. */ + public Buffer sliderTheme(BNDwidgetTheme value) { BNDtheme.nsliderTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#sliderTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer sliderTheme(java.util.function.Consumer consumer) { consumer.accept(sliderTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#scrollBarTheme} field. */ + public Buffer scrollBarTheme(BNDwidgetTheme value) { BNDtheme.nscrollBarTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#scrollBarTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer scrollBarTheme(java.util.function.Consumer consumer) { consumer.accept(scrollBarTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#tooltipTheme} field. */ + public Buffer tooltipTheme(BNDwidgetTheme value) { BNDtheme.ntooltipTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#tooltipTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer tooltipTheme(java.util.function.Consumer consumer) { consumer.accept(tooltipTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#menuTheme} field. */ + public Buffer menuTheme(BNDwidgetTheme value) { BNDtheme.nmenuTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#menuTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer menuTheme(java.util.function.Consumer consumer) { consumer.accept(menuTheme()); return this; } + /** Copies the specified {@link BNDwidgetTheme} to the {@link BNDtheme#menuItemTheme} field. */ + public Buffer menuItemTheme(BNDwidgetTheme value) { BNDtheme.nmenuItemTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#menuItemTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer menuItemTheme(java.util.function.Consumer consumer) { consumer.accept(menuItemTheme()); return this; } + /** Copies the specified {@link BNDnodeTheme} to the {@link BNDtheme#nodeTheme} field. */ + public Buffer nodeTheme(BNDnodeTheme value) { BNDtheme.nnodeTheme(address(), value); return this; } + /** Passes the {@link BNDtheme#nodeTheme} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer nodeTheme(java.util.function.Consumer consumer) { consumer.accept(nodeTheme()); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDwidgetTheme.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDwidgetTheme.java new file mode 100644 index 000000000..f96e63b49 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/BNDwidgetTheme.java @@ -0,0 +1,447 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Describes the theme used to draw a single widget or widget box; these values correspond to the same values that can be retrieved from the Theme panel + * in the Blender preferences. + * + *

    Layout

    + * + *
    
    + * struct BNDwidgetTheme {
    + *     {@link NVGColor NVGcolor} {@link #outlineColor};
    + *     {@link NVGColor NVGcolor} {@link #itemColor};
    + *     {@link NVGColor NVGcolor} {@link #innerColor};
    + *     {@link NVGColor NVGcolor} {@link #innerSelectedColor};
    + *     {@link NVGColor NVGcolor} {@link #textColor};
    + *     {@link NVGColor NVGcolor} {@link #textSelectedColor};
    + *     int {@link #shadeTop};
    + *     int {@link #shadeDown};
    + * }
    + */ +public class BNDwidgetTheme extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + OUTLINECOLOR, + ITEMCOLOR, + INNERCOLOR, + INNERSELECTEDCOLOR, + TEXTCOLOR, + TEXTSELECTEDCOLOR, + SHADETOP, + SHADEDOWN; + + static { + Layout layout = __struct( + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + OUTLINECOLOR = layout.offsetof(0); + ITEMCOLOR = layout.offsetof(1); + INNERCOLOR = layout.offsetof(2); + INNERSELECTEDCOLOR = layout.offsetof(3); + TEXTCOLOR = layout.offsetof(4); + TEXTSELECTEDCOLOR = layout.offsetof(5); + SHADETOP = layout.offsetof(6); + SHADEDOWN = layout.offsetof(7); + } + + protected BNDwidgetTheme(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected BNDwidgetTheme create(long address, @Nullable ByteBuffer container) { + return new BNDwidgetTheme(address, container); + } + + /** + * Creates a {@code BNDwidgetTheme} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public BNDwidgetTheme(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** color of widget box outline */ + @NativeType("NVGcolor") + public NVGColor outlineColor() { return noutlineColor(address()); } + /** color of widget item (meaning changes depending on class) */ + @NativeType("NVGcolor") + public NVGColor itemColor() { return nitemColor(address()); } + /** fill color of widget box */ + @NativeType("NVGcolor") + public NVGColor innerColor() { return ninnerColor(address()); } + /** fill color of widget box when active */ + @NativeType("NVGcolor") + public NVGColor innerSelectedColor() { return ninnerSelectedColor(address()); } + /** color of text label */ + @NativeType("NVGcolor") + public NVGColor textColor() { return ntextColor(address()); } + /** color of text label when active */ + @NativeType("NVGcolor") + public NVGColor textSelectedColor() { return ntextSelectedColor(address()); } + /** delta modifier for upper part of gradient (-100 to 100) */ + public int shadeTop() { return nshadeTop(address()); } + /** delta modifier for lower part of gradient (-100 to 100) */ + public int shadeDown() { return nshadeDown(address()); } + + /** Copies the specified {@link NVGColor} to the {@link #outlineColor} field. */ + public BNDwidgetTheme outlineColor(@NativeType("NVGcolor") NVGColor value) { noutlineColor(address(), value); return this; } + /** Passes the {@link #outlineColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDwidgetTheme outlineColor(java.util.function.Consumer consumer) { consumer.accept(outlineColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link #itemColor} field. */ + public BNDwidgetTheme itemColor(@NativeType("NVGcolor") NVGColor value) { nitemColor(address(), value); return this; } + /** Passes the {@link #itemColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDwidgetTheme itemColor(java.util.function.Consumer consumer) { consumer.accept(itemColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link #innerColor} field. */ + public BNDwidgetTheme innerColor(@NativeType("NVGcolor") NVGColor value) { ninnerColor(address(), value); return this; } + /** Passes the {@link #innerColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDwidgetTheme innerColor(java.util.function.Consumer consumer) { consumer.accept(innerColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link #innerSelectedColor} field. */ + public BNDwidgetTheme innerSelectedColor(@NativeType("NVGcolor") NVGColor value) { ninnerSelectedColor(address(), value); return this; } + /** Passes the {@link #innerSelectedColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDwidgetTheme innerSelectedColor(java.util.function.Consumer consumer) { consumer.accept(innerSelectedColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link #textColor} field. */ + public BNDwidgetTheme textColor(@NativeType("NVGcolor") NVGColor value) { ntextColor(address(), value); return this; } + /** Passes the {@link #textColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDwidgetTheme textColor(java.util.function.Consumer consumer) { consumer.accept(textColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link #textSelectedColor} field. */ + public BNDwidgetTheme textSelectedColor(@NativeType("NVGcolor") NVGColor value) { ntextSelectedColor(address(), value); return this; } + /** Passes the {@link #textSelectedColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public BNDwidgetTheme textSelectedColor(java.util.function.Consumer consumer) { consumer.accept(textSelectedColor()); return this; } + /** Sets the specified value to the {@link #shadeTop} field. */ + public BNDwidgetTheme shadeTop(int value) { nshadeTop(address(), value); return this; } + /** Sets the specified value to the {@link #shadeDown} field. */ + public BNDwidgetTheme shadeDown(int value) { nshadeDown(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public BNDwidgetTheme set( + NVGColor outlineColor, + NVGColor itemColor, + NVGColor innerColor, + NVGColor innerSelectedColor, + NVGColor textColor, + NVGColor textSelectedColor, + int shadeTop, + int shadeDown + ) { + outlineColor(outlineColor); + itemColor(itemColor); + innerColor(innerColor); + innerSelectedColor(innerSelectedColor); + textColor(textColor); + textSelectedColor(textSelectedColor); + shadeTop(shadeTop); + shadeDown(shadeDown); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public BNDwidgetTheme set(BNDwidgetTheme src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code BNDwidgetTheme} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static BNDwidgetTheme malloc() { + return new BNDwidgetTheme(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code BNDwidgetTheme} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static BNDwidgetTheme calloc() { + return new BNDwidgetTheme(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code BNDwidgetTheme} instance allocated with {@link BufferUtils}. */ + public static BNDwidgetTheme create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new BNDwidgetTheme(memAddress(container), container); + } + + /** Returns a new {@code BNDwidgetTheme} instance for the specified memory address. */ + public static BNDwidgetTheme create(long address) { + return new BNDwidgetTheme(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static BNDwidgetTheme createSafe(long address) { + return address == NULL ? null : new BNDwidgetTheme(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static BNDwidgetTheme mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static BNDwidgetTheme callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static BNDwidgetTheme mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static BNDwidgetTheme callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code BNDwidgetTheme} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static BNDwidgetTheme malloc(MemoryStack stack) { + return new BNDwidgetTheme(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code BNDwidgetTheme} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static BNDwidgetTheme calloc(MemoryStack stack) { + return new BNDwidgetTheme(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #outlineColor}. */ + public static NVGColor noutlineColor(long struct) { return NVGColor.create(struct + BNDwidgetTheme.OUTLINECOLOR); } + /** Unsafe version of {@link #itemColor}. */ + public static NVGColor nitemColor(long struct) { return NVGColor.create(struct + BNDwidgetTheme.ITEMCOLOR); } + /** Unsafe version of {@link #innerColor}. */ + public static NVGColor ninnerColor(long struct) { return NVGColor.create(struct + BNDwidgetTheme.INNERCOLOR); } + /** Unsafe version of {@link #innerSelectedColor}. */ + public static NVGColor ninnerSelectedColor(long struct) { return NVGColor.create(struct + BNDwidgetTheme.INNERSELECTEDCOLOR); } + /** Unsafe version of {@link #textColor}. */ + public static NVGColor ntextColor(long struct) { return NVGColor.create(struct + BNDwidgetTheme.TEXTCOLOR); } + /** Unsafe version of {@link #textSelectedColor}. */ + public static NVGColor ntextSelectedColor(long struct) { return NVGColor.create(struct + BNDwidgetTheme.TEXTSELECTEDCOLOR); } + /** Unsafe version of {@link #shadeTop}. */ + public static int nshadeTop(long struct) { return UNSAFE.getInt(null, struct + BNDwidgetTheme.SHADETOP); } + /** Unsafe version of {@link #shadeDown}. */ + public static int nshadeDown(long struct) { return UNSAFE.getInt(null, struct + BNDwidgetTheme.SHADEDOWN); } + + /** Unsafe version of {@link #outlineColor(NVGColor) outlineColor}. */ + public static void noutlineColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDwidgetTheme.OUTLINECOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #itemColor(NVGColor) itemColor}. */ + public static void nitemColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDwidgetTheme.ITEMCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #innerColor(NVGColor) innerColor}. */ + public static void ninnerColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDwidgetTheme.INNERCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #innerSelectedColor(NVGColor) innerSelectedColor}. */ + public static void ninnerSelectedColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDwidgetTheme.INNERSELECTEDCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #textColor(NVGColor) textColor}. */ + public static void ntextColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDwidgetTheme.TEXTCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #textSelectedColor(NVGColor) textSelectedColor}. */ + public static void ntextSelectedColor(long struct, NVGColor value) { memCopy(value.address(), struct + BNDwidgetTheme.TEXTSELECTEDCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #shadeTop(int) shadeTop}. */ + public static void nshadeTop(long struct, int value) { UNSAFE.putInt(null, struct + BNDwidgetTheme.SHADETOP, value); } + /** Unsafe version of {@link #shadeDown(int) shadeDown}. */ + public static void nshadeDown(long struct, int value) { UNSAFE.putInt(null, struct + BNDwidgetTheme.SHADEDOWN, value); } + + // ----------------------------------- + + /** An array of {@link BNDwidgetTheme} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final BNDwidgetTheme ELEMENT_FACTORY = BNDwidgetTheme.create(-1L); + + /** + * Creates a new {@code BNDwidgetTheme.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link BNDwidgetTheme#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected BNDwidgetTheme getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link NVGColor} view of the {@link BNDwidgetTheme#outlineColor} field. */ + @NativeType("NVGcolor") + public NVGColor outlineColor() { return BNDwidgetTheme.noutlineColor(address()); } + /** @return a {@link NVGColor} view of the {@link BNDwidgetTheme#itemColor} field. */ + @NativeType("NVGcolor") + public NVGColor itemColor() { return BNDwidgetTheme.nitemColor(address()); } + /** @return a {@link NVGColor} view of the {@link BNDwidgetTheme#innerColor} field. */ + @NativeType("NVGcolor") + public NVGColor innerColor() { return BNDwidgetTheme.ninnerColor(address()); } + /** @return a {@link NVGColor} view of the {@link BNDwidgetTheme#innerSelectedColor} field. */ + @NativeType("NVGcolor") + public NVGColor innerSelectedColor() { return BNDwidgetTheme.ninnerSelectedColor(address()); } + /** @return a {@link NVGColor} view of the {@link BNDwidgetTheme#textColor} field. */ + @NativeType("NVGcolor") + public NVGColor textColor() { return BNDwidgetTheme.ntextColor(address()); } + /** @return a {@link NVGColor} view of the {@link BNDwidgetTheme#textSelectedColor} field. */ + @NativeType("NVGcolor") + public NVGColor textSelectedColor() { return BNDwidgetTheme.ntextSelectedColor(address()); } + /** @return the value of the {@link BNDwidgetTheme#shadeTop} field. */ + public int shadeTop() { return BNDwidgetTheme.nshadeTop(address()); } + /** @return the value of the {@link BNDwidgetTheme#shadeDown} field. */ + public int shadeDown() { return BNDwidgetTheme.nshadeDown(address()); } + + /** Copies the specified {@link NVGColor} to the {@link BNDwidgetTheme#outlineColor} field. */ + public Buffer outlineColor(@NativeType("NVGcolor") NVGColor value) { BNDwidgetTheme.noutlineColor(address(), value); return this; } + /** Passes the {@link BNDwidgetTheme#outlineColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer outlineColor(java.util.function.Consumer consumer) { consumer.accept(outlineColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link BNDwidgetTheme#itemColor} field. */ + public Buffer itemColor(@NativeType("NVGcolor") NVGColor value) { BNDwidgetTheme.nitemColor(address(), value); return this; } + /** Passes the {@link BNDwidgetTheme#itemColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer itemColor(java.util.function.Consumer consumer) { consumer.accept(itemColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link BNDwidgetTheme#innerColor} field. */ + public Buffer innerColor(@NativeType("NVGcolor") NVGColor value) { BNDwidgetTheme.ninnerColor(address(), value); return this; } + /** Passes the {@link BNDwidgetTheme#innerColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer innerColor(java.util.function.Consumer consumer) { consumer.accept(innerColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link BNDwidgetTheme#innerSelectedColor} field. */ + public Buffer innerSelectedColor(@NativeType("NVGcolor") NVGColor value) { BNDwidgetTheme.ninnerSelectedColor(address(), value); return this; } + /** Passes the {@link BNDwidgetTheme#innerSelectedColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer innerSelectedColor(java.util.function.Consumer consumer) { consumer.accept(innerSelectedColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link BNDwidgetTheme#textColor} field. */ + public Buffer textColor(@NativeType("NVGcolor") NVGColor value) { BNDwidgetTheme.ntextColor(address(), value); return this; } + /** Passes the {@link BNDwidgetTheme#textColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer textColor(java.util.function.Consumer consumer) { consumer.accept(textColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link BNDwidgetTheme#textSelectedColor} field. */ + public Buffer textSelectedColor(@NativeType("NVGcolor") NVGColor value) { BNDwidgetTheme.ntextSelectedColor(address(), value); return this; } + /** Passes the {@link BNDwidgetTheme#textSelectedColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer textSelectedColor(java.util.function.Consumer consumer) { consumer.accept(textSelectedColor()); return this; } + /** Sets the specified value to the {@link BNDwidgetTheme#shadeTop} field. */ + public Buffer shadeTop(int value) { BNDwidgetTheme.nshadeTop(address(), value); return this; } + /** Sets the specified value to the {@link BNDwidgetTheme#shadeDown} field. */ + public Buffer shadeDown(int value) { BNDwidgetTheme.nshadeDown(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/Blendish.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/Blendish.java new file mode 100644 index 000000000..ac54ccf03 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/Blendish.java @@ -0,0 +1,2472 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Blendish is a small collection of drawing functions for NanoVG, designed to replicate the look of the Blender 2.5+ User Interface. You can use these + * functions to theme your UI library. Several metric constants for faithful reproduction are also included. + * + *

    Blendish supports the original Blender icon sheet; As the licensing of Blender's icons is unclear, they are not included in Blendish'es repository, but + * an SVG template, "icons_template.svg" is provided, which you can use to build your own icon sheet.

    + * + *

    To use icons, you must first load the icon sheet using one of the {@code nvgCreateImage*()} functions and then pass the image handle to + * {@link #bndSetIconImage SetIconImage}; otherwise, no icons will be drawn. See {@code bndSetIconImage()} for more information.

    + * + *

    Blendish will not render text until a suitable UI font has been passed to {@link #bndSetFont SetFont} has been called. See {@code bndSetFont()} for more information.

    + * + *

    Drawbacks

    + * + *

    There is no support for varying dpi resolutions yet. The library is hardcoded to the equivalent of 72 dpi in the Blender system settings.

    + * + *

    Support for label truncation is missing. Text rendering breaks when widgets are too short to contain their labels.

    + */ +public class Blendish { + + static { LibNanoVG.initialize(); } + + /** Alpha of disabled widget groups. Can be used in conjunction with {@link NanoVG#nvgGlobalAlpha GlobalAlpha}. */ + public static final float BND_DISABLED_ALPHA = 0.5f; + + /** + * How text on a control is aligned. ({@code BNDtextAlignment}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #BND_LEFT LEFT}
    • + *
    • {@link #BND_CENTER CENTER}
    • + *
    + */ + public static final int + BND_LEFT = 0, + BND_CENTER = 1; + + /** + * States altering the styling of a widget. ({@code BNDwidgetState}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #BND_DEFAULT DEFAULT} - not interacting
    • + *
    • {@link #BND_HOVER HOVER} - the mouse is hovering over the control
    • + *
    • {@link #BND_ACTIVE ACTIVE} - the widget is activated (pressed) or in an active state (toggled)
    • + *
    + */ + public static final int + BND_DEFAULT = 0, + BND_HOVER = 1, + BND_ACTIVE = 2; + + /** + * Flags indicating which corners are sharp (for grouping widgets). ({@code BNDcornerFlags}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #BND_CORNER_NONE CORNER_NONE} - all corners are round
    • + *
    • {@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT} - sharp top left corner
    • + *
    • {@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT} - sharp top right corner
    • + *
    • {@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT} - sharp bottom right corner
    • + *
    • {@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT} - sharp bottom left corner
    • + *
    • {@link #BND_CORNER_ALL CORNER_ALL} - all corners are sharp; you can invert a set of flags using ^= BND_CORNER_ALL
    • + *
    • {@link #BND_CORNER_TOP CORNER_TOP} - top border is sharp
    • + *
    • {@link #BND_CORNER_DOWN CORNER_DOWN} - bottom border is sharp
    • + *
    • {@link #BND_CORNER_LEFT CORNER_LEFT} - left border is sharp
    • + *
    • {@link #BND_CORNER_RIGHT CORNER_RIGHT} - right border is sharp
    • + *
    + */ + public static final int + BND_CORNER_NONE = 0, + BND_CORNER_TOP_LEFT = 1, + BND_CORNER_TOP_RIGHT = 2, + BND_CORNER_DOWN_RIGHT = 4, + BND_CORNER_DOWN_LEFT = 8, + BND_CORNER_ALL = 0xF, + BND_CORNER_TOP = 3, + BND_CORNER_DOWN = 0xC, + BND_CORNER_LEFT = 9, + BND_CORNER_RIGHT = 6; + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} - default widget height
    • + *
    • {@link #BND_TOOL_WIDTH TOOL_WIDTH} - default toolbutton width (if icon only)
    • + *
    • {@link #BND_NODE_PORT_RADIUS NODE_PORT_RADIUS} - default radius of node ports
    • + *
    • {@link #BND_NODE_MARGIN_TOP NODE_MARGIN_TOP} - top margin of node content
    • + *
    • {@link #BND_NODE_MARGIN_DOWN NODE_MARGIN_DOWN} - bottom margin of node content
    • + *
    • {@link #BND_NODE_MARGIN_SIDE NODE_MARGIN_SIDE} - left and right margin of node content
    • + *
    • {@link #BND_NODE_TITLE_HEIGHT NODE_TITLE_HEIGHT} - height of node title bar
    • + *
    • {@link #BND_NODE_ARROW_AREA_WIDTH NODE_ARROW_AREA_WIDTH} - width of node title arrow click area
    • + *
    • {@link #BND_SPLITTER_AREA_SIZE SPLITTER_AREA_SIZE} - size of splitter corner click area
    • + *
    • {@link #BND_SCROLLBAR_WIDTH SCROLLBAR_WIDTH} - width of vertical scrollbar
    • + *
    • {@link #BND_SCROLLBAR_HEIGHT SCROLLBAR_HEIGHT} - height of horizontal scrollbar
    • + *
    • {@link #BND_VSPACING VSPACING} - default vertical spacing
    • + *
    • {@link #BND_VSPACING_GROUP VSPACING_GROUP} - default vertical spacing between groups
    • + *
    • {@link #BND_HSPACING HSPACING} - default horizontal spacing
    • + *
    + */ + public static final int + BND_WIDGET_HEIGHT = 21, + BND_TOOL_WIDTH = 20, + BND_NODE_PORT_RADIUS = 5, + BND_NODE_MARGIN_TOP = 25, + BND_NODE_MARGIN_DOWN = 5, + BND_NODE_MARGIN_SIDE = 10, + BND_NODE_TITLE_HEIGHT = 20, + BND_NODE_ARROW_AREA_WIDTH = 20, + BND_SPLITTER_AREA_SIZE = 12, + BND_SCROLLBAR_WIDTH = 13, + BND_SCROLLBAR_HEIGHT = 14, + BND_VSPACING = 1, + BND_VSPACING_GROUP = 8, + BND_HSPACING = 8; + + /** + * {@code BNDicon} + * + *
    Enum values:
    + * + *
      + *
    • {@link #BND_ICON_NONE ICON_NONE}
    • + *
    • {@link #BND_ICON_QUESTION ICON_QUESTION}
    • + *
    • {@link #BND_ICON_ERROR ICON_ERROR}
    • + *
    • {@link #BND_ICON_CANCEL ICON_CANCEL}
    • + *
    • {@link #BND_ICON_TRIA_RIGHT ICON_TRIA_RIGHT}
    • + *
    • {@link #BND_ICON_TRIA_DOWN ICON_TRIA_DOWN}
    • + *
    • {@link #BND_ICON_TRIA_LEFT ICON_TRIA_LEFT}
    • + *
    • {@link #BND_ICON_TRIA_UP ICON_TRIA_UP}
    • + *
    • {@link #BND_ICON_ARROW_LEFTRIGHT ICON_ARROW_LEFTRIGHT}
    • + *
    • {@link #BND_ICON_PLUS ICON_PLUS}
    • + *
    • {@link #BND_ICON_DISCLOSURE_TRI_DOWN ICON_DISCLOSURE_TRI_DOWN}
    • + *
    • {@link #BND_ICON_DISCLOSURE_TRI_RIGHT ICON_DISCLOSURE_TRI_RIGHT}
    • + *
    • {@link #BND_ICON_RADIOBUT_OFF ICON_RADIOBUT_OFF}
    • + *
    • {@link #BND_ICON_RADIOBUT_ON ICON_RADIOBUT_ON}
    • + *
    • {@link #BND_ICON_MENU_PANEL ICON_MENU_PANEL}
    • + *
    • {@link #BND_ICON_BLENDER ICON_BLENDER}
    • + *
    • {@link #BND_ICON_GRIP ICON_GRIP}
    • + *
    • {@link #BND_ICON_DOT ICON_DOT}
    • + *
    • {@link #BND_ICON_COLLAPSEMENU ICON_COLLAPSEMENU}
    • + *
    • {@link #BND_ICON_X ICON_X}
    • + *
    • {@link #BND_ICON_GO_LEFT ICON_GO_LEFT}
    • + *
    • {@link #BND_ICON_PLUG ICON_PLUG}
    • + *
    • {@link #BND_ICON_UI ICON_UI}
    • + *
    • {@link #BND_ICON_NODE ICON_NODE}
    • + *
    • {@link #BND_ICON_NODE_SEL ICON_NODE_SEL}
    • + *
    • {@link #BND_ICON_FULLSCREEN ICON_FULLSCREEN}
    • + *
    • {@link #BND_ICON_SPLITSCREEN ICON_SPLITSCREEN}
    • + *
    • {@link #BND_ICON_RIGHTARROW_THIN ICON_RIGHTARROW_THIN}
    • + *
    • {@link #BND_ICON_BORDERMOVE ICON_BORDERMOVE}
    • + *
    • {@link #BND_ICON_VIEWZOOM ICON_VIEWZOOM}
    • + *
    • {@link #BND_ICON_ZOOMIN ICON_ZOOMIN}
    • + *
    • {@link #BND_ICON_ZOOMOUT ICON_ZOOMOUT}
    • + *
    • {@link #BND_ICON_PANEL_CLOSE ICON_PANEL_CLOSE}
    • + *
    • {@link #BND_ICON_COPY_ID ICON_COPY_ID}
    • + *
    • {@link #BND_ICON_EYEDROPPER ICON_EYEDROPPER}
    • + *
    • {@link #BND_ICON_LINK_AREA ICON_LINK_AREA}
    • + *
    • {@link #BND_ICON_AUTO ICON_AUTO}
    • + *
    • {@link #BND_ICON_CHECKBOX_DEHLT ICON_CHECKBOX_DEHLT}
    • + *
    • {@link #BND_ICON_CHECKBOX_HLT ICON_CHECKBOX_HLT}
    • + *
    • {@link #BND_ICON_UNLOCKED ICON_UNLOCKED}
    • + *
    • {@link #BND_ICON_LOCKED ICON_LOCKED}
    • + *
    • {@link #BND_ICON_UNPINNED ICON_UNPINNED}
    • + *
    • {@link #BND_ICON_PINNED ICON_PINNED}
    • + *
    • {@link #BND_ICON_SCREEN_BACK ICON_SCREEN_BACK}
    • + *
    • {@link #BND_ICON_RIGHTARROW ICON_RIGHTARROW}
    • + *
    • {@link #BND_ICON_DOWNARROW_HLT ICON_DOWNARROW_HLT}
    • + *
    • {@link #BND_ICON_DOTSUP ICON_DOTSUP}
    • + *
    • {@link #BND_ICON_DOTSDOWN ICON_DOTSDOWN}
    • + *
    • {@link #BND_ICON_LINK ICON_LINK}
    • + *
    • {@link #BND_ICON_INLINK ICON_INLINK}
    • + *
    • {@link #BND_ICON_PLUGIN ICON_PLUGIN}
    • + *
    • {@link #BND_ICON_HELP ICON_HELP}
    • + *
    • {@link #BND_ICON_GHOST_ENABLED ICON_GHOST_ENABLED}
    • + *
    • {@link #BND_ICON_COLOR ICON_COLOR}
    • + *
    • {@link #BND_ICON_LINKED ICON_LINKED}
    • + *
    • {@link #BND_ICON_UNLINKED ICON_UNLINKED}
    • + *
    • {@link #BND_ICON_HAND ICON_HAND}
    • + *
    • {@link #BND_ICON_ZOOM_ALL ICON_ZOOM_ALL}
    • + *
    • {@link #BND_ICON_ZOOM_SELECTED ICON_ZOOM_SELECTED}
    • + *
    • {@link #BND_ICON_ZOOM_PREVIOUS ICON_ZOOM_PREVIOUS}
    • + *
    • {@link #BND_ICON_ZOOM_IN ICON_ZOOM_IN}
    • + *
    • {@link #BND_ICON_ZOOM_OUT ICON_ZOOM_OUT}
    • + *
    • {@link #BND_ICON_RENDER_REGION ICON_RENDER_REGION}
    • + *
    • {@link #BND_ICON_BORDER_RECT ICON_BORDER_RECT}
    • + *
    • {@link #BND_ICON_BORDER_LASSO ICON_BORDER_LASSO}
    • + *
    • {@link #BND_ICON_FREEZE ICON_FREEZE}
    • + *
    • {@link #BND_ICON_STYLUS_PRESSURE ICON_STYLUS_PRESSURE}
    • + *
    • {@link #BND_ICON_GHOST_DISABLED ICON_GHOST_DISABLED}
    • + *
    • {@link #BND_ICON_NEW ICON_NEW}
    • + *
    • {@link #BND_ICON_FILE_TICK ICON_FILE_TICK}
    • + *
    • {@link #BND_ICON_QUIT ICON_QUIT}
    • + *
    • {@link #BND_ICON_URL ICON_URL}
    • + *
    • {@link #BND_ICON_RECOVER_LAST ICON_RECOVER_LAST}
    • + *
    • {@link #BND_ICON_FULLSCREEN_ENTER ICON_FULLSCREEN_ENTER}
    • + *
    • {@link #BND_ICON_FULLSCREEN_EXIT ICON_FULLSCREEN_EXIT}
    • + *
    • {@link #BND_ICON_BLANK1 ICON_BLANK1}
    • + *
    • {@link #BND_ICON_LAMP ICON_LAMP}
    • + *
    • {@link #BND_ICON_MATERIAL ICON_MATERIAL}
    • + *
    • {@link #BND_ICON_TEXTURE ICON_TEXTURE}
    • + *
    • {@link #BND_ICON_ANIM ICON_ANIM}
    • + *
    • {@link #BND_ICON_WORLD ICON_WORLD}
    • + *
    • {@link #BND_ICON_SCENE ICON_SCENE}
    • + *
    • {@link #BND_ICON_EDIT ICON_EDIT}
    • + *
    • {@link #BND_ICON_GAME ICON_GAME}
    • + *
    • {@link #BND_ICON_RADIO ICON_RADIO}
    • + *
    • {@link #BND_ICON_SCRIPT ICON_SCRIPT}
    • + *
    • {@link #BND_ICON_PARTICLES ICON_PARTICLES}
    • + *
    • {@link #BND_ICON_PHYSICS ICON_PHYSICS}
    • + *
    • {@link #BND_ICON_SPEAKER ICON_SPEAKER}
    • + *
    • {@link #BND_ICON_TEXTURE_SHADED ICON_TEXTURE_SHADED}
    • + *
    • {@link #BND_ICON_VIEW3D ICON_VIEW3D}
    • + *
    • {@link #BND_ICON_IPO ICON_IPO}
    • + *
    • {@link #BND_ICON_OOPS ICON_OOPS}
    • + *
    • {@link #BND_ICON_BUTS ICON_BUTS}
    • + *
    • {@link #BND_ICON_FILESEL ICON_FILESEL}
    • + *
    • {@link #BND_ICON_IMAGE_COL ICON_IMAGE_COL}
    • + *
    • {@link #BND_ICON_INFO ICON_INFO}
    • + *
    • {@link #BND_ICON_SEQUENCE ICON_SEQUENCE}
    • + *
    • {@link #BND_ICON_TEXT ICON_TEXT}
    • + *
    • {@link #BND_ICON_IMASEL ICON_IMASEL}
    • + *
    • {@link #BND_ICON_SOUND ICON_SOUND}
    • + *
    • {@link #BND_ICON_ACTION ICON_ACTION}
    • + *
    • {@link #BND_ICON_NLA ICON_NLA}
    • + *
    • {@link #BND_ICON_SCRIPTWIN ICON_SCRIPTWIN}
    • + *
    • {@link #BND_ICON_TIME ICON_TIME}
    • + *
    • {@link #BND_ICON_NODETREE ICON_NODETREE}
    • + *
    • {@link #BND_ICON_LOGIC ICON_LOGIC}
    • + *
    • {@link #BND_ICON_CONSOLE ICON_CONSOLE}
    • + *
    • {@link #BND_ICON_PREFERENCES ICON_PREFERENCES}
    • + *
    • {@link #BND_ICON_CLIP ICON_CLIP}
    • + *
    • {@link #BND_ICON_ASSET_MANAGER ICON_ASSET_MANAGER}
    • + *
    • {@link #BND_ICON_OBJECT_DATAMODE ICON_OBJECT_DATAMODE}
    • + *
    • {@link #BND_ICON_EDITMODE_HLT ICON_EDITMODE_HLT}
    • + *
    • {@link #BND_ICON_FACESEL_HLT ICON_FACESEL_HLT}
    • + *
    • {@link #BND_ICON_VPAINT_HLT ICON_VPAINT_HLT}
    • + *
    • {@link #BND_ICON_TPAINT_HLT ICON_TPAINT_HLT}
    • + *
    • {@link #BND_ICON_WPAINT_HLT ICON_WPAINT_HLT}
    • + *
    • {@link #BND_ICON_SCULPTMODE_HLT ICON_SCULPTMODE_HLT}
    • + *
    • {@link #BND_ICON_POSE_HLT ICON_POSE_HLT}
    • + *
    • {@link #BND_ICON_PARTICLEMODE ICON_PARTICLEMODE}
    • + *
    • {@link #BND_ICON_LIGHTPAINT ICON_LIGHTPAINT}
    • + *
    • {@link #BND_ICON_SCENE_DATA ICON_SCENE_DATA}
    • + *
    • {@link #BND_ICON_RENDERLAYERS ICON_RENDERLAYERS}
    • + *
    • {@link #BND_ICON_WORLD_DATA ICON_WORLD_DATA}
    • + *
    • {@link #BND_ICON_OBJECT_DATA ICON_OBJECT_DATA}
    • + *
    • {@link #BND_ICON_MESH_DATA ICON_MESH_DATA}
    • + *
    • {@link #BND_ICON_CURVE_DATA ICON_CURVE_DATA}
    • + *
    • {@link #BND_ICON_META_DATA ICON_META_DATA}
    • + *
    • {@link #BND_ICON_LATTICE_DATA ICON_LATTICE_DATA}
    • + *
    • {@link #BND_ICON_LAMP_DATA ICON_LAMP_DATA}
    • + *
    • {@link #BND_ICON_MATERIAL_DATA ICON_MATERIAL_DATA}
    • + *
    • {@link #BND_ICON_TEXTURE_DATA ICON_TEXTURE_DATA}
    • + *
    • {@link #BND_ICON_ANIM_DATA ICON_ANIM_DATA}
    • + *
    • {@link #BND_ICON_CAMERA_DATA ICON_CAMERA_DATA}
    • + *
    • {@link #BND_ICON_PARTICLE_DATA ICON_PARTICLE_DATA}
    • + *
    • {@link #BND_ICON_LIBRARY_DATA_DIRECT ICON_LIBRARY_DATA_DIRECT}
    • + *
    • {@link #BND_ICON_GROUP ICON_GROUP}
    • + *
    • {@link #BND_ICON_ARMATURE_DATA ICON_ARMATURE_DATA}
    • + *
    • {@link #BND_ICON_POSE_DATA ICON_POSE_DATA}
    • + *
    • {@link #BND_ICON_BONE_DATA ICON_BONE_DATA}
    • + *
    • {@link #BND_ICON_CONSTRAINT ICON_CONSTRAINT}
    • + *
    • {@link #BND_ICON_SHAPEKEY_DATA ICON_SHAPEKEY_DATA}
    • + *
    • {@link #BND_ICON_CONSTRAINT_BONE ICON_CONSTRAINT_BONE}
    • + *
    • {@link #BND_ICON_CAMERA_STEREO ICON_CAMERA_STEREO}
    • + *
    • {@link #BND_ICON_PACKAGE ICON_PACKAGE}
    • + *
    • {@link #BND_ICON_UGLYPACKAGE ICON_UGLYPACKAGE}
    • + *
    • {@link #BND_ICON_BRUSH_DATA ICON_BRUSH_DATA}
    • + *
    • {@link #BND_ICON_IMAGE_DATA ICON_IMAGE_DATA}
    • + *
    • {@link #BND_ICON_FILE ICON_FILE}
    • + *
    • {@link #BND_ICON_FCURVE ICON_FCURVE}
    • + *
    • {@link #BND_ICON_FONT_DATA ICON_FONT_DATA}
    • + *
    • {@link #BND_ICON_RENDER_RESULT ICON_RENDER_RESULT}
    • + *
    • {@link #BND_ICON_SURFACE_DATA ICON_SURFACE_DATA}
    • + *
    • {@link #BND_ICON_EMPTY_DATA ICON_EMPTY_DATA}
    • + *
    • {@link #BND_ICON_SETTINGS ICON_SETTINGS}
    • + *
    • {@link #BND_ICON_RENDER_ANIMATION ICON_RENDER_ANIMATION}
    • + *
    • {@link #BND_ICON_RENDER_STILL ICON_RENDER_STILL}
    • + *
    • {@link #BND_ICON_BOIDS ICON_BOIDS}
    • + *
    • {@link #BND_ICON_STRANDS ICON_STRANDS}
    • + *
    • {@link #BND_ICON_LIBRARY_DATA_INDIRECT ICON_LIBRARY_DATA_INDIRECT}
    • + *
    • {@link #BND_ICON_GREASEPENCIL ICON_GREASEPENCIL}
    • + *
    • {@link #BND_ICON_LINE_DATA ICON_LINE_DATA}
    • + *
    • {@link #BND_ICON_GROUP_BONE ICON_GROUP_BONE}
    • + *
    • {@link #BND_ICON_GROUP_VERTEX ICON_GROUP_VERTEX}
    • + *
    • {@link #BND_ICON_GROUP_VCOL ICON_GROUP_VCOL}
    • + *
    • {@link #BND_ICON_GROUP_UVS ICON_GROUP_UVS}
    • + *
    • {@link #BND_ICON_RNA ICON_RNA}
    • + *
    • {@link #BND_ICON_RNA_ADD ICON_RNA_ADD}
    • + *
    • {@link #BND_ICON_OUTLINER_OB_EMPTY ICON_OUTLINER_OB_EMPTY}
    • + *
    • {@link #BND_ICON_OUTLINER_OB_MESH ICON_OUTLINER_OB_MESH}
    • + *
    • {@link #BND_ICON_OUTLINER_OB_CURVE ICON_OUTLINER_OB_CURVE}
    • + *
    • {@link #BND_ICON_OUTLINER_OB_LATTICE ICON_OUTLINER_OB_LATTICE}
    • + *
    • {@link #BND_ICON_OUTLINER_OB_META ICON_OUTLINER_OB_META}
    • + *
    • {@link #BND_ICON_OUTLINER_OB_LAMP ICON_OUTLINER_OB_LAMP}
    • + *
    • {@link #BND_ICON_OUTLINER_OB_CAMERA ICON_OUTLINER_OB_CAMERA}
    • + *
    • {@link #BND_ICON_OUTLINER_OB_ARMATURE ICON_OUTLINER_OB_ARMATURE}
    • + *
    • {@link #BND_ICON_OUTLINER_OB_FONT ICON_OUTLINER_OB_FONT}
    • + *
    • {@link #BND_ICON_OUTLINER_OB_SURFACE ICON_OUTLINER_OB_SURFACE}
    • + *
    • {@link #BND_ICON_OUTLINER_OB_SPEAKER ICON_OUTLINER_OB_SPEAKER}
    • + *
    • {@link #BND_ICON_RESTRICT_VIEW_OFF ICON_RESTRICT_VIEW_OFF}
    • + *
    • {@link #BND_ICON_RESTRICT_VIEW_ON ICON_RESTRICT_VIEW_ON}
    • + *
    • {@link #BND_ICON_RESTRICT_SELECT_OFF ICON_RESTRICT_SELECT_OFF}
    • + *
    • {@link #BND_ICON_RESTRICT_SELECT_ON ICON_RESTRICT_SELECT_ON}
    • + *
    • {@link #BND_ICON_RESTRICT_RENDER_OFF ICON_RESTRICT_RENDER_OFF}
    • + *
    • {@link #BND_ICON_RESTRICT_RENDER_ON ICON_RESTRICT_RENDER_ON}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_EMPTY ICON_OUTLINER_DATA_EMPTY}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_MESH ICON_OUTLINER_DATA_MESH}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_CURVE ICON_OUTLINER_DATA_CURVE}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_LATTICE ICON_OUTLINER_DATA_LATTICE}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_META ICON_OUTLINER_DATA_META}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_LAMP ICON_OUTLINER_DATA_LAMP}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_CAMERA ICON_OUTLINER_DATA_CAMERA}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_ARMATURE ICON_OUTLINER_DATA_ARMATURE}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_FONT ICON_OUTLINER_DATA_FONT}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_SURFACE ICON_OUTLINER_DATA_SURFACE}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_SPEAKER ICON_OUTLINER_DATA_SPEAKER}
    • + *
    • {@link #BND_ICON_OUTLINER_DATA_POSE ICON_OUTLINER_DATA_POSE}
    • + *
    • {@link #BND_ICON_MESH_PLANE ICON_MESH_PLANE}
    • + *
    • {@link #BND_ICON_MESH_CUBE ICON_MESH_CUBE}
    • + *
    • {@link #BND_ICON_MESH_CIRCLE ICON_MESH_CIRCLE}
    • + *
    • {@link #BND_ICON_MESH_UVSPHERE ICON_MESH_UVSPHERE}
    • + *
    • {@link #BND_ICON_MESH_ICOSPHERE ICON_MESH_ICOSPHERE}
    • + *
    • {@link #BND_ICON_MESH_GRID ICON_MESH_GRID}
    • + *
    • {@link #BND_ICON_MESH_MONKEY ICON_MESH_MONKEY}
    • + *
    • {@link #BND_ICON_MESH_CYLINDER ICON_MESH_CYLINDER}
    • + *
    • {@link #BND_ICON_MESH_TORUS ICON_MESH_TORUS}
    • + *
    • {@link #BND_ICON_MESH_CONE ICON_MESH_CONE}
    • + *
    • {@link #BND_ICON_LAMP_POINT ICON_LAMP_POINT}
    • + *
    • {@link #BND_ICON_LAMP_SUN ICON_LAMP_SUN}
    • + *
    • {@link #BND_ICON_LAMP_SPOT ICON_LAMP_SPOT}
    • + *
    • {@link #BND_ICON_LAMP_HEMI ICON_LAMP_HEMI}
    • + *
    • {@link #BND_ICON_LAMP_AREA ICON_LAMP_AREA}
    • + *
    • {@link #BND_ICON_META_EMPTY ICON_META_EMPTY}
    • + *
    • {@link #BND_ICON_META_PLANE ICON_META_PLANE}
    • + *
    • {@link #BND_ICON_META_CUBE ICON_META_CUBE}
    • + *
    • {@link #BND_ICON_META_BALL ICON_META_BALL}
    • + *
    • {@link #BND_ICON_META_ELLIPSOID ICON_META_ELLIPSOID}
    • + *
    • {@link #BND_ICON_META_CAPSULE ICON_META_CAPSULE}
    • + *
    • {@link #BND_ICON_SURFACE_NCURVE ICON_SURFACE_NCURVE}
    • + *
    • {@link #BND_ICON_SURFACE_NCIRCLE ICON_SURFACE_NCIRCLE}
    • + *
    • {@link #BND_ICON_SURFACE_NSURFACE ICON_SURFACE_NSURFACE}
    • + *
    • {@link #BND_ICON_SURFACE_NCYLINDER ICON_SURFACE_NCYLINDER}
    • + *
    • {@link #BND_ICON_SURFACE_NSPHERE ICON_SURFACE_NSPHERE}
    • + *
    • {@link #BND_ICON_SURFACE_NTORUS ICON_SURFACE_NTORUS}
    • + *
    • {@link #BND_ICON_CURVE_BEZCURVE ICON_CURVE_BEZCURVE}
    • + *
    • {@link #BND_ICON_CURVE_BEZCIRCLE ICON_CURVE_BEZCIRCLE}
    • + *
    • {@link #BND_ICON_CURVE_NCURVE ICON_CURVE_NCURVE}
    • + *
    • {@link #BND_ICON_CURVE_NCIRCLE ICON_CURVE_NCIRCLE}
    • + *
    • {@link #BND_ICON_CURVE_PATH ICON_CURVE_PATH}
    • + *
    • {@link #BND_ICON_COLOR_RED ICON_COLOR_RED}
    • + *
    • {@link #BND_ICON_COLOR_GREEN ICON_COLOR_GREEN}
    • + *
    • {@link #BND_ICON_COLOR_BLUE ICON_COLOR_BLUE}
    • + *
    • {@link #BND_ICON_FORCE_FORCE ICON_FORCE_FORCE}
    • + *
    • {@link #BND_ICON_FORCE_WIND ICON_FORCE_WIND}
    • + *
    • {@link #BND_ICON_FORCE_VORTEX ICON_FORCE_VORTEX}
    • + *
    • {@link #BND_ICON_FORCE_MAGNETIC ICON_FORCE_MAGNETIC}
    • + *
    • {@link #BND_ICON_FORCE_HARMONIC ICON_FORCE_HARMONIC}
    • + *
    • {@link #BND_ICON_FORCE_CHARGE ICON_FORCE_CHARGE}
    • + *
    • {@link #BND_ICON_FORCE_LENNARDJONES ICON_FORCE_LENNARDJONES}
    • + *
    • {@link #BND_ICON_FORCE_TEXTURE ICON_FORCE_TEXTURE}
    • + *
    • {@link #BND_ICON_FORCE_CURVE ICON_FORCE_CURVE}
    • + *
    • {@link #BND_ICON_FORCE_BOID ICON_FORCE_BOID}
    • + *
    • {@link #BND_ICON_FORCE_TURBULENCE ICON_FORCE_TURBULENCE}
    • + *
    • {@link #BND_ICON_FORCE_DRAG ICON_FORCE_DRAG}
    • + *
    • {@link #BND_ICON_FORCE_SMOKEFLOW ICON_FORCE_SMOKEFLOW}
    • + *
    • {@link #BND_ICON_MODIFIER ICON_MODIFIER}
    • + *
    • {@link #BND_ICON_MOD_WAVE ICON_MOD_WAVE}
    • + *
    • {@link #BND_ICON_MOD_BUILD ICON_MOD_BUILD}
    • + *
    • {@link #BND_ICON_MOD_DECIM ICON_MOD_DECIM}
    • + *
    • {@link #BND_ICON_MOD_MIRROR ICON_MOD_MIRROR}
    • + *
    • {@link #BND_ICON_MOD_SOFT ICON_MOD_SOFT}
    • + *
    • {@link #BND_ICON_MOD_SUBSURF ICON_MOD_SUBSURF}
    • + *
    • {@link #BND_ICON_HOOK ICON_HOOK}
    • + *
    • {@link #BND_ICON_MOD_PHYSICS ICON_MOD_PHYSICS}
    • + *
    • {@link #BND_ICON_MOD_PARTICLES ICON_MOD_PARTICLES}
    • + *
    • {@link #BND_ICON_MOD_BOOLEAN ICON_MOD_BOOLEAN}
    • + *
    • {@link #BND_ICON_MOD_EDGESPLIT ICON_MOD_EDGESPLIT}
    • + *
    • {@link #BND_ICON_MOD_ARRAY ICON_MOD_ARRAY}
    • + *
    • {@link #BND_ICON_MOD_UVPROJECT ICON_MOD_UVPROJECT}
    • + *
    • {@link #BND_ICON_MOD_DISPLACE ICON_MOD_DISPLACE}
    • + *
    • {@link #BND_ICON_MOD_CURVE ICON_MOD_CURVE}
    • + *
    • {@link #BND_ICON_MOD_LATTICE ICON_MOD_LATTICE}
    • + *
    • {@link #BND_ICON_CONSTRAINT_DATA ICON_CONSTRAINT_DATA}
    • + *
    • {@link #BND_ICON_MOD_ARMATURE ICON_MOD_ARMATURE}
    • + *
    • {@link #BND_ICON_MOD_SHRINKWRAP ICON_MOD_SHRINKWRAP}
    • + *
    • {@link #BND_ICON_MOD_CAST ICON_MOD_CAST}
    • + *
    • {@link #BND_ICON_MOD_MESHDEFORM ICON_MOD_MESHDEFORM}
    • + *
    • {@link #BND_ICON_MOD_BEVEL ICON_MOD_BEVEL}
    • + *
    • {@link #BND_ICON_MOD_SMOOTH ICON_MOD_SMOOTH}
    • + *
    • {@link #BND_ICON_MOD_SIMPLEDEFORM ICON_MOD_SIMPLEDEFORM}
    • + *
    • {@link #BND_ICON_MOD_MASK ICON_MOD_MASK}
    • + *
    • {@link #BND_ICON_MOD_CLOTH ICON_MOD_CLOTH}
    • + *
    • {@link #BND_ICON_MOD_EXPLODE ICON_MOD_EXPLODE}
    • + *
    • {@link #BND_ICON_MOD_FLUIDSIM ICON_MOD_FLUIDSIM}
    • + *
    • {@link #BND_ICON_MOD_MULTIRES ICON_MOD_MULTIRES}
    • + *
    • {@link #BND_ICON_MOD_SMOKE ICON_MOD_SMOKE}
    • + *
    • {@link #BND_ICON_MOD_SOLIDIFY ICON_MOD_SOLIDIFY}
    • + *
    • {@link #BND_ICON_MOD_SCREW ICON_MOD_SCREW}
    • + *
    • {@link #BND_ICON_MOD_VERTEX_WEIGHT ICON_MOD_VERTEX_WEIGHT}
    • + *
    • {@link #BND_ICON_MOD_DYNAMICPAINT ICON_MOD_DYNAMICPAINT}
    • + *
    • {@link #BND_ICON_MOD_REMESH ICON_MOD_REMESH}
    • + *
    • {@link #BND_ICON_MOD_OCEAN ICON_MOD_OCEAN}
    • + *
    • {@link #BND_ICON_MOD_WARP ICON_MOD_WARP}
    • + *
    • {@link #BND_ICON_MOD_SKIN ICON_MOD_SKIN}
    • + *
    • {@link #BND_ICON_MOD_TRIANGULATE ICON_MOD_TRIANGULATE}
    • + *
    • {@link #BND_ICON_MOD_WIREFRAME ICON_MOD_WIREFRAME}
    • + *
    • {@link #BND_ICON_REC ICON_REC}
    • + *
    • {@link #BND_ICON_PLAY ICON_PLAY}
    • + *
    • {@link #BND_ICON_FF ICON_FF}
    • + *
    • {@link #BND_ICON_REW ICON_REW}
    • + *
    • {@link #BND_ICON_PAUSE ICON_PAUSE}
    • + *
    • {@link #BND_ICON_PREV_KEYFRAME ICON_PREV_KEYFRAME}
    • + *
    • {@link #BND_ICON_NEXT_KEYFRAME ICON_NEXT_KEYFRAME}
    • + *
    • {@link #BND_ICON_PLAY_AUDIO ICON_PLAY_AUDIO}
    • + *
    • {@link #BND_ICON_PLAY_REVERSE ICON_PLAY_REVERSE}
    • + *
    • {@link #BND_ICON_PREVIEW_RANGE ICON_PREVIEW_RANGE}
    • + *
    • {@link #BND_ICON_ACTION_TWEAK ICON_ACTION_TWEAK}
    • + *
    • {@link #BND_ICON_PMARKER_ACT ICON_PMARKER_ACT}
    • + *
    • {@link #BND_ICON_PMARKER_SEL ICON_PMARKER_SEL}
    • + *
    • {@link #BND_ICON_PMARKER ICON_PMARKER}
    • + *
    • {@link #BND_ICON_MARKER_HLT ICON_MARKER_HLT}
    • + *
    • {@link #BND_ICON_MARKER ICON_MARKER}
    • + *
    • {@link #BND_ICON_SPACE2 ICON_SPACE2}
    • + *
    • {@link #BND_ICON_SPACE3 ICON_SPACE3}
    • + *
    • {@link #BND_ICON_KEYINGSET ICON_KEYINGSET}
    • + *
    • {@link #BND_ICON_KEY_DEHLT ICON_KEY_DEHLT}
    • + *
    • {@link #BND_ICON_KEY_HLT ICON_KEY_HLT}
    • + *
    • {@link #BND_ICON_MUTE_IPO_OFF ICON_MUTE_IPO_OFF}
    • + *
    • {@link #BND_ICON_MUTE_IPO_ON ICON_MUTE_IPO_ON}
    • + *
    • {@link #BND_ICON_VISIBLE_IPO_OFF ICON_VISIBLE_IPO_OFF}
    • + *
    • {@link #BND_ICON_VISIBLE_IPO_ON ICON_VISIBLE_IPO_ON}
    • + *
    • {@link #BND_ICON_DRIVER ICON_DRIVER}
    • + *
    • {@link #BND_ICON_SOLO_OFF ICON_SOLO_OFF}
    • + *
    • {@link #BND_ICON_SOLO_ON ICON_SOLO_ON}
    • + *
    • {@link #BND_ICON_FRAME_PREV ICON_FRAME_PREV}
    • + *
    • {@link #BND_ICON_FRAME_NEXT ICON_FRAME_NEXT}
    • + *
    • {@link #BND_ICON_NLA_PUSHDOWN ICON_NLA_PUSHDOWN}
    • + *
    • {@link #BND_ICON_IPO_CONSTANT ICON_IPO_CONSTANT}
    • + *
    • {@link #BND_ICON_IPO_LINEAR ICON_IPO_LINEAR}
    • + *
    • {@link #BND_ICON_IPO_BEZIER ICON_IPO_BEZIER}
    • + *
    • {@link #BND_ICON_IPO_SINE ICON_IPO_SINE}
    • + *
    • {@link #BND_ICON_IPO_QUAD ICON_IPO_QUAD}
    • + *
    • {@link #BND_ICON_IPO_CUBIC ICON_IPO_CUBIC}
    • + *
    • {@link #BND_ICON_IPO_QUART ICON_IPO_QUART}
    • + *
    • {@link #BND_ICON_IPO_QUINT ICON_IPO_QUINT}
    • + *
    • {@link #BND_ICON_IPO_EXPO ICON_IPO_EXPO}
    • + *
    • {@link #BND_ICON_IPO_CIRC ICON_IPO_CIRC}
    • + *
    • {@link #BND_ICON_IPO_BOUNCE ICON_IPO_BOUNCE}
    • + *
    • {@link #BND_ICON_IPO_ELASTIC ICON_IPO_ELASTIC}
    • + *
    • {@link #BND_ICON_IPO_BACK ICON_IPO_BACK}
    • + *
    • {@link #BND_ICON_IPO_EASE_IN ICON_IPO_EASE_IN}
    • + *
    • {@link #BND_ICON_IPO_EASE_OUT ICON_IPO_EASE_OUT}
    • + *
    • {@link #BND_ICON_IPO_EASE_IN_OUT ICON_IPO_EASE_IN_OUT}
    • + *
    • {@link #BND_ICON_VERTEXSEL ICON_VERTEXSEL}
    • + *
    • {@link #BND_ICON_EDGESEL ICON_EDGESEL}
    • + *
    • {@link #BND_ICON_FACESEL ICON_FACESEL}
    • + *
    • {@link #BND_ICON_LOOPSEL ICON_LOOPSEL}
    • + *
    • {@link #BND_ICON_ROTATE ICON_ROTATE}
    • + *
    • {@link #BND_ICON_CURSOR ICON_CURSOR}
    • + *
    • {@link #BND_ICON_ROTATECOLLECTION ICON_ROTATECOLLECTION}
    • + *
    • {@link #BND_ICON_ROTATECENTER ICON_ROTATECENTER}
    • + *
    • {@link #BND_ICON_ROTACTIVE ICON_ROTACTIVE}
    • + *
    • {@link #BND_ICON_ALIGN ICON_ALIGN}
    • + *
    • {@link #BND_ICON_SMOOTHCURVE ICON_SMOOTHCURVE}
    • + *
    • {@link #BND_ICON_SPHERECURVE ICON_SPHERECURVE}
    • + *
    • {@link #BND_ICON_ROOTCURVE ICON_ROOTCURVE}
    • + *
    • {@link #BND_ICON_SHARPCURVE ICON_SHARPCURVE}
    • + *
    • {@link #BND_ICON_LINCURVE ICON_LINCURVE}
    • + *
    • {@link #BND_ICON_NOCURVE ICON_NOCURVE}
    • + *
    • {@link #BND_ICON_RNDCURVE ICON_RNDCURVE}
    • + *
    • {@link #BND_ICON_PROP_OFF ICON_PROP_OFF}
    • + *
    • {@link #BND_ICON_PROP_ON ICON_PROP_ON}
    • + *
    • {@link #BND_ICON_PROP_CON ICON_PROP_CON}
    • + *
    • {@link #BND_ICON_SCULPT_DYNTOPO ICON_SCULPT_DYNTOPO}
    • + *
    • {@link #BND_ICON_PARTICLE_POINT ICON_PARTICLE_POINT}
    • + *
    • {@link #BND_ICON_PARTICLE_TIP ICON_PARTICLE_TIP}
    • + *
    • {@link #BND_ICON_PARTICLE_PATH ICON_PARTICLE_PATH}
    • + *
    • {@link #BND_ICON_MAN_TRANS ICON_MAN_TRANS}
    • + *
    • {@link #BND_ICON_MAN_ROT ICON_MAN_ROT}
    • + *
    • {@link #BND_ICON_MAN_SCALE ICON_MAN_SCALE}
    • + *
    • {@link #BND_ICON_MANIPUL ICON_MANIPUL}
    • + *
    • {@link #BND_ICON_SNAP_OFF ICON_SNAP_OFF}
    • + *
    • {@link #BND_ICON_SNAP_ON ICON_SNAP_ON}
    • + *
    • {@link #BND_ICON_SNAP_NORMAL ICON_SNAP_NORMAL}
    • + *
    • {@link #BND_ICON_SNAP_INCREMENT ICON_SNAP_INCREMENT}
    • + *
    • {@link #BND_ICON_SNAP_VERTEX ICON_SNAP_VERTEX}
    • + *
    • {@link #BND_ICON_SNAP_EDGE ICON_SNAP_EDGE}
    • + *
    • {@link #BND_ICON_SNAP_FACE ICON_SNAP_FACE}
    • + *
    • {@link #BND_ICON_SNAP_VOLUME ICON_SNAP_VOLUME}
    • + *
    • {@link #BND_ICON_STICKY_UVS_LOC ICON_STICKY_UVS_LOC}
    • + *
    • {@link #BND_ICON_STICKY_UVS_DISABLE ICON_STICKY_UVS_DISABLE}
    • + *
    • {@link #BND_ICON_STICKY_UVS_VERT ICON_STICKY_UVS_VERT}
    • + *
    • {@link #BND_ICON_CLIPUV_DEHLT ICON_CLIPUV_DEHLT}
    • + *
    • {@link #BND_ICON_CLIPUV_HLT ICON_CLIPUV_HLT}
    • + *
    • {@link #BND_ICON_SNAP_PEEL_OBJECT ICON_SNAP_PEEL_OBJECT}
    • + *
    • {@link #BND_ICON_GRID ICON_GRID}
    • + *
    • {@link #BND_ICON_PASTEDOWN ICON_PASTEDOWN}
    • + *
    • {@link #BND_ICON_COPYDOWN ICON_COPYDOWN}
    • + *
    • {@link #BND_ICON_PASTEFLIPUP ICON_PASTEFLIPUP}
    • + *
    • {@link #BND_ICON_PASTEFLIPDOWN ICON_PASTEFLIPDOWN}
    • + *
    • {@link #BND_ICON_SNAP_SURFACE ICON_SNAP_SURFACE}
    • + *
    • {@link #BND_ICON_AUTOMERGE_ON ICON_AUTOMERGE_ON}
    • + *
    • {@link #BND_ICON_AUTOMERGE_OFF ICON_AUTOMERGE_OFF}
    • + *
    • {@link #BND_ICON_RETOPO ICON_RETOPO}
    • + *
    • {@link #BND_ICON_UV_VERTEXSEL ICON_UV_VERTEXSEL}
    • + *
    • {@link #BND_ICON_UV_EDGESEL ICON_UV_EDGESEL}
    • + *
    • {@link #BND_ICON_UV_FACESEL ICON_UV_FACESEL}
    • + *
    • {@link #BND_ICON_UV_ISLANDSEL ICON_UV_ISLANDSEL}
    • + *
    • {@link #BND_ICON_UV_SYNC_SELECT ICON_UV_SYNC_SELECT}
    • + *
    • {@link #BND_ICON_BBOX ICON_BBOX}
    • + *
    • {@link #BND_ICON_WIRE ICON_WIRE}
    • + *
    • {@link #BND_ICON_SOLID ICON_SOLID}
    • + *
    • {@link #BND_ICON_SMOOTH ICON_SMOOTH}
    • + *
    • {@link #BND_ICON_POTATO ICON_POTATO}
    • + *
    • {@link #BND_ICON_ORTHO ICON_ORTHO}
    • + *
    • {@link #BND_ICON_LOCKVIEW_OFF ICON_LOCKVIEW_OFF}
    • + *
    • {@link #BND_ICON_LOCKVIEW_ON ICON_LOCKVIEW_ON}
    • + *
    • {@link #BND_ICON_AXIS_SIDE ICON_AXIS_SIDE}
    • + *
    • {@link #BND_ICON_AXIS_FRONT ICON_AXIS_FRONT}
    • + *
    • {@link #BND_ICON_AXIS_TOP ICON_AXIS_TOP}
    • + *
    • {@link #BND_ICON_NDOF_DOM ICON_NDOF_DOM}
    • + *
    • {@link #BND_ICON_NDOF_TURN ICON_NDOF_TURN}
    • + *
    • {@link #BND_ICON_NDOF_FLY ICON_NDOF_FLY}
    • + *
    • {@link #BND_ICON_NDOF_TRANS ICON_NDOF_TRANS}
    • + *
    • {@link #BND_ICON_LAYER_USED ICON_LAYER_USED}
    • + *
    • {@link #BND_ICON_LAYER_ACTIVE ICON_LAYER_ACTIVE}
    • + *
    • {@link #BND_ICON_SORTALPHA ICON_SORTALPHA}
    • + *
    • {@link #BND_ICON_SORTBYEXT ICON_SORTBYEXT}
    • + *
    • {@link #BND_ICON_SORTTIME ICON_SORTTIME}
    • + *
    • {@link #BND_ICON_SORTSIZE ICON_SORTSIZE}
    • + *
    • {@link #BND_ICON_LONGDISPLAY ICON_LONGDISPLAY}
    • + *
    • {@link #BND_ICON_SHORTDISPLAY ICON_SHORTDISPLAY}
    • + *
    • {@link #BND_ICON_GHOST ICON_GHOST}
    • + *
    • {@link #BND_ICON_IMGDISPLAY ICON_IMGDISPLAY}
    • + *
    • {@link #BND_ICON_SAVE_AS ICON_SAVE_AS}
    • + *
    • {@link #BND_ICON_SAVE_COPY ICON_SAVE_COPY}
    • + *
    • {@link #BND_ICON_BOOKMARKS ICON_BOOKMARKS}
    • + *
    • {@link #BND_ICON_FONTPREVIEW ICON_FONTPREVIEW}
    • + *
    • {@link #BND_ICON_FILTER ICON_FILTER}
    • + *
    • {@link #BND_ICON_NEWFOLDER ICON_NEWFOLDER}
    • + *
    • {@link #BND_ICON_OPEN_RECENT ICON_OPEN_RECENT}
    • + *
    • {@link #BND_ICON_FILE_PARENT ICON_FILE_PARENT}
    • + *
    • {@link #BND_ICON_FILE_REFRESH ICON_FILE_REFRESH}
    • + *
    • {@link #BND_ICON_FILE_FOLDER ICON_FILE_FOLDER}
    • + *
    • {@link #BND_ICON_FILE_BLANK ICON_FILE_BLANK}
    • + *
    • {@link #BND_ICON_FILE_BLEND ICON_FILE_BLEND}
    • + *
    • {@link #BND_ICON_FILE_IMAGE ICON_FILE_IMAGE}
    • + *
    • {@link #BND_ICON_FILE_MOVIE ICON_FILE_MOVIE}
    • + *
    • {@link #BND_ICON_FILE_SCRIPT ICON_FILE_SCRIPT}
    • + *
    • {@link #BND_ICON_FILE_SOUND ICON_FILE_SOUND}
    • + *
    • {@link #BND_ICON_FILE_FONT ICON_FILE_FONT}
    • + *
    • {@link #BND_ICON_FILE_TEXT ICON_FILE_TEXT}
    • + *
    • {@link #BND_ICON_RECOVER_AUTO ICON_RECOVER_AUTO}
    • + *
    • {@link #BND_ICON_SAVE_PREFS ICON_SAVE_PREFS}
    • + *
    • {@link #BND_ICON_LINK_BLEND ICON_LINK_BLEND}
    • + *
    • {@link #BND_ICON_APPEND_BLEND ICON_APPEND_BLEND}
    • + *
    • {@link #BND_ICON_IMPORT ICON_IMPORT}
    • + *
    • {@link #BND_ICON_EXPORT ICON_EXPORT}
    • + *
    • {@link #BND_ICON_EXTERNAL_DATA ICON_EXTERNAL_DATA}
    • + *
    • {@link #BND_ICON_LOAD_FACTORY ICON_LOAD_FACTORY}
    • + *
    • {@link #BND_ICON_LOOP_BACK ICON_LOOP_BACK}
    • + *
    • {@link #BND_ICON_LOOP_FORWARDS ICON_LOOP_FORWARDS}
    • + *
    • {@link #BND_ICON_BACK ICON_BACK}
    • + *
    • {@link #BND_ICON_FORWARD ICON_FORWARD}
    • + *
    • {@link #BND_ICON_FILE_BACKUP ICON_FILE_BACKUP}
    • + *
    • {@link #BND_ICON_DISK_DRIVE ICON_DISK_DRIVE}
    • + *
    • {@link #BND_ICON_MATPLANE ICON_MATPLANE}
    • + *
    • {@link #BND_ICON_MATSPHERE ICON_MATSPHERE}
    • + *
    • {@link #BND_ICON_MATCUBE ICON_MATCUBE}
    • + *
    • {@link #BND_ICON_MONKEY ICON_MONKEY}
    • + *
    • {@link #BND_ICON_HAIR ICON_HAIR}
    • + *
    • {@link #BND_ICON_ALIASED ICON_ALIASED}
    • + *
    • {@link #BND_ICON_ANTIALIASED ICON_ANTIALIASED}
    • + *
    • {@link #BND_ICON_MAT_SPHERE_SKY ICON_MAT_SPHERE_SKY}
    • + *
    • {@link #BND_ICON_WORDWRAP_OFF ICON_WORDWRAP_OFF}
    • + *
    • {@link #BND_ICON_WORDWRAP_ON ICON_WORDWRAP_ON}
    • + *
    • {@link #BND_ICON_SYNTAX_OFF ICON_SYNTAX_OFF}
    • + *
    • {@link #BND_ICON_SYNTAX_ON ICON_SYNTAX_ON}
    • + *
    • {@link #BND_ICON_LINENUMBERS_OFF ICON_LINENUMBERS_OFF}
    • + *
    • {@link #BND_ICON_LINENUMBERS_ON ICON_LINENUMBERS_ON}
    • + *
    • {@link #BND_ICON_SCRIPTPLUGINS ICON_SCRIPTPLUGINS}
    • + *
    • {@link #BND_ICON_SEQ_SEQUENCER ICON_SEQ_SEQUENCER}
    • + *
    • {@link #BND_ICON_SEQ_PREVIEW ICON_SEQ_PREVIEW}
    • + *
    • {@link #BND_ICON_SEQ_LUMA_WAVEFORM ICON_SEQ_LUMA_WAVEFORM}
    • + *
    • {@link #BND_ICON_SEQ_CHROMA_SCOPE ICON_SEQ_CHROMA_SCOPE}
    • + *
    • {@link #BND_ICON_SEQ_HISTOGRAM ICON_SEQ_HISTOGRAM}
    • + *
    • {@link #BND_ICON_SEQ_SPLITVIEW ICON_SEQ_SPLITVIEW}
    • + *
    • {@link #BND_ICON_IMAGE_RGB ICON_IMAGE_RGB}
    • + *
    • {@link #BND_ICON_IMAGE_RGB_ALPHA ICON_IMAGE_RGB_ALPHA}
    • + *
    • {@link #BND_ICON_IMAGE_ALPHA ICON_IMAGE_ALPHA}
    • + *
    • {@link #BND_ICON_IMAGE_ZDEPTH ICON_IMAGE_ZDEPTH}
    • + *
    • {@link #BND_ICON_IMAGEFILE ICON_IMAGEFILE}
    • + *
    + */ + public static final int + BND_ICON_NONE = BND_ICONID(0,29), + BND_ICON_QUESTION = BND_ICONID(1,29), + BND_ICON_ERROR = BND_ICONID(2,29), + BND_ICON_CANCEL = BND_ICONID(3,29), + BND_ICON_TRIA_RIGHT = BND_ICONID(4,29), + BND_ICON_TRIA_DOWN = BND_ICONID(5,29), + BND_ICON_TRIA_LEFT = BND_ICONID(6,29), + BND_ICON_TRIA_UP = BND_ICONID(7,29), + BND_ICON_ARROW_LEFTRIGHT = BND_ICONID(8,29), + BND_ICON_PLUS = BND_ICONID(9,29), + BND_ICON_DISCLOSURE_TRI_DOWN = BND_ICONID(10,29), + BND_ICON_DISCLOSURE_TRI_RIGHT = BND_ICONID(11,29), + BND_ICON_RADIOBUT_OFF = BND_ICONID(12,29), + BND_ICON_RADIOBUT_ON = BND_ICONID(13,29), + BND_ICON_MENU_PANEL = BND_ICONID(14,29), + BND_ICON_BLENDER = BND_ICONID(15,29), + BND_ICON_GRIP = BND_ICONID(16,29), + BND_ICON_DOT = BND_ICONID(17,29), + BND_ICON_COLLAPSEMENU = BND_ICONID(18,29), + BND_ICON_X = BND_ICONID(19,29), + BND_ICON_GO_LEFT = BND_ICONID(21,29), + BND_ICON_PLUG = BND_ICONID(22,29), + BND_ICON_UI = BND_ICONID(23,29), + BND_ICON_NODE = BND_ICONID(24,29), + BND_ICON_NODE_SEL = BND_ICONID(25,29), + BND_ICON_FULLSCREEN = BND_ICONID(0,28), + BND_ICON_SPLITSCREEN = BND_ICONID(1,28), + BND_ICON_RIGHTARROW_THIN = BND_ICONID(2,28), + BND_ICON_BORDERMOVE = BND_ICONID(3,28), + BND_ICON_VIEWZOOM = BND_ICONID(4,28), + BND_ICON_ZOOMIN = BND_ICONID(5,28), + BND_ICON_ZOOMOUT = BND_ICONID(6,28), + BND_ICON_PANEL_CLOSE = BND_ICONID(7,28), + BND_ICON_COPY_ID = BND_ICONID(8,28), + BND_ICON_EYEDROPPER = BND_ICONID(9,28), + BND_ICON_LINK_AREA = BND_ICONID(10,28), + BND_ICON_AUTO = BND_ICONID(11,28), + BND_ICON_CHECKBOX_DEHLT = BND_ICONID(12,28), + BND_ICON_CHECKBOX_HLT = BND_ICONID(13,28), + BND_ICON_UNLOCKED = BND_ICONID(14,28), + BND_ICON_LOCKED = BND_ICONID(15,28), + BND_ICON_UNPINNED = BND_ICONID(16,28), + BND_ICON_PINNED = BND_ICONID(17,28), + BND_ICON_SCREEN_BACK = BND_ICONID(18,28), + BND_ICON_RIGHTARROW = BND_ICONID(19,28), + BND_ICON_DOWNARROW_HLT = BND_ICONID(20,28), + BND_ICON_DOTSUP = BND_ICONID(21,28), + BND_ICON_DOTSDOWN = BND_ICONID(22,28), + BND_ICON_LINK = BND_ICONID(23,28), + BND_ICON_INLINK = BND_ICONID(24,28), + BND_ICON_PLUGIN = BND_ICONID(25,28), + BND_ICON_HELP = BND_ICONID(0,27), + BND_ICON_GHOST_ENABLED = BND_ICONID(1,27), + BND_ICON_COLOR = BND_ICONID(2,27), + BND_ICON_LINKED = BND_ICONID(3,27), + BND_ICON_UNLINKED = BND_ICONID(4,27), + BND_ICON_HAND = BND_ICONID(5,27), + BND_ICON_ZOOM_ALL = BND_ICONID(6,27), + BND_ICON_ZOOM_SELECTED = BND_ICONID(7,27), + BND_ICON_ZOOM_PREVIOUS = BND_ICONID(8,27), + BND_ICON_ZOOM_IN = BND_ICONID(9,27), + BND_ICON_ZOOM_OUT = BND_ICONID(10,27), + BND_ICON_RENDER_REGION = BND_ICONID(11,27), + BND_ICON_BORDER_RECT = BND_ICONID(12,27), + BND_ICON_BORDER_LASSO = BND_ICONID(13,27), + BND_ICON_FREEZE = BND_ICONID(14,27), + BND_ICON_STYLUS_PRESSURE = BND_ICONID(15,27), + BND_ICON_GHOST_DISABLED = BND_ICONID(16,27), + BND_ICON_NEW = BND_ICONID(17,27), + BND_ICON_FILE_TICK = BND_ICONID(18,27), + BND_ICON_QUIT = BND_ICONID(19,27), + BND_ICON_URL = BND_ICONID(20,27), + BND_ICON_RECOVER_LAST = BND_ICONID(21,27), + BND_ICON_FULLSCREEN_ENTER = BND_ICONID(23,27), + BND_ICON_FULLSCREEN_EXIT = BND_ICONID(24,27), + BND_ICON_BLANK1 = BND_ICONID(25,27), + BND_ICON_LAMP = BND_ICONID(0,26), + BND_ICON_MATERIAL = BND_ICONID(1,26), + BND_ICON_TEXTURE = BND_ICONID(2,26), + BND_ICON_ANIM = BND_ICONID(3,26), + BND_ICON_WORLD = BND_ICONID(4,26), + BND_ICON_SCENE = BND_ICONID(5,26), + BND_ICON_EDIT = BND_ICONID(6,26), + BND_ICON_GAME = BND_ICONID(7,26), + BND_ICON_RADIO = BND_ICONID(8,26), + BND_ICON_SCRIPT = BND_ICONID(9,26), + BND_ICON_PARTICLES = BND_ICONID(10,26), + BND_ICON_PHYSICS = BND_ICONID(11,26), + BND_ICON_SPEAKER = BND_ICONID(12,26), + BND_ICON_TEXTURE_SHADED = BND_ICONID(13,26), + BND_ICON_VIEW3D = BND_ICONID(0,25), + BND_ICON_IPO = BND_ICONID(1,25), + BND_ICON_OOPS = BND_ICONID(2,25), + BND_ICON_BUTS = BND_ICONID(3,25), + BND_ICON_FILESEL = BND_ICONID(4,25), + BND_ICON_IMAGE_COL = BND_ICONID(5,25), + BND_ICON_INFO = BND_ICONID(6,25), + BND_ICON_SEQUENCE = BND_ICONID(7,25), + BND_ICON_TEXT = BND_ICONID(8,25), + BND_ICON_IMASEL = BND_ICONID(9,25), + BND_ICON_SOUND = BND_ICONID(10,25), + BND_ICON_ACTION = BND_ICONID(11,25), + BND_ICON_NLA = BND_ICONID(12,25), + BND_ICON_SCRIPTWIN = BND_ICONID(13,25), + BND_ICON_TIME = BND_ICONID(14,25), + BND_ICON_NODETREE = BND_ICONID(15,25), + BND_ICON_LOGIC = BND_ICONID(16,25), + BND_ICON_CONSOLE = BND_ICONID(17,25), + BND_ICON_PREFERENCES = BND_ICONID(18,25), + BND_ICON_CLIP = BND_ICONID(19,25), + BND_ICON_ASSET_MANAGER = BND_ICONID(20,25), + BND_ICON_OBJECT_DATAMODE = BND_ICONID(0,24), + BND_ICON_EDITMODE_HLT = BND_ICONID(1,24), + BND_ICON_FACESEL_HLT = BND_ICONID(2,24), + BND_ICON_VPAINT_HLT = BND_ICONID(3,24), + BND_ICON_TPAINT_HLT = BND_ICONID(4,24), + BND_ICON_WPAINT_HLT = BND_ICONID(5,24), + BND_ICON_SCULPTMODE_HLT = BND_ICONID(6,24), + BND_ICON_POSE_HLT = BND_ICONID(7,24), + BND_ICON_PARTICLEMODE = BND_ICONID(8,24), + BND_ICON_LIGHTPAINT = BND_ICONID(9,24), + BND_ICON_SCENE_DATA = BND_ICONID(0,23), + BND_ICON_RENDERLAYERS = BND_ICONID(1,23), + BND_ICON_WORLD_DATA = BND_ICONID(2,23), + BND_ICON_OBJECT_DATA = BND_ICONID(3,23), + BND_ICON_MESH_DATA = BND_ICONID(4,23), + BND_ICON_CURVE_DATA = BND_ICONID(5,23), + BND_ICON_META_DATA = BND_ICONID(6,23), + BND_ICON_LATTICE_DATA = BND_ICONID(7,23), + BND_ICON_LAMP_DATA = BND_ICONID(8,23), + BND_ICON_MATERIAL_DATA = BND_ICONID(9,23), + BND_ICON_TEXTURE_DATA = BND_ICONID(10,23), + BND_ICON_ANIM_DATA = BND_ICONID(11,23), + BND_ICON_CAMERA_DATA = BND_ICONID(12,23), + BND_ICON_PARTICLE_DATA = BND_ICONID(13,23), + BND_ICON_LIBRARY_DATA_DIRECT = BND_ICONID(14,23), + BND_ICON_GROUP = BND_ICONID(15,23), + BND_ICON_ARMATURE_DATA = BND_ICONID(16,23), + BND_ICON_POSE_DATA = BND_ICONID(17,23), + BND_ICON_BONE_DATA = BND_ICONID(18,23), + BND_ICON_CONSTRAINT = BND_ICONID(19,23), + BND_ICON_SHAPEKEY_DATA = BND_ICONID(20,23), + BND_ICON_CONSTRAINT_BONE = BND_ICONID(21,23), + BND_ICON_CAMERA_STEREO = BND_ICONID(22,23), + BND_ICON_PACKAGE = BND_ICONID(23,23), + BND_ICON_UGLYPACKAGE = BND_ICONID(24,23), + BND_ICON_BRUSH_DATA = BND_ICONID(0,22), + BND_ICON_IMAGE_DATA = BND_ICONID(1,22), + BND_ICON_FILE = BND_ICONID(2,22), + BND_ICON_FCURVE = BND_ICONID(3,22), + BND_ICON_FONT_DATA = BND_ICONID(4,22), + BND_ICON_RENDER_RESULT = BND_ICONID(5,22), + BND_ICON_SURFACE_DATA = BND_ICONID(6,22), + BND_ICON_EMPTY_DATA = BND_ICONID(7,22), + BND_ICON_SETTINGS = BND_ICONID(8,22), + BND_ICON_RENDER_ANIMATION = BND_ICONID(9,22), + BND_ICON_RENDER_STILL = BND_ICONID(10,22), + BND_ICON_BOIDS = BND_ICONID(12,22), + BND_ICON_STRANDS = BND_ICONID(13,22), + BND_ICON_LIBRARY_DATA_INDIRECT = BND_ICONID(14,22), + BND_ICON_GREASEPENCIL = BND_ICONID(15,22), + BND_ICON_LINE_DATA = BND_ICONID(16,22), + BND_ICON_GROUP_BONE = BND_ICONID(18,22), + BND_ICON_GROUP_VERTEX = BND_ICONID(19,22), + BND_ICON_GROUP_VCOL = BND_ICONID(20,22), + BND_ICON_GROUP_UVS = BND_ICONID(21,22), + BND_ICON_RNA = BND_ICONID(24,22), + BND_ICON_RNA_ADD = BND_ICONID(25,22), + BND_ICON_OUTLINER_OB_EMPTY = BND_ICONID(0,20), + BND_ICON_OUTLINER_OB_MESH = BND_ICONID(1,20), + BND_ICON_OUTLINER_OB_CURVE = BND_ICONID(2,20), + BND_ICON_OUTLINER_OB_LATTICE = BND_ICONID(3,20), + BND_ICON_OUTLINER_OB_META = BND_ICONID(4,20), + BND_ICON_OUTLINER_OB_LAMP = BND_ICONID(5,20), + BND_ICON_OUTLINER_OB_CAMERA = BND_ICONID(6,20), + BND_ICON_OUTLINER_OB_ARMATURE = BND_ICONID(7,20), + BND_ICON_OUTLINER_OB_FONT = BND_ICONID(8,20), + BND_ICON_OUTLINER_OB_SURFACE = BND_ICONID(9,20), + BND_ICON_OUTLINER_OB_SPEAKER = BND_ICONID(10,20), + BND_ICON_RESTRICT_VIEW_OFF = BND_ICONID(19,20), + BND_ICON_RESTRICT_VIEW_ON = BND_ICONID(20,20), + BND_ICON_RESTRICT_SELECT_OFF = BND_ICONID(21,20), + BND_ICON_RESTRICT_SELECT_ON = BND_ICONID(22,20), + BND_ICON_RESTRICT_RENDER_OFF = BND_ICONID(23,20), + BND_ICON_RESTRICT_RENDER_ON = BND_ICONID(24,20), + BND_ICON_OUTLINER_DATA_EMPTY = BND_ICONID(0,19), + BND_ICON_OUTLINER_DATA_MESH = BND_ICONID(1,19), + BND_ICON_OUTLINER_DATA_CURVE = BND_ICONID(2,19), + BND_ICON_OUTLINER_DATA_LATTICE = BND_ICONID(3,19), + BND_ICON_OUTLINER_DATA_META = BND_ICONID(4,19), + BND_ICON_OUTLINER_DATA_LAMP = BND_ICONID(5,19), + BND_ICON_OUTLINER_DATA_CAMERA = BND_ICONID(6,19), + BND_ICON_OUTLINER_DATA_ARMATURE = BND_ICONID(7,19), + BND_ICON_OUTLINER_DATA_FONT = BND_ICONID(8,19), + BND_ICON_OUTLINER_DATA_SURFACE = BND_ICONID(9,19), + BND_ICON_OUTLINER_DATA_SPEAKER = BND_ICONID(10,19), + BND_ICON_OUTLINER_DATA_POSE = BND_ICONID(11,19), + BND_ICON_MESH_PLANE = BND_ICONID(0,18), + BND_ICON_MESH_CUBE = BND_ICONID(1,18), + BND_ICON_MESH_CIRCLE = BND_ICONID(2,18), + BND_ICON_MESH_UVSPHERE = BND_ICONID(3,18), + BND_ICON_MESH_ICOSPHERE = BND_ICONID(4,18), + BND_ICON_MESH_GRID = BND_ICONID(5,18), + BND_ICON_MESH_MONKEY = BND_ICONID(6,18), + BND_ICON_MESH_CYLINDER = BND_ICONID(7,18), + BND_ICON_MESH_TORUS = BND_ICONID(8,18), + BND_ICON_MESH_CONE = BND_ICONID(9,18), + BND_ICON_LAMP_POINT = BND_ICONID(12,18), + BND_ICON_LAMP_SUN = BND_ICONID(13,18), + BND_ICON_LAMP_SPOT = BND_ICONID(14,18), + BND_ICON_LAMP_HEMI = BND_ICONID(15,18), + BND_ICON_LAMP_AREA = BND_ICONID(16,18), + BND_ICON_META_EMPTY = BND_ICONID(19,18), + BND_ICON_META_PLANE = BND_ICONID(20,18), + BND_ICON_META_CUBE = BND_ICONID(21,18), + BND_ICON_META_BALL = BND_ICONID(22,18), + BND_ICON_META_ELLIPSOID = BND_ICONID(23,18), + BND_ICON_META_CAPSULE = BND_ICONID(24,18), + BND_ICON_SURFACE_NCURVE = BND_ICONID(0,17), + BND_ICON_SURFACE_NCIRCLE = BND_ICONID(1,17), + BND_ICON_SURFACE_NSURFACE = BND_ICONID(2,17), + BND_ICON_SURFACE_NCYLINDER = BND_ICONID(3,17), + BND_ICON_SURFACE_NSPHERE = BND_ICONID(4,17), + BND_ICON_SURFACE_NTORUS = BND_ICONID(5,17), + BND_ICON_CURVE_BEZCURVE = BND_ICONID(9,17), + BND_ICON_CURVE_BEZCIRCLE = BND_ICONID(10,17), + BND_ICON_CURVE_NCURVE = BND_ICONID(11,17), + BND_ICON_CURVE_NCIRCLE = BND_ICONID(12,17), + BND_ICON_CURVE_PATH = BND_ICONID(13,17), + BND_ICON_COLOR_RED = BND_ICONID(19,17), + BND_ICON_COLOR_GREEN = BND_ICONID(20,17), + BND_ICON_COLOR_BLUE = BND_ICONID(21,17), + BND_ICON_FORCE_FORCE = BND_ICONID(0,16), + BND_ICON_FORCE_WIND = BND_ICONID(1,16), + BND_ICON_FORCE_VORTEX = BND_ICONID(2,16), + BND_ICON_FORCE_MAGNETIC = BND_ICONID(3,16), + BND_ICON_FORCE_HARMONIC = BND_ICONID(4,16), + BND_ICON_FORCE_CHARGE = BND_ICONID(5,16), + BND_ICON_FORCE_LENNARDJONES = BND_ICONID(6,16), + BND_ICON_FORCE_TEXTURE = BND_ICONID(7,16), + BND_ICON_FORCE_CURVE = BND_ICONID(8,16), + BND_ICON_FORCE_BOID = BND_ICONID(9,16), + BND_ICON_FORCE_TURBULENCE = BND_ICONID(10,16), + BND_ICON_FORCE_DRAG = BND_ICONID(11,16), + BND_ICON_FORCE_SMOKEFLOW = BND_ICONID(12,16), + BND_ICON_MODIFIER = BND_ICONID(0,12), + BND_ICON_MOD_WAVE = BND_ICONID(1,12), + BND_ICON_MOD_BUILD = BND_ICONID(2,12), + BND_ICON_MOD_DECIM = BND_ICONID(3,12), + BND_ICON_MOD_MIRROR = BND_ICONID(4,12), + BND_ICON_MOD_SOFT = BND_ICONID(5,12), + BND_ICON_MOD_SUBSURF = BND_ICONID(6,12), + BND_ICON_HOOK = BND_ICONID(7,12), + BND_ICON_MOD_PHYSICS = BND_ICONID(8,12), + BND_ICON_MOD_PARTICLES = BND_ICONID(9,12), + BND_ICON_MOD_BOOLEAN = BND_ICONID(10,12), + BND_ICON_MOD_EDGESPLIT = BND_ICONID(11,12), + BND_ICON_MOD_ARRAY = BND_ICONID(12,12), + BND_ICON_MOD_UVPROJECT = BND_ICONID(13,12), + BND_ICON_MOD_DISPLACE = BND_ICONID(14,12), + BND_ICON_MOD_CURVE = BND_ICONID(15,12), + BND_ICON_MOD_LATTICE = BND_ICONID(16,12), + BND_ICON_CONSTRAINT_DATA = BND_ICONID(17,12), + BND_ICON_MOD_ARMATURE = BND_ICONID(18,12), + BND_ICON_MOD_SHRINKWRAP = BND_ICONID(19,12), + BND_ICON_MOD_CAST = BND_ICONID(20,12), + BND_ICON_MOD_MESHDEFORM = BND_ICONID(21,12), + BND_ICON_MOD_BEVEL = BND_ICONID(22,12), + BND_ICON_MOD_SMOOTH = BND_ICONID(23,12), + BND_ICON_MOD_SIMPLEDEFORM = BND_ICONID(24,12), + BND_ICON_MOD_MASK = BND_ICONID(25,12), + BND_ICON_MOD_CLOTH = BND_ICONID(0,11), + BND_ICON_MOD_EXPLODE = BND_ICONID(1,11), + BND_ICON_MOD_FLUIDSIM = BND_ICONID(2,11), + BND_ICON_MOD_MULTIRES = BND_ICONID(3,11), + BND_ICON_MOD_SMOKE = BND_ICONID(4,11), + BND_ICON_MOD_SOLIDIFY = BND_ICONID(5,11), + BND_ICON_MOD_SCREW = BND_ICONID(6,11), + BND_ICON_MOD_VERTEX_WEIGHT = BND_ICONID(7,11), + BND_ICON_MOD_DYNAMICPAINT = BND_ICONID(8,11), + BND_ICON_MOD_REMESH = BND_ICONID(9,11), + BND_ICON_MOD_OCEAN = BND_ICONID(10,11), + BND_ICON_MOD_WARP = BND_ICONID(11,11), + BND_ICON_MOD_SKIN = BND_ICONID(12,11), + BND_ICON_MOD_TRIANGULATE = BND_ICONID(13,11), + BND_ICON_MOD_WIREFRAME = BND_ICONID(14,11), + BND_ICON_REC = BND_ICONID(0,10), + BND_ICON_PLAY = BND_ICONID(1,10), + BND_ICON_FF = BND_ICONID(2,10), + BND_ICON_REW = BND_ICONID(3,10), + BND_ICON_PAUSE = BND_ICONID(4,10), + BND_ICON_PREV_KEYFRAME = BND_ICONID(5,10), + BND_ICON_NEXT_KEYFRAME = BND_ICONID(6,10), + BND_ICON_PLAY_AUDIO = BND_ICONID(7,10), + BND_ICON_PLAY_REVERSE = BND_ICONID(8,10), + BND_ICON_PREVIEW_RANGE = BND_ICONID(9,10), + BND_ICON_ACTION_TWEAK = BND_ICONID(10,10), + BND_ICON_PMARKER_ACT = BND_ICONID(11,10), + BND_ICON_PMARKER_SEL = BND_ICONID(12,10), + BND_ICON_PMARKER = BND_ICONID(13,10), + BND_ICON_MARKER_HLT = BND_ICONID(14,10), + BND_ICON_MARKER = BND_ICONID(15,10), + BND_ICON_SPACE2 = BND_ICONID(16,10), + BND_ICON_SPACE3 = BND_ICONID(17,10), + BND_ICON_KEYINGSET = BND_ICONID(18,10), + BND_ICON_KEY_DEHLT = BND_ICONID(19,10), + BND_ICON_KEY_HLT = BND_ICONID(20,10), + BND_ICON_MUTE_IPO_OFF = BND_ICONID(21,10), + BND_ICON_MUTE_IPO_ON = BND_ICONID(22,10), + BND_ICON_VISIBLE_IPO_OFF = BND_ICONID(23,10), + BND_ICON_VISIBLE_IPO_ON = BND_ICONID(24,10), + BND_ICON_DRIVER = BND_ICONID(25,10), + BND_ICON_SOLO_OFF = BND_ICONID(0,9), + BND_ICON_SOLO_ON = BND_ICONID(1,9), + BND_ICON_FRAME_PREV = BND_ICONID(2,9), + BND_ICON_FRAME_NEXT = BND_ICONID(3,9), + BND_ICON_NLA_PUSHDOWN = BND_ICONID(4,9), + BND_ICON_IPO_CONSTANT = BND_ICONID(5,9), + BND_ICON_IPO_LINEAR = BND_ICONID(6,9), + BND_ICON_IPO_BEZIER = BND_ICONID(7,9), + BND_ICON_IPO_SINE = BND_ICONID(8,9), + BND_ICON_IPO_QUAD = BND_ICONID(9,9), + BND_ICON_IPO_CUBIC = BND_ICONID(10,9), + BND_ICON_IPO_QUART = BND_ICONID(11,9), + BND_ICON_IPO_QUINT = BND_ICONID(12,9), + BND_ICON_IPO_EXPO = BND_ICONID(13,9), + BND_ICON_IPO_CIRC = BND_ICONID(14,9), + BND_ICON_IPO_BOUNCE = BND_ICONID(15,9), + BND_ICON_IPO_ELASTIC = BND_ICONID(16,9), + BND_ICON_IPO_BACK = BND_ICONID(17,9), + BND_ICON_IPO_EASE_IN = BND_ICONID(18,9), + BND_ICON_IPO_EASE_OUT = BND_ICONID(19,9), + BND_ICON_IPO_EASE_IN_OUT = BND_ICONID(20,9), + BND_ICON_VERTEXSEL = BND_ICONID(0,8), + BND_ICON_EDGESEL = BND_ICONID(1,8), + BND_ICON_FACESEL = BND_ICONID(2,8), + BND_ICON_LOOPSEL = BND_ICONID(3,8), + BND_ICON_ROTATE = BND_ICONID(5,8), + BND_ICON_CURSOR = BND_ICONID(6,8), + BND_ICON_ROTATECOLLECTION = BND_ICONID(7,8), + BND_ICON_ROTATECENTER = BND_ICONID(8,8), + BND_ICON_ROTACTIVE = BND_ICONID(9,8), + BND_ICON_ALIGN = BND_ICONID(10,8), + BND_ICON_SMOOTHCURVE = BND_ICONID(12,8), + BND_ICON_SPHERECURVE = BND_ICONID(13,8), + BND_ICON_ROOTCURVE = BND_ICONID(14,8), + BND_ICON_SHARPCURVE = BND_ICONID(15,8), + BND_ICON_LINCURVE = BND_ICONID(16,8), + BND_ICON_NOCURVE = BND_ICONID(17,8), + BND_ICON_RNDCURVE = BND_ICONID(18,8), + BND_ICON_PROP_OFF = BND_ICONID(19,8), + BND_ICON_PROP_ON = BND_ICONID(20,8), + BND_ICON_PROP_CON = BND_ICONID(21,8), + BND_ICON_SCULPT_DYNTOPO = BND_ICONID(22,8), + BND_ICON_PARTICLE_POINT = BND_ICONID(23,8), + BND_ICON_PARTICLE_TIP = BND_ICONID(24,8), + BND_ICON_PARTICLE_PATH = BND_ICONID(25,8), + BND_ICON_MAN_TRANS = BND_ICONID(0,7), + BND_ICON_MAN_ROT = BND_ICONID(1,7), + BND_ICON_MAN_SCALE = BND_ICONID(2,7), + BND_ICON_MANIPUL = BND_ICONID(3,7), + BND_ICON_SNAP_OFF = BND_ICONID(4,7), + BND_ICON_SNAP_ON = BND_ICONID(5,7), + BND_ICON_SNAP_NORMAL = BND_ICONID(6,7), + BND_ICON_SNAP_INCREMENT = BND_ICONID(7,7), + BND_ICON_SNAP_VERTEX = BND_ICONID(8,7), + BND_ICON_SNAP_EDGE = BND_ICONID(9,7), + BND_ICON_SNAP_FACE = BND_ICONID(10,7), + BND_ICON_SNAP_VOLUME = BND_ICONID(11,7), + BND_ICON_STICKY_UVS_LOC = BND_ICONID(13,7), + BND_ICON_STICKY_UVS_DISABLE = BND_ICONID(14,7), + BND_ICON_STICKY_UVS_VERT = BND_ICONID(15,7), + BND_ICON_CLIPUV_DEHLT = BND_ICONID(16,7), + BND_ICON_CLIPUV_HLT = BND_ICONID(17,7), + BND_ICON_SNAP_PEEL_OBJECT = BND_ICONID(18,7), + BND_ICON_GRID = BND_ICONID(19,7), + BND_ICON_PASTEDOWN = BND_ICONID(0,6), + BND_ICON_COPYDOWN = BND_ICONID(1,6), + BND_ICON_PASTEFLIPUP = BND_ICONID(2,6), + BND_ICON_PASTEFLIPDOWN = BND_ICONID(3,6), + BND_ICON_SNAP_SURFACE = BND_ICONID(8,6), + BND_ICON_AUTOMERGE_ON = BND_ICONID(9,6), + BND_ICON_AUTOMERGE_OFF = BND_ICONID(10,6), + BND_ICON_RETOPO = BND_ICONID(11,6), + BND_ICON_UV_VERTEXSEL = BND_ICONID(12,6), + BND_ICON_UV_EDGESEL = BND_ICONID(13,6), + BND_ICON_UV_FACESEL = BND_ICONID(14,6), + BND_ICON_UV_ISLANDSEL = BND_ICONID(15,6), + BND_ICON_UV_SYNC_SELECT = BND_ICONID(16,6), + BND_ICON_BBOX = BND_ICONID(0,5), + BND_ICON_WIRE = BND_ICONID(1,5), + BND_ICON_SOLID = BND_ICONID(2,5), + BND_ICON_SMOOTH = BND_ICONID(3,5), + BND_ICON_POTATO = BND_ICONID(4,5), + BND_ICON_ORTHO = BND_ICONID(6,5), + BND_ICON_LOCKVIEW_OFF = BND_ICONID(9,5), + BND_ICON_LOCKVIEW_ON = BND_ICONID(10,5), + BND_ICON_AXIS_SIDE = BND_ICONID(12,5), + BND_ICON_AXIS_FRONT = BND_ICONID(13,5), + BND_ICON_AXIS_TOP = BND_ICONID(14,5), + BND_ICON_NDOF_DOM = BND_ICONID(15,5), + BND_ICON_NDOF_TURN = BND_ICONID(16,5), + BND_ICON_NDOF_FLY = BND_ICONID(17,5), + BND_ICON_NDOF_TRANS = BND_ICONID(18,5), + BND_ICON_LAYER_USED = BND_ICONID(19,5), + BND_ICON_LAYER_ACTIVE = BND_ICONID(20,5), + BND_ICON_SORTALPHA = BND_ICONID(0,3), + BND_ICON_SORTBYEXT = BND_ICONID(1,3), + BND_ICON_SORTTIME = BND_ICONID(2,3), + BND_ICON_SORTSIZE = BND_ICONID(3,3), + BND_ICON_LONGDISPLAY = BND_ICONID(4,3), + BND_ICON_SHORTDISPLAY = BND_ICONID(5,3), + BND_ICON_GHOST = BND_ICONID(6,3), + BND_ICON_IMGDISPLAY = BND_ICONID(7,3), + BND_ICON_SAVE_AS = BND_ICONID(8,3), + BND_ICON_SAVE_COPY = BND_ICONID(9,3), + BND_ICON_BOOKMARKS = BND_ICONID(10,3), + BND_ICON_FONTPREVIEW = BND_ICONID(11,3), + BND_ICON_FILTER = BND_ICONID(12,3), + BND_ICON_NEWFOLDER = BND_ICONID(13,3), + BND_ICON_OPEN_RECENT = BND_ICONID(14,3), + BND_ICON_FILE_PARENT = BND_ICONID(15,3), + BND_ICON_FILE_REFRESH = BND_ICONID(16,3), + BND_ICON_FILE_FOLDER = BND_ICONID(17,3), + BND_ICON_FILE_BLANK = BND_ICONID(18,3), + BND_ICON_FILE_BLEND = BND_ICONID(19,3), + BND_ICON_FILE_IMAGE = BND_ICONID(20,3), + BND_ICON_FILE_MOVIE = BND_ICONID(21,3), + BND_ICON_FILE_SCRIPT = BND_ICONID(22,3), + BND_ICON_FILE_SOUND = BND_ICONID(23,3), + BND_ICON_FILE_FONT = BND_ICONID(24,3), + BND_ICON_FILE_TEXT = BND_ICONID(25,3), + BND_ICON_RECOVER_AUTO = BND_ICONID(0,2), + BND_ICON_SAVE_PREFS = BND_ICONID(1,2), + BND_ICON_LINK_BLEND = BND_ICONID(2,2), + BND_ICON_APPEND_BLEND = BND_ICONID(3,2), + BND_ICON_IMPORT = BND_ICONID(4,2), + BND_ICON_EXPORT = BND_ICONID(5,2), + BND_ICON_EXTERNAL_DATA = BND_ICONID(6,2), + BND_ICON_LOAD_FACTORY = BND_ICONID(7,2), + BND_ICON_LOOP_BACK = BND_ICONID(13,2), + BND_ICON_LOOP_FORWARDS = BND_ICONID(14,2), + BND_ICON_BACK = BND_ICONID(15,2), + BND_ICON_FORWARD = BND_ICONID(16,2), + BND_ICON_FILE_BACKUP = BND_ICONID(24,2), + BND_ICON_DISK_DRIVE = BND_ICONID(25,2), + BND_ICON_MATPLANE = BND_ICONID(0,1), + BND_ICON_MATSPHERE = BND_ICONID(1,1), + BND_ICON_MATCUBE = BND_ICONID(2,1), + BND_ICON_MONKEY = BND_ICONID(3,1), + BND_ICON_HAIR = BND_ICONID(4,1), + BND_ICON_ALIASED = BND_ICONID(5,1), + BND_ICON_ANTIALIASED = BND_ICONID(6,1), + BND_ICON_MAT_SPHERE_SKY = BND_ICONID(7,1), + BND_ICON_WORDWRAP_OFF = BND_ICONID(12,1), + BND_ICON_WORDWRAP_ON = BND_ICONID(13,1), + BND_ICON_SYNTAX_OFF = BND_ICONID(14,1), + BND_ICON_SYNTAX_ON = BND_ICONID(15,1), + BND_ICON_LINENUMBERS_OFF = BND_ICONID(16,1), + BND_ICON_LINENUMBERS_ON = BND_ICONID(17,1), + BND_ICON_SCRIPTPLUGINS = BND_ICONID(18,1), + BND_ICON_SEQ_SEQUENCER = BND_ICONID(0,0), + BND_ICON_SEQ_PREVIEW = BND_ICONID(1,0), + BND_ICON_SEQ_LUMA_WAVEFORM = BND_ICONID(2,0), + BND_ICON_SEQ_CHROMA_SCOPE = BND_ICONID(3,0), + BND_ICON_SEQ_HISTOGRAM = BND_ICONID(4,0), + BND_ICON_SEQ_SPLITVIEW = BND_ICONID(5,0), + BND_ICON_IMAGE_RGB = BND_ICONID(9,0), + BND_ICON_IMAGE_RGB_ALPHA = BND_ICONID(10,0), + BND_ICON_IMAGE_ALPHA = BND_ICONID(11,0), + BND_ICON_IMAGE_ZDEPTH = BND_ICONID(12,0), + BND_ICON_IMAGEFILE = BND_ICONID(13,0); + + protected Blendish() { + throw new UnsupportedOperationException(); + } + + // --- [ bndSetTheme ] --- + + /** Unsafe version of: {@link #bndSetTheme SetTheme} */ + public static native void nbndSetTheme(long theme); + + /** Sets the current theme all widgets will be drawn with. The default Blender 2.6 theme is set by default. */ + public static void bndSetTheme(BNDtheme theme) { + nbndSetTheme(theme.address()); + } + + // --- [ bndGetTheme ] --- + + /** Unsafe version of: {@link #bndGetTheme GetTheme} */ + public static native long nbndGetTheme(); + + /** Returns the currently set theme. */ + @Nullable + @NativeType("BNDtheme const *") + public static BNDtheme bndGetTheme() { + long __result = nbndGetTheme(); + return BNDtheme.createSafe(__result); + } + + // --- [ bndSetIconImage ] --- + + /** + * Designates an image handle as returned by {@code nvgCreateImage*()} as the themes' icon sheet. + * + *

    The icon sheet format must be compatible to Blender 2.6's icon sheet; the order of icons does not matter. A valid icon sheet is e.g. shown at how to add an icon.

    + */ + public static native void bndSetIconImage(int image); + + // --- [ bndSetFont ] --- + + /** + * Designates an image handle as returned by {@code nvgCreateFont*()} as the themes' UI font. + * + *

    Blender's original UI font Droid Sans is perfectly suited and available here.

    + */ + public static native void bndSetFont(int font); + + // --- [ bndLabel ] --- + + /** Unsafe version of: {@link #bndLabel Label} */ + public static native void nbndLabel(long ctx, float x, float y, float w, float h, int iconid, long label); + + /** + * Draws a label with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndLabel(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @Nullable @NativeType("char const *") ByteBuffer label) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + nbndLabel(ctx, x, y, w, h, iconid, memAddressSafe(label)); + } + + /** + * Draws a label with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndLabel(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @Nullable @NativeType("char const *") CharSequence label) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + nbndLabel(ctx, x, y, w, h, iconid, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndToolButton ] --- + + /** Unsafe version of: {@link #bndToolButton ToolButton} */ + public static native void nbndToolButton(long ctx, float x, float y, float w, float h, int flags, int state, int iconid, long label); + + /** + * Draws a tool button with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndToolButton(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") ByteBuffer label) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + nbndToolButton(ctx, x, y, w, h, flags, state, iconid, memAddressSafe(label)); + } + + /** + * Draws a tool button with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndToolButton(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") CharSequence label) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + nbndToolButton(ctx, x, y, w, h, flags, state, iconid, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndRadioButton ] --- + + /** Unsafe version of: {@link #bndRadioButton RadioButton} */ + public static native void nbndRadioButton(long ctx, float x, float y, float w, float h, int flags, int state, int iconid, long label); + + /** + * Draws a radio button with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndRadioButton(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") ByteBuffer label) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + nbndRadioButton(ctx, x, y, w, h, flags, state, iconid, memAddressSafe(label)); + } + + /** + * Draws a radio button with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndRadioButton(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") CharSequence label) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + nbndRadioButton(ctx, x, y, w, h, flags, state, iconid, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndTextFieldTextPosition ] --- + + /** Unsafe version of: {@link #bndTextFieldTextPosition TextFieldTextPosition} */ + public static native int nbndTextFieldTextPosition(long ctx, float x, float y, float w, float h, int iconid, long text, int px, int py); + + /** + * Calculates the corresponding text position for given coordinates {@code px/py} in a text field. See {@link #bndTextField TextField} for more info. + * + * @param ctx the NanoVG context + * @param iconid if ≥ 0, an icon will be added to the widget + * @param text if not {@code NULL}, text will be printed to the widget + */ + public static int bndTextFieldTextPosition(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @Nullable @NativeType("char const *") ByteBuffer text, int px, int py) { + if (CHECKS) { + check(ctx); + checkNT1Safe(text); + } + return nbndTextFieldTextPosition(ctx, x, y, w, h, iconid, memAddressSafe(text), px, py); + } + + /** + * Calculates the corresponding text position for given coordinates {@code px/py} in a text field. See {@link #bndTextField TextField} for more info. + * + * @param ctx the NanoVG context + * @param iconid if ≥ 0, an icon will be added to the widget + * @param text if not {@code NULL}, text will be printed to the widget + */ + public static int bndTextFieldTextPosition(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @Nullable @NativeType("char const *") CharSequence text, int px, int py) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(text, true); + long textEncoded = text == null ? NULL : stack.getPointerAddress(); + return nbndTextFieldTextPosition(ctx, x, y, w, h, iconid, textEncoded, px, py); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndTextField ] --- + + /** Unsafe version of: {@link #bndTextField TextField} */ + public static native void nbndTextField(long ctx, float x, float y, float w, float h, int flags, int state, int iconid, long text, int cbegin, int cend); + + /** + * Draws a text field with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param text if not {@code NULL}, text will be printed to the widget + * @param cbegin must be ≥ 0 and ≤ {@code strlen(text)} and denotes the beginning of the caret + * @param cend must be ≥ {@code cbegin} and ≤ {@code strlen(text)} and denotes the end of the caret. If {@code cend} < {@code cbegin}, then no caret will + * be drawn. + */ + public static void bndTextField(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") ByteBuffer text, int cbegin, int cend) { + if (CHECKS) { + check(ctx); + checkNT1Safe(text); + } + nbndTextField(ctx, x, y, w, h, flags, state, iconid, memAddressSafe(text), cbegin, cend); + } + + /** + * Draws a text field with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param text if not {@code NULL}, text will be printed to the widget + * @param cbegin must be ≥ 0 and ≤ {@code strlen(text)} and denotes the beginning of the caret + * @param cend must be ≥ {@code cbegin} and ≤ {@code strlen(text)} and denotes the end of the caret. If {@code cend} < {@code cbegin}, then no caret will + * be drawn. + */ + public static void bndTextField(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") CharSequence text, int cbegin, int cend) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(text, true); + long textEncoded = text == null ? NULL : stack.getPointerAddress(); + nbndTextField(ctx, x, y, w, h, flags, state, iconid, textEncoded, cbegin, cend); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndOptionButton ] --- + + /** Unsafe version of: {@link #bndOptionButton OptionButton} */ + public static native void nbndOptionButton(long ctx, float x, float y, float w, float h, int state, long label); + + /** + * Draws an option button with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndOptionButton(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, @NativeType("BNDwidgetState") int state, @Nullable @NativeType("char const *") ByteBuffer label) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + nbndOptionButton(ctx, x, y, w, h, state, memAddressSafe(label)); + } + + /** + * Draws an option button with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndOptionButton(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, @NativeType("BNDwidgetState") int state, @Nullable @NativeType("char const *") CharSequence label) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + nbndOptionButton(ctx, x, y, w, h, state, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndChoiceButton ] --- + + /** Unsafe version of: {@link #bndChoiceButton ChoiceButton} */ + public static native void nbndChoiceButton(long ctx, float x, float y, float w, float h, int flags, int state, int iconid, long label); + + /** + * Draws a choice button with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndChoiceButton(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") ByteBuffer label) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + nbndChoiceButton(ctx, x, y, w, h, flags, state, iconid, memAddressSafe(label)); + } + + /** + * Draws a choice button with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndChoiceButton(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") CharSequence label) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + nbndChoiceButton(ctx, x, y, w, h, flags, state, iconid, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndColorButton ] --- + + /** Unsafe version of: {@link #bndColorButton ColorButton} */ + public static native void nbndColorButton(long ctx, float x, float y, float w, float h, int flags, long color); + + /** + * Draws a color button with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + */ + public static void bndColorButton(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("NVGcolor") NVGColor color) { + if (CHECKS) { + check(ctx); + } + nbndColorButton(ctx, x, y, w, h, flags, color.address()); + } + + // --- [ bndNumberField ] --- + + /** Unsafe version of: {@link #bndNumberField NumberField} */ + public static native void nbndNumberField(long ctx, float x, float y, float w, float h, int flags, int state, long label, long value); + + /** + * Draws a number field with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param label if not {@code NULL}, a label will be added to the widget + * @param value if not {@code NULL}, a value will be added to the widget along with a ":" separator + */ + public static void bndNumberField(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, @Nullable @NativeType("char const *") ByteBuffer label, @Nullable @NativeType("char const *") ByteBuffer value) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + checkNT1Safe(value); + } + nbndNumberField(ctx, x, y, w, h, flags, state, memAddressSafe(label), memAddressSafe(value)); + } + + /** + * Draws a number field with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param label if not {@code NULL}, a label will be added to the widget + * @param value if not {@code NULL}, a value will be added to the widget along with a ":" separator + */ + public static void bndNumberField(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, @Nullable @NativeType("char const *") CharSequence label, @Nullable @NativeType("char const *") CharSequence value) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + stack.nUTF8Safe(value, true); + long valueEncoded = value == null ? NULL : stack.getPointerAddress(); + nbndNumberField(ctx, x, y, w, h, flags, state, labelEncoded, valueEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndSlider ] --- + + /** Unsafe version of: {@link #bndSlider Slider} */ + public static native void nbndSlider(long ctx, float x, float y, float w, float h, int flags, int state, float progress, long label, long value); + + /** + * Draws slider control with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param progress must be in the range {@code 0..1} and controls the size of the slider bar + * @param label if not {@code NULL}, a label will be added to the widget + * @param value if not {@code NULL}, a value will be added to the widget along with a ":" separator + */ + public static void bndSlider(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, float progress, @Nullable @NativeType("char const *") ByteBuffer label, @Nullable @NativeType("char const *") ByteBuffer value) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + checkNT1Safe(value); + } + nbndSlider(ctx, x, y, w, h, flags, state, progress, memAddressSafe(label), memAddressSafe(value)); + } + + /** + * Draws slider control with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param progress must be in the range {@code 0..1} and controls the size of the slider bar + * @param label if not {@code NULL}, a label will be added to the widget + * @param value if not {@code NULL}, a value will be added to the widget along with a ":" separator + */ + public static void bndSlider(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags, @NativeType("BNDwidgetState") int state, float progress, @Nullable @NativeType("char const *") CharSequence label, @Nullable @NativeType("char const *") CharSequence value) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + stack.nUTF8Safe(value, true); + long valueEncoded = value == null ? NULL : stack.getPointerAddress(); + nbndSlider(ctx, x, y, w, h, flags, state, progress, labelEncoded, valueEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndScrollBar ] --- + + /** Unsafe version of: {@link #bndScrollBar ScrollBar} */ + public static native void nbndScrollBar(long ctx, float x, float y, float w, float h, int state, float offset, float size); + + /** + * Draws scrollbar with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param w vertical widget looks best when width is {@link #BND_SCROLLBAR_WIDTH SCROLLBAR_WIDTH} + * @param h horizontal widget looks best when height is {@link #BND_SCROLLBAR_HEIGHT SCROLLBAR_HEIGHT} + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param offset is in the range {@code 0..1} and controls the position of the scroll handle + * @param size is in the range {@code 0..1} and controls the size of the scroll handle + */ + public static void bndScrollBar(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, @NativeType("BNDwidgetState") int state, float offset, float size) { + if (CHECKS) { + check(ctx); + } + nbndScrollBar(ctx, x, y, w, h, state, offset, size); + } + + // --- [ bndMenuBackground ] --- + + /** Unsafe version of: {@link #bndMenuBackground MenuBackground} */ + public static native void nbndMenuBackground(long ctx, float x, float y, float w, float h, int flags); + + /** + * Draws a menu background with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + */ + public static void bndMenuBackground(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int flags) { + if (CHECKS) { + check(ctx); + } + nbndMenuBackground(ctx, x, y, w, h, flags); + } + + // --- [ bndMenuLabel ] --- + + /** Unsafe version of: {@link #bndMenuLabel MenuLabel} */ + public static native void nbndMenuLabel(long ctx, float x, float y, float w, float h, int iconid, long label); + + /** + * Draws a menu label with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndMenuLabel(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @Nullable @NativeType("char const *") ByteBuffer label) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + nbndMenuLabel(ctx, x, y, w, h, iconid, memAddressSafe(label)); + } + + /** + * Draws a menu label with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndMenuLabel(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @Nullable @NativeType("char const *") CharSequence label) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + nbndMenuLabel(ctx, x, y, w, h, iconid, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndMenuItem ] --- + + /** Unsafe version of: {@link #bndMenuItem MenuItem} */ + public static native void nbndMenuItem(long ctx, float x, float y, float w, float h, int state, int iconid, long label); + + /** + * Draws a menu item with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndMenuItem(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") ByteBuffer label) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + nbndMenuItem(ctx, x, y, w, h, state, iconid, memAddressSafe(label)); + } + + /** + * Draws a menu item with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param h widget looks best when height is {@link #BND_WIDGET_HEIGHT WIDGET_HEIGHT} + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + */ + public static void bndMenuItem(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") CharSequence label) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + nbndMenuItem(ctx, x, y, w, h, state, iconid, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndTooltipBackground ] --- + + /** Unsafe version of: {@link #bndTooltipBackground TooltipBackground} */ + public static native void nbndTooltipBackground(long ctx, float x, float y, float w, float h); + + /** + * Draws a tooltip background with its lower left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + */ + public static void bndTooltipBackground(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h) { + if (CHECKS) { + check(ctx); + } + nbndTooltipBackground(ctx, x, y, w, h); + } + + // --- [ bndNodePort ] --- + + /** Unsafe version of: {@link #bndNodePort NodePort} */ + public static native void nbndNodePort(long ctx, float x, float y, int state, long color); + + /** + * Draws a node port at the given position filled with the given color. + * + * @param ctx the NanoVG context + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + */ + public static void bndNodePort(@NativeType("NVGcontext *") long ctx, float x, float y, @NativeType("BNDwidgetState") int state, @NativeType("NVGcolor") NVGColor color) { + if (CHECKS) { + check(ctx); + } + nbndNodePort(ctx, x, y, state, color.address()); + } + + // --- [ bndNodeWire ] --- + + /** Unsafe version of: {@link #bndNodeWire NodeWire} */ + public static native void nbndNodeWire(long ctx, float x0, float y0, float x1, float y1, int state0, int state1); + + /** + * Draws a node wire originating at {@code (x0,y0)} and floating to {@code (x1,y1)}, with a colored gradient based on the states {@code state0} and + * {@code state1}: + * + *
      + *
    • {@link #BND_DEFAULT DEFAULT}: default wire color
    • + *
    • {@link #BND_HOVER HOVER}: selected wire color
    • + *
    • {@link #BND_ACTIVE ACTIVE}: dragged wire color
    • + *
    + * + * @param ctx the NanoVG context + * @param state0 origin wire color. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param state1 ending wire color. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + */ + public static void bndNodeWire(@NativeType("NVGcontext *") long ctx, float x0, float y0, float x1, float y1, @NativeType("BNDwidgetState") int state0, @NativeType("BNDwidgetState") int state1) { + if (CHECKS) { + check(ctx); + } + nbndNodeWire(ctx, x0, y0, x1, y1, state0, state1); + } + + // --- [ bndColoredNodeWire ] --- + + /** Unsafe version of: {@link #bndColoredNodeWire ColoredNodeWire} */ + public static native void nbndColoredNodeWire(long ctx, float x0, float y0, float x1, float y1, long color0, long color1); + + /** + * Draws a node wire originating at {@code (x0,y0)} and floating to {@code (x1,y1)}, with a colored gradient based on the two colors {@code color0} and + * {@code color1}. + * + * @param ctx the NanoVG context + */ + public static void bndColoredNodeWire(@NativeType("NVGcontext *") long ctx, float x0, float y0, float x1, float y1, @NativeType("NVGcolor") NVGColor color0, @NativeType("NVGcolor") NVGColor color1) { + if (CHECKS) { + check(ctx); + } + nbndColoredNodeWire(ctx, x0, y0, x1, y1, color0.address(), color1.address()); + } + + // --- [ bndNodeBackground ] --- + + /** Unsafe version of: {@link #bndNodeBackground NodeBackground} */ + public static native void nbndNodeBackground(long ctx, float x, float y, float w, float h, int state, int iconid, long label, long titleColor); + + /** + * Draws a node background with its upper left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + * @param titleColor provides the base color for the title bar + */ + public static void bndNodeBackground(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") ByteBuffer label, @NativeType("NVGcolor") NVGColor titleColor) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + nbndNodeBackground(ctx, x, y, w, h, state, iconid, memAddressSafe(label), titleColor.address()); + } + + /** + * Draws a node background with its upper left origin at {@code (x,y)} and size of {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param iconid if ≥ 0, an icon will be added to the widget + * @param label if not {@code NULL}, a label will be added to the widget + * @param titleColor provides the base color for the title bar + */ + public static void bndNodeBackground(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, @NativeType("BNDwidgetState") int state, int iconid, @Nullable @NativeType("char const *") CharSequence label, @NativeType("NVGcolor") NVGColor titleColor) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + nbndNodeBackground(ctx, x, y, w, h, state, iconid, labelEncoded, titleColor.address()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndSplitterWidgets ] --- + + /** Unsafe version of: {@link #bndSplitterWidgets SplitterWidgets} */ + public static native void nbndSplitterWidgets(long ctx, float x, float y, float w, float h); + + /** + * Draws a window with the upper right and lower left splitter widgets into the rectangle at origin {@code (x,y)} and size {@code (w, h)}. + * + * @param ctx the NanoVG context + */ + public static void bndSplitterWidgets(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h) { + if (CHECKS) { + check(ctx); + } + nbndSplitterWidgets(ctx, x, y, w, h); + } + + // --- [ bndJoinAreaOverlay ] --- + + /** Unsafe version of: {@link #bndJoinAreaOverlay JoinAreaOverlay} */ + public static native void nbndJoinAreaOverlay(long ctx, float x, float y, float w, float h, int vertical, int mirror); + + /** + * Draws the join area overlay stencil into the rectangle at origin {@code (x,y)} and size {@code (w,h)}. + * + * @param ctx the NanoVG context + * @param vertical is 0 or 1 and designates the arrow orientation + * @param mirror is 0 or 1 and flips the arrow side + */ + public static void bndJoinAreaOverlay(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, @NativeType("int") boolean vertical, @NativeType("int") boolean mirror) { + if (CHECKS) { + check(ctx); + } + nbndJoinAreaOverlay(ctx, x, y, w, h, vertical ? 1 : 0, mirror ? 1 : 0); + } + + // --- [ bndLabelWidth ] --- + + /** Unsafe version of: {@link #bndLabelWidth LabelWidth} */ + public static native float nbndLabelWidth(long ctx, int iconid, long label); + + /** + * Returns the ideal width for a label with given icon and text + * + * @param ctx the NanoVG context + */ + public static float bndLabelWidth(@NativeType("NVGcontext *") long ctx, int iconid, @Nullable @NativeType("char const *") ByteBuffer label) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + return nbndLabelWidth(ctx, iconid, memAddressSafe(label)); + } + + /** + * Returns the ideal width for a label with given icon and text + * + * @param ctx the NanoVG context + */ + public static float bndLabelWidth(@NativeType("NVGcontext *") long ctx, int iconid, @Nullable @NativeType("char const *") CharSequence label) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + return nbndLabelWidth(ctx, iconid, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndLabelHeight ] --- + + /** Unsafe version of: {@link #bndLabelHeight LabelHeight} */ + public static native float nbndLabelHeight(long ctx, int iconid, long label, float width); + + /** + * Returns the height for a label with given icon, text and width; this function is primarily useful in conjunction with multiline labels and textboxes. + * + * @param ctx the NanoVG context + */ + public static float bndLabelHeight(@NativeType("NVGcontext *") long ctx, int iconid, @Nullable @NativeType("char const *") ByteBuffer label, float width) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + return nbndLabelHeight(ctx, iconid, memAddressSafe(label), width); + } + + /** + * Returns the height for a label with given icon, text and width; this function is primarily useful in conjunction with multiline labels and textboxes. + * + * @param ctx the NanoVG context + */ + public static float bndLabelHeight(@NativeType("NVGcontext *") long ctx, int iconid, @Nullable @NativeType("char const *") CharSequence label, float width) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + return nbndLabelHeight(ctx, iconid, labelEncoded, width); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndTransparent ] --- + + /** Unsafe version of: {@link #bndTransparent Transparent} */ + public static native void nbndTransparent(long color, long __result); + + /** Makes color transparent using the default alpha value. */ + @NativeType("NVGcolor") + public static NVGColor bndTransparent(@NativeType("NVGcolor") NVGColor color, @NativeType("NVGcolor") NVGColor __result) { + nbndTransparent(color.address(), __result.address()); + return __result; + } + + // --- [ bndOffsetColor ] --- + + /** Unsafe version of: {@link #bndOffsetColor OffsetColor} */ + public static native void nbndOffsetColor(long color, int delta, long __result); + + /** + * Offsets a color by a given integer delta. + * + * @param delta in the range -100 to 100 + */ + @NativeType("NVGcolor") + public static NVGColor bndOffsetColor(@NativeType("NVGcolor") NVGColor color, int delta, @NativeType("NVGcolor") NVGColor __result) { + nbndOffsetColor(color.address(), delta, __result.address()); + return __result; + } + + // --- [ bndSelectCorners ] --- + + /** Unsafe version of: {@link #bndSelectCorners SelectCorners} */ + public static native void nbndSelectCorners(long radiuses, float r, int flags); + + /** + * Assigns radius {@code r} to the four entries of array {@code radiuses} depending on whether the corner is marked as sharp or not. + * + * @param flags the corner flags. One of:
    {@link #BND_CORNER_NONE CORNER_NONE}{@link #BND_CORNER_TOP_LEFT CORNER_TOP_LEFT}{@link #BND_CORNER_TOP_RIGHT CORNER_TOP_RIGHT}{@link #BND_CORNER_DOWN_RIGHT CORNER_DOWN_RIGHT}{@link #BND_CORNER_DOWN_LEFT CORNER_DOWN_LEFT}{@link #BND_CORNER_ALL CORNER_ALL}
    {@link #BND_CORNER_TOP CORNER_TOP}{@link #BND_CORNER_DOWN CORNER_DOWN}{@link #BND_CORNER_LEFT CORNER_LEFT}{@link #BND_CORNER_RIGHT CORNER_RIGHT}
    + */ + public static void bndSelectCorners(@NativeType("float *") FloatBuffer radiuses, float r, int flags) { + if (CHECKS) { + check(radiuses, 4); + } + nbndSelectCorners(memAddress(radiuses), r, flags); + } + + // --- [ bndInnerColors ] --- + + /** Unsafe version of: {@link #bndInnerColors InnerColors} */ + public static native void nbndInnerColors(long shade_top, long shade_down, long theme, int state, int flipActive); + + /** + * Computes the upper and lower gradient colors for the inner box from a widget theme and the widgets state. + * + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + * @param flipActive if set and the {@code state} is {@link #BND_ACTIVE ACTIVE}, the upper and lower colors will be swapped + */ + public static void bndInnerColors(@NativeType("NVGcolor *") NVGColor shade_top, @NativeType("NVGcolor *") NVGColor shade_down, @NativeType("BNDwidgetTheme const *") BNDwidgetTheme theme, @NativeType("BNDwidgetState") int state, @NativeType("int") boolean flipActive) { + nbndInnerColors(shade_top.address(), shade_down.address(), theme.address(), state, flipActive ? 1 : 0); + } + + // --- [ bndTextColor ] --- + + /** Unsafe version of: {@link #bndTextColor TextColor} */ + public static native void nbndTextColor(long theme, int state, long __result); + + /** + * Computes the text color for a widget label from a widget theme and the widgets state. + * + * @param state the current UI state. One of:
    {@link #BND_DEFAULT DEFAULT}{@link #BND_HOVER HOVER}{@link #BND_ACTIVE ACTIVE}
    + */ + @NativeType("NVGcolor") + public static NVGColor bndTextColor(@NativeType("BNDwidgetTheme const *") BNDwidgetTheme theme, @NativeType("BNDwidgetState") int state, @NativeType("NVGcolor") NVGColor __result) { + nbndTextColor(theme.address(), state, __result.address()); + return __result; + } + + // --- [ bndScrollHandleRect ] --- + + /** Unsafe version of: {@link #bndScrollHandleRect ScrollHandleRect} */ + public static native void nbndScrollHandleRect(long x, long y, long w, long h, float offset, float size); + + /** + * Computes the bounds of the scrollbar handle from the scrollbar size and the handle's offset and size. + * + * @param offset is in the range {@code 0..1} and defines the position of the scroll handle + * @param size is in the range {@code 0..1} and defines the size of the scroll handle + */ + public static void bndScrollHandleRect(@NativeType("float *") FloatBuffer x, @NativeType("float *") FloatBuffer y, @NativeType("float *") FloatBuffer w, @NativeType("float *") FloatBuffer h, float offset, float size) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(w, 1); + check(h, 1); + } + nbndScrollHandleRect(memAddress(x), memAddress(y), memAddress(w), memAddress(h), offset, size); + } + + // --- [ bndRoundedBox ] --- + + /** Unsafe version of: {@link #bndRoundedBox RoundedBox} */ + public static native void nbndRoundedBox(long ctx, float x, float y, float w, float h, float cr0, float cr1, float cr2, float cr3); + + /** + * Adds a rounded box path at position {@code (x,y)} with size {@code (w,h)} and a separate radius for each corner listed in clockwise order, so that + * {@code cr0} = top left, {@code cr1} = top right, {@code cr2} = bottom right, {@code cr3} = bottom left; this is a low level drawing function: the path + * must be stroked or filled to become visible. + * + * @param ctx the NanoVG context + */ + public static void bndRoundedBox(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, float cr0, float cr1, float cr2, float cr3) { + if (CHECKS) { + check(ctx); + } + nbndRoundedBox(ctx, x, y, w, h, cr0, cr1, cr2, cr3); + } + + // --- [ bndBackground ] --- + + /** Unsafe version of: {@link #bndBackground Background} */ + public static native void nbndBackground(long ctx, float x, float y, float w, float h); + + /** + * Draws a flat panel without any decorations at position {@code (x,y)} with size {@code (w,h)} and fills it with {@code backgroundColor}. + * + * @param ctx the NanoVG context + */ + public static void bndBackground(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h) { + if (CHECKS) { + check(ctx); + } + nbndBackground(ctx, x, y, w, h); + } + + // --- [ bndBevel ] --- + + /** Unsafe version of: {@link #bndBevel Bevel} */ + public static native void nbndBevel(long ctx, float x, float y, float w, float h); + + /** + * Draws a beveled border at position {@code (x,y)} with size {@code (w,h)} shaded with lighter and darker versions of {@code backgroundColor}. + * + * @param ctx the NanoVG context + */ + public static void bndBevel(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h) { + if (CHECKS) { + check(ctx); + } + nbndBevel(ctx, x, y, w, h); + } + + // --- [ bndBevelInset ] --- + + /** Unsafe version of: {@link #bndBevelInset BevelInset} */ + public static native void nbndBevelInset(long ctx, float x, float y, float w, float h, float cr2, float cr3); + + /** + * Draws a lower inset for a rounded box at position {@code (x,y)} with size {@code (w,h)} that gives the impression the surface has been pushed in. + * {@code cr2} and {@code cr3} contain the radiuses of the bottom right and bottom left corners of the rounded box. + * + * @param ctx the NanoVG context + */ + public static void bndBevelInset(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, float cr2, float cr3) { + if (CHECKS) { + check(ctx); + } + nbndBevelInset(ctx, x, y, w, h, cr2, cr3); + } + + // --- [ bndIcon ] --- + + /** Unsafe version of: {@link #bndIcon Icon} */ + public static native void nbndIcon(long ctx, float x, float y, int iconid); + + /** + * Draws an icon with {@code (x,y)} as its upper left coordinate. + * + * @param ctx the NanoVG context + * @param iconid selects the icon from the sheet. One of:
    {@link #BND_ICON_NONE ICON_NONE}{@link #BND_ICON_QUESTION ICON_QUESTION}{@link #BND_ICON_ERROR ICON_ERROR}{@link #BND_ICON_CANCEL ICON_CANCEL}{@link #BND_ICON_TRIA_RIGHT ICON_TRIA_RIGHT}
    {@link #BND_ICON_TRIA_DOWN ICON_TRIA_DOWN}{@link #BND_ICON_TRIA_LEFT ICON_TRIA_LEFT}{@link #BND_ICON_TRIA_UP ICON_TRIA_UP}{@link #BND_ICON_ARROW_LEFTRIGHT ICON_ARROW_LEFTRIGHT}{@link #BND_ICON_PLUS ICON_PLUS}
    {@link #BND_ICON_DISCLOSURE_TRI_DOWN ICON_DISCLOSURE_TRI_DOWN}{@link #BND_ICON_DISCLOSURE_TRI_RIGHT ICON_DISCLOSURE_TRI_RIGHT}{@link #BND_ICON_RADIOBUT_OFF ICON_RADIOBUT_OFF}{@link #BND_ICON_RADIOBUT_ON ICON_RADIOBUT_ON}{@link #BND_ICON_MENU_PANEL ICON_MENU_PANEL}
    {@link #BND_ICON_BLENDER ICON_BLENDER}{@link #BND_ICON_GRIP ICON_GRIP}{@link #BND_ICON_DOT ICON_DOT}{@link #BND_ICON_COLLAPSEMENU ICON_COLLAPSEMENU}{@link #BND_ICON_X ICON_X}
    {@link #BND_ICON_GO_LEFT ICON_GO_LEFT}{@link #BND_ICON_PLUG ICON_PLUG}{@link #BND_ICON_UI ICON_UI}{@link #BND_ICON_NODE ICON_NODE}{@link #BND_ICON_NODE_SEL ICON_NODE_SEL}
    {@link #BND_ICON_FULLSCREEN ICON_FULLSCREEN}{@link #BND_ICON_SPLITSCREEN ICON_SPLITSCREEN}{@link #BND_ICON_RIGHTARROW_THIN ICON_RIGHTARROW_THIN}{@link #BND_ICON_BORDERMOVE ICON_BORDERMOVE}{@link #BND_ICON_VIEWZOOM ICON_VIEWZOOM}
    {@link #BND_ICON_ZOOMIN ICON_ZOOMIN}{@link #BND_ICON_ZOOMOUT ICON_ZOOMOUT}{@link #BND_ICON_PANEL_CLOSE ICON_PANEL_CLOSE}{@link #BND_ICON_COPY_ID ICON_COPY_ID}{@link #BND_ICON_EYEDROPPER ICON_EYEDROPPER}
    {@link #BND_ICON_LINK_AREA ICON_LINK_AREA}{@link #BND_ICON_AUTO ICON_AUTO}{@link #BND_ICON_CHECKBOX_DEHLT ICON_CHECKBOX_DEHLT}{@link #BND_ICON_CHECKBOX_HLT ICON_CHECKBOX_HLT}{@link #BND_ICON_UNLOCKED ICON_UNLOCKED}
    {@link #BND_ICON_LOCKED ICON_LOCKED}{@link #BND_ICON_UNPINNED ICON_UNPINNED}{@link #BND_ICON_PINNED ICON_PINNED}{@link #BND_ICON_SCREEN_BACK ICON_SCREEN_BACK}{@link #BND_ICON_RIGHTARROW ICON_RIGHTARROW}
    {@link #BND_ICON_DOWNARROW_HLT ICON_DOWNARROW_HLT}{@link #BND_ICON_DOTSUP ICON_DOTSUP}{@link #BND_ICON_DOTSDOWN ICON_DOTSDOWN}{@link #BND_ICON_LINK ICON_LINK}{@link #BND_ICON_INLINK ICON_INLINK}
    {@link #BND_ICON_PLUGIN ICON_PLUGIN}{@link #BND_ICON_HELP ICON_HELP}{@link #BND_ICON_GHOST_ENABLED ICON_GHOST_ENABLED}{@link #BND_ICON_COLOR ICON_COLOR}{@link #BND_ICON_LINKED ICON_LINKED}
    {@link #BND_ICON_UNLINKED ICON_UNLINKED}{@link #BND_ICON_HAND ICON_HAND}{@link #BND_ICON_ZOOM_ALL ICON_ZOOM_ALL}{@link #BND_ICON_ZOOM_SELECTED ICON_ZOOM_SELECTED}{@link #BND_ICON_ZOOM_PREVIOUS ICON_ZOOM_PREVIOUS}
    {@link #BND_ICON_ZOOM_IN ICON_ZOOM_IN}{@link #BND_ICON_ZOOM_OUT ICON_ZOOM_OUT}{@link #BND_ICON_RENDER_REGION ICON_RENDER_REGION}{@link #BND_ICON_BORDER_RECT ICON_BORDER_RECT}{@link #BND_ICON_BORDER_LASSO ICON_BORDER_LASSO}
    {@link #BND_ICON_FREEZE ICON_FREEZE}{@link #BND_ICON_STYLUS_PRESSURE ICON_STYLUS_PRESSURE}{@link #BND_ICON_GHOST_DISABLED ICON_GHOST_DISABLED}{@link #BND_ICON_NEW ICON_NEW}{@link #BND_ICON_FILE_TICK ICON_FILE_TICK}
    {@link #BND_ICON_QUIT ICON_QUIT}{@link #BND_ICON_URL ICON_URL}{@link #BND_ICON_RECOVER_LAST ICON_RECOVER_LAST}{@link #BND_ICON_FULLSCREEN_ENTER ICON_FULLSCREEN_ENTER}{@link #BND_ICON_FULLSCREEN_EXIT ICON_FULLSCREEN_EXIT}
    {@link #BND_ICON_BLANK1 ICON_BLANK1}{@link #BND_ICON_LAMP ICON_LAMP}{@link #BND_ICON_MATERIAL ICON_MATERIAL}{@link #BND_ICON_TEXTURE ICON_TEXTURE}{@link #BND_ICON_ANIM ICON_ANIM}
    {@link #BND_ICON_WORLD ICON_WORLD}{@link #BND_ICON_SCENE ICON_SCENE}{@link #BND_ICON_EDIT ICON_EDIT}{@link #BND_ICON_GAME ICON_GAME}{@link #BND_ICON_RADIO ICON_RADIO}
    {@link #BND_ICON_SCRIPT ICON_SCRIPT}{@link #BND_ICON_PARTICLES ICON_PARTICLES}{@link #BND_ICON_PHYSICS ICON_PHYSICS}{@link #BND_ICON_SPEAKER ICON_SPEAKER}{@link #BND_ICON_TEXTURE_SHADED ICON_TEXTURE_SHADED}
    {@link #BND_ICON_VIEW3D ICON_VIEW3D}{@link #BND_ICON_IPO ICON_IPO}{@link #BND_ICON_OOPS ICON_OOPS}{@link #BND_ICON_BUTS ICON_BUTS}{@link #BND_ICON_FILESEL ICON_FILESEL}
    {@link #BND_ICON_IMAGE_COL ICON_IMAGE_COL}{@link #BND_ICON_INFO ICON_INFO}{@link #BND_ICON_SEQUENCE ICON_SEQUENCE}{@link #BND_ICON_TEXT ICON_TEXT}{@link #BND_ICON_IMASEL ICON_IMASEL}
    {@link #BND_ICON_SOUND ICON_SOUND}{@link #BND_ICON_ACTION ICON_ACTION}{@link #BND_ICON_NLA ICON_NLA}{@link #BND_ICON_SCRIPTWIN ICON_SCRIPTWIN}{@link #BND_ICON_TIME ICON_TIME}
    {@link #BND_ICON_NODETREE ICON_NODETREE}{@link #BND_ICON_LOGIC ICON_LOGIC}{@link #BND_ICON_CONSOLE ICON_CONSOLE}{@link #BND_ICON_PREFERENCES ICON_PREFERENCES}{@link #BND_ICON_CLIP ICON_CLIP}
    {@link #BND_ICON_ASSET_MANAGER ICON_ASSET_MANAGER}{@link #BND_ICON_OBJECT_DATAMODE ICON_OBJECT_DATAMODE}{@link #BND_ICON_EDITMODE_HLT ICON_EDITMODE_HLT}{@link #BND_ICON_FACESEL_HLT ICON_FACESEL_HLT}{@link #BND_ICON_VPAINT_HLT ICON_VPAINT_HLT}
    {@link #BND_ICON_TPAINT_HLT ICON_TPAINT_HLT}{@link #BND_ICON_WPAINT_HLT ICON_WPAINT_HLT}{@link #BND_ICON_SCULPTMODE_HLT ICON_SCULPTMODE_HLT}{@link #BND_ICON_POSE_HLT ICON_POSE_HLT}{@link #BND_ICON_PARTICLEMODE ICON_PARTICLEMODE}
    {@link #BND_ICON_LIGHTPAINT ICON_LIGHTPAINT}{@link #BND_ICON_SCENE_DATA ICON_SCENE_DATA}{@link #BND_ICON_RENDERLAYERS ICON_RENDERLAYERS}{@link #BND_ICON_WORLD_DATA ICON_WORLD_DATA}{@link #BND_ICON_OBJECT_DATA ICON_OBJECT_DATA}
    {@link #BND_ICON_MESH_DATA ICON_MESH_DATA}{@link #BND_ICON_CURVE_DATA ICON_CURVE_DATA}{@link #BND_ICON_META_DATA ICON_META_DATA}{@link #BND_ICON_LATTICE_DATA ICON_LATTICE_DATA}{@link #BND_ICON_LAMP_DATA ICON_LAMP_DATA}
    {@link #BND_ICON_MATERIAL_DATA ICON_MATERIAL_DATA}{@link #BND_ICON_TEXTURE_DATA ICON_TEXTURE_DATA}{@link #BND_ICON_ANIM_DATA ICON_ANIM_DATA}{@link #BND_ICON_CAMERA_DATA ICON_CAMERA_DATA}{@link #BND_ICON_PARTICLE_DATA ICON_PARTICLE_DATA}
    {@link #BND_ICON_LIBRARY_DATA_DIRECT ICON_LIBRARY_DATA_DIRECT}{@link #BND_ICON_GROUP ICON_GROUP}{@link #BND_ICON_ARMATURE_DATA ICON_ARMATURE_DATA}{@link #BND_ICON_POSE_DATA ICON_POSE_DATA}{@link #BND_ICON_BONE_DATA ICON_BONE_DATA}
    {@link #BND_ICON_CONSTRAINT ICON_CONSTRAINT}{@link #BND_ICON_SHAPEKEY_DATA ICON_SHAPEKEY_DATA}{@link #BND_ICON_CONSTRAINT_BONE ICON_CONSTRAINT_BONE}{@link #BND_ICON_CAMERA_STEREO ICON_CAMERA_STEREO}{@link #BND_ICON_PACKAGE ICON_PACKAGE}
    {@link #BND_ICON_UGLYPACKAGE ICON_UGLYPACKAGE}{@link #BND_ICON_BRUSH_DATA ICON_BRUSH_DATA}{@link #BND_ICON_IMAGE_DATA ICON_IMAGE_DATA}{@link #BND_ICON_FILE ICON_FILE}{@link #BND_ICON_FCURVE ICON_FCURVE}
    {@link #BND_ICON_FONT_DATA ICON_FONT_DATA}{@link #BND_ICON_RENDER_RESULT ICON_RENDER_RESULT}{@link #BND_ICON_SURFACE_DATA ICON_SURFACE_DATA}{@link #BND_ICON_EMPTY_DATA ICON_EMPTY_DATA}{@link #BND_ICON_SETTINGS ICON_SETTINGS}
    {@link #BND_ICON_RENDER_ANIMATION ICON_RENDER_ANIMATION}{@link #BND_ICON_RENDER_STILL ICON_RENDER_STILL}{@link #BND_ICON_BOIDS ICON_BOIDS}{@link #BND_ICON_STRANDS ICON_STRANDS}{@link #BND_ICON_LIBRARY_DATA_INDIRECT ICON_LIBRARY_DATA_INDIRECT}
    {@link #BND_ICON_GREASEPENCIL ICON_GREASEPENCIL}{@link #BND_ICON_LINE_DATA ICON_LINE_DATA}{@link #BND_ICON_GROUP_BONE ICON_GROUP_BONE}{@link #BND_ICON_GROUP_VERTEX ICON_GROUP_VERTEX}{@link #BND_ICON_GROUP_VCOL ICON_GROUP_VCOL}
    {@link #BND_ICON_GROUP_UVS ICON_GROUP_UVS}{@link #BND_ICON_RNA ICON_RNA}{@link #BND_ICON_RNA_ADD ICON_RNA_ADD}{@link #BND_ICON_OUTLINER_OB_EMPTY ICON_OUTLINER_OB_EMPTY}{@link #BND_ICON_OUTLINER_OB_MESH ICON_OUTLINER_OB_MESH}
    {@link #BND_ICON_OUTLINER_OB_CURVE ICON_OUTLINER_OB_CURVE}{@link #BND_ICON_OUTLINER_OB_LATTICE ICON_OUTLINER_OB_LATTICE}{@link #BND_ICON_OUTLINER_OB_META ICON_OUTLINER_OB_META}{@link #BND_ICON_OUTLINER_OB_LAMP ICON_OUTLINER_OB_LAMP}{@link #BND_ICON_OUTLINER_OB_CAMERA ICON_OUTLINER_OB_CAMERA}
    {@link #BND_ICON_OUTLINER_OB_ARMATURE ICON_OUTLINER_OB_ARMATURE}{@link #BND_ICON_OUTLINER_OB_FONT ICON_OUTLINER_OB_FONT}{@link #BND_ICON_OUTLINER_OB_SURFACE ICON_OUTLINER_OB_SURFACE}{@link #BND_ICON_OUTLINER_OB_SPEAKER ICON_OUTLINER_OB_SPEAKER}{@link #BND_ICON_RESTRICT_VIEW_OFF ICON_RESTRICT_VIEW_OFF}
    {@link #BND_ICON_RESTRICT_VIEW_ON ICON_RESTRICT_VIEW_ON}{@link #BND_ICON_RESTRICT_SELECT_OFF ICON_RESTRICT_SELECT_OFF}{@link #BND_ICON_RESTRICT_SELECT_ON ICON_RESTRICT_SELECT_ON}{@link #BND_ICON_RESTRICT_RENDER_OFF ICON_RESTRICT_RENDER_OFF}{@link #BND_ICON_RESTRICT_RENDER_ON ICON_RESTRICT_RENDER_ON}
    {@link #BND_ICON_OUTLINER_DATA_EMPTY ICON_OUTLINER_DATA_EMPTY}{@link #BND_ICON_OUTLINER_DATA_MESH ICON_OUTLINER_DATA_MESH}{@link #BND_ICON_OUTLINER_DATA_CURVE ICON_OUTLINER_DATA_CURVE}{@link #BND_ICON_OUTLINER_DATA_LATTICE ICON_OUTLINER_DATA_LATTICE}{@link #BND_ICON_OUTLINER_DATA_META ICON_OUTLINER_DATA_META}
    {@link #BND_ICON_OUTLINER_DATA_LAMP ICON_OUTLINER_DATA_LAMP}{@link #BND_ICON_OUTLINER_DATA_CAMERA ICON_OUTLINER_DATA_CAMERA}{@link #BND_ICON_OUTLINER_DATA_ARMATURE ICON_OUTLINER_DATA_ARMATURE}{@link #BND_ICON_OUTLINER_DATA_FONT ICON_OUTLINER_DATA_FONT}{@link #BND_ICON_OUTLINER_DATA_SURFACE ICON_OUTLINER_DATA_SURFACE}
    {@link #BND_ICON_OUTLINER_DATA_SPEAKER ICON_OUTLINER_DATA_SPEAKER}{@link #BND_ICON_OUTLINER_DATA_POSE ICON_OUTLINER_DATA_POSE}{@link #BND_ICON_MESH_PLANE ICON_MESH_PLANE}{@link #BND_ICON_MESH_CUBE ICON_MESH_CUBE}{@link #BND_ICON_MESH_CIRCLE ICON_MESH_CIRCLE}
    {@link #BND_ICON_MESH_UVSPHERE ICON_MESH_UVSPHERE}{@link #BND_ICON_MESH_ICOSPHERE ICON_MESH_ICOSPHERE}{@link #BND_ICON_MESH_GRID ICON_MESH_GRID}{@link #BND_ICON_MESH_MONKEY ICON_MESH_MONKEY}{@link #BND_ICON_MESH_CYLINDER ICON_MESH_CYLINDER}
    {@link #BND_ICON_MESH_TORUS ICON_MESH_TORUS}{@link #BND_ICON_MESH_CONE ICON_MESH_CONE}{@link #BND_ICON_LAMP_POINT ICON_LAMP_POINT}{@link #BND_ICON_LAMP_SUN ICON_LAMP_SUN}{@link #BND_ICON_LAMP_SPOT ICON_LAMP_SPOT}
    {@link #BND_ICON_LAMP_HEMI ICON_LAMP_HEMI}{@link #BND_ICON_LAMP_AREA ICON_LAMP_AREA}{@link #BND_ICON_META_EMPTY ICON_META_EMPTY}{@link #BND_ICON_META_PLANE ICON_META_PLANE}{@link #BND_ICON_META_CUBE ICON_META_CUBE}
    {@link #BND_ICON_META_BALL ICON_META_BALL}{@link #BND_ICON_META_ELLIPSOID ICON_META_ELLIPSOID}{@link #BND_ICON_META_CAPSULE ICON_META_CAPSULE}{@link #BND_ICON_SURFACE_NCURVE ICON_SURFACE_NCURVE}{@link #BND_ICON_SURFACE_NCIRCLE ICON_SURFACE_NCIRCLE}
    {@link #BND_ICON_SURFACE_NSURFACE ICON_SURFACE_NSURFACE}{@link #BND_ICON_SURFACE_NCYLINDER ICON_SURFACE_NCYLINDER}{@link #BND_ICON_SURFACE_NSPHERE ICON_SURFACE_NSPHERE}{@link #BND_ICON_SURFACE_NTORUS ICON_SURFACE_NTORUS}{@link #BND_ICON_CURVE_BEZCURVE ICON_CURVE_BEZCURVE}
    {@link #BND_ICON_CURVE_BEZCIRCLE ICON_CURVE_BEZCIRCLE}{@link #BND_ICON_CURVE_NCURVE ICON_CURVE_NCURVE}{@link #BND_ICON_CURVE_NCIRCLE ICON_CURVE_NCIRCLE}{@link #BND_ICON_CURVE_PATH ICON_CURVE_PATH}{@link #BND_ICON_COLOR_RED ICON_COLOR_RED}
    {@link #BND_ICON_COLOR_GREEN ICON_COLOR_GREEN}{@link #BND_ICON_COLOR_BLUE ICON_COLOR_BLUE}{@link #BND_ICON_FORCE_FORCE ICON_FORCE_FORCE}{@link #BND_ICON_FORCE_WIND ICON_FORCE_WIND}{@link #BND_ICON_FORCE_VORTEX ICON_FORCE_VORTEX}
    {@link #BND_ICON_FORCE_MAGNETIC ICON_FORCE_MAGNETIC}{@link #BND_ICON_FORCE_HARMONIC ICON_FORCE_HARMONIC}{@link #BND_ICON_FORCE_CHARGE ICON_FORCE_CHARGE}{@link #BND_ICON_FORCE_LENNARDJONES ICON_FORCE_LENNARDJONES}{@link #BND_ICON_FORCE_TEXTURE ICON_FORCE_TEXTURE}
    {@link #BND_ICON_FORCE_CURVE ICON_FORCE_CURVE}{@link #BND_ICON_FORCE_BOID ICON_FORCE_BOID}{@link #BND_ICON_FORCE_TURBULENCE ICON_FORCE_TURBULENCE}{@link #BND_ICON_FORCE_DRAG ICON_FORCE_DRAG}{@link #BND_ICON_FORCE_SMOKEFLOW ICON_FORCE_SMOKEFLOW}
    {@link #BND_ICON_MODIFIER ICON_MODIFIER}{@link #BND_ICON_MOD_WAVE ICON_MOD_WAVE}{@link #BND_ICON_MOD_BUILD ICON_MOD_BUILD}{@link #BND_ICON_MOD_DECIM ICON_MOD_DECIM}{@link #BND_ICON_MOD_MIRROR ICON_MOD_MIRROR}
    {@link #BND_ICON_MOD_SOFT ICON_MOD_SOFT}{@link #BND_ICON_MOD_SUBSURF ICON_MOD_SUBSURF}{@link #BND_ICON_HOOK ICON_HOOK}{@link #BND_ICON_MOD_PHYSICS ICON_MOD_PHYSICS}{@link #BND_ICON_MOD_PARTICLES ICON_MOD_PARTICLES}
    {@link #BND_ICON_MOD_BOOLEAN ICON_MOD_BOOLEAN}{@link #BND_ICON_MOD_EDGESPLIT ICON_MOD_EDGESPLIT}{@link #BND_ICON_MOD_ARRAY ICON_MOD_ARRAY}{@link #BND_ICON_MOD_UVPROJECT ICON_MOD_UVPROJECT}{@link #BND_ICON_MOD_DISPLACE ICON_MOD_DISPLACE}
    {@link #BND_ICON_MOD_CURVE ICON_MOD_CURVE}{@link #BND_ICON_MOD_LATTICE ICON_MOD_LATTICE}{@link #BND_ICON_CONSTRAINT_DATA ICON_CONSTRAINT_DATA}{@link #BND_ICON_MOD_ARMATURE ICON_MOD_ARMATURE}{@link #BND_ICON_MOD_SHRINKWRAP ICON_MOD_SHRINKWRAP}
    {@link #BND_ICON_MOD_CAST ICON_MOD_CAST}{@link #BND_ICON_MOD_MESHDEFORM ICON_MOD_MESHDEFORM}{@link #BND_ICON_MOD_BEVEL ICON_MOD_BEVEL}{@link #BND_ICON_MOD_SMOOTH ICON_MOD_SMOOTH}{@link #BND_ICON_MOD_SIMPLEDEFORM ICON_MOD_SIMPLEDEFORM}
    {@link #BND_ICON_MOD_MASK ICON_MOD_MASK}{@link #BND_ICON_MOD_CLOTH ICON_MOD_CLOTH}{@link #BND_ICON_MOD_EXPLODE ICON_MOD_EXPLODE}{@link #BND_ICON_MOD_FLUIDSIM ICON_MOD_FLUIDSIM}{@link #BND_ICON_MOD_MULTIRES ICON_MOD_MULTIRES}
    {@link #BND_ICON_MOD_SMOKE ICON_MOD_SMOKE}{@link #BND_ICON_MOD_SOLIDIFY ICON_MOD_SOLIDIFY}{@link #BND_ICON_MOD_SCREW ICON_MOD_SCREW}{@link #BND_ICON_MOD_VERTEX_WEIGHT ICON_MOD_VERTEX_WEIGHT}{@link #BND_ICON_MOD_DYNAMICPAINT ICON_MOD_DYNAMICPAINT}
    {@link #BND_ICON_MOD_REMESH ICON_MOD_REMESH}{@link #BND_ICON_MOD_OCEAN ICON_MOD_OCEAN}{@link #BND_ICON_MOD_WARP ICON_MOD_WARP}{@link #BND_ICON_MOD_SKIN ICON_MOD_SKIN}{@link #BND_ICON_MOD_TRIANGULATE ICON_MOD_TRIANGULATE}
    {@link #BND_ICON_MOD_WIREFRAME ICON_MOD_WIREFRAME}{@link #BND_ICON_REC ICON_REC}{@link #BND_ICON_PLAY ICON_PLAY}{@link #BND_ICON_FF ICON_FF}{@link #BND_ICON_REW ICON_REW}
    {@link #BND_ICON_PAUSE ICON_PAUSE}{@link #BND_ICON_PREV_KEYFRAME ICON_PREV_KEYFRAME}{@link #BND_ICON_NEXT_KEYFRAME ICON_NEXT_KEYFRAME}{@link #BND_ICON_PLAY_AUDIO ICON_PLAY_AUDIO}{@link #BND_ICON_PLAY_REVERSE ICON_PLAY_REVERSE}
    {@link #BND_ICON_PREVIEW_RANGE ICON_PREVIEW_RANGE}{@link #BND_ICON_ACTION_TWEAK ICON_ACTION_TWEAK}{@link #BND_ICON_PMARKER_ACT ICON_PMARKER_ACT}{@link #BND_ICON_PMARKER_SEL ICON_PMARKER_SEL}{@link #BND_ICON_PMARKER ICON_PMARKER}
    {@link #BND_ICON_MARKER_HLT ICON_MARKER_HLT}{@link #BND_ICON_MARKER ICON_MARKER}{@link #BND_ICON_SPACE2 ICON_SPACE2}{@link #BND_ICON_SPACE3 ICON_SPACE3}{@link #BND_ICON_KEYINGSET ICON_KEYINGSET}
    {@link #BND_ICON_KEY_DEHLT ICON_KEY_DEHLT}{@link #BND_ICON_KEY_HLT ICON_KEY_HLT}{@link #BND_ICON_MUTE_IPO_OFF ICON_MUTE_IPO_OFF}{@link #BND_ICON_MUTE_IPO_ON ICON_MUTE_IPO_ON}{@link #BND_ICON_VISIBLE_IPO_OFF ICON_VISIBLE_IPO_OFF}
    {@link #BND_ICON_VISIBLE_IPO_ON ICON_VISIBLE_IPO_ON}{@link #BND_ICON_DRIVER ICON_DRIVER}{@link #BND_ICON_SOLO_OFF ICON_SOLO_OFF}{@link #BND_ICON_SOLO_ON ICON_SOLO_ON}{@link #BND_ICON_FRAME_PREV ICON_FRAME_PREV}
    {@link #BND_ICON_FRAME_NEXT ICON_FRAME_NEXT}{@link #BND_ICON_NLA_PUSHDOWN ICON_NLA_PUSHDOWN}{@link #BND_ICON_IPO_CONSTANT ICON_IPO_CONSTANT}{@link #BND_ICON_IPO_LINEAR ICON_IPO_LINEAR}{@link #BND_ICON_IPO_BEZIER ICON_IPO_BEZIER}
    {@link #BND_ICON_IPO_SINE ICON_IPO_SINE}{@link #BND_ICON_IPO_QUAD ICON_IPO_QUAD}{@link #BND_ICON_IPO_CUBIC ICON_IPO_CUBIC}{@link #BND_ICON_IPO_QUART ICON_IPO_QUART}{@link #BND_ICON_IPO_QUINT ICON_IPO_QUINT}
    {@link #BND_ICON_IPO_EXPO ICON_IPO_EXPO}{@link #BND_ICON_IPO_CIRC ICON_IPO_CIRC}{@link #BND_ICON_IPO_BOUNCE ICON_IPO_BOUNCE}{@link #BND_ICON_IPO_ELASTIC ICON_IPO_ELASTIC}{@link #BND_ICON_IPO_BACK ICON_IPO_BACK}
    {@link #BND_ICON_IPO_EASE_IN ICON_IPO_EASE_IN}{@link #BND_ICON_IPO_EASE_OUT ICON_IPO_EASE_OUT}{@link #BND_ICON_IPO_EASE_IN_OUT ICON_IPO_EASE_IN_OUT}{@link #BND_ICON_VERTEXSEL ICON_VERTEXSEL}{@link #BND_ICON_EDGESEL ICON_EDGESEL}
    {@link #BND_ICON_FACESEL ICON_FACESEL}{@link #BND_ICON_LOOPSEL ICON_LOOPSEL}{@link #BND_ICON_ROTATE ICON_ROTATE}{@link #BND_ICON_CURSOR ICON_CURSOR}{@link #BND_ICON_ROTATECOLLECTION ICON_ROTATECOLLECTION}
    {@link #BND_ICON_ROTATECENTER ICON_ROTATECENTER}{@link #BND_ICON_ROTACTIVE ICON_ROTACTIVE}{@link #BND_ICON_ALIGN ICON_ALIGN}{@link #BND_ICON_SMOOTHCURVE ICON_SMOOTHCURVE}{@link #BND_ICON_SPHERECURVE ICON_SPHERECURVE}
    {@link #BND_ICON_ROOTCURVE ICON_ROOTCURVE}{@link #BND_ICON_SHARPCURVE ICON_SHARPCURVE}{@link #BND_ICON_LINCURVE ICON_LINCURVE}{@link #BND_ICON_NOCURVE ICON_NOCURVE}{@link #BND_ICON_RNDCURVE ICON_RNDCURVE}
    {@link #BND_ICON_PROP_OFF ICON_PROP_OFF}{@link #BND_ICON_PROP_ON ICON_PROP_ON}{@link #BND_ICON_PROP_CON ICON_PROP_CON}{@link #BND_ICON_SCULPT_DYNTOPO ICON_SCULPT_DYNTOPO}{@link #BND_ICON_PARTICLE_POINT ICON_PARTICLE_POINT}
    {@link #BND_ICON_PARTICLE_TIP ICON_PARTICLE_TIP}{@link #BND_ICON_PARTICLE_PATH ICON_PARTICLE_PATH}{@link #BND_ICON_MAN_TRANS ICON_MAN_TRANS}{@link #BND_ICON_MAN_ROT ICON_MAN_ROT}{@link #BND_ICON_MAN_SCALE ICON_MAN_SCALE}
    {@link #BND_ICON_MANIPUL ICON_MANIPUL}{@link #BND_ICON_SNAP_OFF ICON_SNAP_OFF}{@link #BND_ICON_SNAP_ON ICON_SNAP_ON}{@link #BND_ICON_SNAP_NORMAL ICON_SNAP_NORMAL}{@link #BND_ICON_SNAP_INCREMENT ICON_SNAP_INCREMENT}
    {@link #BND_ICON_SNAP_VERTEX ICON_SNAP_VERTEX}{@link #BND_ICON_SNAP_EDGE ICON_SNAP_EDGE}{@link #BND_ICON_SNAP_FACE ICON_SNAP_FACE}{@link #BND_ICON_SNAP_VOLUME ICON_SNAP_VOLUME}{@link #BND_ICON_STICKY_UVS_LOC ICON_STICKY_UVS_LOC}
    {@link #BND_ICON_STICKY_UVS_DISABLE ICON_STICKY_UVS_DISABLE}{@link #BND_ICON_STICKY_UVS_VERT ICON_STICKY_UVS_VERT}{@link #BND_ICON_CLIPUV_DEHLT ICON_CLIPUV_DEHLT}{@link #BND_ICON_CLIPUV_HLT ICON_CLIPUV_HLT}{@link #BND_ICON_SNAP_PEEL_OBJECT ICON_SNAP_PEEL_OBJECT}
    {@link #BND_ICON_GRID ICON_GRID}{@link #BND_ICON_PASTEDOWN ICON_PASTEDOWN}{@link #BND_ICON_COPYDOWN ICON_COPYDOWN}{@link #BND_ICON_PASTEFLIPUP ICON_PASTEFLIPUP}{@link #BND_ICON_PASTEFLIPDOWN ICON_PASTEFLIPDOWN}
    {@link #BND_ICON_SNAP_SURFACE ICON_SNAP_SURFACE}{@link #BND_ICON_AUTOMERGE_ON ICON_AUTOMERGE_ON}{@link #BND_ICON_AUTOMERGE_OFF ICON_AUTOMERGE_OFF}{@link #BND_ICON_RETOPO ICON_RETOPO}{@link #BND_ICON_UV_VERTEXSEL ICON_UV_VERTEXSEL}
    {@link #BND_ICON_UV_EDGESEL ICON_UV_EDGESEL}{@link #BND_ICON_UV_FACESEL ICON_UV_FACESEL}{@link #BND_ICON_UV_ISLANDSEL ICON_UV_ISLANDSEL}{@link #BND_ICON_UV_SYNC_SELECT ICON_UV_SYNC_SELECT}{@link #BND_ICON_BBOX ICON_BBOX}
    {@link #BND_ICON_WIRE ICON_WIRE}{@link #BND_ICON_SOLID ICON_SOLID}{@link #BND_ICON_SMOOTH ICON_SMOOTH}{@link #BND_ICON_POTATO ICON_POTATO}{@link #BND_ICON_ORTHO ICON_ORTHO}
    {@link #BND_ICON_LOCKVIEW_OFF ICON_LOCKVIEW_OFF}{@link #BND_ICON_LOCKVIEW_ON ICON_LOCKVIEW_ON}{@link #BND_ICON_AXIS_SIDE ICON_AXIS_SIDE}{@link #BND_ICON_AXIS_FRONT ICON_AXIS_FRONT}{@link #BND_ICON_AXIS_TOP ICON_AXIS_TOP}
    {@link #BND_ICON_NDOF_DOM ICON_NDOF_DOM}{@link #BND_ICON_NDOF_TURN ICON_NDOF_TURN}{@link #BND_ICON_NDOF_FLY ICON_NDOF_FLY}{@link #BND_ICON_NDOF_TRANS ICON_NDOF_TRANS}{@link #BND_ICON_LAYER_USED ICON_LAYER_USED}
    {@link #BND_ICON_LAYER_ACTIVE ICON_LAYER_ACTIVE}{@link #BND_ICON_SORTALPHA ICON_SORTALPHA}{@link #BND_ICON_SORTBYEXT ICON_SORTBYEXT}{@link #BND_ICON_SORTTIME ICON_SORTTIME}{@link #BND_ICON_SORTSIZE ICON_SORTSIZE}
    {@link #BND_ICON_LONGDISPLAY ICON_LONGDISPLAY}{@link #BND_ICON_SHORTDISPLAY ICON_SHORTDISPLAY}{@link #BND_ICON_GHOST ICON_GHOST}{@link #BND_ICON_IMGDISPLAY ICON_IMGDISPLAY}{@link #BND_ICON_SAVE_AS ICON_SAVE_AS}
    {@link #BND_ICON_SAVE_COPY ICON_SAVE_COPY}{@link #BND_ICON_BOOKMARKS ICON_BOOKMARKS}{@link #BND_ICON_FONTPREVIEW ICON_FONTPREVIEW}{@link #BND_ICON_FILTER ICON_FILTER}{@link #BND_ICON_NEWFOLDER ICON_NEWFOLDER}
    {@link #BND_ICON_OPEN_RECENT ICON_OPEN_RECENT}{@link #BND_ICON_FILE_PARENT ICON_FILE_PARENT}{@link #BND_ICON_FILE_REFRESH ICON_FILE_REFRESH}{@link #BND_ICON_FILE_FOLDER ICON_FILE_FOLDER}{@link #BND_ICON_FILE_BLANK ICON_FILE_BLANK}
    {@link #BND_ICON_FILE_BLEND ICON_FILE_BLEND}{@link #BND_ICON_FILE_IMAGE ICON_FILE_IMAGE}{@link #BND_ICON_FILE_MOVIE ICON_FILE_MOVIE}{@link #BND_ICON_FILE_SCRIPT ICON_FILE_SCRIPT}{@link #BND_ICON_FILE_SOUND ICON_FILE_SOUND}
    {@link #BND_ICON_FILE_FONT ICON_FILE_FONT}{@link #BND_ICON_FILE_TEXT ICON_FILE_TEXT}{@link #BND_ICON_RECOVER_AUTO ICON_RECOVER_AUTO}{@link #BND_ICON_SAVE_PREFS ICON_SAVE_PREFS}{@link #BND_ICON_LINK_BLEND ICON_LINK_BLEND}
    {@link #BND_ICON_APPEND_BLEND ICON_APPEND_BLEND}{@link #BND_ICON_IMPORT ICON_IMPORT}{@link #BND_ICON_EXPORT ICON_EXPORT}{@link #BND_ICON_EXTERNAL_DATA ICON_EXTERNAL_DATA}{@link #BND_ICON_LOAD_FACTORY ICON_LOAD_FACTORY}
    {@link #BND_ICON_LOOP_BACK ICON_LOOP_BACK}{@link #BND_ICON_LOOP_FORWARDS ICON_LOOP_FORWARDS}{@link #BND_ICON_BACK ICON_BACK}{@link #BND_ICON_FORWARD ICON_FORWARD}{@link #BND_ICON_FILE_BACKUP ICON_FILE_BACKUP}
    {@link #BND_ICON_DISK_DRIVE ICON_DISK_DRIVE}{@link #BND_ICON_MATPLANE ICON_MATPLANE}{@link #BND_ICON_MATSPHERE ICON_MATSPHERE}{@link #BND_ICON_MATCUBE ICON_MATCUBE}{@link #BND_ICON_MONKEY ICON_MONKEY}
    {@link #BND_ICON_HAIR ICON_HAIR}{@link #BND_ICON_ALIASED ICON_ALIASED}{@link #BND_ICON_ANTIALIASED ICON_ANTIALIASED}{@link #BND_ICON_MAT_SPHERE_SKY ICON_MAT_SPHERE_SKY}{@link #BND_ICON_WORDWRAP_OFF ICON_WORDWRAP_OFF}
    {@link #BND_ICON_WORDWRAP_ON ICON_WORDWRAP_ON}{@link #BND_ICON_SYNTAX_OFF ICON_SYNTAX_OFF}{@link #BND_ICON_SYNTAX_ON ICON_SYNTAX_ON}{@link #BND_ICON_LINENUMBERS_OFF ICON_LINENUMBERS_OFF}{@link #BND_ICON_LINENUMBERS_ON ICON_LINENUMBERS_ON}
    {@link #BND_ICON_SCRIPTPLUGINS ICON_SCRIPTPLUGINS}{@link #BND_ICON_SEQ_SEQUENCER ICON_SEQ_SEQUENCER}{@link #BND_ICON_SEQ_PREVIEW ICON_SEQ_PREVIEW}{@link #BND_ICON_SEQ_LUMA_WAVEFORM ICON_SEQ_LUMA_WAVEFORM}{@link #BND_ICON_SEQ_CHROMA_SCOPE ICON_SEQ_CHROMA_SCOPE}
    {@link #BND_ICON_SEQ_HISTOGRAM ICON_SEQ_HISTOGRAM}{@link #BND_ICON_SEQ_SPLITVIEW ICON_SEQ_SPLITVIEW}{@link #BND_ICON_IMAGE_RGB ICON_IMAGE_RGB}{@link #BND_ICON_IMAGE_RGB_ALPHA ICON_IMAGE_RGB_ALPHA}{@link #BND_ICON_IMAGE_ALPHA ICON_IMAGE_ALPHA}
    {@link #BND_ICON_IMAGE_ZDEPTH ICON_IMAGE_ZDEPTH}{@link #BND_ICON_IMAGEFILE ICON_IMAGEFILE}
    + */ + public static void bndIcon(@NativeType("NVGcontext *") long ctx, float x, float y, int iconid) { + if (CHECKS) { + check(ctx); + } + nbndIcon(ctx, x, y, iconid); + } + + // --- [ bndDropShadow ] --- + + /** Unsafe version of: {@link #bndDropShadow DropShadow} */ + public static native void nbndDropShadow(long ctx, float x, float y, float w, float h, float r, float feather, float alpha); + + /** + * Draws a drop shadow around the rounded box at {@code (x,y)} with size {@code (w,h)} and radius {@code r}, with {@code feather} as its maximum range in + * pixels. No shadow will be painted inside the rounded box. + * + * @param ctx the NanoVG context + */ + public static void bndDropShadow(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, float r, float feather, float alpha) { + if (CHECKS) { + check(ctx); + } + nbndDropShadow(ctx, x, y, w, h, r, feather, alpha); + } + + // --- [ bndInnerBox ] --- + + /** Unsafe version of: {@link #bndInnerBox InnerBox} */ + public static native void nbndInnerBox(long ctx, float x, float y, float w, float h, float cr0, float cr1, float cr2, float cr3, long shade_top, long shade_down); + + /** + * Draws the inner part of a widget box, with a gradient from {@code shade_top} to {@code shade_down}. If {@code h>w}, the gradient will be horizontal + * instead of vertical. + * + * @param ctx the NanoVG context + */ + public static void bndInnerBox(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, float cr0, float cr1, float cr2, float cr3, @NativeType("NVGcolor") NVGColor shade_top, @NativeType("NVGcolor") NVGColor shade_down) { + if (CHECKS) { + check(ctx); + } + nbndInnerBox(ctx, x, y, w, h, cr0, cr1, cr2, cr3, shade_top.address(), shade_down.address()); + } + + // --- [ bndOutlineBox ] --- + + /** Unsafe version of: {@link #bndOutlineBox OutlineBox} */ + public static native void nbndOutlineBox(long ctx, float x, float y, float w, float h, float cr0, float cr1, float cr2, float cr3, long color); + + /** + * Draws the outline part of a widget box with the given color. + * + * @param ctx the NanoVG context + */ + public static void bndOutlineBox(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, float cr0, float cr1, float cr2, float cr3, @NativeType("NVGcolor") NVGColor color) { + if (CHECKS) { + check(ctx); + } + nbndOutlineBox(ctx, x, y, w, h, cr0, cr1, cr2, cr3, color.address()); + } + + // --- [ bndIconLabelValue ] --- + + /** Unsafe version of: {@link #bndIconLabelValue IconLabelValue} */ + public static native void nbndIconLabelValue(long ctx, float x, float y, float w, float h, int iconid, long color, int align, float fontsize, long label, long value); + + /** + * Draws an optional icon specified by {@code iconid} and an optional label with given {@code alignment}, {@code fontsize} and {@code color} within a + * widget box. + * + * @param ctx the NanoVG context + * @param iconid if ≥ 0, an icon will be drawn and the labels remaining space will be adjusted + * @param align one of:
    {@link #BND_LEFT LEFT}{@link #BND_CENTER CENTER}
    + * @param label if not {@code NULL}, it will be drawn with the specified {@code alignment}, {@code fontsize} and {@code color} + * @param value if not {@code NULL}, {@code label} and {@code value} will be drawn with a ":" separator inbetween + */ + public static void bndIconLabelValue(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @NativeType("NVGcolor") NVGColor color, int align, float fontsize, @Nullable @NativeType("char const *") ByteBuffer label, @Nullable @NativeType("char const *") ByteBuffer value) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + checkNT1Safe(value); + } + nbndIconLabelValue(ctx, x, y, w, h, iconid, color.address(), align, fontsize, memAddressSafe(label), memAddressSafe(value)); + } + + /** + * Draws an optional icon specified by {@code iconid} and an optional label with given {@code alignment}, {@code fontsize} and {@code color} within a + * widget box. + * + * @param ctx the NanoVG context + * @param iconid if ≥ 0, an icon will be drawn and the labels remaining space will be adjusted + * @param align one of:
    {@link #BND_LEFT LEFT}{@link #BND_CENTER CENTER}
    + * @param label if not {@code NULL}, it will be drawn with the specified {@code alignment}, {@code fontsize} and {@code color} + * @param value if not {@code NULL}, {@code label} and {@code value} will be drawn with a ":" separator inbetween + */ + public static void bndIconLabelValue(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @NativeType("NVGcolor") NVGColor color, int align, float fontsize, @Nullable @NativeType("char const *") CharSequence label, @Nullable @NativeType("char const *") CharSequence value) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + stack.nUTF8Safe(value, true); + long valueEncoded = value == null ? NULL : stack.getPointerAddress(); + nbndIconLabelValue(ctx, x, y, w, h, iconid, color.address(), align, fontsize, labelEncoded, valueEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndNodeIconLabel ] --- + + /** Unsafe version of: {@link #bndNodeIconLabel NodeIconLabel} */ + public static native void nbndNodeIconLabel(long ctx, float x, float y, float w, float h, int iconid, long color, long shadowColor, int align, float fontsize, long label); + + /** + * Draws an optional icon specified by {@code iconid} and an optional label with given {@code alignment}, {@code fontsize} and {@code color} within a node + * title bar. + * + * @param ctx the NanoVG context + * @param iconid if ≥ 0, an icon will be drawn + * @param label if not {@code NULL}, it will be drawn with the specified {@code alignment}, {@code fontsize} and {@code color} + */ + public static void bndNodeIconLabel(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @NativeType("NVGcolor") NVGColor color, @NativeType("NVGcolor") NVGColor shadowColor, int align, float fontsize, @Nullable @NativeType("char const *") ByteBuffer label) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + nbndNodeIconLabel(ctx, x, y, w, h, iconid, color.address(), shadowColor.address(), align, fontsize, memAddressSafe(label)); + } + + /** + * Draws an optional icon specified by {@code iconid} and an optional label with given {@code alignment}, {@code fontsize} and {@code color} within a node + * title bar. + * + * @param ctx the NanoVG context + * @param iconid if ≥ 0, an icon will be drawn + * @param label if not {@code NULL}, it will be drawn with the specified {@code alignment}, {@code fontsize} and {@code color} + */ + public static void bndNodeIconLabel(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @NativeType("NVGcolor") NVGColor color, @NativeType("NVGcolor") NVGColor shadowColor, int align, float fontsize, @Nullable @NativeType("char const *") CharSequence label) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + nbndNodeIconLabel(ctx, x, y, w, h, iconid, color.address(), shadowColor.address(), align, fontsize, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndIconLabelTextPosition ] --- + + /** Unsafe version of: {@link #bndIconLabelTextPosition IconLabelTextPosition} */ + public static native int nbndIconLabelTextPosition(long ctx, float x, float y, float w, float h, int iconid, float fontsize, long label, int px, int py); + + /** + * Calculates the corresponding text position for given coordinates {@code px/py} in an {@code iconLabel}. See {@link #bndIconLabelCaret IconLabelCaret} for more info. + * + * @param ctx the NanoVG context + */ + public static int bndIconLabelTextPosition(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, float fontsize, @Nullable @NativeType("char const *") ByteBuffer label, int px, int py) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + return nbndIconLabelTextPosition(ctx, x, y, w, h, iconid, fontsize, memAddressSafe(label), px, py); + } + + /** + * Calculates the corresponding text position for given coordinates {@code px/py} in an {@code iconLabel}. See {@link #bndIconLabelCaret IconLabelCaret} for more info. + * + * @param ctx the NanoVG context + */ + public static int bndIconLabelTextPosition(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, float fontsize, @Nullable @NativeType("char const *") CharSequence label, int px, int py) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + return nbndIconLabelTextPosition(ctx, x, y, w, h, iconid, fontsize, labelEncoded, px, py); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndIconLabelCaret ] --- + + /** Unsafe version of: {@link #bndIconLabelCaret IconLabelCaret} */ + public static native void nbndIconLabelCaret(long ctx, float x, float y, float w, float h, int iconid, long color, float fontsize, long label, long caretcolor, int cbegin, int cend); + + /** + * Draws an optional icon specified by {@code iconid}, an optional label and a caret with given {@code fontsize} and {@code color} within a widget box. + * + * @param ctx the NanoVG context + * @param iconid if ≥ 0, an icon will be drawn and the labels remaining space will be adjusted + * @param label if not {@code NULL}, it will be drawn with the specified {@code alignment}, {@code fontsize} and {@code color} + * @param cbegin must be ≥ 0 and ≤ {@code strlen(text)} and denotes the beginning of the caret + * @param cend must be ≥ {@code cbegin} and ≤ {@code strlen(text)} and denotes the end of the caret. If {@code cend} < {@code cbegin}, then no caret will + * be drawn. + */ + public static void bndIconLabelCaret(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @NativeType("NVGcolor") NVGColor color, float fontsize, @Nullable @NativeType("char const *") ByteBuffer label, @NativeType("NVGcolor") NVGColor caretcolor, int cbegin, int cend) { + if (CHECKS) { + check(ctx); + checkNT1Safe(label); + } + nbndIconLabelCaret(ctx, x, y, w, h, iconid, color.address(), fontsize, memAddressSafe(label), caretcolor.address(), cbegin, cend); + } + + /** + * Draws an optional icon specified by {@code iconid}, an optional label and a caret with given {@code fontsize} and {@code color} within a widget box. + * + * @param ctx the NanoVG context + * @param iconid if ≥ 0, an icon will be drawn and the labels remaining space will be adjusted + * @param label if not {@code NULL}, it will be drawn with the specified {@code alignment}, {@code fontsize} and {@code color} + * @param cbegin must be ≥ 0 and ≤ {@code strlen(text)} and denotes the beginning of the caret + * @param cend must be ≥ {@code cbegin} and ≤ {@code strlen(text)} and denotes the end of the caret. If {@code cend} < {@code cbegin}, then no caret will + * be drawn. + */ + public static void bndIconLabelCaret(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, int iconid, @NativeType("NVGcolor") NVGColor color, float fontsize, @Nullable @NativeType("char const *") CharSequence label, @NativeType("NVGcolor") NVGColor caretcolor, int cbegin, int cend) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(label, true); + long labelEncoded = label == null ? NULL : stack.getPointerAddress(); + nbndIconLabelCaret(ctx, x, y, w, h, iconid, color.address(), fontsize, labelEncoded, caretcolor.address(), cbegin, cend); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ bndCheck ] --- + + /** Unsafe version of: {@link #bndCheck Check} */ + public static native void nbndCheck(long ctx, float ox, float oy, long color); + + /** + * Draws a checkmark for an option box with the given upper left coordinates {@code (ox,oy)} with the specified {@code color}. + * + * @param ctx the NanoVG context + */ + public static void bndCheck(@NativeType("NVGcontext *") long ctx, float ox, float oy, @NativeType("NVGcolor") NVGColor color) { + if (CHECKS) { + check(ctx); + } + nbndCheck(ctx, ox, oy, color.address()); + } + + // --- [ bndArrow ] --- + + /** Unsafe version of: {@link #bndArrow Arrow} */ + public static native void nbndArrow(long ctx, float x, float y, float s, long color); + + /** + * Draws a horizontal arrow for a number field with its center at {@code (x,y)} and size {@code s}. + * + * @param ctx the NanoVG context + * @param s if negative, the arrow points to the left + */ + public static void bndArrow(@NativeType("NVGcontext *") long ctx, float x, float y, float s, @NativeType("NVGcolor") NVGColor color) { + if (CHECKS) { + check(ctx); + } + nbndArrow(ctx, x, y, s, color.address()); + } + + // --- [ bndUpDownArrow ] --- + + /** Unsafe version of: {@link #bndUpDownArrow UpDownArrow} */ + public static native void nbndUpDownArrow(long ctx, float x, float y, float s, long color); + + /** + * Draws an up/down arrow for a choice box with its center at {@code (x,y)} and size {@code s}. + * + * @param ctx the NanoVG context + */ + public static void bndUpDownArrow(@NativeType("NVGcontext *") long ctx, float x, float y, float s, @NativeType("NVGcolor") NVGColor color) { + if (CHECKS) { + check(ctx); + } + nbndUpDownArrow(ctx, x, y, s, color.address()); + } + + // --- [ bndNodeArrowDown ] --- + + /** Unsafe version of: {@link #bndNodeArrowDown NodeArrowDown} */ + public static native void nbndNodeArrowDown(long ctx, float x, float y, float s, long color); + + /** + * Draws a node down-arrow with its tip at {@code (x,y)} and size {@code s} + * + * @param ctx the NanoVG context + */ + public static void bndNodeArrowDown(@NativeType("NVGcontext *") long ctx, float x, float y, float s, @NativeType("NVGcolor") NVGColor color) { + if (CHECKS) { + check(ctx); + } + nbndNodeArrowDown(ctx, x, y, s, color.address()); + } + + // --- [ bndNodeWireColor ] --- + + /** Unsafe version of: {@link #bndNodeWireColor NodeWireColor} */ + public static native void nbndNodeWireColor(long theme, int state, long __result); + + /** + * Returns the color of a node wire based on state. + * + * @param state {@link #BND_HOVER HOVER} indicates selected state, {@link #BND_ACTIVE ACTIVE} indicates dragged state + */ + @NativeType("NVGcolor") + public static NVGColor bndNodeWireColor(@NativeType("BNDnodeTheme const *") BNDnodeTheme theme, @NativeType("BNDwidgetState") int state, @NativeType("NVGcolor") NVGColor __result) { + nbndNodeWireColor(theme.address(), state, __result.address()); + return __result; + } + + /** Array version of: {@link #nbndSelectCorners} */ + public static native void nbndSelectCorners(float[] radiuses, float r, int flags); + + /** Array version of: {@link #bndSelectCorners SelectCorners} */ + public static void bndSelectCorners(@NativeType("float *") float[] radiuses, float r, int flags) { + if (CHECKS) { + check(radiuses, 4); + } + nbndSelectCorners(radiuses, r, flags); + } + + /** Array version of: {@link #nbndScrollHandleRect} */ + public static native void nbndScrollHandleRect(float[] x, float[] y, float[] w, float[] h, float offset, float size); + + /** Array version of: {@link #bndScrollHandleRect ScrollHandleRect} */ + public static void bndScrollHandleRect(@NativeType("float *") float[] x, @NativeType("float *") float[] y, @NativeType("float *") float[] w, @NativeType("float *") float[] h, float offset, float size) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(w, 1); + check(h, 1); + } + nbndScrollHandleRect(x, y, w, h, offset, size); + } + + public static int BND_ICONID(int x, int y) { + return x | (y << 8); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/LibNanoVG.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/LibNanoVG.java new file mode 100644 index 000000000..bb4e76f5d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/LibNanoVG.java @@ -0,0 +1,46 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** Initializes the nanovg shared library. */ +final class LibNanoVG { + + static { + String libName = Platform.mapLibraryNameBundled("lwjgl_nanovg"); + Library.loadSystem(System::load, System::loadLibrary, LibNanoVG.class, "org.lwjgl.nanovg", libName); + + MemoryAllocator allocator = getAllocator(Configuration.DEBUG_MEMORY_ALLOCATOR_INTERNAL.get(true)); + setupMalloc( + allocator.getMalloc(), + allocator.getCalloc(), + allocator.getRealloc(), + allocator.getFree(), + allocator.getAlignedAlloc(), + allocator.getAlignedFree() + ); + } + + private LibNanoVG() { + } + + static void initialize() { + // intentionally empty to trigger static initializer + } + + private static native void setupMalloc( + long malloc, + long calloc, + long realloc, + long free, + long aligned_alloc, + long aligned_free + ); + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGGradient.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGGradient.java new file mode 100644 index 000000000..ea0636846 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGGradient.java @@ -0,0 +1,225 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Layout

    + * + *
    
    + * struct NSVGgradient {
    + *     float xform[6];
    + *     char spread;
    + *     float fx;
    + *     float fy;
    + *     int nstops;
    + *     {@link NSVGGradientStop NSVGgradientStop} pstops[1];
    + * }
    + */ +@NativeType("struct NSVGgradient") +public class NSVGGradient extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + XFORM, + SPREAD, + FX, + FY, + NSTOPS, + PSTOPS; + + static { + Layout layout = __struct( + __array(4, 6), + __member(1), + __member(4), + __member(4), + __member(4), + __array(NSVGGradientStop.SIZEOF, NSVGGradientStop.ALIGNOF, 1) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + XFORM = layout.offsetof(0); + SPREAD = layout.offsetof(1); + FX = layout.offsetof(2); + FY = layout.offsetof(3); + NSTOPS = layout.offsetof(4); + PSTOPS = layout.offsetof(5); + } + + protected NSVGGradient(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NSVGGradient create(long address, @Nullable ByteBuffer container) { + return new NSVGGradient(address, container); + } + + /** + * Creates a {@code NSVGGradient} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NSVGGradient(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FloatBuffer} view of the {@code xform} field. */ + @NativeType("float[6]") + public FloatBuffer xform() { return nxform(address()); } + /** @return the value at the specified index of the {@code xform} field. */ + public float xform(int index) { return nxform(address(), index); } + /** @return the value of the {@code spread} field. */ + @NativeType("char") + public byte spread() { return nspread(address()); } + /** @return the value of the {@code fx} field. */ + public float fx() { return nfx(address()); } + /** @return the value of the {@code fy} field. */ + public float fy() { return nfy(address()); } + /** @return the value of the {@code nstops} field. */ + public int nstops() { return nnstops(address()); } + /** @return a {@link NSVGGradientStop}.Buffer view of the {@code pstops} field. */ + @NativeType("NSVGgradientStop[1]") + public NSVGGradientStop.Buffer pstops() { return npstops(address()); } + /** @return a {@link NSVGGradientStop} view of the struct at the specified index of the {@code pstops} field. */ + @NativeType("NSVGgradientStop") + public NSVGGradientStop pstops(int index) { return npstops(address(), index); } + + // ----------------------------------- + + /** Returns a new {@code NSVGGradient} instance for the specified memory address. */ + public static NSVGGradient create(long address) { + return new NSVGGradient(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NSVGGradient createSafe(long address) { + return address == NULL ? null : new NSVGGradient(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #xform}. */ + public static FloatBuffer nxform(long struct) { return memFloatBuffer(struct + NSVGGradient.XFORM, 6); } + /** Unsafe version of {@link #xform(int) xform}. */ + public static float nxform(long struct, int index) { + return UNSAFE.getFloat(null, struct + NSVGGradient.XFORM + check(index, 6) * 4); + } + /** Unsafe version of {@link #spread}. */ + public static byte nspread(long struct) { return UNSAFE.getByte(null, struct + NSVGGradient.SPREAD); } + /** Unsafe version of {@link #fx}. */ + public static float nfx(long struct) { return UNSAFE.getFloat(null, struct + NSVGGradient.FX); } + /** Unsafe version of {@link #fy}. */ + public static float nfy(long struct) { return UNSAFE.getFloat(null, struct + NSVGGradient.FY); } + /** Unsafe version of {@link #nstops}. */ + public static int nnstops(long struct) { return UNSAFE.getInt(null, struct + NSVGGradient.NSTOPS); } + /** Unsafe version of {@link #pstops}. */ + public static NSVGGradientStop.Buffer npstops(long struct) { return NSVGGradientStop.create(struct + NSVGGradient.PSTOPS, nnstops(struct)); } + /** Unsafe version of {@link #pstops(int) pstops}. */ + public static NSVGGradientStop npstops(long struct, int index) { + return NSVGGradientStop.create(struct + NSVGGradient.PSTOPS + check(index, nnstops(struct)) * NSVGGradientStop.SIZEOF); + } + + // ----------------------------------- + + /** An array of {@link NSVGGradient} structs. */ + public static class Buffer extends StructBuffer { + + private static final NSVGGradient ELEMENT_FACTORY = NSVGGradient.create(-1L); + + /** + * Creates a new {@code NSVGGradient.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NSVGGradient#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NSVGGradient getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FloatBuffer} view of the {@code xform} field. */ + @NativeType("float[6]") + public FloatBuffer xform() { return NSVGGradient.nxform(address()); } + /** @return the value at the specified index of the {@code xform} field. */ + public float xform(int index) { return NSVGGradient.nxform(address(), index); } + /** @return the value of the {@code spread} field. */ + @NativeType("char") + public byte spread() { return NSVGGradient.nspread(address()); } + /** @return the value of the {@code fx} field. */ + public float fx() { return NSVGGradient.nfx(address()); } + /** @return the value of the {@code fy} field. */ + public float fy() { return NSVGGradient.nfy(address()); } + /** @return the value of the {@code nstops} field. */ + public int nstops() { return NSVGGradient.nnstops(address()); } + /** @return a {@link NSVGGradientStop}.Buffer view of the {@code pstops} field. */ + @NativeType("NSVGgradientStop[1]") + public NSVGGradientStop.Buffer pstops() { return NSVGGradient.npstops(address()); } + /** @return a {@link NSVGGradientStop} view of the struct at the specified index of the {@code pstops} field. */ + @NativeType("NSVGgradientStop") + public NSVGGradientStop pstops(int index) { return NSVGGradient.npstops(address(), index); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGGradientStop.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGGradientStop.java new file mode 100644 index 000000000..1e39ab971 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGGradientStop.java @@ -0,0 +1,162 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Layout

    + * + *
    
    + * struct NSVGgradientStop {
    + *     unsigned int color;
    + *     float offset;
    + * }
    + */ +@NativeType("struct NSVGgradientStop") +public class NSVGGradientStop extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + COLOR, + OFFSET; + + static { + Layout layout = __struct( + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + COLOR = layout.offsetof(0); + OFFSET = layout.offsetof(1); + } + + protected NSVGGradientStop(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NSVGGradientStop create(long address, @Nullable ByteBuffer container) { + return new NSVGGradientStop(address, container); + } + + /** + * Creates a {@code NSVGGradientStop} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NSVGGradientStop(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code color} field. */ + @NativeType("unsigned int") + public int color() { return ncolor(address()); } + /** @return the value of the {@code offset} field. */ + public float offset() { return noffset(address()); } + + // ----------------------------------- + + /** Returns a new {@code NSVGGradientStop} instance for the specified memory address. */ + public static NSVGGradientStop create(long address) { + return new NSVGGradientStop(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NSVGGradientStop createSafe(long address) { + return address == NULL ? null : new NSVGGradientStop(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #color}. */ + public static int ncolor(long struct) { return UNSAFE.getInt(null, struct + NSVGGradientStop.COLOR); } + /** Unsafe version of {@link #offset}. */ + public static float noffset(long struct) { return UNSAFE.getFloat(null, struct + NSVGGradientStop.OFFSET); } + + // ----------------------------------- + + /** An array of {@link NSVGGradientStop} structs. */ + public static class Buffer extends StructBuffer { + + private static final NSVGGradientStop ELEMENT_FACTORY = NSVGGradientStop.create(-1L); + + /** + * Creates a new {@code NSVGGradientStop.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NSVGGradientStop#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NSVGGradientStop getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code color} field. */ + @NativeType("unsigned int") + public int color() { return NSVGGradientStop.ncolor(address()); } + /** @return the value of the {@code offset} field. */ + public float offset() { return NSVGGradientStop.noffset(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGImage.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGImage.java new file mode 100644 index 000000000..7a9bbcf20 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGImage.java @@ -0,0 +1,172 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Layout

    + * + *
    
    + * struct NSVGimage {
    + *     float {@link #width};
    + *     float {@link #height};
    + *     {@link NSVGShape NSVGshape} * {@link #shapes};
    + * }
    + */ +@NativeType("struct NSVGimage") +public class NSVGImage extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + WIDTH, + HEIGHT, + SHAPES; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + WIDTH = layout.offsetof(0); + HEIGHT = layout.offsetof(1); + SHAPES = layout.offsetof(2); + } + + protected NSVGImage(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NSVGImage create(long address, @Nullable ByteBuffer container) { + return new NSVGImage(address, container); + } + + /** + * Creates a {@code NSVGImage} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NSVGImage(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** Width of the image. */ + public float width() { return nwidth(address()); } + /** Height of the image. */ + public float height() { return nheight(address()); } + /** lLinked list of shapes in the image */ + @NativeType("NSVGshape *") + public NSVGShape shapes() { return nshapes(address()); } + + // ----------------------------------- + + /** Returns a new {@code NSVGImage} instance for the specified memory address. */ + public static NSVGImage create(long address) { + return new NSVGImage(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NSVGImage createSafe(long address) { + return address == NULL ? null : new NSVGImage(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #width}. */ + public static float nwidth(long struct) { return UNSAFE.getFloat(null, struct + NSVGImage.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static float nheight(long struct) { return UNSAFE.getFloat(null, struct + NSVGImage.HEIGHT); } + /** Unsafe version of {@link #shapes}. */ + public static NSVGShape nshapes(long struct) { return NSVGShape.create(memGetAddress(struct + NSVGImage.SHAPES)); } + + // ----------------------------------- + + /** An array of {@link NSVGImage} structs. */ + public static class Buffer extends StructBuffer { + + private static final NSVGImage ELEMENT_FACTORY = NSVGImage.create(-1L); + + /** + * Creates a new {@code NSVGImage.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NSVGImage#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NSVGImage getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link NSVGImage#width} field. */ + public float width() { return NSVGImage.nwidth(address()); } + /** @return the value of the {@link NSVGImage#height} field. */ + public float height() { return NSVGImage.nheight(address()); } + /** @return a {@link NSVGShape} view of the struct pointed to by the {@link NSVGImage#shapes} field. */ + @NativeType("NSVGshape *") + public NSVGShape shapes() { return NSVGImage.nshapes(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGPaint.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGPaint.java new file mode 100644 index 000000000..8fb89c3a4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGPaint.java @@ -0,0 +1,180 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Layout

    + * + *
    
    + * struct NSVGpaint {
    + *     signed char type;
    + *     union {
    + *         unsigned int color;
    + *         {@link NSVGGradient NSVGgradient} * gradient;
    + *     };
    + * }
    + */ +@NativeType("struct NSVGpaint") +public class NSVGPaint extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + COLOR, + GRADIENT; + + static { + Layout layout = __struct( + __member(1), + __union( + __member(4), + __member(POINTER_SIZE) + ) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + COLOR = layout.offsetof(2); + GRADIENT = layout.offsetof(3); + } + + protected NSVGPaint(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NSVGPaint create(long address, @Nullable ByteBuffer container) { + return new NSVGPaint(address, container); + } + + /** + * Creates a {@code NSVGPaint} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NSVGPaint(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + @NativeType("signed char") + public byte type() { return ntype(address()); } + /** @return the value of the {@code color} field. */ + @NativeType("unsigned int") + public int color() { return ncolor(address()); } + /** @return a {@link NSVGGradient} view of the struct pointed to by the {@code gradient} field. */ + @NativeType("NSVGgradient *") + public NSVGGradient gradient() { return ngradient(address()); } + + // ----------------------------------- + + /** Returns a new {@code NSVGPaint} instance for the specified memory address. */ + public static NSVGPaint create(long address) { + return new NSVGPaint(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NSVGPaint createSafe(long address) { + return address == NULL ? null : new NSVGPaint(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static byte ntype(long struct) { return UNSAFE.getByte(null, struct + NSVGPaint.TYPE); } + /** Unsafe version of {@link #color}. */ + public static int ncolor(long struct) { return UNSAFE.getInt(null, struct + NSVGPaint.COLOR); } + /** Unsafe version of {@link #gradient}. */ + public static NSVGGradient ngradient(long struct) { return NSVGGradient.create(memGetAddress(struct + NSVGPaint.GRADIENT)); } + + // ----------------------------------- + + /** An array of {@link NSVGPaint} structs. */ + public static class Buffer extends StructBuffer { + + private static final NSVGPaint ELEMENT_FACTORY = NSVGPaint.create(-1L); + + /** + * Creates a new {@code NSVGPaint.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NSVGPaint#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NSVGPaint getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + @NativeType("signed char") + public byte type() { return NSVGPaint.ntype(address()); } + /** @return the value of the {@code color} field. */ + @NativeType("unsigned int") + public int color() { return NSVGPaint.ncolor(address()); } + /** @return a {@link NSVGGradient} view of the struct pointed to by the {@code gradient} field. */ + @NativeType("NSVGgradient *") + public NSVGGradient gradient() { return NSVGPaint.ngradient(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGPath.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGPath.java new file mode 100644 index 000000000..05f499ceb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGPath.java @@ -0,0 +1,207 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Layout

    + * + *
    
    + * struct NSVGpath {
    + *     float * {@link #pts};
    + *     int {@link #npts};
    + *     char {@link #closed};
    + *     float {@link #bounds}[4];
    + *     {@link NSVGPath NSVGpath} * {@link #next};
    + * }
    + */ +@NativeType("struct NSVGpath") +public class NSVGPath extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PTS, + NPTS, + CLOSED, + BOUNDS, + NEXT; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4), + __member(1), + __array(4, 4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PTS = layout.offsetof(0); + NPTS = layout.offsetof(1); + CLOSED = layout.offsetof(2); + BOUNDS = layout.offsetof(3); + NEXT = layout.offsetof(4); + } + + protected NSVGPath(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NSVGPath create(long address, @Nullable ByteBuffer container) { + return new NSVGPath(address, container); + } + + /** + * Creates a {@code NSVGPath} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NSVGPath(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** cubic bezier points: {@code x0,y0, [cpx1,cpx1,cpx2,cpy2,x1,y1], ...} */ + @NativeType("float *") + public FloatBuffer pts() { return npts(address()); } + /** total number of bezier points */ + public int npts() { return nnpts(address()); } + /** flag indicating if shapes should be treated as closed */ + @NativeType("char") + public byte closed() { return nclosed(address()); } + /** tight bounding box of the shape {@code [minx,miny,maxx,maxy]} */ + @NativeType("float[4]") + public FloatBuffer bounds() { return nbounds(address()); } + /** tight bounding box of the shape {@code [minx,miny,maxx,maxy]} */ + public float bounds(int index) { return nbounds(address(), index); } + /** pointer to next path, or {@code NULL} if last element */ + @NativeType("NSVGpath *") + public NSVGPath next() { return nnext(address()); } + + // ----------------------------------- + + /** Returns a new {@code NSVGPath} instance for the specified memory address. */ + public static NSVGPath create(long address) { + return new NSVGPath(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NSVGPath createSafe(long address) { + return address == NULL ? null : new NSVGPath(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #pts() pts}. */ + public static FloatBuffer npts(long struct) { return memFloatBuffer(memGetAddress(struct + NSVGPath.PTS), (nnpts(struct) << 1)); } + /** Unsafe version of {@link #npts}. */ + public static int nnpts(long struct) { return UNSAFE.getInt(null, struct + NSVGPath.NPTS); } + /** Unsafe version of {@link #closed}. */ + public static byte nclosed(long struct) { return UNSAFE.getByte(null, struct + NSVGPath.CLOSED); } + /** Unsafe version of {@link #bounds}. */ + public static FloatBuffer nbounds(long struct) { return memFloatBuffer(struct + NSVGPath.BOUNDS, 4); } + /** Unsafe version of {@link #bounds(int) bounds}. */ + public static float nbounds(long struct, int index) { + return UNSAFE.getFloat(null, struct + NSVGPath.BOUNDS + check(index, 4) * 4); + } + /** Unsafe version of {@link #next}. */ + public static NSVGPath nnext(long struct) { return NSVGPath.create(memGetAddress(struct + NSVGPath.NEXT)); } + + // ----------------------------------- + + /** An array of {@link NSVGPath} structs. */ + public static class Buffer extends StructBuffer { + + private static final NSVGPath ELEMENT_FACTORY = NSVGPath.create(-1L); + + /** + * Creates a new {@code NSVGPath.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NSVGPath#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NSVGPath getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FloatBuffer} view of the data pointed to by the {@link NSVGPath#pts} field. */ + @NativeType("float *") + public FloatBuffer pts() { return NSVGPath.npts(address()); } + /** @return the value of the {@link NSVGPath#npts} field. */ + public int npts() { return NSVGPath.nnpts(address()); } + /** @return the value of the {@link NSVGPath#closed} field. */ + @NativeType("char") + public byte closed() { return NSVGPath.nclosed(address()); } + /** @return a {@link FloatBuffer} view of the {@link NSVGPath#bounds} field. */ + @NativeType("float[4]") + public FloatBuffer bounds() { return NSVGPath.nbounds(address()); } + /** @return the value at the specified index of the {@link NSVGPath#bounds} field. */ + public float bounds(int index) { return NSVGPath.nbounds(address(), index); } + /** @return a {@link NSVGPath} view of the struct pointed to by the {@link NSVGPath#next} field. */ + @NativeType("NSVGpath *") + public NSVGPath next() { return NSVGPath.nnext(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGShape.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGShape.java new file mode 100644 index 000000000..3c18d2445 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NSVGShape.java @@ -0,0 +1,409 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Layout

    + * + *
    
    + * struct NSVGshape {
    + *     char {@link #id}[64];
    + *     {@link NSVGPaint NSVGpaint} {@link #fill};
    + *     {@link NSVGPaint NSVGpaint} {@link #stroke};
    + *     float {@link #opacity};
    + *     float {@link #strokeWidth};
    + *     float {@link #strokeDashOffset};
    + *     float {@link #strokeDashArray}[8];
    + *     char {@link #strokeDashCount};
    + *     char {@link #strokeLineJoin};
    + *     char {@link #strokeLineCap};
    + *     float {@link #miterLimit};
    + *     char {@link #fillRule};
    + *     unsigned char {@link #flags};
    + *     float {@link #bounds}[4];
    + *     char {@link #fillGradient}[64];
    + *     char {@link #strokeGradient}[64];
    + *     float {@link #xform}[6];
    + *     {@link NSVGPath NSVGpath} * {@link #paths};
    + *     {@link NSVGShape NSVGshape} * {@link #next};
    + * }
    + */ +@NativeType("struct NSVGshape") +public class NSVGShape extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ID, + FILL, + STROKE, + OPACITY, + STROKEWIDTH, + STROKEDASHOFFSET, + STROKEDASHARRAY, + STROKEDASHCOUNT, + STROKELINEJOIN, + STROKELINECAP, + MITERLIMIT, + FILLRULE, + FLAGS, + BOUNDS, + FILLGRADIENT, + STROKEGRADIENT, + XFORM, + PATHS, + NEXT; + + static { + Layout layout = __struct( + __array(1, 64), + __member(NSVGPaint.SIZEOF, NSVGPaint.ALIGNOF), + __member(NSVGPaint.SIZEOF, NSVGPaint.ALIGNOF), + __member(4), + __member(4), + __member(4), + __array(4, 8), + __member(1), + __member(1), + __member(1), + __member(4), + __member(1), + __member(1), + __array(4, 4), + __array(1, 64), + __array(1, 64), + __array(4, 6), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + ID = layout.offsetof(0); + FILL = layout.offsetof(1); + STROKE = layout.offsetof(2); + OPACITY = layout.offsetof(3); + STROKEWIDTH = layout.offsetof(4); + STROKEDASHOFFSET = layout.offsetof(5); + STROKEDASHARRAY = layout.offsetof(6); + STROKEDASHCOUNT = layout.offsetof(7); + STROKELINEJOIN = layout.offsetof(8); + STROKELINECAP = layout.offsetof(9); + MITERLIMIT = layout.offsetof(10); + FILLRULE = layout.offsetof(11); + FLAGS = layout.offsetof(12); + BOUNDS = layout.offsetof(13); + FILLGRADIENT = layout.offsetof(14); + STROKEGRADIENT = layout.offsetof(15); + XFORM = layout.offsetof(16); + PATHS = layout.offsetof(17); + NEXT = layout.offsetof(18); + } + + protected NSVGShape(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NSVGShape create(long address, @Nullable ByteBuffer container) { + return new NSVGShape(address, container); + } + + /** + * Creates a {@code NSVGShape} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NSVGShape(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** optional 'id' attr of the shape or its group */ + @NativeType("char[64]") + public ByteBuffer id() { return nid(address()); } + /** optional 'id' attr of the shape or its group */ + @NativeType("char[64]") + public String idString() { return nidString(address()); } + /** fill paint */ + @NativeType("NSVGpaint") + public NSVGPaint fill() { return nfill(address()); } + /** stroke paint */ + @NativeType("NSVGpaint") + public NSVGPaint stroke() { return nstroke(address()); } + /** opacity of the shape */ + public float opacity() { return nopacity(address()); } + /** stroke width (scaled) */ + public float strokeWidth() { return nstrokeWidth(address()); } + /** stroke dash offset (scaled) */ + public float strokeDashOffset() { return nstrokeDashOffset(address()); } + /** stroke dash array (scaled) */ + @NativeType("float[8]") + public FloatBuffer strokeDashArray() { return nstrokeDashArray(address()); } + /** stroke dash array (scaled) */ + public float strokeDashArray(int index) { return nstrokeDashArray(address(), index); } + /** number of dash values in dash array */ + @NativeType("char") + public byte strokeDashCount() { return nstrokeDashCount(address()); } + /** stroke join type */ + @NativeType("char") + public byte strokeLineJoin() { return nstrokeLineJoin(address()); } + /** stroke cap type */ + @NativeType("char") + public byte strokeLineCap() { return nstrokeLineCap(address()); } + /** miter limit */ + public float miterLimit() { return nmiterLimit(address()); } + /** fill rule, see NSVGfillRule */ + @NativeType("char") + public byte fillRule() { return nfillRule(address()); } + /** logical or of NSVG_FLAGS_* flags */ + @NativeType("unsigned char") + public byte flags() { return nflags(address()); } + /** tight bounding box of the shape {@code [minx,miny,maxx,maxy]} */ + @NativeType("float[4]") + public FloatBuffer bounds() { return nbounds(address()); } + /** tight bounding box of the shape {@code [minx,miny,maxx,maxy]} */ + public float bounds(int index) { return nbounds(address(), index); } + /** optional 'id' of fill gradient */ + @NativeType("char[64]") + public ByteBuffer fillGradient() { return nfillGradient(address()); } + /** optional 'id' of fill gradient */ + @NativeType("char[64]") + public String fillGradientString() { return nfillGradientString(address()); } + /** optional 'id' of stroke gradient */ + @NativeType("char[64]") + public ByteBuffer strokeGradient() { return nstrokeGradient(address()); } + /** optional 'id' of stroke gradient */ + @NativeType("char[64]") + public String strokeGradientString() { return nstrokeGradientString(address()); } + /** root transformation for fill/stroke gradient */ + @NativeType("float[6]") + public FloatBuffer xform() { return nxform(address()); } + /** root transformation for fill/stroke gradient */ + public float xform(int index) { return nxform(address(), index); } + /** linked list of paths in the image */ + @NativeType("NSVGpath *") + public NSVGPath paths() { return npaths(address()); } + /** pointer to next shape, or {@code NULL} if last element */ + @NativeType("NSVGshape *") + public NSVGShape next() { return nnext(address()); } + + // ----------------------------------- + + /** Returns a new {@code NSVGShape} instance for the specified memory address. */ + public static NSVGShape create(long address) { + return new NSVGShape(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NSVGShape createSafe(long address) { + return address == NULL ? null : new NSVGShape(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #id}. */ + public static ByteBuffer nid(long struct) { return memByteBuffer(struct + NSVGShape.ID, 64); } + /** Unsafe version of {@link #idString}. */ + public static String nidString(long struct) { return memASCII(struct + NSVGShape.ID); } + /** Unsafe version of {@link #fill}. */ + public static NSVGPaint nfill(long struct) { return NSVGPaint.create(struct + NSVGShape.FILL); } + /** Unsafe version of {@link #stroke}. */ + public static NSVGPaint nstroke(long struct) { return NSVGPaint.create(struct + NSVGShape.STROKE); } + /** Unsafe version of {@link #opacity}. */ + public static float nopacity(long struct) { return UNSAFE.getFloat(null, struct + NSVGShape.OPACITY); } + /** Unsafe version of {@link #strokeWidth}. */ + public static float nstrokeWidth(long struct) { return UNSAFE.getFloat(null, struct + NSVGShape.STROKEWIDTH); } + /** Unsafe version of {@link #strokeDashOffset}. */ + public static float nstrokeDashOffset(long struct) { return UNSAFE.getFloat(null, struct + NSVGShape.STROKEDASHOFFSET); } + /** Unsafe version of {@link #strokeDashArray}. */ + public static FloatBuffer nstrokeDashArray(long struct) { return memFloatBuffer(struct + NSVGShape.STROKEDASHARRAY, 8); } + /** Unsafe version of {@link #strokeDashArray(int) strokeDashArray}. */ + public static float nstrokeDashArray(long struct, int index) { + return UNSAFE.getFloat(null, struct + NSVGShape.STROKEDASHARRAY + check(index, 8) * 4); + } + /** Unsafe version of {@link #strokeDashCount}. */ + public static byte nstrokeDashCount(long struct) { return UNSAFE.getByte(null, struct + NSVGShape.STROKEDASHCOUNT); } + /** Unsafe version of {@link #strokeLineJoin}. */ + public static byte nstrokeLineJoin(long struct) { return UNSAFE.getByte(null, struct + NSVGShape.STROKELINEJOIN); } + /** Unsafe version of {@link #strokeLineCap}. */ + public static byte nstrokeLineCap(long struct) { return UNSAFE.getByte(null, struct + NSVGShape.STROKELINECAP); } + /** Unsafe version of {@link #miterLimit}. */ + public static float nmiterLimit(long struct) { return UNSAFE.getFloat(null, struct + NSVGShape.MITERLIMIT); } + /** Unsafe version of {@link #fillRule}. */ + public static byte nfillRule(long struct) { return UNSAFE.getByte(null, struct + NSVGShape.FILLRULE); } + /** Unsafe version of {@link #flags}. */ + public static byte nflags(long struct) { return UNSAFE.getByte(null, struct + NSVGShape.FLAGS); } + /** Unsafe version of {@link #bounds}. */ + public static FloatBuffer nbounds(long struct) { return memFloatBuffer(struct + NSVGShape.BOUNDS, 4); } + /** Unsafe version of {@link #bounds(int) bounds}. */ + public static float nbounds(long struct, int index) { + return UNSAFE.getFloat(null, struct + NSVGShape.BOUNDS + check(index, 4) * 4); + } + /** Unsafe version of {@link #fillGradient}. */ + public static ByteBuffer nfillGradient(long struct) { return memByteBuffer(struct + NSVGShape.FILLGRADIENT, 64); } + /** Unsafe version of {@link #fillGradientString}. */ + public static String nfillGradientString(long struct) { return memASCII(struct + NSVGShape.FILLGRADIENT); } + /** Unsafe version of {@link #strokeGradient}. */ + public static ByteBuffer nstrokeGradient(long struct) { return memByteBuffer(struct + NSVGShape.STROKEGRADIENT, 64); } + /** Unsafe version of {@link #strokeGradientString}. */ + public static String nstrokeGradientString(long struct) { return memASCII(struct + NSVGShape.STROKEGRADIENT); } + /** Unsafe version of {@link #xform}. */ + public static FloatBuffer nxform(long struct) { return memFloatBuffer(struct + NSVGShape.XFORM, 6); } + /** Unsafe version of {@link #xform(int) xform}. */ + public static float nxform(long struct, int index) { + return UNSAFE.getFloat(null, struct + NSVGShape.XFORM + check(index, 6) * 4); + } + /** Unsafe version of {@link #paths}. */ + public static NSVGPath npaths(long struct) { return NSVGPath.create(memGetAddress(struct + NSVGShape.PATHS)); } + /** Unsafe version of {@link #next}. */ + public static NSVGShape nnext(long struct) { return NSVGShape.create(memGetAddress(struct + NSVGShape.NEXT)); } + + // ----------------------------------- + + /** An array of {@link NSVGShape} structs. */ + public static class Buffer extends StructBuffer { + + private static final NSVGShape ELEMENT_FACTORY = NSVGShape.create(-1L); + + /** + * Creates a new {@code NSVGShape.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NSVGShape#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NSVGShape getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the {@link NSVGShape#id} field. */ + @NativeType("char[64]") + public ByteBuffer id() { return NSVGShape.nid(address()); } + /** @return the null-terminated string stored in the {@link NSVGShape#id} field. */ + @NativeType("char[64]") + public String idString() { return NSVGShape.nidString(address()); } + /** @return a {@link NSVGPaint} view of the {@link NSVGShape#fill} field. */ + @NativeType("NSVGpaint") + public NSVGPaint fill() { return NSVGShape.nfill(address()); } + /** @return a {@link NSVGPaint} view of the {@link NSVGShape#stroke} field. */ + @NativeType("NSVGpaint") + public NSVGPaint stroke() { return NSVGShape.nstroke(address()); } + /** @return the value of the {@link NSVGShape#opacity} field. */ + public float opacity() { return NSVGShape.nopacity(address()); } + /** @return the value of the {@link NSVGShape#strokeWidth} field. */ + public float strokeWidth() { return NSVGShape.nstrokeWidth(address()); } + /** @return the value of the {@link NSVGShape#strokeDashOffset} field. */ + public float strokeDashOffset() { return NSVGShape.nstrokeDashOffset(address()); } + /** @return a {@link FloatBuffer} view of the {@link NSVGShape#strokeDashArray} field. */ + @NativeType("float[8]") + public FloatBuffer strokeDashArray() { return NSVGShape.nstrokeDashArray(address()); } + /** @return the value at the specified index of the {@link NSVGShape#strokeDashArray} field. */ + public float strokeDashArray(int index) { return NSVGShape.nstrokeDashArray(address(), index); } + /** @return the value of the {@link NSVGShape#strokeDashCount} field. */ + @NativeType("char") + public byte strokeDashCount() { return NSVGShape.nstrokeDashCount(address()); } + /** @return the value of the {@link NSVGShape#strokeLineJoin} field. */ + @NativeType("char") + public byte strokeLineJoin() { return NSVGShape.nstrokeLineJoin(address()); } + /** @return the value of the {@link NSVGShape#strokeLineCap} field. */ + @NativeType("char") + public byte strokeLineCap() { return NSVGShape.nstrokeLineCap(address()); } + /** @return the value of the {@link NSVGShape#miterLimit} field. */ + public float miterLimit() { return NSVGShape.nmiterLimit(address()); } + /** @return the value of the {@link NSVGShape#fillRule} field. */ + @NativeType("char") + public byte fillRule() { return NSVGShape.nfillRule(address()); } + /** @return the value of the {@link NSVGShape#flags} field. */ + @NativeType("unsigned char") + public byte flags() { return NSVGShape.nflags(address()); } + /** @return a {@link FloatBuffer} view of the {@link NSVGShape#bounds} field. */ + @NativeType("float[4]") + public FloatBuffer bounds() { return NSVGShape.nbounds(address()); } + /** @return the value at the specified index of the {@link NSVGShape#bounds} field. */ + public float bounds(int index) { return NSVGShape.nbounds(address(), index); } + /** @return a {@link ByteBuffer} view of the {@link NSVGShape#fillGradient} field. */ + @NativeType("char[64]") + public ByteBuffer fillGradient() { return NSVGShape.nfillGradient(address()); } + /** @return the null-terminated string stored in the {@link NSVGShape#fillGradient} field. */ + @NativeType("char[64]") + public String fillGradientString() { return NSVGShape.nfillGradientString(address()); } + /** @return a {@link ByteBuffer} view of the {@link NSVGShape#strokeGradient} field. */ + @NativeType("char[64]") + public ByteBuffer strokeGradient() { return NSVGShape.nstrokeGradient(address()); } + /** @return the null-terminated string stored in the {@link NSVGShape#strokeGradient} field. */ + @NativeType("char[64]") + public String strokeGradientString() { return NSVGShape.nstrokeGradientString(address()); } + /** @return a {@link FloatBuffer} view of the {@link NSVGShape#xform} field. */ + @NativeType("float[6]") + public FloatBuffer xform() { return NSVGShape.nxform(address()); } + /** @return the value at the specified index of the {@link NSVGShape#xform} field. */ + public float xform(int index) { return NSVGShape.nxform(address(), index); } + /** @return a {@link NSVGPath} view of the struct pointed to by the {@link NSVGShape#paths} field. */ + @NativeType("NSVGpath *") + public NSVGPath paths() { return NSVGShape.npaths(address()); } + /** @return a {@link NSVGShape} view of the struct pointed to by the {@link NSVGShape#next} field. */ + @NativeType("NSVGshape *") + public NSVGShape next() { return NSVGShape.nnext(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGColor.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGColor.java new file mode 100644 index 000000000..6e20f998a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGColor.java @@ -0,0 +1,370 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A NanoVG color. + * + *

    Layout

    + * + *
    
    + * struct NVGcolor {
    + *     union {
    + *         float {@link #rgba}[4];
    + *         struct {
    + *             float {@link #r};
    + *             float {@link #g};
    + *             float {@link #b};
    + *             float {@link #a};
    + *         };
    + *     };
    + * }
    + */ +@NativeType("struct NVGcolor") +public class NVGColor extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + RGBA, + R, + G, + B, + A; + + static { + Layout layout = __struct( + __union( + __array(4, 4), + __struct( + __member(4), + __member(4), + __member(4), + __member(4) + ) + ) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + RGBA = layout.offsetof(1); + R = layout.offsetof(3); + G = layout.offsetof(4); + B = layout.offsetof(5); + A = layout.offsetof(6); + } + + protected NVGColor(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NVGColor create(long address, @Nullable ByteBuffer container) { + return new NVGColor(address, container); + } + + /** + * Creates a {@code NVGColor} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NVGColor(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** an array of 4 color components */ + @NativeType("float[4]") + public FloatBuffer rgba() { return nrgba(address()); } + /** an array of 4 color components */ + public float rgba(int index) { return nrgba(address(), index); } + /** the color red component */ + public float r() { return nr(address()); } + /** the color green component */ + public float g() { return ng(address()); } + /** the color blue component */ + public float b() { return nb(address()); } + /** the color alpha component */ + public float a() { return na(address()); } + + /** Copies the specified {@link FloatBuffer} to the {@link #rgba} field. */ + public NVGColor rgba(@NativeType("float[4]") FloatBuffer value) { nrgba(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link #rgba} field. */ + public NVGColor rgba(int index, float value) { nrgba(address(), index, value); return this; } + /** Sets the specified value to the {@link #r} field. */ + public NVGColor r(float value) { nr(address(), value); return this; } + /** Sets the specified value to the {@link #g} field. */ + public NVGColor g(float value) { ng(address(), value); return this; } + /** Sets the specified value to the {@link #b} field. */ + public NVGColor b(float value) { nb(address(), value); return this; } + /** Sets the specified value to the {@link #a} field. */ + public NVGColor a(float value) { na(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public NVGColor set(NVGColor src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code NVGColor} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static NVGColor malloc() { + return new NVGColor(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code NVGColor} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static NVGColor calloc() { + return new NVGColor(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code NVGColor} instance allocated with {@link BufferUtils}. */ + public static NVGColor create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new NVGColor(memAddress(container), container); + } + + /** Returns a new {@code NVGColor} instance for the specified memory address. */ + public static NVGColor create(long address) { + return new NVGColor(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NVGColor createSafe(long address) { + return address == NULL ? null : new NVGColor(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static NVGColor mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static NVGColor callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static NVGColor mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static NVGColor callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code NVGColor} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static NVGColor malloc(MemoryStack stack) { + return new NVGColor(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code NVGColor} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static NVGColor calloc(MemoryStack stack) { + return new NVGColor(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #rgba}. */ + public static FloatBuffer nrgba(long struct) { return memFloatBuffer(struct + NVGColor.RGBA, 4); } + /** Unsafe version of {@link #rgba(int) rgba}. */ + public static float nrgba(long struct, int index) { + return UNSAFE.getFloat(null, struct + NVGColor.RGBA + check(index, 4) * 4); + } + /** Unsafe version of {@link #r}. */ + public static float nr(long struct) { return UNSAFE.getFloat(null, struct + NVGColor.R); } + /** Unsafe version of {@link #g}. */ + public static float ng(long struct) { return UNSAFE.getFloat(null, struct + NVGColor.G); } + /** Unsafe version of {@link #b}. */ + public static float nb(long struct) { return UNSAFE.getFloat(null, struct + NVGColor.B); } + /** Unsafe version of {@link #a}. */ + public static float na(long struct) { return UNSAFE.getFloat(null, struct + NVGColor.A); } + + /** Unsafe version of {@link #rgba(FloatBuffer) rgba}. */ + public static void nrgba(long struct, FloatBuffer value) { + if (CHECKS) { checkGT(value, 4); } + memCopy(memAddress(value), struct + NVGColor.RGBA, value.remaining() * 4); + } + /** Unsafe version of {@link #rgba(int, float) rgba}. */ + public static void nrgba(long struct, int index, float value) { + UNSAFE.putFloat(null, struct + NVGColor.RGBA + check(index, 4) * 4, value); + } + /** Unsafe version of {@link #r(float) r}. */ + public static void nr(long struct, float value) { UNSAFE.putFloat(null, struct + NVGColor.R, value); } + /** Unsafe version of {@link #g(float) g}. */ + public static void ng(long struct, float value) { UNSAFE.putFloat(null, struct + NVGColor.G, value); } + /** Unsafe version of {@link #b(float) b}. */ + public static void nb(long struct, float value) { UNSAFE.putFloat(null, struct + NVGColor.B, value); } + /** Unsafe version of {@link #a(float) a}. */ + public static void na(long struct, float value) { UNSAFE.putFloat(null, struct + NVGColor.A, value); } + + // ----------------------------------- + + /** An array of {@link NVGColor} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final NVGColor ELEMENT_FACTORY = NVGColor.create(-1L); + + /** + * Creates a new {@code NVGColor.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NVGColor#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NVGColor getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FloatBuffer} view of the {@link NVGColor#rgba} field. */ + @NativeType("float[4]") + public FloatBuffer rgba() { return NVGColor.nrgba(address()); } + /** @return the value at the specified index of the {@link NVGColor#rgba} field. */ + public float rgba(int index) { return NVGColor.nrgba(address(), index); } + /** @return the value of the {@link NVGColor#r} field. */ + public float r() { return NVGColor.nr(address()); } + /** @return the value of the {@link NVGColor#g} field. */ + public float g() { return NVGColor.ng(address()); } + /** @return the value of the {@link NVGColor#b} field. */ + public float b() { return NVGColor.nb(address()); } + /** @return the value of the {@link NVGColor#a} field. */ + public float a() { return NVGColor.na(address()); } + + /** Copies the specified {@link FloatBuffer} to the {@link NVGColor#rgba} field. */ + public Buffer rgba(@NativeType("float[4]") FloatBuffer value) { NVGColor.nrgba(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link NVGColor#rgba} field. */ + public Buffer rgba(int index, float value) { NVGColor.nrgba(address(), index, value); return this; } + /** Sets the specified value to the {@link NVGColor#r} field. */ + public Buffer r(float value) { NVGColor.nr(address(), value); return this; } + /** Sets the specified value to the {@link NVGColor#g} field. */ + public Buffer g(float value) { NVGColor.ng(address(), value); return this; } + /** Sets the specified value to the {@link NVGColor#b} field. */ + public Buffer b(float value) { NVGColor.nb(address(), value); return this; } + /** Sets the specified value to the {@link NVGColor#a} field. */ + public Buffer a(float value) { NVGColor.na(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGGlyphPosition.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGGlyphPosition.java new file mode 100644 index 000000000..5ad949603 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGGlyphPosition.java @@ -0,0 +1,287 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A glyph position. + * + *

    Layout

    + * + *
    
    + * struct NVGglyphPosition {
    + *     char * {@link #str};
    + *     float {@link #x};
    + *     float {@link #minx};
    + *     float {@link #maxx};
    + * }
    + */ +@NativeType("struct NVGglyphPosition") +public class NVGGlyphPosition extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + STR, + X, + MINX, + MAXX; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + STR = layout.offsetof(0); + X = layout.offsetof(1); + MINX = layout.offsetof(2); + MAXX = layout.offsetof(3); + } + + protected NVGGlyphPosition(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NVGGlyphPosition create(long address, @Nullable ByteBuffer container) { + return new NVGGlyphPosition(address, container); + } + + /** + * Creates a {@code NVGGlyphPosition} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NVGGlyphPosition(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** position of the glyph in the input string */ + @NativeType("char *") + public long str() { return nstr(address()); } + /** the x-coordinate of the logical glyph position */ + public float x() { return nx(address()); } + /** the left bound of the glyph shape */ + public float minx() { return nminx(address()); } + /** the right bound of the glyph shape */ + public float maxx() { return nmaxx(address()); } + + // ----------------------------------- + + /** Returns a new {@code NVGGlyphPosition} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static NVGGlyphPosition malloc() { + return new NVGGlyphPosition(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code NVGGlyphPosition} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static NVGGlyphPosition calloc() { + return new NVGGlyphPosition(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code NVGGlyphPosition} instance allocated with {@link BufferUtils}. */ + public static NVGGlyphPosition create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new NVGGlyphPosition(memAddress(container), container); + } + + /** Returns a new {@code NVGGlyphPosition} instance for the specified memory address. */ + public static NVGGlyphPosition create(long address) { + return new NVGGlyphPosition(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NVGGlyphPosition createSafe(long address) { + return address == NULL ? null : new NVGGlyphPosition(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static NVGGlyphPosition mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static NVGGlyphPosition callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static NVGGlyphPosition mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static NVGGlyphPosition callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code NVGGlyphPosition} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static NVGGlyphPosition malloc(MemoryStack stack) { + return new NVGGlyphPosition(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code NVGGlyphPosition} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static NVGGlyphPosition calloc(MemoryStack stack) { + return new NVGGlyphPosition(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #str}. */ + public static long nstr(long struct) { return memGetAddress(struct + NVGGlyphPosition.STR); } + /** Unsafe version of {@link #x}. */ + public static float nx(long struct) { return UNSAFE.getFloat(null, struct + NVGGlyphPosition.X); } + /** Unsafe version of {@link #minx}. */ + public static float nminx(long struct) { return UNSAFE.getFloat(null, struct + NVGGlyphPosition.MINX); } + /** Unsafe version of {@link #maxx}. */ + public static float nmaxx(long struct) { return UNSAFE.getFloat(null, struct + NVGGlyphPosition.MAXX); } + + // ----------------------------------- + + /** An array of {@link NVGGlyphPosition} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final NVGGlyphPosition ELEMENT_FACTORY = NVGGlyphPosition.create(-1L); + + /** + * Creates a new {@code NVGGlyphPosition.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NVGGlyphPosition#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NVGGlyphPosition getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link NVGGlyphPosition#str} field. */ + @NativeType("char *") + public long str() { return NVGGlyphPosition.nstr(address()); } + /** @return the value of the {@link NVGGlyphPosition#x} field. */ + public float x() { return NVGGlyphPosition.nx(address()); } + /** @return the value of the {@link NVGGlyphPosition#minx} field. */ + public float minx() { return NVGGlyphPosition.nminx(address()); } + /** @return the value of the {@link NVGGlyphPosition#maxx} field. */ + public float maxx() { return NVGGlyphPosition.nmaxx(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGLUFramebuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGLUFramebuffer.java new file mode 100644 index 000000000..03a14b03d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGLUFramebuffer.java @@ -0,0 +1,188 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A framebuffer object. + * + *

    Layout

    + * + *
    
    + * struct NVGLUframebuffer {
    + *     GLuint {@link #fbo};
    + *     GLuint {@link #rbo};
    + *     GLuint {@link #texture};
    + *     int {@link #image};
    + * }
    + */ +@NativeType("struct NVGLUframebuffer") +public class NVGLUFramebuffer extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FBO, + RBO, + TEXTURE, + IMAGE; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FBO = layout.offsetof(0); + RBO = layout.offsetof(1); + TEXTURE = layout.offsetof(2); + IMAGE = layout.offsetof(3); + } + + protected NVGLUFramebuffer(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NVGLUFramebuffer create(long address, @Nullable ByteBuffer container) { + return new NVGLUFramebuffer(address, container); + } + + /** + * Creates a {@code NVGLUFramebuffer} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NVGLUFramebuffer(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the OpenGL framebuffer object handle */ + @NativeType("GLuint") + public int fbo() { return nfbo(address()); } + /** the OpenGL renderbuffer handle */ + @NativeType("GLuint") + public int rbo() { return nrbo(address()); } + /** the OpenGL texture handle */ + @NativeType("GLuint") + public int texture() { return ntexture(address()); } + /** the NanoVG image handle */ + public int image() { return nimage(address()); } + + // ----------------------------------- + + /** Returns a new {@code NVGLUFramebuffer} instance for the specified memory address. */ + public static NVGLUFramebuffer create(long address) { + return new NVGLUFramebuffer(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NVGLUFramebuffer createSafe(long address) { + return address == NULL ? null : new NVGLUFramebuffer(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #fbo}. */ + public static int nfbo(long struct) { return UNSAFE.getInt(null, struct + NVGLUFramebuffer.FBO); } + /** Unsafe version of {@link #rbo}. */ + public static int nrbo(long struct) { return UNSAFE.getInt(null, struct + NVGLUFramebuffer.RBO); } + /** Unsafe version of {@link #texture}. */ + public static int ntexture(long struct) { return UNSAFE.getInt(null, struct + NVGLUFramebuffer.TEXTURE); } + /** Unsafe version of {@link #image}. */ + public static int nimage(long struct) { return UNSAFE.getInt(null, struct + NVGLUFramebuffer.IMAGE); } + + // ----------------------------------- + + /** An array of {@link NVGLUFramebuffer} structs. */ + public static class Buffer extends StructBuffer { + + private static final NVGLUFramebuffer ELEMENT_FACTORY = NVGLUFramebuffer.create(-1L); + + /** + * Creates a new {@code NVGLUFramebuffer.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NVGLUFramebuffer#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NVGLUFramebuffer getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link NVGLUFramebuffer#fbo} field. */ + @NativeType("GLuint") + public int fbo() { return NVGLUFramebuffer.nfbo(address()); } + /** @return the value of the {@link NVGLUFramebuffer#rbo} field. */ + @NativeType("GLuint") + public int rbo() { return NVGLUFramebuffer.nrbo(address()); } + /** @return the value of the {@link NVGLUFramebuffer#texture} field. */ + @NativeType("GLuint") + public int texture() { return NVGLUFramebuffer.ntexture(address()); } + /** @return the value of the {@link NVGLUFramebuffer#image} field. */ + public int image() { return NVGLUFramebuffer.nimage(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGLUFramebufferBGFX.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGLUFramebufferBGFX.java new file mode 100644 index 000000000..6de267e1d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGLUFramebufferBGFX.java @@ -0,0 +1,188 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A framebuffer object. + * + *

    Layout

    + * + *
    
    + * struct NVGLUframebuffer {
    + *     NVGcontext * ctx;
    + *     bgfx_frame_buffer_handle_t handle;
    + *     int image;
    + *     bgfx_view_id_t viewId;
    + * }
    + */ +@NativeType("struct NVGLUframebuffer") +public class NVGLUFramebufferBGFX extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + CTX, + HANDLE, + IMAGE, + VIEWID; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(2), + __member(4), + __member(2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + CTX = layout.offsetof(0); + HANDLE = layout.offsetof(1); + IMAGE = layout.offsetof(2); + VIEWID = layout.offsetof(3); + } + + protected NVGLUFramebufferBGFX(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NVGLUFramebufferBGFX create(long address, @Nullable ByteBuffer container) { + return new NVGLUFramebufferBGFX(address, container); + } + + /** + * Creates a {@code NVGLUFramebufferBGFX} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NVGLUFramebufferBGFX(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code ctx} field. */ + @NativeType("NVGcontext *") + public long ctx() { return nctx(address()); } + /** @return the value of the {@code handle} field. */ + @NativeType("bgfx_frame_buffer_handle_t") + public short handle() { return nhandle(address()); } + /** @return the value of the {@code image} field. */ + public int image() { return nimage(address()); } + /** @return the value of the {@code viewId} field. */ + @NativeType("bgfx_view_id_t") + public short viewId() { return nviewId(address()); } + + // ----------------------------------- + + /** Returns a new {@code NVGLUFramebufferBGFX} instance for the specified memory address. */ + public static NVGLUFramebufferBGFX create(long address) { + return new NVGLUFramebufferBGFX(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NVGLUFramebufferBGFX createSafe(long address) { + return address == NULL ? null : new NVGLUFramebufferBGFX(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #ctx}. */ + public static long nctx(long struct) { return memGetAddress(struct + NVGLUFramebufferBGFX.CTX); } + /** Unsafe version of {@link #handle}. */ + public static short nhandle(long struct) { return UNSAFE.getShort(null, struct + NVGLUFramebufferBGFX.HANDLE); } + /** Unsafe version of {@link #image}. */ + public static int nimage(long struct) { return UNSAFE.getInt(null, struct + NVGLUFramebufferBGFX.IMAGE); } + /** Unsafe version of {@link #viewId}. */ + public static short nviewId(long struct) { return UNSAFE.getShort(null, struct + NVGLUFramebufferBGFX.VIEWID); } + + // ----------------------------------- + + /** An array of {@link NVGLUFramebufferBGFX} structs. */ + public static class Buffer extends StructBuffer { + + private static final NVGLUFramebufferBGFX ELEMENT_FACTORY = NVGLUFramebufferBGFX.create(-1L); + + /** + * Creates a new {@code NVGLUFramebufferBGFX.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NVGLUFramebufferBGFX#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NVGLUFramebufferBGFX getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code ctx} field. */ + @NativeType("NVGcontext *") + public long ctx() { return NVGLUFramebufferBGFX.nctx(address()); } + /** @return the value of the {@code handle} field. */ + @NativeType("bgfx_frame_buffer_handle_t") + public short handle() { return NVGLUFramebufferBGFX.nhandle(address()); } + /** @return the value of the {@code image} field. */ + public int image() { return NVGLUFramebufferBGFX.nimage(address()); } + /** @return the value of the {@code viewId} field. */ + @NativeType("bgfx_view_id_t") + public short viewId() { return NVGLUFramebufferBGFX.nviewId(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGPaint.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGPaint.java new file mode 100644 index 000000000..f5c646514 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGPaint.java @@ -0,0 +1,448 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A NanoVG paint. + * + *

    Layout

    + * + *
    
    + * struct NVGpaint {
    + *     float {@link #xform}[6];
    + *     float {@link #extent}[2];
    + *     float {@link #radius};
    + *     float {@link #feather};
    + *     {@link NVGColor NVGcolor} {@link #innerColor};
    + *     {@link NVGColor NVGcolor} {@link #outerColor};
    + *     int {@link #image};
    + * }
    + */ +@NativeType("struct NVGpaint") +public class NVGPaint extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + XFORM, + EXTENT, + RADIUS, + FEATHER, + INNERCOLOR, + OUTERCOLOR, + IMAGE; + + static { + Layout layout = __struct( + __array(4, 6), + __array(4, 2), + __member(4), + __member(4), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(NVGColor.SIZEOF, NVGColor.ALIGNOF), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + XFORM = layout.offsetof(0); + EXTENT = layout.offsetof(1); + RADIUS = layout.offsetof(2); + FEATHER = layout.offsetof(3); + INNERCOLOR = layout.offsetof(4); + OUTERCOLOR = layout.offsetof(5); + IMAGE = layout.offsetof(6); + } + + protected NVGPaint(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NVGPaint create(long address, @Nullable ByteBuffer container) { + return new NVGPaint(address, container); + } + + /** + * Creates a {@code NVGPaint} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NVGPaint(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the transformation matrix */ + @NativeType("float[6]") + public FloatBuffer xform() { return nxform(address()); } + /** the transformation matrix */ + public float xform(int index) { return nxform(address(), index); } + /** the extent */ + @NativeType("float[2]") + public FloatBuffer extent() { return nextent(address()); } + /** the extent */ + public float extent(int index) { return nextent(address(), index); } + /** the radius */ + public float radius() { return nradius(address()); } + /** the feather amount */ + public float feather() { return nfeather(address()); } + /** the inner color */ + @NativeType("NVGcolor") + public NVGColor innerColor() { return ninnerColor(address()); } + /** the outer color */ + @NativeType("NVGcolor") + public NVGColor outerColor() { return nouterColor(address()); } + /** the image handle */ + public int image() { return nimage(address()); } + + /** Copies the specified {@link FloatBuffer} to the {@link #xform} field. */ + public NVGPaint xform(@NativeType("float[6]") FloatBuffer value) { nxform(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link #xform} field. */ + public NVGPaint xform(int index, float value) { nxform(address(), index, value); return this; } + /** Copies the specified {@link FloatBuffer} to the {@link #extent} field. */ + public NVGPaint extent(@NativeType("float[2]") FloatBuffer value) { nextent(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link #extent} field. */ + public NVGPaint extent(int index, float value) { nextent(address(), index, value); return this; } + /** Sets the specified value to the {@link #radius} field. */ + public NVGPaint radius(float value) { nradius(address(), value); return this; } + /** Sets the specified value to the {@link #feather} field. */ + public NVGPaint feather(float value) { nfeather(address(), value); return this; } + /** Copies the specified {@link NVGColor} to the {@link #innerColor} field. */ + public NVGPaint innerColor(@NativeType("NVGcolor") NVGColor value) { ninnerColor(address(), value); return this; } + /** Passes the {@link #innerColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public NVGPaint innerColor(java.util.function.Consumer consumer) { consumer.accept(innerColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link #outerColor} field. */ + public NVGPaint outerColor(@NativeType("NVGcolor") NVGColor value) { nouterColor(address(), value); return this; } + /** Passes the {@link #outerColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public NVGPaint outerColor(java.util.function.Consumer consumer) { consumer.accept(outerColor()); return this; } + /** Sets the specified value to the {@link #image} field. */ + public NVGPaint image(int value) { nimage(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public NVGPaint set( + FloatBuffer xform, + FloatBuffer extent, + float radius, + float feather, + NVGColor innerColor, + NVGColor outerColor, + int image + ) { + xform(xform); + extent(extent); + radius(radius); + feather(feather); + innerColor(innerColor); + outerColor(outerColor); + image(image); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public NVGPaint set(NVGPaint src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code NVGPaint} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static NVGPaint malloc() { + return new NVGPaint(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code NVGPaint} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static NVGPaint calloc() { + return new NVGPaint(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code NVGPaint} instance allocated with {@link BufferUtils}. */ + public static NVGPaint create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new NVGPaint(memAddress(container), container); + } + + /** Returns a new {@code NVGPaint} instance for the specified memory address. */ + public static NVGPaint create(long address) { + return new NVGPaint(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NVGPaint createSafe(long address) { + return address == NULL ? null : new NVGPaint(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static NVGPaint mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static NVGPaint callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static NVGPaint mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static NVGPaint callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code NVGPaint} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static NVGPaint malloc(MemoryStack stack) { + return new NVGPaint(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code NVGPaint} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static NVGPaint calloc(MemoryStack stack) { + return new NVGPaint(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #xform}. */ + public static FloatBuffer nxform(long struct) { return memFloatBuffer(struct + NVGPaint.XFORM, 6); } + /** Unsafe version of {@link #xform(int) xform}. */ + public static float nxform(long struct, int index) { + return UNSAFE.getFloat(null, struct + NVGPaint.XFORM + check(index, 6) * 4); + } + /** Unsafe version of {@link #extent}. */ + public static FloatBuffer nextent(long struct) { return memFloatBuffer(struct + NVGPaint.EXTENT, 2); } + /** Unsafe version of {@link #extent(int) extent}. */ + public static float nextent(long struct, int index) { + return UNSAFE.getFloat(null, struct + NVGPaint.EXTENT + check(index, 2) * 4); + } + /** Unsafe version of {@link #radius}. */ + public static float nradius(long struct) { return UNSAFE.getFloat(null, struct + NVGPaint.RADIUS); } + /** Unsafe version of {@link #feather}. */ + public static float nfeather(long struct) { return UNSAFE.getFloat(null, struct + NVGPaint.FEATHER); } + /** Unsafe version of {@link #innerColor}. */ + public static NVGColor ninnerColor(long struct) { return NVGColor.create(struct + NVGPaint.INNERCOLOR); } + /** Unsafe version of {@link #outerColor}. */ + public static NVGColor nouterColor(long struct) { return NVGColor.create(struct + NVGPaint.OUTERCOLOR); } + /** Unsafe version of {@link #image}. */ + public static int nimage(long struct) { return UNSAFE.getInt(null, struct + NVGPaint.IMAGE); } + + /** Unsafe version of {@link #xform(FloatBuffer) xform}. */ + public static void nxform(long struct, FloatBuffer value) { + if (CHECKS) { checkGT(value, 6); } + memCopy(memAddress(value), struct + NVGPaint.XFORM, value.remaining() * 4); + } + /** Unsafe version of {@link #xform(int, float) xform}. */ + public static void nxform(long struct, int index, float value) { + UNSAFE.putFloat(null, struct + NVGPaint.XFORM + check(index, 6) * 4, value); + } + /** Unsafe version of {@link #extent(FloatBuffer) extent}. */ + public static void nextent(long struct, FloatBuffer value) { + if (CHECKS) { checkGT(value, 2); } + memCopy(memAddress(value), struct + NVGPaint.EXTENT, value.remaining() * 4); + } + /** Unsafe version of {@link #extent(int, float) extent}. */ + public static void nextent(long struct, int index, float value) { + UNSAFE.putFloat(null, struct + NVGPaint.EXTENT + check(index, 2) * 4, value); + } + /** Unsafe version of {@link #radius(float) radius}. */ + public static void nradius(long struct, float value) { UNSAFE.putFloat(null, struct + NVGPaint.RADIUS, value); } + /** Unsafe version of {@link #feather(float) feather}. */ + public static void nfeather(long struct, float value) { UNSAFE.putFloat(null, struct + NVGPaint.FEATHER, value); } + /** Unsafe version of {@link #innerColor(NVGColor) innerColor}. */ + public static void ninnerColor(long struct, NVGColor value) { memCopy(value.address(), struct + NVGPaint.INNERCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #outerColor(NVGColor) outerColor}. */ + public static void nouterColor(long struct, NVGColor value) { memCopy(value.address(), struct + NVGPaint.OUTERCOLOR, NVGColor.SIZEOF); } + /** Unsafe version of {@link #image(int) image}. */ + public static void nimage(long struct, int value) { UNSAFE.putInt(null, struct + NVGPaint.IMAGE, value); } + + // ----------------------------------- + + /** An array of {@link NVGPaint} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final NVGPaint ELEMENT_FACTORY = NVGPaint.create(-1L); + + /** + * Creates a new {@code NVGPaint.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NVGPaint#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NVGPaint getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FloatBuffer} view of the {@link NVGPaint#xform} field. */ + @NativeType("float[6]") + public FloatBuffer xform() { return NVGPaint.nxform(address()); } + /** @return the value at the specified index of the {@link NVGPaint#xform} field. */ + public float xform(int index) { return NVGPaint.nxform(address(), index); } + /** @return a {@link FloatBuffer} view of the {@link NVGPaint#extent} field. */ + @NativeType("float[2]") + public FloatBuffer extent() { return NVGPaint.nextent(address()); } + /** @return the value at the specified index of the {@link NVGPaint#extent} field. */ + public float extent(int index) { return NVGPaint.nextent(address(), index); } + /** @return the value of the {@link NVGPaint#radius} field. */ + public float radius() { return NVGPaint.nradius(address()); } + /** @return the value of the {@link NVGPaint#feather} field. */ + public float feather() { return NVGPaint.nfeather(address()); } + /** @return a {@link NVGColor} view of the {@link NVGPaint#innerColor} field. */ + @NativeType("NVGcolor") + public NVGColor innerColor() { return NVGPaint.ninnerColor(address()); } + /** @return a {@link NVGColor} view of the {@link NVGPaint#outerColor} field. */ + @NativeType("NVGcolor") + public NVGColor outerColor() { return NVGPaint.nouterColor(address()); } + /** @return the value of the {@link NVGPaint#image} field. */ + public int image() { return NVGPaint.nimage(address()); } + + /** Copies the specified {@link FloatBuffer} to the {@link NVGPaint#xform} field. */ + public Buffer xform(@NativeType("float[6]") FloatBuffer value) { NVGPaint.nxform(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link NVGPaint#xform} field. */ + public Buffer xform(int index, float value) { NVGPaint.nxform(address(), index, value); return this; } + /** Copies the specified {@link FloatBuffer} to the {@link NVGPaint#extent} field. */ + public Buffer extent(@NativeType("float[2]") FloatBuffer value) { NVGPaint.nextent(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link NVGPaint#extent} field. */ + public Buffer extent(int index, float value) { NVGPaint.nextent(address(), index, value); return this; } + /** Sets the specified value to the {@link NVGPaint#radius} field. */ + public Buffer radius(float value) { NVGPaint.nradius(address(), value); return this; } + /** Sets the specified value to the {@link NVGPaint#feather} field. */ + public Buffer feather(float value) { NVGPaint.nfeather(address(), value); return this; } + /** Copies the specified {@link NVGColor} to the {@link NVGPaint#innerColor} field. */ + public Buffer innerColor(@NativeType("NVGcolor") NVGColor value) { NVGPaint.ninnerColor(address(), value); return this; } + /** Passes the {@link NVGPaint#innerColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer innerColor(java.util.function.Consumer consumer) { consumer.accept(innerColor()); return this; } + /** Copies the specified {@link NVGColor} to the {@link NVGPaint#outerColor} field. */ + public Buffer outerColor(@NativeType("NVGcolor") NVGColor value) { NVGPaint.nouterColor(address(), value); return this; } + /** Passes the {@link NVGPaint#outerColor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer outerColor(java.util.function.Consumer consumer) { consumer.accept(outerColor()); return this; } + /** Sets the specified value to the {@link NVGPaint#image} field. */ + public Buffer image(int value) { NVGPaint.nimage(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGTextRow.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGTextRow.java new file mode 100644 index 000000000..1ae51e879 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NVGTextRow.java @@ -0,0 +1,311 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A text row. + * + *

    Layout

    + * + *
    
    + * struct NVGtextRow {
    + *     char * {@link #start};
    + *     char * {@link #end};
    + *     char * {@link #next};
    + *     float {@link #width};
    + *     float {@link #minx};
    + *     float {@link #maxx};
    + * }
    + */ +@NativeType("struct NVGtextRow") +public class NVGTextRow extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + START, + END, + NEXT, + WIDTH, + MINX, + MAXX; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + START = layout.offsetof(0); + END = layout.offsetof(1); + NEXT = layout.offsetof(2); + WIDTH = layout.offsetof(3); + MINX = layout.offsetof(4); + MAXX = layout.offsetof(5); + } + + protected NVGTextRow(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected NVGTextRow create(long address, @Nullable ByteBuffer container) { + return new NVGTextRow(address, container); + } + + /** + * Creates a {@code NVGTextRow} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public NVGTextRow(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** pointer to the input text where the row starts */ + @NativeType("char *") + public long start() { return nstart(address()); } + /** pointer to the input text where the row ends (one past the last character */ + @NativeType("char *") + public long end() { return nend(address()); } + /** pointer to the beginning of the next row */ + @NativeType("char *") + public long next() { return nnext(address()); } + /** logical width of the row */ + public float width() { return nwidth(address()); } + /** actual left bound of the row. Logical width and bounds can differ because of kerning and some parts over extending. */ + public float minx() { return nminx(address()); } + /** actual right bound of the row. Logical width and bounds can differ because of kerning and some parts over extending. */ + public float maxx() { return nmaxx(address()); } + + // ----------------------------------- + + /** Returns a new {@code NVGTextRow} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static NVGTextRow malloc() { + return new NVGTextRow(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code NVGTextRow} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static NVGTextRow calloc() { + return new NVGTextRow(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code NVGTextRow} instance allocated with {@link BufferUtils}. */ + public static NVGTextRow create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new NVGTextRow(memAddress(container), container); + } + + /** Returns a new {@code NVGTextRow} instance for the specified memory address. */ + public static NVGTextRow create(long address) { + return new NVGTextRow(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static NVGTextRow createSafe(long address) { + return address == NULL ? null : new NVGTextRow(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static NVGTextRow mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static NVGTextRow callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static NVGTextRow mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static NVGTextRow callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code NVGTextRow} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static NVGTextRow malloc(MemoryStack stack) { + return new NVGTextRow(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code NVGTextRow} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static NVGTextRow calloc(MemoryStack stack) { + return new NVGTextRow(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #start}. */ + public static long nstart(long struct) { return memGetAddress(struct + NVGTextRow.START); } + /** Unsafe version of {@link #end}. */ + public static long nend(long struct) { return memGetAddress(struct + NVGTextRow.END); } + /** Unsafe version of {@link #next}. */ + public static long nnext(long struct) { return memGetAddress(struct + NVGTextRow.NEXT); } + /** Unsafe version of {@link #width}. */ + public static float nwidth(long struct) { return UNSAFE.getFloat(null, struct + NVGTextRow.WIDTH); } + /** Unsafe version of {@link #minx}. */ + public static float nminx(long struct) { return UNSAFE.getFloat(null, struct + NVGTextRow.MINX); } + /** Unsafe version of {@link #maxx}. */ + public static float nmaxx(long struct) { return UNSAFE.getFloat(null, struct + NVGTextRow.MAXX); } + + // ----------------------------------- + + /** An array of {@link NVGTextRow} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final NVGTextRow ELEMENT_FACTORY = NVGTextRow.create(-1L); + + /** + * Creates a new {@code NVGTextRow.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link NVGTextRow#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected NVGTextRow getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link NVGTextRow#start} field. */ + @NativeType("char *") + public long start() { return NVGTextRow.nstart(address()); } + /** @return the value of the {@link NVGTextRow#end} field. */ + @NativeType("char *") + public long end() { return NVGTextRow.nend(address()); } + /** @return the value of the {@link NVGTextRow#next} field. */ + @NativeType("char *") + public long next() { return NVGTextRow.nnext(address()); } + /** @return the value of the {@link NVGTextRow#width} field. */ + public float width() { return NVGTextRow.nwidth(address()); } + /** @return the value of the {@link NVGTextRow#minx} field. */ + public float minx() { return NVGTextRow.nminx(address()); } + /** @return the value of the {@link NVGTextRow#maxx} field. */ + public float maxx() { return NVGTextRow.nmaxx(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoSVG.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoSVG.java new file mode 100644 index 000000000..a44b85bb4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoSVG.java @@ -0,0 +1,276 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * NanoSVG is a simple stupid single-header-file SVG parse. The output of the parser is a list of cubic bezier shapes. + * + *

    The library suits well for anything from rendering scalable icons in your editor application to prototyping a game.

    + * + *

    NanoSVG supports a wide range of SVG features, but something may be missing, feel free to create a pull request!

    + * + *

    The shapes in the SVG images are transformed by the viewBox and converted to specified units. That is, you should get the same looking data as your + * designed in your favorite app.

    + * + *

    NanoSVG can return the paths in few different units. For example if you want to render an image, you may choose to get the paths in pixels, or if you + * are feeding the data into a CNC-cutter, you may want to use millimeters.

    + * + *

    The units passed to NanoSVG should be one of: 'px', 'pt', 'pc' 'mm', 'cm', or 'in'. DPI (dots-per-inch) controls how the unit conversion is done.

    + * + *

    If you don't know or care about the units stuff, "px" and 96 should get you going.

    + */ +public class NanoSVG { + + static { LibNanoVG.initialize(); } + + /** + * NSVGpaintType + * + *
    Enum values:
    + * + *
      + *
    • {@link #NSVG_PAINT_UNDEF PAINT_UNDEF}
    • + *
    • {@link #NSVG_PAINT_NONE PAINT_NONE}
    • + *
    • {@link #NSVG_PAINT_COLOR PAINT_COLOR}
    • + *
    • {@link #NSVG_PAINT_LINEAR_GRADIENT PAINT_LINEAR_GRADIENT}
    • + *
    • {@link #NSVG_PAINT_RADIAL_GRADIENT PAINT_RADIAL_GRADIENT}
    • + *
    + */ + public static final int + NSVG_PAINT_UNDEF = -1, + NSVG_PAINT_NONE = 0, + NSVG_PAINT_COLOR = 1, + NSVG_PAINT_LINEAR_GRADIENT = 2, + NSVG_PAINT_RADIAL_GRADIENT = 3; + + /** + * NSVGspreadType + * + *
    Enum values:
    + * + *
      + *
    • {@link #NSVG_SPREAD_PAD SPREAD_PAD}
    • + *
    • {@link #NSVG_SPREAD_REFLECT SPREAD_REFLECT}
    • + *
    • {@link #NSVG_SPREAD_REPEAT SPREAD_REPEAT}
    • + *
    + */ + public static final int + NSVG_SPREAD_PAD = 0, + NSVG_SPREAD_REFLECT = 1, + NSVG_SPREAD_REPEAT = 2; + + /** + * NSVGlineJoin + * + *
    Enum values:
    + * + *
      + *
    • {@link #NSVG_JOIN_MITER JOIN_MITER}
    • + *
    • {@link #NSVG_JOIN_ROUND JOIN_ROUND}
    • + *
    • {@link #NSVG_JOIN_BEVEL JOIN_BEVEL}
    • + *
    + */ + public static final int + NSVG_JOIN_MITER = 0, + NSVG_JOIN_ROUND = 1, + NSVG_JOIN_BEVEL = 2; + + /** + * NSVGlineCap + * + *
    Enum values:
    + * + *
      + *
    • {@link #NSVG_CAP_BUTT CAP_BUTT}
    • + *
    • {@link #NSVG_CAP_ROUND CAP_ROUND}
    • + *
    • {@link #NSVG_CAP_SQUARE CAP_SQUARE}
    • + *
    + */ + public static final int + NSVG_CAP_BUTT = 0, + NSVG_CAP_ROUND = 1, + NSVG_CAP_SQUARE = 2; + + /** + * NSVGfillRule + * + *
    Enum values:
    + * + *
      + *
    • {@link #NSVG_FILLRULE_NONZERO FILLRULE_NONZERO}
    • + *
    • {@link #NSVG_FILLRULE_EVENODD FILLRULE_EVENODD}
    • + *
    + */ + public static final int + NSVG_FILLRULE_NONZERO = 0, + NSVG_FILLRULE_EVENODD = 1; + + /** NSVGflags */ + public static final int NSVG_FLAGS_VISIBLE = 0x01; + + protected NanoSVG() { + throw new UnsupportedOperationException(); + } + + // --- [ nsvgParseFromFile ] --- + + /** Unsafe version of: {@link #nsvgParseFromFile ParseFromFile} */ + public static native long nnsvgParseFromFile(long filename, long units, float dpi); + + /** Parses SVG file from a file, returns SVG image as paths. */ + @Nullable + @NativeType("NSVGimage *") + public static NSVGImage nsvgParseFromFile(@NativeType("char const *") ByteBuffer filename, @NativeType("char const *") ByteBuffer units, float dpi) { + if (CHECKS) { + checkNT1(filename); + checkNT1(units); + } + long __result = nnsvgParseFromFile(memAddress(filename), memAddress(units), dpi); + return NSVGImage.createSafe(__result); + } + + /** Parses SVG file from a file, returns SVG image as paths. */ + @Nullable + @NativeType("NSVGimage *") + public static NSVGImage nsvgParseFromFile(@NativeType("char const *") CharSequence filename, @NativeType("char const *") CharSequence units, float dpi) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(filename, true); + long filenameEncoded = stack.getPointerAddress(); + stack.nASCII(units, true); + long unitsEncoded = stack.getPointerAddress(); + long __result = nnsvgParseFromFile(filenameEncoded, unitsEncoded, dpi); + return NSVGImage.createSafe(__result); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nsvgParse ] --- + + /** Unsafe version of: {@link #nsvgParse Parse} */ + public static native long nnsvgParse(long input, long units, float dpi); + + /** + * Parses SVG file from a null terminated string, returns SVG image as paths. + * + *

    Important note: changes the string.

    + */ + @Nullable + @NativeType("NSVGimage *") + public static NSVGImage nsvgParse(@NativeType("char *") ByteBuffer input, @NativeType("char const *") ByteBuffer units, float dpi) { + if (CHECKS) { + checkNT1(input); + checkNT1(units); + } + long __result = nnsvgParse(memAddress(input), memAddress(units), dpi); + return NSVGImage.createSafe(__result); + } + + /** + * Parses SVG file from a null terminated string, returns SVG image as paths. + * + *

    Important note: changes the string.

    + */ + @Nullable + @NativeType("NSVGimage *") + public static NSVGImage nsvgParse(@NativeType("char *") CharSequence input, @NativeType("char const *") CharSequence units, float dpi) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(input, true); + long inputEncoded = stack.getPointerAddress(); + stack.nASCII(units, true); + long unitsEncoded = stack.getPointerAddress(); + long __result = nnsvgParse(inputEncoded, unitsEncoded, dpi); + return NSVGImage.createSafe(__result); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nsvgDuplicatePath ] --- + + /** Unsafe version of: {@link #nsvgDuplicatePath DuplicatePath} */ + public static native long nnsvgDuplicatePath(long p); + + /** Duplicates a path. */ + @Nullable + @NativeType("NSVGpath *") + public static NSVGPath nsvgDuplicatePath(@NativeType("NSVGpath *") NSVGPath p) { + long __result = nnsvgDuplicatePath(p.address()); + return NSVGPath.createSafe(__result); + } + + // --- [ nsvgDelete ] --- + + /** Unsafe version of: {@link #nsvgDelete Delete} */ + public static native void nnsvgDelete(long image); + + /** Deletes an image. */ + public static void nsvgDelete(@NativeType("NSVGimage *") NSVGImage image) { + nnsvgDelete(image.address()); + } + + // --- [ nsvgCreateRasterizer ] --- + + /** Allocates rasterizer context. */ + @NativeType("NSVGrasterizer *") + public static native long nsvgCreateRasterizer(); + + // --- [ nsvgRasterize ] --- + + /** Unsafe version of: {@link #nsvgRasterize Rasterize} */ + public static native void nnsvgRasterize(long r, long image, float tx, float ty, float scale, long dst, int w, int h, int stride); + + /** + * Rasterizes SVG image, returns RGBA image (non-premultiplied alpha). + * + * @param r pointer to rasterizer context + * @param image pointer to image to rasterize + * @param tx image x offset (applied after scaling) + * @param ty image y offset (applied after scaling) + * @param scale image scale + * @param dst pointer to destination image data, 4 bytes per pixel (RGBA) + * @param w width of the image to render + * @param h height of the image to render + * @param stride number of bytes per scaleline in the destination buffer + */ + public static void nsvgRasterize(@NativeType("NSVGrasterizer *") long r, @NativeType("NSVGimage *") NSVGImage image, float tx, float ty, float scale, @NativeType("unsigned char *") ByteBuffer dst, int w, int h, int stride) { + if (CHECKS) { + check(r); + check(dst, h * stride); + } + nnsvgRasterize(r, image.address(), tx, ty, scale, memAddress(dst), w, h, stride); + } + + // --- [ nsvgDeleteRasterizer ] --- + + /** Unsafe version of: {@link #nsvgDeleteRasterizer DeleteRasterizer} */ + public static native void nnsvgDeleteRasterizer(long rasterizer); + + /** + * Deletes rasterizer context. + * + * @param rasterizer the rasterizer context to delete + */ + public static void nsvgDeleteRasterizer(@NativeType("NSVGrasterizer *") long rasterizer) { + if (CHECKS) { + check(rasterizer); + } + nnsvgDeleteRasterizer(rasterizer); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVG.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVG.java new file mode 100644 index 000000000..9f69d959d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVG.java @@ -0,0 +1,2923 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * NanoVG is a small antialiased vector graphics rendering library for OpenGL. It has lean API modeled after HTML5 canvas API. It is aimed to be a + * practical and fun toolset for building scalable user interfaces and visualizations. + * + *

    Color utils

    + * + *

    Colors in NanoVG are stored as unsigned ints in ABGR format.

    + * + *

    State Handling

    + * + *

    NanoVG contains state which represents how paths will be rendered. The state contains transform, fill and stroke styles, text and font styles, and + * scissor clipping.

    + * + *

    Render styles

    + * + *

    Fill and stroke render style can be either a solid color or a paint which is a gradient or a pattern. Solid color is simply defined as a color value, + * different kinds of paints can be created using {@link #nvgLinearGradient LinearGradient}, {@link #nvgBoxGradient BoxGradient}, {@link #nvgRadialGradient RadialGradient} and {@link #nvgImagePattern ImagePattern}.

    + * + *

    Current render style can be saved and restored using {@link #nvgSave Save} and {@link #nvgRestore Restore}.

    + * + *

    Transforms

    + * + *

    The paths, gradients, patterns and scissor region are transformed by an transformation matrix at the time when they are passed to the API. The current + * transformation matrix is a affine matrix:

    + * + *
    
    + * [sx kx tx]
    + * [ky sy ty]
    + * [ 0  0  1]
    + * + *

    Where: {@code sx,sy} define scaling, {@code kx,ky} skewing, and {@code tx,ty} translation. The last row is assumed to be {@code 0,0,1} and is not + * stored.

    + * + *

    Apart from {@link #nvgResetTransform ResetTransform}, each transformation function first creates specific transformation matrix and pre-multiplies the current transformation + * by it.

    + * + *

    Current coordinate system (transformation) can be saved and restored using {@link #nvgSave Save} and {@link #nvgRestore Restore}.

    + * + *

    Images

    + * + *

    NanoVG allows you to load jpg, png, psd, tga, pic and gif files to be used for rendering. In addition you can upload your own image. The image loading + * is provided by {@code stb_image}.

    + * + *

    Paints

    + * + *

    NanoVG supports four types of paints: linear gradient, box gradient, radial gradient and image pattern. These can be used as paints for strokes and + * fills.

    + * + *

    Scissoring

    + * + *

    Scissoring allows you to clip the rendering into a rectangle. This is useful for various user interface cases like rendering a text edit or a timeline.

    + * + *

    Paths

    + * + *

    Drawing a new shape starts with {@link #nvgBeginPath BeginPath}, it clears all the currently defined paths. Then you define one or more paths and sub-paths which describe + * the shape. The are functions to draw common shapes like rectangles and circles, and lower level step-by-step functions, which allow to define a path + * curve by curve.

    + * + *

    NanoVG uses even-odd fill rule to draw the shapes. Solid shapes should have counter clockwise winding and holes should have counter clockwise order. To + * specify winding of a path you can call {@link #nvgPathWinding PathWinding}. This is useful especially for the common shapes, which are drawn {@link #NVG_CCW CCW}.

    + * + *

    Finally you can fill the path using current fill style by calling {@link #nvgFill Fill}, and stroke it with current stroke style by calling {@link #nvgStroke Stroke}.

    + * + *

    The curve segments and sub-paths are transformed by the current transform.

    + * + *

    Text

    + * + *

    NanoVG allows you to load .ttf files and use the font to render text.

    + * + *

    The appearance of the text can be defined by setting the current text style and by specifying the fill color. Common text and font settings such as + * font size, letter spacing and text align are supported. Font blur allows you to create simple text effects such as drop shadows.

    + * + *

    At render time the font face can be set based on the font handles or name.

    + * + *

    Font measure functions return values in local space, the calculations are carried in the same resolution as the final rendering. This is done because + * the text glyph positions are snapped to the nearest pixels sharp rendering.

    + * + *

    The local space means that values are not rotated or scale as per the current transformation. For example if you set font size to 12, which would mean + * that line height is 16, then regardless of the current scaling and rotation, the returned line height is always 16. Some measures may vary because of + * the scaling since aforementioned pixel snapping.

    + * + *

    While this may sound a little odd, the setup allows you to always render the same way regardless of scaling. I.e. following works regardless of scaling:

    + * + *
    
    + * const char* txt = "Text me up.";
    + * nvgTextBounds(vg, x,y, txt, NULL, bounds);
    + * nvgBeginPath(vg);
    + * nvgRoundedRect(vg, bounds[0],bounds[1], bounds[2]-bounds[0], bounds[3]-bounds[1]);
    + * nvgFill(vg);
    + * + *

    Note: currently only solid color fill is supported for text.

    + */ +public class NanoVG { + + static { LibNanoVG.initialize(); } + + /** PI */ + public static final float NVG_PI = 3.1415927f; + + /** + * Winding order. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_CCW CCW} - Winding for solid shapes
    • + *
    • {@link #NVG_CW CW} - Winding for holes
    • + *
    + */ + public static final int + NVG_CCW = 0x1, + NVG_CW = 0x2; + + /** + * Solidity. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_SOLID SOLID} - CCW
    • + *
    • {@link #NVG_HOLE HOLE} - CW
    • + *
    + */ + public static final int + NVG_SOLID = 0x1, + NVG_HOLE = 0x2; + + /** + * Line caps and joins. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_BUTT BUTT}
    • + *
    • {@link #NVG_ROUND ROUND}
    • + *
    • {@link #NVG_SQUARE SQUARE}
    • + *
    • {@link #NVG_BEVEL BEVEL}
    • + *
    • {@link #NVG_MITER MITER}
    • + *
    + */ + public static final int + NVG_BUTT = 0, + NVG_ROUND = 1, + NVG_SQUARE = 2, + NVG_BEVEL = 3, + NVG_MITER = 4; + + /** + * Alignments. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_ALIGN_LEFT ALIGN_LEFT} - Default, align text horizontally to left.
    • + *
    • {@link #NVG_ALIGN_CENTER ALIGN_CENTER} - Align text horizontally to center.
    • + *
    • {@link #NVG_ALIGN_RIGHT ALIGN_RIGHT} - Align text horizontally to right.
    • + *
    • {@link #NVG_ALIGN_TOP ALIGN_TOP} - Align text vertically to top.
    • + *
    • {@link #NVG_ALIGN_MIDDLE ALIGN_MIDDLE} - Align text vertically to middle.
    • + *
    • {@link #NVG_ALIGN_BOTTOM ALIGN_BOTTOM} - Align text vertically to bottom.
    • + *
    • {@link #NVG_ALIGN_BASELINE ALIGN_BASELINE} - Default, align text vertically to baseline.
    • + *
    + */ + public static final int + NVG_ALIGN_LEFT = 1<<0, + NVG_ALIGN_CENTER = 1<<1, + NVG_ALIGN_RIGHT = 1<<2, + NVG_ALIGN_TOP = 1<<3, + NVG_ALIGN_MIDDLE = 1<<4, + NVG_ALIGN_BOTTOM = 1<<5, + NVG_ALIGN_BASELINE = 1<<6; + + /** + * Blend factors. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_ZERO ZERO}
    • + *
    • {@link #NVG_ONE ONE}
    • + *
    • {@link #NVG_SRC_COLOR SRC_COLOR}
    • + *
    • {@link #NVG_ONE_MINUS_SRC_COLOR ONE_MINUS_SRC_COLOR}
    • + *
    • {@link #NVG_DST_COLOR DST_COLOR}
    • + *
    • {@link #NVG_ONE_MINUS_DST_COLOR ONE_MINUS_DST_COLOR}
    • + *
    • {@link #NVG_SRC_ALPHA SRC_ALPHA}
    • + *
    • {@link #NVG_ONE_MINUS_SRC_ALPHA ONE_MINUS_SRC_ALPHA}
    • + *
    • {@link #NVG_DST_ALPHA DST_ALPHA}
    • + *
    • {@link #NVG_ONE_MINUS_DST_ALPHA ONE_MINUS_DST_ALPHA}
    • + *
    • {@link #NVG_SRC_ALPHA_SATURATE SRC_ALPHA_SATURATE}
    • + *
    + */ + public static final int + NVG_ZERO = 1<<0, + NVG_ONE = 1<<1, + NVG_SRC_COLOR = 1<<2, + NVG_ONE_MINUS_SRC_COLOR = 1<<3, + NVG_DST_COLOR = 1<<4, + NVG_ONE_MINUS_DST_COLOR = 1<<5, + NVG_SRC_ALPHA = 1<<6, + NVG_ONE_MINUS_SRC_ALPHA = 1<<7, + NVG_DST_ALPHA = 1<<8, + NVG_ONE_MINUS_DST_ALPHA = 1<<9, + NVG_SRC_ALPHA_SATURATE = 1<<10; + + /** + * Composite operations. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_SOURCE_OVER SOURCE_OVER}
    • + *
    • {@link #NVG_SOURCE_IN SOURCE_IN}
    • + *
    • {@link #NVG_SOURCE_OUT SOURCE_OUT}
    • + *
    • {@link #NVG_ATOP ATOP}
    • + *
    • {@link #NVG_DESTINATION_OVER DESTINATION_OVER}
    • + *
    • {@link #NVG_DESTINATION_IN DESTINATION_IN}
    • + *
    • {@link #NVG_DESTINATION_OUT DESTINATION_OUT}
    • + *
    • {@link #NVG_DESTINATION_ATOP DESTINATION_ATOP}
    • + *
    • {@link #NVG_LIGHTER LIGHTER}
    • + *
    • {@link #NVG_COPY COPY}
    • + *
    • {@link #NVG_XOR XOR}
    • + *
    + */ + public static final int + NVG_SOURCE_OVER = 0, + NVG_SOURCE_IN = 1, + NVG_SOURCE_OUT = 2, + NVG_ATOP = 3, + NVG_DESTINATION_OVER = 4, + NVG_DESTINATION_IN = 5, + NVG_DESTINATION_OUT = 6, + NVG_DESTINATION_ATOP = 7, + NVG_LIGHTER = 8, + NVG_COPY = 9, + NVG_XOR = 10; + + /** + * Image flags. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_IMAGE_GENERATE_MIPMAPS IMAGE_GENERATE_MIPMAPS} - Generate mipmaps during creation of the image.
    • + *
    • {@link #NVG_IMAGE_REPEATX IMAGE_REPEATX} - Repeat image in X direction.
    • + *
    • {@link #NVG_IMAGE_REPEATY IMAGE_REPEATY} - Repeat image in Y direction.
    • + *
    • {@link #NVG_IMAGE_FLIPY IMAGE_FLIPY} - Flips (inverses) image in Y direction when rendered.
    • + *
    • {@link #NVG_IMAGE_PREMULTIPLIED IMAGE_PREMULTIPLIED} - Image data has premultiplied alpha.
    • + *
    • {@link #NVG_IMAGE_NEAREST IMAGE_NEAREST} - Image interpolation is Nearest instead Linear.
    • + *
    + */ + public static final int + NVG_IMAGE_GENERATE_MIPMAPS = 1<<0, + NVG_IMAGE_REPEATX = 1<<1, + NVG_IMAGE_REPEATY = 1<<2, + NVG_IMAGE_FLIPY = 1<<3, + NVG_IMAGE_PREMULTIPLIED = 1<<4, + NVG_IMAGE_NEAREST = 1<<5; + + protected NanoVG() { + throw new UnsupportedOperationException(); + } + + // --- [ nvgBeginFrame ] --- + + /** Unsafe version of: {@link #nvgBeginFrame BeginFrame} */ + public static native void nnvgBeginFrame(long ctx, float windowWidth, float windowHeight, float devicePixelRatio); + + /** + * Begins drawing a new frame. + * + *

    Calls to nanovg drawing API should be wrapped in {@link #nvgBeginFrame BeginFrame} & {@link #nvgEndFrame EndFrame}. {@link #nvgBeginFrame BeginFrame} defines the size of the window to render to in relation + * currently set viewport (i.e. {@code glViewport} on GL backends). Device pixel ration allows to control the rendering on Hi-DPI devices. For example, + * GLFW returns two dimension for an opened window: window size and frame buffer size. In that case you would set {@code windowWidth/Height} to the window + * size {@code devicePixelRatio} to: {@code frameBufferWidth / windowWidth}.

    + * + * @param ctx the NanoVG context + * @param windowWidth the window width + * @param windowHeight the window height + * @param devicePixelRatio the device pixel ratio + */ + public static void nvgBeginFrame(@NativeType("NVGcontext *") long ctx, float windowWidth, float windowHeight, float devicePixelRatio) { + if (CHECKS) { + check(ctx); + } + nnvgBeginFrame(ctx, windowWidth, windowHeight, devicePixelRatio); + } + + // --- [ nvgCancelFrame ] --- + + /** Unsafe version of: {@link #nvgCancelFrame CancelFrame} */ + public static native void nnvgCancelFrame(long ctx); + + /** + * Cancels drawing the current frame. + * + * @param ctx the NanoVG context + */ + public static void nvgCancelFrame(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgCancelFrame(ctx); + } + + // --- [ nvgEndFrame ] --- + + /** Unsafe version of: {@link #nvgEndFrame EndFrame} */ + public static native void nnvgEndFrame(long ctx); + + /** + * Ends drawing flushing remaining render state. + * + * @param ctx the NanoVG context + */ + public static void nvgEndFrame(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgEndFrame(ctx); + } + + // --- [ nvgGlobalCompositeOperation ] --- + + /** Unsafe version of: {@link #nvgGlobalCompositeOperation GlobalCompositeOperation} */ + public static native void nnvgGlobalCompositeOperation(long ctx, int op); + + /** + * Sets the composite operation. + * + * @param ctx the NanoVG context + * @param op the composite operation. One of:
    {@link #NVG_SOURCE_OVER SOURCE_OVER}{@link #NVG_SOURCE_IN SOURCE_IN}{@link #NVG_SOURCE_OUT SOURCE_OUT}{@link #NVG_ATOP ATOP}{@link #NVG_DESTINATION_OVER DESTINATION_OVER}{@link #NVG_DESTINATION_IN DESTINATION_IN}{@link #NVG_DESTINATION_OUT DESTINATION_OUT}{@link #NVG_DESTINATION_ATOP DESTINATION_ATOP}
    {@link #NVG_LIGHTER LIGHTER}{@link #NVG_COPY COPY}{@link #NVG_XOR XOR}
    + */ + public static void nvgGlobalCompositeOperation(@NativeType("NVGcontext *") long ctx, int op) { + if (CHECKS) { + check(ctx); + } + nnvgGlobalCompositeOperation(ctx, op); + } + + // --- [ nvgGlobalCompositeBlendFunc ] --- + + /** Unsafe version of: {@link #nvgGlobalCompositeBlendFunc GlobalCompositeBlendFunc} */ + public static native void nnvgGlobalCompositeBlendFunc(long ctx, int sfactor, int dfactor); + + /** + * Sets the composite operation with custom pixel arithmetic. + * + * @param ctx the NanoVG context + * @param sfactor the source blend factor. One of:
    {@link #NVG_ZERO ZERO}{@link #NVG_ONE ONE}{@link #NVG_SRC_COLOR SRC_COLOR}{@link #NVG_ONE_MINUS_SRC_COLOR ONE_MINUS_SRC_COLOR}{@link #NVG_DST_COLOR DST_COLOR}{@link #NVG_ONE_MINUS_DST_COLOR ONE_MINUS_DST_COLOR}
    {@link #NVG_SRC_ALPHA SRC_ALPHA}{@link #NVG_ONE_MINUS_SRC_ALPHA ONE_MINUS_SRC_ALPHA}{@link #NVG_DST_ALPHA DST_ALPHA}{@link #NVG_ONE_MINUS_DST_ALPHA ONE_MINUS_DST_ALPHA}{@link #NVG_SRC_ALPHA_SATURATE SRC_ALPHA_SATURATE}
    + * @param dfactor the destination blend factor. One of:
    {@link #NVG_ZERO ZERO}{@link #NVG_ONE ONE}{@link #NVG_SRC_COLOR SRC_COLOR}{@link #NVG_ONE_MINUS_SRC_COLOR ONE_MINUS_SRC_COLOR}{@link #NVG_DST_COLOR DST_COLOR}{@link #NVG_ONE_MINUS_DST_COLOR ONE_MINUS_DST_COLOR}
    {@link #NVG_SRC_ALPHA SRC_ALPHA}{@link #NVG_ONE_MINUS_SRC_ALPHA ONE_MINUS_SRC_ALPHA}{@link #NVG_DST_ALPHA DST_ALPHA}{@link #NVG_ONE_MINUS_DST_ALPHA ONE_MINUS_DST_ALPHA}{@link #NVG_SRC_ALPHA_SATURATE SRC_ALPHA_SATURATE}
    + */ + public static void nvgGlobalCompositeBlendFunc(@NativeType("NVGcontext *") long ctx, int sfactor, int dfactor) { + if (CHECKS) { + check(ctx); + } + nnvgGlobalCompositeBlendFunc(ctx, sfactor, dfactor); + } + + // --- [ nvgGlobalCompositeBlendFuncSeparate ] --- + + /** Unsafe version of: {@link #nvgGlobalCompositeBlendFuncSeparate GlobalCompositeBlendFuncSeparate} */ + public static native void nnvgGlobalCompositeBlendFuncSeparate(long ctx, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha); + + /** + * Sets the composite operation with custom pixel arithmetic for RGB and alpha components separately. + * + * @param ctx the NanoVG context + * @param srcRGB the source RGB blend factor. One of:
    {@link #NVG_ZERO ZERO}{@link #NVG_ONE ONE}{@link #NVG_SRC_COLOR SRC_COLOR}{@link #NVG_ONE_MINUS_SRC_COLOR ONE_MINUS_SRC_COLOR}{@link #NVG_DST_COLOR DST_COLOR}{@link #NVG_ONE_MINUS_DST_COLOR ONE_MINUS_DST_COLOR}
    {@link #NVG_SRC_ALPHA SRC_ALPHA}{@link #NVG_ONE_MINUS_SRC_ALPHA ONE_MINUS_SRC_ALPHA}{@link #NVG_DST_ALPHA DST_ALPHA}{@link #NVG_ONE_MINUS_DST_ALPHA ONE_MINUS_DST_ALPHA}{@link #NVG_SRC_ALPHA_SATURATE SRC_ALPHA_SATURATE}
    + * @param dstRGB the destination RGB blend factor. One of:
    {@link #NVG_ZERO ZERO}{@link #NVG_ONE ONE}{@link #NVG_SRC_COLOR SRC_COLOR}{@link #NVG_ONE_MINUS_SRC_COLOR ONE_MINUS_SRC_COLOR}{@link #NVG_DST_COLOR DST_COLOR}{@link #NVG_ONE_MINUS_DST_COLOR ONE_MINUS_DST_COLOR}
    {@link #NVG_SRC_ALPHA SRC_ALPHA}{@link #NVG_ONE_MINUS_SRC_ALPHA ONE_MINUS_SRC_ALPHA}{@link #NVG_DST_ALPHA DST_ALPHA}{@link #NVG_ONE_MINUS_DST_ALPHA ONE_MINUS_DST_ALPHA}{@link #NVG_SRC_ALPHA_SATURATE SRC_ALPHA_SATURATE}
    + * @param srcAlpha the source alpha blend factor. One of:
    {@link #NVG_ZERO ZERO}{@link #NVG_ONE ONE}{@link #NVG_SRC_COLOR SRC_COLOR}{@link #NVG_ONE_MINUS_SRC_COLOR ONE_MINUS_SRC_COLOR}{@link #NVG_DST_COLOR DST_COLOR}{@link #NVG_ONE_MINUS_DST_COLOR ONE_MINUS_DST_COLOR}
    {@link #NVG_SRC_ALPHA SRC_ALPHA}{@link #NVG_ONE_MINUS_SRC_ALPHA ONE_MINUS_SRC_ALPHA}{@link #NVG_DST_ALPHA DST_ALPHA}{@link #NVG_ONE_MINUS_DST_ALPHA ONE_MINUS_DST_ALPHA}{@link #NVG_SRC_ALPHA_SATURATE SRC_ALPHA_SATURATE}
    + * @param dstAlpha the destination alpha blend factor. One of:
    {@link #NVG_ZERO ZERO}{@link #NVG_ONE ONE}{@link #NVG_SRC_COLOR SRC_COLOR}{@link #NVG_ONE_MINUS_SRC_COLOR ONE_MINUS_SRC_COLOR}{@link #NVG_DST_COLOR DST_COLOR}{@link #NVG_ONE_MINUS_DST_COLOR ONE_MINUS_DST_COLOR}
    {@link #NVG_SRC_ALPHA SRC_ALPHA}{@link #NVG_ONE_MINUS_SRC_ALPHA ONE_MINUS_SRC_ALPHA}{@link #NVG_DST_ALPHA DST_ALPHA}{@link #NVG_ONE_MINUS_DST_ALPHA ONE_MINUS_DST_ALPHA}{@link #NVG_SRC_ALPHA_SATURATE SRC_ALPHA_SATURATE}
    + */ + public static void nvgGlobalCompositeBlendFuncSeparate(@NativeType("NVGcontext *") long ctx, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { + if (CHECKS) { + check(ctx); + } + nnvgGlobalCompositeBlendFuncSeparate(ctx, srcRGB, dstRGB, srcAlpha, dstAlpha); + } + + // --- [ nvgRGB ] --- + + /** Unsafe version of: {@link #nvgRGB RGB} */ + public static native void nnvgRGB(byte r, byte g, byte b, long __result); + + /** + * Returns a color value from red, green, blue values. Alpha will be set to 255 (1.0f). + * + * @param r the red value + * @param g the green value + * @param b the blue value + */ + @NativeType("NVGcolor") + public static NVGColor nvgRGB(@NativeType("unsigned char") byte r, @NativeType("unsigned char") byte g, @NativeType("unsigned char") byte b, @NativeType("NVGcolor") NVGColor __result) { + nnvgRGB(r, g, b, __result.address()); + return __result; + } + + // --- [ nvgRGBf ] --- + + /** Unsafe version of: {@link #nvgRGBf RGBf} */ + public static native void nnvgRGBf(float r, float g, float b, long __result); + + /** + * Returns a color value from red, green, blue values. Alpha will be set to 1.0f. + * + * @param r the red value + * @param g the green value + * @param b the blue value + */ + @NativeType("NVGcolor") + public static NVGColor nvgRGBf(float r, float g, float b, @NativeType("NVGcolor") NVGColor __result) { + nnvgRGBf(r, g, b, __result.address()); + return __result; + } + + // --- [ nvgRGBA ] --- + + /** Unsafe version of: {@link #nvgRGBA RGBA} */ + public static native void nnvgRGBA(byte r, byte g, byte b, byte a, long __result); + + /** + * Returns a color value from red, green, blue and alpha values. + * + * @param r the red value + * @param g the green value + * @param b the blue value + * @param a the alpha value + */ + @NativeType("NVGcolor") + public static NVGColor nvgRGBA(@NativeType("unsigned char") byte r, @NativeType("unsigned char") byte g, @NativeType("unsigned char") byte b, @NativeType("unsigned char") byte a, @NativeType("NVGcolor") NVGColor __result) { + nnvgRGBA(r, g, b, a, __result.address()); + return __result; + } + + // --- [ nvgRGBAf ] --- + + /** Unsafe version of: {@link #nvgRGBAf RGBAf} */ + public static native void nnvgRGBAf(float r, float g, float b, float a, long __result); + + /** + * Returns a color value from red, green, blue and alpha values. + * + * @param r the red value + * @param g the green value + * @param b the blue value + * @param a the alpha value + */ + @NativeType("NVGcolor") + public static NVGColor nvgRGBAf(float r, float g, float b, float a, @NativeType("NVGcolor") NVGColor __result) { + nnvgRGBAf(r, g, b, a, __result.address()); + return __result; + } + + // --- [ nvgLerpRGBA ] --- + + /** Unsafe version of: {@link #nvgLerpRGBA LerpRGBA} */ + public static native void nnvgLerpRGBA(long c0, long c1, float u, long __result); + + /** + * Linearly interpolates from color {@code c0} to {@code c1}, and returns resulting color value. + * + * @param c0 the first color + * @param c1 the second color + * @param u the interpolation factor + */ + @NativeType("NVGcolor") + public static NVGColor nvgLerpRGBA(@NativeType("NVGcolor") NVGColor c0, @NativeType("NVGcolor") NVGColor c1, float u, @NativeType("NVGcolor") NVGColor __result) { + nnvgLerpRGBA(c0.address(), c1.address(), u, __result.address()); + return __result; + } + + // --- [ nvgTransRGBA ] --- + + /** Unsafe version of: {@link #nvgTransRGBA TransRGBA} */ + public static native void nnvgTransRGBA(long c0, byte a, long __result); + + /** + * Sets transparency of a color value. + * + * @param c0 the color + * @param a the alpha value + */ + @NativeType("NVGcolor") + public static NVGColor nvgTransRGBA(@NativeType("NVGcolor") NVGColor c0, @NativeType("unsigned char") byte a, @NativeType("NVGcolor") NVGColor __result) { + nnvgTransRGBA(c0.address(), a, __result.address()); + return __result; + } + + // --- [ nvgTransRGBAf ] --- + + /** Unsafe version of: {@link #nvgTransRGBAf TransRGBAf} */ + public static native void nnvgTransRGBAf(long c0, float a, long __result); + + /** + * Sets transparency of a color value. + * + * @param c0 the color + * @param a the alpha value + */ + @NativeType("NVGcolor") + public static NVGColor nvgTransRGBAf(@NativeType("NVGcolor") NVGColor c0, float a, @NativeType("NVGcolor") NVGColor __result) { + nnvgTransRGBAf(c0.address(), a, __result.address()); + return __result; + } + + // --- [ nvgHSL ] --- + + /** Unsafe version of: {@link #nvgHSL HSL} */ + public static native void nnvgHSL(float h, float s, float l, long __result); + + /** + * Returns color value specified by hue, saturation and lightness. + * + *

    HSL values are all in range {@code [0..1]}, alpha will be set to 255.

    + * + * @param h the hue value + * @param s the saturation value + * @param l the lightness value + */ + @NativeType("NVGcolor") + public static NVGColor nvgHSL(float h, float s, float l, @NativeType("NVGcolor") NVGColor __result) { + nnvgHSL(h, s, l, __result.address()); + return __result; + } + + // --- [ nvgHSLA ] --- + + /** Unsafe version of: {@link #nvgHSLA HSLA} */ + public static native void nnvgHSLA(float h, float s, float l, byte a, long __result); + + /** + * Returns color value specified by hue, saturation and lightness and alpha. + * + *

    HSL values are all in range {@code [0..1]}, alpha in range {@code [0..255]}

    + * + * @param h the hue value + * @param s the saturation value + * @param l the lightness value + * @param a the alpha value + */ + @NativeType("NVGcolor") + public static NVGColor nvgHSLA(float h, float s, float l, @NativeType("unsigned char") byte a, @NativeType("NVGcolor") NVGColor __result) { + nnvgHSLA(h, s, l, a, __result.address()); + return __result; + } + + // --- [ nvgSave ] --- + + /** Unsafe version of: {@link #nvgSave Save} */ + public static native void nnvgSave(long ctx); + + /** + * Pushes and saves the current render state into a state stack. A matching {@link #nvgRestore Restore} must be used to restore the state. + * + * @param ctx the NanoVG context + */ + public static void nvgSave(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgSave(ctx); + } + + // --- [ nvgRestore ] --- + + /** Unsafe version of: {@link #nvgRestore Restore} */ + public static native void nnvgRestore(long ctx); + + /** + * Pops and restores current render state. + * + * @param ctx the NanoVG context + */ + public static void nvgRestore(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgRestore(ctx); + } + + // --- [ nvgReset ] --- + + /** Unsafe version of: {@link #nvgReset Reset} */ + public static native void nnvgReset(long ctx); + + /** + * Resets current render state to default values. Does not affect the render state stack. + * + * @param ctx the NanoVG context + */ + public static void nvgReset(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgReset(ctx); + } + + // --- [ nvgShapeAntiAlias ] --- + + /** Unsafe version of: {@link #nvgShapeAntiAlias ShapeAntiAlias} */ + public static native void nnvgShapeAntiAlias(long ctx, int enabled); + + /** + * Sets whether to draw antialias for {@link #nvgStroke Stroke} and {@link #nvgFill Fill}. It's enabled by default. + * + * @param ctx the NanoVG context + * @param enabled the flag to set + */ + public static void nvgShapeAntiAlias(@NativeType("NVGcontext *") long ctx, @NativeType("int") boolean enabled) { + if (CHECKS) { + check(ctx); + } + nnvgShapeAntiAlias(ctx, enabled ? 1 : 0); + } + + // --- [ nvgStrokeColor ] --- + + /** Unsafe version of: {@link #nvgStrokeColor StrokeColor} */ + public static native void nnvgStrokeColor(long ctx, long color); + + /** + * Sets current stroke style to a solid color. + * + * @param ctx the NanoVG context + * @param color the color to set + */ + public static void nvgStrokeColor(@NativeType("NVGcontext *") long ctx, @NativeType("NVGcolor") NVGColor color) { + if (CHECKS) { + check(ctx); + } + nnvgStrokeColor(ctx, color.address()); + } + + // --- [ nvgStrokePaint ] --- + + /** Unsafe version of: {@link #nvgStrokePaint StrokePaint} */ + public static native void nnvgStrokePaint(long ctx, long paint); + + /** + * Sets current stroke style to a paint, which can be a one of the gradients or a pattern. + * + * @param ctx the NanoVG context + * @param paint the paint to set + */ + public static void nvgStrokePaint(@NativeType("NVGcontext *") long ctx, @NativeType("NVGpaint") NVGPaint paint) { + if (CHECKS) { + check(ctx); + } + nnvgStrokePaint(ctx, paint.address()); + } + + // --- [ nvgFillColor ] --- + + /** Unsafe version of: {@link #nvgFillColor FillColor} */ + public static native void nnvgFillColor(long ctx, long color); + + /** + * Sets current fill style to a solid color. + * + * @param ctx the NanoVG context + * @param color the color to set + */ + public static void nvgFillColor(@NativeType("NVGcontext *") long ctx, @NativeType("NVGcolor") NVGColor color) { + if (CHECKS) { + check(ctx); + } + nnvgFillColor(ctx, color.address()); + } + + // --- [ nvgFillPaint ] --- + + /** Unsafe version of: {@link #nvgFillPaint FillPaint} */ + public static native void nnvgFillPaint(long ctx, long paint); + + /** + * Sets current fill style to a paint, which can be a one of the gradients or a pattern. + * + * @param ctx the NanoVG context + * @param paint the paint to set + */ + public static void nvgFillPaint(@NativeType("NVGcontext *") long ctx, @NativeType("NVGpaint") NVGPaint paint) { + if (CHECKS) { + check(ctx); + } + nnvgFillPaint(ctx, paint.address()); + } + + // --- [ nvgMiterLimit ] --- + + /** Unsafe version of: {@link #nvgMiterLimit MiterLimit} */ + public static native void nnvgMiterLimit(long ctx, float limit); + + /** + * Sets the miter limit of the stroke style. Miter limit controls when a sharp corner is beveled. + * + * @param ctx the NanoVG context + * @param limit the miter limit to set + */ + public static void nvgMiterLimit(@NativeType("NVGcontext *") long ctx, float limit) { + if (CHECKS) { + check(ctx); + } + nnvgMiterLimit(ctx, limit); + } + + // --- [ nvgStrokeWidth ] --- + + /** Unsafe version of: {@link #nvgStrokeWidth StrokeWidth} */ + public static native void nnvgStrokeWidth(long ctx, float size); + + /** + * Sets the stroke width of the stroke style. + * + * @param ctx the NanoVG context + * @param size the stroke width to set + */ + public static void nvgStrokeWidth(@NativeType("NVGcontext *") long ctx, float size) { + if (CHECKS) { + check(ctx); + } + nnvgStrokeWidth(ctx, size); + } + + // --- [ nvgLineCap ] --- + + /** Unsafe version of: {@link #nvgLineCap LineCap} */ + public static native void nnvgLineCap(long ctx, int cap); + + /** + * Sets how the end of the line (cap) is drawn. + * + *

    The default line cap is {@link #NVG_BUTT BUTT}.

    + * + * @param ctx the NanoVG context + * @param cap the line cap to set. One of:
    {@link #NVG_BUTT BUTT}{@link #NVG_ROUND ROUND}{@link #NVG_SQUARE SQUARE}
    + */ + public static void nvgLineCap(@NativeType("NVGcontext *") long ctx, int cap) { + if (CHECKS) { + check(ctx); + } + nnvgLineCap(ctx, cap); + } + + // --- [ nvgLineJoin ] --- + + /** Unsafe version of: {@link #nvgLineJoin LineJoin} */ + public static native void nnvgLineJoin(long ctx, int join); + + /** + * Sets how sharp path corners are drawn. + * + *

    The default line join is {@link #NVG_MITER MITER}.

    + * + * @param ctx the NanoVG context + * @param join the line join to set. One of:
    {@link #NVG_MITER MITER}{@link #NVG_ROUND ROUND}{@link #NVG_BEVEL BEVEL}
    + */ + public static void nvgLineJoin(@NativeType("NVGcontext *") long ctx, int join) { + if (CHECKS) { + check(ctx); + } + nnvgLineJoin(ctx, join); + } + + // --- [ nvgGlobalAlpha ] --- + + /** Unsafe version of: {@link #nvgGlobalAlpha GlobalAlpha} */ + public static native void nnvgGlobalAlpha(long ctx, float alpha); + + /** + * Sets the transparency applied to all rendered shapes. + * + *

    Already transparent paths will get proportionally more transparent as well.

    + * + * @param ctx the NanoVG context + * @param alpha the alpha value to set + */ + public static void nvgGlobalAlpha(@NativeType("NVGcontext *") long ctx, float alpha) { + if (CHECKS) { + check(ctx); + } + nnvgGlobalAlpha(ctx, alpha); + } + + // --- [ nvgResetTransform ] --- + + /** Unsafe version of: {@link #nvgResetTransform ResetTransform} */ + public static native void nnvgResetTransform(long ctx); + + /** + * Resets current transform to an identity matrix. + * + * @param ctx the NanoVG context + */ + public static void nvgResetTransform(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgResetTransform(ctx); + } + + // --- [ nvgTransform ] --- + + /** Unsafe version of: {@link #nvgTransform Transform} */ + public static native void nnvgTransform(long ctx, float a, float b, float c, float d, float e, float f); + + /** + * Premultiplies current coordinate system by specified matrix. The parameters are interpreted as matrix as follows: + * + *
    
    +     * [a c e]
    +     * [b d f]
    +     * [0 0 1]
    + * + * @param ctx the NanoVG context + * @param a the a value + * @param b the b value + * @param c the c value + * @param d the d value + * @param e the e value + * @param f the f value + */ + public static void nvgTransform(@NativeType("NVGcontext *") long ctx, float a, float b, float c, float d, float e, float f) { + if (CHECKS) { + check(ctx); + } + nnvgTransform(ctx, a, b, c, d, e, f); + } + + // --- [ nvgTranslate ] --- + + /** Unsafe version of: {@link #nvgTranslate Translate} */ + public static native void nnvgTranslate(long ctx, float x, float y); + + /** + * Translates current coordinate system. + * + * @param ctx the NanoVG context + * @param x the X axis translation amount + * @param y the Y axis translation amount + */ + public static void nvgTranslate(@NativeType("NVGcontext *") long ctx, float x, float y) { + if (CHECKS) { + check(ctx); + } + nnvgTranslate(ctx, x, y); + } + + // --- [ nvgRotate ] --- + + /** Unsafe version of: {@link #nvgRotate Rotate} */ + public static native void nnvgRotate(long ctx, float angle); + + /** + * Rotates current coordinate system. + * + * @param ctx the NanoVG context + * @param angle the rotation angle, in radians + */ + public static void nvgRotate(@NativeType("NVGcontext *") long ctx, float angle) { + if (CHECKS) { + check(ctx); + } + nnvgRotate(ctx, angle); + } + + // --- [ nvgSkewX ] --- + + /** Unsafe version of: {@link #nvgSkewX SkewX} */ + public static native void nnvgSkewX(long ctx, float angle); + + /** + * Skews the current coordinate system along X axis. + * + * @param ctx the NanoVG context + * @param angle the skew angle, in radians + */ + public static void nvgSkewX(@NativeType("NVGcontext *") long ctx, float angle) { + if (CHECKS) { + check(ctx); + } + nnvgSkewX(ctx, angle); + } + + // --- [ nvgSkewY ] --- + + /** Unsafe version of: {@link #nvgSkewY SkewY} */ + public static native void nnvgSkewY(long ctx, float angle); + + /** + * Skews the current coordinate system along Y axis. + * + * @param ctx the NanoVG context + * @param angle the skew angle, in radians + */ + public static void nvgSkewY(@NativeType("NVGcontext *") long ctx, float angle) { + if (CHECKS) { + check(ctx); + } + nnvgSkewY(ctx, angle); + } + + // --- [ nvgScale ] --- + + /** Unsafe version of: {@link #nvgScale Scale} */ + public static native void nnvgScale(long ctx, float x, float y); + + /** + * Scales the current coordinate system. + * + * @param ctx the NanoVG context + * @param x the X axis scale factor + * @param y the Y axis scale factor + */ + public static void nvgScale(@NativeType("NVGcontext *") long ctx, float x, float y) { + if (CHECKS) { + check(ctx); + } + nnvgScale(ctx, x, y); + } + + // --- [ nvgCurrentTransform ] --- + + /** Unsafe version of: {@link #nvgCurrentTransform CurrentTransform} */ + public static native void nnvgCurrentTransform(long ctx, long xform); + + /** + * Stores the top part (a-f) of the current transformation matrix in to the specified buffer. + * + *
    
    +     * [a c e]
    +     * [b d f]
    +     * [0 0 1]
    + * + *

    There should be space for 6 floats in the return buffer for the values {@code a-f}.

    + * + * @param ctx the NanoVG context + * @param xform the destination buffer + */ + public static void nvgCurrentTransform(@NativeType("NVGcontext *") long ctx, @NativeType("float *") FloatBuffer xform) { + if (CHECKS) { + check(ctx); + check(xform, 6); + } + nnvgCurrentTransform(ctx, memAddress(xform)); + } + + // --- [ nvgTransformIdentity ] --- + + /** Unsafe version of: {@link #nvgTransformIdentity TransformIdentity} */ + public static native void nnvgTransformIdentity(long dst); + + /** + * Sets the transform to identity matrix. + * + * @param dst the destination buffer + */ + public static void nvgTransformIdentity(@NativeType("float *") FloatBuffer dst) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformIdentity(memAddress(dst)); + } + + // --- [ nvgTransformTranslate ] --- + + /** Unsafe version of: {@link #nvgTransformTranslate TransformTranslate} */ + public static native void nnvgTransformTranslate(long dst, float tx, float ty); + + /** + * Sets the transform to translation matrix matrix. + * + * @param dst the destination buffer + * @param tx the X axis translation amount + * @param ty the Y axis translation amount + */ + public static void nvgTransformTranslate(@NativeType("float *") FloatBuffer dst, float tx, float ty) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformTranslate(memAddress(dst), tx, ty); + } + + // --- [ nvgTransformScale ] --- + + /** Unsafe version of: {@link #nvgTransformScale TransformScale} */ + public static native void nnvgTransformScale(long dst, float sx, float sy); + + /** + * Sets the transform to scale matrix. + * + * @param dst the destination buffer + * @param sx the X axis scale factor + * @param sy the Y axis scale factor + */ + public static void nvgTransformScale(@NativeType("float *") FloatBuffer dst, float sx, float sy) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformScale(memAddress(dst), sx, sy); + } + + // --- [ nvgTransformRotate ] --- + + /** Unsafe version of: {@link #nvgTransformRotate TransformRotate} */ + public static native void nnvgTransformRotate(long dst, float a); + + /** + * Sets the transform to rotate matrix. + * + * @param dst the destination buffer + * @param a the rotation angle, in radians + */ + public static void nvgTransformRotate(@NativeType("float *") FloatBuffer dst, float a) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformRotate(memAddress(dst), a); + } + + // --- [ nvgTransformSkewX ] --- + + /** Unsafe version of: {@link #nvgTransformSkewX TransformSkewX} */ + public static native void nnvgTransformSkewX(long dst, float a); + + /** + * Sets the transform to skew-x matrix. + * + * @param dst the destination buffer + * @param a the skew angle, in radians + */ + public static void nvgTransformSkewX(@NativeType("float *") FloatBuffer dst, float a) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformSkewX(memAddress(dst), a); + } + + // --- [ nvgTransformSkewY ] --- + + /** Unsafe version of: {@link #nvgTransformSkewY TransformSkewY} */ + public static native void nnvgTransformSkewY(long dst, float a); + + /** + * Sets the transform to skew-y matrix. + * + * @param dst the destination buffer + * @param a the skew angle, in radians + */ + public static void nvgTransformSkewY(@NativeType("float *") FloatBuffer dst, float a) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformSkewY(memAddress(dst), a); + } + + // --- [ nvgTransformMultiply ] --- + + /** Unsafe version of: {@link #nvgTransformMultiply TransformMultiply} */ + public static native void nnvgTransformMultiply(long dst, long src); + + /** + * Sets the transform to the result of multiplication of two transforms, of {@code A = A*B}. + * + * @param dst the destination buffer + * @param src the {@code B} transformation matrix + */ + public static void nvgTransformMultiply(@NativeType("float *") FloatBuffer dst, @NativeType("float const *") FloatBuffer src) { + if (CHECKS) { + check(dst, 6); + check(src, 6); + } + nnvgTransformMultiply(memAddress(dst), memAddress(src)); + } + + // --- [ nvgTransformPremultiply ] --- + + /** Unsafe version of: {@link #nvgTransformPremultiply TransformPremultiply} */ + public static native void nnvgTransformPremultiply(long dst, long src); + + /** + * Sets the transform to the result of multiplication of two transforms, of {@code A = B*A}. + * + * @param dst the destination buffer + * @param src the {@code B} transformation matrix + */ + public static void nvgTransformPremultiply(@NativeType("float *") FloatBuffer dst, @NativeType("float const *") FloatBuffer src) { + if (CHECKS) { + check(dst, 6); + check(src, 6); + } + nnvgTransformPremultiply(memAddress(dst), memAddress(src)); + } + + // --- [ nvgTransformInverse ] --- + + /** Unsafe version of: {@link #nvgTransformInverse TransformInverse} */ + public static native int nnvgTransformInverse(long dst, long src); + + /** + * Sets the destination to inverse of specified transform. + * + * @param dst the destination buffer + * @param src the transformation matrix to inverse + * + * @return 1 if the inverse could be calculated, else 0 + */ + @NativeType("int") + public static boolean nvgTransformInverse(@NativeType("float *") FloatBuffer dst, @NativeType("float const *") FloatBuffer src) { + if (CHECKS) { + check(dst, 6); + check(src, 6); + } + return nnvgTransformInverse(memAddress(dst), memAddress(src)) != 0; + } + + // --- [ nvgTransformPoint ] --- + + /** Unsafe version of: {@link #nvgTransformPoint TransformPoint} */ + public static native void nnvgTransformPoint(long dstx, long dsty, long xform, float srcx, float srcy); + + /** + * Transform a point by given transform. + * + * @param dstx returns the transformed X axis coordinate + * @param dsty returns the transformed Y axis coordinate + * @param xform the transformation matrix + * @param srcx the point X axis coordinate + * @param srcy the point Y axis coordinate + */ + public static void nvgTransformPoint(@NativeType("float *") FloatBuffer dstx, @NativeType("float *") FloatBuffer dsty, @NativeType("float const *") FloatBuffer xform, float srcx, float srcy) { + if (CHECKS) { + check(dstx, 1); + check(dsty, 1); + check(xform, 6); + } + nnvgTransformPoint(memAddress(dstx), memAddress(dsty), memAddress(xform), srcx, srcy); + } + + // --- [ nvgDegToRad ] --- + + /** + * Converts degrees to radians. + * + * @param deg the rotation value, in degrees + */ + public static native float nvgDegToRad(float deg); + + // --- [ nvgRadToDeg ] --- + + /** + * Converts radians to degrees. + * + * @param rad the rotation value, in radians + */ + public static native float nvgRadToDeg(float rad); + + // --- [ nvgCreateImage ] --- + + /** Unsafe version of: {@link #nvgCreateImage CreateImage} */ + public static native int nnvgCreateImage(long ctx, long filename, int imageFlags); + + /** + * Creates image by loading it from the disk from specified file name. + * + * @param ctx the NanoVG context + * @param filename the image file name + * @param imageFlags the image flags. One of:
    {@link #NVG_IMAGE_GENERATE_MIPMAPS IMAGE_GENERATE_MIPMAPS}{@link #NVG_IMAGE_REPEATX IMAGE_REPEATX}{@link #NVG_IMAGE_REPEATY IMAGE_REPEATY}{@link #NVG_IMAGE_FLIPY IMAGE_FLIPY}{@link #NVG_IMAGE_PREMULTIPLIED IMAGE_PREMULTIPLIED}
    {@link #NVG_IMAGE_NEAREST IMAGE_NEAREST}
    + * + * @return a handle to the image + */ + public static int nvgCreateImage(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") ByteBuffer filename, int imageFlags) { + if (CHECKS) { + check(ctx); + checkNT1(filename); + } + return nnvgCreateImage(ctx, memAddress(filename), imageFlags); + } + + /** + * Creates image by loading it from the disk from specified file name. + * + * @param ctx the NanoVG context + * @param filename the image file name + * @param imageFlags the image flags. One of:
    {@link #NVG_IMAGE_GENERATE_MIPMAPS IMAGE_GENERATE_MIPMAPS}{@link #NVG_IMAGE_REPEATX IMAGE_REPEATX}{@link #NVG_IMAGE_REPEATY IMAGE_REPEATY}{@link #NVG_IMAGE_FLIPY IMAGE_FLIPY}{@link #NVG_IMAGE_PREMULTIPLIED IMAGE_PREMULTIPLIED}
    {@link #NVG_IMAGE_NEAREST IMAGE_NEAREST}
    + * + * @return a handle to the image + */ + public static int nvgCreateImage(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") CharSequence filename, int imageFlags) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nnvgCreateImage(ctx, filenameEncoded, imageFlags); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgCreateImageMem ] --- + + /** + * Unsafe version of: {@link #nvgCreateImageMem CreateImageMem} + * + * @param ndata the image data size, in bytes + */ + public static native int nnvgCreateImageMem(long ctx, int imageFlags, long data, int ndata); + + /** + * Creates image by loading it from the specified chunk of memory. + * + * @param ctx the NanoVG context + * @param imageFlags the image flags. One of:
    {@link #NVG_IMAGE_GENERATE_MIPMAPS IMAGE_GENERATE_MIPMAPS}{@link #NVG_IMAGE_REPEATX IMAGE_REPEATX}{@link #NVG_IMAGE_REPEATY IMAGE_REPEATY}{@link #NVG_IMAGE_FLIPY IMAGE_FLIPY}{@link #NVG_IMAGE_PREMULTIPLIED IMAGE_PREMULTIPLIED}
    {@link #NVG_IMAGE_NEAREST IMAGE_NEAREST}
    + * @param data the image data + * + * @return a handle to the image + */ + public static int nvgCreateImageMem(@NativeType("NVGcontext *") long ctx, int imageFlags, @NativeType("unsigned char *") ByteBuffer data) { + if (CHECKS) { + check(ctx); + } + return nnvgCreateImageMem(ctx, imageFlags, memAddress(data), data.remaining()); + } + + // --- [ nvgCreateImageRGBA ] --- + + /** Unsafe version of: {@link #nvgCreateImageRGBA CreateImageRGBA} */ + public static native int nnvgCreateImageRGBA(long ctx, int w, int h, int imageFlags, long data); + + /** + * Creates image from specified image data. + * + * @param ctx the NanoVG context + * @param w the image width + * @param h the image height + * @param imageFlags the image flags. One of:
    {@link #NVG_IMAGE_GENERATE_MIPMAPS IMAGE_GENERATE_MIPMAPS}{@link #NVG_IMAGE_REPEATX IMAGE_REPEATX}{@link #NVG_IMAGE_REPEATY IMAGE_REPEATY}{@link #NVG_IMAGE_FLIPY IMAGE_FLIPY}{@link #NVG_IMAGE_PREMULTIPLIED IMAGE_PREMULTIPLIED}
    {@link #NVG_IMAGE_NEAREST IMAGE_NEAREST}
    + * @param data the image data + * + * @return a handle to the image + */ + public static int nvgCreateImageRGBA(@NativeType("NVGcontext *") long ctx, int w, int h, int imageFlags, @NativeType("unsigned char const *") ByteBuffer data) { + if (CHECKS) { + check(ctx); + check(data, w * h * 4); + } + return nnvgCreateImageRGBA(ctx, w, h, imageFlags, memAddress(data)); + } + + // --- [ nvgUpdateImage ] --- + + /** Unsafe version of: {@link #nvgUpdateImage UpdateImage} */ + public static native void nnvgUpdateImage(long ctx, int image, long data); + + /** + * Updates image data specified by image handle. + * + * @param ctx the NanoVG context + * @param image the image handle + * @param data the image data + */ + public static void nvgUpdateImage(@NativeType("NVGcontext *") long ctx, int image, @NativeType("unsigned char const *") ByteBuffer data) { + if (CHECKS) { + check(ctx); + } + nnvgUpdateImage(ctx, image, memAddress(data)); + } + + // --- [ nvgImageSize ] --- + + /** Unsafe version of: {@link #nvgImageSize ImageSize} */ + public static native void nnvgImageSize(long ctx, int image, long w, long h); + + /** + * Returns the dimensions of a created image. + * + * @param ctx the NanoVG context + * @param image the image handle + * @param w returns the image width + * @param h returns the image height + */ + public static void nvgImageSize(@NativeType("NVGcontext *") long ctx, int image, @NativeType("int *") IntBuffer w, @NativeType("int *") IntBuffer h) { + if (CHECKS) { + check(ctx); + check(w, 1); + check(h, 1); + } + nnvgImageSize(ctx, image, memAddress(w), memAddress(h)); + } + + // --- [ nvgDeleteImage ] --- + + /** Unsafe version of: {@link #nvgDeleteImage DeleteImage} */ + public static native void nnvgDeleteImage(long ctx, int image); + + /** + * Deletes created image. + * + * @param ctx the NanoVG context + * @param image the image handle to delete + */ + public static void nvgDeleteImage(@NativeType("NVGcontext *") long ctx, int image) { + if (CHECKS) { + check(ctx); + } + nnvgDeleteImage(ctx, image); + } + + // --- [ nvgLinearGradient ] --- + + /** Unsafe version of: {@link #nvgLinearGradient LinearGradient} */ + public static native void nnvgLinearGradient(long ctx, float sx, float sy, float ex, float ey, long icol, long ocol, long __result); + + /** + * Creates and returns a linear gradient. + * + *

    The gradient is transformed by the current transform when it is passed to {@link #nvgFillPaint FillPaint} or {@link #nvgStrokePaint StrokePaint}.

    + * + * @param ctx the NanoVG context + * @param sx the X axis start coordinate + * @param sy the Y axis start coordinate + * @param ex the X axis end coordinate + * @param ey the Y axis end coordinate + * @param icol the start color + * @param ocol the end color + */ + @NativeType("NVGpaint") + public static NVGPaint nvgLinearGradient(@NativeType("NVGcontext *") long ctx, float sx, float sy, float ex, float ey, @NativeType("NVGcolor") NVGColor icol, @NativeType("NVGcolor") NVGColor ocol, @NativeType("NVGpaint") NVGPaint __result) { + if (CHECKS) { + check(ctx); + } + nnvgLinearGradient(ctx, sx, sy, ex, ey, icol.address(), ocol.address(), __result.address()); + return __result; + } + + // --- [ nvgBoxGradient ] --- + + /** Unsafe version of: {@link #nvgBoxGradient BoxGradient} */ + public static native void nnvgBoxGradient(long ctx, float x, float y, float w, float h, float r, float f, long icol, long ocol, long __result); + + /** + * Creates and returns a box gradient. Box gradient is a feathered rounded rectangle, it is useful for rendering drop shadows or highlights for boxes. + * + *

    The gradient is transformed by the current transform when it is passed to {@link #nvgFillPaint FillPaint} or {@link #nvgStrokePaint StrokePaint}.

    + * + * @param ctx the NanoVG context + * @param x the rectangle left coordinate + * @param y the rectangle top coordinate + * @param w the rectangle width + * @param h the rectangle height + * @param r the corner radius + * @param f the feather value. Feather defines how blurry the border of the rectangle is. + * @param icol the inner color + * @param ocol the outer color + */ + @NativeType("NVGpaint") + public static NVGPaint nvgBoxGradient(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, float r, float f, @NativeType("NVGcolor") NVGColor icol, @NativeType("NVGcolor") NVGColor ocol, @NativeType("NVGpaint") NVGPaint __result) { + if (CHECKS) { + check(ctx); + } + nnvgBoxGradient(ctx, x, y, w, h, r, f, icol.address(), ocol.address(), __result.address()); + return __result; + } + + // --- [ nvgRadialGradient ] --- + + /** Unsafe version of: {@link #nvgRadialGradient RadialGradient} */ + public static native void nnvgRadialGradient(long ctx, float cx, float cy, float inr, float outr, long icol, long ocol, long __result); + + /** + * Creates and returns a radial gradient. + * + *

    The gradient is transformed by the current transform when it is passed to {@link #nvgFillPaint FillPaint} or {@link #nvgStrokePaint StrokePaint}.

    + * + * @param ctx the NanoVG context + * @param cx the X axis center coordinate + * @param cy the Y axis center coordinate + * @param inr the inner radius + * @param outr the outer radius + * @param icol the start color + * @param ocol the end color + */ + @NativeType("NVGpaint") + public static NVGPaint nvgRadialGradient(@NativeType("NVGcontext *") long ctx, float cx, float cy, float inr, float outr, @NativeType("NVGcolor") NVGColor icol, @NativeType("NVGcolor") NVGColor ocol, @NativeType("NVGpaint") NVGPaint __result) { + if (CHECKS) { + check(ctx); + } + nnvgRadialGradient(ctx, cx, cy, inr, outr, icol.address(), ocol.address(), __result.address()); + return __result; + } + + // --- [ nvgImagePattern ] --- + + /** Unsafe version of: {@link #nvgImagePattern ImagePattern} */ + public static native void nnvgImagePattern(long ctx, float ox, float oy, float ex, float ey, float angle, int image, float alpha, long __result); + + /** + * Creates and returns an image patter. + * + *

    The gradient is transformed by the current transform when it is passed to {@link #nvgFillPaint FillPaint} or {@link #nvgStrokePaint StrokePaint}.

    + * + * @param ctx the NanoVG context + * @param ox the image pattern left coordinate + * @param oy the image pattern top coordinate + * @param ex the image width + * @param ey the image height + * @param angle the rotation angle around the top-left corner + * @param image the image to render + * @param alpha the alpha value + */ + @NativeType("NVGpaint") + public static NVGPaint nvgImagePattern(@NativeType("NVGcontext *") long ctx, float ox, float oy, float ex, float ey, float angle, int image, float alpha, @NativeType("NVGpaint") NVGPaint __result) { + if (CHECKS) { + check(ctx); + } + nnvgImagePattern(ctx, ox, oy, ex, ey, angle, image, alpha, __result.address()); + return __result; + } + + // --- [ nvgScissor ] --- + + /** Unsafe version of: {@link #nvgScissor Scissor} */ + public static native void nnvgScissor(long ctx, float x, float y, float w, float h); + + /** + * Sets the current scissor rectangle. + * + *

    The scissor rectangle is transformed by the current transform.

    + * + * @param ctx the NanoVG context + * @param x the rectangle X axis coordinate + * @param y the rectangle Y axis coordinate + * @param w the rectangle width + * @param h the rectangle height + */ + public static void nvgScissor(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h) { + if (CHECKS) { + check(ctx); + } + nnvgScissor(ctx, x, y, w, h); + } + + // --- [ nvgIntersectScissor ] --- + + /** Unsafe version of: {@link #nvgIntersectScissor IntersectScissor} */ + public static native void nnvgIntersectScissor(long ctx, float x, float y, float w, float h); + + /** + * Intersects current scissor rectangle with the specified rectangle. + * + *

    The scissor rectangle is transformed by the current transform.

    + * + *

    Note: in case the rotation of previous scissor rect differs from the current one, the intersection will be done between the specified rectangle and the + * previous scissor rectangle transformed in the current transform space. The resulting shape is always rectangle.

    + * + * @param ctx the NanoVG context + * @param x the rectangle X axis coordinate + * @param y the rectangle Y axis coordinate + * @param w the rectangle width + * @param h the rectangle height + */ + public static void nvgIntersectScissor(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h) { + if (CHECKS) { + check(ctx); + } + nnvgIntersectScissor(ctx, x, y, w, h); + } + + // --- [ nvgResetScissor ] --- + + /** Unsafe version of: {@link #nvgResetScissor ResetScissor} */ + public static native void nnvgResetScissor(long ctx); + + /** + * Resets and disables scissoring. + * + * @param ctx the NanoVG context + */ + public static void nvgResetScissor(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgResetScissor(ctx); + } + + // --- [ nvgBeginPath ] --- + + /** Unsafe version of: {@link #nvgBeginPath BeginPath} */ + public static native void nnvgBeginPath(long ctx); + + /** + * Clears the current path and sub-paths. + * + * @param ctx the NanoVG context + */ + public static void nvgBeginPath(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgBeginPath(ctx); + } + + // --- [ nvgMoveTo ] --- + + /** Unsafe version of: {@link #nvgMoveTo MoveTo} */ + public static native void nnvgMoveTo(long ctx, float x, float y); + + /** + * Starts new sub-path with specified point as first point. + * + * @param ctx the NanoVG context + * @param x the point X axis coordinate + * @param y the point Y axis coordinate + */ + public static void nvgMoveTo(@NativeType("NVGcontext *") long ctx, float x, float y) { + if (CHECKS) { + check(ctx); + } + nnvgMoveTo(ctx, x, y); + } + + // --- [ nvgLineTo ] --- + + /** Unsafe version of: {@link #nvgLineTo LineTo} */ + public static native void nnvgLineTo(long ctx, float x, float y); + + /** + * Adds line segment from the last point in the path to the specified point. + * + * @param ctx the NanoVG context + * @param x the point X axis coordinate + * @param y the point Y axis coordinate + */ + public static void nvgLineTo(@NativeType("NVGcontext *") long ctx, float x, float y) { + if (CHECKS) { + check(ctx); + } + nnvgLineTo(ctx, x, y); + } + + // --- [ nvgBezierTo ] --- + + /** Unsafe version of: {@link #nvgBezierTo BezierTo} */ + public static native void nnvgBezierTo(long ctx, float c1x, float c1y, float c2x, float c2y, float x, float y); + + /** + * Adds cubic bezier segment from last point in the path via two control points to the specified point. + * + * @param ctx the NanoVG context + * @param c1x the first control point X axis coordinate + * @param c1y the first control point Y axis coordinate + * @param c2x the second control point X axis coordinate + * @param c2y the second control point Y axis coordinate + * @param x the point X axis coordinate + * @param y the point Y axis coordinate + */ + public static void nvgBezierTo(@NativeType("NVGcontext *") long ctx, float c1x, float c1y, float c2x, float c2y, float x, float y) { + if (CHECKS) { + check(ctx); + } + nnvgBezierTo(ctx, c1x, c1y, c2x, c2y, x, y); + } + + // --- [ nvgQuadTo ] --- + + /** Unsafe version of: {@link #nvgQuadTo QuadTo} */ + public static native void nnvgQuadTo(long ctx, float cx, float cy, float x, float y); + + /** + * Adds quadratic bezier segment from last point in the path via a control point to the specified point. + * + * @param ctx the NanoVG context + * @param cx the control point X axis coordinate + * @param cy the control point Y axis coordinate + * @param x the point X axis coordinate + * @param y the point Y axis coordinate + */ + public static void nvgQuadTo(@NativeType("NVGcontext *") long ctx, float cx, float cy, float x, float y) { + if (CHECKS) { + check(ctx); + } + nnvgQuadTo(ctx, cx, cy, x, y); + } + + // --- [ nvgArcTo ] --- + + /** Unsafe version of: {@link #nvgArcTo ArcTo} */ + public static native void nnvgArcTo(long ctx, float x1, float y1, float x2, float y2, float radius); + + /** + * Adds an arc segment at the corner defined by the last path point, and two specified points. + * + * @param ctx the NanoVG context + * @param x1 the first point X axis coordinate + * @param y1 the first point Y axis coordinate + * @param x2 the second point X axis coordinate + * @param y2 the second point Y axis coordinate + * @param radius the arc radius, in radians + */ + public static void nvgArcTo(@NativeType("NVGcontext *") long ctx, float x1, float y1, float x2, float y2, float radius) { + if (CHECKS) { + check(ctx); + } + nnvgArcTo(ctx, x1, y1, x2, y2, radius); + } + + // --- [ nvgClosePath ] --- + + /** Unsafe version of: {@link #nvgClosePath ClosePath} */ + public static native void nnvgClosePath(long ctx); + + /** + * Closes current sub-path with a line segment. + * + * @param ctx the NanoVG context + */ + public static void nvgClosePath(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgClosePath(ctx); + } + + // --- [ nvgPathWinding ] --- + + /** Unsafe version of: {@link #nvgPathWinding PathWinding} */ + public static native void nnvgPathWinding(long ctx, int dir); + + /** + * Sets the current sub-path winding. + * + * @param ctx the NanoVG context + * @param dir the sub-path winding. One of:
    {@link #NVG_CCW CCW}{@link #NVG_CW CW}
    + */ + public static void nvgPathWinding(@NativeType("NVGcontext *") long ctx, int dir) { + if (CHECKS) { + check(ctx); + } + nnvgPathWinding(ctx, dir); + } + + // --- [ nvgArc ] --- + + /** Unsafe version of: {@link #nvgArc Arc} */ + public static native void nnvgArc(long ctx, float cx, float cy, float r, float a0, float a1, int dir); + + /** + * Creates new circle arc shaped sub-path. + * + * @param ctx the NanoVG context + * @param cx the arc center X axis coordinate + * @param cy the arc center Y axis coordinate + * @param r the arc radius + * @param a0 the arc starting angle, in radians + * @param a1 the arc ending angle, in radians + * @param dir the arc direction. One of:
    {@link #NVG_CCW CCW}{@link #NVG_CW CW}
    + */ + public static void nvgArc(@NativeType("NVGcontext *") long ctx, float cx, float cy, float r, float a0, float a1, int dir) { + if (CHECKS) { + check(ctx); + } + nnvgArc(ctx, cx, cy, r, a0, a1, dir); + } + + // --- [ nvgRect ] --- + + /** Unsafe version of: {@link #nvgRect Rect} */ + public static native void nnvgRect(long ctx, float x, float y, float w, float h); + + /** + * Creates new rectangle shaped sub-path. + * + * @param ctx the NanoVG context + * @param x the rectangle X axis coordinate + * @param y the rectangle Y axis coordinate + * @param w the rectangle width + * @param h the rectangle height + */ + public static void nvgRect(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h) { + if (CHECKS) { + check(ctx); + } + nnvgRect(ctx, x, y, w, h); + } + + // --- [ nvgRoundedRect ] --- + + /** Unsafe version of: {@link #nvgRoundedRect RoundedRect} */ + public static native void nnvgRoundedRect(long ctx, float x, float y, float w, float h, float r); + + /** + * Creates new rounded rectangle shaped sub-path. + * + * @param ctx the NanoVG context + * @param x the rectangle X axis coordinate + * @param y the rectangle Y axis coordinate + * @param w the rectangle width + * @param h the rectangle height + * @param r the corner radius + */ + public static void nvgRoundedRect(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, float r) { + if (CHECKS) { + check(ctx); + } + nnvgRoundedRect(ctx, x, y, w, h, r); + } + + // --- [ nvgRoundedRectVarying ] --- + + /** Unsafe version of: {@link #nvgRoundedRectVarying RoundedRectVarying} */ + public static native void nnvgRoundedRectVarying(long ctx, float x, float y, float w, float h, float radTopLeft, float radTopRight, float radBottomRight, float radBottomLeft); + + /** + * Creates new rounded rectangle shaped sub-path with varying radii for each corner. + * + * @param ctx the NanoVG context + * @param x the rectangle X axis coordinate + * @param y the rectangle Y axis coordinate + * @param w the rectangle width + * @param h the rectangle height + * @param radTopLeft the top-left corner radius + * @param radTopRight the top-right corner radius + * @param radBottomRight the bottom-right corner radius + * @param radBottomLeft the bottom-left corner radius + */ + public static void nvgRoundedRectVarying(@NativeType("NVGcontext *") long ctx, float x, float y, float w, float h, float radTopLeft, float radTopRight, float radBottomRight, float radBottomLeft) { + if (CHECKS) { + check(ctx); + } + nnvgRoundedRectVarying(ctx, x, y, w, h, radTopLeft, radTopRight, radBottomRight, radBottomLeft); + } + + // --- [ nvgEllipse ] --- + + /** Unsafe version of: {@link #nvgEllipse Ellipse} */ + public static native void nnvgEllipse(long ctx, float cx, float cy, float rx, float ry); + + /** + * Creates new ellipse shaped sub-path. + * + * @param ctx the NanoVG context + * @param cx the ellipse center X axis coordinate + * @param cy the ellipse center Y axis coordinate + * @param rx the ellipse X axis radius + * @param ry the ellipse Y axis radius + */ + public static void nvgEllipse(@NativeType("NVGcontext *") long ctx, float cx, float cy, float rx, float ry) { + if (CHECKS) { + check(ctx); + } + nnvgEllipse(ctx, cx, cy, rx, ry); + } + + // --- [ nvgCircle ] --- + + /** Unsafe version of: {@link #nvgCircle Circle} */ + public static native void nnvgCircle(long ctx, float cx, float cy, float r); + + /** + * Creates new circle shaped sub-path. + * + * @param ctx the NanoVG context + * @param cx the circle center X axis coordinate + * @param cy the circle center Y axis coordinate + * @param r the circle radius + */ + public static void nvgCircle(@NativeType("NVGcontext *") long ctx, float cx, float cy, float r) { + if (CHECKS) { + check(ctx); + } + nnvgCircle(ctx, cx, cy, r); + } + + // --- [ nvgFill ] --- + + /** Unsafe version of: {@link #nvgFill Fill} */ + public static native void nnvgFill(long ctx); + + /** + * Fills the current path with current fill style. + * + * @param ctx the NanoVG context + */ + public static void nvgFill(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgFill(ctx); + } + + // --- [ nvgStroke ] --- + + /** Unsafe version of: {@link #nvgStroke Stroke} */ + public static native void nnvgStroke(long ctx); + + /** + * Fills the current path with current stroke style. + * + * @param ctx the NanoVG context + */ + public static void nvgStroke(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgStroke(ctx); + } + + // --- [ nvgCreateFont ] --- + + /** Unsafe version of: {@link #nvgCreateFont CreateFont} */ + public static native int nnvgCreateFont(long ctx, long name, long filename); + + /** + * Creates font by loading it from the disk from specified file name. + * + * @param ctx the NanoVG context + * @param name the font name + * @param filename the font file name + * + * @return a handle to the font + */ + public static int nvgCreateFont(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") ByteBuffer name, @NativeType("char const *") ByteBuffer filename) { + if (CHECKS) { + check(ctx); + checkNT1(name); + checkNT1(filename); + } + return nnvgCreateFont(ctx, memAddress(name), memAddress(filename)); + } + + /** + * Creates font by loading it from the disk from specified file name. + * + * @param ctx the NanoVG context + * @param name the font name + * @param filename the font file name + * + * @return a handle to the font + */ + public static int nvgCreateFont(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") CharSequence name, @NativeType("char const *") CharSequence filename) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + stack.nASCII(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nnvgCreateFont(ctx, nameEncoded, filenameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgCreateFontAtIndex ] --- + + /** Unsafe version of: {@link #nvgCreateFontAtIndex CreateFontAtIndex} */ + public static native int nnvgCreateFontAtIndex(long ctx, long name, long filename, int fontIndex); + + /** + * Creates font by loading it from the disk from specified file name. + * + * @param ctx the NanoVG context + * @param name the font name + * @param filename the font file name + * @param fontIndex specifies which font face to load from a .ttf/.ttc file + * + * @return a handle to the font + */ + public static int nvgCreateFontAtIndex(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") ByteBuffer name, @NativeType("char const *") ByteBuffer filename, int fontIndex) { + if (CHECKS) { + check(ctx); + checkNT1(name); + checkNT1(filename); + } + return nnvgCreateFontAtIndex(ctx, memAddress(name), memAddress(filename), fontIndex); + } + + /** + * Creates font by loading it from the disk from specified file name. + * + * @param ctx the NanoVG context + * @param name the font name + * @param filename the font file name + * @param fontIndex specifies which font face to load from a .ttf/.ttc file + * + * @return a handle to the font + */ + public static int nvgCreateFontAtIndex(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") CharSequence name, @NativeType("char const *") CharSequence filename, int fontIndex) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + stack.nASCII(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nnvgCreateFontAtIndex(ctx, nameEncoded, filenameEncoded, fontIndex); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgCreateFontMem ] --- + + /** + * Unsafe version of: {@link #nvgCreateFontMem CreateFontMem} + * + * @param ndata the font data size, in bytes + */ + public static native int nnvgCreateFontMem(long ctx, long name, long data, int ndata, int freeData); + + /** + * Creates font by loading it from the specified memory chunk. + * + *

    The memory chunk must remain valid for as long as the font is used by NanoVG.

    + * + * @param ctx the NanoVG context + * @param name the font name + * @param data the font data + * @param freeData 1 if the font data should be freed automatically, 0 otherwise + * + * @return a handle to the font + */ + public static int nvgCreateFontMem(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") ByteBuffer name, @NativeType("unsigned char *") ByteBuffer data, @NativeType("int") boolean freeData) { + if (CHECKS) { + check(ctx); + checkNT1(name); + } + return nnvgCreateFontMem(ctx, memAddress(name), memAddress(data), data.remaining(), freeData ? 1 : 0); + } + + /** + * Creates font by loading it from the specified memory chunk. + * + *

    The memory chunk must remain valid for as long as the font is used by NanoVG.

    + * + * @param ctx the NanoVG context + * @param name the font name + * @param data the font data + * @param freeData 1 if the font data should be freed automatically, 0 otherwise + * + * @return a handle to the font + */ + public static int nvgCreateFontMem(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") CharSequence name, @NativeType("unsigned char *") ByteBuffer data, @NativeType("int") boolean freeData) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nnvgCreateFontMem(ctx, nameEncoded, memAddress(data), data.remaining(), freeData ? 1 : 0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgCreateFontMemAtIndex ] --- + + /** + * Unsafe version of: {@link #nvgCreateFontMemAtIndex CreateFontMemAtIndex} + * + * @param ndata the font data size, in bytes + */ + public static native int nnvgCreateFontMemAtIndex(long ctx, long name, long data, int ndata, int freeData, int fontIndex); + + /** + * Creates font by loading it from the specified memory chunk. + * + *

    The memory chunk must remain valid for as long as the font is used by NanoVG.

    + * + * @param ctx the NanoVG context + * @param name the font name + * @param data the font data + * @param freeData 1 if the font data should be freed automatically, 0 otherwise + * @param fontIndex specifies which font face to load from a .ttf/.ttc file + * + * @return a handle to the font + */ + public static int nvgCreateFontMemAtIndex(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") ByteBuffer name, @NativeType("unsigned char *") ByteBuffer data, @NativeType("int") boolean freeData, int fontIndex) { + if (CHECKS) { + check(ctx); + checkNT1(name); + } + return nnvgCreateFontMemAtIndex(ctx, memAddress(name), memAddress(data), data.remaining(), freeData ? 1 : 0, fontIndex); + } + + /** + * Creates font by loading it from the specified memory chunk. + * + *

    The memory chunk must remain valid for as long as the font is used by NanoVG.

    + * + * @param ctx the NanoVG context + * @param name the font name + * @param data the font data + * @param freeData 1 if the font data should be freed automatically, 0 otherwise + * @param fontIndex specifies which font face to load from a .ttf/.ttc file + * + * @return a handle to the font + */ + public static int nvgCreateFontMemAtIndex(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") CharSequence name, @NativeType("unsigned char *") ByteBuffer data, @NativeType("int") boolean freeData, int fontIndex) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nnvgCreateFontMemAtIndex(ctx, nameEncoded, memAddress(data), data.remaining(), freeData ? 1 : 0, fontIndex); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgFindFont ] --- + + /** Unsafe version of: {@link #nvgFindFont FindFont} */ + public static native int nnvgFindFont(long ctx, long name); + + /** + * Finds a loaded font of specified name, and returns handle to it, or -1 if the font is not found. + * + * @param ctx the NanoVG context + * @param name the font name + */ + public static int nvgFindFont(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + check(ctx); + checkNT1(name); + } + return nnvgFindFont(ctx, memAddress(name)); + } + + /** + * Finds a loaded font of specified name, and returns handle to it, or -1 if the font is not found. + * + * @param ctx the NanoVG context + * @param name the font name + */ + public static int nvgFindFont(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") CharSequence name) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nnvgFindFont(ctx, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgAddFallbackFontId ] --- + + /** Unsafe version of: {@link #nvgAddFallbackFontId AddFallbackFontId} */ + public static native int nnvgAddFallbackFontId(long ctx, int baseFont, int fallbackFont); + + /** + * Adds fallback font by handle. + * + * @param ctx the NanoVG context + */ + public static int nvgAddFallbackFontId(@NativeType("NVGcontext *") long ctx, int baseFont, int fallbackFont) { + if (CHECKS) { + check(ctx); + } + return nnvgAddFallbackFontId(ctx, baseFont, fallbackFont); + } + + // --- [ nvgAddFallbackFont ] --- + + /** Unsafe version of: {@link #nvgAddFallbackFont AddFallbackFont} */ + public static native int nnvgAddFallbackFont(long ctx, long baseFont, long fallbackFont); + + /** + * Adds fallback font by name. + * + * @param ctx the NanoVG context + */ + public static int nvgAddFallbackFont(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") ByteBuffer baseFont, @NativeType("char const *") ByteBuffer fallbackFont) { + if (CHECKS) { + check(ctx); + checkNT1(baseFont); + checkNT1(fallbackFont); + } + return nnvgAddFallbackFont(ctx, memAddress(baseFont), memAddress(fallbackFont)); + } + + /** + * Adds fallback font by name. + * + * @param ctx the NanoVG context + */ + public static int nvgAddFallbackFont(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") CharSequence baseFont, @NativeType("char const *") CharSequence fallbackFont) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(baseFont, true); + long baseFontEncoded = stack.getPointerAddress(); + stack.nASCII(fallbackFont, true); + long fallbackFontEncoded = stack.getPointerAddress(); + return nnvgAddFallbackFont(ctx, baseFontEncoded, fallbackFontEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgResetFallbackFontsId ] --- + + /** Unsafe version of: {@link #nvgResetFallbackFontsId ResetFallbackFontsId} */ + public static native void nnvgResetFallbackFontsId(long ctx, int baseFont); + + /** + * Resets fallback fonts by handle. + * + * @param ctx the NanoVG context + */ + public static void nvgResetFallbackFontsId(@NativeType("NVGcontext *") long ctx, int baseFont) { + if (CHECKS) { + check(ctx); + } + nnvgResetFallbackFontsId(ctx, baseFont); + } + + // --- [ nvgResetFallbackFonts ] --- + + /** Unsafe version of: {@link #nvgResetFallbackFonts ResetFallbackFonts} */ + public static native void nnvgResetFallbackFonts(long ctx, long baseFont); + + /** + * Resets fallback fonts by name. + * + * @param ctx the NanoVG context + */ + public static void nvgResetFallbackFonts(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") ByteBuffer baseFont) { + if (CHECKS) { + check(ctx); + checkNT1(baseFont); + } + nnvgResetFallbackFonts(ctx, memAddress(baseFont)); + } + + /** + * Resets fallback fonts by name. + * + * @param ctx the NanoVG context + */ + public static void nvgResetFallbackFonts(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") CharSequence baseFont) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(baseFont, true); + long baseFontEncoded = stack.getPointerAddress(); + nnvgResetFallbackFonts(ctx, baseFontEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgFontSize ] --- + + /** Unsafe version of: {@link #nvgFontSize FontSize} */ + public static native void nnvgFontSize(long ctx, float size); + + /** + * Sets the font size of current text style. + * + * @param ctx the NanoVG context + * @param size the font size to set + */ + public static void nvgFontSize(@NativeType("NVGcontext *") long ctx, float size) { + if (CHECKS) { + check(ctx); + } + nnvgFontSize(ctx, size); + } + + // --- [ nvgFontBlur ] --- + + /** Unsafe version of: {@link #nvgFontBlur FontBlur} */ + public static native void nnvgFontBlur(long ctx, float blur); + + /** + * Sets the blur of current text style. + * + * @param ctx the NanoVG context + * @param blur the blur amount to set + */ + public static void nvgFontBlur(@NativeType("NVGcontext *") long ctx, float blur) { + if (CHECKS) { + check(ctx); + } + nnvgFontBlur(ctx, blur); + } + + // --- [ nvgTextLetterSpacing ] --- + + /** Unsafe version of: {@link #nvgTextLetterSpacing TextLetterSpacing} */ + public static native void nnvgTextLetterSpacing(long ctx, float spacing); + + /** + * Sets the letter spacing of current text style. + * + * @param ctx the NanoVG context + * @param spacing the letter spacing amount to set + */ + public static void nvgTextLetterSpacing(@NativeType("NVGcontext *") long ctx, float spacing) { + if (CHECKS) { + check(ctx); + } + nnvgTextLetterSpacing(ctx, spacing); + } + + // --- [ nvgTextLineHeight ] --- + + /** Unsafe version of: {@link #nvgTextLineHeight TextLineHeight} */ + public static native void nnvgTextLineHeight(long ctx, float lineHeight); + + /** + * Sets the proportional line height of current text style. The line height is specified as multiple of font size. + * + * @param ctx the NanoVG context + * @param lineHeight the line height to set + */ + public static void nvgTextLineHeight(@NativeType("NVGcontext *") long ctx, float lineHeight) { + if (CHECKS) { + check(ctx); + } + nnvgTextLineHeight(ctx, lineHeight); + } + + // --- [ nvgTextAlign ] --- + + /** Unsafe version of: {@link #nvgTextAlign TextAlign} */ + public static native void nnvgTextAlign(long ctx, int align); + + /** + * Sets the text align of current text style. + * + * @param ctx the NanoVG context + * @param align the text align to set. One of:
    {@link #NVG_ALIGN_LEFT ALIGN_LEFT}{@link #NVG_ALIGN_CENTER ALIGN_CENTER}{@link #NVG_ALIGN_RIGHT ALIGN_RIGHT}{@link #NVG_ALIGN_TOP ALIGN_TOP}{@link #NVG_ALIGN_MIDDLE ALIGN_MIDDLE}{@link #NVG_ALIGN_BOTTOM ALIGN_BOTTOM}{@link #NVG_ALIGN_BASELINE ALIGN_BASELINE}
    + */ + public static void nvgTextAlign(@NativeType("NVGcontext *") long ctx, int align) { + if (CHECKS) { + check(ctx); + } + nnvgTextAlign(ctx, align); + } + + // --- [ nvgFontFaceId ] --- + + /** Unsafe version of: {@link #nvgFontFaceId FontFaceId} */ + public static native void nnvgFontFaceId(long ctx, int font); + + /** + * Sets the font face based on specified id of current text style. + * + * @param ctx the NanoVG context + * @param font the font id + */ + public static void nvgFontFaceId(@NativeType("NVGcontext *") long ctx, int font) { + if (CHECKS) { + check(ctx); + } + nnvgFontFaceId(ctx, font); + } + + // --- [ nvgFontFace ] --- + + /** Unsafe version of: {@link #nvgFontFace FontFace} */ + public static native void nnvgFontFace(long ctx, long font); + + /** + * Sets the font face based on specified name of current text style. + * + * @param ctx the NanoVG context + * @param font the font name + */ + public static void nvgFontFace(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") ByteBuffer font) { + if (CHECKS) { + check(ctx); + checkNT1(font); + } + nnvgFontFace(ctx, memAddress(font)); + } + + /** + * Sets the font face based on specified name of current text style. + * + * @param ctx the NanoVG context + * @param font the font name + */ + public static void nvgFontFace(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") CharSequence font) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(font, true); + long fontEncoded = stack.getPointerAddress(); + nnvgFontFace(ctx, fontEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgText ] --- + + /** + * Unsafe version of: {@link #nvgText Text} + * + * @param end a pointer to the end of the sub-string to draw, or {@code NULL} + */ + public static native float nnvgText(long ctx, float x, float y, long string, long end); + + /** + * Draws text string at specified location. If {@code end} is specified only the sub-string up to the {@code end} is drawn. + * + * @param ctx the NanoVG context + * @param x the text X axis coordinate + * @param y the text Y axis coordinate + * @param string the text string to draw + */ + public static float nvgText(@NativeType("NVGcontext *") long ctx, float x, float y, @NativeType("char const *") ByteBuffer string) { + if (CHECKS) { + check(ctx); + } + return nnvgText(ctx, x, y, memAddress(string), memAddress(string) + string.remaining()); + } + + /** + * Draws text string at specified location. If {@code end} is specified only the sub-string up to the {@code end} is drawn. + * + * @param ctx the NanoVG context + * @param x the text X axis coordinate + * @param y the text Y axis coordinate + * @param string the text string to draw + */ + public static float nvgText(@NativeType("NVGcontext *") long ctx, float x, float y, @NativeType("char const *") CharSequence string) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int stringEncodedLength = stack.nUTF8(string, false); + long stringEncoded = stack.getPointerAddress(); + return nnvgText(ctx, x, y, stringEncoded, stringEncoded + stringEncodedLength); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgTextBox ] --- + + /** + * Unsafe version of: {@link #nvgTextBox TextBox} + * + * @param end a pointer to the end of the sub-string to draw, or {@code NULL} + */ + public static native void nnvgTextBox(long ctx, float x, float y, float breakRowWidth, long string, long end); + + /** + * Draws multi-line text string at specified location wrapped at the specified width. If {@code end} is specified only the sub-string up to the + * {@code end} is drawn. + * + *

    White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. Words longer + * than the max width are slit at nearest character (i.e. no hyphenation).

    + * + * @param ctx the NanoVG context + * @param x the text box X axis coordinate + * @param y the text box Y axis coordinate + * @param breakRowWidth the maximum row width + * @param string the text string to draw + */ + public static void nvgTextBox(@NativeType("NVGcontext *") long ctx, float x, float y, float breakRowWidth, @NativeType("char const *") ByteBuffer string) { + if (CHECKS) { + check(ctx); + } + nnvgTextBox(ctx, x, y, breakRowWidth, memAddress(string), memAddress(string) + string.remaining()); + } + + /** + * Draws multi-line text string at specified location wrapped at the specified width. If {@code end} is specified only the sub-string up to the + * {@code end} is drawn. + * + *

    White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. Words longer + * than the max width are slit at nearest character (i.e. no hyphenation).

    + * + * @param ctx the NanoVG context + * @param x the text box X axis coordinate + * @param y the text box Y axis coordinate + * @param breakRowWidth the maximum row width + * @param string the text string to draw + */ + public static void nvgTextBox(@NativeType("NVGcontext *") long ctx, float x, float y, float breakRowWidth, @NativeType("char const *") CharSequence string) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int stringEncodedLength = stack.nUTF8(string, false); + long stringEncoded = stack.getPointerAddress(); + nnvgTextBox(ctx, x, y, breakRowWidth, stringEncoded, stringEncoded + stringEncodedLength); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgTextBounds ] --- + + /** + * Unsafe version of: {@link #nvgTextBounds TextBounds} + * + * @param end a pointer to the end of the sub-string to measure, or {@code NULL} + */ + public static native float nnvgTextBounds(long ctx, float x, float y, long string, long end, long bounds); + + /** + * Measures the specified text string. + * + *

    Parameter {@code bounds} should be a pointer to {@code float[4]}, if the bounding box of the text should be returned. The bounds value are + * {@code [xmin,ymin, xmax,ymax]}.

    + * + *

    Measured values are returned in local coordinate space.

    + * + * @param ctx the NanoVG context + * @param x the text X axis coordinate + * @param y the text Y axis coordinate + * @param string the text string to measure + * @param bounds returns the bounding box of the text + * + * @return the horizontal advance of the measured text (i.e. where the next character should drawn) + */ + public static float nvgTextBounds(@NativeType("NVGcontext *") long ctx, float x, float y, @NativeType("char const *") ByteBuffer string, @Nullable @NativeType("float *") FloatBuffer bounds) { + if (CHECKS) { + check(ctx); + checkSafe(bounds, 4); + } + return nnvgTextBounds(ctx, x, y, memAddress(string), memAddress(string) + string.remaining(), memAddressSafe(bounds)); + } + + /** + * Measures the specified text string. + * + *

    Parameter {@code bounds} should be a pointer to {@code float[4]}, if the bounding box of the text should be returned. The bounds value are + * {@code [xmin,ymin, xmax,ymax]}.

    + * + *

    Measured values are returned in local coordinate space.

    + * + * @param ctx the NanoVG context + * @param x the text X axis coordinate + * @param y the text Y axis coordinate + * @param string the text string to measure + * @param bounds returns the bounding box of the text + * + * @return the horizontal advance of the measured text (i.e. where the next character should drawn) + */ + public static float nvgTextBounds(@NativeType("NVGcontext *") long ctx, float x, float y, @NativeType("char const *") CharSequence string, @Nullable @NativeType("float *") FloatBuffer bounds) { + if (CHECKS) { + check(ctx); + checkSafe(bounds, 4); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int stringEncodedLength = stack.nUTF8(string, false); + long stringEncoded = stack.getPointerAddress(); + return nnvgTextBounds(ctx, x, y, stringEncoded, stringEncoded + stringEncodedLength, memAddressSafe(bounds)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgTextBoxBounds ] --- + + /** + * Unsafe version of: {@link #nvgTextBoxBounds TextBoxBounds} + * + * @param end a pointer to the end of the sub-string to measure, or {@code NULL} + */ + public static native void nnvgTextBoxBounds(long ctx, float x, float y, float breakRowWidth, long string, long end, long bounds); + + /** + * Measures the specified multi-text string. + * + *

    Parameter {@code bounds} should be a pointer to {@code float[4]}, if the bounding box of the text should be returned. The bounds value are + * {@code [xmin,ymin, xmax,ymax]}.

    + * + *

    Measured values are returned in local coordinate space.

    + * + * @param ctx the NanoVG context + * @param x the text box X axis coordinate + * @param y the text box Y axis coordinate + * @param breakRowWidth the maximum row width + * @param string the text string to measure + * @param bounds returns the bounding box of the text box + */ + public static void nvgTextBoxBounds(@NativeType("NVGcontext *") long ctx, float x, float y, float breakRowWidth, @NativeType("char const *") ByteBuffer string, @Nullable @NativeType("float *") FloatBuffer bounds) { + if (CHECKS) { + check(ctx); + checkSafe(bounds, 4); + } + nnvgTextBoxBounds(ctx, x, y, breakRowWidth, memAddress(string), memAddress(string) + string.remaining(), memAddressSafe(bounds)); + } + + /** + * Measures the specified multi-text string. + * + *

    Parameter {@code bounds} should be a pointer to {@code float[4]}, if the bounding box of the text should be returned. The bounds value are + * {@code [xmin,ymin, xmax,ymax]}.

    + * + *

    Measured values are returned in local coordinate space.

    + * + * @param ctx the NanoVG context + * @param x the text box X axis coordinate + * @param y the text box Y axis coordinate + * @param breakRowWidth the maximum row width + * @param string the text string to measure + * @param bounds returns the bounding box of the text box + */ + public static void nvgTextBoxBounds(@NativeType("NVGcontext *") long ctx, float x, float y, float breakRowWidth, @NativeType("char const *") CharSequence string, @Nullable @NativeType("float *") FloatBuffer bounds) { + if (CHECKS) { + check(ctx); + checkSafe(bounds, 4); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int stringEncodedLength = stack.nUTF8(string, false); + long stringEncoded = stack.getPointerAddress(); + nnvgTextBoxBounds(ctx, x, y, breakRowWidth, stringEncoded, stringEncoded + stringEncodedLength, memAddressSafe(bounds)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgTextGlyphPositions ] --- + + /** + * Unsafe version of: {@link #nvgTextGlyphPositions TextGlyphPositions} + * + * @param end a pointer to the end of the sub-string to measure, or {@code NULL} + * @param maxPositions the maximum number of glyph positions to return + */ + public static native int nnvgTextGlyphPositions(long ctx, float x, float y, long string, long end, long positions, int maxPositions); + + /** + * Calculates the glyph x positions of the specified text. If {@code end} is specified only the sub-string will be used. + * + *

    Measured values are returned in local coordinate space.

    + * + * @param ctx the NanoVG context + * @param x the text X axis coordinate + * @param y the text Y axis coordinate + * @param string the text string to measure + * @param positions returns the glyph x positions + */ + public static int nvgTextGlyphPositions(@NativeType("NVGcontext *") long ctx, float x, float y, @NativeType("char const *") ByteBuffer string, @NativeType("NVGglyphPosition *") NVGGlyphPosition.Buffer positions) { + if (CHECKS) { + check(ctx); + } + return nnvgTextGlyphPositions(ctx, x, y, memAddress(string), memAddress(string) + string.remaining(), positions.address(), positions.remaining()); + } + + /** + * Calculates the glyph x positions of the specified text. If {@code end} is specified only the sub-string will be used. + * + *

    Measured values are returned in local coordinate space.

    + * + * @param ctx the NanoVG context + * @param x the text X axis coordinate + * @param y the text Y axis coordinate + * @param string the text string to measure + * @param positions returns the glyph x positions + */ + public static int nvgTextGlyphPositions(@NativeType("NVGcontext *") long ctx, float x, float y, @NativeType("char const *") CharSequence string, @NativeType("NVGglyphPosition *") NVGGlyphPosition.Buffer positions) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int stringEncodedLength = stack.nUTF8(string, false); + long stringEncoded = stack.getPointerAddress(); + return nnvgTextGlyphPositions(ctx, x, y, stringEncoded, stringEncoded + stringEncodedLength, positions.address(), positions.remaining()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgTextMetrics ] --- + + /** Unsafe version of: {@link #nvgTextMetrics TextMetrics} */ + public static native void nnvgTextMetrics(long ctx, long ascender, long descender, long lineh); + + /** + * Returns the vertical metrics based on the current text style. + * + *

    Measured values are returned in local coordinate space.

    + * + * @param ctx the NanoVG context + * @param ascender the line ascend + * @param descender the line descend + * @param lineh the line height + */ + public static void nvgTextMetrics(@NativeType("NVGcontext *") long ctx, @Nullable @NativeType("float *") FloatBuffer ascender, @Nullable @NativeType("float *") FloatBuffer descender, @Nullable @NativeType("float *") FloatBuffer lineh) { + if (CHECKS) { + check(ctx); + checkSafe(ascender, 1); + checkSafe(descender, 1); + checkSafe(lineh, 1); + } + nnvgTextMetrics(ctx, memAddressSafe(ascender), memAddressSafe(descender), memAddressSafe(lineh)); + } + + // --- [ nvgTextBreakLines ] --- + + /** + * Unsafe version of: {@link #nvgTextBreakLines TextBreakLines} + * + * @param end a pointer to the end of the sub-string to measure, or {@code NULL} + * @param maxRows the maximum number of text rows to return + */ + public static native int nnvgTextBreakLines(long ctx, long string, long end, float breakRowWidth, long rows, int maxRows); + + /** + * Breaks the specified text into lines. If {@code end} is specified only the sub-string will be used. + * + *

    White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. Words longer + * than the max width are slit at nearest character (i.e. no hyphenation).

    + * + * @param ctx the NanoVG context + * @param string the text string to measure + * @param breakRowWidth the maximum row width + * @param rows returns the text rows + */ + public static int nvgTextBreakLines(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") ByteBuffer string, float breakRowWidth, @NativeType("NVGtextRow *") NVGTextRow.Buffer rows) { + if (CHECKS) { + check(ctx); + } + return nnvgTextBreakLines(ctx, memAddress(string), memAddress(string) + string.remaining(), breakRowWidth, rows.address(), rows.remaining()); + } + + /** + * Breaks the specified text into lines. If {@code end} is specified only the sub-string will be used. + * + *

    White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. Words longer + * than the max width are slit at nearest character (i.e. no hyphenation).

    + * + * @param ctx the NanoVG context + * @param string the text string to measure + * @param breakRowWidth the maximum row width + * @param rows returns the text rows + */ + public static int nvgTextBreakLines(@NativeType("NVGcontext *") long ctx, @NativeType("char const *") CharSequence string, float breakRowWidth, @NativeType("NVGtextRow *") NVGTextRow.Buffer rows) { + if (CHECKS) { + check(ctx); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int stringEncodedLength = stack.nUTF8(string, false); + long stringEncoded = stack.getPointerAddress(); + return nnvgTextBreakLines(ctx, stringEncoded, stringEncoded + stringEncodedLength, breakRowWidth, rows.address(), rows.remaining()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ nvgCreateInternal ] --- + + @NativeType("void *") + private static native long nvgCreateInternal(); + + static final long nvgCreateInternal = nvgCreateInternal(); + + // --- [ nvgInternalParams ] --- + + @NativeType("void *") + private static native long nvgInternalParams(); + + static final long nvgInternalParams = nvgInternalParams(); + + // --- [ nvgDeleteInternal ] --- + + @NativeType("void *") + private static native long nvgDeleteInternal(); + + static final long nvgDeleteInternal = nvgDeleteInternal(); + + /** Array version of: {@link #nnvgCurrentTransform} */ + public static native void nnvgCurrentTransform(long ctx, float[] xform); + + /** Array version of: {@link #nvgCurrentTransform CurrentTransform} */ + public static void nvgCurrentTransform(@NativeType("NVGcontext *") long ctx, @NativeType("float *") float[] xform) { + if (CHECKS) { + check(ctx); + check(xform, 6); + } + nnvgCurrentTransform(ctx, xform); + } + + /** Array version of: {@link #nnvgTransformIdentity} */ + public static native void nnvgTransformIdentity(float[] dst); + + /** Array version of: {@link #nvgTransformIdentity TransformIdentity} */ + public static void nvgTransformIdentity(@NativeType("float *") float[] dst) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformIdentity(dst); + } + + /** Array version of: {@link #nnvgTransformTranslate} */ + public static native void nnvgTransformTranslate(float[] dst, float tx, float ty); + + /** Array version of: {@link #nvgTransformTranslate TransformTranslate} */ + public static void nvgTransformTranslate(@NativeType("float *") float[] dst, float tx, float ty) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformTranslate(dst, tx, ty); + } + + /** Array version of: {@link #nnvgTransformScale} */ + public static native void nnvgTransformScale(float[] dst, float sx, float sy); + + /** Array version of: {@link #nvgTransformScale TransformScale} */ + public static void nvgTransformScale(@NativeType("float *") float[] dst, float sx, float sy) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformScale(dst, sx, sy); + } + + /** Array version of: {@link #nnvgTransformRotate} */ + public static native void nnvgTransformRotate(float[] dst, float a); + + /** Array version of: {@link #nvgTransformRotate TransformRotate} */ + public static void nvgTransformRotate(@NativeType("float *") float[] dst, float a) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformRotate(dst, a); + } + + /** Array version of: {@link #nnvgTransformSkewX} */ + public static native void nnvgTransformSkewX(float[] dst, float a); + + /** Array version of: {@link #nvgTransformSkewX TransformSkewX} */ + public static void nvgTransformSkewX(@NativeType("float *") float[] dst, float a) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformSkewX(dst, a); + } + + /** Array version of: {@link #nnvgTransformSkewY} */ + public static native void nnvgTransformSkewY(float[] dst, float a); + + /** Array version of: {@link #nvgTransformSkewY TransformSkewY} */ + public static void nvgTransformSkewY(@NativeType("float *") float[] dst, float a) { + if (CHECKS) { + check(dst, 6); + } + nnvgTransformSkewY(dst, a); + } + + /** Array version of: {@link #nnvgTransformMultiply} */ + public static native void nnvgTransformMultiply(float[] dst, float[] src); + + /** Array version of: {@link #nvgTransformMultiply TransformMultiply} */ + public static void nvgTransformMultiply(@NativeType("float *") float[] dst, @NativeType("float const *") float[] src) { + if (CHECKS) { + check(dst, 6); + check(src, 6); + } + nnvgTransformMultiply(dst, src); + } + + /** Array version of: {@link #nnvgTransformPremultiply} */ + public static native void nnvgTransformPremultiply(float[] dst, float[] src); + + /** Array version of: {@link #nvgTransformPremultiply TransformPremultiply} */ + public static void nvgTransformPremultiply(@NativeType("float *") float[] dst, @NativeType("float const *") float[] src) { + if (CHECKS) { + check(dst, 6); + check(src, 6); + } + nnvgTransformPremultiply(dst, src); + } + + /** Array version of: {@link #nnvgTransformInverse} */ + public static native int nnvgTransformInverse(float[] dst, float[] src); + + /** Array version of: {@link #nvgTransformInverse TransformInverse} */ + @NativeType("int") + public static boolean nvgTransformInverse(@NativeType("float *") float[] dst, @NativeType("float const *") float[] src) { + if (CHECKS) { + check(dst, 6); + check(src, 6); + } + return nnvgTransformInverse(dst, src) != 0; + } + + /** Array version of: {@link #nnvgTransformPoint} */ + public static native void nnvgTransformPoint(float[] dstx, float[] dsty, float[] xform, float srcx, float srcy); + + /** Array version of: {@link #nvgTransformPoint TransformPoint} */ + public static void nvgTransformPoint(@NativeType("float *") float[] dstx, @NativeType("float *") float[] dsty, @NativeType("float const *") float[] xform, float srcx, float srcy) { + if (CHECKS) { + check(dstx, 1); + check(dsty, 1); + check(xform, 6); + } + nnvgTransformPoint(dstx, dsty, xform, srcx, srcy); + } + + /** Array version of: {@link #nnvgImageSize} */ + public static native void nnvgImageSize(long ctx, int image, int[] w, int[] h); + + /** Array version of: {@link #nvgImageSize ImageSize} */ + public static void nvgImageSize(@NativeType("NVGcontext *") long ctx, int image, @NativeType("int *") int[] w, @NativeType("int *") int[] h) { + if (CHECKS) { + check(ctx); + check(w, 1); + check(h, 1); + } + nnvgImageSize(ctx, image, w, h); + } + + /** Array version of: {@link #nnvgTextBounds} */ + public static native float nnvgTextBounds(long ctx, float x, float y, long string, long end, float[] bounds); + + /** Array version of: {@link #nvgTextBounds TextBounds} */ + public static float nvgTextBounds(@NativeType("NVGcontext *") long ctx, float x, float y, @NativeType("char const *") ByteBuffer string, @Nullable @NativeType("float *") float[] bounds) { + if (CHECKS) { + check(ctx); + checkSafe(bounds, 4); + } + return nnvgTextBounds(ctx, x, y, memAddress(string), memAddress(string) + string.remaining(), bounds); + } + + /** Array version of: {@link #nvgTextBounds TextBounds} */ + public static float nvgTextBounds(@NativeType("NVGcontext *") long ctx, float x, float y, @NativeType("char const *") CharSequence string, @Nullable @NativeType("float *") float[] bounds) { + if (CHECKS) { + check(ctx); + checkSafe(bounds, 4); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int stringEncodedLength = stack.nUTF8(string, false); + long stringEncoded = stack.getPointerAddress(); + return nnvgTextBounds(ctx, x, y, stringEncoded, stringEncoded + stringEncodedLength, bounds); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #nnvgTextBoxBounds} */ + public static native void nnvgTextBoxBounds(long ctx, float x, float y, float breakRowWidth, long string, long end, float[] bounds); + + /** Array version of: {@link #nvgTextBoxBounds TextBoxBounds} */ + public static void nvgTextBoxBounds(@NativeType("NVGcontext *") long ctx, float x, float y, float breakRowWidth, @NativeType("char const *") ByteBuffer string, @Nullable @NativeType("float *") float[] bounds) { + if (CHECKS) { + check(ctx); + checkSafe(bounds, 4); + } + nnvgTextBoxBounds(ctx, x, y, breakRowWidth, memAddress(string), memAddress(string) + string.remaining(), bounds); + } + + /** Array version of: {@link #nvgTextBoxBounds TextBoxBounds} */ + public static void nvgTextBoxBounds(@NativeType("NVGcontext *") long ctx, float x, float y, float breakRowWidth, @NativeType("char const *") CharSequence string, @Nullable @NativeType("float *") float[] bounds) { + if (CHECKS) { + check(ctx); + checkSafe(bounds, 4); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int stringEncodedLength = stack.nUTF8(string, false); + long stringEncoded = stack.getPointerAddress(); + nnvgTextBoxBounds(ctx, x, y, breakRowWidth, stringEncoded, stringEncoded + stringEncodedLength, bounds); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #nnvgTextMetrics} */ + public static native void nnvgTextMetrics(long ctx, float[] ascender, float[] descender, float[] lineh); + + /** Array version of: {@link #nvgTextMetrics TextMetrics} */ + public static void nvgTextMetrics(@NativeType("NVGcontext *") long ctx, @Nullable @NativeType("float *") float[] ascender, @Nullable @NativeType("float *") float[] descender, @Nullable @NativeType("float *") float[] lineh) { + if (CHECKS) { + check(ctx); + checkSafe(ascender, 1); + checkSafe(descender, 1); + checkSafe(lineh, 1); + } + nnvgTextMetrics(ctx, ascender, descender, lineh); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGBGFX.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGBGFX.java new file mode 100644 index 000000000..6c351baca --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGBGFX.java @@ -0,0 +1,205 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.nanovg.NanoVG.*; + +/** Implementation of the NanoVG API using bgfx. */ +public class NanoVGBGFX { + + /** Contains the function pointers loaded from bgfx. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + Create = apiGetFunctionAddress(BGFX.getLibrary(), "nvgCreate"), + Delete = apiGetFunctionAddress(BGFX.getLibrary(), "nvgDelete"), + SetViewId = apiGetFunctionAddress(BGFX.getLibrary(), "nvgSetViewId"), + GetViewId = apiGetFunctionAddress(BGFX.getLibrary(), "nvgGetViewId"), + luCreateFramebuffer = apiGetFunctionAddress(BGFX.getLibrary(), "nvgluCreateFramebuffer"), + luBindFramebuffer = apiGetFunctionAddress(BGFX.getLibrary(), "nvgluBindFramebuffer"), + luDeleteFramebuffer = apiGetFunctionAddress(BGFX.getLibrary(), "nvgluDeleteFramebuffer"), + luSetViewFramebuffer = apiGetFunctionAddress(BGFX.getLibrary(), "nvgluSetViewFramebuffer"), + CreateBgfxTexture = apiGetFunctionAddress(BGFX.getLibrary(), "nvgCreateBgfxTexture"), + org_lwjgl_nanovg_setup = apiGetFunctionAddress(BGFX.getLibrary(), "org_lwjgl_nanovg_setup"); + + } + + /** + * These are additional flags on top of NVGimageFlags. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_IMAGE_NODELETE IMAGE_NODELETE} - Do not delete GL texture handle.
    • + *
    + */ + public static final int NVG_IMAGE_NODELETE = 1<<16; + + static { + MemoryAllocator allocator = getAllocator(Configuration.DEBUG_MEMORY_ALLOCATOR_INTERNAL.get(true)); + org_lwjgl_nanovg_setup( + allocator.getRealloc(), + allocator.getFree(), + nvgCreateInternal, + nvgInternalParams, + nvgDeleteInternal + ); + } + + protected NanoVGBGFX() { + throw new UnsupportedOperationException(); + } + + // --- [ nvgCreate ] --- + + public static long nnvgCreate(int _edgeaa, short _viewId, long _allocator) { + long __functionAddress = Functions.Create; + return invokePP(_edgeaa, _viewId, _allocator, __functionAddress); + } + + @NativeType("NVGcontext *") + public static long nvgCreate(@NativeType("int32_t") boolean _edgeaa, @NativeType("bgfx_view_id_t") int _viewId, @NativeType("bgfx_allocator_interface_t *") long _allocator) { + return nnvgCreate(_edgeaa ? 1 : 0, (short)_viewId, _allocator); + } + + // --- [ nvgDelete ] --- + + public static void nvgDelete(@NativeType("NVGcontext *") long _ctx) { + long __functionAddress = Functions.Delete; + if (CHECKS) { + check(_ctx); + } + invokePV(_ctx, __functionAddress); + } + + // --- [ nvgSetViewId ] --- + + public static void nnvgSetViewId(long _ctx, short _viewId) { + long __functionAddress = Functions.SetViewId; + if (CHECKS) { + check(_ctx); + } + invokePV(_ctx, _viewId, __functionAddress); + } + + public static void nvgSetViewId(@NativeType("NVGcontext *") long _ctx, @NativeType("bgfx_view_id_t") int _viewId) { + nnvgSetViewId(_ctx, (short)_viewId); + } + + // --- [ nvgGetViewId ] --- + + @NativeType("uint16_t") + public static short nvgGetViewId(@NativeType("NVGcontext *") long _ctx) { + long __functionAddress = Functions.GetViewId; + if (CHECKS) { + check(_ctx); + } + return invokePC(_ctx, __functionAddress); + } + + // --- [ nvgluCreateFramebuffer ] --- + + public static long nnvgluCreateFramebuffer(long _ctx, int _width, int _height, int imageFlags) { + long __functionAddress = Functions.luCreateFramebuffer; + if (CHECKS) { + check(_ctx); + } + return invokePP(_ctx, _width, _height, imageFlags, __functionAddress); + } + + @Nullable + @NativeType("NVGLUframebuffer *") + public static NVGLUFramebufferBGFX nvgluCreateFramebuffer(@NativeType("NVGcontext *") long _ctx, @NativeType("int32_t") int _width, @NativeType("int32_t") int _height, @NativeType("int32_t") int imageFlags) { + long __result = nnvgluCreateFramebuffer(_ctx, _width, _height, imageFlags); + return NVGLUFramebufferBGFX.createSafe(__result); + } + + // --- [ nvgluBindFramebuffer ] --- + + public static void nnvgluBindFramebuffer(long _framebuffer) { + long __functionAddress = Functions.luBindFramebuffer; + invokePV(_framebuffer, __functionAddress); + } + + public static void nvgluBindFramebuffer(@Nullable @NativeType("NVGLUframebuffer *") NVGLUFramebufferBGFX _framebuffer) { + nnvgluBindFramebuffer(memAddressSafe(_framebuffer)); + } + + // --- [ nvgluDeleteFramebuffer ] --- + + public static void nnvgluDeleteFramebuffer(long _framebuffer) { + long __functionAddress = Functions.luDeleteFramebuffer; + invokePV(_framebuffer, __functionAddress); + } + + public static void nvgluDeleteFramebuffer(@NativeType("NVGLUframebuffer *") NVGLUFramebufferBGFX _framebuffer) { + nnvgluDeleteFramebuffer(_framebuffer.address()); + } + + // --- [ nvgluSetViewFramebuffer ] --- + + public static void nnvgluSetViewFramebuffer(short _view_id, long _framebuffer) { + long __functionAddress = Functions.luSetViewFramebuffer; + invokePV(_view_id, _framebuffer, __functionAddress); + } + + public static void nvgluSetViewFramebuffer(@NativeType("bgfx_view_id_t") int _view_id, @NativeType("NVGLUframebuffer *") NVGLUFramebufferBGFX _framebuffer) { + nnvgluSetViewFramebuffer((short)_view_id, _framebuffer.address()); + } + + // --- [ nvgCreateBgfxTexture ] --- + + public static void nvgCreateBgfxTexture(@NativeType("NVGcontext *") long _ctx, @NativeType("bgfx_texture_handle_t") short _id, int _width, int _height, int flags) { + long __functionAddress = Functions.CreateBgfxTexture; + if (CHECKS) { + check(_ctx); + } + invokePV(_ctx, _id, _width, _height, flags, __functionAddress); + } + + // --- [ org_lwjgl_nanovg_setup ] --- + + private static void org_lwjgl_nanovg_setup(@NativeType("void *") long realloc, @NativeType("void *") long free, @NativeType("void *") long nvgCreateInternal, @NativeType("void *") long nvgInternalParams, @NativeType("void *") long nvgDeleteInternal) { + long __functionAddress = Functions.org_lwjgl_nanovg_setup; + if (CHECKS) { + check(realloc); + check(free); + check(nvgCreateInternal); + check(nvgInternalParams); + check(nvgDeleteInternal); + } + invokePPPPPV(realloc, free, nvgCreateInternal, nvgInternalParams, nvgDeleteInternal, __functionAddress); + } + + private static class BGFX { + private static final SharedLibrary library; + + static { + try { + library = (SharedLibrary)Class.forName("org.lwjgl.bgfx.BGFX").getMethod("getLibrary").invoke(null); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + static SharedLibrary getLibrary() { + return library; + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGL2.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGL2.java new file mode 100644 index 000000000..09071184a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGL2.java @@ -0,0 +1,190 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Implementation of the NanoVG API using OpenGL 2.0. */ +public class NanoVGGL2 { + + static { LibNanoVG.initialize(); } + + /** + * Create flags. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_ANTIALIAS ANTIALIAS} - Flag indicating if geometry based anti-aliasing is used (may not be needed when using MSAA).
    • + *
    • {@link #NVG_STENCIL_STROKES STENCIL_STROKES} - + * Flag indicating if strokes should be drawn using stencil buffer. The rendering will be a little slower, but path overlaps (i.e. self-intersecting + * or sharp turns) will be drawn just once. + *
    • + *
    • {@link #NVG_DEBUG DEBUG} - Flag indicating that additional debug checks are done.
    • + *
    + */ + public static final int + NVG_ANTIALIAS = 1<<0, + NVG_STENCIL_STROKES = 1<<1, + NVG_DEBUG = 1<<2; + + /** + * These are additional flags on top of NVGimageFlags. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_IMAGE_NODELETE IMAGE_NODELETE} - Do not delete GL texture handle.
    • + *
    + */ + public static final int NVG_IMAGE_NODELETE = 1<<16; + + protected NanoVGGL2() { + throw new UnsupportedOperationException(); + } + + // --- [ nvglCreateImageFromHandle ] --- + + /** Unsafe version of: {@link #nvglCreateImageFromHandle lCreateImageFromHandle} */ + public static native int nnvglCreateImageFromHandle(long ctx, int textureId, int w, int h, int flags); + + /** + * Creates a NanoVG image from an OpenGL texture. + * + * @param ctx the NanoVG context + * @param textureId the OpenGL texture id + * @param w the image width + * @param h the image height + * @param flags the image flags + * + * @return a handle to the image + */ + public static int nvglCreateImageFromHandle(@NativeType("NVGcontext *") long ctx, @NativeType("GLuint") int textureId, int w, int h, int flags) { + if (CHECKS) { + check(ctx); + } + return nnvglCreateImageFromHandle(ctx, textureId, w, h, flags); + } + + // --- [ nvglImageHandle ] --- + + /** Unsafe version of: {@link #nvglImageHandle lImageHandle} */ + public static native int nnvglImageHandle(long ctx, int image); + + /** + * Returns the OpenGL texture id associated with a NanoVG image. + * + * @param ctx the NanoVG context + * @param image the image handle + */ + @NativeType("GLuint") + public static int nvglImageHandle(@NativeType("NVGcontext *") long ctx, int image) { + if (CHECKS) { + check(ctx); + } + return nnvglImageHandle(ctx, image); + } + + // --- [ nvgCreate ] --- + + /** Unsafe version of: {@link #nvgCreate Create} */ + public static native long nnvgCreate(int flags); + + /** + * Creates a NanoVG context with an OpenGL 2.0 rendering back-end. + * + *

    An OpenGL 2.0+ context must be current in the current thread when this function is called and the returned NanoVG context may only be used in the + * thread in which that OpenGL context is current.

    + * + * @param flags the context flags. One of:
    {@link #NVG_ANTIALIAS ANTIALIAS}{@link #NVG_STENCIL_STROKES STENCIL_STROKES}{@link #NVG_DEBUG DEBUG}
    + */ + @NativeType("NVGcontext *") + public static long nvgCreate(int flags) { + return nnvgCreate(flags); + } + + // --- [ nvgDelete ] --- + + /** Unsafe version of: {@link #nvgDelete Delete} */ + public static native void nnvgDelete(long ctx); + + /** + * Deletes a NanoVG context created with {@link #nvgCreate Create}. + * + * @param ctx the NanoVG context + */ + public static void nvgDelete(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgDelete(ctx); + } + + // --- [ nvgluCreateFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluCreateFramebuffer luCreateFramebuffer} */ + public static native long nnvgluCreateFramebuffer(long ctx, int w, int h, int imageFlags); + + /** + * Creates a framebuffer object to render to. + * + * @param ctx the NanoVG context + * @param w the framebuffer width + * @param h the framebuffer height + * @param imageFlags the image flags + */ + @Nullable + @NativeType("NVGLUframebuffer *") + public static NVGLUFramebuffer nvgluCreateFramebuffer(@NativeType("NVGcontext *") long ctx, int w, int h, int imageFlags) { + if (CHECKS) { + check(ctx); + } + long __result = nnvgluCreateFramebuffer(ctx, w, h, imageFlags); + return NVGLUFramebuffer.createSafe(__result); + } + + // --- [ nvgluBindFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluBindFramebuffer luBindFramebuffer} */ + public static native void nnvgluBindFramebuffer(long ctx, long fb); + + /** + * Binds the framebuffer object associated with the specified {@link NVGLUFramebuffer}. + * + * @param ctx the NanoVG context + * @param fb the framebuffer to bind + */ + public static void nvgluBindFramebuffer(@NativeType("NVGcontext *") long ctx, @Nullable @NativeType("NVGLUframebuffer *") NVGLUFramebuffer fb) { + if (CHECKS) { + check(ctx); + } + nnvgluBindFramebuffer(ctx, memAddressSafe(fb)); + } + + // --- [ nvgluDeleteFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluDeleteFramebuffer luDeleteFramebuffer} */ + public static native void nnvgluDeleteFramebuffer(long ctx, long fb); + + /** + * Deletes an {@link NVGLUFramebuffer}. + * + * @param ctx the NanoVG context + * @param fb the framebuffer to delete + */ + public static void nvgluDeleteFramebuffer(@NativeType("NVGcontext *") long ctx, @NativeType("NVGLUframebuffer *") NVGLUFramebuffer fb) { + if (CHECKS) { + check(ctx); + } + nnvgluDeleteFramebuffer(ctx, fb.address()); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGL3.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGL3.java new file mode 100644 index 000000000..7b9928c88 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGL3.java @@ -0,0 +1,190 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Implementation of the NanoVG API using OpenGL 3.0. */ +public class NanoVGGL3 { + + static { LibNanoVG.initialize(); } + + /** + * Create flags. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_ANTIALIAS ANTIALIAS} - Flag indicating if geometry based anti-aliasing is used (may not be needed when using MSAA).
    • + *
    • {@link #NVG_STENCIL_STROKES STENCIL_STROKES} - + * Flag indicating if strokes should be drawn using stencil buffer. The rendering will be a little slower, but path overlaps (i.e. self-intersecting + * or sharp turns) will be drawn just once. + *
    • + *
    • {@link #NVG_DEBUG DEBUG} - Flag indicating that additional debug checks are done.
    • + *
    + */ + public static final int + NVG_ANTIALIAS = 1<<0, + NVG_STENCIL_STROKES = 1<<1, + NVG_DEBUG = 1<<2; + + /** + * These are additional flags on top of NVGimageFlags. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_IMAGE_NODELETE IMAGE_NODELETE} - Do not delete GL texture handle.
    • + *
    + */ + public static final int NVG_IMAGE_NODELETE = 1<<16; + + protected NanoVGGL3() { + throw new UnsupportedOperationException(); + } + + // --- [ nvglCreateImageFromHandle ] --- + + /** Unsafe version of: {@link #nvglCreateImageFromHandle lCreateImageFromHandle} */ + public static native int nnvglCreateImageFromHandle(long ctx, int textureId, int w, int h, int flags); + + /** + * Creates a NanoVG image from an OpenGL texture. + * + * @param ctx the NanoVG context + * @param textureId the OpenGL texture id + * @param w the image width + * @param h the image height + * @param flags the image flags + * + * @return a handle to the image + */ + public static int nvglCreateImageFromHandle(@NativeType("NVGcontext *") long ctx, @NativeType("GLuint") int textureId, int w, int h, int flags) { + if (CHECKS) { + check(ctx); + } + return nnvglCreateImageFromHandle(ctx, textureId, w, h, flags); + } + + // --- [ nvglImageHandle ] --- + + /** Unsafe version of: {@link #nvglImageHandle lImageHandle} */ + public static native int nnvglImageHandle(long ctx, int image); + + /** + * Returns the OpenGL texture id associated with a NanoVG image. + * + * @param ctx the NanoVG context + * @param image the image handle + */ + @NativeType("GLuint") + public static int nvglImageHandle(@NativeType("NVGcontext *") long ctx, int image) { + if (CHECKS) { + check(ctx); + } + return nnvglImageHandle(ctx, image); + } + + // --- [ nvgCreate ] --- + + /** Unsafe version of: {@link #nvgCreate Create} */ + public static native long nnvgCreate(int flags); + + /** + * Creates a NanoVG context with an OpenGL 3.0 rendering back-end. + * + *

    An OpenGL 3.0+ context must be current in the current thread when this function is called and the returned NanoVG context may only be used in the + * thread in which that OpenGL context is current.

    + * + * @param flags the context flags. One of:
    {@link #NVG_ANTIALIAS ANTIALIAS}{@link #NVG_STENCIL_STROKES STENCIL_STROKES}{@link #NVG_DEBUG DEBUG}
    + */ + @NativeType("NVGcontext *") + public static long nvgCreate(int flags) { + return nnvgCreate(flags); + } + + // --- [ nvgDelete ] --- + + /** Unsafe version of: {@link #nvgDelete Delete} */ + public static native void nnvgDelete(long ctx); + + /** + * Deletes a NanoVG context created with {@link #nvgCreate Create}. + * + * @param ctx the NanoVG context + */ + public static void nvgDelete(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgDelete(ctx); + } + + // --- [ nvgluCreateFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluCreateFramebuffer luCreateFramebuffer} */ + public static native long nnvgluCreateFramebuffer(long ctx, int w, int h, int imageFlags); + + /** + * Creates a framebuffer object to render to. + * + * @param ctx the NanoVG context + * @param w the framebuffer width + * @param h the framebuffer height + * @param imageFlags the image flags + */ + @Nullable + @NativeType("NVGLUframebuffer *") + public static NVGLUFramebuffer nvgluCreateFramebuffer(@NativeType("NVGcontext *") long ctx, int w, int h, int imageFlags) { + if (CHECKS) { + check(ctx); + } + long __result = nnvgluCreateFramebuffer(ctx, w, h, imageFlags); + return NVGLUFramebuffer.createSafe(__result); + } + + // --- [ nvgluBindFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluBindFramebuffer luBindFramebuffer} */ + public static native void nnvgluBindFramebuffer(long ctx, long fb); + + /** + * Binds the framebuffer object associated with the specified {@link NVGLUFramebuffer}. + * + * @param ctx the NanoVG context + * @param fb the framebuffer to bind + */ + public static void nvgluBindFramebuffer(@NativeType("NVGcontext *") long ctx, @Nullable @NativeType("NVGLUframebuffer *") NVGLUFramebuffer fb) { + if (CHECKS) { + check(ctx); + } + nnvgluBindFramebuffer(ctx, memAddressSafe(fb)); + } + + // --- [ nvgluDeleteFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluDeleteFramebuffer luDeleteFramebuffer} */ + public static native void nnvgluDeleteFramebuffer(long ctx, long fb); + + /** + * Deletes an {@link NVGLUFramebuffer}. + * + * @param ctx the NanoVG context + * @param fb the framebuffer to delete + */ + public static void nvgluDeleteFramebuffer(@NativeType("NVGcontext *") long ctx, @NativeType("NVGLUframebuffer *") NVGLUFramebuffer fb) { + if (CHECKS) { + check(ctx); + } + nnvgluDeleteFramebuffer(ctx, fb.address()); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLConfig.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLConfig.java new file mode 100644 index 000000000..dcb2e2309 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLConfig.java @@ -0,0 +1,121 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.nanovg; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import java.lang.reflect.*; + +import static org.lwjgl.system.MemoryUtil.*; + +final class NanoVGGLConfig { + + private NanoVGGLConfig() { + } + + // Use reflection to be able to compile without GL or GLES. + + static void configGL(long pointersAddress) { + config(pointersAddress, getFunctionProvider("org.lwjgl.opengl.GL")); + } + + static void configGLES(long pointersAddress) { + config(pointersAddress, getFunctionProvider("org.lwjgl.opengles.GLES")); + } + + private static FunctionProvider getFunctionProvider(String className) { + try { + Class c = Class.forName(className); + + // verify context is current + Method getCapabilities = c.getMethod("getCapabilities"); + getCapabilities.invoke(null); + + Method getFunctionProvider = c.getMethod("getFunctionProvider"); + return (FunctionProvider)getFunctionProvider.invoke(null); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void config(long pointersAddress, FunctionProvider fp) { + String[] functions = new String[] { + "glActiveTexture", + "glAttachShader", + "glBindAttribLocation", + "glBindBuffer", + "glBindBufferRange", + "glBindFramebuffer", + "glBindRenderbuffer", + "glBindTexture", + "glBindVertexArray", + "glBlendFunc", + "glBlendFuncSeparate", + "glBufferData", + "glCheckFramebufferStatus", + "glColorMask", + "glCompileShader", + "glCreateProgram", + "glCreateShader", + "glCullFace", + "glDeleteBuffers", + "glDeleteFramebuffers", + "glDeleteProgram", + "glDeleteRenderbuffers", + "glDeleteShader", + "glDeleteTextures", + "glDeleteVertexArrays", + "glDetachShader", + "glDisable", + "glDisableVertexAttribArray", + "glDrawArrays", + "glEnable", + "glEnableVertexAttribArray", + "glFinish", + "glFlush", + "glFramebufferRenderbuffer", + "glFramebufferTexture2D", + "glFrontFace", + "glGenBuffers", + "glGenFramebuffers", + "glGenRenderbuffers", + "glGenTextures", + "glGenVertexArrays", + "glGenerateMipmap", + "glGetError", + "glGetIntegerv", + "glGetProgramiv", + "glGetProgramInfoLog", + "glGetShaderiv", + "glGetShaderInfoLog", + "glGetUniformBlockIndex", + "glGetUniformLocation", + "glLinkProgram", + "glPixelStorei", + "glRenderbufferStorage", + "glShaderSource", + "glStencilFunc", + "glStencilMask", + "glStencilOp", + "glStencilOpSeparate", + "glTexImage2D", + "glTexParameteri", + "glTexSubImage2D", + "glUniform1i", + "glUniform2fv", + "glUniform4fv", + "glUniformBlockBinding", + "glUseProgram", + "glVertexAttribPointer" + }; + + PointerBuffer pointers = memPointerBuffer(pointersAddress, functions.length); + for (int i = 0; i < functions.length; i++) { + pointers.put(i, fp.getFunctionAddress(functions[i])); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLES2.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLES2.java new file mode 100644 index 000000000..fcb177a0d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLES2.java @@ -0,0 +1,190 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Implementation of the NanoVG API using OpenGL ES 2.0. */ +public class NanoVGGLES2 { + + static { LibNanoVG.initialize(); } + + /** + * Create flags. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_ANTIALIAS ANTIALIAS} - Flag indicating if geometry based anti-aliasing is used (may not be needed when using MSAA).
    • + *
    • {@link #NVG_STENCIL_STROKES STENCIL_STROKES} - + * Flag indicating if strokes should be drawn using stencil buffer. The rendering will be a little slower, but path overlaps (i.e. self-intersecting + * or sharp turns) will be drawn just once. + *
    • + *
    • {@link #NVG_DEBUG DEBUG} - Flag indicating that additional debug checks are done.
    • + *
    + */ + public static final int + NVG_ANTIALIAS = 1<<0, + NVG_STENCIL_STROKES = 1<<1, + NVG_DEBUG = 1<<2; + + /** + * These are additional flags on top of NVGimageFlags. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_IMAGE_NODELETE IMAGE_NODELETE} - Do not delete GL texture handle.
    • + *
    + */ + public static final int NVG_IMAGE_NODELETE = 1<<16; + + protected NanoVGGLES2() { + throw new UnsupportedOperationException(); + } + + // --- [ nvglCreateImageFromHandle ] --- + + /** Unsafe version of: {@link #nvglCreateImageFromHandle lCreateImageFromHandle} */ + public static native int nnvglCreateImageFromHandle(long ctx, int textureId, int w, int h, int flags); + + /** + * Creates a NanoVG image from an OpenGL texture. + * + * @param ctx the NanoVG context + * @param textureId the OpenGL texture id + * @param w the image width + * @param h the image height + * @param flags the image flags + * + * @return a handle to the image + */ + public static int nvglCreateImageFromHandle(@NativeType("NVGcontext *") long ctx, @NativeType("GLuint") int textureId, int w, int h, int flags) { + if (CHECKS) { + check(ctx); + } + return nnvglCreateImageFromHandle(ctx, textureId, w, h, flags); + } + + // --- [ nvglImageHandle ] --- + + /** Unsafe version of: {@link #nvglImageHandle lImageHandle} */ + public static native int nnvglImageHandle(long ctx, int image); + + /** + * Returns the OpenGL texture id associated with a NanoVG image. + * + * @param ctx the NanoVG context + * @param image the image handle + */ + @NativeType("GLuint") + public static int nvglImageHandle(@NativeType("NVGcontext *") long ctx, int image) { + if (CHECKS) { + check(ctx); + } + return nnvglImageHandle(ctx, image); + } + + // --- [ nvgCreate ] --- + + /** Unsafe version of: {@link #nvgCreate Create} */ + public static native long nnvgCreate(int flags); + + /** + * Creates a NanoVG context with an OpenGL ES 2.0 rendering back-end. + * + *

    An OpenGL ES 2.0+ context must be current in the current thread when this function is called and the returned NanoVG context may only be used in + * the thread in which that OpenGL context is current.

    + * + * @param flags the context flags. One of:
    {@link #NVG_ANTIALIAS ANTIALIAS}{@link #NVG_STENCIL_STROKES STENCIL_STROKES}{@link #NVG_DEBUG DEBUG}
    + */ + @NativeType("NVGcontext *") + public static long nvgCreate(int flags) { + return nnvgCreate(flags); + } + + // --- [ nvgDelete ] --- + + /** Unsafe version of: {@link #nvgDelete Delete} */ + public static native void nnvgDelete(long ctx); + + /** + * Deletes a NanoVG context created with {@link #nvgCreate Create}. + * + * @param ctx the NanoVG context + */ + public static void nvgDelete(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgDelete(ctx); + } + + // --- [ nvgluCreateFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluCreateFramebuffer luCreateFramebuffer} */ + public static native long nnvgluCreateFramebuffer(long ctx, int w, int h, int imageFlags); + + /** + * Creates a framebuffer object to render to. + * + * @param ctx the NanoVG context + * @param w the framebuffer width + * @param h the framebuffer height + * @param imageFlags the image flags + */ + @Nullable + @NativeType("NVGLUframebuffer *") + public static NVGLUFramebuffer nvgluCreateFramebuffer(@NativeType("NVGcontext *") long ctx, int w, int h, int imageFlags) { + if (CHECKS) { + check(ctx); + } + long __result = nnvgluCreateFramebuffer(ctx, w, h, imageFlags); + return NVGLUFramebuffer.createSafe(__result); + } + + // --- [ nvgluBindFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluBindFramebuffer luBindFramebuffer} */ + public static native void nnvgluBindFramebuffer(long ctx, long fb); + + /** + * Binds the framebuffer object associated with the specified {@link NVGLUFramebuffer}. + * + * @param ctx the NanoVG context + * @param fb the framebuffer to bind + */ + public static void nvgluBindFramebuffer(@NativeType("NVGcontext *") long ctx, @Nullable @NativeType("NVGLUframebuffer *") NVGLUFramebuffer fb) { + if (CHECKS) { + check(ctx); + } + nnvgluBindFramebuffer(ctx, memAddressSafe(fb)); + } + + // --- [ nvgluDeleteFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluDeleteFramebuffer luDeleteFramebuffer} */ + public static native void nnvgluDeleteFramebuffer(long ctx, long fb); + + /** + * Deletes an {@link NVGLUFramebuffer}. + * + * @param ctx the NanoVG context + * @param fb the framebuffer to delete + */ + public static void nvgluDeleteFramebuffer(@NativeType("NVGcontext *") long ctx, @NativeType("NVGLUframebuffer *") NVGLUFramebuffer fb) { + if (CHECKS) { + check(ctx); + } + nnvgluDeleteFramebuffer(ctx, fb.address()); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLES3.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLES3.java new file mode 100644 index 000000000..e2be6ecf6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/NanoVGGLES3.java @@ -0,0 +1,190 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Implementation of the NanoVG API using OpenGL ES 3.0. */ +public class NanoVGGLES3 { + + static { LibNanoVG.initialize(); } + + /** + * Create flags. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_ANTIALIAS ANTIALIAS} - Flag indicating if geometry based anti-aliasing is used (may not be needed when using MSAA).
    • + *
    • {@link #NVG_STENCIL_STROKES STENCIL_STROKES} - + * Flag indicating if strokes should be drawn using stencil buffer. The rendering will be a little slower, but path overlaps (i.e. self-intersecting + * or sharp turns) will be drawn just once. + *
    • + *
    • {@link #NVG_DEBUG DEBUG} - Flag indicating that additional debug checks are done.
    • + *
    + */ + public static final int + NVG_ANTIALIAS = 1<<0, + NVG_STENCIL_STROKES = 1<<1, + NVG_DEBUG = 1<<2; + + /** + * These are additional flags on top of NVGimageFlags. + * + *
    Enum values:
    + * + *
      + *
    • {@link #NVG_IMAGE_NODELETE IMAGE_NODELETE} - Do not delete GL texture handle.
    • + *
    + */ + public static final int NVG_IMAGE_NODELETE = 1<<16; + + protected NanoVGGLES3() { + throw new UnsupportedOperationException(); + } + + // --- [ nvglCreateImageFromHandle ] --- + + /** Unsafe version of: {@link #nvglCreateImageFromHandle lCreateImageFromHandle} */ + public static native int nnvglCreateImageFromHandle(long ctx, int textureId, int w, int h, int flags); + + /** + * Creates a NanoVG image from an OpenGL texture. + * + * @param ctx the NanoVG context + * @param textureId the OpenGL texture id + * @param w the image width + * @param h the image height + * @param flags the image flags + * + * @return a handle to the image + */ + public static int nvglCreateImageFromHandle(@NativeType("NVGcontext *") long ctx, @NativeType("GLuint") int textureId, int w, int h, int flags) { + if (CHECKS) { + check(ctx); + } + return nnvglCreateImageFromHandle(ctx, textureId, w, h, flags); + } + + // --- [ nvglImageHandle ] --- + + /** Unsafe version of: {@link #nvglImageHandle lImageHandle} */ + public static native int nnvglImageHandle(long ctx, int image); + + /** + * Returns the OpenGL texture id associated with a NanoVG image. + * + * @param ctx the NanoVG context + * @param image the image handle + */ + @NativeType("GLuint") + public static int nvglImageHandle(@NativeType("NVGcontext *") long ctx, int image) { + if (CHECKS) { + check(ctx); + } + return nnvglImageHandle(ctx, image); + } + + // --- [ nvgCreate ] --- + + /** Unsafe version of: {@link #nvgCreate Create} */ + public static native long nnvgCreate(int flags); + + /** + * Creates a NanoVG context with an OpenGL ES 3.0 rendering back-end. + * + *

    An OpenGL ES 3.0+ context must be current in the current thread when this function is called and the returned NanoVG context may only be used in + * the thread in which that OpenGL context is current.

    + * + * @param flags the context flags. One of:
    {@link #NVG_ANTIALIAS ANTIALIAS}{@link #NVG_STENCIL_STROKES STENCIL_STROKES}{@link #NVG_DEBUG DEBUG}
    + */ + @NativeType("NVGcontext *") + public static long nvgCreate(int flags) { + return nnvgCreate(flags); + } + + // --- [ nvgDelete ] --- + + /** Unsafe version of: {@link #nvgDelete Delete} */ + public static native void nnvgDelete(long ctx); + + /** + * Deletes a NanoVG context created with {@link #nvgCreate Create}. + * + * @param ctx the NanoVG context + */ + public static void nvgDelete(@NativeType("NVGcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nnvgDelete(ctx); + } + + // --- [ nvgluCreateFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluCreateFramebuffer luCreateFramebuffer} */ + public static native long nnvgluCreateFramebuffer(long ctx, int w, int h, int imageFlags); + + /** + * Creates a framebuffer object to render to. + * + * @param ctx the NanoVG context + * @param w the framebuffer width + * @param h the framebuffer height + * @param imageFlags the image flags + */ + @Nullable + @NativeType("NVGLUframebuffer *") + public static NVGLUFramebuffer nvgluCreateFramebuffer(@NativeType("NVGcontext *") long ctx, int w, int h, int imageFlags) { + if (CHECKS) { + check(ctx); + } + long __result = nnvgluCreateFramebuffer(ctx, w, h, imageFlags); + return NVGLUFramebuffer.createSafe(__result); + } + + // --- [ nvgluBindFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluBindFramebuffer luBindFramebuffer} */ + public static native void nnvgluBindFramebuffer(long ctx, long fb); + + /** + * Binds the framebuffer object associated with the specified {@link NVGLUFramebuffer}. + * + * @param ctx the NanoVG context + * @param fb the framebuffer to bind + */ + public static void nvgluBindFramebuffer(@NativeType("NVGcontext *") long ctx, @Nullable @NativeType("NVGLUframebuffer *") NVGLUFramebuffer fb) { + if (CHECKS) { + check(ctx); + } + nnvgluBindFramebuffer(ctx, memAddressSafe(fb)); + } + + // --- [ nvgluDeleteFramebuffer ] --- + + /** Unsafe version of: {@link #nvgluDeleteFramebuffer luDeleteFramebuffer} */ + public static native void nnvgluDeleteFramebuffer(long ctx, long fb); + + /** + * Deletes an {@link NVGLUFramebuffer}. + * + * @param ctx the NanoVG context + * @param fb the framebuffer to delete + */ + public static void nvgluDeleteFramebuffer(@NativeType("NVGcontext *") long ctx, @NativeType("NVGLUframebuffer *") NVGLUFramebuffer fb) { + if (CHECKS) { + check(ctx); + } + nnvgluDeleteFramebuffer(ctx, fb.address()); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/OUI.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/OUI.java new file mode 100644 index 000000000..9363664e9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/OUI.java @@ -0,0 +1,735 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +public class OUI { + + static { LibNanoVG.initialize(); } + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #UI_USERMASK USERMASK} - + * these bits, starting at bit 24, can be safely assigned by the application, e.g. as item types, other event types, drop targets, etc. + * + *

      They can be set and queried using {@link #uiSetFlags SetFlags} and {@link #uiGetFlags GetFlags}.

      + *
    • + *
    • {@link #UI_ANY ANY} - a special mask passed to {@link #uiFindItem FindItem}
    • + *
    + */ + public static final int + UI_USERMASK = 0xFF000000, + UI_ANY = 0xFFFFFFFF; + + /** + * Item states as returned by {@link #uiGetState GetState}. ({@code UIitemState}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #UI_COLD COLD} - the item is inactive
    • + *
    • {@link #UI_HOT HOT} - the item is inactive, but the cursor is hovering over this item
    • + *
    • {@link #UI_ACTIVE ACTIVE} - the item is toggled, activated, focused (depends on item kind)
    • + *
    • {@link #UI_FROZEN FROZEN} - the item is unresponsive
    • + *
    + */ + public static final int + UI_COLD = 0, + UI_HOT = 1, + UI_ACTIVE = 2, + UI_FROZEN = 3; + + /** + * Container flags to pass to {@link #uiSetBox SetBox}. ({@code UIboxFlags}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #UI_ROW ROW} - left to right
    • + *
    • {@link #UI_COLUMN COLUMN} - top to bottom
    • + *
    • {@link #UI_LAYOUT LAYOUT} - free layout
    • + *
    • {@link #UI_FLEX FLEX} - flex model
    • + *
    • {@link #UI_NOWRAP NOWRAP} - single-line
    • + *
    • {@link #UI_WRAP WRAP} - multi-line, wrap left to right
    • + *
    • {@link #UI_START START} - justify-content (start, end, center, space-between) at start of row/column
    • + *
    • {@link #UI_MIDDLE MIDDLE} - at center of row/column
    • + *
    • {@link #UI_END END} - at end of row/column
    • + *
    • {@link #UI_JUSTIFY JUSTIFY} - insert spacing to stretch across whole row/column
    • + *
    + */ + public static final int + UI_ROW = 0x002, + UI_COLUMN = 0x003, + UI_LAYOUT = 0x000, + UI_FLEX = 0x002, + UI_NOWRAP = 0x000, + UI_WRAP = 0x004, + UI_START = 0x008, + UI_MIDDLE = 0x000, + UI_END = 0x010, + UI_JUSTIFY = 0x018; + + /** + * Child layout flags to pass to {@link #uiSetLayout SetLayout}. ({@code UIlayoutFlags}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #UI_LEFT LEFT} - anchor to left item or left side of parent
    • + *
    • {@link #UI_TOP TOP} - anchor to top item or top side of parent
    • + *
    • {@link #UI_RIGHT RIGHT} - anchor to right item or right side of parent
    • + *
    • {@link #UI_DOWN DOWN} - anchor to bottom item or bottom side of parent
    • + *
    • {@link #UI_HFILL HFILL} - anchor to both left and right item or parent borders
    • + *
    • {@link #UI_VFILL VFILL} - anchor to both top and bottom item or parent borders
    • + *
    • {@link #UI_HCENTER HCENTER} - center horizontally, with left margin as offset
    • + *
    • {@link #UI_VCENTER VCENTER} - center vertically, with top margin as offset
    • + *
    • {@link #UI_CENTER CENTER} - center in both directions, with left/top margin as offset
    • + *
    • {@link #UI_FILL FILL} - anchor to all four directions
    • + *
    • {@link #UI_BREAK BREAK} - + * when wrapping, put this element on a new line. + * + *

      Wrapping layout code auto-inserts {@code UI_BREAK} flags, drawing routines can read them with {@link #uiGetLayout GetLayout}.

      + *
    • + *
    + */ + public static final int + UI_LEFT = 0x020, + UI_TOP = 0x040, + UI_RIGHT = 0x080, + UI_DOWN = 0x100, + UI_HFILL = 0x0a0, + UI_VFILL = 0x140, + UI_HCENTER = 0x000, + UI_VCENTER = 0x000, + UI_CENTER = 0x000, + UI_FILL = 0x1e0, + UI_BREAK = 0x200; + + /** + * Event flags. ({@code UIevent}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #UI_BUTTON0_DOWN BUTTON0_DOWN} - on button 0 down
    • + *
    • {@link #UI_BUTTON0_UP BUTTON0_UP} - on button 0 up when this event has a handler, {@link #uiGetState GetState} will return {@link #UI_ACTIVE ACTIVE} as long as button 0 is down
    • + *
    • {@link #UI_BUTTON0_HOT_UP BUTTON0_HOT_UP} - + * on button 0 up while item is hovered when this event has a handler, {@link #uiGetState GetState} will return {@link #UI_ACTIVE ACTIVE} when the cursor is hovering the items + * rectangle; this is the behavior expected for buttons + *
    • + *
    • {@link #UI_BUTTON0_CAPTURE BUTTON0_CAPTURE} - item is being captured (button 0 constantly pressed); when this event has a handler, {@link #uiGetState GetState} will return {@link #UI_ACTIVE ACTIVE} as long as button 0 is down
    • + *
    • {@link #UI_BUTTON2_DOWN BUTTON2_DOWN} - on button 2 down (right mouse button, usually triggers context menu)
    • + *
    • {@link #UI_SCROLL SCROLL} - item has received a scrollwheel event the accumulated wheel offset can be queried with {@link #uiGetScroll GetScroll}
    • + *
    • {@link #UI_KEY_DOWN KEY_DOWN} - item is focused and has received a key-down event the respective key can be queried using {@link #uiGetKey GetKey} and {@link #uiGetModifier GetModifier}
    • + *
    • {@link #UI_KEY_UP KEY_UP} - item is focused and has received a key-up event the respective key can be queried using {@link #uiGetKey GetKey} and {@link #uiGetModifier GetModifier}
    • + *
    • {@link #UI_CHAR CHAR} - item is focused and has received a character event the respective character can be queried using {@link #uiGetKey GetKey}
    • + *
    + */ + public static final int + UI_BUTTON0_DOWN = 0x0400, + UI_BUTTON0_UP = 0x0800, + UI_BUTTON0_HOT_UP = 0x1000, + UI_BUTTON0_CAPTURE = 0x2000, + UI_BUTTON2_DOWN = 0x4000, + UI_SCROLL = 0x8000, + UI_KEY_DOWN = 0x10000, + UI_KEY_UP = 0x20000, + UI_CHAR = 0x40000; + + protected OUI() { + throw new UnsupportedOperationException(); + } + + // --- [ uiCreateContext ] --- + + /** + * Creates a new UI context; call {@link #uiMakeCurrent MakeCurrent} to make this context the current context. + * + *

    The context is managed by the client and must be released using {@link #uiDestroyContext DestroyContext}.

    + * + * @param item_capacity the maximum number of items that can be declared. 4096 is a good starting value. + * @param buffer_capacity the maximum total size of bytes that can be allocated using {@link #uiAllocHandle AllocHandle}; you may pass 0 if you don't need to allocate handles. {@code (1<<20)} + * is a good starting value. + */ + @NativeType("UIcontext *") + public static native long uiCreateContext(@NativeType("unsigned int") int item_capacity, @NativeType("unsigned int") int buffer_capacity); + + // --- [ uiMakeCurrent ] --- + + /** Selects an UI context as the current context; a context must always be selected before using any of the other UI functions. */ + public static native void uiMakeCurrent(@NativeType("UIcontext *") long ctx); + + // --- [ uiDestroyContext ] --- + + /** Unsafe version of: {@link #uiDestroyContext DestroyContext} */ + public static native void nuiDestroyContext(long ctx); + + /** Releases the memory of an UI context created with {@link #uiCreateContext CreateContext}; if the context is the current context, the current context will be set to {@code NULL}. */ + public static void uiDestroyContext(@NativeType("UIcontext *") long ctx) { + if (CHECKS) { + check(ctx); + } + nuiDestroyContext(ctx); + } + + // --- [ uiGetContext ] --- + + /** Returns the currently selected context or {@code NULL}. */ + @NativeType("UIcontext *") + public static native long uiGetContext(); + + // --- [ uiSetCursor ] --- + + /** Sets the current cursor position (usually belonging to a mouse) to the screen coordinates at {@code (x,y)}. */ + public static native void uiSetCursor(int x, int y); + + // --- [ uiGetCursor ] --- + + /** Unsafe version of: {@link #uiGetCursor GetCursor} */ + public static native void nuiGetCursor(long __result); + + /** Returns the current cursor position in screen coordinates as set by {@link #uiSetCursor SetCursor}. */ + @NativeType("UIvec2") + public static UIVec2 uiGetCursor(@NativeType("UIvec2") UIVec2 __result) { + nuiGetCursor(__result.address()); + return __result; + } + + // --- [ uiGetCursorDelta ] --- + + /** Unsafe version of: {@link #uiGetCursorDelta GetCursorDelta} */ + public static native void nuiGetCursorDelta(long __result); + + /** Returns the offset of the cursor relative to the last call to {@link #uiProcess Process}. */ + @NativeType("UIvec2") + public static UIVec2 uiGetCursorDelta(@NativeType("UIvec2") UIVec2 __result) { + nuiGetCursorDelta(__result.address()); + return __result; + } + + // --- [ uiGetCursorStart ] --- + + /** Unsafe version of: {@link #uiGetCursorStart GetCursorStart} */ + public static native void nuiGetCursorStart(long __result); + + /** Returns the beginning point of a drag operation. */ + @NativeType("UIvec2") + public static UIVec2 uiGetCursorStart(@NativeType("UIvec2") UIVec2 __result) { + nuiGetCursorStart(__result.address()); + return __result; + } + + // --- [ uiGetCursorStartDelta ] --- + + /** Unsafe version of: {@link #uiGetCursorStartDelta GetCursorStartDelta} */ + public static native void nuiGetCursorStartDelta(long __result); + + /** Returns the offset of the cursor relative to the beginning point of a drag operation. */ + @NativeType("UIvec2") + public static UIVec2 uiGetCursorStartDelta(@NativeType("UIvec2") UIVec2 __result) { + nuiGetCursorStartDelta(__result.address()); + return __result; + } + + // --- [ uiSetButton ] --- + + /** Unsafe version of: {@link #uiSetButton SetButton} */ + public static native void nuiSetButton(int button, int mod, int enabled); + + /** + * Sets a mouse or gamepad button as pressed/released button is in the range {@code 0..63} and maps to an application defined input source. + * + * @param mod an application defined set of flags for modifier keys + * @param enabled is 1 for pressed, 0 for released + */ + public static void uiSetButton(@NativeType("unsigned int") int button, @NativeType("unsigned int") int mod, @NativeType("int") boolean enabled) { + nuiSetButton(button, mod, enabled ? 1 : 0); + } + + // --- [ uiGetButton ] --- + + /** Unsafe version of: {@link #uiGetButton GetButton} */ + public static native int nuiGetButton(int button); + + /** + * Returns the current state of an application dependent input button as set by {@link #uiSetButton SetButton}. + * + * @return 1 if the button has been set to pressed, 0 for released + */ + @NativeType("int") + public static boolean uiGetButton(@NativeType("unsigned int") int button) { + return nuiGetButton(button) != 0; + } + + // --- [ uiGetClicks ] --- + + /** Returns the number of chained clicks; 1 is a single click, 2 is a double click, etc. */ + public static native int uiGetClicks(); + + // --- [ uiSetKey ] --- + + /** Unsafe version of: {@link #uiSetKey SetKey} */ + public static native void nuiSetKey(int key, int mod, int enabled); + + /** + * Sets a key as down/up; the key can be any application defined {@code keycode}. + * + *

    All key events are being buffered until the next call to {@link #uiProcess Process}.

    + * + * @param mod an application defined set of flags for modifier keys + * @param enabled 1 for key down, 0 for key up + */ + public static void uiSetKey(@NativeType("unsigned int") int key, @NativeType("unsigned int") int mod, @NativeType("int") boolean enabled) { + nuiSetKey(key, mod, enabled ? 1 : 0); + } + + // --- [ uiSetChar ] --- + + /** + * Sends a single character for text input; the character is usually in the unicode range, but can be application defined. + * + *

    All char events are being buffered until the next call to {@link #uiProcess Process}.

    + */ + public static native void uiSetChar(@NativeType("unsigned int") int value); + + // --- [ uiSetScroll ] --- + + /** + * Accumulates scroll wheel offsets for the current frame. + * + *

    All offsets are being accumulated until the next call to {@link #uiProcess Process}.

    + */ + public static native void uiSetScroll(int x, int y); + + // --- [ uiGetScroll ] --- + + /** Unsafe version of: {@link #uiGetScroll GetScroll} */ + public static native void nuiGetScroll(long __result); + + /** Returns the currently accumulated scroll wheel offsets for this frame */ + @NativeType("UIvec2") + public static UIVec2 uiGetScroll(@NativeType("UIvec2") UIVec2 __result) { + nuiGetScroll(__result.address()); + return __result; + } + + // --- [ uiBeginLayout ] --- + + /** + * Clears the item buffer. + * + *

    {@code uiBeginLayout()} should be called before the first UI declaration for this frame to avoid concatenation of the same UI multiple times. After the + * call, all previously declared item IDs are invalid, and all application dependent context data has been freed.

    + * + *

    {@code uiBeginLayout()} must be followed by {@link #uiEndLayout EndLayout}.

    + */ + public static native void uiBeginLayout(); + + // --- [ uiEndLayout ] --- + + /** + * Layout all added items starting from the root item 0. + * + *

    After calling {@code uiEndLayout()}, no further modifications to the item tree should be done until the next call to {@link #uiBeginLayout BeginLayout}. It is safe to + * immediately draw the items after a call to {@code uiEndLayout()}.

    + * + *

    This is an {@code O(N)} operation for {@code N = number of declared items}.

    + */ + public static native void uiEndLayout(); + + // --- [ uiUpdateHotItem ] --- + + /** Updates the current hot item; this only needs to be called if items are kept for more than one frame and {@link #uiEndLayout EndLayout} is not called. */ + public static native void uiUpdateHotItem(); + + // --- [ uiProcess ] --- + + /** + * Updates the internal state according to the current cursor position and button states, and call all registered handlers. + * + *

    No further modifications to the item tree should be done until the next call to {@link #uiBeginLayout BeginLayout}. Items should be drawn before a call to + * {@code uiProcess()}.

    + * + *

    This is an {@code O(N)} operation for {@code N = number of declared items}.

    + * + * @param timestamp the time in milliseconds relative to the last call to {@code uiProcess()} and is used to estimate the threshold for double-clicks after calling + * {@code uiProcess()}. + */ + public static native void uiProcess(int timestamp); + + // --- [ uiClearState ] --- + + /** + * Resets the currently stored hot/active etc. handles. + * + *

    This should be called when a re-declaration of the UI changes the item indices, to avoid state related glitches because item identities have changed.

    + */ + public static native void uiClearState(); + + // --- [ uiItem ] --- + + /** Creates a new UI item and return the new item's ID. */ + public static native int uiItem(); + + // --- [ uiSetFrozen ] --- + + /** Unsafe version of: {@link #uiSetFrozen SetFrozen} */ + public static native void nuiSetFrozen(int item, int enable); + + /** + * Sets an items state to frozen. + * + *

    The UI will not recurse into frozen items when searching for hot or active items; subsequently, frozen items and their child items will not cause mouse + * event notifications. The frozen state is not applied recursively; {@link #uiGetState GetState} will report {@link #UI_COLD COLD} for child items. Upon encountering a frozen item, the + * drawing routine needs to handle rendering of child items appropriately.

    + */ + public static void uiSetFrozen(int item, @NativeType("int") boolean enable) { + nuiSetFrozen(item, enable ? 1 : 0); + } + + // --- [ uiSetHandle ] --- + + /** + * Sets the application-dependent handle of an item. + * + * @param handle an application defined 64-bit handle. If {@code NULL}, the item will not be interactive. + */ + public static native void uiSetHandle(int item, @NativeType("void *") long handle); + + // --- [ uiAllocHandle ] --- + + /** Unsafe version of: {@link #uiAllocHandle AllocHandle} */ + public static native long nuiAllocHandle(int item, int size); + + /** + * Allocates space for application-dependent context data and assign it as the handle to the item. + * + *

    The memory of the pointer is managed by the UI context and released upon the next call to {@link #uiBeginLayout BeginLayout}.

    + */ + @Nullable + @NativeType("void *") + public static ByteBuffer uiAllocHandle(int item, @NativeType("unsigned int") int size) { + long __result = nuiAllocHandle(item, size); + return memByteBufferSafe(__result, size); + } + + // --- [ uiSetHandler ] --- + + /** Unsafe version of: {@link #uiSetHandler SetHandler} */ + public static native void nuiSetHandler(long handler); + + /** + * Sets the global handler callback for interactive items. + * + *

    The handler will be called for each item whose event flags are set using {@link #uiSetEvents SetEvents}.

    + */ + public static void uiSetHandler(@NativeType("UIhandler") UIHandlerI handler) { + nuiSetHandler(handler.address()); + } + + // --- [ uiSetEvents ] --- + + /** @param flags designates for which events the handler should be called. One or more of:
    {@link #UI_BUTTON0_DOWN BUTTON0_DOWN}{@link #UI_BUTTON0_UP BUTTON0_UP}{@link #UI_BUTTON0_HOT_UP BUTTON0_HOT_UP}{@link #UI_BUTTON0_CAPTURE BUTTON0_CAPTURE}{@link #UI_BUTTON2_DOWN BUTTON2_DOWN}{@link #UI_SCROLL SCROLL}{@link #UI_KEY_DOWN KEY_DOWN}{@link #UI_KEY_UP KEY_UP}
    {@link #UI_CHAR CHAR}
    */ + public static native void uiSetEvents(int item, @NativeType("unsigned int") int flags); + + // --- [ uiSetFlags ] --- + + /** @param flags a user-defined set of flags defined by {@link #UI_USERMASK USERMASK} */ + public static native void uiSetFlags(int item, @NativeType("unsigned int") int flags); + + // --- [ uiInsert ] --- + + /** + * Assigns an item to a container. + * + *

    An item ID of 0 refers to the root item. The function searches for the last item and calls {@link #uiAppend Append} on it, which is an {@code O(N)} operation for + * {@code N} siblings. It is usually more efficient to call {@code uiInser}t() for the first child, then chain additional siblings using + * {@code uiAppend()}.

    + * + * @return the child item ID if the container has already added items + */ + public static native int uiInsert(int item, int child); + + // --- [ uiAppend ] --- + + /** + * Assigns an item to the same container as another item. + * + * @param sibling inserted after {@code item} + */ + public static native int uiAppend(int item, int sibling); + + // --- [ uiInsertBack ] --- + + /** + * Inserts child into container item like {@link #uiInsert Insert}, but prepend it to the first child item, effectively putting it in the background. + * + *

    It is efficient to call {@code uiInsertBack()} repeatedly in cases where drawing or layout order doesn't matter.

    + */ + public static native int uiInsertBack(int item, int child); + + // --- [ uiInsertFront ] --- + + /** Same as {@link #uiInsert Insert}. */ + public static native int uiInsertFront(int item, int child); + + // --- [ uiSetSize ] --- + + /** + * Sets the size of the item. + * + *

    A size of 0 indicates the dimension to be dynamic; if the size is set, the item can not expand beyond that size.

    + */ + public static native void uiSetSize(int item, int w, int h); + + // --- [ uiSetLayout ] --- + + /** + * Sets the anchoring behavior of the item to one or multiple {@code UIlayoutFlags}. + * + * @param flags one or more of:
    {@link #UI_LEFT LEFT}{@link #UI_TOP TOP}{@link #UI_RIGHT RIGHT}{@link #UI_DOWN DOWN}{@link #UI_HFILL HFILL}{@link #UI_VFILL VFILL}{@link #UI_HCENTER HCENTER}{@link #UI_VCENTER VCENTER}{@link #UI_CENTER CENTER}{@link #UI_FILL FILL}{@link #UI_BREAK BREAK}
    + */ + public static native void uiSetLayout(int item, @NativeType("unsigned int") int flags); + + // --- [ uiSetBox ] --- + + /** + * Sets the box model behavior of the item to one or multiple {@code UIboxFlags}. + * + * @param flags one or more of:
    {@link #UI_ROW ROW}{@link #UI_COLUMN COLUMN}{@link #UI_LAYOUT LAYOUT}{@link #UI_FLEX FLEX}{@link #UI_NOWRAP NOWRAP}{@link #UI_WRAP WRAP}{@link #UI_START START}{@link #UI_MIDDLE MIDDLE}{@link #UI_END END}{@link #UI_JUSTIFY JUSTIFY}
    + */ + public static native void uiSetBox(int item, @NativeType("unsigned int") int flags); + + // --- [ uiSetMargins ] --- + + /** Unsafe version of: {@link #uiSetMargins SetMargins} */ + public static native void nuiSetMargins(int item, short l, short t, short r, short b); + + /** + * Sets the left, top, right and bottom margins of an item. + * + *

    When the item is anchored to the parent or another item, the margin controls the distance from the neighboring element.

    + */ + public static void uiSetMargins(int item, @NativeType("short") int l, @NativeType("short") int t, @NativeType("short") int r, @NativeType("short") int b) { + nuiSetMargins(item, (short)l, (short)t, (short)r, (short)b); + } + + // --- [ uiFocus ] --- + + /** + * Sets item as recipient of all keyboard events. + * + * @param item if -1, no item will be focused + */ + public static native void uiFocus(int item); + + // --- [ uiFirstChild ] --- + + /** + * Returns the first child item of a container item. + * + *

    If the item is not a container or does not contain any items, -1 is returned.

    + * + * @param item if 0, the first child item of the root item will be returned + */ + public static native int uiFirstChild(int item); + + // --- [ uiNextSibling ] --- + + /** + * Returns an items next sibling in the list of the parent containers children. + * + *

    If {@code item} is 0 or the item is the last child item, -1 will be returned.

    + */ + public static native int uiNextSibling(int item); + + // --- [ uiGetItemCount ] --- + + /** Returns the total number of allocated items */ + public static native int uiGetItemCount(); + + // --- [ uiGetAllocSize ] --- + + /** Returns the total bytes that have been allocated by {@link #uiAllocHandle AllocHandle} */ + @NativeType("unsigned int") + public static native int uiGetAllocSize(); + + // --- [ uiGetState ] --- + + /** + * Returns the current state of the item. + * + *

    This state is only valid after a call to {@link #uiProcess Process}. The returned value is one of {@link #UI_COLD COLD}, {@link #UI_HOT HOT}, {@link #UI_ACTIVE ACTIVE}, {@link #UI_FROZEN FROZEN}.

    + */ + @NativeType("UIitemState") + public static native int uiGetState(int item); + + // --- [ uiGetHandle ] --- + + /** Returns the application-dependent handle of the item as passed to {@link #uiSetHandle SetHandle} or {@link #uiAllocHandle AllocHandle}. */ + @NativeType("void *") + public static native long uiGetHandle(int item); + + // --- [ uiGetHotItem ] --- + + /** Returns the item that is currently under the cursor or -1 for none. */ + public static native int uiGetHotItem(); + + // --- [ uiGetFocusedItem ] --- + + /** Returns the item that is currently focused or -1 for none. */ + public static native int uiGetFocusedItem(); + + // --- [ uiFindItem ] --- + + /** + * Returns the topmost item containing absolute location {@code (x,y)}, starting with {@code item} as parent, using a set of flags and masks as filter. + * + *

    If both {@code flags} and {@code mask} are {@link #UI_ANY ANY}, the first topmost item is returned. If {@code mask} is {@link #UI_ANY ANY}, the first topmost item matching + * any of flags is returned. otherwise the first item matching {@code (item.flags & flags) == mask} is returned. You may combine box, layout, + * event and user flags. Frozen items will always be ignored.

    + */ + public static native int uiFindItem(int item, int x, int y, @NativeType("unsigned int") int flags, @NativeType("unsigned int") int mask); + + // --- [ uiGetHandler ] --- + + /** Unsafe version of: {@link #uiGetHandler GetHandler} */ + public static native long nuiGetHandler(); + + /** Returns the handler callback as passed to {@link #uiSetHandler SetHandler} */ + @Nullable + @NativeType("UIhandler") + public static UIHandler uiGetHandler() { + return UIHandler.createSafe(nuiGetHandler()); + } + + // --- [ uiGetEvents ] --- + + /** Returns the event flags for an item as passed to {@link #uiSetEvents SetEvents} */ + @NativeType("unsigned int") + public static native int uiGetEvents(int item); + + // --- [ uiGetFlags ] --- + + /** Returns the user-defined flags for an item as passed to {@link #uiSetFlags SetFlags} */ + @NativeType("unsigned int") + public static native int uiGetFlags(int item); + + // --- [ uiGetKey ] --- + + /** When handling a {@code KEY_DOWN/KEY_UP} event: the key that triggered this event. */ + @NativeType("unsigned int") + public static native int uiGetKey(); + + // --- [ uiGetModifier ] --- + + /** When handling a keyboard or mouse event: the active modifier keys. */ + @NativeType("unsigned int") + public static native int uiGetModifier(); + + // --- [ uiGetRect ] --- + + /** Unsafe version of: {@link #uiGetRect GetRect} */ + public static native void nuiGetRect(int item, long __result); + + /** + * Returns the items layout rectangle in absolute coordinates. + * + *

    If {@code uiGetRect()} is called before {@link #uiEndLayout EndLayout}, the values of the returned rectangle are undefined.

    + */ + @NativeType("UIrect") + public static UIRect uiGetRect(int item, @NativeType("UIrect") UIRect __result) { + nuiGetRect(item, __result.address()); + return __result; + } + + // --- [ uiContains ] --- + + /** Unsafe version of: {@link #uiContains Contains} */ + public static native int nuiContains(int item, int x, int y); + + /** Returns 1 if an items absolute rectangle contains a given coordinate, otherwise 0. */ + @NativeType("int") + public static boolean uiContains(int item, int x, int y) { + return nuiContains(item, x, y) != 0; + } + + // --- [ uiGetWidth ] --- + + /** Returns the width of the item as set by {@link #uiSetSize SetSize}. */ + public static native int uiGetWidth(int item); + + // --- [ uiGetHeight ] --- + + /** Return the height of the item as set by {@link #uiSetSize SetSize}. */ + public static native int uiGetHeight(int item); + + // --- [ uiGetLayout ] --- + + /** Returns the anchoring behavior as set by {@link #uiSetLayout SetLayout}. */ + @NativeType("unsigned int") + public static native int uiGetLayout(int item); + + // --- [ uiGetBox ] --- + + /** Returns the box model as set by {@link #uiSetBox SetBox}. */ + @NativeType("unsigned int") + public static native int uiGetBox(int item); + + // --- [ uiGetMarginLeft ] --- + + /** Returns the left margin of the item as set with {@link #uiSetMargins SetMargins}. */ + public static native short uiGetMarginLeft(int item); + + // --- [ uiGetMarginTop ] --- + + /** Returns the top margin of the item as set with {@link #uiSetMargins SetMargins}. */ + public static native short uiGetMarginTop(int item); + + // --- [ uiGetMarginRight ] --- + + /** Returns the right margin of the item as set with {@link #uiSetMargins SetMargins}. */ + public static native short uiGetMarginRight(int item); + + // --- [ uiGetMarginDown ] --- + + /** Returns the bottom margin of the item as set with {@link #uiSetMargins SetMargins}. */ + public static native short uiGetMarginDown(int item); + + // --- [ uiRecoverItem ] --- + + /** + * When {@link #uiBeginLayout BeginLayout} is called, the most recently declared items are retained. When {@link #uiEndLayout EndLayout} completes, it matches the old item hierarchy to the new + * one and attempts to map old items to new items as well as possible. When passed an item Id from the previous frame, {@code uiRecoverItem()} returns the + * item's new assumed Id, or -1 if the item could not be mapped. It is valid to pass -1 as item. + */ + public static native int uiRecoverItem(int olditem); + + // --- [ uiRemapItem ] --- + + /** + * In cases where it is important to recover old state over changes in the view, and the built-in remapping fails, the UI declaration can manually remap + * old items to new IDs in cases where e.g. the previous item ID has been temporarily saved; {@code uiRemapItem()} would then be called after creating the + * new item using {@link #uiItem Item}. + */ + public static native void uiRemapItem(int olditem, int newitem); + + // --- [ uiGetLastItemCount ] --- + + /** Returns the number if items that have been allocated in the last frame. */ + public static native int uiGetLastItemCount(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIHandler.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIHandler.java new file mode 100644 index 000000000..7b511ca52 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIHandler.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be passed to the {@link OUI#uiSetHandler SetHandler} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     int item,
    + *     UIevent event
    + * )
    + */ +public abstract class UIHandler extends Callback implements UIHandlerI { + + /** + * Creates a {@code UIHandler} instance from the specified function pointer. + * + * @return the new {@code UIHandler} + */ + public static UIHandler create(long functionPointer) { + UIHandlerI instance = Callback.get(functionPointer); + return instance instanceof UIHandler + ? (UIHandler)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static UIHandler createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code UIHandler} instance that delegates to the specified {@code UIHandlerI} instance. */ + public static UIHandler create(UIHandlerI instance) { + return instance instanceof UIHandler + ? (UIHandler)instance + : new Container(instance.address(), instance); + } + + protected UIHandler() { + super(CIF); + } + + UIHandler(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends UIHandler { + + private final UIHandlerI delegate; + + Container(long functionPointer, UIHandlerI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(int item, int event) { + delegate.invoke(item, event); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIHandlerI.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIHandlerI.java new file mode 100644 index 000000000..221df3ce6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIHandlerI.java @@ -0,0 +1,50 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link OUI#uiSetHandler SetHandler} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     int item,
    + *     UIevent event
    + * )
    + */ +@FunctionalInterface +@NativeType("UIhandler") +public interface UIHandlerI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_sint32, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetInt(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)) + ); + } + + /** handler callback; event is one of UI_EVENT_* */ + void invoke(int item, @NativeType("UIevent") int event); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIRect.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIRect.java new file mode 100644 index 000000000..832476eff --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIRect.java @@ -0,0 +1,370 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * layout rectangle + * + *

    Layout

    + * + *
    
    + * struct UIrect {
    + *     union {
    + *         int v[4];
    + *         struct {
    + *             int x;
    + *             int y;
    + *             int w;
    + *             int h;
    + *         };
    + *     };
    + * }
    + */ +@NativeType("struct UIrect") +public class UIRect extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + V, + X, + Y, + W, + H; + + static { + Layout layout = __struct( + __union( + __array(4, 4), + __struct( + __member(4), + __member(4), + __member(4), + __member(4) + ) + ) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + V = layout.offsetof(1); + X = layout.offsetof(3); + Y = layout.offsetof(4); + W = layout.offsetof(5); + H = layout.offsetof(6); + } + + protected UIRect(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected UIRect create(long address, @Nullable ByteBuffer container) { + return new UIRect(address, container); + } + + /** + * Creates a {@code UIRect} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public UIRect(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link IntBuffer} view of the {@code v} field. */ + @NativeType("int[4]") + public IntBuffer v() { return nv(address()); } + /** @return the value at the specified index of the {@code v} field. */ + public int v(int index) { return nv(address(), index); } + /** @return the value of the {@code x} field. */ + public int x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return ny(address()); } + /** @return the value of the {@code w} field. */ + public int w() { return nw(address()); } + /** @return the value of the {@code h} field. */ + public int h() { return nh(address()); } + + /** Copies the specified {@link IntBuffer} to the {@code v} field. */ + public UIRect v(@NativeType("int[4]") IntBuffer value) { nv(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code v} field. */ + public UIRect v(int index, int value) { nv(address(), index, value); return this; } + /** Sets the specified value to the {@code x} field. */ + public UIRect x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public UIRect y(int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@code w} field. */ + public UIRect w(int value) { nw(address(), value); return this; } + /** Sets the specified value to the {@code h} field. */ + public UIRect h(int value) { nh(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public UIRect set(UIRect src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code UIRect} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static UIRect malloc() { + return new UIRect(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code UIRect} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static UIRect calloc() { + return new UIRect(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code UIRect} instance allocated with {@link BufferUtils}. */ + public static UIRect create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new UIRect(memAddress(container), container); + } + + /** Returns a new {@code UIRect} instance for the specified memory address. */ + public static UIRect create(long address) { + return new UIRect(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static UIRect createSafe(long address) { + return address == NULL ? null : new UIRect(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static UIRect mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static UIRect callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static UIRect mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static UIRect callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code UIRect} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static UIRect malloc(MemoryStack stack) { + return new UIRect(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code UIRect} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static UIRect calloc(MemoryStack stack) { + return new UIRect(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #v}. */ + public static IntBuffer nv(long struct) { return memIntBuffer(struct + UIRect.V, 4); } + /** Unsafe version of {@link #v(int) v}. */ + public static int nv(long struct, int index) { + return UNSAFE.getInt(null, struct + UIRect.V + check(index, 4) * 4); + } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + UIRect.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + UIRect.Y); } + /** Unsafe version of {@link #w}. */ + public static int nw(long struct) { return UNSAFE.getInt(null, struct + UIRect.W); } + /** Unsafe version of {@link #h}. */ + public static int nh(long struct) { return UNSAFE.getInt(null, struct + UIRect.H); } + + /** Unsafe version of {@link #v(IntBuffer) v}. */ + public static void nv(long struct, IntBuffer value) { + if (CHECKS) { checkGT(value, 4); } + memCopy(memAddress(value), struct + UIRect.V, value.remaining() * 4); + } + /** Unsafe version of {@link #v(int, int) v}. */ + public static void nv(long struct, int index, int value) { + UNSAFE.putInt(null, struct + UIRect.V + check(index, 4) * 4, value); + } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + UIRect.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + UIRect.Y, value); } + /** Unsafe version of {@link #w(int) w}. */ + public static void nw(long struct, int value) { UNSAFE.putInt(null, struct + UIRect.W, value); } + /** Unsafe version of {@link #h(int) h}. */ + public static void nh(long struct, int value) { UNSAFE.putInt(null, struct + UIRect.H, value); } + + // ----------------------------------- + + /** An array of {@link UIRect} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final UIRect ELEMENT_FACTORY = UIRect.create(-1L); + + /** + * Creates a new {@code UIRect.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link UIRect#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected UIRect getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link IntBuffer} view of the {@code v} field. */ + @NativeType("int[4]") + public IntBuffer v() { return UIRect.nv(address()); } + /** @return the value at the specified index of the {@code v} field. */ + public int v(int index) { return UIRect.nv(address(), index); } + /** @return the value of the {@code x} field. */ + public int x() { return UIRect.nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return UIRect.ny(address()); } + /** @return the value of the {@code w} field. */ + public int w() { return UIRect.nw(address()); } + /** @return the value of the {@code h} field. */ + public int h() { return UIRect.nh(address()); } + + /** Copies the specified {@link IntBuffer} to the {@code v} field. */ + public Buffer v(@NativeType("int[4]") IntBuffer value) { UIRect.nv(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code v} field. */ + public Buffer v(int index, int value) { UIRect.nv(address(), index, value); return this; } + /** Sets the specified value to the {@code x} field. */ + public Buffer x(int value) { UIRect.nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public Buffer y(int value) { UIRect.ny(address(), value); return this; } + /** Sets the specified value to the {@code w} field. */ + public Buffer w(int value) { UIRect.nw(address(), value); return this; } + /** Sets the specified value to the {@code h} field. */ + public Buffer h(int value) { UIRect.nh(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIVec2.java b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIVec2.java new file mode 100644 index 000000000..c3f0426ad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/nanovg/UIVec2.java @@ -0,0 +1,338 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.nanovg; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * for cursor positions, mainly + * + *

    Layout

    + * + *
    
    + * struct UIvec2 {
    + *     union {
    + *         int v[2];
    + *         struct {
    + *             int x;
    + *             int y;
    + *         };
    + *     };
    + * }
    + */ +@NativeType("struct UIvec2") +public class UIVec2 extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + V, + X, + Y; + + static { + Layout layout = __struct( + __union( + __array(4, 2), + __struct( + __member(4), + __member(4) + ) + ) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + V = layout.offsetof(1); + X = layout.offsetof(3); + Y = layout.offsetof(4); + } + + protected UIVec2(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected UIVec2 create(long address, @Nullable ByteBuffer container) { + return new UIVec2(address, container); + } + + /** + * Creates a {@code UIVec2} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public UIVec2(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link IntBuffer} view of the {@code v} field. */ + @NativeType("int[2]") + public IntBuffer v() { return nv(address()); } + /** @return the value at the specified index of the {@code v} field. */ + public int v(int index) { return nv(address(), index); } + /** @return the value of the {@code x} field. */ + public int x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return ny(address()); } + + /** Copies the specified {@link IntBuffer} to the {@code v} field. */ + public UIVec2 v(@NativeType("int[2]") IntBuffer value) { nv(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code v} field. */ + public UIVec2 v(int index, int value) { nv(address(), index, value); return this; } + /** Sets the specified value to the {@code x} field. */ + public UIVec2 x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public UIVec2 y(int value) { ny(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public UIVec2 set(UIVec2 src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code UIVec2} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static UIVec2 malloc() { + return new UIVec2(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code UIVec2} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static UIVec2 calloc() { + return new UIVec2(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code UIVec2} instance allocated with {@link BufferUtils}. */ + public static UIVec2 create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new UIVec2(memAddress(container), container); + } + + /** Returns a new {@code UIVec2} instance for the specified memory address. */ + public static UIVec2 create(long address) { + return new UIVec2(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static UIVec2 createSafe(long address) { + return address == NULL ? null : new UIVec2(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static UIVec2 mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static UIVec2 callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static UIVec2 mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static UIVec2 callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code UIVec2} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static UIVec2 malloc(MemoryStack stack) { + return new UIVec2(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code UIVec2} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static UIVec2 calloc(MemoryStack stack) { + return new UIVec2(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #v}. */ + public static IntBuffer nv(long struct) { return memIntBuffer(struct + UIVec2.V, 2); } + /** Unsafe version of {@link #v(int) v}. */ + public static int nv(long struct, int index) { + return UNSAFE.getInt(null, struct + UIVec2.V + check(index, 2) * 4); + } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + UIVec2.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + UIVec2.Y); } + + /** Unsafe version of {@link #v(IntBuffer) v}. */ + public static void nv(long struct, IntBuffer value) { + if (CHECKS) { checkGT(value, 2); } + memCopy(memAddress(value), struct + UIVec2.V, value.remaining() * 4); + } + /** Unsafe version of {@link #v(int, int) v}. */ + public static void nv(long struct, int index, int value) { + UNSAFE.putInt(null, struct + UIVec2.V + check(index, 2) * 4, value); + } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + UIVec2.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + UIVec2.Y, value); } + + // ----------------------------------- + + /** An array of {@link UIVec2} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final UIVec2 ELEMENT_FACTORY = UIVec2.create(-1L); + + /** + * Creates a new {@code UIVec2.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link UIVec2#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected UIVec2 getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link IntBuffer} view of the {@code v} field. */ + @NativeType("int[2]") + public IntBuffer v() { return UIVec2.nv(address()); } + /** @return the value at the specified index of the {@code v} field. */ + public int v(int index) { return UIVec2.nv(address(), index); } + /** @return the value of the {@code x} field. */ + public int x() { return UIVec2.nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return UIVec2.ny(address()); } + + /** Copies the specified {@link IntBuffer} to the {@code v} field. */ + public Buffer v(@NativeType("int[2]") IntBuffer value) { UIVec2.nv(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code v} field. */ + public Buffer v(int index, int value) { UIVec2.nv(address(), index, value); return this; } + /** Sets the specified value to the {@code x} field. */ + public Buffer x(int value) { UIVec2.nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public Buffer y(int value) { UIVec2.ny(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/AL.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/AL.java new file mode 100644 index 000000000..d88a9d961 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/AL.java @@ -0,0 +1,386 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.openal; + +import org.lwjgl.*; +import org.lwjgl.system.*; +import org.lwjgl.system.MemoryUtil; + +import javax.annotation.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.util.*; +import java.util.function.*; + +import static org.lwjgl.openal.AL10.*; +import static org.lwjgl.openal.EXTThreadLocalContext.*; +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * This class must be used before any OpenAL function is called. It has the following responsibilities: + *
      + *
    • Creates instances of {@link ALCapabilities} classes. An {@code ALCapabilities} instance contains flags for functionality that is available in an OpenAL + * context. Internally, it also contains function pointers that are only valid in that specific OpenAL context.
    • + *
    • Maintains thread-local and global state for {@code ALCapabilities} instances, corresponding to OpenAL contexts that are current in those threads and the + * entire process, respectively.
    • + *
    + * + *

    ALCapabilities creation

    + *

    Instances of {@code ALCapabilities} can be created with the {@link #createCapabilities} method. An OpenAL context must be current in the current thread + * or process before it is called. Calling this method is expensive, so {@code ALCapabilities} instances should be cached in user code.

    + * + *

    Thread-local state

    + *

    Before a function for a given OpenAL context can be called, the corresponding {@code ALCapabilities} instance must be made current in the current + * thread or process. The user is also responsible for clearing the current {@code ALCapabilities} instance when the context is destroyed or made current in + * another thread.

    + * + *

    Note that OpenAL contexts are made current process-wide by default. Current thread-local contexts are only available if the + * {@link EXTThreadLocalContext ALC_EXT_thread_local_context} extension is supported by the OpenAL implementation. OpenAL Soft, the implementation + * that LWJGL ships with, supports this extension and performs better when it is used.

    + * + * @see ALC + */ +public final class AL { + + static long alContext; + static ALCdevice alcDevice; + static ALCCapabilities alContextCaps; + static ALCapabilities alCaps; + + private static boolean created_lwjgl2 = false; + + /** + * Creates an OpenAL instance. Using this constructor will cause OpenAL to + * open the device using supplied device argument, and create a context using the context values + * supplied. + * + * @param deviceArguments Arguments supplied to native device + * @param contextFrequency Frequency for mixing output buffer, in units of Hz (Common values include 11025, 22050, and 44100). + * @param contextRefresh Refresh intervalls, in units of Hz. + * @param contextSynchronized Flag, indicating a synchronous context.* + */ + public static void create(String deviceArguments, int contextFrequency, int contextRefresh, boolean contextSynchronized) + throws LWJGLException { + create(deviceArguments, contextFrequency, contextRefresh, contextSynchronized, true); + } + + /** + * @param openDevice Whether to automatically open the device + * @see #create(String, int, int, boolean) + */ + public static void create(String deviceArguments, int contextFrequency, int contextRefresh, boolean contextSynchronized, boolean openDevice) + throws LWJGLException { + if (alContext == MemoryUtil.NULL && openDevice) { + //ALDevice alDevice = ALDevice.create(); + long alDevice = ALC10.alcOpenDevice(deviceArguments); + if (alDevice == MemoryUtil.NULL) { + throw new LWJGLException("Cannot open the device"); + } + + IntBuffer attribs = BufferUtils.createIntBuffer(16); + + attribs.put(ALC10.ALC_FREQUENCY); + attribs.put(contextFrequency); + + attribs.put(ALC10.ALC_REFRESH); + attribs.put(contextRefresh); + + attribs.put(ALC10.ALC_SYNC); + attribs.put(contextSynchronized ? ALC10.ALC_TRUE : ALC10.ALC_FALSE); + + attribs.put(0); + attribs.flip(); + + long contextHandle = ALC10.alcCreateContext(alDevice, attribs); + ALC10.alcMakeContextCurrent(contextHandle); + //alContext = new ALContext(alDevice, contextHandle); + alContext = ALC10.alcCreateContext(contextHandle, (IntBuffer)null); + alContextCaps = ALC.createCapabilities(alContext); + + alCaps = AL.createCapabilities(alContextCaps); + + alcDevice = new ALCdevice(alDevice); + created_lwjgl2 = true; + } + } + + public static void create() throws LWJGLException { + if (alContext == MemoryUtil.NULL) { + //ALDevice alDevice = ALDevice.create(); + long alDevice = ALC10.alcOpenDevice((ByteBuffer) null); + if (alDevice == MemoryUtil.NULL) { + throw new LWJGLException("Cannot open the device"); + } + + IntBuffer attribs = BufferUtils.createIntBuffer(16); + + attribs.put(ALC10.ALC_FREQUENCY); + attribs.put(44100); + + attribs.put(ALC10.ALC_REFRESH); + attribs.put(60); + + attribs.put(ALC10.ALC_SYNC); + attribs.put(ALC10.ALC_FALSE); + + attribs.put(0); + attribs.flip(); + + long contextHandle = ALC10.alcCreateContext(alDevice, attribs); + ALC10.alcMakeContextCurrent(contextHandle); + alContext = ALC10.alcCreateContext(contextHandle, (IntBuffer)null); + alContextCaps = ALC.createCapabilities(alContext); + + alCaps = AL.createCapabilities(alContextCaps); + + alcDevice = new ALCdevice(alDevice); + created_lwjgl2 = true; + } + } + + public static boolean isCreated() { + return created_lwjgl2; + } + + public static ALCdevice getDevice() { + return alcDevice; + } + + @Nullable + private static ALCapabilities processCaps; + + private static final ThreadLocal capabilitiesTLS = new ThreadLocal<>(); + + private static ICD icd = new ICDStatic(); + + private AL() {} + + static void init() { + } + + public static void destroy() { + if (created_lwjgl2) { + ALC10.alcMakeContextCurrent(MemoryUtil.NULL); + ALC10.alcDestroyContext(alContext); + ALC10.alcCloseDevice(alcDevice.device); + alContext = -1; + alcDevice = null; + created_lwjgl2 = false; + } + setCurrentProcess(null); + } + + /** + * Sets the specified {@link ALCapabilities} for the current process-wide OpenAL context. + * + *

    If the current thread had a context current (see {@link #setCurrentThread}), those {@code ALCapabilities} are cleared. Any OpenAL functions called in + * the current thread, or any threads that have no context current, will use the specified {@code ALCapabilities}.

    + * + * @param caps the {@link ALCapabilities} to make current, or null + */ + public static void setCurrentProcess(@Nullable ALCapabilities caps) { + processCaps = caps; + capabilitiesTLS.set(null); // See EXT_thread_local_context, second Q. + icd.set(caps); + } + + /** + * Sets the specified {@link ALCapabilities} for the current OpenAL context in the current thread. + * + *

    Any OpenAL functions called in the current thread will use the specified {@code ALCapabilities}.

    + * + * @param caps the {@link ALCapabilities} to make current, or null + */ + public static void setCurrentThread(@Nullable ALCapabilities caps) { + capabilitiesTLS.set(caps); + icd.set(caps); + } + + /** + * Returns the {@link ALCapabilities} for the OpenAL context that is current in the current thread or process. + * + * @throws IllegalStateException if no OpenAL context is current in the current thread or process + */ + public static ALCapabilities getCapabilities() { + ALCapabilities caps = capabilitiesTLS.get(); + if (caps == null) { + caps = processCaps; + } + + return checkCapabilities(caps); + } + + private static ALCapabilities checkCapabilities(@Nullable ALCapabilities caps) { + if (caps == null) { + throw new IllegalStateException( + "No ALCapabilities instance set for the current thread or process. Possible solutions:\n" + + "\ta) Call AL.createCapabilities() after making a context current.\n" + + "\tb) Call AL.setCurrentProcess() or AL.setCurrentThread() if an ALCapabilities instance already exists." + ); + } + return caps; + } + + /** + * Creates a new {@link ALCapabilities} instance for the OpenAL context that is current in the current thread or process. + * + *

    This method calls {@link #setCurrentProcess} (or {@link #setCurrentThread} if applicable) with the new instance before returning.

    + * + * @param alcCaps the {@link ALCCapabilities} of the device associated with the current context + * + * @return the ALCapabilities instance + */ + public static ALCapabilities createCapabilities(ALCCapabilities alcCaps) { + return createCapabilities(alcCaps, null); + } + + /** + * Creates a new {@link ALCapabilities} instance for the OpenAL context that is current in the current thread or process. + * + * @param alcCaps the {@link ALCCapabilities} of the device associated with the current context + * @param bufferFactory a function that allocates a {@link PointerBuffer} given a size. The buffer must be filled with zeroes. If {@code null}, LWJGL will + * allocate a GC-managed buffer internally. + * + * @return the ALCapabilities instance + */ + public static ALCapabilities createCapabilities(ALCCapabilities alcCaps, @Nullable IntFunction bufferFactory) { + // We'll use alGetProcAddress for both core and extension entry points. + // To do that, we need to first grab the alGetProcAddress function from + // the OpenAL native library. + long alGetProcAddress = ALC.getFunctionProvider().getFunctionAddress(NULL, "alGetProcAddress"); + if (alGetProcAddress == NULL) { + throw new RuntimeException("A core AL function is missing. Make sure that the OpenAL library has been loaded correctly."); + } + + FunctionProvider functionProvider = functionName -> { + long address = invokePP(memAddress(functionName), alGetProcAddress); + if (address == NULL && Checks.DEBUG_FUNCTIONS) { + apiLogMissing("AL", functionName); + } + return address; + }; + + long GetString = functionProvider.getFunctionAddress("alGetString"); + long GetError = functionProvider.getFunctionAddress("alGetError"); + long IsExtensionPresent = functionProvider.getFunctionAddress("alIsExtensionPresent"); + if (GetString == NULL || GetError == NULL || IsExtensionPresent == NULL) { + throw new IllegalStateException("Core OpenAL functions could not be found. Make sure that the OpenAL library has been loaded correctly."); + } + + String versionString = memASCIISafe(invokeP(AL_VERSION, GetString)); + if (versionString == null || invokeI(GetError) != AL_NO_ERROR) { + throw new IllegalStateException("There is no OpenAL context current in the current thread or process."); + } + + APIVersion apiVersion = apiParseVersion(versionString); + + int majorVersion = apiVersion.major; + int minorVersion = apiVersion.minor; + + int[][] AL_VERSIONS = { + {0, 1} // OpenAL 1 + }; + + Set supportedExtensions = new HashSet<>(32); + + for (int major = 1; major <= AL_VERSIONS.length; major++) { + int[] minors = AL_VERSIONS[major - 1]; + for (int minor : minors) { + if (major < majorVersion || (major == majorVersion && minor <= minorVersion)) { + supportedExtensions.add("OpenAL" + major + minor); + } + } + } + + // Parse EXTENSIONS string + String extensionsString = memASCIISafe(invokeP(AL_EXTENSIONS, GetString)); + if (extensionsString != null) { + MemoryStack stack = stackGet(); + + StringTokenizer tokenizer = new StringTokenizer(extensionsString); + while (tokenizer.hasMoreTokens()) { + String extName = tokenizer.nextToken(); + try (MemoryStack frame = stack.push()) { + if (invokePZ(memAddress(frame.ASCII(extName, true)), IsExtensionPresent)) { + supportedExtensions.add(extName); + } + } + } + } + + if (alcCaps.ALC_EXT_EFX) { + supportedExtensions.add("ALC_EXT_EFX"); + } + apiFilterExtensions(supportedExtensions, Configuration.OPENAL_EXTENSION_FILTER); + + ALCapabilities caps = new ALCapabilities(functionProvider, supportedExtensions, bufferFactory == null ? BufferUtils::createPointerBuffer : bufferFactory); + + if (alcCaps.ALC_EXT_thread_local_context && alcGetThreadContext() != NULL) { + setCurrentThread(caps); + } else { + setCurrentProcess(caps); + } + + return caps; + } + + static ALCapabilities getICD() { + return ALC.check(icd.get()); + } + + /** Function pointer provider. */ + private interface ICD { + default void set(@Nullable ALCapabilities caps) {} + @Nullable ALCapabilities get(); + } + + /** + * Write-once {@link ICD}. + * + *

    This is the default implementation that skips the thread/process lookup. When a new ALCapabilities is set, we compare it to the write-once + * capabilities. If different function pointers are found, we fall back to the expensive lookup. This will never happen with the OpenAL-Soft + * implementation.

    + */ + private static class ICDStatic implements ICD { + + @Nullable + private static ALCapabilities tempCaps; + + @SuppressWarnings("AssignmentToStaticFieldFromInstanceMethod") + @Override + public void set(@Nullable ALCapabilities caps) { + if (tempCaps == null) { + tempCaps = caps; + } else if (caps != null && caps != tempCaps && ThreadLocalUtil.areCapabilitiesDifferent(tempCaps.addresses, caps.addresses)) { + apiLog("[WARNING] Incompatible context detected. Falling back to thread/process lookup for AL contexts."); + icd = AL::getCapabilities; // fall back to thread/process lookup + } + } + + @Override + public ALCapabilities get() { + return WriteOnce.caps; + } + + private static final class WriteOnce { + // This will be initialized the first time get() above is called + static final ALCapabilities caps; + + static { + ALCapabilities tempCaps = ICDStatic.tempCaps; + if (tempCaps == null) { + throw new IllegalStateException("No ALCapabilities instance has been set"); + } + caps = tempCaps; + } + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/AL10.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/AL10.java new file mode 100644 index 000000000..9776ee6d0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/AL10.java @@ -0,0 +1,1909 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to AL 1.0 functionality. */ +public class AL10 { + + public static void alGetDouble(int p1, DoubleBuffer p2) { + alGetDoublev(p1, p2); + } + + public static void alGetFloat(int p1, FloatBuffer p2) { + alGetFloatv(p1, p2); + } + + public static void alGetInteger(int p1, IntBuffer p2) { + alGetIntegerv(p1, p2); + } + + public static void alGetListener(int p1, FloatBuffer p2) { + alGetListenerfv(p1, p2); + } + + public static void alGetSource(int p1, int p2, FloatBuffer p3) { + alGetSourcefv(p1, p2, p3); + } + + public static void alListener(int pname, FloatBuffer value) { + alListenerfv(pname, value); + } + + public static void alSource(int p1, int p2, FloatBuffer p3) { + alSourcefv(p1, p2, p3); + } + + public static void alSourcePause(IntBuffer p1) { + alSourcePausev(p1); + } + + public static void alSourcePlay(IntBuffer p1) { + alSourcePlayv(p1); + } + + public static void alSourceRewind(IntBuffer p1) { + alSourceRewindv(p1); + } + + public static void alSourceStop(IntBuffer p1) { + alSourceStopv(p1); + } + + /** General tokens. */ + public static final int + AL_INVALID = 0xFFFFFFFF, + AL_NONE = 0x0, + AL_FALSE = 0x0, + AL_TRUE = 0x1; + + /** Error conditions. */ + public static final int + AL_NO_ERROR = 0x0, + AL_INVALID_NAME = 0xA001, + AL_INVALID_ENUM = 0xA002, + AL_INVALID_VALUE = 0xA003, + AL_INVALID_OPERATION = 0xA004, + AL_OUT_OF_MEMORY = 0xA005; + + /** Numerical queries. */ + public static final int + AL_DOPPLER_FACTOR = 0xC000, + AL_DISTANCE_MODEL = 0xD000; + + /** String queries. */ + public static final int + AL_VENDOR = 0xB001, + AL_VERSION = 0xB002, + AL_RENDERER = 0xB003, + AL_EXTENSIONS = 0xB004; + + /** Distance attenuation models. */ + public static final int + AL_INVERSE_DISTANCE = 0xD001, + AL_INVERSE_DISTANCE_CLAMPED = 0xD002; + + /** Source types. */ + public static final int + AL_SOURCE_ABSOLUTE = 0x201, + AL_SOURCE_RELATIVE = 0x202; + + /** Listener and Source attributes. */ + public static final int + AL_POSITION = 0x1004, + AL_VELOCITY = 0x1006, + AL_GAIN = 0x100A; + + /** Source attributes. */ + public static final int + AL_CONE_INNER_ANGLE = 0x1001, + AL_CONE_OUTER_ANGLE = 0x1002, + AL_PITCH = 0x1003, + AL_DIRECTION = 0x1005, + AL_LOOPING = 0x1007, + AL_BUFFER = 0x1009, + AL_SOURCE_STATE = 0x1010, + AL_CONE_OUTER_GAIN = 0x1022, + AL_SOURCE_TYPE = 0x1027; + + /** Source state. */ + public static final int + AL_INITIAL = 0x1011, + AL_PLAYING = 0x1012, + AL_PAUSED = 0x1013, + AL_STOPPED = 0x1014; + + /** Listener attributes. */ + public static final int AL_ORIENTATION = 0x100F; + + /** Queue state. */ + public static final int + AL_BUFFERS_QUEUED = 0x1015, + AL_BUFFERS_PROCESSED = 0x1016; + + /** Gain bounds. */ + public static final int + AL_MIN_GAIN = 0x100D, + AL_MAX_GAIN = 0x100E; + + /** Distance model attributes, */ + public static final int + AL_REFERENCE_DISTANCE = 0x1020, + AL_ROLLOFF_FACTOR = 0x1021, + AL_MAX_DISTANCE = 0x1023; + + /** Buffer attributes, */ + public static final int + AL_FREQUENCY = 0x2001, + AL_BITS = 0x2002, + AL_CHANNELS = 0x2003, + AL_SIZE = 0x2004; + + /** Buffer formats. */ + public static final int + AL_FORMAT_MONO8 = 0x1100, + AL_FORMAT_MONO16 = 0x1101, + AL_FORMAT_STEREO8 = 0x1102, + AL_FORMAT_STEREO16 = 0x1103; + + /** Buffer state. */ + public static final int + AL_UNUSED = 0x2010, + AL_PENDING = 0x2011, + AL_PROCESSED = 0x2012; + + protected AL10() { + throw new UnsupportedOperationException(); + } + + // --- [ alGetError ] --- + + /** + * Obtains error information. + * + *

    Each detectable error is assigned a numeric code. When an error is detected by AL, a flag is set and the error code is recorded. Further errors, if they + * occur, do not affect this recorded code. When alGetError is called, the code is returned and the flag is cleared, so that a further error will again + * record its code. If a call to alGetError returns AL_NO_ERROR then there has been no detectable error since the last call to alGetError (or since the AL + * was initialized).

    + * + *

    Error codes can be mapped to strings. The alGetString function returns a pointer to a constant (literal) string that is identical to the identifier used + * for the enumeration value, as defined in the specification.

    + */ + @NativeType("ALenum") + public static int alGetError() { + long __functionAddress = AL.getICD().alGetError; + return invokeI(__functionAddress); + } + + // --- [ alEnable ] --- + + /** + * Enables AL capabilities. + * + * @param target the capability to enable + */ + @NativeType("ALvoid") + public static void alEnable(@NativeType("ALenum") int target) { + long __functionAddress = AL.getICD().alEnable; + invokeV(target, __functionAddress); + } + + // --- [ alDisable ] --- + + /** + * Disables AL capabilities. + * + * @param target the capability to disable + */ + @NativeType("ALvoid") + public static void alDisable(@NativeType("ALenum") int target) { + long __functionAddress = AL.getICD().alDisable; + invokeV(target, __functionAddress); + } + + // --- [ alIsEnabled ] --- + + /** + * Queries whether a given capability is currently enabled or not. + * + * @param target the capability to query + */ + @NativeType("ALboolean") + public static boolean alIsEnabled(@NativeType("ALenum") int target) { + long __functionAddress = AL.getICD().alIsEnabled; + return invokeZ(target, __functionAddress); + } + + // --- [ alGetBoolean ] --- + + /** + * Returns the boolean value of the specified parameter. + * + * @param paramName the parameter to query + */ + @NativeType("ALboolean") + public static boolean alGetBoolean(@NativeType("ALenum") int paramName) { + long __functionAddress = AL.getICD().alGetBoolean; + return invokeZ(paramName, __functionAddress); + } + + // --- [ alGetInteger ] --- + + /** + * Returns the integer value of the specified parameter. + * + * @param paramName the parameter to query. One of:
    {@link #AL_DOPPLER_FACTOR DOPPLER_FACTOR}{@link #AL_DISTANCE_MODEL DISTANCE_MODEL}{@link AL11#AL_SPEED_OF_SOUND SPEED_OF_SOUND}
    + */ + @NativeType("ALint") + public static int alGetInteger(@NativeType("ALenum") int paramName) { + long __functionAddress = AL.getICD().alGetInteger; + return invokeI(paramName, __functionAddress); + } + + // --- [ alGetFloat ] --- + + /** + * Returns the float value of the specified parameter. + * + * @param paramName the parameter to query. One of:
    {@link #AL_DOPPLER_FACTOR DOPPLER_FACTOR}{@link #AL_DISTANCE_MODEL DISTANCE_MODEL}{@link AL11#AL_SPEED_OF_SOUND SPEED_OF_SOUND}
    + */ + @NativeType("ALfloat") + public static float alGetFloat(@NativeType("ALenum") int paramName) { + long __functionAddress = AL.getICD().alGetFloat; + return invokeF(paramName, __functionAddress); + } + + // --- [ alGetDouble ] --- + + /** + * Returns the double value of the specified parameter. + * + * @param paramName the parameter to query. One of:
    {@link #AL_DOPPLER_FACTOR DOPPLER_FACTOR}{@link #AL_DISTANCE_MODEL DISTANCE_MODEL}{@link AL11#AL_SPEED_OF_SOUND SPEED_OF_SOUND}
    + */ + @NativeType("ALdouble") + public static double alGetDouble(@NativeType("ALenum") int paramName) { + long __functionAddress = AL.getICD().alGetDouble; + return invokeD(paramName, __functionAddress); + } + + // --- [ alGetBooleanv ] --- + + /** Unsafe version of: {@link #alGetBooleanv GetBooleanv} */ + public static void nalGetBooleanv(int paramName, long dest) { + long __functionAddress = AL.getICD().alGetBooleanv; + invokePV(paramName, dest, __functionAddress); + } + + /** + * Pointer version of {@link #alGetBoolean GetBoolean}. + * + * @param paramName the parameter to query + * @param dest a buffer that will receive the parameter values + */ + @NativeType("ALvoid") + public static void alGetBooleanv(@NativeType("ALenum") int paramName, @NativeType("ALboolean *") ByteBuffer dest) { + if (CHECKS) { + check(dest, 1); + } + nalGetBooleanv(paramName, memAddress(dest)); + } + + // --- [ alGetIntegerv ] --- + + /** Unsafe version of: {@link #alGetIntegerv GetIntegerv} */ + public static void nalGetIntegerv(int paramName, long dest) { + long __functionAddress = AL.getICD().alGetIntegerv; + invokePV(paramName, dest, __functionAddress); + } + + /** + * Pointer version of {@link #alGetInteger GetInteger}. + * + * @param paramName the parameter to query + * @param dest a buffer that will receive the parameter values + */ + @NativeType("ALvoid") + public static void alGetIntegerv(@NativeType("ALenum") int paramName, @NativeType("ALint *") IntBuffer dest) { + if (CHECKS) { + check(dest, 1); + } + nalGetIntegerv(paramName, memAddress(dest)); + } + + // --- [ alGetFloatv ] --- + + /** Unsafe version of: {@link #alGetFloatv GetFloatv} */ + public static void nalGetFloatv(int paramName, long dest) { + long __functionAddress = AL.getICD().alGetFloatv; + invokePV(paramName, dest, __functionAddress); + } + + /** + * Pointer version of {@link #alGetFloat GetFloat}. + * + * @param paramName the parameter to query + * @param dest a buffer that will receive the parameter values + */ + @NativeType("ALvoid") + public static void alGetFloatv(@NativeType("ALenum") int paramName, @NativeType("ALfloat *") FloatBuffer dest) { + if (CHECKS) { + check(dest, 1); + } + nalGetFloatv(paramName, memAddress(dest)); + } + + // --- [ alGetDoublev ] --- + + /** Unsafe version of: {@link #alGetDoublev GetDoublev} */ + public static void nalGetDoublev(int paramName, long dest) { + long __functionAddress = AL.getICD().alGetDoublev; + invokePV(paramName, dest, __functionAddress); + } + + /** + * Pointer version of {@link #alGetDouble GetDouble}. + * + * @param paramName the parameter to query + * @param dest a buffer that will receive the parameter values + */ + @NativeType("ALvoid") + public static void alGetDoublev(@NativeType("ALenum") int paramName, @NativeType("ALdouble *") DoubleBuffer dest) { + if (CHECKS) { + check(dest, 1); + } + nalGetDoublev(paramName, memAddress(dest)); + } + + // --- [ alGetString ] --- + + /** Unsafe version of: {@link #alGetString GetString} */ + public static long nalGetString(int paramName) { + long __functionAddress = AL.getICD().alGetString; + return invokeP(paramName, __functionAddress); + } + + /** + * Returns the string value of the specified parameter + * + * @param paramName the parameter to query. One of:
    {@link #AL_VENDOR VENDOR}{@link #AL_VERSION VERSION}{@link #AL_RENDERER RENDERER}{@link #AL_EXTENSIONS EXTENSIONS}
    + */ + @Nullable + @NativeType("ALchar const *") + public static String alGetString(@NativeType("ALenum") int paramName) { + long __result = nalGetString(paramName); + return memUTF8Safe(__result); + } + + // --- [ alDistanceModel ] --- + + /** + * Sets the distance attenuation model. + * + *

    Samples usually use the entire dynamic range of the chosen format/encoding, independent of their real world intensity. For example, a jet engine and a + * clockwork both will have samples with full amplitude. The application will then have to adjust source gain accordingly to account for relative differences.

    + * + *

    Source gain is then attenuated by distance. The effective attenuation of a source depends on many factors, among which distance attenuation and source + * and listener gain are only some of the contributing factors. Even if the source and listener gain exceed 1.0 (amplification beyond the guaranteed + * dynamic range), distance and other attenuation might ultimately limit the overall gain to a value below 1.0.

    + * + *

    OpenAL currently supports three modes of operation with respect to distance attenuation, including one that is similar to the IASIG I3DL2 model. The + * application can choose one of these models (or chooses to disable distance-dependent attenuation) on a per-context basis.

    + * + * @param modelName the distance attenuation model to set. One of:
    {@link #AL_INVERSE_DISTANCE INVERSE_DISTANCE}{@link #AL_INVERSE_DISTANCE_CLAMPED INVERSE_DISTANCE_CLAMPED}{@link AL11#AL_LINEAR_DISTANCE LINEAR_DISTANCE}{@link AL11#AL_LINEAR_DISTANCE_CLAMPED LINEAR_DISTANCE_CLAMPED}
    {@link AL11#AL_EXPONENT_DISTANCE EXPONENT_DISTANCE}{@link AL11#AL_EXPONENT_DISTANCE_CLAMPED EXPONENT_DISTANCE_CLAMPED}{@link #AL_NONE NONE}
    + */ + @NativeType("ALvoid") + public static void alDistanceModel(@NativeType("ALenum") int modelName) { + long __functionAddress = AL.getICD().alDistanceModel; + invokeV(modelName, __functionAddress); + } + + // --- [ alDopplerFactor ] --- + + /** + * Sets the doppler effect factor. + * + *

    The Doppler Effect depends on the velocities of source and listener relative to the medium, and the propagation speed of sound in that medium. The + * application might want to emphasize or de-emphasize the Doppler Effect as physically accurate calculation might not give the desired results. The amount + * of frequency shift (pitch change) is proportional to the speed of listener and source along their line of sight. The Doppler Effect as implemented by + * OpenAL is described by the formula below. Effects of the medium (air, water) moving with respect to listener and source are ignored.

    + * + *
    
    +     * SS: AL_SPEED_OF_SOUND = speed of sound (default value 343.3)
    +     * DF: AL_DOPPLER_FACTOR = Doppler factor (default 1.0)
    +     * vls: Listener velocity scalar (scalar, projected on source-to-listener vector)
    +     * vss: Source velocity scalar (scalar, projected on source-to-listener vector)
    +     * f: Frequency of sample
    +     * f': effective Doppler shifted frequency
    +     * 
    +     * 3D Mathematical representation of vls and vss:
    +     * 
    +     * Mag(vector) = sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z)
    +     * DotProduct(v1, v2) = (v1.x * v2.x + v1.y * v2.y + v1.z * v2.z)
    +     * 
    +     * SL = source to listener vector
    +     * SV = Source velocity vector
    +     * LV = Listener velocity vector
    +     * 
    +     * vls = DotProduct(SL, LV) / Mag(SL)
    +     * vss = DotProduct(SL, SV) / Mag(SL)
    +     * 
    +     * Dopper Calculation:
    +     * 
    +     * vss = min(vss, SS / DF)
    +     * vls = min(vls, SS / DF)
    +     * 
    +     * f' = f * (SS - DF * vls) / (SS - DF * vss)
    + * + *

    The {@code dopplerFactor} is a simple scaling of source and listener velocities to exaggerate or deemphasize the Doppler (pitch) shift resulting from + * the calculation.

    + * + * @param dopplerFactor the doppler factor + */ + @NativeType("ALvoid") + public static void alDopplerFactor(@NativeType("ALfloat") float dopplerFactor) { + long __functionAddress = AL.getICD().alDopplerFactor; + invokeV(dopplerFactor, __functionAddress); + } + + // --- [ alDopplerVelocity ] --- + + /** + * Sets the doppler effect propagation velocity. + * + *

    The OpenAL 1.1 Doppler implementation is different than that of OpenAL 1.0, because the older implementation was confusing and not implemented + * consistently. The new "speed of sound" property makes the 1.1 implementation more intuitive than the old implementation. If your implementation wants to + * support the AL_DOPPLER_VELOCITY parameter (the alDopplerVelocity call will remain as an entry point so that 1.0 applications can link with a 1.1 + * library), the above formula can be changed to the following:

    + * + *
    
    +     * vss = min(vss, (SS * DV)/DF)
    +     * vls = min(vls, (SS * DV)/DF)
    +     * 
    +     * f' = f * (SS * DV - DF*vls) / (SS * DV - DF * vss)
    + * + *

    OpenAL 1.1 programmers would never use AL_DOPPLER_VELOCITY (which defaults to 1.0).

    + * + * @param dopplerVelocity the doppler velocity + */ + @NativeType("ALvoid") + public static void alDopplerVelocity(@NativeType("ALfloat") float dopplerVelocity) { + long __functionAddress = AL.getICD().alDopplerVelocity; + invokeV(dopplerVelocity, __functionAddress); + } + + // --- [ alListenerf ] --- + + /** + * Sets the float value of a listener parameter. + * + * @param paramName the parameter to modify. One of:
    {@link #AL_ORIENTATION ORIENTATION}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}
    + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alListenerf(@NativeType("ALenum") int paramName, @NativeType("ALfloat") float value) { + long __functionAddress = AL.getICD().alListenerf; + invokeV(paramName, value, __functionAddress); + } + + // --- [ alListeneri ] --- + + /** + * Integer version of {@link #alListenerf Listenerf}. + * + * @param paramName the parameter to modify. One of:
    {@link #AL_ORIENTATION ORIENTATION}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}
    + * @param values the parameter value + */ + @NativeType("ALvoid") + public static void alListeneri(@NativeType("ALenum") int paramName, @NativeType("ALint") int values) { + long __functionAddress = AL.getICD().alListeneri; + invokeV(paramName, values, __functionAddress); + } + + // --- [ alListener3f ] --- + + /** + * Sets the 3 dimensional float values of a listener parameter. + * + * @param paramName the parameter to modify. One of:
    {@link #AL_ORIENTATION ORIENTATION}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}
    + * @param value1 the first value + * @param value2 the second value + * @param value3 the third value + */ + @NativeType("ALvoid") + public static void alListener3f(@NativeType("ALenum") int paramName, @NativeType("ALfloat") float value1, @NativeType("ALfloat") float value2, @NativeType("ALfloat") float value3) { + long __functionAddress = AL.getICD().alListener3f; + invokeV(paramName, value1, value2, value3, __functionAddress); + } + + // --- [ alListenerfv ] --- + + /** Unsafe version of: {@link #alListenerfv Listenerfv} */ + public static void nalListenerfv(int paramName, long values) { + long __functionAddress = AL.getICD().alListenerfv; + invokePV(paramName, values, __functionAddress); + } + + /** + * Pointer version of {@link #alListenerf Listenerf}. + * + * @param paramName the parameter to modify + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alListenerfv(@NativeType("ALenum") int paramName, @NativeType("ALfloat const *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalListenerfv(paramName, memAddress(values)); + } + + // --- [ alGetListenerf ] --- + + /** Unsafe version of: {@link #alGetListenerf GetListenerf} */ + public static void nalGetListenerf(int paramName, long value) { + long __functionAddress = AL.getICD().alGetListenerf; + invokePV(paramName, value, __functionAddress); + } + + /** + * Returns the float value of a listener parameter. + * + * @param paramName the parameter to query. One of:
    {@link #AL_ORIENTATION ORIENTATION}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}
    + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetListenerf(@NativeType("ALenum") int paramName, @NativeType("ALfloat *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetListenerf(paramName, memAddress(value)); + } + + /** + * Returns the float value of a listener parameter. + * + * @param paramName the parameter to query. One of:
    {@link #AL_ORIENTATION ORIENTATION}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}
    + */ + @NativeType("ALvoid") + public static float alGetListenerf(@NativeType("ALenum") int paramName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer value = stack.callocFloat(1); + nalGetListenerf(paramName, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetListeneri ] --- + + /** Unsafe version of: {@link #alGetListeneri GetListeneri} */ + public static void nalGetListeneri(int paramName, long value) { + long __functionAddress = AL.getICD().alGetListeneri; + invokePV(paramName, value, __functionAddress); + } + + /** + * Returns the integer value of a listener parameter. + * + * @param paramName the parameter to query. One of:
    {@link #AL_ORIENTATION ORIENTATION}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}
    + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetListeneri(@NativeType("ALenum") int paramName, @NativeType("ALint *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetListeneri(paramName, memAddress(value)); + } + + /** + * Returns the integer value of a listener parameter. + * + * @param paramName the parameter to query. One of:
    {@link #AL_ORIENTATION ORIENTATION}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}
    + */ + @NativeType("ALvoid") + public static int alGetListeneri(@NativeType("ALenum") int paramName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer value = stack.callocInt(1); + nalGetListeneri(paramName, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetListener3f ] --- + + /** Unsafe version of: {@link #alGetListener3f GetListener3f} */ + public static void nalGetListener3f(int paramName, long value1, long value2, long value3) { + long __functionAddress = AL.getICD().alGetListener3f; + invokePPPV(paramName, value1, value2, value3, __functionAddress); + } + + /** + * Returns the 3 dimensional values of a listener parameter. + * + * @param paramName the parameter to query. One of:
    {@link #AL_ORIENTATION ORIENTATION}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}
    + * @param value1 the first parameter value + * @param value2 the second parameter value + * @param value3 the third parameter value + */ + @NativeType("ALvoid") + public static void alGetListener3f(@NativeType("ALenum") int paramName, @NativeType("ALfloat *") FloatBuffer value1, @NativeType("ALfloat *") FloatBuffer value2, @NativeType("ALfloat *") FloatBuffer value3) { + if (CHECKS) { + check(value1, 1); + check(value2, 1); + check(value3, 1); + } + nalGetListener3f(paramName, memAddress(value1), memAddress(value2), memAddress(value3)); + } + + // --- [ alGetListenerfv ] --- + + /** Unsafe version of: {@link #alGetListenerfv GetListenerfv} */ + public static void nalGetListenerfv(int paramName, long values) { + long __functionAddress = AL.getICD().alGetListenerfv; + invokePV(paramName, values, __functionAddress); + } + + /** + * Returns float values of a listener parameter. + * + * @param paramName the parameter to query. One of:
    {@link #AL_ORIENTATION ORIENTATION}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}
    + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetListenerfv(@NativeType("ALenum") int paramName, @NativeType("ALfloat *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetListenerfv(paramName, memAddress(values)); + } + + // --- [ alGenSources ] --- + + /** + * Unsafe version of: {@link #alGenSources GenSources} + * + * @param n the number of source names to generated + */ + public static void nalGenSources(int n, long srcNames) { + long __functionAddress = AL.getICD().alGenSources; + invokePV(n, srcNames, __functionAddress); + } + + /** + * Requests a number of source names. + * + * @param srcNames the buffer that will receive the source names + */ + @NativeType("ALvoid") + public static void alGenSources(@NativeType("ALuint *") IntBuffer srcNames) { + nalGenSources(srcNames.remaining(), memAddress(srcNames)); + } + + /** Requests a number of source names. */ + @NativeType("ALvoid") + public static int alGenSources() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer srcNames = stack.callocInt(1); + nalGenSources(1, memAddress(srcNames)); + return srcNames.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alDeleteSources ] --- + + /** + * Unsafe version of: {@link #alDeleteSources DeleteSources} + * + * @param n the number of sources to delete + */ + public static void nalDeleteSources(int n, long sources) { + long __functionAddress = AL.getICD().alDeleteSources; + invokePV(n, sources, __functionAddress); + } + + /** + * Requests the deletion of a number of sources. + * + * @param sources the sources to delete + */ + @NativeType("ALvoid") + public static void alDeleteSources(@NativeType("ALuint *") IntBuffer sources) { + nalDeleteSources(sources.remaining(), memAddress(sources)); + } + + /** Requests the deletion of a number of sources. */ + @NativeType("ALvoid") + public static void alDeleteSources(@NativeType("ALuint *") int source) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer sources = stack.ints(source); + nalDeleteSources(1, memAddress(sources)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alIsSource ] --- + + /** + * Verifies whether the specified object name is a source name. + * + * @param sourceName a value that may be a source name + */ + @NativeType("ALboolean") + public static boolean alIsSource(@NativeType("ALuint") int sourceName) { + long __functionAddress = AL.getICD().alIsSource; + return invokeZ(sourceName, __functionAddress); + } + + // --- [ alSourcef ] --- + + /** + * Sets the float value of a source parameter. + * + * @param source the source to modify + * @param param the parameter to modify. One of:
    {@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
    {@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
    {@link #AL_MAX_DISTANCE MAX_DISTANCE}
    + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alSourcef(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALfloat") float value) { + long __functionAddress = AL.getICD().alSourcef; + invokeV(source, param, value, __functionAddress); + } + + // --- [ alSource3f ] --- + + /** + * Sets the 3 dimensional values of a source parameter. + * + * @param source the source to modify + * @param param the parameter to modify. One of:
    {@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
    {@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
    {@link #AL_MAX_DISTANCE MAX_DISTANCE}
    + * @param v1 the first parameter value + * @param v2 the second parameter value + * @param v3 the third parameter value + */ + @NativeType("ALvoid") + public static void alSource3f(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALfloat") float v1, @NativeType("ALfloat") float v2, @NativeType("ALfloat") float v3) { + long __functionAddress = AL.getICD().alSource3f; + invokeV(source, param, v1, v2, v3, __functionAddress); + } + + // --- [ alSourcefv ] --- + + /** Unsafe version of: {@link #alSourcefv Sourcefv} */ + public static void nalSourcefv(int source, int param, long values) { + long __functionAddress = AL.getICD().alSourcefv; + invokePV(source, param, values, __functionAddress); + } + + /** + * Pointer version of {@link #alSourcef Sourcef}. + * + * @param source the source to modify + * @param param the parameter to modify + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alSourcefv(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALfloat const *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalSourcefv(source, param, memAddress(values)); + } + + // --- [ alSourcei ] --- + + /** + * Integer version of {@link #alSourcef Sourcef}. + * + * @param source the source to modify + * @param param the parameter to modify + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alSourcei(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint") int value) { + long __functionAddress = AL.getICD().alSourcei; + invokeV(source, param, value, __functionAddress); + } + + // --- [ alGetSourcef ] --- + + /** Unsafe version of: {@link #alGetSourcef GetSourcef} */ + public static void nalGetSourcef(int source, int param, long value) { + long __functionAddress = AL.getICD().alGetSourcef; + invokePV(source, param, value, __functionAddress); + } + + /** + * Returns the float value of the specified source parameter. + * + * @param source the source to query + * @param param the parameter to query. One of:
    {@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
    {@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
    {@link #AL_MAX_DISTANCE MAX_DISTANCE}
    + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetSourcef(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALfloat *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetSourcef(source, param, memAddress(value)); + } + + /** + * Returns the float value of the specified source parameter. + * + * @param source the source to query + * @param param the parameter to query. One of:
    {@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
    {@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
    {@link #AL_MAX_DISTANCE MAX_DISTANCE}
    + */ + @NativeType("ALvoid") + public static float alGetSourcef(@NativeType("ALuint") int source, @NativeType("ALenum") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer value = stack.callocFloat(1); + nalGetSourcef(source, param, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetSource3f ] --- + + /** Unsafe version of: {@link #alGetSource3f GetSource3f} */ + public static void nalGetSource3f(int source, int param, long v1, long v2, long v3) { + long __functionAddress = AL.getICD().alGetSource3f; + invokePPPV(source, param, v1, v2, v3, __functionAddress); + } + + /** + * Returns the 3 dimensional values of the specified source parameter. + * + * @param source the source to query + * @param param the parameter to query. One of:
    {@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
    {@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
    {@link #AL_MAX_DISTANCE MAX_DISTANCE}
    + * @param v1 the first parameter value + * @param v2 the second parameter value + * @param v3 the third parameter value + */ + @NativeType("ALvoid") + public static void alGetSource3f(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALfloat *") FloatBuffer v1, @NativeType("ALfloat *") FloatBuffer v2, @NativeType("ALfloat *") FloatBuffer v3) { + if (CHECKS) { + check(v1, 1); + check(v2, 1); + check(v3, 1); + } + nalGetSource3f(source, param, memAddress(v1), memAddress(v2), memAddress(v3)); + } + + // --- [ alGetSourcefv ] --- + + /** Unsafe version of: {@link #alGetSourcefv GetSourcefv} */ + public static void nalGetSourcefv(int source, int param, long values) { + long __functionAddress = AL.getICD().alGetSourcefv; + invokePV(source, param, values, __functionAddress); + } + + /** + * Returns the float values of the specified source parameter. + * + * @param source the source to query + * @param param the parameter to query. One of:
    {@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
    {@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
    {@link #AL_MAX_DISTANCE MAX_DISTANCE}
    + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetSourcefv(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALfloat *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetSourcefv(source, param, memAddress(values)); + } + + // --- [ alGetSourcei ] --- + + /** Unsafe version of: {@link #alGetSourcei GetSourcei} */ + public static void nalGetSourcei(int source, int param, long value) { + long __functionAddress = AL.getICD().alGetSourcei; + invokePV(source, param, value, __functionAddress); + } + + /** + * Returns the integer value of the specified source parameter. + * + * @param source the source to query + * @param param the parameter to query. One of:
    {@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
    {@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
    {@link #AL_MAX_DISTANCE MAX_DISTANCE}
    + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetSourcei(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetSourcei(source, param, memAddress(value)); + } + + /** + * Returns the integer value of the specified source parameter. + * + * @param source the source to query + * @param param the parameter to query. One of:
    {@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
    {@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
    {@link #AL_MAX_DISTANCE MAX_DISTANCE}
    + */ + @NativeType("ALvoid") + public static int alGetSourcei(@NativeType("ALuint") int source, @NativeType("ALenum") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer value = stack.callocInt(1); + nalGetSourcei(source, param, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetSourceiv ] --- + + /** Unsafe version of: {@link #alGetSourceiv GetSourceiv} */ + public static void nalGetSourceiv(int source, int param, long values) { + long __functionAddress = AL.getICD().alGetSourceiv; + invokePV(source, param, values, __functionAddress); + } + + /** + * Returns the integer values of the specified source parameter. + * + * @param source the source to query + * @param param the parameter to query. One of:
    {@link #AL_CONE_INNER_ANGLE CONE_INNER_ANGLE}{@link #AL_CONE_OUTER_ANGLE CONE_OUTER_ANGLE}{@link #AL_PITCH PITCH}{@link #AL_DIRECTION DIRECTION}{@link #AL_LOOPING LOOPING}{@link #AL_BUFFER BUFFER}{@link #AL_SOURCE_STATE SOURCE_STATE}
    {@link #AL_CONE_OUTER_GAIN CONE_OUTER_GAIN}{@link #AL_SOURCE_TYPE SOURCE_TYPE}{@link #AL_POSITION POSITION}{@link #AL_VELOCITY VELOCITY}{@link #AL_GAIN GAIN}{@link #AL_REFERENCE_DISTANCE REFERENCE_DISTANCE}{@link #AL_ROLLOFF_FACTOR ROLLOFF_FACTOR}
    {@link #AL_MAX_DISTANCE MAX_DISTANCE}
    + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetSourceiv(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetSourceiv(source, param, memAddress(values)); + } + + // --- [ alSourceQueueBuffers ] --- + + /** + * Unsafe version of: {@link #alSourceQueueBuffers SourceQueueBuffers} + * + * @param numBuffers the number of buffers to queue + */ + public static void nalSourceQueueBuffers(int sourceName, int numBuffers, long bufferNames) { + long __functionAddress = AL.getICD().alSourceQueueBuffers; + invokePV(sourceName, numBuffers, bufferNames, __functionAddress); + } + + /** + * Queues up one or multiple buffer names to the specified source. + * + *

    The buffers will be queued in the sequence in which they appear in the array. This command is legal on a source in any playback state (to allow for + * streaming, queuing has to be possible on a AL_PLAYING source). All buffers in a queue must have the same format and attributes, with the exception of + * the {@code NULL} buffer (i.e., 0) which can always be queued.

    + * + * @param sourceName the target source + * @param bufferNames the buffer names + */ + @NativeType("ALvoid") + public static void alSourceQueueBuffers(@NativeType("ALuint") int sourceName, @NativeType("ALuint *") IntBuffer bufferNames) { + nalSourceQueueBuffers(sourceName, bufferNames.remaining(), memAddress(bufferNames)); + } + + /** + * Queues up one or multiple buffer names to the specified source. + * + *

    The buffers will be queued in the sequence in which they appear in the array. This command is legal on a source in any playback state (to allow for + * streaming, queuing has to be possible on a AL_PLAYING source). All buffers in a queue must have the same format and attributes, with the exception of + * the {@code NULL} buffer (i.e., 0) which can always be queued.

    + * + * @param sourceName the target source + */ + @NativeType("ALvoid") + public static void alSourceQueueBuffers(@NativeType("ALuint") int sourceName, @NativeType("ALuint *") int bufferName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer bufferNames = stack.ints(bufferName); + nalSourceQueueBuffers(sourceName, 1, memAddress(bufferNames)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alSourceUnqueueBuffers ] --- + + /** + * Unsafe version of: {@link #alSourceUnqueueBuffers SourceUnqueueBuffers} + * + * @param numEntries the number of buffers to unqueue + */ + public static void nalSourceUnqueueBuffers(int sourceName, int numEntries, long bufferNames) { + long __functionAddress = AL.getICD().alSourceUnqueueBuffers; + invokePV(sourceName, numEntries, bufferNames, __functionAddress); + } + + /** + * Removes a number of buffer entries that have finished processing, in the order of apperance, from the queue of the specified source. + * + *

    Once a queue entry for a buffer has been appended to a queue and is pending processing, it should not be changed. Removal of a given queue entry is not + * possible unless either the source is stopped (in which case then entire queue is considered processed), or if the queue entry has already been processed + * (AL_PLAYING or AL_PAUSED source). A playing source will enter the AL_STOPPED state if it completes playback of the last buffer in its queue (the same + * behavior as when a single buffer has been attached to a source and has finished playback).

    + * + * @param sourceName the target source + * @param bufferNames the buffer names + */ + @NativeType("ALvoid") + public static void alSourceUnqueueBuffers(@NativeType("ALuint") int sourceName, @NativeType("ALuint *") IntBuffer bufferNames) { + nalSourceUnqueueBuffers(sourceName, bufferNames.remaining(), memAddress(bufferNames)); + } + + /** + * Removes a number of buffer entries that have finished processing, in the order of apperance, from the queue of the specified source. + * + *

    Once a queue entry for a buffer has been appended to a queue and is pending processing, it should not be changed. Removal of a given queue entry is not + * possible unless either the source is stopped (in which case then entire queue is considered processed), or if the queue entry has already been processed + * (AL_PLAYING or AL_PAUSED source). A playing source will enter the AL_STOPPED state if it completes playback of the last buffer in its queue (the same + * behavior as when a single buffer has been attached to a source and has finished playback).

    + * + * @param sourceName the target source + */ + @NativeType("ALvoid") + public static int alSourceUnqueueBuffers(@NativeType("ALuint") int sourceName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer bufferNames = stack.callocInt(1); + nalSourceUnqueueBuffers(sourceName, 1, memAddress(bufferNames)); + return bufferNames.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alSourcePlay ] --- + + /** + * Sets the source state to AL_PLAYING. + * + *

    alSourcePlay applied to an AL_INITIAL source will promote the source to AL_PLAYING, thus the data found in the buffer will be fed into the processing, + * starting at the beginning. alSourcePlay applied to a AL_PLAYING source will restart the source from the beginning. It will not affect the configuration, + * and will leave the source in AL_PLAYING state, but reset the sampling offset to the beginning. alSourcePlay applied to a AL_PAUSED source will resume + * processing using the source state as preserved at the alSourcePause operation. alSourcePlay applied to a AL_STOPPED source will propagate it to + * AL_INITIAL then to AL_PLAYING immediately.

    + * + * @param source the source to play + */ + @NativeType("ALvoid") + public static void alSourcePlay(@NativeType("ALuint") int source) { + long __functionAddress = AL.getICD().alSourcePlay; + invokeV(source, __functionAddress); + } + + // --- [ alSourcePause ] --- + + /** + * Sets the source state to AL_PAUSED. + * + *

    alSourcePause applied to an AL_INITIAL source is a legal NOP. alSourcePause applied to a AL_PLAYING source will change its state to AL_PAUSED. The + * source is exempt from processing, its current state is preserved. alSourcePause applied to a AL_PAUSED source is a legal NOP. alSourcePause applied to a + * AL_STOPPED source is a legal NOP.

    + * + * @param source the source to pause + */ + @NativeType("ALvoid") + public static void alSourcePause(@NativeType("ALuint") int source) { + long __functionAddress = AL.getICD().alSourcePause; + invokeV(source, __functionAddress); + } + + // --- [ alSourceStop ] --- + + /** + * Sets the source state to AL_STOPPED. + * + *

    alSourceStop applied to an AL_INITIAL source is a legal NOP. alSourceStop applied to a AL_PLAYING source will change its state to AL_STOPPED. The source + * is exempt from processing, its current state is preserved. alSourceStop applied to a AL_PAUSED source will change its state to AL_STOPPED, with the same + * consequences as on a AL_PLAYING source. alSourceStop applied to a AL_STOPPED source is a legal NOP.

    + * + * @param source the source to stop + */ + @NativeType("ALvoid") + public static void alSourceStop(@NativeType("ALuint") int source) { + long __functionAddress = AL.getICD().alSourceStop; + invokeV(source, __functionAddress); + } + + // --- [ alSourceRewind ] --- + + /** + * Sets the source state to AL_INITIAL. + * + *

    alSourceRewind applied to an AL_INITIAL source is a legal NOP. alSourceRewind applied to a AL_PLAYING source will change its state to AL_STOPPED then + * AL_INITIAL. The source is exempt from processing: its current state is preserved, with the exception of the sampling offset, which is reset to the + * beginning. alSourceRewind applied to a AL_PAUSED source will change its state to AL_INITIAL, with the same consequences as on a AL_PLAYING source. + * alSourceRewind applied to an AL_STOPPED source promotes the source to AL_INITIAL, resetting the sampling offset to the beginning.

    + * + * @param source the source to rewind + */ + @NativeType("ALvoid") + public static void alSourceRewind(@NativeType("ALuint") int source) { + long __functionAddress = AL.getICD().alSourceRewind; + invokeV(source, __functionAddress); + } + + // --- [ alSourcePlayv ] --- + + /** + * Unsafe version of: {@link #alSourcePlayv SourcePlayv} + * + * @param n the number of sources to play + */ + public static void nalSourcePlayv(int n, long sources) { + long __functionAddress = AL.getICD().alSourcePlayv; + invokePV(n, sources, __functionAddress); + } + + /** + * Pointer version of {@link #alSourcePlay SourcePlay}. + * + * @param sources the sources to play + */ + @NativeType("ALvoid") + public static void alSourcePlayv(@NativeType("ALuint const *") IntBuffer sources) { + nalSourcePlayv(sources.remaining(), memAddress(sources)); + } + + // --- [ alSourcePausev ] --- + + /** + * Unsafe version of: {@link #alSourcePausev SourcePausev} + * + * @param n the number of sources to pause + */ + public static void nalSourcePausev(int n, long sources) { + long __functionAddress = AL.getICD().alSourcePausev; + invokePV(n, sources, __functionAddress); + } + + /** + * Pointer version of {@link #alSourcePause SourcePause}. + * + * @param sources the sources to pause + */ + @NativeType("ALvoid") + public static void alSourcePausev(@NativeType("ALuint const *") IntBuffer sources) { + nalSourcePausev(sources.remaining(), memAddress(sources)); + } + + // --- [ alSourceStopv ] --- + + /** + * Unsafe version of: {@link #alSourceStopv SourceStopv} + * + * @param n the number of sources to stop + */ + public static void nalSourceStopv(int n, long sources) { + long __functionAddress = AL.getICD().alSourceStopv; + invokePV(n, sources, __functionAddress); + } + + /** + * Pointer version of {@link #alSourceStop SourceStop}. + * + * @param sources the sources to stop + */ + @NativeType("ALvoid") + public static void alSourceStopv(@NativeType("ALuint const *") IntBuffer sources) { + nalSourceStopv(sources.remaining(), memAddress(sources)); + } + + // --- [ alSourceRewindv ] --- + + /** + * Unsafe version of: {@link #alSourceRewindv SourceRewindv} + * + * @param n the number of sources to rewind + */ + public static void nalSourceRewindv(int n, long sources) { + long __functionAddress = AL.getICD().alSourceRewindv; + invokePV(n, sources, __functionAddress); + } + + /** + * Pointer version of {@link #alSourceRewind SourceRewind}. + * + * @param sources the sources to rewind + */ + @NativeType("ALvoid") + public static void alSourceRewindv(@NativeType("ALuint const *") IntBuffer sources) { + nalSourceRewindv(sources.remaining(), memAddress(sources)); + } + + // --- [ alGenBuffers ] --- + + /** + * Unsafe version of: {@link #alGenBuffers GenBuffers} + * + * @param n the number of buffer names to generate + */ + public static void nalGenBuffers(int n, long bufferNames) { + long __functionAddress = AL.getICD().alGenBuffers; + invokePV(n, bufferNames, __functionAddress); + } + + /** + * Requests a number of buffer names. + * + * @param bufferNames the buffer that will receive the buffer names + */ + @NativeType("ALvoid") + public static void alGenBuffers(@NativeType("ALuint *") IntBuffer bufferNames) { + nalGenBuffers(bufferNames.remaining(), memAddress(bufferNames)); + } + + /** Requests a number of buffer names. */ + @NativeType("ALvoid") + public static int alGenBuffers() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer bufferNames = stack.callocInt(1); + nalGenBuffers(1, memAddress(bufferNames)); + return bufferNames.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alDeleteBuffers ] --- + + /** + * Unsafe version of: {@link #alDeleteBuffers DeleteBuffers} + * + * @param n the number of buffers to delete + */ + public static void nalDeleteBuffers(int n, long bufferNames) { + long __functionAddress = AL.getICD().alDeleteBuffers; + invokePV(n, bufferNames, __functionAddress); + } + + /** + * Requests the deletion of a number of buffers. + * + * @param bufferNames the buffers to delete + */ + @NativeType("ALvoid") + public static void alDeleteBuffers(@NativeType("ALuint const *") IntBuffer bufferNames) { + nalDeleteBuffers(bufferNames.remaining(), memAddress(bufferNames)); + } + + /** Requests the deletion of a number of buffers. */ + @NativeType("ALvoid") + public static void alDeleteBuffers(@NativeType("ALuint const *") int bufferName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer bufferNames = stack.ints(bufferName); + nalDeleteBuffers(1, memAddress(bufferNames)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alIsBuffer ] --- + + /** + * Verifies whether the specified object name is a buffer name. + * + * @param bufferName a value that may be a buffer name + */ + @NativeType("ALboolean") + public static boolean alIsBuffer(@NativeType("ALuint") int bufferName) { + long __functionAddress = AL.getICD().alIsBuffer; + return invokeZ(bufferName, __functionAddress); + } + + // --- [ alGetBufferf ] --- + + /** Unsafe version of: {@link #alGetBufferf GetBufferf} */ + public static void nalGetBufferf(int bufferName, int paramName, long value) { + long __functionAddress = AL.getICD().alGetBufferf; + invokePV(bufferName, paramName, value, __functionAddress); + } + + /** + * Returns the float value of the specified buffer parameter. + * + * @param bufferName the buffer to query + * @param paramName the parameter to query. One of:
    {@link #AL_FREQUENCY FREQUENCY}{@link #AL_BITS BITS}{@link #AL_CHANNELS CHANNELS}{@link #AL_SIZE SIZE}
    + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetBufferf(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int paramName, @NativeType("ALfloat *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetBufferf(bufferName, paramName, memAddress(value)); + } + + /** + * Returns the float value of the specified buffer parameter. + * + * @param bufferName the buffer to query + * @param paramName the parameter to query. One of:
    {@link #AL_FREQUENCY FREQUENCY}{@link #AL_BITS BITS}{@link #AL_CHANNELS CHANNELS}{@link #AL_SIZE SIZE}
    + */ + @NativeType("ALvoid") + public static float alGetBufferf(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int paramName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer value = stack.callocFloat(1); + nalGetBufferf(bufferName, paramName, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetBufferi ] --- + + /** Unsafe version of: {@link #alGetBufferi GetBufferi} */ + public static void nalGetBufferi(int bufferName, int paramName, long value) { + long __functionAddress = AL.getICD().alGetBufferi; + invokePV(bufferName, paramName, value, __functionAddress); + } + + /** + * Returns the integer value of the specified buffer parameter. + * + * @param bufferName the buffer to query + * @param paramName the parameter to query. One of:
    {@link #AL_FREQUENCY FREQUENCY}{@link #AL_BITS BITS}{@link #AL_CHANNELS CHANNELS}{@link #AL_SIZE SIZE}
    + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetBufferi(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int paramName, @NativeType("ALint *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetBufferi(bufferName, paramName, memAddress(value)); + } + + /** + * Returns the integer value of the specified buffer parameter. + * + * @param bufferName the buffer to query + * @param paramName the parameter to query. One of:
    {@link #AL_FREQUENCY FREQUENCY}{@link #AL_BITS BITS}{@link #AL_CHANNELS CHANNELS}{@link #AL_SIZE SIZE}
    + */ + @NativeType("ALvoid") + public static int alGetBufferi(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int paramName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer value = stack.callocInt(1); + nalGetBufferi(bufferName, paramName, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alBufferData ] --- + + /** + * Unsafe version of: {@link #alBufferData BufferData} + * + * @param size the data buffer size, in bytes + */ + public static void nalBufferData(int bufferName, int format, long data, int size, int frequency) { + long __functionAddress = AL.getICD().alBufferData; + invokePV(bufferName, format, data, size, frequency, __functionAddress); + } + + /** + * Sets the sample data of the specified buffer. + * + *

    The data specified is copied to an internal software, or if possible, hardware buffer. The implementation is free to apply decompression, conversion, + * resampling, and filtering as needed.

    + * + *

    8-bit data is expressed as an unsigned value over the range 0 to 255, 128 being an audio output level of zero.

    + * + *

    16-bit data is expressed as a signed value over the range -32768 to 32767, 0 being an audio output level of zero. Byte order for 16-bit values is + * determined by the native format of the CPU.

    + * + *

    Stereo data is expressed in an interleaved format, left channel sample followed by the right channel sample.

    + * + *

    Buffers containing audio data with more than one channel will be played without 3D spatialization features – these formats are normally used for + * background music.

    + * + * @param bufferName the buffer to modify + * @param format the data format. One of:
    {@link #AL_FORMAT_MONO8 FORMAT_MONO8}{@link #AL_FORMAT_MONO16 FORMAT_MONO16}{@link #AL_FORMAT_STEREO8 FORMAT_STEREO8}{@link #AL_FORMAT_STEREO16 FORMAT_STEREO16}
    + * @param data the sample data + * @param frequency the data frequency + */ + @NativeType("ALvoid") + public static void alBufferData(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int format, @NativeType("ALvoid const *") ByteBuffer data, @NativeType("ALsizei") int frequency) { + nalBufferData(bufferName, format, memAddress(data), data.remaining(), frequency); + } + + /** + * Sets the sample data of the specified buffer. + * + *

    The data specified is copied to an internal software, or if possible, hardware buffer. The implementation is free to apply decompression, conversion, + * resampling, and filtering as needed.

    + * + *

    8-bit data is expressed as an unsigned value over the range 0 to 255, 128 being an audio output level of zero.

    + * + *

    16-bit data is expressed as a signed value over the range -32768 to 32767, 0 being an audio output level of zero. Byte order for 16-bit values is + * determined by the native format of the CPU.

    + * + *

    Stereo data is expressed in an interleaved format, left channel sample followed by the right channel sample.

    + * + *

    Buffers containing audio data with more than one channel will be played without 3D spatialization features – these formats are normally used for + * background music.

    + * + * @param bufferName the buffer to modify + * @param format the data format. One of:
    {@link #AL_FORMAT_MONO8 FORMAT_MONO8}{@link #AL_FORMAT_MONO16 FORMAT_MONO16}{@link #AL_FORMAT_STEREO8 FORMAT_STEREO8}{@link #AL_FORMAT_STEREO16 FORMAT_STEREO16}
    + * @param data the sample data + * @param frequency the data frequency + */ + @NativeType("ALvoid") + public static void alBufferData(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int format, @NativeType("ALvoid const *") ShortBuffer data, @NativeType("ALsizei") int frequency) { + nalBufferData(bufferName, format, memAddress(data), data.remaining() << 1, frequency); + } + + /** + * Sets the sample data of the specified buffer. + * + *

    The data specified is copied to an internal software, or if possible, hardware buffer. The implementation is free to apply decompression, conversion, + * resampling, and filtering as needed.

    + * + *

    8-bit data is expressed as an unsigned value over the range 0 to 255, 128 being an audio output level of zero.

    + * + *

    16-bit data is expressed as a signed value over the range -32768 to 32767, 0 being an audio output level of zero. Byte order for 16-bit values is + * determined by the native format of the CPU.

    + * + *

    Stereo data is expressed in an interleaved format, left channel sample followed by the right channel sample.

    + * + *

    Buffers containing audio data with more than one channel will be played without 3D spatialization features – these formats are normally used for + * background music.

    + * + * @param bufferName the buffer to modify + * @param format the data format. One of:
    {@link #AL_FORMAT_MONO8 FORMAT_MONO8}{@link #AL_FORMAT_MONO16 FORMAT_MONO16}{@link #AL_FORMAT_STEREO8 FORMAT_STEREO8}{@link #AL_FORMAT_STEREO16 FORMAT_STEREO16}
    + * @param data the sample data + * @param frequency the data frequency + */ + @NativeType("ALvoid") + public static void alBufferData(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int format, @NativeType("ALvoid const *") IntBuffer data, @NativeType("ALsizei") int frequency) { + nalBufferData(bufferName, format, memAddress(data), data.remaining() << 2, frequency); + } + + /** + * Sets the sample data of the specified buffer. + * + *

    The data specified is copied to an internal software, or if possible, hardware buffer. The implementation is free to apply decompression, conversion, + * resampling, and filtering as needed.

    + * + *

    8-bit data is expressed as an unsigned value over the range 0 to 255, 128 being an audio output level of zero.

    + * + *

    16-bit data is expressed as a signed value over the range -32768 to 32767, 0 being an audio output level of zero. Byte order for 16-bit values is + * determined by the native format of the CPU.

    + * + *

    Stereo data is expressed in an interleaved format, left channel sample followed by the right channel sample.

    + * + *

    Buffers containing audio data with more than one channel will be played without 3D spatialization features – these formats are normally used for + * background music.

    + * + * @param bufferName the buffer to modify + * @param format the data format. One of:
    {@link #AL_FORMAT_MONO8 FORMAT_MONO8}{@link #AL_FORMAT_MONO16 FORMAT_MONO16}{@link #AL_FORMAT_STEREO8 FORMAT_STEREO8}{@link #AL_FORMAT_STEREO16 FORMAT_STEREO16}
    + * @param data the sample data + * @param frequency the data frequency + */ + @NativeType("ALvoid") + public static void alBufferData(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int format, @NativeType("ALvoid const *") FloatBuffer data, @NativeType("ALsizei") int frequency) { + nalBufferData(bufferName, format, memAddress(data), data.remaining() << 2, frequency); + } + + // --- [ alGetEnumValue ] --- + + /** Unsafe version of: {@link #alGetEnumValue GetEnumValue} */ + public static int nalGetEnumValue(long enumName) { + long __functionAddress = AL.getICD().alGetEnumValue; + return invokePI(enumName, __functionAddress); + } + + /** + * Returns the enumeration value of the specified enum. + * + * @param enumName the enum name + */ + @NativeType("ALuint") + public static int alGetEnumValue(@NativeType("ALchar const *") ByteBuffer enumName) { + if (CHECKS) { + checkNT1(enumName); + } + return nalGetEnumValue(memAddress(enumName)); + } + + /** + * Returns the enumeration value of the specified enum. + * + * @param enumName the enum name + */ + @NativeType("ALuint") + public static int alGetEnumValue(@NativeType("ALchar const *") CharSequence enumName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(enumName, true); + long enumNameEncoded = stack.getPointerAddress(); + return nalGetEnumValue(enumNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetProcAddress ] --- + + /** Unsafe version of: {@link #alGetProcAddress GetProcAddress} */ + public static long nalGetProcAddress(long funcName) { + long __functionAddress = AL.getICD().alGetProcAddress; + return invokePP(funcName, __functionAddress); + } + + /** + * Retrieves extension entry points. + * + *

    Returns {@code NULL} if no entry point with the name funcName can be found. Implementations are free to return {@code NULL} if an entry point is present, but not + * applicable for the current context. However the specification does not guarantee this behavior.

    + * + *

    Applications can use alGetProcAddress to obtain core API entry points, not just extensions. This is the recommended way to dynamically load and unload + * OpenAL DLL's as sound drivers.

    + * + * @param funcName the function name + */ + @NativeType("void *") + public static long alGetProcAddress(@NativeType("ALchar const *") ByteBuffer funcName) { + if (CHECKS) { + checkNT1(funcName); + } + return nalGetProcAddress(memAddress(funcName)); + } + + /** + * Retrieves extension entry points. + * + *

    Returns {@code NULL} if no entry point with the name funcName can be found. Implementations are free to return {@code NULL} if an entry point is present, but not + * applicable for the current context. However the specification does not guarantee this behavior.

    + * + *

    Applications can use alGetProcAddress to obtain core API entry points, not just extensions. This is the recommended way to dynamically load and unload + * OpenAL DLL's as sound drivers.

    + * + * @param funcName the function name + */ + @NativeType("void *") + public static long alGetProcAddress(@NativeType("ALchar const *") CharSequence funcName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(funcName, true); + long funcNameEncoded = stack.getPointerAddress(); + return nalGetProcAddress(funcNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alIsExtensionPresent ] --- + + /** Unsafe version of: {@link #alIsExtensionPresent IsExtensionPresent} */ + public static boolean nalIsExtensionPresent(long extName) { + long __functionAddress = AL.getICD().alIsExtensionPresent; + return invokePZ(extName, __functionAddress); + } + + /** + * Verifies that a given extension is available for the current context and the device it is associated with. + * + *

    Invalid and unsupported string tokens return ALC_FALSE. {@code extName} is not case sensitive – the implementation will convert the name to all + * upper-case internally (and will express extension names in upper-case).

    + * + * @param extName the extension name + */ + @NativeType("ALCboolean") + public static boolean alIsExtensionPresent(@NativeType("ALchar const *") ByteBuffer extName) { + if (CHECKS) { + checkNT1(extName); + } + return nalIsExtensionPresent(memAddress(extName)); + } + + /** + * Verifies that a given extension is available for the current context and the device it is associated with. + * + *

    Invalid and unsupported string tokens return ALC_FALSE. {@code extName} is not case sensitive – the implementation will convert the name to all + * upper-case internally (and will express extension names in upper-case).

    + * + * @param extName the extension name + */ + @NativeType("ALCboolean") + public static boolean alIsExtensionPresent(@NativeType("ALchar const *") CharSequence extName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(extName, true); + long extNameEncoded = stack.getPointerAddress(); + return nalIsExtensionPresent(extNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #alGetIntegerv GetIntegerv} */ + @NativeType("ALvoid") + public static void alGetIntegerv(@NativeType("ALenum") int paramName, @NativeType("ALint *") int[] dest) { + long __functionAddress = AL.getICD().alGetIntegerv; + if (CHECKS) { + check(dest, 1); + } + invokePV(paramName, dest, __functionAddress); + } + + /** Array version of: {@link #alGetFloatv GetFloatv} */ + @NativeType("ALvoid") + public static void alGetFloatv(@NativeType("ALenum") int paramName, @NativeType("ALfloat *") float[] dest) { + long __functionAddress = AL.getICD().alGetFloatv; + if (CHECKS) { + check(dest, 1); + } + invokePV(paramName, dest, __functionAddress); + } + + /** Array version of: {@link #alGetDoublev GetDoublev} */ + @NativeType("ALvoid") + public static void alGetDoublev(@NativeType("ALenum") int paramName, @NativeType("ALdouble *") double[] dest) { + long __functionAddress = AL.getICD().alGetDoublev; + if (CHECKS) { + check(dest, 1); + } + invokePV(paramName, dest, __functionAddress); + } + + /** Array version of: {@link #alListenerfv Listenerfv} */ + @NativeType("ALvoid") + public static void alListenerfv(@NativeType("ALenum") int paramName, @NativeType("ALfloat const *") float[] values) { + long __functionAddress = AL.getICD().alListenerfv; + if (CHECKS) { + check(values, 1); + } + invokePV(paramName, values, __functionAddress); + } + + /** Array version of: {@link #alGetListenerf GetListenerf} */ + @NativeType("ALvoid") + public static void alGetListenerf(@NativeType("ALenum") int paramName, @NativeType("ALfloat *") float[] value) { + long __functionAddress = AL.getICD().alGetListenerf; + if (CHECKS) { + check(value, 1); + } + invokePV(paramName, value, __functionAddress); + } + + /** Array version of: {@link #alGetListeneri GetListeneri} */ + @NativeType("ALvoid") + public static void alGetListeneri(@NativeType("ALenum") int paramName, @NativeType("ALint *") int[] value) { + long __functionAddress = AL.getICD().alGetListeneri; + if (CHECKS) { + check(value, 1); + } + invokePV(paramName, value, __functionAddress); + } + + /** Array version of: {@link #alGetListener3f GetListener3f} */ + @NativeType("ALvoid") + public static void alGetListener3f(@NativeType("ALenum") int paramName, @NativeType("ALfloat *") float[] value1, @NativeType("ALfloat *") float[] value2, @NativeType("ALfloat *") float[] value3) { + long __functionAddress = AL.getICD().alGetListener3f; + if (CHECKS) { + check(value1, 1); + check(value2, 1); + check(value3, 1); + } + invokePPPV(paramName, value1, value2, value3, __functionAddress); + } + + /** Array version of: {@link #alGetListenerfv GetListenerfv} */ + @NativeType("ALvoid") + public static void alGetListenerfv(@NativeType("ALenum") int paramName, @NativeType("ALfloat *") float[] values) { + long __functionAddress = AL.getICD().alGetListenerfv; + if (CHECKS) { + check(values, 1); + } + invokePV(paramName, values, __functionAddress); + } + + /** Array version of: {@link #alGenSources GenSources} */ + @NativeType("ALvoid") + public static void alGenSources(@NativeType("ALuint *") int[] srcNames) { + long __functionAddress = AL.getICD().alGenSources; + invokePV(srcNames.length, srcNames, __functionAddress); + } + + /** Array version of: {@link #alDeleteSources DeleteSources} */ + @NativeType("ALvoid") + public static void alDeleteSources(@NativeType("ALuint *") int[] sources) { + long __functionAddress = AL.getICD().alDeleteSources; + invokePV(sources.length, sources, __functionAddress); + } + + /** Array version of: {@link #alSourcefv Sourcefv} */ + @NativeType("ALvoid") + public static void alSourcefv(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALfloat const *") float[] values) { + long __functionAddress = AL.getICD().alSourcefv; + if (CHECKS) { + check(values, 1); + } + invokePV(source, param, values, __functionAddress); + } + + /** Array version of: {@link #alGetSourcef GetSourcef} */ + @NativeType("ALvoid") + public static void alGetSourcef(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALfloat *") float[] value) { + long __functionAddress = AL.getICD().alGetSourcef; + if (CHECKS) { + check(value, 1); + } + invokePV(source, param, value, __functionAddress); + } + + /** Array version of: {@link #alGetSource3f GetSource3f} */ + @NativeType("ALvoid") + public static void alGetSource3f(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALfloat *") float[] v1, @NativeType("ALfloat *") float[] v2, @NativeType("ALfloat *") float[] v3) { + long __functionAddress = AL.getICD().alGetSource3f; + if (CHECKS) { + check(v1, 1); + check(v2, 1); + check(v3, 1); + } + invokePPPV(source, param, v1, v2, v3, __functionAddress); + } + + /** Array version of: {@link #alGetSourcefv GetSourcefv} */ + @NativeType("ALvoid") + public static void alGetSourcefv(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALfloat *") float[] values) { + long __functionAddress = AL.getICD().alGetSourcefv; + if (CHECKS) { + check(values, 1); + } + invokePV(source, param, values, __functionAddress); + } + + /** Array version of: {@link #alGetSourcei GetSourcei} */ + @NativeType("ALvoid") + public static void alGetSourcei(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint *") int[] value) { + long __functionAddress = AL.getICD().alGetSourcei; + if (CHECKS) { + check(value, 1); + } + invokePV(source, param, value, __functionAddress); + } + + /** Array version of: {@link #alGetSourceiv GetSourceiv} */ + @NativeType("ALvoid") + public static void alGetSourceiv(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint *") int[] values) { + long __functionAddress = AL.getICD().alGetSourceiv; + if (CHECKS) { + check(values, 1); + } + invokePV(source, param, values, __functionAddress); + } + + /** Array version of: {@link #alSourceQueueBuffers SourceQueueBuffers} */ + @NativeType("ALvoid") + public static void alSourceQueueBuffers(@NativeType("ALuint") int sourceName, @NativeType("ALuint *") int[] bufferNames) { + long __functionAddress = AL.getICD().alSourceQueueBuffers; + invokePV(sourceName, bufferNames.length, bufferNames, __functionAddress); + } + + /** Array version of: {@link #alSourceUnqueueBuffers SourceUnqueueBuffers} */ + @NativeType("ALvoid") + public static void alSourceUnqueueBuffers(@NativeType("ALuint") int sourceName, @NativeType("ALuint *") int[] bufferNames) { + long __functionAddress = AL.getICD().alSourceUnqueueBuffers; + invokePV(sourceName, bufferNames.length, bufferNames, __functionAddress); + } + + /** Array version of: {@link #alSourcePlayv SourcePlayv} */ + @NativeType("ALvoid") + public static void alSourcePlayv(@NativeType("ALuint const *") int[] sources) { + long __functionAddress = AL.getICD().alSourcePlayv; + invokePV(sources.length, sources, __functionAddress); + } + + /** Array version of: {@link #alSourcePausev SourcePausev} */ + @NativeType("ALvoid") + public static void alSourcePausev(@NativeType("ALuint const *") int[] sources) { + long __functionAddress = AL.getICD().alSourcePausev; + invokePV(sources.length, sources, __functionAddress); + } + + /** Array version of: {@link #alSourceStopv SourceStopv} */ + @NativeType("ALvoid") + public static void alSourceStopv(@NativeType("ALuint const *") int[] sources) { + long __functionAddress = AL.getICD().alSourceStopv; + invokePV(sources.length, sources, __functionAddress); + } + + /** Array version of: {@link #alSourceRewindv SourceRewindv} */ + @NativeType("ALvoid") + public static void alSourceRewindv(@NativeType("ALuint const *") int[] sources) { + long __functionAddress = AL.getICD().alSourceRewindv; + invokePV(sources.length, sources, __functionAddress); + } + + /** Array version of: {@link #alGenBuffers GenBuffers} */ + @NativeType("ALvoid") + public static void alGenBuffers(@NativeType("ALuint *") int[] bufferNames) { + long __functionAddress = AL.getICD().alGenBuffers; + invokePV(bufferNames.length, bufferNames, __functionAddress); + } + + /** Array version of: {@link #alDeleteBuffers DeleteBuffers} */ + @NativeType("ALvoid") + public static void alDeleteBuffers(@NativeType("ALuint const *") int[] bufferNames) { + long __functionAddress = AL.getICD().alDeleteBuffers; + invokePV(bufferNames.length, bufferNames, __functionAddress); + } + + /** Array version of: {@link #alGetBufferf GetBufferf} */ + @NativeType("ALvoid") + public static void alGetBufferf(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int paramName, @NativeType("ALfloat *") float[] value) { + long __functionAddress = AL.getICD().alGetBufferf; + if (CHECKS) { + check(value, 1); + } + invokePV(bufferName, paramName, value, __functionAddress); + } + + /** Array version of: {@link #alGetBufferi GetBufferi} */ + @NativeType("ALvoid") + public static void alGetBufferi(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int paramName, @NativeType("ALint *") int[] value) { + long __functionAddress = AL.getICD().alGetBufferi; + if (CHECKS) { + check(value, 1); + } + invokePV(bufferName, paramName, value, __functionAddress); + } + + /** Array version of: {@link #alBufferData BufferData} */ + @NativeType("ALvoid") + public static void alBufferData(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int format, @NativeType("ALvoid const *") short[] data, @NativeType("ALsizei") int frequency) { + long __functionAddress = AL.getICD().alBufferData; + invokePV(bufferName, format, data, data.length << 1, frequency, __functionAddress); + } + + /** Array version of: {@link #alBufferData BufferData} */ + @NativeType("ALvoid") + public static void alBufferData(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int format, @NativeType("ALvoid const *") int[] data, @NativeType("ALsizei") int frequency) { + long __functionAddress = AL.getICD().alBufferData; + invokePV(bufferName, format, data, data.length << 2, frequency, __functionAddress); + } + + /** Array version of: {@link #alBufferData BufferData} */ + @NativeType("ALvoid") + public static void alBufferData(@NativeType("ALuint") int bufferName, @NativeType("ALenum") int format, @NativeType("ALvoid const *") float[] data, @NativeType("ALsizei") int frequency) { + long __functionAddress = AL.getICD().alBufferData; + invokePV(bufferName, format, data, data.length << 2, frequency, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/AL11.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/AL11.java new file mode 100644 index 000000000..58bf9303b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/AL11.java @@ -0,0 +1,426 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to AL 1.1 functionality. */ +public class AL11 extends AL10 { + + /** General tokens. */ + public static final int + AL_SEC_OFFSET = 0x1024, + AL_SAMPLE_OFFSET = 0x1025, + AL_BYTE_OFFSET = 0x1026, + AL_STATIC = 0x1028, + AL_STREAMING = 0x1029, + AL_UNDETERMINED = 0x1030, + AL_ILLEGAL_COMMAND = 0xA004, + AL_SPEED_OF_SOUND = 0xC003, + AL_LINEAR_DISTANCE = 0xD003, + AL_LINEAR_DISTANCE_CLAMPED = 0xD004, + AL_EXPONENT_DISTANCE = 0xD005, + AL_EXPONENT_DISTANCE_CLAMPED = 0xD006; + + protected AL11() { + throw new UnsupportedOperationException(); + } + + // --- [ alListener3i ] --- + + /** + * Sets the 3 dimensional integer values of a listener parameter. + * + * @param paramName the parameter to modify + * @param value1 the first value + * @param value2 the second value + * @param value3 the third value + */ + @NativeType("ALvoid") + public static void alListener3i(@NativeType("ALenum") int paramName, @NativeType("ALint") int value1, @NativeType("ALint") int value2, @NativeType("ALint") int value3) { + long __functionAddress = AL.getICD().alListener3i; + if (CHECKS) { + check(__functionAddress); + } + invokeV(paramName, value1, value2, value3, __functionAddress); + } + + // --- [ alGetListeneriv ] --- + + /** Unsafe version of: {@link #alGetListeneriv GetListeneriv} */ + public static void nalGetListeneriv(int param, long values) { + long __functionAddress = AL.getICD().alGetListeneriv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(param, values, __functionAddress); + } + + /** + * Returns the integer values of the specified listener parameter. + * + * @param param the parameter to query + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetListeneriv(@NativeType("ALenum") int param, @NativeType("ALint *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetListeneriv(param, memAddress(values)); + } + + // --- [ alSource3i ] --- + + /** + * Sets the 3 dimensional integer values of a source parameter. + * + * @param source the source to modify + * @param paramName the parameter to modify + * @param value1 the first value + * @param value2 the second value + * @param value3 the third value + */ + @NativeType("ALvoid") + public static void alSource3i(@NativeType("ALuint") int source, @NativeType("ALenum") int paramName, @NativeType("ALint") int value1, @NativeType("ALint") int value2, @NativeType("ALint") int value3) { + long __functionAddress = AL.getICD().alSource3i; + if (CHECKS) { + check(__functionAddress); + } + invokeV(source, paramName, value1, value2, value3, __functionAddress); + } + + // --- [ alListeneriv ] --- + + /** Unsafe version of: {@link #alListeneriv Listeneriv} */ + public static void nalListeneriv(int listener, long value) { + long __functionAddress = AL.getICD().alListeneriv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(listener, value, __functionAddress); + } + + /** + * Pointer version. + * + * @param listener the parameter to modify + * @param value the parameter values + */ + @NativeType("ALvoid") + public static void alListeneriv(@NativeType("ALenum") int listener, @NativeType("ALint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalListeneriv(listener, memAddress(value)); + } + + // --- [ alSourceiv ] --- + + /** Unsafe version of: {@link #alSourceiv Sourceiv} */ + public static void nalSourceiv(int source, int paramName, long value) { + long __functionAddress = AL.getICD().alSourceiv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(source, paramName, value, __functionAddress); + } + + /** + * Pointer version. + * + * @param source the source to modify + * @param paramName the parameter to modify + * @param value the parameter values + */ + @NativeType("ALvoid") + public static void alSourceiv(@NativeType("ALuint") int source, @NativeType("ALenum") int paramName, @NativeType("ALint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalSourceiv(source, paramName, memAddress(value)); + } + + // --- [ alBufferf ] --- + + /** + * Sets the float value of a buffer parameter. + * + * @param buffer the buffer to modify + * @param paramName the parameter to modify + * @param value the value + */ + @NativeType("ALvoid") + public static void alBufferf(@NativeType("ALuint") int buffer, @NativeType("ALenum") int paramName, @NativeType("ALfloat") float value) { + long __functionAddress = AL.getICD().alBufferf; + if (CHECKS) { + check(__functionAddress); + } + invokeV(buffer, paramName, value, __functionAddress); + } + + // --- [ alBuffer3f ] --- + + /** + * Sets the dimensional value of a buffer parameter. + * + * @param buffer the buffer to modify + * @param paramName the parameter to modify + * @param value1 the first value + * @param value2 the second value + * @param value3 the third value + */ + @NativeType("ALvoid") + public static void alBuffer3f(@NativeType("ALuint") int buffer, @NativeType("ALenum") int paramName, @NativeType("ALfloat") float value1, @NativeType("ALfloat") float value2, @NativeType("ALfloat") float value3) { + long __functionAddress = AL.getICD().alBuffer3f; + if (CHECKS) { + check(__functionAddress); + } + invokeV(buffer, paramName, value1, value2, value3, __functionAddress); + } + + // --- [ alBufferfv ] --- + + /** Unsafe version of: {@link #alBufferfv Bufferfv} */ + public static void nalBufferfv(int buffer, int paramName, long value) { + long __functionAddress = AL.getICD().alBufferfv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, paramName, value, __functionAddress); + } + + /** + * the pointer version of {@link #alBufferf Bufferf} + * + * @param buffer the buffer to modify + * @param paramName the parameter to modify + * @param value the parameter values + */ + @NativeType("ALvoid") + public static void alBufferfv(@NativeType("ALuint") int buffer, @NativeType("ALenum") int paramName, @NativeType("ALfloat const *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalBufferfv(buffer, paramName, memAddress(value)); + } + + // --- [ alBufferi ] --- + + /** + * Sets the integer value of a buffer parameter. + * + * @param buffer the buffer to modify + * @param paramName the parameter to modify + * @param value the value + */ + @NativeType("ALvoid") + public static void alBufferi(@NativeType("ALuint") int buffer, @NativeType("ALenum") int paramName, @NativeType("ALint") int value) { + long __functionAddress = AL.getICD().alBufferi; + if (CHECKS) { + check(__functionAddress); + } + invokeV(buffer, paramName, value, __functionAddress); + } + + // --- [ alBuffer3i ] --- + + /** + * Sets the integer 3 dimensional value of a buffer parameter. + * + * @param buffer the buffer to modify + * @param paramName the parameter to modify + * @param value1 the first value + * @param value2 the second value + * @param value3 the third value + */ + @NativeType("ALvoid") + public static void alBuffer3i(@NativeType("ALuint") int buffer, @NativeType("ALenum") int paramName, @NativeType("ALint") int value1, @NativeType("ALint") int value2, @NativeType("ALint") int value3) { + long __functionAddress = AL.getICD().alBuffer3i; + if (CHECKS) { + check(__functionAddress); + } + invokeV(buffer, paramName, value1, value2, value3, __functionAddress); + } + + // --- [ alBufferiv ] --- + + /** Unsafe version of: {@link #alBufferiv Bufferiv} */ + public static void nalBufferiv(int buffer, int paramName, long value) { + long __functionAddress = AL.getICD().alBufferiv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, paramName, value, __functionAddress); + } + + /** + * the pointer version of {@link #alBufferi Bufferi} + * + * @param buffer the buffer to modify + * @param paramName the parameter to modify + * @param value the parameter values + */ + @NativeType("ALvoid") + public static void alBufferiv(@NativeType("ALuint") int buffer, @NativeType("ALenum") int paramName, @NativeType("ALint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalBufferiv(buffer, paramName, memAddress(value)); + } + + // --- [ alGetBufferiv ] --- + + /** Unsafe version of: {@link #alGetBufferiv GetBufferiv} */ + public static void nalGetBufferiv(int buffer, int param, long values) { + long __functionAddress = AL.getICD().alGetBufferiv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, param, values, __functionAddress); + } + + /** + * Returns the integer values of the specified buffer parameter. + * + * @param buffer the buffer to query + * @param param the parameter to query + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetBufferiv(@NativeType("ALuint") int buffer, @NativeType("ALenum") int param, @NativeType("ALint *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetBufferiv(buffer, param, memAddress(values)); + } + + // --- [ alGetBufferfv ] --- + + /** Unsafe version of: {@link #alGetBufferfv GetBufferfv} */ + public static void nalGetBufferfv(int buffer, int param, long values) { + long __functionAddress = AL.getICD().alGetBufferfv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, param, values, __functionAddress); + } + + /** + * Returns the float values of the specified buffer parameter. + * + * @param buffer the buffer to query + * @param param the parameter to query + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetBufferfv(@NativeType("ALuint") int buffer, @NativeType("ALenum") int param, @NativeType("ALfloat *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetBufferfv(buffer, param, memAddress(values)); + } + + // --- [ alSpeedOfSound ] --- + + /** + * Sets the speed of sound. + * + * @param value the speed of sound + */ + @NativeType("ALvoid") + public static void alSpeedOfSound(@NativeType("ALfloat") float value) { + long __functionAddress = AL.getICD().alSpeedOfSound; + if (CHECKS) { + check(__functionAddress); + } + invokeV(value, __functionAddress); + } + + /** Array version of: {@link #alGetListeneriv GetListeneriv} */ + @NativeType("ALvoid") + public static void alGetListeneriv(@NativeType("ALenum") int param, @NativeType("ALint *") int[] values) { + long __functionAddress = AL.getICD().alGetListeneriv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(param, values, __functionAddress); + } + + /** Array version of: {@link #alListeneriv Listeneriv} */ + @NativeType("ALvoid") + public static void alListeneriv(@NativeType("ALenum") int listener, @NativeType("ALint const *") int[] value) { + long __functionAddress = AL.getICD().alListeneriv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(listener, value, __functionAddress); + } + + /** Array version of: {@link #alSourceiv Sourceiv} */ + @NativeType("ALvoid") + public static void alSourceiv(@NativeType("ALuint") int source, @NativeType("ALenum") int paramName, @NativeType("ALint const *") int[] value) { + long __functionAddress = AL.getICD().alSourceiv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(source, paramName, value, __functionAddress); + } + + /** Array version of: {@link #alBufferfv Bufferfv} */ + @NativeType("ALvoid") + public static void alBufferfv(@NativeType("ALuint") int buffer, @NativeType("ALenum") int paramName, @NativeType("ALfloat const *") float[] value) { + long __functionAddress = AL.getICD().alBufferfv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(buffer, paramName, value, __functionAddress); + } + + /** Array version of: {@link #alBufferiv Bufferiv} */ + @NativeType("ALvoid") + public static void alBufferiv(@NativeType("ALuint") int buffer, @NativeType("ALenum") int paramName, @NativeType("ALint const *") int[] value) { + long __functionAddress = AL.getICD().alBufferiv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(buffer, paramName, value, __functionAddress); + } + + /** Array version of: {@link #alGetBufferiv GetBufferiv} */ + @NativeType("ALvoid") + public static void alGetBufferiv(@NativeType("ALuint") int buffer, @NativeType("ALenum") int param, @NativeType("ALint *") int[] values) { + long __functionAddress = AL.getICD().alGetBufferiv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(buffer, param, values, __functionAddress); + } + + /** Array version of: {@link #alGetBufferfv GetBufferfv} */ + @NativeType("ALvoid") + public static void alGetBufferfv(@NativeType("ALuint") int buffer, @NativeType("ALenum") int param, @NativeType("ALfloat *") float[] values) { + long __functionAddress = AL.getICD().alGetBufferfv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(buffer, param, values, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC.java new file mode 100644 index 000000000..b99818644 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC.java @@ -0,0 +1,355 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.openal; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import javax.annotation.*; +import java.nio.*; +import java.util.*; +import java.util.function.*; + +import static org.lwjgl.openal.ALC10.*; +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * This class must be used before any OpenAL function is called. It has the following responsibilities: + *
      + *
    • Loads the OpenAL native library into the JVM process.
    • + *
    • Creates instances of {@link ALCCapabilities} classes. An {@code ALCCapabilities} instance contains flags for functionality that is available for an + * OpenAL device. Internally, it also contains function pointers that are only valid for that specific OpenAL device.
    • + *
    + * + *

    Library lifecycle

    + *

    The OpenAL library is loaded automatically when this class is initialized. Set the {@link Configuration#OPENAL_EXPLICIT_INIT} option to override this + * behavior. Manual loading/unloading can be achieved with the {@link #create} and {@link #destroy} functions. The name of the library loaded can be overridden + * with the {@link Configuration#OPENAL_LIBRARY_NAME} option.

    + * + *

    ALCCapabilities creation

    + *

    Instances of {@code ALCCapabilities} can be created with the {@link #createCapabilities} method. Calling this method is expensive, so + * {@code ALCCapabilities} instances should be cached in user code.

    + * + * @see AL + */ +public final class ALC { + + @Nullable + private static FunctionProviderLocal functionProvider; + + @Nullable + private static ALCCapabilities router; + + private static final ThreadLocal capabilitiesTLS = new ThreadLocal<>(); + + @Nullable + private static ICD icd; + + static { + if (!Configuration.OPENAL_EXPLICIT_INIT.get(false)) { + create(); + } + } + + private ALC() {} + + /** Loads the OpenAL native library, using the default library name. */ + public static void create() { + String libName; + switch (Platform.get()) { + case LINUX: + create("libopenal.so"); + return; + case MACOSX: + libName = "openal"; + break; + case WINDOWS: + libName = "OpenAL"; + break; + default: + throw new IllegalStateException(); + } + + create(Configuration.OPENAL_LIBRARY_NAME.get(Platform.mapLibraryNameBundled(libName))); + } + + private static class SharedLibraryAL extends SharedLibrary.Delegate implements FunctionProviderLocal { + + private final long alcGetProcAddress = getFunctionAddress("alcGetProcAddress"); + + protected SharedLibraryAL(SharedLibrary library) { + super(library); + if (alcGetProcAddress == NULL) { + throw new RuntimeException("A core ALC function is missing. Make sure that the OpenAL library has been loaded correctly."); + } + } + + @Override + public long getFunctionAddress(ByteBuffer functionName) { + long address = library.getFunctionAddress(functionName); + if (address == NULL && Checks.DEBUG_FUNCTIONS) { + apiLogMissing("ALC core", functionName); + } + return address; + } + + @Override + public long getFunctionAddress(long handle, ByteBuffer functionName) { + long address = library.getFunctionAddress(functionName); + if (address == NULL && handle != NULL) { + address = invokePPP(handle, memAddress(functionName), alcGetProcAddress); + } + if (address == NULL && Checks.DEBUG_FUNCTIONS) { + apiLogMissing("ALC", functionName); + } + return address; + } + + } + + /** + * Loads the OpenAL native library, using the specified library name. + * + * @param libName the native library name + */ + public static void create(String libName) { + SharedLibrary OPENAL = Library.loadNative(ALC.class, "org.lwjgl.openal", libName, true); + try { + create(new SharedLibraryAL(OPENAL)); + } catch (RuntimeException e) { + OPENAL.free(); + throw e; + } + } + + /** + * Initializes ALC with the specified {@link FunctionProviderLocal}. This method can be used to implement custom ALC library loading. + * + * @param functionProvider the provider of ALC function addresses + */ + public static void create(FunctionProviderLocal functionProvider) { + if (ALC.functionProvider != null) { + throw new IllegalStateException("ALC has already been created."); + } + + ALC.functionProvider = functionProvider; + + router = createCapabilities(NULL); + + AL.init(); + } + + /** Unloads the OpenAL native library. */ + public static void destroy() { + if (functionProvider == null) { + return; + } + + AL.destroy(); + + router = null; + + if (functionProvider instanceof NativeResource) { + ((NativeResource)functionProvider).free(); + } + functionProvider = null; + } + + static T check(@Nullable T t) { + if (t == null) { + throw new IllegalStateException("OpenAL library has not been loaded."); + } + return t; + } + + /** Returns the {@link FunctionProviderLocal} for the OpenAL native library. */ + public static FunctionProviderLocal getFunctionProvider() { + return check(ALC.functionProvider); + } + + /** + * Sets the specified {@link ALCCapabilities} for the current thread. + * + *

    Any ALC functions called in the current thread will use the specified {@code ALCCapabilities}.

    + * + * @param caps the {@link ALCCapabilities} to make current, or null + */ + public static void setCapabilities(@Nullable ALCCapabilities caps) { + capabilitiesTLS.set(caps); + if (icd == null) { + icd = new ICDStatic(); + } + icd.set(caps); + } + + /** + * Returns the {@link ALCCapabilities} for the current thread. + * + * @throws IllegalStateException if OpenAL has not been loaded. + */ + public static ALCCapabilities getCapabilities() { + ALCCapabilities caps = capabilitiesTLS.get(); + if (caps == null) { + caps = router; + } + + return checkCapabilities(caps); + } + + private static ALCCapabilities checkCapabilities(@Nullable ALCCapabilities caps) { + if (caps == null) { + throw new IllegalStateException("No ALCCapabilities instance set"); + } + return caps; + } + + /** + * Creates a new {@link ALCCapabilities} instance for the specified OpenAL device. + * + *

    This method calls {@link #setCapabilities} with the new instance before returning.

    + * + * @param device the {@code ALCdevice} for which to create the capabilities instance + * + * @return the {@code ALCCapabilities} instance + */ + public static ALCCapabilities createCapabilities(long device) { + return createCapabilities(device, null); + } + + /** + * Creates a new {@link ALCCapabilities} instance for the specified OpenAL device. + * + *

    This method calls {@link #setCapabilities} with the new instance before returning.

    + * + * @param device the {@code ALCdevice} for which to create the capabilities instance + * @param bufferFactory a function that allocates a {@link PointerBuffer} given a size. The buffer must be filled with zeroes. If {@code null}, LWJGL will + * allocate a GC-managed buffer internally. + * + * @return the {@code ALCCapabilities} instance + */ + public static ALCCapabilities createCapabilities(long device, @Nullable IntFunction bufferFactory) { + FunctionProviderLocal functionProvider = getFunctionProvider(); + + // We don't have an ALCCapabilities instance when this method is called + // so we have to use the native bindings directly. + long GetIntegerv = functionProvider.getFunctionAddress("alcGetIntegerv"); + long GetString = functionProvider.getFunctionAddress("alcGetString"); + long IsExtensionPresent = functionProvider.getFunctionAddress("alcIsExtensionPresent"); + + if (GetIntegerv == NULL || GetString == NULL || IsExtensionPresent == NULL) { + throw new IllegalStateException("Core ALC functions could not be found. Make sure that OpenAL has been loaded."); + } + + int majorVersion; + int minorVersion; + + try (MemoryStack stack = stackPush()) { + IntBuffer version = stack.mallocInt(1); + + invokePPV(device, ALC_MAJOR_VERSION, 1, memAddress(version), GetIntegerv); + majorVersion = version.get(0); + + invokePPV(device, ALC_MINOR_VERSION, 1, memAddress(version), GetIntegerv); + minorVersion = version.get(0); + } + + int[][] ALC_VERSIONS = { + {0, 1}, // ALC 1 + }; + + Set supportedExtensions = new HashSet<>(16); + + for (int major = 1; major <= ALC_VERSIONS.length; major++) { + int[] minors = ALC_VERSIONS[major - 1]; + for (int minor : minors) { + if (major < majorVersion || (major == majorVersion && minor <= minorVersion)) { + supportedExtensions.add("OpenALC" + major + minor); + } + } + } + + // Parse EXTENSIONS string + String extensionsString = memASCIISafe(invokePP(device, ALC_EXTENSIONS, GetString)); + if (extensionsString != null) { + StringTokenizer tokenizer = new StringTokenizer(extensionsString); + while (tokenizer.hasMoreTokens()) { + String extName = tokenizer.nextToken(); + try (MemoryStack stack = stackPush()) { + if (invokePPZ(device, memAddress(stack.ASCII(extName, true)), IsExtensionPresent)) { + supportedExtensions.add(extName); + } + } + } + } + apiFilterExtensions(supportedExtensions, Configuration.OPENAL_EXTENSION_FILTER); + + ALCCapabilities caps = new ALCCapabilities(functionProvider, device, supportedExtensions, bufferFactory == null ? BufferUtils::createPointerBuffer : bufferFactory); + if (device != NULL) { + setCapabilities(caps); + } + + return caps; + } + + static ALCCapabilities getICD() { + ALCCapabilities caps = icd == null ? null : icd.get(); + if (caps == null) { + caps = router; + } + return check(caps); + } + + /** Function pointer provider. */ + private interface ICD { + default void set(@Nullable ALCCapabilities caps) {} + @Nullable ALCCapabilities get(); + } + + /** + * Write-once {@link ICD}. + * + *

    This is the default implementation that skips the thread/process lookup. When a new ALCCapabilities is set, we compare it to the write-once + * capabilities. If different function pointers are found, we fall back to the expensive lookup.

    + */ + private static class ICDStatic implements ICD { + + @Nullable + private static ALCCapabilities tempCaps; + + @SuppressWarnings("AssignmentToStaticFieldFromInstanceMethod") + @Override + public void set(@Nullable ALCCapabilities caps) { + if (tempCaps == null) { + tempCaps = caps; + } else if (caps != null && caps != tempCaps && ThreadLocalUtil.areCapabilitiesDifferent(tempCaps.addresses, caps.addresses)) { + apiLog("[WARNING] Incompatible context detected. Falling back to thread/process lookup for AL contexts."); + icd = ALC::getCapabilities; // fall back to thread/process lookup + } + } + + @Override + public ALCCapabilities get() { + return WriteOnce.caps; + } + + private static final class WriteOnce { + // This will be initialized the first time get() above is called + static final ALCCapabilities caps; + + static { + ALCCapabilities tempCaps = ICDStatic.tempCaps; + if (tempCaps == null) { + throw new IllegalStateException("No ALCCapabilities instance has been set"); + } + caps = tempCaps; + } + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC10.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC10.java new file mode 100644 index 000000000..7853f51ad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC10.java @@ -0,0 +1,531 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to ALC 1.0 functionality. */ +public class ALC10 { + + /** General tokens. */ + public static final int + ALC_INVALID = 0xFFFFFFFF, + ALC_FALSE = 0x0, + ALC_TRUE = 0x1; + + /** Context creation attributes. */ + public static final int + ALC_FREQUENCY = 0x1007, + ALC_REFRESH = 0x1008, + ALC_SYNC = 0x1009; + + /** Error conditions. */ + public static final int + ALC_NO_ERROR = 0x0, + ALC_INVALID_DEVICE = 0xA001, + ALC_INVALID_CONTEXT = 0xA002, + ALC_INVALID_ENUM = 0xA003, + ALC_INVALID_VALUE = 0xA004, + ALC_OUT_OF_MEMORY = 0xA005; + + /** String queries. */ + public static final int + ALC_DEFAULT_DEVICE_SPECIFIER = 0x1004, + ALC_DEVICE_SPECIFIER = 0x1005, + ALC_EXTENSIONS = 0x1006; + + /** Integer queries. */ + public static final int + ALC_MAJOR_VERSION = 0x1000, + ALC_MINOR_VERSION = 0x1001, + ALC_ATTRIBUTES_SIZE = 0x1002, + ALC_ALL_ATTRIBUTES = 0x1003; + + protected ALC10() { + throw new UnsupportedOperationException(); + } + + static ALCcontext alcContext; + + public static ALCcontext alcCreateContext(ALCdevice device, java.nio.IntBuffer attrList) { + long alContextHandle = alcCreateContext(device.device, attrList); + alcContext = new ALCcontext(alContextHandle); + return alcContext; + } + + public static ALCdevice alcGetContextsDevice(ALCcontext context) { + return AL.alcDevice; + } + + public static void alcGetInteger(ALCdevice device, int pname, java.nio.IntBuffer integerdata) { + int res = alcGetInteger(device.device, pname); + integerdata.put(0, res); + } + + public static String alcGetString(ALCdevice device, int pname) { + return alcGetString(device.device, pname); + } + + // --- [ alcOpenDevice ] --- + + /** Unsafe version of: {@link #alcOpenDevice OpenDevice} */ + public static long nalcOpenDevice(long deviceSpecifier) { + long __functionAddress = ALC.getICD().alcOpenDevice; + return invokePP(deviceSpecifier, __functionAddress); + } + + /** + * Allows the application to connect to a device. + * + *

    If the function returns {@code NULL}, then no sound driver/device has been found. The argument is a null terminated string that requests a certain device or + * device configuration. If {@code NULL} is specified, the implementation will provide an implementation specific default.

    + * + * @param deviceSpecifier the requested device or device configuration + */ + @NativeType("ALCdevice *") + public static long alcOpenDevice(@Nullable @NativeType("ALCchar const *") ByteBuffer deviceSpecifier) { + if (CHECKS) { + checkNT1Safe(deviceSpecifier); + } + return nalcOpenDevice(memAddressSafe(deviceSpecifier)); + } + + /** + * Allows the application to connect to a device. + * + *

    If the function returns {@code NULL}, then no sound driver/device has been found. The argument is a null terminated string that requests a certain device or + * device configuration. If {@code NULL} is specified, the implementation will provide an implementation specific default.

    + * + * @param deviceSpecifier the requested device or device configuration + */ + @NativeType("ALCdevice *") + public static long alcOpenDevice(@Nullable @NativeType("ALCchar const *") CharSequence deviceSpecifier) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(deviceSpecifier, true); + long deviceSpecifierEncoded = deviceSpecifier == null ? NULL : stack.getPointerAddress(); + return nalcOpenDevice(deviceSpecifierEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alcCloseDevice ] --- + + /** + * Allows the application to disconnect from a device. + * + *

    The return code will be ALC_TRUE or ALC_FALSE, indicating success or failure. Failure will occur if all the device's contexts and buffers have not been + * destroyed. Once closed, the {@code deviceHandle} is invalid.

    + * + * @param deviceHandle the device to close + */ + @NativeType("ALCboolean") + public static boolean alcCloseDevice(@NativeType("ALCdevice const *") long deviceHandle) { + long __functionAddress = ALC.getICD().alcCloseDevice; + if (CHECKS) { + check(deviceHandle); + } + return invokePZ(deviceHandle, __functionAddress); + } + + // --- [ alcCreateContext ] --- + + /** Unsafe version of: {@link #alcCreateContext CreateContext} */ + public static long nalcCreateContext(long deviceHandle, long attrList) { + long __functionAddress = ALC.getICD().alcCreateContext; + if (CHECKS) { + check(deviceHandle); + } + return invokePPP(deviceHandle, attrList, __functionAddress); + } + + /** + * Creates an AL context. + * + * @param deviceHandle a valid device + * @param attrList null or a zero terminated list of integer pairs composed of valid ALC attribute tokens and requested values. One of:
    {@link #ALC_FREQUENCY FREQUENCY}{@link #ALC_REFRESH REFRESH}{@link #ALC_SYNC SYNC}{@link ALC11#ALC_MONO_SOURCES MONO_SOURCES}{@link ALC11#ALC_STEREO_SOURCES STEREO_SOURCES}
    + */ + @NativeType("ALCcontext *") + public static long alcCreateContext(@NativeType("ALCdevice const *") long deviceHandle, @Nullable @NativeType("ALCint const *") IntBuffer attrList) { + if (CHECKS) { + checkNTSafe(attrList); + } + return nalcCreateContext(deviceHandle, memAddressSafe(attrList)); + } + + // --- [ alcMakeContextCurrent ] --- + + /** + * Makes a context current with respect to OpenAL operation. + * + *

    The context parameter can be {@code NULL} or a valid context pointer. Using {@code NULL} results in no context being current, which is useful when shutting OpenAL down. + * The operation will apply to the device that the context was created for.

    + * + *

    For each OS process (usually this means for each application), only one context can be current at any given time. All AL commands apply to the current + * context. Commands that affect objects shared among contexts (e.g. buffers) have side effects on other contexts.

    + * + * @param context the context to make current + */ + @NativeType("ALCboolean") + public static boolean alcMakeContextCurrent(@NativeType("ALCcontext *") long context) { + long __functionAddress = ALC.getICD().alcMakeContextCurrent; + return invokePZ(context, __functionAddress); + } + + // --- [ alcProcessContext ] --- + + /** + * The current context is the only context accessible to state changes by AL commands (aside from state changes affecting shared objects). However, + * multiple contexts can be processed at the same time. To indicate that a context should be processed (i.e. that internal execution state such as the + * offset increments are to be performed), the application uses {@code alcProcessContext}. + * + *

    Repeated calls to alcProcessContext are legal, and do not affect a context that is already marked as processing. The default state of a context created + * by alcCreateContext is that it is processing.

    + * + * @param context the context to mark for processing + */ + @NativeType("ALCvoid") + public static void alcProcessContext(@NativeType("ALCcontext *") long context) { + long __functionAddress = ALC.getICD().alcProcessContext; + if (CHECKS) { + check(context); + } + invokePV(context, __functionAddress); + } + + // --- [ alcSuspendContext ] --- + + /** + * The application can suspend any context from processing (including the current one). To indicate that a context should be suspended from processing + * (i.e. that internal execution state such as offset increments are not to be changed), the application uses {@code alcSuspendContext}. + * + *

    Repeated calls to alcSuspendContext are legal, and do not affect a context that is already marked as suspended.

    + * + * @param context the context to mark as suspended + */ + @NativeType("ALCvoid") + public static void alcSuspendContext(@NativeType("ALCcontext *") long context) { + long __functionAddress = ALC.getICD().alcSuspendContext; + if (CHECKS) { + check(context); + } + invokePV(context, __functionAddress); + } + + // --- [ alcDestroyContext ] --- + + /** + * Destroys a context. + * + *

    The correct way to destroy a context is to first release it using alcMakeCurrent with a {@code NULL} context. Applications should not attempt to destroy a + * current context – doing so will not work and will result in an ALC_INVALID_OPERATION error. All sources within a context will automatically be deleted + * during context destruction.

    + * + * @param context the context to destroy + */ + @NativeType("ALCvoid") + public static void alcDestroyContext(@NativeType("ALCcontext *") long context) { + long __functionAddress = ALC.getICD().alcDestroyContext; + if (CHECKS) { + check(context); + } + invokePV(context, __functionAddress); + } + + // --- [ alcGetCurrentContext ] --- + + /** Queries for, and obtains a handle to, the current context for the application. If there is no current context, {@code NULL} is returned. */ + @NativeType("ALCcontext *") + public static long alcGetCurrentContext() { + long __functionAddress = ALC.getICD().alcGetCurrentContext; + return invokeP(__functionAddress); + } + + // --- [ alcGetContextsDevice ] --- + + /** + * Queries for, and obtains a handle to, the device of a given context. + * + * @param context the context to query + */ + @NativeType("ALCdevice *") + public static long alcGetContextsDevice(@NativeType("ALCcontext *") long context) { + long __functionAddress = ALC.getICD().alcGetContextsDevice; + if (CHECKS) { + check(context); + } + return invokePP(context, __functionAddress); + } + + // --- [ alcIsExtensionPresent ] --- + + /** Unsafe version of: {@link #alcIsExtensionPresent IsExtensionPresent} */ + public static boolean nalcIsExtensionPresent(long deviceHandle, long extName) { + long __functionAddress = ALC.getICD().alcIsExtensionPresent; + return invokePPZ(deviceHandle, extName, __functionAddress); + } + + /** + * Verify that a given extension is available for the current context and the device it + * is associated with. + * A null name argument returns ALC_FALSE, as do invalid and unsupported string + * tokens. + * + * @param extName name of extension to find + * @return true if extension is available, false if not + */ + public static boolean alcIsExtensionPresent(ALCdevice device, String extName) { + return alcIsExtensionPresent(device.device, extName); + } + + /** + * Verifies that a given extension is available for the current context and the device it is associated with. + * + *

    Invalid and unsupported string tokens return ALC_FALSE. A {@code NULL} deviceHandle is acceptable. {@code extName} is not case sensitive – the implementation + * will convert the name to all upper-case internally (and will express extension names in upper-case).

    + * + * @param deviceHandle the device to query + * @param extName the extension name + */ + @NativeType("ALCboolean") + public static boolean alcIsExtensionPresent(@NativeType("ALCdevice const *") long deviceHandle, @NativeType("ALCchar const *") ByteBuffer extName) { + if (CHECKS) { + checkNT1(extName); + } + return nalcIsExtensionPresent(deviceHandle, memAddress(extName)); + } + + /** + * Verifies that a given extension is available for the current context and the device it is associated with. + * + *

    Invalid and unsupported string tokens return ALC_FALSE. A {@code NULL} deviceHandle is acceptable. {@code extName} is not case sensitive – the implementation + * will convert the name to all upper-case internally (and will express extension names in upper-case).

    + * + * @param deviceHandle the device to query + * @param extName the extension name + */ + @NativeType("ALCboolean") + public static boolean alcIsExtensionPresent(@NativeType("ALCdevice const *") long deviceHandle, @NativeType("ALCchar const *") CharSequence extName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(extName, true); + long extNameEncoded = stack.getPointerAddress(); + return nalcIsExtensionPresent(deviceHandle, extNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alcGetProcAddress ] --- + + /** Unsafe version of: {@link #alcGetProcAddress GetProcAddress} */ + public static long nalcGetProcAddress(long deviceHandle, long funcName) { + long __functionAddress = ALC.getICD().alcGetProcAddress; + return invokePPP(deviceHandle, funcName, __functionAddress); + } + + /** + * Retrieves extension entry points. + * + *

    The application is expected to verify the applicability of an extension or core function entry point before requesting it by name, by use of + * {@link #alcIsExtensionPresent IsExtensionPresent}.

    + * + *

    Entry points can be device specific, but are not context specific. Using a {@code NULL} device handle does not guarantee that the entry point is returned, + * even if available for one of the available devices.

    + * + * @param deviceHandle the device to query + * @param funcName the function name + */ + @NativeType("void *") + public static long alcGetProcAddress(@NativeType("ALCdevice const *") long deviceHandle, @NativeType("ALchar const *") ByteBuffer funcName) { + if (CHECKS) { + checkNT1(funcName); + } + return nalcGetProcAddress(deviceHandle, memAddress(funcName)); + } + + /** + * Retrieves extension entry points. + * + *

    The application is expected to verify the applicability of an extension or core function entry point before requesting it by name, by use of + * {@link #alcIsExtensionPresent IsExtensionPresent}.

    + * + *

    Entry points can be device specific, but are not context specific. Using a {@code NULL} device handle does not guarantee that the entry point is returned, + * even if available for one of the available devices.

    + * + * @param deviceHandle the device to query + * @param funcName the function name + */ + @NativeType("void *") + public static long alcGetProcAddress(@NativeType("ALCdevice const *") long deviceHandle, @NativeType("ALchar const *") CharSequence funcName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(funcName, true); + long funcNameEncoded = stack.getPointerAddress(); + return nalcGetProcAddress(deviceHandle, funcNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alcGetEnumValue ] --- + + /** Unsafe version of: {@link #alcGetEnumValue GetEnumValue} */ + public static int nalcGetEnumValue(long deviceHandle, long enumName) { + long __functionAddress = ALC.getICD().alcGetEnumValue; + return invokePPI(deviceHandle, enumName, __functionAddress); + } + + /** + * Returns extension enum values. + * + *

    Enumeration/token values are device independent, but tokens defined for extensions might not be present for a given device. Using a {@code NULL} handle is + * legal, but only the tokens defined by the AL core are guaranteed. Availability of extension tokens depends on the ALC extension.

    + * + * @param deviceHandle the device to query + * @param enumName the enum name + */ + @NativeType("ALCenum") + public static int alcGetEnumValue(@NativeType("ALCdevice const *") long deviceHandle, @NativeType("ALCchar const *") ByteBuffer enumName) { + if (CHECKS) { + checkNT1(enumName); + } + return nalcGetEnumValue(deviceHandle, memAddress(enumName)); + } + + /** + * Returns extension enum values. + * + *

    Enumeration/token values are device independent, but tokens defined for extensions might not be present for a given device. Using a {@code NULL} handle is + * legal, but only the tokens defined by the AL core are guaranteed. Availability of extension tokens depends on the ALC extension.

    + * + * @param deviceHandle the device to query + * @param enumName the enum name + */ + @NativeType("ALCenum") + public static int alcGetEnumValue(@NativeType("ALCdevice const *") long deviceHandle, @NativeType("ALCchar const *") CharSequence enumName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(enumName, true); + long enumNameEncoded = stack.getPointerAddress(); + return nalcGetEnumValue(deviceHandle, enumNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alcGetError ] --- + + /** + * Queries ALC errors. + * + *

    ALC uses the same conventions and mechanisms as AL for error handling. In particular, ALC does not use conventions derived from X11 (GLX) or Windows + * (WGL).

    + * + *

    Error conditions are specific to the device, and (like AL) a call to alcGetError resets the error state.

    + * + * @param deviceHandle the device to query + */ + @NativeType("ALCenum") + public static int alcGetError(@NativeType("ALCdevice *") long deviceHandle) { + long __functionAddress = ALC.getICD().alcGetError; + return invokePI(deviceHandle, __functionAddress); + } + + // --- [ alcGetString ] --- + + /** Unsafe version of: {@link #alcGetString GetString} */ + public static long nalcGetString(long deviceHandle, int token) { + long __functionAddress = ALC.getICD().alcGetString; + return invokePP(deviceHandle, token, __functionAddress); + } + + /** + * Obtains string value(s) from ALC. + * + *

    LWJGL note: Use {@link ALUtil#getStringList} for those tokens that return multiple values.

    + * + * @param deviceHandle the device to query + * @param token the information to query. One of:
    {@link #ALC_DEFAULT_DEVICE_SPECIFIER DEFAULT_DEVICE_SPECIFIER}{@link #ALC_DEVICE_SPECIFIER DEVICE_SPECIFIER}{@link #ALC_EXTENSIONS EXTENSIONS}
    {@link ALC11#ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER CAPTURE_DEFAULT_DEVICE_SPECIFIER}{@link ALC11#ALC_CAPTURE_DEVICE_SPECIFIER CAPTURE_DEVICE_SPECIFIER}
    + */ + @Nullable + @NativeType("ALCchar const *") + public static String alcGetString(@NativeType("ALCdevice *") long deviceHandle, @NativeType("ALCenum") int token) { + long __result = nalcGetString(deviceHandle, token); + return memUTF8Safe(__result); + } + + // --- [ alcGetIntegerv ] --- + + /** + * Unsafe version of: {@link #alcGetIntegerv GetIntegerv} + * + * @param size the size of the {@code dest} buffer + */ + public static void nalcGetIntegerv(long deviceHandle, int token, int size, long dest) { + long __functionAddress = ALC.getICD().alcGetIntegerv; + invokePPV(deviceHandle, token, size, dest, __functionAddress); + } + + /** + * Obtains integer value(s) from ALC. + * + * @param deviceHandle the device to query + * @param token the information to query. One of:
    {@link #ALC_MAJOR_VERSION MAJOR_VERSION}{@link #ALC_MINOR_VERSION MINOR_VERSION}{@link #ALC_ATTRIBUTES_SIZE ATTRIBUTES_SIZE}{@link #ALC_ALL_ATTRIBUTES ALL_ATTRIBUTES}{@link ALC11#ALC_CAPTURE_SAMPLES CAPTURE_SAMPLES}
    + * @param dest the destination buffer + */ + @NativeType("ALCvoid") + public static void alcGetIntegerv(@NativeType("ALCdevice *") long deviceHandle, @NativeType("ALCenum") int token, @NativeType("ALCint *") IntBuffer dest) { + nalcGetIntegerv(deviceHandle, token, dest.remaining(), memAddress(dest)); + } + + /** + * Obtains integer value(s) from ALC. + * + * @param deviceHandle the device to query + * @param token the information to query. One of:
    {@link #ALC_MAJOR_VERSION MAJOR_VERSION}{@link #ALC_MINOR_VERSION MINOR_VERSION}{@link #ALC_ATTRIBUTES_SIZE ATTRIBUTES_SIZE}{@link #ALC_ALL_ATTRIBUTES ALL_ATTRIBUTES}{@link ALC11#ALC_CAPTURE_SAMPLES CAPTURE_SAMPLES}
    + */ + @NativeType("ALCvoid") + public static int alcGetInteger(@NativeType("ALCdevice *") long deviceHandle, @NativeType("ALCenum") int token) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer dest = stack.callocInt(1); + nalcGetIntegerv(deviceHandle, token, 1, memAddress(dest)); + return dest.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #alcCreateContext CreateContext} */ + @NativeType("ALCcontext *") + public static long alcCreateContext(@NativeType("ALCdevice const *") long deviceHandle, @Nullable @NativeType("ALCint const *") int[] attrList) { + long __functionAddress = ALC.getICD().alcCreateContext; + if (CHECKS) { + check(deviceHandle); + checkNTSafe(attrList); + } + return invokePPP(deviceHandle, attrList, __functionAddress); + } + + /** Array version of: {@link #alcGetIntegerv GetIntegerv} */ + @NativeType("ALCvoid") + public static void alcGetIntegerv(@NativeType("ALCdevice *") long deviceHandle, @NativeType("ALCenum") int token, @NativeType("ALCint *") int[] dest) { + long __functionAddress = ALC.getICD().alcGetIntegerv; + invokePPV(deviceHandle, token, dest.length, dest, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC11.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC11.java new file mode 100644 index 000000000..e0b1fcfe4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALC11.java @@ -0,0 +1,253 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to ALC 1.1 functionality. */ +public class ALC11 extends ALC10 { + + /** Context creation attributes. */ + public static final int + ALC_MONO_SOURCES = 0x1010, + ALC_STEREO_SOURCES = 0x1011; + + /** String queries. */ + public static final int + ALC_DEFAULT_ALL_DEVICES_SPECIFIER = 0x1012, + ALC_ALL_DEVICES_SPECIFIER = 0x1013, + ALC_CAPTURE_DEVICE_SPECIFIER = 0x310, + ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER = 0x311; + + /** Integer queries. */ + public static final int ALC_CAPTURE_SAMPLES = 0x312; + + protected ALC11() { + throw new UnsupportedOperationException(); + } + + // --- [ alcCaptureOpenDevice ] --- + + /** Unsafe version of: {@link #alcCaptureOpenDevice CaptureOpenDevice} */ + public static long nalcCaptureOpenDevice(long deviceName, int frequency, int format, int samples) { + long __functionAddress = ALC.getICD().alcCaptureOpenDevice; + if (CHECKS) { + check(__functionAddress); + } + return invokePP(deviceName, frequency, format, samples, __functionAddress); + } + + /** + * Allows the application to connect to a capture device. + * + *

    The {@code deviceName} argument is a null terminated string that requests a certain device or device configuration. If {@code NULL} is specified, the implementation + * will provide an implementation specific default.

    + * + * @param deviceName the device or device configuration + * @param frequency the audio frequency + * @param format the audio format + * @param samples the number of sample frames to buffer in the AL + */ + @NativeType("ALCdevice *") + public static long alcCaptureOpenDevice(@Nullable @NativeType("ALCchar const *") ByteBuffer deviceName, @NativeType("ALCuint") int frequency, @NativeType("ALCenum") int format, @NativeType("ALCsizei") int samples) { + if (CHECKS) { + checkNT1Safe(deviceName); + } + return nalcCaptureOpenDevice(memAddressSafe(deviceName), frequency, format, samples); + } + + /** + * Allows the application to connect to a capture device. + * + *

    The {@code deviceName} argument is a null terminated string that requests a certain device or device configuration. If {@code NULL} is specified, the implementation + * will provide an implementation specific default.

    + * + * @param deviceName the device or device configuration + * @param frequency the audio frequency + * @param format the audio format + * @param samples the number of sample frames to buffer in the AL + */ + @NativeType("ALCdevice *") + public static long alcCaptureOpenDevice(@Nullable @NativeType("ALCchar const *") CharSequence deviceName, @NativeType("ALCuint") int frequency, @NativeType("ALCenum") int format, @NativeType("ALCsizei") int samples) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(deviceName, true); + long deviceNameEncoded = deviceName == null ? NULL : stack.getPointerAddress(); + return nalcCaptureOpenDevice(deviceNameEncoded, frequency, format, samples); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alcCaptureCloseDevice ] --- + + /** + * Allows the application to disconnect from a capture device. + * + * @param device the capture device to close + */ + @NativeType("ALCboolean") + public static boolean alcCaptureCloseDevice(@NativeType("ALCdevice *") long device) { + long __functionAddress = ALC.getICD().alcCaptureCloseDevice; + if (CHECKS) { + check(__functionAddress); + check(device); + } + return invokePZ(device, __functionAddress); + } + + // --- [ alcCaptureStart ] --- + + /** + * Starts recording audio on the specific capture device. + * + *

    Once started, the device will record audio to an internal ring buffer, the size of which was specified when opening the device. The application may + * query the capture device to discover how much data is currently available via the alcGetInteger with the ALC_CAPTURE_SAMPLES token. This will report the + * number of sample frames currently available.

    + * + * @param device the capture device + */ + @NativeType("ALCvoid") + public static void alcCaptureStart(@NativeType("ALCdevice *") long device) { + long __functionAddress = ALC.getICD().alcCaptureStart; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePV(device, __functionAddress); + } + + // --- [ alcCaptureStop ] --- + + /** + * Halts audio capturing without closing the capture device. + * + *

    The implementation is encouraged to optimize for this case. The amount of audio samples available after restarting a stopped capture device is reset to + * zero. The application does not need to stop the capture device to read from it.

    + * + * @param device the capture device + */ + @NativeType("ALCvoid") + public static void alcCaptureStop(@NativeType("ALCdevice *") long device) { + long __functionAddress = ALC.getICD().alcCaptureStop; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePV(device, __functionAddress); + } + + // --- [ alcCaptureSamples ] --- + + /** Unsafe version of: {@link #alcCaptureSamples CaptureSamples} */ + public static void nalcCaptureSamples(long device, long buffer, int samples) { + long __functionAddress = ALC.getICD().alcCaptureSamples; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePPV(device, buffer, samples, __functionAddress); + } + + /** + * Obtains captured audio samples from the AL. + * + *

    The implementation may defer conversion and resampling until this point. Requesting more sample frames than are currently available is an error.

    + * + * @param device the capture device + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to obtain + */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") ByteBuffer buffer, @NativeType("ALCsizei") int samples) { + nalcCaptureSamples(device, memAddress(buffer), samples); + } + + /** + * Obtains captured audio samples from the AL. + * + *

    The implementation may defer conversion and resampling until this point. Requesting more sample frames than are currently available is an error.

    + * + * @param device the capture device + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to obtain + */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") ShortBuffer buffer, @NativeType("ALCsizei") int samples) { + nalcCaptureSamples(device, memAddress(buffer), samples); + } + + /** + * Obtains captured audio samples from the AL. + * + *

    The implementation may defer conversion and resampling until this point. Requesting more sample frames than are currently available is an error.

    + * + * @param device the capture device + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to obtain + */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") IntBuffer buffer, @NativeType("ALCsizei") int samples) { + nalcCaptureSamples(device, memAddress(buffer), samples); + } + + /** + * Obtains captured audio samples from the AL. + * + *

    The implementation may defer conversion and resampling until this point. Requesting more sample frames than are currently available is an error.

    + * + * @param device the capture device + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to obtain + */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") FloatBuffer buffer, @NativeType("ALCsizei") int samples) { + nalcCaptureSamples(device, memAddress(buffer), samples); + } + + /** Array version of: {@link #alcCaptureSamples CaptureSamples} */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") short[] buffer, @NativeType("ALCsizei") int samples) { + long __functionAddress = ALC.getICD().alcCaptureSamples; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePPV(device, buffer, samples, __functionAddress); + } + + /** Array version of: {@link #alcCaptureSamples CaptureSamples} */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") int[] buffer, @NativeType("ALCsizei") int samples) { + long __functionAddress = ALC.getICD().alcCaptureSamples; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePPV(device, buffer, samples, __functionAddress); + } + + /** Array version of: {@link #alcCaptureSamples CaptureSamples} */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") float[] buffer, @NativeType("ALCsizei") int samples) { + long __functionAddress = ALC.getICD().alcCaptureSamples; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePPV(device, buffer, samples, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCCapabilities.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCCapabilities.java new file mode 100644 index 000000000..37cc53f57 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCCapabilities.java @@ -0,0 +1,297 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import org.lwjgl.system.*; +import java.util.Set; +import org.lwjgl.*; +import java.util.function.IntFunction; + +import static org.lwjgl.system.Checks.*; + +/** Defines the capabilities of the OpenAL Context API. */ +public final class ALCCapabilities { + + // ALC10 + public final long + alcOpenDevice, + alcCloseDevice, + alcCreateContext, + alcMakeContextCurrent, + alcProcessContext, + alcSuspendContext, + alcDestroyContext, + alcGetCurrentContext, + alcGetContextsDevice, + alcIsExtensionPresent, + alcGetProcAddress, + alcGetEnumValue, + alcGetError, + alcGetString, + alcGetIntegerv; + + // ALC11 + public final long + alcCaptureOpenDevice, + alcCaptureCloseDevice, + alcCaptureStart, + alcCaptureStop, + alcCaptureSamples; + + // EXT_thread_local_context + public final long + alcSetThreadContext, + alcGetThreadContext; + + // SOFT_device_clock + public final long + alcGetInteger64vSOFT; + + // SOFT_HRTF + public final long + alcGetStringiSOFT, + alcResetDeviceSOFT; + + // SOFT_loopback + public final long + alcLoopbackOpenDeviceSOFT, + alcIsRenderFormatSupportedSOFT, + alcRenderSamplesSOFT; + + // SOFT_pause_device + public final long + alcDevicePauseSOFT, + alcDeviceResumeSOFT; + + // SOFT_reopen_device + public final long + alcReopenDeviceSOFT; + + /** When true, {@link ALC10} is supported. */ + public final boolean OpenALC10; + /** When true, {@link ALC11} is supported. */ + public final boolean OpenALC11; + /** When true, {@link SOFTLoopbackBformat} is supported. */ + public final boolean OpenALC_SOFT_loopback_bformat; + /** When true, {@link EnumerateAllExt} is supported. */ + public final boolean ALC_ENUMERATE_ALL_EXT; + /** + * An OpenAL 1.1 implementation will always support the {@code ALC_ENUMERATION_EXT} extension. This extension provides for enumeration of the available OpenAL devices + * through {@link ALC10#alcGetString GetString}. An {@link ALC10#alcGetString GetString} query of {@link ALC10#ALC_DEVICE_SPECIFIER DEVICE_SPECIFIER} with a {@code NULL} device passed in will return a list of devices. Each + * device name will be separated by a single {@code NULL} character and the list will be terminated with two {@code NULL} characters. + */ + public final boolean ALC_ENUMERATION_EXT; + /** When true, {@link EXTCapture} is supported. */ + public final boolean ALC_EXT_CAPTURE; + /** When true, {@link EXTDedicated} is supported. */ + public final boolean ALC_EXT_DEDICATED; + /** When true, {@link EXTDefaultFilterOrder} is supported. */ + public final boolean ALC_EXT_DEFAULT_FILTER_ORDER; + /** When true, {@link EXTDisconnect} is supported. */ + public final boolean ALC_EXT_disconnect; + /** When true, {@link EXTEfx} is supported. */ + public final boolean ALC_EXT_EFX; + /** When true, {@link EXTThreadLocalContext} is supported. */ + public final boolean ALC_EXT_thread_local_context; + /** When true, {@link LOKIAudioChannel} is supported. */ + public final boolean ALC_LOKI_audio_channel; + /** When true, {@link SOFTDeviceClock} is supported. */ + public final boolean ALC_SOFT_device_clock; + /** When true, {@link SOFTHRTF} is supported. */ + public final boolean ALC_SOFT_HRTF; + /** When true, {@link SOFTLoopback} is supported. */ + public final boolean ALC_SOFT_loopback; + /** When true, {@link SOFTOutputLimiter} is supported. */ + public final boolean ALC_SOFT_output_limiter; + /** When true, {@link SOFTOutputMode} is supported. */ + public final boolean ALC_SOFT_output_mode; + /** When true, {@link SOFTPauseDevice} is supported. */ + public final boolean ALC_SOFT_pause_device; + /** When true, {@link SOFTReopenDevice} is supported. */ + public final boolean ALC_SOFT_reopen_device; + + /** Device handle. */ + final long device; + + /** Off-heap array of the above function addresses. */ + final PointerBuffer addresses; + + ALCCapabilities(FunctionProviderLocal provider, long device, Set ext, IntFunction bufferFactory) { + this.device = device; + + PointerBuffer caps = bufferFactory.apply(31); + + OpenALC10 = check_ALC10(provider, device, caps, ext); + OpenALC11 = check_ALC11(provider, device, caps, ext); + OpenALC_SOFT_loopback_bformat = ext.contains("OpenALC_SOFT_loopback_bformat"); + ALC_ENUMERATE_ALL_EXT = ext.contains("ALC_ENUMERATE_ALL_EXT"); + ALC_ENUMERATION_EXT = ext.contains("ALC_ENUMERATION_EXT"); + ALC_EXT_CAPTURE = check_EXT_CAPTURE(provider, device, caps, ext); + ALC_EXT_DEDICATED = ext.contains("ALC_EXT_DEDICATED"); + ALC_EXT_DEFAULT_FILTER_ORDER = ext.contains("ALC_EXT_DEFAULT_FILTER_ORDER"); + ALC_EXT_disconnect = ext.contains("ALC_EXT_disconnect"); + ALC_EXT_EFX = ext.contains("ALC_EXT_EFX"); + ALC_EXT_thread_local_context = check_EXT_thread_local_context(provider, device, caps, ext); + ALC_LOKI_audio_channel = ext.contains("ALC_LOKI_audio_channel"); + ALC_SOFT_device_clock = check_SOFT_device_clock(provider, device, caps, ext); + ALC_SOFT_HRTF = check_SOFT_HRTF(provider, device, caps, ext); + ALC_SOFT_loopback = check_SOFT_loopback(provider, device, caps, ext); + ALC_SOFT_output_limiter = ext.contains("ALC_SOFT_output_limiter"); + ALC_SOFT_output_mode = ext.contains("ALC_SOFT_output_mode"); + ALC_SOFT_pause_device = check_SOFT_pause_device(provider, device, caps, ext); + ALC_SOFT_reopen_device = check_SOFT_reopen_device(provider, device, caps, ext); + + alcOpenDevice = caps.get(0); + alcCloseDevice = caps.get(1); + alcCreateContext = caps.get(2); + alcMakeContextCurrent = caps.get(3); + alcProcessContext = caps.get(4); + alcSuspendContext = caps.get(5); + alcDestroyContext = caps.get(6); + alcGetCurrentContext = caps.get(7); + alcGetContextsDevice = caps.get(8); + alcIsExtensionPresent = caps.get(9); + alcGetProcAddress = caps.get(10); + alcGetEnumValue = caps.get(11); + alcGetError = caps.get(12); + alcGetString = caps.get(13); + alcGetIntegerv = caps.get(14); + alcCaptureOpenDevice = caps.get(15); + alcCaptureCloseDevice = caps.get(16); + alcCaptureStart = caps.get(17); + alcCaptureStop = caps.get(18); + alcCaptureSamples = caps.get(19); + alcSetThreadContext = caps.get(20); + alcGetThreadContext = caps.get(21); + alcGetInteger64vSOFT = caps.get(22); + alcGetStringiSOFT = caps.get(23); + alcResetDeviceSOFT = caps.get(24); + alcLoopbackOpenDeviceSOFT = caps.get(25); + alcIsRenderFormatSupportedSOFT = caps.get(26); + alcRenderSamplesSOFT = caps.get(27); + alcDevicePauseSOFT = caps.get(28); + alcDeviceResumeSOFT = caps.get(29); + alcReopenDeviceSOFT = caps.get(30); + + addresses = ThreadLocalUtil.setupAddressBuffer(caps); + } + + /** Returns the buffer of OpenAL function pointers. */ + public PointerBuffer getAddressBuffer() { + return addresses; + } + + private static boolean check_ALC10(FunctionProviderLocal provider, long device, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenALC10")) { + return false; + } + + return checkFunctions(provider, device, caps, new int[] { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 + }, + "alcOpenDevice", "alcCloseDevice", "alcCreateContext", "alcMakeContextCurrent", "alcProcessContext", "alcSuspendContext", "alcDestroyContext", + "alcGetCurrentContext", "alcGetContextsDevice", "alcIsExtensionPresent", "alcGetProcAddress", "alcGetEnumValue", "alcGetError", "alcGetString", + "alcGetIntegerv" + ) || reportMissing("ALC", "OpenALC10"); + } + + private static boolean check_ALC11(FunctionProviderLocal provider, long device, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenALC11")) { + return false; + } + + return checkFunctions(provider, device, caps, new int[] { + 15, 16, 17, 18, 19 + }, + "alcCaptureOpenDevice", "alcCaptureCloseDevice", "alcCaptureStart", "alcCaptureStop", "alcCaptureSamples" + ) || reportMissing("ALC", "OpenALC11"); + } + + private static boolean check_EXT_CAPTURE(FunctionProviderLocal provider, long device, PointerBuffer caps, Set ext) { + if (!ext.contains("ALC_EXT_CAPTURE")) { + return false; + } + + return checkFunctions(provider, device, caps, new int[] { + 15, 16, 17, 18, 19 + }, + "alcCaptureOpenDevice", "alcCaptureCloseDevice", "alcCaptureStart", "alcCaptureStop", "alcCaptureSamples" + ) || reportMissing("ALC", "ALC_EXT_CAPTURE"); + } + + private static boolean check_EXT_thread_local_context(FunctionProviderLocal provider, long device, PointerBuffer caps, Set ext) { + if (!ext.contains("ALC_EXT_thread_local_context")) { + return false; + } + + return checkFunctions(provider, device, caps, new int[] { + 20, 21 + }, + "alcSetThreadContext", "alcGetThreadContext" + ) || reportMissing("ALC", "ALC_EXT_thread_local_context"); + } + + private static boolean check_SOFT_device_clock(FunctionProviderLocal provider, long device, PointerBuffer caps, Set ext) { + if (!ext.contains("ALC_SOFT_device_clock")) { + return false; + } + + return checkFunctions(provider, device, caps, new int[] { + 22 + }, + "alcGetInteger64vSOFT" + ) || reportMissing("ALC", "ALC_SOFT_device_clock"); + } + + private static boolean check_SOFT_HRTF(FunctionProviderLocal provider, long device, PointerBuffer caps, Set ext) { + if (!ext.contains("ALC_SOFT_HRTF")) { + return false; + } + + return checkFunctions(provider, device, caps, new int[] { + 23, 24 + }, + "alcGetStringiSOFT", "alcResetDeviceSOFT" + ) || reportMissing("ALC", "ALC_SOFT_HRTF"); + } + + private static boolean check_SOFT_loopback(FunctionProviderLocal provider, long device, PointerBuffer caps, Set ext) { + if (!ext.contains("ALC_SOFT_loopback")) { + return false; + } + + return checkFunctions(provider, device, caps, new int[] { + 25, 26, 27 + }, + "alcLoopbackOpenDeviceSOFT", "alcIsRenderFormatSupportedSOFT", "alcRenderSamplesSOFT" + ) || reportMissing("ALC", "ALC_SOFT_loopback"); + } + + private static boolean check_SOFT_pause_device(FunctionProviderLocal provider, long device, PointerBuffer caps, Set ext) { + if (!ext.contains("ALC_SOFT_pause_device")) { + return false; + } + + return checkFunctions(provider, device, caps, new int[] { + 28, 29 + }, + "alcDevicePauseSOFT", "alcDeviceResumeSOFT" + ) || reportMissing("ALC", "ALC_SOFT_pause_device"); + } + + private static boolean check_SOFT_reopen_device(FunctionProviderLocal provider, long device, PointerBuffer caps, Set ext) { + if (!ext.contains("ALC_SOFT_reopen_device")) { + return false; + } + + return checkFunctions(provider, device, caps, new int[] { + 30 + }, + "alcReopenDeviceSOFT" + ) || reportMissing("ALC", "ALC_SOFT_reopen_device"); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCapabilities.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCapabilities.java new file mode 100644 index 000000000..c44403609 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCapabilities.java @@ -0,0 +1,630 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import org.lwjgl.system.*; +import java.util.Set; +import org.lwjgl.*; +import java.util.function.IntFunction; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; + +/** Defines the capabilities of an OpenAL context. */ +public final class ALCapabilities { + + // AL10 + public final long + alGetError, + alEnable, + alDisable, + alIsEnabled, + alGetBoolean, + alGetInteger, + alGetFloat, + alGetDouble, + alGetBooleanv, + alGetIntegerv, + alGetFloatv, + alGetDoublev, + alGetString, + alDistanceModel, + alDopplerFactor, + alDopplerVelocity, + alListenerf, + alListeneri, + alListener3f, + alListenerfv, + alGetListenerf, + alGetListeneri, + alGetListener3f, + alGetListenerfv, + alGenSources, + alDeleteSources, + alIsSource, + alSourcef, + alSource3f, + alSourcefv, + alSourcei, + alGetSourcef, + alGetSource3f, + alGetSourcefv, + alGetSourcei, + alGetSourceiv, + alSourceQueueBuffers, + alSourceUnqueueBuffers, + alSourcePlay, + alSourcePause, + alSourceStop, + alSourceRewind, + alSourcePlayv, + alSourcePausev, + alSourceStopv, + alSourceRewindv, + alGenBuffers, + alDeleteBuffers, + alIsBuffer, + alGetBufferf, + alGetBufferi, + alBufferData, + alGetEnumValue, + alGetProcAddress, + alIsExtensionPresent; + + // AL11 + public final long + alListener3i, + alGetListeneriv, + alSource3i, + alListeneriv, + alSourceiv, + alBufferf, + alBuffer3f, + alBufferfv, + alBufferi, + alBuffer3i, + alBufferiv, + alGetBufferiv, + alGetBufferfv, + alSpeedOfSound; + + // EXT_EFX + public final long + alGenEffects, + alDeleteEffects, + alIsEffect, + alEffecti, + alEffectiv, + alEffectf, + alEffectfv, + alGetEffecti, + alGetEffectiv, + alGetEffectf, + alGetEffectfv, + alGenFilters, + alDeleteFilters, + alIsFilter, + alFilteri, + alFilteriv, + alFilterf, + alFilterfv, + alGetFilteri, + alGetFilteriv, + alGetFilterf, + alGetFilterfv, + alGenAuxiliaryEffectSlots, + alDeleteAuxiliaryEffectSlots, + alIsAuxiliaryEffectSlot, + alAuxiliaryEffectSloti, + alAuxiliaryEffectSlotiv, + alAuxiliaryEffectSlotf, + alAuxiliaryEffectSlotfv, + alGetAuxiliaryEffectSloti, + alGetAuxiliaryEffectSlotiv, + alGetAuxiliaryEffectSlotf, + alGetAuxiliaryEffectSlotfv; + + // EXT_STATIC_BUFFER + public final long + alBufferDataStatic; + + // SOFT_buffer_samples + public final long + alBufferSamplesSOFT, + alBufferSubSamplesSOFT, + alGetBufferSamplesSOFT, + alIsBufferFormatSupportedSOFT; + + // SOFT_buffer_sub_data + public final long + alBufferSubDataSOFT; + + // SOFT_callback_buffer + public final long + alBufferCallbackSOFT, + alGetBufferPtrSOFT, + alGetBuffer3PtrSOFT, + alGetBufferPtrvSOFT; + + // SOFT_deferred_updates + public final long + alDeferUpdatesSOFT, + alProcessUpdatesSOFT; + + // SOFT_events + public final long + alEventControlSOFT, + alEventCallbackSOFT, + alGetPointerSOFT, + alGetPointervSOFT; + + // SOFT_source_latency + public final long + alSourcedSOFT, + alSource3dSOFT, + alSourcedvSOFT, + alGetSourcedSOFT, + alGetSource3dSOFT, + alGetSourcedvSOFT, + alSourcei64SOFT, + alSource3i64SOFT, + alSourcei64vSOFT, + alGetSourcei64SOFT, + alGetSource3i64SOFT, + alGetSourcei64vSOFT; + + // SOFT_source_resampler + public final long + alGetStringiSOFT; + + // SOFT_source_start_delay + public final long + alSourcePlayAtTimeSOFT, + alSourcePlayAtTimevSOFT; + + /** When true, {@link AL10} is supported. */ + public final boolean OpenAL10; + /** When true, {@link AL11} is supported. */ + public final boolean OpenAL11; + /** When true, {@link EXTAlaw} is supported. */ + public final boolean AL_EXT_ALAW; + /** When true, {@link EXTBFormat} is supported. */ + public final boolean AL_EXT_BFORMAT; + /** When true, {@link EXTDouble} is supported. */ + public final boolean AL_EXT_DOUBLE; + /** When true, {@link EXTEfx} is supported. */ + public final boolean ALC_EXT_EFX; + /** When true, {@link EXTExponentDistance} is supported. */ + public final boolean AL_EXT_EXPONENT_DISTANCE; + /** When true, {@link EXTFloat32} is supported. */ + public final boolean AL_EXT_FLOAT32; + /** When true, {@link EXTIma4} is supported. */ + public final boolean AL_EXT_IMA4; + /** When true, {@link EXTLinearDistance} is supported. */ + public final boolean AL_EXT_LINEAR_DISTANCE; + /** When true, {@link EXTMCFormats} is supported. */ + public final boolean AL_EXT_MCFORMATS; + /** When true, {@link EXTMulaw} is supported. */ + public final boolean AL_EXT_MULAW; + /** When true, {@link EXTMulawBFormat} is supported. */ + public final boolean AL_EXT_MULAW_BFORMAT; + /** When true, {@link EXTMulawMCFormats} is supported. */ + public final boolean AL_EXT_MULAW_MCFORMATS; + /** When true, {@link EXTOffset} is supported. */ + public final boolean AL_EXT_OFFSET; + /** When true, {@link EXTSourceDistanceModel} is supported. */ + public final boolean AL_EXT_source_distance_model; + /** When true, {@link EXTSourceRadius} is supported. */ + public final boolean AL_EXT_SOURCE_RADIUS; + /** When true, {@link EXTStaticBuffer} is supported. */ + public final boolean AL_EXT_STATIC_BUFFER; + /** When true, {@link EXTStereoAngles} is supported. */ + public final boolean AL_EXT_STEREO_ANGLES; + /** When true, {@link EXTVorbis} is supported. */ + public final boolean AL_EXT_vorbis; + /** When true, {@link LOKIIMAADPCM} is supported. */ + public final boolean AL_LOKI_IMA_ADPCM; + /** When true, {@link LOKIQuadriphonic} is supported. */ + public final boolean AL_LOKI_quadriphonic; + /** When true, {@link LOKIWAVEFormat} is supported. */ + public final boolean AL_LOKI_WAVE_format; + /** When true, {@link SOFTBformatEx} is supported. */ + public final boolean AL_SOFT_bformat_ex; + /** When true, {@link SOFTBlockAlignment} is supported. */ + public final boolean AL_SOFT_block_alignment; + /** When true, {@link SOFTBufferLengthQuery} is supported. */ + public final boolean AL_SOFT_buffer_length_query; + /** When true, {@link SOFTBufferSamples} is supported. */ + public final boolean AL_SOFT_buffer_samples; + /** When true, {@link SOFTBufferSubData} is supported. */ + public final boolean AL_SOFT_buffer_sub_data; + /** When true, {@link SOFTCallbackBuffer} is supported. */ + public final boolean AL_SOFT_callback_buffer; + /** When true, {@link SOFTDeferredUpdates} is supported. */ + public final boolean AL_SOFT_deferred_updates; + /** When true, {@link SOFTDirectChannels} is supported. */ + public final boolean AL_SOFT_direct_channels; + /** When true, {@link SOFTDirectChannelsRemix} is supported. */ + public final boolean AL_SOFT_direct_channels_remix; + /** When true, {@link SOFTEffectTarget} is supported. */ + public final boolean AL_SOFT_effect_target; + /** When true, {@link SOFTEvents} is supported. */ + public final boolean AL_SOFT_events; + /** When true, {@link SOFTGainClampEx} is supported. */ + public final boolean AL_SOFT_gain_clamp_ex; + /** When true, {@link SOFTLoopPoints} is supported. */ + public final boolean AL_SOFT_loop_points; + /** When true, {@link SOFTMSADPCM} is supported. */ + public final boolean AL_SOFT_MSADPCM; + /** When true, {@link SOFTSourceLatency} is supported. */ + public final boolean AL_SOFT_source_latency; + /** When true, {@link SOFTSourceLength} is supported. */ + public final boolean AL_SOFT_source_length; + /** When true, {@link SOFTSourceResampler} is supported. */ + public final boolean AL_SOFT_source_resampler; + /** When true, {@link SOFTSourceSpatialize} is supported. */ + public final boolean AL_SOFT_source_spatialize; + /** When true, {@link SOFTSourceStartDelay} is supported. */ + public final boolean AL_SOFT_source_start_delay; + /** When true, {@link SOFTUHJ} is supported. */ + public final boolean AL_SOFT_UHJ; + /** When true, {@link SOFTUHJEx} is supported. */ + public final boolean AL_SOFT_UHJ_ex; + /** When true, {@link SOFTXHoldOnDisconnect} is supported. */ + public final boolean AL_SOFTX_hold_on_disconnect; + + /** Off-heap array of the above function addresses. */ + final PointerBuffer addresses; + + ALCapabilities(FunctionProvider provider, Set ext, IntFunction bufferFactory) { + PointerBuffer caps = bufferFactory.apply(133); + + OpenAL10 = check_AL10(provider, caps, ext); + OpenAL11 = check_AL11(provider, caps, ext); + AL_EXT_ALAW = ext.contains("AL_EXT_ALAW"); + AL_EXT_BFORMAT = ext.contains("AL_EXT_BFORMAT"); + AL_EXT_DOUBLE = ext.contains("AL_EXT_DOUBLE"); + ALC_EXT_EFX = check_EXT_EFX(provider, caps, ext); + AL_EXT_EXPONENT_DISTANCE = ext.contains("AL_EXT_EXPONENT_DISTANCE"); + AL_EXT_FLOAT32 = ext.contains("AL_EXT_FLOAT32"); + AL_EXT_IMA4 = ext.contains("AL_EXT_IMA4"); + AL_EXT_LINEAR_DISTANCE = ext.contains("AL_EXT_LINEAR_DISTANCE"); + AL_EXT_MCFORMATS = ext.contains("AL_EXT_MCFORMATS"); + AL_EXT_MULAW = ext.contains("AL_EXT_MULAW"); + AL_EXT_MULAW_BFORMAT = ext.contains("AL_EXT_MULAW_BFORMAT"); + AL_EXT_MULAW_MCFORMATS = ext.contains("AL_EXT_MULAW_MCFORMATS"); + AL_EXT_OFFSET = ext.contains("AL_EXT_OFFSET"); + AL_EXT_source_distance_model = ext.contains("AL_EXT_source_distance_model"); + AL_EXT_SOURCE_RADIUS = ext.contains("AL_EXT_SOURCE_RADIUS"); + AL_EXT_STATIC_BUFFER = check_EXT_STATIC_BUFFER(provider, caps, ext); + AL_EXT_STEREO_ANGLES = ext.contains("AL_EXT_STEREO_ANGLES"); + AL_EXT_vorbis = ext.contains("AL_EXT_vorbis"); + AL_LOKI_IMA_ADPCM = ext.contains("AL_LOKI_IMA_ADPCM"); + AL_LOKI_quadriphonic = ext.contains("AL_LOKI_quadriphonic"); + AL_LOKI_WAVE_format = ext.contains("AL_LOKI_WAVE_format"); + AL_SOFT_bformat_ex = ext.contains("AL_SOFT_bformat_ex"); + AL_SOFT_block_alignment = ext.contains("AL_SOFT_block_alignment"); + AL_SOFT_buffer_length_query = ext.contains("AL_SOFT_buffer_length_query"); + AL_SOFT_buffer_samples = check_SOFT_buffer_samples(provider, caps, ext); + AL_SOFT_buffer_sub_data = check_SOFT_buffer_sub_data(provider, caps, ext); + AL_SOFT_callback_buffer = check_SOFT_callback_buffer(provider, caps, ext); + AL_SOFT_deferred_updates = check_SOFT_deferred_updates(provider, caps, ext); + AL_SOFT_direct_channels = ext.contains("AL_SOFT_direct_channels"); + AL_SOFT_direct_channels_remix = ext.contains("AL_SOFT_direct_channels_remix"); + AL_SOFT_effect_target = ext.contains("AL_SOFT_effect_target"); + AL_SOFT_events = check_SOFT_events(provider, caps, ext); + AL_SOFT_gain_clamp_ex = ext.contains("AL_SOFT_gain_clamp_ex"); + AL_SOFT_loop_points = ext.contains("AL_SOFT_loop_points"); + AL_SOFT_MSADPCM = ext.contains("AL_SOFT_MSADPCM"); + AL_SOFT_source_latency = check_SOFT_source_latency(provider, caps, ext); + AL_SOFT_source_length = ext.contains("AL_SOFT_source_length"); + AL_SOFT_source_resampler = check_SOFT_source_resampler(provider, caps, ext); + AL_SOFT_source_spatialize = ext.contains("AL_SOFT_source_spatialize"); + AL_SOFT_source_start_delay = check_SOFT_source_start_delay(provider, caps, ext); + AL_SOFT_UHJ = ext.contains("AL_SOFT_UHJ"); + AL_SOFT_UHJ_ex = ext.contains("AL_SOFT_UHJ_ex"); + AL_SOFTX_hold_on_disconnect = ext.contains("AL_SOFTX_hold_on_disconnect"); + + alGetError = caps.get(0); + alEnable = caps.get(1); + alDisable = caps.get(2); + alIsEnabled = caps.get(3); + alGetBoolean = caps.get(4); + alGetInteger = caps.get(5); + alGetFloat = caps.get(6); + alGetDouble = caps.get(7); + alGetBooleanv = caps.get(8); + alGetIntegerv = caps.get(9); + alGetFloatv = caps.get(10); + alGetDoublev = caps.get(11); + alGetString = caps.get(12); + alDistanceModel = caps.get(13); + alDopplerFactor = caps.get(14); + alDopplerVelocity = caps.get(15); + alListenerf = caps.get(16); + alListeneri = caps.get(17); + alListener3f = caps.get(18); + alListenerfv = caps.get(19); + alGetListenerf = caps.get(20); + alGetListeneri = caps.get(21); + alGetListener3f = caps.get(22); + alGetListenerfv = caps.get(23); + alGenSources = caps.get(24); + alDeleteSources = caps.get(25); + alIsSource = caps.get(26); + alSourcef = caps.get(27); + alSource3f = caps.get(28); + alSourcefv = caps.get(29); + alSourcei = caps.get(30); + alGetSourcef = caps.get(31); + alGetSource3f = caps.get(32); + alGetSourcefv = caps.get(33); + alGetSourcei = caps.get(34); + alGetSourceiv = caps.get(35); + alSourceQueueBuffers = caps.get(36); + alSourceUnqueueBuffers = caps.get(37); + alSourcePlay = caps.get(38); + alSourcePause = caps.get(39); + alSourceStop = caps.get(40); + alSourceRewind = caps.get(41); + alSourcePlayv = caps.get(42); + alSourcePausev = caps.get(43); + alSourceStopv = caps.get(44); + alSourceRewindv = caps.get(45); + alGenBuffers = caps.get(46); + alDeleteBuffers = caps.get(47); + alIsBuffer = caps.get(48); + alGetBufferf = caps.get(49); + alGetBufferi = caps.get(50); + alBufferData = caps.get(51); + alGetEnumValue = caps.get(52); + alGetProcAddress = caps.get(53); + alIsExtensionPresent = caps.get(54); + alListener3i = caps.get(55); + alGetListeneriv = caps.get(56); + alSource3i = caps.get(57); + alListeneriv = caps.get(58); + alSourceiv = caps.get(59); + alBufferf = caps.get(60); + alBuffer3f = caps.get(61); + alBufferfv = caps.get(62); + alBufferi = caps.get(63); + alBuffer3i = caps.get(64); + alBufferiv = caps.get(65); + alGetBufferiv = caps.get(66); + alGetBufferfv = caps.get(67); + alSpeedOfSound = caps.get(68); + alGenEffects = caps.get(69); + alDeleteEffects = caps.get(70); + alIsEffect = caps.get(71); + alEffecti = caps.get(72); + alEffectiv = caps.get(73); + alEffectf = caps.get(74); + alEffectfv = caps.get(75); + alGetEffecti = caps.get(76); + alGetEffectiv = caps.get(77); + alGetEffectf = caps.get(78); + alGetEffectfv = caps.get(79); + alGenFilters = caps.get(80); + alDeleteFilters = caps.get(81); + alIsFilter = caps.get(82); + alFilteri = caps.get(83); + alFilteriv = caps.get(84); + alFilterf = caps.get(85); + alFilterfv = caps.get(86); + alGetFilteri = caps.get(87); + alGetFilteriv = caps.get(88); + alGetFilterf = caps.get(89); + alGetFilterfv = caps.get(90); + alGenAuxiliaryEffectSlots = caps.get(91); + alDeleteAuxiliaryEffectSlots = caps.get(92); + alIsAuxiliaryEffectSlot = caps.get(93); + alAuxiliaryEffectSloti = caps.get(94); + alAuxiliaryEffectSlotiv = caps.get(95); + alAuxiliaryEffectSlotf = caps.get(96); + alAuxiliaryEffectSlotfv = caps.get(97); + alGetAuxiliaryEffectSloti = caps.get(98); + alGetAuxiliaryEffectSlotiv = caps.get(99); + alGetAuxiliaryEffectSlotf = caps.get(100); + alGetAuxiliaryEffectSlotfv = caps.get(101); + alBufferDataStatic = caps.get(102); + alBufferSamplesSOFT = caps.get(103); + alBufferSubSamplesSOFT = caps.get(104); + alGetBufferSamplesSOFT = caps.get(105); + alIsBufferFormatSupportedSOFT = caps.get(106); + alBufferSubDataSOFT = caps.get(107); + alBufferCallbackSOFT = caps.get(108); + alGetBufferPtrSOFT = caps.get(109); + alGetBuffer3PtrSOFT = caps.get(110); + alGetBufferPtrvSOFT = caps.get(111); + alDeferUpdatesSOFT = caps.get(112); + alProcessUpdatesSOFT = caps.get(113); + alEventControlSOFT = caps.get(114); + alEventCallbackSOFT = caps.get(115); + alGetPointerSOFT = caps.get(116); + alGetPointervSOFT = caps.get(117); + alSourcedSOFT = caps.get(118); + alSource3dSOFT = caps.get(119); + alSourcedvSOFT = caps.get(120); + alGetSourcedSOFT = caps.get(121); + alGetSource3dSOFT = caps.get(122); + alGetSourcedvSOFT = caps.get(123); + alSourcei64SOFT = caps.get(124); + alSource3i64SOFT = caps.get(125); + alSourcei64vSOFT = caps.get(126); + alGetSourcei64SOFT = caps.get(127); + alGetSource3i64SOFT = caps.get(128); + alGetSourcei64vSOFT = caps.get(129); + alGetStringiSOFT = caps.get(130); + alSourcePlayAtTimeSOFT = caps.get(131); + alSourcePlayAtTimevSOFT = caps.get(132); + + addresses = ThreadLocalUtil.setupAddressBuffer(caps); + } + + /** Returns the buffer of OpenAL function pointers. */ + public PointerBuffer getAddressBuffer() { + return addresses; + } + + private static boolean check_AL10(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenAL10")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54 + }, + "alGetError", "alEnable", "alDisable", "alIsEnabled", "alGetBoolean", "alGetInteger", "alGetFloat", "alGetDouble", "alGetBooleanv", "alGetIntegerv", + "alGetFloatv", "alGetDoublev", "alGetString", "alDistanceModel", "alDopplerFactor", "alDopplerVelocity", "alListenerf", "alListeneri", + "alListener3f", "alListenerfv", "alGetListenerf", "alGetListeneri", "alGetListener3f", "alGetListenerfv", "alGenSources", "alDeleteSources", + "alIsSource", "alSourcef", "alSource3f", "alSourcefv", "alSourcei", "alGetSourcef", "alGetSource3f", "alGetSourcefv", "alGetSourcei", + "alGetSourceiv", "alSourceQueueBuffers", "alSourceUnqueueBuffers", "alSourcePlay", "alSourcePause", "alSourceStop", "alSourceRewind", + "alSourcePlayv", "alSourcePausev", "alSourceStopv", "alSourceRewindv", "alGenBuffers", "alDeleteBuffers", "alIsBuffer", "alGetBufferf", + "alGetBufferi", "alBufferData", "alGetEnumValue", "alGetProcAddress", "alIsExtensionPresent" + ) || reportMissing("AL", "OpenAL10"); + } + + private static boolean check_AL11(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenAL11")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68 + }, + "alListener3i", "alGetListeneriv", "alSource3i", "alListeneriv", "alSourceiv", "alBufferf", "alBuffer3f", "alBufferfv", "alBufferi", "alBuffer3i", + "alBufferiv", "alGetBufferiv", "alGetBufferfv", "alSpeedOfSound" + ) || reportMissing("AL", "OpenAL11"); + } + + private static boolean check_EXT_EFX(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("ALC_EXT_EFX")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101 + }, + "alGenEffects", "alDeleteEffects", "alIsEffect", "alEffecti", "alEffectiv", "alEffectf", "alEffectfv", "alGetEffecti", "alGetEffectiv", + "alGetEffectf", "alGetEffectfv", "alGenFilters", "alDeleteFilters", "alIsFilter", "alFilteri", "alFilteriv", "alFilterf", "alFilterfv", + "alGetFilteri", "alGetFilteriv", "alGetFilterf", "alGetFilterfv", "alGenAuxiliaryEffectSlots", "alDeleteAuxiliaryEffectSlots", + "alIsAuxiliaryEffectSlot", "alAuxiliaryEffectSloti", "alAuxiliaryEffectSlotiv", "alAuxiliaryEffectSlotf", "alAuxiliaryEffectSlotfv", + "alGetAuxiliaryEffectSloti", "alGetAuxiliaryEffectSlotiv", "alGetAuxiliaryEffectSlotf", "alGetAuxiliaryEffectSlotfv" + ) || reportMissing("AL", "ALC_EXT_EFX"); + } + + private static boolean check_EXT_STATIC_BUFFER(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("AL_EXT_STATIC_BUFFER")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 102 + }, + "alBufferDataStatic" + ) || reportMissing("AL", "AL_EXT_STATIC_BUFFER"); + } + + private static boolean check_SOFT_buffer_samples(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("AL_SOFT_buffer_samples")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 103, 104, 105, 106 + }, + "alBufferSamplesSOFT", "alBufferSubSamplesSOFT", "alGetBufferSamplesSOFT", "alIsBufferFormatSupportedSOFT" + ) || reportMissing("AL", "AL_SOFT_buffer_samples"); + } + + private static boolean check_SOFT_buffer_sub_data(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("AL_SOFT_buffer_sub_data")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 107 + }, + "alBufferSubDataSOFT" + ) || reportMissing("AL", "AL_SOFT_buffer_sub_data"); + } + + private static boolean check_SOFT_callback_buffer(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("AL_SOFT_callback_buffer")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 108, 109, 110, 111 + }, + "alBufferCallbackSOFT", "alGetBufferPtrSOFT", "alGetBuffer3PtrSOFT", "alGetBufferPtrvSOFT" + ) || reportMissing("AL", "AL_SOFT_callback_buffer"); + } + + private static boolean check_SOFT_deferred_updates(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("AL_SOFT_deferred_updates")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 112, 113 + }, + "alDeferUpdatesSOFT", "alProcessUpdatesSOFT" + ) || reportMissing("AL", "AL_SOFT_deferred_updates"); + } + + private static boolean check_SOFT_events(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("AL_SOFT_events")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 114, 115, 116, 117 + }, + "alEventControlSOFT", "alEventCallbackSOFT", "alGetPointerSOFT", "alGetPointervSOFT" + ) || reportMissing("AL", "AL_SOFT_events"); + } + + private static boolean check_SOFT_source_latency(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("AL_SOFT_source_latency")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129 + }, + "alSourcedSOFT", "alSource3dSOFT", "alSourcedvSOFT", "alGetSourcedSOFT", "alGetSource3dSOFT", "alGetSourcedvSOFT", "alSourcei64SOFT", + "alSource3i64SOFT", "alSourcei64vSOFT", "alGetSourcei64SOFT", "alGetSource3i64SOFT", "alGetSourcei64vSOFT" + ) || reportMissing("AL", "AL_SOFT_source_latency"); + } + + private static boolean check_SOFT_source_resampler(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("AL_SOFT_source_resampler")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 130 + }, + "alGetStringiSOFT" + ) || reportMissing("AL", "AL_SOFT_source_resampler"); + } + + private static boolean check_SOFT_source_start_delay(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("AL_SOFT_source_start_delay")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 131, 132 + }, + "alSourcePlayAtTimeSOFT", "alSourcePlayAtTimevSOFT" + ) || reportMissing("AL", "AL_SOFT_source_start_delay"); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCcontext.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCcontext.java new file mode 100644 index 000000000..3bf66dbea --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCcontext.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2002-2008 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.openal; + +import org.lwjgl.BufferUtils; + +import java.nio.IntBuffer; + +/** + * The ALCcontext class represents a context opened in OpenAL space. + * + * All operations of the AL core API affect a current AL context. Within the scope of AL, + * the ALC is implied - it is not visible as a handle or function parameter. Only one AL + * Context per process can be current at a time. Applications maintaining multiple AL + * Contexts, whether threaded or not, have to set the current context accordingly. + * Applications can have multiple threads that share one more or contexts. In other words, + * AL and ALC are threadsafe. + * + * @author Brian Matzon + * @version $Revision$ + * $Id$ + */ +public final class ALCcontext { + + /** Address of actual context */ + final long context; + + /** Whether this context is valid */ + private boolean valid; + + /** + * Creates a new instance of ALCcontext + * + * @param context address of actual context + */ + ALCcontext(long context) { + this.context = context; + this.valid = true; + } + + /* + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object context) { + if(context instanceof ALCcontext) { + return ((ALCcontext)context).context == this.context; + } + return super.equals(context); + } + + /** + * Creates an attribute list in a ByteBuffer + * @param contextFrequency Frequency to add + * @param contextRefresh Refresh rate to add + * @param contextSynchronized Whether to synchronize the context + * @return attribute list + */ + static IntBuffer createAttributeList(int contextFrequency, int contextRefresh, int contextSynchronized) { + IntBuffer attribList = BufferUtils.createIntBuffer(7); + + attribList.put(ALC10.ALC_FREQUENCY); + attribList.put(contextFrequency); + attribList.put(ALC10.ALC_REFRESH); + attribList.put(contextRefresh); + attribList.put(ALC10.ALC_SYNC); + attribList.put(contextSynchronized); + attribList.put(0); //terminating int + + return attribList; + } + + /** + * Marks this context as invalid + * + */ + void setInvalid() { + valid = false; + } + + /** + * @return true if this context is still valid + */ + public boolean isValid() { + return valid; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCdevice.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCdevice.java new file mode 100644 index 000000000..9cc06a97a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALCdevice.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2002-2008 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.openal; + +import java.util.HashMap; + +/** + * The ALCdevice class represents a device opened in OpenAL space. + * + * ALC introduces the notion of a Device. A Device can be, depending on the + * implementation, a hardware device, or a daemon/OS service/actual server. This + * mechanism also permits different drivers (and hardware) to coexist within the same + * system, as well as allowing several applications to share system resources for audio, + * including a single hardware output device. The details are left to the implementation, + * which has to map the available backends to unique device specifiers. + * + * @author Brian Matzon + * @version $Revision$ + * $Id$ + */ +public final class ALCdevice { + + /** Address of actual device */ + final long device; + + /** Whether this device is valid */ + private boolean valid; + + /** List of contexts belonging to the device */ + private final HashMap contexts = new HashMap(); + + /** + * Creates a new instance of ALCdevice + * + * @param device address of actual device + */ + ALCdevice(long device) { + this.device = device; + this.valid = true; + } + + /* + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object device) { + if(device instanceof ALCdevice) { + return ((ALCdevice)device).device == this.device; + } + return super.equals(device); + } + + /** + * Adds a context to the device + * + * @param context context to add to the list of contexts for this device + */ + void addContext(ALCcontext context) { + synchronized (contexts) { + contexts.put(context.context, context); + } + } + + /** + * Remove context associated with device + * + * @param context Context to disassociate with device + */ + void removeContext(ALCcontext context) { + synchronized (contexts) { + contexts.remove(context.context); + } + } + + /** + * Marks this device and all of its contexts invalid + */ + void setInvalid() { + valid = false; + synchronized (contexts) { + for ( ALCcontext context : contexts.values() ) + context.setInvalid(); + } + contexts.clear(); + } + + /** + * @return true if this device is still valid + */ + public boolean isValid() { + return valid; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALUtil.java new file mode 100644 index 000000000..4306ec982 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/ALUtil.java @@ -0,0 +1,53 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.openal; + +import javax.annotation.*; +import java.nio.*; +import java.util.*; + +import static org.lwjgl.openal.ALC10.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** OpenAL utilities. */ +public final class ALUtil { + + private ALUtil() { + } + + /** + * Obtains string values from ALC. This is a custom implementation for those tokens that return a list of strings instead of a single string. + * + * @param deviceHandle the device to query + * @param token the information to query. One of:
    {@link ALC11#ALC_ALL_DEVICES_SPECIFIER}, {@link ALC11#ALC_CAPTURE_DEVICE_SPECIFIER} + */ + @Nullable + public static List getStringList(long deviceHandle, int token) { + long __result = nalcGetString(deviceHandle, token); + if (__result == NULL) { + return null; + } + + ByteBuffer buffer = memByteBuffer(__result, Integer.MAX_VALUE); + + List strings = new ArrayList<>(); + + int offset = 0; + while (true) { + if (buffer.get() == 0) { + int limit = buffer.position() - 1; + if (limit == offset) { // Previous char was also a \0 == end of list. + break; + } + + strings.add(memUTF8(buffer, limit - offset, offset)); + offset = buffer.position(); + } + } + + return strings; + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EFX10.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EFX10.java new file mode 100644 index 000000000..8ade79a75 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EFX10.java @@ -0,0 +1,224 @@ +package org.lwjgl.openal; + +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +public class EFX10 { + + public static final int AL_EFFECT_TYPE = EXTEfx.AL_EFFECT_TYPE; + public static final int AL_EFFECTSLOT_EFFECT = EXTEfx.AL_EFFECTSLOT_EFFECT; + public static final int AL_EFFECT_ECHO = EXTEfx.AL_EFFECT_ECHO; + public static final float AL_ECHO_MIN_DAMPING = EXTEfx.AL_ECHO_MIN_DAMPING; + public static final int AL_ECHO_DAMPING = EXTEfx.AL_ECHO_DAMPING; + public static final float AL_ECHO_MAX_DAMPING = EXTEfx.AL_ECHO_MAX_DAMPING; + public static final float AL_ECHO_MIN_DELAY = EXTEfx.AL_ECHO_MIN_DELAY; + public static final int AL_ECHO_DELAY = EXTEfx.AL_ECHO_DELAY; + public static final float AL_ECHO_MAX_DELAY = EXTEfx.AL_ECHO_MAX_DELAY; + public static final float AL_ECHO_MIN_FEEDBACK = EXTEfx.AL_ECHO_MIN_FEEDBACK; + public static final int AL_ECHO_FEEDBACK = EXTEfx.AL_ECHO_FEEDBACK; + public static final float AL_ECHO_MAX_FEEDBACK = EXTEfx.AL_ECHO_MAX_FEEDBACK; + public static final float AL_ECHO_MIN_LRDELAY = EXTEfx.AL_ECHO_MIN_LRDELAY; + public static final int AL_ECHO_LRDELAY = EXTEfx.AL_ECHO_LRDELAY; + public static final float AL_ECHO_MAX_LRDELAY = EXTEfx.AL_ECHO_MAX_LRDELAY; + public static final float AL_ECHO_MIN_SPREAD = EXTEfx.AL_ECHO_MIN_SPREAD; + public static final int AL_ECHO_SPREAD = EXTEfx.AL_ECHO_SPREAD; + public static final float AL_ECHO_MAX_SPREAD = EXTEfx.AL_ECHO_MAX_SPREAD; + public static final int AL_EFFECT_REVERB = EXTEfx.AL_EFFECT_REVERB; + public static final int AL_RING_MODULATOR_SINUSOID = EXTEfx.AL_RING_MODULATOR_SINUSOID; + public static final int AL_RING_MODULATOR_SAWTOOTH = EXTEfx.AL_RING_MODULATOR_SAWTOOTH; + public static final int AL_RING_MODULATOR_SQUARE = EXTEfx.AL_RING_MODULATOR_SQUARE; + public static final int AL_EFFECT_RING_MODULATOR = EXTEfx.AL_EFFECT_RING_MODULATOR; + public static final float AL_RING_MODULATOR_MAX_FREQUENCY = EXTEfx.AL_RING_MODULATOR_MAX_FREQUENCY; + public static final int AL_RING_MODULATOR_FREQUENCY = EXTEfx.AL_RING_MODULATOR_FREQUENCY; + public static final float AL_RING_MODULATOR_MIN_FREQUENCY = EXTEfx.AL_RING_MODULATOR_MIN_FREQUENCY; + public static final float AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF = EXTEfx.AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF; + public static final int AL_RING_MODULATOR_HIGHPASS_CUTOFF = EXTEfx.AL_RING_MODULATOR_HIGHPASS_CUTOFF; + public static final float AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF = EXTEfx.AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF; + public static final int AL_RING_MODULATOR_WAVEFORM = EXTEfx.AL_RING_MODULATOR_WAVEFORM; + public static final int AL_FILTER_TYPE = EXTEfx.AL_FILTER_TYPE; + public static final int AL_FILTER_LOWPASS = EXTEfx.AL_FILTER_LOWPASS; + public static final int AL_LOWPASS_GAIN = EXTEfx.AL_LOWPASS_GAIN; + public static final int AL_LOWPASS_GAINHF = EXTEfx.AL_LOWPASS_GAINHF; + public static final int AL_EFFECTSLOT_NULL = EXTEfx.AL_EFFECTSLOT_NULL; + public static final int AL_FILTER_NULL = EXTEfx.AL_FILTER_NULL; + public static final int AL_AUXILIARY_SEND_FILTER = EXTEfx.AL_AUXILIARY_SEND_FILTER; + public static final int AL_DIRECT_FILTER = EXTEfx.AL_DIRECT_FILTER; + public static final int ALC_MAX_AUXILIARY_SENDS = EXTEfx.ALC_MAX_AUXILIARY_SENDS; + public static final int ALC_EFX_MAJOR_VERSION = EXTEfx.ALC_EFX_MAJOR_VERSION; + public static final int AL_REVERB_DECAY_TIME = EXTEfx.AL_REVERB_DECAY_TIME; + public static final int AL_FILTER_HIGHPASS = EXTEfx.AL_FILTER_HIGHPASS; + public static final int AL_FILTER_BANDPASS = EXTEfx.AL_FILTER_BANDPASS; + public static final int AL_EFFECT_NULL = EXTEfx.AL_EFFECT_NULL; + public static final int AL_EFFECT_EAXREVERB = EXTEfx.AL_EFFECT_EAXREVERB; + public static final int AL_EFFECT_CHORUS = EXTEfx.AL_EFFECT_CHORUS; + public static final int AL_EFFECT_DISTORTION = EXTEfx.AL_EFFECT_DISTORTION; + public static final int AL_EFFECT_FLANGER = EXTEfx.AL_EFFECT_FLANGER; + public static final int AL_EFFECT_FREQUENCY_SHIFTER = EXTEfx.AL_EFFECT_FREQUENCY_SHIFTER; + public static final int AL_EFFECT_VOCAL_MORPHER = EXTEfx.AL_EFFECT_VOCAL_MORPHER; + public static final int AL_EFFECT_PITCH_SHIFTER = EXTEfx.AL_EFFECT_PITCH_SHIFTER; + public static final int AL_EFFECT_AUTOWAH = EXTEfx.AL_EFFECT_AUTOWAH; + public static final int AL_EFFECT_COMPRESSOR = EXTEfx.AL_EFFECT_COMPRESSOR; + public static final int AL_EFFECT_EQUALIZER = EXTEfx.AL_EFFECT_EQUALIZER; + + public static int alGenAuxiliaryEffectSlots() { + return EXTEfx.alGenAuxiliaryEffectSlots(); + } + + public static int alGenFilters() { + return EXTEfx.alGenFilters(); + } + + public static void alDeleteFilters(int filter) { + EXTEfx.alDeleteFilters(filter); + } + + public static void alFilteri(int filter, int param, int value) { + EXTEfx.alFilteri(filter, param, value); + } + + public static void alFilterf(int filter, int param, float value) { + EXTEfx.alFilterf(filter, param, value); + } + + public static float alGetFilterf(int filter, int param) { + return EXTEfx.alGetFilterf(filter, param); + } + + public static int alGenEffects() { + return EXTEfx.alGenEffects(); + } + + public static void alDeleteEffects(int effect) { + EXTEfx.alDeleteAuxiliaryEffectSlots(effect); + } + + public static void alDeleteAuxiliaryEffectSlots(int effectSlot) { + EXTEfx.alDeleteAuxiliaryEffectSlots(effectSlot); + } + + public static void alEffecti(int effect, int param, int value) { + EXTEfx.alEffecti(effect, param, value); + } + + public static float alGetEffectf(int effect, int param) { + return EXTEfx.alGetEffectf(effect, param); + } + + public static int alGetEffecti(int effect, int param) { + return EXTEfx.alGetEffecti(effect, param); + } + + public static void alEffectf(int effect, int param, float value) { + EXTEfx.alEffectf(effect, param, value); + } + + public static void alAuxiliaryEffectSloti(int effectSlot, int param, int value) { + EXTEfx.alAuxiliaryEffectSloti(effectSlot, param, value); + } + + public static void alGenAuxiliaryEffectSlots(IntBuffer effectSlots) { + EXTEfx.alGenAuxiliaryEffectSlots(effectSlots); + } + + public static void alGenEffects(IntBuffer effects) { + EXTEfx.alGenEffects(effects); + } + + public static void alDeleteEffects(IntBuffer effects) { + EXTEfx.alDeleteEffects(effects); + } + + public static void alDeleteAuxiliaryEffectSlots(IntBuffer effectSlots) { + EXTEfx.alDeleteAuxiliaryEffectSlots(effectSlots); + } + + public static void alGenFilters(IntBuffer filters) { + EXTEfx.alGenFilters(filters); + } + + public static void alDeleteFilters(IntBuffer filters) { + EXTEfx.alDeleteFilters(filters); + } + + + + + + + + public static void alGetAuxiliaryEffectSlot(int var0, int var1, FloatBuffer var2) { + EXTEfx.alGetAuxiliaryEffectSlotfv(var0, var1, var2); + } + + public static void alGetAuxiliaryEffectSlot(int var0, int var1, IntBuffer var2) { + EXTEfx.alGetAuxiliaryEffectSlotiv(var0, var1, var2); + } + + public static float alGetAuxiliaryEffectSlotf(int var0, int var1) { + return EXTEfx.alGetAuxiliaryEffectSlotf(var0, var1); + } + + public static int alGetAuxiliaryEffectSloti(int var0, int var1) { + return EXTEfx.alGetAuxiliaryEffectSloti(var0, var1); + } + + public static void alEffect(int var0, int var1, FloatBuffer var2) { + EXTEfx.alEffectfv(var0, var1, var2); + } + + public static void alEffect(int var0, int var1, IntBuffer var2) { + EXTEfx.alEffectiv(var0, var1, var2); + } + + public static void alFilter(int var0, int var1, FloatBuffer var2) { + EXTEfx.alFilterfv(var0, var1, var2); + } + + public static void alFilter(int var0, int var1, IntBuffer var2) { + EXTEfx.alFilteriv(var0, var1, var2); + } + + public static void alAuxiliaryEffectSlot(int var0, int var1, FloatBuffer var2) { + EXTEfx.alAuxiliaryEffectSlotfv(var0, var1, var2); + } + + public static void alAuxiliaryEffectSlot(int var0, int var1, IntBuffer var2) { + EXTEfx.alAuxiliaryEffectSlotiv(var0, var1, var2); + } + + public static void alAuxiliaryEffectSlotf(int var0, int var1, float var2) { + EXTEfx.alAuxiliaryEffectSlotf(var0, var1, var2); + } + + public static void alGetEffect(int var0, int var1, FloatBuffer var2) { + EXTEfx.alGetEffectfv(var0, var1, var2); + } + + public static void alGetEffect(int var0, int var1, IntBuffer var2) { + EXTEfx.alGetEffectiv(var0, var1, var2); + } + + public static void alGetFilter(int var0, int var1, FloatBuffer var2) { + EXTEfx.alGetFilterfv(var0, var1, var2); + } + + public static void alGetFilter(int var0, int var1, IntBuffer var2) { + EXTEfx.alGetFilteriv(var0, var1, var2); + } + + public static int alGetFilteri(int var0, int var1) { + return EXTEfx.alGetFilteri(var0, var1); + } + + public static boolean alIsAuxiliaryEffectSlot(int var0) { + return EXTEfx.alIsAuxiliaryEffectSlot(var0); + } + + public static boolean alIsEffect(int var0) { + return EXTEfx.alIsEffect(var0); + } + + public static boolean alIsFilter(int var0) { + return EXTEfx.alIsFilter(var0); + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EFXUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EFXUtil.java new file mode 100644 index 000000000..6b811ce7e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EFXUtil.java @@ -0,0 +1,254 @@ +/* + * Copyright (c) 2002-2010 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.openal; + +import static org.lwjgl.openal.AL10.AL_INVALID_OPERATION; +import static org.lwjgl.openal.AL10.AL_INVALID_VALUE; +import static org.lwjgl.openal.AL10.AL_NO_ERROR; +import static org.lwjgl.openal.AL10.AL_OUT_OF_MEMORY; +import static org.lwjgl.openal.AL10.alGetError; +import static org.lwjgl.openal.EFX10.AL_EFFECT_AUTOWAH; +import static org.lwjgl.openal.EFX10.AL_EFFECT_CHORUS; +import static org.lwjgl.openal.EFX10.AL_EFFECT_COMPRESSOR; +import static org.lwjgl.openal.EFX10.AL_EFFECT_DISTORTION; +import static org.lwjgl.openal.EFX10.AL_EFFECT_EAXREVERB; +import static org.lwjgl.openal.EFX10.AL_EFFECT_ECHO; +import static org.lwjgl.openal.EFX10.AL_EFFECT_EQUALIZER; +import static org.lwjgl.openal.EFX10.AL_EFFECT_FLANGER; +import static org.lwjgl.openal.EFX10.AL_EFFECT_FREQUENCY_SHIFTER; +import static org.lwjgl.openal.EFX10.AL_EFFECT_NULL; +import static org.lwjgl.openal.EFX10.AL_EFFECT_PITCH_SHIFTER; +import static org.lwjgl.openal.EFX10.AL_EFFECT_REVERB; +import static org.lwjgl.openal.EFX10.AL_EFFECT_RING_MODULATOR; +import static org.lwjgl.openal.EFX10.AL_EFFECT_TYPE; +import static org.lwjgl.openal.EFX10.AL_EFFECT_VOCAL_MORPHER; +import static org.lwjgl.openal.EFX10.AL_FILTER_BANDPASS; +import static org.lwjgl.openal.EFX10.AL_FILTER_HIGHPASS; +import static org.lwjgl.openal.EFX10.AL_FILTER_LOWPASS; +import static org.lwjgl.openal.EFX10.AL_FILTER_NULL; +import static org.lwjgl.openal.EFX10.AL_FILTER_TYPE; +import static org.lwjgl.openal.EFX10.alDeleteEffects; +import static org.lwjgl.openal.EFX10.alDeleteFilters; +import static org.lwjgl.openal.EFX10.alEffecti; +import static org.lwjgl.openal.EFX10.alFilteri; +import static org.lwjgl.openal.EFX10.alGenEffects; +import static org.lwjgl.openal.EFX10.alGenFilters; + +/** + * Utility class for the OpenAL extension ALC_EXT_EFX. Provides functions to check for the extension + * and support of various effects and filters. + *

    + * Currently supports ALC_EXT_EFX version 1.0 effects and filters. + * + * @author Ciardhubh + * @version $Revision$ + * $Id$ + */ +public final class EFXUtil { + + /** Constant for testSupportGeneric to check an effect. */ + private static final int EFFECT = 1111; + /** Constant for testSupportGeneric to check a filter. */ + private static final int FILTER = 2222; + + /** Utility class, hidden contructor. */ + private EFXUtil() { + } + + /** + * Checks if OpenAL implementation is loaded and supports ALC_EXT_EFX. + * + * @return True if ALC_EXT_EFX is supported, false if not. + * @throws OpenALException If OpenAL has not been created yet. + */ + public static boolean isEfxSupported() { + return ALC.createCapabilities(AL.alcDevice.device).ALC_EXT_EFX; + } + + /** + * Tests OpenAL to see whether the given effect type is supported. This is done by creating an + * effect of the given type. If creation succeeds the effect is supported. + * + * @param effectType Type of effect whose support is to be tested, e.g. AL_EFFECT_REVERB. + * @return True if it is supported, false if not. + * @throws OpenALException If the request fails due to an AL_OUT_OF_MEMORY error or OpenAL has + * not been created yet. + * @throws IllegalArgumentException effectType is not a valid effect type. + */ + public static boolean isEffectSupported(final int effectType) { + // Make sure type is a real effect. + switch (effectType) { + case AL_EFFECT_NULL: + case AL_EFFECT_EAXREVERB: + case AL_EFFECT_REVERB: + case AL_EFFECT_CHORUS: + case AL_EFFECT_DISTORTION: + case AL_EFFECT_ECHO: + case AL_EFFECT_FLANGER: + case AL_EFFECT_FREQUENCY_SHIFTER: + case AL_EFFECT_VOCAL_MORPHER: + case AL_EFFECT_PITCH_SHIFTER: + case AL_EFFECT_RING_MODULATOR: + case AL_EFFECT_AUTOWAH: + case AL_EFFECT_COMPRESSOR: + case AL_EFFECT_EQUALIZER: + break; + default: + throw new IllegalArgumentException("Unknown or invalid effect type: " + effectType); + } + + return testSupportGeneric(EFFECT, effectType); + } + + /** + * Tests OpenAL to see whether the given filter type is supported. This is done by creating a + * filter of the given type. If creation succeeds the filter is supported. + * + * @param filterType Type of filter whose support is to be tested, e.g. AL_FILTER_LOWPASS. + * @return True if it is supported, false if not. + * @throws OpenALException If the request fails due to an AL_OUT_OF_MEMORY error or OpenAL has + * not been created yet. + * @throws IllegalArgumentException filterType is not a valid filter type. + */ + public static boolean isFilterSupported(final int filterType) { + // Make sure type is a real filter. + switch (filterType) { + case AL_FILTER_NULL: + case AL_FILTER_LOWPASS: + case AL_FILTER_HIGHPASS: + case AL_FILTER_BANDPASS: + break; + default: + throw new IllegalArgumentException("Unknown or invalid filter type: " + filterType); + } + + return testSupportGeneric(FILTER, filterType); + } + + /** + * Generic test function to see if an EFX object supports a given kind of type. Works for + * effects and filters. + * + * @param objectType Type of object to test. Must be either EFXUtil.EFFECT or EFXUtil.FILTER. + * @param typeValue OpenAL type the object should be tested for support, e.g. AL_FILTER_LOWPASS + * or AL_EFFECT_REVERB. + * @return True if object supports typeValue, false else. + */ + private static boolean testSupportGeneric(final int objectType, final int typeValue) { + // Check for supported objectType. + switch (objectType) { + case EFFECT: + case FILTER: + break; + default: + throw new IllegalArgumentException("Invalid objectType: " + objectType); + } + + boolean supported = false; + if (isEfxSupported()) { + + // Try to create object in order to check AL's response. + alGetError(); + int genError; + int testObject = 0; + try { + switch (objectType) { // Create object based on type + case EFFECT: + testObject = alGenEffects(); + break; + case FILTER: + testObject = alGenFilters(); + break; + default: + throw new IllegalArgumentException("Invalid objectType: " + objectType); + } + genError = alGetError(); + } catch (final OpenALException debugBuildException) { + // Hack because OpenALException hides the original error code (short of parsing the + // error message String which would break if it gets changed). + if (debugBuildException.getMessage().contains("AL_OUT_OF_MEMORY")) { + genError = AL_OUT_OF_MEMORY; + } else { + genError = AL_INVALID_OPERATION; + } + } + + if (genError == AL_NO_ERROR) { + // Successfully created, now try to set type. + alGetError(); + int setError; + try { + switch (objectType) { // Set based on object type + case EFFECT: + alEffecti(testObject, AL_EFFECT_TYPE, typeValue); + break; + case FILTER: + alFilteri(testObject, AL_FILTER_TYPE, typeValue); + break; + default: + throw new IllegalArgumentException("Invalid objectType: " + objectType); + } + setError = alGetError(); + } catch (final OpenALException debugBuildException) { + // Hack because OpenALException hides the original error code (short of parsing + // the error message String which would break when it gets changed). + setError = AL_INVALID_VALUE; + } + + if (setError == AL_NO_ERROR) { + supported = true; + } + + // Cleanup + try { + switch (objectType) { // Set based on object type + case EFFECT: + alDeleteEffects(testObject); + break; + case FILTER: + alDeleteFilters(testObject); + break; + default: + throw new IllegalArgumentException("Invalid objectType: " + objectType); + } + } catch (final OpenALException debugBuildException) { + // Don't care about cleanup errors. + } + + } else if (genError == AL_OUT_OF_MEMORY) { + throw new OpenALException(genError); + } + } + + return supported; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTAlaw.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTAlaw.java new file mode 100644 index 000000000..0946edfa3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTAlaw.java @@ -0,0 +1,18 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code AL_EXT_ALAW} extension. */ +public final class EXTAlaw { + + /** Buffer formats. */ + public static final int + AL_FORMAT_MONO_ALAW_EXT = 0x10016, + AL_FORMAT_STEREO_ALAW_EXT = 0x10017; + + private EXTAlaw() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTBFormat.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTBFormat.java new file mode 100644 index 000000000..627109c9f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTBFormat.java @@ -0,0 +1,36 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the {@code AL_EXT_BFORMAT} extension. + * + *

    This extension indicates support for the {@link #AL_FORMAT_BFORMAT2D_8 FORMAT_BFORMAT2D_8}, {@link #AL_FORMAT_BFORMAT2D_16 FORMAT_BFORMAT2D_16}, {@link #AL_FORMAT_BFORMAT2D_FLOAT32 FORMAT_BFORMAT2D_FLOAT32}, {@link #AL_FORMAT_BFORMAT3D_8 FORMAT_BFORMAT3D_8}, + * {@link #AL_FORMAT_BFORMAT3D_16 FORMAT_BFORMAT3D_16} and {@link #AL_FORMAT_BFORMAT3D_FLOAT32 FORMAT_BFORMAT3D_FLOAT32} buffer formats. These provide 2D (WXY) and 3D (WXYZ) 8bit int, 16bit int and ALfloat support for + * Ambisonic three- or four-channel B-Format (using W X Y Z channel ordering, encoded as the first three or four channels of Furse-Malham higher order + * Ambisonics). Use of these formats indicate that sources are Ambisonic sources. Such sources can be oriented via {@link AL10#alSourcefv Sourcefv} using the + * {@link AL10#AL_ORIENTATION ORIENTATION} tag, which takes the same parameters as {@code alListenerfv(AL_ORIENTATION,...)}. Such sources DO support {@link AL10#AL_SOURCE_RELATIVE SOURCE_RELATIVE} and the + * soundfield will rotate to reflect the listener's orientation if this is off (the default). Other behaviour is as for stereo or multichannel assets.

    + * + *

    Note that Ambisonics orients X, Y and Z axes in a different way to OpenAL. For clarity, we ignore the Ambisonic coordinate system in the API and stick + * to the OpenAL one, making sure that the Front of the Ambisonic soundfield (actually Ambisonic +X) matches the Front of the OpenAL coordinate system (-Z + * by default) etc. For instance, if the orientation of the source is set so that the "at" vector is to the left, then the front of the B-Format + * soundfield will be presented to the left.

    + */ +public final class EXTBFormat { + + /** Ambisonic formats. */ + public static final int + AL_FORMAT_BFORMAT2D_16 = 0x20022, + AL_FORMAT_BFORMAT2D_8 = 0x20021, + AL_FORMAT_BFORMAT2D_FLOAT32 = 0x20023, + AL_FORMAT_BFORMAT3D_16 = 0x20032, + AL_FORMAT_BFORMAT3D_8 = 0x20031, + AL_FORMAT_BFORMAT3D_FLOAT32 = 0x20033; + + private EXTBFormat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTCapture.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTCapture.java new file mode 100644 index 000000000..836415e2a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTCapture.java @@ -0,0 +1,199 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; + +/** + * Native bindings to the {@code ALC_EXT_CAPTURE} extension. + * + *

    An OpenAL 1.1 implementation will always support the {@code ALC_EXT_CAPTURE} extension. This allows an application written to the OpenAL 1.0 specification to + * access the capture abilities.

    + */ +public class EXTCapture { + + /** String queries. */ + public static final int + ALC_CAPTURE_DEVICE_SPECIFIER = 0x310, + ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER = 0x311; + + /** Integer queries. */ + public static final int ALC_CAPTURE_SAMPLES = 0x312; + + protected EXTCapture() { + throw new UnsupportedOperationException(); + } + + // --- [ alcCaptureOpenDevice ] --- + + /** Unsafe version of: {@link #alcCaptureOpenDevice CaptureOpenDevice} */ + public static long nalcCaptureOpenDevice(long deviceName, int frequency, int format, int samples) { + return ALC11.nalcCaptureOpenDevice(deviceName, frequency, format, samples); + } + + /** + * Allows the application to connect to a capture device. + * + *

    The {@code deviceName} argument is a null terminated string that requests a certain device or device configuration. If {@code NULL} is specified, the implementation + * will provide an implementation specific default.

    + * + * @param deviceName the device or device configuration + * @param frequency the audio frequency + * @param format the audio format + * @param samples the number of sample frames to buffer in the AL + */ + @NativeType("ALCdevice *") + public static long alcCaptureOpenDevice(@Nullable @NativeType("ALCchar const *") ByteBuffer deviceName, @NativeType("ALCuint") int frequency, @NativeType("ALCenum") int format, @NativeType("ALCsizei") int samples) { + return ALC11.alcCaptureOpenDevice(deviceName, frequency, format, samples); + } + + /** + * Allows the application to connect to a capture device. + * + *

    The {@code deviceName} argument is a null terminated string that requests a certain device or device configuration. If {@code NULL} is specified, the implementation + * will provide an implementation specific default.

    + * + * @param deviceName the device or device configuration + * @param frequency the audio frequency + * @param format the audio format + * @param samples the number of sample frames to buffer in the AL + */ + @NativeType("ALCdevice *") + public static long alcCaptureOpenDevice(@Nullable @NativeType("ALCchar const *") CharSequence deviceName, @NativeType("ALCuint") int frequency, @NativeType("ALCenum") int format, @NativeType("ALCsizei") int samples) { + return ALC11.alcCaptureOpenDevice(deviceName, frequency, format, samples); + } + + // --- [ alcCaptureCloseDevice ] --- + + /** + * Allows the application to disconnect from a capture device. + * + * @param device the capture device to close + */ + @NativeType("ALCboolean") + public static boolean alcCaptureCloseDevice(@NativeType("ALCdevice *") long device) { + return ALC11.alcCaptureCloseDevice(device); + } + + // --- [ alcCaptureStart ] --- + + /** + * Starts recording audio on the specific capture device. + * + *

    Once started, the device will record audio to an internal ring buffer, the size of which was specified when opening the device. The application may + * query the capture device to discover how much data is currently available via the alcGetInteger with the ALC_CAPTURE_SAMPLES token. This will report the + * number of sample frames currently available.

    + * + * @param device the capture device + */ + @NativeType("ALCvoid") + public static void alcCaptureStart(@NativeType("ALCdevice *") long device) { + ALC11.alcCaptureStart(device); + } + + // --- [ alcCaptureStop ] --- + + /** + * Halts audio capturing without closing the capture device. + * + *

    The implementation is encouraged to optimize for this case. The amount of audio samples available after restarting a stopped capture device is reset to + * zero. The application does not need to stop the capture device to read from it.

    + * + * @param device the capture device + */ + @NativeType("ALCvoid") + public static void alcCaptureStop(@NativeType("ALCdevice *") long device) { + ALC11.alcCaptureStop(device); + } + + // --- [ alcCaptureSamples ] --- + + /** Unsafe version of: {@link #alcCaptureSamples CaptureSamples} */ + public static void nalcCaptureSamples(long device, long buffer, int samples) { + ALC11.nalcCaptureSamples(device, buffer, samples); + } + + /** + * Obtains captured audio samples from the AL. + * + *

    The implementation may defer conversion and resampling until this point. Requesting more sample frames than are currently available is an error.

    + * + * @param device the capture device + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to obtain + */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") ByteBuffer buffer, @NativeType("ALCsizei") int samples) { + ALC11.alcCaptureSamples(device, buffer, samples); + } + + /** + * Obtains captured audio samples from the AL. + * + *

    The implementation may defer conversion and resampling until this point. Requesting more sample frames than are currently available is an error.

    + * + * @param device the capture device + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to obtain + */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") ShortBuffer buffer, @NativeType("ALCsizei") int samples) { + ALC11.alcCaptureSamples(device, buffer, samples); + } + + /** + * Obtains captured audio samples from the AL. + * + *

    The implementation may defer conversion and resampling until this point. Requesting more sample frames than are currently available is an error.

    + * + * @param device the capture device + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to obtain + */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") IntBuffer buffer, @NativeType("ALCsizei") int samples) { + ALC11.alcCaptureSamples(device, buffer, samples); + } + + /** + * Obtains captured audio samples from the AL. + * + *

    The implementation may defer conversion and resampling until this point. Requesting more sample frames than are currently available is an error.

    + * + * @param device the capture device + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to obtain + */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") FloatBuffer buffer, @NativeType("ALCsizei") int samples) { + ALC11.alcCaptureSamples(device, buffer, samples); + } + + /** Array version of: {@link #alcCaptureSamples CaptureSamples} */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") short[] buffer, @NativeType("ALCsizei") int samples) { + ALC11.alcCaptureSamples(device, buffer, samples); + } + + /** Array version of: {@link #alcCaptureSamples CaptureSamples} */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") int[] buffer, @NativeType("ALCsizei") int samples) { + ALC11.alcCaptureSamples(device, buffer, samples); + } + + /** Array version of: {@link #alcCaptureSamples CaptureSamples} */ + @NativeType("ALCvoid") + public static void alcCaptureSamples(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") float[] buffer, @NativeType("ALCsizei") int samples) { + ALC11.alcCaptureSamples(device, buffer, samples); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDedicated.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDedicated.java new file mode 100644 index 000000000..c4a76a0ad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDedicated.java @@ -0,0 +1,29 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the {@code ALC_EXT_DEDICATED} extension. + * + *

    This extension provides two "routing" EFX effects that allow sounds to be sent to dedicated speaker channels. Audio rendered to the dedicated low + * frequency effect ({@link #AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT}) is routed to a subwoofer if one is present. Otherwise, it is discarded.

    + * + *

    Audio rendered to the dedicated dialogue effect ({@link #AL_EFFECT_DEDICATED_DIALOGUE EFFECT_DEDICATED_DIALOGUE}) is routed to a front centre speaker if one is present. Otherwise, it is + * rendered to the front centre using the normal spatialisation logic.

    + * + *

    Both effects support a gain control parameter {@link #AL_DEDICATED_GAIN DEDICATED_GAIN}, which defaults to 1.

    + */ +public final class EXTDedicated { + + /** {@code ALC_EXT_DEDICATED} tokens. */ + public static final int + AL_DEDICATED_GAIN = 0x1, + AL_EFFECT_DEDICATED_DIALOGUE = 0x9001, + AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT = 0x9000; + + private EXTDedicated() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDefaultFilterOrder.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDefaultFilterOrder.java new file mode 100644 index 000000000..1c1e4821d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDefaultFilterOrder.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the {@code ALC_EXT_DEFAULT_FILTER_ORDER} extension. + * + *

    This extension allows the default filter order (i.e. slope) to be selected at context creation time. Attibute {@link #ALC_DEFAULT_FILTER_ORDER DEFAULT_FILTER_ORDER} can be used with a + * value of 1 (for -6dB/oct) or 2 (for -12dB/oct).

    + * + *

    {@link #ALC_DEFAULT_FILTER_ORDER DEFAULT_FILTER_ORDER} can also be used with {@link ALC10#alcGetIntegerv GetIntegerv} to find out the current default filter order.

    + */ +public final class EXTDefaultFilterOrder { + + /** {@code ALC_EXT_DEFAULT_FILTER_ORDER} tokens. */ + public static final int ALC_DEFAULT_FILTER_ORDER = 0x1100; + + private EXTDefaultFilterOrder() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDisconnect.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDisconnect.java new file mode 100644 index 000000000..4cb48da3a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDisconnect.java @@ -0,0 +1,66 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the {@code ALC_EXT_disconnect} extension. + * + *

    In OpenAL, there is no way to know if a device has been lost, nor is there a spec-approved means to deal with this properly. While most people are + * using either PCI audio cards or a chip welded to their motherboard, there are many devices that are more dynamic in nature, such as USB and Firewire + * based-units. Such units may lose external power seperate from the system, or may have their cables unplugged at runtime. The OS may reassign the + * hardware to a higher-priority process. If nothing else, a user may unplug the hardware without a proper shutdown (or properly shut them down at the OS + * level and not within the application).

    + * + *

    Other audio "devices" may vanish, too, such as the network connection that hosts a remote audio device like esound, nas, or arts.

    + * + *

    In these cases, the OpenAL spec says nothing, which we must assume means that all resulting behaviour is totally undefined, including everything from + * continued function without audio output to a crash within the AL.

    + * + *

    This extension, ALC_EXT_disconnect, strives to define AL behaviour in these cases and give the application a means to discover and deal with total + * device failure.

    + * + *

    Device disconnect

    + * + *

    If a device is unplugged, lost or otherwise damaged beyond functioning, the device is flagged as "disconnected" and the ALCdevice handle is considered + * a "zombie" device.

    + * + *

    When a device is disconnected, the implementation will, in most respects, keep processing as normal. For example, even though there is no longer any + * output when a USB audio device is removed, setting and querying state on the Listener should keep functioning as expected.

    + * + *

    All sources in the {@link AL10#AL_PLAYING PLAYING} state will immediately progress to {@link AL10#AL_STOPPED STOPPED} upon disconnect of their containing device. Any source started after the + * disconnect will immediately progress to {@link AL10#AL_STOPPED STOPPED}. As in any stopped source, this also means that queued buffers all go to {@link AL10#AL_PROCESSED PROCESSED} as well. Sources + * that are in the {@link AL10#AL_PAUSED PAUSED} or {@link AL10#AL_INITIAL INITIAL} state do not change on disconnect, but will follow this behaviour if the application later tries to promote them to + * the {@link AL10#AL_PLAYING PLAYING} state.

    + * + *

    Zombie devices may not have new contexts created on them; {@link ALC10#alcCreateContext CreateContext} will fail, returning a {@code NULL} pointer, if the specified device has been + * disconnected.

    + * + *

    The application may determine if a device has been disconnected by using the {@link #ALC_CONNECTED CONNECTED} token with {@link ALC10#alcGetIntegerv GetIntegerv}. When a device has been + * disconnected, the application is permitted to close the zombie device's handle in the normal way, and may choose to open a new device.

    + * + *

    Applications that use {@link #ALC_CONNECTED CONNECTED} are encouraged to query it with relative frequency. A game, for example, should call it once per rendering frame, per + * device. A device may become disconnected at any time without warning.

    + * + *

    Once a device is disconnected, it will never become reconnected. Even if the user plugs the device back in, the application must close the existing + * zombie device handle and reopen it with {@code alc*OpenDevice()}.

    + * + *

    If device enumeration is available via ALC_ENUMERATION_EXT, ALC_ENUMERATE_ALL_EXT, or AL 1.1, the list of devices may change between calls as devices + * become disconnected and reconnected. To prevent race conditions, the pointer to device list strings provided to the application will remain valid until + * the next call to {@link ALC10#alcGetString GetString}. The implementation may either cache the result of the previous request or perform a complete device redetection + * during the {@link ALC10#alcGetString GetString} call. As such, enumeration may not be a "fast call" and should not be called in time-sensitive code. If capture devices + * are available via ALC_EXT_capture or AL 1.1, disconnection management can be used with both output and capture devices. A disconnected capture device + * will continue to function, but will not report a larger number in the {@link ALC11#ALC_CAPTURE_SAMPLES CAPTURE_SAMPLES} query. If the capture device had reported some number of + * samples were available but the samples were not transferred from the device to the AL at the time of disconnect, the AL should feed the application + * that amount of silence in the {@link ALC11#alcCaptureSamples CaptureSamples} call. Future queries of {@link ALC11#ALC_CAPTURE_SAMPLES CAPTURE_SAMPLES} should report zero samples available.

    + */ +public final class EXTDisconnect { + + /** {@code ALC_EXT_disconnect} tokens. */ + public static final int ALC_CONNECTED = 0x313; + + private EXTDisconnect() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDouble.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDouble.java new file mode 100644 index 000000000..a7db63ff7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTDouble.java @@ -0,0 +1,18 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code AL_EXT_DOUBLE} extension. */ +public final class EXTDouble { + + /** Buffer formats. */ + public static final int + AL_FORMAT_MONO_DOUBLE_EXT = 0x10012, + AL_FORMAT_STEREO_DOUBLE_EXT = 0x10013; + + private EXTDouble() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTEfx.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTEfx.java new file mode 100644 index 000000000..b59ce79ea --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTEfx.java @@ -0,0 +1,1867 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the {@code ALC_EXT_EFX} extension. + * + *

    The Effects Extension is designed to provide a generic, cross-platform framework for adding advanced DSP effects to OpenAL.

    + */ +public class EXTEfx { + + /** ALC tokens. */ + public static final int + ALC_EFX_MAJOR_VERSION = 0x20001, + ALC_EFX_MINOR_VERSION = 0x20002, + ALC_MAX_AUXILIARY_SENDS = 0x20003; + + /** Listener properties. */ + public static final int AL_METERS_PER_UNIT = 0x20004; + + /** Source properties. */ + public static final int + AL_DIRECT_FILTER = 0x20005, + AL_AUXILIARY_SEND_FILTER = 0x20006, + AL_AIR_ABSORPTION_FACTOR = 0x20007, + AL_ROOM_ROLLOFF_FACTOR = 0x20008, + AL_CONE_OUTER_GAINHF = 0x20009, + AL_DIRECT_FILTER_GAINHF_AUTO = 0x2000A, + AL_AUXILIARY_SEND_FILTER_GAIN_AUTO = 0x2000B, + AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO = 0x2000C; + + /** Auxiliary effect slot properties. */ + public static final int + AL_EFFECTSLOT_NULL = 0x0, + AL_EFFECTSLOT_EFFECT = 0x1, + AL_EFFECTSLOT_GAIN = 0x2, + AL_EFFECTSLOT_AUXILIARY_SEND_AUTO = 0x3; + + /** Reverb effect parameters. */ + public static final int + AL_REVERB_DENSITY = 0x1, + AL_REVERB_DIFFUSION = 0x2, + AL_REVERB_GAIN = 0x3, + AL_REVERB_GAINHF = 0x4, + AL_REVERB_DECAY_TIME = 0x5, + AL_REVERB_DECAY_HFRATIO = 0x6, + AL_REVERB_REFLECTIONS_GAIN = 0x7, + AL_REVERB_REFLECTIONS_DELAY = 0x8, + AL_REVERB_LATE_REVERB_GAIN = 0x9, + AL_REVERB_LATE_REVERB_DELAY = 0xA, + AL_REVERB_AIR_ABSORPTION_GAINHF = 0xB, + AL_REVERB_ROOM_ROLLOFF_FACTOR = 0xC, + AL_REVERB_DECAY_HFLIMIT = 0xD; + + /** EAX Reverb effect parameters. */ + public static final int + AL_EAXREVERB_DENSITY = 0x1, + AL_EAXREVERB_DIFFUSION = 0x2, + AL_EAXREVERB_GAIN = 0x3, + AL_EAXREVERB_GAINHF = 0x4, + AL_EAXREVERB_GAINLF = 0x5, + AL_EAXREVERB_DECAY_TIME = 0x6, + AL_EAXREVERB_DECAY_HFRATIO = 0x7, + AL_EAXREVERB_DECAY_LFRATIO = 0x8, + AL_EAXREVERB_REFLECTIONS_GAIN = 0x9, + AL_EAXREVERB_REFLECTIONS_DELAY = 0xA, + AL_EAXREVERB_REFLECTIONS_PAN = 0xB, + AL_EAXREVERB_LATE_REVERB_GAIN = 0xC, + AL_EAXREVERB_LATE_REVERB_DELAY = 0xD, + AL_EAXREVERB_LATE_REVERB_PAN = 0xE, + AL_EAXREVERB_ECHO_TIME = 0xF, + AL_EAXREVERB_ECHO_DEPTH = 0x10, + AL_EAXREVERB_MODULATION_TIME = 0x11, + AL_EAXREVERB_MODULATION_DEPTH = 0x12, + AL_EAXREVERB_AIR_ABSORPTION_GAINHF = 0x13, + AL_EAXREVERB_HFREFERENCE = 0x14, + AL_EAXREVERB_LFREFERENCE = 0x15, + AL_EAXREVERB_ROOM_ROLLOFF_FACTOR = 0x16, + AL_EAXREVERB_DECAY_HFLIMIT = 0x17; + + /** Chorus effect parameters. */ + public static final int + AL_CHORUS_WAVEFORM = 0x1, + AL_CHORUS_PHASE = 0x2, + AL_CHORUS_RATE = 0x3, + AL_CHORUS_DEPTH = 0x4, + AL_CHORUS_FEEDBACK = 0x5, + AL_CHORUS_DELAY = 0x6; + + /** Distortion effect parameters. */ + public static final int + AL_DISTORTION_EDGE = 0x1, + AL_DISTORTION_GAIN = 0x2, + AL_DISTORTION_LOWPASS_CUTOFF = 0x3, + AL_DISTORTION_EQCENTER = 0x4, + AL_DISTORTION_EQBANDWIDTH = 0x5; + + /** Echo effect parameters. */ + public static final int + AL_ECHO_DELAY = 0x1, + AL_ECHO_LRDELAY = 0x2, + AL_ECHO_DAMPING = 0x3, + AL_ECHO_FEEDBACK = 0x4, + AL_ECHO_SPREAD = 0x5; + + /** Flanger effect parameters. */ + public static final int + AL_FLANGER_WAVEFORM = 0x1, + AL_FLANGER_PHASE = 0x2, + AL_FLANGER_RATE = 0x3, + AL_FLANGER_DEPTH = 0x4, + AL_FLANGER_FEEDBACK = 0x5, + AL_FLANGER_DELAY = 0x6; + + /** Frequency shifter effect parameters. */ + public static final int + AL_FREQUENCY_SHIFTER_FREQUENCY = 0x1, + AL_FREQUENCY_SHIFTER_LEFT_DIRECTION = 0x2, + AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION = 0x3; + + /** Vocal morpher effect parameters. */ + public static final int + AL_VOCMORPHER_PHONEMEA = 0x1, + AL_VOCMORPHER_PHONEMEA_COARSE_TUNING = 0x2, + AL_VOCMORPHER_PHONEMEB = 0x3, + AL_VOCMORPHER_PHONEMEB_COARSE_TUNING = 0x4, + AL_VOCMORPHER_WAVEFORM = 0x5, + AL_VOCMORPHER_RATE = 0x6; + + /** Pitch shifter effect parameters. */ + public static final int + AL_PITCH_SHIFTER_COARSE_TUNE = 0x1, + AL_PITCH_SHIFTER_FINE_TUNE = 0x2; + + /** Ring modulator effect parameters. */ + public static final int + AL_RING_MODULATOR_FREQUENCY = 0x1, + AL_RING_MODULATOR_HIGHPASS_CUTOFF = 0x2, + AL_RING_MODULATOR_WAVEFORM = 0x3; + + /** Autowah effect parameters. */ + public static final int + AL_AUTOWAH_ATTACK_TIME = 0x1, + AL_AUTOWAH_RELEASE_TIME = 0x2, + AL_AUTOWAH_RESONANCE = 0x3, + AL_AUTOWAH_PEAK_GAIN = 0x4; + + /** Compressor effect parameters. */ + public static final int AL_COMPRESSOR_ONOFF = 0x1; + + /** Equalizer effect parameters. */ + public static final int + AL_EQUALIZER_LOW_GAIN = 0x1, + AL_EQUALIZER_LOW_CUTOFF = 0x2, + AL_EQUALIZER_MID1_GAIN = 0x3, + AL_EQUALIZER_MID1_CENTER = 0x4, + AL_EQUALIZER_MID1_WIDTH = 0x5, + AL_EQUALIZER_MID2_GAIN = 0x6, + AL_EQUALIZER_MID2_CENTER = 0x7, + AL_EQUALIZER_MID2_WIDTH = 0x8, + AL_EQUALIZER_HIGH_GAIN = 0x9, + AL_EQUALIZER_HIGH_CUTOFF = 0xA; + + /** Effect type effect parameters. */ + public static final int + AL_EFFECT_FIRST_PARAMETER = 0x0, + AL_EFFECT_LAST_PARAMETER = 0x8000, + AL_EFFECT_TYPE = 0x8001; + + /** Effect types */ + public static final int + AL_EFFECT_NULL = 0x0, + AL_EFFECT_REVERB = 0x1, + AL_EFFECT_CHORUS = 0x2, + AL_EFFECT_DISTORTION = 0x3, + AL_EFFECT_ECHO = 0x4, + AL_EFFECT_FLANGER = 0x5, + AL_EFFECT_FREQUENCY_SHIFTER = 0x6, + AL_EFFECT_VOCAL_MORPHER = 0x7, + AL_EFFECT_PITCH_SHIFTER = 0x8, + AL_EFFECT_RING_MODULATOR = 0x9, + AL_EFFECT_AUTOWAH = 0xA, + AL_EFFECT_COMPRESSOR = 0xB, + AL_EFFECT_EQUALIZER = 0xC, + AL_EFFECT_EAXREVERB = 0x8000; + + /** Lowpass filter properties */ + public static final int + AL_LOWPASS_GAIN = 0x1, + AL_LOWPASS_GAINHF = 0x2; + + /** Highpass filter properties */ + public static final int + AL_HIGHPASS_GAIN = 0x1, + AL_HIGHPASS_GAINLF = 0x2; + + /** Bandpass filter properties */ + public static final int + AL_BANDPASS_GAIN = 0x1, + AL_BANDPASS_GAINLF = 0x2, + AL_BANDPASS_GAINHF = 0x3; + + /** Filter type */ + public static final int + AL_FILTER_FIRST_PARAMETER = 0x0, + AL_FILTER_LAST_PARAMETER = 0x8000, + AL_FILTER_TYPE = 0x8001; + + /** Filter types. */ + public static final int + AL_FILTER_NULL = 0x0, + AL_FILTER_LOWPASS = 0x1, + AL_FILTER_HIGHPASS = 0x2, + AL_FILTER_BANDPASS = 0x3; + + /** Source property value ranges and defaults */ + public static final float + AL_MIN_AIR_ABSORPTION_FACTOR = 0.0f, + AL_MAX_AIR_ABSORPTION_FACTOR = 10.0f, + AL_DEFAULT_AIR_ABSORPTION_FACTOR = 0.0f, + AL_MIN_ROOM_ROLLOFF_FACTOR = 0.0f, + AL_MAX_ROOM_ROLLOFF_FACTOR = 10.0f, + AL_DEFAULT_ROOM_ROLLOFF_FACTOR = 0.0f, + AL_MIN_CONE_OUTER_GAINHF = 0.0f, + AL_MAX_CONE_OUTER_GAINHF = 1.0f, + AL_DEFAULT_CONE_OUTER_GAINHF = 1.0f; + + /** Source property value ranges and defaults */ + public static final int + AL_MIN_DIRECT_FILTER_GAINHF_AUTO = 0x0, + AL_MAX_DIRECT_FILTER_GAINHF_AUTO = 0x1, + AL_DEFAULT_DIRECT_FILTER_GAINHF_AUTO = 0x1, + AL_MIN_AUXILIARY_SEND_FILTER_GAIN_AUTO = 0x0, + AL_MAX_AUXILIARY_SEND_FILTER_GAIN_AUTO = 0x1, + AL_DEFAULT_AUXILIARY_SEND_FILTER_GAIN_AUTO = 0x1, + AL_MIN_AUXILIARY_SEND_FILTER_GAINHF_AUTO = 0x0, + AL_MAX_AUXILIARY_SEND_FILTER_GAINHF_AUTO = 0x1, + AL_DEFAULT_AUXILIARY_SEND_FILTER_GAINHF_AUTO = 0x1; + + /** Listener property value ranges and defaults. */ + public static final float + AL_MIN_METERS_PER_UNIT = 0x0.000002P-126f, + AL_MAX_METERS_PER_UNIT = 0x1.fffffeP+127f, + AL_DEFAULT_METERS_PER_UNIT = 1.0f; + + /** Reverb effect parameter ranges and defaults */ + public static final float + AL_REVERB_MIN_DENSITY = 0.0f, + AL_REVERB_MAX_DENSITY = 1.0f, + AL_REVERB_DEFAULT_DENSITY = 1.0f, + AL_REVERB_MIN_DIFFUSION = 0.0f, + AL_REVERB_MAX_DIFFUSION = 1.0f, + AL_REVERB_DEFAULT_DIFFUSION = 1.0f, + AL_REVERB_MIN_GAIN = 0.0f, + AL_REVERB_MAX_GAIN = 1.0f, + AL_REVERB_DEFAULT_GAIN = 0.32f, + AL_REVERB_MIN_GAINHF = 0.0f, + AL_REVERB_MAX_GAINHF = 1.0f, + AL_REVERB_DEFAULT_GAINHF = 0.89f, + AL_REVERB_MIN_DECAY_TIME = 0.1f, + AL_REVERB_MAX_DECAY_TIME = 20.0f, + AL_REVERB_DEFAULT_DECAY_TIME = 1.49f, + AL_REVERB_MIN_DECAY_HFRATIO = 0.1f, + AL_REVERB_MAX_DECAY_HFRATIO = 2.0f, + AL_REVERB_DEFAULT_DECAY_HFRATIO = 0.83f, + AL_REVERB_MIN_REFLECTIONS_GAIN = 0.0f, + AL_REVERB_MAX_REFLECTIONS_GAIN = 3.16f, + AL_REVERB_DEFAULT_REFLECTIONS_GAIN = 0.05f, + AL_REVERB_MIN_REFLECTIONS_DELAY = 0.0f, + AL_REVERB_MAX_REFLECTIONS_DELAY = 0.3f, + AL_REVERB_DEFAULT_REFLECTIONS_DELAY = 0.007f, + AL_REVERB_MIN_LATE_REVERB_GAIN = 0.0f, + AL_REVERB_MAX_LATE_REVERB_GAIN = 10.0f, + AL_REVERB_DEFAULT_LATE_REVERB_GAIN = 1.26f, + AL_REVERB_MIN_LATE_REVERB_DELAY = 0.0f, + AL_REVERB_MAX_LATE_REVERB_DELAY = 0.1f, + AL_REVERB_DEFAULT_LATE_REVERB_DELAY = 0.011f, + AL_REVERB_MIN_AIR_ABSORPTION_GAINHF = 0.892f, + AL_REVERB_MAX_AIR_ABSORPTION_GAINHF = 1.0f, + AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF = 0.994f, + AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR = 0.0f, + AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR = 10.0f, + AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR = 0.0f; + + /** Reverb effect parameter ranges and defaults */ + public static final int + AL_REVERB_MIN_DECAY_HFLIMIT = 0x0, + AL_REVERB_MAX_DECAY_HFLIMIT = 0x1, + AL_REVERB_DEFAULT_DECAY_HFLIMIT = 0x1; + + /** EAX reverb effect parameter ranges and defaults */ + public static final float + AL_EAXREVERB_MIN_DENSITY = 0.0f, + AL_EAXREVERB_MAX_DENSITY = 1.0f, + AL_EAXREVERB_DEFAULT_DENSITY = 1.0f, + AL_EAXREVERB_MIN_DIFFUSION = 0.0f, + AL_EAXREVERB_MAX_DIFFUSION = 1.0f, + AL_EAXREVERB_DEFAULT_DIFFUSION = 1.0f, + AL_EAXREVERB_MIN_GAIN = 0.0f, + AL_EAXREVERB_MAX_GAIN = 1.0f, + AL_EAXREVERB_DEFAULT_GAIN = 0.32f, + AL_EAXREVERB_MIN_GAINHF = 0.0f, + AL_EAXREVERB_MAX_GAINHF = 1.0f, + AL_EAXREVERB_DEFAULT_GAINHF = 0.89f, + AL_EAXREVERB_MIN_GAINLF = 0.0f, + AL_EAXREVERB_MAX_GAINLF = 1.0f, + AL_EAXREVERB_DEFAULT_GAINLF = 1.0f, + AL_EAXREVERB_MIN_DECAY_TIME = 0.1f, + AL_EAXREVERB_MAX_DECAY_TIME = 20.0f, + AL_EAXREVERB_DEFAULT_DECAY_TIME = 1.49f, + AL_EAXREVERB_MIN_DECAY_HFRATIO = 0.1f, + AL_EAXREVERB_MAX_DECAY_HFRATIO = 2.0f, + AL_EAXREVERB_DEFAULT_DECAY_HFRATIO = 0.83f, + AL_EAXREVERB_MIN_DECAY_LFRATIO = 0.1f, + AL_EAXREVERB_MAX_DECAY_LFRATIO = 2.0f, + AL_EAXREVERB_DEFAULT_DECAY_LFRATIO = 1.0f, + AL_EAXREVERB_MIN_REFLECTIONS_GAIN = 0.0f, + AL_EAXREVERB_MAX_REFLECTIONS_GAIN = 3.16f, + AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN = 0.05f, + AL_EAXREVERB_MIN_REFLECTIONS_DELAY = 0.0f, + AL_EAXREVERB_MAX_REFLECTIONS_DELAY = 0.3f, + AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY = 0.007f, + AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ = 0.0f, + AL_EAXREVERB_MIN_LATE_REVERB_GAIN = 0.0f, + AL_EAXREVERB_MAX_LATE_REVERB_GAIN = 10.0f, + AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN = 1.26f, + AL_EAXREVERB_MIN_LATE_REVERB_DELAY = 0.0f, + AL_EAXREVERB_MAX_LATE_REVERB_DELAY = 0.1f, + AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY = 0.011f, + AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ = 0.0f, + AL_EAXREVERB_MIN_ECHO_TIME = 0.075f, + AL_EAXREVERB_MAX_ECHO_TIME = 0.25f, + AL_EAXREVERB_DEFAULT_ECHO_TIME = 0.25f, + AL_EAXREVERB_MIN_ECHO_DEPTH = 0.0f, + AL_EAXREVERB_MAX_ECHO_DEPTH = 1.0f, + AL_EAXREVERB_DEFAULT_ECHO_DEPTH = 0.0f, + AL_EAXREVERB_MIN_MODULATION_TIME = 0.04f, + AL_EAXREVERB_MAX_MODULATION_TIME = 4.0f, + AL_EAXREVERB_DEFAULT_MODULATION_TIME = 0.25f, + AL_EAXREVERB_MIN_MODULATION_DEPTH = 0.0f, + AL_EAXREVERB_MAX_MODULATION_DEPTH = 1.0f, + AL_EAXREVERB_DEFAULT_MODULATION_DEPTH = 0.0f, + AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF = 0.892f, + AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF = 1.0f, + AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF = 0.994f, + AL_EAXREVERB_MIN_HFREFERENCE = 1000.0f, + AL_EAXREVERB_MAX_HFREFERENCE = 20000.0f, + AL_EAXREVERB_DEFAULT_HFREFERENCE = 5000.0f, + AL_EAXREVERB_MIN_LFREFERENCE = 20.0f, + AL_EAXREVERB_MAX_LFREFERENCE = 1000.0f, + AL_EAXREVERB_DEFAULT_LFREFERENCE = 250.0f, + AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR = 0.0f, + AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR = 10.0f, + AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR = 0.0f; + + /** EAX reverb effect parameter ranges and defaults */ + public static final int + AL_EAXREVERB_MIN_DECAY_HFLIMIT = 0x0, + AL_EAXREVERB_MAX_DECAY_HFLIMIT = 0x1, + AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT = 0x1; + + /** Chorus effect parameter ranges and defaults */ + public static final int + AL_CHORUS_WAVEFORM_SINUSOID = 0, + AL_CHORUS_WAVEFORM_TRIANGLE = 1, + AL_CHORUS_MIN_WAVEFORM = 0, + AL_CHORUS_MAX_WAVEFORM = 1, + AL_CHORUS_DEFAULT_WAVEFORM = 1, + AL_CHORUS_MIN_PHASE = -180, + AL_CHORUS_MAX_PHASE = 180, + AL_CHORUS_DEFAULT_PHASE = 90; + + /** Chorus effect parameter ranges and defaults */ + public static final float + AL_CHORUS_MIN_RATE = 0.0f, + AL_CHORUS_MAX_RATE = 10.0f, + AL_CHORUS_DEFAULT_RATE = 1.1f, + AL_CHORUS_MIN_DEPTH = 0.0f, + AL_CHORUS_MAX_DEPTH = 1.0f, + AL_CHORUS_DEFAULT_DEPTH = 0.1f, + AL_CHORUS_MIN_FEEDBACK = -1.0f, + AL_CHORUS_MAX_FEEDBACK = 1.0f, + AL_CHORUS_DEFAULT_FEEDBACK = 0.25f, + AL_CHORUS_MIN_DELAY = 0.0f, + AL_CHORUS_MAX_DELAY = 0.016f, + AL_CHORUS_DEFAULT_DELAY = 0.016f; + + /** Distortion effect parameter ranges and defaults */ + public static final float + AL_DISTORTION_MIN_EDGE = 0.0f, + AL_DISTORTION_MAX_EDGE = 1.0f, + AL_DISTORTION_DEFAULT_EDGE = 0.2f, + AL_DISTORTION_MIN_GAIN = 0.01f, + AL_DISTORTION_MAX_GAIN = 1.0f, + AL_DISTORTION_DEFAULT_GAIN = 0.05f, + AL_DISTORTION_MIN_LOWPASS_CUTOFF = 80.0f, + AL_DISTORTION_MAX_LOWPASS_CUTOFF = 24000.0f, + AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF = 8000.0f, + AL_DISTORTION_MIN_EQCENTER = 80.0f, + AL_DISTORTION_MAX_EQCENTER = 24000.0f, + AL_DISTORTION_DEFAULT_EQCENTER = 3600.0f, + AL_DISTORTION_MIN_EQBANDWIDTH = 80.0f, + AL_DISTORTION_MAX_EQBANDWIDTH = 24000.0f, + AL_DISTORTION_DEFAULT_EQBANDWIDTH = 3600.0f; + + /** Echo effect parameter ranges and defaults */ + public static final float + AL_ECHO_MIN_DELAY = 0.0f, + AL_ECHO_MAX_DELAY = 0.207f, + AL_ECHO_DEFAULT_DELAY = 0.1f, + AL_ECHO_MIN_LRDELAY = 0.0f, + AL_ECHO_MAX_LRDELAY = 0.404f, + AL_ECHO_DEFAULT_LRDELAY = 0.1f, + AL_ECHO_MIN_DAMPING = 0.0f, + AL_ECHO_MAX_DAMPING = 0.99f, + AL_ECHO_DEFAULT_DAMPING = 0.5f, + AL_ECHO_MIN_FEEDBACK = 0.0f, + AL_ECHO_MAX_FEEDBACK = 1.0f, + AL_ECHO_DEFAULT_FEEDBACK = 0.5f, + AL_ECHO_MIN_SPREAD = -1.0f, + AL_ECHO_MAX_SPREAD = 1.0f, + AL_ECHO_DEFAULT_SPREAD = -1.0f; + + /** Flanger effect parameter ranges and defaults */ + public static final int + AL_FLANGER_WAVEFORM_SINUSOID = 0, + AL_FLANGER_WAVEFORM_TRIANGLE = 1, + AL_FLANGER_MIN_WAVEFORM = 0, + AL_FLANGER_MAX_WAVEFORM = 1, + AL_FLANGER_DEFAULT_WAVEFORM = 1, + AL_FLANGER_MIN_PHASE = -180, + AL_FLANGER_MAX_PHASE = 180, + AL_FLANGER_DEFAULT_PHASE = 0; + + /** Flanger effect parameter ranges and defaults */ + public static final float + AL_FLANGER_MIN_RATE = 0.0f, + AL_FLANGER_MAX_RATE = 10.0f, + AL_FLANGER_DEFAULT_RATE = 0.27f, + AL_FLANGER_MIN_DEPTH = 0.0f, + AL_FLANGER_MAX_DEPTH = 1.0f, + AL_FLANGER_DEFAULT_DEPTH = 1.0f, + AL_FLANGER_MIN_FEEDBACK = -1.0f, + AL_FLANGER_MAX_FEEDBACK = 1.0f, + AL_FLANGER_DEFAULT_FEEDBACK = -0.5f, + AL_FLANGER_MIN_DELAY = 0.0f, + AL_FLANGER_MAX_DELAY = 0.004f, + AL_FLANGER_DEFAULT_DELAY = 0.002f; + + /** Frequency shifter effect parameter ranges and defaults */ + public static final float + AL_FREQUENCY_SHIFTER_MIN_FREQUENCY = 0.0f, + AL_FREQUENCY_SHIFTER_MAX_FREQUENCY = 24000.0f, + AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY = 0.0f; + + /** Frequency shifter effect parameter ranges and defaults */ + public static final int + AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION = 0, + AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION = 2, + AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION = 0, + AL_FREQUENCY_SHIFTER_DIRECTION_DOWN = 0, + AL_FREQUENCY_SHIFTER_DIRECTION_UP = 1, + AL_FREQUENCY_SHIFTER_DIRECTION_OFF = 2, + AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION = 0, + AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION = 2, + AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION = 0; + + /** Vocal morpher effect parameter ranges and defaults */ + public static final int + AL_VOCAL_MORPHER_MIN_PHONEMEA = 0, + AL_VOCAL_MORPHER_MAX_PHONEMEA = 29, + AL_VOCAL_MORPHER_DEFAULT_PHONEMEA = 0, + AL_VOCAL_MORPHER_MIN_PHONEMEA_COARSE_TUNING = -24, + AL_VOCAL_MORPHER_MAX_PHONEMEA_COARSE_TUNING = 24, + AL_VOCAL_MORPHER_DEFAULT_PHONEMEA_COARSE_TUNING = 0, + AL_VOCAL_MORPHER_MIN_PHONEMEB = 0, + AL_VOCAL_MORPHER_MAX_PHONEMEB = 29, + AL_VOCAL_MORPHER_DEFAULT_PHONEMEB = 10, + AL_VOCAL_MORPHER_MIN_PHONEMEB_COARSE_TUNING = -24, + AL_VOCAL_MORPHER_MAX_PHONEMEB_COARSE_TUNING = 24, + AL_VOCAL_MORPHER_DEFAULT_PHONEMEB_COARSE_TUNING = 0, + AL_VOCAL_MORPHER_PHONEME_A = 0, + AL_VOCAL_MORPHER_PHONEME_E = 1, + AL_VOCAL_MORPHER_PHONEME_I = 2, + AL_VOCAL_MORPHER_PHONEME_O = 3, + AL_VOCAL_MORPHER_PHONEME_U = 4, + AL_VOCAL_MORPHER_PHONEME_AA = 5, + AL_VOCAL_MORPHER_PHONEME_AE = 6, + AL_VOCAL_MORPHER_PHONEME_AH = 7, + AL_VOCAL_MORPHER_PHONEME_AO = 8, + AL_VOCAL_MORPHER_PHONEME_EH = 9, + AL_VOCAL_MORPHER_PHONEME_ER = 10, + AL_VOCAL_MORPHER_PHONEME_IH = 11, + AL_VOCAL_MORPHER_PHONEME_IY = 12, + AL_VOCAL_MORPHER_PHONEME_UH = 13, + AL_VOCAL_MORPHER_PHONEME_UW = 14, + AL_VOCAL_MORPHER_PHONEME_B = 15, + AL_VOCAL_MORPHER_PHONEME_D = 16, + AL_VOCAL_MORPHER_PHONEME_F = 17, + AL_VOCAL_MORPHER_PHONEME_G = 18, + AL_VOCAL_MORPHER_PHONEME_J = 19, + AL_VOCAL_MORPHER_PHONEME_K = 20, + AL_VOCAL_MORPHER_PHONEME_L = 21, + AL_VOCAL_MORPHER_PHONEME_M = 22, + AL_VOCAL_MORPHER_PHONEME_N = 23, + AL_VOCAL_MORPHER_PHONEME_P = 24, + AL_VOCAL_MORPHER_PHONEME_R = 25, + AL_VOCAL_MORPHER_PHONEME_S = 26, + AL_VOCAL_MORPHER_PHONEME_T = 27, + AL_VOCAL_MORPHER_PHONEME_V = 28, + AL_VOCAL_MORPHER_PHONEME_Z = 29, + AL_VOCAL_MORPHER_WAVEFORM_SINUSOID = 0, + AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE = 1, + AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH = 2, + AL_VOCAL_MORPHER_MIN_WAVEFORM = 0, + AL_VOCAL_MORPHER_MAX_WAVEFORM = 2, + AL_VOCAL_MORPHER_DEFAULT_WAVEFORM = 0; + + /** Vocal morpher effect parameter ranges and defaults */ + public static final float + AL_VOCAL_MORPHER_MIN_RATE = 0.0f, + AL_VOCAL_MORPHER_MAX_RATE = 10.0f, + AL_VOCAL_MORPHER_DEFAULT_RATE = 1.41f; + + /** Pitch shifter effect parameter ranges and defaults */ + public static final int + AL_PITCH_SHIFTER_MIN_COARSE_TUNE = -12, + AL_PITCH_SHIFTER_MAX_COARSE_TUNE = 12, + AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE = 12, + AL_PITCH_SHIFTER_MIN_FINE_TUNE = -50, + AL_PITCH_SHIFTER_MAX_FINE_TUNE = 50, + AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE = 0; + + /** Ring modulator effect parameter ranges and defaults */ + public static final float + AL_RING_MODULATOR_MIN_FREQUENCY = 0.0f, + AL_RING_MODULATOR_MAX_FREQUENCY = 8000.0f, + AL_RING_MODULATOR_DEFAULT_FREQUENCY = 440.0f, + AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF = 0.0f, + AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF = 24000.0f, + AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF = 800.0f; + + /** Ring modulator effect parameter ranges and defaults */ + public static final int + AL_RING_MODULATOR_SINUSOID = 0, + AL_RING_MODULATOR_SAWTOOTH = 1, + AL_RING_MODULATOR_SQUARE = 2, + AL_RING_MODULATOR_MIN_WAVEFORM = 0, + AL_RING_MODULATOR_MAX_WAVEFORM = 2, + AL_RING_MODULATOR_DEFAULT_WAVEFORM = 0; + + /** Autowah effect parameter ranges and defaults */ + public static final float + AL_AUTOWAH_MIN_ATTACK_TIME = 1.0E-4f, + AL_AUTOWAH_MAX_ATTACK_TIME = 1.0f, + AL_AUTOWAH_DEFAULT_ATTACK_TIME = 0.06f, + AL_AUTOWAH_MIN_RELEASE_TIME = 1.0E-4f, + AL_AUTOWAH_MAX_RELEASE_TIME = 1.0f, + AL_AUTOWAH_DEFAULT_RELEASE_TIME = 0.06f, + AL_AUTOWAH_MIN_RESONANCE = 2.0f, + AL_AUTOWAH_MAX_RESONANCE = 1000.0f, + AL_AUTOWAH_DEFAULT_RESONANCE = 1000.0f, + AL_AUTOWAH_MIN_PEAK_GAIN = 3.0E-5f, + AL_AUTOWAH_MAX_PEAK_GAIN = 31621.0f, + AL_AUTOWAH_DEFAULT_PEAK_GAIN = 11.22f; + + /** Compressor effect parameter ranges and defaults */ + public static final int + AL_COMPRESSOR_MIN_ONOFF = 0, + AL_COMPRESSOR_MAX_ONOFF = 1, + AL_COMPRESSOR_DEFAULT_ONOFF = 1; + + /** Equalizer effect parameter ranges and defaults */ + public static final float + AL_EQUALIZER_MIN_LOW_GAIN = 0.126f, + AL_EQUALIZER_MAX_LOW_GAIN = 7.943f, + AL_EQUALIZER_DEFAULT_LOW_GAIN = 1.0f, + AL_EQUALIZER_MIN_LOW_CUTOFF = 50.0f, + AL_EQUALIZER_MAX_LOW_CUTOFF = 800.0f, + AL_EQUALIZER_DEFAULT_LOW_CUTOFF = 200.0f, + AL_EQUALIZER_MIN_MID1_GAIN = 0.126f, + AL_EQUALIZER_MAX_MID1_GAIN = 7.943f, + AL_EQUALIZER_DEFAULT_MID1_GAIN = 1.0f, + AL_EQUALIZER_MIN_MID1_CENTER = 200.0f, + AL_EQUALIZER_MAX_MID1_CENTER = 3000.0f, + AL_EQUALIZER_DEFAULT_MID1_CENTER = 500.0f, + AL_EQUALIZER_MIN_MID1_WIDTH = 0.01f, + AL_EQUALIZER_MAX_MID1_WIDTH = 1.0f, + AL_EQUALIZER_DEFAULT_MID1_WIDTH = 1.0f, + AL_EQUALIZER_MIN_MID2_GAIN = 0.126f, + AL_EQUALIZER_MAX_MID2_GAIN = 7.943f, + AL_EQUALIZER_DEFAULT_MID2_GAIN = 1.0f, + AL_EQUALIZER_MIN_MID2_CENTER = 1000.0f, + AL_EQUALIZER_MAX_MID2_CENTER = 8000.0f, + AL_EQUALIZER_DEFAULT_MID2_CENTER = 3000.0f, + AL_EQUALIZER_MIN_MID2_WIDTH = 0.01f, + AL_EQUALIZER_MAX_MID2_WIDTH = 1.0f, + AL_EQUALIZER_DEFAULT_MID2_WIDTH = 1.0f, + AL_EQUALIZER_MIN_HIGH_GAIN = 0.126f, + AL_EQUALIZER_MAX_HIGH_GAIN = 7.943f, + AL_EQUALIZER_DEFAULT_HIGH_GAIN = 1.0f, + AL_EQUALIZER_MIN_HIGH_CUTOFF = 4000.0f, + AL_EQUALIZER_MAX_HIGH_CUTOFF = 16000.0f, + AL_EQUALIZER_DEFAULT_HIGH_CUTOFF = 6000.0f; + + /** Lowpass filter parameter ranges and defaults */ + public static final float + AL_LOWPASS_MIN_GAIN = 0.0f, + AL_LOWPASS_MAX_GAIN = 1.0f, + AL_LOWPASS_DEFAULT_GAIN = 1.0f, + AL_LOWPASS_MIN_GAINHF = 0.0f, + AL_LOWPASS_MAX_GAINHF = 1.0f, + AL_LOWPASS_DEFAULT_GAINHF = 1.0f; + + /** Highpass filter parameter ranges and defaults */ + public static final float + AL_HIGHPASS_MIN_GAIN = 0.0f, + AL_HIGHPASS_MAX_GAIN = 1.0f, + AL_HIGHPASS_DEFAULT_GAIN = 1.0f, + AL_HIGHPASS_MIN_GAINLF = 0.0f, + AL_HIGHPASS_MAX_GAINLF = 1.0f, + AL_HIGHPASS_DEFAULT_GAINLF = 1.0f; + + /** Bandpass filter parameter ranges and defaults */ + public static final float + AL_BANDPASS_MIN_GAIN = 0.0f, + AL_BANDPASS_MAX_GAIN = 1.0f, + AL_BANDPASS_DEFAULT_GAIN = 1.0f, + AL_BANDPASS_MIN_GAINHF = 0.0f, + AL_BANDPASS_MAX_GAINHF = 1.0f, + AL_BANDPASS_DEFAULT_GAINHF = 1.0f, + AL_BANDPASS_MIN_GAINLF = 0.0f, + AL_BANDPASS_MAX_GAINLF = 1.0f, + AL_BANDPASS_DEFAULT_GAINLF = 1.0f; + + protected EXTEfx() { + throw new UnsupportedOperationException(); + } + + // --- [ alGenEffects ] --- + + /** + * Unsafe version of: {@link #alGenEffects GenEffects} + * + * @param n the number of effects be to generated + */ + public static void nalGenEffects(int n, long effects) { + long __functionAddress = AL.getICD().alGenEffects; + if (CHECKS) { + check(__functionAddress); + } + invokePV(n, effects, __functionAddress); + } + + /** + * Requests a number of effects. + * + * @param effects the buffer that will receive the effects + */ + @NativeType("ALvoid") + public static void alGenEffects(@NativeType("ALuint *") IntBuffer effects) { + nalGenEffects(effects.remaining(), memAddress(effects)); + } + + /** Requests a number of effects. */ + @NativeType("ALvoid") + public static int alGenEffects() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer effects = stack.callocInt(1); + nalGenEffects(1, memAddress(effects)); + return effects.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alDeleteEffects ] --- + + /** + * Unsafe version of: {@link #alDeleteEffects DeleteEffects} + * + * @param n the number of effects be to deleted + */ + public static void nalDeleteEffects(int n, long effects) { + long __functionAddress = AL.getICD().alDeleteEffects; + if (CHECKS) { + check(__functionAddress); + } + invokePV(n, effects, __functionAddress); + } + + /** + * Deletes a number of effects. + * + * @param effects the effect to delete + */ + @NativeType("ALvoid") + public static void alDeleteEffects(@NativeType("ALuint *") IntBuffer effects) { + nalDeleteEffects(effects.remaining(), memAddress(effects)); + } + + /** Deletes a number of effects. */ + @NativeType("ALvoid") + public static void alDeleteEffects(@NativeType("ALuint *") int effect) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer effects = stack.ints(effect); + nalDeleteEffects(1, memAddress(effects)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alIsEffect ] --- + + /** + * Verifies whether the given object name is an effect. + * + * @param effect a value that may be a effect name + */ + @NativeType("ALboolean") + public static boolean alIsEffect(@NativeType("ALuint") int effect) { + long __functionAddress = AL.getICD().alIsEffect; + if (CHECKS) { + check(__functionAddress); + } + return invokeZ(effect, __functionAddress); + } + + // --- [ alEffecti ] --- + + /** + * Sets the integer value of an effect parameter. + * + * @param effect the effect to modify + * @param param the parameter to modify + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alEffecti(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALint") int value) { + long __functionAddress = AL.getICD().alEffecti; + if (CHECKS) { + check(__functionAddress); + } + invokeV(effect, param, value, __functionAddress); + } + + // --- [ alEffectiv ] --- + + /** Unsafe version of: {@link #alEffectiv Effectiv} */ + public static void nalEffectiv(int effect, int param, long values) { + long __functionAddress = AL.getICD().alEffectiv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effect, param, values, __functionAddress); + } + + /** + * Pointer version of {@link #alEffecti Effecti}. + * + * @param effect the effect to modify + * @param param the parameter to modify + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alEffectiv(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALint const *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalEffectiv(effect, param, memAddress(values)); + } + + // --- [ alEffectf ] --- + + /** + * Sets the float value of an effect parameter. + * + * @param effect the effect to modify + * @param param the parameter to modify + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alEffectf(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALfloat") float value) { + long __functionAddress = AL.getICD().alEffectf; + if (CHECKS) { + check(__functionAddress); + } + invokeV(effect, param, value, __functionAddress); + } + + // --- [ alEffectfv ] --- + + /** Unsafe version of: {@link #alEffectfv Effectfv} */ + public static void nalEffectfv(int effect, int param, long values) { + long __functionAddress = AL.getICD().alEffectfv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effect, param, values, __functionAddress); + } + + /** + * Pointer version of {@link #alEffectf Effectf}. + * + * @param effect the effect to modify + * @param param the parameter to modify + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alEffectfv(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALfloat const *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalEffectfv(effect, param, memAddress(values)); + } + + // --- [ alGetEffecti ] --- + + /** Unsafe version of: {@link #alGetEffecti GetEffecti} */ + public static void nalGetEffecti(int effect, int param, long value) { + long __functionAddress = AL.getICD().alGetEffecti; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effect, param, value, __functionAddress); + } + + /** + * Returns the integer value of the specified effect parameter. + * + * @param effect the effect to query + * @param param the parameter to query + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetEffecti(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALint *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetEffecti(effect, param, memAddress(value)); + } + + /** + * Returns the integer value of the specified effect parameter. + * + * @param effect the effect to query + * @param param the parameter to query + */ + @NativeType("ALvoid") + public static int alGetEffecti(@NativeType("ALuint") int effect, @NativeType("ALenum") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer value = stack.callocInt(1); + nalGetEffecti(effect, param, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetEffectiv ] --- + + /** Unsafe version of: {@link #alGetEffectiv GetEffectiv} */ + public static void nalGetEffectiv(int effect, int param, long values) { + long __functionAddress = AL.getICD().alGetEffectiv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effect, param, values, __functionAddress); + } + + /** + * Returns the integer values of the specified effect parameter. + * + * @param effect the effect to query + * @param param the parameter to query + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetEffectiv(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALint *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetEffectiv(effect, param, memAddress(values)); + } + + // --- [ alGetEffectf ] --- + + /** Unsafe version of: {@link #alGetEffectf GetEffectf} */ + public static void nalGetEffectf(int effect, int param, long value) { + long __functionAddress = AL.getICD().alGetEffectf; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effect, param, value, __functionAddress); + } + + /** + * Returns the float value of the specified effect parameter. + * + * @param effect the effect to query + * @param param the parameter to query + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetEffectf(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALfloat *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetEffectf(effect, param, memAddress(value)); + } + + /** + * Returns the float value of the specified effect parameter. + * + * @param effect the effect to query + * @param param the parameter to query + */ + @NativeType("ALvoid") + public static float alGetEffectf(@NativeType("ALuint") int effect, @NativeType("ALenum") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer value = stack.callocFloat(1); + nalGetEffectf(effect, param, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetEffectfv ] --- + + /** Unsafe version of: {@link #alGetEffectfv GetEffectfv} */ + public static void nalGetEffectfv(int effect, int param, long values) { + long __functionAddress = AL.getICD().alGetEffectfv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effect, param, values, __functionAddress); + } + + /** + * Returns the float values of the specified effect parameter. + * + * @param effect the effect to query + * @param param the parameter to query + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetEffectfv(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALfloat *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetEffectfv(effect, param, memAddress(values)); + } + + // --- [ alGenFilters ] --- + + /** + * Unsafe version of: {@link #alGenFilters GenFilters} + * + * @param n the number of filters be to generated + */ + public static void nalGenFilters(int n, long filters) { + long __functionAddress = AL.getICD().alGenFilters; + if (CHECKS) { + check(__functionAddress); + } + invokePV(n, filters, __functionAddress); + } + + /** + * Requests a number of filters. + * + * @param filters the buffer that will receive the filters + */ + @NativeType("ALvoid") + public static void alGenFilters(@NativeType("ALuint *") IntBuffer filters) { + nalGenFilters(filters.remaining(), memAddress(filters)); + } + + /** Requests a number of filters. */ + @NativeType("ALvoid") + public static int alGenFilters() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer filters = stack.callocInt(1); + nalGenFilters(1, memAddress(filters)); + return filters.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alDeleteFilters ] --- + + /** + * Unsafe version of: {@link #alDeleteFilters DeleteFilters} + * + * @param n the number of filters be to deleted + */ + public static void nalDeleteFilters(int n, long filters) { + long __functionAddress = AL.getICD().alDeleteFilters; + if (CHECKS) { + check(__functionAddress); + } + invokePV(n, filters, __functionAddress); + } + + /** + * Deletes a number of filters. + * + * @param filters the filter to delete + */ + @NativeType("ALvoid") + public static void alDeleteFilters(@NativeType("ALuint *") IntBuffer filters) { + nalDeleteFilters(filters.remaining(), memAddress(filters)); + } + + /** Deletes a number of filters. */ + @NativeType("ALvoid") + public static void alDeleteFilters(@NativeType("ALuint *") int filter) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer filters = stack.ints(filter); + nalDeleteFilters(1, memAddress(filters)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alIsFilter ] --- + + /** + * Verifies whether the given object name is a filter. + * + * @param filter a value that may be a filter name + */ + @NativeType("ALboolean") + public static boolean alIsFilter(@NativeType("ALuint") int filter) { + long __functionAddress = AL.getICD().alIsFilter; + if (CHECKS) { + check(__functionAddress); + } + return invokeZ(filter, __functionAddress); + } + + // --- [ alFilteri ] --- + + /** + * Sets the integer value of a filter parameter. + * + * @param filter the filter to modify + * @param param the parameter to modify + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alFilteri(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALint") int value) { + long __functionAddress = AL.getICD().alFilteri; + if (CHECKS) { + check(__functionAddress); + } + invokeV(filter, param, value, __functionAddress); + } + + // --- [ alFilteriv ] --- + + /** Unsafe version of: {@link #alFilteriv Filteriv} */ + public static void nalFilteriv(int filter, int param, long values) { + long __functionAddress = AL.getICD().alFilteriv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(filter, param, values, __functionAddress); + } + + /** + * Pointer version of {@link #alFilteri Filteri}. + * + * @param filter the filter to modify + * @param param the parameter to modify + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alFilteriv(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALint const *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalFilteriv(filter, param, memAddress(values)); + } + + // --- [ alFilterf ] --- + + /** + * Sets the float value of a filter parameter. + * + * @param filter the filter to modify + * @param param the parameter to modify + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alFilterf(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALfloat") float value) { + long __functionAddress = AL.getICD().alFilterf; + if (CHECKS) { + check(__functionAddress); + } + invokeV(filter, param, value, __functionAddress); + } + + // --- [ alFilterfv ] --- + + /** Unsafe version of: {@link #alFilterfv Filterfv} */ + public static void nalFilterfv(int filter, int param, long values) { + long __functionAddress = AL.getICD().alFilterfv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(filter, param, values, __functionAddress); + } + + /** + * Pointer version of {@link #alFilterf Filterf}. + * + * @param filter the filter to modify + * @param param the parameter to modify + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alFilterfv(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALfloat const *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalFilterfv(filter, param, memAddress(values)); + } + + // --- [ alGetFilteri ] --- + + /** Unsafe version of: {@link #alGetFilteri GetFilteri} */ + public static void nalGetFilteri(int filter, int param, long value) { + long __functionAddress = AL.getICD().alGetFilteri; + if (CHECKS) { + check(__functionAddress); + } + invokePV(filter, param, value, __functionAddress); + } + + /** + * Returns the integer value of the specified filter parameter. + * + * @param filter the filter to query + * @param param the parameter to query + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetFilteri(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALint *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetFilteri(filter, param, memAddress(value)); + } + + /** + * Returns the integer value of the specified filter parameter. + * + * @param filter the filter to query + * @param param the parameter to query + */ + @NativeType("ALvoid") + public static int alGetFilteri(@NativeType("ALuint") int filter, @NativeType("ALenum") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer value = stack.callocInt(1); + nalGetFilteri(filter, param, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetFilteriv ] --- + + /** Unsafe version of: {@link #alGetFilteriv GetFilteriv} */ + public static void nalGetFilteriv(int filter, int param, long values) { + long __functionAddress = AL.getICD().alGetFilteriv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(filter, param, values, __functionAddress); + } + + /** + * Returns the integer values of the specified filter parameter. + * + * @param filter the filter to query + * @param param the parameter to query + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetFilteriv(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALint *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetFilteriv(filter, param, memAddress(values)); + } + + // --- [ alGetFilterf ] --- + + /** Unsafe version of: {@link #alGetFilterf GetFilterf} */ + public static void nalGetFilterf(int filter, int param, long value) { + long __functionAddress = AL.getICD().alGetFilterf; + if (CHECKS) { + check(__functionAddress); + } + invokePV(filter, param, value, __functionAddress); + } + + /** + * Returns the float value of the specified filter parameter. + * + * @param filter the effect to query + * @param param the parameter to query + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetFilterf(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALfloat *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetFilterf(filter, param, memAddress(value)); + } + + /** + * Returns the float value of the specified filter parameter. + * + * @param filter the effect to query + * @param param the parameter to query + */ + @NativeType("ALvoid") + public static float alGetFilterf(@NativeType("ALuint") int filter, @NativeType("ALenum") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer value = stack.callocFloat(1); + nalGetFilterf(filter, param, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetFilterfv ] --- + + /** Unsafe version of: {@link #alGetFilterfv GetFilterfv} */ + public static void nalGetFilterfv(int filter, int param, long values) { + long __functionAddress = AL.getICD().alGetFilterfv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(filter, param, values, __functionAddress); + } + + /** + * Returns the float values of the specified filter parameter. + * + * @param filter the effect to query + * @param param the parameter to query + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetFilterfv(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALfloat *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetFilterfv(filter, param, memAddress(values)); + } + + // --- [ alGenAuxiliaryEffectSlots ] --- + + /** + * Unsafe version of: {@link #alGenAuxiliaryEffectSlots GenAuxiliaryEffectSlots} + * + * @param n the number of effect slots be to generated + */ + public static void nalGenAuxiliaryEffectSlots(int n, long effectSlots) { + long __functionAddress = AL.getICD().alGenAuxiliaryEffectSlots; + if (CHECKS) { + check(__functionAddress); + } + invokePV(n, effectSlots, __functionAddress); + } + + /** + * Requests a number of effect slots. + * + * @param effectSlots the buffer that will receive the effect slots + */ + @NativeType("ALvoid") + public static void alGenAuxiliaryEffectSlots(@NativeType("ALuint *") IntBuffer effectSlots) { + nalGenAuxiliaryEffectSlots(effectSlots.remaining(), memAddress(effectSlots)); + } + + /** Requests a number of effect slots. */ + @NativeType("ALvoid") + public static int alGenAuxiliaryEffectSlots() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer effectSlots = stack.callocInt(1); + nalGenAuxiliaryEffectSlots(1, memAddress(effectSlots)); + return effectSlots.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alDeleteAuxiliaryEffectSlots ] --- + + /** + * Unsafe version of: {@link #alDeleteAuxiliaryEffectSlots DeleteAuxiliaryEffectSlots} + * + * @param n the number of effect slots be to deleted + */ + public static void nalDeleteAuxiliaryEffectSlots(int n, long effectSlots) { + long __functionAddress = AL.getICD().alDeleteAuxiliaryEffectSlots; + if (CHECKS) { + check(__functionAddress); + } + invokePV(n, effectSlots, __functionAddress); + } + + /** + * Deletes a number of effect slots. + * + * @param effectSlots the effectSlot to delete + */ + @NativeType("ALvoid") + public static void alDeleteAuxiliaryEffectSlots(@NativeType("ALuint *") IntBuffer effectSlots) { + nalDeleteAuxiliaryEffectSlots(effectSlots.remaining(), memAddress(effectSlots)); + } + + /** Deletes a number of effect slots. */ + @NativeType("ALvoid") + public static void alDeleteAuxiliaryEffectSlots(@NativeType("ALuint *") int effectSlot) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer effectSlots = stack.ints(effectSlot); + nalDeleteAuxiliaryEffectSlots(1, memAddress(effectSlots)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alIsAuxiliaryEffectSlot ] --- + + /** + * Verifies whether the given object name is an effect slot. + * + * @param effectSlot a value that may be an effect slot name + */ + @NativeType("ALboolean") + public static boolean alIsAuxiliaryEffectSlot(@NativeType("ALuint") int effectSlot) { + long __functionAddress = AL.getICD().alIsAuxiliaryEffectSlot; + if (CHECKS) { + check(__functionAddress); + } + return invokeZ(effectSlot, __functionAddress); + } + + // --- [ alAuxiliaryEffectSloti ] --- + + /** + * Sets the integer value of an effect slot parameter. + * + * @param effectSlot the effect slot to modify + * @param param the parameter to modify + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alAuxiliaryEffectSloti(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALint") int value) { + long __functionAddress = AL.getICD().alAuxiliaryEffectSloti; + if (CHECKS) { + check(__functionAddress); + } + invokeV(effectSlot, param, value, __functionAddress); + } + + // --- [ alAuxiliaryEffectSlotiv ] --- + + /** Unsafe version of: {@link #alAuxiliaryEffectSlotiv AuxiliaryEffectSlotiv} */ + public static void nalAuxiliaryEffectSlotiv(int effectSlot, int param, long values) { + long __functionAddress = AL.getICD().alAuxiliaryEffectSlotiv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effectSlot, param, values, __functionAddress); + } + + /** + * Pointer version of {@link #alAuxiliaryEffectSloti AuxiliaryEffectSloti}. + * + * @param effectSlot the effect slot to modify + * @param param the parameter to modify + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alAuxiliaryEffectSlotiv(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALint const *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalAuxiliaryEffectSlotiv(effectSlot, param, memAddress(values)); + } + + // --- [ alAuxiliaryEffectSlotf ] --- + + /** + * Sets the float value of an effect slot parameter. + * + * @param effectSlot the effect slot to modify + * @param param the parameter to modify + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alAuxiliaryEffectSlotf(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALfloat") float value) { + long __functionAddress = AL.getICD().alAuxiliaryEffectSlotf; + if (CHECKS) { + check(__functionAddress); + } + invokeV(effectSlot, param, value, __functionAddress); + } + + // --- [ alAuxiliaryEffectSlotfv ] --- + + /** Unsafe version of: {@link #alAuxiliaryEffectSlotfv AuxiliaryEffectSlotfv} */ + public static void nalAuxiliaryEffectSlotfv(int effectSlot, int param, long values) { + long __functionAddress = AL.getICD().alAuxiliaryEffectSlotfv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effectSlot, param, values, __functionAddress); + } + + /** + * Pointer version of {@link #alAuxiliaryEffectSlotf AuxiliaryEffectSlotf}. + * + * @param effectSlot the effect slot to modify + * @param param the parameter to modify + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alAuxiliaryEffectSlotfv(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALfloat const *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalAuxiliaryEffectSlotfv(effectSlot, param, memAddress(values)); + } + + // --- [ alGetAuxiliaryEffectSloti ] --- + + /** Unsafe version of: {@link #alGetAuxiliaryEffectSloti GetAuxiliaryEffectSloti} */ + public static void nalGetAuxiliaryEffectSloti(int effectSlot, int param, long value) { + long __functionAddress = AL.getICD().alGetAuxiliaryEffectSloti; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effectSlot, param, value, __functionAddress); + } + + /** + * Returns the integer value of the specified effect slot parameter. + * + * @param effectSlot the effect slot to query + * @param param the parameter to query + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetAuxiliaryEffectSloti(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALint *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetAuxiliaryEffectSloti(effectSlot, param, memAddress(value)); + } + + /** + * Returns the integer value of the specified effect slot parameter. + * + * @param effectSlot the effect slot to query + * @param param the parameter to query + */ + @NativeType("ALvoid") + public static int alGetAuxiliaryEffectSloti(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer value = stack.callocInt(1); + nalGetAuxiliaryEffectSloti(effectSlot, param, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetAuxiliaryEffectSlotiv ] --- + + /** Unsafe version of: {@link #alGetAuxiliaryEffectSlotiv GetAuxiliaryEffectSlotiv} */ + public static void nalGetAuxiliaryEffectSlotiv(int effectSlot, int param, long values) { + long __functionAddress = AL.getICD().alGetAuxiliaryEffectSlotiv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effectSlot, param, values, __functionAddress); + } + + /** + * Returns the integer values of the specified effect slot parameter. + * + * @param effectSlot the effect slot to query + * @param param the parameter to query + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetAuxiliaryEffectSlotiv(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALint *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetAuxiliaryEffectSlotiv(effectSlot, param, memAddress(values)); + } + + // --- [ alGetAuxiliaryEffectSlotf ] --- + + /** Unsafe version of: {@link #alGetAuxiliaryEffectSlotf GetAuxiliaryEffectSlotf} */ + public static void nalGetAuxiliaryEffectSlotf(int effectSlot, int param, long value) { + long __functionAddress = AL.getICD().alGetAuxiliaryEffectSlotf; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effectSlot, param, value, __functionAddress); + } + + /** + * Returns the float value of the specified filter parameter. + * + * @param effectSlot the effect slot to query + * @param param the parameter to query + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alGetAuxiliaryEffectSlotf(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALfloat *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetAuxiliaryEffectSlotf(effectSlot, param, memAddress(value)); + } + + /** + * Returns the float value of the specified filter parameter. + * + * @param effectSlot the effect slot to query + * @param param the parameter to query + */ + @NativeType("ALvoid") + public static float alGetAuxiliaryEffectSlotf(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer value = stack.callocFloat(1); + nalGetAuxiliaryEffectSlotf(effectSlot, param, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetAuxiliaryEffectSlotfv ] --- + + /** Unsafe version of: {@link #alGetAuxiliaryEffectSlotfv GetAuxiliaryEffectSlotfv} */ + public static void nalGetAuxiliaryEffectSlotfv(int effectSlot, int param, long values) { + long __functionAddress = AL.getICD().alGetAuxiliaryEffectSlotfv; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effectSlot, param, values, __functionAddress); + } + + /** + * Returns the float values of the specified effect slot parameter. + * + * @param effectSlot the effect to query + * @param param the parameter to query + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetAuxiliaryEffectSlotfv(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALfloat *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetAuxiliaryEffectSlotfv(effectSlot, param, memAddress(values)); + } + + /** Array version of: {@link #alGenEffects GenEffects} */ + @NativeType("ALvoid") + public static void alGenEffects(@NativeType("ALuint *") int[] effects) { + long __functionAddress = AL.getICD().alGenEffects; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effects.length, effects, __functionAddress); + } + + /** Array version of: {@link #alDeleteEffects DeleteEffects} */ + @NativeType("ALvoid") + public static void alDeleteEffects(@NativeType("ALuint *") int[] effects) { + long __functionAddress = AL.getICD().alDeleteEffects; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effects.length, effects, __functionAddress); + } + + /** Array version of: {@link #alEffectiv Effectiv} */ + @NativeType("ALvoid") + public static void alEffectiv(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALint const *") int[] values) { + long __functionAddress = AL.getICD().alEffectiv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(effect, param, values, __functionAddress); + } + + /** Array version of: {@link #alEffectfv Effectfv} */ + @NativeType("ALvoid") + public static void alEffectfv(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALfloat const *") float[] values) { + long __functionAddress = AL.getICD().alEffectfv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(effect, param, values, __functionAddress); + } + + /** Array version of: {@link #alGetEffecti GetEffecti} */ + @NativeType("ALvoid") + public static void alGetEffecti(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALint *") int[] value) { + long __functionAddress = AL.getICD().alGetEffecti; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(effect, param, value, __functionAddress); + } + + /** Array version of: {@link #alGetEffectiv GetEffectiv} */ + @NativeType("ALvoid") + public static void alGetEffectiv(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALint *") int[] values) { + long __functionAddress = AL.getICD().alGetEffectiv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(effect, param, values, __functionAddress); + } + + /** Array version of: {@link #alGetEffectf GetEffectf} */ + @NativeType("ALvoid") + public static void alGetEffectf(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALfloat *") float[] value) { + long __functionAddress = AL.getICD().alGetEffectf; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(effect, param, value, __functionAddress); + } + + /** Array version of: {@link #alGetEffectfv GetEffectfv} */ + @NativeType("ALvoid") + public static void alGetEffectfv(@NativeType("ALuint") int effect, @NativeType("ALenum") int param, @NativeType("ALfloat *") float[] values) { + long __functionAddress = AL.getICD().alGetEffectfv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(effect, param, values, __functionAddress); + } + + /** Array version of: {@link #alGenFilters GenFilters} */ + @NativeType("ALvoid") + public static void alGenFilters(@NativeType("ALuint *") int[] filters) { + long __functionAddress = AL.getICD().alGenFilters; + if (CHECKS) { + check(__functionAddress); + } + invokePV(filters.length, filters, __functionAddress); + } + + /** Array version of: {@link #alDeleteFilters DeleteFilters} */ + @NativeType("ALvoid") + public static void alDeleteFilters(@NativeType("ALuint *") int[] filters) { + long __functionAddress = AL.getICD().alDeleteFilters; + if (CHECKS) { + check(__functionAddress); + } + invokePV(filters.length, filters, __functionAddress); + } + + /** Array version of: {@link #alFilteriv Filteriv} */ + @NativeType("ALvoid") + public static void alFilteriv(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALint const *") int[] values) { + long __functionAddress = AL.getICD().alFilteriv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(filter, param, values, __functionAddress); + } + + /** Array version of: {@link #alFilterfv Filterfv} */ + @NativeType("ALvoid") + public static void alFilterfv(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALfloat const *") float[] values) { + long __functionAddress = AL.getICD().alFilterfv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(filter, param, values, __functionAddress); + } + + /** Array version of: {@link #alGetFilteri GetFilteri} */ + @NativeType("ALvoid") + public static void alGetFilteri(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALint *") int[] value) { + long __functionAddress = AL.getICD().alGetFilteri; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(filter, param, value, __functionAddress); + } + + /** Array version of: {@link #alGetFilteriv GetFilteriv} */ + @NativeType("ALvoid") + public static void alGetFilteriv(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALint *") int[] values) { + long __functionAddress = AL.getICD().alGetFilteriv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(filter, param, values, __functionAddress); + } + + /** Array version of: {@link #alGetFilterf GetFilterf} */ + @NativeType("ALvoid") + public static void alGetFilterf(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALfloat *") float[] value) { + long __functionAddress = AL.getICD().alGetFilterf; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(filter, param, value, __functionAddress); + } + + /** Array version of: {@link #alGetFilterfv GetFilterfv} */ + @NativeType("ALvoid") + public static void alGetFilterfv(@NativeType("ALuint") int filter, @NativeType("ALenum") int param, @NativeType("ALfloat *") float[] values) { + long __functionAddress = AL.getICD().alGetFilterfv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(filter, param, values, __functionAddress); + } + + /** Array version of: {@link #alGenAuxiliaryEffectSlots GenAuxiliaryEffectSlots} */ + @NativeType("ALvoid") + public static void alGenAuxiliaryEffectSlots(@NativeType("ALuint *") int[] effectSlots) { + long __functionAddress = AL.getICD().alGenAuxiliaryEffectSlots; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effectSlots.length, effectSlots, __functionAddress); + } + + /** Array version of: {@link #alDeleteAuxiliaryEffectSlots DeleteAuxiliaryEffectSlots} */ + @NativeType("ALvoid") + public static void alDeleteAuxiliaryEffectSlots(@NativeType("ALuint *") int[] effectSlots) { + long __functionAddress = AL.getICD().alDeleteAuxiliaryEffectSlots; + if (CHECKS) { + check(__functionAddress); + } + invokePV(effectSlots.length, effectSlots, __functionAddress); + } + + /** Array version of: {@link #alAuxiliaryEffectSlotiv AuxiliaryEffectSlotiv} */ + @NativeType("ALvoid") + public static void alAuxiliaryEffectSlotiv(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALint const *") int[] values) { + long __functionAddress = AL.getICD().alAuxiliaryEffectSlotiv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(effectSlot, param, values, __functionAddress); + } + + /** Array version of: {@link #alAuxiliaryEffectSlotfv AuxiliaryEffectSlotfv} */ + @NativeType("ALvoid") + public static void alAuxiliaryEffectSlotfv(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALfloat const *") float[] values) { + long __functionAddress = AL.getICD().alAuxiliaryEffectSlotfv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(effectSlot, param, values, __functionAddress); + } + + /** Array version of: {@link #alGetAuxiliaryEffectSloti GetAuxiliaryEffectSloti} */ + @NativeType("ALvoid") + public static void alGetAuxiliaryEffectSloti(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALint *") int[] value) { + long __functionAddress = AL.getICD().alGetAuxiliaryEffectSloti; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(effectSlot, param, value, __functionAddress); + } + + /** Array version of: {@link #alGetAuxiliaryEffectSlotiv GetAuxiliaryEffectSlotiv} */ + @NativeType("ALvoid") + public static void alGetAuxiliaryEffectSlotiv(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALint *") int[] values) { + long __functionAddress = AL.getICD().alGetAuxiliaryEffectSlotiv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(effectSlot, param, values, __functionAddress); + } + + /** Array version of: {@link #alGetAuxiliaryEffectSlotf GetAuxiliaryEffectSlotf} */ + @NativeType("ALvoid") + public static void alGetAuxiliaryEffectSlotf(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALfloat *") float[] value) { + long __functionAddress = AL.getICD().alGetAuxiliaryEffectSlotf; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(effectSlot, param, value, __functionAddress); + } + + /** Array version of: {@link #alGetAuxiliaryEffectSlotfv GetAuxiliaryEffectSlotfv} */ + @NativeType("ALvoid") + public static void alGetAuxiliaryEffectSlotfv(@NativeType("ALuint") int effectSlot, @NativeType("ALenum") int param, @NativeType("ALfloat *") float[] values) { + long __functionAddress = AL.getICD().alGetAuxiliaryEffectSlotfv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(effectSlot, param, values, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTExponentDistance.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTExponentDistance.java new file mode 100644 index 000000000..d7a09e1fd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTExponentDistance.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the {@code AL_EXT_EXPONENT_DISTANCE} extension. + * + *

    An OpenAL 1.1 implementation will always support the {@code AL_EXT_EXPONENT_DISTANCE} extension. This allows an application written to the OpenAL 1.0 specification to + * access the exponent distance abilities.

    + */ +public final class EXTExponentDistance { + + /** {@code AL_EXT_EXPONENT_DISTANCE} tokens. */ + public static final int + AL_EXPONENT_DISTANCE = 0xD005, + AL_EXPONENT_DISTANCE_CLAMPED = 0xD006; + + private EXTExponentDistance() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTFloat32.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTFloat32.java new file mode 100644 index 000000000..655388e37 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTFloat32.java @@ -0,0 +1,18 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code AL_EXT_FLOAT32} extension. */ +public final class EXTFloat32 { + + /** Buffer formats. */ + public static final int + AL_FORMAT_MONO_FLOAT32 = 0x10010, + AL_FORMAT_STEREO_FLOAT32 = 0x10011; + + private EXTFloat32() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTIma4.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTIma4.java new file mode 100644 index 000000000..291ae714f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTIma4.java @@ -0,0 +1,18 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code AL_EXT_IMA4} extension. */ +public final class EXTIma4 { + + /** Buffer formats. */ + public static final int + AL_FORMAT_MONO_IMA4 = 0x1300, + AL_FORMAT_STEREO_IMA4 = 0x1301; + + private EXTIma4() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTLinearDistance.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTLinearDistance.java new file mode 100644 index 000000000..84ee13aa3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTLinearDistance.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the {@code AL_EXT_LINEAR_DISTANCE} extension. + * + *

    An OpenAL 1.1 implementation will always support the {@code AL_EXT_LINEAR_DISTANCE} extension. This allows an application written to the OpenAL 1.0 specification to + * access the offset abilities.

    + */ +public final class EXTLinearDistance { + + /** {@code AL_EXT_LINEAR_DISTANCE} tokens. */ + public static final int + AL_LINEAR_DISTANCE = 0xD003, + AL_LINEAR_DISTANCE_CLAMPED = 0xD004; + + private EXTLinearDistance() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMCFormats.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMCFormats.java new file mode 100644 index 000000000..13fd2475f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMCFormats.java @@ -0,0 +1,31 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code AL_EXT_MCFORMATS} extension. */ +public final class EXTMCFormats { + + /** Buffer formats. */ + public static final int + AL_FORMAT_QUAD8 = 0x1204, + AL_FORMAT_QUAD16 = 0x1205, + AL_FORMAT_QUAD32 = 0x1206, + AL_FORMAT_REAR8 = 0x1207, + AL_FORMAT_REAR16 = 0x1208, + AL_FORMAT_REAR32 = 0x1209, + AL_FORMAT_51CHN8 = 0x120A, + AL_FORMAT_51CHN16 = 0x120B, + AL_FORMAT_51CHN32 = 0x120C, + AL_FORMAT_61CHN8 = 0x120D, + AL_FORMAT_61CHN16 = 0x120E, + AL_FORMAT_61CHN32 = 0x120F, + AL_FORMAT_71CHN8 = 0x1210, + AL_FORMAT_71CHN16 = 0x1211, + AL_FORMAT_71CHN32 = 0x1212; + + private EXTMCFormats() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulaw.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulaw.java new file mode 100644 index 000000000..711272e7d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulaw.java @@ -0,0 +1,18 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code AL_EXT_MULAW} extension. */ +public final class EXTMulaw { + + /** Buffer formats. */ + public static final int + AL_FORMAT_MONO_MULAW_EXT = 0x10014, + AL_FORMAT_STEREO_MULAW_EXT = 0x10015; + + private EXTMulaw() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulawBFormat.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulawBFormat.java new file mode 100644 index 000000000..9600ba632 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulawBFormat.java @@ -0,0 +1,24 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the {@code AL_EXT_MULAW_BFORMAT} extension. + * + *

    This extension implies two MULAW formats are available, based on 2D and 3D Ambisonic B-Format.

    + * + *

    See {@link EXTBFormat EXT_BFORMAT} for a discussion of the channel numberings and meanings.

    + */ +public final class EXTMulawBFormat { + + /** Buffer formats. */ + public static final int + AL_FORMAT_BFORMAT2D_MULAW = 0x10031, + AL_FORMAT_BFORMAT3D_MULAW = 0x10032; + + private EXTMulawBFormat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulawMCFormats.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulawMCFormats.java new file mode 100644 index 000000000..d336a35bc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTMulawMCFormats.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code AL_EXT_MULAW_MCFORMATS} extension. */ +public final class EXTMulawMCFormats { + + /** Buffer formats. */ + public static final int + AL_FORMAT_MONO_MULAW = 0x10014, + AL_FORMAT_STEREO_MULAW = 0x10015, + AL_FORMAT_QUAD_MULAW = 0x10021, + AL_FORMAT_REAR_MULAW = 0x10022, + AL_FORMAT_51CHN_MULAW = 0x10023, + AL_FORMAT_61CHN_MULAW = 0x10024, + AL_FORMAT_71CHN_MULAW = 0x10025; + + private EXTMulawMCFormats() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTOffset.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTOffset.java new file mode 100644 index 000000000..43a3a73df --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTOffset.java @@ -0,0 +1,24 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the {@code AL_EXT_OFFSET} extension. + * + *

    An OpenAL 1.1 implementation will always support the {@code AL_EXT_OFFSET} extension. This allows an application written to the OpenAL 1.0 specification to + * access the offset abilities.

    + */ +public final class EXTOffset { + + /** {@code AL_EXT_OFFSET} tokens. */ + public static final int + AL_SEC_OFFSET = 0x1024, + AL_SAMPLE_OFFSET = 0x1025, + AL_BYTE_OFFSET = 0x1026; + + private EXTOffset() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTSourceDistanceModel.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTSourceDistanceModel.java new file mode 100644 index 000000000..0eb4e6e23 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTSourceDistanceModel.java @@ -0,0 +1,22 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the EXT_source_distance_model extension. + * + *

    This extension allows each source to specify a distance model, instead of being restricted to one distance model for every source in the context. It + * provides a mechanism for applications to apply different models to each source, without the burden of manually applying the attenuation through the + * source gain.

    + */ +public final class EXTSourceDistanceModel { + + /** Accepted by the {@code target} parameter of {@link AL10#alEnable Enable}, {@link AL10#alDisable Disable}, and {@link AL10#alIsEnabled IsEnabled}. */ + public static final int AL_SOURCE_DISTANCE_MODEL = 0x200; + + private EXTSourceDistanceModel() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTSourceRadius.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTSourceRadius.java new file mode 100644 index 000000000..66dd28790 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTSourceRadius.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the {@code AL_EXT_SOURCE_RADIUS} extension. + * + *

    This extension allows any mono source to be changed to be a "large" source with a radius. The source has a raised cosine shape.

    + */ +public final class EXTSourceRadius { + + /** + * Can be used with {@link AL10#alSourcef Sourcef} to set the source radius. Units are consistent with the coordinate system in use. The value must be at least zero. Use + * a value of zero to reset to a point source. + */ + public static final int AL_SOURCE_RADIUS = 0x1031; + + private EXTSourceRadius() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTStaticBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTStaticBuffer.java new file mode 100644 index 000000000..072e90c69 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTStaticBuffer.java @@ -0,0 +1,126 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the {@code AL_EXT_STATIC_BUFFER} extension. + * + *

    This extension provides a means for the caller to avoid the overhead associated with the {@link AL10#alBufferData BufferData} call which performs a physical copy of the + * data provided by the caller to internal buffers. When using the {@code AL_EXT_STATIC_BUFFER} extension, OpenAL's internal buffers use the data pointer provided by + * the caller for all data access.

    + */ +public class EXTStaticBuffer { + + protected EXTStaticBuffer() { + throw new UnsupportedOperationException(); + } + + // --- [ alBufferDataStatic ] --- + + /** + * Unsafe version of: {@link #alBufferDataStatic BufferDataStatic} + * + * @param len the data buffer size, in bytes + */ + public static void nalBufferDataStatic(int buffer, int format, long data, int len, int freq) { + long __functionAddress = AL.getICD().alBufferDataStatic; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, format, data, len, freq, __functionAddress); + } + + /** + * Sets the sample data of the specified buffer. + * + * @param buffer the buffer handle + * @param format the data format + * @param data the sample data + * @param freq the data frequency + */ + @NativeType("ALvoid") + public static void alBufferDataStatic(@NativeType("ALint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid *") ByteBuffer data, @NativeType("ALsizei") int freq) { + nalBufferDataStatic(buffer, format, memAddress(data), data.remaining(), freq); + } + + /** + * Sets the sample data of the specified buffer. + * + * @param buffer the buffer handle + * @param format the data format + * @param data the sample data + * @param freq the data frequency + */ + @NativeType("ALvoid") + public static void alBufferDataStatic(@NativeType("ALint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid *") ShortBuffer data, @NativeType("ALsizei") int freq) { + nalBufferDataStatic(buffer, format, memAddress(data), data.remaining() << 1, freq); + } + + /** + * Sets the sample data of the specified buffer. + * + * @param buffer the buffer handle + * @param format the data format + * @param data the sample data + * @param freq the data frequency + */ + @NativeType("ALvoid") + public static void alBufferDataStatic(@NativeType("ALint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid *") IntBuffer data, @NativeType("ALsizei") int freq) { + nalBufferDataStatic(buffer, format, memAddress(data), data.remaining() << 2, freq); + } + + /** + * Sets the sample data of the specified buffer. + * + * @param buffer the buffer handle + * @param format the data format + * @param data the sample data + * @param freq the data frequency + */ + @NativeType("ALvoid") + public static void alBufferDataStatic(@NativeType("ALint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid *") FloatBuffer data, @NativeType("ALsizei") int freq) { + nalBufferDataStatic(buffer, format, memAddress(data), data.remaining() << 2, freq); + } + + /** Array version of: {@link #alBufferDataStatic BufferDataStatic} */ + @NativeType("ALvoid") + public static void alBufferDataStatic(@NativeType("ALint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid *") short[] data, @NativeType("ALsizei") int freq) { + long __functionAddress = AL.getICD().alBufferDataStatic; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, format, data, data.length << 1, freq, __functionAddress); + } + + /** Array version of: {@link #alBufferDataStatic BufferDataStatic} */ + @NativeType("ALvoid") + public static void alBufferDataStatic(@NativeType("ALint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid *") int[] data, @NativeType("ALsizei") int freq) { + long __functionAddress = AL.getICD().alBufferDataStatic; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, format, data, data.length << 2, freq, __functionAddress); + } + + /** Array version of: {@link #alBufferDataStatic BufferDataStatic} */ + @NativeType("ALvoid") + public static void alBufferDataStatic(@NativeType("ALint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid *") float[] data, @NativeType("ALsizei") int freq) { + long __functionAddress = AL.getICD().alBufferDataStatic; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, format, data, data.length << 2, freq, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTStereoAngles.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTStereoAngles.java new file mode 100644 index 000000000..e32bb93f7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTStereoAngles.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the {@code AL_EXT_STEREO_ANGLES} extension. + * + *

    This extension allows any stereo source to be "steered" by setting the angles at which the left and right channels should play.

    + */ +public final class EXTStereoAngles { + + /** + * Can be used with {@link AL10#alSourcefv Sourcefv} and two angles. The angles are specified anticlockwise relative to the real front, so a normal 60degree front stage is + * specified with {@code alSourcefv(sid,AL_STEREO_ANGLES,+M_PI/6,-M_PI/6)}. + * + *

    Angles are always specified in radians, anticlockwise relative to the real front ({@link AL10#AL_SOURCE_RELATIVE SOURCE_RELATIVE} is not supported).

    + */ + public static final int AL_STEREO_ANGLES = 0x1030; + + private EXTStereoAngles() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTThreadLocalContext.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTThreadLocalContext.java new file mode 100644 index 000000000..c5d6448ee --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTThreadLocalContext.java @@ -0,0 +1,54 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the EXT_thread_local_context extension. + * + *

    This extension introduces the concept of a current thread-local context, with each thread able to have its own current context. The current context is + * what the al- functions work on, effectively allowing multiple threads to independently drive separate OpenAL playback contexts.

    + */ +public class EXTThreadLocalContext { + + protected EXTThreadLocalContext() { + throw new UnsupportedOperationException(); + } + + // --- [ alcSetThreadContext ] --- + + /** + * Makes a context current with respect to OpenAL operation on the current thread. The context parameter can be {@code NULL} or a valid context pointer. Using + * {@code NULL} results in no thread-specific context being current in the calling thread, which is useful when shutting OpenAL down. + * + * @param context the context to make current + */ + @NativeType("ALCboolean") + public static boolean alcSetThreadContext(@NativeType("ALCcontext *") long context) { + long __functionAddress = ALC.getICD().alcSetThreadContext; + if (CHECKS) { + check(__functionAddress); + } + return invokePZ(context, __functionAddress); + } + + // --- [ alcGetThreadContext ] --- + + /** Retrieves a handle to the thread-specific context of the calling thread. This function will return {@code NULL} if no thread-specific context is set. */ + @NativeType("ALCcontext *") + public static long alcGetThreadContext() { + long __functionAddress = ALC.getICD().alcGetThreadContext; + if (CHECKS) { + check(__functionAddress); + } + return invokeP(__functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTVorbis.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTVorbis.java new file mode 100644 index 000000000..9bbe98a4a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EXTVorbis.java @@ -0,0 +1,16 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code AL_EXT_vorbis} extension. */ +public final class EXTVorbis { + + /** {@code AL_EXT_vorbis} tokens. */ + public static final int AL_FORMAT_VORBIS_EXT = 0x10003; + + private EXTVorbis() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/EnumerateAllExt.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EnumerateAllExt.java new file mode 100644 index 000000000..94adfe0e9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/EnumerateAllExt.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the {@code ALC_ENUMERATE_ALL_EXT} extension. + * + *

    The Enumerate All Extension enables the application developer to retrieve a complete list of device strings identifying all the available OpenAL + * rendering devices and paths present on the user's PC. It works in exactly the same manner as the Enumeration Extension, but it detects additional audio + * paths that the standard extension will ignore. For instance, it will return all the possible outputs in situations where the user has more than one + * audio device installed, or under Windows Vista where the audio system specifies different “endpoints” for sound such as Speakers, S/PDIF, etc... If you + * don’t require such complete control over the choice of output path, then use the standard Enumeration Extension.

    + */ +public final class EnumerateAllExt { + + /** {@code ALC_ENUMERATE_ALL_EXT} tokens. */ + public static final int + ALC_DEFAULT_ALL_DEVICES_SPECIFIER = 0x1012, + ALC_ALL_DEVICES_SPECIFIER = 0x1013; + + private EnumerateAllExt() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIAudioChannel.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIAudioChannel.java new file mode 100644 index 000000000..f21ab0138 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIAudioChannel.java @@ -0,0 +1,19 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code ALC_LOKI_audio_channel} extension. */ +public final class LOKIAudioChannel { + + /** {@code ALC_LOKI_audio_channel} tokens. */ + public static final int + ALC_CHAN_MAIN_LOKI = 0x500001, + ALC_CHAN_PCM_LOKI = 0x500002, + ALC_CHAN_CD_LOKI = 0x500003; + + private LOKIAudioChannel() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIIMAADPCM.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIIMAADPCM.java new file mode 100644 index 000000000..bc0b5d4fb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIIMAADPCM.java @@ -0,0 +1,18 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code AL_LOKI_IMA_ADPCM} extension. */ +public final class LOKIIMAADPCM { + + /** Buffer formats. */ + public static final int + AL_FORMAT_IMA_ADPCM_MONO16_EXT = 0x10000, + AL_FORMAT_IMA_ADPCM_STEREO16_EXT = 0x10001; + + private LOKIIMAADPCM() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIQuadriphonic.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIQuadriphonic.java new file mode 100644 index 000000000..39c3b7d1b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIQuadriphonic.java @@ -0,0 +1,18 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code AL_LOKI_quadriphonic} extension. */ +public final class LOKIQuadriphonic { + + /** Buffer formats. */ + public static final int + AL_FORMAT_QUAD8_LOKI = 0x10004, + AL_FORMAT_QUAD16_LOKI = 0x10005; + + private LOKIQuadriphonic() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIWAVEFormat.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIWAVEFormat.java new file mode 100644 index 000000000..5f5728af2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/LOKIWAVEFormat.java @@ -0,0 +1,16 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** Native bindings to the {@code AL_LOKI_WAVE_format} extension. */ +public final class LOKIWAVEFormat { + + /** Buffer formats. */ + public static final int AL_FORMAT_WAVE_EXT = 0x10002; + + private LOKIWAVEFormat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/OpenALException.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/OpenALException.java new file mode 100644 index 000000000..59b88e737 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/OpenALException.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2002-2008 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.openal; + +/** + *
    + * Thrown by the debug build library of the LWJGL if any OpenAL operation + * causes an error. + * + * @author Brian Matzon + * @version $Revision$ + * $Id$ + */ +public class OpenALException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + /** + * Constructor for OpenALException. + */ + public OpenALException() { + super(); + } + + /** + * Constructor that takes an AL error number + */ + public OpenALException(int error_code) { + super("OpenAL error: " + AL10.alGetString(error_code) + " (" + error_code + ")"); + } + + /** + * Constructor for OpenALException. + * @param message + */ + public OpenALException(String message) { + super(message); + } + + /** + * Constructor for OpenALException. + * @param message + * @param cause + */ + public OpenALException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Constructor for OpenALException. + * @param cause + */ + public OpenALException(Throwable cause) { + super(cause); + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBformatEx.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBformatEx.java new file mode 100644 index 000000000..4351e926c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBformatEx.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_bformat_ex extension. + * + *

    This extension allows B-Format buffers to be interpreted according to the ACN (Ambisonic Channel Number), SN3D (Semi-Normalized), and N3D (fully + * Normalized) standards. The AL_EXT_BFORMAT extension provides support for B-Format buffers using the FuMa standard for channel ordering and scaling, + * however much of the ambisonic content being produced today is using a more formalized ACN ordering and SN3D scaling, some even using N3D scaling. The + * option to interpret B-Format buffers using these standards makes them easier to use since an application won't need to manually convert them before + * loading.

    + */ +public final class SOFTBformatEx { + + /** Accepted as the {@code paramName} parameter of {@link AL11#alBufferi Bufferi}, {@link AL11#alBufferiv Bufferiv}, {@link AL10#alGetBufferi GetBufferi}, and {@link AL11#alGetBufferiv GetBufferiv}. */ + public static final int + AL_AMBISONIC_LAYOUT_SOFT = 0x1997, + AL_AMBISONIC_SCALING_SOFT = 0x1998; + + /** Accepted as the {@code value} parameter of {@link AL11#alBufferi Bufferi} and {@link AL11#alBufferiv Bufferiv} for the {@link #AL_AMBISONIC_LAYOUT_SOFT AMBISONIC_LAYOUT_SOFT} and {@link #AL_AMBISONIC_SCALING_SOFT AMBISONIC_SCALING_SOFT} properties. */ + public static final int AL_FUMA_SOFT = 0x0; + + /** Accepted as the {@code value} parameter of {@link AL11#alBufferi Bufferi} and {@link AL11#alBufferiv Bufferiv} for the {@link #AL_AMBISONIC_LAYOUT_SOFT AMBISONIC_LAYOUT_SOFT} property. */ + public static final int AL_ACN_SOFT = 0x1; + + /** Accepted as the {@code value} parameter of {@link AL11#alBufferi Bufferi} and {@link AL11#alBufferiv Bufferiv} for the {@link #AL_AMBISONIC_SCALING_SOFT AMBISONIC_SCALING_SOFT} property. */ + public static final int + AL_SN3D_SOFT = 0x1, + AL_N3D_SOFT = 0x2; + + private SOFTBformatEx() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBlockAlignment.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBlockAlignment.java new file mode 100644 index 000000000..7e56fbe40 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBlockAlignment.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_block_alignment extension. + * + *

    This extension provides a mechanism for specifying block alignment properties for sample data. This is useful for, though not strictly limited to, + * ADPCM compression where the block alignment is specified in the media file header instead of the data stream, and controls the decoding process.

    + */ +public final class SOFTBlockAlignment { + + /** Accepted by the {@code paramName} parameter of {@link AL11#alBufferi Bufferi}, {@link AL11#alBufferiv Bufferiv}, {@link AL10#alGetBufferi GetBufferi}, and {@link AL11#alGetBufferiv GetBufferiv}. */ + public static final int + AL_UNPACK_BLOCK_ALIGNMENT_SOFT = 0x200C, + AL_PACK_BLOCK_ALIGNMENT_SOFT = 0x200D; + + private SOFTBlockAlignment() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferLengthQuery.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferLengthQuery.java new file mode 100644 index 000000000..1d4dec58f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferLengthQuery.java @@ -0,0 +1,29 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_buffer_length_query extension. + * + *

    This extension adds buffer queries to get the length in bytes, samples, and seconds.

    + * + *

    Standard OpenAL only has queries for a buffer's storage size, the bits per sample, channel count, and sample rate, where the application needs to + * calculate what it wants from those. While this works alright for standard formats and most extension formats, it won't work for certain compressed + * formats like ADPCM. These extra queries ensure the application can get information about the buffer it may need.

    + */ +public final class SOFTBufferLengthQuery { + + /** Accepted by the {@code paramName} parameter of {@link AL10#alGetBufferi GetBufferi} and {@link AL11#alGetBufferiv GetBufferiv}. */ + public static final int + AL_BYTE_LENGTH_SOFT = 0x2009, + AL_SAMPLE_LENGTH_SOFT = 0x200A; + + /** Accepted by the {@code paramName} parameter of {@link AL10#alGetBufferf GetBufferf} and {@link AL11#alGetBufferfv GetBufferfv}. */ + public static final int AL_SEC_LENGTH_SOFT = 0x200B; + + private SOFTBufferLengthQuery() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferSamples.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferSamples.java new file mode 100644 index 000000000..216c475ed --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferSamples.java @@ -0,0 +1,383 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the SOFT_buffer_samples extension. + * + *

    This extension provides a more flexible mechanism for loading buffer data, as well as a method to retrieve buffer data. Unextended OpenAL only provides + * a method to specify a single buffer format when loading data, which defines the data given by the application. The AL is given leeway in converting the + * data, so that it is possible or more efficient to use internally. However, there are some drawbacks to this approach:

    + * + *
      + *
    • The conversion done by the implementation is hidden from the app. This makes it difficult for the app to know what kind of precision it will have, + * and impossible to request a storage precision.
    • + *
    • Conversion is not guaranteed, so the application can be restricted in the formats that can be loaded depending on the implementation.
    • + *
    + * + *

    If the application could specify the internal storage format, as well as use a separate format to specify the incoming data's format, it would allow to + * add more input formats (signed 8-bit, 32-bit int, and float, for example), with no undue burden placed on the implementation beyond needing some + * conversion routines. The application can then be assured that many different formats can be loaded, even if storage is restricted to a comparatively + * small subset.

    + * + *

    In addition, unextended OpenAL does not have any methods for updating only a portion of a buffer, nor a method to retrieve the data from a buffer.

    + */ +public class SOFTBufferSamples { + + /** + * Accepted by the {@code internalformat} parameter of {@link #alBufferSamplesSOFT BufferSamplesSOFT} (values are shared with standard OpenAL, {@link EXTFloat32 EXT_FLOAT32}, and + * {@link EXTMCFormats EXT_MCFORMATS}). + */ + public static final int + AL_MONO8_SOFT = 0x1100, + AL_MONO16_SOFT = 0x1101, + AL_MONO32F_SOFT = 0x10010, + AL_STEREO8_SOFT = 0x1102, + AL_STEREO16_SOFT = 0x1103, + AL_STEREO32F_SOFT = 0x10011, + AL_QUAD8_SOFT = 0x1204, + AL_QUAD16_SOFT = 0x1205, + AL_QUAD32F_SOFT = 0x1206, + AL_REAR8_SOFT = 0x1207, + AL_REAR16_SOFT = 0x1208, + AL_REAR32F_SOFT = 0x1209, + AL_5POINT1_8_SOFT = 0x120A, + AL_5POINT1_16_SOFT = 0x120B, + AL_5POINT1_32F_SOFT = 0x120C, + AL_6POINT1_8_SOFT = 0x120D, + AL_6POINT1_16_SOFT = 0x120E, + AL_6POINT1_32F_SOFT = 0x120F, + AL_7POINT1_8_SOFT = 0x1210, + AL_7POINT1_16_SOFT = 0x1211, + AL_7POINT1_32F_SOFT = 0x1212; + + /** Accepted by the {@code channels} parameter of {@link #alBufferSamplesSOFT BufferSamplesSOFT}, {@link #alBufferSubSamplesSOFT BufferSubSamplesSOFT}, and {@link #alGetBufferSamplesSOFT GetBufferSamplesSOFT}. */ + public static final int + AL_MONO_SOFT = 0x1500, + AL_STEREO_SOFT = 0x1501, + AL_QUAD_SOFT = 0x1502, + AL_REAR_SOFT = 0x1503, + AL_5POINT1_SOFT = 0x1504, + AL_6POINT1_SOFT = 0x1505, + AL_7POINT1_SOFT = 0x1506; + + /** Accepted by the {@code type} parameter of {@link #alBufferSamplesSOFT BufferSamplesSOFT}, {@link #alBufferSubSamplesSOFT BufferSubSamplesSOFT}, and {@link #alGetBufferSamplesSOFT GetBufferSamplesSOFT}. */ + public static final int + AL_BYTE_SOFT = 0x1400, + AL_UNSIGNED_BYTE_SOFT = 0x1401, + AL_SHORT_SOFT = 0x1402, + AL_UNSIGNED_SHORT_SOFT = 0x1403, + AL_INT_SOFT = 0x1404, + AL_UNSIGNED_INT_SOFT = 0x1405, + AL_FLOAT_SOFT = 0x1406, + AL_DOUBLE_SOFT = 0x1407, + AL_BYTE3_SOFT = 0x1408, + AL_UNSIGNED_BYTE3_SOFT = 0x1409; + + /** Accepted by the {@code paramName} parameter of {@link AL10#alGetBufferi GetBufferi} and {@link AL11#alGetBufferiv GetBufferiv}. */ + public static final int + AL_INTERNAL_FORMAT_SOFT = 0x2008, + AL_BYTE_LENGTH_SOFT = 0x2009, + AL_SAMPLE_LENGTH_SOFT = 0x200A; + + /** Accepted by the {@code paramName} parameter of {@link AL10#alGetBufferf GetBufferf} and {@link AL11#alGetBufferfv GetBufferfv}. */ + public static final int AL_SEC_LENGTH_SOFT = 0x200B; + + /** Accepted by the {@code paramName} parameter of {@link AL10#alGetSourceiv GetSourceiv} and {@link AL10#alGetSourcefv GetSourcefv} (these are the same as in {@link SOFTBufferSubData SOFT_buffer_sub_data}). */ + public static final int + AL_BYTE_RW_OFFSETS_SOFT = 0x1031, + AL_SAMPLE_RW_OFFSETS_SOFT = 0x1032; + + protected SOFTBufferSamples() { + throw new UnsupportedOperationException(); + } + + // --- [ alBufferSamplesSOFT ] --- + + /** Unsafe version of: {@link #alBufferSamplesSOFT BufferSamplesSOFT} */ + public static void nalBufferSamplesSOFT(int buffer, int samplerate, int internalformat, int samples, int channels, int type, long data) { + long __functionAddress = AL.getICD().alBufferSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, samplerate, internalformat, samples, channels, type, data, __functionAddress); + } + + /** + * @param internalformat one of:
    {@link #AL_MONO8_SOFT MONO8_SOFT}{@link #AL_MONO16_SOFT MONO16_SOFT}{@link #AL_MONO32F_SOFT MONO32F_SOFT}{@link #AL_STEREO8_SOFT STEREO8_SOFT}{@link #AL_STEREO16_SOFT STEREO16_SOFT}{@link #AL_STEREO32F_SOFT STEREO32F_SOFT}
    {@link #AL_QUAD8_SOFT QUAD8_SOFT}{@link #AL_QUAD16_SOFT QUAD16_SOFT}{@link #AL_QUAD32F_SOFT QUAD32F_SOFT}{@link #AL_REAR8_SOFT REAR8_SOFT}{@link #AL_REAR16_SOFT REAR16_SOFT}{@link #AL_REAR32F_SOFT REAR32F_SOFT}
    {@link #AL_5POINT1_8_SOFT 5POINT1_8_SOFT}{@link #AL_5POINT1_16_SOFT 5POINT1_16_SOFT}{@link #AL_5POINT1_32F_SOFT 5POINT1_32F_SOFT}{@link #AL_6POINT1_8_SOFT 6POINT1_8_SOFT}{@link #AL_6POINT1_16_SOFT 6POINT1_16_SOFT}{@link #AL_6POINT1_32F_SOFT 6POINT1_32F_SOFT}
    {@link #AL_7POINT1_8_SOFT 7POINT1_8_SOFT}{@link #AL_7POINT1_16_SOFT 7POINT1_16_SOFT}{@link #AL_7POINT1_32F_SOFT 7POINT1_32F_SOFT}
    + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALuint") int samplerate, @NativeType("ALenum") int internalformat, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") ByteBuffer data) { + nalBufferSamplesSOFT(buffer, samplerate, internalformat, samples, channels, type, memAddress(data)); + } + + /** + * @param internalformat one of:
    {@link #AL_MONO8_SOFT MONO8_SOFT}{@link #AL_MONO16_SOFT MONO16_SOFT}{@link #AL_MONO32F_SOFT MONO32F_SOFT}{@link #AL_STEREO8_SOFT STEREO8_SOFT}{@link #AL_STEREO16_SOFT STEREO16_SOFT}{@link #AL_STEREO32F_SOFT STEREO32F_SOFT}
    {@link #AL_QUAD8_SOFT QUAD8_SOFT}{@link #AL_QUAD16_SOFT QUAD16_SOFT}{@link #AL_QUAD32F_SOFT QUAD32F_SOFT}{@link #AL_REAR8_SOFT REAR8_SOFT}{@link #AL_REAR16_SOFT REAR16_SOFT}{@link #AL_REAR32F_SOFT REAR32F_SOFT}
    {@link #AL_5POINT1_8_SOFT 5POINT1_8_SOFT}{@link #AL_5POINT1_16_SOFT 5POINT1_16_SOFT}{@link #AL_5POINT1_32F_SOFT 5POINT1_32F_SOFT}{@link #AL_6POINT1_8_SOFT 6POINT1_8_SOFT}{@link #AL_6POINT1_16_SOFT 6POINT1_16_SOFT}{@link #AL_6POINT1_32F_SOFT 6POINT1_32F_SOFT}
    {@link #AL_7POINT1_8_SOFT 7POINT1_8_SOFT}{@link #AL_7POINT1_16_SOFT 7POINT1_16_SOFT}{@link #AL_7POINT1_32F_SOFT 7POINT1_32F_SOFT}
    + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALuint") int samplerate, @NativeType("ALenum") int internalformat, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") ShortBuffer data) { + nalBufferSamplesSOFT(buffer, samplerate, internalformat, samples, channels, type, memAddress(data)); + } + + /** + * @param internalformat one of:
    {@link #AL_MONO8_SOFT MONO8_SOFT}{@link #AL_MONO16_SOFT MONO16_SOFT}{@link #AL_MONO32F_SOFT MONO32F_SOFT}{@link #AL_STEREO8_SOFT STEREO8_SOFT}{@link #AL_STEREO16_SOFT STEREO16_SOFT}{@link #AL_STEREO32F_SOFT STEREO32F_SOFT}
    {@link #AL_QUAD8_SOFT QUAD8_SOFT}{@link #AL_QUAD16_SOFT QUAD16_SOFT}{@link #AL_QUAD32F_SOFT QUAD32F_SOFT}{@link #AL_REAR8_SOFT REAR8_SOFT}{@link #AL_REAR16_SOFT REAR16_SOFT}{@link #AL_REAR32F_SOFT REAR32F_SOFT}
    {@link #AL_5POINT1_8_SOFT 5POINT1_8_SOFT}{@link #AL_5POINT1_16_SOFT 5POINT1_16_SOFT}{@link #AL_5POINT1_32F_SOFT 5POINT1_32F_SOFT}{@link #AL_6POINT1_8_SOFT 6POINT1_8_SOFT}{@link #AL_6POINT1_16_SOFT 6POINT1_16_SOFT}{@link #AL_6POINT1_32F_SOFT 6POINT1_32F_SOFT}
    {@link #AL_7POINT1_8_SOFT 7POINT1_8_SOFT}{@link #AL_7POINT1_16_SOFT 7POINT1_16_SOFT}{@link #AL_7POINT1_32F_SOFT 7POINT1_32F_SOFT}
    + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALuint") int samplerate, @NativeType("ALenum") int internalformat, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") IntBuffer data) { + nalBufferSamplesSOFT(buffer, samplerate, internalformat, samples, channels, type, memAddress(data)); + } + + /** + * @param internalformat one of:
    {@link #AL_MONO8_SOFT MONO8_SOFT}{@link #AL_MONO16_SOFT MONO16_SOFT}{@link #AL_MONO32F_SOFT MONO32F_SOFT}{@link #AL_STEREO8_SOFT STEREO8_SOFT}{@link #AL_STEREO16_SOFT STEREO16_SOFT}{@link #AL_STEREO32F_SOFT STEREO32F_SOFT}
    {@link #AL_QUAD8_SOFT QUAD8_SOFT}{@link #AL_QUAD16_SOFT QUAD16_SOFT}{@link #AL_QUAD32F_SOFT QUAD32F_SOFT}{@link #AL_REAR8_SOFT REAR8_SOFT}{@link #AL_REAR16_SOFT REAR16_SOFT}{@link #AL_REAR32F_SOFT REAR32F_SOFT}
    {@link #AL_5POINT1_8_SOFT 5POINT1_8_SOFT}{@link #AL_5POINT1_16_SOFT 5POINT1_16_SOFT}{@link #AL_5POINT1_32F_SOFT 5POINT1_32F_SOFT}{@link #AL_6POINT1_8_SOFT 6POINT1_8_SOFT}{@link #AL_6POINT1_16_SOFT 6POINT1_16_SOFT}{@link #AL_6POINT1_32F_SOFT 6POINT1_32F_SOFT}
    {@link #AL_7POINT1_8_SOFT 7POINT1_8_SOFT}{@link #AL_7POINT1_16_SOFT 7POINT1_16_SOFT}{@link #AL_7POINT1_32F_SOFT 7POINT1_32F_SOFT}
    + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALuint") int samplerate, @NativeType("ALenum") int internalformat, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") FloatBuffer data) { + nalBufferSamplesSOFT(buffer, samplerate, internalformat, samples, channels, type, memAddress(data)); + } + + /** + * @param internalformat one of:
    {@link #AL_MONO8_SOFT MONO8_SOFT}{@link #AL_MONO16_SOFT MONO16_SOFT}{@link #AL_MONO32F_SOFT MONO32F_SOFT}{@link #AL_STEREO8_SOFT STEREO8_SOFT}{@link #AL_STEREO16_SOFT STEREO16_SOFT}{@link #AL_STEREO32F_SOFT STEREO32F_SOFT}
    {@link #AL_QUAD8_SOFT QUAD8_SOFT}{@link #AL_QUAD16_SOFT QUAD16_SOFT}{@link #AL_QUAD32F_SOFT QUAD32F_SOFT}{@link #AL_REAR8_SOFT REAR8_SOFT}{@link #AL_REAR16_SOFT REAR16_SOFT}{@link #AL_REAR32F_SOFT REAR32F_SOFT}
    {@link #AL_5POINT1_8_SOFT 5POINT1_8_SOFT}{@link #AL_5POINT1_16_SOFT 5POINT1_16_SOFT}{@link #AL_5POINT1_32F_SOFT 5POINT1_32F_SOFT}{@link #AL_6POINT1_8_SOFT 6POINT1_8_SOFT}{@link #AL_6POINT1_16_SOFT 6POINT1_16_SOFT}{@link #AL_6POINT1_32F_SOFT 6POINT1_32F_SOFT}
    {@link #AL_7POINT1_8_SOFT 7POINT1_8_SOFT}{@link #AL_7POINT1_16_SOFT 7POINT1_16_SOFT}{@link #AL_7POINT1_32F_SOFT 7POINT1_32F_SOFT}
    + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALuint") int samplerate, @NativeType("ALenum") int internalformat, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") DoubleBuffer data) { + nalBufferSamplesSOFT(buffer, samplerate, internalformat, samples, channels, type, memAddress(data)); + } + + // --- [ alBufferSubSamplesSOFT ] --- + + /** Unsafe version of: {@link #alBufferSubSamplesSOFT BufferSubSamplesSOFT} */ + public static void nalBufferSubSamplesSOFT(int buffer, int offset, int samples, int channels, int type, long data) { + long __functionAddress = AL.getICD().alBufferSubSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, offset, samples, channels, type, data, __functionAddress); + } + + /** + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alBufferSubSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") ByteBuffer data) { + nalBufferSubSamplesSOFT(buffer, offset, samples, channels, type, memAddress(data)); + } + + /** + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alBufferSubSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") ShortBuffer data) { + nalBufferSubSamplesSOFT(buffer, offset, samples, channels, type, memAddress(data)); + } + + /** + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alBufferSubSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") IntBuffer data) { + nalBufferSubSamplesSOFT(buffer, offset, samples, channels, type, memAddress(data)); + } + + /** + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alBufferSubSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") FloatBuffer data) { + nalBufferSubSamplesSOFT(buffer, offset, samples, channels, type, memAddress(data)); + } + + /** + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alBufferSubSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") DoubleBuffer data) { + nalBufferSubSamplesSOFT(buffer, offset, samples, channels, type, memAddress(data)); + } + + // --- [ alGetBufferSamplesSOFT ] --- + + /** Unsafe version of: {@link #alGetBufferSamplesSOFT GetBufferSamplesSOFT} */ + public static void nalGetBufferSamplesSOFT(int buffer, int offset, int samples, int channels, int type, long data) { + long __functionAddress = AL.getICD().alGetBufferSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, offset, samples, channels, type, data, __functionAddress); + } + + /** + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alGetBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid *") ByteBuffer data) { + nalGetBufferSamplesSOFT(buffer, offset, samples, channels, type, memAddress(data)); + } + + /** + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alGetBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid *") ShortBuffer data) { + nalGetBufferSamplesSOFT(buffer, offset, samples, channels, type, memAddress(data)); + } + + /** + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alGetBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid *") IntBuffer data) { + nalGetBufferSamplesSOFT(buffer, offset, samples, channels, type, memAddress(data)); + } + + /** + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alGetBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid *") FloatBuffer data) { + nalGetBufferSamplesSOFT(buffer, offset, samples, channels, type, memAddress(data)); + } + + /** + * @param channels one of:
    {@link #AL_MONO_SOFT MONO_SOFT}{@link #AL_STEREO_SOFT STEREO_SOFT}{@link #AL_QUAD_SOFT QUAD_SOFT}{@link #AL_REAR_SOFT REAR_SOFT}{@link #AL_5POINT1_SOFT 5POINT1_SOFT}{@link #AL_6POINT1_SOFT 6POINT1_SOFT}{@link #AL_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type one of:
    {@link #AL_BYTE_SOFT BYTE_SOFT}{@link #AL_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #AL_SHORT_SOFT SHORT_SOFT}{@link #AL_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #AL_INT_SOFT INT_SOFT}{@link #AL_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #AL_FLOAT_SOFT FLOAT_SOFT}{@link #AL_DOUBLE_SOFT DOUBLE_SOFT}{@link #AL_BYTE3_SOFT BYTE3_SOFT}{@link #AL_UNSIGNED_BYTE3_SOFT UNSIGNED_BYTE3_SOFT}
    + */ + public static void alGetBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid *") DoubleBuffer data) { + nalGetBufferSamplesSOFT(buffer, offset, samples, channels, type, memAddress(data)); + } + + // --- [ alIsBufferFormatSupportedSOFT ] --- + + @NativeType("ALboolean") + public static boolean alIsBufferFormatSupportedSOFT(@NativeType("ALenum") int format) { + long __functionAddress = AL.getICD().alIsBufferFormatSupportedSOFT; + if (CHECKS) { + check(__functionAddress); + } + return invokeZ(format, __functionAddress); + } + + /** Array version of: {@link #alBufferSamplesSOFT BufferSamplesSOFT} */ + public static void alBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALuint") int samplerate, @NativeType("ALenum") int internalformat, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") short[] data) { + long __functionAddress = AL.getICD().alBufferSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, samplerate, internalformat, samples, channels, type, data, __functionAddress); + } + + /** Array version of: {@link #alBufferSamplesSOFT BufferSamplesSOFT} */ + public static void alBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALuint") int samplerate, @NativeType("ALenum") int internalformat, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") int[] data) { + long __functionAddress = AL.getICD().alBufferSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, samplerate, internalformat, samples, channels, type, data, __functionAddress); + } + + /** Array version of: {@link #alBufferSamplesSOFT BufferSamplesSOFT} */ + public static void alBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALuint") int samplerate, @NativeType("ALenum") int internalformat, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") float[] data) { + long __functionAddress = AL.getICD().alBufferSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, samplerate, internalformat, samples, channels, type, data, __functionAddress); + } + + /** Array version of: {@link #alBufferSamplesSOFT BufferSamplesSOFT} */ + public static void alBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALuint") int samplerate, @NativeType("ALenum") int internalformat, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") double[] data) { + long __functionAddress = AL.getICD().alBufferSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, samplerate, internalformat, samples, channels, type, data, __functionAddress); + } + + /** Array version of: {@link #alBufferSubSamplesSOFT BufferSubSamplesSOFT} */ + public static void alBufferSubSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") short[] data) { + long __functionAddress = AL.getICD().alBufferSubSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, offset, samples, channels, type, data, __functionAddress); + } + + /** Array version of: {@link #alBufferSubSamplesSOFT BufferSubSamplesSOFT} */ + public static void alBufferSubSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") int[] data) { + long __functionAddress = AL.getICD().alBufferSubSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, offset, samples, channels, type, data, __functionAddress); + } + + /** Array version of: {@link #alBufferSubSamplesSOFT BufferSubSamplesSOFT} */ + public static void alBufferSubSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") float[] data) { + long __functionAddress = AL.getICD().alBufferSubSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, offset, samples, channels, type, data, __functionAddress); + } + + /** Array version of: {@link #alBufferSubSamplesSOFT BufferSubSamplesSOFT} */ + public static void alBufferSubSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid const *") double[] data) { + long __functionAddress = AL.getICD().alBufferSubSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, offset, samples, channels, type, data, __functionAddress); + } + + /** Array version of: {@link #alGetBufferSamplesSOFT GetBufferSamplesSOFT} */ + public static void alGetBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid *") short[] data) { + long __functionAddress = AL.getICD().alGetBufferSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, offset, samples, channels, type, data, __functionAddress); + } + + /** Array version of: {@link #alGetBufferSamplesSOFT GetBufferSamplesSOFT} */ + public static void alGetBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid *") int[] data) { + long __functionAddress = AL.getICD().alGetBufferSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, offset, samples, channels, type, data, __functionAddress); + } + + /** Array version of: {@link #alGetBufferSamplesSOFT GetBufferSamplesSOFT} */ + public static void alGetBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid *") float[] data) { + long __functionAddress = AL.getICD().alGetBufferSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, offset, samples, channels, type, data, __functionAddress); + } + + /** Array version of: {@link #alGetBufferSamplesSOFT GetBufferSamplesSOFT} */ + public static void alGetBufferSamplesSOFT(@NativeType("ALuint") int buffer, @NativeType("ALsizei") int offset, @NativeType("ALsizei") int samples, @NativeType("ALenum") int channels, @NativeType("ALenum") int type, @NativeType("ALvoid *") double[] data) { + long __functionAddress = AL.getICD().alGetBufferSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, offset, samples, channels, type, data, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferSubData.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferSubData.java new file mode 100644 index 000000000..eea95b86f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTBufferSubData.java @@ -0,0 +1,85 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the SOFT_buffer_sub_data extension. + * + *

    This extension allows an application to modify a section of buffered sample data while the buffer is in use.

    + */ +public class SOFTBufferSubData { + + /** Accepted by the {@code paramName} parameter of {@link AL10#alGetSourceiv GetSourceiv} and {@link AL10#alGetSourcefv GetSourcefv}. */ + public static final int + AL_BYTE_RW_OFFSETS_SOFT = 0x1031, + AL_SAMPLE_RW_OFFSETS_SOFT = 0x1032; + + protected SOFTBufferSubData() { + throw new UnsupportedOperationException(); + } + + // --- [ alBufferSubDataSOFT ] --- + + public static void nalBufferSubDataSOFT(int buffer, int format, long data, int offset, int length) { + long __functionAddress = AL.getICD().alBufferSubDataSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, format, data, offset, length, __functionAddress); + } + + public static void alBufferSubDataSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid const *") ByteBuffer data, @NativeType("ALsizei") int offset) { + nalBufferSubDataSOFT(buffer, format, memAddress(data), offset, data.remaining()); + } + + public static void alBufferSubDataSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid const *") ShortBuffer data, @NativeType("ALsizei") int offset) { + nalBufferSubDataSOFT(buffer, format, memAddress(data), offset, data.remaining() << 1); + } + + public static void alBufferSubDataSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid const *") IntBuffer data, @NativeType("ALsizei") int offset) { + nalBufferSubDataSOFT(buffer, format, memAddress(data), offset, data.remaining() << 2); + } + + public static void alBufferSubDataSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid const *") FloatBuffer data, @NativeType("ALsizei") int offset) { + nalBufferSubDataSOFT(buffer, format, memAddress(data), offset, data.remaining() << 2); + } + + /** Array version of: {@link #alBufferSubDataSOFT BufferSubDataSOFT} */ + public static void alBufferSubDataSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid const *") short[] data, @NativeType("ALsizei") int offset) { + long __functionAddress = AL.getICD().alBufferSubDataSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, format, data, offset, data.length << 1, __functionAddress); + } + + /** Array version of: {@link #alBufferSubDataSOFT BufferSubDataSOFT} */ + public static void alBufferSubDataSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid const *") int[] data, @NativeType("ALsizei") int offset) { + long __functionAddress = AL.getICD().alBufferSubDataSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, format, data, offset, data.length << 2, __functionAddress); + } + + /** Array version of: {@link #alBufferSubDataSOFT BufferSubDataSOFT} */ + public static void alBufferSubDataSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int format, @NativeType("ALvoid const *") float[] data, @NativeType("ALsizei") int offset) { + long __functionAddress = AL.getICD().alBufferSubDataSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, format, data, offset, data.length << 2, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBuffer.java new file mode 100644 index 000000000..5b423e184 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBuffer.java @@ -0,0 +1,138 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the SOFT_callback_buffer extension. + * + *

    This extension provides a mechanism for applications to provide sample data to the audio device in real-time.

    + * + *

    Standard OpenAL sources can read samples from a pre-loaded static buffer, or from a queue of prepared buffers that can be fed in over time. In both + * cases, an application needs to prepare all or some of the audio samples ahead of time to ensure proper continuous playback. A callback mechanism allows + * applications to generate audio as needed, without having to prepare samples ahead of time, and to implement their own streaming interface instead of + * having to fill, queue, and manage multiple OpenAL buffers per stream.

    + */ +public class SOFTCallbackBuffer { + + /** Accepted as the {@code param} parameter of {@link #alGetBufferPtrSOFT GetBufferPtrSOFT} and {@link #alGetBufferPtrvSOFT GetBufferPtrvSOFT}. */ + public static final int + AL_BUFFER_CALLBACK_FUNCTION_SOFT = 0x19A0, + AL_BUFFER_CALLBACK_USER_PARAM_SOFT = 0x19A1; + + protected SOFTCallbackBuffer() { + throw new UnsupportedOperationException(); + } + + // --- [ alBufferCallbackSOFT ] --- + + /** Unsafe version of: {@link #alBufferCallbackSOFT BufferCallbackSOFT} */ + public static void nalBufferCallbackSOFT(int buffer, int format, int freq, long callback, long userptr) { + long __functionAddress = AL.getICD().alBufferCallbackSOFT; + if (CHECKS) { + check(__functionAddress); + check(userptr); + } + invokePPV(buffer, format, freq, callback, userptr, __functionAddress); + } + + /** + * Instead of storing sample data, a buffer may be given a callback function which will be invoked when the source it's attached to needs more samples to + * mix. To specify a callback for a buffer, use {@code alBufferCallbackSOFT}. + * + *

    After a successful call, any sample data that was stored in the buffer is removed.

    + * + *

    A buffer with a callback cannot be queued onto a streaming source, and it can only be set on one static source at a time. Attempting to queue such a + * buffer on a source, or attempting to set it on a source while it's already on one, will generate an {@link AL10#AL_INVALID_OPERATION INVALID_OPERATION} error.

    + * + *

    A subsequent successful call to {@link AL10#alBufferData BufferData} will remove the callback from the buffer, and make it a normal non-callback buffer.

    + * + * @param format the sample format that will be expected from the callback + * @param freq the base sample rate the samples will play at + * @param userptr stored with the {@code callback} pointer. Any data it references is not copied + */ + @NativeType("ALvoid") + public static void alBufferCallbackSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int format, @NativeType("ALsizei") int freq, @NativeType("ALBUFFERCALLBACKTYPESOFT") SOFTCallbackBufferTypeI callback, @NativeType("ALvoid *") long userptr) { + nalBufferCallbackSOFT(buffer, format, freq, callback.address(), userptr); + } + + // --- [ alGetBufferPtrSOFT ] --- + + public static void nalGetBufferPtrSOFT(int buffer, int param, long ptr) { + long __functionAddress = AL.getICD().alGetBufferPtrSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, param, ptr, __functionAddress); + } + + @NativeType("ALvoid") + public static void alGetBufferPtrSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int param, @NativeType("ALvoid **") PointerBuffer ptr) { + if (CHECKS) { + check(ptr, 1); + } + nalGetBufferPtrSOFT(buffer, param, memAddress(ptr)); + } + + @NativeType("ALvoid") + public static long alGetBufferPtrSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer ptr = stack.callocPointer(1); + nalGetBufferPtrSOFT(buffer, param, memAddress(ptr)); + return ptr.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetBuffer3PtrSOFT ] --- + + public static void nalGetBuffer3PtrSOFT(int buffer, int param, long ptr0, long ptr1, long ptr2) { + long __functionAddress = AL.getICD().alGetBuffer3PtrSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePPPV(buffer, param, ptr0, ptr1, ptr2, __functionAddress); + } + + @NativeType("ALvoid") + public static void alGetBuffer3PtrSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int param, @NativeType("ALvoid **") PointerBuffer ptr0, @NativeType("ALvoid **") PointerBuffer ptr1, @NativeType("ALvoid **") PointerBuffer ptr2) { + if (CHECKS) { + check(ptr0, 1); + check(ptr1, 1); + check(ptr2, 1); + } + nalGetBuffer3PtrSOFT(buffer, param, memAddress(ptr0), memAddress(ptr1), memAddress(ptr2)); + } + + // --- [ alGetBufferPtrvSOFT ] --- + + public static void nalGetBufferPtrvSOFT(int buffer, int param, long ptr) { + long __functionAddress = AL.getICD().alGetBufferPtrvSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(buffer, param, ptr, __functionAddress); + } + + @NativeType("ALvoid") + public static void alGetBufferPtrvSOFT(@NativeType("ALuint") int buffer, @NativeType("ALenum") int param, @NativeType("ALvoid **") PointerBuffer ptr) { + if (CHECKS) { + check(ptr, 1); + } + nalGetBufferPtrvSOFT(buffer, param, memAddress(ptr)); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBufferType.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBufferType.java new file mode 100644 index 000000000..d133b4a5e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBufferType.java @@ -0,0 +1,75 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     ALvoid *userptr,
    + *     ALvoid *sampledata,
    + *     ALsizei numbytes
    + * )
    + */ +public abstract class SOFTCallbackBufferType extends Callback implements SOFTCallbackBufferTypeI { + + /** + * Creates a {@code SOFTCallbackBufferType} instance from the specified function pointer. + * + * @return the new {@code SOFTCallbackBufferType} + */ + public static SOFTCallbackBufferType create(long functionPointer) { + SOFTCallbackBufferTypeI instance = Callback.get(functionPointer); + return instance instanceof SOFTCallbackBufferType + ? (SOFTCallbackBufferType)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static SOFTCallbackBufferType createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code SOFTCallbackBufferType} instance that delegates to the specified {@code SOFTCallbackBufferTypeI} instance. */ + public static SOFTCallbackBufferType create(SOFTCallbackBufferTypeI instance) { + return instance instanceof SOFTCallbackBufferType + ? (SOFTCallbackBufferType)instance + : new Container(instance.address(), instance); + } + + protected SOFTCallbackBufferType() { + super(CIF); + } + + SOFTCallbackBufferType(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends SOFTCallbackBufferType { + + private final SOFTCallbackBufferTypeI delegate; + + Container(long functionPointer, SOFTCallbackBufferTypeI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public long invoke(long userptr, long sampledata, int numbytes) { + return delegate.invoke(userptr, sampledata, numbytes); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBufferTypeI.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBufferTypeI.java new file mode 100644 index 000000000..a37bd7e90 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTCallbackBufferTypeI.java @@ -0,0 +1,61 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     ALvoid *userptr,
    + *     ALvoid *sampledata,
    + *     ALsizei numbytes
    + * )
    + */ +@FunctionalInterface +@NativeType("ALBUFFERCALLBACKTYPESOFT") +public interface SOFTCallbackBufferTypeI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_pointer, + ffi_type_pointer, ffi_type_pointer, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + long __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)) + ); + apiClosureRetP(ret, __result); + } + + /** + * @param userptr the same pointer provided to {@link SOFTCallbackBuffer#alBufferCallbackSOFT BufferCallbackSOFT} + * @param sampledata a pointer to the sample data buffer that should be filled in by the function + * @param numbytes the number of bytes needed to fill the sample data buffer for this invocation. + * + *

    Guaranteed to be greater than 0 and a multiple of the frame size for the format.

    + * + * @return the number of bytes actually written, which must be equal to or less than {@code numbytes}. + * + *

    If the return value is less than {@code numbytes}, it's treated as the end of the buffer and the source will play any complete samples before stopping.

    + */ + @NativeType("void *") long invoke(@NativeType("ALvoid *") long userptr, @NativeType("ALvoid *") long sampledata, @NativeType("ALsizei") int numbytes); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDeferredUpdates.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDeferredUpdates.java new file mode 100644 index 000000000..d3498c7b4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDeferredUpdates.java @@ -0,0 +1,66 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the SOFT_deferred_updates extension. + * + *

    This extension allows applications to defer playback state updates. With unextended OpenAL, the playback state would respond to changes as soon as it + * could handle them, which makes it effectively impossible to ensure multiple changes occur at the same time without the potential of a "partial" update + * (where one change is heard without the other). This extension provides a way to prevent state updates from occuring until they've all been done, where + * they will all apply at once.

    + */ +public class SOFTDeferredUpdates { + + /** Accepted by the {@code paramName} parameter of {@link AL10#alGetBoolean GetBoolean}, {@link AL10#alGetBooleanv GetBooleanv} (as well as the Integer, Float, and Double variants). */ + public static final int AL_DEFERRED_UPDATES_SOFT = 0xC002; + + protected SOFTDeferredUpdates() { + throw new UnsupportedOperationException(); + } + + // --- [ alDeferUpdatesSOFT ] --- + + /** + * Sometimes it is desirable to ensure multiple state changes take effect at the same time. Normally this isn't possible due to the AL processing updates + * asychronously, so the playback state can be updated with only part of the changes having been specified. An application can prevent these updates by + * calling this function. + * + *

    When called, samples will continue to render and be sent to the output device, but the effects of changing playback properties, such as the source or + * listener gain, or auxiliary slot gain or effect if EFX is supported, among others, will be deferred. Multiple changes can be batched so that they all + * apply at once at a later time.

    + */ + @NativeType("ALvoid") + public static void alDeferUpdatesSOFT() { + long __functionAddress = AL.getICD().alDeferUpdatesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokeV(__functionAddress); + } + + // --- [ alProcessUpdatesSOFT ] --- + + /** + * Resumes updates. + * + *

    Once called, all pending deferred updates will be processed. Any following state changes will also apply as normal.

    + */ + @NativeType("ALvoid") + public static void alProcessUpdatesSOFT() { + long __functionAddress = AL.getICD().alProcessUpdatesSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokeV(__functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDeviceClock.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDeviceClock.java new file mode 100644 index 000000000..713fbf31f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDeviceClock.java @@ -0,0 +1,132 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the SOFT_device_clock extension. + * + *

    This extension allows applications to query the timing clock from the audio device. This clock lets applications measure the passage of time as the + * audio device sees it, which may be slightly different than the system clock's tick rate (the infamous timer drift).

    + * + *

    If the {@link SOFTPauseDevice SOFT_pause_device} extension is available, the device clock does not increment while the device playback is paused. It is + * implementation-defined whether or not the device clock increments while no contexts are allocated. The initial clock time value of an opened device is + * also implementation-defined, except that it must not be negative and should be low enough to avoid wrapping during program execution.

    + * + *

    Requires {@link SOFTSourceLatency SOFT_source_latency}

    + */ +public class SOFTDeviceClock { + + /** Accepted as the {@code pname} parameter of {@link #alcGetInteger64vSOFT GetInteger64vSOFT}. */ + public static final int + ALC_DEVICE_CLOCK_SOFT = 0x1600, + ALC_DEVICE_LATENCY_SOFT = 0x1601, + ALC_DEVICE_CLOCK_LATENCY_SOFT = 0x1602; + + /** + * Accepted as the {@code param} parameter of {@link SOFTSourceLatency#alGetSourcei64vSOFT GetSourcei64vSOFT}. + * + *

    Returns the playback position, expressed in fixed-point samples, along with the device clock, expressed in nanoseconds. This attribute is read-only.

    + * + *

    The first value in the returned vector is the sample offset, which is a 32.32 fixed-point value. The whole number is stored in the upper 32 bits and + * the fractional component is in the lower 32 bits. The value is similar to that returned by {@link AL11#AL_SAMPLE_OFFSET SAMPLE_OFFSET}, just with more precision.

    + * + *

    The second value is the device clock, in nanoseconds. This updates at the same rate as the offset, and both are measured atomically with respect to one + * another.

    + */ + public static final int AL_SAMPLE_OFFSET_CLOCK_SOFT = 0x1202; + + /** + * Accepted as the {@code param} parameter of {@link SOFTSourceLatency#alGetSourcedvSOFT GetSourcedvSOFT}. + * + *

    Returns the playback position, along with the device clock, both expressed in seconds. This attribute is read-only.

    + * + *

    The first value in the returned vector is the offset in seconds. The value is similar to that returned by {@link AL11#AL_SEC_OFFSET SEC_OFFSET}, just with more precision.

    + * + *

    The second value is the device clock, in seconds. This updates at the same rate as the offset, and both are measured atomically with respect to one + * another. Be aware that this value may be subtly different from the other device clock queries due to the variable precision of floating-point values.

    + */ + public static final int AL_SEC_OFFSET_CLOCK_SOFT = 0x1203; + + protected SOFTDeviceClock() { + throw new UnsupportedOperationException(); + } + + // --- [ alcGetInteger64vSOFT ] --- + + /** Unsafe version of: {@link #alcGetInteger64vSOFT GetInteger64vSOFT} */ + public static void nalcGetInteger64vSOFT(long device, int pname, int size, long values) { + long __functionAddress = ALC.getICD().alcGetInteger64vSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePPV(device, pname, size, values, __functionAddress); + } + + /** + * Accepts all the same {@link AL10#alGetIntegerv GetIntegerv} queries, in addition to some new ones. + * + *

    Note that the size parameter is the number of {@code ALCint64SOFT} elements in the buffer provided, not the number of bytes.

    + * + * @param pname + * + * + * + *
    {@link #ALC_DEVICE_CLOCK_SOFT DEVICE_CLOCK_SOFT}The audio device clock time, expressed in nanoseconds. {@code NULL} is an invalid device.
    {@link #ALC_DEVICE_LATENCY_SOFT DEVICE_LATENCY_SOFT}The current audio device latency, in nanoseconds. This is effectively the delay for the samples rendered at the the device's current + * clock time fromreaching the physical output. {@code NULL} is an invalid device.
    {@link #ALC_DEVICE_CLOCK_LATENCY_SOFT DEVICE_CLOCK_LATENCY_SOFT}Expects a destination size of 2, and provides both the audio device clock time and latency, both in nanoseconds. The two values are + * measured atomically with respect to one another (i.e. the latency value was measured at the same time the device clock value was + * retrieved). {@code NULL} is an invalid device.
    + */ + @NativeType("ALCvoid") + public static void alcGetInteger64vSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCenum") int pname, @NativeType("ALCint64SOFT *") LongBuffer values) { + nalcGetInteger64vSOFT(device, pname, values.remaining(), memAddress(values)); + } + + /** + * Accepts all the same {@link AL10#alGetIntegerv GetIntegerv} queries, in addition to some new ones. + * + *

    Note that the size parameter is the number of {@code ALCint64SOFT} elements in the buffer provided, not the number of bytes.

    + * + * @param pname + * + * + * + *
    {@link #ALC_DEVICE_CLOCK_SOFT DEVICE_CLOCK_SOFT}The audio device clock time, expressed in nanoseconds. {@code NULL} is an invalid device.
    {@link #ALC_DEVICE_LATENCY_SOFT DEVICE_LATENCY_SOFT}The current audio device latency, in nanoseconds. This is effectively the delay for the samples rendered at the the device's current + * clock time fromreaching the physical output. {@code NULL} is an invalid device.
    {@link #ALC_DEVICE_CLOCK_LATENCY_SOFT DEVICE_CLOCK_LATENCY_SOFT}Expects a destination size of 2, and provides both the audio device clock time and latency, both in nanoseconds. The two values are + * measured atomically with respect to one another (i.e. the latency value was measured at the same time the device clock value was + * retrieved). {@code NULL} is an invalid device.
    + */ + @NativeType("ALCvoid") + public static long alcGetInteger64vSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer values = stack.callocLong(1); + nalcGetInteger64vSOFT(device, pname, 1, memAddress(values)); + return values.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #alcGetInteger64vSOFT GetInteger64vSOFT} */ + @NativeType("ALCvoid") + public static void alcGetInteger64vSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCenum") int pname, @NativeType("ALCint64SOFT *") long[] values) { + long __functionAddress = ALC.getICD().alcGetInteger64vSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePPV(device, pname, values.length, values, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDirectChannels.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDirectChannels.java new file mode 100644 index 000000000..47280c297 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDirectChannels.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_direct_channels extension. + * + *

    This extension allows a multi-channel source to play without virtualized output speakers. By default, OpenAL requires buffer channels to be down-mixed + * to the output channel configuration, possibly using HRTF or other virtualization techniques to give a sense of speakers that may not be physically + * present. Sometimes audio tracks are authored with their own spatialization effects, where the AL's virtualization methods can cause a notable decrease + * in audio quality.

    + * + *

    This extension provides a mechanism for applications to specify whether audio should be filtered according to the AL's channel virtualization rules for + * multi-channel buffers.

    + */ +public final class SOFTDirectChannels { + + /** Accepted by the {@code paramName} parameter of {@link AL10#alSourcei Sourcei}, {@link AL11#alSourceiv Sourceiv}, {@link AL10#alGetSourcei GetSourcei}, and {@link AL10#alGetSourceiv GetSourceiv}. */ + public static final int AL_DIRECT_CHANNELS_SOFT = 0x1033; + + private SOFTDirectChannels() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDirectChannelsRemix.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDirectChannelsRemix.java new file mode 100644 index 000000000..753bdd087 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTDirectChannelsRemix.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_direct_channels_remix extension. + * + *

    This extension adds the ability to remix channels to the {@link SOFTDirectChannels SOFT_direct_channels} extension. By default, that extension drops input buffer + * channels that don't have a matching output channel. This really only works well for controlled setups where the input and output are known, but + * problems arise when these become variable. An option to remix input channels to the closest output channels will ensure the sound will still be audible + * with as little virtualization as possible.

    + */ +public final class SOFTDirectChannelsRemix { + + /** Accepted as the {@code value} parameter of {@link AL10#alSourcei Sourcei} and {@link AL11#alSourceiv Sourceiv} for the {@link SOFTDirectChannels#AL_DIRECT_CHANNELS_SOFT DIRECT_CHANNELS_SOFT} property. */ + public static final int + AL_DROP_UNMATCHED_SOFT = 0x1, + AL_REMIX_UNMATCHED_SOFT = 0x2; + + private SOFTDirectChannelsRemix() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEffectTarget.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEffectTarget.java new file mode 100644 index 000000000..107ac4475 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEffectTarget.java @@ -0,0 +1,32 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_effect_target extension. + * + *

    This extension provides a method to reroute the output of an auxiliary effect slot to the input of another auxiliary effect slot. By default, an effect + * slot's output is added to the main output along side other effect slots and each source's direct path. This makes it impossible to, for example, apply + * an equalizer effect to the output of a chorus effect since the chorus and equalizer effects are processed separately.

    + * + *

    Retargeting an effect slot's output to another effect slot allows chaining multiple effects to create results that aren't possible with standard EFX.

    + */ +public final class SOFTEffectTarget { + + /** + * Specifies the target effect slot for this effect slot's output. + * + *

    The rendered output of this effect slot is added to the input of the specified target effect slot, which will be subsequently processed by the target + * effect slot's effect. Specifying {@link EXTEfx#AL_EFFECTSLOT_NULL EFFECTSLOT_NULL} for the ID reverts the effect slot's output back to the main output.

    + * + *

    An effect slot that is the target of another effect slot cannot be deleted or an {@link AL10#AL_INVALID_OPERATION INVALID_OPERATION} error will be generated. An effect slot cannot be + * set as a target if it would feed its own input through 0 or more other effect slots, or an {@code AL_INVALID_OPERATION} error will be generated.

    + */ + public static final int AL_EFFECTSLOT_TARGET_SOFT = 0x199C; + + private SOFTEffectTarget() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEventProc.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEventProc.java new file mode 100644 index 000000000..39f2a6a55 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEventProc.java @@ -0,0 +1,78 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     ALenum eventType,
    + *     ALuint object,
    + *     ALuint param,
    + *     ALsizei length,
    + *     ALchar const *message,
    + *     ALvoid *userParam
    + * )
    + */ +public abstract class SOFTEventProc extends Callback implements SOFTEventProcI { + + /** + * Creates a {@code SOFTEventProc} instance from the specified function pointer. + * + * @return the new {@code SOFTEventProc} + */ + public static SOFTEventProc create(long functionPointer) { + SOFTEventProcI instance = Callback.get(functionPointer); + return instance instanceof SOFTEventProc + ? (SOFTEventProc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static SOFTEventProc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code SOFTEventProc} instance that delegates to the specified {@code SOFTEventProcI} instance. */ + public static SOFTEventProc create(SOFTEventProcI instance) { + return instance instanceof SOFTEventProc + ? (SOFTEventProc)instance + : new Container(instance.address(), instance); + } + + protected SOFTEventProc() { + super(CIF); + } + + SOFTEventProc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends SOFTEventProc { + + private final SOFTEventProcI delegate; + + Container(long functionPointer, SOFTEventProcI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(int eventType, int object, int param, int length, long message, long userParam) { + delegate.invoke(eventType, object, param, length, message, userParam); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEventProcI.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEventProcI.java new file mode 100644 index 000000000..d7797385c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEventProcI.java @@ -0,0 +1,55 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     ALenum eventType,
    + *     ALuint object,
    + *     ALuint param,
    + *     ALsizei length,
    + *     ALchar const *message,
    + *     ALvoid *userParam
    + * )
    + */ +@FunctionalInterface +@NativeType("ALEVENTPROCSOFT") +public interface SOFTEventProcI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_sint32, ffi_type_uint32, ffi_type_uint32, ffi_type_sint32, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetInt(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 3 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 4 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 5 * POINTER_SIZE)) + ); + } + + void invoke(@NativeType("ALenum") int eventType, @NativeType("ALuint") int object, @NativeType("ALuint") int param, @NativeType("ALsizei") int length, @NativeType("ALchar const *") long message, @NativeType("ALvoid *") long userParam); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEvents.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEvents.java new file mode 100644 index 000000000..e983f5240 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTEvents.java @@ -0,0 +1,112 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the SOFT_events extension. + * + *

    This extension provides a method for applications to receive notifications about audio events via an asynchronous callback. This can help alleviate the + * need for applications to continually poll the AL to check if an event happened, and instead allow them to respond when events happen. Such events can + * include a source changing state or a device becoming disconnected.

    + */ +public class SOFTEvents { + + /** Accepted as the {@code pname} parameter of {@link #alGetPointerSOFT GetPointerSOFT} and {@link #alGetPointervSOFT GetPointervSOFT}. */ + public static final int + AL_EVENT_CALLBACK_FUNCTION_SOFT = 0x19A2, + AL_EVENT_CALLBACK_USER_PARAM_SOFT = 0x19A3; + + /** + * Accepted as an element in the {@code types} parameter of {@link #alEventControlSOFT EventControlSOFT}, and provided as the {@code eventType} parameter of + * {@code ALEVENTPROCSOFT} callback functions. + */ + public static final int + AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT = 0x19A4, + AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT = 0x19A5, + AL_EVENT_TYPE_DISCONNECTED_SOFT = 0x19A6; + + protected SOFTEvents() { + throw new UnsupportedOperationException(); + } + + // --- [ alEventControlSOFT ] --- + + public static void nalEventControlSOFT(int count, long types, boolean enable) { + long __functionAddress = AL.getICD().alEventControlSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(count, types, enable, __functionAddress); + } + + public static void alEventControlSOFT(@NativeType("ALenum const *") IntBuffer types, @NativeType("ALboolean") boolean enable) { + nalEventControlSOFT(types.remaining(), memAddress(types), enable); + } + + // --- [ alEventCallbackSOFT ] --- + + public static void nalEventCallbackSOFT(long callback, long userParam) { + long __functionAddress = AL.getICD().alEventCallbackSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePPV(callback, userParam, __functionAddress); + } + + public static void alEventCallbackSOFT(@NativeType("ALEVENTPROCSOFT") SOFTEventProcI callback, @Nullable @NativeType("ALvoid *") ByteBuffer userParam) { + nalEventCallbackSOFT(callback.address(), memAddressSafe(userParam)); + } + + // --- [ alGetPointerSOFT ] --- + + @NativeType("ALvoid *") + public static long alGetPointerSOFT(@NativeType("ALenum") int pname) { + long __functionAddress = AL.getICD().alGetPointerSOFT; + if (CHECKS) { + check(__functionAddress); + } + return invokeP(pname, __functionAddress); + } + + // --- [ alGetPointervSOFT ] --- + + public static void nalGetPointervSOFT(int pname, long values) { + long __functionAddress = AL.getICD().alGetPointervSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(pname, values, __functionAddress); + } + + public static void alGetPointervSOFT(@NativeType("ALenum") int pname, @NativeType("ALvoid **") PointerBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetPointervSOFT(pname, memAddress(values)); + } + + /** Array version of: {@link #alEventControlSOFT EventControlSOFT} */ + public static void alEventControlSOFT(@NativeType("ALenum const *") int[] types, @NativeType("ALboolean") boolean enable) { + long __functionAddress = AL.getICD().alEventControlSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(types.length, types, enable, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTGainClampEx.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTGainClampEx.java new file mode 100644 index 000000000..aee9cc832 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTGainClampEx.java @@ -0,0 +1,32 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_gain_clamp_ex extension. + * + *

    This extension extends the gain clamping mechanism in standard AL. By default, OpenAL allows the source's and listener's {@link AL10#AL_GAIN GAIN} property to be set to + * any value that's greater-than or equal-to 0. The calculated source gain is clamped between its {@link AL10#AL_MIN_GAIN MIN_GAIN} and {@link AL10#AL_MAX_GAIN MAX_GAIN} properties after distance + * attenuation and the directional cone is applied, and before the listener gain is applied, however these two clamping properties are themselves + * restricted to being between 0 and 1 (inclusive).

    + * + *

    That behavior effectively nullifies any purpose of setting a source's gain being above 1, as the source's distance- and cone-related properties can be + * modified for the same effect. Oddly, the listener gain is applied to the source gain *after* the clamping, so it is still possible for the final + * calculated gain to exceed 1. On top of this, the spec allows an implementation the option to implicitly clamp the final calculated gain for the source + * as needed, but provides no means for applications to detect such behavior.

    + * + *

    This extension aims to fix those problems by removing the maximum limit for {@link AL10#AL_MIN_GAIN MIN_GAIN} and {@link AL10#AL_MAX_GAIN MAX_GAIN}, allowing applications to increase the effective + * source gain above 1. Additionally, it provides a query for the application to retrieve the implicit clamp level an implementation may put on the final + * calculated gain.

    + */ +public final class SOFTGainClampEx { + + /** An implementation-defined maximum per-source gain limit (guaranteed to be at least 1). */ + public static final int AL_GAIN_LIMIT_SOFT = 0x200E; + + private SOFTGainClampEx() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTHRTF.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTHRTF.java new file mode 100644 index 000000000..97b69798c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTHRTF.java @@ -0,0 +1,135 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the SOFT_HRTF extension. + * + *

    This extension allows an application to request and determine the status of HRTF mixing. HRTF, or Head-Related Transfer Function, is a method of mixing + * 3D audio for "true" 3D panning, typically using filters designed to simulate how sound is affected by a listener's head as the sound waves travel + * between the ears.

    + * + *

    As a 3D sound API, OpenAL's design allows implementations to transparently render audio using HRTF. However, the OpenAL API currently has no concept of + * HRTF so there's no way to query if it's being used, and no way for an application to request it on behalf of the user. This aims to fix that.

    + */ +public class SOFTHRTF { + + /** + * Accepted as part of the {@code attrList} parameter of {@link ALC10#alcCreateContext CreateContext} and {@link #alcResetDeviceSOFT ResetDeviceSOFT}, and as the {@code paramName} parameter of + * {@link ALC10#alcGetIntegerv GetIntegerv}. + */ + public static final int ALC_HRTF_SOFT = 0x1992; + + /** Accepted as part of the {@code attrList} parameter of {@link ALC10#alcCreateContext CreateContext} and {@link #alcResetDeviceSOFT ResetDeviceSOFT}. */ + public static final int ALC_HRTF_ID_SOFT = 0x1996; + + /** Accepted as part of the {@code attrList} parameter of {@link ALC10#alcCreateContext CreateContext} and {@link #alcResetDeviceSOFT ResetDeviceSOFT}, for the {@link #ALC_HRTF_SOFT HRTF_SOFT} attribute. */ + public static final int ALC_DONT_CARE_SOFT = 0x2; + + /** Accepted as the {@code paramName} parameter of {@link ALC10#alcGetIntegerv GetIntegerv}. */ + public static final int + ALC_HRTF_STATUS_SOFT = 0x1993, + ALC_NUM_HRTF_SPECIFIERS_SOFT = 0x1994; + + /** Accepted as the {@code paramName} parameter of {@link ALC10#alcGetString GetString} and {@link #alcGetStringiSOFT GetStringiSOFT}. */ + public static final int ALC_HRTF_SPECIFIER_SOFT = 0x1995; + + /** Possible results from a {@link #ALC_HRTF_STATUS_SOFT HRTF_STATUS_SOFT} query. */ + public static final int + ALC_HRTF_DISABLED_SOFT = 0x0, + ALC_HRTF_ENABLED_SOFT = 0x1, + ALC_HRTF_DENIED_SOFT = 0x2, + ALC_HRTF_REQUIRED_SOFT = 0x3, + ALC_HRTF_HEADPHONES_DETECTED_SOFT = 0x4, + ALC_HRTF_UNSUPPORTED_FORMAT_SOFT = 0x5; + + protected SOFTHRTF() { + throw new UnsupportedOperationException(); + } + + // --- [ alcGetStringiSOFT ] --- + + /** Unsafe version of: {@link #alcGetStringiSOFT GetStringiSOFT} */ + public static long nalcGetStringiSOFT(long device, int paramName, int index) { + long __functionAddress = ALC.getICD().alcGetStringiSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + } + return invokePP(device, paramName, index, __functionAddress); + } + + /** + * Returns a human-readable string for an HRTF. + * + *

    The returned string will be an implementation-defined UTF-8 encoded specifier for the given HRTF index, designed for display to the user. The returned + * strings are valid until the next enumeration point or the device is closed.

    + * + * @param device he same one that previously queried the number of HRTF specifiers + * @param paramName the parameter to query. Must be:
    {@link #ALC_HRTF_SPECIFIER_SOFT HRTF_SPECIFIER_SOFT}
    + * @param index an index between 0 (inclusive) and the previously-queried HRTF count (exclusive) + */ + @Nullable + @NativeType("ALCchar const *") + public static String alcGetStringiSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCenum") int paramName, @NativeType("ALCsizei") int index) { + long __result = nalcGetStringiSOFT(device, paramName, index); + return memUTF8Safe(__result); + } + + // --- [ alcResetDeviceSOFT ] --- + + /** Unsafe version of: {@link #alcResetDeviceSOFT ResetDeviceSOFT} */ + public static boolean nalcResetDeviceSOFT(long device, long attrList) { + long __functionAddress = ALC.getICD().alcResetDeviceSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + } + return invokePPZ(device, attrList, __functionAddress); + } + + /** + * Resets a device after it is opened for playback, to attempt changing the playback properties. + * + * @param device a handle to a valid playback device as returned by {@link ALC10#alcOpenDevice OpenDevice}, otherwise the call fails and an {@link ALC10#ALC_INVALID_DEVICE INVALID_DEVICE} error is generated + * @param attrList the same as what could be passed to {@link ALC10#alcCreateContext CreateContext}. The AL is allowed to ignore attributes and attribute value combinations the device + * cannot support, for example if the device doesn't support the requested {@link ALC10#ALC_FREQUENCY FREQUENCY} value, another value it does support may be set. + * + * @return on success the function returns {@link ALC10#ALC_TRUE TRUE}, and on failure the function returns {@link ALC10#ALC_FALSE FALSE}. Note that a return of {@link ALC10#ALC_TRUE TRUE} does not + * indicate any attributes were honored, just that the device was successfully reset. If you need to know what the attributes are after a reset, query the + * device using {@link ALC10#alcGetIntegerv GetIntegerv} with the relevant attributes. + */ + @NativeType("ALCboolean") + public static boolean alcResetDeviceSOFT(@NativeType("ALCdevice *") long device, @Nullable @NativeType("ALCint const *") IntBuffer attrList) { + if (CHECKS) { + checkNTSafe(attrList); + } + return nalcResetDeviceSOFT(device, memAddressSafe(attrList)); + } + + /** Array version of: {@link #alcResetDeviceSOFT ResetDeviceSOFT} */ + @NativeType("ALCboolean") + public static boolean alcResetDeviceSOFT(@NativeType("ALCdevice *") long device, @Nullable @NativeType("ALCint const *") int[] attrList) { + long __functionAddress = ALC.getICD().alcResetDeviceSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + checkNTSafe(attrList); + } + return invokePPZ(device, attrList, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopPoints.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopPoints.java new file mode 100644 index 000000000..1c5146d16 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopPoints.java @@ -0,0 +1,21 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_loop_points extension. + * + *

    This extension allows an application to specify the offsets at which a buffer loops. Unextended OpenAL only allows for a source to loop a whole buffer, + * or all buffers of a queue, which is not desirable for sounds that may want a lead-in or lead-out along with the looping portion.

    + */ +public final class SOFTLoopPoints { + + /** Accepted by the {@code paramName} parameter of {@link AL11#alBufferiv Bufferiv} and {@link AL11#alGetBufferiv GetBufferiv}. */ + public static final int AL_LOOP_POINTS_SOFT = 0x2015; + + private SOFTLoopPoints() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopback.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopback.java new file mode 100644 index 000000000..bcc993faf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopback.java @@ -0,0 +1,238 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the SOFT_loopback extension. + * + *

    This extension allows an application to read back OpenAL's rendered audio instead of having it output to an audio device on the system. Unextended + * OpenAL will output audio to an audio device, with no mechanism to allow an application to divert the audio somewhere else.

    + */ +public class SOFTLoopback { + + /** Accepted by the {@code type} parameter of {@link #alcIsRenderFormatSupportedSOFT IsRenderFormatSupportedSOFT}. */ + public static final int + ALC_BYTE_SOFT = 0x1400, + ALC_UNSIGNED_BYTE_SOFT = 0x1401, + ALC_SHORT_SOFT = 0x1402, + ALC_UNSIGNED_SHORT_SOFT = 0x1403, + ALC_INT_SOFT = 0x1404, + ALC_UNSIGNED_INT_SOFT = 0x1405, + ALC_FLOAT_SOFT = 0x1406; + + /** Accepted by the {@code channels} parameter of {@link #alcIsRenderFormatSupportedSOFT IsRenderFormatSupportedSOFT}. */ + public static final int + ALC_MONO_SOFT = 0x1500, + ALC_STEREO_SOFT = 0x1501, + ALC_QUAD_SOFT = 0x1503, + ALC_5POINT1_SOFT = 0x1504, + ALC_6POINT1_SOFT = 0x1505, + ALC_7POINT1_SOFT = 0x1506; + + /** Accepted as part of the {@code attrList} parameter of {@link ALC10#alcCreateContext CreateContext}. */ + public static final int + ALC_FORMAT_CHANNELS_SOFT = 0x1990, + ALC_FORMAT_TYPE_SOFT = 0x1991; + + protected SOFTLoopback() { + throw new UnsupportedOperationException(); + } + + // --- [ alcLoopbackOpenDeviceSOFT ] --- + + /** Unsafe version of: {@link #alcLoopbackOpenDeviceSOFT LoopbackOpenDeviceSOFT} */ + public static long nalcLoopbackOpenDeviceSOFT(long deviceName) { + long __functionAddress = ALC.getICD().alcLoopbackOpenDeviceSOFT; + if (CHECKS) { + check(__functionAddress); + } + return invokePP(deviceName, __functionAddress); + } + + /** + * Loopback devices provide a way for applications to "read back" rendered audio without it being sent to an actual audio device. It allows applications to + * render audio as fast or slow as it needs, making it suitable for non-real-time rendering, and so it can be passed to an audio codec or something for + * further processing. + * + *

    To open a loopback device, use this function.

    + * + *

    A loopback device behaves largely the same as a playback device. You may query playback state and error codes, and create contexts, which can then be + * set as current to generate sources and buffers like normal.

    + * + *

    Note that loopback devices do not have either the {@link ALC10#ALC_SYNC SYNC} or {@link ALC10#ALC_REFRESH REFRESH} attributes. Attempting to query them will result in an {@link ALC10#ALC_INVALID_ENUM INVALID_ENUM} + * error.

    + * + * @param deviceName which device or device driver to use for subsequent rendering. This may be {@code NULL} for an implementation-defined default, otherwise it must be a + * valid name returned by enumeration (and further must be a device capable of loopback rendering). + */ + @NativeType("ALCdevice *") + public static long alcLoopbackOpenDeviceSOFT(@Nullable @NativeType("ALCchar const *") ByteBuffer deviceName) { + if (CHECKS) { + checkNT1Safe(deviceName); + } + return nalcLoopbackOpenDeviceSOFT(memAddressSafe(deviceName)); + } + + /** + * Loopback devices provide a way for applications to "read back" rendered audio without it being sent to an actual audio device. It allows applications to + * render audio as fast or slow as it needs, making it suitable for non-real-time rendering, and so it can be passed to an audio codec or something for + * further processing. + * + *

    To open a loopback device, use this function.

    + * + *

    A loopback device behaves largely the same as a playback device. You may query playback state and error codes, and create contexts, which can then be + * set as current to generate sources and buffers like normal.

    + * + *

    Note that loopback devices do not have either the {@link ALC10#ALC_SYNC SYNC} or {@link ALC10#ALC_REFRESH REFRESH} attributes. Attempting to query them will result in an {@link ALC10#ALC_INVALID_ENUM INVALID_ENUM} + * error.

    + * + * @param deviceName which device or device driver to use for subsequent rendering. This may be {@code NULL} for an implementation-defined default, otherwise it must be a + * valid name returned by enumeration (and further must be a device capable of loopback rendering). + */ + @NativeType("ALCdevice *") + public static long alcLoopbackOpenDeviceSOFT(@Nullable @NativeType("ALCchar const *") CharSequence deviceName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(deviceName, true); + long deviceNameEncoded = deviceName == null ? NULL : stack.getPointerAddress(); + return nalcLoopbackOpenDeviceSOFT(deviceNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alcIsRenderFormatSupportedSOFT ] --- + + /** + * When creating contexts, the attribute list must specify the format used for rendering. This is done with the {@link #ALC_FORMAT_CHANNELS_SOFT FORMAT_CHANNELS_SOFT}, {@link #ALC_FORMAT_TYPE_SOFT FORMAT_TYPE_SOFT}, + * and {@link ALC10#ALC_FREQUENCY FREQUENCY} attributes. This controls the format of the audio subsequently rendered by the device. + * + *

    To check if a particular rendering format is available, use this function.

    + * + * @param device the loopback device to query + * @param frequency the sample rate of the rendered audio + * @param channels the channel configuration used for rendering. One of:
    {@link #ALC_MONO_SOFT MONO_SOFT}{@link #ALC_STEREO_SOFT STEREO_SOFT}{@link #ALC_QUAD_SOFT QUAD_SOFT}{@link #ALC_5POINT1_SOFT 5POINT1_SOFT}{@link #ALC_6POINT1_SOFT 6POINT1_SOFT}{@link #ALC_7POINT1_SOFT 7POINT1_SOFT}
    + * @param type sample type of the written audio. One of:
    {@link #ALC_BYTE_SOFT BYTE_SOFT}{@link #ALC_UNSIGNED_BYTE_SOFT UNSIGNED_BYTE_SOFT}{@link #ALC_SHORT_SOFT SHORT_SOFT}{@link #ALC_UNSIGNED_SHORT_SOFT UNSIGNED_SHORT_SOFT}{@link #ALC_INT_SOFT INT_SOFT}{@link #ALC_UNSIGNED_INT_SOFT UNSIGNED_INT_SOFT}
    {@link #ALC_FLOAT_SOFT FLOAT_SOFT}
    + */ + @NativeType("ALCboolean") + public static boolean alcIsRenderFormatSupportedSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCsizei") int frequency, @NativeType("ALCenum") int channels, @NativeType("ALCenum") int type) { + long __functionAddress = ALC.getICD().alcIsRenderFormatSupportedSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + } + return invokePZ(device, frequency, channels, type, __functionAddress); + } + + // --- [ alcRenderSamplesSOFT ] --- + + /** Unsafe version of: {@link #alcRenderSamplesSOFT RenderSamplesSOFT} */ + public static void nalcRenderSamplesSOFT(long device, long buffer, int samples) { + long __functionAddress = ALC.getICD().alcRenderSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePPV(device, buffer, samples, __functionAddress); + } + + /** + * The state of various objects on loopback devices (including processed buffers and source offsets) is processed only when new samples are rendered. To + * render samples, use this function. + * + * @param device the loopback device which samples are rendered from, using its contexts and associated buffers and sources + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to render + */ + @NativeType("ALCvoid") + public static void alcRenderSamplesSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") ByteBuffer buffer, @NativeType("ALCsizei") int samples) { + nalcRenderSamplesSOFT(device, memAddress(buffer), samples); + } + + /** + * The state of various objects on loopback devices (including processed buffers and source offsets) is processed only when new samples are rendered. To + * render samples, use this function. + * + * @param device the loopback device which samples are rendered from, using its contexts and associated buffers and sources + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to render + */ + @NativeType("ALCvoid") + public static void alcRenderSamplesSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") ShortBuffer buffer, @NativeType("ALCsizei") int samples) { + nalcRenderSamplesSOFT(device, memAddress(buffer), samples); + } + + /** + * The state of various objects on loopback devices (including processed buffers and source offsets) is processed only when new samples are rendered. To + * render samples, use this function. + * + * @param device the loopback device which samples are rendered from, using its contexts and associated buffers and sources + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to render + */ + @NativeType("ALCvoid") + public static void alcRenderSamplesSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") IntBuffer buffer, @NativeType("ALCsizei") int samples) { + nalcRenderSamplesSOFT(device, memAddress(buffer), samples); + } + + /** + * The state of various objects on loopback devices (including processed buffers and source offsets) is processed only when new samples are rendered. To + * render samples, use this function. + * + * @param device the loopback device which samples are rendered from, using its contexts and associated buffers and sources + * @param buffer the buffer that will receive the samples. It must be big enough to contain at least {@code samples} sample frames. + * @param samples the number of sample frames to render + */ + @NativeType("ALCvoid") + public static void alcRenderSamplesSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") FloatBuffer buffer, @NativeType("ALCsizei") int samples) { + nalcRenderSamplesSOFT(device, memAddress(buffer), samples); + } + + /** Array version of: {@link #alcRenderSamplesSOFT RenderSamplesSOFT} */ + @NativeType("ALCvoid") + public static void alcRenderSamplesSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") short[] buffer, @NativeType("ALCsizei") int samples) { + long __functionAddress = ALC.getICD().alcRenderSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePPV(device, buffer, samples, __functionAddress); + } + + /** Array version of: {@link #alcRenderSamplesSOFT RenderSamplesSOFT} */ + @NativeType("ALCvoid") + public static void alcRenderSamplesSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") int[] buffer, @NativeType("ALCsizei") int samples) { + long __functionAddress = ALC.getICD().alcRenderSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePPV(device, buffer, samples, __functionAddress); + } + + /** Array version of: {@link #alcRenderSamplesSOFT RenderSamplesSOFT} */ + @NativeType("ALCvoid") + public static void alcRenderSamplesSOFT(@NativeType("ALCdevice *") long device, @NativeType("ALCvoid *") float[] buffer, @NativeType("ALCsizei") int samples) { + long __functionAddress = ALC.getICD().alcRenderSamplesSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePPV(device, buffer, samples, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopbackBformat.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopbackBformat.java new file mode 100644 index 000000000..c69501dd8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTLoopbackBformat.java @@ -0,0 +1,43 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the ALC_SOFT_loopback_bformat extension. + * + *

    This extension allows a loopback device to render B-Format audio channels. The base loopback extension provides for discrete channel mixes, while + * sometimes a non-discrete soundfield mix may be desirable, for instance if recording a 3D video or passing the output to an external ambisonic decoder.

    + */ +public final class SOFTLoopbackBformat { + + /** + * Accepted as parameters for {@link SOFTLoopback#ALC_FORMAT_CHANNELS_SOFT FORMAT_CHANNELS_SOFT} in the {@code attrList} parameter of {@link ALC10#alcCreateContext CreateContext}, and by the {@code channels} parameter of + * {@link SOFTLoopback#alcIsRenderFormatSupportedSOFT IsRenderFormatSupportedSOFT}. + */ + public static final int ALC_BFORMAT3D_SOFT = 0x1507; + + /** Accepted as part of the {@code attrList} parameter of {@link ALC10#alcCreateContext CreateContext}. */ + public static final int + ALC_AMBISONIC_LAYOUT_SOFT = 0x1997, + ALC_AMBISONIC_SCALING_SOFT = 0x1998, + ALC_AMBISONIC_ORDER_SOFT = 0x1999; + + /** Accepted as parameters for {@link #ALC_AMBISONIC_LAYOUT_SOFT AMBISONIC_LAYOUT_SOFT} in the {@code attrList} parameter of {@link ALC10#alcCreateContext CreateContext}. */ + public static final int + ALC_FUMA_SOFT = 0x0, + ALC_ACN_SOFT = 0x1; + + /** Accepted as parameters for {@link #ALC_AMBISONIC_SCALING_SOFT AMBISONIC_SCALING_SOFT} in the {@code attrList} parameter of {@link ALC10#alcCreateContext CreateContext}. */ + public static final int + ALC_SN3D_SOFT = 0x1, + ALC_N3D_SOFT = 0x2; + + /** Accepted as the {@code paramName} parameter of {@link AL10#alGetIntegerv GetIntegerv}. */ + public static final int ALC_MAX_AMBISONIC_ORDER_SOFT = 0x199B; + + private SOFTLoopbackBformat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTMSADPCM.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTMSADPCM.java new file mode 100644 index 000000000..fa355c02d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTMSADPCM.java @@ -0,0 +1,22 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_MSADPCM extension. + * + *

    This extension adds support for MSADPCM compressed sample formats.

    + */ +public final class SOFTMSADPCM { + + /** Accepted by the {@code format} parameter of {@link AL10#alBufferData BufferData}. */ + public static final int + AL_FORMAT_MONO_MSADPCM_SOFT = 0x1302, + AL_FORMAT_STEREO_MSADPCM_SOFT = 0x1303; + + private SOFTMSADPCM() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTOutputLimiter.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTOutputLimiter.java new file mode 100644 index 000000000..cc50136ee --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTOutputLimiter.java @@ -0,0 +1,21 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_output_limiter extension. + * + *

    This extension allows an application to control OpenAL Soft's output limiter. OpenAL Soft 1.18 adds an output limiter to prevent excessive clipping on + * the output, and this extension allows applications to turn it off or on.

    + */ +public final class SOFTOutputLimiter { + + /** Accepted as part of the {@code attrList} parameter of {@link ALC10#alcCreateContext CreateContext} and {@link SOFTHRTF#alcResetDeviceSOFT ResetDeviceSOFT}, and as the {@code paramName} parameter of {@link AL10#alGetIntegerv GetIntegerv}. */ + public static final int ALC_OUTPUT_LIMITER_SOFT = 0x199A; + + private SOFTOutputLimiter() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTOutputMode.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTOutputMode.java new file mode 100644 index 000000000..18d0a6abb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTOutputMode.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_output_mode extension. + * + *

    This extension provides a method for applications to request a particular output mode for playback devices, and query what's in use. With standard + * OpenAL, the output mode is at the sole discretion of the library, with the application having no way to know what's being used. While this works fine + * most of the time (typically the library will be able to query the system configuration and auto-select a mode to match, and the app handles sounds as + * being in 3D space), this is sometimes not possible or the most ideal option for all use-cases. There are also cases where a desirable output mode isn't + * distinguishable by the device configuration, for example with stereo vs UHJ vs HRTF.

    + */ +public final class SOFTOutputMode { + + /** Accepted as part of the {@code attrList} parameter of {@link ALC10#alcCreateContext CreateContext} and as the {@code paramName} parameter of {@link AL10#alGetIntegerv GetIntegerv}. */ + public static final int ALC_OUTPUT_MODE_SOFT = 0x19AC; + + /** Accepted as part of the {@code attrList} parameter of {@link ALC10#alcCreateContext CreateContext}, for the {@link #ALC_OUTPUT_MODE_SOFT OUTPUT_MODE_SOFT} attribute. */ + public static final int + ALC_ANY_SOFT = 0x19AD, + ALC_MONO_SOFT = 0x1500, + ALC_STEREO_SOFT = 0x1501, + ALC_STEREO_BASIC_SOFT = 0x19AE, + ALC_STEREO_UHJ_SOFT = 0x19AF, + ALC_STEREO_HRTF_SOFT = 0x19B2, + ALC_QUAD_SOFT = 0x1503, + ALC_SURROUND_5_1_SOFT = 0x1504, + ALC_SURROUND_6_1_SOFT = 0x1505, + ALC_SURROUND_7_1_SOFT = 0x1506; + + private SOFTOutputMode() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTPauseDevice.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTPauseDevice.java new file mode 100644 index 000000000..7683dce48 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTPauseDevice.java @@ -0,0 +1,69 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the SOFT_pause_device extension. + * + *

    This extension allows applications to pause a playback device. The main purpose of this is to silence output, stop processing, and allow the audio + * hardware to go into a low-power mode. On a mobile device, for instance, apps may want to silence output and not waste battery life with unneeded + * processing when in the background.

    + */ +public class SOFTPauseDevice { + + protected SOFTPauseDevice() { + throw new UnsupportedOperationException(); + } + + // --- [ alcDevicePauseSOFT ] --- + + /** + * Pauses a playback device. + * + *

    When paused, no contexts associated with the device will be processed or updated. Playing sources will not produce sound, have their offsets + * incremented, or process any more buffers, until the device is resumed. Pausing a device that is already paused is a legal no-op.

    + * + * @param device the device to pause + */ + @NativeType("ALCvoid") + public static void alcDevicePauseSOFT(@NativeType("ALCdevice *") long device) { + long __functionAddress = ALC.getICD().alcDevicePauseSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePV(device, __functionAddress); + } + + // --- [ alcDeviceResumeSOFT ] --- + + /** + * Resumes playback of a paused device. + * + *

    This will restart processing on the device -- sources will resume playing sound as normal. Resuming playback on a device that is not paused is a legal + * no-op.

    + * + *

    These functions are not reference counted. alcDeviceResumeSOFT only needs to be called once to resume playback, regardless of how many times + * {@link #alcDevicePauseSOFT DevicePauseSOFT} was called.

    + * + * @param device the device to resume + */ + @NativeType("ALCvoid") + public static void alcDeviceResumeSOFT(@NativeType("ALCdevice *") long device) { + long __functionAddress = ALC.getICD().alcDeviceResumeSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + } + invokePV(device, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTReopenDevice.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTReopenDevice.java new file mode 100644 index 000000000..9b0c95f29 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTReopenDevice.java @@ -0,0 +1,118 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the SOFT_reopen_device extension. + * + *

    This extension provides a mechanism for applications to move the output of a device from one endpoint to another. Standard OpenAL devices are + * associated with an output on the system upon being opened, but if the endpoint should no longer be the desired output, there is no method for the + * application to easily change it. The only option for the application is to delete all AL objects, destroy the context, close the device handle, open a + * new device, and reload/recreate the necessary resources. A method to more simply move the device with its existing resources to a different output is + * easier, requiring less management from the application.

    + */ +public class SOFTReopenDevice { + + protected SOFTReopenDevice() { + throw new UnsupportedOperationException(); + } + + // --- [ alcReopenDeviceSOFT ] --- + + /** Unsafe version of: {@link #alcReopenDeviceSOFT ReopenDeviceSOFT} */ + public static boolean nalcReopenDeviceSOFT(long device, long deviceName, long attribs) { + long __functionAddress = ALC.getICD().alcReopenDeviceSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + } + return invokePPPZ(device, deviceName, attribs, __functionAddress); + } + + /** + * Once a playback device is opened, it becomes associated with a particular output endpoint. When this output is no longer the desired output, the + * playback device can be reopened to re-associate it with a potentially different output endpoint using {@code alcReopenDeviceSOFT}. + * + * @param device a non-{@code NULL} handle for an existing device + * @param deviceName the device name to open, or {@code NULL} for the default (same as would be passed to {@link ALC10#alcOpenDevice OpenDevice}) + * @param attribs an attribute list to configure the device with, with the same attribute list that would be passed to {@link ALC10#alcCreateContext CreateContext}. + */ + @NativeType("ALCboolean") + public static boolean alcReopenDeviceSOFT(@NativeType("ALCdevice *") long device, @Nullable @NativeType("ALCchar const *") ByteBuffer deviceName, @Nullable @NativeType("ALCint const *") IntBuffer attribs) { + if (CHECKS) { + checkNT1Safe(deviceName); + checkNTSafe(attribs); + } + return nalcReopenDeviceSOFT(device, memAddressSafe(deviceName), memAddressSafe(attribs)); + } + + /** + * Once a playback device is opened, it becomes associated with a particular output endpoint. When this output is no longer the desired output, the + * playback device can be reopened to re-associate it with a potentially different output endpoint using {@code alcReopenDeviceSOFT}. + * + * @param device a non-{@code NULL} handle for an existing device + * @param deviceName the device name to open, or {@code NULL} for the default (same as would be passed to {@link ALC10#alcOpenDevice OpenDevice}) + * @param attribs an attribute list to configure the device with, with the same attribute list that would be passed to {@link ALC10#alcCreateContext CreateContext}. + */ + @NativeType("ALCboolean") + public static boolean alcReopenDeviceSOFT(@NativeType("ALCdevice *") long device, @Nullable @NativeType("ALCchar const *") CharSequence deviceName, @Nullable @NativeType("ALCint const *") IntBuffer attribs) { + if (CHECKS) { + checkNTSafe(attribs); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(deviceName, true); + long deviceNameEncoded = deviceName == null ? NULL : stack.getPointerAddress(); + return nalcReopenDeviceSOFT(device, deviceNameEncoded, memAddressSafe(attribs)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #alcReopenDeviceSOFT ReopenDeviceSOFT} */ + @NativeType("ALCboolean") + public static boolean alcReopenDeviceSOFT(@NativeType("ALCdevice *") long device, @Nullable @NativeType("ALCchar const *") ByteBuffer deviceName, @Nullable @NativeType("ALCint const *") int[] attribs) { + long __functionAddress = ALC.getICD().alcReopenDeviceSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + checkNT1Safe(deviceName); + checkNTSafe(attribs); + } + return invokePPPZ(device, memAddressSafe(deviceName), attribs, __functionAddress); + } + + /** Array version of: {@link #alcReopenDeviceSOFT ReopenDeviceSOFT} */ + @NativeType("ALCboolean") + public static boolean alcReopenDeviceSOFT(@NativeType("ALCdevice *") long device, @Nullable @NativeType("ALCchar const *") CharSequence deviceName, @Nullable @NativeType("ALCint const *") int[] attribs) { + long __functionAddress = ALC.getICD().alcReopenDeviceSOFT; + if (CHECKS) { + check(__functionAddress); + check(device); + checkNTSafe(attribs); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(deviceName, true); + long deviceNameEncoded = deviceName == null ? NULL : stack.getPointerAddress(); + return invokePPPZ(device, deviceNameEncoded, attribs, __functionAddress); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceLatency.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceLatency.java new file mode 100644 index 000000000..b195f1e6c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceLatency.java @@ -0,0 +1,490 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the SOFT_source_latency extension. + * + *

    This extension provides a method for applications to more accurately measure the playback latency of sources. Unextended OpenAL allows apps to retrieve + * a source's playback offset in bytes, samples, or seconds, but this is (typically) where the AL is processing the audio data.

    + * + *

    Often, more processing is done outside of the AL. Audio servers are common and they can introduce a bit of latency, increasing the time between when the + * AL is done with a piece of audio data until it gets heard by the user. If the OpenAL implementation uses its own mixer, that can also add to the + * latency. This can ultimately cause a not-insignificant delay between where the AL is processing and what is actually being heard.

    + * + *

    Although this delay may not be very noticeable for general gaming, if the app is trying to keep a video or animation syncronized with the playback of an + * OpenAL source this extra delay can cause the audio and video to appear of out sync.

    + * + *

    Luckily, most audio systems have a way of measuring the latency it takes for sound to actually get to the physical output device (the DAC or speakers). + * By providing this information through the AL, an application can more accurately tell what a user is hearing and thus synchronize better with the audio + * output.

    + */ +public class SOFTSourceLatency { + + /** + * The playback position, expressed in fixed-point samples, along with the playback latency, expressed in nanoseconds (1/1000000000ths of a second). This + * attribute is read-only. + * + *

    The first value in the returned vector is the sample offset, which is a 32.32 fixed-point value. The whole number is stored in the upper 32 bits and + * the fractional component is in the lower 32 bits. The value is similar to that returned by {@link AL11#AL_SAMPLE_OFFSET SAMPLE_OFFSET}, just with more precision.

    + * + *

    The second value is the latency, in nanoseconds. It represents the length of time it will take for the audio at the current offset to actually reach + * the speakers or DAC. This value should be considered volatile, as it may change very often during playback (it can depend on a number of factors, + * including how full the mixing buffer OpenAL may be using is timer jitter, or other changes deeper in the audio pipeline).

    + * + *

    The retrieved offset and latency should be considered atomic, with respect to one another. This means the returned latency was measured exactly when + * the source was at the returned offset.

    + */ + public static final int AL_SAMPLE_OFFSET_LATENCY_SOFT = 0x1200; + + /** + * The playback position, along with the playback latency, both expressed in seconds. This attribute is read-only. + * + *

    The first value in the returned vector is the offset in seconds. The value is similar to that returned by {@link AL11#AL_SEC_OFFSET SEC_OFFSET}, just with more precision.

    + * + *

    The second value is the latency, in seconds. It represents the length of time it will take for the audio at the current offset to actually reach the + * speakers or DAC. This value should be considered volatile, as it may change very often during playback (it can depend on a number of factors, including + * how full the mixing buffer OpenAL may be using is, timer jitter, or other changes deeper in the audio pipeline).

    + * + *

    The retrieved offset and latency should be considered atomic with respect to one another. This means the returned latency was measured exactly when the + * source was at the returned offset.

    + */ + public static final int AL_SEC_OFFSET_LATENCY_SOFT = 0x1201; + + protected SOFTSourceLatency() { + throw new UnsupportedOperationException(); + } + + // --- [ alSourcedSOFT ] --- + + /** + * Sets the double value of a source parameter. + * + * @param source the source to modify + * @param param the parameter to modify + * @param value the parameter value + */ + @NativeType("ALvoid") + public static void alSourcedSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALdouble") double value) { + long __functionAddress = AL.getICD().alSourcedSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokeV(source, param, value, __functionAddress); + } + + // --- [ alSource3dSOFT ] --- + + /** + * Sets the 3 dimensional double values of a source parameter. + * + * @param source the source to modify + * @param param the parameter to modify + * @param value1 the first value + * @param value2 the second value + * @param value3 the third value + */ + @NativeType("ALvoid") + public static void alSource3dSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALdouble") double value1, @NativeType("ALdouble") double value2, @NativeType("ALdouble") double value3) { + long __functionAddress = AL.getICD().alSource3dSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokeV(source, param, value1, value2, value3, __functionAddress); + } + + // --- [ alSourcedvSOFT ] --- + + /** Unsafe version of: {@link #alSourcedvSOFT SourcedvSOFT} */ + public static void nalSourcedvSOFT(int source, int param, long value) { + long __functionAddress = AL.getICD().alSourcedvSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(source, param, value, __functionAddress); + } + + /** + * pointer version of {@link #alSourcedSOFT SourcedSOFT} + * + * @param source the source to modify + * @param param the parameter to modify + * @param value the parameter values + */ + @NativeType("ALvoid") + public static void alSourcedvSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALdouble const *") DoubleBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalSourcedvSOFT(source, param, memAddress(value)); + } + + // --- [ alGetSourcedSOFT ] --- + + /** Unsafe version of: {@link #alGetSourcedSOFT GetSourcedSOFT} */ + public static void nalGetSourcedSOFT(int source, int param, long value) { + long __functionAddress = AL.getICD().alGetSourcedSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(source, param, value, __functionAddress); + } + + /** + * Gets the double value of a source parameter. + * + * @param source the source to query + * @param param the parameter to query + * @param value the parameter values + */ + @NativeType("ALvoid") + public static void alGetSourcedSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALdouble *") DoubleBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetSourcedSOFT(source, param, memAddress(value)); + } + + /** + * Gets the double value of a source parameter. + * + * @param source the source to query + * @param param the parameter to query + */ + @NativeType("ALvoid") + public static double alGetSourcedSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer value = stack.callocDouble(1); + nalGetSourcedSOFT(source, param, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetSource3dSOFT ] --- + + /** Unsafe version of: {@link #alGetSource3dSOFT GetSource3dSOFT} */ + public static void nalGetSource3dSOFT(int source, int param, long value1, long value2, long value3) { + long __functionAddress = AL.getICD().alGetSource3dSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePPPV(source, param, value1, value2, value3, __functionAddress); + } + + /** + * Gets the 3 dimensional double values of a source parameter. + * + * @param source the source to query + * @param param the parameter to query + * @param value1 the first value + * @param value2 the second value + * @param value3 the third value + */ + @NativeType("ALvoid") + public static void alGetSource3dSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALdouble *") DoubleBuffer value1, @NativeType("ALdouble *") DoubleBuffer value2, @NativeType("ALdouble *") DoubleBuffer value3) { + if (CHECKS) { + check(value1, 1); + check(value2, 1); + check(value3, 1); + } + nalGetSource3dSOFT(source, param, memAddress(value1), memAddress(value2), memAddress(value3)); + } + + // --- [ alGetSourcedvSOFT ] --- + + /** Unsafe version of: {@link #alGetSourcedvSOFT GetSourcedvSOFT} */ + public static void nalGetSourcedvSOFT(int source, int param, long values) { + long __functionAddress = AL.getICD().alGetSourcedvSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(source, param, values, __functionAddress); + } + + /** + * Array version of {@link #alGetSourcedSOFT GetSourcedSOFT} + * + * @param source the source to query + * @param param the parameter to query + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetSourcedvSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALdouble *") DoubleBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetSourcedvSOFT(source, param, memAddress(values)); + } + + // --- [ alSourcei64SOFT ] --- + + /** + * Sets the 64 bit integer value of a source parameter. + * + * @param source the source to modify + * @param param the parameter to modify + * @param value the parameter values + */ + @NativeType("ALvoid") + public static void alSourcei64SOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint64SOFT") long value) { + long __functionAddress = AL.getICD().alSourcei64SOFT; + if (CHECKS) { + check(__functionAddress); + } + invokeJV(source, param, value, __functionAddress); + } + + // --- [ alSource3i64SOFT ] --- + + /** + * Sets the 3 dimensional 64 bit integer values of a source parameter. + * + * @param source the source to modify + * @param param the parameter to modify + * @param value1 the first value + * @param value2 the second value + * @param value3 the third value + */ + @NativeType("ALvoid") + public static void alSource3i64SOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint64SOFT") long value1, @NativeType("ALint64SOFT") long value2, @NativeType("ALint64SOFT") long value3) { + long __functionAddress = AL.getICD().alSource3i64SOFT; + if (CHECKS) { + check(__functionAddress); + } + invokeJJJV(source, param, value1, value2, value3, __functionAddress); + } + + // --- [ alSourcei64vSOFT ] --- + + /** Unsafe version of: {@link #alSourcei64vSOFT Sourcei64vSOFT} */ + public static void nalSourcei64vSOFT(int source, int param, long values) { + long __functionAddress = AL.getICD().alSourcei64vSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(source, param, values, __functionAddress); + } + + /** + * Array version of {@link #alSourcei64SOFT Sourcei64SOFT} + * + * @param source the source to modify + * @param param the parameter to modify + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alSourcei64vSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint64SOFT const *") LongBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalSourcei64vSOFT(source, param, memAddress(values)); + } + + // --- [ alGetSourcei64SOFT ] --- + + /** Unsafe version of: {@link #alGetSourcei64SOFT GetSourcei64SOFT} */ + public static void nalGetSourcei64SOFT(int source, int param, long value) { + long __functionAddress = AL.getICD().alGetSourcei64SOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(source, param, value, __functionAddress); + } + + /** + * Gets the 64 bit integer value of a source parameter. + * + * @param source the source to query + * @param param the parameter to query + * @param value the parameter values + */ + @NativeType("ALvoid") + public static void alGetSourcei64SOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint64SOFT *") LongBuffer value) { + if (CHECKS) { + check(value, 1); + } + nalGetSourcei64SOFT(source, param, memAddress(value)); + } + + /** + * Gets the 64 bit integer value of a source parameter. + * + * @param source the source to query + * @param param the parameter to query + */ + @NativeType("ALvoid") + public static long alGetSourcei64SOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer value = stack.callocLong(1); + nalGetSourcei64SOFT(source, param, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ alGetSource3i64SOFT ] --- + + /** Unsafe version of: {@link #alGetSource3i64SOFT GetSource3i64SOFT} */ + public static void nalGetSource3i64SOFT(int source, int param, long value1, long value2, long value3) { + long __functionAddress = AL.getICD().alGetSource3i64SOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePPPV(source, param, value1, value2, value3, __functionAddress); + } + + /** + * Gets the 3 dimensional 64 bit integer values of a source parameter. + * + * @param source the source to query + * @param param the parameter to query + * @param value1 the first value + * @param value2 the second value + * @param value3 the third value + */ + @NativeType("ALvoid") + public static void alGetSource3i64SOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint64SOFT *") LongBuffer value1, @NativeType("ALint64SOFT *") LongBuffer value2, @NativeType("ALint64SOFT *") LongBuffer value3) { + if (CHECKS) { + check(value1, 1); + check(value2, 1); + check(value3, 1); + } + nalGetSource3i64SOFT(source, param, memAddress(value1), memAddress(value2), memAddress(value3)); + } + + // --- [ alGetSourcei64vSOFT ] --- + + /** Unsafe version of: {@link #alGetSourcei64vSOFT GetSourcei64vSOFT} */ + public static void nalGetSourcei64vSOFT(int source, int param, long values) { + long __functionAddress = AL.getICD().alGetSourcei64vSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePV(source, param, values, __functionAddress); + } + + /** + * Array version of {@link #alGetSourcei64SOFT GetSourcei64SOFT} + * + * @param source the source to query + * @param param the parameter to query + * @param values the parameter values + */ + @NativeType("ALvoid") + public static void alGetSourcei64vSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint64SOFT *") LongBuffer values) { + if (CHECKS) { + check(values, 1); + } + nalGetSourcei64vSOFT(source, param, memAddress(values)); + } + + /** Array version of: {@link #alSourcedvSOFT SourcedvSOFT} */ + @NativeType("ALvoid") + public static void alSourcedvSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALdouble const *") double[] value) { + long __functionAddress = AL.getICD().alSourcedvSOFT; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(source, param, value, __functionAddress); + } + + /** Array version of: {@link #alGetSourcedSOFT GetSourcedSOFT} */ + @NativeType("ALvoid") + public static void alGetSourcedSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALdouble *") double[] value) { + long __functionAddress = AL.getICD().alGetSourcedSOFT; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(source, param, value, __functionAddress); + } + + /** Array version of: {@link #alGetSource3dSOFT GetSource3dSOFT} */ + @NativeType("ALvoid") + public static void alGetSource3dSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALdouble *") double[] value1, @NativeType("ALdouble *") double[] value2, @NativeType("ALdouble *") double[] value3) { + long __functionAddress = AL.getICD().alGetSource3dSOFT; + if (CHECKS) { + check(__functionAddress); + check(value1, 1); + check(value2, 1); + check(value3, 1); + } + invokePPPV(source, param, value1, value2, value3, __functionAddress); + } + + /** Array version of: {@link #alGetSourcedvSOFT GetSourcedvSOFT} */ + @NativeType("ALvoid") + public static void alGetSourcedvSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALdouble *") double[] values) { + long __functionAddress = AL.getICD().alGetSourcedvSOFT; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(source, param, values, __functionAddress); + } + + /** Array version of: {@link #alSourcei64vSOFT Sourcei64vSOFT} */ + @NativeType("ALvoid") + public static void alSourcei64vSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint64SOFT const *") long[] values) { + long __functionAddress = AL.getICD().alSourcei64vSOFT; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(source, param, values, __functionAddress); + } + + /** Array version of: {@link #alGetSourcei64SOFT GetSourcei64SOFT} */ + @NativeType("ALvoid") + public static void alGetSourcei64SOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint64SOFT *") long[] value) { + long __functionAddress = AL.getICD().alGetSourcei64SOFT; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + invokePV(source, param, value, __functionAddress); + } + + /** Array version of: {@link #alGetSource3i64SOFT GetSource3i64SOFT} */ + @NativeType("ALvoid") + public static void alGetSource3i64SOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint64SOFT *") long[] value1, @NativeType("ALint64SOFT *") long[] value2, @NativeType("ALint64SOFT *") long[] value3) { + long __functionAddress = AL.getICD().alGetSource3i64SOFT; + if (CHECKS) { + check(__functionAddress); + check(value1, 1); + check(value2, 1); + check(value3, 1); + } + invokePPPV(source, param, value1, value2, value3, __functionAddress); + } + + /** Array version of: {@link #alGetSourcei64vSOFT GetSourcei64vSOFT} */ + @NativeType("ALvoid") + public static void alGetSourcei64vSOFT(@NativeType("ALuint") int source, @NativeType("ALenum") int param, @NativeType("ALint64SOFT *") long[] values) { + long __functionAddress = AL.getICD().alGetSourcei64vSOFT; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + invokePV(source, param, values, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceLength.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceLength.java new file mode 100644 index 000000000..14186ca96 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceLength.java @@ -0,0 +1,30 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_source_length extension. + * + *

    This extension adds a method to retrieve the total length of a source's buffer data in bytes, samples, and seconds, which correspond to the byte, + * sample, and seconds offset extents. By default, OpenAL only provides a way to retrieve a buffer's storage size in bytes, which does not necessarily + * represent the data size given to alBufferData nor the byte offset extent for the source's {@link AL11#AL_BYTE_OFFSET BYTE_OFFSET} property. The + * {@code AL_SOFT_buffer_samples} extension allows an application to query a buffer for its length in bytes, samples, and seconds, but this is only for a + * single buffer; a buffer queue on a source still requires additional bookkeeping by the application to keep track of the length of each buffer being + * queued and unqueued on a given source. This extension aims to ease that and provide a simple query.

    + */ +public final class SOFTSourceLength { + + /** Accepted by the {@code paramName} parameter of {@link AL10#alGetSourcei GetSourcei} and {@link AL10#alGetSourceiv GetSourceiv} (these are the same as in AL_SOFT_buffer_samples). */ + public static final int + AL_BYTE_LENGTH_SOFT = 0x2009, + AL_SAMPLE_LENGTH_SOFT = 0x200A; + + /** Accepted by the {@code paramName} parameter of {@link AL10#alGetSourcef GetSourcef} and {@link AL10#alGetSourcefv GetSourcefv} (these are the same as in AL_SOFT_buffer_samples). */ + public static final int AL_SEC_LENGTH_SOFT = 0x200B; + + private SOFTSourceLength() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceResampler.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceResampler.java new file mode 100644 index 000000000..388f4e106 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceResampler.java @@ -0,0 +1,58 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the SOFT_source_resampler extension. + * + *

    This extension provides a method for applications to use different resamplers for sources. OpenAL automatically resamples when playing a source at a + * sample rate that don't match the device's sample rate, but the resampling method is left unspecified. One could assume it would use the "best" resample + * method available, but this gives no clear information about what's used nor any way to choose between quality or performance. Further, some + * applications may prefer lower quality resamplers for its spectral properties.

    + */ +public class SOFTSourceResampler { + + /** Accepted as the {@code pname} parameter of {@link AL10#alGetInteger GetInteger} and {@link AL10#alGetIntegerv GetIntegerv}. */ + public static final int + AL_NUM_RESAMPLERS_SOFT = 0x1210, + AL_DEFAULT_RESAMPLER_SOFT = 0x1211; + + /** Accepted as the {@code param} parameter of {@link AL10#alSourcei Sourcei}, {@link AL11#alSourceiv Sourceiv}, {@link AL10#alGetSourcei GetSourcei}, and {@link AL10#alGetSourceiv GetSourceiv}. */ + public static final int AL_SOURCE_RESAMPLER_SOFT = 0x1212; + + /** Accepted as the {@code pname} parameter of {@link #alGetStringiSOFT GetStringiSOFT}. */ + public static final int AL_RESAMPLER_NAME_SOFT = 0x1213; + + protected SOFTSourceResampler() { + throw new UnsupportedOperationException(); + } + + // --- [ alGetStringiSOFT ] --- + + public static long nalGetStringiSOFT(int pname, int index) { + long __functionAddress = AL.getICD().alGetStringiSOFT; + if (CHECKS) { + check(__functionAddress); + } + return invokeP(pname, index, __functionAddress); + } + + @Nullable + @NativeType("ALchar const *") + public static String alGetStringiSOFT(@NativeType("ALenum") int pname, @NativeType("ALsizei") int index) { + long __result = nalGetStringiSOFT(pname, index); + return memUTF8Safe(__result); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceSpatialize.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceSpatialize.java new file mode 100644 index 000000000..39de1b86c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceSpatialize.java @@ -0,0 +1,42 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_source_spatialize extension. + * + *

    This extension provides more control over the spatialization behavior of sources. By default, OpenAL will spatialize sources playing a mono buffer and + * not spatialize sources playing a multi-channel buffer. Spatialization features include positional panning, distance attenuation, cone-related + * attenuation, and doppler effects. This extension allows such features to be enabled and disabled per-source independently of the buffer format.

    + * + *

    Controlling Source Spatialization

    + * + *

    A source may have spatialization features applied depending on its {@link #AL_SOURCE_SPATIALIZE_SOFT SOURCE_SPATIALIZE_SOFT} property. Valid values for the property are {@link AL10#AL_FALSE FALSE}, {@link AL10#AL_TRUE TRUE}, + * and {@link #AL_AUTO_SOFT AUTO_SOFT}. When set to {@code AL_FALSE}, spatialization features are never applied to the source. When set to {@code AL_TRUE}, they are always + * applied. When set to {@code AL_AUTO_SOFT}, they are applied if playing a buffer with one channel, and not if the buffer has more than one channel. + * The default is {@code AL_AUTO_SOFT}.

    + * + *

    When spatialization features are applied on a source playing a non-mono buffer, if the source occupies the same 3D position as the listener the + * buffer's channels are placed around the listener according to the format (e.g. a stereo buffer has the left channel 30 degrees left of front, and the + * right channel 30 degrees right of front). This panning is NOT effected by the source direction or listener orientation.

    + * + *

    If the source does not occupy the same 3D position as the listener, the proper panning direction is calculated and all channels of the buffer will be + * panned to that direction (effectively down-mixing the buffer to mono dynamically). The buffer's channels will also receive a gain correction of + * {@code 1/num_channels} when panned, to preserve peak amplitude of the mixed channels. An exception is the LFE channel in buffer formats that include + * one. The LFE channel may be sent to the LFE output as normal and not be part of the panned mix, however it is still attenuated according to the source + * distance and cone.

    + */ +public final class SOFTSourceSpatialize { + + /** Accepted as the {@code param} parameter of {@link AL10#alSourcei Sourcei}, {@link AL11#alSourceiv Sourceiv}, {@link AL10#alGetSourcei GetSourcei}, and {@link AL10#alGetSourceiv GetSourceiv}. */ + public static final int AL_SOURCE_SPATIALIZE_SOFT = 0x1214; + + /** Accepted as the {@code value} of the {@link #AL_SOURCE_SPATIALIZE_SOFT SOURCE_SPATIALIZE_SOFT} property. */ + public static final int AL_AUTO_SOFT = 0x2; + + private SOFTSourceSpatialize() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceStartDelay.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceStartDelay.java new file mode 100644 index 000000000..1a6db1e81 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTSourceStartDelay.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the SOFT_source_start_delay extension. + * + *

    This extension allows applications to play a source at a particular future time.

    + * + *

    With standard OpenAL, an application can play a source with the {@link AL10#alSourcePlay SourcePlay} or {@link AL10#alSourcePlayv SourcePlayv} functions which causes sources to start playing as soon + * as possible, but the actual start time is left to the implementation to deal with (which could be on the next 10ms or 20ms boundary, or whenever the + * mixer can start processing the source).

    + * + *

    Aside from {@code alSourcePlayv} starting all given sources in sync, there is no way to start playing sources at particular times relative to each + * other, or synchronized to some specific time point.

    + * + *

    This extension adds functionality to start source playback at an absolute device clock time, as well as to start with a relative delay.

    + * + *

    Requires {@link SOFTDeviceClock SOFT_device_clock}.

    + */ +public class SOFTSourceStartDelay { + + protected SOFTSourceStartDelay() { + throw new UnsupportedOperationException(); + } + + // --- [ alSourcePlayAtTimeSOFT ] --- + + @NativeType("ALvoid") + public static void alSourcePlayAtTimeSOFT(@NativeType("ALuint") int source, @NativeType("ALint64SOFT") long start_time) { + long __functionAddress = AL.getICD().alSourcePlayAtTimeSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokeJV(source, start_time, __functionAddress); + } + + // --- [ alSourcePlayAtTimevSOFT ] --- + + public static void nalSourcePlayAtTimevSOFT(int n, long sources, long start_time) { + long __functionAddress = AL.getICD().alSourcePlayAtTimevSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePJV(n, sources, start_time, __functionAddress); + } + + @NativeType("ALvoid") + public static void alSourcePlayAtTimevSOFT(@NativeType("ALuint const *") IntBuffer sources, @NativeType("ALint64SOFT") long start_time) { + nalSourcePlayAtTimevSOFT(sources.remaining(), memAddress(sources), start_time); + } + + /** Array version of: {@link #alSourcePlayAtTimevSOFT SourcePlayAtTimevSOFT} */ + @NativeType("ALvoid") + public static void alSourcePlayAtTimevSOFT(@NativeType("ALuint const *") int[] sources, @NativeType("ALint64SOFT") long start_time) { + long __functionAddress = AL.getICD().alSourcePlayAtTimevSOFT; + if (CHECKS) { + check(__functionAddress); + } + invokePJV(sources.length, sources, start_time, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTUHJ.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTUHJ.java new file mode 100644 index 000000000..a93ac5846 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTUHJ.java @@ -0,0 +1,108 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_UHJ extension. + * + *

    This extension adds support for UHJ channel formats and a Super Stereo (a.k.a. Stereo Enhance) processor.

    + * + *

    UHJ is a method of encoding surround sound from a first-order B-Format signal into a stereo-compatible signal. Such signals can be played as normal + * stereo (with more stable and wider stereo imaging than pan-pot mixing) or decoded back to surround sound, which makes it a decent choice where 3+ + * channel surround sound isn't available or desirable. When decoded, a UHJ signal behaves like B-Format, which allows it to be rotated through + * AL_EXT_BFORMAT's source orientation property as with B-Format formats.

    + * + *

    The standard equation[1] for decoding UHJ to B-Format is:

    + * + *
    
    + * S = Left + Right
    + * D = Left - Right
    + * 
    + * W = 0.981532*S + 0.197484*j(0.828331*D + 0.767820*T)
    + * X = 0.418496*S - j(0.828331*D + 0.767820*T)
    + * Y = 0.795968*D - 0.676392*T + j(0.186633*S)
    + * Z = 1.023332*Q
    + * + *

    where {@code j} is a wide-band +90 degree phase shift. 2-channel UHJ excludes the T and Q input channels, and 3-channel excludes the Q input channel. + * Be aware that the resulting W, X, Y, and Z signals are 3dB louder than their FuMa counterparts, and the implementation should account for that to + * properly balance it against other sounds.

    + * + *

    An alternative equation for decoding 2-channel-only UHJ is:

    + * + *
    
    + * S = Left + Right
    + * D = Left - Right
    + * 
    + * W = 0.981532*S + j(0.163582*D)
    + * X = 0.418496*S - j(0.828331*D)
    + * Y = 0.762956*D + j(0.384230*S)
    + * + *

    Which equation to use depends on the implementation and user preferences. It's relevant to note that the standard decoding equation is reversible with + * the encoding equation, meaning decoding UHJ to B-Format with the standard equation and then encoding B-Format to UHJ results in the original UHJ + * signal, even for 2-channel. The alternative 2-channel decoding equation does not result in the original UHJ signal when re- encoded.

    + * + *

    One additional note for decoding 2-channel UHJ is the resulting B-Format signal should pass through alternate shelf filters for frequency-dependent + * processing. For the standard equation, suitable shelf filters are given as:

    + * + *
    
    + * W:   LF = 0.661, HF = 1.000
    + * X/Y: LF = 1.293, HF = 1.000
    + * + *

    And for the alternative equation, suitable shelf filters are given as:

    + * + *
    
    + * W:   LF = 0.646, HF = 1.000
    + * X/Y: LF = 1.263, HF = 1.000
    + * + *

    3- and 4-channel UHJ should use the normal shelf filters for B-Format.

    + * + *

    Super Stereo (occasionally called Stereo Enhance) is a technique for processing a plain (non-UHJ) stereo signal to derive a B-Format signal. It's + * backed by the same functionality as UHJ decoding, making it an easy addition on top of UHJ support. Super Stereo has a variable width control, allowing + * the stereo soundfield to "wrap around" the listener while maintaining a stable center image (a more naive virtual speaker approach would cause the + * center image to collapse as the soundfield widens). Since this derives a B-Format signal like UHJ, it also allows such sources to be rotated through + * the source orientation property.

    + * + *

    There are various forms of Super Stereo, with varying equations, but a good suggested option is:

    + * + *
    
    + * S = Left + Right
    + * D = Left - Right
    + * 
    + * W = 0.6098637*S - j(0.6896511*w*D)
    + * X = 0.8624776*S + j(0.7626955*w*D)
    + * Y = 1.6822415*w*D - j(0.2156194*S)
    + * + *

    where {@code w} is a variable width factor, in the range {@code [0...0.7]}. As with UHJ, the resulting W, X, Y, and Z signals are 3dB louder than their + * FuMa counterparts. The normal shelf filters for playing B-Format should apply.

    + */ +public final class SOFTUHJ { + + /** Accepted by the {@code format} parameter of {@link AL10#alBufferData BufferData}. */ + public static final int + AL_FORMAT_UHJ2CHN8_SOFT = 0x19A2, + AL_FORMAT_UHJ2CHN16_SOFT = 0x19A3, + AL_FORMAT_UHJ2CHN_FLOAT32_SOFT = 0x19A4, + AL_FORMAT_UHJ3CHN8_SOFT = 0x19A5, + AL_FORMAT_UHJ3CHN16_SOFT = 0x19A6, + AL_FORMAT_UHJ3CHN_FLOAT32_SOFT = 0x19A7, + AL_FORMAT_UHJ4CHN8_SOFT = 0x19A8, + AL_FORMAT_UHJ4CHN16_SOFT = 0x19A9, + AL_FORMAT_UHJ4CHN_FLOAT32_SOFT = 0x19AA; + + /** Accepted by the {@code param} parameter of {@link AL10#alSourcei Sourcei}, {@link AL11#alSourceiv Sourceiv}, {@link AL10#alGetSourcei GetSourcei}, and {@link AL10#alGetSourceiv GetSourceiv}. */ + public static final int AL_STEREO_MODE_SOFT = 0x19B0; + + /** Accepted by the {@code param} parameter of {@link AL10#alSourcef Sourcef}, {@link AL10#alSourcefv Sourcefv}, {@link AL10#alGetSourcef GetSourcef}, and {@link AL10#alGetSourcefv GetSourcefv}. */ + public static final int AL_SUPER_STEREO_WIDTH_SOFT = 0x19B1; + + /** Accepted by the {@code value} parameter of {@link AL10#alSourcei Sourcei} and {@link AL11#alSourceiv Sourceiv} for {@link #AL_STEREO_MODE_SOFT STEREO_MODE_SOFT}. */ + public static final int + AL_NORMAL_SOFT = 0x0, + AL_SUPER_STEREO_SOFT = 0x1; + + private SOFTUHJ() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTUHJEx.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTUHJEx.java new file mode 100644 index 000000000..cd0ce4e6c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTUHJEx.java @@ -0,0 +1,39 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFT_UHJ_ex extension. + * + *

    This extension supplements {@code AL_SOFT_UHJ} by adding {@code muLaw}, {@code aLaw}, {@code IMA4}, and {@code MSADPCM} sample types to UHJ formats. + * The base {@code AL_SOFT_UHJ} extension could already use these formats (when available) for Super Stereo processing, and this extension allows them to + * be used for UHJ itself too.

    + * + *

    Requires {@link SOFTUHJ SOFT_UHJ} and one or more of {@link EXTMulaw EXT_MULAW}, {@link EXTAlaw EXT_ALAW}, {@link EXTIma4 EXT_IMA4}, and {@link SOFTMSADPCM SOFT_MSADPCM}.

    + */ +public final class SOFTUHJEx { + + /** Accepted by the {@code format} parameter of {@link AL10#alBufferData BufferData} if {@link EXTMulaw EXT_MULAW} is also supported. */ + public static final int + AL_FORMAT_UHJ2CHN_MULAW_SOFT = 0x19B3, + AL_FORMAT_UHJ3CHN_MULAW_SOFT = 0x19B7, + AL_FORMAT_UHJ4CHN_MULAW_SOFT = 0x19B9; + + /** Accepted by the {@code format} parameter of {@link AL10#alBufferData BufferData} if {@link EXTAlaw EXT_ALAW} is also supported. */ + public static final int + AL_FORMAT_UHJ2CHN_ALAW_SOFT = 0x19B4, + AL_FORMAT_UHJ3CHN_ALAW_SOFT = 0x19B8, + AL_FORMAT_UHJ4CHN_ALAW_SOFT = 0x19BA; + + /** Accepted by the {@code format} parameter of {@link AL10#alBufferData BufferData} if {@link EXTIma4 EXT_IMA4} is also supported. */ + public static final int AL_FORMAT_UHJ2CHN_IMA4_SOFT = 0x19B5; + + /** Accepted by the {@code format} parameter of {@link AL10#alBufferData BufferData} if {@link SOFTMSADPCM SOFT_MSADPCM} is also supported. */ + public static final int AL_FORMAT_UHJ2CHN_MSADPCM_SOFT = 0x19B6; + + private SOFTUHJEx() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTXHoldOnDisconnect.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTXHoldOnDisconnect.java new file mode 100644 index 000000000..a82adcacd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/SOFTXHoldOnDisconnect.java @@ -0,0 +1,20 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.openal; + +/** + * Native bindings to the SOFTX_hold_on_disconnect extension. + * + *

    LWJGL: This extension is experimental.

    + */ +public final class SOFTXHoldOnDisconnect { + + /** Accepted by the {@code target} parameter of {@link AL10#alEnable Enable}, {@link AL10#alDisable Disable}, and {@link AL10#alIsEnabled IsEnabled}. */ + public static final int AL_STOP_SOURCES_ON_DISCONNECT_SOFT = 0x19AB; + + private SOFTXHoldOnDisconnect() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/Util.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/Util.java new file mode 100644 index 000000000..0930c2a7a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/Util.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2002-2008 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.openal; + + +/** + * Simple utility class for checking AL/ALC errors + * + * @author cix_foo + * @author Brian Matzon + * @version $Revision$ + */ + +public final class Util { + /** No c'tor */ + private Util() { + } + + /** + * Checks for any ALC errors and throws an unchecked exception on errors + * @param device Device for which to check ALC errors + */ + public static void checkALCError(ALCdevice device) { + int err = ALC10.alcGetError(device.device); + if (err != ALC10.ALC_NO_ERROR) + throw new OpenALException(ALC10.alcGetString(AL.getDevice().device, err)); + } + + /** + * Checks for any AL errors and throws an unchecked exception on errors + */ + public static void checkALError() { + int err = AL10.alGetError(); + if (err != AL10.AL_NO_ERROR) + throw new OpenALException(err); + } + + /** + * Checks for a valid device + * @param device ALCdevice to check the validity of + */ + public static void checkALCValidDevice(ALCdevice device) { + if(!device.isValid()) { + throw new OpenALException("Invalid device: " + device); + } + } + + /** + * Checks for a valid context + * @param context ALCcontext to check the validity of + */ + public static void checkALCValidContext(ALCcontext context) { + if(!context.isValid()) { + throw new OpenALException("Invalid context: " + context); + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/openal/package-info.java b/LWJGL-Boat/src/main/java/org/lwjgl/openal/package-info.java new file mode 100644 index 000000000..fcb1c3368 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/openal/package-info.java @@ -0,0 +1,21 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ + +/** + * Contains bindings to the OpenAL cross-platform 3D audio API. + * + *

    LWJGL comes with a software OpenAL implementation, OpenAL Soft.

    + * + *

    OpenAL Soft can be dynamically configured with environment variables. A + * very useful option for debugging is {@code ALSOFT_LOGLEVEL}; it can be set to values 0 through 4, with higher values producing more information.

    + * + *

    In addition to standard OpenAL features, OpenAL Soft supports HRTF, + * Ambisonics and 3D7.1. + * Documentation for these features is available in the OpenAL Soft repository.

    + */ +@org.lwjgl.system.NonnullDefault +package org.lwjgl.openal; + diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDBlendMinmaxFactor.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDBlendMinmaxFactor.java new file mode 100644 index 000000000..fa2f8611b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDBlendMinmaxFactor.java @@ -0,0 +1,31 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the AMD_blend_minmax_factor extension. + * + *

    The {@link EXTBlendMinmax EXT_blend_minmax} extension extended the GL's blending functionality to allow the blending equation to be specified by the application. That + * extension introduced the {@link EXTBlendMinmax#GL_MIN_EXT MIN_EXT} and {@link EXTBlendMinmax#GL_MAX_EXT MAX_EXT} blend equations, which caused the result of the blend equation to become the minimum or maximum of the + * source color and destination color, respectively.

    + * + *

    The {@link EXTBlendMinmax#GL_MIN_EXT MIN_EXT} and {@link EXTBlendMinmax#GL_MAX_EXT MAX_EXT} blend equations, however, do not include the source or destination blend factors in the arguments to the min and max + * functions. This extension provides two new blend equations that produce the minimum or maximum of the products of the source color and source factor, + * and the destination color and destination factor.

    + */ +public final class AMDBlendMinmaxFactor { + + /** + * Accepted by the {@code mode} parameter of BlendEquation and BlendEquationi, and by the {@code modeRGB} and {@code modeAlpha} parameters of + * BlendEquationSeparate and BlendEquationSeparatei. + */ + public static final int + GL_FACTOR_MIN_AMD = 0x901C, + GL_FACTOR_MAX_AMD = 0x901D; + + private AMDBlendMinmaxFactor() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDebugOutput.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDebugOutput.java new file mode 100644 index 000000000..022281428 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDebugOutput.java @@ -0,0 +1,335 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the AMD_debug_output extension. + * + *

    This extension allows the GL to notify applications when various debug events occur in contexts that have been created with the debug flag, as provided + * by {@link WGLARBCreateContext WGL_ARB_create_context} and {@link GLXARBCreateContext GLX_ARB_create_context}.

    + * + *

    These events are represented in the form of enumerable messages with an included human-readable translation. Examples of debug events include incorrect + * use of the GL, warnings of undefined behavior, and performance warnings.

    + * + *

    A message is uniquely identified by a category and an implementation-dependent ID within that category. Message categories are general and are used to + * organize large groups of similar messages together. Examples of categories include GL errors, performance warnings, and deprecated functionality + * warnings. Each message is also assigned a severity level that denotes roughly how "important" that message is in comparison to other messages across all + * categories. For example, notification of a GL error would have a higher severity than a performance warning due to redundant state changes.

    + * + *

    Messages are communicated to the application through an application-defined callback function that is called by the GL implementation on each debug + * message. The motivation for the callback routine is to free application developers from actively having to query whether any GL error or other + * debuggable event has happened after each call to a GL function. With a callback, developers can keep their code free of debug checks, and only have to + * react to messages as they occur. In order to support indirect rendering, a message log is also provided that stores copies of recent messages until they + * are actively queried.

    + * + *

    To control the volume of debug output, messages can be disabled either individually by ID, or entire groups of messages can be turned off based on + * category or severity.

    + * + *

    The only requirement on the minimum quantity and type of messages that implementations of this extension must support is that a message must be sent + * notifying the application whenever any GL error occurs. Any further messages are left to the implementation. Implementations do not have to output + * messages from all categories listed by this extension in order to support this extension, and new categories can be added by other extensions.

    + * + *

    This extension places no restrictions or requirements on any additional functionality provided by the debug context flag through other extensions.

    + * + *

    Requires {@link WGLARBCreateContext WGL_ARB_create_context} or {@link GLXARBCreateContext GLX_ARB_create_context}.

    + */ +public class AMDDebugOutput { + + static { GL.initialize(); } + + /** Tokens accepted by GetIntegerv. */ + public static final int + GL_MAX_DEBUG_MESSAGE_LENGTH_AMD = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES_AMD = 0x9144, + GL_DEBUG_LOGGED_MESSAGES_AMD = 0x9145; + + /** + * Tokens accepted by {@link #glDebugMessageEnableAMD DebugMessageEnableAMD}, {@link #glGetDebugMessageLogAMD GetDebugMessageLogAMD}, {@link #glDebugMessageInsertAMD DebugMessageInsertAMD}, and {@code DEBUGPROCAMD} callback function for + * {@code severity}. + */ + public static final int + GL_DEBUG_SEVERITY_HIGH_AMD = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM_AMD = 0x9147, + GL_DEBUG_SEVERITY_LOW_AMD = 0x9148; + + /** Tokens accepted by {@link #glDebugMessageEnableAMD DebugMessageEnableAMD}, {@link #glGetDebugMessageLogAMD GetDebugMessageLogAMD}, and {@code DEBUGPROCAMD} callback function for {@code category}. */ + public static final int + GL_DEBUG_CATEGORY_API_ERROR_AMD = 0x9149, + GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD = 0x914A, + GL_DEBUG_CATEGORY_DEPRECATION_AMD = 0x914B, + GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD = 0x914C, + GL_DEBUG_CATEGORY_PERFORMANCE_AMD = 0x914D, + GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD = 0x914E, + GL_DEBUG_CATEGORY_APPLICATION_AMD = 0x914F, + GL_DEBUG_CATEGORY_OTHER_AMD = 0x9150; + + protected AMDDebugOutput() { + throw new UnsupportedOperationException(); + } + + // --- [ glDebugMessageEnableAMD ] --- + + /** + * Unsafe version of: {@link #glDebugMessageEnableAMD DebugMessageEnableAMD} + * + * @param count the number of values in the {@code ids} array + */ + public static native void nglDebugMessageEnableAMD(int category, int severity, int count, long ids, boolean enabled); + + /** + * Allows disabling or enabling generation of subsets of messages. If {@code enabled} is {@link GL11#GL_TRUE TRUE}, the referenced subset of messages is enabled. If + * {@link GL11#GL_FALSE FALSE}, then those messages are disabled. This command can reference different subsets of messages by varying its parameter values in the following + * ways: + * + *
      + *
    1. To reference all messages, let {@code category}, {@code severity}, and {@code count} all be zero. The value of {@code ids} is ignored in this case.
    2. + *
    3. To reference all messages across all categories with a specific severity level, let {@code category} and {@code count} be zero and let + * {@code severity} identify the severity level. The value of {@code ids} is ignored in this case.
    4. + *
    5. To reference all messages within a single category, let {@code category} identify the referenced category and let {@code severity} and {@code count} + * be zero. The value of {@code ids} is ignored in this case.
    6. + *
    7. To reference all messages within a single category and at a specific severity level, let {@code category} identify the category and {@code severity} + * identify the severity level, and let {@code count} be zero. The value of {@code ids} is ignored in this case.
    8. + *
    9. To reference specific messages by ID within a single category, let {@code category} identify the category, let {@code severity} be zero, let + * {@code count} be greater than zero and let {@code ids} identify the IDs of {@code count} messages within the identified category. Operations on + * message IDs that are not valid within the category are silently ignored.
    10. + *
    + * + *

    In all of the above cases, if {@code category} is non-zero and specifies an invalid category, the error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated. Similarly if + * {@code severity} is non-zero and is an invalid severity level, the error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated. If {@code count} is less than zero, the error + * {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated. If the parameters do not fall into one of the cases defined above, the error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated. The error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if this command is called in a non-debug context.

    + * + *

    Although messages are grouped into categories and severities, and entire groups of messages can be turned off with a single call, there is no explicit + * per-category or per-severity enabled state. Instead the enabled state is stored individually for each message. There is no difference between disabling + * a category of messages with a single call, and enumerating all messages of that category and individually disabling each of them by their ID.

    + * + *

    All messages of severity level {@link #GL_DEBUG_SEVERITY_MEDIUM_AMD DEBUG_SEVERITY_MEDIUM_AMD} and {@link #GL_DEBUG_SEVERITY_HIGH_AMD DEBUG_SEVERITY_HIGH_AMD} in all categories are initially enabled, and all messages at + * {@link #GL_DEBUG_SEVERITY_LOW_AMD DEBUG_SEVERITY_LOW_AMD} are initially disabled.

    + * + * @param category the message category. One of:
    {@link #GL_DEBUG_CATEGORY_API_ERROR_AMD DEBUG_CATEGORY_API_ERROR_AMD}{@link #GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD DEBUG_CATEGORY_WINDOW_SYSTEM_AMD}
    {@link #GL_DEBUG_CATEGORY_DEPRECATION_AMD DEBUG_CATEGORY_DEPRECATION_AMD}{@link #GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD}
    {@link #GL_DEBUG_CATEGORY_PERFORMANCE_AMD DEBUG_CATEGORY_PERFORMANCE_AMD}{@link #GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD DEBUG_CATEGORY_SHADER_COMPILER_AMD}
    {@link #GL_DEBUG_CATEGORY_APPLICATION_AMD DEBUG_CATEGORY_APPLICATION_AMD}{@link #GL_DEBUG_CATEGORY_OTHER_AMD DEBUG_CATEGORY_OTHER_AMD}
    + * @param severity the message severity. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH_AMD DEBUG_SEVERITY_HIGH_AMD}{@link #GL_DEBUG_SEVERITY_MEDIUM_AMD DEBUG_SEVERITY_MEDIUM_AMD}{@link #GL_DEBUG_SEVERITY_LOW_AMD DEBUG_SEVERITY_LOW_AMD}
    + * @param ids an array of message ids + * @param enabled whether to enable or disable the referenced subset of messages + */ + public static void glDebugMessageEnableAMD(@NativeType("GLenum") int category, @NativeType("GLenum") int severity, @Nullable @NativeType("GLuint const *") IntBuffer ids, @NativeType("GLboolean") boolean enabled) { + nglDebugMessageEnableAMD(category, severity, remainingSafe(ids), memAddressSafe(ids), enabled); + } + + /** + * Allows disabling or enabling generation of subsets of messages. If {@code enabled} is {@link GL11#GL_TRUE TRUE}, the referenced subset of messages is enabled. If + * {@link GL11#GL_FALSE FALSE}, then those messages are disabled. This command can reference different subsets of messages by varying its parameter values in the following + * ways: + * + *
      + *
    1. To reference all messages, let {@code category}, {@code severity}, and {@code count} all be zero. The value of {@code ids} is ignored in this case.
    2. + *
    3. To reference all messages across all categories with a specific severity level, let {@code category} and {@code count} be zero and let + * {@code severity} identify the severity level. The value of {@code ids} is ignored in this case.
    4. + *
    5. To reference all messages within a single category, let {@code category} identify the referenced category and let {@code severity} and {@code count} + * be zero. The value of {@code ids} is ignored in this case.
    6. + *
    7. To reference all messages within a single category and at a specific severity level, let {@code category} identify the category and {@code severity} + * identify the severity level, and let {@code count} be zero. The value of {@code ids} is ignored in this case.
    8. + *
    9. To reference specific messages by ID within a single category, let {@code category} identify the category, let {@code severity} be zero, let + * {@code count} be greater than zero and let {@code ids} identify the IDs of {@code count} messages within the identified category. Operations on + * message IDs that are not valid within the category are silently ignored.
    10. + *
    + * + *

    In all of the above cases, if {@code category} is non-zero and specifies an invalid category, the error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated. Similarly if + * {@code severity} is non-zero and is an invalid severity level, the error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated. If {@code count} is less than zero, the error + * {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated. If the parameters do not fall into one of the cases defined above, the error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated. The error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if this command is called in a non-debug context.

    + * + *

    Although messages are grouped into categories and severities, and entire groups of messages can be turned off with a single call, there is no explicit + * per-category or per-severity enabled state. Instead the enabled state is stored individually for each message. There is no difference between disabling + * a category of messages with a single call, and enumerating all messages of that category and individually disabling each of them by their ID.

    + * + *

    All messages of severity level {@link #GL_DEBUG_SEVERITY_MEDIUM_AMD DEBUG_SEVERITY_MEDIUM_AMD} and {@link #GL_DEBUG_SEVERITY_HIGH_AMD DEBUG_SEVERITY_HIGH_AMD} in all categories are initially enabled, and all messages at + * {@link #GL_DEBUG_SEVERITY_LOW_AMD DEBUG_SEVERITY_LOW_AMD} are initially disabled.

    + * + * @param category the message category. One of:
    {@link #GL_DEBUG_CATEGORY_API_ERROR_AMD DEBUG_CATEGORY_API_ERROR_AMD}{@link #GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD DEBUG_CATEGORY_WINDOW_SYSTEM_AMD}
    {@link #GL_DEBUG_CATEGORY_DEPRECATION_AMD DEBUG_CATEGORY_DEPRECATION_AMD}{@link #GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD}
    {@link #GL_DEBUG_CATEGORY_PERFORMANCE_AMD DEBUG_CATEGORY_PERFORMANCE_AMD}{@link #GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD DEBUG_CATEGORY_SHADER_COMPILER_AMD}
    {@link #GL_DEBUG_CATEGORY_APPLICATION_AMD DEBUG_CATEGORY_APPLICATION_AMD}{@link #GL_DEBUG_CATEGORY_OTHER_AMD DEBUG_CATEGORY_OTHER_AMD}
    + * @param severity the message severity. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH_AMD DEBUG_SEVERITY_HIGH_AMD}{@link #GL_DEBUG_SEVERITY_MEDIUM_AMD DEBUG_SEVERITY_MEDIUM_AMD}{@link #GL_DEBUG_SEVERITY_LOW_AMD DEBUG_SEVERITY_LOW_AMD}
    + * @param enabled whether to enable or disable the referenced subset of messages + */ + public static void glDebugMessageEnableAMD(@NativeType("GLenum") int category, @NativeType("GLenum") int severity, @NativeType("GLuint const *") int id, @NativeType("GLboolean") boolean enabled) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.ints(id); + nglDebugMessageEnableAMD(category, severity, 1, memAddress(ids), enabled); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDebugMessageInsertAMD ] --- + + /** + * Unsafe version of: {@link #glDebugMessageInsertAMD DebugMessageInsertAMD} + * + * @param length the number of character in the message + */ + public static native void nglDebugMessageInsertAMD(int category, int severity, int id, int length, long buf); + + /** + * Injects an application-supplied message into the debug message stream. + * + *

    The value of {@code id} specifies the ID for the message and {@code severity} indicates its severity level as defined by the application. If + * {@code severity} is not a valid severity level, the error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} will be generated. The value of {@code category} must be + * {@link #GL_DEBUG_CATEGORY_APPLICATION_AMD DEBUG_CATEGORY_APPLICATION_AMD}, or the error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} will be generated. The string {@code buf} contains the string representation of the + * message. The parameter {@code length} contains the size of the message's string representation, excluding the null-terminator. If {@code length} is + * zero, then its value is derived from the string-length of {@code buf} and {@code buf} must contain a null-terminated string. The error + * {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated if {@code length} is less than zero or its derived value is larger than or equal to {@link #GL_MAX_DEBUG_MESSAGE_LENGTH_AMD MAX_DEBUG_MESSAGE_LENGTH_AMD}. + * The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} will be generated if this function is called in a non-debug context.

    + * + * @param category the message category. Must be:
    {@link #GL_DEBUG_CATEGORY_APPLICATION_AMD DEBUG_CATEGORY_APPLICATION_AMD}
    + * @param severity the message severity. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH_AMD DEBUG_SEVERITY_HIGH_AMD}{@link #GL_DEBUG_SEVERITY_MEDIUM_AMD DEBUG_SEVERITY_MEDIUM_AMD}{@link #GL_DEBUG_SEVERITY_LOW_AMD DEBUG_SEVERITY_LOW_AMD}
    + * @param id the message id + * @param buf the message characters + */ + public static void glDebugMessageInsertAMD(@NativeType("GLenum") int category, @NativeType("GLenum") int severity, @NativeType("GLuint") int id, @NativeType("GLchar const *") ByteBuffer buf) { + nglDebugMessageInsertAMD(category, severity, id, buf.remaining(), memAddress(buf)); + } + + /** + * Injects an application-supplied message into the debug message stream. + * + *

    The value of {@code id} specifies the ID for the message and {@code severity} indicates its severity level as defined by the application. If + * {@code severity} is not a valid severity level, the error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} will be generated. The value of {@code category} must be + * {@link #GL_DEBUG_CATEGORY_APPLICATION_AMD DEBUG_CATEGORY_APPLICATION_AMD}, or the error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} will be generated. The string {@code buf} contains the string representation of the + * message. The parameter {@code length} contains the size of the message's string representation, excluding the null-terminator. If {@code length} is + * zero, then its value is derived from the string-length of {@code buf} and {@code buf} must contain a null-terminated string. The error + * {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated if {@code length} is less than zero or its derived value is larger than or equal to {@link #GL_MAX_DEBUG_MESSAGE_LENGTH_AMD MAX_DEBUG_MESSAGE_LENGTH_AMD}. + * The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} will be generated if this function is called in a non-debug context.

    + * + * @param category the message category. Must be:
    {@link #GL_DEBUG_CATEGORY_APPLICATION_AMD DEBUG_CATEGORY_APPLICATION_AMD}
    + * @param severity the message severity. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH_AMD DEBUG_SEVERITY_HIGH_AMD}{@link #GL_DEBUG_SEVERITY_MEDIUM_AMD DEBUG_SEVERITY_MEDIUM_AMD}{@link #GL_DEBUG_SEVERITY_LOW_AMD DEBUG_SEVERITY_LOW_AMD}
    + * @param id the message id + * @param buf the message characters + */ + public static void glDebugMessageInsertAMD(@NativeType("GLenum") int category, @NativeType("GLenum") int severity, @NativeType("GLuint") int id, @NativeType("GLchar const *") CharSequence buf) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int bufEncodedLength = stack.nUTF8(buf, false); + long bufEncoded = stack.getPointerAddress(); + nglDebugMessageInsertAMD(category, severity, id, bufEncodedLength, bufEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDebugMessageCallbackAMD ] --- + + /** Unsafe version of: {@link #glDebugMessageCallbackAMD DebugMessageCallbackAMD} */ + public static native void nglDebugMessageCallbackAMD(long callback, long userParam); + + /** + * Specifies a callback to receive debugging messages from the GL. + * + *

    With {@code callback} storing the address of the callback function. This function's signature must follow the type definition of DEBUGPROCAMD, and its + * calling convention must be the same as the calling convention of GL functions. Anything else will result in undefined behavior. Only one debug callback + * can be specified for the current context, and further calls overwrite the previous callback. Specifying zero as the value of {@code callback} clears the + * current callback and disables message output through callbacks. Applications can specify user-specified data through the pointer {@code userParam}. The + * context will store this pointer and will include it as one of the parameters of each call to the callback function. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} + * will be generated if this function is called for contexts created without the debug flag.

    + * + *

    If the application has specified a callback function in a debug context, the implementation will call that function whenever any unfiltered message is + * generated. The ID, category, and severity of the message are specified by the callback parameters {@code id}, {@code category} and {@code severity}, + * respectively. The string representation of the message is stored in {@code message} and its length (excluding the null-terminator) is stored in + * {@code length}. The parameter {@code userParam} is the user-specified value that was passed when calling DebugMessageCallbackAMD. The memory for + * {@code message} is allocated, owned and released by the implementation, and should only be considered valid for the duration of the callback function + * call. While it is allowed to concurrently use multiple debug contexts with the same debug callback function, note that it is the application's + * responsibility to ensure that any work that occurs inside the debug callback function is thread-safe. Furthermore, calling any GL or window layer + * function from within the callback function results in undefined behavior.

    + * + *

    If no callback is set, then messages are instead stored in an internal message log up to some maximum number of strings as defined by the + * implementation-dependent constant {@link #GL_MAX_DEBUG_LOGGED_MESSAGES_AMD MAX_DEBUG_LOGGED_MESSAGES_AMD}. Each context stores its own message log and will only store messages generated by + * commands operating in that context. If the message log is full, then the oldest messages will be removed from the log to make room for newer ones. The + * application can query the number of messages currently in the log by obtaining the value of {@link #GL_DEBUG_LOGGED_MESSAGES_AMD DEBUG_LOGGED_MESSAGES_AMD}.

    + * + * @param callback a callback function that will be called when a debug message is generated + * @param userParam a user supplied pointer that will be passed on each invocation of {@code callback} + */ + public static void glDebugMessageCallbackAMD(@Nullable @NativeType("GLDEBUGPROCAMD") GLDebugMessageAMDCallbackI callback, @NativeType("void *") long userParam) { + nglDebugMessageCallbackAMD(memAddressSafe(callback), userParam); + } + + // --- [ glGetDebugMessageLogAMD ] --- + + /** + * Unsafe version of: {@link #glGetDebugMessageLogAMD GetDebugMessageLogAMD} + * + * @param bufsize the maximum number of characters that can be written in the {@code message} array + */ + public static native int nglGetDebugMessageLogAMD(int count, int bufsize, long categories, long severities, long ids, long lengths, long messageLog); + + /** + * Retrieves messages from the debug message log. + * + *

    This function will fetch as many messages as possible from the message log up to {@code count} in order from oldest to newest, and will return the + * number of messages fetched. Those messages that were fetched will be removed from the log. The value of {@code count} must be greater than zero and less + * than {@link #GL_MAX_DEBUG_LOGGED_MESSAGES_AMD MAX_DEBUG_LOGGED_MESSAGES_AMD} or otherwise the error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated. The value of {@code count} can be larger than the + * actual number of messages currently in the log. If {@code messageLog} is not a null pointer, then the string representations of all fetched messages + * will be stored in the buffer {@code messageLog} and will be separated by null-terminators. The maximum size of the buffer (including all + * null-terminators) is denoted by {@code bufSize}, and strings of messages within {@code count} that do not fit in the buffer will not be fetched. If + * {@code bufSize} is less than zero, the error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated. If {@code messageLog} is a null pointer, then the value of + * {@code bufSize} is ignored. The categories, severity levels, IDs, and string representation lengths of all (up to {@code count}) removed messages will + * be stored in the arrays {@code categories}, {@code severities}, {@code ids}, and {@code lengths}, respectively. The counts stored in the array + * {@code lengths} include the null-terminator of each string. Any and all of the output arrays, including {@code messageLog}, are optional, and no data is + * returned for those arrays that are specified with a null pointer. To simply delete up to {@code count} messages from the message log and ignoring, the + * application can call the function with null pointers for all output arrays. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} will be generated by GetDebugMessageLogAMD + * if it is called in a non-debug context.

    + * + * @param count the number of debug messages to retrieve from the log + * @param categories an array of variables to receive the categories of the retrieved messages + * @param severities an array of variables to receive the severities of the retrieved messages + * @param ids an array of variables to receive the ids of the retrieved messages + * @param lengths an array of variables to receive the lengths of the retrieved messages + * @param messageLog an array of characters that will receive the messages + */ + @NativeType("GLuint") + public static int glGetDebugMessageLogAMD(@NativeType("GLuint") int count, @Nullable @NativeType("GLenum *") IntBuffer categories, @Nullable @NativeType("GLenum *") IntBuffer severities, @Nullable @NativeType("GLuint *") IntBuffer ids, @Nullable @NativeType("GLsizei *") IntBuffer lengths, @Nullable @NativeType("GLchar *") ByteBuffer messageLog) { + if (CHECKS) { + checkSafe(categories, count); + checkSafe(severities, count); + checkSafe(ids, count); + checkSafe(lengths, count); + } + return nglGetDebugMessageLogAMD(count, remainingSafe(messageLog), memAddressSafe(categories), memAddressSafe(severities), memAddressSafe(ids), memAddressSafe(lengths), memAddressSafe(messageLog)); + } + + /** Array version of: {@link #glDebugMessageEnableAMD DebugMessageEnableAMD} */ + public static void glDebugMessageEnableAMD(@NativeType("GLenum") int category, @NativeType("GLenum") int severity, @Nullable @NativeType("GLuint const *") int[] ids, @NativeType("GLboolean") boolean enabled) { + long __functionAddress = GL.getICD().glDebugMessageEnableAMD; + if (CHECKS) { + check(__functionAddress); + } + callPV(category, severity, lengthSafe(ids), ids, enabled, __functionAddress); + } + + /** Array version of: {@link #glGetDebugMessageLogAMD GetDebugMessageLogAMD} */ + @NativeType("GLuint") + public static int glGetDebugMessageLogAMD(@NativeType("GLuint") int count, @Nullable @NativeType("GLenum *") int[] categories, @Nullable @NativeType("GLenum *") int[] severities, @Nullable @NativeType("GLuint *") int[] ids, @Nullable @NativeType("GLsizei *") int[] lengths, @Nullable @NativeType("GLchar *") ByteBuffer messageLog) { + long __functionAddress = GL.getICD().glGetDebugMessageLogAMD; + if (CHECKS) { + check(__functionAddress); + checkSafe(categories, count); + checkSafe(severities, count); + checkSafe(ids, count); + checkSafe(lengths, count); + } + return callPPPPPI(count, remainingSafe(messageLog), categories, severities, ids, lengths, memAddressSafe(messageLog), __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDepthClampSeparate.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDepthClampSeparate.java new file mode 100644 index 000000000..d9481375d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDepthClampSeparate.java @@ -0,0 +1,29 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the AMD_depth_clamp_separate extension. + * + *

    The extension {@link ARBDepthClamp ARB_depth_clamp} introduced the ability to control the clamping of the depth value for both the near and far plane. One limitation + * is that the control was for both planes at the same time; some applications can benefit from having clamping enabled for only one of the two planes, in + * order to save fillrate for the other plane by clipping the geometry.

    + * + *

    This extension provides exactly such functionality.

    + */ +public final class AMDDepthClampSeparate { + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int + GL_DEPTH_CLAMP_NEAR_AMD = 0x901E, + GL_DEPTH_CLAMP_FAR_AMD = 0x901F; + + private AMDDepthClampSeparate() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDrawBuffersBlend.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDrawBuffersBlend.java new file mode 100644 index 000000000..e5c631e7c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDDrawBuffersBlend.java @@ -0,0 +1,45 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the AMD_draw_buffers_blend extension. + * + *

    This extension builds upon the ARB_draw_buffers and EXT_draw_buffers2 extensions. In ARB_draw_buffers (part of OpenGL 2.0), separate values could be + * written to each color buffer. This was further enhanced by EXT_draw_buffers2 by adding in the ability to enable blending and to set color write masks + * independently per color output.

    + * + *

    This extension provides the ability to set individual blend equations and blend functions for each color output.

    + * + *

    Requires {@link GL20 OpenGL 2.0} and {@link EXTDrawBuffers2 EXT_draw_buffers2}.

    + */ +public class AMDDrawBuffersBlend { + + static { GL.initialize(); } + + protected AMDDrawBuffersBlend() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendFuncIndexedAMD ] --- + + public static native void glBlendFuncIndexedAMD(@NativeType("GLuint") int buf, @NativeType("GLenum") int src, @NativeType("GLenum") int dst); + + // --- [ glBlendFuncSeparateIndexedAMD ] --- + + public static native void glBlendFuncSeparateIndexedAMD(@NativeType("GLuint") int buf, @NativeType("GLenum") int srcRGB, @NativeType("GLenum") int dstRGB, @NativeType("GLenum") int srcAlpha, @NativeType("GLenum") int dstAlpha); + + // --- [ glBlendEquationIndexedAMD ] --- + + public static native void glBlendEquationIndexedAMD(@NativeType("GLuint") int buf, @NativeType("GLenum") int mode); + + // --- [ glBlendEquationSeparateIndexedAMD ] --- + + public static native void glBlendEquationSeparateIndexedAMD(@NativeType("GLuint") int buf, @NativeType("GLenum") int modeRGB, @NativeType("GLenum") int modeAlpha); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDFramebufferMultisampleAdvanced.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDFramebufferMultisampleAdvanced.java new file mode 100644 index 000000000..eff1cfb8d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDFramebufferMultisampleAdvanced.java @@ -0,0 +1,54 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the AMD_framebuffer_multisample_advanced extension. + * + *

    This extension extends {@link ARBFramebufferObject ARB_framebuffer_object} by allowing compromises between image quality and memory footprint of multisample antialiasing.

    + * + *

    {@code ARB_framebuffer_object} introduced {@link GL30C#glRenderbufferStorageMultisample RenderbufferStorageMultisample} as a method of defining the parameters for a multisample render buffer. + * This function takes a {@code samples} parameter that has strict requirements on behavior such that no compromises in the final image quality are + * allowed. Additionally, {@code ARB_framebuffer_object} requires that all framebuffer attachments have the same number of samples.

    + * + *

    This extension extends {@code ARB_framebuffer_object} by providing a new function, {@link #glRenderbufferStorageMultisampleAdvancedAMD RenderbufferStorageMultisampleAdvancedAMD}, that distinguishes + * between samples and storage samples for color renderbuffers where the number of storage samples can be less than the number of samples. This extension + * also allows non-matching sample counts between color and depth/stencil renderbuffers.

    + * + *

    This extension does not require any specific combination of sample counts to be supported.

    + * + *

    Requires {@link ARBFramebufferObject ARB_framebuffer_object}.

    + */ +public class AMDFramebufferMultisampleAdvanced { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of {@link GL30C#glGetRenderbufferParameteriv GetRenderbufferParameteriv}. */ + public static final int GL_RENDERBUFFER_STORAGE_SAMPLES_AMD = 0x91B2; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, GetDoublev. */ + public static final int + GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD = 0x91B3, + GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD = 0x91B4, + GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD = 0x91B5, + GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD = 0x91B6, + GL_SUPPORTED_MULTISAMPLE_MODES_AMD = 0x91B7; + + protected AMDFramebufferMultisampleAdvanced() { + throw new UnsupportedOperationException(); + } + + // --- [ glRenderbufferStorageMultisampleAdvancedAMD ] --- + + public static native void glRenderbufferStorageMultisampleAdvancedAMD(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLsizei") int storageSamples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glNamedRenderbufferStorageMultisampleAdvancedAMD ] --- + + public static native void glNamedRenderbufferStorageMultisampleAdvancedAMD(@NativeType("GLuint") int renderbuffer, @NativeType("GLsizei") int samples, @NativeType("GLsizei") int storageSamples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderHalfFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderHalfFloat.java new file mode 100644 index 000000000..2a52ee3cd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderHalfFloat.java @@ -0,0 +1,44 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the AMD_gpu_shader_half_float extension. + * + *

    This extension was developed based on the {@link NVGPUShader5 NV_gpu_shader5} extension to allow implementations supporting half float in shader and expose the + * feature without the additional requirements that are present in {@code NV_gpu_shader5}.

    + * + *

    The extension introduces the following features for all shader types:

    + * + *
      + *
    • support for half float scalar, vector and matrix data types in shader;
    • + *
    • new built-in functions to pack and unpack half float types into a 32-bit integer vector;
    • + *
    • half float support for all existing single float built-in functions, including angle functions, exponential functions, common functions, geometric + * functions, matrix functions and etc.;
    • + *
    + * + *

    This extension is designed to be a functional superset of the half-precision floating-point support from NV_gpu_shader5 and to keep source code + * compatible with that, thus the new procedures, functions, and tokens are identical to those found in that extension.

    + * + *

    Requires {@link GL40 OpenGL 4.0} and GLSL 4.00.

    + */ +public final class AMDGPUShaderHalfFloat { + + /** Returned by the {@code type} parameter of GetActiveAttrib, GetActiveUniform, and GetTransformFeedbackVarying. */ + public static final int + GL_FLOAT16_MAT2_AMD = 0x91C5, + GL_FLOAT16_MAT3_AMD = 0x91C6, + GL_FLOAT16_MAT4_AMD = 0x91C7, + GL_FLOAT16_MAT2x3_AMD = 0x91C8, + GL_FLOAT16_MAT2x4_AMD = 0x91C9, + GL_FLOAT16_MAT3x2_AMD = 0x91CA, + GL_FLOAT16_MAT3x4_AMD = 0x91CB, + GL_FLOAT16_MAT4x2_AMD = 0x91CC, + GL_FLOAT16_MAT4x3_AMD = 0x91CD; + + private AMDGPUShaderHalfFloat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderHalfFloatFetch.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderHalfFloatFetch.java new file mode 100644 index 000000000..7e3415442 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderHalfFloatFetch.java @@ -0,0 +1,52 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the AMD_gpu_shader_half_float_fetch extension. + * + *

    This extension was developed based on the {@code AMD_gpu_shader_half_float} extension to allow implementations supporting half-precision floating-point + * both in shader texture functions and in shader image memory functions.

    + * + *

    Requires {@link GL40 OpenGL 4.0}, GLSL 4.00 and {@link AMDGPUShaderHalfFloat AMD_gpu_shader_half_float}.

    + */ +public final class AMDGPUShaderHalfFloatFetch { + + /** Returned by the {@code type} parameter of {@link GL20C#glGetActiveUniform GetActiveUniform} and {@link GL43C#glGetProgramResourceiv GetProgramResourceiv}. */ + public static final int + GL_FLOAT16_SAMPLER_1D_AMD = 0x91CE, + GL_FLOAT16_SAMPLER_2D_AMD = 0x91CF, + GL_FLOAT16_SAMPLER_3D_AMD = 0x91D0, + GL_FLOAT16_SAMPLER_CUBE_AMD = 0x91D1, + GL_FLOAT16_SAMPLER_2D_RECT_AMD = 0x91D2, + GL_FLOAT16_SAMPLER_1D_ARRAY_AMD = 0x91D3, + GL_FLOAT16_SAMPLER_2D_ARRAY_AMD = 0x91D4, + GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD = 0x91D5, + GL_FLOAT16_SAMPLER_BUFFER_AMD = 0x91D6, + GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD = 0x91D7, + GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD = 0x91D8, + GL_FLOAT16_SAMPLER_1D_SHADOW_AMD = 0x91D9, + GL_FLOAT16_SAMPLER_2D_SHADOW_AMD = 0x91DA, + GL_FLOAT16_SAMPLER_2D_RECT_SHADOW_AMD = 0x91DB, + GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD = 0x91DC, + GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD = 0x91DD, + GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD = 0x91DE, + GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD = 0x91DF, + GL_FLOAT16_IMAGE_1D_AMD = 0x91E0, + GL_FLOAT16_IMAGE_2D_AMD = 0x91E1, + GL_FLOAT16_IMAGE_3D_AMD = 0x91E2, + GL_FLOAT16_IMAGE_2D_RECT_AMD = 0x91E3, + GL_FLOAT16_IMAGE_CUBE_AMD = 0x91E4, + GL_FLOAT16_IMAGE_1D_ARRAY_AMD = 0x91E5, + GL_FLOAT16_IMAGE_2D_ARRAY_AMD = 0x91E6, + GL_FLOAT16_IMAGE_CUBE_MAP_ARRAY_AMD = 0x91E7, + GL_FLOAT16_IMAGE_BUFFER_AMD = 0x91E8, + GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD = 0x91E9, + GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD = 0x91EA; + + private AMDGPUShaderHalfFloatFetch() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderInt64.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderInt64.java new file mode 100644 index 000000000..a42c2c5cc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDGPUShaderInt64.java @@ -0,0 +1,449 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the AMD_gpu_shader_int64 extension. + * + *

    This extension was developed based on the NV_gpu_shader5 extension to allow implementations supporting 64-bit integers to expose the feature without + * the additional requirements that are present in NV_gpu_shader5.

    + * + *

    The extension introduces the following features for all shader types:

    + * + *
      + *
    • support for 64-bit scalar and vector integer data types, including uniform API, uniform buffer object, transform feedback, and shader input and + * output support;
    • + *
    • new built-in functions to pack and unpack 64-bit integer types into a two-component 32-bit integer vector;
    • + *
    • new built-in functions to convert double-precision floating-point values to or from their 64-bit integer bit encodings;
    • + *
    • vector relational functions supporting comparisons of vectors of 64-bit integer types; and
    • + *
    • common functions abs, sign, min, max, clamp, and mix supporting arguments of 64-bit integer types.
    • + *
    + * + *

    This extension is designed to be a functional superset of the 64-bit integer support introduced by NV_gpu_shader5 and to be source code compatible with + * that, thus the new procedures, functions, and tokens are identical to those found in that extension.

    + * + *

    Requires {@link GL40 OpenGL 4.0} and GLSL 4.00.

    + */ +public class AMDGPUShaderInt64 { + + static { GL.initialize(); } + + /** Returned by the {@code type} parameter of GetActiveAttrib, GetActiveUniform, and GetTransformFeedbackVarying. */ + public static final int + GL_INT64_NV = 0x140E, + GL_UNSIGNED_INT64_NV = 0x140F, + GL_INT8_NV = 0x8FE0, + GL_INT8_VEC2_NV = 0x8FE1, + GL_INT8_VEC3_NV = 0x8FE2, + GL_INT8_VEC4_NV = 0x8FE3, + GL_INT16_NV = 0x8FE4, + GL_INT16_VEC2_NV = 0x8FE5, + GL_INT16_VEC3_NV = 0x8FE6, + GL_INT16_VEC4_NV = 0x8FE7, + GL_INT64_VEC2_NV = 0x8FE9, + GL_INT64_VEC3_NV = 0x8FEA, + GL_INT64_VEC4_NV = 0x8FEB, + GL_UNSIGNED_INT8_NV = 0x8FEC, + GL_UNSIGNED_INT8_VEC2_NV = 0x8FED, + GL_UNSIGNED_INT8_VEC3_NV = 0x8FEE, + GL_UNSIGNED_INT8_VEC4_NV = 0x8FEF, + GL_UNSIGNED_INT16_NV = 0x8FF0, + GL_UNSIGNED_INT16_VEC2_NV = 0x8FF1, + GL_UNSIGNED_INT16_VEC3_NV = 0x8FF2, + GL_UNSIGNED_INT16_VEC4_NV = 0x8FF3, + GL_UNSIGNED_INT64_VEC2_NV = 0x8FF5, + GL_UNSIGNED_INT64_VEC3_NV = 0x8FF6, + GL_UNSIGNED_INT64_VEC4_NV = 0x8FF7, + GL_FLOAT16_NV = 0x8FF8, + GL_FLOAT16_VEC2_NV = 0x8FF9, + GL_FLOAT16_VEC3_NV = 0x8FFA, + GL_FLOAT16_VEC4_NV = 0x8FFB; + + protected AMDGPUShaderInt64() { + throw new UnsupportedOperationException(); + } + + // --- [ glUniform1i64NV ] --- + + public static void glUniform1i64NV(@NativeType("GLint") int location, @NativeType("GLint64EXT") long x) { + NVGPUShader5.glUniform1i64NV(location, x); + } + + // --- [ glUniform2i64NV ] --- + + public static void glUniform2i64NV(@NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y) { + NVGPUShader5.glUniform2i64NV(location, x, y); + } + + // --- [ glUniform3i64NV ] --- + + public static void glUniform3i64NV(@NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y, @NativeType("GLint64EXT") long z) { + NVGPUShader5.glUniform3i64NV(location, x, y, z); + } + + // --- [ glUniform4i64NV ] --- + + public static void glUniform4i64NV(@NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y, @NativeType("GLint64EXT") long z, @NativeType("GLint64EXT") long w) { + NVGPUShader5.glUniform4i64NV(location, x, y, z, w); + } + + // --- [ glUniform1i64vNV ] --- + + public static void nglUniform1i64vNV(int location, int count, long value) { + NVGPUShader5.nglUniform1i64vNV(location, count, value); + } + + public static void glUniform1i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + NVGPUShader5.glUniform1i64vNV(location, value); + } + + // --- [ glUniform2i64vNV ] --- + + public static void nglUniform2i64vNV(int location, int count, long value) { + NVGPUShader5.nglUniform2i64vNV(location, count, value); + } + + public static void glUniform2i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + NVGPUShader5.glUniform2i64vNV(location, value); + } + + // --- [ glUniform3i64vNV ] --- + + public static void nglUniform3i64vNV(int location, int count, long value) { + NVGPUShader5.nglUniform3i64vNV(location, count, value); + } + + public static void glUniform3i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + NVGPUShader5.glUniform3i64vNV(location, value); + } + + // --- [ glUniform4i64vNV ] --- + + public static void nglUniform4i64vNV(int location, int count, long value) { + NVGPUShader5.nglUniform4i64vNV(location, count, value); + } + + public static void glUniform4i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + NVGPUShader5.glUniform4i64vNV(location, value); + } + + // --- [ glUniform1ui64NV ] --- + + public static void glUniform1ui64NV(@NativeType("GLint") int location, @NativeType("GLuint64EXT") long x) { + NVGPUShader5.glUniform1ui64NV(location, x); + } + + // --- [ glUniform2ui64NV ] --- + + public static void glUniform2ui64NV(@NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y) { + NVGPUShader5.glUniform2ui64NV(location, x, y); + } + + // --- [ glUniform3ui64NV ] --- + + public static void glUniform3ui64NV(@NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y, @NativeType("GLuint64EXT") long z) { + NVGPUShader5.glUniform3ui64NV(location, x, y, z); + } + + // --- [ glUniform4ui64NV ] --- + + public static void glUniform4ui64NV(@NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y, @NativeType("GLuint64EXT") long z, @NativeType("GLuint64EXT") long w) { + NVGPUShader5.glUniform4ui64NV(location, x, y, z, w); + } + + // --- [ glUniform1ui64vNV ] --- + + public static void nglUniform1ui64vNV(int location, int count, long value) { + NVGPUShader5.nglUniform1ui64vNV(location, count, value); + } + + public static void glUniform1ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + NVGPUShader5.glUniform1ui64vNV(location, value); + } + + // --- [ glUniform2ui64vNV ] --- + + public static void nglUniform2ui64vNV(int location, int count, long value) { + NVGPUShader5.nglUniform2ui64vNV(location, count, value); + } + + public static void glUniform2ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT *") LongBuffer value) { + NVGPUShader5.glUniform2ui64vNV(location, value); + } + + // --- [ glUniform3ui64vNV ] --- + + public static void nglUniform3ui64vNV(int location, int count, long value) { + NVGPUShader5.nglUniform3ui64vNV(location, count, value); + } + + public static void glUniform3ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + NVGPUShader5.glUniform3ui64vNV(location, value); + } + + // --- [ glUniform4ui64vNV ] --- + + public static void nglUniform4ui64vNV(int location, int count, long value) { + NVGPUShader5.nglUniform4ui64vNV(location, count, value); + } + + public static void glUniform4ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + NVGPUShader5.glUniform4ui64vNV(location, value); + } + + // --- [ glGetUniformi64vNV ] --- + + public static void nglGetUniformi64vNV(int program, int location, long params) { + NVGPUShader5.nglGetUniformi64vNV(program, location, params); + } + + public static void glGetUniformi64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT *") LongBuffer params) { + NVGPUShader5.glGetUniformi64vNV(program, location, params); + } + + @NativeType("void") + public static long glGetUniformi64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return NVGPUShader5.glGetUniformi64NV(program, location); + } + + // --- [ glGetUniformui64vNV ] --- + + public static void nglGetUniformui64vNV(int program, int location, long params) { + NVShaderBufferLoad.nglGetUniformui64vNV(program, location, params); + } + + public static void glGetUniformui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT *") LongBuffer params) { + NVShaderBufferLoad.glGetUniformui64vNV(program, location, params); + } + + @NativeType("void") + public static long glGetUniformui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return NVShaderBufferLoad.glGetUniformui64NV(program, location); + } + + // --- [ glProgramUniform1i64NV ] --- + + public static void glProgramUniform1i64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT") long x) { + NVGPUShader5.glProgramUniform1i64NV(program, location, x); + } + + // --- [ glProgramUniform2i64NV ] --- + + public static void glProgramUniform2i64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y) { + NVGPUShader5.glProgramUniform2i64NV(program, location, x, y); + } + + // --- [ glProgramUniform3i64NV ] --- + + public static void glProgramUniform3i64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y, @NativeType("GLint64EXT") long z) { + NVGPUShader5.glProgramUniform3i64NV(program, location, x, y, z); + } + + // --- [ glProgramUniform4i64NV ] --- + + public static void glProgramUniform4i64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y, @NativeType("GLint64EXT") long z, @NativeType("GLint64EXT") long w) { + NVGPUShader5.glProgramUniform4i64NV(program, location, x, y, z, w); + } + + // --- [ glProgramUniform1i64vNV ] --- + + public static void nglProgramUniform1i64vNV(int program, int location, int count, long value) { + NVGPUShader5.nglProgramUniform1i64vNV(program, location, count, value); + } + + public static void glProgramUniform1i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + NVGPUShader5.glProgramUniform1i64vNV(program, location, value); + } + + // --- [ glProgramUniform2i64vNV ] --- + + public static void nglProgramUniform2i64vNV(int program, int location, int count, long value) { + NVGPUShader5.nglProgramUniform2i64vNV(program, location, count, value); + } + + public static void glProgramUniform2i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + NVGPUShader5.glProgramUniform2i64vNV(program, location, value); + } + + // --- [ glProgramUniform3i64vNV ] --- + + public static void nglProgramUniform3i64vNV(int program, int location, int count, long value) { + NVGPUShader5.nglProgramUniform3i64vNV(program, location, count, value); + } + + public static void glProgramUniform3i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + NVGPUShader5.glProgramUniform3i64vNV(program, location, value); + } + + // --- [ glProgramUniform4i64vNV ] --- + + public static void nglProgramUniform4i64vNV(int program, int location, int count, long value) { + NVGPUShader5.nglProgramUniform4i64vNV(program, location, count, value); + } + + public static void glProgramUniform4i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + NVGPUShader5.glProgramUniform4i64vNV(program, location, value); + } + + // --- [ glProgramUniform1ui64NV ] --- + + public static void glProgramUniform1ui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT") long x) { + NVGPUShader5.glProgramUniform1ui64NV(program, location, x); + } + + // --- [ glProgramUniform2ui64NV ] --- + + public static void glProgramUniform2ui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y) { + NVGPUShader5.glProgramUniform2ui64NV(program, location, x, y); + } + + // --- [ glProgramUniform3ui64NV ] --- + + public static void glProgramUniform3ui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y, @NativeType("GLuint64EXT") long z) { + NVGPUShader5.glProgramUniform3ui64NV(program, location, x, y, z); + } + + // --- [ glProgramUniform4ui64NV ] --- + + public static void glProgramUniform4ui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y, @NativeType("GLuint64EXT") long z, @NativeType("GLuint64EXT") long w) { + NVGPUShader5.glProgramUniform4ui64NV(program, location, x, y, z, w); + } + + // --- [ glProgramUniform1ui64vNV ] --- + + public static void nglProgramUniform1ui64vNV(int program, int location, int count, long value) { + NVGPUShader5.nglProgramUniform1ui64vNV(program, location, count, value); + } + + public static void glProgramUniform1ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + NVGPUShader5.glProgramUniform1ui64vNV(program, location, value); + } + + // --- [ glProgramUniform2ui64vNV ] --- + + public static void nglProgramUniform2ui64vNV(int program, int location, int count, long value) { + NVGPUShader5.nglProgramUniform2ui64vNV(program, location, count, value); + } + + public static void glProgramUniform2ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + NVGPUShader5.glProgramUniform2ui64vNV(program, location, value); + } + + // --- [ glProgramUniform3ui64vNV ] --- + + public static void nglProgramUniform3ui64vNV(int program, int location, int count, long value) { + NVGPUShader5.nglProgramUniform3ui64vNV(program, location, count, value); + } + + public static void glProgramUniform3ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + NVGPUShader5.glProgramUniform3ui64vNV(program, location, value); + } + + // --- [ glProgramUniform4ui64vNV ] --- + + public static void nglProgramUniform4ui64vNV(int program, int location, int count, long value) { + NVGPUShader5.nglProgramUniform4ui64vNV(program, location, count, value); + } + + public static void glProgramUniform4ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + NVGPUShader5.glProgramUniform4ui64vNV(program, location, value); + } + + /** Array version of: {@link #glUniform1i64vNV Uniform1i64vNV} */ + public static void glUniform1i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + NVGPUShader5.glUniform1i64vNV(location, value); + } + + /** Array version of: {@link #glUniform2i64vNV Uniform2i64vNV} */ + public static void glUniform2i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + NVGPUShader5.glUniform2i64vNV(location, value); + } + + /** Array version of: {@link #glUniform3i64vNV Uniform3i64vNV} */ + public static void glUniform3i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + NVGPUShader5.glUniform3i64vNV(location, value); + } + + /** Array version of: {@link #glUniform4i64vNV Uniform4i64vNV} */ + public static void glUniform4i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + NVGPUShader5.glUniform4i64vNV(location, value); + } + + /** Array version of: {@link #glUniform1ui64vNV Uniform1ui64vNV} */ + public static void glUniform1ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + NVGPUShader5.glUniform1ui64vNV(location, value); + } + + /** Array version of: {@link #glUniform2ui64vNV Uniform2ui64vNV} */ + public static void glUniform2ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT *") long[] value) { + NVGPUShader5.glUniform2ui64vNV(location, value); + } + + /** Array version of: {@link #glUniform3ui64vNV Uniform3ui64vNV} */ + public static void glUniform3ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + NVGPUShader5.glUniform3ui64vNV(location, value); + } + + /** Array version of: {@link #glUniform4ui64vNV Uniform4ui64vNV} */ + public static void glUniform4ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + NVGPUShader5.glUniform4ui64vNV(location, value); + } + + /** Array version of: {@link #glGetUniformi64vNV GetUniformi64vNV} */ + public static void glGetUniformi64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT *") long[] params) { + NVGPUShader5.glGetUniformi64vNV(program, location, params); + } + + /** Array version of: {@link #glGetUniformui64vNV GetUniformui64vNV} */ + public static void glGetUniformui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT *") long[] params) { + NVShaderBufferLoad.glGetUniformui64vNV(program, location, params); + } + + /** Array version of: {@link #glProgramUniform1i64vNV ProgramUniform1i64vNV} */ + public static void glProgramUniform1i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + NVGPUShader5.glProgramUniform1i64vNV(program, location, value); + } + + /** Array version of: {@link #glProgramUniform2i64vNV ProgramUniform2i64vNV} */ + public static void glProgramUniform2i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + NVGPUShader5.glProgramUniform2i64vNV(program, location, value); + } + + /** Array version of: {@link #glProgramUniform3i64vNV ProgramUniform3i64vNV} */ + public static void glProgramUniform3i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + NVGPUShader5.glProgramUniform3i64vNV(program, location, value); + } + + /** Array version of: {@link #glProgramUniform4i64vNV ProgramUniform4i64vNV} */ + public static void glProgramUniform4i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + NVGPUShader5.glProgramUniform4i64vNV(program, location, value); + } + + /** Array version of: {@link #glProgramUniform1ui64vNV ProgramUniform1ui64vNV} */ + public static void glProgramUniform1ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + NVGPUShader5.glProgramUniform1ui64vNV(program, location, value); + } + + /** Array version of: {@link #glProgramUniform2ui64vNV ProgramUniform2ui64vNV} */ + public static void glProgramUniform2ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + NVGPUShader5.glProgramUniform2ui64vNV(program, location, value); + } + + /** Array version of: {@link #glProgramUniform3ui64vNV ProgramUniform3ui64vNV} */ + public static void glProgramUniform3ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + NVGPUShader5.glProgramUniform3ui64vNV(program, location, value); + } + + /** Array version of: {@link #glProgramUniform4ui64vNV ProgramUniform4ui64vNV} */ + public static void glProgramUniform4ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + NVGPUShader5.glProgramUniform4ui64vNV(program, location, value); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDInterleavedElements.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDInterleavedElements.java new file mode 100644 index 000000000..33e83ffd0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDInterleavedElements.java @@ -0,0 +1,48 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the AMD_interleaved_elements extension. + * + *

    The glDrawElements function and its variants (instanced and indirect, for example) allow OpenGL to draw indexed arrays of vertices. Since its + * inception, OpenGL has supported unsigned bytes, unsigned shorts and unsigned integers as index types. However, all enabled vertex arrays may be + * represented by at most one shared index.

    + * + *

    A common scenario in graphics rendering is that several faces share a vertex where, for each face some properties of a vertex (position and texture + * coordinates, for example) should be common but others must be unique (colors, normals, and so on). Consider a mesh of a cube with per-face normals, for + * example. There are 8 vertices and 6 normals, and 12 triangles (where each face of the cube is represented as two triangles). To render this cube, we + * must compute the 24 unique permutations of position and normal and build a new element list to index into it. In fact, any advantage of indexed draw is + * lost here as the number of required permutations is equal to the final vertex count required to draw the object.

    + * + *

    This extension allows OpenGL to process multi-component packed element data. The maximum size of a vertex's index data is not increased, but the + * facility to store 2 16-bit or 2 or 4 8-bit indices per vertex is introduced. Each vertex attribute is given a swizzle property to allow its index to be + * sourced from one of up to 4 channels of index data. This effectively allows an application to supply multiple interleaved streams of index data to + * OpenGL. Each vertex attribute is given a 'channel selector' to select one of the up to 4 channels of vertex index information presented to OpenGL. This + * enables the use-case described above and many more. The swizzle parameter is also applied to vertex indices passed to shaders, and updates to the + * definition of base vertex parameters and primitive restart are applied.

    + */ +public class AMDInterleavedElements { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of VertexAttribParameteriAMD and GetVertexAttrib{iv|dv|fv|Iiv|Iuiv|Ldv}. */ + public static final int GL_VERTEX_ELEMENT_SWIZZLE_AMD = 0x91A4; + + /** Selected by the {@code pname} parameter of ProgramParameteri and GetProgramiv. */ + public static final int GL_VERTEX_ID_SWIZZLE_AMD = 0x91A5; + + protected AMDInterleavedElements() { + throw new UnsupportedOperationException(); + } + + // --- [ glVertexAttribParameteriAMD ] --- + + public static native void glVertexAttribParameteriAMD(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDOcclusionQueryEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDOcclusionQueryEvent.java new file mode 100644 index 000000000..f8876baf2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDOcclusionQueryEvent.java @@ -0,0 +1,53 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the AMD_occlusion_query_event extension. + * + *

    This extension introduces the concept of occlusion query events and changes the concept of an occlusion query from counting passed fragments to counting + * fragments that generate any of a user-selectable set of events. Provided events include passing the depth test, and passing or failing the stencil test. + * For a given occlusion query object, counting of these events may be enabled or disabled, allowing any combination to be counted.

    + * + *

    Requires {@link GL15 OpenGL 1.5}.

    + */ +public class AMDOcclusionQueryEvent { + + static { GL.initialize(); } + + /** + * Accepted by the {@code pname} argument to {@link #glQueryObjectParameteruiAMD QueryObjectParameteruiAMD}, {@link GL15C#glGetQueryObjectiv GetQueryObjectiv}, {@link GL15C#glGetQueryObjectuiv GetQueryObjectuiv}, + * {@link GL33C#glGetQueryObjecti64v GetQueryObjecti64v}, and {@link GL33C#glGetQueryObjectui64v GetQueryObjectui64v}. + */ + public static final int GL_OCCLUSION_QUERY_EVENT_MASK_AMD = 0x874F; + + /** Accepted by the {@code param} argument to {@link #glQueryObjectParameteruiAMD QueryObjectParameteruiAMD}. */ + public static final int + GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD = 0x1, + GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD = 0x2, + GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD = 0x4, + GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD = 0x8, + GL_QUERY_ALL_EVENT_BITS_AMD = 0xFFFFFFFF; + + protected AMDOcclusionQueryEvent() { + throw new UnsupportedOperationException(); + } + + // --- [ glQueryObjectParameteruiAMD ] --- + + /** + * Changes the value of a query object parameter. + * + * @param target a valid query target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param id a value returned from a previous call to {@link GL15C#glGenQueries GenQueries} + * @param pname the parameter to modify. Must be:
    {@link #GL_OCCLUSION_QUERY_EVENT_MASK_AMD OCCLUSION_QUERY_EVENT_MASK_AMD}
    + * @param param the new value. One of:
    {@link #GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD QUERY_DEPTH_PASS_EVENT_BIT_AMD}{@link #GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD QUERY_DEPTH_FAIL_EVENT_BIT_AMD}
    {@link #GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD QUERY_STENCIL_FAIL_EVENT_BIT_AMD}{@link #GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD}
    {@link #GL_QUERY_ALL_EVENT_BITS_AMD QUERY_ALL_EVENT_BITS_AMD}
    + */ + public static native void glQueryObjectParameteruiAMD(@NativeType("GLenum") int target, @NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint") int param); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDPerformanceMonitor.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDPerformanceMonitor.java new file mode 100644 index 000000000..4c5a992f3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDPerformanceMonitor.java @@ -0,0 +1,284 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the AMD_performance_monitor extension. + * + *

    This extension enables the capture and reporting of performance monitors. Performance monitors contain groups of counters which hold arbitrary counted + * data. Typically, the counters hold information on performance-related counters in the underlying hardware. The extension is general enough to allow the + * implementation to choose which counters to expose and pick the data type and range of the counters. The extension also allows counting to start and end + * on arbitrary boundaries during rendering.

    + */ +public class AMDPerformanceMonitor { + + static { GL.initialize(); } + + /** Accepted by the {@code pame} parameter of GetPerfMonitorCounterInfoAMD. */ + public static final int + GL_COUNTER_TYPE_AMD = 0x8BC0, + GL_COUNTER_RANGE_AMD = 0x8BC1; + + /** Returned as a valid value in {@code data} parameter of GetPerfMonitorCounterInfoAMD if {@code pname} = COUNTER_TYPE_AMD. */ + public static final int + GL_UNSIGNED_INT64_AMD = 0x8BC2, + GL_PERCENTAGE_AMD = 0x8BC3; + + /** Accepted by the {@code pname} parameter of GetPerfMonitorCounterDataAMD. */ + public static final int + GL_PERFMON_RESULT_AVAILABLE_AMD = 0x8BC4, + GL_PERFMON_RESULT_SIZE_AMD = 0x8BC5, + GL_PERFMON_RESULT_AMD = 0x8BC6; + + protected AMDPerformanceMonitor() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetPerfMonitorGroupsAMD ] --- + + public static native void nglGetPerfMonitorGroupsAMD(long numGroups, int groupsSize, long groups); + + public static void glGetPerfMonitorGroupsAMD(@Nullable @NativeType("GLint *") IntBuffer numGroups, @Nullable @NativeType("GLuint *") IntBuffer groups) { + if (CHECKS) { + checkSafe(numGroups, 1); + } + nglGetPerfMonitorGroupsAMD(memAddressSafe(numGroups), remainingSafe(groups), memAddressSafe(groups)); + } + + // --- [ glGetPerfMonitorCountersAMD ] --- + + public static native void nglGetPerfMonitorCountersAMD(int group, long numCounters, long maxActiveCounters, int counterSize, long counters); + + public static void glGetPerfMonitorCountersAMD(@NativeType("GLuint") int group, @NativeType("GLint *") IntBuffer numCounters, @NativeType("GLint *") IntBuffer maxActiveCounters, @NativeType("GLuint *") IntBuffer counters) { + if (CHECKS) { + check(numCounters, 1); + check(maxActiveCounters, 1); + } + nglGetPerfMonitorCountersAMD(group, memAddress(numCounters), memAddress(maxActiveCounters), counters.remaining(), memAddress(counters)); + } + + // --- [ glGetPerfMonitorGroupStringAMD ] --- + + public static native void nglGetPerfMonitorGroupStringAMD(int group, int bufSize, long length, long groupString); + + public static void glGetPerfMonitorGroupStringAMD(@NativeType("GLuint") int group, @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer groupString) { + if (CHECKS) { + check(length, 1); + } + nglGetPerfMonitorGroupStringAMD(group, groupString.remaining(), memAddress(length), memAddress(groupString)); + } + + // --- [ glGetPerfMonitorCounterStringAMD ] --- + + public static native void nglGetPerfMonitorCounterStringAMD(int group, int counter, int bufSize, long length, long counterString); + + public static void glGetPerfMonitorCounterStringAMD(@NativeType("GLuint") int group, @NativeType("GLuint") int counter, @Nullable @NativeType("GLsizei *") IntBuffer length, @Nullable @NativeType("GLchar *") ByteBuffer counterString) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetPerfMonitorCounterStringAMD(group, counter, remainingSafe(counterString), memAddressSafe(length), memAddressSafe(counterString)); + } + + // --- [ glGetPerfMonitorCounterInfoAMD ] --- + + public static native void nglGetPerfMonitorCounterInfoAMD(int group, int counter, int pname, long data); + + public static void glGetPerfMonitorCounterInfoAMD(@NativeType("GLuint") int group, @NativeType("GLuint") int counter, @NativeType("GLenum") int pname, @NativeType("void *") ByteBuffer data) { + if (CHECKS) { + check(data, 4); + } + nglGetPerfMonitorCounterInfoAMD(group, counter, pname, memAddress(data)); + } + + public static void glGetPerfMonitorCounterInfoAMD(@NativeType("GLuint") int group, @NativeType("GLuint") int counter, @NativeType("GLenum") int pname, @NativeType("void *") IntBuffer data) { + if (CHECKS) { + check(data, 4 >> 2); + } + nglGetPerfMonitorCounterInfoAMD(group, counter, pname, memAddress(data)); + } + + public static void glGetPerfMonitorCounterInfoAMD(@NativeType("GLuint") int group, @NativeType("GLuint") int counter, @NativeType("GLenum") int pname, @NativeType("void *") FloatBuffer data) { + if (CHECKS) { + check(data, 4 >> 2); + } + nglGetPerfMonitorCounterInfoAMD(group, counter, pname, memAddress(data)); + } + + // --- [ glGenPerfMonitorsAMD ] --- + + public static native void nglGenPerfMonitorsAMD(int n, long monitors); + + public static void glGenPerfMonitorsAMD(@NativeType("GLuint *") IntBuffer monitors) { + nglGenPerfMonitorsAMD(monitors.remaining(), memAddress(monitors)); + } + + @NativeType("void") + public static int glGenPerfMonitorsAMD() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer monitors = stack.callocInt(1); + nglGenPerfMonitorsAMD(1, memAddress(monitors)); + return monitors.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDeletePerfMonitorsAMD ] --- + + public static native void nglDeletePerfMonitorsAMD(int n, long monitors); + + public static void glDeletePerfMonitorsAMD(@NativeType("GLuint *") IntBuffer monitors) { + nglDeletePerfMonitorsAMD(monitors.remaining(), memAddress(monitors)); + } + + public static void glDeletePerfMonitorsAMD(@NativeType("GLuint *") int monitor) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer monitors = stack.ints(monitor); + nglDeletePerfMonitorsAMD(1, memAddress(monitors)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glSelectPerfMonitorCountersAMD ] --- + + public static native void nglSelectPerfMonitorCountersAMD(int monitor, boolean enable, int group, int numCounters, long counterList); + + public static void glSelectPerfMonitorCountersAMD(@NativeType("GLuint") int monitor, @NativeType("GLboolean") boolean enable, @NativeType("GLuint") int group, @NativeType("GLuint *") IntBuffer counterList) { + nglSelectPerfMonitorCountersAMD(monitor, enable, group, counterList.remaining(), memAddress(counterList)); + } + + // --- [ glBeginPerfMonitorAMD ] --- + + public static native void glBeginPerfMonitorAMD(@NativeType("GLuint") int monitor); + + // --- [ glEndPerfMonitorAMD ] --- + + public static native void glEndPerfMonitorAMD(@NativeType("GLuint") int monitor); + + // --- [ glGetPerfMonitorCounterDataAMD ] --- + + public static native void nglGetPerfMonitorCounterDataAMD(int monitor, int pname, int dataSize, long data, long bytesWritten); + + public static void glGetPerfMonitorCounterDataAMD(@NativeType("GLuint") int monitor, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer data, @Nullable @NativeType("GLint *") IntBuffer bytesWritten) { + if (CHECKS) { + checkSafe(bytesWritten, 1); + } + nglGetPerfMonitorCounterDataAMD(monitor, pname, data.remaining(), memAddress(data), memAddressSafe(bytesWritten)); + } + + /** Array version of: {@link #glGetPerfMonitorGroupsAMD GetPerfMonitorGroupsAMD} */ + public static void glGetPerfMonitorGroupsAMD(@Nullable @NativeType("GLint *") int[] numGroups, @Nullable @NativeType("GLuint *") int[] groups) { + long __functionAddress = GL.getICD().glGetPerfMonitorGroupsAMD; + if (CHECKS) { + check(__functionAddress); + checkSafe(numGroups, 1); + } + callPPV(numGroups, lengthSafe(groups), groups, __functionAddress); + } + + /** Array version of: {@link #glGetPerfMonitorCountersAMD GetPerfMonitorCountersAMD} */ + public static void glGetPerfMonitorCountersAMD(@NativeType("GLuint") int group, @NativeType("GLint *") int[] numCounters, @NativeType("GLint *") int[] maxActiveCounters, @NativeType("GLuint *") int[] counters) { + long __functionAddress = GL.getICD().glGetPerfMonitorCountersAMD; + if (CHECKS) { + check(__functionAddress); + check(numCounters, 1); + check(maxActiveCounters, 1); + } + callPPPV(group, numCounters, maxActiveCounters, counters.length, counters, __functionAddress); + } + + /** Array version of: {@link #glGetPerfMonitorGroupStringAMD GetPerfMonitorGroupStringAMD} */ + public static void glGetPerfMonitorGroupStringAMD(@NativeType("GLuint") int group, @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer groupString) { + long __functionAddress = GL.getICD().glGetPerfMonitorGroupStringAMD; + if (CHECKS) { + check(__functionAddress); + check(length, 1); + } + callPPV(group, groupString.remaining(), length, memAddress(groupString), __functionAddress); + } + + /** Array version of: {@link #glGetPerfMonitorCounterStringAMD GetPerfMonitorCounterStringAMD} */ + public static void glGetPerfMonitorCounterStringAMD(@NativeType("GLuint") int group, @NativeType("GLuint") int counter, @Nullable @NativeType("GLsizei *") int[] length, @Nullable @NativeType("GLchar *") ByteBuffer counterString) { + long __functionAddress = GL.getICD().glGetPerfMonitorCounterStringAMD; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(group, counter, remainingSafe(counterString), length, memAddressSafe(counterString), __functionAddress); + } + + /** Array version of: {@link #glGetPerfMonitorCounterInfoAMD GetPerfMonitorCounterInfoAMD} */ + public static void glGetPerfMonitorCounterInfoAMD(@NativeType("GLuint") int group, @NativeType("GLuint") int counter, @NativeType("GLenum") int pname, @NativeType("void *") int[] data) { + long __functionAddress = GL.getICD().glGetPerfMonitorCounterInfoAMD; + if (CHECKS) { + check(__functionAddress); + check(data, 4 >> 2); + } + callPV(group, counter, pname, data, __functionAddress); + } + + /** Array version of: {@link #glGetPerfMonitorCounterInfoAMD GetPerfMonitorCounterInfoAMD} */ + public static void glGetPerfMonitorCounterInfoAMD(@NativeType("GLuint") int group, @NativeType("GLuint") int counter, @NativeType("GLenum") int pname, @NativeType("void *") float[] data) { + long __functionAddress = GL.getICD().glGetPerfMonitorCounterInfoAMD; + if (CHECKS) { + check(__functionAddress); + check(data, 4 >> 2); + } + callPV(group, counter, pname, data, __functionAddress); + } + + /** Array version of: {@link #glGenPerfMonitorsAMD GenPerfMonitorsAMD} */ + public static void glGenPerfMonitorsAMD(@NativeType("GLuint *") int[] monitors) { + long __functionAddress = GL.getICD().glGenPerfMonitorsAMD; + if (CHECKS) { + check(__functionAddress); + } + callPV(monitors.length, monitors, __functionAddress); + } + + /** Array version of: {@link #glDeletePerfMonitorsAMD DeletePerfMonitorsAMD} */ + public static void glDeletePerfMonitorsAMD(@NativeType("GLuint *") int[] monitors) { + long __functionAddress = GL.getICD().glDeletePerfMonitorsAMD; + if (CHECKS) { + check(__functionAddress); + } + callPV(monitors.length, monitors, __functionAddress); + } + + /** Array version of: {@link #glSelectPerfMonitorCountersAMD SelectPerfMonitorCountersAMD} */ + public static void glSelectPerfMonitorCountersAMD(@NativeType("GLuint") int monitor, @NativeType("GLboolean") boolean enable, @NativeType("GLuint") int group, @NativeType("GLuint *") int[] counterList) { + long __functionAddress = GL.getICD().glSelectPerfMonitorCountersAMD; + if (CHECKS) { + check(__functionAddress); + } + callPV(monitor, enable, group, counterList.length, counterList, __functionAddress); + } + + /** Array version of: {@link #glGetPerfMonitorCounterDataAMD GetPerfMonitorCounterDataAMD} */ + public static void glGetPerfMonitorCounterDataAMD(@NativeType("GLuint") int monitor, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] data, @Nullable @NativeType("GLint *") int[] bytesWritten) { + long __functionAddress = GL.getICD().glGetPerfMonitorCounterDataAMD; + if (CHECKS) { + check(__functionAddress); + checkSafe(bytesWritten, 1); + } + callPPV(monitor, pname, data.length, data, bytesWritten, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDPinnedMemory.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDPinnedMemory.java new file mode 100644 index 000000000..709be6822 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDPinnedMemory.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the AMD_pinned_memory extension. + * + *

    This extension defines an interface that allows improved control of the physical memory used by the graphics device.

    + * + *

    It allows an existing page of system memory allocated by the application to be used as memory directly accessible to the graphics processor. One + * example application of this functionality would be to be able to avoid an explicit synchronous copy with sub-system of the application; for instance it + * is possible to directly draw from a system memory copy of a video image.

    + */ +public final class AMDPinnedMemory { + + public static final int GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD = 0x9160; + + private AMDPinnedMemory() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDQueryBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDQueryBufferObject.java new file mode 100644 index 000000000..876c94f7a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDQueryBufferObject.java @@ -0,0 +1,43 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the AMD_query_buffer_object extension. + * + *

    Statistics about the operation of the OpenGL pipeline, such as the number of samples that passed the depth test, the elapsed time between two events or + * the number of vertices written to a transform feedback buffer may be retrieved from the GL through query objects. The current value of a query object + * may be retrieved by the application through the OpenGL API. Should the result returned by the API be required for use in a shader, it must be passed + * back to the GL via a program uniform or some other mechanism. This requires a round-trip from the GPU to the CPU and back.

    + * + *

    This extension introduces a mechanism whereby the current value of a query result may be retrieved into a buffer object instead of client memory. This + * allows the query result to be made available to a shader without a round-trip to the CPU for example by subsequently using the buffer object as a + * uniform buffer, texture buffer or other data store visible to the shader. This functionality may also be used to place the results of many query + * objects into a single, large buffer and then map or otherwise read back the entire buffer at a later point in time, avoiding a per-query CPU-GPU + * synchronization event.

    + * + *

    The result of any query object type supported by the GL implementation may be retrieved into a buffer object. The implementation will determine the + * most efficient method of copying the query result to the buffer.

    + * + *

    Requires {@link GL15 OpenGL 1.5}.

    + */ +public final class AMDQueryBufferObject { + + /** Accepted by the {@code pname} parameter of GetQueryObjectiv, GetQueryObjectuiv, GetQueryObjecti64v and GetQueryObjectui64v. */ + public static final int GL_QUERY_RESULT_NO_WAIT_AMD = 0x9194; + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, MapBufferRange, GetBufferSubData, + * GetBufferParameteriv and GetBufferPointerv. + */ + public static final int GL_QUERY_BUFFER_AMD = 0x9192; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_QUERY_BUFFER_BINDING_AMD = 0x9193; + + private AMDQueryBufferObject() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSamplePositions.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSamplePositions.java new file mode 100644 index 000000000..cc4ea2043 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSamplePositions.java @@ -0,0 +1,58 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the AMD_sample_positions extension. + * + *

    This extension provides a mechanism to explicitly set sample positions for a FBO with multi-sampled attachments. The FBO will use identical sample + * locations for all pixels in each attachment. This forces TEXTURE_FIXED_SAMPLE_LOCATIONS to TRUE if a multi-sampled texture is specified using + * TexImage2DMultisample or TexImage3DMultisample. That is, using GetTexLevelParameter to query TEXTURE_FIXED_SAMPLE_LOCATIONS will always return TRUE if + * the mechanism is explicitly used to set the sample positions.

    + * + *

    Requires {@link GL32 OpenGL 3.2} or {@link EXTFramebufferMultisample EXT_framebuffer_multisample}.

    + */ +public class AMDSamplePositions { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetFloatv. */ + public static final int GL_SUBSAMPLE_DISTANCE_AMD = 0x883F; + + protected AMDSamplePositions() { + throw new UnsupportedOperationException(); + } + + // --- [ glSetMultisamplefvAMD ] --- + + public static native void nglSetMultisamplefvAMD(int pname, int index, long val); + + public static void glSetMultisamplefvAMD(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer val) { + if (CHECKS) { + check(val, 2); + } + nglSetMultisamplefvAMD(pname, index, memAddress(val)); + } + + /** Array version of: {@link #glSetMultisamplefvAMD SetMultisamplefvAMD} */ + public static void glSetMultisamplefvAMD(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] val) { + long __functionAddress = GL.getICD().glSetMultisamplefvAMD; + if (CHECKS) { + check(__functionAddress); + check(val, 2); + } + callPV(pname, index, val, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSeamlessCubemapPerTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSeamlessCubemapPerTexture.java new file mode 100644 index 000000000..5191f735b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSeamlessCubemapPerTexture.java @@ -0,0 +1,34 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the AMD_seamless_cubemap_per_texture extension. + * + *

    In unextended OpenGL, cube maps are treated as sets of six, independent texture images. Once a face is selected from the set, it is treated exactly as + * any other two-dimensional texture would be. When sampling linearly from the texture, all of the individual texels that would be used to to create the + * final, bilinear sample values are taken from the same cube face. The normal, two-dimensional texture coordinate wrapping modes are honored. This + * sometimes causes seams to appear in cube maps.

    + * + *

    ARB_seamless_cube_map addresses this issue by providing a mechanism whereby an implementation could take each of the taps of a bilinear sample from a + * different face, spanning face boundaries and providing seamless filtering from cube map textures. However, in ARB_seamless_cube_map, this feature was + * exposed as a global state, affecting all bound cube map textures. It was not possible to mix seamless and per-face cube map sampling modes during + * multisampling. Furthermore, if an application included cube maps that were meant to be sampled seamlessly and non-seamlessly, it would have to track + * this state and enable or disable seamless cube map sampling as needed.

    + * + *

    This extension addresses this issue and provides an orthogonal method for allowing an implementation to provide a per-texture setting for enabling + * seamless sampling from cube maps.

    + * + *

    Requires {@link ARBTextureCubeMap ARB_texture_cube_map}.

    + */ +public final class AMDSeamlessCubemapPerTexture { + + /** Accepted by the {@code pname} parameter of TexParameterf, TexParameteri, TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + + private AMDSeamlessCubemapPerTexture() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSparseTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSparseTexture.java new file mode 100644 index 000000000..0a553ca78 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDSparseTexture.java @@ -0,0 +1,62 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the AMD_sparse_texture extension. + * + *

    Recent advances in application complexity and a desire for higher resolutions have pushed texture sizes up considerably. Often, the amount of physical + * memory available to a graphics processor is a limiting factor in the performance of texture-heavy applications. Once the available physical memory is + * exhausted, paging may occur bringing performance down considerably - or worse, the application may fail. Nevertheless, the amount of address space + * available to the graphics processor has increased to the point where many gigabytes - or even terabytes of address space may be usable even though that + * amount of physical memory is not present.

    + * + *

    This extension allows the separation of the graphics processor's address space (reservation) from the requirement that all textures must be physically + * backed (commitment). This exposes a limited form of virtualization for textures. Use cases include sparse (or partially resident) textures, texture + * paging, on-demand and delayed loading of texture assets and application controlled level of detail.

    + * + *

    Requires {@link GL20 OpenGL 2.0} or {@link ARBFragmentShader ARB_fragment_shader}.

    + */ +public class AMDSparseTexture { + + static { GL.initialize(); } + + /** Accepted by the {@code flags} parameter to TexStorageSparseAMD and TextureStorageSparseAMD. */ + public static final int GL_TEXTURE_STORAGE_SPARSE_BIT_AMD = 0x1; + + /** Accepted by the {@code pname} parameter to GetInternalformativ. */ + public static final int + GL_VIRTUAL_PAGE_SIZE_X_AMD = 0x9195, + GL_VIRTUAL_PAGE_SIZE_Y_AMD = 0x9196, + GL_VIRTUAL_PAGE_SIZE_Z_AMD = 0x9197; + + /** Accepted by the {@code pname} parameter to GetIntegerv, GetFloatv, GetDoublev, GetInteger64v, and GetBooleanv. */ + public static final int + GL_MAX_SPARSE_TEXTURE_SIZE_AMD = 0x9198, + GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD = 0x9199, + GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS = 0x919A; + + /** Accepted by the {@code pname} parameter of GetTexParameter{if}v. */ + public static final int GL_MIN_SPARSE_LEVEL_AMD = 0x919B; + + /** Accepted by the {@code pname} parameter of TexParameter{if}{v} and GetTexParameter{if}v. */ + public static final int GL_MIN_LOD_WARNING_AMD = 0x919C; + + protected AMDSparseTexture() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexStorageSparseAMD ] --- + + public static native void glTexStorageSparseAMD(@NativeType("GLenum") int target, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLsizei") int layers, @NativeType("GLbitfield") int flags); + + // --- [ glTextureStorageSparseAMD ] --- + + public static native void glTextureStorageSparseAMD(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLsizei") int layers, @NativeType("GLbitfield") int flags); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDStencilOperationExtended.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDStencilOperationExtended.java new file mode 100644 index 000000000..97262c0c0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDStencilOperationExtended.java @@ -0,0 +1,44 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the AMD_stencil_operation_extended extension. + * + *

    Stencil buffers are special buffers that allow tests to be made against an incoming value and action taken based on that value. The stencil buffer is + * updated during rasterization, and the operation used to update the stencil buffer is chosen based on whether the fragment passes the stencil test, and + * if it does, whether it passes the depth test. Traditional OpenGL includes support for several primitive operations, such as incrementing, or clearing + * the content of the stencil buffer, or replacing it with a specified reference value.

    + * + *

    This extension adds support for an additional set of operations that may be performed on the stencil buffer under each circumstance. Additionally, this + * extension separates the value used as the source for stencil operations from the reference value, allowing different values to be used in the stencil + * test, and in the update of the stencil buffer.

    + */ +public class AMDStencilOperationExtended { + + static { GL.initialize(); } + + /** Accepted by the {@code sfail}, {@code dpfail} and {@code dppass} parameters of StencilOp and StencilOpSeparate. */ + public static final int + GL_SET_AMD = 0x874A, + GL_REPLACE_VALUE_AMD = 0x874B; + + /** Accepted by the {@code param} parameter of GetIntegerv, GetFloatv, GetBooleanv GetDoublev and GetInteger64v. */ + public static final int + GL_STENCIL_OP_VALUE_AMD = 0x874C, + GL_STENCIL_BACK_OP_VALUE_AMD = 0x874D; + + protected AMDStencilOperationExtended() { + throw new UnsupportedOperationException(); + } + + // --- [ glStencilOpValueAMD ] --- + + public static native void glStencilOpValueAMD(@NativeType("GLenum") int face, @NativeType("GLuint") int value); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDTransformFeedback4.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDTransformFeedback4.java new file mode 100644 index 000000000..4ed1a99bb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDTransformFeedback4.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the AMD_transform_feedback4 extension. + * + *

    This extension enhances transform feedback in two significant ways. First, it allows multiple transform feedback streams to be captured, each with its + * own, independent primitve type. Second, it allows any combination of streams to be rasterized.

    + * + *

    Requires {@link GL40 OpenGL 4.0} or {@link ARBTransformFeedback3 ARB_transform_feedback3}.

    + */ +public final class AMDTransformFeedback4 { + + /** Accepted by the {@code pname} argument to Enablei. Disablei and IsEnabledi. */ + public static final int GL_STREAM_RASTERIZATION_AMD = 0x91A0; + + private AMDTransformFeedback4() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDVertexShaderTessellator.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDVertexShaderTessellator.java new file mode 100644 index 000000000..68373c2a7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AMDVertexShaderTessellator.java @@ -0,0 +1,100 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the AMD_vertex_shader_tessellator extension. + * + *

    The vertex shader tessellator gives new flexibility to the shader author to shade at a tessellated vertex, rather than just at a provided vertex.

    + * + *

    In unextended vertex shading, the built-in attributes such as gl_Vertex, gl_Normal, and gl_MultiTexcoord0, together with the user defined attributes, + * are system provided values which are initialized prior to vertex shader invocation.

    + * + *

    With vertex shading tessellation, additional vertex shader special values are available:

    + * + *
    
    + *         ivec3 gl_VertexTriangleIndex; // indices of the three control
    + *                                       // points for the vertex
    + *         vec3 gl_BarycentricCoord;     // barycentric coordinates
    + *                                       // of the vertex
    + * 
    + *     i o
    + *       |\
    + *       | \
    + *       *--*
    + *       |\ |\
    + *       | \| \
    + *       *--*--*
    + *       |\ |\ |\
    + *       | \| \| \
    + *     j o--*--*--o k
    + * 
    + *     Figure 1  A Tessellated Triangle
    + *     o = control point (and tessellated vertex)
    + *     * = tessellated vertex
    + * 
    + *         ivec4 gl_VertexQuadIndex;   // indices for the four control
    + *                                     // points for the vertex
    + *         vec2 gl_UVCoord;            // UV coordinates of the vertex
    + * 
    + *     i o--*--*--o k
    + *       |\ |\ |\ |
    + *       | \| \| \|
    + *       *--*--*--*
    + *       |\ |\ |\ |
    + *       | \| \| \|
    + *       *--*--*--*
    + *       |\ |\ |\ |
    + *       | \| \| \|
    + *     j o--*--*--o l
    + * 
    + *     Figure 2  A Tessellated Quad
    + *     o = control point (and tessellated vertex)
    + *     * = tessellated vertex
    + * + *

    When this extension is enabled, conventional built-in attributes and user defined attributes are uninitialized. The shader writer is responsible for + * explicitly fetching all other vertex data either from textures, uniform buffers, or vertex buffers.

    + * + *

    The shader writer is further responsible for interpolating the vertex data at the given barycentric coordinates or uv coordinates of the vertex.

    + * + *

    Requires {@link GL20 OpenGL 2.0}.

    + */ +public class AMDVertexShaderTessellator { + + static { GL.initialize(); } + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_BUFFER_AMD = 0x9001, + GL_INT_SAMPLER_BUFFER_AMD = 0x9002, + GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD = 0x9003; + + /** Accepted by TessellationModeAMD. */ + public static final int + GL_DISCRETE_AMD = 0x9006, + GL_CONTINUOUS_AMD = 0x9007; + + /** Accepted by GetIntegerv. */ + public static final int GL_TESSELLATION_MODE_AMD = 0x9004; + + /** Accepted by GetFloatv. */ + public static final int GL_TESSELLATION_FACTOR_AMD = 0x9005; + + protected AMDVertexShaderTessellator() { + throw new UnsupportedOperationException(); + } + + // --- [ glTessellationFactorAMD ] --- + + public static native void glTessellationFactorAMD(@NativeType("GLfloat") float factor); + + // --- [ glTessellationModeAMD ] --- + + public static native void glTessellationModeAMD(@NativeType("GLenum") int mode); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBaseInstance.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBaseInstance.java new file mode 100644 index 000000000..2a81a851f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBaseInstance.java @@ -0,0 +1,205 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_base_instance extension. + * + *

    This extension allows the offset within buffer objects used for instanced rendering to be specified. This is congruent with the {@code first} parameter + * in {@link GL11C#glDrawArrays DrawArrays} and the {@code basevertex} parameter in {@link GL11C#glDrawElements DrawElements}. When instanced rendering is performed (for example, through + * {@link GL31C#glDrawArraysInstanced DrawArraysInstanced}), instanced vertex attributes whose vertex attribute divisors are non-zero are fetched from enabled vertex arrays + * per-instance rather than per-vertex. However, in unextended OpenGL, there is no way to define the offset into those arrays from which the attributes are + * fetched. This extension adds that offset in the form of a {@code } parameter to several new procedures.

    + * + *

    The {@code baseinstance} parameter is added to the index of the array element, after division by the vertex attribute divisor. This allows several sets + * of instanced vertex attribute data to be stored in a single vertex array, and the base offset of that data to be specified for each draw. Further, this + * extension exposes the {@code } parameter as the final and previously undefined structure member of the draw-indirect data structure.

    + * + *

    Requires {@link GL31 OpenGL 3.1} or {@link ARBDrawInstanced ARB_draw_instanced}. Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ +public class ARBBaseInstance { + + static { GL.initialize(); } + + protected ARBBaseInstance() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawArraysInstancedBaseInstance ] --- + + /** + * Draws multiple instances of a range of elements with an offset applied to instanced attributes. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param first the starting index in the enabled arrays + * @param count the number of indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + */ + public static void glDrawArraysInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLint") int first, @NativeType("GLsizei") int count, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawArraysInstancedBaseInstance(mode, first, count, primcount, baseinstance); + } + + // --- [ glDrawElementsInstancedBaseInstance ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstancedBaseInstance DrawElementsInstancedBaseInstance} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawElementsInstancedBaseInstance(int mode, int count, int type, long indices, int primcount, int baseinstance) { + GL42C.nglDrawElementsInstancedBaseInstance(mode, count, type, indices, primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseInstance(mode, count, type, indices, primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseInstance(mode, type, indices, primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseInstance(mode, indices, primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseInstance(mode, indices, primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseInstance(mode, indices, primcount, baseinstance); + } + + // --- [ glDrawElementsInstancedBaseVertexBaseInstance ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawElementsInstancedBaseVertexBaseInstance(int mode, int count, int type, long indices, int primcount, int basevertex, int baseinstance) { + GL42C.nglDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseVertexBaseInstance(mode, type, indices, primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseVertexBaseInstance(mode, indices, primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseVertexBaseInstance(mode, indices, primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseVertexBaseInstance(mode, indices, primcount, basevertex, baseinstance); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBindlessTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBindlessTexture.java new file mode 100644 index 000000000..3b6247d07 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBindlessTexture.java @@ -0,0 +1,389 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_bindless_texture extension. + * + *

    This extension allows OpenGL applications to access texture objects in shaders without first binding each texture to one of a limited number of texture + * image units. Using this extension, an application can query a 64-bit unsigned integer texture handle for each texture that it wants to access and then + * use that handle directly in GLSL or assembly-based shaders. The ability to access textures without having to bind and/or re-bind them is similar to the + * capability provided by the {@link NVShaderBufferLoad NV_shader_buffer_load} extension that allows shaders to access buffer objects without binding them. In both cases, + * these extensions significantly reduce the amount of API and internal GL driver overhead needed to manage resource bindings.

    + * + *

    This extension also provides similar capability for the image load, store, and atomic functionality provided by OpenGL 4.2 and the + * {@link ARBShaderImageLoadStore ARB_shader_image_load_store} and {@link EXTShaderImageLoadStore EXT_shader_image_load_store} extensions, where a texture can be accessed without first binding it to an + * image unit. An image handle can be extracted from a texture object using an API with a set of parameters similar to those for + * {@link EXTShaderImageLoadStore#glBindImageTextureEXT BindImageTextureEXT}.

    + * + *

    This extension adds no new data types to GLSL. Instead, it uses existing sampler and image data types and allows them to be populated with texture and + * image handles. This extension does permit sampler and image data types to be used in more contexts than in unextended GLSL 4.00. In particular, sampler + * and image types may be used as shader inputs/outputs, temporary variables, and uniform block members, and may be assigned to by shader code. + * Constructors are provided to convert unsigned integer values to and from sampler and image data types. Additionally, new APIs are provided to load + * values for sampler and image uniforms with 64-bit handle inputs. The use of existing integer-based Uniform* APIs is still permitted, in which case the + * integer specified will identify a texture image or image unit. For samplers and images with values specified as texture image or image units, the GL + * implemenation will translate the unit number to an internal handle as required.

    + * + *

    To access texture or image resources using handles, the handles must first be made resident. Accessing a texture or image by handle without first + * making it resident can result in undefined results, including program termination. Since the amount of texture memory required by an application may + * exceed the amount of memory available to the system, this extension provides API calls allowing applications to manage overall texture memory + * consumption by making a texture resident and non-resident as required.

    + * + *

    Requires {@link GL40 OpenGL 4.0}.

    + */ +public class ARBBindlessTexture { + + static { GL.initialize(); } + + /** Accepted by the {@code type} parameter of VertexAttribLPointer. */ + public static final int GL_UNSIGNED_INT64_ARB = 0x140F; + + protected ARBBindlessTexture() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetTextureHandleARB ] --- + + /** + * Creates a texture handle using the current state of the texture named {@code texture}, including any embedded sampler state. See + * {@link #glGetTextureSamplerHandleARB GetTextureSamplerHandleARB} for details. + * + * @param texture the texture object + */ + @NativeType("GLuint64") + public static native long glGetTextureHandleARB(@NativeType("GLuint") int texture); + + // --- [ glGetTextureSamplerHandleARB ] --- + + /** + * Creates a texture handle using the current non-sampler state from the texture named {@code texture} and the sampler state from the sampler object + * {@code sampler}. In both cases, a 64-bit unsigned integer handle is returned. The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated if {@code texture} is zero or is + * not the name of an existing texture object or if {@code sampler} is zero or is not the name of an existing sampler object. The error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if the texture object {@code texture} is not complete. If an error occurs, a handle of zero is returned. + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if the border color (taken from the embedded sampler for GetTextureHandleARB or from the {@code sampler} + * for GetTextureSamplerHandleARB) is not one of the following allowed values. If the texture's base internal format is signed or unsigned integer, allowed + * values are (0,0,0,0), (0,0,0,1), (1,1,1,0), and (1,1,1,1). If the base internal format is not integer, allowed values are (0.0,0.0,0.0,0.0), + * (0.0,0.0,0.0,1.0), (1.0,1.0,1.0,0.0), and (1.0,1.0,1.0,1.0).

    + * + *

    The handle for each texture or texture/sampler pair is unique; the same handle will be returned if GetTextureHandleARB is called multiple times for the + * same texture or if GetTextureSamplerHandleARB is called multiple times for the same texture/sampler pair.

    + * + *

    When a texture object is referenced by one or more texture handles, the texture parameters of the object may not be changed, and the size and format of + * the images in the texture object may not be re-specified. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if the functions TexImage*, CopyTexImage*, + * CompressedTexImage*, TexBuffer*, or TexParameter* are called to modify a texture object referenced by one or more texture handles. The contents of the + * images in a texture object may still be updated via commands such as TexSubImage*, CopyTexSubImage*, and CompressedTexSubImage*, and by rendering to a + * framebuffer object, even if the texture object is referenced by one or more texture handles.

    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by {@link GL15C#glBufferData BufferData} if it is called to modify a buffer object bound to a buffer texture while that + * texture object is referenced by one or more texture handles. The contents of the buffer object may still be updated via buffer update commands such as + * {@link GL15C#glBufferSubData BufferSubData} and MapBuffer*, or via the texture update commands, even if the buffer is bound to a texture while that buffer texture object is + * referenced by one or more texture handles.

    + * + *

    When a sampler object is referenced by one or more texture handles, the sampler parameters of the object may not be changed. The error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated when calling SamplerParameter* functions to modify a sampler object referenced by one or more texture handles.

    + * + * @param texture the texture object + * @param sampler the sampler object + */ + @NativeType("GLuint64") + public static native long glGetTextureSamplerHandleARB(@NativeType("GLuint") int texture, @NativeType("GLuint") int sampler); + + // --- [ glMakeTextureHandleResidentARB ] --- + + /** + * Make a texture handle resident, so that it is accessible to shaders for texture mapping operations. + * + *

    While the texture handle is resident, it may be used in texture mapping operations. If a shader attempts to perform a texture mapping operation using a + * handle that is not resident, the results of that operation are undefined and may lead to application termination. When a texture handle is resident, the + * texture it references is also considered resident for the purposes of the {@link GL11#glAreTexturesResident AreTexturesResident} command. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is + * generated if {@code handle} is not a valid texture handle, or if {@code handle} is already resident in the current GL context.

    + * + * @param handle the texture handle + */ + public static native void glMakeTextureHandleResidentARB(@NativeType("GLuint64") long handle); + + // --- [ glMakeTextureHandleNonResidentARB ] --- + + /** + * Makes a texture handle inaccessible to shaders. + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if {@code handle} is not a valid texture handle, or if {@code handle} is not resident in the current GL + * context.

    + * + * @param handle the texture handle + */ + public static native void glMakeTextureHandleNonResidentARB(@NativeType("GLuint64") long handle); + + // --- [ glGetImageHandleARB ] --- + + /** + * Creates and returns an image handle for level {@code level} of the texture named {@code texture}. If {@code layered} is {@link GL11#GL_TRUE TRUE}, a handle is created + * for the entire texture level. If {@code layered} is {@link GL11#GL_FALSE FALSE}, a handle is created for only the layer {@code layer} of the texture level. + * {@code format} specifies a format used to interpret the texels of the image when used for image loads, stores, and atomics, and has the same meaning as + * the {@code format} parameter of {@link EXTShaderImageLoadStore#glBindImageTextureEXT BindImageTextureEXT}. A 64-bit unsigned integer handle is returned if the command succeeds; otherwise, zero is + * returned. + * + *

    The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated by GetImageHandleARB if:

    + * + *
      + *
    • {@code texture} is zero or not the name of an existing texture object;
    • + *
    • the image for the texture level {@code level} doesn't exist (i.e., has a size of zero in {@code texture}); or
    • + *
    • {@code layered} is FALSE and {@code layer} is greater than or equal to the number of layers in the image at level {@code level}.
    • + *
    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by GetImageHandleARB if:

    + * + *
      + *
    • the texture object {@code texture} is not complete (section 3.9.14);
    • + *
    • {@code layered} is TRUE and the texture is not a three-dimensional, one-dimensional array, two dimensional array, cube map, or cube map array + * texture.
    • + *
    + * + *

    When a texture object is referenced by one or more image handles, the texture parameters of the object may not be changed, and the size and format of + * the images in the texture object may not be re-specified. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated when calling TexImage*, CopyTexImage*, + * CompressedTexImage*, TexBuffer*, or TexParameter* functions while a texture object is referenced by one or more image handles. The contents of the + * images in a texture object may still be updated via commands such as TexSubImage*, CopyTexSubImage*, and CompressedTexSubImage*, and by rendering to a + * framebuffer object, even if the texture object is referenced by one or more image handles.

    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by {@link GL15C#glBufferData BufferData} if it is called to modify a buffer object bound to a buffer texture while that texture + * object is referenced by one or more image handles. The contents of the buffer object may still be updated via buffer update commands such as + * {@link GL15C#glBufferSubData BufferSubData} and MapBuffer*, or via the texture update commands, even if the buffer is bound to a texture while that buffer texture object is + * referenced by one or more image handles.

    + * + *

    The handle returned for each combination of {@code texture}, {@code level}, {@code layered}, {@code layer}, and {@code format} is unique; the same + * handle will be returned if GetImageHandleARB is called multiple times with the same parameters.

    + * + * @param texture the texture object + * @param level the texture level + * @param layered the layered flag + * @param layer the texture layer + * @param format the texture format + */ + @NativeType("GLuint64") + public static native long glGetImageHandleARB(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLboolean") boolean layered, @NativeType("GLint") int layer, @NativeType("GLenum") int format); + + // --- [ glMakeImageHandleResidentARB ] --- + + /** + * Makes an image handle resident, so that it is accessible to shaders for image loads, stores, and atomic operations. + * + *

    {@code access} specifies whether the texture bound to the image handle will be treated as {@link GL15#GL_READ_ONLY READ_ONLY}, {@link GL15#GL_WRITE_ONLY WRITE_ONLY}, or {@link GL15#GL_READ_WRITE READ_WRITE}. If a + * shader reads from an image handle made resident as {@link GL15#GL_WRITE_ONLY WRITE_ONLY}, or writes to an image handle made resident as {@link GL15#GL_READ_ONLY READ_ONLY}, the results of that + * shader operation are undefined and may lead to application termination. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if {@code handle} is not a valid + * image handle, or if {@code handle} is already resident in the current GL context.

    + * + *

    While the image handle is resident, it may be used in image load, store, and atomic operations. If a shader attempts to perform an image operation using + * a handle that is not resident, the results of that operation are undefined and may lead to application termination. When an image handle is resident, + * the texture it references is not necessarily considered resident for the purposes of the {@link GL11#glAreTexturesResident AreTexturesResident} command.

    + * + * @param handle the image handle + * @param access the access type. One of:
    {@link GL15#GL_READ_ONLY READ_ONLY}{@link GL15#GL_WRITE_ONLY WRITE_ONLY}{@link GL15#GL_READ_WRITE READ_WRITE}
    + */ + public static native void glMakeImageHandleResidentARB(@NativeType("GLuint64") long handle, @NativeType("GLenum") int access); + + // --- [ glMakeImageHandleNonResidentARB ] --- + + /** + * Makes an image handle inaccessible to shaders. + * + * @param handle the image handle + */ + public static native void glMakeImageHandleNonResidentARB(@NativeType("GLuint64") long handle); + + // --- [ glUniformHandleui64ARB ] --- + + /** + * Loads a 64-bit unsigned integer handle into a uniform location corresponding to sampler or image variable types. + * + * @param location the uniform location + * @param value the handle value + */ + public static native void glUniformHandleui64ARB(@NativeType("GLint") int location, @NativeType("GLuint64") long value); + + // --- [ glUniformHandleui64vARB ] --- + + /** + * Unsafe version of: {@link #glUniformHandleui64vARB UniformHandleui64vARB} + * + * @param count the number of handles to load + */ + public static native void nglUniformHandleui64vARB(int location, int count, long values); + + /** + * Loads {@code count} 64-bit unsigned integer handles into a uniform location corresponding to sampler or image variable types. + * + * @param location the uniform location + * @param values a buffer from which to load the handles + */ + public static void glUniformHandleui64vARB(@NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer values) { + nglUniformHandleui64vARB(location, values.remaining(), memAddress(values)); + } + + // --- [ glProgramUniformHandleui64ARB ] --- + + /** + * DSA version of {@link #glUniformHandleui64ARB UniformHandleui64ARB}. + * + * @param program the program object + * @param location the uniform location + * @param value the handle value + */ + public static native void glProgramUniformHandleui64ARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64") long value); + + // --- [ glProgramUniformHandleui64vARB ] --- + + /** + * Unsafe version of: {@link #glProgramUniformHandleui64vARB ProgramUniformHandleui64vARB} + * + * @param count the number of handles to load + */ + public static native void nglProgramUniformHandleui64vARB(int program, int location, int count, long values); + + /** + * DSA version of {@link #glUniformHandleui64vARB UniformHandleui64vARB}. + * + * @param program the program object + * @param location the uniform location + * @param values a buffer from which to load the handles + */ + public static void glProgramUniformHandleui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer values) { + nglProgramUniformHandleui64vARB(program, location, values.remaining(), memAddress(values)); + } + + // --- [ glIsTextureHandleResidentARB ] --- + + /** + * Returns {@link GL11#GL_TRUE TRUE} if the specified texture handle is resident in the current context. + * + * @param handle the texture handle + */ + @NativeType("GLboolean") + public static native boolean glIsTextureHandleResidentARB(@NativeType("GLuint64") long handle); + + // --- [ glIsImageHandleResidentARB ] --- + + /** + * Returns {@link GL11#GL_TRUE TRUE} if the specified image handle is resident in the current context. + * + * @param handle the image handle + */ + @NativeType("GLboolean") + public static native boolean glIsImageHandleResidentARB(@NativeType("GLuint64") long handle); + + // --- [ glVertexAttribL1ui64ARB ] --- + + /** + * Specifies the 64-bit unsigned integer handle value of a generic vertex attribute. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the handle value + */ + public static native void glVertexAttribL1ui64ARB(@NativeType("GLuint") int index, @NativeType("GLuint64") long x); + + // --- [ glVertexAttribL1ui64vARB ] --- + + /** Unsafe version of: {@link #glVertexAttribL1ui64vARB VertexAttribL1ui64vARB} */ + public static native void nglVertexAttribL1ui64vARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribL1ui64ARB VertexAttribL1ui64ARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttribL1ui64vARB(@NativeType("GLuint") int index, @NativeType("GLuint64 const *") LongBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttribL1ui64vARB(index, memAddress(v)); + } + + // --- [ glGetVertexAttribLui64vARB ] --- + + /** Unsafe version of: {@link #glGetVertexAttribLui64vARB GetVertexAttribLui64vARB} */ + public static native void nglGetVertexAttribLui64vARB(int index, int pname, long params); + + /** + * Returns the 64-bit unsigned integer handle value of a generic vertex attribute parameter. + * + * @param index the generic vertex attribute index + * @param pname the parameter to query + * @param params a buffer in which to place the returned data + */ + public static void glGetVertexAttribLui64vARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetVertexAttribLui64vARB(index, pname, memAddress(params)); + } + + /** + * Returns the 64-bit unsigned integer handle value of a generic vertex attribute parameter. + * + * @param index the generic vertex attribute index + * @param pname the parameter to query + */ + @NativeType("void") + public static long glGetVertexAttribLui64ARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetVertexAttribLui64vARB(index, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glUniformHandleui64vARB UniformHandleui64vARB} */ + public static void glUniformHandleui64vARB(@NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] values) { + long __functionAddress = GL.getICD().glUniformHandleui64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, values.length, values, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformHandleui64vARB ProgramUniformHandleui64vARB} */ + public static void glProgramUniformHandleui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] values) { + long __functionAddress = GL.getICD().glProgramUniformHandleui64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, values.length, values, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribL1ui64vARB VertexAttribL1ui64vARB} */ + public static void glVertexAttribL1ui64vARB(@NativeType("GLuint") int index, @NativeType("GLuint64 const *") long[] v) { + long __functionAddress = GL.getICD().glVertexAttribL1ui64vARB; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glGetVertexAttribLui64vARB GetVertexAttribLui64vARB} */ + public static void glGetVertexAttribLui64vARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribLui64vARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(index, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBlendFuncExtended.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBlendFuncExtended.java new file mode 100644 index 000000000..9833f7884 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBlendFuncExtended.java @@ -0,0 +1,106 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_blend_func_extended extension. + * + *

    Traditional OpenGL includes fixed-function blending that combines source colors with the existing content of a render buffer in a variety of ways. A + * number of extensions have enhanced this functionality by adding further sources of blending weights and methods to combine them. However, the inputs to + * the fixed-function blending units are constrained to a source color (as output from fragment shading), destination color (as the current content of the + * frame buffer) or constants that may be used in their place.

    + * + *

    This extension adds new blending functions whereby a fragment shader may output two colors, one of which is treated as the source color, and the other + * used as a blending factor for either source or destination colors. Furthermore, this extension increases orthogonality by allowing the + * {@link GL11#GL_SRC_ALPHA_SATURATE SRC_ALPHA_SATURATE} function to be used as the destination weight.

    + * + *

    Requires {@link ARBFragmentShader ARB_fragment_shader} and {@link EXTGPUShader4 EXT_gpu_shader4}. Promoted to core in {@link GL33 OpenGL 3.3}.

    + */ +public class ARBBlendFuncExtended { + + static { GL.initialize(); } + + /** + * Accepted by the {@code src} and {@code dst} parameters of BlendFunc and BlendFunci, and by the {@code srcRGB}, {@code dstRGB}, {@code srcAlpha} and + * {@code dstAlpha} parameters of BlendFuncSeparate and BlendFuncSeparatei. + */ + public static final int + GL_SRC1_COLOR = 0x88F9, + GL_ONE_MINUS_SRC1_COLOR = 0x88FA, + GL_ONE_MINUS_SRC1_ALPHA = 0x88FB; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and GetDoublev. */ + public static final int GL_MAX_DUAL_SOURCE_DRAW_BUFFERS = 0x88FC; + + protected ARBBlendFuncExtended() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindFragDataLocationIndexed ] --- + + /** Unsafe version of: {@link #glBindFragDataLocationIndexed BindFragDataLocationIndexed} */ + public static void nglBindFragDataLocationIndexed(int program, int colorNumber, int index, long name) { + GL33C.nglBindFragDataLocationIndexed(program, colorNumber, index, name); + } + + /** + * Binds a user-defined varying out variable to a fragment shader color number and index. + * + * @param program the name of the program containing varying out variable whose binding to modify + * @param colorNumber the color number to bind the user-defined varying out variable to + * @param index the index of the color input to bind the user-defined varying out variable to + * @param name the name of the user-defined varying out variable whose binding to modify + */ + public static void glBindFragDataLocationIndexed(@NativeType("GLuint") int program, @NativeType("GLuint") int colorNumber, @NativeType("GLuint") int index, @NativeType("GLchar const *") ByteBuffer name) { + GL33C.glBindFragDataLocationIndexed(program, colorNumber, index, name); + } + + /** + * Binds a user-defined varying out variable to a fragment shader color number and index. + * + * @param program the name of the program containing varying out variable whose binding to modify + * @param colorNumber the color number to bind the user-defined varying out variable to + * @param index the index of the color input to bind the user-defined varying out variable to + * @param name the name of the user-defined varying out variable whose binding to modify + */ + public static void glBindFragDataLocationIndexed(@NativeType("GLuint") int program, @NativeType("GLuint") int colorNumber, @NativeType("GLuint") int index, @NativeType("GLchar const *") CharSequence name) { + GL33C.glBindFragDataLocationIndexed(program, colorNumber, index, name); + } + + // --- [ glGetFragDataIndex ] --- + + /** Unsafe version of: {@link #glGetFragDataIndex GetFragDataIndex} */ + public static int nglGetFragDataIndex(int program, long name) { + return GL33C.nglGetFragDataIndex(program, name); + } + + /** + * Queries the bindings of color indices to user-defined varying out variables. + * + * @param program the name of the program containing varying out variable whose binding to query + * @param name the name of the user-defined varying out variable whose index to query + */ + @NativeType("GLint") + public static int glGetFragDataIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + return GL33C.glGetFragDataIndex(program, name); + } + + /** + * Queries the bindings of color indices to user-defined varying out variables. + * + * @param program the name of the program containing varying out variable whose binding to query + * @param name the name of the user-defined varying out variable whose index to query + */ + @NativeType("GLint") + public static int glGetFragDataIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + return GL33C.glGetFragDataIndex(program, name); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBufferObject.java new file mode 100644 index 000000000..c83120376 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBufferObject.java @@ -0,0 +1,5 @@ +package org.lwjgl.opengl; + +public class ARBBufferObject extends ARBVertexBufferObject +{ +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBufferStorage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBufferStorage.java new file mode 100644 index 000000000..70fc6130f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBBufferStorage.java @@ -0,0 +1,742 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_buffer_storage extension. + * + *

    OpenGL has long supported buffer objects as a means of storing data that may be used to source vertex attributes, pixel data for textures, uniforms and + * other elements. In un-extended GL, buffer data stores are mutable - that is, they may be de-allocated or resized while they are in use. The + * {@link ARBTextureStorage ARB_texture_storage} extension added immutable storage for texture object (and was subsequently incorporated into OpenGL 4.2). This extension + * further applies the concept of immutable storage to buffer objects. If an implementation is aware of a buffer's immutability, it may be able to make + * certain assumptions or apply particular optimizations in order to increase performance or reliability.

    + * + *

    Furthermore, this extension allows applications to pass additional information about a requested allocation to the implementation which it may use to + * select memory heaps, caching behavior or allocation strategies.

    + * + *

    Finally, this extension introduces the concept of persistent client mappings of buffer objects, which allow clients to retain pointers to a buffer's + * data store returned as the result of a mapping, and to issue drawing commands while those mappings are in place.

    + * + *

    Promoted to core in {@link GL44 OpenGL 4.4}.

    + */ +public class ARBBufferStorage { + + static { GL.initialize(); } + + /** Accepted in the {@code flags} parameter of {@link #glBufferStorage BufferStorage} and {@link #glNamedBufferStorageEXT NamedBufferStorageEXT}. */ + public static final int + GL_MAP_PERSISTENT_BIT = 0x40, + GL_MAP_COHERENT_BIT = 0x80, + GL_DYNAMIC_STORAGE_BIT = 0x100, + GL_CLIENT_STORAGE_BIT = 0x200; + + /** Accepted by the {@code pname} parameter of {@code GetBufferParameter{i|i64}v}. */ + public static final int + GL_BUFFER_IMMUTABLE_STORAGE = 0x821F, + GL_BUFFER_STORAGE_FLAGS = 0x8220; + + /** Accepted by the {@code barriers} parameter of {@link GL42C#glMemoryBarrier MemoryBarrier}. */ + public static final int GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT = 0x4000; + + protected ARBBufferStorage() { + throw new UnsupportedOperationException(); + } + + // --- [ glBufferStorage ] --- + + /** + * Unsafe version of: {@link #glBufferStorage BufferStorage} + * + * @param size the size of the data store in basic machine units + */ + public static void nglBufferStorage(int target, long size, long data, int flags) { + GL44C.nglBufferStorage(target, size, data, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param size the size of the data store in basic machine units + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("GLsizeiptr") long size, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, size, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") ByteBuffer data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") ShortBuffer data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") IntBuffer data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") FloatBuffer data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") DoubleBuffer data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + // --- [ glNamedBufferStorageEXT ] --- + + /** + * Unsafe version of: {@link #glNamedBufferStorageEXT NamedBufferStorageEXT} + * + * @param size the size of the data store in basic machine units + */ + public static native void nglNamedBufferStorageEXT(int buffer, long size, long data, int flags); + + /** + * Behaves similarly to {@link #glBufferStorage BufferStorage}, except that the buffer whose storage is to be defined is specified by {@code buffer} rather than by the current + * binding to {@code target}. + * + * @param buffer the buffer object + * @param size the size of the data store in basic machine units + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorageEXT(@NativeType("GLuint") int buffer, @NativeType("GLsizeiptr") long size, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorageEXT(buffer, size, NULL, flags); + } + + /** + * Behaves similarly to {@link #glBufferStorage BufferStorage}, except that the buffer whose storage is to be defined is specified by {@code buffer} rather than by the current + * binding to {@code target}. + * + * @param buffer the buffer object + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorageEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") ByteBuffer data, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorageEXT(buffer, data.remaining(), memAddress(data), flags); + } + + /** + * Behaves similarly to {@link #glBufferStorage BufferStorage}, except that the buffer whose storage is to be defined is specified by {@code buffer} rather than by the current + * binding to {@code target}. + * + * @param buffer the buffer object + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorageEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") ShortBuffer data, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorageEXT(buffer, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data), flags); + } + + /** + * Behaves similarly to {@link #glBufferStorage BufferStorage}, except that the buffer whose storage is to be defined is specified by {@code buffer} rather than by the current + * binding to {@code target}. + * + * @param buffer the buffer object + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorageEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") IntBuffer data, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorageEXT(buffer, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), flags); + } + + /** + * Behaves similarly to {@link #glBufferStorage BufferStorage}, except that the buffer whose storage is to be defined is specified by {@code buffer} rather than by the current + * binding to {@code target}. + * + * @param buffer the buffer object + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorageEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") FloatBuffer data, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorageEXT(buffer, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), flags); + } + + /** + * Behaves similarly to {@link #glBufferStorage BufferStorage}, except that the buffer whose storage is to be defined is specified by {@code buffer} rather than by the current + * binding to {@code target}. + * + * @param buffer the buffer object + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorageEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") DoubleBuffer data, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorageEXT(buffer, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data), flags); + } + + /** Array version of: {@link #glBufferStorage BufferStorage} */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") short[] data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** Array version of: {@link #glBufferStorage BufferStorage} */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") int[] data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** Array version of: {@link #glBufferStorage BufferStorage} */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") float[] data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** Array version of: {@link #glBufferStorage BufferStorage} */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") double[] data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** Array version of: {@link #glNamedBufferStorageEXT NamedBufferStorageEXT} */ + public static void glNamedBufferStorageEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") short[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glNamedBufferStorageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 1, data, flags, __functionAddress); + } + + /** Array version of: {@link #glNamedBufferStorageEXT NamedBufferStorageEXT} */ + public static void glNamedBufferStorageEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") int[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glNamedBufferStorageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 2, data, flags, __functionAddress); + } + + /** Array version of: {@link #glNamedBufferStorageEXT NamedBufferStorageEXT} */ + public static void glNamedBufferStorageEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") float[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glNamedBufferStorageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 2, data, flags, __functionAddress); + } + + /** Array version of: {@link #glNamedBufferStorageEXT NamedBufferStorageEXT} */ + public static void glNamedBufferStorageEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") double[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glNamedBufferStorageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 3, data, flags, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCLEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCLEvent.java new file mode 100644 index 000000000..cdd00d236 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCLEvent.java @@ -0,0 +1,65 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; + +/** + * Native bindings to the ARB_cl_event extension. + * + *

    This extension allows creating OpenGL sync objects linked to OpenCL event objects, potentially improving efficiency of sharing images and buffers + * between the two APIs. The companion {@code cl_khr_gl_event} OpenCL extension provides the complementary functionality of creating an OpenCL event + * object from an OpenGL fence sync object.

    + * + *

    Requires {@link GL32 OpenGL 3.2} or {@link ARBSync ARB_sync}. Requires an OpenCL implementation supporting sharing event objects with OpenGL.

    + */ +public class ARBCLEvent { + + static { GL.initialize(); } + + /** Returned in {@code values} for {@link GL32C#glGetSynciv GetSynciv} {@code pname} {@link GL32#GL_OBJECT_TYPE OBJECT_TYPE}. */ + public static final int GL_SYNC_CL_EVENT_ARB = 0x8240; + + /** Returned in {@code values} for {@link GL32C#glGetSynciv GetSynciv} {@code pname} {@link GL32#GL_SYNC_CONDITION SYNC_CONDITION}. */ + public static final int GL_SYNC_CL_EVENT_COMPLETE_ARB = 0x8241; + + protected ARBCLEvent() { + throw new UnsupportedOperationException(); + } + + // --- [ glCreateSyncFromCLeventARB ] --- + + /** Unsafe version of: {@link #glCreateSyncFromCLeventARB CreateSyncFromCLeventARB} */ + public static native long nglCreateSyncFromCLeventARB(long context, long event, int flags); + + /** + * Creates a linked sync object. {@code context} and {@code event} must be handles to a valid OpenCL context and a valid event in that context, + * respectively. {@code context} must support sharing with GL, and must have been created with respect to the current GL context, or to a share group + * including the current GL context. + * + *

    The status of such a sync object depends on {@code event}. When the status of {@code event} is {@code CL_QUEUED}, {@code CL_SUBMITTED}, or + * {@code CL_RUNNING}, the status of the linked sync object will be {@link GL32#GL_UNSIGNALED UNSIGNALED}. When the status of {@code event} changes to {@code CL_COMPLETE}, the + * status of the linked sync object will become {@link GL32#GL_SIGNALED SIGNALED}.

    + * + *

    Creating a linked sync object places a reference on the linked OpenCL event object. When the sync object is deleted, the reference will be removed from + * the event object.

    + * + * @param context a valid OpenCL context + * @param event a valid OpenCL event + * @param flags must be 0 (placeholder for anticipated future extensions of sync object capabilities) + */ + @NativeType("GLsync") + public static long glCreateSyncFromCLeventARB(@NativeType("cl_context") long context, @NativeType("cl_event") long event, @NativeType("GLbitfield") int flags) { + if (CHECKS) { + check(context); + check(event); + } + return nglCreateSyncFromCLeventARB(context, event, flags); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClearBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClearBufferObject.java new file mode 100644 index 000000000..56591a63c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClearBufferObject.java @@ -0,0 +1,403 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_clear_buffer_object extension. + * + *

    Buffer objects are fundamental to the operation of OpenGL. Buffers are used as a source of data for vertices and indices, read through buffer textures + * in shaders, used to transfer texture and image data into and out of textures and framebuffers, and may be written to by operations such as transform + * feedback. OpenGL contains mechanisms to copy sections of buffers from one to another, but it has no mechanism to initialize the content of a buffer to a + * known value. In effect, it has {@code memcpy}, but not {@code memset}.

    + * + *

    This extension adds such a mechanism and has several use cases. Examples include clearing a pixel unpack buffer before transferring data to a texture or + * resetting buffer data to a known value before sparse updates through shader image stores or transform feedback.

    + * + *

    Requires {@link GL15 OpenGL 1.5}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBClearBufferObject { + + static { GL.initialize(); } + + protected ARBClearBufferObject() { + throw new UnsupportedOperationException(); + } + + // --- [ glClearBufferData ] --- + + /** Unsafe version of: {@link #glClearBufferData ClearBufferData} */ + public static void nglClearBufferData(int target, int internalformat, int format, int type, long data) { + GL43C.nglClearBufferData(target, internalformat, format, type, data); + } + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + // --- [ glClearBufferSubData ] --- + + /** Unsafe version of: {@link #glClearBufferSubData ClearBufferSubData} */ + public static void nglClearBufferSubData(int target, int internalformat, long offset, long size, int format, int type, long data) { + GL43C.nglClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + // --- [ glClearNamedBufferDataEXT ] --- + + /** Unsafe version of: {@link #glClearNamedBufferDataEXT ClearNamedBufferDataEXT} */ + public static native void nglClearNamedBufferDataEXT(int buffer, int internalformat, int format, int type, long data); + + /** + * DSA version of {@link #glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object to clear + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + nglClearNamedBufferDataEXT(buffer, internalformat, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link #glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object to clear + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + nglClearNamedBufferDataEXT(buffer, internalformat, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link #glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object to clear + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + nglClearNamedBufferDataEXT(buffer, internalformat, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link #glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object to clear + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + nglClearNamedBufferDataEXT(buffer, internalformat, format, type, memAddressSafe(data)); + } + + // --- [ glClearNamedBufferSubDataEXT ] --- + + /** Unsafe version of: {@link #glClearNamedBufferSubDataEXT ClearNamedBufferSubDataEXT} */ + public static native void nglClearNamedBufferSubDataEXT(int buffer, int internalformat, long offset, long size, int format, int type, long data); + + /** + * DSA version of {@link #glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object to clear + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + nglClearNamedBufferSubDataEXT(buffer, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link #glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object to clear + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + nglClearNamedBufferSubDataEXT(buffer, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link #glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object to clear + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + nglClearNamedBufferSubDataEXT(buffer, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link #glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object to clear + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + nglClearNamedBufferSubDataEXT(buffer, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + /** Array version of: {@link #glClearBufferData ClearBufferData} */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** Array version of: {@link #glClearBufferData ClearBufferData} */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** Array version of: {@link #glClearBufferData ClearBufferData} */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** Array version of: {@link #glClearBufferSubData ClearBufferSubData} */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** Array version of: {@link #glClearBufferSubData ClearBufferSubData} */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** Array version of: {@link #glClearBufferSubData ClearBufferSubData} */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** Array version of: {@link #glClearNamedBufferDataEXT ClearNamedBufferDataEXT} */ + public static void glClearNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffer, internalformat, format, type, data, __functionAddress); + } + + /** Array version of: {@link #glClearNamedBufferDataEXT ClearNamedBufferDataEXT} */ + public static void glClearNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffer, internalformat, format, type, data, __functionAddress); + } + + /** Array version of: {@link #glClearNamedBufferDataEXT ClearNamedBufferDataEXT} */ + public static void glClearNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffer, internalformat, format, type, data, __functionAddress); + } + + /** Array version of: {@link #glClearNamedBufferSubDataEXT ClearNamedBufferSubDataEXT} */ + public static void glClearNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferSubDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, internalformat, offset, size, format, type, data, __functionAddress); + } + + /** Array version of: {@link #glClearNamedBufferSubDataEXT ClearNamedBufferSubDataEXT} */ + public static void glClearNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferSubDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, internalformat, offset, size, format, type, data, __functionAddress); + } + + /** Array version of: {@link #glClearNamedBufferSubDataEXT ClearNamedBufferSubDataEXT} */ + public static void glClearNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferSubDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, internalformat, offset, size, format, type, data, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClearTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClearTexture.java new file mode 100644 index 000000000..9e12b3860 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClearTexture.java @@ -0,0 +1,344 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_clear_texture extension. + * + *

    Texture objects are fundamental to the operation of OpenGL. They are used as a source for texture sampling and destination for rendering as well as + * being accessed in shaders for image load/store operations. It is also possible to invalidate the contents of a texture. It is currently only possible to + * set texture image data to known values by uploading some or all of a image array from application memory or by attaching it to a framebuffer object and + * using {@link GL11C#glClear Clear} or the {@link GL30 OpenGL 3.0} ClearBuffer commands.

    + * + *

    Both uploading initial texture data and clearing by attaching to a framebuffer have potential disadvantages when one simply wants to initialize texture + * data to a known value. Uploading initial data requires the application to allocate a (potentially large) chunk of memory and transferring that to the + * GL. This can be a costly operation both in terms of memory bandwidth and power usage. Alternatively, attaching a texture level to a framebuffer to clear + * it may not be possible if the texture format isn't supported for rendering, or even if it is, attaching the image to a framebuffer object may cause the + * texture to be allocated in certain types of memory, which it may otherwise not need to be placed in.

    + * + *

    This extension solves these problems by providing a mechanism whereby the contents of a texture image array can be set to known values by using the + * {@link #glClearTexImage ClearTexImage} or {@link #glClearTexSubImage ClearTexSubImage} commands. These commands can also be useful for initializing an image that will be used for atomic shader + * operations.

    + * + *

    Requires {@link GL13 OpenGL 1.3}. Promoted to core in {@link GL44 OpenGL 4.4}.

    + */ +public class ARBClearTexture { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter for {@link GL42C#glGetInternalformativ GetInternalformativ} and {@link GL43C#glGetInternalformati64v GetInternalformati64v}. */ + public static final int GL_CLEAR_TEXTURE = 0x9365; + + protected ARBClearTexture() { + throw new UnsupportedOperationException(); + } + + // --- [ glClearTexSubImage ] --- + + /** Unsafe version of: {@link #glClearTexSubImage ClearTexSubImage} */ + public static void nglClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long data) { + GL44C.nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + // --- [ glClearTexImage ] --- + + /** Unsafe version of: {@link #glClearTexImage ClearTexImage} */ + public static void nglClearTexImage(int texture, int level, int format, int type, long data) { + GL44C.nglClearTexImage(texture, level, format, type, data); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** Array version of: {@link #glClearTexSubImage ClearTexSubImage} */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** Array version of: {@link #glClearTexSubImage ClearTexSubImage} */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** Array version of: {@link #glClearTexSubImage ClearTexSubImage} */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** Array version of: {@link #glClearTexSubImage ClearTexSubImage} */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** Array version of: {@link #glClearTexImage ClearTexImage} */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** Array version of: {@link #glClearTexImage ClearTexImage} */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** Array version of: {@link #glClearTexImage ClearTexImage} */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** Array version of: {@link #glClearTexImage ClearTexImage} */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClipControl.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClipControl.java new file mode 100644 index 000000000..d1a8e8ea7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBClipControl.java @@ -0,0 +1,59 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_clip_control extension. + * + *

    This extension provides additional clip control modes to configure how clip space is mapped to window space. This extension's goal is to 1) allow + * OpenGL to effectively match Direct3D's coordinate system conventions, and 2) potentially improve the numerical precision of the Z coordinate mapping.

    + * + *

    Promoted to core in {@link GL45 OpenGL 4.5}.

    + */ +public class ARBClipControl { + + static { GL.initialize(); } + + /** Accepted by the {@code origin} parameter of {@link #glClipControl ClipControl}. */ + public static final int + GL_LOWER_LEFT = 0x8CA1, + GL_UPPER_LEFT = 0x8CA2; + + /** Accepted by the {@code depth} parameter of {@link #glClipControl ClipControl}. */ + public static final int + GL_NEGATIVE_ONE_TO_ONE = 0x935E, + GL_ZERO_TO_ONE = 0x935F; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_CLIP_ORIGIN = 0x935C, + GL_CLIP_DEPTH_MODE = 0x935D; + + protected ARBClipControl() { + throw new UnsupportedOperationException(); + } + + // --- [ glClipControl ] --- + + /** + * Controls the clipping volume behavior. + * + *

    These parameters update the clip control origin and depth mode respectively. The initial value of the clip control origin is {@link GL20#GL_LOWER_LEFT LOWER_LEFT} and the + * initial value of the depth mode is {@link GL45C#GL_NEGATIVE_ONE_TO_ONE NEGATIVE_ONE_TO_ONE}.

    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if ClipControl is executed between the execution of {@link GL11#glBegin Begin} and the corresponding + * execution of {@link GL11#glEnd End}.

    + * + * @param origin the clip origin. One of:
    {@link GL20#GL_LOWER_LEFT LOWER_LEFT}{@link GL20#GL_UPPER_LEFT UPPER_LEFT}
    + * @param depth the clip depth mode. One of:
    {@link GL45C#GL_NEGATIVE_ONE_TO_ONE NEGATIVE_ONE_TO_ONE}{@link GL45C#GL_ZERO_TO_ONE ZERO_TO_ONE}
    + */ + public static void glClipControl(@NativeType("GLenum") int origin, @NativeType("GLenum") int depth) { + GL45C.glClipControl(origin, depth); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBColorBufferFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBColorBufferFloat.java new file mode 100644 index 000000000..5e9add4aa --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBColorBufferFloat.java @@ -0,0 +1,62 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_color_buffer_float extension. + * + *

    The standard OpenGL pipeline is based on a fixed-point pipeline. While color components are nominally floating-point values in the pipeline, components + * are frequently clamped to the range [0,1] to accomodate the fixed-point color buffer representation and allow for fixed-point computational hardware.

    + * + *

    This extension adds pixel formats or visuals with floating-point RGBA color components and controls for clamping of color components within the pipeline.

    + * + *

    For a floating-point RGBA pixel format, the size of each float components is specified using the same attributes that are used for defining the size of + * fixed-point components. 32-bit floating-point components are in the standard IEEE float format. 16-bit floating-point components have 1 sign bit, 5 + * exponent bits, and 10 mantissa bits.

    + * + *

    Clamping control provides a way to disable certain color clamps and allow programs, and the fixed-function pipeline, to deal in unclamped colors. There + * are controls to modify clamping of vertex colors, clamping of fragment colors throughout the pipeline, and for pixel return data.

    + * + *

    The default state for fragment clamping is {@link #GL_FIXED_ONLY_ARB FIXED_ONLY_ARB}, which has the behavior of clamping colors for fixed-point color buffers and not clamping + * colors for floating-pont color buffers.

    + * + *

    Vertex colors are clamped by default.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public class ARBColorBufferFloat { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_RGBA_FLOAT_MODE_ARB = 0x8820; + + /** Accepted by the {@code target} parameter of ClampColorARB and the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_CLAMP_VERTEX_COLOR_ARB = 0x891A, + GL_CLAMP_FRAGMENT_COLOR_ARB = 0x891B, + GL_CLAMP_READ_COLOR_ARB = 0x891C; + + /** Accepted by the {@code clamp} parameter of ClampColorARB. */ + public static final int GL_FIXED_ONLY_ARB = 0x891D; + + protected ARBColorBufferFloat() { + throw new UnsupportedOperationException(); + } + + // --- [ glClampColorARB ] --- + + /** + * Controls color clamping. + * + * @param target the color target. One of:
    {@link #GL_CLAMP_VERTEX_COLOR_ARB CLAMP_VERTEX_COLOR_ARB}{@link #GL_CLAMP_FRAGMENT_COLOR_ARB CLAMP_FRAGMENT_COLOR_ARB}{@link #GL_CLAMP_READ_COLOR_ARB CLAMP_READ_COLOR_ARB}
    + * @param clamp the new clamping state. One of:
    {@link GL11#GL_TRUE TRUE}{@link GL11#GL_FALSE FALSE}{@link #GL_FIXED_ONLY_ARB FIXED_ONLY_ARB}
    + */ + public static native void glClampColorARB(@NativeType("GLenum") int target, @NativeType("GLenum") int clamp); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCompressedTexturePixelStorage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCompressedTexturePixelStorage.java new file mode 100644 index 000000000..1dfe261f6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCompressedTexturePixelStorage.java @@ -0,0 +1,41 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_compressed_texture_pixel_storage extension. + * + *

    This extension expands the functionality of the {@link GL11C#glPixelStorei PixelStorei} modes to allow {@link GL11#GL_UNPACK_ROW_LENGTH UNPACK_ROW_LENGTH}, {@link GL11#GL_UNPACK_SKIP_ROWS UNPACK_SKIP_ROWS}, + * {@link GL11#GL_UNPACK_SKIP_PIXELS UNPACK_SKIP_PIXELS}, {@link GL12#GL_UNPACK_IMAGE_HEIGHT UNPACK_IMAGE_HEIGHT} and {@link GL12#GL_UNPACK_SKIP_IMAGES UNPACK_SKIP_IMAGES} to affect the operation of CompressedTexImage*D and + * CompressedTexSubImage*D. Similarly, it also allows {@link GL11#GL_PACK_ROW_LENGTH PACK_ROW_LENGTH}, {@link GL11#GL_PACK_SKIP_ROWS PACK_SKIP_ROWS}, {@link GL11#GL_PACK_SKIP_PIXELS PACK_SKIP_PIXELS}, {@link GL12#GL_PACK_IMAGE_HEIGHT PACK_IMAGE_HEIGHT} and + * {@link GL12#GL_PACK_SKIP_IMAGES PACK_SKIP_IMAGES} to affect the operation of GetCompressedTexImage*D. This allows data to be transferred to or from a specified sub-rectangle of a + * larger compressed image.

    + * + *

    This extension is designed primarily to support compressed image formats with fixed-size blocks. To use this new mechanism, an application should + * program new parameters UNPACK_COMPRESSED_BLOCK_{WIDTH,HEIGHT,DEPTH,SIZE} to indicate the number of texels in each dimension of the fixed-size block as + * well as the number of bytes consumed by each block. These parameters, in addition to the existing PixelStore parameters, are used to identify a + * collection of bytes in client memory or a buffer object's data store to use as compressed texture data. This operation is unlikely to have the desired + * results if the client programs a block size inconsistent with the underlying compressed image format, or if the compressed image format has + * variable-sized blocks.

    + * + *

    Requires {@link GL21 OpenGL 2.1}. Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ +public final class ARBCompressedTexturePixelStorage { + + /** Accepted by the {@code pname} parameter of PixelStore[fi], GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_UNPACK_COMPRESSED_BLOCK_WIDTH = 0x9127, + GL_UNPACK_COMPRESSED_BLOCK_HEIGHT = 0x9128, + GL_UNPACK_COMPRESSED_BLOCK_DEPTH = 0x9129, + GL_UNPACK_COMPRESSED_BLOCK_SIZE = 0x912A, + GL_PACK_COMPRESSED_BLOCK_WIDTH = 0x912B, + GL_PACK_COMPRESSED_BLOCK_HEIGHT = 0x912C, + GL_PACK_COMPRESSED_BLOCK_DEPTH = 0x912D, + GL_PACK_COMPRESSED_BLOCK_SIZE = 0x912E; + + private ARBCompressedTexturePixelStorage() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBComputeShader.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBComputeShader.java new file mode 100644 index 000000000..2da985a5d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBComputeShader.java @@ -0,0 +1,121 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_compute_shader extension. + * + *

    Recent graphics hardware has become extremely powerful and a strong desire to harness this power for work (both graphics and non-graphics) that does not + * fit the traditional graphics pipeline well has emerged. To address this, this extension adds a new single-stage program type known as a compute program. + * This program may contain one or more compute shaders which may be launched in a manner that is essentially stateless. This allows arbitrary workloads to + * be sent to the graphics hardware with minimal disturbance to the GL state machine.

    + * + *

    In most respects, a compute program is identical to a traditional OpenGL program object, with similar status, uniforms, and other such properties. It + * has access to many of the same resources as fragment and other shader types, such as textures, image variables, atomic counters, and so on. However, it + * has no predefined inputs nor any fixed-function outputs. It cannot be part of a pipeline and its visible side effects are through its actions on images + * and atomic counters.

    + * + *

    OpenCL is another solution for using graphics processors as generalized compute devices. This extension addresses a different need. For example, OpenCL + * is designed to be usable on a wide range of devices ranging from CPUs, GPUs, and DSPs through to FPGAs. While one could implement GL on these types of + * devices, the target here is clearly GPUs. Another difference is that OpenCL is more full featured and includes features such as multiple devices, + * asynchronous queues and strict IEEE semantics for floating point operations. This extension follows the semantics of OpenGL - implicitly synchronous, + * in-order operation with single-device, single queue logical architecture and somewhat more relaxed numerical precision requirements. Although not as + * feature rich, this extension offers several advantages for applications that can tolerate the omission of these features. Compute shaders are written in + * GLSL, for example and so code may be shared between compute and other shader types. Objects are created and owned by the same context as the rest of the + * GL, and therefore no interoperability API is required and objects may be freely used by both compute and graphics simultaneously without acquire-release + * semantics or object type translation.

    + * + *

    Requires {@link GL42 OpenGL 4.2}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBComputeShader { + + static { GL.initialize(); } + + /** Accepted by the {@code type} parameter of CreateShader and returned in the {@code params} parameter by GetShaderiv. */ + public static final int GL_COMPUTE_SHADER = 0x91B9; + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetFloatv, GetDoublev and GetInteger64v. */ + public static final int + GL_MAX_COMPUTE_UNIFORM_BLOCKS = 0x91BB, + GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS = 0x91BC, + GL_MAX_COMPUTE_IMAGE_UNIFORMS = 0x91BD, + GL_MAX_COMPUTE_SHARED_MEMORY_SIZE = 0x8262, + GL_MAX_COMPUTE_UNIFORM_COMPONENTS = 0x8263, + GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = 0x8264, + GL_MAX_COMPUTE_ATOMIC_COUNTERS = 0x8265, + GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = 0x8266, + GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS = 0x90EB; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v, GetBooleani_v, GetFloati_v, GetDoublei_v and GetInteger64i_v. */ + public static final int + GL_MAX_COMPUTE_WORK_GROUP_COUNT = 0x91BE, + GL_MAX_COMPUTE_WORK_GROUP_SIZE = 0x91BF; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_COMPUTE_WORK_GROUP_SIZE = 0x8267; + + /** Accepted by the {@code pname} parameter of GetActiveUniformBlockiv. */ + public static final int GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER = 0x90EC; + + /** Accepted by the {@code pname} parameter of GetActiveAtomicCounterBufferiv. */ + public static final int GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER = 0x90ED; + + /** Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. */ + public static final int GL_DISPATCH_INDIRECT_BUFFER = 0x90EE; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF; + + /** Accepted by the {@code stages} parameter of UseProgramStages. */ + public static final int GL_COMPUTE_SHADER_BIT = 0x20; + + protected ARBComputeShader() { + throw new UnsupportedOperationException(); + } + + // --- [ glDispatchCompute ] --- + + /** + * Launches one or more compute work groups. + * + * @param num_groups_x the number of work groups to be launched in the X dimension + * @param num_groups_y the number of work groups to be launched in the Y dimension + * @param num_groups_z the number of work groups to be launched in the Z dimension + */ + public static void glDispatchCompute(@NativeType("GLuint") int num_groups_x, @NativeType("GLuint") int num_groups_y, @NativeType("GLuint") int num_groups_z) { + GL43C.glDispatchCompute(num_groups_x, num_groups_y, num_groups_z); + } + + // --- [ glDispatchComputeIndirect ] --- + + /** + * Launches one or more compute work groups using parameters stored in a buffer. + * + *

    The parameters addressed by indirect are packed a structure, which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint num_groups_x;
    +     *     uint num_groups_y;
    +     *     uint num_groups_z;
    +     * } DispatchIndirectCommand;
    + * + *

    A call to {@code glDispatchComputeIndirect} is equivalent, assuming no errors are generated, to:

    + * + *
    
    +     * cmd = (const DispatchIndirectCommand *)indirect;
    +     * glDispatchCompute(cmd->num_groups_x, cmd->num_groups_y, cmd->num_groups_z);
    + * + * @param indirect the offset into the buffer object currently bound to the {@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER} buffer target at which the dispatch parameters are + * stored. + */ + public static void glDispatchComputeIndirect(@NativeType("GLintptr") long indirect) { + GL43C.glDispatchComputeIndirect(indirect); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBComputeVariableGroupSize.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBComputeVariableGroupSize.java new file mode 100644 index 000000000..a29312c63 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBComputeVariableGroupSize.java @@ -0,0 +1,67 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_compute_variable_group_size extension. + * + *

    This extension allows applications to write generic compute shaders that operate on work groups with arbitrary dimensions. Instead of specifying a fixed + * work group size in the compute shader, an application can use a compute shader using the {@code local_size_variable} layout qualifer to indicate a + * variable work group size. When using such compute shaders, the new command DispatchComputeGroupSizeARB should be used to specify both a work group size + * and work group count.

    + * + *

    In this extension, compute shaders with fixed group sizes must be dispatched by {@link GL43C#glDispatchCompute DispatchCompute} and {@link GL43C#glDispatchComputeIndirect DispatchComputeIndirect}. Compute + * shaders with variable group sizes must be dispatched via {@link #glDispatchComputeGroupSizeARB DispatchComputeGroupSizeARB}. No support is provided in this extension for indirect dispatch + * of compute shaders with a variable group size.

    + * + *

    Requires {@link GL43 OpenGL 4.3} or {@link ARBComputeShader ARB_compute_shader}.

    + */ +public class ARBComputeVariableGroupSize { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetFloatv, GetDoublev and GetInteger64v. */ + public static final int + GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB = 0x9344, + GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB = 0x90EB; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v, GetBooleani_v, GetFloati_v, GetDoublei_v and GetInteger64i_v. */ + public static final int + GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB = 0x9345, + GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB = 0x91BF; + + protected ARBComputeVariableGroupSize() { + throw new UnsupportedOperationException(); + } + + // --- [ glDispatchComputeGroupSizeARB ] --- + + /** + * Launches one or more compute work groups, with arbitrary dimensions. + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated by DispatchComputeGroupSizeARB if the active program for the compute shader stage has a fixed work group + * size.

    + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated by DispatchComputeGroupSizeARB if any of {@code group_size_x}, {@code group_size_y}, or {@code group_size_z} is + * less than or equal to zero or greater than the maximum local work group size for compute shaders with variable group size + * ({@link #GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB}) in the corresponding dimension.

    + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated by DispatchComputeGroupSizeARB if the product of {@code group_size_x}, {@code group_size_y}, and + * {@code group_size_z} exceeds the implementation-dependent maximum local work group invocation count for compute shaders with variable group size + * ({@link #GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB}).

    + * + * @param num_groups_x the number of work groups to be launched in the X dimension + * @param num_groups_y the number of work groups to be launched in the Y dimension + * @param num_groups_z the number of work groups to be launched in the Z dimension + * @param group_size_x the group size in the X dimension + * @param group_size_y the group size in the Y dimension + * @param group_size_z the group size in the Z dimension + */ + public static native void glDispatchComputeGroupSizeARB(@NativeType("GLuint") int num_groups_x, @NativeType("GLuint") int num_groups_y, @NativeType("GLuint") int num_groups_z, @NativeType("GLuint") int group_size_x, @NativeType("GLuint") int group_size_y, @NativeType("GLuint") int group_size_z); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBConditionalRenderInverted.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBConditionalRenderInverted.java new file mode 100644 index 000000000..153257dae --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBConditionalRenderInverted.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_conditional_render_inverted extension. + * + *

    This extension adds new modes to {@link GL30C#glBeginConditionalRender BeginConditionalRender} which invert the condition used to determine whether to draw or not.

    + * + *

    Requires {@link GL30 OpenGL 3.0}. Promoted to core in {@link GL45 OpenGL 4.5}.

    + */ +public final class ARBConditionalRenderInverted { + + /** Accepted by the {@code mode} parameter of {@link GL30C#glBeginConditionalRender BeginConditionalRender}. */ + public static final int + GL_QUERY_WAIT_INVERTED = 0x8E17, + GL_QUERY_NO_WAIT_INVERTED = 0x8E18, + GL_QUERY_BY_REGION_WAIT_INVERTED = 0x8E19, + GL_QUERY_BY_REGION_NO_WAIT_INVERTED = 0x8E1A; + + private ARBConditionalRenderInverted() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCopyBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCopyBuffer.java new file mode 100644 index 000000000..d2d78511a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCopyBuffer.java @@ -0,0 +1,59 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_copy_buffer extension. + * + *

    This extension provides a mechanism to do an accelerated copy from one buffer object to another. This may be useful to load buffer objects in a "loading + * thread" while minimizing cost and synchronization effort in the "rendering thread."

    + * + *

    Promoted to core in {@link GL31 OpenGL 3.1}.

    + */ +public class ARBCopyBuffer { + + static { GL.initialize(); } + + /** + * Accepted by the target parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, MapBufferRange, + * FlushMappedBufferRange, GetBufferParameteriv, BindBufferRange, BindBufferBase, and CopyBufferSubData. + */ + public static final int + GL_COPY_READ_BUFFER = 0x8F36, + GL_COPY_WRITE_BUFFER = 0x8F37; + + protected ARBCopyBuffer() { + throw new UnsupportedOperationException(); + } + + // --- [ glCopyBufferSubData ] --- + + /** + * Copies all or part of one buffer object's data store to the data store of another buffer object. + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if any of readoffset, writeoffset, or size are negative, if readoffset+size exceeds the size of the buffer object + * bound to readtarget, or if writeoffset+size exceeds the size of the buffer object bound to writetarget.

    + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if the same buffer object is bound to both readtarget and writetarget, and the ranges [readoffset, readoffset+size) + * and [writeoffset, writeoffset+size) overlap.

    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if zero is bound to readtarget or writetarget.

    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if the buffer objects bound to either readtarget or writetarget are mapped.

    + * + * @param readTarget the source buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL31C#GL_COPY_READ_BUFFER COPY_READ_BUFFER}{@link GL31C#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}
    {@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}{@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31C#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL31C#GL_UNIFORM_BUFFER UNIFORM_BUFFER}
    + * @param writeTarget the destination buffer object target + * @param readOffset the source buffer object offset, in bytes + * @param writeOffset the destination buffer object offset, in bytes + * @param size the number of bytes to copy + */ + public static void glCopyBufferSubData(@NativeType("GLenum") int readTarget, @NativeType("GLenum") int writeTarget, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size) { + GL31C.glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCopyImage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCopyImage.java new file mode 100644 index 000000000..0feb0090e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCopyImage.java @@ -0,0 +1,60 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_copy_image extension. + * + *

    This extension enables efficient image data transfer between image objects (i.e. textures and renderbuffers) without the need to bind the objects or + * otherwise configure the rendering pipeline.

    + * + *

    This is accomplised by adding a new entry-point {@link #glCopyImageSubData CopyImageSubData}, which takes a named source and destination.

    + * + *

    CopyImageSubData does not perform general-purpose conversions such as scaling, resizing, blending, color-space, or format conversions. It should be + * considered to operate in a manner similar to a CPU {@code memcpy}, but using the GPU for the copy.

    + * + *

    CopyImageSubData supports copies between images with different internal formats, if the formats are compatible for TextureViews.

    + * + *

    CopyImageSubData also supports copying between compressed and uncompressed images if the compressed block / uncompressed texel sizes are the same.

    + * + *

    Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBCopyImage { + + static { GL.initialize(); } + + protected ARBCopyImage() { + throw new UnsupportedOperationException(); + } + + // --- [ glCopyImageSubData ] --- + + /** + * Performs a raw data copy between two images. + * + * @param srcName the name of a texture or renderbuffer object from which to copy + * @param srcTarget the target representing the namespace of the source name {@code srcName} + * @param srcLevel the mipmap level to read from the source + * @param srcX the X coordinate of the left edge of the souce region to copy + * @param srcY the Y coordinate of the top edge of the souce region to copy + * @param srcZ the Z coordinate of the near edge of the souce region to copy + * @param dstName the name of a texture or renderbuffer object to which to copy + * @param dstTarget the target representing the namespace of the destination name {@code dstName} + * @param dstLevel the mipmap level to write to the source + * @param dstX the X coordinate of the left edge of the destination region + * @param dstY the Y coordinate of the top edge of the destination region + * @param dstZ the Z coordinate of the near edge of the destination region + * @param srcWidth the width of the region to be copied + * @param srcHeight the height of the region to be copied + * @param srcDepth the depth of the region to be copied + */ + public static void glCopyImageSubData(@NativeType("GLuint") int srcName, @NativeType("GLenum") int srcTarget, @NativeType("GLint") int srcLevel, @NativeType("GLint") int srcX, @NativeType("GLint") int srcY, @NativeType("GLint") int srcZ, @NativeType("GLuint") int dstName, @NativeType("GLenum") int dstTarget, @NativeType("GLint") int dstLevel, @NativeType("GLint") int dstX, @NativeType("GLint") int dstY, @NativeType("GLint") int dstZ, @NativeType("GLsizei") int srcWidth, @NativeType("GLsizei") int srcHeight, @NativeType("GLsizei") int srcDepth) { + GL43C.glCopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCullDistance.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCullDistance.java new file mode 100644 index 000000000..8faf013f1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBCullDistance.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_cull_distance extension. + * + *

    This extension adds a new GLSL {@code gl_CullDistance} shader output, similar to {@code gl_ClipDistance}, but used for whole primitive culling.

    + * + *

    This new stage in the pipeline is added as part of the primitive clipping stage.

    + * + *

    Requires {@link GL30 OpenGL 3.0}. Promoted to core in {@link GL45 OpenGL 4.5}.

    + */ +public final class ARBCullDistance { + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v. */ + public static final int + GL_MAX_CULL_DISTANCES = 0x82F9, + GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES = 0x82FA; + + private ARBCullDistance() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDebugOutput.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDebugOutput.java new file mode 100644 index 000000000..2e4910032 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDebugOutput.java @@ -0,0 +1,393 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_debug_output extension. + * + *

    This extension allows the GL to notify applications when various events occur that may be useful during application development and debugging.

    + * + *

    These events are represented in the form of enumerable messages with a human-readable string representation. Examples of debug events include incorrect + * use of the GL, warnings of undefined behavior, and performance warnings.

    + * + *

    A message is uniquely identified by a source, a type and an implementation-dependent ID within the source and type pair.

    + * + *

    A message's source identifies the origin of the message and can either describe components of the GL, the window system, third-party external sources + * such as external debuggers, or even the application itself.

    + * + *

    The type of the message roughly identifies the nature of the event that caused the message. Examples include errors, performance warnings, or warnings + * about undefined behavior.

    + * + *

    A message's ID for a given source and type further distinguishes messages within those groups. For example, an error caused by a negative parameter + * value or an invalid internal texture format are both errors generated by the API, but would likely have different message IDs.

    + * + *

    Each message is also assigned to a severity level that denotes roughly how "important" that message is in comparison to other messages across all + * sources and types. For example, notification of a GL error would likely have a higher severity than a performance warning due to redundant state + * changes.

    + * + *

    Finally, every message contains an implementation-dependent string representation that provides a useful description of the event.

    + * + *

    Messages are communicated to the application through an application-defined callback function that is called by the GL implementation on each debug + * message. The motivation for the callback routine is to free application developers from actively having to query whether a GL error, or any other + * debuggable event has happened after each call to a GL function. With a callback, developers can keep their code free of debug checks, and only have to + * react to messages as they occur. In situations where using a callback is not possible, a message log is also provided that stores copies of recent + * messages until they are actively queried.

    + * + *

    To control the volume of debug output, messages can be disabled either individually by ID, or entire groups of messages can be turned off based on + * combination of source and type.

    + * + *

    The only requirement on the minimum quantity and type of messages that implementations of this extension must support is that some sort of message must + * be sent notifying the application whenever any GL error occurs. Any further messages are left to the implementation. Implementations do not have to + * output messages from all sources nor do they have to use all types of messages listed by this extension, and both new sources and types can be added by + * other extensions.

    + * + *

    For performance reasons it is recommended, but not required, that implementations restrict supporting this extension only to contexts created using the + * debug flag as provided by {@link WGLARBCreateContext WGL_ARB_create_context} or {@link GLXARBCreateContext GLX_ARB_create_context}. This extension places no limits on any other functionality + * provided by debug contexts through other extensions.

    + */ +public class ARBDebugOutput { + + static { GL.initialize(); } + + /** + * Tokens accepted by the {@code target} parameters of Enable, Disable, and IsEnabled. + * + *

    The behavior of how and when the GL driver is allowed to generate debug messages, and subsequently either call back to the application or place the + * message in the debug message log, is affected by the state DEBUG_OUTPUT_SYNCHRONOUS_ARB. This state can be modified by the {@link GL11#glEnable Enable} and + * {@link GL11#glDisable Disable} commands. Its initial value is {@link GL11#GL_FALSE FALSE}.

    + * + *

    When DEBUG_OUTPUT_SYNCHRONOUS_ARB is disabled, the driver is optionally allowed to concurrently call the debug callback routine from potentially + * multiple threads, including threads that the context that generated the message is not currently bound to. The implementation may also call the callback + * routine asynchronously after the GL command that generated the message has already returned. The application is fully responsible for ensuring thread + * safety due to debug callbacks under these circumstances. In this situation the {@code userParam} value may be helpful in identifying which application + * thread's command originally generated the debug callback.

    + * + *

    When DEBUG_OUTPUT_SYNCHRONOUS_ARB is enabled, the driver guarantees synchronous calls to the callback routine by the context. When synchronous callbacks + * are enabled, all calls to the callback routine will be made by the thread that owns the current context; all such calls will be made serially by the + * current context; and each call will be made before the GL command that generated the debug message is allowed to return.

    + * + *

    When no callback is specified and DEBUG_OUTPUT_SYNCHRONOUS_ARB is disabled, the driver can still asynchronously place messages in the debug message log, + * even after the context thread has returned from the GL function that generated those messages. When DEBUG_OUTPUT_SYNCHRONOUS_ARB is enabled, the driver + * guarantees that all messages are added to the log before the GL function returns.

    + * + *

    Enabling synchronous debug output greatly simplifies the responsibilities of the application for making its callback functions thread-safe, but may + * potentially result in drastically reduced driver performance.

    + * + *

    The DEBUG_OUTPUT_SYNCHRONOUS_ARB only guarantees intra-context synchronization for the callbacks of messages generated by that context, and does not + * guarantee synchronization across multiple contexts. If multiple contexts are concurrently used by the application, it is allowed for those contexts to + * also concurrently call their designated callbacks, and the application is responsible for handling thread safety in that situation even if + * DEBUG_OUTPUT_SYNCHRONOUS_ARB is enabled in all contexts.

    + */ + public static final int GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB = 0x8242; + + /** Tokens accepted by the {@code value} parameters of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_DEBUG_MESSAGE_LENGTH_ARB = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES_ARB = 0x9144, + GL_DEBUG_LOGGED_MESSAGES_ARB = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB = 0x8243; + + /** Tokens accepted by the {@code pname} parameter of GetPointerv. */ + public static final int + GL_DEBUG_CALLBACK_FUNCTION_ARB = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM_ARB = 0x8245; + + /** + * Tokens accepted or provided by the {@code source} parameters of DebugMessageControlARB, DebugMessageInsertARB and DEBUGPROCARB, and the {@code sources} + * parameter of GetDebugMessageLogARB. + */ + public static final int + GL_DEBUG_SOURCE_API_ARB = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER_ARB = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY_ARB = 0x8249, + GL_DEBUG_SOURCE_APPLICATION_ARB = 0x824A, + GL_DEBUG_SOURCE_OTHER_ARB = 0x824B; + + /** + * Tokens accepted or provided by the {@code type} parameters of DebugMessageControlARB, DebugMessageInsertARB and DEBUGPROCARB, and the {@code types} + * parameter of GetDebugMessageLogARB. + */ + public static final int + GL_DEBUG_TYPE_ERROR_ARB = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB = 0x824E, + GL_DEBUG_TYPE_PORTABILITY_ARB = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE_ARB = 0x8250, + GL_DEBUG_TYPE_OTHER_ARB = 0x8251; + + /** + * Tokens accepted or provided by the {@code severity} parameters of DebugMessageControlARB, DebugMessageInsertARB and DEBUGPROCARB callback functions, and + * the {@code severities} parameter of GetDebugMessageLogARB. + */ + public static final int + GL_DEBUG_SEVERITY_HIGH_ARB = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM_ARB = 0x9147, + GL_DEBUG_SEVERITY_LOW_ARB = 0x9148; + + protected ARBDebugOutput() { + throw new UnsupportedOperationException(); + } + + // --- [ glDebugMessageControlARB ] --- + + /** + * Unsafe version of: {@link #glDebugMessageControlARB DebugMessageControlARB} + * + * @param count the number of message IDs in {@code ids} + */ + public static native void nglDebugMessageControlARB(int source, int type, int severity, int count, long ids, boolean enabled); + + /** + * Controls the volume of debug output by disabling specific or groups of messages. + * + *

    If {@code enabled} is {@link GL11#GL_TRUE TRUE}, the referenced subset of messages will be enabled. If {@link GL11#GL_FALSE FALSE}, then those messages will be disabled.

    + * + *

    This command can reference different subsets of messages by first considering the set of all messages, and filtering out messages based on the following + * ways:

    + * + *
      + *
    • If {@code source} is not {@link GL11#GL_DONT_CARE DONT_CARE}, then all messages whose source does not match {@code source} will not be referenced.
    • + *
    • If {@code type} is not {@link GL11#GL_DONT_CARE DONT_CARE}, then all messages whose type does not match {@code type} will not be referenced.
    • + *
    • If {@code severity} is not {@link GL11#GL_DONT_CARE DONT_CARE}, then all messages whose severity level does not match {@code severity} will not be referenced.
    • + *
    • If {@code count} is greater than zero, then {@code ids} is an array of {@code count} message IDs for the specified combination of {@code source} and + * {@code type}. In this case, if {@code source} or {@code type} is {@link GL11#GL_DONT_CARE DONT_CARE}, or {@code severity} is not {@link GL11#GL_DONT_CARE DONT_CARE}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. If {@code count} is zero, the value if {@code ids} is ignored.
    • + *
    + * + *

    Although messages are grouped into an implicit hierarchy by their sources and types, there is no explicit per-source, per-type or per-severity enabled + * state. Instead, the enabled state is stored individually for each message. There is no difference between disabling all messages from one source in a + * single call, and individually disabling all messages from that source using their types and IDs.

    + * + * @param source the message source. One of:
    {@link #GL_DEBUG_SOURCE_API_ARB DEBUG_SOURCE_API_ARB}{@link #GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB DEBUG_SOURCE_WINDOW_SYSTEM_ARB}
    {@link #GL_DEBUG_SOURCE_SHADER_COMPILER_ARB DEBUG_SOURCE_SHADER_COMPILER_ARB}{@link #GL_DEBUG_SOURCE_THIRD_PARTY_ARB DEBUG_SOURCE_THIRD_PARTY_ARB}
    {@link #GL_DEBUG_SOURCE_APPLICATION_ARB DEBUG_SOURCE_APPLICATION_ARB}{@link #GL_DEBUG_SOURCE_OTHER_ARB DEBUG_SOURCE_OTHER_ARB}
    + * @param type the message type. One of:
    {@link #GL_DEBUG_TYPE_ERROR_ARB DEBUG_TYPE_ERROR_ARB}{@link #GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB}
    {@link #GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB}{@link #GL_DEBUG_TYPE_PORTABILITY_ARB DEBUG_TYPE_PORTABILITY_ARB}
    {@link #GL_DEBUG_TYPE_PERFORMANCE_ARB DEBUG_TYPE_PERFORMANCE_ARB}{@link #GL_DEBUG_TYPE_OTHER_ARB DEBUG_TYPE_OTHER_ARB}
    + * @param severity the message severity level. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH_ARB DEBUG_SEVERITY_HIGH_ARB}{@link #GL_DEBUG_SEVERITY_MEDIUM_ARB DEBUG_SEVERITY_MEDIUM_ARB}{@link #GL_DEBUG_SEVERITY_LOW_ARB DEBUG_SEVERITY_LOW_ARB}
    + * @param ids the message IDs to enable or disable + * @param enabled whether to enable or disable the references subset of messages + */ + public static void glDebugMessageControlARB(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @Nullable @NativeType("GLuint const *") IntBuffer ids, @NativeType("GLboolean") boolean enabled) { + nglDebugMessageControlARB(source, type, severity, remainingSafe(ids), memAddressSafe(ids), enabled); + } + + /** + * Controls the volume of debug output by disabling specific or groups of messages. + * + *

    If {@code enabled} is {@link GL11#GL_TRUE TRUE}, the referenced subset of messages will be enabled. If {@link GL11#GL_FALSE FALSE}, then those messages will be disabled.

    + * + *

    This command can reference different subsets of messages by first considering the set of all messages, and filtering out messages based on the following + * ways:

    + * + *
      + *
    • If {@code source} is not {@link GL11#GL_DONT_CARE DONT_CARE}, then all messages whose source does not match {@code source} will not be referenced.
    • + *
    • If {@code type} is not {@link GL11#GL_DONT_CARE DONT_CARE}, then all messages whose type does not match {@code type} will not be referenced.
    • + *
    • If {@code severity} is not {@link GL11#GL_DONT_CARE DONT_CARE}, then all messages whose severity level does not match {@code severity} will not be referenced.
    • + *
    • If {@code count} is greater than zero, then {@code ids} is an array of {@code count} message IDs for the specified combination of {@code source} and + * {@code type}. In this case, if {@code source} or {@code type} is {@link GL11#GL_DONT_CARE DONT_CARE}, or {@code severity} is not {@link GL11#GL_DONT_CARE DONT_CARE}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. If {@code count} is zero, the value if {@code ids} is ignored.
    • + *
    + * + *

    Although messages are grouped into an implicit hierarchy by their sources and types, there is no explicit per-source, per-type or per-severity enabled + * state. Instead, the enabled state is stored individually for each message. There is no difference between disabling all messages from one source in a + * single call, and individually disabling all messages from that source using their types and IDs.

    + * + * @param source the message source. One of:
    {@link #GL_DEBUG_SOURCE_API_ARB DEBUG_SOURCE_API_ARB}{@link #GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB DEBUG_SOURCE_WINDOW_SYSTEM_ARB}
    {@link #GL_DEBUG_SOURCE_SHADER_COMPILER_ARB DEBUG_SOURCE_SHADER_COMPILER_ARB}{@link #GL_DEBUG_SOURCE_THIRD_PARTY_ARB DEBUG_SOURCE_THIRD_PARTY_ARB}
    {@link #GL_DEBUG_SOURCE_APPLICATION_ARB DEBUG_SOURCE_APPLICATION_ARB}{@link #GL_DEBUG_SOURCE_OTHER_ARB DEBUG_SOURCE_OTHER_ARB}
    + * @param type the message type. One of:
    {@link #GL_DEBUG_TYPE_ERROR_ARB DEBUG_TYPE_ERROR_ARB}{@link #GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB}
    {@link #GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB}{@link #GL_DEBUG_TYPE_PORTABILITY_ARB DEBUG_TYPE_PORTABILITY_ARB}
    {@link #GL_DEBUG_TYPE_PERFORMANCE_ARB DEBUG_TYPE_PERFORMANCE_ARB}{@link #GL_DEBUG_TYPE_OTHER_ARB DEBUG_TYPE_OTHER_ARB}
    + * @param severity the message severity level. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH_ARB DEBUG_SEVERITY_HIGH_ARB}{@link #GL_DEBUG_SEVERITY_MEDIUM_ARB DEBUG_SEVERITY_MEDIUM_ARB}{@link #GL_DEBUG_SEVERITY_LOW_ARB DEBUG_SEVERITY_LOW_ARB}
    + * @param enabled whether to enable or disable the references subset of messages + */ + public static void glDebugMessageControlARB(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @NativeType("GLuint const *") int id, @NativeType("GLboolean") boolean enabled) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.ints(id); + nglDebugMessageControlARB(source, type, severity, 1, memAddress(ids), enabled); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDebugMessageInsertARB ] --- + + /** + * Unsafe version of: {@link #glDebugMessageInsertARB DebugMessageInsertARB} + * + * @param length the number of characters in {@code buf}. If negative, it is implied that {@code buf} contains a null terminated string. + */ + public static native void nglDebugMessageInsertARB(int source, int type, int id, int severity, int length, long buf); + + /** + * This function can be called by applications and third-party libraries to generate their own messages, such as ones containing timestamp information or + * signals about specific render system events. + * + *

    The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated if the number of characters in {@code buf}, excluding the null terminator when {@code length} is + * negative, is not less than {@link #GL_MAX_DEBUG_MESSAGE_LENGTH_ARB MAX_DEBUG_MESSAGE_LENGTH_ARB}.

    + * + * @param source the message source. One of:
    {@link #GL_DEBUG_SOURCE_THIRD_PARTY_ARB DEBUG_SOURCE_THIRD_PARTY_ARB}{@link #GL_DEBUG_SOURCE_APPLICATION_ARB DEBUG_SOURCE_APPLICATION_ARB}
    + * @param type the message type. One of:
    {@link #GL_DEBUG_TYPE_ERROR_ARB DEBUG_TYPE_ERROR_ARB}{@link #GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB}
    {@link #GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB}{@link #GL_DEBUG_TYPE_PORTABILITY_ARB DEBUG_TYPE_PORTABILITY_ARB}
    {@link #GL_DEBUG_TYPE_PERFORMANCE_ARB DEBUG_TYPE_PERFORMANCE_ARB}{@link #GL_DEBUG_TYPE_OTHER_ARB DEBUG_TYPE_OTHER_ARB}
    + * @param id the message ID + * @param severity the message severity level. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH_ARB DEBUG_SEVERITY_HIGH_ARB}{@link #GL_DEBUG_SEVERITY_MEDIUM_ARB DEBUG_SEVERITY_MEDIUM_ARB}{@link #GL_DEBUG_SEVERITY_LOW_ARB DEBUG_SEVERITY_LOW_ARB}
    + * @param buf the string representation of the message + */ + public static void glDebugMessageInsertARB(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLuint") int id, @NativeType("GLenum") int severity, @NativeType("GLchar const *") ByteBuffer buf) { + nglDebugMessageInsertARB(source, type, id, severity, buf.remaining(), memAddress(buf)); + } + + /** + * This function can be called by applications and third-party libraries to generate their own messages, such as ones containing timestamp information or + * signals about specific render system events. + * + *

    The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated if the number of characters in {@code buf}, excluding the null terminator when {@code length} is + * negative, is not less than {@link #GL_MAX_DEBUG_MESSAGE_LENGTH_ARB MAX_DEBUG_MESSAGE_LENGTH_ARB}.

    + * + * @param source the message source. One of:
    {@link #GL_DEBUG_SOURCE_THIRD_PARTY_ARB DEBUG_SOURCE_THIRD_PARTY_ARB}{@link #GL_DEBUG_SOURCE_APPLICATION_ARB DEBUG_SOURCE_APPLICATION_ARB}
    + * @param type the message type. One of:
    {@link #GL_DEBUG_TYPE_ERROR_ARB DEBUG_TYPE_ERROR_ARB}{@link #GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB}
    {@link #GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB}{@link #GL_DEBUG_TYPE_PORTABILITY_ARB DEBUG_TYPE_PORTABILITY_ARB}
    {@link #GL_DEBUG_TYPE_PERFORMANCE_ARB DEBUG_TYPE_PERFORMANCE_ARB}{@link #GL_DEBUG_TYPE_OTHER_ARB DEBUG_TYPE_OTHER_ARB}
    + * @param id the message ID + * @param severity the message severity level. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH_ARB DEBUG_SEVERITY_HIGH_ARB}{@link #GL_DEBUG_SEVERITY_MEDIUM_ARB DEBUG_SEVERITY_MEDIUM_ARB}{@link #GL_DEBUG_SEVERITY_LOW_ARB DEBUG_SEVERITY_LOW_ARB}
    + * @param buf the string representation of the message + */ + public static void glDebugMessageInsertARB(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLuint") int id, @NativeType("GLenum") int severity, @NativeType("GLchar const *") CharSequence buf) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int bufEncodedLength = stack.nUTF8(buf, false); + long bufEncoded = stack.getPointerAddress(); + nglDebugMessageInsertARB(source, type, id, severity, bufEncodedLength, bufEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDebugMessageCallbackARB ] --- + + /** Unsafe version of: {@link #glDebugMessageCallbackARB DebugMessageCallbackARB} */ + public static native void nglDebugMessageCallbackARB(long callback, long userParam); + + /** + * Specifies a callback function for receiving debug messages. + * + *

    This function's prototype must follow the type definition of DEBUGPROCARB including its platform-dependent calling convention. Anything else will result + * in undefined behavior. Only one debug callback can be specified for the current context, and further calls overwrite the previous callback. Specifying + * {@code NULL} as the value of {@code callback} clears the current callback and disables message output through callbacks. Applications can provide + * user-specified data through the pointer {@code userParam}. The context will store this pointer and will include it as one of the parameters in each call + * to the callback function.

    + * + *

    If the application has specified a callback function for receiving debug output, the implementation will call that function whenever any enabled message + * is generated. The source, type, ID, and severity of the message are specified by the DEBUGPROCARB parameters {@code source}, {@code type}, {@code id}, + * and {@code severity}, respectively. The string representation of the message is stored in {@code message} and its length (excluding the null-terminator) + * is stored in {@code length}. The parameter {@code userParam} is the user-specified parameter that was given when calling DebugMessageCallbackARB.

    + * + *

    Applications can query the current callback function and the current user-specified parameter by obtaining the values of {@link #GL_DEBUG_CALLBACK_FUNCTION_ARB DEBUG_CALLBACK_FUNCTION_ARB} + * and {@link #GL_DEBUG_CALLBACK_USER_PARAM_ARB DEBUG_CALLBACK_USER_PARAM_ARB}, respectively.

    + * + *

    Applications that specify a callback function must be aware of certain special conditions when executing code inside a callback when it is called by the + * GL, regardless of the debug source.

    + * + *

    The memory for {@code message} is owned and managed by the GL, and should only be considered valid for the duration of the function call.

    + * + *

    The behavior of calling any GL or window system function from within the callback function is undefined and may lead to program termination.

    + * + *

    Care must also be taken in securing debug callbacks for use with asynchronous debug output by multi-threaded GL implementations.

    + * + *

    If {@link #GL_DEBUG_CALLBACK_FUNCTION_ARB DEBUG_CALLBACK_FUNCTION_ARB} is {@code NULL}, then debug messages are instead stored in an internal message log up to some maximum number of messages as + * defined by the value of {@link #GL_MAX_DEBUG_LOGGED_MESSAGES_ARB MAX_DEBUG_LOGGED_MESSAGES_ARB}.

    + * + *

    Each context stores its own message log and will only store messages generated by commands operating in that context. If the message log fills up, then + * any subsequently generated messages will not be placed in the log until the message log is cleared, and will instead be discarded.

    + * + *

    Applications can query the number of messages currently in the log by obtaining the value of {@link #GL_DEBUG_LOGGED_MESSAGES_ARB DEBUG_LOGGED_MESSAGES_ARB}, and the string length + * (including its null terminator) of the oldest message in the log through the value of {@link #GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB}.

    + * + * @param callback a callback function that will be called when a debug message is generated + * @param userParam a user supplied pointer that will be passed on each invocation of {@code callback} + */ + public static void glDebugMessageCallbackARB(@Nullable @NativeType("GLDEBUGPROCARB") GLDebugMessageARBCallbackI callback, @NativeType("void const *") long userParam) { + nglDebugMessageCallbackARB(memAddressSafe(callback), userParam); + } + + // --- [ glGetDebugMessageLogARB ] --- + + /** + * Unsafe version of: {@link #glGetDebugMessageLogARB GetDebugMessageLogARB} + * + * @param bufSize the maximum number of characters that can be written in the {@code messageLog} array + */ + public static native int nglGetDebugMessageLogARB(int count, int bufSize, long sources, long types, long ids, long severities, long lengths, long messageLog); + + /** + * When no debug callback is set, debug messages are stored in a debug message log. Messages can be queried from the log by calling this function. + * + *

    This function fetches a maximum of {@code count} messages from the message log, and will return the number of messages successfully fetched.

    + * + *

    Messages will be fetched from the log in order of oldest to newest. Those messages that were fetched will be removed from the log.

    + * + *

    The sources, types, severities, IDs, and string lengths of fetched messages will be stored in the application-provided arrays {@code sources}, + * {@code types}, {@code severities}, {@code ids}, and {@code lengths}, respectively. The application is responsible for allocating enough space for each + * array to hold up to {@code count} elements. The string representations of all fetched messages are stored in the {@code messageLog} array. If multiple + * messages are fetched, their strings are concatenated into the same {@code messageLog} array and will be separated by single null terminators. The last + * string in the array will also be null-terminated. The maximum size of {@code messageLog}, including the space used by all null terminators, is given by + * {@code bufSize}. If {@code bufSize} is less than zero, the error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated. If a message's string, including its null + * terminator, can not fully fit within the {@code messageLog} array's remaining space, then that message and any subsequent messages will not be fetched + * and will remain in the log. The string lengths stored in the array {@code lengths} include the space for the null terminator of each string.

    + * + *

    Any or all of the arrays {@code sources}, {@code types}, {@code ids}, {@code severities}, {@code lengths} and {@code messageLog} can also be null + * pointers, which causes the attributes for such arrays to be discarded when messages are fetched, however those messages will still be removed from the + * log. Thus to simply delete up to {@code count} messages from the message log while ignoring their attributes, the application can call the function with + * null pointers for all attribute arrays. If {@code messageLog} is {@code NULL}, the value of {@code bufSize} is ignored.

    + * + * @param count the number of debug messages to retrieve from the log + * @param sources a buffer in which to place the returned message sources + * @param types a buffer in which to place the returned message typesd + * @param ids a buffer in which to place the returned message IDs + * @param severities a buffer in which to place the returned message severity levels + * @param lengths a buffer in which to place the returned message lengths + * @param messageLog a buffer in which to place the returned messages + */ + @NativeType("GLuint") + public static int glGetDebugMessageLogARB(@NativeType("GLuint") int count, @Nullable @NativeType("GLenum *") IntBuffer sources, @Nullable @NativeType("GLenum *") IntBuffer types, @Nullable @NativeType("GLuint *") IntBuffer ids, @Nullable @NativeType("GLenum *") IntBuffer severities, @Nullable @NativeType("GLsizei *") IntBuffer lengths, @Nullable @NativeType("GLchar *") ByteBuffer messageLog) { + if (CHECKS) { + checkSafe(sources, count); + checkSafe(types, count); + checkSafe(ids, count); + checkSafe(severities, count); + checkSafe(lengths, count); + } + return nglGetDebugMessageLogARB(count, remainingSafe(messageLog), memAddressSafe(sources), memAddressSafe(types), memAddressSafe(ids), memAddressSafe(severities), memAddressSafe(lengths), memAddressSafe(messageLog)); + } + + /** Array version of: {@link #glDebugMessageControlARB DebugMessageControlARB} */ + public static void glDebugMessageControlARB(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @Nullable @NativeType("GLuint const *") int[] ids, @NativeType("GLboolean") boolean enabled) { + long __functionAddress = GL.getICD().glDebugMessageControlARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(source, type, severity, lengthSafe(ids), ids, enabled, __functionAddress); + } + + /** Array version of: {@link #glGetDebugMessageLogARB GetDebugMessageLogARB} */ + @NativeType("GLuint") + public static int glGetDebugMessageLogARB(@NativeType("GLuint") int count, @Nullable @NativeType("GLenum *") int[] sources, @Nullable @NativeType("GLenum *") int[] types, @Nullable @NativeType("GLuint *") int[] ids, @Nullable @NativeType("GLenum *") int[] severities, @Nullable @NativeType("GLsizei *") int[] lengths, @Nullable @NativeType("GLchar *") ByteBuffer messageLog) { + long __functionAddress = GL.getICD().glGetDebugMessageLogARB; + if (CHECKS) { + check(__functionAddress); + checkSafe(sources, count); + checkSafe(types, count); + checkSafe(ids, count); + checkSafe(severities, count); + checkSafe(lengths, count); + } + return callPPPPPPI(count, remainingSafe(messageLog), sources, types, ids, severities, lengths, memAddressSafe(messageLog), __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthBufferFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthBufferFloat.java new file mode 100644 index 000000000..8bda5e289 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthBufferFloat.java @@ -0,0 +1,40 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_depth_buffer_float extension. + * + *

    This extension provides new texture internal formats whose depth components are stored as 32-bit floating-point values, rather than the normalized + * unsigned integers used in existing depth formats. Floating-point depth textures support all the functionality supported for fixed-point depth textures, + * including shadow mapping and rendering support via {@link EXTFramebufferObject EXT_framebuffer_object}. Floating-point depth textures can store values outside the range + * {@code [0,1]}.

    + * + *

    Additionally, this extension provides new packed depth/stencil pixel formats (see {@link EXTPackedDepthStencil EXT_packed_depth_stencil}) that have 64-bit pixels consisting + * of a 32-bit floating-point depth value, 8 bits of stencil, and 24 unused bites. A packed depth/stencil texture internal format is also provided.

    + * + *

    Requires {@link GL20 OpenGL 2.0}, {@link ARBColorBufferFloat ARB_color_buffer_float}, {@link EXTPackedDepthStencil EXT_packed_depth_stencil} and {@link ARBFramebufferObject ARB_framebuffer_object}. + * Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public final class ARBDepthBufferFloat { + + /** + * Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorageEXT, and + * returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameterivEXT. + */ + public static final int + GL_DEPTH_COMPONENT32F = 0x8CAC, + GL_DEPTH32F_STENCIL8 = 0x8CAD; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage. + */ + public static final int GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; + + private ARBDepthBufferFloat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthClamp.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthClamp.java new file mode 100644 index 000000000..f3f6b5181 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthClamp.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_depth_clamp extension. + * + *

    Conventional OpenGL clips geometric primitives to a clip volume with six faces, two of which are the near and far clip planes. Clipping to the near and + * far planes of the clip volume ensures that interpolated depth values (after the depth range transform) must be in the [0,1] range.

    + * + *

    In some rendering applications such as shadow volumes, it is useful to allow line and polygon primitives to be rasterized without clipping the primitive + * to the near or far clip volume planes (side clip volume planes clip normally). Without the near and far clip planes, rasterization (pixel coverage + * determination) in X and Y can proceed normally if we ignore the near and far clip planes. The one major issue is that fragments of a primitive may + * extend beyond the conventional window space depth range for depth values (typically the range [0,1]). Rather than discarding fragments that defy the + * window space depth range (effectively what near and far plane clipping accomplish), the depth values can be clamped to the current depth range.

    + * + *

    This extension provides exactly such functionality. This functionality is useful to obviate the need for near plane capping of stenciled shadow volumes. + * The functionality may also be useful for rendering geometry "beyond" the far plane if an alternative algorithm (rather than depth testing) for hidden + * surface removal is applied to such geometry (specifically, the painter's algorithm). Similar situations at the near clip plane can be avoided at the + * near clip plane where apparently solid objects can be "seen through" if they intersect the near clip plane.

    + * + *

    Promoted to core in {@link GL32 OpenGL 3.2}.

    + */ +public final class ARBDepthClamp { + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_DEPTH_CLAMP = 0x864F; + + private ARBDepthClamp() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthTexture.java new file mode 100644 index 000000000..534a73001 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDepthTexture.java @@ -0,0 +1,34 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_depth_texture extension. + * + *

    This extension defines a new depth texture format. An important application of depth texture images is shadow casting, but separating this from the + * shadow extension allows for the potential use of depth textures in other applications such as image-based rendering or displacement mapping. This + * extension does not define new depth-texture environment functions, such as filtering or applying the depth values computed from a texture but leaves + * this to other extensions, such as the shadow extension.

    + * + *

    Promoted to core in {@link GL14 OpenGL 1.4}.

    + */ +public final class ARBDepthTexture { + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, CopyTexImage1D and CopyTexImage2D. */ + public static final int + GL_DEPTH_COMPONENT16_ARB = 0x81A5, + GL_DEPTH_COMPONENT24_ARB = 0x81A6, + GL_DEPTH_COMPONENT32_ARB = 0x81A7; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameterfv and GetTexLevelParameteriv. */ + public static final int GL_TEXTURE_DEPTH_SIZE_ARB = 0x884A; + + /** Accepted by the {@code pname} parameter of TexParameterf, TexParameteri, TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int GL_DEPTH_TEXTURE_MODE_ARB = 0x884B; + + private ARBDepthTexture() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDirectStateAccess.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDirectStateAccess.java new file mode 100644 index 000000000..bfacab5fd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDirectStateAccess.java @@ -0,0 +1,3433 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_direct_state_access extension. + * + *

    In unextended OpenGL, most mutation of state contained in objects is through an indirection known as a binding. Objects are attached to a context + * (either directly or indirectly via a container) and then commands to modify or query their state are issued on that context, indirecting through its + * attachments and into the underlying object. This is known as `bind-to-edit'.

    + * + *

    This extension derives from the GL_EXT_direct_state_access extension, which added accessors for most state on most objects, allowing it to be queried + * and modified without the object needing to be bound to a context. In cases where a single property of an object is to be modified, directly accessing + * its state can be more efficient than binding the object to the context and then indirecting through it. Further, directly accessing the state of objects + * through their names rather than by bind-to-edit does not disturb the bindings of the current context, which is useful for tools, middleware and other + * applications that are unaware of the outer state but it can also avoid cases of redundant state changes.

    + * + *

    Requires {@link GL20 OpenGL 2.0}. Promoted to core in {@link GL45C OpenGL 4.5}.

    + */ +public class ARBDirectStateAccess { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetTextureParameter{if}v and GetTextureParameterI{i ui}v. */ + public static final int GL_TEXTURE_TARGET = 0x1006; + + /** Accepted by the {@code pname} parameter of GetQueryObjectiv. */ + public static final int GL_QUERY_TARGET = 0x82EA; + + protected ARBDirectStateAccess() { + throw new UnsupportedOperationException(); + } + + // --- [ glCreateTransformFeedbacks ] --- + + /** + * Unsafe version of: {@link #glCreateTransformFeedbacks CreateTransformFeedbacks} + * + * @param n the number of transform feedback object names to create + */ + public static void nglCreateTransformFeedbacks(int n, long ids) { + GL45C.nglCreateTransformFeedbacks(n, ids); + } + + /** + * Returns {@code n} previously unused transform feedback object names in {@code ids}, each representing a new state vector. + * + * @param ids the buffer in which to return the names + */ + public static void glCreateTransformFeedbacks(@NativeType("GLuint *") IntBuffer ids) { + GL45C.glCreateTransformFeedbacks(ids); + } + + /** Returns {@code n} previously unused transform feedback object names in {@code ids}, each representing a new state vector. */ + @NativeType("void") + public static int glCreateTransformFeedbacks() { + return GL45C.glCreateTransformFeedbacks(); + } + + // --- [ glTransformFeedbackBufferBase ] --- + + /** + * Binds a buffer object to a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param index the transform feedback stream index + * @param buffer the name of an existing buffer object + */ + public static void glTransformFeedbackBufferBase(@NativeType("GLuint") int xfb, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer) { + GL45C.glTransformFeedbackBufferBase(xfb, index, buffer); + } + + // --- [ glTransformFeedbackBufferRange ] --- + + /** + * Binds a region of a buffer object to a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param index the transform feedback stream index + * @param buffer the name of an existing buffer object + * @param offset the starting offset in basic machine units into the buffer object + * @param size the amount of data in machine units + */ + public static void glTransformFeedbackBufferRange(@NativeType("GLuint") int xfb, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size) { + GL45C.glTransformFeedbackBufferRange(xfb, index, buffer, offset, size); + } + + // --- [ glGetTransformFeedbackiv ] --- + + /** Unsafe version of: {@link #glGetTransformFeedbackiv GetTransformFeedbackiv} */ + public static void nglGetTransformFeedbackiv(int xfb, int pname, long param) { + GL45C.nglGetTransformFeedbackiv(xfb, pname, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL42#GL_TRANSFORM_FEEDBACK_PAUSED TRANSFORM_FEEDBACK_PAUSED}{@link GL42#GL_TRANSFORM_FEEDBACK_ACTIVE TRANSFORM_FEEDBACK_ACTIVE}
    + * @param param the buffer in which to return the parameter value + */ + public static void glGetTransformFeedbackiv(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + GL45C.glGetTransformFeedbackiv(xfb, pname, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL42#GL_TRANSFORM_FEEDBACK_PAUSED TRANSFORM_FEEDBACK_PAUSED}{@link GL42#GL_TRANSFORM_FEEDBACK_ACTIVE TRANSFORM_FEEDBACK_ACTIVE}
    + */ + @NativeType("void") + public static int glGetTransformFeedbacki(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname) { + return GL45C.glGetTransformFeedbacki(xfb, pname); + } + + // --- [ glGetTransformFeedbacki_v ] --- + + /** Unsafe version of: {@link #glGetTransformFeedbacki_v GetTransformFeedbacki_v} */ + public static void nglGetTransformFeedbacki_v(int xfb, int pname, int index, long param) { + GL45C.nglGetTransformFeedbacki_v(xfb, pname, index, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. Must be:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_BINDING TRANSFORM_FEEDBACK_BUFFER_BINDING}
    + * @param index the transform feedback stream index + * @param param the buffer in which to return the parameter value + */ + public static void glGetTransformFeedbacki_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer param) { + GL45C.glGetTransformFeedbacki_v(xfb, pname, index, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. Must be:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_BINDING TRANSFORM_FEEDBACK_BUFFER_BINDING}
    + * @param index the transform feedback stream index + */ + @NativeType("void") + public static int glGetTransformFeedbacki(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + return GL45C.glGetTransformFeedbacki(xfb, pname, index); + } + + // --- [ glGetTransformFeedbacki64_v ] --- + + /** Unsafe version of: {@link #glGetTransformFeedbacki64_v GetTransformFeedbacki64_v} */ + public static void nglGetTransformFeedbacki64_v(int xfb, int pname, int index, long param) { + GL45C.nglGetTransformFeedbacki64_v(xfb, pname, index, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_START TRANSFORM_FEEDBACK_BUFFER_START}{@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_SIZE TRANSFORM_FEEDBACK_BUFFER_SIZE}
    + * @param index the transform feedback stream index + * @param param the buffer in which to return the parameter value + */ + public static void glGetTransformFeedbacki64_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint64 *") LongBuffer param) { + GL45C.glGetTransformFeedbacki64_v(xfb, pname, index, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_START TRANSFORM_FEEDBACK_BUFFER_START}{@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_SIZE TRANSFORM_FEEDBACK_BUFFER_SIZE}
    + * @param index the transform feedback stream index + */ + @NativeType("void") + public static long glGetTransformFeedbacki64(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + return GL45C.glGetTransformFeedbacki64(xfb, pname, index); + } + + // --- [ glCreateBuffers ] --- + + /** + * Unsafe version of: {@link #glCreateBuffers CreateBuffers} + * + * @param n the number of buffer names to create + */ + public static void nglCreateBuffers(int n, long buffers) { + GL45C.nglCreateBuffers(n, buffers); + } + + /** + * Returns {@code n} previously unused buffer names in {@code buffers}, each representing a new buffer object initialized as if it had been bound to an + * unspecified target. + * + * @param buffers the buffer in which to return the names + */ + public static void glCreateBuffers(@NativeType("GLuint *") IntBuffer buffers) { + GL45C.glCreateBuffers(buffers); + } + + /** + * Returns {@code n} previously unused buffer names in {@code buffers}, each representing a new buffer object initialized as if it had been bound to an + * unspecified target. + */ + @NativeType("void") + public static int glCreateBuffers() { + return GL45C.glCreateBuffers(); + } + + // --- [ glNamedBufferStorage ] --- + + /** + * Unsafe version of: {@link #glNamedBufferStorage NamedBufferStorage} + * + * @param size the size of the data store in basic machine units + */ + public static void nglNamedBufferStorage(int buffer, long size, long data, int flags) { + GL45C.nglNamedBufferStorage(buffer, size, data, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param size the size of the data store in basic machine units + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("GLsizeiptr") long size, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, size, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") ByteBuffer data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") ShortBuffer data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") IntBuffer data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") FloatBuffer data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") DoubleBuffer data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + // --- [ glNamedBufferData ] --- + + /** + * Unsafe version of: {@link #glNamedBufferData NamedBufferData} + * + * @param size the size in bytes of the buffer object's new data store + */ + public static void nglNamedBufferData(int buffer, long size, long data, int usage) { + GL45C.nglNamedBufferData(buffer, size, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param size the size in bytes of the buffer object's new data store + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, size, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") ByteBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") ShortBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") IntBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") LongBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") FloatBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") DoubleBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + // --- [ glNamedBufferSubData ] --- + + /** + * Unsafe version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @param size the size in bytes of the data store region being replaced + */ + public static void nglNamedBufferSubData(int buffer, long offset, long size, long data) { + GL45C.nglNamedBufferSubData(buffer, offset, size, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") ByteBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") ShortBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") IntBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") LongBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") FloatBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") DoubleBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + // --- [ glCopyNamedBufferSubData ] --- + + /** + * DSA version of {@link GL31C#glCopyBufferSubData CopyBufferSubData}. + * + * @param readBuffer the source buffer object name + * @param writeBuffer the destination buffer object name + * @param readOffset the source buffer object offset, in bytes + * @param writeOffset the destination buffer object offset, in bytes + * @param size the number of bytes to copy + */ + public static void glCopyNamedBufferSubData(@NativeType("GLuint") int readBuffer, @NativeType("GLuint") int writeBuffer, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size) { + GL45C.glCopyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size); + } + + // --- [ glClearNamedBufferData ] --- + + /** Unsafe version of: {@link #glClearNamedBufferData ClearNamedBufferData} */ + public static void nglClearNamedBufferData(int buffer, int internalformat, int format, int type, long data) { + GL45C.nglClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + // --- [ glClearNamedBufferSubData ] --- + + /** Unsafe version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} */ + public static void nglClearNamedBufferSubData(int buffer, int internalformat, long offset, long size, int format, int type, long data) { + GL45C.nglClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + // --- [ glMapNamedBuffer ] --- + + /** Unsafe version of: {@link #glMapNamedBuffer MapNamedBuffer} */ + public static long nglMapNamedBuffer(int buffer, int access) { + return GL45C.nglMapNamedBuffer(buffer, access); + } + + /** + * DSA version of {@link GL15C#glMapBuffer MapBuffer}. + * + * @param buffer the buffer object name + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15#GL_READ_ONLY READ_ONLY}{@link GL15#GL_WRITE_ONLY WRITE_ONLY}{@link GL15#GL_READ_WRITE READ_WRITE}
    + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBuffer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access) { + return GL45C.glMapNamedBuffer(buffer, access); + } + + /** + * DSA version of {@link GL15C#glMapBuffer MapBuffer}. + * + * @param buffer the buffer object name + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15#GL_READ_ONLY READ_ONLY}{@link GL15#GL_WRITE_ONLY WRITE_ONLY}{@link GL15#GL_READ_WRITE READ_WRITE}
    + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBuffer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access, @Nullable ByteBuffer old_buffer) { + return GL45C.glMapNamedBuffer(buffer, access, old_buffer); + } + + /** + * DSA version of {@link GL15C#glMapBuffer MapBuffer}. + * + * @param buffer the buffer object name + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15#GL_READ_ONLY READ_ONLY}{@link GL15#GL_WRITE_ONLY WRITE_ONLY}{@link GL15#GL_READ_WRITE READ_WRITE}
    + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBuffer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access, long length, @Nullable ByteBuffer old_buffer) { + return GL45C.glMapNamedBuffer(buffer, access, length, old_buffer); + } + + // --- [ glMapNamedBufferRange ] --- + + /** Unsafe version of: {@link #glMapNamedBufferRange MapNamedBufferRange} */ + public static long nglMapNamedBufferRange(int buffer, long offset, long length, int access) { + return GL45C.nglMapNamedBufferRange(buffer, offset, length, access); + } + + /** + * DSA version of {@link GL30C#glMapBufferRange MapBufferRange}. + * + * @param buffer the buffer object name + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link GL30#GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link GL30#GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link GL30#GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link GL30#GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBufferRange(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access) { + return GL45C.glMapNamedBufferRange(buffer, offset, length, access); + } + + /** + * DSA version of {@link GL30C#glMapBufferRange MapBufferRange}. + * + * @param buffer the buffer object name + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link GL30#GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link GL30#GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link GL30#GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link GL30#GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBufferRange(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access, @Nullable ByteBuffer old_buffer) { + return GL45C.glMapNamedBufferRange(buffer, offset, length, access, old_buffer); + } + + // --- [ glUnmapNamedBuffer ] --- + + /** + * DSA version of {@link GL15C#glUnmapBuffer UnmapBuffer}. + * + * @param buffer the buffer object name + */ + @NativeType("GLboolean") + public static boolean glUnmapNamedBuffer(@NativeType("GLuint") int buffer) { + return GL45C.glUnmapNamedBuffer(buffer); + } + + // --- [ glFlushMappedNamedBufferRange ] --- + + /** + * DSA version of {@link GL30C#glFlushMappedBufferRange FlushMappedBufferRange}. + * + * @param buffer the buffer object name + * @param offset the start of the buffer subrange, in basic machine units + * @param length the length of the buffer subrange, in basic machine units + */ + public static void glFlushMappedNamedBufferRange(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length) { + GL45C.glFlushMappedNamedBufferRange(buffer, offset, length); + } + + // --- [ glGetNamedBufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedBufferParameteriv GetNamedBufferParameteriv} */ + public static void nglGetNamedBufferParameteriv(int buffer, int pname, long params) { + GL45C.nglGetNamedBufferParameteriv(buffer, pname, params); + } + + /** + * DSA version of {@link GL15C#glGetBufferParameteriv GetBufferParameteriv}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * @param params the requested parameter + */ + public static void glGetNamedBufferParameteriv(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetNamedBufferParameteriv(buffer, pname, params); + } + + /** + * DSA version of {@link GL15C#glGetBufferParameteriv GetBufferParameteriv}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + */ + @NativeType("void") + public static int glGetNamedBufferParameteri(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedBufferParameteri(buffer, pname); + } + + // --- [ glGetNamedBufferParameteri64v ] --- + + /** Unsafe version of: {@link #glGetNamedBufferParameteri64v GetNamedBufferParameteri64v} */ + public static void nglGetNamedBufferParameteri64v(int buffer, int pname, long params) { + GL45C.nglGetNamedBufferParameteri64v(buffer, pname, params); + } + + /** + * DSA version of {@link GL32C#glGetBufferParameteri64v GetBufferParameteri64v}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * @param params the requested parameter + */ + public static void glGetNamedBufferParameteri64v(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + GL45C.glGetNamedBufferParameteri64v(buffer, pname, params); + } + + /** + * DSA version of {@link GL32C#glGetBufferParameteri64v GetBufferParameteri64v}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + */ + @NativeType("void") + public static long glGetNamedBufferParameteri64(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedBufferParameteri64(buffer, pname); + } + + // --- [ glGetNamedBufferPointerv ] --- + + /** Unsafe version of: {@link #glGetNamedBufferPointerv GetNamedBufferPointerv} */ + public static void nglGetNamedBufferPointerv(int buffer, int pname, long params) { + GL45C.nglGetNamedBufferPointerv(buffer, pname, params); + } + + /** + * DSA version of {@link GL15C#glGetBufferPointerv GetBufferPointerv}. + * + * @param buffer the buffer object name + * @param pname the pointer to be returned. Must be:
    {@link GL15#GL_BUFFER_MAP_POINTER BUFFER_MAP_POINTER}
    + * @param params the pointer value specified by {@code pname} + */ + public static void glGetNamedBufferPointerv(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer params) { + GL45C.glGetNamedBufferPointerv(buffer, pname, params); + } + + /** + * DSA version of {@link GL15C#glGetBufferPointerv GetBufferPointerv}. + * + * @param buffer the buffer object name + * @param pname the pointer to be returned. Must be:
    {@link GL15#GL_BUFFER_MAP_POINTER BUFFER_MAP_POINTER}
    + */ + @NativeType("void") + public static long glGetNamedBufferPointer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedBufferPointer(buffer, pname); + } + + // --- [ glGetNamedBufferSubData ] --- + + /** + * Unsafe version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @param size the size in bytes of the data store region being returned + */ + public static void nglGetNamedBufferSubData(int buffer, long offset, long size, long data) { + GL45C.nglGetNamedBufferSubData(buffer, offset, size, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") ByteBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") ShortBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") IntBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") LongBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") FloatBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") DoubleBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + // --- [ glCreateFramebuffers ] --- + + /** + * Unsafe version of: {@link #glCreateFramebuffers CreateFramebuffers} + * + * @param n the number of framebuffer names to create + */ + public static void nglCreateFramebuffers(int n, long framebuffers) { + GL45C.nglCreateFramebuffers(n, framebuffers); + } + + /** + * Returns {@code n} previously unused framebuffer names in {@code framebuffers}, each representing a new framebuffer object. + * + * @param framebuffers the buffer in which to store the framebuffer names + */ + public static void glCreateFramebuffers(@NativeType("GLuint *") IntBuffer framebuffers) { + GL45C.glCreateFramebuffers(framebuffers); + } + + /** Returns {@code n} previously unused framebuffer names in {@code framebuffers}, each representing a new framebuffer object. */ + @NativeType("void") + public static int glCreateFramebuffers() { + return GL45C.glCreateFramebuffers(); + } + + // --- [ glNamedFramebufferRenderbuffer ] --- + + /** + * DSA version of {@link GL30C#glFramebufferRenderbuffer FramebufferRenderbuffer}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param renderbuffertarget the renderbuffer target. Must be:
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}
    + * @param renderbuffer the name of an existing renderbuffer object of type {@code renderbuffertarget} to attach + */ + public static void glNamedFramebufferRenderbuffer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int renderbuffertarget, @NativeType("GLuint") int renderbuffer) { + GL45C.glNamedFramebufferRenderbuffer(framebuffer, attachment, renderbuffertarget, renderbuffer); + } + + // --- [ glNamedFramebufferParameteri ] --- + + /** + * DSA version of {@link GL43C#glFramebufferParameteri FramebufferParameteri}. + * + * @param framebuffer the framebuffer name + * @param pname a token indicating the parameter to be modified. One of:
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param param the new value for the parameter named {@code pname} + */ + public static void glNamedFramebufferParameteri(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint") int param) { + GL45C.glNamedFramebufferParameteri(framebuffer, pname, param); + } + + // --- [ glNamedFramebufferTexture ] --- + + /** + * DSA version of {@link GL32C#glFramebufferTexture FramebufferTexture}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment point of the framebuffer + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + */ + public static void glNamedFramebufferTexture(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level) { + GL45C.glNamedFramebufferTexture(framebuffer, attachment, texture, level); + } + + // --- [ glNamedFramebufferTextureLayer ] --- + + /** + * DSA version of {@link GL30C#glFramebufferTextureLayer FramebufferTextureLayer}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * @param layer the layer of {@code texture} to attach. + */ + public static void glNamedFramebufferTextureLayer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer) { + GL45C.glNamedFramebufferTextureLayer(framebuffer, attachment, texture, level, layer); + } + + // --- [ glNamedFramebufferDrawBuffer ] --- + + /** + * DSA version of {@link GL11C#glDrawBuffer DrawBuffer}. + * + * @param framebuffer the framebuffer name + * @param buf the color buffer to draw to. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_LEFT LEFT}
    {@link GL11#GL_RIGHT RIGHT}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}GL30.GL_COLOR_ATTACHMENT[1-15]
    + */ + public static void glNamedFramebufferDrawBuffer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buf) { + GL45C.glNamedFramebufferDrawBuffer(framebuffer, buf); + } + + // --- [ glNamedFramebufferDrawBuffers ] --- + + /** + * Unsafe version of: {@link #glNamedFramebufferDrawBuffers NamedFramebufferDrawBuffers} + * + * @param n the number of buffers in {@code bufs} + */ + public static void nglNamedFramebufferDrawBuffers(int framebuffer, int n, long bufs) { + GL45C.nglNamedFramebufferDrawBuffers(framebuffer, n, bufs); + } + + /** + * DSA version of {@link GL20C#glDrawBuffers DrawBuffers}. + * + * @param framebuffer the framebuffer name + * @param bufs an array of symbolic constants specifying the buffers into which fragment colors or data values will be written. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}
    GL30.GL_COLOR_ATTACHMENT[1-15]
    + */ + public static void glNamedFramebufferDrawBuffers(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") IntBuffer bufs) { + GL45C.glNamedFramebufferDrawBuffers(framebuffer, bufs); + } + + /** + * DSA version of {@link GL20C#glDrawBuffers DrawBuffers}. + * + * @param framebuffer the framebuffer name + */ + public static void glNamedFramebufferDrawBuffers(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int buf) { + GL45C.glNamedFramebufferDrawBuffers(framebuffer, buf); + } + + // --- [ glNamedFramebufferReadBuffer ] --- + + /** + * DSA version of {@link GL11C#glReadBuffer ReadBuffer}. + * + * @param framebuffer the framebuffer name + * @param src the color buffer to read from. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_LEFT LEFT}
    {@link GL11#GL_RIGHT RIGHT}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}GL30.GL_COLOR_ATTACHMENT[1-15]
    + */ + public static void glNamedFramebufferReadBuffer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int src) { + GL45C.glNamedFramebufferReadBuffer(framebuffer, src); + } + + // --- [ glInvalidateNamedFramebufferData ] --- + + /** + * Unsafe version of: {@link #glInvalidateNamedFramebufferData InvalidateNamedFramebufferData} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static void nglInvalidateNamedFramebufferData(int framebuffer, int numAttachments, long attachments) { + GL45C.nglInvalidateNamedFramebufferData(framebuffer, numAttachments, attachments); + } + + /** + * DSA version of {@link GL43C#glInvalidateFramebuffer InvalidateFramebuffer}. + * + * @param framebuffer the framebuffer name + * @param attachments the address of an array identifying the attachments to be invalidated + */ + public static void glInvalidateNamedFramebufferData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") IntBuffer attachments) { + GL45C.glInvalidateNamedFramebufferData(framebuffer, attachments); + } + + /** + * DSA version of {@link GL43C#glInvalidateFramebuffer InvalidateFramebuffer}. + * + * @param framebuffer the framebuffer name + */ + public static void glInvalidateNamedFramebufferData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int attachment) { + GL45C.glInvalidateNamedFramebufferData(framebuffer, attachment); + } + + // --- [ glInvalidateNamedFramebufferSubData ] --- + + /** + * Unsafe version of: {@link #glInvalidateNamedFramebufferSubData InvalidateNamedFramebufferSubData} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static void nglInvalidateNamedFramebufferSubData(int framebuffer, int numAttachments, long attachments, int x, int y, int width, int height) { + GL45C.nglInvalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, x, y, width, height); + } + + /** + * DSA version of {@link GL43C#glInvalidateSubFramebuffer InvalidateSubFramebuffer}. + * + * @param framebuffer the framebuffer name + * @param attachments an array identifying the attachments to be invalidated + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + */ + public static void glInvalidateNamedFramebufferSubData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") IntBuffer attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glInvalidateNamedFramebufferSubData(framebuffer, attachments, x, y, width, height); + } + + /** + * DSA version of {@link GL43C#glInvalidateSubFramebuffer InvalidateSubFramebuffer}. + * + * @param framebuffer the framebuffer name + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + */ + public static void glInvalidateNamedFramebufferSubData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int attachment, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glInvalidateNamedFramebufferSubData(framebuffer, attachment, x, y, width, height); + } + + // --- [ glClearNamedFramebufferiv ] --- + + /** Unsafe version of: {@link #glClearNamedFramebufferiv ClearNamedFramebufferiv} */ + public static void nglClearNamedFramebufferiv(int framebuffer, int buffer, int drawbuffer, long value) { + GL45C.nglClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); + } + + /** + * DSA version of {@link GL30C#glClearBufferiv ClearBufferiv}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. One of:
    {@link GL11#GL_COLOR COLOR}{@link GL11#GL_STENCIL STENCIL}
    + * @param drawbuffer the draw buffer to clear + * @param value for color buffers, a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to. For stencil buffers, a pointer to a + * single stencil value to clear the buffer to. + */ + public static void glClearNamedFramebufferiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") IntBuffer value) { + GL45C.glClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); + } + + // --- [ glClearNamedFramebufferuiv ] --- + + /** Unsafe version of: {@link #glClearNamedFramebufferuiv ClearNamedFramebufferuiv} */ + public static void nglClearNamedFramebufferuiv(int framebuffer, int buffer, int drawbuffer, long value) { + GL45C.nglClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); + } + + /** + * DSA version of {@link GL30C#glClearBufferuiv ClearBufferuiv}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. Must be:
    {@link GL11#GL_COLOR COLOR}
    + * @param drawbuffer the draw buffer to clear + * @param value a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to + */ + public static void glClearNamedFramebufferuiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") IntBuffer value) { + GL45C.glClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); + } + + // --- [ glClearNamedFramebufferfv ] --- + + /** Unsafe version of: {@link #glClearNamedFramebufferfv ClearNamedFramebufferfv} */ + public static void nglClearNamedFramebufferfv(int framebuffer, int buffer, int drawbuffer, long value) { + GL45C.nglClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); + } + + /** + * DSA version of {@link GL30C#glClearBufferfv ClearBufferfv}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. One of:
    {@link GL11#GL_COLOR COLOR}{@link GL11#GL_DEPTH DEPTH}
    + * @param drawbuffer the draw buffer to clear + * @param value for color buffers, a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to. For depth buffers, a pointer to a + * single depth value to clear the buffer to. + */ + public static void glClearNamedFramebufferfv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat const *") FloatBuffer value) { + GL45C.glClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); + } + + // --- [ glClearNamedFramebufferfi ] --- + + /** + * DSA version of {@link GL30C#glClearBufferfi ClearBufferfi}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. Must be:
    {@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param drawbuffer the draw buffer to clear + * @param depth the depth value to clear the buffer to + * @param stencil the stencil value to clear the buffer to + */ + public static void glClearNamedFramebufferfi(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat") float depth, @NativeType("GLint") int stencil) { + GL45C.glClearNamedFramebufferfi(framebuffer, buffer, drawbuffer, depth, stencil); + } + + // --- [ glBlitNamedFramebuffer ] --- + + /** + * DSA version of {@link GL30C#glBlitFramebuffer BlitFramebuffer}. + * + * @param readFramebuffer the source framebuffer name + * @param drawFramebuffer the destination framebuffer name + * @param srcX0 the lower-left coordinate of the source rectangle within the read buffer + * @param srcY0 the upper-left coordinate of the source rectangle within the read buffer + * @param srcX1 the lower-right coordinate of the source rectangle within the read buffer + * @param srcY1 the upper-right coordinate of the source rectangle within the read buffer + * @param dstX0 the lower-left coordinate of the destination rectangle within the write buffer + * @param dstY0 the upper-left coordinate of the destination rectangle within the write buffer + * @param dstX1 the lower-right coordinate of the destination rectangle within the write buffer + * @param dstY1 the upper-right coordinate of the destination rectangle within the write buffer + * @param mask the bitwise OR of the flags indicating which buffers are to be copied. One of:
    {@link GL11#GL_COLOR_BUFFER_BIT COLOR_BUFFER_BIT}{@link GL11#GL_DEPTH_BUFFER_BIT DEPTH_BUFFER_BIT}{@link GL11#GL_STENCIL_BUFFER_BIT STENCIL_BUFFER_BIT}
    + * @param filter the interpolation to be applied if the image is stretched. One of:
    {@link GL11#GL_NEAREST NEAREST}{@link GL11#GL_LINEAR LINEAR}
    + */ + public static void glBlitNamedFramebuffer(@NativeType("GLuint") int readFramebuffer, @NativeType("GLuint") int drawFramebuffer, @NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter) { + GL45C.glBlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + } + + // --- [ glCheckNamedFramebufferStatus ] --- + + /** + * DSA version of {@link GL30C#glCheckFramebufferStatus CheckFramebufferStatus}. + * + * @param framebuffer the framebuffer name + * @param target the target of the framebuffer completeness check. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + */ + @NativeType("GLenum") + public static int glCheckNamedFramebufferStatus(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int target) { + return GL45C.glCheckNamedFramebufferStatus(framebuffer, target); + } + + // --- [ glGetNamedFramebufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedFramebufferParameteriv GetNamedFramebufferParameteriv} */ + public static void nglGetNamedFramebufferParameteriv(int framebuffer, int pname, long params) { + GL45C.nglGetNamedFramebufferParameteriv(framebuffer, pname, params); + } + + /** + * DSA version of {@link GL43C#glGetFramebufferParameteriv GetFramebufferParameteriv}. + * + * @param framebuffer the framebuffer name + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param params a variable to receive the value of the parameter named {@code pname} + */ + public static void glGetNamedFramebufferParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetNamedFramebufferParameteriv(framebuffer, pname, params); + } + + /** + * DSA version of {@link GL43C#glGetFramebufferParameteriv GetFramebufferParameteriv}. + * + * @param framebuffer the framebuffer name + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + */ + @NativeType("void") + public static int glGetNamedFramebufferParameteri(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedFramebufferParameteri(framebuffer, pname); + } + + // --- [ glGetNamedFramebufferAttachmentParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedFramebufferAttachmentParameteriv GetNamedFramebufferAttachmentParameteriv} */ + public static void nglGetNamedFramebufferAttachmentParameteriv(int framebuffer, int attachment, int pname, long params) { + GL45C.nglGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment within {@code target}. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + * @param params an array to receive the value of the queried parameter + */ + public static void glGetNamedFramebufferAttachmentParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment within {@code target}. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + */ + @NativeType("void") + public static int glGetNamedFramebufferAttachmentParameteri(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedFramebufferAttachmentParameteri(framebuffer, attachment, pname); + } + + // --- [ glCreateRenderbuffers ] --- + + /** + * Unsafe version of: {@link #glCreateRenderbuffers CreateRenderbuffers} + * + * @param n the number of renderbuffer names to create + */ + public static void nglCreateRenderbuffers(int n, long renderbuffers) { + GL45C.nglCreateRenderbuffers(n, renderbuffers); + } + + /** + * Returns {@code n} previously unused renderbuffer names in {@code renderbuffers}, each representing a new renderbuffer object. + * + * @param renderbuffers the buffer in which to store the created renderbuffer names + */ + public static void glCreateRenderbuffers(@NativeType("GLuint *") IntBuffer renderbuffers) { + GL45C.glCreateRenderbuffers(renderbuffers); + } + + /** Returns {@code n} previously unused renderbuffer names in {@code renderbuffers}, each representing a new renderbuffer object. */ + @NativeType("void") + public static int glCreateRenderbuffers() { + return GL45C.glCreateRenderbuffers(); + } + + // --- [ glNamedRenderbufferStorage ] --- + + /** + * DSA version of {@link GL30C#glRenderbufferStorage RenderbufferStorage}. + * + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + */ + public static void glNamedRenderbufferStorage(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glNamedRenderbufferStorage(renderbuffer, internalformat, width, height); + } + + // --- [ glNamedRenderbufferStorageMultisample ] --- + + /** + * DSA version of {@link GL30C#glRenderbufferStorageMultisample RenderbufferStorageMultisample}. + * + * @param samples the number of samples to be used for the renderbuffer object's storage + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + */ + public static void glNamedRenderbufferStorageMultisample(@NativeType("GLuint") int renderbuffer, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glNamedRenderbufferStorageMultisample(renderbuffer, samples, internalformat, width, height); + } + + // --- [ glGetNamedRenderbufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedRenderbufferParameteriv GetNamedRenderbufferParameteriv} */ + public static void nglGetNamedRenderbufferParameteriv(int renderbuffer, int pname, long params) { + GL45C.nglGetNamedRenderbufferParameteriv(renderbuffer, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetRenderbufferParameteriv GetRenderbufferParameteriv}. + * + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link GL30#GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link GL30#GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link GL30#GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link GL30#GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link GL30#GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link GL30#GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link GL30#GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link GL30#GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link GL30#GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link GL30#GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + * @param params an array to receive the value of the queried parameter + */ + public static void glGetNamedRenderbufferParameteriv(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetNamedRenderbufferParameteriv(renderbuffer, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetRenderbufferParameteriv GetRenderbufferParameteriv}. + * + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link GL30#GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link GL30#GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link GL30#GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link GL30#GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link GL30#GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link GL30#GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link GL30#GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link GL30#GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link GL30#GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link GL30#GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + */ + @NativeType("void") + public static int glGetNamedRenderbufferParameteri(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedRenderbufferParameteri(renderbuffer, pname); + } + + // --- [ glCreateTextures ] --- + + /** + * Unsafe version of: {@link #glCreateTextures CreateTextures} + * + * @param n the number of texture names to create + */ + public static void nglCreateTextures(int target, int n, long textures) { + GL45C.nglCreateTextures(target, n, textures); + } + + /** + * Returns {@code n} previously unused texture names in {@code textures}, each representing a new texture object. + * + * @param target the texture target. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param textures the buffer in which to store the created texture names + */ + public static void glCreateTextures(@NativeType("GLenum") int target, @NativeType("GLuint *") IntBuffer textures) { + GL45C.glCreateTextures(target, textures); + } + + /** + * Returns {@code n} previously unused texture names in {@code textures}, each representing a new texture object. + * + * @param target the texture target. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + */ + @NativeType("void") + public static int glCreateTextures(@NativeType("GLenum") int target) { + return GL45C.glCreateTextures(target); + } + + // --- [ glTextureBuffer ] --- + + /** + * DSA version of {@link GL31C#glTexBuffer TexBuffer}. + * + * @param texture the texture name + * @param internalformat the sized internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + */ + public static void glTextureBuffer(@NativeType("GLuint") int texture, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer) { + GL45C.glTextureBuffer(texture, internalformat, buffer); + } + + // --- [ glTextureBufferRange ] --- + + /** + * DSA version of {@link GL43C#glTexBufferRange TexBufferRange}. + * + * @param texture the texture name + * @param internalformat the internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + * @param offset the offset of the start of the range of the buffer's data store to attach + * @param size the size of the range of the buffer's data store to attach + */ + public static void glTextureBufferRange(@NativeType("GLuint") int texture, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size) { + GL45C.glTextureBufferRange(texture, internalformat, buffer, offset, size); + } + + // --- [ glTextureStorage1D ] --- + + /** + * DSA version of {@link GL42C#glTexStorage1D TexStorage1D}. + * + * @param texture the texture name + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + */ + public static void glTextureStorage1D(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width) { + GL45C.glTextureStorage1D(texture, levels, internalformat, width); + } + + // --- [ glTextureStorage2D ] --- + + /** + * DSA version of {@link GL42C#glTexStorage2D TexStorage2D}. + * + * @param texture the texture name + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + */ + public static void glTextureStorage2D(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glTextureStorage2D(texture, levels, internalformat, width, height); + } + + // --- [ glTextureStorage3D ] --- + + /** + * DSA version of {@link GL42C#glTexStorage3D TexStorage3D}. + * + * @param texture the texture name + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + */ + public static void glTextureStorage3D(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth) { + GL45C.glTextureStorage3D(texture, levels, internalformat, width, height, depth); + } + + // --- [ glTextureStorage2DMultisample ] --- + + /** + * DSA version of {@link GL43C#glTexStorage2DMultisample TexStorage2DMultisample}. + * + * @param texture the texture name + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + */ + public static void glTextureStorage2DMultisample(@NativeType("GLuint") int texture, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL45C.glTextureStorage2DMultisample(texture, samples, internalformat, width, height, fixedsamplelocations); + } + + // --- [ glTextureStorage3DMultisample ] --- + + /** + * DSA version of {@link GL43C#glTexStorage3DMultisample TexStorage3DMultisample}. + * + * @param texture the texture name + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + */ + public static void glTextureStorage3DMultisample(@NativeType("GLuint") int texture, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL45C.glTextureStorage3DMultisample(texture, samples, internalformat, width, height, depth, fixedsamplelocations); + } + + // --- [ glTextureSubImage1D ] --- + + /** Unsafe version of: {@link #glTextureSubImage1D TextureSubImage1D} */ + public static void nglTextureSubImage1D(int texture, int level, int xoffset, int width, int format, int type, long pixels) { + GL45C.nglTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + // --- [ glTextureSubImage2D ] --- + + /** Unsafe version of: {@link #glTextureSubImage2D TextureSubImage2D} */ + public static void nglTextureSubImage2D(int texture, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels) { + GL45C.nglTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + // --- [ glTextureSubImage3D ] --- + + /** Unsafe version of: {@link #glTextureSubImage3D TextureSubImage3D} */ + public static void nglTextureSubImage3D(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels) { + GL45C.nglTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + // --- [ glCompressedTextureSubImage1D ] --- + + /** + * Unsafe version of: {@link #glCompressedTextureSubImage1D CompressedTextureSubImage1D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTextureSubImage1D(int texture, int level, int xoffset, int width, int format, int imageSize, long data) { + GL45C.nglCompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage1D CompressedTexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + */ + public static void glCompressedTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL45C.glCompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage1D CompressedTexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + */ + public static void glCompressedTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + GL45C.glCompressedTextureSubImage1D(texture, level, xoffset, width, format, data); + } + + // --- [ glCompressedTextureSubImage2D ] --- + + /** + * Unsafe version of: {@link #glCompressedTextureSubImage2D CompressedTextureSubImage2D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTextureSubImage2D(int texture, int level, int xoffset, int yoffset, int width, int height, int format, int imageSize, long data) { + GL45C.nglCompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage2D CompressedTexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + */ + public static void glCompressedTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL45C.glCompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage2D CompressedTexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + */ + public static void glCompressedTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + GL45C.glCompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, data); + } + + // --- [ glCompressedTextureSubImage3D ] --- + + /** + * Unsafe version of: {@link #glCompressedTextureSubImage3D CompressedTextureSubImage3D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTextureSubImage3D(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, long data) { + GL45C.nglCompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage3D CompressedTexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + */ + public static void glCompressedTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL45C.glCompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage3D CompressedTexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + */ + public static void glCompressedTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + GL45C.glCompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, data); + } + + // --- [ glCopyTextureSubImage1D ] --- + + /** + * DSA version of {@link GL11C#glCopyTexSubImage1D CopyTexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param xoffset the left texel coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + */ + public static void glCopyTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width) { + GL45C.glCopyTextureSubImage1D(texture, level, xoffset, x, y, width); + } + + // --- [ glCopyTextureSubImage2D ] --- + + /** + * DSA version of {@link GL11C#glCopyTexSubImage2D CopyTexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param xoffset the left texel coordinate of the texture subregion to update + * @param yoffset the lower texel coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * @param height the texture subregion height + */ + public static void glCopyTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glCopyTextureSubImage2D(texture, level, xoffset, yoffset, x, y, width, height); + } + + // --- [ glCopyTextureSubImage3D ] --- + + /** + * DSA version of {@link GL12C#glCopyTexSubImage3D CopyTexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param xoffset the x coordinate of the texture subregion to update + * @param yoffset the y coordinate of the texture subregion to update + * @param zoffset the z coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * @param height the texture subregion height + */ + public static void glCopyTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glCopyTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, x, y, width, height); + } + + // --- [ glTextureParameterf ] --- + + /** + * DSA version of {@link GL11C#glTexParameterf TexParameterf}. + * + * @param texture the texture name + * @param pname the parameter to set + * @param param the parameter value + */ + public static void glTextureParameterf(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param) { + GL45C.glTextureParameterf(texture, pname, param); + } + + // --- [ glTextureParameterfv ] --- + + /** Unsafe version of: {@link #glTextureParameterfv TextureParameterfv} */ + public static void nglTextureParameterfv(int texture, int pname, long params) { + GL45C.nglTextureParameterfv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glTexParameterfv TexParameterfv}. + * + * @param texture the texture name + * @param pname the parameter to set + * @param params the parameter value + */ + public static void glTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + GL45C.glTextureParameterfv(texture, pname, params); + } + + // --- [ glTextureParameteri ] --- + + /** + * DSA version of {@link GL11C#glTexParameteri TexParameteri}. + * + * @param texture the texture name + * @param pname the parameter to set. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    + * @param param the parameter value + */ + public static void glTextureParameteri(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint") int param) { + GL45C.glTextureParameteri(texture, pname, param); + } + + // --- [ glTextureParameterIiv ] --- + + /** Unsafe version of: {@link #glTextureParameterIiv TextureParameterIiv} */ + public static void nglTextureParameterIiv(int texture, int pname, long params) { + GL45C.nglTextureParameterIiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glTexParameterIiv TexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + * @param params the value of {@code pname} + */ + public static void glTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + GL45C.glTextureParameterIiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glTexParameterIiv TexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + */ + public static void glTextureParameterIi(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") int param) { + GL45C.glTextureParameterIi(texture, pname, param); + } + + // --- [ glTextureParameterIuiv ] --- + + /** Unsafe version of: {@link #glTextureParameterIuiv TextureParameterIuiv} */ + public static void nglTextureParameterIuiv(int texture, int pname, long params) { + GL45C.nglTextureParameterIuiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glTexParameterIuiv TexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + * @param params the value of {@code pname} + */ + public static void glTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint const *") IntBuffer params) { + GL45C.glTextureParameterIuiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glTexParameterIuiv TexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + */ + public static void glTextureParameterIui(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int param) { + GL45C.glTextureParameterIui(texture, pname, param); + } + + // --- [ glTextureParameteriv ] --- + + /** Unsafe version of: {@link #glTextureParameteriv TextureParameteriv} */ + public static void nglTextureParameteriv(int texture, int pname, long params) { + GL45C.nglTextureParameteriv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glTexParameteriv TexParameteriv}. + * + * @param texture the texture name + * @param pname the parameter to set + * @param params the parameter value + */ + public static void glTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + GL45C.glTextureParameteriv(texture, pname, params); + } + + // --- [ glGenerateTextureMipmap ] --- + + /** + * DSA version of {@link GL30C#glGenerateMipmap GenerateMipmap}. + * + * @param texture the texture name + */ + public static void glGenerateTextureMipmap(@NativeType("GLuint") int texture) { + GL45C.glGenerateTextureMipmap(texture); + } + + // --- [ glBindTextureUnit ] --- + + /** + * Binds an existing texture object to the texture unit numbered {@code unit}. + * + *

    {@code texture} must be zero or the name of an existing texture object. When {@code texture} is the name of an existing texture object, that object is + * bound to the target, in the corresponding texture unit, that was specified when the object was created. When {@code texture} is zero, each of the targets + * enumerated at the beginning of this section is reset to its default texture for the corresponding texture image unit.

    + * + * @param unit the texture unit number + * @param texture the texture name + */ + public static void glBindTextureUnit(@NativeType("GLuint") int unit, @NativeType("GLuint") int texture) { + GL45C.glBindTextureUnit(unit, texture); + } + + // --- [ glGetTextureImage ] --- + + /** + * Unsafe version of: {@link #glGetTextureImage GetTextureImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static void nglGetTextureImage(int texture, int level, int format, int type, int bufSize, long pixels) { + GL45C.nglGetTextureImage(texture, level, format, type, bufSize, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + GL45C.glGetTextureImage(texture, level, format, type, bufSize, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + // --- [ glGetCompressedTextureImage ] --- + + /** + * Unsafe version of: {@link #glGetCompressedTextureImage GetCompressedTextureImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static void nglGetCompressedTextureImage(int texture, int level, int bufSize, long pixels) { + GL45C.nglGetCompressedTextureImage(texture, level, bufSize, pixels); + } + + /** + * DSA version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels a buffer in which to return the compressed texture image + */ + public static void glGetCompressedTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + GL45C.glGetCompressedTextureImage(texture, level, bufSize, pixels); + } + + /** + * DSA version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param pixels a buffer in which to return the compressed texture image + */ + public static void glGetCompressedTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("void *") ByteBuffer pixels) { + GL45C.glGetCompressedTextureImage(texture, level, pixels); + } + + // --- [ glGetTextureLevelParameterfv ] --- + + /** Unsafe version of: {@link #glGetTextureLevelParameterfv GetTextureLevelParameterfv} */ + public static void nglGetTextureLevelParameterfv(int texture, int level, int pname, long params) { + GL45C.nglGetTextureLevelParameterfv(texture, level, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexLevelParameterfv GetTexLevelParameterfv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query + * @param params a scalar or buffer in which to place the returned data + */ + public static void glGetTextureLevelParameterfv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + GL45C.glGetTextureLevelParameterfv(texture, level, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexLevelParameterfv GetTexLevelParameterfv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query + */ + @NativeType("void") + public static float glGetTextureLevelParameterf(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureLevelParameterf(texture, level, pname); + } + + // --- [ glGetTextureLevelParameteriv ] --- + + /** Unsafe version of: {@link #glGetTextureLevelParameteriv GetTextureLevelParameteriv} */ + public static void nglGetTextureLevelParameteriv(int texture, int level, int pname, long params) { + GL45C.nglGetTextureLevelParameteriv(texture, level, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexLevelParameteriv GetTexLevelParameteriv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query. One of:
    {@link GL11#GL_TEXTURE_WIDTH TEXTURE_WIDTH}{@link GL11#GL_TEXTURE_HEIGHT TEXTURE_HEIGHT}{@link GL12#GL_TEXTURE_DEPTH TEXTURE_DEPTH}{@link GL32#GL_TEXTURE_SAMPLES TEXTURE_SAMPLES}
    {@link GL32#GL_TEXTURE_FIXED_SAMPLE_LOCATIONS TEXTURE_FIXED_SAMPLE_LOCATIONS}{@link GL11#GL_TEXTURE_INTERNAL_FORMAT TEXTURE_INTERNAL_FORMAT}{@link GL11#GL_TEXTURE_RED_SIZE TEXTURE_RED_SIZE}{@link GL11#GL_TEXTURE_GREEN_SIZE TEXTURE_GREEN_SIZE}
    {@link GL11#GL_TEXTURE_BLUE_SIZE TEXTURE_BLUE_SIZE}{@link GL11#GL_TEXTURE_ALPHA_SIZE TEXTURE_ALPHA_SIZE}{@link GL14#GL_TEXTURE_DEPTH_SIZE TEXTURE_DEPTH_SIZE}{@link GL30#GL_TEXTURE_STENCIL_SIZE TEXTURE_STENCIL_SIZE}
    {@link GL30#GL_TEXTURE_SHARED_SIZE TEXTURE_SHARED_SIZE}{@link GL30#GL_TEXTURE_ALPHA_TYPE TEXTURE_ALPHA_TYPE}{@link GL30#GL_TEXTURE_DEPTH_TYPE TEXTURE_DEPTH_TYPE}{@link GL13#GL_TEXTURE_COMPRESSED TEXTURE_COMPRESSED}
    {@link GL13#GL_TEXTURE_COMPRESSED_IMAGE_SIZE TEXTURE_COMPRESSED_IMAGE_SIZE}{@link GL31#GL_TEXTURE_BUFFER_DATA_STORE_BINDING TEXTURE_BUFFER_DATA_STORE_BINDING}{@link GL43#GL_TEXTURE_BUFFER_OFFSET TEXTURE_BUFFER_OFFSET}{@link GL43#GL_TEXTURE_BUFFER_SIZE TEXTURE_BUFFER_SIZE}
    + * @param params a scalar or buffer in which to place the returned data + */ + public static void glGetTextureLevelParameteriv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetTextureLevelParameteriv(texture, level, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexLevelParameteriv GetTexLevelParameteriv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query. One of:
    {@link GL11#GL_TEXTURE_WIDTH TEXTURE_WIDTH}{@link GL11#GL_TEXTURE_HEIGHT TEXTURE_HEIGHT}{@link GL12#GL_TEXTURE_DEPTH TEXTURE_DEPTH}{@link GL32#GL_TEXTURE_SAMPLES TEXTURE_SAMPLES}
    {@link GL32#GL_TEXTURE_FIXED_SAMPLE_LOCATIONS TEXTURE_FIXED_SAMPLE_LOCATIONS}{@link GL11#GL_TEXTURE_INTERNAL_FORMAT TEXTURE_INTERNAL_FORMAT}{@link GL11#GL_TEXTURE_RED_SIZE TEXTURE_RED_SIZE}{@link GL11#GL_TEXTURE_GREEN_SIZE TEXTURE_GREEN_SIZE}
    {@link GL11#GL_TEXTURE_BLUE_SIZE TEXTURE_BLUE_SIZE}{@link GL11#GL_TEXTURE_ALPHA_SIZE TEXTURE_ALPHA_SIZE}{@link GL14#GL_TEXTURE_DEPTH_SIZE TEXTURE_DEPTH_SIZE}{@link GL30#GL_TEXTURE_STENCIL_SIZE TEXTURE_STENCIL_SIZE}
    {@link GL30#GL_TEXTURE_SHARED_SIZE TEXTURE_SHARED_SIZE}{@link GL30#GL_TEXTURE_ALPHA_TYPE TEXTURE_ALPHA_TYPE}{@link GL30#GL_TEXTURE_DEPTH_TYPE TEXTURE_DEPTH_TYPE}{@link GL13#GL_TEXTURE_COMPRESSED TEXTURE_COMPRESSED}
    {@link GL13#GL_TEXTURE_COMPRESSED_IMAGE_SIZE TEXTURE_COMPRESSED_IMAGE_SIZE}{@link GL31#GL_TEXTURE_BUFFER_DATA_STORE_BINDING TEXTURE_BUFFER_DATA_STORE_BINDING}{@link GL43#GL_TEXTURE_BUFFER_OFFSET TEXTURE_BUFFER_OFFSET}{@link GL43#GL_TEXTURE_BUFFER_SIZE TEXTURE_BUFFER_SIZE}
    + */ + @NativeType("void") + public static int glGetTextureLevelParameteri(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureLevelParameteri(texture, level, pname); + } + + // --- [ glGetTextureParameterfv ] --- + + /** Unsafe version of: {@link #glGetTextureParameterfv GetTextureParameterfv} */ + public static void nglGetTextureParameterfv(int texture, int pname, long params) { + GL45C.nglGetTextureParameterfv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexParameterfv GetTexParameterfv}. + * + * @param texture the texture name + * @param pname the parameter to query + * @param params a scalar or buffer in which to place the returned data + */ + public static void glGetTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + GL45C.glGetTextureParameterfv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexParameterfv GetTexParameterfv}. + * + * @param texture the texture name + * @param pname the parameter to query + */ + @NativeType("void") + public static float glGetTextureParameterf(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureParameterf(texture, pname); + } + + // --- [ glGetTextureParameterIiv ] --- + + /** Unsafe version of: {@link #glGetTextureParameterIiv GetTextureParameterIiv} */ + public static void nglGetTextureParameterIiv(int texture, int pname, long params) { + GL45C.nglGetTextureParameterIiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetTexParameterIiv GetTexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + * @param params returns the texture parameter value + */ + public static void glGetTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetTextureParameterIiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetTexParameterIiv GetTexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + */ + @NativeType("void") + public static int glGetTextureParameterIi(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureParameterIi(texture, pname); + } + + // --- [ glGetTextureParameterIuiv ] --- + + /** Unsafe version of: {@link #glGetTextureParameterIuiv GetTextureParameterIuiv} */ + public static void nglGetTextureParameterIuiv(int texture, int pname, long params) { + GL45C.nglGetTextureParameterIuiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetTexParameterIuiv GetTexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + * @param params returns the texture parameter value + */ + public static void glGetTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + GL45C.glGetTextureParameterIuiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetTexParameterIuiv GetTexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + */ + @NativeType("void") + public static int glGetTextureParameterIui(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureParameterIui(texture, pname); + } + + // --- [ glGetTextureParameteriv ] --- + + /** Unsafe version of: {@link #glGetTextureParameteriv GetTextureParameteriv} */ + public static void nglGetTextureParameteriv(int texture, int pname, long params) { + GL45C.nglGetTextureParameteriv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexParameteriv GetTexParameteriv}. + * + * @param texture the texture name + * @param pname the parameter to query. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    {@link GL42#GL_IMAGE_FORMAT_COMPATIBILITY_TYPE IMAGE_FORMAT_COMPATIBILITY_TYPE}{@link GL42#GL_TEXTURE_IMMUTABLE_FORMAT TEXTURE_IMMUTABLE_FORMAT}{@link GL43#GL_TEXTURE_IMMUTABLE_LEVELS TEXTURE_IMMUTABLE_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LEVEL TEXTURE_VIEW_MIN_LEVEL}
    {@link GL43#GL_TEXTURE_VIEW_NUM_LEVELS TEXTURE_VIEW_NUM_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LAYER TEXTURE_VIEW_MIN_LAYER}{@link GL43#GL_TEXTURE_VIEW_NUM_LAYERS TEXTURE_VIEW_NUM_LAYERS}
    + * @param params a scalar or buffer in which to place the returned data + */ + public static void glGetTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetTextureParameteriv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexParameteriv GetTexParameteriv}. + * + * @param texture the texture name + * @param pname the parameter to query. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    {@link GL42#GL_IMAGE_FORMAT_COMPATIBILITY_TYPE IMAGE_FORMAT_COMPATIBILITY_TYPE}{@link GL42#GL_TEXTURE_IMMUTABLE_FORMAT TEXTURE_IMMUTABLE_FORMAT}{@link GL43#GL_TEXTURE_IMMUTABLE_LEVELS TEXTURE_IMMUTABLE_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LEVEL TEXTURE_VIEW_MIN_LEVEL}
    {@link GL43#GL_TEXTURE_VIEW_NUM_LEVELS TEXTURE_VIEW_NUM_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LAYER TEXTURE_VIEW_MIN_LAYER}{@link GL43#GL_TEXTURE_VIEW_NUM_LAYERS TEXTURE_VIEW_NUM_LAYERS}
    + */ + @NativeType("void") + public static int glGetTextureParameteri(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureParameteri(texture, pname); + } + + // --- [ glCreateVertexArrays ] --- + + /** + * Unsafe version of: {@link #glCreateVertexArrays CreateVertexArrays} + * + * @param n the number of vertex array object names to create + */ + public static void nglCreateVertexArrays(int n, long arrays) { + GL45C.nglCreateVertexArrays(n, arrays); + } + + /** + * Returns {@code n} previously unused vertex array object names in {@code arrays}. + * + * @param arrays the buffer in which to return the created vertex array object names + */ + public static void glCreateVertexArrays(@NativeType("GLuint *") IntBuffer arrays) { + GL45C.glCreateVertexArrays(arrays); + } + + /** Returns {@code n} previously unused vertex array object names in {@code arrays}. */ + @NativeType("void") + public static int glCreateVertexArrays() { + return GL45C.glCreateVertexArrays(); + } + + // --- [ glDisableVertexArrayAttrib ] --- + + /** + * DSA version of {@link GL20C#glDisableVertexAttribArray DisableVertexAttribArray}. + * + * @param vaobj the vertex array object name + * @param index the index of the generic vertex attribute to be disabled + */ + public static void glDisableVertexArrayAttrib(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index) { + GL45C.glDisableVertexArrayAttrib(vaobj, index); + } + + // --- [ glEnableVertexArrayAttrib ] --- + + /** + * DSA version of {@link GL20C#glEnableVertexAttribArray EnableVertexAttribArray}. + * + * @param vaobj the vertex array object name + * @param index the index of the generic vertex attribute to be enabled + */ + public static void glEnableVertexArrayAttrib(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index) { + GL45C.glEnableVertexArrayAttrib(vaobj, index); + } + + // --- [ glVertexArrayElementBuffer ] --- + + /** + * Binds a buffer object to the element array buffer bind point of a vertex array object. + * + * @param vaobj the vertex array object name + * @param buffer the buffer object name. If {@code buffer} is zero, any existing element array buffer binding to {@code vaobj} is removed. + */ + public static void glVertexArrayElementBuffer(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer) { + GL45C.glVertexArrayElementBuffer(vaobj, buffer); + } + + // --- [ glVertexArrayVertexBuffer ] --- + + /** + * DSA version of {@link GL43C#glBindVertexBuffer BindVertexBuffer}. + * + * @param vaobj the vertex array object name + * @param bindingindex the index of the vertex buffer binding point to which to bind the buffer + * @param buffer the name of an existing buffer to bind to the vertex buffer binding point + * @param offset the offset of the first element of the buffer + * @param stride the distance between elements within the buffer + */ + public static void glVertexArrayVertexBuffer(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int bindingindex, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizei") int stride) { + GL45C.glVertexArrayVertexBuffer(vaobj, bindingindex, buffer, offset, stride); + } + + // --- [ glVertexArrayVertexBuffers ] --- + + /** + * Unsafe version of: {@link #glVertexArrayVertexBuffers VertexArrayVertexBuffers} + * + * @param count the number of vertex buffer binding points + */ + public static void nglVertexArrayVertexBuffers(int vaobj, int first, int count, long buffers, long offsets, long strides) { + GL45C.nglVertexArrayVertexBuffers(vaobj, first, count, buffers, offsets, strides); + } + + /** + * DSA version of {@link GL44C#glBindVertexBuffers BindVertexBuffers}. + * + * @param vaobj the vertex array object name + * @param first the first vertex buffer binding point + * @param buffers an array of zeros or names of existing buffers objects + * @param offsets an array of offses + * @param strides an array of stride values + */ + public static void glVertexArrayVertexBuffers(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") IntBuffer strides) { + GL45C.glVertexArrayVertexBuffers(vaobj, first, buffers, offsets, strides); + } + + // --- [ glVertexArrayAttribFormat ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribFormat VertexAttribFormat}. + * + * @param vaobj the vertex array object name + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param normalized if true then integer data is normalized to the range [-1, 1] or [0, 1] if it is signed or unsigned, respectively. If false then integer data is + * directly converted to floating point. + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + */ + public static void glVertexArrayAttribFormat(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int relativeoffset) { + GL45C.glVertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset); + } + + // --- [ glVertexArrayAttribIFormat ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribIFormat VertexAttribIFormat}. + * + * @param vaobj the vertex array object name + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + */ + public static void glVertexArrayAttribIFormat(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset) { + GL45C.glVertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset); + } + + // --- [ glVertexArrayAttribLFormat ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribLFormat VertexAttribLFormat}. + * + * @param vaobj the vertex array object name + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + */ + public static void glVertexArrayAttribLFormat(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset) { + GL45C.glVertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset); + } + + // --- [ glVertexArrayAttribBinding ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribBinding VertexAttribBinding}. + * + * @param vaobj the vertex array object name + * @param attribindex the index of the attribute to associate with a vertex buffer binding + * @param bindingindex the index of the vertex buffer binding with which to associate the generic vertex attribute + */ + public static void glVertexArrayAttribBinding(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLuint") int bindingindex) { + GL45C.glVertexArrayAttribBinding(vaobj, attribindex, bindingindex); + } + + // --- [ glVertexArrayBindingDivisor ] --- + + /** + * DSA version of {@link GL43C#glVertexBindingDivisor VertexBindingDivisor}. + * + * @param vaobj the vertex array object name + * @param bindingindex the index of the generic vertex attribute + * @param divisor the number of instances that will pass between updates of the generic attribute at slot {@code index} + */ + public static void glVertexArrayBindingDivisor(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int bindingindex, @NativeType("GLuint") int divisor) { + GL45C.glVertexArrayBindingDivisor(vaobj, bindingindex, divisor); + } + + // --- [ glGetVertexArrayiv ] --- + + /** Unsafe version of: {@link #glGetVertexArrayiv GetVertexArrayiv} */ + public static void nglGetVertexArrayiv(int vaobj, int pname, long param) { + GL45C.nglGetVertexArrayiv(vaobj, pname, param); + } + + /** + * Queries parameters of a vertex array object. + * + * @param vaobj the vertex array object name + * @param pname the parameter to query. Must be:
    {@link GL15#GL_ELEMENT_ARRAY_BUFFER_BINDING ELEMENT_ARRAY_BUFFER_BINDING}
    + * @param param the buffer in which to return the parameter values + */ + public static void glGetVertexArrayiv(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + GL45C.glGetVertexArrayiv(vaobj, pname, param); + } + + /** + * Queries parameters of a vertex array object. + * + * @param vaobj the vertex array object name + * @param pname the parameter to query. Must be:
    {@link GL15#GL_ELEMENT_ARRAY_BUFFER_BINDING ELEMENT_ARRAY_BUFFER_BINDING}
    + */ + @NativeType("void") + public static int glGetVertexArrayi(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname) { + return GL45C.glGetVertexArrayi(vaobj, pname); + } + + // --- [ glGetVertexArrayIndexediv ] --- + + /** Unsafe version of: {@link #glGetVertexArrayIndexediv GetVertexArrayIndexediv} */ + public static void nglGetVertexArrayIndexediv(int vaobj, int index, int pname, long param) { + GL45C.nglGetVertexArrayIndexediv(vaobj, index, pname, param); + } + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. One of:
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_ENABLED VERTEX_ATTRIB_ARRAY_ENABLED}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_SIZE VERTEX_ATTRIB_ARRAY_SIZE},
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_STRIDE VERTEX_ATTRIB_ARRAY_STRIDE}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_TYPE VERTEX_ATTRIB_ARRAY_TYPE}
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_NORMALIZED VERTEX_ATTRIB_ARRAY_NORMALIZED}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}{@link GL43#GL_VERTEX_ATTRIB_ARRAY_LONG VERTEX_ATTRIB_ARRAY_LONG}
    {@link GL43#GL_VERTEX_ATTRIB_RELATIVE_OFFSET VERTEX_ATTRIB_RELATIVE_OFFSET}
    + * @param param the buffer in which to return the parameter values + */ + public static void glGetVertexArrayIndexediv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + GL45C.glGetVertexArrayIndexediv(vaobj, index, pname, param); + } + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. One of:
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_ENABLED VERTEX_ATTRIB_ARRAY_ENABLED}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_SIZE VERTEX_ATTRIB_ARRAY_SIZE},
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_STRIDE VERTEX_ATTRIB_ARRAY_STRIDE}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_TYPE VERTEX_ATTRIB_ARRAY_TYPE}
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_NORMALIZED VERTEX_ATTRIB_ARRAY_NORMALIZED}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}{@link GL43#GL_VERTEX_ATTRIB_ARRAY_LONG VERTEX_ATTRIB_ARRAY_LONG}
    {@link GL43#GL_VERTEX_ATTRIB_RELATIVE_OFFSET VERTEX_ATTRIB_RELATIVE_OFFSET}
    + */ + @NativeType("void") + public static int glGetVertexArrayIndexedi(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL45C.glGetVertexArrayIndexedi(vaobj, index, pname); + } + + // --- [ glGetVertexArrayIndexed64iv ] --- + + /** Unsafe version of: {@link #glGetVertexArrayIndexed64iv GetVertexArrayIndexed64iv} */ + public static void nglGetVertexArrayIndexed64iv(int vaobj, int index, int pname, long param) { + GL45C.nglGetVertexArrayIndexed64iv(vaobj, index, pname, param); + } + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. Must be:
    {@link GL43#GL_VERTEX_BINDING_OFFSET VERTEX_BINDING_OFFSET}
    + * @param param the buffer in which to return the parameter values + */ + public static void glGetVertexArrayIndexed64iv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer param) { + GL45C.glGetVertexArrayIndexed64iv(vaobj, index, pname, param); + } + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. Must be:
    {@link GL43#GL_VERTEX_BINDING_OFFSET VERTEX_BINDING_OFFSET}
    + */ + @NativeType("void") + public static long glGetVertexArrayIndexed64i(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL45C.glGetVertexArrayIndexed64i(vaobj, index, pname); + } + + // --- [ glCreateSamplers ] --- + + /** + * Unsafe version of: {@link #glCreateSamplers CreateSamplers} + * + * @param n the number of sampler object names to create + */ + public static void nglCreateSamplers(int n, long samplers) { + GL45C.nglCreateSamplers(n, samplers); + } + + /** + * Returns {@code n} previously unused sampler names in {@code samplers}, each representing a new sampler object. + * + * @param samplers the buffer in which to return the created sampler object names + */ + public static void glCreateSamplers(@NativeType("GLuint *") IntBuffer samplers) { + GL45C.glCreateSamplers(samplers); + } + + /** Returns {@code n} previously unused sampler names in {@code samplers}, each representing a new sampler object. */ + @NativeType("void") + public static int glCreateSamplers() { + return GL45C.glCreateSamplers(); + } + + // --- [ glCreateProgramPipelines ] --- + + /** + * Unsafe version of: {@link #glCreateProgramPipelines CreateProgramPipelines} + * + * @param n the number of program pipeline names to create + */ + public static void nglCreateProgramPipelines(int n, long pipelines) { + GL45C.nglCreateProgramPipelines(n, pipelines); + } + + /** + * Returns {@code n} previously unused program pipeline names in {@code pipelines}, each representing a new program pipeline object. + * + * @param pipelines the buffer in which to return the created program pipeline names + */ + public static void glCreateProgramPipelines(@NativeType("GLuint *") IntBuffer pipelines) { + GL45C.glCreateProgramPipelines(pipelines); + } + + /** Returns {@code n} previously unused program pipeline names in {@code pipelines}, each representing a new program pipeline object. */ + @NativeType("void") + public static int glCreateProgramPipelines() { + return GL45C.glCreateProgramPipelines(); + } + + // --- [ glCreateQueries ] --- + + /** + * Unsafe version of: {@link #glCreateQueries CreateQueries} + * + * @param n the number of query object names to create + */ + public static void nglCreateQueries(int target, int n, long ids) { + GL45C.nglCreateQueries(target, n, ids); + } + + /** + * Returns {@code n} previously unused query object names in {@code ids}, each representing a new query object with the specified {@code target}. + * + * @param target the query target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param ids the buffer in which to return the created query object names + */ + public static void glCreateQueries(@NativeType("GLenum") int target, @NativeType("GLuint *") IntBuffer ids) { + GL45C.glCreateQueries(target, ids); + } + + /** + * Returns {@code n} previously unused query object names in {@code ids}, each representing a new query object with the specified {@code target}. + * + * @param target the query target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + */ + @NativeType("void") + public static int glCreateQueries(@NativeType("GLenum") int target) { + return GL45C.glCreateQueries(target); + } + + // --- [ glGetQueryBufferObjecti64v ] --- + + /** + * 64bit version of {@link #glGetQueryBufferObjectiv GetQueryBufferObjectiv}. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + */ + public static void glGetQueryBufferObjecti64v(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset) { + GL45C.glGetQueryBufferObjecti64v(id, buffer, pname, offset); + } + + // --- [ glGetQueryBufferObjectiv ] --- + + /** + * Queries the state of a query object. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + */ + public static void glGetQueryBufferObjectiv(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset) { + GL45C.glGetQueryBufferObjectiv(id, buffer, pname, offset); + } + + // --- [ glGetQueryBufferObjectui64v ] --- + + /** + * 64bit version of {@link #glGetQueryBufferObjectuiv GetQueryBufferObjectuiv}. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + */ + public static void glGetQueryBufferObjectui64v(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset) { + GL45C.glGetQueryBufferObjectui64v(id, buffer, pname, offset); + } + + // --- [ glGetQueryBufferObjectuiv ] --- + + /** + * Unsigned version of {@link #glGetQueryBufferObjectiv GetQueryBufferObjectiv}. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + */ + public static void glGetQueryBufferObjectuiv(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset) { + GL45C.glGetQueryBufferObjectuiv(id, buffer, pname, offset); + } + + /** Array version of: {@link #glCreateTransformFeedbacks CreateTransformFeedbacks} */ + public static void glCreateTransformFeedbacks(@NativeType("GLuint *") int[] ids) { + GL45C.glCreateTransformFeedbacks(ids); + } + + /** Array version of: {@link #glGetTransformFeedbackiv GetTransformFeedbackiv} */ + public static void glGetTransformFeedbackiv(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + GL45C.glGetTransformFeedbackiv(xfb, pname, param); + } + + /** Array version of: {@link #glGetTransformFeedbacki_v GetTransformFeedbacki_v} */ + public static void glGetTransformFeedbacki_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint *") int[] param) { + GL45C.glGetTransformFeedbacki_v(xfb, pname, index, param); + } + + /** Array version of: {@link #glGetTransformFeedbacki64_v GetTransformFeedbacki64_v} */ + public static void glGetTransformFeedbacki64_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint64 *") long[] param) { + GL45C.glGetTransformFeedbacki64_v(xfb, pname, index, param); + } + + /** Array version of: {@link #glCreateBuffers CreateBuffers} */ + public static void glCreateBuffers(@NativeType("GLuint *") int[] buffers) { + GL45C.glCreateBuffers(buffers); + } + + /** Array version of: {@link #glNamedBufferStorage NamedBufferStorage} */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") short[] data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** Array version of: {@link #glNamedBufferStorage NamedBufferStorage} */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") int[] data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** Array version of: {@link #glNamedBufferStorage NamedBufferStorage} */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") float[] data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** Array version of: {@link #glNamedBufferStorage NamedBufferStorage} */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") double[] data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** Array version of: {@link #glNamedBufferData NamedBufferData} */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") short[] data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** Array version of: {@link #glNamedBufferData NamedBufferData} */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") int[] data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** Array version of: {@link #glNamedBufferData NamedBufferData} */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") long[] data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** Array version of: {@link #glNamedBufferData NamedBufferData} */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") float[] data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** Array version of: {@link #glNamedBufferData NamedBufferData} */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") double[] data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** Array version of: {@link #glNamedBufferSubData NamedBufferSubData} */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") short[] data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** Array version of: {@link #glNamedBufferSubData NamedBufferSubData} */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") int[] data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** Array version of: {@link #glNamedBufferSubData NamedBufferSubData} */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") long[] data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** Array version of: {@link #glNamedBufferSubData NamedBufferSubData} */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") float[] data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** Array version of: {@link #glNamedBufferSubData NamedBufferSubData} */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") double[] data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** Array version of: {@link #glClearNamedBufferData ClearNamedBufferData} */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** Array version of: {@link #glClearNamedBufferData ClearNamedBufferData} */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** Array version of: {@link #glClearNamedBufferData ClearNamedBufferData} */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** Array version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** Array version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** Array version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** Array version of: {@link #glGetNamedBufferParameteriv GetNamedBufferParameteriv} */ + public static void glGetNamedBufferParameteriv(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetNamedBufferParameteriv(buffer, pname, params); + } + + /** Array version of: {@link #glGetNamedBufferParameteri64v GetNamedBufferParameteri64v} */ + public static void glGetNamedBufferParameteri64v(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + GL45C.glGetNamedBufferParameteri64v(buffer, pname, params); + } + + /** Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") short[] data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") int[] data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") long[] data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") float[] data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") double[] data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** Array version of: {@link #glCreateFramebuffers CreateFramebuffers} */ + public static void glCreateFramebuffers(@NativeType("GLuint *") int[] framebuffers) { + GL45C.glCreateFramebuffers(framebuffers); + } + + /** Array version of: {@link #glNamedFramebufferDrawBuffers NamedFramebufferDrawBuffers} */ + public static void glNamedFramebufferDrawBuffers(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int[] bufs) { + GL45C.glNamedFramebufferDrawBuffers(framebuffer, bufs); + } + + /** Array version of: {@link #glInvalidateNamedFramebufferData InvalidateNamedFramebufferData} */ + public static void glInvalidateNamedFramebufferData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int[] attachments) { + GL45C.glInvalidateNamedFramebufferData(framebuffer, attachments); + } + + /** Array version of: {@link #glInvalidateNamedFramebufferSubData InvalidateNamedFramebufferSubData} */ + public static void glInvalidateNamedFramebufferSubData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int[] attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glInvalidateNamedFramebufferSubData(framebuffer, attachments, x, y, width, height); + } + + /** Array version of: {@link #glClearNamedFramebufferiv ClearNamedFramebufferiv} */ + public static void glClearNamedFramebufferiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") int[] value) { + GL45C.glClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); + } + + /** Array version of: {@link #glClearNamedFramebufferuiv ClearNamedFramebufferuiv} */ + public static void glClearNamedFramebufferuiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") int[] value) { + GL45C.glClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); + } + + /** Array version of: {@link #glClearNamedFramebufferfv ClearNamedFramebufferfv} */ + public static void glClearNamedFramebufferfv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat const *") float[] value) { + GL45C.glClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); + } + + /** Array version of: {@link #glGetNamedFramebufferParameteriv GetNamedFramebufferParameteriv} */ + public static void glGetNamedFramebufferParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetNamedFramebufferParameteriv(framebuffer, pname, params); + } + + /** Array version of: {@link #glGetNamedFramebufferAttachmentParameteriv GetNamedFramebufferAttachmentParameteriv} */ + public static void glGetNamedFramebufferAttachmentParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params); + } + + /** Array version of: {@link #glCreateRenderbuffers CreateRenderbuffers} */ + public static void glCreateRenderbuffers(@NativeType("GLuint *") int[] renderbuffers) { + GL45C.glCreateRenderbuffers(renderbuffers); + } + + /** Array version of: {@link #glGetNamedRenderbufferParameteriv GetNamedRenderbufferParameteriv} */ + public static void glGetNamedRenderbufferParameteriv(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetNamedRenderbufferParameteriv(renderbuffer, pname, params); + } + + /** Array version of: {@link #glCreateTextures CreateTextures} */ + public static void glCreateTextures(@NativeType("GLenum") int target, @NativeType("GLuint *") int[] textures) { + GL45C.glCreateTextures(target, textures); + } + + /** Array version of: {@link #glTextureSubImage1D TextureSubImage1D} */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** Array version of: {@link #glTextureSubImage1D TextureSubImage1D} */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** Array version of: {@link #glTextureSubImage1D TextureSubImage1D} */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** Array version of: {@link #glTextureSubImage1D TextureSubImage1D} */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** Array version of: {@link #glTextureSubImage2D TextureSubImage2D} */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** Array version of: {@link #glTextureSubImage2D TextureSubImage2D} */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** Array version of: {@link #glTextureSubImage2D TextureSubImage2D} */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** Array version of: {@link #glTextureSubImage2D TextureSubImage2D} */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** Array version of: {@link #glTextureSubImage3D TextureSubImage3D} */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** Array version of: {@link #glTextureSubImage3D TextureSubImage3D} */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** Array version of: {@link #glTextureSubImage3D TextureSubImage3D} */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** Array version of: {@link #glTextureSubImage3D TextureSubImage3D} */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** Array version of: {@link #glTextureParameterfv TextureParameterfv} */ + public static void glTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + GL45C.glTextureParameterfv(texture, pname, params); + } + + /** Array version of: {@link #glTextureParameterIiv TextureParameterIiv} */ + public static void glTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + GL45C.glTextureParameterIiv(texture, pname, params); + } + + /** Array version of: {@link #glTextureParameterIuiv TextureParameterIuiv} */ + public static void glTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int[] params) { + GL45C.glTextureParameterIuiv(texture, pname, params); + } + + /** Array version of: {@link #glTextureParameteriv TextureParameteriv} */ + public static void glTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + GL45C.glTextureParameteriv(texture, pname, params); + } + + /** Array version of: {@link #glGetTextureImage GetTextureImage} */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** Array version of: {@link #glGetTextureImage GetTextureImage} */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** Array version of: {@link #glGetTextureImage GetTextureImage} */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** Array version of: {@link #glGetTextureImage GetTextureImage} */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** Array version of: {@link #glGetTextureLevelParameterfv GetTextureLevelParameterfv} */ + public static void glGetTextureLevelParameterfv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + GL45C.glGetTextureLevelParameterfv(texture, level, pname, params); + } + + /** Array version of: {@link #glGetTextureLevelParameteriv GetTextureLevelParameteriv} */ + public static void glGetTextureLevelParameteriv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetTextureLevelParameteriv(texture, level, pname, params); + } + + /** Array version of: {@link #glGetTextureParameterfv GetTextureParameterfv} */ + public static void glGetTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + GL45C.glGetTextureParameterfv(texture, pname, params); + } + + /** Array version of: {@link #glGetTextureParameterIiv GetTextureParameterIiv} */ + public static void glGetTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetTextureParameterIiv(texture, pname, params); + } + + /** Array version of: {@link #glGetTextureParameterIuiv GetTextureParameterIuiv} */ + public static void glGetTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + GL45C.glGetTextureParameterIuiv(texture, pname, params); + } + + /** Array version of: {@link #glGetTextureParameteriv GetTextureParameteriv} */ + public static void glGetTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetTextureParameteriv(texture, pname, params); + } + + /** Array version of: {@link #glCreateVertexArrays CreateVertexArrays} */ + public static void glCreateVertexArrays(@NativeType("GLuint *") int[] arrays) { + GL45C.glCreateVertexArrays(arrays); + } + + /** Array version of: {@link #glVertexArrayVertexBuffers VertexArrayVertexBuffers} */ + public static void glVertexArrayVertexBuffers(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") int[] strides) { + GL45C.glVertexArrayVertexBuffers(vaobj, first, buffers, offsets, strides); + } + + /** Array version of: {@link #glGetVertexArrayiv GetVertexArrayiv} */ + public static void glGetVertexArrayiv(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + GL45C.glGetVertexArrayiv(vaobj, pname, param); + } + + /** Array version of: {@link #glGetVertexArrayIndexediv GetVertexArrayIndexediv} */ + public static void glGetVertexArrayIndexediv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + GL45C.glGetVertexArrayIndexediv(vaobj, index, pname, param); + } + + /** Array version of: {@link #glGetVertexArrayIndexed64iv GetVertexArrayIndexed64iv} */ + public static void glGetVertexArrayIndexed64iv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] param) { + GL45C.glGetVertexArrayIndexed64iv(vaobj, index, pname, param); + } + + /** Array version of: {@link #glCreateSamplers CreateSamplers} */ + public static void glCreateSamplers(@NativeType("GLuint *") int[] samplers) { + GL45C.glCreateSamplers(samplers); + } + + /** Array version of: {@link #glCreateProgramPipelines CreateProgramPipelines} */ + public static void glCreateProgramPipelines(@NativeType("GLuint *") int[] pipelines) { + GL45C.glCreateProgramPipelines(pipelines); + } + + /** Array version of: {@link #glCreateQueries CreateQueries} */ + public static void glCreateQueries(@NativeType("GLenum") int target, @NativeType("GLuint *") int[] ids) { + GL45C.glCreateQueries(target, ids); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawBuffers.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawBuffers.java new file mode 100644 index 000000000..bd98b39fa --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawBuffers.java @@ -0,0 +1,79 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_draw_buffers extension. + * + *

    This extension extends {@link ARBFragmentProgram ARB_fragment_program} and {@link ARBFragmentShader ARB_fragment_shader} to allow multiple output colors, and provides a mechanism for + * directing those outputs to multiple color buffers.

    + * + *

    Requires {@link GL13 OpenGL 1.3}. Promoted to core in {@link GL20 OpenGL 2.0}.

    + */ +public class ARBDrawBuffers { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameters of GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_DRAW_BUFFERS_ARB = 0x8824, + GL_DRAW_BUFFER0_ARB = 0x8825, + GL_DRAW_BUFFER1_ARB = 0x8826, + GL_DRAW_BUFFER2_ARB = 0x8827, + GL_DRAW_BUFFER3_ARB = 0x8828, + GL_DRAW_BUFFER4_ARB = 0x8829, + GL_DRAW_BUFFER5_ARB = 0x882A, + GL_DRAW_BUFFER6_ARB = 0x882B, + GL_DRAW_BUFFER7_ARB = 0x882C, + GL_DRAW_BUFFER8_ARB = 0x882D, + GL_DRAW_BUFFER9_ARB = 0x882E, + GL_DRAW_BUFFER10_ARB = 0x882F, + GL_DRAW_BUFFER11_ARB = 0x8830, + GL_DRAW_BUFFER12_ARB = 0x8831, + GL_DRAW_BUFFER13_ARB = 0x8832, + GL_DRAW_BUFFER14_ARB = 0x8833, + GL_DRAW_BUFFER15_ARB = 0x8834; + + protected ARBDrawBuffers() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawBuffersARB ] --- + + /** + * Unsafe version of: {@link #glDrawBuffersARB DrawBuffersARB} + * + * @param n the number of buffers in {@code bufs} + */ + public static native void nglDrawBuffersARB(int n, long bufs); + + /** + * Defines the draw buffers to which all output colors are written. + * + * @param bufs a buffer of symbolic constants specifying the buffer to which each output color is written. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL11#GL_AUX0 AUX0}{@link GL11#GL_AUX1 AUX1}{@link GL11#GL_AUX2 AUX2}
    {@link GL11#GL_AUX3 AUX3}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}GL30.GL_COLOR_ATTACHMENT[1-15]
    + */ + public static void glDrawBuffersARB(@NativeType("GLenum const *") IntBuffer bufs) { + nglDrawBuffersARB(bufs.remaining(), memAddress(bufs)); + } + + /** Array version of: {@link #glDrawBuffersARB DrawBuffersARB} */ + public static void glDrawBuffersARB(@NativeType("GLenum const *") int[] bufs) { + long __functionAddress = GL.getICD().glDrawBuffersARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(bufs.length, bufs, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawBuffersBlend.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawBuffersBlend.java new file mode 100644 index 000000000..bdceb8b30 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawBuffersBlend.java @@ -0,0 +1,112 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_draw_buffers_blend extension. + * + *

    This extension builds upon the {@link ARBDrawBuffers ARB_draw_buffers} and {@link EXTDrawBuffers2 EXT_draw_buffers2} extensions. In ARB_draw_buffers (part of OpenGL 2.0), separate + * values could be written to each color buffer. This was further enhanced by EXT_draw_buffers2 by adding in the ability to enable blending and to set + * color write masks independently per color output.

    + * + *

    This extension provides the ability to set individual blend equations and blend functions for each color output.

    + * + *

    Requires {@link GL20 OpenGL 2.0} and {@link EXTDrawBuffers2 EXT_draw_buffers2}. Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ +public class ARBDrawBuffersBlend { + + static { GL.initialize(); } + + protected ARBDrawBuffersBlend() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendEquationiARB ] --- + + /** + * Provides a way to enable blending and set color write masks independently per color output. + * + *

    This call modifies the blend equations associated with an individual draw buffer.

    + * + *

    The error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated if the {@code buf} parameter is outside the range [0, {@link GL20#GL_MAX_DRAW_BUFFERS MAX_DRAW_BUFFERS} – 1].

    + * + *

    The error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated if {@code mode} is not one of {@link GL14#GL_FUNC_ADD FUNC_ADD}, {@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}, + * {@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}, {@link GL14#GL_MAX MAX}, or {@link GL14#GL_MIN MIN}.

    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if this method is executed between the execution of {@link GL11#glBegin Begin} and the corresponding execution + * of {@link GL11#glEnd End}.

    + * + * @param buf an integer that indicates the {@link GL11#GL_DRAW_BUFFER DRAW_BUFFER} to modify. + * @param mode determines both the RGB and alpha blend equations. One of:
    {@link GL14#GL_FUNC_ADD FUNC_ADD}{@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14#GL_MIN MIN}{@link GL14#GL_MAX MAX}
    + */ + public static native void glBlendEquationiARB(@NativeType("GLuint") int buf, @NativeType("GLenum") int mode); + + // --- [ glBlendEquationSeparateiARB ] --- + + /** + * Provides a way to enable blending and set color write masks independently per color output. + * + *

    This call modifies the blend equations associated with an individual draw buffer.

    + * + *

    The error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated if the {@code buf} parameter is outside the range [0, {@link GL20#GL_MAX_DRAW_BUFFERS MAX_DRAW_BUFFERS} – 1].

    + * + *

    The error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated if either {@code modeRGB} or {@code modeAlpha} are not one of {@link GL14#GL_FUNC_ADD FUNC_ADD}, + * {@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}, {@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}, {@link GL14#GL_MAX MAX}, or {@link GL14#GL_MIN MIN}.

    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if this method is executed between the execution of {@link GL11#glBegin Begin} and the corresponding execution + * of {@link GL11#glEnd End}.

    + * + * @param buf an integer that indicates the {@link GL11#GL_DRAW_BUFFER DRAW_BUFFER} to modify. + * @param modeRGB the RGB blend equation. One of:
    {@link GL14#GL_FUNC_ADD FUNC_ADD}{@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14#GL_MIN MIN}{@link GL14#GL_MAX MAX}
    + * @param modeAlpha the alpha blend equation. One of:
    {@link GL14#GL_FUNC_ADD FUNC_ADD}{@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14#GL_MIN MIN}{@link GL14#GL_MAX MAX}
    + */ + public static native void glBlendEquationSeparateiARB(@NativeType("GLuint") int buf, @NativeType("GLenum") int modeRGB, @NativeType("GLenum") int modeAlpha); + + // --- [ glBlendFunciARB ] --- + + /** + * Provides a way to enable blending and set color write masks independently per color output. + * + *

    This call modifies the blend functions associated with an individual draw buffer.

    + * + *

    The error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated if the {@code buf} parameter is outside the range [0, {@link GL20#GL_MAX_DRAW_BUFFERS MAX_DRAW_BUFFERS} – 1].

    + * + *

    The error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated if either {@code src}, or {@code dst} is not an accepted value.

    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if this method is executed between the execution of {@link GL11#glBegin Begin} and the corresponding execution + * of {@link GL11#glEnd End}.

    + * + * @param buf an integer that indicates the {@link GL11#GL_DRAW_BUFFER DRAW_BUFFER} to modify. + * @param src determines both RGB and alpha source functions + * @param dst determines both RGB and alpha destination functions + */ + public static native void glBlendFunciARB(@NativeType("GLuint") int buf, @NativeType("GLenum") int src, @NativeType("GLenum") int dst); + + // --- [ glBlendFuncSeparateiARB ] --- + + /** + * Provides a way to enable blending and set color write masks independently per color output. + * + *

    This call modifies the blend functions associated with an individual draw buffer.

    + * + *

    The error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated if the {@code buf} parameter is outside the range [0, {@link GL20#GL_MAX_DRAW_BUFFERS MAX_DRAW_BUFFERS} – 1].

    + * + *

    The error {@link GL11#GL_INVALID_ENUM INVALID_ENUM} is generated if either {@code srcRGB}, {@code dstRGB}, {@code srcAlpha}, or {@code dstAlpha} is not an accepted value.

    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if this method is executed between the execution of {@link GL11#glBegin Begin} and the corresponding execution + * of {@link GL11#glEnd End}.

    + * + * @param buf an integer that indicates the {@link GL11#GL_DRAW_BUFFER DRAW_BUFFER} to modify. + * @param srcRGB the source RGB blend function + * @param dstRGB the destination RGB blend function + * @param srcAlpha the source alpha blend function + * @param dstAlpha the destination alpha blend function + */ + public static native void glBlendFuncSeparateiARB(@NativeType("GLuint") int buf, @NativeType("GLenum") int srcRGB, @NativeType("GLenum") int dstRGB, @NativeType("GLenum") int srcAlpha, @NativeType("GLenum") int dstAlpha); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawElementsBaseVertex.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawElementsBaseVertex.java new file mode 100644 index 000000000..175c13cfc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawElementsBaseVertex.java @@ -0,0 +1,332 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_draw_elements_base_vertex extension. + * + *

    This extension provides a method to specify a "base vertex offset" value which is effectively added to every vertex index that is transferred through + * {@link GL11C#glDrawElements DrawElements}.

    + * + *

    This mechanism can be used to decouple a set of indices from the actual vertex array that it is referencing. This is useful if an application stores + * multiple indexed models in a single vertex array. The same index array can be used to draw the model no matter where it ends up in a larger vertex array + * simply by changing the base vertex value. Without this functionality, it would be necessary to rebind all the vertex attributes every time geometry is + * switched and this can have larger performance penalty.

    + * + *

    For example consider the (very contrived and simple) example of drawing two triangles to form a quad. In the typical example you have the following + * setup:

    + * + *
    
    + *     vertices         indices
    + *    ----------        -----
    + * 0 | (-1,  1) |    0 |  0  |
    + * 1 | (-1, -1) |    1 |  1  |
    + * 2 | ( 1, -1) |    2 |  2  |
    + * 3 | ( 1,  1) |    3 |  3  |
    + *    ----------     4 |  0  |
    + *                   5 |  2  |
    + *                      -----
    + * + *

    which is normally rendered with the call

    + * + *
    
    + * DrawElements(TRIANGLES, 6, UNSIGNED_BYTE, &indices).
    + * + *

    Now consider the case where the vertices you want to draw are not at the start of a vertex array but are instead located at offset 100 into a larger + * array:

    + * + *
    
    + *      vertices2         indices2
    + *      ----------        -----
    + *         ....        0 | 100 |
    + * 100 | (-1,  1) |    1 | 101 |
    + * 101 | (-1, -1) |    2 | 102 |
    + * 102 | ( 1, -1) |    3 | 103 |
    + * 103 | ( 1,  1) |    4 | 100 |
    + *         ....        5 | 102 |
    + *      ----------        -----
    + * + *

    The typical choices for rendering this are to rebind your vertex attributes with an additional offset of 100*stride, or to create an new array of + * indices (as indices2 in the example). However both rebinding vertex attributes and rebuilding index arrays can be quite costly activities.

    + * + *

    With the new drawing commands introduced by this extension you can instead draw using vertices2 and the new draw call:

    + * + *
    
    + * DrawElementsBaseVertex(TRIANGLES, 6, UNSIGNED_BYTE, &indices, 100)
    + * + *

    Promoted to core in {@link GL32 OpenGL 3.2}.

    + */ +public class ARBDrawElementsBaseVertex { + + static { GL.initialize(); } + + protected ARBDrawElementsBaseVertex() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawElementsBaseVertex ] --- + + /** + * Unsafe version of: {@link #glDrawElementsBaseVertex DrawElementsBaseVertex} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawElementsBaseVertex(int mode, int count, int type, long indices, int basevertex) { + GL32C.nglDrawElementsBaseVertex(mode, count, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsBaseVertex(mode, count, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsBaseVertex(mode, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsBaseVertex(mode, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsBaseVertex(mode, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsBaseVertex(mode, indices, basevertex); + } + + // --- [ glDrawRangeElementsBaseVertex ] --- + + /** + * Unsafe version of: {@link #glDrawRangeElementsBaseVertex DrawRangeElementsBaseVertex} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawRangeElementsBaseVertex(int mode, int start, int end, int count, int type, long indices, int basevertex) { + GL32C.nglDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawRangeElementsBaseVertex(mode, start, end, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawRangeElementsBaseVertex(mode, start, end, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") ShortBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawRangeElementsBaseVertex(mode, start, end, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") IntBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawRangeElementsBaseVertex(mode, start, end, indices, basevertex); + } + + // --- [ glDrawElementsInstancedBaseVertex ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstancedBaseVertex DrawElementsInstancedBaseVertex} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawElementsInstancedBaseVertex(int mode, int count, int type, long indices, int primcount, int basevertex) { + GL32C.nglDrawElementsInstancedBaseVertex(mode, count, type, indices, primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsInstancedBaseVertex(mode, count, type, indices, primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsInstancedBaseVertex(mode, type, indices, primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsInstancedBaseVertex(mode, indices, primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsInstancedBaseVertex(mode, indices, primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsInstancedBaseVertex(mode, indices, primcount, basevertex); + } + + // --- [ glMultiDrawElementsBaseVertex ] --- + + /** + * Unsafe version of: {@link #glMultiDrawElementsBaseVertex MultiDrawElementsBaseVertex} + * + * @param drawcount the size of the {@code count} array + */ + public static void nglMultiDrawElementsBaseVertex(int mode, long count, int type, long indices, int drawcount, long basevertex) { + GL32C.nglMultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex); + } + + /** + * Renders multiple sets of primitives by specifying indices of array data elements and an offset to apply to each index. + * + *

    LWJGL note: Use {@link org.lwjgl.system.MemoryUtil#memAddress} to retrieve pointers to the index buffers.

    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count an array of the elements counts + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a pointer to the location where the base vertices are stored + */ + public static void glMultiDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei const *") IntBuffer count, @NativeType("GLenum") int type, @NativeType("void const * const *") PointerBuffer indices, @NativeType("GLint *") IntBuffer basevertex) { + GL32C.glMultiDrawElementsBaseVertex(mode, count, type, indices, basevertex); + } + + /** Array version of: {@link #glMultiDrawElementsBaseVertex MultiDrawElementsBaseVertex} */ + public static void glMultiDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei const *") int[] count, @NativeType("GLenum") int type, @NativeType("void const * const *") PointerBuffer indices, @NativeType("GLint *") int[] basevertex) { + GL32C.glMultiDrawElementsBaseVertex(mode, count, type, indices, basevertex); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawIndirect.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawIndirect.java new file mode 100644 index 000000000..0a3f78cd4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawIndirect.java @@ -0,0 +1,271 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_draw_indirect extension. + * + *

    This extension provides a mechanism for supplying the arguments to a + * DrawArraysInstanced or DrawElementsInstancedBaseVertex from buffer object + * memory. This is not particularly useful for applications where the CPU + * knows the values of the arguments beforehand, but is helpful when the + * values will be generated on the GPU through any mechanism that can write + * to a buffer object including image stores, atomic counters, or compute + * interop. This allows the GPU to consume these arguments without a round- + * trip to the CPU or the expensive synchronization that would involve. This + * is similar to the DrawTransformFeedbackEXT command from + * EXT_transform_feedback2, but offers much more flexibility in both + * generating the arguments and in the type of Draws that can be accomplished.

    + * + *

    Requires {@link GL31 OpenGL 3.1}. Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ +public class ARBDrawIndirect { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, + * MapBufferRange, FlushMappedBufferRange, GetBufferParameteriv, and CopyBufferSubData. + */ + public static final int GL_DRAW_INDIRECT_BUFFER = 0x8F3F; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int GL_DRAW_INDIRECT_BUFFER_BINDING = 0x8F43; + + protected ARBDrawIndirect() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawArraysIndirect ] --- + + /** Unsafe version of: {@link #glDrawArraysIndirect DrawArraysIndirect} */ + public static void nglDrawArraysIndirect(int mode, long indirect) { + GL40C.nglDrawArraysIndirect(mode, indirect); + } + + /** + * Renders primitives from array data, taking parameters from memory. + * + *

    {@code glDrawArraysIndirect} behaves similarly to {@link GL42C#glDrawArraysInstancedBaseInstance DrawArraysInstancedBaseInstance}, except that the parameters to + * glDrawArraysInstancedBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance; // must be 0 unless OpenGL 4.2 is supported
    +     * } DrawArraysIndirectCommand;
    +     * 
    +     * const DrawArraysIndirectCommand *cmd = (const DrawArraysIndirectCommand *)indirect;
    +     * glDrawArraysInstancedBaseInstance(mode, cmd->first, cmd->count, cmd->primCount, cmd->baseInstance);
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect a structure containing the draw parameters + */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indirect) { + GL40C.glDrawArraysIndirect(mode, indirect); + } + + /** + * Renders primitives from array data, taking parameters from memory. + * + *

    {@code glDrawArraysIndirect} behaves similarly to {@link GL42C#glDrawArraysInstancedBaseInstance DrawArraysInstancedBaseInstance}, except that the parameters to + * glDrawArraysInstancedBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance; // must be 0 unless OpenGL 4.2 is supported
    +     * } DrawArraysIndirectCommand;
    +     * 
    +     * const DrawArraysIndirectCommand *cmd = (const DrawArraysIndirectCommand *)indirect;
    +     * glDrawArraysInstancedBaseInstance(mode, cmd->first, cmd->count, cmd->primCount, cmd->baseInstance);
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect a structure containing the draw parameters + */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") long indirect) { + GL40C.glDrawArraysIndirect(mode, indirect); + } + + /** + * Renders primitives from array data, taking parameters from memory. + * + *

    {@code glDrawArraysIndirect} behaves similarly to {@link GL42C#glDrawArraysInstancedBaseInstance DrawArraysInstancedBaseInstance}, except that the parameters to + * glDrawArraysInstancedBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance; // must be 0 unless OpenGL 4.2 is supported
    +     * } DrawArraysIndirectCommand;
    +     * 
    +     * const DrawArraysIndirectCommand *cmd = (const DrawArraysIndirectCommand *)indirect;
    +     * glDrawArraysInstancedBaseInstance(mode, cmd->first, cmd->count, cmd->primCount, cmd->baseInstance);
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect a structure containing the draw parameters + */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indirect) { + GL40C.glDrawArraysIndirect(mode, indirect); + } + + // --- [ glDrawElementsIndirect ] --- + + /** Unsafe version of: {@link #glDrawElementsIndirect DrawElementsIndirect} */ + public static void nglDrawElementsIndirect(int mode, int type, long indirect) { + GL40C.nglDrawElementsIndirect(mode, type, indirect); + } + + /** + * Renders indexed primitives from array data, taking parameters from memory. + * + *

    {@code glDrawElementsIndirect} behaves similarly to {@link GL42C#glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance}, execpt that the parameters to + * glDrawElementsInstancedBaseVertexBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    {@code glDrawElementsIndirect} is equivalent to:

    + * + *
    
    +     * void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect) {
    +     *     const DrawElementsIndirectCommand *cmd  = (const DrawElementsIndirectCommand *)indirect;
    +     *     glDrawElementsInstancedBaseVertexBaseInstance(
    +     *         mode,
    +     *         cmd->count,
    +     *         type,
    +     *         cmd->firstIndex + size-of-type,
    +     *         cmd->primCount,
    +     *         cmd->baseVertex,
    +     *         cmd->baseInstance
    +     *     );
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the {@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER} binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect the address of a structure containing the draw parameters + */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indirect) { + GL40C.glDrawElementsIndirect(mode, type, indirect); + } + + /** + * Renders indexed primitives from array data, taking parameters from memory. + * + *

    {@code glDrawElementsIndirect} behaves similarly to {@link GL42C#glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance}, execpt that the parameters to + * glDrawElementsInstancedBaseVertexBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    {@code glDrawElementsIndirect} is equivalent to:

    + * + *
    
    +     * void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect) {
    +     *     const DrawElementsIndirectCommand *cmd  = (const DrawElementsIndirectCommand *)indirect;
    +     *     glDrawElementsInstancedBaseVertexBaseInstance(
    +     *         mode,
    +     *         cmd->count,
    +     *         type,
    +     *         cmd->firstIndex + size-of-type,
    +     *         cmd->primCount,
    +     *         cmd->baseVertex,
    +     *         cmd->baseInstance
    +     *     );
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the {@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER} binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect the address of a structure containing the draw parameters + */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") long indirect) { + GL40C.glDrawElementsIndirect(mode, type, indirect); + } + + /** + * Renders indexed primitives from array data, taking parameters from memory. + * + *

    {@code glDrawElementsIndirect} behaves similarly to {@link GL42C#glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance}, execpt that the parameters to + * glDrawElementsInstancedBaseVertexBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    {@code glDrawElementsIndirect} is equivalent to:

    + * + *
    
    +     * void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect) {
    +     *     const DrawElementsIndirectCommand *cmd  = (const DrawElementsIndirectCommand *)indirect;
    +     *     glDrawElementsInstancedBaseVertexBaseInstance(
    +     *         mode,
    +     *         cmd->count,
    +     *         type,
    +     *         cmd->firstIndex + size-of-type,
    +     *         cmd->primCount,
    +     *         cmd->baseVertex,
    +     *         cmd->baseInstance
    +     *     );
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the {@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER} binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect the address of a structure containing the draw parameters + */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer indirect) { + GL40C.glDrawElementsIndirect(mode, type, indirect); + } + + /** Array version of: {@link #glDrawArraysIndirect DrawArraysIndirect} */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") int[] indirect) { + GL40C.glDrawArraysIndirect(mode, indirect); + } + + /** Array version of: {@link #glDrawElementsIndirect DrawElementsIndirect} */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") int[] indirect) { + GL40C.glDrawElementsIndirect(mode, type, indirect); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawInstanced.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawInstanced.java new file mode 100644 index 000000000..760a5aae7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBDrawInstanced.java @@ -0,0 +1,120 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_draw_instanced extension. + * + *

    A common use case in GL for some applications is to be able to draw the same object, or groups of similar objects that share vertex data, primitive + * count and type, multiple times. This extension provides a means of accelerating such use cases while restricting the number of API calls, and keeping + * the amount of duplicate data to a minimum.

    + * + *

    This extension introduces two draw calls which are conceptually equivalent to a series of draw calls. Each conceptual call in this series is considered + * an "instance" of the actual draw call.

    + * + *

    This extension also introduces a read-only built-in variable to GLSL which contains the "instance ID." This variable initially contains 0, but increases + * by one after each conceptual draw call.

    + * + *

    By using the instance ID or multiples thereof as an index into a uniform array containing transform data, vertex shaders can draw multiple instances of + * an object with a single draw call.

    + * + *

    Requires {@link GL30 OpenGL 3.0} or {@link EXTGPUShader4 EXT_gpu_shader4} or NV_vertex_program4. Promoted to core in {@link GL31 OpenGL 3.1}.

    + */ +public class ARBDrawInstanced { + + static { GL.initialize(); } + + protected ARBDrawInstanced() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawArraysInstancedARB ] --- + + /** + * Draw multiple instances of a range of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param first the starting index in the enabled arrays + * @param count the number of indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + */ + public static native void glDrawArraysInstancedARB(@NativeType("GLenum") int mode, @NativeType("GLint") int first, @NativeType("GLsizei") int count, @NativeType("GLsizei") int primcount); + + // --- [ glDrawElementsInstancedARB ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstancedARB DrawElementsInstancedARB} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static native void nglDrawElementsInstancedARB(int mode, int count, int type, long indices, int primcount); + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + */ + public static void glDrawElementsInstancedARB(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstancedARB(mode, count, type, indices, primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + */ + public static void glDrawElementsInstancedARB(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstancedARB(mode, indices.remaining() >> GLChecks.typeToByteShift(type), type, memAddress(indices), primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + */ + public static void glDrawElementsInstancedARB(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstancedARB(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, memAddress(indices), primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + */ + public static void glDrawElementsInstancedARB(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstancedARB(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, memAddress(indices), primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + */ + public static void glDrawElementsInstancedARB(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstancedARB(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, memAddress(indices), primcount); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES2Compatibility.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES2Compatibility.java new file mode 100644 index 000000000..39193da9f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES2Compatibility.java @@ -0,0 +1,148 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_ES2_compatibility extension. + * + *

    This extension adds support for features of OpenGL ES 2.0 that are missing from OpenGL 3.x. Enabling these features will ease the process of porting + * applications from OpenGL ES 2.0 to OpenGL.

    + * + *

    Promoted to core in {@link GL41 OpenGL 4.1}.

    + */ +public class ARBES2Compatibility { + + static { GL.initialize(); } + + /** Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_SHADER_COMPILER = 0x8DFA, + GL_SHADER_BINARY_FORMATS = 0x8DF8, + GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9, + GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB, + GL_MAX_VARYING_VECTORS = 0x8DFC, + GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD, + GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A, + GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B; + + /** Accepted by the {@code type} parameter of VertexAttribPointer. */ + public static final int GL_FIXED = 0x140C; + + /** Accepted by the {@code precisiontype} parameter of GetShaderPrecisionFormat. */ + public static final int + GL_LOW_FLOAT = 0x8DF0, + GL_MEDIUM_FLOAT = 0x8DF1, + GL_HIGH_FLOAT = 0x8DF2, + GL_LOW_INT = 0x8DF3, + GL_MEDIUM_INT = 0x8DF4, + GL_HIGH_INT = 0x8DF5; + + /** Accepted by the {@code format} parameter of most commands taking sized internal formats. */ + public static final int GL_RGB565 = 0x8D62; + + protected ARBES2Compatibility() { + throw new UnsupportedOperationException(); + } + + // --- [ glReleaseShaderCompiler ] --- + + /** Releases resources allocated by the shader compiler. This is a hint from the application, and does not prevent later use of the shader compiler. */ + public static void glReleaseShaderCompiler() { + GL41C.glReleaseShaderCompiler(); + } + + // --- [ glShaderBinary ] --- + + /** + * Unsafe version of: {@link #glShaderBinary ShaderBinary} + * + * @param count the number of shader object handles contained in {@code shaders} + * @param length the length of the array whose address is given in binary + */ + public static void nglShaderBinary(int count, long shaders, int binaryformat, long binary, int length) { + GL41C.nglShaderBinary(count, shaders, binaryformat, binary, length); + } + + /** + * Loads pre-compiled shader binaries. + * + * @param shaders an array of shader handles into which to load pre-compiled shader binaries + * @param binaryformat the format of the shader binaries contained in {@code binary} + * @param binary an array of bytes containing pre-compiled binary shader code + */ + public static void glShaderBinary(@NativeType("GLuint const *") IntBuffer shaders, @NativeType("GLenum") int binaryformat, @NativeType("void const *") ByteBuffer binary) { + GL41C.glShaderBinary(shaders, binaryformat, binary); + } + + // --- [ glGetShaderPrecisionFormat ] --- + + /** Unsafe version of: {@link #glGetShaderPrecisionFormat GetShaderPrecisionFormat} */ + public static void nglGetShaderPrecisionFormat(int shadertype, int precisiontype, long range, long precision) { + GL41C.nglGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); + } + + /** + * Retrieves the range and precision for numeric formats supported by the shader compiler. + * + * @param shadertype the type of shader whose precision to query. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}
    + * @param precisiontype the numeric format whose precision and range to query + * @param range the address of array of two integers into which encodings of the implementation's numeric range are returned + * @param precision the address of an integer into which the numeric precision of the implementation is written + */ + public static void glGetShaderPrecisionFormat(@NativeType("GLenum") int shadertype, @NativeType("GLenum") int precisiontype, @NativeType("GLint *") IntBuffer range, @NativeType("GLint *") IntBuffer precision) { + GL41C.glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); + } + + /** + * Retrieves the range and precision for numeric formats supported by the shader compiler. + * + * @param shadertype the type of shader whose precision to query. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}
    + * @param precisiontype the numeric format whose precision and range to query + * @param range the address of array of two integers into which encodings of the implementation's numeric range are returned + */ + @NativeType("void") + public static int glGetShaderPrecisionFormat(@NativeType("GLenum") int shadertype, @NativeType("GLenum") int precisiontype, @NativeType("GLint *") IntBuffer range) { + return GL41C.glGetShaderPrecisionFormat(shadertype, precisiontype, range); + } + + // --- [ glDepthRangef ] --- + + /** + * Specifies mapping of depth values from normalized device coordinates to window coordinates + * + * @param zNear the mapping of the near clipping plane to window coordinates. The initial value is 0.0f. + * @param zFar the mapping of the far clipping plane to window coordinates. The initial value is 1.0f. + */ + public static void glDepthRangef(@NativeType("GLfloat") float zNear, @NativeType("GLfloat") float zFar) { + GL41C.glDepthRangef(zNear, zFar); + } + + // --- [ glClearDepthf ] --- + + /** + * Specifies the clear value for the depth buffer + * + * @param depth the depth value used when the depth buffer is cleared. The initial value is 1.0f. + */ + public static void glClearDepthf(@NativeType("GLfloat") float depth) { + GL41C.glClearDepthf(depth); + } + + /** Array version of: {@link #glShaderBinary ShaderBinary} */ + public static void glShaderBinary(@NativeType("GLuint const *") int[] shaders, @NativeType("GLenum") int binaryformat, @NativeType("void const *") ByteBuffer binary) { + GL41C.glShaderBinary(shaders, binaryformat, binary); + } + + /** Array version of: {@link #glGetShaderPrecisionFormat GetShaderPrecisionFormat} */ + public static void glGetShaderPrecisionFormat(@NativeType("GLenum") int shadertype, @NativeType("GLenum") int precisiontype, @NativeType("GLint *") int[] range, @NativeType("GLint *") int[] precision) { + GL41C.glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES31Compatibility.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES31Compatibility.java new file mode 100644 index 000000000..61c31f473 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES31Compatibility.java @@ -0,0 +1,68 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_ES3_1_compatibility extension. + * + *

    This extension adds support for features of OpenGL ES 3.1 that are missing from OpenGL 4.4. Enabling these features will ease the process of porting + * applications from OpenGL ES 3.1 to OpenGL. Enabling these features will ease the process of porting applications from OpenGL ES 3.1 to OpenGL.

    + * + *

    In particular this adds the following features:

    + * + *
      + *
    • a new {@link #glMemoryBarrierByRegion MemoryBarrierByRegion} API which is potentially more efficient for specific localized memory access patterns.
    • + *
    • increases the minimum required size of SSBOs to 2^27 (128 MB).
    • + *
    • support for GLSL ES version 310.
    • + *
    • a new GLSL built-in function, {@code imageAtomicExchange}, which performs atomic exchanges on {@code r32f} floating point images.
    • + *
    • a new GLSL built-in fragment shader input, {@code gl_HelperInvocation}, that identifies whether the current fragment shader input is a helper + * invocation. Fragment shader code can use this variable to skip performing operations that are useless or potentially dangerous for helper + * invocations.
    • + *
    • a new GLSL built-in constant for the maximum supported samples: {@code gl_MaxSamples}.
    • + *
    • a number of new GLSL built-in constants mirroring the API limits for image uniforms: {@code gl_Max * ImageUniforms}, + * {@code gl_MaxCombinedShaderOutputResources}.
    • + *
    • new GLSL built-in functions which extend {@code mix()} to select between int, uint, and bool components.
    • + *
    • add the "coherent" qualifier to all memory variables taken by the GLSL built-in {@code atomic*} and {@code imageAtomic*} functions.
    • + *
    • + *
    • + *
    + * + *

    Requires {@link GL44 OpenGL 4.4}, {@link ARBES2Compatibility ARB_ES2_compatibility}, {@link ARBES3Compatibility ARB_ES3_compatibility}. Promoted to core in {@link GL45 OpenGL 4.5}.

    + */ +public class ARBES31Compatibility { + + static { GL.initialize(); } + + protected ARBES31Compatibility() { + throw new UnsupportedOperationException(); + } + + // --- [ glMemoryBarrierByRegion ] --- + + /** + * Behaves like {@link GL42C#glMemoryBarrier MemoryBarrier}, with two differences: + * + *

    First, it narrows the region under consideration so that only reads/writes of prior fragment shaders that are invoked for a smaller region of the + * framebuffer will be completed/reflected prior to subsequent reads/write of following fragment shaders. The size of the region is implementation + * dependent and may be as small as one framebuffer pixel.

    + * + *

    Second, it only applies to memory transactions that may be read by or written by a fragment shader.

    + * + *

    When barriers is {@link GL42#GL_ALL_BARRIER_BITS ALL_BARRIER_BITS}, shader memory accesses will be synchronized relative to all these barrier bits, but not to other + * barrier bits specific to {@link GL42C#glMemoryBarrier MemoryBarrier}. This implies that reads/writes for scatter/gather-like algorithms may or may not be + * completed/reflected after a MemoryBarrierByRegion command. However, for uses such as deferred shading, where a linked list of visible + * surfaces with the head at a framebuffer address may be constructed, and the entirety of the list is only dependent on previous executions at that + * framebuffer address, MemoryBarrierByRegion may be significantly more efficient than {@link GL42C#glMemoryBarrier MemoryBarrier}.

    + * + * @param barriers the barriers to insert. One or more of:
    {@link GL42#GL_ATOMIC_COUNTER_BARRIER_BIT ATOMIC_COUNTER_BARRIER_BIT}{@link GL42#GL_FRAMEBUFFER_BARRIER_BIT FRAMEBUFFER_BARRIER_BIT}{@link GL42#GL_SHADER_IMAGE_ACCESS_BARRIER_BIT SHADER_IMAGE_ACCESS_BARRIER_BIT}
    {@link GL43#GL_SHADER_STORAGE_BARRIER_BIT SHADER_STORAGE_BARRIER_BIT}{@link GL42#GL_TEXTURE_FETCH_BARRIER_BIT TEXTURE_FETCH_BARRIER_BIT}{@link GL42#GL_UNIFORM_BARRIER_BIT UNIFORM_BARRIER_BIT}
    + */ + public static void glMemoryBarrierByRegion(@NativeType("GLbitfield") int barriers) { + GL45C.glMemoryBarrierByRegion(barriers); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES32Compatibility.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES32Compatibility.java new file mode 100644 index 000000000..bca5891d5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES32Compatibility.java @@ -0,0 +1,63 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_ES3_2_compatibility extension. + * + *

    This extension adds support for features of OpenGL ES 3.2 that are missing from OpenGL 4.5. Enabling these features will ease the process of porting + * applications from OpenGL ES 3.2 to OpenGL.

    + * + *

    In particular this adds the following features:

    + * + *
      + *
    • Bounding box used to optimization tessellation processing (OES_primitive_bounding_box)
    • + *
    • query for {@link #GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB MULTISAMPLE_LINE_WIDTH_RANGE_ARB}
    • + *
    • support for the OpenGL ES 3.20 shading language
    • + *
    + * + *

    For full OpenGL ES 3.2 compatibility the implementation must support {@link KHRBlendEquationAdvanced KHR_blend_equation_advanced} and {@link KHRTextureCompressionASTCLDR KHR_texture_compression_astc_ldr}. + * Those features are not defined in this extension spec since they are already defined at the KHR level.

    + * + *

    Requires {@link GL45 OpenGL 4.5}, {@link ARBES2Compatibility ARB_ES2_compatibility}, {@link ARBES3Compatibility ARB_ES3_compatibility} and {@link ARBES31Compatibility ARB_ES3_1_compatibility}.

    + */ +public class ARBES32Compatibility { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetFloatv, GetIntegerv, and GetInteger64v. */ + public static final int + GL_PRIMITIVE_BOUNDING_BOX_ARB = 0x92BE, + GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB = 0x9381, + GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB = 0x9382; + + protected ARBES32Compatibility() { + throw new UnsupportedOperationException(); + } + + // --- [ glPrimitiveBoundingBoxARB ] --- + + /** + * Specifies the primitive bounding box. + * + *

    Implementations may be able to optimize performance if the application provides bounds of primitives that will be generated by the tessellation + * primitive generator or the geometry shader prior to executing those stages. If the provided bounds are incorrect and primitives extend beyond them, the + * rasterizer may or may not generate fragments for the portions of primitives outside the bounds.

    + * + * @param minX the minimum x clip space coordinate + * @param minY the minimum y clip space coordinate + * @param minZ the minimum z clip space coordinate + * @param minW the minimum w clip space coordinate + * @param maxX the maximum x clip space coordinate + * @param maxY the maximum y clip space coordinate + * @param maxZ the maximum z clip space coordinate + * @param maxW the maximum w clip space coordinate + */ + public static native void glPrimitiveBoundingBoxARB(@NativeType("GLfloat") float minX, @NativeType("GLfloat") float minY, @NativeType("GLfloat") float minZ, @NativeType("GLfloat") float minW, @NativeType("GLfloat") float maxX, @NativeType("GLfloat") float maxY, @NativeType("GLfloat") float maxZ, @NativeType("GLfloat") float maxW); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES3Compatibility.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES3Compatibility.java new file mode 100644 index 000000000..75a38e9c6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBES3Compatibility.java @@ -0,0 +1,43 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_ES3_compatibility extension. + * + *

    This extension adds support for features of OpenGL ES 3.0 that are missing from OpenGL 3.x. Enabling these features will ease the process of porting + * applications from OpenGL ES 3.0 to OpenGL. These features include conservative boolean occlusion queries, primitive restart with a fixed index, the + * OpenGL ES Shading Language 3.00 specification, and the dependencies stated below.

    + * + *

    Requires {@link GL33 OpenGL 3.3}, {@link ARBES2Compatibility ARB_ES2_compatibility}, {@link ARBInvalidateSubdata ARB_invalidate_subdata} and {@link ARBTextureStorage ARB_texture_storage}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public final class ARBES3Compatibility { + + /** Accepted by the {@code internalformat} parameter of CompressedTexImage2D. */ + public static final int + GL_COMPRESSED_RGB8_ETC2 = 0x9274, + GL_COMPRESSED_SRGB8_ETC2 = 0x9275, + GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276, + GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277, + GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9278, + GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279, + GL_COMPRESSED_R11_EAC = 0x9270, + GL_COMPRESSED_SIGNED_R11_EAC = 0x9271, + GL_COMPRESSED_RG11_EAC = 0x9272, + GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273; + + /** Accepted by the {@code target} parameter of Enable and Disable. */ + public static final int GL_PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, GetQueryIndexediv and GetQueryiv. */ + public static final int GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A; + + /** Accepted by the {@code value} parameter of the GetInteger functions. */ + public static final int GL_MAX_ELEMENT_INDEX = 0x8D6B; + + private ARBES3Compatibility() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBEnhancedLayouts.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBEnhancedLayouts.java new file mode 100644 index 000000000..7ca97b70a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBEnhancedLayouts.java @@ -0,0 +1,35 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_enhanced_layouts extension. + * + *

    This extension adds the following functionality to layout qualifiers, including broadening the API where this functionality is reflected. The following + * are added:

    + * + *
      + *
    1. Use compile-time constant expressions.
    2. + *
    3. Specify explicit byte offsets within a uniform or shader storage block.
    4. + *
    5. Force alignment within a uniform or shader storage block.
    6. + *
    7. Specify component numbers to more fully utilize the vec4-slot interfaces between shader outputs and shader inputs.
    8. + *
    9. Specify transform/feedback buffers, locations, and widths.
    10. + *
    11. Allow locations on input and output blocks for SSO interface matching.
    12. + *
    + * + *

    Requires {@link GL31 OpenGL 3.1} and GLSL 1.40. Promoted to core in {@link GL44 OpenGL 4.4}.

    + */ +public final class ARBEnhancedLayouts { + + /** Accepted in the {@code props} array of {@link GL43C#glGetProgramResourceiv GetProgramResourceiv}. */ + public static final int + GL_LOCATION_COMPONENT = 0x934A, + GL_TRANSFORM_FEEDBACK_BUFFER_INDEX = 0x934B, + GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE = 0x934C; + + private ARBEnhancedLayouts() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBExplicitUniformLocation.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBExplicitUniformLocation.java new file mode 100644 index 000000000..8d733e4bb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBExplicitUniformLocation.java @@ -0,0 +1,24 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_explicit_uniform_location extension. + * + *

    This extension provides a method to pre-assign uniform locations to uniform variables in the default uniform block, including subroutine uniforms. This + * allows an application to modify the uniform values without requiring a GL query like {@link GL20C#glGetUniformLocation GetUniformLocation}, {@link GL40C#glGetSubroutineUniformLocation GetSubroutineUniformLocation} and + * {@link GL40C#glGetSubroutineIndex GetSubroutineIndex}.

    + * + *

    Requires {@link GL33 OpenGL 3.3} or ARB_explicit_attrib_location. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public final class ARBExplicitUniformLocation { + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int GL_MAX_UNIFORM_LOCATIONS = 0x826E; + + private ARBExplicitUniformLocation() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFragmentProgram.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFragmentProgram.java new file mode 100644 index 000000000..ab20a281a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFragmentProgram.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_fragment_program extension. + * + *

    Unextended OpenGL mandates a certain set of configurable per- fragment computations defining texture application, texture environment, color sum, and + * fog operations. Several extensions have added further per-fragment computations to OpenGL. For example, extensions have defined new texture environment + * capabilities (ARB_texture_env_add, {@link ARBTextureEnvCombine ARB_texture_env_combine}, {@link ARBTextureEnvDot3 ARB_texture_env_dot3}, ARB_texture_env_crossbar), per-fragment depth + * comparisons ({@link ARBDepthTexture ARB_depth_texture}, {@link ARBShadow ARB_shadow}, {@link ARBShadowAmbient ARB_shadow_ambient}, EXT_shadow_funcs), per-fragment lighting + * (EXT_fragment_lighting, EXT_light_texture), and environment mapped bump mapping + * (ATI_envmap_bumpmap).

    + * + *

    Each such extension adds a small set of relatively inflexible per-fragment computations.

    + * + *

    This inflexibility is in contrast to the typical flexibility provided by the underlying programmable floating point engines (whether micro-coded + * fragment engines, DSPs, or CPUs) that are traditionally used to implement OpenGL's texturing computations. The purpose of this extension is to expose to + * the OpenGL application writer a significant degree of per-fragment programmability for computing fragment parameters.

    + * + *

    For the purposes of discussing this extension, a fragment program is a sequence of floating-point 4-component vector operations that determines how a + * set of program parameters (not specific to an individual fragment) and an input set of per-fragment parameters are transformed to a set of per-fragment + * result parameters.

    + * + *

    The per-fragment computations for standard OpenGL given a particular set of texture and fog application modes (along with any state for extensions + * defining per-fragment computations) is, in essence, a fragment program. However, the sequence of operations is defined implicitly by the current OpenGL + * state settings rather than defined explicitly as a sequence of instructions.

    + * + *

    This extension provides an explicit mechanism for defining fragment program instruction sequences for application-defined fragment programs. In order to + * define such fragment programs, this extension defines a fragment programming model including a floating-point 4-component vector instruction set and a + * relatively large set of floating-point 4-component registers.

    + * + *

    The extension's fragment programming model is designed for efficient hardware implementation and to support a wide variety of fragment programs. By + * design, the entire set of existing fragment programs defined by existing OpenGL per-fragment computation extensions can be implemented using the + * extension's fragment programming model.

    + * + *

    LWJGL: This extension defines many functions and tokens that are also defined in {@link ARBVertexProgram ARB_vertex_program}. Since these two extensions are often + * used together, the common functionality has only been exposed by {@link ARBVertexProgram ARB_vertex_program}, to avoid static import conflicts.

    + */ +public final class ARBFragmentProgram { + + /** + * Accepted by the {@code cap} parameter of Disable, Enable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of ProgramStringARB, BindProgramARB, ProgramEnvParameter4[df][v]ARB, ProgramLocalParameter4[df][v]ARB, + * GetProgramEnvParameter[df]vARB, GetProgramLocalParameter[df]vARB, GetProgramivARB and GetProgramStringARB. + */ + public static final int GL_FRAGMENT_PROGRAM_ARB = 0x8804; + + /** Accepted by the {@code pname} parameter of GetProgramivARB. */ + public static final int + GL_PROGRAM_ALU_INSTRUCTIONS_ARB = 0x8805, + GL_PROGRAM_TEX_INSTRUCTIONS_ARB = 0x8806, + GL_PROGRAM_TEX_INDIRECTIONS_ARB = 0x8807, + GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = 0x8808, + GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = 0x8809, + GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = 0x880A, + GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB = 0x880B, + GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB = 0x880C, + GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB = 0x880D, + GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = 0x880E, + GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = 0x880F, + GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = 0x8810; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_TEXTURE_COORDS_ARB = 0x8871, + GL_MAX_TEXTURE_IMAGE_UNITS_ARB = 0x8872; + + private ARBFragmentProgram() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFragmentShader.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFragmentShader.java new file mode 100644 index 000000000..e3853b3ee --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFragmentShader.java @@ -0,0 +1,32 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_fragment_shader extension. + * + *

    This extension adds functionality to define fragment shader objects. A fragment shader object is a shader object (see the ARB_shader_objects extension) + * that, when attached to a program object, can be compiled and linked to produce an executable that runs on the fragment processor in OpenGL. The fragment + * processor is a programmable unit that replaces the OpenGL 1.4 fixed-function texturing, color sum and fog stages. This extension also defines how such + * an executable interacts with the fixed functionality fragment processing of OpenGL 1.4. The language is defined in the OpenGL Shading Language + * specification as the Fragment Shading Language.

    + * + *

    Promoted to core in {@link GL20 OpenGL 2.0}.

    + */ +public final class ARBFragmentShader { + + /** Accepted by the {@code shaderType} argument of CreateShaderObjectARB and returned by the {@code params} parameter of GetObjectParameter{fi}vARB. */ + public static final int GL_FRAGMENT_SHADER_ARB = 0x8B30; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB = 0x8B49; + + /** Accepted by the {@code target} parameter of Hint and the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB = 0x8B8B; + + private ARBFragmentShader() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferNoAttachments.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferNoAttachments.java new file mode 100644 index 000000000..f5396e58e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferNoAttachments.java @@ -0,0 +1,177 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_framebuffer_no_attachments extension. + * + *

    Framebuffer objects as introduced by {@link ARBFramebufferObject ARB_framebuffer_object} and OpenGL 3.0 provide a generalized mechanism for rendering to off-screen surfaces. + * Each framebuffer object may have depth, stencil and zero or more color attachments that can be written to by the GL. The size of the framebuffer (width, + * height, layer count, sample count) is derived from the attachments of that framebuffer. In unextended OpenGL 4.2, it is not legal to render into a + * framebuffer object that has no attachments. Such a framebuffer would be considered incomplete with the {@link GL30#GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT} + * status.

    + * + *

    With OpenGL 4.2 and {@link ARBShaderImageLoadStore ARB_shader_image_load_store}, fragment shaders are capable of doing random access writes to buffer and texture memory via + * image loads, stores, and atomics. This ability enables algorithms using the conventional rasterizer to generate a collection of fragments, where each + * fragment shader invocation will write its outputs to buffer or texture memory using image stores or atomics. Such algorithms may have no need to write + * color or depth values to a conventional framebuffer. However, a framebuffer with no attachments will be considered incomplete and no rasterization or + * fragment shader exectuion will occur. To avoid such errors, an application may be required to create an otherwise unnecessary "dummy" texture and attach + * it to the framebuffer (possibly with color writes masked off). If the algorithm requires the rasterizer to operate over a large number of pixels, this + * dummy texture will needlessly consume a significant amount of memory.

    + * + *

    This extension enables the algorithms described above to work even with a framebuffer with no attachments. Applications can specify default width, + * height, layer count, and sample count parameters for a framebuffer object. When a framebuffer with no attachments is bound, it will be considered + * complete as long as the application has specified non-zero default width and height parameters. For the purposes of rasterization, the framebuffer will + * be considered to have a width, height, layer count, and sample count derived from its default parameters. Framebuffers with one or more attachments are + * not affected by these default parameters; the size of the framebuffer will still be derived from the sizes of the attachments in that case.

    + * + *

    Additionally, this extension provides queryable implementation-dependent maximums for framebuffer width, height, layer count, and sample count, which + * may differ from similar limits on textures and renderbuffers. These maximums will be used to error-check the default framebuffer parameters and also + * permit implementations to expose the ability to rasterize to an attachment-less framebuffer larger than the maximum supported texture size.

    + * + *

    Requires {@link GL30 OpenGL 3.0} or {@link ARBFramebufferObject ARB_framebuffer_object}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBFramebufferNoAttachments { + + static { GL.initialize(); } + + /** + * Accepted by the {@code pname} parameter of FramebufferParameteri, GetFramebufferParameteriv, NamedFramebufferParameteriEXT, and + * GetNamedFramebufferParameterivEXT. + */ + public static final int + GL_FRAMEBUFFER_DEFAULT_WIDTH = 0x9310, + GL_FRAMEBUFFER_DEFAULT_HEIGHT = 0x9311, + GL_FRAMEBUFFER_DEFAULT_LAYERS = 0x9312, + GL_FRAMEBUFFER_DEFAULT_SAMPLES = 0x9313, + GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS = 0x9314; + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_FRAMEBUFFER_WIDTH = 0x9315, + GL_MAX_FRAMEBUFFER_HEIGHT = 0x9316, + GL_MAX_FRAMEBUFFER_LAYERS = 0x9317, + GL_MAX_FRAMEBUFFER_SAMPLES = 0x9318; + + protected ARBFramebufferNoAttachments() { + throw new UnsupportedOperationException(); + } + + // --- [ glFramebufferParameteri ] --- + + /** + * Sets a named parameter of a framebuffer. + * + * @param target target of the operation. One of:
    {@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param pname a token indicating the parameter to be modified. One of:
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param param the new value for the parameter named {@code pname} + */ + public static void glFramebufferParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint") int param) { + GL43C.glFramebufferParameteri(target, pname, param); + } + + // --- [ glGetFramebufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetFramebufferParameteriv GetFramebufferParameteriv} */ + public static void nglGetFramebufferParameteriv(int target, int pname, long params) { + GL43C.nglGetFramebufferParameteriv(target, pname, params); + } + + /** + * Retrieves a named parameter from a framebuffer. + * + * @param target target of the operation. One of:
    {@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param params a variable to receive the value of the parameter named {@code pname} + */ + public static void glGetFramebufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL43C.glGetFramebufferParameteriv(target, pname, params); + } + + /** + * Retrieves a named parameter from a framebuffer. + * + * @param target target of the operation. One of:
    {@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + */ + @NativeType("void") + public static int glGetFramebufferParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL43C.glGetFramebufferParameteri(target, pname); + } + + // --- [ glNamedFramebufferParameteriEXT ] --- + + /** + * DSA version of {@link #glFramebufferParameteri FramebufferParameteri}. + * + * @param framebuffer the framebuffer object + * @param pname a token indicating the parameter to be modified. One of:
    {@link #GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link #GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link #GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link #GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link #GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param param the new value for the parameter named {@code pname} + */ + public static native void glNamedFramebufferParameteriEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glGetNamedFramebufferParameterivEXT ] --- + + /** Unsafe version of: {@link #glGetNamedFramebufferParameterivEXT GetNamedFramebufferParameterivEXT} */ + public static native void nglGetNamedFramebufferParameterivEXT(int framebuffer, int pname, long params); + + /** + * DSA version of {@link #glGetFramebufferParameteriv GetFramebufferParameteriv}. + * + * @param framebuffer the framebuffer object + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link #GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link #GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link #GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link #GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link #GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param params a variable to receive the value of the parameter named {@code pname} + */ + public static void glGetNamedFramebufferParameterivEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedFramebufferParameterivEXT(framebuffer, pname, memAddress(params)); + } + + /** + * DSA version of {@link #glGetFramebufferParameteriv GetFramebufferParameteriv}. + * + * @param framebuffer the framebuffer object + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link #GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link #GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link #GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link #GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link #GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + */ + @NativeType("void") + public static int glGetNamedFramebufferParameteriEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetNamedFramebufferParameterivEXT(framebuffer, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glGetFramebufferParameteriv GetFramebufferParameteriv} */ + public static void glGetFramebufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL43C.glGetFramebufferParameteriv(target, pname, params); + } + + /** Array version of: {@link #glGetNamedFramebufferParameterivEXT GetNamedFramebufferParameterivEXT} */ + public static void glGetNamedFramebufferParameterivEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedFramebufferParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(framebuffer, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferObject.java new file mode 100644 index 000000000..2907a07ea --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferObject.java @@ -0,0 +1,719 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_framebuffer_object extension. + * + *

    ARB_framebuffer_object is an extension intended to address the following goals:

    + * + *
      + *
    • Reflect FBO-related functionality found in the OpenGL 3.0 specification.
    • + *
    • Integrate multiple disjoint extensions into a single ARB extension. These extensions are: + * + *
        + *
      • {@link EXTFramebufferObject EXT_framebuffer_object}
      • + *
      • {@link EXTFramebufferBlit EXT_framebuffer_blit}
      • + *
      • {@link EXTFramebufferMultisample EXT_framebuffer_multisample}
      • + *
      • {@link EXTPackedDepthStencil EXT_packed_depth_stencil}
      • + *
    • + *
    • Where appropriate, relax some of the constraints expressed by previous FBO-related extensions. In particular the requirement of matching attachment + * dimensions and component sizes has been relaxed, to allow implementations the freedom to support more flexible usages where possible.
    • + *
    + * + *

    ARB_framebuffer_object defines an interface for drawing to rendering destinations other than the buffers provided to the GL by the window-system.

    + * + *

    In this extension, these newly defined rendering destinations are known collectively as "framebuffer-attachable images". This extension provides a + * mechanism for attaching framebuffer-attachable images to the GL framebuffer as one of the standard GL logical buffers: color, depth, and stencil. + * (Attaching a framebuffer-attachable image to the accum logical buffer is left for a future extension to define). When a framebuffer-attachable image is + * attached to the framebuffer, it is used as the source and destination of fragment operations as described in Chapter 4.

    + * + *

    By allowing the use of a framebuffer-attachable image as a rendering destination, this extension enables a form of "offscreen" rendering. Furthermore, + * "render to texture" is supported by allowing the images of a texture to be used as framebuffer-attachable images. A particular image of a texture object + * is selected for use as a framebuffer-attachable image by specifying the mipmap level, cube map face (for a cube map texture), and layer (for a 3D + * texture) that identifies the image. The "render to texture" semantics of this extension are similar to performing traditional rendering to the + * framebuffer, followed immediately by a call to CopyTexSubImage. However, by using this extension instead, an application can achieve the same + * effect, but with the advantage that the GL can usually eliminate the data copy that would have been incurred by calling CopyTexSubImage.

    + * + *

    This extension also defines a new GL object type, called a "renderbuffer", which encapsulates a single 2D pixel image. The image of renderbuffer can be + * used as a framebuffer-attachable image for generalized offscreen rendering and it also provides a means to support rendering to GL logical buffer types + * which have no corresponding texture format (stencil, accum, etc). A renderbuffer is similar to a texture in that both renderbuffers and textures can be + * independently allocated and shared among multiple contexts. The framework defined by this extension is general enough that support for attaching images + * from GL objects other than textures and renderbuffers could be added by layered extensions.

    + * + *

    To facilitate efficient switching between collections of framebuffer-attachable images, this extension introduces another new GL object, called a + * framebuffer object. A framebuffer object contains the state that defines the traditional GL framebuffer, including its set of images. Prior to this + * extension, it was the window-system which defined and managed this collection of images, traditionally by grouping them into a "drawable". The + * window-system API's would also provide a function (i.e., {@link WGL#wglMakeCurrent}, {@link GLX#glXMakeCurrent}, aglSetDrawable, etc.) to bind a drawable with a GL + * context (as is done in the {@link WGLARBPbuffer WGL_ARB_pbuffer} extension). In this extension however, this functionality is subsumed by the GL and the GL provides + * the function BindFramebuffer to bind a framebuffer object to the current context. Later, the context can bind back to the window-system-provided + * framebuffer in order to display rendered content.

    + * + *

    Previous extensions that enabled rendering to a texture have been much more complicated. One example is the combination of {@code ARB_pbuffer} and + * {@code ARB_render_texture}, both of which are window-system extensions. This combination requires calling {@code MakeCurrent}, an operation that may be + * expensive, to switch between the window and the pbuffer drawables. An application must create one pbuffer per renderable texture in order to portably + * use {@code ARB_render_texture}. An application must maintain at least one GL context per texture format, because each context can only operate on a + * single pixelformat or {@code FBConfig}. All of these characteristics make {@code ARB_render_texture} both inefficient and cumbersome to use.

    + * + *

    ARB_framebuffer_object, on the other hand, is both simpler to use and more efficient than ARB_render_texture. The ARB_framebuffer_object API is + * contained wholly within the GL API and has no (non-portable) window-system components. Under ARB_framebuffer_object, it is not necessary to create a + * second GL context when rendering to a texture image whose format differs from that of the window. Finally, unlike the pbuffers of + * {@code ARB_render_texture}, a single framebuffer object can facilitate rendering to an unlimited number of texture objects.

    + * + *

    This extension differs from EXT_framebuffer_object by splitting the framebuffer object binding point into separate DRAW and READ bindings (incorporating + * functionality introduced by EXT_framebuffer_blit). This allows copying directly from one framebuffer to another. In addition, a new high performance + * blit function is added to facilitate these blits and perform some data conversion where allowed.

    + * + *

    This extension also enables usage of multisampling in conjunction with renderbuffers (incorporating functionality from EXT_packed_depth_stencil), as + * follows:

    + * + *

    The new operation RenderbufferStorageMultisample() allocates storage for a renderbuffer object that can be used as a multisample buffer. A multisample + * render buffer image differs from a single-sample render buffer image in that a multisample image has a number of {@link GL13#GL_SAMPLES SAMPLES} that is greater than zero. + * No method is provided for creating multisample texture images.

    + * + *

    All of the framebuffer-attachable images attached to a framebuffer object must have the same number of {@link GL13#GL_SAMPLES SAMPLES} or else the framebuffer object is + * not "framebuffer complete". If a framebuffer object with multisample attachments is "framebuffer complete", then the framebuffer object behaves as if + * {@link GL13#GL_SAMPLE_BUFFERS SAMPLE_BUFFERS} is one.

    + * + *

    In traditional multisample rendering, where {@link #GL_DRAW_FRAMEBUFFER_BINDING DRAW_FRAMEBUFFER_BINDING} is zero and {@link GL13#GL_SAMPLE_BUFFERS SAMPLE_BUFFERS} is one, the GL spec states that "the color sample + * values are resolved to a single, displayable color each time a pixel is updated." There are, however, several modern hardware implementations that do + * not actually resolve for each sample update, but instead postpones the resolve operation to a later time and resolve a batch of sample updates at a + * time. This is OK as long as the implementation behaves "as if" it had resolved a sample-at-a-time. Unfortunately, however, honoring the "as if" rule can + * sometimes degrade performance.

    + * + *

    In contrast, when {@link #GL_DRAW_FRAMEBUFFER_BINDING DRAW_FRAMEBUFFER_BINDING} is an application-created framebuffer object, {@link GL13#GL_MULTISAMPLE MULTISAMPLE} is enabled, and {@link GL13#GL_SAMPLE_BUFFERS SAMPLE_BUFFERS} is one, + * there is no implicit per-sample-update resolve. Instead, the application explicitly controls when the resolve operation is performed. The resolve + * operation is affected by calling BlitFramebuffer where the source is a multisample application-created framebuffer object and the destination is a + * single-sample framebuffer object (either application-created or window-system provided).

    + * + *

    This design for multisample resolve more closely matches current hardware, but still permits implementations which choose to resolve a single sample at + * a time. If hardware that implements the multisample resolution "one sample at a time" exposes ARB_framebuffer_object, it could perform the implicit + * resolve to a driver-managed hidden surface, then read from that surface when the application calls BlitFramebuffer.

    + * + *

    Another motivation for granting the application explicit control over the multisample resolve operation has to do with the flexibility afforded by + * ARB_framebuffer_object. Previously, a drawable (window or pbuffer) had exclusive access to all of its buffers. There was no mechanism for sharing a + * buffer across multiple drawables. Under ARB_framebuffer_object, however, a mechanism exists for sharing a framebuffer-attachable image across several + * framebuffer objects, as well as sharing an image between a framebuffer object and a texture. If we had retained the "implicit" resolve from traditional + * multisampled rendering, and allowed the creation of "multisample" format renderbuffers, then this type of sharing would have lead to two problematic + * situations:

    + * + *
      + *
    • Two contexts, which shared renderbuffers, might perform competing resolve operations into the same single-sample buffer with ambiguous results.
    • + *
    • It would have introduced the unfortunate ability to use the single-sample buffer as a texture while {@link GL13#GL_MULTISAMPLE MULTISAMPLE} is enabled.
    • + *
    + * + *

    Using {@link #glBlitFramebuffer BlitFramebuffer} as an explicit resolve to serialize access to the multisampled contents and eliminate the implicit per-sample resolve operation, we avoid both of these problems.

    + * + *

    This extension also enables usage of packed depth-stencil formats in renderbuffers (incorporating functionality from EXT_packed_depth_stencil), as + * follows:

    + * + *

    Many OpenGL implementations have chosen to interleave the depth and stencil buffers into one buffer, often with 24 bits of depth precision and 8 bits of + * stencil data. 32 bits is more than is needed for the depth buffer much of the time; a 24-bit depth buffer, on the other hand, requires that reads and + * writes of depth data be unaligned with respect to power-of-two boundaries. On the other hand, 8 bits of stencil data is more than sufficient for most + * applications, so it is only natural to pack the two buffers into a single buffer with both depth and stencil data. OpenGL never provides direct access + * to the buffers, so the OpenGL implementation can provide an interface to applications where it appears the one merged buffer is composed of two logical buffers.

    + * + *

    One disadvantage of this scheme is that OpenGL lacks any means by which this packed data can be handled efficiently. For example, when an application + * reads from the 24-bit depth buffer, using the type {@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT} will lose 8 bits of data, while {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT} has 8 too many. Both require + * expensive format conversion operations. A 24-bit format would be no more suitable, because it would also suffer from the unaligned memory accesses that + * made the standalone 24-bit depth buffer an unattractive proposition in the first place.

    + * + *

    Many applications, such as parallel rendering applications, may also wish to draw to or read back from both the depth and stencil buffers at the same + * time. Currently this requires two separate operations, reducing performance. Since the buffers are interleaved, drawing to or reading from both should + * be no more expensive than using just one; in some cases, it may even be cheaper.

    + * + *

    This extension provides a new data format, {@link #GL_DEPTH_STENCIL DEPTH_STENCIL}, that can be used with the {@link GL11#glDrawPixels DrawPixels}, {@link GL11C#glReadPixels ReadPixels}, and {@link GL11#glCopyPixels CopyPixels} + * commands, as well as a packed data type, {@link #GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}, that is meant to be used with {@link #GL_DEPTH_STENCIL DEPTH_STENCIL}. No other data types are supported with + * {@link #GL_DEPTH_STENCIL DEPTH_STENCIL}. If {@link ARBDepthTexture ARB_depth_texture} or SGIX_depth_texture is supported, {@link #GL_DEPTH_STENCIL DEPTH_STENCIL}/{@link #GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8} data can also be used for textures; + * this provides a more efficient way to supply data for a 24-bit depth texture.

    + * + *

    {@link #GL_DEPTH_STENCIL DEPTH_STENCIL} data, when passed through the pixel path, undergoes both depth and stencil operations. The depth data is scaled and biased by the current + * {@link GL11#GL_DEPTH_SCALE DEPTH_SCALE} and {@link GL11#GL_DEPTH_BIAS DEPTH_BIAS}, while the stencil data is shifted and offset by the current {@link GL11#GL_INDEX_SHIFT INDEX_SHIFT} and {@link GL11#GL_INDEX_OFFSET INDEX_OFFSET}. The stencil + * data is also put through the stencil-to-stencil pixel map.

    + * + *

    {@link GL11#glDrawPixels DrawPixels} of {@link #GL_DEPTH_STENCIL DEPTH_STENCIL} data operates similarly to that of {@link GL11#GL_STENCIL_INDEX STENCIL_INDEX} data, bypassing the OpenGL fragment pipeline entirely, unlike + * the treatment of {@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT} data. The stencil and depth masks are applied, as are the pixel ownership and scissor tests, but all other + * operations are skipped.

    + * + *

    {@link GL11C#glReadPixels ReadPixels} of {@link #GL_DEPTH_STENCIL DEPTH_STENCIL} data reads back a rectangle from both the depth and stencil buffers.

    + * + *

    {@link GL11#glCopyPixels CopyPixels} of {@link #GL_DEPTH_STENCIL DEPTH_STENCIL} data copies a rectangle from both the depth and stencil buffers. Like glDrawPixels, it applies both the stencil and + * depth masks but skips the remainder of the OpenGL fragment pipeline.

    + * + *

    glTex[Sub]Image[1,2,3]D of {@link #GL_DEPTH_STENCIL DEPTH_STENCIL} data loads depth and stencil data into a depth_stencil texture. {@link GL11C#glGetTexImage GetTexImage} of {@link #GL_DEPTH_STENCIL DEPTH_STENCIL} data can be + * used to retrieve depth and stencil data from a depth/stencil texture.

    + * + *

    In addition, a new base internal format, {@link #GL_DEPTH_STENCIL DEPTH_STENCIL}, can be used by both texture images and renderbuffer storage. When an image with a + * {@link #GL_DEPTH_STENCIL DEPTH_STENCIL} internal format is attached to both the depth and stencil attachment points of a framebuffer object, then it becomes both the depth and + * stencil buffers of the framebuffer. This fits nicely with hardware that interleaves both depth and stencil data into a single buffer. When a texture + * with {@link #GL_DEPTH_STENCIL DEPTH_STENCIL} data is bound for texturing, only the depth component is accessible through the texture fetcher. The stencil data can be written + * with TexImage or CopyTexImage, and can be read with {@link GL11C#glGetTexImage GetTexImage}. When a {@link #GL_DEPTH_STENCIL DEPTH_STENCIL} image is attached to the stencil attachment of the bound + * framebuffer object, the stencil data can be accessed through any operation that reads from or writes to the framebuffer's stencil buffer.

    + * + *

    Glossary of Helpful Terms

    + * + *
      + *
    • logical buffer – One of the color, depth, or stencil buffers of the framebuffer.
    • + *
    • framebuffer: The collection of logical buffers and associated state defining where the output of GL rendering is directed.
    • + *
    • texture: an object which consists of one or more 2D arrays of pixel images and associated state that can be used as a source of data during the texture-mapping process.
    • + *
    • texture image – one of the 2D arrays of pixels that are part of a texture object. Texture images contain and define the texels of the + * texture object.
    • + *
    • renderbuffer – A new type of storage object which contains a single 2D array of pixels and associated state that can be used as a + * destination for pixel data written during the rendering process.
    • + *
    • renderbuffer image – The 2D array of pixels that is part of a renderbuffer object. A renderbuffer image contains and defines the pixels + * of the renderbuffer object.
    • + *
    • framebuffer-attachable image – A 2D pixel image that can be attached to one of the logical buffer attachment points of a framebuffer + * object. Texture images and renderbuffer images are two examples of framebuffer-attachable images.
    • + *
    • attachment point – The set of state which references a specific framebuffer-attachable image, and allows that framebuffer-attachable + * image to be used to store the contents of a logical buffer of a framebuffer object. There is an attachment point state vector for each color, depth, + * and stencil buffer of a framebuffer.
    • + *
    • attach – The act of connecting one object to another object. + * + *

      An "attach" operation is similar to a "bind" operation in that both represent a reference to the attached or bound object for the purpose of + * managing object lifetimes and both enable manipulation of the state of the attached or bound object.

      + * + *

      However, an "attach" is also different from a "bind" in that "binding" an unused object creates a new object, while "attaching" does not. + * Additionally, "bind" establishes a connection between a context and an object, while "attach" establishes a connection between two objects.

      + * + *

      Finally, if object "A" is attached to object "B" and object "B" is bound to context "C", then in most respects, we treat "A" as if it is + * implicitly bound to "C".

    • + *
    • framebuffer attachment completeness – Similar to texture "mipmap" or "cube" completeness, defines a minimum set of criteria for + * framebuffer attachment points.
    • + *
    • framebuffer completeness – Similar to texture "mipmap cube completeness", defines a composite set of "completeness" requirements and + * relationships among the attached framebuffer-attachable images.
    • + *
    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public class ARBFramebufferObject { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameter of BindFramebuffer, CheckFramebufferStatus, FramebufferTexture{1D|2D|3D}, FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv. + */ + public static final int + GL_FRAMEBUFFER = 0x8D40, + GL_READ_FRAMEBUFFER = 0x8CA8, + GL_DRAW_FRAMEBUFFER = 0x8CA9; + + /** + * Accepted by the {@code target} parameter of BindRenderbuffer, RenderbufferStorage, and GetRenderbufferParameteriv, and returned by + * GetFramebufferAttachmentParameteriv. + */ + public static final int GL_RENDERBUFFER = 0x8D41; + + /** Accepted by the {@code internalformat} parameter of RenderbufferStorage. */ + public static final int + GL_STENCIL_INDEX1 = 0x8D46, + GL_STENCIL_INDEX4 = 0x8D47, + GL_STENCIL_INDEX8 = 0x8D48, + GL_STENCIL_INDEX16 = 0x8D49; + + /** Accepted by the {@code pname} parameter of GetRenderbufferParameteriv. */ + public static final int + GL_RENDERBUFFER_WIDTH = 0x8D42, + GL_RENDERBUFFER_HEIGHT = 0x8D43, + GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8D44, + GL_RENDERBUFFER_RED_SIZE = 0x8D50, + GL_RENDERBUFFER_GREEN_SIZE = 0x8D51, + GL_RENDERBUFFER_BLUE_SIZE = 0x8D52, + GL_RENDERBUFFER_ALPHA_SIZE = 0x8D53, + GL_RENDERBUFFER_DEPTH_SIZE = 0x8D54, + GL_RENDERBUFFER_STENCIL_SIZE = 0x8D55, + GL_RENDERBUFFER_SAMPLES = 0x8CAB; + + /** Accepted by the {@code pname} parameter of GetFramebufferAttachmentParameteriv. */ + public static final int + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4, + GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210, + GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211, + GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212, + GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213, + GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214, + GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215, + GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216, + GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217; + + /** Returned in {@code params} by GetFramebufferAttachmentParameteriv. */ + public static final int + GL_UNSIGNED_NORMALIZED = 0x8C17, + GL_FRAMEBUFFER_DEFAULT = 0x8218, + GL_INDEX = 0x8222; + + /** Accepted by the {@code attachment} parameter of FramebufferTexture{1D|2D|3D}, FramebufferRenderbuffer, and GetFramebufferAttachmentParameteriv. */ + public static final int + GL_COLOR_ATTACHMENT0 = 0x8CE0, + GL_COLOR_ATTACHMENT1 = 0x8CE1, + GL_COLOR_ATTACHMENT2 = 0x8CE2, + GL_COLOR_ATTACHMENT3 = 0x8CE3, + GL_COLOR_ATTACHMENT4 = 0x8CE4, + GL_COLOR_ATTACHMENT5 = 0x8CE5, + GL_COLOR_ATTACHMENT6 = 0x8CE6, + GL_COLOR_ATTACHMENT7 = 0x8CE7, + GL_COLOR_ATTACHMENT8 = 0x8CE8, + GL_COLOR_ATTACHMENT9 = 0x8CE9, + GL_COLOR_ATTACHMENT10 = 0x8CEA, + GL_COLOR_ATTACHMENT11 = 0x8CEB, + GL_COLOR_ATTACHMENT12 = 0x8CEC, + GL_COLOR_ATTACHMENT13 = 0x8CED, + GL_COLOR_ATTACHMENT14 = 0x8CEE, + GL_COLOR_ATTACHMENT15 = 0x8CEF, + GL_DEPTH_ATTACHMENT = 0x8D00, + GL_STENCIL_ATTACHMENT = 0x8D20, + GL_DEPTH_STENCIL_ATTACHMENT = 0x821A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_SAMPLES = 0x8D57; + + /** Returned by CheckFramebufferStatus(). */ + public static final int + GL_FRAMEBUFFER_COMPLETE = 0x8CD5, + GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6, + GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7, + GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0x8CDB, + GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0x8CDC, + GL_FRAMEBUFFER_UNSUPPORTED = 0x8CDD, + GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56, + GL_FRAMEBUFFER_UNDEFINED = 0x8219; + + /** Accepted by the {@code pname} parameters of GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_FRAMEBUFFER_BINDING = 0x8CA6, + GL_DRAW_FRAMEBUFFER_BINDING = 0x8CA6, + GL_READ_FRAMEBUFFER_BINDING = 0x8CAA, + GL_RENDERBUFFER_BINDING = 0x8CA7, + GL_MAX_COLOR_ATTACHMENTS = 0x8CDF, + GL_MAX_RENDERBUFFER_SIZE = 0x84E8; + + /** Returned by GetError(). */ + public static final int GL_INVALID_FRAMEBUFFER_OPERATION = 0x506; + + /** + * Accepted by the {@code format} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage, by the {@code type} parameter of CopyPixels, by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, + * CopyTexImage2D, and RenderbufferStorage, and returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameteriv. + */ + public static final int GL_DEPTH_STENCIL = 0x84F9; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage. + */ + public static final int GL_UNSIGNED_INT_24_8 = 0x84FA; + + /** + * Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorage, and + * returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameteriv. + */ + public static final int GL_DEPTH24_STENCIL8 = 0x88F0; + + /** Accepted by the {@code value} parameter of GetTexLevelParameter. */ + public static final int GL_TEXTURE_STENCIL_SIZE = 0x88F1; + + protected ARBFramebufferObject() { + throw new UnsupportedOperationException(); + } + + // --- [ glIsRenderbuffer ] --- + + /** + * Determines if a name corresponds to a renderbuffer object. + * + * @param renderbuffer a value that may be the name of a renderbuffer object + */ + @NativeType("GLboolean") + public static boolean glIsRenderbuffer(@NativeType("GLuint") int renderbuffer) { + return GL30C.glIsRenderbuffer(renderbuffer); + } + + // --- [ glBindRenderbuffer ] --- + + /** + * Binds a renderbuffer to a renderbuffer target. + * + * @param target the renderbuffer target of the binding operation. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param renderbuffer the name of the renderbuffer object to bind + */ + public static void glBindRenderbuffer(@NativeType("GLenum") int target, @NativeType("GLuint") int renderbuffer) { + GL30C.glBindRenderbuffer(target, renderbuffer); + } + + // --- [ glDeleteRenderbuffers ] --- + + /** + * Unsafe version of: {@link #glDeleteRenderbuffers DeleteRenderbuffers} + * + * @param n the number of renderbuffer objects to be deleted + */ + public static void nglDeleteRenderbuffers(int n, long renderbuffers) { + GL30C.nglDeleteRenderbuffers(n, renderbuffers); + } + + /** + * Deletes renderbuffer objects. + * + * @param renderbuffers an array containing {@code n} renderbuffer objects to be deleted + */ + public static void glDeleteRenderbuffers(@NativeType("GLuint const *") IntBuffer renderbuffers) { + GL30C.glDeleteRenderbuffers(renderbuffers); + } + + /** Deletes renderbuffer objects. */ + public static void glDeleteRenderbuffers(@NativeType("GLuint const *") int renderbuffer) { + GL30C.glDeleteRenderbuffers(renderbuffer); + } + + // --- [ glGenRenderbuffers ] --- + + /** + * Unsafe version of: {@link #glGenRenderbuffers GenRenderbuffers} + * + * @param n the number of renderbuffer object names to generate + */ + public static void nglGenRenderbuffers(int n, long renderbuffers) { + GL30C.nglGenRenderbuffers(n, renderbuffers); + } + + /** + * Generates renderbuffer object names. + * + * @param renderbuffers a buffer in which the generated renderbuffer object names are stored + */ + public static void glGenRenderbuffers(@NativeType("GLuint *") IntBuffer renderbuffers) { + GL30C.glGenRenderbuffers(renderbuffers); + } + + /** Generates renderbuffer object names. */ + @NativeType("void") + public static int glGenRenderbuffers() { + return GL30C.glGenRenderbuffers(); + } + + // --- [ glRenderbufferStorage ] --- + + /** + * Establishes data storage, format and dimensions of a renderbuffer object's image. + * + * @param target the target of the allocation. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + */ + public static void glRenderbufferStorage(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL30C.glRenderbufferStorage(target, internalformat, width, height); + } + + // --- [ glRenderbufferStorageMultisample ] --- + + /** + * Establishes data storage, format, dimensions and sample count of a renderbuffer object's image. + * + *

    {@link #glRenderbufferStorage RenderbufferStorage} is equivalent to calling this method with the samples set to zero.

    + * + * @param target the target of the allocation. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param samples the number of samples to be used for the renderbuffer object's storage + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + */ + public static void glRenderbufferStorageMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL30C.glRenderbufferStorageMultisample(target, samples, internalformat, width, height); + } + + // --- [ glGetRenderbufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetRenderbufferParameteriv GetRenderbufferParameteriv} */ + public static void nglGetRenderbufferParameteriv(int target, int pname, long params) { + GL30C.nglGetRenderbufferParameteriv(target, pname, params); + } + + /** + * Retrieves information about a bound renderbuffer object. + * + * @param target the target of the query operation. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link GL30C#GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link GL30C#GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link GL30C#GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link GL30C#GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link GL30C#GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link GL30C#GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link GL30C#GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link GL30C#GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link GL30C#GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link GL30C#GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + * @param params an array to receive the value of the queried parameter + */ + public static void glGetRenderbufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL30C.glGetRenderbufferParameteriv(target, pname, params); + } + + /** + * Retrieves information about a bound renderbuffer object. + * + * @param target the target of the query operation. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link GL30C#GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link GL30C#GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link GL30C#GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link GL30C#GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link GL30C#GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link GL30C#GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link GL30C#GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link GL30C#GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link GL30C#GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link GL30C#GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + */ + @NativeType("void") + public static int glGetRenderbufferParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL30C.glGetRenderbufferParameteri(target, pname); + } + + // --- [ glIsFramebuffer ] --- + + /** + * Determines if a name corresponds to a framebuffer object. + * + * @param framebuffer a value that may be the name of a framebuffer object + */ + @NativeType("GLboolean") + public static boolean glIsFramebuffer(@NativeType("GLuint") int framebuffer) { + return GL30C.glIsFramebuffer(framebuffer); + } + + // --- [ glBindFramebuffer ] --- + + /** + * Binds a framebuffer to a framebuffer target. + * + * @param target the framebuffer target of the binding operation. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param framebuffer the name of the framebuffer object to bind + */ + public static void glBindFramebuffer(@NativeType("GLenum") int target, @NativeType("GLuint") int framebuffer) { + GL30C.glBindFramebuffer(target, framebuffer); + } + + // --- [ glDeleteFramebuffers ] --- + + /** + * Unsafe version of: {@link #glDeleteFramebuffers DeleteFramebuffers} + * + * @param n the number of framebuffer objects to be deleted + */ + public static void nglDeleteFramebuffers(int n, long framebuffers) { + GL30C.nglDeleteFramebuffers(n, framebuffers); + } + + /** + * Deletes framebuffer objects. + * + * @param framebuffers an array containing {@code n} framebuffer objects to be deleted + */ + public static void glDeleteFramebuffers(@NativeType("GLuint const *") IntBuffer framebuffers) { + GL30C.glDeleteFramebuffers(framebuffers); + } + + /** Deletes framebuffer objects. */ + public static void glDeleteFramebuffers(@NativeType("GLuint const *") int framebuffer) { + GL30C.glDeleteFramebuffers(framebuffer); + } + + // --- [ glGenFramebuffers ] --- + + /** + * Unsafe version of: {@link #glGenFramebuffers GenFramebuffers} + * + * @param n the number of framebuffer object names to generate + */ + public static void nglGenFramebuffers(int n, long framebuffers) { + GL30C.nglGenFramebuffers(n, framebuffers); + } + + /** + * Generates framebuffer object names. + * + * @param framebuffers a buffer in which the generated framebuffer object names are stored + */ + public static void glGenFramebuffers(@NativeType("GLuint *") IntBuffer framebuffers) { + GL30C.glGenFramebuffers(framebuffers); + } + + /** Generates framebuffer object names. */ + @NativeType("void") + public static int glGenFramebuffers() { + return GL30C.glGenFramebuffers(); + } + + // --- [ glCheckFramebufferStatus ] --- + + /** + * Checks the completeness status of a framebuffer. + * + * @param target the target of the framebuffer completeness check. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + */ + @NativeType("GLenum") + public static int glCheckFramebufferStatus(@NativeType("GLenum") int target) { + return GL30C.glCheckFramebufferStatus(target); + } + + // --- [ glFramebufferTexture1D ] --- + + /** + * Attaches a level of a 1D texture object as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param textarget the type of texture + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + */ + public static void glFramebufferTexture1D(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level) { + GL30C.glFramebufferTexture1D(target, attachment, textarget, texture, level); + } + + // --- [ glFramebufferTexture2D ] --- + + /** + * Attaches a level of a 2D texture object as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param textarget the type of texture + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + */ + public static void glFramebufferTexture2D(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level) { + GL30C.glFramebufferTexture2D(target, attachment, textarget, texture, level); + } + + // --- [ glFramebufferTexture3D ] --- + + /** + * Attaches a layer of a 3D texture object as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param textarget the type of texture + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * @param layer the layer of a 2-dimensional image within the 3-dimensional texture. + */ + public static void glFramebufferTexture3D(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer) { + GL30C.glFramebufferTexture3D(target, attachment, textarget, texture, level, layer); + } + + // --- [ glFramebufferTextureLayer ] --- + + /** + * Attaches a single layer of a texture to a framebuffer + * + * @param target the framebuffer target. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * @param layer the layer of {@code texture} to attach. + */ + public static void glFramebufferTextureLayer(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer) { + GL30C.glFramebufferTextureLayer(target, attachment, texture, level, layer); + } + + // --- [ glFramebufferRenderbuffer ] --- + + /** + * Attaches a renderbuffer as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param renderbuffertarget the renderbuffer target. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param renderbuffer the name of an existing renderbuffer object of type {@code renderbuffertarget} to attach + */ + public static void glFramebufferRenderbuffer(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int renderbuffertarget, @NativeType("GLuint") int renderbuffer) { + GL30C.glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); + } + + // --- [ glGetFramebufferAttachmentParameteriv ] --- + + /** Unsafe version of: {@link #glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv} */ + public static void nglGetFramebufferAttachmentParameteriv(int target, int attachment, int pname, long params) { + GL30C.nglGetFramebufferAttachmentParameteriv(target, attachment, pname, params); + } + + /** + * Retrievees information about attachments of a bound framebuffer object. + * + * @param target the target of the query operation. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment within {@code target}. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + * @param params an array to receive the value of the queried parameter + */ + public static void glGetFramebufferAttachmentParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL30C.glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); + } + + /** + * Retrievees information about attachments of a bound framebuffer object. + * + * @param target the target of the query operation. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment within {@code target}. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + */ + @NativeType("void") + public static int glGetFramebufferAttachmentParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname) { + return GL30C.glGetFramebufferAttachmentParameteri(target, attachment, pname); + } + + // --- [ glBlitFramebuffer ] --- + + /** + * Copies a block of pixels from the read framebuffer to the draw framebuffer. + * + * @param srcX0 the lower-left coordinate of the source rectangle within the read buffer + * @param srcY0 the upper-left coordinate of the source rectangle within the read buffer + * @param srcX1 the lower-right coordinate of the source rectangle within the read buffer + * @param srcY1 the upper-right coordinate of the source rectangle within the read buffer + * @param dstX0 the lower-left coordinate of the destination rectangle within the write buffer + * @param dstY0 the upper-left coordinate of the destination rectangle within the write buffer + * @param dstX1 the lower-right coordinate of the destination rectangle within the write buffer + * @param dstY1 the upper-right coordinate of the destination rectangle within the write buffer + * @param mask the bitwise OR of the flags indicating which buffers are to be copied. One of:
    {@link GL11#GL_COLOR_BUFFER_BIT COLOR_BUFFER_BIT}{@link GL11#GL_DEPTH_BUFFER_BIT DEPTH_BUFFER_BIT}{@link GL11#GL_STENCIL_BUFFER_BIT STENCIL_BUFFER_BIT}
    + * @param filter the interpolation to be applied if the image is stretched. One of:
    {@link GL11#GL_NEAREST NEAREST}{@link GL11#GL_LINEAR LINEAR}
    + */ + public static void glBlitFramebuffer(@NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter) { + GL30C.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + } + + // --- [ glGenerateMipmap ] --- + + /** + * Generate mipmaps for a specified texture target. + * + * @param target the target to which the texture whose mimaps to generate is bound. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30C#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL30C#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + */ + public static void glGenerateMipmap(@NativeType("GLenum") int target) { + GL30C.glGenerateMipmap(target); + } + + /** Array version of: {@link #glDeleteRenderbuffers DeleteRenderbuffers} */ + public static void glDeleteRenderbuffers(@NativeType("GLuint const *") int[] renderbuffers) { + GL30C.glDeleteRenderbuffers(renderbuffers); + } + + /** Array version of: {@link #glGenRenderbuffers GenRenderbuffers} */ + public static void glGenRenderbuffers(@NativeType("GLuint *") int[] renderbuffers) { + GL30C.glGenRenderbuffers(renderbuffers); + } + + /** Array version of: {@link #glGetRenderbufferParameteriv GetRenderbufferParameteriv} */ + public static void glGetRenderbufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL30C.glGetRenderbufferParameteriv(target, pname, params); + } + + /** Array version of: {@link #glDeleteFramebuffers DeleteFramebuffers} */ + public static void glDeleteFramebuffers(@NativeType("GLuint const *") int[] framebuffers) { + GL30C.glDeleteFramebuffers(framebuffers); + } + + /** Array version of: {@link #glGenFramebuffers GenFramebuffers} */ + public static void glGenFramebuffers(@NativeType("GLuint *") int[] framebuffers) { + GL30C.glGenFramebuffers(framebuffers); + } + + /** Array version of: {@link #glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv} */ + public static void glGetFramebufferAttachmentParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL30C.glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferSRGB.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferSRGB.java new file mode 100644 index 000000000..3f0884679 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBFramebufferSRGB.java @@ -0,0 +1,39 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_framebuffer_sRGB extension. + * + *

    Conventionally, OpenGL assumes framebuffer color components are stored in a linear color space. In particular, framebuffer blending is a linear + * operation.

    + * + *

    The sRGB color space is based on typical (non-linear) monitor characteristics expected in a dimly lit office. It has been standardized by the + * International Electrotechnical Commission (IEC) as IEC 61966-2-1. The sRGB color space roughly corresponds to 2.2 gamma correction.

    + * + *

    This extension adds a framebuffer capability for sRGB framebuffer update and blending. When blending is disabled but the new sRGB updated mode is + * enabled (assume the framebuffer supports the capability), high-precision linear color component values for red, green, and blue generated by fragment + * coloring are encoded for sRGB prior to being written into the framebuffer. When blending is enabled along with the new sRGB update mode, red, green, and + * blue framebuffer color components are treated as sRGB values that are converted to linear color values, blended with the high-precision color values + * generated by fragment coloring, and then the blend result is encoded for sRGB just prior to being written into the framebuffer.

    + * + *

    The primary motivation for this extension is that it allows OpenGL applications to render into a framebuffer that is scanned to a monitor configured to + * assume framebuffer color values are sRGB encoded. This assumption is roughly true of most PC monitors with default gamma correction. This allows + * applications to achieve faithful color reproduction for OpenGL rendering without adjusting the monitor's gamma correction.

    + * + *

    Requires {@link ARBFramebufferObject ARB_framebuffer_object}. Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public final class ARBFramebufferSRGB { + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_FRAMEBUFFER_SRGB = 0x8DB9; + + private ARBFramebufferSRGB() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGLSPIRV.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGLSPIRV.java new file mode 100644 index 000000000..550cfb5e9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGLSPIRV.java @@ -0,0 +1,166 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_gl_spirv extension. + * + *

    This is version 100 of the GL_ARB_gl_spirv extension.

    + * + *

    This extension does two things:

    + * + *
      + *
    1. Allows a SPIR-V module to be specified as containing a programmable shader stage, rather than using GLSL, whatever the source language was used to + * create the SPIR-V module.
    2. + *
    3. Modifies GLSL to be a source language for creating SPIR-V modules for OpenGL consumption. Such GLSL can be used to create such SPIR-V modules, + * outside of the OpenGL runtime.
    4. + *
    + * + *

    Requires {@link GL33 OpenGL 3.3}.

    + */ +public class ARBGLSPIRV { + + static { GL.initialize(); } + + /** Accepted by the {@code binaryformat} parameter of {@link GL41C#glShaderBinary ShaderBinary}. */ + public static final int GL_SHADER_BINARY_FORMAT_SPIR_V_ARB = 0x9551; + + /** Accepted by the {@code pname} parameter of {@link GL20C#glGetShaderiv GetShaderiv}. */ + public static final int GL_SPIR_V_BINARY_ARB = 0x9552; + + protected ARBGLSPIRV() { + throw new UnsupportedOperationException(); + } + + // --- [ glSpecializeShaderARB ] --- + + /** + * Unsafe version of: {@link #glSpecializeShaderARB SpecializeShaderARB} + * + * @param numSpecializationConstants the number of specialization constants whose values to set in this call + */ + public static native void nglSpecializeShaderARB(int shader, long pEntryPoint, int numSpecializationConstants, long pConstantIndex, long pConstantValue); + + /** + * Specializes a shader created from a SPIR-V module. + * + *

    Shaders associated with SPIR-V modules must be specialized before they can be linked into a program object. It is not necessary to specialize the + * shader before it is attached to a program object. Once specialized, a shader may not be specialized again without first re-associating the original + * SPIR-V module with it, through {@link GL41C#glShaderBinary ShaderBinary}.

    + * + *

    Specialization does two things:

    + * + *
      + *
    • Selects the name of the entry point, for that shader’s stage, from the SPIR-V module.
    • + *
    • Sets the values of all, or a subset of, the specialization constants in the SPIRV module.
    • + *
    + * + *

    On successful shader specialization, the compile status for shader is set to {@link GL11#GL_TRUE TRUE}. On failure, the compile status for shader is set to {@link GL11#GL_FALSE FALSE} and + * additional information about the cause of the failure may be available in the shader compilation log.

    + * + * @param shader the name of a shader object containing unspecialized SPIR-V as created from a successful call to {@link GL41C#glShaderBinary ShaderBinary} to which a SPIR-V module was + * passed + * @param pEntryPoint a pointer to a null-terminated UTF-8 string specifying the name of the entry point in the SPIR-V module to use for this shader + * @param pConstantIndex is a pointer to an array of {@code numSpecializationConstants} unsigned integers, each holding the index of a specialization constant in the SPIR-V + * module whose value to set. + * + *

    Specialization constants not referenced by {@code pConstantIndex} retain their default values as specified in the SPIR-V module.

    + * @param pConstantValue an entry in {@code pConstantValue} is used to set the value of the specialization constant indexed by the corresponding entry in + * {@code pConstantIndex}. + * + *

    Although this array is of unsigned integer, each entry is bitcast to the appropriate type for the module, and therefore, floating-point constants + * may be set by including their IEEE-754 bit representation in the {@code pConstantValue} array.

    + */ + public static void glSpecializeShaderARB(@NativeType("GLuint") int shader, @NativeType("GLchar const *") ByteBuffer pEntryPoint, @NativeType("GLuint const *") IntBuffer pConstantIndex, @NativeType("GLuint const *") IntBuffer pConstantValue) { + if (CHECKS) { + checkNT1(pEntryPoint); + check(pConstantValue, pConstantIndex.remaining()); + } + nglSpecializeShaderARB(shader, memAddress(pEntryPoint), pConstantIndex.remaining(), memAddress(pConstantIndex), memAddress(pConstantValue)); + } + + /** + * Specializes a shader created from a SPIR-V module. + * + *

    Shaders associated with SPIR-V modules must be specialized before they can be linked into a program object. It is not necessary to specialize the + * shader before it is attached to a program object. Once specialized, a shader may not be specialized again without first re-associating the original + * SPIR-V module with it, through {@link GL41C#glShaderBinary ShaderBinary}.

    + * + *

    Specialization does two things:

    + * + *
      + *
    • Selects the name of the entry point, for that shader’s stage, from the SPIR-V module.
    • + *
    • Sets the values of all, or a subset of, the specialization constants in the SPIRV module.
    • + *
    + * + *

    On successful shader specialization, the compile status for shader is set to {@link GL11#GL_TRUE TRUE}. On failure, the compile status for shader is set to {@link GL11#GL_FALSE FALSE} and + * additional information about the cause of the failure may be available in the shader compilation log.

    + * + * @param shader the name of a shader object containing unspecialized SPIR-V as created from a successful call to {@link GL41C#glShaderBinary ShaderBinary} to which a SPIR-V module was + * passed + * @param pEntryPoint a pointer to a null-terminated UTF-8 string specifying the name of the entry point in the SPIR-V module to use for this shader + * @param pConstantIndex is a pointer to an array of {@code numSpecializationConstants} unsigned integers, each holding the index of a specialization constant in the SPIR-V + * module whose value to set. + * + *

    Specialization constants not referenced by {@code pConstantIndex} retain their default values as specified in the SPIR-V module.

    + * @param pConstantValue an entry in {@code pConstantValue} is used to set the value of the specialization constant indexed by the corresponding entry in + * {@code pConstantIndex}. + * + *

    Although this array is of unsigned integer, each entry is bitcast to the appropriate type for the module, and therefore, floating-point constants + * may be set by including their IEEE-754 bit representation in the {@code pConstantValue} array.

    + */ + public static void glSpecializeShaderARB(@NativeType("GLuint") int shader, @NativeType("GLchar const *") CharSequence pEntryPoint, @NativeType("GLuint const *") IntBuffer pConstantIndex, @NativeType("GLuint const *") IntBuffer pConstantValue) { + if (CHECKS) { + check(pConstantValue, pConstantIndex.remaining()); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(pEntryPoint, true); + long pEntryPointEncoded = stack.getPointerAddress(); + nglSpecializeShaderARB(shader, pEntryPointEncoded, pConstantIndex.remaining(), memAddress(pConstantIndex), memAddress(pConstantValue)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glSpecializeShaderARB SpecializeShaderARB} */ + public static void glSpecializeShaderARB(@NativeType("GLuint") int shader, @NativeType("GLchar const *") ByteBuffer pEntryPoint, @NativeType("GLuint const *") int[] pConstantIndex, @NativeType("GLuint const *") int[] pConstantValue) { + long __functionAddress = GL.getICD().glSpecializeShaderARB; + if (CHECKS) { + check(__functionAddress); + checkNT1(pEntryPoint); + check(pConstantValue, pConstantIndex.length); + } + callPPPV(shader, memAddress(pEntryPoint), pConstantIndex.length, pConstantIndex, pConstantValue, __functionAddress); + } + + /** Array version of: {@link #glSpecializeShaderARB SpecializeShaderARB} */ + public static void glSpecializeShaderARB(@NativeType("GLuint") int shader, @NativeType("GLchar const *") CharSequence pEntryPoint, @NativeType("GLuint const *") int[] pConstantIndex, @NativeType("GLuint const *") int[] pConstantValue) { + long __functionAddress = GL.getICD().glSpecializeShaderARB; + if (CHECKS) { + check(__functionAddress); + check(pConstantValue, pConstantIndex.length); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(pEntryPoint, true); + long pEntryPointEncoded = stack.getPointerAddress(); + callPPPV(shader, pEntryPointEncoded, pConstantIndex.length, pConstantIndex, pConstantValue, __functionAddress); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShader5.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShader5.java new file mode 100644 index 000000000..c1798f023 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShader5.java @@ -0,0 +1,78 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_gpu_shader5 extension. + * + *

    This extension provides a set of new features to the OpenGL Shading Language and related APIs to support capabilities of new GPUs, extending the + * capabilities of version 1.50 of the OpenGL Shading Language. Shaders using the new functionality provided by this extension should enable this + * functionality via the construct:

    + * + *
    
    + * #extension GL_ARB_gpu_shader5 : require     (or enable)
    + * + *

    This extension provides a variety of new features for all shader types, including:

    + * + *
      + *
    • support for indexing into arrays of samplers using non-constant indices, as long as the index doesn't diverge if multiple shader invocations are run + * in lockstep;
    • + *
    • extending the uniform block capability of OpenGL 3.1 and 3.2 to allow shaders to index into an array of uniform blocks;
    • + *
    • support for implicitly converting signed integer types to unsigned types, as well as more general implicit conversion and function overloading + * infrastructure to support new data types introduced by other extensions;
    • + *
    • a "precise" qualifier allowing computations to be carried out exactly as specified in the shader source to avoid optimization-induced invariance + * issues (which might cause cracking in tessellation);
    • + *
    • new built-in functions supporting: + * + *
        + *
      • fused floating-point multiply-add operations;
      • + *
      • splitting a floating-point number into a significand and exponent (frexp), or building a floating-point number from a significand and exponent + * (ldexp);
      • + *
      • integer bitfield manipulation, including functions to find the position of the most or least significant set bit, count the number of one bits, + * and bitfield insertion, extraction, and reversal;
      • + *
      • packing and unpacking vectors of small fixed-point data types into a larger scalar; and
      • + *
      • convert floating-point values to or from their integer bit encodings;
      • + *
    • + *
    • extending the textureGather() built-in functions provided by {@link ARBTextureGather ARB_texture_gather}: + * + *
        + *
      • allowing shaders to select any single component of a multi-component texture to produce the gathered 2x2 footprint;
      • + *
      • allowing shaders to perform a per-sample depth comparison when gathering the 2x2 footprint using for shadow sampler types;
      • + *
      • allowing shaders to use arbitrary offsets computed at run-time to select a 2x2 footprint to gather from; and
      • + *
      • allowing shaders to use separate independent offsets for each of the four texels returned, instead of requiring a fixed 2x2 footprint.
      • + *
    • + *
    + * + *

    This extension also provides some new capabilities for individual shader types, including:

    + * + *
      + *
    • support for instanced geometry shaders, where a geometry shader may be run multiple times for each primitive, including a built-in + * {@code gl_InvocationID} to identify the invocation number;
    • + *
    • support for emitting vertices in a geometry program where each vertex emitted may be directed independently at a specified vertex stream (as + * provided by ARB_transform_feedback3), and where each shader output is associated with a stream;
    • + *
    • support for reading a mask of covered samples in a fragment shader; and
    • + *
    • support for interpolating a fragment shader input at a programmable offset relative to the pixel center, a programmable sample number, or at the + * centroid.
    • + *
    + * + *

    Requires {@link GL32 GL32} and GLSL 1.50. Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ +public final class ARBGPUShader5 { + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_GEOMETRY_SHADER_INVOCATIONS = 0x887F; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int + GL_MAX_GEOMETRY_SHADER_INVOCATIONS = 0x8E5A, + GL_MIN_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5B, + GL_MAX_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5C, + GL_FRAGMENT_INTERPOLATION_OFFSET_BITS = 0x8E5D, + GL_MAX_VERTEX_STREAMS = 0x8E71; + + private ARBGPUShader5() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShaderFP64.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShaderFP64.java new file mode 100644 index 000000000..fa3f411e4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShaderFP64.java @@ -0,0 +1,949 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_gpu_shader_fp64 extension. + * + *

    This extension allows GLSL shaders to use double-precision floating-point data types, including vectors and matrices of doubles. Doubles may be used as + * inputs, outputs, and uniforms.

    + * + *

    The shading language supports various arithmetic and comparison operators on double-precision scalar, vector, and matrix types, and provides a set of + * built-in functions including:

    + * + *
      + *
    • square roots and inverse square roots;
    • + *
    • fused floating-point multiply-add operations;
    • + *
    • splitting a floating-point number into a significand and exponent (frexp), or building a floating-point number from a significand and exponent + * (ldexp);
    • + *
    • absolute value, sign tests, various functions to round to an integer value, modulus, minimum, maximum, clamping, blending two values, step + * functions, and testing for infinity and NaN values;
    • + *
    • packing and unpacking doubles into a pair of 32-bit unsigned integers;
    • + *
    • matrix component-wise multiplication, and computation of outer products, transposes, determinants, and inverses; and
    • + *
    • vector relational functions.
    • + *
    + * + *

    Double-precision versions of angle, trigonometry, and exponential functions are not supported.

    + * + *

    Implicit conversions are supported from integer and single-precision floating-point values to doubles, and this extension uses the relaxed function + * overloading rules specified by the ARB_gpu_shader5 extension to resolve ambiguities.

    + * + *

    This extension provides API functions for specifying double-precision uniforms in the default uniform block, including functions similar to the uniform + * functions added by {@link EXTDirectStateAccess EXT_direct_state_access} (if supported).

    + * + *

    This extension provides an "LF" suffix for specifying double-precision constants. Floating-point constants without a suffix in GLSL are treated as + * single-precision values for backward compatibility with versions not supporting doubles; similar constants are treated as double-precision values in the + * "C" programming language.

    + * + *

    This extension does not support interpolation of double-precision values; doubles used as fragment shader inputs must be qualified as "flat". + * Additionally, this extension does not allow vertex attributes with 64-bit components. That support is added separately by + * EXT_vertex_attrib_64bit.

    + * + *

    Requires {@link GL32 GL32} and GLSL 1.50. Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ +public class ARBGPUShaderFP64 { + + static { GL.initialize(); } + + /** Returned in the {@code type} parameter of GetActiveUniform, and GetTransformFeedbackVarying. */ + public static final int + GL_DOUBLE_VEC2 = 0x8FFC, + GL_DOUBLE_VEC3 = 0x8FFD, + GL_DOUBLE_VEC4 = 0x8FFE, + GL_DOUBLE_MAT2 = 0x8F46, + GL_DOUBLE_MAT3 = 0x8F47, + GL_DOUBLE_MAT4 = 0x8F48, + GL_DOUBLE_MAT2x3 = 0x8F49, + GL_DOUBLE_MAT2x4 = 0x8F4A, + GL_DOUBLE_MAT3x2 = 0x8F4B, + GL_DOUBLE_MAT3x4 = 0x8F4C, + GL_DOUBLE_MAT4x2 = 0x8F4D, + GL_DOUBLE_MAT4x3 = 0x8F4E; + + protected ARBGPUShaderFP64() { + throw new UnsupportedOperationException(); + } + + // --- [ glUniform1d ] --- + + /** + * Specifies the value of a double uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + */ + public static void glUniform1d(@NativeType("GLint") int location, @NativeType("GLdouble") double x) { + GL40C.glUniform1d(location, x); + } + + // --- [ glUniform2d ] --- + + /** + * Specifies the value of a dvec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + */ + public static void glUniform2d(@NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y) { + GL40C.glUniform2d(location, x, y); + } + + // --- [ glUniform3d ] --- + + /** + * Specifies the value of a dvec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + */ + public static void glUniform3d(@NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z) { + GL40C.glUniform3d(location, x, y, z); + } + + // --- [ glUniform4d ] --- + + /** + * Specifies the value of a dvec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + */ + public static void glUniform4d(@NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w) { + GL40C.glUniform4d(location, x, y, z, w); + } + + // --- [ glUniform1dv ] --- + + /** + * Unsafe version of: {@link #glUniform1dv Uniform1dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform1dv(int location, int count, long value) { + GL40C.nglUniform1dv(location, count, value); + } + + /** + * Specifies the value of a single double uniform variable or a double uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glUniform1dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniform1dv(location, value); + } + + // --- [ glUniform2dv ] --- + + /** + * Unsafe version of: {@link #glUniform2dv Uniform2dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform2dv(int location, int count, long value) { + GL40C.nglUniform2dv(location, count, value); + } + + /** + * Specifies the value of a single dvec2 uniform variable or a dvec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glUniform2dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniform2dv(location, value); + } + + // --- [ glUniform3dv ] --- + + /** + * Unsafe version of: {@link #glUniform3dv Uniform3dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform3dv(int location, int count, long value) { + GL40C.nglUniform3dv(location, count, value); + } + + /** + * Specifies the value of a single dvec3 uniform variable or a dvec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glUniform3dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniform3dv(location, value); + } + + // --- [ glUniform4dv ] --- + + /** + * Unsafe version of: {@link #glUniform4dv Uniform4dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform4dv(int location, int count, long value) { + GL40C.nglUniform4dv(location, count, value); + } + + /** + * Specifies the value of a single dvec4 uniform variable or a dvec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glUniform4dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniform4dv(location, value); + } + + // --- [ glUniformMatrix2dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2dv UniformMatrix2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix2dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix2dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2 uniform variable or a dmat2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glUniformMatrix2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix2dv(location, transpose, value); + } + + // --- [ glUniformMatrix3dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3dv UniformMatrix3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix3dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix3dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3 uniform variable or a dmat3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glUniformMatrix3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix3dv(location, transpose, value); + } + + // --- [ glUniformMatrix4dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4dv UniformMatrix4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix4dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix4dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4 uniform variable or a dmat4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glUniformMatrix4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix4dv(location, transpose, value); + } + + // --- [ glUniformMatrix2x3dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2x3dv UniformMatrix2x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix2x3dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix2x3dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2x3 uniform variable or a dmat2x3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glUniformMatrix2x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix2x3dv(location, transpose, value); + } + + // --- [ glUniformMatrix2x4dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2x4dv UniformMatrix2x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix2x4dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix2x4dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2x4 uniform variable or a dmat2x4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glUniformMatrix2x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix2x4dv(location, transpose, value); + } + + // --- [ glUniformMatrix3x2dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3x2dv UniformMatrix3x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix3x2dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix3x2dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3x2 uniform variable or a dmat3x2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glUniformMatrix3x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix3x2dv(location, transpose, value); + } + + // --- [ glUniformMatrix3x4dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3x4dv UniformMatrix3x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix3x4dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix3x4dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3x4 uniform variable or a dmat3x4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glUniformMatrix3x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix3x4dv(location, transpose, value); + } + + // --- [ glUniformMatrix4x2dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4x2dv UniformMatrix4x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix4x2dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix4x2dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4x2 uniform variable or a dmat4x2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glUniformMatrix4x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix4x2dv(location, transpose, value); + } + + // --- [ glUniformMatrix4x3dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4x3dv UniformMatrix4x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix4x3dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix4x3dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4x3 uniform variable or a dmat4x3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glUniformMatrix4x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix4x3dv(location, transpose, value); + } + + // --- [ glGetUniformdv ] --- + + /** Unsafe version of: {@link #glGetUniformdv GetUniformdv} */ + public static void nglGetUniformdv(int program, int location, long params) { + GL40C.nglGetUniformdv(program, location, params); + } + + /** + * Returns the double value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + */ + public static void glGetUniformdv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") DoubleBuffer params) { + GL40C.glGetUniformdv(program, location, params); + } + + /** + * Returns the double value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + */ + @NativeType("void") + public static double glGetUniformd(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL40C.glGetUniformd(program, location); + } + + // --- [ glProgramUniform1dEXT ] --- + + /** + * DSA version of {@link #glUniform1d Uniform1d}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + */ + public static native void glProgramUniform1dEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x); + + // --- [ glProgramUniform2dEXT ] --- + + /** + * DSA version of {@link #glUniform2d Uniform2d}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + */ + public static native void glProgramUniform2dEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y); + + // --- [ glProgramUniform3dEXT ] --- + + /** + * DSA version of {@link #glUniform3d Uniform3d}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + */ + public static native void glProgramUniform3dEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glProgramUniform4dEXT ] --- + + /** + * DSA version of {@link #glUniform4d Uniform4d}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + */ + public static native void glProgramUniform4dEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w); + + // --- [ glProgramUniform1dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1dvEXT ProgramUniform1dvEXT} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform1dvEXT(int program, int location, int count, long value); + + /** + * DSA version of {@link #glUniform1dv Uniform1dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform1dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniform1dvEXT(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform2dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2dvEXT ProgramUniform2dvEXT} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform2dvEXT(int program, int location, int count, long value); + + /** + * DSA version of {@link #glUniform2dv Uniform2dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform2dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniform2dvEXT(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform3dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3dvEXT ProgramUniform3dvEXT} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform3dvEXT(int program, int location, int count, long value); + + /** + * DSA version of {@link #glUniform3dv Uniform3dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform3dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniform3dvEXT(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform4dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4dvEXT ProgramUniform4dvEXT} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform4dvEXT(int program, int location, int count, long value); + + /** + * DSA version of {@link #glUniform4dv Uniform4dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform4dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniform4dvEXT(program, location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2dvEXT ProgramUniformMatrix2dvEXT} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix2dvEXT(int program, int location, int count, boolean transpose, long value); + + /** + * DSA version of {@link #glUniformMatrix2dv UniformMatrix2dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix2dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix2dvEXT(program, location, value.remaining() >> 2, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3dvEXT ProgramUniformMatrix3dvEXT} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix3dvEXT(int program, int location, int count, boolean transpose, long value); + + /** + * DSA version of {@link #glUniformMatrix3dv UniformMatrix3dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix3dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix3dvEXT(program, location, value.remaining() / 9, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4dvEXT ProgramUniformMatrix4dvEXT} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix4dvEXT(int program, int location, int count, boolean transpose, long value); + + /** + * DSA version of {@link #glUniformMatrix4dv UniformMatrix4dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix4dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix4dvEXT(program, location, value.remaining() >> 4, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2x3dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x3dvEXT ProgramUniformMatrix2x3dvEXT} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix2x3dvEXT(int program, int location, int count, boolean transpose, long value); + + /** + * DSA version of {@link #glUniformMatrix2x3dv UniformMatrix2x3dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix2x3dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix2x3dvEXT(program, location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2x4dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x4dvEXT ProgramUniformMatrix2x4dvEXT} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix2x4dvEXT(int program, int location, int count, boolean transpose, long value); + + /** + * DSA version of {@link #glUniformMatrix2x4dv UniformMatrix2x4dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix2x4dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix2x4dvEXT(program, location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3x2dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x2dvEXT ProgramUniformMatrix3x2dvEXT} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix3x2dvEXT(int program, int location, int count, boolean transpose, long value); + + /** + * DSA version of {@link #glUniformMatrix3x2dv UniformMatrix3x2dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix3x2dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix3x2dvEXT(program, location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3x4dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x4dvEXT ProgramUniformMatrix3x4dvEXT} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix3x4dvEXT(int program, int location, int count, boolean transpose, long value); + + /** + * DSA version of {@link #glUniformMatrix3x4dv UniformMatrix3x4dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix3x4dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix3x4dvEXT(program, location, value.remaining() / 12, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4x2dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x2dvEXT ProgramUniformMatrix4x2dvEXT} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix4x2dvEXT(int program, int location, int count, boolean transpose, long value); + + /** + * DSA version of {@link #glUniformMatrix4x2dv UniformMatrix4x2dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix4x2dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix4x2dvEXT(program, location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4x3dvEXT ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x3dvEXT ProgramUniformMatrix4x3dvEXT} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix4x3dvEXT(int program, int location, int count, boolean transpose, long value); + + /** + * DSA version of {@link #glUniformMatrix4x3dv UniformMatrix4x3dv}. + * + * @param program the program object to update + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix4x3dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix4x3dvEXT(program, location, value.remaining() / 12, transpose, memAddress(value)); + } + + /** Array version of: {@link #glUniform1dv Uniform1dv} */ + public static void glUniform1dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniform1dv(location, value); + } + + /** Array version of: {@link #glUniform2dv Uniform2dv} */ + public static void glUniform2dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniform2dv(location, value); + } + + /** Array version of: {@link #glUniform3dv Uniform3dv} */ + public static void glUniform3dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniform3dv(location, value); + } + + /** Array version of: {@link #glUniform4dv Uniform4dv} */ + public static void glUniform4dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniform4dv(location, value); + } + + /** Array version of: {@link #glUniformMatrix2dv UniformMatrix2dv} */ + public static void glUniformMatrix2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix2dv(location, transpose, value); + } + + /** Array version of: {@link #glUniformMatrix3dv UniformMatrix3dv} */ + public static void glUniformMatrix3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix3dv(location, transpose, value); + } + + /** Array version of: {@link #glUniformMatrix4dv UniformMatrix4dv} */ + public static void glUniformMatrix4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix4dv(location, transpose, value); + } + + /** Array version of: {@link #glUniformMatrix2x3dv UniformMatrix2x3dv} */ + public static void glUniformMatrix2x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix2x3dv(location, transpose, value); + } + + /** Array version of: {@link #glUniformMatrix2x4dv UniformMatrix2x4dv} */ + public static void glUniformMatrix2x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix2x4dv(location, transpose, value); + } + + /** Array version of: {@link #glUniformMatrix3x2dv UniformMatrix3x2dv} */ + public static void glUniformMatrix3x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix3x2dv(location, transpose, value); + } + + /** Array version of: {@link #glUniformMatrix3x4dv UniformMatrix3x4dv} */ + public static void glUniformMatrix3x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix3x4dv(location, transpose, value); + } + + /** Array version of: {@link #glUniformMatrix4x2dv UniformMatrix4x2dv} */ + public static void glUniformMatrix4x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix4x2dv(location, transpose, value); + } + + /** Array version of: {@link #glUniformMatrix4x3dv UniformMatrix4x3dv} */ + public static void glUniformMatrix4x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix4x3dv(location, transpose, value); + } + + /** Array version of: {@link #glGetUniformdv GetUniformdv} */ + public static void glGetUniformdv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") double[] params) { + GL40C.glGetUniformdv(program, location, params); + } + + /** Array version of: {@link #glProgramUniform1dvEXT ProgramUniform1dvEXT} */ + public static void glProgramUniform1dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniform1dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform2dvEXT ProgramUniform2dvEXT} */ + public static void glProgramUniform2dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniform2dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform3dvEXT ProgramUniform3dvEXT} */ + public static void glProgramUniform3dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniform3dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform4dvEXT ProgramUniform4dvEXT} */ + public static void glProgramUniform4dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniform4dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix2dvEXT ProgramUniformMatrix2dvEXT} */ + public static void glProgramUniformMatrix2dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix3dvEXT ProgramUniformMatrix3dvEXT} */ + public static void glProgramUniformMatrix3dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 9, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix4dvEXT ProgramUniformMatrix4dvEXT} */ + public static void glProgramUniformMatrix4dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 4, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix2x3dvEXT ProgramUniformMatrix2x3dvEXT} */ + public static void glProgramUniformMatrix2x3dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2x3dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 6, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix2x4dvEXT ProgramUniformMatrix2x4dvEXT} */ + public static void glProgramUniformMatrix2x4dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2x4dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 3, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix3x2dvEXT ProgramUniformMatrix3x2dvEXT} */ + public static void glProgramUniformMatrix3x2dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3x2dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 6, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix3x4dvEXT ProgramUniformMatrix3x4dvEXT} */ + public static void glProgramUniformMatrix3x4dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3x4dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 12, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix4x2dvEXT ProgramUniformMatrix4x2dvEXT} */ + public static void glProgramUniformMatrix4x2dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4x2dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 3, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix4x3dvEXT ProgramUniformMatrix4x3dvEXT} */ + public static void glProgramUniformMatrix4x3dvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4x3dvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 12, transpose, value, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShaderInt64.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShaderInt64.java new file mode 100644 index 000000000..657d3d96e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGPUShaderInt64.java @@ -0,0 +1,888 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_gpu_shader_int64 extension. + * + *

    The extension introduces the following features for all shader types:

    + * + *
      + *
    • support for 64-bit scalar and vector integer data types, including uniform API, uniform buffer object, transform feedback, and shader input and + * output support;
    • + *
    • new built-in functions to pack and unpack 64-bit integer types into a two-component 32-bit integer vector;
    • + *
    • new built-in functions to convert double-precision floating-point values to or from their 64-bit integer bit encodings;
    • + *
    • vector relational functions supporting comparisons of vectors of 64-bit integer types; and
    • + *
    • common functions abs, sign, min, max, clamp, and mix supporting arguments of 64-bit integer types.
    • + *
    + * + *

    Requires {@link GL40 GL40} and GLSL 4.00.

    + */ +public class ARBGPUShaderInt64 { + + static { GL.initialize(); } + + /** Returned by the {@code type} parameter of GetActiveAttrib, GetActiveUniform, and GetTransformFeedbackVarying. */ + public static final int + GL_INT64_ARB = 0x140E, + GL_UNSIGNED_INT64_ARB = 0x140F, + GL_INT64_VEC2_ARB = 0x8FE9, + GL_INT64_VEC3_ARB = 0x8FEA, + GL_INT64_VEC4_ARB = 0x8FEB, + GL_UNSIGNED_INT64_VEC2_ARB = 0x8FF5, + GL_UNSIGNED_INT64_VEC3_ARB = 0x8FF6, + GL_UNSIGNED_INT64_VEC4_ARB = 0x8FF7; + + protected ARBGPUShaderInt64() { + throw new UnsupportedOperationException(); + } + + // --- [ glUniform1i64ARB ] --- + + /** + * Specifies the value of an int64_t uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + */ + public static native void glUniform1i64ARB(@NativeType("GLint") int location, @NativeType("GLint64") long x); + + // --- [ glUniform1i64vARB ] --- + + /** + * Unsafe version of: {@link #glUniform1i64vARB Uniform1i64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform1i64vARB(int location, int count, long value); + + /** + * Specifies the value of a single int64_t uniform variable or a int64_t uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified int64_t variable + */ + public static void glUniform1i64vARB(@NativeType("GLint") int location, @NativeType("GLint64 *") LongBuffer value) { + nglUniform1i64vARB(location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform1i64ARB ] --- + + /** + * Specifies the value of an int64_t uniform variable for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + */ + public static native void glProgramUniform1i64ARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64") long x); + + // --- [ glProgramUniform1i64vARB ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1i64vARB ProgramUniform1i64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform1i64vARB(int program, int location, int count, long value); + + /** + * Specifies the value of a single int64_t uniform variable or a int64_t uniform variable array for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified int64_t variable + */ + public static void glProgramUniform1i64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") LongBuffer value) { + nglProgramUniform1i64vARB(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glUniform2i64ARB ] --- + + /** + * Specifies the value of an i64vec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + */ + public static native void glUniform2i64ARB(@NativeType("GLint") int location, @NativeType("GLint64") long x, @NativeType("GLint64") long y); + + // --- [ glUniform2i64vARB ] --- + + /** + * Unsafe version of: {@link #glUniform2i64vARB Uniform2i64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform2i64vARB(int location, int count, long value); + + /** + * Specifies the value of a single i64vec2 uniform variable or a i64vec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified i64vec2 variable + */ + public static void glUniform2i64vARB(@NativeType("GLint") int location, @NativeType("GLint64 *") LongBuffer value) { + nglUniform2i64vARB(location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform2i64ARB ] --- + + /** + * Specifies the value of an i64vec2 uniform variable for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + */ + public static native void glProgramUniform2i64ARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64") long x, @NativeType("GLint64") long y); + + // --- [ glProgramUniform2i64vARB ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2i64vARB ProgramUniform2i64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform2i64vARB(int program, int location, int count, long value); + + /** + * Specifies the value of a single i64vec2 uniform variable or a i64vec2 uniform variable array for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified i64vec2 variable + */ + public static void glProgramUniform2i64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") LongBuffer value) { + nglProgramUniform2i64vARB(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glUniform3i64ARB ] --- + + /** + * Specifies the value of an i64vec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + */ + public static native void glUniform3i64ARB(@NativeType("GLint") int location, @NativeType("GLint64") long x, @NativeType("GLint64") long y, @NativeType("GLint64") long z); + + // --- [ glUniform3i64vARB ] --- + + /** + * Unsafe version of: {@link #glUniform3i64vARB Uniform3i64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform3i64vARB(int location, int count, long value); + + /** + * Specifies the value of a single i64vec3 uniform variable or a i64vec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified i64vec3 variable + */ + public static void glUniform3i64vARB(@NativeType("GLint") int location, @NativeType("GLint64 *") LongBuffer value) { + nglUniform3i64vARB(location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform3i64ARB ] --- + + /** + * Specifies the value of an i64vec3 uniform variable for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + */ + public static native void glProgramUniform3i64ARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64") long x, @NativeType("GLint64") long y, @NativeType("GLint64") long z); + + // --- [ glProgramUniform3i64vARB ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3i64vARB ProgramUniform3i64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform3i64vARB(int program, int location, int count, long value); + + /** + * Specifies the value of a single i64vec3 uniform variable or a i64vec3 uniform variable array for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified i64vec3 variable + */ + public static void glProgramUniform3i64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") LongBuffer value) { + nglProgramUniform3i64vARB(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glUniform4i64ARB ] --- + + /** + * Specifies the value of an i64vec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + */ + public static native void glUniform4i64ARB(@NativeType("GLint") int location, @NativeType("GLint64") long x, @NativeType("GLint64") long y, @NativeType("GLint64") long z, @NativeType("GLint64") long w); + + // --- [ glUniform4i64vARB ] --- + + /** + * Unsafe version of: {@link #glUniform4i64vARB Uniform4i64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform4i64vARB(int location, int count, long value); + + /** + * Specifies the value of a single i64vec4 uniform variable or a i64vec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified i64vec4 variable + */ + public static void glUniform4i64vARB(@NativeType("GLint") int location, @NativeType("GLint64 *") LongBuffer value) { + nglUniform4i64vARB(location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glProgramUniform4i64ARB ] --- + + /** + * Specifies the value of an i64vec4 uniform variable for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + */ + public static native void glProgramUniform4i64ARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64") long x, @NativeType("GLint64") long y, @NativeType("GLint64") long z, @NativeType("GLint64") long w); + + // --- [ glProgramUniform4i64vARB ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4i64vARB ProgramUniform4i64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform4i64vARB(int program, int location, int count, long value); + + /** + * Specifies the value of a single i64vec4 uniform variable or a i64vec4 uniform variable array for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified i64vec4 variable + */ + public static void glProgramUniform4i64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") LongBuffer value) { + nglProgramUniform4i64vARB(program, location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glUniform1ui64ARB ] --- + + /** + * Specifies the value of an uint64_t uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + */ + public static native void glUniform1ui64ARB(@NativeType("GLint") int location, @NativeType("GLuint64") long x); + + // --- [ glUniform1ui64vARB ] --- + + /** + * Unsafe version of: {@link #glUniform1ui64vARB Uniform1ui64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform1ui64vARB(int location, int count, long value); + + /** + * Specifies the value of a single uint64_t uniform variable or a uint64_t uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uint64_t variable + */ + public static void glUniform1ui64vARB(@NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer value) { + nglUniform1ui64vARB(location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform1ui64ARB ] --- + + /** + * Specifies the value of an uint64_t uniform variable for the current program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + */ + public static native void glProgramUniform1ui64ARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64") long x); + + // --- [ glProgramUniform1ui64vARB ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1ui64vARB ProgramUniform1ui64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform1ui64vARB(int program, int location, int count, long value); + + /** + * Specifies the value of a single uint64_t uniform variable or a uint64_t uniform variable array for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uint64_t variable + */ + public static void glProgramUniform1ui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer value) { + nglProgramUniform1ui64vARB(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glUniform2ui64ARB ] --- + + /** + * Specifies the value of an u64vec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + */ + public static native void glUniform2ui64ARB(@NativeType("GLint") int location, @NativeType("GLuint64") long x, @NativeType("GLuint64") long y); + + // --- [ glUniform2ui64vARB ] --- + + /** + * Unsafe version of: {@link #glUniform2ui64vARB Uniform2ui64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform2ui64vARB(int location, int count, long value); + + /** + * Specifies the value of a single u64vec2 uniform variable or a u64vec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified u64vec2 variable + */ + public static void glUniform2ui64vARB(@NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer value) { + nglUniform2ui64vARB(location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform2ui64ARB ] --- + + /** + * Specifies the value of an u64vec2 uniform variable for the current program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + */ + public static native void glProgramUniform2ui64ARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64") long x, @NativeType("GLuint64") long y); + + // --- [ glProgramUniform2ui64vARB ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2ui64vARB ProgramUniform2ui64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform2ui64vARB(int program, int location, int count, long value); + + /** + * Specifies the value of a single u64vec2 uniform variable or a u64vec2 uniform variable array for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified u64vec2 variable + */ + public static void glProgramUniform2ui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer value) { + nglProgramUniform2ui64vARB(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glUniform3ui64ARB ] --- + + /** + * Specifies the value of an u64vec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + */ + public static native void glUniform3ui64ARB(@NativeType("GLint") int location, @NativeType("GLuint64") long x, @NativeType("GLuint64") long y, @NativeType("GLuint64") long z); + + // --- [ glUniform3ui64vARB ] --- + + /** + * Unsafe version of: {@link #glUniform3ui64vARB Uniform3ui64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform3ui64vARB(int location, int count, long value); + + /** + * Specifies the value of a single u64vec3 uniform variable or a u64vec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified u64vec3 variable + */ + public static void glUniform3ui64vARB(@NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer value) { + nglUniform3ui64vARB(location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform3ui64ARB ] --- + + /** + * Specifies the value of an u64vec3 uniform variable for the current program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + */ + public static native void glProgramUniform3ui64ARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64") long x, @NativeType("GLuint64") long y, @NativeType("GLuint64") long z); + + // --- [ glProgramUniform3ui64vARB ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3ui64vARB ProgramUniform3ui64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform3ui64vARB(int program, int location, int count, long value); + + /** + * Specifies the value of a single u64vec3 uniform variable or a u64vec3 uniform variable array for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified u64vec3 variable + */ + public static void glProgramUniform3ui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer value) { + nglProgramUniform3ui64vARB(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glUniform4ui64ARB ] --- + + /** + * Specifies the value of an u64vec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + */ + public static native void glUniform4ui64ARB(@NativeType("GLint") int location, @NativeType("GLuint64") long x, @NativeType("GLuint64") long y, @NativeType("GLuint64") long z, @NativeType("GLuint64") long w); + + // --- [ glUniform4ui64vARB ] --- + + /** + * Unsafe version of: {@link #glUniform4ui64vARB Uniform4ui64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform4ui64vARB(int location, int count, long value); + + /** + * Specifies the value of a single u64vec4 uniform variable or a u64vec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified u64vec4 variable + */ + public static void glUniform4ui64vARB(@NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer value) { + nglUniform4ui64vARB(location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glProgramUniform4ui64ARB ] --- + + /** + * Specifies the value of an u64vec4 uniform variable for the current program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + */ + public static native void glProgramUniform4ui64ARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64") long x, @NativeType("GLuint64") long y, @NativeType("GLuint64") long z, @NativeType("GLuint64") long w); + + // --- [ glProgramUniform4ui64vARB ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4ui64vARB ProgramUniform4ui64vARB} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform4ui64vARB(int program, int location, int count, long value); + + /** + * Specifies the value of a single u64vec4 uniform variable or a u64vec4 uniform variable array for the specified program object. + * + * @param program the program object + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified u64vec4 variable + */ + public static void glProgramUniform4ui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer value) { + nglProgramUniform4ui64vARB(program, location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glGetUniformi64vARB ] --- + + /** Unsafe version of: {@link #glGetUniformi64vARB GetUniformi64vARB} */ + public static native void nglGetUniformi64vARB(int program, int location, long params); + + /** + * Returns the int64_t value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + */ + public static void glGetUniformi64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformi64vARB(program, location, memAddress(params)); + } + + /** + * Returns the int64_t value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + */ + @NativeType("void") + public static long glGetUniformi64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetUniformi64vARB(program, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetUniformui64vARB ] --- + + /** Unsafe version of: {@link #glGetUniformui64vARB GetUniformui64vARB} */ + public static native void nglGetUniformui64vARB(int program, int location, long params); + + /** + * Returns the uint64_t value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + */ + public static void glGetUniformui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformui64vARB(program, location, memAddress(params)); + } + + /** + * Returns the uint64_t value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + */ + @NativeType("void") + public static long glGetUniformui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetUniformui64vARB(program, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnUniformi64vARB ] --- + + /** + * Unsafe version of: {@link #glGetnUniformi64vARB GetnUniformi64vARB} + * + * @param bufSize the maximum number of values to write in {@code params} + */ + public static native void nglGetnUniformi64vARB(int program, int location, int bufSize, long params); + + /** + * Robust version of {@link #glGetUniformi64vARB GetUniformi64vARB}. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + */ + public static void glGetnUniformi64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") LongBuffer params) { + nglGetnUniformi64vARB(program, location, params.remaining(), memAddress(params)); + } + + /** + * Robust version of {@link #glGetUniformi64vARB GetUniformi64vARB}. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + */ + @NativeType("void") + public static long glGetnUniformi64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetnUniformi64vARB(program, location, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnUniformui64vARB ] --- + + /** + * Unsafe version of: {@link #glGetnUniformui64vARB GetnUniformui64vARB} + * + * @param bufSize the maximum number of values to write in {@code params} + */ + public static native void nglGetnUniformui64vARB(int program, int location, int bufSize, long params); + + /** + * Robust version of {@link #glGetUniformui64vARB GetUniformui64vARB}. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + */ + public static void glGetnUniformui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 *") LongBuffer params) { + nglGetnUniformui64vARB(program, location, params.remaining(), memAddress(params)); + } + + /** + * Robust version of {@link #glGetUniformui64vARB GetUniformui64vARB}. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + */ + @NativeType("void") + public static long glGetnUniformui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetnUniformui64vARB(program, location, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glUniform1i64vARB Uniform1i64vARB} */ + public static void glUniform1i64vARB(@NativeType("GLint") int location, @NativeType("GLint64 *") long[] value) { + long __functionAddress = GL.getICD().glUniform1i64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform1i64vARB ProgramUniform1i64vARB} */ + public static void glProgramUniform1i64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform1i64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glUniform2i64vARB Uniform2i64vARB} */ + public static void glUniform2i64vARB(@NativeType("GLint") int location, @NativeType("GLint64 *") long[] value) { + long __functionAddress = GL.getICD().glUniform2i64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform2i64vARB ProgramUniform2i64vARB} */ + public static void glProgramUniform2i64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform2i64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glUniform3i64vARB Uniform3i64vARB} */ + public static void glUniform3i64vARB(@NativeType("GLint") int location, @NativeType("GLint64 *") long[] value) { + long __functionAddress = GL.getICD().glUniform3i64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform3i64vARB ProgramUniform3i64vARB} */ + public static void glProgramUniform3i64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform3i64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glUniform4i64vARB Uniform4i64vARB} */ + public static void glUniform4i64vARB(@NativeType("GLint") int location, @NativeType("GLint64 *") long[] value) { + long __functionAddress = GL.getICD().glUniform4i64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform4i64vARB ProgramUniform4i64vARB} */ + public static void glProgramUniform4i64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform4i64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glUniform1ui64vARB Uniform1ui64vARB} */ + public static void glUniform1ui64vARB(@NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] value) { + long __functionAddress = GL.getICD().glUniform1ui64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform1ui64vARB ProgramUniform1ui64vARB} */ + public static void glProgramUniform1ui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform1ui64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glUniform2ui64vARB Uniform2ui64vARB} */ + public static void glUniform2ui64vARB(@NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] value) { + long __functionAddress = GL.getICD().glUniform2ui64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform2ui64vARB ProgramUniform2ui64vARB} */ + public static void glProgramUniform2ui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform2ui64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glUniform3ui64vARB Uniform3ui64vARB} */ + public static void glUniform3ui64vARB(@NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] value) { + long __functionAddress = GL.getICD().glUniform3ui64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform3ui64vARB ProgramUniform3ui64vARB} */ + public static void glProgramUniform3ui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform3ui64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glUniform4ui64vARB Uniform4ui64vARB} */ + public static void glUniform4ui64vARB(@NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] value) { + long __functionAddress = GL.getICD().glUniform4ui64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform4ui64vARB ProgramUniform4ui64vARB} */ + public static void glProgramUniform4ui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform4ui64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glGetUniformi64vARB GetUniformi64vARB} */ + public static void glGetUniformi64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetUniformi64vARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, location, params, __functionAddress); + } + + /** Array version of: {@link #glGetUniformui64vARB GetUniformui64vARB} */ + public static void glGetUniformui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetUniformui64vARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, location, params, __functionAddress); + } + + /** Array version of: {@link #glGetnUniformi64vARB GetnUniformi64vARB} */ + public static void glGetnUniformi64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetnUniformi64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, params.length, params, __functionAddress); + } + + /** Array version of: {@link #glGetnUniformui64vARB GetnUniformui64vARB} */ + public static void glGetnUniformui64vARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetnUniformui64vARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, params.length, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGeometryShader4.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGeometryShader4.java new file mode 100644 index 000000000..81d5366fe --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGeometryShader4.java @@ -0,0 +1,164 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_geometry_shader4 extension. + * + *

    ARB_geometry_shader4 defines a new shader type available to be run on the GPU, called a geometry shader. Geometry shaders are run after vertices are + * transformed, but prior to color clamping, flat shading and clipping.

    + * + *

    A geometry shader begins with a single primitive (point, line, triangle). It can read the attributes of any of the vertices in the primitive and use + * them to generate new primitives. A geometry shader has a fixed output primitive type (point, line strip, or triangle strip) and emits vertices to define + * a new primitive. A geometry shader can emit multiple disconnected primitives. The primitives emitted by the geometry shader are clipped and then + * processed like an equivalent OpenGL primitive specified by the application.

    + * + *

    Furthermore, ARB_geometry_shader4 provides four additional primitive types: lines with adjacency, line strips with adjacency, separate triangles with + * adjacency, and triangle strips with adjacency. Some of the vertices specified in these new primitive types are not part of the ordinary primitives, + * instead they represent neighboring vertices that are adjacent to the two line segment end points (lines/strips) or the three triangle edges + * (triangles/tstrips). These vertices can be accessed by geometry shaders and used to match up the vertices emitted by the geometry shader with those of + * neighboring primitives.

    + * + *

    Since geometry shaders expect a specific input primitive type, an error will occur if the application presents primitives of a different type. For + * example, if a geometry shader expects points, an error will occur at {@link GL11#glBegin Begin} time, if a primitive mode of {@link GL11#GL_TRIANGLES TRIANGLES} is specified.

    + * + *

    Promoted to core in {@link GL32 OpenGL 3.2}.

    + */ +public class ARBGeometryShader4 { + + static { GL.initialize(); } + + /** Accepted by the {@code type} parameter of CreateShader and returned by the {@code params} parameter of GetShaderiv. */ + public static final int GL_GEOMETRY_SHADER_ARB = 0x8DD9; + + /** Accepted by the {@code pname} parameter of ProgramParameteriARB and GetProgramiv. */ + public static final int + GL_GEOMETRY_VERTICES_OUT_ARB = 0x8DDA, + GL_GEOMETRY_INPUT_TYPE_ARB = 0x8DDB, + GL_GEOMETRY_OUTPUT_TYPE_ARB = 0x8DDC; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB = 0x8C29, + GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB = 0x8DDD, + GL_MAX_VERTEX_VARYING_COMPONENTS_ARB = 0x8DDE, + GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB = 0x8DDF, + GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB = 0x8DE0, + GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB = 0x8DE1; + + /** Accepted by the {@code mode} parameter of Begin, DrawArrays, MultiDrawArrays, DrawElements, MultiDrawElements, and DrawRangeElements. */ + public static final int + GL_LINES_ADJACENCY_ARB = 0xA, + GL_LINE_STRIP_ADJACENCY_ARB = 0xB, + GL_TRIANGLES_ADJACENCY_ARB = 0xC, + GL_TRIANGLE_STRIP_ADJACENCY_ARB = 0xD; + + /** Returned by CheckFramebufferStatusARB. */ + public static final int + GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB = 0x8DA8, + GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB = 0x8DA9; + + /** Accepted by the {@code pname} parameter of GetFramebufferAttachment- ParameterivARB. */ + public static final int + GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB = 0x8DA7, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetIntegerv, GetFloatv, GetDoublev, and + * GetBooleanv. + */ + public static final int GL_PROGRAM_POINT_SIZE_ARB = 0x8642; + + protected ARBGeometryShader4() { + throw new UnsupportedOperationException(); + } + + // --- [ glProgramParameteriARB ] --- + + /** + * Sets a program object parameter. + * + *

    The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated if {@code pname} is {@link #GL_GEOMETRY_INPUT_TYPE_ARB GEOMETRY_INPUT_TYPE_ARB} and {@code value} is not one of {@link GL11#GL_POINTS POINTS}, {@link GL11#GL_LINES LINES}, + * {@link #GL_LINES_ADJACENCY_ARB LINES_ADJACENCY_ARB}, {@link GL11#GL_TRIANGLES TRIANGLES} or {@link #GL_TRIANGLES_ADJACENCY_ARB TRIANGLES_ADJACENCY_ARB}.

    + * + *

    The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated if {@code pname} is {@link #GL_GEOMETRY_OUTPUT_TYPE_ARB GEOMETRY_OUTPUT_TYPE_ARB} and {@code value} is not one of {@link GL11#GL_POINTS POINTS}, {@link GL11#GL_LINE_STRIP LINE_STRIP} or + * {@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}.

    + * + *

    The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated if {@code pname} is {@link #GL_GEOMETRY_VERTICES_OUT_ARB GEOMETRY_VERTICES_OUT_ARB} and {@code value} is negative.

    + * + *

    The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated if {@code pname} is {@link #GL_GEOMETRY_VERTICES_OUT_ARB GEOMETRY_VERTICES_OUT_ARB} and {@code value} exceeds {@link #GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB MAX_GEOMETRY_OUTPUT_VERTICES_ARB}.

    + * + *

    The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated if {@code pname} is set to {@link #GL_GEOMETRY_VERTICES_OUT_ARB GEOMETRY_VERTICES_OUT_ARB} and the product of {@code value} and the sum of all + * components of all active varying variables exceeds {@link #GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB}.

    + * + * @param program the program object + * @param pname the parameter to set. One of:
    {@link #GL_GEOMETRY_VERTICES_OUT_ARB GEOMETRY_VERTICES_OUT_ARB}{@link #GL_GEOMETRY_INPUT_TYPE_ARB GEOMETRY_INPUT_TYPE_ARB}{@link #GL_GEOMETRY_OUTPUT_TYPE_ARB GEOMETRY_OUTPUT_TYPE_ARB}
    + * @param value the value being set + */ + public static native void glProgramParameteriARB(@NativeType("GLuint") int program, @NativeType("GLenum") int pname, @NativeType("GLint") int value); + + // --- [ glFramebufferTextureARB ] --- + + /** + * Attaches a specified level of a texture object as one of the logical buffers of the currently bound framebuffer object, to render directly into the + * texture image. + * + *

    If {@code texture} is zero, any image or array of images attached to the attachment point named by {@code attachment} is detached, and the state of the + * attachment point is reset to its initial values. {@code level} is ignored if {@code texture} is zero.

    + * + *

    If {@code texture} is non-zero, FramebufferTextureARB attaches level {@code level} of the texture object named {@code texture} to the framebuffer + * attachment point named by {@code attachment}. The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated if {@code texture} is not the name of a texture object, or if + * {@code level} is not a supported texture level number for textures of the type corresponding to {@code target}. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is + * generated if {@code texture} is the name of a buffer texture.

    + * + *

    If {@code texture} is the name of a three-dimensional texture, cube map texture, or one- or two-dimensional array texture, the texture level attached to + * the framebuffer attachment point is an array of images, and the framebuffer attachment is considered layered.

    + * + * @param target the render target. Must be:
    {@link ARBFramebufferObject#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param attachment must be one of the attachments points of the framebuffer + * @param texture the texture object name + * @param level the texture level + */ + public static native void glFramebufferTextureARB(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glFramebufferTextureLayerARB ] --- + + /** + * Operates like {@link #glFramebufferTextureARB FramebufferTextureARB}, except that only a single layer of the texture level, numbered {@code layer}, is attached to the attachment + * point. + * + *

    If {@code texture} is non-zero, the error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated if {@code layer} is negative, or if {@code texture} is not the name of a + * texture object. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated unless {@code texture} is zero or the name of a three-dimensional or one- or + * two-dimensional array texture.

    + * + * @param target the render target. Must be:
    {@link ARBFramebufferObject#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param attachment must be one of the attachments points of the framebuffer + * @param texture the texture object name + * @param level the texture level + * @param layer the texture layer + */ + public static native void glFramebufferTextureLayerARB(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer); + + // --- [ glFramebufferTextureFaceARB ] --- + + /** + * Operates like {@link #glFramebufferTextureARB FramebufferTextureARB}, except that only a single face of a cube map texture, given by {@code face}, is attached to the attachment + * point. + * + *

    If {@code texture} is non-zero, the error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated if {@code texture} is not the name of a texture object. The error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated unless {@code texture} is zero or the name of a cube map texture.

    + * + * @param target the render target. Must be:
    {@link ARBFramebufferObject#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param attachment must be one of the attachments points of the framebuffer + * @param texture the texture object name + * @param level the texture level + * @param face the cube map face. One of:
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + */ + public static native void glFramebufferTextureFaceARB(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int face); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGetProgramBinary.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGetProgramBinary.java new file mode 100644 index 000000000..3148c5d39 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGetProgramBinary.java @@ -0,0 +1,113 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_get_program_binary extension. + * + *

    This extension introduces new commands to retrieve and set the binary representation of a program object. {@link #glGetProgramBinary GetProgramBinary} allows an application to + * cache compiled and linked programs to avoid compiling and linking when used again. This may even allow the GL itself to act as an offline compiler. The + * resulting program binary can be reloaded into the GL via {@link #glProgramBinary ProgramBinary}. This is a very useful path for applications that wish to remain portable by + * shipping pure GLSL source shaders, yet would like to avoid the cost of compiling their shaders at runtime. Instead an application can supply its GLSL + * source shaders during first application run, or even during installation. The application then compiles and links its shaders and reads back the program + * binaries. On subsequent runs, only the program binaries need be supplied.

    + * + *

    {@link #glProgramBinary ProgramBinary} may also accept binaries in vendor-specific formats produced by specialized offline compilation tools. This extension does not add any + * such formats, but allows for them in further extensions. Though the level of optimization may not be identical -- the offline shader compiler may have + * the luxury of more aggressive optimization at its disposal -- program binaries generated online by the GL are interchangeable with those generated + * offline by an SDK tool.

    + * + *

    Requires {@link GL30 OpenGL 3.0}. Promoted to core in {@link GL41 OpenGL 4.1}.

    + */ +public class ARBGetProgramBinary { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of ProgramParameteri and GetProgramiv. */ + public static final int GL_PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_PROGRAM_BINARY_LENGTH = 0x8741; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv and GetDoublev. */ + public static final int + GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE, + GL_PROGRAM_BINARY_FORMATS = 0x87FF; + + protected ARBGetProgramBinary() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetProgramBinary ] --- + + /** + * Unsafe version of: {@link #glGetProgramBinary GetProgramBinary} + * + * @param bufSize the size of the buffer whose address is given by {@code binary} + */ + public static void nglGetProgramBinary(int program, int bufSize, long length, long binaryFormat, long binary) { + GL41C.nglGetProgramBinary(program, bufSize, length, binaryFormat, binary); + } + + /** + * Returns a binary representation of a program object's compiled and linked executable source. + * + * @param program the name of a program object whose binary representation to retrieve + * @param length the address of a variable to receive the number of bytes written into {@code binary} + * @param binaryFormat a variable to receive a token indicating the format of the binary data returned by the GL + * @param binary an array into which the GL will return {@code program}'s binary representation + */ + public static void glGetProgramBinary(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLenum *") IntBuffer binaryFormat, @NativeType("void *") ByteBuffer binary) { + GL41C.glGetProgramBinary(program, length, binaryFormat, binary); + } + + // --- [ glProgramBinary ] --- + + /** + * Unsafe version of: {@link #glProgramBinary ProgramBinary} + * + * @param length the number of bytes contained in {@code binary} + */ + public static void nglProgramBinary(int program, int binaryFormat, long binary, int length) { + GL41C.nglProgramBinary(program, binaryFormat, binary, length); + } + + /** + * Loads a program object with a program binary. + * + * @param program the name of a program object into which to load a program binary + * @param binaryFormat the format of the binary data in binary + * @param binary an array containing the binary to be loaded into {@code program} + */ + public static void glProgramBinary(@NativeType("GLuint") int program, @NativeType("GLenum") int binaryFormat, @NativeType("void const *") ByteBuffer binary) { + GL41C.glProgramBinary(program, binaryFormat, binary); + } + + // --- [ glProgramParameteri ] --- + + /** + * Specifies the integer value of a program object parameter. + * + * @param program the name of a program object whose parameter to modify + * @param pname the name of the parameter to modify. One of:
    {@link GL41C#GL_PROGRAM_BINARY_RETRIEVABLE_HINT PROGRAM_BINARY_RETRIEVABLE_HINT}{@link GL41C#GL_PROGRAM_SEPARABLE PROGRAM_SEPARABLE}
    + * @param value the new value of the parameter specified by {@code pname} for {@code program} + */ + public static void glProgramParameteri(@NativeType("GLuint") int program, @NativeType("GLenum") int pname, @NativeType("GLint") int value) { + GL41C.glProgramParameteri(program, pname, value); + } + + /** Array version of: {@link #glGetProgramBinary GetProgramBinary} */ + public static void glGetProgramBinary(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLenum *") int[] binaryFormat, @NativeType("void *") ByteBuffer binary) { + GL41C.glGetProgramBinary(program, length, binaryFormat, binary); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGetTextureSubImage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGetTextureSubImage.java new file mode 100644 index 000000000..70388a126 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBGetTextureSubImage.java @@ -0,0 +1,307 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_get_texture_sub_image extension. + * + *

    This extension adds a new function to get sub-regions of texture images.

    + * + *

    Requires {@link GL20 OpenGL 2.0}. Promoted to core in {@link GL45 OpenGL 4.5}.

    + */ +public class ARBGetTextureSubImage { + + static { GL.initialize(); } + + protected ARBGetTextureSubImage() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetTextureSubImage ] --- + + /** + * Unsafe version of: {@link #glGetTextureSubImage GetTextureSubImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static void nglGetTextureSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, int bufSize, long pixels) { + GL45C.nglGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + // --- [ glGetCompressedTextureSubImage ] --- + + /** + * Unsafe version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static void nglGetCompressedTextureSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int bufSize, long pixels) { + GL45C.nglGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels the buffer in which to place the returned data + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") ByteBuffer pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") ShortBuffer pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") IntBuffer pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") FloatBuffer pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") DoubleBuffer pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** Array version of: {@link #glGetTextureSubImage GetTextureSubImage} */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** Array version of: {@link #glGetTextureSubImage GetTextureSubImage} */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** Array version of: {@link #glGetTextureSubImage GetTextureSubImage} */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** Array version of: {@link #glGetTextureSubImage GetTextureSubImage} */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") short[] pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") int[] pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") float[] pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") double[] pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBHalfFloatPixel.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBHalfFloatPixel.java new file mode 100644 index 000000000..600ad0b00 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBHalfFloatPixel.java @@ -0,0 +1,33 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_half_float_pixel extension. + * + *

    This extension introduces a new data type for half-precision (16-bit) floating-point quantities. The floating-point format is very similar to the IEEE + * single-precision floating-point standard, except that it has only 5 exponent bits and 10 mantissa bits. Half-precision floats are smaller than full + * precision floats and provide a larger dynamic range than similarly sized normalized scalar data types.

    + * + *

    This extension allows applications to use half-precision floating-point data when specifying pixel data. It extends the existing image specification + * commands to accept the new data type.

    + * + *

    Floating-point data is clamped to [0, 1] at various places in the GL unless clamping is disabled with the ARB_color_buffer_float extension.

    + * + *

    Requires {@link GL15 OpenGL 1.5}. Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public final class ARBHalfFloatPixel { + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, GetTexImage, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter, + * ColorTable, ColorSubTable, and GetColorTable. + */ + public static final int GL_HALF_FLOAT_ARB = 0x140B; + + private ARBHalfFloatPixel() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBHalfFloatVertex.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBHalfFloatVertex.java new file mode 100644 index 000000000..454ea6fee --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBHalfFloatVertex.java @@ -0,0 +1,31 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_half_float_vertex extension. + * + *

    This extension extends the usage of the half-precision (16-bit) floating-point quantities introduced in {@link ARBHalfFloatPixel ARB_half_float_pixel} for usage in + * specifying vertex array data.

    + * + *

    This extension allows applications to use half-precision floating point data when specifying vertices. This can allow applications to reduce their + * memory footprint, as well as the memory bandwidth required for vertex data.

    + * + *

    This extension extends the existing vertex array commands to accept the new data type.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public final class ARBHalfFloatVertex { + + /** + * Accepted by the {@code type} argument of VertexPointer, NormalPointer, ColorPointer, SecondaryColorPointer, FogCoordPointer, TexCoordPointer, and + * VertexAttribPointer. + */ + public static final int GL_HALF_FLOAT = 0x140B; + + private ARBHalfFloatVertex() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBImaging.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBImaging.java new file mode 100644 index 000000000..4518c6cc5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBImaging.java @@ -0,0 +1,1303 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to the OpenGL 1.2 optional imaging subset. */ +public class ARBImaging { + + static { GL.initialize(); } + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of ColorTable, CopyColorTable, ColorTableParameteriv, ColorTableParameterfv, + * GetColorTable, GetColorTableParameteriv, and GetColorTableParameterfv. + */ + public static final int + GL_COLOR_TABLE = 0x80D0, + GL_POST_CONVOLUTION_COLOR_TABLE = 0x80D1, + GL_POST_COLOR_MATRIX_COLOR_TABLE = 0x80D2; + + /** Accepted by the {@code target} parameter of ColorTable, GetColorTableParameteriv, and GetColorTableParameterfv. */ + public static final int + GL_PROXY_COLOR_TABLE = 0x80D3, + GL_PROXY_POST_CONVOLUTION_COLOR_TABLE = 0x80D4, + GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE = 0x80D5; + + /** + * Accepted by the {@code pname} parameter of ColorTableParameteriv, ColorTableParameterfv, GetColorTableParameteriv, and + * GetColorTableParameterfv. + */ + public static final int + GL_COLOR_TABLE_SCALE = 0x80D6, + GL_COLOR_TABLE_BIAS = 0x80D7; + + /** Accepted by the {@code pname} parameter of GetColorTableParameteriv and GetColorTableParameterfv. */ + public static final int + GL_COLOR_TABLE_FORMAT = 0x80D8, + GL_COLOR_TABLE_WIDTH = 0x80D9, + GL_COLOR_TABLE_RED_SIZE = 0x80DA, + GL_COLOR_TABLE_GREEN_SIZE = 0x80DB, + GL_COLOR_TABLE_BLUE_SIZE = 0x80DC, + GL_COLOR_TABLE_ALPHA_SIZE = 0x80DD, + GL_COLOR_TABLE_LUMINANCE_SIZE = 0x80DE, + GL_COLOR_TABLE_INTENSITY_SIZE = 0x80DF; + + /** ErrorCode */ + public static final int GL_TABLE_TOO_LARGE = 0x8031; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of ConvolutionFilter1D, CopyConvolutionFilter1D, GetConvolutionFilter, ConvolutionParameteri, + * ConvolutionParameterf, ConvolutionParameteriv, ConvolutionParameterfv, GetConvolutionParameteriv, and GetConvolutionParameterfv. + */ + public static final int GL_CONVOLUTION_1D = 0x8010; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of ConvolutionFilter2D, CopyConvolutionFilter2D, GetConvolutionFilter, ConvolutionParameteri, + * ConvolutionParameterf, ConvolutionParameteriv, ConvolutionParameterfv, GetConvolutionParameteriv, and GetConvolutionParameterfv. + */ + public static final int GL_CONVOLUTION_2D = 0x8011; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of SeparableFilter2D, SeparableFilter2D, GetSeparableFilter, ConvolutionParameteri, + * ConvolutionParameterf, ConvolutionParameteriv, ConvolutionParameterfv, GetConvolutionParameteriv, and GetConvolutionParameterfv. + */ + public static final int GL_SEPARABLE_2D = 0x8012; + + /** + * Accepted by the {@code pname} parameter of ConvolutionParameteri, ConvolutionParameterf, ConvolutionParameteriv, ConvolutionParameterfv, + * GetConvolutionParameteriv, and GetConvolutionParameterfv. + */ + public static final int GL_CONVOLUTION_BORDER_MODE = 0x8013; + + /** Accepted by the {@code pname} parameter of ConvolutionParameteriv, ConvolutionParameterfv, GetConvolutionParameteriv, and GetConvolutionParameterfv. */ + public static final int + GL_CONVOLUTION_FILTER_SCALE = 0x8014, + GL_CONVOLUTION_FILTER_BIAS = 0x8015; + + /** + * Accepted by the {@code param} parameter of ConvolutionParameteri, and ConvolutionParameterf, and by the {@code params} parameter of + * ConvolutionParameteriv and ConvolutionParameterfv, when the {@code pname} parameter is CONVOLUTION_BORDER_MODE. + */ + public static final int GL_REDUCE = 0x8016; + + /** Accepted by the {@code pname} parameter of GetConvolutionParameteriv and GetConvolutionParameterfv. */ + public static final int + GL_CONVOLUTION_FORMAT = 0x8017, + GL_CONVOLUTION_WIDTH = 0x8018, + GL_CONVOLUTION_HEIGHT = 0x8019, + GL_MAX_CONVOLUTION_WIDTH = 0x801A, + GL_MAX_CONVOLUTION_HEIGHT = 0x801B; + + /** + * Accepted by the {@code pname} parameter of PixelTransferi, PixelTransferf, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev. + */ + public static final int + GL_POST_CONVOLUTION_RED_SCALE = 0x801C, + GL_POST_CONVOLUTION_GREEN_SCALE = 0x801D, + GL_POST_CONVOLUTION_BLUE_SCALE = 0x801E, + GL_POST_CONVOLUTION_ALPHA_SCALE = 0x801F, + GL_POST_CONVOLUTION_RED_BIAS = 0x8020, + GL_POST_CONVOLUTION_GREEN_BIAS = 0x8021, + GL_POST_CONVOLUTION_BLUE_BIAS = 0x8022, + GL_POST_CONVOLUTION_ALPHA_BIAS = 0x8023; + + /** + * Accepted by the {@code param} parameter of ConvolutionParameteri, and ConvolutionParameterf, and by the {@code params} parameter of + * ConvolutionParameteriv and ConvolutionParameterfv, when the {@code pname} parameter is CONVOLUTION_BORDER_MODE. + */ + public static final int + GL_CONSTANT_BORDER = 0x8151, + GL_REPLICATE_BORDER = 0x8153; + + /** Accepted by the {@code pname} parameter of ConvolutionParameteriv, ConvolutionParameterfv, GetConvolutionParameteriv, and GetConvolutionParameterfv. */ + public static final int GL_CONVOLUTION_BORDER_COLOR = 0x8154; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_COLOR_MATRIX = 0x80B1, + GL_COLOR_MATRIX_STACK_DEPTH = 0x80B2, + GL_MAX_COLOR_MATRIX_STACK_DEPTH = 0x80B3; + + /** Accepted by the {@code pname} parameter of PixelTransfer*, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_POST_COLOR_MATRIX_RED_SCALE = 0x80B4, + GL_POST_COLOR_MATRIX_GREEN_SCALE = 0x80B5, + GL_POST_COLOR_MATRIX_BLUE_SCALE = 0x80B6, + GL_POST_COLOR_MATRIX_ALPHA_SCALE = 0x80B7, + GL_POST_COLOR_MATRIX_RED_BIAS = 0x80B8, + GL_POST_COLOR_MATRIX_GREEN_BIAS = 0x80B9, + GL_POST_COLOR_MATRIX_BLUE_BIAS = 0x80BA, + GL_POST_COLOR_MATRIX_ALPHA_BIAS = 0x80BB; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of Histogram, ResetHistogram, GetHistogram, GetHistogramParameteriv, and + * GetHistogramParameterfv. + */ + public static final int GL_HISTOGRAM = 0x8024; + + /** Accepted by the {@code target} parameter of Histogram, GetHistogramParameteriv, and GetHistogramParameterfv. */ + public static final int GL_PROXY_HISTOGRAM = 0x8025; + + /** Accepted by the {@code pname} parameter of GetHistogramParameteriv and GetHistogramParameterfv. */ + public static final int + GL_HISTOGRAM_WIDTH = 0x8026, + GL_HISTOGRAM_FORMAT = 0x8027, + GL_HISTOGRAM_RED_SIZE = 0x8028, + GL_HISTOGRAM_GREEN_SIZE = 0x8029, + GL_HISTOGRAM_BLUE_SIZE = 0x802A, + GL_HISTOGRAM_ALPHA_SIZE = 0x802B, + GL_HISTOGRAM_LUMINANCE_SIZE = 0x802C, + GL_HISTOGRAM_SINK = 0x802D; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of Minmax, ResetMinmax, GetMinmax, GetMinmaxParameteriv, and GetMinmaxParameterfv. + */ + public static final int GL_MINMAX = 0x802E; + + /** Accepted by the {@code pname} parameter of GetMinmaxParameteriv and GetMinmaxParameterfv. */ + public static final int + GL_MINMAX_FORMAT = 0x802F, + GL_MINMAX_SINK = 0x8030; + + /** Accepted by the {@code sfactor} and {@code dfactor} parameters of BlendFunc. */ + public static final int + GL_CONSTANT_COLOR = 0x8001, + GL_ONE_MINUS_CONSTANT_COLOR = 0x8002, + GL_CONSTANT_ALPHA = 0x8003, + GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_BLEND_COLOR = 0x8005; + + /** Accepted by the {@code mode} parameter of BlendEquation. */ + public static final int + GL_FUNC_ADD = 0x8006, + GL_MIN = 0x8007, + GL_MAX = 0x8008; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_BLEND_EQUATION = 0x8009; + + /** Accepted by the {@code mode} parameter of BlendEquation. */ + public static final int + GL_FUNC_SUBTRACT = 0x800A, + GL_FUNC_REVERSE_SUBTRACT = 0x800B; + + protected ARBImaging() { + throw new UnsupportedOperationException(); + } + + // --- [ glColorTable ] --- + + /** Unsafe version of: {@link #glColorTable ColorTable} */ + public static native void nglColorTable(int target, int internalformat, int width, int format, int type, long table); + + /** + * Specifies a color lookup table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    {@link #GL_PROXY_COLOR_TABLE PROXY_COLOR_TABLE}{@link #GL_PROXY_POST_CONVOLUTION_COLOR_TABLE PROXY_POST_CONVOLUTION_COLOR_TABLE}{@link #GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE PROXY_POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param internalformat the color table internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param width the color table width + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table the color table data + */ + public static void glColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer table) { + nglColorTable(target, internalformat, width, format, type, memAddress(table)); + } + + /** + * Specifies a color lookup table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    {@link #GL_PROXY_COLOR_TABLE PROXY_COLOR_TABLE}{@link #GL_PROXY_POST_CONVOLUTION_COLOR_TABLE PROXY_POST_CONVOLUTION_COLOR_TABLE}{@link #GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE PROXY_POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param internalformat the color table internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param width the color table width + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table the color table data + */ + public static void glColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long table) { + nglColorTable(target, internalformat, width, format, type, table); + } + + /** + * Specifies a color lookup table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    {@link #GL_PROXY_COLOR_TABLE PROXY_COLOR_TABLE}{@link #GL_PROXY_POST_CONVOLUTION_COLOR_TABLE PROXY_POST_CONVOLUTION_COLOR_TABLE}{@link #GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE PROXY_POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param internalformat the color table internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param width the color table width + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table the color table data + */ + public static void glColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer table) { + nglColorTable(target, internalformat, width, format, type, memAddress(table)); + } + + /** + * Specifies a color lookup table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    {@link #GL_PROXY_COLOR_TABLE PROXY_COLOR_TABLE}{@link #GL_PROXY_POST_CONVOLUTION_COLOR_TABLE PROXY_POST_CONVOLUTION_COLOR_TABLE}{@link #GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE PROXY_POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param internalformat the color table internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param width the color table width + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table the color table data + */ + public static void glColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer table) { + nglColorTable(target, internalformat, width, format, type, memAddress(table)); + } + + /** + * Specifies a color lookup table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    {@link #GL_PROXY_COLOR_TABLE PROXY_COLOR_TABLE}{@link #GL_PROXY_POST_CONVOLUTION_COLOR_TABLE PROXY_POST_CONVOLUTION_COLOR_TABLE}{@link #GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE PROXY_POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param internalformat the color table internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param width the color table width + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table the color table data + */ + public static void glColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer table) { + nglColorTable(target, internalformat, width, format, type, memAddress(table)); + } + + // --- [ glCopyColorTable ] --- + + /** + * Defines a color table in exactly the manner of {@link #glColorTable ColorTable}, except that the image data are taken from the framebuffer rather than from client memory. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param internalformat the color table internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the color table width + */ + public static native void glCopyColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width); + + // --- [ glColorTableParameteriv ] --- + + /** Unsafe version of: {@link #glColorTableParameteriv ColorTableParameteriv} */ + public static native void nglColorTableParameteriv(int target, int pname, long params); + + /** + * Specifies the scale and bias parameters for a color table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param pname the parameter to set. One of:
    {@link #GL_COLOR_TABLE_SCALE COLOR_TABLE_SCALE}{@link #GL_COLOR_TABLE_BIAS COLOR_TABLE_BIAS}
    + * @param params the parameter value + */ + public static void glColorTableParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglColorTableParameteriv(target, pname, memAddress(params)); + } + + // --- [ glColorTableParameterfv ] --- + + /** Unsafe version of: {@link #glColorTableParameterfv ColorTableParameterfv} */ + public static native void nglColorTableParameterfv(int target, int pname, long params); + + /** + * Float version of {@link #glColorTableParameteriv ColorTableParameteriv}. + * + * @param target the color table target + * @param pname the parameter to set + * @param params the parameter value + */ + public static void glColorTableParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglColorTableParameterfv(target, pname, memAddress(params)); + } + + // --- [ glGetColorTable ] --- + + /** Unsafe version of: {@link #glGetColorTable GetColorTable} */ + public static native void nglGetColorTable(int target, int format, int type, long table); + + /** + * Returns the current contents of a color table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table the color table data + */ + public static void glGetColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer table) { + nglGetColorTable(target, format, type, memAddress(table)); + } + + /** + * Returns the current contents of a color table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table the color table data + */ + public static void glGetColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") long table) { + nglGetColorTable(target, format, type, table); + } + + /** + * Returns the current contents of a color table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table the color table data + */ + public static void glGetColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer table) { + nglGetColorTable(target, format, type, memAddress(table)); + } + + /** + * Returns the current contents of a color table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table the color table data + */ + public static void glGetColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer table) { + nglGetColorTable(target, format, type, memAddress(table)); + } + + /** + * Returns the current contents of a color table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table the color table data + */ + public static void glGetColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer table) { + nglGetColorTable(target, format, type, memAddress(table)); + } + + // --- [ glGetColorTableParameteriv ] --- + + /** Unsafe version of: {@link #glGetColorTableParameteriv GetColorTableParameteriv} */ + public static native void nglGetColorTableParameteriv(int target, int pname, long params); + + /** + * Returns the integer value of the specified color table parameter. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    {@link #GL_PROXY_COLOR_TABLE PROXY_COLOR_TABLE}{@link #GL_PROXY_POST_CONVOLUTION_COLOR_TABLE PROXY_POST_CONVOLUTION_COLOR_TABLE}{@link #GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE PROXY_POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param pname the parameter to query. One of:
    {@link #GL_COLOR_TABLE_SCALE COLOR_TABLE_SCALE}{@link #GL_COLOR_TABLE_BIAS COLOR_TABLE_BIAS}{@link #GL_COLOR_TABLE_FORMAT COLOR_TABLE_FORMAT}
    {@link #GL_COLOR_TABLE_WIDTH COLOR_TABLE_WIDTH}{@link #GL_COLOR_TABLE_RED_SIZE COLOR_TABLE_RED_SIZE}{@link #GL_COLOR_TABLE_GREEN_SIZE COLOR_TABLE_GREEN_SIZE}
    {@link #GL_COLOR_TABLE_BLUE_SIZE COLOR_TABLE_BLUE_SIZE}{@link #GL_COLOR_TABLE_ALPHA_SIZE COLOR_TABLE_ALPHA_SIZE}{@link #GL_COLOR_TABLE_LUMINANCE_SIZE COLOR_TABLE_LUMINANCE_SIZE}
    {@link #GL_COLOR_TABLE_INTENSITY_SIZE COLOR_TABLE_INTENSITY_SIZE}
    + * @param params a buffer in which to place the returned value + */ + public static void glGetColorTableParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetColorTableParameteriv(target, pname, memAddress(params)); + } + + /** + * Returns the integer value of the specified color table parameter. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    {@link #GL_PROXY_COLOR_TABLE PROXY_COLOR_TABLE}{@link #GL_PROXY_POST_CONVOLUTION_COLOR_TABLE PROXY_POST_CONVOLUTION_COLOR_TABLE}{@link #GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE PROXY_POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param pname the parameter to query. One of:
    {@link #GL_COLOR_TABLE_SCALE COLOR_TABLE_SCALE}{@link #GL_COLOR_TABLE_BIAS COLOR_TABLE_BIAS}{@link #GL_COLOR_TABLE_FORMAT COLOR_TABLE_FORMAT}
    {@link #GL_COLOR_TABLE_WIDTH COLOR_TABLE_WIDTH}{@link #GL_COLOR_TABLE_RED_SIZE COLOR_TABLE_RED_SIZE}{@link #GL_COLOR_TABLE_GREEN_SIZE COLOR_TABLE_GREEN_SIZE}
    {@link #GL_COLOR_TABLE_BLUE_SIZE COLOR_TABLE_BLUE_SIZE}{@link #GL_COLOR_TABLE_ALPHA_SIZE COLOR_TABLE_ALPHA_SIZE}{@link #GL_COLOR_TABLE_LUMINANCE_SIZE COLOR_TABLE_LUMINANCE_SIZE}
    {@link #GL_COLOR_TABLE_INTENSITY_SIZE COLOR_TABLE_INTENSITY_SIZE}
    + */ + @NativeType("void") + public static int glGetColorTableParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetColorTableParameteriv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetColorTableParameterfv ] --- + + /** Unsafe version of: {@link #glGetColorTableParameterfv GetColorTableParameterfv} */ + public static native void nglGetColorTableParameterfv(int target, int pname, long params); + + /** + * Float version of {@link #glGetColorTableParameteriv GetColorTableParameteriv}. + * + * @param target the color table target + * @param pname the parameter to query + * @param params a buffer in which to place the returned value + */ + public static void glGetColorTableParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetColorTableParameterfv(target, pname, memAddress(params)); + } + + /** + * Float version of {@link #glGetColorTableParameteriv GetColorTableParameteriv}. + * + * @param target the color table target + * @param pname the parameter to query + */ + @NativeType("void") + public static float glGetColorTableParameterf(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetColorTableParameterfv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glColorSubTable ] --- + + /** Unsafe version of: {@link #glColorSubTable ColorSubTable} */ + public static native void nglColorSubTable(int target, int start, int count, int format, int type, long data); + + /** + * Respecifies a portion of an existing color table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param start the starting index of the subregion to respecify + * @param count the number of colors in the subregion to respecify + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param data the color table data + */ + public static void glColorSubTable(@NativeType("GLenum") int target, @NativeType("GLsizei") int start, @NativeType("GLsizei") int count, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer data) { + nglColorSubTable(target, start, count, format, type, memAddress(data)); + } + + /** + * Respecifies a portion of an existing color table. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param start the starting index of the subregion to respecify + * @param count the number of colors in the subregion to respecify + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param data the color table data + */ + public static void glColorSubTable(@NativeType("GLenum") int target, @NativeType("GLsizei") int start, @NativeType("GLsizei") int count, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long data) { + nglColorSubTable(target, start, count, format, type, data); + } + + // --- [ glCopyColorSubTable ] --- + + /** + * Respecifies a portion of an existing color table using image taken from the framebuffer. + * + * @param target the color table target. One of:
    {@link #GL_COLOR_TABLE COLOR_TABLE}{@link #GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link #GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param start the start index of the subregion to respecify + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the number of colors in the subregion to respecify + */ + public static native void glCopyColorSubTable(@NativeType("GLenum") int target, @NativeType("GLsizei") int start, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width); + + // --- [ glConvolutionFilter1D ] --- + + /** Unsafe version of: {@link #glConvolutionFilter1D ConvolutionFilter1D} */ + public static native void nglConvolutionFilter1D(int target, int internalformat, int width, int format, int type, long data); + + /** + * Defines a one-dimensional convolution filter. + * + * @param target the convolution target. Must be:
    {@link #GL_CONVOLUTION_1D CONVOLUTION_1D}
    + * @param internalformat the filter internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param width the filter width + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param data the filter data + */ + public static void glConvolutionFilter1D(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer data) { + nglConvolutionFilter1D(target, internalformat, width, format, type, memAddress(data)); + } + + /** + * Defines a one-dimensional convolution filter. + * + * @param target the convolution target. Must be:
    {@link #GL_CONVOLUTION_1D CONVOLUTION_1D}
    + * @param internalformat the filter internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param width the filter width + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param data the filter data + */ + public static void glConvolutionFilter1D(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long data) { + nglConvolutionFilter1D(target, internalformat, width, format, type, data); + } + + // --- [ glConvolutionFilter2D ] --- + + /** Unsafe version of: {@link #glConvolutionFilter2D ConvolutionFilter2D} */ + public static native void nglConvolutionFilter2D(int target, int internalformat, int width, int height, int format, int type, long data); + + /** + * Defines a two-dimensional convolution filter. + * + * @param target the convolution target. Must be:
    {@link #GL_CONVOLUTION_2D CONVOLUTION_2D}
    + * @param internalformat the filter internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param width the filter width + * @param height the filter height + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param data the filter data + */ + public static void glConvolutionFilter2D(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer data) { + nglConvolutionFilter2D(target, internalformat, width, height, format, type, memAddress(data)); + } + + /** + * Defines a two-dimensional convolution filter. + * + * @param target the convolution target. Must be:
    {@link #GL_CONVOLUTION_2D CONVOLUTION_2D}
    + * @param internalformat the filter internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param width the filter width + * @param height the filter height + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param data the filter data + */ + public static void glConvolutionFilter2D(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long data) { + nglConvolutionFilter2D(target, internalformat, width, height, format, type, data); + } + + // --- [ glCopyConvolutionFilter1D ] --- + + /** + * Defines a one-dimensional filter in exactly the manner of {@link #glConvolutionFilter1D ConvolutionFilter1D}, except that image data are taken from the framebuffer, rather than from + * client memory. + * + * @param target the convolution target. Must be:
    {@link #GL_CONVOLUTION_1D CONVOLUTION_1D}
    + * @param internalformat the filter internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the filter width + */ + public static native void glCopyConvolutionFilter1D(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width); + + // --- [ glCopyConvolutionFilter2D ] --- + + /** + * Defines a two-dimensional filter in exactly the manner of {@link #glConvolutionFilter1D ConvolutionFilter1D}, except that image data are taken from the framebuffer, rather than from + * client memory. + * + * @param target the convolution target. Must be:
    {@link #GL_CONVOLUTION_2D CONVOLUTION_2D}
    + * @param internalformat the filter internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the filter width + * @param height the filter height + */ + public static native void glCopyConvolutionFilter2D(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glGetConvolutionFilter ] --- + + /** Unsafe version of: {@link #glGetConvolutionFilter GetConvolutionFilter} */ + public static native void nglGetConvolutionFilter(int target, int format, int type, long image); + + /** + * Returns the contents of a convolution filter. + * + * @param target the convolution target. One of:
    {@link #GL_CONVOLUTION_1D CONVOLUTION_1D}{@link #GL_CONVOLUTION_2D CONVOLUTION_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param image the filter data + */ + public static void glGetConvolutionFilter(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer image) { + nglGetConvolutionFilter(target, format, type, memAddress(image)); + } + + /** + * Returns the contents of a convolution filter. + * + * @param target the convolution target. One of:
    {@link #GL_CONVOLUTION_1D CONVOLUTION_1D}{@link #GL_CONVOLUTION_2D CONVOLUTION_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param image the filter data + */ + public static void glGetConvolutionFilter(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") long image) { + nglGetConvolutionFilter(target, format, type, image); + } + + // --- [ glSeparableFilter2D ] --- + + /** Unsafe version of: {@link #glSeparableFilter2D SeparableFilter2D} */ + public static native void nglSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, long row, long column); + + /** + * Specifies a two-dimensional separable convolution filter. + * + * @param target the filter target. Must be:
    {@link #GL_SEPARABLE_2D SEPARABLE_2D}
    + * @param internalformat the filter internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param width the filter width + * @param height the filter height + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param row the horizontal filter data + * @param column the vertical filter data + */ + public static void glSeparableFilter2D(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer row, @NativeType("void const *") ByteBuffer column) { + nglSeparableFilter2D(target, internalformat, width, height, format, type, memAddress(row), memAddress(column)); + } + + /** + * Specifies a two-dimensional separable convolution filter. + * + * @param target the filter target. Must be:
    {@link #GL_SEPARABLE_2D SEPARABLE_2D}
    + * @param internalformat the filter internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param width the filter width + * @param height the filter height + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param row the horizontal filter data + * @param column the vertical filter data + */ + public static void glSeparableFilter2D(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long row, @NativeType("void const *") long column) { + nglSeparableFilter2D(target, internalformat, width, height, format, type, row, column); + } + + // --- [ glGetSeparableFilter ] --- + + /** Unsafe version of: {@link #glGetSeparableFilter GetSeparableFilter} */ + public static native void nglGetSeparableFilter(int target, int format, int type, long row, long column, long span); + + /** + * Returns the current contents of a separable convolution filter. + * + * @param target the filter target. Must be:
    {@link #GL_SEPARABLE_2D SEPARABLE_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param row a buffer in which to return the filter row + * @param column a buffer in which to return the filter column + * @param span unused + */ + public static void glGetSeparableFilter(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer row, @NativeType("void *") ByteBuffer column, @Nullable @NativeType("void *") ByteBuffer span) { + nglGetSeparableFilter(target, format, type, memAddress(row), memAddress(column), memAddressSafe(span)); + } + + /** + * Returns the current contents of a separable convolution filter. + * + * @param target the filter target. Must be:
    {@link #GL_SEPARABLE_2D SEPARABLE_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param row a buffer in which to return the filter row + * @param column a buffer in which to return the filter column + * @param span unused + */ + public static void glGetSeparableFilter(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") long row, @NativeType("void *") long column, @Nullable @NativeType("void *") ByteBuffer span) { + nglGetSeparableFilter(target, format, type, row, column, memAddressSafe(span)); + } + + // --- [ glConvolutionParameteri ] --- + + /** + * Specifies the scale and bias of a convolution filter. + * + * @param target the filter target. One of:
    {@link #GL_CONVOLUTION_1D CONVOLUTION_1D}{@link #GL_CONVOLUTION_2D CONVOLUTION_2D}{@link #GL_SEPARABLE_2D SEPARABLE_2D}
    + * @param pname the parameter to set. Must be:
    {@link #GL_CONVOLUTION_BORDER_MODE CONVOLUTION_BORDER_MODE}
    + * @param param the parameter value + */ + public static native void glConvolutionParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glConvolutionParameteriv ] --- + + /** Unsafe version of: {@link #glConvolutionParameteriv ConvolutionParameteriv} */ + public static native void nglConvolutionParameteriv(int target, int pname, long params); + + /** + * Pointer version of {@link #glConvolutionParameteri ConvolutionParameteri}. + * + * @param target the filter target + * @param pname the parameter to set. One of:
    {@link #GL_CONVOLUTION_FILTER_SCALE CONVOLUTION_FILTER_SCALE}{@link #GL_CONVOLUTION_FILTER_BIAS CONVOLUTION_FILTER_BIAS}{@link #GL_CONVOLUTION_BORDER_COLOR CONVOLUTION_BORDER_COLOR}
    + * @param params the parameter value + */ + public static void glConvolutionParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglConvolutionParameteriv(target, pname, memAddress(params)); + } + + // --- [ glConvolutionParameterf ] --- + + /** + * Float version of {@link #glConvolutionParameteri ConvolutionParameteri} + * + * @param target the filter target + * @param pname the parameter to set + * @param param the parameter value + */ + public static native void glConvolutionParameterf(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glConvolutionParameterfv ] --- + + /** Unsafe version of: {@link #glConvolutionParameterfv ConvolutionParameterfv} */ + public static native void nglConvolutionParameterfv(int target, int pname, long params); + + /** + * Pointer version of {@link #glConvolutionParameterf ConvolutionParameterf}. + * + * @param target the filter target + * @param pname the parameter to set. One of:
    {@link #GL_CONVOLUTION_FILTER_SCALE CONVOLUTION_FILTER_SCALE}{@link #GL_CONVOLUTION_FILTER_BIAS CONVOLUTION_FILTER_BIAS}{@link #GL_CONVOLUTION_BORDER_COLOR CONVOLUTION_BORDER_COLOR}
    + * @param params the parameter value + */ + public static void glConvolutionParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglConvolutionParameterfv(target, pname, memAddress(params)); + } + + // --- [ glGetConvolutionParameteriv ] --- + + /** Unsafe version of: {@link #glGetConvolutionParameteriv GetConvolutionParameteriv} */ + public static native void nglGetConvolutionParameteriv(int target, int pname, long params); + + /** + * Returns the value of a convolution filter parameter. + * + * @param target the filter target. One of:
    {@link #GL_CONVOLUTION_1D CONVOLUTION_1D}{@link #GL_CONVOLUTION_2D CONVOLUTION_2D}{@link #GL_SEPARABLE_2D SEPARABLE_2D}
    + * @param pname the parameter to query. One of:
    {@link #GL_CONVOLUTION_FORMAT CONVOLUTION_FORMAT}{@link #GL_CONVOLUTION_WIDTH CONVOLUTION_WIDTH}{@link #GL_CONVOLUTION_HEIGHT CONVOLUTION_HEIGHT}{@link #GL_MAX_CONVOLUTION_WIDTH MAX_CONVOLUTION_WIDTH}
    {@link #GL_MAX_CONVOLUTION_HEIGHT MAX_CONVOLUTION_HEIGHT}
    + * @param params a buffer in which to return the parameter value + */ + public static void glGetConvolutionParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetConvolutionParameteriv(target, pname, memAddress(params)); + } + + /** + * Returns the value of a convolution filter parameter. + * + * @param target the filter target. One of:
    {@link #GL_CONVOLUTION_1D CONVOLUTION_1D}{@link #GL_CONVOLUTION_2D CONVOLUTION_2D}{@link #GL_SEPARABLE_2D SEPARABLE_2D}
    + * @param pname the parameter to query. One of:
    {@link #GL_CONVOLUTION_FORMAT CONVOLUTION_FORMAT}{@link #GL_CONVOLUTION_WIDTH CONVOLUTION_WIDTH}{@link #GL_CONVOLUTION_HEIGHT CONVOLUTION_HEIGHT}{@link #GL_MAX_CONVOLUTION_WIDTH MAX_CONVOLUTION_WIDTH}
    {@link #GL_MAX_CONVOLUTION_HEIGHT MAX_CONVOLUTION_HEIGHT}
    + */ + @NativeType("void") + public static int glGetConvolutionParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetConvolutionParameteriv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetConvolutionParameterfv ] --- + + /** Unsafe version of: {@link #glGetConvolutionParameterfv GetConvolutionParameterfv} */ + public static native void nglGetConvolutionParameterfv(int target, int pname, long params); + + /** + * Float version of {@link #glGetConvolutionParameteriv GetConvolutionParameteriv}. + * + * @param target the filter target + * @param pname the parameter to query + * @param params a buffer in which to return the parameter value + */ + public static void glGetConvolutionParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetConvolutionParameterfv(target, pname, memAddress(params)); + } + + /** + * Float version of {@link #glGetConvolutionParameteriv GetConvolutionParameteriv}. + * + * @param target the filter target + * @param pname the parameter to query + */ + @NativeType("void") + public static float glGetConvolutionParameterf(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetConvolutionParameterfv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glHistogram ] --- + + /** + * Specifies the histogram table. + * + * @param target the histogram target. One of:
    {@link #GL_HISTOGRAM HISTOGRAM}{@link #GL_PROXY_HISTOGRAM PROXY_HISTOGRAM}
    + * @param width the histogram width + * @param internalformat the histogram internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param sink whether pixel groups will be consumed by the histogram operation ({@link GL11#GL_TRUE TRUE}) or passed on to the minmax operation ({@link GL11#GL_FALSE FALSE}) + */ + public static native void glHistogram(@NativeType("GLenum") int target, @NativeType("GLsizei") int width, @NativeType("GLenum") int internalformat, @NativeType("GLboolean") boolean sink); + + // --- [ glResetHistogram ] --- + + /** + * Resets all counters of all elements of the histogram table to zero. + * + * @param target the histogram target. Must be:
    {@link #GL_HISTOGRAM HISTOGRAM}
    + */ + public static native void glResetHistogram(@NativeType("GLenum") int target); + + // --- [ glGetHistogram ] --- + + /** Unsafe version of: {@link #glGetHistogram GetHistogram} */ + public static native void nglGetHistogram(int target, boolean reset, int format, int type, long values); + + /** + * Returns the current contents of the histogram table. + * + * @param target the histogram target. Must be:
    {@link #GL_HISTOGRAM HISTOGRAM}
    + * @param reset if {@link GL11#GL_TRUE TRUE}, then all counters of all elements of the histogram are reset to zero. Counters are reset whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data types. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param values the pixel data + */ + public static void glGetHistogram(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer values) { + nglGetHistogram(target, reset, format, type, memAddress(values)); + } + + /** + * Returns the current contents of the histogram table. + * + * @param target the histogram target. Must be:
    {@link #GL_HISTOGRAM HISTOGRAM}
    + * @param reset if {@link GL11#GL_TRUE TRUE}, then all counters of all elements of the histogram are reset to zero. Counters are reset whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data types. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param values the pixel data + */ + public static void glGetHistogram(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") long values) { + nglGetHistogram(target, reset, format, type, values); + } + + // --- [ glGetHistogramParameteriv ] --- + + /** Unsafe version of: {@link #glGetHistogramParameteriv GetHistogramParameteriv} */ + public static native void nglGetHistogramParameteriv(int target, int pname, long params); + + /** + * Returns the integer values of the specified histogram parameter + * + * @param target the histogram target. Must be:
    {@link #GL_HISTOGRAM HISTOGRAM}
    + * @param pname the parameter to query. One of:
    {@link #GL_HISTOGRAM_WIDTH HISTOGRAM_WIDTH}{@link #GL_HISTOGRAM_FORMAT HISTOGRAM_FORMAT}{@link #GL_HISTOGRAM_RED_SIZE HISTOGRAM_RED_SIZE}{@link #GL_HISTOGRAM_GREEN_SIZE HISTOGRAM_GREEN_SIZE}
    {@link #GL_HISTOGRAM_BLUE_SIZE HISTOGRAM_BLUE_SIZE}{@link #GL_HISTOGRAM_ALPHA_SIZE HISTOGRAM_ALPHA_SIZE}{@link #GL_HISTOGRAM_LUMINANCE_SIZE HISTOGRAM_LUMINANCE_SIZE}{@link #GL_HISTOGRAM_SINK HISTOGRAM_SINK}
    + * @param params a buffer in which to return the parameter values + */ + public static void glGetHistogramParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetHistogramParameteriv(target, pname, memAddress(params)); + } + + /** + * Returns the integer values of the specified histogram parameter + * + * @param target the histogram target. Must be:
    {@link #GL_HISTOGRAM HISTOGRAM}
    + * @param pname the parameter to query. One of:
    {@link #GL_HISTOGRAM_WIDTH HISTOGRAM_WIDTH}{@link #GL_HISTOGRAM_FORMAT HISTOGRAM_FORMAT}{@link #GL_HISTOGRAM_RED_SIZE HISTOGRAM_RED_SIZE}{@link #GL_HISTOGRAM_GREEN_SIZE HISTOGRAM_GREEN_SIZE}
    {@link #GL_HISTOGRAM_BLUE_SIZE HISTOGRAM_BLUE_SIZE}{@link #GL_HISTOGRAM_ALPHA_SIZE HISTOGRAM_ALPHA_SIZE}{@link #GL_HISTOGRAM_LUMINANCE_SIZE HISTOGRAM_LUMINANCE_SIZE}{@link #GL_HISTOGRAM_SINK HISTOGRAM_SINK}
    + */ + @NativeType("void") + public static int glGetHistogramParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetHistogramParameteriv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetHistogramParameterfv ] --- + + /** Unsafe version of: {@link #glGetHistogramParameterfv GetHistogramParameterfv} */ + public static native void nglGetHistogramParameterfv(int target, int pname, long params); + + /** + * Float version of {@link #glGetHistogramParameteriv GetHistogramParameteriv}. + * + * @param target the histogram target + * @param pname the parameter to query + * @param params a buffer in which to place the returned value + */ + public static void glGetHistogramParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetHistogramParameterfv(target, pname, memAddress(params)); + } + + /** + * Float version of {@link #glGetHistogramParameteriv GetHistogramParameteriv}. + * + * @param target the histogram target + * @param pname the parameter to query + */ + @NativeType("void") + public static float glGetHistogramParameterf(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetHistogramParameterfv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glMinmax ] --- + + /** + * Specifies the minmax table. + * + * @param target the minmax target. Must be:
    {@link #GL_MINMAX MINMAX}
    + * @param internalformat the minmax table internal format. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}{@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}
    {@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}
    {@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_LUMINANCE LUMINANCE}
    {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}{@link GL11#GL_INTENSITY INTENSITY}{@link GL11#GL_ALPHA4 ALPHA4}{@link GL11#GL_ALPHA8 ALPHA8}{@link GL11#GL_ALPHA12 ALPHA12}{@link GL11#GL_ALPHA16 ALPHA16}{@link GL11#GL_LUMINANCE4 LUMINANCE4}{@link GL11#GL_LUMINANCE8 LUMINANCE8}
    {@link GL11#GL_LUMINANCE12 LUMINANCE12}{@link GL11#GL_LUMINANCE16 LUMINANCE16}{@link GL11#GL_LUMINANCE4_ALPHA4 LUMINANCE4_ALPHA4}{@link GL11#GL_LUMINANCE6_ALPHA2 LUMINANCE6_ALPHA2}{@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}{@link GL11#GL_LUMINANCE12_ALPHA4 LUMINANCE12_ALPHA4}{@link GL11#GL_LUMINANCE12_ALPHA12 LUMINANCE12_ALPHA12}{@link GL11#GL_LUMINANCE16_ALPHA16 LUMINANCE16_ALPHA16}
    {@link GL11#GL_INTENSITY4 INTENSITY4}{@link GL11#GL_INTENSITY8 INTENSITY8}{@link GL11#GL_INTENSITY12 INTENSITY12}{@link GL11#GL_INTENSITY16 INTENSITY16}{@link GL21#GL_SLUMINANCE SLUMINANCE}{@link GL21#GL_SLUMINANCE8_ALPHA8 SLUMINANCE8_ALPHA8}
    + * @param sink whether pixel groups will be consumed by the minmax operation ({@link GL11#GL_TRUE TRUE}) or passed on to final conversion ({@link GL11#GL_FALSE FALSE}) + */ + public static native void glMinmax(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLboolean") boolean sink); + + // --- [ glResetMinmax ] --- + + /** + * Resets all minimum and maximum values of {@code target} to to their maximum and minimum representable values, respectively. + * + * @param target the minmax target. Must be:
    {@link #GL_MINMAX MINMAX}
    + */ + public static native void glResetMinmax(@NativeType("GLenum") int target); + + // --- [ glGetMinmax ] --- + + /** Unsafe version of: {@link #glGetMinmax GetMinmax} */ + public static native void nglGetMinmax(int target, boolean reset, int format, int type, long values); + + /** + * Returns the current contents of the minmax table. + * + * @param target the minmax target. Must be:
    {@link #GL_MINMAX MINMAX}
    + * @param reset If {@link GL11#GL_TRUE TRUE}, then each minimum value is reset to the maximum representable value, and each maximum value is reset to the minimum + * representable value. All values are reset, whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param values a buffer in which to place the minmax values + */ + public static void glGetMinmax(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer values) { + nglGetMinmax(target, reset, format, type, memAddress(values)); + } + + /** + * Returns the current contents of the minmax table. + * + * @param target the minmax target. Must be:
    {@link #GL_MINMAX MINMAX}
    + * @param reset If {@link GL11#GL_TRUE TRUE}, then each minimum value is reset to the maximum representable value, and each maximum value is reset to the minimum + * representable value. All values are reset, whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param values a buffer in which to place the minmax values + */ + public static void glGetMinmax(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") long values) { + nglGetMinmax(target, reset, format, type, values); + } + + // --- [ glGetMinmaxParameteriv ] --- + + /** Unsafe version of: {@link #glGetMinmaxParameteriv GetMinmaxParameteriv} */ + public static native void nglGetMinmaxParameteriv(int target, int pname, long params); + + /** + * Returns the integer value of the specified minmax parameter. + * + * @param target the minmax target. Must be:
    {@link #GL_MINMAX MINMAX}
    + * @param pname the parameter to query + * @param params a buffer in which to place the returned value + */ + public static void glGetMinmaxParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMinmaxParameteriv(target, pname, memAddress(params)); + } + + /** + * Returns the integer value of the specified minmax parameter. + * + * @param target the minmax target. Must be:
    {@link #GL_MINMAX MINMAX}
    + * @param pname the parameter to query + */ + @NativeType("void") + public static int glGetMinmaxParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetMinmaxParameteriv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMinmaxParameterfv ] --- + + /** Unsafe version of: {@link #glGetMinmaxParameterfv GetMinmaxParameterfv} */ + public static native void nglGetMinmaxParameterfv(int target, int pname, long params); + + /** + * Float version of {@link #glGetMinmaxParameteriv GetMinmaxParameteriv}. + * + * @param target the minmax target. Must be:
    {@link #GL_MINMAX MINMAX}
    + * @param pname the parameter to query + * @param params a buffer in which to place the returned value + */ + public static void glGetMinmaxParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMinmaxParameterfv(target, pname, memAddress(params)); + } + + /** + * Float version of {@link #glGetMinmaxParameteriv GetMinmaxParameteriv}. + * + * @param target the minmax target. Must be:
    {@link #GL_MINMAX MINMAX}
    + * @param pname the parameter to query + */ + @NativeType("void") + public static float glGetMinmaxParameterf(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetMinmaxParameterfv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glBlendColor ] --- + + /** + * Specifies the constant color Cc to be used in blending. + * + * @param red the red color component + * @param green the green color component + * @param blue the blue color component + * @param alpha the alpha color component + */ + public static void glBlendColor(@NativeType("GLfloat") float red, @NativeType("GLfloat") float green, @NativeType("GLfloat") float blue, @NativeType("GLfloat") float alpha) { + GL14C.glBlendColor(red, green, blue, alpha); + } + + // --- [ glBlendEquation ] --- + + /** + * Controls the blend equations used for per-fragment blending. + * + * @param mode the blend equation. One of:
    {@link GL14C#GL_FUNC_ADD FUNC_ADD}{@link GL14C#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14C#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14C#GL_MIN MIN}{@link GL14C#GL_MAX MAX}
    + */ + public static void glBlendEquation(@NativeType("GLenum") int mode) { + GL14C.glBlendEquation(mode); + } + + /** Array version of: {@link #glColorTable ColorTable} */ + public static void glColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] table) { + long __functionAddress = GL.getICD().glColorTable; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, internalformat, width, format, type, table, __functionAddress); + } + + /** Array version of: {@link #glColorTable ColorTable} */ + public static void glColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] table) { + long __functionAddress = GL.getICD().glColorTable; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, internalformat, width, format, type, table, __functionAddress); + } + + /** Array version of: {@link #glColorTable ColorTable} */ + public static void glColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] table) { + long __functionAddress = GL.getICD().glColorTable; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, internalformat, width, format, type, table, __functionAddress); + } + + /** Array version of: {@link #glColorTableParameteriv ColorTableParameteriv} */ + public static void glColorTableParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glColorTableParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glColorTableParameterfv ColorTableParameterfv} */ + public static void glColorTableParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glColorTableParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetColorTable GetColorTable} */ + public static void glGetColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] table) { + long __functionAddress = GL.getICD().glGetColorTable; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, format, type, table, __functionAddress); + } + + /** Array version of: {@link #glGetColorTable GetColorTable} */ + public static void glGetColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] table) { + long __functionAddress = GL.getICD().glGetColorTable; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, format, type, table, __functionAddress); + } + + /** Array version of: {@link #glGetColorTable GetColorTable} */ + public static void glGetColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] table) { + long __functionAddress = GL.getICD().glGetColorTable; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, format, type, table, __functionAddress); + } + + /** Array version of: {@link #glGetColorTableParameteriv GetColorTableParameteriv} */ + public static void glGetColorTableParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetColorTableParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetColorTableParameterfv GetColorTableParameterfv} */ + public static void glGetColorTableParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetColorTableParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glConvolutionParameteriv ConvolutionParameteriv} */ + public static void glConvolutionParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glConvolutionParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glConvolutionParameterfv ConvolutionParameterfv} */ + public static void glConvolutionParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glConvolutionParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetConvolutionParameteriv GetConvolutionParameteriv} */ + public static void glGetConvolutionParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetConvolutionParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetConvolutionParameterfv GetConvolutionParameterfv} */ + public static void glGetConvolutionParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetConvolutionParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetHistogramParameteriv GetHistogramParameteriv} */ + public static void glGetHistogramParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetHistogramParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetHistogramParameterfv GetHistogramParameterfv} */ + public static void glGetHistogramParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetHistogramParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMinmaxParameteriv GetMinmaxParameteriv} */ + public static void glGetMinmaxParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetMinmaxParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMinmaxParameterfv GetMinmaxParameterfv} */ + public static void glGetMinmaxParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetMinmaxParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBIndirectParameters.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBIndirectParameters.java new file mode 100644 index 000000000..277418e82 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBIndirectParameters.java @@ -0,0 +1,190 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_indirect_parameters extension. + * + *

    OpenGL 4.3 (with the introduction of the {@link ARBMultiDrawIndirect ARB_multi_draw_indirect} extension) enhanced the ability of OpenGL to allow a large sets of parameters + * for indirect draws (introduced with OpenGL 4.0) into a buffer object and dispatch the entire list with one API call. This allows, for example, a shader + * (such as a compute shader via shader storage buffers, or a geometry shader via transform feedback) to produce lists of draw commands that can then be + * consumed by OpenGL without a server-client round trip. However, when a variable and potentially unknown number of draws are produced by such a shader, + * it becomes difficult to know how many draws are in the output array(s). Applications must resort to techniques such as transform feedback primitive + * queries, or mapping buffers containing the content of atomic counters, which can cause stalls or bubbles in the OpenGL pipeline.

    + * + *

    This extension introduces the concept of the "parameter buffer", which is a target allowing buffers to store parameters for certain drawing commands. + * Also in this extension, new variants of {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect} and {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect} are introduced that source some of their + * parameters from this buffer. Further commands could potentially be introduced that source other parameters from a buffer.

    + * + *

    Requires {@link GL42 OpenGL 4.2}.

    + */ +public class ARBIndirectParameters { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, + * MapBufferRange, FlushMappedBufferRange, GetBufferParameteriv, and CopyBufferSubData. + */ + public static final int GL_PARAMETER_BUFFER_ARB = 0x80EE; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int GL_PARAMETER_BUFFER_BINDING_ARB = 0x80EF; + + protected ARBIndirectParameters() { + throw new UnsupportedOperationException(); + } + + // --- [ glMultiDrawArraysIndirectCountARB ] --- + + /** Unsafe version of: {@link #glMultiDrawArraysIndirectCountARB MultiDrawArraysIndirectCountARB} */ + public static native void nglMultiDrawArraysIndirectCountARB(int mode, long indirect, long drawcount, int maxdrawcount, int stride); + + /** + * Behaves similarly to {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, an implementation stop processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawArraysIndirectCountARB(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, maxdrawcount * (stride == 0 ? (4 * 4) : stride)); + } + nglMultiDrawArraysIndirectCountARB(mode, memAddress(indirect), drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, an implementation stop processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawArraysIndirectCountARB(@NativeType("GLenum") int mode, @NativeType("void const *") long indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + nglMultiDrawArraysIndirectCountARB(mode, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, an implementation stop processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawArraysIndirectCountARB(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, (maxdrawcount * (stride == 0 ? (4 * 4) : stride)) >> 2); + } + nglMultiDrawArraysIndirectCountARB(mode, memAddress(indirect), drawcount, maxdrawcount, stride); + } + + // --- [ glMultiDrawElementsIndirectCountARB ] --- + + /** Unsafe version of: {@link #glMultiDrawElementsIndirectCountARB MultiDrawElementsIndirectCountARB} */ + public static native void nglMultiDrawElementsIndirectCountARB(int mode, int type, long indirect, long drawcount, int maxdrawcount, int stride); + + /** + * Behaves similarly to {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, an implementation stop processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawElementsIndirectCountARB(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, maxdrawcount * (stride == 0 ? (5 * 4) : stride)); + } + nglMultiDrawElementsIndirectCountARB(mode, type, memAddress(indirect), drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, an implementation stop processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawElementsIndirectCountARB(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") long indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + nglMultiDrawElementsIndirectCountARB(mode, type, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, an implementation stop processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawElementsIndirectCountARB(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, (maxdrawcount * (stride == 0 ? (5 * 4) : stride)) >> 2); + } + nglMultiDrawElementsIndirectCountARB(mode, type, memAddress(indirect), drawcount, maxdrawcount, stride); + } + + /** Array version of: {@link #glMultiDrawArraysIndirectCountARB MultiDrawArraysIndirectCountARB} */ + public static void glMultiDrawArraysIndirectCountARB(@NativeType("GLenum") int mode, @NativeType("void const *") int[] indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + long __functionAddress = GL.getICD().glMultiDrawArraysIndirectCountARB; + if (CHECKS) { + check(__functionAddress); + check(indirect, (maxdrawcount * (stride == 0 ? (4 * 4) : stride)) >> 2); + } + callPPV(mode, indirect, drawcount, maxdrawcount, stride, __functionAddress); + } + + /** Array version of: {@link #glMultiDrawElementsIndirectCountARB MultiDrawElementsIndirectCountARB} */ + public static void glMultiDrawElementsIndirectCountARB(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") int[] indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + long __functionAddress = GL.getICD().glMultiDrawElementsIndirectCountARB; + if (CHECKS) { + check(__functionAddress); + check(indirect, (maxdrawcount * (stride == 0 ? (5 * 4) : stride)) >> 2); + } + callPPV(mode, type, indirect, drawcount, maxdrawcount, stride, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInstancedArrays.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInstancedArrays.java new file mode 100644 index 000000000..ac4065d08 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInstancedArrays.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_instanced_arrays extension. + * + *

    A common use case in GL for some applications is to be able to draw the same object, or groups of similar objects that share vertex data, primitive + * count and type, multiple times. This extension provides a means of accelerating such use cases while restricting the number of API calls, and keeping + * the amount of duplicate data to a minimum.

    + * + *

    In particular, this extension specifies an alternative to the read-only shader variable introduced by ARB_draw_instanced. It uses the same draw calls + * introduced by that extension, but redefines them so that a vertex shader can instead use vertex array attributes as a source of instance data.

    + * + *

    This extension introduces an array "divisor" for generic vertex array attributes, which when non-zero specifies that the attribute is "instanced". An + * instanced attribute does not advance per-vertex as usual, but rather after every {@code divisor} conceptual draw calls.

    + * + *

    (Attributes which aren't instanced are repeated in their entirety for every conceptual draw call.)

    + * + *

    By specifying transform data in an instanced attribute or series of instanced attributes, vertex shaders can, in concert with the instancing draw calls, + * draw multiple instances of an object with one draw call.

    + * + *

    Promoted to core in {@link GL33 OpenGL 3.3}.

    + */ +public class ARBInstancedArrays { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameters of GetVertexAttribdv, GetVertexAttribfv, and GetVertexAttribiv. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB = 0x88FE; + + protected ARBInstancedArrays() { + throw new UnsupportedOperationException(); + } + + // --- [ glVertexAttribDivisorARB ] --- + + /** + * Modifies the rate at which generic vertex attributes advance when rendering multiple instances of primitives in a single draw call. If {@code divisor} + * is zero, the attribute at slot {@code index} advances once per vertex. If {@code divisor} is non-zero, the attribute advances once per {@code divisor} + * instances of the set(s) of vertices being rendered. An attribute is referred to as {@code instanced} if its {@code divisor} value is non-zero. + * + * @param index the attribute index + * @param divisor the divisor value + */ + public static native void glVertexAttribDivisorARB(@NativeType("GLuint") int index, @NativeType("GLuint") int divisor); + + // --- [ glVertexArrayVertexAttribDivisorEXT ] --- + + /** + * {@link EXTDirectStateAccess EXT_direct_state_access} version of {@link #glVertexAttribDivisorARB VertexAttribDivisorARB}. + * + *

    This function was added to the extension specification in July 2013. Implemenations are allowed to expose ARB_instanced_arrays without providing this + * function. The correct way to test its availability is:

    + * + *
    
    +     * GLCapabilities caps = GL.getCapabilities();
    +     * if (caps.GL_ARB_instanced_arrays && ARBInstancedArrays.getInstance().VertexArrayVertexAttribDivisorEXT != NULL) {
    +     *     glVertexArrayVertexAttribDivisorEXT(...); // the DSA function can now be used
    +     * }
    + * + * @param vaobj the vertex array object + * @param index the attribute index + * @param divisor the divisor value + */ + public static native void glVertexArrayVertexAttribDivisorEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLuint") int divisor); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInternalformatQuery.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInternalformatQuery.java new file mode 100644 index 000000000..f764effe8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInternalformatQuery.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_internalformat_query extension. + * + *

    OpenGL 4.1 has a number of queries to indicate the maximum number of samples available for different formats. These give a coarse-grained query + * mechanism e.g. an implementation can expose different sample counts for integer and floating-point formats, but not for different floating-point + * formats. There is also no convenient way for the user to determine the granularity of sample counts available, only the maximum.

    + * + *

    This extension adds a query mechanism that allows the user to determine which sample counts are available for a specific internal format.

    + * + *

    Requires {@link GL30 OpenGL 3.0} or {@link ARBFramebufferObject ARB_framebuffer_object}. Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ +public class ARBInternalformatQuery { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetInternalformativ. */ + public static final int GL_NUM_SAMPLE_COUNTS = 0x9380; + + protected ARBInternalformatQuery() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetInternalformativ ] --- + + /** + * Unsafe version of: {@link #glGetInternalformativ GetInternalformativ} + * + * @param bufSize the maximum number of values that may be written to params by the function + */ + public static void nglGetInternalformativ(int target, int internalformat, int pname, int bufSize, long params) { + GL42C.nglGetInternalformativ(target, internalformat, pname, bufSize, params); + } + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + * @param params a variable into which to write the retrieved information + */ + public static void glGetInternalformativ(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL42C.glGetInternalformativ(target, internalformat, pname, params); + } + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + */ + @NativeType("void") + public static int glGetInternalformati(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname) { + return GL42C.glGetInternalformati(target, internalformat, pname); + } + + /** Array version of: {@link #glGetInternalformativ GetInternalformativ} */ + public static void glGetInternalformativ(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL42C.glGetInternalformativ(target, internalformat, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInternalformatQuery2.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInternalformatQuery2.java new file mode 100644 index 000000000..00e2a163b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInternalformatQuery2.java @@ -0,0 +1,219 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_internalformat_query2 extension. + * + *

    This extension extends the {@link ARBInternalformatQuery#glGetInternalformativ GetInternalformativ} query that was added in the {@link ARBInternalformatQuery ARB_internalformat_query} extension to + * provide applications with more granular per-format capability information.

    + * + *

    This extension allows the remainder of the texture-style targets to be specified along with any possible internal format. We add queries for additional + * properties supported for an internal format in addition to the multisample-related information that was added in ARB_internalformat_query.

    + * + *

    The goals of this extension are to:

    + * + *
      + *
    1. provide a mechanism for implementations to declare support *above* the minimum required by the specification
    2. + *
    3. provide API to allow universally constant information to be queried
    4. + *
    5. provide a user-friendly way of finding out about version- or implementation-specific limitations.
    6. + *
    + * + *

    While much of this information can be determined for a single GL version by careful examination of the specification, support for many of these + * properties has been gradually introduced over a number of API revisions. This can observed when considering the range in functionality between the + * various versions of GL 2, 3, and 4, as well as GL ES 2 and 3.

    + * + *

    In the case of an application which wishes to be scalable and able to run on a variety of possible GL or GL ES versions without being specifically + * tailored for each version, it must either have knowledge of the specifications built up into either the code or tables, or it must do a number of tests + * on startup to determine which capabilities are present.

    + * + *

    In OpenGL, other than the course-grained extension mechanism, many limitations of, or limited support for, an internalformat can only be signaled by + * failing an operation or by operating at reduced performance. Thus, such tests often involve attempts to create resources, using them in specific ways + * and benchmarking the operations to find out if it is supported in the desired form, and at a required performance level. The extension provides a way + * for these properties and caveats to be directly queried from the implementation.

    + * + *

    This extension is NOT intended to allow implementations to only support a subset of features that are required by a specific GL version, nor is it + * intended to replace the proper use of extension checks for optional functionality.

    + * + *

    Requires {@link GL20 OpenGL 2.0} and {@link ARBInternalformatQuery ARB_internalformat_query}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBInternalformatQuery2 { + + static { GL.initialize(); } + + /** Accepted by the {@code target} parameter of GetInternalformativ and GetInternalformati64v. */ + public static final int + GL_TEXTURE_1D = 0xDE0, + GL_TEXTURE_1D_ARRAY = 0x8C18, + GL_TEXTURE_2D = 0xDE1, + GL_TEXTURE_2D_ARRAY = 0x8C1A, + GL_TEXTURE_3D = 0x806F, + GL_TEXTURE_CUBE_MAP = 0x8513, + GL_TEXTURE_CUBE_MAP_ARRAY = 0x9009, + GL_TEXTURE_RECTANGLE = 0x84F5, + GL_TEXTURE_BUFFER = 0x8C2A, + GL_RENDERBUFFER = 0x8D41, + GL_TEXTURE_2D_MULTISAMPLE = 0x9100, + GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** Accepted by the {@code pname} parameter of GetInternalformativ and GetInternalformati64v. */ + public static final int + GL_SAMPLES = 0x80A9, + GL_NUM_SAMPLE_COUNTS = 0x9380, + GL_INTERNALFORMAT_SUPPORTED = 0x826F, + GL_INTERNALFORMAT_PREFERRED = 0x8270, + GL_INTERNALFORMAT_RED_SIZE = 0x8271, + GL_INTERNALFORMAT_GREEN_SIZE = 0x8272, + GL_INTERNALFORMAT_BLUE_SIZE = 0x8273, + GL_INTERNALFORMAT_ALPHA_SIZE = 0x8274, + GL_INTERNALFORMAT_DEPTH_SIZE = 0x8275, + GL_INTERNALFORMAT_STENCIL_SIZE = 0x8276, + GL_INTERNALFORMAT_SHARED_SIZE = 0x8277, + GL_INTERNALFORMAT_RED_TYPE = 0x8278, + GL_INTERNALFORMAT_GREEN_TYPE = 0x8279, + GL_INTERNALFORMAT_BLUE_TYPE = 0x827A, + GL_INTERNALFORMAT_ALPHA_TYPE = 0x827B, + GL_INTERNALFORMAT_DEPTH_TYPE = 0x827C, + GL_INTERNALFORMAT_STENCIL_TYPE = 0x827D, + GL_MAX_WIDTH = 0x827E, + GL_MAX_HEIGHT = 0x827F, + GL_MAX_DEPTH = 0x8280, + GL_MAX_LAYERS = 0x8281, + GL_MAX_COMBINED_DIMENSIONS = 0x8282, + GL_COLOR_COMPONENTS = 0x8283, + GL_DEPTH_COMPONENTS = 0x8284, + GL_STENCIL_COMPONENTS = 0x8285, + GL_COLOR_RENDERABLE = 0x8286, + GL_DEPTH_RENDERABLE = 0x8287, + GL_STENCIL_RENDERABLE = 0x8288, + GL_FRAMEBUFFER_RENDERABLE = 0x8289, + GL_FRAMEBUFFER_RENDERABLE_LAYERED = 0x828A, + GL_FRAMEBUFFER_BLEND = 0x828B, + GL_READ_PIXELS = 0x828C, + GL_READ_PIXELS_FORMAT = 0x828D, + GL_READ_PIXELS_TYPE = 0x828E, + GL_TEXTURE_IMAGE_FORMAT = 0x828F, + GL_TEXTURE_IMAGE_TYPE = 0x8290, + GL_GET_TEXTURE_IMAGE_FORMAT = 0x8291, + GL_GET_TEXTURE_IMAGE_TYPE = 0x8292, + GL_MIPMAP = 0x8293, + GL_MANUAL_GENERATE_MIPMAP = 0x8294, + GL_AUTO_GENERATE_MIPMAP = 0x8295, + GL_COLOR_ENCODING = 0x8296, + GL_SRGB_READ = 0x8297, + GL_SRGB_WRITE = 0x8298, + GL_SRGB_DECODE_ARB = 0x8299, + GL_FILTER = 0x829A, + GL_VERTEX_TEXTURE = 0x829B, + GL_TESS_CONTROL_TEXTURE = 0x829C, + GL_TESS_EVALUATION_TEXTURE = 0x829D, + GL_GEOMETRY_TEXTURE = 0x829E, + GL_FRAGMENT_TEXTURE = 0x829F, + GL_COMPUTE_TEXTURE = 0x82A0, + GL_TEXTURE_SHADOW = 0x82A1, + GL_TEXTURE_GATHER = 0x82A2, + GL_TEXTURE_GATHER_SHADOW = 0x82A3, + GL_SHADER_IMAGE_LOAD = 0x82A4, + GL_SHADER_IMAGE_STORE = 0x82A5, + GL_SHADER_IMAGE_ATOMIC = 0x82A6, + GL_IMAGE_TEXEL_SIZE = 0x82A7, + GL_IMAGE_COMPATIBILITY_CLASS = 0x82A8, + GL_IMAGE_PIXEL_FORMAT = 0x82A9, + GL_IMAGE_PIXEL_TYPE = 0x82AA, + GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST = 0x82AC, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST = 0x82AD, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE = 0x82AE, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE = 0x82AF, + GL_TEXTURE_COMPRESSED = 0x86A1, + GL_TEXTURE_COMPRESSED_BLOCK_WIDTH = 0x82B1, + GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT = 0x82B2, + GL_TEXTURE_COMPRESSED_BLOCK_SIZE = 0x82B3, + GL_CLEAR_BUFFER = 0x82B4, + GL_TEXTURE_VIEW = 0x82B5, + GL_VIEW_COMPATIBILITY_CLASS = 0x82B6; + + /** Returned as possible responses for various {@code pname} queries to GetInternalformativ and GetInternalformati64v. */ + public static final int + GL_FULL_SUPPORT = 0x82B7, + GL_CAVEAT_SUPPORT = 0x82B8, + GL_IMAGE_CLASS_4_X_32 = 0x82B9, + GL_IMAGE_CLASS_2_X_32 = 0x82BA, + GL_IMAGE_CLASS_1_X_32 = 0x82BB, + GL_IMAGE_CLASS_4_X_16 = 0x82BC, + GL_IMAGE_CLASS_2_X_16 = 0x82BD, + GL_IMAGE_CLASS_1_X_16 = 0x82BE, + GL_IMAGE_CLASS_4_X_8 = 0x82BF, + GL_IMAGE_CLASS_2_X_8 = 0x82C0, + GL_IMAGE_CLASS_1_X_8 = 0x82C1, + GL_IMAGE_CLASS_11_11_10 = 0x82C2, + GL_IMAGE_CLASS_10_10_10_2 = 0x82C3, + GL_VIEW_CLASS_128_BITS = 0x82C4, + GL_VIEW_CLASS_96_BITS = 0x82C5, + GL_VIEW_CLASS_64_BITS = 0x82C6, + GL_VIEW_CLASS_48_BITS = 0x82C7, + GL_VIEW_CLASS_32_BITS = 0x82C8, + GL_VIEW_CLASS_24_BITS = 0x82C9, + GL_VIEW_CLASS_16_BITS = 0x82CA, + GL_VIEW_CLASS_8_BITS = 0x82CB, + GL_VIEW_CLASS_S3TC_DXT1_RGB = 0x82CC, + GL_VIEW_CLASS_S3TC_DXT1_RGBA = 0x82CD, + GL_VIEW_CLASS_S3TC_DXT3_RGBA = 0x82CE, + GL_VIEW_CLASS_S3TC_DXT5_RGBA = 0x82CF, + GL_VIEW_CLASS_RGTC1_RED = 0x82D0, + GL_VIEW_CLASS_RGTC2_RG = 0x82D1, + GL_VIEW_CLASS_BPTC_UNORM = 0x82D2, + GL_VIEW_CLASS_BPTC_FLOAT = 0x82D3; + + protected ARBInternalformatQuery2() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetInternalformati64v ] --- + + /** + * Unsafe version of: {@link #glGetInternalformati64v GetInternalformati64v} + * + * @param bufSize the maximum number of values that may be written to params by the function + */ + public static void nglGetInternalformati64v(int target, int internalformat, int pname, int bufSize, long params) { + GL43C.nglGetInternalformati64v(target, internalformat, pname, bufSize, params); + } + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + * @param params a variable into which to write the retrieved information + */ + public static void glGetInternalformati64v(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + GL43C.glGetInternalformati64v(target, internalformat, pname, params); + } + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + */ + @NativeType("void") + public static long glGetInternalformati64(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname) { + return GL43C.glGetInternalformati64(target, internalformat, pname); + } + + /** Array version of: {@link #glGetInternalformati64v GetInternalformati64v} */ + public static void glGetInternalformati64v(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + GL43C.glGetInternalformati64v(target, internalformat, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInvalidateSubdata.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInvalidateSubdata.java new file mode 100644 index 000000000..c68e9f205 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBInvalidateSubdata.java @@ -0,0 +1,185 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_invalidate_subdata extension. + * + *

    This extension adds a mechanism for an application to tell the GL that the previous contents of a subregion of an image or a range of a buffer may be + * invalidated.

    + * + *

    GL implementations often include several memory spaces, each with distinct performance characteristics, and the implementations transparently move + * allocations between memory spaces. With this extension, an application can tell the GL that the contents of a texture or buffer are no longer needed, + * and the implementation can avoid transferring the data unnecessarily.

    + * + *

    Examples of when this may be useful include:

    + * + *
      + *
    1. invalidating a multisample texture after resolving it into a non-multisample texture.
    2. + *
    3. invalidating depth/stencil buffers after using them to generate a color buffer.
    4. + *
    5. invalidating a subregion of a framebuffer rather than clearing it before rendering to it, when the whole subregion will be overwritten.
    6. + *
    7. invalidating dynamically generated data (e.g. textures written by FBO rendering or CopyTexSubImage, buffers written by transform feedback, etc.) + * after it is no longer needed but before the end of the frame.
    8. + *
    + * + *

    It is expected that the situations in which the GL will take advantage of this knowledge and achieve increased performance as a result of its use will + * be implementation-dependent. The first three examples may show benefit on tiled renderers where some data won't need to be copied into or out of on-chip + * memory. The fourth example may show a benefit in multi-GPU systems where some data won't need to be copied between GPUs.

    + * + *

    This extension is a superset of the EXT_discard_framebuffer extension with the following additions:

    + * + *
      + *
    • The parameters to InvalidateFramebufferEXT are extended for MRT support and Desktop-GL-only buffer enums.
    • + *
    • New functions to invalidate a region of a texture image or buffer object data store.
    • + *
    + * + *

    Requires {@link GL20 OpenGL 2.0}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBInvalidateSubdata { + + static { GL.initialize(); } + + protected ARBInvalidateSubdata() { + throw new UnsupportedOperationException(); + } + + // --- [ glInvalidateTexSubImage ] --- + + /** + * Invalidates a region of a texture image. + * + * @param texture the name of a texture object a subregion of which to invalidate + * @param level the level of detail of the texture object within which the region resides + * @param xoffset the X offset of the region to be invalidated + * @param yoffset the Y offset of the region to be invalidated + * @param zoffset the Z offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + * @param depth the depth of the region to be invalidated + */ + public static void glInvalidateTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth) { + GL43C.glInvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth); + } + + // --- [ glInvalidateTexImage ] --- + + /** + * Invalidates the entirety of a texture image. + * + * @param texture the name of a texture object to invalidate + * @param level the level of detail of the texture object to invalidate + */ + public static void glInvalidateTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level) { + GL43C.glInvalidateTexImage(texture, level); + } + + // --- [ glInvalidateBufferSubData ] --- + + /** + * Invalidates a region of a buffer object's data store. + * + * @param buffer the name of a buffer object, a subrange of whose data store to invalidate + * @param offset the offset within the buffer's data store of the start of the range to be invalidated + * @param length the length of the range within the buffer's data store to be invalidated + */ + public static void glInvalidateBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length) { + GL43C.glInvalidateBufferSubData(buffer, offset, length); + } + + // --- [ glInvalidateBufferData ] --- + + /** + * Invalidates the content of a buffer object's data store. + * + * @param buffer the name of a buffer object whose data store to invalidate + */ + public static void glInvalidateBufferData(@NativeType("GLuint") int buffer) { + GL43C.glInvalidateBufferData(buffer); + } + + // --- [ glInvalidateFramebuffer ] --- + + /** + * Unsafe version of: {@link #glInvalidateFramebuffer InvalidateFramebuffer} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static void nglInvalidateFramebuffer(int target, int numAttachments, long attachments) { + GL43C.nglInvalidateFramebuffer(target, numAttachments, attachments); + } + + /** + * Invalidate the content some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * @param attachments the address of an array identifying the attachments to be invalidated + */ + public static void glInvalidateFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") IntBuffer attachments) { + GL43C.glInvalidateFramebuffer(target, attachments); + } + + /** + * Invalidate the content some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + */ + public static void glInvalidateFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int attachment) { + GL43C.glInvalidateFramebuffer(target, attachment); + } + + // --- [ glInvalidateSubFramebuffer ] --- + + /** + * Unsafe version of: {@link #glInvalidateSubFramebuffer InvalidateSubFramebuffer} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static void nglInvalidateSubFramebuffer(int target, int numAttachments, long attachments, int x, int y, int width, int height) { + GL43C.nglInvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height); + } + + /** + * Invalidates the content of a region of some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * @param attachments an array identifying the attachments to be invalidated + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + */ + public static void glInvalidateSubFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") IntBuffer attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL43C.glInvalidateSubFramebuffer(target, attachments, x, y, width, height); + } + + /** + * Invalidates the content of a region of some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + */ + public static void glInvalidateSubFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int attachment, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL43C.glInvalidateSubFramebuffer(target, attachment, x, y, width, height); + } + + /** Array version of: {@link #glInvalidateFramebuffer InvalidateFramebuffer} */ + public static void glInvalidateFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int[] attachments) { + GL43C.glInvalidateFramebuffer(target, attachments); + } + + /** Array version of: {@link #glInvalidateSubFramebuffer InvalidateSubFramebuffer} */ + public static void glInvalidateSubFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int[] attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL43C.glInvalidateSubFramebuffer(target, attachments, x, y, width, height); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMapBufferAlignment.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMapBufferAlignment.java new file mode 100644 index 000000000..2753a786a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMapBufferAlignment.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_map_buffer_alignment extension. + * + *

    This extension adds a requirement to the pointer returned by {@link GL15C#glMapBuffer MapBuffer} and {@link GL30C#glMapBufferRange MapBufferRange} that they provide a minimum of 64 byte alignment + * to support processing of the data directly with special CPU instructions like SSE and AVX.

    + * + *

    Requires {@link GL21 OpenGL 2.1}. Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ +public final class ARBMapBufferAlignment { + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_MIN_MAP_BUFFER_ALIGNMENT = 0x90BC; + + private ARBMapBufferAlignment() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMapBufferRange.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMapBufferRange.java new file mode 100644 index 000000000..d332ad7f7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMapBufferRange.java @@ -0,0 +1,111 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_map_buffer_range extension. + * + *

    ARB_map_buffer_range expands the buffer object API to allow greater performance when a client application only needs to write to a sub-range of a buffer + * object. To that end, this extension introduces two new buffer object features: non-serialized buffer modification and explicit sub-range flushing for + * mapped buffer objects.

    + * + *

    OpenGL requires that commands occur in a FIFO manner meaning that any changes to buffer objects either block until the data has been processed by the + * OpenGL pipeline or else create extra copies to avoid such a block. By providing a method to asynchronously modify buffer object data, an application is + * then able to manage the synchronization points themselves and modify ranges of data contained by a buffer object even though OpenGL might still be using + * other parts of it.

    + * + *

    This extension also provides a method for explicitly flushing ranges of a mapped buffer object so OpenGL does not have to assume that the entire range + * may have been modified. Further, it allows the application to more precisely specify its intent with respect to reading, writing, and whether the + * previous contents of a mapped range of interest need be preserved prior to modification.

    + * + *

    Requires {@link GL21 OpenGL 2.1}. Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public class ARBMapBufferRange { + + static { GL.initialize(); } + + /** Accepted by the {@code access} parameter of MapBufferRange. */ + public static final int + GL_MAP_READ_BIT = 0x1, + GL_MAP_WRITE_BIT = 0x2, + GL_MAP_INVALIDATE_RANGE_BIT = 0x4, + GL_MAP_INVALIDATE_BUFFER_BIT = 0x8, + GL_MAP_FLUSH_EXPLICIT_BIT = 0x10, + GL_MAP_UNSYNCHRONIZED_BIT = 0x20; + + protected ARBMapBufferRange() { + throw new UnsupportedOperationException(); + } + + // --- [ glMapBufferRange ] --- + + /** Unsafe version of: {@link #glMapBufferRange MapBufferRange} */ + public static long nglMapBufferRange(int target, long offset, long length, int access) { + return GL30C.nglMapBufferRange(target, offset, length, access); + } + + /** + * Maps a section of a buffer object's data store. + * + *

    LWJGL note: This method comes in 2 flavors:

    + * + *
      + *
    1. {@link #glMapBufferRange(int, long, long, int)} - Always returns a new ByteBuffer instance.
    2. + *
    3. {@link #glMapBufferRange(int, long, long, int, ByteBuffer)} - The {@code old_buffer} parameter is reused if not null.
    4. + *
    + * + * @param target a binding to which the target buffer is bound. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30C#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link GL30C#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30C#GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link GL30C#GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link GL30C#GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link GL30C#GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link GL30C#GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBufferRange(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access) { + return GL30C.glMapBufferRange(target, offset, length, access); + } + + /** + * Maps a section of a buffer object's data store. + * + *

    LWJGL note: This method comes in 2 flavors:

    + * + *
      + *
    1. {@link #glMapBufferRange(int, long, long, int)} - Always returns a new ByteBuffer instance.
    2. + *
    3. {@link #glMapBufferRange(int, long, long, int, ByteBuffer)} - The {@code old_buffer} parameter is reused if not null.
    4. + *
    + * + * @param target a binding to which the target buffer is bound. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30C#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link GL30C#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30C#GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link GL30C#GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link GL30C#GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link GL30C#GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link GL30C#GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBufferRange(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access, @Nullable ByteBuffer old_buffer) { + return GL30C.glMapBufferRange(target, offset, length, access, old_buffer); + } + + // --- [ glFlushMappedBufferRange ] --- + + /** + * Indicates modifications to a range of a mapped buffer. + * + * @param target the target of the flush operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30C#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the start of the buffer subrange, in basic machine units + * @param length the length of the buffer subrange, in basic machine units + */ + public static void glFlushMappedBufferRange(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length) { + GL30C.glFlushMappedBufferRange(target, offset, length); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMatrixPalette.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMatrixPalette.java new file mode 100644 index 000000000..b6e01c84f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMatrixPalette.java @@ -0,0 +1,200 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_matrix_palette extension. + * + *

    This extension extends the abilities of {@link ARBVertexBlend} to include a palette of modelview matrices. The n vertex units use a palette of m modelview + * matrices. (Where n and m are constrained to implementation defined maxima.) Each vertex has a set of n indices into the palette, and a corresponding set + * of n weights. Matrix indices can be changed for each vertex (between {@link GL11#glBegin Begin} and {@link GL11#glEnd End}).

    + * + *

    When this extension is utilized, the enabled units transform each vertex by the modelview matrices specified by the vertices' respective indices. These + * results are subsequently scaled by the weights of the respective units and then summed to create the eyespace vertex.

    + * + *

    A similar procedure is followed for normals. Normals, however, are transformed by the inverse transpose of the modelview matrix.

    + */ +public class ARBMatrixPalette { + + static { GL.initialize(); } + + /** + * Accepted by the {@code pname} parameters of GetFloatv, GetDoublev, and IsEnabled, by the {@code mode} parameter of MatrixMode, and by the {@code cap} + * parameters of Enable and Disable. + */ + public static final int GL_MATRIX_PALETTE_ARB = 0x8840; + + /** Accepted by the {@code pname} parameters of GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB = 0x8841, + GL_MAX_PALETTE_MATRICES_ARB = 0x8842, + GL_CURRENT_PALETTE_MATRIX_ARB = 0x8843; + + /** Accepted by the {@code cap} parameters of EnableClientState and DisableClientState and by the {@code pname} parameter of IsEnabled. */ + public static final int GL_MATRIX_INDEX_ARRAY_ARB = 0x8844; + + /** Accepted by the {@code pname} parameter of GetFloatv. */ + public static final int GL_CURRENT_MATRIX_INDEX_ARB = 0x8845; + + /** Accepted by the {@code pname} parameter of GetIntegerv. */ + public static final int + GL_MATRIX_INDEX_ARRAY_SIZE_ARB = 0x8846, + GL_MATRIX_INDEX_ARRAY_TYPE_ARB = 0x8847, + GL_MATRIX_INDEX_ARRAY_STRIDE_ARB = 0x8848; + + /** Accepted by the {@code pname} parameter of GetPointerv. */ + public static final int GL_MATRIX_INDEX_ARRAY_POINTER_ARB = 0x8849; + + protected ARBMatrixPalette() { + throw new UnsupportedOperationException(); + } + + // --- [ glCurrentPaletteMatrixARB ] --- + + /** + * Defines which of the palette's matrices is affected by subsequent matrix operations when the current matrix mode is {@link #GL_MATRIX_PALETTE_ARB MATRIX_PALETTE_ARB}, + * + * @param index the current matrix index. Must be a value between 0 and {@link #GL_MAX_PALETTE_MATRICES_ARB MAX_PALETTE_MATRICES_ARB}. + */ + public static native void glCurrentPaletteMatrixARB(@NativeType("GLint") int index); + + // --- [ glMatrixIndexuivARB ] --- + + /** + * Unsafe version of: {@link #glMatrixIndexuivARB MatrixIndexuivARB} + * + * @param size the number of index values to set. Must be a value between 1 and {@link ARBVertexBlend#GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + */ + public static native void nglMatrixIndexuivARB(int size, long indices); + + /** + * Sets the current matrix indices. + * + * @param indices the matrix index values + */ + public static void glMatrixIndexuivARB(@NativeType("GLuint *") IntBuffer indices) { + nglMatrixIndexuivARB(indices.remaining(), memAddress(indices)); + } + + // --- [ glMatrixIndexubvARB ] --- + + /** + * Unsafe version of: {@link #glMatrixIndexubvARB MatrixIndexubvARB} + * + * @param size the number of index values to set. Must be a value between 1 and {@link ARBVertexBlend#GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + */ + public static native void nglMatrixIndexubvARB(int size, long indices); + + /** + * Byte version of {@link #glMatrixIndexuivARB MatrixIndexuivARB}. + * + * @param indices the matrix index values + */ + public static void glMatrixIndexubvARB(@NativeType("GLubyte *") ByteBuffer indices) { + nglMatrixIndexubvARB(indices.remaining(), memAddress(indices)); + } + + // --- [ glMatrixIndexusvARB ] --- + + /** + * Unsafe version of: {@link #glMatrixIndexusvARB MatrixIndexusvARB} + * + * @param size the number of index values to set. Must be a value between 1 and {@link ARBVertexBlend#GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + */ + public static native void nglMatrixIndexusvARB(int size, long indices); + + /** + * Short version of {@link #glMatrixIndexuivARB MatrixIndexuivARB}. + * + * @param indices the matrix index values + */ + public static void glMatrixIndexusvARB(@NativeType("GLushort *") ShortBuffer indices) { + nglMatrixIndexusvARB(indices.remaining(), memAddress(indices)); + } + + // --- [ glMatrixIndexPointerARB ] --- + + /** + * Unsafe version of: {@link #glMatrixIndexPointerARB MatrixIndexPointerARB} + * + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static native void nglMatrixIndexPointerARB(int size, int type, int stride, long pointer); + + /** + * @param size the number of index values per vertex that are stored in the array. Must be a value between 1 and {@link ARBVertexBlend#GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the matrix index data + */ + public static void glMatrixIndexPointerARB(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglMatrixIndexPointerARB(size, type, stride, memAddress(pointer)); + } + + /** + * @param size the number of index values per vertex that are stored in the array. Must be a value between 1 and {@link ARBVertexBlend#GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the matrix index data + */ + public static void glMatrixIndexPointerARB(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglMatrixIndexPointerARB(size, type, stride, pointer); + } + + /** + * @param size the number of index values per vertex that are stored in the array. Must be a value between 1 and {@link ARBVertexBlend#GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the matrix index data + */ + public static void glMatrixIndexPointerARB(@NativeType("GLint") int size, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglMatrixIndexPointerARB(size, GL11.GL_UNSIGNED_BYTE, stride, memAddress(pointer)); + } + + /** + * @param size the number of index values per vertex that are stored in the array. Must be a value between 1 and {@link ARBVertexBlend#GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the matrix index data + */ + public static void glMatrixIndexPointerARB(@NativeType("GLint") int size, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglMatrixIndexPointerARB(size, GL11.GL_UNSIGNED_SHORT, stride, memAddress(pointer)); + } + + /** + * @param size the number of index values per vertex that are stored in the array. Must be a value between 1 and {@link ARBVertexBlend#GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the matrix index data + */ + public static void glMatrixIndexPointerARB(@NativeType("GLint") int size, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglMatrixIndexPointerARB(size, GL11.GL_UNSIGNED_INT, stride, memAddress(pointer)); + } + + /** Array version of: {@link #glMatrixIndexuivARB MatrixIndexuivARB} */ + public static void glMatrixIndexuivARB(@NativeType("GLuint *") int[] indices) { + long __functionAddress = GL.getICD().glMatrixIndexuivARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(indices.length, indices, __functionAddress); + } + + /** Array version of: {@link #glMatrixIndexusvARB MatrixIndexusvARB} */ + public static void glMatrixIndexusvARB(@NativeType("GLushort *") short[] indices) { + long __functionAddress = GL.getICD().glMatrixIndexusvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(indices.length, indices, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultiBind.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultiBind.java new file mode 100644 index 000000000..18ebeaf84 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultiBind.java @@ -0,0 +1,336 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_multi_bind extension. + * + *

    This extension provides a new set of commands allowing applications to bind or unbind a set of objects in a single call, instead of requiring a separate + * call for each bind or unbind operation. Using a single command allows OpenGL implementations to amortize function call, name space lookup, and + * potential locking overhead over multiple bind or unbind operations. The rendering loops of graphics applications frequently switch between different + * states, binding different sets of resources, including texture objects, sampler objects, textures for image loads and stores, uniform buffers, and + * vertex buffers; this extension provides "multi-bind" entry points for all of these object types.

    + * + *

    Each command in this extension includes a <first> and <count> parameter, specifying a continguous range of binding points to update, as well + * as an array of <count> object names specifying the objects to bind. Unlike single bind commands, multi-bind commands can be used only to bind or + * unbind existing objects. Passing a previously unused object name (generated or not) results in an error and does not create a new object. For binding + * points with associated data (e.g., ranges of a buffer), separate arrays are used to pass the associated data for each binding point. Passing zero values + * in the array of object names removes the object bound to the current bounding point. Additionally, if {@code NULL} is passed as the array of objects, objects + * bound to the entire range of binding points are unbound, as though the caller passed an array of zeroes.

    + * + *

    Requires {@link GL30 OpenGL 3.0}. Promoted to core in {@link GL44 OpenGL 4.4}.

    + */ +public class ARBMultiBind { + + static { GL.initialize(); } + + protected ARBMultiBind() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindBuffersBase ] --- + + /** + * Unsafe version of: {@link #glBindBuffersBase BindBuffersBase} + * + * @param count the number of bindings + */ + public static void nglBindBuffersBase(int target, int first, int count, long buffers) { + GL44C.nglBindBuffersBase(target, first, count, buffers); + } + + /** + * Binds {@code count} existing buffer objects to bindings numbered {@code first} through {@code first+count-1} in the array of buffer binding points + * corresponding to {@code target}. If {@code buffers} is not {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name + * of an existing buffer object. It is equivalent to: + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( buffers == NULL ) {
    +     *         glBindBufferBase(target, first + i, 0);
    +     *     } else {
    +     *         glBindBufferBase(target, first + i, buffers[i]);
    +     *     }
    +     * }
    + * + *

    except that the single general buffer binding corresponding to {@code target} is unmodified, and that buffers will not be created if they do not exist.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param first the first binding + * @param buffers an array of zeros or names of existing buffers objects + */ + public static void glBindBuffersBase(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers) { + GL44C.glBindBuffersBase(target, first, buffers); + } + + // --- [ glBindBuffersRange ] --- + + /** + * Unsafe version of: {@link #glBindBuffersRange BindBuffersRange} + * + * @param count the number of bindings + */ + public static void nglBindBuffersRange(int target, int first, int count, long buffers, long offsets, long sizes) { + GL44C.nglBindBuffersRange(target, first, count, buffers, offsets, sizes); + } + + /** + * Binds {@code count} existing buffer objects to bindings numbered {@code first} through {@code first+count-1} in the array of buffer binding points + * corresponding to {@code target}. {@code offsets} and {@code sizes} specify arrays of {@code count} values indicating the range of each buffer to bind. + * If {@code buffers} is {@code NULL}, all bindings from {@code first} through {@code first+count-1} are reset to their unbound (zero) state. In this + * case, the offsets and sizes associated with the binding points are set to default values, ignoring {@code offsets} and {@code sizes}. It is equivalent + * to: + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( buffers == NULL ) {
    +     *         glBindBufferRange(target, first + i, 0, 0, 0);
    +     *     } else {
    +     *         glBindBufferRange(target, first + i, buffers[i], offsets[i], sizes[i]);
    +     *     }
    +     * }
    + * + *

    except that the single general buffer binding corresponding to {@code target} is unmodified, and that buffers will not be created if they do not exist.

    + * + *

    The values specified in {@code buffers}, {@code offsets}, and {@code sizes} will be checked separately for each binding point. When values for a + * specific binding point are invalid, the state for that binding point will be unchanged and an error will be generated. However, state for other binding + * points will still be changed if their corresponding values are valid.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param first the first binding + * @param buffers an array of names of existing buffers objects + * @param offsets an array of offsets + * @param sizes an array of sizes + */ + public static void glBindBuffersRange(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizeiptr const *") PointerBuffer sizes) { + GL44C.glBindBuffersRange(target, first, buffers, offsets, sizes); + } + + // --- [ glBindTextures ] --- + + /** + * Unsafe version of: {@link #glBindTextures BindTextures} + * + * @param count the number of texture objects + */ + public static void nglBindTextures(int first, int count, long textures) { + GL44C.nglBindTextures(first, count, textures); + } + + /** + * Binds {@code count} existing texture objects to texture image units numbered {@code first} through {@code first+count-1}. If {@code textures} is not + * {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name of an existing texture object. When an entry in + * {@code textures} is the name of an existing texture object, that object is bound to corresponding texture unit for the target specified when the texture + * object was created. When an entry in {@code textures} is zero, each of the targets enumerated at the beginning of this section is reset to its default + * texture for the corresponding texture image unit. If {@code textures} is {@code NULL}, each target of each affected texture image unit from {@code first} + * through {@code first+count-1} is reset to its default texture. + * + *

    {@code BindTextures} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     uint texture;
    +     *     if ( textures == NULL ) {
    +     *         texture = 0;
    +     *     } else {
    +     *         texture = textures[i];
    +     *     }
    +     *     ActiveTexture(TEXTURE0 + first + i);
    +     *     if ( texture != 0 ) {
    +     *         enum target; // target of texture object textures[i]
    +     *         BindTexture(target, textures[i]);
    +     *     } else {
    +     *         for ( target in all supported targets ) {
    +     *             BindTexture(target, 0);
    +     *         }
    +     *     }
    +     * }
    + * + *

    except that the active texture selector retains its original value upon completion of the command, and that textures will not be created if they do not + * exist.

    + * + *

    The values specified in {@code textures} will be checked separately for each texture image unit. When a value for a specific texture image unit is + * invalid, the state for that texture image unit will be unchanged and an error will be generated. However, state for other texture image units will still + * be changed if their corresponding values are valid.

    + * + * @param first the first texture objects + * @param textures an array of zeros or names of existing texture objects + */ + public static void glBindTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer textures) { + GL44C.glBindTextures(first, textures); + } + + // --- [ glBindSamplers ] --- + + /** + * Unsafe version of: {@link #glBindSamplers BindSamplers} + * + * @param count the number of sampler objects + */ + public static void nglBindSamplers(int first, int count, long samplers) { + GL44C.nglBindSamplers(first, count, samplers); + } + + /** + * Binds {@code count} existing sampler objects to texture image units numbered {@code first} through {@code first+count-1}. If {@code samplers} is not + * {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name of an existing sampler object. If {@code samplers} is {@code NULL}, + * each affected texture image unit from {@code first} through {@code first+count-1} will be reset to have no bound sampler object. + * + *

    {@code BindSamplers} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( samplers == NULL ) {
    +     *         glBindSampler(first + i, 0);
    +     *     } else {
    +     *         glBindSampler(first + i, samplers[i]);
    +     *     }
    +     * }
    + * + *

    The values specified in {@code samplers} will be checked separately for each texture image unit. When a value for a specific texture image unit is + * invalid, the state for that texture image unit will be unchanged and an error will be generated. However, state for other texture image units will still + * be changed if their corresponding values are valid.

    + * + * @param first the first sampler object + * @param samplers an array of zeros or names of existing sampler objects + */ + public static void glBindSamplers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer samplers) { + GL44C.glBindSamplers(first, samplers); + } + + // --- [ glBindImageTextures ] --- + + /** + * Unsafe version of: {@link #glBindImageTextures BindImageTextures} + * + * @param count the number of image units + */ + public static void nglBindImageTextures(int first, int count, long textures) { + GL44C.nglBindImageTextures(first, count, textures); + } + + /** + * Binds {@code count} existing texture objects to image units numbered {@code first} through {@code first+count-1}. If {@code textures} is not {@code NULL}, it + * specifies an array of {@code count} values, each of which must be zero or the name of an existing texture object. If {@code textures} is {@code NULL}, each + * affected image unit from {@code first} through {@code first+count-1} will be reset to have no bound texture object. + * + *

    When binding a non-zero texture object to an image unit, the image unit {@code level}, {@code layered}, {@code layer}, and {@code access} parameters are + * set to zero, {@link GL11#GL_TRUE TRUE}, zero, and {@link GL15#GL_READ_WRITE READ_WRITE}, respectively. The image unit {@code format} parameter is taken from the internal + * format of the texture image at level zero of the texture object identified by {@code textures}. For cube map textures, the internal format of the + * {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X} image of level zero is used. For multisample, multisample array, buffer, and rectangle textures, the internal + * format of the single texture level is used.

    + * + *

    When unbinding a texture object from an image unit, the image unit parameters {@code level}, {@code layered}, {@code layer}, and {@code format} will be + * reset to their default values of zero, {@link GL11#GL_FALSE FALSE}, 0, and {@link GL30#GL_R8 R8}, respectively.

    + * + *

    {@code BindImageTextures} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( textures == NULL || textures[i] = 0 ) {
    +     *         glBindImageTexture(first + i, 0, 0, FALSE, 0, READ_ONLY, R8);
    +     *     } else {
    +     *         glBindImageTexture(first + i, textures[i], 0, TRUE, 0, READ_WRITE, lookupInternalFormat(textures[i]));
    +     *     }
    +     * }
    + * + *

    where {@code lookupInternalFormat} returns the internal format of the specified texture object.

    + * + *

    The values specified in {@code textures} will be checked separately for each image unit. When a value for a specific image unit is invalid, the state + * for that image unit will be unchanged and an error will be generated. However, state for other image units will still be changed if their corresponding + * values are valid.

    + * + * @param first the first image unit + * @param textures an array of zeros or names of existing texture objects + */ + public static void glBindImageTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer textures) { + GL44C.glBindImageTextures(first, textures); + } + + // --- [ glBindVertexBuffers ] --- + + /** + * Unsafe version of: {@link #glBindVertexBuffers BindVertexBuffers} + * + * @param count the number of vertex buffer binding points + */ + public static void nglBindVertexBuffers(int first, int count, long buffers, long offsets, long strides) { + GL44C.nglBindVertexBuffers(first, count, buffers, offsets, strides); + } + + /** + * Binds {@code count} existing buffer objects to vertex buffer binding points numbered {@code first} through {@code first+count-1}. If {@code buffers} is + * not {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name of an existing buffer object. {@code offsets} and + * {@code strides} specify arrays of {@code count} values indicating the offset of the first element and stride between elements in each buffer, + * respectively. If {@code buffers} is {@code NULL}, each affected vertex buffer binding point from {@code first} through {@code first+count-1} will be reset to + * have no bound buffer object. In this case, the offsets and strides associated with the binding points are set to default values, ignoring + * {@code offsets} and {@code strides}. + * + *

    {@code BindVertexBuffers} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( buffers == NULL ) {
    +     *         glBindVertexBuffer(first + i, 0, 0, 16);
    +     *     } else {
    +     *         glBindVertexBuffer(first + i, buffers[i], offsets[i], strides[i]);
    +     *     }
    +     * }
    + * + *

    except that buffers will not be created if they do not exist.

    + * + *

    The values specified in {@code buffers}, {@code offsets}, and {@code strides} will be checked separately for each vertex buffer binding point. When a + * value for a specific binding point is invalid, the state for that binding point will be unchanged and an error will be generated. However, state for + * other binding points will still be changed if their corresponding values are valid.

    + * + * @param first the first vertex buffer binding point + * @param buffers an array of zeros or names of existing buffers objects + * @param offsets an array of offses + * @param strides an array of stride values + */ + public static void glBindVertexBuffers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") IntBuffer strides) { + GL44C.glBindVertexBuffers(first, buffers, offsets, strides); + } + + /** Array version of: {@link #glBindBuffersBase BindBuffersBase} */ + public static void glBindBuffersBase(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers) { + GL44C.glBindBuffersBase(target, first, buffers); + } + + /** Array version of: {@link #glBindBuffersRange BindBuffersRange} */ + public static void glBindBuffersRange(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizeiptr const *") PointerBuffer sizes) { + GL44C.glBindBuffersRange(target, first, buffers, offsets, sizes); + } + + /** Array version of: {@link #glBindTextures BindTextures} */ + public static void glBindTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] textures) { + GL44C.glBindTextures(first, textures); + } + + /** Array version of: {@link #glBindSamplers BindSamplers} */ + public static void glBindSamplers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] samplers) { + GL44C.glBindSamplers(first, samplers); + } + + /** Array version of: {@link #glBindImageTextures BindImageTextures} */ + public static void glBindImageTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] textures) { + GL44C.glBindImageTextures(first, textures); + } + + /** Array version of: {@link #glBindVertexBuffers BindVertexBuffers} */ + public static void glBindVertexBuffers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") int[] strides) { + GL44C.glBindVertexBuffers(first, buffers, offsets, strides); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultiDrawIndirect.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultiDrawIndirect.java new file mode 100644 index 000000000..2dd367939 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultiDrawIndirect.java @@ -0,0 +1,267 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_multi_draw_indirect extension. + * + *

    The {@link ARBDrawIndirect ARB_draw_indirect} extension (included in OpenGL 4.0) introduced mechanisms whereby the parameters for a draw function may be provided in a + * structure contained in a buffer object rather than as parameters to the drawing procedure. This is known as an indirect draw and is exposed as two new + * functions, {@link ARBDrawIndirect#glDrawArraysIndirect DrawArraysIndirect} and {@link ARBDrawIndirect#glDrawElementsIndirect DrawElementsIndirect}. Each of these functions generates a single batch of + * primitives.

    + * + *

    This extension builds on this functionality by providing procedures to invoke multiple draws from a single procedure call. This allows large batches of + * drawing commands to be assembled in server memory (via a buffer object) which may then be dispatched through a single function call.

    + * + *

    Requires {@link GL40 OpenGL 4.0} or {@link ARBDrawIndirect ARB_draw_indirect}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBMultiDrawIndirect { + + static { GL.initialize(); } + + protected ARBMultiDrawIndirect() { + throw new UnsupportedOperationException(); + } + + // --- [ glMultiDrawArraysIndirect ] --- + + /** Unsafe version of: {@link #glMultiDrawArraysIndirect MultiDrawArraysIndirect} */ + public static void nglMultiDrawArraysIndirect(int mode, long indirect, int drawcount, int stride) { + GL43C.nglMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + } + + /** + * Renders multiple sets of primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by {@code indirect} are packed into an array of structures, each element of which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance;
    +     * } DrawArraysIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawArraysIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawArraysIndirect(mode, (DrawArraysIndirectCommand*)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawArraysIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the number of elements in the array of draw parameter structures + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + } + + /** + * Renders multiple sets of primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by {@code indirect} are packed into an array of structures, each element of which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance;
    +     * } DrawArraysIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawArraysIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawArraysIndirect(mode, (DrawArraysIndirectCommand*)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawArraysIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the number of elements in the array of draw parameter structures + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") long indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + } + + /** + * Renders multiple sets of primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by {@code indirect} are packed into an array of structures, each element of which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance;
    +     * } DrawArraysIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawArraysIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawArraysIndirect(mode, (DrawArraysIndirectCommand*)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawArraysIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the number of elements in the array of draw parameter structures + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + } + + // --- [ glMultiDrawElementsIndirect ] --- + + /** Unsafe version of: {@link #glMultiDrawElementsIndirect MultiDrawElementsIndirect} */ + public static void nglMultiDrawElementsIndirect(int mode, int type, long indirect, int drawcount, int stride) { + GL43C.nglMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + + /** + * Renders multiple indexed primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by indirect are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawElementsIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawElementsIndirect(mode, type, (DrawElementsIndirectCommand *)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawElementsIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the number of elements in the array addressed by {@code indirect} + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + + /** + * Renders multiple indexed primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by indirect are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawElementsIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawElementsIndirect(mode, type, (DrawElementsIndirectCommand *)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawElementsIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the number of elements in the array addressed by {@code indirect} + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") long indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + + /** + * Renders multiple indexed primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by indirect are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawElementsIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawElementsIndirect(mode, type, (DrawElementsIndirectCommand *)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawElementsIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the number of elements in the array addressed by {@code indirect} + * @param stride the distance in basic machine units between elements of the draw parameter array + */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + + /** Array version of: {@link #glMultiDrawArraysIndirect MultiDrawArraysIndirect} */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") int[] indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + } + + /** Array version of: {@link #glMultiDrawElementsIndirect MultiDrawElementsIndirect} */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") int[] indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultisample.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultisample.java new file mode 100644 index 000000000..ecec4b3ea --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultisample.java @@ -0,0 +1,70 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_multisample extension. + * + *

    This extension provides a mechanism to antialias all GL primitives: points, lines, polygons, bitmaps, and images. The technique is to sample all + * primitives multiple times at each pixel. The color sample values are resolved to a single, displayable color each time a pixel is updated, so the + * antialiasing appears to be automatic at the application level. Because each sample includes depth and stencil information, the depth and stencil + * functions perform equivalently to the single-sample mode.

    + * + *

    An additional buffer, called the multisample buffer, is added to the framebuffer. Pixel sample values, including color, depth, and stencil values, are + * stored in this buffer. When the framebuffer includes a multisample buffer, it does not also include separate depth or stencil buffers, even if the + * multisample buffer does not store depth or stencil values. Color buffers (left/right, front/back, and aux) do coexist with the multisample buffer, + * however.

    + * + *

    Multisample antialiasing is most valuable for rendering polygons, because it requires no sorting for hidden surface elimination, and it correctly + * handles adjacent polygons, object silhouettes, and even intersecting polygons. If only points or lines are being rendered, the "smooth" antialiasing + * mechanism provided by the base GL may result in a higher quality image. This extension is designed to allow multisample and smooth antialiasing + * techniques to be alternated during the rendering of a single scene.

    + */ +public class ARBMultisample { + + static { GL.initialize(); } + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int + GL_MULTISAMPLE_ARB = 0x809D, + GL_SAMPLE_ALPHA_TO_COVERAGE_ARB = 0x809E, + GL_SAMPLE_ALPHA_TO_ONE_ARB = 0x809F, + GL_SAMPLE_COVERAGE_ARB = 0x80A0; + + /** Accepted by the {@code mask} parameter of PushAttrib. */ + public static final int GL_MULTISAMPLE_BIT_ARB = 0x20000000; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_SAMPLE_BUFFERS_ARB = 0x80A8, + GL_SAMPLES_ARB = 0x80A9, + GL_SAMPLE_COVERAGE_VALUE_ARB = 0x80AA, + GL_SAMPLE_COVERAGE_INVERT_ARB = 0x80AB; + + protected ARBMultisample() { + throw new UnsupportedOperationException(); + } + + // --- [ glSampleCoverageARB ] --- + + /** + * Specifies simultaneously the values of {@link #GL_SAMPLE_COVERAGE_VALUE_ARB SAMPLE_COVERAGE_VALUE_ARB} and {@link #GL_SAMPLE_COVERAGE_INVERT_ARB SAMPLE_COVERAGE_INVERT_ARB}. + * + *

    If {@link #GL_SAMPLE_COVERAGE_ARB SAMPLE_COVERAGE_ARB} is enabled, the fragment coverage is ANDed with another temporary coverage. This temporary coverage is a function of the value + * of {@link #GL_SAMPLE_COVERAGE_VALUE_ARB SAMPLE_COVERAGE_VALUE_ARB}. If {@link #GL_SAMPLE_COVERAGE_INVERT_ARB SAMPLE_COVERAGE_INVERT_ARB} is {@link GL11#GL_TRUE TRUE}, the temporary coverage is inverted (all bit values are inverted) before it + * is ANDed with the fragment coverage.

    + * + * @param value the desired coverage value + * @param invert if true, the temporary coverage is inverted. One of:
    {@link GL11#GL_TRUE TRUE}{@link GL11#GL_FALSE FALSE}
    + */ + public static native void glSampleCoverageARB(@NativeType("GLfloat") float value, @NativeType("GLboolean") boolean invert); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultitexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultitexture.java new file mode 100644 index 000000000..691fedbb4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBMultitexture.java @@ -0,0 +1,724 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_multitexture extension. + * + *

    This extension allows application of multiple textures to a fragment in one rendering pass.

    + * + *

    Promoted to core in {@link GL13 OpenGL 1.3}.

    + */ +public class ARBMultitexture { + + static { GL.initialize(); } + + /** Accepted by the {@code texture} parameter of ActiveTexture and MultiTexCoord. */ + public static final int + GL_TEXTURE0_ARB = 0x84C0, + GL_TEXTURE1_ARB = 0x84C1, + GL_TEXTURE2_ARB = 0x84C2, + GL_TEXTURE3_ARB = 0x84C3, + GL_TEXTURE4_ARB = 0x84C4, + GL_TEXTURE5_ARB = 0x84C5, + GL_TEXTURE6_ARB = 0x84C6, + GL_TEXTURE7_ARB = 0x84C7, + GL_TEXTURE8_ARB = 0x84C8, + GL_TEXTURE9_ARB = 0x84C9, + GL_TEXTURE10_ARB = 0x84CA, + GL_TEXTURE11_ARB = 0x84CB, + GL_TEXTURE12_ARB = 0x84CC, + GL_TEXTURE13_ARB = 0x84CD, + GL_TEXTURE14_ARB = 0x84CE, + GL_TEXTURE15_ARB = 0x84CF, + GL_TEXTURE16_ARB = 0x84D0, + GL_TEXTURE17_ARB = 0x84D1, + GL_TEXTURE18_ARB = 0x84D2, + GL_TEXTURE19_ARB = 0x84D3, + GL_TEXTURE20_ARB = 0x84D4, + GL_TEXTURE21_ARB = 0x84D5, + GL_TEXTURE22_ARB = 0x84D6, + GL_TEXTURE23_ARB = 0x84D7, + GL_TEXTURE24_ARB = 0x84D8, + GL_TEXTURE25_ARB = 0x84D9, + GL_TEXTURE26_ARB = 0x84DA, + GL_TEXTURE27_ARB = 0x84DB, + GL_TEXTURE28_ARB = 0x84DC, + GL_TEXTURE29_ARB = 0x84DD, + GL_TEXTURE30_ARB = 0x84DE, + GL_TEXTURE31_ARB = 0x84DF; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_ACTIVE_TEXTURE_ARB = 0x84E0, + GL_CLIENT_ACTIVE_TEXTURE_ARB = 0x84E1, + GL_MAX_TEXTURE_UNITS_ARB = 0x84E2; + + protected ARBMultitexture() { + throw new UnsupportedOperationException(); + } + + // --- [ glActiveTextureARB ] --- + + /** + * Selects which texture unit subsequent texture state calls will affect. The number of texture units an implementation supports is implementation + * dependent. + * + * @param texture which texture unit to make active. One of:
    {@link #GL_TEXTURE0_ARB TEXTURE0_ARB}GL_TEXTURE[1-31]
    + */ + public static native void glActiveTextureARB(@NativeType("GLenum") int texture); + + // --- [ glClientActiveTextureARB ] --- + + /** + * Selects the vertex array client state parameters to be modified by the TexCoordPointer command and the array affected by EnableClientState and + * DisableClientState with parameter TEXTURE_COORD_ARRAY. + * + * @param texture which texture coordinate array to make active. One of:
    {@link #GL_TEXTURE0_ARB TEXTURE0_ARB}GL_TEXTURE[1-31]
    + */ + public static native void glClientActiveTextureARB(@NativeType("GLenum") int texture); + + // --- [ glMultiTexCoord1fARB ] --- + + /** + * Sets the current one-dimensional texture coordinate for the specified texture coordinate set. {@code t} and {@code r} are implicitly set to 0 and {@code q} to 1. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + */ + public static native void glMultiTexCoord1fARB(@NativeType("GLenum") int texture, @NativeType("GLfloat") float s); + + // --- [ glMultiTexCoord1sARB ] --- + + /** + * Short version of {@link #glMultiTexCoord1fARB MultiTexCoord1fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + */ + public static native void glMultiTexCoord1sARB(@NativeType("GLenum") int texture, @NativeType("GLshort") short s); + + // --- [ glMultiTexCoord1iARB ] --- + + /** + * Integer version of {@link #glMultiTexCoord1fARB MultiTexCoord1fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + */ + public static native void glMultiTexCoord1iARB(@NativeType("GLenum") int texture, @NativeType("GLint") int s); + + // --- [ glMultiTexCoord1dARB ] --- + + /** + * Double version of {@link #glMultiTexCoord1fARB MultiTexCoord1fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + */ + public static native void glMultiTexCoord1dARB(@NativeType("GLenum") int texture, @NativeType("GLdouble") double s); + + // --- [ glMultiTexCoord1fvARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord1fvARB MultiTexCoord1fvARB} */ + public static native void nglMultiTexCoord1fvARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord1fARB MultiTexCoord1fARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord1fvARB(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglMultiTexCoord1fvARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord1svARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord1svARB MultiTexCoord1svARB} */ + public static native void nglMultiTexCoord1svARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord1sARB MultiTexCoord1sARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord1svARB(@NativeType("GLenum") int texture, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglMultiTexCoord1svARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord1ivARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord1ivARB MultiTexCoord1ivARB} */ + public static native void nglMultiTexCoord1ivARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord1iARB MultiTexCoord1iARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord1ivARB(@NativeType("GLenum") int texture, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglMultiTexCoord1ivARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord1dvARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord1dvARB MultiTexCoord1dvARB} */ + public static native void nglMultiTexCoord1dvARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord1dARB MultiTexCoord1dARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord1dvARB(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglMultiTexCoord1dvARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord2fARB ] --- + + /** + * Sets the current two-dimensional texture coordinate for the specified texture coordinate set. {@code r} is implicitly set to 0 and {@code q} to 1. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + */ + public static native void glMultiTexCoord2fARB(@NativeType("GLenum") int texture, @NativeType("GLfloat") float s, @NativeType("GLfloat") float t); + + // --- [ glMultiTexCoord2sARB ] --- + + /** + * Short version of {@link #glMultiTexCoord2fARB MultiTexCoord2fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + */ + public static native void glMultiTexCoord2sARB(@NativeType("GLenum") int texture, @NativeType("GLshort") short s, @NativeType("GLshort") short t); + + // --- [ glMultiTexCoord2iARB ] --- + + /** + * Integer version of {@link #glMultiTexCoord2fARB MultiTexCoord2fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + */ + public static native void glMultiTexCoord2iARB(@NativeType("GLenum") int texture, @NativeType("GLint") int s, @NativeType("GLint") int t); + + // --- [ glMultiTexCoord2dARB ] --- + + /** + * Double version of {@link #glMultiTexCoord2fARB MultiTexCoord2fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + */ + public static native void glMultiTexCoord2dARB(@NativeType("GLenum") int texture, @NativeType("GLdouble") double s, @NativeType("GLdouble") double t); + + // --- [ glMultiTexCoord2fvARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord2fvARB MultiTexCoord2fvARB} */ + public static native void nglMultiTexCoord2fvARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord2fARB MultiTexCoord2fARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord2fvARB(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglMultiTexCoord2fvARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord2svARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord2svARB MultiTexCoord2svARB} */ + public static native void nglMultiTexCoord2svARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord2sARB MultiTexCoord2sARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord2svARB(@NativeType("GLenum") int texture, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglMultiTexCoord2svARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord2ivARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord2ivARB MultiTexCoord2ivARB} */ + public static native void nglMultiTexCoord2ivARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord2iARB MultiTexCoord2iARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord2ivARB(@NativeType("GLenum") int texture, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglMultiTexCoord2ivARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord2dvARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord2dvARB MultiTexCoord2dvARB} */ + public static native void nglMultiTexCoord2dvARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord2dARB MultiTexCoord2dARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord2dvARB(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglMultiTexCoord2dvARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord3fARB ] --- + + /** + * Sets the current three-dimensional texture coordinate for the specified texture coordinate set. {@code q} is implicitly set to 1. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + */ + public static native void glMultiTexCoord3fARB(@NativeType("GLenum") int texture, @NativeType("GLfloat") float s, @NativeType("GLfloat") float t, @NativeType("GLfloat") float r); + + // --- [ glMultiTexCoord3sARB ] --- + + /** + * Short version of {@link #glMultiTexCoord3fARB MultiTexCoord3fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + */ + public static native void glMultiTexCoord3sARB(@NativeType("GLenum") int texture, @NativeType("GLshort") short s, @NativeType("GLshort") short t, @NativeType("GLshort") short r); + + // --- [ glMultiTexCoord3iARB ] --- + + /** + * Integer version of {@link #glMultiTexCoord3fARB MultiTexCoord3fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + */ + public static native void glMultiTexCoord3iARB(@NativeType("GLenum") int texture, @NativeType("GLint") int s, @NativeType("GLint") int t, @NativeType("GLint") int r); + + // --- [ glMultiTexCoord3dARB ] --- + + /** + * Double version of {@link #glMultiTexCoord3fARB MultiTexCoord3fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + */ + public static native void glMultiTexCoord3dARB(@NativeType("GLenum") int texture, @NativeType("GLdouble") double s, @NativeType("GLdouble") double t, @NativeType("GLdouble") double r); + + // --- [ glMultiTexCoord3fvARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord3fvARB MultiTexCoord3fvARB} */ + public static native void nglMultiTexCoord3fvARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord3fARB MultiTexCoord3fARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord3fvARB(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglMultiTexCoord3fvARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord3svARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord3svARB MultiTexCoord3svARB} */ + public static native void nglMultiTexCoord3svARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord3sARB MultiTexCoord3sARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord3svARB(@NativeType("GLenum") int texture, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglMultiTexCoord3svARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord3ivARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord3ivARB MultiTexCoord3ivARB} */ + public static native void nglMultiTexCoord3ivARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord3iARB MultiTexCoord3iARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord3ivARB(@NativeType("GLenum") int texture, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglMultiTexCoord3ivARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord3dvARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord3dvARB MultiTexCoord3dvARB} */ + public static native void nglMultiTexCoord3dvARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord3dARB MultiTexCoord3dARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord3dvARB(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglMultiTexCoord3dvARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord4fARB ] --- + + /** + * Sets the current four-dimensional texture coordinate for the specified texture coordinate set. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + */ + public static native void glMultiTexCoord4fARB(@NativeType("GLenum") int texture, @NativeType("GLfloat") float s, @NativeType("GLfloat") float t, @NativeType("GLfloat") float r, @NativeType("GLfloat") float q); + + // --- [ glMultiTexCoord4sARB ] --- + + /** + * Short version of {@link #glMultiTexCoord4fARB MultiTexCoord4fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + */ + public static native void glMultiTexCoord4sARB(@NativeType("GLenum") int texture, @NativeType("GLshort") short s, @NativeType("GLshort") short t, @NativeType("GLshort") short r, @NativeType("GLshort") short q); + + // --- [ glMultiTexCoord4iARB ] --- + + /** + * Integer version of {@link #glMultiTexCoord4fARB MultiTexCoord4fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + */ + public static native void glMultiTexCoord4iARB(@NativeType("GLenum") int texture, @NativeType("GLint") int s, @NativeType("GLint") int t, @NativeType("GLint") int r, @NativeType("GLint") int q); + + // --- [ glMultiTexCoord4dARB ] --- + + /** + * Double version of {@link #glMultiTexCoord4fARB MultiTexCoord4fARB}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + */ + public static native void glMultiTexCoord4dARB(@NativeType("GLenum") int texture, @NativeType("GLdouble") double s, @NativeType("GLdouble") double t, @NativeType("GLdouble") double r, @NativeType("GLdouble") double q); + + // --- [ glMultiTexCoord4fvARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord4fvARB MultiTexCoord4fvARB} */ + public static native void nglMultiTexCoord4fvARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord4fARB MultiTexCoord4fARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord4fvARB(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglMultiTexCoord4fvARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord4svARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord4svARB MultiTexCoord4svARB} */ + public static native void nglMultiTexCoord4svARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord4sARB MultiTexCoord4sARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord4svARB(@NativeType("GLenum") int texture, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglMultiTexCoord4svARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord4ivARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord4ivARB MultiTexCoord4ivARB} */ + public static native void nglMultiTexCoord4ivARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord4iARB MultiTexCoord4iARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord4ivARB(@NativeType("GLenum") int texture, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglMultiTexCoord4ivARB(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord4dvARB ] --- + + /** Unsafe version of: {@link #glMultiTexCoord4dvARB MultiTexCoord4dvARB} */ + public static native void nglMultiTexCoord4dvARB(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord4dARB MultiTexCoord4dARB}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + */ + public static void glMultiTexCoord4dvARB(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglMultiTexCoord4dvARB(texture, memAddress(v)); + } + + /** Array version of: {@link #glMultiTexCoord1fvARB MultiTexCoord1fvARB} */ + public static void glMultiTexCoord1fvARB(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord1fvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord1svARB MultiTexCoord1svARB} */ + public static void glMultiTexCoord1svARB(@NativeType("GLenum") int texture, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord1svARB; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord1ivARB MultiTexCoord1ivARB} */ + public static void glMultiTexCoord1ivARB(@NativeType("GLenum") int texture, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord1ivARB; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord1dvARB MultiTexCoord1dvARB} */ + public static void glMultiTexCoord1dvARB(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord1dvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord2fvARB MultiTexCoord2fvARB} */ + public static void glMultiTexCoord2fvARB(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord2fvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord2svARB MultiTexCoord2svARB} */ + public static void glMultiTexCoord2svARB(@NativeType("GLenum") int texture, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord2svARB; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord2ivARB MultiTexCoord2ivARB} */ + public static void glMultiTexCoord2ivARB(@NativeType("GLenum") int texture, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord2ivARB; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord2dvARB MultiTexCoord2dvARB} */ + public static void glMultiTexCoord2dvARB(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord2dvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord3fvARB MultiTexCoord3fvARB} */ + public static void glMultiTexCoord3fvARB(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord3fvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord3svARB MultiTexCoord3svARB} */ + public static void glMultiTexCoord3svARB(@NativeType("GLenum") int texture, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord3svARB; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord3ivARB MultiTexCoord3ivARB} */ + public static void glMultiTexCoord3ivARB(@NativeType("GLenum") int texture, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord3ivARB; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord3dvARB MultiTexCoord3dvARB} */ + public static void glMultiTexCoord3dvARB(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord3dvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord4fvARB MultiTexCoord4fvARB} */ + public static void glMultiTexCoord4fvARB(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord4fvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord4svARB MultiTexCoord4svARB} */ + public static void glMultiTexCoord4svARB(@NativeType("GLenum") int texture, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord4svARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord4ivARB MultiTexCoord4ivARB} */ + public static void glMultiTexCoord4ivARB(@NativeType("GLenum") int texture, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord4ivARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(texture, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord4dvARB MultiTexCoord4dvARB} */ + public static void glMultiTexCoord4dvARB(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord4dvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(texture, v, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBOcclusionQuery.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBOcclusionQuery.java new file mode 100644 index 000000000..0ea0f2f13 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBOcclusionQuery.java @@ -0,0 +1,350 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_occlusion_query extension. + * + *

    This extension defines a mechanism whereby an application can query the number of pixels (or, more precisely, samples) drawn by a primitive or group of + * primitives.

    + * + *

    The primary purpose of such a query (hereafter referred to as an "occlusion query") is to determine the visibility of an object. Typically, the + * application will render the major occluders in the scene, then perform an occlusion query for the bounding box of each detail object in the scene. Only + * if said bounding box is visible, i.e., if at least one sample is drawn, should the corresponding object be drawn.

    + * + *

    The earlier HP_occlusion_test extension defined a similar mechanism, but it had two major shortcomings.

    + * + *
      + *
    • It returned the result as a simple {@link GL11#GL_TRUE TRUE}/{@link GL11#GL_FALSE FALSE} result, when in fact it is often useful to know exactly how many samples were drawn.
    • + *
    • It provided only a simple "stop-and-wait" model for using multiple queries. The application begins an occlusion test and ends it; then, at some + * later point, it asks for the result, at which point the driver must stop and wait until the result from the previous test is back before the + * application can even begin the next one. This is a very simple model, but its performance is mediocre when an application wishes to perform many + * queries, and it eliminates most of the opportunities for parallelism between the CPU and GPU.
    • + *
    + * + *

    This extension solves both of those problems. It returns as its result the number of samples that pass the depth and stencil tests, and it encapsulates + * occlusion queries in "query objects" that allow applications to issue many queries before asking for the result of any one. As a result, they can + * overlap the time it takes for the occlusion query results to be returned with other, more useful work, such as rendering other parts of the scene or + * performing other computations on the CPU.

    + * + *

    There are many situations where a pixel/sample count, rather than a boolean result, is useful.

    + * + *
      + *
    • Objects that are visible but cover only a very small number of pixels can be skipped at a minimal reduction of image quality.
    • + *
    • Knowing exactly how many pixels an object might cover may help the application decide which level-of-detail model should be used. If only a few + * pixels are visible, a low-detail model may be acceptable.
    • + *
    • "Depth peeling" techniques, such as order-independent transparency, need to know when to stop rendering more layers; it is difficult to determine a + * priori how many layers are needed. A boolean result allows applications to stop when more layers will not affect the image at all, but this will + * likely result in unacceptable performance. Instead, it makes more sense to stop rendering when the number of pixels in each layer falls below a + * given threshold.
    • + *
    • Occlusion queries can replace glReadPixels of the depth buffer to determine whether (for example) a light source is visible for the purposes of a + * lens flare effect or a halo to simulate glare. Pixel counts allow you to compute the percentage of the light source that is visible, and the + * brightness of these effects can be modulated accordingly.
    • + *
    + * + *

    Promoted to core in {@link GL15 OpenGL 1.5}.

    + */ +public class ARBOcclusionQuery { + + static { GL.initialize(); } + + /** Accepted by the {@code target} parameter of BeginQueryARB, EndQueryARB, and GetQueryivARB. */ + public static final int GL_SAMPLES_PASSED_ARB = 0x8914; + + /** Accepted by the {@code pname} parameter of GetQueryivARB. */ + public static final int + GL_QUERY_COUNTER_BITS_ARB = 0x8864, + GL_CURRENT_QUERY_ARB = 0x8865; + + /** Accepted by the {@code pname} parameter of GetQueryObjectivARB and GetQueryObjectuivARB. */ + public static final int + GL_QUERY_RESULT_ARB = 0x8866, + GL_QUERY_RESULT_AVAILABLE_ARB = 0x8867; + + protected ARBOcclusionQuery() { + throw new UnsupportedOperationException(); + } + + // --- [ glGenQueriesARB ] --- + + /** + * Unsafe version of: {@link #glGenQueriesARB GenQueriesARB} + * + * @param n the number of query object names to be generated + */ + public static native void nglGenQueriesARB(int n, long ids); + + /** + * Generates query object names. + * + * @param ids a buffer in which the generated query object names are stored + */ + public static void glGenQueriesARB(@NativeType("GLuint *") IntBuffer ids) { + nglGenQueriesARB(ids.remaining(), memAddress(ids)); + } + + /** Generates query object names. */ + @NativeType("void") + public static int glGenQueriesARB() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.callocInt(1); + nglGenQueriesARB(1, memAddress(ids)); + return ids.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDeleteQueriesARB ] --- + + /** + * Unsafe version of: {@link #glDeleteQueriesARB DeleteQueriesARB} + * + * @param n the number of query objects to be deleted + */ + public static native void nglDeleteQueriesARB(int n, long ids); + + /** + * Deletes named query objects. + * + * @param ids an array of query objects to be deleted + */ + public static void glDeleteQueriesARB(@NativeType("GLuint const *") IntBuffer ids) { + nglDeleteQueriesARB(ids.remaining(), memAddress(ids)); + } + + /** Deletes named query objects. */ + public static void glDeleteQueriesARB(@NativeType("GLuint const *") int id) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.ints(id); + nglDeleteQueriesARB(1, memAddress(ids)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsQueryARB ] --- + + /** + * Determine if a name corresponds to a query object. + * + * @param id a value that may be the name of a query object + */ + @NativeType("GLboolean") + public static native boolean glIsQueryARB(@NativeType("GLuint") int id); + + // --- [ glBeginQueryARB ] --- + + /** + * Creates a query object and makes it active. + * + * @param target the target type of query object established. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param id the name of a query object + */ + public static native void glBeginQueryARB(@NativeType("GLenum") int target, @NativeType("GLuint") int id); + + // --- [ glEndQueryARB ] --- + + /** + * Marks the end of the sequence of commands to be tracked for the active query specified by {@code target}. + * + * @param target the query object target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + */ + public static native void glEndQueryARB(@NativeType("GLenum") int target); + + // --- [ glGetQueryivARB ] --- + + /** Unsafe version of: {@link #glGetQueryivARB GetQueryivARB} */ + public static native void nglGetQueryivARB(int target, int pname, long params); + + /** + * Returns parameters of a query object target. + * + * @param target the query object target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param pname the symbolic name of a query object target parameter. One of:
    {@link #GL_QUERY_COUNTER_BITS_ARB QUERY_COUNTER_BITS_ARB}{@link #GL_CURRENT_QUERY_ARB CURRENT_QUERY_ARB}
    + * @param params the requested data + */ + public static void glGetQueryivARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetQueryivARB(target, pname, memAddress(params)); + } + + /** + * Returns parameters of a query object target. + * + * @param target the query object target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param pname the symbolic name of a query object target parameter. One of:
    {@link #GL_QUERY_COUNTER_BITS_ARB QUERY_COUNTER_BITS_ARB}{@link #GL_CURRENT_QUERY_ARB CURRENT_QUERY_ARB}
    + */ + @NativeType("void") + public static int glGetQueryiARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetQueryivARB(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetQueryObjectivARB ] --- + + /** Unsafe version of: {@link #glGetQueryObjectivARB GetQueryObjectivARB} */ + public static native void nglGetQueryObjectivARB(int id, int pname, long params); + + /** + * Returns the integer value of a query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT_ARB QUERY_RESULT_ARB}{@link #GL_QUERY_RESULT_AVAILABLE_ARB QUERY_RESULT_AVAILABLE_ARB}
    + * @param params the requested data + */ + public static void glGetQueryObjectivARB(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetQueryObjectivARB(id, pname, memAddress(params)); + } + + /** + * Returns the integer value of a query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT_ARB QUERY_RESULT_ARB}{@link #GL_QUERY_RESULT_AVAILABLE_ARB QUERY_RESULT_AVAILABLE_ARB}
    + * @param params the requested data + */ + public static void glGetQueryObjectivARB(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint *") long params) { + nglGetQueryObjectivARB(id, pname, params); + } + + /** + * Returns the integer value of a query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT_ARB QUERY_RESULT_ARB}{@link #GL_QUERY_RESULT_AVAILABLE_ARB QUERY_RESULT_AVAILABLE_ARB}
    + */ + @NativeType("void") + public static int glGetQueryObjectiARB(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetQueryObjectivARB(id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetQueryObjectuivARB ] --- + + /** Unsafe version of: {@link #glGetQueryObjectuivARB GetQueryObjectuivARB} */ + public static native void nglGetQueryObjectuivARB(int id, int pname, long params); + + /** + * Unsigned version of {@link #glGetQueryObjectivARB GetQueryObjectivARB}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT_ARB QUERY_RESULT_ARB}{@link #GL_QUERY_RESULT_AVAILABLE_ARB QUERY_RESULT_AVAILABLE_ARB}
    + * @param params the requested data + */ + public static void glGetQueryObjectuivARB(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetQueryObjectuivARB(id, pname, memAddress(params)); + } + + /** + * Unsigned version of {@link #glGetQueryObjectivARB GetQueryObjectivARB}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT_ARB QUERY_RESULT_ARB}{@link #GL_QUERY_RESULT_AVAILABLE_ARB QUERY_RESULT_AVAILABLE_ARB}
    + * @param params the requested data + */ + public static void glGetQueryObjectuivARB(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint *") long params) { + nglGetQueryObjectuivARB(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjectivARB GetQueryObjectivARB}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT_ARB QUERY_RESULT_ARB}{@link #GL_QUERY_RESULT_AVAILABLE_ARB QUERY_RESULT_AVAILABLE_ARB}
    + */ + @NativeType("void") + public static int glGetQueryObjectuiARB(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetQueryObjectuivARB(id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glGenQueriesARB GenQueriesARB} */ + public static void glGenQueriesARB(@NativeType("GLuint *") int[] ids) { + long __functionAddress = GL.getICD().glGenQueriesARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(ids.length, ids, __functionAddress); + } + + /** Array version of: {@link #glDeleteQueriesARB DeleteQueriesARB} */ + public static void glDeleteQueriesARB(@NativeType("GLuint const *") int[] ids) { + long __functionAddress = GL.getICD().glDeleteQueriesARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(ids.length, ids, __functionAddress); + } + + /** Array version of: {@link #glGetQueryivARB GetQueryivARB} */ + public static void glGetQueryivARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetQueryivARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetQueryObjectivARB GetQueryObjectivARB} */ + public static void glGetQueryObjectivARB(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetQueryObjectivARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(id, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetQueryObjectuivARB GetQueryObjectuivARB} */ + public static void glGetQueryObjectuivARB(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetQueryObjectuivARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(id, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBOcclusionQuery2.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBOcclusionQuery2.java new file mode 100644 index 000000000..325b74405 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBOcclusionQuery2.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_occlusion_query2 extension. + * + *

    This extension trivially adds a boolean occlusion query to {@link ARBOcclusionQuery ARB_occlusion_query}.

    + * + *

    While the counter-based occlusion query provided by ARB_occlusion_query is flexible, there is still value to a simple boolean, which is often sufficient + * for applications.

    + * + *

    Promoted to core in {@link GL33 OpenGL 3.3}.

    + */ +public final class ARBOcclusionQuery2 { + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int GL_ANY_SAMPLES_PASSED = 0x8C2F; + + private ARBOcclusionQuery2() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBParallelShaderCompile.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBParallelShaderCompile.java new file mode 100644 index 000000000..fb3e86cd5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBParallelShaderCompile.java @@ -0,0 +1,49 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_parallel_shader_compile extension. + * + *

    Compiling GLSL into implementation-specific code can be a time consuming process, so a GL implementation may wish to perform the compilation in a + * separate CPU thread. This extension provides a mechanism for the application to provide a hint to limit the number of threads it wants to be used to + * compile shaders, as well as a query to determine if the compilation process is complete.

    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ +public class ARBParallelShaderCompile { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_SHADER_COMPILER_THREADS_ARB = 0x91B0; + + /** Accepted as part of the {@code pname} parameter to GetShaderiv() and accepted as part of the {@code pname} parameter to GetProgramiv(). */ + public static final int GL_COMPLETION_STATUS_ARB = 0x91B1; + + protected ARBParallelShaderCompile() { + throw new UnsupportedOperationException(); + } + + // --- [ glMaxShaderCompilerThreadsARB ] --- + + /** + * Application may use the following to hint to the driver the maximum number background threads it would like to be used in the process of compiling + * shaders or linking programs. + * + *

    An implementation may combine the maximum compiler thread request from multiple contexts in a share group in an implementation-specific way.

    + * + *

    An application can query the current MaxShaderCompilerThreads() {@code count} by calling {@link GL11C#glGetIntegerv GetIntegerv} with {@code pname} set to + * {@link #GL_MAX_SHADER_COMPILER_THREADS_ARB MAX_SHADER_COMPILER_THREADS_ARB}.

    + * + * @param count the number of background threads. A {@code count} of zero specifies a request for no parallel compiling or linking and a {@code count} of + * {@code 0xFFFFFFFF} requests an implementation-specific maximum. + */ + public static native void glMaxShaderCompilerThreadsARB(@NativeType("GLuint") int count); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPipelineStatisticsQuery.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPipelineStatisticsQuery.java new file mode 100644 index 000000000..38fa85845 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPipelineStatisticsQuery.java @@ -0,0 +1,45 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_pipeline_statistics_query extension. + * + *

    This extension introduces new query types that allow applications to get statistics information about different parts of the pipeline:

    + * + *
      + *
    • Number of vertices and primitives issued to the GL.
    • + *
    • Number of times a vertex shader, tessellation evaluation shader, geometry shader, fragment shader, and compute shader was invoked.
    • + *
    • Number of patches processed by the tessellation control shader stage.
    • + *
    • Number of primitives emitted by a geometry shader.
    • + *
    • Number of primitives that entered the primitive clipping stage.
    • + *
    • Number of primitives that are output by the primitive clipping stage.
    • + *
    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ +public final class ARBPipelineStatisticsQuery { + + /** + * Accepted by the {@code target} parameter of {@link GL15C#glBeginQuery BeginQuery}, {@link GL15C#glEndQuery EndQuery}, {@link GL15C#glGetQueryiv GetQueryiv}, + * {@link GL40C#glBeginQueryIndexed BeginQueryIndexed}, {@link GL40C#glEndQueryIndexed EndQueryIndexed} and {@link GL40C#glGetQueryIndexediv GetQueryIndexediv}. + */ + public static final int + GL_VERTICES_SUBMITTED_ARB = 0x82EE, + GL_PRIMITIVES_SUBMITTED_ARB = 0x82EF, + GL_VERTEX_SHADER_INVOCATIONS_ARB = 0x82F0, + GL_TESS_CONTROL_SHADER_PATCHES_ARB = 0x82F1, + GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB = 0x82F2, + GL_GEOMETRY_SHADER_INVOCATIONS = 0x887F, + GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB = 0x82F3, + GL_FRAGMENT_SHADER_INVOCATIONS_ARB = 0x82F4, + GL_COMPUTE_SHADER_INVOCATIONS_ARB = 0x82F5, + GL_CLIPPING_INPUT_PRIMITIVES_ARB = 0x82F6, + GL_CLIPPING_OUTPUT_PRIMITIVES_ARB = 0x82F7; + + private ARBPipelineStatisticsQuery() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPixelBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPixelBufferObject.java new file mode 100644 index 000000000..2fc510d77 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPixelBufferObject.java @@ -0,0 +1,65 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_pixel_buffer_object extension. + * + *

    This extension expands on the interface provided by the {@link ARBVertexBufferObject ARB_vertex_buffer_object} extension (and later integrated into {@link GL15 OpenGL 1.5}) in order to + * permit buffer objects to be used not only with vertex array data, but also with pixel data. The intent is to provide more acceleration opportunities + * for OpenGL pixel commands.

    + * + *

    While a single buffer object can be bound for both vertex arrays and pixel commands, we use the designations vertex buffer object (VBO) and pixel buffer + * object (PBO) to indicate their particular usage in a given situation.

    + * + *

    Recall that buffer objects conceptually are nothing more than arrays of bytes, just like any chunk of memory. {@link ARBVertexBufferObject ARB_vertex_buffer_object} allows GL + * commands to source data from a buffer object by binding the buffer object to a given target and then overloading a certain set of GL commands' pointer + * arguments to refer to offsets inside the buffer, rather than pointers to user memory. An offset is encoded in a pointer by adding the offset to a null + * pointer.

    + * + *

    This extension does not add any new functionality to buffer objects themselves. It simply adds two new targets to which buffer objects can be bound: + * {@link #GL_PIXEL_PACK_BUFFER_ARB PIXEL_PACK_BUFFER_ARB} and {@link #GL_PIXEL_UNPACK_BUFFER_ARB PIXEL_UNPACK_BUFFER_ARB}. When a buffer object is bound to the {@link #GL_PIXEL_PACK_BUFFER_ARB PIXEL_PACK_BUFFER_ARB} target, commands such as + * {@link GL11C#glReadPixels ReadPixels} pack (write) their data into a buffer object. When a buffer object is bound to the {@link #GL_PIXEL_UNPACK_BUFFER_ARB PIXEL_UNPACK_BUFFER_ARB} target, commands such as + * {@link GL11#glDrawPixels DrawPixels} and {@link GL11C#glTexImage2D TexImage2D} unpack (read) their data from a buffer object.

    + * + *

    There are a several approaches to improve graphics performance with PBOs. Some of the most interesting approaches are:

    + * + *
      + *
    • Streaming texture updates: If the application uses {@link GL15C#glMapBuffer MapBuffer}/{@link GL15C#glUnmapBuffer UnmapBuffer} to write its data for glTexSubImage into a buffer object, at + * least one of the data copies usually required to download a texture can be eliminated, significantly increasing texture download performance.
    • + *
    • Streaming draw pixels: When {@link GL11#glDrawPixels DrawPixels} sources client memory, OpenGL says the client memory can be modified immediately after the + * glDrawPixels command returns without disturbing the drawn image. This typically necessitates unpacking and copying the image prior to glDrawPixels + * returning. However, when using glDrawPixels with a pixel pack buffer object, glDrawPixels may return prior to image unpacking because future + * modification of the buffer data requires explicit commands ({@link GL15C#glMapBuffer MapBuffer}, {@link GL15C#glBufferData BufferData}, or {@link GL15C#glBufferSubData BufferSubData}).
    • + *
    • Asynchronous {@link GL11C#glReadPixels ReadPixels}: If an application needs to read back a number of images and process them with the CPU, the existing GL interface + * makes it nearly impossible to pipeline this operation. The driver will typically send the hardware a readback command when glReadPixels is called, + * and then wait for all of the data to be available before returning control to the application. Then, the application can either process the data + * immediately or call glReadPixels again; in neither case will the readback overlap with the processing. If the application issues several readbacks + * into several buffer objects, however, and then maps each one to process its data, then the readbacks can proceed in parallel with the data processing.
    • + *
    • Render to vertex array: The application can use a fragment program to render some image into one of its buffers, then read this image out into a + * buffer object via {@link GL11C#glReadPixels ReadPixels}. Then, it can use this buffer object as a source of vertex data.
    • + *
    + * + *

    Requires {@link GL15 OpenGL 1.5} or {@link ARBVertexBufferObject ARB_vertex_buffer_object}. Promoted to core in {@link GL21 OpenGL 2.1}.

    + */ +public final class ARBPixelBufferObject { + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferParameteriv, and + * GetBufferPointerv. + */ + public static final int + GL_PIXEL_PACK_BUFFER_ARB = 0x88EB, + GL_PIXEL_UNPACK_BUFFER_ARB = 0x88EC; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_PIXEL_PACK_BUFFER_BINDING_ARB = 0x88ED, + GL_PIXEL_UNPACK_BUFFER_BINDING_ARB = 0x88EF; + + private ARBPixelBufferObject() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPointParameters.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPointParameters.java new file mode 100644 index 000000000..d5c8d9525 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPointParameters.java @@ -0,0 +1,88 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_point_parameters extension. + * + *

    This extension supports additional geometric characteristics of points. It can be used to render particles or tiny light sources, commonly referred to + * as "Light points".

    + * + *

    The raster brightness of a point is a function of the point area, point color, point transparency, and the response of the display's electron gun and + * phosphor. The point area and the point transparency are derived from the point size, currently provided with the {@code size} parameter of + * {@link GL11C#glPointSize PointSize}.

    + * + *

    The primary motivation is to allow the size of a point to be affected by distance attenuation. When distance attenuation has an effect, the final point + * size decreases as the distance of the point from the eye increases.

    + * + *

    The secondary motivation is a mean to control the mapping from the point size to the raster point area and point transparency. This is done in order to + * increase the dynamic range of the raster brightness of points. In other words, the alpha component of a point may be decreased (and its transparency + * increased) as its area shrinks below a defined threshold.

    + * + *

    Promoted to core in {@link GL14 OpenGL 1.4}.

    + */ +public class ARBPointParameters { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of PointParameterfvARB, and the {@code pname} of Get. */ + public static final int + GL_POINT_SIZE_MIN_ARB = 0x8126, + GL_POINT_SIZE_MAX_ARB = 0x8127, + GL_POINT_FADE_THRESHOLD_SIZE_ARB = 0x8128, + GL_POINT_DISTANCE_ATTENUATION_ARB = 0x8129; + + protected ARBPointParameters() { + throw new UnsupportedOperationException(); + } + + // --- [ glPointParameterfARB ] --- + + /** + * Sets the float value of a pointer parameter. + * + * @param pname the parameter to set. One of:
    {@link #GL_POINT_SIZE_MIN_ARB POINT_SIZE_MIN_ARB}{@link #GL_POINT_SIZE_MAX_ARB POINT_SIZE_MAX_ARB}{@link #GL_POINT_FADE_THRESHOLD_SIZE_ARB POINT_FADE_THRESHOLD_SIZE_ARB}
    + * @param param the parameter value + */ + public static native void glPointParameterfARB(@NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glPointParameterfvARB ] --- + + /** Unsafe version of: {@link #glPointParameterfvARB PointParameterfvARB} */ + public static native void nglPointParameterfvARB(int pname, long params); + + /** + * Pointer version of {@link #glPointParameterfARB PointParameterfARB}. + * + * @param pname the parameter to set. Must be:
    {@link #GL_POINT_DISTANCE_ATTENUATION_ARB POINT_DISTANCE_ATTENUATION_ARB}
    + * @param params the parameter value + */ + public static void glPointParameterfvARB(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 3); + } + nglPointParameterfvARB(pname, memAddress(params)); + } + + /** Array version of: {@link #glPointParameterfvARB PointParameterfvARB} */ + public static void glPointParameterfvARB(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glPointParameterfvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 3); + } + callPV(pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPointSprite.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPointSprite.java new file mode 100644 index 000000000..20150ad8f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPointSprite.java @@ -0,0 +1,40 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_point_sprite extension. + * + *

    Applications such as particle systems have tended to use OpenGL quads rather than points to render their geometry, since they would like to use a + * custom-drawn texture for each particle, rather than the traditional OpenGL round antialiased points, and each fragment in a point has the same texture + * coordinates as every other fragment.

    + * + *

    Unfortunately, specifying the geometry for these quads can be expensive, since it quadruples the amount of geometry required, and may also require the + * application to do extra processing to compute the location of each vertex.

    + * + *

    The purpose of this extension is to allow such applications to use points rather than quads. When {@link #GL_POINT_SPRITE_ARB POINT_SPRITE_ARB} is enabled, the state of point + * antialiasing is ignored. For each texture unit, the app can then specify whether to replace the existing texture coordinates with point sprite texture + * coordinates, which are interpolated across the point.

    + * + *

    Promoted to core in {@link GL20 OpenGL 2.0}.

    + */ +public final class ARBPointSprite { + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of TexEnvi, TexEnviv, TexEnvf, TexEnvfv, GetTexEnviv, and GetTexEnvfv. + */ + public static final int GL_POINT_SPRITE_ARB = 0x8861; + + /** + * When the {@code target} parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, GetTexEnvfv, or GetTexEnviv is POINT_SPRITE_ARB, then the value of + * {@code pname} may be. + */ + public static final int GL_COORD_REPLACE_ARB = 0x8862; + + private ARBPointSprite() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPolygonOffsetClamp.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPolygonOffsetClamp.java new file mode 100644 index 000000000..37e85d29b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBPolygonOffsetClamp.java @@ -0,0 +1,52 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_polygon_offset_clamp extension. + * + *

    This extension adds a new parameter to the polygon offset function that clamps the calculated offset to a minimum or maximum value. The clamping + * functionality is useful when polygons are nearly parallel to the view direction because their high slopes can result in arbitrarily large polygon + * offsets. In the particular case of shadow mapping, the lack of clamping can produce the appearance of unwanted holes when the shadow casting polygons + * are offset beyond the shadow receiving polygons, and this problem can be alleviated by enforcing a maximum offset value.

    + * + *

    Requires {@link GL33 OpenGL 3.3}.

    + */ +public class ARBPolygonOffsetClamp { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_POLYGON_OFFSET_CLAMP = 0x8E1B; + + protected ARBPolygonOffsetClamp() { + throw new UnsupportedOperationException(); + } + + // --- [ glPolygonOffsetClamp ] --- + + /** + * The depth values of all fragments generated by the rasterization of a polygon may be offset by a single value that is computed for that polygon. This + * function determines this value. + * + *

    {@code factor} scales the maximum depth slope of the polygon, and {@code units} scales an implementation-dependent constant that relates to the usable + * resolution of the depth buffer. The resulting values are summed to produce the polygon offset value, which may then be clamped to a minimum or maximum + * value specified by {@code clamp}.

    + * + *

    The values {@code factor}, {@code units}, and {@code clamp} may each be positive, negative, or zero. Calling the command {@link GL11C#glPolygonOffset PolygonOffset} is equivalent + * to calling the command {@code PolygonOffsetClamp} with clamp equal to zero.

    + * + * @param factor scales the maximum depth slope of the polygon + * @param units scales an implementation-dependent constant that relates to the usable resolution of the depth buffer + * @param clamp the minimum or maximum polygon offset value + */ + public static void glPolygonOffsetClamp(@NativeType("GLfloat") float factor, @NativeType("GLfloat") float units, @NativeType("GLfloat") float clamp) { + GL46C.glPolygonOffsetClamp(factor, units, clamp); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBProgramInterfaceQuery.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBProgramInterfaceQuery.java new file mode 100644 index 000000000..11da8858f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBProgramInterfaceQuery.java @@ -0,0 +1,319 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_program_interface_query extension. + * + *

    This extension provides a single unified set of query commands that can be used by applications to determine properties of various interfaces and + * resources used by program objects to communicate with application code, fixed-function OpenGL pipeline stages, and other programs. In unextended OpenGL + * 4.2, there is a separate set of query commands for each different type of interface or resource used by the program. These different sets of queries are + * structured nearly identically, but the queries for some interfaces have limited capability (e.g., there is no ability to enumerate fragment shader + * outputs).

    + * + *

    With the single set of query commands provided by this extension, a consistent set of queries is available for all interfaces, and a new interface can + * be added without having to introduce a completely new set of query commands. These queries are intended to provide a superset of the capabilities + * provided by similar queries in OpenGL 4.2, and should allow for the deprecation of the existing queries.

    + * + *

    This extension defines two terms: interfaces and active resources. Each interface of a program object provides a way for the program to communicate with + * application code, fixed-function OpenGL pipeline stages, and other programs. Examples of interfaces for a program object include inputs (receiving + * values from vertex attributes or outputs of other programs), outputs (sending values to other programs or per-fragment operations), uniforms (receiving + * values from API calls), uniform blocks (receiving values from bound buffer objects), subroutines and subroutine uniforms (receiving API calls to + * indicate functions to call during program execution), and atomic counter buffers (holding values to be manipulated by atomic counter shader functions). + * Each interface of a program has a set of active resources used by the program. For example, the resources of a program's input interface includes all + * active input variables used by the first stage of the program. The resources of a program's uniform block interface consists of the set of uniform + * blocks with at least one member used by any shader in the program.

    + * + *

    Requires {@link GL20 OpenGL 2.0}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBProgramInterfaceQuery { + + static { GL.initialize(); } + + /** + * Accepted by the {@code programInterface} parameter of GetProgramInterfaceiv, GetProgramResourceIndex, GetProgramResourceName, GetProgramResourceiv, + * GetProgramResourceLocation, and GetProgramResourceLocationIndex. + */ + public static final int + GL_UNIFORM = 0x92E1, + GL_UNIFORM_BLOCK = 0x92E2, + GL_PROGRAM_INPUT = 0x92E3, + GL_PROGRAM_OUTPUT = 0x92E4, + GL_BUFFER_VARIABLE = 0x92E5, + GL_SHADER_STORAGE_BLOCK = 0x92E6, + GL_VERTEX_SUBROUTINE = 0x92E8, + GL_TESS_CONTROL_SUBROUTINE = 0x92E9, + GL_TESS_EVALUATION_SUBROUTINE = 0x92EA, + GL_GEOMETRY_SUBROUTINE = 0x92EB, + GL_FRAGMENT_SUBROUTINE = 0x92EC, + GL_COMPUTE_SUBROUTINE = 0x92ED, + GL_VERTEX_SUBROUTINE_UNIFORM = 0x92EE, + GL_TESS_CONTROL_SUBROUTINE_UNIFORM = 0x92EF, + GL_TESS_EVALUATION_SUBROUTINE_UNIFORM = 0x92F0, + GL_GEOMETRY_SUBROUTINE_UNIFORM = 0x92F1, + GL_FRAGMENT_SUBROUTINE_UNIFORM = 0x92F2, + GL_COMPUTE_SUBROUTINE_UNIFORM = 0x92F3, + GL_TRANSFORM_FEEDBACK_VARYING = 0x92F4; + + /** Accepted by the {@code pname} parameter of GetProgramInterfaceiv. */ + public static final int + GL_ACTIVE_RESOURCES = 0x92F5, + GL_MAX_NAME_LENGTH = 0x92F6, + GL_MAX_NUM_ACTIVE_VARIABLES = 0x92F7, + GL_MAX_NUM_COMPATIBLE_SUBROUTINES = 0x92F8; + + /** Accepted in the {@code props} array of GetProgramResourceiv. */ + public static final int + GL_NAME_LENGTH = 0x92F9, + GL_TYPE = 0x92FA, + GL_ARRAY_SIZE = 0x92FB, + GL_OFFSET = 0x92FC, + GL_BLOCK_INDEX = 0x92FD, + GL_ARRAY_STRIDE = 0x92FE, + GL_MATRIX_STRIDE = 0x92FF, + GL_IS_ROW_MAJOR = 0x9300, + GL_ATOMIC_COUNTER_BUFFER_INDEX = 0x9301, + GL_BUFFER_BINDING = 0x9302, + GL_BUFFER_DATA_SIZE = 0x9303, + GL_NUM_ACTIVE_VARIABLES = 0x9304, + GL_ACTIVE_VARIABLES = 0x9305, + GL_REFERENCED_BY_VERTEX_SHADER = 0x9306, + GL_REFERENCED_BY_TESS_CONTROL_SHADER = 0x9307, + GL_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x9308, + GL_REFERENCED_BY_GEOMETRY_SHADER = 0x9309, + GL_REFERENCED_BY_FRAGMENT_SHADER = 0x930A, + GL_REFERENCED_BY_COMPUTE_SHADER = 0x930B, + GL_TOP_LEVEL_ARRAY_SIZE = 0x930C, + GL_TOP_LEVEL_ARRAY_STRIDE = 0x930D, + GL_LOCATION = 0x930E, + GL_LOCATION_INDEX = 0x930F, + GL_IS_PER_PATCH = 0x92E7; + + protected ARBProgramInterfaceQuery() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetProgramInterfaceiv ] --- + + /** Unsafe version of: {@link #glGetProgramInterfaceiv GetProgramInterfaceiv} */ + public static void nglGetProgramInterfaceiv(int program, int programInterface, int pname, long params) { + GL43C.nglGetProgramInterfaceiv(program, programInterface, pname, params); + } + + /** + * Queries a property of an interface in a program. + * + * @param program the name of a program object whose interface to query + * @param programInterface a token identifying the interface within {@code program} to query. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param pname the name of the parameter within {@code programInterface} to query. One of:
    {@link GL43C#GL_ACTIVE_RESOURCES ACTIVE_RESOURCES}{@link GL43C#GL_MAX_NAME_LENGTH MAX_NAME_LENGTH}{@link GL43C#GL_MAX_NUM_ACTIVE_VARIABLES MAX_NUM_ACTIVE_VARIABLES}
    {@link GL43C#GL_MAX_NUM_COMPATIBLE_SUBROUTINES MAX_NUM_COMPATIBLE_SUBROUTINES}
    + * @param params a variable to retrieve the value of {@code pname} for the program interface + */ + public static void glGetProgramInterfaceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL43C.glGetProgramInterfaceiv(program, programInterface, pname, params); + } + + /** + * Queries a property of an interface in a program. + * + * @param program the name of a program object whose interface to query + * @param programInterface a token identifying the interface within {@code program} to query. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param pname the name of the parameter within {@code programInterface} to query. One of:
    {@link GL43C#GL_ACTIVE_RESOURCES ACTIVE_RESOURCES}{@link GL43C#GL_MAX_NAME_LENGTH MAX_NAME_LENGTH}{@link GL43C#GL_MAX_NUM_ACTIVE_VARIABLES MAX_NUM_ACTIVE_VARIABLES}
    {@link GL43C#GL_MAX_NUM_COMPATIBLE_SUBROUTINES MAX_NUM_COMPATIBLE_SUBROUTINES}
    + */ + @NativeType("void") + public static int glGetProgramInterfacei(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLenum") int pname) { + return GL43C.glGetProgramInterfacei(program, programInterface, pname); + } + + // --- [ glGetProgramResourceIndex ] --- + + /** Unsafe version of: {@link #glGetProgramResourceIndex GetProgramResourceIndex} */ + public static int nglGetProgramResourceIndex(int program, int programInterface, long name) { + return GL43C.nglGetProgramResourceIndex(program, programInterface, name); + } + + /** + * Queries the index of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {Wcode name}. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param name the name of the resource to query the index of + */ + @NativeType("GLuint") + public static int glGetProgramResourceIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") ByteBuffer name) { + return GL43C.glGetProgramResourceIndex(program, programInterface, name); + } + + /** + * Queries the index of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {Wcode name}. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param name the name of the resource to query the index of + */ + @NativeType("GLuint") + public static int glGetProgramResourceIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") CharSequence name) { + return GL43C.glGetProgramResourceIndex(program, programInterface, name); + } + + // --- [ glGetProgramResourceName ] --- + + /** + * Unsafe version of: {@link #glGetProgramResourceName GetProgramResourceName} + * + * @param bufSize the size of the character array whose address is given by {@code name} + */ + public static void nglGetProgramResourceName(int program, int programInterface, int index, int bufSize, long length, long name) { + GL43C.nglGetProgramResourceName(program, programInterface, index, bufSize, length, name); + } + + /** + * Queries the name of an indexed resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the indexed resource. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the index of the resource within {@code programInterface} of {@code program} + * @param length a variable which will receive the length of the resource name + * @param name a character array into which will be written the name of the resource + */ + public static void glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer name) { + GL43C.glGetProgramResourceName(program, programInterface, index, length, name); + } + + /** + * Queries the name of an indexed resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the indexed resource. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the index of the resource within {@code programInterface} of {@code program} + * @param bufSize the size of the character array whose address is given by {@code name} + */ + @NativeType("void") + public static String glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufSize) { + return GL43C.glGetProgramResourceName(program, programInterface, index, bufSize); + } + + /** + * Queries the name of an indexed resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the indexed resource. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the index of the resource within {@code programInterface} of {@code program} + */ + @NativeType("void") + public static String glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index) { + return glGetProgramResourceName(program, programInterface, index, glGetProgramInterfacei(program, programInterface, GL_MAX_NAME_LENGTH)); + } + + // --- [ glGetProgramResourceiv ] --- + + /** + * Unsafe version of: {@link #glGetProgramResourceiv GetProgramResourceiv} + * + * @param propCount the number of properties in {@code props} + * @param bufSize the size of the integer array whose address is given by {@code params} + */ + public static void nglGetProgramResourceiv(int program, int programInterface, int index, int propCount, long props, int bufSize, long length, long params) { + GL43C.nglGetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params); + } + + /** + * Retrieves values for multiple properties of a single active resource within a program object. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name}. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the active resource index + * @param props an array that will receive the active resource properties + * @param length a variable which will receive the number of values returned + * @param params an array that will receive the property values + */ + public static void glGetProgramResourceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @NativeType("GLenum const *") IntBuffer props, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer params) { + GL43C.glGetProgramResourceiv(program, programInterface, index, props, length, params); + } + + // --- [ glGetProgramResourceLocation ] --- + + /** Unsafe version of: {@link #glGetProgramResourceLocation GetProgramResourceLocation} */ + public static int nglGetProgramResourceLocation(int program, int programInterface, long name) { + return GL43C.nglGetProgramResourceLocation(program, programInterface, name); + } + + /** + * Queries the location of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name} + * @param name the name of the resource to query the location of + */ + @NativeType("GLint") + public static int glGetProgramResourceLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") ByteBuffer name) { + return GL43C.glGetProgramResourceLocation(program, programInterface, name); + } + + /** + * Queries the location of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name} + * @param name the name of the resource to query the location of + */ + @NativeType("GLint") + public static int glGetProgramResourceLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") CharSequence name) { + return GL43C.glGetProgramResourceLocation(program, programInterface, name); + } + + // --- [ glGetProgramResourceLocationIndex ] --- + + /** Unsafe version of: {@link #glGetProgramResourceLocationIndex GetProgramResourceLocationIndex} */ + public static int nglGetProgramResourceLocationIndex(int program, int programInterface, long name) { + return GL43C.nglGetProgramResourceLocationIndex(program, programInterface, name); + } + + /** + * Queries the fragment color index of a named variable within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name}. Must be:
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}
    + * @param name the name of the resource to query the location of + */ + @NativeType("GLint") + public static int glGetProgramResourceLocationIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") ByteBuffer name) { + return GL43C.glGetProgramResourceLocationIndex(program, programInterface, name); + } + + /** + * Queries the fragment color index of a named variable within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name}. Must be:
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}
    + * @param name the name of the resource to query the location of + */ + @NativeType("GLint") + public static int glGetProgramResourceLocationIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") CharSequence name) { + return GL43C.glGetProgramResourceLocationIndex(program, programInterface, name); + } + + /** Array version of: {@link #glGetProgramInterfaceiv GetProgramInterfaceiv} */ + public static void glGetProgramInterfaceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL43C.glGetProgramInterfaceiv(program, programInterface, pname, params); + } + + /** Array version of: {@link #glGetProgramResourceName GetProgramResourceName} */ + public static void glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer name) { + GL43C.glGetProgramResourceName(program, programInterface, index, length, name); + } + + /** Array version of: {@link #glGetProgramResourceiv GetProgramResourceiv} */ + public static void glGetProgramResourceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @NativeType("GLenum const *") int[] props, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] params) { + GL43C.glGetProgramResourceiv(program, programInterface, index, props, length, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBProvokingVertex.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBProvokingVertex.java new file mode 100644 index 000000000..31da8d813 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBProvokingVertex.java @@ -0,0 +1,60 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_provoking_vertex extension. + * + *

    This extension provides an alternative provoking vertex convention for rendering lines, triangles, and (optionally depending on the implementation) + * quads.

    + * + *

    The provoking vertex of a primitive is the vertex that determines the constant primary and secondary colors when flat shading is enabled.

    + * + *

    In OpenGL, the provoking vertex for triangle, quad, line, and (trivially) point primitives is the last vertex used to assemble the primitive. The + * polygon primitive is an exception in OpenGL where the first vertex of a polygon primitive determines the color of the polygon, even if actually broken + * into triangles and/or quads.

    + * + *

    Alternatively the provoking vertex could be the first vertex of the primitive. Other APIs with flat-shading functionality such as Reality Lab and + * Direct3D have adopted the "first vertex of the primitive" convention to determine the provoking vertex. However, these APIs lack quads so do not have a + * defined provoking vertex convention for quads.

    + * + *

    The motivation for this extension is to allow applications developed for APIs with a "first vertex of the primitive" provoking vertex to be easily + * converted to OpenGL.

    + * + *

    Promoted to core in {@link GL32 OpenGL 3.2}.

    + */ +public class ARBProvokingVertex { + + static { GL.initialize(); } + + /** Accepted by the {@code mode} parameter of ProvokingVertex. */ + public static final int + GL_FIRST_VERTEX_CONVENTION = 0x8E4D, + GL_LAST_VERTEX_CONVENTION = 0x8E4E; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_PROVOKING_VERTEX = 0x8E4F, + GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 0x8E4C; + + protected ARBProvokingVertex() { + throw new UnsupportedOperationException(); + } + + // --- [ glProvokingVertex ] --- + + /** + * Specifies the vertex to be used as the source of data for flat shaded varyings. + * + * @param mode the provoking vertex mode. One of:
    {@link GL32C#GL_FIRST_VERTEX_CONVENTION FIRST_VERTEX_CONVENTION}{@link GL32C#GL_LAST_VERTEX_CONVENTION LAST_VERTEX_CONVENTION}
    + */ + public static void glProvokingVertex(@NativeType("GLenum") int mode) { + GL32C.glProvokingVertex(mode); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBQueryBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBQueryBufferObject.java new file mode 100644 index 000000000..180f70dbf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBQueryBufferObject.java @@ -0,0 +1,47 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_query_buffer_object extension. + * + *

    Statistics about the operation of the OpenGL pipeline, such as the number of samples that passed the depth test, the elapsed time between two events or + * the number of vertices written by transform feedback can be retrieved from the GL through query objects. The result of a query object is acquired by the + * application through the OpenGL API into a client provided memory location. Should the result returned by the API be required for use in a shader, it + * must be passed back to the GL via a program uniform or some other mechanism. This requires a round-trip from the GPU to the CPU and back.

    + * + *

    This extension introduces a mechanism whereby the result of a query object may be retrieved into a buffer object instead of client memory. This allows + * the query rsult to be made available to a shader without a round-trip to the CPU for example by subsequently using the buffer object as a uniform + * buffer, texture buffer or other data store visible to the shader. This functionality may also be used to place the results of many query objects into a + * single, large buffer and then map or otherwise read back the entire buffer at a later point in time, avoiding a per-query object CPU-GPU synchronization + * event.

    + * + *

    The extension allows acquiring the result of any query object type supported by the GL implementation into a buffer object. The implementation will + * determine the most efficient method of copying the query result to the buffer.

    + * + *

    Requires {@link GL15 OpenGL 1.5}.

    + */ +public final class ARBQueryBufferObject { + + /** Accepted by the {@code pname} parameter of {@link GL15C#glGetQueryObjectiv GetQueryObjectiv}, {@link GL15C#glGetQueryObjectuiv GetQueryObjectuiv}, {@link GL33C#glGetQueryObjecti64v GetQueryObjecti64v} and {@link GL33C#glGetQueryObjectui64v GetQueryObjectui64v}. */ + public static final int GL_QUERY_RESULT_NO_WAIT = 0x9194; + + /** + * Accepted by the {@code target} parameter of {@link GL15C#glBindBuffer BindBuffer}, {@link GL15C#glBufferData BufferData}, {@link GL15C#glBufferSubData BufferSubData}, {@link GL15C#glMapBuffer MapBuffer}, {@link GL15C#glUnmapBuffer UnmapBuffer}, {@link GL30C#glMapBufferRange MapBufferRange}, + * {@link GL15C#glGetBufferSubData GetBufferSubData}, {@link GL15C#glGetBufferParameteriv GetBufferParameteriv}, {@link GL32C#glGetBufferParameteri64v GetBufferParameteri64v}, {@link GL15C#glGetBufferPointerv GetBufferPointerv}, {@link GL43C#glClearBufferSubData ClearBufferSubData}, and the {@code readtarget} and + * {@code writetarget} parameters of {@link GL31C#glCopyBufferSubData CopyBufferSubData}. + */ + public static final int GL_QUERY_BUFFER = 0x9192; + + /** Accepted by the {@code pname} parameter of {@link GL11C#glGetBooleanv GetBooleanv}, {@link GL11C#glGetIntegerv GetIntegerv}, {@link GL11C#glGetFloatv GetFloatv}, and {@link GL11C#glGetDoublev GetDoublev}. */ + public static final int GL_QUERY_BUFFER_BINDING = 0x9193; + + /** Accepted in the {@code barriers} bitfield in {@link GL42C#glMemoryBarrier MemoryBarrier}. */ + public static final int GL_QUERY_BUFFER_BARRIER_BIT = 0x8000; + + private ARBQueryBufferObject() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBRobustness.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBRobustness.java new file mode 100644 index 000000000..0abf6e460 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBRobustness.java @@ -0,0 +1,1083 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_robustness extension. + * + *

    Several recent trends in how OpenGL integrates into modern computer systems have created new requirements for robustness and security for OpenGL + * rendering contexts.

    + * + *

    Additionally GPU architectures now support hardware fault detection; for example, video memory supporting ECC (error correcting codes) and error + * detection. OpenGL contexts should be capable of recovering from hardware faults such as uncorrectable memory errors. Along with recovery from such + * hardware faults, the recovery mechanism can also allow recovery from video memory access exceptions and system software failures. System software + * failures can be due to device changes or driver failures.

    + * + *

    Demands for increased software robustness and concerns about malware exploiting buffer overflows have lead API designers to provide additional "safe" + * APIs that bound the amount of data returned by an API query. For example, the safer "snprintf" or "_snprintf" routines are prefered over "sprintf".

    + * + *

    The OpenGL API has many such robustness perils. OpenGL queries return (write) some number of bytes to a buffer indicated by a pointer parameter. The + * exact number of bytes written by existing OpenGL queries is not expressed directly by any specific parameter; instead the number of bytes returned is a + * complex function of one or more query arguments, sometimes context state such as pixel store modes or the active texture selector, and the current state + * of an object (such as a texture level's number of total texels). By the standards of modern API design, such queries are not "safe". Making these + * queries safer involves introducing a new query API with an additional parameter that specifies the number of bytes in the buffer and never writing bytes + * beyond that limit.

    + * + *

    Multi-threaded use of OpenGL contexts in a "share group" allow sharing of objects such as textures and programs. Such sharing in conjunction with + * concurrent OpenGL commands stream execution by two or more contexts introduces hazards whereby one context can change objects in ways that can cause + * buffer overflows for another context's OpenGL queries.

    + * + *

    The original {@link ARBVertexBufferObject ARB_vertex_buffer_object} extension includes an issue that explicitly states program termination is allowed when out-of-bounds + * vertex buffer object fetches occur. Modern GPUs capable of DirectX 10 enforce the well-defined behavior of always returning zero values for indices or + * non-fixed components in this case. Older GPUs may require extra checks to enforce well-defined (and termination free) behavior, but this expense is + * warranted when processing potentially untrusted content.

    + * + *

    The intent of this extension is to address some specific robustness goals:

    + * + *
      + *
    • For all existing OpenGL queries, provide additional "safe" APIs that limit data written to user pointers to a buffer size in bytes that is an + * explicit additional parameter of the query.
    • + *
    • Provide a mechanism for an OpenGL application to learn about graphics resets that affect the context. When a graphics reset occurs, the OpenGL + * context becomes unusable and the application must create a new context to continue operation. Detecting a graphics reset happens through an + * inexpensive query.
    • + *
    • Provide an enable to guarantee that out-of-bounds buffer object accesses by the GPU will have deterministic behavior and preclude application + * instability or termination due to an incorrect buffer access. Such accesses include vertex buffer fetches of attributes and indices, and indexed + * reads of uniforms or parameters from buffers.
    • + *
    + * + *

    In one anticipated usage model, WebGL contexts may make use of these robust features to grant greater stability when using untrusted code. WebGL + * contexts cannot call OpenGL commands directly but rather must route all OpenGL API calls through the web browser. It is then the web browser that + * configures the context, using the commands in this extension, to enforce safe behavior. In this scenario, the WebGL content cannot specify or change the + * use of this extension's features itself; the web browser enforces this policy.

    + * + *

    There are other well-known robustness issues with the OpenGL API which this extension does not address. For example, selector-based OpenGL commands are + * a well-known source of programming errors. Code to manipulate texture state may assume the active texture selector is set appropriately when an + * intervening function call obscures a change to the active texture state resulting in incorrectly updated or queried state. The + * {@link EXTDirectStateAccess EXT_direct_state_access} extension introduces selector-free OpenGL commands and queries to address that particular issue so this extension does + * not.

    + * + *

    The intent of this extension is NOT to deprecate any existing API and thereby introduce compatibility issues and coding burdens on existing code, but + * rather to provide new APIs to ensure a level of robustness commensurate with the expectations of modern applications of OpenGL.

    + */ +public class ARBRobustness { + + static { GL.initialize(); } + + /** Returned by GetGraphicsResetStatusARB. */ + public static final int + GL_GUILTY_CONTEXT_RESET_ARB = 0x8253, + GL_INNOCENT_CONTEXT_RESET_ARB = 0x8254, + GL_UNKNOWN_CONTEXT_RESET_ARB = 0x8255; + + /** Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_RESET_NOTIFICATION_STRATEGY_ARB = 0x8256; + + /** Returned by GetIntegerv and related simple queries when {@code value} is RESET_NOTIFICATION_STRATEGY_ARB. */ + public static final int + GL_LOSE_CONTEXT_ON_RESET_ARB = 0x8252, + GL_NO_RESET_NOTIFICATION_ARB = 0x8261; + + /** Returned by GetIntegerv when {@code pname} is CONTEXT_FLAGS. */ + public static final int GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB = 0x4; + + protected ARBRobustness() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetGraphicsResetStatusARB ] --- + + /** + * The symbolic constant returned indicates if the GL context has been in a reset state at any point since the last call to {@code GetGraphicsResetStatusARB}. + * {@link GL11#GL_NO_ERROR NO_ERROR} indicates that the GL context has not been in a reset state since the last call. {@link #GL_GUILTY_CONTEXT_RESET_ARB GUILTY_CONTEXT_RESET_ARB} indicates that a reset has + * been detected that is attributable to the current GL context. {@link #GL_INNOCENT_CONTEXT_RESET_ARB INNOCENT_CONTEXT_RESET_ARB} indicates a reset has been detected that is not attributable + * to the current GL context. {@link #GL_UNKNOWN_CONTEXT_RESET_ARB UNKNOWN_CONTEXT_RESET_ARB} indicates a detected graphics reset whose cause is unknown. + * + *

    If a reset status other than NO_ERROR is returned and subsequent calls return NO_ERROR, the context reset was encountered and completed. If a reset + * status is repeatedly returned, the context may be in the process of resetting.

    + * + *

    Reset notification behavior is determined at context creation time, and may be queried by calling {@link GL11C#glGetIntegerv GetIntegerv} with the symbolic constant + * {@link #GL_RESET_NOTIFICATION_STRATEGY_ARB RESET_NOTIFICATION_STRATEGY_ARB}.

    + * + *

    If the reset notification behavior is {@link #GL_NO_RESET_NOTIFICATION_ARB NO_RESET_NOTIFICATION_ARB}, then the implementation will never deliver notification of reset events, and + * {@code GetGraphicsResetStatusARB} will always return NO_ERROR.

    + * + *

    If the behavior is {@link #GL_LOSE_CONTEXT_ON_RESET_ARB LOSE_CONTEXT_ON_RESET_ARB}, a graphics reset will result in the loss of all context state, requiring the recreation of all associated + * objects. In this case {@code GetGraphicsResetStatusARB}. may return any of the values described above.

    + * + *

    If a graphics reset notification occurs in a context, a notification must also occur in all other contexts which share objects with that context.

    + */ + @NativeType("GLenum") + public static native int glGetGraphicsResetStatusARB(); + + // --- [ glGetnMapdvARB ] --- + + /** + * Unsafe version of: {@link #glGetnMapdvARB GetnMapdvARB} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnMapdvARB(int target, int query, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetMapdv GetMapdv} + * + * @param target the evaluator map + * @param query the information to query + * @param data a buffer in which to place the returned data + */ + public static void glGetnMapdvARB(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLdouble *") DoubleBuffer data) { + nglGetnMapdvARB(target, query, data.remaining(), memAddress(data)); + } + + /** + * Robust version of {@link GL11#glGetMapdv GetMapdv} + * + * @param target the evaluator map + * @param query the information to query + */ + @NativeType("void") + public static double glGetnMapdARB(@NativeType("GLenum") int target, @NativeType("GLenum") int query) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer data = stack.callocDouble(1); + nglGetnMapdvARB(target, query, 1, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnMapfvARB ] --- + + /** + * Unsafe version of: {@link #glGetnMapfvARB GetnMapfvARB} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnMapfvARB(int target, int query, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetMapfv GetMapfv} + * + * @param target the evaluator map + * @param query the information to query + * @param data a buffer in which to place the returned data + */ + public static void glGetnMapfvARB(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLfloat *") FloatBuffer data) { + nglGetnMapfvARB(target, query, data.remaining(), memAddress(data)); + } + + /** + * Robust version of {@link GL11#glGetMapfv GetMapfv} + * + * @param target the evaluator map + * @param query the information to query + */ + @NativeType("void") + public static float glGetnMapfARB(@NativeType("GLenum") int target, @NativeType("GLenum") int query) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer data = stack.callocFloat(1); + nglGetnMapfvARB(target, query, 1, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnMapivARB ] --- + + /** + * Unsafe version of: {@link #glGetnMapivARB GetnMapivARB} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnMapivARB(int target, int query, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetMapiv GetMapiv} + * + * @param target the evaluator target. One of:
    {@link GL11#GL_MAP1_VERTEX_3 MAP1_VERTEX_3}{@link GL11#GL_MAP1_VERTEX_4 MAP1_VERTEX_4}{@link GL11#GL_MAP1_COLOR_4 MAP1_COLOR_4}{@link GL11#GL_MAP1_NORMAL MAP1_NORMAL}{@link GL11#GL_MAP1_TEXTURE_COORD_1 MAP1_TEXTURE_COORD_1}
    {@link GL11#GL_MAP1_TEXTURE_COORD_2 MAP1_TEXTURE_COORD_2}{@link GL11#GL_MAP1_TEXTURE_COORD_3 MAP1_TEXTURE_COORD_3}{@link GL11#GL_MAP1_TEXTURE_COORD_4 MAP1_TEXTURE_COORD_4}{@link GL11#GL_MAP2_VERTEX_3 MAP2_VERTEX_3}{@link GL11#GL_MAP2_VERTEX_4 MAP2_VERTEX_4}
    {@link GL11#GL_MAP2_COLOR_4 MAP2_COLOR_4}{@link GL11#GL_MAP2_NORMAL MAP2_NORMAL}{@link GL11#GL_MAP2_TEXTURE_COORD_1 MAP2_TEXTURE_COORD_1}{@link GL11#GL_MAP2_TEXTURE_COORD_2 MAP2_TEXTURE_COORD_2}{@link GL11#GL_MAP2_TEXTURE_COORD_3 MAP2_TEXTURE_COORD_3}
    {@link GL11#GL_MAP2_TEXTURE_COORD_4 MAP2_TEXTURE_COORD_4}
    + * @param query the information to query. One of:
    {@link GL11#GL_ORDER ORDER}{@link GL11#GL_COEFF COEFF}{@link GL11#GL_DOMAIN DOMAIN}
    + * @param data a buffer in which to place the returned data + */ + public static void glGetnMapivARB(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLint *") IntBuffer data) { + nglGetnMapivARB(target, query, data.remaining(), memAddress(data)); + } + + /** + * Robust version of {@link GL11#glGetMapiv GetMapiv} + * + * @param target the evaluator target. One of:
    {@link GL11#GL_MAP1_VERTEX_3 MAP1_VERTEX_3}{@link GL11#GL_MAP1_VERTEX_4 MAP1_VERTEX_4}{@link GL11#GL_MAP1_COLOR_4 MAP1_COLOR_4}{@link GL11#GL_MAP1_NORMAL MAP1_NORMAL}{@link GL11#GL_MAP1_TEXTURE_COORD_1 MAP1_TEXTURE_COORD_1}
    {@link GL11#GL_MAP1_TEXTURE_COORD_2 MAP1_TEXTURE_COORD_2}{@link GL11#GL_MAP1_TEXTURE_COORD_3 MAP1_TEXTURE_COORD_3}{@link GL11#GL_MAP1_TEXTURE_COORD_4 MAP1_TEXTURE_COORD_4}{@link GL11#GL_MAP2_VERTEX_3 MAP2_VERTEX_3}{@link GL11#GL_MAP2_VERTEX_4 MAP2_VERTEX_4}
    {@link GL11#GL_MAP2_COLOR_4 MAP2_COLOR_4}{@link GL11#GL_MAP2_NORMAL MAP2_NORMAL}{@link GL11#GL_MAP2_TEXTURE_COORD_1 MAP2_TEXTURE_COORD_1}{@link GL11#GL_MAP2_TEXTURE_COORD_2 MAP2_TEXTURE_COORD_2}{@link GL11#GL_MAP2_TEXTURE_COORD_3 MAP2_TEXTURE_COORD_3}
    {@link GL11#GL_MAP2_TEXTURE_COORD_4 MAP2_TEXTURE_COORD_4}
    + * @param query the information to query. One of:
    {@link GL11#GL_ORDER ORDER}{@link GL11#GL_COEFF COEFF}{@link GL11#GL_DOMAIN DOMAIN}
    + */ + @NativeType("void") + public static int glGetnMapiARB(@NativeType("GLenum") int target, @NativeType("GLenum") int query) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer data = stack.callocInt(1); + nglGetnMapivARB(target, query, 1, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnPixelMapfvARB ] --- + + /** + * Unsafe version of: {@link #glGetnPixelMapfvARB GetnPixelMapfvARB} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnPixelMapfvARB(int map, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetPixelMapfv GetPixelMapfv} + * + * @param map the pixel map parameter to query. One of:
    {@link GL11#GL_PIXEL_MAP_I_TO_I PIXEL_MAP_I_TO_I}{@link GL11#GL_PIXEL_MAP_S_TO_S PIXEL_MAP_S_TO_S}{@link GL11#GL_PIXEL_MAP_I_TO_R PIXEL_MAP_I_TO_R}{@link GL11#GL_PIXEL_MAP_I_TO_G PIXEL_MAP_I_TO_G}{@link GL11#GL_PIXEL_MAP_I_TO_B PIXEL_MAP_I_TO_B}
    {@link GL11#GL_PIXEL_MAP_I_TO_A PIXEL_MAP_I_TO_A}{@link GL11#GL_PIXEL_MAP_R_TO_R PIXEL_MAP_R_TO_R}{@link GL11#GL_PIXEL_MAP_G_TO_G PIXEL_MAP_G_TO_G}{@link GL11#GL_PIXEL_MAP_B_TO_B PIXEL_MAP_B_TO_B}{@link GL11#GL_PIXEL_MAP_A_TO_A PIXEL_MAP_A_TO_A}
    + * @param data a buffer in which to place the returned data + */ + public static void glGetnPixelMapfvARB(@NativeType("GLenum") int map, @NativeType("GLfloat *") FloatBuffer data) { + nglGetnPixelMapfvARB(map, data.remaining(), memAddress(data)); + } + + // --- [ glGetnPixelMapuivARB ] --- + + /** + * Unsafe version of: {@link #glGetnPixelMapuivARB GetnPixelMapuivARB} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnPixelMapuivARB(int map, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetPixelMapuiv GetPixelMapuiv} + * + * @param map the pixel map parameter to query + * @param data a buffer in which to place the returned data + */ + public static void glGetnPixelMapuivARB(@NativeType("GLenum") int map, @NativeType("GLuint *") IntBuffer data) { + nglGetnPixelMapuivARB(map, data.remaining(), memAddress(data)); + } + + // --- [ glGetnPixelMapusvARB ] --- + + /** + * Unsafe version of: {@link #glGetnPixelMapusvARB GetnPixelMapusvARB} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnPixelMapusvARB(int map, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetPixelMapusv GetPixelMapusv} + * + * @param map the pixel map parameter to query + * @param data a buffer in which to place the returned data + */ + public static void glGetnPixelMapusvARB(@NativeType("GLenum") int map, @NativeType("GLushort *") ShortBuffer data) { + nglGetnPixelMapusvARB(map, data.remaining(), memAddress(data)); + } + + // --- [ glGetnPolygonStippleARB ] --- + + /** + * Unsafe version of: {@link #glGetnPolygonStippleARB GetnPolygonStippleARB} + * + * @param bufSize the maximum number of bytes to write into {@code pattern} + */ + public static native void nglGetnPolygonStippleARB(int bufSize, long pattern); + + /** + * Robust version of {@link GL11#glGetPolygonStipple GetPolygonStipple} + * + * @param bufSize the maximum number of bytes to write into {@code pattern} + * @param pattern a buffer in which to place the returned pattern + */ + public static void glGetnPolygonStippleARB(@NativeType("GLsizei") int bufSize, @NativeType("GLubyte *") long pattern) { + nglGetnPolygonStippleARB(bufSize, pattern); + } + + /** + * Robust version of {@link GL11#glGetPolygonStipple GetPolygonStipple} + * + * @param pattern a buffer in which to place the returned pattern + */ + public static void glGetnPolygonStippleARB(@NativeType("GLubyte *") ByteBuffer pattern) { + nglGetnPolygonStippleARB(pattern.remaining(), memAddress(pattern)); + } + + // --- [ glGetnTexImageARB ] --- + + /** + * Unsafe version of: {@link #glGetnTexImageARB GetnTexImageARB} + * + * @param bufSize the maximum number of bytes to write into {@code img} + */ + public static native void nglGetnTexImageARB(int tex, int level, int format, int type, int bufSize, long img); + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param bufSize the maximum number of bytes to write into {@code img} + * @param img a buffer in which to place the returned data + */ + public static void glGetnTexImageARB(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long img) { + nglGetnTexImageARB(tex, level, format, type, bufSize, img); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + */ + public static void glGetnTexImageARB(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer img) { + nglGetnTexImageARB(tex, level, format, type, img.remaining(), memAddress(img)); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + */ + public static void glGetnTexImageARB(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer img) { + nglGetnTexImageARB(tex, level, format, type, img.remaining() << 1, memAddress(img)); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + */ + public static void glGetnTexImageARB(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer img) { + nglGetnTexImageARB(tex, level, format, type, img.remaining() << 2, memAddress(img)); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + */ + public static void glGetnTexImageARB(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer img) { + nglGetnTexImageARB(tex, level, format, type, img.remaining() << 2, memAddress(img)); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + */ + public static void glGetnTexImageARB(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer img) { + nglGetnTexImageARB(tex, level, format, type, img.remaining() << 3, memAddress(img)); + } + + // --- [ glReadnPixelsARB ] --- + + /** + * Unsafe version of: {@link #glReadnPixelsARB ReadnPixelsARB} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglReadnPixelsARB(int x, int y, int width, int height, int format, int type, int bufSize, long data); + + /** + * Robust version of {@link GL11C#glReadPixels ReadPixels} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param bufSize the maximum number of bytes to write into {@code data} + * @param data a buffer in which to place the returned data + */ + public static void glReadnPixelsARB(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long data) { + nglReadnPixelsARB(x, y, width, height, format, type, bufSize, data); + } + + /** + * Robust version of {@link GL11C#glReadPixels ReadPixels} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param data a buffer in which to place the returned data + */ + public static void glReadnPixelsARB(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer data) { + nglReadnPixelsARB(x, y, width, height, format, type, data.remaining(), memAddress(data)); + } + + /** + * Robust version of {@link GL11C#glReadPixels ReadPixels} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param data a buffer in which to place the returned data + */ + public static void glReadnPixelsARB(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer data) { + nglReadnPixelsARB(x, y, width, height, format, type, data.remaining() << 1, memAddress(data)); + } + + /** + * Robust version of {@link GL11C#glReadPixels ReadPixels} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param data a buffer in which to place the returned data + */ + public static void glReadnPixelsARB(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer data) { + nglReadnPixelsARB(x, y, width, height, format, type, data.remaining() << 2, memAddress(data)); + } + + /** + * Robust version of {@link GL11C#glReadPixels ReadPixels} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param data a buffer in which to place the returned data + */ + public static void glReadnPixelsARB(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer data) { + nglReadnPixelsARB(x, y, width, height, format, type, data.remaining() << 2, memAddress(data)); + } + + // --- [ glGetnColorTableARB ] --- + + /** + * Unsafe version of: {@link #glGetnColorTableARB GetnColorTableARB} + * + * @param bufSize the maximum number of bytes to write into {@code table} + */ + public static native void nglGetnColorTableARB(int target, int format, int type, int bufSize, long table); + + /** + * Robust version of {@link ARBImaging#glGetColorTable GetColorTable} + * + * @param target the color table target. One of:
    {@link ARBImaging#GL_COLOR_TABLE COLOR_TABLE}{@link ARBImaging#GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link ARBImaging#GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param bufSize the maximum number of bytes to write into {@code table} + * @param table a buffer in which to place the returned data + */ + public static void glGetnColorTableARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long table) { + nglGetnColorTableARB(target, format, type, bufSize, table); + } + + /** + * Robust version of {@link ARBImaging#glGetColorTable GetColorTable} + * + * @param target the color table target. One of:
    {@link ARBImaging#GL_COLOR_TABLE COLOR_TABLE}{@link ARBImaging#GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link ARBImaging#GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table a buffer in which to place the returned data + */ + public static void glGetnColorTableARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer table) { + nglGetnColorTableARB(target, format, type, table.remaining(), memAddress(table)); + } + + /** + * Robust version of {@link ARBImaging#glGetColorTable GetColorTable} + * + * @param target the color table target. One of:
    {@link ARBImaging#GL_COLOR_TABLE COLOR_TABLE}{@link ARBImaging#GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link ARBImaging#GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table a buffer in which to place the returned data + */ + public static void glGetnColorTableARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer table) { + nglGetnColorTableARB(target, format, type, table.remaining() << 1, memAddress(table)); + } + + /** + * Robust version of {@link ARBImaging#glGetColorTable GetColorTable} + * + * @param target the color table target. One of:
    {@link ARBImaging#GL_COLOR_TABLE COLOR_TABLE}{@link ARBImaging#GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link ARBImaging#GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table a buffer in which to place the returned data + */ + public static void glGetnColorTableARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer table) { + nglGetnColorTableARB(target, format, type, table.remaining() << 2, memAddress(table)); + } + + /** + * Robust version of {@link ARBImaging#glGetColorTable GetColorTable} + * + * @param target the color table target. One of:
    {@link ARBImaging#GL_COLOR_TABLE COLOR_TABLE}{@link ARBImaging#GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link ARBImaging#GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table a buffer in which to place the returned data + */ + public static void glGetnColorTableARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer table) { + nglGetnColorTableARB(target, format, type, table.remaining() << 2, memAddress(table)); + } + + // --- [ glGetnConvolutionFilterARB ] --- + + /** + * Unsafe version of: {@link #glGetnConvolutionFilterARB GetnConvolutionFilterARB} + * + * @param bufSize the maximum number of bytes to write into {@code image} + */ + public static native void nglGetnConvolutionFilterARB(int target, int format, int type, int bufSize, long image); + + /** + * Robust version of {@link ARBImaging#glGetConvolutionFilter GetConvolutionFilter} + * + * @param target the convolution target. One of:
    {@link ARBImaging#GL_CONVOLUTION_1D CONVOLUTION_1D}{@link ARBImaging#GL_CONVOLUTION_2D CONVOLUTION_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param bufSize the maximum number of bytes to write into {@code image} + * @param image a buffer in which to place the returned data + */ + public static void glGetnConvolutionFilterARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long image) { + nglGetnConvolutionFilterARB(target, format, type, bufSize, image); + } + + /** + * Robust version of {@link ARBImaging#glGetConvolutionFilter GetConvolutionFilter} + * + * @param target the convolution target. One of:
    {@link ARBImaging#GL_CONVOLUTION_1D CONVOLUTION_1D}{@link ARBImaging#GL_CONVOLUTION_2D CONVOLUTION_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param image a buffer in which to place the returned data + */ + public static void glGetnConvolutionFilterARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer image) { + nglGetnConvolutionFilterARB(target, format, type, image.remaining(), memAddress(image)); + } + + // --- [ glGetnSeparableFilterARB ] --- + + /** + * Unsafe version of: {@link #glGetnSeparableFilterARB GetnSeparableFilterARB} + * + * @param rowBufSize the maximum number of bytes to write into {@code row} + * @param columnBufSize the maximum number of bytes to write into {@code column} + */ + public static native void nglGetnSeparableFilterARB(int target, int format, int type, int rowBufSize, long row, int columnBufSize, long column, long span); + + /** + * Robust version of {@link ARBImaging#glGetSeparableFilter GetSeparableFilter} + * + * @param target the filter target. Must be:
    {@link ARBImaging#GL_SEPARABLE_2D SEPARABLE_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param rowBufSize the maximum number of bytes to write into {@code row} + * @param row a buffer in which to return the filter row + * @param columnBufSize the maximum number of bytes to write into {@code column} + * @param column a buffer in which to return the filter column + */ + public static void glGetnSeparableFilterARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int rowBufSize, @NativeType("void *") long row, @NativeType("GLsizei") int columnBufSize, @NativeType("void *") long column, @Nullable @NativeType("void *") ByteBuffer span) { + nglGetnSeparableFilterARB(target, format, type, rowBufSize, row, columnBufSize, column, memAddressSafe(span)); + } + + /** + * Robust version of {@link ARBImaging#glGetSeparableFilter GetSeparableFilter} + * + * @param target the filter target. Must be:
    {@link ARBImaging#GL_SEPARABLE_2D SEPARABLE_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param row a buffer in which to return the filter row + * @param column a buffer in which to return the filter column + */ + public static void glGetnSeparableFilterARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer row, @NativeType("void *") ByteBuffer column, @Nullable @NativeType("void *") ByteBuffer span) { + nglGetnSeparableFilterARB(target, format, type, row.remaining(), memAddress(row), column.remaining(), memAddress(column), memAddressSafe(span)); + } + + // --- [ glGetnHistogramARB ] --- + + /** + * Unsafe version of: {@link #glGetnHistogramARB GetnHistogramARB} + * + * @param bufSize the maximum number of bytes to write into {@code values} + */ + public static native void nglGetnHistogramARB(int target, boolean reset, int format, int type, int bufSize, long values); + + /** + * Robust version of {@link ARBImaging#glGetHistogram GetHistogram} + * + * @param target the histogram target. Must be:
    {@link ARBImaging#GL_HISTOGRAM HISTOGRAM}
    + * @param reset if {@link GL11#GL_TRUE TRUE}, then all counters of all elements of the histogram are reset to zero. Counters are reset whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data types. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param bufSize the maximum number of bytes to write into {@code values} + * @param values a buffer in which to place the returned data + */ + public static void glGetnHistogramARB(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long values) { + nglGetnHistogramARB(target, reset, format, type, bufSize, values); + } + + /** + * Robust version of {@link ARBImaging#glGetHistogram GetHistogram} + * + * @param target the histogram target. Must be:
    {@link ARBImaging#GL_HISTOGRAM HISTOGRAM}
    + * @param reset if {@link GL11#GL_TRUE TRUE}, then all counters of all elements of the histogram are reset to zero. Counters are reset whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data types. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param values a buffer in which to place the returned data + */ + public static void glGetnHistogramARB(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer values) { + nglGetnHistogramARB(target, reset, format, type, values.remaining(), memAddress(values)); + } + + // --- [ glGetnMinmaxARB ] --- + + /** + * Unsafe version of: {@link #glGetnMinmaxARB GetnMinmaxARB} + * + * @param bufSize the maximum number of bytes to write into {@code values} + */ + public static native void nglGetnMinmaxARB(int target, boolean reset, int format, int type, int bufSize, long values); + + /** + * Robust version of {@link ARBImaging#glGetMinmax GetMinmax} + * + * @param target the minmax target. Must be:
    {@link ARBImaging#GL_MINMAX MINMAX}
    + * @param reset If {@link GL11#GL_TRUE TRUE}, then each minimum value is reset to the maximum representable value, and each maximum value is reset to the minimum + * representable value. All values are reset, whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param bufSize the maximum number of bytes to write into {@code values} + * @param values a buffer in which to place the returned data + */ + public static void glGetnMinmaxARB(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long values) { + nglGetnMinmaxARB(target, reset, format, type, bufSize, values); + } + + /** + * Robust version of {@link ARBImaging#glGetMinmax GetMinmax} + * + * @param target the minmax target. Must be:
    {@link ARBImaging#GL_MINMAX MINMAX}
    + * @param reset If {@link GL11#GL_TRUE TRUE}, then each minimum value is reset to the maximum representable value, and each maximum value is reset to the minimum + * representable value. All values are reset, whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param values a buffer in which to place the returned data + */ + public static void glGetnMinmaxARB(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer values) { + nglGetnMinmaxARB(target, reset, format, type, values.remaining(), memAddress(values)); + } + + // --- [ glGetnCompressedTexImageARB ] --- + + /** + * Unsafe version of: {@link #glGetnCompressedTexImageARB GetnCompressedTexImageARB} + * + * @param bufSize the maximum number of bytes to write into {@code img} + */ + public static native void nglGetnCompressedTexImageARB(int target, int level, int bufSize, long img); + + /** + * Robust version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage} + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param bufSize the maximum number of bytes to write into {@code img} + * @param img a buffer in which to place the returned data + */ + public static void glGetnCompressedTexImageARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLsizei") int bufSize, @NativeType("void *") long img) { + nglGetnCompressedTexImageARB(target, level, bufSize, img); + } + + /** + * Robust version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage} + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param img a buffer in which to place the returned data + */ + public static void glGetnCompressedTexImageARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") ByteBuffer img) { + if (CHECKS) { + if (DEBUG) { + check(img, GL11.glGetTexLevelParameteri(target, level, GL13.GL_TEXTURE_COMPRESSED_IMAGE_SIZE)); + } + } + nglGetnCompressedTexImageARB(target, level, img.remaining(), memAddress(img)); + } + + // --- [ glGetnUniformfvARB ] --- + + /** + * Unsafe version of: {@link #glGetnUniformfvARB GetnUniformfvARB} + * + * @param bufSize the maximum number of bytes to write into {@code params} + */ + public static native void nglGetnUniformfvARB(int program, int location, int bufSize, long params); + + /** + * Robust version of {@link GL20C#glGetUniformfv GetUniformfv} + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params a buffer in which to place the returned data + */ + public static void glGetnUniformfvARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") FloatBuffer params) { + nglGetnUniformfvARB(program, location, params.remaining(), memAddress(params)); + } + + /** + * Robust version of {@link GL20C#glGetUniformfv GetUniformfv} + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + */ + @NativeType("void") + public static float glGetnUniformfARB(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetnUniformfvARB(program, location, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnUniformivARB ] --- + + /** + * Unsafe version of: {@link #glGetnUniformivARB GetnUniformivARB} + * + * @param bufSize the maximum number of bytes to write into {@code params} + */ + public static native void nglGetnUniformivARB(int program, int location, int bufSize, long params); + + /** + * Robust version of {@link GL20C#glGetUniformiv GetUniformiv} + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params a buffer in which to place the returned data + */ + public static void glGetnUniformivARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") IntBuffer params) { + nglGetnUniformivARB(program, location, params.remaining(), memAddress(params)); + } + + /** + * Robust version of {@link GL20C#glGetUniformiv GetUniformiv} + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + */ + @NativeType("void") + public static int glGetnUniformiARB(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetnUniformivARB(program, location, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnUniformuivARB ] --- + + /** + * Unsafe version of: {@link #glGetnUniformuivARB GetnUniformuivARB} + * + * @param bufSize the maximum number of bytes to write into {@code params} + */ + public static native void nglGetnUniformuivARB(int program, int location, int bufSize, long params); + + /** + * Robust version of {@link GL30C#glGetUniformuiv GetUniformuiv} + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params a buffer in which to place the returned data + */ + public static void glGetnUniformuivARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") IntBuffer params) { + nglGetnUniformuivARB(program, location, params.remaining(), memAddress(params)); + } + + /** + * Robust version of {@link GL30C#glGetUniformuiv GetUniformuiv} + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + */ + @NativeType("void") + public static int glGetnUniformuiARB(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetnUniformuivARB(program, location, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnUniformdvARB ] --- + + /** + * Unsafe version of: {@link #glGetnUniformdvARB GetnUniformdvARB} + * + * @param bufSize the maximum number of bytes to write into {@code params} + */ + public static native void nglGetnUniformdvARB(int program, int location, int bufSize, long params); + + /** + * Robust version of {@link GL40C#glGetUniformdv GetUniformdv} + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params a buffer in which to place the returned data + */ + public static void glGetnUniformdvARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") DoubleBuffer params) { + nglGetnUniformdvARB(program, location, params.remaining(), memAddress(params)); + } + + /** + * Robust version of {@link GL40C#glGetUniformdv GetUniformdv} + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + */ + @NativeType("void") + public static double glGetnUniformdARB(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer params = stack.callocDouble(1); + nglGetnUniformdvARB(program, location, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glGetnMapdvARB GetnMapdvARB} */ + public static void glGetnMapdvARB(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLdouble *") double[] data) { + long __functionAddress = GL.getICD().glGetnMapdvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, query, data.length, data, __functionAddress); + } + + /** Array version of: {@link #glGetnMapfvARB GetnMapfvARB} */ + public static void glGetnMapfvARB(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLfloat *") float[] data) { + long __functionAddress = GL.getICD().glGetnMapfvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, query, data.length, data, __functionAddress); + } + + /** Array version of: {@link #glGetnMapivARB GetnMapivARB} */ + public static void glGetnMapivARB(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLint *") int[] data) { + long __functionAddress = GL.getICD().glGetnMapivARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, query, data.length, data, __functionAddress); + } + + /** Array version of: {@link #glGetnPixelMapfvARB GetnPixelMapfvARB} */ + public static void glGetnPixelMapfvARB(@NativeType("GLenum") int map, @NativeType("GLfloat *") float[] data) { + long __functionAddress = GL.getICD().glGetnPixelMapfvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(map, data.length, data, __functionAddress); + } + + /** Array version of: {@link #glGetnPixelMapuivARB GetnPixelMapuivARB} */ + public static void glGetnPixelMapuivARB(@NativeType("GLenum") int map, @NativeType("GLuint *") int[] data) { + long __functionAddress = GL.getICD().glGetnPixelMapuivARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(map, data.length, data, __functionAddress); + } + + /** Array version of: {@link #glGetnPixelMapusvARB GetnPixelMapusvARB} */ + public static void glGetnPixelMapusvARB(@NativeType("GLenum") int map, @NativeType("GLushort *") short[] data) { + long __functionAddress = GL.getICD().glGetnPixelMapusvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(map, data.length, data, __functionAddress); + } + + /** Array version of: {@link #glGetnTexImageARB GetnTexImageARB} */ + public static void glGetnTexImageARB(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] img) { + long __functionAddress = GL.getICD().glGetnTexImageARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, img.length << 1, img, __functionAddress); + } + + /** Array version of: {@link #glGetnTexImageARB GetnTexImageARB} */ + public static void glGetnTexImageARB(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] img) { + long __functionAddress = GL.getICD().glGetnTexImageARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, img.length << 2, img, __functionAddress); + } + + /** Array version of: {@link #glGetnTexImageARB GetnTexImageARB} */ + public static void glGetnTexImageARB(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] img) { + long __functionAddress = GL.getICD().glGetnTexImageARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, img.length << 2, img, __functionAddress); + } + + /** Array version of: {@link #glGetnTexImageARB GetnTexImageARB} */ + public static void glGetnTexImageARB(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] img) { + long __functionAddress = GL.getICD().glGetnTexImageARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, img.length << 3, img, __functionAddress); + } + + /** Array version of: {@link #glReadnPixelsARB ReadnPixelsARB} */ + public static void glReadnPixelsARB(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] data) { + long __functionAddress = GL.getICD().glReadnPixelsARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(x, y, width, height, format, type, data.length << 1, data, __functionAddress); + } + + /** Array version of: {@link #glReadnPixelsARB ReadnPixelsARB} */ + public static void glReadnPixelsARB(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] data) { + long __functionAddress = GL.getICD().glReadnPixelsARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(x, y, width, height, format, type, data.length << 2, data, __functionAddress); + } + + /** Array version of: {@link #glReadnPixelsARB ReadnPixelsARB} */ + public static void glReadnPixelsARB(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] data) { + long __functionAddress = GL.getICD().glReadnPixelsARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(x, y, width, height, format, type, data.length << 2, data, __functionAddress); + } + + /** Array version of: {@link #glGetnColorTableARB GetnColorTableARB} */ + public static void glGetnColorTableARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] table) { + long __functionAddress = GL.getICD().glGetnColorTableARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, format, type, table.length << 1, table, __functionAddress); + } + + /** Array version of: {@link #glGetnColorTableARB GetnColorTableARB} */ + public static void glGetnColorTableARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] table) { + long __functionAddress = GL.getICD().glGetnColorTableARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, format, type, table.length << 2, table, __functionAddress); + } + + /** Array version of: {@link #glGetnColorTableARB GetnColorTableARB} */ + public static void glGetnColorTableARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] table) { + long __functionAddress = GL.getICD().glGetnColorTableARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, format, type, table.length << 2, table, __functionAddress); + } + + /** Array version of: {@link #glGetnUniformfvARB GetnUniformfvARB} */ + public static void glGetnUniformfvARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetnUniformfvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, params.length, params, __functionAddress); + } + + /** Array version of: {@link #glGetnUniformivARB GetnUniformivARB} */ + public static void glGetnUniformivARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetnUniformivARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, params.length, params, __functionAddress); + } + + /** Array version of: {@link #glGetnUniformuivARB GetnUniformuivARB} */ + public static void glGetnUniformuivARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetnUniformuivARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, params.length, params, __functionAddress); + } + + /** Array version of: {@link #glGetnUniformdvARB GetnUniformdvARB} */ + public static void glGetnUniformdvARB(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetnUniformdvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, params.length, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSPIRVExtensions.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSPIRVExtensions.java new file mode 100644 index 000000000..c25bc3fd2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSPIRVExtensions.java @@ -0,0 +1,39 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_spirv_extensions extension. + * + *

    {@code ARB_gl_spirv} added support for using SPIR-V modules in OpenGL. However it only added support for SPIR-V 1.0 concepts that were part of the + * OpenGL 4.5 Core Profile.

    + * + *

    There are a great number of additional OpenGL ARB and vendor extensions which add shading language concepts and since they were defined prior to the + * existence of SPIR-V support in OpenGL they don't add SPIR-V support for their additional features. Ideally {@code GL_ARB_gl_spirv} would have added + * support for them, but as noted in Issue 27 of that extension, support for them was left as a future exercise.

    + * + *

    Now that at least some of that functionality has been defined via SPIR-V extensions, there is currently no way for an OpenGL implementation to + * advertise that is supports additional SPIR-V extensions.

    + * + *

    This extension provides a mechanism for an implementation to advertise which SPIR-V extensions it supports, and further provides a place where the + * SPIR-V environment for those extensions can be documented for OpenGL.

    + * + *

    It is expected that this document can be extended over time as SPIR-V support for additional extensions is added. The mapping between GLSL and SPIR-V + * concepts and any other pertinent information can be provided here as interactions with the corresponding OpenGL and SPIR-V extensions.

    + * + *

    Requires {@link ARBGLSPIRV OpenGL B.G}.

    + */ +public final class ARBSPIRVExtensions { + + /** Accepted by the {@code name} parameter of {@link GL30C#glGetStringi GetStringi}. */ + public static final int GL_SPIR_V_EXTENSIONS = 0x9553; + + /** Accepted by the {@code pname} parameter of {@link GL11C#glGetIntegerv GetIntegerv}. */ + public static final int GL_NUM_SPIR_V_EXTENSIONS = 0x9554; + + private ARBSPIRVExtensions() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSampleLocations.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSampleLocations.java new file mode 100644 index 000000000..cbd2bc40c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSampleLocations.java @@ -0,0 +1,132 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_sample_locations extension. + * + *

    This extension allows an application to modify the locations of samples within a pixel used in multisample rasterization. Additionally, it allows + * applications to specify different sample locations for each pixel in a group of adjacent pixels, which may increase antialiasing quality (particularly + * if a custom resolve shader is used that takes advantage of these different locations).

    + * + *

    It is common for implementations to optimize the storage of depth values by storing values that can be used to reconstruct depth at each sample + * location, rather than storing separate depth values for each sample. For example, the depth values from a single triangle can be represented using + * plane equations. When the depth value for a sample is needed, it is automatically evaluated at the sample location. Modifying the sample locations + * causes the reconstruction to no longer evaluate the same depth values as when the samples were originally generated. This extension provides a command + * to "evaluate" and store per-sample depth values using the currently programmed sample locations, which allows the application to manage this issue + * if/when necessary.

    + * + *

    The programmable sample locations are used during rasterization and for evaluation of depth functions during normal geometric rendering. The + * programmable locations are associated with a framebuffer object rather than an individual depth buffer, so if the depth buffer is used as a texture the + * texture sampling may be done at the standard sample locations. Additionally, commands that do not render geometric primitives (e.g. ReadPixels, + * BlitFramebuffer, CopyTexSubImage2D, etc.) may use the standard sample locations to evaluate depth functions rather than the programmable locations. If + * a single depth buffer is used at different times with different sample locations, the depth functions may be interpreted using the current sample + * locations.

    + */ +public class ARBSampleLocations { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB = 0x933D, + GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB = 0x933E, + GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB = 0x933F, + GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB = 0x9340; + + /** + * // Alias of SAMPLE_POSITION. Before NV_expms, the spec used "location". SAMPLE_LOCATION_ARB 0x8E50 PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 Accepted by + * the {@code pname} parameter of FramebufferParameteri, GetFramebufferParameteriv. + */ + public static final int + GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB = 0x9342, + GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB = 0x9343; + + protected ARBSampleLocations() { + throw new UnsupportedOperationException(); + } + + // --- [ glFramebufferSampleLocationsfvARB ] --- + + /** + * Unsafe version of: {@link #glFramebufferSampleLocationsfvARB FramebufferSampleLocationsfvARB} + * + * @param count the number of sample locations to update + */ + public static native void nglFramebufferSampleLocationsfvARB(int target, int start, int count, long v); + + /** + * Controls the programmable sample locations for the framebuffer bound to the specified {@code target}. + * + *

    There are {@code N} pairs of programmable sample locations values in a framebuffer, where {@code N} is the value of + * {@link #GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB}. Each programmable sample location is specified as a pair of floating point values in the range + * {@code [0,1]}, corresponding to the x and y locations respectively in GL pixel space. {@code (0.5, 0.5)} thus corresponds to the pixel center. Sample + * locations outside of {@code [0,1]} result in undefined behavior.

    + * + * @param target the framebuffer target. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * @param start the first sample location to update + * @param v a pair of values for each sample location to update + */ + public static void glFramebufferSampleLocationsfvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int start, @NativeType("GLfloat const *") FloatBuffer v) { + nglFramebufferSampleLocationsfvARB(target, start, v.remaining() >> 1, memAddress(v)); + } + + // --- [ glNamedFramebufferSampleLocationsfvARB ] --- + + /** + * Unsafe version of: {@link #glNamedFramebufferSampleLocationsfvARB NamedFramebufferSampleLocationsfvARB} + * + * @param count the number of sample locations to update + */ + public static native void nglNamedFramebufferSampleLocationsfvARB(int framebuffer, int start, int count, long v); + + /** + * DSA version of {@link #glFramebufferSampleLocationsfvARB FramebufferSampleLocationsfvARB}. + * + * @param framebuffer the framebuffer object to update + * @param start the first sample location to update + * @param v a pair of values for each sample location to update + */ + public static void glNamedFramebufferSampleLocationsfvARB(@NativeType("GLuint") int framebuffer, @NativeType("GLuint") int start, @NativeType("GLfloat const *") FloatBuffer v) { + nglNamedFramebufferSampleLocationsfvARB(framebuffer, start, v.remaining() >> 1, memAddress(v)); + } + + // --- [ glEvaluateDepthValuesARB ] --- + + /** + * Evaluates depth values for all samples in the current depth buffer (subject to the pixel ownership and scissor tests) and stores each value in the + * depth buffer. This can be used to ensure that later accesses will use depth values consistent with the sample locations used when the samples were + * generated. If the current framebuffer has no depth buffer, EvaluateDepthValuesARB will have no effect. + */ + public static native void glEvaluateDepthValuesARB(); + + /** Array version of: {@link #glFramebufferSampleLocationsfvARB FramebufferSampleLocationsfvARB} */ + public static void glFramebufferSampleLocationsfvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int start, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glFramebufferSampleLocationsfvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, start, v.length >> 1, v, __functionAddress); + } + + /** Array version of: {@link #glNamedFramebufferSampleLocationsfvARB NamedFramebufferSampleLocationsfvARB} */ + public static void glNamedFramebufferSampleLocationsfvARB(@NativeType("GLuint") int framebuffer, @NativeType("GLuint") int start, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glNamedFramebufferSampleLocationsfvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(framebuffer, start, v.length >> 1, v, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSampleShading.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSampleShading.java new file mode 100644 index 000000000..7552050a0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSampleShading.java @@ -0,0 +1,55 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_sample_shading extension. + * + *

    In standard multisample rendering, an implementation is allowed to assign the same color and texture coordinate values to each sample, which then allows + * the optimization where the shader is only evaluated once and then distributed to the samples that have been determined to be covered by the primitive + * currently being rasterized. This can cause aliasing where the input color and texture coordinates are used to generate a result that doesn't antialias + * itself, for example with alpha-tested transparency.

    + * + *

    This extension adds the ability to explicitly request that an implementation use a minimum number of unique set of fragment computation inputs when + * multisampling a pixel. Specifying such a requirement can reduce aliasing that results from evaluating the fragment computations too few times per pixel.

    + * + *

    This extension adds new global state that controls the minimum number of samples for which attribute data is independently interpolated. When enabled, + * all operations that were traditionally executed per-fragment operate independently on each sample.

    + * + *

    This also extends the shading language to allow control over the sample being processed. This includes built-in fragment input variables identifying the + * sample number and position being processed when executing fragment shaders per sample.

    + * + *

    Requires {@link GL20 OpenGL 2.0} and GLSL 1.30. Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public class ARBSampleShading { + + static { GL.initialize(); } + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_SAMPLE_SHADING_ARB = 0x8C36; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int GL_MIN_SAMPLE_SHADING_VALUE_ARB = 0x8C37; + + protected ARBSampleShading() { + throw new UnsupportedOperationException(); + } + + // --- [ glMinSampleShadingARB ] --- + + /** + * Sets the minimum sample shading fraction. {@code value} is clamped to [0,1] when specified. + * + * @param value the minimum sample shading fraction + */ + public static native void glMinSampleShadingARB(@NativeType("GLfloat") float value); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSamplerObjects.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSamplerObjects.java new file mode 100644 index 000000000..16c804ea4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSamplerObjects.java @@ -0,0 +1,380 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_sampler_objects extension. + * + *

    In unextended OpenGL textures are considered to be sets of image data (mip-chains, arrays, cube-map face sets, etc.) and sampling state (sampling mode, + * mip-mapping state, coordinate wrapping and clamping rules, etc.) combined into a single object. It is typical for an application to use many textures + * with a limited set of sampling states that are the same between them. In order to use textures in this way, an application must generate and configure + * many texture names, adding overhead both to applications and to implementations. Furthermore, should an application wish to sample from a texture in + * more than one way (with and without mip-mapping, for example) it must either modify the state of the texture or create two textures, each with a copy of + * the same image data. This can introduce runtime and memory costs to the application.

    + * + *

    This extension separates sampler state from texture image data. A new object type is introduced, the sampler (representing generic sampling parameters). + * The new sampler objects are represented by a new named type encapsulating the sampling parameters of a traditional texture object. Sampler objects may + * be bound to texture units to supplant the bound texture's sampling state. A single sampler may be bound to more than one texture unit simultaneously, + * allowing different textures to be accessed with a single set of shared sampling parameters. Also, by binding different sampler objects to texture units + * to which the same texture has been bound, the same texture image data may be sampled with different sampling parameters.

    + * + *

    Promoted to core in {@link GL33 OpenGL 3.3}.

    + */ +public class ARBSamplerObjects { + + static { GL.initialize(); } + + /** Accepted by the {@code value} parameter of the GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv and GetDoublev functions. */ + public static final int GL_SAMPLER_BINDING = 0x8919; + + protected ARBSamplerObjects() { + throw new UnsupportedOperationException(); + } + + // --- [ glGenSamplers ] --- + + /** + * Unsafe version of: {@link #glGenSamplers GenSamplers} + * + * @param count the number of sampler object names to generate + */ + public static void nglGenSamplers(int count, long samplers) { + GL33C.nglGenSamplers(count, samplers); + } + + /** + * Generates sampler object names. + * + * @param samplers a buffer in which the generated sampler object names are stored + */ + public static void glGenSamplers(@NativeType("GLuint *") IntBuffer samplers) { + GL33C.glGenSamplers(samplers); + } + + /** Generates sampler object names. */ + @NativeType("void") + public static int glGenSamplers() { + return GL33C.glGenSamplers(); + } + + // --- [ glDeleteSamplers ] --- + + /** + * Unsafe version of: {@link #glDeleteSamplers DeleteSamplers} + * + * @param count the number of sampler objects to be deleted + */ + public static void nglDeleteSamplers(int count, long samplers) { + GL33C.nglDeleteSamplers(count, samplers); + } + + /** + * Deletes named sampler objects. + * + * @param samplers an array of sampler objects to be deleted + */ + public static void glDeleteSamplers(@NativeType("GLuint const *") IntBuffer samplers) { + GL33C.glDeleteSamplers(samplers); + } + + /** Deletes named sampler objects. */ + public static void glDeleteSamplers(@NativeType("GLuint const *") int sampler) { + GL33C.glDeleteSamplers(sampler); + } + + // --- [ glIsSampler ] --- + + /** + * Determines if a name corresponds to a sampler object. + * + * @param sampler a value that may be the name of a sampler object + */ + @NativeType("GLboolean") + public static boolean glIsSampler(@NativeType("GLuint") int sampler) { + return GL33C.glIsSampler(sampler); + } + + // --- [ glBindSampler ] --- + + /** + * Binds a named sampler to a texturing target. + * + * @param unit the index of the texture unit to which the sampler is bound + * @param sampler the name of a sampler + */ + public static void glBindSampler(@NativeType("GLuint") int unit, @NativeType("GLuint") int sampler) { + GL33C.glBindSampler(unit, sampler); + } + + // --- [ glSamplerParameteri ] --- + + /** + * Set the integer value of a sampler parameter. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a single-valued sampler parameter. One of:
    {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}
    {@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    + * @param param the value of {@code pname} + */ + public static void glSamplerParameteri(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint") int param) { + GL33C.glSamplerParameteri(sampler, pname, param); + } + + // --- [ glSamplerParameterf ] --- + + /** + * Float version of {@link #glSamplerParameteri SamplerParameteri}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a single-valued sampler parameter + * @param param the value of {@code pname} + */ + public static void glSamplerParameterf(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param) { + GL33C.glSamplerParameterf(sampler, pname, param); + } + + // --- [ glSamplerParameteriv ] --- + + /** Unsafe version of: {@link #glSamplerParameteriv SamplerParameteriv} */ + public static void nglSamplerParameteriv(int sampler, int pname, long params) { + GL33C.nglSamplerParameteriv(sampler, pname, params); + } + + /** + * Pointer version of {@link #glSamplerParameteri SamplerParameteri}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter. One of:
    {@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    + * @param params an array where the value or values of {@code pname} are stored + */ + public static void glSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + GL33C.glSamplerParameteriv(sampler, pname, params); + } + + // --- [ glSamplerParameterfv ] --- + + /** Unsafe version of: {@link #glSamplerParameterfv SamplerParameterfv} */ + public static void nglSamplerParameterfv(int sampler, int pname, long params) { + GL33C.nglSamplerParameterfv(sampler, pname, params); + } + + /** + * Float version of {@link #glSamplerParameteriv SamplerParameteriv}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter + * @param params an array where the value or values of {@code pname} are stored + */ + public static void glSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + GL33C.glSamplerParameterfv(sampler, pname, params); + } + + // --- [ glSamplerParameterIiv ] --- + + /** Unsafe version of: {@link #glSamplerParameterIiv SamplerParameterIiv} */ + public static void nglSamplerParameterIiv(int sampler, int pname, long params) { + GL33C.nglSamplerParameterIiv(sampler, pname, params); + } + + /** + * Pure integer version of {@link #glSamplerParameteriv SamplerParameteriv}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter + * @param params an array where the value or values of {@code pname} are stored + */ + public static void glSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + GL33C.glSamplerParameterIiv(sampler, pname, params); + } + + // --- [ glSamplerParameterIuiv ] --- + + /** Unsafe version of: {@link #glSamplerParameterIuiv SamplerParameterIuiv} */ + public static void nglSamplerParameterIuiv(int sampler, int pname, long params) { + GL33C.nglSamplerParameterIuiv(sampler, pname, params); + } + + /** + * Unsigned pure integer version of {@link #glSamplerParameteriv SamplerParameteriv}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter + * @param params an array where the value or values of {@code pname} are stored + */ + public static void glSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint const *") IntBuffer params) { + GL33C.glSamplerParameterIuiv(sampler, pname, params); + } + + // --- [ glGetSamplerParameteriv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameteriv GetSamplerParameteriv} */ + public static void nglGetSamplerParameteriv(int sampler, int pname, long params) { + GL33C.nglGetSamplerParameteriv(sampler, pname, params); + } + + /** + * Return the integer value(s) of a sampler parameter. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter. One of:
    {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}
    {@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    ,{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}
    + * @param params the sampler parameters + */ + public static void glGetSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL33C.glGetSamplerParameteriv(sampler, pname, params); + } + + /** + * Return the integer value(s) of a sampler parameter. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter. One of:
    {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}
    {@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    ,{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}
    + */ + @NativeType("void") + public static int glGetSamplerParameteri(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + return GL33C.glGetSamplerParameteri(sampler, pname); + } + + // --- [ glGetSamplerParameterfv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameterfv GetSamplerParameterfv} */ + public static void nglGetSamplerParameterfv(int sampler, int pname, long params) { + GL33C.nglGetSamplerParameterfv(sampler, pname, params); + } + + /** + * Float version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * @param params the sampler parameters + */ + public static void glGetSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + GL33C.glGetSamplerParameterfv(sampler, pname, params); + } + + /** + * Float version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + */ + @NativeType("void") + public static float glGetSamplerParameterf(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + return GL33C.glGetSamplerParameterf(sampler, pname); + } + + // --- [ glGetSamplerParameterIiv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameterIiv GetSamplerParameterIiv} */ + public static void nglGetSamplerParameterIiv(int sampler, int pname, long params) { + GL33C.nglGetSamplerParameterIiv(sampler, pname, params); + } + + /** + * Pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * @param params the sampler parameters + */ + public static void glGetSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL33C.glGetSamplerParameterIiv(sampler, pname, params); + } + + /** + * Pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + */ + @NativeType("void") + public static int glGetSamplerParameterIi(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + return GL33C.glGetSamplerParameterIi(sampler, pname); + } + + // --- [ glGetSamplerParameterIuiv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameterIuiv GetSamplerParameterIuiv} */ + public static void nglGetSamplerParameterIuiv(int sampler, int pname, long params) { + GL33C.nglGetSamplerParameterIuiv(sampler, pname, params); + } + + /** + * Unsigned pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * @param params the sampler parameters + */ + public static void glGetSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + GL33C.glGetSamplerParameterIuiv(sampler, pname, params); + } + + /** + * Unsigned pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + */ + @NativeType("void") + public static int glGetSamplerParameterIui(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + return GL33C.glGetSamplerParameterIui(sampler, pname); + } + + /** Array version of: {@link #glGenSamplers GenSamplers} */ + public static void glGenSamplers(@NativeType("GLuint *") int[] samplers) { + GL33C.glGenSamplers(samplers); + } + + /** Array version of: {@link #glDeleteSamplers DeleteSamplers} */ + public static void glDeleteSamplers(@NativeType("GLuint const *") int[] samplers) { + GL33C.glDeleteSamplers(samplers); + } + + /** Array version of: {@link #glSamplerParameteriv SamplerParameteriv} */ + public static void glSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + GL33C.glSamplerParameteriv(sampler, pname, params); + } + + /** Array version of: {@link #glSamplerParameterfv SamplerParameterfv} */ + public static void glSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + GL33C.glSamplerParameterfv(sampler, pname, params); + } + + /** Array version of: {@link #glSamplerParameterIiv SamplerParameterIiv} */ + public static void glSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + GL33C.glSamplerParameterIiv(sampler, pname, params); + } + + /** Array version of: {@link #glSamplerParameterIuiv SamplerParameterIuiv} */ + public static void glSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int[] params) { + GL33C.glSamplerParameterIuiv(sampler, pname, params); + } + + /** Array version of: {@link #glGetSamplerParameteriv GetSamplerParameteriv} */ + public static void glGetSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL33C.glGetSamplerParameteriv(sampler, pname, params); + } + + /** Array version of: {@link #glGetSamplerParameterfv GetSamplerParameterfv} */ + public static void glGetSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + GL33C.glGetSamplerParameterfv(sampler, pname, params); + } + + /** Array version of: {@link #glGetSamplerParameterIiv GetSamplerParameterIiv} */ + public static void glGetSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL33C.glGetSamplerParameterIiv(sampler, pname, params); + } + + /** Array version of: {@link #glGetSamplerParameterIuiv GetSamplerParameterIuiv} */ + public static void glGetSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + GL33C.glGetSamplerParameterIuiv(sampler, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeamlessCubeMap.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeamlessCubeMap.java new file mode 100644 index 000000000..b02fff02e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeamlessCubeMap.java @@ -0,0 +1,34 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_seamless_cube_map extension. + * + *

    When sampling from cube map textures, a three-dimensional texture coordinate is used to select one of the cube map faces and generate a two dimensional + * texture coordinate ( s t ), at which a texel is sampled from the determined face of the cube map texture. Each face of the texture is treated as an + * independent two-dimensional texture, and the generated ( s t ) coordinate is subjected to the same clamping and wrapping rules as for any other two + * dimensional texture fetch.

    + * + *

    Although it is unlikely that the generated ( s t ) coordinate lies significantly outside the determined cube map face, it is often the case that the + * locations of the individual elements required during a linear sampling do not lie within the determined face, and their coordinates will therefore be + * modified by the selected clamping and wrapping rules. This often has the effect of producing seams or other discontinuities in the sampled texture.

    + * + *

    This extension allows implementations to take samples from adjacent cube map faces, providing the ability to create seamless cube maps.

    + * + *

    Promoted to core in {@link GL32 OpenGL 3.2}.

    + */ +public final class ARBSeamlessCubeMap { + + /** + * Accepted by the {@code cap} parameter of Enable, Disable and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and + * GetDoublev. + */ + public static final int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + + private ARBSeamlessCubeMap() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeamlessCubemapPerTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeamlessCubemapPerTexture.java new file mode 100644 index 000000000..a9927e345 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeamlessCubemapPerTexture.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_seamless_cubemap_per_texture extension. + * + *

    In unextended OpenGL, cube maps are treated as sets of six, independent texture images. Once a face is selected from the set, it is treated exactly as + * any other two-dimensional texture would be. When sampling linearly from the texture, all of the individual texels that would be used to to create the + * final, bilinear sample values are taken from the same cube face. The normal, two-dimensional texture coordinate wrapping modes are honored. This + * sometimes causes seams to appear in cube maps.

    + * + *

    {@link ARBSeamlessCubeMap ARB_seamless_cube_map} (and subsequently, OpenGL 3.2) addresses this issue by providing a mechanism whereby an implementation could take each of + * the taps of a bilinear sample from a different face, spanning face boundaries and providing seamless filtering from cube map textures. However, in + * ARB_seamless_cube_map, this feature was exposed as a global state, affecting all bound cube map textures. It was not possible to mix seamless and + * per-face cube map sampling modes during sampling. Furthermore, if an application included cube maps that were meant to be sampled seamlessly and + * non-seamlessly, it would have to track this state and enable or disable seamless cube map sampling as needed.

    + * + *

    This extension addresses this issue and provides an orthogonal method for allowing an implementation to provide a per-texture setting for enabling + * seamless sampling from cube maps.

    + * + *

    Requires {@link GL32 OpenGL 3.2}.

    + */ +public final class ARBSeamlessCubemapPerTexture { + + /** + * Accepted by the {@code pname} parameter of TexParameter{if}, TexParameter{if}v, GetTexParameter{if}v, SamplerParameter{if}, SamplerParameter{if}v, and + * GetSamplerParameter{if}v. + */ + public static final int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + + private ARBSeamlessCubemapPerTexture() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeparateShaderObjects.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeparateShaderObjects.java new file mode 100644 index 000000000..9f9476f0e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSeparateShaderObjects.java @@ -0,0 +1,1597 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_separate_shader_objects extension. + * + *

    Conventional GLSL requires multiple shader stages (vertex, fragment, geometry, tessellation control, and tessellation evaluation) to be linked into a + * single monolithic program object to specify a GLSL shader for each stage.

    + * + *

    While GLSL's monolithic approach has some advantages for optimizing shaders as a unit that span multiple stages, all existing GPU hardware supports the + * more flexible mix-and-match approach.

    + * + *

    Shaders written for HLSL9, Cg, the prior OpenGL assembly program extensions, and game console favor a more flexible "mix-and-match" approach to + * specifying shaders independently for these different shader stages. Many developers build their shader content around the mix-and-match approach where + * they can use a single vertex shader with multiple fragment shaders (or vice versa).

    + * + *

    This extension adopts a "mix-and-match" shader stage model for GLSL allowing multiple different GLSL program objects to be bound at once each to an + * individual rendering pipeline stage independently of other stage bindings. This allows program objects to contain only the shader stages that best suit + * the applications needs.

    + * + *

    This extension introduces the program pipeline object that serves as a container for the program bound to any particular rendering stage. It can be + * bound, unbound, and rebound to simply save and restore the complete shader stage to program object bindings. Like framebuffer and vertex array objects, + * program pipeline objects are "container" objects that are not shared between contexts.

    + * + *

    To bind a program object to a specific shader stage or set of stages, {@link #glUseProgramStages UseProgramStages} is used. The {@link #GL_VERTEX_SHADER_BIT VERTEX_SHADER_BIT}, {@link #GL_GEOMETRY_SHADER_BIT GEOMETRY_SHADER_BIT}, + * {@link #GL_FRAGMENT_SHADER_BIT FRAGMENT_SHADER_BIT}, {@link #GL_TESS_CONTROL_SHADER_BIT TESS_CONTROL_SHADER_BIT}, and {@link #GL_TESS_EVALUATION_SHADER_BIT TESS_EVALUATION_SHADER_BIT} tokens refer to the conventional vertex, geometry, fragment, + * tessellation control and tessellation evaluation stages respectively. {@link #glActiveShaderProgram ActiveShaderProgram} specifies the program that Uniform* commands will update.

    + * + *

    While {@link #glActiveShaderProgram ActiveShaderProgram} allows the use of conventional Uniform* commands to update uniform variable values for separable program objects, this + * extension provides a preferrable interface in a set of ProgramUniform* commands that update the same uniform variables but take a parameter indicating + * the program object to be updated, rather than updating the currently active program object. These commands mirror those introduced in + * {@link EXTDirectStateAccess EXT_direct_state_access}.

    + * + *

    While {@link #glActiveShaderProgram ActiveShaderProgram} provides a selector for setting and querying uniform values of a program object, the glProgramUniform* commands provide a + * selector-free way to modify uniforms of a GLSL program object without an explicit bind. This selector-free model reduces API overhead and provides a + * cleaner interface for applications.

    + * + *

    Separate linking creates the possibility that certain output varyings of a shader may go unread by the subsequent shader inputting varyings. In this + * case, the output varyings are simply ignored. It is also possible input varyings from a shader may not be written as output varyings of a preceding + * shader. In this case, the unwritten input varying values are undefined.

    + * + *

    This extension builds on the proof-of-concept provided by {@link EXTSeparateShaderObjects EXT_separate_shader_objects} which demonstrated that separate shader objects can work + * for GLSL. {@code EXT_separate_shader_objects} was a response to repeated requests for this functionality from 3D developers.

    + * + *

    This ARB version addresses several "loose ends" in the prior EXT extension. In particular, it allows user-defined varyings with explicitly defined + * locations or implicitly assigned locations.

    + * + *

    This ARB extension extends the GLSL language's use of layout qualifiers to provide cross-stage interfacing.

    + * + *

    Requires {@link GL20 OpenGL 2.0} or {@link ARBShaderObjects ARB_shader_objects}. Promoted to core in {@link GL41 OpenGL 4.1}.

    + */ +public class ARBSeparateShaderObjects { + + static { GL.initialize(); } + + /** Accepted by {@code stages} parameter to UseProgramStages. */ + public static final int + GL_VERTEX_SHADER_BIT = 0x1, + GL_FRAGMENT_SHADER_BIT = 0x2, + GL_GEOMETRY_SHADER_BIT = 0x4, + GL_TESS_CONTROL_SHADER_BIT = 0x8, + GL_TESS_EVALUATION_SHADER_BIT = 0x10, + GL_ALL_SHADER_BITS = 0xFFFFFFFF; + + /** Accepted by the {@code pname} parameter of ProgramParameteri and GetProgramiv. */ + public static final int GL_PROGRAM_SEPARABLE = 0x8258; + + /** Accepted by {@code type} parameter to GetProgramPipelineiv. */ + public static final int GL_ACTIVE_PROGRAM = 0x8259; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_PROGRAM_PIPELINE_BINDING = 0x825A; + + protected ARBSeparateShaderObjects() { + throw new UnsupportedOperationException(); + } + + // --- [ glUseProgramStages ] --- + + /** + * Binds stages of a program object to a program pipeline. + * + * @param pipeline the program pipeline object to which to bind stages from {@code program} + * @param stages a set of program stages to bind to the program pipeline object + * @param program the program object containing the shader executables to use in {@code pipeline} + */ + public static void glUseProgramStages(@NativeType("GLuint") int pipeline, @NativeType("GLbitfield") int stages, @NativeType("GLuint") int program) { + GL41C.glUseProgramStages(pipeline, stages, program); + } + + // --- [ glActiveShaderProgram ] --- + + /** + * Sets the active program object for a program pipeline object. + * + * @param pipeline the program pipeline object to set the active program object for + * @param program the program object to set as the active program pipeline object {@code pipeline} + */ + public static void glActiveShaderProgram(@NativeType("GLuint") int pipeline, @NativeType("GLuint") int program) { + GL41C.glActiveShaderProgram(pipeline, program); + } + + // --- [ glCreateShaderProgramv ] --- + + /** + * Unsafe version of: {@link #glCreateShaderProgramv CreateShaderProgramv} + * + * @param count the number of source code strings in the array {@code strings} + */ + public static int nglCreateShaderProgramv(int type, int count, long strings) { + return GL41C.nglCreateShaderProgramv(type, count, strings); + } + + /** + * Creates a stand-alone program from an array of null-terminated source code strings. + * + *

    {@code glCreateShaderProgram} is equivalent (assuming no errors are generated) to:

    + * + *
    
    +     * const GLuint shader = glCreateShader(type);
    +     * if (shader) {
    +     *     glShaderSource(shader, count, strings, NULL);
    +     *     glCompileShader(shader);
    +     *     const GLuint program = glCreateProgram();
    +     *     if (program) {
    +     *         GLint compiled = GL_FALSE;
    +     *         glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    +     *         glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
    +     *         if (compiled) {
    +     *             glAttachShader(program, shader);
    +     *             glLinkProgram(program);
    +     *             glDetachShader(program, shader);
    +     *         }
    +     *         // append-shader-info-log-to-program-info-log
    +     *     }
    +     *     glDeleteShader(shader);
    +     *     return program;
    +     * } else {
    +     *     return 0;
    +     * }
    + * + *

    The program object created by glCreateShaderProgram has its GL_PROGRAM_SEPARABLE status set to GL_TRUE.

    + * + * @param type the type of shader to create + * @param strings an array of pointers to source code strings from which to create the program object + */ + @NativeType("GLuint") + public static int glCreateShaderProgramv(@NativeType("GLenum") int type, @NativeType("GLchar const * const *") PointerBuffer strings) { + return GL41C.glCreateShaderProgramv(type, strings); + } + + /** + * Creates a stand-alone program from an array of null-terminated source code strings. + * + *

    {@code glCreateShaderProgram} is equivalent (assuming no errors are generated) to:

    + * + *
    
    +     * const GLuint shader = glCreateShader(type);
    +     * if (shader) {
    +     *     glShaderSource(shader, count, strings, NULL);
    +     *     glCompileShader(shader);
    +     *     const GLuint program = glCreateProgram();
    +     *     if (program) {
    +     *         GLint compiled = GL_FALSE;
    +     *         glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    +     *         glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
    +     *         if (compiled) {
    +     *             glAttachShader(program, shader);
    +     *             glLinkProgram(program);
    +     *             glDetachShader(program, shader);
    +     *         }
    +     *         // append-shader-info-log-to-program-info-log
    +     *     }
    +     *     glDeleteShader(shader);
    +     *     return program;
    +     * } else {
    +     *     return 0;
    +     * }
    + * + *

    The program object created by glCreateShaderProgram has its GL_PROGRAM_SEPARABLE status set to GL_TRUE.

    + * + * @param type the type of shader to create + * @param strings an array of pointers to source code strings from which to create the program object + */ + @NativeType("GLuint") + public static int glCreateShaderProgramv(@NativeType("GLenum") int type, @NativeType("GLchar const * const *") CharSequence... strings) { + return GL41C.glCreateShaderProgramv(type, strings); + } + + /** + * Creates a stand-alone program from an array of null-terminated source code strings. + * + *

    {@code glCreateShaderProgram} is equivalent (assuming no errors are generated) to:

    + * + *
    
    +     * const GLuint shader = glCreateShader(type);
    +     * if (shader) {
    +     *     glShaderSource(shader, count, strings, NULL);
    +     *     glCompileShader(shader);
    +     *     const GLuint program = glCreateProgram();
    +     *     if (program) {
    +     *         GLint compiled = GL_FALSE;
    +     *         glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    +     *         glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
    +     *         if (compiled) {
    +     *             glAttachShader(program, shader);
    +     *             glLinkProgram(program);
    +     *             glDetachShader(program, shader);
    +     *         }
    +     *         // append-shader-info-log-to-program-info-log
    +     *     }
    +     *     glDeleteShader(shader);
    +     *     return program;
    +     * } else {
    +     *     return 0;
    +     * }
    + * + *

    The program object created by glCreateShaderProgram has its GL_PROGRAM_SEPARABLE status set to GL_TRUE.

    + * + * @param type the type of shader to create + */ + @NativeType("GLuint") + public static int glCreateShaderProgramv(@NativeType("GLenum") int type, @NativeType("GLchar const * const *") CharSequence string) { + return GL41C.glCreateShaderProgramv(type, string); + } + + // --- [ glBindProgramPipeline ] --- + + /** + * Binds a program pipeline to the current context. + * + * @param pipeline the name of the pipeline object to bind to the context + */ + public static void glBindProgramPipeline(@NativeType("GLuint") int pipeline) { + GL41C.glBindProgramPipeline(pipeline); + } + + // --- [ glDeleteProgramPipelines ] --- + + /** + * Unsafe version of: {@link #glDeleteProgramPipelines DeleteProgramPipelines} + * + * @param n the number of program pipeline objects to delete + */ + public static void nglDeleteProgramPipelines(int n, long pipelines) { + GL41C.nglDeleteProgramPipelines(n, pipelines); + } + + /** + * Deletes program pipeline objects. + * + * @param pipelines an array of names of program pipeline objects to delete + */ + public static void glDeleteProgramPipelines(@NativeType("GLuint const *") IntBuffer pipelines) { + GL41C.glDeleteProgramPipelines(pipelines); + } + + /** Deletes program pipeline objects. */ + public static void glDeleteProgramPipelines(@NativeType("GLuint const *") int pipeline) { + GL41C.glDeleteProgramPipelines(pipeline); + } + + // --- [ glGenProgramPipelines ] --- + + /** + * Unsafe version of: {@link #glGenProgramPipelines GenProgramPipelines} + * + * @param n the number of program pipeline object names to reserve + */ + public static void nglGenProgramPipelines(int n, long pipelines) { + GL41C.nglGenProgramPipelines(n, pipelines); + } + + /** + * Reserves program pipeline object names. + * + * @param pipelines an array of into which the reserved names will be written + */ + public static void glGenProgramPipelines(@NativeType("GLuint *") IntBuffer pipelines) { + GL41C.glGenProgramPipelines(pipelines); + } + + /** Reserves program pipeline object names. */ + @NativeType("void") + public static int glGenProgramPipelines() { + return GL41C.glGenProgramPipelines(); + } + + // --- [ glIsProgramPipeline ] --- + + /** + * Determines if a name corresponds to a program pipeline object. + * + * @param pipeline a value that may be the name of a program pipeline object + */ + @NativeType("GLboolean") + public static boolean glIsProgramPipeline(@NativeType("GLuint") int pipeline) { + return GL41C.glIsProgramPipeline(pipeline); + } + + // --- [ glProgramParameteri ] --- + + /** + * Specifies the integer value of a program object parameter. + * + * @param program the name of a program object whose parameter to modify + * @param pname the name of the parameter to modify. One of:
    {@link GL41C#GL_PROGRAM_BINARY_RETRIEVABLE_HINT PROGRAM_BINARY_RETRIEVABLE_HINT}{@link GL41C#GL_PROGRAM_SEPARABLE PROGRAM_SEPARABLE}
    + * @param value the new value of the parameter specified by {@code pname} for {@code program} + */ + public static void glProgramParameteri(@NativeType("GLuint") int program, @NativeType("GLenum") int pname, @NativeType("GLint") int value) { + GL41C.glProgramParameteri(program, pname, value); + } + + // --- [ glGetProgramPipelineiv ] --- + + /** Unsafe version of: {@link #glGetProgramPipelineiv GetProgramPipelineiv} */ + public static void nglGetProgramPipelineiv(int pipeline, int pname, long params) { + GL41C.nglGetProgramPipelineiv(pipeline, pname, params); + } + + /** + * Retrieves properties of a program pipeline object. + * + * @param pipeline the name of a program pipeline object whose parameter retrieve + * @param pname the name of the parameter to retrieve. One of:
    {@link GL41C#GL_ACTIVE_PROGRAM ACTIVE_PROGRAM}{@link GL20#GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}
    {@link GL40#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}{@link GL40#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param params a variable into which will be written the value or values of {@code pname} for {@code pipeline} + */ + public static void glGetProgramPipelineiv(@NativeType("GLuint") int pipeline, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL41C.glGetProgramPipelineiv(pipeline, pname, params); + } + + /** + * Retrieves properties of a program pipeline object. + * + * @param pipeline the name of a program pipeline object whose parameter retrieve + * @param pname the name of the parameter to retrieve. One of:
    {@link GL41C#GL_ACTIVE_PROGRAM ACTIVE_PROGRAM}{@link GL20#GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}
    {@link GL40#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}{@link GL40#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + */ + @NativeType("void") + public static int glGetProgramPipelinei(@NativeType("GLuint") int pipeline, @NativeType("GLenum") int pname) { + return GL41C.glGetProgramPipelinei(pipeline, pname); + } + + // --- [ glProgramUniform1i ] --- + + /** + * Specifies the value of an int uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + */ + public static void glProgramUniform1i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x) { + GL41C.glProgramUniform1i(program, location, x); + } + + // --- [ glProgramUniform2i ] --- + + /** + * Specifies the value of an ivec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + */ + public static void glProgramUniform2i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x, @NativeType("GLint") int y) { + GL41C.glProgramUniform2i(program, location, x, y); + } + + // --- [ glProgramUniform3i ] --- + + /** + * Specifies the value of an ivec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + */ + public static void glProgramUniform3i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z) { + GL41C.glProgramUniform3i(program, location, x, y, z); + } + + // --- [ glProgramUniform4i ] --- + + /** + * Specifies the value of an ivec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + */ + public static void glProgramUniform4i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w) { + GL41C.glProgramUniform4i(program, location, x, y, z, w); + } + + // --- [ glProgramUniform1ui ] --- + + /** + * Specifies the value of a uint uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + */ + public static void glProgramUniform1ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x) { + GL41C.glProgramUniform1ui(program, location, x); + } + + // --- [ glProgramUniform2ui ] --- + + /** + * Specifies the value of a uvec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + */ + public static void glProgramUniform2ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x, @NativeType("GLuint") int y) { + GL41C.glProgramUniform2ui(program, location, x, y); + } + + // --- [ glProgramUniform3ui ] --- + + /** + * Specifies the value of a uvec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + */ + public static void glProgramUniform3ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x, @NativeType("GLuint") int y, @NativeType("GLuint") int z) { + GL41C.glProgramUniform3ui(program, location, x, y, z); + } + + // --- [ glProgramUniform4ui ] --- + + /** + * Specifies the value of a uvec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + */ + public static void glProgramUniform4ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x, @NativeType("GLuint") int y, @NativeType("GLuint") int z, @NativeType("GLuint") int w) { + GL41C.glProgramUniform4ui(program, location, x, y, z, w); + } + + // --- [ glProgramUniform1f ] --- + + /** + * Specifies the value of a float uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + */ + public static void glProgramUniform1f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x) { + GL41C.glProgramUniform1f(program, location, x); + } + + // --- [ glProgramUniform2f ] --- + + /** + * Specifies the value of a vec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + */ + public static void glProgramUniform2f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y) { + GL41C.glProgramUniform2f(program, location, x, y); + } + + // --- [ glProgramUniform3f ] --- + + /** + * Specifies the value of a vec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + */ + public static void glProgramUniform3f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z) { + GL41C.glProgramUniform3f(program, location, x, y, z); + } + + // --- [ glProgramUniform4f ] --- + + /** + * Specifies the value of a vec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + */ + public static void glProgramUniform4f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z, @NativeType("GLfloat") float w) { + GL41C.glProgramUniform4f(program, location, x, y, z, w); + } + + // --- [ glProgramUniform1d ] --- + + /** + * Specifies the value of a double uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + */ + public static void glProgramUniform1d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x) { + GL41C.glProgramUniform1d(program, location, x); + } + + // --- [ glProgramUniform2d ] --- + + /** + * Specifies the value of a dvec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + */ + public static void glProgramUniform2d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y) { + GL41C.glProgramUniform2d(program, location, x, y); + } + + // --- [ glProgramUniform3d ] --- + + /** + * Specifies the value of a dvec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + */ + public static void glProgramUniform3d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z) { + GL41C.glProgramUniform3d(program, location, x, y, z); + } + + // --- [ glProgramUniform4d ] --- + + /** + * Specifies the value of a dvec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + */ + public static void glProgramUniform4d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w) { + GL41C.glProgramUniform4d(program, location, x, y, z, w); + } + + // --- [ glProgramUniform1iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1iv ProgramUniform1iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform1iv(int program, int location, int count, long value) { + GL41C.nglProgramUniform1iv(program, location, count, value); + } + + /** + * Specifies the value of a single float uniform variable or a float uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform1iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL41C.glProgramUniform1iv(program, location, value); + } + + // --- [ glProgramUniform2iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2iv ProgramUniform2iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform2iv(int program, int location, int count, long value) { + GL41C.nglProgramUniform2iv(program, location, count, value); + } + + /** + * Specifies the value of a single ivec2 uniform variable or an ivec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform2iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL41C.glProgramUniform2iv(program, location, value); + } + + // --- [ glProgramUniform3iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3iv ProgramUniform3iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform3iv(int program, int location, int count, long value) { + GL41C.nglProgramUniform3iv(program, location, count, value); + } + + /** + * Specifies the value of a single ivec3 uniform variable or an ivec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform3iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL41C.glProgramUniform3iv(program, location, value); + } + + // --- [ glProgramUniform4iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4iv ProgramUniform4iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform4iv(int program, int location, int count, long value) { + GL41C.nglProgramUniform4iv(program, location, count, value); + } + + /** + * Specifies the value of a single ivec4 uniform variable or an ivec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform4iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL41C.glProgramUniform4iv(program, location, value); + } + + // --- [ glProgramUniform1uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1uiv ProgramUniform1uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform1uiv(int program, int location, int count, long value) { + GL41C.nglProgramUniform1uiv(program, location, count, value); + } + + /** + * Specifies the value of a single uint uniform variable or a uint uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform1uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL41C.glProgramUniform1uiv(program, location, value); + } + + // --- [ glProgramUniform2uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2uiv ProgramUniform2uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform2uiv(int program, int location, int count, long value) { + GL41C.nglProgramUniform2uiv(program, location, count, value); + } + + /** + * Specifies the value of a single uvec2 uniform variable or a uvec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform2uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL41C.glProgramUniform2uiv(program, location, value); + } + + // --- [ glProgramUniform3uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3uiv ProgramUniform3uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform3uiv(int program, int location, int count, long value) { + GL41C.nglProgramUniform3uiv(program, location, count, value); + } + + /** + * Specifies the value of a single uvec3 uniform variable or a uvec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform3uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL41C.glProgramUniform3uiv(program, location, value); + } + + // --- [ glProgramUniform4uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4uiv ProgramUniform4uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform4uiv(int program, int location, int count, long value) { + GL41C.nglProgramUniform4uiv(program, location, count, value); + } + + /** + * Specifies the value of a single uvec4 uniform variable or a uvec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform4uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL41C.glProgramUniform4uiv(program, location, value); + } + + // --- [ glProgramUniform1fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1fv ProgramUniform1fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform1fv(int program, int location, int count, long value) { + GL41C.nglProgramUniform1fv(program, location, count, value); + } + + /** + * Specifies the value of a single float uniform variable or a float uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform1fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniform1fv(program, location, value); + } + + // --- [ glProgramUniform2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2fv ProgramUniform2fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform2fv(int program, int location, int count, long value) { + GL41C.nglProgramUniform2fv(program, location, count, value); + } + + /** + * Specifies the value of a single vec2 uniform variable or a vec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniform2fv(program, location, value); + } + + // --- [ glProgramUniform3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3fv ProgramUniform3fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform3fv(int program, int location, int count, long value) { + GL41C.nglProgramUniform3fv(program, location, count, value); + } + + /** + * Specifies the value of a single vec3 uniform variable or a vec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniform3fv(program, location, value); + } + + // --- [ glProgramUniform4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4fv ProgramUniform4fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform4fv(int program, int location, int count, long value) { + GL41C.nglProgramUniform4fv(program, location, count, value); + } + + /** + * Specifies the value of a single vec4 uniform variable or a vec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniform4fv(program, location, value); + } + + // --- [ glProgramUniform1dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1dv ProgramUniform1dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform1dv(int program, int location, int count, long value) { + GL41C.nglProgramUniform1dv(program, location, count, value); + } + + /** + * Specifies the value of a single double uniform variable or a double uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform1dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniform1dv(program, location, value); + } + + // --- [ glProgramUniform2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2dv ProgramUniform2dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform2dv(int program, int location, int count, long value) { + GL41C.nglProgramUniform2dv(program, location, count, value); + } + + /** + * Specifies the value of a single dvec2 uniform variable or a dvec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniform2dv(program, location, value); + } + + // --- [ glProgramUniform3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3dv ProgramUniform3dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform3dv(int program, int location, int count, long value) { + GL41C.nglProgramUniform3dv(program, location, count, value); + } + + /** + * Specifies the value of a single dvec3 uniform variable or a dvec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniform3dv(program, location, value); + } + + // --- [ glProgramUniform4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4dv ProgramUniform4dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform4dv(int program, int location, int count, long value) { + GL41C.nglProgramUniform4dv(program, location, count, value); + } + + /** + * Specifies the value of a single dvec4 uniform variable or a dvec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + */ + public static void glProgramUniform4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniform4dv(program, location, value); + } + + // --- [ glProgramUniformMatrix2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2fv ProgramUniformMatrix2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat2 uniform variable or a mat2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix2fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3fv ProgramUniformMatrix3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat3 uniform variable or a mat3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix3fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4fv ProgramUniformMatrix4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat4 uniform variable or a mat4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix4fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2dv ProgramUniformMatrix2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2 uniform variable or a dmat2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix2dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3dv ProgramUniformMatrix3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3 uniform variable or a dmat3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix3dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4dv ProgramUniformMatrix4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4 uniform variable or a dmat4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix4dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix2x3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x3fv ProgramUniformMatrix2x3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2x3fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2x3fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat2x3 uniform variable or a mat2x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix2x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix2x3fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3x2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x2fv ProgramUniformMatrix3x2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3x2fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3x2fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat3x2 uniform variable or a mat3x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix3x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix3x2fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix2x4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x4fv ProgramUniformMatrix2x4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2x4fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2x4fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat2x4 uniform variable or a mat2x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix2x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix2x4fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4x2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x2fv ProgramUniformMatrix4x2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4x2fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4x2fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat4x2 uniform variable or a mat4x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix4x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix4x2fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3x4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x4fv ProgramUniformMatrix3x4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3x4fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3x4fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat3x4 uniform variable or a mat3x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix3x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix3x4fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4x3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x3fv ProgramUniformMatrix4x3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4x3fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4x3fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat4x3 uniform variable or a mat4x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix4x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix4x3fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix2x3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x3dv ProgramUniformMatrix2x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2x3dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2x3dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2x3 uniform variable or a dmat2x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix2x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix2x3dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3x2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x2dv ProgramUniformMatrix3x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3x2dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3x2dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3x2 uniform variable or a dmat3x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix3x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix3x2dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix2x4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x4dv ProgramUniformMatrix2x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2x4dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2x4dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2x4 uniform variable or a dmat2x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix2x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix2x4dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4x2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x2dv ProgramUniformMatrix4x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4x2dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4x2dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4x2 uniform variable or a dmat4x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix4x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix4x2dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3x4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x4dv ProgramUniformMatrix3x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3x4dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3x4dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3x4 uniform variable or a dmat3x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix3x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix3x4dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4x3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x3dv ProgramUniformMatrix4x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4x3dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4x3dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4x3 uniform variable or a dmat4x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + */ + public static void glProgramUniformMatrix4x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix4x3dv(program, location, transpose, value); + } + + // --- [ glValidateProgramPipeline ] --- + + /** + * Validates a program pipeline object against current GL state. + * + * @param pipeline the name of a program pipeline object to validate + */ + public static void glValidateProgramPipeline(@NativeType("GLuint") int pipeline) { + GL41C.glValidateProgramPipeline(pipeline); + } + + // --- [ glGetProgramPipelineInfoLog ] --- + + /** + * Unsafe version of: {@link #glGetProgramPipelineInfoLog GetProgramPipelineInfoLog} + * + * @param bufSize the maximum number of characters, including the null terminator, that may be written into {@code infoLog} + */ + public static void nglGetProgramPipelineInfoLog(int pipeline, int bufSize, long length, long infoLog) { + GL41C.nglGetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog); + } + + /** + * Retrieves the info log string from a program pipeline object. + * + * @param pipeline the name of a program pipeline object from which to retrieve the info log + * @param length a variable into which will be written the number of characters written into {@code infoLog} + * @param infoLog an array of characters into which will be written the info log for {@code pipeline} + */ + public static void glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer infoLog) { + GL41C.glGetProgramPipelineInfoLog(pipeline, length, infoLog); + } + + /** + * Retrieves the info log string from a program pipeline object. + * + * @param pipeline the name of a program pipeline object from which to retrieve the info log + * @param bufSize the maximum number of characters, including the null terminator, that may be written into {@code infoLog} + */ + @NativeType("void") + public static String glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline, @NativeType("GLsizei") int bufSize) { + return GL41C.glGetProgramPipelineInfoLog(pipeline, bufSize); + } + + /** + * Retrieves the info log string from a program pipeline object. + * + * @param pipeline the name of a program pipeline object from which to retrieve the info log + */ + @NativeType("void") + public static String glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline) { + return glGetProgramPipelineInfoLog(pipeline, glGetProgramPipelinei(pipeline, GL20.GL_INFO_LOG_LENGTH)); + } + + /** Array version of: {@link #glDeleteProgramPipelines DeleteProgramPipelines} */ + public static void glDeleteProgramPipelines(@NativeType("GLuint const *") int[] pipelines) { + GL41C.glDeleteProgramPipelines(pipelines); + } + + /** Array version of: {@link #glGenProgramPipelines GenProgramPipelines} */ + public static void glGenProgramPipelines(@NativeType("GLuint *") int[] pipelines) { + GL41C.glGenProgramPipelines(pipelines); + } + + /** Array version of: {@link #glGetProgramPipelineiv GetProgramPipelineiv} */ + public static void glGetProgramPipelineiv(@NativeType("GLuint") int pipeline, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL41C.glGetProgramPipelineiv(pipeline, pname, params); + } + + /** Array version of: {@link #glProgramUniform1iv ProgramUniform1iv} */ + public static void glProgramUniform1iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL41C.glProgramUniform1iv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform2iv ProgramUniform2iv} */ + public static void glProgramUniform2iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL41C.glProgramUniform2iv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform3iv ProgramUniform3iv} */ + public static void glProgramUniform3iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL41C.glProgramUniform3iv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform4iv ProgramUniform4iv} */ + public static void glProgramUniform4iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL41C.glProgramUniform4iv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform1uiv ProgramUniform1uiv} */ + public static void glProgramUniform1uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL41C.glProgramUniform1uiv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform2uiv ProgramUniform2uiv} */ + public static void glProgramUniform2uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL41C.glProgramUniform2uiv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform3uiv ProgramUniform3uiv} */ + public static void glProgramUniform3uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL41C.glProgramUniform3uiv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform4uiv ProgramUniform4uiv} */ + public static void glProgramUniform4uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL41C.glProgramUniform4uiv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform1fv ProgramUniform1fv} */ + public static void glProgramUniform1fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniform1fv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform2fv ProgramUniform2fv} */ + public static void glProgramUniform2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniform2fv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform3fv ProgramUniform3fv} */ + public static void glProgramUniform3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniform3fv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform4fv ProgramUniform4fv} */ + public static void glProgramUniform4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniform4fv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform1dv ProgramUniform1dv} */ + public static void glProgramUniform1dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniform1dv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform2dv ProgramUniform2dv} */ + public static void glProgramUniform2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniform2dv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform3dv ProgramUniform3dv} */ + public static void glProgramUniform3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniform3dv(program, location, value); + } + + /** Array version of: {@link #glProgramUniform4dv ProgramUniform4dv} */ + public static void glProgramUniform4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniform4dv(program, location, value); + } + + /** Array version of: {@link #glProgramUniformMatrix2fv ProgramUniformMatrix2fv} */ + public static void glProgramUniformMatrix2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix2fv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix3fv ProgramUniformMatrix3fv} */ + public static void glProgramUniformMatrix3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix3fv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix4fv ProgramUniformMatrix4fv} */ + public static void glProgramUniformMatrix4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix4fv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix2dv ProgramUniformMatrix2dv} */ + public static void glProgramUniformMatrix2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix2dv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix3dv ProgramUniformMatrix3dv} */ + public static void glProgramUniformMatrix3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix3dv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix4dv ProgramUniformMatrix4dv} */ + public static void glProgramUniformMatrix4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix4dv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix2x3fv ProgramUniformMatrix2x3fv} */ + public static void glProgramUniformMatrix2x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix2x3fv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix3x2fv ProgramUniformMatrix3x2fv} */ + public static void glProgramUniformMatrix3x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix3x2fv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix2x4fv ProgramUniformMatrix2x4fv} */ + public static void glProgramUniformMatrix2x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix2x4fv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix4x2fv ProgramUniformMatrix4x2fv} */ + public static void glProgramUniformMatrix4x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix4x2fv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix3x4fv ProgramUniformMatrix3x4fv} */ + public static void glProgramUniformMatrix3x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix3x4fv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix4x3fv ProgramUniformMatrix4x3fv} */ + public static void glProgramUniformMatrix4x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix4x3fv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix2x3dv ProgramUniformMatrix2x3dv} */ + public static void glProgramUniformMatrix2x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix2x3dv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix3x2dv ProgramUniformMatrix3x2dv} */ + public static void glProgramUniformMatrix3x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix3x2dv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix2x4dv ProgramUniformMatrix2x4dv} */ + public static void glProgramUniformMatrix2x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix2x4dv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix4x2dv ProgramUniformMatrix4x2dv} */ + public static void glProgramUniformMatrix4x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix4x2dv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix3x4dv ProgramUniformMatrix3x4dv} */ + public static void glProgramUniformMatrix3x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix3x4dv(program, location, transpose, value); + } + + /** Array version of: {@link #glProgramUniformMatrix4x3dv ProgramUniformMatrix4x3dv} */ + public static void glProgramUniformMatrix4x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix4x3dv(program, location, transpose, value); + } + + /** Array version of: {@link #glGetProgramPipelineInfoLog GetProgramPipelineInfoLog} */ + public static void glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer infoLog) { + GL41C.glGetProgramPipelineInfoLog(pipeline, length, infoLog); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderAtomicCounters.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderAtomicCounters.java new file mode 100644 index 000000000..2d3292a3f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderAtomicCounters.java @@ -0,0 +1,136 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_shader_atomic_counters extension. + * + *

    This extension provides a set of atomic counters.

    + * + *

    This extension provides GLSL built-in functions to query and increment/decrement these atomic counters.

    + * + *

    This enables a shader to write to unique offsets (append to a buffer object) or read from unique offsets (consume from a buffer object).

    + * + *

    Opaque handles to atomic counters are declared at global scope and are qualified with the uniform qualifier.

    + * + *

    Unlike other user-defined uniforms declared at global scope, they take NO storage from the default partition, they have NO location, and they may NOT be + * set with the Uniform* commands. Atomic counters may also NOT be grouped into uniform blocks.

    + * + *

    Active atomic counters can be discovered by the commands {@link GL31C#glGetUniformIndices GetUniformIndices}, {@link GL31C#glGetActiveUniformName GetActiveUniformName}, {@link GL20C#glGetActiveUniform GetActiveUniform} and + * {@link GL31C#glGetActiveUniformsiv GetActiveUniformsiv}.

    + * + *

    Like samplers, the opaque handles of the atomic counters and are ONLY used in some GLSL built-in functions.

    + * + *

    The atomic counters pointed to by the opaque handles are bound to buffer binding points and buffer offsets through the layout qualifiers in the shading + * language, or they are implicitly assigned by the compiler.

    + * + *

    Through the OpenGL API, buffer objects may be bound to these binding points with {@link GL30C#glBindBufferBase BindBufferBase} or {@link GL30C#glBindBufferRange BindBufferRange}.

    + * + *

    The contents of the atomic counters are stored in the buffer objects. The contents of atomic counters may be set and queried with buffer object + * manipulation functions (e.g. BufferData, BufferSubData, MapBuffer or MapBufferRange).

    + * + *

    Requires {@link GL30 OpenGL 3.0}. Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ +public class ARBShaderAtomicCounters { + + static { GL.initialize(); } + + /** Accepted by the {@code target} parameter of BindBufferBase and BindBufferRange. */ + public static final int GL_ATOMIC_COUNTER_BUFFER = 0x92C0; + + /** + * Accepted by the {@code pname} parameter of GetBooleani_v, GetIntegeri_v, GetFloati_v, GetDoublei_v, GetInteger64i_v, GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, GetDoublev, and GetActiveAtomicCounterBufferiv. + */ + public static final int GL_ATOMIC_COUNTER_BUFFER_BINDING = 0x92C1; + + /** Accepted by the {@code pname} parameter of GetIntegeri_64v. */ + public static final int + GL_ATOMIC_COUNTER_BUFFER_START = 0x92C2, + GL_ATOMIC_COUNTER_BUFFER_SIZE = 0x92C3; + + /** Accepted by the {@code pname} parameter of GetActiveAtomicCounterBufferiv. */ + public static final int + GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE = 0x92C4, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS = 0x92C5, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES = 0x92C6, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER = 0x92C7, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER = 0x92C8, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x92C9, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER = 0x92CA, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER = 0x92CB; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS = 0x92CC, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS = 0x92CD, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS = 0x92CE, + GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS = 0x92CF, + GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS = 0x92D0, + GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS = 0x92D1, + GL_MAX_VERTEX_ATOMIC_COUNTERS = 0x92D2, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS = 0x92D3, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS = 0x92D4, + GL_MAX_GEOMETRY_ATOMIC_COUNTERS = 0x92D5, + GL_MAX_FRAGMENT_ATOMIC_COUNTERS = 0x92D6, + GL_MAX_COMBINED_ATOMIC_COUNTERS = 0x92D7, + GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE = 0x92D8, + GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 0x92DC; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_ACTIVE_ATOMIC_COUNTER_BUFFERS = 0x92D9; + + /** Accepted by the {@code pname} parameter of GetActiveUniformsiv. */ + public static final int GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX = 0x92DA; + + /** Returned in {@code params} by GetActiveUniform and GetActiveUniformsiv. */ + public static final int GL_UNSIGNED_INT_ATOMIC_COUNTER = 0x92DB; + + protected ARBShaderAtomicCounters() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetActiveAtomicCounterBufferiv ] --- + + /** Unsafe version of: {@link #glGetActiveAtomicCounterBufferiv GetActiveAtomicCounterBufferiv} */ + public static void nglGetActiveAtomicCounterBufferiv(int program, int bufferIndex, int pname, long params) { + GL42C.nglGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params); + } + + /** + * Obtains information about the set of active atomic counter buffers for a program. + * + * @param program the name of a program object for which the command {@link GL20C#glLinkProgram LinkProgram} has been issued in the past + * @param bufferIndex the index of an active atomic counter buffer + * @param pname the parameter to query. One of:
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE ATOMIC_COUNTER_BUFFER_DATA_SIZE}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER}
    + * @param params a buffer in which to place the returned value + */ + public static void glGetActiveAtomicCounterBufferiv(@NativeType("GLuint") int program, @NativeType("GLuint") int bufferIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL42C.glGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params); + } + + /** + * Obtains information about the set of active atomic counter buffers for a program. + * + * @param program the name of a program object for which the command {@link GL20C#glLinkProgram LinkProgram} has been issued in the past + * @param bufferIndex the index of an active atomic counter buffer + * @param pname the parameter to query. One of:
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE ATOMIC_COUNTER_BUFFER_DATA_SIZE}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER}
    + */ + @NativeType("void") + public static int glGetActiveAtomicCounterBufferi(@NativeType("GLuint") int program, @NativeType("GLuint") int bufferIndex, @NativeType("GLenum") int pname) { + return GL42C.glGetActiveAtomicCounterBufferi(program, bufferIndex, pname); + } + + /** Array version of: {@link #glGetActiveAtomicCounterBufferiv GetActiveAtomicCounterBufferiv} */ + public static void glGetActiveAtomicCounterBufferiv(@NativeType("GLuint") int program, @NativeType("GLuint") int bufferIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL42C.glGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderImageLoadStore.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderImageLoadStore.java new file mode 100644 index 000000000..6a1840876 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderImageLoadStore.java @@ -0,0 +1,158 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_shader_image_load_store extension. + * + *

    This extension provides GLSL built-in functions allowing shaders to load from, store to, and perform atomic read-modify-write operations to a single + * level of a texture object from any shader stage. These built-in functions are named imageLoad(), imageStore(), and imageAtomic*(), respectively, and + * accept integer texel coordinates to identify the texel accessed. The extension adds the notion of "image units" to the OpenGL API, to which texture + * levels are bound for access by the GLSL built-in functions. To allow shaders to specify the image unit to access, GLSL provides a new set of data types + * ("image*") similar to samplers. Each image variable is assigned an integer value to identify an image unit to access, which is specified using + * Uniform*() APIs in a manner similar to samplers.

    + * + *

    This extension also provides the capability to explicitly enable "early" per-fragment tests, where operations like depth and stencil testing are + * performed prior to fragment shader execution. In unextended OpenGL, fragment shaders never have any side effects and implementations can sometimes + * perform per-fragment tests and discard some fragments prior to executing the fragment shader. Since this extension allows fragment shaders to write to + * texture and buffer object memory using the built-in image functions, such optimizations could lead to non-deterministic results. To avoid this, + * implementations supporting this extension may not perform such optimizations on shaders having such side effects. However, enabling early per-fragment + * tests guarantees that such tests will be performed prior to fragment shader execution, and ensures that image stores and atomics will not be performed + * by fragment shader invocations where these per-fragment tests fail.

    + * + *

    Finally, this extension provides both a GLSL built-in function and an OpenGL API function allowing applications some control over the ordering of image + * loads, stores, and atomics relative to other OpenGL pipeline operations accessing the same memory. Because the extension provides the ability to perform + * random accesses to texture or buffer object memory, such accesses are not easily tracked by the OpenGL driver. To avoid the need for heavy-handed + * synchronization at the driver level, this extension requires manual synchronization. The MemoryBarrier() OpenGL API function allows applications to + * specify a bitfield indicating the set of OpenGL API operations to synchronize relative to shader memory access. The memoryBarrier() GLSL built-in + * function provides a synchronization point within a given shader invocation to ensure that all memory accesses performed prior to the synchronization + * point complete prior to any started after the synchronization point.

    + * + *

    Requires {@link GL30 OpenGL 3.0} and GLSL 1.30. Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ +public class ARBShaderImageLoadStore { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int + GL_MAX_IMAGE_UNITS = 0x8F38, + GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS = 0x8F39, + GL_MAX_IMAGE_SAMPLES = 0x906D, + GL_MAX_VERTEX_IMAGE_UNIFORMS = 0x90CA, + GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS = 0x90CB, + GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS = 0x90CC, + GL_MAX_GEOMETRY_IMAGE_UNIFORMS = 0x90CD, + GL_MAX_FRAGMENT_IMAGE_UNIFORMS = 0x90CE, + GL_MAX_COMBINED_IMAGE_UNIFORMS = 0x90CF; + + /** Accepted by the {@code target} parameter of GetIntegeri_v and GetBooleani_v. */ + public static final int + GL_IMAGE_BINDING_NAME = 0x8F3A, + GL_IMAGE_BINDING_LEVEL = 0x8F3B, + GL_IMAGE_BINDING_LAYERED = 0x8F3C, + GL_IMAGE_BINDING_LAYER = 0x8F3D, + GL_IMAGE_BINDING_ACCESS = 0x8F3E, + GL_IMAGE_BINDING_FORMAT = 0x906E; + + /** Accepted by the {@code barriers} parameter of MemoryBarrier. */ + public static final int + GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT = 0x1, + GL_ELEMENT_ARRAY_BARRIER_BIT = 0x2, + GL_UNIFORM_BARRIER_BIT = 0x4, + GL_TEXTURE_FETCH_BARRIER_BIT = 0x8, + GL_SHADER_IMAGE_ACCESS_BARRIER_BIT = 0x20, + GL_COMMAND_BARRIER_BIT = 0x40, + GL_PIXEL_BUFFER_BARRIER_BIT = 0x80, + GL_TEXTURE_UPDATE_BARRIER_BIT = 0x100, + GL_BUFFER_UPDATE_BARRIER_BIT = 0x200, + GL_FRAMEBUFFER_BARRIER_BIT = 0x400, + GL_TRANSFORM_FEEDBACK_BARRIER_BIT = 0x800, + GL_ATOMIC_COUNTER_BARRIER_BIT = 0x1000, + GL_ALL_BARRIER_BITS = 0xFFFFFFFF; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_IMAGE_1D = 0x904C, + GL_IMAGE_2D = 0x904D, + GL_IMAGE_3D = 0x904E, + GL_IMAGE_2D_RECT = 0x904F, + GL_IMAGE_CUBE = 0x9050, + GL_IMAGE_BUFFER = 0x9051, + GL_IMAGE_1D_ARRAY = 0x9052, + GL_IMAGE_2D_ARRAY = 0x9053, + GL_IMAGE_CUBE_MAP_ARRAY = 0x9054, + GL_IMAGE_2D_MULTISAMPLE = 0x9055, + GL_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9056, + GL_INT_IMAGE_1D = 0x9057, + GL_INT_IMAGE_2D = 0x9058, + GL_INT_IMAGE_3D = 0x9059, + GL_INT_IMAGE_2D_RECT = 0x905A, + GL_INT_IMAGE_CUBE = 0x905B, + GL_INT_IMAGE_BUFFER = 0x905C, + GL_INT_IMAGE_1D_ARRAY = 0x905D, + GL_INT_IMAGE_2D_ARRAY = 0x905E, + GL_INT_IMAGE_CUBE_MAP_ARRAY = 0x905F, + GL_INT_IMAGE_2D_MULTISAMPLE = 0x9060, + GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9061, + GL_UNSIGNED_INT_IMAGE_1D = 0x9062, + GL_UNSIGNED_INT_IMAGE_2D = 0x9063, + GL_UNSIGNED_INT_IMAGE_3D = 0x9064, + GL_UNSIGNED_INT_IMAGE_2D_RECT = 0x9065, + GL_UNSIGNED_INT_IMAGE_CUBE = 0x9066, + GL_UNSIGNED_INT_IMAGE_BUFFER = 0x9067, + GL_UNSIGNED_INT_IMAGE_1D_ARRAY = 0x9068, + GL_UNSIGNED_INT_IMAGE_2D_ARRAY = 0x9069, + GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY = 0x906A, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE = 0x906B, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x906C; + + /** Accepted by the {@code value} parameter of GetTexParameteriv, GetTexParameterfv, GetTexParameterIiv, and GetTexParameterIuiv. */ + public static final int GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7; + + /** + * Returned in the {@code data} parameter of GetTexParameteriv, GetTexParameterfv, GetTexParameterIiv, and GetTexParameterIuiv when {@code value} is + * IMAGE_FORMAT_COMPATIBILITY_TYPE. + */ + public static final int + GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE = 0x90C8, + GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS = 0x90C9; + + protected ARBShaderImageLoadStore() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindImageTexture ] --- + + /** + * Binds a level of a texture to an image unit. + * + * @param unit the index of the image unit to which to bind the texture + * @param texture the name of the texture to bind to the image unit + * @param level the level of the texture that is to be bound + * @param layered whether a layered texture binding is to be established + * @param layer if {@code layered} is false, specifies the layer of texture to be bound to the image unit. Ignored otherwise. + * @param access a token indicating the type of access that will be performed on the image + * @param format the format that the elements of the image will be treated as for the purposes of formatted stores + */ + public static void glBindImageTexture(@NativeType("GLuint") int unit, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLboolean") boolean layered, @NativeType("GLint") int layer, @NativeType("GLenum") int access, @NativeType("GLenum") int format) { + GL42C.glBindImageTexture(unit, texture, level, layered, layer, access, format); + } + + // --- [ glMemoryBarrier ] --- + + /** + * Defines a barrier ordering memory transactions. + * + * @param barriers the barriers to insert (bitwise combination). One or more of:
    {@link GL42C#GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT VERTEX_ATTRIB_ARRAY_BARRIER_BIT}{@link GL42C#GL_ELEMENT_ARRAY_BARRIER_BIT ELEMENT_ARRAY_BARRIER_BIT}{@link GL42C#GL_UNIFORM_BARRIER_BIT UNIFORM_BARRIER_BIT}
    {@link GL42C#GL_TEXTURE_FETCH_BARRIER_BIT TEXTURE_FETCH_BARRIER_BIT}{@link GL42C#GL_SHADER_IMAGE_ACCESS_BARRIER_BIT SHADER_IMAGE_ACCESS_BARRIER_BIT}{@link GL42C#GL_COMMAND_BARRIER_BIT COMMAND_BARRIER_BIT}
    {@link GL42C#GL_PIXEL_BUFFER_BARRIER_BIT PIXEL_BUFFER_BARRIER_BIT}{@link GL42C#GL_TEXTURE_UPDATE_BARRIER_BIT TEXTURE_UPDATE_BARRIER_BIT}{@link GL42C#GL_BUFFER_UPDATE_BARRIER_BIT BUFFER_UPDATE_BARRIER_BIT}
    {@link GL42C#GL_FRAMEBUFFER_BARRIER_BIT FRAMEBUFFER_BARRIER_BIT}{@link GL42C#GL_TRANSFORM_FEEDBACK_BARRIER_BIT TRANSFORM_FEEDBACK_BARRIER_BIT}{@link GL42C#GL_ATOMIC_COUNTER_BARRIER_BIT ATOMIC_COUNTER_BARRIER_BIT}
    {@link GL42C#GL_ALL_BARRIER_BITS ALL_BARRIER_BITS}{@link GL43#GL_SHADER_STORAGE_BARRIER_BIT SHADER_STORAGE_BARRIER_BIT}
    + */ + public static void glMemoryBarrier(@NativeType("GLbitfield") int barriers) { + GL42C.glMemoryBarrier(barriers); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderObjects.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderObjects.java new file mode 100644 index 000000000..8ea38d3b0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderObjects.java @@ -0,0 +1,1374 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; +import org.lwjgl.system.MemoryUtil; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_shader_objects extension. + * + *

    This extension adds API calls that are necessary to manage shader objects and program objects as defined in the OpenGL 2.0 white papers by 3Dlabs.

    + * + *

    The generation of an executable that runs on one of OpenGL's programmable units is modeled to that of developing a typical C/C++ application. There are + * one or more source files, each of which are stored by OpenGL in a shader object. Each shader object (source file) needs to be compiled and attached to a + * program object. Once all shader objects are compiled successfully, the program object needs to be linked to produce an executable. This executable is + * part of the program object, and can now be loaded onto the programmable units to make it part of the current OpenGL state. Both the compile and link + * stages generate a text string that can be queried to get more information. This information could be, but is not limited to, compile errors, link errors, + * optimization hints, etc. Values for uniform variables, declared in a shader, can be set by the application and used to control a shader's behavior.

    + * + *

    This extension defines functions for creating shader objects and program objects, for compiling shader objects, for linking program objects, for + * attaching shader objects to program objects, and for using a program object as part of current state. Functions to load uniform values are also defined. + * Some house keeping functions, like deleting an object and querying object state, are also provided.

    + * + *

    Although this extension defines the API for creating shader objects, it does not define any specific types of shader objects. It is assumed that this + * extension will be implemented along with at least one such additional extension for creating a specific type of OpenGL 2.0 shader (e.g., the + * {@link ARBFragmentShader ARB_fragment_shader} extension or the {@link ARBVertexShader ARB_vertex_shader} extension).

    + * + *

    Promoted to core in {@link GL20 OpenGL 2.0}.

    + */ +public class ARBShaderObjects { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} argument of GetHandleARB. */ + public static final int GL_PROGRAM_OBJECT_ARB = 0x8B40; + + /** Accepted by the {@code pname} parameter of GetObjectParameter{fi}vARB. */ + public static final int + GL_OBJECT_TYPE_ARB = 0x8B4E, + GL_OBJECT_SUBTYPE_ARB = 0x8B4F, + GL_OBJECT_DELETE_STATUS_ARB = 0x8B80, + GL_OBJECT_COMPILE_STATUS_ARB = 0x8B81, + GL_OBJECT_LINK_STATUS_ARB = 0x8B82, + GL_OBJECT_VALIDATE_STATUS_ARB = 0x8B83, + GL_OBJECT_INFO_LOG_LENGTH_ARB = 0x8B84, + GL_OBJECT_ATTACHED_OBJECTS_ARB = 0x8B85, + GL_OBJECT_ACTIVE_UNIFORMS_ARB = 0x8B86, + GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB = 0x8B87, + GL_OBJECT_SHADER_SOURCE_LENGTH_ARB = 0x8B88; + + /** Returned by the {@code params} parameter of GetObjectParameter{fi}vARB. */ + public static final int GL_SHADER_OBJECT_ARB = 0x8B48; + + /** Returned by the {@code type} parameter of GetActiveUniformARB. */ + public static final int + GL_FLOAT_VEC2_ARB = 0x8B50, + GL_FLOAT_VEC3_ARB = 0x8B51, + GL_FLOAT_VEC4_ARB = 0x8B52, + GL_INT_VEC2_ARB = 0x8B53, + GL_INT_VEC3_ARB = 0x8B54, + GL_INT_VEC4_ARB = 0x8B55, + GL_BOOL_ARB = 0x8B56, + GL_BOOL_VEC2_ARB = 0x8B57, + GL_BOOL_VEC3_ARB = 0x8B58, + GL_BOOL_VEC4_ARB = 0x8B59, + GL_FLOAT_MAT2_ARB = 0x8B5A, + GL_FLOAT_MAT3_ARB = 0x8B5B, + GL_FLOAT_MAT4_ARB = 0x8B5C, + GL_SAMPLER_1D_ARB = 0x8B5D, + GL_SAMPLER_2D_ARB = 0x8B5E, + GL_SAMPLER_3D_ARB = 0x8B5F, + GL_SAMPLER_CUBE_ARB = 0x8B60, + GL_SAMPLER_1D_SHADOW_ARB = 0x8B61, + GL_SAMPLER_2D_SHADOW_ARB = 0x8B62, + GL_SAMPLER_2D_RECT_ARB = 0x8B63, + GL_SAMPLER_2D_RECT_SHADOW_ARB = 0x8B64; + + protected ARBShaderObjects() { + throw new UnsupportedOperationException(); + } + + public static void glShaderSourceARB(int shader, java.nio.ByteBuffer string) { + byte[] b = new byte[string.remaining()]; + string.get(b); + org.lwjgl.opengl.ARBShaderObjects.glShaderSourceARB(shader, new String(b)); + } + + public static void glUniform1ARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + glUniform1fvARB(location, value); + } + + public static void glUniform2ARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + glUniform2fvARB(location, value); + } + + public static void glUniform3ARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + glUniform3fvARB(location, value); + } + + public static void glUniform4ARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + glUniform4fvARB(location, value); + } + + public static void glUniform1ARB(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + glUniform1ivARB(location, value); + } + + public static void glUniform2ARB(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + glUniform2ivARB(location, value); + } + + public static void glUniform3ARB(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + glUniform3ivARB(location, value); + } + + public static void glUniform4ARB(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + glUniform4ivARB(location, value); + } + + public static void glUniformMatrix2ARB(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + glUniformMatrix2fvARB(location, transpose, value); + } + + public static void glUniformMatrix3ARB(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + glUniformMatrix3fvARB(location, transpose, value); + } + + public static void glUniformMatrix4ARB(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + glUniformMatrix4fvARB(location, transpose, value); + } + + public static void glGetObjectParameterARB(@NativeType("GLhandleARB") int obj, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + glGetObjectParameterfvARB(obj, pname, params); + } + + public static void glGetObjectParameterARB(@NativeType("GLhandleARB") int obj, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + glGetObjectParameterivARB(obj, pname, params); + } + + public static void glGetUniformARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLint") int location, @NativeType("GLfloat *") FloatBuffer params) { + glGetUniformfvARB(programObj, location, params); + } + + public static void glGetUniformARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLint") int location, @NativeType("GLint *") IntBuffer params) { + glGetUniformivARB(programObj, location, params); + } + + // --- [ glDeleteObjectARB ] --- + + /** + * Either deletes the object, or flags it for deletion. An object that is attached to a container object is not deleted until it is no longer attached to + * any container object, for any context. If it is still attached to at least one container object, the object is flagged for deletion. If the object is + * part of the current rendering state, it is not deleted until it is no longer part of the current rendering state for any context. If the object is still + * part of the rendering state of at least one context, it is flagged for deletion. + * + *

    If an object is flagged for deletion, its Boolean status bit {@link #GL_OBJECT_DELETE_STATUS_ARB OBJECT_DELETE_STATUS_ARB} is set to true.

    + * + *

    DeleteObjectARB will silently ignore the value zero.

    + * + *

    When a container object is deleted, it will detach each attached object as part of the deletion process. When an object is deleted, all information for + * the object referenced is lost. The data for the object is also deleted.

    + * + * @param obj the shader object to delete + */ + public static native void glDeleteObjectARB(@NativeType("GLhandleARB") int obj); + + // --- [ glGetHandleARB ] --- + + /** + * Returns the handle to an object that is in use as part of current state. + * + * @param pname the state item for which the current object is to be returned. Must be:
    {@link #GL_PROGRAM_OBJECT_ARB PROGRAM_OBJECT_ARB}
    + */ + @NativeType("GLhandleARB") + public static native int glGetHandleARB(@NativeType("GLenum") int pname); + + // --- [ glDetachObjectARB ] --- + + /** + * Detaches an object from the container object it is attached to. + * + * @param containerObj the container object + * @param attachedObj the object to detach + */ + public static native void glDetachObjectARB(@NativeType("GLhandleARB") int containerObj, @NativeType("GLhandleARB") int attachedObj); + + // --- [ glCreateShaderObjectARB ] --- + + /** + * Creates a shader object. + * + * @param shaderType the type of the shader object to be created. One of:
    {@link ARBVertexShader#GL_VERTEX_SHADER_ARB VERTEX_SHADER_ARB}{@link ARBFragmentShader#GL_FRAGMENT_SHADER_ARB FRAGMENT_SHADER_ARB}
    + */ + @NativeType("GLhandleARB") + public static native int glCreateShaderObjectARB(@NativeType("GLenum") int shaderType); + + // --- [ glShaderSourceARB ] --- + + /** + * Unsafe version of: {@link #glShaderSourceARB ShaderSourceARB} + * + * @param count the number of strings in the array + */ + public static native void nglShaderSourceARB(int shaderObj, int count, long string, long length); + + /** + * Sets the source code for the specified shader object {@code shaderObj} to the text strings in the {@code string} array. If the object previously had + * source code loaded into it, it is completely replaced. + * + *

    The strings that are loaded into a shader object are expected to form the source code for a valid shader as defined in the OpenGL Shading Language + * Specification.

    + * + * @param shaderObj the shader object + * @param string an array of pointers to one or more, optionally null terminated, character strings that make up the source code + * @param length an array with the number of charARBs in each string (the string length). Each element in this array can be set to negative one (or smaller), + * indicating that its accompanying string is null terminated. If {@code length} is set to {@code NULL}, all strings in the {@code string} argument are + * considered null terminated. + */ + public static void glShaderSourceARB(@NativeType("GLhandleARB") int shaderObj, @NativeType("GLcharARB const **") PointerBuffer string, @Nullable @NativeType("GLint const *") IntBuffer length) { + if (CHECKS) { + checkSafe(length, string.remaining()); + } + nglShaderSourceARB(shaderObj, string.remaining(), memAddress(string), memAddressSafe(length)); + } + + /** + * Sets the source code for the specified shader object {@code shaderObj} to the text strings in the {@code string} array. If the object previously had + * source code loaded into it, it is completely replaced. + * + *

    The strings that are loaded into a shader object are expected to form the source code for a valid shader as defined in the OpenGL Shading Language + * Specification.

    + * + * @param shaderObj the shader object + * @param string an array of pointers to one or more, optionally null terminated, character strings that make up the source code + */ + public static void glShaderSourceARB(@NativeType("GLhandleARB") int shaderObj, @NativeType("GLcharARB const **") CharSequence... string) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long stringAddress = APIUtil.apiArrayi(stack, MemoryUtil::memUTF8, string); + nglShaderSourceARB(shaderObj, string.length, stringAddress, stringAddress - (string.length << 2)); + APIUtil.apiArrayFree(stringAddress, string.length); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Sets the source code for the specified shader object {@code shaderObj} to the text strings in the {@code string} array. If the object previously had + * source code loaded into it, it is completely replaced. + * + *

    The strings that are loaded into a shader object are expected to form the source code for a valid shader as defined in the OpenGL Shading Language + * Specification.

    + * + * @param shaderObj the shader object + * @param string an array of pointers to one or more, optionally null terminated, character strings that make up the source code + */ + public static void glShaderSourceARB(@NativeType("GLhandleARB") int shaderObj, @NativeType("GLcharARB const **") CharSequence string) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long stringAddress = APIUtil.apiArrayi(stack, MemoryUtil::memUTF8, string); + nglShaderSourceARB(shaderObj, 1, stringAddress, stringAddress - 4); + APIUtil.apiArrayFree(stringAddress, 1); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCompileShaderARB ] --- + + /** + * Compiles a shader object. Each shader object has a Boolean status, {@link #GL_OBJECT_COMPILE_STATUS_ARB OBJECT_COMPILE_STATUS_ARB}, that is modified as a result of compilation. This status + * can be queried with {@link #glGetObjectParameterivARB GetObjectParameterivARB}. This status will be set to {@link GL11#GL_TRUE TRUE} if the shader {@code shaderObj} was compiled without errors and is + * ready for use, and {@link GL11#GL_FALSE FALSE} otherwise. Compilation can fail for a variety of reasons as listed in the OpenGL Shading Language Specification. If + * CompileShaderARB failed, any information about a previous compile is lost and is not restored. Thus a failed compile does not restore the old state of + * {@code shaderObj}. If {@code shaderObj} does not reference a shader object, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. + * + *

    Note that changing the source code of a shader object, through ShaderSourceARB, does not change its compile status {@link #GL_OBJECT_COMPILE_STATUS_ARB OBJECT_COMPILE_STATUS_ARB}.

    + * + *

    Each shader object has an information log that is modified as a result of compilation. This information log can be queried with {@link #glGetInfoLogARB GetInfoLogARB} to + * obtain more information about the compilation attempt.

    + * + * @param shaderObj the shader object to compile + */ + public static native void glCompileShaderARB(@NativeType("GLhandleARB") int shaderObj); + + // --- [ glCreateProgramObjectARB ] --- + + /** + * Creates a program object. + * + *

    A program object is a container object. Shader objects are attached to a program object with the command AttachObjectARB. It is permissible to attach + * shader objects to program objects before source code has been loaded into the shader object, or before the shader object has been compiled. It is + * permissible to attach multiple shader objects of the same type to a single program object, and it is permissible to attach a shader object to more than + * one program object.

    + */ + @NativeType("GLhandleARB") + public static native int glCreateProgramObjectARB(); + + // --- [ glAttachObjectARB ] --- + + /** + * Attaches an object to a container object. + * + * @param containerObj the container object + * @param obj the object to attach + */ + public static native void glAttachObjectARB(@NativeType("GLhandleARB") int containerObj, @NativeType("GLhandleARB") int obj); + + // --- [ glLinkProgramARB ] --- + + /** + * Links a program object. + * + *

    Each program object has a Boolean status, {@link #GL_OBJECT_LINK_STATUS_ARB OBJECT_LINK_STATUS_ARB}, that is modified as a result of linking. This status can be queried with + * {@link #glGetObjectParameterivARB GetObjectParameterivARB}. This status will be set to {@link GL11#GL_TRUE TRUE} if a valid executable is created, and {@link GL11#GL_FALSE FALSE} otherwise. Linking can fail for a + * variety of reasons as specified in the OpenGL Shading Language Specification. Linking will also fail if one or more of the shader objects, attached to + * {@code programObj}, are not compiled successfully, or if more active uniform or active sampler variables are used in {@code programObj} than allowed. + * If LinkProgramARB failed, any information about a previous link is lost and is not restored. Thus a failed link does not restore the old state of + * {@code programObj}. If {@code programObj} is not of type {@link #GL_PROGRAM_OBJECT_ARB PROGRAM_OBJECT_ARB}, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated.

    + * + *

    Each program object has an information log that is modified as a result of a link operation. This information log can be queried with {@link #glGetInfoLogARB GetInfoLogARB} + * to obtain more information about the link operation.

    + * + * @param programObj the program object to link + */ + public static native void glLinkProgramARB(@NativeType("GLhandleARB") int programObj); + + // --- [ glUseProgramObjectARB ] --- + + /** + * Installs the executable code as part of current rendering state if the program object {@code programObj} contains valid executable code, i.e. has been + * linked successfully. If UseProgramObjectARB is called with the handle set to 0, it is as if the GL had no programmable stages and the fixed + * functionality paths will be used instead. If {@code programObj} cannot be made part of the current rendering state, an {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error will + * be generated and the current rendering state left unmodified. This error will be set, for example, if {@code programObj} has not been linked + * successfully. If {@code programObj} is not of type {@link #GL_PROGRAM_OBJECT_ARB PROGRAM_OBJECT_ARB}, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. + * + *

    While a program object is in use, applications are free to modify attached shader objects, compile attached shader objects, attach additional shader + * objects, and detach shader objects. This does not affect the link status {@link #GL_OBJECT_LINK_STATUS_ARB OBJECT_LINK_STATUS_ARB} of the program object. This does not affect the + * executable code that is part of the current state either. That executable code is only affected when the program object has been re-linked successfully. + * After such a successful re-link, the {@link #glLinkProgramARB LinkProgramARB} command will install the generated executable code as part of the current rendering state if the + * specified program object was already in use as a result of a previous call to UseProgramObjectARB. If this re-link failed, then the executable code part + * of the current state does not change.

    + * + * @param programObj the program object to use + */ + public static native void glUseProgramObjectARB(@NativeType("GLhandleARB") int programObj); + + // --- [ glValidateProgramARB ] --- + + /** + * Validates the program object {@code programObj} against the GL state at that moment. Each program object has a Boolean status, + * {@link #GL_OBJECT_VALIDATE_STATUS_ARB OBJECT_VALIDATE_STATUS_ARB}, that is modified as a result of validation. This status can be queried with {@link #glGetObjectParameterivARB GetObjectParameterivARB}. If validation + * succeeded this status will be set to {@link GL11#GL_TRUE TRUE}, otherwise it will be set to {@link GL11#GL_FALSE FALSE}. If validation succeeded the program object is guaranteed to + * execute, given the current GL state. If validation failed, the program object is guaranteed to not execute, given the current GL state. If + * {@code programObj} is not of type {@link #GL_PROGRAM_OBJECT_ARB PROGRAM_OBJECT_ARB}, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. + * + *

    ValidateProgramARB will validate at least as much as is done when a rendering command is issued, and it could validate more. For example, it could give + * a hint on how to optimize some piece of shader code.

    + * + *

    ValidateProgramARB will store its information in the info log. This information will either be an empty string or it will contain validation information.

    + * + *

    ValidateProgramARB is typically only useful during application development. An application should not expect different OpenGL implementations to produce + * identical information.

    + * + * @param programObj the program object to validate + */ + public static native void glValidateProgramARB(@NativeType("GLhandleARB") int programObj); + + // --- [ glUniform1fARB ] --- + + /** + * float version of {@link #glUniform4fARB Uniform4fARB}. + * + * @param location the uniform variable location + * @param v0 the uniform x value + */ + public static native void glUniform1fARB(@NativeType("GLint") int location, @NativeType("GLfloat") float v0); + + // --- [ glUniform2fARB ] --- + + /** + * vec2 version of {@link #glUniform4fARB Uniform4fARB}. + * + * @param location the uniform variable location + * @param v0 the uniform x value + * @param v1 the uniform y value + */ + public static native void glUniform2fARB(@NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1); + + // --- [ glUniform3fARB ] --- + + /** + * vec3 version of {@link #glUniform4fARB Uniform4fARB}. + * + * @param location the uniform variable location + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + */ + public static native void glUniform3fARB(@NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2); + + // --- [ glUniform4fARB ] --- + + /** + * Loads a vec4 value into a uniform variable of the program object that is currently in use. + * + * @param location the uniform variable location + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * @param v3 the uniform w value + */ + public static native void glUniform4fARB(@NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2, @NativeType("GLfloat") float v3); + + // --- [ glUniform1iARB ] --- + + /** + * int version of {@link #glUniform1fARB Uniform1fARB}. + * + * @param location the uniform variable location + * @param v0 the uniform x value + */ + public static native void glUniform1iARB(@NativeType("GLint") int location, @NativeType("GLint") int v0); + + // --- [ glUniform2iARB ] --- + + /** + * ivec2 version of {@link #glUniform2fARB Uniform2fARB}. + * + * @param location the uniform variable location + * @param v0 the uniform x value + * @param v1 the uniform y value + */ + public static native void glUniform2iARB(@NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1); + + // --- [ glUniform3iARB ] --- + + /** + * ivec3 version of {@link #glUniform3fARB Uniform3fARB}. + * + * @param location the uniform variable location + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + */ + public static native void glUniform3iARB(@NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1, @NativeType("GLint") int v2); + + // --- [ glUniform4iARB ] --- + + /** + * ivec4 version of {@link #glUniform4fARB Uniform4fARB}. + * + * @param location the uniform variable location + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * @param v3 the uniform w value + */ + public static native void glUniform4iARB(@NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1, @NativeType("GLint") int v2, @NativeType("GLint") int v3); + + // --- [ glUniform1fvARB ] --- + + /** + * Unsafe version of: {@link #glUniform1fvARB Uniform1fvARB} + * + * @param count the number of float values to load + */ + public static native void nglUniform1fvARB(int location, int count, long value); + + /** + * Loads floating-point values {@code count} times into a uniform location defined as an array of float values. + * + * @param location the uniform variable location + * @param value the values to load + */ + public static void glUniform1fvARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniform1fvARB(location, value.remaining(), memAddress(value)); + } + + // --- [ glUniform2fvARB ] --- + + /** + * Unsafe version of: {@link #glUniform2fvARB Uniform2fvARB} + * + * @param count the number of vec2 vectors to load + */ + public static native void nglUniform2fvARB(int location, int count, long value); + + /** + * Loads floating-point values {@code count} times into a uniform location defined as an array of vec2 vectors. + * + * @param location the uniform variable location + * @param value the values to load + */ + public static void glUniform2fvARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniform2fvARB(location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glUniform3fvARB ] --- + + /** + * Unsafe version of: {@link #glUniform3fvARB Uniform3fvARB} + * + * @param count the number of vec3 vectors to load + */ + public static native void nglUniform3fvARB(int location, int count, long value); + + /** + * Loads floating-point values {@code count} times into a uniform location defined as an array of vec3 vectors. + * + * @param location the uniform variable location + * @param value the values to load + */ + public static void glUniform3fvARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniform3fvARB(location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glUniform4fvARB ] --- + + /** + * Unsafe version of: {@link #glUniform4fvARB Uniform4fvARB} + * + * @param count the number of vec4 vectors to load + */ + public static native void nglUniform4fvARB(int location, int count, long value); + + /** + * Loads floating-point values {@code count} times into a uniform location defined as an array of vec4 vectors. + * + * @param location the uniform variable location + * @param value the values to load + */ + public static void glUniform4fvARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniform4fvARB(location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glUniform1ivARB ] --- + + /** + * Unsafe version of: {@link #glUniform1ivARB Uniform1ivARB} + * + * @param count the number of integer values to load + */ + public static native void nglUniform1ivARB(int location, int count, long value); + + /** + * Loads integer values {@code count} times into a uniform location defined as an array of integer values. + * + * @param location the uniform variable location + * @param value the values to load + */ + public static void glUniform1ivARB(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglUniform1ivARB(location, value.remaining(), memAddress(value)); + } + + // --- [ glUniform2ivARB ] --- + + /** + * Unsafe version of: {@link #glUniform2ivARB Uniform2ivARB} + * + * @param count the number of ivec2 vectors to load + */ + public static native void nglUniform2ivARB(int location, int count, long value); + + /** + * Loads integer values {@code count} times into a uniform location defined as an array of ivec2 vectors. + * + * @param location the uniform variable location + * @param value the values to load + */ + public static void glUniform2ivARB(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglUniform2ivARB(location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glUniform3ivARB ] --- + + /** + * Unsafe version of: {@link #glUniform3ivARB Uniform3ivARB} + * + * @param count the number of ivec3 vectors to load + */ + public static native void nglUniform3ivARB(int location, int count, long value); + + /** + * Loads integer values {@code count} times into a uniform location defined as an array of ivec3 vectors. + * + * @param location the uniform variable location + * @param value the values to load + */ + public static void glUniform3ivARB(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglUniform3ivARB(location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glUniform4ivARB ] --- + + /** + * Unsafe version of: {@link #glUniform4ivARB Uniform4ivARB} + * + * @param count the number of ivec4 vectors to load + */ + public static native void nglUniform4ivARB(int location, int count, long value); + + /** + * Loads integer values {@code count} times into a uniform location defined as an array of ivec4 vectors. + * + * @param location the uniform variable location + * @param value the values to load + */ + public static void glUniform4ivARB(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglUniform4ivARB(location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glUniformMatrix2fvARB ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2fvARB UniformMatrix2fvARB} + * + * @param count the number of 2x2 matrices to load + */ + public static native void nglUniformMatrix2fvARB(int location, int count, boolean transpose, long value); + + /** + * Loads a 2x2 matrix of floating-point values {@code count} times into a uniform location defined as a matrix or an array of matrices. + * + * @param location the uniform variable location + * @param transpose if {@link GL11#GL_FALSE FALSE}, the matrix is specified in column major order, otherwise in row major order + * @param value the matrix values to load + */ + public static void glUniformMatrix2fvARB(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix2fvARB(location, value.remaining() >> 2, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix3fvARB ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3fvARB UniformMatrix3fvARB} + * + * @param count the number of 3x3 matrices to load + */ + public static native void nglUniformMatrix3fvARB(int location, int count, boolean transpose, long value); + + /** + * Loads a 3x3 matrix of floating-point values {@code count} times into a uniform location defined as a matrix or an array of matrices. + * + * @param location the uniform variable location + * @param transpose if {@link GL11#GL_FALSE FALSE}, the matrix is specified in column major order, otherwise in row major order + * @param value the matrix values to load + */ + public static void glUniformMatrix3fvARB(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix3fvARB(location, value.remaining() / 9, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix4fvARB ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4fvARB UniformMatrix4fvARB} + * + * @param count the number of 4x4 matrices to load + */ + public static native void nglUniformMatrix4fvARB(int location, int count, boolean transpose, long value); + + /** + * Loads a 4x4 matrix of floating-point values {@code count} times into a uniform location defined as a matrix or an array of matrices. + * + * @param location the uniform variable location + * @param transpose if {@link GL11#GL_FALSE FALSE}, the matrix is specified in column major order, otherwise in row major order + * @param value the matrix values to load + */ + public static void glUniformMatrix4fvARB(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix4fvARB(location, value.remaining() >> 4, transpose, memAddress(value)); + } + + // --- [ glGetObjectParameterfvARB ] --- + + /** Unsafe version of: {@link #glGetObjectParameterfvARB GetObjectParameterfvARB} */ + public static native void nglGetObjectParameterfvARB(int obj, int pname, long params); + + /** + * Returns object specific parameter values. + * + * @param obj the object to query + * @param pname the parameter to query + * @param params a buffer in which to return the parameter value + */ + public static void glGetObjectParameterfvARB(@NativeType("GLhandleARB") int obj, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetObjectParameterfvARB(obj, pname, memAddress(params)); + } + + // --- [ glGetObjectParameterivARB ] --- + + /** Unsafe version of: {@link #glGetObjectParameterivARB GetObjectParameterivARB} */ + public static native void nglGetObjectParameterivARB(int obj, int pname, long params); + + /** + * Returns object specific parameter values. + * + * @param obj the object to query + * @param pname the parameter to query. One of:
    {@link #GL_OBJECT_TYPE_ARB OBJECT_TYPE_ARB}{@link #GL_OBJECT_SUBTYPE_ARB OBJECT_SUBTYPE_ARB}{@link #GL_OBJECT_DELETE_STATUS_ARB OBJECT_DELETE_STATUS_ARB}
    {@link #GL_OBJECT_COMPILE_STATUS_ARB OBJECT_COMPILE_STATUS_ARB}{@link #GL_OBJECT_LINK_STATUS_ARB OBJECT_LINK_STATUS_ARB}{@link #GL_OBJECT_VALIDATE_STATUS_ARB OBJECT_VALIDATE_STATUS_ARB}
    {@link #GL_OBJECT_INFO_LOG_LENGTH_ARB OBJECT_INFO_LOG_LENGTH_ARB}{@link #GL_OBJECT_ATTACHED_OBJECTS_ARB OBJECT_ATTACHED_OBJECTS_ARB}{@link #GL_OBJECT_ACTIVE_UNIFORMS_ARB OBJECT_ACTIVE_UNIFORMS_ARB}
    {@link #GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB}{@link #GL_OBJECT_SHADER_SOURCE_LENGTH_ARB OBJECT_SHADER_SOURCE_LENGTH_ARB}
    + * @param params a buffer in which to return the parameter value + */ + public static void glGetObjectParameterivARB(@NativeType("GLhandleARB") int obj, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetObjectParameterivARB(obj, pname, memAddress(params)); + } + + /** + * Returns object specific parameter values. + * + * @param obj the object to query + * @param pname the parameter to query. One of:
    {@link #GL_OBJECT_TYPE_ARB OBJECT_TYPE_ARB}{@link #GL_OBJECT_SUBTYPE_ARB OBJECT_SUBTYPE_ARB}{@link #GL_OBJECT_DELETE_STATUS_ARB OBJECT_DELETE_STATUS_ARB}
    {@link #GL_OBJECT_COMPILE_STATUS_ARB OBJECT_COMPILE_STATUS_ARB}{@link #GL_OBJECT_LINK_STATUS_ARB OBJECT_LINK_STATUS_ARB}{@link #GL_OBJECT_VALIDATE_STATUS_ARB OBJECT_VALIDATE_STATUS_ARB}
    {@link #GL_OBJECT_INFO_LOG_LENGTH_ARB OBJECT_INFO_LOG_LENGTH_ARB}{@link #GL_OBJECT_ATTACHED_OBJECTS_ARB OBJECT_ATTACHED_OBJECTS_ARB}{@link #GL_OBJECT_ACTIVE_UNIFORMS_ARB OBJECT_ACTIVE_UNIFORMS_ARB}
    {@link #GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB}{@link #GL_OBJECT_SHADER_SOURCE_LENGTH_ARB OBJECT_SHADER_SOURCE_LENGTH_ARB}
    + */ + @NativeType("void") + public static int glGetObjectParameteriARB(@NativeType("GLhandleARB") int obj, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetObjectParameterivARB(obj, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetInfoLogARB ] --- + + /** + * Unsafe version of: {@link #glGetInfoLogARB GetInfoLogARB} + * + * @param maxLength the maximum number of characters the GL is allowed to write into {@code infoLog} + */ + public static native void nglGetInfoLogARB(int obj, int maxLength, long length, long infoLog); + + /** + * A string that contains information about the last link or validation attempt and last compilation attempt are kept per program or shader object. This + * string is called the info log and can be obtained with this command. + * + *

    This string will be null terminated. The number of characters in the info log is given by {@link #GL_OBJECT_INFO_LOG_LENGTH_ARB OBJECT_INFO_LOG_LENGTH_ARB}, which can be queried with + * {@link #glGetObjectParameterivARB GetObjectParameterivARB}. If {@code obj} is a shader object, the returned info log will either be an empty string or it will contain + * information about the last compilation attempt for that object. If {@code obj} is a program object, the returned info log will either be an empty string + * or it will contain information about the last link attempt or last validation attempt for that object. If {@code obj} is not of type {@link #GL_PROGRAM_OBJECT_ARB PROGRAM_OBJECT_ARB} + * or {@link #GL_SHADER_OBJECT_ARB SHADER_OBJECT_ARB}, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. If an error occurred, the return parameters {@code length} and {@code infoLog} + * will be unmodified.

    + * + *

    The info log is typically only useful during application development and an application should not expect different OpenGL implementations to produce + * identical info logs.

    + * + * @param obj the shader object to query + * @param length the actual number of characters written by the GL into {@code infoLog} is returned in {@code length}, excluding the null termination. If + * {@code length} is {@code NULL} then the GL ignores this parameter. + * @param infoLog a buffer in which to return the info log + */ + public static void glGetInfoLogARB(@NativeType("GLhandleARB") int obj, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLcharARB *") ByteBuffer infoLog) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetInfoLogARB(obj, infoLog.remaining(), memAddressSafe(length), memAddress(infoLog)); + } + + /** + * A string that contains information about the last link or validation attempt and last compilation attempt are kept per program or shader object. This + * string is called the info log and can be obtained with this command. + * + *

    This string will be null terminated. The number of characters in the info log is given by {@link #GL_OBJECT_INFO_LOG_LENGTH_ARB OBJECT_INFO_LOG_LENGTH_ARB}, which can be queried with + * {@link #glGetObjectParameterivARB GetObjectParameterivARB}. If {@code obj} is a shader object, the returned info log will either be an empty string or it will contain + * information about the last compilation attempt for that object. If {@code obj} is a program object, the returned info log will either be an empty string + * or it will contain information about the last link attempt or last validation attempt for that object. If {@code obj} is not of type {@link #GL_PROGRAM_OBJECT_ARB PROGRAM_OBJECT_ARB} + * or {@link #GL_SHADER_OBJECT_ARB SHADER_OBJECT_ARB}, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. If an error occurred, the return parameters {@code length} and {@code infoLog} + * will be unmodified.

    + * + *

    The info log is typically only useful during application development and an application should not expect different OpenGL implementations to produce + * identical info logs.

    + * + * @param obj the shader object to query + * @param maxLength the maximum number of characters the GL is allowed to write into {@code infoLog} + */ + @NativeType("void") + public static String glGetInfoLogARB(@NativeType("GLhandleARB") int obj, @NativeType("GLsizei") int maxLength) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + ByteBuffer infoLog = memAlloc(maxLength); + try { + IntBuffer length = stack.ints(0); + nglGetInfoLogARB(obj, maxLength, memAddress(length), memAddress(infoLog)); + return memUTF8(infoLog, length.get(0)); + } finally { + memFree(infoLog); + stack.setPointer(stackPointer); + } + } + + /** + * A string that contains information about the last link or validation attempt and last compilation attempt are kept per program or shader object. This + * string is called the info log and can be obtained with this command. + * + *

    This string will be null terminated. The number of characters in the info log is given by {@link #GL_OBJECT_INFO_LOG_LENGTH_ARB OBJECT_INFO_LOG_LENGTH_ARB}, which can be queried with + * {@link #glGetObjectParameterivARB GetObjectParameterivARB}. If {@code obj} is a shader object, the returned info log will either be an empty string or it will contain + * information about the last compilation attempt for that object. If {@code obj} is a program object, the returned info log will either be an empty string + * or it will contain information about the last link attempt or last validation attempt for that object. If {@code obj} is not of type {@link #GL_PROGRAM_OBJECT_ARB PROGRAM_OBJECT_ARB} + * or {@link #GL_SHADER_OBJECT_ARB SHADER_OBJECT_ARB}, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. If an error occurred, the return parameters {@code length} and {@code infoLog} + * will be unmodified.

    + * + *

    The info log is typically only useful during application development and an application should not expect different OpenGL implementations to produce + * identical info logs.

    + * + * @param obj the shader object to query + */ + @NativeType("void") + public static String glGetInfoLogARB(@NativeType("GLhandleARB") int obj) { + return glGetInfoLogARB(obj, glGetObjectParameteriARB(obj, GL_OBJECT_INFO_LOG_LENGTH_ARB)); + } + + // --- [ glGetAttachedObjectsARB ] --- + + /** + * Unsafe version of: {@link #glGetAttachedObjectsARB GetAttachedObjectsARB} + * + * @param maxCount the maximum number of handles the GL is allowed to write into {@code obj} + */ + public static native void nglGetAttachedObjectsARB(int containerObj, int maxCount, long count, long obj); + + /** + * Returns the handles of objects attached to {@code containerObj} in {@code obj}. . The number of objects attached to {@code containerObj} is given by + * {@link #GL_OBJECT_ATTACHED_OBJECTS_ARB OBJECT_ATTACHED_OBJECTS_ARB}, which can be queried with {@link #glGetObjectParameterivARB GetObjectParameterivARB}. If {@code containerObj} is not of type {@link #GL_PROGRAM_OBJECT_ARB PROGRAM_OBJECT_ARB}, the + * error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. If an error occurred, the return parameters {@code count} and {@code obj} will be unmodified. + * + * @param containerObj the container object to query + * @param count a buffer in which to return the actual number of object handles written by the GL into {@code obj}. If {@code NULL} then the GL ignores this parameter. + * @param obj a buffer in which to return the attached object handles + */ + public static void glGetAttachedObjectsARB(@NativeType("GLhandleARB") int containerObj, @Nullable @NativeType("GLsizei *") IntBuffer count, @NativeType("GLhandleARB *") IntBuffer obj) { + if (CHECKS) { + checkSafe(count, 1); + } + nglGetAttachedObjectsARB(containerObj, obj.remaining(), memAddressSafe(count), memAddress(obj)); + } + + // --- [ glGetUniformLocationARB ] --- + + /** Unsafe version of: {@link #glGetUniformLocationARB GetUniformLocationARB} */ + public static native int nglGetUniformLocationARB(int programObj, long name); + + /** + * Returns the location of uniform variable {@code name}. {@code name} has to be a null terminated string, without white space. The value of -1 will be + * returned if {@code name} does not correspond to an active uniform variable name in {@code programObj} or if {@code name} starts with the reserved prefix + * "gl_". If {@code programObj} has not been successfully linked, or if {@code programObj} is not of type {@link #GL_PROGRAM_OBJECT_ARB PROGRAM_OBJECT_ARB}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. The location of a uniform variable does not change until the next link command is issued. + * + *

    A valid {@code name} cannot be a structure, an array of structures, or a subcomponent of a vector or a matrix. In order to identify a valid {@code name}, + * the "." (dot) and "[]" operators can be used in {@code name} to operate on a structure or to operate on an array.

    + * + *

    The first element of a uniform array is identified using the name of the uniform array appended with "[0]". Except if the last part of the string + * {@code name} indicates a uniform array, then the location of the first element of that array can be retrieved by either using the name of the uniform + * array, or the name of the uniform array appended with "[0]".

    + * + * @param programObj the program object to query + * @param name the name of the uniform variable whose location is to be queried + */ + @NativeType("GLint") + public static int glGetUniformLocationARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLcharARB const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetUniformLocationARB(programObj, memAddress(name)); + } + + /** + * Returns the location of uniform variable {@code name}. {@code name} has to be a null terminated string, without white space. The value of -1 will be + * returned if {@code name} does not correspond to an active uniform variable name in {@code programObj} or if {@code name} starts with the reserved prefix + * "gl_". If {@code programObj} has not been successfully linked, or if {@code programObj} is not of type {@link #GL_PROGRAM_OBJECT_ARB PROGRAM_OBJECT_ARB}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. The location of a uniform variable does not change until the next link command is issued. + * + *

    A valid {@code name} cannot be a structure, an array of structures, or a subcomponent of a vector or a matrix. In order to identify a valid {@code name}, + * the "." (dot) and "[]" operators can be used in {@code name} to operate on a structure or to operate on an array.

    + * + *

    The first element of a uniform array is identified using the name of the uniform array appended with "[0]". Except if the last part of the string + * {@code name} indicates a uniform array, then the location of the first element of that array can be retrieved by either using the name of the uniform + * array, or the name of the uniform array appended with "[0]".

    + * + * @param programObj the program object to query + * @param name the name of the uniform variable whose location is to be queried + */ + @NativeType("GLint") + public static int glGetUniformLocationARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLcharARB const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetUniformLocationARB(programObj, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetActiveUniformARB ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniformARB GetActiveUniformARB} + * + * @param maxLength the maximum number of characters the GL is allowed to write into {@code name}. + */ + public static native void nglGetActiveUniformARB(int programObj, int index, int maxLength, long length, long size, long type, long name); + + /** + * Determines which of the declared uniform variables are active and their sizes and types. + * + *

    This command provides information about the uniform selected by {@code index}. The {@code index} of 0 selects the first active uniform, and + * {@code index} of {@link #GL_OBJECT_ACTIVE_UNIFORMS_ARB OBJECT_ACTIVE_UNIFORMS_ARB} - 1 selects the last active uniform. The value of {@link #GL_OBJECT_ACTIVE_UNIFORMS_ARB OBJECT_ACTIVE_UNIFORMS_ARB} can be queried with + * {@link #glGetObjectParameterivARB GetObjectParameterivARB}. If {@code index} is greater than or equal to {@link #GL_OBJECT_ACTIVE_UNIFORMS_ARB OBJECT_ACTIVE_UNIFORMS_ARB}, the error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated.

    + * + *

    If an error occurred, the return parameters {@code length}, {@code size}, {@code type} and {@code name} will be unmodified.

    + * + *

    The returned uniform name can be the name of built-in uniform state as well. The length of the longest uniform name in {@code programObj} is given by + * {@link #GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB}, which can be queried with {@link #glGetObjectParameterivARB GetObjectParameterivARB}.

    + * + *

    Each uniform variable, declared in a shader, is broken down into one or more strings using the "." (dot) and "[]" operators, if necessary, to the point + * that it is legal to pass each string back into {@link #glGetUniformLocationARB GetUniformLocationARB}. Each of these strings constitutes one active uniform, and each string is + * assigned an index.

    + * + *

    If one or more elements of an array are active, GetActiveUniformARB will return the name of the array in {@code name}, subject to the restrictions + * listed above. The type of the array is returned in {@code type}. The {@code size} parameter contains the highest array element index used, plus one. The + * compiler or linker determines the highest index used. There will be only one active uniform reported by the GL per uniform array.

    + * + *

    This command will return as much information about active uniforms as possible. If no information is available, {@code length} will be set to zero and + * {@code name} will be an empty string. This situation could arise if GetActiveUniformARB is issued after a failed link.

    + * + * @param programObj a handle to a program object for which the command {@link #glLinkProgramARB LinkProgramARB} has been issued in the past. It is not necessary for {@code programObj} to have + * been linked successfully. The link could have failed because the number of active uniforms exceeded the limit. + * @param index the uniform index + * @param length a buffer in which to return the actual number of characters written by the GL into {@code name}. This count excludes the null termination. If + * {@code length} is {@code NULL} then the GL ignores this parameter. + * @param size a buffer in which to return the uniform size. The size is in units of the type returned in {@code type}. + * @param type a buffer in which to return the uniform type + * @param name a buffer in which to return the uniform name + */ + public static void glGetActiveUniformARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type, @NativeType("GLcharARB *") ByteBuffer name) { + if (CHECKS) { + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + nglGetActiveUniformARB(programObj, index, name.remaining(), memAddressSafe(length), memAddress(size), memAddress(type), memAddress(name)); + } + + /** + * Determines which of the declared uniform variables are active and their sizes and types. + * + *

    This command provides information about the uniform selected by {@code index}. The {@code index} of 0 selects the first active uniform, and + * {@code index} of {@link #GL_OBJECT_ACTIVE_UNIFORMS_ARB OBJECT_ACTIVE_UNIFORMS_ARB} - 1 selects the last active uniform. The value of {@link #GL_OBJECT_ACTIVE_UNIFORMS_ARB OBJECT_ACTIVE_UNIFORMS_ARB} can be queried with + * {@link #glGetObjectParameterivARB GetObjectParameterivARB}. If {@code index} is greater than or equal to {@link #GL_OBJECT_ACTIVE_UNIFORMS_ARB OBJECT_ACTIVE_UNIFORMS_ARB}, the error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated.

    + * + *

    If an error occurred, the return parameters {@code length}, {@code size}, {@code type} and {@code name} will be unmodified.

    + * + *

    The returned uniform name can be the name of built-in uniform state as well. The length of the longest uniform name in {@code programObj} is given by + * {@link #GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB}, which can be queried with {@link #glGetObjectParameterivARB GetObjectParameterivARB}.

    + * + *

    Each uniform variable, declared in a shader, is broken down into one or more strings using the "." (dot) and "[]" operators, if necessary, to the point + * that it is legal to pass each string back into {@link #glGetUniformLocationARB GetUniformLocationARB}. Each of these strings constitutes one active uniform, and each string is + * assigned an index.

    + * + *

    If one or more elements of an array are active, GetActiveUniformARB will return the name of the array in {@code name}, subject to the restrictions + * listed above. The type of the array is returned in {@code type}. The {@code size} parameter contains the highest array element index used, plus one. The + * compiler or linker determines the highest index used. There will be only one active uniform reported by the GL per uniform array.

    + * + *

    This command will return as much information about active uniforms as possible. If no information is available, {@code length} will be set to zero and + * {@code name} will be an empty string. This situation could arise if GetActiveUniformARB is issued after a failed link.

    + * + * @param programObj a handle to a program object for which the command {@link #glLinkProgramARB LinkProgramARB} has been issued in the past. It is not necessary for {@code programObj} to have + * been linked successfully. The link could have failed because the number of active uniforms exceeded the limit. + * @param index the uniform index + * @param maxLength the maximum number of characters the GL is allowed to write into {@code name}. + * @param size a buffer in which to return the uniform size. The size is in units of the type returned in {@code type}. + * @param type a buffer in which to return the uniform type + */ + @NativeType("void") + public static String glGetActiveUniformARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLuint") int index, @NativeType("GLsizei") int maxLength, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + if (CHECKS) { + check(size, 1); + check(type, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer name = stack.malloc(maxLength); + nglGetActiveUniformARB(programObj, index, maxLength, memAddress(length), memAddress(size), memAddress(type), memAddress(name)); + return memUTF8(name, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Determines which of the declared uniform variables are active and their sizes and types. + * + *

    This command provides information about the uniform selected by {@code index}. The {@code index} of 0 selects the first active uniform, and + * {@code index} of {@link #GL_OBJECT_ACTIVE_UNIFORMS_ARB OBJECT_ACTIVE_UNIFORMS_ARB} - 1 selects the last active uniform. The value of {@link #GL_OBJECT_ACTIVE_UNIFORMS_ARB OBJECT_ACTIVE_UNIFORMS_ARB} can be queried with + * {@link #glGetObjectParameterivARB GetObjectParameterivARB}. If {@code index} is greater than or equal to {@link #GL_OBJECT_ACTIVE_UNIFORMS_ARB OBJECT_ACTIVE_UNIFORMS_ARB}, the error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated.

    + * + *

    If an error occurred, the return parameters {@code length}, {@code size}, {@code type} and {@code name} will be unmodified.

    + * + *

    The returned uniform name can be the name of built-in uniform state as well. The length of the longest uniform name in {@code programObj} is given by + * {@link #GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB}, which can be queried with {@link #glGetObjectParameterivARB GetObjectParameterivARB}.

    + * + *

    Each uniform variable, declared in a shader, is broken down into one or more strings using the "." (dot) and "[]" operators, if necessary, to the point + * that it is legal to pass each string back into {@link #glGetUniformLocationARB GetUniformLocationARB}. Each of these strings constitutes one active uniform, and each string is + * assigned an index.

    + * + *

    If one or more elements of an array are active, GetActiveUniformARB will return the name of the array in {@code name}, subject to the restrictions + * listed above. The type of the array is returned in {@code type}. The {@code size} parameter contains the highest array element index used, plus one. The + * compiler or linker determines the highest index used. There will be only one active uniform reported by the GL per uniform array.

    + * + *

    This command will return as much information about active uniforms as possible. If no information is available, {@code length} will be set to zero and + * {@code name} will be an empty string. This situation could arise if GetActiveUniformARB is issued after a failed link.

    + * + * @param programObj a handle to a program object for which the command {@link #glLinkProgramARB LinkProgramARB} has been issued in the past. It is not necessary for {@code programObj} to have + * been linked successfully. The link could have failed because the number of active uniforms exceeded the limit. + * @param index the uniform index + * @param size a buffer in which to return the uniform size. The size is in units of the type returned in {@code type}. + * @param type a buffer in which to return the uniform type + */ + @NativeType("void") + public static String glGetActiveUniformARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return glGetActiveUniformARB(programObj, index, glGetObjectParameteriARB(programObj, GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB), size, type); + } + + // --- [ glGetUniformfvARB ] --- + + /** Unsafe version of: {@link #glGetUniformfvARB GetUniformfvARB} */ + public static native void nglGetUniformfvARB(int programObj, int location, long params); + + /** + * Returns the floating-point value or values of a uniform. + * + * @param programObj the program object to query + * @param location the uniform variable location + * @param params a buffer in which to return the uniform values + */ + public static void glGetUniformfvARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLint") int location, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformfvARB(programObj, location, memAddress(params)); + } + + /** + * Returns the floating-point value or values of a uniform. + * + * @param programObj the program object to query + * @param location the uniform variable location + */ + @NativeType("void") + public static float glGetUniformfARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetUniformfvARB(programObj, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetUniformivARB ] --- + + /** Unsafe version of: {@link #glGetUniformivARB GetUniformivARB} */ + public static native void nglGetUniformivARB(int programObj, int location, long params); + + /** + * Returns the integer value or values of a uniform. + * + * @param programObj the program object to query + * @param location the uniform variable location + * @param params a buffer in which to return the uniform values + */ + public static void glGetUniformivARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLint") int location, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformivARB(programObj, location, memAddress(params)); + } + + /** + * Returns the integer value or values of a uniform. + * + * @param programObj the program object to query + * @param location the uniform variable location + */ + @NativeType("void") + public static int glGetUniformiARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetUniformivARB(programObj, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetShaderSourceARB ] --- + + /** + * Unsafe version of: {@link #glGetShaderSourceARB GetShaderSourceARB} + * + * @param maxLength the maximum number of characters the GL is allowed to write into {@code source} + */ + public static native void nglGetShaderSourceARB(int obj, int maxLength, long length, long source); + + /** + * Returns the string making up the source code for a shader object. + * + *

    The string {@code source} is a concatenation of the strings passed to OpenGL using {@link #glShaderSourceARB ShaderSourceARB}. The length of this concatenation is given by + * {@link #GL_OBJECT_SHADER_SOURCE_LENGTH_ARB OBJECT_SHADER_SOURCE_LENGTH_ARB}, which can be queried with {@link #glGetObjectParameterivARB GetObjectParameterivARB}. If {@code obj} is not of type {@link #GL_SHADER_OBJECT_ARB SHADER_OBJECT_ARB}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. If an error occurred, the return parameters {@code length} and {@code source} will be unmodified.

    + * + * @param obj the shader object to query + * @param length a buffer in which to return the actual number of characters written by the GL into {@code source}, excluding the null termination. If + * {@code length} is {@code NULL} then the GL ignores this parameter. + * @param source a buffer in which to return the shader object source + */ + public static void glGetShaderSourceARB(@NativeType("GLhandleARB") int obj, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLcharARB *") ByteBuffer source) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetShaderSourceARB(obj, source.remaining(), memAddressSafe(length), memAddress(source)); + } + + /** + * Returns the string making up the source code for a shader object. + * + *

    The string {@code source} is a concatenation of the strings passed to OpenGL using {@link #glShaderSourceARB ShaderSourceARB}. The length of this concatenation is given by + * {@link #GL_OBJECT_SHADER_SOURCE_LENGTH_ARB OBJECT_SHADER_SOURCE_LENGTH_ARB}, which can be queried with {@link #glGetObjectParameterivARB GetObjectParameterivARB}. If {@code obj} is not of type {@link #GL_SHADER_OBJECT_ARB SHADER_OBJECT_ARB}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. If an error occurred, the return parameters {@code length} and {@code source} will be unmodified.

    + * + * @param obj the shader object to query + * @param maxLength the maximum number of characters the GL is allowed to write into {@code source} + */ + @NativeType("void") + public static String glGetShaderSourceARB(@NativeType("GLhandleARB") int obj, @NativeType("GLsizei") int maxLength) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + ByteBuffer source = memAlloc(maxLength); + try { + IntBuffer length = stack.ints(0); + nglGetShaderSourceARB(obj, maxLength, memAddress(length), memAddress(source)); + return memUTF8(source, length.get(0)); + } finally { + memFree(source); + stack.setPointer(stackPointer); + } + } + + /** + * Returns the string making up the source code for a shader object. + * + *

    The string {@code source} is a concatenation of the strings passed to OpenGL using {@link #glShaderSourceARB ShaderSourceARB}. The length of this concatenation is given by + * {@link #GL_OBJECT_SHADER_SOURCE_LENGTH_ARB OBJECT_SHADER_SOURCE_LENGTH_ARB}, which can be queried with {@link #glGetObjectParameterivARB GetObjectParameterivARB}. If {@code obj} is not of type {@link #GL_SHADER_OBJECT_ARB SHADER_OBJECT_ARB}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. If an error occurred, the return parameters {@code length} and {@code source} will be unmodified.

    + * + * @param obj the shader object to query + */ + @NativeType("void") + public static String glGetShaderSourceARB(@NativeType("GLhandleARB") int obj) { + return glGetShaderSourceARB(obj, glGetObjectParameteriARB(obj, GL_OBJECT_SHADER_SOURCE_LENGTH_ARB)); + } + + /** Array version of: {@link #glShaderSourceARB ShaderSourceARB} */ + public static void glShaderSourceARB(@NativeType("GLhandleARB") int shaderObj, @NativeType("GLcharARB const **") PointerBuffer string, @Nullable @NativeType("GLint const *") int[] length) { + long __functionAddress = GL.getICD().glShaderSourceARB; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, string.remaining()); + } + callPPV(shaderObj, string.remaining(), memAddress(string), length, __functionAddress); + } + + /** Array version of: {@link #glUniform1fvARB Uniform1fvARB} */ + public static void glUniform1fvARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniform1fvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glUniform2fvARB Uniform2fvARB} */ + public static void glUniform2fvARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniform2fvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glUniform3fvARB Uniform3fvARB} */ + public static void glUniform3fvARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniform3fvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glUniform4fvARB Uniform4fvARB} */ + public static void glUniform4fvARB(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniform4fvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glUniform1ivARB Uniform1ivARB} */ + public static void glUniform1ivARB(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform1ivARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glUniform2ivARB Uniform2ivARB} */ + public static void glUniform2ivARB(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform2ivARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glUniform3ivARB Uniform3ivARB} */ + public static void glUniform3ivARB(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform3ivARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glUniform4ivARB Uniform4ivARB} */ + public static void glUniform4ivARB(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform4ivARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glUniformMatrix2fvARB UniformMatrix2fvARB} */ + public static void glUniformMatrix2fvARB(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix2fvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glUniformMatrix3fvARB UniformMatrix3fvARB} */ + public static void glUniformMatrix3fvARB(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix3fvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 9, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glUniformMatrix4fvARB UniformMatrix4fvARB} */ + public static void glUniformMatrix4fvARB(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix4fvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 4, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glGetObjectParameterfvARB GetObjectParameterfvARB} */ + public static void glGetObjectParameterfvARB(@NativeType("GLhandleARB") int obj, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetObjectParameterfvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(obj, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetObjectParameterivARB GetObjectParameterivARB} */ + public static void glGetObjectParameterivARB(@NativeType("GLhandleARB") int obj, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetObjectParameterivARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(obj, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetInfoLogARB GetInfoLogARB} */ + public static void glGetInfoLogARB(@NativeType("GLhandleARB") int obj, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLcharARB *") ByteBuffer infoLog) { + long __functionAddress = GL.getICD().glGetInfoLogARB; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(obj, infoLog.remaining(), length, memAddress(infoLog), __functionAddress); + } + + /** Array version of: {@link #glGetAttachedObjectsARB GetAttachedObjectsARB} */ + public static void glGetAttachedObjectsARB(@NativeType("GLhandleARB") int containerObj, @Nullable @NativeType("GLsizei *") int[] count, @NativeType("GLhandleARB *") int[] obj) { + long __functionAddress = GL.getICD().glGetAttachedObjectsARB; + if (CHECKS) { + check(__functionAddress); + checkSafe(count, 1); + } + callPPV(containerObj, obj.length, count, obj, __functionAddress); + } + + /** Array version of: {@link #glGetActiveUniformARB GetActiveUniformARB} */ + public static void glGetActiveUniformARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] size, @NativeType("GLenum *") int[] type, @NativeType("GLcharARB *") ByteBuffer name) { + long __functionAddress = GL.getICD().glGetActiveUniformARB; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + callPPPPV(programObj, index, name.remaining(), length, size, type, memAddress(name), __functionAddress); + } + + /** Array version of: {@link #glGetUniformfvARB GetUniformfvARB} */ + public static void glGetUniformfvARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLint") int location, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetUniformfvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(programObj, location, params, __functionAddress); + } + + /** Array version of: {@link #glGetUniformivARB GetUniformivARB} */ + public static void glGetUniformivARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLint") int location, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetUniformivARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(programObj, location, params, __functionAddress); + } + + /** Array version of: {@link #glGetShaderSourceARB GetShaderSourceARB} */ + public static void glGetShaderSourceARB(@NativeType("GLhandleARB") int obj, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLcharARB *") ByteBuffer source) { + long __functionAddress = GL.getICD().glGetShaderSourceARB; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(obj, source.remaining(), length, memAddress(source), __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderStorageBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderStorageBufferObject.java new file mode 100644 index 000000000..0b3961a8e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderStorageBufferObject.java @@ -0,0 +1,88 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_shader_storage_buffer_object extension. + * + *

    This extension provides the ability for OpenGL shaders to perform random access reads, writes, and atomic memory operations on variables stored in a + * buffer object. Application shader code can declare sets of variables (referred to as "buffer variables") arranged into interface blocks in a manner + * similar to that done with uniform blocks in OpenGL 3.1. In both cases, the values of the variables declared in a given interface block are taken from a + * buffer object bound to a binding point associated with the block. Buffer objects used in this extension are referred to as "shader storage buffers".

    + * + *

    While the capability provided by this extension is similar to that provided by OpenGL 3.1 and {@link ARBUniformBufferObject ARB_uniform_buffer_object}, there are several + * significant differences. Most importantly, shader code is allowed to write to shader storage buffers, while uniform buffers are always read-only. Shader + * storage buffers have a separate set of binding points, with different counts and size limits. The maximum usable size for shader storage buffers is + * implementation-dependent, but its minimum value is substantially larger than the minimum for uniform buffers.

    + * + *

    The ability to write to buffer objects creates the potential for multiple independent shader invocations to read and write the same underlying memory. + * The same issue exists with the {@link ARBShaderImageLoadStore ARB_shader_image_load_store} extension provided in OpenGL 4.2, which can write to texture objects and buffers. In + * both cases, the specification makes few guarantees related to the relative order of memory reads and writes performed by the shader invocations. For + * ARB_shader_image_load_store, the OpenGL API and shading language do provide some control over memory transactions; those mechanisms also affect reads + * and writes of shader storage buffers. In the OpenGL API, the {@link GL42C#glMemoryBarrier MemoryBarrier} call can be used to ensure that certain memory operations related to + * commands issued prior the barrier complete before other operations related to commands issued after the barrier. Additionally, the shading language + * provides the {@code memoryBarrier()} function to control the relative order of memory accesses within individual shader invocations and provides + * various memory qualifiers controlling how the memory corresponding to individual variables is accessed.

    + * + *

    Requires {@link GL40 OpenGL 4.0} and {@link GL43 OpenGL 4.3} or {@link ARBProgramInterfaceQuery ARB_program_interface_query}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBShaderStorageBufferObject { + + static { GL.initialize(); } + + /** Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. */ + public static final int GL_SHADER_STORAGE_BUFFER = 0x90D2; + + /** + * Accepted by the {@code pname} parameter of GetIntegerv, GetIntegeri_v, GetBooleanv, GetInteger64v, GetFloatv, GetDoublev, GetBooleani_v, GetIntegeri_v, + * GetFloati_v, GetDoublei_v, and GetInteger64i_v. + */ + public static final int GL_SHADER_STORAGE_BUFFER_BINDING = 0x90D3; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v, GetBooleani_v, GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v. */ + public static final int + GL_SHADER_STORAGE_BUFFER_START = 0x90D4, + GL_SHADER_STORAGE_BUFFER_SIZE = 0x90D5; + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS = 0x90D6, + GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = 0x90D7, + GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = 0x90D8, + GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = 0x90D9, + GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = 0x90DA, + GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS = 0x90DB, + GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS = 0x90DC, + GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 0x90DD, + GL_MAX_SHADER_STORAGE_BLOCK_SIZE = 0x90DE, + GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = 0x90DF; + + /** Accepted in the {@code barriers} bitfield in glMemoryBarrier. */ + public static final int GL_SHADER_STORAGE_BARRIER_BIT = 0x2000; + + /** Also, add a new alias for the existing token MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS. */ + public static final int GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES = 0x8F39; + + protected ARBShaderStorageBufferObject() { + throw new UnsupportedOperationException(); + } + + // --- [ glShaderStorageBlockBinding ] --- + + /** + * Changes an active shader storage block binding. + * + * @param program the name of the program containing the block whose binding to change + * @param storageBlockIndex the index storage block within the program + * @param storageBlockBinding the index storage block binding to associate with the specified storage block + */ + public static void glShaderStorageBlockBinding(@NativeType("GLuint") int program, @NativeType("GLuint") int storageBlockIndex, @NativeType("GLuint") int storageBlockBinding) { + GL43C.glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderSubroutine.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderSubroutine.java new file mode 100644 index 000000000..a9b44b555 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShaderSubroutine.java @@ -0,0 +1,362 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_shader_subroutine extension. + * + *

    This extension adds support to shaders for "indirect subroutine calls", where a single shader can include many subroutines and dynamically select + * through the API which subroutine is called from each call site. Switching subroutines dynamically in this fashion can avoid the cost of recompiling and + * managing multiple shaders, while still retaining most of the performance of specialized shaders.

    + * + *

    Requires {@link ARBGPUShader5 ARB_gpu_shader5}. Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ +public class ARBShaderSubroutine { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetProgramStageiv. */ + public static final int + GL_ACTIVE_SUBROUTINES = 0x8DE5, + GL_ACTIVE_SUBROUTINE_UNIFORMS = 0x8DE6, + GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS = 0x8E47, + GL_ACTIVE_SUBROUTINE_MAX_LENGTH = 0x8E48, + GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH = 0x8E49; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int + GL_MAX_SUBROUTINES = 0x8DE7, + GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS = 0x8DE8; + + /** Accepted by the {@code pname} parameter of GetActiveSubroutineUniformiv. */ + public static final int + GL_NUM_COMPATIBLE_SUBROUTINES = 0x8E4A, + GL_COMPATIBLE_SUBROUTINES = 0x8E4B; + + protected ARBShaderSubroutine() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetSubroutineUniformLocation ] --- + + /** Unsafe version of: {@link #glGetSubroutineUniformLocation GetSubroutineUniformLocation} */ + public static int nglGetSubroutineUniformLocation(int program, int shadertype, long name) { + return GL40C.nglGetSubroutineUniformLocation(program, shadertype, name); + } + + /** + * Retrieves the location of a subroutine uniform of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine uniform whose index to query. + */ + @NativeType("GLint") + public static int glGetSubroutineUniformLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") ByteBuffer name) { + return GL40C.glGetSubroutineUniformLocation(program, shadertype, name); + } + + /** + * Retrieves the location of a subroutine uniform of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine uniform whose index to query. + */ + @NativeType("GLint") + public static int glGetSubroutineUniformLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") CharSequence name) { + return GL40C.glGetSubroutineUniformLocation(program, shadertype, name); + } + + // --- [ glGetSubroutineIndex ] --- + + /** Unsafe version of: {@link #glGetSubroutineIndex GetSubroutineIndex} */ + public static int nglGetSubroutineIndex(int program, int shadertype, long name) { + return GL40C.nglGetSubroutineIndex(program, shadertype, name); + } + + /** + * Retrieves the index of a subroutine function of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine function index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine function whose index to query + */ + @NativeType("GLuint") + public static int glGetSubroutineIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") ByteBuffer name) { + return GL40C.glGetSubroutineIndex(program, shadertype, name); + } + + /** + * Retrieves the index of a subroutine function of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine function index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine function whose index to query + */ + @NativeType("GLuint") + public static int glGetSubroutineIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") CharSequence name) { + return GL40C.glGetSubroutineIndex(program, shadertype, name); + } + + // --- [ glGetActiveSubroutineUniformiv ] --- + + /** Unsafe version of: {@link #glGetActiveSubroutineUniformiv GetActiveSubroutineUniformiv} */ + public static void nglGetActiveSubroutineUniformiv(int program, int shadertype, int index, int pname, long values) { + GL40C.nglGetActiveSubroutineUniformiv(program, shadertype, index, pname, values); + } + + /** + * Queries a property of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param pname the parameter of the shader subroutine uniform to query. One of:
    {@link GL40C#GL_NUM_COMPATIBLE_SUBROUTINES NUM_COMPATIBLE_SUBROUTINES}{@link GL40C#GL_COMPATIBLE_SUBROUTINES COMPATIBLE_SUBROUTINES}{@link GL31#GL_UNIFORM_SIZE UNIFORM_SIZE}{@link GL31#GL_UNIFORM_NAME_LENGTH UNIFORM_NAME_LENGTH}
    + * @param values the address of a buffer into which the queried value or values will be placed + */ + public static void glGetActiveSubroutineUniformiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer values) { + GL40C.glGetActiveSubroutineUniformiv(program, shadertype, index, pname, values); + } + + /** + * Queries a property of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param pname the parameter of the shader subroutine uniform to query. One of:
    {@link GL40C#GL_NUM_COMPATIBLE_SUBROUTINES NUM_COMPATIBLE_SUBROUTINES}{@link GL40C#GL_COMPATIBLE_SUBROUTINES COMPATIBLE_SUBROUTINES}{@link GL31#GL_UNIFORM_SIZE UNIFORM_SIZE}{@link GL31#GL_UNIFORM_NAME_LENGTH UNIFORM_NAME_LENGTH}
    + */ + @NativeType("void") + public static int glGetActiveSubroutineUniformi(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL40C.glGetActiveSubroutineUniformi(program, shadertype, index, pname); + } + + // --- [ glGetActiveSubroutineUniformName ] --- + + /** + * Unsafe version of: {@link #glGetActiveSubroutineUniformName GetActiveSubroutineUniformName} + * + * @param bufsize the size of the buffer whose address is given in {@code name} + */ + public static void nglGetActiveSubroutineUniformName(int program, int shadertype, int index, int bufsize, long length, long name) { + GL40C.nglGetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name); + } + + /** + * Queries the name of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param length the address of a variable into which is written the number of characters copied into {@code name} + * @param name the address of a buffer that will receive the name of the specified shader subroutine uniform + */ + public static void glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer name) { + GL40C.glGetActiveSubroutineUniformName(program, shadertype, index, length, name); + } + + /** + * Queries the name of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param bufsize the size of the buffer whose address is given in {@code name} + */ + @NativeType("void") + public static String glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufsize) { + return GL40C.glGetActiveSubroutineUniformName(program, shadertype, index, bufsize); + } + + /** + * Queries the name of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + */ + @NativeType("void") + public static String glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index) { + return glGetActiveSubroutineUniformName(program, shadertype, index, glGetActiveSubroutineUniformi(program, shadertype, index, GL31.GL_UNIFORM_NAME_LENGTH)); + } + + // --- [ glGetActiveSubroutineName ] --- + + /** + * Unsafe version of: {@link #glGetActiveSubroutineName GetActiveSubroutineName} + * + * @param bufsize the size of the buffer whose address is given in {@code name} + */ + public static void nglGetActiveSubroutineName(int program, int shadertype, int index, int bufsize, long length, long name) { + GL40C.nglGetActiveSubroutineName(program, shadertype, index, bufsize, length, name); + } + + /** + * Queries the name of an active shader subroutine. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query the subroutine name. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param length a variable which is to receive the length of the shader subroutine uniform name + * @param name an array into which the name of the shader subroutine uniform will be written + */ + public static void glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer name) { + GL40C.glGetActiveSubroutineName(program, shadertype, index, length, name); + } + + /** + * Queries the name of an active shader subroutine. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query the subroutine name. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param bufsize the size of the buffer whose address is given in {@code name} + */ + @NativeType("void") + public static String glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufsize) { + return GL40C.glGetActiveSubroutineName(program, shadertype, index, bufsize); + } + + /** + * Queries the name of an active shader subroutine. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query the subroutine name. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + */ + @NativeType("void") + public static String glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index) { + return glGetActiveSubroutineName(program, shadertype, index, glGetProgramStagei(program, shadertype, GL_ACTIVE_SUBROUTINE_MAX_LENGTH)); + } + + // --- [ glUniformSubroutinesuiv ] --- + + /** + * Unsafe version of: {@link #glUniformSubroutinesuiv UniformSubroutinesuiv} + * + * @param count the number of uniform indices stored in {@code indices} + */ + public static void nglUniformSubroutinesuiv(int shadertype, int count, long indices) { + GL40C.nglUniformSubroutinesuiv(shadertype, count, indices); + } + + /** + * Loads active subroutine uniforms. + * + * @param shadertype the shader stage to update. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param indices an array holding the indices to load into the shader subroutine variables + */ + public static void glUniformSubroutinesuiv(@NativeType("GLenum") int shadertype, @NativeType("GLuint const *") IntBuffer indices) { + GL40C.glUniformSubroutinesuiv(shadertype, indices); + } + + /** + * Loads active subroutine uniforms. + * + * @param shadertype the shader stage to update. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + */ + public static void glUniformSubroutinesui(@NativeType("GLenum") int shadertype, @NativeType("GLuint const *") int index) { + GL40C.glUniformSubroutinesui(shadertype, index); + } + + // --- [ glGetUniformSubroutineuiv ] --- + + /** Unsafe version of: {@link #glGetUniformSubroutineuiv GetUniformSubroutineuiv} */ + public static void nglGetUniformSubroutineuiv(int shadertype, int location, long params) { + GL40C.nglGetUniformSubroutineuiv(shadertype, location, params); + } + + /** + * Retrieves the value of a subroutine uniform of a given shader stage of the current program. + * + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param location the location of the subroutine uniform + * @param params a variable to receive the value or values of the subroutine uniform + */ + public static void glGetUniformSubroutineuiv(@NativeType("GLenum") int shadertype, @NativeType("GLint") int location, @NativeType("GLuint *") IntBuffer params) { + GL40C.glGetUniformSubroutineuiv(shadertype, location, params); + } + + /** + * Retrieves the value of a subroutine uniform of a given shader stage of the current program. + * + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param location the location of the subroutine uniform + */ + @NativeType("void") + public static int glGetUniformSubroutineui(@NativeType("GLenum") int shadertype, @NativeType("GLint") int location) { + return GL40C.glGetUniformSubroutineui(shadertype, location); + } + + // --- [ glGetProgramStageiv ] --- + + /** Unsafe version of: {@link #glGetProgramStageiv GetProgramStageiv} */ + public static void nglGetProgramStageiv(int program, int shadertype, int pname, long values) { + GL40C.nglGetProgramStageiv(program, shadertype, pname, values); + } + + /** + * Retrieves properties of a program object corresponding to a specified shader stage. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param pname the parameter of the shader to query. One of:
    {@link GL40C#GL_ACTIVE_SUBROUTINES ACTIVE_SUBROUTINES}{@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORMS ACTIVE_SUBROUTINE_UNIFORMS}
    {@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS}{@link GL40C#GL_ACTIVE_SUBROUTINE_MAX_LENGTH ACTIVE_SUBROUTINE_MAX_LENGTH}
    {@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH}
    + * @param values a variable into which the queried value or values will be placed + */ + public static void glGetProgramStageiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer values) { + GL40C.glGetProgramStageiv(program, shadertype, pname, values); + } + + /** + * Retrieves properties of a program object corresponding to a specified shader stage. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param pname the parameter of the shader to query. One of:
    {@link GL40C#GL_ACTIVE_SUBROUTINES ACTIVE_SUBROUTINES}{@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORMS ACTIVE_SUBROUTINE_UNIFORMS}
    {@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS}{@link GL40C#GL_ACTIVE_SUBROUTINE_MAX_LENGTH ACTIVE_SUBROUTINE_MAX_LENGTH}
    {@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH}
    + */ + @NativeType("void") + public static int glGetProgramStagei(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLenum") int pname) { + return GL40C.glGetProgramStagei(program, shadertype, pname); + } + + /** Array version of: {@link #glGetActiveSubroutineUniformiv GetActiveSubroutineUniformiv} */ + public static void glGetActiveSubroutineUniformiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] values) { + GL40C.glGetActiveSubroutineUniformiv(program, shadertype, index, pname, values); + } + + /** Array version of: {@link #glGetActiveSubroutineUniformName GetActiveSubroutineUniformName} */ + public static void glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer name) { + GL40C.glGetActiveSubroutineUniformName(program, shadertype, index, length, name); + } + + /** Array version of: {@link #glGetActiveSubroutineName GetActiveSubroutineName} */ + public static void glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer name) { + GL40C.glGetActiveSubroutineName(program, shadertype, index, length, name); + } + + /** Array version of: {@link #glUniformSubroutinesuiv UniformSubroutinesuiv} */ + public static void glUniformSubroutinesuiv(@NativeType("GLenum") int shadertype, @NativeType("GLuint const *") int[] indices) { + GL40C.glUniformSubroutinesuiv(shadertype, indices); + } + + /** Array version of: {@link #glGetUniformSubroutineuiv GetUniformSubroutineuiv} */ + public static void glGetUniformSubroutineuiv(@NativeType("GLenum") int shadertype, @NativeType("GLint") int location, @NativeType("GLuint *") int[] params) { + GL40C.glGetUniformSubroutineuiv(shadertype, location, params); + } + + /** Array version of: {@link #glGetProgramStageiv GetProgramStageiv} */ + public static void glGetProgramStageiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] values) { + GL40C.glGetProgramStageiv(program, shadertype, pname, values); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadingLanguage100.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadingLanguage100.java new file mode 100644 index 000000000..427102074 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadingLanguage100.java @@ -0,0 +1,22 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_shading_language_100 extension. + * + *

    This extension indicates that the OpenGL Shading Language is supported.

    + * + *

    Requires {@link ARBShaderObjects ARB_shader_objects}, {@link ARBFragmentShader ARB_fragment_shader} and {@link ARBVertexShader ARB_vertex_shader}. Promoted to core in {@link GL20 OpenGL 2.0}.

    + */ +public final class ARBShadingLanguage100 { + + /** Accepted by the {@code name} parameter of GetString. */ + public static final int GL_SHADING_LANGUAGE_VERSION_ARB = 0x8B8C; + + private ARBShadingLanguage100() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadingLanguageInclude.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadingLanguageInclude.java new file mode 100644 index 000000000..bc823ef90 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadingLanguageInclude.java @@ -0,0 +1,439 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_shading_language_include extension. + * + *

    This extension introduces a {@code #include} GLSL directive to allow reusing the same shader text in multiple shaders and defines the semantics and syntax of + * the names allowed in {@code #include} directives. It also defines API mechanisms to define the named string backing a {@code #include}.

    + * + *

    Introduction

    + * + *

    The GLSL {@code #include} mechanism looks up paths in a tree built through the OpenGL API. This appendix describes the syntax and semantic model of the tree and + * paths into the tree. How the tree is used is up to users of the tree, like the OpenGL API or GLSL.

    + * + *

    The Tree

    + * + *

    The tree is a singly rooted hierarchy of tree locations. The root may have one or more child locations, and any location may in turn have its own + * children. Except for the root, each location has exactly one parent; the root has no parent.

    + * + *

    Paths into the Tree

    + * + *

    The locations in the tree are created or looked up by path strings. The path string "/" locates the root of the tree. The path "/foo" locates the child + * "foo" of the root. Formally, a valid path is a sequence of tokens delimited by the beginning of the string, by the path-separator forward slash ( / ), + * and by the end of the string. The string "foo/bar" has two tokens; "foo" and "bar". The string "/foo/./bar" has 3 tokens; "foo", ".", and "bar". The + * string "/foo/.." has two tokens; "foo" and "..". The string "/foo/.bar" has two tokens; "foo" and ".bar". A path is invalid if

    + * + *
      + *
    • {@code path} contains any characters not listed in Section 3.1 "Character Set", or the double quote character, or angled brackets, or any white + * space characters other than the space character.
    • + *
    • {@code path} has consecutive forward slashes ( // ); "/foo//bar" is not valid (zero length tokens are not allowed).
    • + *
    • {@code path} ends with a forward slash ( / )
    • + *
    • {@code path} contains no characters.
    • + *
    + * + *

    There are no path escape characters, so there is no way to get the forward slash delimiter within a single token.

    + * + *

    When using a path to lookup a tree location, the path tokens are used to walk the tree. The initial location to start the walk is specified by the user + * of the tree and is updated as follows by the tokens in the path. (Paths starting with "/" will start at the root.) Taken left to right:

    + * + *

    The token ".." walks to the parent. Or, if already at the root, then the location remains at the root.

    + * + *

    The token "." leaves the location unchanged.

    + * + *

    Any other token is considered the name of a child of the current location, and walks to that child. (If there is no child of that name, this may result + * in a failed lookup or in the child being created, as specified by the user of the tree for the operation being performed.)

    + * + *

    Associated Strings

    + * + *

    Each location in the tree can have an additional string associated with it (that a user like the {@code #include} mechanism can use as an included string). This + * is true even for locations that have children: "/foo/bar" can exist in the tree at the same time that "/foo" has an additional string associated with + * it. Typically, when a path is used to find a location in the tree, it is for the purpose of returning this associated string.

    + * + *

    Hence, the tree can be built from a collection of (path,string) pairs, where path is a string establishing the existence of a location in the tree and + * string is the string associated with the node. Details of how to do this are specified by the user of the tree.

    + * + *

    Requires GLSL 1.10.

    + */ +public class ARBShadingLanguageInclude { + + static { GL.initialize(); } + + /** Accepted by the {@code type} parameter of NamedStringARB. */ + public static final int GL_SHADER_INCLUDE_ARB = 0x8DAE; + + /** Accepted by the {@code pname} parameter of GetNamedStringivARB. */ + public static final int + GL_NAMED_STRING_LENGTH_ARB = 0x8DE9, + GL_NAMED_STRING_TYPE_ARB = 0x8DEA; + + protected ARBShadingLanguageInclude() { + throw new UnsupportedOperationException(); + } + + // --- [ glNamedStringARB ] --- + + /** + * Unsafe version of: {@link #glNamedStringARB NamedStringARB} + * + * @param namelen the number of characters in {@code name}. If negative, {@code name} is considered to be a null-terminated string. + * @param stringlen the number of characters in {@code string}. If negative, {@code string} is considered to be a null-terminated string. + */ + public static native void nglNamedStringARB(int type, int namelen, long name, int stringlen, long string); + + /** + * Specifies a string and its name. Such strings can be included by name in shaders during compilation, allowing reuse of the same code segments. + * + *

    After calling NamedStringARB, the contents of {@code string} are associated with the tree location corresponding to {@code name}. If a string is already + * associated with that tree location, it will be replaced with the new {@code string}.

    + * + * @param type the string type. Must be:
    {@link #GL_SHADER_INCLUDE_ARB SHADER_INCLUDE_ARB}
    + * @param name the name associated with the string + * @param string an arbitrary string of characters + */ + public static void glNamedStringARB(@NativeType("GLenum") int type, @NativeType("GLchar const *") ByteBuffer name, @NativeType("GLchar const *") ByteBuffer string) { + nglNamedStringARB(type, name.remaining(), memAddress(name), string.remaining(), memAddress(string)); + } + + /** + * Specifies a string and its name. Such strings can be included by name in shaders during compilation, allowing reuse of the same code segments. + * + *

    After calling NamedStringARB, the contents of {@code string} are associated with the tree location corresponding to {@code name}. If a string is already + * associated with that tree location, it will be replaced with the new {@code string}.

    + * + * @param type the string type. Must be:
    {@link #GL_SHADER_INCLUDE_ARB SHADER_INCLUDE_ARB}
    + * @param name the name associated with the string + * @param string an arbitrary string of characters + */ + public static void glNamedStringARB(@NativeType("GLenum") int type, @NativeType("GLchar const *") CharSequence name, @NativeType("GLchar const *") CharSequence string) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int nameEncodedLength = stack.nASCII(name, false); + long nameEncoded = stack.getPointerAddress(); + int stringEncodedLength = stack.nUTF8(string, false); + long stringEncoded = stack.getPointerAddress(); + nglNamedStringARB(type, nameEncodedLength, nameEncoded, stringEncodedLength, stringEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDeleteNamedStringARB ] --- + + /** + * Unsafe version of: {@link #glDeleteNamedStringARB DeleteNamedStringARB} + * + * @param namelen the number of characters in {@code name}. If negative, {@code name} is considered to be a null-terminated string. + */ + public static native void nglDeleteNamedStringARB(int namelen, long name); + + /** + * Deletes a named string. + * + * @param name the name associated with the string + */ + public static void glDeleteNamedStringARB(@NativeType("GLchar const *") ByteBuffer name) { + nglDeleteNamedStringARB(name.remaining(), memAddress(name)); + } + + /** + * Deletes a named string. + * + * @param name the name associated with the string + */ + public static void glDeleteNamedStringARB(@NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int nameEncodedLength = stack.nASCII(name, false); + long nameEncoded = stack.getPointerAddress(); + nglDeleteNamedStringARB(nameEncodedLength, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCompileShaderIncludeARB ] --- + + /** Unsafe version of: {@link #glCompileShaderIncludeARB CompileShaderIncludeARB} */ + public static native void nglCompileShaderIncludeARB(int shader, int count, long path, long length); + + /** + * Compiles a shader object. + * + *

    The ordered list of {@code path}s is used during compilation, together with the arguments of {@code #include} directives in the shader source, to search for + * named strings corresponding to the {@code #include} directives. If a {@code #include} directive does not correspond to a valid named string, compilation will fail.

    + * + * @param shader the shader object compile + * @param path an ordered array of {@code count} pointers to optionally null-terminated character strings defining search paths + * @param length an array {@code count} values with the number of characters in each string (the string length). If an element in {@code length} is negative, its + * accompanying string is null-terminated. If {@code length} is {@code NULL}, all strings in the {@code path} argument are considered null-terminated. + */ + public static void glCompileShaderIncludeARB(@NativeType("GLuint") int shader, @NativeType("GLchar const * const *") PointerBuffer path, @Nullable @NativeType("GLint const *") IntBuffer length) { + if (CHECKS) { + checkSafe(length, path.remaining()); + } + nglCompileShaderIncludeARB(shader, path.remaining(), memAddress(path), memAddressSafe(length)); + } + + // --- [ glIsNamedStringARB ] --- + + /** + * Unsafe version of: {@link #glIsNamedStringARB IsNamedStringARB} + * + * @param namelen the number of characters in {@code name}. If negative, {@code name} is considered to be a null-terminated string. + */ + public static native boolean nglIsNamedStringARB(int namelen, long name); + + /** + * Returns {@link GL11#GL_TRUE TRUE} if the tree location corresponding to {@code name} has a string associated with it, and {@link GL11#GL_FALSE FALSE} if the tree location has no string + * associated with it. + * + * @param name the name associated with the string + */ + @NativeType("GLboolean") + public static boolean glIsNamedStringARB(@NativeType("GLchar const *") ByteBuffer name) { + return nglIsNamedStringARB(name.remaining(), memAddress(name)); + } + + /** + * Returns {@link GL11#GL_TRUE TRUE} if the tree location corresponding to {@code name} has a string associated with it, and {@link GL11#GL_FALSE FALSE} if the tree location has no string + * associated with it. + * + * @param name the name associated with the string + */ + @NativeType("GLboolean") + public static boolean glIsNamedStringARB(@NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int nameEncodedLength = stack.nASCII(name, false); + long nameEncoded = stack.getPointerAddress(); + return nglIsNamedStringARB(nameEncodedLength, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetNamedStringARB ] --- + + /** + * Unsafe version of: {@link #glGetNamedStringARB GetNamedStringARB} + * + * @param namelen the number of characters in {@code name}. If negative, {@code name} is considered to be a null-terminated string. + * @param bufSize the maximum number of characters that may be written into {@code string}, including the null terminator + */ + public static native void nglGetNamedStringARB(int namelen, long name, int bufSize, long stringlen, long string); + + /** + * Returns in {@code string} the string corresponding to the specified {@code name}. The returned string will be null-terminated. + * + * @param name the name associated with the string + * @param stringlen a buffer in which to place the actual number of characters written into {@code string}, excluding the null terminator. If {@code NULL}, no length is + * returned. + * @param string a buffer in which to place the returned string + */ + public static void glGetNamedStringARB(@NativeType("GLchar const *") ByteBuffer name, @Nullable @NativeType("GLint *") IntBuffer stringlen, @NativeType("GLchar *") ByteBuffer string) { + if (CHECKS) { + checkSafe(stringlen, 1); + } + nglGetNamedStringARB(name.remaining(), memAddress(name), string.remaining(), memAddressSafe(stringlen), memAddress(string)); + } + + /** + * Returns in {@code string} the string corresponding to the specified {@code name}. The returned string will be null-terminated. + * + * @param name the name associated with the string + * @param stringlen a buffer in which to place the actual number of characters written into {@code string}, excluding the null terminator. If {@code NULL}, no length is + * returned. + * @param string a buffer in which to place the returned string + */ + public static void glGetNamedStringARB(@NativeType("GLchar const *") CharSequence name, @Nullable @NativeType("GLint *") IntBuffer stringlen, @NativeType("GLchar *") ByteBuffer string) { + if (CHECKS) { + checkSafe(stringlen, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int nameEncodedLength = stack.nASCII(name, false); + long nameEncoded = stack.getPointerAddress(); + nglGetNamedStringARB(nameEncodedLength, nameEncoded, string.remaining(), memAddressSafe(stringlen), memAddress(string)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Returns in {@code string} the string corresponding to the specified {@code name}. The returned string will be null-terminated. + * + * @param name the name associated with the string + * @param bufSize the maximum number of characters that may be written into {@code string}, including the null terminator + */ + @NativeType("void") + public static String glGetNamedStringARB(@NativeType("GLchar const *") CharSequence name, @NativeType("GLsizei") int bufSize) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int nameEncodedLength = stack.nASCII(name, false); + long nameEncoded = stack.getPointerAddress(); + IntBuffer stringlen = stack.ints(0); + ByteBuffer string = stack.malloc(bufSize); + nglGetNamedStringARB(nameEncodedLength, nameEncoded, bufSize, memAddress(stringlen), memAddress(string)); + return memUTF8(string, stringlen.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Returns in {@code string} the string corresponding to the specified {@code name}. The returned string will be null-terminated. + * + * @param name the name associated with the string + */ + @NativeType("void") + public static String glGetNamedStringARB(@NativeType("GLchar const *") CharSequence name) { + return glGetNamedStringARB(name, glGetNamedStringiARB(name, GL_NAMED_STRING_LENGTH_ARB)); + } + + // --- [ glGetNamedStringivARB ] --- + + /** + * Unsafe version of: {@link #glGetNamedStringivARB GetNamedStringivARB} + * + * @param namelen the number of characters in {@code name}. If negative, {@code name} is considered to be a null-terminated string. + */ + public static native void nglGetNamedStringivARB(int namelen, long name, int pname, long params); + + /** + * Returns properties of the named string whose tree location corresponds to {@code name}. + * + * @param name the name associated with the string + * @param pname the parameter to query. One of:
    {@link #GL_NAMED_STRING_LENGTH_ARB NAMED_STRING_LENGTH_ARB}{@link #GL_NAMED_STRING_TYPE_ARB NAMED_STRING_TYPE_ARB}
    + * @param params a buffer in which to place the returned value + */ + public static void glGetNamedStringivARB(@NativeType("GLchar const *") ByteBuffer name, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedStringivARB(name.remaining(), memAddress(name), pname, memAddress(params)); + } + + /** + * Returns properties of the named string whose tree location corresponds to {@code name}. + * + * @param name the name associated with the string + * @param pname the parameter to query. One of:
    {@link #GL_NAMED_STRING_LENGTH_ARB NAMED_STRING_LENGTH_ARB}{@link #GL_NAMED_STRING_TYPE_ARB NAMED_STRING_TYPE_ARB}
    + * @param params a buffer in which to place the returned value + */ + public static void glGetNamedStringivARB(@NativeType("GLchar const *") CharSequence name, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int nameEncodedLength = stack.nASCII(name, false); + long nameEncoded = stack.getPointerAddress(); + nglGetNamedStringivARB(nameEncodedLength, nameEncoded, pname, memAddress(params)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Returns properties of the named string whose tree location corresponds to {@code name}. + * + * @param name the name associated with the string + * @param pname the parameter to query. One of:
    {@link #GL_NAMED_STRING_LENGTH_ARB NAMED_STRING_LENGTH_ARB}{@link #GL_NAMED_STRING_TYPE_ARB NAMED_STRING_TYPE_ARB}
    + */ + @NativeType("void") + public static int glGetNamedStringiARB(@NativeType("GLchar const *") CharSequence name, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int nameEncodedLength = stack.nASCII(name, false); + long nameEncoded = stack.getPointerAddress(); + IntBuffer params = stack.callocInt(1); + nglGetNamedStringivARB(nameEncodedLength, nameEncoded, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glCompileShaderIncludeARB CompileShaderIncludeARB} */ + public static void glCompileShaderIncludeARB(@NativeType("GLuint") int shader, @NativeType("GLchar const * const *") PointerBuffer path, @Nullable @NativeType("GLint const *") int[] length) { + long __functionAddress = GL.getICD().glCompileShaderIncludeARB; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, path.remaining()); + } + callPPV(shader, path.remaining(), memAddress(path), length, __functionAddress); + } + + /** Array version of: {@link #glGetNamedStringARB GetNamedStringARB} */ + public static void glGetNamedStringARB(@NativeType("GLchar const *") ByteBuffer name, @Nullable @NativeType("GLint *") int[] stringlen, @NativeType("GLchar *") ByteBuffer string) { + long __functionAddress = GL.getICD().glGetNamedStringARB; + if (CHECKS) { + check(__functionAddress); + checkSafe(stringlen, 1); + } + callPPPV(name.remaining(), memAddress(name), string.remaining(), stringlen, memAddress(string), __functionAddress); + } + + /** Array version of: {@link #glGetNamedStringARB GetNamedStringARB} */ + public static void glGetNamedStringARB(@NativeType("GLchar const *") CharSequence name, @Nullable @NativeType("GLint *") int[] stringlen, @NativeType("GLchar *") ByteBuffer string) { + long __functionAddress = GL.getICD().glGetNamedStringARB; + if (CHECKS) { + check(__functionAddress); + checkSafe(stringlen, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int nameEncodedLength = stack.nASCII(name, false); + long nameEncoded = stack.getPointerAddress(); + callPPPV(nameEncodedLength, nameEncoded, string.remaining(), stringlen, memAddress(string), __functionAddress); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glGetNamedStringivARB GetNamedStringivARB} */ + public static void glGetNamedStringivARB(@NativeType("GLchar const *") ByteBuffer name, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedStringivARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPPV(name.remaining(), memAddress(name), pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetNamedStringivARB GetNamedStringivARB} */ + public static void glGetNamedStringivARB(@NativeType("GLchar const *") CharSequence name, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedStringivARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int nameEncodedLength = stack.nASCII(name, false); + long nameEncoded = stack.getPointerAddress(); + callPPV(nameEncodedLength, nameEncoded, pname, params, __functionAddress); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadow.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadow.java new file mode 100644 index 000000000..a22c431fe --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadow.java @@ -0,0 +1,33 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_shadow extension. + * + *

    This extension supports comparing the texture R coordinate to a depth texture value in order to produce a boolean texture value. This can be used to + * implement shadow maps.

    + * + *

    The extension is written in generic terms such that other texture comparison modes can be accommodated in the future.

    + * + *

    Requires {@link ARBDepthTexture ARB_depth_texture}. Promoted to core in {@link GL14 OpenGL 1.4}.

    + */ +public final class ARBShadow { + + /** Accepted by the {@code pname} parameter of TexParameterf, TexParameteri, TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int + GL_TEXTURE_COMPARE_MODE_ARB = 0x884C, + GL_TEXTURE_COMPARE_FUNC_ARB = 0x884D; + + /** + * Accepted by the {@code param} parameter of TexParameterf, TexParameteri, TexParameterfv, and TexParameteriv when the {@code pname} parameter is + * TEXTURE_COMPARE_MODE_ARB. + */ + public static final int GL_COMPARE_R_TO_TEXTURE_ARB = 0x884E; + + private ARBShadow() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadowAmbient.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadowAmbient.java new file mode 100644 index 000000000..b8700ff62 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBShadowAmbient.java @@ -0,0 +1,24 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_shadow_ambient extension. + * + *

    This extension allows the user to specify the texture value to use when the texture compare function fails. Normally this value is zero. By allowing an + * arbitrary value we can get functionality which otherwise requires an advanced texture combine extension (such as + * NV_register_combiners) and multiple texture units.

    + * + *

    Requires {@link ARBShadow ARB_shadow} and {@link ARBDepthTexture ARB_depth_texture}.

    + */ +public final class ARBShadowAmbient { + + /** Accepted by the {@code pname} parameter of TexParameterf, TexParameteri, TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int GL_TEXTURE_COMPARE_FAIL_VALUE_ARB = 0x80BF; + + private ARBShadowAmbient() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSparseBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSparseBuffer.java new file mode 100644 index 000000000..a841e6e29 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSparseBuffer.java @@ -0,0 +1,71 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_sparse_buffer extension. + * + *

    This extension adds to GL a mechanism to decouple the virtual and physical storage requirements of textures and allows an application + * to create partially populated textures that would over-subscribe available graphics memory if made fully resident. This extension provides like + * functionality for buffer objects, allowing applications to manage buffer object storage in a similar manner.

    + * + *

    Requires {@link GL15 OpenGL 1.5} or {@link ARBVertexBufferObject ARB_vertex_buffer_object}.

    + */ +public class ARBSparseBuffer { + + static { GL.initialize(); } + + /** Accepted as part of the {@code flags} parameter to {@link GL44C#glBufferStorage BufferStorage}. */ + public static final int GL_SPARSE_STORAGE_BIT_ARB = 0x400; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v. */ + public static final int GL_SPARSE_BUFFER_PAGE_SIZE_ARB = 0x82F8; + + protected ARBSparseBuffer() { + throw new UnsupportedOperationException(); + } + + // --- [ glBufferPageCommitmentARB ] --- + + /** + * Commit and de-commits regions of sparse buffer storage. + * + * @param target buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the region offset. Must be an integer multiple of the implementation dependent constant {@link #GL_SPARSE_BUFFER_PAGE_SIZE_ARB SPARSE_BUFFER_PAGE_SIZE_ARB}. + * @param size the data size. must either be a multiple of {@link #GL_SPARSE_BUFFER_PAGE_SIZE_ARB SPARSE_BUFFER_PAGE_SIZE_ARB}, or extend to the end of the buffer's data store. + * @param commit If true, then pages contained in the specified range become committed and become physically backed. If false, then physical storage associated with + * the data store in the specified region may be freed and those pages become uncommitted. Newly committed pages have undefined content. However, + * redundantly committing pages does not alter their content. + */ + public static native void glBufferPageCommitmentARB(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLboolean") boolean commit); + + // --- [ glNamedBufferPageCommitmentEXT ] --- + + /** + * Direct-state-access version of {@link #glBufferPageCommitmentARB BufferPageCommitmentARB}. + * + * @param buffer the buffer object + * @param offset the region offset. Must be an integer multiple of the implementation dependent constant {@link #GL_SPARSE_BUFFER_PAGE_SIZE_ARB SPARSE_BUFFER_PAGE_SIZE_ARB}. + * @param size the data size. must either be a multiple of {@link #GL_SPARSE_BUFFER_PAGE_SIZE_ARB SPARSE_BUFFER_PAGE_SIZE_ARB}, or extend to the end of the buffer's data store. + * @param commit the commit state + */ + public static native void glNamedBufferPageCommitmentEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLboolean") boolean commit); + + // --- [ glNamedBufferPageCommitmentARB ] --- + + /** + * Direct-state-access version of {@link #glBufferPageCommitmentARB BufferPageCommitmentARB}. + * + * @param buffer the buffer object + * @param offset the region offset. Must be an integer multiple of the implementation dependent constant {@link #GL_SPARSE_BUFFER_PAGE_SIZE_ARB SPARSE_BUFFER_PAGE_SIZE_ARB}. + * @param size the data size. must either be a multiple of {@link #GL_SPARSE_BUFFER_PAGE_SIZE_ARB SPARSE_BUFFER_PAGE_SIZE_ARB}, or extend to the end of the buffer's data store. + * @param commit the commit state + */ + public static native void glNamedBufferPageCommitmentARB(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLboolean") boolean commit); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSparseTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSparseTexture.java new file mode 100644 index 000000000..6dd74177d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSparseTexture.java @@ -0,0 +1,148 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_sparse_texture extension. + * + *

    Recent advances in application complexity and a desire for higher resolutions have pushed texture sizes up considerably. Often, the amount of physical + * memory available to a graphics processor is a limiting factor in the performance of texture-heavy applications. Once the available physical memory is + * exhausted, paging may occur bringing performance down considerably - or worse, the application may fail. Nevertheless, the amount of address space + * available to the graphics processor has increased to the point where many gigabytes - or even terabytes of address space may be usable even though that + * amount of physical memory is not present.

    + * + *

    This extension allows the separation of the graphics processor's address space (reservation) from the requirement that all textures must be physically + * backed (commitment). This exposes a limited form of virtualization for textures. Use cases include sparse (or partially resident) textures, texture + * paging, on-demand and delayed loading of texture assets and application controlled level of detail.

    + */ +public class ARBSparseTexture { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter to TexParameter{i f}{v}, TexParameterI{u}v, GetTexParameter{if}v and GetTexParameterIi{u}v. */ + public static final int + GL_TEXTURE_SPARSE_ARB = 0x91A6, + GL_VIRTUAL_PAGE_SIZE_INDEX_ARB = 0x91A7; + + /** Accepted by the {@code pname} parameter of GetTexParameter{if}v and GetTexParameterIi{u}v. */ + public static final int GL_NUM_SPARSE_LEVELS_ARB = 0x91AA; + + /** Accepted by the {@code pname} parameter to GetInternalformativ. */ + public static final int + GL_NUM_VIRTUAL_PAGE_SIZES_ARB = 0x91A8, + GL_VIRTUAL_PAGE_SIZE_X_ARB = 0x9195, + GL_VIRTUAL_PAGE_SIZE_Y_ARB = 0x9196, + GL_VIRTUAL_PAGE_SIZE_Z_ARB = 0x9197; + + /** Accepted by the {@code pname} parameter to GetIntegerv, GetFloatv, GetDoublev, GetInteger64v, and GetBooleanv. */ + public static final int + GL_MAX_SPARSE_TEXTURE_SIZE_ARB = 0x9198, + GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB = 0x9199, + GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB = 0x919A, + GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB = 0x91A9; + + protected ARBSparseTexture() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexPageCommitmentARB ] --- + + /** + * Makes individual pages of a sparse texture resident or non resident. + * + *

    If the value of {@code commit} is {@link GL11#GL_TRUE TRUE}, then the texture pages contained in the region defined by the values of {@code xoffset}, {@code yoffset}, + * {@code zoffset}, {@code width}, {@code height} and {@code depth} are committed. If they were not committed before the call, then new physical backing + * store is allocated and associated with the sparse pages and their initial content is undefined. If the pages were already committed, then they remain + * committed, no error is generated, and the content of those pages remains unmodified. If the value of {@code committed} is {@link GL11#GL_FALSE FALSE}, then the texture + * pages contained in the region are made de-committed. Their physical store is de-allocated, and their contents again become undefined.

    + * + *

    For the purposes of commitment, a cube map texture is treated as a 2D array texture with a depth of six and cube map array textures are treated as 2D + * array textures with a depth equal to six times the number of layers in the cube map array.

    + * + *

    For levels of a sparse texture where each dimension is a multiple of the virtual page size, the residency of individual page-size regions is controlled + * by TexPageCommitmentARB and such levels may be partially populated. When the mipmap chain reaches a level that is not an integer multiple of the virtual + * page size in any dimension, padding and memory layout considerations may make it impossible to treat that level and subsequent smaller ones as partially + * populated. The set of levels that can be partially populated is implementation-dependent. The total number of levels that may be partially populated may + * be queried by calling {@link GL11C#glGetTexParameteriv GetTexParameteriv} with the {@code pname} {@link #GL_NUM_SPARSE_LEVELS_ARB NUM_SPARSE_LEVELS_ARB}.

    + * + *

    The collection of texture levels that may not be partially populated, if any, consists of levels {@link #GL_NUM_SPARSE_LEVELS_ARB NUM_SPARSE_LEVELS_ARB} and higher, and is referred to + * as the mipmap 'tail'. The levels comprising the tail are made resident or non-resident as a unit. The tail is resident if and only if + * TexPageCommitmentARB has been called successfully with {@code level} greater than or equal to {@link #GL_NUM_SPARSE_LEVELS_ARB NUM_SPARSE_LEVELS_ARB} and the value of {@code commit} was + * {@link GL11#GL_TRUE TRUE} for the last such call.

    + * + *

    Views of sparse textures are also considered sparse. Modifications to commitment of a texture via a view of it affect the parent texture and any other + * views containing the modified pages. If a view of a sparse texture references its tail (or is entirely contained within it), modifications to commitment + * of the tail via the view will affect the entire tail of the parent, even for parts of the tail that are not referenced by the view. Furthermore, + * modifications to tail commitment may affect views referencing other parts of the tail.

    + * + *
    Errors
    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if {@code xoffset} + {@code width} or {@code yoffset} + {@code height} is greater than the width or height, + * respectively, of level {@code level} of the texture bound to {@code target}.

    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if {@code zoffset} + {@code depth} is greater than

    + * + *
      + *
    • the depth of level {@code level} of the texture bound to {@code target}, if {@code target} is {@link GL12#GL_TEXTURE_3D TEXTURE_3D};
    • + *
    • the number of layers of level {@code level} of the texture bound to {@code target}, if {@code target} is {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY};
    • + *
    • six times the number of layers of level {@code level} of the texture bound to {@code target}, if {@code target} is {@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}; or
    • + *
    • one, for all other targets.
    • + *
    + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if {@code xoffset}, {@code yoffset}, or {@code zoffset} is not a multiple of {@link #GL_VIRTUAL_PAGE_SIZE_X_ARB VIRTUAL_PAGE_SIZE_X_ARB}, + * {@link #GL_VIRTUAL_PAGE_SIZE_Y_ARB VIRTUAL_PAGE_SIZE_Y_ARB}, or {@link #GL_VIRTUAL_PAGE_SIZE_Z_ARB VIRTUAL_PAGE_SIZE_Z_ARB}, respectively, of the texture bound to {@code target}.

    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if {@code width} is not an integer multiple of {@link #GL_VIRTUAL_PAGE_SIZE_X_ARB VIRTUAL_PAGE_SIZE_X_ARB} and {@code width} plus + * {@code xoffset} is not equal to the width of level {@code level} of the texture bound to {@code target}.

    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if {@code height} is not an integer multiple of {@link #GL_VIRTUAL_PAGE_SIZE_Y_ARB VIRTUAL_PAGE_SIZE_Y_ARB} and {@code height} plus + * {@code yoffset} is not equal to the height of level {@code level} of the texture bound to {@code target}.

    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if {@code depth} is not an integer multiple of {@link #GL_VIRTUAL_PAGE_SIZE_Z_ARB VIRTUAL_PAGE_SIZE_Z_ARB} and {@code depth} plus + * {@code zoffset} is not equal to

    + * + *
      + *
    • the depth of level {@code level} of the texture bound to {@code target}, if {@code target} is TEXTURE_3D;
    • + *
    • the number of layers of level {@code level} of the texture bound to {@code target}, if {@code target} is TEXTURE_2D_ARRAY;
    • + *
    • six times the number of layers of level {@code level} of the texture bound to {@code target}, if {@code target} is TEXTURE_CUBE_MAP_ARRAY; or
    • + *
    • one, for all other targets.
    • + *
    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if the value of {@link GL42#GL_TEXTURE_IMMUTABLE_FORMAT TEXTURE_IMMUTABLE_FORMAT} or {@link #GL_TEXTURE_SPARSE_ARB TEXTURE_SPARSE_ARB} for the texture bound to + * {@code target} is {@link GL11#GL_FALSE FALSE}.

    + * + * @param target the texture target. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param commit the commit flag + */ + public static native void glTexPageCommitmentARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean commit); + + // --- [ glTexturePageCommitmentEXT ] --- + + /** + * DSA version of {@link #glTexPageCommitmentARB TexPageCommitmentARB}. + * + * @param texture the texture object + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param commit the commit flag + */ + public static native void glTexturePageCommitmentEXT(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean commit); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBStencilTexturing.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBStencilTexturing.java new file mode 100644 index 000000000..efc4b67f8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBStencilTexturing.java @@ -0,0 +1,24 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_stencil_texturing extension. + * + *

    This extension allows texturing of the stencil component of a packed depth stencil texture. Stencil values are returned as unsigned integers. It is not + * possible to sample both depth and stencil values from the same texture, and this extension allows the app to select which is sampled for the bound + * texture.

    + * + *

    Requires {@link ARBDepthTexture ARB_depth_texture} and {@link EXTPackedDepthStencil EXT_packed_depth_stencil}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public final class ARBStencilTexturing { + + /** Accepted by the {@code pname} parameter of TexParameter and GetTexParameter*. */ + public static final int GL_DEPTH_STENCIL_TEXTURE_MODE = 0x90EA; + + private ARBStencilTexturing() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSync.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSync.java new file mode 100644 index 000000000..52544b3c4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBSync.java @@ -0,0 +1,245 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_sync extension. + * + *

    This extension introduces the concept of "sync objects". Sync objects are a synchronization primitive - a representation of events whose completion + * status can be tested or waited upon. One specific type of sync object, the "fence sync object", is supported in this extension, and additional types can + * easily be added in the future.

    + * + *

    Fence sync objects have corresponding fences, which are inserted into the OpenGL command stream at the time the sync object is created. A sync object + * can be queried for a given condition. The only condition supported for fence sync objects is completion of the corresponding fence command. Fence + * completion allows applications to request a partial Finish, wherein all commands prior to the fence will be forced to complete before control is + * returned to the calling process.

    + * + *

    These new mechanisms allow for synchronization between the host CPU and the GPU, which may be accessing the same resources (typically memory), as well + * as between multiple GL contexts bound to multiple threads in the host CPU.

    + * + *

    Requires {@link GL31 OpenGL 3.1}. Promoted to core in {@link GL32 OpenGL 3.2}.

    + */ +public class ARBSync { + + static { GL.initialize(); } + + /** Accepted as the {@code pname} parameter of GetInteger64v. */ + public static final int GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111; + + /** Accepted as the {@code pname} parameter of GetSynciv. */ + public static final int + GL_OBJECT_TYPE = 0x9112, + GL_SYNC_CONDITION = 0x9113, + GL_SYNC_STATUS = 0x9114, + GL_SYNC_FLAGS = 0x9115; + + /** Returned in {@code values} for GetSynciv {@code pname} OBJECT_TYPE. */ + public static final int GL_SYNC_FENCE = 0x9116; + + /** Returned in {@code values} for GetSynciv {@code pname} SYNC_CONDITION. */ + public static final int GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117; + + /** Returned in {@code values} for GetSynciv {@code pname} SYNC_STATUS. */ + public static final int + GL_UNSIGNALED = 0x9118, + GL_SIGNALED = 0x9119; + + /** Accepted in the {@code flags} parameter of ClientWaitSync. */ + public static final int GL_SYNC_FLUSH_COMMANDS_BIT = 0x1; + + /** Accepted in the {@code timeout} parameter of WaitSync. */ + public static final long GL_TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFFL; + + /** Returned by ClientWaitSync. */ + public static final int + GL_ALREADY_SIGNALED = 0x911A, + GL_TIMEOUT_EXPIRED = 0x911B, + GL_CONDITION_SATISFIED = 0x911C, + GL_WAIT_FAILED = 0x911D; + + protected ARBSync() { + throw new UnsupportedOperationException(); + } + + // --- [ glFenceSync ] --- + + /** + * Creates a new sync object and inserts it into the GL command stream. + * + * @param condition the condition that must be met to set the sync object's state to signaled. Must be:
    {@link GL32C#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE}
    + * @param flags a bitwise combination of flags controlling the behavior of the sync object. No flags are presently defined for this operation and {@code flags} must + * be zero. + */ + @NativeType("GLsync") + public static long glFenceSync(@NativeType("GLenum") int condition, @NativeType("GLbitfield") int flags) { + return GL32C.glFenceSync(condition, flags); + } + + // --- [ glIsSync ] --- + + /** Unsafe version of: {@link #glIsSync IsSync} */ + public static boolean nglIsSync(long sync) { + return GL32C.nglIsSync(sync); + } + + /** + * Determines if a name corresponds to a sync object. + * + * @param sync a value that may be the name of a sync object + */ + @NativeType("GLboolean") + public static boolean glIsSync(@NativeType("GLsync") long sync) { + return GL32C.glIsSync(sync); + } + + // --- [ glDeleteSync ] --- + + /** Unsafe version of: {@link #glDeleteSync DeleteSync} */ + public static void nglDeleteSync(long sync) { + GL32C.nglDeleteSync(sync); + } + + /** + * Deletes a sync object. + * + * @param sync the sync object to be deleted + */ + public static void glDeleteSync(@NativeType("GLsync") long sync) { + GL32C.glDeleteSync(sync); + } + + // --- [ glClientWaitSync ] --- + + /** Unsafe version of: {@link #glClientWaitSync ClientWaitSync} */ + public static int nglClientWaitSync(long sync, int flags, long timeout) { + return GL32C.nglClientWaitSync(sync, flags, timeout); + } + + /** + * Causes the client to block and wait for a sync object to become signaled. If {@code sync} is signaled when {@code glClientWaitSync} is called, + * {@code glClientWaitSync} returns immediately, otherwise it will block and wait for up to timeout nanoseconds for {@code sync} to become signaled. + * + *

    The return value is one of four status values:

    + * + *
      + *
    • {@link GL32C#GL_ALREADY_SIGNALED ALREADY_SIGNALED} indicates that sync was signaled at the time that glClientWaitSync was called.
    • + *
    • {@link GL32C#GL_TIMEOUT_EXPIRED TIMEOUT_EXPIRED} indicates that at least timeout nanoseconds passed and sync did not become signaled.
    • + *
    • {@link GL32C#GL_CONDITION_SATISFIED CONDITION_SATISFIED} indicates that sync was signaled before the timeout expired.
    • + *
    • {@link GL32C#GL_WAIT_FAILED WAIT_FAILED} indicates that an error occurred. Additionally, an OpenGL error will be generated.
    • + *
    + * + * @param sync the sync object whose status to wait on + * @param flags a bitfield controlling the command flushing behavior. One or more of:
    0{@link GL32C#GL_SYNC_FLUSH_COMMANDS_BIT SYNC_FLUSH_COMMANDS_BIT}
    + * @param timeout the timeout, specified in nanoseconds, for which the implementation should wait for {@code sync} to become signaled + */ + @NativeType("GLenum") + public static int glClientWaitSync(@NativeType("GLsync") long sync, @NativeType("GLbitfield") int flags, @NativeType("GLuint64") long timeout) { + return GL32C.glClientWaitSync(sync, flags, timeout); + } + + // --- [ glWaitSync ] --- + + /** Unsafe version of: {@link #glWaitSync WaitSync} */ + public static void nglWaitSync(long sync, int flags, long timeout) { + GL32C.nglWaitSync(sync, flags, timeout); + } + + /** + * Causes the GL server to block and wait for a sync object to become signaled. + * + *

    {@code glWaitSync} will always wait no longer than an implementation-dependent timeout. The duration of this timeout in nanoseconds may be queried by + * with {@link GL32C#GL_MAX_SERVER_WAIT_TIMEOUT MAX_SERVER_WAIT_TIMEOUT}. There is currently no way to determine whether glWaitSync unblocked because the timeout expired or because the + * sync object being waited on was signaled.

    + * + *

    If an error occurs, {@code glWaitSync} does not cause the GL server to block.

    + * + * @param sync the sync object whose status to wait on + * @param flags a bitfield controlling the command flushing behavior. Must be:
    0
    + * @param timeout the timeout that the server should wait before continuing. Must be:
    {@link GL32C#GL_TIMEOUT_IGNORED TIMEOUT_IGNORED}
    + */ + public static void glWaitSync(@NativeType("GLsync") long sync, @NativeType("GLbitfield") int flags, @NativeType("GLuint64") long timeout) { + GL32C.glWaitSync(sync, flags, timeout); + } + + // --- [ glGetInteger64v ] --- + + /** Unsafe version of: {@link #glGetInteger64v GetInteger64v} */ + public static void nglGetInteger64v(int pname, long params) { + GL32C.nglGetInteger64v(pname, params); + } + + /** + * Returns the 64bit integer value or values of a selected parameter. + * + * @param pname the parameter value to be returned + * @param params the value or values of the specified parameter + */ + public static void glGetInteger64v(@NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + GL32C.glGetInteger64v(pname, params); + } + + /** + * Returns the 64bit integer value or values of a selected parameter. + * + * @param pname the parameter value to be returned + */ + @NativeType("void") + public static long glGetInteger64(@NativeType("GLenum") int pname) { + return GL32C.glGetInteger64(pname); + } + + // --- [ glGetSynciv ] --- + + /** + * Unsafe version of: {@link #glGetSynciv GetSynciv} + * + * @param bufSize the size of the buffer whose address is given in {@code values} + */ + public static void nglGetSynciv(long sync, int pname, int bufSize, long length, long values) { + GL32C.nglGetSynciv(sync, pname, bufSize, length, values); + } + + /** + * Queries the properties of a sync object. + * + * @param sync the sync object whose properties to query + * @param pname the parameter whose value to retrieve from the sync object specified in {@code sync}. One of:
    {@link GL32C#GL_OBJECT_TYPE OBJECT_TYPE}{@link GL32C#GL_SYNC_CONDITION SYNC_CONDITION}{@link GL32C#GL_SYNC_STATUS SYNC_STATUS}{@link GL32C#GL_SYNC_FLAGS SYNC_FLAGS}
    + * @param length the address of an variable to receive the number of integers placed in {@code values} + * @param values the address of an array to receive the values of the queried parameter + */ + public static void glGetSynciv(@NativeType("GLsync") long sync, @NativeType("GLenum") int pname, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer values) { + GL32C.glGetSynciv(sync, pname, length, values); + } + + /** + * Queries the properties of a sync object. + * + * @param sync the sync object whose properties to query + * @param pname the parameter whose value to retrieve from the sync object specified in {@code sync}. One of:
    {@link GL32C#GL_OBJECT_TYPE OBJECT_TYPE}{@link GL32C#GL_SYNC_CONDITION SYNC_CONDITION}{@link GL32C#GL_SYNC_STATUS SYNC_STATUS}{@link GL32C#GL_SYNC_FLAGS SYNC_FLAGS}
    + * @param length the address of an variable to receive the number of integers placed in {@code values} + */ + @NativeType("void") + public static int glGetSynci(@NativeType("GLsync") long sync, @NativeType("GLenum") int pname, @Nullable @NativeType("GLsizei *") IntBuffer length) { + return GL32C.glGetSynci(sync, pname, length); + } + + /** Array version of: {@link #glGetInteger64v GetInteger64v} */ + public static void glGetInteger64v(@NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + GL32C.glGetInteger64v(pname, params); + } + + /** Array version of: {@link #glGetSynciv GetSynciv} */ + public static void glGetSynciv(@NativeType("GLsync") long sync, @NativeType("GLenum") int pname, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] values) { + GL32C.glGetSynciv(sync, pname, length, values); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTessellationShader.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTessellationShader.java new file mode 100644 index 000000000..86a509901 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTessellationShader.java @@ -0,0 +1,151 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_tessellation_shader extension. + * + *

    This extension introduces new tessellation stages and two new shader types to the OpenGL primitive processing pipeline. These pipeline stages operate on + * a new basic primitive type, called a patch. A patch consists of a fixed-size collection of vertices, each with per-vertex attributes, plus a number of + * associated per-patch attributes. Tessellation control shaders transform an input patch specified by the application, computing per-vertex and per-patch + * attributes for a new output patch. A fixed-function tessellation primitive generator subdivides the patch, and tessellation evaluation shaders are used + * to compute the position and attributes of each vertex produced by the tessellator.

    + * + *

    When tessellation is active, it begins by running the optional tessellation control shader. This shader consumes an input patch and produces a new + * fixed-size output patch. The output patch consists of an array of vertices, and a set of per-patch attributes. The per-patch attributes include + * tessellation levels that control how finely the patch will be tessellated. For each patch processed, multiple tessellation control shader invocations + * are performed -- one per output patch vertex. Each tessellation control shader invocation writes all the attributes of its corresponding output patch + * vertex. A tessellation control shader may also read the per-vertex outputs of other tessellation control shader invocations, as well as read and write + * shared per-patch outputs. The tessellation control shader invocations for a single patch effectively run as a group. A built-in {@code barrier()} + * function is provided to allow synchronization points where no shader invocation will continue until all shader invocations have reached the barrier.

    + * + *

    The tessellation primitive generator then decomposes a patch into a new set of primitives using the tessellation levels to determine how finely + * tessellated the output should be. The primitive generator begins with either a triangle or a quad, and splits each outer edge of the primitive into a + * number of segments approximately equal to the corresponding element of the outer tessellation level array. The interior of the primitive is tessellated + * according to elements of the inner tessellation level array. The primitive generator has three modes: "triangles" and "quads" split a triangular or + * quad-shaped patch into a set of triangles that cover the original patch; "isolines" splits a quad-shaped patch into a set of line strips running across + * the patch horizontally. Each vertex generated by the tessellation primitive generator is assigned a (u,v) or (u,v,w) coordinate indicating its relative + * location in the subdivided triangle or quad.

    + * + *

    For each vertex produced by the tessellation primitive generator, the tessellation evaluation shader is run to compute its position and other attributes + * of the vertex, using its (u,v) or (u,v,w) coordinate. When computing final vertex attributes, the tessellation evaluation shader can also read the + * attributes of any of the vertices of the patch written by the tessellation control shader. Tessellation evaluation shader invocations are completely + * independent, although all invocations for a single patch share the same collection of input vertices and per-patch attributes.

    + * + *

    The tessellator operates on vertices after they have been transformed by a vertex shader. The primitives generated by the tessellator are passed further + * down the OpenGL pipeline, where they can be used as inputs to geometry shaders, transform feedback, and the rasterizer.

    + * + *

    The tessellation control and evaluation shaders are both optional. If neither shader type is present, the tessellation stage has no effect. If no + * tessellation control shader is present, the input patch provided by the application is passed directly to the tessellation primitive generator, and a + * set of default tessellation level parameters is used to control primitive generation. In this extension, patches may not be passed beyond the + * tessellation evaluation shader, and an error is generated if an application provides patches and the current program object contains no tessellation + * evaluation shader.

    + * + *

    Requires {@link GL32 GL32} and GLSL 1.50. Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ +public class ARBTessellationShader { + + static { GL.initialize(); } + + /** Accepted by the {@code mode} parameter of Begin and all vertex array functions that implicitly call Begin. */ + public static final int GL_PATCHES = 0xE; + + /** Accepted by the {@code pname} parameter of PatchParameteri, GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v. */ + public static final int GL_PATCH_VERTICES = 0x8E72; + + /** Accepted by the {@code pname} parameter of PatchParameterfv, GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv, and GetInteger64v. */ + public static final int + GL_PATCH_DEFAULT_INNER_LEVEL = 0x8E73, + GL_PATCH_DEFAULT_OUTER_LEVEL = 0x8E74; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int + GL_TESS_CONTROL_OUTPUT_VERTICES = 0x8E75, + GL_TESS_GEN_MODE = 0x8E76, + GL_TESS_GEN_SPACING = 0x8E77, + GL_TESS_GEN_VERTEX_ORDER = 0x8E78, + GL_TESS_GEN_POINT_MODE = 0x8E79; + + /** Returned by GetProgramiv when {@code pname} is TESS_GEN_MODE. */ + public static final int GL_ISOLINES = 0x8E7A; + + /** Returned by GetProgramiv when {@code pname} is TESS_GEN_SPACING. */ + public static final int + GL_FRACTIONAL_ODD = 0x8E7B, + GL_FRACTIONAL_EVEN = 0x8E7C; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v. */ + public static final int + GL_MAX_PATCH_VERTICES = 0x8E7D, + GL_MAX_TESS_GEN_LEVEL = 0x8E7E, + GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E7F, + GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E80, + GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS = 0x8E81, + GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS = 0x8E82, + GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS = 0x8E83, + GL_MAX_TESS_PATCH_COMPONENTS = 0x8E84, + GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS = 0x8E85, + GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS = 0x8E86, + GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS = 0x8E89, + GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS = 0x8E8A, + GL_MAX_TESS_CONTROL_INPUT_COMPONENTS = 0x886C, + GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS = 0x886D, + GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E1E, + GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E1F; + + /** Accepted by the {@code pname} parameter of GetActiveUniformBlockiv. */ + public static final int + GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER = 0x84F0, + GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x84F1; + + /** Accepted by the {@code type} parameter of CreateShader and returned by the {@code params} parameter of GetShaderiv. */ + public static final int + GL_TESS_EVALUATION_SHADER = 0x8E87, + GL_TESS_CONTROL_SHADER = 0x8E88; + + protected ARBTessellationShader() { + throw new UnsupportedOperationException(); + } + + // --- [ glPatchParameteri ] --- + + /** + * Specifies the integer value of the specified parameter for patch primitives. + * + * @param pname the name of the parameter to set. Must be:
    {@link GL40C#GL_PATCH_VERTICES PATCH_VERTICES}
    + * @param value the new value for the parameter given by {@code pname} + */ + public static void glPatchParameteri(@NativeType("GLenum") int pname, @NativeType("GLint") int value) { + GL40C.glPatchParameteri(pname, value); + } + + // --- [ glPatchParameterfv ] --- + + /** Unsafe version of: {@link #glPatchParameterfv PatchParameterfv} */ + public static void nglPatchParameterfv(int pname, long values) { + GL40C.nglPatchParameterfv(pname, values); + } + + /** + * Specifies an array of float values for the specified parameter for patch primitives. + * + * @param pname the name of the parameter to set. One of:
    {@link GL40C#GL_PATCH_DEFAULT_OUTER_LEVEL PATCH_DEFAULT_OUTER_LEVEL}{@link GL40C#GL_PATCH_DEFAULT_INNER_LEVEL PATCH_DEFAULT_INNER_LEVEL}
    + * @param values an array containing the new values for the parameter given by {@code pname} + */ + public static void glPatchParameterfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer values) { + GL40C.glPatchParameterfv(pname, values); + } + + /** Array version of: {@link #glPatchParameterfv PatchParameterfv} */ + public static void glPatchParameterfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] values) { + GL40C.glPatchParameterfv(pname, values); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBarrier.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBarrier.java new file mode 100644 index 000000000..f35256451 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBarrier.java @@ -0,0 +1,32 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_texture_barrier extension. + * + *

    This extension relaxes the restrictions on rendering to a currently bound texture and provides a mechanism to avoid read-after-write hazards.

    + * + *

    Promoted to core in {@link GL45 OpenGL 4.5}.

    + */ +public class ARBTextureBarrier { + + static { GL.initialize(); } + + protected ARBTextureBarrier() { + throw new UnsupportedOperationException(); + } + + // --- [ glTextureBarrier ] --- + + /** Guarantees that writes have completed and caches have been invalidated before subsequent Draws are executed. */ + public static void glTextureBarrier() { + GL45C.glTextureBarrier(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBorderClamp.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBorderClamp.java new file mode 100644 index 000000000..26dc1e73d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBorderClamp.java @@ -0,0 +1,31 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_border_clamp extension. + * + *

    The base OpenGL provides clamping such that the texture coordinates are limited to exactly the range [0,1]. When a texture coordinate is clamped using + * this algorithm, the texture sampling filter straddles the edge of the texture image, taking 1/2 its sample values from within the texture image, and the + * other 1/2 from the texture border. It is sometimes desirable for a texture to be clamped to the border color, rather than to an average of the border + * and edge colors.

    + * + *

    This extension defines an additional texture clamping algorithm. {@link #GL_CLAMP_TO_BORDER_ARB CLAMP_TO_BORDER_ARB} clamps texture coordinates at all mipmap levels such that + * {@link GL11#GL_NEAREST NEAREST} and {@link GL11#GL_LINEAR LINEAR} filters return only the color of the border texels.

    + * + *

    Promoted to core in {@link GL13 OpenGL 1.3}.

    + */ +public final class ARBTextureBorderClamp { + + /** + * Accepted by the {@code param} parameter of {@link GL11C#glTexParameteri TexParameteri} and {@link GL11C#glTexParameterf TexParameterf}, and by the {@code params} parameter of {@link GL11C#glTexParameteriv TexParameteriv} + * and {@link GL11C#glTexParameterfv TexParameterfv}, when their {@code pname} parameter is {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}, {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}, or {@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}. + */ + public static final int GL_CLAMP_TO_BORDER_ARB = 0x812D; + + private ARBTextureBorderClamp() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBufferObject.java new file mode 100644 index 000000000..c04f0fa22 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBufferObject.java @@ -0,0 +1,86 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_texture_buffer_object extension. + * + *

    This extension provides a new texture type, called a buffer texture. Buffer textures are one-dimensional arrays of texels whose storage comes from an + * attached buffer object. When a buffer object is bound to a buffer texture, a format is specified, and the data in the buffer object is treated as an + * array of texels of the specified format.

    + * + *

    The use of a buffer object to provide storage allows the texture data to be specified in a number of different ways: via buffer object loads + * ({@link GL15C#glBufferData BufferData}), direct CPU writes ({@link GL15C#glMapBuffer MapBuffer}), framebuffer readbacks (EXT_pixel_buffer_object extension). A buffer object can also be loaded + * by transform feedback (NV_transform_feedback extension), which captures selected transformed attributes of vertices processed by the GL. Several of + * these mechanisms do not require an extra data copy, which would be required when using conventional TexImage-like entry points.

    + * + *

    Buffer textures do not support mipmapping, texture lookups with normalized floating-point texture coordinates, and texture filtering of any sort, and + * may not be used in fixed-function fragment processing. They can be accessed via single texel fetch operations in programmable shaders. For assembly + * shaders (NV_gpu_program4), the TXF instruction is used. For GLSL (EXT_gpu_shader4), a new sampler type and texel fetch function are used.

    + * + *

    While buffer textures can be substantially larger than equivalent one-dimensional textures; the maximum texture size supported for buffer textures in + * the initial implementation of this extension is 2^27 texels, versus 2^13 (8192) texels for otherwise equivalent one-dimensional textures. When a buffer + * object is attached to a buffer texture, a size is not specified; rather, the number of texels in the texture is taken by dividing the size of the buffer + * object by the size of each texel.

    + * + *

    Requires {@link GL20 OpenGL 2.0} and NV_gpu_program4 or {@link EXTGPUShader4 EXT_gpu_shader4}. Promoted to core in {@link GL31 OpenGL 3.1}.

    + */ +public class ARBTextureBufferObject { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameter of BindBuffer, BufferData, BufferSubData, MapBuffer, MapBufferRangeARB, BindTexture, UnmapBuffer, + * GetBufferSubData, GetBufferParameteriv, GetBufferPointerv, and TexBufferARB, and the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, and + * GetIntegerv. + */ + public static final int GL_TEXTURE_BUFFER_ARB = 0x8C2A; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv. */ + public static final int + GL_MAX_TEXTURE_BUFFER_SIZE_ARB = 0x8C2B, + GL_TEXTURE_BINDING_BUFFER_ARB = 0x8C2C, + GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB = 0x8C2D, + GL_TEXTURE_BUFFER_FORMAT_ARB = 0x8C2E; + + protected ARBTextureBufferObject() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexBufferARB ] --- + + /** + * Attaches the storage for the buffer object named {@code buffer} to the active buffer texture, and specifies an internal format for the texel array found + * in the attached buffer object. If {@code buffer} is zero, any buffer object attached to the buffer texture is detached, and no new buffer object is + * attached. If {@code buffer} is non-zero, but is not the name of an existing buffer object, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. + * + *

    When a buffer object is attached to a buffer texture, the buffer object's data store is taken as the texture's texel array. The number of texels in the + * buffer texture's texel array is given by

    + * + *

    {@code floor(buffer_size / (components * sizeof(base_type))},

    + * + *

    where {@code buffer_size} is the size of the buffer object, in basic machine units and {@code components} and {@code base_type} are the element count + * and base data type for elements. The number of texels in the texel array is then clamped to the implementation-dependent limit + * {@link #GL_MAX_TEXTURE_BUFFER_SIZE_ARB MAX_TEXTURE_BUFFER_SIZE_ARB}. When a buffer texture is accessed in a shader, the results of a texel fetch are undefined if the specified texel number is + * greater than or equal to the clamped number of texels in the texel array.

    + * + *

    When a buffer texture is accessed in a shader, an integer is provided to indicate the texel number being accessed. If no buffer object is bound to the + * buffer texture, the results of the texel access are undefined. Otherwise, the attached buffer object's data store is interpreted as an array of elements + * of the GL data type corresponding to {@code internalformat}. Each texel consists of one to four elements that are mapped to texture components + * (R, G, B, A, L, and I). Element {@code m} of the texel numbered {@code n} is taken from element {@code n} * {@code components} + {@code m} of the + * attached buffer object's data store. Elements and texels are both numbered starting with zero. For texture formats with normalized components, the + * extracted values are converted to floating-point values. The components of the texture are then converted to an (R,G,B,A) vector, and returned to the + * shader as a four-component result vector with components of the appropriate data type for the texture's internal format.

    + * + * @param target the target of the operation. Must be:
    {@link #GL_TEXTURE_BUFFER_ARB TEXTURE_BUFFER_ARB}
    + * @param internalformat the sized internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + */ + public static native void glTexBufferARB(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBufferRange.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBufferRange.java new file mode 100644 index 000000000..36e4d301d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureBufferRange.java @@ -0,0 +1,65 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_texture_buffer_range extension. + * + *

    {@link ARBTextureBufferObject ARB_texture_buffer_object} (which was promoted to core in OpenGL 3.1) introduced the ability to attach the data store of a buffer object to a buffer + * texture and access it from shaders. The extension only allows the entire store of the buffer object to the texture. This extension expands on this and + * allows a sub-range of the buffer's data store to be attached to a texture. This can be used, for example, to allow multiple buffer textures to be backed + * by independent sub-ranges of the same buffer object, or for different sub-ranges of a single buffer object to be used for different purposes.

    + * + *

    Requires {@link GL15 OpenGL 1.5}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBTextureBufferRange { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_BUFFER_OFFSET = 0x919D, + GL_TEXTURE_BUFFER_SIZE = 0x919E; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT = 0x919F; + + protected ARBTextureBufferRange() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexBufferRange ] --- + + /** + * Binds a range of a buffer's data store to a buffer texture. + * + * @param target the target of the operation. Must be:
    {@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    + * @param internalformat the internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + * @param offset the offset of the start of the range of the buffer's data store to attach + * @param size the size of the range of the buffer's data store to attach + */ + public static void glTexBufferRange(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size) { + GL43C.glTexBufferRange(target, internalformat, buffer, offset, size); + } + + // --- [ glTextureBufferRangeEXT ] --- + + /** + * DSA version of {@link #glTexBufferRange TexBufferRange}. + * + * @param texture the texture object + * @param target the target of the operation. Must be:
    {@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    + * @param internalformat the internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + * @param offset the offset of the start of the range of the buffer's data store to attach + * @param size the size of the range of the buffer's data store to attach + */ + public static native void glTextureBufferRangeEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompression.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompression.java new file mode 100644 index 000000000..6b62731ad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompression.java @@ -0,0 +1,345 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_texture_compression extension. + * + *

    Compressing texture images can reduce texture memory utilization and improve performance when rendering textured primitives. This extension allows + * OpenGL applications to use compressed texture images by providing:

    + * + *
      + *
    1. A framework upon which extensions providing specific compressed image formats can be built.
    2. + *
    3. A set of generic compressed internal formats that allow applications to specify that texture images should be stored in compressed form without + * needing to code for specific compression formats.
    4. + *
    + * + *

    An application can define compressed texture images by providing a texture image stored in a specific compressed image format. This extension does not + * define any specific compressed image formats, but it does provide the mechanisms necessary to enable other extensions that do.

    + * + *

    An application can also define compressed texture images by providing an uncompressed texture image but specifying a compressed internal format. In this + * case, the GL will automatically compress the texture image using the appropriate image format. Compressed internal formats can either be specific (as + * above) or generic. Generic compressed internal formats are not actual image formats, but are instead mapped into one of the specific compressed formats + * provided by the GL (or to an uncompressed base internal format if no appropriate compressed format is available). Generic compressed internal formats + * allow applications to use texture compression without needing to code to any particular compression algorithm. Generic compressed formats allow the use + * of texture compression across a wide range of platforms with differing compression algorithms and also allow future GL implementations to substitute + * improved compression methods transparently.

    + * + *

    Promoted to core in {@link GL13 OpenGL 1.3}.

    + */ +public class ARBTextureCompression { + + static { GL.initialize(); } + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, and CopyTexImage2D. */ + public static final int + GL_COMPRESSED_ALPHA_ARB = 0x84E9, + GL_COMPRESSED_LUMINANCE_ARB = 0x84EA, + GL_COMPRESSED_LUMINANCE_ALPHA_ARB = 0x84EB, + GL_COMPRESSED_INTENSITY_ARB = 0x84EC, + GL_COMPRESSED_RGB_ARB = 0x84ED, + GL_COMPRESSED_RGBA_ARB = 0x84EE; + + /** Accepted by the {@code target} parameter of Hint and the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int GL_TEXTURE_COMPRESSION_HINT_ARB = 0x84EF; + + /** Accepted by the {@code value} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB = 0x86A0, + GL_TEXTURE_COMPRESSED_ARB = 0x86A1; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int + GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB = 0x86A2, + GL_COMPRESSED_TEXTURE_FORMATS_ARB = 0x86A3; + + protected ARBTextureCompression() { + throw new UnsupportedOperationException(); + } + + // --- [ glCompressedTexImage3DARB ] --- + + /** + * Unsafe version of: {@link #glCompressedTexImage3DARB CompressedTexImage3DARB} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexImage3DARB(int target, int level, int internalformat, int width, int height, int depth, int border, int imageSize, long data); + + /** + * Specifies a three-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param depth the depth of the texture image + * @param border must be 0 + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexImage3DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, imageSize, data); + } + + /** + * Specifies a three-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param depth the depth of the texture image + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexImage3DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void const *") ByteBuffer data) { + nglCompressedTexImage3DARB(target, level, internalformat, width, height, depth, 0, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedTexImage2DARB ] --- + + /** + * Unsafe version of: {@link #glCompressedTexImage2DARB CompressedTexImage2DARB} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexImage2DARB(int target, int level, int internalformat, int width, int height, int border, int imageSize, long data); + + /** + * Specifies a two-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param border must be 0 + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexImage2DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, data); + } + + /** + * Specifies a two-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexImage2DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("void const *") ByteBuffer data) { + nglCompressedTexImage2DARB(target, level, internalformat, width, height, 0, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedTexImage1DARB ] --- + + /** + * Unsafe version of: {@link #glCompressedTexImage1DARB CompressedTexImage1DARB} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexImage1DARB(int target, int level, int internalformat, int width, int border, int imageSize, long data); + + /** + * Specifies a one-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param border must be 0 + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexImage1DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexImage1DARB(target, level, internalformat, width, border, imageSize, data); + } + + /** + * Specifies a one-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexImage1DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("void const *") ByteBuffer data) { + nglCompressedTexImage1DARB(target, level, internalformat, width, 0, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedTexSubImage3DARB ] --- + + /** + * Unsafe version of: {@link #glCompressedTexSubImage3DARB CompressedTexSubImage3DARB} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexSubImage3DARB(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, long data); + + /** + * Respecifies only a cubic subregion of an existing 3D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexSubImage3DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } + + /** + * Respecifies only a cubic subregion of an existing 3D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexSubImage3DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedTexSubImage2DARB ] --- + + /** + * Unsafe version of: {@link #glCompressedTexSubImage2DARB CompressedTexSubImage2DARB} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexSubImage2DARB(int target, int level, int xoffset, int yoffset, int width, int height, int format, int imageSize, long data); + + /** + * Respecifies only a rectangular subregion of an existing 2D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexSubImage2DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data); + } + + /** + * Respecifies only a rectangular subregion of an existing 2D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexSubImage2DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedTexSubImage1DARB ] --- + + /** + * Unsafe version of: {@link #glCompressedTexSubImage1DARB CompressedTexSubImage1DARB} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexSubImage1DARB(int target, int level, int xoffset, int width, int format, int imageSize, long data); + + /** + * Respecifies only a subregion of an existing 1D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. Must be:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexSubImage1DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexSubImage1DARB(target, level, xoffset, width, format, imageSize, data); + } + + /** + * Respecifies only a subregion of an existing 1D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. Must be:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + */ + public static void glCompressedTexSubImage1DARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTexSubImage1DARB(target, level, xoffset, width, format, data.remaining(), memAddress(data)); + } + + // --- [ glGetCompressedTexImageARB ] --- + + /** Unsafe version of: {@link #glGetCompressedTexImageARB GetCompressedTexImageARB} */ + public static native void nglGetCompressedTexImageARB(int target, int level, long pixels); + + /** + * Returns a compressed texture image. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param pixels a buffer in which to return the compressed texture image + */ + public static void glGetCompressedTexImageARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") ByteBuffer pixels) { + if (CHECKS) { + if (DEBUG) { + check(pixels, GL11.glGetTexLevelParameteri(target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB)); + } + } + nglGetCompressedTexImageARB(target, level, memAddress(pixels)); + } + + /** + * Returns a compressed texture image. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param pixels a buffer in which to return the compressed texture image + */ + public static void glGetCompressedTexImageARB(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") long pixels) { + nglGetCompressedTexImageARB(target, level, pixels); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompressionBPTC.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompressionBPTC.java new file mode 100644 index 000000000..852bddf90 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompressionBPTC.java @@ -0,0 +1,36 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_compression_bptc extension. + * + *

    This extension provides additional texture compression functionality specific to the BPTC and BPTC_FLOAT compressed texture formats (called BC7 and BC6H + * respectively in Microsoft's DirectX API), subject to all the requirements and limitations described by the extension {@link ARBTextureCompression ARB_texture_compression}.

    + * + *

    Traditional block compression methods as typified by s3tc and latc compress a block of pixels into indicies along a gradient. This works well for smooth + * images, but can have quality issues along sharp edges and strong chrominance transitions. To improve quality in these problematic cases, the BPTC + * formats can divide each block into multiple partitions, each of which are compressed using an independent gradient.

    + * + *

    In addition, it is desirable to directly support high dynamic range imagery in compressed formats, which is accomplished by the BPTC_FLOAT formats.

    + * + *

    Requires {@link GL31 OpenGL 3.1} and {@link ARBTextureCompression ARB_texture_compression}.

    + */ +public final class ARBTextureCompressionBPTC { + + /** + * Accepted by the {@code internalformat} parameter of TexImage2D, TexImage3D, CopyTexImage2D, CopyTexImage3D, CompressedTexImage2DARB, and + * CompressedTexImage3DARB and the {@code format} parameter of CompressedTexSubImage2DARB and CompressedTexSubImage3DARB. + */ + public static final int + GL_COMPRESSED_RGBA_BPTC_UNORM_ARB = 0x8E8C, + GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB = 0x8E8D, + GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB = 0x8E8E, + GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB = 0x8E8F; + + private ARBTextureCompressionBPTC() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompressionRGTC.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompressionRGTC.java new file mode 100644 index 000000000..4fd35af49 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCompressionRGTC.java @@ -0,0 +1,39 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_compression_rgtc extension. + * + *

    This extension introduces four new block-based texture compression formats suited for unsigned and signed red and red-green textures (hence the name + * "rgtc" for Red-Green Texture Compression).

    + * + *

    These formats are designed to reduce the storage requirements and memory bandwidth required for red and red-green textures by a factor of 2-to-1 over + * conventional uncompressed luminance and luminance-alpha textures with 8-bit components ({@link GL11#GL_LUMINANCE8 LUMINANCE8} and {@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}).

    + * + *

    The compressed signed red-green format is reasonably suited for storing compressed normal maps.

    + * + *

    This extension uses the same compression format as the {@link EXTTextureCompressionLATC EXT_texture_compression_latc} extension except the color data is stored in the red and + * green components rather than luminance and alpha. Representing compressed red and green components is consistent with the BC4 and BC5 compressed + * formats supported by DirectX 10.

    + * + *

    Requires {@link GL13 OpenGL 1.3} or {@link ARBTextureCompression ARB_texture_compression}. Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public final class ARBTextureCompressionRGTC { + + /** + * Accepted by the {@code internalformat} parameter of TexImage2D, CopyTexImage2D, and CompressedTexImage2D and the {@code format} parameter of + * CompressedTexSubImage2D. + */ + public static final int + GL_COMPRESSED_RED_RGTC1 = 0x8DBB, + GL_COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC, + GL_COMPRESSED_RG_RGTC2 = 0x8DBD, + GL_COMPRESSED_SIGNED_RG_RGTC2 = 0x8DBE; + + private ARBTextureCompressionRGTC() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCubeMap.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCubeMap.java new file mode 100644 index 000000000..eee24f35c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCubeMap.java @@ -0,0 +1,68 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_cube_map extension. + * + *

    This extension provides a new texture generation scheme for cube map textures. Instead of the current texture providing a 1D, 2D, or 3D lookup into a + * 1D, 2D, or 3D texture image, the texture is a set of six 2D images representing the faces of a cube. The (s,t,r) texture coordinates are treated as a + * direction vector emanating from the center of a cube. At texture generation time, the interpolated per-fragment (s,t,r) selects one cube face 2D image + * based on the largest magnitude coordinate (the major axis). A new 2D (s,t) is calculated by dividing the two other coordinates (the minor axes values) + * by the major axis value. Then the new (s,t) is used to lookup into the selected 2D texture image face of the cube map.

    + * + *

    Unlike a standard 1D, 2D, or 3D texture that have just one target, a cube map texture has six targets, one for each of its six 2D texture image cube + * faces. All these targets must be consistent, complete, and have equal width and height (ie, square dimensions).

    + * + *

    This extension also provides two new texture coordinate generation modes for use in conjunction with cube map texturing. The reflection map mode + * generates texture coordinates (s,t,r) matching the vertex's eye-space reflection vector. The reflection map mode is useful for environment mapping + * without the singularity inherent in sphere mapping. The normal map mode generates texture coordinates (s,t,r) matching the vertex's transformed + * eye-space normal. The normal map mode is useful for sophisticated cube map texturing-based diffuse lighting models.

    + * + *

    The intent of the new texgen functionality is that an application using cube map texturing can use the new texgen modes to automatically generate the + * reflection or normal vectors used to look up into the cube map texture.

    + * + *

    Promoted to core in {@link GL13 OpenGL 1.3}.

    + */ +public final class ARBTextureCubeMap { + + /** Accepted by the {@code param} parameters of TexGend, TexGenf, and TexGeni when {@code pname} parameter is TEXTURE_GEN_MODE. */ + public static final int + GL_NORMAL_MAP_ARB = 0x8511, + GL_REFLECTION_MAP_ARB = 0x8512; + + /** + * When the {@code pname} parameter of TexGendv, TexGenfv, and TexGeniv is TEXTURE_GEN_MODE, then the array {@code params} may also contain NORMAL_MAP_ARB + * or REFLECTION_MAP_ARB. Accepted by the {@code cap} parameter of Enable, Disable, IsEnabled, and by the {@code pname} parameter of GetBooleanv, + * GetIntegerv, GetFloatv, and GetDoublev, and by the {@code target} parameter of BindTexture, GetTexParameterfv, GetTexParameteriv, TexParameterf, + * TexParameteri, TexParameterfv, and TexParameteriv. + */ + public static final int GL_TEXTURE_CUBE_MAP_ARB = 0x8513; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_TEXTURE_BINDING_CUBE_MAP_ARB = 0x8514; + + /** + * Accepted by the {@code target} parameter of GetTexImage, GetTexLevelParameteriv, GetTexLevelParameterfv, TexImage2D, CopyTexImage2D, TexSubImage2D, and + * CopySubTexImage2D. + */ + public static final int + GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = 0x8515, + GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = 0x8516, + GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = 0x8517, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = 0x8518, + GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = 0x8519, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = 0x851A; + + /** Accepted by the {@code target} parameter of GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv, and TexImage2D. */ + public static final int GL_PROXY_TEXTURE_CUBE_MAP_ARB = 0x851B; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB = 0x851C; + + private ARBTextureCubeMap() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCubeMapArray.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCubeMapArray.java new file mode 100644 index 000000000..b26a3f168 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureCubeMapArray.java @@ -0,0 +1,48 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_cube_map_array extension. + * + *

    The {@link EXTTextureArray EXT_texture_array} extension, and subsequently OpenGL 3.0 have introduced the concept of one- and two-dimensional array textures. An array + * texture is an ordered set of images with the same size and format. Each image in an array texture has a unique level. This extension expands texture + * array support to include cube map textures.

    + * + *

    A cube map array texture is a 2-dimensional array texture that may contain many cube map layers. Each cube map layer is a unique cube map image set. + * Images in a cube map array have the same size and format limitations as one- and two-dimensional array textures. A cube map array texture is specified + * using {@link GL12C#glTexImage3D TexImage3D} in a similar manner to two-dimensional arrays. Cube map array textures can be bound to a render targets of a frame buffer object + * as two-dimensional arrays are using FramebufferTextureLayer.

    + * + *

    When accessed by a programmable shader, a cube map array texture acts as a single unit. The "s", "t", "r" texture coordinates are treated as a regular + * cube map texture fetch. The "q" texture is treated as an unnormalized floating-point value identifying the layer of the cube map array texture. Cube map + * array texture lookups do not filter between layers.

    + * + *

    This extension does not provide for the use of cube map array textures with fixed-function fragment processing.

    + * + *

    Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ +public final class ARBTextureCubeMapArray { + + /** Accepted by the {@code target} parameter of TexParameteri, TexParameteriv, TexParameterf, TexParameterfv, BindTexture, and GenerateMipmap. */ + public static final int GL_TEXTURE_CUBE_MAP_ARRAY_ARB = 0x9009; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv and GetFloatv. */ + public static final int GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB = 0x900A; + + /** Accepted by the {@code target} parameter of TexImage3D, TexSubImage3D, CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D. */ + public static final int GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB = 0x900B; + + /** TEXTURE_CUBE_MAP_ARRAY_ARB Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900C, + GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB = 0x900D, + GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900E, + GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900F; + + private ARBTextureCubeMapArray() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureEnvCombine.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureEnvCombine.java new file mode 100644 index 000000000..c9f8e4fd9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureEnvCombine.java @@ -0,0 +1,58 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_env_combine extension. + * + *

    New texture environment function COMBINE_ARB allows programmable texture combiner operations.

    + * + *

    Requires {@link ARBMultitexture ARB_multitexture}. Promoted to core in {@link GL13 OpenGL 1.3}.

    + */ +public final class ARBTextureEnvCombine { + + /** Accepted by the {@code params} parameter of TexEnvf, TexEnvi, TexEnvfv, and TexEnviv when the {@code pname} parameter value is TEXTURE_ENV_MODE. */ + public static final int GL_COMBINE_ARB = 0x8570; + + /** Accepted by the {@code pname} parameter of TexEnvf, TexEnvi, TexEnvfv, and TexEnviv when the {@code target} parameter value is TEXTURE_ENV. */ + public static final int + GL_COMBINE_RGB_ARB = 0x8571, + GL_COMBINE_ALPHA_ARB = 0x8572, + GL_SOURCE0_RGB_ARB = 0x8580, + GL_SOURCE1_RGB_ARB = 0x8581, + GL_SOURCE2_RGB_ARB = 0x8582, + GL_SOURCE0_ALPHA_ARB = 0x8588, + GL_SOURCE1_ALPHA_ARB = 0x8589, + GL_SOURCE2_ALPHA_ARB = 0x858A, + GL_OPERAND0_RGB_ARB = 0x8590, + GL_OPERAND1_RGB_ARB = 0x8591, + GL_OPERAND2_RGB_ARB = 0x8592, + GL_OPERAND0_ALPHA_ARB = 0x8598, + GL_OPERAND1_ALPHA_ARB = 0x8599, + GL_OPERAND2_ALPHA_ARB = 0x859A, + GL_RGB_SCALE_ARB = 0x8573; + + /** + * Accepted by the {@code params} parameter of TexEnvf, TexEnvi, TexEnvfv, and TexEnviv when the {@code pname} parameter value is COMBINE_RGB_ARB or + * COMBINE_ALPHA_ARB. + */ + public static final int + GL_ADD_SIGNED_ARB = 0x8574, + GL_INTERPOLATE_ARB = 0x8575, + GL_SUBTRACT_ARB = 0x84E7; + + /** + * Accepted by the {@code params} parameter of TexEnvf, TexEnvi, TexEnvfv, and TexEnviv when the {@code pname} parameter value is SOURCE0_RGB_ARB, + * SOURCE1_RGB_ARB, SOURCE2_RGB_ARB, SOURCE0_ALPHA_ARB, SOURCE1_ALPHA_ARB, or SOURCE2_ALPHA_ARB. + */ + public static final int + GL_CONSTANT_ARB = 0x8576, + GL_PRIMARY_COLOR_ARB = 0x8577, + GL_PREVIOUS_ARB = 0x8578; + + private ARBTextureEnvCombine() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureEnvDot3.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureEnvDot3.java new file mode 100644 index 000000000..d00c6a33e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureEnvDot3.java @@ -0,0 +1,24 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_env_dot3 extension. + * + *

    Adds new dot product operation to the texture combiner operations.

    + * + *

    Requires {@link ARBMultitexture ARB_multitexture} and {@link ARBTextureEnvCombine ARB_texture_env_combine}. Promoted to core in {@link GL13 OpenGL 1.3}.

    + */ +public final class ARBTextureEnvDot3 { + + /** Accepted by the {@code params} parameter of TexEnvf, TexEnvi, TexEnvfv, and TexEnviv when the {@code pname} parameter value is COMBINE_RGB_ARB. */ + public static final int + GL_DOT3_RGB_ARB = 0x86AE, + GL_DOT3_RGBA_ARB = 0x86AF; + + private ARBTextureEnvDot3() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFilterAnisotropic.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFilterAnisotropic.java new file mode 100644 index 000000000..94bdc146d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFilterAnisotropic.java @@ -0,0 +1,46 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_filter_anisotropic extension. + * + *

    Texture mapping using OpenGL's existing mipmap texture filtering modes assumes that the projection of the pixel filter footprint into texture space is + * a square (ie, isotropic). In practice however, the footprint may be long and narrow (ie, anisotropic). Consequently, mipmap filtering severely blurs + * images on surfaces angled obliquely away from the viewer.

    + * + *

    Several approaches exist for improving texture sampling by accounting for the anisotropic nature of the pixel filter footprint into texture space. This + * extension provides a general mechanism for supporting anisotropic texturing filtering schemes without specifying a particular formulation of + * anisotropic filtering.

    + * + *

    The extension permits the OpenGL application to specify on a per-texture or -sampler object basis the maximum degree of anisotropy to account for in + * texture filtering.

    + * + *

    Increasing the maximum degree of anisotropy may improve texture filtering, but may also significantly reduce the implementation's texture filtering + * rate. Implementations are free to clamp the specified degree of anisotropy to the implementation's maximum supported degree of anisotropy.

    + * + *

    A sampler or texture's maximum degree of anisotropy is specified independently from its minification and magnification filter (as opposed to being + * supported as an entirely new filtering mode). Implementations are free to use the specified minification and magnification filter to select a + * particular anisotropic texture filtering scheme. For example, a NEAREST filter with a maximum degree of anisotropy of two could be treated as a 2-tap + * filter that accounts for the direction of anisotropy. Implementations are also permitted to ignore the minification or magnification filter and + * implement the highest quality of anisotropic filtering possible.

    + * + *

    Applications seeking the highest quality anisotropic filtering available are advised to request a {@link GL11#GL_LINEAR_MIPMAP_LINEAR LINEAR_MIPMAP_LINEAR} minification filter, a {@link GL11#GL_LINEAR LINEAR} + * magnification filter, and a large maximum degree of anisotropy.

    + * + *

    Requires {@link GL12 OpenGL 1.2}.

    + */ +public final class ARBTextureFilterAnisotropic { + + /** Accepted by the {@code pname} parameters of GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameterfv, TexParameteri, and TexParameteriv. */ + public static final int GL_TEXTURE_MAX_ANISOTROPY = 0x84FE; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv. */ + public static final int GL_MAX_TEXTURE_MAX_ANISOTROPY = 0x84FF; + + private ARBTextureFilterAnisotropic() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFilterMinmax.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFilterMinmax.java new file mode 100644 index 000000000..84682b912 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFilterMinmax.java @@ -0,0 +1,38 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_filter_minmax extension. + * + *

    In unextended OpenGL, minification and magnification filters such as {@link GL11#GL_LINEAR LINEAR} allow texture lookups to returned a filtered texel value produced by + * computing an weighted average of a collection of texels in the neighborhood of the texture coordinate provided.

    + * + *

    This extension provides a new texture and sampler parameter ({@link #GL_TEXTURE_REDUCTION_MODE_ARB TEXTURE_REDUCTION_MODE_ARB}) which allows applications to produce a filtered texel value + * by computing a component-wise minimum ({@link GL14#GL_MIN MIN}) or maximum ({@link GL14#GL_MAX MAX}) of the texels that would normally be averaged. The reduction mode is orthogonal + * to the minification and magnification filter parameters. The filter parameters are used to identify the set of texels used to produce a final filtered + * value; the reduction mode identifies how these texels are combined.

    + * + *

    Requires {@link GL33 OpenGL 3.3}.

    + */ +public final class ARBTextureFilterMinmax { + + /** + * Accepted by the {@code pname} parameter to SamplerParameter{i f}{v}, SamplerParameterI{u}iv, GetSamplerParameter{i f}v, GetSamplerParameterI{u}iv, + * TexParameter{i f}{v}, TexParameterI{u}iv, GetTexParameter{i f}v, GetTexParameterI{u}iv, TextureParameter{i f}{v}, TextureParameterI{u}iv, + * GetTextureParameter{i f}v, and GetTextureParameterI{u}iv. + */ + public static final int GL_TEXTURE_REDUCTION_MODE_ARB = 0x9366; + + /** + * Accepted by the {@code param} or {@code params} parameter to SamplerParameter{i f}{v}, SamplerParameterI{u}iv, TexParameter{i f}{v}, TexParameterI{u}iv, + * TextureParameter{i f}{v}, and TextureParameterI{u}iv when {@code pname} is TEXTURE_REDUCTION_MODE_ARB. + */ + public static final int GL_WEIGHTED_AVERAGE_ARB = 0x9367; + + private ARBTextureFilterMinmax() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFloat.java new file mode 100644 index 000000000..cd317dc55 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureFloat.java @@ -0,0 +1,49 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_float extension. + * + *

    This extension adds texture internal formats with 16- and 32-bit floating-point components. The 32-bit floating-point components are in the standard + * IEEE float format. The 16-bit floating-point components have 1 sign bit, 5 exponent bits, and 10 mantissa bits. Floating-point components are clamped to + * the limits of the range representable by their format.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public final class ARBTextureFloat { + + /** Accepted by the {@code value} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_RED_TYPE_ARB = 0x8C10, + GL_TEXTURE_GREEN_TYPE_ARB = 0x8C11, + GL_TEXTURE_BLUE_TYPE_ARB = 0x8C12, + GL_TEXTURE_ALPHA_TYPE_ARB = 0x8C13, + GL_TEXTURE_LUMINANCE_TYPE_ARB = 0x8C14, + GL_TEXTURE_INTENSITY_TYPE_ARB = 0x8C15, + GL_TEXTURE_DEPTH_TYPE_ARB = 0x8C16; + + /** Returned by the {@code params} parameter of GetTexLevelParameter. */ + public static final int GL_UNSIGNED_NORMALIZED_ARB = 0x8C17; + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, and TexImage3D. */ + public static final int + GL_RGBA32F_ARB = 0x8814, + GL_RGB32F_ARB = 0x8815, + GL_ALPHA32F_ARB = 0x8816, + GL_INTENSITY32F_ARB = 0x8817, + GL_LUMINANCE32F_ARB = 0x8818, + GL_LUMINANCE_ALPHA32F_ARB = 0x8819, + GL_RGBA16F_ARB = 0x881A, + GL_RGB16F_ARB = 0x881B, + GL_ALPHA16F_ARB = 0x881C, + GL_INTENSITY16F_ARB = 0x881D, + GL_LUMINANCE16F_ARB = 0x881E, + GL_LUMINANCE_ALPHA16F_ARB = 0x881F; + + private ARBTextureFloat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureGather.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureGather.java new file mode 100644 index 000000000..1188df596 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureGather.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_gather extension. + * + *

    This extension provides a new set of texture functions (textureGather) to the shading language that determine 2x2 footprint that are used for linear + * filtering in a texture lookup, and return a vector consisting of the first component from each of the four texels in the footprint.

    + * + *

    Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ +public final class ARBTextureGather { + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5E, + GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5F, + GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB = 0x8F9F; + + private ARBTextureGather() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMirrorClampToEdge.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMirrorClampToEdge.java new file mode 100644 index 000000000..ff640732c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMirrorClampToEdge.java @@ -0,0 +1,30 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_mirror_clamp_to_edge extension. + * + *

    ARB_texture_mirror_clamp_to_edge extends the set of texture wrap modes to include an additional mode ({@link #GL_MIRROR_CLAMP_TO_EDGE MIRROR_CLAMP_TO_EDGE}) that effectively uses a + * texture map twice as large as the original image in which the additional half of the new image is a mirror image of the original image.

    + * + *

    This new mode relaxes the need to generate images whose opposite edges match by using the original image to generate a matching "mirror image". This + * mode allows the texture to be mirrored only once in the negative s, t, and r directions.

    + * + *

    Requires {@link GL14 OpenGL 1.4}. Promoted to core in {@link GL44 OpenGL 4.4}.

    + */ +public final class ARBTextureMirrorClampToEdge { + + /** + * Accepted by the {@code param} parameter of TexParameter{if}, SamplerParameter{if} and SamplerParameter{if}v, and by the {@code params} parameter of + * TexParameter{if}v, TexParameterI{i ui}v and SamplerParameterI{i ui}v when their {@code pname} parameter is {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}, {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}, or + * {@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}. + */ + public static final int GL_MIRROR_CLAMP_TO_EDGE = 0x8743; + + private ARBTextureMirrorClampToEdge() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMirroredRepeat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMirroredRepeat.java new file mode 100644 index 000000000..802ec53b2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMirroredRepeat.java @@ -0,0 +1,28 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_mirrored_repeat extension. + * + *

    ARB_texture_mirrored_repeat extends the set of texture wrap modes to include a mode ({@link #GL_MIRRORED_REPEAT_ARB MIRRORED_REPEAT_ARB}) that effectively uses a texture map twice + * as large at the original image in which the additional half, for each coordinate, of the new image is a mirror image of the original image.

    + * + *

    This new mode relaxes the need to generate images whose opposite edges match by using the original image to generate a matching "mirror image".

    + * + *

    Promoted to core in {@link GL14 OpenGL 1.4}.

    + */ +public final class ARBTextureMirroredRepeat { + + /** + * Accepted by the {@code param} parameter of TexParameteri and TexParameterf, and by the {@code params} parameter of TexParameteriv and TexParameterfv, + * when their {@code pname} parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R. + */ + public static final int GL_MIRRORED_REPEAT_ARB = 0x8370; + + private ARBTextureMirroredRepeat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMultisample.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMultisample.java new file mode 100644 index 000000000..2ad80c1ca --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureMultisample.java @@ -0,0 +1,165 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_texture_multisample extension. + * + *

    This extension provides support for two new types of "multisample textures" - two-dimensional and two-dimensional array - as well as mechanisms to + * fetch a specific sample from such a texture in a shader, and to attach such textures to FBOs for rendering.

    + * + *

    This extension also includes the following functionality, first described in {@link NVExplicitMultisample NV_explicit_multisample}:

    + * + *
      + *
    • A query in the API to query the location of samples within the pixel
    • + *
    • An explicit control for the multisample sample mask to augment the control provided by SampleCoverage
    • + *
    + * + *

    Promoted to core in {@link GL32 OpenGL 3.2}.

    + */ +public class ARBTextureMultisample { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetMultisamplefv. */ + public static final int GL_SAMPLE_POSITION = 0x8E50; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_SAMPLE_MASK = 0x8E51; + + /** Accepted by the {@code target} parameter of GetBooleani_v and GetIntegeri_v. */ + public static final int GL_SAMPLE_MASK_VALUE = 0x8E52; + + /** Accepted by the {@code target} parameter of BindTexture and TexImage2DMultisample. */ + public static final int GL_TEXTURE_2D_MULTISAMPLE = 0x9100; + + /** Accepted by the {@code target} parameter of TexImage2DMultisample. */ + public static final int GL_PROXY_TEXTURE_2D_MULTISAMPLE = 0x9101; + + /** Accepted by the {@code target} parameter of BindTexture and TexImage3DMultisample. */ + public static final int GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** Accepted by the {@code target} parameter of TexImage3DMultisample. */ + public static final int GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9103; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_MAX_SAMPLE_MASK_WORDS = 0x8E59, + GL_MAX_COLOR_TEXTURE_SAMPLES = 0x910E, + GL_MAX_DEPTH_TEXTURE_SAMPLES = 0x910F, + GL_MAX_INTEGER_SAMPLES = 0x9110, + GL_TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104, + GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_SAMPLES = 0x9106, + GL_TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_2D_MULTISAMPLE = 0x9108, + GL_INT_SAMPLER_2D_MULTISAMPLE = 0x9109, + GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A, + GL_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B, + GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C, + GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D; + + protected ARBTextureMultisample() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexImage2DMultisample ] --- + + /** + * Establishes the data storage, format, dimensions, and number of samples of a 2D multisample texture's image. + * + * @param target the target of the operation. One of:
    {@link GL32C#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32C#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}
    + * @param samples the number of samples in the multisample texture's image + * @param internalformat the internal format to be used to store the multisample texture's image. {@code internalformat} must specify a color-renderable, depth-renderable, + * or stencil-renderable format. + * @param width the width of the multisample texture's image, in texels + * @param height the height of the multisample texture's image, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + */ + public static void glTexImage2DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL32C.glTexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); + } + + // --- [ glTexImage3DMultisample ] --- + + /** + * Establishes the data storage, format, dimensions, and number of samples of a 3D multisample texture's image. + * + * @param target the target of the operation. One of:
    {@link GL32C#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}{@link GL32C#GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param samples the number of samples in the multisample texture's image + * @param internalformat the internal format to be used to store the multisample texture's image. {@code internalformat} must specify a color-renderable, depth-renderable, + * or stencil-renderable format. + * @param width the width of the multisample texture's image, in texels + * @param height the height of the multisample texture's image, in texels + * @param depth the depth of the multisample texture's image, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + */ + public static void glTexImage3DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL32C.glTexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); + } + + // --- [ glGetMultisamplefv ] --- + + /** Unsafe version of: {@link #glGetMultisamplefv GetMultisamplefv} */ + public static void nglGetMultisamplefv(int pname, int index, long val) { + GL32C.nglGetMultisamplefv(pname, index, val); + } + + /** + * Retrieves the location of a sample. + * + * @param pname the sample parameter name. Must be:
    {@link GL32C#GL_SAMPLE_POSITION SAMPLE_POSITION}
    + * @param index the index of the sample whose position to query + * @param val an array to receive the position of the sample + */ + public static void glGetMultisamplefv(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer val) { + GL32C.glGetMultisamplefv(pname, index, val); + } + + /** + * Retrieves the location of a sample. + * + * @param pname the sample parameter name. Must be:
    {@link GL32C#GL_SAMPLE_POSITION SAMPLE_POSITION}
    + * @param index the index of the sample whose position to query + */ + @NativeType("void") + public static float glGetMultisamplef(@NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + return GL32C.glGetMultisamplef(pname, index); + } + + // --- [ glSampleMaski ] --- + + /** + * Sets the value of a sub-word of the sample mask. + * + * @param index which 32-bit sub-word of the sample mask to update + * @param mask the new value of the mask sub-word + */ + public static void glSampleMaski(@NativeType("GLuint") int index, @NativeType("GLbitfield") int mask) { + GL32C.glSampleMaski(index, mask); + } + + /** Array version of: {@link #glGetMultisamplefv GetMultisamplefv} */ + public static void glGetMultisamplefv(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] val) { + GL32C.glGetMultisamplefv(pname, index, val); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRG.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRG.java new file mode 100644 index 000000000..b19541ec0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRG.java @@ -0,0 +1,59 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_rg extension. + * + *

    Historically one- and two- component textures have been specified in OpenGL using the intensity, luminance or luminance-alpha (I/L/LA) formats. With the + * advent of programmable shaders and render-to-texture capabilites these legacy formats carry some historical artifacts which are no longer useful.

    + * + *

    For example, when sampling from such textures, the luminance values are replicated across the color components, and the intensity values are replicated + * across both the color and alpha components. This is no longer necessary with programmable shaders.

    + * + *

    It is also desirable to be able to render to one- and two- component format textures using capabilities such as framebuffer objects (FBO), but rendering + * to I/L/LA formats is under-specified (specifically how to map R/G/B/A values to I/L/A texture channels).

    + * + *

    This extension adds new base internal formats for the one-component {@link GL11#GL_RED RED} and two-component {@link #GL_RG RG} (red green) texture formats as well as sized + * internal formats for fixed-point, floating-point and pure integer texture formats. The new texure formats can be used for texturing as well as for + * rendering into with framebuffer objects.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public final class ARBTextureRG { + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, and CopyTexImage2D. */ + public static final int + GL_R8 = 0x8229, + GL_R16 = 0x822A, + GL_RG8 = 0x822B, + GL_RG16 = 0x822C, + GL_R16F = 0x822D, + GL_R32F = 0x822E, + GL_RG16F = 0x822F, + GL_RG32F = 0x8230, + GL_R8I = 0x8231, + GL_R8UI = 0x8232, + GL_R16I = 0x8233, + GL_R16UI = 0x8234, + GL_R32I = 0x8235, + GL_R32UI = 0x8236, + GL_RG8I = 0x8237, + GL_RG8UI = 0x8238, + GL_RG16I = 0x8239, + GL_RG16UI = 0x823A, + GL_RG32I = 0x823B, + GL_RG32UI = 0x823C, + GL_RG = 0x8227, + GL_COMPRESSED_RED = 0x8225, + GL_COMPRESSED_RG = 0x8226; + + /** Accepted by the {@code format} parameter of TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and ReadPixels. */ + public static final int GL_RG_INTEGER = 0x8228; + + private ARBTextureRG() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRGB10_A2UI.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRGB10_A2UI.java new file mode 100644 index 000000000..a25caecd7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRGB10_A2UI.java @@ -0,0 +1,28 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_rgb10_a2ui extension. + * + *

    This extension adds support for a new texturing format for unsigned 10.10.10.2 integer textures.

    + * + *

    OpenGL has supported {@link GL11#GL_RGB10 RGB10} and {@link GL11#GL_RGB10_A2 RGB10_A2} formats for a very long time. This extension provides a variant of RGB10_A2 which supports unsigned + * integer data (in contrast to the above "unsigned normalized integer" formats).

    + * + *

    Requires {@link GL30 OpenGL 3.0} or {@link EXTTextureInteger EXT_texture_integer}. Promoted to core in {@link GL33 OpenGL 3.3}.

    + */ +public final class ARBTextureRGB10_A2UI { + + /** + * Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, RenderbufferStorage and + * RenderbufferStorageMultisample. + */ + public static final int GL_RGB10_A2UI = 0x906F; + + private ARBTextureRGB10_A2UI() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRectangle.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRectangle.java new file mode 100644 index 000000000..dc8d109d1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureRectangle.java @@ -0,0 +1,61 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_rectangle extension. + * + *

    OpenGL texturing is limited to images with power-of-two dimensions and an optional 1-texel border. The ARB_texture_rectangle extension adds a new + * texture target that supports 2D textures without requiring power-of-two dimensions.

    + * + *

    Non-power-of-two sized (NPOTS) textures are useful for storing video images that do not have power-of-two sized (POTS). Re-sampling artifacts are + * avoided and less texture memory may be required by using non-power-of-two sized textures. Non-power-of-two sized textures are also useful for shadow + * maps and window-space texturing.

    + * + *

    However, non-power-of-two sized textures have limitations that do not apply to power-of-two sized textures. NPOTS textures may not use mipmap filtering; + * POTS textures support both mipmapped and non-mipmapped filtering. NPOTS textures support only the {@link GL11#GL_CLAMP CLAMP}, {@link GL12#GL_CLAMP_TO_EDGE CLAMP_TO_EDGE}, and + * {@link GL13#GL_CLAMP_TO_BORDER CLAMP_TO_BORDER} wrap modes; POTS textures support {@link GL12#GL_CLAMP_TO_EDGE CLAMP_TO_EDGE}, {@link GL11#GL_REPEAT REPEAT}, {@link GL11#GL_CLAMP CLAMP}, {@link GL14#GL_MIRRORED_REPEAT MIRRORED_REPEAT}, and {@link GL13#GL_CLAMP_TO_BORDER CLAMP_TO_BORDER} + * (and GL_MIRROR_CLAMP_ATI and GL_MIRROR_CLAMP_TO_EDGE_ATI if ATI_texture_mirror_once is supported). NPOTS textures do not + * support an optional 1-texel border; POTS textures do support an optional 1-texel border.

    + * + *

    NPOTS textures are accessed by dimension-dependent (aka non-normalized) texture coordinates. So instead of thinking of the texture image lying in a + * [0..1]x[0..1] range, the NPOTS texture image lies in a [0..w]x[0..h] range.

    + * + *

    This extension adds a new texture target and related state (proxy, binding, max texture size).

    + */ +public final class ARBTextureRectangle { + + /** + * Accepted by the {@code cap} parameter of Enable, Disable and IsEnabled; by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and + * GetDoublev; and by the {@code target} parameter of BindTexture, GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameteri, TexParameterfv and + * TexParameteriv. + */ + public static final int GL_TEXTURE_RECTANGLE_ARB = 0x84F5; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and GetDoublev. */ + public static final int GL_TEXTURE_BINDING_RECTANGLE_ARB = 0x84F6; + + /** Accepted by the {@code target} parameter of GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv and TexImage2D. */ + public static final int GL_PROXY_TEXTURE_RECTANGLE_ARB = 0x84F7; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv and GetFloatv. */ + public static final int GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB = 0x84F8; + + /** + * TEXTURE_RECTANGLE_ARB Returned by {@code type} parameter of GetActiveUniform when the location {@code index} for program object {@code program} is of + * type sampler2DRect. + */ + public static final int GL_SAMPLER_2D_RECT_ARB = 0x8B63; + + /** + * Returned by {@code type} parameter of GetActiveUniform when the location {@code index} for program object {@code program} is of type + * sampler2DRectShadow. + */ + public static final int GL_SAMPLER_2D_RECT_SHADOW_ARB = 0x8B64; + + private ARBTextureRectangle() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureStorage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureStorage.java new file mode 100644 index 000000000..eb987c89c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureStorage.java @@ -0,0 +1,126 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_texture_storage extension. + * + *

    The texture image specification commands in OpenGL allow each level to be separately specified with different sizes, formats, types and so on, and only + * imposes consistency checks at draw time. This adds overhead for implementations.

    + * + *

    This extension provides a mechanism for specifying the entire structure of a texture in a single call, allowing certain consistency checks and memory + * allocations to be done up front. Once specified, the format and dimensions of the image array become immutable, to simplify completeness checks in the + * implementation.

    + * + *

    When using this extension, it is no longer possible to supply texture data using TexImage*. Instead, data can be uploaded using TexSubImage*, or + * produced by other means (such as render-to-texture, mipmap generation, or rendering to a sibling EGLImage).

    + * + *

    This extension has complicated interactions with other extensions. The goal of most of these interactions is to ensure that a texture is always mipmap + * complete (and cube complete for cubemap textures).

    + * + *

    Requires {@link GL12 OpenGL 1.2}. Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ +public class ARBTextureStorage { + + static { GL.initialize(); } + + /** Accepted by the {@code value} parameter of GetTexParameter{if}v. */ + public static final int GL_TEXTURE_IMMUTABLE_FORMAT = 0x912F; + + protected ARBTextureStorage() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexStorage1D ] --- + + /** + * Simultaneously specifies storage for all levels of a one-dimensional texture. + * + * @param target the target of the operation. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + */ + public static void glTexStorage1D(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width) { + GL42C.glTexStorage1D(target, levels, internalformat, width); + } + + // --- [ glTexStorage2D ] --- + + /** + * Simultaneously specifies storage for all levels of a two-dimensional or one-dimensional array texture. + * + * @param target the target of the operation. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + */ + public static void glTexStorage2D(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL42C.glTexStorage2D(target, levels, internalformat, width, height); + } + + // --- [ glTexStorage3D ] --- + + /** + * Simultaneously specifies storage for all levels of a three-dimensional, two-dimensional array or cube-map array texture. + * + * @param target the target of the operation. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + */ + public static void glTexStorage3D(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth) { + GL42C.glTexStorage3D(target, levels, internalformat, width, height, depth); + } + + // --- [ glTextureStorage1DEXT ] --- + + /** + * DSA version of {@link #glTexStorage1D TexStorage1D}. + * + * @param texture the texture object to update + * @param target the target of the operation. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + */ + public static native void glTextureStorage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width); + + // --- [ glTextureStorage2DEXT ] --- + + /** + * DSA version of {@link #glTexStorage2D TexStorage2D}. + * + * @param texture the texture object to update + * @param target the target of the operation. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + */ + public static native void glTextureStorage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glTextureStorage3DEXT ] --- + + /** + * DSA version of {@link #glTexStorage3D TexStorage3D}. + * + * @param texture the texture object to update + * @param target the target of the operation. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + */ + public static native void glTextureStorage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureStorageMultisample.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureStorageMultisample.java new file mode 100644 index 000000000..07d865c86 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureStorageMultisample.java @@ -0,0 +1,98 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_texture_storage_multisample extension. + * + *

    The {@link ARBTextureStorage ARB_texture_storage} extension and OpenGL 4.2 introduced the concept of immutable texture objects. With these objects, once their data store + * has been sized and allocated, it could not be resized for the lifetime of the objects (although its content could be updated). OpenGL implementations + * may be able to take advantage of the knowledge that the underlying data store of certain objects cannot be deleted or otherwise reallocated without + * destruction of the whole object (normally, a much heavier weight and less frequent operation). Immutable storage for all types of textures besides + * multisample and buffer textures was introduced by ARB_texture_storage. For completeness, this extension introduces immutable storage for multisampled + * textures.

    + * + *

    Requires {@link GL42 OpenGL 4.2} or {@link ARBTextureStorage ARB_texture_storage}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBTextureStorageMultisample { + + static { GL.initialize(); } + + protected ARBTextureStorageMultisample() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexStorage2DMultisample ] --- + + /** + * Specifies storage for a two-dimensional multisample texture. + * + * @param target the target of the operation. One of:
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}
    + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + */ + public static void glTexStorage2DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL43C.glTexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); + } + + // --- [ glTexStorage3DMultisample ] --- + + /** + * Specifies storage for a two-dimensional multisample array texture. + * + * @param target the target of the operation. One of:
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}
    + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + */ + public static void glTexStorage3DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL43C.glTexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); + } + + // --- [ glTextureStorage2DMultisampleEXT ] --- + + /** + * DSA version of {@link #glTexStorage2DMultisample TexStorage2DMultisample}. + * + * @param texture the texture object + * @param target the target of the operation. One of:
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}
    + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + */ + public static native void glTextureStorage2DMultisampleEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedsamplelocations); + + // --- [ glTextureStorage3DMultisampleEXT ] --- + + /** + * DSA version of {@link #glTexStorage3DMultisample TexStorage3DMultisample}. + * + * @param texture the texture object + * @param target the target of the operation. One of:
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}
    + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + */ + public static native void glTextureStorage3DMultisampleEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedsamplelocations); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureSwizzle.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureSwizzle.java new file mode 100644 index 000000000..8b26387a7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureSwizzle.java @@ -0,0 +1,39 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_texture_swizzle extension. + * + *

    Classic OpenGL texture formats conflate texture storage and interpretation, and assume that textures represent color. In modern applications, a + * significant quantity of textures don't represent color, but rather data like shadow maps, normal maps, page tables, occlusion data, etc. For the latter + * class of data, calling the data "RGBA" is just a convenient mapping of what the data is onto the current model, but isn't an accurate reflection of the + * reality of the data.

    + * + *

    The existing texture formats provide an almost orthogonal set of data types, sizes, and number of components, but the mappings of this storage into what + * the shader or fixed-function pipeline fetches is very much non-orthogonal. Previous extensions have added some of the most demanded missing formats, but + * the problem has not been solved once and for all.

    + * + *

    This extension provides a mechanism to swizzle the components of a texture before they are applied according to the texture environment in + * fixed-function or as they are returned to the shader.

    + * + *

    Promoted to core in {@link GL33 OpenGL 3.3}.

    + */ +public final class ARBTextureSwizzle { + + /** Accepted by the {@code pname} parameters of TexParameteri, TexParameterf, TexParameteriv, TexParameterfv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int + GL_TEXTURE_SWIZZLE_R = 0x8E42, + GL_TEXTURE_SWIZZLE_G = 0x8E43, + GL_TEXTURE_SWIZZLE_B = 0x8E44, + GL_TEXTURE_SWIZZLE_A = 0x8E45; + + /** Accepted by the {@code pname} parameters of TexParameteriv, TexParameterfv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int GL_TEXTURE_SWIZZLE_RGBA = 0x8E46; + + private ARBTextureSwizzle() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureView.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureView.java new file mode 100644 index 000000000..f385e825a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTextureView.java @@ -0,0 +1,69 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_texture_view extension. + * + *

    This extension allows a texture's data store to be "viewed" in multiple ways, either reinterpreting the data format/type as a different format/type with + * the same element size, or by clamping the mipmap level range or array slice range.

    + * + *

    The goals of this extension are to avoid having these alternate views become shared mutable containers of shared mutable objects, and to add the views + * to the API in a minimally invasive way.

    + * + *

    No new object types are added. Conceptually, a texture object is split into the following parts:

    + * + *
      + *
    • A data store holding texel data.
    • + *
    • State describing which portions of the data store to use, and how to interpret the data elements.
    • + *
    • An embedded sampler object.
    • + *
    • Various other texture parameters.
    • + *
    + * + *

    With this extension, multiple textures can share a data store and have different state describing which portions of the data store to use and how to + * interpret the data elements. The data store is refcounted and not destroyed until the last texture sharing it is deleted.

    + * + *

    This extension leverages the {@link ARBTextureStorage ARB_texture_storage} concept of an "immutable texture". Views can only be created of textures created with TexStorage.

    + * + *

    Requires {@link GL42 OpenGL 4.2} or {@link ARBTextureStorage ARB_texture_storage}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBTextureView { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameters of GetTexParameterfv and GetTexParameteriv. */ + public static final int + GL_TEXTURE_VIEW_MIN_LEVEL = 0x82DB, + GL_TEXTURE_VIEW_NUM_LEVELS = 0x82DC, + GL_TEXTURE_VIEW_MIN_LAYER = 0x82DD, + GL_TEXTURE_VIEW_NUM_LAYERS = 0x82DE, + GL_TEXTURE_IMMUTABLE_LEVELS = 0x82DF; + + protected ARBTextureView() { + throw new UnsupportedOperationException(); + } + + // --- [ glTextureView ] --- + + /** + * Initializes a texture as a data alias of another texture's data store. + * + * @param texture the texture object to be initialized as a view + * @param target the target to be used for the newly initialized texture + * @param origtexture the name of a texture object of which to make a view + * @param internalformat the internal format for the newly created view + * @param minlevel the lowest level of detail of the view + * @param numlevels the number of levels of detail to include in the view + * @param minlayer the index of the first layer to include in the view + * @param numlayers the number of layers to include in the view + */ + public static void glTextureView(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLuint") int origtexture, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int minlevel, @NativeType("GLuint") int numlevels, @NativeType("GLuint") int minlayer, @NativeType("GLuint") int numlayers) { + GL43C.glTextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTimerQuery.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTimerQuery.java new file mode 100644 index 000000000..e16103dbf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTimerQuery.java @@ -0,0 +1,148 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_timer_query extension. + * + *

    Applications can benefit from accurate timing information in a number of different ways. During application development, timing information can help + * identify application or driver bottlenecks. At run time, applications can use timing information to dynamically adjust the amount of detail in a scene + * to achieve constant frame rates. OpenGL implementations have historically provided little to no useful timing information. Applications can get some + * idea of timing by reading timers on the CPU, but these timers are not synchronized with the graphics rendering pipeline. Reading a CPU timer does not + * guarantee the completion of a potentially large amount of graphics work accumulated before the timer is read, and will thus produce wildly inaccurate + * results. {@link GL11C#glFinish Finish} can be used to determine when previous rendering commands have been completed, but will idle the graphics pipeline and adversely + * affect application performance.

    + * + *

    This extension provides a query mechanism that can be used to determine the amount of time it takes to fully complete a set of GL commands, and without + * stalling the rendering pipeline. It uses the query object mechanisms first introduced in the occlusion query extension, which allow time intervals to be + * polled asynchronously by the application.

    + * + *

    Promoted to core in {@link GL33 OpenGL 3.3}.

    + */ +public class ARBTimerQuery { + + static { GL.initialize(); } + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int GL_TIME_ELAPSED = 0x88BF; + + /** + * Accepted by the {@code target} parameter of GetQueryiv and QueryCounter. Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev. + */ + public static final int GL_TIMESTAMP = 0x8E28; + + protected ARBTimerQuery() { + throw new UnsupportedOperationException(); + } + + // --- [ glQueryCounter ] --- + + /** + * Records the GL time into a query object after all previous commands have reached the GL server but have not yet necessarily executed. + * + * @param id the name of a query object into which to record the GL time + * @param target the counter to query. Must be:
    {@link GL33C#GL_TIMESTAMP TIMESTAMP}
    + */ + public static void glQueryCounter(@NativeType("GLuint") int id, @NativeType("GLenum") int target) { + GL33C.glQueryCounter(id, target); + } + + // --- [ glGetQueryObjecti64v ] --- + + /** Unsafe version of: {@link #glGetQueryObjecti64v GetQueryObjecti64v} */ + public static void nglGetQueryObjecti64v(int id, int pname, long params) { + GL33C.nglGetQueryObjecti64v(id, pname, params); + } + + /** + * Returns the 64bit integer value of query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15#GL_QUERY_RESULT QUERY_RESULT}{@link GL15#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + */ + public static void glGetQueryObjecti64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + GL33C.glGetQueryObjecti64v(id, pname, params); + } + + /** + * Returns the 64bit integer value of query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15#GL_QUERY_RESULT QUERY_RESULT}{@link GL15#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + */ + public static void glGetQueryObjecti64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long params) { + GL33C.glGetQueryObjecti64v(id, pname, params); + } + + /** + * Returns the 64bit integer value of query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15#GL_QUERY_RESULT QUERY_RESULT}{@link GL15#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + */ + @NativeType("void") + public static long glGetQueryObjecti64(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + return GL33C.glGetQueryObjecti64(id, pname); + } + + // --- [ glGetQueryObjectui64v ] --- + + /** Unsafe version of: {@link #glGetQueryObjectui64v GetQueryObjectui64v} */ + public static void nglGetQueryObjectui64v(int id, int pname, long params) { + GL33C.nglGetQueryObjectui64v(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjecti64v GetQueryObjecti64v}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter + * @param params the requested data + */ + public static void glGetQueryObjectui64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") LongBuffer params) { + GL33C.glGetQueryObjectui64v(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjecti64v GetQueryObjecti64v}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter + * @param params the requested data + */ + public static void glGetQueryObjectui64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") long params) { + GL33C.glGetQueryObjectui64v(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjecti64v GetQueryObjecti64v}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter + */ + @NativeType("void") + public static long glGetQueryObjectui64(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + return GL33C.glGetQueryObjectui64(id, pname); + } + + /** Array version of: {@link #glGetQueryObjecti64v GetQueryObjecti64v} */ + public static void glGetQueryObjecti64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + GL33C.glGetQueryObjecti64v(id, pname, params); + } + + /** Array version of: {@link #glGetQueryObjectui64v GetQueryObjectui64v} */ + public static void glGetQueryObjectui64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") long[] params) { + GL33C.glGetQueryObjectui64v(id, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedback2.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedback2.java new file mode 100644 index 000000000..6935226ff --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedback2.java @@ -0,0 +1,176 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_transform_feedback2 extension. + * + *

    The {@link EXTTransformFeedback EXT_transform_feedback} extension allows applications to capture primitives to one or more buffer objects when transformed by the GL. This + * extension provides a few additional capabilities to these extensions, making transform feedback mode more useful.

    + * + *

    First, it provides transform feedback objects which encapsulate transform feedback-related state, allowing applications to replace the entire transform + * feedback configuration in a single bind call. Second, it provides the ability to pause and resume transform feedback operations. When transform feedback + * is paused, applications may render without transform feedback or may use transform feedback with different state and a different transform feedback + * object. When transform feedback is resumed, additional primitives are captured and appended to previously captured primitives for the object.

    + * + *

    Additionally, this extension provides the ability to draw primitives captured in transform feedback mode without querying the captured primitive count. + * The command {@link #glDrawTransformFeedback DrawTransformFeedback} is equivalent to {@code glDrawArrays(, 0, )}, where {@code count} is the number of + * vertices captured to buffer objects during the last transform feedback capture operation on the transform feedback object used. This draw operation + * only provides a vertex count -- it does not automatically set up vertex array state or vertex buffer object bindings, which must be done separately by + * the application.

    + * + *

    Requires {@link GL20 GL20} or {@link ARBShaderObjects ARB_shader_objects} and {@link NVTransformFeedback NV_transform_feedback} or {@link EXTTransformFeedback EXT_transform_feedback}. + * Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ +public class ARBTransformFeedback2 { + + static { GL.initialize(); } + + /** Accepted by the {@code target} parameter of BindTransformFeedback. */ + public static final int GL_TRANSFORM_FEEDBACK = 0x8E22; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED = 0x8E23, + GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE = 0x8E24, + GL_TRANSFORM_FEEDBACK_BINDING = 0x8E25; + + protected ARBTransformFeedback2() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindTransformFeedback ] --- + + /** + * Binds a transform feedback object. + * + * @param target the target to which to bind the transform feedback object {@code id}. Must be:
    {@link GL40C#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param id the name of a transform feedback object + */ + public static void glBindTransformFeedback(@NativeType("GLenum") int target, @NativeType("GLuint") int id) { + GL40C.glBindTransformFeedback(target, id); + } + + // --- [ glDeleteTransformFeedbacks ] --- + + /** + * Unsafe version of: {@link #glDeleteTransformFeedbacks DeleteTransformFeedbacks} + * + * @param n the number of transform feedback objects to delete + */ + public static void nglDeleteTransformFeedbacks(int n, long ids) { + GL40C.nglDeleteTransformFeedbacks(n, ids); + } + + /** + * Deletes transform feedback objects. + * + * @param ids an array of names of transform feedback objects to delete + */ + public static void glDeleteTransformFeedbacks(@NativeType("GLuint const *") IntBuffer ids) { + GL40C.glDeleteTransformFeedbacks(ids); + } + + /** Deletes transform feedback objects. */ + public static void glDeleteTransformFeedbacks(@NativeType("GLuint const *") int id) { + GL40C.glDeleteTransformFeedbacks(id); + } + + // --- [ glGenTransformFeedbacks ] --- + + /** + * Unsafe version of: {@link #glGenTransformFeedbacks GenTransformFeedbacks} + * + * @param n the number of transform feedback object names to reserve + */ + public static void nglGenTransformFeedbacks(int n, long ids) { + GL40C.nglGenTransformFeedbacks(n, ids); + } + + /** + * Reserves transform feedback object names. + * + * @param ids an array of into which the reserved names will be written + */ + public static void glGenTransformFeedbacks(@NativeType("GLuint *") IntBuffer ids) { + GL40C.glGenTransformFeedbacks(ids); + } + + /** Reserves transform feedback object names. */ + @NativeType("void") + public static int glGenTransformFeedbacks() { + return GL40C.glGenTransformFeedbacks(); + } + + // --- [ glIsTransformFeedback ] --- + + /** + * Determines if a name corresponds to a transform feedback object. + * + * @param id a value that may be the name of a transform feedback object + */ + @NativeType("GLboolean") + public static boolean glIsTransformFeedback(@NativeType("GLuint") int id) { + return GL40C.glIsTransformFeedback(id); + } + + // --- [ glPauseTransformFeedback ] --- + + /** + * Pauses transform feedback operations for the currently bound transform feedback object. + * + *

    When transform feedback operations are paused, transform feedback is still considered active and changing most transform feedback state related to the + * object results in an error. However, a new transform feedback object may be bound while transform feedback is paused. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} + * is generated by PauseTransformFeedback if the currently bound transform feedback is not active or is paused.

    + * + *

    When transform feedback is active and not paused, all geometric primitives generated must be compatible with the value of {@code primitiveMode} passed + * to {@link GL30C#glBeginTransformFeedback BeginTransformFeedback}. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by {@link GL11#glBegin Begin} or any operation that implicitly calls {@link GL11#glBegin Begin} + * (such as {@link GL11C#glDrawElements DrawElements}) if {@code mode} is not one of the allowed modes. If a geometry shader is active, its output primitive type is used instead + * of the {@code mode} parameter passed to {@link GL11#glBegin Begin} for the purposes of this error check. Any primitive type may be used while transform feedback is + * paused.

    + */ + public static void glPauseTransformFeedback() { + GL40C.glPauseTransformFeedback(); + } + + // --- [ glResumeTransformFeedback ] --- + + /** + * Resumes transform feedback operations for the currently bound transform feedback object. + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by {@link #glResumeTransformFeedback ResumeTransformFeedback} if the currently bound transform feedback is not active or is not paused.

    + */ + public static void glResumeTransformFeedback() { + GL40C.glResumeTransformFeedback(); + } + + // --- [ glDrawTransformFeedback ] --- + + /** + * Render primitives using a count derived from a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + */ + public static void glDrawTransformFeedback(@NativeType("GLenum") int mode, @NativeType("GLuint") int id) { + GL40C.glDrawTransformFeedback(mode, id); + } + + /** Array version of: {@link #glDeleteTransformFeedbacks DeleteTransformFeedbacks} */ + public static void glDeleteTransformFeedbacks(@NativeType("GLuint const *") int[] ids) { + GL40C.glDeleteTransformFeedbacks(ids); + } + + /** Array version of: {@link #glGenTransformFeedbacks GenTransformFeedbacks} */ + public static void glGenTransformFeedbacks(@NativeType("GLuint *") int[] ids) { + GL40C.glGenTransformFeedbacks(ids); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedback3.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedback3.java new file mode 100644 index 000000000..cde7eb34c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedback3.java @@ -0,0 +1,133 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_transform_feedback3 extension. + * + *

    This extension further extends the transform feedback capabilities provided by the {@link EXTTransformFeedback EXT_transform_feedback}, {@link NVTransformFeedback NV_transform_feedback}, and + * {@link NVTransformFeedback2 NV_transform_feedback2} extensions. Those extensions provided a new transform feedback mode, where selected vertex attributes can be recorded to + * a buffer object for each primitive processed by the GL.

    + * + *

    This extension provides increased flexibility in how vertex attributes can be written to buffer objects. Previous extensions allowed applications to + * record a set of attributes interleaved into a single buffer object (interleaved mode) or to record into multiple objects, but with only a single + * attribute per buffer (separate mode). This extension extends interleaved mode to write into multiple buffers, with multiple attributes per buffer. This + * capability is supported for all three styles of transform feedback:

    + * + *
      + *
    • "EXT"-style GLSL transform feedback ({@link EXTTransformFeedback EXT_transform_feedback}), where a list of varyings is provided prior to linking a program object and is + * used whenever that program object is used.
    • + *
    • "NV"-style GLSL transform feedback ({@link NVTransformFeedback2 NV_transform_feedback2}), where "locations" of active varyings are queried after linking + * and are then passed to a function that sets the active transform feedback varyings for the program object. Unlike the "EXT"-style mode, the set of + * varyings to capture can be changed without relinking.
    • + *
    • Transform feedback for fixed-function or assembly vertex/geometry shaders ({@link NVTransformFeedback2 NV_transform_feedback2}), where applications specify a set of + * canonical attribute enums/numbers to capture.
    • + *
    + * + *

    Additionally, this extension adds new support for multiple separate vertex streams. New geometry shader functionality provided by the + * {@link ARBGPUShader5 ARB_gpu_shader5} and NV_gpu_program5 extensions allows geometry shaders to direct each vertex arbitrarily at a specified + * vertex stream. For example, a geometry program might write each "regular" vertex it emits to one vertex stream while writing some per-primitive data it + * computes to a second vertex stream. This extension allows applications to choose a vertex stream for each buffer object it writes to, and allows the + * vertices written to each vertex stream to be recorded in separate buffer objects. Only one stream may be selected for rasterization, and in the initial + * implementation, the geometry shader output topology must be {@link GL11#GL_POINTS POINTS} if multiple streams are used. When geometry shaders are not used, or when an old + * geometry shader not writing multiple streams is used, all vertices produced by the GL are directed at the stream numbered zero. The set of transform + * feedback-related query targets is extended to accommodate multiple vertex streams, so it is possible to count the number of processed and recorded + * primitives for each stream separately.

    + * + *

    Requires {@link GL30 OpenGL 3.0} or {@link EXTTransformFeedback EXT_transform_feedback} or {@link NVTransformFeedback NV_transform_feedback}. Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ +public class ARBTransformFeedback3 { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_MAX_TRANSFORM_FEEDBACK_BUFFERS = 0x8E70, + GL_MAX_VERTEX_STREAMS = 0x8E71; + + protected ARBTransformFeedback3() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawTransformFeedbackStream ] --- + + /** + * Renders primitives using a count derived from a specifed stream of a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + * @param stream the index of the transform feedback stream from which to retrieve a primitive count + */ + public static void glDrawTransformFeedbackStream(@NativeType("GLenum") int mode, @NativeType("GLuint") int id, @NativeType("GLuint") int stream) { + GL40C.glDrawTransformFeedbackStream(mode, id, stream); + } + + // --- [ glBeginQueryIndexed ] --- + + /** + * Begins a query object on an indexed target + * + * @param target the target type of query object established between {@code glBeginQueryIndexed} and the subsequent {@link #glEndQueryIndexed EndQueryIndexed}. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query target upon which to begin the query + * @param id the name of a query object + */ + public static void glBeginQueryIndexed(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int id) { + GL40C.glBeginQueryIndexed(target, index, id); + } + + // --- [ glEndQueryIndexed ] --- + + /** + * Ends a query object on an indexed target + * + * @param target the target type of query object to be concluded. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query target upon which to end the query + */ + public static void glEndQueryIndexed(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + GL40C.glEndQueryIndexed(target, index); + } + + // --- [ glGetQueryIndexediv ] --- + + /** Unsafe version of: {@link #glGetQueryIndexediv GetQueryIndexediv} */ + public static void nglGetQueryIndexediv(int target, int index, int pname, long params) { + GL40C.nglGetQueryIndexediv(target, index, pname, params); + } + + /** + * Returns parameters of an indexed query object target. + * + * @param target a query object target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query object target + * @param pname the symbolic name of a query object target parameter + * @param params the requested data + */ + public static void glGetQueryIndexediv(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL40C.glGetQueryIndexediv(target, index, pname, params); + } + + /** + * Returns parameters of an indexed query object target. + * + * @param target a query object target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query object target + * @param pname the symbolic name of a query object target parameter + */ + @NativeType("void") + public static int glGetQueryIndexedi(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL40C.glGetQueryIndexedi(target, index, pname); + } + + /** Array version of: {@link #glGetQueryIndexediv GetQueryIndexediv} */ + public static void glGetQueryIndexediv(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL40C.glGetQueryIndexediv(target, index, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedbackInstanced.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedbackInstanced.java new file mode 100644 index 000000000..538ce79d2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedbackInstanced.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_transform_feedback_instanced extension. + * + *

    Multiple instances of geometry may be specified to the GL by calling functions such as {@link GL31C#glDrawArraysInstanced DrawArraysInstanced} and {@link GL31C#glDrawElementsInstanced DrawElementsInstanced}. + * Further, the results of a transform feedback operation may be returned to the GL by calling {@link GL40C#glDrawTransformFeedback DrawTransformFeedback}, or + * {@link GL40C#glDrawTransformFeedbackStream DrawTransformFeedbackStream}. However, it is not presently possible to draw multiple instances of data transform feedback without using a query + * and the resulting round trip from server to client.

    + * + *

    This extension adds functionality to draw multiple instances of the result of a transform feedback operation.

    + * + *

    Requires {@link GL40 OpenGL 4.0} or {@link ARBTransformFeedback2 ARB_transform_feedback2}. Requires {@link GL31 OpenGL 3.1} or {@link ARBDrawInstanced ARB_draw_instanced}. Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ +public class ARBTransformFeedbackInstanced { + + static { GL.initialize(); } + + protected ARBTransformFeedbackInstanced() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawTransformFeedbackInstanced ] --- + + /** + * Renders multiple instances of primitives using a count derived from a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + * @param primcount the number of instances of the geometry to render + */ + public static void glDrawTransformFeedbackInstanced(@NativeType("GLenum") int mode, @NativeType("GLuint") int id, @NativeType("GLsizei") int primcount) { + GL42C.glDrawTransformFeedbackInstanced(mode, id, primcount); + } + + // --- [ glDrawTransformFeedbackStreamInstanced ] --- + + /** + * Renders multiple instances of primitives using a count derived from a specifed stream of a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + * @param stream the index of the transform feedback stream from which to retrieve a primitive count + * @param primcount the number of instances of the geometry to render + */ + public static void glDrawTransformFeedbackStreamInstanced(@NativeType("GLenum") int mode, @NativeType("GLuint") int id, @NativeType("GLuint") int stream, @NativeType("GLsizei") int primcount) { + GL42C.glDrawTransformFeedbackStreamInstanced(mode, id, stream, primcount); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedbackOverflowQuery.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedbackOverflowQuery.java new file mode 100644 index 000000000..47915f88b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransformFeedbackOverflowQuery.java @@ -0,0 +1,28 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_transform_feedback_overflow_query extension. + * + *

    This extension adds new query types which can be used to detect overflow of transform feedback buffers. The new query types are also accepted by + * conditional rendering commands.

    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ +public final class ARBTransformFeedbackOverflowQuery { + + /** + * Accepted by the {@code target} parameter of {@link GL15C#glBeginQuery BeginQuery}, {@link GL15C#glEndQuery EndQuery}, {@link GL15C#glGetQueryiv GetQueryiv}, + * {@link GL40C#glBeginQueryIndexed BeginQueryIndexed}, {@link GL40C#glEndQueryIndexed EndQueryIndexed} and {@link GL40C#glGetQueryIndexediv GetQueryIndexediv}. + */ + public static final int + GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB = 0x82EC, + GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB = 0x82ED; + + private ARBTransformFeedbackOverflowQuery() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransposeMatrix.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransposeMatrix.java new file mode 100644 index 000000000..3a2bde7da --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBTransposeMatrix.java @@ -0,0 +1,161 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_transpose_matrix extension. + * + *

    New functions and tokens are added allowing application matrices stored in row major order rather than column major order to be transferred to the + * OpenGL implementation. This allows an application to use standard C-language 2-dimensional arrays ({@code m[row][col]}) and have the array indices match the + * expected matrix row and column indexes. These arrays are referred to as transpose matrices since they are the transpose of the standard matrices passed + * to OpenGL.

    + * + *

    This extension adds an interface for transfering data to and from the OpenGL pipeline, it does not change any OpenGL processing or imply any changes in + * state representation.

    + * + *

    Promoted to core in {@link GL13 OpenGL 1.3}.

    + */ +public class ARBTransposeMatrix { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_TRANSPOSE_MODELVIEW_MATRIX_ARB = 0x84E3, + GL_TRANSPOSE_PROJECTION_MATRIX_ARB = 0x84E4, + GL_TRANSPOSE_TEXTURE_MATRIX_ARB = 0x84E5, + GL_TRANSPOSE_COLOR_MATRIX_ARB = 0x84E6; + + protected ARBTransposeMatrix() { + throw new UnsupportedOperationException(); + } + + // --- [ glLoadTransposeMatrixfARB ] --- + + /** Unsafe version of: {@link #glLoadTransposeMatrixfARB LoadTransposeMatrixfARB} */ + public static native void nglLoadTransposeMatrixfARB(long m); + + /** + * Sets the current matrix to a 4 × 4 matrix in row-major order. + * + *

    The matrix is stored as 16 consecutive values, i.e. as:

    + * + * + * + * + * + * + *
    a1a2a3a4
    a5a6a7a8
    a9a10a11a12
    a13a14a15a16
    + * + * @param m the matrix data + */ + public static void glLoadTransposeMatrixfARB(@NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglLoadTransposeMatrixfARB(memAddress(m)); + } + + // --- [ glLoadTransposeMatrixdARB ] --- + + /** Unsafe version of: {@link #glLoadTransposeMatrixdARB LoadTransposeMatrixdARB} */ + public static native void nglLoadTransposeMatrixdARB(long m); + + /** + * Double version of {@link #glLoadTransposeMatrixfARB LoadTransposeMatrixfARB}. + * + * @param m the matrix data + */ + public static void glLoadTransposeMatrixdARB(@NativeType("GLdouble const *") DoubleBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglLoadTransposeMatrixdARB(memAddress(m)); + } + + // --- [ glMultTransposeMatrixfARB ] --- + + /** Unsafe version of: {@link #glMultTransposeMatrixfARB MultTransposeMatrixfARB} */ + public static native void nglMultTransposeMatrixfARB(long m); + + /** + * Multiplies the current matrix with a 4 × 4 matrix in row-major order. See {@link #glLoadTransposeMatrixfARB LoadTransposeMatrixfARB} for details. + * + * @param m the matrix data + */ + public static void glMultTransposeMatrixfARB(@NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMultTransposeMatrixfARB(memAddress(m)); + } + + // --- [ glMultTransposeMatrixdARB ] --- + + /** Unsafe version of: {@link #glMultTransposeMatrixdARB MultTransposeMatrixdARB} */ + public static native void nglMultTransposeMatrixdARB(long m); + + /** + * Double version of {@link #glMultTransposeMatrixfARB MultTransposeMatrixfARB}. + * + * @param m the matrix data + */ + public static void glMultTransposeMatrixdARB(@NativeType("GLdouble const *") DoubleBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMultTransposeMatrixdARB(memAddress(m)); + } + + /** Array version of: {@link #glLoadTransposeMatrixfARB LoadTransposeMatrixfARB} */ + public static void glLoadTransposeMatrixfARB(@NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glLoadTransposeMatrixfARB; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + + /** Array version of: {@link #glLoadTransposeMatrixdARB LoadTransposeMatrixdARB} */ + public static void glLoadTransposeMatrixdARB(@NativeType("GLdouble const *") double[] m) { + long __functionAddress = GL.getICD().glLoadTransposeMatrixdARB; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + + /** Array version of: {@link #glMultTransposeMatrixfARB MultTransposeMatrixfARB} */ + public static void glMultTransposeMatrixfARB(@NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMultTransposeMatrixfARB; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + + /** Array version of: {@link #glMultTransposeMatrixdARB MultTransposeMatrixdARB} */ + public static void glMultTransposeMatrixdARB(@NativeType("GLdouble const *") double[] m) { + long __functionAddress = GL.getICD().glMultTransposeMatrixdARB; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBUniformBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBUniformBufferObject.java new file mode 100644 index 000000000..918c28448 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBUniformBufferObject.java @@ -0,0 +1,481 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_uniform_buffer_object extension. + * + *

    This extension introduces the concept of a group of GLSL uniforms known as a "uniform block", and the API mechanisms to store "uniform blocks" in GL + * buffer objects.

    + * + *

    The extension also defines both a standard cross-platform layout in memory for uniform block data, as well as mechanisms to allow the GL to optimize the + * data layout in an implementation-defined manner.

    + * + *

    Prior to this extension, the existing interface for modification of uniform values allowed modification of large numbers of values using glUniform* + * calls, but only for a single uniform name (or a uniform array) at a time. However, updating uniforms in this manner may not map well to heterogenous + * uniform data structures defined for a GL application and in these cases, the application is forced to either:

    + * + *
      + *
    1. restructure their uniform data definitions into arrays or
    2. + *
    3. make an excessive number of calls through the GL interface to one of the Uniform* variants.
    4. + *
    + * + *

    These solutions have their disadvantages. Solution A imposes considerable development overhead on the application developer. Solution B may impose + * considerable run-time overhead on the application if the number of uniforms modified in a given frame of rendering is sufficiently large.

    + * + *

    This extension provides a better alternative to either (A) or (B) by allowing buffer object backing for the storage associated with all uniforms of a + * given GLSL program.

    + * + *

    Storing uniform blocks in buffer objects enables several key use cases:

    + * + *
      + *
    • sharing of uniform data storage between program objects and between program stages
    • + *
    • rapid swapping of sets of previously defined uniforms by storing sets of uniform data on the GL server
    • + *
    • rapid updates of uniform data from both the client and the server
    • + *
    + * + *

    The data storage for a uniform block can be declared to use one of three layouts in memory: packed, shared, or std140.

    + * + *
      + *
    • "packed" uniform blocks have an implementation-dependent data layout for efficiency, and unused uniforms may be eliminated by the compiler to save + * space.
    • + *
    • "shared" uniform blocks, the default layout, have an implementation-dependent data layout for efficiency, but the layout will be uniquely determined + * by the structure of the block, allowing data storage to be shared across programs.
    • + *
    • "std140" uniform blocks have a standard cross-platform cross-vendor layout (see below). Unused uniforms will not be eliminated.
    • + *
    + * + *

    Any uniforms not declared in a named uniform block are said to be part of the "default uniform block".

    + * + *

    While uniforms in the default uniform block are updated with glUniform* entry points and can have static initializers, uniforms in named uniform blocks + * are not. Instead, uniform block data is updated using the routines that update buffer objects and can not use static initializers.

    + * + *

    Rules and Concepts Guiding this Specification:

    + * + *

    For reference, a uniform has a "uniform index" (subsequently referred to as "u_index) and also a "uniform location" to efficiently identify it in the + * uniform data store of the implementation. We subsequently refer to this uniform data store of the implementation as the "uniform database".

    + * + *

    A "uniform block" only has a "uniform block index" used for queries and connecting the "uniform block" to a buffer object. A "uniform block" has no + * "location" because "uniform blocks" are not updated directly. The buffer object APIs are used instead.

    + * + *

    Properties of Uniforms and uniform blocks:

    + * + *
      + *
    1. A uniform is "active" if it exists in the database and has a valid u_index.
    2. + *
    3. A "uniform block" is "active" if it exists in the database and has a valid ub_index.
    4. + *
    5. Uniforms and "uniform blocks" can be inactive because they don't exist in the source, or because they have been removed by dead code elimination.
    6. + *
    7. An inactive uniform has u_index == {@link #GL_INVALID_INDEX INVALID_INDEX}.
    8. + *
    9. An inactive uniform block has ub_index == {@link #GL_INVALID_INDEX INVALID_INDEX}.
    10. + *
    11. A u_index or ub_index of {@link #GL_INVALID_INDEX INVALID_INDEX} generates the {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error if given as a function argument.
    12. + *
    13. The default uniform block, which is not assigned any ub_index, uses a private, internal data storage, and does not have any buffer object associated + * with it.
    14. + *
    15. An active uniform that is a member of the default uniform block has location ≥ 0 and it has offset == stride == -1.
    16. + *
    17. An active uniform that is a member of a named uniform block has location == -1.
    18. + *
    19. A uniform location of -1 is silently ignored if given as a function argument.
    20. + *
    21. Uniform block declarations may not be nested
    22. + *
    + * + *

    Requires {@link GL20 OpenGL 2.0} or {@link ARBShaderObjects ARB_shader_objects} and {@link GL15 OpenGL 1.5} or {@link ARBVertexBufferObject ARB_vertex_buffer_object}. Promoted to core in {@link GL31 OpenGL 3.1}.

    + */ +public class ARBUniformBufferObject { + + static { GL.initialize(); } + + /** Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. */ + public static final int GL_UNIFORM_BUFFER = 0x8A11; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v, GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_UNIFORM_BUFFER_BINDING = 0x8A28; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v. */ + public static final int + GL_UNIFORM_BUFFER_START = 0x8A29, + GL_UNIFORM_BUFFER_SIZE = 0x8A2A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B, + GL_MAX_GEOMETRY_UNIFORM_BLOCKS = 0x8A2C, + GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D, + GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E, + GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F, + GL_MAX_UNIFORM_BLOCK_SIZE = 0x8A30, + GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31, + GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32, + GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33, + GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int + GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35, + GL_ACTIVE_UNIFORM_BLOCKS = 0x8A36; + + /** Accepted by the {@code pname} parameter of GetActiveUniformsiv. */ + public static final int + GL_UNIFORM_TYPE = 0x8A37, + GL_UNIFORM_SIZE = 0x8A38, + GL_UNIFORM_NAME_LENGTH = 0x8A39, + GL_UNIFORM_BLOCK_INDEX = 0x8A3A, + GL_UNIFORM_OFFSET = 0x8A3B, + GL_UNIFORM_ARRAY_STRIDE = 0x8A3C, + GL_UNIFORM_MATRIX_STRIDE = 0x8A3D, + GL_UNIFORM_IS_ROW_MAJOR = 0x8A3E; + + /** Accepted by the {@code pname} parameter of GetActiveUniformBlockiv. */ + public static final int + GL_UNIFORM_BLOCK_BINDING = 0x8A3F, + GL_UNIFORM_BLOCK_DATA_SIZE = 0x8A40, + GL_UNIFORM_BLOCK_NAME_LENGTH = 0x8A41, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43, + GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44, + GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = 0x8A45, + GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46; + + /** Returned by GetActiveUniformsiv and GetUniformBlockIndex. */ + public static final int GL_INVALID_INDEX = 0xFFFFFFFF; + + protected ARBUniformBufferObject() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetUniformIndices ] --- + + /** + * Unsafe version of: {@link #glGetUniformIndices GetUniformIndices} + * + * @param uniformCount the number of uniforms whose indices to query + */ + public static void nglGetUniformIndices(int program, int uniformCount, long uniformNames, long uniformIndices) { + GL31C.nglGetUniformIndices(program, uniformCount, uniformNames, uniformIndices); + } + + /** + * Retrieves the indices of a number of uniforms within a program object + * + * @param program the name of a program containing uniforms whose indices to query + * @param uniformNames an array of pointers to buffers containing the names of the queried uniforms + * @param uniformIndices an array that will receive the indices of the uniforms + */ + public static void glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") PointerBuffer uniformNames, @NativeType("GLuint *") IntBuffer uniformIndices) { + GL31C.glGetUniformIndices(program, uniformNames, uniformIndices); + } + + /** + * Retrieves the indices of a number of uniforms within a program object + * + * @param program the name of a program containing uniforms whose indices to query + * @param uniformNames an array of pointers to buffers containing the names of the queried uniforms + * @param uniformIndices an array that will receive the indices of the uniforms + */ + public static void glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence[] uniformNames, @NativeType("GLuint *") IntBuffer uniformIndices) { + GL31C.glGetUniformIndices(program, uniformNames, uniformIndices); + } + + /** + * Retrieves the indices of a number of uniforms within a program object + * + * @param program the name of a program containing uniforms whose indices to query + */ + @NativeType("void") + public static int glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence uniformName) { + return GL31C.glGetUniformIndices(program, uniformName); + } + + // --- [ glGetActiveUniformsiv ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniformsiv GetActiveUniformsiv} + * + * @param uniformCount the number of elements in the array of indices {@code uniformIndices} and the number of parameters written to {@code params} upon successful return + */ + public static void nglGetActiveUniformsiv(int program, int uniformCount, long uniformIndices, int pname, long params) { + GL31C.nglGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params); + } + + /** + * Returns information about several active uniform variables for the specified program object. + * + * @param program the program object to be queried + * @param uniformIndices an array of {@code uniformCount} integers containing the indices of uniforms within {@code program} + * @param pname the property of the each uniform in {@code uniformIndices} that should be written into the corresponding element of {@code params} + * @param params an array of {@code uniformCount} integers which are to receive the value of {@code pname} for each uniform in {@code uniformIndices} + */ + public static void glGetActiveUniformsiv(@NativeType("GLuint") int program, @NativeType("GLuint const *") IntBuffer uniformIndices, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL31C.glGetActiveUniformsiv(program, uniformIndices, pname, params); + } + + /** + * Returns information about several active uniform variables for the specified program object. + * + * @param program the program object to be queried + * @param pname the property of the each uniform in {@code uniformIndices} that should be written into the corresponding element of {@code params} + */ + @NativeType("void") + public static int glGetActiveUniformsi(@NativeType("GLuint") int program, @NativeType("GLuint const *") int uniformIndex, @NativeType("GLenum") int pname) { + return GL31C.glGetActiveUniformsi(program, uniformIndex, pname); + } + + // --- [ glGetActiveUniformName ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniformName GetActiveUniformName} + * + * @param bufSize the size of the buffer, in units of {@code GLchar}, of the buffer whose address is specified in {@code uniformName} + */ + public static void nglGetActiveUniformName(int program, int uniformIndex, int bufSize, long length, long uniformName) { + GL31C.nglGetActiveUniformName(program, uniformIndex, bufSize, length, uniformName); + } + + /** + * Queries the name of an active uniform. + * + * @param program the program containing the active uniform index {@code uniformIndex} + * @param uniformIndex the index of the active uniform whose name to query + * @param length the address of a variable that will receive the number of characters that were or would have been written to the buffer addressed by {@code uniformName} + * @param uniformName the address of a buffer into which the GL will place the name of the active uniform at {@code uniformIndex} within {@code program} + */ + public static void glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer uniformName) { + GL31C.glGetActiveUniformName(program, uniformIndex, length, uniformName); + } + + /** + * Queries the name of an active uniform. + * + * @param program the program containing the active uniform index {@code uniformIndex} + * @param uniformIndex the index of the active uniform whose name to query + * @param bufSize the size of the buffer, in units of {@code GLchar}, of the buffer whose address is specified in {@code uniformName} + */ + @NativeType("void") + public static String glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex, @NativeType("GLsizei") int bufSize) { + return GL31C.glGetActiveUniformName(program, uniformIndex, bufSize); + } + + /** + * Queries the name of an active uniform. + * + * @param program the program containing the active uniform index {@code uniformIndex} + * @param uniformIndex the index of the active uniform whose name to query + */ + @NativeType("void") + public static String glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex) { + return glGetActiveUniformName(program, uniformIndex, glGetActiveUniformsi(program, uniformIndex, GL_UNIFORM_NAME_LENGTH)); + } + + // --- [ glGetUniformBlockIndex ] --- + + /** Unsafe version of: {@link #glGetUniformBlockIndex GetUniformBlockIndex} */ + public static int nglGetUniformBlockIndex(int program, long uniformBlockName) { + return GL31C.nglGetUniformBlockIndex(program, uniformBlockName); + } + + /** + * Retrieves the index of a named uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockName an array of characters to containing the name of the uniform block whose index to retrieve + */ + @NativeType("GLuint") + public static int glGetUniformBlockIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer uniformBlockName) { + return GL31C.glGetUniformBlockIndex(program, uniformBlockName); + } + + /** + * Retrieves the index of a named uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockName an array of characters to containing the name of the uniform block whose index to retrieve + */ + @NativeType("GLuint") + public static int glGetUniformBlockIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence uniformBlockName) { + return GL31C.glGetUniformBlockIndex(program, uniformBlockName); + } + + // --- [ glGetActiveUniformBlockiv ] --- + + /** Unsafe version of: {@link #glGetActiveUniformBlockiv GetActiveUniformBlockiv} */ + public static void nglGetActiveUniformBlockiv(int program, int uniformBlockIndex, int pname, long params) { + GL31C.nglGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params); + } + + /** + * Queries information about an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param pname the name of the parameter to query. One of:
    {@link GL31C#GL_UNIFORM_BLOCK_BINDING UNIFORM_BLOCK_BINDING}{@link GL31C#GL_UNIFORM_BLOCK_DATA_SIZE UNIFORM_BLOCK_DATA_SIZE}
    {@link GL31C#GL_UNIFORM_BLOCK_NAME_LENGTH UNIFORM_BLOCK_NAME_LENGTH}{@link GL31C#GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS UNIFORM_BLOCK_ACTIVE_UNIFORMS}
    {@link GL31C#GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES}{@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER}
    {@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER}{@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER}
    + * @param params the address of a variable to receive the result of the query + */ + public static void glGetActiveUniformBlockiv(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL31C.glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params); + } + + /** + * Queries information about an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param pname the name of the parameter to query. One of:
    {@link GL31C#GL_UNIFORM_BLOCK_BINDING UNIFORM_BLOCK_BINDING}{@link GL31C#GL_UNIFORM_BLOCK_DATA_SIZE UNIFORM_BLOCK_DATA_SIZE}
    {@link GL31C#GL_UNIFORM_BLOCK_NAME_LENGTH UNIFORM_BLOCK_NAME_LENGTH}{@link GL31C#GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS UNIFORM_BLOCK_ACTIVE_UNIFORMS}
    {@link GL31C#GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES}{@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER}
    {@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER}{@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER}
    + */ + @NativeType("void") + public static int glGetActiveUniformBlocki(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLenum") int pname) { + return GL31C.glGetActiveUniformBlocki(program, uniformBlockIndex, pname); + } + + // --- [ glGetActiveUniformBlockName ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniformBlockName GetActiveUniformBlockName} + * + * @param bufSize the size of the buffer addressed by {@code uniformBlockName} + */ + public static void nglGetActiveUniformBlockName(int program, int uniformBlockIndex, int bufSize, long length, long uniformBlockName) { + GL31C.nglGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName); + } + + /** + * Retrieves the name of an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param length the address of a variable to receive the number of characters that were written to {@code uniformBlockName} + * @param uniformBlockName an array of characters to receive the name of the uniform block at {@code uniformBlockIndex} + */ + public static void glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer uniformBlockName) { + GL31C.glGetActiveUniformBlockName(program, uniformBlockIndex, length, uniformBlockName); + } + + /** + * Retrieves the name of an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param bufSize the size of the buffer addressed by {@code uniformBlockName} + */ + @NativeType("void") + public static String glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLsizei") int bufSize) { + return GL31C.glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize); + } + + /** + * Retrieves the name of an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + */ + @NativeType("void") + public static String glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex) { + return glGetActiveUniformBlockName(program, uniformBlockIndex, glGetActiveUniformBlocki(program, uniformBlockIndex, GL_UNIFORM_BLOCK_NAME_LENGTH)); + } + + // --- [ glBindBufferRange ] --- + + /** + * Binds a range within a buffer object to an indexed buffer target. + * + * @param target the target of the bind operation. One of:
    {@link GL30C#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}
    + * @param index the index of the binding point within the array specified by {@code target} + * @param buffer a buffer object to bind to the specified binding point + * @param offset the starting offset in basic machine units into the buffer object {@code buffer} + * @param size the amount of data in machine units that can be read from the buffer object while used as an indexed target + */ + public static void glBindBufferRange(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size) { + GL30C.glBindBufferRange(target, index, buffer, offset, size); + } + + // --- [ glBindBufferBase ] --- + + /** + * Binds a buffer object to an indexed buffer target. + * + * @param target the target of the bind operation. One of:
    {@link GL30C#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}
    + * @param index the index of the binding point within the array specified by {@code target} + * @param buffer a buffer object to bind to the specified binding point + */ + public static void glBindBufferBase(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer) { + GL30C.glBindBufferBase(target, index, buffer); + } + + // --- [ glGetIntegeri_v ] --- + + /** Unsafe version of: {@link #glGetIntegeri_v GetIntegeri_v} */ + public static void nglGetIntegeri_v(int target, int index, long data) { + GL30C.nglGetIntegeri_v(target, index, data); + } + + /** + * Queries the integer value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * @param data a scalar or buffer in which to place the returned data + */ + public static void glGetIntegeri_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer data) { + GL30C.glGetIntegeri_v(target, index, data); + } + + /** + * Queries the integer value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + */ + @NativeType("void") + public static int glGetIntegeri(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return GL30C.glGetIntegeri(target, index); + } + + // --- [ glUniformBlockBinding ] --- + + /** + * Assigns a binding point to an active uniform block. + * + * @param program the name of a program object containing the active uniform block whose binding to assign + * @param uniformBlockIndex the index of the active uniform block within {@code program} whose binding to assign + * @param uniformBlockBinding the binding point to which to bind the uniform block with index {@code uniformBlockIndex} within {@code program} + */ + public static void glUniformBlockBinding(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLuint") int uniformBlockBinding) { + GL31C.glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); + } + + /** Array version of: {@link #glGetUniformIndices GetUniformIndices} */ + public static void glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") PointerBuffer uniformNames, @NativeType("GLuint *") int[] uniformIndices) { + GL31C.glGetUniformIndices(program, uniformNames, uniformIndices); + } + + /** Array version of: {@link #glGetActiveUniformsiv GetActiveUniformsiv} */ + public static void glGetActiveUniformsiv(@NativeType("GLuint") int program, @NativeType("GLuint const *") int[] uniformIndices, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL31C.glGetActiveUniformsiv(program, uniformIndices, pname, params); + } + + /** Array version of: {@link #glGetActiveUniformName GetActiveUniformName} */ + public static void glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer uniformName) { + GL31C.glGetActiveUniformName(program, uniformIndex, length, uniformName); + } + + /** Array version of: {@link #glGetActiveUniformBlockiv GetActiveUniformBlockiv} */ + public static void glGetActiveUniformBlockiv(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL31C.glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params); + } + + /** Array version of: {@link #glGetActiveUniformBlockName GetActiveUniformBlockName} */ + public static void glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer uniformBlockName) { + GL31C.glGetActiveUniformBlockName(program, uniformBlockIndex, length, uniformBlockName); + } + + /** Array version of: {@link #glGetIntegeri_v GetIntegeri_v} */ + public static void glGetIntegeri_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") int[] data) { + GL30C.glGetIntegeri_v(target, index, data); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexArrayBGRA.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexArrayBGRA.java new file mode 100644 index 000000000..06b9cb6df --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexArrayBGRA.java @@ -0,0 +1,56 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ARB_vertex_array_bgra extension. + * + *

    This extension provides a single new component format for vertex arrays to read 4-component unsigned byte vertex attributes with a BGRA component + * ordering.

    + * + *

    OpenGL expects vertex arrays containing 4 unsigned bytes per element to be in the RGBA, STRQ, or XYZW order (reading components left-to-right in their + * lower address to higher address order). Essentially the order the components appear in memory is the order the components appear in the resulting vertex + * attribute vector.

    + * + *

    However Direct3D has color (diffuse and specular) vertex arrays containing 4 unsigned bytes per element that are in a BGRA order (again reading + * components left-to-right in their lower address to higher address order). Direct3D calls this "ARGB" reading the components in the opposite order + * (reading components left-to-right in their higher address to lower address order). This ordering is generalized in the DirectX 10 by the + * DXGI_FORMAT_B8G8R8A8_UNORM format.

    + * + *

    For an OpenGL application to source color data from a vertex buffer formatted for Direct3D's color array format conventions, the application is forced + * to either:

    + * + *
      + *
    1. Rely on a vertex program or shader to swizzle the color components from the BGRA to conventional RGBA order.
    2. + *
    3. Re-order the color data components in the vertex buffer from Direct3D's native BGRA order to OpenGL's native RGBA order.
    4. + *
    + * + *

    Neither option is entirely satisfactory.

    + * + *

    Option 1 means vertex shaders have to be re-written to source colors differently. If the same vertex shader is used with vertex arrays configured to + * source the color as 4 floating-point color components, the swizzle for BGRA colors stored as 4 unsigned bytes is no longer appropriate. The shader's + * swizzling of colors becomes dependent on the type and number of color components. Ideally the vertex shader should be independent from the format and + * component ordering of the data it sources.

    + * + *

    Option 2 is expensive because vertex buffers may have to be reformatted prior to use. OpenGL treats the memory for vertex arrays (whether client-side + * memory or buffer objects) as essentially untyped memory and vertex arrays can be stored separately, interleaved, or even interwoven (where multiple + * arrays overlap with differing strides and formats).

    + * + *

    Rather than force a re-ordering of either vertex array components in memory or a vertex array format-dependent re-ordering of vertex shader inputs, + * OpenGL can simply provide a vertex array format that matches the Direct3D color component ordering.

    + * + *

    This approach mimics that of the {@link EXTBGRA EXT_bgra} extension for pixel and texel formats except for vertex instead of image data.

    + * + *

    Promoted to core in {@link GL32 OpenGL 3.2}.

    + */ +public final class ARBVertexArrayBGRA { + + /** Accepted by the {@code size} parameter of ColorPointer, SecondaryColorPointer, and VertexAttribPointer. */ + public static final int GL_BGRA = 0x80E1; + + private ARBVertexArrayBGRA() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexArrayObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexArrayObject.java new file mode 100644 index 000000000..b634ee212 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexArrayObject.java @@ -0,0 +1,119 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_vertex_array_object extension. + * + *

    This extension introduces named vertex array objects which encapsulate vertex array state on the client side. These objects allow applications to + * rapidly switch between large sets of array state. In addition, layered libraries can return to the default array state by simply creating and binding a + * new vertex array object.

    + * + *

    This extension differs from GL_APPLE_vertex_array_object in that client memory cannot be accessed through a non-zero vertex array object. It also + * differs in that vertex array objects are explicitly not sharable between contexts.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public class ARBVertexArrayObject { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_VERTEX_ARRAY_BINDING = 0x85B5; + + protected ARBVertexArrayObject() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindVertexArray ] --- + + /** + * Binds a vertex array object + * + * @param array the name of the vertex array to bind + */ + public static void glBindVertexArray(@NativeType("GLuint") int array) { + GL30C.glBindVertexArray(array); + } + + // --- [ glDeleteVertexArrays ] --- + + /** + * Unsafe version of: {@link #glDeleteVertexArrays DeleteVertexArrays} + * + * @param n the number of vertex array objects to be deleted + */ + public static void nglDeleteVertexArrays(int n, long arrays) { + GL30C.nglDeleteVertexArrays(n, arrays); + } + + /** + * Deletes vertex array objects. + * + * @param arrays an array containing the n names of the objects to be deleted + */ + public static void glDeleteVertexArrays(@NativeType("GLuint const *") IntBuffer arrays) { + GL30C.glDeleteVertexArrays(arrays); + } + + /** Deletes vertex array objects. */ + public static void glDeleteVertexArrays(@NativeType("GLuint const *") int array) { + GL30C.glDeleteVertexArrays(array); + } + + // --- [ glGenVertexArrays ] --- + + /** + * Unsafe version of: {@link #glGenVertexArrays GenVertexArrays} + * + * @param n the number of vertex array object names to generate + */ + public static void nglGenVertexArrays(int n, long arrays) { + GL30C.nglGenVertexArrays(n, arrays); + } + + /** + * Generates vertex array object names. + * + * @param arrays a buffer in which the generated vertex array object names are stored + */ + public static void glGenVertexArrays(@NativeType("GLuint *") IntBuffer arrays) { + GL30C.glGenVertexArrays(arrays); + } + + /** Generates vertex array object names. */ + @NativeType("void") + public static int glGenVertexArrays() { + return GL30C.glGenVertexArrays(); + } + + // --- [ glIsVertexArray ] --- + + /** + * Determines if a name corresponds to a vertex array object. + * + * @param array a value that may be the name of a vertex array object + */ + @NativeType("GLboolean") + public static boolean glIsVertexArray(@NativeType("GLuint") int array) { + return GL30C.glIsVertexArray(array); + } + + /** Array version of: {@link #glDeleteVertexArrays DeleteVertexArrays} */ + public static void glDeleteVertexArrays(@NativeType("GLuint const *") int[] arrays) { + GL30C.glDeleteVertexArrays(arrays); + } + + /** Array version of: {@link #glGenVertexArrays GenVertexArrays} */ + public static void glGenVertexArrays(@NativeType("GLuint *") int[] arrays) { + GL30C.glGenVertexArrays(arrays); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexAttrib64Bit.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexAttrib64Bit.java new file mode 100644 index 000000000..857a450f3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexAttrib64Bit.java @@ -0,0 +1,299 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_vertex_attrib_64bit extension. + * + *

    This extension provides OpenGL shading language support for vertex shader inputs with 64-bit floating-point components and OpenGL API support for + * specifying the value of those inputs using vertex array or immediate mode entry points. This builds on the support for general-purpose support for + * 64-bit floating-point values in the ARB_gpu_shader_fp64 extension.

    + * + *

    This extension provides a new class of vertex attribute functions, beginning with "VertexAttribL" ("L" for "long"), that can be used to specify + * attributes with 64-bit floating-point components. This extension provides no automatic type conversion between attribute and shader variables; + * single-precision attributes are not automatically converted to double-precision or vice versa. For shader variables with 64-bit component types, the + * "VertexAttribL" functions must be used to specify attribute values. For other shader variables, the "VertexAttribL" functions must not be used. If a + * vertex attribute is specified using the wrong attribute function, the values of the corresponding shader input are undefined. This approach requiring + * matching types is identical to that used for the "VertexAttribI" functions provided by OpenGL 3.0 and the {@link EXTGPUShader4 EXT_gpu_shader4} extension.

    + * + *

    Additionally, some vertex shader inputs using the wider 64-bit components may count double against the implementation-dependent limit on the number of + * vertex shader attribute vectors. A 64-bit scalar or a two-component vector consumes only a single generic vertex attribute; three- and four-component + * "long" may count as two. This approach is similar to the one used in the current GL where matrix attributes consume multiple attributes.

    + * + *

    Note that 64-bit generic vertex attributes were nominally supported beginning with the introduction of vertex shaders in OpenGL 2.0. However, the OpenGL + * Shading Language at the time had no support for 64-bit data types, so any such values were automatically converted to 32-bit.

    + * + *

    Support for 64-bit floating-point vertex attributes in this extension can be combined with other extensions. In particular, this extension provides an + * entry point that can be used with EXT_direct_state_access to directly set state for any vertex array object. Also, the related + * {@link NVVertexAttribInteger64bit NV_vertex_attrib_integer_64bit} extension provides an entry point to specify bindless vertex attribute arrays with 64-bit + * components, integer or floating-point.

    + * + *

    Requires {@link GL30 OpenGL 3.0}, GLSL 1.30 and {@link ARBGPUShaderFP64 ARB_gpu_shader_fp64}. Promoted to core in {@link GL41 OpenGL 4.1}.

    + */ +public class ARBVertexAttrib64Bit { + + static { GL.initialize(); } + + /** Returned in the {@code type} parameter of GetActiveAttrib. */ + public static final int + GL_DOUBLE_VEC2 = 0x8FFC, + GL_DOUBLE_VEC3 = 0x8FFD, + GL_DOUBLE_VEC4 = 0x8FFE, + GL_DOUBLE_MAT2 = 0x8F46, + GL_DOUBLE_MAT3 = 0x8F47, + GL_DOUBLE_MAT4 = 0x8F48, + GL_DOUBLE_MAT2x3 = 0x8F49, + GL_DOUBLE_MAT2x4 = 0x8F4A, + GL_DOUBLE_MAT3x2 = 0x8F4B, + GL_DOUBLE_MAT3x4 = 0x8F4C, + GL_DOUBLE_MAT4x2 = 0x8F4D, + GL_DOUBLE_MAT4x3 = 0x8F4E; + + protected ARBVertexAttrib64Bit() { + throw new UnsupportedOperationException(); + } + + // --- [ glVertexAttribL1d ] --- + + /** + * Specifies the value of a generic vertex attribute. The y and z components are implicitly set to 0.0 and w to 1.0. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + */ + public static void glVertexAttribL1d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x) { + GL41C.glVertexAttribL1d(index, x); + } + + // --- [ glVertexAttribL2d ] --- + + /** + * Specifies the value of a generic vertex attribute. The y component is implicitly set to 0.0 and w to 1.0. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + */ + public static void glVertexAttribL2d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y) { + GL41C.glVertexAttribL2d(index, x, y); + } + + // --- [ glVertexAttribL3d ] --- + + /** + * Specifies the value of a generic vertex attribute. The w is implicitly set to 1.0. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + */ + public static void glVertexAttribL3d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z) { + GL41C.glVertexAttribL3d(index, x, y, z); + } + + // --- [ glVertexAttribL4d ] --- + + /** + * Specifies the value of a generic vertex attribute. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + */ + public static void glVertexAttribL4d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w) { + GL41C.glVertexAttribL4d(index, x, y, z, w); + } + + // --- [ glVertexAttribL1dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL1dv VertexAttribL1dv} */ + public static void nglVertexAttribL1dv(int index, long v) { + GL41C.nglVertexAttribL1dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribL1d VertexAttribL1d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttribL1dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL41C.glVertexAttribL1dv(index, v); + } + + // --- [ glVertexAttribL2dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL2dv VertexAttribL2dv} */ + public static void nglVertexAttribL2dv(int index, long v) { + GL41C.nglVertexAttribL2dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribL2d VertexAttribL2d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttribL2dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL41C.glVertexAttribL2dv(index, v); + } + + // --- [ glVertexAttribL3dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL3dv VertexAttribL3dv} */ + public static void nglVertexAttribL3dv(int index, long v) { + GL41C.nglVertexAttribL3dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribL3d VertexAttribL3d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttribL3dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL41C.glVertexAttribL3dv(index, v); + } + + // --- [ glVertexAttribL4dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL4dv VertexAttribL4dv} */ + public static void nglVertexAttribL4dv(int index, long v) { + GL41C.nglVertexAttribL4dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribL4d VertexAttribL4d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttribL4dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL41C.glVertexAttribL4dv(index, v); + } + + // --- [ glVertexAttribLPointer ] --- + + /** + * Unsafe version of: {@link #glVertexAttribLPointer VertexAttribLPointer} + * + * @param type the data type of each component in the array. Must be:
    {@link GL11#GL_DOUBLE DOUBLE}
    + */ + public static void nglVertexAttribLPointer(int index, int size, int type, int stride, long pointer) { + GL41C.nglVertexAttribLPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a 64-bit vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. Must be:
    {@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribLPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + GL41C.glVertexAttribLPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a 64-bit vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. Must be:
    {@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribLPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + GL41C.glVertexAttribLPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a 64-bit vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribLPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLsizei") int stride, @NativeType("void const *") DoubleBuffer pointer) { + GL41C.glVertexAttribLPointer(index, size, stride, pointer); + } + + // --- [ glGetVertexAttribLdv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribLdv GetVertexAttribLdv} */ + public static void nglGetVertexAttribLdv(int index, int pname, long params) { + GL41C.nglGetVertexAttribLdv(index, pname, params); + } + + /** + * Double version of {@link GL20C#glGetVertexAttribiv GetVertexAttribiv}. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params the requested data + */ + public static void glGetVertexAttribLdv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer params) { + GL41C.glGetVertexAttribLdv(index, pname, params); + } + + // --- [ glVertexArrayVertexAttribLOffsetEXT ] --- + + /** + * DSA version of {@link #glVertexAttribLPointer VertexAttribLPointer}. + * + * @param vaobj the vertex array object + * @param buffer the buffer object + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. Must be:
    {@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param offset the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer. The initial value is 0. + */ + public static native void glVertexArrayVertexAttribLOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + /** Array version of: {@link #glVertexAttribL1dv VertexAttribL1dv} */ + public static void glVertexAttribL1dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL41C.glVertexAttribL1dv(index, v); + } + + /** Array version of: {@link #glVertexAttribL2dv VertexAttribL2dv} */ + public static void glVertexAttribL2dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL41C.glVertexAttribL2dv(index, v); + } + + /** Array version of: {@link #glVertexAttribL3dv VertexAttribL3dv} */ + public static void glVertexAttribL3dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL41C.glVertexAttribL3dv(index, v); + } + + /** Array version of: {@link #glVertexAttribL4dv VertexAttribL4dv} */ + public static void glVertexAttribL4dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL41C.glVertexAttribL4dv(index, v); + } + + /** Array version of: {@link #glGetVertexAttribLdv GetVertexAttribLdv} */ + public static void glGetVertexAttribLdv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] params) { + GL41C.glGetVertexAttribLdv(index, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexAttribBinding.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexAttribBinding.java new file mode 100644 index 000000000..a19d78506 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexAttribBinding.java @@ -0,0 +1,225 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_vertex_attrib_binding extension. + * + *

    OpenGL currently supports (at least) 16 vertex attributes and 16 vertex buffer bindings, with a fixed mapping between vertex attributes and vertex + * buffer bindings. This extension allows the application to change the mapping between attributes and bindings, which can make it more efficient to update + * vertex buffer bindings for interleaved vertex formats where many attributes share the same buffer.

    + * + *

    This extension also separates the vertex binding update from the vertex attribute format update, which saves applications the effort of redundantly + * specifying the same format state over and over.

    + * + *

    Conceptually, this extension splits the state for generic vertex attribute arrays into:

    + * + *
      + *
    • An array of vertex buffer binding points, each of which specifies: + * + *
        + *
      • a bound buffer object
      • + *
      • a starting offset for the vertex attribute data in that buffer object
      • + *
      • a stride used by all attributes using that binding point, and
      • + *
      • a frequency divisor used by all attributes using that binding point.
      • + *
    • + *
    • An array of generic vertex attribute format information records, each of which specifies: + * + *
        + *
      • a reference to one of the new buffer binding points above
      • + *
      • a component count and format, and a normalization flag for the attribute data, and
      • + *
      • the offset of the attribute data relative to the base offset of each vertex found at the associated binding point.
      • + *
    • + *
    + * + *

    Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class ARBVertexAttribBinding { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetVertexAttrib*v. */ + public static final int + GL_VERTEX_ATTRIB_BINDING = 0x82D4, + GL_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D5; + + /** Accepted by the {@code target} parameter of GetBooleani_v, GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v. */ + public static final int + GL_VERTEX_BINDING_DIVISOR = 0x82D6, + GL_VERTEX_BINDING_OFFSET = 0x82D7, + GL_VERTEX_BINDING_STRIDE = 0x82D8, + GL_VERTEX_BINDING_BUFFER = 0x8F4F; + + /** Accepted by the {@code pname} parameter of GetIntegerv, .... */ + public static final int + GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D9, + GL_MAX_VERTEX_ATTRIB_BINDINGS = 0x82DA; + + protected ARBVertexAttribBinding() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindVertexBuffer ] --- + + /** + * Binds a buffer to a vertex buffer bind point. + * + * @param bindingindex the index of the vertex buffer binding point to which to bind the buffer + * @param buffer the name of an existing buffer to bind to the vertex buffer binding point + * @param offset the offset of the first element of the buffer + * @param stride the distance between elements within the buffer + */ + public static void glBindVertexBuffer(@NativeType("GLuint") int bindingindex, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizei") int stride) { + GL43C.glBindVertexBuffer(bindingindex, buffer, offset, stride); + } + + // --- [ glVertexAttribFormat ] --- + + /** + * Specifies the organization of data in vertex arrays. + * + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param normalized if true then integer data is normalized to the range [-1, 1] or [0, 1] if it is signed or unsigned, respectively. If false then integer data is + * directly converted to floating point. + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + */ + public static void glVertexAttribFormat(@NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int relativeoffset) { + GL43C.glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset); + } + + // --- [ glVertexAttribIFormat ] --- + + /** + * Specifies the organization of pure integer data in vertex arrays. + * + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + */ + public static void glVertexAttribIFormat(@NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset) { + GL43C.glVertexAttribIFormat(attribindex, size, type, relativeoffset); + } + + // --- [ glVertexAttribLFormat ] --- + + /** + * Specifies the organization of 64-bit double data in vertex arrays. + * + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + */ + public static void glVertexAttribLFormat(@NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset) { + GL43C.glVertexAttribLFormat(attribindex, size, type, relativeoffset); + } + + // --- [ glVertexAttribBinding ] --- + + /** + * Associate a vertex attribute and a vertex buffer binding. + * + * @param attribindex the index of the attribute to associate with a vertex buffer binding + * @param bindingindex the index of the vertex buffer binding with which to associate the generic vertex attribute + */ + public static void glVertexAttribBinding(@NativeType("GLuint") int attribindex, @NativeType("GLuint") int bindingindex) { + GL43C.glVertexAttribBinding(attribindex, bindingindex); + } + + // --- [ glVertexBindingDivisor ] --- + + /** + * Modifies the rate at which generic vertex attributes advance during instanced rendering. + * + * @param bindingindex the index of the generic vertex attribute + * @param divisor the number of instances that will pass between updates of the generic attribute at slot {@code index} + */ + public static void glVertexBindingDivisor(@NativeType("GLuint") int bindingindex, @NativeType("GLuint") int divisor) { + GL43C.glVertexBindingDivisor(bindingindex, divisor); + } + + // --- [ glVertexArrayBindVertexBufferEXT ] --- + + /** + * DSA version of {@link #glBindVertexBuffer BindVertexBuffer}. + * + * @param vaobj the vertex array object + * @param bindingindex the index of the vertex buffer binding point to which to bind the buffer + * @param buffer the name of an existing buffer to bind to the vertex buffer binding point + * @param offset the offset of the first element of the buffer + * @param stride the distance between elements within the buffer + */ + public static native void glVertexArrayBindVertexBufferEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int bindingindex, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizei") int stride); + + // --- [ glVertexArrayVertexAttribFormatEXT ] --- + + /** + * DSA version of {@link #glVertexAttribFormat VertexAttribFormat}. + * + * @param vaobj the vertex array object + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param normalized if true then integer data is normalized to the range [-1, 1] or [0, 1] if it is signed or unsigned, respectively. If false then integer data is + * directly converted to floating point. + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + */ + public static native void glVertexArrayVertexAttribFormatEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int relativeoffset); + + // --- [ glVertexArrayVertexAttribIFormatEXT ] --- + + /** + * DSA version of {@link #glVertexAttribIFormat VertexAttribIFormat}. + * + * @param vaobj the vertex array object + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + */ + public static native void glVertexArrayVertexAttribIFormatEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset); + + // --- [ glVertexArrayVertexAttribLFormatEXT ] --- + + /** + * DSA version of {@link #glVertexAttribLFormat VertexAttribLFormat}. + * + * @param vaobj the vertex array object + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + */ + public static native void glVertexArrayVertexAttribLFormatEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset); + + // --- [ glVertexArrayVertexAttribBindingEXT ] --- + + /** + * DSA version of {@link #glVertexAttribBinding VertexAttribBinding}. + * + * @param vaobj the vertex array object + * @param attribindex the index of the attribute to associate with a vertex buffer binding + * @param bindingindex the index of the vertex buffer binding with which to associate the generic vertex attribute + */ + public static native void glVertexArrayVertexAttribBindingEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLuint") int bindingindex); + + // --- [ glVertexArrayVertexBindingDivisorEXT ] --- + + /** + * DSA version of {@link #glVertexBindingDivisor VertexBindingDivisor}. + * + * @param vaobj the vertex array object + * @param bindingindex the index of the generic vertex attribute + * @param divisor the number of instances that will pass between updates of the generic attribute at slot {@code index} + */ + public static native void glVertexArrayVertexBindingDivisorEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int bindingindex, @NativeType("GLuint") int divisor); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexBlend.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexBlend.java new file mode 100644 index 000000000..c6fbb78b1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexBlend.java @@ -0,0 +1,398 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_vertex_blend extension. + * + *

    This extension provides the ability to replace the single modelview transformation with a set of n vertex units. (Where n is constrained to an + * implementation defined maximum.) Each unit has its own modelview transform matrix. For each unit, there is a current weight associated with the vertex. + * When this extension is enabled the vertices are transformed by the modelview matrices of all of the enabled units. Afterward, these results are scaled + * by the weights for the respective units and then summed to create the eye-space vertex. A similar procedure is followed for the normals, except they are + * transformed by the inverse transpose of the modelview matrices.

    + */ +public class ARBVertexBlend { + + static { GL.initialize(); } + + /** Accepted by the {@code value} parameters of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_UNITS_ARB = 0x86A4, + GL_ACTIVE_VERTEX_UNITS_ARB = 0x86A5; + + /** + * Accepted by the {@code cap} parameters of Enable and Disable, by the {@code value} parameter of IsEnabled, GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int + GL_WEIGHT_SUM_UNITY_ARB = 0x86A6, + GL_VERTEX_BLEND_ARB = 0x86A7; + + /** Accepted by the {@code mode} parameter of MatrixMode and by the {@code value} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MODELVIEW0_ARB = 0x1700, + GL_MODELVIEW1_ARB = 0x850A, + GL_MODELVIEW2_ARB = 0x8722, + GL_MODELVIEW3_ARB = 0x8723, + GL_MODELVIEW4_ARB = 0x8724, + GL_MODELVIEW5_ARB = 0x8725, + GL_MODELVIEW6_ARB = 0x8726, + GL_MODELVIEW7_ARB = 0x8727, + GL_MODELVIEW8_ARB = 0x8728, + GL_MODELVIEW9_ARB = 0x8729, + GL_MODELVIEW10_ARB = 0x872A, + GL_MODELVIEW11_ARB = 0x872B, + GL_MODELVIEW12_ARB = 0x872C, + GL_MODELVIEW13_ARB = 0x872D, + GL_MODELVIEW14_ARB = 0x872E, + GL_MODELVIEW15_ARB = 0x872F, + GL_MODELVIEW16_ARB = 0x8730, + GL_MODELVIEW17_ARB = 0x8731, + GL_MODELVIEW18_ARB = 0x8732, + GL_MODELVIEW19_ARB = 0x8733, + GL_MODELVIEW20_ARB = 0x8734, + GL_MODELVIEW21_ARB = 0x8735, + GL_MODELVIEW22_ARB = 0x8736, + GL_MODELVIEW23_ARB = 0x8737, + GL_MODELVIEW24_ARB = 0x8738, + GL_MODELVIEW25_ARB = 0x8739, + GL_MODELVIEW26_ARB = 0x873A, + GL_MODELVIEW27_ARB = 0x873B, + GL_MODELVIEW28_ARB = 0x873C, + GL_MODELVIEW29_ARB = 0x873D, + GL_MODELVIEW30_ARB = 0x873E, + GL_MODELVIEW31_ARB = 0x873F; + + /** Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_CURRENT_WEIGHT_ARB = 0x86A8; + + /** Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_WEIGHT_ARRAY_TYPE_ARB = 0x86A9, + GL_WEIGHT_ARRAY_STRIDE_ARB = 0x86AA, + GL_WEIGHT_ARRAY_SIZE_ARB = 0x86AB; + + /** Accepted by the {@code pname} parameter of GetPointerv. */ + public static final int GL_WEIGHT_ARRAY_POINTER_ARB = 0x86AC; + + /** + * Accepted by the {@code cap} parameters of EnableClientState and DisableClientState, by the {@code value} parameter of IsEnabled, GetBooleanv, + * GetIntegerv, GetFloatv, and GetDoublev. + */ + public static final int GL_WEIGHT_ARRAY_ARB = 0x86AD; + + protected ARBVertexBlend() { + throw new UnsupportedOperationException(); + } + + // --- [ glWeightfvARB ] --- + + /** + * Unsafe version of: {@link #glWeightfvARB WeightfvARB} + * + * @param size the number of weights to set. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + */ + public static native void nglWeightfvARB(int size, long weights); + + /** + * Sets the current vertex weights. + * + * @param weights the vertex weights + */ + public static void glWeightfvARB(@NativeType("GLfloat *") FloatBuffer weights) { + nglWeightfvARB(weights.remaining(), memAddress(weights)); + } + + // --- [ glWeightbvARB ] --- + + /** + * Unsafe version of: {@link #glWeightbvARB WeightbvARB} + * + * @param size the number of weights to set. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + */ + public static native void nglWeightbvARB(int size, long weights); + + /** + * Byte version of {@link #glWeightfvARB WeightfvARB}. + * + * @param weights the vertex weights + */ + public static void glWeightbvARB(@NativeType("GLbyte *") ByteBuffer weights) { + nglWeightbvARB(weights.remaining(), memAddress(weights)); + } + + // --- [ glWeightubvARB ] --- + + /** + * Unsafe version of: {@link #glWeightubvARB WeightubvARB} + * + * @param size the number of weights to set. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + */ + public static native void nglWeightubvARB(int size, long weights); + + /** + * Unsigned byte version of {@link #glWeightfvARB WeightfvARB}. + * + * @param weights the vertex weights + */ + public static void glWeightubvARB(@NativeType("GLubyte *") ByteBuffer weights) { + nglWeightubvARB(weights.remaining(), memAddress(weights)); + } + + // --- [ glWeightsvARB ] --- + + /** + * Unsafe version of: {@link #glWeightsvARB WeightsvARB} + * + * @param size the number of weights to set. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + */ + public static native void nglWeightsvARB(int size, long weights); + + /** + * Short version of {@link #glWeightfvARB WeightfvARB}. + * + * @param weights the vertex weights + */ + public static void glWeightsvARB(@NativeType("GLshort *") ShortBuffer weights) { + nglWeightsvARB(weights.remaining(), memAddress(weights)); + } + + // --- [ glWeightusvARB ] --- + + /** + * Unsafe version of: {@link #glWeightusvARB WeightusvARB} + * + * @param size the number of weights to set. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + */ + public static native void nglWeightusvARB(int size, long weights); + + /** + * Unsigned short version of {@link #glWeightfvARB WeightfvARB}. + * + * @param weights the vertex weights + */ + public static void glWeightusvARB(@NativeType("GLushort *") ShortBuffer weights) { + nglWeightusvARB(weights.remaining(), memAddress(weights)); + } + + // --- [ glWeightivARB ] --- + + /** + * Unsafe version of: {@link #glWeightivARB WeightivARB} + * + * @param size the number of weights to set. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + */ + public static native void nglWeightivARB(int size, long weights); + + /** + * Integer version of {@link #glWeightfvARB WeightfvARB}. + * + * @param weights the vertex weights + */ + public static void glWeightivARB(@NativeType("GLint *") IntBuffer weights) { + nglWeightivARB(weights.remaining(), memAddress(weights)); + } + + // --- [ glWeightuivARB ] --- + + /** + * Unsafe version of: {@link #glWeightuivARB WeightuivARB} + * + * @param size the number of weights to set. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + */ + public static native void nglWeightuivARB(int size, long weights); + + /** + * Unsigned integer version of {@link #glWeightfvARB WeightfvARB}. + * + * @param weights the vertex weights + */ + public static void glWeightuivARB(@NativeType("GLuint *") IntBuffer weights) { + nglWeightuivARB(weights.remaining(), memAddress(weights)); + } + + // --- [ glWeightdvARB ] --- + + /** + * Unsafe version of: {@link #glWeightdvARB WeightdvARB} + * + * @param size the number of weights to set. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + */ + public static native void nglWeightdvARB(int size, long weights); + + /** + * Double version of {@link #glWeightfvARB WeightfvARB}. + * + * @param weights the vertex weights + */ + public static void glWeightdvARB(@NativeType("GLdouble *") DoubleBuffer weights) { + nglWeightdvARB(weights.remaining(), memAddress(weights)); + } + + // --- [ glWeightPointerARB ] --- + + /** Unsafe version of: {@link #glWeightPointerARB WeightPointerARB} */ + public static native void nglWeightPointerARB(int size, int type, int stride, long pointer); + + /** + * Specifies the location and organization of a weight array. + * + * @param size the number of values per vertex that are stored in the array. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the weight data + */ + public static void glWeightPointerARB(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglWeightPointerARB(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a weight array. + * + * @param size the number of values per vertex that are stored in the array. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the weight data + */ + public static void glWeightPointerARB(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglWeightPointerARB(size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a weight array. + * + * @param size the number of values per vertex that are stored in the array. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the weight data + */ + public static void glWeightPointerARB(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglWeightPointerARB(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a weight array. + * + * @param size the number of values per vertex that are stored in the array. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the weight data + */ + public static void glWeightPointerARB(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglWeightPointerARB(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a weight array. + * + * @param size the number of values per vertex that are stored in the array. Must be a value between 1 and {@link #GL_MAX_VERTEX_UNITS_ARB MAX_VERTEX_UNITS_ARB}. + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the weight data + */ + public static void glWeightPointerARB(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglWeightPointerARB(size, type, stride, memAddress(pointer)); + } + + // --- [ glVertexBlendARB ] --- + + /** + * Sets the number of active transformations applied. + * + * @param count the number of transformations to blend + */ + public static native void glVertexBlendARB(@NativeType("GLint") int count); + + /** Array version of: {@link #glWeightfvARB WeightfvARB} */ + public static void glWeightfvARB(@NativeType("GLfloat *") float[] weights) { + long __functionAddress = GL.getICD().glWeightfvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(weights.length, weights, __functionAddress); + } + + /** Array version of: {@link #glWeightsvARB WeightsvARB} */ + public static void glWeightsvARB(@NativeType("GLshort *") short[] weights) { + long __functionAddress = GL.getICD().glWeightsvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(weights.length, weights, __functionAddress); + } + + /** Array version of: {@link #glWeightusvARB WeightusvARB} */ + public static void glWeightusvARB(@NativeType("GLushort *") short[] weights) { + long __functionAddress = GL.getICD().glWeightusvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(weights.length, weights, __functionAddress); + } + + /** Array version of: {@link #glWeightivARB WeightivARB} */ + public static void glWeightivARB(@NativeType("GLint *") int[] weights) { + long __functionAddress = GL.getICD().glWeightivARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(weights.length, weights, __functionAddress); + } + + /** Array version of: {@link #glWeightuivARB WeightuivARB} */ + public static void glWeightuivARB(@NativeType("GLuint *") int[] weights) { + long __functionAddress = GL.getICD().glWeightuivARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(weights.length, weights, __functionAddress); + } + + /** Array version of: {@link #glWeightdvARB WeightdvARB} */ + public static void glWeightdvARB(@NativeType("GLdouble *") double[] weights) { + long __functionAddress = GL.getICD().glWeightdvARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(weights.length, weights, __functionAddress); + } + + /** Array version of: {@link #glWeightPointerARB WeightPointerARB} */ + public static void glWeightPointerARB(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") short[] pointer) { + long __functionAddress = GL.getICD().glWeightPointerARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(size, type, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glWeightPointerARB WeightPointerARB} */ + public static void glWeightPointerARB(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") int[] pointer) { + long __functionAddress = GL.getICD().glWeightPointerARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(size, type, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glWeightPointerARB WeightPointerARB} */ + public static void glWeightPointerARB(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") float[] pointer) { + long __functionAddress = GL.getICD().glWeightPointerARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(size, type, stride, pointer, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexBufferObject.java new file mode 100644 index 000000000..fcb58b07b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexBufferObject.java @@ -0,0 +1,811 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_vertex_buffer_object extension. + * + *

    This extension defines an interface that allows various types of data (especially vertex array data) to be cached in high-performance graphics memory on + * the server, thereby increasing the rate of data transfers.

    + * + *

    Chunks of data are encapsulated within "buffer objects", which conceptually are nothing more than arrays of bytes, just like any chunk of memory. An API + * is provided whereby applications can read from or write to buffers, either via the GL itself ({@link #glBufferDataARB BufferDataARB}, {@link #glBufferSubDataARB BufferSubDataARB}, + * {@link #glGetBufferSubDataARB GetBufferSubDataARB}) or via a pointer to the memory.

    + * + *

    The latter technique is known as "mapping" a buffer. When an application maps a buffer, it is given a pointer to the memory. When the application + * finishes reading from or writing to the memory, it is required to "unmap" the buffer before it is once again permitted to use that buffer as a GL data + * source or sink. Mapping often allows applications to eliminate an extra data copy otherwise required to access the buffer, thereby enhancing + * performance. In addition, requiring that applications unmap the buffer to use it as a data source or sink ensures that certain classes of latent + * synchronization bugs cannot occur.

    + * + *

    Although this extension only defines hooks for buffer objects to be used with OpenGL's vertex array APIs, the API defined in this extension permits + * buffer objects to be used as either data sources or sinks for any GL command that takes a pointer as an argument. Normally, in the absence of this + * extension, a pointer passed into the GL is simply a pointer to the user's data. This extension defines a mechanism whereby this pointer is used not as a + * pointer to the data itself, but as an offset into a currently bound buffer object. The buffer object ID zero is reserved, and when buffer object zero is + * bound to a given target, the commands affected by that buffer binding behave normally. When a nonzero buffer ID is bound, then the pointer represents an + * offset.

    + * + *

    In the case of vertex arrays, this extension defines not merely one binding for all attributes, but a separate binding for each individual attribute. As + * a result, applications can source their attributes from multiple buffers. An application might, for example, have a model with constant texture + * coordinates and variable geometry. The texture coordinates might be retrieved from a buffer object with the usage mode "STATIC_DRAW", indicating to the + * GL that the application does not expect to update the contents of the buffer frequently or even at all, while the vertices might be retrieved from a + * buffer object with the usage mode "STREAM_DRAW", indicating that the vertices will be updated on a regular basis.

    + * + *

    In addition, a binding is defined by which applications can source index data (as used by {@link GL11C#glDrawElements DrawElements}, {@link GL12C#glDrawRangeElements DrawRangeElements}, and + * {@link GL14C#glMultiDrawElements MultiDrawElements}) from a buffer object. On some platforms, this enables very large models to be rendered with no more than a few small commands + * to the graphics device.

    + * + *

    It is expected that a future extension will allow sourcing pixel data from and writing pixel data to a buffer object.

    + * + *

    Promoted to core in {@link GL15 OpenGL 1.5}.

    + */ +public class ARBVertexBufferObject { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameters of BindBufferARB, BufferDataARB, BufferSubDataARB, MapBufferARB, UnmapBufferARB, GetBufferSubDataARB, + * GetBufferParameterivARB, and GetBufferPointervARB. + */ + public static final int + GL_ARRAY_BUFFER_ARB = 0x8892, + GL_ELEMENT_ARRAY_BUFFER_ARB = 0x8893; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_ARRAY_BUFFER_BINDING_ARB = 0x8894, + GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB = 0x8895, + GL_VERTEX_ARRAY_BUFFER_BINDING_ARB = 0x8896, + GL_NORMAL_ARRAY_BUFFER_BINDING_ARB = 0x8897, + GL_COLOR_ARRAY_BUFFER_BINDING_ARB = 0x8898, + GL_INDEX_ARRAY_BUFFER_BINDING_ARB = 0x8899, + GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB = 0x889A, + GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB = 0x889B, + GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB = 0x889C, + GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB = 0x889D, + GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB = 0x889E; + + /** Accepted by the {@code pname} parameter of GetVertexAttribivARB. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB = 0x889F; + + /** Accepted by the {@code usage} parameter of BufferDataARB. */ + public static final int + GL_STREAM_DRAW_ARB = 0x88E0, + GL_STREAM_READ_ARB = 0x88E1, + GL_STREAM_COPY_ARB = 0x88E2, + GL_STATIC_DRAW_ARB = 0x88E4, + GL_STATIC_READ_ARB = 0x88E5, + GL_STATIC_COPY_ARB = 0x88E6, + GL_DYNAMIC_DRAW_ARB = 0x88E8, + GL_DYNAMIC_READ_ARB = 0x88E9, + GL_DYNAMIC_COPY_ARB = 0x88EA; + + /** Accepted by the {@code access} parameter of MapBufferARB. */ + public static final int + GL_READ_ONLY_ARB = 0x88B8, + GL_WRITE_ONLY_ARB = 0x88B9, + GL_READ_WRITE_ARB = 0x88BA; + + /** Accepted by the {@code pname} parameter of GetBufferParameterivARB. */ + public static final int + GL_BUFFER_SIZE_ARB = 0x8764, + GL_BUFFER_USAGE_ARB = 0x8765, + GL_BUFFER_ACCESS_ARB = 0x88BB, + GL_BUFFER_MAPPED_ARB = 0x88BC; + + /** Accepted by the {@code pname} parameter of GetBufferPointervARB. */ + public static final int GL_BUFFER_MAP_POINTER_ARB = 0x88BD; + + protected ARBVertexBufferObject() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindBufferARB ] --- + + /** + * Binds a named buffer object. + * + * @param target the target to which the buffer object is bound. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param buffer the name of a buffer object + */ + public static native void glBindBufferARB(@NativeType("GLenum") int target, @NativeType("GLuint") int buffer); + + // --- [ glDeleteBuffersARB ] --- + + /** + * Unsafe version of: {@link #glDeleteBuffersARB DeleteBuffersARB} + * + * @param n the number of buffer objects to be deleted + */ + public static native void nglDeleteBuffersARB(int n, long buffers); + + /** + * Deletes named buffer objects. + * + * @param buffers an array of buffer objects to be deleted + */ + public static void glDeleteBuffersARB(@NativeType("GLuint const *") IntBuffer buffers) { + nglDeleteBuffersARB(buffers.remaining(), memAddress(buffers)); + } + + /** Deletes named buffer objects. */ + public static void glDeleteBuffersARB(@NativeType("GLuint const *") int buffer) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer buffers = stack.ints(buffer); + nglDeleteBuffersARB(1, memAddress(buffers)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenBuffersARB ] --- + + /** + * Unsafe version of: {@link #glGenBuffersARB GenBuffersARB} + * + * @param n the number of buffer object names to be generated + */ + public static native void nglGenBuffersARB(int n, long buffers); + + /** + * Generates buffer object names. + * + * @param buffers a buffer in which the generated buffer object names are stored + */ + public static void glGenBuffersARB(@NativeType("GLuint *") IntBuffer buffers) { + nglGenBuffersARB(buffers.remaining(), memAddress(buffers)); + } + + /** Generates buffer object names. */ + @NativeType("void") + public static int glGenBuffersARB() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer buffers = stack.callocInt(1); + nglGenBuffersARB(1, memAddress(buffers)); + return buffers.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsBufferARB ] --- + + /** + * Determines if a name corresponds to a buffer object. + * + * @param buffer a value that may be the name of a buffer object + */ + @NativeType("GLboolean") + public static native boolean glIsBufferARB(@NativeType("GLuint") int buffer); + + // --- [ glBufferDataARB ] --- + + /** + * Unsafe version of: {@link #glBufferDataARB BufferDataARB} + * + * @param size the size in bytes of the buffer object's new data store + */ + public static native void nglBufferDataARB(int target, long size, long data, int usage); + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param size the size in bytes of the buffer object's new data store + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW_ARB STREAM_DRAW_ARB}{@link #GL_STREAM_READ_ARB STREAM_READ_ARB}{@link #GL_STREAM_COPY_ARB STREAM_COPY_ARB}{@link #GL_STATIC_DRAW_ARB STATIC_DRAW_ARB}{@link #GL_STATIC_READ_ARB STATIC_READ_ARB}
    {@link #GL_STATIC_COPY_ARB STATIC_COPY_ARB}{@link #GL_DYNAMIC_DRAW_ARB DYNAMIC_DRAW_ARB}{@link #GL_DYNAMIC_READ_ARB DYNAMIC_READ_ARB}{@link #GL_DYNAMIC_COPY_ARB DYNAMIC_COPY_ARB}
    + */ + public static void glBufferDataARB(@NativeType("GLenum") int target, @NativeType("GLsizeiptrARB") long size, @NativeType("GLenum") int usage) { + nglBufferDataARB(target, size, NULL, usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW_ARB STREAM_DRAW_ARB}{@link #GL_STREAM_READ_ARB STREAM_READ_ARB}{@link #GL_STREAM_COPY_ARB STREAM_COPY_ARB}{@link #GL_STATIC_DRAW_ARB STATIC_DRAW_ARB}{@link #GL_STATIC_READ_ARB STATIC_READ_ARB}
    {@link #GL_STATIC_COPY_ARB STATIC_COPY_ARB}{@link #GL_DYNAMIC_DRAW_ARB DYNAMIC_DRAW_ARB}{@link #GL_DYNAMIC_READ_ARB DYNAMIC_READ_ARB}{@link #GL_DYNAMIC_COPY_ARB DYNAMIC_COPY_ARB}
    + */ + public static void glBufferDataARB(@NativeType("GLenum") int target, @NativeType("void const *") ByteBuffer data, @NativeType("GLenum") int usage) { + nglBufferDataARB(target, data.remaining(), memAddress(data), usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW_ARB STREAM_DRAW_ARB}{@link #GL_STREAM_READ_ARB STREAM_READ_ARB}{@link #GL_STREAM_COPY_ARB STREAM_COPY_ARB}{@link #GL_STATIC_DRAW_ARB STATIC_DRAW_ARB}{@link #GL_STATIC_READ_ARB STATIC_READ_ARB}
    {@link #GL_STATIC_COPY_ARB STATIC_COPY_ARB}{@link #GL_DYNAMIC_DRAW_ARB DYNAMIC_DRAW_ARB}{@link #GL_DYNAMIC_READ_ARB DYNAMIC_READ_ARB}{@link #GL_DYNAMIC_COPY_ARB DYNAMIC_COPY_ARB}
    + */ + public static void glBufferDataARB(@NativeType("GLenum") int target, @NativeType("void const *") ShortBuffer data, @NativeType("GLenum") int usage) { + nglBufferDataARB(target, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data), usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW_ARB STREAM_DRAW_ARB}{@link #GL_STREAM_READ_ARB STREAM_READ_ARB}{@link #GL_STREAM_COPY_ARB STREAM_COPY_ARB}{@link #GL_STATIC_DRAW_ARB STATIC_DRAW_ARB}{@link #GL_STATIC_READ_ARB STATIC_READ_ARB}
    {@link #GL_STATIC_COPY_ARB STATIC_COPY_ARB}{@link #GL_DYNAMIC_DRAW_ARB DYNAMIC_DRAW_ARB}{@link #GL_DYNAMIC_READ_ARB DYNAMIC_READ_ARB}{@link #GL_DYNAMIC_COPY_ARB DYNAMIC_COPY_ARB}
    + */ + public static void glBufferDataARB(@NativeType("GLenum") int target, @NativeType("void const *") IntBuffer data, @NativeType("GLenum") int usage) { + nglBufferDataARB(target, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW_ARB STREAM_DRAW_ARB}{@link #GL_STREAM_READ_ARB STREAM_READ_ARB}{@link #GL_STREAM_COPY_ARB STREAM_COPY_ARB}{@link #GL_STATIC_DRAW_ARB STATIC_DRAW_ARB}{@link #GL_STATIC_READ_ARB STATIC_READ_ARB}
    {@link #GL_STATIC_COPY_ARB STATIC_COPY_ARB}{@link #GL_DYNAMIC_DRAW_ARB DYNAMIC_DRAW_ARB}{@link #GL_DYNAMIC_READ_ARB DYNAMIC_READ_ARB}{@link #GL_DYNAMIC_COPY_ARB DYNAMIC_COPY_ARB}
    + */ + public static void glBufferDataARB(@NativeType("GLenum") int target, @NativeType("void const *") FloatBuffer data, @NativeType("GLenum") int usage) { + nglBufferDataARB(target, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW_ARB STREAM_DRAW_ARB}{@link #GL_STREAM_READ_ARB STREAM_READ_ARB}{@link #GL_STREAM_COPY_ARB STREAM_COPY_ARB}{@link #GL_STATIC_DRAW_ARB STATIC_DRAW_ARB}{@link #GL_STATIC_READ_ARB STATIC_READ_ARB}
    {@link #GL_STATIC_COPY_ARB STATIC_COPY_ARB}{@link #GL_DYNAMIC_DRAW_ARB DYNAMIC_DRAW_ARB}{@link #GL_DYNAMIC_READ_ARB DYNAMIC_READ_ARB}{@link #GL_DYNAMIC_COPY_ARB DYNAMIC_COPY_ARB}
    + */ + public static void glBufferDataARB(@NativeType("GLenum") int target, @NativeType("void const *") DoubleBuffer data, @NativeType("GLenum") int usage) { + nglBufferDataARB(target, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data), usage); + } + + // --- [ glBufferSubDataARB ] --- + + /** + * Unsafe version of: {@link #glBufferSubDataARB BufferSubDataARB} + * + * @param size the size in bytes of the data store region being replaced + */ + public static native void nglBufferSubDataARB(int target, long offset, long size, long data); + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + */ + public static void glBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void const *") ByteBuffer data) { + nglBufferSubDataARB(target, offset, data.remaining(), memAddress(data)); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + */ + public static void glBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void const *") ShortBuffer data) { + nglBufferSubDataARB(target, offset, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data)); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + */ + public static void glBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void const *") IntBuffer data) { + nglBufferSubDataARB(target, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + */ + public static void glBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void const *") FloatBuffer data) { + nglBufferSubDataARB(target, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + */ + public static void glBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void const *") DoubleBuffer data) { + nglBufferSubDataARB(target, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + // --- [ glGetBufferSubDataARB ] --- + + /** + * Unsafe version of: {@link #glGetBufferSubDataARB GetBufferSubDataARB} + * + * @param size the size in bytes of the data store region being returned + */ + public static native void nglGetBufferSubDataARB(int target, long offset, long size, long data); + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + */ + public static void glGetBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void *") ByteBuffer data) { + nglGetBufferSubDataARB(target, offset, data.remaining(), memAddress(data)); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + */ + public static void glGetBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void *") ShortBuffer data) { + nglGetBufferSubDataARB(target, offset, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data)); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + */ + public static void glGetBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void *") IntBuffer data) { + nglGetBufferSubDataARB(target, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + */ + public static void glGetBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void *") FloatBuffer data) { + nglGetBufferSubDataARB(target, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + */ + public static void glGetBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void *") DoubleBuffer data) { + nglGetBufferSubDataARB(target, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + // --- [ glMapBufferARB ] --- + + /** Unsafe version of: {@link #glMapBufferARB MapBufferARB} */ + public static native long nglMapBufferARB(int target, int access); + + /** + * Maps a buffer object's data store. + * + *

    LWJGL note: This method comes in 3 flavors:

    + * + *
      + *
    1. {@link #glMapBufferARB(int, int)} - Calls {@link #glGetBufferParameterivARB GetBufferParameterivARB} to retrieve the buffer size and a new ByteBuffer instance is always returned.
    2. + *
    3. {@link #glMapBufferARB(int, int, ByteBuffer)} - Calls {@link #glGetBufferParameterivARB GetBufferParameterivARB} to retrieve the buffer size and the {@code old_buffer} parameter is reused if not null.
    4. + *
    5. {@link #glMapBufferARB(int, int, long, ByteBuffer)} - The buffer size is explicitly specified and the {@code old_buffer} parameter is reused if not null. This is the most efficient method.
    6. + *
    + * + * @param target the target buffer object being mapped. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link #GL_READ_ONLY_ARB READ_ONLY_ARB}{@link #GL_WRITE_ONLY_ARB WRITE_ONLY_ARB}{@link #GL_READ_WRITE_ARB READ_WRITE_ARB}
    + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBufferARB(@NativeType("GLenum") int target, @NativeType("GLenum") int access) { + long __result = nglMapBufferARB(target, access); + return memByteBufferSafe(__result, glGetBufferParameteriARB(target, GL_BUFFER_SIZE_ARB)); + } + + /** + * Maps a buffer object's data store. + * + *

    LWJGL note: This method comes in 3 flavors:

    + * + *
      + *
    1. {@link #glMapBufferARB(int, int)} - Calls {@link #glGetBufferParameterivARB GetBufferParameterivARB} to retrieve the buffer size and a new ByteBuffer instance is always returned.
    2. + *
    3. {@link #glMapBufferARB(int, int, ByteBuffer)} - Calls {@link #glGetBufferParameterivARB GetBufferParameterivARB} to retrieve the buffer size and the {@code old_buffer} parameter is reused if not null.
    4. + *
    5. {@link #glMapBufferARB(int, int, long, ByteBuffer)} - The buffer size is explicitly specified and the {@code old_buffer} parameter is reused if not null. This is the most efficient method.
    6. + *
    + * + * @param target the target buffer object being mapped. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link #GL_READ_ONLY_ARB READ_ONLY_ARB}{@link #GL_WRITE_ONLY_ARB WRITE_ONLY_ARB}{@link #GL_READ_WRITE_ARB READ_WRITE_ARB}
    + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBufferARB(@NativeType("GLenum") int target, @NativeType("GLenum") int access, @Nullable ByteBuffer old_buffer) { + long __result = nglMapBufferARB(target, access); + int length = glGetBufferParameteriARB(target, GL_BUFFER_SIZE_ARB); + return apiGetMappedBuffer(old_buffer, __result, length); + } + + /** + * Maps a buffer object's data store. + * + *

    LWJGL note: This method comes in 3 flavors:

    + * + *
      + *
    1. {@link #glMapBufferARB(int, int)} - Calls {@link #glGetBufferParameterivARB GetBufferParameterivARB} to retrieve the buffer size and a new ByteBuffer instance is always returned.
    2. + *
    3. {@link #glMapBufferARB(int, int, ByteBuffer)} - Calls {@link #glGetBufferParameterivARB GetBufferParameterivARB} to retrieve the buffer size and the {@code old_buffer} parameter is reused if not null.
    4. + *
    5. {@link #glMapBufferARB(int, int, long, ByteBuffer)} - The buffer size is explicitly specified and the {@code old_buffer} parameter is reused if not null. This is the most efficient method.
    6. + *
    + * + * @param target the target buffer object being mapped. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link #GL_READ_ONLY_ARB READ_ONLY_ARB}{@link #GL_WRITE_ONLY_ARB WRITE_ONLY_ARB}{@link #GL_READ_WRITE_ARB READ_WRITE_ARB}
    + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBufferARB(@NativeType("GLenum") int target, @NativeType("GLenum") int access, long length, @Nullable ByteBuffer old_buffer) { + long __result = nglMapBufferARB(target, access); + return apiGetMappedBuffer(old_buffer, __result, (int)length); + } + + // --- [ glUnmapBufferARB ] --- + + /** + * Relinquishes the mapping of a buffer object and invalidates the pointer to its data store. + * + *

    Returns TRUE unless data values in the buffer’s data store have become corrupted during the period that the buffer was mapped. Such corruption can be + * the result of a screen resolution change or other window system-dependent event that causes system heaps such as those for high-performance graphics + * memory to be discarded. GL implementations must guarantee that such corruption can occur only during the periods that a buffer’s data store is mapped. + * If such corruption has occurred, UnmapBuffer returns FALSE, and the contents of the buffer’s data store become undefined.

    + * + * @param target the target buffer object being unmapped. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + */ + @NativeType("GLboolean") + public static native boolean glUnmapBufferARB(@NativeType("GLenum") int target); + + // --- [ glGetBufferParameterivARB ] --- + + /** Unsafe version of: {@link #glGetBufferParameterivARB GetBufferParameterivARB} */ + public static native void nglGetBufferParameterivARB(int target, int pname, long params); + + /** + * Returns the value of a buffer object parameter. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * @param params the requested parameter + */ + public static void glGetBufferParameterivARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetBufferParameterivARB(target, pname, memAddress(params)); + } + + /** + * Returns the value of a buffer object parameter. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + */ + @NativeType("void") + public static int glGetBufferParameteriARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetBufferParameterivARB(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetBufferPointervARB ] --- + + /** Unsafe version of: {@link #glGetBufferPointervARB GetBufferPointervARB} */ + public static native void nglGetBufferPointervARB(int target, int pname, long params); + + /** + * Returns the pointer to a mapped buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the pointer to be returned. Must be:
    {@link #GL_BUFFER_MAP_POINTER_ARB BUFFER_MAP_POINTER_ARB}
    + * @param params the pointer value specified by {@code pname} + */ + public static void glGetBufferPointervARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetBufferPointervARB(target, pname, memAddress(params)); + } + + /** + * Returns the pointer to a mapped buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the pointer to be returned. Must be:
    {@link #GL_BUFFER_MAP_POINTER_ARB BUFFER_MAP_POINTER_ARB}
    + */ + @NativeType("void") + public static long glGetBufferPointerARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer params = stack.callocPointer(1); + nglGetBufferPointervARB(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glDeleteBuffersARB DeleteBuffersARB} */ + public static void glDeleteBuffersARB(@NativeType("GLuint const *") int[] buffers) { + long __functionAddress = GL.getICD().glDeleteBuffersARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffers.length, buffers, __functionAddress); + } + + /** Array version of: {@link #glGenBuffersARB GenBuffersARB} */ + public static void glGenBuffersARB(@NativeType("GLuint *") int[] buffers) { + long __functionAddress = GL.getICD().glGenBuffersARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffers.length, buffers, __functionAddress); + } + + /** Array version of: {@link #glBufferDataARB BufferDataARB} */ + public static void glBufferDataARB(@NativeType("GLenum") int target, @NativeType("void const *") short[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glBufferDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 1, data, usage, __functionAddress); + } + + /** Array version of: {@link #glBufferDataARB BufferDataARB} */ + public static void glBufferDataARB(@NativeType("GLenum") int target, @NativeType("void const *") int[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glBufferDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 2, data, usage, __functionAddress); + } + + /** Array version of: {@link #glBufferDataARB BufferDataARB} */ + public static void glBufferDataARB(@NativeType("GLenum") int target, @NativeType("void const *") float[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glBufferDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 2, data, usage, __functionAddress); + } + + /** Array version of: {@link #glBufferDataARB BufferDataARB} */ + public static void glBufferDataARB(@NativeType("GLenum") int target, @NativeType("void const *") double[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glBufferDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 3, data, usage, __functionAddress); + } + + /** Array version of: {@link #glBufferSubDataARB BufferSubDataARB} */ + public static void glBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glBufferSubDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 1, data, __functionAddress); + } + + /** Array version of: {@link #glBufferSubDataARB BufferSubDataARB} */ + public static void glBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glBufferSubDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** Array version of: {@link #glBufferSubDataARB BufferSubDataARB} */ + public static void glBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glBufferSubDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** Array version of: {@link #glBufferSubDataARB BufferSubDataARB} */ + public static void glBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void const *") double[] data) { + long __functionAddress = GL.getICD().glBufferSubDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** Array version of: {@link #glGetBufferSubDataARB GetBufferSubDataARB} */ + public static void glGetBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void *") short[] data) { + long __functionAddress = GL.getICD().glGetBufferSubDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 1, data, __functionAddress); + } + + /** Array version of: {@link #glGetBufferSubDataARB GetBufferSubDataARB} */ + public static void glGetBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void *") int[] data) { + long __functionAddress = GL.getICD().glGetBufferSubDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** Array version of: {@link #glGetBufferSubDataARB GetBufferSubDataARB} */ + public static void glGetBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void *") float[] data) { + long __functionAddress = GL.getICD().glGetBufferSubDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** Array version of: {@link #glGetBufferSubDataARB GetBufferSubDataARB} */ + public static void glGetBufferSubDataARB(@NativeType("GLenum") int target, @NativeType("GLintptrARB") long offset, @NativeType("void *") double[] data) { + long __functionAddress = GL.getICD().glGetBufferSubDataARB; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** Array version of: {@link #glGetBufferParameterivARB GetBufferParameterivARB} */ + public static void glGetBufferParameterivARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetBufferParameterivARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexProgram.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexProgram.java new file mode 100644 index 000000000..c6fad7fc9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexProgram.java @@ -0,0 +1,1555 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_vertex_program extension. + * + *

    Unextended OpenGL mandates a certain set of configurable per-vertex computations defining vertex transformation, texture coordinate generation and + * transformation, and lighting. Several extensions have added further per-vertex computations to OpenGL. For example, extensions have defined new texture + * coordinate generation modes ({@link ARBTextureCubeMap ARB_texture_cube_map}, {@link NVTexgenReflection NV_texgen_reflection}, NV_texgen_emboss), new vertex + * transformation modes ({@link ARBVertexBlend ARB_vertex_blend}, EXT_vertex_weighting), new lighting modes (OpenGL 1.2's separate specular and + * rescale normal functionality), several modes for fog distance generation ({@link NVFogDistance NV_fog_distance}), and eye-distance point size attenuation + * ({@link ARBPointParameters ARB_point_parameters}).

    + * + *

    Each such extension adds a small set of relatively inflexible per-vertex computations.

    + * + *

    This inflexibility is in contrast to the typical flexibility provided by the underlying programmable floating point engines (whether micro-coded vertex + * engines, DSPs, or CPUs) that are traditionally used to implement OpenGL's per-vertex computations. The purpose of this extension is to expose to the + * OpenGL application writer a significant degree of per-vertex programmability for computing vertex parameters.

    + * + *

    For the purposes of discussing this extension, a vertex program is a sequence of floating-point 4-component vector operations that determines how a set + * of program parameters (defined outside of OpenGL's {@link GL11#glBegin Begin}/{@link GL11#glEnd End} pair) and an input set of per-vertex parameters are transformed to a set of + * per-vertex result parameters.

    + * + *

    The per-vertex computations for standard OpenGL given a particular set of lighting and texture coordinate generation modes (along with any state for + * extensions defining per-vertex computations) is, in essence, a vertex program. However, the sequence of operations is defined implicitly by the current + * OpenGL state settings rather than defined explicitly as a sequence of instructions.

    + * + *

    This extension provides an explicit mechanism for defining vertex program instruction sequences for application-defined vertex programs. In order to + * define such vertex programs, this extension defines a vertex programming model including a floating-point 4-component vector instruction set and a + * relatively large set of floating-point 4-component registers.

    + * + *

    The extension's vertex programming model is designed for efficient hardware implementation and to support a wide variety of vertex programs. By design, + * the entire set of existing vertex programs defined by existing OpenGL per-vertex computation extensions can be implemented using the extension's vertex + * programming model.

    + */ +public class ARBVertexProgram { + + static { GL.initialize(); } + + /** + * Accepted by the {@code cap} parameter of Disable, Enable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of ProgramStringARB, BindProgramARB, ProgramEnvParameter4[df][v]ARB, ProgramLocalParameter4[df][v]ARB, + * GetProgramEnvParameter[df]vARB, GetProgramLocalParameter[df]vARB, GetProgramivARB, and GetProgramStringARB. + */ + public static final int GL_VERTEX_PROGRAM_ARB = 0x8620; + + /** + * Accepted by the {@code cap} parameter of Disable, Enable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int + GL_VERTEX_PROGRAM_POINT_SIZE_ARB = 0x8642, + GL_VERTEX_PROGRAM_TWO_SIDE_ARB = 0x8643, + GL_COLOR_SUM_ARB = 0x8458; + + /** Accepted by the {@code format} parameter of ProgramStringARB. */ + public static final int GL_PROGRAM_FORMAT_ASCII_ARB = 0x8875; + + /** Accepted by the {@code pname} parameter of GetVertexAttrib[dfi]vARB. */ + public static final int + GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB = 0x8622, + GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB = 0x8623, + GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB = 0x8624, + GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB = 0x8625, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB = 0x886A, + GL_CURRENT_VERTEX_ATTRIB_ARB = 0x8626; + + /** Accepted by the {@code pname} parameter of GetVertexAttribPointervARB. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB = 0x8645; + + /** Accepted by the {@code pname} parameter of GetProgramivARB. */ + public static final int + GL_PROGRAM_LENGTH_ARB = 0x8627, + GL_PROGRAM_FORMAT_ARB = 0x8876, + GL_PROGRAM_BINDING_ARB = 0x8677, + GL_PROGRAM_INSTRUCTIONS_ARB = 0x88A0, + GL_MAX_PROGRAM_INSTRUCTIONS_ARB = 0x88A1, + GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB = 0x88A2, + GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB = 0x88A3, + GL_PROGRAM_TEMPORARIES_ARB = 0x88A4, + GL_MAX_PROGRAM_TEMPORARIES_ARB = 0x88A5, + GL_PROGRAM_NATIVE_TEMPORARIES_ARB = 0x88A6, + GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB = 0x88A7, + GL_PROGRAM_PARAMETERS_ARB = 0x88A8, + GL_MAX_PROGRAM_PARAMETERS_ARB = 0x88A9, + GL_PROGRAM_NATIVE_PARAMETERS_ARB = 0x88AA, + GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB = 0x88AB, + GL_PROGRAM_ATTRIBS_ARB = 0x88AC, + GL_MAX_PROGRAM_ATTRIBS_ARB = 0x88AD, + GL_PROGRAM_NATIVE_ATTRIBS_ARB = 0x88AE, + GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB = 0x88AF, + GL_PROGRAM_ADDRESS_REGISTERS_ARB = 0x88B0, + GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB = 0x88B1, + GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = 0x88B2, + GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = 0x88B3, + GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB = 0x88B4, + GL_MAX_PROGRAM_ENV_PARAMETERS_ARB = 0x88B5, + GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB = 0x88B6; + + /** Accepted by the {@code pname} parameter of GetProgramStringARB. */ + public static final int GL_PROGRAM_STRING_ARB = 0x8628; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_PROGRAM_ERROR_POSITION_ARB = 0x864B, + GL_CURRENT_MATRIX_ARB = 0x8641, + GL_TRANSPOSE_CURRENT_MATRIX_ARB = 0x88B7, + GL_CURRENT_MATRIX_STACK_DEPTH_ARB = 0x8640, + GL_MAX_VERTEX_ATTRIBS_ARB = 0x8869, + GL_MAX_PROGRAM_MATRICES_ARB = 0x862F, + GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB = 0x862E; + + /** Accepted by the {@code name} parameter of GetString. */ + public static final int GL_PROGRAM_ERROR_STRING_ARB = 0x8874; + + /** Accepted by the {@code mode} parameter of MatrixMode. */ + public static final int + GL_MATRIX0_ARB = 0x88C0, + GL_MATRIX1_ARB = 0x88C1, + GL_MATRIX2_ARB = 0x88C2, + GL_MATRIX3_ARB = 0x88C3, + GL_MATRIX4_ARB = 0x88C4, + GL_MATRIX5_ARB = 0x88C5, + GL_MATRIX6_ARB = 0x88C6, + GL_MATRIX7_ARB = 0x88C7, + GL_MATRIX8_ARB = 0x88C8, + GL_MATRIX9_ARB = 0x88C9, + GL_MATRIX10_ARB = 0x88CA, + GL_MATRIX11_ARB = 0x88CB, + GL_MATRIX12_ARB = 0x88CC, + GL_MATRIX13_ARB = 0x88CD, + GL_MATRIX14_ARB = 0x88CE, + GL_MATRIX15_ARB = 0x88CF, + GL_MATRIX16_ARB = 0x88D0, + GL_MATRIX17_ARB = 0x88D1, + GL_MATRIX18_ARB = 0x88D2, + GL_MATRIX19_ARB = 0x88D3, + GL_MATRIX20_ARB = 0x88D4, + GL_MATRIX21_ARB = 0x88D5, + GL_MATRIX22_ARB = 0x88D6, + GL_MATRIX23_ARB = 0x88D7, + GL_MATRIX24_ARB = 0x88D8, + GL_MATRIX25_ARB = 0x88D9, + GL_MATRIX26_ARB = 0x88DA, + GL_MATRIX27_ARB = 0x88DB, + GL_MATRIX28_ARB = 0x88DC, + GL_MATRIX29_ARB = 0x88DD, + GL_MATRIX30_ARB = 0x88DE, + GL_MATRIX31_ARB = 0x88DF; + + protected ARBVertexProgram() { + throw new UnsupportedOperationException(); + } + + // --- [ glVertexAttrib1sARB ] --- + + /** + * Short version of {@link #glVertexAttrib1fARB VertexAttrib1fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + */ + public static void glVertexAttrib1sARB(@NativeType("GLuint") int index, @NativeType("GLshort") short v0) { + ARBVertexShader.glVertexAttrib1sARB(index, v0); + } + + // --- [ glVertexAttrib1fARB ] --- + + /** + * Specifies the value of a generic vertex attribute. The y and z components are implicitly set to 0.0f and w to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + */ + public static void glVertexAttrib1fARB(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0) { + ARBVertexShader.glVertexAttrib1fARB(index, v0); + } + + // --- [ glVertexAttrib1dARB ] --- + + /** + * Double version of {@link #glVertexAttrib1fARB VertexAttrib1fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + */ + public static void glVertexAttrib1dARB(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0) { + ARBVertexShader.glVertexAttrib1dARB(index, v0); + } + + // --- [ glVertexAttrib2sARB ] --- + + /** + * Short version of {@link #glVertexAttrib2fARB VertexAttrib2fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + */ + public static void glVertexAttrib2sARB(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1) { + ARBVertexShader.glVertexAttrib2sARB(index, v0, v1); + } + + // --- [ glVertexAttrib2fARB ] --- + + /** + * Specifies the value of a generic vertex attribute. The y component is implicitly set to 0.0f and w to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + */ + public static void glVertexAttrib2fARB(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1) { + ARBVertexShader.glVertexAttrib2fARB(index, v0, v1); + } + + // --- [ glVertexAttrib2dARB ] --- + + /** + * Double version of {@link #glVertexAttrib2fARB VertexAttrib2fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + */ + public static void glVertexAttrib2dARB(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1) { + ARBVertexShader.glVertexAttrib2dARB(index, v0, v1); + } + + // --- [ glVertexAttrib3sARB ] --- + + /** + * Short version of {@link #glVertexAttrib3fARB VertexAttrib3fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + */ + public static void glVertexAttrib3sARB(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1, @NativeType("GLshort") short v2) { + ARBVertexShader.glVertexAttrib3sARB(index, v0, v1, v2); + } + + // --- [ glVertexAttrib3fARB ] --- + + /** + * Specifies the value of a generic vertex attribute. The w is implicitly set to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + */ + public static void glVertexAttrib3fARB(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2) { + ARBVertexShader.glVertexAttrib3fARB(index, v0, v1, v2); + } + + // --- [ glVertexAttrib3dARB ] --- + + /** + * Double version of {@link #glVertexAttrib3fARB VertexAttrib3fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + */ + public static void glVertexAttrib3dARB(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1, @NativeType("GLdouble") double v2) { + ARBVertexShader.glVertexAttrib3dARB(index, v0, v1, v2); + } + + // --- [ glVertexAttrib4sARB ] --- + + /** + * Short version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + */ + public static void glVertexAttrib4sARB(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1, @NativeType("GLshort") short v2, @NativeType("GLshort") short v3) { + ARBVertexShader.glVertexAttrib4sARB(index, v0, v1, v2, v3); + } + + // --- [ glVertexAttrib4fARB ] --- + + /** + * Specifies the value of a generic vertex attribute. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + */ + public static void glVertexAttrib4fARB(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2, @NativeType("GLfloat") float v3) { + ARBVertexShader.glVertexAttrib4fARB(index, v0, v1, v2, v3); + } + + // --- [ glVertexAttrib4dARB ] --- + + /** + * Double version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + */ + public static void glVertexAttrib4dARB(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1, @NativeType("GLdouble") double v2, @NativeType("GLdouble") double v3) { + ARBVertexShader.glVertexAttrib4dARB(index, v0, v1, v2, v3); + } + + // --- [ glVertexAttrib4NubARB ] --- + + /** + * Normalized unsigned byte version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + */ + public static void glVertexAttrib4NubARB(@NativeType("GLuint") int index, @NativeType("GLubyte") byte x, @NativeType("GLubyte") byte y, @NativeType("GLubyte") byte z, @NativeType("GLubyte") byte w) { + ARBVertexShader.glVertexAttrib4NubARB(index, x, y, z, w); + } + + // --- [ glVertexAttrib1svARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib1svARB VertexAttrib1svARB} */ + public static void nglVertexAttrib1svARB(int index, long v) { + ARBVertexShader.nglVertexAttrib1svARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib1sARB VertexAttrib1sARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib1svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + ARBVertexShader.glVertexAttrib1svARB(index, v); + } + + // --- [ glVertexAttrib1fvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib1fvARB VertexAttrib1fvARB} */ + public static void nglVertexAttrib1fvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib1fvARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib1fARB VertexAttrib1fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib1fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + ARBVertexShader.glVertexAttrib1fvARB(index, v); + } + + // --- [ glVertexAttrib1dvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib1dvARB VertexAttrib1dvARB} */ + public static void nglVertexAttrib1dvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib1dvARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib1dARB VertexAttrib1dARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib1dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + ARBVertexShader.glVertexAttrib1dvARB(index, v); + } + + // --- [ glVertexAttrib2svARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib2svARB VertexAttrib2svARB} */ + public static void nglVertexAttrib2svARB(int index, long v) { + ARBVertexShader.nglVertexAttrib2svARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib2sARB VertexAttrib2sARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib2svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + ARBVertexShader.glVertexAttrib2svARB(index, v); + } + + // --- [ glVertexAttrib2fvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib2fvARB VertexAttrib2fvARB} */ + public static void nglVertexAttrib2fvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib2fvARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib2fARB VertexAttrib2fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib2fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + ARBVertexShader.glVertexAttrib2fvARB(index, v); + } + + // --- [ glVertexAttrib2dvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib2dvARB VertexAttrib2dvARB} */ + public static void nglVertexAttrib2dvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib2dvARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib2dARB VertexAttrib2dARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib2dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + ARBVertexShader.glVertexAttrib2dvARB(index, v); + } + + // --- [ glVertexAttrib3svARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib3svARB VertexAttrib3svARB} */ + public static void nglVertexAttrib3svARB(int index, long v) { + ARBVertexShader.nglVertexAttrib3svARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib3sARB VertexAttrib3sARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib3svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + ARBVertexShader.glVertexAttrib3svARB(index, v); + } + + // --- [ glVertexAttrib3fvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib3fvARB VertexAttrib3fvARB} */ + public static void nglVertexAttrib3fvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib3fvARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib3fARB VertexAttrib3fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib3fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + ARBVertexShader.glVertexAttrib3fvARB(index, v); + } + + // --- [ glVertexAttrib3dvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib3dvARB VertexAttrib3dvARB} */ + public static void nglVertexAttrib3dvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib3dvARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib3dARB VertexAttrib3dARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib3dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + ARBVertexShader.glVertexAttrib3dvARB(index, v); + } + + // --- [ glVertexAttrib4fvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4fvARB VertexAttrib4fvARB} */ + public static void nglVertexAttrib4fvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4fvARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + ARBVertexShader.glVertexAttrib4fvARB(index, v); + } + + // --- [ glVertexAttrib4bvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4bvARB VertexAttrib4bvARB} */ + public static void nglVertexAttrib4bvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4bvARB(index, v); + } + + /** + * Byte pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4bvARB(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + ARBVertexShader.glVertexAttrib4bvARB(index, v); + } + + // --- [ glVertexAttrib4svARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4svARB VertexAttrib4svARB} */ + public static void nglVertexAttrib4svARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4svARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib4sARB VertexAttrib4sARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + ARBVertexShader.glVertexAttrib4svARB(index, v); + } + + // --- [ glVertexAttrib4ivARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4ivARB VertexAttrib4ivARB} */ + public static void nglVertexAttrib4ivARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4ivARB(index, v); + } + + /** + * Integer pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4ivARB(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + ARBVertexShader.glVertexAttrib4ivARB(index, v); + } + + // --- [ glVertexAttrib4ubvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4ubvARB VertexAttrib4ubvARB} */ + public static void nglVertexAttrib4ubvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4ubvARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib4NubARB VertexAttrib4NubARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4ubvARB(@NativeType("GLuint") int index, @NativeType("GLubyte const *") ByteBuffer v) { + ARBVertexShader.glVertexAttrib4ubvARB(index, v); + } + + // --- [ glVertexAttrib4usvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4usvARB VertexAttrib4usvARB} */ + public static void nglVertexAttrib4usvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4usvARB(index, v); + } + + /** + * Unsigned short pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4usvARB(@NativeType("GLuint") int index, @NativeType("GLushort const *") ShortBuffer v) { + ARBVertexShader.glVertexAttrib4usvARB(index, v); + } + + // --- [ glVertexAttrib4uivARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4uivARB VertexAttrib4uivARB} */ + public static void nglVertexAttrib4uivARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4uivARB(index, v); + } + + /** + * Unsigned int pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4uivARB(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + ARBVertexShader.glVertexAttrib4uivARB(index, v); + } + + // --- [ glVertexAttrib4dvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4dvARB VertexAttrib4dvARB} */ + public static void nglVertexAttrib4dvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4dvARB(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib4dARB VertexAttrib4dARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + ARBVertexShader.glVertexAttrib4dvARB(index, v); + } + + // --- [ glVertexAttrib4NbvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NbvARB VertexAttrib4NbvARB} */ + public static void nglVertexAttrib4NbvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4NbvARB(index, v); + } + + /** + * Normalized byte pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NbvARB(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + ARBVertexShader.glVertexAttrib4NbvARB(index, v); + } + + // --- [ glVertexAttrib4NsvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NsvARB VertexAttrib4NsvARB} */ + public static void nglVertexAttrib4NsvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4NsvARB(index, v); + } + + /** + * Normalized short pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NsvARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + ARBVertexShader.glVertexAttrib4NsvARB(index, v); + } + + // --- [ glVertexAttrib4NivARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NivARB VertexAttrib4NivARB} */ + public static void nglVertexAttrib4NivARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4NivARB(index, v); + } + + /** + * Normalized int pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NivARB(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + ARBVertexShader.glVertexAttrib4NivARB(index, v); + } + + // --- [ glVertexAttrib4NubvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NubvARB VertexAttrib4NubvARB} */ + public static void nglVertexAttrib4NubvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4NubvARB(index, v); + } + + /** + * Normalized unsigned byte pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NubvARB(@NativeType("GLuint") int index, @NativeType("GLubyte const *") ByteBuffer v) { + ARBVertexShader.glVertexAttrib4NubvARB(index, v); + } + + // --- [ glVertexAttrib4NusvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NusvARB VertexAttrib4NusvARB} */ + public static void nglVertexAttrib4NusvARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4NusvARB(index, v); + } + + /** + * Normalized unsigned short pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NusvARB(@NativeType("GLuint") int index, @NativeType("GLushort const *") ShortBuffer v) { + ARBVertexShader.glVertexAttrib4NusvARB(index, v); + } + + // --- [ glVertexAttrib4NuivARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NuivARB VertexAttrib4NuivARB} */ + public static void nglVertexAttrib4NuivARB(int index, long v) { + ARBVertexShader.nglVertexAttrib4NuivARB(index, v); + } + + /** + * Normalized unsigned int pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NuivARB(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + ARBVertexShader.glVertexAttrib4NuivARB(index, v); + } + + // --- [ glVertexAttribPointerARB ] --- + + /** Unsafe version of: {@link #glVertexAttribPointerARB VertexAttribPointerARB} */ + public static void nglVertexAttribPointerARB(int index, int size, int type, boolean normalized, int stride, long pointer) { + ARBVertexShader.nglVertexAttribPointerARB(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, type, normalized, stride, pointer); + } + + // --- [ glEnableVertexAttribArrayARB ] --- + + /** + * Enables a generic vertex attribute array. + * + * @param index the index of the generic vertex attribute to be enabled + */ + public static void glEnableVertexAttribArrayARB(@NativeType("GLuint") int index) { + ARBVertexShader.glEnableVertexAttribArrayARB(index); + } + + // --- [ glDisableVertexAttribArrayARB ] --- + + /** + * Disables a generic vertex attribute array. + * + * @param index the index of the generic vertex attribute to be disabled + */ + public static void glDisableVertexAttribArrayARB(@NativeType("GLuint") int index) { + ARBVertexShader.glDisableVertexAttribArrayARB(index); + } + + // --- [ glProgramStringARB ] --- + + /** + * Unsafe version of: {@link #glProgramStringARB ProgramStringARB} + * + * @param len the length of the program string, excluding the null-terminator + */ + public static native void nglProgramStringARB(int target, int format, int len, long string); + + /** + * Updates the program string for the current program object for {@code target}. + * + *

    When a program string is loaded, it is interpreted according to syntactic and semantic rules corresponding to the program target specified by + * {@code target}. If a program violates the syntactic or semantic restrictions of the program target, ProgramStringARB generates the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION}.

    + * + *

    Additionally, ProgramString will update the program error position ({@link #GL_PROGRAM_ERROR_POSITION_ARB PROGRAM_ERROR_POSITION_ARB}) and error string ({@link #GL_PROGRAM_ERROR_STRING_ARB PROGRAM_ERROR_STRING_ARB}). If a + * program fails to load, the value of the program error position is set to the ubyte offset into the specified program string indicating where the first + * program error was detected. If the program fails to load because of a semantic restriction that is not detected until the program is fully scanned, the + * error position is set to the value of {@code len}. If a program loads successfully, the error position is set to the value negative one. The + * implementation-dependent program error string contains one or more error or warning messages. If a program loads succesfully, the error string may + * either contain warning messages or be empty.

    + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param format the format of the program string. Must be:
    {@link #GL_PROGRAM_FORMAT_ASCII_ARB PROGRAM_FORMAT_ASCII_ARB}
    + * @param string an array of bytes representing the program string being loaded + */ + public static void glProgramStringARB(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer string) { + nglProgramStringARB(target, format, string.remaining(), memAddress(string)); + } + + // --- [ glBindProgramARB ] --- + + /** + * Creates a named program object by binding an unused program object name to a valid program target. Also can be used to bind an existing program object + * to a program target. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param program the program object to bind. If {@code program} is zero, the default program object for {@code target} is bound. If {@code program} is the name of + * an existing program object whose associated program target is {@code target}, the named program object is bound. + */ + public static native void glBindProgramARB(@NativeType("GLenum") int target, @NativeType("GLuint") int program); + + // --- [ glDeleteProgramsARB ] --- + + /** + * Unsafe version of: {@link #glDeleteProgramsARB DeleteProgramsARB} + * + * @param n the number of program object to delete + */ + public static native void nglDeleteProgramsARB(int n, long programs); + + /** + * Deletes program objects. + * + * @param programs an array of {@code n} program objects to be deleted + */ + public static void glDeleteProgramsARB(@NativeType("GLuint const *") IntBuffer programs) { + nglDeleteProgramsARB(programs.remaining(), memAddress(programs)); + } + + // --- [ glGenProgramsARB ] --- + + /** + * Unsafe version of: {@link #glGenProgramsARB GenProgramsARB} + * + * @param n the number of program names to genereate + */ + public static native void nglGenProgramsARB(int n, long programs); + + /** + * Returns {@code n} currently unused program names in {@code programs}. These names are marked as used, for the purposes of GenProgramsARB only, but + * objects are created only when they are first bound using {@link #glBindProgramARB BindProgramARB}. + * + * @param programs an array in which to return the generated program names + */ + public static void glGenProgramsARB(@NativeType("GLuint *") IntBuffer programs) { + nglGenProgramsARB(programs.remaining(), memAddress(programs)); + } + + /** + * Returns {@code n} currently unused program names in {@code programs}. These names are marked as used, for the purposes of GenProgramsARB only, but + * objects are created only when they are first bound using {@link #glBindProgramARB BindProgramARB}. + */ + @NativeType("void") + public static int glGenProgramsARB() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer programs = stack.callocInt(1); + nglGenProgramsARB(1, memAddress(programs)); + return programs.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glProgramEnvParameter4dARB ] --- + + /** + * Double version of {@link #glProgramEnvParameter4fARB ProgramEnvParameter4fARB}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param x the {@code x} parameter component + * @param y the {@code y} parameter component + * @param z the {@code z} parameter component + * @param w the {@code w} parameter component + */ + public static native void glProgramEnvParameter4dARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w); + + // --- [ glProgramEnvParameter4dvARB ] --- + + /** Unsafe version of: {@link #glProgramEnvParameter4dvARB ProgramEnvParameter4dvARB} */ + public static native void nglProgramEnvParameter4dvARB(int target, int index, long params); + + /** + * Pointer version of {@link #glProgramEnvParameter4dARB ProgramEnvParameter4dARB} + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param params a buffer from which to read the parameter value + */ + public static void glProgramEnvParameter4dvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglProgramEnvParameter4dvARB(target, index, memAddress(params)); + } + + // --- [ glProgramEnvParameter4fARB ] --- + + /** + * Updates the values of the program environment parameter numbered {@code index} for the specified program target {@code target}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param x the {@code x} parameter component + * @param y the {@code y} parameter component + * @param z the {@code z} parameter component + * @param w the {@code w} parameter component + */ + public static native void glProgramEnvParameter4fARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z, @NativeType("GLfloat") float w); + + // --- [ glProgramEnvParameter4fvARB ] --- + + /** Unsafe version of: {@link #glProgramEnvParameter4fvARB ProgramEnvParameter4fvARB} */ + public static native void nglProgramEnvParameter4fvARB(int target, int index, long params); + + /** + * Pointer version of {@link #glProgramEnvParameter4fARB ProgramEnvParameter4fARB}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param params a buffer from which to read the parameter value + */ + public static void glProgramEnvParameter4fvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglProgramEnvParameter4fvARB(target, index, memAddress(params)); + } + + // --- [ glProgramLocalParameter4dARB ] --- + + /** + * Double version of {@link #glProgramLocalParameter4fARB ProgramLocalParameter4fARB}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param x the {@code x} parameter component + * @param y the {@code y} parameter component + * @param z the {@code z} parameter component + * @param w the {@code w} parameter component + */ + public static native void glProgramLocalParameter4dARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w); + + // --- [ glProgramLocalParameter4dvARB ] --- + + /** Unsafe version of: {@link #glProgramLocalParameter4dvARB ProgramLocalParameter4dvARB} */ + public static native void nglProgramLocalParameter4dvARB(int target, int index, long params); + + /** + * Pointer version of {@link #glProgramLocalParameter4dARB ProgramLocalParameter4dARB}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param params a buffer from which to read the parameter value + */ + public static void glProgramLocalParameter4dvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglProgramLocalParameter4dvARB(target, index, memAddress(params)); + } + + // --- [ glProgramLocalParameter4fARB ] --- + + /** + * Updates the values of the program local parameter numbered {@code index} for the specified program target {@code target}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param x the {@code x} parameter component + * @param y the {@code y} parameter component + * @param z the {@code z} parameter component + * @param w the {@code w} parameter component + */ + public static native void glProgramLocalParameter4fARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z, @NativeType("GLfloat") float w); + + // --- [ glProgramLocalParameter4fvARB ] --- + + /** Unsafe version of: {@link #glProgramLocalParameter4fvARB ProgramLocalParameter4fvARB} */ + public static native void nglProgramLocalParameter4fvARB(int target, int index, long params); + + /** + * Pointer version of {@link #glProgramLocalParameter4fARB ProgramLocalParameter4fARB}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param params a buffer from which to read the parameter value + */ + public static void glProgramLocalParameter4fvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglProgramLocalParameter4fvARB(target, index, memAddress(params)); + } + + // --- [ glGetProgramEnvParameterfvARB ] --- + + /** Unsafe version of: {@link #glGetProgramEnvParameterfvARB GetProgramEnvParameterfvARB} */ + public static native void nglGetProgramEnvParameterfvARB(int target, int index, long params); + + /** + * Obtain the current value for the program environment parameter numbered {@code index} for the specified program target {@code target}, and places the + * information in the array {@code params}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param params a buffer in which to place the current parameter value + */ + public static void glGetProgramEnvParameterfvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetProgramEnvParameterfvARB(target, index, memAddress(params)); + } + + // --- [ glGetProgramEnvParameterdvARB ] --- + + /** Unsafe version of: {@link #glGetProgramEnvParameterdvARB GetProgramEnvParameterdvARB} */ + public static native void nglGetProgramEnvParameterdvARB(int target, int index, long params); + + /** + * Double version of {@link #glGetProgramEnvParameterfvARB GetProgramEnvParameterfvARB}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param params a buffer in which to place the current parameter value + */ + public static void glGetProgramEnvParameterdvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetProgramEnvParameterdvARB(target, index, memAddress(params)); + } + + // --- [ glGetProgramLocalParameterfvARB ] --- + + /** Unsafe version of: {@link #glGetProgramLocalParameterfvARB GetProgramLocalParameterfvARB} */ + public static native void nglGetProgramLocalParameterfvARB(int target, int index, long params); + + /** + * Obtain the current value for the program local parameter numbered {@code index} for the specified program target {@code target}, and places the + * information in the array {@code params}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param params a buffer in which to place the current parameter value + */ + public static void glGetProgramLocalParameterfvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetProgramLocalParameterfvARB(target, index, memAddress(params)); + } + + // --- [ glGetProgramLocalParameterdvARB ] --- + + /** Unsafe version of: {@link #glGetProgramLocalParameterdvARB GetProgramLocalParameterdvARB} */ + public static native void nglGetProgramLocalParameterdvARB(int target, int index, long params); + + /** + * Double version of {@link #glGetProgramLocalParameterfvARB GetProgramLocalParameterfvARB}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param index the environment parameter index + * @param params a buffer in which to place the current parameter value + */ + public static void glGetProgramLocalParameterdvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetProgramLocalParameterdvARB(target, index, memAddress(params)); + } + + // --- [ glGetProgramivARB ] --- + + /** Unsafe version of: {@link #glGetProgramivARB GetProgramivARB} */ + public static native void nglGetProgramivARB(int target, int pname, long params); + + /** + * Obtains program state for the program target {@code target}, writing the state into the array given by {@code params}. GetProgramivARB can be used to + * determine the properties of the currently bound program object or implementation limits for {@code target}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param pname the parameter to query. One of:
    {@link #GL_PROGRAM_LENGTH_ARB PROGRAM_LENGTH_ARB}{@link #GL_PROGRAM_FORMAT_ARB PROGRAM_FORMAT_ARB}
    {@link #GL_PROGRAM_BINDING_ARB PROGRAM_BINDING_ARB}{@link #GL_PROGRAM_INSTRUCTIONS_ARB PROGRAM_INSTRUCTIONS_ARB}
    {@link #GL_MAX_PROGRAM_INSTRUCTIONS_ARB MAX_PROGRAM_INSTRUCTIONS_ARB}{@link #GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB PROGRAM_NATIVE_INSTRUCTIONS_ARB}
    {@link #GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB}{@link #GL_PROGRAM_TEMPORARIES_ARB PROGRAM_TEMPORARIES_ARB}
    {@link #GL_MAX_PROGRAM_TEMPORARIES_ARB MAX_PROGRAM_TEMPORARIES_ARB}{@link #GL_PROGRAM_NATIVE_TEMPORARIES_ARB PROGRAM_NATIVE_TEMPORARIES_ARB}
    {@link #GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB MAX_PROGRAM_NATIVE_TEMPORARIES_ARB}{@link #GL_PROGRAM_PARAMETERS_ARB PROGRAM_PARAMETERS_ARB}
    {@link #GL_MAX_PROGRAM_PARAMETERS_ARB MAX_PROGRAM_PARAMETERS_ARB}{@link #GL_PROGRAM_NATIVE_PARAMETERS_ARB PROGRAM_NATIVE_PARAMETERS_ARB}
    {@link #GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB MAX_PROGRAM_NATIVE_PARAMETERS_ARB}{@link #GL_PROGRAM_ATTRIBS_ARB PROGRAM_ATTRIBS_ARB}
    {@link #GL_MAX_PROGRAM_ATTRIBS_ARB MAX_PROGRAM_ATTRIBS_ARB}{@link #GL_PROGRAM_NATIVE_ATTRIBS_ARB PROGRAM_NATIVE_ATTRIBS_ARB}
    {@link #GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB MAX_PROGRAM_NATIVE_ATTRIBS_ARB}{@link #GL_PROGRAM_ADDRESS_REGISTERS_ARB PROGRAM_ADDRESS_REGISTERS_ARB}
    {@link #GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB MAX_PROGRAM_ADDRESS_REGISTERS_ARB}{@link #GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB}
    {@link #GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB}{@link #GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB MAX_PROGRAM_LOCAL_PARAMETERS_ARB}
    {@link #GL_MAX_PROGRAM_ENV_PARAMETERS_ARB MAX_PROGRAM_ENV_PARAMETERS_ARB}{@link #GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB PROGRAM_UNDER_NATIVE_LIMITS_ARB}
    + * @param params an array in which to place the parameter value + */ + public static void glGetProgramivARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetProgramivARB(target, pname, memAddress(params)); + } + + /** + * Obtains program state for the program target {@code target}, writing the state into the array given by {@code params}. GetProgramivARB can be used to + * determine the properties of the currently bound program object or implementation limits for {@code target}. + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param pname the parameter to query. One of:
    {@link #GL_PROGRAM_LENGTH_ARB PROGRAM_LENGTH_ARB}{@link #GL_PROGRAM_FORMAT_ARB PROGRAM_FORMAT_ARB}
    {@link #GL_PROGRAM_BINDING_ARB PROGRAM_BINDING_ARB}{@link #GL_PROGRAM_INSTRUCTIONS_ARB PROGRAM_INSTRUCTIONS_ARB}
    {@link #GL_MAX_PROGRAM_INSTRUCTIONS_ARB MAX_PROGRAM_INSTRUCTIONS_ARB}{@link #GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB PROGRAM_NATIVE_INSTRUCTIONS_ARB}
    {@link #GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB}{@link #GL_PROGRAM_TEMPORARIES_ARB PROGRAM_TEMPORARIES_ARB}
    {@link #GL_MAX_PROGRAM_TEMPORARIES_ARB MAX_PROGRAM_TEMPORARIES_ARB}{@link #GL_PROGRAM_NATIVE_TEMPORARIES_ARB PROGRAM_NATIVE_TEMPORARIES_ARB}
    {@link #GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB MAX_PROGRAM_NATIVE_TEMPORARIES_ARB}{@link #GL_PROGRAM_PARAMETERS_ARB PROGRAM_PARAMETERS_ARB}
    {@link #GL_MAX_PROGRAM_PARAMETERS_ARB MAX_PROGRAM_PARAMETERS_ARB}{@link #GL_PROGRAM_NATIVE_PARAMETERS_ARB PROGRAM_NATIVE_PARAMETERS_ARB}
    {@link #GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB MAX_PROGRAM_NATIVE_PARAMETERS_ARB}{@link #GL_PROGRAM_ATTRIBS_ARB PROGRAM_ATTRIBS_ARB}
    {@link #GL_MAX_PROGRAM_ATTRIBS_ARB MAX_PROGRAM_ATTRIBS_ARB}{@link #GL_PROGRAM_NATIVE_ATTRIBS_ARB PROGRAM_NATIVE_ATTRIBS_ARB}
    {@link #GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB MAX_PROGRAM_NATIVE_ATTRIBS_ARB}{@link #GL_PROGRAM_ADDRESS_REGISTERS_ARB PROGRAM_ADDRESS_REGISTERS_ARB}
    {@link #GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB MAX_PROGRAM_ADDRESS_REGISTERS_ARB}{@link #GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB}
    {@link #GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB}{@link #GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB MAX_PROGRAM_LOCAL_PARAMETERS_ARB}
    {@link #GL_MAX_PROGRAM_ENV_PARAMETERS_ARB MAX_PROGRAM_ENV_PARAMETERS_ARB}{@link #GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB PROGRAM_UNDER_NATIVE_LIMITS_ARB}
    + */ + @NativeType("void") + public static int glGetProgramiARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetProgramivARB(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetProgramStringARB ] --- + + /** Unsafe version of: {@link #glGetProgramStringARB GetProgramStringARB} */ + public static native void nglGetProgramStringARB(int target, int pname, long string); + + /** + * Obtains the program string for the program object bound to {@code target} and places the information in the array {@code string}. + * + *

    {@code n} ubytes are returned into the array program where {@code n} is the length of the program in ubytes, as returned by {@link #glGetProgramivARB GetProgramivARB} when + * {@code pname} is {@link #GL_PROGRAM_LENGTH_ARB PROGRAM_LENGTH_ARB}. The program string is always returned using the format given when the program string was specified.

    + * + * @param target the program target. One of:
    {@link #GL_VERTEX_PROGRAM_ARB VERTEX_PROGRAM_ARB}{@link ARBFragmentProgram#GL_FRAGMENT_PROGRAM_ARB FRAGMENT_PROGRAM_ARB}
    + * @param pname the parameter to query. Must be:
    {@link #GL_PROGRAM_STRING_ARB PROGRAM_STRING_ARB}
    + * @param string an array in which to place the program string + */ + public static void glGetProgramStringARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("void *") ByteBuffer string) { + if (CHECKS) { + if (DEBUG) { + check(string, glGetProgramiARB(target, GL_PROGRAM_LENGTH_ARB)); + } + } + nglGetProgramStringARB(target, pname, memAddress(string)); + } + + // --- [ glGetVertexAttribfvARB ] --- + + /** Unsafe version of: {@link #glGetVertexAttribfvARB GetVertexAttribfvARB} */ + public static void nglGetVertexAttribfvARB(int index, int pname, long params) { + ARBVertexShader.nglGetVertexAttribfvARB(index, pname, params); + } + + /** + * Float version of {@link #glGetVertexAttribivARB GetVertexAttribivARB}. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params returns the requested data + */ + public static void glGetVertexAttribfvARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + ARBVertexShader.glGetVertexAttribfvARB(index, pname, params); + } + + // --- [ glGetVertexAttribdvARB ] --- + + /** Unsafe version of: {@link #glGetVertexAttribdvARB GetVertexAttribdvARB} */ + public static void nglGetVertexAttribdvARB(int index, int pname, long params) { + ARBVertexShader.nglGetVertexAttribdvARB(index, pname, params); + } + + /** + * Double version of {@link #glGetVertexAttribivARB GetVertexAttribivARB}. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params returns the requested data + */ + public static void glGetVertexAttribdvARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer params) { + ARBVertexShader.glGetVertexAttribdvARB(index, pname, params); + } + + // --- [ glGetVertexAttribivARB ] --- + + /** Unsafe version of: {@link #glGetVertexAttribivARB GetVertexAttribivARB} */ + public static void nglGetVertexAttribivARB(int index, int pname, long params) { + ARBVertexShader.nglGetVertexAttribivARB(index, pname, params); + } + + /** + * Returns the integer value of a generic vertex attribute parameter. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried. One of:
    {@link GL15#GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING VERTEX_ATTRIB_ARRAY_BUFFER_BINDING}{@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB VERTEX_ATTRIB_ARRAY_ENABLED_ARB}
    {@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB VERTEX_ATTRIB_ARRAY_SIZE_ARB}{@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB VERTEX_ATTRIB_ARRAY_STRIDE_ARB}
    {@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB VERTEX_ATTRIB_ARRAY_TYPE_ARB}{@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB}
    {@link ARBVertexShader#GL_CURRENT_VERTEX_ATTRIB_ARB CURRENT_VERTEX_ATTRIB_ARB}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}
    + * @param params returns the requested data + */ + public static void glGetVertexAttribivARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + ARBVertexShader.glGetVertexAttribivARB(index, pname, params); + } + + /** + * Returns the integer value of a generic vertex attribute parameter. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried. One of:
    {@link GL15#GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING VERTEX_ATTRIB_ARRAY_BUFFER_BINDING}{@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB VERTEX_ATTRIB_ARRAY_ENABLED_ARB}
    {@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB VERTEX_ATTRIB_ARRAY_SIZE_ARB}{@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB VERTEX_ATTRIB_ARRAY_STRIDE_ARB}
    {@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB VERTEX_ATTRIB_ARRAY_TYPE_ARB}{@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB}
    {@link ARBVertexShader#GL_CURRENT_VERTEX_ATTRIB_ARB CURRENT_VERTEX_ATTRIB_ARB}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}
    + */ + @NativeType("void") + public static int glGetVertexAttribiARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return ARBVertexShader.glGetVertexAttribiARB(index, pname); + } + + // --- [ glGetVertexAttribPointervARB ] --- + + /** Unsafe version of: {@link #glGetVertexAttribPointervARB GetVertexAttribPointervARB} */ + public static void nglGetVertexAttribPointervARB(int index, int pname, long pointer) { + ARBVertexShader.nglGetVertexAttribPointervARB(index, pname, pointer); + } + + /** + * Returns the address of the specified generic vertex attribute pointer. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the generic vertex attribute parameter to be returned. Must be:
    {@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB VERTEX_ATTRIB_ARRAY_POINTER_ARB}
    + * @param pointer the pointer value + */ + public static void glGetVertexAttribPointervARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer pointer) { + ARBVertexShader.glGetVertexAttribPointervARB(index, pname, pointer); + } + + /** + * Returns the address of the specified generic vertex attribute pointer. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the generic vertex attribute parameter to be returned. Must be:
    {@link ARBVertexShader#GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB VERTEX_ATTRIB_ARRAY_POINTER_ARB}
    + */ + @NativeType("void") + public static long glGetVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return ARBVertexShader.glGetVertexAttribPointerARB(index, pname); + } + + // --- [ glIsProgramARB ] --- + + /** + * Returns {@link GL11#GL_TRUE TRUE} if {@code program} is the name of a program object. If {@code program} is zero or is a non-zero value that is not the name of a + * program object, or if an error condition occurs, IsProgramARB returns {@link GL11#GL_FALSE FALSE}. A name returned by {@link #glGenProgramsARB GenProgramsARB}, but not yet bound, is not the + * name of a program object. + * + * @param program the program name + */ + @NativeType("GLboolean") + public static native boolean glIsProgramARB(@NativeType("GLuint") int program); + + /** Array version of: {@link #glVertexAttrib1svARB VertexAttrib1svARB} */ + public static void glVertexAttrib1svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + ARBVertexShader.glVertexAttrib1svARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib1fvARB VertexAttrib1fvARB} */ + public static void glVertexAttrib1fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + ARBVertexShader.glVertexAttrib1fvARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib1dvARB VertexAttrib1dvARB} */ + public static void glVertexAttrib1dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + ARBVertexShader.glVertexAttrib1dvARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib2svARB VertexAttrib2svARB} */ + public static void glVertexAttrib2svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + ARBVertexShader.glVertexAttrib2svARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib2fvARB VertexAttrib2fvARB} */ + public static void glVertexAttrib2fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + ARBVertexShader.glVertexAttrib2fvARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib2dvARB VertexAttrib2dvARB} */ + public static void glVertexAttrib2dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + ARBVertexShader.glVertexAttrib2dvARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib3svARB VertexAttrib3svARB} */ + public static void glVertexAttrib3svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + ARBVertexShader.glVertexAttrib3svARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib3fvARB VertexAttrib3fvARB} */ + public static void glVertexAttrib3fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + ARBVertexShader.glVertexAttrib3fvARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib3dvARB VertexAttrib3dvARB} */ + public static void glVertexAttrib3dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + ARBVertexShader.glVertexAttrib3dvARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib4fvARB VertexAttrib4fvARB} */ + public static void glVertexAttrib4fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + ARBVertexShader.glVertexAttrib4fvARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib4svARB VertexAttrib4svARB} */ + public static void glVertexAttrib4svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + ARBVertexShader.glVertexAttrib4svARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib4ivARB VertexAttrib4ivARB} */ + public static void glVertexAttrib4ivARB(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + ARBVertexShader.glVertexAttrib4ivARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib4usvARB VertexAttrib4usvARB} */ + public static void glVertexAttrib4usvARB(@NativeType("GLuint") int index, @NativeType("GLushort const *") short[] v) { + ARBVertexShader.glVertexAttrib4usvARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib4uivARB VertexAttrib4uivARB} */ + public static void glVertexAttrib4uivARB(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + ARBVertexShader.glVertexAttrib4uivARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib4dvARB VertexAttrib4dvARB} */ + public static void glVertexAttrib4dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + ARBVertexShader.glVertexAttrib4dvARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib4NsvARB VertexAttrib4NsvARB} */ + public static void glVertexAttrib4NsvARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + ARBVertexShader.glVertexAttrib4NsvARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib4NivARB VertexAttrib4NivARB} */ + public static void glVertexAttrib4NivARB(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + ARBVertexShader.glVertexAttrib4NivARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib4NusvARB VertexAttrib4NusvARB} */ + public static void glVertexAttrib4NusvARB(@NativeType("GLuint") int index, @NativeType("GLushort const *") short[] v) { + ARBVertexShader.glVertexAttrib4NusvARB(index, v); + } + + /** Array version of: {@link #glVertexAttrib4NuivARB VertexAttrib4NuivARB} */ + public static void glVertexAttrib4NuivARB(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + ARBVertexShader.glVertexAttrib4NuivARB(index, v); + } + + /** Array version of: {@link #glVertexAttribPointerARB VertexAttribPointerARB} */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") short[] pointer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, type, normalized, stride, pointer); + } + + /** Array version of: {@link #glVertexAttribPointerARB VertexAttribPointerARB} */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") int[] pointer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, type, normalized, stride, pointer); + } + + /** Array version of: {@link #glVertexAttribPointerARB VertexAttribPointerARB} */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") float[] pointer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, type, normalized, stride, pointer); + } + + /** Array version of: {@link #glDeleteProgramsARB DeleteProgramsARB} */ + public static void glDeleteProgramsARB(@NativeType("GLuint const *") int[] programs) { + long __functionAddress = GL.getICD().glDeleteProgramsARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(programs.length, programs, __functionAddress); + } + + /** Array version of: {@link #glGenProgramsARB GenProgramsARB} */ + public static void glGenProgramsARB(@NativeType("GLuint *") int[] programs) { + long __functionAddress = GL.getICD().glGenProgramsARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(programs.length, programs, __functionAddress); + } + + /** Array version of: {@link #glProgramEnvParameter4dvARB ProgramEnvParameter4dvARB} */ + public static void glProgramEnvParameter4dvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] params) { + long __functionAddress = GL.getICD().glProgramEnvParameter4dvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, index, params, __functionAddress); + } + + /** Array version of: {@link #glProgramEnvParameter4fvARB ProgramEnvParameter4fvARB} */ + public static void glProgramEnvParameter4fvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glProgramEnvParameter4fvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, index, params, __functionAddress); + } + + /** Array version of: {@link #glProgramLocalParameter4dvARB ProgramLocalParameter4dvARB} */ + public static void glProgramLocalParameter4dvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] params) { + long __functionAddress = GL.getICD().glProgramLocalParameter4dvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, index, params, __functionAddress); + } + + /** Array version of: {@link #glProgramLocalParameter4fvARB ProgramLocalParameter4fvARB} */ + public static void glProgramLocalParameter4fvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glProgramLocalParameter4fvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetProgramEnvParameterfvARB GetProgramEnvParameterfvARB} */ + public static void glGetProgramEnvParameterfvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetProgramEnvParameterfvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetProgramEnvParameterdvARB GetProgramEnvParameterdvARB} */ + public static void glGetProgramEnvParameterdvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetProgramEnvParameterdvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetProgramLocalParameterfvARB GetProgramLocalParameterfvARB} */ + public static void glGetProgramLocalParameterfvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetProgramLocalParameterfvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetProgramLocalParameterdvARB GetProgramLocalParameterdvARB} */ + public static void glGetProgramLocalParameterdvARB(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetProgramLocalParameterdvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetProgramivARB GetProgramivARB} */ + public static void glGetProgramivARB(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetProgramivARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetVertexAttribfvARB GetVertexAttribfvARB} */ + public static void glGetVertexAttribfvARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + ARBVertexShader.glGetVertexAttribfvARB(index, pname, params); + } + + /** Array version of: {@link #glGetVertexAttribdvARB GetVertexAttribdvARB} */ + public static void glGetVertexAttribdvARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] params) { + ARBVertexShader.glGetVertexAttribdvARB(index, pname, params); + } + + /** Array version of: {@link #glGetVertexAttribivARB GetVertexAttribivARB} */ + public static void glGetVertexAttribivARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + ARBVertexShader.glGetVertexAttribivARB(index, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexShader.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexShader.java new file mode 100644 index 000000000..b0d27e5b8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexShader.java @@ -0,0 +1,1268 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_vertex_shader extension. + * + *

    This extension adds programmable vertex level processing to OpenGL. The application can write vertex shaders in a high level language as defined in the + * OpenGL Shading Language specification. A vertex shader replaces the transformation, texture coordinate generation and lighting parts of OpenGL, and it + * also adds texture access at the vertex level. Furthermore, management of vertex shader objects and loading generic attributes are discussed. A vertex + * shader object, attached to a program object, can be compiled and linked to produce an executable that runs on the vertex processor in OpenGL. + * This extension also defines how such an executable interacts with the fixed functionality vertex processing of OpenGL 1.4.

    + * + *

    Promoted to core in {@link GL20 OpenGL 2.0}.

    + */ +public class ARBVertexShader { + + static { GL.initialize(); } + + /** Accepted by the {@code shaderType} argument of CreateShaderObjectARB and returned by the {@code params} parameter of GetObjectParameter{if}vARB. */ + public static final int GL_VERTEX_SHADER_ARB = 0x8B31; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB = 0x8B4A, + GL_MAX_VARYING_FLOATS_ARB = 0x8B4B, + GL_MAX_VERTEX_ATTRIBS_ARB = 0x8869, + GL_MAX_TEXTURE_IMAGE_UNITS_ARB = 0x8872, + GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB = 0x8B4C, + GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB = 0x8B4D, + GL_MAX_TEXTURE_COORDS_ARB = 0x8871; + + /** + * Accepted by the {@code cap} parameter of Disable, Enable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int + GL_VERTEX_PROGRAM_POINT_SIZE_ARB = 0x8642, + GL_VERTEX_PROGRAM_TWO_SIDE_ARB = 0x8643; + + /** Accepted by the {@code pname} parameter GetObjectParameter{if}vARB. */ + public static final int + GL_OBJECT_ACTIVE_ATTRIBUTES_ARB = 0x8B89, + GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB = 0x8B8A; + + /** Accepted by the {@code pname} parameter of GetVertexAttrib{dfi}vARB. */ + public static final int + GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB = 0x8622, + GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB = 0x8623, + GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB = 0x8624, + GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB = 0x8625, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB = 0x886A, + GL_CURRENT_VERTEX_ATTRIB_ARB = 0x8626; + + /** Accepted by the {@code pname} parameter of GetVertexAttribPointervARB. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB = 0x8645; + + /** Returned by the {@code type} parameter of GetActiveAttribARB. */ + public static final int + GL_FLOAT_VEC2_ARB = 0x8B50, + GL_FLOAT_VEC3_ARB = 0x8B51, + GL_FLOAT_VEC4_ARB = 0x8B52, + GL_FLOAT_MAT2_ARB = 0x8B5A, + GL_FLOAT_MAT3_ARB = 0x8B5B, + GL_FLOAT_MAT4_ARB = 0x8B5C; + + protected ARBVertexShader() { + throw new UnsupportedOperationException(); + } + + // --- [ glVertexAttrib1fARB ] --- + + /** + * Specifies the value of a generic vertex attribute. The y and z components are implicitly set to 0.0f and w to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + */ + public static native void glVertexAttrib1fARB(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0); + + // --- [ glVertexAttrib1sARB ] --- + + /** + * Short version of {@link #glVertexAttrib1fARB VertexAttrib1fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + */ + public static native void glVertexAttrib1sARB(@NativeType("GLuint") int index, @NativeType("GLshort") short v0); + + // --- [ glVertexAttrib1dARB ] --- + + /** + * Double version of {@link #glVertexAttrib1fARB VertexAttrib1fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + */ + public static native void glVertexAttrib1dARB(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0); + + // --- [ glVertexAttrib2fARB ] --- + + /** + * Specifies the value of a generic vertex attribute. The y component is implicitly set to 0.0f and w to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + */ + public static native void glVertexAttrib2fARB(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1); + + // --- [ glVertexAttrib2sARB ] --- + + /** + * Short version of {@link #glVertexAttrib2fARB VertexAttrib2fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + */ + public static native void glVertexAttrib2sARB(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1); + + // --- [ glVertexAttrib2dARB ] --- + + /** + * Double version of {@link #glVertexAttrib2fARB VertexAttrib2fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + */ + public static native void glVertexAttrib2dARB(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1); + + // --- [ glVertexAttrib3fARB ] --- + + /** + * Specifies the value of a generic vertex attribute. The w is implicitly set to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + */ + public static native void glVertexAttrib3fARB(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2); + + // --- [ glVertexAttrib3sARB ] --- + + /** + * Short version of {@link #glVertexAttrib3fARB VertexAttrib3fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + */ + public static native void glVertexAttrib3sARB(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1, @NativeType("GLshort") short v2); + + // --- [ glVertexAttrib3dARB ] --- + + /** + * Double version of {@link #glVertexAttrib3fARB VertexAttrib3fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + */ + public static native void glVertexAttrib3dARB(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1, @NativeType("GLdouble") double v2); + + // --- [ glVertexAttrib4fARB ] --- + + /** + * Specifies the value of a generic vertex attribute. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + */ + public static native void glVertexAttrib4fARB(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2, @NativeType("GLfloat") float v3); + + // --- [ glVertexAttrib4sARB ] --- + + /** + * Short version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + */ + public static native void glVertexAttrib4sARB(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1, @NativeType("GLshort") short v2, @NativeType("GLshort") short v3); + + // --- [ glVertexAttrib4dARB ] --- + + /** + * Double version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + */ + public static native void glVertexAttrib4dARB(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1, @NativeType("GLdouble") double v2, @NativeType("GLdouble") double v3); + + // --- [ glVertexAttrib4NubARB ] --- + + /** + * Normalized unsigned byte version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + */ + public static native void glVertexAttrib4NubARB(@NativeType("GLuint") int index, @NativeType("GLubyte") byte x, @NativeType("GLubyte") byte y, @NativeType("GLubyte") byte z, @NativeType("GLubyte") byte w); + + // --- [ glVertexAttrib1fvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib1fvARB VertexAttrib1fvARB} */ + public static native void nglVertexAttrib1fvARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib1fARB VertexAttrib1fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib1fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttrib1fvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib1svARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib1svARB VertexAttrib1svARB} */ + public static native void nglVertexAttrib1svARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib1sARB VertexAttrib1sARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib1svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttrib1svARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib1dvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib1dvARB VertexAttrib1dvARB} */ + public static native void nglVertexAttrib1dvARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib1dARB VertexAttrib1dARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib1dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttrib1dvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib2fvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib2fvARB VertexAttrib2fvARB} */ + public static native void nglVertexAttrib2fvARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib2fARB VertexAttrib2fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib2fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttrib2fvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib2svARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib2svARB VertexAttrib2svARB} */ + public static native void nglVertexAttrib2svARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib2sARB VertexAttrib2sARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib2svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttrib2svARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib2dvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib2dvARB VertexAttrib2dvARB} */ + public static native void nglVertexAttrib2dvARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib2dARB VertexAttrib2dARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib2dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttrib2dvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib3fvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib3fvARB VertexAttrib3fvARB} */ + public static native void nglVertexAttrib3fvARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib3fARB VertexAttrib3fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib3fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttrib3fvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib3svARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib3svARB VertexAttrib3svARB} */ + public static native void nglVertexAttrib3svARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib3sARB VertexAttrib3sARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib3svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttrib3svARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib3dvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib3dvARB VertexAttrib3dvARB} */ + public static native void nglVertexAttrib3dvARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib3dARB VertexAttrib3dARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib3dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttrib3dvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4fvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4fvARB VertexAttrib4fvARB} */ + public static native void nglVertexAttrib4fvARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4fvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4svARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4svARB VertexAttrib4svARB} */ + public static native void nglVertexAttrib4svARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib4sARB VertexAttrib4sARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4svARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4dvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4dvARB VertexAttrib4dvARB} */ + public static native void nglVertexAttrib4dvARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib4dARB VertexAttrib4dARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4dvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4ivARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4ivARB VertexAttrib4ivARB} */ + public static native void nglVertexAttrib4ivARB(int index, long v); + + /** + * Integer pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4ivARB(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4ivARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4bvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4bvARB VertexAttrib4bvARB} */ + public static native void nglVertexAttrib4bvARB(int index, long v); + + /** + * Byte pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4bvARB(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4bvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4ubvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4ubvARB VertexAttrib4ubvARB} */ + public static native void nglVertexAttrib4ubvARB(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib4NubARB VertexAttrib4NubARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4ubvARB(@NativeType("GLuint") int index, @NativeType("GLubyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4ubvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4usvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4usvARB VertexAttrib4usvARB} */ + public static native void nglVertexAttrib4usvARB(int index, long v); + + /** + * Unsigned short pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4usvARB(@NativeType("GLuint") int index, @NativeType("GLushort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4usvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4uivARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4uivARB VertexAttrib4uivARB} */ + public static native void nglVertexAttrib4uivARB(int index, long v); + + /** + * Unsigned int pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4uivARB(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4uivARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4NbvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NbvARB VertexAttrib4NbvARB} */ + public static native void nglVertexAttrib4NbvARB(int index, long v); + + /** + * Normalized byte pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NbvARB(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4NbvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4NsvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NsvARB VertexAttrib4NsvARB} */ + public static native void nglVertexAttrib4NsvARB(int index, long v); + + /** + * Normalized short pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NsvARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4NsvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4NivARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NivARB VertexAttrib4NivARB} */ + public static native void nglVertexAttrib4NivARB(int index, long v); + + /** + * Normalized int pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NivARB(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4NivARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4NubvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NubvARB VertexAttrib4NubvARB} */ + public static native void nglVertexAttrib4NubvARB(int index, long v); + + /** + * Normalized unsigned byte pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NubvARB(@NativeType("GLuint") int index, @NativeType("GLubyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4NubvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4NusvARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NusvARB VertexAttrib4NusvARB} */ + public static native void nglVertexAttrib4NusvARB(int index, long v); + + /** + * Normalized unsigned short pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NusvARB(@NativeType("GLuint") int index, @NativeType("GLushort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4NusvARB(index, memAddress(v)); + } + + // --- [ glVertexAttrib4NuivARB ] --- + + /** Unsafe version of: {@link #glVertexAttrib4NuivARB VertexAttrib4NuivARB} */ + public static native void nglVertexAttrib4NuivARB(int index, long v); + + /** + * Normalized unsigned int pointer version of {@link #glVertexAttrib4fARB VertexAttrib4fARB}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + */ + public static void glVertexAttrib4NuivARB(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4NuivARB(index, memAddress(v)); + } + + // --- [ glVertexAttribPointerARB ] --- + + /** Unsafe version of: {@link #glVertexAttribPointerARB VertexAttribPointerARB} */ + public static native void nglVertexAttribPointerARB(int index, int size, int type, boolean normalized, int stride, long pointer); + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglVertexAttribPointerARB(index, size, type, normalized, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglVertexAttribPointerARB(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglVertexAttribPointerARB(index, size, type, normalized, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglVertexAttribPointerARB(index, size, type, normalized, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglVertexAttribPointerARB(index, size, type, normalized, stride, memAddress(pointer)); + } + + // --- [ glEnableVertexAttribArrayARB ] --- + + /** + * Enables a generic vertex attribute array. + * + * @param index the index of the generic vertex attribute to be enabled + */ + public static native void glEnableVertexAttribArrayARB(@NativeType("GLuint") int index); + + // --- [ glDisableVertexAttribArrayARB ] --- + + /** + * Disables a generic vertex attribute array. + * + * @param index the index of the generic vertex attribute to be disabled + */ + public static native void glDisableVertexAttribArrayARB(@NativeType("GLuint") int index); + + // --- [ glBindAttribLocationARB ] --- + + /** Unsafe version of: {@link #glBindAttribLocationARB BindAttribLocationARB} */ + public static native void nglBindAttribLocationARB(int programObj, int index, long name); + + /** + * Associates a generic vertex attribute index with a named attribute variable. + * + * @param programObj the handle of the program object in which the association is to be made + * @param index the index of the generic vertex attribute to be bound + * @param name a null terminated string containing the name of the vertex shader attribute variable to which {@code index} is to be bound + */ + public static void glBindAttribLocationARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLuint") int index, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + nglBindAttribLocationARB(programObj, index, memAddress(name)); + } + + /** + * Associates a generic vertex attribute index with a named attribute variable. + * + * @param programObj the handle of the program object in which the association is to be made + * @param index the index of the generic vertex attribute to be bound + * @param name a null terminated string containing the name of the vertex shader attribute variable to which {@code index} is to be bound + */ + public static void glBindAttribLocationARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLuint") int index, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + nglBindAttribLocationARB(programObj, index, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetActiveAttribARB ] --- + + /** + * Unsafe version of: {@link #glGetActiveAttribARB GetActiveAttribARB} + * + * @param maxLength the maximum number of characters OpenGL is allowed to write in the character buffer indicated by {@code name} + */ + public static native void nglGetActiveAttribARB(int programObj, int index, int maxLength, long length, long size, long type, long name); + + /** + * Returns information about an active attribute variable for the specified program object. + * + * @param programObj the program object to be queried + * @param index the index of the attribute variable to be queried + * @param length the number of characters actually written by OpenGL in the string indicated by {@code name} (excluding the null terminator) if a value other than + * {@code NULL} is passed + * @param size the size of the attribute variable + * @param type the data type of the attribute variable + * @param name a null terminated string containing the name of the attribute variable + */ + public static void glGetActiveAttribARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type, @NativeType("GLchar *") ByteBuffer name) { + if (CHECKS) { + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + nglGetActiveAttribARB(programObj, index, name.remaining(), memAddressSafe(length), memAddress(size), memAddress(type), memAddress(name)); + } + + /** + * Returns information about an active attribute variable for the specified program object. + * + * @param programObj the program object to be queried + * @param index the index of the attribute variable to be queried + * @param maxLength the maximum number of characters OpenGL is allowed to write in the character buffer indicated by {@code name} + * @param size the size of the attribute variable + * @param type the data type of the attribute variable + */ + @NativeType("void") + public static String glGetActiveAttribARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLuint") int index, @NativeType("GLsizei") int maxLength, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + if (CHECKS) { + check(size, 1); + check(type, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer name = stack.malloc(maxLength); + nglGetActiveAttribARB(programObj, index, maxLength, memAddress(length), memAddress(size), memAddress(type), memAddress(name)); + return memASCII(name, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Returns information about an active attribute variable for the specified program object. + * + * @param programObj the program object to be queried + * @param index the index of the attribute variable to be queried + * @param size the size of the attribute variable + * @param type the data type of the attribute variable + */ + @NativeType("void") + public static String glGetActiveAttribARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return glGetActiveAttribARB(programObj, index, ARBShaderObjects.glGetObjectParameteriARB(programObj, GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB), size, type); + } + + // --- [ glGetAttribLocationARB ] --- + + /** Unsafe version of: {@link #glGetAttribLocationARB GetAttribLocationARB} */ + public static native int nglGetAttribLocationARB(int programObj, long name); + + /** + * Returns the location of an attribute variable. + * + * @param programObj the program object to be queried + * @param name a null terminated string containing the name of the attribute variable whose location is to be queried + */ + @NativeType("GLint") + public static int glGetAttribLocationARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetAttribLocationARB(programObj, memAddress(name)); + } + + /** + * Returns the location of an attribute variable. + * + * @param programObj the program object to be queried + * @param name a null terminated string containing the name of the attribute variable whose location is to be queried + */ + @NativeType("GLint") + public static int glGetAttribLocationARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetAttribLocationARB(programObj, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexAttribivARB ] --- + + /** Unsafe version of: {@link #glGetVertexAttribivARB GetVertexAttribivARB} */ + public static native void nglGetVertexAttribivARB(int index, int pname, long params); + + /** + * Returns the integer value of a generic vertex attribute parameter. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried. One of:
    {@link GL15#GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING VERTEX_ATTRIB_ARRAY_BUFFER_BINDING}{@link #GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB VERTEX_ATTRIB_ARRAY_ENABLED_ARB}
    {@link #GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB VERTEX_ATTRIB_ARRAY_SIZE_ARB}{@link #GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB VERTEX_ATTRIB_ARRAY_STRIDE_ARB}
    {@link #GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB VERTEX_ATTRIB_ARRAY_TYPE_ARB}{@link #GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB}
    {@link #GL_CURRENT_VERTEX_ATTRIB_ARB CURRENT_VERTEX_ATTRIB_ARB}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}
    + * @param params returns the requested data + */ + public static void glGetVertexAttribivARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetVertexAttribivARB(index, pname, memAddress(params)); + } + + /** + * Returns the integer value of a generic vertex attribute parameter. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried. One of:
    {@link GL15#GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING VERTEX_ATTRIB_ARRAY_BUFFER_BINDING}{@link #GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB VERTEX_ATTRIB_ARRAY_ENABLED_ARB}
    {@link #GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB VERTEX_ATTRIB_ARRAY_SIZE_ARB}{@link #GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB VERTEX_ATTRIB_ARRAY_STRIDE_ARB}
    {@link #GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB VERTEX_ATTRIB_ARRAY_TYPE_ARB}{@link #GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB}
    {@link #GL_CURRENT_VERTEX_ATTRIB_ARB CURRENT_VERTEX_ATTRIB_ARB}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}
    + */ + @NativeType("void") + public static int glGetVertexAttribiARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetVertexAttribivARB(index, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexAttribfvARB ] --- + + /** Unsafe version of: {@link #glGetVertexAttribfvARB GetVertexAttribfvARB} */ + public static native void nglGetVertexAttribfvARB(int index, int pname, long params); + + /** + * Float version of {@link #glGetVertexAttribivARB GetVertexAttribivARB}. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params returns the requested data + */ + public static void glGetVertexAttribfvARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetVertexAttribfvARB(index, pname, memAddress(params)); + } + + // --- [ glGetVertexAttribdvARB ] --- + + /** Unsafe version of: {@link #glGetVertexAttribdvARB GetVertexAttribdvARB} */ + public static native void nglGetVertexAttribdvARB(int index, int pname, long params); + + /** + * Double version of {@link #glGetVertexAttribivARB GetVertexAttribivARB}. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params returns the requested data + */ + public static void glGetVertexAttribdvARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetVertexAttribdvARB(index, pname, memAddress(params)); + } + + // --- [ glGetVertexAttribPointervARB ] --- + + /** Unsafe version of: {@link #glGetVertexAttribPointervARB GetVertexAttribPointervARB} */ + public static native void nglGetVertexAttribPointervARB(int index, int pname, long pointer); + + /** + * Returns the address of the specified generic vertex attribute pointer. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the generic vertex attribute parameter to be returned. Must be:
    {@link #GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB VERTEX_ATTRIB_ARRAY_POINTER_ARB}
    + * @param pointer the pointer value + */ + public static void glGetVertexAttribPointervARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer pointer) { + if (CHECKS) { + check(pointer, 1); + } + nglGetVertexAttribPointervARB(index, pname, memAddress(pointer)); + } + + /** + * Returns the address of the specified generic vertex attribute pointer. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the generic vertex attribute parameter to be returned. Must be:
    {@link #GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB VERTEX_ATTRIB_ARRAY_POINTER_ARB}
    + */ + @NativeType("void") + public static long glGetVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer pointer = stack.callocPointer(1); + nglGetVertexAttribPointervARB(index, pname, memAddress(pointer)); + return pointer.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glVertexAttrib1fvARB VertexAttrib1fvARB} */ + public static void glVertexAttrib1fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glVertexAttrib1fvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib1svARB VertexAttrib1svARB} */ + public static void glVertexAttrib1svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib1svARB; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib1dvARB VertexAttrib1dvARB} */ + public static void glVertexAttrib1dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttrib1dvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib2fvARB VertexAttrib2fvARB} */ + public static void glVertexAttrib2fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glVertexAttrib2fvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib2svARB VertexAttrib2svARB} */ + public static void glVertexAttrib2svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib2svARB; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib2dvARB VertexAttrib2dvARB} */ + public static void glVertexAttrib2dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttrib2dvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib3fvARB VertexAttrib3fvARB} */ + public static void glVertexAttrib3fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glVertexAttrib3fvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib3svARB VertexAttrib3svARB} */ + public static void glVertexAttrib3svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib3svARB; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib3dvARB VertexAttrib3dvARB} */ + public static void glVertexAttrib3dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttrib3dvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib4fvARB VertexAttrib4fvARB} */ + public static void glVertexAttrib4fvARB(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4fvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib4svARB VertexAttrib4svARB} */ + public static void glVertexAttrib4svARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4svARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib4dvARB VertexAttrib4dvARB} */ + public static void glVertexAttrib4dvARB(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4dvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib4ivARB VertexAttrib4ivARB} */ + public static void glVertexAttrib4ivARB(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4ivARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib4usvARB VertexAttrib4usvARB} */ + public static void glVertexAttrib4usvARB(@NativeType("GLuint") int index, @NativeType("GLushort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4usvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib4uivARB VertexAttrib4uivARB} */ + public static void glVertexAttrib4uivARB(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4uivARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib4NsvARB VertexAttrib4NsvARB} */ + public static void glVertexAttrib4NsvARB(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4NsvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib4NivARB VertexAttrib4NivARB} */ + public static void glVertexAttrib4NivARB(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4NivARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib4NusvARB VertexAttrib4NusvARB} */ + public static void glVertexAttrib4NusvARB(@NativeType("GLuint") int index, @NativeType("GLushort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4NusvARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib4NuivARB VertexAttrib4NuivARB} */ + public static void glVertexAttrib4NuivARB(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4NuivARB; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribPointerARB VertexAttribPointerARB} */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") short[] pointer) { + long __functionAddress = GL.getICD().glVertexAttribPointerARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(index, size, type, normalized, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribPointerARB VertexAttribPointerARB} */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") int[] pointer) { + long __functionAddress = GL.getICD().glVertexAttribPointerARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(index, size, type, normalized, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribPointerARB VertexAttribPointerARB} */ + public static void glVertexAttribPointerARB(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") float[] pointer) { + long __functionAddress = GL.getICD().glVertexAttribPointerARB; + if (CHECKS) { + check(__functionAddress); + } + callPV(index, size, type, normalized, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glGetActiveAttribARB GetActiveAttribARB} */ + public static void glGetActiveAttribARB(@NativeType("GLhandleARB") int programObj, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] size, @NativeType("GLenum *") int[] type, @NativeType("GLchar *") ByteBuffer name) { + long __functionAddress = GL.getICD().glGetActiveAttribARB; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + callPPPPV(programObj, index, name.remaining(), length, size, type, memAddress(name), __functionAddress); + } + + /** Array version of: {@link #glGetVertexAttribivARB GetVertexAttribivARB} */ + public static void glGetVertexAttribivARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribivARB; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(index, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetVertexAttribfvARB GetVertexAttribfvARB} */ + public static void glGetVertexAttribfvARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribfvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(index, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetVertexAttribdvARB GetVertexAttribdvARB} */ + public static void glGetVertexAttribdvARB(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribdvARB; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(index, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexType2_10_10_10_REV.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexType2_10_10_10_REV.java new file mode 100644 index 000000000..4626d309d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBVertexType2_10_10_10_REV.java @@ -0,0 +1,705 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_vertex_type_2_10_10_10_rev extension. + * + *

    This extension adds two new vertex attribute data formats: a signed 2.10.10.10 and an unsigned 2.10.10.10 vertex data format. These vertex data formats + * describe a 4 component stream which can be used to store normals or other attributes in a quantized form. Normals, tangents, binormals and other vertex + * attributes can often be specified at reduced precision without introducing noticeable artifacts, reducing the amount of memory and memory bandwidth they consume.

    + * + *

    Promoted to core in {@link GL33 OpenGL 3.3}.

    + */ +public class ARBVertexType2_10_10_10_REV { + + static { GL.initialize(); } + + /** + * Accepted by the {@code type} parameter of VertexAttribPointer, VertexPointer, NormalPointer, ColorPointer, SecondaryColorPointer, TexCoordPointer, + * VertexAttribP{1234}ui, VertexP*, TexCoordP*, MultiTexCoordP*, NormalP3ui, ColorP*, SecondaryColorP and VertexAttribP*. + */ + public static final int GL_INT_2_10_10_10_REV = 0x8D9F; + + protected ARBVertexType2_10_10_10_REV() { + throw new UnsupportedOperationException(); + } + + // --- [ glVertexP2ui ] --- + + /** + * Packed component version of {@link GL11#glVertex2f Vertex2f}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + */ + public static void glVertexP2ui(@NativeType("GLenum") int type, @NativeType("GLuint") int value) { + GL33.glVertexP2ui(type, value); + } + + // --- [ glVertexP3ui ] --- + + /** + * Packed component version of {@link GL11#glVertex3f Vertex3f}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + */ + public static void glVertexP3ui(@NativeType("GLenum") int type, @NativeType("GLuint") int value) { + GL33.glVertexP3ui(type, value); + } + + // --- [ glVertexP4ui ] --- + + /** + * Packed component version of {@link GL11#glVertex4f Vertex4f}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + */ + public static void glVertexP4ui(@NativeType("GLenum") int type, @NativeType("GLuint") int value) { + GL33.glVertexP4ui(type, value); + } + + // --- [ glVertexP2uiv ] --- + + /** Unsafe version of: {@link #glVertexP2uiv VertexP2uiv} */ + public static void nglVertexP2uiv(int type, long value) { + GL33.nglVertexP2uiv(type, value); + } + + /** + * Pointer version of {@link #glVertexP2ui VertexP2ui}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + */ + public static void glVertexP2uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer value) { + GL33.glVertexP2uiv(type, value); + } + + // --- [ glVertexP3uiv ] --- + + /** Unsafe version of: {@link #glVertexP3uiv VertexP3uiv} */ + public static void nglVertexP3uiv(int type, long value) { + GL33.nglVertexP3uiv(type, value); + } + + /** + * Pointer version of {@link #glVertexP3ui VertexP3ui}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + */ + public static void glVertexP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer value) { + GL33.glVertexP3uiv(type, value); + } + + // --- [ glVertexP4uiv ] --- + + /** Unsafe version of: {@link #glVertexP4uiv VertexP4uiv} */ + public static void nglVertexP4uiv(int type, long value) { + GL33.nglVertexP4uiv(type, value); + } + + /** + * Pointer version of {@link #glVertexP4ui VertexP4ui}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + */ + public static void glVertexP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer value) { + GL33.glVertexP4uiv(type, value); + } + + // --- [ glTexCoordP1ui ] --- + + /** + * Packed component version of {@link GL11#glTexCoord1f TexCoord1f}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glTexCoordP1ui(@NativeType("GLenum") int type, @NativeType("GLuint") int coords) { + GL33.glTexCoordP1ui(type, coords); + } + + // --- [ glTexCoordP2ui ] --- + + /** + * Packed component version of {@link GL11#glTexCoord2f TexCoord2f}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glTexCoordP2ui(@NativeType("GLenum") int type, @NativeType("GLuint") int coords) { + GL33.glTexCoordP2ui(type, coords); + } + + // --- [ glTexCoordP3ui ] --- + + /** + * Packed component version of {@link GL11#glTexCoord3f TexCoord3f}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glTexCoordP3ui(@NativeType("GLenum") int type, @NativeType("GLuint") int coords) { + GL33.glTexCoordP3ui(type, coords); + } + + // --- [ glTexCoordP4ui ] --- + + /** + * Packed component version of {@link GL11#glTexCoord4f TexCoord4f}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glTexCoordP4ui(@NativeType("GLenum") int type, @NativeType("GLuint") int coords) { + GL33.glTexCoordP4ui(type, coords); + } + + // --- [ glTexCoordP1uiv ] --- + + /** Unsafe version of: {@link #glTexCoordP1uiv TexCoordP1uiv} */ + public static void nglTexCoordP1uiv(int type, long coords) { + GL33.nglTexCoordP1uiv(type, coords); + } + + /** + * Pointer version of {@link #glTexCoordP1ui TexCoordP1ui}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glTexCoordP1uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + GL33.glTexCoordP1uiv(type, coords); + } + + // --- [ glTexCoordP2uiv ] --- + + /** Unsafe version of: {@link #glTexCoordP2uiv TexCoordP2uiv} */ + public static void nglTexCoordP2uiv(int type, long coords) { + GL33.nglTexCoordP2uiv(type, coords); + } + + /** + * Pointer version of {@link #glTexCoordP2ui TexCoordP2ui}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glTexCoordP2uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + GL33.glTexCoordP2uiv(type, coords); + } + + // --- [ glTexCoordP3uiv ] --- + + /** Unsafe version of: {@link #glTexCoordP3uiv TexCoordP3uiv} */ + public static void nglTexCoordP3uiv(int type, long coords) { + GL33.nglTexCoordP3uiv(type, coords); + } + + /** + * Pointer version of {@link #glTexCoordP3ui TexCoordP3ui}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glTexCoordP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + GL33.glTexCoordP3uiv(type, coords); + } + + // --- [ glTexCoordP4uiv ] --- + + /** Unsafe version of: {@link #glTexCoordP4uiv TexCoordP4uiv} */ + public static void nglTexCoordP4uiv(int type, long coords) { + GL33.nglTexCoordP4uiv(type, coords); + } + + /** + * Pointer version of {@link #glTexCoordP4ui TexCoordP4ui}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glTexCoordP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + GL33.glTexCoordP4uiv(type, coords); + } + + // --- [ glMultiTexCoordP1ui ] --- + + /** + * Packed component version of {@link GL13#glMultiTexCoord1f MultiTexCoord1f}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    typeofpackingusedonthedata
    + * @param coords the packed value + */ + public static void glMultiTexCoordP1ui(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint") int coords) { + GL33.glMultiTexCoordP1ui(texture, type, coords); + } + + // --- [ glMultiTexCoordP2ui ] --- + + /** + * Packed component version of {@link GL13#glMultiTexCoord2f MultiTexCoord2f}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    typeofpackingusedonthedata
    + * @param coords the packed value + */ + public static void glMultiTexCoordP2ui(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint") int coords) { + GL33.glMultiTexCoordP2ui(texture, type, coords); + } + + // --- [ glMultiTexCoordP3ui ] --- + + /** + * Packed component version of {@link GL13#glMultiTexCoord3f MultiTexCoord3f}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    typeofpackingusedonthedata
    + * @param coords the packed value + */ + public static void glMultiTexCoordP3ui(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint") int coords) { + GL33.glMultiTexCoordP3ui(texture, type, coords); + } + + // --- [ glMultiTexCoordP4ui ] --- + + /** + * Packed component version of {@link GL13#glMultiTexCoord4f MultiTexCoord4f}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    typeofpackingusedonthedata
    + * @param coords the packed value + */ + public static void glMultiTexCoordP4ui(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint") int coords) { + GL33.glMultiTexCoordP4ui(texture, type, coords); + } + + // --- [ glMultiTexCoordP1uiv ] --- + + /** Unsafe version of: {@link #glMultiTexCoordP1uiv MultiTexCoordP1uiv} */ + public static void nglMultiTexCoordP1uiv(int texture, int type, long coords) { + GL33.nglMultiTexCoordP1uiv(texture, type, coords); + } + + /** + * Pointer version of {@link #glMultiTexCoordP1ui MultiTexCoordP1ui}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glMultiTexCoordP1uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + GL33.glMultiTexCoordP1uiv(texture, type, coords); + } + + // --- [ glMultiTexCoordP2uiv ] --- + + /** Unsafe version of: {@link #glMultiTexCoordP2uiv MultiTexCoordP2uiv} */ + public static void nglMultiTexCoordP2uiv(int texture, int type, long coords) { + GL33.nglMultiTexCoordP2uiv(texture, type, coords); + } + + /** + * Pointer version of {@link #glMultiTexCoordP2ui MultiTexCoordP2ui}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glMultiTexCoordP2uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + GL33.glMultiTexCoordP2uiv(texture, type, coords); + } + + // --- [ glMultiTexCoordP3uiv ] --- + + /** Unsafe version of: {@link #glMultiTexCoordP3uiv MultiTexCoordP3uiv} */ + public static void nglMultiTexCoordP3uiv(int texture, int type, long coords) { + GL33.nglMultiTexCoordP3uiv(texture, type, coords); + } + + /** + * Pointer version of {@link #glMultiTexCoordP3ui MultiTexCoordP3ui}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glMultiTexCoordP3uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + GL33.glMultiTexCoordP3uiv(texture, type, coords); + } + + // --- [ glMultiTexCoordP4uiv ] --- + + /** Unsafe version of: {@link #glMultiTexCoordP4uiv MultiTexCoordP4uiv} */ + public static void nglMultiTexCoordP4uiv(int texture, int type, long coords) { + GL33.nglMultiTexCoordP4uiv(texture, type, coords); + } + + /** + * Pointer version of {@link #glMultiTexCoordP4ui MultiTexCoordP4ui}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glMultiTexCoordP4uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + GL33.glMultiTexCoordP4uiv(texture, type, coords); + } + + // --- [ glNormalP3ui ] --- + + /** + * Packed component version of {@link GL11#glNormal3f Normal3f}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glNormalP3ui(@NativeType("GLenum") int type, @NativeType("GLuint") int coords) { + GL33.glNormalP3ui(type, coords); + } + + // --- [ glNormalP3uiv ] --- + + /** Unsafe version of: {@link #glNormalP3uiv NormalP3uiv} */ + public static void nglNormalP3uiv(int type, long coords) { + GL33.nglNormalP3uiv(type, coords); + } + + /** + * Pointer version {@link #glNormalP3ui NormalP3ui}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + */ + public static void glNormalP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + GL33.glNormalP3uiv(type, coords); + } + + // --- [ glColorP3ui ] --- + + /** + * Packed component version of {@link GL11#glColor3f Color3f}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + */ + public static void glColorP3ui(@NativeType("GLenum") int type, @NativeType("GLuint") int color) { + GL33.glColorP3ui(type, color); + } + + // --- [ glColorP4ui ] --- + + /** + * Packed component version of {@link GL11#glColor4f Color4f}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + */ + public static void glColorP4ui(@NativeType("GLenum") int type, @NativeType("GLuint") int color) { + GL33.glColorP4ui(type, color); + } + + // --- [ glColorP3uiv ] --- + + /** Unsafe version of: {@link #glColorP3uiv ColorP3uiv} */ + public static void nglColorP3uiv(int type, long color) { + GL33.nglColorP3uiv(type, color); + } + + /** + * Pointer version of {@link #glColorP3ui ColorP3ui}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + */ + public static void glColorP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer color) { + GL33.glColorP3uiv(type, color); + } + + // --- [ glColorP4uiv ] --- + + /** Unsafe version of: {@link #glColorP4uiv ColorP4uiv} */ + public static void nglColorP4uiv(int type, long color) { + GL33.nglColorP4uiv(type, color); + } + + /** + * Pointer version of {@link #glColorP4ui ColorP4ui}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + */ + public static void glColorP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer color) { + GL33.glColorP4uiv(type, color); + } + + // --- [ glSecondaryColorP3ui ] --- + + /** + * Packed component version of {@link GL14#glSecondaryColor3f SecondaryColor3f}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + */ + public static void glSecondaryColorP3ui(@NativeType("GLenum") int type, @NativeType("GLuint") int color) { + GL33.glSecondaryColorP3ui(type, color); + } + + // --- [ glSecondaryColorP3uiv ] --- + + /** Unsafe version of: {@link #glSecondaryColorP3uiv SecondaryColorP3uiv} */ + public static void nglSecondaryColorP3uiv(int type, long color) { + GL33.nglSecondaryColorP3uiv(type, color); + } + + /** + * Pointer version of {@link #glSecondaryColorP3ui SecondaryColorP3ui}. + * + * @param type type of packing used on the data. One of:
    {@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + */ + public static void glSecondaryColorP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer color) { + GL33.glSecondaryColorP3uiv(type, color); + } + + // --- [ glVertexAttribP1ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib1f VertexAttrib1f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + */ + public static void glVertexAttribP1ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value) { + GL33C.glVertexAttribP1ui(index, type, normalized, value); + } + + // --- [ glVertexAttribP2ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib2f VertexAttrib2f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + */ + public static void glVertexAttribP2ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value) { + GL33C.glVertexAttribP2ui(index, type, normalized, value); + } + + // --- [ glVertexAttribP3ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib3f VertexAttrib3f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + */ + public static void glVertexAttribP3ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value) { + GL33C.glVertexAttribP3ui(index, type, normalized, value); + } + + // --- [ glVertexAttribP4ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + */ + public static void glVertexAttribP4ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value) { + GL33C.glVertexAttribP4ui(index, type, normalized, value); + } + + // --- [ glVertexAttribP1uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP1uiv VertexAttribP1uiv} */ + public static void nglVertexAttribP1uiv(int index, int type, boolean normalized, long value) { + GL33C.nglVertexAttribP1uiv(index, type, normalized, value); + } + + /** + * Pointer version of {@link #glVertexAttribP1ui VertexAttribP1ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + */ + public static void glVertexAttribP1uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + GL33C.glVertexAttribP1uiv(index, type, normalized, value); + } + + // --- [ glVertexAttribP2uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP2uiv VertexAttribP2uiv} */ + public static void nglVertexAttribP2uiv(int index, int type, boolean normalized, long value) { + GL33C.nglVertexAttribP2uiv(index, type, normalized, value); + } + + /** + * Pointer version of {@link #glVertexAttribP2ui VertexAttribP2ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + */ + public static void glVertexAttribP2uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + GL33C.glVertexAttribP2uiv(index, type, normalized, value); + } + + // --- [ glVertexAttribP3uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP3uiv VertexAttribP3uiv} */ + public static void nglVertexAttribP3uiv(int index, int type, boolean normalized, long value) { + GL33C.nglVertexAttribP3uiv(index, type, normalized, value); + } + + /** + * Pointer version of {@link #glVertexAttribP3ui VertexAttribP3ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + */ + public static void glVertexAttribP3uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + GL33C.glVertexAttribP3uiv(index, type, normalized, value); + } + + // --- [ glVertexAttribP4uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP4uiv VertexAttribP4uiv} */ + public static void nglVertexAttribP4uiv(int index, int type, boolean normalized, long value) { + GL33C.nglVertexAttribP4uiv(index, type, normalized, value); + } + + /** + * Pointer version of {@link #glVertexAttribP4ui VertexAttribP4ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + */ + public static void glVertexAttribP4uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + GL33C.glVertexAttribP4uiv(index, type, normalized, value); + } + + /** Array version of: {@link #glVertexP2uiv VertexP2uiv} */ + public static void glVertexP2uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] value) { + GL33.glVertexP2uiv(type, value); + } + + /** Array version of: {@link #glVertexP3uiv VertexP3uiv} */ + public static void glVertexP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] value) { + GL33.glVertexP3uiv(type, value); + } + + /** Array version of: {@link #glVertexP4uiv VertexP4uiv} */ + public static void glVertexP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] value) { + GL33.glVertexP4uiv(type, value); + } + + /** Array version of: {@link #glTexCoordP1uiv TexCoordP1uiv} */ + public static void glTexCoordP1uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + GL33.glTexCoordP1uiv(type, coords); + } + + /** Array version of: {@link #glTexCoordP2uiv TexCoordP2uiv} */ + public static void glTexCoordP2uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + GL33.glTexCoordP2uiv(type, coords); + } + + /** Array version of: {@link #glTexCoordP3uiv TexCoordP3uiv} */ + public static void glTexCoordP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + GL33.glTexCoordP3uiv(type, coords); + } + + /** Array version of: {@link #glTexCoordP4uiv TexCoordP4uiv} */ + public static void glTexCoordP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + GL33.glTexCoordP4uiv(type, coords); + } + + /** Array version of: {@link #glMultiTexCoordP1uiv MultiTexCoordP1uiv} */ + public static void glMultiTexCoordP1uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + GL33.glMultiTexCoordP1uiv(texture, type, coords); + } + + /** Array version of: {@link #glMultiTexCoordP2uiv MultiTexCoordP2uiv} */ + public static void glMultiTexCoordP2uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + GL33.glMultiTexCoordP2uiv(texture, type, coords); + } + + /** Array version of: {@link #glMultiTexCoordP3uiv MultiTexCoordP3uiv} */ + public static void glMultiTexCoordP3uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + GL33.glMultiTexCoordP3uiv(texture, type, coords); + } + + /** Array version of: {@link #glMultiTexCoordP4uiv MultiTexCoordP4uiv} */ + public static void glMultiTexCoordP4uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + GL33.glMultiTexCoordP4uiv(texture, type, coords); + } + + /** Array version of: {@link #glNormalP3uiv NormalP3uiv} */ + public static void glNormalP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + GL33.glNormalP3uiv(type, coords); + } + + /** Array version of: {@link #glColorP3uiv ColorP3uiv} */ + public static void glColorP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] color) { + GL33.glColorP3uiv(type, color); + } + + /** Array version of: {@link #glColorP4uiv ColorP4uiv} */ + public static void glColorP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] color) { + GL33.glColorP4uiv(type, color); + } + + /** Array version of: {@link #glSecondaryColorP3uiv SecondaryColorP3uiv} */ + public static void glSecondaryColorP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] color) { + GL33.glSecondaryColorP3uiv(type, color); + } + + /** Array version of: {@link #glVertexAttribP1uiv VertexAttribP1uiv} */ + public static void glVertexAttribP1uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + GL33C.glVertexAttribP1uiv(index, type, normalized, value); + } + + /** Array version of: {@link #glVertexAttribP2uiv VertexAttribP2uiv} */ + public static void glVertexAttribP2uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + GL33C.glVertexAttribP2uiv(index, type, normalized, value); + } + + /** Array version of: {@link #glVertexAttribP3uiv VertexAttribP3uiv} */ + public static void glVertexAttribP3uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + GL33C.glVertexAttribP3uiv(index, type, normalized, value); + } + + /** Array version of: {@link #glVertexAttribP4uiv VertexAttribP4uiv} */ + public static void glVertexAttribP4uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + GL33C.glVertexAttribP4uiv(index, type, normalized, value); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBViewportArray.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBViewportArray.java new file mode 100644 index 000000000..0f73895d2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBViewportArray.java @@ -0,0 +1,282 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the ARB_viewport_array extension. + * + *

    OpenGL is modeled on a pipeline of operations. The final stage in this pipeline before rasterization is the viewport transformation. This stage + * transforms vertices from view space into window coordinates and allows the application to specify a rectangular region of screen space into which OpenGL + * should draw primitives. Unextended OpenGL implementations provide a single viewport per context. In order to draw primitives into multiple viewports, + * the OpenGL viewport may be changed between several draw calls. With the advent of Geometry Shaders, it has become possible for an application to amplify + * geometry and produce multiple output primitives for each primitive input to the Geometry Shader. It is possible to direct these primitives to render + * into a selected render target. However, all render targets share the same, global OpenGL viewport.

    + * + *

    This extension enhances OpenGL by providing a mechanism to expose multiple viewports. Each viewport is specified as a rectangle. The destination + * viewport may be selected per-primitive by the geometry shader. This allows the Geometry Shader to produce different versions of primitives destined for + * separate viewport rectangles on the same surface. Additionally, when combined with multiple framebuffer attachments, it allows a different viewport + * rectangle to be selected for each. This extension also exposes a separate scissor rectangle for each viewport. Finally, the viewport bounds are now + * floating point quantities allowing fractional pixel offsets to be applied during the viewport transform.

    + * + *

    Requires {@link GL32 OpenGL 3.2} or {@link EXTGeometryShader4 EXT_geometry_shader4} or {@link ARBGeometryShader4 ARB_geometry_shader4}. Promoted to core in {@link GL41 OpenGL 4.1}.

    + */ +public class ARBViewportArray { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev and GetInteger64v. */ + public static final int + GL_MAX_VIEWPORTS = 0x825B, + GL_VIEWPORT_SUBPIXEL_BITS = 0x825C, + GL_VIEWPORT_BOUNDS_RANGE = 0x825D, + GL_LAYER_PROVOKING_VERTEX = 0x825E, + GL_VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F; + + /** Returned in the {@code data} parameter from a Get query with a {@code pname} of LAYER_PROVOKING_VERTEX or VIEWPORT_INDEX_PROVOKING_VERTEX. */ + public static final int GL_UNDEFINED_VERTEX = 0x8260; + + protected ARBViewportArray() { + throw new UnsupportedOperationException(); + } + + // --- [ glViewportArrayv ] --- + + /** + * Unsafe version of: {@link #glViewportArrayv ViewportArrayv} + * + * @param count the number of viewports to set + */ + public static void nglViewportArrayv(int first, int count, long v) { + GL41C.nglViewportArrayv(first, count, v); + } + + /** + * Sets multiple viewports. + * + * @param first the first viewport to set + * @param v an array containing the viewport parameters + */ + public static void glViewportArrayv(@NativeType("GLuint") int first, @NativeType("GLfloat const *") FloatBuffer v) { + GL41C.glViewportArrayv(first, v); + } + + // --- [ glViewportIndexedf ] --- + + /** + * Sets a specified viewport. + * + * @param index the viewport to set + * @param x the left viewport coordinate + * @param y the bottom viewport coordinate + * @param w the viewport width + * @param h the viewport height + */ + public static void glViewportIndexedf(@NativeType("GLuint") int index, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float w, @NativeType("GLfloat") float h) { + GL41C.glViewportIndexedf(index, x, y, w, h); + } + + // --- [ glViewportIndexedfv ] --- + + /** Unsafe version of: {@link #glViewportIndexedfv ViewportIndexedfv} */ + public static void nglViewportIndexedfv(int index, long v) { + GL41C.nglViewportIndexedfv(index, v); + } + + /** + * Pointer version of {@link #glViewportIndexedf ViewportIndexedf}. + * + * @param index the viewport to set + * @param v the viewport parameters + */ + public static void glViewportIndexedfv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + GL41C.glViewportIndexedfv(index, v); + } + + // --- [ glScissorArrayv ] --- + + /** + * Unsafe version of: {@link #glScissorArrayv ScissorArrayv} + * + * @param count the number of scissor boxes to modify + */ + public static void nglScissorArrayv(int first, int count, long v) { + GL41C.nglScissorArrayv(first, count, v); + } + + /** + * Defines the scissor box for multiple viewports. + * + * @param first the index of the first viewport whose scissor box to modify + * @param v an array containing the left, bottom, width and height of each scissor box, in that order + */ + public static void glScissorArrayv(@NativeType("GLuint") int first, @NativeType("GLint const *") IntBuffer v) { + GL41C.glScissorArrayv(first, v); + } + + // --- [ glScissorIndexed ] --- + + /** + * Defines the scissor box for a specific viewport. + * + * @param index the index of the viewport whose scissor box to modify + * @param left the left scissor box coordinate + * @param bottom the bottom scissor box coordinate + * @param width the scissor box width + * @param height the scissor box height + */ + public static void glScissorIndexed(@NativeType("GLuint") int index, @NativeType("GLint") int left, @NativeType("GLint") int bottom, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL41C.glScissorIndexed(index, left, bottom, width, height); + } + + // --- [ glScissorIndexedv ] --- + + /** Unsafe version of: {@link #glScissorIndexedv ScissorIndexedv} */ + public static void nglScissorIndexedv(int index, long v) { + GL41C.nglScissorIndexedv(index, v); + } + + /** + * Pointer version of {@link #glScissorIndexed ScissorIndexed}. + * + * @param index the index of the viewport whose scissor box to modify + * @param v an array containing the left, bottom, width and height of each scissor box, in that order + */ + public static void glScissorIndexedv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + GL41C.glScissorIndexedv(index, v); + } + + // --- [ glDepthRangeArrayv ] --- + + /** + * Unsafe version of: {@link #glDepthRangeArrayv DepthRangeArrayv} + * + * @param count the number of viewports whose depth range to update + */ + public static void nglDepthRangeArrayv(int first, int count, long v) { + GL41C.nglDepthRangeArrayv(first, count, v); + } + + /** + * Specifies mapping of depth values from normalized device coordinates to window coordinates for a specified set of viewports. + * + * @param first the index of the first viewport whose depth range to update + * @param v n array containing the near and far values for the depth range of each modified viewport + */ + public static void glDepthRangeArrayv(@NativeType("GLuint") int first, @NativeType("GLdouble const *") DoubleBuffer v) { + GL41C.glDepthRangeArrayv(first, v); + } + + // --- [ glDepthRangeIndexed ] --- + + /** + * Specifies mapping of depth values from normalized device coordinates to window coordinates for a specified viewport. + * + * @param index the index of the viewport whose depth range to update + * @param zNear the mapping of the near clipping plane to window coordinates. The initial value is 0. + * @param zFar the mapping of the far clipping plane to window coordinates. The initial value is 1. + */ + public static void glDepthRangeIndexed(@NativeType("GLuint") int index, @NativeType("GLdouble") double zNear, @NativeType("GLdouble") double zFar) { + GL41C.glDepthRangeIndexed(index, zNear, zFar); + } + + // --- [ glGetFloati_v ] --- + + /** Unsafe version of: {@link #glGetFloati_v GetFloati_v} */ + public static void nglGetFloati_v(int target, int index, long data) { + GL41C.nglGetFloati_v(target, index, data); + } + + /** + * Queries the float value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * @param data a scalar or buffer in which to place the returned data + */ + public static void glGetFloati_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer data) { + GL41C.glGetFloati_v(target, index, data); + } + + /** + * Queries the float value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + */ + @NativeType("void") + public static float glGetFloati(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return GL41C.glGetFloati(target, index); + } + + // --- [ glGetDoublei_v ] --- + + /** Unsafe version of: {@link #glGetDoublei_v GetDoublei_v} */ + public static void nglGetDoublei_v(int target, int index, long data) { + GL41C.nglGetDoublei_v(target, index, data); + } + + /** + * Queries the double value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * @param data a scalar or buffer in which to place the returned data + */ + public static void glGetDoublei_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") DoubleBuffer data) { + GL41C.glGetDoublei_v(target, index, data); + } + + /** + * Queries the double value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + */ + @NativeType("void") + public static double glGetDoublei(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return GL41C.glGetDoublei(target, index); + } + + /** Array version of: {@link #glViewportArrayv ViewportArrayv} */ + public static void glViewportArrayv(@NativeType("GLuint") int first, @NativeType("GLfloat const *") float[] v) { + GL41C.glViewportArrayv(first, v); + } + + /** Array version of: {@link #glViewportIndexedfv ViewportIndexedfv} */ + public static void glViewportIndexedfv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + GL41C.glViewportIndexedfv(index, v); + } + + /** Array version of: {@link #glScissorArrayv ScissorArrayv} */ + public static void glScissorArrayv(@NativeType("GLuint") int first, @NativeType("GLint const *") int[] v) { + GL41C.glScissorArrayv(first, v); + } + + /** Array version of: {@link #glScissorIndexedv ScissorIndexedv} */ + public static void glScissorIndexedv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + GL41C.glScissorIndexedv(index, v); + } + + /** Array version of: {@link #glDepthRangeArrayv DepthRangeArrayv} */ + public static void glDepthRangeArrayv(@NativeType("GLuint") int first, @NativeType("GLdouble const *") double[] v) { + GL41C.glDepthRangeArrayv(first, v); + } + + /** Array version of: {@link #glGetFloati_v GetFloati_v} */ + public static void glGetFloati_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] data) { + GL41C.glGetFloati_v(target, index, data); + } + + /** Array version of: {@link #glGetDoublei_v GetDoublei_v} */ + public static void glGetDoublei_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") double[] data) { + GL41C.glGetDoublei_v(target, index, data); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBWindowPos.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBWindowPos.java new file mode 100644 index 000000000..65dec43c1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ARBWindowPos.java @@ -0,0 +1,339 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the ARB_window_pos extension. + * + *

    In order to set the current raster position to a specific window coordinate with the {@link GL11#glRasterPos2i RasterPos2i} command, the modelview matrix, projection matrix + * and viewport must be set very carefully. Furthermore, if the desired window coordinate is outside of the window's bounds one must rely on a subtle + * side-effect of the {@link GL11#glBitmap Bitmap} command in order to avoid frustum clipping.

    + * + *

    This extension provides a set of functions to directly set the current raster position in window coordinates, bypassing the modelview matrix, the + * projection matrix and the viewport-to-window mapping. Furthermore, clip testing is not performed, so that the current raster position is always valid.

    + * + *

    This greatly simplifies the process of setting the current raster position to a specific window coordinate prior to calling {@link GL11#glDrawPixels DrawPixels}, + * {@link GL11#glCopyPixels CopyPixels} or {@link GL11#glBitmap Bitmap}. Many matrix operations can be avoided when mixing 2D and 3D rendering.

    + * + *

    Promoted to core in {@link GL14 OpenGL 1.4}.

    + */ +public class ARBWindowPos { + + static { GL.initialize(); } + + protected ARBWindowPos() { + throw new UnsupportedOperationException(); + } + + // --- [ glWindowPos2iARB ] --- + + /** + * Alternate way to set the current raster position. {@code z} is implictly set to 0. + * + * @param x the x value + * @param y the y value + */ + public static native void glWindowPos2iARB(@NativeType("GLint") int x, @NativeType("GLint") int y); + + // --- [ glWindowPos2sARB ] --- + + /** + * Short version of {@link #glWindowPos2iARB WindowPos2iARB}. + * + * @param x the x value + * @param y the y value + */ + public static native void glWindowPos2sARB(@NativeType("GLshort") short x, @NativeType("GLshort") short y); + + // --- [ glWindowPos2fARB ] --- + + /** + * Float version of {@link #glWindowPos2iARB WindowPos2iARB}. + * + * @param x the x value + * @param y the y value + */ + public static native void glWindowPos2fARB(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y); + + // --- [ glWindowPos2dARB ] --- + + /** + * Double version of {@link #glWindowPos2iARB WindowPos2iARB}. + * + * @param x the x value + * @param y the y value + */ + public static native void glWindowPos2dARB(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y); + + // --- [ glWindowPos2ivARB ] --- + + /** Unsafe version of: {@link #glWindowPos2ivARB WindowPos2ivARB} */ + public static native void nglWindowPos2ivARB(long p); + + /** + * Pointer version of {@link #glWindowPos2iARB WindowPos2iARB}. + * + * @param p the position value + */ + public static void glWindowPos2ivARB(@NativeType("GLint const *") IntBuffer p) { + if (CHECKS) { + check(p, 2); + } + nglWindowPos2ivARB(memAddress(p)); + } + + // --- [ glWindowPos2svARB ] --- + + /** Unsafe version of: {@link #glWindowPos2svARB WindowPos2svARB} */ + public static native void nglWindowPos2svARB(long p); + + /** + * Pointer version of {@link #glWindowPos2sARB WindowPos2sARB}. + * + * @param p the position value + */ + public static void glWindowPos2svARB(@NativeType("GLshort const *") ShortBuffer p) { + if (CHECKS) { + check(p, 2); + } + nglWindowPos2svARB(memAddress(p)); + } + + // --- [ glWindowPos2fvARB ] --- + + /** Unsafe version of: {@link #glWindowPos2fvARB WindowPos2fvARB} */ + public static native void nglWindowPos2fvARB(long p); + + /** + * Pointer version of {@link #glWindowPos2fARB WindowPos2fARB}. + * + * @param p the position value + */ + public static void glWindowPos2fvARB(@NativeType("GLfloat const *") FloatBuffer p) { + if (CHECKS) { + check(p, 2); + } + nglWindowPos2fvARB(memAddress(p)); + } + + // --- [ glWindowPos2dvARB ] --- + + /** Unsafe version of: {@link #glWindowPos2dvARB WindowPos2dvARB} */ + public static native void nglWindowPos2dvARB(long p); + + /** + * Pointer version of {@link #glWindowPos2dARB WindowPos2dARB}. + * + * @param p the position value + */ + public static void glWindowPos2dvARB(@NativeType("GLdouble const *") DoubleBuffer p) { + if (CHECKS) { + check(p, 2); + } + nglWindowPos2dvARB(memAddress(p)); + } + + // --- [ glWindowPos3iARB ] --- + + /** + * Alternate way to set the current raster position. + * + * @param x the x value + * @param y the y value + * @param z the z value + */ + public static native void glWindowPos3iARB(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z); + + // --- [ glWindowPos3sARB ] --- + + /** + * Short version of {@link #glWindowPos3iARB WindowPos3iARB}. + * + * @param x the x value + * @param y the y value + * @param z the z value + */ + public static native void glWindowPos3sARB(@NativeType("GLshort") short x, @NativeType("GLshort") short y, @NativeType("GLshort") short z); + + // --- [ glWindowPos3fARB ] --- + + /** + * Float version of {@link #glWindowPos3iARB WindowPos3iARB}. + * + * @param x the x value + * @param y the y value + * @param z the z value + */ + public static native void glWindowPos3fARB(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z); + + // --- [ glWindowPos3dARB ] --- + + /** + * Double version of {@link #glWindowPos3iARB WindowPos3iARB}. + * + * @param x the x value + * @param y the y value + * @param z the z value + */ + public static native void glWindowPos3dARB(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glWindowPos3ivARB ] --- + + /** Unsafe version of: {@link #glWindowPos3ivARB WindowPos3ivARB} */ + public static native void nglWindowPos3ivARB(long p); + + /** + * Pointer version of {@link #glWindowPos3iARB WindowPos3iARB}. + * + * @param p the position value + */ + public static void glWindowPos3ivARB(@NativeType("GLint const *") IntBuffer p) { + if (CHECKS) { + check(p, 3); + } + nglWindowPos3ivARB(memAddress(p)); + } + + // --- [ glWindowPos3svARB ] --- + + /** Unsafe version of: {@link #glWindowPos3svARB WindowPos3svARB} */ + public static native void nglWindowPos3svARB(long p); + + /** + * Pointer version of {@link #glWindowPos3sARB WindowPos3sARB}. + * + * @param p the position value + */ + public static void glWindowPos3svARB(@NativeType("GLshort const *") ShortBuffer p) { + if (CHECKS) { + check(p, 3); + } + nglWindowPos3svARB(memAddress(p)); + } + + // --- [ glWindowPos3fvARB ] --- + + /** Unsafe version of: {@link #glWindowPos3fvARB WindowPos3fvARB} */ + public static native void nglWindowPos3fvARB(long p); + + /** + * Pointer version of {@link #glWindowPos3fARB WindowPos3fARB}. + * + * @param p the position value + */ + public static void glWindowPos3fvARB(@NativeType("GLfloat const *") FloatBuffer p) { + if (CHECKS) { + check(p, 3); + } + nglWindowPos3fvARB(memAddress(p)); + } + + // --- [ glWindowPos3dvARB ] --- + + /** Unsafe version of: {@link #glWindowPos3dvARB WindowPos3dvARB} */ + public static native void nglWindowPos3dvARB(long p); + + /** + * Pointer version of {@link #glWindowPos3dARB WindowPos3dARB}. + * + * @param p the position value + */ + public static void glWindowPos3dvARB(@NativeType("GLdouble const *") DoubleBuffer p) { + if (CHECKS) { + check(p, 3); + } + nglWindowPos3dvARB(memAddress(p)); + } + + /** Array version of: {@link #glWindowPos2ivARB WindowPos2ivARB} */ + public static void glWindowPos2ivARB(@NativeType("GLint const *") int[] p) { + long __functionAddress = GL.getICD().glWindowPos2ivARB; + if (CHECKS) { + check(__functionAddress); + check(p, 2); + } + callPV(p, __functionAddress); + } + + /** Array version of: {@link #glWindowPos2svARB WindowPos2svARB} */ + public static void glWindowPos2svARB(@NativeType("GLshort const *") short[] p) { + long __functionAddress = GL.getICD().glWindowPos2svARB; + if (CHECKS) { + check(__functionAddress); + check(p, 2); + } + callPV(p, __functionAddress); + } + + /** Array version of: {@link #glWindowPos2fvARB WindowPos2fvARB} */ + public static void glWindowPos2fvARB(@NativeType("GLfloat const *") float[] p) { + long __functionAddress = GL.getICD().glWindowPos2fvARB; + if (CHECKS) { + check(__functionAddress); + check(p, 2); + } + callPV(p, __functionAddress); + } + + /** Array version of: {@link #glWindowPos2dvARB WindowPos2dvARB} */ + public static void glWindowPos2dvARB(@NativeType("GLdouble const *") double[] p) { + long __functionAddress = GL.getICD().glWindowPos2dvARB; + if (CHECKS) { + check(__functionAddress); + check(p, 2); + } + callPV(p, __functionAddress); + } + + /** Array version of: {@link #glWindowPos3ivARB WindowPos3ivARB} */ + public static void glWindowPos3ivARB(@NativeType("GLint const *") int[] p) { + long __functionAddress = GL.getICD().glWindowPos3ivARB; + if (CHECKS) { + check(__functionAddress); + check(p, 3); + } + callPV(p, __functionAddress); + } + + /** Array version of: {@link #glWindowPos3svARB WindowPos3svARB} */ + public static void glWindowPos3svARB(@NativeType("GLshort const *") short[] p) { + long __functionAddress = GL.getICD().glWindowPos3svARB; + if (CHECKS) { + check(__functionAddress); + check(p, 3); + } + callPV(p, __functionAddress); + } + + /** Array version of: {@link #glWindowPos3fvARB WindowPos3fvARB} */ + public static void glWindowPos3fvARB(@NativeType("GLfloat const *") float[] p) { + long __functionAddress = GL.getICD().glWindowPos3fvARB; + if (CHECKS) { + check(__functionAddress); + check(p, 3); + } + callPV(p, __functionAddress); + } + + /** Array version of: {@link #glWindowPos3dvARB WindowPos3dvARB} */ + public static void glWindowPos3dvARB(@NativeType("GLdouble const *") double[] p) { + long __functionAddress = GL.getICD().glWindowPos3dvARB; + if (CHECKS) { + check(__functionAddress); + check(p, 3); + } + callPV(p, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ATIMeminfo.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ATIMeminfo.java new file mode 100644 index 000000000..a96884160 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ATIMeminfo.java @@ -0,0 +1,28 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the ATI_meminfo extension. + * + *

    Traditionally, OpenGL has treated resource management as a task of hardware virtualization hidden from applications. While providing great portability, + * this shielding of information can prevent applications from making intelligent decisions on the management of resources they create. For instance, an + * application may be better served by choosing a different rendering method if there is not sufficient resources to efficiently utilize its preferred + * method.

    + * + *

    Requires {@link GL11 OpenGL 1.1}

    + */ +public final class ATIMeminfo { + + /** Accepted by the {@code param} parameter of GetIntegerv. */ + public static final int + GL_VBO_FREE_MEMORY_ATI = 0x87FB, + GL_TEXTURE_FREE_MEMORY_ATI = 0x87FC, + GL_RENDERBUFFER_FREE_MEMORY_ATI = 0x87FD; + + private ATIMeminfo() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ATITextureCompression3DC.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ATITextureCompression3DC.java new file mode 100644 index 000000000..200cdde4f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ATITextureCompression3DC.java @@ -0,0 +1,16 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** This extension is undocumented. See 3Dc for information. */ +public final class ATITextureCompression3DC { + + /** Accepted by the {@code internalformat} parameter of TexImage functions. */ + public static final int GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI = 0x8837; + + private ATITextureCompression3DC() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AWTCanvasImplementation.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AWTCanvasImplementation.java new file mode 100644 index 000000000..95439cc36 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AWTCanvasImplementation.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +import org.lwjgl.LWJGLException; + +import java.awt.Canvas; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; + +/** + * + * @author elias_naur + * @version $Revision$ + * $Id$ + */ +interface AWTCanvasImplementation { + /** + * Return an opaque handle to the canvas peer information required to create a context from it. + */ + PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException; + + /** + * Find a proper GraphicsConfiguration from the given GraphicsDevice and PixelFormat. + * + * @return A GraphicsConfiguration matching the given GraphicsConfiguration and PixelFormat. + * @throws LWJGLException if no suitable configuration could be found. + */ + GraphicsConfiguration findConfiguration(GraphicsDevice device, PixelFormat pixel_format) throws LWJGLException; +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AWTGLCanvas.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AWTGLCanvas.java new file mode 100644 index 000000000..373793b5d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/AWTGLCanvas.java @@ -0,0 +1,416 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; +import static org.lwjgl.opengl.GL11.glClear; +import static org.lwjgl.opengl.GL11.glClearColor; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.PointerBuffer; +import org.lwjgl.Sys; + +import java.awt.Canvas; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Point; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.HierarchyEvent; +import java.awt.event.HierarchyListener; + +/** + *

    + * An AWT rendering context. + *

    + * + * @author $Author$ + * $Id$ + * @version $Revision$ + */ +public class AWTGLCanvas extends Canvas implements DrawableLWJGL, ComponentListener, HierarchyListener { + + private static final long serialVersionUID = 1L; + + private static final AWTCanvasImplementation implementation; + private boolean update_context; + private Object SYNC_LOCK = new Object(); + + /** The requested pixel format */ + private final PixelFormat pixel_format; + + /** The drawable to share context with */ + private final Drawable drawable; + + /** The ContextAttribs to use when creating the context */ + private final ContextAttribs attribs; + + /** Context handle */ + private PeerInfo peer_info; + private ContextGL context; + + /** + * re-entry counter for support for re-entrant + * redrawing in paint(). It happens when using dialog boxes. + */ + private int reentry_count; + + /** Tracks whether initGL() needs to be called */ + private boolean first_run; + + static { + Sys.initialize(); + implementation = createImplementation(); + } + + static AWTCanvasImplementation createImplementation() { + switch ( LWJGLUtil.getPlatform() ) { + + default: + throw new IllegalStateException("Unsupported platform"); + } + } + + private void setUpdate() { + synchronized ( SYNC_LOCK ) { + update_context = true; + } + } + + public void setPixelFormat(final PixelFormatLWJGL pf) throws LWJGLException { + throw new UnsupportedOperationException(); + } + + public void setPixelFormat(final PixelFormatLWJGL pf, final ContextAttribs attribs) throws LWJGLException { + throw new UnsupportedOperationException(); + } + + public PixelFormatLWJGL getPixelFormat() { + return pixel_format; + } + + /** This method should only be called internally. */ + public ContextGL getContext() { + return context; + } + + /** This method should only be called internally. */ + public ContextGL createSharedContext() throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) throw new IllegalStateException("Canvas not yet displayable"); + + return new ContextGL(peer_info, context.getContextAttribs(), context); + } + } + + public void checkGLError() { + Util.checkGLError(); + } + + public void initContext(final float r, final float g, final float b) { + // set background clear color + glClearColor(r, g, b, 0.0f); + // Clear window to avoid the desktop "showing through" + glClear(GL_COLOR_BUFFER_BIT); + } + + /** Constructor using the default PixelFormat. */ + public AWTGLCanvas() throws LWJGLException { + this(new PixelFormat()); + } + + /** + * Create an AWTGLCanvas with the requested PixelFormat on the default GraphicsDevice. + * + * @param pixel_format The desired pixel format. May not be null + */ + public AWTGLCanvas(PixelFormat pixel_format) throws LWJGLException { + this(GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(), pixel_format); + } + + /** + * Create an AWTGLCanvas with the requested PixelFormat on the default GraphicsDevice. + * + * @param device the device to create the canvas on. + * @param pixel_format The desired pixel format. May not be null + */ + public AWTGLCanvas(GraphicsDevice device, PixelFormat pixel_format) throws LWJGLException { + this(device, pixel_format, null); + } + + /** + * Create an AWTGLCanvas with the requested PixelFormat on the specified GraphicsDevice. + * + * @param device the device to create the canvas on. + * @param pixel_format The desired pixel format. May not be null + * @param drawable The Drawable to share context with + */ + public AWTGLCanvas(GraphicsDevice device, PixelFormat pixel_format, Drawable drawable) throws LWJGLException { + this(device, pixel_format, drawable, null); + } + + /** + * Create an AWTGLCanvas with the requested PixelFormat on the specified GraphicsDevice. + * + * @param device the device to create the canvas on. + * @param pixel_format The desired pixel format. May not be null + * @param drawable The Drawable to share context with + * @param attribs The ContextAttribs to use when creating the context. (optional, may be null) + */ + public AWTGLCanvas(GraphicsDevice device, PixelFormat pixel_format, Drawable drawable, ContextAttribs attribs) throws LWJGLException { + super(implementation.findConfiguration(device, pixel_format)); + if ( pixel_format == null ) + throw new NullPointerException("Pixel format must be non-null"); + addHierarchyListener(this); + addComponentListener(this); + this.drawable = drawable; + this.pixel_format = pixel_format; + this.attribs = attribs; + } + + /* (non-Javadoc) + * @see java.awt.Canvas#addNotify() + */ + public void addNotify() { + super.addNotify(); + } + + /* (non-Javadoc) + * @see java.awt.Component#removeNotify() + */ + public void removeNotify() { + synchronized ( SYNC_LOCK ) { + destroy(); + super.removeNotify(); + } + } + + /** Set swap interval. */ + public void setSwapInterval(int swap_interval) { + synchronized ( SYNC_LOCK ) { + if ( context == null ) + throw new IllegalStateException("Canvas not yet displayable"); + ContextGL.setSwapInterval(swap_interval); + } + } + + /** Enable vsync */ + public void setVSyncEnabled(boolean enabled) { + setSwapInterval(enabled ? 1 : 0); + } + + /** Swap the canvas' buffer */ + public void swapBuffers() throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) + throw new IllegalStateException("Canvas not yet displayable"); + ContextGL.swapBuffers(); + } + } + + public boolean isCurrent() throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) throw new IllegalStateException("Canvas not yet displayable"); + + return context.isCurrent(); + } + } + + /** + * Make the canvas' context current. It is highly recommended that the context + * is only made current inside the AWT thread (for example in an overridden paintGL()). + */ + public void makeCurrent() throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) + throw new IllegalStateException("Canvas not yet displayable"); + context.makeCurrent(); + } + } + + public void releaseContext() throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) + throw new IllegalStateException("Canvas not yet displayable"); + if ( context.isCurrent() ) + context.releaseCurrent(); + } + } + + /** Destroy the OpenGL context. This happens when the component becomes undisplayable */ + public final void destroy() { + synchronized ( SYNC_LOCK ) { + try { + if ( context != null ) { + context.forceDestroy(); + context = null; + reentry_count = 0; + peer_info.destroy(); + peer_info = null; + } + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + } + } + + public final void setCLSharingProperties(final PointerBuffer properties) throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) + throw new IllegalStateException("Canvas not yet displayable"); + context.setCLSharingProperties(properties); + } + } + + /** + * Override this to do initialising of the context. + * It will be called once from paint(), immediately after + * the context is created and made current. + */ + protected void initGL() { + } + + /** Override this to do painting */ + protected void paintGL() { + } + + /** + * The default paint() operation makes the context current and calls paintGL() which should + * be overridden to do GL operations. + */ + public final void paint(Graphics g) { + LWJGLException exception = null; + synchronized ( SYNC_LOCK ) { + if ( !isDisplayable() ) + return; + try { + if ( peer_info == null ) { + this.peer_info = implementation.createPeerInfo(this, pixel_format, attribs); + } + peer_info.lockAndGetHandle(); + try { + if ( context == null ) { + this.context = new ContextGL(peer_info, attribs, drawable != null ? (ContextGL)((DrawableLWJGL)drawable).getContext() : null); + first_run = true; + } + + if ( reentry_count == 0 ) + context.makeCurrent(); + reentry_count++; + try { + if ( update_context ) { + context.update(); + update_context = false; + } + if ( first_run ) { + first_run = false; + initGL(); + } + paintGL(); + } finally { + reentry_count--; + if ( reentry_count == 0 ) + context.releaseCurrent(); + } + } finally { + peer_info.unlock(); + } + } catch (LWJGLException e) { + exception = e; + } + } + if ( exception != null ) + exceptionOccurred(exception); + } + + /** + * This method will be called if an unhandled LWJGLException occurs in paint(). + * Override this method to be notified of this. + * + * @param exception The exception that occurred. + */ + protected void exceptionOccurred(LWJGLException exception) { + LWJGLUtil.log("Unhandled exception occurred, skipping paint(): " + exception); + } + + /** override update to avoid clearing */ + public void update(Graphics g) { + paint(g); + } + + public void componentShown(ComponentEvent e) { + } + + public void componentHidden(ComponentEvent e) { + } + + public void componentResized(ComponentEvent e) { + setUpdate(); + } + + public void componentMoved(ComponentEvent e) { + setUpdate(); + } + + public void setLocation(int x, int y) { + super.setLocation(x, y); + setUpdate(); + } + + public void setLocation(Point p) { + super.setLocation(p); + setUpdate(); + } + + public void setSize(Dimension d) { + super.setSize(d); + setUpdate(); + } + + public void setSize(int width, int height) { + super.setSize(width, height); + setUpdate(); + } + + public void setBounds(int x, int y, int width, int height) { + super.setBounds(x, y, width, height); + setUpdate(); + } + + public void hierarchyChanged(HierarchyEvent e) { + setUpdate(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/CGL.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/CGL.java new file mode 100644 index 000000000..17a52cb47 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/CGL.java @@ -0,0 +1,1650 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to CGL. */ +public class CGL { + + /** Contains the function pointers loaded from {@code GL.getFunctionProvider()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + GetCurrentContext = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetCurrentContext"), + SetCurrentContext = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLSetCurrentContext"), + GetShareGroup = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetShareGroup"), + ChoosePixelFormat = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLChoosePixelFormat"), + DestroyPixelFormat = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLDestroyPixelFormat"), + DescribePixelFormat = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLDescribePixelFormat"), + ReleasePixelFormat = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLReleasePixelFormat"), + RetainPixelFormat = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLRetainPixelFormat"), + GetPixelFormatRetainCount = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetPixelFormatRetainCount"), + QueryRendererInfo = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLQueryRendererInfo"), + DestroyRendererInfo = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLDestroyRendererInfo"), + DescribeRenderer = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLDescribeRenderer"), + CreateContext = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLCreateContext"), + DestroyContext = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLDestroyContext"), + CopyContext = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLCopyContext"), + RetainContext = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLRetainContext"), + ReleaseContext = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLReleaseContext"), + GetContextRetainCount = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetContextRetainCount"), + GetPixelFormat = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetPixelFormat"), + CreatePBuffer = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLCreatePBuffer"), + DestroyPBuffer = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLDestroyPBuffer"), + DescribePBuffer = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLDescribePBuffer"), + TexImagePBuffer = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLTexImagePBuffer"), + RetainPBuffer = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLRetainPBuffer"), + ReleasePBuffer = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLReleasePBuffer"), + GetPBufferRetainCount = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetPBufferRetainCount"), + SetOffScreen = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLSetOffScreen"), + GetOffScreen = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetOffScreen"), + SetFullScreen = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLSetFullScreen"), + SetFullScreenOnDisplay = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLSetFullScreenOnDisplay"), + SetPBuffer = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLSetPBuffer"), + GetPBuffer = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetPBuffer"), + ClearDrawable = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLClearDrawable"), + FlushDrawable = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLFlushDrawable"), + Enable = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLEnable"), + Disable = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLDisable"), + IsEnabled = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLIsEnabled"), + SetParameter = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLSetParameter"), + GetParameter = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetParameter"), + SetVirtualScreen = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLSetVirtualScreen"), + GetVirtualScreen = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetVirtualScreen"), + UpdateContext = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLUpdateContext"), + SetGlobalOption = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLSetGlobalOption"), + GetGlobalOption = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetGlobalOption"), + LockContext = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLLockContext"), + UnlockContext = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLUnlockContext"), + GetVersion = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLGetVersion"), + ErrorString = apiGetFunctionAddress(GL.getFunctionProvider(), "CGLErrorString"); + + } + + /** Attribute names for {@link #CGLChoosePixelFormat ChoosePixelFormat} and {@link #CGLDescribePixelFormat DescribePixelFormat}. */ + public static final int + kCGLPFAAllRenderers = 1, + kCGLPFATripleBuffer = 3, + kCGLPFADoubleBuffer = 5, + kCGLPFAStereo = 6, + kCGLPFAColorSize = 8, + kCGLPFAAlphaSize = 11, + kCGLPFADepthSize = 12, + kCGLPFAStencilSize = 13, + kCGLPFAMinimumPolicy = 51, + kCGLPFAMaximumPolicy = 52, + kCGLPFASampleBuffers = 55, + kCGLPFASamples = 56, + kCGLPFAColorFloat = 58, + kCGLPFAMultisample = 59, + kCGLPFASupersample = 60, + kCGLPFASampleAlpha = 61, + kCGLPFARendererID = 70, + kCGLPFASingleRenderer = 71, + kCGLPFANoRecovery = 72, + kCGLPFAAccelerated = 73, + kCGLPFAClosestPolicy = 74, + kCGLPFABackingStore = 76, + kCGLPFABackingVolatile = 77, + kCGLPFADisplayMask = 84, + kCGLPFAAllowOfflineRenderers = 96, + kCGLPFAAcceleratedCompute = 97, + kCGLPFAOpenGLProfile = 99, + kCGLPFASupportsAutomaticGraphicsSwitching = 101, + kCGLPFAVirtualScreenCount = 128, + kCGLPFAAuxBuffers = 7, + kCGLPFAAccumSize = 14, + kCGLPFAOffScreen = 53, + kCGLPFAAuxDepthStencil = 57, + kCGLPFAWindow = 80, + kCGLPFACompliant = 83, + kCGLPFAPBuffer = 90, + kCGLPFARemotePBuffer = 91, + kCGLPFARobust = 75, + kCGLPFAMPSafe = 78, + kCGLPFAMultiScreen = 81, + kCGLPFAFullScreen = 54; + + /** Property names for {@link #CGLDescribeRenderer DescribeRenderer}. */ + public static final int + kCGLRPOffScreen = 53, + kCGLRPRendererID = 70, + kCGLRPAccelerated = 73, + kCGLRPBackingStore = 76, + kCGLRPWindow = 80, + kCGLRPCompliant = 83, + kCGLRPDisplayMask = 84, + kCGLRPBufferModes = 100, + kCGLRPColorModes = 103, + kCGLRPAccumModes = 104, + kCGLRPDepthModes = 105, + kCGLRPStencilModes = 106, + kCGLRPMaxAuxBuffers = 107, + kCGLRPMaxSampleBuffers = 108, + kCGLRPMaxSamples = 109, + kCGLRPSampleModes = 110, + kCGLRPSampleAlpha = 111, + kCGLRPVideoMemory = 120, + kCGLRPTextureMemory = 121, + kCGLRPGPUVertProcCapable = 122, + kCGLRPGPUFragProcCapable = 123, + kCGLRPRendererCount = 128, + kCGLRPOnline = 129, + kCGLRPAcceleratedCompute = 130, + kCGLRPVideoMemoryMegabytes = 131, + kCGLRPTextureMemoryMegabytes = 132, + kCGLRPRobust = 75, + kCGLRPMPSafe = 78, + kCGLRPMultiScreen = 81, + kCGLRPFullScreen = 54; + + /** Enable names for {@link #CGLEnable Enable}, {@link #CGLDisable Disable}, and {@link #CGLIsEnabled IsEnabled}. */ + public static final int + kCGLCESwapRectangle = 201, + kCGLCESwapLimit = 203, + kCGLCERasterization = 221, + kCGLCEStateValidation = 301, + kCGLCESurfaceBackingSize = 305, + kCGLCEDisplayListOptimization = 307, + kCGLCEMPEngine = 313; + + /** Parameter names for {@link #CGLSetParameter SetParameter} and {@link #CGLGetParameter GetParameter}. */ + public static final int + kCGLCPSwapRectangle = 200, + kCGLCPSwapInterval = 222, + kCGLCPDispatchTableSize = 224, + kCGLCPClientStorage = 226, + kCGLCPSurfaceTexture = 228, + kCGLCPSurfaceOrder = 235, + kCGLCPSurfaceOpacity = 236, + kCGLCPSurfaceBackingSize = 304, + kCGLCPSurfaceSurfaceVolatile = 306, + kCGLCPReclaimResources = 308, + kCGLCPCurrentRendererID = 309, + kCGLCPGPUVertexProcessing = 310, + kCGLCPGPUFragmentProcessing = 311, + kCGLCPHasDrawable = 314, + kCGLCPMPSwapsInFlight = 315; + + /** Option names for {@link #CGLSetGlobalOption SetGlobalOption} and {@link #CGLGetGlobalOption GetGlobalOption}. */ + public static final int + kCGLGOFormatCacheSize = 501, + kCGLGOClearFormatCache = 502, + kCGLGORetainRenderers = 503, + kCGLGOResetLibrary = 504, + kCGLGOUseErrorHandler = 505, + kCGLGOUseBuildCache = 506; + + /** OpenGL Implementation Profiles. */ + public static final int + kCGLOGLPVersion_Legacy = 0x1000, + kCGLOGLPVersion_3_2_Core = 0x3200; + + /** CGL error return values. */ + public static final int + kCGLNoError = 0, + kCGLBadAttribute = 10000, + kCGLBadProperty = 10001, + kCGLBadPixelFormat = 10002, + kCGLBadRendererInfo = 10003, + kCGLBadContext = 10004, + kCGLBadDrawable = 10005, + kCGLBadDisplay = 10006, + kCGLBadState = 10007, + kCGLBadValue = 10008, + kCGLBadMatch = 10009, + kCGLBadEnumeration = 10010, + kCGLBadOffScreen = 10011, + kCGLBadFullScreen = 10012, + kCGLBadWindow = 10013, + kCGLBadAddress = 10014, + kCGLBadCodeModule = 10015, + kCGLBadAlloc = 10016, + kCGLBadConnection = 10017; + + /** Buffer modes. */ + public static final int + kCGLMonoscopicBit = 0x1, + kCGLStereoscopicBit = 0x2, + kCGLSingleBufferBit = 0x4, + kCGLDoubleBufferBit = 0x8, + kCGLTripleBufferBit = 0x10; + + /** Depth and stencil buffer depths. */ + public static final int + kCGL0Bit = 0x1, + kCGL1Bit = 0x2, + kCGL2Bit = 0x4, + kCGL3Bit = 0x8, + kCGL4Bit = 0x10, + kCGL5Bit = 0x20, + kCGL6Bit = 0x40, + kCGL8Bit = 0x80, + kCGL10Bit = 0x100, + kCGL12Bit = 0x200, + kCGL16Bit = 0x400, + kCGL24Bit = 0x800, + kCGL32Bit = 0x1000, + kCGL48Bit = 0x2000, + kCGL64Bit = 0x4000, + kCGL96Bit = 0x8000, + kCGL128Bit = 0x10000; + + /** Color and accumulation buffer formats. */ + public static final int + kCGLRGB444Bit = 0x40, + kCGLARGB4444Bit = 0x80, + kCGLRGB444A8Bit = 0x100, + kCGLRGB555Bit = 0x200, + kCGLARGB1555Bit = 0x400, + kCGLRGB555A8Bit = 0x800, + kCGLRGB565Bit = 0x1000, + kCGLRGB565A8Bit = 0x2000, + kCGLRGB888Bit = 0x4000, + kCGLARGB8888Bit = 0x8000, + kCGLRGB888A8Bit = 0x10000, + kCGLRGB101010Bit = 0x20000, + kCGLARGB2101010Bit = 0x40000, + kCGLRGB101010_A8Bit = 0x80000, + kCGLRGB121212Bit = 0x100000, + kCGLARGB12121212Bit = 0x200000, + kCGLRGB161616Bit = 0x400000, + kCGLRGBA16161616Bit = 0x800000, + kCGLRGBFloat64Bit = 0x1000000, + kCGLRGBAFloat64Bit = 0x2000000, + kCGLRGBFloat128Bit = 0x4000000, + kCGLRGBAFloat128Bit = 0x8000000, + kCGLRGBFloat256Bit = 0x10000000, + kCGLRGBAFloat256Bit = 0x20000000; + + /** Sampling modes. */ + public static final int + kCGLSupersampleBit = 0x1, + kCGLMultisampleBit = 0x2; + + protected CGL() { + throw new UnsupportedOperationException(); + } + + // --- [ CGLGetCurrentContext ] --- + + /** Returns the current rendering context. If there is none, returns {@code NULL}. */ + @NativeType("CGLContextObj") + public static long CGLGetCurrentContext() { + long __functionAddress = Functions.GetCurrentContext; + return callP(__functionAddress); + } + + // --- [ CGLSetCurrentContext ] --- + + /** + * Sets the specified rendering context as the current rendering context. + * + *

    There can be only one current rendering context. Subsequent OpenGL rendering calls operate on the current rendering context to modify the drawable + * object associated with it.

    + * + *

    You can use AGL macros to bypass the current rendering context mechanism and maintain your own current rendering context.

    + * + *

    A context is current on a per-thread basis. Multiple threads must serialize calls into the same context.

    + * + * @param context the rendering context to set as the current rendering context. Pass {@code NULL} to release the current rendering context without assigning a new one. + */ + @NativeType("CGLError") + public static int CGLSetCurrentContext(@NativeType("CGLContextObj") long context) { + long __functionAddress = Functions.SetCurrentContext; + return callPI(context, __functionAddress); + } + + // --- [ CGLGetShareGroup ] --- + + /** + * Returns the sharegroup of the specified rendering context. + * + * @param ctx a rendering context + */ + @NativeType("CGLShareGroupObj") + public static long CGLGetShareGroup(@NativeType("CGLContextObj") long ctx) { + long __functionAddress = Functions.GetShareGroup; + if (CHECKS) { + check(ctx); + } + return callPP(ctx, __functionAddress); + } + + // --- [ CGLChoosePixelFormat ] --- + + /** Unsafe version of: {@link #CGLChoosePixelFormat ChoosePixelFormat} */ + public static int nCGLChoosePixelFormat(long attribs, long pix, long npix) { + long __functionAddress = Functions.ChoosePixelFormat; + return callPPPI(attribs, pix, npix, __functionAddress); + } + + /** + * Creates a pixel format object that satisfies the constraints of the specified buffer and renderer attributes. + * + * @param attribs a 0 terminated array that contains a list of buffer and renderer attributes. Attributes can be Boolean or integer. If an attribute is integer, you + * must supply the desired value immediately following the attribute. If the attribute is Boolean, do not supply a value because its presence in the + * attributes array implies a true value. One of:
    {@link #kCGLPFAAllRenderers PFAAllRenderers}{@link #kCGLPFATripleBuffer PFATripleBuffer}{@link #kCGLPFADoubleBuffer PFADoubleBuffer}{@link #kCGLPFAStereo PFAStereo}{@link #kCGLPFAColorSize PFAColorSize}
    {@link #kCGLPFAAlphaSize PFAAlphaSize}{@link #kCGLPFADepthSize PFADepthSize}{@link #kCGLPFAStencilSize PFAStencilSize}{@link #kCGLPFAMinimumPolicy PFAMinimumPolicy}{@link #kCGLPFAMaximumPolicy PFAMaximumPolicy}
    {@link #kCGLPFASampleBuffers PFASampleBuffers}{@link #kCGLPFASamples PFASamples}{@link #kCGLPFAColorFloat PFAColorFloat}{@link #kCGLPFAMultisample PFAMultisample}{@link #kCGLPFASupersample PFASupersample}
    {@link #kCGLPFASampleAlpha PFASampleAlpha}{@link #kCGLPFARendererID PFARendererID}{@link #kCGLPFASingleRenderer PFASingleRenderer}{@link #kCGLPFANoRecovery PFANoRecovery}{@link #kCGLPFAAccelerated PFAAccelerated}
    {@link #kCGLPFAClosestPolicy PFAClosestPolicy}{@link #kCGLPFABackingStore PFABackingStore}{@link #kCGLPFABackingVolatile PFABackingVolatile}{@link #kCGLPFADisplayMask PFADisplayMask}{@link #kCGLPFAAllowOfflineRenderers PFAAllowOfflineRenderers}
    {@link #kCGLPFAAcceleratedCompute PFAAcceleratedCompute}{@link #kCGLPFAOpenGLProfile PFAOpenGLProfile}{@link #kCGLPFASupportsAutomaticGraphicsSwitching PFASupportsAutomaticGraphicsSwitching}{@link #kCGLPFAVirtualScreenCount PFAVirtualScreenCount}{@link #kCGLPFAAuxBuffers PFAAuxBuffers}
    {@link #kCGLPFAAccumSize PFAAccumSize}{@link #kCGLPFAOffScreen PFAOffScreen}{@link #kCGLPFAAuxDepthStencil PFAAuxDepthStencil}{@link #kCGLPFAWindow PFAWindow}{@link #kCGLPFACompliant PFACompliant}
    {@link #kCGLPFAPBuffer PFAPBuffer}{@link #kCGLPFARemotePBuffer PFARemotePBuffer}{@link #kCGLPFARobust PFARobust}{@link #kCGLPFAMPSafe PFAMPSafe}{@link #kCGLPFAMultiScreen PFAMultiScreen}
    {@link #kCGLPFAFullScreen PFAFullScreen}
    + * @param pix the memory address of a pixel format object. On return, points to a new pixel format object that contains pixel format information and a list of + * virtual screens. If there are no pixel formats or virtual screens that satisfy the constraints of the buffer and renderer attributes, the value of + * pix is set to {@code NULL}. + * @param npix on return, points to the number of virtual screens referenced by pix. If pix is {@code NULL}, the value of {@code npix} is set to 0. + */ + @NativeType("CGLError") + public static int CGLChoosePixelFormat(@NativeType("CGLPixelFormatAttribute const *") IntBuffer attribs, @NativeType("CGLPixelFormatObj *") PointerBuffer pix, @NativeType("GLint *") IntBuffer npix) { + if (CHECKS) { + checkNT(attribs); + check(pix, 1); + check(npix, 1); + } + return nCGLChoosePixelFormat(memAddress(attribs), memAddress(pix), memAddress(npix)); + } + + // --- [ CGLDestroyPixelFormat ] --- + + /** + * Frees the memory associated with a pixel format object. Calling this function is equivalent to calling {@link #CGLReleasePixelFormat ReleasePixelFormat}. + * + * @param pix the pixel format object to destroy + */ + @NativeType("CGLError") + public static int CGLDestroyPixelFormat(@NativeType("CGLPixelFormatObj") long pix) { + long __functionAddress = Functions.DestroyPixelFormat; + if (CHECKS) { + check(pix); + } + return callPI(pix, __functionAddress); + } + + // --- [ CGLDescribePixelFormat ] --- + + /** Unsafe version of: {@link #CGLDescribePixelFormat DescribePixelFormat} */ + public static int nCGLDescribePixelFormat(long pix, int pix_num, int attrib, long value) { + long __functionAddress = Functions.DescribePixelFormat; + if (CHECKS) { + check(pix); + } + return callPPI(pix, pix_num, attrib, value, __functionAddress); + } + + /** + * Retrieves the values of an attribute associated with a pixel format object. + * + * @param pix the pixel format object to query + * @param pix_num the virtual screen number whose attribute value you want to retrieve. This value must be between 0 and the number of virtual screens minus one. + * @param attrib the attribute whose value you want to obtain. One of:
    {@link #kCGLPFAAllRenderers PFAAllRenderers}{@link #kCGLPFATripleBuffer PFATripleBuffer}{@link #kCGLPFADoubleBuffer PFADoubleBuffer}{@link #kCGLPFAStereo PFAStereo}{@link #kCGLPFAColorSize PFAColorSize}
    {@link #kCGLPFAAlphaSize PFAAlphaSize}{@link #kCGLPFADepthSize PFADepthSize}{@link #kCGLPFAStencilSize PFAStencilSize}{@link #kCGLPFAMinimumPolicy PFAMinimumPolicy}{@link #kCGLPFAMaximumPolicy PFAMaximumPolicy}
    {@link #kCGLPFASampleBuffers PFASampleBuffers}{@link #kCGLPFASamples PFASamples}{@link #kCGLPFAColorFloat PFAColorFloat}{@link #kCGLPFAMultisample PFAMultisample}{@link #kCGLPFASupersample PFASupersample}
    {@link #kCGLPFASampleAlpha PFASampleAlpha}{@link #kCGLPFARendererID PFARendererID}{@link #kCGLPFASingleRenderer PFASingleRenderer}{@link #kCGLPFANoRecovery PFANoRecovery}{@link #kCGLPFAAccelerated PFAAccelerated}
    {@link #kCGLPFAClosestPolicy PFAClosestPolicy}{@link #kCGLPFABackingStore PFABackingStore}{@link #kCGLPFABackingVolatile PFABackingVolatile}{@link #kCGLPFADisplayMask PFADisplayMask}{@link #kCGLPFAAllowOfflineRenderers PFAAllowOfflineRenderers}
    {@link #kCGLPFAAcceleratedCompute PFAAcceleratedCompute}{@link #kCGLPFAOpenGLProfile PFAOpenGLProfile}{@link #kCGLPFASupportsAutomaticGraphicsSwitching PFASupportsAutomaticGraphicsSwitching}{@link #kCGLPFAVirtualScreenCount PFAVirtualScreenCount}{@link #kCGLPFAAuxBuffers PFAAuxBuffers}
    {@link #kCGLPFAAccumSize PFAAccumSize}{@link #kCGLPFAOffScreen PFAOffScreen}{@link #kCGLPFAAuxDepthStencil PFAAuxDepthStencil}{@link #kCGLPFAWindow PFAWindow}{@link #kCGLPFACompliant PFACompliant}
    {@link #kCGLPFAPBuffer PFAPBuffer}{@link #kCGLPFARemotePBuffer PFARemotePBuffer}{@link #kCGLPFARobust PFARobust}{@link #kCGLPFAMPSafe PFAMPSafe}{@link #kCGLPFAMultiScreen PFAMultiScreen}
    {@link #kCGLPFAFullScreen PFAFullScreen}
    + * @param value on return, points to the value of the attribute + */ + @NativeType("CGLError") + public static int CGLDescribePixelFormat(@NativeType("CGLPixelFormatObj") long pix, @NativeType("GLint") int pix_num, @NativeType("CGLPixelFormatAttribute") int attrib, @NativeType("GLint *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + return nCGLDescribePixelFormat(pix, pix_num, attrib, memAddress(value)); + } + + // --- [ CGLReleasePixelFormat ] --- + + /** + * Decrements the reference count of a pixel format object. + * + *

    The system retains the pixel format object when you call the function {@link #CGLCreateContext CreateContext}, so you can release a pixel format object immediately + * after passing it to the context creation function.

    + * + *

    Each call to CGLReleasePixelFormat decreases the reference count by 1. If the reference count reaches 0, the pixel format object is destroyed.

    + * + * @param pix the pixel format object whose reference count should be decremented + */ + public static void CGLReleasePixelFormat(@NativeType("CGLPixelFormatObj") long pix) { + long __functionAddress = Functions.ReleasePixelFormat; + if (CHECKS) { + check(pix); + } + callPV(pix, __functionAddress); + } + + // --- [ CGLRetainPixelFormat ] --- + + /** + * Increments the receiver's reference count. + * + *

    Each call to CGLRetainPixelFormat increases the reference count by 1. Each call to CGLRetainPixelFormat must be matched with a call to + * {@link #CGLReleasePixelFormat ReleasePixelFormat}.

    + * + * @param pix the pixel format object whose reference count should be incremented + */ + @NativeType("CGLPixelFormatObj") + public static long CGLRetainPixelFormat(@NativeType("CGLPixelFormatObj") long pix) { + long __functionAddress = Functions.RetainPixelFormat; + if (CHECKS) { + check(pix); + } + return callPP(pix, __functionAddress); + } + + // --- [ CGLGetPixelFormatRetainCount ] --- + + /** + * Returns the retain count of a pixel format object. + * + * @param pix a pixel format object + */ + @NativeType("GLuint") + public static int CGLGetPixelFormatRetainCount(@NativeType("CGLPixelFormatObj") long pix) { + long __functionAddress = Functions.GetPixelFormatRetainCount; + if (CHECKS) { + check(pix); + } + return callPI(pix, __functionAddress); + } + + // --- [ CGLQueryRendererInfo ] --- + + /** Unsafe version of: {@link #CGLQueryRendererInfo QueryRendererInfo} */ + public static int nCGLQueryRendererInfo(int display_mask, long rend, long nrend) { + long __functionAddress = Functions.QueryRendererInfo; + return callPPI(display_mask, rend, nrend, __functionAddress); + } + + /** + * Creates a renderer information object that contains properties and values for renderers able to drive all the specified displays in a given display + * mask. + * + * @param display_mask a bit field that contains the bitwise OR of OpenGL display masks returned by the CGDisplayIDToOpenGLDisplayMask function. If you want to obtain + * information for all renderers in the system you must call CGLQueryRendererInfo once for each display bit. + * @param rend the memory address of a renderer information object. On return, points to a renderer information object that describes all renderers that are able + * to drive the displays specified by the {@code display_mask} parameter. If {@code display_mask} does not specify any displays, the value of + * {@code rend} is set to {@code NULL}. You must call {@link #CGLDestroyRendererInfo DestroyRendererInfo} when you no longer need this object. + * @param nrend on return, points to the number of renderers described in the renderer information object. If {@code display_mask} does not specify any displays, + * the value of {@code nrend} is set to 0. + */ + @NativeType("CGLError") + public static int CGLQueryRendererInfo(@NativeType("GLuint") int display_mask, @NativeType("CGLRendererInfoObj *") PointerBuffer rend, @NativeType("GLint *") IntBuffer nrend) { + if (CHECKS) { + check(rend, 1); + check(nrend, 1); + } + return nCGLQueryRendererInfo(display_mask, memAddress(rend), memAddress(nrend)); + } + + // --- [ CGLDestroyRendererInfo ] --- + + /** + * Frees resources associated with a renderer information object. + * + * @param rend the renderer information object to destroy + */ + @NativeType("CGLError") + public static int CGLDestroyRendererInfo(@NativeType("CGLRendererInfoObj") long rend) { + long __functionAddress = Functions.DestroyRendererInfo; + if (CHECKS) { + check(rend); + } + return callPI(rend, __functionAddress); + } + + // --- [ CGLDescribeRenderer ] --- + + /** Unsafe version of: {@link #CGLDescribeRenderer DescribeRenderer} */ + public static int nCGLDescribeRenderer(long rend, int rend_num, int prop, long value) { + long __functionAddress = Functions.DescribeRenderer; + if (CHECKS) { + check(rend); + } + return callPPI(rend, rend_num, prop, value, __functionAddress); + } + + /** + * Obtains the value associated with a renderer property. + * + * @param rend an opaque renderer information object that contains a description of the renderer capabilities you want to inspect. You can obtain a renderer + * information object by calling the function {@link #CGLQueryRendererInfo QueryRendererInfo}. You must call {@link #CGLDestroyRendererInfo DestroyRendererInfo} when you no longer need this + * object. + * @param rend_num the index of the renderer inside the renderer information object — a value between 0 and the number of renderers minus one. The number of renderers + * can be obtained by calling {@link #CGLDescribeRenderer DescribeRenderer}, passing in {@code rend}, renderer number 0, and the renderer property + * {@link #kCGLRPRendererCount RPRendererCount}. + * @param prop the renderer property whose value you want to obtain. One of:
    {@link #kCGLRPOffScreen RPOffScreen}{@link #kCGLRPRendererID RPRendererID}{@link #kCGLRPAccelerated RPAccelerated}{@link #kCGLRPBackingStore RPBackingStore}{@link #kCGLRPWindow RPWindow}
    {@link #kCGLRPCompliant RPCompliant}{@link #kCGLRPDisplayMask RPDisplayMask}{@link #kCGLRPBufferModes RPBufferModes}{@link #kCGLRPColorModes RPColorModes}{@link #kCGLRPAccumModes RPAccumModes}
    {@link #kCGLRPDepthModes RPDepthModes}{@link #kCGLRPStencilModes RPStencilModes}{@link #kCGLRPMaxAuxBuffers RPMaxAuxBuffers}{@link #kCGLRPMaxSampleBuffers RPMaxSampleBuffers}{@link #kCGLRPMaxSamples RPMaxSamples}
    {@link #kCGLRPSampleModes RPSampleModes}{@link #kCGLRPSampleAlpha RPSampleAlpha}{@link #kCGLRPVideoMemory RPVideoMemory}{@link #kCGLRPTextureMemory RPTextureMemory}{@link #kCGLRPGPUVertProcCapable RPGPUVertProcCapable}
    {@link #kCGLRPGPUFragProcCapable RPGPUFragProcCapable}{@link #kCGLRPRendererCount RPRendererCount}{@link #kCGLRPOnline RPOnline}{@link #kCGLRPAcceleratedCompute RPAcceleratedCompute}{@link #kCGLRPVideoMemoryMegabytes RPVideoMemoryMegabytes}
    {@link #kCGLRPTextureMemoryMegabytes RPTextureMemoryMegabytes}{@link #kCGLRPRobust RPRobust}{@link #kCGLRPMPSafe RPMPSafe}{@link #kCGLRPMultiScreen RPMultiScreen}{@link #kCGLRPFullScreen RPFullScreen}
    + * @param value on return, points to the value of the requested property + */ + @NativeType("CGLError") + public static int CGLDescribeRenderer(@NativeType("CGLRendererInfoObj") long rend, @NativeType("GLint") int rend_num, @NativeType("CGLRendererProperty") int prop, @NativeType("GLint *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + return nCGLDescribeRenderer(rend, rend_num, prop, memAddress(value)); + } + + // --- [ CGLCreateContext ] --- + + /** Unsafe version of: {@link #CGLCreateContext CreateContext} */ + public static int nCGLCreateContext(long pix, long share, long ctx) { + long __functionAddress = Functions.CreateContext; + if (CHECKS) { + check(pix); + } + return callPPPI(pix, share, ctx, __functionAddress); + } + + /** + * Creates a CGL rendering context. + * + * @param pix a pixel format object created by calling the function {@link #CGLChoosePixelFormat ChoosePixelFormat} + * @param share the rendering context with which to share the OpenGL object state — including texture objects, programs and shader display lists, vertex array + * objects, vertex buffer objects, pixel buffer objects, and frame buffer objects — and the object state associated which each of these object types. + * Pass {@code NULL} to indicate that no sharing is to take place. + * @param ctx the memory address of a context object. On return, points to a new context object with the buffers and attributes specified by the {@code pix} + * parameter. If the context can not be created as specified, the value of {@code ctx} is set to {@code NULL}. + */ + @NativeType("CGLError") + public static int CGLCreateContext(@NativeType("CGLPixelFormatObj") long pix, @NativeType("CGLContextObj") long share, @NativeType("CGLContextObj *") PointerBuffer ctx) { + if (CHECKS) { + check(ctx, 1); + } + return nCGLCreateContext(pix, share, memAddress(ctx)); + } + + // --- [ CGLDestroyContext ] --- + + /** + * Frees the resources associated with a rendering context. + * + *

    Starting in Mac OS 10.5, CGL rendering contexts are reference counted. For compatibility reasons, calling CGLDestroyContext clears the drawable + * associated with the rendering context. Calling CGLDestroyContext is the equivalent of calling both {@link #CGLClearDrawable ClearDrawable} and + * {@link #CGLReleaseContext ReleaseContext}.

    + * + * @param ctx the rendering context to destroy + */ + @NativeType("CGLError") + public static int CGLDestroyContext(@NativeType("CGLContextObj") long ctx) { + long __functionAddress = Functions.DestroyContext; + if (CHECKS) { + check(ctx); + } + return callPI(ctx, __functionAddress); + } + + // --- [ CGLCopyContext ] --- + + /** + * Copies the specified state variables from one rendering context to another. + * + * @param src the source rendering context + * @param dst the destination rendering context + * @param mask a mask that specifies the state variables to copy. Pass a bit field that contains the bitwise OR of the state variable names that you want to copy. + * Use the symbolic mask constants that are passed to the OpenGL function {@link GL11#glPushAttrib PushAttrib}. To copy as many state variables + * as possible, supply the constant {@link GL11#GL_ALL_ATTRIB_BITS ALL_ATTRIB_BITS}. + */ + @NativeType("CGLError") + public static int CGLCopyContext(@NativeType("CGLContextObj") long src, @NativeType("CGLContextObj") long dst, @NativeType("GLbitfield") int mask) { + long __functionAddress = Functions.CopyContext; + if (CHECKS) { + check(src); + check(dst); + } + return callPPI(src, dst, mask, __functionAddress); + } + + // --- [ CGLRetainContext ] --- + + /** + * Increments the retain count on a CGL rendering context. + * + *

    Each call to CGLRetainContext increases the retain count by 1. To prevent memory leaks, each retain call must be balanced with a call to + * {@link #CGLReleaseContext ReleaseContext}.

    + * + * @param ctx the rendering context to be retained + * + * @return the same context that was passed into the function. + */ + @NativeType("CGLContextObj") + public static long CGLRetainContext(@NativeType("CGLContextObj") long ctx) { + long __functionAddress = Functions.RetainContext; + if (CHECKS) { + check(ctx); + } + return callPP(ctx, __functionAddress); + } + + // --- [ CGLReleaseContext ] --- + + /** + * Decrements the retain count on a CGL rendering context. + * + *

    Each call to CGLReleaseContext decreases the retain count by 1.

    + * + *

    When the retain count reaches 0, all resources associated with the rendering context are freed. If the rendering context that you pass is the current + * rendering context and it is freed, the current context is set to {@code NULL} and there is no current rendering context after the function executes. After the + * context is freed, you must make sure you do not use the destroyed rendering context. This includes using CGL macros in which the rendering context is + * explicitly passed to OpenGL.

    + * + * @param ctx the rendering context to be released + */ + public static void CGLReleaseContext(@NativeType("CGLContextObj") long ctx) { + long __functionAddress = Functions.ReleaseContext; + if (CHECKS) { + check(ctx); + } + callPV(ctx, __functionAddress); + } + + // --- [ CGLGetContextRetainCount ] --- + + /** + * Returns the current retain count of a CGL rendering context. + * + * @param ctx the CGL rendering context whose retain count you wish to discover + */ + @NativeType("GLuint") + public static int CGLGetContextRetainCount(@NativeType("CGLContextObj") long ctx) { + long __functionAddress = Functions.GetContextRetainCount; + if (CHECKS) { + check(ctx); + } + return callPI(ctx, __functionAddress); + } + + // --- [ CGLGetPixelFormat ] --- + + /** + * Retrieves the current pixel format associated with a CGL rendering context. + * + *

    The pixel format object is not retained before being returned to your application. If your application needs to maintain this object, it should call + * {@link #CGLRetainPixelFormat RetainPixelFormat}.

    + * + * @param ctx the CGL rendering context whose format you want to receive + */ + @NativeType("CGLPixelFormatObj") + public static long CGLGetPixelFormat(@NativeType("CGLContextObj") long ctx) { + long __functionAddress = Functions.GetPixelFormat; + if (CHECKS) { + check(ctx); + } + return callPP(ctx, __functionAddress); + } + + // --- [ CGLCreatePBuffer ] --- + + /** Unsafe version of: {@link #CGLCreatePBuffer CreatePBuffer} */ + public static int nCGLCreatePBuffer(int width, int height, int target, int internalFormat, int max_level, long pbuffer) { + long __functionAddress = Functions.CreatePBuffer; + return callPI(width, height, target, internalFormat, max_level, pbuffer, __functionAddress); + } + + /** + * Creates a pixel buffer of the specified size, compatible with the specified texture target. + * + *

    This function does not have any knowledge of OpenGL contexts or pixel format objects and does not specifically allocate the storage needed for the + * actual pixel buffer. These operations occur when you call the function {@link #CGLSetPBuffer SetPBuffer}.

    + * + *

    You can determine the dimensional limits of a pixel buffer by calling the OpenGL function glGetInteger. You can find the maximum size supported by + * querying GL_MAX_VIEWPORT_DIMS and the minimum size by querying GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE, which returns two integer values (similar to + * GL_MAX_VIEWPORT_DIMS). All pixel buffer dimensions that you request with the function aglCreatePBuffer should fall within these limits (inclusively) + * and should comply with any limitations imposed by the texture target you select.

    + * + *

    The maximum viewport size supported in OS X is quite large. You should take into consideration the amount of video or system memory required to support + * the requested pixel buffer size, including additional memory needed for multiple buffers and options such as multisampling.

    + * + *

    Starting in OS X v10.5, pixel buffer objects are reference counted. Pixel buffer objects are created with a reference count of 1 and are destroyed when + * the last reference to the object is released.

    + * + *

    Deprecated in OS X v10.7.

    + * + * @param width the width, in pixels, of the pixel buffer + * @param height the height, in pixels, of the pixel buffer + * @param target a constant that specifies the type of the pixel buffer target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}
    + * @param internalFormat a constant that specifies the internal color format of the pixel buffer. The format controls whether the alpha channel of the pixel buffer is used + * for texturing operations. One of:
    {@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA}
    + * @param max_level the maximum level of mipmap detail allowable. Pass 0 for a pixel buffer that is not using mipmaps. The value passed should never exceed the actual + * maximum number of mipmap levels that can be represented with the given width and height. + * @param pbuffer on return, points to a new pixel buffer object + */ + @NativeType("CGLError") + public static int CGLCreatePBuffer(@NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int target, @NativeType("GLenum") int internalFormat, @NativeType("GLint") int max_level, @NativeType("CGLPBufferObj *") PointerBuffer pbuffer) { + if (CHECKS) { + check(pbuffer, 1); + } + return nCGLCreatePBuffer(width, height, target, internalFormat, max_level, memAddress(pbuffer)); + } + + // --- [ CGLDestroyPBuffer ] --- + + /** + * Releases the resources associated with a pixel buffer object. + * + *

    Starting in OS X v10.5, pixel buffer objects are reference counted. Calling this function is equivalent to calling {@link #CGLReleasePBuffer ReleasePBuffer}.

    + * + *

    Deprecated in OS X v10.7.

    + * + * @param pbuffer the pixel buffer object whose resources you want to release + */ + @NativeType("CGLError") + public static int CGLDestroyPBuffer(@NativeType("CGLPBufferObj") long pbuffer) { + long __functionAddress = Functions.DestroyPBuffer; + if (CHECKS) { + check(pbuffer); + } + return callPI(pbuffer, __functionAddress); + } + + // --- [ CGLDescribePBuffer ] --- + + /** Unsafe version of: {@link #CGLDescribePBuffer DescribePBuffer} */ + public static int nCGLDescribePBuffer(long obj, long width, long height, long target, long internalFormat, long mipmap) { + long __functionAddress = Functions.DescribePBuffer; + if (CHECKS) { + check(obj); + } + return callPPPPPPI(obj, width, height, target, internalFormat, mipmap, __functionAddress); + } + + /** + * Retrieves information that describes the specified pixel buffer object. + * + *

    The width, height, texture target, and internal texture color format of a pixel buffer object are set at its creation and cannot be changed without + * destroying and recreating the object. The level is set when the pixel buffer object is attached to a rendering context by calling the function + * {@link #CGLSetPBuffer SetPBuffer}.

    + * + *

    Deprecated in OS X v10.7.

    + * + * @param obj a pointer to the pixel buffer object + * @param width on return, points to the width, in pixels, of the pixel buffer + * @param height on return, points to the height, in pixels, of the pixel buffer + * @param target on return, points to a constant that specifies the pixel buffer texture target + * @param internalFormat on return, points to a constant that specifies the internal color format of the pixel buffer + * @param mipmap on return, points to the mipmap level of the pixel buffer or 0 if it doesn't use mipmaps + */ + @NativeType("CGLError") + public static int CGLDescribePBuffer(@NativeType("CGLPBufferObj") long obj, @NativeType("GLsizei *") IntBuffer width, @NativeType("GLsizei *") IntBuffer height, @NativeType("GLenum *") IntBuffer target, @NativeType("GLenum *") IntBuffer internalFormat, @NativeType("GLint *") IntBuffer mipmap) { + if (CHECKS) { + check(width, 1); + check(height, 1); + check(target, 1); + check(internalFormat, 1); + check(mipmap, 1); + } + return nCGLDescribePBuffer(obj, memAddress(width), memAddress(height), memAddress(target), memAddress(internalFormat), memAddress(mipmap)); + } + + // --- [ CGLTexImagePBuffer ] --- + + /** + * Binds the contents of a pixel buffer to a data source for a texture object. + * + *

    You must generate and bind a texture name (using standard OpenGL texturing calls) that is compatible with the pixel buffer texture target. Don't supply + * a texture object that was used previously for nonpixel buffer texturing operations unless you first call glDeleteTextures to regenerate the texture + * name.

    + * + *

    If you modify the content of a pixel buffer that uses mipmap levels, you must call this function again before drawing with the pixel buffer, to ensure + * that the content is synchronized with OpenGL. For pixel buffers without mipmaps, simply rebind to the texture object to synchronize content.

    + * + *

    No OpenGL texturing calls that modify a pixel buffer texture content are permitted (such as glTexSubImage2D or glCopyTexImage2D) with the pixel buffer + * texture as the destination. It is permitted to use texturing commands to read data from a pixel buffer texture, such as glCopyTexImage2D, with the + * pixel buffer texture as the source. It is also legal to use OpenGL functions such as glReadPixels to read the contents of a pixel buffer directly + * through the pixel buffer context.

    + * + *

    Note that texturing with the CGLTexImagePBuffer function can fail to produce the intended results without error in the same way other OpenGL texturing + * commands can normally fail. The function fails if you set an incompatible filter mode, do not enable the proper texture target, or other conditions + * described in the OpenGL specification.

    + * + *

    You don't need to share a context to use a pixel buffer object as a texture source. You can use independent pixel format objects and OpenGL contexts + * for both the pixel buffer and the target drawable object without sharing resources, and still texture using a pixel buffer in the target context.

    + * + *

    Deprecated in OS X v10.7.

    + * + * @param ctx a rendering context, which is the target context for the texture operation. This is the context that you plan to render content to. This is not the + * context attached to the pixel buffer. + * @param pbuffer a pixel buffer object + * @param source the source buffer to get the texture from, which should be a valid OpenGL buffer such as GL_FRONT or GL_BACK and should be compatible with the + * buffer and renderer attributes that you used to create the rendering context attached to the pixel buffer. This means that the pixel buffer must + * possess the buffer in question for the texturing operation to succeed. + */ + @NativeType("CGLError") + public static int CGLTexImagePBuffer(@NativeType("CGLContextObj") long ctx, @NativeType("CGLPBufferObj") long pbuffer, @NativeType("GLenum") int source) { + long __functionAddress = Functions.TexImagePBuffer; + if (CHECKS) { + check(ctx); + check(pbuffer); + } + return callPPI(ctx, pbuffer, source, __functionAddress); + } + + // --- [ CGLRetainPBuffer ] --- + + /** + * Increments the retain count on a pixel buffer object. + * + *

    Each call to CGLRetainPBuffer increases the retain count by 1. To prevent the pixel buffer object from being leaked, each retain call must be matched + * with a call to {@link #CGLReleasePBuffer ReleasePBuffer}.

    + * + *

    Deprecated in OS X v10.7.

    + * + * @param pbuffer the pixel buffer object whose retain count you wish to increment + */ + @NativeType("CGLPBufferObj") + public static long CGLRetainPBuffer(@NativeType("CGLPBufferObj") long pbuffer) { + long __functionAddress = Functions.RetainPBuffer; + if (CHECKS) { + check(pbuffer); + } + return callPP(pbuffer, __functionAddress); + } + + // --- [ CGLReleasePBuffer ] --- + + /** + * Releases the resources associated with a pixel buffer object. + * + *

    Starting in OS X v10.5, pixel buffer objects are reference counted. Calling this function is equivalent to calling CGLReleasePBuffer.

    + * + *

    Deprecated in OS X v10.7.

    + * + * @param pbuffer the pixel buffer object whose resources you want to release + */ + public static void CGLReleasePBuffer(@NativeType("CGLPBufferObj") long pbuffer) { + long __functionAddress = Functions.ReleasePBuffer; + if (CHECKS) { + check(pbuffer); + } + callPV(pbuffer, __functionAddress); + } + + // --- [ CGLGetPBufferRetainCount ] --- + + /** + * Returns the retain count of a pixel buffer object. + * + *

    Deprecated in OS X v10.7.

    + * + * @param pbuffer the pixel buffer object whose retain count you wish to retrieve + */ + @NativeType("GLuint") + public static int CGLGetPBufferRetainCount(@NativeType("CGLPBufferObj") long pbuffer) { + long __functionAddress = Functions.GetPBufferRetainCount; + if (CHECKS) { + check(pbuffer); + } + return callPI(pbuffer, __functionAddress); + } + + // --- [ CGLSetOffScreen ] --- + + /** Unsafe version of: {@link #CGLSetOffScreen SetOffScreen} */ + public static int nCGLSetOffScreen(long ctx, int width, int height, int rowbytes, long baseaddr) { + long __functionAddress = Functions.SetOffScreen; + if (CHECKS) { + check(ctx); + } + return callPPI(ctx, width, height, rowbytes, baseaddr, __functionAddress); + } + + /** + * Attaches a rendering context to an offscreen buffer. + * + *

    Before calling this function, you must set up the rendering context using a pixel format object created with the kCGLPFAOffScreen attribute. For more + * information about kCGLPFAOffScreen, see Buffer and Renderer Attributes.

    + * + *

    After calling this function, subsequent OpenGL drawing is rendered into the offscreen buffer and the viewport of the rendering context is set to the + * full size of the offscreen area.

    + * + *

    To exit offscreen mode, call {@link #CGLClearDrawable ClearDrawable}.

    + * + *

    To obtain functionality similar to offscreen mode on renderers that do not support it, attach the context to a hidden window and use the OpenGL + * function glReadPixels.

    + * + *

    Deprecated in OS X v10.7.

    + * + * @param ctx a rendering context + * @param width the width, in pixels, of the offscreen buffer + * @param height the height, in pixels, of the offscreen buffer + * @param rowbytes the number of bytes per row of the offscreen buffer, which must be greater than or equal to width times bytes per pixel + * @param baseaddr a pointer to a block of memory to use as the offscreen buffer. The size of the memory must be at least {@code rowbytes*height} bytes. + */ + @NativeType("CGLError") + public static int CGLSetOffScreen(@NativeType("CGLContextObj") long ctx, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int rowbytes, @NativeType("void *") ByteBuffer baseaddr) { + if (CHECKS) { + check(baseaddr, rowbytes * height); + } + return nCGLSetOffScreen(ctx, width, height, rowbytes, memAddress(baseaddr)); + } + + // --- [ CGLGetOffScreen ] --- + + /** Unsafe version of: {@link #CGLGetOffScreen GetOffScreen} */ + public static int nCGLGetOffScreen(long ctx, long width, long height, long rowbytes, long baseaddr) { + long __functionAddress = Functions.GetOffScreen; + if (CHECKS) { + check(ctx); + } + return callPPPPPI(ctx, width, height, rowbytes, baseaddr, __functionAddress); + } + + /** + * Retrieves an offscreen buffer and its parameters for a specified rendering context. + * + *

    Deprecated in OS X v10.7.

    + * + * @param ctx a rendering context + * @param width on return, points to the width, in pixels, of the offscreen buffer. If the rendering context is not attached to an offscreen drawable object, the + * value of width is set to 0. + * @param height on return, points to the height, in pixels, of the offscreen buffer. If the rendering context is not attached to an offscreen drawable object, the + * value of height is set to 0. + * @param rowbytes on return, points to the number of bytes per row of the offscreen buffer. If the context is not attached to an offscreen drawable object, the value + * of rowbytes is set to 0. + * @param baseaddr on return, points to the base address of the offscreen buffer. If the context is not attached to an offscreen drawable object, the value of + * {@code baseaddr} is set to {@code NULL}. + */ + @NativeType("CGLError") + public static int CGLGetOffScreen(@NativeType("CGLContextObj") long ctx, @NativeType("GLsizei *") IntBuffer width, @NativeType("GLsizei *") IntBuffer height, @NativeType("GLint *") IntBuffer rowbytes, @NativeType("void **") PointerBuffer baseaddr) { + if (CHECKS) { + check(width, 1); + check(height, 1); + check(rowbytes, 1); + check(baseaddr, 1); + } + return nCGLGetOffScreen(ctx, memAddress(width), memAddress(height), memAddress(rowbytes), memAddress(baseaddr)); + } + + // --- [ CGLSetFullScreen ] --- + + /** + * Attaches a rendering context to its full-screen drawable object. + * + *

    Before calling this function, you must set up the rendering context using a pixel format object created with the kCGLPFAFullScreen attribute (see + * Buffer and Renderer Attributes). Some OpenGL renderers, such as the software renderer, do not support full-screen mode. After you call the function + * {@link #CGLChoosePixelFormat ChoosePixelFormat} with the full-screen attribute, you need to check whether the pixel format object is created successfully.

    + * + *

    You must capture the display prior to entering full-screen mode and release it after exiting. After calling this function, subsequent OpenGL drawing is + * rendered into the entire screen. For more information, see OpenGL Programming Guide for Mac.

    + * + *

    To exit full-screen mode, call {@link #CGLClearDrawable ClearDrawable}.

    + * + *

    Deprecated in OS X v10.7. Use {@link #CGLSetFullScreenOnDisplay SetFullScreenOnDisplay} instead.

    + * + * @param ctx a rendering context + */ + @NativeType("CGLError") + public static int CGLSetFullScreen(@NativeType("CGLContextObj") long ctx) { + long __functionAddress = Functions.SetFullScreen; + if (CHECKS) { + check(ctx); + } + return callPI(ctx, __functionAddress); + } + + // --- [ CGLSetFullScreenOnDisplay ] --- + + /** + * Attaches a rendering context to a full-screen drawable object." + + * + *

    This function obtains a drawable object that covers an entire screen and attaches it to the rendering context. A full-screen rendering context may + * allow the underlying renderer to provide better performance compared to a context associated with a window that partially covers the screen.

    + * + *

    Prior to calling this function, your application should ensure that the context is capable of rendering to this display by querying the appropriate + * renderer properties. For more information, see {@link #CGLQueryRendererInfo QueryRendererInfo}. Note that some renderers, including the software renderer, do not support + * full-screen mode.

    + * + *

    You must capture the screen prior to entering full-screen mode and release it after exiting. After calling this function, subsequent OpenGL drawing is + * rendered into the entire screen. For more information, see OpenGL Programming Guide for Mac.

    + * + *

    To exit full-screen mode, call {@link #CGLClearDrawable ClearDrawable}.

    + * + *

    In OS X v10.6 or later, this function is not deprecated, but is usually not necessary. If your application creates a window that completely covers the + * screen, the system implicitly creates a full-screen instance, for the same potential performance benefit.

    + * + *

    Deprecated in OS X v10.7.

    + * + * @param ctx a rendering context + * @param display_mask a bit field that contains the OpenGL display mask for the screen you wish the context to cover + */ + @NativeType("CGLError") + public static int CGLSetFullScreenOnDisplay(@NativeType("CGLContextObj") long ctx, @NativeType("GLuint") int display_mask) { + long __functionAddress = Functions.SetFullScreenOnDisplay; + if (CHECKS) { + check(ctx); + } + return callPI(ctx, display_mask, __functionAddress); + } + + // --- [ CGLSetPBuffer ] --- + + /** + * Attaches a pixel buffer object to a rendering context. + * + *

    The first time you call this function for a specific pixel buffer object, the system creates the necessary buffers. The buffers are created to support + * the attributes dictated by the pixel format object used to create the rendering context and by the parameters used to create the pixel buffer object. + * The storage requirements for pixel buffer objects, which can be quite large, are very similar to the requirements for windows or views with OpenGL + * contexts attached. All drawable objects compete for the same scarce resources. This function can fail is there is not enough contiguous VRAM for each + * buffer. It's best to code defensively with a scheme that reduces resource consumption without causing the application to resort to failure. Unless, of + * course, failure is the only viable alternative.

    + * + *

    The ability to attach a pixel buffer to a context is supported only on renderers that export GL_APPLE_pixel_buffer in the GL_EXTENSIONS string. Before + * calling this function, you should programmatically determine if it’s possible to attach a pixel buffer to a context by querying GL_EXTENSIONS in the + * context and looking for GL_APPLE_pixel_buffer. If that extension is not present, the renderer won’t allow setting the pixel buffer.

    + * + *

    In order of performance, these are the renderers you should consider using when setting up a rendering context to attach to a pixel buffer:

    + * + *
      + *
    • A hardware renderer.
    • + *
    • The generic render, but only with an offscreen pixel format and glTexSubImage.
    • + *
    • The Apple software renderer, which supports pixel buffers in OS X v10.4.8 and later.
    • + *
    + * + *

    Deprecated in OS X v10.7.

    + * + * @param ctx the rendering context to attach the pixel buffer to + * @param pbuffer a pixel buffer object + * @param face the cube map face to draw if the pixel buffer texture target type is {@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}; otherwise pass 0. + * @param level the mipmap level to draw. This must not exceed the maximum mipmap level set when the pixel buffer object was created. Pass 0 for a texture target + * that does not support mipmaps. + * @param screen a virtual screen value. The virtual screen determines the renderer OpenGL uses to draw to the pixel buffer object. For best performance, for a + * pixel buffer used as a texture source, you should supply the virtual screen value that results in using the same renderer used by the context + * that's the texturing target. + */ + @NativeType("CGLError") + public static int CGLSetPBuffer(@NativeType("CGLContextObj") long ctx, @NativeType("CGLPBufferObj") long pbuffer, @NativeType("GLenum") int face, @NativeType("GLint") int level, @NativeType("GLint") int screen) { + long __functionAddress = Functions.SetPBuffer; + if (CHECKS) { + check(ctx); + check(pbuffer); + } + return callPPI(ctx, pbuffer, face, level, screen, __functionAddress); + } + + // --- [ CGLGetPBuffer ] --- + + /** Unsafe version of: {@link #CGLGetPBuffer GetPBuffer} */ + public static int nCGLGetPBuffer(long ctx, long pbuffer, long face, long level, long screen) { + long __functionAddress = Functions.GetPBuffer; + if (CHECKS) { + check(ctx); + } + return callPPPPPI(ctx, pbuffer, face, level, screen, __functionAddress); + } + + /** + * Retrieves a pixel buffer and its parameters for a specified rendering context. + * + *

    Deprecated in OS X v10.7.

    + * + * @param ctx a rendering context + * @param pbuffer on return, points to the pixel buffer object attached to the rendering context + * @param face on return, points to the cube map face that is set if the pixel buffer texture target type is {@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}; otherwise 0 for all other + * texture target types. + * @param level on return, points to the current mipmap level for drawing + * @param screen on return, points to the current virtual screen number, as set by the last valid call to {@link #CGLSetPBuffer SetPBuffer} + */ + @NativeType("CGLError") + public static int CGLGetPBuffer(@NativeType("CGLContextObj") long ctx, @NativeType("CGLPBufferObj *") PointerBuffer pbuffer, @NativeType("GLenum *") IntBuffer face, @NativeType("GLint *") IntBuffer level, @NativeType("GLint *") IntBuffer screen) { + if (CHECKS) { + check(pbuffer, 1); + check(face, 1); + check(level, 1); + check(screen, 1); + } + return nCGLGetPBuffer(ctx, memAddress(pbuffer), memAddress(face), memAddress(level), memAddress(screen)); + } + + // --- [ CGLClearDrawable ] --- + + /** + * Disassociates a rendering context from any drawable objects attached to it. + * + * @param ctx a rendering context + */ + @NativeType("CGLError") + public static int CGLClearDrawable(@NativeType("CGLContextObj") long ctx) { + long __functionAddress = Functions.ClearDrawable; + if (CHECKS) { + check(ctx); + } + return callPI(ctx, __functionAddress); + } + + // --- [ CGLFlushDrawable ] --- + + /** + * Copies the back buffer of a double-buffered context to the front buffer. + * + *

    To create a double-buffered context, specify the {@link #kCGLPFADoubleBuffer PFADoubleBuffer} attribute when you create the pixel format object for the rendering + * context. If the backing store attribute is set to false, the buffers can be exchanged rather than copied. This is often the case in full-screen mode. If + * the receiver is not a double-buffered context, this call does nothing.

    + * + *

    If you set the swap interval attribute ({@link #kCGLCPSwapInterval CPSwapInterval}) appropriately, the copy takes place during the vertical retrace of the display, + * rather than immediately after CGLFlushDrawable is called. An implicit {@link GL11C#glFlush Flush} operation is performed by CGLFlushDrawable + * before it returns. For optimal performance, an application should not call glFlush immediately before calling CGLFlushDrawable. Subsequent OpenGL + * commands can be issued immediately after calling CGLFlushDrawable, but are not executed until the buffer copy is completed.

    + * + * @param ctx the context object + */ + @NativeType("CGLError") + public static int CGLFlushDrawable(@NativeType("CGLContextObj") long ctx) { + long __functionAddress = Functions.FlushDrawable; + if (CHECKS) { + check(ctx); + } + return callPI(ctx, __functionAddress); + } + + // --- [ CGLEnable ] --- + + /** + * Enables an option for a rendering context. + * + * @param ctx a rendering context + * @param pname the option to enable. One of:
    {@link #kCGLCESwapRectangle CESwapRectangle}{@link #kCGLCESwapLimit CESwapLimit}{@link #kCGLCERasterization CERasterization}{@link #kCGLCEStateValidation CEStateValidation}{@link #kCGLCESurfaceBackingSize CESurfaceBackingSize}
    {@link #kCGLCEDisplayListOptimization CEDisplayListOptimization}{@link #kCGLCEMPEngine CEMPEngine}
    + */ + @NativeType("CGLError") + public static int CGLEnable(@NativeType("CGLContextObj") long ctx, @NativeType("CGLContextEnable") int pname) { + long __functionAddress = Functions.Enable; + if (CHECKS) { + check(ctx); + } + return callPI(ctx, pname, __functionAddress); + } + + // --- [ CGLDisable ] --- + + /** + * Disables an option for a rendering context. + * + * @param ctx a rendering context + * @param pname the option to disable. One of:
    {@link #kCGLCESwapRectangle CESwapRectangle}{@link #kCGLCESwapLimit CESwapLimit}{@link #kCGLCERasterization CERasterization}{@link #kCGLCEStateValidation CEStateValidation}{@link #kCGLCESurfaceBackingSize CESurfaceBackingSize}
    {@link #kCGLCEDisplayListOptimization CEDisplayListOptimization}{@link #kCGLCEMPEngine CEMPEngine}
    + */ + @NativeType("CGLError") + public static int CGLDisable(@NativeType("CGLContextObj") long ctx, @NativeType("CGLContextEnable") int pname) { + long __functionAddress = Functions.Disable; + if (CHECKS) { + check(ctx); + } + return callPI(ctx, pname, __functionAddress); + } + + // --- [ CGLIsEnabled ] --- + + /** Unsafe version of: {@link #CGLIsEnabled IsEnabled} */ + public static int nCGLIsEnabled(long ctx, int pname, long enable) { + long __functionAddress = Functions.IsEnabled; + if (CHECKS) { + check(ctx); + } + return callPPI(ctx, pname, enable, __functionAddress); + } + + /** + * Reports whether an option is enabled for a rendering context. + * + * @param ctx a rendering context + * @param pname the option to query. One of:
    {@link #kCGLCESwapRectangle CESwapRectangle}{@link #kCGLCESwapLimit CESwapLimit}{@link #kCGLCERasterization CERasterization}{@link #kCGLCEStateValidation CEStateValidation}{@link #kCGLCESurfaceBackingSize CESurfaceBackingSize}
    {@link #kCGLCEDisplayListOptimization CEDisplayListOptimization}{@link #kCGLCEMPEngine CEMPEngine}
    + * @param enable on return, enable is set to true if the option is enabled + */ + @NativeType("CGLError") + public static int CGLIsEnabled(@NativeType("CGLContextObj") long ctx, @NativeType("CGLContextEnable") int pname, @NativeType("GLint *") IntBuffer enable) { + if (CHECKS) { + check(enable, 1); + } + return nCGLIsEnabled(ctx, pname, memAddress(enable)); + } + + // --- [ CGLSetParameter ] --- + + /** Unsafe version of: {@link #CGLSetParameter SetParameter} */ + public static int nCGLSetParameter(long ctx, int pname, long params) { + long __functionAddress = Functions.SetParameter; + if (CHECKS) { + check(ctx); + } + return callPPI(ctx, pname, params, __functionAddress); + } + + /** + * Sets the value of a rendering context parameter. + * + * @param ctx a rendering context + * @param pname the parameter whose value you want to set. One of:
    {@link #kCGLCPSwapRectangle CPSwapRectangle}{@link #kCGLCPSwapInterval CPSwapInterval}{@link #kCGLCPDispatchTableSize CPDispatchTableSize}{@link #kCGLCPClientStorage CPClientStorage}
    {@link #kCGLCPSurfaceTexture CPSurfaceTexture}{@link #kCGLCPSurfaceOrder CPSurfaceOrder}{@link #kCGLCPSurfaceOpacity CPSurfaceOpacity}{@link #kCGLCPSurfaceBackingSize CPSurfaceBackingSize}
    {@link #kCGLCPSurfaceSurfaceVolatile CPSurfaceSurfaceVolatile}{@link #kCGLCPReclaimResources CPReclaimResources}{@link #kCGLCPCurrentRendererID CPCurrentRendererID}{@link #kCGLCPGPUVertexProcessing CPGPUVertexProcessing}
    {@link #kCGLCPGPUFragmentProcessing CPGPUFragmentProcessing}{@link #kCGLCPHasDrawable CPHasDrawable}{@link #kCGLCPMPSwapsInFlight CPMPSwapsInFlight}
    + * @param params a pointer to the value to set the parameter to + */ + @NativeType("CGLError") + public static int CGLSetParameter(@NativeType("CGLContextObj") long ctx, @NativeType("CGLContextParameter") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + return nCGLSetParameter(ctx, pname, memAddress(params)); + } + + /** + * Sets the value of a rendering context parameter. + * + * @param ctx a rendering context + * @param pname the parameter whose value you want to set. One of:
    {@link #kCGLCPSwapRectangle CPSwapRectangle}{@link #kCGLCPSwapInterval CPSwapInterval}{@link #kCGLCPDispatchTableSize CPDispatchTableSize}{@link #kCGLCPClientStorage CPClientStorage}
    {@link #kCGLCPSurfaceTexture CPSurfaceTexture}{@link #kCGLCPSurfaceOrder CPSurfaceOrder}{@link #kCGLCPSurfaceOpacity CPSurfaceOpacity}{@link #kCGLCPSurfaceBackingSize CPSurfaceBackingSize}
    {@link #kCGLCPSurfaceSurfaceVolatile CPSurfaceSurfaceVolatile}{@link #kCGLCPReclaimResources CPReclaimResources}{@link #kCGLCPCurrentRendererID CPCurrentRendererID}{@link #kCGLCPGPUVertexProcessing CPGPUVertexProcessing}
    {@link #kCGLCPGPUFragmentProcessing CPGPUFragmentProcessing}{@link #kCGLCPHasDrawable CPHasDrawable}{@link #kCGLCPMPSwapsInFlight CPMPSwapsInFlight}
    + */ + @NativeType("CGLError") + public static int CGLSetParameter(@NativeType("CGLContextObj") long ctx, @NativeType("CGLContextParameter") int pname, @NativeType("GLint const *") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.ints(param); + return nCGLSetParameter(ctx, pname, memAddress(params)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ CGLGetParameter ] --- + + /** Unsafe version of: {@link #CGLGetParameter GetParameter} */ + public static int nCGLGetParameter(long ctx, int pname, long params) { + long __functionAddress = Functions.GetParameter; + if (CHECKS) { + check(ctx); + } + return callPPI(ctx, pname, params, __functionAddress); + } + + /** + * Retrieves the value of a rendering context parameter. + * + * @param ctx a rendering context + * @param pname the parameter whose value you want to retrieve. One of:
    {@link #kCGLCPSwapRectangle CPSwapRectangle}{@link #kCGLCPSwapInterval CPSwapInterval}{@link #kCGLCPDispatchTableSize CPDispatchTableSize}{@link #kCGLCPClientStorage CPClientStorage}
    {@link #kCGLCPSurfaceTexture CPSurfaceTexture}{@link #kCGLCPSurfaceOrder CPSurfaceOrder}{@link #kCGLCPSurfaceOpacity CPSurfaceOpacity}{@link #kCGLCPSurfaceBackingSize CPSurfaceBackingSize}
    {@link #kCGLCPSurfaceSurfaceVolatile CPSurfaceSurfaceVolatile}{@link #kCGLCPReclaimResources CPReclaimResources}{@link #kCGLCPCurrentRendererID CPCurrentRendererID}{@link #kCGLCPGPUVertexProcessing CPGPUVertexProcessing}
    {@link #kCGLCPGPUFragmentProcessing CPGPUFragmentProcessing}{@link #kCGLCPHasDrawable CPHasDrawable}{@link #kCGLCPMPSwapsInFlight CPMPSwapsInFlight}
    + * @param params on return, points to the value of the parameter + */ + @NativeType("CGLError") + public static int CGLGetParameter(@NativeType("CGLContextObj") long ctx, @NativeType("CGLContextParameter") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + return nCGLGetParameter(ctx, pname, memAddress(params)); + } + + // --- [ CGLSetVirtualScreen ] --- + + /** + * Forces subsequent OpenGL commands to the specified virtual screen. + * + *

    Setting the virtual screen forces the renderer associated with the virtual screen to process OpenGL commands issued to the specified context. Changing + * the virtual screen changes the current renderer. You should use this function only when it is necessary to override the default behavior. The current + * virtual screen is normally set automatically. Because the current virtual screen determines which OpenGL renderer is processing commands, the return + * values of all glGetXXX functions can be affected by the current virtual screen.

    + * + * @param ctx a rendering context + * @param screen a virtual screen number, which must be a value between 0 and the number of virtual screens minus one. The number of virtual screens available in a + * context can be obtained by calling the function {@link #CGLDescribePixelFormat DescribePixelFormat}, passing in the pixel format object used to create the rendering + * context, 0 for the virtual screen number ({@code pix_num} parameter), and the attribute constant {@link #kCGLPFAVirtualScreenCount PFAVirtualScreenCount}. + */ + @NativeType("CGLError") + public static int CGLSetVirtualScreen(@NativeType("CGLContextObj") long ctx, @NativeType("GLint") int screen) { + long __functionAddress = Functions.SetVirtualScreen; + if (CHECKS) { + check(ctx); + } + return callPI(ctx, screen, __functionAddress); + } + + // --- [ CGLGetVirtualScreen ] --- + + /** Unsafe version of: {@link #CGLGetVirtualScreen GetVirtualScreen} */ + public static int nCGLGetVirtualScreen(long ctx, long screen) { + long __functionAddress = Functions.GetVirtualScreen; + if (CHECKS) { + check(ctx); + } + return callPPI(ctx, screen, __functionAddress); + } + + /** + * Gets the current virtual screen number associated with a rendering context. + * + *

    The current virtual screen can change when a drawable object is moved or resized across graphics device boundaries. A change in the current virtual + * screen can affect the return values of some OpenGL functions and in most cases also means that the renderer has changed.

    + * + * @param ctx a rendering context + * @param screen on return, points to the virtual screen associated with the context. The value is always 0 on a single-display system and –1 if the function fails + * for any reason. + */ + @NativeType("CGLError") + public static int CGLGetVirtualScreen(@NativeType("CGLContextObj") long ctx, @NativeType("GLint *") IntBuffer screen) { + if (CHECKS) { + check(screen, 1); + } + return nCGLGetVirtualScreen(ctx, memAddress(screen)); + } + + // --- [ CGLUpdateContext ] --- + + /** + * Synchronizes new renderer state to that of the application context + * + * @param ctx a rendering context + */ + @NativeType("CGLError") + public static int CGLUpdateContext(@NativeType("CGLContextObj") long ctx) { + long __functionAddress = Functions.UpdateContext; + if (CHECKS) { + check(ctx); + } + return callPI(ctx, __functionAddress); + } + + // --- [ CGLSetGlobalOption ] --- + + /** Unsafe version of: {@link #CGLSetGlobalOption SetGlobalOption} */ + public static int nCGLSetGlobalOption(int pname, long params) { + long __functionAddress = Functions.SetGlobalOption; + return callPI(pname, params, __functionAddress); + } + + /** + * Sets the value of a global option. + * + * @param pname the name of the option whose value you want to set. One of:
    {@link #kCGLGOFormatCacheSize GOFormatCacheSize}{@link #kCGLGOClearFormatCache GOClearFormatCache}{@link #kCGLGORetainRenderers GORetainRenderers}{@link #kCGLGOResetLibrary GOResetLibrary}{@link #kCGLGOUseErrorHandler GOUseErrorHandler}
    {@link #kCGLGOUseBuildCache GOUseBuildCache}
    + * @param params the value to set the option to + */ + @NativeType("CGLError") + public static int CGLSetGlobalOption(@NativeType("CGLGlobalOption") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + return nCGLSetGlobalOption(pname, memAddress(params)); + } + + /** + * Sets the value of a global option. + * + * @param pname the name of the option whose value you want to set. One of:
    {@link #kCGLGOFormatCacheSize GOFormatCacheSize}{@link #kCGLGOClearFormatCache GOClearFormatCache}{@link #kCGLGORetainRenderers GORetainRenderers}{@link #kCGLGOResetLibrary GOResetLibrary}{@link #kCGLGOUseErrorHandler GOUseErrorHandler}
    {@link #kCGLGOUseBuildCache GOUseBuildCache}
    + */ + @NativeType("CGLError") + public static int CGLSetGlobalOption(@NativeType("CGLGlobalOption") int pname, @NativeType("GLint const *") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.ints(param); + return nCGLSetGlobalOption(pname, memAddress(params)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ CGLGetGlobalOption ] --- + + /** Unsafe version of: {@link #CGLGetGlobalOption GetGlobalOption} */ + public static int nCGLGetGlobalOption(int pname, long params) { + long __functionAddress = Functions.GetGlobalOption; + return callPI(pname, params, __functionAddress); + } + + /** + * Retrieves the value of a global option. + * + * @param pname the name of the option whose value you want to get. One of:
    {@link #kCGLGOFormatCacheSize GOFormatCacheSize}{@link #kCGLGOClearFormatCache GOClearFormatCache}{@link #kCGLGORetainRenderers GORetainRenderers}{@link #kCGLGOResetLibrary GOResetLibrary}{@link #kCGLGOUseErrorHandler GOUseErrorHandler}
    {@link #kCGLGOUseBuildCache GOUseBuildCache}
    + * @param params on return, a pointer to the value of the option + */ + @NativeType("CGLError") + public static int CGLGetGlobalOption(@NativeType("CGLGlobalOption") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + return nCGLGetGlobalOption(pname, memAddress(params)); + } + + // --- [ CGLLockContext ] --- + + /** + * Locks a CGL rendering context. + * + *

    The function CGLLockContext blocks the thread it is on until all other threads have unlocked the same context using the function + * {@link #CGLUnlockContext UnlockContext}. You can use CGLLockContext recursively. Context-specific CGL calls by themselves do not require locking, but you can + * guarantee serial processing for a group of calls by surrounding them with CGLLockContext and CGLUnlockContext. Keep in mind that calls from the OpenGL + * API (the API provided by the Architecture Review Board) require locking.

    + * + *

    Applications that use NSOpenGL classes with multithreading can lock contexts using the functions CGLLockContext and CGLUnlockContext. To perform + * rendering in a thread other than the main one, you can lock the context that you want to access and safely execute OpenGL commands. The locking calls + * must be placed around all OpenGL calls in all threads.

    + * + * @param context a rendering context + */ + @NativeType("CGLError") + public static int CGLLockContext(@NativeType("CGLContextObj") long context) { + long __functionAddress = Functions.LockContext; + if (CHECKS) { + check(context); + } + return callPI(context, __functionAddress); + } + + // --- [ CGLUnlockContext ] --- + + /** + * Unlocks a CGL rendering context. + * + * @param context the CGL context to unlock + */ + @NativeType("CGLError") + public static int CGLUnlockContext(@NativeType("CGLContextObj") long context) { + long __functionAddress = Functions.UnlockContext; + if (CHECKS) { + check(context); + } + return callPI(context, __functionAddress); + } + + // --- [ CGLGetVersion ] --- + + /** Unsafe version of: {@link #CGLGetVersion GetVersion} */ + public static void nCGLGetVersion(long majorvers, long minorvers) { + long __functionAddress = Functions.GetVersion; + callPPV(majorvers, minorvers, __functionAddress); + } + + /** + * Gets the major and minor version numbers of the CGL library. + * + * @param majorvers on return, points to the major version number of the CGL library + * @param minorvers on return, points to the minor version number of the CGL library + */ + public static void CGLGetVersion(@NativeType("GLint *") IntBuffer majorvers, @NativeType("GLint *") IntBuffer minorvers) { + if (CHECKS) { + check(majorvers, 1); + check(minorvers, 1); + } + nCGLGetVersion(memAddress(majorvers), memAddress(minorvers)); + } + + // --- [ CGLErrorString ] --- + + /** Unsafe version of: {@link #CGLErrorString ErrorString} */ + public static long nCGLErrorString(int error) { + long __functionAddress = Functions.ErrorString; + return callP(error, __functionAddress); + } + + /** + * Returns a string that describes the specified result code. + * + * @param error the CGL result code constant returned from a CGL function. One of:
    {@link #kCGLNoError NoError}{@link #kCGLBadAttribute BadAttribute}{@link #kCGLBadProperty BadProperty}{@link #kCGLBadPixelFormat BadPixelFormat}{@link #kCGLBadRendererInfo BadRendererInfo}{@link #kCGLBadContext BadContext}{@link #kCGLBadDrawable BadDrawable}
    {@link #kCGLBadDisplay BadDisplay}{@link #kCGLBadState BadState}{@link #kCGLBadValue BadValue}{@link #kCGLBadMatch BadMatch}{@link #kCGLBadEnumeration BadEnumeration}{@link #kCGLBadOffScreen BadOffScreen}{@link #kCGLBadFullScreen BadFullScreen}
    {@link #kCGLBadWindow BadWindow}{@link #kCGLBadAddress BadAddress}{@link #kCGLBadCodeModule BadCodeModule}{@link #kCGLBadAlloc BadAlloc}{@link #kCGLBadConnection BadConnection}
    + */ + @Nullable + @NativeType("char const *") + public static String CGLErrorString(@NativeType("CGLError") int error) { + long __result = nCGLErrorString(error); + return memASCIISafe(__result); + } + + /** Array version of: {@link #CGLChoosePixelFormat ChoosePixelFormat} */ + @NativeType("CGLError") + public static int CGLChoosePixelFormat(@NativeType("CGLPixelFormatAttribute const *") int[] attribs, @NativeType("CGLPixelFormatObj *") PointerBuffer pix, @NativeType("GLint *") int[] npix) { + long __functionAddress = Functions.ChoosePixelFormat; + if (CHECKS) { + checkNT(attribs); + check(pix, 1); + check(npix, 1); + } + return callPPPI(attribs, memAddress(pix), npix, __functionAddress); + } + + /** Array version of: {@link #CGLDescribePixelFormat DescribePixelFormat} */ + @NativeType("CGLError") + public static int CGLDescribePixelFormat(@NativeType("CGLPixelFormatObj") long pix, @NativeType("GLint") int pix_num, @NativeType("CGLPixelFormatAttribute") int attrib, @NativeType("GLint *") int[] value) { + long __functionAddress = Functions.DescribePixelFormat; + if (CHECKS) { + check(pix); + check(value, 1); + } + return callPPI(pix, pix_num, attrib, value, __functionAddress); + } + + /** Array version of: {@link #CGLQueryRendererInfo QueryRendererInfo} */ + @NativeType("CGLError") + public static int CGLQueryRendererInfo(@NativeType("GLuint") int display_mask, @NativeType("CGLRendererInfoObj *") PointerBuffer rend, @NativeType("GLint *") int[] nrend) { + long __functionAddress = Functions.QueryRendererInfo; + if (CHECKS) { + check(rend, 1); + check(nrend, 1); + } + return callPPI(display_mask, memAddress(rend), nrend, __functionAddress); + } + + /** Array version of: {@link #CGLDescribeRenderer DescribeRenderer} */ + @NativeType("CGLError") + public static int CGLDescribeRenderer(@NativeType("CGLRendererInfoObj") long rend, @NativeType("GLint") int rend_num, @NativeType("CGLRendererProperty") int prop, @NativeType("GLint *") int[] value) { + long __functionAddress = Functions.DescribeRenderer; + if (CHECKS) { + check(rend); + check(value, 1); + } + return callPPI(rend, rend_num, prop, value, __functionAddress); + } + + /** Array version of: {@link #CGLDescribePBuffer DescribePBuffer} */ + @NativeType("CGLError") + public static int CGLDescribePBuffer(@NativeType("CGLPBufferObj") long obj, @NativeType("GLsizei *") int[] width, @NativeType("GLsizei *") int[] height, @NativeType("GLenum *") int[] target, @NativeType("GLenum *") int[] internalFormat, @NativeType("GLint *") int[] mipmap) { + long __functionAddress = Functions.DescribePBuffer; + if (CHECKS) { + check(obj); + check(width, 1); + check(height, 1); + check(target, 1); + check(internalFormat, 1); + check(mipmap, 1); + } + return callPPPPPPI(obj, width, height, target, internalFormat, mipmap, __functionAddress); + } + + /** Array version of: {@link #CGLGetOffScreen GetOffScreen} */ + @NativeType("CGLError") + public static int CGLGetOffScreen(@NativeType("CGLContextObj") long ctx, @NativeType("GLsizei *") int[] width, @NativeType("GLsizei *") int[] height, @NativeType("GLint *") int[] rowbytes, @NativeType("void **") PointerBuffer baseaddr) { + long __functionAddress = Functions.GetOffScreen; + if (CHECKS) { + check(ctx); + check(width, 1); + check(height, 1); + check(rowbytes, 1); + check(baseaddr, 1); + } + return callPPPPPI(ctx, width, height, rowbytes, memAddress(baseaddr), __functionAddress); + } + + /** Array version of: {@link #CGLGetPBuffer GetPBuffer} */ + @NativeType("CGLError") + public static int CGLGetPBuffer(@NativeType("CGLContextObj") long ctx, @NativeType("CGLPBufferObj *") PointerBuffer pbuffer, @NativeType("GLenum *") int[] face, @NativeType("GLint *") int[] level, @NativeType("GLint *") int[] screen) { + long __functionAddress = Functions.GetPBuffer; + if (CHECKS) { + check(ctx); + check(pbuffer, 1); + check(face, 1); + check(level, 1); + check(screen, 1); + } + return callPPPPPI(ctx, memAddress(pbuffer), face, level, screen, __functionAddress); + } + + /** Array version of: {@link #CGLIsEnabled IsEnabled} */ + @NativeType("CGLError") + public static int CGLIsEnabled(@NativeType("CGLContextObj") long ctx, @NativeType("CGLContextEnable") int pname, @NativeType("GLint *") int[] enable) { + long __functionAddress = Functions.IsEnabled; + if (CHECKS) { + check(ctx); + check(enable, 1); + } + return callPPI(ctx, pname, enable, __functionAddress); + } + + /** Array version of: {@link #CGLSetParameter SetParameter} */ + @NativeType("CGLError") + public static int CGLSetParameter(@NativeType("CGLContextObj") long ctx, @NativeType("CGLContextParameter") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = Functions.SetParameter; + if (CHECKS) { + check(ctx); + check(params, 1); + } + return callPPI(ctx, pname, params, __functionAddress); + } + + /** Array version of: {@link #CGLGetParameter GetParameter} */ + @NativeType("CGLError") + public static int CGLGetParameter(@NativeType("CGLContextObj") long ctx, @NativeType("CGLContextParameter") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = Functions.GetParameter; + if (CHECKS) { + check(ctx); + check(params, 1); + } + return callPPI(ctx, pname, params, __functionAddress); + } + + /** Array version of: {@link #CGLGetVirtualScreen GetVirtualScreen} */ + @NativeType("CGLError") + public static int CGLGetVirtualScreen(@NativeType("CGLContextObj") long ctx, @NativeType("GLint *") int[] screen) { + long __functionAddress = Functions.GetVirtualScreen; + if (CHECKS) { + check(ctx); + check(screen, 1); + } + return callPPI(ctx, screen, __functionAddress); + } + + /** Array version of: {@link #CGLSetGlobalOption SetGlobalOption} */ + @NativeType("CGLError") + public static int CGLSetGlobalOption(@NativeType("CGLGlobalOption") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = Functions.SetGlobalOption; + if (CHECKS) { + check(params, 1); + } + return callPI(pname, params, __functionAddress); + } + + /** Array version of: {@link #CGLGetGlobalOption GetGlobalOption} */ + @NativeType("CGLError") + public static int CGLGetGlobalOption(@NativeType("CGLGlobalOption") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = Functions.GetGlobalOption; + if (CHECKS) { + check(params, 1); + } + return callPI(pname, params, __functionAddress); + } + + /** Array version of: {@link #CGLGetVersion GetVersion} */ + public static void CGLGetVersion(@NativeType("GLint *") int[] majorvers, @NativeType("GLint *") int[] minorvers) { + long __functionAddress = Functions.GetVersion; + if (CHECKS) { + check(majorvers, 1); + check(minorvers, 1); + } + callPPV(majorvers, minorvers, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Context.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Context.java new file mode 100644 index 000000000..15978e140 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Context.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2011 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.opengl; + +import org.lwjgl.LWJGLException; + +/** + * @author Spasi + * @since 14/5/2011 + */ +interface Context { + + boolean isCurrent() throws LWJGLException; + + void makeCurrent() throws LWJGLException; + + void releaseCurrent() throws LWJGLException; + + void releaseDrawable() throws LWJGLException; + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextAttribs.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextAttribs.java new file mode 100644 index 000000000..977d60430 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextAttribs.java @@ -0,0 +1,476 @@ +/* + * Copyright (c) 2002-2014 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.opengl; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLUtil; + +import java.nio.IntBuffer; +import java.util.LinkedHashMap; +import java.util.Map.Entry; + +/** + * This class represents the context attributes passed to CreateContextAttribs of the ARB_create_context extension. + *

    + * The attributes supported are described in the following extensions:
    + *

    + *

    + * Use of this class is optional. If an OpenGL context is created without passing an instance of this class + * (or ARB_create_context is not supported), the old context creation code will be used. Support for debug and forward + * compatible mobes is not guaranteed by the OpenGL implementation. Developers may encounter debug contexts being the same + * as non-debug contexts or forward compatible contexts having support for deprecated functionality. + *

    + * If the {@link #CONTEXT_FORWARD_COMPATIBLE_BIT_ARB} flag is used, LWJGL will not load the deprecated functionality (as defined in the OpenGL 3.0 + * specification), even if the driver exposes the corresponding entry points. + *

    + * This extension is not supported on MacOS X. However, in order to enable the GL 3.2 context on MacOS X 10.7 or newer, an instance of this class must be passed + * to LWJGL. The only valid configuration is ContextAttribs(3, 2, CONTEXT_CORE_PROFILE_BIT_ARB), anything else will be ignored. + * + * @author spasi + */ +public final class ContextAttribs { + + // ATTRIBUTES + + public static final int CONTEXT_MAJOR_VERSION_ARB = 0x2091; + public static final int CONTEXT_MINOR_VERSION_ARB = 0x2092; + + public static final int CONTEXT_PROFILE_MASK_ARB = 0x9126, + CONTEXT_CORE_PROFILE_BIT_ARB = 0x00000001, + CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = 0x00000002, + CONTEXT_ES2_PROFILE_BIT_EXT = 0x00000004; + + public static final int CONTEXT_FLAGS_ARB = 0x2094, + CONTEXT_DEBUG_BIT_ARB = 0x0001, + CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = 0x0002, + CONTEXT_ROBUST_ACCESS_BIT_ARB = 0x00000004, + CONTEXT_RESET_ISOLATION_BIT_ARB = 0x00000008; + + public static final int CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB = 0x8256, + NO_RESET_NOTIFICATION_ARB = 0x8261, + LOSE_CONTEXT_ON_RESET_ARB = 0x8252; + + public static final int CONTEXT_RELEASE_BEHABIOR_ARB = 0x2097, + CONTEXT_RELEASE_BEHAVIOR_NONE_ARB = 0x0000, + CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB = 0x2098; + + public static final int CONTEXT_LAYER_PLANE_ARB = 0x2093; // WGL-only + + // STATE + + private int majorVersion; + private int minorVersion; + + private int profileMask; + private int contextFlags; + + private int contextResetNotificationStrategy = NO_RESET_NOTIFICATION_ARB; + private int contextReleaseBehavior = CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB; + + private int layerPlane; + + // CONSTRUCTORS + + /** Creates the default ContextAttribs instance. No special attributes will be used when creating the OpenGL context. */ + public ContextAttribs() { + this(1, 0); + } + + /** Creates a ContextAttribs instance for the given OpenGL version. */ + public ContextAttribs(int majorVersion, int minorVersion) { + this(majorVersion, minorVersion, 0, 0); + } + + /** + * Creates a new ContextAttribs instance with the given attributes. + * + * @param majorVersion the major OpenGL version + * @param minorVersion the minor OpenGL version + * @param profileMask the context profile mask. One of:
    {@link #CONTEXT_CORE_PROFILE_BIT_ARB}, {@link #CONTEXT_FORWARD_COMPATIBLE_BIT_ARB}, {@link #CONTEXT_ES2_PROFILE_BIT_EXT} + */ + public ContextAttribs(int majorVersion, int minorVersion, int profileMask) { + this(majorVersion, minorVersion, 0, profileMask); + } + + /** + * Creates a new ContextAttribs instance with the given attributes. + * + * @param majorVersion the major OpenGL version + * @param minorVersion the minor OpenGL version + * @param profileMask the context profile mask. One of:
    {@link #CONTEXT_CORE_PROFILE_BIT_ARB}, {@link #CONTEXT_FORWARD_COMPATIBLE_BIT_ARB}, {@link #CONTEXT_ES2_PROFILE_BIT_EXT} + * @param contextFlags the context flags, a bitfield value. One or more of:
    {@link #CONTEXT_DEBUG_BIT_ARB}, {@link #CONTEXT_FORWARD_COMPATIBLE_BIT_ARB}, {@link #CONTEXT_ROBUST_ACCESS_BIT_ARB}, {@link #CONTEXT_RESET_ISOLATION_BIT_ARB} + */ + public ContextAttribs(int majorVersion, int minorVersion, int profileMask, int contextFlags) { + if ( majorVersion < 0 || 4 < majorVersion || + minorVersion < 0 || + (majorVersion == 4 && 5 < minorVersion) || + (majorVersion == 3 && 3 < minorVersion) || + (majorVersion == 2 && 1 < minorVersion) || + (majorVersion == 1 && 5 < minorVersion) ) + throw new IllegalArgumentException("Invalid OpenGL version specified: " + majorVersion + '.' + minorVersion); + + if ( LWJGLUtil.CHECKS ) { + if ( 1 < Integer.bitCount(profileMask) || CONTEXT_ES2_PROFILE_BIT_EXT < profileMask ) + throw new IllegalArgumentException("Invalid profile mask specified: " + Integer.toBinaryString(profileMask)); + + if ( 0xF < contextFlags ) + throw new IllegalArgumentException("Invalid context flags specified: " + Integer.toBinaryString(profileMask)); + } + + this.majorVersion = majorVersion; + this.minorVersion = minorVersion; + + this.profileMask = profileMask; + this.contextFlags = contextFlags; + } + + // Copy constructor + private ContextAttribs(ContextAttribs other) { + this.majorVersion = other.majorVersion; + this.minorVersion = other.minorVersion; + + this.profileMask = other.profileMask; + this.contextFlags = other.contextFlags; + + this.contextResetNotificationStrategy = other.contextResetNotificationStrategy; + this.contextReleaseBehavior = other.contextReleaseBehavior; + + this.layerPlane = other.layerPlane; + } + + // GETTERS + + /** Returns the {@link #CONTEXT_MAJOR_VERSION_ARB} value. */ + public int getMajorVersion() { + return majorVersion; + } + + /** Returns the {@link #CONTEXT_MINOR_VERSION_ARB} value. */ + public int getMinorVersion() { + return minorVersion; + } + + /** Returns the {@link #CONTEXT_PROFILE_MASK_ARB} value. */ + public int getProfileMask() { + return profileMask; + } + + private boolean hasMask(int mask) { + return profileMask == mask; + } + + /** Returns true if the {@link #CONTEXT_CORE_PROFILE_BIT_ARB} has been set. */ + public boolean isProfileCore() { + return hasMask(CONTEXT_CORE_PROFILE_BIT_ARB); + } + + /** Returns true if the {@link #CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB} has been set. */ + public boolean isProfileCompatibility() { + return hasMask(CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB); + } + + /** Returns true if the {@link #CONTEXT_ES2_PROFILE_BIT_EXT} has been set. */ + public boolean isProfileES() { + return hasMask(CONTEXT_ES2_PROFILE_BIT_EXT); + } + + /** Returns the {@link #CONTEXT_FLAGS_ARB} value. */ + public int getContextFlags() { + return contextFlags; + } + + private boolean hasFlag(int flag) { + return (contextFlags & flag) != 0; + } + + /** Returns true if the {@link #CONTEXT_DEBUG_BIT_ARB} has been set. */ + public boolean isDebug() { + return hasFlag(CONTEXT_DEBUG_BIT_ARB); + } + + /** Returns true if the {@link #CONTEXT_FORWARD_COMPATIBLE_BIT_ARB} has been set. */ + public boolean isForwardCompatible() { + return hasFlag(CONTEXT_FORWARD_COMPATIBLE_BIT_ARB); + } + + /** Returns true if the {@link #CONTEXT_ROBUST_ACCESS_BIT_ARB} has been set. */ + public boolean isRobustAccess() { return hasFlag(CONTEXT_ROBUST_ACCESS_BIT_ARB); } + + /** Returns true if the {@link #CONTEXT_RESET_ISOLATION_BIT_ARB} has been set. */ + public boolean isContextResetIsolation() { + return hasFlag(CONTEXT_RESET_ISOLATION_BIT_ARB); + } + + /** Returns the {@link #CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB} value. */ + public int getContextResetNotificationStrategy() { + return contextResetNotificationStrategy; + } + + /** + * Returns true if the {@link #CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB} has been set to {@link #LOSE_CONTEXT_ON_RESET_ARB}. + * + * @deprecated use {@link #getContextResetNotificationStrategy} instead + */ + public boolean isLoseContextOnReset() { return contextResetNotificationStrategy == LOSE_CONTEXT_ON_RESET_ARB; } + + /** Returns the {@link #CONTEXT_RELEASE_BEHABIOR_ARB} value. */ + public int getContextReleaseBehavior() { + return contextReleaseBehavior; + } + + /** Returns the {@link #CONTEXT_LAYER_PLANE_ARB} value. */ + public int getLayerPlane() { + return layerPlane; + } + + // CHAIN CONFIGURATION PATTERN + + private ContextAttribs toggleMask(int mask, boolean value) { + if ( value == hasMask(mask) ) + return this; + + ContextAttribs attribs = new ContextAttribs(this); + attribs.profileMask = value ? mask : 0; + return attribs; + } + + /** + * Returns a new {@code ContextAttribs} instance with the {@link #CONTEXT_CORE_PROFILE_BIT_ARB} bit in {@link #CONTEXT_PROFILE_MASK_ARB} set to the given value. + * If {@code profileCore} is true, all other bits in the mask are cleared. + */ + public ContextAttribs withProfileCore(boolean profileCore) { + if ( majorVersion < 3 || (majorVersion == 3 && minorVersion < 2) ) + throw new IllegalArgumentException("Profiles are only supported on OpenGL version 3.2 or higher."); + + return toggleMask(CONTEXT_CORE_PROFILE_BIT_ARB, profileCore); + } + + /** + * Returns a new {@code ContextAttribs} instance with the {@link #CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB} bit in {@link #CONTEXT_PROFILE_MASK_ARB} set to the given value. + * If {@code profileCompatibility} is true, all other bits in the mask are cleared. + */ + public ContextAttribs withProfileCompatibility(boolean profileCompatibility) { + if ( majorVersion < 3 || (majorVersion == 3 && minorVersion < 2) ) + throw new IllegalArgumentException("Profiles are only supported on OpenGL version 3.2 or higher."); + + return toggleMask(CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, profileCompatibility); + } + + /** + * Returns a new {@code ContextAttribs} instance with the {@link #CONTEXT_ES2_PROFILE_BIT_EXT} bit in {@link #CONTEXT_PROFILE_MASK_ARB} set to the given value. + * If {@code profileES} is true, all other bits in the mask are cleared. + */ + public ContextAttribs withProfileES(boolean profileES) { + if ( !(majorVersion == 2 && minorVersion == 0) ) + throw new IllegalArgumentException("The OpenGL ES profile is only supported on OpenGL version 2.0."); + + return toggleMask(CONTEXT_ES2_PROFILE_BIT_EXT, profileES); + } + + private ContextAttribs toggleFlag(int flag, boolean value) { + if ( value == hasFlag(flag) ) + return this; + + ContextAttribs attribs = new ContextAttribs(this); + attribs.contextFlags ^= flag; // toggle bit + return attribs; + } + + /** Returns a new {@code ContextAttribs} instance with the {@link #CONTEXT_DEBUG_BIT_ARB} bit in {@link #CONTEXT_FLAGS_ARB} set to the given value. */ + public ContextAttribs withDebug(boolean debug) { return toggleFlag(CONTEXT_DEBUG_BIT_ARB, debug); } + + /** Returns a new {@code ContextAttribs} instance with the {@link #CONTEXT_FORWARD_COMPATIBLE_BIT_ARB} bit in {@link #CONTEXT_FLAGS_ARB} set to the given value. */ + public ContextAttribs withForwardCompatible(boolean forwardCompatible) { return toggleFlag(CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, forwardCompatible); } + + /** Returns a new {@code ContextAttribs} instance with the {@link #CONTEXT_ROBUST_ACCESS_BIT_ARB} bit in {@link #CONTEXT_FLAGS_ARB} set to the given value. */ + public ContextAttribs withRobustAccess(boolean robustAccess) { return toggleFlag(CONTEXT_ROBUST_ACCESS_BIT_ARB, robustAccess); } + + /** Returns a new {@code ContextAttribs} instance with the {@link #CONTEXT_RESET_ISOLATION_BIT_ARB} bit in {@link #CONTEXT_FLAGS_ARB} set to the given value. */ + public ContextAttribs withContextResetIsolation(boolean contextResetIsolation) { return toggleFlag(CONTEXT_RESET_ISOLATION_BIT_ARB, contextResetIsolation); } + + /** + * Returns a ContextAttribs instance with {@link #CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB} set to the given strategy. The default context reset notification + * strategy is {@link #NO_RESET_NOTIFICATION_ARB}. + * + * @param strategy the context reset notification strategy. One of:
    {@link #NO_RESET_NOTIFICATION_ARB}, {@link #LOSE_CONTEXT_ON_RESET_ARB} + * + * @return the new ContextAttribs + */ + public ContextAttribs withResetNotificationStrategy(int strategy) { + if ( strategy == contextResetNotificationStrategy ) + return this; + + if ( LWJGLUtil.CHECKS && !(strategy == NO_RESET_NOTIFICATION_ARB || strategy == LOSE_CONTEXT_ON_RESET_ARB) ) + throw new IllegalArgumentException("Invalid context reset notification strategy specified: 0x" + LWJGLUtil.toHexString(strategy)); + + ContextAttribs attribs = new ContextAttribs(this); + attribs.contextResetNotificationStrategy = strategy; + return attribs; + } + + /** + * Returns a ContextAttribs instance with {@link #CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB} set to {@link #LOSE_CONTEXT_ON_RESET_ARB} if the parameter is + * true or to {@link #NO_RESET_NOTIFICATION_ARB} if the parameter is false. + * + * @param loseContextOnReset the context reset notification strategy + * + * @return the new ContextAttribs + * + * @deprecated use {@link #withResetNotificationStrategy} instead + */ + public ContextAttribs withLoseContextOnReset(boolean loseContextOnReset) { + return withResetNotificationStrategy(loseContextOnReset ? LOSE_CONTEXT_ON_RESET_ARB : NO_RESET_NOTIFICATION_ARB); + } + + /** + * Returns a ContextAttribs instance with {@link #CONTEXT_RELEASE_BEHABIOR_ARB} set to the given behavior. The default context release behavior is + * {@link #CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB}. + * + * @param behavior the context release behavior. One of:
    {@link #CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB}, {@link #CONTEXT_RELEASE_BEHAVIOR_NONE_ARB} + * + * @return the new ContextAttribs + */ + public ContextAttribs withContextReleaseBehavior(int behavior) { + if ( behavior == contextReleaseBehavior ) + return this; + + if ( LWJGLUtil.CHECKS && !(behavior == CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB || behavior == CONTEXT_RELEASE_BEHAVIOR_NONE_ARB) ) + throw new IllegalArgumentException("Invalid context release behavior specified: 0x" + LWJGLUtil.toHexString(behavior)); + + ContextAttribs attribs = new ContextAttribs(this); + attribs.contextReleaseBehavior = behavior; + return attribs; + } + + /** Returns a new {@code ContextAttribs} instance with {@link #CONTEXT_LAYER_PLANE_ARB} set to the given value. */ + public ContextAttribs withLayer(int layerPlane) { + if ( LWJGLUtil.getPlatform() != LWJGLUtil.PLATFORM_WINDOWS ) + throw new IllegalArgumentException("The CONTEXT_LAYER_PLANE_ARB attribute is supported only on the Windows platform."); + + if ( layerPlane == this.layerPlane ) + return this; + + if ( layerPlane < 0 ) + throw new IllegalArgumentException("Invalid layer plane specified: " + layerPlane); + + ContextAttribs attribs = new ContextAttribs(this); + attribs.layerPlane = layerPlane; + return attribs; + } + + IntBuffer getAttribList() { + if ( LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_MACOSX ) + return null; + + LinkedHashMap map = new LinkedHashMap(8); + + if ( !(majorVersion == 1 && minorVersion == 0) ) { + map.put(CONTEXT_MAJOR_VERSION_ARB, majorVersion); + map.put(CONTEXT_MINOR_VERSION_ARB, minorVersion); + } + + if ( contextFlags != 0 ) + map.put(CONTEXT_FLAGS_ARB, contextFlags); + + if ( profileMask != 0 ) + map.put(CONTEXT_PROFILE_MASK_ARB, profileMask); + + if ( contextResetNotificationStrategy != NO_RESET_NOTIFICATION_ARB ) + map.put(CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB, contextResetNotificationStrategy); + + if ( contextReleaseBehavior != CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB ) + map.put(CONTEXT_RELEASE_BEHABIOR_ARB, contextReleaseBehavior); + + if ( layerPlane != 0 ) + map.put(CONTEXT_LAYER_PLANE_ARB, layerPlane); + + if ( map.isEmpty() ) + return null; + + IntBuffer attribs = BufferUtils.createIntBuffer((map.size() * 2) + 1); + for ( Entry attrib : map.entrySet() ) { + attribs + .put(attrib.getKey()) + .put(attrib.getValue()); + } + attribs.put(0); + attribs.rewind(); + return attribs; + } + + public String toString() { + StringBuilder sb = new StringBuilder(32); + + sb.append("ContextAttribs:"); + sb.append(" Version=").append(majorVersion).append('.').append(minorVersion); + + if ( profileMask != 0 ) { + sb.append(", Profile="); + if ( hasMask(CONTEXT_CORE_PROFILE_BIT_ARB) ) + sb.append("CORE"); + else if ( hasMask(CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) ) + sb.append("COMPATIBLITY"); + else if ( hasMask(CONTEXT_ES2_PROFILE_BIT_EXT) ) + sb.append("ES2"); + else + sb.append("*unknown*"); + } + + if ( contextFlags != 0 ) { + if ( hasFlag(CONTEXT_DEBUG_BIT_ARB) ) + sb.append(", DEBUG"); + if ( hasFlag(CONTEXT_FORWARD_COMPATIBLE_BIT_ARB) ) + sb.append(", FORWARD_COMPATIBLE"); + if ( hasFlag(CONTEXT_ROBUST_ACCESS_BIT_ARB) ) + sb.append(", ROBUST_ACCESS"); + if ( hasFlag(CONTEXT_RESET_ISOLATION_BIT_ARB) ) + sb.append(", RESET_ISOLATION"); + } + + if ( contextResetNotificationStrategy != NO_RESET_NOTIFICATION_ARB ) + sb.append(", LOSE_CONTEXT_ON_RESET"); + if ( contextReleaseBehavior != CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB ) + sb.append(", RELEASE_BEHAVIOR_NONE"); + + if ( layerPlane != 0 ) + sb.append(", Layer=").append(layerPlane); + + return sb.toString(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextCapabilities.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextCapabilities.java new file mode 100644 index 000000000..e67144e96 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextCapabilities.java @@ -0,0 +1,409 @@ +package org.lwjgl.opengl; + +import java.lang.reflect.Field; + +public class ContextCapabilities { + + GLCapabilities cap = GL.createCapabilities(); + + public ContextCapabilities() { + + Field[] fields = GLCapabilities.class.getFields(); + + try { + for ( Field field : fields ) { + + String name = field.getName(); + + if (name.startsWith("GL_") || name.startsWith("OpenGL")) { + + boolean value = field.getBoolean(cap); + + try { + Field f = this.getClass().getField(name); + f.setBoolean(this, value); + } catch (Exception e) { + } + } + if (name.equals("glGetBufferSubData") || name.equals("glBufferSubData")) { + Field f = this.getClass().getField(name); + f.setLong(this, field.getLong(cap)); + } + } + } catch (Exception e) { + System.out.println(e); + } + } + + public boolean GL_AMD_blend_minmax_factor; + public boolean GL_AMD_conservative_depth; + public boolean GL_AMD_debug_output; + public boolean GL_AMD_depth_clamp_separate; + public boolean GL_AMD_draw_buffers_blend; + public boolean GL_AMD_interleaved_elements; + public boolean GL_AMD_multi_draw_indirect; + public boolean GL_AMD_name_gen_delete; + public boolean GL_AMD_performance_monitor; + public boolean GL_AMD_pinned_memory; + public boolean GL_AMD_query_buffer_object; + public boolean GL_AMD_sample_positions; + public boolean GL_AMD_seamless_cubemap_per_texture; + public boolean GL_AMD_shader_atomic_counter_ops; + public boolean GL_AMD_shader_stencil_export; + public boolean GL_AMD_shader_trinary_minmax; + public boolean GL_AMD_sparse_texture; + public boolean GL_AMD_stencil_operation_extended; + public boolean GL_AMD_texture_texture4; + public boolean GL_AMD_transform_feedback3_lines_triangles; + public boolean GL_AMD_vertex_shader_layer; + public boolean GL_AMD_vertex_shader_tessellator; + public boolean GL_AMD_vertex_shader_viewport_index; + public boolean GL_APPLE_aux_depth_stencil; + public boolean GL_APPLE_client_storage; + public boolean GL_APPLE_element_array; + public boolean GL_APPLE_fence; + public boolean GL_APPLE_float_pixels; + public boolean GL_APPLE_flush_buffer_range; + public boolean GL_APPLE_object_purgeable; + public boolean GL_APPLE_packed_pixels; + public boolean GL_APPLE_rgb_422; + public boolean GL_APPLE_row_bytes; + public boolean GL_APPLE_texture_range; + public boolean GL_APPLE_vertex_array_object; + public boolean GL_APPLE_vertex_array_range; + public boolean GL_APPLE_vertex_program_evaluators; + public boolean GL_APPLE_ycbcr_422; + public boolean GL_ARB_ES2_compatibility; + public boolean GL_ARB_ES3_compatibility; + public boolean GL_ARB_arrays_of_arrays; + public boolean GL_ARB_base_instance; + public boolean GL_ARB_bindless_texture; + public boolean GL_ARB_blend_func_extended; + public boolean GL_ARB_buffer_storage; + public boolean GL_ARB_cl_event; + public boolean GL_ARB_clear_buffer_object; + public boolean GL_ARB_clear_texture; + public boolean GL_ARB_color_buffer_float; + public boolean GL_ARB_compatibility; + public boolean GL_ARB_compressed_texture_pixel_storage; + public boolean GL_ARB_compute_shader; + public boolean GL_ARB_compute_variable_group_size; + public boolean GL_ARB_conservative_depth; + public boolean GL_ARB_copy_buffer; + public boolean GL_ARB_copy_image; + public boolean GL_ARB_debug_output; + public boolean GL_ARB_depth_buffer_float; + public boolean GL_ARB_depth_clamp; + public boolean GL_ARB_depth_texture; + public boolean GL_ARB_draw_buffers; + public boolean GL_ARB_draw_buffers_blend; + public boolean GL_ARB_draw_elements_base_vertex; + public boolean GL_ARB_draw_indirect; + public boolean GL_ARB_draw_instanced; + public boolean GL_ARB_enhanced_layouts; + public boolean GL_ARB_explicit_attrib_location; + public boolean GL_ARB_explicit_uniform_location; + public boolean GL_ARB_fragment_coord_conventions; + public boolean GL_ARB_fragment_layer_viewport; + public boolean GL_ARB_fragment_program; + public boolean GL_ARB_fragment_program_shadow; + public boolean GL_ARB_fragment_shader; + public boolean GL_ARB_framebuffer_no_attachments; + public boolean GL_ARB_framebuffer_object; + public boolean GL_ARB_framebuffer_sRGB; + public boolean GL_ARB_geometry_shader4; + public boolean GL_ARB_get_program_binary; + public boolean GL_ARB_gpu_shader5; + public boolean GL_ARB_gpu_shader_fp64; + public boolean GL_ARB_half_float_pixel; + public boolean GL_ARB_half_float_vertex; + public boolean GL_ARB_imaging; + public boolean GL_ARB_indirect_parameters; + public boolean GL_ARB_instanced_arrays; + public boolean GL_ARB_internalformat_query; + public boolean GL_ARB_internalformat_query2; + public boolean GL_ARB_invalidate_subdata; + public boolean GL_ARB_map_buffer_alignment; + public boolean GL_ARB_map_buffer_range; + public boolean GL_ARB_matrix_palette; + public boolean GL_ARB_multi_bind; + public boolean GL_ARB_multi_draw_indirect; + public boolean GL_ARB_multisample; + public boolean GL_ARB_multitexture; + public boolean GL_ARB_occlusion_query; + public boolean GL_ARB_occlusion_query2; + public boolean GL_ARB_pixel_buffer_object; + public boolean GL_ARB_point_parameters; + public boolean GL_ARB_point_sprite; + public boolean GL_ARB_program_interface_query; + public boolean GL_ARB_provoking_vertex; + public boolean GL_ARB_query_buffer_object; + public boolean GL_ARB_robust_buffer_access_behavior; + public boolean GL_ARB_robustness; + public boolean GL_ARB_robustness_isolation; + public boolean GL_ARB_sample_shading; + public boolean GL_ARB_sampler_objects; + public boolean GL_ARB_seamless_cube_map; + public boolean GL_ARB_seamless_cubemap_per_texture; + public boolean GL_ARB_separate_shader_objects; + public boolean GL_ARB_shader_atomic_counters; + public boolean GL_ARB_shader_bit_encoding; + public boolean GL_ARB_shader_draw_parameters; + public boolean GL_ARB_shader_group_vote; + public boolean GL_ARB_shader_image_load_store; + public boolean GL_ARB_shader_image_size; + public boolean GL_ARB_shader_objects; + public boolean GL_ARB_shader_precision; + public boolean GL_ARB_shader_stencil_export; + public boolean GL_ARB_shader_storage_buffer_object; + public boolean GL_ARB_shader_subroutine; + public boolean GL_ARB_shader_texture_lod; + public boolean GL_ARB_shading_language_100; + public boolean GL_ARB_shading_language_420pack; + public boolean GL_ARB_shading_language_include; + public boolean GL_ARB_shading_language_packing; + public boolean GL_ARB_shadow; + public boolean GL_ARB_shadow_ambient; + public boolean GL_ARB_sparse_texture; + public boolean GL_ARB_stencil_texturing; + public boolean GL_ARB_sync; + public boolean GL_ARB_tessellation_shader; + public boolean GL_ARB_texture_border_clamp; + public boolean GL_ARB_texture_buffer_object; + public boolean GL_ARB_texture_buffer_object_rgb32; + public boolean GL_ARB_texture_buffer_range; + public boolean GL_ARB_texture_compression; + public boolean GL_ARB_texture_compression_bptc; + public boolean GL_ARB_texture_compression_rgtc; + public boolean GL_ARB_texture_cube_map; + public boolean GL_ARB_texture_cube_map_array; + public boolean GL_ARB_texture_env_add; + public boolean GL_ARB_texture_env_combine; + public boolean GL_ARB_texture_env_crossbar; + public boolean GL_ARB_texture_env_dot3; + public boolean GL_ARB_texture_float;; + public boolean GL_ARB_texture_gather; + public boolean GL_ARB_texture_mirror_clamp_to_edge; + public boolean GL_ARB_texture_mirrored_repeat; + public boolean GL_ARB_texture_multisample; + public boolean GL_ARB_texture_non_power_of_two; + public boolean GL_ARB_texture_query_levels; + public boolean GL_ARB_texture_query_lod; + public boolean GL_ARB_texture_rectangle; + public boolean GL_ARB_texture_rg; + public boolean GL_ARB_texture_rgb10_a2ui; + public boolean GL_ARB_texture_stencil8; + public boolean GL_ARB_texture_storage; + public boolean GL_ARB_texture_storage_multisample; + public boolean GL_ARB_texture_swizzle; + public boolean GL_ARB_texture_view; + public boolean GL_ARB_timer_query; + public boolean GL_ARB_transform_feedback2; + public boolean GL_ARB_transform_feedback3; + public boolean GL_ARB_transform_feedback_instanced; + public boolean GL_ARB_transpose_matrix; + public boolean GL_ARB_uniform_buffer_object; + public boolean GL_ARB_vertex_array_bgra; + public boolean GL_ARB_vertex_array_object; + public boolean GL_ARB_vertex_attrib_64bit; + public boolean GL_ARB_vertex_attrib_binding; + public boolean GL_ARB_vertex_blend; + public boolean GL_ARB_vertex_buffer_object; + public boolean GL_ARB_vertex_program; + public boolean GL_ARB_vertex_shader; + public boolean GL_ARB_vertex_type_10f_11f_11f_rev; + public boolean GL_ARB_vertex_type_2_10_10_10_rev; + public boolean GL_ARB_viewport_array; + public boolean GL_ARB_window_pos; + public boolean GL_ATI_draw_buffers; + public boolean GL_ATI_element_array; + public boolean GL_ATI_envmap_bumpmap; + public boolean GL_ATI_fragment_shader; + public boolean GL_ATI_map_object_buffer; + public boolean GL_ATI_meminfo; + public boolean GL_ATI_pn_triangles; + public boolean GL_ATI_separate_stencil; + public boolean GL_ATI_shader_texture_lod; + public boolean GL_ATI_text_fragment_shader; + public boolean GL_ATI_texture_compression_3dc; + public boolean GL_ATI_texture_env_combine3; + public boolean GL_ATI_texture_float; + public boolean GL_ATI_texture_mirror_once; + public boolean GL_ATI_vertex_array_object; + public boolean GL_ATI_vertex_attrib_array_object; + public boolean GL_ATI_vertex_streams; + public boolean GL_EXT_abgr; + public boolean GL_EXT_bgra; + public boolean GL_EXT_bindable_uniform; + public boolean GL_EXT_blend_color; + public boolean GL_EXT_blend_equation_separate; + public boolean GL_EXT_blend_func_separate; + public boolean GL_EXT_blend_minmax; + public boolean GL_EXT_blend_subtract; + public boolean GL_EXT_Cg_shader; + public boolean GL_EXT_compiled_vertex_array; + public boolean GL_EXT_depth_bounds_test; + public boolean GL_EXT_direct_state_access; + public boolean GL_EXT_draw_buffers2; + public boolean GL_EXT_draw_instanced; + public boolean GL_EXT_draw_range_elements; + public boolean GL_EXT_fog_coord; + public boolean GL_EXT_framebuffer_blit; + public boolean GL_EXT_framebuffer_multisample; + public boolean GL_EXT_framebuffer_multisample_blit_scaled; + public boolean GL_EXT_framebuffer_object; + public boolean GL_EXT_framebuffer_sRGB; + public boolean GL_EXT_geometry_shader4; + public boolean GL_EXT_gpu_program_parameters; + public boolean GL_EXT_gpu_shader4; + public boolean GL_EXT_multi_draw_arrays; + public boolean GL_EXT_packed_depth_stencil; + public boolean GL_EXT_packed_float; + public boolean GL_EXT_packed_pixels; + public boolean GL_EXT_paletted_texture; + public boolean GL_EXT_pixel_buffer_object; + public boolean GL_EXT_point_parameters; + public boolean GL_EXT_provoking_vertex; + public boolean GL_EXT_rescale_normal; + public boolean GL_EXT_secondary_color; + public boolean GL_EXT_separate_shader_objects; + public boolean GL_EXT_separate_specular_color; + public boolean GL_EXT_shader_image_load_store; + public boolean GL_EXT_shadow_funcs; + public boolean GL_EXT_shared_texture_palette; + public boolean GL_EXT_stencil_clear_tag; + public boolean GL_EXT_stencil_two_side; + public boolean GL_EXT_stencil_wrap; + public boolean GL_EXT_texture_3d; + public boolean GL_EXT_texture_array; + public boolean GL_EXT_texture_buffer_object; + public boolean GL_EXT_texture_compression_latc; + public boolean GL_EXT_texture_compression_rgtc; + public boolean GL_EXT_texture_compression_s3tc; + public boolean GL_EXT_texture_env_combine; + public boolean GL_EXT_texture_env_dot3; + public boolean GL_EXT_texture_filter_anisotropic; + public boolean GL_EXT_texture_integer; + public boolean GL_EXT_texture_lod_bias; + public boolean GL_EXT_texture_mirror_clamp; + public boolean GL_EXT_texture_rectangle; + public boolean GL_EXT_texture_sRGB; + public boolean GL_EXT_texture_sRGB_decode; + public boolean GL_EXT_texture_shared_exponent; + public boolean GL_EXT_texture_snorm; + public boolean GL_EXT_texture_swizzle; + public boolean GL_EXT_timer_query; + public boolean GL_EXT_transform_feedback; + public boolean GL_EXT_vertex_array_bgra; + public boolean GL_EXT_vertex_attrib_64bit; + public boolean GL_EXT_vertex_shader; + public boolean GL_EXT_vertex_weighting; + public boolean OpenGL11; + public boolean OpenGL12; + public boolean OpenGL13; + public boolean OpenGL14; + public boolean OpenGL15; + public boolean OpenGL20; + public boolean OpenGL21; + public boolean OpenGL30; + public boolean OpenGL31; + public boolean OpenGL32; + public boolean OpenGL33; + public boolean OpenGL40; + public boolean OpenGL41; + public boolean OpenGL42; + public boolean OpenGL43; + public boolean OpenGL44; + public boolean GL_GREMEDY_frame_terminator; + public boolean GL_GREMEDY_string_marker; + public boolean GL_HP_occlusion_test; + public boolean GL_IBM_rasterpos_clip; + public boolean GL_INTEL_map_texture; + public boolean GL_KHR_debug; + public boolean GL_KHR_texture_compression_astc_ldr; + public boolean GL_NVX_gpu_memory_info; + public boolean GL_NV_bindless_multi_draw_indirect; + public boolean GL_NV_bindless_texture; + public boolean GL_NV_blend_equation_advanced; + public boolean GL_NV_blend_square; + public boolean GL_NV_compute_program5; + public boolean GL_NV_conditional_render; + public boolean GL_NV_copy_depth_to_color; + public boolean GL_NV_copy_image; + public boolean GL_NV_deep_texture3D; + public boolean GL_NV_depth_buffer_float; + public boolean GL_NV_depth_clamp; + public boolean GL_NV_draw_texture; + public boolean GL_NV_evaluators; + public boolean GL_NV_explicit_multisample; + public boolean GL_NV_fence; + public boolean GL_NV_float_buffer; + public boolean GL_NV_fog_distance; + public boolean GL_NV_fragment_program; + public boolean GL_NV_fragment_program2; + public boolean GL_NV_fragment_program4; + public boolean GL_NV_fragment_program_option; + public boolean GL_NV_framebuffer_multisample_coverage; + public boolean GL_NV_geometry_program4; + public boolean GL_NV_geometry_shader4; + public boolean GL_NV_gpu_program4; + public boolean GL_NV_gpu_program5; + public boolean GL_NV_gpu_program5_mem_extended; + public boolean GL_NV_gpu_shader5; + public boolean GL_NV_half_float; + public boolean GL_NV_light_max_exponent; + public boolean GL_NV_multisample_coverage; + public boolean GL_NV_multisample_filter_hint; + public boolean GL_NV_occlusion_query; + public boolean GL_NV_packed_depth_stencil; + public boolean GL_NV_parameter_buffer_object; + public boolean GL_NV_parameter_buffer_object2; + public boolean GL_NV_path_rendering; + public boolean GL_NV_pixel_data_range; + public boolean GL_NV_point_sprite; + public boolean GL_NV_present_video; + public boolean GL_NV_primitive_restart; + public boolean GL_NV_register_combiners; + public boolean GL_NV_register_combiners2; + public boolean GL_NV_shader_atomic_counters; + public boolean GL_NV_shader_atomic_float; + public boolean GL_NV_shader_buffer_load; + public boolean GL_NV_shader_buffer_store; + public boolean GL_NV_shader_storage_buffer_object; + public boolean GL_NV_tessellation_program5; + public boolean GL_NV_texgen_reflection; + public boolean GL_NV_texture_barrier; + public boolean GL_NV_texture_compression_vtc; + public boolean GL_NV_texture_env_combine4; + public boolean GL_NV_texture_expand_normal; + public boolean GL_NV_texture_multisample; + public boolean GL_NV_texture_rectangle; + public boolean GL_NV_texture_shader; + public boolean GL_NV_texture_shader2; + public boolean GL_NV_texture_shader3; + public boolean GL_NV_transform_feedback; + public boolean GL_NV_transform_feedback2; + public boolean GL_NV_vertex_array_range; + public boolean GL_NV_vertex_array_range2; + public boolean GL_NV_vertex_attrib_integer_64bit; + public boolean GL_NV_vertex_buffer_unified_memory; + public boolean GL_NV_vertex_program; + public boolean GL_NV_vertex_program1_1; + public boolean GL_NV_vertex_program2; + public boolean GL_NV_vertex_program2_option; + public boolean GL_NV_vertex_program3; + public boolean GL_NV_vertex_program4; + public boolean GL_NV_video_capture; + public boolean GL_SGIS_generate_mipmap; + public boolean GL_SGIS_texture_lod; + public boolean GL_SUN_slice_accum; + + public long glGetBufferSubData; + public long glBufferSubData; + + public static void main(String[] arg) { + System.out.println("START!"); + new ContextCapabilities(); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextGL.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextGL.java new file mode 100644 index 000000000..ccfca7071 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/ContextGL.java @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +import static org.lwjgl.opengl.GL11.GL_NO_ERROR; +import static org.lwjgl.opengl.GL11.glGetError; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.PointerBuffer; +import org.lwjgl.Sys; +import org.lwjgl.glfw.GLFW; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +/** + *

    + * Context encapsulates an OpenGL context. + *

    + *

    + * This class is thread-safe. + * + * @author elias_naur + * @version $Revision$ + * $Id$ + */ +final class ContextGL implements Context { + + /** The current Context */ + private static final ThreadLocal current_context_local = new ThreadLocal(); + + /** Handle to the native GL rendering context */ + private final long handle; + private final PeerInfo peer_info; + + private final ContextAttribs contextAttribs; + private final boolean forwardCompatible; + + /** Whether the context has been destroyed */ + private boolean destroyed; + + private boolean destroy_requested; + + /** The thread that has this context current, or null. */ + private Thread thread; + + private boolean isCurrent; + + static { + Sys.initialize(); + } + + PeerInfo getPeerInfo() { + return peer_info; + } + + ContextAttribs getContextAttribs() { + return contextAttribs; + } + + static ContextGL getCurrentContext() { + return current_context_local.get(); + } + + ContextGL(long handle) { + this.peer_info = null; + this.contextAttribs = null; + this.forwardCompatible = false; + this.handle = handle; + System.out.println("LWJGL: ready-handle context created"); + } + + /** Create a context with the specified peer info and shared context */ + ContextGL(PeerInfo peer_info, ContextAttribs attribs, ContextGL shared_context) throws LWJGLException { + ContextGL context_lock = shared_context != null ? shared_context : this; + // If shared_context is not null, synchronize on it to make sure it is not deleted + // while this context is created. Otherwise, simply synchronize on ourself to avoid NPE + synchronized ( context_lock ) { + if ( shared_context != null && shared_context.destroyed ) + throw new IllegalArgumentException("Shared context is destroyed"); + + this.peer_info = peer_info; + this.contextAttribs = attribs; + + forwardCompatible = false; + long share = 0; + if(shared_context != null) { + share = shared_context.handle; + } + int width = Integer.parseInt(System.getProperty("window.width") == null ? "-1" : System.getProperty("window.width")); + int height = Integer.parseInt(System.getProperty("window.height") == null ? "-1" : System.getProperty("window.height")); + this.handle = GLFW.glfwCreateWindow(width, height, "Game", GLFW.glfwGetPrimaryMonitor(), share); + } + } + + /** Release the current context (if any). After this call, no context is current. */ + public void releaseCurrent() throws LWJGLException { + ContextGL current_context = getCurrentContext(); + if ( current_context != null ) { + GLFW.glfwMakeContextCurrent(0L); + isCurrent = false; + current_context_local.set(null); + synchronized ( current_context ) { + current_context.thread = null; + current_context.checkDestroy(); + } + } + } + + /** + * Release the context from its drawable. This is necessary on some platforms, + * like Mac OS X, where binding the context to a drawable and binding the context + * for rendering are two distinct actions and where calling releaseDrawable + * on every releaseCurrentContext results in artifacts. + */ + public synchronized void releaseDrawable() throws LWJGLException { + if ( destroyed ) + throw new IllegalStateException("Context is destroyed"); + } + + /** Update the context. Should be called whenever it's drawable is moved or resized */ + public synchronized void update() { + if ( destroyed ) + throw new IllegalStateException("Context is destroyed"); + } + + /** Swap the buffers on the current context. Only valid for double-buffered contexts */ + public static void swapBuffers() throws LWJGLException { + Display.swapBuffers(); + } + + private boolean canAccess() { + return thread == null || Thread.currentThread() == thread; + } + + private void checkAccess() { + if ( !canAccess() ) + throw new IllegalStateException("From thread " + Thread.currentThread() + ": " + thread + " already has the context current"); + } + + /** Make the context current */ + public synchronized void makeCurrent() throws LWJGLException { + checkAccess(); + if ( destroyed ) + throw new IllegalStateException("Context is destroyed"); + thread = Thread.currentThread(); + current_context_local.set(this); + GLFW.glfwMakeContextCurrent(handle); + GLContext.initCapabilities(); + isCurrent = true; + } + + ByteBuffer getHandle() { + return null; + } + + /** Query whether the context is current */ + public synchronized boolean isCurrent() throws LWJGLException { + if ( destroyed ) + throw new IllegalStateException("Context is destroyed"); + return isCurrent; + } + + private void checkDestroy() { + if ( !destroyed && destroy_requested ) { + try { + releaseDrawable(); + destroyed = true; + thread = null; + Display.destroy(); + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred while destroying context: " + e); + } + } + } + + /** + * Set the buffer swap interval. This call is a best-attempt at changing + * the monitor swap interval, which is the minimum periodicity of color buffer swaps, + * measured in video frame periods, and is not guaranteed to be successful. + *

    + * A video frame period is the time required to display a full frame of video data. + */ + public static void setSwapInterval(int value) { + GLFW.glfwSwapInterval(value); + } + + /** + * Destroy the context. This method behaves the same as destroy() with the extra + * requirement that the context must be either current to the current thread or not + * current at all. + */ + public synchronized void forceDestroy() throws LWJGLException { + checkAccess(); + destroy(); + } + + /** + * Request destruction of the Context. If the context is current, no context will be current after this call. + * The context is destroyed when no thread has it current. + */ + public synchronized void destroy() throws LWJGLException { + if ( destroyed ) + return; + destroy_requested = true; + boolean was_current = isCurrent(); + int error = GL_NO_ERROR; + if ( was_current ) { + try { + // May fail on GLContext.getCapabilities() + error = glGetError(); + } catch (Exception e) { + // ignore + } + releaseCurrent(); + } + checkDestroy(); + if ( was_current && error != GL_NO_ERROR ) + throw new OpenGLException(error); + } + + public synchronized void setCLSharingProperties(final PointerBuffer properties) throws LWJGLException { + final ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + switch ( LWJGLUtil.getPlatform() ) { + + default: + throw new UnsupportedOperationException("CL/GL context sharing is not supported on this platform."); + } + } finally { + peer_info.unlock(); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Display.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Display.java new file mode 100644 index 000000000..b358188b3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Display.java @@ -0,0 +1,1057 @@ +package org.lwjgl.opengl; + +import static org.lwjgl.glfw.GLFW.GLFW_ACCUM_ALPHA_BITS; +import static org.lwjgl.glfw.GLFW.GLFW_ALPHA_BITS; +import static org.lwjgl.glfw.GLFW.GLFW_AUX_BUFFERS; +import static org.lwjgl.glfw.GLFW.GLFW_DEPTH_BITS; +import static org.lwjgl.glfw.GLFW.GLFW_OPENGL_DEBUG_CONTEXT; +import static org.lwjgl.glfw.GLFW.GLFW_RESIZABLE; +import static org.lwjgl.glfw.GLFW.GLFW_SAMPLES; +import static org.lwjgl.glfw.GLFW.GLFW_STENCIL_BITS; +import static org.lwjgl.glfw.GLFW.GLFW_VISIBLE; +import static org.lwjgl.glfw.GLFW.glfwCreateWindow; +import static org.lwjgl.glfw.GLFW.glfwDefaultWindowHints; +import static org.lwjgl.glfw.GLFW.glfwDestroyWindow; +import static org.lwjgl.glfw.GLFW.glfwGetCurrentContext; +import static org.lwjgl.glfw.GLFW.glfwGetFramebufferSize; +import static org.lwjgl.glfw.GLFW.glfwGetPrimaryMonitor; +import static org.lwjgl.glfw.GLFW.glfwGetVideoMode; +import static org.lwjgl.glfw.GLFW.glfwGetWindowSize; +import static org.lwjgl.glfw.GLFW.glfwMakeContextCurrent; +import static org.lwjgl.glfw.GLFW.glfwPollEvents; +import static org.lwjgl.glfw.GLFW.glfwSetCharCallback; +import static org.lwjgl.glfw.GLFW.glfwSetCursorEnterCallback; +import static org.lwjgl.glfw.GLFW.glfwSetCursorPosCallback; +import static org.lwjgl.glfw.GLFW.glfwSetFramebufferSizeCallback; +import static org.lwjgl.glfw.GLFW.glfwSetKeyCallback; +import static org.lwjgl.glfw.GLFW.glfwSetMouseButtonCallback; +import static org.lwjgl.glfw.GLFW.glfwSetScrollCallback; +import static org.lwjgl.glfw.GLFW.glfwSetWindowFocusCallback; +import static org.lwjgl.glfw.GLFW.glfwSetWindowIcon; +import static org.lwjgl.glfw.GLFW.glfwSetWindowIconifyCallback; +import static org.lwjgl.glfw.GLFW.glfwSetWindowPos; +import static org.lwjgl.glfw.GLFW.glfwSetWindowPosCallback; +import static org.lwjgl.glfw.GLFW.glfwSetWindowRefreshCallback; +import static org.lwjgl.glfw.GLFW.glfwSetWindowSizeCallback; +import static org.lwjgl.glfw.GLFW.glfwShowWindow; +import static org.lwjgl.glfw.GLFW.glfwSwapBuffers; +import static org.lwjgl.glfw.GLFW.glfwSwapInterval; +import static org.lwjgl.glfw.GLFW.glfwWindowHint; +import static org.lwjgl.glfw.GLFW.glfwWindowShouldClose; +import static org.lwjgl.opengl.GL11.GL_FALSE; +import static org.lwjgl.opengl.GL11.GL_TRUE; +import static org.lwjgl.system.MemoryUtil.NULL; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.Sys; +import org.lwjgl.glfw.Callbacks; +import org.lwjgl.glfw.GLFW; +import org.lwjgl.glfw.GLFWCharCallback; +import org.lwjgl.glfw.GLFWCursorEnterCallback; +import org.lwjgl.glfw.GLFWCursorPosCallback; +import org.lwjgl.glfw.GLFWFramebufferSizeCallback; +import org.lwjgl.glfw.GLFWImage; +import org.lwjgl.glfw.GLFWKeyCallback; +import org.lwjgl.glfw.GLFWMouseButtonCallback; +import org.lwjgl.glfw.GLFWScrollCallback; +import org.lwjgl.glfw.GLFWVidMode; +import org.lwjgl.glfw.GLFWWindowFocusCallback; +import org.lwjgl.glfw.GLFWWindowIconifyCallback; +import org.lwjgl.glfw.GLFWWindowPosCallback; +import org.lwjgl.glfw.GLFWWindowRefreshCallback; +import org.lwjgl.glfw.GLFWWindowSizeCallback; +import org.lwjgl.input.Cursor; +import org.lwjgl.input.GLFWInputImplementation; +import org.lwjgl.input.KeyCodes; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.system.MemoryUtil; + +import java.awt.Canvas; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +public class Display { + + private static String windowTitle = "Game"; + + private static GLContext context; + + private static DisplayImplementation display_impl; + + private static boolean displayCreated = false; + private static boolean displayFocused = true; + private static boolean displayVisible = true; + private static boolean displayDirty = false; + private static boolean displayResizable = false; + + private static DisplayMode mode, desktopDisplayMode; + + private static int latestEventKey = 0; + + private static int displayX = -1; + private static int displayY = -1; + + private static boolean displayResized = false; + private static int displayWidth = 0; + private static int displayHeight = 0; + private static int displayFramebufferWidth = 0; + private static int displayFramebufferHeight = 0; + + private static boolean latestResized = false; + private static int latestWidth = 0; + private static int latestHeight = 0; + + private static boolean vsyncEnabled = false; + private static boolean displayFullscreen = true; + private static float fps; + + private static boolean window_created; + + /** The Drawable instance that tracks the current Display context */ + private static volatile DrawableLWJGL drawable = null; + + private static Canvas parent; + + private static GLFWImage.Buffer icons; + + private static int swap_interval; + + static { + Sys.initialize(); // init using dummy sys method + + long monitor = glfwGetPrimaryMonitor(); + GLFWVidMode vidmode = glfwGetVideoMode(monitor); + + int monitorWidth = displayWidth = displayFramebufferWidth = vidmode.width(); + int monitorHeight = displayHeight = displayFramebufferHeight = vidmode.height(); + int monitorBitPerPixel = vidmode.redBits() + vidmode.greenBits() + vidmode.blueBits(); + int monitorRefreshRate = vidmode.refreshRate(); + + mode = desktopDisplayMode = new DisplayMode(monitorWidth, monitorHeight, monitorBitPerPixel, monitorRefreshRate); + LWJGLUtil.log("Initial mode: " + desktopDisplayMode); + } + + public static void setSwapInterval(int value) { + synchronized ( GlobalLock.lock ) { + swap_interval = value; + if ( isCreated() ) { + drawable.setSwapInterval(swap_interval); + } + } + } + + private static void makeCurrentAndSetSwapInterval() throws LWJGLException { + makeCurrent(); + try { + drawable.checkGLError(); + } catch (OpenGLException e) { + LWJGLUtil.log("OpenGL error during context creation: " + e.getMessage()); + } + setSwapInterval(swap_interval); + } + + private static void initContext() { + drawable.initContext(0, 0, 0); + update(); + } + + private static void initControls() { + // Automatically create mouse, keyboard and controller + if ( true ) { + if ( !Mouse.isCreated() ) { + try { + Mouse.create(); + } catch (LWJGLException e) { + if ( LWJGLUtil.DEBUG ) { + e.printStackTrace(System.err); + } else { + LWJGLUtil.log("Failed to create Mouse: " + e); + } + } + } + if ( !Keyboard.isCreated() ) { + try { + Keyboard.create(); + } catch (LWJGLException e) { + if ( LWJGLUtil.DEBUG ) { + e.printStackTrace(System.err); + } else { + LWJGLUtil.log("Failed to create Keyboard: " + e); + } + } + } + } + } + + private static void releaseDrawable() { + try { + Context context = drawable.getContext(); + if ( context != null && context.isCurrent() ) { + context.releaseCurrent(); + context.releaseDrawable(); + } + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred while trying to release context: " + e); + } + } + + private static void destroyWindow() { + if ( !window_created ) { + return; + } + releaseDrawable(); + + // Automatically destroy keyboard & mouse + if ( Mouse.isCreated() ) { + Mouse.destroy(); + } + if ( Keyboard.isCreated() ) { + Keyboard.destroy(); + } + display_impl.destroyWindow(); + window_created = false; + } + + private static void reset() { + display_impl.resetDisplayMode(); + } + + private static void createWindow() throws LWJGLException { + if ( window_created ) { + return; + } + DisplayMode mode = Display.getDisplayMode(); + display_impl.createWindow(drawable, mode, null, 0, 0 /* getWindowX(), getWindowY() */); + window_created = true; + + displayWidth = mode.getWidth(); + displayHeight = mode.getHeight(); + + initControls(); + + setIcon(new ByteBuffer[] { LWJGLUtil.LWJGLIcon32x32, LWJGLUtil.LWJGLIcon16x16 }); + } + + public static void create(PixelFormat pixel_format, Drawable shared_drawable) throws LWJGLException { + create(pixel_format); + + try { + drawable.setPixelFormat(pixel_format, null); + try { + createWindow(); + try { + ((DrawableGL) drawable).context = new ContextGL(((DrawableGL) drawable).peer_info, null /* attribs */, shared_drawable != null ? ((DrawableGL) shared_drawable).getContext() : null); + try { + makeCurrentAndSetSwapInterval(); + initContext(); + } catch (LWJGLException e) { + // drawable.destroy(); + throw e; + } + } catch (LWJGLException e) { + destroyWindow(); + throw e; + } + } catch (LWJGLException e) { + drawable.destroy(); + throw e; + } + } catch (LWJGLException e) { + display_impl.resetDisplayMode(); + throw e; + } + } + + public static void create(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException { + create(pixel_format); + } + + public static void create(PixelFormat format) throws LWJGLException { + glfwWindowHint(GLFW_ACCUM_ALPHA_BITS, format.getAccumulationBitsPerPixel()); + glfwWindowHint(GLFW_ALPHA_BITS, format.getAlphaBits()); + glfwWindowHint(GLFW_AUX_BUFFERS, format.getAuxBuffers()); + glfwWindowHint(GLFW_DEPTH_BITS, format.getDepthBits()); + glfwWindowHint(GLFW_SAMPLES, format.getSamples()); + glfwWindowHint(GLFW_STENCIL_BITS, format.getStencilBits()); + create(); + } + + private static boolean isCreated = false; + public static void create() throws LWJGLException { + if (isCreated) return; + else isCreated = true; + + if (Window.handle != MemoryUtil.NULL) + glfwDestroyWindow(Window.handle); + + long monitor = glfwGetPrimaryMonitor(); + GLFWVidMode vidmode = glfwGetVideoMode(monitor); + + int monitorWidth = vidmode.width(); + int monitorHeight = vidmode.height(); + int monitorBitPerPixel = vidmode.redBits() + vidmode.greenBits() + vidmode.blueBits(); + int monitorRefreshRate = vidmode.refreshRate(); + + desktopDisplayMode = new DisplayMode(monitorWidth, monitorHeight, monitorBitPerPixel, monitorRefreshRate); + + glfwDefaultWindowHints(); + glfwWindowHint(GLFW_VISIBLE, GL_FALSE); + glfwWindowHint(GLFW_RESIZABLE, displayResizable ? GL_TRUE : GL_FALSE); + glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); + + Window.handle = glfwCreateWindow(mode.getWidth(), mode.getHeight(), windowTitle, NULL, NULL); + if (Window.handle == NULL) + throw new LWJGLException("Failed to create Display window"); + + Window.keyCallback = new GLFWKeyCallback() { + @Override + public void invoke(long window, int key, int scancode, int action, int mods) { + latestEventKey = key; + GLFWInputImplementation.singleton.putKeyboardEvent(KeyCodes.toLwjglKey(key), (byte) action, 0, Sys.getNanoTime(), false); + } + }; + + Window.charCallback = new GLFWCharCallback() { + @Override + public void invoke(long window, int codepoint) { + GLFWInputImplementation.singleton.putKeyboardEvent(0, (byte) 1, codepoint, Sys.getNanoTime(), false); + } + }; + + Window.cursorEnterCallback = new GLFWCursorEnterCallback() { + @Override + public void invoke(long window, boolean entered) { + + } + }; + + Window.cursorPosCallback = new GLFWCursorPosCallback() { + @Override + public void invoke(long window, double xpos, double ypos) { + GLFWInputImplementation.singleton.putMouseEventWithCoords((byte) -1, (byte) 0, (int) xpos, (int) ((ypos - Display.getHeight()) * -1), 0, Sys.getNanoTime()); + } + }; + + Window.mouseButtonCallback = new GLFWMouseButtonCallback() { + @Override + public void invoke(long window, int button, int action, int mods) { + GLFWInputImplementation.singleton.putMouseEventWithCoords((byte) button, (byte) action, -1, -1, 0, Sys.getNanoTime()); + } + }; + + Window.windowFocusCallback = new GLFWWindowFocusCallback() { + @Override + public void invoke(long window, boolean focused) { + displayFocused = focused; + } + }; + + Window.windowIconifyCallback = new GLFWWindowIconifyCallback() { + @Override + public void invoke(long window, boolean iconified) { + displayVisible = !iconified; + } + }; + + Window.windowSizeCallback = new GLFWWindowSizeCallback() { + @Override + public void invoke(long window, int width, int height) { + latestResized = true; + latestWidth = width; + latestHeight = height; + + if (parent != null) + parent.setSize(width, height); + } + }; + + Window.windowPosCallback = new GLFWWindowPosCallback() { + @Override + public void invoke(long window, int xpos, int ypos) { + displayX = xpos; + displayY = ypos; + } + }; + + Window.windowRefreshCallback = new GLFWWindowRefreshCallback() { + @Override + public void invoke(long window) { + displayDirty = true; + } + }; + + Window.framebufferSizeCallback = new GLFWFramebufferSizeCallback() { + @Override + public void invoke(long window, int width, int height) { + displayFramebufferWidth = width; + displayFramebufferHeight = height; + } + }; + + Window.scrollCallback = new GLFWScrollCallback() { + @Override + public void invoke(long window, double xoffset, double yoffset) { + GLFWInputImplementation.singleton.putMouseEventWithCoords((byte) -1, (byte) 0, -1, -1, (int) (yoffset * 120), Sys.getNanoTime()); + } + }; + + Window.setCallbacks(); + + displayWidth = mode.getWidth(); + displayHeight = mode.getHeight(); + + IntBuffer fbw = BufferUtils.createIntBuffer(1); + IntBuffer fbh = BufferUtils.createIntBuffer(1); + glfwGetFramebufferSize(Window.handle, fbw, fbh); + displayFramebufferWidth = fbw.get(0); + displayFramebufferHeight = fbh.get(0); + + glfwSetWindowPos(Window.handle, (monitorWidth - mode.getWidth()) / 2, (monitorHeight - mode.getHeight()) / 2); + + if (displayX == -1) { + displayX = (monitorWidth - mode.getWidth()) / 2; + } + + if (displayY == -1) { + displayY = (monitorHeight - mode.getHeight()) / 2; + } + + final DrawableGL drawable = new DrawableGL() { + public void destroy() { + synchronized ( GlobalLock.lock ) { + if ( !isCreated() ) + return; + + releaseDrawable(); + super.destroy(); + destroyWindow(); + reset(); + } + } + }; + drawable.context = new ContextGL(Window.handle); + drawable.context.makeCurrent(); + Display.drawable = drawable; + context = GLContext.createFromCurrent(); + + glfwShowWindow(Window.handle); + if (parent != null) + parent.setSize(displayWidth, displayHeight); + Mouse.create(); + Keyboard.create(); + + display_impl = new DisplayImplementation() { + + @Override + public void setNativeCursor(Object handle) throws LWJGLException { + try { + Mouse.setNativeCursor((Cursor) handle); + } catch (ClassCastException e) { + throw new LWJGLException("Handle is not an instance of cursor"); + } + } + + @Override + public void setCursorPosition(int x, int y) { + Mouse.setCursorPosition(x, y); + } + + @Override + public void readMouse(ByteBuffer buffer) { + + } + + @Override + public void readKeyboard(ByteBuffer buffer) { + + } + + @Override + public void pollMouse(IntBuffer coord_buffer, ByteBuffer buttons) { + + } + + @Override + public void pollKeyboard(ByteBuffer keyDownBuffer) { + + } + + @Override + public boolean isInsideWindow() { + return false; + } + + @Override + public boolean hasWheel() { + return false; + } + + @Override + public void grabMouse(boolean grab) { + Mouse.setGrabbed(grab); + } + + @Override + public int getNativeCursorCapabilities() { + return 0; + } + + @Override + public int getMinCursorSize() { + return 0; + } + + @Override + public int getMaxCursorSize() { + return 0; + } + + @Override + public int getButtonCount() { + return 0; + } + + @Override + public void destroyMouse() { + + } + + @Override + public void destroyKeyboard() { + + } + + @Override + public void destroyCursor(Object cursor_handle) { + + } + + @Override + public void createMouse() throws LWJGLException { + + } + + @Override + public void createKeyboard() throws LWJGLException { + + } + + @Override + public Object createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { + return null; + } + + @Override + public boolean wasResized() { + return false; + } + + @Override + public void update() { + Display.update(); + } + + @Override + public void switchDisplayMode(DisplayMode mode) throws LWJGLException { + Display.setDisplayMode(mode); + } + + @Override + public void setTitle(String title) { + windowTitle = title; + } + + @Override + public void setResizable(boolean resizable) { + Display.setResizable(resizable); + } + + @Override + public void setPbufferAttrib(PeerInfo handle, int attrib, int value) { + + } + + @Override + public int setIcon(ByteBuffer[] icons) { + Display.setIcon(icons); + return 0; + } + + @Override + public void setGammaRamp(FloatBuffer gammaRamp) throws LWJGLException { + + } + + @Override + public void reshape(int x, int y, int width, int height) { + + } + + @Override + public void resetDisplayMode() { + try { + Display.setDisplayMode(desktopDisplayMode); + } catch (LWJGLException e) { + e.printStackTrace(); + } + } + + @Override + public void releaseTexImageFromPbuffer(PeerInfo handle, int buffer) { + + } + + @Override + public boolean isVisible() { + return Display.displayVisible; + } + + @Override + public boolean isDirty() { + return Display.displayDirty; + } + + @Override + public boolean isCloseRequested() { + return GLFW.glfwWindowShouldClose(Window.handle); + } + + @Override + public boolean isBufferLost(PeerInfo handle) { + return false; + } + + @Override + public boolean isActive() { + return Display.displayFocused; + } + + @Override + public DisplayMode init() throws LWJGLException { + return desktopDisplayMode; + } + + @Override + public int getY() { + return Display.displayY; + } + + @Override + public int getX() { + return Display.displayX; + } + + @Override + public int getWidth() { + return Display.latestWidth; + } + + @Override + public String getVersion() { + return Sys.getVersion(); + } + + @Override + public float getPixelScaleFactor() { + return 0; + } + + @Override + public int getPbufferCapabilities() { + return 0; + } + + @Override + public int getHeight() { + return Display.latestHeight; + } + + @Override + public int getGammaRampLength() { + return 0; + } + + @Override + public DisplayMode[] getAvailableDisplayModes() throws LWJGLException { + return Display.getAvailableDisplayModes(); + } + + @Override + public String getAdapter() { + return Display.getAdapter(); + } + + @Override + public void destroyWindow() { + Display.destroy(); + } + + @Override + public void createWindow(DrawableLWJGL drawable, DisplayMode mode, Canvas parent, int x, int y) throws LWJGLException { + + } + + @Override + public PeerInfo createPeerInfo(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException { + return null; + } + + @Override + public PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs, IntBuffer pixelFormatCaps, IntBuffer pBufferAttribs) throws LWJGLException { + return null; + } + + @Override + public void bindTexImageToPbuffer(PeerInfo handle, int buffer) { + + } + }; + + + displayCreated = true; + + } + + public static boolean isCreated() { + return true; + } + + public static boolean isActive() { + return displayFocused; + } + + public static boolean isVisible() { + return displayVisible; + } + + public static GLContext getContext() { + return context; + } + + public static void setLocation(int new_x, int new_y) { + if (Window.handle == 0L) { + Display.displayX = new_x; + Display.displayY = new_y; + } else { + GLFW.glfwSetWindowPos(Window.handle, new_x, new_y); + } + } + + public static void setVSyncEnabled(boolean sync) { + vsyncEnabled = sync; + glfwSwapInterval(vsyncEnabled ? 1 : 0); + } + + public static long getWindow() { + return Window.handle; + } + + public static void update() { + update(true); + } + + public static void update(boolean processMessages) { + try { + swapBuffers(); + displayDirty = false; + + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + + if (processMessages) + processMessages(); + } + + public static void processMessages() { + glfwPollEvents(); + Keyboard.poll(); + Mouse.poll(); + + if (latestResized) { + latestResized = false; + displayResized = true; + displayWidth = latestWidth; + displayHeight = latestHeight; + } else { + displayResized = false; + } + } + + /** Return the last parent set with setParent(). */ + public static Canvas getParent() { + return parent; + } + + /** + * Set the parent of the Display. If parent is null, the Display will appear as a top level window. + * If parent is not null, the Display is made a child of the parent. A parent's isDisplayable() must be true when + * setParent() is called and remain true until setParent() is called again with + * null or a different parent. This generally means that the parent component must remain added to it's parent container.

    + * It is not advisable to call this method from an AWT thread, since the context will be made current on the thread + * and it is difficult to predict which AWT thread will process any given AWT event.

    + * While the Display is in fullscreen mode, the current parent will be ignored. Additionally, when a non null parent is specified, + * the Dispaly will inherit the size of the parent, disregarding the currently set display mode.

    + */ + public static void setParent(Canvas parent) throws LWJGLException { + if ( Display.parent != parent ) { + Display.parent = parent; + } + } + + public static void swapBuffers() throws LWJGLException { + glfwSwapBuffers(Window.handle); + } + + public static void destroy() { + Window.releaseCallbacks(); + glfwDestroyWindow(Window.handle); + + displayCreated = false; + } + + public static void setDisplayMode(DisplayMode dm) throws LWJGLException { + mode = dm; + if(isCreated) GLFW.glfwSetWindowSize(Window.handle, dm.getWidth(), dm.getHeight()); + } + + public static DisplayMode getDisplayMode() { + return mode; + } + + public static DisplayMode[] getAvailableDisplayModes() throws LWJGLException { + GLFWVidMode.Buffer modes = GLFW.glfwGetVideoModes(org.lwjgl.glfw.GLFW.glfwGetPrimaryMonitor()); + + DisplayMode[] displayModes = new DisplayMode[modes.capacity()]; + + for (int i = 0; i < modes.capacity(); i++) { + modes.position(i); + + int w = modes.width(); + int h = modes.height(); + int b = modes.redBits() + modes.greenBits() + modes.blueBits(); + int r = modes.refreshRate(); + + displayModes[i] = new DisplayMode(w, h, b, r); + } + + return displayModes; + } + + public static DisplayMode getDesktopDisplayMode() { + long mon = GLFW.glfwGetPrimaryMonitor(); + GLFWVidMode mode = GLFW.glfwGetVideoMode(mon); + return new DisplayMode(mode.width(), mode.height(), mode.redBits() + mode.greenBits() + mode.blueBits(), mode.refreshRate()); + } + + public static boolean wasResized() { + return displayResized; + } + + public static int getX() { + return displayX; + } + + public static int getY() { + return displayY; + } + + public static int getWidth() { + return displayWidth; + } + + public static int getHeight() { + return displayHeight; + } + + public static int getFramebufferWidth() { + return displayFramebufferWidth; + } + + public static int getFramebufferHeight() { + return displayFramebufferHeight; + } + + public static void setTitle(String title) { + windowTitle = title; + } + + public static String getTitle() { return windowTitle; } + + public static boolean isCloseRequested() { + return glfwWindowShouldClose(Window.handle); + } + + public static boolean isDirty() { + return displayDirty; + } + + public static void setInitialBackground(float red, float green, float blue) { + if (Window.handle != MemoryUtil.NULL) { + GL11.glClearColor(red, green, blue, 1f); + GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); + } + } + + public static int setIcon(ByteBuffer[] icons) { + return 0; + } + + public static void setResizable(boolean resizable) { + //displayResizable = resizable; + if (displayResizable ^ resizable) { + if (Window.handle != 0) { + IntBuffer width = BufferUtils.createIntBuffer(1); + IntBuffer height = BufferUtils.createIntBuffer(1); + GLFW.glfwGetWindowSize(Window.handle, width, height); + width.rewind(); + height.rewind(); + + GLFW.glfwDefaultWindowHints(); + glfwWindowHint(GLFW_VISIBLE, displayVisible ? GL_TRUE : GL_FALSE); + glfwWindowHint(GLFW_RESIZABLE, displayResizable ? GL_TRUE : GL_FALSE); + glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); + + GLFW.glfwSetWindowSize(Window.handle, width.get(), height.get()); + } + } + displayResizable = resizable; + } + + public static boolean isResizable() { + return displayResizable; + } + + public static void setDisplayModeAndFullscreen(DisplayMode dm) throws LWJGLException { + if(Window.handle != 0) { + Display.mode = dm; + GLFW.glfwSetWindowSize(Window.handle, dm.getWidth(), dm.getHeight()); + } + } + + public static void setFullscreen(boolean fullscreen) throws LWJGLException { + System.out.println("LWJGL: switch fullscreen to " + fullscreen); + if (isFullscreen() ^ fullscreen) { + if (fullscreen && (!mode.isFullscreenCapable())) + throw new LWJGLException("Display mode is not fullscreen capable"); + if (Window.handle != 0) { + IntBuffer width = BufferUtils.createIntBuffer(1); + IntBuffer height = BufferUtils.createIntBuffer(1); + glfwGetWindowSize(Window.handle, width, height); + width.rewind(); + height.rewind(); + + glfwDefaultWindowHints(); + glfwWindowHint(GLFW_VISIBLE, displayVisible ? GL_TRUE : GL_FALSE); + glfwWindowHint(GLFW_RESIZABLE, displayResizable ? GL_TRUE : GL_FALSE); + glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); + + GLFW.glfwSetWindowSize(Window.handle, width.get(), height.get()); + } + } + displayFullscreen = fullscreen; + } + + public static boolean isFullscreen() { + return displayFullscreen; + } + + public static void releaseContext() throws LWJGLException { + glfwMakeContextCurrent(0); + } + + public static boolean isCurrent() throws LWJGLException { + return glfwGetCurrentContext() == Window.handle; + } + + public static void makeCurrent() throws LWJGLException { + if (!isCurrent()) { + // glfwMakeContextCurrent(Window.handle); + } + } + + public static void setDisplayConfiguration(float gamma, float brightness, float contrast) throws LWJGLException { + + } + + public static String getAdapter() { + return "GeNotSupportedAdapter"; + } + + public static String getVersion() { + return "1.0 NOT SUPPORTED"; + } + + /** + * An accurate sync method that will attempt to run at a constant frame + * rate. It should be called once every frame. + * + * @param fps + * - the desired frame rate, in frames per second + */ + public static void sync(int fps) { + Sync.sync(fps); + } + + public static Drawable getDrawable() { + return drawable; + } + + static DisplayImplementation getImplementation() { + return display_impl; + } + + static class Window { + static long handle; + + static GLFWKeyCallback keyCallback; + static GLFWCharCallback charCallback; + static GLFWCursorEnterCallback cursorEnterCallback; + static GLFWCursorPosCallback cursorPosCallback; + static GLFWMouseButtonCallback mouseButtonCallback; + static GLFWWindowFocusCallback windowFocusCallback; + static GLFWWindowIconifyCallback windowIconifyCallback; + static GLFWWindowSizeCallback windowSizeCallback; + static GLFWWindowPosCallback windowPosCallback; + static GLFWWindowRefreshCallback windowRefreshCallback; + static GLFWFramebufferSizeCallback framebufferSizeCallback; + static GLFWScrollCallback scrollCallback; + + public static void setCallbacks() { + glfwSetKeyCallback(handle, keyCallback); + glfwSetCharCallback(handle, charCallback); + glfwSetCursorEnterCallback(handle, cursorEnterCallback); + glfwSetCursorPosCallback(handle, cursorPosCallback); + glfwSetMouseButtonCallback(handle, mouseButtonCallback); + glfwSetWindowFocusCallback(handle, windowFocusCallback); + glfwSetWindowIconifyCallback(handle, windowIconifyCallback); + glfwSetWindowSizeCallback(handle, windowSizeCallback); + glfwSetWindowPosCallback(handle, windowPosCallback); + glfwSetWindowRefreshCallback(handle, windowRefreshCallback); + glfwSetFramebufferSizeCallback(handle, framebufferSizeCallback); + glfwSetScrollCallback(handle, scrollCallback); + } + + public static void releaseCallbacks() { + Callbacks.glfwFreeCallbacks(handle); + keyCallback = null; + charCallback = null; + cursorEnterCallback = null; + cursorPosCallback = null; + mouseButtonCallback = null; + windowFocusCallback = null; + windowIconifyCallback = null; + windowSizeCallback = null; + windowPosCallback = null; + windowRefreshCallback = null; + framebufferSizeCallback = null; + scrollCallback = null; + System.gc(); + } + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DisplayImplementation.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DisplayImplementation.java new file mode 100644 index 000000000..e0df5e4f3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DisplayImplementation.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +/** + * This is the Display implementation interface. Display delegates + * to implementors of this interface. There is one DisplayImplementation + * for each supported platform. + * @author elias_naur + */ + +import org.lwjgl.LWJGLException; + +import java.awt.Canvas; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +interface DisplayImplementation extends InputImplementation { + + void createWindow(DrawableLWJGL drawable, DisplayMode mode, Canvas parent, int x, int y) throws LWJGLException; + + void destroyWindow(); + + void switchDisplayMode(DisplayMode mode) throws LWJGLException; + + /** + * Reset the display mode to whatever it was when LWJGL was initialized. + * Fails silently. + */ + void resetDisplayMode(); + + /** + * Return the length of the gamma ramp arrays. Returns 0 if gamma settings are + * unsupported. + * + * @return the length of each gamma ramp array, or 0 if gamma settings are unsupported. + */ + int getGammaRampLength(); + + /** + * Method to set the gamma ramp. + */ + void setGammaRamp(FloatBuffer gammaRamp) throws LWJGLException; + + /** + * Get the driver adapter string. This is a unique string describing the actual card's hardware, eg. "Geforce2", "PS2", + * "Radeon9700". If the adapter cannot be determined, this function returns null. + * @return a String + */ + String getAdapter(); + + /** + * Get the driver version. This is a vendor/adapter specific version string. If the version cannot be determined, + * this function returns null. + * @return a String + */ + String getVersion(); + + /** + * Initialize and return the current display mode. + */ + DisplayMode init() throws LWJGLException; + + /** + * Implementation of setTitle(). This will read the window's title member + * and stash it in the native title of the window. + */ + void setTitle(String title); + + boolean isCloseRequested(); + + boolean isVisible(); + boolean isActive(); + + boolean isDirty(); + + /** + * Create the native PeerInfo. + * @throws LWJGLException + */ + PeerInfo createPeerInfo(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException; + +// void destroyPeerInfo(); + + /** + * Updates the windows internal state. This must be called at least once per video frame + * to handle window close requests, moves, paints, etc. + */ + void update(); + + void reshape(int x, int y, int width, int height); + + /** + * Method for getting displaymodes + */ + DisplayMode[] getAvailableDisplayModes() throws LWJGLException; + + /* Pbuffer */ + int getPbufferCapabilities(); + + /** + * Method to test for buffer integrity + */ + boolean isBufferLost(PeerInfo handle); + + /** + * Method to create a Pbuffer + */ + PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs, + IntBuffer pixelFormatCaps, + IntBuffer pBufferAttribs) throws LWJGLException; + + void setPbufferAttrib(PeerInfo handle, int attrib, int value); + + void bindTexImageToPbuffer(PeerInfo handle, int buffer); + + void releaseTexImageFromPbuffer(PeerInfo handle, int buffer); + + /** + * Sets one or more icons for the Display. + *

      + *
    • On Windows you should supply at least one 16x16 icon and one 32x32.
    • + *
    • Linux (and similar platforms) expect one 32x32 icon.
    • + *
    • Mac OS X should be supplied one 128x128 icon
    • + *
    + * The implementation will use the supplied ByteBuffers with image data in RGBA and perform any conversions nescesarry for the specific platform. + * + * @param icons Array of icons in RGBA mode + * @return number of icons used. + */ + int setIcon(ByteBuffer[] icons); + + /** + * Enable or disable the Display window to be resized. + * + * @param resizable set to true to make the Display window resizable; + * false to disable resizing on the Display window. + */ + void setResizable(boolean resizable); + + /** + * @return true if the Display window has been resized since this method was last called. + */ + boolean wasResized(); + + /** + * @return this method will return the width of the Display window. + */ + int getWidth(); + + /** + * @return this method will return the height of the Display window. + */ + int getHeight(); + + /** + * @return this method will return the top-left x position of the Display window. + */ + int getX(); + + /** + * @return this method will return the top-left y position of the Display window. + */ + int getY(); + + /** + * @return this method will return the pixel scale factor of the Display window useful for high resolution modes. + */ + float getPixelScaleFactor(); +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DisplayMode.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DisplayMode.java new file mode 100644 index 000000000..c3a34202d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DisplayMode.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +/** + * + * This class encapsulates the properties for a given display mode. + * This class is not instantiable, and is aquired from the Display. + * getAvailableDisplayModes() method. + * + * @author cix_foo + * @version $Revision$ + * $Id$ + */ + +public final class DisplayMode { + + /** properties of the display mode */ + private final int width, height, bpp, freq; + /** If true, this instance can be used for fullscreen modes */ + private final boolean fullscreen; + + /** + * Construct a display mode. DisplayModes constructed through the + * public constructor can only be used to specify the dimensions of + * the Display in windowed mode. To get the available DisplayModes for + * fullscreen modes, use Display.getAvailableDisplayModes(). + * + * @param width The Display width. + * @param height The Display height. + * @see Display + */ + public DisplayMode(int width, int height) { + this(width, height, 0, 0, false); + } + + DisplayMode(int width, int height, int bpp, int freq) { + this(width, height, bpp, freq, true); + } + + private DisplayMode(int width, int height, int bpp, int freq, boolean fullscreen) { + width = Integer.parseInt(System.getProperty("window.width") == null ? "-1" : System.getProperty("window.width")); + height = Integer.parseInt(System.getProperty("window.height") == null ? "-1" : System.getProperty("window.height")); + this.width = width; + this.height = height; + this.bpp = bpp; + this.freq = freq; + this.fullscreen = false; + } + + /** True if this instance can be used for fullscreen modes */ + public boolean isFullscreenCapable() { + return fullscreen; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public int getBitsPerPixel() { + return bpp; + } + + public int getFrequency() { + return freq; + } + + /** + * Tests for DisplayMode equality + * + * @see Object#equals(Object) + */ + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof DisplayMode)) { + return false; + } + + DisplayMode dm = (DisplayMode) obj; + return dm.width == width + && dm.height == height + && dm.bpp == bpp + && dm.freq == freq; + } + + /** + * Retrieves the hashcode for this object + * + * @see Object#hashCode() + */ + public int hashCode() { + return width ^ height ^ freq ^ bpp; + } + + /** + * Retrieves a String representation of this DisplayMode + * + * @see Object#toString() + */ + public String toString() { + StringBuilder sb = new StringBuilder(32); + sb.append(width); + sb.append(" x "); + sb.append(height); + sb.append(" x "); + sb.append(bpp); + sb.append(" @"); + sb.append(freq); + sb.append("Hz"); + return sb.toString(); + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Drawable.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Drawable.java new file mode 100644 index 000000000..d5fdc4b82 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Drawable.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.PointerBuffer; + +/** + * The Drawable interface describes an OpenGL drawable with an associated + * Context. + * + * @author elias_naur + */ + +public interface Drawable { + + /** Returns true if the Drawable's context is current in the current thread. */ + boolean isCurrent() throws LWJGLException; + + /** + * Makes the Drawable's context current in the current thread. + * + * @throws LWJGLException + */ + void makeCurrent() throws LWJGLException; + + /** + * If the Drawable's context is current in the current thread, no context will be current after a call to this method. + * + * @throws LWJGLException + */ + void releaseContext() throws LWJGLException; + + /** Destroys the Drawable. */ + void destroy(); + + /** + * Sets the appropriate khr_gl_sharing properties in the target PointerBuffer, + * so that if it is used in a clCreateContext(FromType) call, the created CL + * context will be sharing objects with this Drawable's GL context. After a + * call to this method, the target buffer position will have advanced by 2 to 4 positions, + * depending on the implementation. + * + * @param properties The target properties buffer. It must have at least 4 positions remaining. + */ + void setCLSharingProperties(PointerBuffer properties) throws LWJGLException; + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DrawableGL.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DrawableGL.java new file mode 100644 index 000000000..dc904cdf8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DrawableGL.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2002-2011 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.opengl; + +import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; +import static org.lwjgl.opengl.GL11.glClear; +import static org.lwjgl.opengl.GL11.glClearColor; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.PointerBuffer; + +/** @author Spasi */ +abstract class DrawableGL implements DrawableLWJGL { + + /** The PixelFormat used to create the drawable. */ + protected PixelFormat pixel_format; + + /** Handle to the native GL rendering context */ + protected PeerInfo peer_info; + + /** The OpenGL Context. */ + protected ContextGL context; + + protected DrawableGL() { + } + + public void setPixelFormat(final PixelFormatLWJGL pf) throws LWJGLException { + throw new UnsupportedOperationException(); + } + + public void setPixelFormat(final PixelFormatLWJGL pf, final ContextAttribs attribs) throws LWJGLException { + this.pixel_format = (PixelFormat)pf; + this.peer_info = Display.getImplementation().createPeerInfo(pixel_format, attribs); + } + + public PixelFormatLWJGL getPixelFormat() { + return pixel_format; + } + + public ContextGL getContext() { + synchronized ( GlobalLock.lock ) { + return context; + } + } + + public ContextGL createSharedContext() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + return new ContextGL(peer_info, context.getContextAttribs(), context); + } + } + + public void checkGLError() { + Util.checkGLError(); + } + + public void setSwapInterval(final int swap_interval) { + ContextGL.setSwapInterval(swap_interval); + } + + public void swapBuffers() throws LWJGLException { + ContextGL.swapBuffers(); + } + + public void initContext(final float r, final float g, final float b) { + // set background clear color + glClearColor(r, g, b, 0.0f); + // Clear window to avoid the desktop "showing through" + glClear(GL_COLOR_BUFFER_BIT); + } + + public boolean isCurrent() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + return context.isCurrent(); + } + } + + public void makeCurrent() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + context.makeCurrent(); + } + } + + public void releaseContext() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + if ( context.isCurrent() ) + context.releaseCurrent(); + } + } + + public void destroy() { + synchronized ( GlobalLock.lock ) { + if ( context == null ) + return; + + try { + releaseContext(); + + context.forceDestroy(); + context = null; + + if ( peer_info != null ) { + peer_info.destroy(); + peer_info = null; + } + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred while destroying Drawable: " + e); + } + } + } + + public void setCLSharingProperties(final PointerBuffer properties) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + context.setCLSharingProperties(properties); + } + } + + protected final void checkDestroyed() { + if ( context == null ) + throw new IllegalStateException("The Drawable has no context available."); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DrawableLWJGL.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DrawableLWJGL.java new file mode 100644 index 000000000..e4d989df7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/DrawableLWJGL.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002-2011 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.opengl; + +import org.lwjgl.LWJGLException; + +/** + * [INTERNAL USE ONLY] + * + * @author Spasi + */ +interface DrawableLWJGL extends Drawable { + + void setPixelFormat(PixelFormatLWJGL pf) throws LWJGLException; + + void setPixelFormat(PixelFormatLWJGL pf, ContextAttribs attribs) throws LWJGLException; + + PixelFormatLWJGL getPixelFormat(); + + /** + * [INTERNAL USE ONLY] Returns the Drawable's Context. + * + * @return the Drawable's Context + */ + Context getContext(); + + /** + * [INTERNAL USE ONLY] Creates a new Context that is shared with the Drawable's Context. + * + * @return a Context shared with the Drawable's Context. + */ + Context createSharedContext() throws LWJGLException; + + void checkGLError(); + + void setSwapInterval(int swap_interval); + + void swapBuffers() throws LWJGLException; + + void initContext(final float r, final float g, final float b); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXT422Pixels.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXT422Pixels.java new file mode 100644 index 000000000..e7d6ad961 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXT422Pixels.java @@ -0,0 +1,36 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_422_pixels extension. + * + *

    This extension provides support for converting 422 pixels in host memory to 444 pixels as part of the pixel storage operation.

    + * + *

    The pixel unpack storage operation treats a 422 pixel as a 2 element format where the first element is C (chrominance) and the second element is L + * (luminance). Luminance is present on all pixels; a full chrominance value requires two pixels.

    + * + *

    The pixel pack storage operation converts RGB to a 422 pixel defined as a 2 element format where the first element stored is C (chrominance) and the + * second element stored is L (luminance). Luminance is present on all pixels; a full chrominance value requires two pixels.

    + * + *

    Both averaging and non-averaging is supported for green and blue assignments for pack and unpack operations.

    + */ +public final class EXT422Pixels { + + /** + * Accepted by the {@code format} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, SeparableFilter2D, + * SeparableFilter3D, GetSeparableFilter, ColorTable, and GetColorTable. + */ + public static final int + GL_422_EXT = 0x80CC, + GL_422_REV_EXT = 0x80CD, + GL_422_AVERAGE_EXT = 0x80CE, + GL_422_REV_AVERAGE_EXT = 0x80CF; + + private EXT422Pixels() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTABGR.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTABGR.java new file mode 100644 index 000000000..c20505ec2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTABGR.java @@ -0,0 +1,21 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_abgr extension. + * + *

    EXT_abgr extends the list of host-memory color formats. Specifically, it provides a reverse-order alternative to image format RGBA. The ABGR component + * order matches the cpack Iris GL format on big-endian machines.

    + */ +public final class EXTABGR { + + /** Accepted by the {@code format} parameter of DrawPixels, GetTexImage, ReadPixels, TexImage1D, and TexImage2D. */ + public static final int GL_ABGR_EXT = 0x8000; + + private EXTABGR() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBGRA.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBGRA.java new file mode 100644 index 000000000..d4f1ffa44 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBGRA.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_bgra extension. + * + *

    EXT_bgra extends the list of host-memory color formats. Specifically, it provides formats which match the memory layout of Windows DIBs so that + * applications can use the same data in both Windows API calls and OpenGL pixel API calls.

    + * + *

    Promoted to core in {@link GL12 OpenGL 1.2}.

    + */ +public final class EXTBGRA { + + /** Accepted by the {@code format} parameter of DrawPixels, GetTexImage, ReadPixels, TexImage1D, and TexImage2D. */ + public static final int + GL_BGR_EXT = 0x80E0, + GL_BGRA_EXT = 0x80E1; + + private EXTBGRA() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBindableUniform.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBindableUniform.java new file mode 100644 index 000000000..6684e6212 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBindableUniform.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_bindable_uniform extension. + * + *

    This extension introduces the concept of bindable uniforms to the OpenGL Shading Language. A uniform variable can be declared bindable, which means that + * the storage for the uniform is not allocated by the compiler/linker anymore, but is backed by a buffer object. This buffer object is bound to the + * bindable uniform through the new command UniformBufferEXT(). Binding needs to happen after linking a program object.

    + * + *

    Binding different buffer objects to a bindable uniform allows an application to easily use different "uniform data sets", without having to re-specify + * the data every time.

    + * + *

    A buffer object can be bound to bindable uniforms in different program objects. If those bindable uniforms are all of the same type, accessing a + * bindable uniform in program object A will result in the same data if the same access is made in program object B. This provides a mechanism for + * 'environment uniforms', uniform values that can be shared among multiple program objects.

    + */ +public class EXTBindableUniform { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT = 0x8DE2, + GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT = 0x8DE3, + GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT = 0x8DE4, + GL_MAX_BINDABLE_UNIFORM_SIZE_EXT = 0x8DED, + GL_UNIFORM_BUFFER_BINDING_EXT = 0x8DEF; + + /** Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. */ + public static final int GL_UNIFORM_BUFFER_EXT = 0x8DEE; + + protected EXTBindableUniform() { + throw new UnsupportedOperationException(); + } + + // --- [ glUniformBufferEXT ] --- + + public static native void glUniformBufferEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int buffer); + + // --- [ glGetUniformBufferSizeEXT ] --- + + @NativeType("GLint") + public static native int glGetUniformBufferSizeEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location); + + // --- [ glGetUniformOffsetEXT ] --- + + @NativeType("GLintptr") + public static native long glGetUniformOffsetEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendColor.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendColor.java new file mode 100644 index 000000000..397adb27c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendColor.java @@ -0,0 +1,40 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_blend_color extension. + * + *

    Blending capability is extended by defining a constant color that can be included in blending equations. A typical usage is blending two RGB images. + * Without the constant blend factor, one image must have an alpha channel with each pixel set to the desired blend factor.

    + * + *

    Promoted to core in {@link GL14 OpenGL 1.4}.

    + */ +public class EXTBlendColor { + + static { GL.initialize(); } + + /** Accepted by the {@code sfactor} and {@code dfactor} parameters of BlendFunc. */ + public static final int + GL_CONSTANT_COLOR_EXT = 0x8001, + GL_ONE_MINUS_CONSTANT_COLOR_EXT = 0x8002, + GL_CONSTANT_ALPHA_EXT = 0x8003, + GL_ONE_MINUS_CONSTANT_ALPHA_EXT = 0x8004; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_BLEND_COLOR_EXT = 0x8005; + + protected EXTBlendColor() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendColorEXT ] --- + + public static native void glBlendColorEXT(@NativeType("GLfloat") float red, @NativeType("GLfloat") float green, @NativeType("GLfloat") float blue, @NativeType("GLfloat") float alpha); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendEquationSeparate.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendEquationSeparate.java new file mode 100644 index 000000000..d3e18ea81 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendEquationSeparate.java @@ -0,0 +1,41 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_blend_equation_separate extension. + * + *

    {@link EXTBlendFuncSeparate EXT_blend_func_separate} introduced separate RGB and alpha blend factors. {@link EXTBlendMinmax EXT_blend_minmax} introduced a distinct blend equation for + * combining source and destination blend terms. ({@link EXTBlendSubtract EXT_blend_subtract} & EXT_blend_logic_op added other blend equation + * modes.) OpenGL 1.4 integrated both functionalities into the core standard.

    + * + *

    While there are separate blend functions for the RGB and alpha blend factors, OpenGL 1.4 provides a single blend equation that applies to both RGB and + * alpha portions of blending.

    + * + *

    This extension provides a separate blend equation for RGB and alpha to match the generality available for blend factors.

    + * + *

    Requires {@link GL14 OpenGL 1.4} or {@link ARBImaging ARB_imaging} or {@link EXTBlendMinmax EXT_blend_minmax} and/or {@link EXTBlendSubtract EXT_blend_subtract}. Promoted to core in {@link GL20 OpenGL 2.0}.

    + */ +public class EXTBlendEquationSeparate { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_BLEND_EQUATION_RGB_EXT = 0x8009, + GL_BLEND_EQUATION_ALPHA_EXT = 0x883D; + + protected EXTBlendEquationSeparate() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendEquationSeparateEXT ] --- + + public static native void glBlendEquationSeparateEXT(@NativeType("GLenum") int modeRGB, @NativeType("GLenum") int modeAlpha); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendFuncSeparate.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendFuncSeparate.java new file mode 100644 index 000000000..e027551a6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendFuncSeparate.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_blend_func_separate extension. + * + *

    Blending capability is extended by defining a function that allows independent setting of the RGB and alpha blend factors for blend operations that + * require source and destination blend factors. It is not always desired that the blending used for RGB is also applied to alpha.

    + * + *

    Promoted to core in {@link GL14 OpenGL 1.4}.

    + */ +public class EXTBlendFuncSeparate { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_BLEND_DST_RGB_EXT = 0x80C8, + GL_BLEND_SRC_RGB_EXT = 0x80C9, + GL_BLEND_DST_ALPHA_EXT = 0x80CA, + GL_BLEND_SRC_ALPHA_EXT = 0x80CB; + + protected EXTBlendFuncSeparate() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendFuncSeparateEXT ] --- + + public static native void glBlendFuncSeparateEXT(@NativeType("GLenum") int sfactorRGB, @NativeType("GLenum") int dfactorRGB, @NativeType("GLenum") int sfactorAlpha, @NativeType("GLenum") int dfactorAlpha); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendMinmax.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendMinmax.java new file mode 100644 index 000000000..6951af199 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendMinmax.java @@ -0,0 +1,42 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_blend_minmax extension. + * + *

    Blending capability is extended by respecifying the entire blend equation. While this document defines only two new equations, the {@link #glBlendEquationEXT BlendEquationEXT} + * procedure that it defines will be used by subsequent extensions to define additional blending equations.

    + * + *

    The two new equations defined by this extension produce the minimum (or maximum) color components of the source and destination colors. Taking the + * maximum is useful for applications such as maximum projection in medical imaging.

    + * + *

    Promoted to core in {@link GL14 OpenGL 1.4}.

    + */ +public class EXTBlendMinmax { + + static { GL.initialize(); } + + /** Accepted by the {@code mode} parameter of BlendEquationEXT. */ + public static final int + GL_FUNC_ADD_EXT = 0x8006, + GL_MIN_EXT = 0x8007, + GL_MAX_EXT = 0x8008; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_BLEND_EQUATION_EXT = 0x8009; + + protected EXTBlendMinmax() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendEquationEXT ] --- + + public static native void glBlendEquationEXT(@NativeType("GLenum") int mode); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendSubtract.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendSubtract.java new file mode 100644 index 000000000..1d639bcc2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTBlendSubtract.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_blend_subtract extension. + * + *

    Two additional blending equations are specified using the interface defined by {@link EXTBlendMinmax EXT_blend_minmax}. These equations are similar to the default + * blending equation, but produce the difference of its left and right hand sides, rather than the sum. Image differences are useful in many image + * processing applications.

    + * + *

    Promoted to core in {@link GL14 OpenGL 1.4}.

    + */ +public final class EXTBlendSubtract { + + /** Accepted by the {@code mode} parameter of BlendEquationEXT. */ + public static final int + GL_FUNC_SUBTRACT_EXT = 0x800A, + GL_FUNC_REVERSE_SUBTRACT_EXT = 0x800B; + + private EXTBlendSubtract() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTClipVolumeHint.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTClipVolumeHint.java new file mode 100644 index 000000000..66cda233f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTClipVolumeHint.java @@ -0,0 +1,22 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_clip_volume_hint extension. + * + *

    EXT_clip_volume_hint provides a mechanism for applications to indicate that they do not require clip volume clipping for primitives. It allows + * applications to maximize performance in situations where they know that clipping is unnecessary. EXT_clip_volume_hint is only an indication, though, + * and implementations are free to ignore it.

    + */ +public final class EXTClipVolumeHint { + + /** Accepted by the target parameter of Hint and the pname parameter of GetBooleanv, GetDoublev, GetFloatv and GetIntegerv. */ + public static final int GL_CLIP_VOLUME_CLIPPING_HINT_EXT = 0x80F0; + + private EXTClipVolumeHint() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTCompiledVertexArray.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTCompiledVertexArray.java new file mode 100644 index 000000000..83c7f9f32 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTCompiledVertexArray.java @@ -0,0 +1,43 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_compiled_vertex_array extension. + * + *

    This extension defines an interface which allows static vertex array data to be cached or pre-compiled for more efficient rendering. This is useful for + * implementations which can cache the transformed results of array data for reuse by several DrawArrays, ArrayElement, or DrawElements commands. It is + * also useful for implementations which can transfer array data to fast memory for more efficient processing.

    + * + *

    For example, rendering an M by N mesh of quadrilaterals can be accomplished by setting up vertex arrays containing all of the vertexes in the mesh and + * issuing M DrawElements commands each of which operate on 2 * N vertexes. Each DrawElements command after the first will share N vertexes with the + * preceding DrawElements command. If the vertex array data is locked while the DrawElements commands are executed, then OpenGL may be able to transform + * each of these shared vertexes just once.

    + */ +public class EXTCompiledVertexArray { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_ARRAY_ELEMENT_LOCK_FIRST_EXT = 0x81A8, + GL_ARRAY_ELEMENT_LOCK_COUNT_EXT = 0x81A9; + + protected EXTCompiledVertexArray() { + throw new UnsupportedOperationException(); + } + + // --- [ glLockArraysEXT ] --- + + public static native void glLockArraysEXT(@NativeType("GLint") int first, @NativeType("GLsizei") int count); + + // --- [ glUnlockArraysEXT ] --- + + public static native void glUnlockArraysEXT(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDebugLabel.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDebugLabel.java new file mode 100644 index 000000000..ebe4dcb08 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDebugLabel.java @@ -0,0 +1,99 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_debug_label extension. + * + *

    This extension defines a mechanism for OpenGL and OpenGL ES applications to label their objects (textures, buffers, shaders, etc.) with a descriptive + * string.

    + * + *

    When profiling or debugging such an application within a debugger or profiler it is difficult to identify resources from their object names. Even when + * the resource itself is viewed it can be problematic to differentiate between similar resources. Attaching a label to an object helps obviate this + * difficulty.

    + * + *

    The intended purpose of this is purely to improve the user experience within OpenGL and OpenGL ES development tools.

    + */ +public class EXTDebugLabel { + + static { GL.initialize(); } + + /** Accepted by the {@code type} parameter of LabelObjectEXT and GetObjectLabelEXT. */ + public static final int + GL_BUFFER_OBJECT_EXT = 0x9151, + GL_SHADER_OBJECT_EXT = 0x8B48, + GL_PROGRAM_OBJECT_EXT = 0x8B40, + GL_VERTEX_ARRAY_OBJECT_EXT = 0x9154, + GL_QUERY_OBJECT_EXT = 0x9153, + GL_PROGRAM_PIPELINE_OBJECT_EXT = 0x8A4F; + + protected EXTDebugLabel() { + throw new UnsupportedOperationException(); + } + + // --- [ glLabelObjectEXT ] --- + + public static native void nglLabelObjectEXT(int type, int object, int length, long label); + + public static void glLabelObjectEXT(@NativeType("GLenum") int type, @NativeType("GLuint") int object, @NativeType("GLchar const *") ByteBuffer label) { + nglLabelObjectEXT(type, object, label.remaining(), memAddress(label)); + } + + public static void glLabelObjectEXT(@NativeType("GLenum") int type, @NativeType("GLuint") int object, @NativeType("GLchar const *") CharSequence label) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int labelEncodedLength = stack.nUTF8(label, false); + long labelEncoded = stack.getPointerAddress(); + nglLabelObjectEXT(type, object, labelEncodedLength, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetObjectLabelEXT ] --- + + public static native void nglGetObjectLabelEXT(int type, int object, int bufSize, long length, long label); + + public static void glGetObjectLabelEXT(@NativeType("GLenum") int type, @NativeType("GLuint") int object, @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer label) { + if (CHECKS) { + check(length, 1); + } + nglGetObjectLabelEXT(type, object, label.remaining(), memAddress(length), memAddress(label)); + } + + @NativeType("void") + public static String glGetObjectLabelEXT(@NativeType("GLenum") int type, @NativeType("GLuint") int object, @NativeType("GLsizei") int bufSize) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer label = stack.malloc(bufSize); + nglGetObjectLabelEXT(type, object, bufSize, memAddress(length), memAddress(label)); + return memUTF8(label, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glGetObjectLabelEXT GetObjectLabelEXT} */ + public static void glGetObjectLabelEXT(@NativeType("GLenum") int type, @NativeType("GLuint") int object, @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer label) { + long __functionAddress = GL.getICD().glGetObjectLabelEXT; + if (CHECKS) { + check(__functionAddress); + check(length, 1); + } + callPPV(type, object, label.remaining(), length, memAddress(label), __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDebugMarker.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDebugMarker.java new file mode 100644 index 000000000..bbe293b0c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDebugMarker.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_debug_marker extension. + * + *

    This extension defines a mechanism for OpenGL and OpenGL ES applications to annotate their command stream with markers for discrete events and groups + * of commands using descriptive text markers.

    + * + *

    When profiling or debugging such an application within a debugger or profiler it is difficult to relate the commands within the command stream to the + * elements of the scene or parts of the program code to which they correspond. Markers help obviate this by allowing applications to specify this link.

    + * + *

    The intended purpose of this is purely to improve the user experience within OpenGL and OpenGL ES development tools.

    + */ +public class EXTDebugMarker { + + static { GL.initialize(); } + + protected EXTDebugMarker() { + throw new UnsupportedOperationException(); + } + + // --- [ glInsertEventMarkerEXT ] --- + + public static native void nglInsertEventMarkerEXT(int length, long marker); + + public static void glInsertEventMarkerEXT(@NativeType("GLchar const *") ByteBuffer marker) { + nglInsertEventMarkerEXT(marker.remaining(), memAddress(marker)); + } + + public static void glInsertEventMarkerEXT(@NativeType("GLchar const *") CharSequence marker) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int markerEncodedLength = stack.nUTF8(marker, false); + long markerEncoded = stack.getPointerAddress(); + nglInsertEventMarkerEXT(markerEncodedLength, markerEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glPushGroupMarkerEXT ] --- + + public static native void nglPushGroupMarkerEXT(int length, long marker); + + public static void glPushGroupMarkerEXT(@NativeType("GLchar const *") ByteBuffer marker) { + nglPushGroupMarkerEXT(marker.remaining(), memAddress(marker)); + } + + public static void glPushGroupMarkerEXT(@NativeType("GLchar const *") CharSequence marker) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int markerEncodedLength = stack.nUTF8(marker, false); + long markerEncoded = stack.getPointerAddress(); + nglPushGroupMarkerEXT(markerEncodedLength, markerEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glPopGroupMarkerEXT ] --- + + public static native void glPopGroupMarkerEXT(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDepthBoundsTest.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDepthBoundsTest.java new file mode 100644 index 000000000..f7d3a8b58 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDepthBoundsTest.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_depth_bounds_test extension. + * + *

    This extension adds a new per-fragment test that is, logically, after the scissor test and before the alpha test. The depth bounds test compares the + * depth value stored at the location given by the incoming fragment's (xw,yw) coordinates to a user-defined minimum and maximum depth value. If the stored + * depth value is outside the user-defined range (exclusive), the incoming fragment is discarded.

    + * + *

    Unlike the depth test, the depth bounds test has NO dependency on the fragment's window-space depth value.

    + * + *

    This functionality is useful in the context of attenuated stenciled shadow volume rendering. To motivate the functionality's utility in this context, we + * first describe how conventional scissor testing can be used to optimize shadow volume rendering.

    + * + *

    If an attenuated light source's illumination can be bounded to a rectangle in XY window-space, the conventional scissor test can be used to discard + * shadow volume fragments that are guaranteed to be outside the light source's window-space XY rectangle. The stencil increments and decrements that would + * otherwise be generated by these scissored fragments are inconsequential because the light source's illumination can pre-determined to be fully + * attenuated outside the scissored region. In other words, the scissor test can be used to discard shadow volume fragments rendered outside the scissor, + * thereby improving performance, without affecting the ultimate illumination of these pixels with respect to the attenuated light source.

    + * + *

    This scissoring optimization can be used both when rendering the stenciled shadow volumes to update stencil (incrementing and decrementing the stencil + * buffer) AND when adding the illumination contribution of attenuated light source's.

    + * + *

    In a similar fashion, we can compute the attenuated light source's window-space Z bounds (zmin,zmax) of consequential illumination. Unless a depth value + * (in the depth buffer) at a pixel is within the range [zmin,zmax], the light source's illumination can be pre-determined to be inconsequential for the + * pixel. Said another way, the pixel being illuminated is either far enough in front of or behind the attenuated light source so that the light source's + * illumination for the pixel is fully attenuated. The depth bounds test can perform this test.

    + */ +public class EXTDepthBoundsTest { + + static { GL.initialize(); } + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_DEPTH_BOUNDS_TEST_EXT = 0x8890; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_DEPTH_BOUNDS_EXT = 0x8891; + + protected EXTDepthBoundsTest() { + throw new UnsupportedOperationException(); + } + + // --- [ glDepthBoundsEXT ] --- + + public static native void glDepthBoundsEXT(double zmin, double zmax); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDirectStateAccess.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDirectStateAccess.java new file mode 100644 index 000000000..0b122e410 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDirectStateAccess.java @@ -0,0 +1,4024 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_direct_state_access extension. + * + *

    This extension introduces a set of new "direct state access" commands (meaning no selector is involved) to access (update and query) OpenGL state that + * previously depended on the OpenGL state selectors for access. These new commands supplement the existing selector-based OpenGL commands to access the + * same state.

    + * + *

    The intent of this extension is to make it more efficient for libraries to avoid disturbing selector and latched state. The extension also allows more + * efficient command usage by eliminating the need for selector update commands.

    + * + *

    Two derivative advantages of this extension are 1) display lists can be executed using these commands that avoid disturbing selectors that subsequent + * commands may depend on, and 2) drivers implemented with a dual-thread partitioning with OpenGL command buffering from an application thread and then + * OpenGL command dispatching in a concurrent driver thread can avoid thread synchronization created by selector saving, setting, command execution, and + * selector restoration.

    + * + *

    This extension does not itself add any new OpenGL state.

    + * + *

    We call a state variable in OpenGL an "OpenGL state selector" or simply a "selector" if OpenGL commands depend on the state variable to determine what + * state to query or update. The matrix mode and active texture are both selectors. Object bindings for buffers, programs, textures, and framebuffer + * objects are also selectors.

    + * + *

    We call OpenGL state "latched" if the state is set by one OpenGL command but then that state is saved by a subsequent command or the state determines + * how client memory or buffer object memory is accessed by a subsequent command. The array and element array buffer bindings are latched by vertex array + * specification commands to determine which buffer a given vertex array uses. Vertex array state and pixel pack/unpack state decides how client memory or + * buffer object memory is accessed by subsequent vertex pulling or image specification commands.

    + * + *

    The existence of selectors and latched state in the OpenGL API reduces the number of parameters to various sets of OpenGL commands but complicates the + * access to state for layered libraries which seek to access state without disturbing other state, namely the state of state selectors and latched state. + * In many cases, selectors and latched state were introduced by extensions as OpenGL evolved to minimize the disruption to the OpenGL API when new + * functionality, particularly the pluralization of existing functionality as when texture objects and later multiple texture units, was introduced.

    + * + *

    The OpenGL API involves several selectors (listed in historical order of introduction):

    + * + *
      + *
    • The matrix mode.
    • + *
    • The current bound texture for each supported texture target.
    • + *
    • The active texture.
    • + *
    • The active client texture.
    • + *
    • The current bound program for each supported program target.
    • + *
    • The current bound buffer for each supported buffer target.
    • + *
    • The current GLSL program.
    • + *
    • The current framebuffer object.
    • + *
    + * + *

    The new selector-free update commands can be compiled into display lists.

    + * + *

    The OpenGL API has latched state for vertex array buffer objects and pixel store state. When an application issues a GL command to unpack or pack pixels + * (for example, glTexImage2D or glReadPixels respectively), the current unpack and pack pixel store state determines how the pixels are unpacked + * from/packed to client memory or pixel buffer objects. For example, consider:

    + * + *
    
    + * glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_TRUE);
    + * glPixelStorei(GL_UNPACK_ROW_LENGTH, 640);
    + * glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 47);
    + * glDrawPixels(100, 100, GL_RGB, GL_FLOAT, pixels);
    + * + *

    The unpack swap bytes and row length state set by the preceding glPixelStorei commands (as well as the 6 other unpack pixel store state variables) + * control how data is read (unpacked) from buffer of data pointed to by pixels. The glBindBuffer command also specifies an unpack buffer object (47) so + * the pixel pointer is actually treated as a byte offset into buffer object 47.

    + * + *

    When an application issues a command to configure a vertex array, the current array buffer state is latched as the binding for the particular vertex + * array being specified. For example, consider:

    + * + *
    
    + * glBindBuffer(GL_ARRAY_BUFFER, 23);
    + * glVertexPointer(3, GL_FLOAT, 12, pointer);
    + * + *

    The glBindBuffer command updates the array buffering binding (GL_ARRAY_BUFFER_BINDING) to the buffer object named 23. The subsequent glVertexPointer + * command specifies explicit parameters for the size, type, stride, and pointer to access the position vertex array BUT ALSO latches the current array + * buffer binding for the vertex array buffer binding (GL_VERTEX_ARRAY_BUFFER_BINDING). Effectively the current array buffer binding buffer object becomes + * an implicit fifth parameter to glVertexPointer and this applies to all the gl*Pointer vertex array specification commands.

    + * + *

    Selectors and latched state create problems for layered libraries using OpenGL because selectors require the selector state to be modified to update + * some other state and latched state means implicit state can affect the operation of commands specifying, packing, or unpacking data through + * pointers/offsets. For layered libraries, a state update performed by the library may attempt to save the selector state, set the selector, update/query + * some state the selector controls, and then restore the selector to its saved state. Layered libraries can skip the selector save/restore but this risks + * introducing uncertainty about the state of a selector after calling layered library routines. Such selector side-effects are difficult to document and + * lead to compatibility issues as the layered library evolves or its usage varies. For latched state, layered libraries may find commands such as + * glDrawPixels do not work as expected because latched pixel store state is not what the library expects. Querying or pushing the latched state, setting + * the latched state explicitly, performing the operation involving latched state, and then restoring or popping the latched state avoids entanglements + * with latched state but at considerable cost.

    + * + *

    EXAMPLE USAGE OF THIS EXTENSION'S FUNCTIONALITY

    + * + *

    Consider the following routine to set the modelview matrix involving the matrix mode selector:

    + * + *
    
    + * void setModelviewMatrix(const GLfloat matrix[16])
    + * {
    + *     GLenum savedMatrixMode;
    + * 
    + *     glGetIntegerv(GL_MATRIX_MODE, &savedMatrixMode);
    + *     glMatrixMode(GL_MODELVIEW);
    + *     glLoadMatrixf(matrix);
    + *     glMatrixMode(savedMatrixMode);
    + * }
    + * + *

    Notice that four OpenGL commands are required to update the current modelview matrix without disturbing the matrix mode selector.

    + * + *

    OpenGL query commands can also substantially reduce the performance of modern OpenGL implementations which may off-load OpenGL state processing to + * another CPU core/thread or to the GPU itself.

    + * + *

    An alternative to querying the selector is to use the glPushAttrib/glPopAttrib commands. However this approach typically involves pushing far more state + * than simply the one or two selectors that need to be saved and restored. Because so much state is associated with a given push/pop attribute bit, the + * glPushAttrib and glPopAttrib commands are considerably more costly than the save/restore approach. Additionally glPushAttrib risks overflowing the + * attribute stack.

    + * + *

    The reliability and performance of layered libraries and applications can be improved by adding to the OpenGL API a new set of commands to access + * directly OpenGL state that otherwise involves selectors to access.

    + * + *

    The above example can be reimplemented more efficiently and without selector side-effects:

    + * + *
    
    + * void setModelviewMatrix(const GLfloat matrix[16])
    + * {
    + *     glMatrixLoadfEXT(GL_MODELVIEW, matrix);
    + * }
    + * + *

    Consider a layered library seeking to load a texture:

    + * + *
    
    + * void loadTexture(GLint texobj, GLint width, GLint height, void *data)
    + * {
    + *     glBindTexture(GL_TEXTURE_2D, texobj);
    + *     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, GL_RGB, GL_FLOAT, data);
    + * }
    + * + *

    The library expects the data to be packed into the buffer pointed to by data. But what if the current pixel unpack buffer binding is not zero so the + * current pixel unpack buffer, rather than client memory, will be read? Or what if the application has modified the GL_UNPACK_ROW_LENGTH pixel store state + * before loadTexture is called?

    + * + *

    We can fix the routine by calling glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0) and setting all the pixel store unpack state to the initial state the + * loadTexture routine expects, but this is expensive. It also risks disturbing the state so when loadTexture returns to the application, the application + * doesn't realize the current texture object (for whatever texture unit the current active texture happens to be) and pixel store state has changed.

    + * + *

    We can more efficiently implement this routine without disturbing selector or latched state as follows:

    + * + *
    
    + * void loadTexture(GLint texobj, GLint width, GLint height, void *data)
    + * {
    + *     glPushClientAttribDefaultEXT(GL_CLIENT_PIXEL_STORE_BIT);
    + *     glTextureImage2D(texobj, GL_TEXTURE_2D, 0, GL_RGB8, width, height, GL_RGB, GL_FLOAT, data);
    + *     glPopClientAttrib();
    + * }
    + * + *

    Now loadTexture does not have to worry about inappropriately configured pixel store state or a non-zero pixel unpack buffer binding. And loadTexture has + * no unintended side-effects for selector or latched state (assuming the client attrib state does not overflow).

    + */ +public class EXTDirectStateAccess { + + static { GL.initialize(); } + + /** GetBooleani_v, GetIntegeri_v, GetFloati_vEXT, GetDoublei_vEXT. */ + public static final int + GL_PROGRAM_MATRIX_EXT = 0x8E2D, + GL_TRANSPOSE_PROGRAM_MATRIX_EXT = 0x8E2E, + GL_PROGRAM_MATRIX_STACK_DEPTH_EXT = 0x8E2F; + + protected EXTDirectStateAccess() { + throw new UnsupportedOperationException(); + } + + // --- [ glClientAttribDefaultEXT ] --- + + public static native void glClientAttribDefaultEXT(@NativeType("GLbitfield") int mask); + + // --- [ glPushClientAttribDefaultEXT ] --- + + public static native void glPushClientAttribDefaultEXT(@NativeType("GLbitfield") int mask); + + // --- [ glMatrixLoadfEXT ] --- + + public static native void nglMatrixLoadfEXT(int matrixMode, long m); + + public static void glMatrixLoadfEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMatrixLoadfEXT(matrixMode, memAddress(m)); + } + + // --- [ glMatrixLoaddEXT ] --- + + public static native void nglMatrixLoaddEXT(int matrixMode, long m); + + public static void glMatrixLoaddEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble const *") DoubleBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMatrixLoaddEXT(matrixMode, memAddress(m)); + } + + // --- [ glMatrixMultfEXT ] --- + + public static native void nglMatrixMultfEXT(int matrixMode, long m); + + public static void glMatrixMultfEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMatrixMultfEXT(matrixMode, memAddress(m)); + } + + // --- [ glMatrixMultdEXT ] --- + + public static native void nglMatrixMultdEXT(int matrixMode, long m); + + public static void glMatrixMultdEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble const *") DoubleBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMatrixMultdEXT(matrixMode, memAddress(m)); + } + + // --- [ glMatrixLoadIdentityEXT ] --- + + public static native void glMatrixLoadIdentityEXT(@NativeType("GLenum") int matrixMode); + + // --- [ glMatrixRotatefEXT ] --- + + public static native void glMatrixRotatefEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat") float angle, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z); + + // --- [ glMatrixRotatedEXT ] --- + + public static native void glMatrixRotatedEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble") double angle, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glMatrixScalefEXT ] --- + + public static native void glMatrixScalefEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z); + + // --- [ glMatrixScaledEXT ] --- + + public static native void glMatrixScaledEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glMatrixTranslatefEXT ] --- + + public static native void glMatrixTranslatefEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z); + + // --- [ glMatrixTranslatedEXT ] --- + + public static native void glMatrixTranslatedEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glMatrixOrthoEXT ] --- + + public static native void glMatrixOrthoEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble") double l, @NativeType("GLdouble") double r, @NativeType("GLdouble") double b, @NativeType("GLdouble") double t, @NativeType("GLdouble") double n, @NativeType("GLdouble") double f); + + // --- [ glMatrixFrustumEXT ] --- + + public static native void glMatrixFrustumEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble") double l, @NativeType("GLdouble") double r, @NativeType("GLdouble") double b, @NativeType("GLdouble") double t, @NativeType("GLdouble") double n, @NativeType("GLdouble") double f); + + // --- [ glMatrixPushEXT ] --- + + public static native void glMatrixPushEXT(@NativeType("GLenum") int matrixMode); + + // --- [ glMatrixPopEXT ] --- + + public static native void glMatrixPopEXT(@NativeType("GLenum") int matrixMode); + + // --- [ glTextureParameteriEXT ] --- + + public static native void glTextureParameteriEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glTextureParameterivEXT ] --- + + public static native void nglTextureParameterivEXT(int texture, int target, int pname, long param); + + public static void glTextureParameterivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer param) { + if (CHECKS) { + check(param, 4); + } + nglTextureParameterivEXT(texture, target, pname, memAddress(param)); + } + + // --- [ glTextureParameterfEXT ] --- + + public static native void glTextureParameterfEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glTextureParameterfvEXT ] --- + + public static native void nglTextureParameterfvEXT(int texture, int target, int pname, long param); + + public static void glTextureParameterfvEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer param) { + if (CHECKS) { + check(param, 4); + } + nglTextureParameterfvEXT(texture, target, pname, memAddress(param)); + } + + // --- [ glTextureImage1DEXT ] --- + + public static native void nglTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, int format, int type, long pixels); + + public static void glTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + nglTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, pixels); + } + + public static void glTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + nglTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + nglTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + nglTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + nglTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + // --- [ glTextureImage2DEXT ] --- + + public static native void nglTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels); + + public static void glTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + nglTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, pixels); + } + + public static void glTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + nglTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + nglTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + nglTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + nglTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + // --- [ glTextureSubImage1DEXT ] --- + + public static native void nglTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, int type, long pixels); + + public static void glTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels); + } + + public static void glTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, memAddress(pixels)); + } + + // --- [ glTextureSubImage2DEXT ] --- + + public static native void nglTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels); + + public static void glTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + public static void glTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + // --- [ glCopyTextureImage1DEXT ] --- + + public static native void glCopyTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLint") int border); + + // --- [ glCopyTextureImage2DEXT ] --- + + public static native void glCopyTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border); + + // --- [ glCopyTextureSubImage1DEXT ] --- + + public static native void glCopyTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width); + + // --- [ glCopyTextureSubImage2DEXT ] --- + + public static native void glCopyTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glGetTextureImageEXT ] --- + + public static native void nglGetTextureImageEXT(int texture, int target, int level, int format, int type, long pixels); + + public static void glGetTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + nglGetTextureImageEXT(texture, target, level, format, type, memAddress(pixels)); + } + + public static void glGetTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") long pixels) { + nglGetTextureImageEXT(texture, target, level, format, type, pixels); + } + + public static void glGetTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + nglGetTextureImageEXT(texture, target, level, format, type, memAddress(pixels)); + } + + public static void glGetTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + nglGetTextureImageEXT(texture, target, level, format, type, memAddress(pixels)); + } + + public static void glGetTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + nglGetTextureImageEXT(texture, target, level, format, type, memAddress(pixels)); + } + + public static void glGetTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer pixels) { + nglGetTextureImageEXT(texture, target, level, format, type, memAddress(pixels)); + } + + // --- [ glGetTextureParameterfvEXT ] --- + + public static native void nglGetTextureParameterfvEXT(int texture, int target, int pname, long params); + + public static void glGetTextureParameterfvEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureParameterfvEXT(texture, target, pname, memAddress(params)); + } + + @NativeType("void") + public static float glGetTextureParameterfEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetTextureParameterfvEXT(texture, target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTextureParameterivEXT ] --- + + public static native void nglGetTextureParameterivEXT(int texture, int target, int pname, long params); + + public static void glGetTextureParameterivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureParameterivEXT(texture, target, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetTextureParameteriEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTextureParameterivEXT(texture, target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTextureLevelParameterfvEXT ] --- + + public static native void nglGetTextureLevelParameterfvEXT(int texture, int target, int level, int pname, long params); + + public static void glGetTextureLevelParameterfvEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureLevelParameterfvEXT(texture, target, level, pname, memAddress(params)); + } + + @NativeType("void") + public static float glGetTextureLevelParameterfEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetTextureLevelParameterfvEXT(texture, target, level, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTextureLevelParameterivEXT ] --- + + public static native void nglGetTextureLevelParameterivEXT(int texture, int target, int level, int pname, long params); + + public static void glGetTextureLevelParameterivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureLevelParameterivEXT(texture, target, level, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetTextureLevelParameteriEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTextureLevelParameterivEXT(texture, target, level, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glTextureImage3DEXT ] --- + + public static native void nglTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, long pixels); + + public static void glTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + nglTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + public static void glTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + nglTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + nglTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + nglTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + public static void glTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + nglTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + // --- [ glTextureSubImage3DEXT ] --- + + public static native void nglTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels); + + public static void glTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + public static void glTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + public static void glTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + // --- [ glCopyTextureSubImage3DEXT ] --- + + public static native void glCopyTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glBindMultiTextureEXT ] --- + + public static native void glBindMultiTextureEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLuint") int texture); + + // --- [ glMultiTexCoordPointerEXT ] --- + + public static native void nglMultiTexCoordPointerEXT(int texunit, int size, int type, int stride, long pointer); + + public static void glMultiTexCoordPointerEXT(@NativeType("GLenum") int texunit, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglMultiTexCoordPointerEXT(texunit, size, type, stride, memAddress(pointer)); + } + + public static void glMultiTexCoordPointerEXT(@NativeType("GLenum") int texunit, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglMultiTexCoordPointerEXT(texunit, size, type, stride, pointer); + } + + public static void glMultiTexCoordPointerEXT(@NativeType("GLenum") int texunit, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglMultiTexCoordPointerEXT(texunit, size, type, stride, memAddress(pointer)); + } + + public static void glMultiTexCoordPointerEXT(@NativeType("GLenum") int texunit, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglMultiTexCoordPointerEXT(texunit, size, type, stride, memAddress(pointer)); + } + + public static void glMultiTexCoordPointerEXT(@NativeType("GLenum") int texunit, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglMultiTexCoordPointerEXT(texunit, size, type, stride, memAddress(pointer)); + } + + // --- [ glMultiTexEnvfEXT ] --- + + public static native void glMultiTexEnvfEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glMultiTexEnvfvEXT ] --- + + public static native void nglMultiTexEnvfvEXT(int texunit, int target, int pname, long params); + + public static void glMultiTexEnvfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglMultiTexEnvfvEXT(texunit, target, pname, memAddress(params)); + } + + // --- [ glMultiTexEnviEXT ] --- + + public static native void glMultiTexEnviEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glMultiTexEnvivEXT ] --- + + public static native void nglMultiTexEnvivEXT(int texunit, int target, int pname, long params); + + public static void glMultiTexEnvivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglMultiTexEnvivEXT(texunit, target, pname, memAddress(params)); + } + + // --- [ glMultiTexGendEXT ] --- + + public static native void glMultiTexGendEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLdouble") double param); + + // --- [ glMultiTexGendvEXT ] --- + + public static native void nglMultiTexGendvEXT(int texunit, int coord, int pname, long params); + + public static void glMultiTexGendvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLdouble const *") DoubleBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglMultiTexGendvEXT(texunit, coord, pname, memAddress(params)); + } + + // --- [ glMultiTexGenfEXT ] --- + + public static native void glMultiTexGenfEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glMultiTexGenfvEXT ] --- + + public static native void nglMultiTexGenfvEXT(int texunit, int coord, int pname, long params); + + public static void glMultiTexGenfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglMultiTexGenfvEXT(texunit, coord, pname, memAddress(params)); + } + + // --- [ glMultiTexGeniEXT ] --- + + public static native void glMultiTexGeniEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glMultiTexGenivEXT ] --- + + public static native void nglMultiTexGenivEXT(int texunit, int coord, int pname, long params); + + public static void glMultiTexGenivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglMultiTexGenivEXT(texunit, coord, pname, memAddress(params)); + } + + // --- [ glGetMultiTexEnvfvEXT ] --- + + public static native void nglGetMultiTexEnvfvEXT(int texunit, int target, int pname, long params); + + public static void glGetMultiTexEnvfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMultiTexEnvfvEXT(texunit, target, pname, memAddress(params)); + } + + @NativeType("void") + public static float glGetMultiTexEnvfEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetMultiTexEnvfvEXT(texunit, target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMultiTexEnvivEXT ] --- + + public static native void nglGetMultiTexEnvivEXT(int texunit, int target, int pname, long params); + + public static void glGetMultiTexEnvivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMultiTexEnvivEXT(texunit, target, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetMultiTexEnviEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetMultiTexEnvivEXT(texunit, target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMultiTexGendvEXT ] --- + + public static native void nglGetMultiTexGendvEXT(int texunit, int coord, int pname, long params); + + public static void glGetMultiTexGendvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMultiTexGendvEXT(texunit, coord, pname, memAddress(params)); + } + + @NativeType("void") + public static double glGetMultiTexGendEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer params = stack.callocDouble(1); + nglGetMultiTexGendvEXT(texunit, coord, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMultiTexGenfvEXT ] --- + + public static native void nglGetMultiTexGenfvEXT(int texunit, int coord, int pname, long params); + + public static void glGetMultiTexGenfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMultiTexGenfvEXT(texunit, coord, pname, memAddress(params)); + } + + @NativeType("void") + public static float glGetMultiTexGenfEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetMultiTexGenfvEXT(texunit, coord, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMultiTexGenivEXT ] --- + + public static native void nglGetMultiTexGenivEXT(int texunit, int coord, int pname, long params); + + public static void glGetMultiTexGenivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMultiTexGenivEXT(texunit, coord, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetMultiTexGeniEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetMultiTexGenivEXT(texunit, coord, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glMultiTexParameteriEXT ] --- + + public static native void glMultiTexParameteriEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glMultiTexParameterivEXT ] --- + + public static native void nglMultiTexParameterivEXT(int texunit, int target, int pname, long param); + + public static void glMultiTexParameterivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer param) { + if (CHECKS) { + check(param, 4); + } + nglMultiTexParameterivEXT(texunit, target, pname, memAddress(param)); + } + + // --- [ glMultiTexParameterfEXT ] --- + + public static native void glMultiTexParameterfEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glMultiTexParameterfvEXT ] --- + + public static native void nglMultiTexParameterfvEXT(int texunit, int target, int pname, long param); + + public static void glMultiTexParameterfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer param) { + if (CHECKS) { + check(param, 4); + } + nglMultiTexParameterfvEXT(texunit, target, pname, memAddress(param)); + } + + // --- [ glMultiTexImage1DEXT ] --- + + public static native void nglMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, int format, int type, long pixels); + + public static void glMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + nglMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels); + } + + public static void glMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + nglMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + nglMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + nglMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + nglMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + // --- [ glMultiTexImage2DEXT ] --- + + public static native void nglMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels); + + public static void glMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + nglMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels); + } + + public static void glMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + nglMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + nglMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + nglMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + nglMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + // --- [ glMultiTexSubImage1DEXT ] --- + + public static native void nglMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, int type, long pixels); + + public static void glMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels); + } + + public static void glMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, memAddress(pixels)); + } + + // --- [ glMultiTexSubImage2DEXT ] --- + + public static native void nglMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels); + + public static void glMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + public static void glMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + // --- [ glCopyMultiTexImage1DEXT ] --- + + public static native void glCopyMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLint") int border); + + // --- [ glCopyMultiTexImage2DEXT ] --- + + public static native void glCopyMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border); + + // --- [ glCopyMultiTexSubImage1DEXT ] --- + + public static native void glCopyMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width); + + // --- [ glCopyMultiTexSubImage2DEXT ] --- + + public static native void glCopyMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glGetMultiTexImageEXT ] --- + + public static native void nglGetMultiTexImageEXT(int texunit, int target, int level, int format, int type, long pixels); + + public static void glGetMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + nglGetMultiTexImageEXT(texunit, target, level, format, type, memAddress(pixels)); + } + + public static void glGetMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") long pixels) { + nglGetMultiTexImageEXT(texunit, target, level, format, type, pixels); + } + + public static void glGetMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + nglGetMultiTexImageEXT(texunit, target, level, format, type, memAddress(pixels)); + } + + public static void glGetMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + nglGetMultiTexImageEXT(texunit, target, level, format, type, memAddress(pixels)); + } + + public static void glGetMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + nglGetMultiTexImageEXT(texunit, target, level, format, type, memAddress(pixels)); + } + + public static void glGetMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer pixels) { + nglGetMultiTexImageEXT(texunit, target, level, format, type, memAddress(pixels)); + } + + // --- [ glGetMultiTexParameterfvEXT ] --- + + public static native void nglGetMultiTexParameterfvEXT(int texunit, int target, int pname, long params); + + public static void glGetMultiTexParameterfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMultiTexParameterfvEXT(texunit, target, pname, memAddress(params)); + } + + @NativeType("void") + public static float glGetMultiTexParameterfEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetMultiTexParameterfvEXT(texunit, target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMultiTexParameterivEXT ] --- + + public static native void nglGetMultiTexParameterivEXT(int texunit, int target, int pname, long params); + + public static void glGetMultiTexParameterivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMultiTexParameterivEXT(texunit, target, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetMultiTexParameteriEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetMultiTexParameterivEXT(texunit, target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMultiTexLevelParameterfvEXT ] --- + + public static native void nglGetMultiTexLevelParameterfvEXT(int texunit, int target, int level, int pname, long params); + + public static void glGetMultiTexLevelParameterfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, memAddress(params)); + } + + @NativeType("void") + public static float glGetMultiTexLevelParameterfEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMultiTexLevelParameterivEXT ] --- + + public static native void nglGetMultiTexLevelParameterivEXT(int texunit, int target, int level, int pname, long params); + + public static void glGetMultiTexLevelParameterivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMultiTexLevelParameterivEXT(texunit, target, level, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetMultiTexLevelParameteriEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetMultiTexLevelParameterivEXT(texunit, target, level, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glMultiTexImage3DEXT ] --- + + public static native void nglMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, long pixels); + + public static void glMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + nglMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + public static void glMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + nglMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + nglMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + nglMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + public static void glMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + nglMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + // --- [ glMultiTexSubImage3DEXT ] --- + + public static native void nglMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels); + + public static void glMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + public static void glMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + public static void glMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + // --- [ glCopyMultiTexSubImage3DEXT ] --- + + public static native void glCopyMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glEnableClientStateIndexedEXT ] --- + + public static native void glEnableClientStateIndexedEXT(@NativeType("GLenum") int array, @NativeType("GLuint") int index); + + // --- [ glDisableClientStateIndexedEXT ] --- + + public static native void glDisableClientStateIndexedEXT(@NativeType("GLenum") int array, @NativeType("GLuint") int index); + + // --- [ glEnableClientStateiEXT ] --- + + public static native void glEnableClientStateiEXT(@NativeType("GLenum") int array, @NativeType("GLuint") int index); + + // --- [ glDisableClientStateiEXT ] --- + + public static native void glDisableClientStateiEXT(@NativeType("GLenum") int array, @NativeType("GLuint") int index); + + // --- [ glGetFloatIndexedvEXT ] --- + + public static native void nglGetFloatIndexedvEXT(int target, int index, long params); + + public static void glGetFloatIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetFloatIndexedvEXT(target, index, memAddress(params)); + } + + @NativeType("void") + public static float glGetFloatIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetFloatIndexedvEXT(target, index, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetDoubleIndexedvEXT ] --- + + public static native void nglGetDoubleIndexedvEXT(int target, int index, long params); + + public static void glGetDoubleIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetDoubleIndexedvEXT(target, index, memAddress(params)); + } + + @NativeType("void") + public static double glGetDoubleIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer params = stack.callocDouble(1); + nglGetDoubleIndexedvEXT(target, index, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetPointerIndexedvEXT ] --- + + public static native void nglGetPointerIndexedvEXT(int target, int index, long params); + + public static void glGetPointerIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("void **") PointerBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetPointerIndexedvEXT(target, index, memAddress(params)); + } + + @NativeType("void") + public static long glGetPointerIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer params = stack.callocPointer(1); + nglGetPointerIndexedvEXT(target, index, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetFloati_vEXT ] --- + + public static native void nglGetFloati_vEXT(int pname, int index, long params); + + public static void glGetFloati_vEXT(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetFloati_vEXT(pname, index, memAddress(params)); + } + + @NativeType("void") + public static float glGetFloatiEXT(@NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetFloati_vEXT(pname, index, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetDoublei_vEXT ] --- + + public static native void nglGetDoublei_vEXT(int pname, int index, long params); + + public static void glGetDoublei_vEXT(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetDoublei_vEXT(pname, index, memAddress(params)); + } + + @NativeType("void") + public static double glGetDoubleiEXT(@NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer params = stack.callocDouble(1); + nglGetDoublei_vEXT(pname, index, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetPointeri_vEXT ] --- + + public static native void nglGetPointeri_vEXT(int pname, int index, long params); + + public static void glGetPointeri_vEXT(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("void **") PointerBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetPointeri_vEXT(pname, index, memAddress(params)); + } + + @NativeType("void") + public static long glGetPointeriEXT(@NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer params = stack.callocPointer(1); + nglGetPointeri_vEXT(pname, index, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glEnableIndexedEXT ] --- + + public static void glEnableIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + EXTDrawBuffers2.glEnableIndexedEXT(target, index); + } + + // --- [ glDisableIndexedEXT ] --- + + public static void glDisableIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + EXTDrawBuffers2.glDisableIndexedEXT(target, index); + } + + // --- [ glIsEnabledIndexedEXT ] --- + + @NativeType("GLboolean") + public static boolean glIsEnabledIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return EXTDrawBuffers2.glIsEnabledIndexedEXT(target, index); + } + + // --- [ glGetIntegerIndexedvEXT ] --- + + public static void nglGetIntegerIndexedvEXT(int target, int index, long data) { + EXTDrawBuffers2.nglGetIntegerIndexedvEXT(target, index, data); + } + + public static void glGetIntegerIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer data) { + EXTDrawBuffers2.glGetIntegerIndexedvEXT(target, index, data); + } + + @NativeType("void") + public static int glGetIntegerIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return EXTDrawBuffers2.glGetIntegerIndexedEXT(target, index); + } + + // --- [ glGetBooleanIndexedvEXT ] --- + + public static void nglGetBooleanIndexedvEXT(int target, int index, long data) { + EXTDrawBuffers2.nglGetBooleanIndexedvEXT(target, index, data); + } + + public static void glGetBooleanIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLboolean *") ByteBuffer data) { + EXTDrawBuffers2.glGetBooleanIndexedvEXT(target, index, data); + } + + @NativeType("void") + public static boolean glGetBooleanIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return EXTDrawBuffers2.glGetBooleanIndexedEXT(target, index); + } + + // --- [ glNamedProgramStringEXT ] --- + + public static native void nglNamedProgramStringEXT(int program, int target, int format, int len, long string); + + public static void glNamedProgramStringEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer string) { + nglNamedProgramStringEXT(program, target, format, string.remaining(), memAddress(string)); + } + + // --- [ glNamedProgramLocalParameter4dEXT ] --- + + public static native void glNamedProgramLocalParameter4dEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w); + + // --- [ glNamedProgramLocalParameter4dvEXT ] --- + + public static native void nglNamedProgramLocalParameter4dvEXT(int program, int target, int index, long params); + + public static void glNamedProgramLocalParameter4dvEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglNamedProgramLocalParameter4dvEXT(program, target, index, memAddress(params)); + } + + // --- [ glNamedProgramLocalParameter4fEXT ] --- + + public static native void glNamedProgramLocalParameter4fEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z, @NativeType("GLfloat") float w); + + // --- [ glNamedProgramLocalParameter4fvEXT ] --- + + public static native void nglNamedProgramLocalParameter4fvEXT(int program, int target, int index, long params); + + public static void glNamedProgramLocalParameter4fvEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglNamedProgramLocalParameter4fvEXT(program, target, index, memAddress(params)); + } + + // --- [ glGetNamedProgramLocalParameterdvEXT ] --- + + public static native void nglGetNamedProgramLocalParameterdvEXT(int program, int target, int index, long params); + + public static void glGetNamedProgramLocalParameterdvEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetNamedProgramLocalParameterdvEXT(program, target, index, memAddress(params)); + } + + // --- [ glGetNamedProgramLocalParameterfvEXT ] --- + + public static native void nglGetNamedProgramLocalParameterfvEXT(int program, int target, int index, long params); + + public static void glGetNamedProgramLocalParameterfvEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetNamedProgramLocalParameterfvEXT(program, target, index, memAddress(params)); + } + + // --- [ glGetNamedProgramivEXT ] --- + + public static native void nglGetNamedProgramivEXT(int program, int target, int pname, long params); + + public static void glGetNamedProgramivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedProgramivEXT(program, target, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetNamedProgramiEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetNamedProgramivEXT(program, target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetNamedProgramStringEXT ] --- + + public static native void nglGetNamedProgramStringEXT(int program, int target, int pname, long string); + + public static void glGetNamedProgramStringEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("void *") ByteBuffer string) { + if (CHECKS) { + if (DEBUG) { + check(string, glGetNamedProgramiEXT(program, target, ARBVertexProgram.GL_PROGRAM_LENGTH_ARB)); + } + } + nglGetNamedProgramStringEXT(program, target, pname, memAddress(string)); + } + + // --- [ glCompressedTextureImage3DEXT ] --- + + public static native void nglCompressedTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int imageSize, long data); + + public static void glCompressedTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, data); + } + + public static void glCompressedTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + nglCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, remainingSafe(data), memAddressSafe(data)); + } + + // --- [ glCompressedTextureImage2DEXT ] --- + + public static native void nglCompressedTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, int imageSize, long data); + + public static void glCompressedTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, data); + } + + public static void glCompressedTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + nglCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, remainingSafe(data), memAddressSafe(data)); + } + + // --- [ glCompressedTextureImage1DEXT ] --- + + public static native void nglCompressedTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, int imageSize, long data); + + public static void glCompressedTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, data); + } + + public static void glCompressedTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + nglCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, remainingSafe(data), memAddressSafe(data)); + } + + // --- [ glCompressedTextureSubImage3DEXT ] --- + + public static native void nglCompressedTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, long data); + + public static void glCompressedTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } + + public static void glCompressedTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedTextureSubImage2DEXT ] --- + + public static native void nglCompressedTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int imageSize, long data); + + public static void glCompressedTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, data); + } + + public static void glCompressedTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedTextureSubImage1DEXT ] --- + + public static native void nglCompressedTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, int imageSize, long data); + + public static void glCompressedTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, data); + } + + public static void glCompressedTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, data.remaining(), memAddress(data)); + } + + // --- [ glGetCompressedTextureImageEXT ] --- + + public static native void nglGetCompressedTextureImageEXT(int texture, int target, int level, long img); + + public static void glGetCompressedTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") ByteBuffer img) { + if (CHECKS) { + if (DEBUG) { + check(img, glGetTextureLevelParameteriEXT(texture, target, level, GL13.GL_TEXTURE_COMPRESSED_IMAGE_SIZE)); + } + } + nglGetCompressedTextureImageEXT(texture, target, level, memAddress(img)); + } + + public static void glGetCompressedTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") long img) { + nglGetCompressedTextureImageEXT(texture, target, level, img); + } + + // --- [ glCompressedMultiTexImage3DEXT ] --- + + public static native void nglCompressedMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int imageSize, long data); + + public static void glCompressedMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, data); + } + + public static void glCompressedMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + nglCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, remainingSafe(data), memAddressSafe(data)); + } + + // --- [ glCompressedMultiTexImage2DEXT ] --- + + public static native void nglCompressedMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, int imageSize, long data); + + public static void glCompressedMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, data); + } + + public static void glCompressedMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + nglCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, remainingSafe(data), memAddressSafe(data)); + } + + // --- [ glCompressedMultiTexImage1DEXT ] --- + + public static native void nglCompressedMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, int imageSize, long data); + + public static void glCompressedMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, data); + } + + public static void glCompressedMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + nglCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, remainingSafe(data), memAddressSafe(data)); + } + + // --- [ glCompressedMultiTexSubImage3DEXT ] --- + + public static native void nglCompressedMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, long data); + + public static void glCompressedMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } + + public static void glCompressedMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedMultiTexSubImage2DEXT ] --- + + public static native void nglCompressedMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int imageSize, long data); + + public static void glCompressedMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, data); + } + + public static void glCompressedMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedMultiTexSubImage1DEXT ] --- + + public static native void nglCompressedMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, int imageSize, long data); + + public static void glCompressedMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, data); + } + + public static void glCompressedMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, data.remaining(), memAddress(data)); + } + + // --- [ glGetCompressedMultiTexImageEXT ] --- + + public static native void nglGetCompressedMultiTexImageEXT(int texunit, int target, int level, long img); + + public static void glGetCompressedMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") ByteBuffer img) { + if (CHECKS) { + if (DEBUG) { + check(img, glGetMultiTexLevelParameteriEXT(texunit, target, level, GL13.GL_TEXTURE_COMPRESSED_IMAGE_SIZE)); + } + } + nglGetCompressedMultiTexImageEXT(texunit, target, level, memAddress(img)); + } + + public static void glGetCompressedMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") long img) { + nglGetCompressedMultiTexImageEXT(texunit, target, level, img); + } + + // --- [ glMatrixLoadTransposefEXT ] --- + + public static native void nglMatrixLoadTransposefEXT(int matrixMode, long m); + + public static void glMatrixLoadTransposefEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMatrixLoadTransposefEXT(matrixMode, memAddress(m)); + } + + // --- [ glMatrixLoadTransposedEXT ] --- + + public static native void nglMatrixLoadTransposedEXT(int matrixMode, long m); + + public static void glMatrixLoadTransposedEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble const *") DoubleBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMatrixLoadTransposedEXT(matrixMode, memAddress(m)); + } + + // --- [ glMatrixMultTransposefEXT ] --- + + public static native void nglMatrixMultTransposefEXT(int matrixMode, long m); + + public static void glMatrixMultTransposefEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMatrixMultTransposefEXT(matrixMode, memAddress(m)); + } + + // --- [ glMatrixMultTransposedEXT ] --- + + public static native void nglMatrixMultTransposedEXT(int matrixMode, long m); + + public static void glMatrixMultTransposedEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble const *") DoubleBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMatrixMultTransposedEXT(matrixMode, memAddress(m)); + } + + // --- [ glNamedBufferDataEXT ] --- + + public static native void nglNamedBufferDataEXT(int buffer, long size, long data, int usage); + + public static void glNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int usage) { + nglNamedBufferDataEXT(buffer, size, NULL, usage); + } + + public static void glNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") ByteBuffer data, @NativeType("GLenum") int usage) { + nglNamedBufferDataEXT(buffer, data.remaining(), memAddress(data), usage); + } + + public static void glNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") ShortBuffer data, @NativeType("GLenum") int usage) { + nglNamedBufferDataEXT(buffer, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data), usage); + } + + public static void glNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") IntBuffer data, @NativeType("GLenum") int usage) { + nglNamedBufferDataEXT(buffer, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), usage); + } + + public static void glNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") FloatBuffer data, @NativeType("GLenum") int usage) { + nglNamedBufferDataEXT(buffer, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), usage); + } + + public static void glNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") DoubleBuffer data, @NativeType("GLenum") int usage) { + nglNamedBufferDataEXT(buffer, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data), usage); + } + + // --- [ glNamedBufferSubDataEXT ] --- + + public static native void nglNamedBufferSubDataEXT(int buffer, long offset, long size, long data); + + public static void glNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") ByteBuffer data) { + nglNamedBufferSubDataEXT(buffer, offset, data.remaining(), memAddress(data)); + } + + public static void glNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") ShortBuffer data) { + nglNamedBufferSubDataEXT(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data)); + } + + public static void glNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") IntBuffer data) { + nglNamedBufferSubDataEXT(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + public static void glNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") FloatBuffer data) { + nglNamedBufferSubDataEXT(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + public static void glNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") DoubleBuffer data) { + nglNamedBufferSubDataEXT(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + // --- [ glMapNamedBufferEXT ] --- + + public static native long nglMapNamedBufferEXT(int buffer, int access); + + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBufferEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access) { + long __result = nglMapNamedBufferEXT(buffer, access); + return memByteBufferSafe(__result, glGetNamedBufferParameteriEXT(buffer, GL15.GL_BUFFER_SIZE)); + } + + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBufferEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access, @Nullable ByteBuffer old_buffer) { + long __result = nglMapNamedBufferEXT(buffer, access); + int length = glGetNamedBufferParameteriEXT(buffer, GL15.GL_BUFFER_SIZE); + return apiGetMappedBuffer(old_buffer, __result, length); + } + + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBufferEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access, long length, @Nullable ByteBuffer old_buffer) { + long __result = nglMapNamedBufferEXT(buffer, access); + return apiGetMappedBuffer(old_buffer, __result, (int)length); + } + + // --- [ glUnmapNamedBufferEXT ] --- + + @NativeType("GLboolean") + public static native boolean glUnmapNamedBufferEXT(@NativeType("GLuint") int buffer); + + // --- [ glGetNamedBufferParameterivEXT ] --- + + public static native void nglGetNamedBufferParameterivEXT(int buffer, int pname, long params); + + public static void glGetNamedBufferParameterivEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedBufferParameterivEXT(buffer, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetNamedBufferParameteriEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetNamedBufferParameterivEXT(buffer, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetNamedBufferSubDataEXT ] --- + + public static native void nglGetNamedBufferSubDataEXT(int buffer, long offset, long size, long data); + + public static void glGetNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") ByteBuffer data) { + nglGetNamedBufferSubDataEXT(buffer, offset, data.remaining(), memAddress(data)); + } + + public static void glGetNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") ShortBuffer data) { + nglGetNamedBufferSubDataEXT(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data)); + } + + public static void glGetNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") IntBuffer data) { + nglGetNamedBufferSubDataEXT(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + public static void glGetNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") FloatBuffer data) { + nglGetNamedBufferSubDataEXT(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + public static void glGetNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") DoubleBuffer data) { + nglGetNamedBufferSubDataEXT(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + // --- [ glProgramUniform1fEXT ] --- + + public static native void glProgramUniform1fEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float v0); + + // --- [ glProgramUniform2fEXT ] --- + + public static native void glProgramUniform2fEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1); + + // --- [ glProgramUniform3fEXT ] --- + + public static native void glProgramUniform3fEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2); + + // --- [ glProgramUniform4fEXT ] --- + + public static native void glProgramUniform4fEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2, @NativeType("GLfloat") float v3); + + // --- [ glProgramUniform1iEXT ] --- + + public static native void glProgramUniform1iEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int v0); + + // --- [ glProgramUniform2iEXT ] --- + + public static native void glProgramUniform2iEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1); + + // --- [ glProgramUniform3iEXT ] --- + + public static native void glProgramUniform3iEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1, @NativeType("GLint") int v2); + + // --- [ glProgramUniform4iEXT ] --- + + public static native void glProgramUniform4iEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1, @NativeType("GLint") int v2, @NativeType("GLint") int v3); + + // --- [ glProgramUniform1fvEXT ] --- + + public static native void nglProgramUniform1fvEXT(int program, int location, int count, long value); + + public static void glProgramUniform1fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniform1fvEXT(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform2fvEXT ] --- + + public static native void nglProgramUniform2fvEXT(int program, int location, int count, long value); + + public static void glProgramUniform2fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniform2fvEXT(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform3fvEXT ] --- + + public static native void nglProgramUniform3fvEXT(int program, int location, int count, long value); + + public static void glProgramUniform3fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniform3fvEXT(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform4fvEXT ] --- + + public static native void nglProgramUniform4fvEXT(int program, int location, int count, long value); + + public static void glProgramUniform4fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniform4fvEXT(program, location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glProgramUniform1ivEXT ] --- + + public static native void nglProgramUniform1ivEXT(int program, int location, int count, long value); + + public static void glProgramUniform1ivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglProgramUniform1ivEXT(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform2ivEXT ] --- + + public static native void nglProgramUniform2ivEXT(int program, int location, int count, long value); + + public static void glProgramUniform2ivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglProgramUniform2ivEXT(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform3ivEXT ] --- + + public static native void nglProgramUniform3ivEXT(int program, int location, int count, long value); + + public static void glProgramUniform3ivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglProgramUniform3ivEXT(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform4ivEXT ] --- + + public static native void nglProgramUniform4ivEXT(int program, int location, int count, long value); + + public static void glProgramUniform4ivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglProgramUniform4ivEXT(program, location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2fvEXT ] --- + + public static native void nglProgramUniformMatrix2fvEXT(int program, int location, int count, boolean transpose, long value); + + public static void glProgramUniformMatrix2fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix2fvEXT(program, location, value.remaining() >> 2, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3fvEXT ] --- + + public static native void nglProgramUniformMatrix3fvEXT(int program, int location, int count, boolean transpose, long value); + + public static void glProgramUniformMatrix3fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix3fvEXT(program, location, value.remaining() / 9, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4fvEXT ] --- + + public static native void nglProgramUniformMatrix4fvEXT(int program, int location, int count, boolean transpose, long value); + + public static void glProgramUniformMatrix4fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix4fvEXT(program, location, value.remaining() >> 4, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2x3fvEXT ] --- + + public static native void nglProgramUniformMatrix2x3fvEXT(int program, int location, int count, boolean transpose, long value); + + public static void glProgramUniformMatrix2x3fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix2x3fvEXT(program, location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3x2fvEXT ] --- + + public static native void nglProgramUniformMatrix3x2fvEXT(int program, int location, int count, boolean transpose, long value); + + public static void glProgramUniformMatrix3x2fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix3x2fvEXT(program, location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2x4fvEXT ] --- + + public static native void nglProgramUniformMatrix2x4fvEXT(int program, int location, int count, boolean transpose, long value); + + public static void glProgramUniformMatrix2x4fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix2x4fvEXT(program, location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4x2fvEXT ] --- + + public static native void nglProgramUniformMatrix4x2fvEXT(int program, int location, int count, boolean transpose, long value); + + public static void glProgramUniformMatrix4x2fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix4x2fvEXT(program, location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3x4fvEXT ] --- + + public static native void nglProgramUniformMatrix3x4fvEXT(int program, int location, int count, boolean transpose, long value); + + public static void glProgramUniformMatrix3x4fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix3x4fvEXT(program, location, value.remaining() / 12, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4x3fvEXT ] --- + + public static native void nglProgramUniformMatrix4x3fvEXT(int program, int location, int count, boolean transpose, long value); + + public static void glProgramUniformMatrix4x3fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix4x3fvEXT(program, location, value.remaining() / 12, transpose, memAddress(value)); + } + + // --- [ glTextureBufferEXT ] --- + + public static native void glTextureBufferEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer); + + // --- [ glMultiTexBufferEXT ] --- + + public static native void glMultiTexBufferEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer); + + // --- [ glTextureParameterIivEXT ] --- + + public static native void nglTextureParameterIivEXT(int texture, int target, int pname, long params); + + public static void glTextureParameterIivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglTextureParameterIivEXT(texture, target, pname, memAddress(params)); + } + + // --- [ glTextureParameterIuivEXT ] --- + + public static native void nglTextureParameterIuivEXT(int texture, int target, int pname, long params); + + public static void glTextureParameterIuivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglTextureParameterIuivEXT(texture, target, pname, memAddress(params)); + } + + // --- [ glGetTextureParameterIivEXT ] --- + + public static native void nglGetTextureParameterIivEXT(int texture, int target, int pname, long params); + + public static void glGetTextureParameterIivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureParameterIivEXT(texture, target, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetTextureParameterIiEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTextureParameterIivEXT(texture, target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTextureParameterIuivEXT ] --- + + public static native void nglGetTextureParameterIuivEXT(int texture, int target, int pname, long params); + + public static void glGetTextureParameterIuivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureParameterIuivEXT(texture, target, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetTextureParameterIuiEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTextureParameterIuivEXT(texture, target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glMultiTexParameterIivEXT ] --- + + public static native void nglMultiTexParameterIivEXT(int texunit, int target, int pname, long params); + + public static void glMultiTexParameterIivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglMultiTexParameterIivEXT(texunit, target, pname, memAddress(params)); + } + + // --- [ glMultiTexParameterIuivEXT ] --- + + public static native void nglMultiTexParameterIuivEXT(int texunit, int target, int pname, long params); + + public static void glMultiTexParameterIuivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglMultiTexParameterIuivEXT(texunit, target, pname, memAddress(params)); + } + + // --- [ glGetMultiTexParameterIivEXT ] --- + + public static native void nglGetMultiTexParameterIivEXT(int texunit, int target, int pname, long params); + + public static void glGetMultiTexParameterIivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMultiTexParameterIivEXT(texunit, target, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetMultiTexParameterIiEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetMultiTexParameterIivEXT(texunit, target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMultiTexParameterIuivEXT ] --- + + public static native void nglGetMultiTexParameterIuivEXT(int texunit, int target, int pname, long params); + + public static void glGetMultiTexParameterIuivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMultiTexParameterIuivEXT(texunit, target, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetMultiTexParameterIuiEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetMultiTexParameterIuivEXT(texunit, target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glProgramUniform1uiEXT ] --- + + public static native void glProgramUniform1uiEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int v0); + + // --- [ glProgramUniform2uiEXT ] --- + + public static native void glProgramUniform2uiEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1); + + // --- [ glProgramUniform3uiEXT ] --- + + public static native void glProgramUniform3uiEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1, @NativeType("GLuint") int v2); + + // --- [ glProgramUniform4uiEXT ] --- + + public static native void glProgramUniform4uiEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1, @NativeType("GLuint") int v2, @NativeType("GLuint") int v3); + + // --- [ glProgramUniform1uivEXT ] --- + + public static native void nglProgramUniform1uivEXT(int program, int location, int count, long value); + + public static void glProgramUniform1uivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglProgramUniform1uivEXT(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform2uivEXT ] --- + + public static native void nglProgramUniform2uivEXT(int program, int location, int count, long value); + + public static void glProgramUniform2uivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglProgramUniform2uivEXT(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform3uivEXT ] --- + + public static native void nglProgramUniform3uivEXT(int program, int location, int count, long value); + + public static void glProgramUniform3uivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglProgramUniform3uivEXT(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform4uivEXT ] --- + + public static native void nglProgramUniform4uivEXT(int program, int location, int count, long value); + + public static void glProgramUniform4uivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglProgramUniform4uivEXT(program, location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glNamedProgramLocalParameters4fvEXT ] --- + + public static native void nglNamedProgramLocalParameters4fvEXT(int program, int target, int index, int count, long params); + + public static void glNamedProgramLocalParameters4fvEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer params) { + nglNamedProgramLocalParameters4fvEXT(program, target, index, params.remaining() >> 2, memAddress(params)); + } + + // --- [ glNamedProgramLocalParameterI4iEXT ] --- + + public static native void glNamedProgramLocalParameterI4iEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w); + + // --- [ glNamedProgramLocalParameterI4ivEXT ] --- + + public static native void nglNamedProgramLocalParameterI4ivEXT(int program, int target, int index, long params); + + public static void glNamedProgramLocalParameterI4ivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglNamedProgramLocalParameterI4ivEXT(program, target, index, memAddress(params)); + } + + // --- [ glNamedProgramLocalParametersI4ivEXT ] --- + + public static native void nglNamedProgramLocalParametersI4ivEXT(int program, int target, int index, int count, long params); + + public static void glNamedProgramLocalParametersI4ivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer params) { + nglNamedProgramLocalParametersI4ivEXT(program, target, index, params.remaining() >> 2, memAddress(params)); + } + + // --- [ glNamedProgramLocalParameterI4uiEXT ] --- + + public static native void glNamedProgramLocalParameterI4uiEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int x, @NativeType("GLuint") int y, @NativeType("GLuint") int z, @NativeType("GLuint") int w); + + // --- [ glNamedProgramLocalParameterI4uivEXT ] --- + + public static native void nglNamedProgramLocalParameterI4uivEXT(int program, int target, int index, long params); + + public static void glNamedProgramLocalParameterI4uivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglNamedProgramLocalParameterI4uivEXT(program, target, index, memAddress(params)); + } + + // --- [ glNamedProgramLocalParametersI4uivEXT ] --- + + public static native void nglNamedProgramLocalParametersI4uivEXT(int program, int target, int index, int count, long params); + + public static void glNamedProgramLocalParametersI4uivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer params) { + nglNamedProgramLocalParametersI4uivEXT(program, target, index, params.remaining() >> 2, memAddress(params)); + } + + // --- [ glGetNamedProgramLocalParameterIivEXT ] --- + + public static native void nglGetNamedProgramLocalParameterIivEXT(int program, int target, int index, long params); + + public static void glGetNamedProgramLocalParameterIivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetNamedProgramLocalParameterIivEXT(program, target, index, memAddress(params)); + } + + // --- [ glGetNamedProgramLocalParameterIuivEXT ] --- + + public static native void nglGetNamedProgramLocalParameterIuivEXT(int program, int target, int index, long params); + + public static void glGetNamedProgramLocalParameterIuivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetNamedProgramLocalParameterIuivEXT(program, target, index, memAddress(params)); + } + + // --- [ glNamedRenderbufferStorageEXT ] --- + + public static native void glNamedRenderbufferStorageEXT(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glGetNamedRenderbufferParameterivEXT ] --- + + public static native void nglGetNamedRenderbufferParameterivEXT(int renderbuffer, int pname, long params); + + public static void glGetNamedRenderbufferParameterivEXT(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedRenderbufferParameterivEXT(renderbuffer, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetNamedRenderbufferParameteriEXT(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetNamedRenderbufferParameterivEXT(renderbuffer, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glNamedRenderbufferStorageMultisampleEXT ] --- + + public static native void glNamedRenderbufferStorageMultisampleEXT(@NativeType("GLuint") int renderbuffer, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glNamedRenderbufferStorageMultisampleCoverageEXT ] --- + + public static native void glNamedRenderbufferStorageMultisampleCoverageEXT(@NativeType("GLuint") int renderbuffer, @NativeType("GLsizei") int coverageSamples, @NativeType("GLsizei") int colorSamples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glCheckNamedFramebufferStatusEXT ] --- + + @NativeType("GLenum") + public static native int glCheckNamedFramebufferStatusEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int target); + + // --- [ glNamedFramebufferTexture1DEXT ] --- + + public static native void glNamedFramebufferTexture1DEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glNamedFramebufferTexture2DEXT ] --- + + public static native void glNamedFramebufferTexture2DEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glNamedFramebufferTexture3DEXT ] --- + + public static native void glNamedFramebufferTexture3DEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int zoffset); + + // --- [ glNamedFramebufferRenderbufferEXT ] --- + + public static native void glNamedFramebufferRenderbufferEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int renderbuffertarget, @NativeType("GLuint") int renderbuffer); + + // --- [ glGetNamedFramebufferAttachmentParameterivEXT ] --- + + public static native void nglGetNamedFramebufferAttachmentParameterivEXT(int framebuffer, int attachment, int pname, long params); + + public static void glGetNamedFramebufferAttachmentParameterivEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetNamedFramebufferAttachmentParameteriEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenerateTextureMipmapEXT ] --- + + public static native void glGenerateTextureMipmapEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target); + + // --- [ glGenerateMultiTexMipmapEXT ] --- + + public static native void glGenerateMultiTexMipmapEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target); + + // --- [ glFramebufferDrawBufferEXT ] --- + + public static native void glFramebufferDrawBufferEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int mode); + + // --- [ glFramebufferDrawBuffersEXT ] --- + + public static native void nglFramebufferDrawBuffersEXT(int framebuffer, int n, long bufs); + + public static void glFramebufferDrawBuffersEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") IntBuffer bufs) { + nglFramebufferDrawBuffersEXT(framebuffer, bufs.remaining(), memAddress(bufs)); + } + + // --- [ glFramebufferReadBufferEXT ] --- + + public static native void glFramebufferReadBufferEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int mode); + + // --- [ glGetFramebufferParameterivEXT ] --- + + public static native void nglGetFramebufferParameterivEXT(int framebuffer, int pname, long param); + + public static void glGetFramebufferParameterivEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + if (CHECKS) { + check(param, 1); + } + nglGetFramebufferParameterivEXT(framebuffer, pname, memAddress(param)); + } + + @NativeType("void") + public static int glGetFramebufferParameteriEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer param = stack.callocInt(1); + nglGetFramebufferParameterivEXT(framebuffer, pname, memAddress(param)); + return param.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glNamedCopyBufferSubDataEXT ] --- + + public static native void glNamedCopyBufferSubDataEXT(@NativeType("GLuint") int readBuffer, @NativeType("GLuint") int writeBuffer, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size); + + // --- [ glNamedFramebufferTextureEXT ] --- + + public static native void glNamedFramebufferTextureEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glNamedFramebufferTextureLayerEXT ] --- + + public static native void glNamedFramebufferTextureLayerEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer); + + // --- [ glNamedFramebufferTextureFaceEXT ] --- + + public static native void glNamedFramebufferTextureFaceEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int face); + + // --- [ glTextureRenderbufferEXT ] --- + + public static native void glTextureRenderbufferEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLuint") int renderbuffer); + + // --- [ glMultiTexRenderbufferEXT ] --- + + public static native void glMultiTexRenderbufferEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLuint") int renderbuffer); + + // --- [ glVertexArrayVertexOffsetEXT ] --- + + public static native void glVertexArrayVertexOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + // --- [ glVertexArrayColorOffsetEXT ] --- + + public static native void glVertexArrayColorOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + // --- [ glVertexArrayEdgeFlagOffsetEXT ] --- + + public static native void glVertexArrayEdgeFlagOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + // --- [ glVertexArrayIndexOffsetEXT ] --- + + public static native void glVertexArrayIndexOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + // --- [ glVertexArrayNormalOffsetEXT ] --- + + public static native void glVertexArrayNormalOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + // --- [ glVertexArrayTexCoordOffsetEXT ] --- + + public static native void glVertexArrayTexCoordOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + // --- [ glVertexArrayMultiTexCoordOffsetEXT ] --- + + public static native void glVertexArrayMultiTexCoordOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLenum") int texunit, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + // --- [ glVertexArrayFogCoordOffsetEXT ] --- + + public static native void glVertexArrayFogCoordOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + // --- [ glVertexArraySecondaryColorOffsetEXT ] --- + + public static native void glVertexArraySecondaryColorOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + // --- [ glVertexArrayVertexAttribOffsetEXT ] --- + + public static native void glVertexArrayVertexAttribOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + // --- [ glVertexArrayVertexAttribIOffsetEXT ] --- + + public static native void glVertexArrayVertexAttribIOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset); + + // --- [ glEnableVertexArrayEXT ] --- + + public static native void glEnableVertexArrayEXT(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int array); + + // --- [ glDisableVertexArrayEXT ] --- + + public static native void glDisableVertexArrayEXT(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int array); + + // --- [ glEnableVertexArrayAttribEXT ] --- + + public static native void glEnableVertexArrayAttribEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index); + + // --- [ glDisableVertexArrayAttribEXT ] --- + + public static native void glDisableVertexArrayAttribEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index); + + // --- [ glGetVertexArrayIntegervEXT ] --- + + public static native void nglGetVertexArrayIntegervEXT(int vaobj, int pname, long param); + + public static void glGetVertexArrayIntegervEXT(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + if (CHECKS) { + check(param, 1); + } + nglGetVertexArrayIntegervEXT(vaobj, pname, memAddress(param)); + } + + @NativeType("void") + public static int glGetVertexArrayIntegerEXT(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer param = stack.callocInt(1); + nglGetVertexArrayIntegervEXT(vaobj, pname, memAddress(param)); + return param.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexArrayPointervEXT ] --- + + public static native void nglGetVertexArrayPointervEXT(int vaobj, int pname, long param); + + public static void glGetVertexArrayPointervEXT(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer param) { + if (CHECKS) { + check(param, 1); + } + nglGetVertexArrayPointervEXT(vaobj, pname, memAddress(param)); + } + + @NativeType("void") + public static long glGetVertexArrayPointerEXT(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer param = stack.callocPointer(1); + nglGetVertexArrayPointervEXT(vaobj, pname, memAddress(param)); + return param.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexArrayIntegeri_vEXT ] --- + + public static native void nglGetVertexArrayIntegeri_vEXT(int vaobj, int index, int pname, long param); + + public static void glGetVertexArrayIntegeri_vEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + if (CHECKS) { + check(param, 1); + } + nglGetVertexArrayIntegeri_vEXT(vaobj, index, pname, memAddress(param)); + } + + @NativeType("void") + public static int glGetVertexArrayIntegeriEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer param = stack.callocInt(1); + nglGetVertexArrayIntegeri_vEXT(vaobj, index, pname, memAddress(param)); + return param.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexArrayPointeri_vEXT ] --- + + public static native void nglGetVertexArrayPointeri_vEXT(int vaobj, int index, int pname, long param); + + public static void glGetVertexArrayPointeri_vEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer param) { + if (CHECKS) { + check(param, 1); + } + nglGetVertexArrayPointeri_vEXT(vaobj, index, pname, memAddress(param)); + } + + @NativeType("void") + public static long glGetVertexArrayPointeriEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer param = stack.callocPointer(1); + nglGetVertexArrayPointeri_vEXT(vaobj, index, pname, memAddress(param)); + return param.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glMapNamedBufferRangeEXT ] --- + + public static native long nglMapNamedBufferRangeEXT(int buffer, long offset, long length, int access); + + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBufferRangeEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access) { + long __result = nglMapNamedBufferRangeEXT(buffer, offset, length, access); + return memByteBufferSafe(__result, (int)length); + } + + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBufferRangeEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access, @Nullable ByteBuffer old_buffer) { + long __result = nglMapNamedBufferRangeEXT(buffer, offset, length, access); + return apiGetMappedBuffer(old_buffer, __result, (int)length); + } + + // --- [ glFlushMappedNamedBufferRangeEXT ] --- + + public static native void glFlushMappedNamedBufferRangeEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length); + + /** Array version of: {@link #glMatrixLoadfEXT MatrixLoadfEXT} */ + public static void glMatrixLoadfEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMatrixLoadfEXT; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glMatrixLoaddEXT MatrixLoaddEXT} */ + public static void glMatrixLoaddEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble const *") double[] m) { + long __functionAddress = GL.getICD().glMatrixLoaddEXT; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glMatrixMultfEXT MatrixMultfEXT} */ + public static void glMatrixMultfEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMatrixMultfEXT; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glMatrixMultdEXT MatrixMultdEXT} */ + public static void glMatrixMultdEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble const *") double[] m) { + long __functionAddress = GL.getICD().glMatrixMultdEXT; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glTextureParameterivEXT TextureParameterivEXT} */ + public static void glTextureParameterivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] param) { + long __functionAddress = GL.getICD().glTextureParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(param, 4); + } + callPV(texture, target, pname, param, __functionAddress); + } + + /** Array version of: {@link #glTextureParameterfvEXT TextureParameterfvEXT} */ + public static void glTextureParameterfvEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] param) { + long __functionAddress = GL.getICD().glTextureParameterfvEXT; + if (CHECKS) { + check(__functionAddress); + check(param, 4); + } + callPV(texture, target, pname, param, __functionAddress); + } + + /** Array version of: {@link #glTextureImage1DEXT TextureImage1DEXT} */ + public static void glTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTextureImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureImage1DEXT TextureImage1DEXT} */ + public static void glTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTextureImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureImage1DEXT TextureImage1DEXT} */ + public static void glTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTextureImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureImage1DEXT TextureImage1DEXT} */ + public static void glTextureImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTextureImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureImage2DEXT TextureImage2DEXT} */ + public static void glTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTextureImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureImage2DEXT TextureImage2DEXT} */ + public static void glTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTextureImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureImage2DEXT TextureImage2DEXT} */ + public static void glTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTextureImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureImage2DEXT TextureImage2DEXT} */ + public static void glTextureImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTextureImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage1DEXT TextureSubImage1DEXT} */ + public static void glTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage1DEXT TextureSubImage1DEXT} */ + public static void glTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage1DEXT TextureSubImage1DEXT} */ + public static void glTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage1DEXT TextureSubImage1DEXT} */ + public static void glTextureSubImage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage2DEXT TextureSubImage2DEXT} */ + public static void glTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage2DEXT TextureSubImage2DEXT} */ + public static void glTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage2DEXT TextureSubImage2DEXT} */ + public static void glTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage2DEXT TextureSubImage2DEXT} */ + public static void glTextureSubImage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glGetTextureImageEXT GetTextureImageEXT} */ + public static void glGetTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + long __functionAddress = GL.getICD().glGetTextureImageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glGetTextureImageEXT GetTextureImageEXT} */ + public static void glGetTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + long __functionAddress = GL.getICD().glGetTextureImageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glGetTextureImageEXT GetTextureImageEXT} */ + public static void glGetTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + long __functionAddress = GL.getICD().glGetTextureImageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glGetTextureImageEXT GetTextureImageEXT} */ + public static void glGetTextureImageEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] pixels) { + long __functionAddress = GL.getICD().glGetTextureImageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glGetTextureParameterfvEXT GetTextureParameterfvEXT} */ + public static void glGetTextureParameterfvEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetTextureParameterfvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetTextureParameterivEXT GetTextureParameterivEXT} */ + public static void glGetTextureParameterivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetTextureParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetTextureLevelParameterfvEXT GetTextureLevelParameterfvEXT} */ + public static void glGetTextureLevelParameterfvEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetTextureLevelParameterfvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, target, level, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetTextureLevelParameterivEXT GetTextureLevelParameterivEXT} */ + public static void glGetTextureLevelParameterivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetTextureLevelParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, target, level, pname, params, __functionAddress); + } + + /** Array version of: {@link #glTextureImage3DEXT TextureImage3DEXT} */ + public static void glTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTextureImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureImage3DEXT TextureImage3DEXT} */ + public static void glTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTextureImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureImage3DEXT TextureImage3DEXT} */ + public static void glTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTextureImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureImage3DEXT TextureImage3DEXT} */ + public static void glTextureImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTextureImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage3DEXT TextureSubImage3DEXT} */ + public static void glTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage3DEXT TextureSubImage3DEXT} */ + public static void glTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage3DEXT TextureSubImage3DEXT} */ + public static void glTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glTextureSubImage3DEXT TextureSubImage3DEXT} */ + public static void glTextureSubImage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoordPointerEXT MultiTexCoordPointerEXT} */ + public static void glMultiTexCoordPointerEXT(@NativeType("GLenum") int texunit, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") short[] pointer) { + long __functionAddress = GL.getICD().glMultiTexCoordPointerEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, size, type, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoordPointerEXT MultiTexCoordPointerEXT} */ + public static void glMultiTexCoordPointerEXT(@NativeType("GLenum") int texunit, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") int[] pointer) { + long __functionAddress = GL.getICD().glMultiTexCoordPointerEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, size, type, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoordPointerEXT MultiTexCoordPointerEXT} */ + public static void glMultiTexCoordPointerEXT(@NativeType("GLenum") int texunit, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") float[] pointer) { + long __functionAddress = GL.getICD().glMultiTexCoordPointerEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, size, type, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glMultiTexEnvfvEXT MultiTexEnvfvEXT} */ + public static void glMultiTexEnvfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glMultiTexEnvfvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(texunit, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMultiTexEnvivEXT MultiTexEnvivEXT} */ + public static void glMultiTexEnvivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glMultiTexEnvivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(texunit, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMultiTexGendvEXT MultiTexGendvEXT} */ + public static void glMultiTexGendvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLdouble const *") double[] params) { + long __functionAddress = GL.getICD().glMultiTexGendvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(texunit, coord, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMultiTexGenfvEXT MultiTexGenfvEXT} */ + public static void glMultiTexGenfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glMultiTexGenfvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(texunit, coord, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMultiTexGenivEXT MultiTexGenivEXT} */ + public static void glMultiTexGenivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glMultiTexGenivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(texunit, coord, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexEnvfvEXT GetMultiTexEnvfvEXT} */ + public static void glGetMultiTexEnvfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetMultiTexEnvfvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texunit, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexEnvivEXT GetMultiTexEnvivEXT} */ + public static void glGetMultiTexEnvivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetMultiTexEnvivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texunit, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexGendvEXT GetMultiTexGendvEXT} */ + public static void glGetMultiTexGendvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetMultiTexGendvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texunit, coord, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexGenfvEXT GetMultiTexGenfvEXT} */ + public static void glGetMultiTexGenfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetMultiTexGenfvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texunit, coord, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexGenivEXT GetMultiTexGenivEXT} */ + public static void glGetMultiTexGenivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetMultiTexGenivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texunit, coord, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMultiTexParameterivEXT MultiTexParameterivEXT} */ + public static void glMultiTexParameterivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] param) { + long __functionAddress = GL.getICD().glMultiTexParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(param, 4); + } + callPV(texunit, target, pname, param, __functionAddress); + } + + /** Array version of: {@link #glMultiTexParameterfvEXT MultiTexParameterfvEXT} */ + public static void glMultiTexParameterfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] param) { + long __functionAddress = GL.getICD().glMultiTexParameterfvEXT; + if (CHECKS) { + check(__functionAddress); + check(param, 4); + } + callPV(texunit, target, pname, param, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage1DEXT MultiTexImage1DEXT} */ + public static void glMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage1DEXT MultiTexImage1DEXT} */ + public static void glMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage1DEXT MultiTexImage1DEXT} */ + public static void glMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage1DEXT MultiTexImage1DEXT} */ + public static void glMultiTexImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage2DEXT MultiTexImage2DEXT} */ + public static void glMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage2DEXT MultiTexImage2DEXT} */ + public static void glMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage2DEXT MultiTexImage2DEXT} */ + public static void glMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage2DEXT MultiTexImage2DEXT} */ + public static void glMultiTexImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage1DEXT MultiTexSubImage1DEXT} */ + public static void glMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage1DEXT MultiTexSubImage1DEXT} */ + public static void glMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage1DEXT MultiTexSubImage1DEXT} */ + public static void glMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage1DEXT MultiTexSubImage1DEXT} */ + public static void glMultiTexSubImage1DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage1DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage2DEXT MultiTexSubImage2DEXT} */ + public static void glMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage2DEXT MultiTexSubImage2DEXT} */ + public static void glMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage2DEXT MultiTexSubImage2DEXT} */ + public static void glMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage2DEXT MultiTexSubImage2DEXT} */ + public static void glMultiTexSubImage2DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage2DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexImageEXT GetMultiTexImageEXT} */ + public static void glGetMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + long __functionAddress = GL.getICD().glGetMultiTexImageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexImageEXT GetMultiTexImageEXT} */ + public static void glGetMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + long __functionAddress = GL.getICD().glGetMultiTexImageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexImageEXT GetMultiTexImageEXT} */ + public static void glGetMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + long __functionAddress = GL.getICD().glGetMultiTexImageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexImageEXT GetMultiTexImageEXT} */ + public static void glGetMultiTexImageEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] pixels) { + long __functionAddress = GL.getICD().glGetMultiTexImageEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexParameterfvEXT GetMultiTexParameterfvEXT} */ + public static void glGetMultiTexParameterfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetMultiTexParameterfvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texunit, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexParameterivEXT GetMultiTexParameterivEXT} */ + public static void glGetMultiTexParameterivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetMultiTexParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texunit, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexLevelParameterfvEXT GetMultiTexLevelParameterfvEXT} */ + public static void glGetMultiTexLevelParameterfvEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetMultiTexLevelParameterfvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texunit, target, level, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexLevelParameterivEXT GetMultiTexLevelParameterivEXT} */ + public static void glGetMultiTexLevelParameterivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetMultiTexLevelParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texunit, target, level, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage3DEXT MultiTexImage3DEXT} */ + public static void glMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage3DEXT MultiTexImage3DEXT} */ + public static void glMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage3DEXT MultiTexImage3DEXT} */ + public static void glMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexImage3DEXT MultiTexImage3DEXT} */ + public static void glMultiTexImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glMultiTexImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage3DEXT MultiTexSubImage3DEXT} */ + public static void glMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage3DEXT MultiTexSubImage3DEXT} */ + public static void glMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage3DEXT MultiTexSubImage3DEXT} */ + public static void glMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glMultiTexSubImage3DEXT MultiTexSubImage3DEXT} */ + public static void glMultiTexSubImage3DEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glMultiTexSubImage3DEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** Array version of: {@link #glGetFloatIndexedvEXT GetFloatIndexedvEXT} */ + public static void glGetFloatIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetFloatIndexedvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetDoubleIndexedvEXT GetDoubleIndexedvEXT} */ + public static void glGetDoubleIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetDoubleIndexedvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetFloati_vEXT GetFloati_vEXT} */ + public static void glGetFloati_vEXT(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetFloati_vEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pname, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetDoublei_vEXT GetDoublei_vEXT} */ + public static void glGetDoublei_vEXT(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetDoublei_vEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pname, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetIntegerIndexedvEXT GetIntegerIndexedvEXT} */ + public static void glGetIntegerIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") int[] data) { + EXTDrawBuffers2.glGetIntegerIndexedvEXT(target, index, data); + } + + /** Array version of: {@link #glNamedProgramLocalParameter4dvEXT NamedProgramLocalParameter4dvEXT} */ + public static void glNamedProgramLocalParameter4dvEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] params) { + long __functionAddress = GL.getICD().glNamedProgramLocalParameter4dvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(program, target, index, params, __functionAddress); + } + + /** Array version of: {@link #glNamedProgramLocalParameter4fvEXT NamedProgramLocalParameter4fvEXT} */ + public static void glNamedProgramLocalParameter4fvEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glNamedProgramLocalParameter4fvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(program, target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetNamedProgramLocalParameterdvEXT GetNamedProgramLocalParameterdvEXT} */ + public static void glGetNamedProgramLocalParameterdvEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetNamedProgramLocalParameterdvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(program, target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetNamedProgramLocalParameterfvEXT GetNamedProgramLocalParameterfvEXT} */ + public static void glGetNamedProgramLocalParameterfvEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetNamedProgramLocalParameterfvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(program, target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetNamedProgramivEXT GetNamedProgramivEXT} */ + public static void glGetNamedProgramivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedProgramivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMatrixLoadTransposefEXT MatrixLoadTransposefEXT} */ + public static void glMatrixLoadTransposefEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMatrixLoadTransposefEXT; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glMatrixLoadTransposedEXT MatrixLoadTransposedEXT} */ + public static void glMatrixLoadTransposedEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble const *") double[] m) { + long __functionAddress = GL.getICD().glMatrixLoadTransposedEXT; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glMatrixMultTransposefEXT MatrixMultTransposefEXT} */ + public static void glMatrixMultTransposefEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMatrixMultTransposefEXT; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glMatrixMultTransposedEXT MatrixMultTransposedEXT} */ + public static void glMatrixMultTransposedEXT(@NativeType("GLenum") int matrixMode, @NativeType("GLdouble const *") double[] m) { + long __functionAddress = GL.getICD().glMatrixMultTransposedEXT; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glNamedBufferDataEXT NamedBufferDataEXT} */ + public static void glNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") short[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glNamedBufferDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 1, data, usage, __functionAddress); + } + + /** Array version of: {@link #glNamedBufferDataEXT NamedBufferDataEXT} */ + public static void glNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") int[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glNamedBufferDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 2, data, usage, __functionAddress); + } + + /** Array version of: {@link #glNamedBufferDataEXT NamedBufferDataEXT} */ + public static void glNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") float[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glNamedBufferDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 2, data, usage, __functionAddress); + } + + /** Array version of: {@link #glNamedBufferDataEXT NamedBufferDataEXT} */ + public static void glNamedBufferDataEXT(@NativeType("GLuint") int buffer, @NativeType("void const *") double[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glNamedBufferDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 3, data, usage, __functionAddress); + } + + /** Array version of: {@link #glNamedBufferSubDataEXT NamedBufferSubDataEXT} */ + public static void glNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glNamedBufferSubDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 1, data, __functionAddress); + } + + /** Array version of: {@link #glNamedBufferSubDataEXT NamedBufferSubDataEXT} */ + public static void glNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glNamedBufferSubDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** Array version of: {@link #glNamedBufferSubDataEXT NamedBufferSubDataEXT} */ + public static void glNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glNamedBufferSubDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** Array version of: {@link #glNamedBufferSubDataEXT NamedBufferSubDataEXT} */ + public static void glNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") double[] data) { + long __functionAddress = GL.getICD().glNamedBufferSubDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** Array version of: {@link #glGetNamedBufferParameterivEXT GetNamedBufferParameterivEXT} */ + public static void glGetNamedBufferParameterivEXT(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedBufferParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(buffer, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetNamedBufferSubDataEXT GetNamedBufferSubDataEXT} */ + public static void glGetNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") short[] data) { + long __functionAddress = GL.getICD().glGetNamedBufferSubDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 1, data, __functionAddress); + } + + /** Array version of: {@link #glGetNamedBufferSubDataEXT GetNamedBufferSubDataEXT} */ + public static void glGetNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") int[] data) { + long __functionAddress = GL.getICD().glGetNamedBufferSubDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** Array version of: {@link #glGetNamedBufferSubDataEXT GetNamedBufferSubDataEXT} */ + public static void glGetNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") float[] data) { + long __functionAddress = GL.getICD().glGetNamedBufferSubDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** Array version of: {@link #glGetNamedBufferSubDataEXT GetNamedBufferSubDataEXT} */ + public static void glGetNamedBufferSubDataEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") double[] data) { + long __functionAddress = GL.getICD().glGetNamedBufferSubDataEXT; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform1fvEXT ProgramUniform1fvEXT} */ + public static void glProgramUniform1fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniform1fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform2fvEXT ProgramUniform2fvEXT} */ + public static void glProgramUniform2fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniform2fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform3fvEXT ProgramUniform3fvEXT} */ + public static void glProgramUniform3fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniform3fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform4fvEXT ProgramUniform4fvEXT} */ + public static void glProgramUniform4fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniform4fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform1ivEXT ProgramUniform1ivEXT} */ + public static void glProgramUniform1ivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform1ivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform2ivEXT ProgramUniform2ivEXT} */ + public static void glProgramUniform2ivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform2ivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform3ivEXT ProgramUniform3ivEXT} */ + public static void glProgramUniform3ivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform3ivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform4ivEXT ProgramUniform4ivEXT} */ + public static void glProgramUniform4ivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform4ivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix2fvEXT ProgramUniformMatrix2fvEXT} */ + public static void glProgramUniformMatrix2fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix3fvEXT ProgramUniformMatrix3fvEXT} */ + public static void glProgramUniformMatrix3fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 9, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix4fvEXT ProgramUniformMatrix4fvEXT} */ + public static void glProgramUniformMatrix4fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 4, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix2x3fvEXT ProgramUniformMatrix2x3fvEXT} */ + public static void glProgramUniformMatrix2x3fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2x3fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 6, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix3x2fvEXT ProgramUniformMatrix3x2fvEXT} */ + public static void glProgramUniformMatrix3x2fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3x2fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 6, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix2x4fvEXT ProgramUniformMatrix2x4fvEXT} */ + public static void glProgramUniformMatrix2x4fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2x4fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 3, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix4x2fvEXT ProgramUniformMatrix4x2fvEXT} */ + public static void glProgramUniformMatrix4x2fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4x2fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 3, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix3x4fvEXT ProgramUniformMatrix3x4fvEXT} */ + public static void glProgramUniformMatrix3x4fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3x4fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 12, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformMatrix4x3fvEXT ProgramUniformMatrix4x3fvEXT} */ + public static void glProgramUniformMatrix4x3fvEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4x3fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 12, transpose, value, __functionAddress); + } + + /** Array version of: {@link #glTextureParameterIivEXT TextureParameterIivEXT} */ + public static void glTextureParameterIivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glTextureParameterIivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(texture, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glTextureParameterIuivEXT TextureParameterIuivEXT} */ + public static void glTextureParameterIuivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int[] params) { + long __functionAddress = GL.getICD().glTextureParameterIuivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(texture, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetTextureParameterIivEXT GetTextureParameterIivEXT} */ + public static void glGetTextureParameterIivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetTextureParameterIivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetTextureParameterIuivEXT GetTextureParameterIuivEXT} */ + public static void glGetTextureParameterIuivEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetTextureParameterIuivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMultiTexParameterIivEXT MultiTexParameterIivEXT} */ + public static void glMultiTexParameterIivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glMultiTexParameterIivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(texunit, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMultiTexParameterIuivEXT MultiTexParameterIuivEXT} */ + public static void glMultiTexParameterIuivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int[] params) { + long __functionAddress = GL.getICD().glMultiTexParameterIuivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(texunit, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexParameterIivEXT GetMultiTexParameterIivEXT} */ + public static void glGetMultiTexParameterIivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetMultiTexParameterIivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texunit, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMultiTexParameterIuivEXT GetMultiTexParameterIuivEXT} */ + public static void glGetMultiTexParameterIuivEXT(@NativeType("GLenum") int texunit, @NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetMultiTexParameterIuivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texunit, target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform1uivEXT ProgramUniform1uivEXT} */ + public static void glProgramUniform1uivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform1uivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform2uivEXT ProgramUniform2uivEXT} */ + public static void glProgramUniform2uivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform2uivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform3uivEXT ProgramUniform3uivEXT} */ + public static void glProgramUniform3uivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform3uivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform4uivEXT ProgramUniform4uivEXT} */ + public static void glProgramUniform4uivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform4uivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glNamedProgramLocalParameters4fvEXT NamedProgramLocalParameters4fvEXT} */ + public static void glNamedProgramLocalParameters4fvEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glNamedProgramLocalParameters4fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, target, index, params.length >> 2, params, __functionAddress); + } + + /** Array version of: {@link #glNamedProgramLocalParameterI4ivEXT NamedProgramLocalParameterI4ivEXT} */ + public static void glNamedProgramLocalParameterI4ivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glNamedProgramLocalParameterI4ivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(program, target, index, params, __functionAddress); + } + + /** Array version of: {@link #glNamedProgramLocalParametersI4ivEXT NamedProgramLocalParametersI4ivEXT} */ + public static void glNamedProgramLocalParametersI4ivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glNamedProgramLocalParametersI4ivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, target, index, params.length >> 2, params, __functionAddress); + } + + /** Array version of: {@link #glNamedProgramLocalParameterI4uivEXT NamedProgramLocalParameterI4uivEXT} */ + public static void glNamedProgramLocalParameterI4uivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint const *") int[] params) { + long __functionAddress = GL.getICD().glNamedProgramLocalParameterI4uivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(program, target, index, params, __functionAddress); + } + + /** Array version of: {@link #glNamedProgramLocalParametersI4uivEXT NamedProgramLocalParametersI4uivEXT} */ + public static void glNamedProgramLocalParametersI4uivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint const *") int[] params) { + long __functionAddress = GL.getICD().glNamedProgramLocalParametersI4uivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, target, index, params.length >> 2, params, __functionAddress); + } + + /** Array version of: {@link #glGetNamedProgramLocalParameterIivEXT GetNamedProgramLocalParameterIivEXT} */ + public static void glGetNamedProgramLocalParameterIivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedProgramLocalParameterIivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(program, target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetNamedProgramLocalParameterIuivEXT GetNamedProgramLocalParameterIuivEXT} */ + public static void glGetNamedProgramLocalParameterIuivEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedProgramLocalParameterIuivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(program, target, index, params, __functionAddress); + } + + /** Array version of: {@link #glGetNamedRenderbufferParameterivEXT GetNamedRenderbufferParameterivEXT} */ + public static void glGetNamedRenderbufferParameterivEXT(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedRenderbufferParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(renderbuffer, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetNamedFramebufferAttachmentParameterivEXT GetNamedFramebufferAttachmentParameterivEXT} */ + public static void glGetNamedFramebufferAttachmentParameterivEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedFramebufferAttachmentParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(framebuffer, attachment, pname, params, __functionAddress); + } + + /** Array version of: {@link #glFramebufferDrawBuffersEXT FramebufferDrawBuffersEXT} */ + public static void glFramebufferDrawBuffersEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int[] bufs) { + long __functionAddress = GL.getICD().glFramebufferDrawBuffersEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(framebuffer, bufs.length, bufs, __functionAddress); + } + + /** Array version of: {@link #glGetFramebufferParameterivEXT GetFramebufferParameterivEXT} */ + public static void glGetFramebufferParameterivEXT(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + long __functionAddress = GL.getICD().glGetFramebufferParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(param, 1); + } + callPV(framebuffer, pname, param, __functionAddress); + } + + /** Array version of: {@link #glGetVertexArrayIntegervEXT GetVertexArrayIntegervEXT} */ + public static void glGetVertexArrayIntegervEXT(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + long __functionAddress = GL.getICD().glGetVertexArrayIntegervEXT; + if (CHECKS) { + check(__functionAddress); + check(param, 1); + } + callPV(vaobj, pname, param, __functionAddress); + } + + /** Array version of: {@link #glGetVertexArrayIntegeri_vEXT GetVertexArrayIntegeri_vEXT} */ + public static void glGetVertexArrayIntegeri_vEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + long __functionAddress = GL.getICD().glGetVertexArrayIntegeri_vEXT; + if (CHECKS) { + check(__functionAddress); + check(param, 1); + } + callPV(vaobj, index, pname, param, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDrawBuffers2.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDrawBuffers2.java new file mode 100644 index 000000000..22081fcad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDrawBuffers2.java @@ -0,0 +1,109 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_draw_buffers2 extension. + * + *

    This extension builds upon the ARB_draw_buffers extension and provides separate blend enables and color write masks for each color output. In + * ARB_draw_buffers (part of OpenGL 2.0), separate values can be written to each color buffer, but the blend enable and color write mask are global and + * apply to all color outputs.

    + * + *

    While this extension does provide separate blend enables, it does not provide separate blend functions or blend equations per color output.

    + * + *

    Requires {@link GL20 OpenGL 2.0}.

    + */ +public class EXTDrawBuffers2 { + + static { GL.initialize(); } + + protected EXTDrawBuffers2() { + throw new UnsupportedOperationException(); + } + + // --- [ glColorMaskIndexedEXT ] --- + + public static native void glColorMaskIndexedEXT(@NativeType("GLuint") int index, @NativeType("GLboolean") boolean r, @NativeType("GLboolean") boolean g, @NativeType("GLboolean") boolean b, @NativeType("GLboolean") boolean a); + + // --- [ glGetBooleanIndexedvEXT ] --- + + public static native void nglGetBooleanIndexedvEXT(int target, int index, long data); + + public static void glGetBooleanIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLboolean *") ByteBuffer data) { + if (CHECKS) { + check(data, 1); + } + nglGetBooleanIndexedvEXT(target, index, memAddress(data)); + } + + @NativeType("void") + public static boolean glGetBooleanIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + ByteBuffer data = stack.calloc(1); + nglGetBooleanIndexedvEXT(target, index, memAddress(data)); + return data.get(0) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetIntegerIndexedvEXT ] --- + + public static native void nglGetIntegerIndexedvEXT(int target, int index, long data); + + public static void glGetIntegerIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer data) { + if (CHECKS) { + check(data, 1); + } + nglGetIntegerIndexedvEXT(target, index, memAddress(data)); + } + + @NativeType("void") + public static int glGetIntegerIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer data = stack.callocInt(1); + nglGetIntegerIndexedvEXT(target, index, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glEnableIndexedEXT ] --- + + public static native void glEnableIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index); + + // --- [ glDisableIndexedEXT ] --- + + public static native void glDisableIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index); + + // --- [ glIsEnabledIndexedEXT ] --- + + @NativeType("GLboolean") + public static native boolean glIsEnabledIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index); + + /** Array version of: {@link #glGetIntegerIndexedvEXT GetIntegerIndexedvEXT} */ + public static void glGetIntegerIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") int[] data) { + long __functionAddress = GL.getICD().glGetIntegerIndexedvEXT; + if (CHECKS) { + check(__functionAddress); + check(data, 1); + } + callPV(target, index, data, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDrawInstanced.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDrawInstanced.java new file mode 100644 index 000000000..5eb030050 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTDrawInstanced.java @@ -0,0 +1,58 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_draw_instanced extension. + * + *

    This extension provides the means to render multiple instances of an object with a single draw call, and an "instance ID" variable which can be used by + * the vertex program to compute per-instance values, typically an object's transform.

    + * + *

    Requires {@link GL20 OpenGL 2.0}.

    + */ +public class EXTDrawInstanced { + + static { GL.initialize(); } + + protected EXTDrawInstanced() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawArraysInstancedEXT ] --- + + public static native void glDrawArraysInstancedEXT(@NativeType("GLenum") int mode, @NativeType("GLint") int start, @NativeType("GLsizei") int count, @NativeType("GLsizei") int primcount); + + // --- [ glDrawElementsInstancedEXT ] --- + + public static native void nglDrawElementsInstancedEXT(int mode, int count, int type, long indices, int primcount); + + public static void glDrawElementsInstancedEXT(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstancedEXT(mode, count, type, indices, primcount); + } + + public static void glDrawElementsInstancedEXT(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstancedEXT(mode, indices.remaining() >> GLChecks.typeToByteShift(type), type, memAddress(indices), primcount); + } + + public static void glDrawElementsInstancedEXT(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstancedEXT(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, memAddress(indices), primcount); + } + + public static void glDrawElementsInstancedEXT(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstancedEXT(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, memAddress(indices), primcount); + } + + public static void glDrawElementsInstancedEXT(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstancedEXT(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, memAddress(indices), primcount); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTEGLImageStorage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTEGLImageStorage.java new file mode 100644 index 000000000..3c29aac4c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTEGLImageStorage.java @@ -0,0 +1,87 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_EGL_image_storage extension. + * + *

    The OpenGL ES extension {@code OES_EGL_image} provides a mechanism for creating GL textures sharing storage with {@code EGLImage} objects (in other + * words, creating GL texture {@code EGLImage} targets). The extension was written against the OpenGL ES 2.0 specification, which does not have the + * concept of immutable textures. As a result, it specifies that respecification of a texture by calling {@code TexImage*} on a texture that is an + * {@code EGLImage} target causes it to be implicitly orphaned. In most cases, this is not the desired behavior, but rather a result of an application + * error.

    + * + *

    This extension provides a mechanism for creating texture objects that are both {@code EGLImage} targets and immutable. Since immutable textures cannot + * be respecified, they also cannot accidentally be orphaned, and attempts to do so generate errors instead of resulting in well-defined, but often + * undesirable and surprising behavior. It provides a strong guarantee that texture data that is intended to be shared will remain shared.

    + * + *

    Requires {@link GL42 OpenGL 4.2} or {@link ARBTextureStorage ARB_texture_storage}. Requires EGL 1.4 and either the {@code EGL_KHR_image} or {@code EGL_KHR_image_base} extensions.

    + */ +public class EXTEGLImageStorage { + + static { GL.initialize(); } + + protected EXTEGLImageStorage() { + throw new UnsupportedOperationException(); + } + + // --- [ glEGLImageTargetTexStorageEXT ] --- + + public static native void nglEGLImageTargetTexStorageEXT(int target, long image, long attrib_list); + + public static void glEGLImageTargetTexStorageEXT(@NativeType("GLenum") int target, @NativeType("GLeglImageOES") long image, @Nullable @NativeType("int const *") IntBuffer attrib_list) { + if (CHECKS) { + check(image); + checkNTSafe(attrib_list); + } + nglEGLImageTargetTexStorageEXT(target, image, memAddressSafe(attrib_list)); + } + + // --- [ glEGLImageTargetTextureStorageEXT ] --- + + public static native void nglEGLImageTargetTextureStorageEXT(int texture, long image, long attrib_list); + + public static void glEGLImageTargetTextureStorageEXT(@NativeType("GLuint") int texture, @NativeType("GLeglImageOES") long image, @Nullable @NativeType("int const *") IntBuffer attrib_list) { + if (CHECKS) { + check(image); + checkNTSafe(attrib_list); + } + nglEGLImageTargetTextureStorageEXT(texture, image, memAddressSafe(attrib_list)); + } + + /** Array version of: {@link #glEGLImageTargetTexStorageEXT EGLImageTargetTexStorageEXT} */ + public static void glEGLImageTargetTexStorageEXT(@NativeType("GLenum") int target, @NativeType("GLeglImageOES") long image, @Nullable @NativeType("int const *") int[] attrib_list) { + long __functionAddress = GL.getICD().glEGLImageTargetTexStorageEXT; + if (CHECKS) { + check(__functionAddress); + check(image); + checkNTSafe(attrib_list); + } + callPPV(target, image, attrib_list, __functionAddress); + } + + /** Array version of: {@link #glEGLImageTargetTextureStorageEXT EGLImageTargetTextureStorageEXT} */ + public static void glEGLImageTargetTextureStorageEXT(@NativeType("GLuint") int texture, @NativeType("GLeglImageOES") long image, @Nullable @NativeType("int const *") int[] attrib_list) { + long __functionAddress = GL.getICD().glEGLImageTargetTextureStorageEXT; + if (CHECKS) { + check(__functionAddress); + check(image); + checkNTSafe(attrib_list); + } + callPPV(texture, image, attrib_list, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTExternalBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTExternalBuffer.java new file mode 100644 index 000000000..858056beb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTExternalBuffer.java @@ -0,0 +1,69 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; + +/** + * Native bindings to the EXT_external_buffer extension. + * + *

    Extension EXT_buffer_storage introduced immutable storage buffers to OpenGL ES. This extension allows the data store for an immutable buffer to be + * sourced from an external {@code EGLClientBuffer}, allowing sharing of EGL client buffers across APIs, across processes, and across different processing + * cores such as the GPU, CPU, and DSP.

    + * + *

    Operations can then be performed on the external buffer using standard GL buffer object procedures. The data in the allocation is not copied to the + * buffer object's data store; the external allocation represents a single memory allocation that can be shared across multiple GL objects -- this aspect + * is similar to EGL external images. On the other hand, the external buffer does not provide lifetime guarantees including orphaning and sibling behavior + * as provided by EGL external images.

    + * + *

    The {@code EGLClientBuffer} must be allocated in a way which permits this shared access. For example, on Android via a shareable Android hardware + * buffer. This extension does not enable support for arbitrary {@code EGLClientBuffers} to be used as an external buffer.

    + * + *

    It is the application's responsibility to ensure synchronization between operations performed by separate components (DSP / CPU / GPU) and processes on + * the external buffer. Additionally the application is responsible for avoiding violating existing GL spec requirements. For example, mapping a single + * shared allocation to two GL buffer objects and then performing {@code CopyBufferSubData} such that the read and write regions overlap would violate the + * existing {@code CopyBufferSubData} spec regarding copies performed with the same buffer set for source and destination.

    + * + *

    The application must take any steps necessary to ensure memory access to the external buffer behaves as required by the application. For example, + * preventing compilation differences in data padding from causing data to be inadvertently corrupted by using defined structure alignment methods such as + * the std140 layout qualifier. The application is responsible for managing the lifetime of the external buffer, ensuring that the external buffer is not + * deleted as long as there are any GL buffer objects referring to it.

    + * + *

    Requires {@link GL44 OpenGL 4.4}.

    + */ +public class EXTExternalBuffer { + + static { GL.initialize(); } + + protected EXTExternalBuffer() { + throw new UnsupportedOperationException(); + } + + // --- [ glBufferStorageExternalEXT ] --- + + public static native void nglBufferStorageExternalEXT(int target, long offset, long size, long clientBuffer, int flags); + + public static void glBufferStorageExternalEXT(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLeglClientBufferEXT") long clientBuffer, @NativeType("GLbitfield") int flags) { + if (CHECKS) { + check(clientBuffer); + } + nglBufferStorageExternalEXT(target, offset, size, clientBuffer, flags); + } + + // --- [ glNamedBufferStorageExternalEXT ] --- + + public static native void nglNamedBufferStorageExternalEXT(int buffer, long offset, long size, long clientBuffer, int flags); + + public static void glNamedBufferStorageExternalEXT(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLeglClientBufferEXT") long clientBuffer, @NativeType("GLbitfield") int flags) { + if (CHECKS) { + check(clientBuffer); + } + nglNamedBufferStorageExternalEXT(buffer, offset, size, clientBuffer, flags); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferBlit.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferBlit.java new file mode 100644 index 000000000..33db7ca83 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferBlit.java @@ -0,0 +1,44 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_framebuffer_blit extension. + * + *

    This extension modifies EXT_framebuffer_object by splitting the framebuffer object binding point into separate DRAW and READ bindings. This allows + * copying directly from one framebuffer to another. In addition, a new high performance blit function is added to facilitate these blits and perform some + * data conversion where allowed.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public class EXTFramebufferBlit { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameter of BindFramebufferEXT, CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT, FramebufferRenderbufferEXT, + * and GetFramebufferAttachmentParameterivEXT. + */ + public static final int + GL_READ_FRAMEBUFFER_EXT = 0x8CA8, + GL_DRAW_FRAMEBUFFER_EXT = 0x8CA9; + + /** Accepted by the {@code pname} parameters of GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_DRAW_FRAMEBUFFER_BINDING_EXT = 0x8CA6, + GL_READ_FRAMEBUFFER_BINDING_EXT = 0x8CAA; + + protected EXTFramebufferBlit() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlitFramebufferEXT ] --- + + public static native void glBlitFramebufferEXT(@NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferBlitLayers.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferBlitLayers.java new file mode 100644 index 000000000..9df8ab86a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferBlitLayers.java @@ -0,0 +1,33 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_framebuffer_blit_layers extension. + * + *

    This extensions defines the behaviour for copying data from one layered framebuffer to another layered framebuffer.

    + * + *

    Requires {@link GL30 OpenGL 3.0} or {@link EXTFramebufferBlit EXT_framebuffer_blit}.

    + */ +public class EXTFramebufferBlitLayers { + + static { GL.initialize(); } + + protected EXTFramebufferBlitLayers() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlitFramebufferLayersEXT ] --- + + public static native void glBlitFramebufferLayersEXT(@NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter); + + // --- [ glBlitFramebufferLayerEXT ] --- + + public static native void glBlitFramebufferLayerEXT(@NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int srcLayer, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLint") int dstLayer, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferMultisample.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferMultisample.java new file mode 100644 index 000000000..4c1bc8efe --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferMultisample.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_framebuffer_multisample extension. + * + *

    This extension extends the EXT_framebuffer_object framework to enable multisample rendering.

    + * + *

    The new operation RenderbufferStorageMultisampleEXT() allocates storage for a renderbuffer object that can be used as a multisample buffer. A + * multisample render buffer image differs from a single-sample render buffer image in that a multisample image has a number of SAMPLES that is greater + * than zero. No method is provided for creating multisample texture images.

    + * + *

    All of the framebuffer-attachable images attached to a framebuffer object must have the same number of SAMPLES or else the framebuffer object is not + * "framebuffer complete". If a framebuffer object with multisample attachments is "framebuffer complete", then the framebuffer object behaves as if + * SAMPLE_BUFFERS is one.

    + * + *

    In traditional multisample rendering, where DRAW_FRAMEBUFFER_BINDING_EXT is zero and SAMPLE_BUFFERS is one, the GL spec states that "the color sample + * values are resolved to a single, displayable color each time a pixel is updated." There are, however, several modern hardware implementations that do + * not actually resolve for each sample update, but instead postpones the resolve operation to a later time and resolve a batch of sample updates at a + * time. This is OK as long as the implementation behaves "as if" it had resolved a sample-at-a-time. Unfortunately, however, honoring the "as if" rule can + * sometimes degrade performance.

    + * + *

    In contrast, when DRAW_FRAMEBUFFER_BINDING_EXT is an application-created framebuffer object, MULTISAMPLE is enabled, and SAMPLE_BUFFERS is one, there is + * no implicit per-sample-update resolve. Instead, the application explicitly controls when the resolve operation is performed. The resolve operation is + * affected by calling BlitFramebufferEXT (provided by the EXT_framebuffer_blit extension) where the source is a multisample application-created + * framebuffer object and the destination is a single-sample framebuffer object (either application-created or window-system provided).

    + * + *

    This design for multisample resolve more closely matches current hardware, but still permits implementations which choose to resolve a single sample at + * a time. If hardware that implementes the multisample resolution "one sample at a time" exposes EXT_framebuffer_multisample, it could perform the + * implicit resolve to a driver-managed hidden surface, then read from that surface when the application calls BlitFramebufferEXT.

    + * + *

    Another motivation for granting the application explicit control over the multisample resolve operation has to do with the flexibility afforded by + * EXT_framebuffer_object. Previously, a drawable (window or pbuffer) had exclusive access to all of its buffers. There was no mechanism for sharing a + * buffer across multiple drawables. Under EXT_framebuffer_object, however, a mechanism exists for sharing a framebuffer-attachable image across several + * framebuffer objects, as well as sharing an image between a framebuffer object and a texture. If we had retained the "implicit" + * resolve from traditional multisampled rendering, and allowed the creation of "multisample" format renderbuffers, then this type of sharing would have + * lead to two problematic situations:

    + * + *
      + *
    • Two contexts, which shared renderbuffers, might perform competing resolve operations into the same single-sample buffer with ambiguous results.
    • + *
    • It would have introduced the unfortunate ability to use the single-sample buffer as a texture while MULTISAMPLE is ENABLED.
    • + *
    + * + *

    By using the BlitFramebufferEXT from EXT_framebuffer_blit as an explicit resolve to serialize access to the multisampled contents and eliminate the + * implicit per-sample resolve operation, we avoid both of these problems.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public class EXTFramebufferMultisample { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetRenderbufferParameterivEXT. */ + public static final int GL_RENDERBUFFER_SAMPLES_EXT = 0x8CAB; + + /** Returned by CheckFramebufferStatusEXT. */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT = 0x8D56; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_SAMPLES_EXT = 0x8D57; + + protected EXTFramebufferMultisample() { + throw new UnsupportedOperationException(); + } + + // --- [ glRenderbufferStorageMultisampleEXT ] --- + + public static native void glRenderbufferStorageMultisampleEXT(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferMultisampleBlitScaled.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferMultisampleBlitScaled.java new file mode 100644 index 000000000..8c6c9c306 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferMultisampleBlitScaled.java @@ -0,0 +1,38 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_framebuffer_multisample_blit_scaled extension. + * + *

    This extension relaxes some of the restrictions associated with multisample resolve operations, specifically to allow a combined resolve and scale + * operation through a single call to BlitFramebuffer. It also adds two new filter types to control the quality of the combined scaled resolve operation.

    + * + *

    In traditional multisampled framebuffer rendering, color samples must be explicitly resolved via BlitFramebuffer before any other operation on the + * resulting pixel values can be performed. This multisample resolve operation must be done using a BlitFramebuffer call where the dimensions of the source + * and destination rectangles are identical. If the resulting pixel values need to be copied to a texture with different dimensions, these resolved values + * can then be scaled with a second call to BlitFramebuffer.

    + * + *

    By requiring two separate calls to BlitFramebuffer, the quality of final image can be maintained to a certain degree. The samples are first resolved, + * and then these resolved values can be filtered to produce the final image. This image quality comes at the price of increased memory usage and lower + * performance. However, the scaling blit can still introduce artifacts, particularly if it is done with a simple bilinear filter.

    + * + *

    The new filter types introduced by this extension allow the scaled resolve to be done with a single call to BlitFramebuffer. Not all samples from the + * read framebuffer are required to be be used when producing the final pixel values, and there may be a loss in quality when compared to an image produced + * by a separate resolve and scale. However, the single-pass scaled resolve blit should be faster than the traditional two-pass resolve then scale blits.

    + * + *

    Requires {@link ARBFramebufferObject ARB_framebuffer_object}.

    + */ +public final class EXTFramebufferMultisampleBlitScaled { + + /** Accepted by the {@code filter} parameter of BlitFramebuffer. */ + public static final int + GL_SCALED_RESOLVE_FASTEST_EXT = 0x90BA, + GL_SCALED_RESOLVE_NICEST_EXT = 0x90BB; + + private EXTFramebufferMultisampleBlitScaled() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferObject.java new file mode 100644 index 000000000..c3647ab19 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferObject.java @@ -0,0 +1,375 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_framebuffer_object extension. + * + *

    This extension defines a simple interface for drawing to rendering destinations other than the buffers provided to the GL by the window-system.

    + * + *

    In this extension, these newly defined rendering destinations are known collectively as "framebuffer-attachable images". This extension provides a + * mechanism for attaching framebuffer-attachable images to the GL framebuffer as one of the standard GL logical buffers: color, depth, and stencil. + * (Attaching a framebuffer-attachable image to the accum logical buffer is left for a future extension to define). When a framebuffer-attachable image is + * attached to the framebuffer, it is used as the source and destination of fragment operations.

    + * + *

    By allowing the use of a framebuffer-attachable image as a rendering destination, this extension enables a form of "offscreen" rendering. Furthermore, + * "render to texture" is supported by allowing the images of a texture to be used as framebuffer-attachable images. A particular image of a texture object + * is selected for use as a framebuffer-attachable image by specifying the mipmap level, cube map face (for a cube map texture), and z-offset (for a 3D + * texture) that identifies the image. The "render to texture" semantics of this extension are similar to performing traditional rendering to the + * framebuffer, followed immediately by a call to CopyTexSubImage. However, by using this extension instead, an application can achieve the same effect, + * but with the advantage that the GL can usually eliminate the data copy that would have been incurred by calling CopyTexSubImage.

    + * + *

    This extension also defines a new GL object type, called a "renderbuffer", which encapsulates a single 2D pixel image. The image of renderbuffer can be + * used as a framebuffer-attachable image for generalized offscreen rendering and it also provides a means to support rendering to GL logical buffer types + * which have no corresponding texture format (stencil, accum, etc). A renderbuffer is similar to a texture in that both renderbuffers and textures can be + * independently allocated and shared among multiple contexts. The framework defined by this extension is general enough that support for attaching images + * from GL objects other than textures and renderbuffers could be added by layered extensions.

    + * + *

    To facilitate efficient switching between collections of framebuffer-attachable images, this extension introduces another new GL object, called a + * framebuffer object. A framebuffer object contains the state that defines the traditional GL framebuffer, including its set of images. Prior to this + * extension, it was the window-system which defined and managed this collection of images, traditionally by grouping them into a "drawable". The + * window-system API's would also provide a function (i.e., wglMakeCurrent, glXMakeCurrent, aglSetDrawable, etc.) to bind a drawable with a GL context (as + * is done in the WGL_ARB_pbuffer extension). In this extension however, this functionality is subsumed by the GL and the GL provides the function + * BindFramebufferEXT to bind a framebuffer object to the current context. Later, the context can bind back to the window-system-provided framebuffer in + * order to display rendered content.

    + * + *

    Previous extensions that enabled rendering to a texture have been much more complicated. One example is the combination of ARB_pbuffer and + * ARB_render_texture, both of which are window-system extensions. This combination requires calling MakeCurrent, an operation that may be expensive, to + * switch between the window and the pbuffer drawables. An application must create one pbuffer per renderable texture in order to portably use + * ARB_render_texture. An application must maintain at least one GL context per texture format, because each context can only operate on a single + * pixelformat or FBConfig. All of these characteristics make ARB_render_texture both inefficient and cumbersome to use.

    + * + *

    EXT_framebuffer_object, on the other hand, is both simpler to use and more efficient than ARB_render_texture. The EXT_framebuffer_object API is + * contained wholly within the GL API and has no (non-portable) window-system components. Under EXT_framebuffer_object, it is not necessary to create a + * second GL context when rendering to a texture image whose format differs from that of the window. Finally, unlike the pbuffers of ARB_render_texture, a + * single framebuffer object can facilitate rendering to an unlimited number of texture objects.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public class EXTFramebufferObject { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameter of BindFramebufferEXT, CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT, FramebufferRenderbufferEXT, + * and GetFramebufferAttachmentParameterivEXT. + */ + public static final int GL_FRAMEBUFFER_EXT = 0x8D40; + + /** + * Accepted by the {@code target} parameter of BindRenderbufferEXT, RenderbufferStorageEXT, and GetRenderbufferParameterivEXT, and returned by + * GetFramebufferAttachmentParameterivEXT. + */ + public static final int GL_RENDERBUFFER_EXT = 0x8D41; + + /** Accepted by the {@code internalformat} parameter of RenderbufferStorageEXT. */ + public static final int + GL_STENCIL_INDEX1_EXT = 0x8D46, + GL_STENCIL_INDEX4_EXT = 0x8D47, + GL_STENCIL_INDEX8_EXT = 0x8D48, + GL_STENCIL_INDEX16_EXT = 0x8D49; + + /** Accepted by the {@code pname} parameter of GetRenderbufferParameterivEXT. */ + public static final int + GL_RENDERBUFFER_WIDTH_EXT = 0x8D42, + GL_RENDERBUFFER_HEIGHT_EXT = 0x8D43, + GL_RENDERBUFFER_INTERNAL_FORMAT_EXT = 0x8D44, + GL_RENDERBUFFER_RED_SIZE_EXT = 0x8D50, + GL_RENDERBUFFER_GREEN_SIZE_EXT = 0x8D51, + GL_RENDERBUFFER_BLUE_SIZE_EXT = 0x8D52, + GL_RENDERBUFFER_ALPHA_SIZE_EXT = 0x8D53, + GL_RENDERBUFFER_DEPTH_SIZE_EXT = 0x8D54, + GL_RENDERBUFFER_STENCIL_SIZE_EXT = 0x8D55; + + /** Accepted by the {@code pname} parameter of GetFramebufferAttachmentParameterivEXT. */ + public static final int + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT = 0x8CD0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT = 0x8CD1, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT = 0x8CD2, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT = 0x8CD3, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT = 0x8CD4; + + /** Accepted by the {@code attachment} parameter of FramebufferTexture{1D|2D|3D}EXT, FramebufferRenderbufferEXT, and GetFramebufferAttachmentParameterivEXT. */ + public static final int + GL_COLOR_ATTACHMENT0_EXT = 0x8CE0, + GL_COLOR_ATTACHMENT1_EXT = 0x8CE1, + GL_COLOR_ATTACHMENT2_EXT = 0x8CE2, + GL_COLOR_ATTACHMENT3_EXT = 0x8CE3, + GL_COLOR_ATTACHMENT4_EXT = 0x8CE4, + GL_COLOR_ATTACHMENT5_EXT = 0x8CE5, + GL_COLOR_ATTACHMENT6_EXT = 0x8CE6, + GL_COLOR_ATTACHMENT7_EXT = 0x8CE7, + GL_COLOR_ATTACHMENT8_EXT = 0x8CE8, + GL_COLOR_ATTACHMENT9_EXT = 0x8CE9, + GL_COLOR_ATTACHMENT10_EXT = 0x8CEA, + GL_COLOR_ATTACHMENT11_EXT = 0x8CEB, + GL_COLOR_ATTACHMENT12_EXT = 0x8CEC, + GL_COLOR_ATTACHMENT13_EXT = 0x8CED, + GL_COLOR_ATTACHMENT14_EXT = 0x8CEE, + GL_COLOR_ATTACHMENT15_EXT = 0x8CEF, + GL_DEPTH_ATTACHMENT_EXT = 0x8D00, + GL_STENCIL_ATTACHMENT_EXT = 0x8D20; + + /** Returned by CheckFramebufferStatusEXT(). */ + public static final int + GL_FRAMEBUFFER_COMPLETE_EXT = 0x8CD5, + GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT = 0x8CD6, + GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT = 0x8CD7, + GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT = 0x8CD9, + GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT = 0x8CDA, + GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT = 0x8CDB, + GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT = 0x8CDC, + GL_FRAMEBUFFER_UNSUPPORTED_EXT = 0x8CDD; + + /** Accepted by GetIntegerv(). */ + public static final int + GL_FRAMEBUFFER_BINDING_EXT = 0x8CA6, + GL_RENDERBUFFER_BINDING_EXT = 0x8CA7, + GL_MAX_COLOR_ATTACHMENTS_EXT = 0x8CDF, + GL_MAX_RENDERBUFFER_SIZE_EXT = 0x84E8; + + /** Returned by GetError(). */ + public static final int GL_INVALID_FRAMEBUFFER_OPERATION_EXT = 0x506; + + protected EXTFramebufferObject() { + throw new UnsupportedOperationException(); + } + + // --- [ glIsRenderbufferEXT ] --- + + @NativeType("GLboolean") + public static native boolean glIsRenderbufferEXT(@NativeType("GLuint") int renderbuffer); + + // --- [ glBindRenderbufferEXT ] --- + + public static native void glBindRenderbufferEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int renderbuffer); + + // --- [ glDeleteRenderbuffersEXT ] --- + + public static native void nglDeleteRenderbuffersEXT(int n, long renderbuffers); + + public static void glDeleteRenderbuffersEXT(@NativeType("GLuint const *") IntBuffer renderbuffers) { + nglDeleteRenderbuffersEXT(renderbuffers.remaining(), memAddress(renderbuffers)); + } + + public static void glDeleteRenderbuffersEXT(@NativeType("GLuint const *") int renderbuffer) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer renderbuffers = stack.ints(renderbuffer); + nglDeleteRenderbuffersEXT(1, memAddress(renderbuffers)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenRenderbuffersEXT ] --- + + public static native void nglGenRenderbuffersEXT(int n, long renderbuffers); + + public static void glGenRenderbuffersEXT(@NativeType("GLuint *") IntBuffer renderbuffers) { + nglGenRenderbuffersEXT(renderbuffers.remaining(), memAddress(renderbuffers)); + } + + @NativeType("void") + public static int glGenRenderbuffersEXT() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer renderbuffers = stack.callocInt(1); + nglGenRenderbuffersEXT(1, memAddress(renderbuffers)); + return renderbuffers.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glRenderbufferStorageEXT ] --- + + public static native void glRenderbufferStorageEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glGetRenderbufferParameterivEXT ] --- + + public static native void nglGetRenderbufferParameterivEXT(int target, int pname, long params); + + public static void glGetRenderbufferParameterivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetRenderbufferParameterivEXT(target, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetRenderbufferParameteriEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetRenderbufferParameterivEXT(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsFramebufferEXT ] --- + + @NativeType("GLboolean") + public static native boolean glIsFramebufferEXT(@NativeType("GLuint") int framebuffer); + + // --- [ glBindFramebufferEXT ] --- + + public static native void glBindFramebufferEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int framebuffer); + + // --- [ glDeleteFramebuffersEXT ] --- + + public static native void nglDeleteFramebuffersEXT(int n, long framebuffers); + + public static void glDeleteFramebuffersEXT(@NativeType("GLuint const *") IntBuffer framebuffers) { + nglDeleteFramebuffersEXT(framebuffers.remaining(), memAddress(framebuffers)); + } + + public static void glDeleteFramebuffersEXT(@NativeType("GLuint const *") int framebuffer) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer framebuffers = stack.ints(framebuffer); + nglDeleteFramebuffersEXT(1, memAddress(framebuffers)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenFramebuffersEXT ] --- + + public static native void nglGenFramebuffersEXT(int n, long framebuffers); + + public static void glGenFramebuffersEXT(@NativeType("GLuint *") IntBuffer framebuffers) { + nglGenFramebuffersEXT(framebuffers.remaining(), memAddress(framebuffers)); + } + + @NativeType("void") + public static int glGenFramebuffersEXT() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer framebuffers = stack.callocInt(1); + nglGenFramebuffersEXT(1, memAddress(framebuffers)); + return framebuffers.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCheckFramebufferStatusEXT ] --- + + @NativeType("GLenum") + public static native int glCheckFramebufferStatusEXT(@NativeType("GLenum") int target); + + // --- [ glFramebufferTexture1DEXT ] --- + + public static native void glFramebufferTexture1DEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glFramebufferTexture2DEXT ] --- + + public static native void glFramebufferTexture2DEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glFramebufferTexture3DEXT ] --- + + public static native void glFramebufferTexture3DEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int zoffset); + + // --- [ glFramebufferRenderbufferEXT ] --- + + public static native void glFramebufferRenderbufferEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int renderbuffertarget, @NativeType("GLuint") int renderbuffer); + + // --- [ glGetFramebufferAttachmentParameterivEXT ] --- + + public static native void nglGetFramebufferAttachmentParameterivEXT(int target, int attachment, int pname, long params); + + public static void glGetFramebufferAttachmentParameterivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetFramebufferAttachmentParameterivEXT(target, attachment, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetFramebufferAttachmentParameteriEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetFramebufferAttachmentParameterivEXT(target, attachment, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenerateMipmapEXT ] --- + + public static native void glGenerateMipmapEXT(@NativeType("GLenum") int target); + + /** Array version of: {@link #glDeleteRenderbuffersEXT DeleteRenderbuffersEXT} */ + public static void glDeleteRenderbuffersEXT(@NativeType("GLuint const *") int[] renderbuffers) { + long __functionAddress = GL.getICD().glDeleteRenderbuffersEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(renderbuffers.length, renderbuffers, __functionAddress); + } + + /** Array version of: {@link #glGenRenderbuffersEXT GenRenderbuffersEXT} */ + public static void glGenRenderbuffersEXT(@NativeType("GLuint *") int[] renderbuffers) { + long __functionAddress = GL.getICD().glGenRenderbuffersEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(renderbuffers.length, renderbuffers, __functionAddress); + } + + /** Array version of: {@link #glGetRenderbufferParameterivEXT GetRenderbufferParameterivEXT} */ + public static void glGetRenderbufferParameterivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetRenderbufferParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glDeleteFramebuffersEXT DeleteFramebuffersEXT} */ + public static void glDeleteFramebuffersEXT(@NativeType("GLuint const *") int[] framebuffers) { + long __functionAddress = GL.getICD().glDeleteFramebuffersEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(framebuffers.length, framebuffers, __functionAddress); + } + + /** Array version of: {@link #glGenFramebuffersEXT GenFramebuffersEXT} */ + public static void glGenFramebuffersEXT(@NativeType("GLuint *") int[] framebuffers) { + long __functionAddress = GL.getICD().glGenFramebuffersEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(framebuffers.length, framebuffers, __functionAddress); + } + + /** Array version of: {@link #glGetFramebufferAttachmentParameterivEXT GetFramebufferAttachmentParameterivEXT} */ + public static void glGetFramebufferAttachmentParameterivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetFramebufferAttachmentParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, attachment, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferSRGB.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferSRGB.java new file mode 100644 index 000000000..199a7d9c4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTFramebufferSRGB.java @@ -0,0 +1,42 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_framebuffer_sRGB extension. + * + *

    Conventionally, OpenGL assumes framebuffer color components are stored in a linear color space. In particular, framebuffer blending is a linear + * operation.

    + * + *

    The sRGB color space is based on typical (non-linear) monitor characteristics expected in a dimly lit office. It has been standardized by the + * International Electrotechnical Commission (IEC) as IEC 61966-2-1. The sRGB color space roughly corresponds to 2.2 gamma correction.

    + * + *

    This extension adds a framebuffer capability for sRGB framebuffer update and blending. When blending is disabled but the new sRGB updated mode is + * enabled (assume the framebuffer supports the capability), high-precision linear color component values for red, green, and blue generated by fragment + * coloring are encoded for sRGB prior to being written into the framebuffer. When blending is enabled along with the new sRGB update mode, red, green, and + * blue framebuffer color components are treated as sRGB values that are converted to linear color values, blended with the high-precision color values + * generated by fragment coloring, and then the blend result is encoded for sRGB just prior to being written into the framebuffer.

    + * + *

    The primary motivation for this extension is that it allows OpenGL applications to render into a framebuffer that is scanned to a monitor configured to + * assume framebuffer color values are sRGB encoded. This assumption is roughly true of most PC monitors with default gamma correction. This allows + * applications to achieve faithful color reproduction for OpenGL rendering without adjusting the monitor's gamma correction.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public final class EXTFramebufferSRGB { + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_FRAMEBUFFER_SRGB_EXT = 0x8DB9; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_FRAMEBUFFER_SRGB_CAPABLE_EXT = 0x8DBA; + + private EXTFramebufferSRGB() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGPUProgramParameters.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGPUProgramParameters.java new file mode 100644 index 000000000..20f158ea9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGPUProgramParameters.java @@ -0,0 +1,68 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_gpu_program_parameters extension. + * + *

    This extension provides a new set of procedures to load multiple consecutive program environment parameters more efficiently, via a single GL call + * instead of multiple calls. This will reduce the amount of CPU overhead involved in loading parameters.

    + * + *

    With the existing ARB_vertex_program and ARB_fragment_program APIs, program parameters must be loaded one at a time, via separate calls. While the + * NV_vertex_program extension provides a set of similar functions that can be used to load program environment parameters (which are equivalent to + * "program parameters" in NV_vertex_program), no such function exists for program local parameters.

    + */ +public class EXTGPUProgramParameters { + + static { GL.initialize(); } + + protected EXTGPUProgramParameters() { + throw new UnsupportedOperationException(); + } + + // --- [ glProgramEnvParameters4fvEXT ] --- + + public static native void nglProgramEnvParameters4fvEXT(int target, int index, int count, long params); + + public static void glProgramEnvParameters4fvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer params) { + nglProgramEnvParameters4fvEXT(target, index, params.remaining() >> 2, memAddress(params)); + } + + // --- [ glProgramLocalParameters4fvEXT ] --- + + public static native void nglProgramLocalParameters4fvEXT(int target, int index, int count, long params); + + public static void glProgramLocalParameters4fvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer params) { + nglProgramLocalParameters4fvEXT(target, index, params.remaining() >> 2, memAddress(params)); + } + + /** Array version of: {@link #glProgramEnvParameters4fvEXT ProgramEnvParameters4fvEXT} */ + public static void glProgramEnvParameters4fvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glProgramEnvParameters4fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, index, params.length >> 2, params, __functionAddress); + } + + /** Array version of: {@link #glProgramLocalParameters4fvEXT ProgramLocalParameters4fvEXT} */ + public static void glProgramLocalParameters4fvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glProgramLocalParameters4fvEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, index, params.length >> 2, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGPUShader4.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGPUShader4.java new file mode 100644 index 000000000..c6f8683b1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGPUShader4.java @@ -0,0 +1,862 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_gpu_shader4 extension. + * + *

    This extension provides a set of new features to the OpenGL Shading Language and related APIs to support capabilities of new hardware. In particular, + * this extension provides the following functionality:

    + * + *
      + *
    • New texture lookup functions are provided that allow shaders to access individual texels using integer coordinates referring to the texel location + * and level of detail. No filtering is performed. These functions allow applications to use textures as one-, two-, and three-dimensional arrays.
    • + *
    • New texture lookup functions are provided that allow shaders to query the dimensions of a specific level-of-detail image of a texture object.
    • + *
    • New texture lookup functions variants are provided that allow shaders to pass a constant integer vector used to offset the texel locations used + * during the lookup to assist in custom texture filtering operations.
    • + *
    • New texture lookup functions are provided that allow shaders to access one- and two-dimensional array textures. The second, or third, coordinate is + * used to select the layer of the array to access.
    • + *
    • New "Grad" texture lookup functions are provided that allow shaders to explicitely pass in derivative values which are used by the GL to compute the + * level-of-detail when performing a texture lookup.
    • + *
    • A new texture lookup function is provided to access a buffer texture.
    • + *
    • The existing absolute LOD texture lookup functions are no longer restricted to the vertex shader only.
    • + *
    • The ability to specify and use cubemap textures with a DEPTH_COMPONENT internal format. This also enables shadow mapping on cubemaps. The 'q' + * coordinate is used as the reference value for comparisons. A set of new texture lookup functions is provided to lookup into shadow cubemaps.
    • + *
    • The ability to specify if varying variables are interpolated in a non-perspective correct manner, if they are flat shaded or, if multi-sampling, if + * centroid sampling should be performed.
    • + *
    • Full signed integer and unsigned integer support in the OpenGL Shading Language: + * + *
        + *
      • Integers are defined as 32 bit values using two's complement.
      • + *
      • Unsigned integers and vectors thereof are added.
      • + *
      • New texture lookup functions are provided that return integer values. These functions are to be used in conjunction with new texture formats + * whose components are actual integers, rather than integers that encode a floating-point value. To support these lookup functions, new integer + * and unsigned-integer sampler types are introduced.
      • + *
      • Integer bitwise operators are now enabled.
      • + *
      • Several built-in functions and operators now operate on integers or vectors of integers.
      • + *
      • New vertex attribute functions are added that load integer attribute data and can be referenced in a vertex shader as integer data.
      • + *
      • New uniform loading commands are added to load unsigned integer data.
      • + *
      • Varying variables can now be (unsigned) integers. If declared as such, they have to be flat shaded.
      • + *
      • Fragment shaders can define their own output variables, and declare them to be of type floating-point, integer or unsigned integer. These + * variables are bound to a fragment color index with the new API command BindFragDataLocationEXT(), and directed to buffers using the existing + * DrawBuffer or DrawBuffers API commands.
      • + *
    • + *
    • Added new built-in functions truncate() and round() to the shading language.
    • + *
    • A new built-in variable accessible from within vertex shaders that holds the index {@code i} implicitly passed to ArrayElement to specify the + * vertex. This is called the vertex ID.
    • + *
    • A new built-in variable accessible from within fragment and geometry shaders that hold the index of the currently processed primitive. This is + * called the primitive ID.
    • + *
    + * + *

    This extension also briefly mentions a new shader type, called a geometry shader. A geometry shader is run after vertices are transformed, but before + * clipping. A geometry shader begins with a single primitive (point, line, triangle. It can read the attributes of any of the vertices in the primitive + * and use them to generate new primitives. A geometry shader has a fixed output primitive type (point, line strip, or triangle strip) and emits vertices + * to define a new primitive. Geometry shaders are discussed in detail in the GL_EXT_geometry_shader4 specification.

    + * + *

    Requires {@link GL20 OpenGL 2.0}.

    + */ +public class EXTGPUShader4 { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameters of GetVertexAttribdv, GetVertexAttribfv, GetVertexAttribiv, GetVertexAttribIuivEXT and GetVertexAttribIivEXT. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT = 0x88FD; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_1D_ARRAY_EXT = 0x8DC0, + GL_SAMPLER_2D_ARRAY_EXT = 0x8DC1, + GL_SAMPLER_BUFFER_EXT = 0x8DC2, + GL_SAMPLER_1D_ARRAY_SHADOW_EXT = 0x8DC3, + GL_SAMPLER_2D_ARRAY_SHADOW_EXT = 0x8DC4, + GL_SAMPLER_CUBE_SHADOW_EXT = 0x8DC5, + GL_UNSIGNED_INT_VEC2_EXT = 0x8DC6, + GL_UNSIGNED_INT_VEC3_EXT = 0x8DC7, + GL_UNSIGNED_INT_VEC4_EXT = 0x8DC8, + GL_INT_SAMPLER_1D_EXT = 0x8DC9, + GL_INT_SAMPLER_2D_EXT = 0x8DCA, + GL_INT_SAMPLER_3D_EXT = 0x8DCB, + GL_INT_SAMPLER_CUBE_EXT = 0x8DCC, + GL_INT_SAMPLER_2D_RECT_EXT = 0x8DCD, + GL_INT_SAMPLER_1D_ARRAY_EXT = 0x8DCE, + GL_INT_SAMPLER_2D_ARRAY_EXT = 0x8DCF, + GL_INT_SAMPLER_BUFFER_EXT = 0x8DD0, + GL_UNSIGNED_INT_SAMPLER_1D_EXT = 0x8DD1, + GL_UNSIGNED_INT_SAMPLER_2D_EXT = 0x8DD2, + GL_UNSIGNED_INT_SAMPLER_3D_EXT = 0x8DD3, + GL_UNSIGNED_INT_SAMPLER_CUBE_EXT = 0x8DD4, + GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT = 0x8DD5, + GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT = 0x8DD6, + GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT = 0x8DD7, + GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT = 0x8DD8; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MIN_PROGRAM_TEXEL_OFFSET_EXT = 0x8904, + GL_MAX_PROGRAM_TEXEL_OFFSET_EXT = 0x8905; + + protected EXTGPUShader4() { + throw new UnsupportedOperationException(); + } + + // --- [ glVertexAttribI1iEXT ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. The y and z components are implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + */ + public static native void glVertexAttribI1iEXT(@NativeType("GLuint") int index, @NativeType("GLint") int x); + + // --- [ glVertexAttribI2iEXT ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. The z component is implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + */ + public static native void glVertexAttribI2iEXT(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y); + + // --- [ glVertexAttribI3iEXT ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. The w component is implicitly set to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + */ + public static native void glVertexAttribI3iEXT(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z); + + // --- [ glVertexAttribI4iEXT ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + */ + public static native void glVertexAttribI4iEXT(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w); + + // --- [ glVertexAttribI1uiEXT ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. The y and z components are implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + */ + public static native void glVertexAttribI1uiEXT(@NativeType("GLuint") int index, @NativeType("GLuint") int x); + + // --- [ glVertexAttribI2uiEXT ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. The z component is implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + */ + public static native void glVertexAttribI2uiEXT(@NativeType("GLuint") int index, @NativeType("GLuint") int x, @NativeType("GLuint") int y); + + // --- [ glVertexAttribI3uiEXT ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. The w component is implicitly set to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + */ + public static native void glVertexAttribI3uiEXT(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z); + + // --- [ glVertexAttribI4uiEXT ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + */ + public static native void glVertexAttribI4uiEXT(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w); + + // --- [ glVertexAttribI1ivEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI1ivEXT VertexAttribI1ivEXT} */ + public static native void nglVertexAttribI1ivEXT(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI1iEXT VertexAttribI1iEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI1ivEXT(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttribI1ivEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribI2ivEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI2ivEXT VertexAttribI2ivEXT} */ + public static native void nglVertexAttribI2ivEXT(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI2iEXT VertexAttribI2iEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI2ivEXT(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttribI2ivEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribI3ivEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI3ivEXT VertexAttribI3ivEXT} */ + public static native void nglVertexAttribI3ivEXT(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI3iEXT VertexAttribI3iEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI3ivEXT(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttribI3ivEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribI4ivEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI4ivEXT VertexAttribI4ivEXT} */ + public static native void nglVertexAttribI4ivEXT(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI4iEXT VertexAttribI4iEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI4ivEXT(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4ivEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribI1uivEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI1uivEXT VertexAttribI1uivEXT} */ + public static native void nglVertexAttribI1uivEXT(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI1uiEXT VertexAttribI1uiEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI1uivEXT(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttribI1uivEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribI2uivEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI2uivEXT VertexAttribI2uivEXT} */ + public static native void nglVertexAttribI2uivEXT(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI2uiEXT VertexAttribI2uiEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI2uivEXT(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttribI2uivEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribI3uivEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI3uivEXT VertexAttribI3uivEXT} */ + public static native void nglVertexAttribI3uivEXT(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI3uiEXT VertexAttribI3uiEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI3uivEXT(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttribI3uivEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribI4uivEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI4uivEXT VertexAttribI4uivEXT} */ + public static native void nglVertexAttribI4uivEXT(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI4uiEXT VertexAttribI4uiEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI4uivEXT(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4uivEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribI4bvEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI4bvEXT VertexAttribI4bvEXT} */ + public static native void nglVertexAttribI4bvEXT(int index, long v); + + /** + * Byte version of {@link #glVertexAttribI4ivEXT VertexAttribI4ivEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI4bvEXT(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4bvEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribI4svEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI4svEXT VertexAttribI4svEXT} */ + public static native void nglVertexAttribI4svEXT(int index, long v); + + /** + * Short version of {@link #glVertexAttribI4ivEXT VertexAttribI4ivEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI4svEXT(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4svEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribI4ubvEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI4ubvEXT VertexAttribI4ubvEXT} */ + public static native void nglVertexAttribI4ubvEXT(int index, long v); + + /** + * Byte version of {@link #glVertexAttribI4uivEXT VertexAttribI4uivEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI4ubvEXT(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4ubvEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribI4usvEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribI4usvEXT VertexAttribI4usvEXT} */ + public static native void nglVertexAttribI4usvEXT(int index, long v); + + /** + * Short version of {@link #glVertexAttribI4uivEXT VertexAttribI4uivEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + */ + public static void glVertexAttribI4usvEXT(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4usvEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribIPointerEXT ] --- + + /** Unsafe version of: {@link #glVertexAttribIPointerEXT VertexAttribIPointerEXT} */ + public static native void nglVertexAttribIPointerEXT(int index, int size, int type, int stride, long pointer); + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribIPointerEXT(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglVertexAttribIPointerEXT(index, size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribIPointerEXT(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglVertexAttribIPointerEXT(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribIPointerEXT(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglVertexAttribIPointerEXT(index, size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + */ + public static void glVertexAttribIPointerEXT(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglVertexAttribIPointerEXT(index, size, type, stride, memAddress(pointer)); + } + + // --- [ glGetVertexAttribIivEXT ] --- + + /** Unsafe version of: {@link #glGetVertexAttribIivEXT GetVertexAttribIivEXT} */ + public static native void nglGetVertexAttribIivEXT(int index, int pname, long params); + + /** + * Returns the value of a pure integer generic vertex attribute parameter. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params returns the requested data + */ + public static void glGetVertexAttribIivEXT(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetVertexAttribIivEXT(index, pname, memAddress(params)); + } + + /** + * Returns the value of a pure integer generic vertex attribute parameter. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried + */ + @NativeType("void") + public static int glGetVertexAttribIiEXT(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetVertexAttribIivEXT(index, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexAttribIuivEXT ] --- + + /** Unsafe version of: {@link #glGetVertexAttribIuivEXT GetVertexAttribIuivEXT} */ + public static native void nglGetVertexAttribIuivEXT(int index, int pname, long params); + + /** + * Unsigned version of {@link #glGetVertexAttribIivEXT GetVertexAttribIivEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params returns the requested data + */ + public static void glGetVertexAttribIuivEXT(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetVertexAttribIuivEXT(index, pname, memAddress(params)); + } + + /** + * Unsigned version of {@link #glGetVertexAttribIivEXT GetVertexAttribIivEXT}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried + */ + @NativeType("void") + public static int glGetVertexAttribIuiEXT(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetVertexAttribIuivEXT(index, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetUniformuivEXT ] --- + + public static native void nglGetUniformuivEXT(int program, int location, long params); + + public static void glGetUniformuivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformuivEXT(program, location, memAddress(params)); + } + + @NativeType("void") + public static int glGetUniformuiEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetUniformuivEXT(program, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glBindFragDataLocationEXT ] --- + + public static native void nglBindFragDataLocationEXT(int program, int color, long name); + + public static void glBindFragDataLocationEXT(@NativeType("GLuint") int program, @NativeType("GLuint") int color, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + nglBindFragDataLocationEXT(program, color, memAddress(name)); + } + + public static void glBindFragDataLocationEXT(@NativeType("GLuint") int program, @NativeType("GLuint") int color, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + nglBindFragDataLocationEXT(program, color, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetFragDataLocationEXT ] --- + + public static native int nglGetFragDataLocationEXT(int program, long name); + + @NativeType("GLint") + public static int glGetFragDataLocationEXT(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetFragDataLocationEXT(program, memAddress(name)); + } + + @NativeType("GLint") + public static int glGetFragDataLocationEXT(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetFragDataLocationEXT(program, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glUniform1uiEXT ] --- + + public static native void glUniform1uiEXT(@NativeType("GLint") int location, @NativeType("GLuint") int v0); + + // --- [ glUniform2uiEXT ] --- + + public static native void glUniform2uiEXT(@NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1); + + // --- [ glUniform3uiEXT ] --- + + public static native void glUniform3uiEXT(@NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1, @NativeType("GLuint") int v2); + + // --- [ glUniform4uiEXT ] --- + + public static native void glUniform4uiEXT(@NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1, @NativeType("GLuint") int v2, @NativeType("GLuint") int v3); + + // --- [ glUniform1uivEXT ] --- + + public static native void nglUniform1uivEXT(int location, int count, long value); + + public static void glUniform1uivEXT(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglUniform1uivEXT(location, value.remaining(), memAddress(value)); + } + + // --- [ glUniform2uivEXT ] --- + + public static native void nglUniform2uivEXT(int location, int count, long value); + + public static void glUniform2uivEXT(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglUniform2uivEXT(location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glUniform3uivEXT ] --- + + public static native void nglUniform3uivEXT(int location, int count, long value); + + public static void glUniform3uivEXT(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglUniform3uivEXT(location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glUniform4uivEXT ] --- + + public static native void nglUniform4uivEXT(int location, int count, long value); + + public static void glUniform4uivEXT(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglUniform4uivEXT(location, value.remaining() >> 2, memAddress(value)); + } + + /** Array version of: {@link #glVertexAttribI1ivEXT VertexAttribI1ivEXT} */ + public static void glVertexAttribI1ivEXT(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI1ivEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribI2ivEXT VertexAttribI2ivEXT} */ + public static void glVertexAttribI2ivEXT(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI2ivEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribI3ivEXT VertexAttribI3ivEXT} */ + public static void glVertexAttribI3ivEXT(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI3ivEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribI4ivEXT VertexAttribI4ivEXT} */ + public static void glVertexAttribI4ivEXT(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI4ivEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribI1uivEXT VertexAttribI1uivEXT} */ + public static void glVertexAttribI1uivEXT(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI1uivEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribI2uivEXT VertexAttribI2uivEXT} */ + public static void glVertexAttribI2uivEXT(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI2uivEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribI3uivEXT VertexAttribI3uivEXT} */ + public static void glVertexAttribI3uivEXT(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI3uivEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribI4uivEXT VertexAttribI4uivEXT} */ + public static void glVertexAttribI4uivEXT(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI4uivEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribI4svEXT VertexAttribI4svEXT} */ + public static void glVertexAttribI4svEXT(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttribI4svEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribI4usvEXT VertexAttribI4usvEXT} */ + public static void glVertexAttribI4usvEXT(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttribI4usvEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribIPointerEXT VertexAttribIPointerEXT} */ + public static void glVertexAttribIPointerEXT(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") short[] pointer) { + long __functionAddress = GL.getICD().glVertexAttribIPointerEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(index, size, type, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribIPointerEXT VertexAttribIPointerEXT} */ + public static void glVertexAttribIPointerEXT(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") int[] pointer) { + long __functionAddress = GL.getICD().glVertexAttribIPointerEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(index, size, type, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glGetVertexAttribIivEXT GetVertexAttribIivEXT} */ + public static void glGetVertexAttribIivEXT(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribIivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(index, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetVertexAttribIuivEXT GetVertexAttribIuivEXT} */ + public static void glGetVertexAttribIuivEXT(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribIuivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(index, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetUniformuivEXT GetUniformuivEXT} */ + public static void glGetUniformuivEXT(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetUniformuivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, location, params, __functionAddress); + } + + /** Array version of: {@link #glUniform1uivEXT Uniform1uivEXT} */ + public static void glUniform1uivEXT(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform1uivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glUniform2uivEXT Uniform2uivEXT} */ + public static void glUniform2uivEXT(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform2uivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glUniform3uivEXT Uniform3uivEXT} */ + public static void glUniform3uivEXT(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform3uivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glUniform4uivEXT Uniform4uivEXT} */ + public static void glUniform4uivEXT(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform4uivEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, value, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGeometryShader4.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGeometryShader4.java new file mode 100644 index 000000000..03bd46119 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTGeometryShader4.java @@ -0,0 +1,98 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_geometry_shader4 extension. + * + *

    EXT_geometry_shader4 defines a new shader type available to be run on the GPU, called a geometry shader. Geometry shaders are run after vertices are + * transformed, but prior to color clamping, flat shading and clipping.

    + * + *

    A geometry shader begins with a single primitive (point, line, triangle). It can read the attributes of any of the vertices in the primitive and use + * them to generate new primitives. A geometry shader has a fixed output primitive type (point, line strip, or triangle strip) and emits vertices to + * define a new primitive. A geometry shader can emit multiple disconnected primitives. The primitives emitted by the geometry shader are clipped and then + * processed like an equivalent OpenGL primitive specified by the application.

    + * + *

    Furthermore, EXT_geometry_shader4 provides four additional primitive types: lines with adjacency, line strips with adjacency, separate triangles with + * adjacency, and triangle strips with adjacency. Some of the vertices specified in these new primitive types are not part of the ordinary primitives, + * instead they represent neighboring vertices that are adjacent to the two line segment end points (lines/strips) or the three triangle edges + * (triangles/tstrips). These vertices can be accessed by geometry shaders and used to match up the vertices emitted by the geometry shader with those of + * neighboring primitives.

    + * + *

    Since geometry shaders expect a specific input primitive type, an error will occur if the application presents primitives of a different type. For + * example, if a geometry shader expects points, an error will occur at Begin() time, if a primitive mode of TRIANGLES is specified.

    + */ +public class EXTGeometryShader4 { + + static { GL.initialize(); } + + /** Accepted by the {@code type} parameter of CreateShader and returned by the {@code params} parameter of GetShaderiv. */ + public static final int GL_GEOMETRY_SHADER_EXT = 0x8DD9; + + /** Accepted by the {@code pname} parameter of ProgramParameteriEXT and GetProgramiv. */ + public static final int + GL_GEOMETRY_VERTICES_OUT_EXT = 0x8DDA, + GL_GEOMETRY_INPUT_TYPE_EXT = 0x8DDB, + GL_GEOMETRY_OUTPUT_TYPE_EXT = 0x8DDC; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT = 0x8C29, + GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT = 0x8DDD, + GL_MAX_VERTEX_VARYING_COMPONENTS_EXT = 0x8DDE, + GL_MAX_VARYING_COMPONENTS_EXT = 0x8B4B, + GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT = 0x8DDF, + GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT = 0x8DE0, + GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT = 0x8DE1; + + /** Accepted by the {@code mode} parameter of Begin, DrawArrays, MultiDrawArrays, DrawElements, MultiDrawElements, and DrawRangeElements. */ + public static final int + GL_LINES_ADJACENCY_EXT = 0xA, + GL_LINE_STRIP_ADJACENCY_EXT = 0xB, + GL_TRIANGLES_ADJACENCY_EXT = 0xC, + GL_TRIANGLE_STRIP_ADJACENCY_EXT = 0xD; + + /** Returned by CheckFramebufferStatusEXT. */ + public static final int + GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT = 0x8DA8, + GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT = 0x8DA9; + + /** Accepted by the {@code pname} parameter of GetFramebufferAttachment- ParameterivEXT. */ + public static final int + GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT = 0x8DA7, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT = 0x8CD4; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetIntegerv, GetFloatv, GetDoublev, and + * GetBooleanv. + */ + public static final int GL_PROGRAM_POINT_SIZE_EXT = 0x8642; + + protected EXTGeometryShader4() { + throw new UnsupportedOperationException(); + } + + // --- [ glProgramParameteriEXT ] --- + + public static native void glProgramParameteriEXT(@NativeType("GLuint") int program, @NativeType("GLenum") int pname, @NativeType("GLint") int value); + + // --- [ glFramebufferTextureEXT ] --- + + public static native void glFramebufferTextureEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glFramebufferTextureLayerEXT ] --- + + public static void glFramebufferTextureLayerEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer) { + EXTTextureArray.glFramebufferTextureLayerEXT(target, attachment, texture, level, layer); + } + + // --- [ glFramebufferTextureFaceEXT ] --- + + public static native void glFramebufferTextureFaceEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int face); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObject.java new file mode 100644 index 000000000..62d1b127f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObject.java @@ -0,0 +1,275 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_memory_object extension. + * + *

    The Vulkan API introduces the concept of explicit memory objects and reusable synchronization objects. This extension brings those concepts to the + * OpenGL API via two new object types:

    + * + *
      + *
    • Memory objects
    • + *
    • Semaphores
    • + *
    + * + *

    Rather than allocating memory as a response to object allocation, memory allocation and binding are two separate operations in Vulkan. This extension + * allows an OpenGL application to import a Vulkan memory object, and to bind textures and/or buffer objects to it.

    + * + *

    No methods to import memory objects are defined here. Separate platform-specific extensions are defined for this purpose.

    + * + *

    Semaphores are synchronization primitives that can be waited on and signaled only by the GPU, or in GL terms, in the GL server. They are similar in + * concept to GL's "sync" objects and EGL's "EGLSync" objects, but different enough that compatibilities between the two are difficult to derive.

    + * + *

    Rather than attempt to map Vulkan semaphores on to GL/EGL sync objects to achieve interoperability, this extension introduces a new object, GL + * semaphores, that map directly to the semantics of Vulkan semaphores. To achieve full image and buffer memory coherence with a Vulkan driver, the + * commands that manipulate semaphores also allow external usage information to be imported and exported.

    + * + *

    Requires {@link GL42 OpenGL 4.2} or {@link ARBTextureStorage ARB_texture_storage}.

    + */ +public class EXTMemoryObject { + + static { GL.initialize(); } + + /** + * Accepted by the {@code pname} parameter of TexParameter{ifx}{v}, TexParameterI{i ui}v, TextureParameter{if}{v}, TextureParameterI{i ui}v, + * GetTexParameter{if}v, GetTexParameterI{i ui}v, GetTextureParameter{if}v, and GetTextureParameterI{i ui}v. + */ + public static final int GL_TEXTURE_TILING_EXT = 0x9580; + + /** Accepted by the {@code pname} parameter of {@link #glMemoryObjectParameterivEXT MemoryObjectParameterivEXT}, and {@link #glGetMemoryObjectParameterivEXT GetMemoryObjectParameterivEXT}. */ + public static final int GL_DEDICATED_MEMORY_OBJECT_EXT = 0x9581; + + /** Accepted by the {@code pname} parameter of GetInternalFormativ or GetInternalFormati64v. */ + public static final int + GL_NUM_TILING_TYPES_EXT = 0x9582, + GL_TILING_TYPES_EXT = 0x9583; + + /** + * Returned in the {@code params} parameter of GetInternalFormativ or GetInternalFormati64v when the {@code pname} parameter is {@link #GL_TILING_TYPES_EXT TILING_TYPES_EXT}, + * returned in the {@code params} parameter of GetTexParameter{if}v, GetTexParameterI{i ui}v, GetTextureParameter{if}v, and GetTextureParameterI{i ui}v + * when the {@code pname} parameter is {@link #GL_TEXTURE_TILING_EXT TEXTURE_TILING_EXT}, and accepted by the {@code params} parameter of TexParameter{ifx}{v}, TexParameterI{i ui}v, + * TextureParameter{if}{v}, TextureParameterI{i ui}v when the {@code pname} parameter is {@link #GL_TEXTURE_TILING_EXT TEXTURE_TILING_EXT}. + */ + public static final int + GL_OPTIMAL_TILING_EXT = 0x9584, + GL_LINEAR_TILING_EXT = 0x9585; + + /** + * Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, GetInteger64v, {@link #glGetUnsignedBytevEXT GetUnsignedBytevEXT}, and the + * {@code target} parameter of GetBooleani_v, GetIntegeri_v,GetFloati_v, GetDoublei_v, GetInteger64i_v, and {@link #glGetUnsignedBytei_vEXT GetUnsignedBytei_vEXT}. + */ + public static final int + GL_NUM_DEVICE_UUIDS_EXT = 0x9596, + GL_DEVICE_UUID_EXT = 0x9597, + GL_DRIVER_UUID_EXT = 0x9598; + + /** Constant values. */ + public static final int GL_UUID_SIZE_EXT = 16; + + protected EXTMemoryObject() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetUnsignedBytevEXT ] --- + + public static native void nglGetUnsignedBytevEXT(int pname, long data); + + public static void glGetUnsignedBytevEXT(@NativeType("GLenum") int pname, @NativeType("GLubyte *") ByteBuffer data) { + nglGetUnsignedBytevEXT(pname, memAddress(data)); + } + + // --- [ glGetUnsignedBytei_vEXT ] --- + + public static native void nglGetUnsignedBytei_vEXT(int target, int index, long data); + + public static void glGetUnsignedBytei_vEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLubyte *") ByteBuffer data) { + nglGetUnsignedBytei_vEXT(target, index, memAddress(data)); + } + + // --- [ glDeleteMemoryObjectsEXT ] --- + + public static native void nglDeleteMemoryObjectsEXT(int n, long memoryObjects); + + public static void glDeleteMemoryObjectsEXT(@NativeType("GLuint const *") IntBuffer memoryObjects) { + nglDeleteMemoryObjectsEXT(memoryObjects.remaining(), memAddress(memoryObjects)); + } + + public static void glDeleteMemoryObjectsEXT(@NativeType("GLuint const *") int memoryObject) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer memoryObjects = stack.ints(memoryObject); + nglDeleteMemoryObjectsEXT(1, memAddress(memoryObjects)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsMemoryObjectEXT ] --- + + @NativeType("GLboolean") + public static native boolean glIsMemoryObjectEXT(@NativeType("GLuint") int memoryObject); + + // --- [ glCreateMemoryObjectsEXT ] --- + + public static native void nglCreateMemoryObjectsEXT(int n, long memoryObjects); + + public static void glCreateMemoryObjectsEXT(@NativeType("GLuint *") IntBuffer memoryObjects) { + nglCreateMemoryObjectsEXT(memoryObjects.remaining(), memAddress(memoryObjects)); + } + + @NativeType("void") + public static int glCreateMemoryObjectsEXT() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer memoryObjects = stack.callocInt(1); + nglCreateMemoryObjectsEXT(1, memAddress(memoryObjects)); + return memoryObjects.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glMemoryObjectParameterivEXT ] --- + + public static native void nglMemoryObjectParameterivEXT(int memoryObject, int pname, long params); + + public static void glMemoryObjectParameterivEXT(@NativeType("GLuint") int memoryObject, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglMemoryObjectParameterivEXT(memoryObject, pname, memAddress(params)); + } + + public static void glMemoryObjectParameteriEXT(@NativeType("GLuint") int memoryObject, @NativeType("GLenum") int pname, @NativeType("GLint const *") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.ints(param); + nglMemoryObjectParameterivEXT(memoryObject, pname, memAddress(params)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMemoryObjectParameterivEXT ] --- + + public static native void nglGetMemoryObjectParameterivEXT(int memoryObject, int pname, long params); + + public static void glGetMemoryObjectParameterivEXT(@NativeType("GLuint") int memoryObject, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetMemoryObjectParameterivEXT(memoryObject, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetMemoryObjectParameteriEXT(@NativeType("GLuint") int memoryObject, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetMemoryObjectParameterivEXT(memoryObject, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glTexStorageMem2DEXT ] --- + + public static native void glTexStorageMem2DEXT(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glTexStorageMem2DMultisampleEXT ] --- + + public static native void glTexStorageMem2DMultisampleEXT(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedSampleLocations, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glTexStorageMem3DEXT ] --- + + public static native void glTexStorageMem3DEXT(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glTexStorageMem3DMultisampleEXT ] --- + + public static native void glTexStorageMem3DMultisampleEXT(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedSampleLocations, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glBufferStorageMemEXT ] --- + + public static native void glBufferStorageMemEXT(@NativeType("GLenum") int target, @NativeType("GLsizeiptr") long size, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glTextureStorageMem2DEXT ] --- + + public static native void glTextureStorageMem2DEXT(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glTextureStorageMem2DMultisampleEXT ] --- + + public static native void glTextureStorageMem2DMultisampleEXT(@NativeType("GLuint") int texture, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedSampleLocations, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glTextureStorageMem3DEXT ] --- + + public static native void glTextureStorageMem3DEXT(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glTextureStorageMem3DMultisampleEXT ] --- + + public static native void glTextureStorageMem3DMultisampleEXT(@NativeType("GLuint") int texture, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedSampleLocations, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glNamedBufferStorageMemEXT ] --- + + public static native void glNamedBufferStorageMemEXT(@NativeType("GLuint") int buffer, @NativeType("GLsizeiptr") long size, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glTexStorageMem1DEXT ] --- + + public static native void glTexStorageMem1DEXT(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glTextureStorageMem1DEXT ] --- + + public static native void glTextureStorageMem1DEXT(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + /** Array version of: {@link #glDeleteMemoryObjectsEXT DeleteMemoryObjectsEXT} */ + public static void glDeleteMemoryObjectsEXT(@NativeType("GLuint const *") int[] memoryObjects) { + long __functionAddress = GL.getICD().glDeleteMemoryObjectsEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(memoryObjects.length, memoryObjects, __functionAddress); + } + + /** Array version of: {@link #glCreateMemoryObjectsEXT CreateMemoryObjectsEXT} */ + public static void glCreateMemoryObjectsEXT(@NativeType("GLuint *") int[] memoryObjects) { + long __functionAddress = GL.getICD().glCreateMemoryObjectsEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(memoryObjects.length, memoryObjects, __functionAddress); + } + + /** Array version of: {@link #glMemoryObjectParameterivEXT MemoryObjectParameterivEXT} */ + public static void glMemoryObjectParameterivEXT(@NativeType("GLuint") int memoryObject, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glMemoryObjectParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(memoryObject, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetMemoryObjectParameterivEXT GetMemoryObjectParameterivEXT} */ + public static void glGetMemoryObjectParameterivEXT(@NativeType("GLuint") int memoryObject, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetMemoryObjectParameterivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(memoryObject, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObjectFD.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObjectFD.java new file mode 100644 index 000000000..516cf292d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObjectFD.java @@ -0,0 +1,33 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_memory_object_fd extension. + * + *

    Building upon the OpenGL memory object and semaphore framework defined in EXT_external_objects this extension enables an OpenGL + * application to import a memory object or semaphore from POSIX file descriptor external handles.

    + * + *

    Requires {@link EXTMemoryObject EXT_memory_object} and {@link ARBTextureStorage ARB_texture_storage} or a version of OpenGL that incorporates it.

    + */ +public class EXTMemoryObjectFD { + + static { GL.initialize(); } + + /** Accepted by the {@code handleType} parameter of {@link #glImportMemoryFdEXT ImportMemoryFdEXT} */ + public static final int GL_HANDLE_TYPE_OPAQUE_FD_EXT = 0x9586; + + protected EXTMemoryObjectFD() { + throw new UnsupportedOperationException(); + } + + // --- [ glImportMemoryFdEXT ] --- + + public static native void glImportMemoryFdEXT(@NativeType("GLuint") int memory, @NativeType("GLuint64") long size, @NativeType("GLenum") int handleType, @NativeType("GLint") int fd); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObjectWin32.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObjectWin32.java new file mode 100644 index 000000000..5efb84494 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTMemoryObjectWin32.java @@ -0,0 +1,77 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; + +/** + * Native bindings to the EXT_memory_object_win32 extension. + * + *

    Building upon the OpenGL memory object and semaphore framework defined in EXT_external_objects, this extension enables an + * OpenGL application to import a memory object or semaphore from a Win32 NT handle or a KMT share handle.

    + */ +public class EXTMemoryObjectWin32 { + + static { GL.initialize(); } + + /** + * Accepted by the {@code handleType} parameter of {@link #glImportMemoryWin32HandleEXT ImportMemoryWin32HandleEXT}, {@link #glImportMemoryWin32NameEXT ImportMemoryWin32NameEXT}, {@link EXTSemaphoreWin32#glImportSemaphoreWin32HandleEXT ImportSemaphoreWin32HandleEXT}, and + * {@link EXTSemaphoreWin32#glImportSemaphoreWin32NameEXT ImportSemaphoreWin32NameEXT}. + */ + public static final int GL_HANDLE_TYPE_OPAQUE_WIN32_EXT = 0x9587; + + /** Accepted by the {@code handleType} parameter of {@link #glImportMemoryWin32HandleEXT ImportMemoryWin32HandleEXT} and {@link EXTSemaphoreWin32#glImportSemaphoreWin32HandleEXT ImportSemaphoreWin32HandleEXT}. */ + public static final int GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT = 0x9588; + + /** + * Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, GetInteger64v, GetBooleani_v, GetIntegeri_v, GetFloati_v, + * GetDoublei_v, and GetInteger64i_v. + */ + public static final int + GL_DEVICE_LUID_EXT = 0x9599, + GL_DEVICE_NODE_MASK_EXT = 0x959A; + + /** Constant values. */ + public static final int GL_LUID_SIZE_EXT = 8; + + /** Accepted by the {@code handleType} parameter of {@link #glImportMemoryWin32HandleEXT ImportMemoryWin32HandleEXT} and {@link #glImportMemoryWin32NameEXT ImportMemoryWin32NameEXT}. */ + public static final int + GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT = 0x9589, + GL_HANDLE_TYPE_D3D12_RESOURCE_EXT = 0x958A, + GL_HANDLE_TYPE_D3D11_IMAGE_EXT = 0x958B; + + /** Accepted by the {@code handleType} parameter of {@link #glImportMemoryWin32HandleEXT ImportMemoryWin32HandleEXT}. */ + public static final int GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT = 0x958C; + + protected EXTMemoryObjectWin32() { + throw new UnsupportedOperationException(); + } + + // --- [ glImportMemoryWin32HandleEXT ] --- + + public static native void nglImportMemoryWin32HandleEXT(int memory, long size, int handleType, long handle); + + public static void glImportMemoryWin32HandleEXT(@NativeType("GLuint") int memory, @NativeType("GLuint64") long size, @NativeType("GLenum") int handleType, @NativeType("void *") long handle) { + if (CHECKS) { + check(handle); + } + nglImportMemoryWin32HandleEXT(memory, size, handleType, handle); + } + + // --- [ glImportMemoryWin32NameEXT ] --- + + public static native void nglImportMemoryWin32NameEXT(int memory, long size, int handleType, long name); + + public static void glImportMemoryWin32NameEXT(@NativeType("GLuint") int memory, @NativeType("GLuint64") long size, @NativeType("GLenum") int handleType, @NativeType("void const *") long name) { + if (CHECKS) { + check(name); + } + nglImportMemoryWin32NameEXT(memory, size, handleType, name); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPackedDepthStencil.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPackedDepthStencil.java new file mode 100644 index 000000000..37afeec58 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPackedDepthStencil.java @@ -0,0 +1,84 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_packed_depth_stencil extension. + * + *

    Many OpenGL implementations have chosen to interleave the depth and stencil buffers into one buffer, often with 24 bits of depth precision and 8 bits + * of stencil data. 32 bits is more than is needed for the depth buffer much of the time; a 24-bit depth buffer, on the other hand, requires that reads + * and writes of depth data be unaligned with respect to power-of-two boundaries. On the other hand, 8 bits of stencil data is more than sufficient for + * most applications, so it is only natural to pack the two buffers into a single buffer with both depth and stencil data. OpenGL never provides direct + * access to the buffers, so the OpenGL implementation can provide an interface to applications where it appears the one merged buffer is composed of two + * logical buffers.

    + * + *

    One disadvantage of this scheme is that OpenGL lacks any means by which this packed data can be handled efficiently. For example, when an application + * reads from the 24-bit depth buffer, using the type GL_UNSIGNED_SHORT will lose 8 bits of data, while GL_UNSIGNED_INT has 8 too many. Both require + * expensive format conversion operations. A 24-bit format would be no more suitable, because it would also suffer from the unaligned memory accesses that + * made the standalone 24-bit depth buffer an unattractive proposition in the first place.

    + * + *

    Many applications, such as parallel rendering applications, may also wish to draw to or read back from both the depth and stencil buffers at the same + * time. Currently this requires two separate operations, reducing performance. Since the buffers are interleaved, drawing to or reading from both should + * be no more expensive than using just one; in some cases, it may even be cheaper.

    + * + *

    This extension provides a new data format, GL_DEPTH_STENCIL_EXT, that can be used with the glDrawPixels, glReadPixels, and glCopyPixels commands, as + * well as a packed data type, GL_UNSIGNED_INT_24_8_EXT, that is meant to be used with GL_DEPTH_STENCIL_EXT. No other data types are supported with + * GL_DEPTH_STENCIL_EXT. If ARB_depth_texture or SGIX_depth_texture is supported, GL_DEPTH_STENCIL_EXT/GL_UNSIGNED_INT_24_8_EXT data can also be used for + * textures; this provides a more efficient way to supply data for a 24-bit depth texture.

    + * + *

    GL_DEPTH_STENCIL_EXT data, when passed through the pixel path, undergoes both depth and stencil operations. The depth data is scaled and biased by the + * current GL_DEPTH_SCALE and GL_DEPTH_BIAS, while the stencil data is shifted and offset by the current GL_INDEX_SHIFT and GL_INDEX_OFFSET. The stencil + * data is also put through the stencil-to-stencil pixel map.

    + * + *

    glDrawPixels of GL_DEPTH_STENCIL_EXT data operates similarly to that of GL_STENCIL_INDEX data, bypassing the OpenGL fragment pipeline entirely, unlike + * the treatment of GL_DEPTH_COMPONENT data. The stencil and depth masks are applied, as are the pixel ownership and scissor tests, but all other + * operations are skipped.

    + * + *

    glReadPixels of GL_DEPTH_STENCIL_EXT data reads back a rectangle from both the depth and stencil buffers.

    + * + *

    glCopyPixels of GL_DEPTH_STENCIL_EXT data copies a rectangle from both the depth and stencil buffers. Like glDrawPixels, it applies both the stencil + * and depth masks but skips the remainder of the OpenGL fragment pipeline.

    + * + *

    glTex[Sub]Image[1,2,3]D of GL_DEPTH_STENCIL_EXT data loads depth and stencil data into a depth_stencil texture. glGetTexImage of GL_DEPTH_STENCIL_EXT + * data can be used to retrieve depth and stencil data from a depth/stencil texture.

    + * + *

    In addition, a new base internal format, GL_DEPTH_STENCIL_EXT, can be used by both texture images and renderbuffer storage. When an image with a + * DEPTH_STENCIL_EXT internal format is attached to both the depth and stencil attachment points of a framebuffer object (see EXT_framebuffer_object), + * then it becomes both the depth and stencil buffers of the framebuffer. This fits nicely with hardware that interleaves both depth and stencil data into + * a single buffer. When a texture with DEPTH_STENCIL_EXT data is bound for texturing, only the depth component is accessible through the texture fetcher. + * The stencil data can be written with TexImage or CopyTexImage, and can be read with GetTexImage. When a DEPTH_STENCIL_EXT image is attached to the + * stencil attachment of the bound framebuffer object, the stencil data can be accessed through any operation that reads from or writes to the + * framebuffer's stencil buffer.

    + * + *

    Requires {@link EXTFramebufferObject EXT_framebuffer_object}. Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public final class EXTPackedDepthStencil { + + /** + * Accepted by the {@code format} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage, by the {@code type} parameter of CopyPixels, by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, + * CopyTexImage2D, and RenderbufferStorageEXT, and returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameterivEXT. + */ + public static final int GL_DEPTH_STENCIL_EXT = 0x84F9; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage. + */ + public static final int GL_UNSIGNED_INT_24_8_EXT = 0x84FA; + + /** + * Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorageEXT, and + * returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameterivEXT. + */ + public static final int GL_DEPTH24_STENCIL8_EXT = 0x88F0; + + /** Accepted by the {@code value} parameter of GetTexLevelParameter. */ + public static final int GL_TEXTURE_STENCIL_SIZE_EXT = 0x88F1; + + private EXTPackedDepthStencil() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPackedFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPackedFloat.java new file mode 100644 index 000000000..56bdacfac --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPackedFloat.java @@ -0,0 +1,41 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_packed_float extension. + * + *

    This extension adds a new 3-component floating-point texture format that fits within a single 32-bit word. This format stores 5 bits of biased exponent + * per component in the same manner as 16-bit floating-point formats, but rather than 10 mantissa bits, the red, green, and blue components have 6, 6, and + * 5 bits respectively. Each mantissa is assumed to have an implied leading one except in the denorm exponent case. There is no sign bit so only + * non-negative values can be represented. Positive infinity, positive denorms, and positive NaN values are representable. The value of the fourth + * component returned by a texture fetch is always 1.0.

    + * + *

    This extension also provides support for rendering into an unsigned floating-point rendering format with the assumption that the texture format + * described above could also be advertised as an unsigned floating-point format for rendering.

    + * + *

    The extension also provides a pixel external format for specifying packed float values directly.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public final class EXTPackedFloat { + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorageEXT. */ + public static final int GL_R11F_G11F_B10F_EXT = 0x8C3A; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, ColorSubTable, and GetColorTable. + */ + public static final int GL_UNSIGNED_INT_10F_11F_11F_REV_EXT = 0x8C3B; + + /** Accepted by the {@code pname} parameters of GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_RGBA_SIGNED_COMPONENTS_EXT = 0x8C3C; + + private EXTPackedFloat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPixelBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPixelBufferObject.java new file mode 100644 index 000000000..c6a727889 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPixelBufferObject.java @@ -0,0 +1,31 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_pixel_buffer_object extension. + * + *

    This extension expands on the interface provided by buffer objects. It is intended to permit buffer objects to be used not only with vertex array data, + * but also with pixel data. Buffer objects were promoted from the ARB_vertex_buffer_object extension in OpenGL 1.5.

    + */ +public final class EXTPixelBufferObject { + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferParameteriv, and + * GetBufferPointerv. + */ + public static final int + GL_PIXEL_PACK_BUFFER_EXT = 0x88EB, + GL_PIXEL_UNPACK_BUFFER_EXT = 0x88EC; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_PIXEL_PACK_BUFFER_BINDING_EXT = 0x88ED, + GL_PIXEL_UNPACK_BUFFER_BINDING_EXT = 0x88EF; + + private EXTPixelBufferObject() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPointParameters.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPointParameters.java new file mode 100644 index 000000000..264b98e32 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPointParameters.java @@ -0,0 +1,100 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_point_parameters extension. + * + *

    This extension supports additional geometric characteristics of points. It can be used to render particles or tiny light sources, commonly referred as + * "Light points".

    + * + *

    The raster brightness of a point is a function of the point area, point color, point transparency, and the response of the display's electron gun and + * phosphor. The point area and the point transparency are derived from the point size, currently provided with the {@code size} parameter of + * {@link GL11C#glPointSize PointSize}.

    + * + *

    The primary motivation is to allow the size of a point to be affected by distance attenuation. When distance attenuation has an effect, the final point + * size decreases as the distance of the point from the eye increases.

    + * + *

    The secondary motivation is a mean to control the mapping from the point size to the raster point area and point transparency. This is done in order to + * increase the dynamic range of the raster brightness of points. In other words, the alpha component of a point may be decreased (and its transparency + * increased) as its area shrinks below a defined threshold.

    + * + *

    This extension defines a derived point size to be closely related to point brightness. The brightness of a point is given by:

    + * + *
    
    + *                         1
    + * dist_atten(d) = -------------------
    + *                 a + b * d + c * d^2
    + * 
    + * brightness(Pe) = Brightness * dist_atten(|Pe|)
    + * + *

    where 'Pe' is the point in eye coordinates, and 'Brightness' is some initial value proportional to the square of the size provided with glPointSize. + * Here we simplify the raster brightness to be a function of the rasterized point area and point transparency.

    + * + *
    
    + *             brightness(Pe)      brightness(Pe) ≥ Threshold_Area
    + * area(Pe) =
    + *             Threshold_Area      Otherwise
    + * 
    + * factor(Pe) = brightness(Pe)/Threshold_Area
    + * 
    + * alpha(Pe) = Alpha * factor(Pe)
    + * + *

    where 'Alpha' comes with the point color (possibly modified by lighting).

    + * + *

    'Threshold_Area' above is in area units. Thus, it is proportional to the square of the threshold provided by the programmer through this extension.

    + * + *

    The new point size derivation method applies to all points, while the threshold applies to multisample points only.

    + */ +public class EXTPointParameters { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of glPointParameterfvEXT, and the {@code pname} of glGet. */ + public static final int + GL_POINT_SIZE_MIN_EXT = 0x8126, + GL_POINT_SIZE_MAX_EXT = 0x8127, + GL_POINT_FADE_THRESHOLD_SIZE_EXT = 0x8128, + GL_DISTANCE_ATTENUATION_EXT = 0x8129; + + protected EXTPointParameters() { + throw new UnsupportedOperationException(); + } + + // --- [ glPointParameterfEXT ] --- + + public static native void glPointParameterfEXT(@NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glPointParameterfvEXT ] --- + + public static native void nglPointParameterfvEXT(int pname, long params); + + public static void glPointParameterfvEXT(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglPointParameterfvEXT(pname, memAddress(params)); + } + + /** Array version of: {@link #glPointParameterfvEXT PointParameterfvEXT} */ + public static void glPointParameterfvEXT(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glPointParameterfvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPolygonOffsetClamp.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPolygonOffsetClamp.java new file mode 100644 index 000000000..8ca348cb6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTPolygonOffsetClamp.java @@ -0,0 +1,48 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_polygon_offset_clamp extension. + * + *

    This extension adds a new parameter to the polygon offset function that clamps the calculated offset to a minimum or maximum value. The clamping + * functionality is useful when polygons are nearly parallel to the view direction because their high slopes can result in arbitrarily large polygon + * offsets. In the particular case of shadow mapping, the lack of clamping can produce the appearance of unwanted holes when the shadow casting polygons + * are offset beyond the shadow receiving polygons, and this problem can be alleviated by enforcing a maximum offset value.

    + * + *

    Requires {@link GL33 OpenGL 3.3}.

    + */ +public class EXTPolygonOffsetClamp { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_POLYGON_OFFSET_CLAMP_EXT = 0x8E1B; + + protected EXTPolygonOffsetClamp() { + throw new UnsupportedOperationException(); + } + + // --- [ glPolygonOffsetClampEXT ] --- + + /** + * The depth values of all fragments generated by the rasterization of a polygon may be offset by a single value that is computed for that polygon. The + * function that determines this value is specified with this command. + * + *

    {@code factor} scales the maximum depth slope of the polygon, and {@code units} scales an implementation-dependent constant that relates to the usable + * resolution of the depth buffer. The resulting values are summed to produce the polygon offset value, which may then be clamped to a minimum or maximum + * value specified by {@code clamp}. The values {@code factor}, {@code units}, and {@code clamp} may each be positive, negative, or zero. Calling the + * command {@link GL11C#glPolygonOffset PolygonOffset} is equivalent to calling the command PolygonOffsetClampEXT with {@code clamp} equal to zero.

    + * + * @param factor scales the maximum depth slope of the polygon + * @param units scales an implementation-dependent constant that relates to the usable resolution of the depth buffer + * @param clamp the minimum or maximum clamp value + */ + public static native void glPolygonOffsetClampEXT(@NativeType("GLfloat") float factor, @NativeType("GLfloat") float units, @NativeType("GLfloat") float clamp); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTProvokingVertex.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTProvokingVertex.java new file mode 100644 index 000000000..93904ddef --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTProvokingVertex.java @@ -0,0 +1,53 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_provoking_vertex extension. + * + *

    This extension provides an alternative provoking vertex convention for rendering lines, triangles, and (optionally depending on the implementation) + * quads.

    + * + *

    The provoking vertex of a primitive is the vertex that determines the constant primary and secondary colors when flat shading is enabled.

    + * + *

    In OpenGL, the provoking vertex for triangle, quad, line, and (trivially) point primitives is the last vertex used to assemble the primitive. The + * polygon primitive is an exception in OpenGL where the first vertex of a polygon primitive determines the color of the polygon, even if actually broken + * into triangles and/or quads.

    + * + *

    See section 2.14.7 (Flatshading) of the OpenGL 2.1 specification, particularly Table 2.12 for more details.

    + * + *

    Alternatively the provoking vertex could be the first vertex of the primitive. Other APIs with flat-shading functionality such as Reality Lab and + * Direct3D have adopted the "first vertex of the primitive" convention to determine the provoking vertex. However, these APIs lack quads so do not have a + * defined provoking vertex convention for quads.

    + * + *

    The motivation for this extension is to allow applications developed for APIs with a "first vertex of the primitive" provoking vertex to be easily + * converted to OpenGL.

    + */ +public class EXTProvokingVertex { + + static { GL.initialize(); } + + /** Accepted by the {@code mode} parameter of ProvokingVertexEXT. */ + public static final int + GL_FIRST_VERTEX_CONVENTION_EXT = 0x8E4D, + GL_LAST_VERTEX_CONVENTION_EXT = 0x8E4E; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_PROVOKING_VERTEX_EXT = 0x8E4F, + GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT = 0x8E4C; + + protected EXTProvokingVertex() { + throw new UnsupportedOperationException(); + } + + // --- [ glProvokingVertexEXT ] --- + + public static native void glProvokingVertexEXT(@NativeType("GLenum") int mode); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTRasterMultisample.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTRasterMultisample.java new file mode 100644 index 000000000..830b763b0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTRasterMultisample.java @@ -0,0 +1,78 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_raster_multisample extension. + * + *

    This extension allows rendering to a non-multisample color buffer while rasterizing with more than one sample. The result of rasterization (coverage) + * is available in the {@code gl_SampleMaskIn[]} fragment shader input, multisample rasterization is enabled for all primitives, and several per- fragment + * operations operate at the raster sample rate.

    + * + *

    When using the functionality provided by this extension, depth, stencil, and depth bounds tests must be disabled, and a multisample draw framebuffer + * must not be used.

    + * + *

    A fragment's "coverage", or "effective raster samples" is considered to have "N bits" (as opposed to "one bit" corresponding to the single color + * sample) through the fragment shader, in the sample mask output, through the multisample fragment operations and occlusion query, until the coverage is + * finally "reduced" to a single bit in a new "Coverage Reduction" stage that occurs before blending.

    + */ +public class EXTRasterMultisample { + + static { GL.initialize(); } + + /** Accepted by the {@code cap} parameter of Enable, Disable, IsEnabled. */ + public static final int GL_RASTER_MULTISAMPLE_EXT = 0x9327; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_RASTER_SAMPLES_EXT = 0x9328, + GL_MAX_RASTER_SAMPLES_EXT = 0x9329, + GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT = 0x932A, + GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT = 0x932B, + GL_EFFECTIVE_RASTER_SAMPLES_EXT = 0x932C; + + protected EXTRasterMultisample() { + throw new UnsupportedOperationException(); + } + + // --- [ glRasterSamplesEXT ] --- + + /** + * Selects the number of samples to be used for rasterization. {@code samples} represents a request for a desired minimum number of samples. Since + * different implementations may support different sample counts, the actual sample pattern used is implementation-dependent. However, the resulting value + * for {@link #GL_RASTER_SAMPLES_EXT RASTER_SAMPLES_EXT} is guaranteed to be greater than or equal to {@code samples} and no more than the next larger sample count supported by the + * implementation. If {@code fixedsamplelocations} is {@link GL11#GL_TRUE TRUE}, identical sample locations will be used for all pixels. The sample locations chosen are a + * function of only the parameters to RasterSamplesEXT and not of any other state. + * + *

    If {@link #GL_RASTER_MULTISAMPLE_EXT RASTER_MULTISAMPLE_EXT} is enabled, then the sample pattern chosen by RasterSamplesEXT will be used instead of sampling at the center of the pixel. + * The sample locations can be queried with {@link GL32C#glGetMultisamplefv GetMultisamplefv} with a {@code pname} of {@link GL32#GL_SAMPLE_POSITION SAMPLE_POSITION}, similar to normal multisample sample + * locations.

    + * + *

    The value {@link #GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT MULTISAMPLE_RASTERIZATION_ALLOWED_EXT} is {@link GL11#GL_TRUE TRUE} if {@link GL13#GL_SAMPLE_BUFFERS SAMPLE_BUFFERS} is one or if {@link #GL_RASTER_MULTISAMPLE_EXT RASTER_MULTISAMPLE_EXT} is enabled. The value + * {@link #GL_EFFECTIVE_RASTER_SAMPLES_EXT EFFECTIVE_RASTER_SAMPLES_EXT} is equal to {@link #GL_RASTER_SAMPLES_EXT RASTER_SAMPLES_EXT} if {@link #GL_RASTER_MULTISAMPLE_EXT RASTER_MULTISAMPLE_EXT} is enabled, otherwise is equal to {@link GL13#GL_SAMPLES SAMPLES}.

    + * + *

    Explicit multisample rasterization can not be used in conjunction with depth, stencil, or depth bounds tests, multisample framebuffers, or if + * {@link #GL_RASTER_SAMPLES_EXT RASTER_SAMPLES_EXT} is zero. If {@link #GL_RASTER_MULTISAMPLE_EXT RASTER_MULTISAMPLE_EXT} is enabled, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} will be generated by Draw commands if

    + * + *
      + *
    • the value of {@link #GL_RASTER_SAMPLES_EXT RASTER_SAMPLES_EXT} is zero
    • + *
    • the depth, stencil, or depth bounds test is enabled
    • + *
    • a multisample draw framebuffer is bound ({@link GL13#GL_SAMPLE_BUFFERS SAMPLE_BUFFERS} is one)
    • + *
    + * + *
    Errors
    + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if {@code samples} is greater than the value of {@link #GL_MAX_RASTER_SAMPLES_EXT MAX_RASTER_SAMPLES_EXT} (the implementation-dependent maximum + * number of samples).

    + * + * @param samples the number of samples to be used for rasterization + * @param fixedsamplelocations if {@link GL11#GL_TRUE TRUE}, identical sample locations will be used for all pixels + */ + public static native void glRasterSamplesEXT(@NativeType("GLuint") int samples, @NativeType("GLboolean") boolean fixedsamplelocations); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSecondaryColor.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSecondaryColor.java new file mode 100644 index 000000000..790bbc8f0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSecondaryColor.java @@ -0,0 +1,425 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_secondary_color extension. + * + *

    This extension allows specifying the RGB components of the secondary color used in the Color Sum stage, instead of using the default (0,0,0,0) color. + * It applies only in RGBA mode and when LIGHTING is disabled.

    + */ +public class EXTSecondaryColor { + + static { GL.initialize(); } + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_COLOR_SUM_EXT = 0x8458; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_CURRENT_SECONDARY_COLOR_EXT = 0x8459, + GL_SECONDARY_COLOR_ARRAY_SIZE_EXT = 0x845A, + GL_SECONDARY_COLOR_ARRAY_TYPE_EXT = 0x845B, + GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT = 0x845C; + + /** Accepted by the {@code pname} parameter of GetPointerv. */ + public static final int GL_SECONDARY_COLOR_ARRAY_POINTER_EXT = 0x845D; + + /** Accepted by the {@code array} parameter of EnableClientState and DisableClientState. */ + public static final int GL_SECONDARY_COLOR_ARRAY_EXT = 0x845E; + + protected EXTSecondaryColor() { + throw new UnsupportedOperationException(); + } + + // --- [ glSecondaryColor3bEXT ] --- + + /** + * Sets the R, G, and B components of the current secondary color. + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + */ + public static native void glSecondaryColor3bEXT(@NativeType("GLbyte") byte red, @NativeType("GLbyte") byte green, @NativeType("GLbyte") byte blue); + + // --- [ glSecondaryColor3sEXT ] --- + + /** + * Short version of {@link #glSecondaryColor3bEXT SecondaryColor3bEXT} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + */ + public static native void glSecondaryColor3sEXT(@NativeType("GLshort") short red, @NativeType("GLshort") short green, @NativeType("GLshort") short blue); + + // --- [ glSecondaryColor3iEXT ] --- + + /** + * Integer version of {@link #glSecondaryColor3bEXT SecondaryColor3bEXT} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + */ + public static native void glSecondaryColor3iEXT(@NativeType("GLint") int red, @NativeType("GLint") int green, @NativeType("GLint") int blue); + + // --- [ glSecondaryColor3fEXT ] --- + + /** + * Float version of {@link #glSecondaryColor3bEXT SecondaryColor3bEXT} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + */ + public static native void glSecondaryColor3fEXT(@NativeType("GLfloat") float red, @NativeType("GLfloat") float green, @NativeType("GLfloat") float blue); + + // --- [ glSecondaryColor3dEXT ] --- + + /** + * Double version of {@link #glSecondaryColor3bEXT SecondaryColor3bEXT} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + */ + public static native void glSecondaryColor3dEXT(@NativeType("GLdouble") double red, @NativeType("GLdouble") double green, @NativeType("GLdouble") double blue); + + // --- [ glSecondaryColor3ubEXT ] --- + + /** + * Unsigned version of {@link #glSecondaryColor3bEXT SecondaryColor3bEXT} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + */ + public static native void glSecondaryColor3ubEXT(@NativeType("GLubyte") byte red, @NativeType("GLubyte") byte green, @NativeType("GLubyte") byte blue); + + // --- [ glSecondaryColor3usEXT ] --- + + /** + * Unsigned short version of {@link #glSecondaryColor3bEXT SecondaryColor3bEXT} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + */ + public static native void glSecondaryColor3usEXT(@NativeType("GLushort") short red, @NativeType("GLushort") short green, @NativeType("GLushort") short blue); + + // --- [ glSecondaryColor3uiEXT ] --- + + /** + * Unsigned int version of {@link #glSecondaryColor3bEXT SecondaryColor3bEXT} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + */ + public static native void glSecondaryColor3uiEXT(@NativeType("GLint") int red, @NativeType("GLint") int green, @NativeType("GLint") int blue); + + // --- [ glSecondaryColor3bvEXT ] --- + + /** Unsafe version of: {@link #glSecondaryColor3bvEXT SecondaryColor3bvEXT} */ + public static native void nglSecondaryColor3bvEXT(long v); + + /** + * Pointer version of {@link #glSecondaryColor3bEXT SecondaryColor3bEXT}. + * + * @param v the secondary color buffer + */ + public static void glSecondaryColor3bvEXT(@NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3bvEXT(memAddress(v)); + } + + // --- [ glSecondaryColor3svEXT ] --- + + /** Unsafe version of: {@link #glSecondaryColor3svEXT SecondaryColor3svEXT} */ + public static native void nglSecondaryColor3svEXT(long v); + + /** + * Pointer version of {@link #glSecondaryColor3sEXT SecondaryColor3sEXT}. + * + * @param v the secondary color buffer + */ + public static void glSecondaryColor3svEXT(@NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3svEXT(memAddress(v)); + } + + // --- [ glSecondaryColor3ivEXT ] --- + + /** Unsafe version of: {@link #glSecondaryColor3ivEXT SecondaryColor3ivEXT} */ + public static native void nglSecondaryColor3ivEXT(long v); + + /** + * Pointer version of {@link #glSecondaryColor3iEXT SecondaryColor3iEXT}. + * + * @param v the secondary color buffer + */ + public static void glSecondaryColor3ivEXT(@NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3ivEXT(memAddress(v)); + } + + // --- [ glSecondaryColor3fvEXT ] --- + + /** Unsafe version of: {@link #glSecondaryColor3fvEXT SecondaryColor3fvEXT} */ + public static native void nglSecondaryColor3fvEXT(long v); + + /** + * Pointer version of {@link #glSecondaryColor3fEXT SecondaryColor3fEXT}. + * + * @param v the secondary color buffer + */ + public static void glSecondaryColor3fvEXT(@NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3fvEXT(memAddress(v)); + } + + // --- [ glSecondaryColor3dvEXT ] --- + + /** Unsafe version of: {@link #glSecondaryColor3dvEXT SecondaryColor3dvEXT} */ + public static native void nglSecondaryColor3dvEXT(long v); + + /** + * Pointer version of {@link #glSecondaryColor3dEXT SecondaryColor3dEXT}. + * + * @param v the secondary color buffer + */ + public static void glSecondaryColor3dvEXT(@NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3dvEXT(memAddress(v)); + } + + // --- [ glSecondaryColor3ubvEXT ] --- + + /** Unsafe version of: {@link #glSecondaryColor3ubvEXT SecondaryColor3ubvEXT} */ + public static native void nglSecondaryColor3ubvEXT(long v); + + /** + * Pointer version of {@link #glSecondaryColor3ubEXT SecondaryColor3ubEXT}. + * + * @param v the secondary color buffer + */ + public static void glSecondaryColor3ubvEXT(@NativeType("GLubyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3ubvEXT(memAddress(v)); + } + + // --- [ glSecondaryColor3usvEXT ] --- + + /** Unsafe version of: {@link #glSecondaryColor3usvEXT SecondaryColor3usvEXT} */ + public static native void nglSecondaryColor3usvEXT(long v); + + /** + * Pointer version of {@link #glSecondaryColor3usEXT SecondaryColor3usEXT}. + * + * @param v the secondary color buffer + */ + public static void glSecondaryColor3usvEXT(@NativeType("GLushort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3usvEXT(memAddress(v)); + } + + // --- [ glSecondaryColor3uivEXT ] --- + + /** Unsafe version of: {@link #glSecondaryColor3uivEXT SecondaryColor3uivEXT} */ + public static native void nglSecondaryColor3uivEXT(long v); + + /** + * Pointer version of {@link #glSecondaryColor3uiEXT SecondaryColor3uiEXT}. + * + * @param v the secondary color buffer + */ + public static void glSecondaryColor3uivEXT(@NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3uivEXT(memAddress(v)); + } + + // --- [ glSecondaryColorPointerEXT ] --- + + /** Unsafe version of: {@link #glSecondaryColorPointerEXT SecondaryColorPointerEXT} */ + public static native void nglSecondaryColorPointerEXT(int size, int type, int stride, long pointer); + + /** + * Specifies the location and organization of a secondary color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. Must be:
    3
    + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the secondary color array data + */ + public static void glSecondaryColorPointerEXT(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglSecondaryColorPointerEXT(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a secondary color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. Must be:
    3
    + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the secondary color array data + */ + public static void glSecondaryColorPointerEXT(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglSecondaryColorPointerEXT(size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a secondary color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. Must be:
    3
    + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the secondary color array data + */ + public static void glSecondaryColorPointerEXT(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglSecondaryColorPointerEXT(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a secondary color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. Must be:
    3
    + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the secondary color array data + */ + public static void glSecondaryColorPointerEXT(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglSecondaryColorPointerEXT(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a secondary color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. Must be:
    3
    + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the secondary color array data + */ + public static void glSecondaryColorPointerEXT(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglSecondaryColorPointerEXT(size, type, stride, memAddress(pointer)); + } + + /** Array version of: {@link #glSecondaryColor3svEXT SecondaryColor3svEXT} */ + public static void glSecondaryColor3svEXT(@NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3svEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glSecondaryColor3ivEXT SecondaryColor3ivEXT} */ + public static void glSecondaryColor3ivEXT(@NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3ivEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glSecondaryColor3fvEXT SecondaryColor3fvEXT} */ + public static void glSecondaryColor3fvEXT(@NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3fvEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glSecondaryColor3dvEXT SecondaryColor3dvEXT} */ + public static void glSecondaryColor3dvEXT(@NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3dvEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glSecondaryColor3usvEXT SecondaryColor3usvEXT} */ + public static void glSecondaryColor3usvEXT(@NativeType("GLushort const *") short[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3usvEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glSecondaryColor3uivEXT SecondaryColor3uivEXT} */ + public static void glSecondaryColor3uivEXT(@NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3uivEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glSecondaryColorPointerEXT SecondaryColorPointerEXT} */ + public static void glSecondaryColorPointerEXT(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") short[] pointer) { + long __functionAddress = GL.getICD().glSecondaryColorPointerEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(size, type, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glSecondaryColorPointerEXT SecondaryColorPointerEXT} */ + public static void glSecondaryColorPointerEXT(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") int[] pointer) { + long __functionAddress = GL.getICD().glSecondaryColorPointerEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(size, type, stride, pointer, __functionAddress); + } + + /** Array version of: {@link #glSecondaryColorPointerEXT SecondaryColorPointerEXT} */ + public static void glSecondaryColorPointerEXT(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") float[] pointer) { + long __functionAddress = GL.getICD().glSecondaryColorPointerEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(size, type, stride, pointer, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphore.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphore.java new file mode 100644 index 000000000..7f01401b9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphore.java @@ -0,0 +1,259 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_semaphore extension. + * + *

    The Vulkan API introduces the concept of explicit memory objects and reusable synchronization objects. This extension brings those concepts to the + * OpenGL API via two new object types:

    + * + *
      + *
    • Memory objects
    • + *
    • Semaphores
    • + *
    + * + *

    Rather than allocating memory as a response to object allocation, memory allocation and binding are two separate operations in Vulkan. This extension + * allows an OpenGL application to import a Vulkan memory object, and to bind textures and/or buffer objects to it.

    + * + *

    No methods to import memory objects are defined here. Separate platform-specific extensions are defined for this purpose.

    + * + *

    Semaphores are synchronization primitives that can be waited on and signaled only by the GPU, or in GL terms, in the GL server. They are similar in + * concept to GL's "sync" objects and EGL's "EGLSync" objects, but different enough that compatibilities between the two are difficult to derive.

    + * + *

    Rather than attempt to map Vulkan semaphores on to GL/EGL sync objects to achieve interoperability, this extension introduces a new object, GL + * semaphores, that map directly to the semantics of Vulkan semaphores. To achieve full image and buffer memory coherence with a Vulkan driver, the + * commands that manipulate semaphores also allow external usage information to be imported and exported.

    + */ +public class EXTSemaphore { + + static { GL.initialize(); } + + /** + * Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, GetInteger64v, {@link #glGetUnsignedBytevEXT GetUnsignedBytevEXT}, and the + * {@code target} parameter of GetBooleani_v, GetIntegeri_v,GetFloati_v, GetDoublei_v, GetInteger64i_v, and {@link #glGetUnsignedBytei_vEXT GetUnsignedBytei_vEXT}. + */ + public static final int + GL_NUM_DEVICE_UUIDS_EXT = 0x9596, + GL_DEVICE_UUID_EXT = 0x9597, + GL_DRIVER_UUID_EXT = 0x9598; + + /** Constant values. */ + public static final int GL_UUID_SIZE_EXT = 16; + + /** Accepted by the {@code dstLayouts} parameter of {@link #glSignalSemaphoreEXT SignalSemaphoreEXT} and the {@code srcLayouts} parameter of {@link #glWaitSemaphoreEXT WaitSemaphoreEXT}. */ + public static final int + GL_LAYOUT_GENERAL_EXT = 0x958D, + GL_LAYOUT_COLOR_ATTACHMENT_EXT = 0x958E, + GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT = 0x958F, + GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT = 0x9590, + GL_LAYOUT_SHADER_READ_ONLY_EXT = 0x9591, + GL_LAYOUT_TRANSFER_SRC_EXT = 0x9592, + GL_LAYOUT_TRANSFER_DST_EXT = 0x9593, + GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT = 0x9530, + GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT = 0x9531; + + protected EXTSemaphore() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetUnsignedBytevEXT ] --- + + public static void nglGetUnsignedBytevEXT(int pname, long data) { + EXTMemoryObject.nglGetUnsignedBytevEXT(pname, data); + } + + public static void glGetUnsignedBytevEXT(@NativeType("GLenum") int pname, @NativeType("GLubyte *") ByteBuffer data) { + EXTMemoryObject.glGetUnsignedBytevEXT(pname, data); + } + + // --- [ glGetUnsignedBytei_vEXT ] --- + + public static void nglGetUnsignedBytei_vEXT(int target, int index, long data) { + EXTMemoryObject.nglGetUnsignedBytei_vEXT(target, index, data); + } + + public static void glGetUnsignedBytei_vEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLubyte *") ByteBuffer data) { + EXTMemoryObject.glGetUnsignedBytei_vEXT(target, index, data); + } + + // --- [ glGenSemaphoresEXT ] --- + + public static native void nglGenSemaphoresEXT(int n, long semaphores); + + public static void glGenSemaphoresEXT(@NativeType("GLuint *") IntBuffer semaphores) { + nglGenSemaphoresEXT(semaphores.remaining(), memAddress(semaphores)); + } + + @NativeType("void") + public static int glGenSemaphoresEXT() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer semaphores = stack.callocInt(1); + nglGenSemaphoresEXT(1, memAddress(semaphores)); + return semaphores.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDeleteSemaphoresEXT ] --- + + public static native void nglDeleteSemaphoresEXT(int n, long semaphores); + + public static void glDeleteSemaphoresEXT(@NativeType("GLuint const *") IntBuffer semaphores) { + nglDeleteSemaphoresEXT(semaphores.remaining(), memAddress(semaphores)); + } + + public static void glDeleteSemaphoresEXT(@NativeType("GLuint const *") int semaphore) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer semaphores = stack.ints(semaphore); + nglDeleteSemaphoresEXT(1, memAddress(semaphores)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsSemaphoreEXT ] --- + + @NativeType("GLboolean") + public static native boolean glIsSemaphoreEXT(@NativeType("GLuint") int semaphore); + + // --- [ glSemaphoreParameterui64vEXT ] --- + + public static native void nglSemaphoreParameterui64vEXT(int semaphore, int pname, long params); + + public static void glSemaphoreParameterui64vEXT(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int pname, @NativeType("GLuint64 const *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglSemaphoreParameterui64vEXT(semaphore, pname, memAddress(params)); + } + + public static void glSemaphoreParameterui64EXT(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int pname, @NativeType("GLuint64 const *") long param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.longs(param); + nglSemaphoreParameterui64vEXT(semaphore, pname, memAddress(params)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetSemaphoreParameterui64vEXT ] --- + + public static native void nglGetSemaphoreParameterui64vEXT(int semaphore, int pname, long params); + + public static void glGetSemaphoreParameterui64vEXT(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetSemaphoreParameterui64vEXT(semaphore, pname, memAddress(params)); + } + + @NativeType("void") + public static long glGetSemaphoreParameterui64EXT(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetSemaphoreParameterui64vEXT(semaphore, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glWaitSemaphoreEXT ] --- + + public static native void nglWaitSemaphoreEXT(int semaphore, int numBufferBarriers, long buffers, int numTextureBarriers, long textures, long srcLayouts); + + public static void glWaitSemaphoreEXT(@NativeType("GLuint") int semaphore, @NativeType("GLuint const *") IntBuffer buffers, @NativeType("GLuint const *") IntBuffer textures, @NativeType("GLenum const *") IntBuffer srcLayouts) { + if (CHECKS) { + check(srcLayouts, textures.remaining()); + } + nglWaitSemaphoreEXT(semaphore, buffers.remaining(), memAddress(buffers), textures.remaining(), memAddress(textures), memAddress(srcLayouts)); + } + + // --- [ glSignalSemaphoreEXT ] --- + + public static native void nglSignalSemaphoreEXT(int semaphore, int numBufferBarriers, long buffers, int numTextureBarriers, long textures, long dstLayouts); + + public static void glSignalSemaphoreEXT(@NativeType("GLuint") int semaphore, @NativeType("GLuint const *") IntBuffer buffers, @NativeType("GLuint const *") IntBuffer textures, @NativeType("GLenum const *") IntBuffer dstLayouts) { + if (CHECKS) { + check(dstLayouts, textures.remaining()); + } + nglSignalSemaphoreEXT(semaphore, buffers.remaining(), memAddress(buffers), textures.remaining(), memAddress(textures), memAddress(dstLayouts)); + } + + /** Array version of: {@link #glGenSemaphoresEXT GenSemaphoresEXT} */ + public static void glGenSemaphoresEXT(@NativeType("GLuint *") int[] semaphores) { + long __functionAddress = GL.getICD().glGenSemaphoresEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(semaphores.length, semaphores, __functionAddress); + } + + /** Array version of: {@link #glDeleteSemaphoresEXT DeleteSemaphoresEXT} */ + public static void glDeleteSemaphoresEXT(@NativeType("GLuint const *") int[] semaphores) { + long __functionAddress = GL.getICD().glDeleteSemaphoresEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(semaphores.length, semaphores, __functionAddress); + } + + /** Array version of: {@link #glSemaphoreParameterui64vEXT SemaphoreParameterui64vEXT} */ + public static void glSemaphoreParameterui64vEXT(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int pname, @NativeType("GLuint64 const *") long[] params) { + long __functionAddress = GL.getICD().glSemaphoreParameterui64vEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(semaphore, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetSemaphoreParameterui64vEXT GetSemaphoreParameterui64vEXT} */ + public static void glGetSemaphoreParameterui64vEXT(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetSemaphoreParameterui64vEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(semaphore, pname, params, __functionAddress); + } + + /** Array version of: {@link #glWaitSemaphoreEXT WaitSemaphoreEXT} */ + public static void glWaitSemaphoreEXT(@NativeType("GLuint") int semaphore, @NativeType("GLuint const *") int[] buffers, @NativeType("GLuint const *") int[] textures, @NativeType("GLenum const *") int[] srcLayouts) { + long __functionAddress = GL.getICD().glWaitSemaphoreEXT; + if (CHECKS) { + check(__functionAddress); + check(srcLayouts, textures.length); + } + callPPPV(semaphore, buffers.length, buffers, textures.length, textures, srcLayouts, __functionAddress); + } + + /** Array version of: {@link #glSignalSemaphoreEXT SignalSemaphoreEXT} */ + public static void glSignalSemaphoreEXT(@NativeType("GLuint") int semaphore, @NativeType("GLuint const *") int[] buffers, @NativeType("GLuint const *") int[] textures, @NativeType("GLenum const *") int[] dstLayouts) { + long __functionAddress = GL.getICD().glSignalSemaphoreEXT; + if (CHECKS) { + check(__functionAddress); + check(dstLayouts, textures.length); + } + callPPPV(semaphore, buffers.length, buffers, textures.length, textures, dstLayouts, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphoreFD.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphoreFD.java new file mode 100644 index 000000000..823bee88d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphoreFD.java @@ -0,0 +1,33 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_semaphore_fd extension. + * + *

    Building upon the OpenGL memory object and semaphore framework defined in EXT_external_objects this extension enables an OpenGL + * application to import a memory object or semaphore from POSIX file descriptor external handles.

    + * + *

    Requires {@link EXTSemaphore EXT_semaphore} and {@link ARBTextureStorage ARB_texture_storage} or a version of OpenGL that incorporates it.

    + */ +public class EXTSemaphoreFD { + + static { GL.initialize(); } + + /** Accepted by the {@code handleType} parameter of {@link #glImportSemaphoreFdEXT ImportSemaphoreFdEXT}. */ + public static final int GL_HANDLE_TYPE_OPAQUE_FD_EXT = 0x9586; + + protected EXTSemaphoreFD() { + throw new UnsupportedOperationException(); + } + + // --- [ glImportSemaphoreFdEXT ] --- + + public static native void glImportSemaphoreFdEXT(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int handleType, @NativeType("GLint") int fd); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphoreWin32.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphoreWin32.java new file mode 100644 index 000000000..6ba72e409 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSemaphoreWin32.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; + +/** + * Native bindings to the EXT_semaphore_win32 extension. + * + *

    Building upon the OpenGL memory object and semaphore framework defined in EXT_external_objects, this extension enables an + * OpenGL application to import a memory object or semaphore from a Win32 NT handle or a KMT share handle.

    + */ +public class EXTSemaphoreWin32 { + + static { GL.initialize(); } + + /** + * Accepted by the {@code handleType} parameter of {@link EXTMemoryObjectWin32#glImportMemoryWin32HandleEXT ImportMemoryWin32HandleEXT}, {@link EXTMemoryObjectWin32#glImportMemoryWin32NameEXT ImportMemoryWin32NameEXT}, {@link #glImportSemaphoreWin32HandleEXT ImportSemaphoreWin32HandleEXT}, and + * {@link #glImportSemaphoreWin32NameEXT ImportSemaphoreWin32NameEXT}. + */ + public static final int GL_HANDLE_TYPE_OPAQUE_WIN32_EXT = 0x9587; + + /** Accepted by the {@code handleType} parameter of {@link EXTMemoryObjectWin32#glImportMemoryWin32HandleEXT ImportMemoryWin32HandleEXT} and {@link #glImportSemaphoreWin32HandleEXT ImportSemaphoreWin32HandleEXT}. */ + public static final int GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT = 0x9588; + + /** + * Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, GetInteger64v, GetBooleani_v, GetIntegeri_v, GetFloati_v, + * GetDoublei_v, and GetInteger64i_v. + */ + public static final int + GL_DEVICE_LUID_EXT = 0x9599, + GL_DEVICE_NODE_MASK_EXT = 0x959A; + + /** Constant values. */ + public static final int GL_LUID_SIZE_EXT = 8; + + /** Accepted by the {@code handleType} parameter of {@link #glImportSemaphoreWin32HandleEXT ImportSemaphoreWin32HandleEXT}. */ + public static final int GL_HANDLE_TYPE_D3D12_FENCE_EXT = 0x9594; + + /** Accepted by the {@code pname} parameter of {@link EXTSemaphore#glSemaphoreParameterui64vEXT SemaphoreParameterui64vEXT} and {@link EXTSemaphore#glGetSemaphoreParameterui64vEXT GetSemaphoreParameterui64vEXT}. */ + public static final int GL_D3D12_FENCE_VALUE_EXT = 0x9595; + + protected EXTSemaphoreWin32() { + throw new UnsupportedOperationException(); + } + + // --- [ glImportSemaphoreWin32HandleEXT ] --- + + public static native void nglImportSemaphoreWin32HandleEXT(int semaphore, int handleType, long handle); + + public static void glImportSemaphoreWin32HandleEXT(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int handleType, @NativeType("void *") long handle) { + if (CHECKS) { + check(handle); + } + nglImportSemaphoreWin32HandleEXT(semaphore, handleType, handle); + } + + // --- [ glImportSemaphoreWin32NameEXT ] --- + + public static native void nglImportSemaphoreWin32NameEXT(int semaphore, int handleType, long name); + + public static void glImportSemaphoreWin32NameEXT(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int handleType, @NativeType("void const *") long name) { + if (CHECKS) { + check(name); + } + nglImportSemaphoreWin32NameEXT(semaphore, handleType, name); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSeparateShaderObjects.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSeparateShaderObjects.java new file mode 100644 index 000000000..1b8d473f5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSeparateShaderObjects.java @@ -0,0 +1,96 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_separate_shader_objects extension. + * + *

    rior to this extension, GLSL requires multiple shader domains (vertex, fragment, geometry) to be linked into a single monolithic program object to + * specify a GLSL shader for each domain.

    + * + *

    While GLSL's monolithic approach has some advantages for optimizing shaders as a unit that span multiple domains, all existing GPU hardware supports + * the more flexible mix-and-match approach.

    + * + *

    HLSL9, Cg, the prior OpenGL assembly program extensions, and game console programmers favor a more flexible "mix-and-match" approach to specifying + * shaders independently for these different shader domains. Many developers build their shader content around the mix-and-match approach where they can + * use a single vertex shader with multiple fragment shaders (or vice versa).

    + * + *

    This keep-it-simple extension adapts the "mix-and-match" shader domain model for GLSL so different GLSL program objects can be bound to different + * shader domains.

    + * + *

    This extension redefines the operation of glUseProgram(GLenum program) to be equivalent to:

    + * + *
    
    + *  glUseShaderProgramEXT(GL_VERTEX_SHADER, program);
    + * glUseShaderProgramEXT(GL_GEOMETRY_SHADER_EXT, program);
    + * glUseShaderProgramEXT(GL_FRAGMENT_SHADER, program);
    + * glActiveProgramEXT(program);
    + * + *

    You can also call these commands separately to bind each respective domain. The GL_VERTEX_SHADER, GL_GEOMETRY_SHADER_EXT, and GL_FRAGMENT_SHADER tokens + * refer to the conventional vertex, geometry, and fragment domains respectively. glActiveProgramEXT specifies the program that glUniform* commands will + * update.

    + * + *

    Separate linking creates the possibility that certain output varyings of a shader may go unread by the subsequent shader inputting varyings. In this + * case, the output varyings are simply ignored. It is also possible input varyings from a shader may not be written as output varyings of a preceding + * shader. In this case, the unwritten input varying values are undefined. Implementations are encouraged to zero these undefined input varying values.

    + * + *

    This extension is a proof-of-concept that separate shader objects can work for GLSL and a response to repeated requests for this functionality. There + * are various loose ends, particularly when dealing with user-defined varyings. The hope is a future extension will improve this situation.

    + * + *

    Requires {@link GL20 OpenGL 2.0} or {@link ARBShaderObjects ARB_shader_objects}.

    + */ +public class EXTSeparateShaderObjects { + + static { GL.initialize(); } + + /** Accepted by {@code type} parameter to GetIntegerv and GetFloatv. */ + public static final int GL_ACTIVE_PROGRAM_EXT = 0x8B8D; + + protected EXTSeparateShaderObjects() { + throw new UnsupportedOperationException(); + } + + // --- [ glUseShaderProgramEXT ] --- + + public static native void glUseShaderProgramEXT(@NativeType("GLenum") int type, @NativeType("GLuint") int program); + + // --- [ glActiveProgramEXT ] --- + + public static native void glActiveProgramEXT(@NativeType("GLuint") int program); + + // --- [ glCreateShaderProgramEXT ] --- + + public static native int nglCreateShaderProgramEXT(int type, long string); + + @NativeType("GLuint") + public static int glCreateShaderProgramEXT(@NativeType("GLenum") int type, @NativeType("GLchar const *") ByteBuffer string) { + if (CHECKS) { + checkNT1(string); + } + return nglCreateShaderProgramEXT(type, memAddress(string)); + } + + @NativeType("GLuint") + public static int glCreateShaderProgramEXT(@NativeType("GLenum") int type, @NativeType("GLchar const *") CharSequence string) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(string, true); + long stringEncoded = stack.getPointerAddress(); + return nglCreateShaderProgramEXT(type, stringEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderFramebufferFetch.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderFramebufferFetch.java new file mode 100644 index 000000000..2f1601084 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderFramebufferFetch.java @@ -0,0 +1,42 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_shader_framebuffer_fetch extension. + * + *

    Conventional OpenGL blending provides a configurable series of operations that can be used to combine the output values from a fragment shader with the + * values already in the framebuffer. While these operations are suitable for basic image compositing, other compositing operations or operations that + * treat fragment output as something other than a color (normals, for instance) may not be expressible without multiple passes or render-to-texture + * operations.

    + * + *

    This extension provides a mechanism whereby a fragment shader may read existing framebuffer data as input. This can be used to implement compositing + * operations that would have been inconvenient or impossible with fixed-function blending. It can also be used to apply a function to the framebuffer + * color, by writing a shader which uses the existing framebuffer color as its only input.

    + * + *

    This extension provides two alternative name strings:

    + * + *
      + *
    • {@code GL_EXT_shader_framebuffer_fetch} guarantees full coherency between framebuffer reads and writes. If this extension string is exposed, the + * result of reading from the framebuffer from a fragment shader invocation is guaranteed to reflect values written by any previous overlapping + * samples in API primitive order, unless requested otherwise in the shader source using the noncoherent layout qualifier.
    • + *
    • {@code GL_EXT_shader_framebuffer_fetch_non_coherent} provides limited implicit coherency guarantees. Instead, the application is expected to call + * the {@link EXTShaderFramebufferFetchNonCoherent#glFramebufferFetchBarrierEXT FramebufferFetchBarrierEXT} command for previous framebuffer writes to become visible to subsequent fragment shader invocations. For this + * extension to give well-defined results applications may have to split rendering into multiple passes separated with + * {@code FramebufferFetchBarrierEXT} calls. The functionality provided by this extension is requested in the shader source using the noncoherent + * layout qualifier.
    • + *
    + * + *

    Requires {@link GL20 OpenGL 2.0}.

    + */ +public final class EXTShaderFramebufferFetch { + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT = 0x8A52; + + private EXTShaderFramebufferFetch() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderFramebufferFetchNonCoherent.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderFramebufferFetchNonCoherent.java new file mode 100644 index 000000000..082217516 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderFramebufferFetchNonCoherent.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_shader_framebuffer_fetch_non_coherent extension. + * + *

    See {@link EXTShaderFramebufferFetch EXT_shader_framebuffer_fetch}.

    + */ +public class EXTShaderFramebufferFetchNonCoherent { + + static { GL.initialize(); } + + protected EXTShaderFramebufferFetchNonCoherent() { + throw new UnsupportedOperationException(); + } + + // --- [ glFramebufferFetchBarrierEXT ] --- + + /** + * Specifies a boundary between passes when reading existing framebuffer data from fragment shaders via the {@code gl_LastFragData} built-in variable. + * Previous framebuffer object writes regardless of the mechanism (including clears, blits and primitive rendering) are guaranteed to be visible to + * subsequent fragment shader invocations that read from the framebuffer once {@code FramebufferFetchBarrierEXT} is executed. + * + *

    If {@code EXT_shader_framebuffer_fetch} is also supported: Because the implementation guarantees coherency of framebuffer reads and writes for color + * outputs not explicitly marked with the noncoherent layout qualifier, calling the {@code FramebufferFetchBarrierEXT} command is not required unless the + * application wishes to manage memory ordering of framebuffer reads and writes explicitly, which may provide better performance on some implementations + * in cases where rendering can be split into multiple passes with non-self-overlapping geometry.

    + */ + public static native void glFramebufferFetchBarrierEXT(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderImageLoadStore.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderImageLoadStore.java new file mode 100644 index 000000000..e9ef9307e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTShaderImageLoadStore.java @@ -0,0 +1,122 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_shader_image_load_store extension. + * + *

    This extension provides GLSL built-in functions allowing shaders to load from, store to, and perform atomic read-modify-write operations to a single + * level of a texture object from any shader stage. These built-in functions are named imageLoad(), imageStore(), and imageAtomic*(), respectively, and + * accept integer texel coordinates to identify the texel accessed. The extension adds the notion of "image units" to the OpenGL API, to which texture + * levels are bound for access by the GLSL built-in functions. To allow shaders to specify the image unit to access, GLSL provides a new set of data types + * ("image*") similar to samplers. Each image variable is assigned an integer value to identify an image unit to access, which is specified using + * Uniform*() APIs in a manner similar to samplers. For implementations supporting the NV_gpu_program5 extensions, assembly language instructions to + * perform image loads, stores, and atomics are also provided.

    + * + *

    This extension also provides the capability to explicitly enable "early" per-fragment tests, where operations like depth and stencil testing are + * performed prior to fragment shader execution. In unextended OpenGL, fragment shaders never have any side effects and implementations can sometimes + * perform per-fragment tests and discard some fragments prior to executing the fragment shader. Since this extension allows fragment shaders to write to + * texture and buffer object memory using the built-in image functions, such optimizations could lead to non-deterministic results. To avoid this, + * implementations supporting this extension may not perform such optimizations on shaders having such side effects. However, enabling early per-fragment + * tests guarantees that such tests will be performed prior to fragment shader execution, and ensures that image stores and atomics will not be performed + * by fragment shader invocations where these per-fragment tests fail.

    + * + *

    Finally, this extension provides both a GLSL built-in function and an OpenGL API function allowing applications some control over the ordering of image + * loads, stores, and atomics relative to other OpenGL pipeline operations accessing the same memory. Because the extension provides the ability to + * perform random accesses to texture or buffer object memory, such accesses are not easily tracked by the OpenGL driver. To avoid the need for + * heavy-handed synchronization at the driver level, this extension requires manual synchronization. The MemoryBarrierEXT() OpenGL API function allows + * applications to specify a bitfield indicating the set of OpenGL API operations to synchronize relative to shader memory access. The memoryBarrier() + * GLSL built-in function provides a synchronization point within a given shader invocation to ensure that all memory accesses performed prior to the + * synchronization point complete prior to any started after the synchronization point.

    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ +public class EXTShaderImageLoadStore { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_IMAGE_UNITS_EXT = 0x8F38, + GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT = 0x8F39, + GL_MAX_IMAGE_SAMPLES_EXT = 0x906D; + + /** Accepted by the {@code target} parameter of GetIntegeri_v and GetBooleani_v. */ + public static final int + GL_IMAGE_BINDING_NAME_EXT = 0x8F3A, + GL_IMAGE_BINDING_LEVEL_EXT = 0x8F3B, + GL_IMAGE_BINDING_LAYERED_EXT = 0x8F3C, + GL_IMAGE_BINDING_LAYER_EXT = 0x8F3D, + GL_IMAGE_BINDING_ACCESS_EXT = 0x8F3E, + GL_IMAGE_BINDING_FORMAT_EXT = 0x906E; + + /** Accepted by the {@code barriers} parameter of MemoryBarrierEXT. */ + public static final int + GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT = 0x1, + GL_ELEMENT_ARRAY_BARRIER_BIT_EXT = 0x2, + GL_UNIFORM_BARRIER_BIT_EXT = 0x4, + GL_TEXTURE_FETCH_BARRIER_BIT_EXT = 0x8, + GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT = 0x20, + GL_COMMAND_BARRIER_BIT_EXT = 0x40, + GL_PIXEL_BUFFER_BARRIER_BIT_EXT = 0x80, + GL_TEXTURE_UPDATE_BARRIER_BIT_EXT = 0x100, + GL_BUFFER_UPDATE_BARRIER_BIT_EXT = 0x200, + GL_FRAMEBUFFER_BARRIER_BIT_EXT = 0x400, + GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT = 0x800, + GL_ATOMIC_COUNTER_BARRIER_BIT_EXT = 0x1000, + GL_ALL_BARRIER_BITS_EXT = 0xFFFFFFFF; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_IMAGE_1D_EXT = 0x904C, + GL_IMAGE_2D_EXT = 0x904D, + GL_IMAGE_3D_EXT = 0x904E, + GL_IMAGE_2D_RECT_EXT = 0x904F, + GL_IMAGE_CUBE_EXT = 0x9050, + GL_IMAGE_BUFFER_EXT = 0x9051, + GL_IMAGE_1D_ARRAY_EXT = 0x9052, + GL_IMAGE_2D_ARRAY_EXT = 0x9053, + GL_IMAGE_CUBE_MAP_ARRAY_EXT = 0x9054, + GL_IMAGE_2D_MULTISAMPLE_EXT = 0x9055, + GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT = 0x9056, + GL_INT_IMAGE_1D_EXT = 0x9057, + GL_INT_IMAGE_2D_EXT = 0x9058, + GL_INT_IMAGE_3D_EXT = 0x9059, + GL_INT_IMAGE_2D_RECT_EXT = 0x905A, + GL_INT_IMAGE_CUBE_EXT = 0x905B, + GL_INT_IMAGE_BUFFER_EXT = 0x905C, + GL_INT_IMAGE_1D_ARRAY_EXT = 0x905D, + GL_INT_IMAGE_2D_ARRAY_EXT = 0x905E, + GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT = 0x905F, + GL_INT_IMAGE_2D_MULTISAMPLE_EXT = 0x9060, + GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT = 0x9061, + GL_UNSIGNED_INT_IMAGE_1D_EXT = 0x9062, + GL_UNSIGNED_INT_IMAGE_2D_EXT = 0x9063, + GL_UNSIGNED_INT_IMAGE_3D_EXT = 0x9064, + GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT = 0x9065, + GL_UNSIGNED_INT_IMAGE_CUBE_EXT = 0x9066, + GL_UNSIGNED_INT_IMAGE_BUFFER_EXT = 0x9067, + GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT = 0x9068, + GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT = 0x9069, + GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT = 0x906A, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT = 0x906B, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT = 0x906C; + + protected EXTShaderImageLoadStore() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindImageTextureEXT ] --- + + public static native void glBindImageTextureEXT(@NativeType("GLuint") int index, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLboolean") boolean layered, @NativeType("GLint") int layer, @NativeType("GLenum") int access, @NativeType("GLint") int format); + + // --- [ glMemoryBarrierEXT ] --- + + public static native void glMemoryBarrierEXT(@NativeType("GLbitfield") int barriers); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSharedTexturePalette.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSharedTexturePalette.java new file mode 100644 index 000000000..7bff94866 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTSharedTexturePalette.java @@ -0,0 +1,28 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_shared_texture_palette extension. + * + *

    EXT_shared_texture_palette defines a shared texture palette which may be used in place of the texture object palettes provided by + * EXT_paletted_texture. This is useful for rapidly changing a palette common to many textures, rather than having to reload the + * new palette for each texture. The extension acts as a switch, causing all lookups that would normally be done on the texture's palette to instead use + * the shared palette.

    + * + *

    Requires EXT_paletted_texture.

    + */ +public final class EXTSharedTexturePalette { + + /** + * Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, IsEnabled, Enable, Disable, ColorTableEXT, + * ColorSubTableEXT, GetColorTableEXT, GetColorTableParameterivEXT, and GetColorTableParameterfd EXT. + */ + public static final int GL_SHARED_TEXTURE_PALETTE_EXT = 0x81FB; + + private EXTSharedTexturePalette() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilClearTag.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilClearTag.java new file mode 100644 index 000000000..930a3bbe2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilClearTag.java @@ -0,0 +1,63 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_stencil_clear_tag extension. + * + *

    Stencil-only framebuffer clears are increasingly common as 3D applications are now using rendering algorithms such as stenciled shadow volume rendering + * for multiple light sources in a single frame, recent "soft" stenciled shadow volume techniques, and stencil-based constructive solid geometry + * techniques. In such algorithms there are multiple stencil buffer clears for each depth buffer clear. Additionally in most cases, these algorithms do + * not require all of the 8 typical stencil bitplanes for their stencil requirements. In such cases, there is the potential for unused stencil bitplanes + * to encode a "stencil clear tag" in such a way to reduce the number of actual stencil clears. The idea is that switching to an unused stencil clear tag + * logically corresponds to when an application would otherwise perform a framebuffer-wide stencil clear.

    + * + *

    This extension exposes an inexpensive hardware mechanism for amortizing the cost of multiple stencil-only clears by using a client-specified number of + * upper bits of the stencil buffer to maintain a per-pixel stencil tag.

    + * + *

    The upper bits of each stencil value is treated as a tag that indicates the state of the upper bits of the "stencil clear tag" state when the stencil + * value was last written. If a stencil value is read and its upper bits containing its tag do NOT match the current upper bits of the stencil clear tag + * state, the stencil value is substituted with the lower bits of the stencil clear tag (the reset value). Either way, the upper tag bits of the stencil + * value are ignored by subsequent stencil function and operation processing of the stencil value.

    + * + *

    When a stencil value is written to the stencil buffer, its upper bits are overridden with the upper bits of the current stencil clear tag state so + * subsequent reads, prior to any subsequent stencil clear tag state change, properly return the updated lower bits.

    + * + *

    In this way, the stencil clear tag functionality provides a way to replace multiple bandwidth-intensive stencil clears with very inexpensive update of + * the stencil clear tag state.

    + * + *

    If used as expected with the client specifying 3 bits for the stencil tag, every 7 of 8 stencil-only clears of the entire stencil buffer can be + * substituted for an update of the current stencil clear tag rather than an actual update of all the framebuffer's stencil values. Still, every 8th clear + * must be an actual stencil clear. The net effect is that the aggregate cost of stencil clears is reduced by a factor of 1/(2^n) where n is the number of + * bits devoted to the stencil tag.

    + * + *

    The application specifies two new pieces of state: 1) the number of upper stencil bits, n, assigned to maintain the tag bits for each stencil value + * within the stencil buffer, and 2) a stencil clear tag value that packs the current tag and a reset value into a single integer values. The upper n bits + * of the stencil clear tag value specify the current tag while the lower s-min(n,s) bits specify the current reset value, where s is the number of + * bitplanes in the stencil buffer and n is the current number of stencil tag bits.

    + * + *

    If zero stencil clear tag bits are assigned to the stencil tag encoding, then the stencil buffer operates in the conventional manner.

    + */ +public class EXTStencilClearTag { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_STENCIL_TAG_BITS_EXT = 0x88F2, + GL_STENCIL_CLEAR_TAG_VALUE_EXT = 0x88F3; + + protected EXTStencilClearTag() { + throw new UnsupportedOperationException(); + } + + // --- [ glStencilClearTagEXT ] --- + + public static native void glStencilClearTagEXT(@NativeType("GLsizei") int stencilTagBits, @NativeType("GLuint") int stencilClearTag); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilTwoSide.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilTwoSide.java new file mode 100644 index 000000000..04f068e19 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilTwoSide.java @@ -0,0 +1,38 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_stencil_two_side extension. + * + *

    This extension provides two-sided stencil testing where the stencil-related state (stencil operations, reference value, compare mask, and write mask) + * may be different for front- and back-facing polygons. Two-sided stencil testing may improve the performance of stenciled shadow volume and Constructive + * Solid Geometry (CSG) rendering algorithms.

    + */ +public class EXTStencilTwoSide { + + static { GL.initialize(); } + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_STENCIL_TEST_TWO_SIDE_EXT = 0x8910; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_ACTIVE_STENCIL_FACE_EXT = 0x8911; + + protected EXTStencilTwoSide() { + throw new UnsupportedOperationException(); + } + + // --- [ glActiveStencilFaceEXT ] --- + + public static native void glActiveStencilFaceEXT(@NativeType("GLenum") int face); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilWrap.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilWrap.java new file mode 100644 index 000000000..8a45844d6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTStencilWrap.java @@ -0,0 +1,33 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_stencil_wrap extension. + * + *

    Various algorithms use the stencil buffer to "count" the number of surfaces that a ray passes through. As the ray passes into an object, the stencil + * buffer is incremented. As the ray passes out of an object, the stencil buffer is decremented.

    + * + *

    GL requires that the stencil increment operation clamps to its maximum value. For algorithms that depend on the difference between the sum of the + * increments and the sum of the decrements, clamping causes an erroneous result.

    + * + *

    This extension provides an enable for both maximum and minimum wrapping of stencil values. Instead, the stencil value wraps in both directions.

    + * + *

    Two additional stencil operations are specified. These new operations are similiar to the existing INCR and DECR operations, but they wrap their result + * instead of saturating it. This functionality matches the new stencil operations introduced by DirectX 6.

    + * + *

    Promoted to core in {@link GL14 OpenGL 1.4}.

    + */ +public final class EXTStencilWrap { + + /** Accepted by the {@code sfail}, {@code dpfail}, and {@code dppass} parameter of StencilOp. */ + public static final int + GL_INCR_WRAP_EXT = 0x8507, + GL_DECR_WRAP_EXT = 0x8508; + + private EXTStencilWrap() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureArray.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureArray.java new file mode 100644 index 000000000..220a8ca8c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureArray.java @@ -0,0 +1,88 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_texture_array extension. + * + *

    This extension introduces the notion of one- and two-dimensional array textures. An array texture is a collection of one- and two-dimensional images of + * identical size and format, arranged in layers. A one-dimensional array texture is specified using TexImage2D; a two-dimensional array texture is + * specified using TexImage3D. The height (1D array) or depth (2D array) specify the number of layers in the image.

    + * + *

    An array texture is accessed as a single unit in a programmable shader, using a single coordinate vector. A single layer is selected, and that layer is + * then accessed as though it were a one- or two-dimensional texture. The layer used is specified using the "t" or "r" texture coordinate for 1D and 2D + * array textures, respectively. The layer coordinate is provided as an unnormalized floating-point value in the range {@code [0,-1]}, where + * {@code } is the number of layers in the array texture. Texture lookups do not filter between layers, though such filtering can be achieved using + * programmable shaders. When mipmapping is used, each level of an array texture has the same number of layers as the base level; the number of layers is + * not reduced as the image size decreases.

    + * + *

    Array textures can be rendered to by binding them to a framebuffer object (EXT_framebuffer_object). A single layer of an array texture can be bound + * using normal framebuffer object mechanisms, or an entire array texture can be bound and rendered to using the layered rendering mechanisms provided by + * NV_geometry_program4.

    + * + *

    This extension does not provide for the use of array textures with fixed-function fragment processing. Such support could be added by providing an + * additional extension allowing applications to pass the new target enumerants (TEXTURE_1D_ARRAY_EXT and TEXTURE_2D_ARRAY_EXT) to Enable and Disable.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public class EXTTextureArray { + + static { GL.initialize(); } + + /** Accepted by the {@code target} parameter of TexParameteri, TexParameteriv, TexParameterf, TexParameterfv, GenerateMipmapEXT, and BindTexture. */ + public static final int + GL_TEXTURE_1D_ARRAY_EXT = 0x8C18, + GL_TEXTURE_2D_ARRAY_EXT = 0x8C1A; + + /** Accepted by the {@code target} parameter of TexImage3D, TexSubImage3D, CopyTexSubImage3D, CompressedTexImage3D, and CompressedTexSubImage3D. */ + public static final int GL_PROXY_TEXTURE_2D_ARRAY_EXT = 0x8C1B; + + /** + * Accepted by the {@code target} parameter of TexImage2D, TexSubImage2D, CopyTexImage2D, CopyTexSubImage2D, CompressedTexImage2D, and + * CompressedTexSubImage2D. + */ + public static final int GL_PROXY_TEXTURE_1D_ARRAY_EXT = 0x8C19; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv and GetFloatv. */ + public static final int + GL_TEXTURE_BINDING_1D_ARRAY_EXT = 0x8C1C, + GL_TEXTURE_BINDING_2D_ARRAY_EXT = 0x8C1D, + GL_MAX_ARRAY_TEXTURE_LAYERS_EXT = 0x88FF; + + /** + * Accepted by the {@code param} parameter of TexParameterf, TexParameteri, TexParameterfv, and TexParameteriv when the {@code pname} parameter is + * TEXTURE_COMPARE_MODE_ARB. + */ + public static final int GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT = 0x884E; + + /** + * COMPARE_REF_DEPTH_TO_TEXTURE_EXT is simply an alias for the existing COMPARE_R_TO_TEXTURE token in OpenGL 2.0; the alternate name reflects the fact that + * the R coordinate is not always used.) Accepted by the {@code pname} parameter of GetFramebufferAttachmentParameterivEXT. + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT = 0x8CD4; + + /** + * FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER is simply an alias for the FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT token provided in EXT_framebuffer_object. + * This extension generalizes the notion of "{@code zoffset}" to include layers of an array texture.) Returned by the {@code type} parameter of + * GetActiveUniform. + */ + public static final int + GL_SAMPLER_1D_ARRAY_EXT = 0x8DC0, + GL_SAMPLER_2D_ARRAY_EXT = 0x8DC1, + GL_SAMPLER_1D_ARRAY_SHADOW_EXT = 0x8DC3, + GL_SAMPLER_2D_ARRAY_SHADOW_EXT = 0x8DC4; + + protected EXTTextureArray() { + throw new UnsupportedOperationException(); + } + + // --- [ glFramebufferTextureLayerEXT ] --- + + public static native void glFramebufferTextureLayerEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureBufferObject.java new file mode 100644 index 000000000..41fa73a04 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureBufferObject.java @@ -0,0 +1,59 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_texture_buffer_object extension. + * + *

    This extension provides a new texture type, called a buffer texture. Buffer textures are one-dimensional arrays of texels whose storage comes from an + * attached buffer object. When a buffer object is bound to a buffer texture, a format is specified, and the data in the buffer object is treated as an + * array of texels of the specified format.

    + * + *

    The use of a buffer object to provide storage allows the texture data to be specified in a number of different ways: via buffer object loads + * (BufferData), direct CPU writes (MapBuffer), framebuffer readbacks (EXT_pixel_buffer_object extension). A buffer object can also be loaded by transform + * feedback (NV_transform_feedback extension), which captures selected transformed attributes of vertices processed by the GL. Several of these mechanisms + * do not require an extra data copy, which would be required when using conventional TexImage-like entry points.

    + * + *

    Buffer textures do not support mipmapping, texture lookups with normalized floating-point texture coordinates, and texture filtering of any sort, and + * may not be used in fixed-function fragment processing. They can be accessed via single texel fetch operations in programmable shaders. For assembly + * shaders (NV_gpu_program4), the TXF instruction is used. For GLSL (EXT_gpu_shader4), a new sampler type and texel fetch function are used.

    + * + *

    Buffer textures can be substantially larger than equivalent one-dimensional textures; the maximum texture size supported for buffer textures in the + * initial implementation of this extension is 2^27 texels, versus 2^13 (8192) texels for otherwise equivalent one-dimensional textures. (Note that this + * extension only guarantees support for buffer textures with 2^16 texels, but we expect most implementations to exceed that substantially.) When a buffer + * object is attached to a buffer texture, a size is not specified; rather, the number of texels in the texture is taken by dividing the size of the + * buffer object by the size of each texel.

    + * + *

    Requires {@link GL20 OpenGL 2.0} and {@link EXTGPUShader4 EXT_gpu_shader4} or NV_gpu_program4.

    + */ +public class EXTTextureBufferObject { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameter of BindBuffer, BufferData, BufferSubData, MapBuffer, BindTexture, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, GetBufferPointerv, and TexBufferEXT, and the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv. + */ + public static final int GL_TEXTURE_BUFFER_EXT = 0x8C2A; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv. */ + public static final int + GL_MAX_TEXTURE_BUFFER_SIZE_EXT = 0x8C2B, + GL_TEXTURE_BINDING_BUFFER_EXT = 0x8C2C, + GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT = 0x8C2D, + GL_TEXTURE_BUFFER_FORMAT_EXT = 0x8C2E; + + protected EXTTextureBufferObject() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexBufferEXT ] --- + + public static native void glTexBufferEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionLATC.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionLATC.java new file mode 100644 index 000000000..29f0175a8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionLATC.java @@ -0,0 +1,35 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_compression_latc extension. + * + *

    This extension introduces four new block-based texture compression formats suited for unsigned and signed luminance and luminance-alpha textures (hence + * the name "latc" for Luminance-Alpha Texture Compression).

    + * + *

    These formats are designed to reduce the storage requirements and memory bandwidth required for luminance and luminance-alpha textures by a factor of + * 2-to-1 over conventional uncompressed luminance and luminance-alpha textures with 8-bit components ({@link GL11#GL_LUMINANCE8 LUMINANCE8} and {@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}).

    + * + *

    The compressed signed luminance-alpha format is reasonably suited for storing compressed normal maps.

    + * + *

    Requires {@link GL13 OpenGL 1.3} or {@link ARBTextureCompression ARB_texture_compression}.

    + */ +public final class EXTTextureCompressionLATC { + + /** + * Accepted by the {@code internalformat} parameter of TexImage2D, CopyTexImage2D, and CompressedTexImage2D and the {@code format} parameter of + * CompressedTexSubImage2D. + */ + public static final int + GL_COMPRESSED_LUMINANCE_LATC1_EXT = 0x8C70, + GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT = 0x8C71, + GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT = 0x8C72, + GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT = 0x8C73; + + private EXTTextureCompressionLATC() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionRGTC.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionRGTC.java new file mode 100644 index 000000000..b3b5c3cf7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionRGTC.java @@ -0,0 +1,39 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_compression_rgtc extension. + * + *

    This extension introduces four new block-based texture compression formats suited for unsigned and signed red and red-green textures (hence the name + * "rgtc" for Red-Green Texture Compression).

    + * + *

    These formats are designed to reduce the storage requirements and memory bandwidth required for red and red-green textures by a factor of 2-to-1 over + * conventional uncompressed luminance and luminance-alpha textures with 8-bit components ({@link GL11#GL_LUMINANCE8 LUMINANCE8} and {@link GL11#GL_LUMINANCE8_ALPHA8 LUMINANCE8_ALPHA8}).

    + * + *

    The compressed signed red-green format is reasonably suited for storing compressed normal maps.

    + * + *

    This extension uses the same compression format as the EXT_texture_compression_latc extension except the color data is stored in the red and green + * components rather than luminance and alpha. Representing compressed red and green components is consistent with the BC4 and BC5 compressed formats + * supported by DirectX 10.

    + * + *

    Requires {@link GL13 OpenGL 1.3} or {@link ARBTextureCompression ARB_texture_compression}.

    + */ +public final class EXTTextureCompressionRGTC { + + /** + * Accepted by the {@code internalformat} parameter of TexImage2D, CopyTexImage2D, and CompressedTexImage2D and the {@code format} parameter of + * CompressedTexSubImage2D. + */ + public static final int + GL_COMPRESSED_RED_RGTC1_EXT = 0x8DBB, + GL_COMPRESSED_SIGNED_RED_RGTC1_EXT = 0x8DBC, + GL_COMPRESSED_RED_GREEN_RGTC2_EXT = 0x8DBD, + GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT = 0x8DBE; + + private EXTTextureCompressionRGTC() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionS3TC.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionS3TC.java new file mode 100644 index 000000000..9cb6cca8a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureCompressionS3TC.java @@ -0,0 +1,33 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_compression_s3tc extension. + * + *

    This extension provides additional texture compression functionality specific to S3's S3TC format (called DXTC in Microsoft's DirectX API), subject to + * all the requirements and limitations described by the extension {@link ARBTextureCompression ARB_texture_compression}.

    + * + *

    This extension supports DXT1, DXT3, and DXT5 texture compression formats. For the DXT1 image format, this specification supports an RGB-only mode and a + * special RGBA mode with single-bit "transparent" alpha.

    + * + *

    Requires {@link ARBTextureCompression ARB_texture_compression}.

    + */ +public final class EXTTextureCompressionS3TC { + + /** + * Accepted by the {@code internalformat} parameter of TexImage2D, CopyTexImage2D, and CompressedTexImage2D and the {@code format} parameter of + * CompressedTexSubImage2D. + */ + public static final int + GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0, + GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1, + GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2, + GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3; + + private EXTTextureCompressionS3TC() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureFilterAnisotropic.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureFilterAnisotropic.java new file mode 100644 index 000000000..9559e721e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureFilterAnisotropic.java @@ -0,0 +1,44 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_filter_anisotropic extension. + * + *

    Texture mapping using OpenGL's existing mipmap texture filtering modes assumes that the projection of the pixel filter footprint into texture space is a + * square (ie, isotropic). In practice however, the footprint may be long and narrow (ie, anisotropic). Consequently, mipmap filtering severely blurs + * images on surfaces angled obliquely away from the viewer.

    + * + *

    Several approaches exist for improving texture sampling by accounting for the anisotropic nature of the pixel filter footprint into texture space. This + * extension provides a general mechanism for supporting anisotropic texturing filtering schemes without specifying a particular formulation of anisotropic + * filtering.

    + * + *

    The extension permits the OpenGL application to specify on a per-texture object basis the maximum degree of anisotropy to account for in texture + * filtering.

    + * + *

    Increasing a texture object's maximum degree of anisotropy may improve texture filtering but may also significantly reduce the implementation's texture + * filtering rate. Implementations are free to clamp the specified degree of anisotropy to the implementation's maximum supported degree of anisotropy.

    + * + *

    A texture's maximum degree of anisotropy is specified independent from the texture's minification and magnification filter (as opposed to being + * supported as an entirely new filtering mode). Implementations are free to use the specified minification and magnification filter to select a particular + * anisotropic texture filtering scheme. For example, a NEAREST filter with a maximum degree of anisotropy of two could be treated as a 2-tap filter that + * accounts for the direction of anisotropy. Implementations are also permitted to ignore the minification or magnification filter and implement the + * highest quality of anisotropic filtering possible.

    + * + *

    Applications seeking the highest quality anisotropic filtering available are advised to request a {@link GL11#GL_LINEAR_MIPMAP_LINEAR LINEAR_MIPMAP_LINEAR} minification filter, a + * {@link GL11#GL_LINEAR LINEAR} magnification filter, and a large maximum degree of anisotropy.

    + */ +public final class EXTTextureFilterAnisotropic { + + /** Accepted by the {@code pname} parameters of GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameterfv, TexParameteri, and TexParameteriv. */ + public static final int GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv. */ + public static final int GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF; + + private EXTTextureFilterAnisotropic() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureFilterMinmax.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureFilterMinmax.java new file mode 100644 index 000000000..8c25fe69e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureFilterMinmax.java @@ -0,0 +1,38 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_filter_minmax extension. + * + *

    In unextended OpenGL 4.3, minification and magnification filters such as {@link GL11#GL_LINEAR LINEAR} allow texture lookups to returned a filtered texel value produced + * by computing an weighted average of a collection of texels in the neighborhood of the texture coordinate provided.

    + * + *

    This extension provides a new texture and sampler parameter ({@link #GL_TEXTURE_REDUCTION_MODE_EXT TEXTURE_REDUCTION_MODE_EXT}) which allows applications to produce a filtered texel value + * by computing a component-wise minimum ({@link GL14#GL_MIN MIN}) or maximum ({@link GL14#GL_MAX MAX}) of the texels that would normally be averaged. The reduction mode is orthogonal + * to the minification and magnification filter parameters. The filter parameters are used to identify the set of texels used to produce a final filtered + * value; the reduction mode identifies how these texels are combined.

    + */ +public final class EXTTextureFilterMinmax { + + /** + * Accepted by the {@code pname} parameter to SamplerParameter{i f}{v}, SamplerParameterI{u}iv, GetSamplerParameter{i f}v, GetSamplerParameterI{u}iv, + * TexParameter{i f}{v}, TexParameterI{u}iv, GetTexParameter{i f}v, GetTexParameterI{u}iv, TextureParameter{i f}{v}EXT, TextureParameterI{u}ivEXT, + * GetTextureParameter{i f}vEXT, GetTextureParameterI{u}ivEXT, MultiTexParameter{i f}{v}EXT, MultiTexParameterI{u}ivEXT, GetMultiTexParameter{i f}vEXT, and + * GetMultiTexParameterI{u}ivEXT. + */ + public static final int GL_TEXTURE_REDUCTION_MODE_EXT = 0x9366; + + /** + * Accepted by the {@code param} or {@code params} parameter to SamplerParameter{i f}{v}, SamplerParameterI{u}iv, TexParameter{i f}{v}, TexParameterI{u}iv, + * TextureParameter{i f}{v}EXT, TextureParameterI{u}ivEXT, MultiTexParameter{i f}{v}EXT, or MultiTexParameterI{u}ivEXT when {@code pname} is + * TEXTURE_REDUCTION_MODE_EXT. + */ + public static final int GL_WEIGHTED_AVERAGE_EXT = 0x9367; + + private EXTTextureFilterMinmax() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureInteger.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureInteger.java new file mode 100644 index 000000000..540661d7f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureInteger.java @@ -0,0 +1,253 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_texture_integer extension. + * + *

    Fixed-point textures in unextended OpenGL have integer components, but those values are taken to represent floating-point values in the range [0,1]. + * These integer components are considered "normalized" integers. When such a texture is accessed by a shader or by fixed-function fragment processing, + * floating-point values are returned.

    + * + *

    This extension provides a set of new "unnormalized" integer texture formats. Formats with both signed and unsigned integers are provided. In these + * formats, the components are treated as true integers. When such textures are accessed by a shader, actual integer values are returned.

    + * + *

    Pixel operations that read from or write to a texture or color buffer with unnormalized integer components follow a path similar to that used for color + * index pixel operations, except that more than one component may be provided at once. Integer values flow through the pixel processing pipe, and no pixel + * transfer operations are performed. Integer format enumerants used for such operations indicate unnormalized integer data.

    + * + *

    Textures or render buffers with unnormalized integer formats may also be attached to framebuffer objects to receive fragment color values written by a + * fragment shader. Per-fragment operations that require floating-point color components, including multisample alpha operations, alpha test, blending, and + * dithering, have no effect when the corresponding colors are written to an integer color buffer. The NV_gpu_program4 and + * {@link EXTGPUShader4 EXT_gpu_shader4} extensions add the capability to fragment programs and fragment shaders to write signed and unsigned integer output values.

    + * + *

    This extension does not enforce type consistency for texture accesses or between fragment shaders and the corresponding framebuffer attachments. The + * results of a texture lookup from an integer texture are undefined:

    + * + *
      + *
    • for fixed-function fragment processing, or
    • + *
    • for shader texture accesses expecting floating-point return values.
    • + *
    + * + *

    The color components used for per-fragment operations and written into a color buffer are undefined:

    + * + *
      + *
    • for fixed-function fragment processing with an integer color buffer,
    • + *
    • for fragment shaders that write floating-point color components to an integer color buffer, or
    • + *
    • for fragment shaders that write integer color components to a color buffer with floating point or normalized integer components.
    • + *
    + * + *

    Requires {@link GL20 OpenGL 2.0} and NV_gpu_program4 or {@link EXTGPUShader4 EXT_gpu_shader4}. Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public class EXTTextureInteger { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_RGBA_INTEGER_MODE_EXT = 0x8D9E; + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, and TexImage3D. */ + public static final int + GL_RGBA32UI_EXT = 0x8D70, + GL_RGB32UI_EXT = 0x8D71, + GL_ALPHA32UI_EXT = 0x8D72, + GL_INTENSITY32UI_EXT = 0x8D73, + GL_LUMINANCE32UI_EXT = 0x8D74, + GL_LUMINANCE_ALPHA32UI_EXT = 0x8D75, + GL_RGBA16UI_EXT = 0x8D76, + GL_RGB16UI_EXT = 0x8D77, + GL_ALPHA16UI_EXT = 0x8D78, + GL_INTENSITY16UI_EXT = 0x8D79, + GL_LUMINANCE16UI_EXT = 0x8D7A, + GL_LUMINANCE_ALPHA16UI_EXT = 0x8D7B, + GL_RGBA8UI_EXT = 0x8D7C, + GL_RGB8UI_EXT = 0x8D7D, + GL_ALPHA8UI_EXT = 0x8D7E, + GL_INTENSITY8UI_EXT = 0x8D7F, + GL_LUMINANCE8UI_EXT = 0x8D80, + GL_LUMINANCE_ALPHA8UI_EXT = 0x8D81, + GL_RGBA32I_EXT = 0x8D82, + GL_RGB32I_EXT = 0x8D83, + GL_ALPHA32I_EXT = 0x8D84, + GL_INTENSITY32I_EXT = 0x8D85, + GL_LUMINANCE32I_EXT = 0x8D86, + GL_LUMINANCE_ALPHA32I_EXT = 0x8D87, + GL_RGBA16I_EXT = 0x8D88, + GL_RGB16I_EXT = 0x8D89, + GL_ALPHA16I_EXT = 0x8D8A, + GL_INTENSITY16I_EXT = 0x8D8B, + GL_LUMINANCE16I_EXT = 0x8D8C, + GL_LUMINANCE_ALPHA16I_EXT = 0x8D8D, + GL_RGBA8I_EXT = 0x8D8E, + GL_RGB8I_EXT = 0x8D8F, + GL_ALPHA8I_EXT = 0x8D90, + GL_INTENSITY8I_EXT = 0x8D91, + GL_LUMINANCE8I_EXT = 0x8D92, + GL_LUMINANCE_ALPHA8I_EXT = 0x8D93; + + /** Accepted by the {@code format} parameter of TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, DrawPixels and ReadPixels. */ + public static final int + GL_RED_INTEGER_EXT = 0x8D94, + GL_GREEN_INTEGER_EXT = 0x8D95, + GL_BLUE_INTEGER_EXT = 0x8D96, + GL_ALPHA_INTEGER_EXT = 0x8D97, + GL_RGB_INTEGER_EXT = 0x8D98, + GL_RGBA_INTEGER_EXT = 0x8D99, + GL_BGR_INTEGER_EXT = 0x8D9A, + GL_BGRA_INTEGER_EXT = 0x8D9B, + GL_LUMINANCE_INTEGER_EXT = 0x8D9C, + GL_LUMINANCE_ALPHA_INTEGER_EXT = 0x8D9D; + + protected EXTTextureInteger() { + throw new UnsupportedOperationException(); + } + + // --- [ glClearColorIiEXT ] --- + + public static native void glClearColorIiEXT(@NativeType("GLint") int r, @NativeType("GLint") int g, @NativeType("GLint") int b, @NativeType("GLint") int a); + + // --- [ glClearColorIuiEXT ] --- + + public static native void glClearColorIuiEXT(@NativeType("GLuint") int r, @NativeType("GLuint") int g, @NativeType("GLuint") int b, @NativeType("GLuint") int a); + + // --- [ glTexParameterIivEXT ] --- + + public static native void nglTexParameterIivEXT(int target, int pname, long params); + + public static void glTexParameterIivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglTexParameterIivEXT(target, pname, memAddress(params)); + } + + public static void glTexParameterIiEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.ints(param); + nglTexParameterIivEXT(target, pname, memAddress(params)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glTexParameterIuivEXT ] --- + + public static native void nglTexParameterIuivEXT(int target, int pname, long params); + + public static void glTexParameterIuivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglTexParameterIuivEXT(target, pname, memAddress(params)); + } + + public static void glTexParameterIuiEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.ints(param); + nglTexParameterIuivEXT(target, pname, memAddress(params)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexParameterIivEXT ] --- + + public static native void nglGetTexParameterIivEXT(int target, int pname, long params); + + public static void glGetTexParameterIivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTexParameterIivEXT(target, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetTexParameterIiEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTexParameterIivEXT(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexParameterIuivEXT ] --- + + public static native void nglGetTexParameterIuivEXT(int target, int pname, long params); + + public static void glGetTexParameterIuivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTexParameterIuivEXT(target, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetTexParameterIuiEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTexParameterIuivEXT(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glTexParameterIivEXT TexParameterIivEXT} */ + public static void glTexParameterIivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glTexParameterIivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glTexParameterIuivEXT TexParameterIuivEXT} */ + public static void glTexParameterIuivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glTexParameterIuivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetTexParameterIivEXT GetTexParameterIivEXT} */ + public static void glGetTexParameterIivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetTexParameterIivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetTexParameterIuivEXT GetTexParameterIuivEXT} */ + public static void glGetTexParameterIuivEXT(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetTexParameterIuivEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureMirrorClamp.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureMirrorClamp.java new file mode 100644 index 000000000..c13b7ea24 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureMirrorClamp.java @@ -0,0 +1,31 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_mirror_clamp extension. + * + *

    EXT_texture_mirror_clamp extends the set of texture wrap modes to include three modes ({@link #GL_MIRROR_CLAMP_EXT MIRROR_CLAMP_EXT}, {@link #GL_MIRROR_CLAMP_TO_EDGE_EXT MIRROR_CLAMP_TO_EDGE_EXT}, + * {@link #GL_MIRROR_CLAMP_TO_BORDER_EXT MIRROR_CLAMP_TO_BORDER_EXT}) that effectively use a texture map twice as large as the original image in which the additional half of the new image is + * a mirror image of the original image.

    + * + *

    This new mode relaxes the need to generate images whose opposite edges match by using the original image to generate a matching "mirror image". This + * mode allows the texture to be mirrored only once in the negative s, t, and r directions.

    + */ +public final class EXTTextureMirrorClamp { + + /** + * Accepted by the {@code param} parameter of TexParameteri and TexParameterf, and by the {@code params} parameter of TexParameteriv and TexParameterfv, + * when their {@code pname} parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R. + */ + public static final int + GL_MIRROR_CLAMP_EXT = 0x8742, + GL_MIRROR_CLAMP_TO_EDGE_EXT = 0x8743, + GL_MIRROR_CLAMP_TO_BORDER_EXT = 0x8912; + + private EXTTextureMirrorClamp() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureRectangle.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureRectangle.java new file mode 100644 index 000000000..ae08d901a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureRectangle.java @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +public final class EXTTextureRectangle { + + public static final int GL_TEXTURE_RECTANGLE_EXT = 0x84F5, + GL_TEXTURE_BINDING_RECTANGLE_EXT = 0x84F6, + GL_PROXY_TEXTURE_RECTANGLE_EXT = 0x84F7, + GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT = 0x84F8; + + private EXTTextureRectangle() {} +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGB.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGB.java new file mode 100644 index 000000000..15cefcabd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGB.java @@ -0,0 +1,50 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_sRGB extension. + * + *

    Conventional texture formats assume a linear color space. So for a conventional internal texture format such as GL_RGB8, the 256 discrete values for + * each 8-bit color component map linearly and uniformly to the [0,1] range.

    + * + *

    The sRGB color space is based on typical (non-linear) monitor characteristics expected in a dimly lit office. It has been standardized by the + * International Electrotechnical Commission (IEC) as IEC 61966-2-1. The sRGB color space roughly corresponds to 2.2 gamma correction.

    + * + *

    This extension adds a few new uncompressed and compressed color texture formats with sRGB color components.

    + * + *

    Promoted to core in {@link GL21 OpenGL 2.1}.

    + */ +public final class EXTTextureSRGB { + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D. */ + public static final int + GL_SRGB_EXT = 0x8C40, + GL_SRGB8_EXT = 0x8C41, + GL_SRGB_ALPHA_EXT = 0x8C42, + GL_SRGB8_ALPHA8_EXT = 0x8C43, + GL_SLUMINANCE_ALPHA_EXT = 0x8C44, + GL_SLUMINANCE8_ALPHA8_EXT = 0x8C45, + GL_SLUMINANCE_EXT = 0x8C46, + GL_SLUMINANCE8_EXT = 0x8C47, + GL_COMPRESSED_SRGB_EXT = 0x8C48, + GL_COMPRESSED_SRGB_ALPHA_EXT = 0x8C49, + GL_COMPRESSED_SLUMINANCE_EXT = 0x8C4A, + GL_COMPRESSED_SLUMINANCE_ALPHA_EXT = 0x8C4B; + + /** + * Accepted by the {@code internalformat} parameter of TexImage2D, CopyTexImage2D, and CompressedTexImage2DARB and the {@code format} parameter of + * CompressedTexSubImage2DARB. + */ + public static final int + GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8C4C, + GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D, + GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E, + GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F; + + private EXTTextureSRGB() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBDecode.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBDecode.java new file mode 100644 index 000000000..9818cf4c6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBDecode.java @@ -0,0 +1,50 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_sRGB_decode extension. + * + *

    The EXT_texture_sRGB extension (promoted to core in OpenGL 2.1) provides a texture format stored in the sRGB color space. Sampling one of these + * textures will always return the color value decoded into a linear color space. However, an application may wish to sample and retrieve the undecoded + * sRGB data from the texture and manipulate that directly.

    + * + *

    This extension adds a Texture Parameter and Sampler Object parameter to allow sRGB textures to be read directly, without decoding.

    + * + *

    The new parameter, {@link #GL_TEXTURE_SRGB_DECODE_EXT TEXTURE_SRGB_DECODE_EXT} controls whether the decoding happens at sample time. It only applies to textures with an internal format + * that is sRGB and is ignored for all other textures. This value defaults to {@link #GL_DECODE_EXT DECODE_EXT}, which indicates the texture should be decoded to linear color + * space.

    + * + *

    Requires {@link GL21 OpenGL 2.1} or {@link EXTTextureSRGB EXT_texture_sRGB}.

    + */ +public final class EXTTextureSRGBDecode { + + /** + * Accepted by the {@code pname} parameter of TexParameterf, TexParameteri, TexParameterfv, TexParameteriv, TexParameterIiv, TexParameterIuiv, + * TexParameterIivEXT, TexParameterIuivEXT, TextureParameterfEXT, TextureParameterfvEXT, TextureParameteriEXT, TextureParameterivEXT, + * TextureParameterIivEXT, TextureParameterIuivEXT, MultiTexParameterfEXT, MultiTexParameterfvEXT, MultiTexParameteriEXT, MultiTexParameterivEXT, + * MultiTexParameterIivEXT, MultiTexParameterIuivEXT, GetTexParameterfv, GetTexParameteriv, GetTexParameterIiv, GetTexParameterIuiv, GetTexParameterIivEXT, + * GetTexParameterIuivEXT, GetTextureParameterfEXT, GetTextureParameterfvEXT, GetTextureParameteriEXT, GetTextureParameterivEXT, GetTextureParameterIivEXT, + * GetTextureParameterIuivEXT, GetMultiTexParameterfEXT, GetMultiTexParameterfvEXT, GetMultiTexParameteriEXT, GetMultiTexParameterivEXT, + * GetMultiTexParameterIivEXT, GetMultiTexParameterIuivEXT, SamplerParameteri, SamplerParameterf, SamplerParameteriv, SamplerParameterfv, + * SamplerParameterIiv, SamplerParameterIuiv, GetSamplerParameteriv, GetSamplerParameterfv, GetSamplerParameterIiv, and GetSamplerParameterIuiv. + */ + public static final int GL_TEXTURE_SRGB_DECODE_EXT = 0x8A48; + + /** + * Accepted by the {@code param} parameter of TexParameterf, TexParameteri, TexParameterfv, TexParameteriv, TexParameterIiv, TexParameterIuiv, + * TexParameterIivEXT, TexParameterIuivEXT, TextureParameterfEXT, TextureParameterfvEXT, TextureParameteriEXT, TextureParameterivEXT, + * TextureParameterIivEXT, TextureParameterIuivEXT, MultiTexParameterfEXT, MultiTexParameterfvEXT, MultiTexParameteriEXT, MultiTexParameterivEXT, + * MultiTexParameterIivEXT, MultiTexParameterIuivEXT, SamplerParameteri, SamplerParameterf, SamplerParameteriv, SamplerParameterfv, SamplerParameterIiv, + * and SamplerParameterIuiv. + */ + public static final int + GL_DECODE_EXT = 0x8A49, + GL_SKIP_DECODE_EXT = 0x8A4A; + + private EXTTextureSRGBDecode() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBR8.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBR8.java new file mode 100644 index 000000000..b610dd80a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBR8.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_sRGB_R8 extension. + * + *

    This extension introduces {@link #GL_SR8_EXT SR8_EXT} as an acceptable internal format. This allows efficient sRGB sampling for source images stored as a separate texture + * per channel.

    + * + *

    Requires {@link GL12 OpenGL 1.2}.

    + */ +public final class EXTTextureSRGBR8 { + + /** + * Accepted by the {@code internalformat} parameters of {@link GL12C#glTexImage3D TexImage3D}, {@link GL11C#glTexImage2D TexImage2D}, {@link GL11C#glTexImage1D TexImage1D}, {@link GL42C#glTexStorage3D TexStorage3D}, {@link GL42C#glTexStorage2D TexStorage2D}, {@link GL42C#glTexStorage1D TexStorage1D}, + * {@link GL45C#glTextureStorage3D TextureStorage3D}, {@link GL45C#glTextureStorage2D TextureStorage2D}, and {@link GL45C#glTextureStorage1D TextureStorage1D}. + */ + public static final int GL_SR8_EXT = 0x8FBD; + + private EXTTextureSRGBR8() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBRG8.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBRG8.java new file mode 100644 index 000000000..62adeb639 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSRGBRG8.java @@ -0,0 +1,21 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_sRGB_RG8 extension. + * + *

    This extension introduces SRG8_EXT as an acceptable internal format. This allows efficient sRGB sampling for source images stored with 2 channels.

    + * + *

    Requires {@link GL12 OpenGL 1.2}.

    + */ +public final class EXTTextureSRGBRG8 { + + public static final int GL_SRG8_EXT = 0x8FBE; + + private EXTTextureSRGBRG8() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSharedExponent.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSharedExponent.java new file mode 100644 index 000000000..39cd43d04 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSharedExponent.java @@ -0,0 +1,42 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_shared_exponent extension. + * + *

    Existing texture formats provide either fixed-point formats with limited range and precision but with compact encodings (allowing 32 or fewer bits per + * multi-component texel), or floating-point formats with tremendous range and precision but without compact encodings (typically 16 or 32 bits per + * component).

    + * + *

    This extension adds a new packed format and new internal texture format for encoding 3-component vectors (typically RGB colors) with a single 5-bit + * exponent (biased up by 15) and three 9-bit mantissas for each respective component. There is no sign bit so all three components must be non-negative. + * The fractional mantissas are stored without an implied 1 to the left of the decimal point. Neither infinity nor not-a-number (NaN) are representable in + * this shared exponent format.

    + * + *

    This 32 bits/texel shared exponent format is particularly well-suited to high dynamic range (HDR) applications where light intensity is typically stored + * as non-negative red, green, and blue components with considerable range.

    + * + *

    Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public final class EXTTextureSharedExponent { + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorageEXT. */ + public static final int GL_RGB9_E5_EXT = 0x8C3D; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, ColorSubTable, and GetColorTable. + */ + public static final int GL_UNSIGNED_INT_5_9_9_9_REV_EXT = 0x8C3E; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameterfv and GetTexLevelParameteriv. */ + public static final int GL_TEXTURE_SHARED_SIZE_EXT = 0x8C3F; + + private EXTTextureSharedExponent() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSnorm.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSnorm.java new file mode 100644 index 000000000..40b616a47 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSnorm.java @@ -0,0 +1,54 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_snorm extension. + * + *

    Fixed-point textures in unextended OpenGL have integer components, but those values are taken to represent floating-point values in the range + * [0.0,1.0]. These integer components are considered "unsigned normalized" integers. When such a texture is accessed by a shader or by fixed-function + * fragment processing, floating-point values are returned in the range [0.0,1.0].

    + * + *

    This extension provides a set of new "signed normalized" integer texture formats. These are taken to represent a floating-point value in the range + * [-1.0,1.0] with an exact 0.0.

    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ +public final class EXTTextureSnorm { + + /** ccepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, and TexImage3D. */ + public static final int + GL_RED_SNORM = 0x8F90, + GL_RG_SNORM = 0x8F91, + GL_RGB_SNORM = 0x8F92, + GL_RGBA_SNORM = 0x8F93, + GL_ALPHA_SNORM = 0x9010, + GL_LUMINANCE_SNORM = 0x9011, + GL_LUMINANCE_ALPHA_SNORM = 0x9012, + GL_INTENSITY_SNORM = 0x9013, + GL_R8_SNORM = 0x8F94, + GL_RG8_SNORM = 0x8F95, + GL_RGB8_SNORM = 0x8F96, + GL_RGBA8_SNORM = 0x8F97, + GL_ALPHA8_SNORM = 0x9014, + GL_LUMINANCE8_SNORM = 0x9015, + GL_LUMINANCE8_ALPHA8_SNORM = 0x9016, + GL_INTENSITY8_SNORM = 0x9017, + GL_R16_SNORM = 0x8F98, + GL_RG16_SNORM = 0x8F99, + GL_RGB16_SNORM = 0x8F9A, + GL_RGBA16_SNORM = 0x8F9B, + GL_ALPHA16_SNORM = 0x9018, + GL_LUMINANCE16_SNORM = 0x9019, + GL_LUMINANCE16_ALPHA16_SNORM = 0x901A, + GL_INTENSITY16_SNORM = 0x901B; + + /** Returned by GetTexLevelParmeter. */ + public static final int GL_SIGNED_NORMALIZED = 0x8F9C; + + private EXTTextureSnorm() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureStorage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureStorage.java new file mode 100644 index 000000000..880b20f18 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureStorage.java @@ -0,0 +1,89 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_texture_storage extension. + * + *

    The texture image specification commands in OpenGL allow each level to be separately specified with different sizes, formats, types and so on, and only + * imposes consistency checks at draw time. This adds overhead for implementations.

    + * + *

    This extension provides a mechanism for specifying the entire structure of a texture in a single call, allowing certain consistency checks and memory + * allocations to be done up front. Once specified, the format and dimensions of the image array become immutable, to simplify completeness checks in the + * implementation.

    + * + *

    When using this extension, it is no longer possible to supply texture data using TexImage*. Instead, data can be uploaded using TexSubImage*, or + * produced by other means (such as render-to-texture, mipmap generation, or rendering to a sibling EGLImage).

    + * + *

    This extension has complicated interactions with other extensions. The goal of most of these interactions is to ensure that a texture is always mipmap + * complete (and cube complete for cubemap textures).

    + * + *

    Requires {@link GL12 OpenGL 1.2}.

    + */ +public class EXTTextureStorage { + + static { GL.initialize(); } + + /** Accepted by the {@code value} parameter of GetTexParameter{if}v. */ + public static final int GL_TEXTURE_IMMUTABLE_FORMAT_EXT = 0x912F; + + /** Accepted by the {@code internalformat} parameter of {@code TexStorage*}. */ + public static final int + GL_ALPHA8_EXT = 0x803C, + GL_LUMINANCE8_EXT = 0x8040, + GL_LUMINANCE8_ALPHA8_EXT = 0x8045, + GL_RGBA32F_EXT = 0x8814, + GL_RGB32F_EXT = 0x8815, + GL_ALPHA32F_EXT = 0x8816, + GL_LUMINANCE32F_EXT = 0x8818, + GL_LUMINANCE_ALPHA32F_EXT = 0x8819, + GL_RGBA16F_EXT = 0x881A, + GL_RGB16F_EXT = 0x881B, + GL_ALPHA16F_EXT = 0x881C, + GL_LUMINANCE16F_EXT = 0x881E, + GL_LUMINANCE_ALPHA16F_EXT = 0x881F, + GL_RGB10_A2_EXT = 0x8059, + GL_RGB10_EXT = 0x8052, + GL_BGRA8_EXT = 0x93A1, + GL_R8_EXT = 0x8229, + GL_RG8_EXT = 0x822B, + GL_R32F_EXT = 0x822E, + GL_RG32F_EXT = 0x8230, + GL_R16F_EXT = 0x822D, + GL_RG16F_EXT = 0x822F, + GL_RGB_RAW_422_APPLE = 0x8A51; + + protected EXTTextureStorage() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexStorage1DEXT ] --- + + public static native void glTexStorage1DEXT(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width); + + // --- [ glTexStorage2DEXT ] --- + + public static native void glTexStorage2DEXT(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glTexStorage3DEXT ] --- + + public static native void glTexStorage3DEXT(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth); + + // --- [ glTextureStorage1DEXT ] --- + + public static native void glTextureStorage1DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width); + + // --- [ glTextureStorage2DEXT ] --- + + public static native void glTextureStorage2DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glTextureStorage3DEXT ] --- + + public static native void glTextureStorage3DEXT(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSwizzle.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSwizzle.java new file mode 100644 index 000000000..b9ebd38b4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTextureSwizzle.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the EXT_texture_swizzle extension. + * + *

    Classic OpenGL texture formats conflate texture storage and interpretation, and assume that textures represent color. In modern applications, a + * significant quantity of textures don't represent color, but rather data like shadow maps, normal maps, page tables, occlusion data, etc.. For the + * latter class of data, calling the data "RGBA" is just a convenient mapping of what the data is onto the current model, but isn't an accurate reflection + * of the reality of the data.

    + * + *

    The existing texture formats provide an almost orthogonal set of data types, sizes, and number of components, but the mappings of this storage into + * what the shader or fixed-function pipeline fetches is very much non-orthogonal. Previous extensions have added some of the most demanded missing + * formats, but the problem has not been solved once and for all.

    + * + *

    This extension provides a mechanism to swizzle the components of a texture before they are applied according to the texture environment in + * fixed-function or as they are returned to the shader.

    + */ +public final class EXTTextureSwizzle { + + /** Accepted by the {@code pname} parameters of TexParameteri, TexParameterf, TexParameteriv, TexParameterfv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int + GL_TEXTURE_SWIZZLE_R_EXT = 0x8E42, + GL_TEXTURE_SWIZZLE_G_EXT = 0x8E43, + GL_TEXTURE_SWIZZLE_B_EXT = 0x8E44, + GL_TEXTURE_SWIZZLE_A_EXT = 0x8E45; + + /** Accepted by the {@code pname} parameters of TexParameteriv, TexParameterfv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int GL_TEXTURE_SWIZZLE_RGBA_EXT = 0x8E46; + + private EXTTextureSwizzle() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTimerQuery.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTimerQuery.java new file mode 100644 index 000000000..c5aa61155 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTimerQuery.java @@ -0,0 +1,119 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_timer_query extension. + * + *

    Applications can benefit from accurate timing information in a number of different ways. During application development, timing information can help + * identify application or driver bottlenecks. At run time, applications can use timing information to dynamically adjust the amount of detail in a scene + * to achieve constant frame rates. OpenGL implementations have historically provided little to no useful timing information. Applications can get some + * idea of timing by reading timers on the CPU, but these timers are not synchronized with the graphics rendering pipeline. Reading a CPU timer does not + * guarantee the completion of a potentially large amount of graphics work accumulated before the timer is read, and will thus produce wildly inaccurate + * results. glFinish() can be used to determine when previous rendering commands have been completed, but will idle the graphics pipeline and adversely + * affect application performance.

    + * + *

    This extension provides a query mechanism that can be used to determine the amount of time it takes to fully complete a set of GL commands, and without + * stalling the rendering pipeline. It uses the query object mechanisms first introduced in the occlusion query extension, which allow time intervals to + * be polled asynchronously by the application.

    + * + *

    Requires {@link GL15 OpenGL 1.5}.

    + */ +public class EXTTimerQuery { + + static { GL.initialize(); } + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int GL_TIME_ELAPSED_EXT = 0x88BF; + + protected EXTTimerQuery() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetQueryObjecti64vEXT ] --- + + public static native void nglGetQueryObjecti64vEXT(int id, int pname, long params); + + public static void glGetQueryObjecti64vEXT(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetQueryObjecti64vEXT(id, pname, memAddress(params)); + } + + public static void glGetQueryObjecti64vEXT(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long params) { + nglGetQueryObjecti64vEXT(id, pname, params); + } + + @NativeType("void") + public static long glGetQueryObjecti64EXT(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetQueryObjecti64vEXT(id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetQueryObjectui64vEXT ] --- + + public static native void nglGetQueryObjectui64vEXT(int id, int pname, long params); + + public static void glGetQueryObjectui64vEXT(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetQueryObjectui64vEXT(id, pname, memAddress(params)); + } + + public static void glGetQueryObjectui64vEXT(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") long params) { + nglGetQueryObjectui64vEXT(id, pname, params); + } + + @NativeType("void") + public static long glGetQueryObjectui64EXT(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetQueryObjectui64vEXT(id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glGetQueryObjecti64vEXT GetQueryObjecti64vEXT} */ + public static void glGetQueryObjecti64vEXT(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetQueryObjecti64vEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(id, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetQueryObjectui64vEXT GetQueryObjectui64vEXT} */ + public static void glGetQueryObjectui64vEXT(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetQueryObjectui64vEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(id, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTransformFeedback.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTransformFeedback.java new file mode 100644 index 000000000..4e6ac8de4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTTransformFeedback.java @@ -0,0 +1,231 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; +import org.lwjgl.system.MemoryUtil; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_transform_feedback extension. + * + *

    This extension provides a new mode to the GL, called transform feedback, which records selected vertex attributes for each primitive processed by the + * GL. The selected attributes are written into buffer objects, and can be written with each attribute in a separate buffer object or with all attributes + * interleaved into a single buffer object. If a geometry shader is active, the primitives recorded are those emitted by the geometry shader. Otherwise, + * transform feedback captures primitives whose vertices are transformed by a vertex shader. In either case, the primitives captured are those generated + * prior to clipping. Transform feedback mode captures the values of specified varying variables emitted from GLSL vertex or geometry shaders.

    + * + *

    The vertex data recorded in transform feedback mode is stored into buffer objects as an array of vertex attributes. The regular representation and the + * use of buffer objects allows the recorded data to be processed directly by the GL without requiring CPU intervention to copy data. In particular, + * transform feedback data can be used for vertex arrays (via vertex buffer objects), as the source for pixel data (via pixel buffer objects), as shader + * constant data (via the NV_parameter_buffer_object or {@link EXTBindableUniform EXT_bindable_uniform} extensions), or via any other extension that + * makes use of buffer objects.

    + * + *

    This extension introduces new query object support to allow transform feedback mode to operate asynchronously. Query objects allow applications to + * determine when transform feedback results are complete, as well as the number of primitives processed and written back to buffer objects while in + * transform feedback mode. This extension also provides a new rasterizer discard enable, which allows applications to use transform feedback to capture + * vertex attributes without rendering anything.

    + * + *

    Requires {@link GL20 OpenGL 2.0} or {@link ARBShaderObjects ARB_shader_objects}. Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ +public class EXTTransformFeedback { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, + * BindBufferRangeEXT, BindBufferOffsetEXT and BindBufferBaseEXT. + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_EXT = 0x8C8E; + + /** Accepted by the {@code param} parameter of GetIntegerIndexedvEXT and GetBooleanIndexedvEXT. */ + public static final int + GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT = 0x8C84, + GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT = 0x8C85; + + /** + * Accepted by the {@code param} parameter of GetIntegerIndexedvEXT and GetBooleanIndexedvEXT, and by the {@code pname} parameter of GetBooleanv, + * GetDoublev, GetIntegerv, and GetFloatv. + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT = 0x8C8F; + + /** Accepted by the {@code bufferMode} parameter of TransformFeedbackVaryingsEXT. */ + public static final int + GL_INTERLEAVED_ATTRIBS_EXT = 0x8C8C, + GL_SEPARATE_ATTRIBS_EXT = 0x8C8D; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int + GL_PRIMITIVES_GENERATED_EXT = 0x8C87, + GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT = 0x8C88; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_RASTERIZER_DISCARD_EXT = 0x8C89; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT = 0x8C8A, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT = 0x8C8B, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT = 0x8C80; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int + GL_TRANSFORM_FEEDBACK_VARYINGS_EXT = 0x8C83, + GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT = 0x8C7F, + GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT = 0x8C76; + + protected EXTTransformFeedback() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindBufferRangeEXT ] --- + + public static native void glBindBufferRangeEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size); + + // --- [ glBindBufferOffsetEXT ] --- + + public static native void glBindBufferOffsetEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset); + + // --- [ glBindBufferBaseEXT ] --- + + public static native void glBindBufferBaseEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer); + + // --- [ glBeginTransformFeedbackEXT ] --- + + public static native void glBeginTransformFeedbackEXT(@NativeType("GLenum") int primitiveMode); + + // --- [ glEndTransformFeedbackEXT ] --- + + public static native void glEndTransformFeedbackEXT(); + + // --- [ glTransformFeedbackVaryingsEXT ] --- + + public static native void nglTransformFeedbackVaryingsEXT(int program, int count, long varyings, int bufferMode); + + public static void glTransformFeedbackVaryingsEXT(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") PointerBuffer varyings, @NativeType("GLenum") int bufferMode) { + nglTransformFeedbackVaryingsEXT(program, varyings.remaining(), memAddress(varyings), bufferMode); + } + + public static void glTransformFeedbackVaryingsEXT(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence[] varyings, @NativeType("GLenum") int bufferMode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long varyingsAddress = APIUtil.apiArray(stack, MemoryUtil::memASCII, varyings); + nglTransformFeedbackVaryingsEXT(program, varyings.length, varyingsAddress, bufferMode); + APIUtil.apiArrayFree(varyingsAddress, varyings.length); + } finally { + stack.setPointer(stackPointer); + } + } + + public static void glTransformFeedbackVaryingsEXT(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence varying, @NativeType("GLenum") int bufferMode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long varyingsAddress = APIUtil.apiArray(stack, MemoryUtil::memASCII, varying); + nglTransformFeedbackVaryingsEXT(program, 1, varyingsAddress, bufferMode); + APIUtil.apiArrayFree(varyingsAddress, 1); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTransformFeedbackVaryingEXT ] --- + + public static native void nglGetTransformFeedbackVaryingEXT(int program, int index, int bufSize, long length, long size, long type, long name); + + public static void glGetTransformFeedbackVaryingEXT(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLsizei *") IntBuffer size, @NativeType("GLenum *") IntBuffer type, @NativeType("GLchar *") ByteBuffer name) { + if (CHECKS) { + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + nglGetTransformFeedbackVaryingEXT(program, index, name.remaining(), memAddressSafe(length), memAddress(size), memAddress(type), memAddress(name)); + } + + @NativeType("void") + public static String glGetTransformFeedbackVaryingEXT(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufSize, @NativeType("GLsizei *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + if (CHECKS) { + check(size, 1); + check(type, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer name = stack.malloc(bufSize); + nglGetTransformFeedbackVaryingEXT(program, index, bufSize, memAddress(length), memAddress(size), memAddress(type), memAddress(name)); + return memASCII(name, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + @NativeType("void") + public static String glGetTransformFeedbackVaryingEXT(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLsizei *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return glGetTransformFeedbackVaryingEXT(program, index, GL.getCapabilities().OpenGL20 + ? GL20.glGetProgrami(program, GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT) + : ARBShaderObjects.glGetObjectParameteriARB(program, GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT), size, type); + } + + // --- [ glGetIntegerIndexedvEXT ] --- + + public static void nglGetIntegerIndexedvEXT(int target, int index, long data) { + EXTDrawBuffers2.nglGetIntegerIndexedvEXT(target, index, data); + } + + public static void glGetIntegerIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer data) { + EXTDrawBuffers2.glGetIntegerIndexedvEXT(target, index, data); + } + + @NativeType("void") + public static int glGetIntegerIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return EXTDrawBuffers2.glGetIntegerIndexedEXT(target, index); + } + + // --- [ glGetBooleanIndexedvEXT ] --- + + public static void nglGetBooleanIndexedvEXT(int target, int index, long data) { + EXTDrawBuffers2.nglGetBooleanIndexedvEXT(target, index, data); + } + + public static void glGetBooleanIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLboolean *") ByteBuffer data) { + EXTDrawBuffers2.glGetBooleanIndexedvEXT(target, index, data); + } + + @NativeType("void") + public static boolean glGetBooleanIndexedEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return EXTDrawBuffers2.glGetBooleanIndexedEXT(target, index); + } + + /** Array version of: {@link #glGetTransformFeedbackVaryingEXT GetTransformFeedbackVaryingEXT} */ + public static void glGetTransformFeedbackVaryingEXT(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLsizei *") int[] size, @NativeType("GLenum *") int[] type, @NativeType("GLchar *") ByteBuffer name) { + long __functionAddress = GL.getICD().glGetTransformFeedbackVaryingEXT; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + callPPPPV(program, index, name.remaining(), length, size, type, memAddress(name), __functionAddress); + } + + /** Array version of: {@link #glGetIntegerIndexedvEXT GetIntegerIndexedvEXT} */ + public static void glGetIntegerIndexedvEXT(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") int[] data) { + EXTDrawBuffers2.glGetIntegerIndexedvEXT(target, index, data); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTVertexAttrib64bit.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTVertexAttrib64bit.java new file mode 100644 index 000000000..f828e9590 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTVertexAttrib64bit.java @@ -0,0 +1,222 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_vertex_attrib_64bit extension. + * + *

    This extension provides OpenGL shading language support for vertex shader inputs with 64-bit floating-point components and OpenGL API support for + * specifying the value of those inputs using vertex array or immediate mode entry points. This builds on the support for general-purpose support for + * 64-bit floating-point values in the ARB_gpu_shader_fp64 extension.

    + * + *

    This extension provides a new class of vertex attribute functions, beginning with "VertexAttribL" ("L" for "long"), that can be used to specify + * attributes with 64-bit floating-point components. This extension provides no automatic type conversion between attribute and shader variables; + * single-precision attributes are not automatically converted to double-precision or vice versa. For shader variables with 64-bit component types, the + * "VertexAttribL" functions must be used to specify attribute values. For other shader variables, the "VertexAttribL" functions must not be used. If a + * vertex attribute is specified using the wrong attribute function, the values of the corresponding shader input are undefined. This approach requiring + * matching types is identical to that used for the "VertexAttribI" functions provided by OpenGL 3.0 and the EXT_gpu_shader4 extension.

    + * + *

    Additionally, some vertex shader inputs using the wider 64-bit components may count double against the implementation-dependent limit on the number of + * vertex shader attribute vectors. A 64-bit scalar or a two-component vector consumes only a single generic vertex attribute; three- and four-component + * "long" may count as two. This approach is similar to the one used in the current GL where matrix attributes consume multiple attributes.

    + * + *

    Note that 64-bit generic vertex attributes were nominally supported beginning with the introduction of vertex shaders in OpenGL 2.0. However, the + * OpenGL Shading Language at the time had no support for 64-bit data types, so any such values were automatically converted to 32-bit.

    + * + *

    Support for 64-bit floating-point vertex attributes in this extension can be combined with other extensions. In particular, this extension provides an + * entry point that can be used with EXT_direct_state_access to directly set state for any vertex array object. Also, the related + * NV_vertex_attrib_integer_64bit extension provides an entry point to specify bindless vertex attribute arrays with 64-bit components, integer or + * floating-point.

    + * + *

    Requires {@link GL30 OpenGL 3.0} and {@link ARBGPUShaderFP64 ARB_gpu_shader_fp64} (or equivalent functionality).

    + */ +public class EXTVertexAttrib64bit { + + static { GL.initialize(); } + + /** Returned in the {@code type} parameter of GetActiveAttrib. */ + public static final int + GL_DOUBLE_VEC2_EXT = 0x8FFC, + GL_DOUBLE_VEC3_EXT = 0x8FFD, + GL_DOUBLE_VEC4_EXT = 0x8FFE, + GL_DOUBLE_MAT2_EXT = 0x8F46, + GL_DOUBLE_MAT3_EXT = 0x8F47, + GL_DOUBLE_MAT4_EXT = 0x8F48, + GL_DOUBLE_MAT2x3_EXT = 0x8F49, + GL_DOUBLE_MAT2x4_EXT = 0x8F4A, + GL_DOUBLE_MAT3x2_EXT = 0x8F4B, + GL_DOUBLE_MAT3x4_EXT = 0x8F4C, + GL_DOUBLE_MAT4x2_EXT = 0x8F4D, + GL_DOUBLE_MAT4x3_EXT = 0x8F4E; + + protected EXTVertexAttrib64bit() { + throw new UnsupportedOperationException(); + } + + // --- [ glVertexAttribL1dEXT ] --- + + public static native void glVertexAttribL1dEXT(@NativeType("GLuint") int index, @NativeType("GLdouble") double x); + + // --- [ glVertexAttribL2dEXT ] --- + + public static native void glVertexAttribL2dEXT(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y); + + // --- [ glVertexAttribL3dEXT ] --- + + public static native void glVertexAttribL3dEXT(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glVertexAttribL4dEXT ] --- + + public static native void glVertexAttribL4dEXT(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w); + + // --- [ glVertexAttribL1dvEXT ] --- + + public static native void nglVertexAttribL1dvEXT(int index, long v); + + public static void glVertexAttribL1dvEXT(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttribL1dvEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribL2dvEXT ] --- + + public static native void nglVertexAttribL2dvEXT(int index, long v); + + public static void glVertexAttribL2dvEXT(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttribL2dvEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribL3dvEXT ] --- + + public static native void nglVertexAttribL3dvEXT(int index, long v); + + public static void glVertexAttribL3dvEXT(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttribL3dvEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribL4dvEXT ] --- + + public static native void nglVertexAttribL4dvEXT(int index, long v); + + public static void glVertexAttribL4dvEXT(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribL4dvEXT(index, memAddress(v)); + } + + // --- [ glVertexAttribLPointerEXT ] --- + + public static native void nglVertexAttribLPointerEXT(int index, int size, int type, int stride, long pointer); + + public static void glVertexAttribLPointerEXT(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglVertexAttribLPointerEXT(index, size, type, stride, memAddress(pointer)); + } + + public static void glVertexAttribLPointerEXT(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglVertexAttribLPointerEXT(index, size, type, stride, pointer); + } + + public static void glVertexAttribLPointerEXT(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLsizei") int stride, @NativeType("void const *") DoubleBuffer pointer) { + nglVertexAttribLPointerEXT(index, size, GL11.GL_DOUBLE, stride, memAddress(pointer)); + } + + // --- [ glGetVertexAttribLdvEXT ] --- + + public static native void nglGetVertexAttribLdvEXT(int index, int pname, long params); + + public static void glGetVertexAttribLdvEXT(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetVertexAttribLdvEXT(index, pname, memAddress(params)); + } + + // --- [ glVertexArrayVertexAttribLOffsetEXT ] --- + + /** + * DSA version of {@link ARBVertexAttrib64Bit#glVertexAttribLPointer VertexAttribLPointer}. + * + * @param vaobj the vertex array object + * @param buffer the buffer object + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. Must be:
    {@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param offset the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer. The initial value is 0. + */ + public static void glVertexArrayVertexAttribLOffsetEXT(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer, @NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("GLintptr") long offset) { + ARBVertexAttrib64Bit.glVertexArrayVertexAttribLOffsetEXT(vaobj, buffer, index, size, type, stride, offset); + } + + /** Array version of: {@link #glVertexAttribL1dvEXT VertexAttribL1dvEXT} */ + public static void glVertexAttribL1dvEXT(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttribL1dvEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribL2dvEXT VertexAttribL2dvEXT} */ + public static void glVertexAttribL2dvEXT(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttribL2dvEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribL3dvEXT VertexAttribL3dvEXT} */ + public static void glVertexAttribL3dvEXT(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttribL3dvEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribL4dvEXT VertexAttribL4dvEXT} */ + public static void glVertexAttribL4dvEXT(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttribL4dvEXT; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glGetVertexAttribLdvEXT GetVertexAttribLdvEXT} */ + public static void glGetVertexAttribLdvEXT(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribLdvEXT; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(index, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTWin32KeyedMutex.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTWin32KeyedMutex.java new file mode 100644 index 000000000..a0af9c663 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTWin32KeyedMutex.java @@ -0,0 +1,50 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_win32_keyed_mutex extension. + * + *

    Direct3D image objects may have a built-in synchronization primitive associated with them that can be used to synchronize access to their contents + * across process and API boundaries. This extension provides access to that synchronization primitive via two new commands that operate on GL memory + * objects.

    + * + *

    Requires {@link EXTMemoryObject EXT_memory_object}.

    + */ +public class EXTWin32KeyedMutex { + + static { GL.initialize(); } + + protected EXTWin32KeyedMutex() { + throw new UnsupportedOperationException(); + } + + // --- [ glAcquireKeyedMutexWin32EXT ] --- + + /** + * Blocks GL command processing until a keyed mutex is acquired. + * + * @param memory identifies which keyed mutex to acquire + * @param key is the mutex value to wait for + * @param timeout the time, in milliseconds, to wait before failing the acquire operation + */ + @NativeType("GLboolean") + public static native boolean glAcquireKeyedMutexWin32EXT(@NativeType("GLuint") int memory, @NativeType("GLuint64") long key, @NativeType("GLuint") int timeout); + + // --- [ glReleaseKeyedMutexWin32EXT ] --- + + /** + * Releases a keyed mutex after all prior GL command processing has completed. + * + * @param memory identifies the keyed mutex to release + * @param key the mutex value set by the release operation + */ + @NativeType("GLboolean") + public static native boolean glReleaseKeyedMutexWin32EXT(@NativeType("GLuint") int memory, @NativeType("GLuint64") long key); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTWindowRectangles.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTWindowRectangles.java new file mode 100644 index 000000000..bd7baf846 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTWindowRectangles.java @@ -0,0 +1,116 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the EXT_window_rectangles extension. + * + *

    This extension provides additional orthogonally aligned "window rectangles" specified in window-space coordinates that restrict rasterization of all + * primitive types (geometry, images, paths) and framebuffer clears.

    + * + *

    When rendering to the framebuffer of an on-screen window, these window rectangles are ignored so these window rectangles apply to rendering to non-zero + * framebuffer objects only.

    + * + *

    From zero to an implementation-dependent limit (specified by {@link #GL_MAX_WINDOW_RECTANGLES_EXT MAX_WINDOW_RECTANGLES_EXT}) number of window rectangles can be operational at once. When + * one or more window rectangles are active, rasterized fragments can either survive if the fragment is within any of the operational window rectangles + * ({@link #GL_INCLUSIVE_EXT INCLUSIVE_EXT} mode) or be rejected if the fragment is within any of the operational window rectangles ({@link #GL_EXCLUSIVE_EXT EXCLUSIVE_EXT} mode).

    + * + *

    These window rectangles operate orthogonally to the existing scissor test functionality.

    + * + *

    This extension has specification language for both OpenGL and ES so {@code EXT_window_rectangles} can be implemented and advertised for either or both + * API contexts.

    + * + *

    Requires {@link GL30 GL30} or {@link EXTDrawBuffers2 EXT_draw_buffers2}.

    + */ +public class EXTWindowRectangles { + + static { GL.initialize(); } + + /** Accepted by the {@code mode} parameter of {@link #glWindowRectanglesEXT WindowRectanglesEXT}. */ + public static final int + GL_INCLUSIVE_EXT = 0x8F10, + GL_EXCLUSIVE_EXT = 0x8F11; + + /** + * Accepted by the {@code pname} parameter of GetIntegeri_v, GetInteger64i_v, GetBooleani_v, GetFloati_v, GetDoublei_v, GetIntegerIndexedvEXT, + * GetFloatIndexedvEXT, GetDoubleIndexedvEXT, GetBooleanIndexedvEXT, and GetIntegeri_vEXT. + */ + public static final int GL_WINDOW_RECTANGLE_EXT = 0x8F12; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_WINDOW_RECTANGLE_MODE_EXT = 0x8F13, + GL_MAX_WINDOW_RECTANGLES_EXT = 0x8F14, + GL_NUM_WINDOW_RECTANGLES_EXT = 0x8F15; + + protected EXTWindowRectangles() { + throw new UnsupportedOperationException(); + } + + // --- [ glWindowRectanglesEXT ] --- + + /** + * Unsafe version of: {@link #glWindowRectanglesEXT WindowRectanglesEXT} + * + * @param count the number of active window rectangles. Must be between zero and the value of {@link #GL_MAX_WINDOW_RECTANGLES_EXT MAX_WINDOW_RECTANGLES_EXT}. + */ + public static native void nglWindowRectanglesEXT(int mode, int count, long box); + + /** + * Sets the active window rectangles. + * + *

    When the {@code WindowRectanglesEXT} command is processed without error, the ith window rectangle box is set to the corresponding four + * parameters for values of {@code i} less then {@code n}. For values of {@code i} greater than {@code n}, each window rectangle box is set to (0,0,0,0).

    + * + *

    Each four elements corresponds to the ith window rectangle indicating a box of pixels specified with window-space coordinates. Each window + * rectangle box {@code i} has a lower-left origin at {@code (x_i,y_i)} and upper-right corner at {@code (x_i+w_i,y_i+h_i)}.

    + * + *

    The {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if any element {@code w_i} or {@code h_i}, corresponding to each box's respective width and height, is negative.

    + * + *

    Each rasterized or cleared fragment with a window-space position {@code (xw,yw)} is within the ith window rectangle box when both of these + * equations are satisfied for all {@code i} less than {@code n}:

    + * + *
    
    +     * x_i ≤ xw < x_i+w_i
    +     * y_i ≤ yw < y_i+h_i
    + * + *

    When the window rectangles mode is {@link #GL_INCLUSIVE_EXT INCLUSIVE_EXT} mode and the bound framebuffer object is non-zero, a fragment passes the window rectangles test if + * the fragment's window-space position is within at least one of the current {@code n} active window rectangles; otherwise the window rectangles test + * fails and the fragment is discarded.

    + * + *

    When the window rectangles mode is {@link #GL_EXCLUSIVE_EXT EXCLUSIVE_EXT} mode and the bound framebuffer object is non-zero, a fragment fails the window rectangles test and is + * discarded if the fragment's window-space position is within at least one of the current {@code n} active window rectangles; otherwise the window + * rectangles test passes and the fragment passes the window rectangles test.

    + * + *

    When the bound framebuffer object is zero, the window rectangles test always passes.

    + * + * @param mode the rectangle mode. One of:
    {@link #GL_INCLUSIVE_EXT INCLUSIVE_EXT}{@link #GL_EXCLUSIVE_EXT EXCLUSIVE_EXT}
    + * @param box an array of {@code 4*count} window rectangle coordinates + */ + public static void glWindowRectanglesEXT(@NativeType("GLenum") int mode, @Nullable @NativeType("GLint const *") IntBuffer box) { + nglWindowRectanglesEXT(mode, remainingSafe(box) >> 2, memAddressSafe(box)); + } + + /** Array version of: {@link #glWindowRectanglesEXT WindowRectanglesEXT} */ + public static void glWindowRectanglesEXT(@NativeType("GLenum") int mode, @Nullable @NativeType("GLint const *") int[] box) { + long __functionAddress = GL.getICD().glWindowRectanglesEXT; + if (CHECKS) { + check(__functionAddress); + } + callPV(mode, lengthSafe(box) >> 2, box, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTX11SyncObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTX11SyncObject.java new file mode 100644 index 000000000..7520b9ee5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/EXTX11SyncObject.java @@ -0,0 +1,53 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the EXT_x11_sync_object extension. + * + *

    Synchronization objects added the ability to better coordinate operations between multiple GL command streams. However, it is desirable to have the + * same level of coordination between GL command streams and external rendering APIs. This extension introduces two new concepts to build upon the + * synchronization infrastructure provided by {@link ARBSync ARB_sync}:

    + * + *
      + *
    1. A means to import an X Synchronization Fence object into the GL and use it as a sync object.
    2. + *
    3. The concept of a reusable sync object.
    4. + *
    + * + *

    The latter is necessary because the import operation is expensive and performing it every time a synchronization point was reached would make the + * synchronization prohibitively slow.

    + * + *

    This extension stops short of allowing the GL to change the state of imported/reusable sync objects, but does not add any language that would prohibit + * such functionality from being added in a subsequent extension.

    + * + *

    Requires {@link GL32 OpenGL 3.2} or {@link ARBSync ARB_sync}.

    + */ +public class EXTX11SyncObject { + + static { GL.initialize(); } + + /** Accepted by the {@code external_sync_type} parameter of ImportSyncEXT. */ + public static final int GL_SYNC_X11_FENCE_EXT = 0x90E1; + + protected EXTX11SyncObject() { + throw new UnsupportedOperationException(); + } + + // --- [ glImportSyncEXT ] --- + + /** + * Creates a GL sync object of the type {@code external_sync_type} based on the object referred to by {@code external_sync}. + * + * @param external_sync_type the external sync object type. Must be:
    {@link #GL_SYNC_X11_FENCE_EXT SYNC_X11_FENCE_EXT}
    + * @param external_sync the external sync object. Must be the XID of a valid X11 Synchronization Fence object + * @param flags Must be 0. + */ + @NativeType("GLsync") + public static native long glImportSyncEXT(@NativeType("GLenum") int external_sync_type, @NativeType("GLintptr") long external_sync, @NativeType("GLbitfield") int flags); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL.java new file mode 100644 index 000000000..3d5965833 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL.java @@ -0,0 +1,739 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.opengl; + +import org.lwjgl.*; +import org.lwjgl.system.*; +import org.lwjgl.system.windows.*; + +import javax.annotation.*; +import java.nio.*; +import java.util.*; +import java.util.function.*; + +import static java.lang.Math.*; +import static org.lwjgl.opengl.GL32C.*; +import static org.lwjgl.opengl.GLX.*; +import static org.lwjgl.opengl.GLX11.*; +import static org.lwjgl.opengl.WGL.*; +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.linux.X11.*; +import static org.lwjgl.system.windows.GDI32.*; +import static org.lwjgl.system.windows.User32.*; +import static org.lwjgl.system.windows.WindowsUtil.*; + +/** + * This class must be used before any OpenGL function is called. It has the following responsibilities: + *
      + *
    • Loads the OpenGL native library into the JVM process.
    • + *
    • Creates instances of {@link GLCapabilities} classes. A {@code GLCapabilities} instance contains flags for functionality that is available in an OpenGL + * context. Internally, it also contains function pointers that are only valid in that specific OpenGL context.
    • + *
    • Maintains thread-local state for {@code GLCapabilities} instances, corresponding to OpenGL contexts that are current in those threads.
    • + *
    + * + *

    Library lifecycle

    + *

    The OpenGL library is loaded automatically when this class is initialized. Set the {@link Configuration#OPENGL_EXPLICIT_INIT} option to override this + * behavior. Manual loading/unloading can be achieved with the {@link #create} and {@link #destroy} functions. The name of the library loaded can be overridden + * with the {@link Configuration#OPENGL_LIBRARY_NAME} option. The maximum OpenGL version loaded can be set with the {@link Configuration#OPENGL_MAXVERSION} + * option. This can be useful to ensure that no functionality above a specific version is used during development.

    + * + *

    GLCapabilities creation

    + *

    Instances of {@code GLCapabilities} can be created with the {@link #createCapabilities} method. An OpenGL context must be current in the current thread + * before it is called. Calling this method is expensive, so the {@code GLCapabilities} instance should be associated with the OpenGL context and reused as + * necessary.

    + * + *

    Thread-local state

    + *

    Before a function for a given OpenGL context can be called, the corresponding {@code GLCapabilities} instance must be passed to the + * {@link #setCapabilities} method. The user is also responsible for clearing the current {@code GLCapabilities} instance when the context is destroyed or made + * current in another thread.

    + * + *

    Note that the {@link #createCapabilities} method implicitly calls {@link #setCapabilities} with the newly created instance.

    + */ +public final class GL { + + @Nullable + private static final APIVersion MAX_VERSION; + + @Nullable + private static FunctionProvider functionProvider; + + private static final ThreadLocal capabilitiesTLS = new ThreadLocal<>(); + + private static ICD icd = new ICDStatic(); + + @Nullable + private static WGLCapabilities capabilitiesWGL; + + @Nullable + private static GLXCapabilities capabilitiesGLXClient; + @Nullable + private static GLXCapabilities capabilitiesGLX; + + static { + Library.loadSystem(System::load, System::loadLibrary, GL.class, "org.lwjgl.opengl", Platform.mapLibraryNameBundled("lwjgl_opengl")); + + MAX_VERSION = apiParseVersion(Configuration.OPENGL_MAXVERSION); + + if (!Configuration.OPENGL_EXPLICIT_INIT.get(false)) { + create(); + } + } + + private GL() {} + + /** Ensures that the lwjgl_opengl shared library has been loaded. */ + static void initialize() { + // intentionally empty to trigger static initializer + } + + /** Loads the OpenGL native library, using the default library name. */ + public static void create() { + SharedLibrary GL; + switch (Platform.get()) { + case LINUX: + GL = Library.loadNative(GL.class, "org.lwjgl.opengl", Configuration.OPENGL_LIBRARY_NAME, "libGLX.so.0", "libGL.so.1", "libGL.so"); + break; + case MACOSX: + GL = Library.loadNative(GL.class, "org.lwjgl.opengl", Configuration.OPENGL_LIBRARY_NAME, "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL"); + break; + case WINDOWS: + GL = Library.loadNative(GL.class, "org.lwjgl.opengl", Configuration.OPENGL_LIBRARY_NAME, "opengl32"); + break; + default: + throw new IllegalStateException(); + } + create(GL); + } + + /** + * Loads the OpenGL native library, using the specified library name. + * + * @param libName the native library name + */ + public static void create(String libName) { + create(Library.loadNative(GL.class, "org.lwjgl.opengl", libName)); + } + + private static void create(SharedLibrary OPENGL) { + try { + create((FunctionProvider)new SharedLibrary.Delegate(OPENGL) { + private final long GetProcAddress; + + { + long GetProcAddress = NULL; + + switch (Platform.get()) { + case LINUX: + GetProcAddress = library.getFunctionAddress("glXGetProcAddress"); + if (GetProcAddress == NULL) { + GetProcAddress = library.getFunctionAddress("glXGetProcAddressARB"); + } + break; + case WINDOWS: + GetProcAddress = library.getFunctionAddress("wglGetProcAddress"); + break; + } + if (GetProcAddress == NULL) { + GetProcAddress = library.getFunctionAddress("OSMesaGetProcAddress"); + } + + this.GetProcAddress = GetProcAddress; + } + + @Override + public long getFunctionAddress(ByteBuffer functionName) { + long address = GetProcAddress == NULL ? NULL : Platform.get() == Platform.WINDOWS + ? nwglGetProcAddress(memAddress(functionName), GetProcAddress) // save LastError + : callPP(memAddress(functionName), GetProcAddress); + if (address == NULL) { + address = library.getFunctionAddress(functionName); + if (address == NULL && DEBUG_FUNCTIONS) { + apiLogMissing("GL", functionName); + } + } + + return address; + } + }); + } catch (RuntimeException e) { + OPENGL.free(); + throw e; + } + } + + /** + * Initializes OpenGL with the specified {@link FunctionProvider}. This method can be used to implement custom OpenGL library loading. + * + * @param functionProvider the provider of OpenGL function addresses + */ + public static void create(FunctionProvider functionProvider) { + if (GL.functionProvider != null) { + throw new IllegalStateException("OpenGL library has already been loaded."); + } + + GL.functionProvider = functionProvider; + ThreadLocalUtil.setFunctionMissingAddresses(GLCapabilities.ADDRESS_BUFFER_SIZE); + } + + /** Unloads the OpenGL native library. */ + public static void destroy() { + if (functionProvider == null) { + return; + } + + ThreadLocalUtil.setFunctionMissingAddresses(0); + + capabilitiesWGL = null; + capabilitiesGLX = null; + + if (functionProvider instanceof NativeResource) { + ((NativeResource)functionProvider).free(); + } + functionProvider = null; + } + + /** Returns the {@link FunctionProvider} for the OpenGL native library. */ + @Nullable + public static FunctionProvider getFunctionProvider() { + return functionProvider; + } + + /** + * Sets the {@link GLCapabilities} of the OpenGL context that is current in the current thread. + * + *

    This {@code GLCapabilities} instance will be used by any OpenGL call in the current thread, until {@code setCapabilities} is called again with a + * different value.

    + */ + public static void setCapabilities(@Nullable GLCapabilities caps) { + capabilitiesTLS.set(caps); + ThreadLocalUtil.setCapabilities(caps == null ? NULL : memAddress(caps.addresses)); + icd.set(caps); + } + + /** + * Returns the {@link GLCapabilities} of the OpenGL context that is current in the current thread. + * + * @throws IllegalStateException if {@link #setCapabilities} has never been called in the current thread or was last called with a {@code null} value + */ + public static GLCapabilities getCapabilities() { + return checkCapabilities(capabilitiesTLS.get()); + } + + private static GLCapabilities checkCapabilities(@Nullable GLCapabilities caps) { + if (CHECKS && caps == null) { + throw new IllegalStateException( + "No GLCapabilities instance set for the current thread. Possible solutions:\n" + + "\ta) Call GL.createCapabilities() after making a context current in the current thread.\n" + + "\tb) Call GL.setCapabilities() if a GLCapabilities instance already exists for the current context." + ); + } + //noinspection ConstantConditions + return caps; + } + + /** + * Returns the WGL capabilities. + * + *

    This method may only be used on Windows.

    + */ + public static WGLCapabilities getCapabilitiesWGL() { + if (capabilitiesWGL == null) { + capabilitiesWGL = createCapabilitiesWGLDummy(); + } + + return capabilitiesWGL; + } + + /** Returns the GLX client capabilities. */ + static GLXCapabilities getCapabilitiesGLXClient() { + if (capabilitiesGLXClient == null) { + capabilitiesGLXClient = initCapabilitiesGLX(true); + } + + return capabilitiesGLXClient; + } + + /** + * Returns the GLX capabilities. + * + *

    This method may only be used on Linux.

    + */ + public static GLXCapabilities getCapabilitiesGLX() { + if (capabilitiesGLX == null) { + capabilitiesGLX = initCapabilitiesGLX(false); + } + + return capabilitiesGLX; + } + + private static GLXCapabilities initCapabilitiesGLX(boolean client) { + long display = nXOpenDisplay(NULL); + try { + return createCapabilitiesGLX(display, client ? -1 : XDefaultScreen(display)); + } finally { + XCloseDisplay(display); + } + } + + /** + * Creates a new {@link GLCapabilities} instance for the OpenGL context that is current in the current thread. + * + *

    Depending on the current context, the instance returned may or may not contain the deprecated functionality removed since OpenGL version 3.1.

    + * + *

    This method calls {@link #setCapabilities(GLCapabilities)} with the new instance before returning.

    + * + * @return the GLCapabilities instance + */ + public static GLCapabilities createCapabilities() { + return createCapabilities(null); + } + + /** + * Creates a new {@link GLCapabilities} instance for the OpenGL context that is current in the current thread. + * + *

    Depending on the current context, the instance returned may or may not contain the deprecated functionality removed since OpenGL version 3.1.

    + * + *

    This method calls {@link #setCapabilities(GLCapabilities)} with the new instance before returning.

    + * + * @param bufferFactory a function that allocates a {@link PointerBuffer} given a size. The buffer must be filled with zeroes. If {@code null}, LWJGL will + * allocate a GC-managed buffer internally. + * + * @return the GLCapabilities instance + */ + public static GLCapabilities createCapabilities(@Nullable IntFunction bufferFactory) { + return createCapabilities(false, bufferFactory); + } + + /** + * Creates a new {@link GLCapabilities} instance for the OpenGL context that is current in the current thread. + * + *

    Depending on the current context, the instance returned may or may not contain the deprecated functionality removed since OpenGL version 3.1. The + * {@code forwardCompatible} flag will force LWJGL to not load the deprecated functions, even if the current context exposes them.

    + * + *

    This method calls {@link #setCapabilities(GLCapabilities)} with the new instance before returning.

    + * + * @param forwardCompatible if true, LWJGL will create forward compatible capabilities + * + * @return the GLCapabilities instance + */ + public static GLCapabilities createCapabilities(boolean forwardCompatible) { + return createCapabilities(forwardCompatible, null); + } + + /** + * Creates a new {@link GLCapabilities} instance for the OpenGL context that is current in the current thread. + * + *

    Depending on the current context, the instance returned may or may not contain the deprecated functionality removed since OpenGL version 3.1. The + * {@code forwardCompatible} flag will force LWJGL to not load the deprecated functions, even if the current context exposes them.

    + * + *

    This method calls {@link #setCapabilities(GLCapabilities)} with the new instance before returning.

    + * + * @param forwardCompatible if true, LWJGL will create forward compatible capabilities + * @param bufferFactory a function that allocates a {@link PointerBuffer} given a size. If {@code null}, LWJGL will allocate a GC-managed buffer + * internally. + * + * @return the GLCapabilities instance + */ + @SuppressWarnings("AssignmentToMethodParameter") + public static GLCapabilities createCapabilities(boolean forwardCompatible, @Nullable IntFunction bufferFactory) { + FunctionProvider functionProvider = GL.functionProvider; + if (functionProvider == null) { + throw new IllegalStateException("OpenGL library has not been loaded."); + } + + // We don't have a current ContextCapabilities when this method is called + // so we have to use the native bindings directly. + long GetError = functionProvider.getFunctionAddress("glGetError"); + long GetString = functionProvider.getFunctionAddress("glGetString"); + long GetIntegerv = functionProvider.getFunctionAddress("glGetIntegerv"); + + if (GetError == NULL || GetString == NULL || GetIntegerv == NULL) { + throw new IllegalStateException("Core OpenGL functions could not be found. Make sure that the OpenGL library has been loaded correctly."); + } + + int errorCode = callI(GetError); + if (errorCode != GL_NO_ERROR) { + apiLog(String.format("An OpenGL context was in an error state before the creation of its capabilities instance. Error: 0x%X", errorCode)); + } + + int majorVersion; + int minorVersion; + + try (MemoryStack stack = stackPush()) { + IntBuffer version = stack.ints(0); + + // Try the 3.0+ version query first + callPV(GL_MAJOR_VERSION, memAddress(version), GetIntegerv); + if (callI(GetError) == GL_NO_ERROR && 3 <= (majorVersion = version.get(0))) { + // We're on an 3.0+ context. + callPV(GL_MINOR_VERSION, memAddress(version), GetIntegerv); + minorVersion = version.get(0); + } else { + // Fallback to the string query. + String versionString = memUTF8Safe(callP(GL_VERSION, GetString)); + if (versionString == null || callI(GetError) != GL_NO_ERROR) { + throw new IllegalStateException("There is no OpenGL context current in the current thread."); + } + + APIVersion apiVersion = apiParseVersion(versionString); + + majorVersion = apiVersion.major; + minorVersion = apiVersion.minor; + } + } + + if (majorVersion < 1 || (majorVersion == 1 && minorVersion < 1)) { + throw new IllegalStateException("OpenGL 1.1 is required."); + } + + int[] GL_VERSIONS = { + 5, // OpenGL 1.1 to 1.5 + 1, // OpenGL 2.0 to 2.1 + 3, // OpenGL 3.0 to 3.3 + 6, // OpenGL 4.0 to 4.6 + }; + + Set supportedExtensions = new HashSet<>(512); + + int maxMajor = min(majorVersion, GL_VERSIONS.length); + if (MAX_VERSION != null) { + maxMajor = min(MAX_VERSION.major, maxMajor); + } + for (int M = 1; M <= maxMajor; M++) { + int maxMinor = GL_VERSIONS[M - 1]; + if (M == majorVersion) { + maxMinor = min(minorVersion, maxMinor); + } + if (MAX_VERSION != null && M == MAX_VERSION.major) { + maxMinor = min(MAX_VERSION.minor, maxMinor); + } + + for (int m = M == 1 ? 1 : 0; m <= maxMinor; m++) { + supportedExtensions.add("OpenGL" + M + m); + } + } + + if (majorVersion < 3) { + // Parse EXTENSIONS string + String extensionsString = memASCIISafe(callP(GL_EXTENSIONS, GetString)); + if (extensionsString != null) { + StringTokenizer tokenizer = new StringTokenizer(extensionsString); + while (tokenizer.hasMoreTokens()) { + supportedExtensions.add(tokenizer.nextToken()); + } + } + } else { + // Use indexed EXTENSIONS + try (MemoryStack stack = stackPush()) { + IntBuffer pi = stack.ints(0); + + callPV(GL_NUM_EXTENSIONS, memAddress(pi), GetIntegerv); + int extensionCount = pi.get(0); + + long GetStringi = apiGetFunctionAddress(functionProvider, "glGetStringi"); + for (int i = 0; i < extensionCount; i++) { + supportedExtensions.add(memASCII(callP(GL_EXTENSIONS, i, GetStringi))); + } + + // In real drivers, we may encounter the following weird scenarios: + // - 3.1 context without GL_ARB_compatibility but with deprecated functionality exposed and working. + // - Core or forward-compatible context with GL_ARB_compatibility exposed, but not working when used. + // We ignore these and go by the spec. + + // Force forwardCompatible to true if the context is a forward-compatible context. + callPV(GL_CONTEXT_FLAGS, memAddress(pi), GetIntegerv); + if ((pi.get(0) & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) != 0) { + forwardCompatible = true; + } else { + // Force forwardCompatible to true if the context is a core profile context. + if ((3 < majorVersion || 1 <= minorVersion)) { // OpenGL 3.1+ + if (3 < majorVersion || 2 <= minorVersion) { // OpenGL 3.2+ + callPV(GL_CONTEXT_PROFILE_MASK, memAddress(pi), GetIntegerv); + if ((pi.get(0) & GL_CONTEXT_CORE_PROFILE_BIT) != 0) { + forwardCompatible = true; + } + } else { + forwardCompatible = !supportedExtensions.contains("GL_ARB_compatibility"); + } + } + } + } + } + apiFilterExtensions(supportedExtensions, Configuration.OPENGL_EXTENSION_FILTER); + + GLCapabilities caps = new GLCapabilities(functionProvider, supportedExtensions, forwardCompatible, bufferFactory == null + ? BufferUtils::createPointerBuffer + : bufferFactory); + + setCapabilities(caps); + + return caps; + } + + /** Creates a dummy context and retrieves the WGL capabilities. */ + private static WGLCapabilities createCapabilitiesWGLDummy() { + long hdc = wglGetCurrentDC(); // just use the current context if one exists + if (hdc != NULL) { + return createCapabilitiesWGL(hdc); + } + + short classAtom = 0; + long hwnd = NULL; + long hglrc = NULL; + try (MemoryStack stack = stackPush()) { + WNDCLASSEX wc = WNDCLASSEX.calloc(stack) + .cbSize(WNDCLASSEX.SIZEOF) + .style(CS_HREDRAW | CS_VREDRAW) + .hInstance(WindowsLibrary.HINSTANCE) + .lpszClassName(stack.UTF16("WGL")); + + memPutAddress( + wc.address() + WNDCLASSEX.LPFNWNDPROC, + User32.Functions.DefWindowProc + ); + + classAtom = RegisterClassEx(wc); + if (classAtom == 0) { + throw new IllegalStateException("Failed to register WGL window class"); + } + + hwnd = check(nCreateWindowEx( + 0, classAtom & 0xFFFF, NULL, + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, + 0, 0, 1, 1, + NULL, NULL, NULL, NULL + )); + + hdc = check(GetDC(hwnd)); + + PIXELFORMATDESCRIPTOR pfd = PIXELFORMATDESCRIPTOR.calloc(stack) + .nSize((short)PIXELFORMATDESCRIPTOR.SIZEOF) + .nVersion((short)1) + .dwFlags(PFD_SUPPORT_OPENGL); // we don't care about anything else + + int pixelFormat = ChoosePixelFormat(hdc, pfd); + if (pixelFormat == 0) { + windowsThrowException("Failed to choose an OpenGL-compatible pixel format"); + } + + if (DescribePixelFormat(hdc, pixelFormat, pfd) == 0) { + windowsThrowException("Failed to obtain pixel format information"); + } + + if (!SetPixelFormat(hdc, pixelFormat, pfd)) { + windowsThrowException("Failed to set the pixel format"); + } + + hglrc = check(wglCreateContext(hdc)); + wglMakeCurrent(hdc, hglrc); + + return createCapabilitiesWGL(hdc); + } finally { + if (hglrc != NULL) { + wglMakeCurrent(NULL, NULL); + wglDeleteContext(hglrc); + } + + if (hwnd != NULL) { + DestroyWindow(hwnd); + } + + if (classAtom != 0) { + nUnregisterClass(classAtom & 0xFFFF, WindowsLibrary.HINSTANCE); + } + } + } + + /** + * Creates a {@link WGLCapabilities} instance for the context that is current in the current thread. + * + *

    This method may only be used on Windows.

    + */ + public static WGLCapabilities createCapabilitiesWGL() { + long hdc = wglGetCurrentDC(); + if (hdc == NULL) { + throw new IllegalStateException("Failed to retrieve the device context of the current OpenGL context"); + } + + return createCapabilitiesWGL(hdc); + } + + /** + * Creates a {@link WGLCapabilities} instance for the specified device context. + * + * @param hdc the device context handle ({@code HDC}) + */ + private static WGLCapabilities createCapabilitiesWGL(long hdc) { + FunctionProvider functionProvider = GL.functionProvider; + if (functionProvider == null) { + throw new IllegalStateException("OpenGL library has not been loaded."); + } + + String extensionsString = null; + + long wglGetExtensionsString = functionProvider.getFunctionAddress("wglGetExtensionsStringARB"); + if (wglGetExtensionsString != NULL) { + extensionsString = memASCII(callPP(hdc, wglGetExtensionsString)); + } else { + wglGetExtensionsString = functionProvider.getFunctionAddress("wglGetExtensionsStringEXT"); + if (wglGetExtensionsString != NULL) { + extensionsString = memASCII(callP(wglGetExtensionsString)); + } + } + + Set supportedExtensions = new HashSet<>(32); + + if (extensionsString != null) { + StringTokenizer tokenizer = new StringTokenizer(extensionsString); + while (tokenizer.hasMoreTokens()) { + supportedExtensions.add(tokenizer.nextToken()); + } + } + + apiFilterExtensions(supportedExtensions, Configuration.OPENGL_EXTENSION_FILTER); + + return new WGLCapabilities(functionProvider, supportedExtensions); + } + + /** + * Creates a {@link GLXCapabilities} instance for the default screen of the specified X connection. + * + *

    This method may only be used on Linux.

    + * + * @param display the X connection handle ({@code DISPLAY}) + */ + public static GLXCapabilities createCapabilitiesGLX(long display) { + return createCapabilitiesGLX(display, XDefaultScreen(display)); + } + + /** + * Creates a {@link GLXCapabilities} instance for the specified screen of the specified X connection. + * + *

    This method may only be used on Linux.

    + * + * @param display the X connection handle ({@code DISPLAY}) + * @param screen the screen index + */ + public static GLXCapabilities createCapabilitiesGLX(long display, int screen) { + FunctionProvider functionProvider = GL.functionProvider; + if (functionProvider == null) { + throw new IllegalStateException("OpenGL library has not been loaded."); + } + + int majorVersion; + int minorVersion; + + try (MemoryStack stack = stackPush()) { + IntBuffer piMajor = stack.ints(0); + IntBuffer piMinor = stack.ints(0); + + if (!glXQueryVersion(display, piMajor, piMinor)) { + throw new IllegalStateException("Failed to query GLX version"); + } + + majorVersion = piMajor.get(0); + minorVersion = piMinor.get(0); + if (majorVersion != 1) { + throw new IllegalStateException("Invalid GLX major version: " + majorVersion); + } + } + + Set supportedExtensions = new HashSet<>(32); + + int[][] GLX_VERSIONS = { + {1, 2, 3, 4} + }; + + for (int major = 1; major <= GLX_VERSIONS.length; major++) { + int[] minors = GLX_VERSIONS[major - 1]; + for (int minor : minors) { + if (major < majorVersion || (major == majorVersion && minor <= minorVersion)) { + supportedExtensions.add("GLX" + major + minor); + } + } + } + + if (1 <= minorVersion) { + String extensionsString; + + if (screen == -1) { + long glXGetClientString = functionProvider.getFunctionAddress("glXGetClientString"); + extensionsString = memASCIISafe(callPP(display, GLX_EXTENSIONS, glXGetClientString)); + } else { + long glXQueryExtensionsString = functionProvider.getFunctionAddress("glXQueryExtensionsString"); + extensionsString = memASCIISafe(callPP(display, screen, glXQueryExtensionsString)); + } + + if (extensionsString != null) { + StringTokenizer tokenizer = new StringTokenizer(extensionsString); + while (tokenizer.hasMoreTokens()) { + supportedExtensions.add(tokenizer.nextToken()); + } + } + } + + apiFilterExtensions(supportedExtensions, Configuration.OPENGL_EXTENSION_FILTER); + + return new GLXCapabilities(functionProvider, supportedExtensions); + } + + // Only used by array overloads + static GLCapabilities getICD() { + return checkCapabilities(icd.get()); + } + + /** Function pointer provider. */ + private interface ICD { + default void set(@Nullable GLCapabilities caps) {} + @Nullable GLCapabilities get(); + } + + /** + * Write-once {@link ICD}. + * + *

    This is the default implementation that skips the thread-local lookup. When a new GLCapabilities is set, we compare it to the write-once capabilities. + * If different function pointers are found, we fall back to the expensive lookup.

    + */ + private static class ICDStatic implements ICD { + + @Nullable + private static GLCapabilities tempCaps; + + @SuppressWarnings("AssignmentToStaticFieldFromInstanceMethod") + @Override + public void set(@Nullable GLCapabilities caps) { + if (tempCaps == null) { + tempCaps = caps; + } else if (caps != null && caps != tempCaps && ThreadLocalUtil.areCapabilitiesDifferent(tempCaps.addresses, caps.addresses)) { + apiLog("[WARNING] Incompatible context detected. Falling back to thread-local lookup for GL contexts."); + icd = GL::getCapabilities; // fall back to thread/process lookup + } + } + + @Override + public GLCapabilities get() { + return WriteOnce.caps; + } + + private static final class WriteOnce { + // This will be initialized the first time get() above is called + static final GLCapabilities caps; + + static { + GLCapabilities tempCaps = ICDStatic.tempCaps; + if (tempCaps == null) { + throw new IllegalStateException("No GLCapabilities instance has been set"); + } + caps = tempCaps; + } + } + + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL11.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL11.java new file mode 100644 index 000000000..d63c2fe2f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL11.java @@ -0,0 +1,10174 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.ShortBuffer; + +/** + * The OpenGL functionality up to version 1.1. Includes the deprecated symbols of the Compatibility Profile. + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL11 { + + static { GL.initialize(); } + + public static void glColorPointer(int size, boolean unsigned, int stride, ByteBuffer pointer) { + glColorPointer(size, unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE, stride, pointer); + } + + public static void glColorPointer(int size, int stride, FloatBuffer pointer) { + glColorPointer(size, GL11.GL_FLOAT, stride, pointer); + } + + public static void glFog(int p1, FloatBuffer p2) { + glFogfv(p1, p2); + } + + public static void glFog(int p1, IntBuffer p2) { + glFogiv(p1, p2); + } + + public static void glGetBoolean(int p1, ByteBuffer p2) { + glGetBooleanv(p1, p2); + } + + public static void glGetDouble(int p1, DoubleBuffer p2) { + glGetDoublev(p1, p2); + } + + public static void glGetFloat(int p1, FloatBuffer p2) { + glGetFloatv(p1, p2); + } + + public static void glGetInteger(int p1, IntBuffer p2) { + glGetIntegerv(p1, p2); + } + + public static void glGetLight(int p1, int p2, FloatBuffer p3) { + glGetLightfv(p1, p2, p3); + } + + public static void glGetLight(int p1, int p2, IntBuffer p3) { + glGetLightiv(p1, p2, p3); + } + + public static void glGetMap(int p1, int p2, DoubleBuffer p3) { + glGetMapdv(p1, p2, p3); + } + + public static void glGetMap(int p1, int p2, FloatBuffer p3) { + glGetMapfv(p1, p2, p3); + } + + public static void glGetMap(int p1, int p2, IntBuffer p3) { + glGetMapiv(p1, p2, p3); + } + + public static void glGetMaterial(int p1, int p2, FloatBuffer p3) { + glGetMaterialfv(p1, p2, p3); + } + + public static void glGetMaterial(int p1, int p2, IntBuffer p3) { + glGetMaterialiv(p1, p2, p3); + } + + public static void glGetPixelMap(int p1, FloatBuffer p2) { + glGetPixelMapfv(p1, p2); + } + + public static void glGetPixelMapu(int p1, IntBuffer p2) { + glGetPixelMapuiv(p1, p2); + } + + public static void glGetPixelMapu(int p1, ShortBuffer p2) { + glGetPixelMapusv(p1, p2); + } + + public static void glGetTexEnv(int p1, int p2, FloatBuffer p3) { + glGetTexEnvfv(p1, p2, p3); + } + + public static void glGetTexEnv(int p1, int p2, IntBuffer p3) { + glGetTexEnviv(p1, p2, p3); + } + + public static void glGetTexGen(int p1, int p2, DoubleBuffer p3) { + glGetTexGendv(p1, p2, p3); + } + + public static void glGetTexGen(int p1, int p2, FloatBuffer p3) { + glGetTexGenfv(p1, p2, p3); + } + + public static void glGetTexGen(int p1, int p2, IntBuffer p3) { + glGetTexGeniv(p1, p2, p3); + } + + public static void glGetTexLevelParameter(int target, int level, int pname, FloatBuffer params) { + glGetTexLevelParameterfv(target, level, pname, params); + } + + public static void glGetTexLevelParameter(int target, int level, int pname, IntBuffer params) { + glGetTexLevelParameteriv(target, level, pname, params); + } + + public static void glGetTexParameter(int target, int pname, FloatBuffer params) { + glGetTexParameterfv(target, pname, params); + } + + public static void glGetTexParameter(int target, int pname, IntBuffer params) { + glGetTexParameteriv(target, pname, params); + } + + public static void glLight(int light, int pname, FloatBuffer params) { + glLightfv(light, pname, params); + } + + public static void glLight(int light, int pname, IntBuffer params) { + glLightiv(light, pname, params); + } + + public static void glLightModel(int pname, FloatBuffer params) { + glLightModelfv(pname, params); + } + + public static void glLightModel(int pname, IntBuffer params) { + glLightModeliv(pname, params); + } + + public static void glLoadMatrix(DoubleBuffer m) { + glLoadMatrixd(m); + } + + public static void glLoadMatrix(FloatBuffer m) { + glLoadMatrixf(m); + } + + public static void glMaterial(int p1, int p2, FloatBuffer p3) { + glMaterialfv(p1, p2, p3); + } + + public static void glMaterial(int p1, int p2, IntBuffer p3) { + glMaterialiv(p1, p2, p3); + } + + public static void glMultMatrix(DoubleBuffer p1) { + glMultMatrixd(p1); + } + + public static void glMultMatrix(FloatBuffer p1) { + glMultMatrixf(p1); + } + + public static void glNormalPointer(int stride, ByteBuffer pointer) { + glNormalPointer(GL11.GL_BYTE, stride, pointer); + } + + public static void glNormalPointer(int stride, FloatBuffer pointer) { + glNormalPointer(GL11.GL_FLOAT, stride, pointer); + } + + public static void glNormalPointer(int stride, IntBuffer pointer) { + glNormalPointer(GL11.GL_INT, stride, pointer); + } + + public static void glNormalPointer(int stride, ShortBuffer pointer) { + glNormalPointer(GL11.GL_SHORT, stride, pointer); + } + + public static void glPixelMap(int p1, FloatBuffer p2) { + glPixelMapfv(p1, p2); + } + + public static void glPixelMapu(int p1, IntBuffer p2) { + glPixelMapuiv(p1, p2); + } + + public static void glPixelMapu(int p1, ShortBuffer p2) { + glPixelMapusv(p1, p2); + } + + public static void glTexCoordPointer(int size, int stride, FloatBuffer pointer) { + glTexCoordPointer(size, GL11.GL_FLOAT, stride, pointer); + } + + public static void glTexCoordPointer(int size, int stride, IntBuffer pointer) { + glTexCoordPointer(size, GL11.GL_INT, stride, pointer); + } + + public static void glTexCoordPointer(int size, int stride, ShortBuffer pointer) { + glTexCoordPointer(size, GL11.GL_SHORT, stride, pointer); + } + + public static void glTexEnv(int p1, int p2, FloatBuffer p3) { + glTexEnvfv(p1, p2, p3); + } + + public static void glTexEnv(int p1, int p2, IntBuffer p3) { + glTexEnviv(p1, p2, p3); + } + + public static void glTexGen(int p1, int p2, DoubleBuffer p3) { + glTexGendv(p1, p2, p3); + } + + public static void glTexGen(int p1, int p2, FloatBuffer p3) { + glTexGenfv(p1, p2, p3); + } + + public static void glTexGen(int p1, int p2, IntBuffer p3) { + glTexGeniv(p1, p2, p3); + } + + public static void glVertexPointer(int size, int stride, FloatBuffer pointer) { + glVertexPointer(size, GL11.GL_FLOAT, stride, pointer); + } + + public static void glVertexPointer(int size, int stride, IntBuffer pointer) { + glVertexPointer(size, GL11.GL_INT, stride, pointer); + } + + public static void glVertexPointer(int size, int stride, ShortBuffer pointer) { + glVertexPointer(size, GL11.GL_SHORT, stride, pointer); + } + + /** AccumOp */ + public static final int + GL_ACCUM = 0x100, + GL_LOAD = 0x101, + GL_RETURN = 0x102, + GL_MULT = 0x103, + GL_ADD = 0x104; + + /** AlphaFunction */ + public static final int + GL_NEVER = 0x200, + GL_LESS = 0x201, + GL_EQUAL = 0x202, + GL_LEQUAL = 0x203, + GL_GREATER = 0x204, + GL_NOTEQUAL = 0x205, + GL_GEQUAL = 0x206, + GL_ALWAYS = 0x207; + + /** AttribMask */ + public static final int + GL_CURRENT_BIT = 0x1, + GL_POINT_BIT = 0x2, + GL_LINE_BIT = 0x4, + GL_POLYGON_BIT = 0x8, + GL_POLYGON_STIPPLE_BIT = 0x10, + GL_PIXEL_MODE_BIT = 0x20, + GL_LIGHTING_BIT = 0x40, + GL_FOG_BIT = 0x80, + GL_DEPTH_BUFFER_BIT = 0x100, + GL_ACCUM_BUFFER_BIT = 0x200, + GL_STENCIL_BUFFER_BIT = 0x400, + GL_VIEWPORT_BIT = 0x800, + GL_TRANSFORM_BIT = 0x1000, + GL_ENABLE_BIT = 0x2000, + GL_COLOR_BUFFER_BIT = 0x4000, + GL_HINT_BIT = 0x8000, + GL_EVAL_BIT = 0x10000, + GL_LIST_BIT = 0x20000, + GL_TEXTURE_BIT = 0x40000, + GL_SCISSOR_BIT = 0x80000, + GL_ALL_ATTRIB_BITS = 0xFFFFF; + + /** BeginMode */ + public static final int + GL_POINTS = 0x0, + GL_LINES = 0x1, + GL_LINE_LOOP = 0x2, + GL_LINE_STRIP = 0x3, + GL_TRIANGLES = 0x4, + GL_TRIANGLE_STRIP = 0x5, + GL_TRIANGLE_FAN = 0x6, + GL_QUADS = 0x7, + GL_QUAD_STRIP = 0x8, + GL_POLYGON = 0x9; + + /** BlendingFactorDest */ + public static final int + GL_ZERO = 0, + GL_ONE = 1, + GL_SRC_COLOR = 0x300, + GL_ONE_MINUS_SRC_COLOR = 0x301, + GL_SRC_ALPHA = 0x302, + GL_ONE_MINUS_SRC_ALPHA = 0x303, + GL_DST_ALPHA = 0x304, + GL_ONE_MINUS_DST_ALPHA = 0x305; + + /** BlendingFactorSrc */ + public static final int + GL_DST_COLOR = 0x306, + GL_ONE_MINUS_DST_COLOR = 0x307, + GL_SRC_ALPHA_SATURATE = 0x308; + + /** Boolean */ + public static final int + GL_TRUE = 1, + GL_FALSE = 0; + + /** ClipPlaneName */ + public static final int + GL_CLIP_PLANE0 = 0x3000, + GL_CLIP_PLANE1 = 0x3001, + GL_CLIP_PLANE2 = 0x3002, + GL_CLIP_PLANE3 = 0x3003, + GL_CLIP_PLANE4 = 0x3004, + GL_CLIP_PLANE5 = 0x3005; + + /** DataType */ + public static final int + GL_BYTE = 0x1400, + GL_UNSIGNED_BYTE = 0x1401, + GL_SHORT = 0x1402, + GL_UNSIGNED_SHORT = 0x1403, + GL_INT = 0x1404, + GL_UNSIGNED_INT = 0x1405, + GL_FLOAT = 0x1406, + GL_2_BYTES = 0x1407, + GL_3_BYTES = 0x1408, + GL_4_BYTES = 0x1409, + GL_DOUBLE = 0x140A; + + /** DrawBufferMode */ + public static final int + GL_NONE = 0, + GL_FRONT_LEFT = 0x400, + GL_FRONT_RIGHT = 0x401, + GL_BACK_LEFT = 0x402, + GL_BACK_RIGHT = 0x403, + GL_FRONT = 0x404, + GL_BACK = 0x405, + GL_LEFT = 0x406, + GL_RIGHT = 0x407, + GL_FRONT_AND_BACK = 0x408, + GL_AUX0 = 0x409, + GL_AUX1 = 0x40A, + GL_AUX2 = 0x40B, + GL_AUX3 = 0x40C; + + /** ErrorCode */ + public static final int + GL_NO_ERROR = 0, + GL_INVALID_ENUM = 0x500, + GL_INVALID_VALUE = 0x501, + GL_INVALID_OPERATION = 0x502, + GL_STACK_OVERFLOW = 0x503, + GL_STACK_UNDERFLOW = 0x504, + GL_OUT_OF_MEMORY = 0x505; + + /** FeedBackMode */ + public static final int + GL_2D = 0x600, + GL_3D = 0x601, + GL_3D_COLOR = 0x602, + GL_3D_COLOR_TEXTURE = 0x603, + GL_4D_COLOR_TEXTURE = 0x604; + + /** FeedBackToken */ + public static final int + GL_PASS_THROUGH_TOKEN = 0x700, + GL_POINT_TOKEN = 0x701, + GL_LINE_TOKEN = 0x702, + GL_POLYGON_TOKEN = 0x703, + GL_BITMAP_TOKEN = 0x704, + GL_DRAW_PIXEL_TOKEN = 0x705, + GL_COPY_PIXEL_TOKEN = 0x706, + GL_LINE_RESET_TOKEN = 0x707; + + /** FogMode */ + public static final int + GL_EXP = 0x800, + GL_EXP2 = 0x801; + + /** FrontFaceDirection */ + public static final int + GL_CW = 0x900, + GL_CCW = 0x901; + + /** GetMapTarget */ + public static final int + GL_COEFF = 0xA00, + GL_ORDER = 0xA01, + GL_DOMAIN = 0xA02; + + /** GetTarget */ + public static final int + GL_CURRENT_COLOR = 0xB00, + GL_CURRENT_INDEX = 0xB01, + GL_CURRENT_NORMAL = 0xB02, + GL_CURRENT_TEXTURE_COORDS = 0xB03, + GL_CURRENT_RASTER_COLOR = 0xB04, + GL_CURRENT_RASTER_INDEX = 0xB05, + GL_CURRENT_RASTER_TEXTURE_COORDS = 0xB06, + GL_CURRENT_RASTER_POSITION = 0xB07, + GL_CURRENT_RASTER_POSITION_VALID = 0xB08, + GL_CURRENT_RASTER_DISTANCE = 0xB09, + GL_POINT_SMOOTH = 0xB10, + GL_POINT_SIZE = 0xB11, + GL_POINT_SIZE_RANGE = 0xB12, + GL_POINT_SIZE_GRANULARITY = 0xB13, + GL_LINE_SMOOTH = 0xB20, + GL_LINE_WIDTH = 0xB21, + GL_LINE_WIDTH_RANGE = 0xB22, + GL_LINE_WIDTH_GRANULARITY = 0xB23, + GL_LINE_STIPPLE = 0xB24, + GL_LINE_STIPPLE_PATTERN = 0xB25, + GL_LINE_STIPPLE_REPEAT = 0xB26, + GL_LIST_MODE = 0xB30, + GL_MAX_LIST_NESTING = 0xB31, + GL_LIST_BASE = 0xB32, + GL_LIST_INDEX = 0xB33, + GL_POLYGON_MODE = 0xB40, + GL_POLYGON_SMOOTH = 0xB41, + GL_POLYGON_STIPPLE = 0xB42, + GL_EDGE_FLAG = 0xB43, + GL_CULL_FACE = 0xB44, + GL_CULL_FACE_MODE = 0xB45, + GL_FRONT_FACE = 0xB46, + GL_LIGHTING = 0xB50, + GL_LIGHT_MODEL_LOCAL_VIEWER = 0xB51, + GL_LIGHT_MODEL_TWO_SIDE = 0xB52, + GL_LIGHT_MODEL_AMBIENT = 0xB53, + GL_SHADE_MODEL = 0xB54, + GL_COLOR_MATERIAL_FACE = 0xB55, + GL_COLOR_MATERIAL_PARAMETER = 0xB56, + GL_COLOR_MATERIAL = 0xB57, + GL_FOG = 0xB60, + GL_FOG_INDEX = 0xB61, + GL_FOG_DENSITY = 0xB62, + GL_FOG_START = 0xB63, + GL_FOG_END = 0xB64, + GL_FOG_MODE = 0xB65, + GL_FOG_COLOR = 0xB66, + GL_DEPTH_RANGE = 0xB70, + GL_DEPTH_TEST = 0xB71, + GL_DEPTH_WRITEMASK = 0xB72, + GL_DEPTH_CLEAR_VALUE = 0xB73, + GL_DEPTH_FUNC = 0xB74, + GL_ACCUM_CLEAR_VALUE = 0xB80, + GL_STENCIL_TEST = 0xB90, + GL_STENCIL_CLEAR_VALUE = 0xB91, + GL_STENCIL_FUNC = 0xB92, + GL_STENCIL_VALUE_MASK = 0xB93, + GL_STENCIL_FAIL = 0xB94, + GL_STENCIL_PASS_DEPTH_FAIL = 0xB95, + GL_STENCIL_PASS_DEPTH_PASS = 0xB96, + GL_STENCIL_REF = 0xB97, + GL_STENCIL_WRITEMASK = 0xB98, + GL_MATRIX_MODE = 0xBA0, + GL_NORMALIZE = 0xBA1, + GL_VIEWPORT = 0xBA2, + GL_MODELVIEW_STACK_DEPTH = 0xBA3, + GL_PROJECTION_STACK_DEPTH = 0xBA4, + GL_TEXTURE_STACK_DEPTH = 0xBA5, + GL_MODELVIEW_MATRIX = 0xBA6, + GL_PROJECTION_MATRIX = 0xBA7, + GL_TEXTURE_MATRIX = 0xBA8, + GL_ATTRIB_STACK_DEPTH = 0xBB0, + GL_CLIENT_ATTRIB_STACK_DEPTH = 0xBB1, + GL_ALPHA_TEST = 0xBC0, + GL_ALPHA_TEST_FUNC = 0xBC1, + GL_ALPHA_TEST_REF = 0xBC2, + GL_DITHER = 0xBD0, + GL_BLEND_DST = 0xBE0, + GL_BLEND_SRC = 0xBE1, + GL_BLEND = 0xBE2, + GL_LOGIC_OP_MODE = 0xBF0, + GL_INDEX_LOGIC_OP = 0xBF1, + GL_LOGIC_OP = 0xBF1, + GL_COLOR_LOGIC_OP = 0xBF2, + GL_AUX_BUFFERS = 0xC00, + GL_DRAW_BUFFER = 0xC01, + GL_READ_BUFFER = 0xC02, + GL_SCISSOR_BOX = 0xC10, + GL_SCISSOR_TEST = 0xC11, + GL_INDEX_CLEAR_VALUE = 0xC20, + GL_INDEX_WRITEMASK = 0xC21, + GL_COLOR_CLEAR_VALUE = 0xC22, + GL_COLOR_WRITEMASK = 0xC23, + GL_INDEX_MODE = 0xC30, + GL_RGBA_MODE = 0xC31, + GL_DOUBLEBUFFER = 0xC32, + GL_STEREO = 0xC33, + GL_RENDER_MODE = 0xC40, + GL_PERSPECTIVE_CORRECTION_HINT = 0xC50, + GL_POINT_SMOOTH_HINT = 0xC51, + GL_LINE_SMOOTH_HINT = 0xC52, + GL_POLYGON_SMOOTH_HINT = 0xC53, + GL_FOG_HINT = 0xC54, + GL_TEXTURE_GEN_S = 0xC60, + GL_TEXTURE_GEN_T = 0xC61, + GL_TEXTURE_GEN_R = 0xC62, + GL_TEXTURE_GEN_Q = 0xC63, + GL_PIXEL_MAP_I_TO_I = 0xC70, + GL_PIXEL_MAP_S_TO_S = 0xC71, + GL_PIXEL_MAP_I_TO_R = 0xC72, + GL_PIXEL_MAP_I_TO_G = 0xC73, + GL_PIXEL_MAP_I_TO_B = 0xC74, + GL_PIXEL_MAP_I_TO_A = 0xC75, + GL_PIXEL_MAP_R_TO_R = 0xC76, + GL_PIXEL_MAP_G_TO_G = 0xC77, + GL_PIXEL_MAP_B_TO_B = 0xC78, + GL_PIXEL_MAP_A_TO_A = 0xC79, + GL_PIXEL_MAP_I_TO_I_SIZE = 0xCB0, + GL_PIXEL_MAP_S_TO_S_SIZE = 0xCB1, + GL_PIXEL_MAP_I_TO_R_SIZE = 0xCB2, + GL_PIXEL_MAP_I_TO_G_SIZE = 0xCB3, + GL_PIXEL_MAP_I_TO_B_SIZE = 0xCB4, + GL_PIXEL_MAP_I_TO_A_SIZE = 0xCB5, + GL_PIXEL_MAP_R_TO_R_SIZE = 0xCB6, + GL_PIXEL_MAP_G_TO_G_SIZE = 0xCB7, + GL_PIXEL_MAP_B_TO_B_SIZE = 0xCB8, + GL_PIXEL_MAP_A_TO_A_SIZE = 0xCB9, + GL_UNPACK_SWAP_BYTES = 0xCF0, + GL_UNPACK_LSB_FIRST = 0xCF1, + GL_UNPACK_ROW_LENGTH = 0xCF2, + GL_UNPACK_SKIP_ROWS = 0xCF3, + GL_UNPACK_SKIP_PIXELS = 0xCF4, + GL_UNPACK_ALIGNMENT = 0xCF5, + GL_PACK_SWAP_BYTES = 0xD00, + GL_PACK_LSB_FIRST = 0xD01, + GL_PACK_ROW_LENGTH = 0xD02, + GL_PACK_SKIP_ROWS = 0xD03, + GL_PACK_SKIP_PIXELS = 0xD04, + GL_PACK_ALIGNMENT = 0xD05, + GL_MAP_COLOR = 0xD10, + GL_MAP_STENCIL = 0xD11, + GL_INDEX_SHIFT = 0xD12, + GL_INDEX_OFFSET = 0xD13, + GL_RED_SCALE = 0xD14, + GL_RED_BIAS = 0xD15, + GL_ZOOM_X = 0xD16, + GL_ZOOM_Y = 0xD17, + GL_GREEN_SCALE = 0xD18, + GL_GREEN_BIAS = 0xD19, + GL_BLUE_SCALE = 0xD1A, + GL_BLUE_BIAS = 0xD1B, + GL_ALPHA_SCALE = 0xD1C, + GL_ALPHA_BIAS = 0xD1D, + GL_DEPTH_SCALE = 0xD1E, + GL_DEPTH_BIAS = 0xD1F, + GL_MAX_EVAL_ORDER = 0xD30, + GL_MAX_LIGHTS = 0xD31, + GL_MAX_CLIP_PLANES = 0xD32, + GL_MAX_TEXTURE_SIZE = 0xD33, + GL_MAX_PIXEL_MAP_TABLE = 0xD34, + GL_MAX_ATTRIB_STACK_DEPTH = 0xD35, + GL_MAX_MODELVIEW_STACK_DEPTH = 0xD36, + GL_MAX_NAME_STACK_DEPTH = 0xD37, + GL_MAX_PROJECTION_STACK_DEPTH = 0xD38, + GL_MAX_TEXTURE_STACK_DEPTH = 0xD39, + GL_MAX_VIEWPORT_DIMS = 0xD3A, + GL_MAX_CLIENT_ATTRIB_STACK_DEPTH = 0xD3B, + GL_SUBPIXEL_BITS = 0xD50, + GL_INDEX_BITS = 0xD51, + GL_RED_BITS = 0xD52, + GL_GREEN_BITS = 0xD53, + GL_BLUE_BITS = 0xD54, + GL_ALPHA_BITS = 0xD55, + GL_DEPTH_BITS = 0xD56, + GL_STENCIL_BITS = 0xD57, + GL_ACCUM_RED_BITS = 0xD58, + GL_ACCUM_GREEN_BITS = 0xD59, + GL_ACCUM_BLUE_BITS = 0xD5A, + GL_ACCUM_ALPHA_BITS = 0xD5B, + GL_NAME_STACK_DEPTH = 0xD70, + GL_AUTO_NORMAL = 0xD80, + GL_MAP1_COLOR_4 = 0xD90, + GL_MAP1_INDEX = 0xD91, + GL_MAP1_NORMAL = 0xD92, + GL_MAP1_TEXTURE_COORD_1 = 0xD93, + GL_MAP1_TEXTURE_COORD_2 = 0xD94, + GL_MAP1_TEXTURE_COORD_3 = 0xD95, + GL_MAP1_TEXTURE_COORD_4 = 0xD96, + GL_MAP1_VERTEX_3 = 0xD97, + GL_MAP1_VERTEX_4 = 0xD98, + GL_MAP2_COLOR_4 = 0xDB0, + GL_MAP2_INDEX = 0xDB1, + GL_MAP2_NORMAL = 0xDB2, + GL_MAP2_TEXTURE_COORD_1 = 0xDB3, + GL_MAP2_TEXTURE_COORD_2 = 0xDB4, + GL_MAP2_TEXTURE_COORD_3 = 0xDB5, + GL_MAP2_TEXTURE_COORD_4 = 0xDB6, + GL_MAP2_VERTEX_3 = 0xDB7, + GL_MAP2_VERTEX_4 = 0xDB8, + GL_MAP1_GRID_DOMAIN = 0xDD0, + GL_MAP1_GRID_SEGMENTS = 0xDD1, + GL_MAP2_GRID_DOMAIN = 0xDD2, + GL_MAP2_GRID_SEGMENTS = 0xDD3, + GL_TEXTURE_1D = 0xDE0, + GL_TEXTURE_2D = 0xDE1, + GL_FEEDBACK_BUFFER_POINTER = 0xDF0, + GL_FEEDBACK_BUFFER_SIZE = 0xDF1, + GL_FEEDBACK_BUFFER_TYPE = 0xDF2, + GL_SELECTION_BUFFER_POINTER = 0xDF3, + GL_SELECTION_BUFFER_SIZE = 0xDF4; + + /** GetTextureParameter */ + public static final int + GL_TEXTURE_WIDTH = 0x1000, + GL_TEXTURE_HEIGHT = 0x1001, + GL_TEXTURE_INTERNAL_FORMAT = 0x1003, + GL_TEXTURE_COMPONENTS = 0x1003, + GL_TEXTURE_BORDER_COLOR = 0x1004, + GL_TEXTURE_BORDER = 0x1005; + + /** HintMode */ + public static final int + GL_DONT_CARE = 0x1100, + GL_FASTEST = 0x1101, + GL_NICEST = 0x1102; + + /** LightName */ + public static final int + GL_LIGHT0 = 0x4000, + GL_LIGHT1 = 0x4001, + GL_LIGHT2 = 0x4002, + GL_LIGHT3 = 0x4003, + GL_LIGHT4 = 0x4004, + GL_LIGHT5 = 0x4005, + GL_LIGHT6 = 0x4006, + GL_LIGHT7 = 0x4007; + + /** LightParameter */ + public static final int + GL_AMBIENT = 0x1200, + GL_DIFFUSE = 0x1201, + GL_SPECULAR = 0x1202, + GL_POSITION = 0x1203, + GL_SPOT_DIRECTION = 0x1204, + GL_SPOT_EXPONENT = 0x1205, + GL_SPOT_CUTOFF = 0x1206, + GL_CONSTANT_ATTENUATION = 0x1207, + GL_LINEAR_ATTENUATION = 0x1208, + GL_QUADRATIC_ATTENUATION = 0x1209; + + /** ListMode */ + public static final int + GL_COMPILE = 0x1300, + GL_COMPILE_AND_EXECUTE = 0x1301; + + /** LogicOp */ + public static final int + GL_CLEAR = 0x1500, + GL_AND = 0x1501, + GL_AND_REVERSE = 0x1502, + GL_COPY = 0x1503, + GL_AND_INVERTED = 0x1504, + GL_NOOP = 0x1505, + GL_XOR = 0x1506, + GL_OR = 0x1507, + GL_NOR = 0x1508, + GL_EQUIV = 0x1509, + GL_INVERT = 0x150A, + GL_OR_REVERSE = 0x150B, + GL_COPY_INVERTED = 0x150C, + GL_OR_INVERTED = 0x150D, + GL_NAND = 0x150E, + GL_SET = 0x150F; + + /** MaterialParameter */ + public static final int + GL_EMISSION = 0x1600, + GL_SHININESS = 0x1601, + GL_AMBIENT_AND_DIFFUSE = 0x1602, + GL_COLOR_INDEXES = 0x1603; + + /** MatrixMode */ + public static final int + GL_MODELVIEW = 0x1700, + GL_PROJECTION = 0x1701, + GL_TEXTURE = 0x1702; + + /** PixelCopyType */ + public static final int + GL_COLOR = 0x1800, + GL_DEPTH = 0x1801, + GL_STENCIL = 0x1802; + + /** PixelFormat */ + public static final int + GL_COLOR_INDEX = 0x1900, + GL_STENCIL_INDEX = 0x1901, + GL_DEPTH_COMPONENT = 0x1902, + GL_RED = 0x1903, + GL_GREEN = 0x1904, + GL_BLUE = 0x1905, + GL_ALPHA = 0x1906, + GL_RGB = 0x1907, + GL_RGBA = 0x1908, + GL_LUMINANCE = 0x1909, + GL_LUMINANCE_ALPHA = 0x190A; + + /** PixelType */ + public static final int GL_BITMAP = 0x1A00; + + /** PolygonMode */ + public static final int + GL_POINT = 0x1B00, + GL_LINE = 0x1B01, + GL_FILL = 0x1B02; + + /** RenderingMode */ + public static final int + GL_RENDER = 0x1C00, + GL_FEEDBACK = 0x1C01, + GL_SELECT = 0x1C02; + + /** ShadingModel */ + public static final int + GL_FLAT = 0x1D00, + GL_SMOOTH = 0x1D01; + + /** StencilOp */ + public static final int + GL_KEEP = 0x1E00, + GL_REPLACE = 0x1E01, + GL_INCR = 0x1E02, + GL_DECR = 0x1E03; + + /** StringName */ + public static final int + GL_VENDOR = 0x1F00, + GL_RENDERER = 0x1F01, + GL_VERSION = 0x1F02, + GL_EXTENSIONS = 0x1F03; + + /** TextureCoordName */ + public static final int + GL_S = 0x2000, + GL_T = 0x2001, + GL_R = 0x2002, + GL_Q = 0x2003; + + /** TextureEnvMode */ + public static final int + GL_MODULATE = 0x2100, + GL_DECAL = 0x2101; + + /** TextureEnvParameter */ + public static final int + GL_TEXTURE_ENV_MODE = 0x2200, + GL_TEXTURE_ENV_COLOR = 0x2201; + + /** TextureEnvTarget */ + public static final int GL_TEXTURE_ENV = 0x2300; + + /** TextureGenMode */ + public static final int + GL_EYE_LINEAR = 0x2400, + GL_OBJECT_LINEAR = 0x2401, + GL_SPHERE_MAP = 0x2402; + + /** TextureGenParameter */ + public static final int + GL_TEXTURE_GEN_MODE = 0x2500, + GL_OBJECT_PLANE = 0x2501, + GL_EYE_PLANE = 0x2502; + + /** TextureMagFilter */ + public static final int + GL_NEAREST = 0x2600, + GL_LINEAR = 0x2601; + + /** TextureMinFilter */ + public static final int + GL_NEAREST_MIPMAP_NEAREST = 0x2700, + GL_LINEAR_MIPMAP_NEAREST = 0x2701, + GL_NEAREST_MIPMAP_LINEAR = 0x2702, + GL_LINEAR_MIPMAP_LINEAR = 0x2703; + + /** TextureParameterName */ + public static final int + GL_TEXTURE_MAG_FILTER = 0x2800, + GL_TEXTURE_MIN_FILTER = 0x2801, + GL_TEXTURE_WRAP_S = 0x2802, + GL_TEXTURE_WRAP_T = 0x2803; + + /** TextureWrapMode */ + public static final int + GL_CLAMP = 0x2900, + GL_REPEAT = 0x2901; + + /** ClientAttribMask */ + public static final int + GL_CLIENT_PIXEL_STORE_BIT = 0x1, + GL_CLIENT_VERTEX_ARRAY_BIT = 0x2, + GL_CLIENT_ALL_ATTRIB_BITS = 0xFFFFFFFF; + + /** polygon_offset */ + public static final int + GL_POLYGON_OFFSET_FACTOR = 0x8038, + GL_POLYGON_OFFSET_UNITS = 0x2A00, + GL_POLYGON_OFFSET_POINT = 0x2A01, + GL_POLYGON_OFFSET_LINE = 0x2A02, + GL_POLYGON_OFFSET_FILL = 0x8037; + + /** texture */ + public static final int + GL_ALPHA4 = 0x803B, + GL_ALPHA8 = 0x803C, + GL_ALPHA12 = 0x803D, + GL_ALPHA16 = 0x803E, + GL_LUMINANCE4 = 0x803F, + GL_LUMINANCE8 = 0x8040, + GL_LUMINANCE12 = 0x8041, + GL_LUMINANCE16 = 0x8042, + GL_LUMINANCE4_ALPHA4 = 0x8043, + GL_LUMINANCE6_ALPHA2 = 0x8044, + GL_LUMINANCE8_ALPHA8 = 0x8045, + GL_LUMINANCE12_ALPHA4 = 0x8046, + GL_LUMINANCE12_ALPHA12 = 0x8047, + GL_LUMINANCE16_ALPHA16 = 0x8048, + GL_INTENSITY = 0x8049, + GL_INTENSITY4 = 0x804A, + GL_INTENSITY8 = 0x804B, + GL_INTENSITY12 = 0x804C, + GL_INTENSITY16 = 0x804D, + GL_R3_G3_B2 = 0x2A10, + GL_RGB4 = 0x804F, + GL_RGB5 = 0x8050, + GL_RGB8 = 0x8051, + GL_RGB10 = 0x8052, + GL_RGB12 = 0x8053, + GL_RGB16 = 0x8054, + GL_RGBA2 = 0x8055, + GL_RGBA4 = 0x8056, + GL_RGB5_A1 = 0x8057, + GL_RGBA8 = 0x8058, + GL_RGB10_A2 = 0x8059, + GL_RGBA12 = 0x805A, + GL_RGBA16 = 0x805B, + GL_TEXTURE_RED_SIZE = 0x805C, + GL_TEXTURE_GREEN_SIZE = 0x805D, + GL_TEXTURE_BLUE_SIZE = 0x805E, + GL_TEXTURE_ALPHA_SIZE = 0x805F, + GL_TEXTURE_LUMINANCE_SIZE = 0x8060, + GL_TEXTURE_INTENSITY_SIZE = 0x8061, + GL_PROXY_TEXTURE_1D = 0x8063, + GL_PROXY_TEXTURE_2D = 0x8064; + + /** texture_object */ + public static final int + GL_TEXTURE_PRIORITY = 0x8066, + GL_TEXTURE_RESIDENT = 0x8067, + GL_TEXTURE_BINDING_1D = 0x8068, + GL_TEXTURE_BINDING_2D = 0x8069; + + /** vertex_array */ + public static final int + GL_VERTEX_ARRAY = 0x8074, + GL_NORMAL_ARRAY = 0x8075, + GL_COLOR_ARRAY = 0x8076, + GL_INDEX_ARRAY = 0x8077, + GL_TEXTURE_COORD_ARRAY = 0x8078, + GL_EDGE_FLAG_ARRAY = 0x8079, + GL_VERTEX_ARRAY_SIZE = 0x807A, + GL_VERTEX_ARRAY_TYPE = 0x807B, + GL_VERTEX_ARRAY_STRIDE = 0x807C, + GL_NORMAL_ARRAY_TYPE = 0x807E, + GL_NORMAL_ARRAY_STRIDE = 0x807F, + GL_COLOR_ARRAY_SIZE = 0x8081, + GL_COLOR_ARRAY_TYPE = 0x8082, + GL_COLOR_ARRAY_STRIDE = 0x8083, + GL_INDEX_ARRAY_TYPE = 0x8085, + GL_INDEX_ARRAY_STRIDE = 0x8086, + GL_TEXTURE_COORD_ARRAY_SIZE = 0x8088, + GL_TEXTURE_COORD_ARRAY_TYPE = 0x8089, + GL_TEXTURE_COORD_ARRAY_STRIDE = 0x808A, + GL_EDGE_FLAG_ARRAY_STRIDE = 0x808C, + GL_VERTEX_ARRAY_POINTER = 0x808E, + GL_NORMAL_ARRAY_POINTER = 0x808F, + GL_COLOR_ARRAY_POINTER = 0x8090, + GL_INDEX_ARRAY_POINTER = 0x8091, + GL_TEXTURE_COORD_ARRAY_POINTER = 0x8092, + GL_EDGE_FLAG_ARRAY_POINTER = 0x8093, + GL_V2F = 0x2A20, + GL_V3F = 0x2A21, + GL_C4UB_V2F = 0x2A22, + GL_C4UB_V3F = 0x2A23, + GL_C3F_V3F = 0x2A24, + GL_N3F_V3F = 0x2A25, + GL_C4F_N3F_V3F = 0x2A26, + GL_T2F_V3F = 0x2A27, + GL_T4F_V4F = 0x2A28, + GL_T2F_C4UB_V3F = 0x2A29, + GL_T2F_C3F_V3F = 0x2A2A, + GL_T2F_N3F_V3F = 0x2A2B, + GL_T2F_C4F_N3F_V3F = 0x2A2C, + GL_T4F_C4F_N3F_V4F = 0x2A2D; + + protected GL11() { + throw new UnsupportedOperationException(); + } + + // --- [ glEnable ] --- + + /** + * Enables the specified OpenGL state. + * + * @param target the OpenGL state to enable + * + * @see Reference Page + */ + public static void glEnable(@NativeType("GLenum") int target) { + GL11C.glEnable(target); + } + + // --- [ glDisable ] --- + + /** + * Disables the specified OpenGL state. + * + * @param target the OpenGL state to disable + * + * @see Reference Page + */ + public static void glDisable(@NativeType("GLenum") int target) { + GL11C.glDisable(target); + } + + // --- [ glAccum ] --- + + /** + * Each portion of a pixel in the accumulation buffer consists of four values: one for each of R, G, B, and A. The accumulation buffer is controlled + * exclusively through the use of this method (except for clearing it). + * + * @param op a symbolic constant indicating an accumulation buffer operation + * @param value a floating-point value to be used in that operation. One of:
    {@link #GL_ACCUM ACCUM}{@link #GL_LOAD LOAD}{@link #GL_RETURN RETURN}{@link #GL_MULT MULT}{@link #GL_ADD ADD}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glAccum(@NativeType("GLenum") int op, @NativeType("GLfloat") float value); + + // --- [ glAlphaFunc ] --- + + /** + * The alpha test discards a fragment conditionally based on the outcome of a comparison between the incoming fragment’s alpha value and a constant value. + * The comparison is enabled or disabled with the generic {@link #glEnable Enable} and {@link #glDisable Disable} commands using the symbolic constant {@link #GL_ALPHA_TEST ALPHA_TEST}. + * When disabled, it is as if the comparison always passes. The test is controlled with this method. + * + * @param func a symbolic constant indicating the alpha test function. One of:
    {@link #GL_NEVER NEVER}{@link #GL_ALWAYS ALWAYS}{@link #GL_LESS LESS}{@link #GL_LEQUAL LEQUAL}{@link #GL_EQUAL EQUAL}{@link #GL_GEQUAL GEQUAL}{@link #GL_GREATER GREATER}{@link #GL_NOTEQUAL NOTEQUAL}
    + * @param ref a reference value clamped to the range [0, 1]. When performing the alpha test, the GL will convert the reference value to the same representation as the fragment's alpha value (floating-point or fixed-point). + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glAlphaFunc(@NativeType("GLenum") int func, @NativeType("GLfloat") float ref); + + // --- [ glAreTexturesResident ] --- + + /** + * Unsafe version of: {@link #glAreTexturesResident AreTexturesResident} + * + * @param n the number of texture objects in {@code textures} + */ + public static native boolean nglAreTexturesResident(int n, long textures, long residences); + + /** + * Returns {@link #GL_TRUE TRUE} if all of the texture objects named in textures are resident, or if the implementation does not distinguish a working set. If + * at least one of the texture objects named in textures is not resident, then {@link #GL_FALSE FALSE} is returned, and the residence of each texture object is + * returned in residences. Otherwise the contents of residences are not changed. + * + * @param textures an array of texture objects + * @param residences returns the residences of each texture object + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("GLboolean") + public static boolean glAreTexturesResident(@NativeType("GLuint const *") IntBuffer textures, @NativeType("GLboolean *") ByteBuffer residences) { + if (CHECKS) { + check(residences, textures.remaining()); + } + return nglAreTexturesResident(textures.remaining(), memAddress(textures), memAddress(residences)); + } + + /** + * Returns {@link #GL_TRUE TRUE} if all of the texture objects named in textures are resident, or if the implementation does not distinguish a working set. If + * at least one of the texture objects named in textures is not resident, then {@link #GL_FALSE FALSE} is returned, and the residence of each texture object is + * returned in residences. Otherwise the contents of residences are not changed. + * + * @param residences returns the residences of each texture object + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("GLboolean") + public static boolean glAreTexturesResident(@NativeType("GLuint const *") int texture, @NativeType("GLboolean *") ByteBuffer residences) { + if (CHECKS) { + check(residences, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer textures = stack.ints(texture); + return nglAreTexturesResident(1, memAddress(textures), memAddress(residences)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glArrayElement ] --- + + /** + * Transfers the ith element of every enabled, non-instanced array, and the first element of every enabled, instanced array to the GL. + * + * @param i the element to transfer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glArrayElement(@NativeType("GLint") int i); + + // --- [ glBegin ] --- + + /** + * Begins the definition of vertex attributes of a sequence of primitives to be transferred to the GL. + * + * @param mode the primitive type being defined. One of:
    {@link #GL_POINTS POINTS}{@link #GL_LINE_STRIP LINE_STRIP}{@link #GL_LINE_LOOP LINE_LOOP}{@link #GL_LINES LINES}{@link #GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link #GL_TRIANGLE_FAN TRIANGLE_FAN}{@link #GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link #GL_POLYGON POLYGON}{@link #GL_QUADS QUADS}
    {@link #GL_QUAD_STRIP QUAD_STRIP}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glBegin(@NativeType("GLenum") int mode); + + // --- [ glBindTexture ] --- + + /** + * Binds the a texture to a texture target. + * + *

    While a texture object is bound, GL operations on the target to which it is bound affect the bound object, and queries of the target to which it is + * bound return state from the bound object. If texture mapping of the dimensionality of the target to which a texture object is bound is enabled, the + * state of the bound texture object directs the texturing operation.

    + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param texture the texture object to bind + * + * @see Reference Page + */ + public static void glBindTexture(@NativeType("GLenum") int target, @NativeType("GLuint") int texture) { + GL11C.glBindTexture(target, texture); + } + + // --- [ glBitmap ] --- + + /** Unsafe version of: {@link #glBitmap Bitmap} */ + public static native void nglBitmap(int w, int h, float xOrig, float yOrig, float xInc, float yInc, long data); + + /** + * Sents a bitmap to the GL. Bitmaps are rectangles of zeros and ones specifying a particular pattern of fragments to be produced. Each of these fragments + * has the same associated data. These data are those associated with the current raster position. + * + * @param w the bitmap width + * @param h the bitmap width + * @param xOrig the bitmap origin x coordinate + * @param yOrig the bitmap origin y coordinate + * @param xInc the x increment added to the raster position + * @param yInc the y increment added to the raster position + * @param data the buffer containing the bitmap data. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glBitmap(@NativeType("GLsizei") int w, @NativeType("GLsizei") int h, @NativeType("GLfloat") float xOrig, @NativeType("GLfloat") float yOrig, @NativeType("GLfloat") float xInc, @NativeType("GLfloat") float yInc, @Nullable @NativeType("GLubyte const *") ByteBuffer data) { + if (CHECKS) { + checkSafe(data, ((w + 7) >> 3) * h); + } + nglBitmap(w, h, xOrig, yOrig, xInc, yInc, memAddressSafe(data)); + } + + /** + * Sents a bitmap to the GL. Bitmaps are rectangles of zeros and ones specifying a particular pattern of fragments to be produced. Each of these fragments + * has the same associated data. These data are those associated with the current raster position. + * + * @param w the bitmap width + * @param h the bitmap width + * @param xOrig the bitmap origin x coordinate + * @param yOrig the bitmap origin y coordinate + * @param xInc the x increment added to the raster position + * @param yInc the y increment added to the raster position + * @param data the buffer containing the bitmap data. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glBitmap(@NativeType("GLsizei") int w, @NativeType("GLsizei") int h, @NativeType("GLfloat") float xOrig, @NativeType("GLfloat") float yOrig, @NativeType("GLfloat") float xInc, @NativeType("GLfloat") float yInc, @NativeType("GLubyte const *") long data) { + nglBitmap(w, h, xOrig, yOrig, xInc, yInc, data); + } + + // --- [ glBlendFunc ] --- + + /** + * Specifies the weighting factors used by the blend equation, for both RGB and alpha functions and for all draw buffers. + * + * @param sfactor the source weighting factor. One of:
    {@link GL11C#GL_ZERO ZERO}{@link GL11C#GL_ONE ONE}{@link GL11C#GL_SRC_COLOR SRC_COLOR}{@link GL11C#GL_ONE_MINUS_SRC_COLOR ONE_MINUS_SRC_COLOR}{@link GL11C#GL_DST_COLOR DST_COLOR}
    {@link GL11C#GL_ONE_MINUS_DST_COLOR ONE_MINUS_DST_COLOR}{@link GL11C#GL_SRC_ALPHA SRC_ALPHA}{@link GL11C#GL_ONE_MINUS_SRC_ALPHA ONE_MINUS_SRC_ALPHA}{@link GL11C#GL_DST_ALPHA DST_ALPHA}{@link GL11C#GL_ONE_MINUS_DST_ALPHA ONE_MINUS_DST_ALPHA}
    {@link GL14#GL_CONSTANT_COLOR CONSTANT_COLOR}{@link GL14#GL_ONE_MINUS_CONSTANT_COLOR ONE_MINUS_CONSTANT_COLOR}{@link GL14#GL_CONSTANT_ALPHA CONSTANT_ALPHA}{@link GL14#GL_ONE_MINUS_CONSTANT_ALPHA ONE_MINUS_CONSTANT_ALPHA}{@link GL11C#GL_SRC_ALPHA_SATURATE SRC_ALPHA_SATURATE}
    {@link GL33#GL_SRC1_COLOR SRC1_COLOR}{@link GL33#GL_ONE_MINUS_SRC1_COLOR ONE_MINUS_SRC1_COLOR}{@link GL15#GL_SRC1_ALPHA SRC1_ALPHA}{@link GL33#GL_ONE_MINUS_SRC1_ALPHA ONE_MINUS_SRC1_ALPHA}
    + * @param dfactor the destination weighting factor + * + * @see Reference Page + */ + public static void glBlendFunc(@NativeType("GLenum") int sfactor, @NativeType("GLenum") int dfactor) { + GL11C.glBlendFunc(sfactor, dfactor); + } + + // --- [ glCallList ] --- + + /** + * Executes a display list. Causes the commands saved in the display list to be executed, in order, just as if they were issued without using a display list. + * + * @param list the index of the display list to be called + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glCallList(@NativeType("GLuint") int list); + + // --- [ glCallLists ] --- + + /** + * Unsafe version of: {@link #glCallLists CallLists} + * + * @param n the number of display lists to be called + * @param type the data type of each element in {@code lists}. One of:
    {@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_SHORT SHORT}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_INT INT}{@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_FLOAT FLOAT}{@link #GL_2_BYTES 2_BYTES}{@link #GL_3_BYTES 3_BYTES}{@link #GL_4_BYTES 4_BYTES}
    + */ + public static native void nglCallLists(int n, int type, long lists); + + /** + * Provides an efficient means for executing a number of display lists. + * + * @param type the data type of each element in {@code lists}. One of:
    {@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_SHORT SHORT}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_INT INT}{@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_FLOAT FLOAT}{@link #GL_2_BYTES 2_BYTES}{@link #GL_3_BYTES 3_BYTES}{@link #GL_4_BYTES 4_BYTES}
    + * @param lists an array of offsets. Each offset is added to the display list base to obtain the display list number. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glCallLists(@NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer lists) { + nglCallLists(lists.remaining() / GLChecks.typeToBytes(type), type, memAddress(lists)); + } + + /** + * Provides an efficient means for executing a number of display lists. + * + * @param lists an array of offsets. Each offset is added to the display list base to obtain the display list number. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glCallLists(@NativeType("void const *") ByteBuffer lists) { + nglCallLists(lists.remaining(), GL11.GL_UNSIGNED_BYTE, memAddress(lists)); + } + + /** + * Provides an efficient means for executing a number of display lists. + * + * @param lists an array of offsets. Each offset is added to the display list base to obtain the display list number. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glCallLists(@NativeType("void const *") ShortBuffer lists) { + nglCallLists(lists.remaining(), GL11.GL_UNSIGNED_SHORT, memAddress(lists)); + } + + /** + * Provides an efficient means for executing a number of display lists. + * + * @param lists an array of offsets. Each offset is added to the display list base to obtain the display list number. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glCallLists(@NativeType("void const *") IntBuffer lists) { + nglCallLists(lists.remaining(), GL11.GL_UNSIGNED_INT, memAddress(lists)); + } + + // --- [ glClear ] --- + + /** + * Sets portions of every pixel in a particular buffer to the same value. The value to which each buffer is cleared depends on the setting of the clear + * value for that buffer. + * + * @param mask Zero or the bitwise OR of one or more values indicating which buffers are to be cleared. One or more of:
    {@link GL11C#GL_COLOR_BUFFER_BIT COLOR_BUFFER_BIT}{@link GL11C#GL_DEPTH_BUFFER_BIT DEPTH_BUFFER_BIT}{@link GL11C#GL_STENCIL_BUFFER_BIT STENCIL_BUFFER_BIT}
    + * + * @see Reference Page + */ + public static void glClear(@NativeType("GLbitfield") int mask) { + GL11C.glClear(mask); + } + + // --- [ glClearAccum ] --- + + /** + * Sets the clear values for the accumulation buffer. These values are clamped to the range [-1,1] when they are specified. + * + * @param red the value to which to clear the R values of the accumulation buffer + * @param green the value to which to clear the G values of the accumulation buffer + * @param blue the value to which to clear the B values of the accumulation buffer + * @param alpha the value to which to clear the A values of the accumulation buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glClearAccum(@NativeType("GLfloat") float red, @NativeType("GLfloat") float green, @NativeType("GLfloat") float blue, @NativeType("GLfloat") float alpha); + + // --- [ glClearColor ] --- + + /** + * Sets the clear value for fixed-point and floating-point color buffers in RGBA mode. The specified components are stored as floating-point values. + * + * @param red the value to which to clear the R channel of the color buffer + * @param green the value to which to clear the G channel of the color buffer + * @param blue the value to which to clear the B channel of the color buffer + * @param alpha the value to which to clear the A channel of the color buffer + * + * @see Reference Page + */ + public static void glClearColor(@NativeType("GLfloat") float red, @NativeType("GLfloat") float green, @NativeType("GLfloat") float blue, @NativeType("GLfloat") float alpha) { + GL11C.glClearColor(red, green, blue, alpha); + } + + // --- [ glClearDepth ] --- + + /** + * Sets the depth value used when clearing the depth buffer. When clearing a fixedpoint depth buffer, {@code depth} is clamped to the range [0,1] and + * converted to fixed-point. No conversion is applied when clearing a floating-point depth buffer. + * + * @param depth the value to which to clear the depth buffer + * + * @see Reference Page + */ + public static void glClearDepth(@NativeType("GLdouble") double depth) { + GL11C.glClearDepth(depth); + } + + // --- [ glClearIndex ] --- + + /** + * sets the clear color index. index is converted to a fixed-point value with unspecified precision to the left of the binary point; the integer part of + * this value is then masked with 2m – 1, where {@code m} is the number of bits in a color index value stored in the + * framebuffer. + * + * @param index the value to which to clear the color buffer in color index mode + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glClearIndex(@NativeType("GLfloat") float index); + + // --- [ glClearStencil ] --- + + /** + * Sets the value to which to clear the stencil buffer. {@code s} is masked to the number of bitplanes in the stencil buffer. + * + * @param s the value to which to clear the stencil buffer + * + * @see Reference Page + */ + public static void glClearStencil(@NativeType("GLint") int s) { + GL11C.glClearStencil(s); + } + + // --- [ glClipPlane ] --- + + /** Unsafe version of: {@link #glClipPlane ClipPlane} */ + public static native void nglClipPlane(int plane, long equation); + + /** + * Specifies a client-defined clip plane. + * + *

    The value of the first argument, {@code plane}, is a symbolic constant, CLIP_PLANEi, where i is an integer between 0 and n – 1, indicating one of + * n client-defined clip planes. {@code equation} is an array of four double-precision floating-point values. These are the coefficients of a plane + * equation in object coordinates: p1, p2, p3, and p4 (in that order).

    + * + * @param plane the clip plane to define + * @param equation the clip plane coefficients + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glClipPlane(@NativeType("GLenum") int plane, @NativeType("GLdouble const *") DoubleBuffer equation) { + if (CHECKS) { + check(equation, 4); + } + nglClipPlane(plane, memAddress(equation)); + } + + // --- [ glColor3b ] --- + + /** + * Sets the R, G, and B components of the current color. The alpha component is set to 1.0. + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor3b(@NativeType("GLbyte") byte red, @NativeType("GLbyte") byte green, @NativeType("GLbyte") byte blue); + + // --- [ glColor3s ] --- + + /** + * Short version of {@link #glColor3b Color3b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor3s(@NativeType("GLshort") short red, @NativeType("GLshort") short green, @NativeType("GLshort") short blue); + + // --- [ glColor3i ] --- + + /** + * Integer version of {@link #glColor3b Color3b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor3i(@NativeType("GLint") int red, @NativeType("GLint") int green, @NativeType("GLint") int blue); + + // --- [ glColor3f ] --- + + /** + * Float version of {@link #glColor3b Color3b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor3f(@NativeType("GLfloat") float red, @NativeType("GLfloat") float green, @NativeType("GLfloat") float blue); + + // --- [ glColor3d ] --- + + /** + * Double version of {@link #glColor3b Color3b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor3d(@NativeType("GLdouble") double red, @NativeType("GLdouble") double green, @NativeType("GLdouble") double blue); + + // --- [ glColor3ub ] --- + + /** + * Unsigned version of {@link #glColor3b Color3b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor3ub(@NativeType("GLubyte") byte red, @NativeType("GLubyte") byte green, @NativeType("GLubyte") byte blue); + + // --- [ glColor3us ] --- + + /** + * Unsigned short version of {@link #glColor3b Color3b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor3us(@NativeType("GLushort") short red, @NativeType("GLushort") short green, @NativeType("GLushort") short blue); + + // --- [ glColor3ui ] --- + + /** + * Unsigned int version of {@link #glColor3b Color3b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor3ui(@NativeType("GLint") int red, @NativeType("GLint") int green, @NativeType("GLint") int blue); + + // --- [ glColor3bv ] --- + + /** Unsafe version of: {@link #glColor3bv Color3bv} */ + public static native void nglColor3bv(long v); + + /** + * Byte pointer version of {@link #glColor3b Color3b}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3bv(@NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglColor3bv(memAddress(v)); + } + + // --- [ glColor3sv ] --- + + /** Unsafe version of: {@link #glColor3sv Color3sv} */ + public static native void nglColor3sv(long v); + + /** + * Pointer version of {@link #glColor3s Color3s}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3sv(@NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglColor3sv(memAddress(v)); + } + + // --- [ glColor3iv ] --- + + /** Unsafe version of: {@link #glColor3iv Color3iv} */ + public static native void nglColor3iv(long v); + + /** + * Pointer version of {@link #glColor3i Color3i}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3iv(@NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglColor3iv(memAddress(v)); + } + + // --- [ glColor3fv ] --- + + /** Unsafe version of: {@link #glColor3fv Color3fv} */ + public static native void nglColor3fv(long v); + + /** + * Pointer version of {@link #glColor3f Color3f}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3fv(@NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglColor3fv(memAddress(v)); + } + + // --- [ glColor3dv ] --- + + /** Unsafe version of: {@link #glColor3dv Color3dv} */ + public static native void nglColor3dv(long v); + + /** + * Pointer version of {@link #glColor3d Color3d}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3dv(@NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglColor3dv(memAddress(v)); + } + + // --- [ glColor3ubv ] --- + + /** Unsafe version of: {@link #glColor3ubv Color3ubv} */ + public static native void nglColor3ubv(long v); + + /** + * Pointer version of {@link #glColor3ub Color3ub}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3ubv(@NativeType("GLubyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglColor3ubv(memAddress(v)); + } + + // --- [ glColor3usv ] --- + + /** Unsafe version of: {@link #glColor3usv Color3usv} */ + public static native void nglColor3usv(long v); + + /** + * Pointer version of {@link #glColor3us Color3us}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3usv(@NativeType("GLushort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglColor3usv(memAddress(v)); + } + + // --- [ glColor3uiv ] --- + + /** Unsafe version of: {@link #glColor3uiv Color3uiv} */ + public static native void nglColor3uiv(long v); + + /** + * Pointer version of {@link #glColor3ui Color3ui}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3uiv(@NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglColor3uiv(memAddress(v)); + } + + // --- [ glColor4b ] --- + + /** + * Sets the current color. + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * @param alpha the alpha component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor4b(@NativeType("GLbyte") byte red, @NativeType("GLbyte") byte green, @NativeType("GLbyte") byte blue, @NativeType("GLbyte") byte alpha); + + // --- [ glColor4s ] --- + + /** + * Short version of {@link #glColor4b Color4b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * @param alpha the alpha component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor4s(@NativeType("GLshort") short red, @NativeType("GLshort") short green, @NativeType("GLshort") short blue, @NativeType("GLshort") short alpha); + + // --- [ glColor4i ] --- + + /** + * Integer version of {@link #glColor4b Color4b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * @param alpha the alpha component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor4i(@NativeType("GLint") int red, @NativeType("GLint") int green, @NativeType("GLint") int blue, @NativeType("GLint") int alpha); + + // --- [ glColor4f ] --- + + /** + * Float version of {@link #glColor4b Color4b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * @param alpha the alpha component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor4f(@NativeType("GLfloat") float red, @NativeType("GLfloat") float green, @NativeType("GLfloat") float blue, @NativeType("GLfloat") float alpha); + + // --- [ glColor4d ] --- + + /** + * Double version of {@link #glColor4b Color4b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * @param alpha the alpha component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor4d(@NativeType("GLdouble") double red, @NativeType("GLdouble") double green, @NativeType("GLdouble") double blue, @NativeType("GLdouble") double alpha); + + // --- [ glColor4ub ] --- + + /** + * Unsigned version of {@link #glColor4b Color4b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * @param alpha the alpha component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor4ub(@NativeType("GLubyte") byte red, @NativeType("GLubyte") byte green, @NativeType("GLubyte") byte blue, @NativeType("GLubyte") byte alpha); + + // --- [ glColor4us ] --- + + /** + * Unsigned short version of {@link #glColor4b Color4b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * @param alpha the alpha component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor4us(@NativeType("GLushort") short red, @NativeType("GLushort") short green, @NativeType("GLushort") short blue, @NativeType("GLushort") short alpha); + + // --- [ glColor4ui ] --- + + /** + * Unsigned int version of {@link #glColor4b Color4b} + * + * @param red the red component of the current color + * @param green the green component of the current color + * @param blue the blue component of the current color + * @param alpha the alpha component of the current color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColor4ui(@NativeType("GLint") int red, @NativeType("GLint") int green, @NativeType("GLint") int blue, @NativeType("GLint") int alpha); + + // --- [ glColor4bv ] --- + + /** Unsafe version of: {@link #glColor4bv Color4bv} */ + public static native void nglColor4bv(long v); + + /** + * Pointer version of {@link #glColor4b Color4b}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4bv(@NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglColor4bv(memAddress(v)); + } + + // --- [ glColor4sv ] --- + + /** Unsafe version of: {@link #glColor4sv Color4sv} */ + public static native void nglColor4sv(long v); + + /** + * Pointer version of {@link #glColor4s Color4s}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4sv(@NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglColor4sv(memAddress(v)); + } + + // --- [ glColor4iv ] --- + + /** Unsafe version of: {@link #glColor4iv Color4iv} */ + public static native void nglColor4iv(long v); + + /** + * Pointer version of {@link #glColor4i Color4i}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4iv(@NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglColor4iv(memAddress(v)); + } + + // --- [ glColor4fv ] --- + + /** Unsafe version of: {@link #glColor4fv Color4fv} */ + public static native void nglColor4fv(long v); + + /** + * Pointer version of {@link #glColor4f Color4f}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4fv(@NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglColor4fv(memAddress(v)); + } + + // --- [ glColor4dv ] --- + + /** Unsafe version of: {@link #glColor4dv Color4dv} */ + public static native void nglColor4dv(long v); + + /** + * Pointer version of {@link #glColor4d Color4d}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4dv(@NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglColor4dv(memAddress(v)); + } + + // --- [ glColor4ubv ] --- + + /** Unsafe version of: {@link #glColor4ubv Color4ubv} */ + public static native void nglColor4ubv(long v); + + /** + * Pointer version of {@link #glColor4ub Color4ub}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4ubv(@NativeType("GLubyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglColor4ubv(memAddress(v)); + } + + // --- [ glColor4usv ] --- + + /** Unsafe version of: {@link #glColor4usv Color4usv} */ + public static native void nglColor4usv(long v); + + /** + * Pointer version of {@link #glColor4us Color4us}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4usv(@NativeType("GLushort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglColor4usv(memAddress(v)); + } + + // --- [ glColor4uiv ] --- + + /** Unsafe version of: {@link #glColor4uiv Color4uiv} */ + public static native void nglColor4uiv(long v); + + /** + * Pointer version of {@link #glColor4ui Color4ui}. + * + * @param v the color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4uiv(@NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglColor4uiv(memAddress(v)); + } + + // --- [ glColorMask ] --- + + /** + * Masks the writing of R, G, B and A values to all draw buffers. In the initial state, all color values are enabled for writing for all draw buffers. + * + * @param red whether R values are written or not + * @param green whether G values are written or not + * @param blue whether B values are written or not + * @param alpha whether A values are written or not + * + * @see Reference Page + */ + public static void glColorMask(@NativeType("GLboolean") boolean red, @NativeType("GLboolean") boolean green, @NativeType("GLboolean") boolean blue, @NativeType("GLboolean") boolean alpha) { + GL11C.glColorMask(red, green, blue, alpha); + } + + // --- [ glColorMaterial ] --- + + /** + * It is possible to attach one or more material properties to the current color, so that they continuously track its component values. This behavior is + * enabled and disabled by calling {@link #glEnable Enable} or {@link #glDisable Disable} with the symbolic value {@link #GL_COLOR_MATERIAL COLOR_MATERIAL}. This function controls which + * of these modes is selected. + * + * @param face specifies which material face is affected by the current color. One of:
    {@link #GL_FRONT FRONT}{@link #GL_BACK BACK}{@link #GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param mode specifies which material property or properties track the current color. One of:
    {@link #GL_EMISSION EMISSION}{@link #GL_AMBIENT AMBIENT}{@link #GL_DIFFUSE DIFFUSE}{@link #GL_SPECULAR SPECULAR}{@link #GL_AMBIENT_AND_DIFFUSE AMBIENT_AND_DIFFUSE}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColorMaterial(@NativeType("GLenum") int face, @NativeType("GLenum") int mode); + + // --- [ glColorPointer ] --- + + /** Unsafe version of: {@link #glColorPointer ColorPointer} */ + public static native void nglColorPointer(int size, int type, int stride, long pointer); + + /** + * Specifies the location and organization of a color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. One of:
    34{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_SHORT SHORT}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_INT INT}{@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the color array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColorPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglColorPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. One of:
    34{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_SHORT SHORT}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_INT INT}{@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the color array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColorPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglColorPointer(size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. One of:
    34{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_SHORT SHORT}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_INT INT}{@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the color array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColorPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglColorPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. One of:
    34{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_SHORT SHORT}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_INT INT}{@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the color array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColorPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglColorPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. One of:
    34{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_SHORT SHORT}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_INT INT}{@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the color array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColorPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglColorPointer(size, type, stride, memAddress(pointer)); + } + + // --- [ glCopyPixels ] --- + + /** + * Transfers a rectangle of pixel values from one region of the read framebuffer to another in the draw framebuffer + * + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the rectangle width + * @param height the rectangle height + * @param type Indicates the type of values to be transfered. One of:
    {@link #GL_COLOR COLOR}{@link #GL_STENCIL STENCIL}{@link #GL_DEPTH DEPTH}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glCopyPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int type); + + // --- [ glCullFace ] --- + + /** + * Specifies which polygon faces are culled if {@link GL11C#GL_CULL_FACE CULL_FACE} is enabled. Front-facing polygons are rasterized if either culling is disabled or the + * CullFace mode is {@link GL11C#GL_BACK BACK} while back-facing polygons are rasterized only if either culling is disabled or the CullFace mode is + * {@link GL11C#GL_FRONT FRONT}. The initial setting of the CullFace mode is {@link GL11C#GL_BACK BACK}. Initially, culling is disabled. + * + * @param mode the CullFace mode. One of:
    {@link GL11C#GL_FRONT FRONT}{@link GL11C#GL_BACK BACK}{@link GL11C#GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * + * @see Reference Page + */ + public static void glCullFace(@NativeType("GLenum") int mode) { + GL11C.glCullFace(mode); + } + + // --- [ glDeleteLists ] --- + + /** + * Deletes a contiguous group of display lists. All information about the display lists is lost, and the indices become unused. Indices to which no display + * list corresponds are ignored. If {@code range} is zero, nothing happens. + * + * @param list the index of the first display list to be deleted + * @param range the number of display lists to be deleted + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glDeleteLists(@NativeType("GLuint") int list, @NativeType("GLsizei") int range); + + // --- [ glDepthFunc ] --- + + /** + * Specifies the comparison that takes place during the depth buffer test (when {@link GL11C#GL_DEPTH_TEST DEPTH_TEST} is enabled). + * + * @param func the depth test comparison. One of:
    {@link GL11C#GL_NEVER NEVER}{@link GL11C#GL_ALWAYS ALWAYS}{@link GL11C#GL_LESS LESS}{@link GL11C#GL_LEQUAL LEQUAL}{@link GL11C#GL_EQUAL EQUAL}{@link GL11C#GL_GREATER GREATER}{@link GL11C#GL_GEQUAL GEQUAL}{@link GL11C#GL_NOTEQUAL NOTEQUAL}
    + * + * @see Reference Page + */ + public static void glDepthFunc(@NativeType("GLenum") int func) { + GL11C.glDepthFunc(func); + } + + // --- [ glDepthMask ] --- + + /** + * Masks the writing of depth values to the depth buffer. In the initial state, the depth buffer is enabled for writing. + * + * @param flag whether depth values are written or not. + * + * @see Reference Page + */ + public static void glDepthMask(@NativeType("GLboolean") boolean flag) { + GL11C.glDepthMask(flag); + } + + // --- [ glDepthRange ] --- + + /** + * Sets the depth range for all viewports to the same values. + * + * @param zNear the near depth range + * @param zFar the far depth range + * + * @see Reference Page + */ + public static void glDepthRange(@NativeType("GLdouble") double zNear, @NativeType("GLdouble") double zFar) { + GL11C.glDepthRange(zNear, zFar); + } + + // --- [ glDisableClientState ] --- + + /** + * Disables a client-side capability. + * + *

    If the {@link NVVertexBufferUnifiedMemory} extension is supported, this function is available even in a core profile context.

    + * + * @param cap the capability to disable. One of:
    {@link #GL_COLOR_ARRAY COLOR_ARRAY}{@link #GL_EDGE_FLAG_ARRAY EDGE_FLAG_ARRAY}{@link GL15#GL_FOG_COORD_ARRAY FOG_COORD_ARRAY}{@link #GL_INDEX_ARRAY INDEX_ARRAY}
    {@link #GL_NORMAL_ARRAY NORMAL_ARRAY}{@link GL14#GL_SECONDARY_COLOR_ARRAY SECONDARY_COLOR_ARRAY}{@link #GL_TEXTURE_COORD_ARRAY TEXTURE_COORD_ARRAY}{@link #GL_VERTEX_ARRAY VERTEX_ARRAY}
    {@link NVVertexBufferUnifiedMemory#GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV VERTEX_ATTRIB_ARRAY_UNIFIED_NV}{@link NVVertexBufferUnifiedMemory#GL_ELEMENT_ARRAY_UNIFIED_NV ELEMENT_ARRAY_UNIFIED_NV}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glDisableClientState(@NativeType("GLenum") int cap); + + // --- [ glDrawArrays ] --- + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices. Elements {@code first} through + * first + count – 1 of each enabled non-instanced array are transferred to the GL. + * + *

    If an array corresponding to an attribute required by a vertex shader is not enabled, then the corresponding element is taken from the current attribute + * state. If an array is enabled, the corresponding current vertex attribute value is unaffected by the execution of this function.

    + * + * @param mode the kind of primitives being constructed + * @param first the first vertex to transfer to the GL + * @param count the number of vertices after {@code first} to transfer to the GL + * + * @see Reference Page + */ + public static void glDrawArrays(@NativeType("GLenum") int mode, @NativeType("GLint") int first, @NativeType("GLsizei") int count) { + GL11C.glDrawArrays(mode, first, count); + } + + // --- [ glDrawBuffer ] --- + + /** + * Defines the color buffer to which fragment color zero is written. + * + *

    Acceptable values for {@code buf} depend on whether the GL is using the default framebuffer (i.e., {@link GL30#GL_DRAW_FRAMEBUFFER_BINDING DRAW_FRAMEBUFFER_BINDING} is zero), or + * a framebuffer object (i.e., {@link GL30#GL_DRAW_FRAMEBUFFER_BINDING DRAW_FRAMEBUFFER_BINDING} is non-zero). In the initial state, the GL is bound to the default framebuffer.

    + * + * @param buf the color buffer to draw to. One of:
    {@link GL11C#GL_NONE NONE}{@link GL11C#GL_FRONT_LEFT FRONT_LEFT}{@link GL11C#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11C#GL_BACK_LEFT BACK_LEFT}{@link GL11C#GL_BACK_RIGHT BACK_RIGHT}{@link GL11C#GL_FRONT FRONT}{@link GL11C#GL_BACK BACK}{@link GL11C#GL_LEFT LEFT}
    {@link GL11C#GL_RIGHT RIGHT}{@link GL11C#GL_FRONT_AND_BACK FRONT_AND_BACK}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static void glDrawBuffer(@NativeType("GLenum") int buf) { + GL11C.glDrawBuffer(buf); + } + + // --- [ glDrawElements ] --- + + /** + * Unsafe version of: {@link #glDrawElements DrawElements} + * + * @param count the number of vertices to transfer to the GL + * @param type indicates the type of index values in {@code indices}. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawElements(int mode, int count, int type, long indices) { + GL11C.nglDrawElements(mode, count, type, indices); + } + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices to the GL. + * The ith element transferred by {@code DrawElements} will be taken from element {@code indices[i]} (if no element array buffer is bound), or + * from the element whose index is stored in the currently bound element array buffer at offset {@code indices + i}. + * + * @param mode the kind of primitives being constructed. One of:
    {@link GL11C#GL_POINTS POINTS}{@link GL11C#GL_LINE_STRIP LINE_STRIP}{@link GL11C#GL_LINE_LOOP LINE_LOOP}{@link GL11C#GL_LINES LINES}{@link GL11C#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11C#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11C#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param count the number of vertices to transfer to the GL + * @param type indicates the type of index values in {@code indices}. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices the index values + * + * @see Reference Page + */ + public static void glDrawElements(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices) { + GL11C.glDrawElements(mode, count, type, indices); + } + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices to the GL. + * The ith element transferred by {@code DrawElements} will be taken from element {@code indices[i]} (if no element array buffer is bound), or + * from the element whose index is stored in the currently bound element array buffer at offset {@code indices + i}. + * + * @param mode the kind of primitives being constructed. One of:
    {@link GL11C#GL_POINTS POINTS}{@link GL11C#GL_LINE_STRIP LINE_STRIP}{@link GL11C#GL_LINE_LOOP LINE_LOOP}{@link GL11C#GL_LINES LINES}{@link GL11C#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11C#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11C#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param type indicates the type of index values in {@code indices}. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices the index values + * + * @see Reference Page + */ + public static void glDrawElements(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices) { + GL11C.glDrawElements(mode, type, indices); + } + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices to the GL. + * The ith element transferred by {@code DrawElements} will be taken from element {@code indices[i]} (if no element array buffer is bound), or + * from the element whose index is stored in the currently bound element array buffer at offset {@code indices + i}. + * + * @param mode the kind of primitives being constructed. One of:
    {@link GL11C#GL_POINTS POINTS}{@link GL11C#GL_LINE_STRIP LINE_STRIP}{@link GL11C#GL_LINE_LOOP LINE_LOOP}{@link GL11C#GL_LINES LINES}{@link GL11C#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11C#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11C#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the index values + * + * @see Reference Page + */ + public static void glDrawElements(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices) { + GL11C.glDrawElements(mode, indices); + } + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices to the GL. + * The ith element transferred by {@code DrawElements} will be taken from element {@code indices[i]} (if no element array buffer is bound), or + * from the element whose index is stored in the currently bound element array buffer at offset {@code indices + i}. + * + * @param mode the kind of primitives being constructed. One of:
    {@link GL11C#GL_POINTS POINTS}{@link GL11C#GL_LINE_STRIP LINE_STRIP}{@link GL11C#GL_LINE_LOOP LINE_LOOP}{@link GL11C#GL_LINES LINES}{@link GL11C#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11C#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11C#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the index values + * + * @see Reference Page + */ + public static void glDrawElements(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices) { + GL11C.glDrawElements(mode, indices); + } + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices to the GL. + * The ith element transferred by {@code DrawElements} will be taken from element {@code indices[i]} (if no element array buffer is bound), or + * from the element whose index is stored in the currently bound element array buffer at offset {@code indices + i}. + * + * @param mode the kind of primitives being constructed. One of:
    {@link GL11C#GL_POINTS POINTS}{@link GL11C#GL_LINE_STRIP LINE_STRIP}{@link GL11C#GL_LINE_LOOP LINE_LOOP}{@link GL11C#GL_LINES LINES}{@link GL11C#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11C#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11C#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the index values + * + * @see Reference Page + */ + public static void glDrawElements(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices) { + GL11C.glDrawElements(mode, indices); + } + + // --- [ glDrawPixels ] --- + + /** Unsafe version of: {@link #glDrawPixels DrawPixels} */ + public static native void nglDrawPixels(int width, int height, int format, int type, long pixels); + + /** + * Draws a pixel rectangle to the active draw buffers. + * + * @param width the pixel rectangle width + * @param height the pixel rectangle height + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link #GL_LUMINANCE LUMINANCE}{@link #GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link #GL_BITMAP BITMAP}
    + * @param pixels the pixel data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glDrawPixels(@NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglDrawPixels(width, height, format, type, memAddress(pixels)); + } + + /** + * Draws a pixel rectangle to the active draw buffers. + * + * @param width the pixel rectangle width + * @param height the pixel rectangle height + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link #GL_LUMINANCE LUMINANCE}{@link #GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link #GL_BITMAP BITMAP}
    + * @param pixels the pixel data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glDrawPixels(@NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglDrawPixels(width, height, format, type, pixels); + } + + /** + * Draws a pixel rectangle to the active draw buffers. + * + * @param width the pixel rectangle width + * @param height the pixel rectangle height + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link #GL_LUMINANCE LUMINANCE}{@link #GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link #GL_BITMAP BITMAP}
    + * @param pixels the pixel data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glDrawPixels(@NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglDrawPixels(width, height, format, type, memAddress(pixels)); + } + + /** + * Draws a pixel rectangle to the active draw buffers. + * + * @param width the pixel rectangle width + * @param height the pixel rectangle height + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link #GL_LUMINANCE LUMINANCE}{@link #GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link #GL_BITMAP BITMAP}
    + * @param pixels the pixel data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glDrawPixels(@NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglDrawPixels(width, height, format, type, memAddress(pixels)); + } + + /** + * Draws a pixel rectangle to the active draw buffers. + * + * @param width the pixel rectangle width + * @param height the pixel rectangle height + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link #GL_LUMINANCE LUMINANCE}{@link #GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link #GL_BITMAP BITMAP}
    + * @param pixels the pixel data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glDrawPixels(@NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglDrawPixels(width, height, format, type, memAddress(pixels)); + } + + // --- [ glEdgeFlag ] --- + + /** + * Each edge of each polygon primitive generated is flagged as either boundary or non-boundary. These classifications are used during polygon + * rasterization; some modes affect the interpretation of polygon boundary edges. By default, all edges are boundary edges, but the flagging of polygons, + * separate triangles, or separate quadrilaterals may be altered by calling this function. + * + *

    When a primitive of type {@link #GL_POLYGON POLYGON}, {@link #GL_TRIANGLES TRIANGLES}, or {@link #GL_QUADS QUADS} is drawn, each vertex transferred begins an edge. If the edge + * flag bit is TRUE, then each specified vertex begins an edge that is flagged as boundary. If the bit is FALSE, then induced edges are flagged as + * non-boundary.

    + * + * @param flag the edge flag bit + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEdgeFlag(@NativeType("GLboolean") boolean flag); + + // --- [ glEdgeFlagv ] --- + + /** Unsafe version of: {@link #glEdgeFlagv EdgeFlagv} */ + public static native void nglEdgeFlagv(long flag); + + /** + * Pointer version of {@link #glEdgeFlag EdgeFlag}. + * + * @param flag the edge flag buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glEdgeFlagv(@NativeType("GLboolean const *") ByteBuffer flag) { + if (CHECKS) { + check(flag, 1); + } + nglEdgeFlagv(memAddress(flag)); + } + + // --- [ glEdgeFlagPointer ] --- + + /** Unsafe version of: {@link #glEdgeFlagPointer EdgeFlagPointer} */ + public static native void nglEdgeFlagPointer(int stride, long pointer); + + /** + * Specifies the location and organization of an edge flag array. + * + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the edge flag array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glEdgeFlagPointer(@NativeType("GLsizei") int stride, @NativeType("GLboolean const *") ByteBuffer pointer) { + nglEdgeFlagPointer(stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of an edge flag array. + * + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the edge flag array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glEdgeFlagPointer(@NativeType("GLsizei") int stride, @NativeType("GLboolean const *") long pointer) { + nglEdgeFlagPointer(stride, pointer); + } + + // --- [ glEnableClientState ] --- + + /** + * Enables a client-side capability. + * + *

    If the {@link NVVertexBufferUnifiedMemory} extension is supported, this function is available even in a core profile context.

    + * + * @param cap the capability to enable. One of:
    {@link #GL_COLOR_ARRAY COLOR_ARRAY}{@link #GL_EDGE_FLAG_ARRAY EDGE_FLAG_ARRAY}{@link GL15#GL_FOG_COORD_ARRAY FOG_COORD_ARRAY}{@link #GL_INDEX_ARRAY INDEX_ARRAY}
    {@link #GL_NORMAL_ARRAY NORMAL_ARRAY}{@link GL14#GL_SECONDARY_COLOR_ARRAY SECONDARY_COLOR_ARRAY}{@link #GL_TEXTURE_COORD_ARRAY TEXTURE_COORD_ARRAY}{@link #GL_VERTEX_ARRAY VERTEX_ARRAY}
    {@link NVVertexBufferUnifiedMemory#GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV VERTEX_ATTRIB_ARRAY_UNIFIED_NV}{@link NVVertexBufferUnifiedMemory#GL_ELEMENT_ARRAY_UNIFIED_NV ELEMENT_ARRAY_UNIFIED_NV}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEnableClientState(@NativeType("GLenum") int cap); + + // --- [ glEnd ] --- + + /** + * Ends the definition of vertex attributes of a sequence of primitives to be transferred to the GL. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEnd(); + + // --- [ glEvalCoord1f ] --- + + /** + * Causes evaluation of the enabled one-dimensional evaluator maps. + * + * @param u the domain coordinate u + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEvalCoord1f(@NativeType("GLfloat") float u); + + // --- [ glEvalCoord1fv ] --- + + /** Unsafe version of: {@link #glEvalCoord1fv EvalCoord1fv} */ + public static native void nglEvalCoord1fv(long u); + + /** + * Pointer version of {@link #glEvalCoord1f EvalCoord1f}. + * + * @param u the domain coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glEvalCoord1fv(@NativeType("GLfloat const *") FloatBuffer u) { + if (CHECKS) { + check(u, 1); + } + nglEvalCoord1fv(memAddress(u)); + } + + // --- [ glEvalCoord1d ] --- + + /** + * Double version of {@link #glEvalCoord1f EvalCoord1f}. + * + * @param u the domain coordinate u + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEvalCoord1d(@NativeType("GLdouble") double u); + + // --- [ glEvalCoord1dv ] --- + + /** Unsafe version of: {@link #glEvalCoord1dv EvalCoord1dv} */ + public static native void nglEvalCoord1dv(long u); + + /** + * Pointer version of {@link #glEvalCoord1d EvalCoord1d}. + * + * @param u the domain coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glEvalCoord1dv(@NativeType("GLdouble const *") DoubleBuffer u) { + if (CHECKS) { + check(u, 1); + } + nglEvalCoord1dv(memAddress(u)); + } + + // --- [ glEvalCoord2f ] --- + + /** + * Causes evaluation of the enabled two-dimensional evaluator maps. + * + * @param u the domain coordinate u + * @param v the domain coordinate v + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEvalCoord2f(@NativeType("GLfloat") float u, @NativeType("GLfloat") float v); + + // --- [ glEvalCoord2fv ] --- + + /** Unsafe version of: {@link #glEvalCoord2fv EvalCoord2fv} */ + public static native void nglEvalCoord2fv(long u); + + /** + * Pointer version of {@link #glEvalCoord2f EvalCoord2f}. + * + * @param u the domain coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glEvalCoord2fv(@NativeType("GLfloat const *") FloatBuffer u) { + if (CHECKS) { + check(u, 2); + } + nglEvalCoord2fv(memAddress(u)); + } + + // --- [ glEvalCoord2d ] --- + + /** + * Double version of {@link #glEvalCoord2f EvalCoord2f}. + * + * @param u the domain coordinate u + * @param v the domain coordinate v + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEvalCoord2d(@NativeType("GLdouble") double u, @NativeType("GLdouble") double v); + + // --- [ glEvalCoord2dv ] --- + + /** Unsafe version of: {@link #glEvalCoord2dv EvalCoord2dv} */ + public static native void nglEvalCoord2dv(long u); + + /** + * Pointer version of {@link #glEvalCoord2d EvalCoord2d}. + * + * @param u the domain coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glEvalCoord2dv(@NativeType("GLdouble const *") DoubleBuffer u) { + if (CHECKS) { + check(u, 2); + } + nglEvalCoord2dv(memAddress(u)); + } + + // --- [ glEvalMesh1 ] --- + + /** + * Carries out an evaluation on a subset of the one-dimensional map grid. + * + * @param mode the mesh type. One of:
    {@link #GL_POINT POINT}{@link #GL_LINE LINE}
    + * @param i1 the start index + * @param i2 the end index + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEvalMesh1(@NativeType("GLenum") int mode, @NativeType("GLint") int i1, @NativeType("GLint") int i2); + + // --- [ glEvalMesh2 ] --- + + /** + * Carries out an evaluation on a rectangular subset of the two-dimensional map grid. + * + * @param mode the mesh type. One of:
    {@link #GL_FILL FILL}{@link #GL_LINE LINE}{@link #GL_POINT POINT}
    + * @param i1 the u-dimension start index + * @param i2 the u-dimension end index + * @param j1 the v-dimension start index + * @param j2 the v-dimension end index + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEvalMesh2(@NativeType("GLenum") int mode, @NativeType("GLint") int i1, @NativeType("GLint") int i2, @NativeType("GLint") int j1, @NativeType("GLint") int j2); + + // --- [ glEvalPoint1 ] --- + + /** + * Carries out an evalutation of a single point on the one-dimensional map grid. + * + * @param i the grid index + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEvalPoint1(@NativeType("GLint") int i); + + // --- [ glEvalPoint2 ] --- + + /** + * Carries out an evalutation of a single point on the two-dimensional map grid. + * + * @param i the u-dimension grid index + * @param j the v-dimension grid index + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEvalPoint2(@NativeType("GLint") int i, @NativeType("GLint") int j); + + // --- [ glFeedbackBuffer ] --- + + /** + * Unsafe version of: {@link #glFeedbackBuffer FeedbackBuffer} + * + * @param size the maximum number of values that can be written to {@code buffer} + */ + public static native void nglFeedbackBuffer(int size, int type, long buffer); + + /** + * Returns information about primitives when the GL is in feedback mode. + * + * @param type the type of information to feed back for each vertex. One of:
    {@link #GL_2D 2D}{@link #GL_3D 3D}{@link #GL_3D_COLOR 3D_COLOR}{@link #GL_3D_COLOR_TEXTURE 3D_COLOR_TEXTURE}{@link #GL_4D_COLOR_TEXTURE 4D_COLOR_TEXTURE}
    + * @param buffer an array of floating-point values into which feedback information will be placed + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFeedbackBuffer(@NativeType("GLenum") int type, @NativeType("GLfloat *") FloatBuffer buffer) { + nglFeedbackBuffer(buffer.remaining(), type, memAddress(buffer)); + } + + // --- [ glFinish ] --- + + /** + * Forces all previously issued GL commands to complete. {@code Finish} does not return until all effects from such commands on GL client and server + * state and the framebuffer are fully realized. + * + * @see Reference Page + */ + public static void glFinish() { + GL11C.glFinish(); + } + + // --- [ glFlush ] --- + + /** + * Causes all previously issued GL commands to complete in finite time (although such commands may still be executing when {@code Flush} returns). + * + * @see Reference Page + */ + public static void glFlush() { + GL11C.glFlush(); + } + + // --- [ glFogi ] --- + + /** + * Sets the integer value of a fog parameter. + * + * @param pname the fog parameter. One of:
    {@link #GL_FOG_MODE FOG_MODE}{@link GL15#GL_FOG_COORD_SRC FOG_COORD_SRC}
    + * @param param the fog parameter value. One of:
    {@link #GL_EXP EXP}{@link #GL_EXP2 EXP2}{@link #GL_LINEAR LINEAR}{@link GL14#GL_FRAGMENT_DEPTH FRAGMENT_DEPTH}{@link GL15#GL_FOG_COORD FOG_COORD}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glFogi(@NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glFogiv ] --- + + /** Unsafe version of: {@link #glFogiv Fogiv} */ + public static native void nglFogiv(int pname, long params); + + /** + * Pointer version of {@link #glFogi Fogi}. + * + * @param pname the fog parameter. One of:
    {@link #GL_FOG_MODE FOG_MODE}{@link GL15#GL_FOG_COORD_SRC FOG_COORD_SRC}
    + * @param params the fog parameter buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogiv(@NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglFogiv(pname, memAddress(params)); + } + + // --- [ glFogf ] --- + + /** + * Sets the float value of a fog parameter. + * + * @param pname the fog parameter. One of:
    {@link #GL_FOG_DENSITY FOG_DENSITY}{@link #GL_FOG_START FOG_START}{@link #GL_FOG_END FOG_END}
    + * @param param the fog parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glFogf(@NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glFogfv ] --- + + /** Unsafe version of: {@link #glFogfv Fogfv} */ + public static native void nglFogfv(int pname, long params); + + /** + * Pointer version of {@link #glFogf Fogf}. + * + * @param pname the fog parameter. One of:
    {@link #GL_FOG_DENSITY FOG_DENSITY}{@link #GL_FOG_START FOG_START}{@link #GL_FOG_END FOG_END}
    + * @param params the fog parameter buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglFogfv(pname, memAddress(params)); + } + + // --- [ glFrontFace ] --- + + /** + * The first step of polygon rasterization is to determine if the polygon is back-facing or front-facing. This determination is made based on the sign of + * the (clipped or unclipped) polygon's area computed in window coordinates. The interpretation of the sign of this value is controlled with this function. + * In the initial state, the front face direction is set to {@link GL11C#GL_CCW CCW}. + * + * @param dir the front face direction. One of:
    {@link GL11C#GL_CCW CCW}{@link GL11C#GL_CW CW}
    + * + * @see Reference Page + */ + public static void glFrontFace(@NativeType("GLenum") int dir) { + GL11C.glFrontFace(dir); + } + + // --- [ glGenLists ] --- + + /** + * Returns an integer n such that the indices {@code n,..., n + s - 1} are previously unused (i.e. there are {@code s} previously unused display list + * indices starting at n). {@code GenLists} also has the effect of creating an empty display list for each of the indices {@code n,..., n + s - 1}, so + * that these indices all become used. {@code GenLists} returns zero if there is no group of {@code s} contiguous previously unused display list indices, + * or if {@code s = 0}. + * + * @param s the number of display lists to create + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("GLuint") + public static native int glGenLists(@NativeType("GLsizei") int s); + + // --- [ glGenTextures ] --- + + /** + * Unsafe version of: {@link #glGenTextures GenTextures} + * + * @param n the number of textures to create + */ + public static void nglGenTextures(int n, long textures) { + GL11C.nglGenTextures(n, textures); + } + + /** + * Returns n previously unused texture names in textures. These names are marked as used, for the purposes of GenTextures only, but they acquire texture + * state and a dimensionality only when they are first bound, just as if they were unused. + * + * @param textures a scalar or buffer in which to place the returned texture names + * + * @see Reference Page + */ + public static void glGenTextures(@NativeType("GLuint *") IntBuffer textures) { + GL11C.glGenTextures(textures); + } + + /** + * Returns n previously unused texture names in textures. These names are marked as used, for the purposes of GenTextures only, but they acquire texture + * state and a dimensionality only when they are first bound, just as if they were unused. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenTextures() { + return GL11C.glGenTextures(); + } + + // --- [ glDeleteTextures ] --- + + /** + * Unsafe version of: {@link #glDeleteTextures DeleteTextures} + * + * @param n the number of texture names in the {@code textures} parameter + */ + public static void nglDeleteTextures(int n, long textures) { + GL11C.nglDeleteTextures(n, textures); + } + + /** + * Deletes texture objects. After a texture object is deleted, it has no contents or dimensionality, and its name is again unused. If a texture that is + * currently bound to any of the target bindings of {@link #glBindTexture BindTexture} is deleted, it is as though {@link #glBindTexture BindTexture} had been executed with the + * same target and texture zero. Additionally, special care must be taken when deleting a texture if any of the images of the texture are attached to a + * framebuffer object. + * + *

    Unused names in textures that have been marked as used for the purposes of {@link #glGenTextures GenTextures} are marked as unused again. Unused names in textures are + * silently ignored, as is the name zero.

    + * + * @param textures contains {@code n} names of texture objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteTextures(@NativeType("GLuint const *") IntBuffer textures) { + GL11C.glDeleteTextures(textures); + } + + /** + * Deletes texture objects. After a texture object is deleted, it has no contents or dimensionality, and its name is again unused. If a texture that is + * currently bound to any of the target bindings of {@link #glBindTexture BindTexture} is deleted, it is as though {@link #glBindTexture BindTexture} had been executed with the + * same target and texture zero. Additionally, special care must be taken when deleting a texture if any of the images of the texture are attached to a + * framebuffer object. + * + *

    Unused names in textures that have been marked as used for the purposes of {@link #glGenTextures GenTextures} are marked as unused again. Unused names in textures are + * silently ignored, as is the name zero.

    + * + * @see Reference Page + */ + public static void glDeleteTextures(@NativeType("GLuint const *") int texture) { + GL11C.glDeleteTextures(texture); + } + + // --- [ glGetClipPlane ] --- + + /** Unsafe version of: {@link #glGetClipPlane GetClipPlane} */ + public static native void nglGetClipPlane(int plane, long equation); + + /** + * Returns four double-precision values in {@code equation}; these are the coefficients of the plane equation of plane in eye coordinates (these + * coordinates are those that were computed when the plane was specified). + * + * @param plane the clip plane + * @param equation a buffer in which to place the returned values + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetClipPlane(@NativeType("GLenum") int plane, @NativeType("GLdouble *") DoubleBuffer equation) { + if (CHECKS) { + check(equation, 4); + } + nglGetClipPlane(plane, memAddress(equation)); + } + + // --- [ glGetBooleanv ] --- + + /** Unsafe version of: {@link #glGetBooleanv GetBooleanv} */ + public static void nglGetBooleanv(int pname, long params) { + GL11C.nglGetBooleanv(pname, params); + } + + /** + * Returns the current boolean value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetBooleanv(@NativeType("GLenum") int pname, @NativeType("GLboolean *") ByteBuffer params) { + GL11C.glGetBooleanv(pname, params); + } + + /** + * Returns the current boolean value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * + * @see Reference Page + */ + @NativeType("void") + public static boolean glGetBoolean(@NativeType("GLenum") int pname) { + return GL11C.glGetBoolean(pname); + } + + // --- [ glGetFloatv ] --- + + /** Unsafe version of: {@link #glGetFloatv GetFloatv} */ + public static void nglGetFloatv(int pname, long params) { + GL11C.nglGetFloatv(pname, params); + } + + /** + * Returns the current float value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetFloatv(@NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + GL11C.glGetFloatv(pname, params); + } + + /** + * Returns the current float value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetFloat(@NativeType("GLenum") int pname) { + return GL11C.glGetFloat(pname); + } + + // --- [ glGetIntegerv ] --- + + /** Unsafe version of: {@link #glGetIntegerv GetIntegerv} */ + public static void nglGetIntegerv(int pname, long params) { + GL11C.nglGetIntegerv(pname, params); + } + + /** + * Returns the current integer value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetIntegerv(@NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL11C.glGetIntegerv(pname, params); + } + + /** + * Returns the current integer value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetInteger(@NativeType("GLenum") int pname) { + return GL11C.glGetInteger(pname); + } + + // --- [ glGetDoublev ] --- + + /** Unsafe version of: {@link #glGetDoublev GetDoublev} */ + public static void nglGetDoublev(int pname, long params) { + GL11C.nglGetDoublev(pname, params); + } + + /** + * Returns the current double value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetDoublev(@NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer params) { + GL11C.glGetDoublev(pname, params); + } + + /** + * Returns the current double value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * + * @see Reference Page + */ + @NativeType("void") + public static double glGetDouble(@NativeType("GLenum") int pname) { + return GL11C.glGetDouble(pname); + } + + // --- [ glGetError ] --- + + /** + * Returns error information. + * + *

    Each detectable error is assigned a numeric code. When an error is detected, a flag is set and the code is recorded. Further errors, if they occur, do + * not affect this recorded code. When {@code GetError} is called, the code is returned and the flag is cleared, so that a further error will again record + * its code. If a call to {@code GetError} returns {@link GL11C#GL_NO_ERROR NO_ERROR}, then there has been no detectable error since the last call to {@code GetError} (or since + * the GL was initialized).

    + * + * @see Reference Page + */ + @NativeType("GLenum") + public static int glGetError() { + return GL11C.glGetError(); + } + + // --- [ glGetLightiv ] --- + + /** Unsafe version of: {@link #glGetLightiv GetLightiv} */ + public static native void nglGetLightiv(int light, int pname, long data); + + /** + * Returns integer information about light parameter {@code pname} for {@code light} in {@code data}. + * + * @param light the light for which to return information. One of:
    {@link #GL_LIGHT0 LIGHT0}GL_LIGHT[1-7]
    + * @param pname the light parameter to query. One of:
    {@link #GL_AMBIENT AMBIENT}{@link #GL_DIFFUSE DIFFUSE}{@link #GL_SPECULAR SPECULAR}{@link #GL_POSITION POSITION}{@link #GL_CONSTANT_ATTENUATION CONSTANT_ATTENUATION}{@link #GL_LINEAR_ATTENUATION LINEAR_ATTENUATION}
    {@link #GL_QUADRATIC_ATTENUATION QUADRATIC_ATTENUATION}{@link #GL_SPOT_DIRECTION SPOT_DIRECTION}{@link #GL_SPOT_EXPONENT SPOT_EXPONENT}{@link #GL_SPOT_CUTOFF SPOT_CUTOFF}
    + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetLightiv(@NativeType("GLenum") int light, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer data) { + if (CHECKS) { + check(data, 4); + } + nglGetLightiv(light, pname, memAddress(data)); + } + + /** + * Returns integer information about light parameter {@code pname} for {@code light} in {@code data}. + * + * @param light the light for which to return information. One of:
    {@link #GL_LIGHT0 LIGHT0}GL_LIGHT[1-7]
    + * @param pname the light parameter to query. One of:
    {@link #GL_AMBIENT AMBIENT}{@link #GL_DIFFUSE DIFFUSE}{@link #GL_SPECULAR SPECULAR}{@link #GL_POSITION POSITION}{@link #GL_CONSTANT_ATTENUATION CONSTANT_ATTENUATION}{@link #GL_LINEAR_ATTENUATION LINEAR_ATTENUATION}
    {@link #GL_QUADRATIC_ATTENUATION QUADRATIC_ATTENUATION}{@link #GL_SPOT_DIRECTION SPOT_DIRECTION}{@link #GL_SPOT_EXPONENT SPOT_EXPONENT}{@link #GL_SPOT_CUTOFF SPOT_CUTOFF}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("void") + public static int glGetLighti(@NativeType("GLenum") int light, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer data = stack.callocInt(1); + nglGetLightiv(light, pname, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetLightfv ] --- + + /** Unsafe version of: {@link #glGetLightfv GetLightfv} */ + public static native void nglGetLightfv(int light, int pname, long data); + + /** + * Float version of {@link #glGetLightiv GetLightiv}. + * + * @param light the light for which to return information + * @param pname the light parameter to query + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetLightfv(@NativeType("GLenum") int light, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer data) { + if (CHECKS) { + check(data, 4); + } + nglGetLightfv(light, pname, memAddress(data)); + } + + /** + * Float version of {@link #glGetLightiv GetLightiv}. + * + * @param light the light for which to return information + * @param pname the light parameter to query + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("void") + public static float glGetLightf(@NativeType("GLenum") int light, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer data = stack.callocFloat(1); + nglGetLightfv(light, pname, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMapiv ] --- + + /** Unsafe version of: {@link #glGetMapiv GetMapiv} */ + public static native void nglGetMapiv(int target, int query, long data); + + /** + * Returns integer information about {@code query} for evaluator map {@code target} in {@code data}. + * + * @param target the evaluator target. One of:
    {@link #GL_MAP1_VERTEX_3 MAP1_VERTEX_3}{@link #GL_MAP1_VERTEX_4 MAP1_VERTEX_4}{@link #GL_MAP1_COLOR_4 MAP1_COLOR_4}{@link #GL_MAP1_NORMAL MAP1_NORMAL}{@link #GL_MAP1_TEXTURE_COORD_1 MAP1_TEXTURE_COORD_1}
    {@link #GL_MAP1_TEXTURE_COORD_2 MAP1_TEXTURE_COORD_2}{@link #GL_MAP1_TEXTURE_COORD_3 MAP1_TEXTURE_COORD_3}{@link #GL_MAP1_TEXTURE_COORD_4 MAP1_TEXTURE_COORD_4}{@link #GL_MAP2_VERTEX_3 MAP2_VERTEX_3}{@link #GL_MAP2_VERTEX_4 MAP2_VERTEX_4}
    {@link #GL_MAP2_COLOR_4 MAP2_COLOR_4}{@link #GL_MAP2_NORMAL MAP2_NORMAL}{@link #GL_MAP2_TEXTURE_COORD_1 MAP2_TEXTURE_COORD_1}{@link #GL_MAP2_TEXTURE_COORD_2 MAP2_TEXTURE_COORD_2}{@link #GL_MAP2_TEXTURE_COORD_3 MAP2_TEXTURE_COORD_3}
    {@link #GL_MAP2_TEXTURE_COORD_4 MAP2_TEXTURE_COORD_4}
    + * @param query the information to query. One of:
    {@link #GL_ORDER ORDER}{@link #GL_COEFF COEFF}{@link #GL_DOMAIN DOMAIN}
    + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetMapiv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLint *") IntBuffer data) { + if (CHECKS) { + check(data, 4); + } + nglGetMapiv(target, query, memAddress(data)); + } + + /** + * Returns integer information about {@code query} for evaluator map {@code target} in {@code data}. + * + * @param target the evaluator target. One of:
    {@link #GL_MAP1_VERTEX_3 MAP1_VERTEX_3}{@link #GL_MAP1_VERTEX_4 MAP1_VERTEX_4}{@link #GL_MAP1_COLOR_4 MAP1_COLOR_4}{@link #GL_MAP1_NORMAL MAP1_NORMAL}{@link #GL_MAP1_TEXTURE_COORD_1 MAP1_TEXTURE_COORD_1}
    {@link #GL_MAP1_TEXTURE_COORD_2 MAP1_TEXTURE_COORD_2}{@link #GL_MAP1_TEXTURE_COORD_3 MAP1_TEXTURE_COORD_3}{@link #GL_MAP1_TEXTURE_COORD_4 MAP1_TEXTURE_COORD_4}{@link #GL_MAP2_VERTEX_3 MAP2_VERTEX_3}{@link #GL_MAP2_VERTEX_4 MAP2_VERTEX_4}
    {@link #GL_MAP2_COLOR_4 MAP2_COLOR_4}{@link #GL_MAP2_NORMAL MAP2_NORMAL}{@link #GL_MAP2_TEXTURE_COORD_1 MAP2_TEXTURE_COORD_1}{@link #GL_MAP2_TEXTURE_COORD_2 MAP2_TEXTURE_COORD_2}{@link #GL_MAP2_TEXTURE_COORD_3 MAP2_TEXTURE_COORD_3}
    {@link #GL_MAP2_TEXTURE_COORD_4 MAP2_TEXTURE_COORD_4}
    + * @param query the information to query. One of:
    {@link #GL_ORDER ORDER}{@link #GL_COEFF COEFF}{@link #GL_DOMAIN DOMAIN}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("void") + public static int glGetMapi(@NativeType("GLenum") int target, @NativeType("GLenum") int query) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer data = stack.callocInt(1); + nglGetMapiv(target, query, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMapfv ] --- + + /** Unsafe version of: {@link #glGetMapfv GetMapfv} */ + public static native void nglGetMapfv(int target, int query, long data); + + /** + * Float version of {@link #glGetMapiv GetMapiv}. + * + * @param target the evaluator map + * @param query the information to query + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetMapfv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLfloat *") FloatBuffer data) { + if (CHECKS) { + check(data, 4); + } + nglGetMapfv(target, query, memAddress(data)); + } + + /** + * Float version of {@link #glGetMapiv GetMapiv}. + * + * @param target the evaluator map + * @param query the information to query + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("void") + public static float glGetMapf(@NativeType("GLenum") int target, @NativeType("GLenum") int query) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer data = stack.callocFloat(1); + nglGetMapfv(target, query, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMapdv ] --- + + /** Unsafe version of: {@link #glGetMapdv GetMapdv} */ + public static native void nglGetMapdv(int target, int query, long data); + + /** + * Double version of {@link #glGetMapiv GetMapiv}. + * + * @param target the evaluator map + * @param query the information to query + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetMapdv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLdouble *") DoubleBuffer data) { + if (CHECKS) { + check(data, 4); + } + nglGetMapdv(target, query, memAddress(data)); + } + + /** + * Double version of {@link #glGetMapiv GetMapiv}. + * + * @param target the evaluator map + * @param query the information to query + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("void") + public static double glGetMapd(@NativeType("GLenum") int target, @NativeType("GLenum") int query) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer data = stack.callocDouble(1); + nglGetMapdv(target, query, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetMaterialiv ] --- + + /** Unsafe version of: {@link #glGetMaterialiv GetMaterialiv} */ + public static native void nglGetMaterialiv(int face, int pname, long data); + + /** + * Returns integer information about material property {@code pname} for {@code face} in {@code data}. + * + * @param face the material face for which to return information. One of:
    {@link #GL_FRONT FRONT}{@link #GL_BACK BACK}
    + * @param pname the information to query. One of:
    {@link #GL_AMBIENT AMBIENT}{@link #GL_DIFFUSE DIFFUSE}{@link #GL_SPECULAR SPECULAR}{@link #GL_EMISSION EMISSION}{@link #GL_SHININESS SHININESS}
    + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetMaterialiv(@NativeType("GLenum") int face, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer data) { + if (CHECKS) { + check(data, 1); + } + nglGetMaterialiv(face, pname, memAddress(data)); + } + + // --- [ glGetMaterialfv ] --- + + /** Unsafe version of: {@link #glGetMaterialfv GetMaterialfv} */ + public static native void nglGetMaterialfv(int face, int pname, long data); + + /** + * Float version of {@link #glGetMaterialiv GetMaterialiv}. + * + * @param face the material face for which to return information + * @param pname the information to query + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetMaterialfv(@NativeType("GLenum") int face, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer data) { + if (CHECKS) { + check(data, 1); + } + nglGetMaterialfv(face, pname, memAddress(data)); + } + + // --- [ glGetPixelMapfv ] --- + + /** Unsafe version of: {@link #glGetPixelMapfv GetPixelMapfv} */ + public static native void nglGetPixelMapfv(int map, long data); + + /** + * Returns all float values in the pixel map {@code map} in {@code data}. + * + * @param map the pixel map parameter to query. One of:
    {@link #GL_PIXEL_MAP_I_TO_I PIXEL_MAP_I_TO_I}{@link #GL_PIXEL_MAP_S_TO_S PIXEL_MAP_S_TO_S}{@link #GL_PIXEL_MAP_I_TO_R PIXEL_MAP_I_TO_R}{@link #GL_PIXEL_MAP_I_TO_G PIXEL_MAP_I_TO_G}{@link #GL_PIXEL_MAP_I_TO_B PIXEL_MAP_I_TO_B}
    {@link #GL_PIXEL_MAP_I_TO_A PIXEL_MAP_I_TO_A}{@link #GL_PIXEL_MAP_R_TO_R PIXEL_MAP_R_TO_R}{@link #GL_PIXEL_MAP_G_TO_G PIXEL_MAP_G_TO_G}{@link #GL_PIXEL_MAP_B_TO_B PIXEL_MAP_B_TO_B}{@link #GL_PIXEL_MAP_A_TO_A PIXEL_MAP_A_TO_A}
    + * @param data a buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetPixelMapfv(@NativeType("GLenum") int map, @NativeType("GLfloat *") FloatBuffer data) { + if (CHECKS) { + check(data, 32); + } + nglGetPixelMapfv(map, memAddress(data)); + } + + /** + * Returns all float values in the pixel map {@code map} in {@code data}. + * + * @param map the pixel map parameter to query. One of:
    {@link #GL_PIXEL_MAP_I_TO_I PIXEL_MAP_I_TO_I}{@link #GL_PIXEL_MAP_S_TO_S PIXEL_MAP_S_TO_S}{@link #GL_PIXEL_MAP_I_TO_R PIXEL_MAP_I_TO_R}{@link #GL_PIXEL_MAP_I_TO_G PIXEL_MAP_I_TO_G}{@link #GL_PIXEL_MAP_I_TO_B PIXEL_MAP_I_TO_B}
    {@link #GL_PIXEL_MAP_I_TO_A PIXEL_MAP_I_TO_A}{@link #GL_PIXEL_MAP_R_TO_R PIXEL_MAP_R_TO_R}{@link #GL_PIXEL_MAP_G_TO_G PIXEL_MAP_G_TO_G}{@link #GL_PIXEL_MAP_B_TO_B PIXEL_MAP_B_TO_B}{@link #GL_PIXEL_MAP_A_TO_A PIXEL_MAP_A_TO_A}
    + * @param data a buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetPixelMapfv(@NativeType("GLenum") int map, @NativeType("GLfloat *") long data) { + nglGetPixelMapfv(map, data); + } + + // --- [ glGetPixelMapusv ] --- + + /** Unsafe version of: {@link #glGetPixelMapusv GetPixelMapusv} */ + public static native void nglGetPixelMapusv(int map, long data); + + /** + * Unsigned short version of {@link #glGetPixelMapfv GetPixelMapfv}. + * + * @param map the pixel map parameter to query + * @param data a buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetPixelMapusv(@NativeType("GLenum") int map, @NativeType("GLushort *") ShortBuffer data) { + if (CHECKS) { + check(data, 32); + } + nglGetPixelMapusv(map, memAddress(data)); + } + + /** + * Unsigned short version of {@link #glGetPixelMapfv GetPixelMapfv}. + * + * @param map the pixel map parameter to query + * @param data a buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetPixelMapusv(@NativeType("GLenum") int map, @NativeType("GLushort *") long data) { + nglGetPixelMapusv(map, data); + } + + // --- [ glGetPixelMapuiv ] --- + + /** Unsafe version of: {@link #glGetPixelMapuiv GetPixelMapuiv} */ + public static native void nglGetPixelMapuiv(int map, long data); + + /** + * Unsigned integer version of {@link #glGetPixelMapfv GetPixelMapfv}. + * + * @param map the pixel map parameter to query + * @param data a buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetPixelMapuiv(@NativeType("GLenum") int map, @NativeType("GLuint *") IntBuffer data) { + if (CHECKS) { + check(data, 32); + } + nglGetPixelMapuiv(map, memAddress(data)); + } + + /** + * Unsigned integer version of {@link #glGetPixelMapfv GetPixelMapfv}. + * + * @param map the pixel map parameter to query + * @param data a buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetPixelMapuiv(@NativeType("GLenum") int map, @NativeType("GLuint *") long data) { + nglGetPixelMapuiv(map, data); + } + + // --- [ glGetPointerv ] --- + + /** Unsafe version of: {@link #glGetPointerv GetPointerv} */ + public static void nglGetPointerv(int pname, long params) { + GL11C.nglGetPointerv(pname, params); + } + + /** + * Returns a pointer in the current GL context. + * + * @param pname the pointer to return. One of:
    {@link GL43#GL_DEBUG_CALLBACK_FUNCTION DEBUG_CALLBACK_FUNCTION}{@link GL43#GL_DEBUG_CALLBACK_USER_PARAM DEBUG_CALLBACK_USER_PARAM}
    + * @param params a buffer in which to place the returned pointer + * + * @see Reference Page + */ + public static void glGetPointerv(@NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer params) { + GL11C.glGetPointerv(pname, params); + } + + /** + * Returns a pointer in the current GL context. + * + * @param pname the pointer to return. One of:
    {@link GL43#GL_DEBUG_CALLBACK_FUNCTION DEBUG_CALLBACK_FUNCTION}{@link GL43#GL_DEBUG_CALLBACK_USER_PARAM DEBUG_CALLBACK_USER_PARAM}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetPointer(@NativeType("GLenum") int pname) { + return GL11C.glGetPointer(pname); + } + + // --- [ glGetPolygonStipple ] --- + + /** Unsafe version of: {@link #glGetPolygonStipple GetPolygonStipple} */ + public static native void nglGetPolygonStipple(long pattern); + + /** + * Obtains the polygon stipple. + * + * @param pattern a buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetPolygonStipple(@NativeType("void *") ByteBuffer pattern) { + if (CHECKS) { + check(pattern, 128); + } + nglGetPolygonStipple(memAddress(pattern)); + } + + /** + * Obtains the polygon stipple. + * + * @param pattern a buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetPolygonStipple(@NativeType("void *") long pattern) { + nglGetPolygonStipple(pattern); + } + + // --- [ glGetString ] --- + + /** Unsafe version of: {@link #glGetString GetString} */ + public static long nglGetString(int name) { + return GL11C.nglGetString(name); + } + + /** + * Return strings describing properties of the current GL context. + * + * @param name the property to query. One of:
    {@link GL11C#GL_RENDERER RENDERER}{@link GL11C#GL_VENDOR VENDOR}{@link GL11C#GL_EXTENSIONS EXTENSIONS}{@link GL11C#GL_VERSION VERSION}{@link GL20#GL_SHADING_LANGUAGE_VERSION SHADING_LANGUAGE_VERSION}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("GLubyte const *") + public static String glGetString(@NativeType("GLenum") int name) { + return GL11C.glGetString(name); + } + + // --- [ glGetTexEnviv ] --- + + /** Unsafe version of: {@link #glGetTexEnviv GetTexEnviv} */ + public static native void nglGetTexEnviv(int env, int pname, long data); + + /** + * Returns integer information about {@code pname} for {@code env} in {@code data}. + * + * @param env the texture environment to query. One of:
    {@link GL20#GL_POINT_SPRITE POINT_SPRITE}{@link #GL_TEXTURE_ENV TEXTURE_ENV}{@link GL14#GL_TEXTURE_FILTER_CONTROL TEXTURE_FILTER_CONTROL}
    + * @param pname the parameter to query. One of:
    {@link GL20#GL_COORD_REPLACE COORD_REPLACE}{@link #GL_TEXTURE_ENV_MODE TEXTURE_ENV_MODE}{@link #GL_TEXTURE_ENV_COLOR TEXTURE_ENV_COLOR}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL13#GL_COMBINE_RGB COMBINE_RGB}{@link GL13#GL_COMBINE_ALPHA COMBINE_ALPHA}
    {@link GL15#GL_SRC0_RGB SRC0_RGB}{@link GL15#GL_SRC1_RGB SRC1_RGB}{@link GL15#GL_SRC2_RGB SRC2_RGB}{@link GL15#GL_SRC0_ALPHA SRC0_ALPHA}{@link GL15#GL_SRC1_ALPHA SRC1_ALPHA}{@link GL15#GL_SRC2_ALPHA SRC2_ALPHA}
    {@link GL13#GL_OPERAND0_RGB OPERAND0_RGB}{@link GL13#GL_OPERAND1_RGB OPERAND1_RGB}{@link GL13#GL_OPERAND2_RGB OPERAND2_RGB}{@link GL13#GL_OPERAND0_ALPHA OPERAND0_ALPHA}{@link GL13#GL_OPERAND1_ALPHA OPERAND1_ALPHA}{@link GL13#GL_OPERAND2_ALPHA OPERAND2_ALPHA}
    {@link GL13#GL_RGB_SCALE RGB_SCALE}{@link #GL_ALPHA_SCALE ALPHA_SCALE}
    + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetTexEnviv(@NativeType("GLenum") int env, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer data) { + if (CHECKS) { + check(data, 1); + } + nglGetTexEnviv(env, pname, memAddress(data)); + } + + /** + * Returns integer information about {@code pname} for {@code env} in {@code data}. + * + * @param env the texture environment to query. One of:
    {@link GL20#GL_POINT_SPRITE POINT_SPRITE}{@link #GL_TEXTURE_ENV TEXTURE_ENV}{@link GL14#GL_TEXTURE_FILTER_CONTROL TEXTURE_FILTER_CONTROL}
    + * @param pname the parameter to query. One of:
    {@link GL20#GL_COORD_REPLACE COORD_REPLACE}{@link #GL_TEXTURE_ENV_MODE TEXTURE_ENV_MODE}{@link #GL_TEXTURE_ENV_COLOR TEXTURE_ENV_COLOR}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL13#GL_COMBINE_RGB COMBINE_RGB}{@link GL13#GL_COMBINE_ALPHA COMBINE_ALPHA}
    {@link GL15#GL_SRC0_RGB SRC0_RGB}{@link GL15#GL_SRC1_RGB SRC1_RGB}{@link GL15#GL_SRC2_RGB SRC2_RGB}{@link GL15#GL_SRC0_ALPHA SRC0_ALPHA}{@link GL15#GL_SRC1_ALPHA SRC1_ALPHA}{@link GL15#GL_SRC2_ALPHA SRC2_ALPHA}
    {@link GL13#GL_OPERAND0_RGB OPERAND0_RGB}{@link GL13#GL_OPERAND1_RGB OPERAND1_RGB}{@link GL13#GL_OPERAND2_RGB OPERAND2_RGB}{@link GL13#GL_OPERAND0_ALPHA OPERAND0_ALPHA}{@link GL13#GL_OPERAND1_ALPHA OPERAND1_ALPHA}{@link GL13#GL_OPERAND2_ALPHA OPERAND2_ALPHA}
    {@link GL13#GL_RGB_SCALE RGB_SCALE}{@link #GL_ALPHA_SCALE ALPHA_SCALE}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("void") + public static int glGetTexEnvi(@NativeType("GLenum") int env, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer data = stack.callocInt(1); + nglGetTexEnviv(env, pname, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexEnvfv ] --- + + /** Unsafe version of: {@link #glGetTexEnvfv GetTexEnvfv} */ + public static native void nglGetTexEnvfv(int env, int pname, long data); + + /** + * Float version of {@link #glGetTexEnviv GetTexEnviv}. + * + * @param env the texture environment to query + * @param pname the parameter to query + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetTexEnvfv(@NativeType("GLenum") int env, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer data) { + if (CHECKS) { + check(data, 1); + } + nglGetTexEnvfv(env, pname, memAddress(data)); + } + + /** + * Float version of {@link #glGetTexEnviv GetTexEnviv}. + * + * @param env the texture environment to query + * @param pname the parameter to query + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("void") + public static float glGetTexEnvf(@NativeType("GLenum") int env, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer data = stack.callocFloat(1); + nglGetTexEnvfv(env, pname, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexGeniv ] --- + + /** Unsafe version of: {@link #glGetTexGeniv GetTexGeniv} */ + public static native void nglGetTexGeniv(int coord, int pname, long data); + + /** + * Returns integer information about {@code pname} for {@code coord} in {@code data}. + * + * @param coord the coord to query. One of:
    {@link #GL_S S}{@link #GL_T T}{@link #GL_R R}{@link #GL_Q Q}
    + * @param pname the parameter to query. One of:
    {@link #GL_EYE_PLANE EYE_PLANE}{@link #GL_OBJECT_PLANE OBJECT_PLANE}{@link #GL_TEXTURE_GEN_MODE TEXTURE_GEN_MODE}
    + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetTexGeniv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer data) { + if (CHECKS) { + check(data, 1); + } + nglGetTexGeniv(coord, pname, memAddress(data)); + } + + /** + * Returns integer information about {@code pname} for {@code coord} in {@code data}. + * + * @param coord the coord to query. One of:
    {@link #GL_S S}{@link #GL_T T}{@link #GL_R R}{@link #GL_Q Q}
    + * @param pname the parameter to query. One of:
    {@link #GL_EYE_PLANE EYE_PLANE}{@link #GL_OBJECT_PLANE OBJECT_PLANE}{@link #GL_TEXTURE_GEN_MODE TEXTURE_GEN_MODE}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("void") + public static int glGetTexGeni(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer data = stack.callocInt(1); + nglGetTexGeniv(coord, pname, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexGenfv ] --- + + /** Unsafe version of: {@link #glGetTexGenfv GetTexGenfv} */ + public static native void nglGetTexGenfv(int coord, int pname, long data); + + /** + * Float version of {@link #glGetTexGeniv GetTexGeniv}. + * + * @param coord the coord to query + * @param pname the parameter to query + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetTexGenfv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer data) { + if (CHECKS) { + check(data, 4); + } + nglGetTexGenfv(coord, pname, memAddress(data)); + } + + /** + * Float version of {@link #glGetTexGeniv GetTexGeniv}. + * + * @param coord the coord to query + * @param pname the parameter to query + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("void") + public static float glGetTexGenf(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer data = stack.callocFloat(1); + nglGetTexGenfv(coord, pname, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexGendv ] --- + + /** Unsafe version of: {@link #glGetTexGendv GetTexGendv} */ + public static native void nglGetTexGendv(int coord, int pname, long data); + + /** + * Double version of {@link #glGetTexGeniv GetTexGeniv}. + * + * @param coord the coord to query + * @param pname the parameter to query + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetTexGendv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer data) { + if (CHECKS) { + check(data, 4); + } + nglGetTexGendv(coord, pname, memAddress(data)); + } + + /** + * Double version of {@link #glGetTexGeniv GetTexGeniv}. + * + * @param coord the coord to query + * @param pname the parameter to query + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("void") + public static double glGetTexGend(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer data = stack.callocDouble(1); + nglGetTexGendv(coord, pname, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexImage ] --- + + /** Unsafe version of: {@link #glGetTexImage GetTexImage} */ + public static void nglGetTexImage(int tex, int level, int format, int type, long pixels) { + GL11C.nglGetTexImage(tex, level, format, type, pixels); + } + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + GL11C.glGetTexImage(tex, level, format, type, pixels); + } + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") long pixels) { + GL11C.glGetTexImage(tex, level, format, type, pixels); + } + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + GL11C.glGetTexImage(tex, level, format, type, pixels); + } + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + GL11C.glGetTexImage(tex, level, format, type, pixels); + } + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + GL11C.glGetTexImage(tex, level, format, type, pixels); + } + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer pixels) { + GL11C.glGetTexImage(tex, level, format, type, pixels); + } + + // --- [ glGetTexLevelParameteriv ] --- + + /** Unsafe version of: {@link #glGetTexLevelParameteriv GetTexLevelParameteriv} */ + public static void nglGetTexLevelParameteriv(int target, int level, int pname, long params) { + GL11C.nglGetTexLevelParameteriv(target, level, pname, params); + } + + /** + * Places integer information about texture image parameter {@code pname} for level-of-detail {@code level} of the specified {@code target} into {@code params}. + * + * @param target the texture image target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11C#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}{@link GL11C#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param level the level-of-detail number + * @param pname the parameter to query. One of:
    {@link GL11C#GL_TEXTURE_WIDTH TEXTURE_WIDTH}{@link GL11C#GL_TEXTURE_HEIGHT TEXTURE_HEIGHT}{@link GL12#GL_TEXTURE_DEPTH TEXTURE_DEPTH}{@link GL32#GL_TEXTURE_SAMPLES TEXTURE_SAMPLES}
    {@link GL32#GL_TEXTURE_FIXED_SAMPLE_LOCATIONS TEXTURE_FIXED_SAMPLE_LOCATIONS}{@link GL11C#GL_TEXTURE_INTERNAL_FORMAT TEXTURE_INTERNAL_FORMAT}{@link GL11C#GL_TEXTURE_RED_SIZE TEXTURE_RED_SIZE}{@link GL11C#GL_TEXTURE_GREEN_SIZE TEXTURE_GREEN_SIZE}
    {@link GL11C#GL_TEXTURE_BLUE_SIZE TEXTURE_BLUE_SIZE}{@link GL11C#GL_TEXTURE_ALPHA_SIZE TEXTURE_ALPHA_SIZE}{@link GL14#GL_TEXTURE_DEPTH_SIZE TEXTURE_DEPTH_SIZE}{@link GL30#GL_TEXTURE_STENCIL_SIZE TEXTURE_STENCIL_SIZE}
    {@link GL30#GL_TEXTURE_SHARED_SIZE TEXTURE_SHARED_SIZE}{@link GL30#GL_TEXTURE_ALPHA_TYPE TEXTURE_ALPHA_TYPE}{@link GL30#GL_TEXTURE_DEPTH_TYPE TEXTURE_DEPTH_TYPE}{@link GL13#GL_TEXTURE_COMPRESSED TEXTURE_COMPRESSED}
    {@link GL13#GL_TEXTURE_COMPRESSED_IMAGE_SIZE TEXTURE_COMPRESSED_IMAGE_SIZE}{@link GL31#GL_TEXTURE_BUFFER_DATA_STORE_BINDING TEXTURE_BUFFER_DATA_STORE_BINDING}{@link GL43#GL_TEXTURE_BUFFER_OFFSET TEXTURE_BUFFER_OFFSET}{@link GL43#GL_TEXTURE_BUFFER_SIZE TEXTURE_BUFFER_SIZE}
    + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexLevelParameteriv(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL11C.glGetTexLevelParameteriv(target, level, pname, params); + } + + /** + * Places integer information about texture image parameter {@code pname} for level-of-detail {@code level} of the specified {@code target} into {@code params}. + * + * @param target the texture image target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11C#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}{@link GL11C#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param level the level-of-detail number + * @param pname the parameter to query. One of:
    {@link GL11C#GL_TEXTURE_WIDTH TEXTURE_WIDTH}{@link GL11C#GL_TEXTURE_HEIGHT TEXTURE_HEIGHT}{@link GL12#GL_TEXTURE_DEPTH TEXTURE_DEPTH}{@link GL32#GL_TEXTURE_SAMPLES TEXTURE_SAMPLES}
    {@link GL32#GL_TEXTURE_FIXED_SAMPLE_LOCATIONS TEXTURE_FIXED_SAMPLE_LOCATIONS}{@link GL11C#GL_TEXTURE_INTERNAL_FORMAT TEXTURE_INTERNAL_FORMAT}{@link GL11C#GL_TEXTURE_RED_SIZE TEXTURE_RED_SIZE}{@link GL11C#GL_TEXTURE_GREEN_SIZE TEXTURE_GREEN_SIZE}
    {@link GL11C#GL_TEXTURE_BLUE_SIZE TEXTURE_BLUE_SIZE}{@link GL11C#GL_TEXTURE_ALPHA_SIZE TEXTURE_ALPHA_SIZE}{@link GL14#GL_TEXTURE_DEPTH_SIZE TEXTURE_DEPTH_SIZE}{@link GL30#GL_TEXTURE_STENCIL_SIZE TEXTURE_STENCIL_SIZE}
    {@link GL30#GL_TEXTURE_SHARED_SIZE TEXTURE_SHARED_SIZE}{@link GL30#GL_TEXTURE_ALPHA_TYPE TEXTURE_ALPHA_TYPE}{@link GL30#GL_TEXTURE_DEPTH_TYPE TEXTURE_DEPTH_TYPE}{@link GL13#GL_TEXTURE_COMPRESSED TEXTURE_COMPRESSED}
    {@link GL13#GL_TEXTURE_COMPRESSED_IMAGE_SIZE TEXTURE_COMPRESSED_IMAGE_SIZE}{@link GL31#GL_TEXTURE_BUFFER_DATA_STORE_BINDING TEXTURE_BUFFER_DATA_STORE_BINDING}{@link GL43#GL_TEXTURE_BUFFER_OFFSET TEXTURE_BUFFER_OFFSET}{@link GL43#GL_TEXTURE_BUFFER_SIZE TEXTURE_BUFFER_SIZE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTexLevelParameteri(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + return GL11C.glGetTexLevelParameteri(target, level, pname); + } + + // --- [ glGetTexLevelParameterfv ] --- + + /** Unsafe version of: {@link #glGetTexLevelParameterfv GetTexLevelParameterfv} */ + public static void nglGetTexLevelParameterfv(int target, int level, int pname, long params) { + GL11C.nglGetTexLevelParameterfv(target, level, pname, params); + } + + /** + * Float version of {@link #glGetTexLevelParameteriv GetTexLevelParameteriv}. + * + * @param target the texture image target + * @param level the level-of-detail number + * @param pname the parameter to query + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexLevelParameterfv(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + GL11C.glGetTexLevelParameterfv(target, level, pname, params); + } + + /** + * Float version of {@link #glGetTexLevelParameteriv GetTexLevelParameteriv}. + * + * @param target the texture image target + * @param level the level-of-detail number + * @param pname the parameter to query + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetTexLevelParameterf(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + return GL11C.glGetTexLevelParameterf(target, level, pname); + } + + // --- [ glGetTexParameteriv ] --- + + /** Unsafe version of: {@link #glGetTexParameteriv GetTexParameteriv} */ + public static void nglGetTexParameteriv(int target, int pname, long params) { + GL11C.nglGetTexParameteriv(target, pname, params); + } + + /** + * Place integer information about texture parameter {@code pname} for the specified {@code target} into {@code params}. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param pname the parameter to query. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11C#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11C#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11C#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11C#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11C#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    {@link GL42#GL_IMAGE_FORMAT_COMPATIBILITY_TYPE IMAGE_FORMAT_COMPATIBILITY_TYPE}{@link GL42#GL_TEXTURE_IMMUTABLE_FORMAT TEXTURE_IMMUTABLE_FORMAT}{@link GL43#GL_TEXTURE_IMMUTABLE_LEVELS TEXTURE_IMMUTABLE_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LEVEL TEXTURE_VIEW_MIN_LEVEL}
    {@link GL43#GL_TEXTURE_VIEW_NUM_LEVELS TEXTURE_VIEW_NUM_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LAYER TEXTURE_VIEW_MIN_LAYER}{@link GL43#GL_TEXTURE_VIEW_NUM_LAYERS TEXTURE_VIEW_NUM_LAYERS}
    + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL11C.glGetTexParameteriv(target, pname, params); + } + + /** + * Place integer information about texture parameter {@code pname} for the specified {@code target} into {@code params}. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param pname the parameter to query. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11C#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11C#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11C#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11C#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11C#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    {@link GL42#GL_IMAGE_FORMAT_COMPATIBILITY_TYPE IMAGE_FORMAT_COMPATIBILITY_TYPE}{@link GL42#GL_TEXTURE_IMMUTABLE_FORMAT TEXTURE_IMMUTABLE_FORMAT}{@link GL43#GL_TEXTURE_IMMUTABLE_LEVELS TEXTURE_IMMUTABLE_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LEVEL TEXTURE_VIEW_MIN_LEVEL}
    {@link GL43#GL_TEXTURE_VIEW_NUM_LEVELS TEXTURE_VIEW_NUM_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LAYER TEXTURE_VIEW_MIN_LAYER}{@link GL43#GL_TEXTURE_VIEW_NUM_LAYERS TEXTURE_VIEW_NUM_LAYERS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTexParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL11C.glGetTexParameteri(target, pname); + } + + // --- [ glGetTexParameterfv ] --- + + /** Unsafe version of: {@link #glGetTexParameterfv GetTexParameterfv} */ + public static void nglGetTexParameterfv(int target, int pname, long params) { + GL11C.nglGetTexParameterfv(target, pname, params); + } + + /** + * Float version of {@link #glGetTexParameteriv GetTexParameteriv}. + * + * @param target the texture target + * @param pname the parameter to query + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + GL11C.glGetTexParameterfv(target, pname, params); + } + + /** + * Float version of {@link #glGetTexParameteriv GetTexParameteriv}. + * + * @param target the texture target + * @param pname the parameter to query + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetTexParameterf(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL11C.glGetTexParameterf(target, pname); + } + + // --- [ glHint ] --- + + /** + * Certain aspects of GL behavior, when there is room for variation, may be controlled with this function. The initial value for all hints is + * {@link GL11C#GL_DONT_CARE DONT_CARE}. + * + * @param target the behavior to control. One of:
    {@link GL11C#GL_LINE_SMOOTH_HINT LINE_SMOOTH_HINT}{@link GL11C#GL_POLYGON_SMOOTH_HINT POLYGON_SMOOTH_HINT}{@link GL13#GL_TEXTURE_COMPRESSION_HINT TEXTURE_COMPRESSION_HINT}
    {@link GL20#GL_FRAGMENT_SHADER_DERIVATIVE_HINT FRAGMENT_SHADER_DERIVATIVE_HINT}
    + * @param hint the behavior hint. One of:
    {@link GL11C#GL_FASTEST FASTEST}{@link GL11C#GL_NICEST NICEST}{@link GL11C#GL_DONT_CARE DONT_CARE}
    + * + * @see Reference Page + */ + public static void glHint(@NativeType("GLenum") int target, @NativeType("GLenum") int hint) { + GL11C.glHint(target, hint); + } + + // --- [ glIndexi ] --- + + /** + * Updates the current (single-valued) color index. + * + * @param index the value to which the current color index should be set + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glIndexi(@NativeType("GLint") int index); + + // --- [ glIndexub ] --- + + /** + * Unsigned byte version of {@link #glIndexi Indexi}. + * + * @param index the value to which the current color index should be set + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glIndexub(@NativeType("GLubyte") byte index); + + // --- [ glIndexs ] --- + + /** + * Short version of {@link #glIndexi Indexi}. + * + * @param index the value to which the current color index should be set + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glIndexs(@NativeType("GLshort") short index); + + // --- [ glIndexf ] --- + + /** + * Float version of {@link #glIndexi Indexi}. + * + * @param index the value to which the current color index should be set + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glIndexf(@NativeType("GLfloat") float index); + + // --- [ glIndexd ] --- + + /** + * Double version of {@link #glIndexi Indexi}. + * + * @param index the value to which the current color index should be set + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glIndexd(@NativeType("GLdouble") double index); + + // --- [ glIndexiv ] --- + + /** Unsafe version of: {@link #glIndexiv Indexiv} */ + public static native void nglIndexiv(long index); + + /** + * Pointer version of {@link #glIndexi Indexi} + * + * @param index the value to which the current color index should be set + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexiv(@NativeType("GLint const *") IntBuffer index) { + if (CHECKS) { + check(index, 1); + } + nglIndexiv(memAddress(index)); + } + + // --- [ glIndexubv ] --- + + /** Unsafe version of: {@link #glIndexubv Indexubv} */ + public static native void nglIndexubv(long index); + + /** + * Pointer version of {@link #glIndexub Indexub}. + * + * @param index the value to which the current color index should be set + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexubv(@NativeType("GLubyte const *") ByteBuffer index) { + if (CHECKS) { + check(index, 1); + } + nglIndexubv(memAddress(index)); + } + + // --- [ glIndexsv ] --- + + /** Unsafe version of: {@link #glIndexsv Indexsv} */ + public static native void nglIndexsv(long index); + + /** + * Pointer version of {@link #glIndexs Indexs}. + * + * @param index the value to which the current color index should be set + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexsv(@NativeType("GLshort const *") ShortBuffer index) { + if (CHECKS) { + check(index, 1); + } + nglIndexsv(memAddress(index)); + } + + // --- [ glIndexfv ] --- + + /** Unsafe version of: {@link #glIndexfv Indexfv} */ + public static native void nglIndexfv(long index); + + /** + * Pointer version of {@link #glIndexf Indexf}. + * + * @param index the value to which the current color index should be set + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexfv(@NativeType("GLfloat const *") FloatBuffer index) { + if (CHECKS) { + check(index, 1); + } + nglIndexfv(memAddress(index)); + } + + // --- [ glIndexdv ] --- + + /** Unsafe version of: {@link #glIndexdv Indexdv} */ + public static native void nglIndexdv(long index); + + /** + * Pointer version of {@link #glIndexd Indexd}. + * + * @param index the value to which the current color index should be set + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexdv(@NativeType("GLdouble const *") DoubleBuffer index) { + if (CHECKS) { + check(index, 1); + } + nglIndexdv(memAddress(index)); + } + + // --- [ glIndexMask ] --- + + /** + * The least significant n bits of mask, where n is the number of bits in a color index buffer, specify a mask. Where a 1 appears in this mask, the + * corresponding bit in the color index buffer (or buffers) is written; where a 0 appears, the bit is not written. This mask applies only in color index + * mode. + * + * @param mask the color index mask value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glIndexMask(@NativeType("GLuint") int mask); + + // --- [ glIndexPointer ] --- + + /** + * Unsafe version of: {@link #glIndexPointer IndexPointer} + * + * @param type the data type of the values stored in the array. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}
    + */ + public static native void nglIndexPointer(int type, int stride, long pointer); + + /** + * Specifies the location and organization of a color index array. + * + * @param type the data type of the values stored in the array. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the color index array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexPointer(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglIndexPointer(type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a color index array. + * + * @param type the data type of the values stored in the array. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the color index array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexPointer(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglIndexPointer(type, stride, pointer); + } + + /** + * Specifies the location and organization of a color index array. + * + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the color index array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexPointer(@NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglIndexPointer(GL11.GL_UNSIGNED_BYTE, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a color index array. + * + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the color index array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexPointer(@NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglIndexPointer(GL11.GL_SHORT, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a color index array. + * + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the color index array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexPointer(@NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglIndexPointer(GL11.GL_INT, stride, memAddress(pointer)); + } + + // --- [ glInitNames ] --- + + /** + * Clears the selection name stack. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glInitNames(); + + // --- [ glInterleavedArrays ] --- + + /** Unsafe version of: {@link #glInterleavedArrays InterleavedArrays} */ + public static native void nglInterleavedArrays(int format, int stride, long pointer); + + /** + * Efficiently initializes the six vertex arrays and their enables to one of 14 configurations. + * + * @param format the interleaved array format. One of:
    {@link #GL_V2F V2F}{@link #GL_V3F V3F}{@link #GL_C4UB_V2F C4UB_V2F}{@link #GL_C4UB_V3F C4UB_V3F}{@link #GL_C3F_V3F C3F_V3F}{@link #GL_N3F_V3F N3F_V3F}{@link #GL_C4F_N3F_V3F C4F_N3F_V3F}{@link #GL_T2F_V3F T2F_V3F}
    {@link #GL_T4F_V4F T4F_V4F}{@link #GL_T2F_C4UB_V3F T2F_C4UB_V3F}{@link #GL_T2F_C3F_V3F T2F_C3F_V3F}{@link #GL_T2F_N3F_V3F T2F_N3F_V3F}{@link #GL_T2F_C4F_N3F_V3F T2F_C4F_N3F_V3F}{@link #GL_T4F_C4F_N3F_V4F T4F_C4F_N3F_V4F}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the vertex array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glInterleavedArrays(@NativeType("GLenum") int format, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglInterleavedArrays(format, stride, memAddress(pointer)); + } + + /** + * Efficiently initializes the six vertex arrays and their enables to one of 14 configurations. + * + * @param format the interleaved array format. One of:
    {@link #GL_V2F V2F}{@link #GL_V3F V3F}{@link #GL_C4UB_V2F C4UB_V2F}{@link #GL_C4UB_V3F C4UB_V3F}{@link #GL_C3F_V3F C3F_V3F}{@link #GL_N3F_V3F N3F_V3F}{@link #GL_C4F_N3F_V3F C4F_N3F_V3F}{@link #GL_T2F_V3F T2F_V3F}
    {@link #GL_T4F_V4F T4F_V4F}{@link #GL_T2F_C4UB_V3F T2F_C4UB_V3F}{@link #GL_T2F_C3F_V3F T2F_C3F_V3F}{@link #GL_T2F_N3F_V3F T2F_N3F_V3F}{@link #GL_T2F_C4F_N3F_V3F T2F_C4F_N3F_V3F}{@link #GL_T4F_C4F_N3F_V4F T4F_C4F_N3F_V4F}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the vertex array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glInterleavedArrays(@NativeType("GLenum") int format, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglInterleavedArrays(format, stride, pointer); + } + + /** + * Efficiently initializes the six vertex arrays and their enables to one of 14 configurations. + * + * @param format the interleaved array format. One of:
    {@link #GL_V2F V2F}{@link #GL_V3F V3F}{@link #GL_C4UB_V2F C4UB_V2F}{@link #GL_C4UB_V3F C4UB_V3F}{@link #GL_C3F_V3F C3F_V3F}{@link #GL_N3F_V3F N3F_V3F}{@link #GL_C4F_N3F_V3F C4F_N3F_V3F}{@link #GL_T2F_V3F T2F_V3F}
    {@link #GL_T4F_V4F T4F_V4F}{@link #GL_T2F_C4UB_V3F T2F_C4UB_V3F}{@link #GL_T2F_C3F_V3F T2F_C3F_V3F}{@link #GL_T2F_N3F_V3F T2F_N3F_V3F}{@link #GL_T2F_C4F_N3F_V3F T2F_C4F_N3F_V3F}{@link #GL_T4F_C4F_N3F_V4F T4F_C4F_N3F_V4F}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the vertex array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glInterleavedArrays(@NativeType("GLenum") int format, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglInterleavedArrays(format, stride, memAddress(pointer)); + } + + /** + * Efficiently initializes the six vertex arrays and their enables to one of 14 configurations. + * + * @param format the interleaved array format. One of:
    {@link #GL_V2F V2F}{@link #GL_V3F V3F}{@link #GL_C4UB_V2F C4UB_V2F}{@link #GL_C4UB_V3F C4UB_V3F}{@link #GL_C3F_V3F C3F_V3F}{@link #GL_N3F_V3F N3F_V3F}{@link #GL_C4F_N3F_V3F C4F_N3F_V3F}{@link #GL_T2F_V3F T2F_V3F}
    {@link #GL_T4F_V4F T4F_V4F}{@link #GL_T2F_C4UB_V3F T2F_C4UB_V3F}{@link #GL_T2F_C3F_V3F T2F_C3F_V3F}{@link #GL_T2F_N3F_V3F T2F_N3F_V3F}{@link #GL_T2F_C4F_N3F_V3F T2F_C4F_N3F_V3F}{@link #GL_T4F_C4F_N3F_V4F T4F_C4F_N3F_V4F}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the vertex array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glInterleavedArrays(@NativeType("GLenum") int format, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglInterleavedArrays(format, stride, memAddress(pointer)); + } + + /** + * Efficiently initializes the six vertex arrays and their enables to one of 14 configurations. + * + * @param format the interleaved array format. One of:
    {@link #GL_V2F V2F}{@link #GL_V3F V3F}{@link #GL_C4UB_V2F C4UB_V2F}{@link #GL_C4UB_V3F C4UB_V3F}{@link #GL_C3F_V3F C3F_V3F}{@link #GL_N3F_V3F N3F_V3F}{@link #GL_C4F_N3F_V3F C4F_N3F_V3F}{@link #GL_T2F_V3F T2F_V3F}
    {@link #GL_T4F_V4F T4F_V4F}{@link #GL_T2F_C4UB_V3F T2F_C4UB_V3F}{@link #GL_T2F_C3F_V3F T2F_C3F_V3F}{@link #GL_T2F_N3F_V3F T2F_N3F_V3F}{@link #GL_T2F_C4F_N3F_V3F T2F_C4F_N3F_V3F}{@link #GL_T4F_C4F_N3F_V4F T4F_C4F_N3F_V4F}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the vertex array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glInterleavedArrays(@NativeType("GLenum") int format, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglInterleavedArrays(format, stride, memAddress(pointer)); + } + + /** + * Efficiently initializes the six vertex arrays and their enables to one of 14 configurations. + * + * @param format the interleaved array format. One of:
    {@link #GL_V2F V2F}{@link #GL_V3F V3F}{@link #GL_C4UB_V2F C4UB_V2F}{@link #GL_C4UB_V3F C4UB_V3F}{@link #GL_C3F_V3F C3F_V3F}{@link #GL_N3F_V3F N3F_V3F}{@link #GL_C4F_N3F_V3F C4F_N3F_V3F}{@link #GL_T2F_V3F T2F_V3F}
    {@link #GL_T4F_V4F T4F_V4F}{@link #GL_T2F_C4UB_V3F T2F_C4UB_V3F}{@link #GL_T2F_C3F_V3F T2F_C3F_V3F}{@link #GL_T2F_N3F_V3F T2F_N3F_V3F}{@link #GL_T2F_C4F_N3F_V3F T2F_C4F_N3F_V3F}{@link #GL_T4F_C4F_N3F_V4F T4F_C4F_N3F_V4F}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the vertex array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glInterleavedArrays(@NativeType("GLenum") int format, @NativeType("GLsizei") int stride, @NativeType("void const *") DoubleBuffer pointer) { + nglInterleavedArrays(format, stride, memAddress(pointer)); + } + + // --- [ glIsEnabled ] --- + + /** + * Determines if {@code cap} is currently enabled (as with {@link #glEnable Enable}) or disabled. + * + * @param cap the enable state to query + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsEnabled(@NativeType("GLenum") int cap) { + return GL11C.glIsEnabled(cap); + } + + // --- [ glIsList ] --- + + /** + * Returns true if the {@code list} is the index of some display list. + * + * @param list the list index to query + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("GLboolean") + public static native boolean glIsList(@NativeType("GLuint") int list); + + // --- [ glIsTexture ] --- + + /** + * Returns true if {@code texture} is the name of a texture object. + * + * @param texture the texture name to query + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsTexture(@NativeType("GLuint") int texture) { + return GL11C.glIsTexture(texture); + } + + // --- [ glLightModeli ] --- + + /** + * Set the integer value of a lighting model parameter. + * + * @param pname the lighting model parameter to set. One of:
    {@link #GL_LIGHT_MODEL_AMBIENT LIGHT_MODEL_AMBIENT}{@link #GL_LIGHT_MODEL_LOCAL_VIEWER LIGHT_MODEL_LOCAL_VIEWER}{@link #GL_LIGHT_MODEL_TWO_SIDE LIGHT_MODEL_TWO_SIDE}
    {@link GL12#GL_LIGHT_MODEL_COLOR_CONTROL LIGHT_MODEL_COLOR_CONTROL}
    + * @param param the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glLightModeli(@NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glLightModelf ] --- + + /** + * Float version of {@link #glLightModeli LightModeli}. + * + * @param pname the lighting model parameter to set + * @param param the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glLightModelf(@NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glLightModeliv ] --- + + /** Unsafe version of: {@link #glLightModeliv LightModeliv} */ + public static native void nglLightModeliv(int pname, long params); + + /** + * Pointer version of {@link #glLightModeli LightModeli}. + * + * @param pname the lighting model parameter to set + * @param params the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLightModeliv(@NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglLightModeliv(pname, memAddress(params)); + } + + // --- [ glLightModelfv ] --- + + /** Unsafe version of: {@link #glLightModelfv LightModelfv} */ + public static native void nglLightModelfv(int pname, long params); + + /** + * Pointer version of {@link #glLightModelf LightModelf}. + * + * @param pname the lighting model parameter to set + * @param params the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLightModelfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglLightModelfv(pname, memAddress(params)); + } + + // --- [ glLighti ] --- + + /** + * Sets the integer value of a light parameter. + * + * @param light the light for which to set the parameter. One of:
    {@link #GL_LIGHT0 LIGHT0}GL_LIGHT[1-7]
    + * @param pname the parameter to set. One of:
    {@link #GL_AMBIENT AMBIENT}{@link #GL_DIFFUSE DIFFUSE}{@link #GL_SPECULAR SPECULAR}{@link #GL_POSITION POSITION}{@link #GL_CONSTANT_ATTENUATION CONSTANT_ATTENUATION}{@link #GL_LINEAR_ATTENUATION LINEAR_ATTENUATION}
    {@link #GL_QUADRATIC_ATTENUATION QUADRATIC_ATTENUATION}{@link #GL_SPOT_DIRECTION SPOT_DIRECTION}{@link #GL_SPOT_EXPONENT SPOT_EXPONENT}{@link #GL_SPOT_CUTOFF SPOT_CUTOFF}
    + * @param param the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glLighti(@NativeType("GLenum") int light, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glLightf ] --- + + /** + * Float version of {@link #glLighti Lighti}. + * + * @param light the light for which to set the parameter + * @param pname the parameter to set + * @param param the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glLightf(@NativeType("GLenum") int light, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glLightiv ] --- + + /** Unsafe version of: {@link #glLightiv Lightiv} */ + public static native void nglLightiv(int light, int pname, long params); + + /** + * Pointer version of {@link #glLighti Lighti}. + * + * @param light the light for which to set the parameter + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLightiv(@NativeType("GLenum") int light, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglLightiv(light, pname, memAddress(params)); + } + + // --- [ glLightfv ] --- + + /** Unsafe version of: {@link #glLightfv Lightfv} */ + public static native void nglLightfv(int light, int pname, long params); + + /** + * Pointer version of {@link #glLightf Lightf}. + * + * @param light the light for which to set the parameter + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLightfv(@NativeType("GLenum") int light, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglLightfv(light, pname, memAddress(params)); + } + + // --- [ glLineStipple ] --- + + /** + * Defines a line stipple. It determines those fragments that are to be drawn when the line is rasterized. Line stippling may be enabled or disabled using + * {@link #glEnable Enable} or {@link #glDisable Disable} with the constant {@link #GL_LINE_STIPPLE LINE_STIPPLE}. When disabled, it is as if the line stipple has its default value. + * + * @param factor a count that is used to modify the effective line stipple by causing each bit in pattern to be used {@code factor} times. {@code factor} is clamped + * to the range [1, 256]. + * @param pattern an unsigned short integer whose 16 bits define the stipple pattern + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glLineStipple(@NativeType("GLint") int factor, @NativeType("GLushort") short pattern); + + // --- [ glLineWidth ] --- + + /** + * Sets the width of rasterized line segments. The default width is 1.0. + * + * @param width the line width + * + * @see Reference Page + */ + public static void glLineWidth(@NativeType("GLfloat") float width) { + GL11C.glLineWidth(width); + } + + // --- [ glListBase ] --- + + /** + * Sets the display list base. + * + * @param base the display list base offset + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glListBase(@NativeType("GLuint") int base); + + // --- [ glLoadMatrixf ] --- + + /** Unsafe version of: {@link #glLoadMatrixf LoadMatrixf} */ + public static native void nglLoadMatrixf(long m); + + /** + * Sets the current matrix to a 4 × 4 matrix in column-major order. + * + *

    The matrix is stored as 16 consecutive values, i.e. as:

    + * + * + * + * + * + * + *
    a1a5a9a13
    a2a6a10a14
    a3a7a11a15
    a4a8a12a16
    + * + *

    This differs from the standard row-major ordering for matrix elements. If the standard ordering is used, all of the subsequent transformation equations + * are transposed, and the columns representing vectors become rows.

    + * + * @param m the matrix data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLoadMatrixf(@NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglLoadMatrixf(memAddress(m)); + } + + // --- [ glLoadMatrixd ] --- + + /** Unsafe version of: {@link #glLoadMatrixd LoadMatrixd} */ + public static native void nglLoadMatrixd(long m); + + /** + * Double version of {@link #glLoadMatrixf LoadMatrixf}. + * + * @param m the matrix data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLoadMatrixd(@NativeType("GLdouble const *") DoubleBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglLoadMatrixd(memAddress(m)); + } + + // --- [ glLoadIdentity ] --- + + /** + * Sets the current matrix to the identity matrix. + * + *

    Calling this function is equivalent to calling {@link #glLoadMatrixf LoadMatrixf} with the following matrix:

    + * + * + * + * + * + * + *
    1000
    0100
    0010
    0001
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glLoadIdentity(); + + // --- [ glLoadName ] --- + + /** + * Replaces the value on the top of the selection stack with {@code name}. + * + * @param name the name to load + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glLoadName(@NativeType("GLuint") int name); + + // --- [ glLogicOp ] --- + + /** + * Sets the logical framebuffer operation. + * + * @param op the operation to set. One of:
    {@link GL11C#GL_CLEAR CLEAR}{@link GL11C#GL_AND AND}{@link GL11C#GL_AND_REVERSE AND_REVERSE}{@link GL11C#GL_COPY COPY}{@link GL11C#GL_AND_INVERTED AND_INVERTED}{@link GL11C#GL_NOOP NOOP}{@link GL11C#GL_XOR XOR}{@link GL11C#GL_OR OR}{@link GL11C#GL_NOR NOR}{@link GL11C#GL_EQUIV EQUIV}{@link GL11C#GL_INVERT INVERT}{@link GL11C#GL_OR_REVERSE OR_REVERSE}{@link GL11C#GL_COPY_INVERTED COPY_INVERTED}
    {@link GL11C#GL_OR_INVERTED OR_INVERTED}{@link GL11C#GL_NAND NAND}{@link GL11C#GL_SET SET}
    + * + * @see Reference Page + */ + public static void glLogicOp(@NativeType("GLenum") int op) { + GL11C.glLogicOp(op); + } + + // --- [ glMap1f ] --- + + /** Unsafe version of: {@link #glMap1f Map1f} */ + public static native void nglMap1f(int target, float u1, float u2, int stride, int order, long points); + + /** + * Defines a polynomial or rational polynomial mapping to produce vertex, normal, texture coordinates and colors. The values so produced are sent on to + * further stages of the GL as if they had been provided directly by the client. + * + * @param target the evaluator target. One of:
    {@link #GL_MAP1_VERTEX_3 MAP1_VERTEX_3}{@link #GL_MAP1_VERTEX_4 MAP1_VERTEX_4}{@link #GL_MAP1_COLOR_4 MAP1_COLOR_4}{@link #GL_MAP1_NORMAL MAP1_NORMAL}{@link #GL_MAP1_TEXTURE_COORD_1 MAP1_TEXTURE_COORD_1}
    {@link #GL_MAP1_TEXTURE_COORD_2 MAP1_TEXTURE_COORD_2}{@link #GL_MAP1_TEXTURE_COORD_3 MAP1_TEXTURE_COORD_3}{@link #GL_MAP1_TEXTURE_COORD_4 MAP1_TEXTURE_COORD_4}
    + * @param u1 the first endpoint of the pre-image of the map + * @param u2 the second endpoint of the pre-image of the map + * @param stride the number of values in each block of storage + * @param order the polynomial order + * @param points a set of {@code order} blocks of storage containing control points + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMap1f(@NativeType("GLenum") int target, @NativeType("GLfloat") float u1, @NativeType("GLfloat") float u2, @NativeType("GLint") int stride, @NativeType("GLint") int order, @NativeType("GLfloat const *") FloatBuffer points) { + if (CHECKS) { + check(points, order * stride); + } + nglMap1f(target, u1, u2, stride, order, memAddress(points)); + } + + // --- [ glMap1d ] --- + + /** Unsafe version of: {@link #glMap1d Map1d} */ + public static native void nglMap1d(int target, double u1, double u2, int stride, int order, long points); + + /** + * Double version of {@link #glMap1f Map1f}. + * + * @param target the evaluator target + * @param u1 the first endpoint of the pre-image of the map + * @param u2 the second endpoint of the pre-image of the map + * @param stride the number of values in each block of storage + * @param order the polynomial order + * @param points a set of {@code order} blocks of storage containing control points + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMap1d(@NativeType("GLenum") int target, @NativeType("GLdouble") double u1, @NativeType("GLdouble") double u2, @NativeType("GLint") int stride, @NativeType("GLint") int order, @NativeType("GLdouble const *") DoubleBuffer points) { + if (CHECKS) { + check(points, stride * order); + } + nglMap1d(target, u1, u2, stride, order, memAddress(points)); + } + + // --- [ glMap2f ] --- + + /** Unsafe version of: {@link #glMap2f Map2f} */ + public static native void nglMap2f(int target, float u1, float u2, int ustride, int uorder, float v1, float v2, int vstride, int vorder, long points); + + /** + * Bivariate version of {@link #glMap1f Map1f}. + * + * @param target the evaluator target + * @param u1 the first u-dimension endpoint of the pre-image rectangle of the map + * @param u2 the second u-dimension endpoint of the pre-image rectangle of the map + * @param ustride the number of values in the u-dimension in each block of storage + * @param uorder the polynomial order in the u-dimension + * @param v1 the first v-dimension endpoint of the pre-image rectangle of the map + * @param v2 the second v-dimension endpoint of the pre-image rectangle of the map + * @param vstride the number of values in the v-dimension in each block of storage + * @param vorder the polynomial order in the v-dimension + * @param points a set of uorder × vorder blocks of storage containing control points + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMap2f(@NativeType("GLenum") int target, @NativeType("GLfloat") float u1, @NativeType("GLfloat") float u2, @NativeType("GLint") int ustride, @NativeType("GLint") int uorder, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2, @NativeType("GLint") int vstride, @NativeType("GLint") int vorder, @NativeType("GLfloat const *") FloatBuffer points) { + if (CHECKS) { + check(points, ustride * uorder * vstride * vorder); + } + nglMap2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, memAddress(points)); + } + + // --- [ glMap2d ] --- + + /** Unsafe version of: {@link #glMap2d Map2d} */ + public static native void nglMap2d(int target, double u1, double u2, int ustride, int uorder, double v1, double v2, int vstride, int vorder, long points); + + /** + * Double version of {@link #glMap2f Map2f}. + * + * @param target the evaluator target + * @param u1 the first u-dimension endpoint of the pre-image rectangle of the map + * @param u2 the second u-dimension endpoint of the pre-image rectangle of the map + * @param ustride the number of values in the u-dimension in each block of storage + * @param uorder the polynomial order in the u-dimension + * @param v1 the first v-dimension endpoint of the pre-image rectangle of the map + * @param v2 the second v-dimension endpoint of the pre-image rectangle of the map + * @param vstride the number of values in the v-dimension in each block of storage + * @param vorder the polynomial order in the v-dimension + * @param points a set of uorder × vorder blocks of storage containing control points + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMap2d(@NativeType("GLenum") int target, @NativeType("GLdouble") double u1, @NativeType("GLdouble") double u2, @NativeType("GLint") int ustride, @NativeType("GLint") int uorder, @NativeType("GLdouble") double v1, @NativeType("GLdouble") double v2, @NativeType("GLint") int vstride, @NativeType("GLint") int vorder, @NativeType("GLdouble const *") DoubleBuffer points) { + if (CHECKS) { + check(points, ustride * uorder * vstride * vorder); + } + nglMap2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, memAddress(points)); + } + + // --- [ glMapGrid1f ] --- + + /** + * Defines a one-dimensional grid in the map evaluator domain. + * + * @param n the number of partitions of the interval + * @param u1 the first interval endpoint + * @param u2 the second interval endpoint + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMapGrid1f(@NativeType("GLint") int n, @NativeType("GLfloat") float u1, @NativeType("GLfloat") float u2); + + // --- [ glMapGrid1d ] --- + + /** + * Double version of {@link #glMapGrid1f MapGrid1f}. + * + * @param n the number of partitions of the interval + * @param u1 the first interval endpoint + * @param u2 the second interval endpoint + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMapGrid1d(@NativeType("GLint") int n, @NativeType("GLdouble") double u1, @NativeType("GLdouble") double u2); + + // --- [ glMapGrid2f ] --- + + /** + * Defines a two-dimensional grid in the map evaluator domain. + * + * @param un the number of partitions of the interval in the u-dimension + * @param u1 the first u-dimension interval endpoint + * @param u2 the second u-dimension interval endpoint + * @param vn the number of partitions of the interval in the v-dimension + * @param v1 the first v-dimension interval endpoint + * @param v2 the second v-dimension interval endpoint + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMapGrid2f(@NativeType("GLint") int un, @NativeType("GLfloat") float u1, @NativeType("GLfloat") float u2, @NativeType("GLint") int vn, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2); + + // --- [ glMapGrid2d ] --- + + /** + * Double version of {@link #glMapGrid2f MapGrid2f}. + * + * @param un the number of partitions of the interval in the u-dimension + * @param u1 the first u-dimension interval endpoint + * @param u2 the second u-dimension interval endpoint + * @param vn the number of partitions of the interval in the v-dimension + * @param v1 the first v-dimension interval endpoint + * @param v2 the second v-dimension interval endpoint + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMapGrid2d(@NativeType("GLint") int un, @NativeType("GLdouble") double u1, @NativeType("GLdouble") double u2, @NativeType("GLint") int vn, @NativeType("GLdouble") double v1, @NativeType("GLdouble") double v2); + + // --- [ glMateriali ] --- + + /** + * Sets the integer value of a material parameter. + * + * @param face the material face for which to set the parameter. One of:
    {@link #GL_FRONT FRONT}{@link #GL_BACK BACK}{@link #GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param pname the parameter to set. Must be:
    {@link #GL_SHININESS SHININESS}
    + * @param param the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMateriali(@NativeType("GLenum") int face, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glMaterialf ] --- + + /** + * Float version of {@link #glMateriali Materiali}. + * + * @param face the material face for which to set the parameter + * @param pname the parameter to set + * @param param the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMaterialf(@NativeType("GLenum") int face, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glMaterialiv ] --- + + /** Unsafe version of: {@link #glMaterialiv Materialiv} */ + public static native void nglMaterialiv(int face, int pname, long params); + + /** + * Pointer version of {@link #glMateriali Materiali}. + * + * @param face the material face for which to set the parameter + * @param pname the parameter to set. One of:
    {@link #GL_AMBIENT AMBIENT}{@link #GL_DIFFUSE DIFFUSE}{@link #GL_AMBIENT_AND_DIFFUSE AMBIENT_AND_DIFFUSE}{@link #GL_SPECULAR SPECULAR}{@link #GL_EMISSION EMISSION}
    + * @param params the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMaterialiv(@NativeType("GLenum") int face, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglMaterialiv(face, pname, memAddress(params)); + } + + // --- [ glMaterialfv ] --- + + /** Unsafe version of: {@link #glMaterialfv Materialfv} */ + public static native void nglMaterialfv(int face, int pname, long params); + + /** + * Pointer version of {@link #glMaterialf Materialf}. + * + * @param face the material face for which to set the parameter + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMaterialfv(@NativeType("GLenum") int face, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglMaterialfv(face, pname, memAddress(params)); + } + + // --- [ glMatrixMode ] --- + + /** + * Set the current matrix mode. + * + * @param mode the matrix mode. One of:
    {@link #GL_MODELVIEW MODELVIEW}{@link #GL_PROJECTION PROJECTION}{@link #GL_TEXTURE TEXTURE}{@link #GL_COLOR COLOR}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMatrixMode(@NativeType("GLenum") int mode); + + // --- [ glMultMatrixf ] --- + + /** Unsafe version of: {@link #glMultMatrixf MultMatrixf} */ + public static native void nglMultMatrixf(long m); + + /** + * Multiplies the current matrix with a 4 × 4 matrix in column-major order. See {@link #glLoadMatrixf LoadMatrixf} for details. + * + * @param m the matrix data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultMatrixf(@NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMultMatrixf(memAddress(m)); + } + + // --- [ glMultMatrixd ] --- + + /** Unsafe version of: {@link #glMultMatrixd MultMatrixd} */ + public static native void nglMultMatrixd(long m); + + /** + * Double version of {@link #glMultMatrixf MultMatrixf}. + * + * @param m the matrix data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultMatrixd(@NativeType("GLdouble const *") DoubleBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMultMatrixd(memAddress(m)); + } + + // --- [ glFrustum ] --- + + /** + * Manipulates the current matrix with a matrix that produces perspective projection, in such a way that the coordinates (lb – n)T + * and (rt – n)T specify the points on the near clipping plane that are mapped to the lower left and upper right corners of the + * window, respectively (assuming that the eye is located at (0 0 0)T). {@code f} gives the distance from the eye to the far clipping + * plane. + * + *

    Calling this function is equivalent to calling {@link #glMultMatrixf MultMatrixf} with the following matrix:

    + * + * + * + * + * + * + *
    2n / (r - l)0(r + l) / (r - l)0
    02n / (t - b)(t + b) / (t - b)0
    00- (f + n) / (f - n)- (2fn) / (f - n)
    00-10
    + * + * @param l the left frustum plane + * @param r the right frustum plane + * @param b the bottom frustum plane + * @param t the top frustum plane + * @param n the near frustum plane + * @param f the far frustum plane + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glFrustum(@NativeType("GLdouble") double l, @NativeType("GLdouble") double r, @NativeType("GLdouble") double b, @NativeType("GLdouble") double t, @NativeType("GLdouble") double n, @NativeType("GLdouble") double f); + + // --- [ glNewList ] --- + + /** + * Begins the definition of a display list. + * + * @param n a positive integer to which the display list that follows is assigned + * @param mode a symbolic constant that controls the behavior of the GL during display list creation. One of:
    {@link #GL_COMPILE COMPILE}{@link #GL_COMPILE_AND_EXECUTE COMPILE_AND_EXECUTE}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glNewList(@NativeType("GLuint") int n, @NativeType("GLenum") int mode); + + // --- [ glEndList ] --- + + /** + * Ends the definition of GL commands to be placed in a display list. It is only when {@code EndList} occurs that the specified display list is actually + * associated with the index indicated with {@link #glNewList NewList}. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glEndList(); + + // --- [ glNormal3f ] --- + + /** + * Sets the current normal. + * + * @param nx the x coordinate of the current normal + * @param ny the y coordinate of the current normal + * @param nz the z coordinate of the current normal + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glNormal3f(@NativeType("GLfloat") float nx, @NativeType("GLfloat") float ny, @NativeType("GLfloat") float nz); + + // --- [ glNormal3b ] --- + + /** + * Byte version of {@link #glNormal3f Normal3f}. + * + * @param nx the x coordinate of the current normal + * @param ny the y coordinate of the current normal + * @param nz the z coordinate of the current normal + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glNormal3b(@NativeType("GLbyte") byte nx, @NativeType("GLbyte") byte ny, @NativeType("GLbyte") byte nz); + + // --- [ glNormal3s ] --- + + /** + * Short version of {@link #glNormal3f Normal3f}. + * + * @param nx the x coordinate of the current normal + * @param ny the y coordinate of the current normal + * @param nz the z coordinate of the current normal + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glNormal3s(@NativeType("GLshort") short nx, @NativeType("GLshort") short ny, @NativeType("GLshort") short nz); + + // --- [ glNormal3i ] --- + + /** + * Integer version of {@link #glNormal3f Normal3f}. + * + * @param nx the x coordinate of the current normal + * @param ny the y coordinate of the current normal + * @param nz the z coordinate of the current normal + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glNormal3i(@NativeType("GLint") int nx, @NativeType("GLint") int ny, @NativeType("GLint") int nz); + + // --- [ glNormal3d ] --- + + /** + * Double version of {@link #glNormal3f Normal3f}. + * + * @param nx the x coordinate of the current normal + * @param ny the y coordinate of the current normal + * @param nz the z coordinate of the current normal + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glNormal3d(@NativeType("GLdouble") double nx, @NativeType("GLdouble") double ny, @NativeType("GLdouble") double nz); + + // --- [ glNormal3fv ] --- + + /** Unsafe version of: {@link #glNormal3fv Normal3fv} */ + public static native void nglNormal3fv(long v); + + /** + * Pointer version of {@link #glNormal3f Normal3f}. + * + * @param v the normal buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormal3fv(@NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglNormal3fv(memAddress(v)); + } + + // --- [ glNormal3bv ] --- + + /** Unsafe version of: {@link #glNormal3bv Normal3bv} */ + public static native void nglNormal3bv(long v); + + /** + * Pointer version of {@link #glNormal3b Normal3b}. + * + * @param v the normal buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormal3bv(@NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglNormal3bv(memAddress(v)); + } + + // --- [ glNormal3sv ] --- + + /** Unsafe version of: {@link #glNormal3sv Normal3sv} */ + public static native void nglNormal3sv(long v); + + /** + * Pointer version of {@link #glNormal3s Normal3s}. + * + * @param v the normal buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormal3sv(@NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglNormal3sv(memAddress(v)); + } + + // --- [ glNormal3iv ] --- + + /** Unsafe version of: {@link #glNormal3iv Normal3iv} */ + public static native void nglNormal3iv(long v); + + /** + * Pointer version of {@link #glNormal3i Normal3i}. + * + * @param v the normal buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormal3iv(@NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglNormal3iv(memAddress(v)); + } + + // --- [ glNormal3dv ] --- + + /** Unsafe version of: {@link #glNormal3dv Normal3dv} */ + public static native void nglNormal3dv(long v); + + /** + * Pointer version of {@link #glNormal3d Normal3d}. + * + * @param v the normal buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormal3dv(@NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglNormal3dv(memAddress(v)); + } + + // --- [ glNormalPointer ] --- + + /** Unsafe version of: {@link #glNormalPointer NormalPointer} */ + public static native void nglNormalPointer(int type, int stride, long pointer); + + /** + * Specifies the location and organization of a normal array. + * + * @param type the data type of the values stored in the array. One of:
    {@link #GL_BYTE BYTE}{@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the normal array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormalPointer(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglNormalPointer(type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a normal array. + * + * @param type the data type of the values stored in the array. One of:
    {@link #GL_BYTE BYTE}{@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the normal array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormalPointer(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglNormalPointer(type, stride, pointer); + } + + /** + * Specifies the location and organization of a normal array. + * + * @param type the data type of the values stored in the array. One of:
    {@link #GL_BYTE BYTE}{@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the normal array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormalPointer(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglNormalPointer(type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a normal array. + * + * @param type the data type of the values stored in the array. One of:
    {@link #GL_BYTE BYTE}{@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the normal array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormalPointer(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglNormalPointer(type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a normal array. + * + * @param type the data type of the values stored in the array. One of:
    {@link #GL_BYTE BYTE}{@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the normal array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormalPointer(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglNormalPointer(type, stride, memAddress(pointer)); + } + + // --- [ glOrtho ] --- + + /** + * Manipulates the current matrix with a matrix that produces parallel projection, in such a way that the coordinates (lb – n)T + * and (rt – n)T specify the points on the near clipping plane that are mapped to the lower left and upper right corners of the + * window, respectively (assuming that the eye is located at (0 0 0)T). {@code f} gives the distance from the eye to the far clipping + * plane. + * + *

    Calling this function is equivalent to calling {@link #glMultMatrixf MultMatrixf} with the following matrix:

    + * + * + * + * + * + * + *
    2 / (r - l)00- (r + l) / (r - l)
    02 / (t - b)0- (t + b) / (t - b)
    00- 2 / (f - n)- (f + n) / (f - n)
    0001
    + * + * @param l the left frustum plane + * @param r the right frustum plane + * @param b the bottom frustum plane + * @param t the top frustum plane + * @param n the near frustum plane + * @param f the far frustum plane + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glOrtho(@NativeType("GLdouble") double l, @NativeType("GLdouble") double r, @NativeType("GLdouble") double b, @NativeType("GLdouble") double t, @NativeType("GLdouble") double n, @NativeType("GLdouble") double f); + + // --- [ glPassThrough ] --- + + /** + * Inserts a marker when the GL is in feeback mode. {@code token} is returned as if it were a primitive; it is indicated with its own unique identifying + * value. The ordering of any {@code PassThrough} commands with respect to primitive specification is maintained by feedback. {@code PassThrough} may + * not occur between {@link #glBegin Begin} and {@link #glEnd End}. + * + * @param token the marker value to insert + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPassThrough(@NativeType("GLfloat") float token); + + // --- [ glPixelMapfv ] --- + + /** + * Unsafe version of: {@link #glPixelMapfv PixelMapfv} + * + * @param size the map size + */ + public static native void nglPixelMapfv(int map, int size, long values); + + /** + * Sets a pixel map lookup table. + * + * @param map the map to set. One of:
    {@link #GL_PIXEL_MAP_I_TO_I PIXEL_MAP_I_TO_I}{@link #GL_PIXEL_MAP_S_TO_S PIXEL_MAP_S_TO_S}{@link #GL_PIXEL_MAP_I_TO_R PIXEL_MAP_I_TO_R}{@link #GL_PIXEL_MAP_I_TO_G PIXEL_MAP_I_TO_G}{@link #GL_PIXEL_MAP_I_TO_B PIXEL_MAP_I_TO_B}
    {@link #GL_PIXEL_MAP_I_TO_A PIXEL_MAP_I_TO_A}{@link #GL_PIXEL_MAP_R_TO_R PIXEL_MAP_R_TO_R}{@link #GL_PIXEL_MAP_G_TO_G PIXEL_MAP_G_TO_G}{@link #GL_PIXEL_MAP_B_TO_B PIXEL_MAP_B_TO_B}{@link #GL_PIXEL_MAP_A_TO_A PIXEL_MAP_A_TO_A}
    + * @param size the map size + * @param values the map values + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPixelMapfv(@NativeType("GLenum") int map, @NativeType("GLsizei") int size, @NativeType("GLfloat const *") long values) { + nglPixelMapfv(map, size, values); + } + + /** + * Sets a pixel map lookup table. + * + * @param map the map to set. One of:
    {@link #GL_PIXEL_MAP_I_TO_I PIXEL_MAP_I_TO_I}{@link #GL_PIXEL_MAP_S_TO_S PIXEL_MAP_S_TO_S}{@link #GL_PIXEL_MAP_I_TO_R PIXEL_MAP_I_TO_R}{@link #GL_PIXEL_MAP_I_TO_G PIXEL_MAP_I_TO_G}{@link #GL_PIXEL_MAP_I_TO_B PIXEL_MAP_I_TO_B}
    {@link #GL_PIXEL_MAP_I_TO_A PIXEL_MAP_I_TO_A}{@link #GL_PIXEL_MAP_R_TO_R PIXEL_MAP_R_TO_R}{@link #GL_PIXEL_MAP_G_TO_G PIXEL_MAP_G_TO_G}{@link #GL_PIXEL_MAP_B_TO_B PIXEL_MAP_B_TO_B}{@link #GL_PIXEL_MAP_A_TO_A PIXEL_MAP_A_TO_A}
    + * @param values the map values + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPixelMapfv(@NativeType("GLenum") int map, @NativeType("GLfloat const *") FloatBuffer values) { + nglPixelMapfv(map, values.remaining(), memAddress(values)); + } + + // --- [ glPixelMapusv ] --- + + /** + * Unsafe version of: {@link #glPixelMapusv PixelMapusv} + * + * @param size the map size + */ + public static native void nglPixelMapusv(int map, int size, long values); + + /** + * Unsigned short version of {@link #glPixelMapfv PixelMapfv}. + * + * @param map the map to set + * @param size the map size + * @param values the map values + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPixelMapusv(@NativeType("GLenum") int map, @NativeType("GLsizei") int size, @NativeType("GLushort const *") long values) { + nglPixelMapusv(map, size, values); + } + + /** + * Unsigned short version of {@link #glPixelMapfv PixelMapfv}. + * + * @param map the map to set + * @param values the map values + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPixelMapusv(@NativeType("GLenum") int map, @NativeType("GLushort const *") ShortBuffer values) { + nglPixelMapusv(map, values.remaining(), memAddress(values)); + } + + // --- [ glPixelMapuiv ] --- + + /** + * Unsafe version of: {@link #glPixelMapuiv PixelMapuiv} + * + * @param size the map size + */ + public static native void nglPixelMapuiv(int map, int size, long values); + + /** + * Unsigned integer version of {@link #glPixelMapfv PixelMapfv}. + * + * @param map the map to set + * @param size the map size + * @param values the map values + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPixelMapuiv(@NativeType("GLenum") int map, @NativeType("GLsizei") int size, @NativeType("GLuint const *") long values) { + nglPixelMapuiv(map, size, values); + } + + /** + * Unsigned integer version of {@link #glPixelMapfv PixelMapfv}. + * + * @param map the map to set + * @param values the map values + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPixelMapuiv(@NativeType("GLenum") int map, @NativeType("GLuint const *") IntBuffer values) { + nglPixelMapuiv(map, values.remaining(), memAddress(values)); + } + + // --- [ glPixelStorei ] --- + + /** + * Sets the integer value of a pixel store parameter. + * + * @param pname the pixel store parameter to set. One of:
    {@link GL11C#GL_UNPACK_SWAP_BYTES UNPACK_SWAP_BYTES}{@link GL11C#GL_UNPACK_LSB_FIRST UNPACK_LSB_FIRST}{@link GL11C#GL_UNPACK_ROW_LENGTH UNPACK_ROW_LENGTH}
    {@link GL11C#GL_UNPACK_SKIP_ROWS UNPACK_SKIP_ROWS}{@link GL11C#GL_UNPACK_SKIP_PIXELS UNPACK_SKIP_PIXELS}{@link GL11C#GL_UNPACK_ALIGNMENT UNPACK_ALIGNMENT}
    {@link GL12#GL_UNPACK_IMAGE_HEIGHT UNPACK_IMAGE_HEIGHT}{@link GL12#GL_UNPACK_SKIP_IMAGES UNPACK_SKIP_IMAGES}{@link GL42#GL_UNPACK_COMPRESSED_BLOCK_WIDTH UNPACK_COMPRESSED_BLOCK_WIDTH}
    {@link GL42#GL_UNPACK_COMPRESSED_BLOCK_HEIGHT UNPACK_COMPRESSED_BLOCK_HEIGHT}{@link GL42#GL_UNPACK_COMPRESSED_BLOCK_DEPTH UNPACK_COMPRESSED_BLOCK_DEPTH}{@link GL42#GL_UNPACK_COMPRESSED_BLOCK_SIZE UNPACK_COMPRESSED_BLOCK_SIZE}
    + * @param param the parameter value + * + * @see Reference Page + */ + public static void glPixelStorei(@NativeType("GLenum") int pname, @NativeType("GLint") int param) { + GL11C.glPixelStorei(pname, param); + } + + // --- [ glPixelStoref ] --- + + /** + * Float version of {@link #glPixelStorei PixelStorei}. + * + * @param pname the pixel store parameter to set + * @param param the parameter value + * + * @see Reference Page + */ + public static void glPixelStoref(@NativeType("GLenum") int pname, @NativeType("GLfloat") float param) { + GL11C.glPixelStoref(pname, param); + } + + // --- [ glPixelTransferi ] --- + + /** + * Sets the integer value of a pixel transfer parameter. + * + * @param pname the pixel transfer parameter to set. One of:
    {@link #GL_MAP_COLOR MAP_COLOR}{@link #GL_MAP_STENCIL MAP_STENCIL}{@link #GL_INDEX_SHIFT INDEX_SHIFT}{@link #GL_INDEX_OFFSET INDEX_OFFSET}
    {@link #GL_RED_SCALE RED_SCALE}{@link #GL_GREEN_SCALE GREEN_SCALE}{@link #GL_BLUE_SCALE BLUE_SCALE}{@link #GL_ALPHA_SCALE ALPHA_SCALE}
    {@link #GL_DEPTH_SCALE DEPTH_SCALE}{@link #GL_RED_BIAS RED_BIAS}{@link #GL_GREEN_BIAS GREEN_BIAS}{@link #GL_BLUE_BIAS BLUE_BIAS}
    {@link #GL_ALPHA_BIAS ALPHA_BIAS}{@link #GL_DEPTH_BIAS DEPTH_BIAS}{@link ARBImaging#GL_POST_CONVOLUTION_RED_SCALE POST_CONVOLUTION_RED_SCALE}{@link ARBImaging#GL_POST_CONVOLUTION_RED_BIAS POST_CONVOLUTION_RED_BIAS}
    {@link ARBImaging#GL_POST_COLOR_MATRIX_RED_SCALE POST_COLOR_MATRIX_RED_SCALE}{@link ARBImaging#GL_POST_COLOR_MATRIX_RED_BIAS POST_COLOR_MATRIX_RED_BIAS}{@link ARBImaging#GL_POST_CONVOLUTION_GREEN_SCALE POST_CONVOLUTION_GREEN_SCALE}{@link ARBImaging#GL_POST_CONVOLUTION_GREEN_BIAS POST_CONVOLUTION_GREEN_BIAS}
    {@link ARBImaging#GL_POST_COLOR_MATRIX_GREEN_SCALE POST_COLOR_MATRIX_GREEN_SCALE}{@link ARBImaging#GL_POST_COLOR_MATRIX_GREEN_BIAS POST_COLOR_MATRIX_GREEN_BIAS}{@link ARBImaging#GL_POST_CONVOLUTION_BLUE_SCALE POST_CONVOLUTION_BLUE_SCALE}{@link ARBImaging#GL_POST_CONVOLUTION_BLUE_BIAS POST_CONVOLUTION_BLUE_BIAS}
    {@link ARBImaging#GL_POST_COLOR_MATRIX_BLUE_SCALE POST_COLOR_MATRIX_BLUE_SCALE}{@link ARBImaging#GL_POST_COLOR_MATRIX_BLUE_BIAS POST_COLOR_MATRIX_BLUE_BIAS}{@link ARBImaging#GL_POST_CONVOLUTION_ALPHA_SCALE POST_CONVOLUTION_ALPHA_SCALE}{@link ARBImaging#GL_POST_CONVOLUTION_ALPHA_BIAS POST_CONVOLUTION_ALPHA_BIAS}
    {@link ARBImaging#GL_POST_COLOR_MATRIX_ALPHA_SCALE POST_COLOR_MATRIX_ALPHA_SCALE}{@link ARBImaging#GL_POST_COLOR_MATRIX_ALPHA_BIAS POST_COLOR_MATRIX_ALPHA_BIAS}
    + * @param param the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPixelTransferi(@NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glPixelTransferf ] --- + + /** + * Float version of {@link #glPixelTransferi PixelTransferi}. + * + * @param pname the pixel transfer parameter to set + * @param param the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPixelTransferf(@NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glPixelZoom ] --- + + /** + * Controls the conversion of a group of fragments. + * + *

    Let (xrp, yrp) be the current raster position. If a particular group is the nth in a row and belongs to the + * mth row, consider the region in window coordinates bounded by the rectangle with corners

    + * + *

    (xrp + zxn, yrp + zym) and (xrp + zx(n + 1), yrp + zy(m + 1))

    + * + *

    (either zx or zy may be negative). A fragment representing group {@code (n, m)} is produced for each framebuffer pixel inside, or + * on the bottom or left boundary, of this rectangle.

    + * + * @param xfactor the zx factor + * @param yfactor the zy factor + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPixelZoom(@NativeType("GLfloat") float xfactor, @NativeType("GLfloat") float yfactor); + + // --- [ glPointSize ] --- + + /** + * Controls the rasterization of points if no vertex, tessellation control, tessellation evaluation, or geometry shader is active. The default point size is 1.0. + * + * @param size the request size of a point + * + * @see Reference Page + */ + public static void glPointSize(@NativeType("GLfloat") float size) { + GL11C.glPointSize(size); + } + + // --- [ glPolygonMode ] --- + + /** + * Controls the interpretation of polygons for rasterization. + * + *

    {@link GL11C#GL_FILL FILL} is the default mode of polygon rasterization. Note that these modes affect only the final rasterization of polygons: in particular, a + * polygon's vertices are lit, and the polygon is clipped and possibly culled before these modes are applied. Polygon antialiasing applies only to the + * {@link GL11C#GL_FILL FILL} state of PolygonMode. For {@link GL11C#GL_POINT POINT} or {@link GL11C#GL_LINE LINE}, point antialiasing or line segment antialiasing, respectively, apply.

    + * + * @param face the face for which to set the rasterizing method. One of:
    {@link GL11C#GL_FRONT FRONT}{@link GL11C#GL_BACK BACK}{@link GL11C#GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param mode the rasterization mode. One of:
    {@link GL11C#GL_POINT POINT}{@link GL11C#GL_LINE LINE}{@link GL11C#GL_FILL FILL}
    + * + * @see Reference Page + */ + public static void glPolygonMode(@NativeType("GLenum") int face, @NativeType("GLenum") int mode) { + GL11C.glPolygonMode(face, mode); + } + + // --- [ glPolygonOffset ] --- + + /** + * The depth values of all fragments generated by the rasterization of a polygon may be offset by a single value that is computed for that polygon. This + * function determines that value. + * + *

    {@code factor} scales the maximum depth slope of the polygon, and {@code units} scales an implementation-dependent constant that relates to the usable + * resolution of the depth buffer. The resulting values are summed to produce the polygon offset value.

    + * + * @param factor the maximum depth slope factor + * @param units the constant scale + * + * @see Reference Page + */ + public static void glPolygonOffset(@NativeType("GLfloat") float factor, @NativeType("GLfloat") float units) { + GL11C.glPolygonOffset(factor, units); + } + + // --- [ glPolygonStipple ] --- + + /** Unsafe version of: {@link #glPolygonStipple PolygonStipple} */ + public static native void nglPolygonStipple(long pattern); + + /** + * Defines a polygon stipple. It works much the same way as {@link #glLineStipple LineStipple}, masking out certain fragments produced by rasterization so that they + * are not sent to the next stage of the GL. This is the case regardless of the state of polygon antialiasing. + * + *

    If xw and yw are the window coordinates of a rasterized polygon fragment, then that fragment is sent to the next stage of the GL + * if and only if the bit of the pattern (xw mod 32, yw mod 32) is 1.

    + * + *

    Polygon stippling may be enabled or disabled with {@link #glEnable Enable} or {@link #glDisable Disable} using the constant {@link #GL_POLYGON_STIPPLE POLYGON_STIPPLE}. When disabled, + * it is as if the stipple pattern were all ones.

    + * + * @param pattern a pointer to memory into which a 32 × 32 pattern is packed + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPolygonStipple(@NativeType("GLubyte const *") ByteBuffer pattern) { + if (CHECKS) { + check(pattern, 128); + } + nglPolygonStipple(memAddress(pattern)); + } + + /** + * Defines a polygon stipple. It works much the same way as {@link #glLineStipple LineStipple}, masking out certain fragments produced by rasterization so that they + * are not sent to the next stage of the GL. This is the case regardless of the state of polygon antialiasing. + * + *

    If xw and yw are the window coordinates of a rasterized polygon fragment, then that fragment is sent to the next stage of the GL + * if and only if the bit of the pattern (xw mod 32, yw mod 32) is 1.

    + * + *

    Polygon stippling may be enabled or disabled with {@link #glEnable Enable} or {@link #glDisable Disable} using the constant {@link #GL_POLYGON_STIPPLE POLYGON_STIPPLE}. When disabled, + * it is as if the stipple pattern were all ones.

    + * + * @param pattern a pointer to memory into which a 32 × 32 pattern is packed + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPolygonStipple(@NativeType("GLubyte const *") long pattern) { + nglPolygonStipple(pattern); + } + + // --- [ glPushAttrib ] --- + + /** + * Takes a bitwise OR of symbolic constants indicating which groups of state variables to push onto the server attribute stack. Each constant refers to a + * group of state variables. + * + *

    Bits set in mask that do not correspond to an attribute group are ignored. The special mask value {@link #GL_ALL_ATTRIB_BITS ALL_ATTRIB_BITS} may be used to push all + * stackable server state.

    + * + *

    A {@link #GL_STACK_OVERFLOW STACK_OVERFLOW} error is generated if {@code PushAttrib} is called and the attribute stack depth is equal to the value of + * {@link #GL_MAX_ATTRIB_STACK_DEPTH MAX_ATTRIB_STACK_DEPTH}.

    + * + * @param mask the state variables to push. One or more of:
    {@link #GL_ACCUM_BUFFER_BIT ACCUM_BUFFER_BIT}{@link #GL_COLOR_BUFFER_BIT COLOR_BUFFER_BIT}{@link #GL_CURRENT_BIT CURRENT_BIT}{@link #GL_DEPTH_BUFFER_BIT DEPTH_BUFFER_BIT}{@link #GL_ENABLE_BIT ENABLE_BIT}{@link #GL_EVAL_BIT EVAL_BIT}
    {@link #GL_FOG_BIT FOG_BIT}{@link #GL_HINT_BIT HINT_BIT}{@link #GL_LIGHTING_BIT LIGHTING_BIT}{@link #GL_LINE_BIT LINE_BIT}{@link #GL_LIST_BIT LIST_BIT}{@link GL13#GL_MULTISAMPLE_BIT MULTISAMPLE_BIT}
    {@link #GL_PIXEL_MODE_BIT PIXEL_MODE_BIT}{@link #GL_POINT_BIT POINT_BIT}{@link #GL_POLYGON_BIT POLYGON_BIT}{@link #GL_POLYGON_STIPPLE_BIT POLYGON_STIPPLE_BIT}{@link #GL_SCISSOR_BIT SCISSOR_BIT}{@link #GL_STENCIL_BUFFER_BIT STENCIL_BUFFER_BIT}
    {@link #GL_TEXTURE_BIT TEXTURE_BIT}{@link #GL_TRANSFORM_BIT TRANSFORM_BIT}{@link #GL_VIEWPORT_BIT VIEWPORT_BIT}{@link #GL_ALL_ATTRIB_BITS ALL_ATTRIB_BITS}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPushAttrib(@NativeType("GLbitfield") int mask); + + // --- [ glPushClientAttrib ] --- + + /** + * Takes a bitwise OR of symbolic constants indicating which groups of state variables to push onto the client attribute stack. Each constant refers to a + * group of state variables. + * + *

    Bits set in mask that do not correspond to an attribute group are ignored. The special mask value {@link #GL_CLIENT_ALL_ATTRIB_BITS CLIENT_ALL_ATTRIB_BITS} may be used to push + * all stackable client state.

    + * + *

    A {@link #GL_STACK_OVERFLOW STACK_OVERFLOW} error is generated if {@code PushAttrib} is called and the client attribute stack depth is equal to the value of + * {@link #GL_MAX_CLIENT_ATTRIB_STACK_DEPTH MAX_CLIENT_ATTRIB_STACK_DEPTH}.

    + * + * @param mask the state variables to push. One or more of:
    {@link #GL_CLIENT_VERTEX_ARRAY_BIT CLIENT_VERTEX_ARRAY_BIT}{@link #GL_CLIENT_PIXEL_STORE_BIT CLIENT_PIXEL_STORE_BIT}{@link #GL_CLIENT_ALL_ATTRIB_BITS CLIENT_ALL_ATTRIB_BITS}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPushClientAttrib(@NativeType("GLbitfield") int mask); + + // --- [ glPopAttrib ] --- + + /** + * Resets the values of those state variables that were saved with the last {@link #glPushAttrib PushAttrib}. Those not saved remain unchanged. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPopAttrib(); + + // --- [ glPopClientAttrib ] --- + + /** + * Resets the values of those state variables that were saved with the last {@link #glPushClientAttrib PushClientAttrib}. Those not saved remain unchanged. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPopClientAttrib(); + + // --- [ glPopMatrix ] --- + + /** + * Pops the top entry off the current matrix stack, replacing the current matrix with the matrix that was the second entry in the stack. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPopMatrix(); + + // --- [ glPopName ] --- + + /** + * Pops one name off the top of the selection name stack. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPopName(); + + // --- [ glPrioritizeTextures ] --- + + /** + * Unsafe version of: {@link #glPrioritizeTextures PrioritizeTextures} + * + * @param n the number of texture object priorities to set + */ + public static native void nglPrioritizeTextures(int n, long textures, long priorities); + + /** + * Sets the priority of texture objects. Each priority value is clamped to the range [0, 1] before it is assigned. Zero indicates the lowest priority, with + * the least likelihood of being resident. One indicates the highest priority, with the greatest likelihood of being resident. + * + * @param textures an array of texture object names + * @param priorities an array of texture object priorities + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPrioritizeTextures(@NativeType("GLuint const *") IntBuffer textures, @NativeType("GLfloat const *") FloatBuffer priorities) { + if (CHECKS) { + check(priorities, textures.remaining()); + } + nglPrioritizeTextures(textures.remaining(), memAddress(textures), memAddress(priorities)); + } + + // --- [ glPushMatrix ] --- + + /** + * Pushes the current matrix stack down by one, duplicating the current matrix in both the top of the stack and the entry below it. + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPushMatrix(); + + // --- [ glPushName ] --- + + /** + * Causes {@code name} to be pushed onto the selection name stack. + * + * @param name the name to push + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glPushName(@NativeType("GLuint") int name); + + // --- [ glRasterPos2i ] --- + + /** + * Sets the two-dimensional current raster position. {@code z} is implicitly set to 0 and {@code w} implicitly set to 1. + * + *

    The coordinates are treated as if they were specified in a Vertex command. If a vertex shader is active, this vertex shader is executed using the x, y, + * z, and w coordinates as the object coordinates of the vertex. Otherwise, the x, y, z, and w coordinates are transformed by the current model-view and + * projection matrices. These coordinates, along with current values, are used to generate primary and secondary colors and texture coordinates just as is + * done for a vertex. The colors and texture coordinates so produced replace the colors and texture coordinates stored in the current raster position's + * associated data.

    + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos2i(@NativeType("GLint") int x, @NativeType("GLint") int y); + + // --- [ glRasterPos2s ] --- + + /** + * Short version of {@link #glRasterPos2i RasterPos2i}. + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos2s(@NativeType("GLshort") short x, @NativeType("GLshort") short y); + + // --- [ glRasterPos2f ] --- + + /** + * Float version of {@link #glRasterPos2i RasterPos2i}. + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos2f(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y); + + // --- [ glRasterPos2d ] --- + + /** + * Double version of {@link #glRasterPos2i RasterPos2i}. + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos2d(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y); + + // --- [ glRasterPos2iv ] --- + + /** Unsafe version of: {@link #glRasterPos2iv RasterPos2iv} */ + public static native void nglRasterPos2iv(long coords); + + /** + * Pointer version of {@link #glRasterPos2i RasterPos2i}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos2iv(@NativeType("GLint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 2); + } + nglRasterPos2iv(memAddress(coords)); + } + + // --- [ glRasterPos2sv ] --- + + /** Unsafe version of: {@link #glRasterPos2sv RasterPos2sv} */ + public static native void nglRasterPos2sv(long coords); + + /** + * Pointer version of {@link #glRasterPos2s RasterPos2s}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos2sv(@NativeType("GLshort const *") ShortBuffer coords) { + if (CHECKS) { + check(coords, 2); + } + nglRasterPos2sv(memAddress(coords)); + } + + // --- [ glRasterPos2fv ] --- + + /** Unsafe version of: {@link #glRasterPos2fv RasterPos2fv} */ + public static native void nglRasterPos2fv(long coords); + + /** + * Pointer version of {@link #glRasterPos2f RasterPos2f}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos2fv(@NativeType("GLfloat const *") FloatBuffer coords) { + if (CHECKS) { + check(coords, 2); + } + nglRasterPos2fv(memAddress(coords)); + } + + // --- [ glRasterPos2dv ] --- + + /** Unsafe version of: {@link #glRasterPos2dv RasterPos2dv} */ + public static native void nglRasterPos2dv(long coords); + + /** + * Pointer version of {@link #glRasterPos2d RasterPos2d}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos2dv(@NativeType("GLdouble const *") DoubleBuffer coords) { + if (CHECKS) { + check(coords, 2); + } + nglRasterPos2dv(memAddress(coords)); + } + + // --- [ glRasterPos3i ] --- + + /** + * Sets the three-dimensional current raster position. {@code w} is implicitly set to 1. See {@link #glRasterPos2i RasterPos2i} for more details. + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * @param z the {@code z} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos3i(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z); + + // --- [ glRasterPos3s ] --- + + /** + * Short version of {@link #glRasterPos3i RasterPos3i}. + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * @param z the {@code z} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos3s(@NativeType("GLshort") short x, @NativeType("GLshort") short y, @NativeType("GLshort") short z); + + // --- [ glRasterPos3f ] --- + + /** + * Float version of {@link #glRasterPos3i RasterPos3i}. + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * @param z the {@code z} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos3f(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z); + + // --- [ glRasterPos3d ] --- + + /** + * Double version of {@link #glRasterPos3i RasterPos3i}. + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * @param z the {@code z} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos3d(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glRasterPos3iv ] --- + + /** Unsafe version of: {@link #glRasterPos3iv RasterPos3iv} */ + public static native void nglRasterPos3iv(long coords); + + /** + * Pointer version of {@link #glRasterPos3i RasterPos3i}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos3iv(@NativeType("GLint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 3); + } + nglRasterPos3iv(memAddress(coords)); + } + + // --- [ glRasterPos3sv ] --- + + /** Unsafe version of: {@link #glRasterPos3sv RasterPos3sv} */ + public static native void nglRasterPos3sv(long coords); + + /** + * Pointer version of {@link #glRasterPos3s RasterPos3s}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos3sv(@NativeType("GLshort const *") ShortBuffer coords) { + if (CHECKS) { + check(coords, 3); + } + nglRasterPos3sv(memAddress(coords)); + } + + // --- [ glRasterPos3fv ] --- + + /** Unsafe version of: {@link #glRasterPos3fv RasterPos3fv} */ + public static native void nglRasterPos3fv(long coords); + + /** + * Pointer version of {@link #glRasterPos3f RasterPos3f}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos3fv(@NativeType("GLfloat const *") FloatBuffer coords) { + if (CHECKS) { + check(coords, 3); + } + nglRasterPos3fv(memAddress(coords)); + } + + // --- [ glRasterPos3dv ] --- + + /** Unsafe version of: {@link #glRasterPos3dv RasterPos3dv} */ + public static native void nglRasterPos3dv(long coords); + + /** + * Pointer version of {@link #glRasterPos3d RasterPos3d}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos3dv(@NativeType("GLdouble const *") DoubleBuffer coords) { + if (CHECKS) { + check(coords, 3); + } + nglRasterPos3dv(memAddress(coords)); + } + + // --- [ glRasterPos4i ] --- + + /** + * Sets the four-dimensional current raster position. See {@link #glRasterPos2i RasterPos2i} for more details. + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * @param z the {@code z} raster coordinate + * @param w the {@code w} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos4i(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w); + + // --- [ glRasterPos4s ] --- + + /** + * Short version of {@link #glRasterPos4i RasterPos4i}. + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * @param z the {@code z} raster coordinate + * @param w the {@code w} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos4s(@NativeType("GLshort") short x, @NativeType("GLshort") short y, @NativeType("GLshort") short z, @NativeType("GLshort") short w); + + // --- [ glRasterPos4f ] --- + + /** + * Float version of RasterPos4i. + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * @param z the {@code z} raster coordinate + * @param w the {@code w} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos4f(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z, @NativeType("GLfloat") float w); + + // --- [ glRasterPos4d ] --- + + /** + * Double version of {@link #glRasterPos4i RasterPos4i}. + * + * @param x the {@code x} raster coordinate + * @param y the {@code y} raster coordinate + * @param z the {@code z} raster coordinate + * @param w the {@code w} raster coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRasterPos4d(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w); + + // --- [ glRasterPos4iv ] --- + + /** Unsafe version of: {@link #glRasterPos4iv RasterPos4iv} */ + public static native void nglRasterPos4iv(long coords); + + /** + * Pointer version of {@link #glRasterPos4i RasterPos4i}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos4iv(@NativeType("GLint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 4); + } + nglRasterPos4iv(memAddress(coords)); + } + + // --- [ glRasterPos4sv ] --- + + /** Unsafe version of: {@link #glRasterPos4sv RasterPos4sv} */ + public static native void nglRasterPos4sv(long coords); + + /** + * Pointer version of {@link #glRasterPos4s RasterPos4s}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos4sv(@NativeType("GLshort const *") ShortBuffer coords) { + if (CHECKS) { + check(coords, 4); + } + nglRasterPos4sv(memAddress(coords)); + } + + // --- [ glRasterPos4fv ] --- + + /** Unsafe version of: {@link #glRasterPos4fv RasterPos4fv} */ + public static native void nglRasterPos4fv(long coords); + + /** + * Pointer version of {@link #glRasterPos4f RasterPos4f}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos4fv(@NativeType("GLfloat const *") FloatBuffer coords) { + if (CHECKS) { + check(coords, 4); + } + nglRasterPos4fv(memAddress(coords)); + } + + // --- [ glRasterPos4dv ] --- + + /** Unsafe version of: {@link #glRasterPos4dv RasterPos4dv} */ + public static native void nglRasterPos4dv(long coords); + + /** + * Pointer version of {@link #glRasterPos4d RasterPos4d}. + * + * @param coords the raster position buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos4dv(@NativeType("GLdouble const *") DoubleBuffer coords) { + if (CHECKS) { + check(coords, 4); + } + nglRasterPos4dv(memAddress(coords)); + } + + // --- [ glReadBuffer ] --- + + /** + * Defines the color buffer from which values are obtained. + * + *

    Acceptable values for {@code src} depend on whether the GL is using the default framebuffer (i.e., {@link GL30#GL_DRAW_FRAMEBUFFER_BINDING DRAW_FRAMEBUFFER_BINDING} is zero), or + * a framebuffer object (i.e., {@link GL30#GL_DRAW_FRAMEBUFFER_BINDING DRAW_FRAMEBUFFER_BINDING} is non-zero). In the initial state, the GL is bound to the default framebuffer.

    + * + * @param src the color buffer to read from. One of:
    {@link GL11C#GL_NONE NONE}{@link GL11C#GL_FRONT_LEFT FRONT_LEFT}{@link GL11C#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11C#GL_BACK_LEFT BACK_LEFT}{@link GL11C#GL_BACK_RIGHT BACK_RIGHT}{@link GL11C#GL_FRONT FRONT}{@link GL11C#GL_BACK BACK}{@link GL11C#GL_LEFT LEFT}
    {@link GL11C#GL_RIGHT RIGHT}{@link GL11C#GL_FRONT_AND_BACK FRONT_AND_BACK}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static void glReadBuffer(@NativeType("GLenum") int src) { + GL11C.glReadBuffer(src); + } + + // --- [ glReadPixels ] --- + + /** Unsafe version of: {@link #glReadPixels ReadPixels} */ + public static void nglReadPixels(int x, int y, int width, int height, int format, int type, long pixels) { + GL11C.nglReadPixels(x, y, width, height, format, type, pixels); + } + + /** + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GL30#GL_READ_FRAMEBUFFER_BINDING READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + GL11C.glReadPixels(x, y, width, height, format, type, pixels); + } + + /** + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GL30#GL_READ_FRAMEBUFFER_BINDING READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") long pixels) { + GL11C.glReadPixels(x, y, width, height, format, type, pixels); + } + + /** + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GL30#GL_READ_FRAMEBUFFER_BINDING READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + GL11C.glReadPixels(x, y, width, height, format, type, pixels); + } + + /** + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GL30#GL_READ_FRAMEBUFFER_BINDING READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + GL11C.glReadPixels(x, y, width, height, format, type, pixels); + } + + /** + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GL30#GL_READ_FRAMEBUFFER_BINDING READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + GL11C.glReadPixels(x, y, width, height, format, type, pixels); + } + + // --- [ glRecti ] --- + + /** + * Specifies a rectangle as two corner vertices. The effect of the Rect command + * + *

    {@code Rect(x1, y1, x2, y2);}

    + * + *

    is exactly the same as the following sequence of commands: + * {@code + * Begin(POLYGON); + * Vertex2(x1, y1); + * Vertex2(x2, y1); + * Vertex2(x2, y2); + * Vertex2(x1, y2); + * End();}

    + * + *

    The appropriate Vertex2 command would be invoked depending on which of the Rect commands is issued.

    + * + * @param x1 the x coordinate of the first corner vertex + * @param y1 the y coordinate of the first corner vertex + * @param x2 the x coordinate of the second corner vertex + * @param y2 the y coordinate of the second corner vertex + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRecti(@NativeType("GLint") int x1, @NativeType("GLint") int y1, @NativeType("GLint") int x2, @NativeType("GLint") int y2); + + // --- [ glRects ] --- + + /** + * Short version of {@link #glRecti Recti}. + * + * @param x1 the x coordinate of the first corner vertex + * @param y1 the y coordinate of the first corner vertex + * @param x2 the x coordinate of the second corner vertex + * @param y2 the y coordinate of the second corner vertex + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRects(@NativeType("GLshort") short x1, @NativeType("GLshort") short y1, @NativeType("GLshort") short x2, @NativeType("GLshort") short y2); + + // --- [ glRectf ] --- + + /** + * Float version of {@link #glRecti Recti}. + * + * @param x1 the x coordinate of the first corner vertex + * @param y1 the y coordinate of the first corner vertex + * @param x2 the x coordinate of the second corner vertex + * @param y2 the y coordinate of the second corner vertex + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRectf(@NativeType("GLfloat") float x1, @NativeType("GLfloat") float y1, @NativeType("GLfloat") float x2, @NativeType("GLfloat") float y2); + + // --- [ glRectd ] --- + + /** + * Double version of {@link #glRecti Recti}. + * + * @param x1 the x coordinate of the first corner vertex + * @param y1 the y coordinate of the first corner vertex + * @param x2 the x coordinate of the second corner vertex + * @param y2 the y coordinate of the second corner vertex + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRectd(@NativeType("GLdouble") double x1, @NativeType("GLdouble") double y1, @NativeType("GLdouble") double x2, @NativeType("GLdouble") double y2); + + // --- [ glRectiv ] --- + + /** Unsafe version of: {@link #glRectiv Rectiv} */ + public static native void nglRectiv(long v1, long v2); + + /** + * Pointer version of {@link #glRecti Recti}. + * + * @param v1 the first vertex buffer + * @param v2 the second vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRectiv(@NativeType("GLint const *") IntBuffer v1, @NativeType("GLint const *") IntBuffer v2) { + if (CHECKS) { + check(v1, 2); + check(v2, 2); + } + nglRectiv(memAddress(v1), memAddress(v2)); + } + + // --- [ glRectsv ] --- + + /** Unsafe version of: {@link #glRectsv Rectsv} */ + public static native void nglRectsv(long v1, long v2); + + /** + * Pointer version of {@link #glRects Rects}. + * + * @param v1 the first vertex buffer + * @param v2 the second vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRectsv(@NativeType("GLshort const *") ShortBuffer v1, @NativeType("GLshort const *") ShortBuffer v2) { + if (CHECKS) { + check(v1, 2); + check(v2, 2); + } + nglRectsv(memAddress(v1), memAddress(v2)); + } + + // --- [ glRectfv ] --- + + /** Unsafe version of: {@link #glRectfv Rectfv} */ + public static native void nglRectfv(long v1, long v2); + + /** + * Pointer version of {@link #glRectf Rectf}. + * + * @param v1 the first vertex buffer + * @param v2 the second vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRectfv(@NativeType("GLfloat const *") FloatBuffer v1, @NativeType("GLfloat const *") FloatBuffer v2) { + if (CHECKS) { + check(v1, 2); + check(v2, 2); + } + nglRectfv(memAddress(v1), memAddress(v2)); + } + + // --- [ glRectdv ] --- + + /** Unsafe version of: {@link #glRectdv Rectdv} */ + public static native void nglRectdv(long v1, long v2); + + /** + * Pointer version of {@link #glRectd Rectd}. + * + * @param v1 the first vertex buffer + * @param v2 the second vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRectdv(@NativeType("GLdouble const *") DoubleBuffer v1, @NativeType("GLdouble const *") DoubleBuffer v2) { + if (CHECKS) { + check(v1, 2); + check(v2, 2); + } + nglRectdv(memAddress(v1), memAddress(v2)); + } + + // --- [ glRenderMode ] --- + + /** + * Sets the current render mode. The default is {@link #GL_RENDER RENDER}. + * + * @param mode the render mode. One of:
    {@link #GL_RENDER RENDER}{@link #GL_SELECT SELECT}{@link #GL_FEEDBACK FEEDBACK}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("GLint") + public static native int glRenderMode(@NativeType("GLenum") int mode); + + // --- [ glRotatef ] --- + + /** + * Manipulates the current matrix with a rotation matrix. + * + *

    {@code angle} gives an angle of rotation in degrees; the coordinates of a vector v are given by v = (x y z)T. The computed matrix + * is a counter-clockwise rotation about the line through the origin with the specified axis when that axis is pointing up (i.e. the right-hand rule + * determines the sense of the rotation angle). The matrix is thus

    + * + * + * + * + * + * + *
    R0
    0
    0
    0001
    + * + *

    Let u = v / ||v|| = (x' y' z')T. If S =

    + * + * + * + * + * + *
    0-z'y'
    z'0-x'
    -y'x'0
    + * + *

    then R = uuT + cos(angle)(I - uuT) + sin(angle)S

    + * + * @param angle the angle of rotation in degrees + * @param x the x coordinate of the rotation vector + * @param y the y coordinate of the rotation vector + * @param z the z coordinate of the rotation vector + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRotatef(@NativeType("GLfloat") float angle, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z); + + // --- [ glRotated ] --- + + /** + * Double version of {@link #glRotatef Rotatef}. + * + * @param angle the angle of rotation in degrees + * @param x the x coordinate of the rotation vector + * @param y the y coordinate of the rotation vector + * @param z the z coordinate of the rotation vector + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glRotated(@NativeType("GLdouble") double angle, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glScalef ] --- + + /** + * Manipulates the current matrix with a general scaling matrix along the x-, y- and z- axes. + * + *

    Calling this function is equivalent to calling {@link #glMultMatrixf MultMatrixf} with the following matrix:

    + * + * + * + * + * + * + *
    x000
    0y00
    00z0
    0001
    + * + * @param x the x-axis scaling factor + * @param y the y-axis scaling factor + * @param z the z-axis scaling factor + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glScalef(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z); + + // --- [ glScaled ] --- + + /** + * Double version of {@link #glScalef Scalef}. + * + * @param x the x-axis scaling factor + * @param y the y-axis scaling factor + * @param z the z-axis scaling factor + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glScaled(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glScissor ] --- + + /** + * Defines the scissor rectangle for all viewports. The scissor test is enabled or disabled for all viewports using {@link #glEnable Enable} or {@link #glDisable Disable} + * with the symbolic constant {@link GL11C#GL_SCISSOR_TEST SCISSOR_TEST}. When disabled, it is as if the scissor test always passes. When enabled, if + * left ≤ xw < left + width and bottom ≤ yw < bottom + height for the scissor rectangle, then the scissor + * test passes. Otherwise, the test fails and the fragment is discarded. + * + * @param x the left scissor rectangle coordinate + * @param y the bottom scissor rectangle coordinate + * @param width the scissor rectangle width + * @param height the scissor rectangle height + * + * @see Reference Page + */ + public static void glScissor(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL11C.glScissor(x, y, width, height); + } + + // --- [ glSelectBuffer ] --- + + /** + * Unsafe version of: {@link #glSelectBuffer SelectBuffer} + * + * @param size the maximum number of values that can be stored in {@code buffer} + */ + public static native void nglSelectBuffer(int size, long buffer); + + /** + * Sets the selection array. + * + * @param buffer an array of unsigned integers to be potentially filled names + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSelectBuffer(@NativeType("GLuint *") IntBuffer buffer) { + nglSelectBuffer(buffer.remaining(), memAddress(buffer)); + } + + // --- [ glShadeModel ] --- + + /** + * Sets the current shade mode. The initial value of the shade mode is {@link #GL_SMOOTH SMOOTH}. + * + *

    If mode is {@link #GL_SMOOTH SMOOTH}, vertex colors are treated individually. If mode is {@link #GL_FLAT FLAT}, flatshading is enabled and colors are taken from the + * provoking vertex of the primitive. The colors selected are those derived from current values, generated by lighting, or generated by vertex shading, if + * lighting is disabled, enabled, or a vertex shader is in use, respectively.

    + * + * @param mode the shade mode. One of:
    {@link #GL_SMOOTH SMOOTH}{@link #GL_FLAT FLAT}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glShadeModel(@NativeType("GLenum") int mode); + + // --- [ glStencilFunc ] --- + + /** + * Controls the stencil test. + * + *

    {@code ref} is an integer reference value that is used in the unsigned stencil comparison. Stencil comparison operations and queries of {@code ref} + * clamp its value to the range [0, 2s – 1], where s is the number of bits in the stencil buffer attached to the draw framebuffer. The s + * least significant bits of {@code mask} are bitwise ANDed with both the reference and the stored stencil value, and the resulting masked values are those that + * participate in the comparison controlled by {@code func}.

    + * + * @param func the stencil comparison function. One of:
    {@link GL11C#GL_NEVER NEVER}{@link GL11C#GL_ALWAYS ALWAYS}{@link GL11C#GL_LESS LESS}{@link GL11C#GL_LEQUAL LEQUAL}{@link GL11C#GL_EQUAL EQUAL}{@link GL11C#GL_GEQUAL GEQUAL}{@link GL11C#GL_GREATER GREATER}{@link GL11C#GL_NOTEQUAL NOTEQUAL}
    + * @param ref the reference value + * @param mask the stencil comparison mask + * + * @see Reference Page + */ + public static void glStencilFunc(@NativeType("GLenum") int func, @NativeType("GLint") int ref, @NativeType("GLuint") int mask) { + GL11C.glStencilFunc(func, ref, mask); + } + + // --- [ glStencilMask ] --- + + /** + * Masks the writing of particular bits into the stencil plans. + * + *

    The least significant s bits of {@code mask}, where s is the number of bits in the stencil buffer, specify an integer mask. Where a 1 appears in this + * mask, the corresponding bit in the stencil buffer is written; where a 0 appears, the bit is not written.

    + * + * @param mask the stencil mask + * + * @see Reference Page + */ + public static void glStencilMask(@NativeType("GLuint") int mask) { + GL11C.glStencilMask(mask); + } + + // --- [ glStencilOp ] --- + + /** + * Indicates what happens to the stored stencil value if this or certain subsequent tests fail or pass. + * + *

    The supported actions are {@link GL11C#GL_KEEP KEEP}, {@link GL11C#GL_ZERO ZERO}, {@link GL11C#GL_REPLACE REPLACE}, {@link GL11C#GL_INCR INCR}, {@link GL11C#GL_DECR DECR}, {@link GL11C#GL_INVERT INVERT}, + * {@link GL14#GL_INCR_WRAP INCR_WRAP} and {@link GL14#GL_DECR_WRAP DECR_WRAP}. These correspond to keeping the current value, setting to zero, replacing with the reference value, + * incrementing with saturation, decrementing with saturation, bitwise inverting it, incrementing without saturation, and decrementing without saturation.

    + * + *

    For purposes of increment and decrement, the stencil bits are considered as an unsigned integer. Incrementing or decrementing with saturation clamps + * the stencil value at 0 and the maximum representable value. Incrementing or decrementing without saturation will wrap such that incrementing the maximum + * representable value results in 0, and decrementing 0 results in the maximum representable value.

    + * + * @param sfail the action to take if the stencil test fails + * @param dpfail the action to take if the depth buffer test fails + * @param dppass the action to take if the depth buffer test passes + * + * @see Reference Page + */ + public static void glStencilOp(@NativeType("GLenum") int sfail, @NativeType("GLenum") int dpfail, @NativeType("GLenum") int dppass) { + GL11C.glStencilOp(sfail, dpfail, dppass); + } + + // --- [ glTexCoord1f ] --- + + /** + * Sets the current one-dimensional texture coordinate. {@code t} and {@code r} are implicitly set to 0 and {@code q} to 1. + * + * @param s the s component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord1f(@NativeType("GLfloat") float s); + + // --- [ glTexCoord1s ] --- + + /** + * Short version of {@link #glTexCoord1f TexCoord1f}. + * + * @param s the s component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord1s(@NativeType("GLshort") short s); + + // --- [ glTexCoord1i ] --- + + /** + * Integer version of {@link #glTexCoord1f TexCoord1f}. + * + * @param s the s component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord1i(@NativeType("GLint") int s); + + // --- [ glTexCoord1d ] --- + + /** + * Double version of {@link #glTexCoord1f TexCoord1f}. + * + * @param s the s component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord1d(@NativeType("GLdouble") double s); + + // --- [ glTexCoord1fv ] --- + + /** Unsafe version of: {@link #glTexCoord1fv TexCoord1fv} */ + public static native void nglTexCoord1fv(long v); + + /** + * Pointer version of {@link #glTexCoord1f TexCoord1f}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord1fv(@NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglTexCoord1fv(memAddress(v)); + } + + // --- [ glTexCoord1sv ] --- + + /** Unsafe version of: {@link #glTexCoord1sv TexCoord1sv} */ + public static native void nglTexCoord1sv(long v); + + /** + * Pointer version of {@link #glTexCoord1s TexCoord1s}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord1sv(@NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglTexCoord1sv(memAddress(v)); + } + + // --- [ glTexCoord1iv ] --- + + /** Unsafe version of: {@link #glTexCoord1iv TexCoord1iv} */ + public static native void nglTexCoord1iv(long v); + + /** + * Pointer version of {@link #glTexCoord1i TexCoord1i}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord1iv(@NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglTexCoord1iv(memAddress(v)); + } + + // --- [ glTexCoord1dv ] --- + + /** Unsafe version of: {@link #glTexCoord1dv TexCoord1dv} */ + public static native void nglTexCoord1dv(long v); + + /** + * Pointer version of {@link #glTexCoord1d TexCoord1d}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord1dv(@NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglTexCoord1dv(memAddress(v)); + } + + // --- [ glTexCoord2f ] --- + + /** + * Sets the current two-dimensional texture coordinate. {@code r} is implicitly set to 0 and {@code q} to 1. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord2f(@NativeType("GLfloat") float s, @NativeType("GLfloat") float t); + + // --- [ glTexCoord2s ] --- + + /** + * Short version of {@link #glTexCoord2f TexCoord2f}. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord2s(@NativeType("GLshort") short s, @NativeType("GLshort") short t); + + // --- [ glTexCoord2i ] --- + + /** + * Integer version of {@link #glTexCoord2f TexCoord2f}. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord2i(@NativeType("GLint") int s, @NativeType("GLint") int t); + + // --- [ glTexCoord2d ] --- + + /** + * Double version of {@link #glTexCoord2f TexCoord2f}. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord2d(@NativeType("GLdouble") double s, @NativeType("GLdouble") double t); + + // --- [ glTexCoord2fv ] --- + + /** Unsafe version of: {@link #glTexCoord2fv TexCoord2fv} */ + public static native void nglTexCoord2fv(long v); + + /** + * Pointer version of {@link #glTexCoord2f TexCoord2f}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord2fv(@NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglTexCoord2fv(memAddress(v)); + } + + // --- [ glTexCoord2sv ] --- + + /** Unsafe version of: {@link #glTexCoord2sv TexCoord2sv} */ + public static native void nglTexCoord2sv(long v); + + /** + * Pointer version of {@link #glTexCoord2s TexCoord2s}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord2sv(@NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglTexCoord2sv(memAddress(v)); + } + + // --- [ glTexCoord2iv ] --- + + /** Unsafe version of: {@link #glTexCoord2iv TexCoord2iv} */ + public static native void nglTexCoord2iv(long v); + + /** + * Pointer version of {@link #glTexCoord2i TexCoord2i}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord2iv(@NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglTexCoord2iv(memAddress(v)); + } + + // --- [ glTexCoord2dv ] --- + + /** Unsafe version of: {@link #glTexCoord2dv TexCoord2dv} */ + public static native void nglTexCoord2dv(long v); + + /** + * Pointer version of {@link #glTexCoord2d TexCoord2d}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord2dv(@NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglTexCoord2dv(memAddress(v)); + } + + // --- [ glTexCoord3f ] --- + + /** + * Sets the current three-dimensional texture coordinate. {@code q} is implicitly set to 1. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord3f(@NativeType("GLfloat") float s, @NativeType("GLfloat") float t, @NativeType("GLfloat") float r); + + // --- [ glTexCoord3s ] --- + + /** + * Short version of {@link #glTexCoord3f TexCoord3f}. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord3s(@NativeType("GLshort") short s, @NativeType("GLshort") short t, @NativeType("GLshort") short r); + + // --- [ glTexCoord3i ] --- + + /** + * Integer version of {@link #glTexCoord3f TexCoord3f}. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord3i(@NativeType("GLint") int s, @NativeType("GLint") int t, @NativeType("GLint") int r); + + // --- [ glTexCoord3d ] --- + + /** + * Double version of {@link #glTexCoord3f TexCoord3f}. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord3d(@NativeType("GLdouble") double s, @NativeType("GLdouble") double t, @NativeType("GLdouble") double r); + + // --- [ glTexCoord3fv ] --- + + /** Unsafe version of: {@link #glTexCoord3fv TexCoord3fv} */ + public static native void nglTexCoord3fv(long v); + + /** + * Pointer version of {@link #glTexCoord3f TexCoord3f}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord3fv(@NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglTexCoord3fv(memAddress(v)); + } + + // --- [ glTexCoord3sv ] --- + + /** Unsafe version of: {@link #glTexCoord3sv TexCoord3sv} */ + public static native void nglTexCoord3sv(long v); + + /** + * Pointer version of {@link #glTexCoord3s TexCoord3s}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord3sv(@NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglTexCoord3sv(memAddress(v)); + } + + // --- [ glTexCoord3iv ] --- + + /** Unsafe version of: {@link #glTexCoord3iv TexCoord3iv} */ + public static native void nglTexCoord3iv(long v); + + /** + * Pointer version of {@link #glTexCoord3i TexCoord3i}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord3iv(@NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglTexCoord3iv(memAddress(v)); + } + + // --- [ glTexCoord3dv ] --- + + /** Unsafe version of: {@link #glTexCoord3dv TexCoord3dv} */ + public static native void nglTexCoord3dv(long v); + + /** + * Pointer version of {@link #glTexCoord3d TexCoord3d}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord3dv(@NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglTexCoord3dv(memAddress(v)); + } + + // --- [ glTexCoord4f ] --- + + /** + * Sets the current four-dimensional texture coordinate. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord4f(@NativeType("GLfloat") float s, @NativeType("GLfloat") float t, @NativeType("GLfloat") float r, @NativeType("GLfloat") float q); + + // --- [ glTexCoord4s ] --- + + /** + * Short version of {@link #glTexCoord4f TexCoord4f}. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord4s(@NativeType("GLshort") short s, @NativeType("GLshort") short t, @NativeType("GLshort") short r, @NativeType("GLshort") short q); + + // --- [ glTexCoord4i ] --- + + /** + * Integer version of {@link #glTexCoord4f TexCoord4f}. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord4i(@NativeType("GLint") int s, @NativeType("GLint") int t, @NativeType("GLint") int r, @NativeType("GLint") int q); + + // --- [ glTexCoord4d ] --- + + /** + * Double version of {@link #glTexCoord4f TexCoord4f}. + * + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoord4d(@NativeType("GLdouble") double s, @NativeType("GLdouble") double t, @NativeType("GLdouble") double r, @NativeType("GLdouble") double q); + + // --- [ glTexCoord4fv ] --- + + /** Unsafe version of: {@link #glTexCoord4fv TexCoord4fv} */ + public static native void nglTexCoord4fv(long v); + + /** + * Pointer version of {@link #glTexCoord4f TexCoord4f}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord4fv(@NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglTexCoord4fv(memAddress(v)); + } + + // --- [ glTexCoord4sv ] --- + + /** Unsafe version of: {@link #glTexCoord4sv TexCoord4sv} */ + public static native void nglTexCoord4sv(long v); + + /** + * Pointer version of {@link #glTexCoord4s TexCoord4s}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord4sv(@NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglTexCoord4sv(memAddress(v)); + } + + // --- [ glTexCoord4iv ] --- + + /** Unsafe version of: {@link #glTexCoord4iv TexCoord4iv} */ + public static native void nglTexCoord4iv(long v); + + /** + * Pointer version of {@link #glTexCoord4i TexCoord4i}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord4iv(@NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglTexCoord4iv(memAddress(v)); + } + + // --- [ glTexCoord4dv ] --- + + /** Unsafe version of: {@link #glTexCoord4dv TexCoord4dv} */ + public static native void nglTexCoord4dv(long v); + + /** + * Pointer version of {@link #glTexCoord4d TexCoord4d}. + * + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord4dv(@NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglTexCoord4dv(memAddress(v)); + } + + // --- [ glTexCoordPointer ] --- + + /** Unsafe version of: {@link #glTexCoordPointer TexCoordPointer} */ + public static native void nglTexCoordPointer(int size, int type, int stride, long pointer); + + /** + * Specifies the location and organization of a texture coordinate array. + * + * @param size the number of values per vertex that are stored in the array. One of:
    1234
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the texture coordinate array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglTexCoordPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a texture coordinate array. + * + * @param size the number of values per vertex that are stored in the array. One of:
    1234
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the texture coordinate array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglTexCoordPointer(size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a texture coordinate array. + * + * @param size the number of values per vertex that are stored in the array. One of:
    1234
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the texture coordinate array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglTexCoordPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a texture coordinate array. + * + * @param size the number of values per vertex that are stored in the array. One of:
    1234
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the texture coordinate array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglTexCoordPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a texture coordinate array. + * + * @param size the number of values per vertex that are stored in the array. One of:
    1234
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the texture coordinate array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglTexCoordPointer(size, type, stride, memAddress(pointer)); + } + + // --- [ glTexEnvi ] --- + + /** + * Sets parameters of the texture environment that specifies how texture values are interpreted when texturing a fragment, or sets per-texture-unit + * filtering parameters. + * + * @param target the texture environment target. One of:
    {@link #GL_TEXTURE_ENV TEXTURE_ENV}{@link GL14#GL_TEXTURE_FILTER_CONTROL TEXTURE_FILTER_CONTROL}{@link GL20#GL_POINT_SPRITE POINT_SPRITE}
    + * @param pname the parameter to set. One of:
    {@link GL20#GL_COORD_REPLACE COORD_REPLACE}{@link #GL_TEXTURE_ENV_MODE TEXTURE_ENV_MODE}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL13#GL_COMBINE_RGB COMBINE_RGB}{@link GL13#GL_COMBINE_ALPHA COMBINE_ALPHA}{@link GL15#GL_SRC0_RGB SRC0_RGB}
    {@link GL15#GL_SRC1_RGB SRC1_RGB}{@link GL15#GL_SRC2_RGB SRC2_RGB}{@link GL15#GL_SRC0_ALPHA SRC0_ALPHA}{@link GL15#GL_SRC1_ALPHA SRC1_ALPHA}{@link GL15#GL_SRC2_ALPHA SRC2_ALPHA}{@link GL13#GL_OPERAND0_RGB OPERAND0_RGB}
    {@link GL13#GL_OPERAND1_RGB OPERAND1_RGB}{@link GL13#GL_OPERAND2_RGB OPERAND2_RGB}{@link GL13#GL_OPERAND0_ALPHA OPERAND0_ALPHA}{@link GL13#GL_OPERAND1_ALPHA OPERAND1_ALPHA}{@link GL13#GL_OPERAND2_ALPHA OPERAND2_ALPHA}{@link GL13#GL_RGB_SCALE RGB_SCALE}
    {@link #GL_ALPHA_SCALE ALPHA_SCALE}
    + * @param param the parameter value. Scalar value or one of:
    {@link #GL_REPLACE REPLACE}{@link #GL_MODULATE MODULATE}{@link #GL_DECAL DECAL}{@link #GL_BLEND BLEND}{@link #GL_ADD ADD}{@link GL13#GL_COMBINE COMBINE}{@link GL13#GL_ADD_SIGNED ADD_SIGNED}{@link GL13#GL_INTERPOLATE INTERPOLATE}
    {@link GL13#GL_SUBTRACT SUBTRACT}{@link GL13#GL_DOT3_RGB DOT3_RGB}{@link GL13#GL_DOT3_RGBA DOT3_RGBA}{@link #GL_TEXTURE TEXTURE}{@link GL13#GL_TEXTURE0 TEXTURE0}GL13.GL_TEXTURE[1-31]{@link GL13#GL_CONSTANT CONSTANT}{@link GL13#GL_PRIMARY_COLOR PRIMARY_COLOR}
    {@link GL13#GL_PREVIOUS PREVIOUS}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexEnvi(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glTexEnviv ] --- + + /** Unsafe version of: {@link #glTexEnviv TexEnviv} */ + public static native void nglTexEnviv(int target, int pname, long params); + + /** + * Pointer version of {@link #glTexEnvi TexEnvi}. + * + * @param target the texture environment target. Must be:
    {@link #GL_TEXTURE_ENV TEXTURE_ENV}
    + * @param pname the parameter to set. Must be:
    {@link #GL_TEXTURE_ENV_COLOR TEXTURE_ENV_COLOR}
    + * @param params the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexEnviv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglTexEnviv(target, pname, memAddress(params)); + } + + // --- [ glTexEnvf ] --- + + /** + * Float version of {@link #glTexEnvi TexEnvi}. + * + * @param target the texture environment target + * @param pname the parameter to set + * @param param the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexEnvf(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glTexEnvfv ] --- + + /** Unsafe version of: {@link #glTexEnvfv TexEnvfv} */ + public static native void nglTexEnvfv(int target, int pname, long params); + + /** + * Pointer version of {@link #glTexEnvf TexEnvf}. + * + * @param target the texture environment target. Must be:
    {@link #GL_TEXTURE_ENV TEXTURE_ENV}
    + * @param pname the parameter to set. Must be:
    {@link #GL_TEXTURE_ENV_COLOR TEXTURE_ENV_COLOR}
    + * @param params the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexEnvfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglTexEnvfv(target, pname, memAddress(params)); + } + + // --- [ glTexGeni ] --- + + /** + * Sets an integer texture coordinate generation parameter. + * + *

    A texture coordinate generation function is enabled or disabled using {@link #glEnable Enable} and {@link #glDisable Disable} with an argument of + * {@link #GL_TEXTURE_GEN_S TEXTURE_GEN_S}, {@link #GL_TEXTURE_GEN_T TEXTURE_GEN_T}, {@link #GL_TEXTURE_GEN_R TEXTURE_GEN_R}, or {@link #GL_TEXTURE_GEN_Q TEXTURE_GEN_Q} (each indicates the corresponding texture + * coordinate). When enabled, the specified texture coordinate is computed according to the current {@link #GL_EYE_LINEAR EYE_LINEAR}, {@link #GL_OBJECT_LINEAR OBJECT_LINEAR} or + * {@link #GL_SPHERE_MAP SPHERE_MAP} specification, depending on the current setting of {@link #GL_TEXTURE_GEN_MODE TEXTURE_GEN_MODE} for that coordinate. When disabled, subsequent + * vertices will take the indicated texture coordinate from the current texture coordinates.

    + * + *

    The initial state has the texture generation function disabled for all texture coordinates. Initially all texture generation modes are EYE_LINEAR.

    + * + * @param coord the coordinate for which to set the parameter. One of:
    {@link #GL_S S}{@link #GL_T T}{@link #GL_R R}{@link #GL_Q Q}
    + * @param pname the parameter to set. Must be:
    {@link #GL_TEXTURE_GEN_MODE TEXTURE_GEN_MODE}
    + * @param param the parameter value. One of:
    {@link #GL_OBJECT_LINEAR OBJECT_LINEAR}{@link #GL_EYE_LINEAR EYE_LINEAR}{@link #GL_SPHERE_MAP SPHERE_MAP}{@link GL13#GL_REFLECTION_MAP REFLECTION_MAP}{@link GL13#GL_NORMAL_MAP NORMAL_MAP}
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexGeni(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glTexGeniv ] --- + + /** Unsafe version of: {@link #glTexGeniv TexGeniv} */ + public static native void nglTexGeniv(int coord, int pname, long params); + + /** + * Pointer version of {@link #glTexGeni TexGeni}. + * + * @param coord the coordinate for which to set the parameter + * @param pname the parameter to set. One of:
    {@link #GL_OBJECT_PLANE OBJECT_PLANE}{@link #GL_EYE_PLANE EYE_PLANE}
    + * @param params the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexGeniv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglTexGeniv(coord, pname, memAddress(params)); + } + + // --- [ glTexGenf ] --- + + /** + * Float version of {@link #glTexGeni TexGeni}. + * + * @param coord the coordinate for which to set the parameter + * @param pname the parameter to set + * @param param the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexGenf(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glTexGenfv ] --- + + /** Unsafe version of: {@link #glTexGenfv TexGenfv} */ + public static native void nglTexGenfv(int coord, int pname, long params); + + /** + * Pointer version of {@link #glTexGenf TexGenf}. + * + * @param coord the coordinate for which to set the parameter + * @param pname the parameter to set. One of:
    {@link #GL_OBJECT_PLANE OBJECT_PLANE}{@link #GL_EYE_PLANE EYE_PLANE}
    + * @param params the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexGenfv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglTexGenfv(coord, pname, memAddress(params)); + } + + // --- [ glTexGend ] --- + + /** + * Double version of {@link #glTexGeni TexGeni}. + * + * @param coord the coordinate for which to set the parameter + * @param pname the parameter to set + * @param param the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexGend(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLdouble") double param); + + // --- [ glTexGendv ] --- + + /** Unsafe version of: {@link #glTexGendv TexGendv} */ + public static native void nglTexGendv(int coord, int pname, long params); + + /** + * Pointer version of {@link #glTexGend TexGend}. + * + * @param coord the coordinate for which to set the parameter + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexGendv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLdouble const *") DoubleBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglTexGendv(coord, pname, memAddress(params)); + } + + // --- [ glTexImage1D ] --- + + /** Unsafe version of: {@link #glTexImage1D TexImage1D} */ + public static void nglTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, long pixels) { + GL11C.nglTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + GL11C.glTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL11C.glTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + GL11C.glTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + GL11C.glTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + GL11C.glTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + GL11C.glTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + // --- [ glTexImage2D ] --- + + /** Unsafe version of: {@link #glTexImage2D TexImage2D} */ + public static void nglTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels) { + GL11C.nglTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11C#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11C#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11C#GL_R3_G3_B2 R3_G3_B2}{@link GL11C#GL_RGB4 RGB4}{@link GL11C#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11C#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11C#GL_RGB10 RGB10}{@link GL11C#GL_RGB12 RGB12}{@link GL11C#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11C#GL_RGBA2 RGBA2}{@link GL11C#GL_RGBA4 RGBA4}{@link GL11C#GL_RGB5_A1 RGB5_A1}{@link GL11C#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11C#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11C#GL_RGBA12 RGBA12}{@link GL11C#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + GL11C.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11C#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11C#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11C#GL_R3_G3_B2 R3_G3_B2}{@link GL11C#GL_RGB4 RGB4}{@link GL11C#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11C#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11C#GL_RGB10 RGB10}{@link GL11C#GL_RGB12 RGB12}{@link GL11C#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11C#GL_RGBA2 RGBA2}{@link GL11C#GL_RGBA4 RGBA4}{@link GL11C#GL_RGB5_A1 RGB5_A1}{@link GL11C#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11C#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11C#GL_RGBA12 RGBA12}{@link GL11C#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL11C.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11C#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11C#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11C#GL_R3_G3_B2 R3_G3_B2}{@link GL11C#GL_RGB4 RGB4}{@link GL11C#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11C#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11C#GL_RGB10 RGB10}{@link GL11C#GL_RGB12 RGB12}{@link GL11C#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11C#GL_RGBA2 RGBA2}{@link GL11C#GL_RGBA4 RGBA4}{@link GL11C#GL_RGB5_A1 RGB5_A1}{@link GL11C#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11C#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11C#GL_RGBA12 RGBA12}{@link GL11C#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + GL11C.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11C#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11C#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11C#GL_R3_G3_B2 R3_G3_B2}{@link GL11C#GL_RGB4 RGB4}{@link GL11C#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11C#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11C#GL_RGB10 RGB10}{@link GL11C#GL_RGB12 RGB12}{@link GL11C#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11C#GL_RGBA2 RGBA2}{@link GL11C#GL_RGBA4 RGBA4}{@link GL11C#GL_RGB5_A1 RGB5_A1}{@link GL11C#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11C#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11C#GL_RGBA12 RGBA12}{@link GL11C#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + GL11C.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11C#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11C#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11C#GL_R3_G3_B2 R3_G3_B2}{@link GL11C#GL_RGB4 RGB4}{@link GL11C#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11C#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11C#GL_RGB10 RGB10}{@link GL11C#GL_RGB12 RGB12}{@link GL11C#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11C#GL_RGBA2 RGBA2}{@link GL11C#GL_RGBA4 RGBA4}{@link GL11C#GL_RGB5_A1 RGB5_A1}{@link GL11C#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11C#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11C#GL_RGBA12 RGBA12}{@link GL11C#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + GL11C.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11C#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11C#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11C#GL_R3_G3_B2 R3_G3_B2}{@link GL11C#GL_RGB4 RGB4}{@link GL11C#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11C#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11C#GL_RGB10 RGB10}{@link GL11C#GL_RGB12 RGB12}{@link GL11C#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11C#GL_RGBA2 RGBA2}{@link GL11C#GL_RGBA4 RGBA4}{@link GL11C#GL_RGB5_A1 RGB5_A1}{@link GL11C#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11C#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11C#GL_RGBA12 RGBA12}{@link GL11C#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + GL11C.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + // --- [ glCopyTexImage1D ] --- + + /** + * Defines a one-dimensional texel array in exactly the manner of {@link #glTexImage1D TexImage1D}, except that the image data are taken from the framebuffer rather + * than from client memory. For the purposes of decoding the texture image, {@code CopyTexImage1D} is equivalent to calling {@link #glCopyTexImage2D CopyTexImage2D} + * with corresponding arguments and height of 1, except that the height of the image is always 1, regardless of the value of border. level, internalformat, + * and border are specified using the same values, with the same meanings, as the corresponding arguments of {@link #glTexImage1D TexImage1D}. The constraints on + * width and border are exactly those of the corresponding arguments of {@link #glTexImage1D TexImage1D}. + * + * @param target the texture target. Must be:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalFormat the texture internal format. See {@link #glTexImage2D TexImage2D} for a list of supported formats. + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture width + * @param border the texture border width + * + * @see Reference Page + */ + public static void glCopyTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalFormat, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLint") int border) { + GL11C.glCopyTexImage1D(target, level, internalFormat, x, y, width, border); + } + + // --- [ glCopyTexImage2D ] --- + + /** + * Defines a two-dimensional texel array in exactly the manner of {@link #glTexImage2D TexImage2D}, except that the image data are taken from the framebuffer rather + * than from client memory. + * + *

    {@code x}, {@code y}, {@code width}, and {@code height} correspond precisely to the corresponding arguments to {@link #glReadPixels ReadPixels}; they specify the + * image's width and height, and the lower left (x, y) coordinates of the framebuffer region to be copied.

    + * + *

    The image is taken from the framebuffer exactly as if these arguments were passed to {@link GL11#glCopyPixels CopyPixels} with argument type set to {@link GL11C#GL_COLOR COLOR}, + * {@link GL11C#GL_DEPTH DEPTH}, or {@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}, depending on {@code internalformat}. RGBA data is taken from the current color buffer, while depth + * component and stencil index data are taken from the depth and stencil buffers, respectively.

    + * + *

    Subsequent processing is identical to that described for {@link #glTexImage2D TexImage2D}, beginning with clamping of the R, G, B, A, or depth values, and masking + * of the stencil index values from the resulting pixel groups. Parameters {@code level}, {@code internalformat}, and {@code border} are specified using + * the same values, with the same meanings, as the corresponding arguments of {@link #glTexImage2D TexImage2D}.

    + * + *

    The constraints on width, height, and border are exactly those for the corresponding arguments of {@link #glTexImage2D TexImage2D}.

    + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalFormat the texture internal format. See {@link #glTexImage2D TexImage2D} for a list of supported formats. + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * + * @see Reference Page + */ + public static void glCopyTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalFormat, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border) { + GL11C.glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border); + } + + // --- [ glCopyTexSubImage1D ] --- + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the {@code internalformat}, {@code width} or {@code border} + * parameters of the specified texel array, nor is any change made to texel values outside the specified subregion. See {@link #glCopyTexImage1D CopyTexImage1D} for more + * details. + * + * @param target the texture target. Must be:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail number + * @param xoffset the left texel coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * + * @see Reference Page + */ + public static void glCopyTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width) { + GL11C.glCopyTexSubImage1D(target, level, xoffset, x, y, width); + } + + // --- [ glCopyTexSubImage2D ] --- + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the {@code internalformat}, {@code width}, {@code height}, + * or {@code border} parameters of the specified texel array, nor is any change made to texel values outside the specified subregion. See + * {@link #glCopyTexImage2D CopyTexImage2D} for more details. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param xoffset the left texel coordinate of the texture subregion to update + * @param yoffset the lower texel coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * @param height the texture subregion height + * + * @see Reference Page + */ + public static void glCopyTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL11C.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); + } + + // --- [ glTexParameteri ] --- + + /** + * Sets the integer value of a texture parameter, which controls how the texel array is treated when specified or changed, and when applied to a fragment. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}{@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param pname the parameter to set. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11C#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11C#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11C#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11C#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11C#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    + * @param param the parameter value + * + * @see Reference Page + */ + public static void glTexParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint") int param) { + GL11C.glTexParameteri(target, pname, param); + } + + // --- [ glTexParameteriv ] --- + + /** Unsafe version of: {@link #glTexParameteriv TexParameteriv} */ + public static void nglTexParameteriv(int target, int pname, long params) { + GL11C.nglTexParameteriv(target, pname, params); + } + + /** + * Pointer version of {@link #glTexParameteri TexParameteri}. + * + * @param target the texture target + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glTexParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + GL11C.glTexParameteriv(target, pname, params); + } + + // --- [ glTexParameterf ] --- + + /** + * Float version of {@link #glTexParameteri TexParameteri}. + * + * @param target the texture target + * @param pname the parameter to set + * @param param the parameter value + * + * @see Reference Page + */ + public static void glTexParameterf(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param) { + GL11C.glTexParameterf(target, pname, param); + } + + // --- [ glTexParameterfv ] --- + + /** Unsafe version of: {@link #glTexParameterfv TexParameterfv} */ + public static void nglTexParameterfv(int target, int pname, long params) { + GL11C.nglTexParameterfv(target, pname, params); + } + + /** + * Pointer version of {@link #glTexParameterf TexParameterf}. + * + * @param target the texture target + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glTexParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + GL11C.glTexParameterfv(target, pname, params); + } + + // --- [ glTexSubImage1D ] --- + + /** Unsafe version of: {@link #glTexSubImage1D TexSubImage1D} */ + public static void nglTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, long pixels) { + GL11C.nglTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + GL11C.glTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL11C.glTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + GL11C.glTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + GL11C.glTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + GL11C.glTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link GL11C#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + GL11C.glTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + // --- [ glTexSubImage2D ] --- + + /** Unsafe version of: {@link #glTexSubImage2D TexSubImage2D} */ + public static void nglTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels) { + GL11C.nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + GL11C.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL11C.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + GL11C.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + GL11C.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + GL11C.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL11C#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11C#GL_RED RED}{@link GL11C#GL_GREEN GREEN}{@link GL11C#GL_BLUE BLUE}{@link GL11C#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11C#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11C#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11C#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11C#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11C#GL_BYTE BYTE}{@link GL11C#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11C#GL_SHORT SHORT}
    {@link GL11C#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11C#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11C#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + GL11C.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + // --- [ glTranslatef ] --- + + /** + * Manipulates the current matrix with a translation matrix along the x-, y- and z- axes. + * + *

    Calling this function is equivalent to calling {@link #glMultMatrixf MultMatrixf} with the following matrix:

    + * + * + * + * + * + * + *
    100x
    010y
    001z
    0001
    + * + * @param x the x-axis translation + * @param y the y-axis translation + * @param z the z-axis translation + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTranslatef(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z); + + // --- [ glTranslated ] --- + + /** + * Double version of {@link #glTranslatef Translatef}. + * + * @param x the x-axis translation + * @param y the y-axis translation + * @param z the z-axis translation + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTranslated(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glVertex2f ] --- + + /** + * Specifies a single vertex between {@link #glBegin Begin} and {@link #glEnd End} by giving its coordinates in two dimensions. The z coordinate is implicitly set + * to zero and the w coordinate to one. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex2f(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y); + + // --- [ glVertex2s ] --- + + /** + * Short version of {@link #glVertex2f Vertex2f}. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex2s(@NativeType("GLshort") short x, @NativeType("GLshort") short y); + + // --- [ glVertex2i ] --- + + /** + * Integer version of {@link #glVertex2f Vertex2f}. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex2i(@NativeType("GLint") int x, @NativeType("GLint") int y); + + // --- [ glVertex2d ] --- + + /** + * Double version of {@link #glVertex2f Vertex2f}. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex2d(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y); + + // --- [ glVertex2fv ] --- + + /** Unsafe version of: {@link #glVertex2fv Vertex2fv} */ + public static native void nglVertex2fv(long coords); + + /** + * Pointer version of {@link #glVertex2f Vertex2f}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex2fv(@NativeType("GLfloat const *") FloatBuffer coords) { + if (CHECKS) { + check(coords, 2); + } + nglVertex2fv(memAddress(coords)); + } + + // --- [ glVertex2sv ] --- + + /** Unsafe version of: {@link #glVertex2sv Vertex2sv} */ + public static native void nglVertex2sv(long coords); + + /** + * Pointer version of {@link #glVertex2s Vertex2s}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex2sv(@NativeType("GLshort const *") ShortBuffer coords) { + if (CHECKS) { + check(coords, 2); + } + nglVertex2sv(memAddress(coords)); + } + + // --- [ glVertex2iv ] --- + + /** Unsafe version of: {@link #glVertex2iv Vertex2iv} */ + public static native void nglVertex2iv(long coords); + + /** + * Pointer version of {@link #glVertex2i Vertex2i}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex2iv(@NativeType("GLint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 2); + } + nglVertex2iv(memAddress(coords)); + } + + // --- [ glVertex2dv ] --- + + /** Unsafe version of: {@link #glVertex2dv Vertex2dv} */ + public static native void nglVertex2dv(long coords); + + /** + * Pointer version of {@link #glVertex2d Vertex2d}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex2dv(@NativeType("GLdouble const *") DoubleBuffer coords) { + if (CHECKS) { + check(coords, 2); + } + nglVertex2dv(memAddress(coords)); + } + + // --- [ glVertex3f ] --- + + /** + * Specifies a single vertex between {@link #glBegin Begin} and {@link #glEnd End} by giving its coordinates in three dimensions. The w coordinate is implicitly set + * to one. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * @param z the vertex z coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex3f(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z); + + // --- [ glVertex3s ] --- + + /** + * Short version of {@link #glVertex3f Vertex3f}. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * @param z the vertex z coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex3s(@NativeType("GLshort") short x, @NativeType("GLshort") short y, @NativeType("GLshort") short z); + + // --- [ glVertex3i ] --- + + /** + * Integer version of {@link #glVertex3f Vertex3f}. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * @param z the vertex z coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex3i(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z); + + // --- [ glVertex3d ] --- + + /** + * Double version of {@link #glVertex3f Vertex3f}. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * @param z the vertex z coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex3d(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glVertex3fv ] --- + + /** Unsafe version of: {@link #glVertex3fv Vertex3fv} */ + public static native void nglVertex3fv(long coords); + + /** + * Pointer version of {@link #glVertex3f Vertex3f}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex3fv(@NativeType("GLfloat const *") FloatBuffer coords) { + if (CHECKS) { + check(coords, 3); + } + nglVertex3fv(memAddress(coords)); + } + + // --- [ glVertex3sv ] --- + + /** Unsafe version of: {@link #glVertex3sv Vertex3sv} */ + public static native void nglVertex3sv(long coords); + + /** + * Pointer version of {@link #glVertex3s Vertex3s}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex3sv(@NativeType("GLshort const *") ShortBuffer coords) { + if (CHECKS) { + check(coords, 3); + } + nglVertex3sv(memAddress(coords)); + } + + // --- [ glVertex3iv ] --- + + /** Unsafe version of: {@link #glVertex3iv Vertex3iv} */ + public static native void nglVertex3iv(long coords); + + /** + * Pointer version of {@link #glVertex3i Vertex3i}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex3iv(@NativeType("GLint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 3); + } + nglVertex3iv(memAddress(coords)); + } + + // --- [ glVertex3dv ] --- + + /** Unsafe version of: {@link #glVertex3dv Vertex3dv} */ + public static native void nglVertex3dv(long coords); + + /** + * Pointer version of {@link #glVertex3d Vertex3d}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex3dv(@NativeType("GLdouble const *") DoubleBuffer coords) { + if (CHECKS) { + check(coords, 3); + } + nglVertex3dv(memAddress(coords)); + } + + // --- [ glVertex4f ] --- + + /** + * Specifies a single vertex between {@link #glBegin Begin} and {@link #glEnd End} by giving its coordinates in four dimensions. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * @param z the vertex z coordinate + * @param w the vertex w coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex4f(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z, @NativeType("GLfloat") float w); + + // --- [ glVertex4s ] --- + + /** + * Short version of {@link #glVertex4f Vertex4f}. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * @param z the vertex z coordinate + * @param w the vertex w coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex4s(@NativeType("GLshort") short x, @NativeType("GLshort") short y, @NativeType("GLshort") short z, @NativeType("GLshort") short w); + + // --- [ glVertex4i ] --- + + /** + * Integer version of {@link #glVertex4f Vertex4f}. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * @param z the vertex z coordinate + * @param w the vertex w coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex4i(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w); + + // --- [ glVertex4d ] --- + + /** + * Double version of {@link #glVertex4f Vertex4f}. + * + * @param x the vertex x coordinate + * @param y the vertex y coordinate + * @param z the vertex z coordinate + * @param w the vertex w coordinate + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertex4d(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w); + + // --- [ glVertex4fv ] --- + + /** Unsafe version of: {@link #glVertex4fv Vertex4fv} */ + public static native void nglVertex4fv(long coords); + + /** + * Pointer version of {@link #glVertex4f Vertex4f}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex4fv(@NativeType("GLfloat const *") FloatBuffer coords) { + if (CHECKS) { + check(coords, 4); + } + nglVertex4fv(memAddress(coords)); + } + + // --- [ glVertex4sv ] --- + + /** Unsafe version of: {@link #glVertex4sv Vertex4sv} */ + public static native void nglVertex4sv(long coords); + + /** + * Pointer version of {@link #glVertex4s Vertex4s}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex4sv(@NativeType("GLshort const *") ShortBuffer coords) { + if (CHECKS) { + check(coords, 4); + } + nglVertex4sv(memAddress(coords)); + } + + // --- [ glVertex4iv ] --- + + /** Unsafe version of: {@link #glVertex4iv Vertex4iv} */ + public static native void nglVertex4iv(long coords); + + /** + * Pointer version of {@link #glVertex4i Vertex4i}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex4iv(@NativeType("GLint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 4); + } + nglVertex4iv(memAddress(coords)); + } + + // --- [ glVertex4dv ] --- + + /** Unsafe version of: {@link #glVertex4dv Vertex4dv} */ + public static native void nglVertex4dv(long coords); + + /** + * Pointer version of {@link #glVertex4d Vertex4d}. + * + * @param coords the vertex buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex4dv(@NativeType("GLdouble const *") DoubleBuffer coords) { + if (CHECKS) { + check(coords, 4); + } + nglVertex4dv(memAddress(coords)); + } + + // --- [ glVertexPointer ] --- + + /** Unsafe version of: {@link #glVertexPointer VertexPointer} */ + public static native void nglVertexPointer(int size, int type, int stride, long pointer); + + /** + * Specifies the location and organization of a vertex array. + * + * @param size the number of values per vertex that are stored in the array. One of:
    234
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the vertex array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertexPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglVertexPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a vertex array. + * + * @param size the number of values per vertex that are stored in the array. One of:
    234
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the vertex array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertexPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglVertexPointer(size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex array. + * + * @param size the number of values per vertex that are stored in the array. One of:
    234
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the vertex array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertexPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglVertexPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a vertex array. + * + * @param size the number of values per vertex that are stored in the array. One of:
    234
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the vertex array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertexPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglVertexPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a vertex array. + * + * @param size the number of values per vertex that are stored in the array. One of:
    234
    + * @param type the data type of the values stored in the array. One of:
    {@link #GL_SHORT SHORT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}{@link #GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the vertex array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertexPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglVertexPointer(size, type, stride, memAddress(pointer)); + } + + // --- [ glViewport ] --- + + /** + * Specifies the viewport transformation parameters for all viewports. + * + *

    The location of the viewport's bottom-left corner, given by {@code (x, y)}, are clamped to be within the implementation-dependent viewport bounds range. + * The viewport bounds range {@code [min, max]} tuple may be determined by calling {@link #glGetFloatv GetFloatv} with the symbolic + * constant {@link GL41#GL_VIEWPORT_BOUNDS_RANGE VIEWPORT_BOUNDS_RANGE}. Viewport width and height are clamped to implementation-dependent maximums when specified. The maximum + * width and height may be found by calling {@link #glGetFloatv GetFloatv} with the symbolic constant {@link GL11C#GL_MAX_VIEWPORT_DIMS MAX_VIEWPORT_DIMS}. The + * maximum viewport dimensions must be greater than or equal to the larger of the visible dimensions of the display being rendered to (if a display + * exists), and the largest renderbuffer image which can be successfully created and attached to a framebuffer object.

    + * + *

    In the initial state, {@code w} and {@code h} for each viewport are set to the width and height, respectively, of the window into which the GL is to do + * its rendering. If the default framebuffer is bound but no default framebuffer is associated with the GL context, then {@code w} and {@code h} are + * initially set to zero.

    + * + * @param x the left viewport coordinate + * @param y the bottom viewport coordinate + * @param w the viewport width + * @param h the viewport height + * + * @see Reference Page + */ + public static void glViewport(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int w, @NativeType("GLsizei") int h) { + GL11C.glViewport(x, y, w, h); + } + + /** + * Array version of: {@link #glAreTexturesResident AreTexturesResident} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + @NativeType("GLboolean") + public static boolean glAreTexturesResident(@NativeType("GLuint const *") int[] textures, @NativeType("GLboolean *") ByteBuffer residences) { + long __functionAddress = GL.getICD().glAreTexturesResident; + if (CHECKS) { + check(__functionAddress); + check(residences, textures.length); + } + return callPPZ(textures.length, textures, memAddress(residences), __functionAddress); + } + + /** + * Array version of: {@link #glClipPlane ClipPlane} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glClipPlane(@NativeType("GLenum") int plane, @NativeType("GLdouble const *") double[] equation) { + long __functionAddress = GL.getICD().glClipPlane; + if (CHECKS) { + check(__functionAddress); + check(equation, 4); + } + callPV(plane, equation, __functionAddress); + } + + /** + * Array version of: {@link #glColor3sv Color3sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3sv(@NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glColor3sv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glColor3iv Color3iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3iv(@NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glColor3iv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glColor3fv Color3fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3fv(@NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glColor3fv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glColor3dv Color3dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3dv(@NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glColor3dv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glColor3usv Color3usv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3usv(@NativeType("GLushort const *") short[] v) { + long __functionAddress = GL.getICD().glColor3usv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glColor3uiv Color3uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor3uiv(@NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glColor3uiv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glColor4sv Color4sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4sv(@NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glColor4sv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glColor4iv Color4iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4iv(@NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glColor4iv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glColor4fv Color4fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4fv(@NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glColor4fv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glColor4dv Color4dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4dv(@NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glColor4dv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glColor4usv Color4usv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4usv(@NativeType("GLushort const *") short[] v) { + long __functionAddress = GL.getICD().glColor4usv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glColor4uiv Color4uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColor4uiv(@NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glColor4uiv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glDrawPixels DrawPixels} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glDrawPixels(@NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glDrawPixels; + if (CHECKS) { + check(__functionAddress); + } + callPV(width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glDrawPixels DrawPixels} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glDrawPixels(@NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glDrawPixels; + if (CHECKS) { + check(__functionAddress); + } + callPV(width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glDrawPixels DrawPixels} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glDrawPixels(@NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glDrawPixels; + if (CHECKS) { + check(__functionAddress); + } + callPV(width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glEvalCoord1fv EvalCoord1fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glEvalCoord1fv(@NativeType("GLfloat const *") float[] u) { + long __functionAddress = GL.getICD().glEvalCoord1fv; + if (CHECKS) { + check(__functionAddress); + check(u, 1); + } + callPV(u, __functionAddress); + } + + /** + * Array version of: {@link #glEvalCoord1dv EvalCoord1dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glEvalCoord1dv(@NativeType("GLdouble const *") double[] u) { + long __functionAddress = GL.getICD().glEvalCoord1dv; + if (CHECKS) { + check(__functionAddress); + check(u, 1); + } + callPV(u, __functionAddress); + } + + /** + * Array version of: {@link #glEvalCoord2fv EvalCoord2fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glEvalCoord2fv(@NativeType("GLfloat const *") float[] u) { + long __functionAddress = GL.getICD().glEvalCoord2fv; + if (CHECKS) { + check(__functionAddress); + check(u, 2); + } + callPV(u, __functionAddress); + } + + /** + * Array version of: {@link #glEvalCoord2dv EvalCoord2dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glEvalCoord2dv(@NativeType("GLdouble const *") double[] u) { + long __functionAddress = GL.getICD().glEvalCoord2dv; + if (CHECKS) { + check(__functionAddress); + check(u, 2); + } + callPV(u, __functionAddress); + } + + /** + * Array version of: {@link #glFeedbackBuffer FeedbackBuffer} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFeedbackBuffer(@NativeType("GLenum") int type, @NativeType("GLfloat *") float[] buffer) { + long __functionAddress = GL.getICD().glFeedbackBuffer; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffer.length, type, buffer, __functionAddress); + } + + /** + * Array version of: {@link #glFogiv Fogiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogiv(@NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glFogiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glFogfv Fogfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glFogfv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGenTextures GenTextures} + * + * @see Reference Page + */ + public static void glGenTextures(@NativeType("GLuint *") int[] textures) { + GL11C.glGenTextures(textures); + } + + /** + * Array version of: {@link #glDeleteTextures DeleteTextures} + * + * @see Reference Page + */ + public static void glDeleteTextures(@NativeType("GLuint const *") int[] textures) { + GL11C.glDeleteTextures(textures); + } + + /** + * Array version of: {@link #glGetClipPlane GetClipPlane} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetClipPlane(@NativeType("GLenum") int plane, @NativeType("GLdouble *") double[] equation) { + long __functionAddress = GL.getICD().glGetClipPlane; + if (CHECKS) { + check(__functionAddress); + check(equation, 4); + } + callPV(plane, equation, __functionAddress); + } + + /** + * Array version of: {@link #glGetFloatv GetFloatv} + * + * @see Reference Page + */ + public static void glGetFloatv(@NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + GL11C.glGetFloatv(pname, params); + } + + /** + * Array version of: {@link #glGetIntegerv GetIntegerv} + * + * @see Reference Page + */ + public static void glGetIntegerv(@NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL11C.glGetIntegerv(pname, params); + } + + /** + * Array version of: {@link #glGetDoublev GetDoublev} + * + * @see Reference Page + */ + public static void glGetDoublev(@NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] params) { + GL11C.glGetDoublev(pname, params); + } + + /** + * Array version of: {@link #glGetLightiv GetLightiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetLightiv(@NativeType("GLenum") int light, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] data) { + long __functionAddress = GL.getICD().glGetLightiv; + if (CHECKS) { + check(__functionAddress); + check(data, 4); + } + callPV(light, pname, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetLightfv GetLightfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetLightfv(@NativeType("GLenum") int light, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] data) { + long __functionAddress = GL.getICD().glGetLightfv; + if (CHECKS) { + check(__functionAddress); + check(data, 4); + } + callPV(light, pname, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetMapiv GetMapiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetMapiv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLint *") int[] data) { + long __functionAddress = GL.getICD().glGetMapiv; + if (CHECKS) { + check(__functionAddress); + check(data, 4); + } + callPV(target, query, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetMapfv GetMapfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetMapfv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLfloat *") float[] data) { + long __functionAddress = GL.getICD().glGetMapfv; + if (CHECKS) { + check(__functionAddress); + check(data, 4); + } + callPV(target, query, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetMapdv GetMapdv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetMapdv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLdouble *") double[] data) { + long __functionAddress = GL.getICD().glGetMapdv; + if (CHECKS) { + check(__functionAddress); + check(data, 4); + } + callPV(target, query, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetMaterialiv GetMaterialiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetMaterialiv(@NativeType("GLenum") int face, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] data) { + long __functionAddress = GL.getICD().glGetMaterialiv; + if (CHECKS) { + check(__functionAddress); + check(data, 1); + } + callPV(face, pname, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetMaterialfv GetMaterialfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetMaterialfv(@NativeType("GLenum") int face, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] data) { + long __functionAddress = GL.getICD().glGetMaterialfv; + if (CHECKS) { + check(__functionAddress); + check(data, 1); + } + callPV(face, pname, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetPixelMapfv GetPixelMapfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetPixelMapfv(@NativeType("GLenum") int map, @NativeType("GLfloat *") float[] data) { + long __functionAddress = GL.getICD().glGetPixelMapfv; + if (CHECKS) { + check(__functionAddress); + check(data, 32); + } + callPV(map, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetPixelMapusv GetPixelMapusv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetPixelMapusv(@NativeType("GLenum") int map, @NativeType("GLushort *") short[] data) { + long __functionAddress = GL.getICD().glGetPixelMapusv; + if (CHECKS) { + check(__functionAddress); + check(data, 32); + } + callPV(map, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetPixelMapuiv GetPixelMapuiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetPixelMapuiv(@NativeType("GLenum") int map, @NativeType("GLuint *") int[] data) { + long __functionAddress = GL.getICD().glGetPixelMapuiv; + if (CHECKS) { + check(__functionAddress); + check(data, 32); + } + callPV(map, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexEnviv GetTexEnviv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetTexEnviv(@NativeType("GLenum") int env, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] data) { + long __functionAddress = GL.getICD().glGetTexEnviv; + if (CHECKS) { + check(__functionAddress); + check(data, 1); + } + callPV(env, pname, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexEnvfv GetTexEnvfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetTexEnvfv(@NativeType("GLenum") int env, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] data) { + long __functionAddress = GL.getICD().glGetTexEnvfv; + if (CHECKS) { + check(__functionAddress); + check(data, 1); + } + callPV(env, pname, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexGeniv GetTexGeniv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetTexGeniv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] data) { + long __functionAddress = GL.getICD().glGetTexGeniv; + if (CHECKS) { + check(__functionAddress); + check(data, 1); + } + callPV(coord, pname, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexGenfv GetTexGenfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetTexGenfv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] data) { + long __functionAddress = GL.getICD().glGetTexGenfv; + if (CHECKS) { + check(__functionAddress); + check(data, 4); + } + callPV(coord, pname, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexGendv GetTexGendv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glGetTexGendv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] data) { + long __functionAddress = GL.getICD().glGetTexGendv; + if (CHECKS) { + check(__functionAddress); + check(data, 4); + } + callPV(coord, pname, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexImage GetTexImage} + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + GL11C.glGetTexImage(tex, level, format, type, pixels); + } + + /** + * Array version of: {@link #glGetTexImage GetTexImage} + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + GL11C.glGetTexImage(tex, level, format, type, pixels); + } + + /** + * Array version of: {@link #glGetTexImage GetTexImage} + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + GL11C.glGetTexImage(tex, level, format, type, pixels); + } + + /** + * Array version of: {@link #glGetTexImage GetTexImage} + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] pixels) { + GL11C.glGetTexImage(tex, level, format, type, pixels); + } + + /** + * Array version of: {@link #glGetTexLevelParameteriv GetTexLevelParameteriv} + * + * @see Reference Page + */ + public static void glGetTexLevelParameteriv(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL11C.glGetTexLevelParameteriv(target, level, pname, params); + } + + /** + * Array version of: {@link #glGetTexLevelParameterfv GetTexLevelParameterfv} + * + * @see Reference Page + */ + public static void glGetTexLevelParameterfv(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + GL11C.glGetTexLevelParameterfv(target, level, pname, params); + } + + /** + * Array version of: {@link #glGetTexParameteriv GetTexParameteriv} + * + * @see Reference Page + */ + public static void glGetTexParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL11C.glGetTexParameteriv(target, pname, params); + } + + /** + * Array version of: {@link #glGetTexParameterfv GetTexParameterfv} + * + * @see Reference Page + */ + public static void glGetTexParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + GL11C.glGetTexParameterfv(target, pname, params); + } + + /** + * Array version of: {@link #glIndexiv Indexiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexiv(@NativeType("GLint const *") int[] index) { + long __functionAddress = GL.getICD().glIndexiv; + if (CHECKS) { + check(__functionAddress); + check(index, 1); + } + callPV(index, __functionAddress); + } + + /** + * Array version of: {@link #glIndexsv Indexsv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexsv(@NativeType("GLshort const *") short[] index) { + long __functionAddress = GL.getICD().glIndexsv; + if (CHECKS) { + check(__functionAddress); + check(index, 1); + } + callPV(index, __functionAddress); + } + + /** + * Array version of: {@link #glIndexfv Indexfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexfv(@NativeType("GLfloat const *") float[] index) { + long __functionAddress = GL.getICD().glIndexfv; + if (CHECKS) { + check(__functionAddress); + check(index, 1); + } + callPV(index, __functionAddress); + } + + /** + * Array version of: {@link #glIndexdv Indexdv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glIndexdv(@NativeType("GLdouble const *") double[] index) { + long __functionAddress = GL.getICD().glIndexdv; + if (CHECKS) { + check(__functionAddress); + check(index, 1); + } + callPV(index, __functionAddress); + } + + /** + * Array version of: {@link #glInterleavedArrays InterleavedArrays} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glInterleavedArrays(@NativeType("GLenum") int format, @NativeType("GLsizei") int stride, @NativeType("void const *") short[] pointer) { + long __functionAddress = GL.getICD().glInterleavedArrays; + if (CHECKS) { + check(__functionAddress); + } + callPV(format, stride, pointer, __functionAddress); + } + + /** + * Array version of: {@link #glInterleavedArrays InterleavedArrays} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glInterleavedArrays(@NativeType("GLenum") int format, @NativeType("GLsizei") int stride, @NativeType("void const *") int[] pointer) { + long __functionAddress = GL.getICD().glInterleavedArrays; + if (CHECKS) { + check(__functionAddress); + } + callPV(format, stride, pointer, __functionAddress); + } + + /** + * Array version of: {@link #glInterleavedArrays InterleavedArrays} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glInterleavedArrays(@NativeType("GLenum") int format, @NativeType("GLsizei") int stride, @NativeType("void const *") float[] pointer) { + long __functionAddress = GL.getICD().glInterleavedArrays; + if (CHECKS) { + check(__functionAddress); + } + callPV(format, stride, pointer, __functionAddress); + } + + /** + * Array version of: {@link #glInterleavedArrays InterleavedArrays} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glInterleavedArrays(@NativeType("GLenum") int format, @NativeType("GLsizei") int stride, @NativeType("void const *") double[] pointer) { + long __functionAddress = GL.getICD().glInterleavedArrays; + if (CHECKS) { + check(__functionAddress); + } + callPV(format, stride, pointer, __functionAddress); + } + + /** + * Array version of: {@link #glLightModeliv LightModeliv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLightModeliv(@NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glLightModeliv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glLightModelfv LightModelfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLightModelfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glLightModelfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glLightiv Lightiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLightiv(@NativeType("GLenum") int light, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glLightiv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(light, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glLightfv Lightfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLightfv(@NativeType("GLenum") int light, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glLightfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(light, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glLoadMatrixf LoadMatrixf} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLoadMatrixf(@NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glLoadMatrixf; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + + /** + * Array version of: {@link #glLoadMatrixd LoadMatrixd} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLoadMatrixd(@NativeType("GLdouble const *") double[] m) { + long __functionAddress = GL.getICD().glLoadMatrixd; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + + /** + * Array version of: {@link #glMap1f Map1f} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMap1f(@NativeType("GLenum") int target, @NativeType("GLfloat") float u1, @NativeType("GLfloat") float u2, @NativeType("GLint") int stride, @NativeType("GLint") int order, @NativeType("GLfloat const *") float[] points) { + long __functionAddress = GL.getICD().glMap1f; + if (CHECKS) { + check(__functionAddress); + check(points, order * stride); + } + callPV(target, u1, u2, stride, order, points, __functionAddress); + } + + /** + * Array version of: {@link #glMap1d Map1d} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMap1d(@NativeType("GLenum") int target, @NativeType("GLdouble") double u1, @NativeType("GLdouble") double u2, @NativeType("GLint") int stride, @NativeType("GLint") int order, @NativeType("GLdouble const *") double[] points) { + long __functionAddress = GL.getICD().glMap1d; + if (CHECKS) { + check(__functionAddress); + check(points, stride * order); + } + callPV(target, u1, u2, stride, order, points, __functionAddress); + } + + /** + * Array version of: {@link #glMap2f Map2f} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMap2f(@NativeType("GLenum") int target, @NativeType("GLfloat") float u1, @NativeType("GLfloat") float u2, @NativeType("GLint") int ustride, @NativeType("GLint") int uorder, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2, @NativeType("GLint") int vstride, @NativeType("GLint") int vorder, @NativeType("GLfloat const *") float[] points) { + long __functionAddress = GL.getICD().glMap2f; + if (CHECKS) { + check(__functionAddress); + check(points, ustride * uorder * vstride * vorder); + } + callPV(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points, __functionAddress); + } + + /** + * Array version of: {@link #glMap2d Map2d} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMap2d(@NativeType("GLenum") int target, @NativeType("GLdouble") double u1, @NativeType("GLdouble") double u2, @NativeType("GLint") int ustride, @NativeType("GLint") int uorder, @NativeType("GLdouble") double v1, @NativeType("GLdouble") double v2, @NativeType("GLint") int vstride, @NativeType("GLint") int vorder, @NativeType("GLdouble const *") double[] points) { + long __functionAddress = GL.getICD().glMap2d; + if (CHECKS) { + check(__functionAddress); + check(points, ustride * uorder * vstride * vorder); + } + callPV(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points, __functionAddress); + } + + /** + * Array version of: {@link #glMaterialiv Materialiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMaterialiv(@NativeType("GLenum") int face, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glMaterialiv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(face, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glMaterialfv Materialfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMaterialfv(@NativeType("GLenum") int face, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glMaterialfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(face, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glMultMatrixf MultMatrixf} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultMatrixf(@NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMultMatrixf; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + + /** + * Array version of: {@link #glMultMatrixd MultMatrixd} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultMatrixd(@NativeType("GLdouble const *") double[] m) { + long __functionAddress = GL.getICD().glMultMatrixd; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + + /** + * Array version of: {@link #glNormal3fv Normal3fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormal3fv(@NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glNormal3fv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glNormal3sv Normal3sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormal3sv(@NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glNormal3sv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glNormal3iv Normal3iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormal3iv(@NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glNormal3iv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glNormal3dv Normal3dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormal3dv(@NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glNormal3dv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glPixelMapfv PixelMapfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPixelMapfv(@NativeType("GLenum") int map, @NativeType("GLfloat const *") float[] values) { + long __functionAddress = GL.getICD().glPixelMapfv; + if (CHECKS) { + check(__functionAddress); + } + callPV(map, values.length, values, __functionAddress); + } + + /** + * Array version of: {@link #glPixelMapusv PixelMapusv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPixelMapusv(@NativeType("GLenum") int map, @NativeType("GLushort const *") short[] values) { + long __functionAddress = GL.getICD().glPixelMapusv; + if (CHECKS) { + check(__functionAddress); + } + callPV(map, values.length, values, __functionAddress); + } + + /** + * Array version of: {@link #glPixelMapuiv PixelMapuiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPixelMapuiv(@NativeType("GLenum") int map, @NativeType("GLuint const *") int[] values) { + long __functionAddress = GL.getICD().glPixelMapuiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(map, values.length, values, __functionAddress); + } + + /** + * Array version of: {@link #glPrioritizeTextures PrioritizeTextures} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glPrioritizeTextures(@NativeType("GLuint const *") int[] textures, @NativeType("GLfloat const *") float[] priorities) { + long __functionAddress = GL.getICD().glPrioritizeTextures; + if (CHECKS) { + check(__functionAddress); + check(priorities, textures.length); + } + callPPV(textures.length, textures, priorities, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos2iv RasterPos2iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos2iv(@NativeType("GLint const *") int[] coords) { + long __functionAddress = GL.getICD().glRasterPos2iv; + if (CHECKS) { + check(__functionAddress); + check(coords, 2); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos2sv RasterPos2sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos2sv(@NativeType("GLshort const *") short[] coords) { + long __functionAddress = GL.getICD().glRasterPos2sv; + if (CHECKS) { + check(__functionAddress); + check(coords, 2); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos2fv RasterPos2fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos2fv(@NativeType("GLfloat const *") float[] coords) { + long __functionAddress = GL.getICD().glRasterPos2fv; + if (CHECKS) { + check(__functionAddress); + check(coords, 2); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos2dv RasterPos2dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos2dv(@NativeType("GLdouble const *") double[] coords) { + long __functionAddress = GL.getICD().glRasterPos2dv; + if (CHECKS) { + check(__functionAddress); + check(coords, 2); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos3iv RasterPos3iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos3iv(@NativeType("GLint const *") int[] coords) { + long __functionAddress = GL.getICD().glRasterPos3iv; + if (CHECKS) { + check(__functionAddress); + check(coords, 3); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos3sv RasterPos3sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos3sv(@NativeType("GLshort const *") short[] coords) { + long __functionAddress = GL.getICD().glRasterPos3sv; + if (CHECKS) { + check(__functionAddress); + check(coords, 3); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos3fv RasterPos3fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos3fv(@NativeType("GLfloat const *") float[] coords) { + long __functionAddress = GL.getICD().glRasterPos3fv; + if (CHECKS) { + check(__functionAddress); + check(coords, 3); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos3dv RasterPos3dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos3dv(@NativeType("GLdouble const *") double[] coords) { + long __functionAddress = GL.getICD().glRasterPos3dv; + if (CHECKS) { + check(__functionAddress); + check(coords, 3); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos4iv RasterPos4iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos4iv(@NativeType("GLint const *") int[] coords) { + long __functionAddress = GL.getICD().glRasterPos4iv; + if (CHECKS) { + check(__functionAddress); + check(coords, 4); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos4sv RasterPos4sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos4sv(@NativeType("GLshort const *") short[] coords) { + long __functionAddress = GL.getICD().glRasterPos4sv; + if (CHECKS) { + check(__functionAddress); + check(coords, 4); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos4fv RasterPos4fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos4fv(@NativeType("GLfloat const *") float[] coords) { + long __functionAddress = GL.getICD().glRasterPos4fv; + if (CHECKS) { + check(__functionAddress); + check(coords, 4); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glRasterPos4dv RasterPos4dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRasterPos4dv(@NativeType("GLdouble const *") double[] coords) { + long __functionAddress = GL.getICD().glRasterPos4dv; + if (CHECKS) { + check(__functionAddress); + check(coords, 4); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glReadPixels ReadPixels} + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + GL11C.glReadPixels(x, y, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glReadPixels ReadPixels} + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + GL11C.glReadPixels(x, y, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glReadPixels ReadPixels} + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + GL11C.glReadPixels(x, y, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glRectiv Rectiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRectiv(@NativeType("GLint const *") int[] v1, @NativeType("GLint const *") int[] v2) { + long __functionAddress = GL.getICD().glRectiv; + if (CHECKS) { + check(__functionAddress); + check(v1, 2); + check(v2, 2); + } + callPPV(v1, v2, __functionAddress); + } + + /** + * Array version of: {@link #glRectsv Rectsv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRectsv(@NativeType("GLshort const *") short[] v1, @NativeType("GLshort const *") short[] v2) { + long __functionAddress = GL.getICD().glRectsv; + if (CHECKS) { + check(__functionAddress); + check(v1, 2); + check(v2, 2); + } + callPPV(v1, v2, __functionAddress); + } + + /** + * Array version of: {@link #glRectfv Rectfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRectfv(@NativeType("GLfloat const *") float[] v1, @NativeType("GLfloat const *") float[] v2) { + long __functionAddress = GL.getICD().glRectfv; + if (CHECKS) { + check(__functionAddress); + check(v1, 2); + check(v2, 2); + } + callPPV(v1, v2, __functionAddress); + } + + /** + * Array version of: {@link #glRectdv Rectdv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glRectdv(@NativeType("GLdouble const *") double[] v1, @NativeType("GLdouble const *") double[] v2) { + long __functionAddress = GL.getICD().glRectdv; + if (CHECKS) { + check(__functionAddress); + check(v1, 2); + check(v2, 2); + } + callPPV(v1, v2, __functionAddress); + } + + /** + * Array version of: {@link #glSelectBuffer SelectBuffer} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSelectBuffer(@NativeType("GLuint *") int[] buffer) { + long __functionAddress = GL.getICD().glSelectBuffer; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffer.length, buffer, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord1fv TexCoord1fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord1fv(@NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glTexCoord1fv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord1sv TexCoord1sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord1sv(@NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glTexCoord1sv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord1iv TexCoord1iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord1iv(@NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glTexCoord1iv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord1dv TexCoord1dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord1dv(@NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glTexCoord1dv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord2fv TexCoord2fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord2fv(@NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glTexCoord2fv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord2sv TexCoord2sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord2sv(@NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glTexCoord2sv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord2iv TexCoord2iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord2iv(@NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glTexCoord2iv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord2dv TexCoord2dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord2dv(@NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glTexCoord2dv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord3fv TexCoord3fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord3fv(@NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glTexCoord3fv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord3sv TexCoord3sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord3sv(@NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glTexCoord3sv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord3iv TexCoord3iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord3iv(@NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glTexCoord3iv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord3dv TexCoord3dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord3dv(@NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glTexCoord3dv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord4fv TexCoord4fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord4fv(@NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glTexCoord4fv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord4sv TexCoord4sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord4sv(@NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glTexCoord4sv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord4iv TexCoord4iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord4iv(@NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glTexCoord4iv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoord4dv TexCoord4dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoord4dv(@NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glTexCoord4dv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glTexEnviv TexEnviv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexEnviv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glTexEnviv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTexEnvfv TexEnvfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexEnvfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glTexEnvfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTexGeniv TexGeniv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexGeniv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glTexGeniv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(coord, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTexGenfv TexGenfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexGenfv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glTexGenfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(coord, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTexGendv TexGendv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexGendv(@NativeType("GLenum") int coord, @NativeType("GLenum") int pname, @NativeType("GLdouble const *") double[] params) { + long __functionAddress = GL.getICD().glTexGendv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(coord, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage1D TexImage1D} + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + GL11C.glTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexImage1D TexImage1D} + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + GL11C.glTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexImage1D TexImage1D} + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + GL11C.glTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexImage1D TexImage1D} + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + GL11C.glTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexImage2D TexImage2D} + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + GL11C.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexImage2D TexImage2D} + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + GL11C.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexImage2D TexImage2D} + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + GL11C.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexImage2D TexImage2D} + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + GL11C.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexParameteriv TexParameteriv} + * + * @see Reference Page + */ + public static void glTexParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + GL11C.glTexParameteriv(target, pname, params); + } + + /** + * Array version of: {@link #glTexParameterfv TexParameterfv} + * + * @see Reference Page + */ + public static void glTexParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + GL11C.glTexParameterfv(target, pname, params); + } + + /** + * Array version of: {@link #glTexSubImage1D TexSubImage1D} + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + GL11C.glTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + /** + * Array version of: {@link #glTexSubImage1D TexSubImage1D} + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + GL11C.glTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + /** + * Array version of: {@link #glTexSubImage1D TexSubImage1D} + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + GL11C.glTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + /** + * Array version of: {@link #glTexSubImage1D TexSubImage1D} + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + GL11C.glTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + /** + * Array version of: {@link #glTexSubImage2D TexSubImage2D} + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + GL11C.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glTexSubImage2D TexSubImage2D} + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + GL11C.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glTexSubImage2D TexSubImage2D} + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + GL11C.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glTexSubImage2D TexSubImage2D} + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + GL11C.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glVertex2fv Vertex2fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex2fv(@NativeType("GLfloat const *") float[] coords) { + long __functionAddress = GL.getICD().glVertex2fv; + if (CHECKS) { + check(__functionAddress); + check(coords, 2); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glVertex2sv Vertex2sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex2sv(@NativeType("GLshort const *") short[] coords) { + long __functionAddress = GL.getICD().glVertex2sv; + if (CHECKS) { + check(__functionAddress); + check(coords, 2); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glVertex2iv Vertex2iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex2iv(@NativeType("GLint const *") int[] coords) { + long __functionAddress = GL.getICD().glVertex2iv; + if (CHECKS) { + check(__functionAddress); + check(coords, 2); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glVertex2dv Vertex2dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex2dv(@NativeType("GLdouble const *") double[] coords) { + long __functionAddress = GL.getICD().glVertex2dv; + if (CHECKS) { + check(__functionAddress); + check(coords, 2); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glVertex3fv Vertex3fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex3fv(@NativeType("GLfloat const *") float[] coords) { + long __functionAddress = GL.getICD().glVertex3fv; + if (CHECKS) { + check(__functionAddress); + check(coords, 3); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glVertex3sv Vertex3sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex3sv(@NativeType("GLshort const *") short[] coords) { + long __functionAddress = GL.getICD().glVertex3sv; + if (CHECKS) { + check(__functionAddress); + check(coords, 3); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glVertex3iv Vertex3iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex3iv(@NativeType("GLint const *") int[] coords) { + long __functionAddress = GL.getICD().glVertex3iv; + if (CHECKS) { + check(__functionAddress); + check(coords, 3); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glVertex3dv Vertex3dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex3dv(@NativeType("GLdouble const *") double[] coords) { + long __functionAddress = GL.getICD().glVertex3dv; + if (CHECKS) { + check(__functionAddress); + check(coords, 3); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glVertex4fv Vertex4fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex4fv(@NativeType("GLfloat const *") float[] coords) { + long __functionAddress = GL.getICD().glVertex4fv; + if (CHECKS) { + check(__functionAddress); + check(coords, 4); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glVertex4sv Vertex4sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex4sv(@NativeType("GLshort const *") short[] coords) { + long __functionAddress = GL.getICD().glVertex4sv; + if (CHECKS) { + check(__functionAddress); + check(coords, 4); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glVertex4iv Vertex4iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex4iv(@NativeType("GLint const *") int[] coords) { + long __functionAddress = GL.getICD().glVertex4iv; + if (CHECKS) { + check(__functionAddress); + check(coords, 4); + } + callPV(coords, __functionAddress); + } + + /** + * Array version of: {@link #glVertex4dv Vertex4dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertex4dv(@NativeType("GLdouble const *") double[] coords) { + long __functionAddress = GL.getICD().glVertex4dv; + if (CHECKS) { + check(__functionAddress); + check(coords, 4); + } + callPV(coords, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL11C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL11C.java new file mode 100644 index 000000000..dec438a3a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL11C.java @@ -0,0 +1,2664 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality of a forward compatible context, up to version 1.1. + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL11C { + + static { GL.initialize(); } + + /** AlphaFunction */ + public static final int + GL_NEVER = 0x200, + GL_LESS = 0x201, + GL_EQUAL = 0x202, + GL_LEQUAL = 0x203, + GL_GREATER = 0x204, + GL_NOTEQUAL = 0x205, + GL_GEQUAL = 0x206, + GL_ALWAYS = 0x207; + + /** AttribMask */ + public static final int + GL_DEPTH_BUFFER_BIT = 0x100, + GL_STENCIL_BUFFER_BIT = 0x400, + GL_COLOR_BUFFER_BIT = 0x4000; + + /** BeginMode */ + public static final int + GL_POINTS = 0x0, + GL_LINES = 0x1, + GL_LINE_LOOP = 0x2, + GL_LINE_STRIP = 0x3, + GL_TRIANGLES = 0x4, + GL_TRIANGLE_STRIP = 0x5, + GL_TRIANGLE_FAN = 0x6, + GL_QUADS = 0x7; + + /** BlendingFactorDest */ + public static final int + GL_ZERO = 0, + GL_ONE = 1, + GL_SRC_COLOR = 0x300, + GL_ONE_MINUS_SRC_COLOR = 0x301, + GL_SRC_ALPHA = 0x302, + GL_ONE_MINUS_SRC_ALPHA = 0x303, + GL_DST_ALPHA = 0x304, + GL_ONE_MINUS_DST_ALPHA = 0x305; + + /** BlendingFactorSrc */ + public static final int + GL_DST_COLOR = 0x306, + GL_ONE_MINUS_DST_COLOR = 0x307, + GL_SRC_ALPHA_SATURATE = 0x308; + + /** Boolean */ + public static final int + GL_TRUE = 1, + GL_FALSE = 0; + + /** DataType */ + public static final int + GL_BYTE = 0x1400, + GL_UNSIGNED_BYTE = 0x1401, + GL_SHORT = 0x1402, + GL_UNSIGNED_SHORT = 0x1403, + GL_INT = 0x1404, + GL_UNSIGNED_INT = 0x1405, + GL_FLOAT = 0x1406, + GL_DOUBLE = 0x140A; + + /** DrawBufferMode */ + public static final int + GL_NONE = 0, + GL_FRONT_LEFT = 0x400, + GL_FRONT_RIGHT = 0x401, + GL_BACK_LEFT = 0x402, + GL_BACK_RIGHT = 0x403, + GL_FRONT = 0x404, + GL_BACK = 0x405, + GL_LEFT = 0x406, + GL_RIGHT = 0x407, + GL_FRONT_AND_BACK = 0x408; + + /** ErrorCode */ + public static final int + GL_NO_ERROR = 0, + GL_INVALID_ENUM = 0x500, + GL_INVALID_VALUE = 0x501, + GL_INVALID_OPERATION = 0x502, + GL_STACK_OVERFLOW = 0x503, + GL_STACK_UNDERFLOW = 0x504, + GL_OUT_OF_MEMORY = 0x505; + + /** FrontFaceDirection */ + public static final int + GL_CW = 0x900, + GL_CCW = 0x901; + + /** GetTarget */ + public static final int + GL_POINT_SIZE = 0xB11, + GL_POINT_SIZE_RANGE = 0xB12, + GL_POINT_SIZE_GRANULARITY = 0xB13, + GL_LINE_SMOOTH = 0xB20, + GL_LINE_WIDTH = 0xB21, + GL_LINE_WIDTH_RANGE = 0xB22, + GL_LINE_WIDTH_GRANULARITY = 0xB23, + GL_POLYGON_MODE = 0xB40, + GL_POLYGON_SMOOTH = 0xB41, + GL_CULL_FACE = 0xB44, + GL_CULL_FACE_MODE = 0xB45, + GL_FRONT_FACE = 0xB46, + GL_DEPTH_RANGE = 0xB70, + GL_DEPTH_TEST = 0xB71, + GL_DEPTH_WRITEMASK = 0xB72, + GL_DEPTH_CLEAR_VALUE = 0xB73, + GL_DEPTH_FUNC = 0xB74, + GL_STENCIL_TEST = 0xB90, + GL_STENCIL_CLEAR_VALUE = 0xB91, + GL_STENCIL_FUNC = 0xB92, + GL_STENCIL_VALUE_MASK = 0xB93, + GL_STENCIL_FAIL = 0xB94, + GL_STENCIL_PASS_DEPTH_FAIL = 0xB95, + GL_STENCIL_PASS_DEPTH_PASS = 0xB96, + GL_STENCIL_REF = 0xB97, + GL_STENCIL_WRITEMASK = 0xB98, + GL_VIEWPORT = 0xBA2, + GL_DITHER = 0xBD0, + GL_BLEND_DST = 0xBE0, + GL_BLEND_SRC = 0xBE1, + GL_BLEND = 0xBE2, + GL_LOGIC_OP_MODE = 0xBF0, + GL_COLOR_LOGIC_OP = 0xBF2, + GL_DRAW_BUFFER = 0xC01, + GL_READ_BUFFER = 0xC02, + GL_SCISSOR_BOX = 0xC10, + GL_SCISSOR_TEST = 0xC11, + GL_COLOR_CLEAR_VALUE = 0xC22, + GL_COLOR_WRITEMASK = 0xC23, + GL_DOUBLEBUFFER = 0xC32, + GL_STEREO = 0xC33, + GL_LINE_SMOOTH_HINT = 0xC52, + GL_POLYGON_SMOOTH_HINT = 0xC53, + GL_UNPACK_SWAP_BYTES = 0xCF0, + GL_UNPACK_LSB_FIRST = 0xCF1, + GL_UNPACK_ROW_LENGTH = 0xCF2, + GL_UNPACK_SKIP_ROWS = 0xCF3, + GL_UNPACK_SKIP_PIXELS = 0xCF4, + GL_UNPACK_ALIGNMENT = 0xCF5, + GL_PACK_SWAP_BYTES = 0xD00, + GL_PACK_LSB_FIRST = 0xD01, + GL_PACK_ROW_LENGTH = 0xD02, + GL_PACK_SKIP_ROWS = 0xD03, + GL_PACK_SKIP_PIXELS = 0xD04, + GL_PACK_ALIGNMENT = 0xD05, + GL_MAX_TEXTURE_SIZE = 0xD33, + GL_MAX_VIEWPORT_DIMS = 0xD3A, + GL_SUBPIXEL_BITS = 0xD50, + GL_TEXTURE_1D = 0xDE0, + GL_TEXTURE_2D = 0xDE1; + + /** GetTextureParameter */ + public static final int + GL_TEXTURE_WIDTH = 0x1000, + GL_TEXTURE_HEIGHT = 0x1001, + GL_TEXTURE_INTERNAL_FORMAT = 0x1003, + GL_TEXTURE_BORDER_COLOR = 0x1004; + + /** HintMode */ + public static final int + GL_DONT_CARE = 0x1100, + GL_FASTEST = 0x1101, + GL_NICEST = 0x1102; + + /** LogicOp */ + public static final int + GL_CLEAR = 0x1500, + GL_AND = 0x1501, + GL_AND_REVERSE = 0x1502, + GL_COPY = 0x1503, + GL_AND_INVERTED = 0x1504, + GL_NOOP = 0x1505, + GL_XOR = 0x1506, + GL_OR = 0x1507, + GL_NOR = 0x1508, + GL_EQUIV = 0x1509, + GL_INVERT = 0x150A, + GL_OR_REVERSE = 0x150B, + GL_COPY_INVERTED = 0x150C, + GL_OR_INVERTED = 0x150D, + GL_NAND = 0x150E, + GL_SET = 0x150F; + + /** Token accepted or provided by the {@code identifier} parameters of ObjectLabel and GetObjectLabel. */ + public static final int GL_TEXTURE = 0x1702; + + /** PixelCopyType */ + public static final int + GL_COLOR = 0x1800, + GL_DEPTH = 0x1801, + GL_STENCIL = 0x1802; + + /** PixelFormat */ + public static final int + GL_STENCIL_INDEX = 0x1901, + GL_DEPTH_COMPONENT = 0x1902, + GL_RED = 0x1903, + GL_GREEN = 0x1904, + GL_BLUE = 0x1905, + GL_ALPHA = 0x1906, + GL_RGB = 0x1907, + GL_RGBA = 0x1908; + + /** PolygonMode */ + public static final int + GL_POINT = 0x1B00, + GL_LINE = 0x1B01, + GL_FILL = 0x1B02; + + /** StencilOp */ + public static final int + GL_KEEP = 0x1E00, + GL_REPLACE = 0x1E01, + GL_INCR = 0x1E02, + GL_DECR = 0x1E03; + + /** StringName */ + public static final int + GL_VENDOR = 0x1F00, + GL_RENDERER = 0x1F01, + GL_VERSION = 0x1F02, + GL_EXTENSIONS = 0x1F03; + + /** TextureMagFilter */ + public static final int + GL_NEAREST = 0x2600, + GL_LINEAR = 0x2601; + + /** TextureMinFilter */ + public static final int + GL_NEAREST_MIPMAP_NEAREST = 0x2700, + GL_LINEAR_MIPMAP_NEAREST = 0x2701, + GL_NEAREST_MIPMAP_LINEAR = 0x2702, + GL_LINEAR_MIPMAP_LINEAR = 0x2703; + + /** TextureParameterName */ + public static final int + GL_TEXTURE_MAG_FILTER = 0x2800, + GL_TEXTURE_MIN_FILTER = 0x2801, + GL_TEXTURE_WRAP_S = 0x2802, + GL_TEXTURE_WRAP_T = 0x2803; + + /** TextureWrapMode */ + public static final int GL_REPEAT = 0x2901; + + /** polygon_offset */ + public static final int + GL_POLYGON_OFFSET_FACTOR = 0x8038, + GL_POLYGON_OFFSET_UNITS = 0x2A00, + GL_POLYGON_OFFSET_POINT = 0x2A01, + GL_POLYGON_OFFSET_LINE = 0x2A02, + GL_POLYGON_OFFSET_FILL = 0x8037; + + /** texture */ + public static final int + GL_R3_G3_B2 = 0x2A10, + GL_RGB4 = 0x804F, + GL_RGB5 = 0x8050, + GL_RGB8 = 0x8051, + GL_RGB10 = 0x8052, + GL_RGB12 = 0x8053, + GL_RGB16 = 0x8054, + GL_RGBA2 = 0x8055, + GL_RGBA4 = 0x8056, + GL_RGB5_A1 = 0x8057, + GL_RGBA8 = 0x8058, + GL_RGB10_A2 = 0x8059, + GL_RGBA12 = 0x805A, + GL_RGBA16 = 0x805B, + GL_TEXTURE_RED_SIZE = 0x805C, + GL_TEXTURE_GREEN_SIZE = 0x805D, + GL_TEXTURE_BLUE_SIZE = 0x805E, + GL_TEXTURE_ALPHA_SIZE = 0x805F, + GL_PROXY_TEXTURE_1D = 0x8063, + GL_PROXY_TEXTURE_2D = 0x8064; + + /** texture_object */ + public static final int + GL_TEXTURE_BINDING_1D = 0x8068, + GL_TEXTURE_BINDING_2D = 0x8069; + + /** vertex_array */ + public static final int GL_VERTEX_ARRAY = 0x8074; + + protected GL11C() { + throw new UnsupportedOperationException(); + } + + // --- [ glEnable ] --- + + /** + * Enables the specified OpenGL state. + * + * @param target the OpenGL state to enable + * + * @see Reference Page + */ + public static native void glEnable(@NativeType("GLenum") int target); + + // --- [ glDisable ] --- + + /** + * Disables the specified OpenGL state. + * + * @param target the OpenGL state to disable + * + * @see Reference Page + */ + public static native void glDisable(@NativeType("GLenum") int target); + + // --- [ glBindTexture ] --- + + /** + * Binds the a texture to a texture target. + * + *

    While a texture object is bound, GL operations on the target to which it is bound affect the bound object, and queries of the target to which it is + * bound return state from the bound object. If texture mapping of the dimensionality of the target to which a texture object is bound is enabled, the + * state of the bound texture object directs the texturing operation.

    + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param texture the texture object to bind + * + * @see Reference Page + */ + public static native void glBindTexture(@NativeType("GLenum") int target, @NativeType("GLuint") int texture); + + // --- [ glBlendFunc ] --- + + /** + * Specifies the weighting factors used by the blend equation, for both RGB and alpha functions and for all draw buffers. + * + * @param sfactor the source weighting factor. One of:
    {@link #GL_ZERO ZERO}{@link #GL_ONE ONE}{@link #GL_SRC_COLOR SRC_COLOR}{@link #GL_ONE_MINUS_SRC_COLOR ONE_MINUS_SRC_COLOR}{@link #GL_DST_COLOR DST_COLOR}
    {@link #GL_ONE_MINUS_DST_COLOR ONE_MINUS_DST_COLOR}{@link #GL_SRC_ALPHA SRC_ALPHA}{@link #GL_ONE_MINUS_SRC_ALPHA ONE_MINUS_SRC_ALPHA}{@link #GL_DST_ALPHA DST_ALPHA}{@link #GL_ONE_MINUS_DST_ALPHA ONE_MINUS_DST_ALPHA}
    {@link GL14#GL_CONSTANT_COLOR CONSTANT_COLOR}{@link GL14#GL_ONE_MINUS_CONSTANT_COLOR ONE_MINUS_CONSTANT_COLOR}{@link GL14#GL_CONSTANT_ALPHA CONSTANT_ALPHA}{@link GL14#GL_ONE_MINUS_CONSTANT_ALPHA ONE_MINUS_CONSTANT_ALPHA}{@link #GL_SRC_ALPHA_SATURATE SRC_ALPHA_SATURATE}
    {@link GL33#GL_SRC1_COLOR SRC1_COLOR}{@link GL33#GL_ONE_MINUS_SRC1_COLOR ONE_MINUS_SRC1_COLOR}{@link GL15#GL_SRC1_ALPHA SRC1_ALPHA}{@link GL33#GL_ONE_MINUS_SRC1_ALPHA ONE_MINUS_SRC1_ALPHA}
    + * @param dfactor the destination weighting factor + * + * @see Reference Page + */ + public static native void glBlendFunc(@NativeType("GLenum") int sfactor, @NativeType("GLenum") int dfactor); + + // --- [ glClear ] --- + + /** + * Sets portions of every pixel in a particular buffer to the same value. The value to which each buffer is cleared depends on the setting of the clear + * value for that buffer. + * + * @param mask Zero or the bitwise OR of one or more values indicating which buffers are to be cleared. One or more of:
    {@link #GL_COLOR_BUFFER_BIT COLOR_BUFFER_BIT}{@link #GL_DEPTH_BUFFER_BIT DEPTH_BUFFER_BIT}{@link #GL_STENCIL_BUFFER_BIT STENCIL_BUFFER_BIT}
    + * + * @see Reference Page + */ + public static native void glClear(@NativeType("GLbitfield") int mask); + + // --- [ glClearColor ] --- + + /** + * Sets the clear value for fixed-point and floating-point color buffers in RGBA mode. The specified components are stored as floating-point values. + * + * @param red the value to which to clear the R channel of the color buffer + * @param green the value to which to clear the G channel of the color buffer + * @param blue the value to which to clear the B channel of the color buffer + * @param alpha the value to which to clear the A channel of the color buffer + * + * @see Reference Page + */ + public static native void glClearColor(@NativeType("GLfloat") float red, @NativeType("GLfloat") float green, @NativeType("GLfloat") float blue, @NativeType("GLfloat") float alpha); + + // --- [ glClearDepth ] --- + + /** + * Sets the depth value used when clearing the depth buffer. When clearing a fixedpoint depth buffer, {@code depth} is clamped to the range [0,1] and + * converted to fixed-point. No conversion is applied when clearing a floating-point depth buffer. + * + * @param depth the value to which to clear the depth buffer + * + * @see Reference Page + */ + public static native void glClearDepth(@NativeType("GLdouble") double depth); + + // --- [ glClearStencil ] --- + + /** + * Sets the value to which to clear the stencil buffer. {@code s} is masked to the number of bitplanes in the stencil buffer. + * + * @param s the value to which to clear the stencil buffer + * + * @see Reference Page + */ + public static native void glClearStencil(@NativeType("GLint") int s); + + // --- [ glColorMask ] --- + + /** + * Masks the writing of R, G, B and A values to all draw buffers. In the initial state, all color values are enabled for writing for all draw buffers. + * + * @param red whether R values are written or not + * @param green whether G values are written or not + * @param blue whether B values are written or not + * @param alpha whether A values are written or not + * + * @see Reference Page + */ + public static native void glColorMask(@NativeType("GLboolean") boolean red, @NativeType("GLboolean") boolean green, @NativeType("GLboolean") boolean blue, @NativeType("GLboolean") boolean alpha); + + // --- [ glCullFace ] --- + + /** + * Specifies which polygon faces are culled if {@link #GL_CULL_FACE CULL_FACE} is enabled. Front-facing polygons are rasterized if either culling is disabled or the + * CullFace mode is {@link #GL_BACK BACK} while back-facing polygons are rasterized only if either culling is disabled or the CullFace mode is + * {@link #GL_FRONT FRONT}. The initial setting of the CullFace mode is {@link #GL_BACK BACK}. Initially, culling is disabled. + * + * @param mode the CullFace mode. One of:
    {@link #GL_FRONT FRONT}{@link #GL_BACK BACK}{@link #GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * + * @see Reference Page + */ + public static native void glCullFace(@NativeType("GLenum") int mode); + + // --- [ glDepthFunc ] --- + + /** + * Specifies the comparison that takes place during the depth buffer test (when {@link #GL_DEPTH_TEST DEPTH_TEST} is enabled). + * + * @param func the depth test comparison. One of:
    {@link #GL_NEVER NEVER}{@link #GL_ALWAYS ALWAYS}{@link #GL_LESS LESS}{@link #GL_LEQUAL LEQUAL}{@link #GL_EQUAL EQUAL}{@link #GL_GREATER GREATER}{@link #GL_GEQUAL GEQUAL}{@link #GL_NOTEQUAL NOTEQUAL}
    + * + * @see Reference Page + */ + public static native void glDepthFunc(@NativeType("GLenum") int func); + + // --- [ glDepthMask ] --- + + /** + * Masks the writing of depth values to the depth buffer. In the initial state, the depth buffer is enabled for writing. + * + * @param flag whether depth values are written or not. + * + * @see Reference Page + */ + public static native void glDepthMask(@NativeType("GLboolean") boolean flag); + + // --- [ glDepthRange ] --- + + /** + * Sets the depth range for all viewports to the same values. + * + * @param zNear the near depth range + * @param zFar the far depth range + * + * @see Reference Page + */ + public static native void glDepthRange(@NativeType("GLdouble") double zNear, @NativeType("GLdouble") double zFar); + + // --- [ glDrawArrays ] --- + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices. Elements {@code first} through + * first + count – 1 of each enabled non-instanced array are transferred to the GL. + * + *

    If an array corresponding to an attribute required by a vertex shader is not enabled, then the corresponding element is taken from the current attribute + * state. If an array is enabled, the corresponding current vertex attribute value is unaffected by the execution of this function.

    + * + * @param mode the kind of primitives being constructed + * @param first the first vertex to transfer to the GL + * @param count the number of vertices after {@code first} to transfer to the GL + * + * @see Reference Page + */ + public static native void glDrawArrays(@NativeType("GLenum") int mode, @NativeType("GLint") int first, @NativeType("GLsizei") int count); + + // --- [ glDrawBuffer ] --- + + /** + * Defines the color buffer to which fragment color zero is written. + * + *

    Acceptable values for {@code buf} depend on whether the GL is using the default framebuffer (i.e., {@link GL30#GL_DRAW_FRAMEBUFFER_BINDING DRAW_FRAMEBUFFER_BINDING} is zero), or + * a framebuffer object (i.e., {@link GL30#GL_DRAW_FRAMEBUFFER_BINDING DRAW_FRAMEBUFFER_BINDING} is non-zero). In the initial state, the GL is bound to the default framebuffer.

    + * + * @param buf the color buffer to draw to. One of:
    {@link #GL_NONE NONE}{@link #GL_FRONT_LEFT FRONT_LEFT}{@link #GL_FRONT_RIGHT FRONT_RIGHT}{@link #GL_BACK_LEFT BACK_LEFT}{@link #GL_BACK_RIGHT BACK_RIGHT}{@link #GL_FRONT FRONT}{@link #GL_BACK BACK}{@link #GL_LEFT LEFT}
    {@link #GL_RIGHT RIGHT}{@link #GL_FRONT_AND_BACK FRONT_AND_BACK}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static native void glDrawBuffer(@NativeType("GLenum") int buf); + + // --- [ glDrawElements ] --- + + /** + * Unsafe version of: {@link #glDrawElements DrawElements} + * + * @param count the number of vertices to transfer to the GL + * @param type indicates the type of index values in {@code indices}. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static native void nglDrawElements(int mode, int count, int type, long indices); + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices to the GL. + * The ith element transferred by {@code DrawElements} will be taken from element {@code indices[i]} (if no element array buffer is bound), or + * from the element whose index is stored in the currently bound element array buffer at offset {@code indices + i}. + * + * @param mode the kind of primitives being constructed. One of:
    {@link #GL_POINTS POINTS}{@link #GL_LINE_STRIP LINE_STRIP}{@link #GL_LINE_LOOP LINE_LOOP}{@link #GL_LINES LINES}{@link #GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link #GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link #GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param count the number of vertices to transfer to the GL + * @param type indicates the type of index values in {@code indices}. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices the index values + * + * @see Reference Page + */ + public static void glDrawElements(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices) { + nglDrawElements(mode, count, type, indices); + } + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices to the GL. + * The ith element transferred by {@code DrawElements} will be taken from element {@code indices[i]} (if no element array buffer is bound), or + * from the element whose index is stored in the currently bound element array buffer at offset {@code indices + i}. + * + * @param mode the kind of primitives being constructed. One of:
    {@link #GL_POINTS POINTS}{@link #GL_LINE_STRIP LINE_STRIP}{@link #GL_LINE_LOOP LINE_LOOP}{@link #GL_LINES LINES}{@link #GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link #GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link #GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param type indicates the type of index values in {@code indices}. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices the index values + * + * @see Reference Page + */ + public static void glDrawElements(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices) { + nglDrawElements(mode, indices.remaining() >> GLChecks.typeToByteShift(type), type, memAddress(indices)); + } + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices to the GL. + * The ith element transferred by {@code DrawElements} will be taken from element {@code indices[i]} (if no element array buffer is bound), or + * from the element whose index is stored in the currently bound element array buffer at offset {@code indices + i}. + * + * @param mode the kind of primitives being constructed. One of:
    {@link #GL_POINTS POINTS}{@link #GL_LINE_STRIP LINE_STRIP}{@link #GL_LINE_LOOP LINE_LOOP}{@link #GL_LINES LINES}{@link #GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link #GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link #GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the index values + * + * @see Reference Page + */ + public static void glDrawElements(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices) { + nglDrawElements(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, memAddress(indices)); + } + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices to the GL. + * The ith element transferred by {@code DrawElements} will be taken from element {@code indices[i]} (if no element array buffer is bound), or + * from the element whose index is stored in the currently bound element array buffer at offset {@code indices + i}. + * + * @param mode the kind of primitives being constructed. One of:
    {@link #GL_POINTS POINTS}{@link #GL_LINE_STRIP LINE_STRIP}{@link #GL_LINE_LOOP LINE_LOOP}{@link #GL_LINES LINES}{@link #GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link #GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link #GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the index values + * + * @see Reference Page + */ + public static void glDrawElements(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices) { + nglDrawElements(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, memAddress(indices)); + } + + /** + * Constructs a sequence of geometric primitives by successively transferring elements for {@code count} vertices to the GL. + * The ith element transferred by {@code DrawElements} will be taken from element {@code indices[i]} (if no element array buffer is bound), or + * from the element whose index is stored in the currently bound element array buffer at offset {@code indices + i}. + * + * @param mode the kind of primitives being constructed. One of:
    {@link #GL_POINTS POINTS}{@link #GL_LINE_STRIP LINE_STRIP}{@link #GL_LINE_LOOP LINE_LOOP}{@link #GL_LINES LINES}{@link #GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link #GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link #GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the index values + * + * @see Reference Page + */ + public static void glDrawElements(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices) { + nglDrawElements(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, memAddress(indices)); + } + + // --- [ glFinish ] --- + + /** + * Forces all previously issued GL commands to complete. {@code Finish} does not return until all effects from such commands on GL client and server + * state and the framebuffer are fully realized. + * + * @see Reference Page + */ + public static native void glFinish(); + + // --- [ glFlush ] --- + + /** + * Causes all previously issued GL commands to complete in finite time (although such commands may still be executing when {@code Flush} returns). + * + * @see Reference Page + */ + public static native void glFlush(); + + // --- [ glFrontFace ] --- + + /** + * The first step of polygon rasterization is to determine if the polygon is back-facing or front-facing. This determination is made based on the sign of + * the (clipped or unclipped) polygon's area computed in window coordinates. The interpretation of the sign of this value is controlled with this function. + * In the initial state, the front face direction is set to {@link #GL_CCW CCW}. + * + * @param dir the front face direction. One of:
    {@link #GL_CCW CCW}{@link #GL_CW CW}
    + * + * @see Reference Page + */ + public static native void glFrontFace(@NativeType("GLenum") int dir); + + // --- [ glGenTextures ] --- + + /** + * Unsafe version of: {@link #glGenTextures GenTextures} + * + * @param n the number of textures to create + */ + public static native void nglGenTextures(int n, long textures); + + /** + * Returns n previously unused texture names in textures. These names are marked as used, for the purposes of GenTextures only, but they acquire texture + * state and a dimensionality only when they are first bound, just as if they were unused. + * + * @param textures a scalar or buffer in which to place the returned texture names + * + * @see Reference Page + */ + public static void glGenTextures(@NativeType("GLuint *") IntBuffer textures) { + nglGenTextures(textures.remaining(), memAddress(textures)); + } + + /** + * Returns n previously unused texture names in textures. These names are marked as used, for the purposes of GenTextures only, but they acquire texture + * state and a dimensionality only when they are first bound, just as if they were unused. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenTextures() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer textures = stack.callocInt(1); + nglGenTextures(1, memAddress(textures)); + return textures.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDeleteTextures ] --- + + /** + * Unsafe version of: {@link #glDeleteTextures DeleteTextures} + * + * @param n the number of texture names in the {@code textures} parameter + */ + public static native void nglDeleteTextures(int n, long textures); + + /** + * Deletes texture objects. After a texture object is deleted, it has no contents or dimensionality, and its name is again unused. If a texture that is + * currently bound to any of the target bindings of {@link #glBindTexture BindTexture} is deleted, it is as though {@link #glBindTexture BindTexture} had been executed with the + * same target and texture zero. Additionally, special care must be taken when deleting a texture if any of the images of the texture are attached to a + * framebuffer object. + * + *

    Unused names in textures that have been marked as used for the purposes of {@link #glGenTextures GenTextures} are marked as unused again. Unused names in textures are + * silently ignored, as is the name zero.

    + * + * @param textures contains {@code n} names of texture objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteTextures(@NativeType("GLuint const *") IntBuffer textures) { + nglDeleteTextures(textures.remaining(), memAddress(textures)); + } + + /** + * Deletes texture objects. After a texture object is deleted, it has no contents or dimensionality, and its name is again unused. If a texture that is + * currently bound to any of the target bindings of {@link #glBindTexture BindTexture} is deleted, it is as though {@link #glBindTexture BindTexture} had been executed with the + * same target and texture zero. Additionally, special care must be taken when deleting a texture if any of the images of the texture are attached to a + * framebuffer object. + * + *

    Unused names in textures that have been marked as used for the purposes of {@link #glGenTextures GenTextures} are marked as unused again. Unused names in textures are + * silently ignored, as is the name zero.

    + * + * @see Reference Page + */ + public static void glDeleteTextures(@NativeType("GLuint const *") int texture) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer textures = stack.ints(texture); + nglDeleteTextures(1, memAddress(textures)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetBooleanv ] --- + + /** Unsafe version of: {@link #glGetBooleanv GetBooleanv} */ + public static native void nglGetBooleanv(int pname, long params); + + /** + * Returns the current boolean value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetBooleanv(@NativeType("GLenum") int pname, @NativeType("GLboolean *") ByteBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetBooleanv(pname, memAddress(params)); + } + + /** + * Returns the current boolean value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * + * @see Reference Page + */ + @NativeType("void") + public static boolean glGetBoolean(@NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + ByteBuffer params = stack.calloc(1); + nglGetBooleanv(pname, memAddress(params)); + return params.get(0) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetFloatv ] --- + + /** Unsafe version of: {@link #glGetFloatv GetFloatv} */ + public static native void nglGetFloatv(int pname, long params); + + /** + * Returns the current float value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetFloatv(@NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetFloatv(pname, memAddress(params)); + } + + /** + * Returns the current float value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetFloat(@NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetFloatv(pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetIntegerv ] --- + + /** Unsafe version of: {@link #glGetIntegerv GetIntegerv} */ + public static native void nglGetIntegerv(int pname, long params); + + /** + * Returns the current integer value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetIntegerv(@NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetIntegerv(pname, memAddress(params)); + } + + /** + * Returns the current integer value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetInteger(@NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetIntegerv(pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetDoublev ] --- + + /** Unsafe version of: {@link #glGetDoublev GetDoublev} */ + public static native void nglGetDoublev(int pname, long params); + + /** + * Returns the current double value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetDoublev(@NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetDoublev(pname, memAddress(params)); + } + + /** + * Returns the current double value of the specified state variable. + * + *

    LWJGL note: The state that corresponds to the state variable may be a single value or an array of values. In the case of an array of values, + * LWJGL will not validate if {@code params} has enough space to store that array. Doing so would introduce significant overhead, as the + * OpenGL state variables are too many. It is the user's responsibility to avoid JVM crashes by ensuring enough space for the returned values.

    + * + * @param pname the state variable + * + * @see Reference Page + */ + @NativeType("void") + public static double glGetDouble(@NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer params = stack.callocDouble(1); + nglGetDoublev(pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetError ] --- + + /** + * Returns error information. + * + *

    Each detectable error is assigned a numeric code. When an error is detected, a flag is set and the code is recorded. Further errors, if they occur, do + * not affect this recorded code. When {@code GetError} is called, the code is returned and the flag is cleared, so that a further error will again record + * its code. If a call to {@code GetError} returns {@link #GL_NO_ERROR NO_ERROR}, then there has been no detectable error since the last call to {@code GetError} (or since + * the GL was initialized).

    + * + * @see Reference Page + */ + @NativeType("GLenum") + public static native int glGetError(); + + // --- [ glGetPointerv ] --- + + /** Unsafe version of: {@link #glGetPointerv GetPointerv} */ + public static native void nglGetPointerv(int pname, long params); + + /** + * Returns a pointer in the current GL context. + * + * @param pname the pointer to return. One of:
    {@link GL43#GL_DEBUG_CALLBACK_FUNCTION DEBUG_CALLBACK_FUNCTION}{@link GL43#GL_DEBUG_CALLBACK_USER_PARAM DEBUG_CALLBACK_USER_PARAM}
    + * @param params a buffer in which to place the returned pointer + * + * @see Reference Page + */ + public static void glGetPointerv(@NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetPointerv(pname, memAddress(params)); + } + + /** + * Returns a pointer in the current GL context. + * + * @param pname the pointer to return. One of:
    {@link GL43#GL_DEBUG_CALLBACK_FUNCTION DEBUG_CALLBACK_FUNCTION}{@link GL43#GL_DEBUG_CALLBACK_USER_PARAM DEBUG_CALLBACK_USER_PARAM}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetPointer(@NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer params = stack.callocPointer(1); + nglGetPointerv(pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetString ] --- + + /** Unsafe version of: {@link #glGetString GetString} */ + public static native long nglGetString(int name); + + /** + * Return strings describing properties of the current GL context. + * + * @param name the property to query. One of:
    {@link #GL_RENDERER RENDERER}{@link #GL_VENDOR VENDOR}{@link #GL_EXTENSIONS EXTENSIONS}{@link #GL_VERSION VERSION}{@link GL20#GL_SHADING_LANGUAGE_VERSION SHADING_LANGUAGE_VERSION}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("GLubyte const *") + public static String glGetString(@NativeType("GLenum") int name) { + long __result = nglGetString(name); + return memUTF8Safe(__result); + } + + // --- [ glGetTexImage ] --- + + /** Unsafe version of: {@link #glGetTexImage GetTexImage} */ + public static native void nglGetTexImage(int tex, int level, int format, int type, long pixels); + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + nglGetTexImage(tex, level, format, type, memAddress(pixels)); + } + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") long pixels) { + nglGetTexImage(tex, level, format, type, pixels); + } + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + nglGetTexImage(tex, level, format, type, memAddress(pixels)); + } + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + nglGetTexImage(tex, level, format, type, memAddress(pixels)); + } + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + nglGetTexImage(tex, level, format, type, memAddress(pixels)); + } + + /** + * Obtains texture images. + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer pixels) { + nglGetTexImage(tex, level, format, type, memAddress(pixels)); + } + + // --- [ glGetTexLevelParameteriv ] --- + + /** Unsafe version of: {@link #glGetTexLevelParameteriv GetTexLevelParameteriv} */ + public static native void nglGetTexLevelParameteriv(int target, int level, int pname, long params); + + /** + * Places integer information about texture image parameter {@code pname} for level-of-detail {@code level} of the specified {@code target} into {@code params}. + * + * @param target the texture image target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link #GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}{@link #GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param level the level-of-detail number + * @param pname the parameter to query. One of:
    {@link #GL_TEXTURE_WIDTH TEXTURE_WIDTH}{@link #GL_TEXTURE_HEIGHT TEXTURE_HEIGHT}{@link GL12#GL_TEXTURE_DEPTH TEXTURE_DEPTH}{@link GL32#GL_TEXTURE_SAMPLES TEXTURE_SAMPLES}
    {@link GL32#GL_TEXTURE_FIXED_SAMPLE_LOCATIONS TEXTURE_FIXED_SAMPLE_LOCATIONS}{@link #GL_TEXTURE_INTERNAL_FORMAT TEXTURE_INTERNAL_FORMAT}{@link #GL_TEXTURE_RED_SIZE TEXTURE_RED_SIZE}{@link #GL_TEXTURE_GREEN_SIZE TEXTURE_GREEN_SIZE}
    {@link #GL_TEXTURE_BLUE_SIZE TEXTURE_BLUE_SIZE}{@link #GL_TEXTURE_ALPHA_SIZE TEXTURE_ALPHA_SIZE}{@link GL14#GL_TEXTURE_DEPTH_SIZE TEXTURE_DEPTH_SIZE}{@link GL30#GL_TEXTURE_STENCIL_SIZE TEXTURE_STENCIL_SIZE}
    {@link GL30#GL_TEXTURE_SHARED_SIZE TEXTURE_SHARED_SIZE}{@link GL30#GL_TEXTURE_ALPHA_TYPE TEXTURE_ALPHA_TYPE}{@link GL30#GL_TEXTURE_DEPTH_TYPE TEXTURE_DEPTH_TYPE}{@link GL13#GL_TEXTURE_COMPRESSED TEXTURE_COMPRESSED}
    {@link GL13#GL_TEXTURE_COMPRESSED_IMAGE_SIZE TEXTURE_COMPRESSED_IMAGE_SIZE}{@link GL31#GL_TEXTURE_BUFFER_DATA_STORE_BINDING TEXTURE_BUFFER_DATA_STORE_BINDING}{@link GL43#GL_TEXTURE_BUFFER_OFFSET TEXTURE_BUFFER_OFFSET}{@link GL43#GL_TEXTURE_BUFFER_SIZE TEXTURE_BUFFER_SIZE}
    + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexLevelParameteriv(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTexLevelParameteriv(target, level, pname, memAddress(params)); + } + + /** + * Places integer information about texture image parameter {@code pname} for level-of-detail {@code level} of the specified {@code target} into {@code params}. + * + * @param target the texture image target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link #GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}{@link #GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param level the level-of-detail number + * @param pname the parameter to query. One of:
    {@link #GL_TEXTURE_WIDTH TEXTURE_WIDTH}{@link #GL_TEXTURE_HEIGHT TEXTURE_HEIGHT}{@link GL12#GL_TEXTURE_DEPTH TEXTURE_DEPTH}{@link GL32#GL_TEXTURE_SAMPLES TEXTURE_SAMPLES}
    {@link GL32#GL_TEXTURE_FIXED_SAMPLE_LOCATIONS TEXTURE_FIXED_SAMPLE_LOCATIONS}{@link #GL_TEXTURE_INTERNAL_FORMAT TEXTURE_INTERNAL_FORMAT}{@link #GL_TEXTURE_RED_SIZE TEXTURE_RED_SIZE}{@link #GL_TEXTURE_GREEN_SIZE TEXTURE_GREEN_SIZE}
    {@link #GL_TEXTURE_BLUE_SIZE TEXTURE_BLUE_SIZE}{@link #GL_TEXTURE_ALPHA_SIZE TEXTURE_ALPHA_SIZE}{@link GL14#GL_TEXTURE_DEPTH_SIZE TEXTURE_DEPTH_SIZE}{@link GL30#GL_TEXTURE_STENCIL_SIZE TEXTURE_STENCIL_SIZE}
    {@link GL30#GL_TEXTURE_SHARED_SIZE TEXTURE_SHARED_SIZE}{@link GL30#GL_TEXTURE_ALPHA_TYPE TEXTURE_ALPHA_TYPE}{@link GL30#GL_TEXTURE_DEPTH_TYPE TEXTURE_DEPTH_TYPE}{@link GL13#GL_TEXTURE_COMPRESSED TEXTURE_COMPRESSED}
    {@link GL13#GL_TEXTURE_COMPRESSED_IMAGE_SIZE TEXTURE_COMPRESSED_IMAGE_SIZE}{@link GL31#GL_TEXTURE_BUFFER_DATA_STORE_BINDING TEXTURE_BUFFER_DATA_STORE_BINDING}{@link GL43#GL_TEXTURE_BUFFER_OFFSET TEXTURE_BUFFER_OFFSET}{@link GL43#GL_TEXTURE_BUFFER_SIZE TEXTURE_BUFFER_SIZE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTexLevelParameteri(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTexLevelParameteriv(target, level, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexLevelParameterfv ] --- + + /** Unsafe version of: {@link #glGetTexLevelParameterfv GetTexLevelParameterfv} */ + public static native void nglGetTexLevelParameterfv(int target, int level, int pname, long params); + + /** + * Float version of {@link #glGetTexLevelParameteriv GetTexLevelParameteriv}. + * + * @param target the texture image target + * @param level the level-of-detail number + * @param pname the parameter to query + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexLevelParameterfv(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTexLevelParameterfv(target, level, pname, memAddress(params)); + } + + /** + * Float version of {@link #glGetTexLevelParameteriv GetTexLevelParameteriv}. + * + * @param target the texture image target + * @param level the level-of-detail number + * @param pname the parameter to query + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetTexLevelParameterf(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetTexLevelParameterfv(target, level, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexParameteriv ] --- + + /** Unsafe version of: {@link #glGetTexParameteriv GetTexParameteriv} */ + public static native void nglGetTexParameteriv(int target, int pname, long params); + + /** + * Place integer information about texture parameter {@code pname} for the specified {@code target} into {@code params}. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param pname the parameter to query. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link #GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link #GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link #GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link #GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link #GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    {@link GL42#GL_IMAGE_FORMAT_COMPATIBILITY_TYPE IMAGE_FORMAT_COMPATIBILITY_TYPE}{@link GL42#GL_TEXTURE_IMMUTABLE_FORMAT TEXTURE_IMMUTABLE_FORMAT}{@link GL43#GL_TEXTURE_IMMUTABLE_LEVELS TEXTURE_IMMUTABLE_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LEVEL TEXTURE_VIEW_MIN_LEVEL}
    {@link GL43#GL_TEXTURE_VIEW_NUM_LEVELS TEXTURE_VIEW_NUM_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LAYER TEXTURE_VIEW_MIN_LAYER}{@link GL43#GL_TEXTURE_VIEW_NUM_LAYERS TEXTURE_VIEW_NUM_LAYERS}
    + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTexParameteriv(target, pname, memAddress(params)); + } + + /** + * Place integer information about texture parameter {@code pname} for the specified {@code target} into {@code params}. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param pname the parameter to query. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link #GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link #GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link #GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link #GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link #GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    {@link GL42#GL_IMAGE_FORMAT_COMPATIBILITY_TYPE IMAGE_FORMAT_COMPATIBILITY_TYPE}{@link GL42#GL_TEXTURE_IMMUTABLE_FORMAT TEXTURE_IMMUTABLE_FORMAT}{@link GL43#GL_TEXTURE_IMMUTABLE_LEVELS TEXTURE_IMMUTABLE_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LEVEL TEXTURE_VIEW_MIN_LEVEL}
    {@link GL43#GL_TEXTURE_VIEW_NUM_LEVELS TEXTURE_VIEW_NUM_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LAYER TEXTURE_VIEW_MIN_LAYER}{@link GL43#GL_TEXTURE_VIEW_NUM_LAYERS TEXTURE_VIEW_NUM_LAYERS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTexParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTexParameteriv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexParameterfv ] --- + + /** Unsafe version of: {@link #glGetTexParameterfv GetTexParameterfv} */ + public static native void nglGetTexParameterfv(int target, int pname, long params); + + /** + * Float version of {@link #glGetTexParameteriv GetTexParameteriv}. + * + * @param target the texture target + * @param pname the parameter to query + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTexParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTexParameterfv(target, pname, memAddress(params)); + } + + /** + * Float version of {@link #glGetTexParameteriv GetTexParameteriv}. + * + * @param target the texture target + * @param pname the parameter to query + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetTexParameterf(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetTexParameterfv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glHint ] --- + + /** + * Certain aspects of GL behavior, when there is room for variation, may be controlled with this function. The initial value for all hints is + * {@link #GL_DONT_CARE DONT_CARE}. + * + * @param target the behavior to control. One of:
    {@link #GL_LINE_SMOOTH_HINT LINE_SMOOTH_HINT}{@link #GL_POLYGON_SMOOTH_HINT POLYGON_SMOOTH_HINT}{@link GL13#GL_TEXTURE_COMPRESSION_HINT TEXTURE_COMPRESSION_HINT}
    {@link GL20#GL_FRAGMENT_SHADER_DERIVATIVE_HINT FRAGMENT_SHADER_DERIVATIVE_HINT}
    + * @param hint the behavior hint. One of:
    {@link #GL_FASTEST FASTEST}{@link #GL_NICEST NICEST}{@link #GL_DONT_CARE DONT_CARE}
    + * + * @see Reference Page + */ + public static native void glHint(@NativeType("GLenum") int target, @NativeType("GLenum") int hint); + + // --- [ glIsEnabled ] --- + + /** + * Determines if {@code cap} is currently enabled (as with {@link #glEnable Enable}) or disabled. + * + * @param cap the enable state to query + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsEnabled(@NativeType("GLenum") int cap); + + // --- [ glIsTexture ] --- + + /** + * Returns true if {@code texture} is the name of a texture object. + * + * @param texture the texture name to query + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsTexture(@NativeType("GLuint") int texture); + + // --- [ glLineWidth ] --- + + /** + * Sets the width of rasterized line segments. The default width is 1.0. + * + * @param width the line width + * + * @see Reference Page + */ + public static native void glLineWidth(@NativeType("GLfloat") float width); + + // --- [ glLogicOp ] --- + + /** + * Sets the logical framebuffer operation. + * + * @param op the operation to set. One of:
    {@link #GL_CLEAR CLEAR}{@link #GL_AND AND}{@link #GL_AND_REVERSE AND_REVERSE}{@link #GL_COPY COPY}{@link #GL_AND_INVERTED AND_INVERTED}{@link #GL_NOOP NOOP}{@link #GL_XOR XOR}{@link #GL_OR OR}{@link #GL_NOR NOR}{@link #GL_EQUIV EQUIV}{@link #GL_INVERT INVERT}{@link #GL_OR_REVERSE OR_REVERSE}{@link #GL_COPY_INVERTED COPY_INVERTED}
    {@link #GL_OR_INVERTED OR_INVERTED}{@link #GL_NAND NAND}{@link #GL_SET SET}
    + * + * @see Reference Page + */ + public static native void glLogicOp(@NativeType("GLenum") int op); + + // --- [ glPixelStorei ] --- + + /** + * Sets the integer value of a pixel store parameter. + * + * @param pname the pixel store parameter to set. One of:
    {@link #GL_UNPACK_SWAP_BYTES UNPACK_SWAP_BYTES}{@link #GL_UNPACK_LSB_FIRST UNPACK_LSB_FIRST}{@link #GL_UNPACK_ROW_LENGTH UNPACK_ROW_LENGTH}
    {@link #GL_UNPACK_SKIP_ROWS UNPACK_SKIP_ROWS}{@link #GL_UNPACK_SKIP_PIXELS UNPACK_SKIP_PIXELS}{@link #GL_UNPACK_ALIGNMENT UNPACK_ALIGNMENT}
    {@link GL12#GL_UNPACK_IMAGE_HEIGHT UNPACK_IMAGE_HEIGHT}{@link GL12#GL_UNPACK_SKIP_IMAGES UNPACK_SKIP_IMAGES}{@link GL42#GL_UNPACK_COMPRESSED_BLOCK_WIDTH UNPACK_COMPRESSED_BLOCK_WIDTH}
    {@link GL42#GL_UNPACK_COMPRESSED_BLOCK_HEIGHT UNPACK_COMPRESSED_BLOCK_HEIGHT}{@link GL42#GL_UNPACK_COMPRESSED_BLOCK_DEPTH UNPACK_COMPRESSED_BLOCK_DEPTH}{@link GL42#GL_UNPACK_COMPRESSED_BLOCK_SIZE UNPACK_COMPRESSED_BLOCK_SIZE}
    + * @param param the parameter value + * + * @see Reference Page + */ + public static native void glPixelStorei(@NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glPixelStoref ] --- + + /** + * Float version of {@link #glPixelStorei PixelStorei}. + * + * @param pname the pixel store parameter to set + * @param param the parameter value + * + * @see Reference Page + */ + public static native void glPixelStoref(@NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glPointSize ] --- + + /** + * Controls the rasterization of points if no vertex, tessellation control, tessellation evaluation, or geometry shader is active. The default point size is 1.0. + * + * @param size the request size of a point + * + * @see Reference Page + */ + public static native void glPointSize(@NativeType("GLfloat") float size); + + // --- [ glPolygonMode ] --- + + /** + * Controls the interpretation of polygons for rasterization. + * + *

    {@link #GL_FILL FILL} is the default mode of polygon rasterization. Note that these modes affect only the final rasterization of polygons: in particular, a + * polygon's vertices are lit, and the polygon is clipped and possibly culled before these modes are applied. Polygon antialiasing applies only to the + * {@link #GL_FILL FILL} state of PolygonMode. For {@link #GL_POINT POINT} or {@link #GL_LINE LINE}, point antialiasing or line segment antialiasing, respectively, apply.

    + * + * @param face the face for which to set the rasterizing method. One of:
    {@link #GL_FRONT FRONT}{@link #GL_BACK BACK}{@link #GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param mode the rasterization mode. One of:
    {@link #GL_POINT POINT}{@link #GL_LINE LINE}{@link #GL_FILL FILL}
    + * + * @see Reference Page + */ + public static native void glPolygonMode(@NativeType("GLenum") int face, @NativeType("GLenum") int mode); + + // --- [ glPolygonOffset ] --- + + /** + * The depth values of all fragments generated by the rasterization of a polygon may be offset by a single value that is computed for that polygon. This + * function determines that value. + * + *

    {@code factor} scales the maximum depth slope of the polygon, and {@code units} scales an implementation-dependent constant that relates to the usable + * resolution of the depth buffer. The resulting values are summed to produce the polygon offset value.

    + * + * @param factor the maximum depth slope factor + * @param units the constant scale + * + * @see Reference Page + */ + public static native void glPolygonOffset(@NativeType("GLfloat") float factor, @NativeType("GLfloat") float units); + + // --- [ glReadBuffer ] --- + + /** + * Defines the color buffer from which values are obtained. + * + *

    Acceptable values for {@code src} depend on whether the GL is using the default framebuffer (i.e., {@link GL30#GL_DRAW_FRAMEBUFFER_BINDING DRAW_FRAMEBUFFER_BINDING} is zero), or + * a framebuffer object (i.e., {@link GL30#GL_DRAW_FRAMEBUFFER_BINDING DRAW_FRAMEBUFFER_BINDING} is non-zero). In the initial state, the GL is bound to the default framebuffer.

    + * + * @param src the color buffer to read from. One of:
    {@link #GL_NONE NONE}{@link #GL_FRONT_LEFT FRONT_LEFT}{@link #GL_FRONT_RIGHT FRONT_RIGHT}{@link #GL_BACK_LEFT BACK_LEFT}{@link #GL_BACK_RIGHT BACK_RIGHT}{@link #GL_FRONT FRONT}{@link #GL_BACK BACK}{@link #GL_LEFT LEFT}
    {@link #GL_RIGHT RIGHT}{@link #GL_FRONT_AND_BACK FRONT_AND_BACK}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static native void glReadBuffer(@NativeType("GLenum") int src); + + // --- [ glReadPixels ] --- + + /** Unsafe version of: {@link #glReadPixels ReadPixels} */ + public static native void nglReadPixels(int x, int y, int width, int height, int format, int type, long pixels); + + /** + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GL30#GL_READ_FRAMEBUFFER_BINDING READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + nglReadPixels(x, y, width, height, format, type, memAddress(pixels)); + } + + /** + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GL30#GL_READ_FRAMEBUFFER_BINDING READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") long pixels) { + nglReadPixels(x, y, width, height, format, type, pixels); + } + + /** + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GL30#GL_READ_FRAMEBUFFER_BINDING READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + nglReadPixels(x, y, width, height, format, type, memAddress(pixels)); + } + + /** + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GL30#GL_READ_FRAMEBUFFER_BINDING READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + nglReadPixels(x, y, width, height, format, type, memAddress(pixels)); + } + + /** + * ReadPixels obtains values from the selected read buffer from each pixel with lower left hand corner at {@code (x + i, y + j)} for {@code 0 <= i < width} + * and {@code 0 <= j < height}; this pixel is said to be the ith pixel in the jth row. If any of these pixels lies outside of the + * window allocated to the current GL context, or outside of the image attached to the currently bound read framebuffer object, then the values obtained + * for those pixels are undefined. When {@link GL30#GL_READ_FRAMEBUFFER_BINDING READ_FRAMEBUFFER_BINDING} is zero, values are also undefined for individual pixels that are not owned by + * the current context. Otherwise, {@code ReadPixels} obtains values from the selected buffer, regardless of how those values were placed there. + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + nglReadPixels(x, y, width, height, format, type, memAddress(pixels)); + } + + // --- [ glScissor ] --- + + /** + * Defines the scissor rectangle for all viewports. The scissor test is enabled or disabled for all viewports using {@link #glEnable Enable} or {@link #glDisable Disable} + * with the symbolic constant {@link #GL_SCISSOR_TEST SCISSOR_TEST}. When disabled, it is as if the scissor test always passes. When enabled, if + * left ≤ xw < left + width and bottom ≤ yw < bottom + height for the scissor rectangle, then the scissor + * test passes. Otherwise, the test fails and the fragment is discarded. + * + * @param x the left scissor rectangle coordinate + * @param y the bottom scissor rectangle coordinate + * @param width the scissor rectangle width + * @param height the scissor rectangle height + * + * @see Reference Page + */ + public static native void glScissor(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glStencilFunc ] --- + + /** + * Controls the stencil test. + * + *

    {@code ref} is an integer reference value that is used in the unsigned stencil comparison. Stencil comparison operations and queries of {@code ref} + * clamp its value to the range [0, 2s – 1], where s is the number of bits in the stencil buffer attached to the draw framebuffer. The s + * least significant bits of {@code mask} are bitwise ANDed with both the reference and the stored stencil value, and the resulting masked values are those that + * participate in the comparison controlled by {@code func}.

    + * + * @param func the stencil comparison function. One of:
    {@link #GL_NEVER NEVER}{@link #GL_ALWAYS ALWAYS}{@link #GL_LESS LESS}{@link #GL_LEQUAL LEQUAL}{@link #GL_EQUAL EQUAL}{@link #GL_GEQUAL GEQUAL}{@link #GL_GREATER GREATER}{@link #GL_NOTEQUAL NOTEQUAL}
    + * @param ref the reference value + * @param mask the stencil comparison mask + * + * @see Reference Page + */ + public static native void glStencilFunc(@NativeType("GLenum") int func, @NativeType("GLint") int ref, @NativeType("GLuint") int mask); + + // --- [ glStencilMask ] --- + + /** + * Masks the writing of particular bits into the stencil plans. + * + *

    The least significant s bits of {@code mask}, where s is the number of bits in the stencil buffer, specify an integer mask. Where a 1 appears in this + * mask, the corresponding bit in the stencil buffer is written; where a 0 appears, the bit is not written.

    + * + * @param mask the stencil mask + * + * @see Reference Page + */ + public static native void glStencilMask(@NativeType("GLuint") int mask); + + // --- [ glStencilOp ] --- + + /** + * Indicates what happens to the stored stencil value if this or certain subsequent tests fail or pass. + * + *

    The supported actions are {@link #GL_KEEP KEEP}, {@link #GL_ZERO ZERO}, {@link #GL_REPLACE REPLACE}, {@link #GL_INCR INCR}, {@link #GL_DECR DECR}, {@link #GL_INVERT INVERT}, + * {@link GL14#GL_INCR_WRAP INCR_WRAP} and {@link GL14#GL_DECR_WRAP DECR_WRAP}. These correspond to keeping the current value, setting to zero, replacing with the reference value, + * incrementing with saturation, decrementing with saturation, bitwise inverting it, incrementing without saturation, and decrementing without saturation.

    + * + *

    For purposes of increment and decrement, the stencil bits are considered as an unsigned integer. Incrementing or decrementing with saturation clamps + * the stencil value at 0 and the maximum representable value. Incrementing or decrementing without saturation will wrap such that incrementing the maximum + * representable value results in 0, and decrementing 0 results in the maximum representable value.

    + * + * @param sfail the action to take if the stencil test fails + * @param dpfail the action to take if the depth buffer test fails + * @param dppass the action to take if the depth buffer test passes + * + * @see Reference Page + */ + public static native void glStencilOp(@NativeType("GLenum") int sfail, @NativeType("GLenum") int dpfail, @NativeType("GLenum") int dppass); + + // --- [ glTexImage1D ] --- + + /** Unsafe version of: {@link #glTexImage1D TexImage1D} */ + public static native void nglTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, long pixels); + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + nglTexImage1D(target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTexImage1D(target, level, internalformat, width, border, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + nglTexImage1D(target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + nglTexImage1D(target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + nglTexImage1D(target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + /** + * One-dimensional version of {@link #glTexImage2D TexImage2D}}. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format + * @param width the texture width + * @param border the texture border width + * @param format the texel data format + * @param type the texel data type + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + nglTexImage1D(target, level, internalformat, width, border, format, type, memAddressSafe(pixels)); + } + + // --- [ glTexImage2D ] --- + + /** Unsafe version of: {@link #glTexImage2D TexImage2D} */ + public static native void nglTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels); + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link #GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link #GL_RED RED}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link #GL_R3_G3_B2 R3_G3_B2}{@link #GL_RGB4 RGB4}{@link #GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link #GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link #GL_RGB10 RGB10}{@link #GL_RGB12 RGB12}{@link #GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link #GL_RGBA2 RGBA2}{@link #GL_RGBA4 RGBA4}{@link #GL_RGB5_A1 RGB5_A1}{@link #GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link #GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link #GL_RGBA12 RGBA12}{@link #GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + nglTexImage2D(target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link #GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link #GL_RED RED}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link #GL_R3_G3_B2 R3_G3_B2}{@link #GL_RGB4 RGB4}{@link #GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link #GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link #GL_RGB10 RGB10}{@link #GL_RGB12 RGB12}{@link #GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link #GL_RGBA2 RGBA2}{@link #GL_RGBA4 RGBA4}{@link #GL_RGB5_A1 RGB5_A1}{@link #GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link #GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link #GL_RGBA12 RGBA12}{@link #GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + } + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link #GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link #GL_RED RED}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link #GL_R3_G3_B2 R3_G3_B2}{@link #GL_RGB4 RGB4}{@link #GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link #GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link #GL_RGB10 RGB10}{@link #GL_RGB12 RGB12}{@link #GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link #GL_RGBA2 RGBA2}{@link #GL_RGBA4 RGBA4}{@link #GL_RGB5_A1 RGB5_A1}{@link #GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link #GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link #GL_RGBA12 RGBA12}{@link #GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + nglTexImage2D(target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link #GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link #GL_RED RED}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link #GL_R3_G3_B2 R3_G3_B2}{@link #GL_RGB4 RGB4}{@link #GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link #GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link #GL_RGB10 RGB10}{@link #GL_RGB12 RGB12}{@link #GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link #GL_RGBA2 RGBA2}{@link #GL_RGBA4 RGBA4}{@link #GL_RGB5_A1 RGB5_A1}{@link #GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link #GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link #GL_RGBA12 RGBA12}{@link #GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + nglTexImage2D(target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link #GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link #GL_RED RED}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link #GL_R3_G3_B2 R3_G3_B2}{@link #GL_RGB4 RGB4}{@link #GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link #GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link #GL_RGB10 RGB10}{@link #GL_RGB12 RGB12}{@link #GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link #GL_RGBA2 RGBA2}{@link #GL_RGBA4 RGBA4}{@link #GL_RGB5_A1 RGB5_A1}{@link #GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link #GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link #GL_RGBA12 RGBA12}{@link #GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + nglTexImage2D(target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + /** + * Specifies a two-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link #GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link #GL_RED RED}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link #GL_R3_G3_B2 R3_G3_B2}{@link #GL_RGB4 RGB4}{@link #GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link #GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link #GL_RGB10 RGB10}{@link #GL_RGB12 RGB12}{@link #GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link #GL_RGBA2 RGBA2}{@link #GL_RGBA4 RGBA4}{@link #GL_RGB5_A1 RGB5_A1}{@link #GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link #GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link #GL_RGBA12 RGBA12}{@link #GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * @param format the texel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + nglTexImage2D(target, level, internalformat, width, height, border, format, type, memAddressSafe(pixels)); + } + + // --- [ glCopyTexImage1D ] --- + + /** + * Defines a one-dimensional texel array in exactly the manner of {@link #glTexImage1D TexImage1D}, except that the image data are taken from the framebuffer rather + * than from client memory. For the purposes of decoding the texture image, {@code CopyTexImage1D} is equivalent to calling {@link #glCopyTexImage2D CopyTexImage2D} + * with corresponding arguments and height of 1, except that the height of the image is always 1, regardless of the value of border. level, internalformat, + * and border are specified using the same values, with the same meanings, as the corresponding arguments of {@link #glTexImage1D TexImage1D}. The constraints on + * width and border are exactly those of the corresponding arguments of {@link #glTexImage1D TexImage1D}. + * + * @param target the texture target. Must be:
    {@link #GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail number + * @param internalFormat the texture internal format. See {@link #glTexImage2D TexImage2D} for a list of supported formats. + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture width + * @param border the texture border width + * + * @see Reference Page + */ + public static native void glCopyTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalFormat, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLint") int border); + + // --- [ glCopyTexImage2D ] --- + + /** + * Defines a two-dimensional texel array in exactly the manner of {@link #glTexImage2D TexImage2D}, except that the image data are taken from the framebuffer rather + * than from client memory. + * + *

    {@code x}, {@code y}, {@code width}, and {@code height} correspond precisely to the corresponding arguments to {@link #glReadPixels ReadPixels}; they specify the + * image's width and height, and the lower left (x, y) coordinates of the framebuffer region to be copied.

    + * + *

    The image is taken from the framebuffer exactly as if these arguments were passed to {@link GL11#glCopyPixels CopyPixels} with argument type set to {@link #GL_COLOR COLOR}, + * {@link #GL_DEPTH DEPTH}, or {@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}, depending on {@code internalformat}. RGBA data is taken from the current color buffer, while depth + * component and stencil index data are taken from the depth and stencil buffers, respectively.

    + * + *

    Subsequent processing is identical to that described for {@link #glTexImage2D TexImage2D}, beginning with clamping of the R, G, B, A, or depth values, and masking + * of the stencil index values from the resulting pixel groups. Parameters {@code level}, {@code internalformat}, and {@code border} are specified using + * the same values, with the same meanings, as the corresponding arguments of {@link #glTexImage2D TexImage2D}.

    + * + *

    The constraints on width, height, and border are exactly those for the corresponding arguments of {@link #glTexImage2D TexImage2D}.

    + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param internalFormat the texture internal format. See {@link #glTexImage2D TexImage2D} for a list of supported formats. + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture width + * @param height the texture height + * @param border the texture border width + * + * @see Reference Page + */ + public static native void glCopyTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalFormat, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border); + + // --- [ glCopyTexSubImage1D ] --- + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the {@code internalformat}, {@code width} or {@code border} + * parameters of the specified texel array, nor is any change made to texel values outside the specified subregion. See {@link #glCopyTexImage1D CopyTexImage1D} for more + * details. + * + * @param target the texture target. Must be:
    {@link #GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail number + * @param xoffset the left texel coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * + * @see Reference Page + */ + public static native void glCopyTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width); + + // --- [ glCopyTexSubImage2D ] --- + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the {@code internalformat}, {@code width}, {@code height}, + * or {@code border} parameters of the specified texel array, nor is any change made to texel values outside the specified subregion. See + * {@link #glCopyTexImage2D CopyTexImage2D} for more details. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number + * @param xoffset the left texel coordinate of the texture subregion to update + * @param yoffset the lower texel coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * @param height the texture subregion height + * + * @see Reference Page + */ + public static native void glCopyTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glTexParameteri ] --- + + /** + * Sets the integer value of a texture parameter, which controls how the texel array is treated when specified or changed, and when applied to a fragment. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_1D TEXTURE_1D}{@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param pname the parameter to set. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link #GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link #GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link #GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link #GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link #GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    + * @param param the parameter value + * + * @see Reference Page + */ + public static native void glTexParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glTexParameteriv ] --- + + /** Unsafe version of: {@link #glTexParameteriv TexParameteriv} */ + public static native void nglTexParameteriv(int target, int pname, long params); + + /** + * Pointer version of {@link #glTexParameteri TexParameteri}. + * + * @param target the texture target + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glTexParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglTexParameteriv(target, pname, memAddress(params)); + } + + // --- [ glTexParameterf ] --- + + /** + * Float version of {@link #glTexParameteri TexParameteri}. + * + * @param target the texture target + * @param pname the parameter to set + * @param param the parameter value + * + * @see Reference Page + */ + public static native void glTexParameterf(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glTexParameterfv ] --- + + /** Unsafe version of: {@link #glTexParameterfv TexParameterfv} */ + public static native void nglTexParameterfv(int target, int pname, long params); + + /** + * Pointer version of {@link #glTexParameterf TexParameterf}. + * + * @param target the texture target + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glTexParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglTexParameterfv(target, pname, memAddress(params)); + } + + // --- [ glTexSubImage1D ] --- + + /** Unsafe version of: {@link #glTexSubImage1D TexSubImage1D} */ + public static native void nglTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, long pixels); + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link #GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglTexSubImage1D(target, level, xoffset, width, format, type, memAddress(pixels)); + } + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link #GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTexSubImage1D(target, level, xoffset, width, format, type, pixels); + } + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link #GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglTexSubImage1D(target, level, xoffset, width, format, type, memAddress(pixels)); + } + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link #GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglTexSubImage1D(target, level, xoffset, width, format, type, memAddress(pixels)); + } + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link #GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglTexSubImage1D(target, level, xoffset, width, format, type, memAddress(pixels)); + } + + /** + * One-dimensional version of {@link #glTexSubImage2D TexSubImage2D}. + * + * @param target the texture target. Must be:
    {@link #GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglTexSubImage1D(target, level, xoffset, width, format, type, memAddress(pixels)); + } + + // --- [ glTexSubImage2D ] --- + + /** Unsafe version of: {@link #glTexSubImage2D TexSubImage2D} */ + public static native void nglTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels); + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + /** + * Respecifies a rectangular subregion of an existing texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link #GL_RED RED}{@link #GL_GREEN GREEN}{@link #GL_BLUE BLUE}{@link #GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link #GL_RGB RGB}{@link #GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link #GL_STENCIL_INDEX STENCIL_INDEX}{@link #GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link #GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link #GL_BYTE BYTE}{@link #GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link #GL_SHORT SHORT}
    {@link #GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link #GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + // --- [ glViewport ] --- + + /** + * Specifies the viewport transformation parameters for all viewports. + * + *

    The location of the viewport's bottom-left corner, given by {@code (x, y)}, are clamped to be within the implementation-dependent viewport bounds range. + * The viewport bounds range {@code [min, max]} tuple may be determined by calling {@link #glGetFloatv GetFloatv} with the symbolic + * constant {@link GL41#GL_VIEWPORT_BOUNDS_RANGE VIEWPORT_BOUNDS_RANGE}. Viewport width and height are clamped to implementation-dependent maximums when specified. The maximum + * width and height may be found by calling {@link #glGetFloatv GetFloatv} with the symbolic constant {@link #GL_MAX_VIEWPORT_DIMS MAX_VIEWPORT_DIMS}. The + * maximum viewport dimensions must be greater than or equal to the larger of the visible dimensions of the display being rendered to (if a display + * exists), and the largest renderbuffer image which can be successfully created and attached to a framebuffer object.

    + * + *

    In the initial state, {@code w} and {@code h} for each viewport are set to the width and height, respectively, of the window into which the GL is to do + * its rendering. If the default framebuffer is bound but no default framebuffer is associated with the GL context, then {@code w} and {@code h} are + * initially set to zero.

    + * + * @param x the left viewport coordinate + * @param y the bottom viewport coordinate + * @param w the viewport width + * @param h the viewport height + * + * @see Reference Page + */ + public static native void glViewport(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int w, @NativeType("GLsizei") int h); + + /** + * Array version of: {@link #glGenTextures GenTextures} + * + * @see Reference Page + */ + public static void glGenTextures(@NativeType("GLuint *") int[] textures) { + long __functionAddress = GL.getICD().glGenTextures; + if (CHECKS) { + check(__functionAddress); + } + callPV(textures.length, textures, __functionAddress); + } + + /** + * Array version of: {@link #glDeleteTextures DeleteTextures} + * + * @see Reference Page + */ + public static void glDeleteTextures(@NativeType("GLuint const *") int[] textures) { + long __functionAddress = GL.getICD().glDeleteTextures; + if (CHECKS) { + check(__functionAddress); + } + callPV(textures.length, textures, __functionAddress); + } + + /** + * Array version of: {@link #glGetFloatv GetFloatv} + * + * @see Reference Page + */ + public static void glGetFloatv(@NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetFloatv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetIntegerv GetIntegerv} + * + * @see Reference Page + */ + public static void glGetIntegerv(@NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetIntegerv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetDoublev GetDoublev} + * + * @see Reference Page + */ + public static void glGetDoublev(@NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetDoublev; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexImage GetTexImage} + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + long __functionAddress = GL.getICD().glGetTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexImage GetTexImage} + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + long __functionAddress = GL.getICD().glGetTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexImage GetTexImage} + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + long __functionAddress = GL.getICD().glGetTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexImage GetTexImage} + * + * @see Reference Page + */ + public static void glGetTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] pixels) { + long __functionAddress = GL.getICD().glGetTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexLevelParameteriv GetTexLevelParameteriv} + * + * @see Reference Page + */ + public static void glGetTexLevelParameteriv(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetTexLevelParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, level, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexLevelParameterfv GetTexLevelParameterfv} + * + * @see Reference Page + */ + public static void glGetTexLevelParameterfv(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetTexLevelParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, level, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexParameteriv GetTexParameteriv} + * + * @see Reference Page + */ + public static void glGetTexParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetTexParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexParameterfv GetTexParameterfv} + * + * @see Reference Page + */ + public static void glGetTexParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetTexParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glReadPixels ReadPixels} + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + long __functionAddress = GL.getICD().glReadPixels; + if (CHECKS) { + check(__functionAddress); + } + callPV(x, y, width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glReadPixels ReadPixels} + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + long __functionAddress = GL.getICD().glReadPixels; + if (CHECKS) { + check(__functionAddress); + } + callPV(x, y, width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glReadPixels ReadPixels} + * + * @see Reference Page + */ + public static void glReadPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + long __functionAddress = GL.getICD().glReadPixels; + if (CHECKS) { + check(__functionAddress); + } + callPV(x, y, width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage1D TexImage1D} + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTexImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage1D TexImage1D} + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTexImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage1D TexImage1D} + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTexImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage1D TexImage1D} + * + * @see Reference Page + */ + public static void glTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTexImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage2D TexImage2D} + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTexImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage2D TexImage2D} + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTexImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage2D TexImage2D} + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTexImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage2D TexImage2D} + * + * @see Reference Page + */ + public static void glTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTexImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, height, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexParameteriv TexParameteriv} + * + * @see Reference Page + */ + public static void glTexParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glTexParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTexParameterfv TexParameterfv} + * + * @see Reference Page + */ + public static void glTexParameterfv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glTexParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage1D TexSubImage1D} + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage1D TexSubImage1D} + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage1D TexSubImage1D} + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage1D TexSubImage1D} + * + * @see Reference Page + */ + public static void glTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage2D TexSubImage2D} + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage2D TexSubImage2D} + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage2D TexSubImage2D} + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage2D TexSubImage2D} + * + * @see Reference Page + */ + public static void glTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL12.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL12.java new file mode 100644 index 000000000..88c3063d8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL12.java @@ -0,0 +1,734 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 1.2. Includes the deprecated symbols of the Compatibility Profile. + * + *

    Extensions promoted to core in this release:

    + * + * + * + *

    Extensions part of the imaging subset:

    + * + * + */ +public class GL12 extends GL11 { + + static { GL.initialize(); } + + /** Aliases for smooth points and lines. */ + public static final int + GL_ALIASED_POINT_SIZE_RANGE = 0x846D, + GL_ALIASED_LINE_WIDTH_RANGE = 0x846E, + GL_SMOOTH_POINT_SIZE_RANGE = 0xB12, + GL_SMOOTH_POINT_SIZE_GRANULARITY = 0xB13, + GL_SMOOTH_LINE_WIDTH_RANGE = 0xB22, + GL_SMOOTH_LINE_WIDTH_GRANULARITY = 0xB23; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_TEXTURE_BINDING_3D = 0x806A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev, and by the {@code pname} parameter of PixelStore. */ + public static final int + GL_PACK_SKIP_IMAGES = 0x806B, + GL_PACK_IMAGE_HEIGHT = 0x806C, + GL_UNPACK_SKIP_IMAGES = 0x806D, + GL_UNPACK_IMAGE_HEIGHT = 0x806E; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of TexImage3D, GetTexImage, GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv, and + * GetTexParameterfv. + */ + public static final int GL_TEXTURE_3D = 0x806F; + + /** Accepted by the {@code target} parameter of TexImage3D, GetTexLevelParameteriv, and GetTexLevelParameterfv. */ + public static final int GL_PROXY_TEXTURE_3D = 0x8070; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameteriv and GetTexLevelParameterfv. */ + public static final int GL_TEXTURE_DEPTH = 0x8071; + + /** Accepted by the {@code pname} parameter of TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv. */ + public static final int GL_TEXTURE_WRAP_R = 0x8072; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_3D_TEXTURE_SIZE = 0x8073; + + /** Accepted by the {@code format} parameter of DrawPixels, GetTexImage, ReadPixels, TexImage1D, and TexImage2D. */ + public static final int + GL_BGR = 0x80E0, + GL_BGRA = 0x80E1; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, SeparableFilter2D, + * SeparableFilter3D, GetSeparableFilter, ColorTable, GetColorTable, TexImage4D, and TexSubImage4D. + */ + public static final int + GL_UNSIGNED_BYTE_3_3_2 = 0x8032, + GL_UNSIGNED_BYTE_2_3_3_REV = 0x8362, + GL_UNSIGNED_SHORT_5_6_5 = 0x8363, + GL_UNSIGNED_SHORT_5_6_5_REV = 0x8364, + GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033, + GL_UNSIGNED_SHORT_4_4_4_4_REV = 0x8365, + GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034, + GL_UNSIGNED_SHORT_1_5_5_5_REV = 0x8366, + GL_UNSIGNED_INT_8_8_8_8 = 0x8035, + GL_UNSIGNED_INT_8_8_8_8_REV = 0x8367, + GL_UNSIGNED_INT_10_10_10_2 = 0x8036, + GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_RESCALE_NORMAL = 0x803A; + + /** Accepted by the {@code pname} parameter of LightModel*, and also by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_LIGHT_MODEL_COLOR_CONTROL = 0x81F8; + + /** Accepted by the {@code param} parameter of LightModel* when {@code pname} is LIGHT_MODEL_COLOR_CONTROL. */ + public static final int + GL_SINGLE_COLOR = 0x81F9, + GL_SEPARATE_SPECULAR_COLOR = 0x81FA; + + /** + * Accepted by the {@code param} parameter of TexParameteri and TexParameterf, and by the {@code params} parameter of TexParameteriv and TexParameterfv, + * when their {@code pname} parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R. + */ + public static final int GL_CLAMP_TO_EDGE = 0x812F; + + /** Accepted by the {@code pname} parameter of TexParameteri, TexParameterf, TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv. */ + public static final int + GL_TEXTURE_MIN_LOD = 0x813A, + GL_TEXTURE_MAX_LOD = 0x813B, + GL_TEXTURE_BASE_LEVEL = 0x813C, + GL_TEXTURE_MAX_LEVEL = 0x813D; + + /** Recommended maximum amounts of vertex and index data. */ + public static final int + GL_MAX_ELEMENTS_VERTICES = 0x80E8, + GL_MAX_ELEMENTS_INDICES = 0x80E9; + + protected GL12() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexImage3D ] --- + + /** Unsafe version of: {@link #glTexImage3D TexImage3D} */ + public static void nglTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, long pixels) { + GL12C.nglTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12C#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + GL12C.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12C#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL12C.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12C#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + GL12C.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12C#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + GL12C.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12C#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + GL12C.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12C#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + GL12C.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + // --- [ glTexSubImage3D ] --- + + /** Unsafe version of: {@link #glTexSubImage3D TexSubImage3D} */ + public static void nglTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels) { + GL12C.nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + GL12C.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL12C.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + GL12C.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + GL12C.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + GL12C.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12C#GL_BGR BGR}
    {@link GL12C#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12C#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12C#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12C#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12C#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12C#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12C#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12C#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12C#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12C#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12C#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + GL12C.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + // --- [ glCopyTexSubImage3D ] --- + + /** + * Respecifies a rectangular subregion of a slice of an existing 3D texel array. No change is made to the {@code internalformat}, {@code width}, + * {@code height}, or {@code border} parameters of the specified texel array, nor is any change made to texel values outside the specified subregion. See + * {@link GL11C#glCopyTexImage2D CopyTexImage2D} for more details. + * + * @param target the texture target. One of:
    {@link GL12C#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param xoffset the x coordinate of the texture subregion to update + * @param yoffset the y coordinate of the texture subregion to update + * @param zoffset the z coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * @param height the texture subregion height + * + * @see Reference Page + */ + public static void glCopyTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL12C.glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); + } + + // --- [ glDrawRangeElements ] --- + + /** + * Unsafe version of: {@link #glDrawRangeElements DrawRangeElements} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawRangeElements(int mode, int start, int end, int count, int type, long indices) { + GL12C.nglDrawRangeElements(mode, start, end, count, type, indices); + } + + /** + * A restricted form of {@link GL11C#glDrawElements DrawElements}. mode, start, end, and count match the corresponding arguments to glDrawElements, with the additional + * constraint that all values in the arrays count must lie between start and end, inclusive. + * + *

    Implementations denote recommended maximum amounts of vertex and index data, which may be queried by calling glGet with argument + * {@link GL12C#GL_MAX_ELEMENTS_VERTICES MAX_ELEMENTS_VERTICES} and {@link GL12C#GL_MAX_ELEMENTS_INDICES MAX_ELEMENTS_INDICES}. If end - start + 1 is greater than the value of GL_MAX_ELEMENTS_VERTICES, or if + * count is greater than the value of GL_MAX_ELEMENTS_INDICES, then the call may operate at reduced performance. There is no requirement that all vertices + * in the range start end be referenced. However, the implementation may partially process unused vertices, reducing performance from what could be + * achieved with an optimal index set.

    + * + *

    When glDrawRangeElements is called, it uses count sequential elements from an enabled array, starting at start to construct a sequence of geometric + * primitives. mode specifies what kind of primitives are constructed, and how the array elements construct these primitives. If more than one array is + * enabled, each is used.

    + * + *

    Vertex attributes that are modified by glDrawRangeElements have an unspecified value after glDrawRangeElements returns. Attributes that aren't modified + * maintain their previous values.

    + * + *
    Errors
    + * + *

    It is an error for indices to lie outside the range start end, but implementations may not check for this situation. Such indices cause + * implementation-dependent behavior.

    + * + *
      + *
    • GL_INVALID_ENUM is generated if mode is not an accepted value.
    • + *
    • GL_INVALID_VALUE is generated if count is negative.
    • + *
    • GL_INVALID_VALUE is generated if end < start.
    • + *
    • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the + * currently installed program object.
    • + *
    • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or the element array and the buffer object's data + * store is currently mapped.
    • + *
    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glDrawRangeElements(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices) { + GL12C.glDrawRangeElements(mode, start, end, count, type, indices); + } + + /** + * A restricted form of {@link GL11C#glDrawElements DrawElements}. mode, start, end, and count match the corresponding arguments to glDrawElements, with the additional + * constraint that all values in the arrays count must lie between start and end, inclusive. + * + *

    Implementations denote recommended maximum amounts of vertex and index data, which may be queried by calling glGet with argument + * {@link GL12C#GL_MAX_ELEMENTS_VERTICES MAX_ELEMENTS_VERTICES} and {@link GL12C#GL_MAX_ELEMENTS_INDICES MAX_ELEMENTS_INDICES}. If end - start + 1 is greater than the value of GL_MAX_ELEMENTS_VERTICES, or if + * count is greater than the value of GL_MAX_ELEMENTS_INDICES, then the call may operate at reduced performance. There is no requirement that all vertices + * in the range start end be referenced. However, the implementation may partially process unused vertices, reducing performance from what could be + * achieved with an optimal index set.

    + * + *

    When glDrawRangeElements is called, it uses count sequential elements from an enabled array, starting at start to construct a sequence of geometric + * primitives. mode specifies what kind of primitives are constructed, and how the array elements construct these primitives. If more than one array is + * enabled, each is used.

    + * + *

    Vertex attributes that are modified by glDrawRangeElements have an unspecified value after glDrawRangeElements returns. Attributes that aren't modified + * maintain their previous values.

    + * + *
    Errors
    + * + *

    It is an error for indices to lie outside the range start end, but implementations may not check for this situation. Such indices cause + * implementation-dependent behavior.

    + * + *
      + *
    • GL_INVALID_ENUM is generated if mode is not an accepted value.
    • + *
    • GL_INVALID_VALUE is generated if count is negative.
    • + *
    • GL_INVALID_VALUE is generated if end < start.
    • + *
    • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the + * currently installed program object.
    • + *
    • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or the element array and the buffer object's data + * store is currently mapped.
    • + *
    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glDrawRangeElements(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices) { + GL12C.glDrawRangeElements(mode, start, end, type, indices); + } + + /** + * A restricted form of {@link GL11C#glDrawElements DrawElements}. mode, start, end, and count match the corresponding arguments to glDrawElements, with the additional + * constraint that all values in the arrays count must lie between start and end, inclusive. + * + *

    Implementations denote recommended maximum amounts of vertex and index data, which may be queried by calling glGet with argument + * {@link GL12C#GL_MAX_ELEMENTS_VERTICES MAX_ELEMENTS_VERTICES} and {@link GL12C#GL_MAX_ELEMENTS_INDICES MAX_ELEMENTS_INDICES}. If end - start + 1 is greater than the value of GL_MAX_ELEMENTS_VERTICES, or if + * count is greater than the value of GL_MAX_ELEMENTS_INDICES, then the call may operate at reduced performance. There is no requirement that all vertices + * in the range start end be referenced. However, the implementation may partially process unused vertices, reducing performance from what could be + * achieved with an optimal index set.

    + * + *

    When glDrawRangeElements is called, it uses count sequential elements from an enabled array, starting at start to construct a sequence of geometric + * primitives. mode specifies what kind of primitives are constructed, and how the array elements construct these primitives. If more than one array is + * enabled, each is used.

    + * + *

    Vertex attributes that are modified by glDrawRangeElements have an unspecified value after glDrawRangeElements returns. Attributes that aren't modified + * maintain their previous values.

    + * + *
    Errors
    + * + *

    It is an error for indices to lie outside the range start end, but implementations may not check for this situation. Such indices cause + * implementation-dependent behavior.

    + * + *
      + *
    • GL_INVALID_ENUM is generated if mode is not an accepted value.
    • + *
    • GL_INVALID_VALUE is generated if count is negative.
    • + *
    • GL_INVALID_VALUE is generated if end < start.
    • + *
    • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the + * currently installed program object.
    • + *
    • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or the element array and the buffer object's data + * store is currently mapped.
    • + *
    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glDrawRangeElements(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") ByteBuffer indices) { + GL12C.glDrawRangeElements(mode, start, end, indices); + } + + /** + * A restricted form of {@link GL11C#glDrawElements DrawElements}. mode, start, end, and count match the corresponding arguments to glDrawElements, with the additional + * constraint that all values in the arrays count must lie between start and end, inclusive. + * + *

    Implementations denote recommended maximum amounts of vertex and index data, which may be queried by calling glGet with argument + * {@link GL12C#GL_MAX_ELEMENTS_VERTICES MAX_ELEMENTS_VERTICES} and {@link GL12C#GL_MAX_ELEMENTS_INDICES MAX_ELEMENTS_INDICES}. If end - start + 1 is greater than the value of GL_MAX_ELEMENTS_VERTICES, or if + * count is greater than the value of GL_MAX_ELEMENTS_INDICES, then the call may operate at reduced performance. There is no requirement that all vertices + * in the range start end be referenced. However, the implementation may partially process unused vertices, reducing performance from what could be + * achieved with an optimal index set.

    + * + *

    When glDrawRangeElements is called, it uses count sequential elements from an enabled array, starting at start to construct a sequence of geometric + * primitives. mode specifies what kind of primitives are constructed, and how the array elements construct these primitives. If more than one array is + * enabled, each is used.

    + * + *

    Vertex attributes that are modified by glDrawRangeElements have an unspecified value after glDrawRangeElements returns. Attributes that aren't modified + * maintain their previous values.

    + * + *
    Errors
    + * + *

    It is an error for indices to lie outside the range start end, but implementations may not check for this situation. Such indices cause + * implementation-dependent behavior.

    + * + *
      + *
    • GL_INVALID_ENUM is generated if mode is not an accepted value.
    • + *
    • GL_INVALID_VALUE is generated if count is negative.
    • + *
    • GL_INVALID_VALUE is generated if end < start.
    • + *
    • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the + * currently installed program object.
    • + *
    • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or the element array and the buffer object's data + * store is currently mapped.
    • + *
    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glDrawRangeElements(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") ShortBuffer indices) { + GL12C.glDrawRangeElements(mode, start, end, indices); + } + + /** + * A restricted form of {@link GL11C#glDrawElements DrawElements}. mode, start, end, and count match the corresponding arguments to glDrawElements, with the additional + * constraint that all values in the arrays count must lie between start and end, inclusive. + * + *

    Implementations denote recommended maximum amounts of vertex and index data, which may be queried by calling glGet with argument + * {@link GL12C#GL_MAX_ELEMENTS_VERTICES MAX_ELEMENTS_VERTICES} and {@link GL12C#GL_MAX_ELEMENTS_INDICES MAX_ELEMENTS_INDICES}. If end - start + 1 is greater than the value of GL_MAX_ELEMENTS_VERTICES, or if + * count is greater than the value of GL_MAX_ELEMENTS_INDICES, then the call may operate at reduced performance. There is no requirement that all vertices + * in the range start end be referenced. However, the implementation may partially process unused vertices, reducing performance from what could be + * achieved with an optimal index set.

    + * + *

    When glDrawRangeElements is called, it uses count sequential elements from an enabled array, starting at start to construct a sequence of geometric + * primitives. mode specifies what kind of primitives are constructed, and how the array elements construct these primitives. If more than one array is + * enabled, each is used.

    + * + *

    Vertex attributes that are modified by glDrawRangeElements have an unspecified value after glDrawRangeElements returns. Attributes that aren't modified + * maintain their previous values.

    + * + *
    Errors
    + * + *

    It is an error for indices to lie outside the range start end, but implementations may not check for this situation. Such indices cause + * implementation-dependent behavior.

    + * + *
      + *
    • GL_INVALID_ENUM is generated if mode is not an accepted value.
    • + *
    • GL_INVALID_VALUE is generated if count is negative.
    • + *
    • GL_INVALID_VALUE is generated if end < start.
    • + *
    • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the + * currently installed program object.
    • + *
    • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or the element array and the buffer object's data + * store is currently mapped.
    • + *
    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glDrawRangeElements(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") IntBuffer indices) { + GL12C.glDrawRangeElements(mode, start, end, indices); + } + + /** + * Array version of: {@link #glTexImage3D TexImage3D} + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + GL12C.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexImage3D TexImage3D} + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + GL12C.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexImage3D TexImage3D} + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + GL12C.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexImage3D TexImage3D} + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + GL12C.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + /** + * Array version of: {@link #glTexSubImage3D TexSubImage3D} + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + GL12C.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Array version of: {@link #glTexSubImage3D TexSubImage3D} + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + GL12C.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Array version of: {@link #glTexSubImage3D TexSubImage3D} + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + GL12C.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Array version of: {@link #glTexSubImage3D TexSubImage3D} + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + GL12C.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL12C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL12C.java new file mode 100644 index 000000000..37b241e0d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL12C.java @@ -0,0 +1,745 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality of a forward compatible context, up to version 1.2. + * + *

    Extensions promoted to core in this release:

    + * + * + * + *

    Extensions part of the imaging subset:

    + * + * + */ +public class GL12C extends GL11C { + + static { GL.initialize(); } + + /** Aliases for smooth points and lines. */ + public static final int + GL_ALIASED_LINE_WIDTH_RANGE = 0x846E, + GL_SMOOTH_POINT_SIZE_RANGE = 0xB12, + GL_SMOOTH_POINT_SIZE_GRANULARITY = 0xB13, + GL_SMOOTH_LINE_WIDTH_RANGE = 0xB22, + GL_SMOOTH_LINE_WIDTH_GRANULARITY = 0xB23; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_TEXTURE_BINDING_3D = 0x806A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev, and by the {@code pname} parameter of PixelStore. */ + public static final int + GL_PACK_SKIP_IMAGES = 0x806B, + GL_PACK_IMAGE_HEIGHT = 0x806C, + GL_UNPACK_SKIP_IMAGES = 0x806D, + GL_UNPACK_IMAGE_HEIGHT = 0x806E; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of TexImage3D, GetTexImage, GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv, and + * GetTexParameterfv. + */ + public static final int GL_TEXTURE_3D = 0x806F; + + /** Accepted by the {@code target} parameter of TexImage3D, GetTexLevelParameteriv, and GetTexLevelParameterfv. */ + public static final int GL_PROXY_TEXTURE_3D = 0x8070; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameteriv and GetTexLevelParameterfv. */ + public static final int GL_TEXTURE_DEPTH = 0x8071; + + /** Accepted by the {@code pname} parameter of TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv. */ + public static final int GL_TEXTURE_WRAP_R = 0x8072; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_3D_TEXTURE_SIZE = 0x8073; + + /** Accepted by the {@code format} parameter of DrawPixels, GetTexImage, ReadPixels, TexImage1D, and TexImage2D. */ + public static final int + GL_BGR = 0x80E0, + GL_BGRA = 0x80E1; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, SeparableFilter2D, + * SeparableFilter3D, GetSeparableFilter, ColorTable, GetColorTable, TexImage4D, and TexSubImage4D. + */ + public static final int + GL_UNSIGNED_BYTE_3_3_2 = 0x8032, + GL_UNSIGNED_BYTE_2_3_3_REV = 0x8362, + GL_UNSIGNED_SHORT_5_6_5 = 0x8363, + GL_UNSIGNED_SHORT_5_6_5_REV = 0x8364, + GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033, + GL_UNSIGNED_SHORT_4_4_4_4_REV = 0x8365, + GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034, + GL_UNSIGNED_SHORT_1_5_5_5_REV = 0x8366, + GL_UNSIGNED_INT_8_8_8_8 = 0x8035, + GL_UNSIGNED_INT_8_8_8_8_REV = 0x8367, + GL_UNSIGNED_INT_10_10_10_2 = 0x8036, + GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368; + + /** + * Accepted by the {@code param} parameter of TexParameteri and TexParameterf, and by the {@code params} parameter of TexParameteriv and TexParameterfv, + * when their {@code pname} parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R. + */ + public static final int GL_CLAMP_TO_EDGE = 0x812F; + + /** Accepted by the {@code pname} parameter of TexParameteri, TexParameterf, TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv. */ + public static final int + GL_TEXTURE_MIN_LOD = 0x813A, + GL_TEXTURE_MAX_LOD = 0x813B, + GL_TEXTURE_BASE_LEVEL = 0x813C, + GL_TEXTURE_MAX_LEVEL = 0x813D; + + /** Recommended maximum amounts of vertex and index data. */ + public static final int + GL_MAX_ELEMENTS_VERTICES = 0x80E8, + GL_MAX_ELEMENTS_INDICES = 0x80E9; + + protected GL12C() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexImage3D ] --- + + /** Unsafe version of: {@link #glTexImage3D TexImage3D} */ + public static native void nglTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, long pixels); + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link #GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer pixels) { + nglTexImage3D(target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link #GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link #GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer pixels) { + nglTexImage3D(target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link #GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer pixels) { + nglTexImage3D(target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link #GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer pixels) { + nglTexImage3D(target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + /** + * Specifies a three-dimensional texture image. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link #GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param internalformat the texture internal format. One of:
    {@link GL11#GL_RED RED}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    {@link GL30#GL_R8 R8}{@link GL31#GL_R8_SNORM R8_SNORM}{@link GL30#GL_R16 R16}{@link GL31#GL_R16_SNORM R16_SNORM}{@link GL30#GL_RG8 RG8}{@link GL31#GL_RG8_SNORM RG8_SNORM}
    {@link GL30#GL_RG16 RG16}{@link GL31#GL_RG16_SNORM RG16_SNORM}{@link GL11#GL_R3_G3_B2 R3_G3_B2}{@link GL11#GL_RGB4 RGB4}{@link GL11#GL_RGB5 RGB5}{@link GL41#GL_RGB565 RGB565}
    {@link GL11#GL_RGB8 RGB8}{@link GL31#GL_RGB8_SNORM RGB8_SNORM}{@link GL11#GL_RGB10 RGB10}{@link GL11#GL_RGB12 RGB12}{@link GL11#GL_RGB16 RGB16}{@link GL31#GL_RGB16_SNORM RGB16_SNORM}
    {@link GL11#GL_RGBA2 RGBA2}{@link GL11#GL_RGBA4 RGBA4}{@link GL11#GL_RGB5_A1 RGB5_A1}{@link GL11#GL_RGBA8 RGBA8}{@link GL31#GL_RGBA8_SNORM RGBA8_SNORM}{@link GL11#GL_RGB10_A2 RGB10_A2}
    {@link GL33#GL_RGB10_A2UI RGB10_A2UI}{@link GL11#GL_RGBA12 RGBA12}{@link GL11#GL_RGBA16 RGBA16}{@link GL31#GL_RGBA16_SNORM RGBA16_SNORM}{@link GL21#GL_SRGB8 SRGB8}{@link GL21#GL_SRGB8_ALPHA8 SRGB8_ALPHA8}
    {@link GL30#GL_R16F R16F}{@link GL30#GL_RG16F RG16F}{@link GL30#GL_RGB16F RGB16F}{@link GL30#GL_RGBA16F RGBA16F}{@link GL30#GL_R32F R32F}{@link GL30#GL_RG32F RG32F}
    {@link GL30#GL_RGB32F RGB32F}{@link GL30#GL_RGBA32F RGBA32F}{@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F}{@link GL30#GL_RGB9_E5 RGB9_E5}{@link GL30#GL_R8I R8I}{@link GL30#GL_R8UI R8UI}
    {@link GL30#GL_R16I R16I}{@link GL30#GL_R16UI R16UI}{@link GL30#GL_R32I R32I}{@link GL30#GL_R32UI R32UI}{@link GL30#GL_RG8I RG8I}{@link GL30#GL_RG8UI RG8UI}
    {@link GL30#GL_RG16I RG16I}{@link GL30#GL_RG16UI RG16UI}{@link GL30#GL_RG32I RG32I}{@link GL30#GL_RG32UI RG32UI}{@link GL30#GL_RGB8I RGB8I}{@link GL30#GL_RGB8UI RGB8UI}
    {@link GL30#GL_RGB16I RGB16I}{@link GL30#GL_RGB16UI RGB16UI}{@link GL30#GL_RGB32I RGB32I}{@link GL30#GL_RGB32UI RGB32UI}{@link GL30#GL_RGBA8I RGBA8I}{@link GL30#GL_RGBA8UI RGBA8UI}
    {@link GL30#GL_RGBA16I RGBA16I}{@link GL30#GL_RGBA16UI RGBA16UI}{@link GL30#GL_RGBA32I RGBA32I}{@link GL30#GL_RGBA32UI RGBA32UI}{@link GL14#GL_DEPTH_COMPONENT16 DEPTH_COMPONENT16}{@link GL14#GL_DEPTH_COMPONENT24 DEPTH_COMPONENT24}
    {@link GL14#GL_DEPTH_COMPONENT32 DEPTH_COMPONENT32}{@link GL30#GL_DEPTH24_STENCIL8 DEPTH24_STENCIL8}{@link GL30#GL_DEPTH_COMPONENT32F DEPTH_COMPONENT32F}{@link GL30#GL_DEPTH32F_STENCIL8 DEPTH32F_STENCIL8}{@link GL30#GL_COMPRESSED_RED COMPRESSED_RED}{@link GL30#GL_COMPRESSED_RG COMPRESSED_RG}
    {@link GL13#GL_COMPRESSED_RGB COMPRESSED_RGB}{@link GL13#GL_COMPRESSED_RGBA COMPRESSED_RGBA}{@link GL21#GL_COMPRESSED_SRGB COMPRESSED_SRGB}{@link GL21#GL_COMPRESSED_SRGB_ALPHA COMPRESSED_SRGB_ALPHA}{@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}{@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}{@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}{@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}
    + * @param width the texture width + * @param height the texture height + * @param depth the texture depth + * @param border the texture border width + * @param format the texel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the texel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the texel data + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer pixels) { + nglTexImage3D(target, level, internalformat, width, height, depth, border, format, type, memAddressSafe(pixels)); + } + + // --- [ glTexSubImage3D ] --- + + /** Unsafe version of: {@link #glTexSubImage3D TexSubImage3D} */ + public static native void nglTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels); + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + /** + * Respecifies a cubic subregion of an existing 3D texel array. No change is made to the internalformat, width, height, depth, or border parameters of + * the specified texel array, nor is any change made to texel values outside the specified subregion. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link #GL_BGR BGR}
    {@link #GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link #GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link #GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link #GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link #GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link #GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link #GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link #GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link #GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link #GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link #GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link #GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link #GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + // --- [ glCopyTexSubImage3D ] --- + + /** + * Respecifies a rectangular subregion of a slice of an existing 3D texel array. No change is made to the {@code internalformat}, {@code width}, + * {@code height}, or {@code border} parameters of the specified texel array, nor is any change made to texel values outside the specified subregion. See + * {@link GL11C#glCopyTexImage2D CopyTexImage2D} for more details. + * + * @param target the texture target. One of:
    {@link #GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number + * @param xoffset the x coordinate of the texture subregion to update + * @param yoffset the y coordinate of the texture subregion to update + * @param zoffset the z coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * @param height the texture subregion height + * + * @see Reference Page + */ + public static native void glCopyTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glDrawRangeElements ] --- + + /** + * Unsafe version of: {@link #glDrawRangeElements DrawRangeElements} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static native void nglDrawRangeElements(int mode, int start, int end, int count, int type, long indices); + + /** + * A restricted form of {@link GL11C#glDrawElements DrawElements}. mode, start, end, and count match the corresponding arguments to glDrawElements, with the additional + * constraint that all values in the arrays count must lie between start and end, inclusive. + * + *

    Implementations denote recommended maximum amounts of vertex and index data, which may be queried by calling glGet with argument + * {@link #GL_MAX_ELEMENTS_VERTICES MAX_ELEMENTS_VERTICES} and {@link #GL_MAX_ELEMENTS_INDICES MAX_ELEMENTS_INDICES}. If end - start + 1 is greater than the value of GL_MAX_ELEMENTS_VERTICES, or if + * count is greater than the value of GL_MAX_ELEMENTS_INDICES, then the call may operate at reduced performance. There is no requirement that all vertices + * in the range start end be referenced. However, the implementation may partially process unused vertices, reducing performance from what could be + * achieved with an optimal index set.

    + * + *

    When glDrawRangeElements is called, it uses count sequential elements from an enabled array, starting at start to construct a sequence of geometric + * primitives. mode specifies what kind of primitives are constructed, and how the array elements construct these primitives. If more than one array is + * enabled, each is used.

    + * + *

    Vertex attributes that are modified by glDrawRangeElements have an unspecified value after glDrawRangeElements returns. Attributes that aren't modified + * maintain their previous values.

    + * + *
    Errors
    + * + *

    It is an error for indices to lie outside the range start end, but implementations may not check for this situation. Such indices cause + * implementation-dependent behavior.

    + * + *
      + *
    • GL_INVALID_ENUM is generated if mode is not an accepted value.
    • + *
    • GL_INVALID_VALUE is generated if count is negative.
    • + *
    • GL_INVALID_VALUE is generated if end < start.
    • + *
    • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the + * currently installed program object.
    • + *
    • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or the element array and the buffer object's data + * store is currently mapped.
    • + *
    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glDrawRangeElements(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices) { + nglDrawRangeElements(mode, start, end, count, type, indices); + } + + /** + * A restricted form of {@link GL11C#glDrawElements DrawElements}. mode, start, end, and count match the corresponding arguments to glDrawElements, with the additional + * constraint that all values in the arrays count must lie between start and end, inclusive. + * + *

    Implementations denote recommended maximum amounts of vertex and index data, which may be queried by calling glGet with argument + * {@link #GL_MAX_ELEMENTS_VERTICES MAX_ELEMENTS_VERTICES} and {@link #GL_MAX_ELEMENTS_INDICES MAX_ELEMENTS_INDICES}. If end - start + 1 is greater than the value of GL_MAX_ELEMENTS_VERTICES, or if + * count is greater than the value of GL_MAX_ELEMENTS_INDICES, then the call may operate at reduced performance. There is no requirement that all vertices + * in the range start end be referenced. However, the implementation may partially process unused vertices, reducing performance from what could be + * achieved with an optimal index set.

    + * + *

    When glDrawRangeElements is called, it uses count sequential elements from an enabled array, starting at start to construct a sequence of geometric + * primitives. mode specifies what kind of primitives are constructed, and how the array elements construct these primitives. If more than one array is + * enabled, each is used.

    + * + *

    Vertex attributes that are modified by glDrawRangeElements have an unspecified value after glDrawRangeElements returns. Attributes that aren't modified + * maintain their previous values.

    + * + *
    Errors
    + * + *

    It is an error for indices to lie outside the range start end, but implementations may not check for this situation. Such indices cause + * implementation-dependent behavior.

    + * + *
      + *
    • GL_INVALID_ENUM is generated if mode is not an accepted value.
    • + *
    • GL_INVALID_VALUE is generated if count is negative.
    • + *
    • GL_INVALID_VALUE is generated if end < start.
    • + *
    • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the + * currently installed program object.
    • + *
    • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or the element array and the buffer object's data + * store is currently mapped.
    • + *
    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glDrawRangeElements(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices) { + nglDrawRangeElements(mode, start, end, indices.remaining() >> GLChecks.typeToByteShift(type), type, memAddress(indices)); + } + + /** + * A restricted form of {@link GL11C#glDrawElements DrawElements}. mode, start, end, and count match the corresponding arguments to glDrawElements, with the additional + * constraint that all values in the arrays count must lie between start and end, inclusive. + * + *

    Implementations denote recommended maximum amounts of vertex and index data, which may be queried by calling glGet with argument + * {@link #GL_MAX_ELEMENTS_VERTICES MAX_ELEMENTS_VERTICES} and {@link #GL_MAX_ELEMENTS_INDICES MAX_ELEMENTS_INDICES}. If end - start + 1 is greater than the value of GL_MAX_ELEMENTS_VERTICES, or if + * count is greater than the value of GL_MAX_ELEMENTS_INDICES, then the call may operate at reduced performance. There is no requirement that all vertices + * in the range start end be referenced. However, the implementation may partially process unused vertices, reducing performance from what could be + * achieved with an optimal index set.

    + * + *

    When glDrawRangeElements is called, it uses count sequential elements from an enabled array, starting at start to construct a sequence of geometric + * primitives. mode specifies what kind of primitives are constructed, and how the array elements construct these primitives. If more than one array is + * enabled, each is used.

    + * + *

    Vertex attributes that are modified by glDrawRangeElements have an unspecified value after glDrawRangeElements returns. Attributes that aren't modified + * maintain their previous values.

    + * + *
    Errors
    + * + *

    It is an error for indices to lie outside the range start end, but implementations may not check for this situation. Such indices cause + * implementation-dependent behavior.

    + * + *
      + *
    • GL_INVALID_ENUM is generated if mode is not an accepted value.
    • + *
    • GL_INVALID_VALUE is generated if count is negative.
    • + *
    • GL_INVALID_VALUE is generated if end < start.
    • + *
    • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the + * currently installed program object.
    • + *
    • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or the element array and the buffer object's data + * store is currently mapped.
    • + *
    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glDrawRangeElements(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") ByteBuffer indices) { + nglDrawRangeElements(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_BYTE, memAddress(indices)); + } + + /** + * A restricted form of {@link GL11C#glDrawElements DrawElements}. mode, start, end, and count match the corresponding arguments to glDrawElements, with the additional + * constraint that all values in the arrays count must lie between start and end, inclusive. + * + *

    Implementations denote recommended maximum amounts of vertex and index data, which may be queried by calling glGet with argument + * {@link #GL_MAX_ELEMENTS_VERTICES MAX_ELEMENTS_VERTICES} and {@link #GL_MAX_ELEMENTS_INDICES MAX_ELEMENTS_INDICES}. If end - start + 1 is greater than the value of GL_MAX_ELEMENTS_VERTICES, or if + * count is greater than the value of GL_MAX_ELEMENTS_INDICES, then the call may operate at reduced performance. There is no requirement that all vertices + * in the range start end be referenced. However, the implementation may partially process unused vertices, reducing performance from what could be + * achieved with an optimal index set.

    + * + *

    When glDrawRangeElements is called, it uses count sequential elements from an enabled array, starting at start to construct a sequence of geometric + * primitives. mode specifies what kind of primitives are constructed, and how the array elements construct these primitives. If more than one array is + * enabled, each is used.

    + * + *

    Vertex attributes that are modified by glDrawRangeElements have an unspecified value after glDrawRangeElements returns. Attributes that aren't modified + * maintain their previous values.

    + * + *
    Errors
    + * + *

    It is an error for indices to lie outside the range start end, but implementations may not check for this situation. Such indices cause + * implementation-dependent behavior.

    + * + *
      + *
    • GL_INVALID_ENUM is generated if mode is not an accepted value.
    • + *
    • GL_INVALID_VALUE is generated if count is negative.
    • + *
    • GL_INVALID_VALUE is generated if end < start.
    • + *
    • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the + * currently installed program object.
    • + *
    • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or the element array and the buffer object's data + * store is currently mapped.
    • + *
    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glDrawRangeElements(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") ShortBuffer indices) { + nglDrawRangeElements(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_SHORT, memAddress(indices)); + } + + /** + * A restricted form of {@link GL11C#glDrawElements DrawElements}. mode, start, end, and count match the corresponding arguments to glDrawElements, with the additional + * constraint that all values in the arrays count must lie between start and end, inclusive. + * + *

    Implementations denote recommended maximum amounts of vertex and index data, which may be queried by calling glGet with argument + * {@link #GL_MAX_ELEMENTS_VERTICES MAX_ELEMENTS_VERTICES} and {@link #GL_MAX_ELEMENTS_INDICES MAX_ELEMENTS_INDICES}. If end - start + 1 is greater than the value of GL_MAX_ELEMENTS_VERTICES, or if + * count is greater than the value of GL_MAX_ELEMENTS_INDICES, then the call may operate at reduced performance. There is no requirement that all vertices + * in the range start end be referenced. However, the implementation may partially process unused vertices, reducing performance from what could be + * achieved with an optimal index set.

    + * + *

    When glDrawRangeElements is called, it uses count sequential elements from an enabled array, starting at start to construct a sequence of geometric + * primitives. mode specifies what kind of primitives are constructed, and how the array elements construct these primitives. If more than one array is + * enabled, each is used.

    + * + *

    Vertex attributes that are modified by glDrawRangeElements have an unspecified value after glDrawRangeElements returns. Attributes that aren't modified + * maintain their previous values.

    + * + *
    Errors
    + * + *

    It is an error for indices to lie outside the range start end, but implementations may not check for this situation. Such indices cause + * implementation-dependent behavior.

    + * + *
      + *
    • GL_INVALID_ENUM is generated if mode is not an accepted value.
    • + *
    • GL_INVALID_VALUE is generated if count is negative.
    • + *
    • GL_INVALID_VALUE is generated if end < start.
    • + *
    • GL_INVALID_OPERATION is generated if a geometry shader is active and mode is incompatible with the input primitive type of the geometry shader in the + * currently installed program object.
    • + *
    • GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array or the element array and the buffer object's data + * store is currently mapped.
    • + *
    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glDrawRangeElements(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") IntBuffer indices) { + nglDrawRangeElements(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_INT, memAddress(indices)); + } + + /** + * Array version of: {@link #glTexImage3D TexImage3D} + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTexImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage3D TexImage3D} + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTexImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage3D TexImage3D} + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTexImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexImage3D TexImage3D} + * + * @see Reference Page + */ + public static void glTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTexImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, internalformat, width, height, depth, border, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage3D TexSubImage3D} + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage3D TexSubImage3D} + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage3D TexSubImage3D} + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTexSubImage3D TexSubImage3D} + * + * @see Reference Page + */ + public static void glTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTexSubImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL13.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL13.java new file mode 100644 index 000000000..beb0f0366 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL13.java @@ -0,0 +1,1486 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 1.3. Includes the deprecated symbols of the Compatibility Profile. + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL13 extends GL12 { + + static { GL.initialize(); } + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, and CopyTexImage2D. */ + public static final int + GL_COMPRESSED_ALPHA = 0x84E9, + GL_COMPRESSED_LUMINANCE = 0x84EA, + GL_COMPRESSED_LUMINANCE_ALPHA = 0x84EB, + GL_COMPRESSED_INTENSITY = 0x84EC, + GL_COMPRESSED_RGB = 0x84ED, + GL_COMPRESSED_RGBA = 0x84EE; + + /** Accepted by the {@code target} parameter of Hint and the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int GL_TEXTURE_COMPRESSION_HINT = 0x84EF; + + /** Accepted by the {@code value} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_COMPRESSED_IMAGE_SIZE = 0x86A0, + GL_TEXTURE_COMPRESSED = 0x86A1; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int + GL_NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2, + GL_COMPRESSED_TEXTURE_FORMATS = 0x86A3; + + /** Accepted by the {@code param} parameters of TexGend, TexGenf, and TexGeni when {@code pname} parameter is TEXTURE_GEN_MODE. */ + public static final int + GL_NORMAL_MAP = 0x8511, + GL_REFLECTION_MAP = 0x8512; + + /** + * When the {@code pname} parameter of TexGendv, TexGenfv, and TexGeniv is TEXTURE_GEN_MODE, then the array {@code params} may also contain NORMAL_MAP + * or REFLECTION_MAP. Accepted by the {@code cap} parameter of Enable, Disable, IsEnabled, and by the {@code pname} parameter of GetBooleanv, + * GetIntegerv, GetFloatv, and GetDoublev, and by the {@code target} parameter of BindTexture, GetTexParameterfv, GetTexParameteriv, TexParameterf, + * TexParameteri, TexParameterfv, and TexParameteriv. + */ + public static final int GL_TEXTURE_CUBE_MAP = 0x8513; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_TEXTURE_BINDING_CUBE_MAP = 0x8514; + + /** + * Accepted by the {@code target} parameter of GetTexImage, GetTexLevelParameteriv, GetTexLevelParameterfv, TexImage2D, CopyTexImage2D, TexSubImage2D, and + * CopySubTexImage2D. + */ + public static final int + GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515, + GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516, + GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518, + GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A; + + /** Accepted by the {@code target} parameter of GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv, and TexImage2D. */ + public static final int GL_PROXY_TEXTURE_CUBE_MAP = 0x851B; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int + GL_MULTISAMPLE = 0x809D, + GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809E, + GL_SAMPLE_ALPHA_TO_ONE = 0x809F, + GL_SAMPLE_COVERAGE = 0x80A0; + + /** Accepted by the {@code mask} parameter of PushAttrib. */ + public static final int GL_MULTISAMPLE_BIT = 0x20000000; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_SAMPLE_BUFFERS = 0x80A8, + GL_SAMPLES = 0x80A9, + GL_SAMPLE_COVERAGE_VALUE = 0x80AA, + GL_SAMPLE_COVERAGE_INVERT = 0x80AB; + + /** Accepted by the {@code texture} parameter of ActiveTexture and MultiTexCoord. */ + public static final int + GL_TEXTURE0 = 0x84C0, + GL_TEXTURE1 = 0x84C1, + GL_TEXTURE2 = 0x84C2, + GL_TEXTURE3 = 0x84C3, + GL_TEXTURE4 = 0x84C4, + GL_TEXTURE5 = 0x84C5, + GL_TEXTURE6 = 0x84C6, + GL_TEXTURE7 = 0x84C7, + GL_TEXTURE8 = 0x84C8, + GL_TEXTURE9 = 0x84C9, + GL_TEXTURE10 = 0x84CA, + GL_TEXTURE11 = 0x84CB, + GL_TEXTURE12 = 0x84CC, + GL_TEXTURE13 = 0x84CD, + GL_TEXTURE14 = 0x84CE, + GL_TEXTURE15 = 0x84CF, + GL_TEXTURE16 = 0x84D0, + GL_TEXTURE17 = 0x84D1, + GL_TEXTURE18 = 0x84D2, + GL_TEXTURE19 = 0x84D3, + GL_TEXTURE20 = 0x84D4, + GL_TEXTURE21 = 0x84D5, + GL_TEXTURE22 = 0x84D6, + GL_TEXTURE23 = 0x84D7, + GL_TEXTURE24 = 0x84D8, + GL_TEXTURE25 = 0x84D9, + GL_TEXTURE26 = 0x84DA, + GL_TEXTURE27 = 0x84DB, + GL_TEXTURE28 = 0x84DC, + GL_TEXTURE29 = 0x84DD, + GL_TEXTURE30 = 0x84DE, + GL_TEXTURE31 = 0x84DF; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_ACTIVE_TEXTURE = 0x84E0, + GL_CLIENT_ACTIVE_TEXTURE = 0x84E1, + GL_MAX_TEXTURE_UNITS = 0x84E2; + + /** Accepted by the {@code params} parameter of TexEnvf, TexEnvi, TexEnvfv, and TexEnviv when the {@code pname} parameter value is TEXTURE_ENV_MODE. */ + public static final int GL_COMBINE = 0x8570; + + /** Accepted by the {@code pname} parameter of TexEnvf, TexEnvi, TexEnvfv, and TexEnviv when the {@code target} parameter value is TEXTURE_ENV. */ + public static final int + GL_COMBINE_RGB = 0x8571, + GL_COMBINE_ALPHA = 0x8572, + GL_SOURCE0_RGB = 0x8580, + GL_SOURCE1_RGB = 0x8581, + GL_SOURCE2_RGB = 0x8582, + GL_SOURCE0_ALPHA = 0x8588, + GL_SOURCE1_ALPHA = 0x8589, + GL_SOURCE2_ALPHA = 0x858A, + GL_OPERAND0_RGB = 0x8590, + GL_OPERAND1_RGB = 0x8591, + GL_OPERAND2_RGB = 0x8592, + GL_OPERAND0_ALPHA = 0x8598, + GL_OPERAND1_ALPHA = 0x8599, + GL_OPERAND2_ALPHA = 0x859A, + GL_RGB_SCALE = 0x8573; + + /** + * Accepted by the {@code params} parameter of TexEnvf, TexEnvi, TexEnvfv, and TexEnviv when the {@code pname} parameter value is COMBINE_RGB or + * COMBINE_ALPHA. + */ + public static final int + GL_ADD_SIGNED = 0x8574, + GL_INTERPOLATE = 0x8575, + GL_SUBTRACT = 0x84E7; + + /** + * Accepted by the {@code params} parameter of TexEnvf, TexEnvi, TexEnvfv, and TexEnviv when the {@code pname} parameter value is SOURCE0_RGB, + * SOURCE1_RGB, SOURCE2_RGB, SOURCE0_ALPHA, SOURCE1_ALPHA, or SOURCE2_ALPHA. + */ + public static final int + GL_CONSTANT = 0x8576, + GL_PRIMARY_COLOR = 0x8577, + GL_PREVIOUS = 0x8578; + + /** Accepted by the {@code params} parameter of TexEnvf, TexEnvi, TexEnvfv, and TexEnviv when the {@code pname} parameter value is COMBINE_RGB_ARB. */ + public static final int + GL_DOT3_RGB = 0x86AE, + GL_DOT3_RGBA = 0x86AF; + + /** + * Accepted by the {@code param} parameter of TexParameteri and TexParameterf, and by the {@code params} parameter of TexParameteriv and TexParameterfv, + * when their {@code pname} parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R. + */ + public static final int GL_CLAMP_TO_BORDER = 0x812D; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_TRANSPOSE_MODELVIEW_MATRIX = 0x84E3, + GL_TRANSPOSE_PROJECTION_MATRIX = 0x84E4, + GL_TRANSPOSE_TEXTURE_MATRIX = 0x84E5, + GL_TRANSPOSE_COLOR_MATRIX = 0x84E6; + + protected GL13() { + throw new UnsupportedOperationException(); + } + + // --- [ glCompressedTexImage3D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexImage3D CompressedTexImage3D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int imageSize, long data) { + GL13C.nglCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data); + } + + /** + * Specifies a three-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param depth the depth of the texture image + * @param border must be 0 + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL13C.glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data); + } + + /** + * Specifies a three-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param depth the depth of the texture image + * @param border must be 0 + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + GL13C.glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, data); + } + + // --- [ glCompressedTexImage2D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexImage2D CompressedTexImage2D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, int imageSize, long data) { + GL13C.nglCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); + } + + /** + * Specifies a two-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13C#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13C#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param border must be 0 + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL13C.glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); + } + + /** + * Specifies a two-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13C#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13C#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param border must be 0 + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + GL13C.glCompressedTexImage2D(target, level, internalformat, width, height, border, data); + } + + // --- [ glCompressedTexImage1D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexImage1D CompressedTexImage1D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTexImage1D(int target, int level, int internalformat, int width, int border, int imageSize, long data) { + GL13C.nglCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data); + } + + /** + * Specifies a one-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param border must be 0 + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL13C.glCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data); + } + + /** + * Specifies a one-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param border must be 0 + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + GL13C.glCompressedTexImage1D(target, level, internalformat, width, border, data); + } + + // --- [ glCompressedTexSubImage3D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexSubImage3D CompressedTexSubImage3D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, long data) { + GL13C.nglCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } + + /** + * Respecifies only a cubic subregion of an existing 3D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL13C.glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } + + /** + * Respecifies only a cubic subregion of an existing 3D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + GL13C.glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, data); + } + + // --- [ glCompressedTexSubImage2D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexSubImage2D CompressedTexSubImage2D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int imageSize, long data) { + GL13C.nglCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); + } + + /** + * Respecifies only a rectangular subregion of an existing 2D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13C#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL13C.glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); + } + + /** + * Respecifies only a rectangular subregion of an existing 2D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13C#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + GL13C.glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, data); + } + + // --- [ glCompressedTexSubImage1D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexSubImage1D CompressedTexSubImage1D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTexSubImage1D(int target, int level, int xoffset, int width, int format, int imageSize, long data) { + GL13C.nglCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data); + } + + /** + * Respecifies only a subregion of an existing 1D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. Must be:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL13C.glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data); + } + + /** + * Respecifies only a subregion of an existing 1D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. Must be:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + GL13C.glCompressedTexSubImage1D(target, level, xoffset, width, format, data); + } + + // --- [ glGetCompressedTexImage ] --- + + /** Unsafe version of: {@link #glGetCompressedTexImage GetCompressedTexImage} */ + public static void nglGetCompressedTexImage(int target, int level, long pixels) { + GL13C.nglGetCompressedTexImage(target, level, pixels); + } + + /** + * Returns a compressed texture image. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL13C#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13C#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link GL13C#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link GL13C#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13C#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13C#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param pixels a buffer in which to return the compressed texture image + * + * @see Reference Page + */ + public static void glGetCompressedTexImage(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") ByteBuffer pixels) { + GL13C.glGetCompressedTexImage(target, level, pixels); + } + + /** + * Returns a compressed texture image. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL13C#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13C#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link GL13C#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link GL13C#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13C#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13C#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param pixels a buffer in which to return the compressed texture image + * + * @see Reference Page + */ + public static void glGetCompressedTexImage(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") long pixels) { + GL13C.glGetCompressedTexImage(target, level, pixels); + } + + // --- [ glSampleCoverage ] --- + + /** + * Specifies multisample coverage parameters. + * + *

    Multisampling samples a pixel multiple times at various implementation-dependent subpixel locations to generate antialiasing effects. Multisampling + * transparently antialiases points, lines, polygons, and images if it is enabled.

    + * + *

    {@code value} is used in constructing a temporary mask used in determining which samples will be used in resolving the final fragment color. This mask + * is bitwise-ANDed with the coverage mask generated from the multisampling computation. If the {@code invert} flag is set, the temporary mask is inverted + * (all bits flipped) and then the bitwise-AND is computed.

    + * + *

    If an implementation does not have any multisample buffers available, or multisampling is disabled, rasterization occurs with only a single sample + * computing a pixel's final RGB color.

    + * + *

    Provided an implementation supports multisample buffers, and multisampling is enabled, then a pixel's final color is generated by combining several + * samples per pixel. Each sample contains color, depth, and stencil information, allowing those operations to be performed on each sample.

    + * + * @param value a sample coverage value. The value is clamped to the range [0, 1]. The initial value is 1.0. + * @param invert if the coverage masks should be inverted. The initial value is false. + * + * @see Reference Page + */ + public static void glSampleCoverage(@NativeType("GLfloat") float value, @NativeType("GLboolean") boolean invert) { + GL13C.glSampleCoverage(value, invert); + } + + // --- [ glActiveTexture ] --- + + /** + * Selects which texture unit subsequent texture state calls will affect. The number of texture units an implementation supports is implementation + * dependent. + * + * @param texture which texture unit to make active. One of:
    {@link GL13C#GL_TEXTURE0 TEXTURE0}GL_TEXTURE[1-31]
    + * + * @see Reference Page + */ + public static void glActiveTexture(@NativeType("GLenum") int texture) { + GL13C.glActiveTexture(texture); + } + + // --- [ glClientActiveTexture ] --- + + /** + * Selects the vertex array client state parameters to be modified by the TexCoordPointer command and the array affected by EnableClientState and + * DisableClientState with parameter TEXTURE_COORD_ARRAY. + * + * @param texture which texture coordinate array to make active. One of:
    {@link #GL_TEXTURE0 TEXTURE0}GL_TEXTURE[1-31]
    + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glClientActiveTexture(@NativeType("GLenum") int texture); + + // --- [ glMultiTexCoord1f ] --- + + /** + * Sets the current one-dimensional texture coordinate for the specified texture coordinate set. {@code t} and {@code r} are implicitly set to 0 and {@code q} to 1. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord1f(@NativeType("GLenum") int texture, @NativeType("GLfloat") float s); + + // --- [ glMultiTexCoord1s ] --- + + /** + * Short version of {@link #glMultiTexCoord1f MultiTexCoord1f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord1s(@NativeType("GLenum") int texture, @NativeType("GLshort") short s); + + // --- [ glMultiTexCoord1i ] --- + + /** + * Integer version of {@link #glMultiTexCoord1f MultiTexCoord1f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord1i(@NativeType("GLenum") int texture, @NativeType("GLint") int s); + + // --- [ glMultiTexCoord1d ] --- + + /** + * Double version of {@link #glMultiTexCoord1f MultiTexCoord1f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord1d(@NativeType("GLenum") int texture, @NativeType("GLdouble") double s); + + // --- [ glMultiTexCoord1fv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord1fv MultiTexCoord1fv} */ + public static native void nglMultiTexCoord1fv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord1f MultiTexCoord1f}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord1fv(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglMultiTexCoord1fv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord1sv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord1sv MultiTexCoord1sv} */ + public static native void nglMultiTexCoord1sv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord1s MultiTexCoord1s}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord1sv(@NativeType("GLenum") int texture, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglMultiTexCoord1sv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord1iv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord1iv MultiTexCoord1iv} */ + public static native void nglMultiTexCoord1iv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord1i MultiTexCoord1i}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord1iv(@NativeType("GLenum") int texture, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglMultiTexCoord1iv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord1dv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord1dv MultiTexCoord1dv} */ + public static native void nglMultiTexCoord1dv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord1d MultiTexCoord1d}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord1dv(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglMultiTexCoord1dv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord2f ] --- + + /** + * Sets the current two-dimensional texture coordinate for the specified texture coordinate set. {@code r} is implicitly set to 0 and {@code q} to 1. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord2f(@NativeType("GLenum") int texture, @NativeType("GLfloat") float s, @NativeType("GLfloat") float t); + + // --- [ glMultiTexCoord2s ] --- + + /** + * Short version of {@link #glMultiTexCoord2f MultiTexCoord2f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord2s(@NativeType("GLenum") int texture, @NativeType("GLshort") short s, @NativeType("GLshort") short t); + + // --- [ glMultiTexCoord2i ] --- + + /** + * Integer version of {@link #glMultiTexCoord2f MultiTexCoord2f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord2i(@NativeType("GLenum") int texture, @NativeType("GLint") int s, @NativeType("GLint") int t); + + // --- [ glMultiTexCoord2d ] --- + + /** + * Double version of {@link #glMultiTexCoord2f MultiTexCoord2f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord2d(@NativeType("GLenum") int texture, @NativeType("GLdouble") double s, @NativeType("GLdouble") double t); + + // --- [ glMultiTexCoord2fv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord2fv MultiTexCoord2fv} */ + public static native void nglMultiTexCoord2fv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord2f MultiTexCoord2f}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord2fv(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglMultiTexCoord2fv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord2sv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord2sv MultiTexCoord2sv} */ + public static native void nglMultiTexCoord2sv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord2s MultiTexCoord2s}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord2sv(@NativeType("GLenum") int texture, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglMultiTexCoord2sv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord2iv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord2iv MultiTexCoord2iv} */ + public static native void nglMultiTexCoord2iv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord2i MultiTexCoord2i}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord2iv(@NativeType("GLenum") int texture, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglMultiTexCoord2iv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord2dv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord2dv MultiTexCoord2dv} */ + public static native void nglMultiTexCoord2dv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord2d MultiTexCoord2d}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord2dv(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglMultiTexCoord2dv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord3f ] --- + + /** + * Sets the current three-dimensional texture coordinate for the specified texture coordinate set. {@code q} is implicitly set to 1. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord3f(@NativeType("GLenum") int texture, @NativeType("GLfloat") float s, @NativeType("GLfloat") float t, @NativeType("GLfloat") float r); + + // --- [ glMultiTexCoord3s ] --- + + /** + * Short version of {@link #glMultiTexCoord3f MultiTexCoord3f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord3s(@NativeType("GLenum") int texture, @NativeType("GLshort") short s, @NativeType("GLshort") short t, @NativeType("GLshort") short r); + + // --- [ glMultiTexCoord3i ] --- + + /** + * Integer version of {@link #glMultiTexCoord3f MultiTexCoord3f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord3i(@NativeType("GLenum") int texture, @NativeType("GLint") int s, @NativeType("GLint") int t, @NativeType("GLint") int r); + + // --- [ glMultiTexCoord3d ] --- + + /** + * Double version of {@link #glMultiTexCoord3f MultiTexCoord3f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord3d(@NativeType("GLenum") int texture, @NativeType("GLdouble") double s, @NativeType("GLdouble") double t, @NativeType("GLdouble") double r); + + // --- [ glMultiTexCoord3fv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord3fv MultiTexCoord3fv} */ + public static native void nglMultiTexCoord3fv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord3f MultiTexCoord3f}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord3fv(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglMultiTexCoord3fv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord3sv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord3sv MultiTexCoord3sv} */ + public static native void nglMultiTexCoord3sv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord3s MultiTexCoord3s}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord3sv(@NativeType("GLenum") int texture, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglMultiTexCoord3sv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord3iv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord3iv MultiTexCoord3iv} */ + public static native void nglMultiTexCoord3iv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord3i MultiTexCoord3i}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord3iv(@NativeType("GLenum") int texture, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglMultiTexCoord3iv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord3dv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord3dv MultiTexCoord3dv} */ + public static native void nglMultiTexCoord3dv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord3d MultiTexCoord3d}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord3dv(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglMultiTexCoord3dv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord4f ] --- + + /** + * Sets the current four-dimensional texture coordinate for the specified texture coordinate set. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord4f(@NativeType("GLenum") int texture, @NativeType("GLfloat") float s, @NativeType("GLfloat") float t, @NativeType("GLfloat") float r, @NativeType("GLfloat") float q); + + // --- [ glMultiTexCoord4s ] --- + + /** + * Short version of {@link #glMultiTexCoord4f MultiTexCoord4f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord4s(@NativeType("GLenum") int texture, @NativeType("GLshort") short s, @NativeType("GLshort") short t, @NativeType("GLshort") short r, @NativeType("GLshort") short q); + + // --- [ glMultiTexCoord4i ] --- + + /** + * Integer version of {@link #glMultiTexCoord4f MultiTexCoord4f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord4i(@NativeType("GLenum") int texture, @NativeType("GLint") int s, @NativeType("GLint") int t, @NativeType("GLint") int r, @NativeType("GLint") int q); + + // --- [ glMultiTexCoord4d ] --- + + /** + * Double version of {@link #glMultiTexCoord4f MultiTexCoord4f}. + * + * @param texture the coordinate set to be modified + * @param s the s component of the current texture coordinates + * @param t the t component of the current texture coordinates + * @param r the r component of the current texture coordinates + * @param q the q component of the current texture coordinates + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoord4d(@NativeType("GLenum") int texture, @NativeType("GLdouble") double s, @NativeType("GLdouble") double t, @NativeType("GLdouble") double r, @NativeType("GLdouble") double q); + + // --- [ glMultiTexCoord4fv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord4fv MultiTexCoord4fv} */ + public static native void nglMultiTexCoord4fv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord4f MultiTexCoord4f}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord4fv(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglMultiTexCoord4fv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord4sv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord4sv MultiTexCoord4sv} */ + public static native void nglMultiTexCoord4sv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord4s MultiTexCoord4s}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord4sv(@NativeType("GLenum") int texture, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglMultiTexCoord4sv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord4iv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord4iv MultiTexCoord4iv} */ + public static native void nglMultiTexCoord4iv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord4i MultiTexCoord4i}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord4iv(@NativeType("GLenum") int texture, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglMultiTexCoord4iv(texture, memAddress(v)); + } + + // --- [ glMultiTexCoord4dv ] --- + + /** Unsafe version of: {@link #glMultiTexCoord4dv MultiTexCoord4dv} */ + public static native void nglMultiTexCoord4dv(int texture, long v); + + /** + * Pointer version of {@link #glMultiTexCoord4d MultiTexCoord4d}. + * + * @param texture the coordinate set to be modified + * @param v the texture coordinate buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord4dv(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglMultiTexCoord4dv(texture, memAddress(v)); + } + + // --- [ glLoadTransposeMatrixf ] --- + + /** Unsafe version of: {@link #glLoadTransposeMatrixf LoadTransposeMatrixf} */ + public static native void nglLoadTransposeMatrixf(long m); + + /** + * Sets the current matrix to a 4 × 4 matrix in row-major order. + * + *

    The matrix is stored as 16 consecutive values, i.e. as:

    + * + * + * + * + * + * + *
    a1a2a3a4
    a5a6a7a8
    a9a10a11a12
    a13a14a15a16
    + * + * @param m the matrix data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLoadTransposeMatrixf(@NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglLoadTransposeMatrixf(memAddress(m)); + } + + // --- [ glLoadTransposeMatrixd ] --- + + /** Unsafe version of: {@link #glLoadTransposeMatrixd LoadTransposeMatrixd} */ + public static native void nglLoadTransposeMatrixd(long m); + + /** + * Double version of {@link #glLoadTransposeMatrixf LoadTransposeMatrixf}. + * + * @param m the matrix data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLoadTransposeMatrixd(@NativeType("GLdouble const *") DoubleBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglLoadTransposeMatrixd(memAddress(m)); + } + + // --- [ glMultTransposeMatrixf ] --- + + /** Unsafe version of: {@link #glMultTransposeMatrixf MultTransposeMatrixf} */ + public static native void nglMultTransposeMatrixf(long m); + + /** + * Multiplies the current matrix with a 4 × 4 matrix in row-major order. See {@link #glLoadTransposeMatrixf LoadTransposeMatrixf} for details. + * + * @param m the matrix data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultTransposeMatrixf(@NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMultTransposeMatrixf(memAddress(m)); + } + + // --- [ glMultTransposeMatrixd ] --- + + /** Unsafe version of: {@link #glMultTransposeMatrixd MultTransposeMatrixd} */ + public static native void nglMultTransposeMatrixd(long m); + + /** + * Double version of {@link #glMultTransposeMatrixf MultTransposeMatrixf}. + * + * @param m the matrix data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultTransposeMatrixd(@NativeType("GLdouble const *") DoubleBuffer m) { + if (CHECKS) { + check(m, 16); + } + nglMultTransposeMatrixd(memAddress(m)); + } + + /** + * Array version of: {@link #glMultiTexCoord1fv MultiTexCoord1fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord1fv(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord1fv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord1sv MultiTexCoord1sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord1sv(@NativeType("GLenum") int texture, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord1sv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord1iv MultiTexCoord1iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord1iv(@NativeType("GLenum") int texture, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord1iv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord1dv MultiTexCoord1dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord1dv(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord1dv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord2fv MultiTexCoord2fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord2fv(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord2fv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord2sv MultiTexCoord2sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord2sv(@NativeType("GLenum") int texture, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord2sv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord2iv MultiTexCoord2iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord2iv(@NativeType("GLenum") int texture, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord2iv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord2dv MultiTexCoord2dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord2dv(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord2dv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord3fv MultiTexCoord3fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord3fv(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord3fv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord3sv MultiTexCoord3sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord3sv(@NativeType("GLenum") int texture, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord3sv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord3iv MultiTexCoord3iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord3iv(@NativeType("GLenum") int texture, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord3iv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord3dv MultiTexCoord3dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord3dv(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord3dv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord4fv MultiTexCoord4fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord4fv(@NativeType("GLenum") int texture, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord4fv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord4sv MultiTexCoord4sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord4sv(@NativeType("GLenum") int texture, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord4sv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord4iv MultiTexCoord4iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord4iv(@NativeType("GLenum") int texture, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord4iv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoord4dv MultiTexCoord4dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoord4dv(@NativeType("GLenum") int texture, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord4dv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(texture, v, __functionAddress); + } + + /** + * Array version of: {@link #glLoadTransposeMatrixf LoadTransposeMatrixf} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLoadTransposeMatrixf(@NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glLoadTransposeMatrixf; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + + /** + * Array version of: {@link #glLoadTransposeMatrixd LoadTransposeMatrixd} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glLoadTransposeMatrixd(@NativeType("GLdouble const *") double[] m) { + long __functionAddress = GL.getICD().glLoadTransposeMatrixd; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + + /** + * Array version of: {@link #glMultTransposeMatrixf MultTransposeMatrixf} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultTransposeMatrixf(@NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMultTransposeMatrixf; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + + /** + * Array version of: {@link #glMultTransposeMatrixd MultTransposeMatrixd} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultTransposeMatrixd(@NativeType("GLdouble const *") double[] m) { + long __functionAddress = GL.getICD().glMultTransposeMatrixd; + if (CHECKS) { + check(__functionAddress); + check(m, 16); + } + callPV(m, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL13C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL13C.java new file mode 100644 index 000000000..b1fbd910e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL13C.java @@ -0,0 +1,489 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality of a forward compatible context, up to version 1.3. + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL13C extends GL12C { + + static { GL.initialize(); } + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, and CopyTexImage2D. */ + public static final int + GL_COMPRESSED_RGB = 0x84ED, + GL_COMPRESSED_RGBA = 0x84EE; + + /** Accepted by the {@code target} parameter of Hint and the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int GL_TEXTURE_COMPRESSION_HINT = 0x84EF; + + /** Accepted by the {@code value} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_COMPRESSED_IMAGE_SIZE = 0x86A0, + GL_TEXTURE_COMPRESSED = 0x86A1; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int + GL_NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2, + GL_COMPRESSED_TEXTURE_FORMATS = 0x86A3; + + /** + * When the {@code pname} parameter of TexGendv, TexGenfv, and TexGeniv is TEXTURE_GEN_MODE, then the array {@code params} may also contain NORMAL_MAP + * or REFLECTION_MAP. Accepted by the {@code cap} parameter of Enable, Disable, IsEnabled, and by the {@code pname} parameter of GetBooleanv, + * GetIntegerv, GetFloatv, and GetDoublev, and by the {@code target} parameter of BindTexture, GetTexParameterfv, GetTexParameteriv, TexParameterf, + * TexParameteri, TexParameterfv, and TexParameteriv. + */ + public static final int GL_TEXTURE_CUBE_MAP = 0x8513; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_TEXTURE_BINDING_CUBE_MAP = 0x8514; + + /** + * Accepted by the {@code target} parameter of GetTexImage, GetTexLevelParameteriv, GetTexLevelParameterfv, TexImage2D, CopyTexImage2D, TexSubImage2D, and + * CopySubTexImage2D. + */ + public static final int + GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515, + GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516, + GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518, + GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A; + + /** Accepted by the {@code target} parameter of GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv, and TexImage2D. */ + public static final int GL_PROXY_TEXTURE_CUBE_MAP = 0x851B; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int + GL_MULTISAMPLE = 0x809D, + GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809E, + GL_SAMPLE_ALPHA_TO_ONE = 0x809F, + GL_SAMPLE_COVERAGE = 0x80A0; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_SAMPLE_BUFFERS = 0x80A8, + GL_SAMPLES = 0x80A9, + GL_SAMPLE_COVERAGE_VALUE = 0x80AA, + GL_SAMPLE_COVERAGE_INVERT = 0x80AB; + + /** Accepted by the {@code texture} parameter of ActiveTexture and MultiTexCoord. */ + public static final int + GL_TEXTURE0 = 0x84C0, + GL_TEXTURE1 = 0x84C1, + GL_TEXTURE2 = 0x84C2, + GL_TEXTURE3 = 0x84C3, + GL_TEXTURE4 = 0x84C4, + GL_TEXTURE5 = 0x84C5, + GL_TEXTURE6 = 0x84C6, + GL_TEXTURE7 = 0x84C7, + GL_TEXTURE8 = 0x84C8, + GL_TEXTURE9 = 0x84C9, + GL_TEXTURE10 = 0x84CA, + GL_TEXTURE11 = 0x84CB, + GL_TEXTURE12 = 0x84CC, + GL_TEXTURE13 = 0x84CD, + GL_TEXTURE14 = 0x84CE, + GL_TEXTURE15 = 0x84CF, + GL_TEXTURE16 = 0x84D0, + GL_TEXTURE17 = 0x84D1, + GL_TEXTURE18 = 0x84D2, + GL_TEXTURE19 = 0x84D3, + GL_TEXTURE20 = 0x84D4, + GL_TEXTURE21 = 0x84D5, + GL_TEXTURE22 = 0x84D6, + GL_TEXTURE23 = 0x84D7, + GL_TEXTURE24 = 0x84D8, + GL_TEXTURE25 = 0x84D9, + GL_TEXTURE26 = 0x84DA, + GL_TEXTURE27 = 0x84DB, + GL_TEXTURE28 = 0x84DC, + GL_TEXTURE29 = 0x84DD, + GL_TEXTURE30 = 0x84DE, + GL_TEXTURE31 = 0x84DF; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int GL_ACTIVE_TEXTURE = 0x84E0; + + /** + * Accepted by the {@code param} parameter of TexParameteri and TexParameterf, and by the {@code params} parameter of TexParameteriv and TexParameterfv, + * when their {@code pname} parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R. + */ + public static final int GL_CLAMP_TO_BORDER = 0x812D; + + protected GL13C() { + throw new UnsupportedOperationException(); + } + + // --- [ glCompressedTexImage3D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexImage3D CompressedTexImage3D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int imageSize, long data); + + /** + * Specifies a three-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param depth the depth of the texture image + * @param border must be 0 + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data); + } + + /** + * Specifies a three-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param depth the depth of the texture image + * @param border must be 0 + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + nglCompressedTexImage3D(target, level, internalformat, width, height, depth, border, remainingSafe(data), memAddressSafe(data)); + } + + // --- [ glCompressedTexImage2D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexImage2D CompressedTexImage2D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, int imageSize, long data); + + /** + * Specifies a two-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link #GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link #GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param border must be 0 + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); + } + + /** + * Specifies a two-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link #GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link #GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param height the height of the texture image + * @param border must be 0 + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + nglCompressedTexImage2D(target, level, internalformat, width, height, border, remainingSafe(data), memAddressSafe(data)); + } + + // --- [ glCompressedTexImage1D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexImage1D CompressedTexImage1D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexImage1D(int target, int level, int internalformat, int width, int border, int imageSize, long data); + + /** + * Specifies a one-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param border must be 0 + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data); + } + + /** + * Specifies a one-dimensional texture image in a compressed format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param internalformat the format of the compressed image data. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param width the width of the texture image + * @param border must be 0 + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLint") int border, @Nullable @NativeType("void const *") ByteBuffer data) { + nglCompressedTexImage1D(target, level, internalformat, width, border, remainingSafe(data), memAddressSafe(data)); + } + + // --- [ glCompressedTexSubImage3D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexSubImage3D CompressedTexSubImage3D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, long data); + + /** + * Respecifies only a cubic subregion of an existing 3D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } + + /** + * Respecifies only a cubic subregion of an existing 3D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage3D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedTexSubImage2D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexSubImage2D CompressedTexSubImage2D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int imageSize, long data); + + /** + * Respecifies only a rectangular subregion of an existing 2D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link #GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); + } + + /** + * Respecifies only a rectangular subregion of an existing 2D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link #GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage2D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedTexSubImage1D ] --- + + /** + * Unsafe version of: {@link #glCompressedTexSubImage1D CompressedTexSubImage1D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTexSubImage1D(int target, int level, int xoffset, int width, int format, int imageSize, long data); + + /** + * Respecifies only a subregion of an existing 1D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. Must be:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data); + } + + /** + * Respecifies only a subregion of an existing 1D texel array, with incoming data stored in a specific compressed image format. + * + * @param target the target texture. Must be:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTexSubImage1D(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTexSubImage1D(target, level, xoffset, width, format, data.remaining(), memAddress(data)); + } + + // --- [ glGetCompressedTexImage ] --- + + /** Unsafe version of: {@link #glGetCompressedTexImage GetCompressedTexImage} */ + public static native void nglGetCompressedTexImage(int target, int level, long pixels); + + /** + * Returns a compressed texture image. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link #GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link #GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link #GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link #GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link #GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link #GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param pixels a buffer in which to return the compressed texture image + * + * @see Reference Page + */ + public static void glGetCompressedTexImage(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") ByteBuffer pixels) { + if (CHECKS) { + if (DEBUG) { + check(pixels, GL11.glGetTexLevelParameteri(target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE)); + } + } + nglGetCompressedTexImage(target, level, memAddress(pixels)); + } + + /** + * Returns a compressed texture image. + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link #GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link #GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link #GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link #GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link #GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link #GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param pixels a buffer in which to return the compressed texture image + * + * @see Reference Page + */ + public static void glGetCompressedTexImage(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") long pixels) { + nglGetCompressedTexImage(target, level, pixels); + } + + // --- [ glSampleCoverage ] --- + + /** + * Specifies multisample coverage parameters. + * + *

    Multisampling samples a pixel multiple times at various implementation-dependent subpixel locations to generate antialiasing effects. Multisampling + * transparently antialiases points, lines, polygons, and images if it is enabled.

    + * + *

    {@code value} is used in constructing a temporary mask used in determining which samples will be used in resolving the final fragment color. This mask + * is bitwise-ANDed with the coverage mask generated from the multisampling computation. If the {@code invert} flag is set, the temporary mask is inverted + * (all bits flipped) and then the bitwise-AND is computed.

    + * + *

    If an implementation does not have any multisample buffers available, or multisampling is disabled, rasterization occurs with only a single sample + * computing a pixel's final RGB color.

    + * + *

    Provided an implementation supports multisample buffers, and multisampling is enabled, then a pixel's final color is generated by combining several + * samples per pixel. Each sample contains color, depth, and stencil information, allowing those operations to be performed on each sample.

    + * + * @param value a sample coverage value. The value is clamped to the range [0, 1]. The initial value is 1.0. + * @param invert if the coverage masks should be inverted. The initial value is false. + * + * @see Reference Page + */ + public static native void glSampleCoverage(@NativeType("GLfloat") float value, @NativeType("GLboolean") boolean invert); + + // --- [ glActiveTexture ] --- + + /** + * Selects which texture unit subsequent texture state calls will affect. The number of texture units an implementation supports is implementation + * dependent. + * + * @param texture which texture unit to make active. One of:
    {@link #GL_TEXTURE0 TEXTURE0}GL_TEXTURE[1-31]
    + * + * @see Reference Page + */ + public static native void glActiveTexture(@NativeType("GLenum") int texture); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL14.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL14.java new file mode 100644 index 000000000..91aeae87f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL14.java @@ -0,0 +1,1292 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 1.4. Includes the deprecated symbols of the Compatibility Profile. + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL14 extends GL13 { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of TexParameteri, TexParameterf, TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv. */ + public static final int GL_GENERATE_MIPMAP = 0x8191; + + /** Accepted by the {@code target} parameter of Hint, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_GENERATE_MIPMAP_HINT = 0x8192; + + /** Accepted by the {@code sfactor} and {@code dfactor} parameters of BlendFunc. */ + public static final int + GL_CONSTANT_COLOR = 0x8001, + GL_ONE_MINUS_CONSTANT_COLOR = 0x8002, + GL_CONSTANT_ALPHA = 0x8003, + GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004; + + /** Accepted by the {@code mode} parameter of BlendEquation. */ + public static final int + GL_FUNC_ADD = 0x8006, + GL_MIN = 0x8007, + GL_MAX = 0x8008; + + /** Accepted by the {@code mode} parameter of BlendEquation. */ + public static final int + GL_FUNC_SUBTRACT = 0x800A, + GL_FUNC_REVERSE_SUBTRACT = 0x800B; + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, CopyTexImage1D and CopyTexImage2D. */ + public static final int + GL_DEPTH_COMPONENT16 = 0x81A5, + GL_DEPTH_COMPONENT24 = 0x81A6, + GL_DEPTH_COMPONENT32 = 0x81A7; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameterfv and GetTexLevelParameteriv. */ + public static final int GL_TEXTURE_DEPTH_SIZE = 0x884A; + + /** Accepted by the {@code pname} parameter of TexParameterf, TexParameteri, TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int GL_DEPTH_TEXTURE_MODE = 0x884B; + + /** Accepted by the {@code pname} parameter of TexParameterf, TexParameteri, TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int + GL_TEXTURE_COMPARE_MODE = 0x884C, + GL_TEXTURE_COMPARE_FUNC = 0x884D; + + /** + * Accepted by the {@code param} parameter of TexParameterf, TexParameteri, TexParameterfv, and TexParameteriv when the {@code pname} parameter is + * TEXTURE_COMPARE_MODE. + */ + public static final int GL_COMPARE_R_TO_TEXTURE = 0x884E; + + /** Accepted by the {@code pname} parameter of Fogi and Fogf. */ + public static final int GL_FOG_COORDINATE_SOURCE = 0x8450; + + /** Accepted by the {@code param} parameter of Fogi and Fogf. */ + public static final int + GL_FOG_COORDINATE = 0x8451, + GL_FRAGMENT_DEPTH = 0x8452; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_CURRENT_FOG_COORDINATE = 0x8453, + GL_FOG_COORDINATE_ARRAY_TYPE = 0x8454, + GL_FOG_COORDINATE_ARRAY_STRIDE = 0x8455; + + /** Accepted by the {@code pname} parameter of GetPointerv. */ + public static final int GL_FOG_COORDINATE_ARRAY_POINTER = 0x8456; + + /** Accepted by the {@code array} parameter of EnableClientState and DisableClientState. */ + public static final int GL_FOG_COORDINATE_ARRAY = 0x8457; + + /** Accepted by the {@code pname} parameter of PointParameterfARB, and the {@code pname} of Get. */ + public static final int + GL_POINT_SIZE_MIN = 0x8126, + GL_POINT_SIZE_MAX = 0x8127, + GL_POINT_FADE_THRESHOLD_SIZE = 0x8128, + GL_POINT_DISTANCE_ATTENUATION = 0x8129; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_COLOR_SUM = 0x8458; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_CURRENT_SECONDARY_COLOR = 0x8459, + GL_SECONDARY_COLOR_ARRAY_SIZE = 0x845A, + GL_SECONDARY_COLOR_ARRAY_TYPE = 0x845B, + GL_SECONDARY_COLOR_ARRAY_STRIDE = 0x845C; + + /** Accepted by the {@code pname} parameter of GetPointerv. */ + public static final int GL_SECONDARY_COLOR_ARRAY_POINTER = 0x845D; + + /** Accepted by the {@code array} parameter of EnableClientState and DisableClientState. */ + public static final int GL_SECONDARY_COLOR_ARRAY = 0x845E; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_BLEND_DST_RGB = 0x80C8, + GL_BLEND_SRC_RGB = 0x80C9, + GL_BLEND_DST_ALPHA = 0x80CA, + GL_BLEND_SRC_ALPHA = 0x80CB; + + /** Accepted by the {@code sfail}, {@code dpfail}, and {@code dppass} parameter of StencilOp. */ + public static final int + GL_INCR_WRAP = 0x8507, + GL_DECR_WRAP = 0x8508; + + /** Accepted by the {@code target} parameters of GetTexEnvfv, GetTexEnviv, TexEnvi, TexEnvf, Texenviv, and TexEnvfv. */ + public static final int GL_TEXTURE_FILTER_CONTROL = 0x8500; + + /** + * When the {@code target} parameter of GetTexEnvfv, GetTexEnviv, TexEnvi, TexEnvf, TexEnviv, and TexEnvfv is TEXTURE_FILTER_CONTROL, then the value of + * {@code pname} may be. + */ + public static final int GL_TEXTURE_LOD_BIAS = 0x8501; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_TEXTURE_LOD_BIAS = 0x84FD; + + /** + * Accepted by the {@code param} parameter of TexParameteri and TexParameterf, and by the {@code params} parameter of TexParameteriv and TexParameterfv, + * when their {@code pname} parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R. + */ + public static final int GL_MIRRORED_REPEAT = 0x8370; + + protected GL14() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendColor ] --- + + /** + * Specifies the constant color Cc to be used in blending. + * + * @param red the red color component + * @param green the green color component + * @param blue the blue color component + * @param alpha the alpha color component + * + * @see Reference Page + */ + public static void glBlendColor(@NativeType("GLfloat") float red, @NativeType("GLfloat") float green, @NativeType("GLfloat") float blue, @NativeType("GLfloat") float alpha) { + GL14C.glBlendColor(red, green, blue, alpha); + } + + // --- [ glBlendEquation ] --- + + /** + * Controls the blend equations used for per-fragment blending. + * + * @param mode the blend equation. One of:
    {@link GL14C#GL_FUNC_ADD FUNC_ADD}{@link GL14C#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14C#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14C#GL_MIN MIN}{@link GL14C#GL_MAX MAX}
    + * + * @see Reference Page + */ + public static void glBlendEquation(@NativeType("GLenum") int mode) { + GL14C.glBlendEquation(mode); + } + + // --- [ glFogCoordf ] --- + + /** + * Sets the current fog coordinate. + * + * @param coord the fog coordinate value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glFogCoordf(@NativeType("GLfloat") float coord); + + // --- [ glFogCoordd ] --- + + /** + * Double version of {@link #glFogCoordf FogCoordf}. + * + * @param coord the fog coordinate value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glFogCoordd(@NativeType("GLdouble") double coord); + + // --- [ glFogCoordfv ] --- + + /** Unsafe version of: {@link #glFogCoordfv FogCoordfv} */ + public static native void nglFogCoordfv(long coord); + + /** + * Pointer version of {@link #glFogCoordf FogCoordf}. + * + * @param coord the fog coordinate value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogCoordfv(@NativeType("GLfloat const *") FloatBuffer coord) { + if (CHECKS) { + check(coord, 1); + } + nglFogCoordfv(memAddress(coord)); + } + + // --- [ glFogCoorddv ] --- + + /** Unsafe version of: {@link #glFogCoorddv FogCoorddv} */ + public static native void nglFogCoorddv(long coord); + + /** + * Pointer version of {@link #glFogCoordd FogCoordd}. + * + * @param coord the fog coordinate value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogCoorddv(@NativeType("GLdouble const *") DoubleBuffer coord) { + if (CHECKS) { + check(coord, 1); + } + nglFogCoorddv(memAddress(coord)); + } + + // --- [ glFogCoordPointer ] --- + + /** Unsafe version of: {@link #glFogCoordPointer FogCoordPointer} */ + public static native void nglFogCoordPointer(int type, int stride, long pointer); + + /** + * Specifies the location and organization of a fog coordinate array. + * + * @param type the data type of the values stored in the array. One of:
    {@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the fog coordinate array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogCoordPointer(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglFogCoordPointer(type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a fog coordinate array. + * + * @param type the data type of the values stored in the array. One of:
    {@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the fog coordinate array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogCoordPointer(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglFogCoordPointer(type, stride, pointer); + } + + /** + * Specifies the location and organization of a fog coordinate array. + * + * @param type the data type of the values stored in the array. One of:
    {@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the fog coordinate array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogCoordPointer(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglFogCoordPointer(type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a fog coordinate array. + * + * @param type the data type of the values stored in the array. One of:
    {@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the fog coordinate array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogCoordPointer(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglFogCoordPointer(type, stride, memAddress(pointer)); + } + + // --- [ glMultiDrawArrays ] --- + + /** + * Unsafe version of: {@link #glMultiDrawArrays MultiDrawArrays} + * + * @param drawcount the size of {@code first} and {@code count} + */ + public static void nglMultiDrawArrays(int mode, long first, long count, int drawcount) { + GL14C.nglMultiDrawArrays(mode, first, count, drawcount); + } + + /** + * Renders multiple sets of primitives from array data. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param first an array of starting indices in the enabled arrays + * @param count an array of the number of indices to be rendered + * + * @see Reference Page + */ + public static void glMultiDrawArrays(@NativeType("GLenum") int mode, @NativeType("GLint const *") IntBuffer first, @NativeType("GLsizei const *") IntBuffer count) { + GL14C.glMultiDrawArrays(mode, first, count); + } + + // --- [ glMultiDrawElements ] --- + + /** + * Unsafe version of: {@link #glMultiDrawElements MultiDrawElements} + * + * @param drawcount the size of the {@code count} array + */ + public static void nglMultiDrawElements(int mode, long count, int type, long indices, int drawcount) { + GL14C.nglMultiDrawElements(mode, count, type, indices, drawcount); + } + + /** + * Renders multiple sets of primitives by specifying indices of array data elements. + * + *

    LWJGL note: Use {@link org.lwjgl.system.MemoryUtil#memAddress} to retrieve pointers to the index buffers.

    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param count an array of the elements counts + * @param type the type of the values in indices. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glMultiDrawElements(@NativeType("GLenum") int mode, @NativeType("GLsizei *") IntBuffer count, @NativeType("GLenum") int type, @NativeType("void const **") PointerBuffer indices) { + GL14C.glMultiDrawElements(mode, count, type, indices); + } + + // --- [ glPointParameterf ] --- + + /** + * Sets the float value of a pointer parameter. + * + * @param pname the parameter to set. Must be:
    {@link GL14C#GL_POINT_FADE_THRESHOLD_SIZE POINT_FADE_THRESHOLD_SIZE}
    + * @param param the parameter value + * + * @see Reference Page + */ + public static void glPointParameterf(@NativeType("GLenum") int pname, @NativeType("GLfloat") float param) { + GL14C.glPointParameterf(pname, param); + } + + // --- [ glPointParameteri ] --- + + /** + * Integer version of {@link #glPointParameterf PointParameterf}. + * + * @param pname the parameter to set. Must be:
    {@link GL14C#GL_POINT_FADE_THRESHOLD_SIZE POINT_FADE_THRESHOLD_SIZE}
    + * @param param the parameter value + * + * @see Reference Page + */ + public static void glPointParameteri(@NativeType("GLenum") int pname, @NativeType("GLint") int param) { + GL14C.glPointParameteri(pname, param); + } + + // --- [ glPointParameterfv ] --- + + /** Unsafe version of: {@link #glPointParameterfv PointParameterfv} */ + public static void nglPointParameterfv(int pname, long params) { + GL14C.nglPointParameterfv(pname, params); + } + + /** + * Pointer version of {@link #glPointParameterf PointParameterf}. + * + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glPointParameterfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + GL14C.glPointParameterfv(pname, params); + } + + // --- [ glPointParameteriv ] --- + + /** Unsafe version of: {@link #glPointParameteriv PointParameteriv} */ + public static void nglPointParameteriv(int pname, long params) { + GL14C.nglPointParameteriv(pname, params); + } + + /** + * Pointer version of {@link #glPointParameteri PointParameteri}. + * + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glPointParameteriv(@NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + GL14C.glPointParameteriv(pname, params); + } + + // --- [ glSecondaryColor3b ] --- + + /** + * Sets the R, G, and B components of the current secondary color. The alpha component is set to 1.0. + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glSecondaryColor3b(@NativeType("GLbyte") byte red, @NativeType("GLbyte") byte green, @NativeType("GLbyte") byte blue); + + // --- [ glSecondaryColor3s ] --- + + /** + * Short version of {@link #glSecondaryColor3b SecondaryColor3b} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glSecondaryColor3s(@NativeType("GLshort") short red, @NativeType("GLshort") short green, @NativeType("GLshort") short blue); + + // --- [ glSecondaryColor3i ] --- + + /** + * Integer version of {@link #glSecondaryColor3b SecondaryColor3b} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glSecondaryColor3i(@NativeType("GLint") int red, @NativeType("GLint") int green, @NativeType("GLint") int blue); + + // --- [ glSecondaryColor3f ] --- + + /** + * Float version of {@link #glSecondaryColor3b SecondaryColor3b} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glSecondaryColor3f(@NativeType("GLfloat") float red, @NativeType("GLfloat") float green, @NativeType("GLfloat") float blue); + + // --- [ glSecondaryColor3d ] --- + + /** + * Double version of {@link #glSecondaryColor3b SecondaryColor3b} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glSecondaryColor3d(@NativeType("GLdouble") double red, @NativeType("GLdouble") double green, @NativeType("GLdouble") double blue); + + // --- [ glSecondaryColor3ub ] --- + + /** + * Unsigned version of {@link #glSecondaryColor3b SecondaryColor3b} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glSecondaryColor3ub(@NativeType("GLubyte") byte red, @NativeType("GLubyte") byte green, @NativeType("GLubyte") byte blue); + + // --- [ glSecondaryColor3us ] --- + + /** + * Unsigned short version of {@link #glSecondaryColor3b SecondaryColor3b} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glSecondaryColor3us(@NativeType("GLushort") short red, @NativeType("GLushort") short green, @NativeType("GLushort") short blue); + + // --- [ glSecondaryColor3ui ] --- + + /** + * Unsigned int version of {@link #glSecondaryColor3b SecondaryColor3b} + * + * @param red the red component of the current secondary color + * @param green the green component of the current secondary color + * @param blue the blue component of the current secondary color + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glSecondaryColor3ui(@NativeType("GLint") int red, @NativeType("GLint") int green, @NativeType("GLint") int blue); + + // --- [ glSecondaryColor3bv ] --- + + /** Unsafe version of: {@link #glSecondaryColor3bv SecondaryColor3bv} */ + public static native void nglSecondaryColor3bv(long v); + + /** + * Byte pointer version of {@link #glSecondaryColor3b SecondaryColor3b}. + * + * @param v the secondary color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3bv(@NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3bv(memAddress(v)); + } + + // --- [ glSecondaryColor3sv ] --- + + /** Unsafe version of: {@link #glSecondaryColor3sv SecondaryColor3sv} */ + public static native void nglSecondaryColor3sv(long v); + + /** + * Pointer version of {@link #glSecondaryColor3s SecondaryColor3s}. + * + * @param v the secondary color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3sv(@NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3sv(memAddress(v)); + } + + // --- [ glSecondaryColor3iv ] --- + + /** Unsafe version of: {@link #glSecondaryColor3iv SecondaryColor3iv} */ + public static native void nglSecondaryColor3iv(long v); + + /** + * Pointer version of {@link #glSecondaryColor3i SecondaryColor3i}. + * + * @param v the secondary color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3iv(@NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3iv(memAddress(v)); + } + + // --- [ glSecondaryColor3fv ] --- + + /** Unsafe version of: {@link #glSecondaryColor3fv SecondaryColor3fv} */ + public static native void nglSecondaryColor3fv(long v); + + /** + * Pointer version of {@link #glSecondaryColor3f SecondaryColor3f}. + * + * @param v the secondary color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3fv(@NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3fv(memAddress(v)); + } + + // --- [ glSecondaryColor3dv ] --- + + /** Unsafe version of: {@link #glSecondaryColor3dv SecondaryColor3dv} */ + public static native void nglSecondaryColor3dv(long v); + + /** + * Pointer version of {@link #glSecondaryColor3d SecondaryColor3d}. + * + * @param v the secondary color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3dv(@NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3dv(memAddress(v)); + } + + // --- [ glSecondaryColor3ubv ] --- + + /** Unsafe version of: {@link #glSecondaryColor3ubv SecondaryColor3ubv} */ + public static native void nglSecondaryColor3ubv(long v); + + /** + * Pointer version of {@link #glSecondaryColor3ub SecondaryColor3ub}. + * + * @param v the secondary color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3ubv(@NativeType("GLubyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3ubv(memAddress(v)); + } + + // --- [ glSecondaryColor3usv ] --- + + /** Unsafe version of: {@link #glSecondaryColor3usv SecondaryColor3usv} */ + public static native void nglSecondaryColor3usv(long v); + + /** + * Pointer version of {@link #glSecondaryColor3us SecondaryColor3us}. + * + * @param v the secondary color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3usv(@NativeType("GLushort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3usv(memAddress(v)); + } + + // --- [ glSecondaryColor3uiv ] --- + + /** Unsafe version of: {@link #glSecondaryColor3uiv SecondaryColor3uiv} */ + public static native void nglSecondaryColor3uiv(long v); + + /** + * Pointer version of {@link #glSecondaryColor3ui SecondaryColor3ui}. + * + * @param v the secondary color buffer + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3uiv(@NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3uiv(memAddress(v)); + } + + // --- [ glSecondaryColorPointer ] --- + + /** Unsafe version of: {@link #glSecondaryColorPointer SecondaryColorPointer} */ + public static native void nglSecondaryColorPointer(int size, int type, int stride, long pointer); + + /** + * Specifies the location and organization of a secondary color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. Must be:
    3
    + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the secondary color array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColorPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglSecondaryColorPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a secondary color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. Must be:
    3
    + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the secondary color array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColorPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglSecondaryColorPointer(size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a secondary color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. Must be:
    3
    + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the secondary color array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColorPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglSecondaryColorPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a secondary color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. Must be:
    3
    + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the secondary color array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColorPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglSecondaryColorPointer(size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a secondary color array. + * + * @param size the number of values per vertex that are stored in the array, as well as their component ordering. Must be:
    3
    + * @param type the data type of the values stored in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}
    {@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}
    + * @param stride the vertex stride in bytes. If specified as zero, then array elements are stored sequentially + * @param pointer the secondary color array data + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColorPointer(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglSecondaryColorPointer(size, type, stride, memAddress(pointer)); + } + + // --- [ glBlendFuncSeparate ] --- + + /** + * Specifies pixel arithmetic for RGB and alpha components separately. + * + * @param sfactorRGB how the red, green, and blue blending factors are computed. The initial value is GL_ONE. + * @param dfactorRGB how the red, green, and blue destination blending factors are computed. The initial value is GL_ZERO. + * @param sfactorAlpha how the alpha source blending factor is computed. The initial value is GL_ONE. + * @param dfactorAlpha how the alpha destination blending factor is computed. The initial value is GL_ZERO. + * + * @see Reference Page + */ + public static void glBlendFuncSeparate(@NativeType("GLenum") int sfactorRGB, @NativeType("GLenum") int dfactorRGB, @NativeType("GLenum") int sfactorAlpha, @NativeType("GLenum") int dfactorAlpha) { + GL14C.glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); + } + + // --- [ glWindowPos2i ] --- + + /** + * Alternate way to set the current raster position. {@code z} is implictly set to 0. + * + * @param x the x value + * @param y the y value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glWindowPos2i(@NativeType("GLint") int x, @NativeType("GLint") int y); + + // --- [ glWindowPos2s ] --- + + /** + * Short version of {@link #glWindowPos2i WindowPos2i}. + * + * @param x the x value + * @param y the y value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glWindowPos2s(@NativeType("GLshort") short x, @NativeType("GLshort") short y); + + // --- [ glWindowPos2f ] --- + + /** + * Float version of {@link #glWindowPos2i WindowPos2i}. + * + * @param x the x value + * @param y the y value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glWindowPos2f(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y); + + // --- [ glWindowPos2d ] --- + + /** + * Double version of {@link #glWindowPos2i WindowPos2i}. + * + * @param x the x value + * @param y the y value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glWindowPos2d(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y); + + // --- [ glWindowPos2iv ] --- + + /** Unsafe version of: {@link #glWindowPos2iv WindowPos2iv} */ + public static native void nglWindowPos2iv(long p); + + /** + * Pointer version of {@link #glWindowPos2i WindowPos2i}. + * + * @param p the position value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos2iv(@NativeType("GLint const *") IntBuffer p) { + if (CHECKS) { + check(p, 2); + } + nglWindowPos2iv(memAddress(p)); + } + + // --- [ glWindowPos2sv ] --- + + /** Unsafe version of: {@link #glWindowPos2sv WindowPos2sv} */ + public static native void nglWindowPos2sv(long p); + + /** + * Pointer version of {@link #glWindowPos2s WindowPos2s}. + * + * @param p the position value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos2sv(@NativeType("GLshort const *") ShortBuffer p) { + if (CHECKS) { + check(p, 2); + } + nglWindowPos2sv(memAddress(p)); + } + + // --- [ glWindowPos2fv ] --- + + /** Unsafe version of: {@link #glWindowPos2fv WindowPos2fv} */ + public static native void nglWindowPos2fv(long p); + + /** + * Pointer version of {@link #glWindowPos2f WindowPos2f}. + * + * @param p the position value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos2fv(@NativeType("GLfloat const *") FloatBuffer p) { + if (CHECKS) { + check(p, 2); + } + nglWindowPos2fv(memAddress(p)); + } + + // --- [ glWindowPos2dv ] --- + + /** Unsafe version of: {@link #glWindowPos2dv WindowPos2dv} */ + public static native void nglWindowPos2dv(long p); + + /** + * Pointer version of {@link #glWindowPos2d WindowPos2d}. + * + * @param p the position value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos2dv(@NativeType("GLdouble const *") DoubleBuffer p) { + if (CHECKS) { + check(p, 2); + } + nglWindowPos2dv(memAddress(p)); + } + + // --- [ glWindowPos3i ] --- + + /** + * Alternate way to set the current raster position. + * + * @param x the x value + * @param y the y value + * @param z the z value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glWindowPos3i(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z); + + // --- [ glWindowPos3s ] --- + + /** + * Short version of {@link #glWindowPos3i WindowPos3i}. + * + * @param x the x value + * @param y the y value + * @param z the z value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glWindowPos3s(@NativeType("GLshort") short x, @NativeType("GLshort") short y, @NativeType("GLshort") short z); + + // --- [ glWindowPos3f ] --- + + /** + * Float version of {@link #glWindowPos3i WindowPos3i}. + * + * @param x the x value + * @param y the y value + * @param z the z value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glWindowPos3f(@NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z); + + // --- [ glWindowPos3d ] --- + + /** + * Double version of {@link #glWindowPos3i WindowPos3i}. + * + * @param x the x value + * @param y the y value + * @param z the z value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glWindowPos3d(@NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glWindowPos3iv ] --- + + /** Unsafe version of: {@link #glWindowPos3iv WindowPos3iv} */ + public static native void nglWindowPos3iv(long p); + + /** + * Pointer version of {@link #glWindowPos3i WindowPos3i}. + * + * @param p the position value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos3iv(@NativeType("GLint const *") IntBuffer p) { + if (CHECKS) { + check(p, 3); + } + nglWindowPos3iv(memAddress(p)); + } + + // --- [ glWindowPos3sv ] --- + + /** Unsafe version of: {@link #glWindowPos3sv WindowPos3sv} */ + public static native void nglWindowPos3sv(long p); + + /** + * Pointer version of {@link #glWindowPos3s WindowPos3s}. + * + * @param p the position value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos3sv(@NativeType("GLshort const *") ShortBuffer p) { + if (CHECKS) { + check(p, 3); + } + nglWindowPos3sv(memAddress(p)); + } + + // --- [ glWindowPos3fv ] --- + + /** Unsafe version of: {@link #glWindowPos3fv WindowPos3fv} */ + public static native void nglWindowPos3fv(long p); + + /** + * Pointer version of {@link #glWindowPos3f WindowPos3f}. + * + * @param p the position value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos3fv(@NativeType("GLfloat const *") FloatBuffer p) { + if (CHECKS) { + check(p, 3); + } + nglWindowPos3fv(memAddress(p)); + } + + // --- [ glWindowPos3dv ] --- + + /** Unsafe version of: {@link #glWindowPos3dv WindowPos3dv} */ + public static native void nglWindowPos3dv(long p); + + /** + * Pointer version of {@link #glWindowPos3d WindowPos3d}. + * + * @param p the position value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos3dv(@NativeType("GLdouble const *") DoubleBuffer p) { + if (CHECKS) { + check(p, 3); + } + nglWindowPos3dv(memAddress(p)); + } + + /** + * Array version of: {@link #glFogCoordfv FogCoordfv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogCoordfv(@NativeType("GLfloat const *") float[] coord) { + long __functionAddress = GL.getICD().glFogCoordfv; + if (CHECKS) { + check(__functionAddress); + check(coord, 1); + } + callPV(coord, __functionAddress); + } + + /** + * Array version of: {@link #glFogCoorddv FogCoorddv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glFogCoorddv(@NativeType("GLdouble const *") double[] coord) { + long __functionAddress = GL.getICD().glFogCoorddv; + if (CHECKS) { + check(__functionAddress); + check(coord, 1); + } + callPV(coord, __functionAddress); + } + + /** + * Array version of: {@link #glMultiDrawArrays MultiDrawArrays} + * + * @see Reference Page + */ + public static void glMultiDrawArrays(@NativeType("GLenum") int mode, @NativeType("GLint const *") int[] first, @NativeType("GLsizei const *") int[] count) { + GL14C.glMultiDrawArrays(mode, first, count); + } + + /** + * Array version of: {@link #glMultiDrawElements MultiDrawElements} + * + * @see Reference Page + */ + public static void glMultiDrawElements(@NativeType("GLenum") int mode, @NativeType("GLsizei *") int[] count, @NativeType("GLenum") int type, @NativeType("void const **") PointerBuffer indices) { + GL14C.glMultiDrawElements(mode, count, type, indices); + } + + /** + * Array version of: {@link #glPointParameterfv PointParameterfv} + * + * @see Reference Page + */ + public static void glPointParameterfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + GL14C.glPointParameterfv(pname, params); + } + + /** + * Array version of: {@link #glPointParameteriv PointParameteriv} + * + * @see Reference Page + */ + public static void glPointParameteriv(@NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + GL14C.glPointParameteriv(pname, params); + } + + /** + * Array version of: {@link #glSecondaryColor3sv SecondaryColor3sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3sv(@NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3sv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glSecondaryColor3iv SecondaryColor3iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3iv(@NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3iv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glSecondaryColor3fv SecondaryColor3fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3fv(@NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3fv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glSecondaryColor3dv SecondaryColor3dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3dv(@NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3dv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glSecondaryColor3usv SecondaryColor3usv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3usv(@NativeType("GLushort const *") short[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3usv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glSecondaryColor3uiv SecondaryColor3uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColor3uiv(@NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3uiv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** + * Array version of: {@link #glWindowPos2iv WindowPos2iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos2iv(@NativeType("GLint const *") int[] p) { + long __functionAddress = GL.getICD().glWindowPos2iv; + if (CHECKS) { + check(__functionAddress); + check(p, 2); + } + callPV(p, __functionAddress); + } + + /** + * Array version of: {@link #glWindowPos2sv WindowPos2sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos2sv(@NativeType("GLshort const *") short[] p) { + long __functionAddress = GL.getICD().glWindowPos2sv; + if (CHECKS) { + check(__functionAddress); + check(p, 2); + } + callPV(p, __functionAddress); + } + + /** + * Array version of: {@link #glWindowPos2fv WindowPos2fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos2fv(@NativeType("GLfloat const *") float[] p) { + long __functionAddress = GL.getICD().glWindowPos2fv; + if (CHECKS) { + check(__functionAddress); + check(p, 2); + } + callPV(p, __functionAddress); + } + + /** + * Array version of: {@link #glWindowPos2dv WindowPos2dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos2dv(@NativeType("GLdouble const *") double[] p) { + long __functionAddress = GL.getICD().glWindowPos2dv; + if (CHECKS) { + check(__functionAddress); + check(p, 2); + } + callPV(p, __functionAddress); + } + + /** + * Array version of: {@link #glWindowPos3iv WindowPos3iv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos3iv(@NativeType("GLint const *") int[] p) { + long __functionAddress = GL.getICD().glWindowPos3iv; + if (CHECKS) { + check(__functionAddress); + check(p, 3); + } + callPV(p, __functionAddress); + } + + /** + * Array version of: {@link #glWindowPos3sv WindowPos3sv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos3sv(@NativeType("GLshort const *") short[] p) { + long __functionAddress = GL.getICD().glWindowPos3sv; + if (CHECKS) { + check(__functionAddress); + check(p, 3); + } + callPV(p, __functionAddress); + } + + /** + * Array version of: {@link #glWindowPos3fv WindowPos3fv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos3fv(@NativeType("GLfloat const *") float[] p) { + long __functionAddress = GL.getICD().glWindowPos3fv; + if (CHECKS) { + check(__functionAddress); + check(p, 3); + } + callPV(p, __functionAddress); + } + + /** + * Array version of: {@link #glWindowPos3dv WindowPos3dv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glWindowPos3dv(@NativeType("GLdouble const *") double[] p) { + long __functionAddress = GL.getICD().glWindowPos3dv; + if (CHECKS) { + check(__functionAddress); + check(p, 3); + } + callPV(p, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL14C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL14C.java new file mode 100644 index 000000000..2650eba65 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL14C.java @@ -0,0 +1,318 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality of a forward compatible context, up to version 1.4. + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL14C extends GL13C { + + static { GL.initialize(); } + + /** Accepted by the {@code sfactor} and {@code dfactor} parameters of BlendFunc. */ + public static final int + GL_CONSTANT_COLOR = 0x8001, + GL_ONE_MINUS_CONSTANT_COLOR = 0x8002, + GL_CONSTANT_ALPHA = 0x8003, + GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004; + + /** Accepted by the {@code mode} parameter of BlendEquation. */ + public static final int + GL_FUNC_ADD = 0x8006, + GL_MIN = 0x8007, + GL_MAX = 0x8008; + + /** Accepted by the {@code mode} parameter of BlendEquation. */ + public static final int + GL_FUNC_SUBTRACT = 0x800A, + GL_FUNC_REVERSE_SUBTRACT = 0x800B; + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, CopyTexImage1D and CopyTexImage2D. */ + public static final int + GL_DEPTH_COMPONENT16 = 0x81A5, + GL_DEPTH_COMPONENT24 = 0x81A6, + GL_DEPTH_COMPONENT32 = 0x81A7; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameterfv and GetTexLevelParameteriv. */ + public static final int GL_TEXTURE_DEPTH_SIZE = 0x884A; + + /** Accepted by the {@code pname} parameter of TexParameterf, TexParameteri, TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int + GL_TEXTURE_COMPARE_MODE = 0x884C, + GL_TEXTURE_COMPARE_FUNC = 0x884D; + + /** Accepted by the {@code pname} parameter of PointParameterfARB, and the {@code pname} of Get. */ + public static final int GL_POINT_FADE_THRESHOLD_SIZE = 0x8128; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_BLEND_DST_RGB = 0x80C8, + GL_BLEND_SRC_RGB = 0x80C9, + GL_BLEND_DST_ALPHA = 0x80CA, + GL_BLEND_SRC_ALPHA = 0x80CB; + + /** Accepted by the {@code sfail}, {@code dpfail}, and {@code dppass} parameter of StencilOp. */ + public static final int + GL_INCR_WRAP = 0x8507, + GL_DECR_WRAP = 0x8508; + + /** + * When the {@code target} parameter of GetTexEnvfv, GetTexEnviv, TexEnvi, TexEnvf, TexEnviv, and TexEnvfv is TEXTURE_FILTER_CONTROL, then the value of + * {@code pname} may be. + */ + public static final int GL_TEXTURE_LOD_BIAS = 0x8501; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_TEXTURE_LOD_BIAS = 0x84FD; + + /** + * Accepted by the {@code param} parameter of TexParameteri and TexParameterf, and by the {@code params} parameter of TexParameteriv and TexParameterfv, + * when their {@code pname} parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R. + */ + public static final int GL_MIRRORED_REPEAT = 0x8370; + + protected GL14C() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendColor ] --- + + /** + * Specifies the constant color Cc to be used in blending. + * + * @param red the red color component + * @param green the green color component + * @param blue the blue color component + * @param alpha the alpha color component + * + * @see Reference Page + */ + public static native void glBlendColor(@NativeType("GLfloat") float red, @NativeType("GLfloat") float green, @NativeType("GLfloat") float blue, @NativeType("GLfloat") float alpha); + + // --- [ glBlendEquation ] --- + + /** + * Controls the blend equations used for per-fragment blending. + * + * @param mode the blend equation. One of:
    {@link #GL_FUNC_ADD FUNC_ADD}{@link #GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link #GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link #GL_MIN MIN}{@link #GL_MAX MAX}
    + * + * @see Reference Page + */ + public static native void glBlendEquation(@NativeType("GLenum") int mode); + + // --- [ glMultiDrawArrays ] --- + + /** + * Unsafe version of: {@link #glMultiDrawArrays MultiDrawArrays} + * + * @param drawcount the size of {@code first} and {@code count} + */ + public static native void nglMultiDrawArrays(int mode, long first, long count, int drawcount); + + /** + * Renders multiple sets of primitives from array data. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param first an array of starting indices in the enabled arrays + * @param count an array of the number of indices to be rendered + * + * @see Reference Page + */ + public static void glMultiDrawArrays(@NativeType("GLenum") int mode, @NativeType("GLint const *") IntBuffer first, @NativeType("GLsizei const *") IntBuffer count) { + if (CHECKS) { + check(count, first.remaining()); + } + nglMultiDrawArrays(mode, memAddress(first), memAddress(count), first.remaining()); + } + + // --- [ glMultiDrawElements ] --- + + /** + * Unsafe version of: {@link #glMultiDrawElements MultiDrawElements} + * + * @param drawcount the size of the {@code count} array + */ + public static native void nglMultiDrawElements(int mode, long count, int type, long indices, int drawcount); + + /** + * Renders multiple sets of primitives by specifying indices of array data elements. + * + *

    LWJGL note: Use {@link org.lwjgl.system.MemoryUtil#memAddress} to retrieve pointers to the index buffers.

    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param count an array of the elements counts + * @param type the type of the values in indices. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * + * @see Reference Page + */ + public static void glMultiDrawElements(@NativeType("GLenum") int mode, @NativeType("GLsizei *") IntBuffer count, @NativeType("GLenum") int type, @NativeType("void const **") PointerBuffer indices) { + if (CHECKS) { + check(indices, count.remaining()); + } + nglMultiDrawElements(mode, memAddress(count), type, memAddress(indices), count.remaining()); + } + + // --- [ glPointParameterf ] --- + + /** + * Sets the float value of a pointer parameter. + * + * @param pname the parameter to set. Must be:
    {@link #GL_POINT_FADE_THRESHOLD_SIZE POINT_FADE_THRESHOLD_SIZE}
    + * @param param the parameter value + * + * @see Reference Page + */ + public static native void glPointParameterf(@NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glPointParameteri ] --- + + /** + * Integer version of {@link #glPointParameterf PointParameterf}. + * + * @param pname the parameter to set. Must be:
    {@link #GL_POINT_FADE_THRESHOLD_SIZE POINT_FADE_THRESHOLD_SIZE}
    + * @param param the parameter value + * + * @see Reference Page + */ + public static native void glPointParameteri(@NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glPointParameterfv ] --- + + /** Unsafe version of: {@link #glPointParameterfv PointParameterfv} */ + public static native void nglPointParameterfv(int pname, long params); + + /** + * Pointer version of {@link #glPointParameterf PointParameterf}. + * + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glPointParameterfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 3); + } + nglPointParameterfv(pname, memAddress(params)); + } + + // --- [ glPointParameteriv ] --- + + /** Unsafe version of: {@link #glPointParameteriv PointParameteriv} */ + public static native void nglPointParameteriv(int pname, long params); + + /** + * Pointer version of {@link #glPointParameteri PointParameteri}. + * + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glPointParameteriv(@NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 3); + } + nglPointParameteriv(pname, memAddress(params)); + } + + // --- [ glBlendFuncSeparate ] --- + + /** + * Specifies pixel arithmetic for RGB and alpha components separately. + * + * @param sfactorRGB how the red, green, and blue blending factors are computed. The initial value is GL_ONE. + * @param dfactorRGB how the red, green, and blue destination blending factors are computed. The initial value is GL_ZERO. + * @param sfactorAlpha how the alpha source blending factor is computed. The initial value is GL_ONE. + * @param dfactorAlpha how the alpha destination blending factor is computed. The initial value is GL_ZERO. + * + * @see Reference Page + */ + public static native void glBlendFuncSeparate(@NativeType("GLenum") int sfactorRGB, @NativeType("GLenum") int dfactorRGB, @NativeType("GLenum") int sfactorAlpha, @NativeType("GLenum") int dfactorAlpha); + + /** + * Array version of: {@link #glMultiDrawArrays MultiDrawArrays} + * + * @see Reference Page + */ + public static void glMultiDrawArrays(@NativeType("GLenum") int mode, @NativeType("GLint const *") int[] first, @NativeType("GLsizei const *") int[] count) { + long __functionAddress = GL.getICD().glMultiDrawArrays; + if (CHECKS) { + check(__functionAddress); + check(count, first.length); + } + callPPV(mode, first, count, first.length, __functionAddress); + } + + /** + * Array version of: {@link #glMultiDrawElements MultiDrawElements} + * + * @see Reference Page + */ + public static void glMultiDrawElements(@NativeType("GLenum") int mode, @NativeType("GLsizei *") int[] count, @NativeType("GLenum") int type, @NativeType("void const **") PointerBuffer indices) { + long __functionAddress = GL.getICD().glMultiDrawElements; + if (CHECKS) { + check(__functionAddress); + check(indices, count.length); + } + callPPV(mode, count, type, memAddress(indices), count.length, __functionAddress); + } + + /** + * Array version of: {@link #glPointParameterfv PointParameterfv} + * + * @see Reference Page + */ + public static void glPointParameterfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glPointParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 3); + } + callPV(pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glPointParameteriv PointParameteriv} + * + * @see Reference Page + */ + public static void glPointParameteriv(@NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glPointParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 3); + } + callPV(pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL15.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL15.java new file mode 100644 index 000000000..9c1af5892 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL15.java @@ -0,0 +1,1216 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 1.5. Includes the deprecated symbols of the Compatibility Profile. + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL15 extends GL14 { + + static { GL.initialize(); } + + /** New token names. */ + public static final int + GL_FOG_COORD_SRC = 0x8450, + GL_FOG_COORD = 0x8451, + GL_CURRENT_FOG_COORD = 0x8453, + GL_FOG_COORD_ARRAY_TYPE = 0x8454, + GL_FOG_COORD_ARRAY_STRIDE = 0x8455, + GL_FOG_COORD_ARRAY_POINTER = 0x8456, + GL_FOG_COORD_ARRAY = 0x8457, + GL_FOG_COORD_ARRAY_BUFFER_BINDING = 0x889D, + GL_SRC0_RGB = 0x8580, + GL_SRC1_RGB = 0x8581, + GL_SRC2_RGB = 0x8582, + GL_SRC0_ALPHA = 0x8588, + GL_SRC1_ALPHA = 0x8589, + GL_SRC2_ALPHA = 0x858A; + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, and GetBufferPointerv. + */ + public static final int + GL_ARRAY_BUFFER = 0x8892, + GL_ELEMENT_ARRAY_BUFFER = 0x8893; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_ARRAY_BUFFER_BINDING = 0x8894, + GL_ELEMENT_ARRAY_BUFFER_BINDING = 0x8895, + GL_VERTEX_ARRAY_BUFFER_BINDING = 0x8896, + GL_NORMAL_ARRAY_BUFFER_BINDING = 0x8897, + GL_COLOR_ARRAY_BUFFER_BINDING = 0x8898, + GL_INDEX_ARRAY_BUFFER_BINDING = 0x8899, + GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING = 0x889A, + GL_EDGE_FLAG_ARRAY_BUFFER_BINDING = 0x889B, + GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING = 0x889C, + GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING = 0x889D, + GL_WEIGHT_ARRAY_BUFFER_BINDING = 0x889E; + + /** Accepted by the {@code pname} parameter of GetVertexAttribiv. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F; + + /** Accepted by the {@code usage} parameter of BufferData. */ + public static final int + GL_STREAM_DRAW = 0x88E0, + GL_STREAM_READ = 0x88E1, + GL_STREAM_COPY = 0x88E2, + GL_STATIC_DRAW = 0x88E4, + GL_STATIC_READ = 0x88E5, + GL_STATIC_COPY = 0x88E6, + GL_DYNAMIC_DRAW = 0x88E8, + GL_DYNAMIC_READ = 0x88E9, + GL_DYNAMIC_COPY = 0x88EA; + + /** Accepted by the {@code access} parameter of MapBuffer. */ + public static final int + GL_READ_ONLY = 0x88B8, + GL_WRITE_ONLY = 0x88B9, + GL_READ_WRITE = 0x88BA; + + /** Accepted by the {@code pname} parameter of GetBufferParameteriv. */ + public static final int + GL_BUFFER_SIZE = 0x8764, + GL_BUFFER_USAGE = 0x8765, + GL_BUFFER_ACCESS = 0x88BB, + GL_BUFFER_MAPPED = 0x88BC; + + /** Accepted by the {@code pname} parameter of GetBufferPointerv. */ + public static final int GL_BUFFER_MAP_POINTER = 0x88BD; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int GL_SAMPLES_PASSED = 0x8914; + + /** Accepted by the {@code pname} parameter of GetQueryiv. */ + public static final int + GL_QUERY_COUNTER_BITS = 0x8864, + GL_CURRENT_QUERY = 0x8865; + + /** Accepted by the {@code pname} parameter of GetQueryObjectiv and GetQueryObjectuiv. */ + public static final int + GL_QUERY_RESULT = 0x8866, + GL_QUERY_RESULT_AVAILABLE = 0x8867; + + protected GL15() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindBuffer ] --- + + /** + * Binds a named buffer object. + * + * @param target the target to which the buffer object is bound. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param buffer the name of a buffer object + * + * @see Reference Page + */ + public static void glBindBuffer(@NativeType("GLenum") int target, @NativeType("GLuint") int buffer) { + GL15C.glBindBuffer(target, buffer); + } + + // --- [ glDeleteBuffers ] --- + + /** + * Unsafe version of: {@link #glDeleteBuffers DeleteBuffers} + * + * @param n the number of buffer objects to be deleted + */ + public static void nglDeleteBuffers(int n, long buffers) { + GL15C.nglDeleteBuffers(n, buffers); + } + + /** + * Deletes named buffer objects. + * + * @param buffers an array of buffer objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteBuffers(@NativeType("GLuint const *") IntBuffer buffers) { + GL15C.glDeleteBuffers(buffers); + } + + /** + * Deletes named buffer objects. + * + * @see Reference Page + */ + public static void glDeleteBuffers(@NativeType("GLuint const *") int buffer) { + GL15C.glDeleteBuffers(buffer); + } + + // --- [ glGenBuffers ] --- + + /** + * Unsafe version of: {@link #glGenBuffers GenBuffers} + * + * @param n the number of buffer object names to be generated + */ + public static void nglGenBuffers(int n, long buffers) { + GL15C.nglGenBuffers(n, buffers); + } + + /** + * Generates buffer object names. + * + * @param buffers a buffer in which the generated buffer object names are stored + * + * @see Reference Page + */ + public static void glGenBuffers(@NativeType("GLuint *") IntBuffer buffers) { + GL15C.glGenBuffers(buffers); + } + + /** + * Generates buffer object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenBuffers() { + return GL15C.glGenBuffers(); + } + + // --- [ glIsBuffer ] --- + + /** + * Determines if a name corresponds to a buffer object. + * + * @param buffer a value that may be the name of a buffer object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsBuffer(@NativeType("GLuint") int buffer) { + return GL15C.glIsBuffer(buffer); + } + + // --- [ glBufferData ] --- + + /** + * Unsafe version of: {@link #glBufferData BufferData} + * + * @param size the size in bytes of the buffer object's new data store + */ + public static void nglBufferData(int target, long size, long data, int usage) { + GL15C.nglBufferData(target, size, data, usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param size the size in bytes of the buffer object's new data store + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15C#GL_STREAM_DRAW STREAM_DRAW}{@link GL15C#GL_STREAM_READ STREAM_READ}{@link GL15C#GL_STREAM_COPY STREAM_COPY}{@link GL15C#GL_STATIC_DRAW STATIC_DRAW}{@link GL15C#GL_STATIC_READ STATIC_READ}{@link GL15C#GL_STATIC_COPY STATIC_COPY}{@link GL15C#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15C#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15C#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, size, usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15C#GL_STREAM_DRAW STREAM_DRAW}{@link GL15C#GL_STREAM_READ STREAM_READ}{@link GL15C#GL_STREAM_COPY STREAM_COPY}{@link GL15C#GL_STATIC_DRAW STATIC_DRAW}{@link GL15C#GL_STATIC_READ STATIC_READ}{@link GL15C#GL_STATIC_COPY STATIC_COPY}{@link GL15C#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15C#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15C#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") ByteBuffer data, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, data, usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15C#GL_STREAM_DRAW STREAM_DRAW}{@link GL15C#GL_STREAM_READ STREAM_READ}{@link GL15C#GL_STREAM_COPY STREAM_COPY}{@link GL15C#GL_STATIC_DRAW STATIC_DRAW}{@link GL15C#GL_STATIC_READ STATIC_READ}{@link GL15C#GL_STATIC_COPY STATIC_COPY}{@link GL15C#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15C#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15C#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") ShortBuffer data, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, data, usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15C#GL_STREAM_DRAW STREAM_DRAW}{@link GL15C#GL_STREAM_READ STREAM_READ}{@link GL15C#GL_STREAM_COPY STREAM_COPY}{@link GL15C#GL_STATIC_DRAW STATIC_DRAW}{@link GL15C#GL_STATIC_READ STATIC_READ}{@link GL15C#GL_STATIC_COPY STATIC_COPY}{@link GL15C#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15C#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15C#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") IntBuffer data, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, data, usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15C#GL_STREAM_DRAW STREAM_DRAW}{@link GL15C#GL_STREAM_READ STREAM_READ}{@link GL15C#GL_STREAM_COPY STREAM_COPY}{@link GL15C#GL_STATIC_DRAW STATIC_DRAW}{@link GL15C#GL_STATIC_READ STATIC_READ}{@link GL15C#GL_STATIC_COPY STATIC_COPY}{@link GL15C#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15C#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15C#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") LongBuffer data, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, data, usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15C#GL_STREAM_DRAW STREAM_DRAW}{@link GL15C#GL_STREAM_READ STREAM_READ}{@link GL15C#GL_STREAM_COPY STREAM_COPY}{@link GL15C#GL_STATIC_DRAW STATIC_DRAW}{@link GL15C#GL_STATIC_READ STATIC_READ}{@link GL15C#GL_STATIC_COPY STATIC_COPY}{@link GL15C#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15C#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15C#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") FloatBuffer data, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, data, usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15C#GL_STREAM_DRAW STREAM_DRAW}{@link GL15C#GL_STREAM_READ STREAM_READ}{@link GL15C#GL_STREAM_COPY STREAM_COPY}{@link GL15C#GL_STATIC_DRAW STATIC_DRAW}{@link GL15C#GL_STATIC_READ STATIC_READ}{@link GL15C#GL_STATIC_COPY STATIC_COPY}{@link GL15C#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15C#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15C#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") DoubleBuffer data, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, data, usage); + } + + // --- [ glBufferSubData ] --- + + /** + * Unsafe version of: {@link #glBufferSubData BufferSubData} + * + * @param size the size in bytes of the data store region being replaced + */ + public static void nglBufferSubData(int target, long offset, long size, long data) { + GL15C.nglBufferSubData(target, offset, size, data); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") ByteBuffer data) { + GL15C.glBufferSubData(target, offset, data); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") ShortBuffer data) { + GL15C.glBufferSubData(target, offset, data); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") IntBuffer data) { + GL15C.glBufferSubData(target, offset, data); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") LongBuffer data) { + GL15C.glBufferSubData(target, offset, data); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") FloatBuffer data) { + GL15C.glBufferSubData(target, offset, data); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") DoubleBuffer data) { + GL15C.glBufferSubData(target, offset, data); + } + + // --- [ glGetBufferSubData ] --- + + /** + * Unsafe version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @param size the size in bytes of the data store region being returned + */ + public static void nglGetBufferSubData(int target, long offset, long size, long data) { + GL15C.nglGetBufferSubData(target, offset, size, data); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") ByteBuffer data) { + GL15C.glGetBufferSubData(target, offset, data); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") ShortBuffer data) { + GL15C.glGetBufferSubData(target, offset, data); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") IntBuffer data) { + GL15C.glGetBufferSubData(target, offset, data); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") LongBuffer data) { + GL15C.glGetBufferSubData(target, offset, data); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") FloatBuffer data) { + GL15C.glGetBufferSubData(target, offset, data); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") DoubleBuffer data) { + GL15C.glGetBufferSubData(target, offset, data); + } + + // --- [ glMapBuffer ] --- + + /** Unsafe version of: {@link #glMapBuffer MapBuffer} */ + public static long nglMapBuffer(int target, int access) { + return GL15C.nglMapBuffer(target, access); + } + + /** + * Maps a buffer object's data store. + * + *

    LWJGL note: This method comes in 3 flavors:

    + * + *
      + *
    1. {@link #glMapBuffer(int, int)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and a new ByteBuffer instance is always returned.
    2. + *
    3. {@link #glMapBuffer(int, int, ByteBuffer)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and the {@code old_buffer} parameter is reused if not null.
    4. + *
    5. {@link #glMapBuffer(int, int, long, ByteBuffer)} - The buffer size is explicitly specified and the {@code old_buffer} parameter is reused if not null. This is the most efficient method.
    6. + *
    + * + * @param target the target buffer object being mapped. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15C#GL_READ_ONLY READ_ONLY}{@link GL15C#GL_WRITE_ONLY WRITE_ONLY}{@link GL15C#GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBuffer(@NativeType("GLenum") int target, @NativeType("GLenum") int access) { + return GL15C.glMapBuffer(target, access); + } + + /** + * Maps a buffer object's data store. + * + *

    LWJGL note: This method comes in 3 flavors:

    + * + *
      + *
    1. {@link #glMapBuffer(int, int)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and a new ByteBuffer instance is always returned.
    2. + *
    3. {@link #glMapBuffer(int, int, ByteBuffer)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and the {@code old_buffer} parameter is reused if not null.
    4. + *
    5. {@link #glMapBuffer(int, int, long, ByteBuffer)} - The buffer size is explicitly specified and the {@code old_buffer} parameter is reused if not null. This is the most efficient method.
    6. + *
    + * + * @param target the target buffer object being mapped. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15C#GL_READ_ONLY READ_ONLY}{@link GL15C#GL_WRITE_ONLY WRITE_ONLY}{@link GL15C#GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBuffer(@NativeType("GLenum") int target, @NativeType("GLenum") int access, @Nullable ByteBuffer old_buffer) { + return GL15C.glMapBuffer(target, access, old_buffer); + } + + /** + * Maps a buffer object's data store. + * + *

    LWJGL note: This method comes in 3 flavors:

    + * + *
      + *
    1. {@link #glMapBuffer(int, int)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and a new ByteBuffer instance is always returned.
    2. + *
    3. {@link #glMapBuffer(int, int, ByteBuffer)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and the {@code old_buffer} parameter is reused if not null.
    4. + *
    5. {@link #glMapBuffer(int, int, long, ByteBuffer)} - The buffer size is explicitly specified and the {@code old_buffer} parameter is reused if not null. This is the most efficient method.
    6. + *
    + * + * @param target the target buffer object being mapped. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15C#GL_READ_ONLY READ_ONLY}{@link GL15C#GL_WRITE_ONLY WRITE_ONLY}{@link GL15C#GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBuffer(@NativeType("GLenum") int target, @NativeType("GLenum") int access, long length, @Nullable ByteBuffer old_buffer) { + return GL15C.glMapBuffer(target, access, length, old_buffer); + } + + // --- [ glUnmapBuffer ] --- + + /** + * Relinquishes the mapping of a buffer object and invalidates the pointer to its data store. + * + *

    Returns TRUE unless data values in the buffer’s data store have become corrupted during the period that the buffer was mapped. Such corruption can be + * the result of a screen resolution change or other window system-dependent event that causes system heaps such as those for high-performance graphics + * memory to be discarded. GL implementations must guarantee that such corruption can occur only during the periods that a buffer’s data store is mapped. + * If such corruption has occurred, UnmapBuffer returns FALSE, and the contents of the buffer’s data store become undefined.

    + * + * @param target the target buffer object being unmapped. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glUnmapBuffer(@NativeType("GLenum") int target) { + return GL15C.glUnmapBuffer(target); + } + + // --- [ glGetBufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetBufferParameteriv GetBufferParameteriv} */ + public static void nglGetBufferParameteriv(int target, int pname, long params) { + GL15C.nglGetBufferParameteriv(target, pname, params); + } + + /** + * Returns the value of a buffer object parameter. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15C#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15C#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15C#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * @param params the requested parameter + * + * @see Reference Page + */ + public static void glGetBufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL15C.glGetBufferParameteriv(target, pname, params); + } + + /** + * Returns the value of a buffer object parameter. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15C#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15C#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15C#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetBufferParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL15C.glGetBufferParameteri(target, pname); + } + + // --- [ glGetBufferPointerv ] --- + + /** Unsafe version of: {@link #glGetBufferPointerv GetBufferPointerv} */ + public static void nglGetBufferPointerv(int target, int pname, long params) { + GL15C.nglGetBufferPointerv(target, pname, params); + } + + /** + * Returns the pointer to a mapped buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the pointer to be returned. Must be:
    {@link GL15C#GL_BUFFER_MAP_POINTER BUFFER_MAP_POINTER}
    + * @param params the pointer value specified by {@code pname} + * + * @see Reference Page + */ + public static void glGetBufferPointerv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer params) { + GL15C.glGetBufferPointerv(target, pname, params); + } + + /** + * Returns the pointer to a mapped buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link GL15C#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15C#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the pointer to be returned. Must be:
    {@link GL15C#GL_BUFFER_MAP_POINTER BUFFER_MAP_POINTER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetBufferPointer(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL15C.glGetBufferPointer(target, pname); + } + + // --- [ glGenQueries ] --- + + /** + * Unsafe version of: {@link #glGenQueries GenQueries} + * + * @param n the number of query object names to be generated + */ + public static void nglGenQueries(int n, long ids) { + GL15C.nglGenQueries(n, ids); + } + + /** + * Generates query object names. + * + * @param ids a buffer in which the generated query object names are stored + * + * @see Reference Page + */ + public static void glGenQueries(@NativeType("GLuint *") IntBuffer ids) { + GL15C.glGenQueries(ids); + } + + /** + * Generates query object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenQueries() { + return GL15C.glGenQueries(); + } + + // --- [ glDeleteQueries ] --- + + /** + * Unsafe version of: {@link #glDeleteQueries DeleteQueries} + * + * @param n the number of query objects to be deleted + */ + public static void nglDeleteQueries(int n, long ids) { + GL15C.nglDeleteQueries(n, ids); + } + + /** + * Deletes named query objects. + * + * @param ids an array of query objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteQueries(@NativeType("GLuint const *") IntBuffer ids) { + GL15C.glDeleteQueries(ids); + } + + /** + * Deletes named query objects. + * + * @see Reference Page + */ + public static void glDeleteQueries(@NativeType("GLuint const *") int id) { + GL15C.glDeleteQueries(id); + } + + // --- [ glIsQuery ] --- + + /** + * Determine if a name corresponds to a query object. + * + * @param id a value that may be the name of a query object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsQuery(@NativeType("GLuint") int id) { + return GL15C.glIsQuery(id); + } + + // --- [ glBeginQuery ] --- + + /** + * Creates a query object and makes it active. + * + * @param target the target type of query object established. One of:
    {@link GL15C#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param id the name of a query object + * + * @see Reference Page + */ + public static void glBeginQuery(@NativeType("GLenum") int target, @NativeType("GLuint") int id) { + GL15C.glBeginQuery(target, id); + } + + // --- [ glEndQuery ] --- + + /** + * Marks the end of the sequence of commands to be tracked for the active query specified by {@code target}. + * + * @param target the query object target. One of:
    {@link GL15C#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * + * @see Reference Page + */ + public static void glEndQuery(@NativeType("GLenum") int target) { + GL15C.glEndQuery(target); + } + + // --- [ glGetQueryiv ] --- + + /** Unsafe version of: {@link #glGetQueryiv GetQueryiv} */ + public static void nglGetQueryiv(int target, int pname, long params) { + GL15C.nglGetQueryiv(target, pname, params); + } + + /** + * Returns parameters of a query object target. + * + * @param target the query object target. One of:
    {@link GL15C#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param pname the symbolic name of a query object target parameter. One of:
    {@link GL15C#GL_QUERY_COUNTER_BITS QUERY_COUNTER_BITS}{@link GL15C#GL_CURRENT_QUERY CURRENT_QUERY}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL15C.glGetQueryiv(target, pname, params); + } + + /** + * Returns parameters of a query object target. + * + * @param target the query object target. One of:
    {@link GL15C#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param pname the symbolic name of a query object target parameter. One of:
    {@link GL15C#GL_QUERY_COUNTER_BITS QUERY_COUNTER_BITS}{@link GL15C#GL_CURRENT_QUERY CURRENT_QUERY}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetQueryi(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL15C.glGetQueryi(target, pname); + } + + // --- [ glGetQueryObjectiv ] --- + + /** Unsafe version of: {@link #glGetQueryObjectiv GetQueryObjectiv} */ + public static void nglGetQueryObjectiv(int id, int pname, long params) { + GL15C.nglGetQueryObjectiv(id, pname, params); + } + + /** + * Returns the integer value of a query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15C#GL_QUERY_RESULT QUERY_RESULT}{@link GL15C#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL15C.glGetQueryObjectiv(id, pname, params); + } + + /** + * Returns the integer value of a query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15C#GL_QUERY_RESULT QUERY_RESULT}{@link GL15C#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint *") long params) { + GL15C.glGetQueryObjectiv(id, pname, params); + } + + /** + * Returns the integer value of a query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15C#GL_QUERY_RESULT QUERY_RESULT}{@link GL15C#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetQueryObjecti(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + return GL15C.glGetQueryObjecti(id, pname); + } + + // --- [ glGetQueryObjectuiv ] --- + + /** Unsafe version of: {@link #glGetQueryObjectuiv GetQueryObjectuiv} */ + public static void nglGetQueryObjectuiv(int id, int pname, long params) { + GL15C.nglGetQueryObjectuiv(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjectiv GetQueryObjectiv}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15C#GL_QUERY_RESULT QUERY_RESULT}{@link GL15C#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectuiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + GL15C.glGetQueryObjectuiv(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjectiv GetQueryObjectiv}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15C#GL_QUERY_RESULT QUERY_RESULT}{@link GL15C#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectuiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint *") long params) { + GL15C.glGetQueryObjectuiv(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjectiv GetQueryObjectiv}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15C#GL_QUERY_RESULT QUERY_RESULT}{@link GL15C#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetQueryObjectui(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + return GL15C.glGetQueryObjectui(id, pname); + } + + /** + * Array version of: {@link #glDeleteBuffers DeleteBuffers} + * + * @see Reference Page + */ + public static void glDeleteBuffers(@NativeType("GLuint const *") int[] buffers) { + GL15C.glDeleteBuffers(buffers); + } + + /** + * Array version of: {@link #glGenBuffers GenBuffers} + * + * @see Reference Page + */ + public static void glGenBuffers(@NativeType("GLuint *") int[] buffers) { + GL15C.glGenBuffers(buffers); + } + + /** + * Array version of: {@link #glBufferData BufferData} + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") short[] data, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, data, usage); + } + + /** + * Array version of: {@link #glBufferData BufferData} + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") int[] data, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, data, usage); + } + + /** + * Array version of: {@link #glBufferData BufferData} + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") long[] data, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, data, usage); + } + + /** + * Array version of: {@link #glBufferData BufferData} + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") float[] data, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, data, usage); + } + + /** + * Array version of: {@link #glBufferData BufferData} + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") double[] data, @NativeType("GLenum") int usage) { + GL15C.glBufferData(target, data, usage); + } + + /** + * Array version of: {@link #glBufferSubData BufferSubData} + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") short[] data) { + GL15C.glBufferSubData(target, offset, data); + } + + /** + * Array version of: {@link #glBufferSubData BufferSubData} + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") int[] data) { + GL15C.glBufferSubData(target, offset, data); + } + + /** + * Array version of: {@link #glBufferSubData BufferSubData} + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") long[] data) { + GL15C.glBufferSubData(target, offset, data); + } + + /** + * Array version of: {@link #glBufferSubData BufferSubData} + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") float[] data) { + GL15C.glBufferSubData(target, offset, data); + } + + /** + * Array version of: {@link #glBufferSubData BufferSubData} + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") double[] data) { + GL15C.glBufferSubData(target, offset, data); + } + + /** + * Array version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") short[] data) { + GL15C.glGetBufferSubData(target, offset, data); + } + + /** + * Array version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") int[] data) { + GL15C.glGetBufferSubData(target, offset, data); + } + + /** + * Array version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") long[] data) { + GL15C.glGetBufferSubData(target, offset, data); + } + + /** + * Array version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") float[] data) { + GL15C.glGetBufferSubData(target, offset, data); + } + + /** + * Array version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") double[] data) { + GL15C.glGetBufferSubData(target, offset, data); + } + + /** + * Array version of: {@link #glGetBufferParameteriv GetBufferParameteriv} + * + * @see Reference Page + */ + public static void glGetBufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL15C.glGetBufferParameteriv(target, pname, params); + } + + /** + * Array version of: {@link #glGenQueries GenQueries} + * + * @see Reference Page + */ + public static void glGenQueries(@NativeType("GLuint *") int[] ids) { + GL15C.glGenQueries(ids); + } + + /** + * Array version of: {@link #glDeleteQueries DeleteQueries} + * + * @see Reference Page + */ + public static void glDeleteQueries(@NativeType("GLuint const *") int[] ids) { + GL15C.glDeleteQueries(ids); + } + + /** + * Array version of: {@link #glGetQueryiv GetQueryiv} + * + * @see Reference Page + */ + public static void glGetQueryiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL15C.glGetQueryiv(target, pname, params); + } + + /** + * Array version of: {@link #glGetQueryObjectiv GetQueryObjectiv} + * + * @see Reference Page + */ + public static void glGetQueryObjectiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL15C.glGetQueryObjectiv(id, pname, params); + } + + /** + * Array version of: {@link #glGetQueryObjectuiv GetQueryObjectuiv} + * + * @see Reference Page + */ + public static void glGetQueryObjectuiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + GL15C.glGetQueryObjectuiv(id, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL15C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL15C.java new file mode 100644 index 000000000..38ff1096e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL15C.java @@ -0,0 +1,1337 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality of a forward compatible context, up to version 1.5. + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL15C extends GL14C { + + static { GL.initialize(); } + + /** New token names. */ + public static final int GL_SRC1_ALPHA = 0x8589; + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, and GetBufferPointerv. + */ + public static final int + GL_ARRAY_BUFFER = 0x8892, + GL_ELEMENT_ARRAY_BUFFER = 0x8893; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_ARRAY_BUFFER_BINDING = 0x8894, + GL_ELEMENT_ARRAY_BUFFER_BINDING = 0x8895; + + /** Accepted by the {@code pname} parameter of GetVertexAttribiv. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F; + + /** Accepted by the {@code usage} parameter of BufferData. */ + public static final int + GL_STREAM_DRAW = 0x88E0, + GL_STREAM_READ = 0x88E1, + GL_STREAM_COPY = 0x88E2, + GL_STATIC_DRAW = 0x88E4, + GL_STATIC_READ = 0x88E5, + GL_STATIC_COPY = 0x88E6, + GL_DYNAMIC_DRAW = 0x88E8, + GL_DYNAMIC_READ = 0x88E9, + GL_DYNAMIC_COPY = 0x88EA; + + /** Accepted by the {@code access} parameter of MapBuffer. */ + public static final int + GL_READ_ONLY = 0x88B8, + GL_WRITE_ONLY = 0x88B9, + GL_READ_WRITE = 0x88BA; + + /** Accepted by the {@code pname} parameter of GetBufferParameteriv. */ + public static final int + GL_BUFFER_SIZE = 0x8764, + GL_BUFFER_USAGE = 0x8765, + GL_BUFFER_ACCESS = 0x88BB, + GL_BUFFER_MAPPED = 0x88BC; + + /** Accepted by the {@code pname} parameter of GetBufferPointerv. */ + public static final int GL_BUFFER_MAP_POINTER = 0x88BD; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int GL_SAMPLES_PASSED = 0x8914; + + /** Accepted by the {@code pname} parameter of GetQueryiv. */ + public static final int + GL_QUERY_COUNTER_BITS = 0x8864, + GL_CURRENT_QUERY = 0x8865; + + /** Accepted by the {@code pname} parameter of GetQueryObjectiv and GetQueryObjectuiv. */ + public static final int + GL_QUERY_RESULT = 0x8866, + GL_QUERY_RESULT_AVAILABLE = 0x8867; + + protected GL15C() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindBuffer ] --- + + /** + * Binds a named buffer object. + * + * @param target the target to which the buffer object is bound. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param buffer the name of a buffer object + * + * @see Reference Page + */ + public static native void glBindBuffer(@NativeType("GLenum") int target, @NativeType("GLuint") int buffer); + + // --- [ glDeleteBuffers ] --- + + /** + * Unsafe version of: {@link #glDeleteBuffers DeleteBuffers} + * + * @param n the number of buffer objects to be deleted + */ + public static native void nglDeleteBuffers(int n, long buffers); + + /** + * Deletes named buffer objects. + * + * @param buffers an array of buffer objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteBuffers(@NativeType("GLuint const *") IntBuffer buffers) { + nglDeleteBuffers(buffers.remaining(), memAddress(buffers)); + } + + /** + * Deletes named buffer objects. + * + * @see Reference Page + */ + public static void glDeleteBuffers(@NativeType("GLuint const *") int buffer) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer buffers = stack.ints(buffer); + nglDeleteBuffers(1, memAddress(buffers)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenBuffers ] --- + + /** + * Unsafe version of: {@link #glGenBuffers GenBuffers} + * + * @param n the number of buffer object names to be generated + */ + public static native void nglGenBuffers(int n, long buffers); + + /** + * Generates buffer object names. + * + * @param buffers a buffer in which the generated buffer object names are stored + * + * @see Reference Page + */ + public static void glGenBuffers(@NativeType("GLuint *") IntBuffer buffers) { + nglGenBuffers(buffers.remaining(), memAddress(buffers)); + } + + /** + * Generates buffer object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenBuffers() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer buffers = stack.callocInt(1); + nglGenBuffers(1, memAddress(buffers)); + return buffers.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsBuffer ] --- + + /** + * Determines if a name corresponds to a buffer object. + * + * @param buffer a value that may be the name of a buffer object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsBuffer(@NativeType("GLuint") int buffer); + + // --- [ glBufferData ] --- + + /** + * Unsafe version of: {@link #glBufferData BufferData} + * + * @param size the size in bytes of the buffer object's new data store + */ + public static native void nglBufferData(int target, long size, long data, int usage); + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param size the size in bytes of the buffer object's new data store + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW STREAM_DRAW}{@link #GL_STREAM_READ STREAM_READ}{@link #GL_STREAM_COPY STREAM_COPY}{@link #GL_STATIC_DRAW STATIC_DRAW}{@link #GL_STATIC_READ STATIC_READ}{@link #GL_STATIC_COPY STATIC_COPY}{@link #GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link #GL_DYNAMIC_READ DYNAMIC_READ}{@link #GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int usage) { + nglBufferData(target, size, NULL, usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW STREAM_DRAW}{@link #GL_STREAM_READ STREAM_READ}{@link #GL_STREAM_COPY STREAM_COPY}{@link #GL_STATIC_DRAW STATIC_DRAW}{@link #GL_STATIC_READ STATIC_READ}{@link #GL_STATIC_COPY STATIC_COPY}{@link #GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link #GL_DYNAMIC_READ DYNAMIC_READ}{@link #GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") ByteBuffer data, @NativeType("GLenum") int usage) { + nglBufferData(target, data.remaining(), memAddress(data), usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW STREAM_DRAW}{@link #GL_STREAM_READ STREAM_READ}{@link #GL_STREAM_COPY STREAM_COPY}{@link #GL_STATIC_DRAW STATIC_DRAW}{@link #GL_STATIC_READ STATIC_READ}{@link #GL_STATIC_COPY STATIC_COPY}{@link #GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link #GL_DYNAMIC_READ DYNAMIC_READ}{@link #GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") ShortBuffer data, @NativeType("GLenum") int usage) { + nglBufferData(target, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data), usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW STREAM_DRAW}{@link #GL_STREAM_READ STREAM_READ}{@link #GL_STREAM_COPY STREAM_COPY}{@link #GL_STATIC_DRAW STATIC_DRAW}{@link #GL_STATIC_READ STATIC_READ}{@link #GL_STATIC_COPY STATIC_COPY}{@link #GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link #GL_DYNAMIC_READ DYNAMIC_READ}{@link #GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") IntBuffer data, @NativeType("GLenum") int usage) { + nglBufferData(target, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW STREAM_DRAW}{@link #GL_STREAM_READ STREAM_READ}{@link #GL_STREAM_COPY STREAM_COPY}{@link #GL_STATIC_DRAW STATIC_DRAW}{@link #GL_STATIC_READ STATIC_READ}{@link #GL_STATIC_COPY STATIC_COPY}{@link #GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link #GL_DYNAMIC_READ DYNAMIC_READ}{@link #GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") LongBuffer data, @NativeType("GLenum") int usage) { + nglBufferData(target, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data), usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW STREAM_DRAW}{@link #GL_STREAM_READ STREAM_READ}{@link #GL_STREAM_COPY STREAM_COPY}{@link #GL_STATIC_DRAW STATIC_DRAW}{@link #GL_STATIC_READ STATIC_READ}{@link #GL_STATIC_COPY STATIC_COPY}{@link #GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link #GL_DYNAMIC_READ DYNAMIC_READ}{@link #GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") FloatBuffer data, @NativeType("GLenum") int usage) { + nglBufferData(target, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), usage); + } + + /** + * Creates and initializes a buffer object's data store. + * + *

    {@code usage} is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make + * more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. + * {@code usage} can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The + * frequency of access may be one of these:

    + * + *
      + *
    • STREAM - The data store contents will be modified once and used at most a few times.
    • + *
    • STATIC - The data store contents will be modified once and used many times.
    • + *
    • DYNAMIC - The data store contents will be modified repeatedly and used many times.
    • + *
    + * + *

    The nature of access may be one of these:

    + * + *
      + *
    • DRAW - The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
    • + *
    • READ - The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
    • + *
    • COPY - The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
    • + *
    + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link #GL_STREAM_DRAW STREAM_DRAW}{@link #GL_STREAM_READ STREAM_READ}{@link #GL_STREAM_COPY STREAM_COPY}{@link #GL_STATIC_DRAW STATIC_DRAW}{@link #GL_STATIC_READ STATIC_READ}{@link #GL_STATIC_COPY STATIC_COPY}{@link #GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link #GL_DYNAMIC_READ DYNAMIC_READ}{@link #GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") DoubleBuffer data, @NativeType("GLenum") int usage) { + nglBufferData(target, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data), usage); + } + + // --- [ glBufferSubData ] --- + + /** + * Unsafe version of: {@link #glBufferSubData BufferSubData} + * + * @param size the size in bytes of the data store region being replaced + */ + public static native void nglBufferSubData(int target, long offset, long size, long data); + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") ByteBuffer data) { + nglBufferSubData(target, offset, data.remaining(), memAddress(data)); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") ShortBuffer data) { + nglBufferSubData(target, offset, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data)); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") IntBuffer data) { + nglBufferSubData(target, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") LongBuffer data) { + nglBufferSubData(target, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") FloatBuffer data) { + nglBufferSubData(target, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * Updates a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") DoubleBuffer data) { + nglBufferSubData(target, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + // --- [ glGetBufferSubData ] --- + + /** + * Unsafe version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @param size the size in bytes of the data store region being returned + */ + public static native void nglGetBufferSubData(int target, long offset, long size, long data); + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") ByteBuffer data) { + nglGetBufferSubData(target, offset, data.remaining(), memAddress(data)); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") ShortBuffer data) { + nglGetBufferSubData(target, offset, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data)); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") IntBuffer data) { + nglGetBufferSubData(target, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") LongBuffer data) { + nglGetBufferSubData(target, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") FloatBuffer data) { + nglGetBufferSubData(target, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * Returns a subset of a buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") DoubleBuffer data) { + nglGetBufferSubData(target, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + // --- [ glMapBuffer ] --- + + /** Unsafe version of: {@link #glMapBuffer MapBuffer} */ + public static native long nglMapBuffer(int target, int access); + + /** + * Maps a buffer object's data store. + * + *

    LWJGL note: This method comes in 3 flavors:

    + * + *
      + *
    1. {@link #glMapBuffer(int, int)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and a new ByteBuffer instance is always returned.
    2. + *
    3. {@link #glMapBuffer(int, int, ByteBuffer)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and the {@code old_buffer} parameter is reused if not null.
    4. + *
    5. {@link #glMapBuffer(int, int, long, ByteBuffer)} - The buffer size is explicitly specified and the {@code old_buffer} parameter is reused if not null. This is the most efficient method.
    6. + *
    + * + * @param target the target buffer object being mapped. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link #GL_READ_ONLY READ_ONLY}{@link #GL_WRITE_ONLY WRITE_ONLY}{@link #GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBuffer(@NativeType("GLenum") int target, @NativeType("GLenum") int access) { + long __result = nglMapBuffer(target, access); + return memByteBufferSafe(__result, glGetBufferParameteri(target, GL_BUFFER_SIZE)); + } + + /** + * Maps a buffer object's data store. + * + *

    LWJGL note: This method comes in 3 flavors:

    + * + *
      + *
    1. {@link #glMapBuffer(int, int)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and a new ByteBuffer instance is always returned.
    2. + *
    3. {@link #glMapBuffer(int, int, ByteBuffer)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and the {@code old_buffer} parameter is reused if not null.
    4. + *
    5. {@link #glMapBuffer(int, int, long, ByteBuffer)} - The buffer size is explicitly specified and the {@code old_buffer} parameter is reused if not null. This is the most efficient method.
    6. + *
    + * + * @param target the target buffer object being mapped. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link #GL_READ_ONLY READ_ONLY}{@link #GL_WRITE_ONLY WRITE_ONLY}{@link #GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBuffer(@NativeType("GLenum") int target, @NativeType("GLenum") int access, @Nullable ByteBuffer old_buffer) { + long __result = nglMapBuffer(target, access); + int length = glGetBufferParameteri(target, GL_BUFFER_SIZE); + return apiGetMappedBuffer(old_buffer, __result, length); + } + + /** + * Maps a buffer object's data store. + * + *

    LWJGL note: This method comes in 3 flavors:

    + * + *
      + *
    1. {@link #glMapBuffer(int, int)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and a new ByteBuffer instance is always returned.
    2. + *
    3. {@link #glMapBuffer(int, int, ByteBuffer)} - Calls {@link #glGetBufferParameteriv GetBufferParameteriv} to retrieve the buffer size and the {@code old_buffer} parameter is reused if not null.
    4. + *
    5. {@link #glMapBuffer(int, int, long, ByteBuffer)} - The buffer size is explicitly specified and the {@code old_buffer} parameter is reused if not null. This is the most efficient method.
    6. + *
    + * + * @param target the target buffer object being mapped. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link #GL_READ_ONLY READ_ONLY}{@link #GL_WRITE_ONLY WRITE_ONLY}{@link #GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBuffer(@NativeType("GLenum") int target, @NativeType("GLenum") int access, long length, @Nullable ByteBuffer old_buffer) { + long __result = nglMapBuffer(target, access); + return apiGetMappedBuffer(old_buffer, __result, (int)length); + } + + // --- [ glUnmapBuffer ] --- + + /** + * Relinquishes the mapping of a buffer object and invalidates the pointer to its data store. + * + *

    Returns TRUE unless data values in the buffer’s data store have become corrupted during the period that the buffer was mapped. Such corruption can be + * the result of a screen resolution change or other window system-dependent event that causes system heaps such as those for high-performance graphics + * memory to be discarded. GL implementations must guarantee that such corruption can occur only during the periods that a buffer’s data store is mapped. + * If such corruption has occurred, UnmapBuffer returns FALSE, and the contents of the buffer’s data store become undefined.

    + * + * @param target the target buffer object being unmapped. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glUnmapBuffer(@NativeType("GLenum") int target); + + // --- [ glGetBufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetBufferParameteriv GetBufferParameteriv} */ + public static native void nglGetBufferParameteriv(int target, int pname, long params); + + /** + * Returns the value of a buffer object parameter. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link #GL_BUFFER_USAGE BUFFER_USAGE}{@link #GL_BUFFER_ACCESS BUFFER_ACCESS}{@link #GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * @param params the requested parameter + * + * @see Reference Page + */ + public static void glGetBufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetBufferParameteriv(target, pname, memAddress(params)); + } + + /** + * Returns the value of a buffer object parameter. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link #GL_BUFFER_USAGE BUFFER_USAGE}{@link #GL_BUFFER_ACCESS BUFFER_ACCESS}{@link #GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetBufferParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetBufferParameteriv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetBufferPointerv ] --- + + /** Unsafe version of: {@link #glGetBufferPointerv GetBufferPointerv} */ + public static native void nglGetBufferPointerv(int target, int pname, long params); + + /** + * Returns the pointer to a mapped buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the pointer to be returned. Must be:
    {@link #GL_BUFFER_MAP_POINTER BUFFER_MAP_POINTER}
    + * @param params the pointer value specified by {@code pname} + * + * @see Reference Page + */ + public static void glGetBufferPointerv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetBufferPointerv(target, pname, memAddress(params)); + } + + /** + * Returns the pointer to a mapped buffer object's data store. + * + * @param target the target buffer object. One of:
    {@link #GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the pointer to be returned. Must be:
    {@link #GL_BUFFER_MAP_POINTER BUFFER_MAP_POINTER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetBufferPointer(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer params = stack.callocPointer(1); + nglGetBufferPointerv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenQueries ] --- + + /** + * Unsafe version of: {@link #glGenQueries GenQueries} + * + * @param n the number of query object names to be generated + */ + public static native void nglGenQueries(int n, long ids); + + /** + * Generates query object names. + * + * @param ids a buffer in which the generated query object names are stored + * + * @see Reference Page + */ + public static void glGenQueries(@NativeType("GLuint *") IntBuffer ids) { + nglGenQueries(ids.remaining(), memAddress(ids)); + } + + /** + * Generates query object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenQueries() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.callocInt(1); + nglGenQueries(1, memAddress(ids)); + return ids.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDeleteQueries ] --- + + /** + * Unsafe version of: {@link #glDeleteQueries DeleteQueries} + * + * @param n the number of query objects to be deleted + */ + public static native void nglDeleteQueries(int n, long ids); + + /** + * Deletes named query objects. + * + * @param ids an array of query objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteQueries(@NativeType("GLuint const *") IntBuffer ids) { + nglDeleteQueries(ids.remaining(), memAddress(ids)); + } + + /** + * Deletes named query objects. + * + * @see Reference Page + */ + public static void glDeleteQueries(@NativeType("GLuint const *") int id) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.ints(id); + nglDeleteQueries(1, memAddress(ids)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsQuery ] --- + + /** + * Determine if a name corresponds to a query object. + * + * @param id a value that may be the name of a query object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsQuery(@NativeType("GLuint") int id); + + // --- [ glBeginQuery ] --- + + /** + * Creates a query object and makes it active. + * + * @param target the target type of query object established. One of:
    {@link #GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param id the name of a query object + * + * @see Reference Page + */ + public static native void glBeginQuery(@NativeType("GLenum") int target, @NativeType("GLuint") int id); + + // --- [ glEndQuery ] --- + + /** + * Marks the end of the sequence of commands to be tracked for the active query specified by {@code target}. + * + * @param target the query object target. One of:
    {@link #GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * + * @see Reference Page + */ + public static native void glEndQuery(@NativeType("GLenum") int target); + + // --- [ glGetQueryiv ] --- + + /** Unsafe version of: {@link #glGetQueryiv GetQueryiv} */ + public static native void nglGetQueryiv(int target, int pname, long params); + + /** + * Returns parameters of a query object target. + * + * @param target the query object target. One of:
    {@link #GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param pname the symbolic name of a query object target parameter. One of:
    {@link #GL_QUERY_COUNTER_BITS QUERY_COUNTER_BITS}{@link #GL_CURRENT_QUERY CURRENT_QUERY}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetQueryiv(target, pname, memAddress(params)); + } + + /** + * Returns parameters of a query object target. + * + * @param target the query object target. One of:
    {@link #GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param pname the symbolic name of a query object target parameter. One of:
    {@link #GL_QUERY_COUNTER_BITS QUERY_COUNTER_BITS}{@link #GL_CURRENT_QUERY CURRENT_QUERY}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetQueryi(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetQueryiv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetQueryObjectiv ] --- + + /** Unsafe version of: {@link #glGetQueryObjectiv GetQueryObjectiv} */ + public static native void nglGetQueryObjectiv(int id, int pname, long params); + + /** + * Returns the integer value of a query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT QUERY_RESULT}{@link #GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetQueryObjectiv(id, pname, memAddress(params)); + } + + /** + * Returns the integer value of a query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT QUERY_RESULT}{@link #GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint *") long params) { + nglGetQueryObjectiv(id, pname, params); + } + + /** + * Returns the integer value of a query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT QUERY_RESULT}{@link #GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetQueryObjecti(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetQueryObjectiv(id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetQueryObjectuiv ] --- + + /** Unsafe version of: {@link #glGetQueryObjectuiv GetQueryObjectuiv} */ + public static native void nglGetQueryObjectuiv(int id, int pname, long params); + + /** + * Unsigned version of {@link #glGetQueryObjectiv GetQueryObjectiv}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT QUERY_RESULT}{@link #GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectuiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetQueryObjectuiv(id, pname, memAddress(params)); + } + + /** + * Unsigned version of {@link #glGetQueryObjectiv GetQueryObjectiv}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT QUERY_RESULT}{@link #GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectuiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint *") long params) { + nglGetQueryObjectuiv(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjectiv GetQueryObjectiv}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link #GL_QUERY_RESULT QUERY_RESULT}{@link #GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetQueryObjectui(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetQueryObjectuiv(id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Array version of: {@link #glDeleteBuffers DeleteBuffers} + * + * @see Reference Page + */ + public static void glDeleteBuffers(@NativeType("GLuint const *") int[] buffers) { + long __functionAddress = GL.getICD().glDeleteBuffers; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffers.length, buffers, __functionAddress); + } + + /** + * Array version of: {@link #glGenBuffers GenBuffers} + * + * @see Reference Page + */ + public static void glGenBuffers(@NativeType("GLuint *") int[] buffers) { + long __functionAddress = GL.getICD().glGenBuffers; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffers.length, buffers, __functionAddress); + } + + /** + * Array version of: {@link #glBufferData BufferData} + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") short[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 1, data, usage, __functionAddress); + } + + /** + * Array version of: {@link #glBufferData BufferData} + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") int[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 2, data, usage, __functionAddress); + } + + /** + * Array version of: {@link #glBufferData BufferData} + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") long[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 3, data, usage, __functionAddress); + } + + /** + * Array version of: {@link #glBufferData BufferData} + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") float[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 2, data, usage, __functionAddress); + } + + /** + * Array version of: {@link #glBufferData BufferData} + * + * @see Reference Page + */ + public static void glBufferData(@NativeType("GLenum") int target, @NativeType("void const *") double[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 3, data, usage, __functionAddress); + } + + /** + * Array version of: {@link #glBufferSubData BufferSubData} + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 1, data, __functionAddress); + } + + /** + * Array version of: {@link #glBufferSubData BufferSubData} + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** + * Array version of: {@link #glBufferSubData BufferSubData} + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") long[] data) { + long __functionAddress = GL.getICD().glBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** + * Array version of: {@link #glBufferSubData BufferSubData} + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** + * Array version of: {@link #glBufferSubData BufferSubData} + * + * @see Reference Page + */ + public static void glBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void const *") double[] data) { + long __functionAddress = GL.getICD().glBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") short[] data) { + long __functionAddress = GL.getICD().glGetBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 1, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") int[] data) { + long __functionAddress = GL.getICD().glGetBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") long[] data) { + long __functionAddress = GL.getICD().glGetBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") float[] data) { + long __functionAddress = GL.getICD().glGetBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetBufferSubData GetBufferSubData} + * + * @see Reference Page + */ + public static void glGetBufferSubData(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("void *") double[] data) { + long __functionAddress = GL.getICD().glGetBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetBufferParameteriv GetBufferParameteriv} + * + * @see Reference Page + */ + public static void glGetBufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetBufferParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGenQueries GenQueries} + * + * @see Reference Page + */ + public static void glGenQueries(@NativeType("GLuint *") int[] ids) { + long __functionAddress = GL.getICD().glGenQueries; + if (CHECKS) { + check(__functionAddress); + } + callPV(ids.length, ids, __functionAddress); + } + + /** + * Array version of: {@link #glDeleteQueries DeleteQueries} + * + * @see Reference Page + */ + public static void glDeleteQueries(@NativeType("GLuint const *") int[] ids) { + long __functionAddress = GL.getICD().glDeleteQueries; + if (CHECKS) { + check(__functionAddress); + } + callPV(ids.length, ids, __functionAddress); + } + + /** + * Array version of: {@link #glGetQueryiv GetQueryiv} + * + * @see Reference Page + */ + public static void glGetQueryiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetQueryiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetQueryObjectiv GetQueryObjectiv} + * + * @see Reference Page + */ + public static void glGetQueryObjectiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetQueryObjectiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(id, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetQueryObjectuiv GetQueryObjectuiv} + * + * @see Reference Page + */ + public static void glGetQueryObjectuiv(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetQueryObjectuiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(id, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL20.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL20.java new file mode 100644 index 000000000..ce1400386 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL20.java @@ -0,0 +1,2810 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; +import org.lwjgl.system.MemoryUtil; + +/** + * The OpenGL functionality up to version 2.0. Includes the deprecated symbols of the Compatibility Profile. + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL20 extends GL15 { + + static { GL.initialize(); } + + /** Accepted by the {@code name} parameter of GetString. */ + public static final int GL_SHADING_LANGUAGE_VERSION = 0x8B8C; + + /** Accepted by the {@code pname} parameter of GetInteger. */ + public static final int GL_CURRENT_PROGRAM = 0x8B8D; + + /** Accepted by the {@code pname} parameter of GetShaderiv. */ + public static final int + GL_SHADER_TYPE = 0x8B4F, + GL_DELETE_STATUS = 0x8B80, + GL_COMPILE_STATUS = 0x8B81, + GL_LINK_STATUS = 0x8B82, + GL_VALIDATE_STATUS = 0x8B83, + GL_INFO_LOG_LENGTH = 0x8B84, + GL_ATTACHED_SHADERS = 0x8B85, + GL_ACTIVE_UNIFORMS = 0x8B86, + GL_ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87, + GL_ACTIVE_ATTRIBUTES = 0x8B89, + GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A, + GL_SHADER_SOURCE_LENGTH = 0x8B88; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_FLOAT_VEC2 = 0x8B50, + GL_FLOAT_VEC3 = 0x8B51, + GL_FLOAT_VEC4 = 0x8B52, + GL_INT_VEC2 = 0x8B53, + GL_INT_VEC3 = 0x8B54, + GL_INT_VEC4 = 0x8B55, + GL_BOOL = 0x8B56, + GL_BOOL_VEC2 = 0x8B57, + GL_BOOL_VEC3 = 0x8B58, + GL_BOOL_VEC4 = 0x8B59, + GL_FLOAT_MAT2 = 0x8B5A, + GL_FLOAT_MAT3 = 0x8B5B, + GL_FLOAT_MAT4 = 0x8B5C, + GL_SAMPLER_1D = 0x8B5D, + GL_SAMPLER_2D = 0x8B5E, + GL_SAMPLER_3D = 0x8B5F, + GL_SAMPLER_CUBE = 0x8B60, + GL_SAMPLER_1D_SHADOW = 0x8B61, + GL_SAMPLER_2D_SHADOW = 0x8B62; + + /** Accepted by the {@code type} argument of CreateShader and returned by the {@code params} parameter of GetShaderiv. */ + public static final int GL_VERTEX_SHADER = 0x8B31; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A, + GL_MAX_VARYING_FLOATS = 0x8B4B, + GL_MAX_VERTEX_ATTRIBS = 0x8869, + GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872, + GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C, + GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D, + GL_MAX_TEXTURE_COORDS = 0x8871; + + /** + * Accepted by the {@code cap} parameter of Disable, Enable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int + GL_VERTEX_PROGRAM_POINT_SIZE = 0x8642, + GL_VERTEX_PROGRAM_TWO_SIDE = 0x8643; + + /** Accepted by the {@code pname} parameter of GetVertexAttrib{dfi}v. */ + public static final int + GL_VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622, + GL_VERTEX_ATTRIB_ARRAY_SIZE = 0x8623, + GL_VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624, + GL_VERTEX_ATTRIB_ARRAY_TYPE = 0x8625, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A, + GL_CURRENT_VERTEX_ATTRIB = 0x8626; + + /** Accepted by the {@code pname} parameter of GetVertexAttribPointerv. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_POINTER = 0x8645; + + /** Accepted by the {@code type} argument of CreateShader and returned by the {@code params} parameter of GetShaderiv. */ + public static final int GL_FRAGMENT_SHADER = 0x8B30; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49; + + /** Accepted by the {@code target} parameter of Hint and the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B; + + /** Accepted by the {@code pname} parameters of GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_DRAW_BUFFERS = 0x8824, + GL_DRAW_BUFFER0 = 0x8825, + GL_DRAW_BUFFER1 = 0x8826, + GL_DRAW_BUFFER2 = 0x8827, + GL_DRAW_BUFFER3 = 0x8828, + GL_DRAW_BUFFER4 = 0x8829, + GL_DRAW_BUFFER5 = 0x882A, + GL_DRAW_BUFFER6 = 0x882B, + GL_DRAW_BUFFER7 = 0x882C, + GL_DRAW_BUFFER8 = 0x882D, + GL_DRAW_BUFFER9 = 0x882E, + GL_DRAW_BUFFER10 = 0x882F, + GL_DRAW_BUFFER11 = 0x8830, + GL_DRAW_BUFFER12 = 0x8831, + GL_DRAW_BUFFER13 = 0x8832, + GL_DRAW_BUFFER14 = 0x8833, + GL_DRAW_BUFFER15 = 0x8834; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of TexEnvi, TexEnviv, TexEnvf, TexEnvfv, GetTexEnviv, and GetTexEnvfv. + */ + public static final int GL_POINT_SPRITE = 0x8861; + + /** + * When the {@code target} parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, GetTexEnvfv, or GetTexEnviv is POINT_SPRITE, then the value of + * {@code pname} may be. + */ + public static final int GL_COORD_REPLACE = 0x8862; + + /** Accepted by the {@code pname} parameter of PointParameter{if}v. */ + public static final int GL_POINT_SPRITE_COORD_ORIGIN = 0x8CA0; + + /** Accepted by the {@code param} parameter of PointParameter{if}v. */ + public static final int + GL_LOWER_LEFT = 0x8CA1, + GL_UPPER_LEFT = 0x8CA2; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_BLEND_EQUATION_RGB = 0x8009, + GL_BLEND_EQUATION_ALPHA = 0x883D; + + /** Accepted by the {@code pname} parameter of GetIntegerv. */ + public static final int + GL_STENCIL_BACK_FUNC = 0x8800, + GL_STENCIL_BACK_FAIL = 0x8801, + GL_STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802, + GL_STENCIL_BACK_PASS_DEPTH_PASS = 0x8803, + GL_STENCIL_BACK_REF = 0x8CA3, + GL_STENCIL_BACK_VALUE_MASK = 0x8CA4, + GL_STENCIL_BACK_WRITEMASK = 0x8CA5; + + protected GL20() { + throw new UnsupportedOperationException(); + } + + public static void glVertexAttribPointer(int index, int size, + boolean unsigned, boolean normalized, + int stride, ByteBuffer buffer) { + int type = unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE; + GL20.glVertexAttribPointer(index, size, type, normalized, stride, buffer); + } + + public static void glVertexAttribPointer(int index, int size, + boolean unsigned, boolean normalized, + int stride, ShortBuffer buffer) { + GL20.nglVertexAttribPointer(index, size, unsigned ? GL11.GL_UNSIGNED_SHORT : GL11.GL_SHORT, normalized, stride, MemoryUtil.memAddress(buffer)); + } + + public static void glVertexAttribPointer(int index, int size, + boolean unsigned, boolean normalized, + int stride, IntBuffer buffer) { + GL20.nglVertexAttribPointer(index, size, unsigned ? GL11.GL_UNSIGNED_INT : GL11.GL_INT, normalized, stride, MemoryUtil.memAddress(buffer)); + } + + public static String glGetActiveAttrib(int program, int index, int maxLength, + IntBuffer sizeType) { + //TODO check if correct + IntBuffer type = BufferUtils.createIntBuffer(1); + String s = GL20.glGetActiveAttrib(program, index, maxLength, sizeType, type); + sizeType.put(type.get(0)); + return s; + } + + public static String glGetActiveUniform(int program, int index, int maxLength, + IntBuffer sizeType) { + //TODO if correct + IntBuffer type = BufferUtils.createIntBuffer(1); + String s = GL20.glGetActiveUniform(program, index, maxLength, sizeType, type); + sizeType.put(type.get(0)); + return s; + } + + public static void glShaderSource(int shader, ByteBuffer string) { + byte[] b = new byte[string.remaining()]; + string.get(b); + glShaderSource(shader, new String(b)); + } + + @Deprecated + public static int glGetProgram(int i, int i2) { + return glGetProgrami(i, i2); + } + + public static void glGetProgram(int program, int pname, IntBuffer params) { + glGetProgramiv(program, pname, params); + } + + @Deprecated + public static int glGetShader(int i, int i2) { + return glGetShaderi(i, i2); + } + + public static void glGetShader(int shader, int pname, IntBuffer params) { + glGetShaderiv(shader, pname, params); + } + + public static void glGetUniform(int program, int location, FloatBuffer params) { + glGetUniformfv(program, location, params); + } + + public static void glGetUniform(int program, int location, IntBuffer params) { + glGetUniformiv(program, location, params); + } + + public static void glGetVertexAttrib(int index, int pname, DoubleBuffer params) { + glGetVertexAttribdv(index, pname, params); + } + + public static void glGetVertexAttrib(int index, int pname, FloatBuffer params) { + glGetVertexAttribfv(index, pname, params); + } + + public static void glGetVertexAttrib(int index, int pname, IntBuffer params) { + glGetVertexAttribiv(index, pname, params); + } + + public static void glUniform1(int location, FloatBuffer buffer) { + glUniform1fv(location, buffer); + } + + public static void glUniform1(int location, IntBuffer buffer) { + glUniform1iv(location, buffer); + } + + public static void glUniform2(int location, FloatBuffer buffer) { + glUniform2fv(location, buffer); + } + + public static void glUniform2(int location, IntBuffer buffer) { + glUniform2iv(location, buffer); + } + + public static void glUniform3(int location, FloatBuffer buffer) { + glUniform3fv(location, buffer); + } + + public static void glUniform3(int location, IntBuffer buffer) { + glUniform3iv(location, buffer); + } + + public static void glUniform4(int location, FloatBuffer buffer) { + glUniform4fv(location, buffer); + } + + public static void glUniform4(int location, IntBuffer buffer) { + glUniform4iv(location, buffer); + } + + public static void glUniformMatrix2(int location, boolean transpose, FloatBuffer buffer) { + glUniformMatrix2fv(location, transpose, buffer); + } + + public static void glUniformMatrix3(int location, boolean transpose, FloatBuffer buffer) { + glUniformMatrix3fv(location, transpose, buffer); + } + + public static void glUniformMatrix4(int location, boolean transpose, FloatBuffer buffer) { + glUniformMatrix4fv(location, transpose, buffer); + } + + public static void glVertexAttribPointer(int index, int size, boolean normalized, int stride, FloatBuffer buffer) { + glVertexAttribPointer(index, size, GL11.GL_FLOAT, normalized, stride, buffer); + } + + // --- [ glCreateProgram ] --- + + /** + * Creates a program object. + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glCreateProgram() { + return GL20C.glCreateProgram(); + } + + // --- [ glDeleteProgram ] --- + + /** + * Deletes a program object. + * + * @param program the program object to be deleted + * + * @see Reference Page + */ + public static void glDeleteProgram(@NativeType("GLuint") int program) { + GL20C.glDeleteProgram(program); + } + + // --- [ glIsProgram ] --- + + /** + * Returns {@link GL11#GL_TRUE TRUE} if {@code program} is the name of a program object. If {@code program} is zero, or a non-zero value that is not the name of a program + * object, IsProgram returns {@link GL11#GL_FALSE FALSE}. No error is generated if program is not a valid program object name. + * + * @param program the program object name to query + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsProgram(@NativeType("GLuint") int program) { + return GL20C.glIsProgram(program); + } + + // --- [ glCreateShader ] --- + + /** + * Creates a shader object. + * + * @param type the type of shader to be created. One of:
    {@link GL20C#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20C#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glCreateShader(@NativeType("GLenum") int type) { + return GL20C.glCreateShader(type); + } + + // --- [ glDeleteShader ] --- + + /** + * Deletes a shader object. + * + * @param shader the shader object to be deleted + * + * @see Reference Page + */ + public static void glDeleteShader(@NativeType("GLuint") int shader) { + GL20C.glDeleteShader(shader); + } + + // --- [ glIsShader ] --- + + /** + * Returns {@link GL11#GL_TRUE TRUE} if {@code shader} is the name of a shader object. If {@code shader} is zero, or a nonzero value that is not the name of a shader + * object, IsShader returns {@link GL11#GL_FALSE FALSE}. No error is generated if shader is not a valid shader object name. + * + * @param shader the shader object name to query + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsShader(@NativeType("GLuint") int shader) { + return GL20C.glIsShader(shader); + } + + // --- [ glAttachShader ] --- + + /** + * Attaches a shader object to a program object. + * + *

    In order to create a complete shader program, there must be a way to specify the list of things that will be linked together. Program objects provide + * this mechanism. Shaders that are to be linked together in a program object must first be attached to that program object. glAttachShader attaches the + * shader object specified by shader to the program object specified by program. This indicates that shader will be included in link operations that will + * be performed on program.

    + * + *

    All operations that can be performed on a shader object are valid whether or not the shader object is attached to a program object. It is permissible to + * attach a shader object to a program object before source code has been loaded into the shader object or before the shader object has been compiled. It + * is permissible to attach multiple shader objects of the same type because each may contain a portion of the complete shader. It is also permissible to + * attach a shader object to more than one program object. If a shader object is deleted while it is attached to a program object, it will be flagged for + * deletion, and deletion will not occur until glDetachShader is called to detach it from all program objects to which it is attached.

    + * + * @param program the program object to which a shader object will be attached + * @param shader the shader object that is to be attached + * + * @see Reference Page + */ + public static void glAttachShader(@NativeType("GLuint") int program, @NativeType("GLuint") int shader) { + GL20C.glAttachShader(program, shader); + } + + // --- [ glDetachShader ] --- + + /** + * Detaches a shader object from a program object to which it is attached. + * + * @param program the program object from which to detach the shader object + * @param shader the shader object to be detached + * + * @see Reference Page + */ + public static void glDetachShader(@NativeType("GLuint") int program, @NativeType("GLuint") int shader) { + GL20C.glDetachShader(program, shader); + } + + // --- [ glShaderSource ] --- + + /** + * Unsafe version of: {@link #glShaderSource ShaderSource} + * + * @param count the number of elements in the string and length arrays + */ + public static void nglShaderSource(int shader, int count, long strings, long length) { + GL20C.nglShaderSource(shader, count, strings, length); + } + + /** + * Sets the source code in {@code shader} to the source code in the array of strings specified by {@code strings}. Any source code previously stored in the + * shader object is completely replaced. The number of strings in the array is specified by {@code count}. If {@code length} is {@code NULL}, each string is + * assumed to be null terminated. If {@code length} is a value other than {@code NULL}, it points to an array containing a string length for each of the + * corresponding elements of {@code strings}. Each element in the length array may contain the length of the corresponding string (the null character is not + * counted as part of the string length) or a value less than 0 to indicate that the string is null terminated. The source code strings are not scanned or + * parsed at this time; they are simply copied into the specified shader object. + * + * @param shader the shader object whose source code is to be replaced + * @param strings an array of pointers to strings containing the source code to be loaded into the shader + * @param length an array of string lengths + * + * @see Reference Page + */ + public static void glShaderSource(@NativeType("GLuint") int shader, @NativeType("GLchar const * const *") PointerBuffer strings, @Nullable @NativeType("GLint const *") IntBuffer length) { + GL20C.glShaderSource(shader, strings, length); + } + + /** + * Sets the source code in {@code shader} to the source code in the array of strings specified by {@code strings}. Any source code previously stored in the + * shader object is completely replaced. The number of strings in the array is specified by {@code count}. If {@code length} is {@code NULL}, each string is + * assumed to be null terminated. If {@code length} is a value other than {@code NULL}, it points to an array containing a string length for each of the + * corresponding elements of {@code strings}. Each element in the length array may contain the length of the corresponding string (the null character is not + * counted as part of the string length) or a value less than 0 to indicate that the string is null terminated. The source code strings are not scanned or + * parsed at this time; they are simply copied into the specified shader object. + * + * @param shader the shader object whose source code is to be replaced + * @param strings an array of pointers to strings containing the source code to be loaded into the shader + * + * @see Reference Page + */ + public static void glShaderSource(@NativeType("GLuint") int shader, @NativeType("GLchar const * const *") CharSequence... strings) { + GL20C.glShaderSource(shader, strings); + } + + /** + * Sets the source code in {@code shader} to the source code in the array of strings specified by {@code strings}. Any source code previously stored in the + * shader object is completely replaced. The number of strings in the array is specified by {@code count}. If {@code length} is {@code NULL}, each string is + * assumed to be null terminated. If {@code length} is a value other than {@code NULL}, it points to an array containing a string length for each of the + * corresponding elements of {@code strings}. Each element in the length array may contain the length of the corresponding string (the null character is not + * counted as part of the string length) or a value less than 0 to indicate that the string is null terminated. The source code strings are not scanned or + * parsed at this time; they are simply copied into the specified shader object. + * + * @param shader the shader object whose source code is to be replaced + * + * @see Reference Page + */ + public static void glShaderSource(@NativeType("GLuint") int shader, @NativeType("GLchar const * const *") CharSequence string) { + GL20C.glShaderSource(shader, string); + } + + // --- [ glCompileShader ] --- + + /** + * Compiles a shader object. + * + * @param shader the shader object to be compiled + * + * @see Reference Page + */ + public static void glCompileShader(@NativeType("GLuint") int shader) { + GL20C.glCompileShader(shader); + } + + // --- [ glLinkProgram ] --- + + /** + * Links a program object. + * + * @param program the program object to be linked + * + * @see Reference Page + */ + public static void glLinkProgram(@NativeType("GLuint") int program) { + GL20C.glLinkProgram(program); + } + + // --- [ glUseProgram ] --- + + /** + * Installs a program object as part of current rendering state. + * + * @param program the program object whose executables are to be used as part of current rendering state + * + * @see Reference Page + */ + public static void glUseProgram(@NativeType("GLuint") int program) { + GL20C.glUseProgram(program); + } + + // --- [ glValidateProgram ] --- + + /** + * Validates a program object. + * + * @param program the program object to be validated + * + * @see Reference Page + */ + public static void glValidateProgram(@NativeType("GLuint") int program) { + GL20C.glValidateProgram(program); + } + + // --- [ glUniform1f ] --- + + /** + * Specifies the value of a float uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform value + * + * @see Reference Page + */ + public static void glUniform1f(@NativeType("GLint") int location, @NativeType("GLfloat") float v0) { + GL20C.glUniform1f(location, v0); + } + + // --- [ glUniform2f ] --- + + /** + * Specifies the value of a vec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * + * @see Reference Page + */ + public static void glUniform2f(@NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1) { + GL20C.glUniform2f(location, v0, v1); + } + + // --- [ glUniform3f ] --- + + /** + * Specifies the value of a vec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * + * @see Reference Page + */ + public static void glUniform3f(@NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2) { + GL20C.glUniform3f(location, v0, v1, v2); + } + + // --- [ glUniform4f ] --- + + /** + * Specifies the value of a vec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * @param v3 the uniform w value + * + * @see Reference Page + */ + public static void glUniform4f(@NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2, @NativeType("GLfloat") float v3) { + GL20C.glUniform4f(location, v0, v1, v2, v3); + } + + // --- [ glUniform1i ] --- + + /** + * Specifies the value of an int uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform value + * + * @see Reference Page + */ + public static void glUniform1i(@NativeType("GLint") int location, @NativeType("GLint") int v0) { + GL20C.glUniform1i(location, v0); + } + + // --- [ glUniform2i ] --- + + /** + * Specifies the value of an ivec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * + * @see Reference Page + */ + public static void glUniform2i(@NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1) { + GL20C.glUniform2i(location, v0, v1); + } + + // --- [ glUniform3i ] --- + + /** + * Specifies the value of an ivec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * + * @see Reference Page + */ + public static void glUniform3i(@NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1, @NativeType("GLint") int v2) { + GL20C.glUniform3i(location, v0, v1, v2); + } + + // --- [ glUniform4i ] --- + + /** + * Specifies the value of an ivec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * @param v3 the uniform w value + * + * @see Reference Page + */ + public static void glUniform4i(@NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1, @NativeType("GLint") int v2, @NativeType("GLint") int v3) { + GL20C.glUniform4i(location, v0, v1, v2, v3); + } + + // --- [ glUniform1fv ] --- + + /** + * Unsafe version of: {@link #glUniform1fv Uniform1fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform1fv(int location, int count, long value) { + GL20C.nglUniform1fv(location, count, value); + } + + /** + * Specifies the value of a single float uniform variable or a float uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform1fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL20C.glUniform1fv(location, value); + } + + // --- [ glUniform2fv ] --- + + /** + * Unsafe version of: {@link #glUniform2fv Uniform2fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform2fv(int location, int count, long value) { + GL20C.nglUniform2fv(location, count, value); + } + + /** + * Specifies the value of a single vec2 uniform variable or a vec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform2fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL20C.glUniform2fv(location, value); + } + + // --- [ glUniform3fv ] --- + + /** + * Unsafe version of: {@link #glUniform3fv Uniform3fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform3fv(int location, int count, long value) { + GL20C.nglUniform3fv(location, count, value); + } + + /** + * Specifies the value of a single vec3 uniform variable or a vec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform3fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL20C.glUniform3fv(location, value); + } + + // --- [ glUniform4fv ] --- + + /** + * Unsafe version of: {@link #glUniform4fv Uniform4fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform4fv(int location, int count, long value) { + GL20C.nglUniform4fv(location, count, value); + } + + /** + * Specifies the value of a single vec4 uniform variable or a vec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform4fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL20C.glUniform4fv(location, value); + } + + // --- [ glUniform1iv ] --- + + /** + * Unsafe version of: {@link #glUniform1iv Uniform1iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform1iv(int location, int count, long value) { + GL20C.nglUniform1iv(location, count, value); + } + + /** + * Specifies the value of a single int uniform variable or a int uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform1iv(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL20C.glUniform1iv(location, value); + } + + // --- [ glUniform2iv ] --- + + /** + * Unsafe version of: {@link #glUniform2iv Uniform2iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform2iv(int location, int count, long value) { + GL20C.nglUniform2iv(location, count, value); + } + + /** + * Specifies the value of a single ivec2 uniform variable or an ivec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform2iv(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL20C.glUniform2iv(location, value); + } + + // --- [ glUniform3iv ] --- + + /** + * Unsafe version of: {@link #glUniform3iv Uniform3iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform3iv(int location, int count, long value) { + GL20C.nglUniform3iv(location, count, value); + } + + /** + * Specifies the value of a single ivec3 uniform variable or an ivec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform3iv(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL20C.glUniform3iv(location, value); + } + + // --- [ glUniform4iv ] --- + + /** + * Unsafe version of: {@link #glUniform4iv Uniform4iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform4iv(int location, int count, long value) { + GL20C.nglUniform4iv(location, count, value); + } + + /** + * Specifies the value of a single ivec4 uniform variable or an ivec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform4iv(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL20C.glUniform4iv(location, value); + } + + // --- [ glUniformMatrix2fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2fv UniformMatrix2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix2fv(int location, int count, boolean transpose, long value) { + GL20C.nglUniformMatrix2fv(location, count, transpose, value); + } + + /** + * Specifies the value of a single mat2 uniform variable or a mat2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL20C.glUniformMatrix2fv(location, transpose, value); + } + + // --- [ glUniformMatrix3fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3fv UniformMatrix3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix3fv(int location, int count, boolean transpose, long value) { + GL20C.nglUniformMatrix3fv(location, count, transpose, value); + } + + /** + * Specifies the value of a single mat3 uniform variable or a mat3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL20C.glUniformMatrix3fv(location, transpose, value); + } + + // --- [ glUniformMatrix4fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4fv UniformMatrix4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix4fv(int location, int count, boolean transpose, long value) { + GL20C.nglUniformMatrix4fv(location, count, transpose, value); + } + + /** + * Specifies the value of a single mat4 uniform variable or a mat4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL20C.glUniformMatrix4fv(location, transpose, value); + } + + // --- [ glGetShaderiv ] --- + + /** Unsafe version of: {@link #glGetShaderiv GetShaderiv} */ + public static void nglGetShaderiv(int shader, int pname, long params) { + GL20C.nglGetShaderiv(shader, pname, params); + } + + /** + * Returns a parameter from a shader object. + * + * @param shader the shader object to be queried + * @param pname the object parameter. One of:
    {@link GL20C#GL_SHADER_TYPE SHADER_TYPE}{@link GL20C#GL_DELETE_STATUS DELETE_STATUS}{@link GL20C#GL_COMPILE_STATUS COMPILE_STATUS}{@link GL20C#GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link GL20C#GL_SHADER_SOURCE_LENGTH SHADER_SOURCE_LENGTH}
    + * @param params the requested object parameter + * + * @see Reference Page + */ + public static void glGetShaderiv(@NativeType("GLuint") int shader, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL20C.glGetShaderiv(shader, pname, params); + } + + /** + * Returns a parameter from a shader object. + * + * @param shader the shader object to be queried + * @param pname the object parameter. One of:
    {@link GL20C#GL_SHADER_TYPE SHADER_TYPE}{@link GL20C#GL_DELETE_STATUS DELETE_STATUS}{@link GL20C#GL_COMPILE_STATUS COMPILE_STATUS}{@link GL20C#GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link GL20C#GL_SHADER_SOURCE_LENGTH SHADER_SOURCE_LENGTH}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetShaderi(@NativeType("GLuint") int shader, @NativeType("GLenum") int pname) { + return GL20C.glGetShaderi(shader, pname); + } + + // --- [ glGetProgramiv ] --- + + /** Unsafe version of: {@link #glGetProgramiv GetProgramiv} */ + public static void nglGetProgramiv(int program, int pname, long params) { + GL20C.nglGetProgramiv(program, pname, params); + } + + /** + * Returns a parameter from a program object. + * + * @param program the program object to be queried + * @param pname the object parameter. One of:
    {@link GL20C#GL_DELETE_STATUS DELETE_STATUS}{@link GL20C#GL_LINK_STATUS LINK_STATUS}{@link GL20C#GL_VALIDATE_STATUS VALIDATE_STATUS}
    {@link GL20C#GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link GL20C#GL_ATTACHED_SHADERS ATTACHED_SHADERS}{@link GL20C#GL_ACTIVE_ATTRIBUTES ACTIVE_ATTRIBUTES}
    {@link GL20C#GL_ACTIVE_ATTRIBUTE_MAX_LENGTH ACTIVE_ATTRIBUTE_MAX_LENGTH}{@link GL20C#GL_ACTIVE_UNIFORMS ACTIVE_UNIFORMS}{@link GL20C#GL_ACTIVE_UNIFORM_MAX_LENGTH ACTIVE_UNIFORM_MAX_LENGTH}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_MODE TRANSFORM_FEEDBACK_BUFFER_MODE}{@link GL30#GL_TRANSFORM_FEEDBACK_VARYINGS TRANSFORM_FEEDBACK_VARYINGS}{@link GL30#GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH}
    {@link GL31#GL_ACTIVE_UNIFORM_BLOCKS ACTIVE_UNIFORM_BLOCKS}{@link GL31#GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH}{@link GL32#GL_GEOMETRY_VERTICES_OUT GEOMETRY_VERTICES_OUT}
    {@link GL32#GL_GEOMETRY_INPUT_TYPE GEOMETRY_INPUT_TYPE}{@link GL32#GL_GEOMETRY_OUTPUT_TYPE GEOMETRY_OUTPUT_TYPE}{@link GL41#GL_PROGRAM_BINARY_LENGTH PROGRAM_BINARY_LENGTH}
    {@link GL42#GL_ACTIVE_ATOMIC_COUNTER_BUFFERS ACTIVE_ATOMIC_COUNTER_BUFFERS}{@link GL43#GL_COMPUTE_WORK_GROUP_SIZE COMPUTE_WORK_GROUP_SIZE}
    + * @param params the requested object parameter + * + * @see Reference Page + */ + public static void glGetProgramiv(@NativeType("GLuint") int program, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL20C.glGetProgramiv(program, pname, params); + } + + /** + * Returns a parameter from a program object. + * + * @param program the program object to be queried + * @param pname the object parameter. One of:
    {@link GL20C#GL_DELETE_STATUS DELETE_STATUS}{@link GL20C#GL_LINK_STATUS LINK_STATUS}{@link GL20C#GL_VALIDATE_STATUS VALIDATE_STATUS}
    {@link GL20C#GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link GL20C#GL_ATTACHED_SHADERS ATTACHED_SHADERS}{@link GL20C#GL_ACTIVE_ATTRIBUTES ACTIVE_ATTRIBUTES}
    {@link GL20C#GL_ACTIVE_ATTRIBUTE_MAX_LENGTH ACTIVE_ATTRIBUTE_MAX_LENGTH}{@link GL20C#GL_ACTIVE_UNIFORMS ACTIVE_UNIFORMS}{@link GL20C#GL_ACTIVE_UNIFORM_MAX_LENGTH ACTIVE_UNIFORM_MAX_LENGTH}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_MODE TRANSFORM_FEEDBACK_BUFFER_MODE}{@link GL30#GL_TRANSFORM_FEEDBACK_VARYINGS TRANSFORM_FEEDBACK_VARYINGS}{@link GL30#GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH}
    {@link GL31#GL_ACTIVE_UNIFORM_BLOCKS ACTIVE_UNIFORM_BLOCKS}{@link GL31#GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH}{@link GL32#GL_GEOMETRY_VERTICES_OUT GEOMETRY_VERTICES_OUT}
    {@link GL32#GL_GEOMETRY_INPUT_TYPE GEOMETRY_INPUT_TYPE}{@link GL32#GL_GEOMETRY_OUTPUT_TYPE GEOMETRY_OUTPUT_TYPE}{@link GL41#GL_PROGRAM_BINARY_LENGTH PROGRAM_BINARY_LENGTH}
    {@link GL42#GL_ACTIVE_ATOMIC_COUNTER_BUFFERS ACTIVE_ATOMIC_COUNTER_BUFFERS}{@link GL43#GL_COMPUTE_WORK_GROUP_SIZE COMPUTE_WORK_GROUP_SIZE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetProgrami(@NativeType("GLuint") int program, @NativeType("GLenum") int pname) { + return GL20C.glGetProgrami(program, pname); + } + + // --- [ glGetShaderInfoLog ] --- + + /** + * Unsafe version of: {@link #glGetShaderInfoLog GetShaderInfoLog} + * + * @param maxLength the size of the character buffer for storing the returned information log + */ + public static void nglGetShaderInfoLog(int shader, int maxLength, long length, long infoLog) { + GL20C.nglGetShaderInfoLog(shader, maxLength, length, infoLog); + } + + /** + * Returns the information log for a shader object. + * + * @param shader the shader object whose information log is to be queried + * @param length the length of the string returned in {@code infoLog} (excluding the null terminator) + * @param infoLog an array of characters that is used to return the information log + * + * @see Reference Page + */ + public static void glGetShaderInfoLog(@NativeType("GLuint") int shader, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer infoLog) { + GL20C.glGetShaderInfoLog(shader, length, infoLog); + } + + /** + * Returns the information log for a shader object. + * + * @param shader the shader object whose information log is to be queried + * @param maxLength the size of the character buffer for storing the returned information log + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetShaderInfoLog(@NativeType("GLuint") int shader, @NativeType("GLsizei") int maxLength) { + return GL20C.glGetShaderInfoLog(shader, maxLength); + } + + /** + * Returns the information log for a shader object. + * + * @param shader the shader object whose information log is to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetShaderInfoLog(@NativeType("GLuint") int shader) { + return glGetShaderInfoLog(shader, glGetShaderi(shader, GL_INFO_LOG_LENGTH)); + } + + // --- [ glGetProgramInfoLog ] --- + + /** + * Unsafe version of: {@link #glGetProgramInfoLog GetProgramInfoLog} + * + * @param maxLength the size of the character buffer for storing the returned information log + */ + public static void nglGetProgramInfoLog(int program, int maxLength, long length, long infoLog) { + GL20C.nglGetProgramInfoLog(program, maxLength, length, infoLog); + } + + /** + * Returns the information log for a program object. + * + * @param program the program object whose information log is to be queried + * @param length the length of the string returned in {@code infoLog} (excluding the null terminator) + * @param infoLog an array of characters that is used to return the information log + * + * @see Reference Page + */ + public static void glGetProgramInfoLog(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer infoLog) { + GL20C.glGetProgramInfoLog(program, length, infoLog); + } + + /** + * Returns the information log for a program object. + * + * @param program the program object whose information log is to be queried + * @param maxLength the size of the character buffer for storing the returned information log + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramInfoLog(@NativeType("GLuint") int program, @NativeType("GLsizei") int maxLength) { + return GL20C.glGetProgramInfoLog(program, maxLength); + } + + /** + * Returns the information log for a program object. + * + * @param program the program object whose information log is to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramInfoLog(@NativeType("GLuint") int program) { + return glGetProgramInfoLog(program, glGetProgrami(program, GL_INFO_LOG_LENGTH)); + } + + // --- [ glGetAttachedShaders ] --- + + /** + * Unsafe version of: {@link #glGetAttachedShaders GetAttachedShaders} + * + * @param maxCount the size of the array for storing the returned object names + */ + public static void nglGetAttachedShaders(int program, int maxCount, long count, long shaders) { + GL20C.nglGetAttachedShaders(program, maxCount, count, shaders); + } + + /** + * Returns the shader objects attached to a program object. + * + * @param program the program object to be queried + * @param count the number of names actually returned in {@code shaders} + * @param shaders an array that is used to return the names of attached shader objects + * + * @see Reference Page + */ + public static void glGetAttachedShaders(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") IntBuffer count, @NativeType("GLuint *") IntBuffer shaders) { + GL20C.glGetAttachedShaders(program, count, shaders); + } + + // --- [ glGetUniformLocation ] --- + + /** Unsafe version of: {@link #glGetUniformLocation GetUniformLocation} */ + public static int nglGetUniformLocation(int program, long name) { + return GL20C.nglGetUniformLocation(program, name); + } + + /** + * Returns the location of a uniform variable. + * + * @param program the program object to be queried + * @param name a null terminated string containing the name of the uniform variable whose location is to be queried + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetUniformLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + return GL20C.glGetUniformLocation(program, name); + } + + /** + * Returns the location of a uniform variable. + * + * @param program the program object to be queried + * @param name a null terminated string containing the name of the uniform variable whose location is to be queried + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetUniformLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + return GL20C.glGetUniformLocation(program, name); + } + + // --- [ glGetActiveUniform ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniform GetActiveUniform} + * + * @param maxLength the maximum number of characters OpenGL is allowed to write in the character buffer indicated by {@code name} + */ + public static void nglGetActiveUniform(int program, int index, int maxLength, long length, long size, long type, long name) { + GL20C.nglGetActiveUniform(program, index, maxLength, length, size, type, name); + } + + /** + * Returns information about an active uniform variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the uniform variable to be queried + * @param length the number of characters actually written by OpenGL in the string indicated by {@code name} (excluding the null terminator) if a value other than NULL is passed + * @param size the size of the uniform variable + * @param type the data type of the uniform variable + * @param name a null terminated string containing the name of the uniform variable + * + * @see Reference Page + */ + public static void glGetActiveUniform(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type, @NativeType("GLchar *") ByteBuffer name) { + GL20C.glGetActiveUniform(program, index, length, size, type, name); + } + + /** + * Returns information about an active uniform variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the uniform variable to be queried + * @param maxLength the maximum number of characters OpenGL is allowed to write in the character buffer indicated by {@code name} + * @param size the size of the uniform variable + * @param type the data type of the uniform variable + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniform(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLsizei") int maxLength, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return GL20C.glGetActiveUniform(program, index, maxLength, size, type); + } + + /** + * Returns information about an active uniform variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the uniform variable to be queried + * @param size the size of the uniform variable + * @param type the data type of the uniform variable + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniform(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return glGetActiveUniform(program, index, glGetProgrami(program, GL_ACTIVE_UNIFORM_MAX_LENGTH), size, type); + } + + // --- [ glGetUniformfv ] --- + + /** Unsafe version of: {@link #glGetUniformfv GetUniformfv} */ + public static void nglGetUniformfv(int program, int location, long params) { + GL20C.nglGetUniformfv(program, location, params); + } + + /** + * Returns the float value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + * + * @see Reference Page + */ + public static void glGetUniformfv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") FloatBuffer params) { + GL20C.glGetUniformfv(program, location, params); + } + + /** + * Returns the float value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetUniformf(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL20C.glGetUniformf(program, location); + } + + // --- [ glGetUniformiv ] --- + + /** Unsafe version of: {@link #glGetUniformiv GetUniformiv} */ + public static void nglGetUniformiv(int program, int location, long params) { + GL20C.nglGetUniformiv(program, location, params); + } + + /** + * Returns the int value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + * + * @see Reference Page + */ + public static void glGetUniformiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") IntBuffer params) { + GL20C.glGetUniformiv(program, location, params); + } + + /** + * Returns the int value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetUniformi(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL20C.glGetUniformi(program, location); + } + + // --- [ glGetShaderSource ] --- + + /** + * Unsafe version of: {@link #glGetShaderSource GetShaderSource} + * + * @param maxLength the size of the character buffer for storing the returned source code string + */ + public static void nglGetShaderSource(int shader, int maxLength, long length, long source) { + GL20C.nglGetShaderSource(shader, maxLength, length, source); + } + + /** + * Returns the source code string from a shader object. + * + * @param shader the shader object to be queried + * @param length the length of the string returned in source (excluding the null terminator) + * @param source an array of characters that is used to return the source code string + * + * @see Reference Page + */ + public static void glGetShaderSource(@NativeType("GLuint") int shader, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer source) { + GL20C.glGetShaderSource(shader, length, source); + } + + /** + * Returns the source code string from a shader object. + * + * @param shader the shader object to be queried + * @param maxLength the size of the character buffer for storing the returned source code string + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetShaderSource(@NativeType("GLuint") int shader, @NativeType("GLsizei") int maxLength) { + return GL20C.glGetShaderSource(shader, maxLength); + } + + /** + * Returns the source code string from a shader object. + * + * @param shader the shader object to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetShaderSource(@NativeType("GLuint") int shader) { + return glGetShaderSource(shader, glGetShaderi(shader, GL_SHADER_SOURCE_LENGTH)); + } + + // --- [ glVertexAttrib1f ] --- + + /** + * Specifies the value of a generic vertex attribute. The y and z components are implicitly set to 0.0f and w to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * + * @see Reference Page + */ + public static void glVertexAttrib1f(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0) { + GL20C.glVertexAttrib1f(index, v0); + } + + // --- [ glVertexAttrib1s ] --- + + /** + * Short version of {@link #glVertexAttrib1f VertexAttrib1f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * + * @see Reference Page + */ + public static void glVertexAttrib1s(@NativeType("GLuint") int index, @NativeType("GLshort") short v0) { + GL20C.glVertexAttrib1s(index, v0); + } + + // --- [ glVertexAttrib1d ] --- + + /** + * Double version of {@link #glVertexAttrib1f VertexAttrib1f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * + * @see Reference Page + */ + public static void glVertexAttrib1d(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0) { + GL20C.glVertexAttrib1d(index, v0); + } + + // --- [ glVertexAttrib2f ] --- + + /** + * Specifies the value of a generic vertex attribute. The y component is implicitly set to 0.0f and w to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * + * @see Reference Page + */ + public static void glVertexAttrib2f(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1) { + GL20C.glVertexAttrib2f(index, v0, v1); + } + + // --- [ glVertexAttrib2s ] --- + + /** + * Short version of {@link #glVertexAttrib2f VertexAttrib2f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * + * @see Reference Page + */ + public static void glVertexAttrib2s(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1) { + GL20C.glVertexAttrib2s(index, v0, v1); + } + + // --- [ glVertexAttrib2d ] --- + + /** + * Double version of {@link #glVertexAttrib2f VertexAttrib2f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * + * @see Reference Page + */ + public static void glVertexAttrib2d(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1) { + GL20C.glVertexAttrib2d(index, v0, v1); + } + + // --- [ glVertexAttrib3f ] --- + + /** + * Specifies the value of a generic vertex attribute. The w is implicitly set to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * + * @see Reference Page + */ + public static void glVertexAttrib3f(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2) { + GL20C.glVertexAttrib3f(index, v0, v1, v2); + } + + // --- [ glVertexAttrib3s ] --- + + /** + * Short version of {@link #glVertexAttrib3f VertexAttrib3f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * + * @see Reference Page + */ + public static void glVertexAttrib3s(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1, @NativeType("GLshort") short v2) { + GL20C.glVertexAttrib3s(index, v0, v1, v2); + } + + // --- [ glVertexAttrib3d ] --- + + /** + * Double version of {@link #glVertexAttrib3f VertexAttrib3f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * + * @see Reference Page + */ + public static void glVertexAttrib3d(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1, @NativeType("GLdouble") double v2) { + GL20C.glVertexAttrib3d(index, v0, v1, v2); + } + + // --- [ glVertexAttrib4f ] --- + + /** + * Specifies the value of a generic vertex attribute. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + * + * @see Reference Page + */ + public static void glVertexAttrib4f(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2, @NativeType("GLfloat") float v3) { + GL20C.glVertexAttrib4f(index, v0, v1, v2, v3); + } + + // --- [ glVertexAttrib4s ] --- + + /** + * Short version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + * + * @see Reference Page + */ + public static void glVertexAttrib4s(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1, @NativeType("GLshort") short v2, @NativeType("GLshort") short v3) { + GL20C.glVertexAttrib4s(index, v0, v1, v2, v3); + } + + // --- [ glVertexAttrib4d ] --- + + /** + * Double version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + * + * @see Reference Page + */ + public static void glVertexAttrib4d(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1, @NativeType("GLdouble") double v2, @NativeType("GLdouble") double v3) { + GL20C.glVertexAttrib4d(index, v0, v1, v2, v3); + } + + // --- [ glVertexAttrib4Nub ] --- + + /** + * Normalized unsigned byte version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + * + * @see Reference Page + */ + public static void glVertexAttrib4Nub(@NativeType("GLuint") int index, @NativeType("GLubyte") byte x, @NativeType("GLubyte") byte y, @NativeType("GLubyte") byte z, @NativeType("GLubyte") byte w) { + GL20C.glVertexAttrib4Nub(index, x, y, z, w); + } + + // --- [ glVertexAttrib1fv ] --- + + /** Unsafe version of: {@link #glVertexAttrib1fv VertexAttrib1fv} */ + public static void nglVertexAttrib1fv(int index, long v) { + GL20C.nglVertexAttrib1fv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib1f VertexAttrib1f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib1fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + GL20C.glVertexAttrib1fv(index, v); + } + + // --- [ glVertexAttrib1sv ] --- + + /** Unsafe version of: {@link #glVertexAttrib1sv VertexAttrib1sv} */ + public static void nglVertexAttrib1sv(int index, long v) { + GL20C.nglVertexAttrib1sv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib1s VertexAttrib1s}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib1sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + GL20C.glVertexAttrib1sv(index, v); + } + + // --- [ glVertexAttrib1dv ] --- + + /** Unsafe version of: {@link #glVertexAttrib1dv VertexAttrib1dv} */ + public static void nglVertexAttrib1dv(int index, long v) { + GL20C.nglVertexAttrib1dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib1d VertexAttrib1d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib1dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL20C.glVertexAttrib1dv(index, v); + } + + // --- [ glVertexAttrib2fv ] --- + + /** Unsafe version of: {@link #glVertexAttrib2fv VertexAttrib2fv} */ + public static void nglVertexAttrib2fv(int index, long v) { + GL20C.nglVertexAttrib2fv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib2f VertexAttrib2f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib2fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + GL20C.glVertexAttrib2fv(index, v); + } + + // --- [ glVertexAttrib2sv ] --- + + /** Unsafe version of: {@link #glVertexAttrib2sv VertexAttrib2sv} */ + public static void nglVertexAttrib2sv(int index, long v) { + GL20C.nglVertexAttrib2sv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib2s VertexAttrib2s}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib2sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + GL20C.glVertexAttrib2sv(index, v); + } + + // --- [ glVertexAttrib2dv ] --- + + /** Unsafe version of: {@link #glVertexAttrib2dv VertexAttrib2dv} */ + public static void nglVertexAttrib2dv(int index, long v) { + GL20C.nglVertexAttrib2dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib2d VertexAttrib2d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib2dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL20C.glVertexAttrib2dv(index, v); + } + + // --- [ glVertexAttrib3fv ] --- + + /** Unsafe version of: {@link #glVertexAttrib3fv VertexAttrib3fv} */ + public static void nglVertexAttrib3fv(int index, long v) { + GL20C.nglVertexAttrib3fv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib3f VertexAttrib3f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib3fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + GL20C.glVertexAttrib3fv(index, v); + } + + // --- [ glVertexAttrib3sv ] --- + + /** Unsafe version of: {@link #glVertexAttrib3sv VertexAttrib3sv} */ + public static void nglVertexAttrib3sv(int index, long v) { + GL20C.nglVertexAttrib3sv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib3s VertexAttrib3s}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib3sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + GL20C.glVertexAttrib3sv(index, v); + } + + // --- [ glVertexAttrib3dv ] --- + + /** Unsafe version of: {@link #glVertexAttrib3dv VertexAttrib3dv} */ + public static void nglVertexAttrib3dv(int index, long v) { + GL20C.nglVertexAttrib3dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib3d VertexAttrib3d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib3dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL20C.glVertexAttrib3dv(index, v); + } + + // --- [ glVertexAttrib4fv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4fv VertexAttrib4fv} */ + public static void nglVertexAttrib4fv(int index, long v) { + GL20C.nglVertexAttrib4fv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + GL20C.glVertexAttrib4fv(index, v); + } + + // --- [ glVertexAttrib4sv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4sv VertexAttrib4sv} */ + public static void nglVertexAttrib4sv(int index, long v) { + GL20C.nglVertexAttrib4sv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib4s VertexAttrib4s}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + GL20C.glVertexAttrib4sv(index, v); + } + + // --- [ glVertexAttrib4dv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4dv VertexAttrib4dv} */ + public static void nglVertexAttrib4dv(int index, long v) { + GL20C.nglVertexAttrib4dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib4d VertexAttrib4d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL20C.glVertexAttrib4dv(index, v); + } + + // --- [ glVertexAttrib4iv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4iv VertexAttrib4iv} */ + public static void nglVertexAttrib4iv(int index, long v) { + GL20C.nglVertexAttrib4iv(index, v); + } + + /** + * Integer pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4iv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + GL20C.glVertexAttrib4iv(index, v); + } + + // --- [ glVertexAttrib4bv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4bv VertexAttrib4bv} */ + public static void nglVertexAttrib4bv(int index, long v) { + GL20C.nglVertexAttrib4bv(index, v); + } + + /** + * Byte pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4bv(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + GL20C.glVertexAttrib4bv(index, v); + } + + // --- [ glVertexAttrib4ubv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4ubv VertexAttrib4ubv} */ + public static void nglVertexAttrib4ubv(int index, long v) { + GL20C.nglVertexAttrib4ubv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttrib4Nub VertexAttrib4Nub}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4ubv(@NativeType("GLuint") int index, @NativeType("GLubyte const *") ByteBuffer v) { + GL20C.glVertexAttrib4ubv(index, v); + } + + // --- [ glVertexAttrib4usv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4usv VertexAttrib4usv} */ + public static void nglVertexAttrib4usv(int index, long v) { + GL20C.nglVertexAttrib4usv(index, v); + } + + /** + * Unsigned short pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4usv(@NativeType("GLuint") int index, @NativeType("GLushort const *") ShortBuffer v) { + GL20C.glVertexAttrib4usv(index, v); + } + + // --- [ glVertexAttrib4uiv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4uiv VertexAttrib4uiv} */ + public static void nglVertexAttrib4uiv(int index, long v) { + GL20C.nglVertexAttrib4uiv(index, v); + } + + /** + * Unsigned int pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + GL20C.glVertexAttrib4uiv(index, v); + } + + // --- [ glVertexAttrib4Nbv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Nbv VertexAttrib4Nbv} */ + public static void nglVertexAttrib4Nbv(int index, long v) { + GL20C.nglVertexAttrib4Nbv(index, v); + } + + /** + * Normalized byte pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Nbv(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + GL20C.glVertexAttrib4Nbv(index, v); + } + + // --- [ glVertexAttrib4Nsv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Nsv VertexAttrib4Nsv} */ + public static void nglVertexAttrib4Nsv(int index, long v) { + GL20C.nglVertexAttrib4Nsv(index, v); + } + + /** + * Normalized short pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Nsv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + GL20C.glVertexAttrib4Nsv(index, v); + } + + // --- [ glVertexAttrib4Niv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Niv VertexAttrib4Niv} */ + public static void nglVertexAttrib4Niv(int index, long v) { + GL20C.nglVertexAttrib4Niv(index, v); + } + + /** + * Normalized int pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Niv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + GL20C.glVertexAttrib4Niv(index, v); + } + + // --- [ glVertexAttrib4Nubv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Nubv VertexAttrib4Nubv} */ + public static void nglVertexAttrib4Nubv(int index, long v) { + GL20C.nglVertexAttrib4Nubv(index, v); + } + + /** + * Normalized unsigned byte pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Nubv(@NativeType("GLuint") int index, @NativeType("GLubyte const *") ByteBuffer v) { + GL20C.glVertexAttrib4Nubv(index, v); + } + + // --- [ glVertexAttrib4Nusv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Nusv VertexAttrib4Nusv} */ + public static void nglVertexAttrib4Nusv(int index, long v) { + GL20C.nglVertexAttrib4Nusv(index, v); + } + + /** + * Normalized unsigned short pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Nusv(@NativeType("GLuint") int index, @NativeType("GLushort const *") ShortBuffer v) { + GL20C.glVertexAttrib4Nusv(index, v); + } + + // --- [ glVertexAttrib4Nuiv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Nuiv VertexAttrib4Nuiv} */ + public static void nglVertexAttrib4Nuiv(int index, long v) { + GL20C.nglVertexAttrib4Nuiv(index, v); + } + + /** + * Normalized unsigned int pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Nuiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + GL20C.glVertexAttrib4Nuiv(index, v); + } + + // --- [ glVertexAttribPointer ] --- + + /** Unsafe version of: {@link #glVertexAttribPointer VertexAttribPointer} */ + public static void nglVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long pointer) { + GL20C.nglVertexAttribPointer(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + GL20C.glVertexAttribPointer(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + GL20C.glVertexAttribPointer(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + GL20C.glVertexAttribPointer(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + GL20C.glVertexAttribPointer(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + GL20C.glVertexAttribPointer(index, size, type, normalized, stride, pointer); + } + + // --- [ glEnableVertexAttribArray ] --- + + /** + * Enables a generic vertex attribute array. + * + * @param index the index of the generic vertex attribute to be enabled + * + * @see Reference Page + */ + public static void glEnableVertexAttribArray(@NativeType("GLuint") int index) { + GL20C.glEnableVertexAttribArray(index); + } + + // --- [ glDisableVertexAttribArray ] --- + + /** + * Disables a generic vertex attribute array. + * + * @param index the index of the generic vertex attribute to be disabled + * + * @see Reference Page + */ + public static void glDisableVertexAttribArray(@NativeType("GLuint") int index) { + GL20C.glDisableVertexAttribArray(index); + } + + // --- [ glBindAttribLocation ] --- + + /** Unsafe version of: {@link #glBindAttribLocation BindAttribLocation} */ + public static void nglBindAttribLocation(int program, int index, long name) { + GL20C.nglBindAttribLocation(program, index, name); + } + + /** + * Associates a generic vertex attribute index with a named attribute variable. + * + * @param program the program object in which the association is to be made + * @param index the index of the generic vertex attribute to be bound + * @param name a null terminated string containing the name of the vertex shader attribute variable to which {@code index} is to be bound + * + * @see Reference Page + */ + public static void glBindAttribLocation(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLchar const *") ByteBuffer name) { + GL20C.glBindAttribLocation(program, index, name); + } + + /** + * Associates a generic vertex attribute index with a named attribute variable. + * + * @param program the program object in which the association is to be made + * @param index the index of the generic vertex attribute to be bound + * @param name a null terminated string containing the name of the vertex shader attribute variable to which {@code index} is to be bound + * + * @see Reference Page + */ + public static void glBindAttribLocation(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLchar const *") CharSequence name) { + GL20C.glBindAttribLocation(program, index, name); + } + + // --- [ glGetActiveAttrib ] --- + + /** + * Unsafe version of: {@link #glGetActiveAttrib GetActiveAttrib} + * + * @param maxLength the maximum number of characters OpenGL is allowed to write in the character buffer indicated by {@code name} + */ + public static void nglGetActiveAttrib(int program, int index, int maxLength, long length, long size, long type, long name) { + GL20C.nglGetActiveAttrib(program, index, maxLength, length, size, type, name); + } + + /** + * Returns information about an active attribute variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the attribute variable to be queried + * @param length the number of characters actually written by OpenGL in the string indicated by {@code name} (excluding the null terminator) if a value other than + * {@code NULL} is passed + * @param size the size of the attribute variable + * @param type the data type of the attribute variable + * @param name a null terminated string containing the name of the attribute variable + * + * @see Reference Page + */ + public static void glGetActiveAttrib(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type, @NativeType("GLchar *") ByteBuffer name) { + GL20C.glGetActiveAttrib(program, index, length, size, type, name); + } + + /** + * Returns information about an active attribute variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the attribute variable to be queried + * @param maxLength the maximum number of characters OpenGL is allowed to write in the character buffer indicated by {@code name} + * @param size the size of the attribute variable + * @param type the data type of the attribute variable + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveAttrib(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLsizei") int maxLength, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return GL20C.glGetActiveAttrib(program, index, maxLength, size, type); + } + + /** + * Returns information about an active attribute variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the attribute variable to be queried + * @param size the size of the attribute variable + * @param type the data type of the attribute variable + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveAttrib(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return glGetActiveAttrib(program, index, glGetProgrami(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), size, type); + } + + // --- [ glGetAttribLocation ] --- + + /** Unsafe version of: {@link #glGetAttribLocation GetAttribLocation} */ + public static int nglGetAttribLocation(int program, long name) { + return GL20C.nglGetAttribLocation(program, name); + } + + /** + * Returns the location of an attribute variable. + * + * @param program the program object to be queried + * @param name a null terminated string containing the name of the attribute variable whose location is to be queried + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetAttribLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + return GL20C.glGetAttribLocation(program, name); + } + + /** + * Returns the location of an attribute variable. + * + * @param program the program object to be queried + * @param name a null terminated string containing the name of the attribute variable whose location is to be queried + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetAttribLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + return GL20C.glGetAttribLocation(program, name); + } + + // --- [ glGetVertexAttribiv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribiv GetVertexAttribiv} */ + public static void nglGetVertexAttribiv(int index, int pname, long params) { + GL20C.nglGetVertexAttribiv(index, pname, params); + } + + /** + * Returns the integer value of a generic vertex attribute parameter. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried. One of:
    {@link GL15#GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING VERTEX_ATTRIB_ARRAY_BUFFER_BINDING}{@link GL20C#GL_VERTEX_ATTRIB_ARRAY_ENABLED VERTEX_ATTRIB_ARRAY_ENABLED}
    {@link GL20C#GL_VERTEX_ATTRIB_ARRAY_SIZE VERTEX_ATTRIB_ARRAY_SIZE}{@link GL20C#GL_VERTEX_ATTRIB_ARRAY_STRIDE VERTEX_ATTRIB_ARRAY_STRIDE}
    {@link GL20C#GL_VERTEX_ATTRIB_ARRAY_TYPE VERTEX_ATTRIB_ARRAY_TYPE}{@link GL20C#GL_VERTEX_ATTRIB_ARRAY_NORMALIZED VERTEX_ATTRIB_ARRAY_NORMALIZED}
    {@link GL20C#GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}
    + * @param params returns the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL20C.glGetVertexAttribiv(index, pname, params); + } + + /** + * Returns the integer value of a generic vertex attribute parameter. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried. One of:
    {@link GL15#GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING VERTEX_ATTRIB_ARRAY_BUFFER_BINDING}{@link GL20C#GL_VERTEX_ATTRIB_ARRAY_ENABLED VERTEX_ATTRIB_ARRAY_ENABLED}
    {@link GL20C#GL_VERTEX_ATTRIB_ARRAY_SIZE VERTEX_ATTRIB_ARRAY_SIZE}{@link GL20C#GL_VERTEX_ATTRIB_ARRAY_STRIDE VERTEX_ATTRIB_ARRAY_STRIDE}
    {@link GL20C#GL_VERTEX_ATTRIB_ARRAY_TYPE VERTEX_ATTRIB_ARRAY_TYPE}{@link GL20C#GL_VERTEX_ATTRIB_ARRAY_NORMALIZED VERTEX_ATTRIB_ARRAY_NORMALIZED}
    {@link GL20C#GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetVertexAttribi(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL20C.glGetVertexAttribi(index, pname); + } + + // --- [ glGetVertexAttribfv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribfv GetVertexAttribfv} */ + public static void nglGetVertexAttribfv(int index, int pname, long params) { + GL20C.nglGetVertexAttribfv(index, pname, params); + } + + /** + * Float version of {@link #glGetVertexAttribiv GetVertexAttribiv}. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params returns the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribfv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + GL20C.glGetVertexAttribfv(index, pname, params); + } + + // --- [ glGetVertexAttribdv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribdv GetVertexAttribdv} */ + public static void nglGetVertexAttribdv(int index, int pname, long params) { + GL20C.nglGetVertexAttribdv(index, pname, params); + } + + /** + * Double version of {@link #glGetVertexAttribiv GetVertexAttribiv}. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params returns the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribdv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer params) { + GL20C.glGetVertexAttribdv(index, pname, params); + } + + // --- [ glGetVertexAttribPointerv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribPointerv GetVertexAttribPointerv} */ + public static void nglGetVertexAttribPointerv(int index, int pname, long pointer) { + GL20C.nglGetVertexAttribPointerv(index, pname, pointer); + } + + /** + * Returns the address of the specified generic vertex attribute pointer. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the generic vertex attribute parameter to be returned. Must be:
    {@link GL20C#GL_VERTEX_ATTRIB_ARRAY_POINTER VERTEX_ATTRIB_ARRAY_POINTER}
    + * @param pointer the pointer value + * + * @see Reference Page + */ + public static void glGetVertexAttribPointerv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer pointer) { + GL20C.glGetVertexAttribPointerv(index, pname, pointer); + } + + /** + * Returns the address of the specified generic vertex attribute pointer. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the generic vertex attribute parameter to be returned. Must be:
    {@link GL20C#GL_VERTEX_ATTRIB_ARRAY_POINTER VERTEX_ATTRIB_ARRAY_POINTER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL20C.glGetVertexAttribPointer(index, pname); + } + + // --- [ glDrawBuffers ] --- + + /** + * Unsafe version of: {@link #glDrawBuffers DrawBuffers} + * + * @param n the number of buffers in {@code bufs} + */ + public static void nglDrawBuffers(int n, long bufs) { + GL20C.nglDrawBuffers(n, bufs); + } + + /** + * Specifies a list of color buffers to be drawn into. + * + * @param bufs an array of symbolic constants specifying the buffers into which fragment colors or data values will be written. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}
    GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static void glDrawBuffers(@NativeType("GLenum const *") IntBuffer bufs) { + GL20C.glDrawBuffers(bufs); + } + + /** + * Specifies a list of color buffers to be drawn into. + * + * @see Reference Page + */ + public static void glDrawBuffers(@NativeType("GLenum const *") int buf) { + GL20C.glDrawBuffers(buf); + } + + // --- [ glBlendEquationSeparate ] --- + + /** + * Sets the RGB blend equation and the alpha blend equation separately. + * + * @param modeRGB the RGB blend equation, how the red, green, and blue components of the source and destination colors are combined. One of:
    {@link GL14#GL_FUNC_ADD FUNC_ADD}{@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14#GL_MIN MIN}{@link GL14#GL_MAX MAX}
    + * @param modeAlpha the alpha blend equation, how the alpha component of the source and destination colors are combined + * + * @see Reference Page + */ + public static void glBlendEquationSeparate(@NativeType("GLenum") int modeRGB, @NativeType("GLenum") int modeAlpha) { + GL20C.glBlendEquationSeparate(modeRGB, modeAlpha); + } + + // --- [ glStencilOpSeparate ] --- + + /** + * Sets front and/or back stencil test actions. + * + * @param face whether front and/or back stencil state is updated. One of:
    {@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param sfail the action to take when the stencil test fails. The initial value is GL_KEEP. One of:
    {@link GL11#GL_KEEP KEEP}{@link GL11#GL_ZERO ZERO}{@link GL11#GL_REPLACE REPLACE}{@link GL11#GL_INCR INCR}{@link GL14#GL_INCR_WRAP INCR_WRAP}{@link GL11#GL_DECR DECR}{@link GL14#GL_DECR_WRAP DECR_WRAP}{@link GL11#GL_INVERT INVERT}
    + * @param dpfail the stencil action when the stencil test passes, but the depth test fails. The initial value is GL_KEEP + * @param dppass the stencil action when both the stencil test and the depth test pass, or when the stencil test passes and either there is no depth buffer or depth + * testing is not enabled. The initial value is GL_KEEP + * + * @see Reference Page + */ + public static void glStencilOpSeparate(@NativeType("GLenum") int face, @NativeType("GLenum") int sfail, @NativeType("GLenum") int dpfail, @NativeType("GLenum") int dppass) { + GL20C.glStencilOpSeparate(face, sfail, dpfail, dppass); + } + + // --- [ glStencilFuncSeparate ] --- + + /** + * Sets front and/or back function and reference value for stencil testing. + * + * @param face whether front and/or back stencil state is updated. One of:
    {@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param func the test function. The initial value is GL_ALWAYS. One of:
    {@link GL11#GL_NEVER NEVER}{@link GL11#GL_LESS LESS}{@link GL11#GL_LEQUAL LEQUAL}{@link GL11#GL_GREATER GREATER}{@link GL11#GL_GEQUAL GEQUAL}{@link GL11#GL_EQUAL EQUAL}{@link GL11#GL_NOTEQUAL NOTEQUAL}{@link GL11#GL_ALWAYS ALWAYS}
    + * @param ref the reference value for the stencil test. {@code ref} is clamped to the range [0, 2n – 1], where {@code n} is the number of bitplanes in the stencil + * buffer. The initial value is 0. + * @param mask a mask that is ANDed with both the reference value and the stored stencil value when the test is done. The initial value is all 1's. + * + * @see Reference Page + */ + public static void glStencilFuncSeparate(@NativeType("GLenum") int face, @NativeType("GLenum") int func, @NativeType("GLint") int ref, @NativeType("GLuint") int mask) { + GL20C.glStencilFuncSeparate(face, func, ref, mask); + } + + // --- [ glStencilMaskSeparate ] --- + + /** + * Controls the front and/or back writing of individual bits in the stencil planes. + * + * @param face whether front and/or back stencil writemask is updated. One of:
    {@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param mask a bit mask to enable and disable writing of individual bits in the stencil planes. Initially, the mask is all 1's. + * + * @see Reference Page + */ + public static void glStencilMaskSeparate(@NativeType("GLenum") int face, @NativeType("GLuint") int mask) { + GL20C.glStencilMaskSeparate(face, mask); + } + + /** + * Array version of: {@link #glShaderSource ShaderSource} + * + * @see Reference Page + */ + public static void glShaderSource(@NativeType("GLuint") int shader, @NativeType("GLchar const * const *") PointerBuffer strings, @Nullable @NativeType("GLint const *") int[] length) { + GL20C.glShaderSource(shader, strings, length); + } + + /** + * Array version of: {@link #glUniform1fv Uniform1fv} + * + * @see Reference Page + */ + public static void glUniform1fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL20C.glUniform1fv(location, value); + } + + /** + * Array version of: {@link #glUniform2fv Uniform2fv} + * + * @see Reference Page + */ + public static void glUniform2fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL20C.glUniform2fv(location, value); + } + + /** + * Array version of: {@link #glUniform3fv Uniform3fv} + * + * @see Reference Page + */ + public static void glUniform3fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL20C.glUniform3fv(location, value); + } + + /** + * Array version of: {@link #glUniform4fv Uniform4fv} + * + * @see Reference Page + */ + public static void glUniform4fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL20C.glUniform4fv(location, value); + } + + /** + * Array version of: {@link #glUniform1iv Uniform1iv} + * + * @see Reference Page + */ + public static void glUniform1iv(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL20C.glUniform1iv(location, value); + } + + /** + * Array version of: {@link #glUniform2iv Uniform2iv} + * + * @see Reference Page + */ + public static void glUniform2iv(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL20C.glUniform2iv(location, value); + } + + /** + * Array version of: {@link #glUniform3iv Uniform3iv} + * + * @see Reference Page + */ + public static void glUniform3iv(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL20C.glUniform3iv(location, value); + } + + /** + * Array version of: {@link #glUniform4iv Uniform4iv} + * + * @see Reference Page + */ + public static void glUniform4iv(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL20C.glUniform4iv(location, value); + } + + /** + * Array version of: {@link #glUniformMatrix2fv UniformMatrix2fv} + * + * @see Reference Page + */ + public static void glUniformMatrix2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL20C.glUniformMatrix2fv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix3fv UniformMatrix3fv} + * + * @see Reference Page + */ + public static void glUniformMatrix3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL20C.glUniformMatrix3fv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix4fv UniformMatrix4fv} + * + * @see Reference Page + */ + public static void glUniformMatrix4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL20C.glUniformMatrix4fv(location, transpose, value); + } + + /** + * Array version of: {@link #glGetShaderiv GetShaderiv} + * + * @see Reference Page + */ + public static void glGetShaderiv(@NativeType("GLuint") int shader, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL20C.glGetShaderiv(shader, pname, params); + } + + /** + * Array version of: {@link #glGetProgramiv GetProgramiv} + * + * @see Reference Page + */ + public static void glGetProgramiv(@NativeType("GLuint") int program, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL20C.glGetProgramiv(program, pname, params); + } + + /** + * Array version of: {@link #glGetShaderInfoLog GetShaderInfoLog} + * + * @see Reference Page + */ + public static void glGetShaderInfoLog(@NativeType("GLuint") int shader, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer infoLog) { + GL20C.glGetShaderInfoLog(shader, length, infoLog); + } + + /** + * Array version of: {@link #glGetProgramInfoLog GetProgramInfoLog} + * + * @see Reference Page + */ + public static void glGetProgramInfoLog(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer infoLog) { + GL20C.glGetProgramInfoLog(program, length, infoLog); + } + + /** + * Array version of: {@link #glGetAttachedShaders GetAttachedShaders} + * + * @see Reference Page + */ + public static void glGetAttachedShaders(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") int[] count, @NativeType("GLuint *") int[] shaders) { + GL20C.glGetAttachedShaders(program, count, shaders); + } + + /** + * Array version of: {@link #glGetActiveUniform GetActiveUniform} + * + * @see Reference Page + */ + public static void glGetActiveUniform(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] size, @NativeType("GLenum *") int[] type, @NativeType("GLchar *") ByteBuffer name) { + GL20C.glGetActiveUniform(program, index, length, size, type, name); + } + + /** + * Array version of: {@link #glGetUniformfv GetUniformfv} + * + * @see Reference Page + */ + public static void glGetUniformfv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") float[] params) { + GL20C.glGetUniformfv(program, location, params); + } + + /** + * Array version of: {@link #glGetUniformiv GetUniformiv} + * + * @see Reference Page + */ + public static void glGetUniformiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") int[] params) { + GL20C.glGetUniformiv(program, location, params); + } + + /** + * Array version of: {@link #glGetShaderSource GetShaderSource} + * + * @see Reference Page + */ + public static void glGetShaderSource(@NativeType("GLuint") int shader, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer source) { + GL20C.glGetShaderSource(shader, length, source); + } + + /** + * Array version of: {@link #glVertexAttrib1fv VertexAttrib1fv} + * + * @see Reference Page + */ + public static void glVertexAttrib1fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + GL20C.glVertexAttrib1fv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib1sv VertexAttrib1sv} + * + * @see Reference Page + */ + public static void glVertexAttrib1sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + GL20C.glVertexAttrib1sv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib1dv VertexAttrib1dv} + * + * @see Reference Page + */ + public static void glVertexAttrib1dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL20C.glVertexAttrib1dv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib2fv VertexAttrib2fv} + * + * @see Reference Page + */ + public static void glVertexAttrib2fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + GL20C.glVertexAttrib2fv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib2sv VertexAttrib2sv} + * + * @see Reference Page + */ + public static void glVertexAttrib2sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + GL20C.glVertexAttrib2sv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib2dv VertexAttrib2dv} + * + * @see Reference Page + */ + public static void glVertexAttrib2dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL20C.glVertexAttrib2dv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib3fv VertexAttrib3fv} + * + * @see Reference Page + */ + public static void glVertexAttrib3fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + GL20C.glVertexAttrib3fv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib3sv VertexAttrib3sv} + * + * @see Reference Page + */ + public static void glVertexAttrib3sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + GL20C.glVertexAttrib3sv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib3dv VertexAttrib3dv} + * + * @see Reference Page + */ + public static void glVertexAttrib3dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL20C.glVertexAttrib3dv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib4fv VertexAttrib4fv} + * + * @see Reference Page + */ + public static void glVertexAttrib4fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + GL20C.glVertexAttrib4fv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib4sv VertexAttrib4sv} + * + * @see Reference Page + */ + public static void glVertexAttrib4sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + GL20C.glVertexAttrib4sv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib4dv VertexAttrib4dv} + * + * @see Reference Page + */ + public static void glVertexAttrib4dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL20C.glVertexAttrib4dv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib4iv VertexAttrib4iv} + * + * @see Reference Page + */ + public static void glVertexAttrib4iv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + GL20C.glVertexAttrib4iv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib4usv VertexAttrib4usv} + * + * @see Reference Page + */ + public static void glVertexAttrib4usv(@NativeType("GLuint") int index, @NativeType("GLushort const *") short[] v) { + GL20C.glVertexAttrib4usv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib4uiv VertexAttrib4uiv} + * + * @see Reference Page + */ + public static void glVertexAttrib4uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + GL20C.glVertexAttrib4uiv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib4Nsv VertexAttrib4Nsv} + * + * @see Reference Page + */ + public static void glVertexAttrib4Nsv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + GL20C.glVertexAttrib4Nsv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib4Niv VertexAttrib4Niv} + * + * @see Reference Page + */ + public static void glVertexAttrib4Niv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + GL20C.glVertexAttrib4Niv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib4Nusv VertexAttrib4Nusv} + * + * @see Reference Page + */ + public static void glVertexAttrib4Nusv(@NativeType("GLuint") int index, @NativeType("GLushort const *") short[] v) { + GL20C.glVertexAttrib4Nusv(index, v); + } + + /** + * Array version of: {@link #glVertexAttrib4Nuiv VertexAttrib4Nuiv} + * + * @see Reference Page + */ + public static void glVertexAttrib4Nuiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + GL20C.glVertexAttrib4Nuiv(index, v); + } + + /** + * Array version of: {@link #glGetActiveAttrib GetActiveAttrib} + * + * @see Reference Page + */ + public static void glGetActiveAttrib(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] size, @NativeType("GLenum *") int[] type, @NativeType("GLchar *") ByteBuffer name) { + GL20C.glGetActiveAttrib(program, index, length, size, type, name); + } + + /** + * Array version of: {@link #glGetVertexAttribiv GetVertexAttribiv} + * + * @see Reference Page + */ + public static void glGetVertexAttribiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL20C.glGetVertexAttribiv(index, pname, params); + } + + /** + * Array version of: {@link #glGetVertexAttribfv GetVertexAttribfv} + * + * @see Reference Page + */ + public static void glGetVertexAttribfv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + GL20C.glGetVertexAttribfv(index, pname, params); + } + + /** + * Array version of: {@link #glGetVertexAttribdv GetVertexAttribdv} + * + * @see Reference Page + */ + public static void glGetVertexAttribdv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] params) { + GL20C.glGetVertexAttribdv(index, pname, params); + } + + /** + * Array version of: {@link #glDrawBuffers DrawBuffers} + * + * @see Reference Page + */ + public static void glDrawBuffers(@NativeType("GLenum const *") int[] bufs) { + GL20C.glDrawBuffers(bufs); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL20C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL20C.java new file mode 100644 index 000000000..4665de39d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL20C.java @@ -0,0 +1,2963 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; +import org.lwjgl.system.MemoryUtil; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality of a forward compatible context, up to version 2.0. + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL20C extends GL15C { + + static { GL.initialize(); } + + /** Accepted by the {@code name} parameter of GetString. */ + public static final int GL_SHADING_LANGUAGE_VERSION = 0x8B8C; + + /** Accepted by the {@code pname} parameter of GetInteger. */ + public static final int GL_CURRENT_PROGRAM = 0x8B8D; + + /** Accepted by the {@code pname} parameter of GetShaderiv. */ + public static final int + GL_SHADER_TYPE = 0x8B4F, + GL_DELETE_STATUS = 0x8B80, + GL_COMPILE_STATUS = 0x8B81, + GL_LINK_STATUS = 0x8B82, + GL_VALIDATE_STATUS = 0x8B83, + GL_INFO_LOG_LENGTH = 0x8B84, + GL_ATTACHED_SHADERS = 0x8B85, + GL_ACTIVE_UNIFORMS = 0x8B86, + GL_ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87, + GL_ACTIVE_ATTRIBUTES = 0x8B89, + GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A, + GL_SHADER_SOURCE_LENGTH = 0x8B88; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_FLOAT_VEC2 = 0x8B50, + GL_FLOAT_VEC3 = 0x8B51, + GL_FLOAT_VEC4 = 0x8B52, + GL_INT_VEC2 = 0x8B53, + GL_INT_VEC3 = 0x8B54, + GL_INT_VEC4 = 0x8B55, + GL_BOOL = 0x8B56, + GL_BOOL_VEC2 = 0x8B57, + GL_BOOL_VEC3 = 0x8B58, + GL_BOOL_VEC4 = 0x8B59, + GL_FLOAT_MAT2 = 0x8B5A, + GL_FLOAT_MAT3 = 0x8B5B, + GL_FLOAT_MAT4 = 0x8B5C, + GL_SAMPLER_1D = 0x8B5D, + GL_SAMPLER_2D = 0x8B5E, + GL_SAMPLER_3D = 0x8B5F, + GL_SAMPLER_CUBE = 0x8B60, + GL_SAMPLER_1D_SHADOW = 0x8B61, + GL_SAMPLER_2D_SHADOW = 0x8B62; + + /** Accepted by the {@code type} argument of CreateShader and returned by the {@code params} parameter of GetShaderiv. */ + public static final int GL_VERTEX_SHADER = 0x8B31; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A, + GL_MAX_VARYING_FLOATS = 0x8B4B, + GL_MAX_VERTEX_ATTRIBS = 0x8869, + GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872, + GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C, + GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D; + + /** + * Accepted by the {@code cap} parameter of Disable, Enable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_VERTEX_PROGRAM_POINT_SIZE = 0x8642; + + /** Accepted by the {@code pname} parameter of GetVertexAttrib{dfi}v. */ + public static final int + GL_VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622, + GL_VERTEX_ATTRIB_ARRAY_SIZE = 0x8623, + GL_VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624, + GL_VERTEX_ATTRIB_ARRAY_TYPE = 0x8625, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A, + GL_CURRENT_VERTEX_ATTRIB = 0x8626; + + /** Accepted by the {@code pname} parameter of GetVertexAttribPointerv. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_POINTER = 0x8645; + + /** Accepted by the {@code type} argument of CreateShader and returned by the {@code params} parameter of GetShaderiv. */ + public static final int GL_FRAGMENT_SHADER = 0x8B30; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49; + + /** Accepted by the {@code target} parameter of Hint and the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B; + + /** Accepted by the {@code pname} parameters of GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_DRAW_BUFFERS = 0x8824, + GL_DRAW_BUFFER0 = 0x8825, + GL_DRAW_BUFFER1 = 0x8826, + GL_DRAW_BUFFER2 = 0x8827, + GL_DRAW_BUFFER3 = 0x8828, + GL_DRAW_BUFFER4 = 0x8829, + GL_DRAW_BUFFER5 = 0x882A, + GL_DRAW_BUFFER6 = 0x882B, + GL_DRAW_BUFFER7 = 0x882C, + GL_DRAW_BUFFER8 = 0x882D, + GL_DRAW_BUFFER9 = 0x882E, + GL_DRAW_BUFFER10 = 0x882F, + GL_DRAW_BUFFER11 = 0x8830, + GL_DRAW_BUFFER12 = 0x8831, + GL_DRAW_BUFFER13 = 0x8832, + GL_DRAW_BUFFER14 = 0x8833, + GL_DRAW_BUFFER15 = 0x8834; + + /** Accepted by the {@code pname} parameter of PointParameter{if}v. */ + public static final int GL_POINT_SPRITE_COORD_ORIGIN = 0x8CA0; + + /** Accepted by the {@code param} parameter of PointParameter{if}v. */ + public static final int + GL_LOWER_LEFT = 0x8CA1, + GL_UPPER_LEFT = 0x8CA2; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_BLEND_EQUATION_RGB = 0x8009, + GL_BLEND_EQUATION_ALPHA = 0x883D; + + /** Accepted by the {@code pname} parameter of GetIntegerv. */ + public static final int + GL_STENCIL_BACK_FUNC = 0x8800, + GL_STENCIL_BACK_FAIL = 0x8801, + GL_STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802, + GL_STENCIL_BACK_PASS_DEPTH_PASS = 0x8803, + GL_STENCIL_BACK_REF = 0x8CA3, + GL_STENCIL_BACK_VALUE_MASK = 0x8CA4, + GL_STENCIL_BACK_WRITEMASK = 0x8CA5; + + protected GL20C() { + throw new UnsupportedOperationException(); + } + + // --- [ glCreateProgram ] --- + + /** + * Creates a program object. + * + * @see Reference Page + */ + @NativeType("GLuint") + public static native int glCreateProgram(); + + // --- [ glDeleteProgram ] --- + + /** + * Deletes a program object. + * + * @param program the program object to be deleted + * + * @see Reference Page + */ + public static native void glDeleteProgram(@NativeType("GLuint") int program); + + // --- [ glIsProgram ] --- + + /** + * Returns {@link GL11#GL_TRUE TRUE} if {@code program} is the name of a program object. If {@code program} is zero, or a non-zero value that is not the name of a program + * object, IsProgram returns {@link GL11#GL_FALSE FALSE}. No error is generated if program is not a valid program object name. + * + * @param program the program object name to query + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsProgram(@NativeType("GLuint") int program); + + // --- [ glCreateShader ] --- + + /** + * Creates a shader object. + * + * @param type the type of shader to be created. One of:
    {@link #GL_VERTEX_SHADER VERTEX_SHADER}{@link #GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * + * @see Reference Page + */ + @NativeType("GLuint") + public static native int glCreateShader(@NativeType("GLenum") int type); + + // --- [ glDeleteShader ] --- + + /** + * Deletes a shader object. + * + * @param shader the shader object to be deleted + * + * @see Reference Page + */ + public static native void glDeleteShader(@NativeType("GLuint") int shader); + + // --- [ glIsShader ] --- + + /** + * Returns {@link GL11#GL_TRUE TRUE} if {@code shader} is the name of a shader object. If {@code shader} is zero, or a nonzero value that is not the name of a shader + * object, IsShader returns {@link GL11#GL_FALSE FALSE}. No error is generated if shader is not a valid shader object name. + * + * @param shader the shader object name to query + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsShader(@NativeType("GLuint") int shader); + + // --- [ glAttachShader ] --- + + /** + * Attaches a shader object to a program object. + * + *

    In order to create a complete shader program, there must be a way to specify the list of things that will be linked together. Program objects provide + * this mechanism. Shaders that are to be linked together in a program object must first be attached to that program object. glAttachShader attaches the + * shader object specified by shader to the program object specified by program. This indicates that shader will be included in link operations that will + * be performed on program.

    + * + *

    All operations that can be performed on a shader object are valid whether or not the shader object is attached to a program object. It is permissible to + * attach a shader object to a program object before source code has been loaded into the shader object or before the shader object has been compiled. It + * is permissible to attach multiple shader objects of the same type because each may contain a portion of the complete shader. It is also permissible to + * attach a shader object to more than one program object. If a shader object is deleted while it is attached to a program object, it will be flagged for + * deletion, and deletion will not occur until glDetachShader is called to detach it from all program objects to which it is attached.

    + * + * @param program the program object to which a shader object will be attached + * @param shader the shader object that is to be attached + * + * @see Reference Page + */ + public static native void glAttachShader(@NativeType("GLuint") int program, @NativeType("GLuint") int shader); + + // --- [ glDetachShader ] --- + + /** + * Detaches a shader object from a program object to which it is attached. + * + * @param program the program object from which to detach the shader object + * @param shader the shader object to be detached + * + * @see Reference Page + */ + public static native void glDetachShader(@NativeType("GLuint") int program, @NativeType("GLuint") int shader); + + // --- [ glShaderSource ] --- + + /** + * Unsafe version of: {@link #glShaderSource ShaderSource} + * + * @param count the number of elements in the string and length arrays + */ + public static native void nglShaderSource(int shader, int count, long strings, long length); + + /** + * Sets the source code in {@code shader} to the source code in the array of strings specified by {@code strings}. Any source code previously stored in the + * shader object is completely replaced. The number of strings in the array is specified by {@code count}. If {@code length} is {@code NULL}, each string is + * assumed to be null terminated. If {@code length} is a value other than {@code NULL}, it points to an array containing a string length for each of the + * corresponding elements of {@code strings}. Each element in the length array may contain the length of the corresponding string (the null character is not + * counted as part of the string length) or a value less than 0 to indicate that the string is null terminated. The source code strings are not scanned or + * parsed at this time; they are simply copied into the specified shader object. + * + * @param shader the shader object whose source code is to be replaced + * @param strings an array of pointers to strings containing the source code to be loaded into the shader + * @param length an array of string lengths + * + * @see Reference Page + */ + public static void glShaderSource(@NativeType("GLuint") int shader, @NativeType("GLchar const * const *") PointerBuffer strings, @Nullable @NativeType("GLint const *") IntBuffer length) { + if (CHECKS) { + checkSafe(length, strings.remaining()); + } + nglShaderSource(shader, strings.remaining(), memAddress(strings), memAddressSafe(length)); + } + + /** + * Sets the source code in {@code shader} to the source code in the array of strings specified by {@code strings}. Any source code previously stored in the + * shader object is completely replaced. The number of strings in the array is specified by {@code count}. If {@code length} is {@code NULL}, each string is + * assumed to be null terminated. If {@code length} is a value other than {@code NULL}, it points to an array containing a string length for each of the + * corresponding elements of {@code strings}. Each element in the length array may contain the length of the corresponding string (the null character is not + * counted as part of the string length) or a value less than 0 to indicate that the string is null terminated. The source code strings are not scanned or + * parsed at this time; they are simply copied into the specified shader object. + * + * @param shader the shader object whose source code is to be replaced + * @param strings an array of pointers to strings containing the source code to be loaded into the shader + * + * @see Reference Page + */ + public static void glShaderSource(@NativeType("GLuint") int shader, @NativeType("GLchar const * const *") CharSequence... strings) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long stringsAddress = APIUtil.apiArrayi(stack, MemoryUtil::memUTF8, strings); + nglShaderSource(shader, strings.length, stringsAddress, stringsAddress - (strings.length << 2)); + APIUtil.apiArrayFree(stringsAddress, strings.length); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Sets the source code in {@code shader} to the source code in the array of strings specified by {@code strings}. Any source code previously stored in the + * shader object is completely replaced. The number of strings in the array is specified by {@code count}. If {@code length} is {@code NULL}, each string is + * assumed to be null terminated. If {@code length} is a value other than {@code NULL}, it points to an array containing a string length for each of the + * corresponding elements of {@code strings}. Each element in the length array may contain the length of the corresponding string (the null character is not + * counted as part of the string length) or a value less than 0 to indicate that the string is null terminated. The source code strings are not scanned or + * parsed at this time; they are simply copied into the specified shader object. + * + * @param shader the shader object whose source code is to be replaced + * + * @see Reference Page + */ + public static void glShaderSource(@NativeType("GLuint") int shader, @NativeType("GLchar const * const *") CharSequence string) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long stringsAddress = APIUtil.apiArrayi(stack, MemoryUtil::memUTF8, string); + nglShaderSource(shader, 1, stringsAddress, stringsAddress - 4); + APIUtil.apiArrayFree(stringsAddress, 1); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCompileShader ] --- + + /** + * Compiles a shader object. + * + * @param shader the shader object to be compiled + * + * @see Reference Page + */ + public static native void glCompileShader(@NativeType("GLuint") int shader); + + // --- [ glLinkProgram ] --- + + /** + * Links a program object. + * + * @param program the program object to be linked + * + * @see Reference Page + */ + public static native void glLinkProgram(@NativeType("GLuint") int program); + + // --- [ glUseProgram ] --- + + /** + * Installs a program object as part of current rendering state. + * + * @param program the program object whose executables are to be used as part of current rendering state + * + * @see Reference Page + */ + public static native void glUseProgram(@NativeType("GLuint") int program); + + // --- [ glValidateProgram ] --- + + /** + * Validates a program object. + * + * @param program the program object to be validated + * + * @see Reference Page + */ + public static native void glValidateProgram(@NativeType("GLuint") int program); + + // --- [ glUniform1f ] --- + + /** + * Specifies the value of a float uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform value + * + * @see Reference Page + */ + public static native void glUniform1f(@NativeType("GLint") int location, @NativeType("GLfloat") float v0); + + // --- [ glUniform2f ] --- + + /** + * Specifies the value of a vec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * + * @see Reference Page + */ + public static native void glUniform2f(@NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1); + + // --- [ glUniform3f ] --- + + /** + * Specifies the value of a vec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * + * @see Reference Page + */ + public static native void glUniform3f(@NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2); + + // --- [ glUniform4f ] --- + + /** + * Specifies the value of a vec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * @param v3 the uniform w value + * + * @see Reference Page + */ + public static native void glUniform4f(@NativeType("GLint") int location, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2, @NativeType("GLfloat") float v3); + + // --- [ glUniform1i ] --- + + /** + * Specifies the value of an int uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform value + * + * @see Reference Page + */ + public static native void glUniform1i(@NativeType("GLint") int location, @NativeType("GLint") int v0); + + // --- [ glUniform2i ] --- + + /** + * Specifies the value of an ivec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * + * @see Reference Page + */ + public static native void glUniform2i(@NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1); + + // --- [ glUniform3i ] --- + + /** + * Specifies the value of an ivec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * + * @see Reference Page + */ + public static native void glUniform3i(@NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1, @NativeType("GLint") int v2); + + // --- [ glUniform4i ] --- + + /** + * Specifies the value of an ivec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * @param v3 the uniform w value + * + * @see Reference Page + */ + public static native void glUniform4i(@NativeType("GLint") int location, @NativeType("GLint") int v0, @NativeType("GLint") int v1, @NativeType("GLint") int v2, @NativeType("GLint") int v3); + + // --- [ glUniform1fv ] --- + + /** + * Unsafe version of: {@link #glUniform1fv Uniform1fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform1fv(int location, int count, long value); + + /** + * Specifies the value of a single float uniform variable or a float uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform1fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniform1fv(location, value.remaining(), memAddress(value)); + } + + // --- [ glUniform2fv ] --- + + /** + * Unsafe version of: {@link #glUniform2fv Uniform2fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform2fv(int location, int count, long value); + + /** + * Specifies the value of a single vec2 uniform variable or a vec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform2fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniform2fv(location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glUniform3fv ] --- + + /** + * Unsafe version of: {@link #glUniform3fv Uniform3fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform3fv(int location, int count, long value); + + /** + * Specifies the value of a single vec3 uniform variable or a vec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform3fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniform3fv(location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glUniform4fv ] --- + + /** + * Unsafe version of: {@link #glUniform4fv Uniform4fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform4fv(int location, int count, long value); + + /** + * Specifies the value of a single vec4 uniform variable or a vec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform4fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniform4fv(location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glUniform1iv ] --- + + /** + * Unsafe version of: {@link #glUniform1iv Uniform1iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform1iv(int location, int count, long value); + + /** + * Specifies the value of a single int uniform variable or a int uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform1iv(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglUniform1iv(location, value.remaining(), memAddress(value)); + } + + // --- [ glUniform2iv ] --- + + /** + * Unsafe version of: {@link #glUniform2iv Uniform2iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform2iv(int location, int count, long value); + + /** + * Specifies the value of a single ivec2 uniform variable or an ivec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform2iv(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglUniform2iv(location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glUniform3iv ] --- + + /** + * Unsafe version of: {@link #glUniform3iv Uniform3iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform3iv(int location, int count, long value); + + /** + * Specifies the value of a single ivec3 uniform variable or an ivec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform3iv(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglUniform3iv(location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glUniform4iv ] --- + + /** + * Unsafe version of: {@link #glUniform4iv Uniform4iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform4iv(int location, int count, long value); + + /** + * Specifies the value of a single ivec4 uniform variable or an ivec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform4iv(@NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglUniform4iv(location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glUniformMatrix2fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2fv UniformMatrix2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix2fv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat2 uniform variable or a mat2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix2fv(location, value.remaining() >> 2, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix3fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3fv UniformMatrix3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix3fv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat3 uniform variable or a mat3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix3fv(location, value.remaining() / 9, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix4fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4fv UniformMatrix4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix4fv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat4 uniform variable or a mat4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix4fv(location, value.remaining() >> 4, transpose, memAddress(value)); + } + + // --- [ glGetShaderiv ] --- + + /** Unsafe version of: {@link #glGetShaderiv GetShaderiv} */ + public static native void nglGetShaderiv(int shader, int pname, long params); + + /** + * Returns a parameter from a shader object. + * + * @param shader the shader object to be queried + * @param pname the object parameter. One of:
    {@link #GL_SHADER_TYPE SHADER_TYPE}{@link #GL_DELETE_STATUS DELETE_STATUS}{@link #GL_COMPILE_STATUS COMPILE_STATUS}{@link #GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link #GL_SHADER_SOURCE_LENGTH SHADER_SOURCE_LENGTH}
    + * @param params the requested object parameter + * + * @see Reference Page + */ + public static void glGetShaderiv(@NativeType("GLuint") int shader, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetShaderiv(shader, pname, memAddress(params)); + } + + /** + * Returns a parameter from a shader object. + * + * @param shader the shader object to be queried + * @param pname the object parameter. One of:
    {@link #GL_SHADER_TYPE SHADER_TYPE}{@link #GL_DELETE_STATUS DELETE_STATUS}{@link #GL_COMPILE_STATUS COMPILE_STATUS}{@link #GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link #GL_SHADER_SOURCE_LENGTH SHADER_SOURCE_LENGTH}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetShaderi(@NativeType("GLuint") int shader, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetShaderiv(shader, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetProgramiv ] --- + + /** Unsafe version of: {@link #glGetProgramiv GetProgramiv} */ + public static native void nglGetProgramiv(int program, int pname, long params); + + /** + * Returns a parameter from a program object. + * + * @param program the program object to be queried + * @param pname the object parameter. One of:
    {@link #GL_DELETE_STATUS DELETE_STATUS}{@link #GL_LINK_STATUS LINK_STATUS}{@link #GL_VALIDATE_STATUS VALIDATE_STATUS}
    {@link #GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link #GL_ATTACHED_SHADERS ATTACHED_SHADERS}{@link #GL_ACTIVE_ATTRIBUTES ACTIVE_ATTRIBUTES}
    {@link #GL_ACTIVE_ATTRIBUTE_MAX_LENGTH ACTIVE_ATTRIBUTE_MAX_LENGTH}{@link #GL_ACTIVE_UNIFORMS ACTIVE_UNIFORMS}{@link #GL_ACTIVE_UNIFORM_MAX_LENGTH ACTIVE_UNIFORM_MAX_LENGTH}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_MODE TRANSFORM_FEEDBACK_BUFFER_MODE}{@link GL30#GL_TRANSFORM_FEEDBACK_VARYINGS TRANSFORM_FEEDBACK_VARYINGS}{@link GL30#GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH}
    {@link GL31#GL_ACTIVE_UNIFORM_BLOCKS ACTIVE_UNIFORM_BLOCKS}{@link GL31#GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH}{@link GL32#GL_GEOMETRY_VERTICES_OUT GEOMETRY_VERTICES_OUT}
    {@link GL32#GL_GEOMETRY_INPUT_TYPE GEOMETRY_INPUT_TYPE}{@link GL32#GL_GEOMETRY_OUTPUT_TYPE GEOMETRY_OUTPUT_TYPE}{@link GL41#GL_PROGRAM_BINARY_LENGTH PROGRAM_BINARY_LENGTH}
    {@link GL42#GL_ACTIVE_ATOMIC_COUNTER_BUFFERS ACTIVE_ATOMIC_COUNTER_BUFFERS}{@link GL43#GL_COMPUTE_WORK_GROUP_SIZE COMPUTE_WORK_GROUP_SIZE}
    + * @param params the requested object parameter + * + * @see Reference Page + */ + public static void glGetProgramiv(@NativeType("GLuint") int program, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetProgramiv(program, pname, memAddress(params)); + } + + /** + * Returns a parameter from a program object. + * + * @param program the program object to be queried + * @param pname the object parameter. One of:
    {@link #GL_DELETE_STATUS DELETE_STATUS}{@link #GL_LINK_STATUS LINK_STATUS}{@link #GL_VALIDATE_STATUS VALIDATE_STATUS}
    {@link #GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link #GL_ATTACHED_SHADERS ATTACHED_SHADERS}{@link #GL_ACTIVE_ATTRIBUTES ACTIVE_ATTRIBUTES}
    {@link #GL_ACTIVE_ATTRIBUTE_MAX_LENGTH ACTIVE_ATTRIBUTE_MAX_LENGTH}{@link #GL_ACTIVE_UNIFORMS ACTIVE_UNIFORMS}{@link #GL_ACTIVE_UNIFORM_MAX_LENGTH ACTIVE_UNIFORM_MAX_LENGTH}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_MODE TRANSFORM_FEEDBACK_BUFFER_MODE}{@link GL30#GL_TRANSFORM_FEEDBACK_VARYINGS TRANSFORM_FEEDBACK_VARYINGS}{@link GL30#GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH}
    {@link GL31#GL_ACTIVE_UNIFORM_BLOCKS ACTIVE_UNIFORM_BLOCKS}{@link GL31#GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH}{@link GL32#GL_GEOMETRY_VERTICES_OUT GEOMETRY_VERTICES_OUT}
    {@link GL32#GL_GEOMETRY_INPUT_TYPE GEOMETRY_INPUT_TYPE}{@link GL32#GL_GEOMETRY_OUTPUT_TYPE GEOMETRY_OUTPUT_TYPE}{@link GL41#GL_PROGRAM_BINARY_LENGTH PROGRAM_BINARY_LENGTH}
    {@link GL42#GL_ACTIVE_ATOMIC_COUNTER_BUFFERS ACTIVE_ATOMIC_COUNTER_BUFFERS}{@link GL43#GL_COMPUTE_WORK_GROUP_SIZE COMPUTE_WORK_GROUP_SIZE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetProgrami(@NativeType("GLuint") int program, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetProgramiv(program, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetShaderInfoLog ] --- + + /** + * Unsafe version of: {@link #glGetShaderInfoLog GetShaderInfoLog} + * + * @param maxLength the size of the character buffer for storing the returned information log + */ + public static native void nglGetShaderInfoLog(int shader, int maxLength, long length, long infoLog); + + /** + * Returns the information log for a shader object. + * + * @param shader the shader object whose information log is to be queried + * @param length the length of the string returned in {@code infoLog} (excluding the null terminator) + * @param infoLog an array of characters that is used to return the information log + * + * @see Reference Page + */ + public static void glGetShaderInfoLog(@NativeType("GLuint") int shader, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer infoLog) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetShaderInfoLog(shader, infoLog.remaining(), memAddressSafe(length), memAddress(infoLog)); + } + + /** + * Returns the information log for a shader object. + * + * @param shader the shader object whose information log is to be queried + * @param maxLength the size of the character buffer for storing the returned information log + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetShaderInfoLog(@NativeType("GLuint") int shader, @NativeType("GLsizei") int maxLength) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + ByteBuffer infoLog = memAlloc(maxLength); + try { + IntBuffer length = stack.ints(0); + nglGetShaderInfoLog(shader, maxLength, memAddress(length), memAddress(infoLog)); + return memUTF8(infoLog, length.get(0)); + } finally { + memFree(infoLog); + stack.setPointer(stackPointer); + } + } + + /** + * Returns the information log for a shader object. + * + * @param shader the shader object whose information log is to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetShaderInfoLog(@NativeType("GLuint") int shader) { + return glGetShaderInfoLog(shader, glGetShaderi(shader, GL_INFO_LOG_LENGTH)); + } + + // --- [ glGetProgramInfoLog ] --- + + /** + * Unsafe version of: {@link #glGetProgramInfoLog GetProgramInfoLog} + * + * @param maxLength the size of the character buffer for storing the returned information log + */ + public static native void nglGetProgramInfoLog(int program, int maxLength, long length, long infoLog); + + /** + * Returns the information log for a program object. + * + * @param program the program object whose information log is to be queried + * @param length the length of the string returned in {@code infoLog} (excluding the null terminator) + * @param infoLog an array of characters that is used to return the information log + * + * @see Reference Page + */ + public static void glGetProgramInfoLog(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer infoLog) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetProgramInfoLog(program, infoLog.remaining(), memAddressSafe(length), memAddress(infoLog)); + } + + /** + * Returns the information log for a program object. + * + * @param program the program object whose information log is to be queried + * @param maxLength the size of the character buffer for storing the returned information log + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramInfoLog(@NativeType("GLuint") int program, @NativeType("GLsizei") int maxLength) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + ByteBuffer infoLog = memAlloc(maxLength); + try { + IntBuffer length = stack.ints(0); + nglGetProgramInfoLog(program, maxLength, memAddress(length), memAddress(infoLog)); + return memUTF8(infoLog, length.get(0)); + } finally { + memFree(infoLog); + stack.setPointer(stackPointer); + } + } + + /** + * Returns the information log for a program object. + * + * @param program the program object whose information log is to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramInfoLog(@NativeType("GLuint") int program) { + return glGetProgramInfoLog(program, glGetProgrami(program, GL_INFO_LOG_LENGTH)); + } + + // --- [ glGetAttachedShaders ] --- + + /** + * Unsafe version of: {@link #glGetAttachedShaders GetAttachedShaders} + * + * @param maxCount the size of the array for storing the returned object names + */ + public static native void nglGetAttachedShaders(int program, int maxCount, long count, long shaders); + + /** + * Returns the shader objects attached to a program object. + * + * @param program the program object to be queried + * @param count the number of names actually returned in {@code shaders} + * @param shaders an array that is used to return the names of attached shader objects + * + * @see Reference Page + */ + public static void glGetAttachedShaders(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") IntBuffer count, @NativeType("GLuint *") IntBuffer shaders) { + if (CHECKS) { + checkSafe(count, 1); + } + nglGetAttachedShaders(program, shaders.remaining(), memAddressSafe(count), memAddress(shaders)); + } + + // --- [ glGetUniformLocation ] --- + + /** Unsafe version of: {@link #glGetUniformLocation GetUniformLocation} */ + public static native int nglGetUniformLocation(int program, long name); + + /** + * Returns the location of a uniform variable. + * + * @param program the program object to be queried + * @param name a null terminated string containing the name of the uniform variable whose location is to be queried + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetUniformLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetUniformLocation(program, memAddress(name)); + } + + /** + * Returns the location of a uniform variable. + * + * @param program the program object to be queried + * @param name a null terminated string containing the name of the uniform variable whose location is to be queried + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetUniformLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetUniformLocation(program, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetActiveUniform ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniform GetActiveUniform} + * + * @param maxLength the maximum number of characters OpenGL is allowed to write in the character buffer indicated by {@code name} + */ + public static native void nglGetActiveUniform(int program, int index, int maxLength, long length, long size, long type, long name); + + /** + * Returns information about an active uniform variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the uniform variable to be queried + * @param length the number of characters actually written by OpenGL in the string indicated by {@code name} (excluding the null terminator) if a value other than NULL is passed + * @param size the size of the uniform variable + * @param type the data type of the uniform variable + * @param name a null terminated string containing the name of the uniform variable + * + * @see Reference Page + */ + public static void glGetActiveUniform(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type, @NativeType("GLchar *") ByteBuffer name) { + if (CHECKS) { + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + nglGetActiveUniform(program, index, name.remaining(), memAddressSafe(length), memAddress(size), memAddress(type), memAddress(name)); + } + + /** + * Returns information about an active uniform variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the uniform variable to be queried + * @param maxLength the maximum number of characters OpenGL is allowed to write in the character buffer indicated by {@code name} + * @param size the size of the uniform variable + * @param type the data type of the uniform variable + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniform(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLsizei") int maxLength, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + if (CHECKS) { + check(size, 1); + check(type, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer name = stack.malloc(maxLength); + nglGetActiveUniform(program, index, maxLength, memAddress(length), memAddress(size), memAddress(type), memAddress(name)); + return memASCII(name, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Returns information about an active uniform variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the uniform variable to be queried + * @param size the size of the uniform variable + * @param type the data type of the uniform variable + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniform(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return glGetActiveUniform(program, index, glGetProgrami(program, GL_ACTIVE_UNIFORM_MAX_LENGTH), size, type); + } + + // --- [ glGetUniformfv ] --- + + /** Unsafe version of: {@link #glGetUniformfv GetUniformfv} */ + public static native void nglGetUniformfv(int program, int location, long params); + + /** + * Returns the float value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + * + * @see Reference Page + */ + public static void glGetUniformfv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformfv(program, location, memAddress(params)); + } + + /** + * Returns the float value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetUniformf(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetUniformfv(program, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetUniformiv ] --- + + /** Unsafe version of: {@link #glGetUniformiv GetUniformiv} */ + public static native void nglGetUniformiv(int program, int location, long params); + + /** + * Returns the int value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + * + * @see Reference Page + */ + public static void glGetUniformiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformiv(program, location, memAddress(params)); + } + + /** + * Returns the int value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetUniformi(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetUniformiv(program, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetShaderSource ] --- + + /** + * Unsafe version of: {@link #glGetShaderSource GetShaderSource} + * + * @param maxLength the size of the character buffer for storing the returned source code string + */ + public static native void nglGetShaderSource(int shader, int maxLength, long length, long source); + + /** + * Returns the source code string from a shader object. + * + * @param shader the shader object to be queried + * @param length the length of the string returned in source (excluding the null terminator) + * @param source an array of characters that is used to return the source code string + * + * @see Reference Page + */ + public static void glGetShaderSource(@NativeType("GLuint") int shader, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer source) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetShaderSource(shader, source.remaining(), memAddressSafe(length), memAddress(source)); + } + + /** + * Returns the source code string from a shader object. + * + * @param shader the shader object to be queried + * @param maxLength the size of the character buffer for storing the returned source code string + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetShaderSource(@NativeType("GLuint") int shader, @NativeType("GLsizei") int maxLength) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + ByteBuffer source = memAlloc(maxLength); + try { + IntBuffer length = stack.ints(0); + nglGetShaderSource(shader, maxLength, memAddress(length), memAddress(source)); + return memUTF8(source, length.get(0)); + } finally { + memFree(source); + stack.setPointer(stackPointer); + } + } + + /** + * Returns the source code string from a shader object. + * + * @param shader the shader object to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetShaderSource(@NativeType("GLuint") int shader) { + return glGetShaderSource(shader, glGetShaderi(shader, GL_SHADER_SOURCE_LENGTH)); + } + + // --- [ glVertexAttrib1f ] --- + + /** + * Specifies the value of a generic vertex attribute. The y and z components are implicitly set to 0.0f and w to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * + * @see Reference Page + */ + public static native void glVertexAttrib1f(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0); + + // --- [ glVertexAttrib1s ] --- + + /** + * Short version of {@link #glVertexAttrib1f VertexAttrib1f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * + * @see Reference Page + */ + public static native void glVertexAttrib1s(@NativeType("GLuint") int index, @NativeType("GLshort") short v0); + + // --- [ glVertexAttrib1d ] --- + + /** + * Double version of {@link #glVertexAttrib1f VertexAttrib1f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * + * @see Reference Page + */ + public static native void glVertexAttrib1d(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0); + + // --- [ glVertexAttrib2f ] --- + + /** + * Specifies the value of a generic vertex attribute. The y component is implicitly set to 0.0f and w to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * + * @see Reference Page + */ + public static native void glVertexAttrib2f(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1); + + // --- [ glVertexAttrib2s ] --- + + /** + * Short version of {@link #glVertexAttrib2f VertexAttrib2f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * + * @see Reference Page + */ + public static native void glVertexAttrib2s(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1); + + // --- [ glVertexAttrib2d ] --- + + /** + * Double version of {@link #glVertexAttrib2f VertexAttrib2f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * + * @see Reference Page + */ + public static native void glVertexAttrib2d(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1); + + // --- [ glVertexAttrib3f ] --- + + /** + * Specifies the value of a generic vertex attribute. The w is implicitly set to 1.0f. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * + * @see Reference Page + */ + public static native void glVertexAttrib3f(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2); + + // --- [ glVertexAttrib3s ] --- + + /** + * Short version of {@link #glVertexAttrib3f VertexAttrib3f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * + * @see Reference Page + */ + public static native void glVertexAttrib3s(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1, @NativeType("GLshort") short v2); + + // --- [ glVertexAttrib3d ] --- + + /** + * Double version of {@link #glVertexAttrib3f VertexAttrib3f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * + * @see Reference Page + */ + public static native void glVertexAttrib3d(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1, @NativeType("GLdouble") double v2); + + // --- [ glVertexAttrib4f ] --- + + /** + * Specifies the value of a generic vertex attribute. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + * + * @see Reference Page + */ + public static native void glVertexAttrib4f(@NativeType("GLuint") int index, @NativeType("GLfloat") float v0, @NativeType("GLfloat") float v1, @NativeType("GLfloat") float v2, @NativeType("GLfloat") float v3); + + // --- [ glVertexAttrib4s ] --- + + /** + * Short version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + * + * @see Reference Page + */ + public static native void glVertexAttrib4s(@NativeType("GLuint") int index, @NativeType("GLshort") short v0, @NativeType("GLshort") short v1, @NativeType("GLshort") short v2, @NativeType("GLshort") short v3); + + // --- [ glVertexAttrib4d ] --- + + /** + * Double version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v0 the vertex attribute x component + * @param v1 the vertex attribute y component + * @param v2 the vertex attribute z component + * @param v3 the vertex attribute w component + * + * @see Reference Page + */ + public static native void glVertexAttrib4d(@NativeType("GLuint") int index, @NativeType("GLdouble") double v0, @NativeType("GLdouble") double v1, @NativeType("GLdouble") double v2, @NativeType("GLdouble") double v3); + + // --- [ glVertexAttrib4Nub ] --- + + /** + * Normalized unsigned byte version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + * + * @see Reference Page + */ + public static native void glVertexAttrib4Nub(@NativeType("GLuint") int index, @NativeType("GLubyte") byte x, @NativeType("GLubyte") byte y, @NativeType("GLubyte") byte z, @NativeType("GLubyte") byte w); + + // --- [ glVertexAttrib1fv ] --- + + /** Unsafe version of: {@link #glVertexAttrib1fv VertexAttrib1fv} */ + public static native void nglVertexAttrib1fv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib1f VertexAttrib1f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib1fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttrib1fv(index, memAddress(v)); + } + + // --- [ glVertexAttrib1sv ] --- + + /** Unsafe version of: {@link #glVertexAttrib1sv VertexAttrib1sv} */ + public static native void nglVertexAttrib1sv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib1s VertexAttrib1s}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib1sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttrib1sv(index, memAddress(v)); + } + + // --- [ glVertexAttrib1dv ] --- + + /** Unsafe version of: {@link #glVertexAttrib1dv VertexAttrib1dv} */ + public static native void nglVertexAttrib1dv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib1d VertexAttrib1d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib1dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttrib1dv(index, memAddress(v)); + } + + // --- [ glVertexAttrib2fv ] --- + + /** Unsafe version of: {@link #glVertexAttrib2fv VertexAttrib2fv} */ + public static native void nglVertexAttrib2fv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib2f VertexAttrib2f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib2fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttrib2fv(index, memAddress(v)); + } + + // --- [ glVertexAttrib2sv ] --- + + /** Unsafe version of: {@link #glVertexAttrib2sv VertexAttrib2sv} */ + public static native void nglVertexAttrib2sv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib2s VertexAttrib2s}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib2sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttrib2sv(index, memAddress(v)); + } + + // --- [ glVertexAttrib2dv ] --- + + /** Unsafe version of: {@link #glVertexAttrib2dv VertexAttrib2dv} */ + public static native void nglVertexAttrib2dv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib2d VertexAttrib2d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib2dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttrib2dv(index, memAddress(v)); + } + + // --- [ glVertexAttrib3fv ] --- + + /** Unsafe version of: {@link #glVertexAttrib3fv VertexAttrib3fv} */ + public static native void nglVertexAttrib3fv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib3f VertexAttrib3f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib3fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttrib3fv(index, memAddress(v)); + } + + // --- [ glVertexAttrib3sv ] --- + + /** Unsafe version of: {@link #glVertexAttrib3sv VertexAttrib3sv} */ + public static native void nglVertexAttrib3sv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib3s VertexAttrib3s}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib3sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttrib3sv(index, memAddress(v)); + } + + // --- [ glVertexAttrib3dv ] --- + + /** Unsafe version of: {@link #glVertexAttrib3dv VertexAttrib3dv} */ + public static native void nglVertexAttrib3dv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib3d VertexAttrib3d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib3dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttrib3dv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4fv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4fv VertexAttrib4fv} */ + public static native void nglVertexAttrib4fv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4fv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4sv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4sv VertexAttrib4sv} */ + public static native void nglVertexAttrib4sv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib4s VertexAttrib4s}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4sv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4dv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4dv VertexAttrib4dv} */ + public static native void nglVertexAttrib4dv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib4d VertexAttrib4d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4dv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4iv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4iv VertexAttrib4iv} */ + public static native void nglVertexAttrib4iv(int index, long v); + + /** + * Integer pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4iv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4iv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4bv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4bv VertexAttrib4bv} */ + public static native void nglVertexAttrib4bv(int index, long v); + + /** + * Byte pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4bv(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4bv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4ubv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4ubv VertexAttrib4ubv} */ + public static native void nglVertexAttrib4ubv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttrib4Nub VertexAttrib4Nub}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4ubv(@NativeType("GLuint") int index, @NativeType("GLubyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4ubv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4usv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4usv VertexAttrib4usv} */ + public static native void nglVertexAttrib4usv(int index, long v); + + /** + * Unsigned short pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4usv(@NativeType("GLuint") int index, @NativeType("GLushort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4usv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4uiv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4uiv VertexAttrib4uiv} */ + public static native void nglVertexAttrib4uiv(int index, long v); + + /** + * Unsigned int pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4uiv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4Nbv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Nbv VertexAttrib4Nbv} */ + public static native void nglVertexAttrib4Nbv(int index, long v); + + /** + * Normalized byte pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Nbv(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4Nbv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4Nsv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Nsv VertexAttrib4Nsv} */ + public static native void nglVertexAttrib4Nsv(int index, long v); + + /** + * Normalized short pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Nsv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4Nsv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4Niv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Niv VertexAttrib4Niv} */ + public static native void nglVertexAttrib4Niv(int index, long v); + + /** + * Normalized int pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Niv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4Niv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4Nubv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Nubv VertexAttrib4Nubv} */ + public static native void nglVertexAttrib4Nubv(int index, long v); + + /** + * Normalized unsigned byte pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Nubv(@NativeType("GLuint") int index, @NativeType("GLubyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4Nubv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4Nusv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Nusv VertexAttrib4Nusv} */ + public static native void nglVertexAttrib4Nusv(int index, long v); + + /** + * Normalized unsigned short pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Nusv(@NativeType("GLuint") int index, @NativeType("GLushort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4Nusv(index, memAddress(v)); + } + + // --- [ glVertexAttrib4Nuiv ] --- + + /** Unsafe version of: {@link #glVertexAttrib4Nuiv VertexAttrib4Nuiv} */ + public static native void nglVertexAttrib4Nuiv(int index, long v); + + /** + * Normalized unsigned int pointer version of {@link #glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttrib4Nuiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4Nuiv(index, memAddress(v)); + } + + // --- [ glVertexAttribPointer ] --- + + /** Unsafe version of: {@link #glVertexAttribPointer VertexAttribPointer} */ + public static native void nglVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long pointer); + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglVertexAttribPointer(index, size, type, normalized, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglVertexAttribPointer(index, size, type, normalized, stride, pointer); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglVertexAttribPointer(index, size, type, normalized, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglVertexAttribPointer(index, size, type, normalized, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. The initial value is GL_FLOAT. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL11#GL_DOUBLE DOUBLE}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}{@link GL33#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL41#GL_FIXED FIXED}
    + * @param normalized whether fixed-point data values should be normalized or converted directly as fixed-point values when they are accessed + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride, @NativeType("void const *") FloatBuffer pointer) { + nglVertexAttribPointer(index, size, type, normalized, stride, memAddress(pointer)); + } + + // --- [ glEnableVertexAttribArray ] --- + + /** + * Enables a generic vertex attribute array. + * + * @param index the index of the generic vertex attribute to be enabled + * + * @see Reference Page + */ + public static native void glEnableVertexAttribArray(@NativeType("GLuint") int index); + + // --- [ glDisableVertexAttribArray ] --- + + /** + * Disables a generic vertex attribute array. + * + * @param index the index of the generic vertex attribute to be disabled + * + * @see Reference Page + */ + public static native void glDisableVertexAttribArray(@NativeType("GLuint") int index); + + // --- [ glBindAttribLocation ] --- + + /** Unsafe version of: {@link #glBindAttribLocation BindAttribLocation} */ + public static native void nglBindAttribLocation(int program, int index, long name); + + /** + * Associates a generic vertex attribute index with a named attribute variable. + * + * @param program the program object in which the association is to be made + * @param index the index of the generic vertex attribute to be bound + * @param name a null terminated string containing the name of the vertex shader attribute variable to which {@code index} is to be bound + * + * @see Reference Page + */ + public static void glBindAttribLocation(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + nglBindAttribLocation(program, index, memAddress(name)); + } + + /** + * Associates a generic vertex attribute index with a named attribute variable. + * + * @param program the program object in which the association is to be made + * @param index the index of the generic vertex attribute to be bound + * @param name a null terminated string containing the name of the vertex shader attribute variable to which {@code index} is to be bound + * + * @see Reference Page + */ + public static void glBindAttribLocation(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + nglBindAttribLocation(program, index, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetActiveAttrib ] --- + + /** + * Unsafe version of: {@link #glGetActiveAttrib GetActiveAttrib} + * + * @param maxLength the maximum number of characters OpenGL is allowed to write in the character buffer indicated by {@code name} + */ + public static native void nglGetActiveAttrib(int program, int index, int maxLength, long length, long size, long type, long name); + + /** + * Returns information about an active attribute variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the attribute variable to be queried + * @param length the number of characters actually written by OpenGL in the string indicated by {@code name} (excluding the null terminator) if a value other than + * {@code NULL} is passed + * @param size the size of the attribute variable + * @param type the data type of the attribute variable + * @param name a null terminated string containing the name of the attribute variable + * + * @see Reference Page + */ + public static void glGetActiveAttrib(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type, @NativeType("GLchar *") ByteBuffer name) { + if (CHECKS) { + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + nglGetActiveAttrib(program, index, name.remaining(), memAddressSafe(length), memAddress(size), memAddress(type), memAddress(name)); + } + + /** + * Returns information about an active attribute variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the attribute variable to be queried + * @param maxLength the maximum number of characters OpenGL is allowed to write in the character buffer indicated by {@code name} + * @param size the size of the attribute variable + * @param type the data type of the attribute variable + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveAttrib(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLsizei") int maxLength, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + if (CHECKS) { + check(size, 1); + check(type, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer name = stack.malloc(maxLength); + nglGetActiveAttrib(program, index, maxLength, memAddress(length), memAddress(size), memAddress(type), memAddress(name)); + return memASCII(name, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Returns information about an active attribute variable for the specified program object. + * + * @param program the program object to be queried + * @param index the index of the attribute variable to be queried + * @param size the size of the attribute variable + * @param type the data type of the attribute variable + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveAttrib(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return glGetActiveAttrib(program, index, glGetProgrami(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), size, type); + } + + // --- [ glGetAttribLocation ] --- + + /** Unsafe version of: {@link #glGetAttribLocation GetAttribLocation} */ + public static native int nglGetAttribLocation(int program, long name); + + /** + * Returns the location of an attribute variable. + * + * @param program the program object to be queried + * @param name a null terminated string containing the name of the attribute variable whose location is to be queried + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetAttribLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetAttribLocation(program, memAddress(name)); + } + + /** + * Returns the location of an attribute variable. + * + * @param program the program object to be queried + * @param name a null terminated string containing the name of the attribute variable whose location is to be queried + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetAttribLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetAttribLocation(program, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexAttribiv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribiv GetVertexAttribiv} */ + public static native void nglGetVertexAttribiv(int index, int pname, long params); + + /** + * Returns the integer value of a generic vertex attribute parameter. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried. One of:
    {@link GL15#GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING VERTEX_ATTRIB_ARRAY_BUFFER_BINDING}{@link #GL_VERTEX_ATTRIB_ARRAY_ENABLED VERTEX_ATTRIB_ARRAY_ENABLED}
    {@link #GL_VERTEX_ATTRIB_ARRAY_SIZE VERTEX_ATTRIB_ARRAY_SIZE}{@link #GL_VERTEX_ATTRIB_ARRAY_STRIDE VERTEX_ATTRIB_ARRAY_STRIDE}
    {@link #GL_VERTEX_ATTRIB_ARRAY_TYPE VERTEX_ATTRIB_ARRAY_TYPE}{@link #GL_VERTEX_ATTRIB_ARRAY_NORMALIZED VERTEX_ATTRIB_ARRAY_NORMALIZED}
    {@link #GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}
    + * @param params returns the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetVertexAttribiv(index, pname, memAddress(params)); + } + + /** + * Returns the integer value of a generic vertex attribute parameter. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried. One of:
    {@link GL15#GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING VERTEX_ATTRIB_ARRAY_BUFFER_BINDING}{@link #GL_VERTEX_ATTRIB_ARRAY_ENABLED VERTEX_ATTRIB_ARRAY_ENABLED}
    {@link #GL_VERTEX_ATTRIB_ARRAY_SIZE VERTEX_ATTRIB_ARRAY_SIZE}{@link #GL_VERTEX_ATTRIB_ARRAY_STRIDE VERTEX_ATTRIB_ARRAY_STRIDE}
    {@link #GL_VERTEX_ATTRIB_ARRAY_TYPE VERTEX_ATTRIB_ARRAY_TYPE}{@link #GL_VERTEX_ATTRIB_ARRAY_NORMALIZED VERTEX_ATTRIB_ARRAY_NORMALIZED}
    {@link #GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetVertexAttribi(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetVertexAttribiv(index, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexAttribfv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribfv GetVertexAttribfv} */ + public static native void nglGetVertexAttribfv(int index, int pname, long params); + + /** + * Float version of {@link #glGetVertexAttribiv GetVertexAttribiv}. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params returns the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribfv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetVertexAttribfv(index, pname, memAddress(params)); + } + + // --- [ glGetVertexAttribdv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribdv GetVertexAttribdv} */ + public static native void nglGetVertexAttribdv(int index, int pname, long params); + + /** + * Double version of {@link #glGetVertexAttribiv GetVertexAttribiv}. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params returns the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribdv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetVertexAttribdv(index, pname, memAddress(params)); + } + + // --- [ glGetVertexAttribPointerv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribPointerv GetVertexAttribPointerv} */ + public static native void nglGetVertexAttribPointerv(int index, int pname, long pointer); + + /** + * Returns the address of the specified generic vertex attribute pointer. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the generic vertex attribute parameter to be returned. Must be:
    {@link #GL_VERTEX_ATTRIB_ARRAY_POINTER VERTEX_ATTRIB_ARRAY_POINTER}
    + * @param pointer the pointer value + * + * @see Reference Page + */ + public static void glGetVertexAttribPointerv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer pointer) { + if (CHECKS) { + check(pointer, 1); + } + nglGetVertexAttribPointerv(index, pname, memAddress(pointer)); + } + + /** + * Returns the address of the specified generic vertex attribute pointer. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the generic vertex attribute parameter to be returned. Must be:
    {@link #GL_VERTEX_ATTRIB_ARRAY_POINTER VERTEX_ATTRIB_ARRAY_POINTER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetVertexAttribPointer(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer pointer = stack.callocPointer(1); + nglGetVertexAttribPointerv(index, pname, memAddress(pointer)); + return pointer.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDrawBuffers ] --- + + /** + * Unsafe version of: {@link #glDrawBuffers DrawBuffers} + * + * @param n the number of buffers in {@code bufs} + */ + public static native void nglDrawBuffers(int n, long bufs); + + /** + * Specifies a list of color buffers to be drawn into. + * + * @param bufs an array of symbolic constants specifying the buffers into which fragment colors or data values will be written. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}
    GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static void glDrawBuffers(@NativeType("GLenum const *") IntBuffer bufs) { + nglDrawBuffers(bufs.remaining(), memAddress(bufs)); + } + + /** + * Specifies a list of color buffers to be drawn into. + * + * @see Reference Page + */ + public static void glDrawBuffers(@NativeType("GLenum const *") int buf) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer bufs = stack.ints(buf); + nglDrawBuffers(1, memAddress(bufs)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glBlendEquationSeparate ] --- + + /** + * Sets the RGB blend equation and the alpha blend equation separately. + * + * @param modeRGB the RGB blend equation, how the red, green, and blue components of the source and destination colors are combined. One of:
    {@link GL14#GL_FUNC_ADD FUNC_ADD}{@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14#GL_MIN MIN}{@link GL14#GL_MAX MAX}
    + * @param modeAlpha the alpha blend equation, how the alpha component of the source and destination colors are combined + * + * @see Reference Page + */ + public static native void glBlendEquationSeparate(@NativeType("GLenum") int modeRGB, @NativeType("GLenum") int modeAlpha); + + // --- [ glStencilOpSeparate ] --- + + /** + * Sets front and/or back stencil test actions. + * + * @param face whether front and/or back stencil state is updated. One of:
    {@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param sfail the action to take when the stencil test fails. The initial value is GL_KEEP. One of:
    {@link GL11#GL_KEEP KEEP}{@link GL11#GL_ZERO ZERO}{@link GL11#GL_REPLACE REPLACE}{@link GL11#GL_INCR INCR}{@link GL14#GL_INCR_WRAP INCR_WRAP}{@link GL11#GL_DECR DECR}{@link GL14#GL_DECR_WRAP DECR_WRAP}{@link GL11#GL_INVERT INVERT}
    + * @param dpfail the stencil action when the stencil test passes, but the depth test fails. The initial value is GL_KEEP + * @param dppass the stencil action when both the stencil test and the depth test pass, or when the stencil test passes and either there is no depth buffer or depth + * testing is not enabled. The initial value is GL_KEEP + * + * @see Reference Page + */ + public static native void glStencilOpSeparate(@NativeType("GLenum") int face, @NativeType("GLenum") int sfail, @NativeType("GLenum") int dpfail, @NativeType("GLenum") int dppass); + + // --- [ glStencilFuncSeparate ] --- + + /** + * Sets front and/or back function and reference value for stencil testing. + * + * @param face whether front and/or back stencil state is updated. One of:
    {@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param func the test function. The initial value is GL_ALWAYS. One of:
    {@link GL11#GL_NEVER NEVER}{@link GL11#GL_LESS LESS}{@link GL11#GL_LEQUAL LEQUAL}{@link GL11#GL_GREATER GREATER}{@link GL11#GL_GEQUAL GEQUAL}{@link GL11#GL_EQUAL EQUAL}{@link GL11#GL_NOTEQUAL NOTEQUAL}{@link GL11#GL_ALWAYS ALWAYS}
    + * @param ref the reference value for the stencil test. {@code ref} is clamped to the range [0, 2n – 1], where {@code n} is the number of bitplanes in the stencil + * buffer. The initial value is 0. + * @param mask a mask that is ANDed with both the reference value and the stored stencil value when the test is done. The initial value is all 1's. + * + * @see Reference Page + */ + public static native void glStencilFuncSeparate(@NativeType("GLenum") int face, @NativeType("GLenum") int func, @NativeType("GLint") int ref, @NativeType("GLuint") int mask); + + // --- [ glStencilMaskSeparate ] --- + + /** + * Controls the front and/or back writing of individual bits in the stencil planes. + * + * @param face whether front and/or back stencil writemask is updated. One of:
    {@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}
    + * @param mask a bit mask to enable and disable writing of individual bits in the stencil planes. Initially, the mask is all 1's. + * + * @see Reference Page + */ + public static native void glStencilMaskSeparate(@NativeType("GLenum") int face, @NativeType("GLuint") int mask); + + /** + * Array version of: {@link #glShaderSource ShaderSource} + * + * @see Reference Page + */ + public static void glShaderSource(@NativeType("GLuint") int shader, @NativeType("GLchar const * const *") PointerBuffer strings, @Nullable @NativeType("GLint const *") int[] length) { + long __functionAddress = GL.getICD().glShaderSource; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, strings.remaining()); + } + callPPV(shader, strings.remaining(), memAddress(strings), length, __functionAddress); + } + + /** + * Array version of: {@link #glUniform1fv Uniform1fv} + * + * @see Reference Page + */ + public static void glUniform1fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniform1fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform2fv Uniform2fv} + * + * @see Reference Page + */ + public static void glUniform2fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniform2fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 1, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform3fv Uniform3fv} + * + * @see Reference Page + */ + public static void glUniform3fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniform3fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 3, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform4fv Uniform4fv} + * + * @see Reference Page + */ + public static void glUniform4fv(@NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniform4fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform1iv Uniform1iv} + * + * @see Reference Page + */ + public static void glUniform1iv(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform1iv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform2iv Uniform2iv} + * + * @see Reference Page + */ + public static void glUniform2iv(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform2iv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 1, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform3iv Uniform3iv} + * + * @see Reference Page + */ + public static void glUniform3iv(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform3iv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 3, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform4iv Uniform4iv} + * + * @see Reference Page + */ + public static void glUniform4iv(@NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform4iv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix2fv UniformMatrix2fv} + * + * @see Reference Page + */ + public static void glUniformMatrix2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix2fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix3fv UniformMatrix3fv} + * + * @see Reference Page + */ + public static void glUniformMatrix3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix3fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 9, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix4fv UniformMatrix4fv} + * + * @see Reference Page + */ + public static void glUniformMatrix4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix4fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 4, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glGetShaderiv GetShaderiv} + * + * @see Reference Page + */ + public static void glGetShaderiv(@NativeType("GLuint") int shader, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetShaderiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(shader, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetProgramiv GetProgramiv} + * + * @see Reference Page + */ + public static void glGetProgramiv(@NativeType("GLuint") int program, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetProgramiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetShaderInfoLog GetShaderInfoLog} + * + * @see Reference Page + */ + public static void glGetShaderInfoLog(@NativeType("GLuint") int shader, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer infoLog) { + long __functionAddress = GL.getICD().glGetShaderInfoLog; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(shader, infoLog.remaining(), length, memAddress(infoLog), __functionAddress); + } + + /** + * Array version of: {@link #glGetProgramInfoLog GetProgramInfoLog} + * + * @see Reference Page + */ + public static void glGetProgramInfoLog(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer infoLog) { + long __functionAddress = GL.getICD().glGetProgramInfoLog; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(program, infoLog.remaining(), length, memAddress(infoLog), __functionAddress); + } + + /** + * Array version of: {@link #glGetAttachedShaders GetAttachedShaders} + * + * @see Reference Page + */ + public static void glGetAttachedShaders(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") int[] count, @NativeType("GLuint *") int[] shaders) { + long __functionAddress = GL.getICD().glGetAttachedShaders; + if (CHECKS) { + check(__functionAddress); + checkSafe(count, 1); + } + callPPV(program, shaders.length, count, shaders, __functionAddress); + } + + /** + * Array version of: {@link #glGetActiveUniform GetActiveUniform} + * + * @see Reference Page + */ + public static void glGetActiveUniform(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] size, @NativeType("GLenum *") int[] type, @NativeType("GLchar *") ByteBuffer name) { + long __functionAddress = GL.getICD().glGetActiveUniform; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + callPPPPV(program, index, name.remaining(), length, size, type, memAddress(name), __functionAddress); + } + + /** + * Array version of: {@link #glGetUniformfv GetUniformfv} + * + * @see Reference Page + */ + public static void glGetUniformfv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetUniformfv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, location, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetUniformiv GetUniformiv} + * + * @see Reference Page + */ + public static void glGetUniformiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetUniformiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, location, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetShaderSource GetShaderSource} + * + * @see Reference Page + */ + public static void glGetShaderSource(@NativeType("GLuint") int shader, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer source) { + long __functionAddress = GL.getICD().glGetShaderSource; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(shader, source.remaining(), length, memAddress(source), __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib1fv VertexAttrib1fv} + * + * @see Reference Page + */ + public static void glVertexAttrib1fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glVertexAttrib1fv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib1sv VertexAttrib1sv} + * + * @see Reference Page + */ + public static void glVertexAttrib1sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib1sv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib1dv VertexAttrib1dv} + * + * @see Reference Page + */ + public static void glVertexAttrib1dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttrib1dv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib2fv VertexAttrib2fv} + * + * @see Reference Page + */ + public static void glVertexAttrib2fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glVertexAttrib2fv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib2sv VertexAttrib2sv} + * + * @see Reference Page + */ + public static void glVertexAttrib2sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib2sv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib2dv VertexAttrib2dv} + * + * @see Reference Page + */ + public static void glVertexAttrib2dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttrib2dv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib3fv VertexAttrib3fv} + * + * @see Reference Page + */ + public static void glVertexAttrib3fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glVertexAttrib3fv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib3sv VertexAttrib3sv} + * + * @see Reference Page + */ + public static void glVertexAttrib3sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib3sv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib3dv VertexAttrib3dv} + * + * @see Reference Page + */ + public static void glVertexAttrib3dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttrib3dv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib4fv VertexAttrib4fv} + * + * @see Reference Page + */ + public static void glVertexAttrib4fv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4fv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib4sv VertexAttrib4sv} + * + * @see Reference Page + */ + public static void glVertexAttrib4sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4sv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib4dv VertexAttrib4dv} + * + * @see Reference Page + */ + public static void glVertexAttrib4dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4dv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib4iv VertexAttrib4iv} + * + * @see Reference Page + */ + public static void glVertexAttrib4iv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4iv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib4usv VertexAttrib4usv} + * + * @see Reference Page + */ + public static void glVertexAttrib4usv(@NativeType("GLuint") int index, @NativeType("GLushort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4usv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib4uiv VertexAttrib4uiv} + * + * @see Reference Page + */ + public static void glVertexAttrib4uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4uiv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib4Nsv VertexAttrib4Nsv} + * + * @see Reference Page + */ + public static void glVertexAttrib4Nsv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4Nsv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib4Niv VertexAttrib4Niv} + * + * @see Reference Page + */ + public static void glVertexAttrib4Niv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4Niv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib4Nusv VertexAttrib4Nusv} + * + * @see Reference Page + */ + public static void glVertexAttrib4Nusv(@NativeType("GLuint") int index, @NativeType("GLushort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4Nusv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttrib4Nuiv VertexAttrib4Nuiv} + * + * @see Reference Page + */ + public static void glVertexAttrib4Nuiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4Nuiv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glGetActiveAttrib GetActiveAttrib} + * + * @see Reference Page + */ + public static void glGetActiveAttrib(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] size, @NativeType("GLenum *") int[] type, @NativeType("GLchar *") ByteBuffer name) { + long __functionAddress = GL.getICD().glGetActiveAttrib; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + callPPPPV(program, index, name.remaining(), length, size, type, memAddress(name), __functionAddress); + } + + /** + * Array version of: {@link #glGetVertexAttribiv GetVertexAttribiv} + * + * @see Reference Page + */ + public static void glGetVertexAttribiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(index, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetVertexAttribfv GetVertexAttribfv} + * + * @see Reference Page + */ + public static void glGetVertexAttribfv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(index, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetVertexAttribdv GetVertexAttribdv} + * + * @see Reference Page + */ + public static void glGetVertexAttribdv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribdv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(index, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glDrawBuffers DrawBuffers} + * + * @see Reference Page + */ + public static void glDrawBuffers(@NativeType("GLenum const *") int[] bufs) { + long __functionAddress = GL.getICD().glDrawBuffers; + if (CHECKS) { + check(__functionAddress); + } + callPV(bufs.length, bufs, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL21.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL21.java new file mode 100644 index 000000000..a96100bf4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL21.java @@ -0,0 +1,270 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 2.1. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 2.1 implementations must support at least revision 1.20 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL21 extends GL20 { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_CURRENT_RASTER_SECONDARY_COLOR = 0x845F; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_FLOAT_MAT2x3 = 0x8B65, + GL_FLOAT_MAT2x4 = 0x8B66, + GL_FLOAT_MAT3x2 = 0x8B67, + GL_FLOAT_MAT3x4 = 0x8B68, + GL_FLOAT_MAT4x2 = 0x8B69, + GL_FLOAT_MAT4x3 = 0x8B6A; + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferParameteriv, and + * GetBufferPointerv. + */ + public static final int + GL_PIXEL_PACK_BUFFER = 0x88EB, + GL_PIXEL_UNPACK_BUFFER = 0x88EC; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_PIXEL_PACK_BUFFER_BINDING = 0x88ED, + GL_PIXEL_UNPACK_BUFFER_BINDING = 0x88EF; + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D. */ + public static final int + GL_SRGB = 0x8C40, + GL_SRGB8 = 0x8C41, + GL_SRGB_ALPHA = 0x8C42, + GL_SRGB8_ALPHA8 = 0x8C43, + GL_SLUMINANCE_ALPHA = 0x8C44, + GL_SLUMINANCE8_ALPHA8 = 0x8C45, + GL_SLUMINANCE = 0x8C46, + GL_SLUMINANCE8 = 0x8C47, + GL_COMPRESSED_SRGB = 0x8C48, + GL_COMPRESSED_SRGB_ALPHA = 0x8C49, + GL_COMPRESSED_SLUMINANCE = 0x8C4A, + GL_COMPRESSED_SLUMINANCE_ALPHA = 0x8C4B; + + protected GL21() { + throw new UnsupportedOperationException(); + } + + // --- [ glUniformMatrix2x3fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2x3fv UniformMatrix2x3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix2x3fv(int location, int count, boolean transpose, long value) { + GL21C.nglUniformMatrix2x3fv(location, count, transpose, value); + } + + /** + * Specifies the value of a single mat2x3 uniform variable or a mat2x3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix2x3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL21C.glUniformMatrix2x3fv(location, transpose, value); + } + + // --- [ glUniformMatrix3x2fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3x2fv UniformMatrix3x2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix3x2fv(int location, int count, boolean transpose, long value) { + GL21C.nglUniformMatrix3x2fv(location, count, transpose, value); + } + + /** + * Specifies the value of a single mat3x2 uniform variable or a mat3x2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix3x2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL21C.glUniformMatrix3x2fv(location, transpose, value); + } + + // --- [ glUniformMatrix2x4fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2x4fv UniformMatrix2x4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix2x4fv(int location, int count, boolean transpose, long value) { + GL21C.nglUniformMatrix2x4fv(location, count, transpose, value); + } + + /** + * Specifies the value of a single mat2x4 uniform variable or a mat2x4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix2x4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL21C.glUniformMatrix2x4fv(location, transpose, value); + } + + // --- [ glUniformMatrix4x2fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4x2fv UniformMatrix4x2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix4x2fv(int location, int count, boolean transpose, long value) { + GL21C.nglUniformMatrix4x2fv(location, count, transpose, value); + } + + /** + * Specifies the value of a single mat4x2 uniform variable or a mat4x2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix4x2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL21C.glUniformMatrix4x2fv(location, transpose, value); + } + + // --- [ glUniformMatrix3x4fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3x4fv UniformMatrix3x4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix3x4fv(int location, int count, boolean transpose, long value) { + GL21C.nglUniformMatrix3x4fv(location, count, transpose, value); + } + + /** + * Specifies the value of a single mat3x4 uniform variable or a mat3x4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix3x4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL21C.glUniformMatrix3x4fv(location, transpose, value); + } + + // --- [ glUniformMatrix4x3fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4x3fv UniformMatrix4x3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix4x3fv(int location, int count, boolean transpose, long value) { + GL21C.nglUniformMatrix4x3fv(location, count, transpose, value); + } + + /** + * Specifies the value of a single mat4x3 uniform variable or a mat4x3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix4x3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL21C.glUniformMatrix4x3fv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix2x3fv UniformMatrix2x3fv} + * + * @see Reference Page + */ + public static void glUniformMatrix2x3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL21C.glUniformMatrix2x3fv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix3x2fv UniformMatrix3x2fv} + * + * @see Reference Page + */ + public static void glUniformMatrix3x2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL21C.glUniformMatrix3x2fv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix2x4fv UniformMatrix2x4fv} + * + * @see Reference Page + */ + public static void glUniformMatrix2x4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL21C.glUniformMatrix2x4fv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix4x2fv UniformMatrix4x2fv} + * + * @see Reference Page + */ + public static void glUniformMatrix4x2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL21C.glUniformMatrix4x2fv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix3x4fv UniformMatrix3x4fv} + * + * @see Reference Page + */ + public static void glUniformMatrix3x4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL21C.glUniformMatrix3x4fv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix4x3fv UniformMatrix4x3fv} + * + * @see Reference Page + */ + public static void glUniformMatrix4x3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL21C.glUniformMatrix4x3fv(location, transpose, value); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL21C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL21C.java new file mode 100644 index 000000000..c8fb24917 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL21C.java @@ -0,0 +1,277 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality of a forward compatible context, up to version 2.1. + * + *

    OpenGL 2.1 implementations must support at least revision 1.20 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL21C extends GL20C { + + static { GL.initialize(); } + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_FLOAT_MAT2x3 = 0x8B65, + GL_FLOAT_MAT2x4 = 0x8B66, + GL_FLOAT_MAT3x2 = 0x8B67, + GL_FLOAT_MAT3x4 = 0x8B68, + GL_FLOAT_MAT4x2 = 0x8B69, + GL_FLOAT_MAT4x3 = 0x8B6A; + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferParameteriv, and + * GetBufferPointerv. + */ + public static final int + GL_PIXEL_PACK_BUFFER = 0x88EB, + GL_PIXEL_UNPACK_BUFFER = 0x88EC; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_PIXEL_PACK_BUFFER_BINDING = 0x88ED, + GL_PIXEL_UNPACK_BUFFER_BINDING = 0x88EF; + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D. */ + public static final int + GL_SRGB = 0x8C40, + GL_SRGB8 = 0x8C41, + GL_SRGB_ALPHA = 0x8C42, + GL_SRGB8_ALPHA8 = 0x8C43, + GL_COMPRESSED_SRGB = 0x8C48, + GL_COMPRESSED_SRGB_ALPHA = 0x8C49; + + protected GL21C() { + throw new UnsupportedOperationException(); + } + + // --- [ glUniformMatrix2x3fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2x3fv UniformMatrix2x3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix2x3fv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat2x3 uniform variable or a mat2x3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix2x3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix2x3fv(location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix3x2fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3x2fv UniformMatrix3x2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix3x2fv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat3x2 uniform variable or a mat3x2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix3x2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix3x2fv(location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix2x4fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2x4fv UniformMatrix2x4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix2x4fv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat2x4 uniform variable or a mat2x4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix2x4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix2x4fv(location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix4x2fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4x2fv UniformMatrix4x2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix4x2fv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat4x2 uniform variable or a mat4x2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix4x2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix4x2fv(location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix3x4fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3x4fv UniformMatrix3x4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix3x4fv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat3x4 uniform variable or a mat3x4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix3x4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix3x4fv(location, value.remaining() / 12, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix4x3fv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4x3fv UniformMatrix4x3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix4x3fv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat4x3 uniform variable or a mat4x3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniformMatrix4x3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglUniformMatrix4x3fv(location, value.remaining() / 12, transpose, memAddress(value)); + } + + /** + * Array version of: {@link #glUniformMatrix2x3fv UniformMatrix2x3fv} + * + * @see Reference Page + */ + public static void glUniformMatrix2x3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix2x3fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 6, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix3x2fv UniformMatrix3x2fv} + * + * @see Reference Page + */ + public static void glUniformMatrix3x2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix3x2fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 6, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix2x4fv UniformMatrix2x4fv} + * + * @see Reference Page + */ + public static void glUniformMatrix2x4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix2x4fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 3, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix4x2fv UniformMatrix4x2fv} + * + * @see Reference Page + */ + public static void glUniformMatrix4x2fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix4x2fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 3, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix3x4fv UniformMatrix3x4fv} + * + * @see Reference Page + */ + public static void glUniformMatrix3x4fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix3x4fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 12, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix4x3fv UniformMatrix4x3fv} + * + * @see Reference Page + */ + public static void glUniformMatrix4x3fv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glUniformMatrix4x3fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 12, transpose, value, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL30.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL30.java new file mode 100644 index 000000000..0e5f3159a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL30.java @@ -0,0 +1,2669 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 3.0. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 3.0 implementations are guaranteed to support at least versions 1.10, 1.20 and 1.30 of the shading language, although versions 1.10 and 1.20 are + * deprecated in a forward-compatible context.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL30 extends GL21 { + + static { GL.initialize(); } + + /** GetTarget */ + public static final int + GL_MAJOR_VERSION = 0x821B, + GL_MINOR_VERSION = 0x821C, + GL_NUM_EXTENSIONS = 0x821D, + GL_CONTEXT_FLAGS = 0x821E, + GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT = 0x1; + + /** Renamed tokens. */ + public static final int + GL_COMPARE_REF_TO_TEXTURE = GL14.GL_COMPARE_R_TO_TEXTURE, + GL_CLIP_DISTANCE0 = GL11.GL_CLIP_PLANE0, + GL_CLIP_DISTANCE1 = GL11.GL_CLIP_PLANE1, + GL_CLIP_DISTANCE2 = GL11.GL_CLIP_PLANE2, + GL_CLIP_DISTANCE3 = GL11.GL_CLIP_PLANE3, + GL_CLIP_DISTANCE4 = GL11.GL_CLIP_PLANE4, + GL_CLIP_DISTANCE5 = GL11.GL_CLIP_PLANE5, + GL_CLIP_DISTANCE6 = 0x3006, + GL_CLIP_DISTANCE7 = 0x3007, + GL_MAX_CLIP_DISTANCES = GL11.GL_MAX_CLIP_PLANES, + GL_MAX_VARYING_COMPONENTS = GL20.GL_MAX_VARYING_FLOATS; + + /** Accepted by the {@code pname} parameters of GetVertexAttribdv, GetVertexAttribfv, GetVertexAttribiv, GetVertexAttribIuiv and GetVertexAttribIiv. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_1D_ARRAY = 0x8DC0, + GL_SAMPLER_2D_ARRAY = 0x8DC1, + GL_SAMPLER_1D_ARRAY_SHADOW = 0x8DC3, + GL_SAMPLER_2D_ARRAY_SHADOW = 0x8DC4, + GL_SAMPLER_CUBE_SHADOW = 0x8DC5, + GL_UNSIGNED_INT_VEC2 = 0x8DC6, + GL_UNSIGNED_INT_VEC3 = 0x8DC7, + GL_UNSIGNED_INT_VEC4 = 0x8DC8, + GL_INT_SAMPLER_1D = 0x8DC9, + GL_INT_SAMPLER_2D = 0x8DCA, + GL_INT_SAMPLER_3D = 0x8DCB, + GL_INT_SAMPLER_CUBE = 0x8DCC, + GL_INT_SAMPLER_1D_ARRAY = 0x8DCE, + GL_INT_SAMPLER_2D_ARRAY = 0x8DCF, + GL_UNSIGNED_INT_SAMPLER_1D = 0x8DD1, + GL_UNSIGNED_INT_SAMPLER_2D = 0x8DD2, + GL_UNSIGNED_INT_SAMPLER_3D = 0x8DD3, + GL_UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4, + GL_UNSIGNED_INT_SAMPLER_1D_ARRAY = 0x8DD6, + GL_UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MIN_PROGRAM_TEXEL_OFFSET = 0x8904, + GL_MAX_PROGRAM_TEXEL_OFFSET = 0x8905; + + /** Accepted by the {@code mode} parameter of BeginConditionalRender. */ + public static final int + GL_QUERY_WAIT = 0x8E13, + GL_QUERY_NO_WAIT = 0x8E14, + GL_QUERY_BY_REGION_WAIT = 0x8E15, + GL_QUERY_BY_REGION_NO_WAIT = 0x8E16; + + /** Accepted by the {@code access} parameter of MapBufferRange. */ + public static final int + GL_MAP_READ_BIT = 0x1, + GL_MAP_WRITE_BIT = 0x2, + GL_MAP_INVALIDATE_RANGE_BIT = 0x4, + GL_MAP_INVALIDATE_BUFFER_BIT = 0x8, + GL_MAP_FLUSH_EXPLICIT_BIT = 0x10, + GL_MAP_UNSYNCHRONIZED_BIT = 0x20; + + /** Accepted by the {@code pname} parameter of GetBufferParameteriv. */ + public static final int + GL_BUFFER_ACCESS_FLAGS = 0x911F, + GL_BUFFER_MAP_LENGTH = 0x9120, + GL_BUFFER_MAP_OFFSET = 0x9121; + + /** Accepted by the {@code target} parameter of ClampColor and the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_CLAMP_VERTEX_COLOR = 0x891A, + GL_CLAMP_FRAGMENT_COLOR = 0x891B, + GL_CLAMP_READ_COLOR = 0x891C; + + /** Accepted by the {@code clamp} parameter of ClampColor. */ + public static final int GL_FIXED_ONLY = 0x891D; + + /** + * Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorage, and + * returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameteriv. + */ + public static final int + GL_DEPTH_COMPONENT32F = 0x8CAC, + GL_DEPTH32F_STENCIL8 = 0x8CAD; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage. + */ + public static final int GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; + + /** Accepted by the {@code value} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_RED_TYPE = 0x8C10, + GL_TEXTURE_GREEN_TYPE = 0x8C11, + GL_TEXTURE_BLUE_TYPE = 0x8C12, + GL_TEXTURE_ALPHA_TYPE = 0x8C13, + GL_TEXTURE_LUMINANCE_TYPE = 0x8C14, + GL_TEXTURE_INTENSITY_TYPE = 0x8C15, + GL_TEXTURE_DEPTH_TYPE = 0x8C16; + + /** Returned by the {@code params} parameter of GetTexLevelParameter. */ + public static final int GL_UNSIGNED_NORMALIZED = 0x8C17; + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, and TexImage3D. */ + public static final int + GL_RGBA32F = 0x8814, + GL_RGB32F = 0x8815, + GL_RGBA16F = 0x881A, + GL_RGB16F = 0x881B; + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorage. */ + public static final int GL_R11F_G11F_B10F = 0x8C3A; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, ColorSubTable, and GetColorTable. + */ + public static final int GL_UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B; + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorage. */ + public static final int GL_RGB9_E5 = 0x8C3D; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, ColorSubTable, and GetColorTable. + */ + public static final int GL_UNSIGNED_INT_5_9_9_9_REV = 0x8C3E; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameterfv and GetTexLevelParameteriv. */ + public static final int GL_TEXTURE_SHARED_SIZE = 0x8C3F; + + /** + * Accepted by the {@code target} parameter of BindFramebuffer, CheckFramebufferStatus, FramebufferTexture{1D|2D|3D}, FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv. + */ + public static final int + GL_FRAMEBUFFER = 0x8D40, + GL_READ_FRAMEBUFFER = 0x8CA8, + GL_DRAW_FRAMEBUFFER = 0x8CA9; + + /** + * Accepted by the {@code target} parameter of BindRenderbuffer, RenderbufferStorage, and GetRenderbufferParameteriv, and returned by + * GetFramebufferAttachmentParameteriv. + */ + public static final int GL_RENDERBUFFER = 0x8D41; + + /** Accepted by the {@code internalformat} parameter of RenderbufferStorage. */ + public static final int + GL_STENCIL_INDEX1 = 0x8D46, + GL_STENCIL_INDEX4 = 0x8D47, + GL_STENCIL_INDEX8 = 0x8D48, + GL_STENCIL_INDEX16 = 0x8D49; + + /** Accepted by the {@code pname} parameter of GetRenderbufferParameteriv. */ + public static final int + GL_RENDERBUFFER_WIDTH = 0x8D42, + GL_RENDERBUFFER_HEIGHT = 0x8D43, + GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8D44, + GL_RENDERBUFFER_RED_SIZE = 0x8D50, + GL_RENDERBUFFER_GREEN_SIZE = 0x8D51, + GL_RENDERBUFFER_BLUE_SIZE = 0x8D52, + GL_RENDERBUFFER_ALPHA_SIZE = 0x8D53, + GL_RENDERBUFFER_DEPTH_SIZE = 0x8D54, + GL_RENDERBUFFER_STENCIL_SIZE = 0x8D55, + GL_RENDERBUFFER_SAMPLES = 0x8CAB; + + /** Accepted by the {@code pname} parameter of GetFramebufferAttachmentParameteriv. */ + public static final int + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4, + GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210, + GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211, + GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212, + GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213, + GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214, + GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215, + GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216, + GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217; + + /** Returned in {@code params} by GetFramebufferAttachmentParameteriv. */ + public static final int + GL_FRAMEBUFFER_DEFAULT = 0x8218, + GL_INDEX = 0x8222; + + /** Accepted by the {@code attachment} parameter of FramebufferTexture{1D|2D|3D}, FramebufferRenderbuffer, and GetFramebufferAttachmentParameteriv. */ + public static final int + GL_COLOR_ATTACHMENT0 = 0x8CE0, + GL_COLOR_ATTACHMENT1 = 0x8CE1, + GL_COLOR_ATTACHMENT2 = 0x8CE2, + GL_COLOR_ATTACHMENT3 = 0x8CE3, + GL_COLOR_ATTACHMENT4 = 0x8CE4, + GL_COLOR_ATTACHMENT5 = 0x8CE5, + GL_COLOR_ATTACHMENT6 = 0x8CE6, + GL_COLOR_ATTACHMENT7 = 0x8CE7, + GL_COLOR_ATTACHMENT8 = 0x8CE8, + GL_COLOR_ATTACHMENT9 = 0x8CE9, + GL_COLOR_ATTACHMENT10 = 0x8CEA, + GL_COLOR_ATTACHMENT11 = 0x8CEB, + GL_COLOR_ATTACHMENT12 = 0x8CEC, + GL_COLOR_ATTACHMENT13 = 0x8CED, + GL_COLOR_ATTACHMENT14 = 0x8CEE, + GL_COLOR_ATTACHMENT15 = 0x8CEF, + GL_COLOR_ATTACHMENT16 = 0x8CF0, + GL_COLOR_ATTACHMENT17 = 0x8CF1, + GL_COLOR_ATTACHMENT18 = 0x8CF2, + GL_COLOR_ATTACHMENT19 = 0x8CF3, + GL_COLOR_ATTACHMENT20 = 0x8CF4, + GL_COLOR_ATTACHMENT21 = 0x8CF5, + GL_COLOR_ATTACHMENT22 = 0x8CF6, + GL_COLOR_ATTACHMENT23 = 0x8CF7, + GL_COLOR_ATTACHMENT24 = 0x8CF8, + GL_COLOR_ATTACHMENT25 = 0x8CF9, + GL_COLOR_ATTACHMENT26 = 0x8CFA, + GL_COLOR_ATTACHMENT27 = 0x8CFB, + GL_COLOR_ATTACHMENT28 = 0x8CFC, + GL_COLOR_ATTACHMENT29 = 0x8CFD, + GL_COLOR_ATTACHMENT30 = 0x8CFE, + GL_COLOR_ATTACHMENT31 = 0x8CFF, + GL_DEPTH_ATTACHMENT = 0x8D00, + GL_STENCIL_ATTACHMENT = 0x8D20, + GL_DEPTH_STENCIL_ATTACHMENT = 0x821A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_SAMPLES = 0x8D57; + + /** Returned by CheckFramebufferStatus(). */ + public static final int + GL_FRAMEBUFFER_COMPLETE = 0x8CD5, + GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6, + GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7, + GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0x8CDB, + GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0x8CDC, + GL_FRAMEBUFFER_UNSUPPORTED = 0x8CDD, + GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56, + GL_FRAMEBUFFER_UNDEFINED = 0x8219; + + /** Accepted by the {@code pname} parameters of GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_FRAMEBUFFER_BINDING = 0x8CA6, + GL_DRAW_FRAMEBUFFER_BINDING = 0x8CA6, + GL_READ_FRAMEBUFFER_BINDING = 0x8CAA, + GL_RENDERBUFFER_BINDING = 0x8CA7, + GL_MAX_COLOR_ATTACHMENTS = 0x8CDF, + GL_MAX_RENDERBUFFER_SIZE = 0x84E8; + + /** Returned by GetError(). */ + public static final int GL_INVALID_FRAMEBUFFER_OPERATION = 0x506; + + /** + * Accepted by the {@code format} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage, by the {@code type} parameter of CopyPixels, by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, + * CopyTexImage2D, and RenderbufferStorage, and returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameteriv. + */ + public static final int GL_DEPTH_STENCIL = 0x84F9; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage. + */ + public static final int GL_UNSIGNED_INT_24_8 = 0x84FA; + + /** + * Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorage, and + * returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameteriv. + */ + public static final int GL_DEPTH24_STENCIL8 = 0x88F0; + + /** Accepted by the {@code value} parameter of GetTexLevelParameter. */ + public static final int GL_TEXTURE_STENCIL_SIZE = 0x88F1; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, GetTexImage, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter, + * ColorTable, ColorSubTable, and GetColorTable. + * + *

    Accepted by the {@code type} argument of VertexPointer, NormalPointer, ColorPointer, SecondaryColorPointer, FogCoordPointer, TexCoordPointer, and + * VertexAttribPointer.

    + */ + public static final int GL_HALF_FLOAT = 0x140B; + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, and TexImage3D. */ + public static final int + GL_RGBA32UI = 0x8D70, + GL_RGB32UI = 0x8D71, + GL_RGBA16UI = 0x8D76, + GL_RGB16UI = 0x8D77, + GL_RGBA8UI = 0x8D7C, + GL_RGB8UI = 0x8D7D, + GL_RGBA32I = 0x8D82, + GL_RGB32I = 0x8D83, + GL_RGBA16I = 0x8D88, + GL_RGB16I = 0x8D89, + GL_RGBA8I = 0x8D8E, + GL_RGB8I = 0x8D8F; + + /** Accepted by the {@code format} parameter of TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, DrawPixels and ReadPixels. */ + public static final int + GL_RED_INTEGER = 0x8D94, + GL_GREEN_INTEGER = 0x8D95, + GL_BLUE_INTEGER = 0x8D96, + GL_ALPHA_INTEGER = 0x8D97, + GL_RGB_INTEGER = 0x8D98, + GL_RGBA_INTEGER = 0x8D99, + GL_BGR_INTEGER = 0x8D9A, + GL_BGRA_INTEGER = 0x8D9B; + + /** Accepted by the {@code target} parameter of TexParameteri, TexParameteriv, TexParameterf, TexParameterfv, GenerateMipmap, and BindTexture. */ + public static final int + GL_TEXTURE_1D_ARRAY = 0x8C18, + GL_TEXTURE_2D_ARRAY = 0x8C1A; + + /** Accepted by the {@code target} parameter of TexImage3D, TexSubImage3D, CopyTexSubImage3D, CompressedTexImage3D, and CompressedTexSubImage3D. */ + public static final int GL_PROXY_TEXTURE_2D_ARRAY = 0x8C1B; + + /** + * Accepted by the {@code target} parameter of TexImage2D, TexSubImage2D, CopyTexImage2D, CopyTexSubImage2D, CompressedTexImage2D, and + * CompressedTexSubImage2D. + */ + public static final int GL_PROXY_TEXTURE_1D_ARRAY = 0x8C19; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv and GetFloatv. */ + public static final int + GL_TEXTURE_BINDING_1D_ARRAY = 0x8C1C, + GL_TEXTURE_BINDING_2D_ARRAY = 0x8C1D, + GL_MAX_ARRAY_TEXTURE_LAYERS = 0x88FF; + + /** + * Accepted by the {@code internalformat} parameter of TexImage2D, CopyTexImage2D, and CompressedTexImage2D and the {@code format} parameter of + * CompressedTexSubImage2D. + */ + public static final int + GL_COMPRESSED_RED_RGTC1 = 0x8DBB, + GL_COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC, + GL_COMPRESSED_RG_RGTC2 = 0x8DBD, + GL_COMPRESSED_SIGNED_RG_RGTC2 = 0x8DBE; + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, and CopyTexImage2D. */ + public static final int + GL_R8 = 0x8229, + GL_R16 = 0x822A, + GL_RG8 = 0x822B, + GL_RG16 = 0x822C, + GL_R16F = 0x822D, + GL_R32F = 0x822E, + GL_RG16F = 0x822F, + GL_RG32F = 0x8230, + GL_R8I = 0x8231, + GL_R8UI = 0x8232, + GL_R16I = 0x8233, + GL_R16UI = 0x8234, + GL_R32I = 0x8235, + GL_R32UI = 0x8236, + GL_RG8I = 0x8237, + GL_RG8UI = 0x8238, + GL_RG16I = 0x8239, + GL_RG16UI = 0x823A, + GL_RG32I = 0x823B, + GL_RG32UI = 0x823C, + GL_RG = 0x8227, + GL_COMPRESSED_RED = 0x8225, + GL_COMPRESSED_RG = 0x8226; + + /** Accepted by the {@code format} parameter of TexImage3D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and ReadPixels. */ + public static final int GL_RG_INTEGER = 0x8228; + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, + * BindBufferRange, BindBufferOffset and BindBufferBase. + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER = 0x8C8E; + + /** Accepted by the {@code param} parameter of GetIntegeri_v and GetBooleani_v. */ + public static final int + GL_TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84, + GL_TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85; + + /** + * Accepted by the {@code param} parameter of GetIntegeri_v and GetBooleani_v, and by the {@code pname} parameter of GetBooleanv, + * GetDoublev, GetIntegerv, and GetFloatv. + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F; + + /** Accepted by the {@code bufferMode} parameter of TransformFeedbackVaryings. */ + public static final int + GL_INTERLEAVED_ATTRIBS = 0x8C8C, + GL_SEPARATE_ATTRIBS = 0x8C8D; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int + GL_PRIMITIVES_GENERATED = 0x8C87, + GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_RASTERIZER_DISCARD = 0x8C89; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int + GL_TRANSFORM_FEEDBACK_VARYINGS = 0x8C83, + GL_TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F, + GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_VERTEX_ARRAY_BINDING = 0x85B5; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_FRAMEBUFFER_SRGB = 0x8DB9; + + protected GL30() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetStringi ] --- + + /** Unsafe version of: {@link #glGetStringi GetStringi} */ + public static long nglGetStringi(int name, int index) { + return GL30C.nglGetStringi(name, index); + } + + /** + * Queries indexed string state. + * + * @param name the indexed state to query. One of:
    {@link GL11#GL_EXTENSIONS EXTENSIONS}{@link GL20#GL_SHADING_LANGUAGE_VERSION SHADING_LANGUAGE_VERSION}
    + * @param index the index of the particular element being queried + * + * @see Reference Page + */ + @Nullable + @NativeType("GLubyte const *") + public static String glGetStringi(@NativeType("GLenum") int name, @NativeType("GLuint") int index) { + return GL30C.glGetStringi(name, index); + } + + // --- [ glClearBufferiv ] --- + + /** Unsafe version of: {@link #glClearBufferiv ClearBufferiv} */ + public static void nglClearBufferiv(int buffer, int drawbuffer, long value) { + GL30C.nglClearBufferiv(buffer, drawbuffer, value); + } + + /** + * Clears an individual buffer of the currently bound framebuffer object to the {@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER} binding. + * + * @param buffer the buffer to clear. One of:
    {@link GL11#GL_COLOR COLOR}{@link GL11#GL_STENCIL STENCIL}
    + * @param drawbuffer the draw buffer to clear + * @param value for color buffers, a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to. For stencil buffers, a pointer to a + * single stencil value to clear the buffer to. + * + * @see Reference Page + */ + public static void glClearBufferiv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") IntBuffer value) { + GL30C.glClearBufferiv(buffer, drawbuffer, value); + } + + // --- [ glClearBufferuiv ] --- + + /** Unsafe version of: {@link #glClearBufferuiv ClearBufferuiv} */ + public static void nglClearBufferuiv(int buffer, int drawbuffer, long value) { + GL30C.nglClearBufferuiv(buffer, drawbuffer, value); + } + + /** + * Clears an individual buffer of the currently bound framebuffer object to the {@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER} binding. + * + * @param buffer the buffer to clear. Must be:
    {@link GL11#GL_COLOR COLOR}
    + * @param drawbuffer the draw buffer to clear + * @param value a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to + * + * @see Reference Page + */ + public static void glClearBufferuiv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") IntBuffer value) { + GL30C.glClearBufferuiv(buffer, drawbuffer, value); + } + + // --- [ glClearBufferfv ] --- + + /** Unsafe version of: {@link #glClearBufferfv ClearBufferfv} */ + public static void nglClearBufferfv(int buffer, int drawbuffer, long value) { + GL30C.nglClearBufferfv(buffer, drawbuffer, value); + } + + /** + * Clears an individual buffer of the currently bound framebuffer object to the {@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER} binding. + * + * @param buffer the buffer to clear. One of:
    {@link GL11#GL_COLOR COLOR}{@link GL11#GL_DEPTH DEPTH}
    + * @param drawbuffer the draw buffer to clear + * @param value for color buffers, a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to. For depth buffers, a pointer to a + * single depth value to clear the buffer to. + * + * @see Reference Page + */ + public static void glClearBufferfv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat const *") FloatBuffer value) { + GL30C.glClearBufferfv(buffer, drawbuffer, value); + } + + // --- [ glClearBufferfi ] --- + + /** + * Clears an individual buffer of the currently bound framebuffer object to the {@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER} binding. + * + * @param buffer the buffer to clear. Must be:
    {@link GL30C#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param drawbuffer the draw buffer to clear + * @param depth the depth value to clear the buffer to + * @param stencil the stencil value to clear the buffer to + * + * @see Reference Page + */ + public static void glClearBufferfi(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat") float depth, @NativeType("GLint") int stencil) { + GL30C.glClearBufferfi(buffer, drawbuffer, depth, stencil); + } + + // --- [ glVertexAttribI1i ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. The y and z components are implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * + * @see Reference Page + */ + public static void glVertexAttribI1i(@NativeType("GLuint") int index, @NativeType("GLint") int x) { + GL30C.glVertexAttribI1i(index, x); + } + + // --- [ glVertexAttribI2i ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. The z component is implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * + * @see Reference Page + */ + public static void glVertexAttribI2i(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y) { + GL30C.glVertexAttribI2i(index, x, y); + } + + // --- [ glVertexAttribI3i ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. The w component is implicitly set to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * + * @see Reference Page + */ + public static void glVertexAttribI3i(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z) { + GL30C.glVertexAttribI3i(index, x, y, z); + } + + // --- [ glVertexAttribI4i ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + * + * @see Reference Page + */ + public static void glVertexAttribI4i(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w) { + GL30C.glVertexAttribI4i(index, x, y, z, w); + } + + // --- [ glVertexAttribI1ui ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. The y and z components are implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * + * @see Reference Page + */ + public static void glVertexAttribI1ui(@NativeType("GLuint") int index, @NativeType("GLuint") int x) { + GL30C.glVertexAttribI1ui(index, x); + } + + // --- [ glVertexAttribI2ui ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. The z component is implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * + * @see Reference Page + */ + public static void glVertexAttribI2ui(@NativeType("GLuint") int index, @NativeType("GLuint") int x, @NativeType("GLuint") int y) { + GL30C.glVertexAttribI2ui(index, x, y); + } + + // --- [ glVertexAttribI3ui ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. The w component is implicitly set to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * + * @see Reference Page + */ + public static void glVertexAttribI3ui(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z) { + GL30C.glVertexAttribI3ui(index, x, y, z); + } + + // --- [ glVertexAttribI4ui ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + * + * @see Reference Page + */ + public static void glVertexAttribI4ui(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w) { + GL30C.glVertexAttribI4ui(index, x, y, z, w); + } + + // --- [ glVertexAttribI1iv ] --- + + /** Unsafe version of: {@link #glVertexAttribI1iv VertexAttribI1iv} */ + public static void nglVertexAttribI1iv(int index, long v) { + GL30C.nglVertexAttribI1iv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribI1i VertexAttribI1i}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI1iv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + GL30C.glVertexAttribI1iv(index, v); + } + + // --- [ glVertexAttribI2iv ] --- + + /** Unsafe version of: {@link #glVertexAttribI2iv VertexAttribI2iv} */ + public static void nglVertexAttribI2iv(int index, long v) { + GL30C.nglVertexAttribI2iv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribI2i VertexAttribI2i}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI2iv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + GL30C.glVertexAttribI2iv(index, v); + } + + // --- [ glVertexAttribI3iv ] --- + + /** Unsafe version of: {@link #glVertexAttribI3iv VertexAttribI3iv} */ + public static void nglVertexAttribI3iv(int index, long v) { + GL30C.nglVertexAttribI3iv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribI3i VertexAttribI3i}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI3iv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + GL30C.glVertexAttribI3iv(index, v); + } + + // --- [ glVertexAttribI4iv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4iv VertexAttribI4iv} */ + public static void nglVertexAttribI4iv(int index, long v) { + GL30C.nglVertexAttribI4iv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribI4i VertexAttribI4i}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4iv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + GL30C.glVertexAttribI4iv(index, v); + } + + // --- [ glVertexAttribI1uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribI1uiv VertexAttribI1uiv} */ + public static void nglVertexAttribI1uiv(int index, long v) { + GL30C.nglVertexAttribI1uiv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribI1ui VertexAttribI1ui}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI1uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + GL30C.glVertexAttribI1uiv(index, v); + } + + // --- [ glVertexAttribI2uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribI2uiv VertexAttribI2uiv} */ + public static void nglVertexAttribI2uiv(int index, long v) { + GL30C.nglVertexAttribI2uiv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribI2ui VertexAttribI2ui}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI2uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + GL30C.glVertexAttribI2uiv(index, v); + } + + // --- [ glVertexAttribI3uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribI3uiv VertexAttribI3uiv} */ + public static void nglVertexAttribI3uiv(int index, long v) { + GL30C.nglVertexAttribI3uiv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribI3ui VertexAttribI3ui}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI3uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + GL30C.glVertexAttribI3uiv(index, v); + } + + // --- [ glVertexAttribI4uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4uiv VertexAttribI4uiv} */ + public static void nglVertexAttribI4uiv(int index, long v) { + GL30C.nglVertexAttribI4uiv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribI4ui VertexAttribI4ui}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + GL30C.glVertexAttribI4uiv(index, v); + } + + // --- [ glVertexAttribI4bv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4bv VertexAttribI4bv} */ + public static void nglVertexAttribI4bv(int index, long v) { + GL30C.nglVertexAttribI4bv(index, v); + } + + /** + * Byte version of {@link #glVertexAttribI4iv VertexAttribI4iv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4bv(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + GL30C.glVertexAttribI4bv(index, v); + } + + // --- [ glVertexAttribI4sv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4sv VertexAttribI4sv} */ + public static void nglVertexAttribI4sv(int index, long v) { + GL30C.nglVertexAttribI4sv(index, v); + } + + /** + * Short version of {@link #glVertexAttribI4iv VertexAttribI4iv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + GL30C.glVertexAttribI4sv(index, v); + } + + // --- [ glVertexAttribI4ubv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4ubv VertexAttribI4ubv} */ + public static void nglVertexAttribI4ubv(int index, long v) { + GL30C.nglVertexAttribI4ubv(index, v); + } + + /** + * Byte version of {@link #glVertexAttribI4uiv VertexAttribI4uiv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4ubv(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + GL30C.glVertexAttribI4ubv(index, v); + } + + // --- [ glVertexAttribI4usv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4usv VertexAttribI4usv} */ + public static void nglVertexAttribI4usv(int index, long v) { + GL30C.nglVertexAttribI4usv(index, v); + } + + /** + * Short version of {@link #glVertexAttribI4uiv VertexAttribI4uiv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4usv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + GL30C.glVertexAttribI4usv(index, v); + } + + // --- [ glVertexAttribIPointer ] --- + + /** Unsafe version of: {@link #glVertexAttribIPointer VertexAttribIPointer} */ + public static void nglVertexAttribIPointer(int index, int size, int type, int stride, long pointer) { + GL30C.nglVertexAttribIPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribIPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + GL30C.glVertexAttribIPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribIPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + GL30C.glVertexAttribIPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribIPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + GL30C.glVertexAttribIPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribIPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + GL30C.glVertexAttribIPointer(index, size, type, stride, pointer); + } + + // --- [ glGetVertexAttribIiv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribIiv GetVertexAttribIiv} */ + public static void nglGetVertexAttribIiv(int index, int pname, long params) { + GL30C.nglGetVertexAttribIiv(index, pname, params); + } + + /** + * Returns the value of a pure integer generic vertex attribute parameter. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried. Must be:
    {@link GL20#GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}
    + * @param params returns the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribIiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL30C.glGetVertexAttribIiv(index, pname, params); + } + + /** + * Returns the value of a pure integer generic vertex attribute parameter. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried. Must be:
    {@link GL20#GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetVertexAttribIi(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL30C.glGetVertexAttribIi(index, pname); + } + + // --- [ glGetVertexAttribIuiv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribIuiv GetVertexAttribIuiv} */ + public static void nglGetVertexAttribIuiv(int index, int pname, long params) { + GL30C.nglGetVertexAttribIuiv(index, pname, params); + } + + /** + * Unsigned version of {@link #glGetVertexAttribIiv GetVertexAttribIiv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried. Must be:
    {@link GL20#GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}
    + * @param params returns the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribIuiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + GL30C.glGetVertexAttribIuiv(index, pname, params); + } + + /** + * Unsigned version of {@link #glGetVertexAttribIiv GetVertexAttribIiv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried. Must be:
    {@link GL20#GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetVertexAttribIui(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL30C.glGetVertexAttribIui(index, pname); + } + + // --- [ glUniform1ui ] --- + + /** + * Specifies the value of a uint uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform value + * + * @see Reference Page + */ + public static void glUniform1ui(@NativeType("GLint") int location, @NativeType("GLuint") int v0) { + GL30C.glUniform1ui(location, v0); + } + + // --- [ glUniform2ui ] --- + + /** + * Specifies the value of a uvec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * + * @see Reference Page + */ + public static void glUniform2ui(@NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1) { + GL30C.glUniform2ui(location, v0, v1); + } + + // --- [ glUniform3ui ] --- + + /** + * Specifies the value of a uvec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * + * @see Reference Page + */ + public static void glUniform3ui(@NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1, @NativeType("GLuint") int v2) { + GL30C.glUniform3ui(location, v0, v1, v2); + } + + // --- [ glUniform4ui ] --- + + /** + * Specifies the value of a uvec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * @param v3 the uniform w value + * + * @see Reference Page + */ + public static void glUniform4ui(@NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1, @NativeType("GLuint") int v2, @NativeType("GLuint") int v3) { + GL30C.glUniform4ui(location, v0, v1, v2, v3); + } + + // --- [ glUniform1uiv ] --- + + /** + * Unsafe version of: {@link #glUniform1uiv Uniform1uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform1uiv(int location, int count, long value) { + GL30C.nglUniform1uiv(location, count, value); + } + + /** + * Specifies the value of a single uint uniform variable or a uint uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform1uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL30C.glUniform1uiv(location, value); + } + + // --- [ glUniform2uiv ] --- + + /** + * Unsafe version of: {@link #glUniform2uiv Uniform2uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform2uiv(int location, int count, long value) { + GL30C.nglUniform2uiv(location, count, value); + } + + /** + * Specifies the value of a single uvec2 uniform variable or a uvec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform2uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL30C.glUniform2uiv(location, value); + } + + // --- [ glUniform3uiv ] --- + + /** + * Unsafe version of: {@link #glUniform3uiv Uniform3uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform3uiv(int location, int count, long value) { + GL30C.nglUniform3uiv(location, count, value); + } + + /** + * Specifies the value of a single uvec3 uniform variable or a uvec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform3uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL30C.glUniform3uiv(location, value); + } + + // --- [ glUniform4uiv ] --- + + /** + * Unsafe version of: {@link #glUniform4uiv Uniform4uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform4uiv(int location, int count, long value) { + GL30C.nglUniform4uiv(location, count, value); + } + + /** + * Specifies the value of a single uvec4 uniform variable or a uvec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform4uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL30C.glUniform4uiv(location, value); + } + + // --- [ glGetUniformuiv ] --- + + /** Unsafe version of: {@link #glGetUniformuiv GetUniformuiv} */ + public static void nglGetUniformuiv(int program, int location, long params) { + GL30C.nglGetUniformuiv(program, location, params); + } + + /** + * Returns the uint value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + * + * @see Reference Page + */ + public static void glGetUniformuiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") IntBuffer params) { + GL30C.glGetUniformuiv(program, location, params); + } + + /** + * Returns the uint value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetUniformui(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL30C.glGetUniformui(program, location); + } + + // --- [ glBindFragDataLocation ] --- + + /** Unsafe version of: {@link #glBindFragDataLocation BindFragDataLocation} */ + public static void nglBindFragDataLocation(int program, int colorNumber, long name) { + GL30C.nglBindFragDataLocation(program, colorNumber, name); + } + + /** + * Binds a user-defined varying out variable to a fragment shader color number. + * + * @param program the name of the program containing varying out variable whose binding to modify + * @param colorNumber the color number to bind the user-defined varying out variable to + * @param name the name of the user-defined varying out variable whose binding to modify + * + * @see Reference Page + */ + public static void glBindFragDataLocation(@NativeType("GLuint") int program, @NativeType("GLuint") int colorNumber, @NativeType("GLchar const *") ByteBuffer name) { + GL30C.glBindFragDataLocation(program, colorNumber, name); + } + + /** + * Binds a user-defined varying out variable to a fragment shader color number. + * + * @param program the name of the program containing varying out variable whose binding to modify + * @param colorNumber the color number to bind the user-defined varying out variable to + * @param name the name of the user-defined varying out variable whose binding to modify + * + * @see Reference Page + */ + public static void glBindFragDataLocation(@NativeType("GLuint") int program, @NativeType("GLuint") int colorNumber, @NativeType("GLchar const *") CharSequence name) { + GL30C.glBindFragDataLocation(program, colorNumber, name); + } + + // --- [ glGetFragDataLocation ] --- + + /** Unsafe version of: {@link #glGetFragDataLocation GetFragDataLocation} */ + public static int nglGetFragDataLocation(int program, long name) { + return GL30C.nglGetFragDataLocation(program, name); + } + + /** + * Queries the bindings of color numbers to user-defined varying out variables. + * + * @param program the name of the program containing varying out variable whose binding to query + * @param name the name of the user-defined varying out variable whose binding to query + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetFragDataLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + return GL30C.glGetFragDataLocation(program, name); + } + + /** + * Queries the bindings of color numbers to user-defined varying out variables. + * + * @param program the name of the program containing varying out variable whose binding to query + * @param name the name of the user-defined varying out variable whose binding to query + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetFragDataLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + return GL30C.glGetFragDataLocation(program, name); + } + + // --- [ glBeginConditionalRender ] --- + + /** + * Starts conditional rendering. + * + * @param id the name of an occlusion query object whose results are used to determine if the rendering commands are discarded + * @param mode how {@code glBeginConditionalRender} interprets the results of the occlusion query. One of:
    {@link GL30C#GL_QUERY_WAIT QUERY_WAIT}{@link GL30C#GL_QUERY_NO_WAIT QUERY_NO_WAIT}{@link GL30C#GL_QUERY_BY_REGION_WAIT QUERY_BY_REGION_WAIT}
    {@link GL30C#GL_QUERY_BY_REGION_NO_WAIT QUERY_BY_REGION_NO_WAIT}{@link GL45#GL_QUERY_WAIT_INVERTED QUERY_WAIT_INVERTED}{@link GL45#GL_QUERY_NO_WAIT_INVERTED QUERY_NO_WAIT_INVERTED}
    {@link GL45#GL_QUERY_BY_REGION_WAIT_INVERTED QUERY_BY_REGION_WAIT_INVERTED}{@link GL45#GL_QUERY_BY_REGION_NO_WAIT_INVERTED QUERY_BY_REGION_NO_WAIT_INVERTED}
    + * + * @see Reference Page + */ + public static void glBeginConditionalRender(@NativeType("GLuint") int id, @NativeType("GLenum") int mode) { + GL30C.glBeginConditionalRender(id, mode); + } + + // --- [ glEndConditionalRender ] --- + + /** + * Ends conditional rendering. + * + * @see Reference Page + */ + public static void glEndConditionalRender() { + GL30C.glEndConditionalRender(); + } + + // --- [ glMapBufferRange ] --- + + /** Unsafe version of: {@link #glMapBufferRange MapBufferRange} */ + public static long nglMapBufferRange(int target, long offset, long length, int access) { + return GL30C.nglMapBufferRange(target, offset, length, access); + } + + /** + * Maps a section of a buffer object's data store. + * + *

    LWJGL note: This method comes in 2 flavors:

    + * + *
      + *
    1. {@link #glMapBufferRange(int, long, long, int)} - Always returns a new ByteBuffer instance.
    2. + *
    3. {@link #glMapBufferRange(int, long, long, int, ByteBuffer)} - The {@code old_buffer} parameter is reused if not null.
    4. + *
    + * + * @param target a binding to which the target buffer is bound. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30C#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link GL30C#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30C#GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link GL30C#GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link GL30C#GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link GL30C#GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link GL30C#GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBufferRange(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access) { + return GL30C.glMapBufferRange(target, offset, length, access); + } + + /** + * Maps a section of a buffer object's data store. + * + *

    LWJGL note: This method comes in 2 flavors:

    + * + *
      + *
    1. {@link #glMapBufferRange(int, long, long, int)} - Always returns a new ByteBuffer instance.
    2. + *
    3. {@link #glMapBufferRange(int, long, long, int, ByteBuffer)} - The {@code old_buffer} parameter is reused if not null.
    4. + *
    + * + * @param target a binding to which the target buffer is bound. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30C#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link GL30C#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30C#GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link GL30C#GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link GL30C#GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link GL30C#GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link GL30C#GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBufferRange(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access, @Nullable ByteBuffer old_buffer) { + return GL30C.glMapBufferRange(target, offset, length, access, old_buffer); + } + + // --- [ glFlushMappedBufferRange ] --- + + /** + * Indicates modifications to a range of a mapped buffer. + * + * @param target the target of the flush operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30C#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the start of the buffer subrange, in basic machine units + * @param length the length of the buffer subrange, in basic machine units + * + * @see Reference Page + */ + public static void glFlushMappedBufferRange(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length) { + GL30C.glFlushMappedBufferRange(target, offset, length); + } + + // --- [ glClampColor ] --- + + /** + * Controls color clamping. + * + * @param target target for color clamping. Must be:
    {@link GL30C#GL_CLAMP_READ_COLOR CLAMP_READ_COLOR}
    + * @param clamp whether to apply color clamping. One of:
    {@link GL11#GL_TRUE TRUE}{@link GL11#GL_FALSE FALSE}{@link GL30C#GL_FIXED_ONLY FIXED_ONLY}
    + * + * @see Reference Page + */ + public static void glClampColor(@NativeType("GLenum") int target, @NativeType("GLenum") int clamp) { + GL30C.glClampColor(target, clamp); + } + + // --- [ glIsRenderbuffer ] --- + + /** + * Determines if a name corresponds to a renderbuffer object. + * + * @param renderbuffer a value that may be the name of a renderbuffer object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsRenderbuffer(@NativeType("GLuint") int renderbuffer) { + return GL30C.glIsRenderbuffer(renderbuffer); + } + + // --- [ glBindRenderbuffer ] --- + + /** + * Binds a renderbuffer to a renderbuffer target. + * + * @param target the renderbuffer target of the binding operation. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param renderbuffer the name of the renderbuffer object to bind + * + * @see Reference Page + */ + public static void glBindRenderbuffer(@NativeType("GLenum") int target, @NativeType("GLuint") int renderbuffer) { + GL30C.glBindRenderbuffer(target, renderbuffer); + } + + // --- [ glDeleteRenderbuffers ] --- + + /** + * Unsafe version of: {@link #glDeleteRenderbuffers DeleteRenderbuffers} + * + * @param n the number of renderbuffer objects to be deleted + */ + public static void nglDeleteRenderbuffers(int n, long renderbuffers) { + GL30C.nglDeleteRenderbuffers(n, renderbuffers); + } + + /** + * Deletes renderbuffer objects. + * + * @param renderbuffers an array containing {@code n} renderbuffer objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteRenderbuffers(@NativeType("GLuint const *") IntBuffer renderbuffers) { + GL30C.glDeleteRenderbuffers(renderbuffers); + } + + /** + * Deletes renderbuffer objects. + * + * @see Reference Page + */ + public static void glDeleteRenderbuffers(@NativeType("GLuint const *") int renderbuffer) { + GL30C.glDeleteRenderbuffers(renderbuffer); + } + + // --- [ glGenRenderbuffers ] --- + + /** + * Unsafe version of: {@link #glGenRenderbuffers GenRenderbuffers} + * + * @param n the number of renderbuffer object names to generate + */ + public static void nglGenRenderbuffers(int n, long renderbuffers) { + GL30C.nglGenRenderbuffers(n, renderbuffers); + } + + /** + * Generates renderbuffer object names. + * + * @param renderbuffers a buffer in which the generated renderbuffer object names are stored + * + * @see Reference Page + */ + public static void glGenRenderbuffers(@NativeType("GLuint *") IntBuffer renderbuffers) { + GL30C.glGenRenderbuffers(renderbuffers); + } + + /** + * Generates renderbuffer object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenRenderbuffers() { + return GL30C.glGenRenderbuffers(); + } + + // --- [ glRenderbufferStorage ] --- + + /** + * Establishes data storage, format and dimensions of a renderbuffer object's image. + * + * @param target the target of the allocation. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + * + * @see Reference Page + */ + public static void glRenderbufferStorage(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL30C.glRenderbufferStorage(target, internalformat, width, height); + } + + // --- [ glRenderbufferStorageMultisample ] --- + + /** + * Establishes data storage, format, dimensions and sample count of a renderbuffer object's image. + * + *

    {@link #glRenderbufferStorage RenderbufferStorage} is equivalent to calling this method with the samples set to zero.

    + * + * @param target the target of the allocation. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param samples the number of samples to be used for the renderbuffer object's storage + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + * + * @see Reference Page + */ + public static void glRenderbufferStorageMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL30C.glRenderbufferStorageMultisample(target, samples, internalformat, width, height); + } + + // --- [ glGetRenderbufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetRenderbufferParameteriv GetRenderbufferParameteriv} */ + public static void nglGetRenderbufferParameteriv(int target, int pname, long params) { + GL30C.nglGetRenderbufferParameteriv(target, pname, params); + } + + /** + * Retrieves information about a bound renderbuffer object. + * + * @param target the target of the query operation. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link GL30C#GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link GL30C#GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link GL30C#GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link GL30C#GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link GL30C#GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link GL30C#GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link GL30C#GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link GL30C#GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link GL30C#GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link GL30C#GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + * @param params an array to receive the value of the queried parameter + * + * @see Reference Page + */ + public static void glGetRenderbufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL30C.glGetRenderbufferParameteriv(target, pname, params); + } + + /** + * Retrieves information about a bound renderbuffer object. + * + * @param target the target of the query operation. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link GL30C#GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link GL30C#GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link GL30C#GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link GL30C#GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link GL30C#GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link GL30C#GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link GL30C#GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link GL30C#GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link GL30C#GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link GL30C#GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetRenderbufferParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL30C.glGetRenderbufferParameteri(target, pname); + } + + // --- [ glIsFramebuffer ] --- + + /** + * Determines if a name corresponds to a framebuffer object. + * + * @param framebuffer a value that may be the name of a framebuffer object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsFramebuffer(@NativeType("GLuint") int framebuffer) { + return GL30C.glIsFramebuffer(framebuffer); + } + + // --- [ glBindFramebuffer ] --- + + /** + * Binds a framebuffer to a framebuffer target. + * + * @param target the framebuffer target of the binding operation. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param framebuffer the name of the framebuffer object to bind + * + * @see Reference Page + */ + public static void glBindFramebuffer(@NativeType("GLenum") int target, @NativeType("GLuint") int framebuffer) { + GL30C.glBindFramebuffer(target, framebuffer); + } + + // --- [ glDeleteFramebuffers ] --- + + /** + * Unsafe version of: {@link #glDeleteFramebuffers DeleteFramebuffers} + * + * @param n the number of framebuffer objects to be deleted + */ + public static void nglDeleteFramebuffers(int n, long framebuffers) { + GL30C.nglDeleteFramebuffers(n, framebuffers); + } + + /** + * Deletes framebuffer objects. + * + * @param framebuffers an array containing {@code n} framebuffer objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteFramebuffers(@NativeType("GLuint const *") IntBuffer framebuffers) { + GL30C.glDeleteFramebuffers(framebuffers); + } + + /** + * Deletes framebuffer objects. + * + * @see Reference Page + */ + public static void glDeleteFramebuffers(@NativeType("GLuint const *") int framebuffer) { + GL30C.glDeleteFramebuffers(framebuffer); + } + + // --- [ glGenFramebuffers ] --- + + /** + * Unsafe version of: {@link #glGenFramebuffers GenFramebuffers} + * + * @param n the number of framebuffer object names to generate + */ + public static void nglGenFramebuffers(int n, long framebuffers) { + GL30C.nglGenFramebuffers(n, framebuffers); + } + + /** + * Generates framebuffer object names. + * + * @param framebuffers a buffer in which the generated framebuffer object names are stored + * + * @see Reference Page + */ + public static void glGenFramebuffers(@NativeType("GLuint *") IntBuffer framebuffers) { + GL30C.glGenFramebuffers(framebuffers); + } + + /** + * Generates framebuffer object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenFramebuffers() { + return GL30C.glGenFramebuffers(); + } + + // --- [ glCheckFramebufferStatus ] --- + + /** + * Checks the completeness status of a framebuffer. + * + * @param target the target of the framebuffer completeness check. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * + * @see Reference Page + */ + @NativeType("GLenum") + public static int glCheckFramebufferStatus(@NativeType("GLenum") int target) { + return GL30C.glCheckFramebufferStatus(target); + } + + // --- [ glFramebufferTexture1D ] --- + + /** + * Attaches a level of a 1D texture object as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param textarget the type of texture + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * + * @see Reference Page + */ + public static void glFramebufferTexture1D(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level) { + GL30C.glFramebufferTexture1D(target, attachment, textarget, texture, level); + } + + // --- [ glFramebufferTexture2D ] --- + + /** + * Attaches a level of a 2D texture object as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param textarget the type of texture + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * + * @see Reference Page + */ + public static void glFramebufferTexture2D(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level) { + GL30C.glFramebufferTexture2D(target, attachment, textarget, texture, level); + } + + // --- [ glFramebufferTexture3D ] --- + + /** + * Attaches a layer of a 3D texture object as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param textarget the type of texture + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * @param layer the layer of a 2-dimensional image within the 3-dimensional texture. + * + * @see Reference Page + */ + public static void glFramebufferTexture3D(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer) { + GL30C.glFramebufferTexture3D(target, attachment, textarget, texture, level, layer); + } + + // --- [ glFramebufferTextureLayer ] --- + + /** + * Attaches a single layer of a texture to a framebuffer + * + * @param target the framebuffer target. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * @param layer the layer of {@code texture} to attach. + * + * @see Reference Page + */ + public static void glFramebufferTextureLayer(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer) { + GL30C.glFramebufferTextureLayer(target, attachment, texture, level, layer); + } + + // --- [ glFramebufferRenderbuffer ] --- + + /** + * Attaches a renderbuffer as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param renderbuffertarget the renderbuffer target. Must be:
    {@link GL30C#GL_RENDERBUFFER RENDERBUFFER}
    + * @param renderbuffer the name of an existing renderbuffer object of type {@code renderbuffertarget} to attach + * + * @see Reference Page + */ + public static void glFramebufferRenderbuffer(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int renderbuffertarget, @NativeType("GLuint") int renderbuffer) { + GL30C.glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); + } + + // --- [ glGetFramebufferAttachmentParameteriv ] --- + + /** Unsafe version of: {@link #glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv} */ + public static void nglGetFramebufferAttachmentParameteriv(int target, int attachment, int pname, long params) { + GL30C.nglGetFramebufferAttachmentParameteriv(target, attachment, pname, params); + } + + /** + * Retrievees information about attachments of a bound framebuffer object. + * + * @param target the target of the query operation. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment within {@code target}. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + * @param params an array to receive the value of the queried parameter + * + * @see Reference Page + */ + public static void glGetFramebufferAttachmentParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL30C.glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); + } + + /** + * Retrievees information about attachments of a bound framebuffer object. + * + * @param target the target of the query operation. One of:
    {@link GL30C#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30C#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30C#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment within {@code target}. One of:
    {@link GL30C#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30C#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30C#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30C#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30C#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30C#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30C#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30C#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30C#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30C#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30C#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30C#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30C#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30C#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30C#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30C#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30C#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30C#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30C#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30C#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30C#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30C#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30C#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30C#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30C#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30C#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30C#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30C#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30C#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30C#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30C#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30C#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30C#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30C#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30C#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link GL30C#GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetFramebufferAttachmentParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname) { + return GL30C.glGetFramebufferAttachmentParameteri(target, attachment, pname); + } + + // --- [ glBlitFramebuffer ] --- + + /** + * Copies a block of pixels from the read framebuffer to the draw framebuffer. + * + * @param srcX0 the lower-left coordinate of the source rectangle within the read buffer + * @param srcY0 the upper-left coordinate of the source rectangle within the read buffer + * @param srcX1 the lower-right coordinate of the source rectangle within the read buffer + * @param srcY1 the upper-right coordinate of the source rectangle within the read buffer + * @param dstX0 the lower-left coordinate of the destination rectangle within the write buffer + * @param dstY0 the upper-left coordinate of the destination rectangle within the write buffer + * @param dstX1 the lower-right coordinate of the destination rectangle within the write buffer + * @param dstY1 the upper-right coordinate of the destination rectangle within the write buffer + * @param mask the bitwise OR of the flags indicating which buffers are to be copied. One of:
    {@link GL11#GL_COLOR_BUFFER_BIT COLOR_BUFFER_BIT}{@link GL11#GL_DEPTH_BUFFER_BIT DEPTH_BUFFER_BIT}{@link GL11#GL_STENCIL_BUFFER_BIT STENCIL_BUFFER_BIT}
    + * @param filter the interpolation to be applied if the image is stretched. One of:
    {@link GL11#GL_NEAREST NEAREST}{@link GL11#GL_LINEAR LINEAR}
    + * + * @see Reference Page + */ + public static void glBlitFramebuffer(@NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter) { + GL30C.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + } + + // --- [ glGenerateMipmap ] --- + + /** + * Generate mipmaps for a specified texture target. + * + * @param target the target to which the texture whose mimaps to generate is bound. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30C#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL30C#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * + * @see Reference Page + */ + public static void glGenerateMipmap(@NativeType("GLenum") int target) { + GL30C.glGenerateMipmap(target); + } + + // --- [ glTexParameterIiv ] --- + + /** Unsafe version of: {@link #glTexParameterIiv TexParameterIiv} */ + public static void nglTexParameterIiv(int target, int pname, long params) { + GL30C.nglTexParameterIiv(target, pname, params); + } + + /** + * Sets the integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a single-valued texture parameter + * @param params the value of {@code pname} + * + * @see Reference Page + */ + public static void glTexParameterIiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + GL30C.glTexParameterIiv(target, pname, params); + } + + /** + * Sets the integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a single-valued texture parameter + * + * @see Reference Page + */ + public static void glTexParameterIi(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int param) { + GL30C.glTexParameterIi(target, pname, param); + } + + // --- [ glTexParameterIuiv ] --- + + /** Unsafe version of: {@link #glTexParameterIuiv TexParameterIuiv} */ + public static void nglTexParameterIuiv(int target, int pname, long params) { + GL30C.nglTexParameterIuiv(target, pname, params); + } + + /** + * Sets the unsigned integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a single-valued texture parameter + * @param params the value of {@code pname} + * + * @see Reference Page + */ + public static void glTexParameterIuiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint const *") IntBuffer params) { + GL30C.glTexParameterIuiv(target, pname, params); + } + + /** + * Sets the unsigned integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a single-valued texture parameter + * + * @see Reference Page + */ + public static void glTexParameterIui(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int param) { + GL30C.glTexParameterIui(target, pname, param); + } + + // --- [ glGetTexParameterIiv ] --- + + /** Unsafe version of: {@link #glGetTexParameterIiv GetTexParameterIiv} */ + public static void nglGetTexParameterIiv(int target, int pname, long params) { + GL30C.nglGetTexParameterIiv(target, pname, params); + } + + /** + * Returns the integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a texture parameter + * @param params returns the texture parameter value + * + * @see Reference Page + */ + public static void glGetTexParameterIiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL30C.glGetTexParameterIiv(target, pname, params); + } + + /** + * Returns the integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a texture parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTexParameterIi(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL30C.glGetTexParameterIi(target, pname); + } + + // --- [ glGetTexParameterIuiv ] --- + + /** Unsafe version of: {@link #glGetTexParameterIuiv GetTexParameterIuiv} */ + public static void nglGetTexParameterIuiv(int target, int pname, long params) { + GL30C.nglGetTexParameterIuiv(target, pname, params); + } + + /** + * Returns the unsigned integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a texture parameter + * @param params returns the texture parameter value + * + * @see Reference Page + */ + public static void glGetTexParameterIuiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + GL30C.glGetTexParameterIuiv(target, pname, params); + } + + /** + * Returns the unsigned integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a texture parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTexParameterIui(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL30C.glGetTexParameterIui(target, pname); + } + + // --- [ glColorMaski ] --- + + /** + * Enables and disables writing of frame buffer color components. + * + * @param buf the index of the draw buffer whose color mask to set + * @param r whether R values are written or not + * @param g whether G values are written or not + * @param b whether B values are written or not + * @param a whether A values are written or not + * + * @see Reference Page + */ + public static void glColorMaski(@NativeType("GLuint") int buf, @NativeType("GLboolean") boolean r, @NativeType("GLboolean") boolean g, @NativeType("GLboolean") boolean b, @NativeType("GLboolean") boolean a) { + GL30C.glColorMaski(buf, r, g, b, a); + } + + // --- [ glGetBooleani_v ] --- + + /** Unsafe version of: {@link #glGetBooleani_v GetBooleani_v} */ + public static void nglGetBooleani_v(int target, int index, long data) { + GL30C.nglGetBooleani_v(target, index, data); + } + + /** + * Queries the boolean value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetBooleani_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLboolean *") ByteBuffer data) { + GL30C.glGetBooleani_v(target, index, data); + } + + /** + * Queries the boolean value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * + * @see Reference Page + */ + @NativeType("void") + public static boolean glGetBooleani(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return GL30C.glGetBooleani(target, index); + } + + // --- [ glGetIntegeri_v ] --- + + /** Unsafe version of: {@link #glGetIntegeri_v GetIntegeri_v} */ + public static void nglGetIntegeri_v(int target, int index, long data) { + GL30C.nglGetIntegeri_v(target, index, data); + } + + /** + * Queries the integer value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetIntegeri_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer data) { + GL30C.glGetIntegeri_v(target, index, data); + } + + /** + * Queries the integer value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetIntegeri(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return GL30C.glGetIntegeri(target, index); + } + + // --- [ glEnablei ] --- + + /** + * Enables an indexed capability. + * + * @param cap the indexed capability to enable + * @param index the index to enable + * + * @see Reference Page + */ + public static void glEnablei(@NativeType("GLenum") int cap, @NativeType("GLuint") int index) { + GL30C.glEnablei(cap, index); + } + + // --- [ glDisablei ] --- + + /** + * Disables an indexed capability. + * + * @param target the indexed capability to disable + * @param index the index to disable + * + * @see Reference Page + */ + public static void glDisablei(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + GL30C.glDisablei(target, index); + } + + // --- [ glIsEnabledi ] --- + + /** + * Tests whether an indexed capability is enabled. + * + * @param target the indexed capability to query + * @param index the index to query + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsEnabledi(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return GL30C.glIsEnabledi(target, index); + } + + // --- [ glBindBufferRange ] --- + + /** + * Binds a range within a buffer object to an indexed buffer target. + * + * @param target the target of the bind operation. One of:
    {@link GL30C#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}
    + * @param index the index of the binding point within the array specified by {@code target} + * @param buffer a buffer object to bind to the specified binding point + * @param offset the starting offset in basic machine units into the buffer object {@code buffer} + * @param size the amount of data in machine units that can be read from the buffer object while used as an indexed target + * + * @see Reference Page + */ + public static void glBindBufferRange(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size) { + GL30C.glBindBufferRange(target, index, buffer, offset, size); + } + + // --- [ glBindBufferBase ] --- + + /** + * Binds a buffer object to an indexed buffer target. + * + * @param target the target of the bind operation. One of:
    {@link GL30C#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}
    + * @param index the index of the binding point within the array specified by {@code target} + * @param buffer a buffer object to bind to the specified binding point + * + * @see Reference Page + */ + public static void glBindBufferBase(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer) { + GL30C.glBindBufferBase(target, index, buffer); + } + + // --- [ glBeginTransformFeedback ] --- + + /** + * Starts transform feedback operation. + * + * @param primitiveMode the output type of the primitives that will be recorded into the buffer objects that are bound for transform feedback. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLES TRIANGLES}
    + * + * @see Reference Page + */ + public static void glBeginTransformFeedback(@NativeType("GLenum") int primitiveMode) { + GL30C.glBeginTransformFeedback(primitiveMode); + } + + // --- [ glEndTransformFeedback ] --- + + /** + * Ends transform feedback operation. + * + * @see Reference Page + */ + public static void glEndTransformFeedback() { + GL30C.glEndTransformFeedback(); + } + + // --- [ glTransformFeedbackVaryings ] --- + + /** + * Unsafe version of: {@link #glTransformFeedbackVaryings TransformFeedbackVaryings} + * + * @param count the number of varying variables used for transform feedback + */ + public static void nglTransformFeedbackVaryings(int program, int count, long varyings, int bufferMode) { + GL30C.nglTransformFeedbackVaryings(program, count, varyings, bufferMode); + } + + /** + * Specifies values to record in transform feedback buffers. + * + * @param program the target program object + * @param varyings an array of {@code count} zero-terminated strings specifying the names of the varying variables to use for transform feedback + * @param bufferMode the mode used to capture the varying variables when transform feedback is active. One of:
    {@link GL30C#GL_INTERLEAVED_ATTRIBS INTERLEAVED_ATTRIBS}{@link GL30C#GL_SEPARATE_ATTRIBS SEPARATE_ATTRIBS}
    + * + * @see Reference Page + */ + public static void glTransformFeedbackVaryings(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") PointerBuffer varyings, @NativeType("GLenum") int bufferMode) { + GL30C.glTransformFeedbackVaryings(program, varyings, bufferMode); + } + + /** + * Specifies values to record in transform feedback buffers. + * + * @param program the target program object + * @param varyings an array of {@code count} zero-terminated strings specifying the names of the varying variables to use for transform feedback + * @param bufferMode the mode used to capture the varying variables when transform feedback is active. One of:
    {@link GL30C#GL_INTERLEAVED_ATTRIBS INTERLEAVED_ATTRIBS}{@link GL30C#GL_SEPARATE_ATTRIBS SEPARATE_ATTRIBS}
    + * + * @see Reference Page + */ + public static void glTransformFeedbackVaryings(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence[] varyings, @NativeType("GLenum") int bufferMode) { + GL30C.glTransformFeedbackVaryings(program, varyings, bufferMode); + } + + /** + * Specifies values to record in transform feedback buffers. + * + * @param program the target program object + * @param bufferMode the mode used to capture the varying variables when transform feedback is active. One of:
    {@link GL30C#GL_INTERLEAVED_ATTRIBS INTERLEAVED_ATTRIBS}{@link GL30C#GL_SEPARATE_ATTRIBS SEPARATE_ATTRIBS}
    + * + * @see Reference Page + */ + public static void glTransformFeedbackVaryings(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence varying, @NativeType("GLenum") int bufferMode) { + GL30C.glTransformFeedbackVaryings(program, varying, bufferMode); + } + + // --- [ glGetTransformFeedbackVarying ] --- + + /** + * Unsafe version of: {@link #glGetTransformFeedbackVarying GetTransformFeedbackVarying} + * + * @param bufSize the maximum number of characters, including the null terminator, that may be written into {@code name} + */ + public static void nglGetTransformFeedbackVarying(int program, int index, int bufSize, long length, long size, long type, long name) { + GL30C.nglGetTransformFeedbackVarying(program, index, bufSize, length, size, type, name); + } + + /** + * Retrieves information about varying variables selected for transform feedback. + * + * @param program the target program object + * @param index the index of the varying variable whose information to retrieve + * @param length a variable which will receive the number of characters written into {@code name}, excluding the null-terminator. If {@code length} is NULL no length is returned. + * @param size a variable that will receive the size of the varying + * @param type a variable that will receive the type of the varying + * @param name a buffer into which will be written the name of the varying + * + * @see Reference Page + */ + public static void glGetTransformFeedbackVarying(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLsizei *") IntBuffer size, @NativeType("GLenum *") IntBuffer type, @NativeType("GLchar *") ByteBuffer name) { + GL30C.glGetTransformFeedbackVarying(program, index, length, size, type, name); + } + + /** + * Retrieves information about varying variables selected for transform feedback. + * + * @param program the target program object + * @param index the index of the varying variable whose information to retrieve + * @param bufSize the maximum number of characters, including the null terminator, that may be written into {@code name} + * @param size a variable that will receive the size of the varying + * @param type a variable that will receive the type of the varying + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetTransformFeedbackVarying(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufSize, @NativeType("GLsizei *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return GL30C.glGetTransformFeedbackVarying(program, index, bufSize, size, type); + } + + /** + * Retrieves information about varying variables selected for transform feedback. + * + * @param program the target program object + * @param index the index of the varying variable whose information to retrieve + * @param size a variable that will receive the size of the varying + * @param type a variable that will receive the type of the varying + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetTransformFeedbackVarying(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLsizei *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return glGetTransformFeedbackVarying(program, index, GL20.glGetProgrami(program, GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH), size, type); + } + + // --- [ glBindVertexArray ] --- + + /** + * Binds a vertex array object + * + * @param array the name of the vertex array to bind + * + * @see Reference Page + */ + public static void glBindVertexArray(@NativeType("GLuint") int array) { + GL30C.glBindVertexArray(array); + } + + // --- [ glDeleteVertexArrays ] --- + + /** + * Unsafe version of: {@link #glDeleteVertexArrays DeleteVertexArrays} + * + * @param n the number of vertex array objects to be deleted + */ + public static void nglDeleteVertexArrays(int n, long arrays) { + GL30C.nglDeleteVertexArrays(n, arrays); + } + + /** + * Deletes vertex array objects. + * + * @param arrays an array containing the n names of the objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteVertexArrays(@NativeType("GLuint const *") IntBuffer arrays) { + GL30C.glDeleteVertexArrays(arrays); + } + + /** + * Deletes vertex array objects. + * + * @see Reference Page + */ + public static void glDeleteVertexArrays(@NativeType("GLuint const *") int array) { + GL30C.glDeleteVertexArrays(array); + } + + // --- [ glGenVertexArrays ] --- + + /** + * Unsafe version of: {@link #glGenVertexArrays GenVertexArrays} + * + * @param n the number of vertex array object names to generate + */ + public static void nglGenVertexArrays(int n, long arrays) { + GL30C.nglGenVertexArrays(n, arrays); + } + + /** + * Generates vertex array object names. + * + * @param arrays a buffer in which the generated vertex array object names are stored + * + * @see Reference Page + */ + public static void glGenVertexArrays(@NativeType("GLuint *") IntBuffer arrays) { + GL30C.glGenVertexArrays(arrays); + } + + /** + * Generates vertex array object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenVertexArrays() { + return GL30C.glGenVertexArrays(); + } + + // --- [ glIsVertexArray ] --- + + /** + * Determines if a name corresponds to a vertex array object. + * + * @param array a value that may be the name of a vertex array object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsVertexArray(@NativeType("GLuint") int array) { + return GL30C.glIsVertexArray(array); + } + + /** + * Array version of: {@link #glClearBufferiv ClearBufferiv} + * + * @see Reference Page + */ + public static void glClearBufferiv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") int[] value) { + GL30C.glClearBufferiv(buffer, drawbuffer, value); + } + + /** + * Array version of: {@link #glClearBufferuiv ClearBufferuiv} + * + * @see Reference Page + */ + public static void glClearBufferuiv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") int[] value) { + GL30C.glClearBufferuiv(buffer, drawbuffer, value); + } + + /** + * Array version of: {@link #glClearBufferfv ClearBufferfv} + * + * @see Reference Page + */ + public static void glClearBufferfv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat const *") float[] value) { + GL30C.glClearBufferfv(buffer, drawbuffer, value); + } + + /** + * Array version of: {@link #glVertexAttribI1iv VertexAttribI1iv} + * + * @see Reference Page + */ + public static void glVertexAttribI1iv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + GL30C.glVertexAttribI1iv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribI2iv VertexAttribI2iv} + * + * @see Reference Page + */ + public static void glVertexAttribI2iv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + GL30C.glVertexAttribI2iv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribI3iv VertexAttribI3iv} + * + * @see Reference Page + */ + public static void glVertexAttribI3iv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + GL30C.glVertexAttribI3iv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribI4iv VertexAttribI4iv} + * + * @see Reference Page + */ + public static void glVertexAttribI4iv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + GL30C.glVertexAttribI4iv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribI1uiv VertexAttribI1uiv} + * + * @see Reference Page + */ + public static void glVertexAttribI1uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + GL30C.glVertexAttribI1uiv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribI2uiv VertexAttribI2uiv} + * + * @see Reference Page + */ + public static void glVertexAttribI2uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + GL30C.glVertexAttribI2uiv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribI3uiv VertexAttribI3uiv} + * + * @see Reference Page + */ + public static void glVertexAttribI3uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + GL30C.glVertexAttribI3uiv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribI4uiv VertexAttribI4uiv} + * + * @see Reference Page + */ + public static void glVertexAttribI4uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + GL30C.glVertexAttribI4uiv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribI4sv VertexAttribI4sv} + * + * @see Reference Page + */ + public static void glVertexAttribI4sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + GL30C.glVertexAttribI4sv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribI4usv VertexAttribI4usv} + * + * @see Reference Page + */ + public static void glVertexAttribI4usv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + GL30C.glVertexAttribI4usv(index, v); + } + + /** + * Array version of: {@link #glGetVertexAttribIiv GetVertexAttribIiv} + * + * @see Reference Page + */ + public static void glGetVertexAttribIiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL30C.glGetVertexAttribIiv(index, pname, params); + } + + /** + * Array version of: {@link #glGetVertexAttribIuiv GetVertexAttribIuiv} + * + * @see Reference Page + */ + public static void glGetVertexAttribIuiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + GL30C.glGetVertexAttribIuiv(index, pname, params); + } + + /** + * Array version of: {@link #glUniform1uiv Uniform1uiv} + * + * @see Reference Page + */ + public static void glUniform1uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL30C.glUniform1uiv(location, value); + } + + /** + * Array version of: {@link #glUniform2uiv Uniform2uiv} + * + * @see Reference Page + */ + public static void glUniform2uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL30C.glUniform2uiv(location, value); + } + + /** + * Array version of: {@link #glUniform3uiv Uniform3uiv} + * + * @see Reference Page + */ + public static void glUniform3uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL30C.glUniform3uiv(location, value); + } + + /** + * Array version of: {@link #glUniform4uiv Uniform4uiv} + * + * @see Reference Page + */ + public static void glUniform4uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL30C.glUniform4uiv(location, value); + } + + /** + * Array version of: {@link #glGetUniformuiv GetUniformuiv} + * + * @see Reference Page + */ + public static void glGetUniformuiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") int[] params) { + GL30C.glGetUniformuiv(program, location, params); + } + + /** + * Array version of: {@link #glDeleteRenderbuffers DeleteRenderbuffers} + * + * @see Reference Page + */ + public static void glDeleteRenderbuffers(@NativeType("GLuint const *") int[] renderbuffers) { + GL30C.glDeleteRenderbuffers(renderbuffers); + } + + /** + * Array version of: {@link #glGenRenderbuffers GenRenderbuffers} + * + * @see Reference Page + */ + public static void glGenRenderbuffers(@NativeType("GLuint *") int[] renderbuffers) { + GL30C.glGenRenderbuffers(renderbuffers); + } + + /** + * Array version of: {@link #glGetRenderbufferParameteriv GetRenderbufferParameteriv} + * + * @see Reference Page + */ + public static void glGetRenderbufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL30C.glGetRenderbufferParameteriv(target, pname, params); + } + + /** + * Array version of: {@link #glDeleteFramebuffers DeleteFramebuffers} + * + * @see Reference Page + */ + public static void glDeleteFramebuffers(@NativeType("GLuint const *") int[] framebuffers) { + GL30C.glDeleteFramebuffers(framebuffers); + } + + /** + * Array version of: {@link #glGenFramebuffers GenFramebuffers} + * + * @see Reference Page + */ + public static void glGenFramebuffers(@NativeType("GLuint *") int[] framebuffers) { + GL30C.glGenFramebuffers(framebuffers); + } + + /** + * Array version of: {@link #glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv} + * + * @see Reference Page + */ + public static void glGetFramebufferAttachmentParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL30C.glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); + } + + /** + * Array version of: {@link #glTexParameterIiv TexParameterIiv} + * + * @see Reference Page + */ + public static void glTexParameterIiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + GL30C.glTexParameterIiv(target, pname, params); + } + + /** + * Array version of: {@link #glTexParameterIuiv TexParameterIuiv} + * + * @see Reference Page + */ + public static void glTexParameterIuiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int[] params) { + GL30C.glTexParameterIuiv(target, pname, params); + } + + /** + * Array version of: {@link #glGetTexParameterIiv GetTexParameterIiv} + * + * @see Reference Page + */ + public static void glGetTexParameterIiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL30C.glGetTexParameterIiv(target, pname, params); + } + + /** + * Array version of: {@link #glGetTexParameterIuiv GetTexParameterIuiv} + * + * @see Reference Page + */ + public static void glGetTexParameterIuiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + GL30C.glGetTexParameterIuiv(target, pname, params); + } + + /** + * Array version of: {@link #glGetIntegeri_v GetIntegeri_v} + * + * @see Reference Page + */ + public static void glGetIntegeri_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") int[] data) { + GL30C.glGetIntegeri_v(target, index, data); + } + + /** + * Array version of: {@link #glGetTransformFeedbackVarying GetTransformFeedbackVarying} + * + * @see Reference Page + */ + public static void glGetTransformFeedbackVarying(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLsizei *") int[] size, @NativeType("GLenum *") int[] type, @NativeType("GLchar *") ByteBuffer name) { + GL30C.glGetTransformFeedbackVarying(program, index, length, size, type, name); + } + + /** + * Array version of: {@link #glDeleteVertexArrays DeleteVertexArrays} + * + * @see Reference Page + */ + public static void glDeleteVertexArrays(@NativeType("GLuint const *") int[] arrays) { + GL30C.glDeleteVertexArrays(arrays); + } + + /** + * Array version of: {@link #glGenVertexArrays GenVertexArrays} + * + * @see Reference Page + */ + public static void glGenVertexArrays(@NativeType("GLuint *") int[] arrays) { + GL30C.glGenVertexArrays(arrays); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL30C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL30C.java new file mode 100644 index 000000000..3188ea75d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL30C.java @@ -0,0 +1,2908 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; +import org.lwjgl.system.MemoryUtil; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality of a forward compatible context, up to version 3.0. + * + *

    OpenGL 3.0 implementations are guaranteed to support at least versions 1.10, 1.20 and 1.30 of the shading language, + * although versions 1.10 and 1.20 are deprecated in a forward-compatible context.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL30C extends GL21C { + + static { GL.initialize(); } + + /** GetTarget */ + public static final int + GL_MAJOR_VERSION = 0x821B, + GL_MINOR_VERSION = 0x821C, + GL_NUM_EXTENSIONS = 0x821D, + GL_CONTEXT_FLAGS = 0x821E, + GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT = 0x1; + + /** Renamed tokens. */ + public static final int + GL_COMPARE_REF_TO_TEXTURE = 0x884E, + GL_CLIP_DISTANCE0 = 0x3000, + GL_CLIP_DISTANCE1 = 0x3001, + GL_CLIP_DISTANCE2 = 0x3002, + GL_CLIP_DISTANCE3 = 0x3003, + GL_CLIP_DISTANCE4 = 0x3004, + GL_CLIP_DISTANCE5 = 0x3005, + GL_CLIP_DISTANCE6 = 0x3006, + GL_CLIP_DISTANCE7 = 0x3007, + GL_MAX_CLIP_DISTANCES = 0xD32, + GL_MAX_VARYING_COMPONENTS = 0x8B4B; + + /** Accepted by the {@code pname} parameters of GetVertexAttribdv, GetVertexAttribfv, GetVertexAttribiv, GetVertexAttribIuiv and GetVertexAttribIiv. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_1D_ARRAY = 0x8DC0, + GL_SAMPLER_2D_ARRAY = 0x8DC1, + GL_SAMPLER_1D_ARRAY_SHADOW = 0x8DC3, + GL_SAMPLER_2D_ARRAY_SHADOW = 0x8DC4, + GL_SAMPLER_CUBE_SHADOW = 0x8DC5, + GL_UNSIGNED_INT_VEC2 = 0x8DC6, + GL_UNSIGNED_INT_VEC3 = 0x8DC7, + GL_UNSIGNED_INT_VEC4 = 0x8DC8, + GL_INT_SAMPLER_1D = 0x8DC9, + GL_INT_SAMPLER_2D = 0x8DCA, + GL_INT_SAMPLER_3D = 0x8DCB, + GL_INT_SAMPLER_CUBE = 0x8DCC, + GL_INT_SAMPLER_1D_ARRAY = 0x8DCE, + GL_INT_SAMPLER_2D_ARRAY = 0x8DCF, + GL_UNSIGNED_INT_SAMPLER_1D = 0x8DD1, + GL_UNSIGNED_INT_SAMPLER_2D = 0x8DD2, + GL_UNSIGNED_INT_SAMPLER_3D = 0x8DD3, + GL_UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4, + GL_UNSIGNED_INT_SAMPLER_1D_ARRAY = 0x8DD6, + GL_UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MIN_PROGRAM_TEXEL_OFFSET = 0x8904, + GL_MAX_PROGRAM_TEXEL_OFFSET = 0x8905; + + /** Accepted by the {@code mode} parameter of BeginConditionalRender. */ + public static final int + GL_QUERY_WAIT = 0x8E13, + GL_QUERY_NO_WAIT = 0x8E14, + GL_QUERY_BY_REGION_WAIT = 0x8E15, + GL_QUERY_BY_REGION_NO_WAIT = 0x8E16; + + /** Accepted by the {@code access} parameter of MapBufferRange. */ + public static final int + GL_MAP_READ_BIT = 0x1, + GL_MAP_WRITE_BIT = 0x2, + GL_MAP_INVALIDATE_RANGE_BIT = 0x4, + GL_MAP_INVALIDATE_BUFFER_BIT = 0x8, + GL_MAP_FLUSH_EXPLICIT_BIT = 0x10, + GL_MAP_UNSYNCHRONIZED_BIT = 0x20; + + /** Accepted by the {@code pname} parameter of GetBufferParameteriv. */ + public static final int + GL_BUFFER_ACCESS_FLAGS = 0x911F, + GL_BUFFER_MAP_LENGTH = 0x9120, + GL_BUFFER_MAP_OFFSET = 0x9121; + + /** Accepted by the {@code target} parameter of ClampColor and the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_CLAMP_READ_COLOR = 0x891C; + + /** Accepted by the {@code clamp} parameter of ClampColor. */ + public static final int GL_FIXED_ONLY = 0x891D; + + /** + * Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorage, and + * returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameteriv. + */ + public static final int + GL_DEPTH_COMPONENT32F = 0x8CAC, + GL_DEPTH32F_STENCIL8 = 0x8CAD; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage. + */ + public static final int GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; + + /** Accepted by the {@code value} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_RED_TYPE = 0x8C10, + GL_TEXTURE_GREEN_TYPE = 0x8C11, + GL_TEXTURE_BLUE_TYPE = 0x8C12, + GL_TEXTURE_ALPHA_TYPE = 0x8C13, + GL_TEXTURE_DEPTH_TYPE = 0x8C16; + + /** Returned by the {@code params} parameter of GetTexLevelParameter. */ + public static final int GL_UNSIGNED_NORMALIZED = 0x8C17; + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, and TexImage3D. */ + public static final int + GL_RGBA32F = 0x8814, + GL_RGB32F = 0x8815, + GL_RGBA16F = 0x881A, + GL_RGB16F = 0x881B; + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorage. */ + public static final int GL_R11F_G11F_B10F = 0x8C3A; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, ColorSubTable, and GetColorTable. + */ + public static final int GL_UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B; + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorage. */ + public static final int GL_RGB9_E5 = 0x8C3D; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, ColorSubTable, and GetColorTable. + */ + public static final int GL_UNSIGNED_INT_5_9_9_9_REV = 0x8C3E; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameterfv and GetTexLevelParameteriv. */ + public static final int GL_TEXTURE_SHARED_SIZE = 0x8C3F; + + /** + * Accepted by the {@code target} parameter of BindFramebuffer, CheckFramebufferStatus, FramebufferTexture{1D|2D|3D}, FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv. + */ + public static final int + GL_FRAMEBUFFER = 0x8D40, + GL_READ_FRAMEBUFFER = 0x8CA8, + GL_DRAW_FRAMEBUFFER = 0x8CA9; + + /** + * Accepted by the {@code target} parameter of BindRenderbuffer, RenderbufferStorage, and GetRenderbufferParameteriv, and returned by + * GetFramebufferAttachmentParameteriv. + */ + public static final int GL_RENDERBUFFER = 0x8D41; + + /** Accepted by the {@code internalformat} parameter of RenderbufferStorage. */ + public static final int + GL_STENCIL_INDEX1 = 0x8D46, + GL_STENCIL_INDEX4 = 0x8D47, + GL_STENCIL_INDEX8 = 0x8D48, + GL_STENCIL_INDEX16 = 0x8D49; + + /** Accepted by the {@code pname} parameter of GetRenderbufferParameteriv. */ + public static final int + GL_RENDERBUFFER_WIDTH = 0x8D42, + GL_RENDERBUFFER_HEIGHT = 0x8D43, + GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8D44, + GL_RENDERBUFFER_RED_SIZE = 0x8D50, + GL_RENDERBUFFER_GREEN_SIZE = 0x8D51, + GL_RENDERBUFFER_BLUE_SIZE = 0x8D52, + GL_RENDERBUFFER_ALPHA_SIZE = 0x8D53, + GL_RENDERBUFFER_DEPTH_SIZE = 0x8D54, + GL_RENDERBUFFER_STENCIL_SIZE = 0x8D55, + GL_RENDERBUFFER_SAMPLES = 0x8CAB; + + /** Accepted by the {@code pname} parameter of GetFramebufferAttachmentParameteriv. */ + public static final int + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4, + GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210, + GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211, + GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212, + GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213, + GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214, + GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215, + GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216, + GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217; + + /** Returned in {@code params} by GetFramebufferAttachmentParameteriv. */ + public static final int GL_FRAMEBUFFER_DEFAULT = 0x8218; + + /** Accepted by the {@code attachment} parameter of FramebufferTexture{1D|2D|3D}, FramebufferRenderbuffer, and GetFramebufferAttachmentParameteriv. */ + public static final int + GL_COLOR_ATTACHMENT0 = 0x8CE0, + GL_COLOR_ATTACHMENT1 = 0x8CE1, + GL_COLOR_ATTACHMENT2 = 0x8CE2, + GL_COLOR_ATTACHMENT3 = 0x8CE3, + GL_COLOR_ATTACHMENT4 = 0x8CE4, + GL_COLOR_ATTACHMENT5 = 0x8CE5, + GL_COLOR_ATTACHMENT6 = 0x8CE6, + GL_COLOR_ATTACHMENT7 = 0x8CE7, + GL_COLOR_ATTACHMENT8 = 0x8CE8, + GL_COLOR_ATTACHMENT9 = 0x8CE9, + GL_COLOR_ATTACHMENT10 = 0x8CEA, + GL_COLOR_ATTACHMENT11 = 0x8CEB, + GL_COLOR_ATTACHMENT12 = 0x8CEC, + GL_COLOR_ATTACHMENT13 = 0x8CED, + GL_COLOR_ATTACHMENT14 = 0x8CEE, + GL_COLOR_ATTACHMENT15 = 0x8CEF, + GL_COLOR_ATTACHMENT16 = 0x8CF0, + GL_COLOR_ATTACHMENT17 = 0x8CF1, + GL_COLOR_ATTACHMENT18 = 0x8CF2, + GL_COLOR_ATTACHMENT19 = 0x8CF3, + GL_COLOR_ATTACHMENT20 = 0x8CF4, + GL_COLOR_ATTACHMENT21 = 0x8CF5, + GL_COLOR_ATTACHMENT22 = 0x8CF6, + GL_COLOR_ATTACHMENT23 = 0x8CF7, + GL_COLOR_ATTACHMENT24 = 0x8CF8, + GL_COLOR_ATTACHMENT25 = 0x8CF9, + GL_COLOR_ATTACHMENT26 = 0x8CFA, + GL_COLOR_ATTACHMENT27 = 0x8CFB, + GL_COLOR_ATTACHMENT28 = 0x8CFC, + GL_COLOR_ATTACHMENT29 = 0x8CFD, + GL_COLOR_ATTACHMENT30 = 0x8CFE, + GL_COLOR_ATTACHMENT31 = 0x8CFF, + GL_DEPTH_ATTACHMENT = 0x8D00, + GL_STENCIL_ATTACHMENT = 0x8D20, + GL_DEPTH_STENCIL_ATTACHMENT = 0x821A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_SAMPLES = 0x8D57; + + /** Returned by CheckFramebufferStatus(). */ + public static final int + GL_FRAMEBUFFER_COMPLETE = 0x8CD5, + GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6, + GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7, + GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0x8CDB, + GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0x8CDC, + GL_FRAMEBUFFER_UNSUPPORTED = 0x8CDD, + GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56, + GL_FRAMEBUFFER_UNDEFINED = 0x8219; + + /** Accepted by the {@code pname} parameters of GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_FRAMEBUFFER_BINDING = 0x8CA6, + GL_DRAW_FRAMEBUFFER_BINDING = 0x8CA6, + GL_READ_FRAMEBUFFER_BINDING = 0x8CAA, + GL_RENDERBUFFER_BINDING = 0x8CA7, + GL_MAX_COLOR_ATTACHMENTS = 0x8CDF, + GL_MAX_RENDERBUFFER_SIZE = 0x84E8; + + /** Returned by GetError(). */ + public static final int GL_INVALID_FRAMEBUFFER_OPERATION = 0x506; + + /** + * Accepted by the {@code format} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage, by the {@code type} parameter of CopyPixels, by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, + * CopyTexImage2D, and RenderbufferStorage, and returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameteriv. + */ + public static final int GL_DEPTH_STENCIL = 0x84F9; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage. + */ + public static final int GL_UNSIGNED_INT_24_8 = 0x84FA; + + /** + * Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorage, and + * returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameteriv. + */ + public static final int GL_DEPTH24_STENCIL8 = 0x88F0; + + /** Accepted by the {@code value} parameter of GetTexLevelParameter. */ + public static final int GL_TEXTURE_STENCIL_SIZE = 0x88F1; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, GetTexImage, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D, GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter, + * ColorTable, ColorSubTable, and GetColorTable. + * + *

    Accepted by the {@code type} argument of VertexPointer, NormalPointer, ColorPointer, SecondaryColorPointer, FogCoordPointer, TexCoordPointer, and + * VertexAttribPointer.

    + */ + public static final int GL_HALF_FLOAT = 0x140B; + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, and TexImage3D. */ + public static final int + GL_RGBA32UI = 0x8D70, + GL_RGB32UI = 0x8D71, + GL_RGBA16UI = 0x8D76, + GL_RGB16UI = 0x8D77, + GL_RGBA8UI = 0x8D7C, + GL_RGB8UI = 0x8D7D, + GL_RGBA32I = 0x8D82, + GL_RGB32I = 0x8D83, + GL_RGBA16I = 0x8D88, + GL_RGB16I = 0x8D89, + GL_RGBA8I = 0x8D8E, + GL_RGB8I = 0x8D8F; + + /** Accepted by the {@code format} parameter of TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, DrawPixels and ReadPixels. */ + public static final int + GL_RED_INTEGER = 0x8D94, + GL_GREEN_INTEGER = 0x8D95, + GL_BLUE_INTEGER = 0x8D96, + GL_RGB_INTEGER = 0x8D98, + GL_RGBA_INTEGER = 0x8D99, + GL_BGR_INTEGER = 0x8D9A, + GL_BGRA_INTEGER = 0x8D9B; + + /** Accepted by the {@code target} parameter of TexParameteri, TexParameteriv, TexParameterf, TexParameterfv, GenerateMipmap, and BindTexture. */ + public static final int + GL_TEXTURE_1D_ARRAY = 0x8C18, + GL_TEXTURE_2D_ARRAY = 0x8C1A; + + /** Accepted by the {@code target} parameter of TexImage3D, TexSubImage3D, CopyTexSubImage3D, CompressedTexImage3D, and CompressedTexSubImage3D. */ + public static final int GL_PROXY_TEXTURE_2D_ARRAY = 0x8C1B; + + /** + * Accepted by the {@code target} parameter of TexImage2D, TexSubImage2D, CopyTexImage2D, CopyTexSubImage2D, CompressedTexImage2D, and + * CompressedTexSubImage2D. + */ + public static final int GL_PROXY_TEXTURE_1D_ARRAY = 0x8C19; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv and GetFloatv. */ + public static final int + GL_TEXTURE_BINDING_1D_ARRAY = 0x8C1C, + GL_TEXTURE_BINDING_2D_ARRAY = 0x8C1D, + GL_MAX_ARRAY_TEXTURE_LAYERS = 0x88FF; + + /** + * Accepted by the {@code internalformat} parameter of TexImage2D, CopyTexImage2D, and CompressedTexImage2D and the {@code format} parameter of + * CompressedTexSubImage2D. + */ + public static final int + GL_COMPRESSED_RED_RGTC1 = 0x8DBB, + GL_COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC, + GL_COMPRESSED_RG_RGTC2 = 0x8DBD, + GL_COMPRESSED_SIGNED_RG_RGTC2 = 0x8DBE; + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, and CopyTexImage2D. */ + public static final int + GL_R8 = 0x8229, + GL_R16 = 0x822A, + GL_RG8 = 0x822B, + GL_RG16 = 0x822C, + GL_R16F = 0x822D, + GL_R32F = 0x822E, + GL_RG16F = 0x822F, + GL_RG32F = 0x8230, + GL_R8I = 0x8231, + GL_R8UI = 0x8232, + GL_R16I = 0x8233, + GL_R16UI = 0x8234, + GL_R32I = 0x8235, + GL_R32UI = 0x8236, + GL_RG8I = 0x8237, + GL_RG8UI = 0x8238, + GL_RG16I = 0x8239, + GL_RG16UI = 0x823A, + GL_RG32I = 0x823B, + GL_RG32UI = 0x823C, + GL_RG = 0x8227, + GL_COMPRESSED_RED = 0x8225, + GL_COMPRESSED_RG = 0x8226; + + /** Accepted by the {@code format} parameter of TexImage3D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and ReadPixels. */ + public static final int GL_RG_INTEGER = 0x8228; + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, + * BindBufferRange, BindBufferOffset and BindBufferBase. + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER = 0x8C8E; + + /** Accepted by the {@code param} parameter of GetIntegeri_v and GetBooleani_v. */ + public static final int + GL_TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84, + GL_TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85; + + /** + * Accepted by the {@code param} parameter of GetIntegeri_v and GetBooleani_v, and by the {@code pname} parameter of GetBooleanv, + * GetDoublev, GetIntegerv, and GetFloatv. + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F; + + /** Accepted by the {@code bufferMode} parameter of TransformFeedbackVaryings. */ + public static final int + GL_INTERLEAVED_ATTRIBS = 0x8C8C, + GL_SEPARATE_ATTRIBS = 0x8C8D; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int + GL_PRIMITIVES_GENERATED = 0x8C87, + GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_RASTERIZER_DISCARD = 0x8C89; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int + GL_TRANSFORM_FEEDBACK_VARYINGS = 0x8C83, + GL_TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F, + GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_VERTEX_ARRAY_BINDING = 0x85B5; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_FRAMEBUFFER_SRGB = 0x8DB9; + + protected GL30C() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetStringi ] --- + + /** Unsafe version of: {@link #glGetStringi GetStringi} */ + public static native long nglGetStringi(int name, int index); + + /** + * Queries indexed string state. + * + * @param name the indexed state to query. One of:
    {@link GL11#GL_EXTENSIONS EXTENSIONS}{@link GL20#GL_SHADING_LANGUAGE_VERSION SHADING_LANGUAGE_VERSION}
    + * @param index the index of the particular element being queried + * + * @see Reference Page + */ + @Nullable + @NativeType("GLubyte const *") + public static String glGetStringi(@NativeType("GLenum") int name, @NativeType("GLuint") int index) { + long __result = nglGetStringi(name, index); + return memUTF8Safe(__result); + } + + // --- [ glClearBufferiv ] --- + + /** Unsafe version of: {@link #glClearBufferiv ClearBufferiv} */ + public static native void nglClearBufferiv(int buffer, int drawbuffer, long value); + + /** + * Clears an individual buffer of the currently bound framebuffer object to the {@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER} binding. + * + * @param buffer the buffer to clear. One of:
    {@link GL11#GL_COLOR COLOR}{@link GL11#GL_STENCIL STENCIL}
    + * @param drawbuffer the draw buffer to clear + * @param value for color buffers, a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to. For stencil buffers, a pointer to a + * single stencil value to clear the buffer to. + * + * @see Reference Page + */ + public static void glClearBufferiv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglClearBufferiv(buffer, drawbuffer, memAddress(value)); + } + + // --- [ glClearBufferuiv ] --- + + /** Unsafe version of: {@link #glClearBufferuiv ClearBufferuiv} */ + public static native void nglClearBufferuiv(int buffer, int drawbuffer, long value); + + /** + * Clears an individual buffer of the currently bound framebuffer object to the {@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER} binding. + * + * @param buffer the buffer to clear. Must be:
    {@link GL11#GL_COLOR COLOR}
    + * @param drawbuffer the draw buffer to clear + * @param value a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to + * + * @see Reference Page + */ + public static void glClearBufferuiv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") IntBuffer value) { + if (CHECKS) { + check(value, 4); + } + nglClearBufferuiv(buffer, drawbuffer, memAddress(value)); + } + + // --- [ glClearBufferfv ] --- + + /** Unsafe version of: {@link #glClearBufferfv ClearBufferfv} */ + public static native void nglClearBufferfv(int buffer, int drawbuffer, long value); + + /** + * Clears an individual buffer of the currently bound framebuffer object to the {@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER} binding. + * + * @param buffer the buffer to clear. One of:
    {@link GL11#GL_COLOR COLOR}{@link GL11#GL_DEPTH DEPTH}
    + * @param drawbuffer the draw buffer to clear + * @param value for color buffers, a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to. For depth buffers, a pointer to a + * single depth value to clear the buffer to. + * + * @see Reference Page + */ + public static void glClearBufferfv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat const *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglClearBufferfv(buffer, drawbuffer, memAddress(value)); + } + + // --- [ glClearBufferfi ] --- + + /** + * Clears an individual buffer of the currently bound framebuffer object to the {@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER} binding. + * + * @param buffer the buffer to clear. Must be:
    {@link #GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param drawbuffer the draw buffer to clear + * @param depth the depth value to clear the buffer to + * @param stencil the stencil value to clear the buffer to + * + * @see Reference Page + */ + public static native void glClearBufferfi(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat") float depth, @NativeType("GLint") int stencil); + + // --- [ glVertexAttribI1i ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. The y and z components are implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * + * @see Reference Page + */ + public static native void glVertexAttribI1i(@NativeType("GLuint") int index, @NativeType("GLint") int x); + + // --- [ glVertexAttribI2i ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. The z component is implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * + * @see Reference Page + */ + public static native void glVertexAttribI2i(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y); + + // --- [ glVertexAttribI3i ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. The w component is implicitly set to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * + * @see Reference Page + */ + public static native void glVertexAttribI3i(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z); + + // --- [ glVertexAttribI4i ] --- + + /** + * Specifies the value of a pure integer generic vertex attribute. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + * + * @see Reference Page + */ + public static native void glVertexAttribI4i(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w); + + // --- [ glVertexAttribI1ui ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. The y and z components are implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * + * @see Reference Page + */ + public static native void glVertexAttribI1ui(@NativeType("GLuint") int index, @NativeType("GLuint") int x); + + // --- [ glVertexAttribI2ui ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. The z component is implicitly set to 0 and w to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * + * @see Reference Page + */ + public static native void glVertexAttribI2ui(@NativeType("GLuint") int index, @NativeType("GLuint") int x, @NativeType("GLuint") int y); + + // --- [ glVertexAttribI3ui ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. The w component is implicitly set to 1. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * + * @see Reference Page + */ + public static native void glVertexAttribI3ui(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z); + + // --- [ glVertexAttribI4ui ] --- + + /** + * Specifies the value of an unsigned pure integer generic vertex attribute. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + * + * @see Reference Page + */ + public static native void glVertexAttribI4ui(@NativeType("GLuint") int index, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w); + + // --- [ glVertexAttribI1iv ] --- + + /** Unsafe version of: {@link #glVertexAttribI1iv VertexAttribI1iv} */ + public static native void nglVertexAttribI1iv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI1i VertexAttribI1i}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI1iv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttribI1iv(index, memAddress(v)); + } + + // --- [ glVertexAttribI2iv ] --- + + /** Unsafe version of: {@link #glVertexAttribI2iv VertexAttribI2iv} */ + public static native void nglVertexAttribI2iv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI2i VertexAttribI2i}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI2iv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttribI2iv(index, memAddress(v)); + } + + // --- [ glVertexAttribI3iv ] --- + + /** Unsafe version of: {@link #glVertexAttribI3iv VertexAttribI3iv} */ + public static native void nglVertexAttribI3iv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI3i VertexAttribI3i}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI3iv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttribI3iv(index, memAddress(v)); + } + + // --- [ glVertexAttribI4iv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4iv VertexAttribI4iv} */ + public static native void nglVertexAttribI4iv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI4i VertexAttribI4i}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4iv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4iv(index, memAddress(v)); + } + + // --- [ glVertexAttribI1uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribI1uiv VertexAttribI1uiv} */ + public static native void nglVertexAttribI1uiv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI1ui VertexAttribI1ui}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI1uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttribI1uiv(index, memAddress(v)); + } + + // --- [ glVertexAttribI2uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribI2uiv VertexAttribI2uiv} */ + public static native void nglVertexAttribI2uiv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI2ui VertexAttribI2ui}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI2uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttribI2uiv(index, memAddress(v)); + } + + // --- [ glVertexAttribI3uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribI3uiv VertexAttribI3uiv} */ + public static native void nglVertexAttribI3uiv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI3ui VertexAttribI3ui}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI3uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttribI3uiv(index, memAddress(v)); + } + + // --- [ glVertexAttribI4uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4uiv VertexAttribI4uiv} */ + public static native void nglVertexAttribI4uiv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribI4ui VertexAttribI4ui}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4uiv(index, memAddress(v)); + } + + // --- [ glVertexAttribI4bv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4bv VertexAttribI4bv} */ + public static native void nglVertexAttribI4bv(int index, long v); + + /** + * Byte version of {@link #glVertexAttribI4iv VertexAttribI4iv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4bv(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4bv(index, memAddress(v)); + } + + // --- [ glVertexAttribI4sv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4sv VertexAttribI4sv} */ + public static native void nglVertexAttribI4sv(int index, long v); + + /** + * Short version of {@link #glVertexAttribI4iv VertexAttribI4iv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4sv(index, memAddress(v)); + } + + // --- [ glVertexAttribI4ubv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4ubv VertexAttribI4ubv} */ + public static native void nglVertexAttribI4ubv(int index, long v); + + /** + * Byte version of {@link #glVertexAttribI4uiv VertexAttribI4uiv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4ubv(@NativeType("GLuint") int index, @NativeType("GLbyte const *") ByteBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4ubv(index, memAddress(v)); + } + + // --- [ glVertexAttribI4usv ] --- + + /** Unsafe version of: {@link #glVertexAttribI4usv VertexAttribI4usv} */ + public static native void nglVertexAttribI4usv(int index, long v); + + /** + * Short version of {@link #glVertexAttribI4uiv VertexAttribI4uiv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param v the pure integer vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribI4usv(@NativeType("GLuint") int index, @NativeType("GLshort const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribI4usv(index, memAddress(v)); + } + + // --- [ glVertexAttribIPointer ] --- + + /** Unsafe version of: {@link #glVertexAttribIPointer VertexAttribIPointer} */ + public static native void nglVertexAttribIPointer(int index, int size, int type, int stride, long pointer); + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribIPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglVertexAttribIPointer(index, size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribIPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglVertexAttribIPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribIPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ShortBuffer pointer) { + nglVertexAttribIPointer(index, size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a pure integer vertex attribute array. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. One of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribIPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") IntBuffer pointer) { + nglVertexAttribIPointer(index, size, type, stride, memAddress(pointer)); + } + + // --- [ glGetVertexAttribIiv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribIiv GetVertexAttribIiv} */ + public static native void nglGetVertexAttribIiv(int index, int pname, long params); + + /** + * Returns the value of a pure integer generic vertex attribute parameter. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried. Must be:
    {@link GL20#GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}
    + * @param params returns the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribIiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetVertexAttribIiv(index, pname, memAddress(params)); + } + + /** + * Returns the value of a pure integer generic vertex attribute parameter. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried. Must be:
    {@link GL20#GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetVertexAttribIi(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetVertexAttribIiv(index, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexAttribIuiv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribIuiv GetVertexAttribIuiv} */ + public static native void nglGetVertexAttribIuiv(int index, int pname, long params); + + /** + * Unsigned version of {@link #glGetVertexAttribIiv GetVertexAttribIiv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried. Must be:
    {@link GL20#GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}
    + * @param params returns the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribIuiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglGetVertexAttribIuiv(index, pname, memAddress(params)); + } + + /** + * Unsigned version of {@link #glGetVertexAttribIiv GetVertexAttribIiv}. + * + * @param index the index of the pure integer generic vertex attribute to be modified + * @param pname the symbolic name of the vertex attribute parameter to be queried. Must be:
    {@link GL20#GL_CURRENT_VERTEX_ATTRIB CURRENT_VERTEX_ATTRIB}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetVertexAttribIui(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetVertexAttribIuiv(index, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glUniform1ui ] --- + + /** + * Specifies the value of a uint uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform value + * + * @see Reference Page + */ + public static native void glUniform1ui(@NativeType("GLint") int location, @NativeType("GLuint") int v0); + + // --- [ glUniform2ui ] --- + + /** + * Specifies the value of a uvec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * + * @see Reference Page + */ + public static native void glUniform2ui(@NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1); + + // --- [ glUniform3ui ] --- + + /** + * Specifies the value of a uvec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * + * @see Reference Page + */ + public static native void glUniform3ui(@NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1, @NativeType("GLuint") int v2); + + // --- [ glUniform4ui ] --- + + /** + * Specifies the value of a uvec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param v0 the uniform x value + * @param v1 the uniform y value + * @param v2 the uniform z value + * @param v3 the uniform w value + * + * @see Reference Page + */ + public static native void glUniform4ui(@NativeType("GLint") int location, @NativeType("GLuint") int v0, @NativeType("GLuint") int v1, @NativeType("GLuint") int v2, @NativeType("GLuint") int v3); + + // --- [ glUniform1uiv ] --- + + /** + * Unsafe version of: {@link #glUniform1uiv Uniform1uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform1uiv(int location, int count, long value); + + /** + * Specifies the value of a single uint uniform variable or a uint uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform1uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglUniform1uiv(location, value.remaining(), memAddress(value)); + } + + // --- [ glUniform2uiv ] --- + + /** + * Unsafe version of: {@link #glUniform2uiv Uniform2uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform2uiv(int location, int count, long value); + + /** + * Specifies the value of a single uvec2 uniform variable or a uvec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform2uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglUniform2uiv(location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glUniform3uiv ] --- + + /** + * Unsafe version of: {@link #glUniform3uiv Uniform3uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform3uiv(int location, int count, long value); + + /** + * Specifies the value of a single uvec3 uniform variable or a uvec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform3uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglUniform3uiv(location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glUniform4uiv ] --- + + /** + * Unsafe version of: {@link #glUniform4uiv Uniform4uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform4uiv(int location, int count, long value); + + /** + * Specifies the value of a single uvec4 uniform variable or a uvec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform4uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglUniform4uiv(location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glGetUniformuiv ] --- + + /** Unsafe version of: {@link #glGetUniformuiv GetUniformuiv} */ + public static native void nglGetUniformuiv(int program, int location, long params); + + /** + * Returns the uint value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + * + * @see Reference Page + */ + public static void glGetUniformuiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformuiv(program, location, memAddress(params)); + } + + /** + * Returns the uint value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetUniformui(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetUniformuiv(program, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glBindFragDataLocation ] --- + + /** Unsafe version of: {@link #glBindFragDataLocation BindFragDataLocation} */ + public static native void nglBindFragDataLocation(int program, int colorNumber, long name); + + /** + * Binds a user-defined varying out variable to a fragment shader color number. + * + * @param program the name of the program containing varying out variable whose binding to modify + * @param colorNumber the color number to bind the user-defined varying out variable to + * @param name the name of the user-defined varying out variable whose binding to modify + * + * @see Reference Page + */ + public static void glBindFragDataLocation(@NativeType("GLuint") int program, @NativeType("GLuint") int colorNumber, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + nglBindFragDataLocation(program, colorNumber, memAddress(name)); + } + + /** + * Binds a user-defined varying out variable to a fragment shader color number. + * + * @param program the name of the program containing varying out variable whose binding to modify + * @param colorNumber the color number to bind the user-defined varying out variable to + * @param name the name of the user-defined varying out variable whose binding to modify + * + * @see Reference Page + */ + public static void glBindFragDataLocation(@NativeType("GLuint") int program, @NativeType("GLuint") int colorNumber, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + nglBindFragDataLocation(program, colorNumber, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetFragDataLocation ] --- + + /** Unsafe version of: {@link #glGetFragDataLocation GetFragDataLocation} */ + public static native int nglGetFragDataLocation(int program, long name); + + /** + * Queries the bindings of color numbers to user-defined varying out variables. + * + * @param program the name of the program containing varying out variable whose binding to query + * @param name the name of the user-defined varying out variable whose binding to query + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetFragDataLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetFragDataLocation(program, memAddress(name)); + } + + /** + * Queries the bindings of color numbers to user-defined varying out variables. + * + * @param program the name of the program containing varying out variable whose binding to query + * @param name the name of the user-defined varying out variable whose binding to query + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetFragDataLocation(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetFragDataLocation(program, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glBeginConditionalRender ] --- + + /** + * Starts conditional rendering. + * + * @param id the name of an occlusion query object whose results are used to determine if the rendering commands are discarded + * @param mode how {@code glBeginConditionalRender} interprets the results of the occlusion query. One of:
    {@link #GL_QUERY_WAIT QUERY_WAIT}{@link #GL_QUERY_NO_WAIT QUERY_NO_WAIT}{@link #GL_QUERY_BY_REGION_WAIT QUERY_BY_REGION_WAIT}
    {@link #GL_QUERY_BY_REGION_NO_WAIT QUERY_BY_REGION_NO_WAIT}{@link GL45#GL_QUERY_WAIT_INVERTED QUERY_WAIT_INVERTED}{@link GL45#GL_QUERY_NO_WAIT_INVERTED QUERY_NO_WAIT_INVERTED}
    {@link GL45#GL_QUERY_BY_REGION_WAIT_INVERTED QUERY_BY_REGION_WAIT_INVERTED}{@link GL45#GL_QUERY_BY_REGION_NO_WAIT_INVERTED QUERY_BY_REGION_NO_WAIT_INVERTED}
    + * + * @see Reference Page + */ + public static native void glBeginConditionalRender(@NativeType("GLuint") int id, @NativeType("GLenum") int mode); + + // --- [ glEndConditionalRender ] --- + + /** + * Ends conditional rendering. + * + * @see Reference Page + */ + public static native void glEndConditionalRender(); + + // --- [ glMapBufferRange ] --- + + /** Unsafe version of: {@link #glMapBufferRange MapBufferRange} */ + public static native long nglMapBufferRange(int target, long offset, long length, int access); + + /** + * Maps a section of a buffer object's data store. + * + *

    LWJGL note: This method comes in 2 flavors:

    + * + *
      + *
    1. {@link #glMapBufferRange(int, long, long, int)} - Always returns a new ByteBuffer instance.
    2. + *
    3. {@link #glMapBufferRange(int, long, long, int, ByteBuffer)} - The {@code old_buffer} parameter is reused if not null.
    4. + *
    + * + * @param target a binding to which the target buffer is bound. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link #GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link #GL_MAP_READ_BIT MAP_READ_BIT}{@link #GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link #GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link #GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link #GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link #GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBufferRange(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access) { + long __result = nglMapBufferRange(target, offset, length, access); + return memByteBufferSafe(__result, (int)length); + } + + /** + * Maps a section of a buffer object's data store. + * + *

    LWJGL note: This method comes in 2 flavors:

    + * + *
      + *
    1. {@link #glMapBufferRange(int, long, long, int)} - Always returns a new ByteBuffer instance.
    2. + *
    3. {@link #glMapBufferRange(int, long, long, int, ByteBuffer)} - The {@code old_buffer} parameter is reused if not null.
    4. + *
    + * + * @param target a binding to which the target buffer is bound. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link #GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link #GL_MAP_READ_BIT MAP_READ_BIT}{@link #GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link #GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link #GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link #GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link #GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapBufferRange(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access, @Nullable ByteBuffer old_buffer) { + long __result = nglMapBufferRange(target, offset, length, access); + return apiGetMappedBuffer(old_buffer, __result, (int)length); + } + + // --- [ glFlushMappedBufferRange ] --- + + /** + * Indicates modifications to a range of a mapped buffer. + * + * @param target the target of the flush operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link #GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param offset the start of the buffer subrange, in basic machine units + * @param length the length of the buffer subrange, in basic machine units + * + * @see Reference Page + */ + public static native void glFlushMappedBufferRange(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length); + + // --- [ glClampColor ] --- + + /** + * Controls color clamping. + * + * @param target target for color clamping. Must be:
    {@link #GL_CLAMP_READ_COLOR CLAMP_READ_COLOR}
    + * @param clamp whether to apply color clamping. One of:
    {@link GL11#GL_TRUE TRUE}{@link GL11#GL_FALSE FALSE}{@link #GL_FIXED_ONLY FIXED_ONLY}
    + * + * @see Reference Page + */ + public static native void glClampColor(@NativeType("GLenum") int target, @NativeType("GLenum") int clamp); + + // --- [ glIsRenderbuffer ] --- + + /** + * Determines if a name corresponds to a renderbuffer object. + * + * @param renderbuffer a value that may be the name of a renderbuffer object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsRenderbuffer(@NativeType("GLuint") int renderbuffer); + + // --- [ glBindRenderbuffer ] --- + + /** + * Binds a renderbuffer to a renderbuffer target. + * + * @param target the renderbuffer target of the binding operation. Must be:
    {@link #GL_RENDERBUFFER RENDERBUFFER}
    + * @param renderbuffer the name of the renderbuffer object to bind + * + * @see Reference Page + */ + public static native void glBindRenderbuffer(@NativeType("GLenum") int target, @NativeType("GLuint") int renderbuffer); + + // --- [ glDeleteRenderbuffers ] --- + + /** + * Unsafe version of: {@link #glDeleteRenderbuffers DeleteRenderbuffers} + * + * @param n the number of renderbuffer objects to be deleted + */ + public static native void nglDeleteRenderbuffers(int n, long renderbuffers); + + /** + * Deletes renderbuffer objects. + * + * @param renderbuffers an array containing {@code n} renderbuffer objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteRenderbuffers(@NativeType("GLuint const *") IntBuffer renderbuffers) { + nglDeleteRenderbuffers(renderbuffers.remaining(), memAddress(renderbuffers)); + } + + /** + * Deletes renderbuffer objects. + * + * @see Reference Page + */ + public static void glDeleteRenderbuffers(@NativeType("GLuint const *") int renderbuffer) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer renderbuffers = stack.ints(renderbuffer); + nglDeleteRenderbuffers(1, memAddress(renderbuffers)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenRenderbuffers ] --- + + /** + * Unsafe version of: {@link #glGenRenderbuffers GenRenderbuffers} + * + * @param n the number of renderbuffer object names to generate + */ + public static native void nglGenRenderbuffers(int n, long renderbuffers); + + /** + * Generates renderbuffer object names. + * + * @param renderbuffers a buffer in which the generated renderbuffer object names are stored + * + * @see Reference Page + */ + public static void glGenRenderbuffers(@NativeType("GLuint *") IntBuffer renderbuffers) { + nglGenRenderbuffers(renderbuffers.remaining(), memAddress(renderbuffers)); + } + + /** + * Generates renderbuffer object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenRenderbuffers() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer renderbuffers = stack.callocInt(1); + nglGenRenderbuffers(1, memAddress(renderbuffers)); + return renderbuffers.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glRenderbufferStorage ] --- + + /** + * Establishes data storage, format and dimensions of a renderbuffer object's image. + * + * @param target the target of the allocation. Must be:
    {@link #GL_RENDERBUFFER RENDERBUFFER}
    + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + * + * @see Reference Page + */ + public static native void glRenderbufferStorage(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glRenderbufferStorageMultisample ] --- + + /** + * Establishes data storage, format, dimensions and sample count of a renderbuffer object's image. + * + *

    {@link #glRenderbufferStorage RenderbufferStorage} is equivalent to calling this method with the samples set to zero.

    + * + * @param target the target of the allocation. Must be:
    {@link #GL_RENDERBUFFER RENDERBUFFER}
    + * @param samples the number of samples to be used for the renderbuffer object's storage + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + * + * @see Reference Page + */ + public static native void glRenderbufferStorageMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glGetRenderbufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetRenderbufferParameteriv GetRenderbufferParameteriv} */ + public static native void nglGetRenderbufferParameteriv(int target, int pname, long params); + + /** + * Retrieves information about a bound renderbuffer object. + * + * @param target the target of the query operation. Must be:
    {@link #GL_RENDERBUFFER RENDERBUFFER}
    + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link #GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link #GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link #GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link #GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link #GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link #GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link #GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link #GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link #GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link #GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + * @param params an array to receive the value of the queried parameter + * + * @see Reference Page + */ + public static void glGetRenderbufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetRenderbufferParameteriv(target, pname, memAddress(params)); + } + + /** + * Retrieves information about a bound renderbuffer object. + * + * @param target the target of the query operation. Must be:
    {@link #GL_RENDERBUFFER RENDERBUFFER}
    + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link #GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link #GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link #GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link #GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link #GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link #GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link #GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link #GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link #GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link #GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetRenderbufferParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetRenderbufferParameteriv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsFramebuffer ] --- + + /** + * Determines if a name corresponds to a framebuffer object. + * + * @param framebuffer a value that may be the name of a framebuffer object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsFramebuffer(@NativeType("GLuint") int framebuffer); + + // --- [ glBindFramebuffer ] --- + + /** + * Binds a framebuffer to a framebuffer target. + * + * @param target the framebuffer target of the binding operation. One of:
    {@link #GL_FRAMEBUFFER FRAMEBUFFER}{@link #GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param framebuffer the name of the framebuffer object to bind + * + * @see Reference Page + */ + public static native void glBindFramebuffer(@NativeType("GLenum") int target, @NativeType("GLuint") int framebuffer); + + // --- [ glDeleteFramebuffers ] --- + + /** + * Unsafe version of: {@link #glDeleteFramebuffers DeleteFramebuffers} + * + * @param n the number of framebuffer objects to be deleted + */ + public static native void nglDeleteFramebuffers(int n, long framebuffers); + + /** + * Deletes framebuffer objects. + * + * @param framebuffers an array containing {@code n} framebuffer objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteFramebuffers(@NativeType("GLuint const *") IntBuffer framebuffers) { + nglDeleteFramebuffers(framebuffers.remaining(), memAddress(framebuffers)); + } + + /** + * Deletes framebuffer objects. + * + * @see Reference Page + */ + public static void glDeleteFramebuffers(@NativeType("GLuint const *") int framebuffer) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer framebuffers = stack.ints(framebuffer); + nglDeleteFramebuffers(1, memAddress(framebuffers)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenFramebuffers ] --- + + /** + * Unsafe version of: {@link #glGenFramebuffers GenFramebuffers} + * + * @param n the number of framebuffer object names to generate + */ + public static native void nglGenFramebuffers(int n, long framebuffers); + + /** + * Generates framebuffer object names. + * + * @param framebuffers a buffer in which the generated framebuffer object names are stored + * + * @see Reference Page + */ + public static void glGenFramebuffers(@NativeType("GLuint *") IntBuffer framebuffers) { + nglGenFramebuffers(framebuffers.remaining(), memAddress(framebuffers)); + } + + /** + * Generates framebuffer object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenFramebuffers() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer framebuffers = stack.callocInt(1); + nglGenFramebuffers(1, memAddress(framebuffers)); + return framebuffers.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCheckFramebufferStatus ] --- + + /** + * Checks the completeness status of a framebuffer. + * + * @param target the target of the framebuffer completeness check. One of:
    {@link #GL_FRAMEBUFFER FRAMEBUFFER}{@link #GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * + * @see Reference Page + */ + @NativeType("GLenum") + public static native int glCheckFramebufferStatus(@NativeType("GLenum") int target); + + // --- [ glFramebufferTexture1D ] --- + + /** + * Attaches a level of a 1D texture object as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link #GL_FRAMEBUFFER FRAMEBUFFER}{@link #GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link #GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link #GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link #GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link #GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link #GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link #GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link #GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link #GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link #GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link #GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link #GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link #GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link #GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link #GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link #GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link #GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link #GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link #GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link #GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link #GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link #GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link #GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link #GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link #GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link #GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link #GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link #GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link #GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link #GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link #GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link #GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link #GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link #GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link #GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link #GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param textarget the type of texture + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * + * @see Reference Page + */ + public static native void glFramebufferTexture1D(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glFramebufferTexture2D ] --- + + /** + * Attaches a level of a 2D texture object as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link #GL_FRAMEBUFFER FRAMEBUFFER}{@link #GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link #GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link #GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link #GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link #GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link #GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link #GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link #GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link #GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link #GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link #GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link #GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link #GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link #GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link #GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link #GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link #GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link #GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link #GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link #GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link #GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link #GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link #GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link #GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link #GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link #GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link #GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link #GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link #GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link #GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link #GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link #GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link #GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link #GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link #GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link #GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param textarget the type of texture + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * + * @see Reference Page + */ + public static native void glFramebufferTexture2D(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glFramebufferTexture3D ] --- + + /** + * Attaches a layer of a 3D texture object as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link #GL_FRAMEBUFFER FRAMEBUFFER}{@link #GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link #GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link #GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link #GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link #GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link #GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link #GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link #GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link #GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link #GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link #GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link #GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link #GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link #GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link #GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link #GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link #GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link #GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link #GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link #GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link #GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link #GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link #GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link #GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link #GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link #GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link #GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link #GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link #GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link #GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link #GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link #GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link #GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link #GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link #GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link #GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param textarget the type of texture + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * @param layer the layer of a 2-dimensional image within the 3-dimensional texture. + * + * @see Reference Page + */ + public static native void glFramebufferTexture3D(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int textarget, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer); + + // --- [ glFramebufferTextureLayer ] --- + + /** + * Attaches a single layer of a texture to a framebuffer + * + * @param target the framebuffer target. One of:
    {@link #GL_FRAMEBUFFER FRAMEBUFFER}{@link #GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link #GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link #GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link #GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link #GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link #GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link #GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link #GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link #GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link #GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link #GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link #GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link #GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link #GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link #GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link #GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link #GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link #GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link #GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link #GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link #GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link #GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link #GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link #GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link #GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link #GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link #GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link #GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link #GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link #GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link #GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link #GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link #GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link #GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link #GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link #GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * @param layer the layer of {@code texture} to attach. + * + * @see Reference Page + */ + public static native void glFramebufferTextureLayer(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer); + + // --- [ glFramebufferRenderbuffer ] --- + + /** + * Attaches a renderbuffer as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link #GL_FRAMEBUFFER FRAMEBUFFER}{@link #GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link #GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link #GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link #GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link #GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link #GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link #GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link #GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link #GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link #GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link #GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link #GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link #GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link #GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link #GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link #GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link #GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link #GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link #GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link #GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link #GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link #GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link #GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link #GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link #GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link #GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link #GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link #GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link #GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link #GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link #GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link #GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link #GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link #GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link #GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link #GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param renderbuffertarget the renderbuffer target. Must be:
    {@link #GL_RENDERBUFFER RENDERBUFFER}
    + * @param renderbuffer the name of an existing renderbuffer object of type {@code renderbuffertarget} to attach + * + * @see Reference Page + */ + public static native void glFramebufferRenderbuffer(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int renderbuffertarget, @NativeType("GLuint") int renderbuffer); + + // --- [ glGetFramebufferAttachmentParameteriv ] --- + + /** Unsafe version of: {@link #glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv} */ + public static native void nglGetFramebufferAttachmentParameteriv(int target, int attachment, int pname, long params); + + /** + * Retrievees information about attachments of a bound framebuffer object. + * + * @param target the target of the query operation. One of:
    {@link #GL_FRAMEBUFFER FRAMEBUFFER}{@link #GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment within {@code target}. One of:
    {@link #GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link #GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link #GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link #GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link #GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link #GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link #GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link #GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link #GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link #GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link #GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link #GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link #GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link #GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link #GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link #GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link #GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link #GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link #GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link #GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link #GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link #GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link #GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link #GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link #GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link #GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link #GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link #GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link #GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link #GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link #GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link #GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link #GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link #GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link #GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link #GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link #GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link #GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link #GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link #GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link #GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link #GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + * @param params an array to receive the value of the queried parameter + * + * @see Reference Page + */ + public static void glGetFramebufferAttachmentParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetFramebufferAttachmentParameteriv(target, attachment, pname, memAddress(params)); + } + + /** + * Retrievees information about attachments of a bound framebuffer object. + * + * @param target the target of the query operation. One of:
    {@link #GL_FRAMEBUFFER FRAMEBUFFER}{@link #GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link #GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment within {@code target}. One of:
    {@link #GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link #GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link #GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link #GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link #GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link #GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link #GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link #GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link #GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link #GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link #GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link #GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link #GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link #GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link #GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link #GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link #GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link #GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link #GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link #GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link #GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link #GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link #GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link #GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link #GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link #GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link #GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link #GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link #GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link #GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link #GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link #GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link #GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link #GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link #GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link #GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link #GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link #GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link #GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link #GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link #GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link #GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link #GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetFramebufferAttachmentParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetFramebufferAttachmentParameteriv(target, attachment, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glBlitFramebuffer ] --- + + /** + * Copies a block of pixels from the read framebuffer to the draw framebuffer. + * + * @param srcX0 the lower-left coordinate of the source rectangle within the read buffer + * @param srcY0 the upper-left coordinate of the source rectangle within the read buffer + * @param srcX1 the lower-right coordinate of the source rectangle within the read buffer + * @param srcY1 the upper-right coordinate of the source rectangle within the read buffer + * @param dstX0 the lower-left coordinate of the destination rectangle within the write buffer + * @param dstY0 the upper-left coordinate of the destination rectangle within the write buffer + * @param dstX1 the lower-right coordinate of the destination rectangle within the write buffer + * @param dstY1 the upper-right coordinate of the destination rectangle within the write buffer + * @param mask the bitwise OR of the flags indicating which buffers are to be copied. One of:
    {@link GL11#GL_COLOR_BUFFER_BIT COLOR_BUFFER_BIT}{@link GL11#GL_DEPTH_BUFFER_BIT DEPTH_BUFFER_BIT}{@link GL11#GL_STENCIL_BUFFER_BIT STENCIL_BUFFER_BIT}
    + * @param filter the interpolation to be applied if the image is stretched. One of:
    {@link GL11#GL_NEAREST NEAREST}{@link GL11#GL_LINEAR LINEAR}
    + * + * @see Reference Page + */ + public static native void glBlitFramebuffer(@NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter); + + // --- [ glGenerateMipmap ] --- + + /** + * Generate mipmaps for a specified texture target. + * + * @param target the target to which the texture whose mimaps to generate is bound. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link #GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link #GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    + * + * @see Reference Page + */ + public static native void glGenerateMipmap(@NativeType("GLenum") int target); + + // --- [ glTexParameterIiv ] --- + + /** Unsafe version of: {@link #glTexParameterIiv TexParameterIiv} */ + public static native void nglTexParameterIiv(int target, int pname, long params); + + /** + * Sets the integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a single-valued texture parameter + * @param params the value of {@code pname} + * + * @see Reference Page + */ + public static void glTexParameterIiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglTexParameterIiv(target, pname, memAddress(params)); + } + + /** + * Sets the integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a single-valued texture parameter + * + * @see Reference Page + */ + public static void glTexParameterIi(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.ints(param); + nglTexParameterIiv(target, pname, memAddress(params)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glTexParameterIuiv ] --- + + /** Unsafe version of: {@link #glTexParameterIuiv TexParameterIuiv} */ + public static native void nglTexParameterIuiv(int target, int pname, long params); + + /** + * Sets the unsigned integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a single-valued texture parameter + * @param params the value of {@code pname} + * + * @see Reference Page + */ + public static void glTexParameterIuiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglTexParameterIuiv(target, pname, memAddress(params)); + } + + /** + * Sets the unsigned integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a single-valued texture parameter + * + * @see Reference Page + */ + public static void glTexParameterIui(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.ints(param); + nglTexParameterIuiv(target, pname, memAddress(params)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexParameterIiv ] --- + + /** Unsafe version of: {@link #glGetTexParameterIiv GetTexParameterIiv} */ + public static native void nglGetTexParameterIiv(int target, int pname, long params); + + /** + * Returns the integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a texture parameter + * @param params returns the texture parameter value + * + * @see Reference Page + */ + public static void glGetTexParameterIiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTexParameterIiv(target, pname, memAddress(params)); + } + + /** + * Returns the integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a texture parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTexParameterIi(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTexParameterIiv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTexParameterIuiv ] --- + + /** Unsafe version of: {@link #glGetTexParameterIuiv GetTexParameterIuiv} */ + public static native void nglGetTexParameterIuiv(int target, int pname, long params); + + /** + * Returns the unsigned integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a texture parameter + * @param params returns the texture parameter value + * + * @see Reference Page + */ + public static void glGetTexParameterIuiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTexParameterIuiv(target, pname, memAddress(params)); + } + + /** + * Returns the unsigned integer value of a texture parameter. + * + * @param target the texture target + * @param pname the symbolic name of a texture parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTexParameterIui(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTexParameterIuiv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glColorMaski ] --- + + /** + * Enables and disables writing of frame buffer color components. + * + * @param buf the index of the draw buffer whose color mask to set + * @param r whether R values are written or not + * @param g whether G values are written or not + * @param b whether B values are written or not + * @param a whether A values are written or not + * + * @see Reference Page + */ + public static native void glColorMaski(@NativeType("GLuint") int buf, @NativeType("GLboolean") boolean r, @NativeType("GLboolean") boolean g, @NativeType("GLboolean") boolean b, @NativeType("GLboolean") boolean a); + + // --- [ glGetBooleani_v ] --- + + /** Unsafe version of: {@link #glGetBooleani_v GetBooleani_v} */ + public static native void nglGetBooleani_v(int target, int index, long data); + + /** + * Queries the boolean value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetBooleani_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLboolean *") ByteBuffer data) { + if (CHECKS) { + check(data, 1); + } + nglGetBooleani_v(target, index, memAddress(data)); + } + + /** + * Queries the boolean value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * + * @see Reference Page + */ + @NativeType("void") + public static boolean glGetBooleani(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + ByteBuffer data = stack.calloc(1); + nglGetBooleani_v(target, index, memAddress(data)); + return data.get(0) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetIntegeri_v ] --- + + /** Unsafe version of: {@link #glGetIntegeri_v GetIntegeri_v} */ + public static native void nglGetIntegeri_v(int target, int index, long data); + + /** + * Queries the integer value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetIntegeri_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer data) { + if (CHECKS) { + check(data, 1); + } + nglGetIntegeri_v(target, index, memAddress(data)); + } + + /** + * Queries the integer value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetIntegeri(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer data = stack.callocInt(1); + nglGetIntegeri_v(target, index, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glEnablei ] --- + + /** + * Enables an indexed capability. + * + * @param cap the indexed capability to enable + * @param index the index to enable + * + * @see Reference Page + */ + public static native void glEnablei(@NativeType("GLenum") int cap, @NativeType("GLuint") int index); + + // --- [ glDisablei ] --- + + /** + * Disables an indexed capability. + * + * @param target the indexed capability to disable + * @param index the index to disable + * + * @see Reference Page + */ + public static native void glDisablei(@NativeType("GLenum") int target, @NativeType("GLuint") int index); + + // --- [ glIsEnabledi ] --- + + /** + * Tests whether an indexed capability is enabled. + * + * @param target the indexed capability to query + * @param index the index to query + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsEnabledi(@NativeType("GLenum") int target, @NativeType("GLuint") int index); + + // --- [ glBindBufferRange ] --- + + /** + * Binds a range within a buffer object to an indexed buffer target. + * + * @param target the target of the bind operation. One of:
    {@link #GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}
    + * @param index the index of the binding point within the array specified by {@code target} + * @param buffer a buffer object to bind to the specified binding point + * @param offset the starting offset in basic machine units into the buffer object {@code buffer} + * @param size the amount of data in machine units that can be read from the buffer object while used as an indexed target + * + * @see Reference Page + */ + public static native void glBindBufferRange(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size); + + // --- [ glBindBufferBase ] --- + + /** + * Binds a buffer object to an indexed buffer target. + * + * @param target the target of the bind operation. One of:
    {@link #GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}
    + * @param index the index of the binding point within the array specified by {@code target} + * @param buffer a buffer object to bind to the specified binding point + * + * @see Reference Page + */ + public static native void glBindBufferBase(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer); + + // --- [ glBeginTransformFeedback ] --- + + /** + * Starts transform feedback operation. + * + * @param primitiveMode the output type of the primitives that will be recorded into the buffer objects that are bound for transform feedback. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLES TRIANGLES}
    + * + * @see Reference Page + */ + public static native void glBeginTransformFeedback(@NativeType("GLenum") int primitiveMode); + + // --- [ glEndTransformFeedback ] --- + + /** + * Ends transform feedback operation. + * + * @see Reference Page + */ + public static native void glEndTransformFeedback(); + + // --- [ glTransformFeedbackVaryings ] --- + + /** + * Unsafe version of: {@link #glTransformFeedbackVaryings TransformFeedbackVaryings} + * + * @param count the number of varying variables used for transform feedback + */ + public static native void nglTransformFeedbackVaryings(int program, int count, long varyings, int bufferMode); + + /** + * Specifies values to record in transform feedback buffers. + * + * @param program the target program object + * @param varyings an array of {@code count} zero-terminated strings specifying the names of the varying variables to use for transform feedback + * @param bufferMode the mode used to capture the varying variables when transform feedback is active. One of:
    {@link #GL_INTERLEAVED_ATTRIBS INTERLEAVED_ATTRIBS}{@link #GL_SEPARATE_ATTRIBS SEPARATE_ATTRIBS}
    + * + * @see Reference Page + */ + public static void glTransformFeedbackVaryings(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") PointerBuffer varyings, @NativeType("GLenum") int bufferMode) { + nglTransformFeedbackVaryings(program, varyings.remaining(), memAddress(varyings), bufferMode); + } + + /** + * Specifies values to record in transform feedback buffers. + * + * @param program the target program object + * @param varyings an array of {@code count} zero-terminated strings specifying the names of the varying variables to use for transform feedback + * @param bufferMode the mode used to capture the varying variables when transform feedback is active. One of:
    {@link #GL_INTERLEAVED_ATTRIBS INTERLEAVED_ATTRIBS}{@link #GL_SEPARATE_ATTRIBS SEPARATE_ATTRIBS}
    + * + * @see Reference Page + */ + public static void glTransformFeedbackVaryings(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence[] varyings, @NativeType("GLenum") int bufferMode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long varyingsAddress = APIUtil.apiArray(stack, MemoryUtil::memASCII, varyings); + nglTransformFeedbackVaryings(program, varyings.length, varyingsAddress, bufferMode); + APIUtil.apiArrayFree(varyingsAddress, varyings.length); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Specifies values to record in transform feedback buffers. + * + * @param program the target program object + * @param bufferMode the mode used to capture the varying variables when transform feedback is active. One of:
    {@link #GL_INTERLEAVED_ATTRIBS INTERLEAVED_ATTRIBS}{@link #GL_SEPARATE_ATTRIBS SEPARATE_ATTRIBS}
    + * + * @see Reference Page + */ + public static void glTransformFeedbackVaryings(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence varying, @NativeType("GLenum") int bufferMode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long varyingsAddress = APIUtil.apiArray(stack, MemoryUtil::memASCII, varying); + nglTransformFeedbackVaryings(program, 1, varyingsAddress, bufferMode); + APIUtil.apiArrayFree(varyingsAddress, 1); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTransformFeedbackVarying ] --- + + /** + * Unsafe version of: {@link #glGetTransformFeedbackVarying GetTransformFeedbackVarying} + * + * @param bufSize the maximum number of characters, including the null terminator, that may be written into {@code name} + */ + public static native void nglGetTransformFeedbackVarying(int program, int index, int bufSize, long length, long size, long type, long name); + + /** + * Retrieves information about varying variables selected for transform feedback. + * + * @param program the target program object + * @param index the index of the varying variable whose information to retrieve + * @param length a variable which will receive the number of characters written into {@code name}, excluding the null-terminator. If {@code length} is NULL no length is returned. + * @param size a variable that will receive the size of the varying + * @param type a variable that will receive the type of the varying + * @param name a buffer into which will be written the name of the varying + * + * @see Reference Page + */ + public static void glGetTransformFeedbackVarying(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLsizei *") IntBuffer size, @NativeType("GLenum *") IntBuffer type, @NativeType("GLchar *") ByteBuffer name) { + if (CHECKS) { + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + nglGetTransformFeedbackVarying(program, index, name.remaining(), memAddressSafe(length), memAddress(size), memAddress(type), memAddress(name)); + } + + /** + * Retrieves information about varying variables selected for transform feedback. + * + * @param program the target program object + * @param index the index of the varying variable whose information to retrieve + * @param bufSize the maximum number of characters, including the null terminator, that may be written into {@code name} + * @param size a variable that will receive the size of the varying + * @param type a variable that will receive the type of the varying + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetTransformFeedbackVarying(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufSize, @NativeType("GLsizei *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + if (CHECKS) { + check(size, 1); + check(type, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer name = stack.malloc(bufSize); + nglGetTransformFeedbackVarying(program, index, bufSize, memAddress(length), memAddress(size), memAddress(type), memAddress(name)); + return memASCII(name, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Retrieves information about varying variables selected for transform feedback. + * + * @param program the target program object + * @param index the index of the varying variable whose information to retrieve + * @param size a variable that will receive the size of the varying + * @param type a variable that will receive the type of the varying + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetTransformFeedbackVarying(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLsizei *") IntBuffer size, @NativeType("GLenum *") IntBuffer type) { + return glGetTransformFeedbackVarying(program, index, GL20.glGetProgrami(program, GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH), size, type); + } + + // --- [ glBindVertexArray ] --- + + /** + * Binds a vertex array object + * + * @param array the name of the vertex array to bind + * + * @see Reference Page + */ + public static native void glBindVertexArray(@NativeType("GLuint") int array); + + // --- [ glDeleteVertexArrays ] --- + + /** + * Unsafe version of: {@link #glDeleteVertexArrays DeleteVertexArrays} + * + * @param n the number of vertex array objects to be deleted + */ + public static native void nglDeleteVertexArrays(int n, long arrays); + + /** + * Deletes vertex array objects. + * + * @param arrays an array containing the n names of the objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteVertexArrays(@NativeType("GLuint const *") IntBuffer arrays) { + nglDeleteVertexArrays(arrays.remaining(), memAddress(arrays)); + } + + /** + * Deletes vertex array objects. + * + * @see Reference Page + */ + public static void glDeleteVertexArrays(@NativeType("GLuint const *") int array) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer arrays = stack.ints(array); + nglDeleteVertexArrays(1, memAddress(arrays)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenVertexArrays ] --- + + /** + * Unsafe version of: {@link #glGenVertexArrays GenVertexArrays} + * + * @param n the number of vertex array object names to generate + */ + public static native void nglGenVertexArrays(int n, long arrays); + + /** + * Generates vertex array object names. + * + * @param arrays a buffer in which the generated vertex array object names are stored + * + * @see Reference Page + */ + public static void glGenVertexArrays(@NativeType("GLuint *") IntBuffer arrays) { + nglGenVertexArrays(arrays.remaining(), memAddress(arrays)); + } + + /** + * Generates vertex array object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenVertexArrays() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer arrays = stack.callocInt(1); + nglGenVertexArrays(1, memAddress(arrays)); + return arrays.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsVertexArray ] --- + + /** + * Determines if a name corresponds to a vertex array object. + * + * @param array a value that may be the name of a vertex array object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsVertexArray(@NativeType("GLuint") int array); + + /** + * Array version of: {@link #glClearBufferiv ClearBufferiv} + * + * @see Reference Page + */ + public static void glClearBufferiv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glClearBufferiv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(buffer, drawbuffer, value, __functionAddress); + } + + /** + * Array version of: {@link #glClearBufferuiv ClearBufferuiv} + * + * @see Reference Page + */ + public static void glClearBufferuiv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glClearBufferuiv; + if (CHECKS) { + check(__functionAddress); + check(value, 4); + } + callPV(buffer, drawbuffer, value, __functionAddress); + } + + /** + * Array version of: {@link #glClearBufferfv ClearBufferfv} + * + * @see Reference Page + */ + public static void glClearBufferfv(@NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glClearBufferfv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(buffer, drawbuffer, value, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribI1iv VertexAttribI1iv} + * + * @see Reference Page + */ + public static void glVertexAttribI1iv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI1iv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribI2iv VertexAttribI2iv} + * + * @see Reference Page + */ + public static void glVertexAttribI2iv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI2iv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribI3iv VertexAttribI3iv} + * + * @see Reference Page + */ + public static void glVertexAttribI3iv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI3iv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribI4iv VertexAttribI4iv} + * + * @see Reference Page + */ + public static void glVertexAttribI4iv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI4iv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribI1uiv VertexAttribI1uiv} + * + * @see Reference Page + */ + public static void glVertexAttribI1uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI1uiv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribI2uiv VertexAttribI2uiv} + * + * @see Reference Page + */ + public static void glVertexAttribI2uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI2uiv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribI3uiv VertexAttribI3uiv} + * + * @see Reference Page + */ + public static void glVertexAttribI3uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI3uiv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribI4uiv VertexAttribI4uiv} + * + * @see Reference Page + */ + public static void glVertexAttribI4uiv(@NativeType("GLuint") int index, @NativeType("GLuint const *") int[] v) { + long __functionAddress = GL.getICD().glVertexAttribI4uiv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribI4sv VertexAttribI4sv} + * + * @see Reference Page + */ + public static void glVertexAttribI4sv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttribI4sv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribI4usv VertexAttribI4usv} + * + * @see Reference Page + */ + public static void glVertexAttribI4usv(@NativeType("GLuint") int index, @NativeType("GLshort const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttribI4usv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glGetVertexAttribIiv GetVertexAttribIiv} + * + * @see Reference Page + */ + public static void glGetVertexAttribIiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribIiv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(index, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetVertexAttribIuiv GetVertexAttribIuiv} + * + * @see Reference Page + */ + public static void glGetVertexAttribIuiv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribIuiv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(index, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glUniform1uiv Uniform1uiv} + * + * @see Reference Page + */ + public static void glUniform1uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform1uiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform2uiv Uniform2uiv} + * + * @see Reference Page + */ + public static void glUniform2uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform2uiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 1, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform3uiv Uniform3uiv} + * + * @see Reference Page + */ + public static void glUniform3uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform3uiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 3, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform4uiv Uniform4uiv} + * + * @see Reference Page + */ + public static void glUniform4uiv(@NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glUniform4uiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, value, __functionAddress); + } + + /** + * Array version of: {@link #glGetUniformuiv GetUniformuiv} + * + * @see Reference Page + */ + public static void glGetUniformuiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetUniformuiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, location, params, __functionAddress); + } + + /** + * Array version of: {@link #glDeleteRenderbuffers DeleteRenderbuffers} + * + * @see Reference Page + */ + public static void glDeleteRenderbuffers(@NativeType("GLuint const *") int[] renderbuffers) { + long __functionAddress = GL.getICD().glDeleteRenderbuffers; + if (CHECKS) { + check(__functionAddress); + } + callPV(renderbuffers.length, renderbuffers, __functionAddress); + } + + /** + * Array version of: {@link #glGenRenderbuffers GenRenderbuffers} + * + * @see Reference Page + */ + public static void glGenRenderbuffers(@NativeType("GLuint *") int[] renderbuffers) { + long __functionAddress = GL.getICD().glGenRenderbuffers; + if (CHECKS) { + check(__functionAddress); + } + callPV(renderbuffers.length, renderbuffers, __functionAddress); + } + + /** + * Array version of: {@link #glGetRenderbufferParameteriv GetRenderbufferParameteriv} + * + * @see Reference Page + */ + public static void glGetRenderbufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetRenderbufferParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glDeleteFramebuffers DeleteFramebuffers} + * + * @see Reference Page + */ + public static void glDeleteFramebuffers(@NativeType("GLuint const *") int[] framebuffers) { + long __functionAddress = GL.getICD().glDeleteFramebuffers; + if (CHECKS) { + check(__functionAddress); + } + callPV(framebuffers.length, framebuffers, __functionAddress); + } + + /** + * Array version of: {@link #glGenFramebuffers GenFramebuffers} + * + * @see Reference Page + */ + public static void glGenFramebuffers(@NativeType("GLuint *") int[] framebuffers) { + long __functionAddress = GL.getICD().glGenFramebuffers; + if (CHECKS) { + check(__functionAddress); + } + callPV(framebuffers.length, framebuffers, __functionAddress); + } + + /** + * Array version of: {@link #glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv} + * + * @see Reference Page + */ + public static void glGetFramebufferAttachmentParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetFramebufferAttachmentParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, attachment, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTexParameterIiv TexParameterIiv} + * + * @see Reference Page + */ + public static void glTexParameterIiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glTexParameterIiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTexParameterIuiv TexParameterIuiv} + * + * @see Reference Page + */ + public static void glTexParameterIuiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int[] params) { + long __functionAddress = GL.getICD().glTexParameterIuiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexParameterIiv GetTexParameterIiv} + * + * @see Reference Page + */ + public static void glGetTexParameterIiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetTexParameterIiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTexParameterIuiv GetTexParameterIuiv} + * + * @see Reference Page + */ + public static void glGetTexParameterIuiv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetTexParameterIuiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetIntegeri_v GetIntegeri_v} + * + * @see Reference Page + */ + public static void glGetIntegeri_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLint *") int[] data) { + long __functionAddress = GL.getICD().glGetIntegeri_v; + if (CHECKS) { + check(__functionAddress); + check(data, 1); + } + callPV(target, index, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetTransformFeedbackVarying GetTransformFeedbackVarying} + * + * @see Reference Page + */ + public static void glGetTransformFeedbackVarying(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLsizei *") int[] size, @NativeType("GLenum *") int[] type, @NativeType("GLchar *") ByteBuffer name) { + long __functionAddress = GL.getICD().glGetTransformFeedbackVarying; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + callPPPPV(program, index, name.remaining(), length, size, type, memAddress(name), __functionAddress); + } + + /** + * Array version of: {@link #glDeleteVertexArrays DeleteVertexArrays} + * + * @see Reference Page + */ + public static void glDeleteVertexArrays(@NativeType("GLuint const *") int[] arrays) { + long __functionAddress = GL.getICD().glDeleteVertexArrays; + if (CHECKS) { + check(__functionAddress); + } + callPV(arrays.length, arrays, __functionAddress); + } + + /** + * Array version of: {@link #glGenVertexArrays GenVertexArrays} + * + * @see Reference Page + */ + public static void glGenVertexArrays(@NativeType("GLuint *") int[] arrays) { + long __functionAddress = GL.getICD().glGenVertexArrays; + if (CHECKS) { + check(__functionAddress); + } + callPV(arrays.length, arrays, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL31.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL31.java new file mode 100644 index 000000000..de4b3b78a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL31.java @@ -0,0 +1,658 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 3.1. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 3.1 implementations support revision 1.40 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL31 extends GL30 { + + static { GL.initialize(); } + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, and TexImage3D. */ + public static final int + GL_R8_SNORM = 0x8F94, + GL_RG8_SNORM = 0x8F95, + GL_RGB8_SNORM = 0x8F96, + GL_RGBA8_SNORM = 0x8F97, + GL_R16_SNORM = 0x8F98, + GL_RG16_SNORM = 0x8F99, + GL_RGB16_SNORM = 0x8F9A, + GL_RGBA16_SNORM = 0x8F9B; + + /** Returned by GetTexLevelParameter and GetFramebufferAttachmentParameter. */ + public static final int GL_SIGNED_NORMALIZED = 0x8F9C; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_BUFFER = 0x8DC2, + GL_INT_SAMPLER_2D_RECT = 0x8DCD, + GL_INT_SAMPLER_BUFFER = 0x8DD0, + GL_UNSIGNED_INT_SAMPLER_2D_RECT = 0x8DD5, + GL_UNSIGNED_INT_SAMPLER_BUFFER = 0x8DD8; + + /** + * Accepted by the target parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, MapBufferRange, + * FlushMappedBufferRange, GetBufferParameteriv, BindBufferRange, BindBufferBase, and CopyBufferSubData. + */ + public static final int + GL_COPY_READ_BUFFER = 0x8F36, + GL_COPY_WRITE_BUFFER = 0x8F37; + + /** Accepted by the {@code cap} parameter of Enable, Disable and IsEnabled. */ + public static final int GL_PRIMITIVE_RESTART = 0x8F9D; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_PRIMITIVE_RESTART_INDEX = 0x8F9E; + + /** + * Accepted by the {@code target} parameter of BindBuffer, BufferData, BufferSubData, MapBuffer, MapBufferRange, BindTexture, UnmapBuffer, + * GetBufferSubData, GetBufferParameteriv, GetBufferPointerv, and TexBuffer, and the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, and + * GetIntegerv. + */ + public static final int GL_TEXTURE_BUFFER = 0x8C2A; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv. */ + public static final int + GL_MAX_TEXTURE_BUFFER_SIZE = 0x8C2B, + GL_TEXTURE_BINDING_BUFFER = 0x8C2C, + GL_TEXTURE_BUFFER_DATA_STORE_BINDING = 0x8C2D; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable and IsEnabled; by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and + * GetDoublev; and by the {@code target} parameter of BindTexture, GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameteri, TexParameterfv and + * TexParameteriv. + */ + public static final int GL_TEXTURE_RECTANGLE = 0x84F5; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and GetDoublev. */ + public static final int GL_TEXTURE_BINDING_RECTANGLE = 0x84F6; + + /** Accepted by the {@code target} parameter of GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv and TexImage2D. */ + public static final int GL_PROXY_TEXTURE_RECTANGLE = 0x84F7; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv and GetFloatv. */ + public static final int GL_MAX_RECTANGLE_TEXTURE_SIZE = 0x84F8; + + /** Returned by {@code type} parameter of GetActiveUniform when the location {@code index} for program object {@code program} is of type sampler2DRect. */ + public static final int GL_SAMPLER_2D_RECT = 0x8B63; + + /** + * Returned by {@code type} parameter of GetActiveUniform when the location {@code index} for program object {@code program} is of type + * sampler2DRectShadow. + */ + public static final int GL_SAMPLER_2D_RECT_SHADOW = 0x8B64; + + /** Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. */ + public static final int GL_UNIFORM_BUFFER = 0x8A11; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v, GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_UNIFORM_BUFFER_BINDING = 0x8A28; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v. */ + public static final int + GL_UNIFORM_BUFFER_START = 0x8A29, + GL_UNIFORM_BUFFER_SIZE = 0x8A2A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B, + GL_MAX_GEOMETRY_UNIFORM_BLOCKS = 0x8A2C, + GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D, + GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E, + GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F, + GL_MAX_UNIFORM_BLOCK_SIZE = 0x8A30, + GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31, + GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32, + GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33, + GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int + GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35, + GL_ACTIVE_UNIFORM_BLOCKS = 0x8A36; + + /** Accepted by the {@code pname} parameter of GetActiveUniformsiv. */ + public static final int + GL_UNIFORM_TYPE = 0x8A37, + GL_UNIFORM_SIZE = 0x8A38, + GL_UNIFORM_NAME_LENGTH = 0x8A39, + GL_UNIFORM_BLOCK_INDEX = 0x8A3A, + GL_UNIFORM_OFFSET = 0x8A3B, + GL_UNIFORM_ARRAY_STRIDE = 0x8A3C, + GL_UNIFORM_MATRIX_STRIDE = 0x8A3D, + GL_UNIFORM_IS_ROW_MAJOR = 0x8A3E; + + /** Accepted by the {@code pname} parameter of GetActiveUniformBlockiv. */ + public static final int + GL_UNIFORM_BLOCK_BINDING = 0x8A3F, + GL_UNIFORM_BLOCK_DATA_SIZE = 0x8A40, + GL_UNIFORM_BLOCK_NAME_LENGTH = 0x8A41, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43, + GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44, + GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = 0x8A45, + GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46; + + /** Returned by GetActiveUniformsiv and GetUniformBlockIndex. */ + public static final int GL_INVALID_INDEX = 0xFFFFFFFF; + + protected GL31() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawArraysInstanced ] --- + + /** + * Draw multiple instances of a range of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param first the index of the first vertex to be rendered + * @param count the number of vertices to be rendered + * @param primcount the number of instances of the specified range of vertices to be rendered + * + * @see Reference Page + */ + public static void glDrawArraysInstanced(@NativeType("GLenum") int mode, @NativeType("GLint") int first, @NativeType("GLsizei") int count, @NativeType("GLsizei") int primcount) { + GL31C.glDrawArraysInstanced(mode, first, count, primcount); + } + + // --- [ glDrawElementsInstanced ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstanced DrawElementsInstanced} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawElementsInstanced(int mode, int count, int type, long indices, int primcount) { + GL31C.nglDrawElementsInstanced(mode, count, type, indices, primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices the ByteBuffer containing the indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * + * @see Reference Page + */ + public static void glDrawElementsInstanced(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount) { + GL31C.glDrawElementsInstanced(mode, count, type, indices, primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices the ByteBuffer containing the indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * + * @see Reference Page + */ + public static void glDrawElementsInstanced(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount) { + GL31C.glDrawElementsInstanced(mode, type, indices, primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the ByteBuffer containing the indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * + * @see Reference Page + */ + public static void glDrawElementsInstanced(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount) { + GL31C.glDrawElementsInstanced(mode, indices, primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the ByteBuffer containing the indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * + * @see Reference Page + */ + public static void glDrawElementsInstanced(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount) { + GL31C.glDrawElementsInstanced(mode, indices, primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the ByteBuffer containing the indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * + * @see Reference Page + */ + public static void glDrawElementsInstanced(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount) { + GL31C.glDrawElementsInstanced(mode, indices, primcount); + } + + // --- [ glCopyBufferSubData ] --- + + /** + * Copies all or part of one buffer object's data store to the data store of another buffer object. + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if any of readoffset, writeoffset, or size are negative, if readoffset+size exceeds the size of the buffer object + * bound to readtarget, or if writeoffset+size exceeds the size of the buffer object bound to writetarget.

    + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if the same buffer object is bound to both readtarget and writetarget, and the ranges [readoffset, readoffset+size) + * and [writeoffset, writeoffset+size) overlap.

    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if zero is bound to readtarget or writetarget.

    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if the buffer objects bound to either readtarget or writetarget are mapped.

    + * + * @param readTarget the source buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL31C#GL_COPY_READ_BUFFER COPY_READ_BUFFER}{@link GL31C#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}
    {@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}{@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31C#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL31C#GL_UNIFORM_BUFFER UNIFORM_BUFFER}
    + * @param writeTarget the destination buffer object target + * @param readOffset the source buffer object offset, in bytes + * @param writeOffset the destination buffer object offset, in bytes + * @param size the number of bytes to copy + * + * @see Reference Page + */ + public static void glCopyBufferSubData(@NativeType("GLenum") int readTarget, @NativeType("GLenum") int writeTarget, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size) { + GL31C.glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); + } + + // --- [ glPrimitiveRestartIndex ] --- + + /** + * Specifies the primitive restart index. + * + * @param index the value to be interpreted as the primitive restart index + * + * @see Reference Page + */ + public static void glPrimitiveRestartIndex(@NativeType("GLuint") int index) { + GL31C.glPrimitiveRestartIndex(index); + } + + // --- [ glTexBuffer ] --- + + /** + * Attaches the storage for the buffer object named {@code buffer} to the active buffer texture, and specifies an internal format for the texel array found + * in the attached buffer object. If {@code buffer} is zero, any buffer object attached to the buffer texture is detached, and no new buffer object is + * attached. If {@code buffer} is non-zero, but is not the name of an existing buffer object, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. + * + *

    When a buffer object is attached to a buffer texture, the buffer object's data store is taken as the texture's texel array. The number of texels in the + * buffer texture's texel array is given by

    + * + *

    {@code floor(buffer_size / (components * sizeof(base_type))},

    + * + *

    where {@code buffer_size} is the size of the buffer object, in basic machine units and {@code components} and {@code base_type} are the element count + * and base data type for elements. The number of texels in the texel array is then clamped to the implementation-dependent limit {@link GL31C#GL_MAX_TEXTURE_BUFFER_SIZE MAX_TEXTURE_BUFFER_SIZE}. + * When a buffer texture is accessed in a shader, the results of a texel fetch are undefined if the specified texel number is greater than or equal to the + * clamped number of texels in the texel array.

    + * + *

    When a buffer texture is accessed in a shader, an integer is provided to indicate the texel number being accessed. If no buffer object is bound to the + * buffer texture, the results of the texel access are undefined. Otherwise, the attached buffer object's data store is interpreted as an array of elements + * of the GL data type corresponding to {@code internalformat}. Each texel consists of one to four elements that are mapped to texture components + * (R, G, B, A, L, and I). Element {@code m} of the texel numbered {@code n} is taken from element {@code n} * {@code components} + {@code m} of the + * attached buffer object's data store. Elements and texels are both numbered starting with zero. For texture formats with normalized components, the + * extracted values are converted to floating-point values. The components of the texture are then converted to an (R,G,B,A) vector, and returned to the + * shader as a four-component result vector with components of the appropriate data type for the texture's internal format.

    + * + * @param target the target of the operation. Must be:
    {@link GL31C#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    + * @param internalformat the sized internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + * + * @see Reference Page + */ + public static void glTexBuffer(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer) { + GL31C.glTexBuffer(target, internalformat, buffer); + } + + // --- [ glGetUniformIndices ] --- + + /** + * Unsafe version of: {@link #glGetUniformIndices GetUniformIndices} + * + * @param uniformCount the number of uniforms whose indices to query + */ + public static void nglGetUniformIndices(int program, int uniformCount, long uniformNames, long uniformIndices) { + GL31C.nglGetUniformIndices(program, uniformCount, uniformNames, uniformIndices); + } + + /** + * Retrieves the indices of a number of uniforms within a program object + * + * @param program the name of a program containing uniforms whose indices to query + * @param uniformNames an array of pointers to buffers containing the names of the queried uniforms + * @param uniformIndices an array that will receive the indices of the uniforms + * + * @see Reference Page + */ + public static void glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") PointerBuffer uniformNames, @NativeType("GLuint *") IntBuffer uniformIndices) { + GL31C.glGetUniformIndices(program, uniformNames, uniformIndices); + } + + /** + * Retrieves the indices of a number of uniforms within a program object + * + * @param program the name of a program containing uniforms whose indices to query + * @param uniformNames an array of pointers to buffers containing the names of the queried uniforms + * @param uniformIndices an array that will receive the indices of the uniforms + * + * @see Reference Page + */ + public static void glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence[] uniformNames, @NativeType("GLuint *") IntBuffer uniformIndices) { + GL31C.glGetUniformIndices(program, uniformNames, uniformIndices); + } + + /** + * Retrieves the indices of a number of uniforms within a program object + * + * @param program the name of a program containing uniforms whose indices to query + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence uniformName) { + return GL31C.glGetUniformIndices(program, uniformName); + } + + // --- [ glGetActiveUniformsiv ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniformsiv GetActiveUniformsiv} + * + * @param uniformCount the number of elements in the array of indices {@code uniformIndices} and the number of parameters written to {@code params} upon successful return + */ + public static void nglGetActiveUniformsiv(int program, int uniformCount, long uniformIndices, int pname, long params) { + GL31C.nglGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params); + } + + /** + * Returns information about several active uniform variables for the specified program object. + * + * @param program the program object to be queried + * @param uniformIndices an array of {@code uniformCount} integers containing the indices of uniforms within {@code program} + * @param pname the property of the each uniform in {@code uniformIndices} that should be written into the corresponding element of {@code params} + * @param params an array of {@code uniformCount} integers which are to receive the value of {@code pname} for each uniform in {@code uniformIndices} + * + * @see Reference Page + */ + public static void glGetActiveUniformsiv(@NativeType("GLuint") int program, @NativeType("GLuint const *") IntBuffer uniformIndices, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL31C.glGetActiveUniformsiv(program, uniformIndices, pname, params); + } + + /** + * Returns information about several active uniform variables for the specified program object. + * + * @param program the program object to be queried + * @param pname the property of the each uniform in {@code uniformIndices} that should be written into the corresponding element of {@code params} + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetActiveUniformsi(@NativeType("GLuint") int program, @NativeType("GLuint const *") int uniformIndex, @NativeType("GLenum") int pname) { + return GL31C.glGetActiveUniformsi(program, uniformIndex, pname); + } + + // --- [ glGetActiveUniformName ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniformName GetActiveUniformName} + * + * @param bufSize the size of the buffer, in units of {@code GLchar}, of the buffer whose address is specified in {@code uniformName} + */ + public static void nglGetActiveUniformName(int program, int uniformIndex, int bufSize, long length, long uniformName) { + GL31C.nglGetActiveUniformName(program, uniformIndex, bufSize, length, uniformName); + } + + /** + * Queries the name of an active uniform. + * + * @param program the program containing the active uniform index {@code uniformIndex} + * @param uniformIndex the index of the active uniform whose name to query + * @param length the address of a variable that will receive the number of characters that were or would have been written to the buffer addressed by {@code uniformName} + * @param uniformName the address of a buffer into which the GL will place the name of the active uniform at {@code uniformIndex} within {@code program} + * + * @see Reference Page + */ + public static void glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer uniformName) { + GL31C.glGetActiveUniformName(program, uniformIndex, length, uniformName); + } + + /** + * Queries the name of an active uniform. + * + * @param program the program containing the active uniform index {@code uniformIndex} + * @param uniformIndex the index of the active uniform whose name to query + * @param bufSize the size of the buffer, in units of {@code GLchar}, of the buffer whose address is specified in {@code uniformName} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex, @NativeType("GLsizei") int bufSize) { + return GL31C.glGetActiveUniformName(program, uniformIndex, bufSize); + } + + /** + * Queries the name of an active uniform. + * + * @param program the program containing the active uniform index {@code uniformIndex} + * @param uniformIndex the index of the active uniform whose name to query + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex) { + return glGetActiveUniformName(program, uniformIndex, glGetActiveUniformsi(program, uniformIndex, GL_UNIFORM_NAME_LENGTH)); + } + + // --- [ glGetUniformBlockIndex ] --- + + /** Unsafe version of: {@link #glGetUniformBlockIndex GetUniformBlockIndex} */ + public static int nglGetUniformBlockIndex(int program, long uniformBlockName) { + return GL31C.nglGetUniformBlockIndex(program, uniformBlockName); + } + + /** + * Retrieves the index of a named uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockName an array of characters to containing the name of the uniform block whose index to retrieve + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetUniformBlockIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer uniformBlockName) { + return GL31C.glGetUniformBlockIndex(program, uniformBlockName); + } + + /** + * Retrieves the index of a named uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockName an array of characters to containing the name of the uniform block whose index to retrieve + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetUniformBlockIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence uniformBlockName) { + return GL31C.glGetUniformBlockIndex(program, uniformBlockName); + } + + // --- [ glGetActiveUniformBlockiv ] --- + + /** Unsafe version of: {@link #glGetActiveUniformBlockiv GetActiveUniformBlockiv} */ + public static void nglGetActiveUniformBlockiv(int program, int uniformBlockIndex, int pname, long params) { + GL31C.nglGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params); + } + + /** + * Queries information about an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param pname the name of the parameter to query. One of:
    {@link GL31C#GL_UNIFORM_BLOCK_BINDING UNIFORM_BLOCK_BINDING}{@link GL31C#GL_UNIFORM_BLOCK_DATA_SIZE UNIFORM_BLOCK_DATA_SIZE}
    {@link GL31C#GL_UNIFORM_BLOCK_NAME_LENGTH UNIFORM_BLOCK_NAME_LENGTH}{@link GL31C#GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS UNIFORM_BLOCK_ACTIVE_UNIFORMS}
    {@link GL31C#GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES}{@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER}
    {@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER}{@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER}
    + * @param params the address of a variable to receive the result of the query + * + * @see Reference Page + */ + public static void glGetActiveUniformBlockiv(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL31C.glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params); + } + + /** + * Queries information about an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param pname the name of the parameter to query. One of:
    {@link GL31C#GL_UNIFORM_BLOCK_BINDING UNIFORM_BLOCK_BINDING}{@link GL31C#GL_UNIFORM_BLOCK_DATA_SIZE UNIFORM_BLOCK_DATA_SIZE}
    {@link GL31C#GL_UNIFORM_BLOCK_NAME_LENGTH UNIFORM_BLOCK_NAME_LENGTH}{@link GL31C#GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS UNIFORM_BLOCK_ACTIVE_UNIFORMS}
    {@link GL31C#GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES}{@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER}
    {@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER}{@link GL31C#GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetActiveUniformBlocki(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLenum") int pname) { + return GL31C.glGetActiveUniformBlocki(program, uniformBlockIndex, pname); + } + + // --- [ glGetActiveUniformBlockName ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniformBlockName GetActiveUniformBlockName} + * + * @param bufSize the size of the buffer addressed by {@code uniformBlockName} + */ + public static void nglGetActiveUniformBlockName(int program, int uniformBlockIndex, int bufSize, long length, long uniformBlockName) { + GL31C.nglGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName); + } + + /** + * Retrieves the name of an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param length the address of a variable to receive the number of characters that were written to {@code uniformBlockName} + * @param uniformBlockName an array of characters to receive the name of the uniform block at {@code uniformBlockIndex} + * + * @see Reference Page + */ + public static void glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer uniformBlockName) { + GL31C.glGetActiveUniformBlockName(program, uniformBlockIndex, length, uniformBlockName); + } + + /** + * Retrieves the name of an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param bufSize the size of the buffer addressed by {@code uniformBlockName} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLsizei") int bufSize) { + return GL31C.glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize); + } + + /** + * Retrieves the name of an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex) { + return glGetActiveUniformBlockName(program, uniformBlockIndex, glGetActiveUniformBlocki(program, uniformBlockIndex, GL_UNIFORM_BLOCK_NAME_LENGTH)); + } + + // --- [ glUniformBlockBinding ] --- + + /** + * Assigns a binding point to an active uniform block. + * + * @param program the name of a program object containing the active uniform block whose binding to assign + * @param uniformBlockIndex the index of the active uniform block within {@code program} whose binding to assign + * @param uniformBlockBinding the binding point to which to bind the uniform block with index {@code uniformBlockIndex} within {@code program} + * + * @see Reference Page + */ + public static void glUniformBlockBinding(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLuint") int uniformBlockBinding) { + GL31C.glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); + } + + /** + * Array version of: {@link #glGetUniformIndices GetUniformIndices} + * + * @see Reference Page + */ + public static void glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") PointerBuffer uniformNames, @NativeType("GLuint *") int[] uniformIndices) { + GL31C.glGetUniformIndices(program, uniformNames, uniformIndices); + } + + /** + * Array version of: {@link #glGetActiveUniformsiv GetActiveUniformsiv} + * + * @see Reference Page + */ + public static void glGetActiveUniformsiv(@NativeType("GLuint") int program, @NativeType("GLuint const *") int[] uniformIndices, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL31C.glGetActiveUniformsiv(program, uniformIndices, pname, params); + } + + /** + * Array version of: {@link #glGetActiveUniformName GetActiveUniformName} + * + * @see Reference Page + */ + public static void glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer uniformName) { + GL31C.glGetActiveUniformName(program, uniformIndex, length, uniformName); + } + + /** + * Array version of: {@link #glGetActiveUniformBlockiv GetActiveUniformBlockiv} + * + * @see Reference Page + */ + public static void glGetActiveUniformBlockiv(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL31C.glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params); + } + + /** + * Array version of: {@link #glGetActiveUniformBlockName GetActiveUniformBlockName} + * + * @see Reference Page + */ + public static void glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer uniformBlockName) { + GL31C.glGetActiveUniformBlockName(program, uniformBlockIndex, length, uniformBlockName); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL31C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL31C.java new file mode 100644 index 000000000..f10494c23 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL31C.java @@ -0,0 +1,740 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; +import org.lwjgl.system.MemoryUtil; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality of a forward compatible context, up to version 3.1. + * + *

    OpenGL 3.1 implementations support revision 1.40 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL31C extends GL30C { + + static { GL.initialize(); } + + /** Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, and TexImage3D. */ + public static final int + GL_R8_SNORM = 0x8F94, + GL_RG8_SNORM = 0x8F95, + GL_RGB8_SNORM = 0x8F96, + GL_RGBA8_SNORM = 0x8F97, + GL_R16_SNORM = 0x8F98, + GL_RG16_SNORM = 0x8F99, + GL_RGB16_SNORM = 0x8F9A, + GL_RGBA16_SNORM = 0x8F9B; + + /** Returned by GetTexLevelParameter and GetFramebufferAttachmentParameter. */ + public static final int GL_SIGNED_NORMALIZED = 0x8F9C; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_BUFFER = 0x8DC2, + GL_INT_SAMPLER_2D_RECT = 0x8DCD, + GL_INT_SAMPLER_BUFFER = 0x8DD0, + GL_UNSIGNED_INT_SAMPLER_2D_RECT = 0x8DD5, + GL_UNSIGNED_INT_SAMPLER_BUFFER = 0x8DD8; + + /** + * Accepted by the target parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, MapBufferRange, + * FlushMappedBufferRange, GetBufferParameteriv, BindBufferRange, BindBufferBase, and CopyBufferSubData. + */ + public static final int + GL_COPY_READ_BUFFER = 0x8F36, + GL_COPY_WRITE_BUFFER = 0x8F37; + + /** Accepted by the {@code cap} parameter of Enable, Disable and IsEnabled. */ + public static final int GL_PRIMITIVE_RESTART = 0x8F9D; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_PRIMITIVE_RESTART_INDEX = 0x8F9E; + + /** + * Accepted by the {@code target} parameter of BindBuffer, BufferData, BufferSubData, MapBuffer, MapBufferRange, BindTexture, UnmapBuffer, + * GetBufferSubData, GetBufferParameteriv, GetBufferPointerv, and TexBuffer, and the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, and + * GetIntegerv. + */ + public static final int GL_TEXTURE_BUFFER = 0x8C2A; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv. */ + public static final int + GL_MAX_TEXTURE_BUFFER_SIZE = 0x8C2B, + GL_TEXTURE_BINDING_BUFFER = 0x8C2C, + GL_TEXTURE_BUFFER_DATA_STORE_BINDING = 0x8C2D; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable and IsEnabled; by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and + * GetDoublev; and by the {@code target} parameter of BindTexture, GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameteri, TexParameterfv and + * TexParameteriv. + */ + public static final int GL_TEXTURE_RECTANGLE = 0x84F5; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and GetDoublev. */ + public static final int GL_TEXTURE_BINDING_RECTANGLE = 0x84F6; + + /** Accepted by the {@code target} parameter of GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv and TexImage2D. */ + public static final int GL_PROXY_TEXTURE_RECTANGLE = 0x84F7; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv and GetFloatv. */ + public static final int GL_MAX_RECTANGLE_TEXTURE_SIZE = 0x84F8; + + /** Returned by {@code type} parameter of GetActiveUniform when the location {@code index} for program object {@code program} is of type sampler2DRect. */ + public static final int GL_SAMPLER_2D_RECT = 0x8B63; + + /** + * Returned by {@code type} parameter of GetActiveUniform when the location {@code index} for program object {@code program} is of type + * sampler2DRectShadow. + */ + public static final int GL_SAMPLER_2D_RECT_SHADOW = 0x8B64; + + /** Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. */ + public static final int GL_UNIFORM_BUFFER = 0x8A11; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v, GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_UNIFORM_BUFFER_BINDING = 0x8A28; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v. */ + public static final int + GL_UNIFORM_BUFFER_START = 0x8A29, + GL_UNIFORM_BUFFER_SIZE = 0x8A2A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B, + GL_MAX_GEOMETRY_UNIFORM_BLOCKS = 0x8A2C, + GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D, + GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E, + GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F, + GL_MAX_UNIFORM_BLOCK_SIZE = 0x8A30, + GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31, + GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32, + GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33, + GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int + GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35, + GL_ACTIVE_UNIFORM_BLOCKS = 0x8A36; + + /** Accepted by the {@code pname} parameter of GetActiveUniformsiv. */ + public static final int + GL_UNIFORM_TYPE = 0x8A37, + GL_UNIFORM_SIZE = 0x8A38, + GL_UNIFORM_NAME_LENGTH = 0x8A39, + GL_UNIFORM_BLOCK_INDEX = 0x8A3A, + GL_UNIFORM_OFFSET = 0x8A3B, + GL_UNIFORM_ARRAY_STRIDE = 0x8A3C, + GL_UNIFORM_MATRIX_STRIDE = 0x8A3D, + GL_UNIFORM_IS_ROW_MAJOR = 0x8A3E; + + /** Accepted by the {@code pname} parameter of GetActiveUniformBlockiv. */ + public static final int + GL_UNIFORM_BLOCK_BINDING = 0x8A3F, + GL_UNIFORM_BLOCK_DATA_SIZE = 0x8A40, + GL_UNIFORM_BLOCK_NAME_LENGTH = 0x8A41, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43, + GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44, + GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = 0x8A45, + GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46; + + /** Returned by GetActiveUniformsiv and GetUniformBlockIndex. */ + public static final int GL_INVALID_INDEX = 0xFFFFFFFF; + + protected GL31C() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawArraysInstanced ] --- + + /** + * Draw multiple instances of a range of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param first the index of the first vertex to be rendered + * @param count the number of vertices to be rendered + * @param primcount the number of instances of the specified range of vertices to be rendered + * + * @see Reference Page + */ + public static native void glDrawArraysInstanced(@NativeType("GLenum") int mode, @NativeType("GLint") int first, @NativeType("GLsizei") int count, @NativeType("GLsizei") int primcount); + + // --- [ glDrawElementsInstanced ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstanced DrawElementsInstanced} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static native void nglDrawElementsInstanced(int mode, int count, int type, long indices, int primcount); + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices the ByteBuffer containing the indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * + * @see Reference Page + */ + public static void glDrawElementsInstanced(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstanced(mode, count, type, indices, primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices the ByteBuffer containing the indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * + * @see Reference Page + */ + public static void glDrawElementsInstanced(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstanced(mode, indices.remaining() >> GLChecks.typeToByteShift(type), type, memAddress(indices), primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the ByteBuffer containing the indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * + * @see Reference Page + */ + public static void glDrawElementsInstanced(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstanced(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, memAddress(indices), primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the ByteBuffer containing the indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * + * @see Reference Page + */ + public static void glDrawElementsInstanced(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstanced(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, memAddress(indices), primcount); + } + + /** + * Draws multiple instances of a set of elements. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}
    {@link GL11#GL_TRIANGLES TRIANGLES}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + * @param indices the ByteBuffer containing the indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * + * @see Reference Page + */ + public static void glDrawElementsInstanced(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount) { + nglDrawElementsInstanced(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, memAddress(indices), primcount); + } + + // --- [ glCopyBufferSubData ] --- + + /** + * Copies all or part of one buffer object's data store to the data store of another buffer object. + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if any of readoffset, writeoffset, or size are negative, if readoffset+size exceeds the size of the buffer object + * bound to readtarget, or if writeoffset+size exceeds the size of the buffer object bound to writetarget.

    + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if the same buffer object is bound to both readtarget and writetarget, and the ranges [readoffset, readoffset+size) + * and [writeoffset, writeoffset+size) overlap.

    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if zero is bound to readtarget or writetarget.

    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if the buffer objects bound to either readtarget or writetarget are mapped.

    + * + * @param readTarget the source buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link #GL_COPY_READ_BUFFER COPY_READ_BUFFER}{@link #GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}
    {@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}{@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link #GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link #GL_UNIFORM_BUFFER UNIFORM_BUFFER}
    + * @param writeTarget the destination buffer object target + * @param readOffset the source buffer object offset, in bytes + * @param writeOffset the destination buffer object offset, in bytes + * @param size the number of bytes to copy + * + * @see Reference Page + */ + public static native void glCopyBufferSubData(@NativeType("GLenum") int readTarget, @NativeType("GLenum") int writeTarget, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size); + + // --- [ glPrimitiveRestartIndex ] --- + + /** + * Specifies the primitive restart index. + * + * @param index the value to be interpreted as the primitive restart index + * + * @see Reference Page + */ + public static native void glPrimitiveRestartIndex(@NativeType("GLuint") int index); + + // --- [ glTexBuffer ] --- + + /** + * Attaches the storage for the buffer object named {@code buffer} to the active buffer texture, and specifies an internal format for the texel array found + * in the attached buffer object. If {@code buffer} is zero, any buffer object attached to the buffer texture is detached, and no new buffer object is + * attached. If {@code buffer} is non-zero, but is not the name of an existing buffer object, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated. + * + *

    When a buffer object is attached to a buffer texture, the buffer object's data store is taken as the texture's texel array. The number of texels in the + * buffer texture's texel array is given by

    + * + *

    {@code floor(buffer_size / (components * sizeof(base_type))},

    + * + *

    where {@code buffer_size} is the size of the buffer object, in basic machine units and {@code components} and {@code base_type} are the element count + * and base data type for elements. The number of texels in the texel array is then clamped to the implementation-dependent limit {@link #GL_MAX_TEXTURE_BUFFER_SIZE MAX_TEXTURE_BUFFER_SIZE}. + * When a buffer texture is accessed in a shader, the results of a texel fetch are undefined if the specified texel number is greater than or equal to the + * clamped number of texels in the texel array.

    + * + *

    When a buffer texture is accessed in a shader, an integer is provided to indicate the texel number being accessed. If no buffer object is bound to the + * buffer texture, the results of the texel access are undefined. Otherwise, the attached buffer object's data store is interpreted as an array of elements + * of the GL data type corresponding to {@code internalformat}. Each texel consists of one to four elements that are mapped to texture components + * (R, G, B, A, L, and I). Element {@code m} of the texel numbered {@code n} is taken from element {@code n} * {@code components} + {@code m} of the + * attached buffer object's data store. Elements and texels are both numbered starting with zero. For texture formats with normalized components, the + * extracted values are converted to floating-point values. The components of the texture are then converted to an (R,G,B,A) vector, and returned to the + * shader as a four-component result vector with components of the appropriate data type for the texture's internal format.

    + * + * @param target the target of the operation. Must be:
    {@link #GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    + * @param internalformat the sized internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + * + * @see Reference Page + */ + public static native void glTexBuffer(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer); + + // --- [ glGetUniformIndices ] --- + + /** + * Unsafe version of: {@link #glGetUniformIndices GetUniformIndices} + * + * @param uniformCount the number of uniforms whose indices to query + */ + public static native void nglGetUniformIndices(int program, int uniformCount, long uniformNames, long uniformIndices); + + /** + * Retrieves the indices of a number of uniforms within a program object + * + * @param program the name of a program containing uniforms whose indices to query + * @param uniformNames an array of pointers to buffers containing the names of the queried uniforms + * @param uniformIndices an array that will receive the indices of the uniforms + * + * @see Reference Page + */ + public static void glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") PointerBuffer uniformNames, @NativeType("GLuint *") IntBuffer uniformIndices) { + if (CHECKS) { + check(uniformIndices, uniformNames.remaining()); + } + nglGetUniformIndices(program, uniformNames.remaining(), memAddress(uniformNames), memAddress(uniformIndices)); + } + + /** + * Retrieves the indices of a number of uniforms within a program object + * + * @param program the name of a program containing uniforms whose indices to query + * @param uniformNames an array of pointers to buffers containing the names of the queried uniforms + * @param uniformIndices an array that will receive the indices of the uniforms + * + * @see Reference Page + */ + public static void glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence[] uniformNames, @NativeType("GLuint *") IntBuffer uniformIndices) { + if (CHECKS) { + check(uniformIndices, uniformNames.length); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long uniformNamesAddress = APIUtil.apiArray(stack, MemoryUtil::memASCII, uniformNames); + nglGetUniformIndices(program, uniformNames.length, uniformNamesAddress, memAddress(uniformIndices)); + APIUtil.apiArrayFree(uniformNamesAddress, uniformNames.length); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Retrieves the indices of a number of uniforms within a program object + * + * @param program the name of a program containing uniforms whose indices to query + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") CharSequence uniformName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long uniformNamesAddress = APIUtil.apiArray(stack, MemoryUtil::memASCII, uniformName); + IntBuffer uniformIndices = stack.callocInt(1); + nglGetUniformIndices(program, 1, uniformNamesAddress, memAddress(uniformIndices)); + APIUtil.apiArrayFree(uniformNamesAddress, 1); + return uniformIndices.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetActiveUniformsiv ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniformsiv GetActiveUniformsiv} + * + * @param uniformCount the number of elements in the array of indices {@code uniformIndices} and the number of parameters written to {@code params} upon successful return + */ + public static native void nglGetActiveUniformsiv(int program, int uniformCount, long uniformIndices, int pname, long params); + + /** + * Returns information about several active uniform variables for the specified program object. + * + * @param program the program object to be queried + * @param uniformIndices an array of {@code uniformCount} integers containing the indices of uniforms within {@code program} + * @param pname the property of the each uniform in {@code uniformIndices} that should be written into the corresponding element of {@code params} + * @param params an array of {@code uniformCount} integers which are to receive the value of {@code pname} for each uniform in {@code uniformIndices} + * + * @see Reference Page + */ + public static void glGetActiveUniformsiv(@NativeType("GLuint") int program, @NativeType("GLuint const *") IntBuffer uniformIndices, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, uniformIndices.remaining()); + } + nglGetActiveUniformsiv(program, uniformIndices.remaining(), memAddress(uniformIndices), pname, memAddress(params)); + } + + /** + * Returns information about several active uniform variables for the specified program object. + * + * @param program the program object to be queried + * @param pname the property of the each uniform in {@code uniformIndices} that should be written into the corresponding element of {@code params} + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetActiveUniformsi(@NativeType("GLuint") int program, @NativeType("GLuint const *") int uniformIndex, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + IntBuffer uniformIndices = stack.ints(uniformIndex); + nglGetActiveUniformsiv(program, 1, memAddress(uniformIndices), pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetActiveUniformName ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniformName GetActiveUniformName} + * + * @param bufSize the size of the buffer, in units of {@code GLchar}, of the buffer whose address is specified in {@code uniformName} + */ + public static native void nglGetActiveUniformName(int program, int uniformIndex, int bufSize, long length, long uniformName); + + /** + * Queries the name of an active uniform. + * + * @param program the program containing the active uniform index {@code uniformIndex} + * @param uniformIndex the index of the active uniform whose name to query + * @param length the address of a variable that will receive the number of characters that were or would have been written to the buffer addressed by {@code uniformName} + * @param uniformName the address of a buffer into which the GL will place the name of the active uniform at {@code uniformIndex} within {@code program} + * + * @see Reference Page + */ + public static void glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer uniformName) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetActiveUniformName(program, uniformIndex, uniformName.remaining(), memAddressSafe(length), memAddress(uniformName)); + } + + /** + * Queries the name of an active uniform. + * + * @param program the program containing the active uniform index {@code uniformIndex} + * @param uniformIndex the index of the active uniform whose name to query + * @param bufSize the size of the buffer, in units of {@code GLchar}, of the buffer whose address is specified in {@code uniformName} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex, @NativeType("GLsizei") int bufSize) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer uniformName = stack.malloc(bufSize); + nglGetActiveUniformName(program, uniformIndex, bufSize, memAddress(length), memAddress(uniformName)); + return memASCII(uniformName, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Queries the name of an active uniform. + * + * @param program the program containing the active uniform index {@code uniformIndex} + * @param uniformIndex the index of the active uniform whose name to query + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex) { + return glGetActiveUniformName(program, uniformIndex, glGetActiveUniformsi(program, uniformIndex, GL_UNIFORM_NAME_LENGTH)); + } + + // --- [ glGetUniformBlockIndex ] --- + + /** Unsafe version of: {@link #glGetUniformBlockIndex GetUniformBlockIndex} */ + public static native int nglGetUniformBlockIndex(int program, long uniformBlockName); + + /** + * Retrieves the index of a named uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockName an array of characters to containing the name of the uniform block whose index to retrieve + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetUniformBlockIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer uniformBlockName) { + if (CHECKS) { + checkNT1(uniformBlockName); + } + return nglGetUniformBlockIndex(program, memAddress(uniformBlockName)); + } + + /** + * Retrieves the index of a named uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockName an array of characters to containing the name of the uniform block whose index to retrieve + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetUniformBlockIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence uniformBlockName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(uniformBlockName, true); + long uniformBlockNameEncoded = stack.getPointerAddress(); + return nglGetUniformBlockIndex(program, uniformBlockNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetActiveUniformBlockiv ] --- + + /** Unsafe version of: {@link #glGetActiveUniformBlockiv GetActiveUniformBlockiv} */ + public static native void nglGetActiveUniformBlockiv(int program, int uniformBlockIndex, int pname, long params); + + /** + * Queries information about an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param pname the name of the parameter to query. One of:
    {@link #GL_UNIFORM_BLOCK_BINDING UNIFORM_BLOCK_BINDING}{@link #GL_UNIFORM_BLOCK_DATA_SIZE UNIFORM_BLOCK_DATA_SIZE}
    {@link #GL_UNIFORM_BLOCK_NAME_LENGTH UNIFORM_BLOCK_NAME_LENGTH}{@link #GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS UNIFORM_BLOCK_ACTIVE_UNIFORMS}
    {@link #GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES}{@link #GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER}
    {@link #GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER}{@link #GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER}
    + * @param params the address of a variable to receive the result of the query + * + * @see Reference Page + */ + public static void glGetActiveUniformBlockiv(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetActiveUniformBlockiv(program, uniformBlockIndex, pname, memAddress(params)); + } + + /** + * Queries information about an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param pname the name of the parameter to query. One of:
    {@link #GL_UNIFORM_BLOCK_BINDING UNIFORM_BLOCK_BINDING}{@link #GL_UNIFORM_BLOCK_DATA_SIZE UNIFORM_BLOCK_DATA_SIZE}
    {@link #GL_UNIFORM_BLOCK_NAME_LENGTH UNIFORM_BLOCK_NAME_LENGTH}{@link #GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS UNIFORM_BLOCK_ACTIVE_UNIFORMS}
    {@link #GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES}{@link #GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER}
    {@link #GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER}{@link #GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetActiveUniformBlocki(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetActiveUniformBlockiv(program, uniformBlockIndex, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetActiveUniformBlockName ] --- + + /** + * Unsafe version of: {@link #glGetActiveUniformBlockName GetActiveUniformBlockName} + * + * @param bufSize the size of the buffer addressed by {@code uniformBlockName} + */ + public static native void nglGetActiveUniformBlockName(int program, int uniformBlockIndex, int bufSize, long length, long uniformBlockName); + + /** + * Retrieves the name of an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param length the address of a variable to receive the number of characters that were written to {@code uniformBlockName} + * @param uniformBlockName an array of characters to receive the name of the uniform block at {@code uniformBlockIndex} + * + * @see Reference Page + */ + public static void glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer uniformBlockName) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetActiveUniformBlockName(program, uniformBlockIndex, uniformBlockName.remaining(), memAddressSafe(length), memAddress(uniformBlockName)); + } + + /** + * Retrieves the name of an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * @param bufSize the size of the buffer addressed by {@code uniformBlockName} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLsizei") int bufSize) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer uniformBlockName = stack.malloc(bufSize); + nglGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, memAddress(length), memAddress(uniformBlockName)); + return memASCII(uniformBlockName, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Retrieves the name of an active uniform block. + * + * @param program the name of a program containing the uniform block + * @param uniformBlockIndex the index of the uniform block within {@code program} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex) { + return glGetActiveUniformBlockName(program, uniformBlockIndex, glGetActiveUniformBlocki(program, uniformBlockIndex, GL_UNIFORM_BLOCK_NAME_LENGTH)); + } + + // --- [ glUniformBlockBinding ] --- + + /** + * Assigns a binding point to an active uniform block. + * + * @param program the name of a program object containing the active uniform block whose binding to assign + * @param uniformBlockIndex the index of the active uniform block within {@code program} whose binding to assign + * @param uniformBlockBinding the binding point to which to bind the uniform block with index {@code uniformBlockIndex} within {@code program} + * + * @see Reference Page + */ + public static native void glUniformBlockBinding(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLuint") int uniformBlockBinding); + + /** + * Array version of: {@link #glGetUniformIndices GetUniformIndices} + * + * @see Reference Page + */ + public static void glGetUniformIndices(@NativeType("GLuint") int program, @NativeType("GLchar const * const *") PointerBuffer uniformNames, @NativeType("GLuint *") int[] uniformIndices) { + long __functionAddress = GL.getICD().glGetUniformIndices; + if (CHECKS) { + check(__functionAddress); + check(uniformIndices, uniformNames.remaining()); + } + callPPV(program, uniformNames.remaining(), memAddress(uniformNames), uniformIndices, __functionAddress); + } + + /** + * Array version of: {@link #glGetActiveUniformsiv GetActiveUniformsiv} + * + * @see Reference Page + */ + public static void glGetActiveUniformsiv(@NativeType("GLuint") int program, @NativeType("GLuint const *") int[] uniformIndices, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetActiveUniformsiv; + if (CHECKS) { + check(__functionAddress); + check(params, uniformIndices.length); + } + callPPV(program, uniformIndices.length, uniformIndices, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetActiveUniformName GetActiveUniformName} + * + * @see Reference Page + */ + public static void glGetActiveUniformName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformIndex, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer uniformName) { + long __functionAddress = GL.getICD().glGetActiveUniformName; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(program, uniformIndex, uniformName.remaining(), length, memAddress(uniformName), __functionAddress); + } + + /** + * Array version of: {@link #glGetActiveUniformBlockiv GetActiveUniformBlockiv} + * + * @see Reference Page + */ + public static void glGetActiveUniformBlockiv(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetActiveUniformBlockiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, uniformBlockIndex, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetActiveUniformBlockName GetActiveUniformBlockName} + * + * @see Reference Page + */ + public static void glGetActiveUniformBlockName(@NativeType("GLuint") int program, @NativeType("GLuint") int uniformBlockIndex, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer uniformBlockName) { + long __functionAddress = GL.getICD().glGetActiveUniformBlockName; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(program, uniformBlockIndex, uniformBlockName.remaining(), length, memAddress(uniformBlockName), __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL32.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL32.java new file mode 100644 index 000000000..abd7a3c91 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL32.java @@ -0,0 +1,896 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 3.2. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 3.2 implementations support revision 1.50 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL32 extends GL31 { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetIntegerv. */ + public static final int GL_CONTEXT_PROFILE_MASK = 0x9126; + + /** Context profile bits. */ + public static final int + GL_CONTEXT_CORE_PROFILE_BIT = 0x1, + GL_CONTEXT_COMPATIBILITY_PROFILE_BIT = 0x2; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122, + GL_MAX_GEOMETRY_INPUT_COMPONENTS = 0x9123, + GL_MAX_GEOMETRY_OUTPUT_COMPONENTS = 0x9124, + GL_MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125; + + /** Accepted by the {@code mode} parameter of ProvokingVertex. */ + public static final int + GL_FIRST_VERTEX_CONVENTION = 0x8E4D, + GL_LAST_VERTEX_CONVENTION = 0x8E4E; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_PROVOKING_VERTEX = 0x8E4F, + GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 0x8E4C; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and + * GetDoublev. + */ + public static final int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + + /** Accepted by the {@code pname} parameter of GetMultisamplefv. */ + public static final int GL_SAMPLE_POSITION = 0x8E50; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_SAMPLE_MASK = 0x8E51; + + /** Accepted by the {@code target} parameter of GetBooleani_v and GetIntegeri_v. */ + public static final int GL_SAMPLE_MASK_VALUE = 0x8E52; + + /** Accepted by the {@code target} parameter of BindTexture and TexImage2DMultisample. */ + public static final int GL_TEXTURE_2D_MULTISAMPLE = 0x9100; + + /** Accepted by the {@code target} parameter of TexImage2DMultisample. */ + public static final int GL_PROXY_TEXTURE_2D_MULTISAMPLE = 0x9101; + + /** Accepted by the {@code target} parameter of BindTexture and TexImage3DMultisample. */ + public static final int GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** Accepted by the {@code target} parameter of TexImage3DMultisample. */ + public static final int GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9103; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_MAX_SAMPLE_MASK_WORDS = 0x8E59, + GL_MAX_COLOR_TEXTURE_SAMPLES = 0x910E, + GL_MAX_DEPTH_TEXTURE_SAMPLES = 0x910F, + GL_MAX_INTEGER_SAMPLES = 0x9110, + GL_TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104, + GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_SAMPLES = 0x9106, + GL_TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_2D_MULTISAMPLE = 0x9108, + GL_INT_SAMPLER_2D_MULTISAMPLE = 0x9109, + GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A, + GL_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B, + GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C, + GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_DEPTH_CLAMP = 0x864F; + + /** Accepted by the {@code type} parameter of CreateShader and returned by the {@code params} parameter of GetShaderiv. */ + public static final int GL_GEOMETRY_SHADER = 0x8DD9; + + /** Accepted by the {@code pname} parameter of ProgramParameteri and GetProgramiv. */ + public static final int + GL_GEOMETRY_VERTICES_OUT = 0x8DDA, + GL_GEOMETRY_INPUT_TYPE = 0x8DDB, + GL_GEOMETRY_OUTPUT_TYPE = 0x8DDC; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS = 0x8C29, + GL_MAX_GEOMETRY_UNIFORM_COMPONENTS = 0x8DDF, + GL_MAX_GEOMETRY_OUTPUT_VERTICES = 0x8DE0, + GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 0x8DE1; + + /** Accepted by the {@code mode} parameter of Begin, DrawArrays, MultiDrawArrays, DrawElements, MultiDrawElements, and DrawRangeElements. */ + public static final int + GL_LINES_ADJACENCY = 0xA, + GL_LINE_STRIP_ADJACENCY = 0xB, + GL_TRIANGLES_ADJACENCY = 0xC, + GL_TRIANGLE_STRIP_ADJACENCY = 0xD; + + /** Returned by CheckFramebufferStatus. */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = 0x8DA8; + + /** Accepted by the {@code pname} parameter of GetFramebufferAttachment- Parameteriv. */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_LAYERED = 0x8DA7; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetIntegerv, GetFloatv, GetDoublev, and + * GetBooleanv. + */ + public static final int GL_PROGRAM_POINT_SIZE = 0x8642; + + /** Accepted as the {@code pname} parameter of GetInteger64v. */ + public static final int GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111; + + /** Accepted as the {@code pname} parameter of GetSynciv. */ + public static final int + GL_OBJECT_TYPE = 0x9112, + GL_SYNC_CONDITION = 0x9113, + GL_SYNC_STATUS = 0x9114, + GL_SYNC_FLAGS = 0x9115; + + /** Returned in {@code values} for GetSynciv {@code pname} OBJECT_TYPE. */ + public static final int GL_SYNC_FENCE = 0x9116; + + /** Returned in {@code values} for GetSynciv {@code pname} SYNC_CONDITION. */ + public static final int GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117; + + /** Returned in {@code values} for GetSynciv {@code pname} SYNC_STATUS. */ + public static final int + GL_UNSIGNALED = 0x9118, + GL_SIGNALED = 0x9119; + + /** Accepted in the {@code flags} parameter of ClientWaitSync. */ + public static final int GL_SYNC_FLUSH_COMMANDS_BIT = 0x1; + + /** Accepted in the {@code timeout} parameter of WaitSync. */ + public static final long GL_TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFFL; + + /** Returned by ClientWaitSync. */ + public static final int + GL_ALREADY_SIGNALED = 0x911A, + GL_TIMEOUT_EXPIRED = 0x911B, + GL_CONDITION_SATISFIED = 0x911C, + GL_WAIT_FAILED = 0x911D; + + protected GL32() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetBufferParameteri64v ] --- + + /** Unsafe version of: {@link #glGetBufferParameteri64v GetBufferParameteri64v} */ + public static void nglGetBufferParameteri64v(int target, int pname, long params) { + GL32C.nglGetBufferParameteri64v(target, pname, params); + } + + /** + * Returns the value of a buffer object parameter. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * @param params the requested parameter + * + * @see Reference Page + */ + public static void glGetBufferParameteri64v(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + GL32C.glGetBufferParameteri64v(target, pname, params); + } + + /** + * Returns the value of a buffer object parameter. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetBufferParameteri64(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL32C.glGetBufferParameteri64(target, pname); + } + + // --- [ glDrawElementsBaseVertex ] --- + + /** + * Unsafe version of: {@link #glDrawElementsBaseVertex DrawElementsBaseVertex} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawElementsBaseVertex(int mode, int count, int type, long indices, int basevertex) { + GL32C.nglDrawElementsBaseVertex(mode, count, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsBaseVertex(mode, count, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsBaseVertex(mode, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsBaseVertex(mode, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsBaseVertex(mode, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsBaseVertex(mode, indices, basevertex); + } + + // --- [ glDrawRangeElementsBaseVertex ] --- + + /** + * Unsafe version of: {@link #glDrawRangeElementsBaseVertex DrawRangeElementsBaseVertex} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawRangeElementsBaseVertex(int mode, int start, int end, int count, int type, long indices, int basevertex) { + GL32C.nglDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawRangeElementsBaseVertex(mode, start, end, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawRangeElementsBaseVertex(mode, start, end, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") ShortBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawRangeElementsBaseVertex(mode, start, end, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") IntBuffer indices, @NativeType("GLint") int basevertex) { + GL32C.glDrawRangeElementsBaseVertex(mode, start, end, indices, basevertex); + } + + // --- [ glDrawElementsInstancedBaseVertex ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstancedBaseVertex DrawElementsInstancedBaseVertex} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawElementsInstancedBaseVertex(int mode, int count, int type, long indices, int primcount, int basevertex) { + GL32C.nglDrawElementsInstancedBaseVertex(mode, count, type, indices, primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsInstancedBaseVertex(mode, count, type, indices, primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsInstancedBaseVertex(mode, type, indices, primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsInstancedBaseVertex(mode, indices, primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsInstancedBaseVertex(mode, indices, primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + GL32C.glDrawElementsInstancedBaseVertex(mode, indices, primcount, basevertex); + } + + // --- [ glMultiDrawElementsBaseVertex ] --- + + /** + * Unsafe version of: {@link #glMultiDrawElementsBaseVertex MultiDrawElementsBaseVertex} + * + * @param drawcount the size of the {@code count} array + */ + public static void nglMultiDrawElementsBaseVertex(int mode, long count, int type, long indices, int drawcount, long basevertex) { + GL32C.nglMultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex); + } + + /** + * Renders multiple sets of primitives by specifying indices of array data elements and an offset to apply to each index. + * + *

    LWJGL note: Use {@link org.lwjgl.system.MemoryUtil#memAddress} to retrieve pointers to the index buffers.

    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32C#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32C#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32C#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32C#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count an array of the elements counts + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a pointer to the location where the base vertices are stored + * + * @see Reference Page + */ + public static void glMultiDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei const *") IntBuffer count, @NativeType("GLenum") int type, @NativeType("void const * const *") PointerBuffer indices, @NativeType("GLint *") IntBuffer basevertex) { + GL32C.glMultiDrawElementsBaseVertex(mode, count, type, indices, basevertex); + } + + // --- [ glProvokingVertex ] --- + + /** + * Specifies the vertex to be used as the source of data for flat shaded varyings. + * + * @param mode the provoking vertex mode. One of:
    {@link GL32C#GL_FIRST_VERTEX_CONVENTION FIRST_VERTEX_CONVENTION}{@link GL32C#GL_LAST_VERTEX_CONVENTION LAST_VERTEX_CONVENTION}
    + * + * @see Reference Page + */ + public static void glProvokingVertex(@NativeType("GLenum") int mode) { + GL32C.glProvokingVertex(mode); + } + + // --- [ glTexImage2DMultisample ] --- + + /** + * Establishes the data storage, format, dimensions, and number of samples of a 2D multisample texture's image. + * + * @param target the target of the operation. One of:
    {@link GL32C#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32C#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}
    + * @param samples the number of samples in the multisample texture's image + * @param internalformat the internal format to be used to store the multisample texture's image. {@code internalformat} must specify a color-renderable, depth-renderable, + * or stencil-renderable format. + * @param width the width of the multisample texture's image, in texels + * @param height the height of the multisample texture's image, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static void glTexImage2DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL32C.glTexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); + } + + // --- [ glTexImage3DMultisample ] --- + + /** + * Establishes the data storage, format, dimensions, and number of samples of a 3D multisample texture's image. + * + * @param target the target of the operation. One of:
    {@link GL32C#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}{@link GL32C#GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param samples the number of samples in the multisample texture's image + * @param internalformat the internal format to be used to store the multisample texture's image. {@code internalformat} must specify a color-renderable, depth-renderable, + * or stencil-renderable format. + * @param width the width of the multisample texture's image, in texels + * @param height the height of the multisample texture's image, in texels + * @param depth the depth of the multisample texture's image, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static void glTexImage3DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL32C.glTexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); + } + + // --- [ glGetMultisamplefv ] --- + + /** Unsafe version of: {@link #glGetMultisamplefv GetMultisamplefv} */ + public static void nglGetMultisamplefv(int pname, int index, long val) { + GL32C.nglGetMultisamplefv(pname, index, val); + } + + /** + * Retrieves the location of a sample. + * + * @param pname the sample parameter name. Must be:
    {@link GL32C#GL_SAMPLE_POSITION SAMPLE_POSITION}
    + * @param index the index of the sample whose position to query + * @param val an array to receive the position of the sample + * + * @see Reference Page + */ + public static void glGetMultisamplefv(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer val) { + GL32C.glGetMultisamplefv(pname, index, val); + } + + /** + * Retrieves the location of a sample. + * + * @param pname the sample parameter name. Must be:
    {@link GL32C#GL_SAMPLE_POSITION SAMPLE_POSITION}
    + * @param index the index of the sample whose position to query + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetMultisamplef(@NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + return GL32C.glGetMultisamplef(pname, index); + } + + // --- [ glSampleMaski ] --- + + /** + * Sets the value of a sub-word of the sample mask. + * + * @param index which 32-bit sub-word of the sample mask to update + * @param mask the new value of the mask sub-word + * + * @see Reference Page + */ + public static void glSampleMaski(@NativeType("GLuint") int index, @NativeType("GLbitfield") int mask) { + GL32C.glSampleMaski(index, mask); + } + + // --- [ glFramebufferTexture ] --- + + /** + * Attaches a level of a texture object as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * + * @see Reference Page + */ + public static void glFramebufferTexture(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level) { + GL32C.glFramebufferTexture(target, attachment, texture, level); + } + + // --- [ glFenceSync ] --- + + /** + * Creates a new sync object and inserts it into the GL command stream. + * + * @param condition the condition that must be met to set the sync object's state to signaled. Must be:
    {@link GL32C#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE}
    + * @param flags a bitwise combination of flags controlling the behavior of the sync object. No flags are presently defined for this operation and {@code flags} must + * be zero. + * + * @see Reference Page + */ + @NativeType("GLsync") + public static long glFenceSync(@NativeType("GLenum") int condition, @NativeType("GLbitfield") int flags) { + return GL32C.glFenceSync(condition, flags); + } + + // --- [ glIsSync ] --- + + /** Unsafe version of: {@link #glIsSync IsSync} */ + public static boolean nglIsSync(long sync) { + return GL32C.nglIsSync(sync); + } + + /** + * Determines if a name corresponds to a sync object. + * + * @param sync a value that may be the name of a sync object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsSync(@NativeType("GLsync") long sync) { + return GL32C.glIsSync(sync); + } + + // --- [ glDeleteSync ] --- + + /** Unsafe version of: {@link #glDeleteSync DeleteSync} */ + public static void nglDeleteSync(long sync) { + GL32C.nglDeleteSync(sync); + } + + /** + * Deletes a sync object. + * + * @param sync the sync object to be deleted + * + * @see Reference Page + */ + public static void glDeleteSync(@NativeType("GLsync") long sync) { + GL32C.glDeleteSync(sync); + } + + // --- [ glClientWaitSync ] --- + + /** Unsafe version of: {@link #glClientWaitSync ClientWaitSync} */ + public static int nglClientWaitSync(long sync, int flags, long timeout) { + return GL32C.nglClientWaitSync(sync, flags, timeout); + } + + /** + * Causes the client to block and wait for a sync object to become signaled. If {@code sync} is signaled when {@code glClientWaitSync} is called, + * {@code glClientWaitSync} returns immediately, otherwise it will block and wait for up to timeout nanoseconds for {@code sync} to become signaled. + * + *

    The return value is one of four status values:

    + * + *
      + *
    • {@link GL32C#GL_ALREADY_SIGNALED ALREADY_SIGNALED} indicates that sync was signaled at the time that glClientWaitSync was called.
    • + *
    • {@link GL32C#GL_TIMEOUT_EXPIRED TIMEOUT_EXPIRED} indicates that at least timeout nanoseconds passed and sync did not become signaled.
    • + *
    • {@link GL32C#GL_CONDITION_SATISFIED CONDITION_SATISFIED} indicates that sync was signaled before the timeout expired.
    • + *
    • {@link GL32C#GL_WAIT_FAILED WAIT_FAILED} indicates that an error occurred. Additionally, an OpenGL error will be generated.
    • + *
    + * + * @param sync the sync object whose status to wait on + * @param flags a bitfield controlling the command flushing behavior. One or more of:
    0{@link GL32C#GL_SYNC_FLUSH_COMMANDS_BIT SYNC_FLUSH_COMMANDS_BIT}
    + * @param timeout the timeout, specified in nanoseconds, for which the implementation should wait for {@code sync} to become signaled + * + * @see Reference Page + */ + @NativeType("GLenum") + public static int glClientWaitSync(@NativeType("GLsync") long sync, @NativeType("GLbitfield") int flags, @NativeType("GLuint64") long timeout) { + return GL32C.glClientWaitSync(sync, flags, timeout); + } + + // --- [ glWaitSync ] --- + + /** Unsafe version of: {@link #glWaitSync WaitSync} */ + public static void nglWaitSync(long sync, int flags, long timeout) { + GL32C.nglWaitSync(sync, flags, timeout); + } + + /** + * Causes the GL server to block and wait for a sync object to become signaled. + * + *

    {@code glWaitSync} will always wait no longer than an implementation-dependent timeout. The duration of this timeout in nanoseconds may be queried by + * with {@link GL32C#GL_MAX_SERVER_WAIT_TIMEOUT MAX_SERVER_WAIT_TIMEOUT}. There is currently no way to determine whether glWaitSync unblocked because the timeout expired or because the + * sync object being waited on was signaled.

    + * + *

    If an error occurs, {@code glWaitSync} does not cause the GL server to block.

    + * + * @param sync the sync object whose status to wait on + * @param flags a bitfield controlling the command flushing behavior. Must be:
    0
    + * @param timeout the timeout that the server should wait before continuing. Must be:
    {@link GL32C#GL_TIMEOUT_IGNORED TIMEOUT_IGNORED}
    + * + * @see Reference Page + */ + public static void glWaitSync(@NativeType("GLsync") long sync, @NativeType("GLbitfield") int flags, @NativeType("GLuint64") long timeout) { + GL32C.glWaitSync(sync, flags, timeout); + } + + // --- [ glGetInteger64v ] --- + + /** Unsafe version of: {@link #glGetInteger64v GetInteger64v} */ + public static void nglGetInteger64v(int pname, long params) { + GL32C.nglGetInteger64v(pname, params); + } + + /** + * Returns the 64bit integer value or values of a selected parameter. + * + * @param pname the parameter value to be returned + * @param params the value or values of the specified parameter + * + * @see Reference Page + */ + public static void glGetInteger64v(@NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + GL32C.glGetInteger64v(pname, params); + } + + /** + * Returns the 64bit integer value or values of a selected parameter. + * + * @param pname the parameter value to be returned + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetInteger64(@NativeType("GLenum") int pname) { + return GL32C.glGetInteger64(pname); + } + + // --- [ glGetInteger64i_v ] --- + + /** Unsafe version of: {@link #glGetInteger64i_v GetInteger64i_v} */ + public static void nglGetInteger64i_v(int pname, int index, long params) { + GL32C.nglGetInteger64i_v(pname, index, params); + } + + /** + * Queries the 64bit integer value of an indexed state variable. + * + * @param pname the indexed state to query + * @param index the index of the element being queried + * @param params the value or values of the specified parameter + * + * @see Reference Page + */ + public static void glGetInteger64i_v(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint64 *") LongBuffer params) { + GL32C.glGetInteger64i_v(pname, index, params); + } + + /** + * Queries the 64bit integer value of an indexed state variable. + * + * @param pname the indexed state to query + * @param index the index of the element being queried + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetInteger64i(@NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + return GL32C.glGetInteger64i(pname, index); + } + + // --- [ glGetSynciv ] --- + + /** + * Unsafe version of: {@link #glGetSynciv GetSynciv} + * + * @param bufSize the size of the buffer whose address is given in {@code values} + */ + public static void nglGetSynciv(long sync, int pname, int bufSize, long length, long values) { + GL32C.nglGetSynciv(sync, pname, bufSize, length, values); + } + + /** + * Queries the properties of a sync object. + * + * @param sync the sync object whose properties to query + * @param pname the parameter whose value to retrieve from the sync object specified in {@code sync}. One of:
    {@link GL32C#GL_OBJECT_TYPE OBJECT_TYPE}{@link GL32C#GL_SYNC_CONDITION SYNC_CONDITION}{@link GL32C#GL_SYNC_STATUS SYNC_STATUS}{@link GL32C#GL_SYNC_FLAGS SYNC_FLAGS}
    + * @param length the address of an variable to receive the number of integers placed in {@code values} + * @param values the address of an array to receive the values of the queried parameter + * + * @see Reference Page + */ + public static void glGetSynciv(@NativeType("GLsync") long sync, @NativeType("GLenum") int pname, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer values) { + GL32C.glGetSynciv(sync, pname, length, values); + } + + /** + * Queries the properties of a sync object. + * + * @param sync the sync object whose properties to query + * @param pname the parameter whose value to retrieve from the sync object specified in {@code sync}. One of:
    {@link GL32C#GL_OBJECT_TYPE OBJECT_TYPE}{@link GL32C#GL_SYNC_CONDITION SYNC_CONDITION}{@link GL32C#GL_SYNC_STATUS SYNC_STATUS}{@link GL32C#GL_SYNC_FLAGS SYNC_FLAGS}
    + * @param length the address of an variable to receive the number of integers placed in {@code values} + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetSynci(@NativeType("GLsync") long sync, @NativeType("GLenum") int pname, @Nullable @NativeType("GLsizei *") IntBuffer length) { + return GL32C.glGetSynci(sync, pname, length); + } + + /** + * Array version of: {@link #glGetBufferParameteri64v GetBufferParameteri64v} + * + * @see Reference Page + */ + public static void glGetBufferParameteri64v(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + GL32C.glGetBufferParameteri64v(target, pname, params); + } + + /** + * Array version of: {@link #glMultiDrawElementsBaseVertex MultiDrawElementsBaseVertex} + * + * @see Reference Page + */ + public static void glMultiDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei const *") int[] count, @NativeType("GLenum") int type, @NativeType("void const * const *") PointerBuffer indices, @NativeType("GLint *") int[] basevertex) { + GL32C.glMultiDrawElementsBaseVertex(mode, count, type, indices, basevertex); + } + + /** + * Array version of: {@link #glGetMultisamplefv GetMultisamplefv} + * + * @see Reference Page + */ + public static void glGetMultisamplefv(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] val) { + GL32C.glGetMultisamplefv(pname, index, val); + } + + /** + * Array version of: {@link #glGetInteger64v GetInteger64v} + * + * @see Reference Page + */ + public static void glGetInteger64v(@NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + GL32C.glGetInteger64v(pname, params); + } + + /** + * Array version of: {@link #glGetInteger64i_v GetInteger64i_v} + * + * @see Reference Page + */ + public static void glGetInteger64i_v(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint64 *") long[] params) { + GL32C.glGetInteger64i_v(pname, index, params); + } + + /** + * Array version of: {@link #glGetSynciv GetSynciv} + * + * @see Reference Page + */ + public static void glGetSynciv(@NativeType("GLsync") long sync, @NativeType("GLenum") int pname, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] values) { + GL32C.glGetSynciv(sync, pname, length, values); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL32C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL32C.java new file mode 100644 index 000000000..601a88904 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL32C.java @@ -0,0 +1,964 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 3.2. Includes only Core Profile symbols. + * + *

    OpenGL 3.2 implementations support revision 1.50 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL32C extends GL31C { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetIntegerv. */ + public static final int GL_CONTEXT_PROFILE_MASK = 0x9126; + + /** Context profile bits. */ + public static final int + GL_CONTEXT_CORE_PROFILE_BIT = 0x1, + GL_CONTEXT_COMPATIBILITY_PROFILE_BIT = 0x2; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122, + GL_MAX_GEOMETRY_INPUT_COMPONENTS = 0x9123, + GL_MAX_GEOMETRY_OUTPUT_COMPONENTS = 0x9124, + GL_MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125; + + /** Accepted by the {@code mode} parameter of ProvokingVertex. */ + public static final int + GL_FIRST_VERTEX_CONVENTION = 0x8E4D, + GL_LAST_VERTEX_CONVENTION = 0x8E4E; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_PROVOKING_VERTEX = 0x8E4F, + GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 0x8E4C; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and + * GetDoublev. + */ + public static final int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + + /** Accepted by the {@code pname} parameter of GetMultisamplefv. */ + public static final int GL_SAMPLE_POSITION = 0x8E50; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_SAMPLE_MASK = 0x8E51; + + /** Accepted by the {@code target} parameter of GetBooleani_v and GetIntegeri_v. */ + public static final int GL_SAMPLE_MASK_VALUE = 0x8E52; + + /** Accepted by the {@code target} parameter of BindTexture and TexImage2DMultisample. */ + public static final int GL_TEXTURE_2D_MULTISAMPLE = 0x9100; + + /** Accepted by the {@code target} parameter of TexImage2DMultisample. */ + public static final int GL_PROXY_TEXTURE_2D_MULTISAMPLE = 0x9101; + + /** Accepted by the {@code target} parameter of BindTexture and TexImage3DMultisample. */ + public static final int GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** Accepted by the {@code target} parameter of TexImage3DMultisample. */ + public static final int GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9103; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_MAX_SAMPLE_MASK_WORDS = 0x8E59, + GL_MAX_COLOR_TEXTURE_SAMPLES = 0x910E, + GL_MAX_DEPTH_TEXTURE_SAMPLES = 0x910F, + GL_MAX_INTEGER_SAMPLES = 0x9110, + GL_TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104, + GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_SAMPLES = 0x9106, + GL_TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_2D_MULTISAMPLE = 0x9108, + GL_INT_SAMPLER_2D_MULTISAMPLE = 0x9109, + GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A, + GL_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B, + GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C, + GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_DEPTH_CLAMP = 0x864F; + + /** Accepted by the {@code type} parameter of CreateShader and returned by the {@code params} parameter of GetShaderiv. */ + public static final int GL_GEOMETRY_SHADER = 0x8DD9; + + /** Accepted by the {@code pname} parameter of ProgramParameteri and GetProgramiv. */ + public static final int + GL_GEOMETRY_VERTICES_OUT = 0x8DDA, + GL_GEOMETRY_INPUT_TYPE = 0x8DDB, + GL_GEOMETRY_OUTPUT_TYPE = 0x8DDC; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS = 0x8C29, + GL_MAX_GEOMETRY_UNIFORM_COMPONENTS = 0x8DDF, + GL_MAX_GEOMETRY_OUTPUT_VERTICES = 0x8DE0, + GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 0x8DE1; + + /** Accepted by the {@code mode} parameter of Begin, DrawArrays, MultiDrawArrays, DrawElements, MultiDrawElements, and DrawRangeElements. */ + public static final int + GL_LINES_ADJACENCY = 0xA, + GL_LINE_STRIP_ADJACENCY = 0xB, + GL_TRIANGLES_ADJACENCY = 0xC, + GL_TRIANGLE_STRIP_ADJACENCY = 0xD; + + /** Returned by CheckFramebufferStatus. */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = 0x8DA8; + + /** Accepted by the {@code pname} parameter of GetFramebufferAttachment- Parameteriv. */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_LAYERED = 0x8DA7; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetIntegerv, GetFloatv, GetDoublev, and + * GetBooleanv. + */ + public static final int GL_PROGRAM_POINT_SIZE = 0x8642; + + /** Accepted as the {@code pname} parameter of GetInteger64v. */ + public static final int GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111; + + /** Accepted as the {@code pname} parameter of GetSynciv. */ + public static final int + GL_OBJECT_TYPE = 0x9112, + GL_SYNC_CONDITION = 0x9113, + GL_SYNC_STATUS = 0x9114, + GL_SYNC_FLAGS = 0x9115; + + /** Returned in {@code values} for GetSynciv {@code pname} OBJECT_TYPE. */ + public static final int GL_SYNC_FENCE = 0x9116; + + /** Returned in {@code values} for GetSynciv {@code pname} SYNC_CONDITION. */ + public static final int GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117; + + /** Returned in {@code values} for GetSynciv {@code pname} SYNC_STATUS. */ + public static final int + GL_UNSIGNALED = 0x9118, + GL_SIGNALED = 0x9119; + + /** Accepted in the {@code flags} parameter of ClientWaitSync. */ + public static final int GL_SYNC_FLUSH_COMMANDS_BIT = 0x1; + + /** Accepted in the {@code timeout} parameter of WaitSync. */ + public static final long GL_TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFFL; + + /** Returned by ClientWaitSync. */ + public static final int + GL_ALREADY_SIGNALED = 0x911A, + GL_TIMEOUT_EXPIRED = 0x911B, + GL_CONDITION_SATISFIED = 0x911C, + GL_WAIT_FAILED = 0x911D; + + protected GL32C() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetBufferParameteri64v ] --- + + /** Unsafe version of: {@link #glGetBufferParameteri64v GetBufferParameteri64v} */ + public static native void nglGetBufferParameteri64v(int target, int pname, long params); + + /** + * Returns the value of a buffer object parameter. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * @param params the requested parameter + * + * @see Reference Page + */ + public static void glGetBufferParameteri64v(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetBufferParameteri64v(target, pname, memAddress(params)); + } + + /** + * Returns the value of a buffer object parameter. + * + * @param target the target buffer object. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetBufferParameteri64(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetBufferParameteri64v(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDrawElementsBaseVertex ] --- + + /** + * Unsafe version of: {@link #glDrawElementsBaseVertex DrawElementsBaseVertex} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static native void nglDrawElementsBaseVertex(int mode, int count, int type, long indices, int basevertex); + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLint") int basevertex) { + nglDrawElementsBaseVertex(mode, count, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + nglDrawElementsBaseVertex(mode, indices.remaining() >> GLChecks.typeToByteShift(type), type, memAddress(indices), basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + nglDrawElementsBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, memAddress(indices), basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLint") int basevertex) { + nglDrawElementsBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, memAddress(indices), basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLint") int basevertex) { + nglDrawElementsBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, memAddress(indices), basevertex); + } + + // --- [ glDrawRangeElementsBaseVertex ] --- + + /** + * Unsafe version of: {@link #glDrawRangeElementsBaseVertex DrawRangeElementsBaseVertex} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static native void nglDrawRangeElementsBaseVertex(int mode, int start, int end, int count, int type, long indices, int basevertex); + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLint") int basevertex) { + nglDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + nglDrawRangeElementsBaseVertex(mode, start, end, indices.remaining() >> GLChecks.typeToByteShift(type), type, memAddress(indices), basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") ByteBuffer indices, @NativeType("GLint") int basevertex) { + nglDrawRangeElementsBaseVertex(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_BYTE, memAddress(indices), basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") ShortBuffer indices, @NativeType("GLint") int basevertex) { + nglDrawRangeElementsBaseVertex(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_SHORT, memAddress(indices), basevertex); + } + + /** + * Renders primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param start the minimum array index contained in {@code indices} + * @param end the maximum array index contained in {@code indices} + * @param indices a pointer to the location where the indices are stored + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawRangeElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLuint") int start, @NativeType("GLuint") int end, @NativeType("void const *") IntBuffer indices, @NativeType("GLint") int basevertex) { + nglDrawRangeElementsBaseVertex(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_INT, memAddress(indices), basevertex); + } + + // --- [ glDrawElementsInstancedBaseVertex ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstancedBaseVertex DrawElementsInstancedBaseVertex} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static native void nglDrawElementsInstancedBaseVertex(int mode, int count, int type, long indices, int primcount, int basevertex); + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + nglDrawElementsInstancedBaseVertex(mode, count, type, indices, primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + nglDrawElementsInstancedBaseVertex(mode, indices.remaining() >> GLChecks.typeToByteShift(type), type, memAddress(indices), primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + nglDrawElementsInstancedBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, memAddress(indices), primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + nglDrawElementsInstancedBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, memAddress(indices), primcount, basevertex); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of indices when chosing elements from the enabled vertex arrays + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertex(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex) { + nglDrawElementsInstancedBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, memAddress(indices), primcount, basevertex); + } + + // --- [ glMultiDrawElementsBaseVertex ] --- + + /** + * Unsafe version of: {@link #glMultiDrawElementsBaseVertex MultiDrawElementsBaseVertex} + * + * @param drawcount the size of the {@code count} array + */ + public static native void nglMultiDrawElementsBaseVertex(int mode, long count, int type, long indices, int drawcount, long basevertex); + + /** + * Renders multiple sets of primitives by specifying indices of array data elements and an offset to apply to each index. + * + *

    LWJGL note: Use {@link org.lwjgl.system.MemoryUtil#memAddress} to retrieve pointers to the index buffers.

    + * + * @param mode the kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link #GL_LINES_ADJACENCY LINES_ADJACENCY}{@link #GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link #GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link #GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count an array of the elements counts + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param basevertex a pointer to the location where the base vertices are stored + * + * @see Reference Page + */ + public static void glMultiDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei const *") IntBuffer count, @NativeType("GLenum") int type, @NativeType("void const * const *") PointerBuffer indices, @NativeType("GLint *") IntBuffer basevertex) { + while (basevertex.hasRemaining()){ + GL32C.glDrawElementsBaseVertex(mode, count.get(), type, indices.get(), basevertex.get()); + } + } + + // --- [ glProvokingVertex ] --- + + /** + * Specifies the vertex to be used as the source of data for flat shaded varyings. + * + * @param mode the provoking vertex mode. One of:
    {@link #GL_FIRST_VERTEX_CONVENTION FIRST_VERTEX_CONVENTION}{@link #GL_LAST_VERTEX_CONVENTION LAST_VERTEX_CONVENTION}
    + * + * @see Reference Page + */ + public static native void glProvokingVertex(@NativeType("GLenum") int mode); + + // --- [ glTexImage2DMultisample ] --- + + /** + * Establishes the data storage, format, dimensions, and number of samples of a 2D multisample texture's image. + * + * @param target the target of the operation. One of:
    {@link #GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link #GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}
    + * @param samples the number of samples in the multisample texture's image + * @param internalformat the internal format to be used to store the multisample texture's image. {@code internalformat} must specify a color-renderable, depth-renderable, + * or stencil-renderable format. + * @param width the width of the multisample texture's image, in texels + * @param height the height of the multisample texture's image, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static native void glTexImage2DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedsamplelocations); + + // --- [ glTexImage3DMultisample ] --- + + /** + * Establishes the data storage, format, dimensions, and number of samples of a 3D multisample texture's image. + * + * @param target the target of the operation. One of:
    {@link #GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}{@link #GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param samples the number of samples in the multisample texture's image + * @param internalformat the internal format to be used to store the multisample texture's image. {@code internalformat} must specify a color-renderable, depth-renderable, + * or stencil-renderable format. + * @param width the width of the multisample texture's image, in texels + * @param height the height of the multisample texture's image, in texels + * @param depth the depth of the multisample texture's image, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static native void glTexImage3DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLint") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedsamplelocations); + + // --- [ glGetMultisamplefv ] --- + + /** Unsafe version of: {@link #glGetMultisamplefv GetMultisamplefv} */ + public static native void nglGetMultisamplefv(int pname, int index, long val); + + /** + * Retrieves the location of a sample. + * + * @param pname the sample parameter name. Must be:
    {@link #GL_SAMPLE_POSITION SAMPLE_POSITION}
    + * @param index the index of the sample whose position to query + * @param val an array to receive the position of the sample + * + * @see Reference Page + */ + public static void glGetMultisamplefv(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer val) { + if (CHECKS) { + check(val, 1); + } + nglGetMultisamplefv(pname, index, memAddress(val)); + } + + /** + * Retrieves the location of a sample. + * + * @param pname the sample parameter name. Must be:
    {@link #GL_SAMPLE_POSITION SAMPLE_POSITION}
    + * @param index the index of the sample whose position to query + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetMultisamplef(@NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer val = stack.callocFloat(1); + nglGetMultisamplefv(pname, index, memAddress(val)); + return val.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glSampleMaski ] --- + + /** + * Sets the value of a sub-word of the sample mask. + * + * @param index which 32-bit sub-word of the sample mask to update + * @param mask the new value of the mask sub-word + * + * @see Reference Page + */ + public static native void glSampleMaski(@NativeType("GLuint") int index, @NativeType("GLbitfield") int mask); + + // --- [ glFramebufferTexture ] --- + + /** + * Attaches a level of a texture object as a logical buffer to the currently bound framebuffer object. + * + * @param target the framebuffer target. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * + * @see Reference Page + */ + public static native void glFramebufferTexture(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glFenceSync ] --- + + /** + * Creates a new sync object and inserts it into the GL command stream. + * + * @param condition the condition that must be met to set the sync object's state to signaled. Must be:
    {@link #GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE}
    + * @param flags a bitwise combination of flags controlling the behavior of the sync object. No flags are presently defined for this operation and {@code flags} must + * be zero. + * + * @see Reference Page + */ + @NativeType("GLsync") + public static native long glFenceSync(@NativeType("GLenum") int condition, @NativeType("GLbitfield") int flags); + + // --- [ glIsSync ] --- + + /** Unsafe version of: {@link #glIsSync IsSync} */ + public static native boolean nglIsSync(long sync); + + /** + * Determines if a name corresponds to a sync object. + * + * @param sync a value that may be the name of a sync object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsSync(@NativeType("GLsync") long sync) { + if (CHECKS) { + check(sync); + } + return nglIsSync(sync); + } + + // --- [ glDeleteSync ] --- + + /** Unsafe version of: {@link #glDeleteSync DeleteSync} */ + public static native void nglDeleteSync(long sync); + + /** + * Deletes a sync object. + * + * @param sync the sync object to be deleted + * + * @see Reference Page + */ + public static void glDeleteSync(@NativeType("GLsync") long sync) { + if (CHECKS) { + check(sync); + } + nglDeleteSync(sync); + } + + // --- [ glClientWaitSync ] --- + + /** Unsafe version of: {@link #glClientWaitSync ClientWaitSync} */ + public static native int nglClientWaitSync(long sync, int flags, long timeout); + + /** + * Causes the client to block and wait for a sync object to become signaled. If {@code sync} is signaled when {@code glClientWaitSync} is called, + * {@code glClientWaitSync} returns immediately, otherwise it will block and wait for up to timeout nanoseconds for {@code sync} to become signaled. + * + *

    The return value is one of four status values:

    + * + *
      + *
    • {@link #GL_ALREADY_SIGNALED ALREADY_SIGNALED} indicates that sync was signaled at the time that glClientWaitSync was called.
    • + *
    • {@link #GL_TIMEOUT_EXPIRED TIMEOUT_EXPIRED} indicates that at least timeout nanoseconds passed and sync did not become signaled.
    • + *
    • {@link #GL_CONDITION_SATISFIED CONDITION_SATISFIED} indicates that sync was signaled before the timeout expired.
    • + *
    • {@link #GL_WAIT_FAILED WAIT_FAILED} indicates that an error occurred. Additionally, an OpenGL error will be generated.
    • + *
    + * + * @param sync the sync object whose status to wait on + * @param flags a bitfield controlling the command flushing behavior. One or more of:
    0{@link #GL_SYNC_FLUSH_COMMANDS_BIT SYNC_FLUSH_COMMANDS_BIT}
    + * @param timeout the timeout, specified in nanoseconds, for which the implementation should wait for {@code sync} to become signaled + * + * @see Reference Page + */ + @NativeType("GLenum") + public static int glClientWaitSync(@NativeType("GLsync") long sync, @NativeType("GLbitfield") int flags, @NativeType("GLuint64") long timeout) { + if (CHECKS) { + check(sync); + } + return nglClientWaitSync(sync, flags, timeout); + } + + // --- [ glWaitSync ] --- + + /** Unsafe version of: {@link #glWaitSync WaitSync} */ + public static native void nglWaitSync(long sync, int flags, long timeout); + + /** + * Causes the GL server to block and wait for a sync object to become signaled. + * + *

    {@code glWaitSync} will always wait no longer than an implementation-dependent timeout. The duration of this timeout in nanoseconds may be queried by + * with {@link #GL_MAX_SERVER_WAIT_TIMEOUT MAX_SERVER_WAIT_TIMEOUT}. There is currently no way to determine whether glWaitSync unblocked because the timeout expired or because the + * sync object being waited on was signaled.

    + * + *

    If an error occurs, {@code glWaitSync} does not cause the GL server to block.

    + * + * @param sync the sync object whose status to wait on + * @param flags a bitfield controlling the command flushing behavior. Must be:
    0
    + * @param timeout the timeout that the server should wait before continuing. Must be:
    {@link #GL_TIMEOUT_IGNORED TIMEOUT_IGNORED}
    + * + * @see Reference Page + */ + public static void glWaitSync(@NativeType("GLsync") long sync, @NativeType("GLbitfield") int flags, @NativeType("GLuint64") long timeout) { + if (CHECKS) { + check(sync); + } + nglWaitSync(sync, flags, timeout); + } + + // --- [ glGetInteger64v ] --- + + /** Unsafe version of: {@link #glGetInteger64v GetInteger64v} */ + public static native void nglGetInteger64v(int pname, long params); + + /** + * Returns the 64bit integer value or values of a selected parameter. + * + * @param pname the parameter value to be returned + * @param params the value or values of the specified parameter + * + * @see Reference Page + */ + public static void glGetInteger64v(@NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetInteger64v(pname, memAddress(params)); + } + + /** + * Returns the 64bit integer value or values of a selected parameter. + * + * @param pname the parameter value to be returned + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetInteger64(@NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetInteger64v(pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetInteger64i_v ] --- + + /** Unsafe version of: {@link #glGetInteger64i_v GetInteger64i_v} */ + public static native void nglGetInteger64i_v(int pname, int index, long params); + + /** + * Queries the 64bit integer value of an indexed state variable. + * + * @param pname the indexed state to query + * @param index the index of the element being queried + * @param params the value or values of the specified parameter + * + * @see Reference Page + */ + public static void glGetInteger64i_v(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetInteger64i_v(pname, index, memAddress(params)); + } + + /** + * Queries the 64bit integer value of an indexed state variable. + * + * @param pname the indexed state to query + * @param index the index of the element being queried + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetInteger64i(@NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetInteger64i_v(pname, index, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetSynciv ] --- + + /** + * Unsafe version of: {@link #glGetSynciv GetSynciv} + * + * @param bufSize the size of the buffer whose address is given in {@code values} + */ + public static native void nglGetSynciv(long sync, int pname, int bufSize, long length, long values); + + /** + * Queries the properties of a sync object. + * + * @param sync the sync object whose properties to query + * @param pname the parameter whose value to retrieve from the sync object specified in {@code sync}. One of:
    {@link #GL_OBJECT_TYPE OBJECT_TYPE}{@link #GL_SYNC_CONDITION SYNC_CONDITION}{@link #GL_SYNC_STATUS SYNC_STATUS}{@link #GL_SYNC_FLAGS SYNC_FLAGS}
    + * @param length the address of an variable to receive the number of integers placed in {@code values} + * @param values the address of an array to receive the values of the queried parameter + * + * @see Reference Page + */ + public static void glGetSynciv(@NativeType("GLsync") long sync, @NativeType("GLenum") int pname, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer values) { + if (CHECKS) { + check(sync); + checkSafe(length, 1); + } + nglGetSynciv(sync, pname, values.remaining(), memAddressSafe(length), memAddress(values)); + } + + /** + * Queries the properties of a sync object. + * + * @param sync the sync object whose properties to query + * @param pname the parameter whose value to retrieve from the sync object specified in {@code sync}. One of:
    {@link #GL_OBJECT_TYPE OBJECT_TYPE}{@link #GL_SYNC_CONDITION SYNC_CONDITION}{@link #GL_SYNC_STATUS SYNC_STATUS}{@link #GL_SYNC_FLAGS SYNC_FLAGS}
    + * @param length the address of an variable to receive the number of integers placed in {@code values} + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetSynci(@NativeType("GLsync") long sync, @NativeType("GLenum") int pname, @Nullable @NativeType("GLsizei *") IntBuffer length) { + if (CHECKS) { + check(sync); + checkSafe(length, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer values = stack.callocInt(1); + nglGetSynciv(sync, pname, 1, memAddressSafe(length), memAddress(values)); + return values.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Array version of: {@link #glGetBufferParameteri64v GetBufferParameteri64v} + * + * @see Reference Page + */ + public static void glGetBufferParameteri64v(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetBufferParameteri64v; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glMultiDrawElementsBaseVertex MultiDrawElementsBaseVertex} + * + * @see Reference Page + */ + public static void glMultiDrawElementsBaseVertex(@NativeType("GLenum") int mode, @NativeType("GLsizei const *") int[] count, @NativeType("GLenum") int type, @NativeType("void const * const *") PointerBuffer indices, @NativeType("GLint *") int[] basevertex) { + long __functionAddress = GL.getICD().glMultiDrawElementsBaseVertex; + if (CHECKS) { + check(__functionAddress); + check(indices, count.length); + check(basevertex, count.length); + } + callPPPV(mode, count, type, memAddress(indices), count.length, basevertex, __functionAddress); + } + + /** + * Array version of: {@link #glGetMultisamplefv GetMultisamplefv} + * + * @see Reference Page + */ + public static void glGetMultisamplefv(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] val) { + long __functionAddress = GL.getICD().glGetMultisamplefv; + if (CHECKS) { + check(__functionAddress); + check(val, 1); + } + callPV(pname, index, val, __functionAddress); + } + + /** + * Array version of: {@link #glGetInteger64v GetInteger64v} + * + * @see Reference Page + */ + public static void glGetInteger64v(@NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetInteger64v; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetInteger64i_v GetInteger64i_v} + * + * @see Reference Page + */ + public static void glGetInteger64i_v(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetInteger64i_v; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pname, index, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetSynciv GetSynciv} + * + * @see Reference Page + */ + public static void glGetSynciv(@NativeType("GLsync") long sync, @NativeType("GLenum") int pname, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] values) { + long __functionAddress = GL.getICD().glGetSynciv; + if (CHECKS) { + check(__functionAddress); + check(sync); + checkSafe(length, 1); + } + callPPPV(sync, pname, values.length, length, values, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL33.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL33.java new file mode 100644 index 000000000..0ff2ab65a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL33.java @@ -0,0 +1,1607 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 3.3. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 3.3 implementations support revision 3.30 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL33 extends GL32 { + + static { GL.initialize(); } + + /** + * Accepted by the {@code src} and {@code dst} parameters of BlendFunc and BlendFunci, and by the {@code srcRGB}, {@code dstRGB}, {@code srcAlpha} and + * {@code dstAlpha} parameters of BlendFuncSeparate and BlendFuncSeparatei. + */ + public static final int + GL_SRC1_COLOR = 0x88F9, + GL_ONE_MINUS_SRC1_COLOR = 0x88FA, + GL_ONE_MINUS_SRC1_ALPHA = 0x88FB; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and GetDoublev. */ + public static final int GL_MAX_DUAL_SOURCE_DRAW_BUFFERS = 0x88FC; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int GL_ANY_SAMPLES_PASSED = 0x8C2F; + + /** Accepted by the {@code value} parameter of the GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv and GetDoublev functions. */ + public static final int GL_SAMPLER_BINDING = 0x8919; + + /** + * Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, RenderbufferStorage and + * RenderbufferStorageMultisample. + */ + public static final int GL_RGB10_A2UI = 0x906F; + + /** Accepted by the {@code pname} parameters of TexParameteri, TexParameterf, TexParameteriv, TexParameterfv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int + GL_TEXTURE_SWIZZLE_R = 0x8E42, + GL_TEXTURE_SWIZZLE_G = 0x8E43, + GL_TEXTURE_SWIZZLE_B = 0x8E44, + GL_TEXTURE_SWIZZLE_A = 0x8E45; + + /** Accepted by the {@code pname} parameters of TexParameteriv, TexParameterfv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int GL_TEXTURE_SWIZZLE_RGBA = 0x8E46; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int GL_TIME_ELAPSED = 0x88BF; + + /** + * Accepted by the {@code target} parameter of GetQueryiv and QueryCounter. Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev. + */ + public static final int GL_TIMESTAMP = 0x8E28; + + /** Accepted by the {@code pname} parameters of GetVertexAttribdv, GetVertexAttribfv, and GetVertexAttribiv. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE; + + /** + * Accepted by the {@code type} parameter of VertexAttribPointer, VertexPointer, NormalPointer, ColorPointer, SecondaryColorPointer, TexCoordPointer, + * VertexAttribP{1234}ui, VertexP*, TexCoordP*, MultiTexCoordP*, NormalP3ui, ColorP*, SecondaryColorP* and VertexAttribP*. + */ + public static final int GL_INT_2_10_10_10_REV = 0x8D9F; + + protected GL33() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindFragDataLocationIndexed ] --- + + /** Unsafe version of: {@link #glBindFragDataLocationIndexed BindFragDataLocationIndexed} */ + public static void nglBindFragDataLocationIndexed(int program, int colorNumber, int index, long name) { + GL33C.nglBindFragDataLocationIndexed(program, colorNumber, index, name); + } + + /** + * Binds a user-defined varying out variable to a fragment shader color number and index. + * + * @param program the name of the program containing varying out variable whose binding to modify + * @param colorNumber the color number to bind the user-defined varying out variable to + * @param index the index of the color input to bind the user-defined varying out variable to + * @param name the name of the user-defined varying out variable whose binding to modify + * + * @see Reference Page + */ + public static void glBindFragDataLocationIndexed(@NativeType("GLuint") int program, @NativeType("GLuint") int colorNumber, @NativeType("GLuint") int index, @NativeType("GLchar const *") ByteBuffer name) { + GL33C.glBindFragDataLocationIndexed(program, colorNumber, index, name); + } + + /** + * Binds a user-defined varying out variable to a fragment shader color number and index. + * + * @param program the name of the program containing varying out variable whose binding to modify + * @param colorNumber the color number to bind the user-defined varying out variable to + * @param index the index of the color input to bind the user-defined varying out variable to + * @param name the name of the user-defined varying out variable whose binding to modify + * + * @see Reference Page + */ + public static void glBindFragDataLocationIndexed(@NativeType("GLuint") int program, @NativeType("GLuint") int colorNumber, @NativeType("GLuint") int index, @NativeType("GLchar const *") CharSequence name) { + GL33C.glBindFragDataLocationIndexed(program, colorNumber, index, name); + } + + // --- [ glGetFragDataIndex ] --- + + /** Unsafe version of: {@link #glGetFragDataIndex GetFragDataIndex} */ + public static int nglGetFragDataIndex(int program, long name) { + return GL33C.nglGetFragDataIndex(program, name); + } + + /** + * Queries the bindings of color indices to user-defined varying out variables. + * + * @param program the name of the program containing varying out variable whose binding to query + * @param name the name of the user-defined varying out variable whose index to query + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetFragDataIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + return GL33C.glGetFragDataIndex(program, name); + } + + /** + * Queries the bindings of color indices to user-defined varying out variables. + * + * @param program the name of the program containing varying out variable whose binding to query + * @param name the name of the user-defined varying out variable whose index to query + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetFragDataIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + return GL33C.glGetFragDataIndex(program, name); + } + + // --- [ glGenSamplers ] --- + + /** + * Unsafe version of: {@link #glGenSamplers GenSamplers} + * + * @param count the number of sampler object names to generate + */ + public static void nglGenSamplers(int count, long samplers) { + GL33C.nglGenSamplers(count, samplers); + } + + /** + * Generates sampler object names. + * + * @param samplers a buffer in which the generated sampler object names are stored + * + * @see Reference Page + */ + public static void glGenSamplers(@NativeType("GLuint *") IntBuffer samplers) { + GL33C.glGenSamplers(samplers); + } + + /** + * Generates sampler object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenSamplers() { + return GL33C.glGenSamplers(); + } + + // --- [ glDeleteSamplers ] --- + + /** + * Unsafe version of: {@link #glDeleteSamplers DeleteSamplers} + * + * @param count the number of sampler objects to be deleted + */ + public static void nglDeleteSamplers(int count, long samplers) { + GL33C.nglDeleteSamplers(count, samplers); + } + + /** + * Deletes named sampler objects. + * + * @param samplers an array of sampler objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteSamplers(@NativeType("GLuint const *") IntBuffer samplers) { + GL33C.glDeleteSamplers(samplers); + } + + /** + * Deletes named sampler objects. + * + * @see Reference Page + */ + public static void glDeleteSamplers(@NativeType("GLuint const *") int sampler) { + GL33C.glDeleteSamplers(sampler); + } + + // --- [ glIsSampler ] --- + + /** + * Determines if a name corresponds to a sampler object. + * + * @param sampler a value that may be the name of a sampler object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsSampler(@NativeType("GLuint") int sampler) { + return GL33C.glIsSampler(sampler); + } + + // --- [ glBindSampler ] --- + + /** + * Binds a named sampler to a texturing target. + * + * @param unit the index of the texture unit to which the sampler is bound + * @param sampler the name of a sampler + * + * @see Reference Page + */ + public static void glBindSampler(@NativeType("GLuint") int unit, @NativeType("GLuint") int sampler) { + GL33C.glBindSampler(unit, sampler); + } + + // --- [ glSamplerParameteri ] --- + + /** + * Set the integer value of a sampler parameter. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a single-valued sampler parameter. One of:
    {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}
    {@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    + * @param param the value of {@code pname} + * + * @see Reference Page + */ + public static void glSamplerParameteri(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint") int param) { + GL33C.glSamplerParameteri(sampler, pname, param); + } + + // --- [ glSamplerParameterf ] --- + + /** + * Float version of {@link #glSamplerParameteri SamplerParameteri}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a single-valued sampler parameter + * @param param the value of {@code pname} + * + * @see Reference Page + */ + public static void glSamplerParameterf(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param) { + GL33C.glSamplerParameterf(sampler, pname, param); + } + + // --- [ glSamplerParameteriv ] --- + + /** Unsafe version of: {@link #glSamplerParameteriv SamplerParameteriv} */ + public static void nglSamplerParameteriv(int sampler, int pname, long params) { + GL33C.nglSamplerParameteriv(sampler, pname, params); + } + + /** + * Pointer version of {@link #glSamplerParameteri SamplerParameteri}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter. One of:
    {@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    + * @param params an array where the value or values of {@code pname} are stored + * + * @see Reference Page + */ + public static void glSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + GL33C.glSamplerParameteriv(sampler, pname, params); + } + + // --- [ glSamplerParameterfv ] --- + + /** Unsafe version of: {@link #glSamplerParameterfv SamplerParameterfv} */ + public static void nglSamplerParameterfv(int sampler, int pname, long params) { + GL33C.nglSamplerParameterfv(sampler, pname, params); + } + + /** + * Float version of {@link #glSamplerParameteriv SamplerParameteriv}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter + * @param params an array where the value or values of {@code pname} are stored + * + * @see Reference Page + */ + public static void glSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + GL33C.glSamplerParameterfv(sampler, pname, params); + } + + // --- [ glSamplerParameterIiv ] --- + + /** Unsafe version of: {@link #glSamplerParameterIiv SamplerParameterIiv} */ + public static void nglSamplerParameterIiv(int sampler, int pname, long params) { + GL33C.nglSamplerParameterIiv(sampler, pname, params); + } + + /** + * Pure integer version of {@link #glSamplerParameteriv SamplerParameteriv}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter + * @param params an array where the value or values of {@code pname} are stored + * + * @see Reference Page + */ + public static void glSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + GL33C.glSamplerParameterIiv(sampler, pname, params); + } + + // --- [ glSamplerParameterIuiv ] --- + + /** Unsafe version of: {@link #glSamplerParameterIuiv SamplerParameterIuiv} */ + public static void nglSamplerParameterIuiv(int sampler, int pname, long params) { + GL33C.nglSamplerParameterIuiv(sampler, pname, params); + } + + /** + * Unsigned pure integer version of {@link #glSamplerParameteriv SamplerParameteriv}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter + * @param params an array where the value or values of {@code pname} are stored + * + * @see Reference Page + */ + public static void glSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint const *") IntBuffer params) { + GL33C.glSamplerParameterIuiv(sampler, pname, params); + } + + // --- [ glGetSamplerParameteriv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameteriv GetSamplerParameteriv} */ + public static void nglGetSamplerParameteriv(int sampler, int pname, long params) { + GL33C.nglGetSamplerParameteriv(sampler, pname, params); + } + + /** + * Return the integer value(s) of a sampler parameter. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter. One of:
    {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}
    {@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    ,{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}
    + * @param params the sampler parameters + * + * @see Reference Page + */ + public static void glGetSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL33C.glGetSamplerParameteriv(sampler, pname, params); + } + + /** + * Return the integer value(s) of a sampler parameter. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter. One of:
    {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}
    {@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    ,{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetSamplerParameteri(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + return GL33C.glGetSamplerParameteri(sampler, pname); + } + + // --- [ glGetSamplerParameterfv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameterfv GetSamplerParameterfv} */ + public static void nglGetSamplerParameterfv(int sampler, int pname, long params) { + GL33C.nglGetSamplerParameterfv(sampler, pname, params); + } + + /** + * Float version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * @param params the sampler parameters + * + * @see Reference Page + */ + public static void glGetSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + GL33C.glGetSamplerParameterfv(sampler, pname, params); + } + + /** + * Float version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetSamplerParameterf(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + return GL33C.glGetSamplerParameterf(sampler, pname); + } + + // --- [ glGetSamplerParameterIiv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameterIiv GetSamplerParameterIiv} */ + public static void nglGetSamplerParameterIiv(int sampler, int pname, long params) { + GL33C.nglGetSamplerParameterIiv(sampler, pname, params); + } + + /** + * Pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * @param params the sampler parameters + * + * @see Reference Page + */ + public static void glGetSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL33C.glGetSamplerParameterIiv(sampler, pname, params); + } + + /** + * Pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetSamplerParameterIi(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + return GL33C.glGetSamplerParameterIi(sampler, pname); + } + + // --- [ glGetSamplerParameterIuiv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameterIuiv GetSamplerParameterIuiv} */ + public static void nglGetSamplerParameterIuiv(int sampler, int pname, long params) { + GL33C.nglGetSamplerParameterIuiv(sampler, pname, params); + } + + /** + * Unsigned pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * @param params the sampler parameters + * + * @see Reference Page + */ + public static void glGetSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + GL33C.glGetSamplerParameterIuiv(sampler, pname, params); + } + + /** + * Unsigned pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetSamplerParameterIui(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + return GL33C.glGetSamplerParameterIui(sampler, pname); + } + + // --- [ glQueryCounter ] --- + + /** + * Records the GL time into a query object after all previous commands have reached the GL server but have not yet necessarily executed. + * + * @param id the name of a query object into which to record the GL time + * @param target the counter to query. Must be:
    {@link GL33C#GL_TIMESTAMP TIMESTAMP}
    + * + * @see Reference Page + */ + public static void glQueryCounter(@NativeType("GLuint") int id, @NativeType("GLenum") int target) { + GL33C.glQueryCounter(id, target); + } + + // --- [ glGetQueryObjecti64v ] --- + + /** Unsafe version of: {@link #glGetQueryObjecti64v GetQueryObjecti64v} */ + public static void nglGetQueryObjecti64v(int id, int pname, long params) { + GL33C.nglGetQueryObjecti64v(id, pname, params); + } + + /** + * Returns the 64bit integer value of query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15#GL_QUERY_RESULT QUERY_RESULT}{@link GL15#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjecti64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + GL33C.glGetQueryObjecti64v(id, pname, params); + } + + /** + * Returns the 64bit integer value of query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15#GL_QUERY_RESULT QUERY_RESULT}{@link GL15#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjecti64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long params) { + GL33C.glGetQueryObjecti64v(id, pname, params); + } + + /** + * Returns the 64bit integer value of query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15#GL_QUERY_RESULT QUERY_RESULT}{@link GL15#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetQueryObjecti64(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + return GL33C.glGetQueryObjecti64(id, pname); + } + + // --- [ glGetQueryObjectui64v ] --- + + /** Unsafe version of: {@link #glGetQueryObjectui64v GetQueryObjectui64v} */ + public static void nglGetQueryObjectui64v(int id, int pname, long params) { + GL33C.nglGetQueryObjectui64v(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjecti64v GetQueryObjecti64v}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectui64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") LongBuffer params) { + GL33C.glGetQueryObjectui64v(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjecti64v GetQueryObjecti64v}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectui64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") long params) { + GL33C.glGetQueryObjectui64v(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjecti64v GetQueryObjecti64v}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetQueryObjectui64(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + return GL33C.glGetQueryObjectui64(id, pname); + } + + // --- [ glVertexAttribDivisor ] --- + + /** + * Modifies the rate at which generic vertex attributes advance during instanced rendering. + * + * @param index the index of the generic vertex attribute + * @param divisor the number of instances that will pass between updates of the generic attribute at slot {@code index} + * + * @see Reference Page + */ + public static void glVertexAttribDivisor(@NativeType("GLuint") int index, @NativeType("GLuint") int divisor) { + GL33C.glVertexAttribDivisor(index, divisor); + } + + // --- [ glVertexP2ui ] --- + + /** + * Packed component version of {@link GL11#glVertex2f Vertex2f}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertexP2ui(@NativeType("GLenum") int type, @NativeType("GLuint") int value); + + // --- [ glVertexP3ui ] --- + + /** + * Packed component version of {@link GL11#glVertex3f Vertex3f}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertexP3ui(@NativeType("GLenum") int type, @NativeType("GLuint") int value); + + // --- [ glVertexP4ui ] --- + + /** + * Packed component version of {@link GL11#glVertex4f Vertex4f}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glVertexP4ui(@NativeType("GLenum") int type, @NativeType("GLuint") int value); + + // --- [ glVertexP2uiv ] --- + + /** Unsafe version of: {@link #glVertexP2uiv VertexP2uiv} */ + public static native void nglVertexP2uiv(int type, long value); + + /** + * Pointer version of {@link #glVertexP2ui VertexP2ui}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertexP2uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglVertexP2uiv(type, memAddress(value)); + } + + // --- [ glVertexP3uiv ] --- + + /** Unsafe version of: {@link #glVertexP3uiv VertexP3uiv} */ + public static native void nglVertexP3uiv(int type, long value); + + /** + * Pointer version of {@link #glVertexP3ui VertexP3ui}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertexP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglVertexP3uiv(type, memAddress(value)); + } + + // --- [ glVertexP4uiv ] --- + + /** Unsafe version of: {@link #glVertexP4uiv VertexP4uiv} */ + public static native void nglVertexP4uiv(int type, long value); + + /** + * Pointer version of {@link #glVertexP4ui VertexP4ui}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param value the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertexP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglVertexP4uiv(type, memAddress(value)); + } + + // --- [ glTexCoordP1ui ] --- + + /** + * Packed component version of {@link GL11#glTexCoord1f TexCoord1f}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoordP1ui(@NativeType("GLenum") int type, @NativeType("GLuint") int coords); + + // --- [ glTexCoordP2ui ] --- + + /** + * Packed component version of {@link GL11#glTexCoord2f TexCoord2f}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoordP2ui(@NativeType("GLenum") int type, @NativeType("GLuint") int coords); + + // --- [ glTexCoordP3ui ] --- + + /** + * Packed component version of {@link GL11#glTexCoord3f TexCoord3f}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoordP3ui(@NativeType("GLenum") int type, @NativeType("GLuint") int coords); + + // --- [ glTexCoordP4ui ] --- + + /** + * Packed component version of {@link GL11#glTexCoord4f TexCoord4f}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glTexCoordP4ui(@NativeType("GLenum") int type, @NativeType("GLuint") int coords); + + // --- [ glTexCoordP1uiv ] --- + + /** Unsafe version of: {@link #glTexCoordP1uiv TexCoordP1uiv} */ + public static native void nglTexCoordP1uiv(int type, long coords); + + /** + * Pointer version of {@link #glTexCoordP1ui TexCoordP1ui}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordP1uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 1); + } + nglTexCoordP1uiv(type, memAddress(coords)); + } + + // --- [ glTexCoordP2uiv ] --- + + /** Unsafe version of: {@link #glTexCoordP2uiv TexCoordP2uiv} */ + public static native void nglTexCoordP2uiv(int type, long coords); + + /** + * Pointer version of {@link #glTexCoordP2ui TexCoordP2ui}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordP2uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 1); + } + nglTexCoordP2uiv(type, memAddress(coords)); + } + + // --- [ glTexCoordP3uiv ] --- + + /** Unsafe version of: {@link #glTexCoordP3uiv TexCoordP3uiv} */ + public static native void nglTexCoordP3uiv(int type, long coords); + + /** + * Pointer version of {@link #glTexCoordP3ui TexCoordP3ui}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 1); + } + nglTexCoordP3uiv(type, memAddress(coords)); + } + + // --- [ glTexCoordP4uiv ] --- + + /** Unsafe version of: {@link #glTexCoordP4uiv TexCoordP4uiv} */ + public static native void nglTexCoordP4uiv(int type, long coords); + + /** + * Pointer version of {@link #glTexCoordP4ui TexCoordP4ui}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 1); + } + nglTexCoordP4uiv(type, memAddress(coords)); + } + + // --- [ glMultiTexCoordP1ui ] --- + + /** + * Packed component version of {@link GL13#glMultiTexCoord1f MultiTexCoord1f}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    typeofpackingusedonthedata
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoordP1ui(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint") int coords); + + // --- [ glMultiTexCoordP2ui ] --- + + /** + * Packed component version of {@link GL13#glMultiTexCoord2f MultiTexCoord2f}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    typeofpackingusedonthedata
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoordP2ui(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint") int coords); + + // --- [ glMultiTexCoordP3ui ] --- + + /** + * Packed component version of {@link GL13#glMultiTexCoord3f MultiTexCoord3f}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    typeofpackingusedonthedata
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoordP3ui(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint") int coords); + + // --- [ glMultiTexCoordP4ui ] --- + + /** + * Packed component version of {@link GL13#glMultiTexCoord4f MultiTexCoord4f}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    typeofpackingusedonthedata
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glMultiTexCoordP4ui(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint") int coords); + + // --- [ glMultiTexCoordP1uiv ] --- + + /** Unsafe version of: {@link #glMultiTexCoordP1uiv MultiTexCoordP1uiv} */ + public static native void nglMultiTexCoordP1uiv(int texture, int type, long coords); + + /** + * Pointer version of {@link #glMultiTexCoordP1ui MultiTexCoordP1ui}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoordP1uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 1); + } + nglMultiTexCoordP1uiv(texture, type, memAddress(coords)); + } + + // --- [ glMultiTexCoordP2uiv ] --- + + /** Unsafe version of: {@link #glMultiTexCoordP2uiv MultiTexCoordP2uiv} */ + public static native void nglMultiTexCoordP2uiv(int texture, int type, long coords); + + /** + * Pointer version of {@link #glMultiTexCoordP2ui MultiTexCoordP2ui}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoordP2uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 1); + } + nglMultiTexCoordP2uiv(texture, type, memAddress(coords)); + } + + // --- [ glMultiTexCoordP3uiv ] --- + + /** Unsafe version of: {@link #glMultiTexCoordP3uiv MultiTexCoordP3uiv} */ + public static native void nglMultiTexCoordP3uiv(int texture, int type, long coords); + + /** + * Pointer version of {@link #glMultiTexCoordP3ui MultiTexCoordP3ui}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoordP3uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 1); + } + nglMultiTexCoordP3uiv(texture, type, memAddress(coords)); + } + + // --- [ glMultiTexCoordP4uiv ] --- + + /** Unsafe version of: {@link #glMultiTexCoordP4uiv MultiTexCoordP4uiv} */ + public static native void nglMultiTexCoordP4uiv(int texture, int type, long coords); + + /** + * Pointer version of {@link #glMultiTexCoordP4ui MultiTexCoordP4ui}. + * + * @param texture the coordinate set to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoordP4uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 1); + } + nglMultiTexCoordP4uiv(texture, type, memAddress(coords)); + } + + // --- [ glNormalP3ui ] --- + + /** + * Packed component version of {@link GL11#glNormal3f Normal3f}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glNormalP3ui(@NativeType("GLenum") int type, @NativeType("GLuint") int coords); + + // --- [ glNormalP3uiv ] --- + + /** Unsafe version of: {@link #glNormalP3uiv NormalP3uiv} */ + public static native void nglNormalP3uiv(int type, long coords); + + /** + * Pointer version {@link #glNormalP3ui NormalP3ui}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param coords the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormalP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer coords) { + if (CHECKS) { + check(coords, 1); + } + nglNormalP3uiv(type, memAddress(coords)); + } + + // --- [ glColorP3ui ] --- + + /** + * Packed component version of {@link GL11#glColor3f Color3f}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColorP3ui(@NativeType("GLenum") int type, @NativeType("GLuint") int color); + + // --- [ glColorP4ui ] --- + + /** + * Packed component version of {@link GL11#glColor4f Color4f}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glColorP4ui(@NativeType("GLenum") int type, @NativeType("GLuint") int color); + + // --- [ glColorP3uiv ] --- + + /** Unsafe version of: {@link #glColorP3uiv ColorP3uiv} */ + public static native void nglColorP3uiv(int type, long color); + + /** + * Pointer version of {@link #glColorP3ui ColorP3ui}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColorP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer color) { + if (CHECKS) { + check(color, 1); + } + nglColorP3uiv(type, memAddress(color)); + } + + // --- [ glColorP4uiv ] --- + + /** Unsafe version of: {@link #glColorP4uiv ColorP4uiv} */ + public static native void nglColorP4uiv(int type, long color); + + /** + * Pointer version of {@link #glColorP4ui ColorP4ui}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColorP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer color) { + if (CHECKS) { + check(color, 1); + } + nglColorP4uiv(type, memAddress(color)); + } + + // --- [ glSecondaryColorP3ui ] --- + + /** + * Packed component version of {@link GL14#glSecondaryColor3f SecondaryColor3f}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static native void glSecondaryColorP3ui(@NativeType("GLenum") int type, @NativeType("GLuint") int color); + + // --- [ glSecondaryColorP3uiv ] --- + + /** Unsafe version of: {@link #glSecondaryColorP3uiv SecondaryColorP3uiv} */ + public static native void nglSecondaryColorP3uiv(int type, long color); + + /** + * Pointer version of {@link #glSecondaryColorP3ui SecondaryColorP3ui}. + * + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param color the packed value + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColorP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") IntBuffer color) { + if (CHECKS) { + check(color, 1); + } + nglSecondaryColorP3uiv(type, memAddress(color)); + } + + // --- [ glVertexAttribP1ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib1f VertexAttrib1f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP1ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value) { + GL33C.glVertexAttribP1ui(index, type, normalized, value); + } + + // --- [ glVertexAttribP2ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib2f VertexAttrib2f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP2ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value) { + GL33C.glVertexAttribP2ui(index, type, normalized, value); + } + + // --- [ glVertexAttribP3ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib3f VertexAttrib3f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP3ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value) { + GL33C.glVertexAttribP3ui(index, type, normalized, value); + } + + // --- [ glVertexAttribP4ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP4ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value) { + GL33C.glVertexAttribP4ui(index, type, normalized, value); + } + + // --- [ glVertexAttribP1uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP1uiv VertexAttribP1uiv} */ + public static void nglVertexAttribP1uiv(int index, int type, boolean normalized, long value) { + GL33C.nglVertexAttribP1uiv(index, type, normalized, value); + } + + /** + * Pointer version of {@link #glVertexAttribP1ui VertexAttribP1ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP1uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + GL33C.glVertexAttribP1uiv(index, type, normalized, value); + } + + // --- [ glVertexAttribP2uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP2uiv VertexAttribP2uiv} */ + public static void nglVertexAttribP2uiv(int index, int type, boolean normalized, long value) { + GL33C.nglVertexAttribP2uiv(index, type, normalized, value); + } + + /** + * Pointer version of {@link #glVertexAttribP2ui VertexAttribP2ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP2uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + GL33C.glVertexAttribP2uiv(index, type, normalized, value); + } + + // --- [ glVertexAttribP3uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP3uiv VertexAttribP3uiv} */ + public static void nglVertexAttribP3uiv(int index, int type, boolean normalized, long value) { + GL33C.nglVertexAttribP3uiv(index, type, normalized, value); + } + + /** + * Pointer version of {@link #glVertexAttribP3ui VertexAttribP3ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP3uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + GL33C.glVertexAttribP3uiv(index, type, normalized, value); + } + + // --- [ glVertexAttribP4uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP4uiv VertexAttribP4uiv} */ + public static void nglVertexAttribP4uiv(int index, int type, boolean normalized, long value) { + GL33C.nglVertexAttribP4uiv(index, type, normalized, value); + } + + /** + * Pointer version of {@link #glVertexAttribP4ui VertexAttribP4ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link GL33C#GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP4uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + GL33C.glVertexAttribP4uiv(index, type, normalized, value); + } + + /** + * Array version of: {@link #glGenSamplers GenSamplers} + * + * @see Reference Page + */ + public static void glGenSamplers(@NativeType("GLuint *") int[] samplers) { + GL33C.glGenSamplers(samplers); + } + + /** + * Array version of: {@link #glDeleteSamplers DeleteSamplers} + * + * @see Reference Page + */ + public static void glDeleteSamplers(@NativeType("GLuint const *") int[] samplers) { + GL33C.glDeleteSamplers(samplers); + } + + /** + * Array version of: {@link #glSamplerParameteriv SamplerParameteriv} + * + * @see Reference Page + */ + public static void glSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + GL33C.glSamplerParameteriv(sampler, pname, params); + } + + /** + * Array version of: {@link #glSamplerParameterfv SamplerParameterfv} + * + * @see Reference Page + */ + public static void glSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + GL33C.glSamplerParameterfv(sampler, pname, params); + } + + /** + * Array version of: {@link #glSamplerParameterIiv SamplerParameterIiv} + * + * @see Reference Page + */ + public static void glSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + GL33C.glSamplerParameterIiv(sampler, pname, params); + } + + /** + * Array version of: {@link #glSamplerParameterIuiv SamplerParameterIuiv} + * + * @see Reference Page + */ + public static void glSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int[] params) { + GL33C.glSamplerParameterIuiv(sampler, pname, params); + } + + /** + * Array version of: {@link #glGetSamplerParameteriv GetSamplerParameteriv} + * + * @see Reference Page + */ + public static void glGetSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL33C.glGetSamplerParameteriv(sampler, pname, params); + } + + /** + * Array version of: {@link #glGetSamplerParameterfv GetSamplerParameterfv} + * + * @see Reference Page + */ + public static void glGetSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + GL33C.glGetSamplerParameterfv(sampler, pname, params); + } + + /** + * Array version of: {@link #glGetSamplerParameterIiv GetSamplerParameterIiv} + * + * @see Reference Page + */ + public static void glGetSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL33C.glGetSamplerParameterIiv(sampler, pname, params); + } + + /** + * Array version of: {@link #glGetSamplerParameterIuiv GetSamplerParameterIuiv} + * + * @see Reference Page + */ + public static void glGetSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + GL33C.glGetSamplerParameterIuiv(sampler, pname, params); + } + + /** + * Array version of: {@link #glGetQueryObjecti64v GetQueryObjecti64v} + * + * @see Reference Page + */ + public static void glGetQueryObjecti64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + GL33C.glGetQueryObjecti64v(id, pname, params); + } + + /** + * Array version of: {@link #glGetQueryObjectui64v GetQueryObjectui64v} + * + * @see Reference Page + */ + public static void glGetQueryObjectui64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") long[] params) { + GL33C.glGetQueryObjectui64v(id, pname, params); + } + + /** + * Array version of: {@link #glVertexP2uiv VertexP2uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertexP2uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glVertexP2uiv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(type, value, __functionAddress); + } + + /** + * Array version of: {@link #glVertexP3uiv VertexP3uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertexP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glVertexP3uiv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(type, value, __functionAddress); + } + + /** + * Array version of: {@link #glVertexP4uiv VertexP4uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glVertexP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glVertexP4uiv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(type, value, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoordP1uiv TexCoordP1uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordP1uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + long __functionAddress = GL.getICD().glTexCoordP1uiv; + if (CHECKS) { + check(__functionAddress); + check(coords, 1); + } + callPV(type, coords, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoordP2uiv TexCoordP2uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordP2uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + long __functionAddress = GL.getICD().glTexCoordP2uiv; + if (CHECKS) { + check(__functionAddress); + check(coords, 1); + } + callPV(type, coords, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoordP3uiv TexCoordP3uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + long __functionAddress = GL.getICD().glTexCoordP3uiv; + if (CHECKS) { + check(__functionAddress); + check(coords, 1); + } + callPV(type, coords, __functionAddress); + } + + /** + * Array version of: {@link #glTexCoordP4uiv TexCoordP4uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glTexCoordP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + long __functionAddress = GL.getICD().glTexCoordP4uiv; + if (CHECKS) { + check(__functionAddress); + check(coords, 1); + } + callPV(type, coords, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoordP1uiv MultiTexCoordP1uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoordP1uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + long __functionAddress = GL.getICD().glMultiTexCoordP1uiv; + if (CHECKS) { + check(__functionAddress); + check(coords, 1); + } + callPV(texture, type, coords, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoordP2uiv MultiTexCoordP2uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoordP2uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + long __functionAddress = GL.getICD().glMultiTexCoordP2uiv; + if (CHECKS) { + check(__functionAddress); + check(coords, 1); + } + callPV(texture, type, coords, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoordP3uiv MultiTexCoordP3uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoordP3uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + long __functionAddress = GL.getICD().glMultiTexCoordP3uiv; + if (CHECKS) { + check(__functionAddress); + check(coords, 1); + } + callPV(texture, type, coords, __functionAddress); + } + + /** + * Array version of: {@link #glMultiTexCoordP4uiv MultiTexCoordP4uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glMultiTexCoordP4uiv(@NativeType("GLenum") int texture, @NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + long __functionAddress = GL.getICD().glMultiTexCoordP4uiv; + if (CHECKS) { + check(__functionAddress); + check(coords, 1); + } + callPV(texture, type, coords, __functionAddress); + } + + /** + * Array version of: {@link #glNormalP3uiv NormalP3uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glNormalP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] coords) { + long __functionAddress = GL.getICD().glNormalP3uiv; + if (CHECKS) { + check(__functionAddress); + check(coords, 1); + } + callPV(type, coords, __functionAddress); + } + + /** + * Array version of: {@link #glColorP3uiv ColorP3uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColorP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] color) { + long __functionAddress = GL.getICD().glColorP3uiv; + if (CHECKS) { + check(__functionAddress); + check(color, 1); + } + callPV(type, color, __functionAddress); + } + + /** + * Array version of: {@link #glColorP4uiv ColorP4uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glColorP4uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] color) { + long __functionAddress = GL.getICD().glColorP4uiv; + if (CHECKS) { + check(__functionAddress); + check(color, 1); + } + callPV(type, color, __functionAddress); + } + + /** + * Array version of: {@link #glSecondaryColorP3uiv SecondaryColorP3uiv} + * + * @see Reference Page - This function is deprecated and unavailable in the Core profile + */ + public static void glSecondaryColorP3uiv(@NativeType("GLenum") int type, @NativeType("GLuint const *") int[] color) { + long __functionAddress = GL.getICD().glSecondaryColorP3uiv; + if (CHECKS) { + check(__functionAddress); + check(color, 1); + } + callPV(type, color, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribP1uiv VertexAttribP1uiv} + * + * @see Reference Page + */ + public static void glVertexAttribP1uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + GL33C.glVertexAttribP1uiv(index, type, normalized, value); + } + + /** + * Array version of: {@link #glVertexAttribP2uiv VertexAttribP2uiv} + * + * @see Reference Page + */ + public static void glVertexAttribP2uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + GL33C.glVertexAttribP2uiv(index, type, normalized, value); + } + + /** + * Array version of: {@link #glVertexAttribP3uiv VertexAttribP3uiv} + * + * @see Reference Page + */ + public static void glVertexAttribP3uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + GL33C.glVertexAttribP3uiv(index, type, normalized, value); + } + + /** + * Array version of: {@link #glVertexAttribP4uiv VertexAttribP4uiv} + * + * @see Reference Page + */ + public static void glVertexAttribP4uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + GL33C.glVertexAttribP4uiv(index, type, normalized, value); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL33C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL33C.java new file mode 100644 index 000000000..90b603946 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL33C.java @@ -0,0 +1,1049 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 3.3. Includes only Core Profile symbols. + * + *

    OpenGL 3.3 implementations support revision 3.30 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL33C extends GL32C { + + static { GL.initialize(); } + + /** + * Accepted by the {@code src} and {@code dst} parameters of BlendFunc and BlendFunci, and by the {@code srcRGB}, {@code dstRGB}, {@code srcAlpha} and + * {@code dstAlpha} parameters of BlendFuncSeparate and BlendFuncSeparatei. + */ + public static final int + GL_SRC1_COLOR = 0x88F9, + GL_ONE_MINUS_SRC1_COLOR = 0x88FA, + GL_ONE_MINUS_SRC1_ALPHA = 0x88FB; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv and GetDoublev. */ + public static final int GL_MAX_DUAL_SOURCE_DRAW_BUFFERS = 0x88FC; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int GL_ANY_SAMPLES_PASSED = 0x8C2F; + + /** Accepted by the {@code value} parameter of the GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv and GetDoublev functions. */ + public static final int GL_SAMPLER_BINDING = 0x8919; + + /** + * Accepted by the {@code internalFormat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, RenderbufferStorage and + * RenderbufferStorageMultisample. + */ + public static final int GL_RGB10_A2UI = 0x906F; + + /** Accepted by the {@code pname} parameters of TexParameteri, TexParameterf, TexParameteriv, TexParameterfv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int + GL_TEXTURE_SWIZZLE_R = 0x8E42, + GL_TEXTURE_SWIZZLE_G = 0x8E43, + GL_TEXTURE_SWIZZLE_B = 0x8E44, + GL_TEXTURE_SWIZZLE_A = 0x8E45; + + /** Accepted by the {@code pname} parameters of TexParameteriv, TexParameterfv, GetTexParameterfv, and GetTexParameteriv. */ + public static final int GL_TEXTURE_SWIZZLE_RGBA = 0x8E46; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int GL_TIME_ELAPSED = 0x88BF; + + /** + * Accepted by the {@code target} parameter of GetQueryiv and QueryCounter. Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev. + */ + public static final int GL_TIMESTAMP = 0x8E28; + + /** Accepted by the {@code pname} parameters of GetVertexAttribdv, GetVertexAttribfv, and GetVertexAttribiv. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE; + + /** + * Accepted by the {@code type} parameter of VertexAttribPointer, VertexPointer, NormalPointer, ColorPointer, SecondaryColorPointer, TexCoordPointer, + * VertexAttribP{1234}ui, VertexP*, TexCoordP*, MultiTexCoordP*, NormalP3ui, ColorP*, SecondaryColorP* and VertexAttribP*. + */ + public static final int GL_INT_2_10_10_10_REV = 0x8D9F; + + protected GL33C() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindFragDataLocationIndexed ] --- + + /** Unsafe version of: {@link #glBindFragDataLocationIndexed BindFragDataLocationIndexed} */ + public static native void nglBindFragDataLocationIndexed(int program, int colorNumber, int index, long name); + + /** + * Binds a user-defined varying out variable to a fragment shader color number and index. + * + * @param program the name of the program containing varying out variable whose binding to modify + * @param colorNumber the color number to bind the user-defined varying out variable to + * @param index the index of the color input to bind the user-defined varying out variable to + * @param name the name of the user-defined varying out variable whose binding to modify + * + * @see Reference Page + */ + public static void glBindFragDataLocationIndexed(@NativeType("GLuint") int program, @NativeType("GLuint") int colorNumber, @NativeType("GLuint") int index, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + nglBindFragDataLocationIndexed(program, colorNumber, index, memAddress(name)); + } + + /** + * Binds a user-defined varying out variable to a fragment shader color number and index. + * + * @param program the name of the program containing varying out variable whose binding to modify + * @param colorNumber the color number to bind the user-defined varying out variable to + * @param index the index of the color input to bind the user-defined varying out variable to + * @param name the name of the user-defined varying out variable whose binding to modify + * + * @see Reference Page + */ + public static void glBindFragDataLocationIndexed(@NativeType("GLuint") int program, @NativeType("GLuint") int colorNumber, @NativeType("GLuint") int index, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + nglBindFragDataLocationIndexed(program, colorNumber, index, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetFragDataIndex ] --- + + /** Unsafe version of: {@link #glGetFragDataIndex GetFragDataIndex} */ + public static native int nglGetFragDataIndex(int program, long name); + + /** + * Queries the bindings of color indices to user-defined varying out variables. + * + * @param program the name of the program containing varying out variable whose binding to query + * @param name the name of the user-defined varying out variable whose index to query + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetFragDataIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetFragDataIndex(program, memAddress(name)); + } + + /** + * Queries the bindings of color indices to user-defined varying out variables. + * + * @param program the name of the program containing varying out variable whose binding to query + * @param name the name of the user-defined varying out variable whose index to query + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetFragDataIndex(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetFragDataIndex(program, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenSamplers ] --- + + /** + * Unsafe version of: {@link #glGenSamplers GenSamplers} + * + * @param count the number of sampler object names to generate + */ + public static native void nglGenSamplers(int count, long samplers); + + /** + * Generates sampler object names. + * + * @param samplers a buffer in which the generated sampler object names are stored + * + * @see Reference Page + */ + public static void glGenSamplers(@NativeType("GLuint *") IntBuffer samplers) { + nglGenSamplers(samplers.remaining(), memAddress(samplers)); + } + + /** + * Generates sampler object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenSamplers() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer samplers = stack.callocInt(1); + nglGenSamplers(1, memAddress(samplers)); + return samplers.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDeleteSamplers ] --- + + /** + * Unsafe version of: {@link #glDeleteSamplers DeleteSamplers} + * + * @param count the number of sampler objects to be deleted + */ + public static native void nglDeleteSamplers(int count, long samplers); + + /** + * Deletes named sampler objects. + * + * @param samplers an array of sampler objects to be deleted + * + * @see Reference Page + */ + public static void glDeleteSamplers(@NativeType("GLuint const *") IntBuffer samplers) { + nglDeleteSamplers(samplers.remaining(), memAddress(samplers)); + } + + /** + * Deletes named sampler objects. + * + * @see Reference Page + */ + public static void glDeleteSamplers(@NativeType("GLuint const *") int sampler) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer samplers = stack.ints(sampler); + nglDeleteSamplers(1, memAddress(samplers)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsSampler ] --- + + /** + * Determines if a name corresponds to a sampler object. + * + * @param sampler a value that may be the name of a sampler object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsSampler(@NativeType("GLuint") int sampler); + + // --- [ glBindSampler ] --- + + /** + * Binds a named sampler to a texturing target. + * + * @param unit the index of the texture unit to which the sampler is bound + * @param sampler the name of a sampler + * + * @see Reference Page + */ + public static native void glBindSampler(@NativeType("GLuint") int unit, @NativeType("GLuint") int sampler); + + // --- [ glSamplerParameteri ] --- + + /** + * Set the integer value of a sampler parameter. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a single-valued sampler parameter. One of:
    {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}
    {@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    + * @param param the value of {@code pname} + * + * @see Reference Page + */ + public static native void glSamplerParameteri(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glSamplerParameterf ] --- + + /** + * Float version of {@link #glSamplerParameteri SamplerParameteri}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a single-valued sampler parameter + * @param param the value of {@code pname} + * + * @see Reference Page + */ + public static native void glSamplerParameterf(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glSamplerParameteriv ] --- + + /** Unsafe version of: {@link #glSamplerParameteriv SamplerParameteriv} */ + public static native void nglSamplerParameteriv(int sampler, int pname, long params); + + /** + * Pointer version of {@link #glSamplerParameteri SamplerParameteri}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter. One of:
    {@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    + * @param params an array where the value or values of {@code pname} are stored + * + * @see Reference Page + */ + public static void glSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglSamplerParameteriv(sampler, pname, memAddress(params)); + } + + // --- [ glSamplerParameterfv ] --- + + /** Unsafe version of: {@link #glSamplerParameterfv SamplerParameterfv} */ + public static native void nglSamplerParameterfv(int sampler, int pname, long params); + + /** + * Float version of {@link #glSamplerParameteriv SamplerParameteriv}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter + * @param params an array where the value or values of {@code pname} are stored + * + * @see Reference Page + */ + public static void glSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglSamplerParameterfv(sampler, pname, memAddress(params)); + } + + // --- [ glSamplerParameterIiv ] --- + + /** Unsafe version of: {@link #glSamplerParameterIiv SamplerParameterIiv} */ + public static native void nglSamplerParameterIiv(int sampler, int pname, long params); + + /** + * Pure integer version of {@link #glSamplerParameteriv SamplerParameteriv}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter + * @param params an array where the value or values of {@code pname} are stored + * + * @see Reference Page + */ + public static void glSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglSamplerParameterIiv(sampler, pname, memAddress(params)); + } + + // --- [ glSamplerParameterIuiv ] --- + + /** Unsafe version of: {@link #glSamplerParameterIuiv SamplerParameterIuiv} */ + public static native void nglSamplerParameterIuiv(int sampler, int pname, long params); + + /** + * Unsigned pure integer version of {@link #glSamplerParameteriv SamplerParameteriv}. + * + * @param sampler the sampler object whose parameter to modify + * @param pname the symbolic name of a sampler parameter + * @param params an array where the value or values of {@code pname} are stored + * + * @see Reference Page + */ + public static void glSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglSamplerParameterIuiv(sampler, pname, memAddress(params)); + } + + // --- [ glGetSamplerParameteriv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameteriv GetSamplerParameteriv} */ + public static native void nglGetSamplerParameteriv(int sampler, int pname, long params); + + /** + * Return the integer value(s) of a sampler parameter. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter. One of:
    {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}
    {@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    ,{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}
    + * @param params the sampler parameters + * + * @see Reference Page + */ + public static void glGetSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetSamplerParameteriv(sampler, pname, memAddress(params)); + } + + /** + * Return the integer value(s) of a sampler parameter. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter. One of:
    {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}{@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}
    {@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}{@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    ,{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetSamplerParameteri(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetSamplerParameteriv(sampler, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetSamplerParameterfv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameterfv GetSamplerParameterfv} */ + public static native void nglGetSamplerParameterfv(int sampler, int pname, long params); + + /** + * Float version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * @param params the sampler parameters + * + * @see Reference Page + */ + public static void glGetSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetSamplerParameterfv(sampler, pname, memAddress(params)); + } + + /** + * Float version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetSamplerParameterf(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetSamplerParameterfv(sampler, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetSamplerParameterIiv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameterIiv GetSamplerParameterIiv} */ + public static native void nglGetSamplerParameterIiv(int sampler, int pname, long params); + + /** + * Pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * @param params the sampler parameters + * + * @see Reference Page + */ + public static void glGetSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetSamplerParameterIiv(sampler, pname, memAddress(params)); + } + + /** + * Pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetSamplerParameterIi(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetSamplerParameterIiv(sampler, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetSamplerParameterIuiv ] --- + + /** Unsafe version of: {@link #glGetSamplerParameterIuiv GetSamplerParameterIuiv} */ + public static native void nglGetSamplerParameterIuiv(int sampler, int pname, long params); + + /** + * Unsigned pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * @param params the sampler parameters + * + * @see Reference Page + */ + public static void glGetSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetSamplerParameterIuiv(sampler, pname, memAddress(params)); + } + + /** + * Unsigned pure integer version of {@link #glGetSamplerParameteriv GetSamplerParameteriv}. + * + * @param sampler the name of the sampler object from which to retrieve parameters + * @param pname the symbolic name of a sampler parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetSamplerParameterIui(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetSamplerParameterIuiv(sampler, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glQueryCounter ] --- + + /** + * Records the GL time into a query object after all previous commands have reached the GL server but have not yet necessarily executed. + * + * @param id the name of a query object into which to record the GL time + * @param target the counter to query. Must be:
    {@link #GL_TIMESTAMP TIMESTAMP}
    + * + * @see Reference Page + */ + public static native void glQueryCounter(@NativeType("GLuint") int id, @NativeType("GLenum") int target); + + // --- [ glGetQueryObjecti64v ] --- + + /** Unsafe version of: {@link #glGetQueryObjecti64v GetQueryObjecti64v} */ + public static native void nglGetQueryObjecti64v(int id, int pname, long params); + + /** + * Returns the 64bit integer value of query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15#GL_QUERY_RESULT QUERY_RESULT}{@link GL15#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjecti64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetQueryObjecti64v(id, pname, memAddress(params)); + } + + /** + * Returns the 64bit integer value of query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15#GL_QUERY_RESULT QUERY_RESULT}{@link GL15#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjecti64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long params) { + nglGetQueryObjecti64v(id, pname, params); + } + + /** + * Returns the 64bit integer value of query object parameter. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter. One of:
    {@link GL15#GL_QUERY_RESULT QUERY_RESULT}{@link GL15#GL_QUERY_RESULT_AVAILABLE QUERY_RESULT_AVAILABLE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetQueryObjecti64(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetQueryObjecti64v(id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetQueryObjectui64v ] --- + + /** Unsafe version of: {@link #glGetQueryObjectui64v GetQueryObjectui64v} */ + public static native void nglGetQueryObjectui64v(int id, int pname, long params); + + /** + * Unsigned version of {@link #glGetQueryObjecti64v GetQueryObjecti64v}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectui64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetQueryObjectui64v(id, pname, memAddress(params)); + } + + /** + * Unsigned version of {@link #glGetQueryObjecti64v GetQueryObjecti64v}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryObjectui64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") long params) { + nglGetQueryObjectui64v(id, pname, params); + } + + /** + * Unsigned version of {@link #glGetQueryObjecti64v GetQueryObjecti64v}. + * + * @param id the name of a query object + * @param pname the symbolic name of a query object parameter + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetQueryObjectui64(@NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetQueryObjectui64v(id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glVertexAttribDivisor ] --- + + /** + * Modifies the rate at which generic vertex attributes advance during instanced rendering. + * + * @param index the index of the generic vertex attribute + * @param divisor the number of instances that will pass between updates of the generic attribute at slot {@code index} + * + * @see Reference Page + */ + public static native void glVertexAttribDivisor(@NativeType("GLuint") int index, @NativeType("GLuint") int divisor); + + // --- [ glVertexAttribP1ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib1f VertexAttrib1f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static native void glVertexAttribP1ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value); + + // --- [ glVertexAttribP2ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib2f VertexAttrib2f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static native void glVertexAttribP2ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value); + + // --- [ glVertexAttribP3ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib3f VertexAttrib3f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static native void glVertexAttribP3ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value); + + // --- [ glVertexAttribP4ui ] --- + + /** + * Packed component version of {@link GL20C#glVertexAttrib4f VertexAttrib4f}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static native void glVertexAttribP4ui(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int value); + + // --- [ glVertexAttribP1uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP1uiv VertexAttribP1uiv} */ + public static native void nglVertexAttribP1uiv(int index, int type, boolean normalized, long value); + + /** + * Pointer version of {@link #glVertexAttribP1ui VertexAttribP1ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP1uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglVertexAttribP1uiv(index, type, normalized, memAddress(value)); + } + + // --- [ glVertexAttribP2uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP2uiv VertexAttribP2uiv} */ + public static native void nglVertexAttribP2uiv(int index, int type, boolean normalized, long value); + + /** + * Pointer version of {@link #glVertexAttribP2ui VertexAttribP2ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP2uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglVertexAttribP2uiv(index, type, normalized, memAddress(value)); + } + + // --- [ glVertexAttribP3uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP3uiv VertexAttribP3uiv} */ + public static native void nglVertexAttribP3uiv(int index, int type, boolean normalized, long value); + + /** + * Pointer version of {@link #glVertexAttribP3ui VertexAttribP3ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP3uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglVertexAttribP3uiv(index, type, normalized, memAddress(value)); + } + + // --- [ glVertexAttribP4uiv ] --- + + /** Unsafe version of: {@link #glVertexAttribP4uiv VertexAttribP4uiv} */ + public static native void nglVertexAttribP4uiv(int index, int type, boolean normalized, long value); + + /** + * Pointer version of {@link #glVertexAttribP4ui VertexAttribP4ui}. + * + * @param index the index of the generic vertex attribute to be modified + * @param type type of packing used on the data. One of:
    {@link #GL_INT_2_10_10_10_REV INT_2_10_10_10_REV}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param normalized whether values should be normalized or cast directly to floating-point + * @param value the packed value + * + * @see Reference Page + */ + public static void glVertexAttribP4uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglVertexAttribP4uiv(index, type, normalized, memAddress(value)); + } + + /** + * Array version of: {@link #glGenSamplers GenSamplers} + * + * @see Reference Page + */ + public static void glGenSamplers(@NativeType("GLuint *") int[] samplers) { + long __functionAddress = GL.getICD().glGenSamplers; + if (CHECKS) { + check(__functionAddress); + } + callPV(samplers.length, samplers, __functionAddress); + } + + /** + * Array version of: {@link #glDeleteSamplers DeleteSamplers} + * + * @see Reference Page + */ + public static void glDeleteSamplers(@NativeType("GLuint const *") int[] samplers) { + long __functionAddress = GL.getICD().glDeleteSamplers; + if (CHECKS) { + check(__functionAddress); + } + callPV(samplers.length, samplers, __functionAddress); + } + + /** + * Array version of: {@link #glSamplerParameteriv SamplerParameteriv} + * + * @see Reference Page + */ + public static void glSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glSamplerParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(sampler, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glSamplerParameterfv SamplerParameterfv} + * + * @see Reference Page + */ + public static void glSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glSamplerParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(sampler, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glSamplerParameterIiv SamplerParameterIiv} + * + * @see Reference Page + */ + public static void glSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glSamplerParameterIiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(sampler, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glSamplerParameterIuiv SamplerParameterIuiv} + * + * @see Reference Page + */ + public static void glSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int[] params) { + long __functionAddress = GL.getICD().glSamplerParameterIuiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(sampler, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetSamplerParameteriv GetSamplerParameteriv} + * + * @see Reference Page + */ + public static void glGetSamplerParameteriv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetSamplerParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(sampler, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetSamplerParameterfv GetSamplerParameterfv} + * + * @see Reference Page + */ + public static void glGetSamplerParameterfv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetSamplerParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(sampler, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetSamplerParameterIiv GetSamplerParameterIiv} + * + * @see Reference Page + */ + public static void glGetSamplerParameterIiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetSamplerParameterIiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(sampler, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetSamplerParameterIuiv GetSamplerParameterIuiv} + * + * @see Reference Page + */ + public static void glGetSamplerParameterIuiv(@NativeType("GLuint") int sampler, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetSamplerParameterIuiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(sampler, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetQueryObjecti64v GetQueryObjecti64v} + * + * @see Reference Page + */ + public static void glGetQueryObjecti64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetQueryObjecti64v; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(id, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetQueryObjectui64v GetQueryObjectui64v} + * + * @see Reference Page + */ + public static void glGetQueryObjectui64v(@NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetQueryObjectui64v; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(id, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribP1uiv VertexAttribP1uiv} + * + * @see Reference Page + */ + public static void glVertexAttribP1uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glVertexAttribP1uiv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(index, type, normalized, value, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribP2uiv VertexAttribP2uiv} + * + * @see Reference Page + */ + public static void glVertexAttribP2uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glVertexAttribP2uiv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(index, type, normalized, value, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribP3uiv VertexAttribP3uiv} + * + * @see Reference Page + */ + public static void glVertexAttribP3uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glVertexAttribP3uiv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(index, type, normalized, value, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribP4uiv VertexAttribP4uiv} + * + * @see Reference Page + */ + public static void glVertexAttribP4uiv(@NativeType("GLuint") int index, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glVertexAttribP4uiv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(index, type, normalized, value, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL40.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL40.java new file mode 100644 index 000000000..d57bbc5b3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL40.java @@ -0,0 +1,1705 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 4.0. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 4.0 implementations support revision 4.00 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL40 extends GL33 { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, + * MapBufferRange, FlushMappedBufferRange, GetBufferParameteriv, and CopyBufferSubData. + */ + public static final int GL_DRAW_INDIRECT_BUFFER = 0x8F3F; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int GL_DRAW_INDIRECT_BUFFER_BINDING = 0x8F43; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_GEOMETRY_SHADER_INVOCATIONS = 0x887F; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int + GL_MAX_GEOMETRY_SHADER_INVOCATIONS = 0x8E5A, + GL_MIN_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5B, + GL_MAX_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5C, + GL_FRAGMENT_INTERPOLATION_OFFSET_BITS = 0x8E5D; + + /** Returned in the {@code type} parameter of GetActiveUniform, and GetTransformFeedbackVarying. */ + public static final int + GL_DOUBLE_VEC2 = 0x8FFC, + GL_DOUBLE_VEC3 = 0x8FFD, + GL_DOUBLE_VEC4 = 0x8FFE, + GL_DOUBLE_MAT2 = 0x8F46, + GL_DOUBLE_MAT3 = 0x8F47, + GL_DOUBLE_MAT4 = 0x8F48, + GL_DOUBLE_MAT2x3 = 0x8F49, + GL_DOUBLE_MAT2x4 = 0x8F4A, + GL_DOUBLE_MAT3x2 = 0x8F4B, + GL_DOUBLE_MAT3x4 = 0x8F4C, + GL_DOUBLE_MAT4x2 = 0x8F4D, + GL_DOUBLE_MAT4x3 = 0x8F4E; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_SAMPLE_SHADING = 0x8C36; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int GL_MIN_SAMPLE_SHADING_VALUE = 0x8C37; + + /** Accepted by the {@code pname} parameter of GetProgramStageiv. */ + public static final int + GL_ACTIVE_SUBROUTINES = 0x8DE5, + GL_ACTIVE_SUBROUTINE_UNIFORMS = 0x8DE6, + GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS = 0x8E47, + GL_ACTIVE_SUBROUTINE_MAX_LENGTH = 0x8E48, + GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH = 0x8E49; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int + GL_MAX_SUBROUTINES = 0x8DE7, + GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS = 0x8DE8; + + /** Accepted by the {@code pname} parameter of GetActiveSubroutineUniformiv. */ + public static final int + GL_NUM_COMPATIBLE_SUBROUTINES = 0x8E4A, + GL_COMPATIBLE_SUBROUTINES = 0x8E4B; + + /** Accepted by the {@code mode} parameter of Begin and all vertex array functions that implicitly call Begin. */ + public static final int GL_PATCHES = 0xE; + + /** Accepted by the {@code pname} parameter of PatchParameteri, GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v. */ + public static final int GL_PATCH_VERTICES = 0x8E72; + + /** Accepted by the {@code pname} parameter of PatchParameterfv, GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv, and GetInteger64v. */ + public static final int + GL_PATCH_DEFAULT_INNER_LEVEL = 0x8E73, + GL_PATCH_DEFAULT_OUTER_LEVEL = 0x8E74; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int + GL_TESS_CONTROL_OUTPUT_VERTICES = 0x8E75, + GL_TESS_GEN_MODE = 0x8E76, + GL_TESS_GEN_SPACING = 0x8E77, + GL_TESS_GEN_VERTEX_ORDER = 0x8E78, + GL_TESS_GEN_POINT_MODE = 0x8E79; + + /** Returned by GetProgramiv when {@code pname} is TESS_GEN_MODE. */ + public static final int GL_ISOLINES = 0x8E7A; + + /** Returned by GetProgramiv when {@code pname} is TESS_GEN_SPACING. */ + public static final int + GL_FRACTIONAL_ODD = 0x8E7B, + GL_FRACTIONAL_EVEN = 0x8E7C; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v. */ + public static final int + GL_MAX_PATCH_VERTICES = 0x8E7D, + GL_MAX_TESS_GEN_LEVEL = 0x8E7E, + GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E7F, + GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E80, + GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS = 0x8E81, + GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS = 0x8E82, + GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS = 0x8E83, + GL_MAX_TESS_PATCH_COMPONENTS = 0x8E84, + GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS = 0x8E85, + GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS = 0x8E86, + GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS = 0x8E89, + GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS = 0x8E8A, + GL_MAX_TESS_CONTROL_INPUT_COMPONENTS = 0x886C, + GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS = 0x886D, + GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E1E, + GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E1F; + + /** Accepted by the {@code pname} parameter of GetActiveUniformBlockiv. */ + public static final int + GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER = 0x84F0, + GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x84F1; + + /** Accepted by the {@code type} parameter of CreateShader and returned by the {@code params} parameter of GetShaderiv. */ + public static final int + GL_TESS_EVALUATION_SHADER = 0x8E87, + GL_TESS_CONTROL_SHADER = 0x8E88; + + /** Accepted by the {@code target} parameter of TexParameteri, TexParameteriv, TexParameterf, TexParameterfv, BindTexture, and GenerateMipmap. */ + public static final int GL_TEXTURE_CUBE_MAP_ARRAY = 0x9009; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv and GetFloatv. */ + public static final int GL_TEXTURE_BINDING_CUBE_MAP_ARRAY = 0x900A; + + /** Accepted by the {@code target} parameter of TexImage3D, TexSubImage3D, CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D. */ + public static final int GL_PROXY_TEXTURE_CUBE_MAP_ARRAY = 0x900B; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_CUBE_MAP_ARRAY = 0x900C, + GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW = 0x900D, + GL_INT_SAMPLER_CUBE_MAP_ARRAY = 0x900E, + GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY = 0x900F; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET = 0x8E5E, + GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET = 0x8E5F; + + /** Accepted by the {@code target} parameter of BindTransformFeedback. */ + public static final int GL_TRANSFORM_FEEDBACK = 0x8E22; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED = 0x8E23, + GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE = 0x8E24, + GL_TRANSFORM_FEEDBACK_BINDING = 0x8E25; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_MAX_TRANSFORM_FEEDBACK_BUFFERS = 0x8E70, + GL_MAX_VERTEX_STREAMS = 0x8E71; + + protected GL40() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendEquationi ] --- + + /** + * Specifies the equation used for both the RGB blend equation and the Alpha blend equation for the specified draw buffer. + * + * @param buf the index of the draw buffer for which to set the blend equation + * @param mode how source and destination colors are combined. One of:
    {@link GL14#GL_FUNC_ADD FUNC_ADD}{@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14#GL_MIN MIN}{@link GL14#GL_MAX MAX}
    + * + * @see Reference Page + */ + public static void glBlendEquationi(@NativeType("GLuint") int buf, @NativeType("GLenum") int mode) { + GL40C.glBlendEquationi(buf, mode); + } + + // --- [ glBlendEquationSeparatei ] --- + + /** + * Sets the RGB blend equation and the alpha blend equation separately for the specified draw buffer. + * + * @param buf the index of the draw buffer for which to set the blend equations + * @param modeRGB the RGB blend equation, how the red, green, and blue components of the source and destination colors are combined. One of:
    {@link GL14#GL_FUNC_ADD FUNC_ADD}{@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14#GL_MIN MIN}{@link GL14#GL_MAX MAX}
    + * @param modeAlpha the alpha blend equation, how the alpha component of the source and destination colors are combined. One of:
    {@link GL14#GL_FUNC_ADD FUNC_ADD}{@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14#GL_MIN MIN}{@link GL14#GL_MAX MAX}
    + * + * @see Reference Page + */ + public static void glBlendEquationSeparatei(@NativeType("GLuint") int buf, @NativeType("GLenum") int modeRGB, @NativeType("GLenum") int modeAlpha) { + GL40C.glBlendEquationSeparatei(buf, modeRGB, modeAlpha); + } + + // --- [ glBlendFunci ] --- + + /** + * Specifies pixel arithmetic for the specified draw buffer. + * + * @param buf the index of the draw buffer for which to set the blend function + * @param sfactor how the red, green, blue, and alpha source blending factors are computed + * @param dfactor how the red, green, blue, and alpha destination blending factors are computed + * + * @see Reference Page + */ + public static void glBlendFunci(@NativeType("GLuint") int buf, @NativeType("GLenum") int sfactor, @NativeType("GLenum") int dfactor) { + GL40C.glBlendFunci(buf, sfactor, dfactor); + } + + // --- [ glBlendFuncSeparatei ] --- + + /** + * Specifies pixel arithmetic for RGB and alpha components separately for the specified draw buffer. + * + * @param buf the index of the draw buffer for which to set the blend functions + * @param srcRGB how the red, green, and blue blending factors are computed + * @param dstRGB how the red, green, and blue destination blending factors are computed + * @param srcAlpha how the alpha source blending factor is computed + * @param dstAlpha how the alpha destination blending factor is computed + * + * @see Reference Page + */ + public static void glBlendFuncSeparatei(@NativeType("GLuint") int buf, @NativeType("GLenum") int srcRGB, @NativeType("GLenum") int dstRGB, @NativeType("GLenum") int srcAlpha, @NativeType("GLenum") int dstAlpha) { + GL40C.glBlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); + } + + // --- [ glDrawArraysIndirect ] --- + + /** Unsafe version of: {@link #glDrawArraysIndirect DrawArraysIndirect} */ + public static void nglDrawArraysIndirect(int mode, long indirect) { + GL40C.nglDrawArraysIndirect(mode, indirect); + } + + /** + * Renders primitives from array data, taking parameters from memory. + * + *

    {@code glDrawArraysIndirect} behaves similarly to {@link GL42C#glDrawArraysInstancedBaseInstance DrawArraysInstancedBaseInstance}, except that the parameters to + * glDrawArraysInstancedBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance; // must be 0 unless OpenGL 4.2 is supported
    +     * } DrawArraysIndirectCommand;
    +     * 
    +     * const DrawArraysIndirectCommand *cmd = (const DrawArraysIndirectCommand *)indirect;
    +     * glDrawArraysInstancedBaseInstance(mode, cmd->first, cmd->count, cmd->primCount, cmd->baseInstance);
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indirect) { + GL40C.glDrawArraysIndirect(mode, indirect); + } + + /** + * Renders primitives from array data, taking parameters from memory. + * + *

    {@code glDrawArraysIndirect} behaves similarly to {@link GL42C#glDrawArraysInstancedBaseInstance DrawArraysInstancedBaseInstance}, except that the parameters to + * glDrawArraysInstancedBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance; // must be 0 unless OpenGL 4.2 is supported
    +     * } DrawArraysIndirectCommand;
    +     * 
    +     * const DrawArraysIndirectCommand *cmd = (const DrawArraysIndirectCommand *)indirect;
    +     * glDrawArraysInstancedBaseInstance(mode, cmd->first, cmd->count, cmd->primCount, cmd->baseInstance);
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") long indirect) { + GL40C.glDrawArraysIndirect(mode, indirect); + } + + /** + * Renders primitives from array data, taking parameters from memory. + * + *

    {@code glDrawArraysIndirect} behaves similarly to {@link GL42C#glDrawArraysInstancedBaseInstance DrawArraysInstancedBaseInstance}, except that the parameters to + * glDrawArraysInstancedBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance; // must be 0 unless OpenGL 4.2 is supported
    +     * } DrawArraysIndirectCommand;
    +     * 
    +     * const DrawArraysIndirectCommand *cmd = (const DrawArraysIndirectCommand *)indirect;
    +     * glDrawArraysInstancedBaseInstance(mode, cmd->first, cmd->count, cmd->primCount, cmd->baseInstance);
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indirect) { + GL40C.glDrawArraysIndirect(mode, indirect); + } + + // --- [ glDrawElementsIndirect ] --- + + /** Unsafe version of: {@link #glDrawElementsIndirect DrawElementsIndirect} */ + public static void nglDrawElementsIndirect(int mode, int type, long indirect) { + GL40C.nglDrawElementsIndirect(mode, type, indirect); + } + + /** + * Renders indexed primitives from array data, taking parameters from memory. + * + *

    {@code glDrawElementsIndirect} behaves similarly to {@link GL42C#glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance}, execpt that the parameters to + * glDrawElementsInstancedBaseVertexBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    {@code glDrawElementsIndirect} is equivalent to:

    + * + *
    
    +     * void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect) {
    +     *     const DrawElementsIndirectCommand *cmd  = (const DrawElementsIndirectCommand *)indirect;
    +     *     glDrawElementsInstancedBaseVertexBaseInstance(
    +     *         mode,
    +     *         cmd->count,
    +     *         type,
    +     *         cmd->firstIndex + size-of-type,
    +     *         cmd->primCount,
    +     *         cmd->baseVertex,
    +     *         cmd->baseInstance
    +     *     );
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the {@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER} binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect the address of a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indirect) { + GL40C.glDrawElementsIndirect(mode, type, indirect); + } + + /** + * Renders indexed primitives from array data, taking parameters from memory. + * + *

    {@code glDrawElementsIndirect} behaves similarly to {@link GL42C#glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance}, execpt that the parameters to + * glDrawElementsInstancedBaseVertexBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    {@code glDrawElementsIndirect} is equivalent to:

    + * + *
    
    +     * void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect) {
    +     *     const DrawElementsIndirectCommand *cmd  = (const DrawElementsIndirectCommand *)indirect;
    +     *     glDrawElementsInstancedBaseVertexBaseInstance(
    +     *         mode,
    +     *         cmd->count,
    +     *         type,
    +     *         cmd->firstIndex + size-of-type,
    +     *         cmd->primCount,
    +     *         cmd->baseVertex,
    +     *         cmd->baseInstance
    +     *     );
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the {@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER} binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect the address of a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") long indirect) { + GL40C.glDrawElementsIndirect(mode, type, indirect); + } + + /** + * Renders indexed primitives from array data, taking parameters from memory. + * + *

    {@code glDrawElementsIndirect} behaves similarly to {@link GL42C#glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance}, execpt that the parameters to + * glDrawElementsInstancedBaseVertexBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    {@code glDrawElementsIndirect} is equivalent to:

    + * + *
    
    +     * void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect) {
    +     *     const DrawElementsIndirectCommand *cmd  = (const DrawElementsIndirectCommand *)indirect;
    +     *     glDrawElementsInstancedBaseVertexBaseInstance(
    +     *         mode,
    +     *         cmd->count,
    +     *         type,
    +     *         cmd->firstIndex + size-of-type,
    +     *         cmd->primCount,
    +     *         cmd->baseVertex,
    +     *         cmd->baseInstance
    +     *     );
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the {@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER} binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect the address of a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer indirect) { + GL40C.glDrawElementsIndirect(mode, type, indirect); + } + + // --- [ glUniform1d ] --- + + /** + * Specifies the value of a double uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * + * @see Reference Page + */ + public static void glUniform1d(@NativeType("GLint") int location, @NativeType("GLdouble") double x) { + GL40C.glUniform1d(location, x); + } + + // --- [ glUniform2d ] --- + + /** + * Specifies the value of a dvec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * + * @see Reference Page + */ + public static void glUniform2d(@NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y) { + GL40C.glUniform2d(location, x, y); + } + + // --- [ glUniform3d ] --- + + /** + * Specifies the value of a dvec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * + * @see Reference Page + */ + public static void glUniform3d(@NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z) { + GL40C.glUniform3d(location, x, y, z); + } + + // --- [ glUniform4d ] --- + + /** + * Specifies the value of a dvec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + * + * @see Reference Page + */ + public static void glUniform4d(@NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w) { + GL40C.glUniform4d(location, x, y, z, w); + } + + // --- [ glUniform1dv ] --- + + /** + * Unsafe version of: {@link #glUniform1dv Uniform1dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform1dv(int location, int count, long value) { + GL40C.nglUniform1dv(location, count, value); + } + + /** + * Specifies the value of a single double uniform variable or a double uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform1dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniform1dv(location, value); + } + + // --- [ glUniform2dv ] --- + + /** + * Unsafe version of: {@link #glUniform2dv Uniform2dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform2dv(int location, int count, long value) { + GL40C.nglUniform2dv(location, count, value); + } + + /** + * Specifies the value of a single dvec2 uniform variable or a dvec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform2dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniform2dv(location, value); + } + + // --- [ glUniform3dv ] --- + + /** + * Unsafe version of: {@link #glUniform3dv Uniform3dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform3dv(int location, int count, long value) { + GL40C.nglUniform3dv(location, count, value); + } + + /** + * Specifies the value of a single dvec3 uniform variable or a dvec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform3dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniform3dv(location, value); + } + + // --- [ glUniform4dv ] --- + + /** + * Unsafe version of: {@link #glUniform4dv Uniform4dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglUniform4dv(int location, int count, long value) { + GL40C.nglUniform4dv(location, count, value); + } + + /** + * Specifies the value of a single dvec4 uniform variable or a dvec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform4dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniform4dv(location, value); + } + + // --- [ glUniformMatrix2dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2dv UniformMatrix2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix2dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix2dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2 uniform variable or a dmat2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix2dv(location, transpose, value); + } + + // --- [ glUniformMatrix3dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3dv UniformMatrix3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix3dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix3dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3 uniform variable or a dmat3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix3dv(location, transpose, value); + } + + // --- [ glUniformMatrix4dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4dv UniformMatrix4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix4dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix4dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4 uniform variable or a dmat4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix4dv(location, transpose, value); + } + + // --- [ glUniformMatrix2x3dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2x3dv UniformMatrix2x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix2x3dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix2x3dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2x3 uniform variable or a dmat2x3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix2x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix2x3dv(location, transpose, value); + } + + // --- [ glUniformMatrix2x4dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2x4dv UniformMatrix2x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix2x4dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix2x4dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2x4 uniform variable or a dmat2x4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix2x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix2x4dv(location, transpose, value); + } + + // --- [ glUniformMatrix3x2dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3x2dv UniformMatrix3x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix3x2dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix3x2dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3x2 uniform variable or a dmat3x2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix3x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix3x2dv(location, transpose, value); + } + + // --- [ glUniformMatrix3x4dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3x4dv UniformMatrix3x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix3x4dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix3x4dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3x4 uniform variable or a dmat3x4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix3x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix3x4dv(location, transpose, value); + } + + // --- [ glUniformMatrix4x2dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4x2dv UniformMatrix4x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix4x2dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix4x2dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4x2 uniform variable or a dmat4x2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix4x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix4x2dv(location, transpose, value); + } + + // --- [ glUniformMatrix4x3dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4x3dv UniformMatrix4x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglUniformMatrix4x3dv(int location, int count, boolean transpose, long value) { + GL40C.nglUniformMatrix4x3dv(location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4x3 uniform variable or a dmat4x3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix4x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL40C.glUniformMatrix4x3dv(location, transpose, value); + } + + // --- [ glGetUniformdv ] --- + + /** Unsafe version of: {@link #glGetUniformdv GetUniformdv} */ + public static void nglGetUniformdv(int program, int location, long params) { + GL40C.nglGetUniformdv(program, location, params); + } + + /** + * Returns the double value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + * + * @see Reference Page + */ + public static void glGetUniformdv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") DoubleBuffer params) { + GL40C.glGetUniformdv(program, location, params); + } + + /** + * Returns the double value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static double glGetUniformd(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL40C.glGetUniformd(program, location); + } + + // --- [ glMinSampleShading ] --- + + /** + * Specifies the minimum rate at which sample shading takes place. + * + * @param value the rate at which samples are shaded within each covered pixel + * + * @see Reference Page + */ + public static void glMinSampleShading(@NativeType("GLfloat") float value) { + GL40C.glMinSampleShading(value); + } + + // --- [ glGetSubroutineUniformLocation ] --- + + /** Unsafe version of: {@link #glGetSubroutineUniformLocation GetSubroutineUniformLocation} */ + public static int nglGetSubroutineUniformLocation(int program, int shadertype, long name) { + return GL40C.nglGetSubroutineUniformLocation(program, shadertype, name); + } + + /** + * Retrieves the location of a subroutine uniform of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine uniform whose index to query. + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetSubroutineUniformLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") ByteBuffer name) { + return GL40C.glGetSubroutineUniformLocation(program, shadertype, name); + } + + /** + * Retrieves the location of a subroutine uniform of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine uniform whose index to query. + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetSubroutineUniformLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") CharSequence name) { + return GL40C.glGetSubroutineUniformLocation(program, shadertype, name); + } + + // --- [ glGetSubroutineIndex ] --- + + /** Unsafe version of: {@link #glGetSubroutineIndex GetSubroutineIndex} */ + public static int nglGetSubroutineIndex(int program, int shadertype, long name) { + return GL40C.nglGetSubroutineIndex(program, shadertype, name); + } + + /** + * Retrieves the index of a subroutine function of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine function index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine function whose index to query + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetSubroutineIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") ByteBuffer name) { + return GL40C.glGetSubroutineIndex(program, shadertype, name); + } + + /** + * Retrieves the index of a subroutine function of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine function index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine function whose index to query + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetSubroutineIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") CharSequence name) { + return GL40C.glGetSubroutineIndex(program, shadertype, name); + } + + // --- [ glGetActiveSubroutineUniformiv ] --- + + /** Unsafe version of: {@link #glGetActiveSubroutineUniformiv GetActiveSubroutineUniformiv} */ + public static void nglGetActiveSubroutineUniformiv(int program, int shadertype, int index, int pname, long values) { + GL40C.nglGetActiveSubroutineUniformiv(program, shadertype, index, pname, values); + } + + /** + * Queries a property of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param pname the parameter of the shader subroutine uniform to query. One of:
    {@link GL40C#GL_NUM_COMPATIBLE_SUBROUTINES NUM_COMPATIBLE_SUBROUTINES}{@link GL40C#GL_COMPATIBLE_SUBROUTINES COMPATIBLE_SUBROUTINES}{@link GL31#GL_UNIFORM_SIZE UNIFORM_SIZE}{@link GL31#GL_UNIFORM_NAME_LENGTH UNIFORM_NAME_LENGTH}
    + * @param values the address of a buffer into which the queried value or values will be placed + * + * @see Reference Page + */ + public static void glGetActiveSubroutineUniformiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer values) { + GL40C.glGetActiveSubroutineUniformiv(program, shadertype, index, pname, values); + } + + /** + * Queries a property of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param pname the parameter of the shader subroutine uniform to query. One of:
    {@link GL40C#GL_NUM_COMPATIBLE_SUBROUTINES NUM_COMPATIBLE_SUBROUTINES}{@link GL40C#GL_COMPATIBLE_SUBROUTINES COMPATIBLE_SUBROUTINES}{@link GL31#GL_UNIFORM_SIZE UNIFORM_SIZE}{@link GL31#GL_UNIFORM_NAME_LENGTH UNIFORM_NAME_LENGTH}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetActiveSubroutineUniformi(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL40C.glGetActiveSubroutineUniformi(program, shadertype, index, pname); + } + + // --- [ glGetActiveSubroutineUniformName ] --- + + /** + * Unsafe version of: {@link #glGetActiveSubroutineUniformName GetActiveSubroutineUniformName} + * + * @param bufsize the size of the buffer whose address is given in {@code name} + */ + public static void nglGetActiveSubroutineUniformName(int program, int shadertype, int index, int bufsize, long length, long name) { + GL40C.nglGetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name); + } + + /** + * Queries the name of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param length the address of a variable into which is written the number of characters copied into {@code name} + * @param name the address of a buffer that will receive the name of the specified shader subroutine uniform + * + * @see Reference Page + */ + public static void glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer name) { + GL40C.glGetActiveSubroutineUniformName(program, shadertype, index, length, name); + } + + /** + * Queries the name of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param bufsize the size of the buffer whose address is given in {@code name} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufsize) { + return GL40C.glGetActiveSubroutineUniformName(program, shadertype, index, bufsize); + } + + /** + * Queries the name of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index) { + return glGetActiveSubroutineUniformName(program, shadertype, index, glGetActiveSubroutineUniformi(program, shadertype, index, GL31.GL_UNIFORM_NAME_LENGTH)); + } + + // --- [ glGetActiveSubroutineName ] --- + + /** + * Unsafe version of: {@link #glGetActiveSubroutineName GetActiveSubroutineName} + * + * @param bufsize the size of the buffer whose address is given in {@code name} + */ + public static void nglGetActiveSubroutineName(int program, int shadertype, int index, int bufsize, long length, long name) { + GL40C.nglGetActiveSubroutineName(program, shadertype, index, bufsize, length, name); + } + + /** + * Queries the name of an active shader subroutine. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query the subroutine name. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param length a variable which is to receive the length of the shader subroutine uniform name + * @param name an array into which the name of the shader subroutine uniform will be written + * + * @see Reference Page + */ + public static void glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer name) { + GL40C.glGetActiveSubroutineName(program, shadertype, index, length, name); + } + + /** + * Queries the name of an active shader subroutine. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query the subroutine name. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param bufsize the size of the buffer whose address is given in {@code name} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufsize) { + return GL40C.glGetActiveSubroutineName(program, shadertype, index, bufsize); + } + + /** + * Queries the name of an active shader subroutine. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query the subroutine name. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index) { + return glGetActiveSubroutineName(program, shadertype, index, glGetProgramStagei(program, shadertype, GL_ACTIVE_SUBROUTINE_MAX_LENGTH)); + } + + // --- [ glUniformSubroutinesuiv ] --- + + /** + * Unsafe version of: {@link #glUniformSubroutinesuiv UniformSubroutinesuiv} + * + * @param count the number of uniform indices stored in {@code indices} + */ + public static void nglUniformSubroutinesuiv(int shadertype, int count, long indices) { + GL40C.nglUniformSubroutinesuiv(shadertype, count, indices); + } + + /** + * Loads active subroutine uniforms. + * + * @param shadertype the shader stage to update. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param indices an array holding the indices to load into the shader subroutine variables + * + * @see Reference Page + */ + public static void glUniformSubroutinesuiv(@NativeType("GLenum") int shadertype, @NativeType("GLuint const *") IntBuffer indices) { + GL40C.glUniformSubroutinesuiv(shadertype, indices); + } + + /** + * Loads active subroutine uniforms. + * + * @param shadertype the shader stage to update. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * + * @see Reference Page + */ + public static void glUniformSubroutinesui(@NativeType("GLenum") int shadertype, @NativeType("GLuint const *") int index) { + GL40C.glUniformSubroutinesui(shadertype, index); + } + + // --- [ glGetUniformSubroutineuiv ] --- + + /** Unsafe version of: {@link #glGetUniformSubroutineuiv GetUniformSubroutineuiv} */ + public static void nglGetUniformSubroutineuiv(int shadertype, int location, long params) { + GL40C.nglGetUniformSubroutineuiv(shadertype, location, params); + } + + /** + * Retrieves the value of a subroutine uniform of a given shader stage of the current program. + * + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param location the location of the subroutine uniform + * @param params a variable to receive the value or values of the subroutine uniform + * + * @see Reference Page + */ + public static void glGetUniformSubroutineuiv(@NativeType("GLenum") int shadertype, @NativeType("GLint") int location, @NativeType("GLuint *") IntBuffer params) { + GL40C.glGetUniformSubroutineuiv(shadertype, location, params); + } + + /** + * Retrieves the value of a subroutine uniform of a given shader stage of the current program. + * + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param location the location of the subroutine uniform + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetUniformSubroutineui(@NativeType("GLenum") int shadertype, @NativeType("GLint") int location) { + return GL40C.glGetUniformSubroutineui(shadertype, location); + } + + // --- [ glGetProgramStageiv ] --- + + /** Unsafe version of: {@link #glGetProgramStageiv GetProgramStageiv} */ + public static void nglGetProgramStageiv(int program, int shadertype, int pname, long values) { + GL40C.nglGetProgramStageiv(program, shadertype, pname, values); + } + + /** + * Retrieves properties of a program object corresponding to a specified shader stage. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param pname the parameter of the shader to query. One of:
    {@link GL40C#GL_ACTIVE_SUBROUTINES ACTIVE_SUBROUTINES}{@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORMS ACTIVE_SUBROUTINE_UNIFORMS}
    {@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS}{@link GL40C#GL_ACTIVE_SUBROUTINE_MAX_LENGTH ACTIVE_SUBROUTINE_MAX_LENGTH}
    {@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH}
    + * @param values a variable into which the queried value or values will be placed + * + * @see Reference Page + */ + public static void glGetProgramStageiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer values) { + GL40C.glGetProgramStageiv(program, shadertype, pname, values); + } + + /** + * Retrieves properties of a program object corresponding to a specified shader stage. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link GL40C#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link GL40C#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param pname the parameter of the shader to query. One of:
    {@link GL40C#GL_ACTIVE_SUBROUTINES ACTIVE_SUBROUTINES}{@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORMS ACTIVE_SUBROUTINE_UNIFORMS}
    {@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS}{@link GL40C#GL_ACTIVE_SUBROUTINE_MAX_LENGTH ACTIVE_SUBROUTINE_MAX_LENGTH}
    {@link GL40C#GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetProgramStagei(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLenum") int pname) { + return GL40C.glGetProgramStagei(program, shadertype, pname); + } + + // --- [ glPatchParameteri ] --- + + /** + * Specifies the integer value of the specified parameter for patch primitives. + * + * @param pname the name of the parameter to set. Must be:
    {@link GL40C#GL_PATCH_VERTICES PATCH_VERTICES}
    + * @param value the new value for the parameter given by {@code pname} + * + * @see Reference Page + */ + public static void glPatchParameteri(@NativeType("GLenum") int pname, @NativeType("GLint") int value) { + GL40C.glPatchParameteri(pname, value); + } + + // --- [ glPatchParameterfv ] --- + + /** Unsafe version of: {@link #glPatchParameterfv PatchParameterfv} */ + public static void nglPatchParameterfv(int pname, long values) { + GL40C.nglPatchParameterfv(pname, values); + } + + /** + * Specifies an array of float values for the specified parameter for patch primitives. + * + * @param pname the name of the parameter to set. One of:
    {@link GL40C#GL_PATCH_DEFAULT_OUTER_LEVEL PATCH_DEFAULT_OUTER_LEVEL}{@link GL40C#GL_PATCH_DEFAULT_INNER_LEVEL PATCH_DEFAULT_INNER_LEVEL}
    + * @param values an array containing the new values for the parameter given by {@code pname} + * + * @see Reference Page + */ + public static void glPatchParameterfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer values) { + GL40C.glPatchParameterfv(pname, values); + } + + // --- [ glBindTransformFeedback ] --- + + /** + * Binds a transform feedback object. + * + * @param target the target to which to bind the transform feedback object {@code id}. Must be:
    {@link GL40C#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param id the name of a transform feedback object + * + * @see Reference Page + */ + public static void glBindTransformFeedback(@NativeType("GLenum") int target, @NativeType("GLuint") int id) { + GL40C.glBindTransformFeedback(target, id); + } + + // --- [ glDeleteTransformFeedbacks ] --- + + /** + * Unsafe version of: {@link #glDeleteTransformFeedbacks DeleteTransformFeedbacks} + * + * @param n the number of transform feedback objects to delete + */ + public static void nglDeleteTransformFeedbacks(int n, long ids) { + GL40C.nglDeleteTransformFeedbacks(n, ids); + } + + /** + * Deletes transform feedback objects. + * + * @param ids an array of names of transform feedback objects to delete + * + * @see Reference Page + */ + public static void glDeleteTransformFeedbacks(@NativeType("GLuint const *") IntBuffer ids) { + GL40C.glDeleteTransformFeedbacks(ids); + } + + /** + * Deletes transform feedback objects. + * + * @see Reference Page + */ + public static void glDeleteTransformFeedbacks(@NativeType("GLuint const *") int id) { + GL40C.glDeleteTransformFeedbacks(id); + } + + // --- [ glGenTransformFeedbacks ] --- + + /** + * Unsafe version of: {@link #glGenTransformFeedbacks GenTransformFeedbacks} + * + * @param n the number of transform feedback object names to reserve + */ + public static void nglGenTransformFeedbacks(int n, long ids) { + GL40C.nglGenTransformFeedbacks(n, ids); + } + + /** + * Reserves transform feedback object names. + * + * @param ids an array of into which the reserved names will be written + * + * @see Reference Page + */ + public static void glGenTransformFeedbacks(@NativeType("GLuint *") IntBuffer ids) { + GL40C.glGenTransformFeedbacks(ids); + } + + /** + * Reserves transform feedback object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenTransformFeedbacks() { + return GL40C.glGenTransformFeedbacks(); + } + + // --- [ glIsTransformFeedback ] --- + + /** + * Determines if a name corresponds to a transform feedback object. + * + * @param id a value that may be the name of a transform feedback object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsTransformFeedback(@NativeType("GLuint") int id) { + return GL40C.glIsTransformFeedback(id); + } + + // --- [ glPauseTransformFeedback ] --- + + /** + * Pauses transform feedback operations for the currently bound transform feedback object. + * + *

    When transform feedback operations are paused, transform feedback is still considered active and changing most transform feedback state related to the + * object results in an error. However, a new transform feedback object may be bound while transform feedback is paused. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} + * is generated by PauseTransformFeedback if the currently bound transform feedback is not active or is paused.

    + * + *

    When transform feedback is active and not paused, all geometric primitives generated must be compatible with the value of {@code primitiveMode} passed + * to {@link GL30C#glBeginTransformFeedback BeginTransformFeedback}. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by {@link GL11#glBegin Begin} or any operation that implicitly calls {@link GL11#glBegin Begin} + * (such as {@link GL11C#glDrawElements DrawElements}) if {@code mode} is not one of the allowed modes. If a geometry shader is active, its output primitive type is used instead + * of the {@code mode} parameter passed to {@link GL11#glBegin Begin} for the purposes of this error check. Any primitive type may be used while transform feedback is + * paused.

    + * + * @see Reference Page + */ + public static void glPauseTransformFeedback() { + GL40C.glPauseTransformFeedback(); + } + + // --- [ glResumeTransformFeedback ] --- + + /** + * Resumes transform feedback operations for the currently bound transform feedback object. + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by {@link #glResumeTransformFeedback ResumeTransformFeedback} if the currently bound transform feedback is not active or is not paused.

    + * + * @see Reference Page + */ + public static void glResumeTransformFeedback() { + GL40C.glResumeTransformFeedback(); + } + + // --- [ glDrawTransformFeedback ] --- + + /** + * Render primitives using a count derived from a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + * + * @see Reference Page + */ + public static void glDrawTransformFeedback(@NativeType("GLenum") int mode, @NativeType("GLuint") int id) { + GL40C.glDrawTransformFeedback(mode, id); + } + + // --- [ glDrawTransformFeedbackStream ] --- + + /** + * Renders primitives using a count derived from a specifed stream of a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40C#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + * @param stream the index of the transform feedback stream from which to retrieve a primitive count + * + * @see Reference Page + */ + public static void glDrawTransformFeedbackStream(@NativeType("GLenum") int mode, @NativeType("GLuint") int id, @NativeType("GLuint") int stream) { + GL40C.glDrawTransformFeedbackStream(mode, id, stream); + } + + // --- [ glBeginQueryIndexed ] --- + + /** + * Begins a query object on an indexed target + * + * @param target the target type of query object established between {@code glBeginQueryIndexed} and the subsequent {@link #glEndQueryIndexed EndQueryIndexed}. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query target upon which to begin the query + * @param id the name of a query object + * + * @see Reference Page + */ + public static void glBeginQueryIndexed(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int id) { + GL40C.glBeginQueryIndexed(target, index, id); + } + + // --- [ glEndQueryIndexed ] --- + + /** + * Ends a query object on an indexed target + * + * @param target the target type of query object to be concluded. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query target upon which to end the query + * + * @see Reference Page + */ + public static void glEndQueryIndexed(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + GL40C.glEndQueryIndexed(target, index); + } + + // --- [ glGetQueryIndexediv ] --- + + /** Unsafe version of: {@link #glGetQueryIndexediv GetQueryIndexediv} */ + public static void nglGetQueryIndexediv(int target, int index, int pname, long params) { + GL40C.nglGetQueryIndexediv(target, index, pname, params); + } + + /** + * Returns parameters of an indexed query object target. + * + * @param target a query object target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query object target + * @param pname the symbolic name of a query object target parameter + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryIndexediv(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL40C.glGetQueryIndexediv(target, index, pname, params); + } + + /** + * Returns parameters of an indexed query object target. + * + * @param target a query object target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query object target + * @param pname the symbolic name of a query object target parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetQueryIndexedi(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL40C.glGetQueryIndexedi(target, index, pname); + } + + /** + * Array version of: {@link #glDrawArraysIndirect DrawArraysIndirect} + * + * @see Reference Page + */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") int[] indirect) { + GL40C.glDrawArraysIndirect(mode, indirect); + } + + /** + * Array version of: {@link #glDrawElementsIndirect DrawElementsIndirect} + * + * @see Reference Page + */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") int[] indirect) { + GL40C.glDrawElementsIndirect(mode, type, indirect); + } + + /** + * Array version of: {@link #glUniform1dv Uniform1dv} + * + * @see Reference Page + */ + public static void glUniform1dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniform1dv(location, value); + } + + /** + * Array version of: {@link #glUniform2dv Uniform2dv} + * + * @see Reference Page + */ + public static void glUniform2dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniform2dv(location, value); + } + + /** + * Array version of: {@link #glUniform3dv Uniform3dv} + * + * @see Reference Page + */ + public static void glUniform3dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniform3dv(location, value); + } + + /** + * Array version of: {@link #glUniform4dv Uniform4dv} + * + * @see Reference Page + */ + public static void glUniform4dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniform4dv(location, value); + } + + /** + * Array version of: {@link #glUniformMatrix2dv UniformMatrix2dv} + * + * @see Reference Page + */ + public static void glUniformMatrix2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix2dv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix3dv UniformMatrix3dv} + * + * @see Reference Page + */ + public static void glUniformMatrix3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix3dv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix4dv UniformMatrix4dv} + * + * @see Reference Page + */ + public static void glUniformMatrix4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix4dv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix2x3dv UniformMatrix2x3dv} + * + * @see Reference Page + */ + public static void glUniformMatrix2x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix2x3dv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix2x4dv UniformMatrix2x4dv} + * + * @see Reference Page + */ + public static void glUniformMatrix2x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix2x4dv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix3x2dv UniformMatrix3x2dv} + * + * @see Reference Page + */ + public static void glUniformMatrix3x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix3x2dv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix3x4dv UniformMatrix3x4dv} + * + * @see Reference Page + */ + public static void glUniformMatrix3x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix3x4dv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix4x2dv UniformMatrix4x2dv} + * + * @see Reference Page + */ + public static void glUniformMatrix4x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix4x2dv(location, transpose, value); + } + + /** + * Array version of: {@link #glUniformMatrix4x3dv UniformMatrix4x3dv} + * + * @see Reference Page + */ + public static void glUniformMatrix4x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL40C.glUniformMatrix4x3dv(location, transpose, value); + } + + /** + * Array version of: {@link #glGetUniformdv GetUniformdv} + * + * @see Reference Page + */ + public static void glGetUniformdv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") double[] params) { + GL40C.glGetUniformdv(program, location, params); + } + + /** + * Array version of: {@link #glGetActiveSubroutineUniformiv GetActiveSubroutineUniformiv} + * + * @see Reference Page + */ + public static void glGetActiveSubroutineUniformiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] values) { + GL40C.glGetActiveSubroutineUniformiv(program, shadertype, index, pname, values); + } + + /** + * Array version of: {@link #glGetActiveSubroutineUniformName GetActiveSubroutineUniformName} + * + * @see Reference Page + */ + public static void glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer name) { + GL40C.glGetActiveSubroutineUniformName(program, shadertype, index, length, name); + } + + /** + * Array version of: {@link #glGetActiveSubroutineName GetActiveSubroutineName} + * + * @see Reference Page + */ + public static void glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer name) { + GL40C.glGetActiveSubroutineName(program, shadertype, index, length, name); + } + + /** + * Array version of: {@link #glUniformSubroutinesuiv UniformSubroutinesuiv} + * + * @see Reference Page + */ + public static void glUniformSubroutinesuiv(@NativeType("GLenum") int shadertype, @NativeType("GLuint const *") int[] indices) { + GL40C.glUniformSubroutinesuiv(shadertype, indices); + } + + /** + * Array version of: {@link #glGetUniformSubroutineuiv GetUniformSubroutineuiv} + * + * @see Reference Page + */ + public static void glGetUniformSubroutineuiv(@NativeType("GLenum") int shadertype, @NativeType("GLint") int location, @NativeType("GLuint *") int[] params) { + GL40C.glGetUniformSubroutineuiv(shadertype, location, params); + } + + /** + * Array version of: {@link #glGetProgramStageiv GetProgramStageiv} + * + * @see Reference Page + */ + public static void glGetProgramStageiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] values) { + GL40C.glGetProgramStageiv(program, shadertype, pname, values); + } + + /** + * Array version of: {@link #glPatchParameterfv PatchParameterfv} + * + * @see Reference Page + */ + public static void glPatchParameterfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] values) { + GL40C.glPatchParameterfv(pname, values); + } + + /** + * Array version of: {@link #glDeleteTransformFeedbacks DeleteTransformFeedbacks} + * + * @see Reference Page + */ + public static void glDeleteTransformFeedbacks(@NativeType("GLuint const *") int[] ids) { + GL40C.glDeleteTransformFeedbacks(ids); + } + + /** + * Array version of: {@link #glGenTransformFeedbacks GenTransformFeedbacks} + * + * @see Reference Page + */ + public static void glGenTransformFeedbacks(@NativeType("GLuint *") int[] ids) { + GL40C.glGenTransformFeedbacks(ids); + } + + /** + * Array version of: {@link #glGetQueryIndexediv GetQueryIndexediv} + * + * @see Reference Page + */ + public static void glGetQueryIndexediv(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL40C.glGetQueryIndexediv(target, index, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL40C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL40C.java new file mode 100644 index 000000000..41bf29dcd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL40C.java @@ -0,0 +1,1862 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 4.0. Includes only Core Profile symbols. + * + *

    OpenGL 4.0 implementations support revision 4.00 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL40C extends GL33C { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, + * MapBufferRange, FlushMappedBufferRange, GetBufferParameteriv, and CopyBufferSubData. + */ + public static final int GL_DRAW_INDIRECT_BUFFER = 0x8F3F; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int GL_DRAW_INDIRECT_BUFFER_BINDING = 0x8F43; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_GEOMETRY_SHADER_INVOCATIONS = 0x887F; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int + GL_MAX_GEOMETRY_SHADER_INVOCATIONS = 0x8E5A, + GL_MIN_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5B, + GL_MAX_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5C, + GL_FRAGMENT_INTERPOLATION_OFFSET_BITS = 0x8E5D; + + /** Returned in the {@code type} parameter of GetActiveUniform, and GetTransformFeedbackVarying. */ + public static final int + GL_DOUBLE_VEC2 = 0x8FFC, + GL_DOUBLE_VEC3 = 0x8FFD, + GL_DOUBLE_VEC4 = 0x8FFE, + GL_DOUBLE_MAT2 = 0x8F46, + GL_DOUBLE_MAT3 = 0x8F47, + GL_DOUBLE_MAT4 = 0x8F48, + GL_DOUBLE_MAT2x3 = 0x8F49, + GL_DOUBLE_MAT2x4 = 0x8F4A, + GL_DOUBLE_MAT3x2 = 0x8F4B, + GL_DOUBLE_MAT3x4 = 0x8F4C, + GL_DOUBLE_MAT4x2 = 0x8F4D, + GL_DOUBLE_MAT4x3 = 0x8F4E; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_SAMPLE_SHADING = 0x8C36; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int GL_MIN_SAMPLE_SHADING_VALUE = 0x8C37; + + /** Accepted by the {@code pname} parameter of GetProgramStageiv. */ + public static final int + GL_ACTIVE_SUBROUTINES = 0x8DE5, + GL_ACTIVE_SUBROUTINE_UNIFORMS = 0x8DE6, + GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS = 0x8E47, + GL_ACTIVE_SUBROUTINE_MAX_LENGTH = 0x8E48, + GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH = 0x8E49; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int + GL_MAX_SUBROUTINES = 0x8DE7, + GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS = 0x8DE8; + + /** Accepted by the {@code pname} parameter of GetActiveSubroutineUniformiv. */ + public static final int + GL_NUM_COMPATIBLE_SUBROUTINES = 0x8E4A, + GL_COMPATIBLE_SUBROUTINES = 0x8E4B; + + /** Accepted by the {@code mode} parameter of Begin and all vertex array functions that implicitly call Begin. */ + public static final int GL_PATCHES = 0xE; + + /** Accepted by the {@code pname} parameter of PatchParameteri, GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v. */ + public static final int GL_PATCH_VERTICES = 0x8E72; + + /** Accepted by the {@code pname} parameter of PatchParameterfv, GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv, and GetInteger64v. */ + public static final int + GL_PATCH_DEFAULT_INNER_LEVEL = 0x8E73, + GL_PATCH_DEFAULT_OUTER_LEVEL = 0x8E74; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int + GL_TESS_CONTROL_OUTPUT_VERTICES = 0x8E75, + GL_TESS_GEN_MODE = 0x8E76, + GL_TESS_GEN_SPACING = 0x8E77, + GL_TESS_GEN_VERTEX_ORDER = 0x8E78, + GL_TESS_GEN_POINT_MODE = 0x8E79; + + /** Returned by GetProgramiv when {@code pname} is TESS_GEN_MODE. */ + public static final int GL_ISOLINES = 0x8E7A; + + /** Returned by GetProgramiv when {@code pname} is TESS_GEN_SPACING. */ + public static final int + GL_FRACTIONAL_ODD = 0x8E7B, + GL_FRACTIONAL_EVEN = 0x8E7C; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v. */ + public static final int + GL_MAX_PATCH_VERTICES = 0x8E7D, + GL_MAX_TESS_GEN_LEVEL = 0x8E7E, + GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E7F, + GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E80, + GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS = 0x8E81, + GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS = 0x8E82, + GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS = 0x8E83, + GL_MAX_TESS_PATCH_COMPONENTS = 0x8E84, + GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS = 0x8E85, + GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS = 0x8E86, + GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS = 0x8E89, + GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS = 0x8E8A, + GL_MAX_TESS_CONTROL_INPUT_COMPONENTS = 0x886C, + GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS = 0x886D, + GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E1E, + GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E1F; + + /** Accepted by the {@code pname} parameter of GetActiveUniformBlockiv. */ + public static final int + GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER = 0x84F0, + GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x84F1; + + /** Accepted by the {@code type} parameter of CreateShader and returned by the {@code params} parameter of GetShaderiv. */ + public static final int + GL_TESS_EVALUATION_SHADER = 0x8E87, + GL_TESS_CONTROL_SHADER = 0x8E88; + + /** Accepted by the {@code target} parameter of TexParameteri, TexParameteriv, TexParameterf, TexParameterfv, BindTexture, and GenerateMipmap. */ + public static final int GL_TEXTURE_CUBE_MAP_ARRAY = 0x9009; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv and GetFloatv. */ + public static final int GL_TEXTURE_BINDING_CUBE_MAP_ARRAY = 0x900A; + + /** Accepted by the {@code target} parameter of TexImage3D, TexSubImage3D, CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D. */ + public static final int GL_PROXY_TEXTURE_CUBE_MAP_ARRAY = 0x900B; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_CUBE_MAP_ARRAY = 0x900C, + GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW = 0x900D, + GL_INT_SAMPLER_CUBE_MAP_ARRAY = 0x900E, + GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY = 0x900F; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET = 0x8E5E, + GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET = 0x8E5F; + + /** Accepted by the {@code target} parameter of BindTransformFeedback. */ + public static final int GL_TRANSFORM_FEEDBACK = 0x8E22; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED = 0x8E23, + GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE = 0x8E24, + GL_TRANSFORM_FEEDBACK_BINDING = 0x8E25; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_MAX_TRANSFORM_FEEDBACK_BUFFERS = 0x8E70, + GL_MAX_VERTEX_STREAMS = 0x8E71; + + protected GL40C() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendEquationi ] --- + + /** + * Specifies the equation used for both the RGB blend equation and the Alpha blend equation for the specified draw buffer. + * + * @param buf the index of the draw buffer for which to set the blend equation + * @param mode how source and destination colors are combined. One of:
    {@link GL14#GL_FUNC_ADD FUNC_ADD}{@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14#GL_MIN MIN}{@link GL14#GL_MAX MAX}
    + * + * @see Reference Page + */ + public static native void glBlendEquationi(@NativeType("GLuint") int buf, @NativeType("GLenum") int mode); + + // --- [ glBlendEquationSeparatei ] --- + + /** + * Sets the RGB blend equation and the alpha blend equation separately for the specified draw buffer. + * + * @param buf the index of the draw buffer for which to set the blend equations + * @param modeRGB the RGB blend equation, how the red, green, and blue components of the source and destination colors are combined. One of:
    {@link GL14#GL_FUNC_ADD FUNC_ADD}{@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14#GL_MIN MIN}{@link GL14#GL_MAX MAX}
    + * @param modeAlpha the alpha blend equation, how the alpha component of the source and destination colors are combined. One of:
    {@link GL14#GL_FUNC_ADD FUNC_ADD}{@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}{@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT}{@link GL14#GL_MIN MIN}{@link GL14#GL_MAX MAX}
    + * + * @see Reference Page + */ + public static native void glBlendEquationSeparatei(@NativeType("GLuint") int buf, @NativeType("GLenum") int modeRGB, @NativeType("GLenum") int modeAlpha); + + // --- [ glBlendFunci ] --- + + /** + * Specifies pixel arithmetic for the specified draw buffer. + * + * @param buf the index of the draw buffer for which to set the blend function + * @param sfactor how the red, green, blue, and alpha source blending factors are computed + * @param dfactor how the red, green, blue, and alpha destination blending factors are computed + * + * @see Reference Page + */ + public static native void glBlendFunci(@NativeType("GLuint") int buf, @NativeType("GLenum") int sfactor, @NativeType("GLenum") int dfactor); + + // --- [ glBlendFuncSeparatei ] --- + + /** + * Specifies pixel arithmetic for RGB and alpha components separately for the specified draw buffer. + * + * @param buf the index of the draw buffer for which to set the blend functions + * @param srcRGB how the red, green, and blue blending factors are computed + * @param dstRGB how the red, green, and blue destination blending factors are computed + * @param srcAlpha how the alpha source blending factor is computed + * @param dstAlpha how the alpha destination blending factor is computed + * + * @see Reference Page + */ + public static native void glBlendFuncSeparatei(@NativeType("GLuint") int buf, @NativeType("GLenum") int srcRGB, @NativeType("GLenum") int dstRGB, @NativeType("GLenum") int srcAlpha, @NativeType("GLenum") int dstAlpha); + + // --- [ glDrawArraysIndirect ] --- + + /** Unsafe version of: {@link #glDrawArraysIndirect DrawArraysIndirect} */ + public static native void nglDrawArraysIndirect(int mode, long indirect); + + /** + * Renders primitives from array data, taking parameters from memory. + * + *

    {@code glDrawArraysIndirect} behaves similarly to {@link GL42C#glDrawArraysInstancedBaseInstance DrawArraysInstancedBaseInstance}, except that the parameters to + * glDrawArraysInstancedBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance; // must be 0 unless OpenGL 4.2 is supported
    +     * } DrawArraysIndirectCommand;
    +     * 
    +     * const DrawArraysIndirectCommand *cmd = (const DrawArraysIndirectCommand *)indirect;
    +     * glDrawArraysInstancedBaseInstance(mode, cmd->first, cmd->count, cmd->primCount, cmd->baseInstance);
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link #GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indirect) { + if (CHECKS) { + check(indirect, 4 * 4); + } + nglDrawArraysIndirect(mode, memAddress(indirect)); + } + + /** + * Renders primitives from array data, taking parameters from memory. + * + *

    {@code glDrawArraysIndirect} behaves similarly to {@link GL42C#glDrawArraysInstancedBaseInstance DrawArraysInstancedBaseInstance}, except that the parameters to + * glDrawArraysInstancedBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance; // must be 0 unless OpenGL 4.2 is supported
    +     * } DrawArraysIndirectCommand;
    +     * 
    +     * const DrawArraysIndirectCommand *cmd = (const DrawArraysIndirectCommand *)indirect;
    +     * glDrawArraysInstancedBaseInstance(mode, cmd->first, cmd->count, cmd->primCount, cmd->baseInstance);
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link #GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") long indirect) { + nglDrawArraysIndirect(mode, indirect); + } + + /** + * Renders primitives from array data, taking parameters from memory. + * + *

    {@code glDrawArraysIndirect} behaves similarly to {@link GL42C#glDrawArraysInstancedBaseInstance DrawArraysInstancedBaseInstance}, except that the parameters to + * glDrawArraysInstancedBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance; // must be 0 unless OpenGL 4.2 is supported
    +     * } DrawArraysIndirectCommand;
    +     * 
    +     * const DrawArraysIndirectCommand *cmd = (const DrawArraysIndirectCommand *)indirect;
    +     * glDrawArraysInstancedBaseInstance(mode, cmd->first, cmd->count, cmd->primCount, cmd->baseInstance);
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link #GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indirect) { + if (CHECKS) { + check(indirect, (4 * 4) >> 2); + } + nglDrawArraysIndirect(mode, memAddress(indirect)); + } + + // --- [ glDrawElementsIndirect ] --- + + /** Unsafe version of: {@link #glDrawElementsIndirect DrawElementsIndirect} */ + public static native void nglDrawElementsIndirect(int mode, int type, long indirect); + + /** + * Renders indexed primitives from array data, taking parameters from memory. + * + *

    {@code glDrawElementsIndirect} behaves similarly to {@link GL42C#glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance}, execpt that the parameters to + * glDrawElementsInstancedBaseVertexBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    {@code glDrawElementsIndirect} is equivalent to:

    + * + *
    
    +     * void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect) {
    +     *     const DrawElementsIndirectCommand *cmd  = (const DrawElementsIndirectCommand *)indirect;
    +     *     glDrawElementsInstancedBaseVertexBaseInstance(
    +     *         mode,
    +     *         cmd->count,
    +     *         type,
    +     *         cmd->firstIndex + size-of-type,
    +     *         cmd->primCount,
    +     *         cmd->baseVertex,
    +     *         cmd->baseInstance
    +     *     );
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link #GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the {@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER} binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect the address of a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indirect) { + if (CHECKS) { + check(indirect, 5 * 4); + } + nglDrawElementsIndirect(mode, type, memAddress(indirect)); + } + + /** + * Renders indexed primitives from array data, taking parameters from memory. + * + *

    {@code glDrawElementsIndirect} behaves similarly to {@link GL42C#glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance}, execpt that the parameters to + * glDrawElementsInstancedBaseVertexBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    {@code glDrawElementsIndirect} is equivalent to:

    + * + *
    
    +     * void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect) {
    +     *     const DrawElementsIndirectCommand *cmd  = (const DrawElementsIndirectCommand *)indirect;
    +     *     glDrawElementsInstancedBaseVertexBaseInstance(
    +     *         mode,
    +     *         cmd->count,
    +     *         type,
    +     *         cmd->firstIndex + size-of-type,
    +     *         cmd->primCount,
    +     *         cmd->baseVertex,
    +     *         cmd->baseInstance
    +     *     );
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link #GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the {@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER} binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect the address of a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") long indirect) { + nglDrawElementsIndirect(mode, type, indirect); + } + + /** + * Renders indexed primitives from array data, taking parameters from memory. + * + *

    {@code glDrawElementsIndirect} behaves similarly to {@link GL42C#glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance}, execpt that the parameters to + * glDrawElementsInstancedBaseVertexBaseInstance are stored in memory at the address given by {@code indirect}.

    + * + *

    The parameters addressed by {@code indirect} are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    {@code glDrawElementsIndirect} is equivalent to:

    + * + *
    
    +     * void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect) {
    +     *     const DrawElementsIndirectCommand *cmd  = (const DrawElementsIndirectCommand *)indirect;
    +     *     glDrawElementsInstancedBaseVertexBaseInstance(
    +     *         mode,
    +     *         cmd->count,
    +     *         type,
    +     *         cmd->firstIndex + size-of-type,
    +     *         cmd->primCount,
    +     *         cmd->baseVertex,
    +     *         cmd->baseInstance
    +     *     );
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link #GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the {@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER} binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect the address of a structure containing the draw parameters + * + * @see Reference Page + */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer indirect) { + if (CHECKS) { + check(indirect, (5 * 4) >> 2); + } + nglDrawElementsIndirect(mode, type, memAddress(indirect)); + } + + // --- [ glUniform1d ] --- + + /** + * Specifies the value of a double uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * + * @see Reference Page + */ + public static native void glUniform1d(@NativeType("GLint") int location, @NativeType("GLdouble") double x); + + // --- [ glUniform2d ] --- + + /** + * Specifies the value of a dvec2 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * + * @see Reference Page + */ + public static native void glUniform2d(@NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y); + + // --- [ glUniform3d ] --- + + /** + * Specifies the value of a dvec3 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * + * @see Reference Page + */ + public static native void glUniform3d(@NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glUniform4d ] --- + + /** + * Specifies the value of a dvec4 uniform variable for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + * + * @see Reference Page + */ + public static native void glUniform4d(@NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w); + + // --- [ glUniform1dv ] --- + + /** + * Unsafe version of: {@link #glUniform1dv Uniform1dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform1dv(int location, int count, long value); + + /** + * Specifies the value of a single double uniform variable or a double uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform1dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniform1dv(location, value.remaining(), memAddress(value)); + } + + // --- [ glUniform2dv ] --- + + /** + * Unsafe version of: {@link #glUniform2dv Uniform2dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform2dv(int location, int count, long value); + + /** + * Specifies the value of a single dvec2 uniform variable or a dvec2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform2dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniform2dv(location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glUniform3dv ] --- + + /** + * Unsafe version of: {@link #glUniform3dv Uniform3dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform3dv(int location, int count, long value); + + /** + * Specifies the value of a single dvec3 uniform variable or a dvec3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform3dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniform3dv(location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glUniform4dv ] --- + + /** + * Unsafe version of: {@link #glUniform4dv Uniform4dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglUniform4dv(int location, int count, long value); + + /** + * Specifies the value of a single dvec4 uniform variable or a dvec4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glUniform4dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniform4dv(location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glUniformMatrix2dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2dv UniformMatrix2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix2dv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat2 uniform variable or a dmat2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniformMatrix2dv(location, value.remaining() >> 2, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix3dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3dv UniformMatrix3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix3dv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat3 uniform variable or a dmat3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniformMatrix3dv(location, value.remaining() / 9, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix4dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4dv UniformMatrix4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix4dv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat4 uniform variable or a dmat4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniformMatrix4dv(location, value.remaining() >> 4, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix2x3dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2x3dv UniformMatrix2x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix2x3dv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat2x3 uniform variable or a dmat2x3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix2x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniformMatrix2x3dv(location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix2x4dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix2x4dv UniformMatrix2x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix2x4dv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat2x4 uniform variable or a dmat2x4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix2x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniformMatrix2x4dv(location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix3x2dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3x2dv UniformMatrix3x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix3x2dv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat3x2 uniform variable or a dmat3x2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix3x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniformMatrix3x2dv(location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix3x4dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix3x4dv UniformMatrix3x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix3x4dv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat3x4 uniform variable or a dmat3x4 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix3x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniformMatrix3x4dv(location, value.remaining() / 12, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix4x2dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4x2dv UniformMatrix4x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix4x2dv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat4x2 uniform variable or a dmat4x2 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix4x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniformMatrix4x2dv(location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glUniformMatrix4x3dv ] --- + + /** + * Unsafe version of: {@link #glUniformMatrix4x3dv UniformMatrix4x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglUniformMatrix4x3dv(int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat4x3 uniform variable or a dmat4x3 uniform variable array for the current program object. + * + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value a pointer to an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glUniformMatrix4x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglUniformMatrix4x3dv(location, value.remaining() / 12, transpose, memAddress(value)); + } + + // --- [ glGetUniformdv ] --- + + /** Unsafe version of: {@link #glGetUniformdv GetUniformdv} */ + public static native void nglGetUniformdv(int program, int location, long params); + + /** + * Returns the double value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * @param params the value of the specified uniform variable + * + * @see Reference Page + */ + public static void glGetUniformdv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformdv(program, location, memAddress(params)); + } + + /** + * Returns the double value(s) of a uniform variable. + * + * @param program the program object to be queried + * @param location the location of the uniform variable to be queried + * + * @see Reference Page + */ + @NativeType("void") + public static double glGetUniformd(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer params = stack.callocDouble(1); + nglGetUniformdv(program, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glMinSampleShading ] --- + + /** + * Specifies the minimum rate at which sample shading takes place. + * + * @param value the rate at which samples are shaded within each covered pixel + * + * @see Reference Page + */ + public static native void glMinSampleShading(@NativeType("GLfloat") float value); + + // --- [ glGetSubroutineUniformLocation ] --- + + /** Unsafe version of: {@link #glGetSubroutineUniformLocation GetSubroutineUniformLocation} */ + public static native int nglGetSubroutineUniformLocation(int program, int shadertype, long name); + + /** + * Retrieves the location of a subroutine uniform of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine uniform whose index to query. + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetSubroutineUniformLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetSubroutineUniformLocation(program, shadertype, memAddress(name)); + } + + /** + * Retrieves the location of a subroutine uniform of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine uniform whose index to query. + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetSubroutineUniformLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetSubroutineUniformLocation(program, shadertype, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetSubroutineIndex ] --- + + /** Unsafe version of: {@link #glGetSubroutineIndex GetSubroutineIndex} */ + public static native int nglGetSubroutineIndex(int program, int shadertype, long name); + + /** + * Retrieves the index of a subroutine function of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine function index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine function whose index to query + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetSubroutineIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetSubroutineIndex(program, shadertype, memAddress(name)); + } + + /** + * Retrieves the index of a subroutine function of a given shader stage within a program. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for subroutine function index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param name the name of the subroutine function whose index to query + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetSubroutineIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetSubroutineIndex(program, shadertype, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetActiveSubroutineUniformiv ] --- + + /** Unsafe version of: {@link #glGetActiveSubroutineUniformiv GetActiveSubroutineUniformiv} */ + public static native void nglGetActiveSubroutineUniformiv(int program, int shadertype, int index, int pname, long values); + + /** + * Queries a property of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param pname the parameter of the shader subroutine uniform to query. One of:
    {@link #GL_NUM_COMPATIBLE_SUBROUTINES NUM_COMPATIBLE_SUBROUTINES}{@link #GL_COMPATIBLE_SUBROUTINES COMPATIBLE_SUBROUTINES}{@link GL31#GL_UNIFORM_SIZE UNIFORM_SIZE}{@link GL31#GL_UNIFORM_NAME_LENGTH UNIFORM_NAME_LENGTH}
    + * @param values the address of a buffer into which the queried value or values will be placed + * + * @see Reference Page + */ + public static void glGetActiveSubroutineUniformiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + nglGetActiveSubroutineUniformiv(program, shadertype, index, pname, memAddress(values)); + } + + /** + * Queries a property of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param pname the parameter of the shader subroutine uniform to query. One of:
    {@link #GL_NUM_COMPATIBLE_SUBROUTINES NUM_COMPATIBLE_SUBROUTINES}{@link #GL_COMPATIBLE_SUBROUTINES COMPATIBLE_SUBROUTINES}{@link GL31#GL_UNIFORM_SIZE UNIFORM_SIZE}{@link GL31#GL_UNIFORM_NAME_LENGTH UNIFORM_NAME_LENGTH}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetActiveSubroutineUniformi(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer values = stack.callocInt(1); + nglGetActiveSubroutineUniformiv(program, shadertype, index, pname, memAddress(values)); + return values.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetActiveSubroutineUniformName ] --- + + /** + * Unsafe version of: {@link #glGetActiveSubroutineUniformName GetActiveSubroutineUniformName} + * + * @param bufsize the size of the buffer whose address is given in {@code name} + */ + public static native void nglGetActiveSubroutineUniformName(int program, int shadertype, int index, int bufsize, long length, long name); + + /** + * Queries the name of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param length the address of a variable into which is written the number of characters copied into {@code name} + * @param name the address of a buffer that will receive the name of the specified shader subroutine uniform + * + * @see Reference Page + */ + public static void glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer name) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetActiveSubroutineUniformName(program, shadertype, index, name.remaining(), memAddressSafe(length), memAddress(name)); + } + + /** + * Queries the name of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param bufsize the size of the buffer whose address is given in {@code name} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufsize) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer name = stack.malloc(bufsize); + nglGetActiveSubroutineUniformName(program, shadertype, index, bufsize, memAddress(length), memAddress(name)); + return memASCII(name, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Queries the name of an active shader subroutine uniform. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index) { + return glGetActiveSubroutineUniformName(program, shadertype, index, glGetActiveSubroutineUniformi(program, shadertype, index, GL31.GL_UNIFORM_NAME_LENGTH)); + } + + // --- [ glGetActiveSubroutineName ] --- + + /** + * Unsafe version of: {@link #glGetActiveSubroutineName GetActiveSubroutineName} + * + * @param bufsize the size of the buffer whose address is given in {@code name} + */ + public static native void nglGetActiveSubroutineName(int program, int shadertype, int index, int bufsize, long length, long name); + + /** + * Queries the name of an active shader subroutine. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query the subroutine name. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param length a variable which is to receive the length of the shader subroutine uniform name + * @param name an array into which the name of the shader subroutine uniform will be written + * + * @see Reference Page + */ + public static void glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer name) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetActiveSubroutineName(program, shadertype, index, name.remaining(), memAddressSafe(length), memAddress(name)); + } + + /** + * Queries the name of an active shader subroutine. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query the subroutine name. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * @param bufsize the size of the buffer whose address is given in {@code name} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufsize) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer name = stack.malloc(bufsize); + nglGetActiveSubroutineName(program, shadertype, index, bufsize, memAddress(length), memAddress(name)); + return memASCII(name, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Queries the name of an active shader subroutine. + * + * @param program the name of the program containing the subroutine + * @param shadertype the shader stage from which to query the subroutine name. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param index the index of the shader subroutine uniform + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index) { + return glGetActiveSubroutineName(program, shadertype, index, glGetProgramStagei(program, shadertype, GL_ACTIVE_SUBROUTINE_MAX_LENGTH)); + } + + // --- [ glUniformSubroutinesuiv ] --- + + /** + * Unsafe version of: {@link #glUniformSubroutinesuiv UniformSubroutinesuiv} + * + * @param count the number of uniform indices stored in {@code indices} + */ + public static native void nglUniformSubroutinesuiv(int shadertype, int count, long indices); + + /** + * Loads active subroutine uniforms. + * + * @param shadertype the shader stage to update. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param indices an array holding the indices to load into the shader subroutine variables + * + * @see Reference Page + */ + public static void glUniformSubroutinesuiv(@NativeType("GLenum") int shadertype, @NativeType("GLuint const *") IntBuffer indices) { + nglUniformSubroutinesuiv(shadertype, indices.remaining(), memAddress(indices)); + } + + /** + * Loads active subroutine uniforms. + * + * @param shadertype the shader stage to update. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * + * @see Reference Page + */ + public static void glUniformSubroutinesui(@NativeType("GLenum") int shadertype, @NativeType("GLuint const *") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer indices = stack.ints(index); + nglUniformSubroutinesuiv(shadertype, 1, memAddress(indices)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetUniformSubroutineuiv ] --- + + /** Unsafe version of: {@link #glGetUniformSubroutineuiv GetUniformSubroutineuiv} */ + public static native void nglGetUniformSubroutineuiv(int shadertype, int location, long params); + + /** + * Retrieves the value of a subroutine uniform of a given shader stage of the current program. + * + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param location the location of the subroutine uniform + * @param params a variable to receive the value or values of the subroutine uniform + * + * @see Reference Page + */ + public static void glGetUniformSubroutineuiv(@NativeType("GLenum") int shadertype, @NativeType("GLint") int location, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformSubroutineuiv(shadertype, location, memAddress(params)); + } + + /** + * Retrieves the value of a subroutine uniform of a given shader stage of the current program. + * + * @param shadertype the shader stage from which to query for subroutine uniform index. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param location the location of the subroutine uniform + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetUniformSubroutineui(@NativeType("GLenum") int shadertype, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetUniformSubroutineuiv(shadertype, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetProgramStageiv ] --- + + /** Unsafe version of: {@link #glGetProgramStageiv GetProgramStageiv} */ + public static native void nglGetProgramStageiv(int program, int shadertype, int pname, long values); + + /** + * Retrieves properties of a program object corresponding to a specified shader stage. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param pname the parameter of the shader to query. One of:
    {@link #GL_ACTIVE_SUBROUTINES ACTIVE_SUBROUTINES}{@link #GL_ACTIVE_SUBROUTINE_UNIFORMS ACTIVE_SUBROUTINE_UNIFORMS}
    {@link #GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS}{@link #GL_ACTIVE_SUBROUTINE_MAX_LENGTH ACTIVE_SUBROUTINE_MAX_LENGTH}
    {@link #GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH}
    + * @param values a variable into which the queried value or values will be placed + * + * @see Reference Page + */ + public static void glGetProgramStageiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + nglGetProgramStageiv(program, shadertype, pname, memAddress(values)); + } + + /** + * Retrieves properties of a program object corresponding to a specified shader stage. + * + * @param program the name of the program containing shader stage + * @param shadertype the shader stage from which to query for the subroutine parameter. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}{@link #GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}
    {@link #GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param pname the parameter of the shader to query. One of:
    {@link #GL_ACTIVE_SUBROUTINES ACTIVE_SUBROUTINES}{@link #GL_ACTIVE_SUBROUTINE_UNIFORMS ACTIVE_SUBROUTINE_UNIFORMS}
    {@link #GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS}{@link #GL_ACTIVE_SUBROUTINE_MAX_LENGTH ACTIVE_SUBROUTINE_MAX_LENGTH}
    {@link #GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetProgramStagei(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer values = stack.callocInt(1); + nglGetProgramStageiv(program, shadertype, pname, memAddress(values)); + return values.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glPatchParameteri ] --- + + /** + * Specifies the integer value of the specified parameter for patch primitives. + * + * @param pname the name of the parameter to set. Must be:
    {@link #GL_PATCH_VERTICES PATCH_VERTICES}
    + * @param value the new value for the parameter given by {@code pname} + * + * @see Reference Page + */ + public static native void glPatchParameteri(@NativeType("GLenum") int pname, @NativeType("GLint") int value); + + // --- [ glPatchParameterfv ] --- + + /** Unsafe version of: {@link #glPatchParameterfv PatchParameterfv} */ + public static native void nglPatchParameterfv(int pname, long values); + + /** + * Specifies an array of float values for the specified parameter for patch primitives. + * + * @param pname the name of the parameter to set. One of:
    {@link #GL_PATCH_DEFAULT_OUTER_LEVEL PATCH_DEFAULT_OUTER_LEVEL}{@link #GL_PATCH_DEFAULT_INNER_LEVEL PATCH_DEFAULT_INNER_LEVEL}
    + * @param values an array containing the new values for the parameter given by {@code pname} + * + * @see Reference Page + */ + public static void glPatchParameterfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer values) { + if (CHECKS) { + if (DEBUG) { + check(values, GL11.glGetInteger(GL_PATCH_VERTICES)); + } + } + nglPatchParameterfv(pname, memAddress(values)); + } + + // --- [ glBindTransformFeedback ] --- + + /** + * Binds a transform feedback object. + * + * @param target the target to which to bind the transform feedback object {@code id}. Must be:
    {@link #GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param id the name of a transform feedback object + * + * @see Reference Page + */ + public static native void glBindTransformFeedback(@NativeType("GLenum") int target, @NativeType("GLuint") int id); + + // --- [ glDeleteTransformFeedbacks ] --- + + /** + * Unsafe version of: {@link #glDeleteTransformFeedbacks DeleteTransformFeedbacks} + * + * @param n the number of transform feedback objects to delete + */ + public static native void nglDeleteTransformFeedbacks(int n, long ids); + + /** + * Deletes transform feedback objects. + * + * @param ids an array of names of transform feedback objects to delete + * + * @see Reference Page + */ + public static void glDeleteTransformFeedbacks(@NativeType("GLuint const *") IntBuffer ids) { + nglDeleteTransformFeedbacks(ids.remaining(), memAddress(ids)); + } + + /** + * Deletes transform feedback objects. + * + * @see Reference Page + */ + public static void glDeleteTransformFeedbacks(@NativeType("GLuint const *") int id) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.ints(id); + nglDeleteTransformFeedbacks(1, memAddress(ids)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenTransformFeedbacks ] --- + + /** + * Unsafe version of: {@link #glGenTransformFeedbacks GenTransformFeedbacks} + * + * @param n the number of transform feedback object names to reserve + */ + public static native void nglGenTransformFeedbacks(int n, long ids); + + /** + * Reserves transform feedback object names. + * + * @param ids an array of into which the reserved names will be written + * + * @see Reference Page + */ + public static void glGenTransformFeedbacks(@NativeType("GLuint *") IntBuffer ids) { + nglGenTransformFeedbacks(ids.remaining(), memAddress(ids)); + } + + /** + * Reserves transform feedback object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenTransformFeedbacks() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.callocInt(1); + nglGenTransformFeedbacks(1, memAddress(ids)); + return ids.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsTransformFeedback ] --- + + /** + * Determines if a name corresponds to a transform feedback object. + * + * @param id a value that may be the name of a transform feedback object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsTransformFeedback(@NativeType("GLuint") int id); + + // --- [ glPauseTransformFeedback ] --- + + /** + * Pauses transform feedback operations for the currently bound transform feedback object. + * + *

    When transform feedback operations are paused, transform feedback is still considered active and changing most transform feedback state related to the + * object results in an error. However, a new transform feedback object may be bound while transform feedback is paused. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} + * is generated by PauseTransformFeedback if the currently bound transform feedback is not active or is paused.

    + * + *

    When transform feedback is active and not paused, all geometric primitives generated must be compatible with the value of {@code primitiveMode} passed + * to {@link GL30C#glBeginTransformFeedback BeginTransformFeedback}. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by {@link GL11#glBegin Begin} or any operation that implicitly calls {@link GL11#glBegin Begin} + * (such as {@link GL11C#glDrawElements DrawElements}) if {@code mode} is not one of the allowed modes. If a geometry shader is active, its output primitive type is used instead + * of the {@code mode} parameter passed to {@link GL11#glBegin Begin} for the purposes of this error check. Any primitive type may be used while transform feedback is + * paused.

    + * + * @see Reference Page + */ + public static native void glPauseTransformFeedback(); + + // --- [ glResumeTransformFeedback ] --- + + /** + * Resumes transform feedback operations for the currently bound transform feedback object. + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by {@link #glResumeTransformFeedback ResumeTransformFeedback} if the currently bound transform feedback is not active or is not paused.

    + * + * @see Reference Page + */ + public static native void glResumeTransformFeedback(); + + // --- [ glDrawTransformFeedback ] --- + + /** + * Render primitives using a count derived from a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link #GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + * + * @see Reference Page + */ + public static native void glDrawTransformFeedback(@NativeType("GLenum") int mode, @NativeType("GLuint") int id); + + // --- [ glDrawTransformFeedbackStream ] --- + + /** + * Renders primitives using a count derived from a specifed stream of a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link #GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + * @param stream the index of the transform feedback stream from which to retrieve a primitive count + * + * @see Reference Page + */ + public static native void glDrawTransformFeedbackStream(@NativeType("GLenum") int mode, @NativeType("GLuint") int id, @NativeType("GLuint") int stream); + + // --- [ glBeginQueryIndexed ] --- + + /** + * Begins a query object on an indexed target + * + * @param target the target type of query object established between {@code glBeginQueryIndexed} and the subsequent {@link #glEndQueryIndexed EndQueryIndexed}. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query target upon which to begin the query + * @param id the name of a query object + * + * @see Reference Page + */ + public static native void glBeginQueryIndexed(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int id); + + // --- [ glEndQueryIndexed ] --- + + /** + * Ends a query object on an indexed target + * + * @param target the target type of query object to be concluded. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query target upon which to end the query + * + * @see Reference Page + */ + public static native void glEndQueryIndexed(@NativeType("GLenum") int target, @NativeType("GLuint") int index); + + // --- [ glGetQueryIndexediv ] --- + + /** Unsafe version of: {@link #glGetQueryIndexediv GetQueryIndexediv} */ + public static native void nglGetQueryIndexediv(int target, int index, int pname, long params); + + /** + * Returns parameters of an indexed query object target. + * + * @param target a query object target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query object target + * @param pname the symbolic name of a query object target parameter + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetQueryIndexediv(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetQueryIndexediv(target, index, pname, memAddress(params)); + } + + /** + * Returns parameters of an indexed query object target. + * + * @param target a query object target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param index the index of the query object target + * @param pname the symbolic name of a query object target parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetQueryIndexedi(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetQueryIndexediv(target, index, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Array version of: {@link #glDrawArraysIndirect DrawArraysIndirect} + * + * @see Reference Page + */ + public static void glDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") int[] indirect) { + long __functionAddress = GL.getICD().glDrawArraysIndirect; + if (CHECKS) { + check(__functionAddress); + check(indirect, (4 * 4) >> 2); + } + callPV(mode, indirect, __functionAddress); + } + + /** + * Array version of: {@link #glDrawElementsIndirect DrawElementsIndirect} + * + * @see Reference Page + */ + public static void glDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") int[] indirect) { + long __functionAddress = GL.getICD().glDrawElementsIndirect; + if (CHECKS) { + check(__functionAddress); + check(indirect, (5 * 4) >> 2); + } + callPV(mode, type, indirect, __functionAddress); + } + + /** + * Array version of: {@link #glUniform1dv Uniform1dv} + * + * @see Reference Page + */ + public static void glUniform1dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniform1dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform2dv Uniform2dv} + * + * @see Reference Page + */ + public static void glUniform2dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniform2dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 1, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform3dv Uniform3dv} + * + * @see Reference Page + */ + public static void glUniform3dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniform3dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 3, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniform4dv Uniform4dv} + * + * @see Reference Page + */ + public static void glUniform4dv(@NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniform4dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix2dv UniformMatrix2dv} + * + * @see Reference Page + */ + public static void glUniformMatrix2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniformMatrix2dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix3dv UniformMatrix3dv} + * + * @see Reference Page + */ + public static void glUniformMatrix3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniformMatrix3dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 9, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix4dv UniformMatrix4dv} + * + * @see Reference Page + */ + public static void glUniformMatrix4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniformMatrix4dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 4, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix2x3dv UniformMatrix2x3dv} + * + * @see Reference Page + */ + public static void glUniformMatrix2x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniformMatrix2x3dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 6, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix2x4dv UniformMatrix2x4dv} + * + * @see Reference Page + */ + public static void glUniformMatrix2x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniformMatrix2x4dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 3, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix3x2dv UniformMatrix3x2dv} + * + * @see Reference Page + */ + public static void glUniformMatrix3x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniformMatrix3x2dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 6, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix3x4dv UniformMatrix3x4dv} + * + * @see Reference Page + */ + public static void glUniformMatrix3x4dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniformMatrix3x4dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 12, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix4x2dv UniformMatrix4x2dv} + * + * @see Reference Page + */ + public static void glUniformMatrix4x2dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniformMatrix4x2dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 3, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glUniformMatrix4x3dv UniformMatrix4x3dv} + * + * @see Reference Page + */ + public static void glUniformMatrix4x3dv(@NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glUniformMatrix4x3dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 12, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glGetUniformdv GetUniformdv} + * + * @see Reference Page + */ + public static void glGetUniformdv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetUniformdv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, location, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetActiveSubroutineUniformiv GetActiveSubroutineUniformiv} + * + * @see Reference Page + */ + public static void glGetActiveSubroutineUniformiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] values) { + long __functionAddress = GL.getICD().glGetActiveSubroutineUniformiv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + callPV(program, shadertype, index, pname, values, __functionAddress); + } + + /** + * Array version of: {@link #glGetActiveSubroutineUniformName GetActiveSubroutineUniformName} + * + * @see Reference Page + */ + public static void glGetActiveSubroutineUniformName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer name) { + long __functionAddress = GL.getICD().glGetActiveSubroutineUniformName; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(program, shadertype, index, name.remaining(), length, memAddress(name), __functionAddress); + } + + /** + * Array version of: {@link #glGetActiveSubroutineName GetActiveSubroutineName} + * + * @see Reference Page + */ + public static void glGetActiveSubroutineName(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer name) { + long __functionAddress = GL.getICD().glGetActiveSubroutineName; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(program, shadertype, index, name.remaining(), length, memAddress(name), __functionAddress); + } + + /** + * Array version of: {@link #glUniformSubroutinesuiv UniformSubroutinesuiv} + * + * @see Reference Page + */ + public static void glUniformSubroutinesuiv(@NativeType("GLenum") int shadertype, @NativeType("GLuint const *") int[] indices) { + long __functionAddress = GL.getICD().glUniformSubroutinesuiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(shadertype, indices.length, indices, __functionAddress); + } + + /** + * Array version of: {@link #glGetUniformSubroutineuiv GetUniformSubroutineuiv} + * + * @see Reference Page + */ + public static void glGetUniformSubroutineuiv(@NativeType("GLenum") int shadertype, @NativeType("GLint") int location, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetUniformSubroutineuiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(shadertype, location, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetProgramStageiv GetProgramStageiv} + * + * @see Reference Page + */ + public static void glGetProgramStageiv(@NativeType("GLuint") int program, @NativeType("GLenum") int shadertype, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] values) { + long __functionAddress = GL.getICD().glGetProgramStageiv; + if (CHECKS) { + check(__functionAddress); + check(values, 1); + } + callPV(program, shadertype, pname, values, __functionAddress); + } + + /** + * Array version of: {@link #glPatchParameterfv PatchParameterfv} + * + * @see Reference Page + */ + public static void glPatchParameterfv(@NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] values) { + long __functionAddress = GL.getICD().glPatchParameterfv; + if (CHECKS) { + check(__functionAddress); + if (DEBUG) { + check(values, GL11.glGetInteger(GL_PATCH_VERTICES)); + } + } + callPV(pname, values, __functionAddress); + } + + /** + * Array version of: {@link #glDeleteTransformFeedbacks DeleteTransformFeedbacks} + * + * @see Reference Page + */ + public static void glDeleteTransformFeedbacks(@NativeType("GLuint const *") int[] ids) { + long __functionAddress = GL.getICD().glDeleteTransformFeedbacks; + if (CHECKS) { + check(__functionAddress); + } + callPV(ids.length, ids, __functionAddress); + } + + /** + * Array version of: {@link #glGenTransformFeedbacks GenTransformFeedbacks} + * + * @see Reference Page + */ + public static void glGenTransformFeedbacks(@NativeType("GLuint *") int[] ids) { + long __functionAddress = GL.getICD().glGenTransformFeedbacks; + if (CHECKS) { + check(__functionAddress); + } + callPV(ids.length, ids, __functionAddress); + } + + /** + * Array version of: {@link #glGetQueryIndexediv GetQueryIndexediv} + * + * @see Reference Page + */ + public static void glGetQueryIndexediv(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetQueryIndexediv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, index, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL41.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL41.java new file mode 100644 index 000000000..cbbc3688c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL41.java @@ -0,0 +1,2628 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 4.1. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 4.1 implementations support revision 4.10 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL41 extends GL40 { + + static { GL.initialize(); } + + /** Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_SHADER_COMPILER = 0x8DFA, + GL_SHADER_BINARY_FORMATS = 0x8DF8, + GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9, + GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB, + GL_MAX_VARYING_VECTORS = 0x8DFC, + GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD, + GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A, + GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B; + + /** Accepted by the {@code type} parameter of VertexAttribPointer. */ + public static final int GL_FIXED = 0x140C; + + /** Accepted by the {@code precisiontype} parameter of GetShaderPrecisionFormat. */ + public static final int + GL_LOW_FLOAT = 0x8DF0, + GL_MEDIUM_FLOAT = 0x8DF1, + GL_HIGH_FLOAT = 0x8DF2, + GL_LOW_INT = 0x8DF3, + GL_MEDIUM_INT = 0x8DF4, + GL_HIGH_INT = 0x8DF5; + + /** Accepted by the {@code format} parameter of most commands taking sized internal formats. */ + public static final int GL_RGB565 = 0x8D62; + + /** Accepted by the {@code pname} parameter of ProgramParameteri and GetProgramiv. */ + public static final int GL_PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_PROGRAM_BINARY_LENGTH = 0x8741; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv and GetDoublev. */ + public static final int + GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE, + GL_PROGRAM_BINARY_FORMATS = 0x87FF; + + /** Accepted by {@code stages} parameter to UseProgramStages. */ + public static final int + GL_VERTEX_SHADER_BIT = 0x1, + GL_FRAGMENT_SHADER_BIT = 0x2, + GL_GEOMETRY_SHADER_BIT = 0x4, + GL_TESS_CONTROL_SHADER_BIT = 0x8, + GL_TESS_EVALUATION_SHADER_BIT = 0x10, + GL_ALL_SHADER_BITS = 0xFFFFFFFF; + + /** Accepted by the {@code pname} parameter of ProgramParameteri and GetProgramiv. */ + public static final int GL_PROGRAM_SEPARABLE = 0x8258; + + /** Accepted by {@code type} parameter to GetProgramPipelineiv. */ + public static final int GL_ACTIVE_PROGRAM = 0x8259; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_PROGRAM_PIPELINE_BINDING = 0x825A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev and GetInteger64v. */ + public static final int + GL_MAX_VIEWPORTS = 0x825B, + GL_VIEWPORT_SUBPIXEL_BITS = 0x825C, + GL_VIEWPORT_BOUNDS_RANGE = 0x825D, + GL_LAYER_PROVOKING_VERTEX = 0x825E, + GL_VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F; + + /** Returned in the {@code data} parameter from a Get query with a {@code pname} of LAYER_PROVOKING_VERTEX or VIEWPORT_INDEX_PROVOKING_VERTEX. */ + public static final int GL_UNDEFINED_VERTEX = 0x8260; + + protected GL41() { + throw new UnsupportedOperationException(); + } + + // --- [ glReleaseShaderCompiler ] --- + + /** + * Releases resources allocated by the shader compiler. This is a hint from the application, and does not prevent later use of the shader compiler. + * + * @see Reference Page + */ + public static void glReleaseShaderCompiler() { + GL41C.glReleaseShaderCompiler(); + } + + // --- [ glShaderBinary ] --- + + /** + * Unsafe version of: {@link #glShaderBinary ShaderBinary} + * + * @param count the number of shader object handles contained in {@code shaders} + * @param length the length of the array whose address is given in binary + */ + public static void nglShaderBinary(int count, long shaders, int binaryformat, long binary, int length) { + GL41C.nglShaderBinary(count, shaders, binaryformat, binary, length); + } + + /** + * Loads pre-compiled shader binaries. + * + * @param shaders an array of shader handles into which to load pre-compiled shader binaries + * @param binaryformat the format of the shader binaries contained in {@code binary} + * @param binary an array of bytes containing pre-compiled binary shader code + * + * @see Reference Page + */ + public static void glShaderBinary(@NativeType("GLuint const *") IntBuffer shaders, @NativeType("GLenum") int binaryformat, @NativeType("void const *") ByteBuffer binary) { + GL41C.glShaderBinary(shaders, binaryformat, binary); + } + + // --- [ glGetShaderPrecisionFormat ] --- + + /** Unsafe version of: {@link #glGetShaderPrecisionFormat GetShaderPrecisionFormat} */ + public static void nglGetShaderPrecisionFormat(int shadertype, int precisiontype, long range, long precision) { + GL41C.nglGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); + } + + /** + * Retrieves the range and precision for numeric formats supported by the shader compiler. + * + * @param shadertype the type of shader whose precision to query. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}
    + * @param precisiontype the numeric format whose precision and range to query + * @param range the address of array of two integers into which encodings of the implementation's numeric range are returned + * @param precision the address of an integer into which the numeric precision of the implementation is written + * + * @see Reference Page + */ + public static void glGetShaderPrecisionFormat(@NativeType("GLenum") int shadertype, @NativeType("GLenum") int precisiontype, @NativeType("GLint *") IntBuffer range, @NativeType("GLint *") IntBuffer precision) { + GL41C.glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); + } + + /** + * Retrieves the range and precision for numeric formats supported by the shader compiler. + * + * @param shadertype the type of shader whose precision to query. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}
    + * @param precisiontype the numeric format whose precision and range to query + * @param range the address of array of two integers into which encodings of the implementation's numeric range are returned + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetShaderPrecisionFormat(@NativeType("GLenum") int shadertype, @NativeType("GLenum") int precisiontype, @NativeType("GLint *") IntBuffer range) { + return GL41C.glGetShaderPrecisionFormat(shadertype, precisiontype, range); + } + + // --- [ glDepthRangef ] --- + + /** + * Specifies mapping of depth values from normalized device coordinates to window coordinates + * + * @param zNear the mapping of the near clipping plane to window coordinates. The initial value is 0.0f. + * @param zFar the mapping of the far clipping plane to window coordinates. The initial value is 1.0f. + * + * @see Reference Page + */ + public static void glDepthRangef(@NativeType("GLfloat") float zNear, @NativeType("GLfloat") float zFar) { + GL41C.glDepthRangef(zNear, zFar); + } + + // --- [ glClearDepthf ] --- + + /** + * Specifies the clear value for the depth buffer + * + * @param depth the depth value used when the depth buffer is cleared. The initial value is 1.0f. + * + * @see Reference Page + */ + public static void glClearDepthf(@NativeType("GLfloat") float depth) { + GL41C.glClearDepthf(depth); + } + + // --- [ glGetProgramBinary ] --- + + /** + * Unsafe version of: {@link #glGetProgramBinary GetProgramBinary} + * + * @param bufSize the size of the buffer whose address is given by {@code binary} + */ + public static void nglGetProgramBinary(int program, int bufSize, long length, long binaryFormat, long binary) { + GL41C.nglGetProgramBinary(program, bufSize, length, binaryFormat, binary); + } + + /** + * Returns a binary representation of a program object's compiled and linked executable source. + * + * @param program the name of a program object whose binary representation to retrieve + * @param length the address of a variable to receive the number of bytes written into {@code binary} + * @param binaryFormat a variable to receive a token indicating the format of the binary data returned by the GL + * @param binary an array into which the GL will return {@code program}'s binary representation + * + * @see Reference Page + */ + public static void glGetProgramBinary(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLenum *") IntBuffer binaryFormat, @NativeType("void *") ByteBuffer binary) { + GL41C.glGetProgramBinary(program, length, binaryFormat, binary); + } + + // --- [ glProgramBinary ] --- + + /** + * Unsafe version of: {@link #glProgramBinary ProgramBinary} + * + * @param length the number of bytes contained in {@code binary} + */ + public static void nglProgramBinary(int program, int binaryFormat, long binary, int length) { + GL41C.nglProgramBinary(program, binaryFormat, binary, length); + } + + /** + * Loads a program object with a program binary. + * + * @param program the name of a program object into which to load a program binary + * @param binaryFormat the format of the binary data in binary + * @param binary an array containing the binary to be loaded into {@code program} + * + * @see Reference Page + */ + public static void glProgramBinary(@NativeType("GLuint") int program, @NativeType("GLenum") int binaryFormat, @NativeType("void const *") ByteBuffer binary) { + GL41C.glProgramBinary(program, binaryFormat, binary); + } + + // --- [ glProgramParameteri ] --- + + /** + * Specifies the integer value of a program object parameter. + * + * @param program the name of a program object whose parameter to modify + * @param pname the name of the parameter to modify. One of:
    {@link GL41C#GL_PROGRAM_BINARY_RETRIEVABLE_HINT PROGRAM_BINARY_RETRIEVABLE_HINT}{@link GL41C#GL_PROGRAM_SEPARABLE PROGRAM_SEPARABLE}
    + * @param value the new value of the parameter specified by {@code pname} for {@code program} + * + * @see Reference Page + */ + public static void glProgramParameteri(@NativeType("GLuint") int program, @NativeType("GLenum") int pname, @NativeType("GLint") int value) { + GL41C.glProgramParameteri(program, pname, value); + } + + // --- [ glUseProgramStages ] --- + + /** + * Binds stages of a program object to a program pipeline. + * + * @param pipeline the program pipeline object to which to bind stages from {@code program} + * @param stages a set of program stages to bind to the program pipeline object + * @param program the program object containing the shader executables to use in {@code pipeline} + * + * @see Reference Page + */ + public static void glUseProgramStages(@NativeType("GLuint") int pipeline, @NativeType("GLbitfield") int stages, @NativeType("GLuint") int program) { + GL41C.glUseProgramStages(pipeline, stages, program); + } + + // --- [ glActiveShaderProgram ] --- + + /** + * Sets the active program object for a program pipeline object. + * + * @param pipeline the program pipeline object to set the active program object for + * @param program the program object to set as the active program pipeline object {@code pipeline} + * + * @see Reference Page + */ + public static void glActiveShaderProgram(@NativeType("GLuint") int pipeline, @NativeType("GLuint") int program) { + GL41C.glActiveShaderProgram(pipeline, program); + } + + // --- [ glCreateShaderProgramv ] --- + + /** + * Unsafe version of: {@link #glCreateShaderProgramv CreateShaderProgramv} + * + * @param count the number of source code strings in the array {@code strings} + */ + public static int nglCreateShaderProgramv(int type, int count, long strings) { + return GL41C.nglCreateShaderProgramv(type, count, strings); + } + + /** + * Creates a stand-alone program from an array of null-terminated source code strings. + * + *

    {@code glCreateShaderProgram} is equivalent (assuming no errors are generated) to:

    + * + *
    
    +     * const GLuint shader = glCreateShader(type);
    +     * if (shader) {
    +     *     glShaderSource(shader, count, strings, NULL);
    +     *     glCompileShader(shader);
    +     *     const GLuint program = glCreateProgram();
    +     *     if (program) {
    +     *         GLint compiled = GL_FALSE;
    +     *         glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    +     *         glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
    +     *         if (compiled) {
    +     *             glAttachShader(program, shader);
    +     *             glLinkProgram(program);
    +     *             glDetachShader(program, shader);
    +     *         }
    +     *         // append-shader-info-log-to-program-info-log
    +     *     }
    +     *     glDeleteShader(shader);
    +     *     return program;
    +     * } else {
    +     *     return 0;
    +     * }
    + * + *

    The program object created by glCreateShaderProgram has its GL_PROGRAM_SEPARABLE status set to GL_TRUE.

    + * + * @param type the type of shader to create + * @param strings an array of pointers to source code strings from which to create the program object + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glCreateShaderProgramv(@NativeType("GLenum") int type, @NativeType("GLchar const * const *") PointerBuffer strings) { + return GL41C.glCreateShaderProgramv(type, strings); + } + + /** + * Creates a stand-alone program from an array of null-terminated source code strings. + * + *

    {@code glCreateShaderProgram} is equivalent (assuming no errors are generated) to:

    + * + *
    
    +     * const GLuint shader = glCreateShader(type);
    +     * if (shader) {
    +     *     glShaderSource(shader, count, strings, NULL);
    +     *     glCompileShader(shader);
    +     *     const GLuint program = glCreateProgram();
    +     *     if (program) {
    +     *         GLint compiled = GL_FALSE;
    +     *         glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    +     *         glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
    +     *         if (compiled) {
    +     *             glAttachShader(program, shader);
    +     *             glLinkProgram(program);
    +     *             glDetachShader(program, shader);
    +     *         }
    +     *         // append-shader-info-log-to-program-info-log
    +     *     }
    +     *     glDeleteShader(shader);
    +     *     return program;
    +     * } else {
    +     *     return 0;
    +     * }
    + * + *

    The program object created by glCreateShaderProgram has its GL_PROGRAM_SEPARABLE status set to GL_TRUE.

    + * + * @param type the type of shader to create + * @param strings an array of pointers to source code strings from which to create the program object + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glCreateShaderProgramv(@NativeType("GLenum") int type, @NativeType("GLchar const * const *") CharSequence... strings) { + return GL41C.glCreateShaderProgramv(type, strings); + } + + /** + * Creates a stand-alone program from an array of null-terminated source code strings. + * + *

    {@code glCreateShaderProgram} is equivalent (assuming no errors are generated) to:

    + * + *
    
    +     * const GLuint shader = glCreateShader(type);
    +     * if (shader) {
    +     *     glShaderSource(shader, count, strings, NULL);
    +     *     glCompileShader(shader);
    +     *     const GLuint program = glCreateProgram();
    +     *     if (program) {
    +     *         GLint compiled = GL_FALSE;
    +     *         glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    +     *         glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
    +     *         if (compiled) {
    +     *             glAttachShader(program, shader);
    +     *             glLinkProgram(program);
    +     *             glDetachShader(program, shader);
    +     *         }
    +     *         // append-shader-info-log-to-program-info-log
    +     *     }
    +     *     glDeleteShader(shader);
    +     *     return program;
    +     * } else {
    +     *     return 0;
    +     * }
    + * + *

    The program object created by glCreateShaderProgram has its GL_PROGRAM_SEPARABLE status set to GL_TRUE.

    + * + * @param type the type of shader to create + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glCreateShaderProgramv(@NativeType("GLenum") int type, @NativeType("GLchar const * const *") CharSequence string) { + return GL41C.glCreateShaderProgramv(type, string); + } + + // --- [ glBindProgramPipeline ] --- + + /** + * Binds a program pipeline to the current context. + * + * @param pipeline the name of the pipeline object to bind to the context + * + * @see Reference Page + */ + public static void glBindProgramPipeline(@NativeType("GLuint") int pipeline) { + GL41C.glBindProgramPipeline(pipeline); + } + + // --- [ glDeleteProgramPipelines ] --- + + /** + * Unsafe version of: {@link #glDeleteProgramPipelines DeleteProgramPipelines} + * + * @param n the number of program pipeline objects to delete + */ + public static void nglDeleteProgramPipelines(int n, long pipelines) { + GL41C.nglDeleteProgramPipelines(n, pipelines); + } + + /** + * Deletes program pipeline objects. + * + * @param pipelines an array of names of program pipeline objects to delete + * + * @see Reference Page + */ + public static void glDeleteProgramPipelines(@NativeType("GLuint const *") IntBuffer pipelines) { + GL41C.glDeleteProgramPipelines(pipelines); + } + + /** + * Deletes program pipeline objects. + * + * @see Reference Page + */ + public static void glDeleteProgramPipelines(@NativeType("GLuint const *") int pipeline) { + GL41C.glDeleteProgramPipelines(pipeline); + } + + // --- [ glGenProgramPipelines ] --- + + /** + * Unsafe version of: {@link #glGenProgramPipelines GenProgramPipelines} + * + * @param n the number of program pipeline object names to reserve + */ + public static void nglGenProgramPipelines(int n, long pipelines) { + GL41C.nglGenProgramPipelines(n, pipelines); + } + + /** + * Reserves program pipeline object names. + * + * @param pipelines an array of into which the reserved names will be written + * + * @see Reference Page + */ + public static void glGenProgramPipelines(@NativeType("GLuint *") IntBuffer pipelines) { + GL41C.glGenProgramPipelines(pipelines); + } + + /** + * Reserves program pipeline object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenProgramPipelines() { + return GL41C.glGenProgramPipelines(); + } + + // --- [ glIsProgramPipeline ] --- + + /** + * Determines if a name corresponds to a program pipeline object. + * + * @param pipeline a value that may be the name of a program pipeline object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glIsProgramPipeline(@NativeType("GLuint") int pipeline) { + return GL41C.glIsProgramPipeline(pipeline); + } + + // --- [ glGetProgramPipelineiv ] --- + + /** Unsafe version of: {@link #glGetProgramPipelineiv GetProgramPipelineiv} */ + public static void nglGetProgramPipelineiv(int pipeline, int pname, long params) { + GL41C.nglGetProgramPipelineiv(pipeline, pname, params); + } + + /** + * Retrieves properties of a program pipeline object. + * + * @param pipeline the name of a program pipeline object whose parameter retrieve + * @param pname the name of the parameter to retrieve. One of:
    {@link GL41C#GL_ACTIVE_PROGRAM ACTIVE_PROGRAM}{@link GL20#GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}
    {@link GL40#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}{@link GL40#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param params a variable into which will be written the value or values of {@code pname} for {@code pipeline} + * + * @see Reference Page + */ + public static void glGetProgramPipelineiv(@NativeType("GLuint") int pipeline, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL41C.glGetProgramPipelineiv(pipeline, pname, params); + } + + /** + * Retrieves properties of a program pipeline object. + * + * @param pipeline the name of a program pipeline object whose parameter retrieve + * @param pname the name of the parameter to retrieve. One of:
    {@link GL41C#GL_ACTIVE_PROGRAM ACTIVE_PROGRAM}{@link GL20#GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}
    {@link GL40#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}{@link GL40#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetProgramPipelinei(@NativeType("GLuint") int pipeline, @NativeType("GLenum") int pname) { + return GL41C.glGetProgramPipelinei(pipeline, pname); + } + + // --- [ glProgramUniform1i ] --- + + /** + * Specifies the value of an int uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * + * @see Reference Page + */ + public static void glProgramUniform1i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x) { + GL41C.glProgramUniform1i(program, location, x); + } + + // --- [ glProgramUniform2i ] --- + + /** + * Specifies the value of an ivec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * + * @see Reference Page + */ + public static void glProgramUniform2i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x, @NativeType("GLint") int y) { + GL41C.glProgramUniform2i(program, location, x, y); + } + + // --- [ glProgramUniform3i ] --- + + /** + * Specifies the value of an ivec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * + * @see Reference Page + */ + public static void glProgramUniform3i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z) { + GL41C.glProgramUniform3i(program, location, x, y, z); + } + + // --- [ glProgramUniform4i ] --- + + /** + * Specifies the value of an ivec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + * + * @see Reference Page + */ + public static void glProgramUniform4i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w) { + GL41C.glProgramUniform4i(program, location, x, y, z, w); + } + + // --- [ glProgramUniform1ui ] --- + + /** + * Specifies the value of a uint uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * + * @see Reference Page + */ + public static void glProgramUniform1ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x) { + GL41C.glProgramUniform1ui(program, location, x); + } + + // --- [ glProgramUniform2ui ] --- + + /** + * Specifies the value of a uvec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * + * @see Reference Page + */ + public static void glProgramUniform2ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x, @NativeType("GLuint") int y) { + GL41C.glProgramUniform2ui(program, location, x, y); + } + + // --- [ glProgramUniform3ui ] --- + + /** + * Specifies the value of a uvec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * + * @see Reference Page + */ + public static void glProgramUniform3ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x, @NativeType("GLuint") int y, @NativeType("GLuint") int z) { + GL41C.glProgramUniform3ui(program, location, x, y, z); + } + + // --- [ glProgramUniform4ui ] --- + + /** + * Specifies the value of a uvec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + * + * @see Reference Page + */ + public static void glProgramUniform4ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x, @NativeType("GLuint") int y, @NativeType("GLuint") int z, @NativeType("GLuint") int w) { + GL41C.glProgramUniform4ui(program, location, x, y, z, w); + } + + // --- [ glProgramUniform1f ] --- + + /** + * Specifies the value of a float uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * + * @see Reference Page + */ + public static void glProgramUniform1f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x) { + GL41C.glProgramUniform1f(program, location, x); + } + + // --- [ glProgramUniform2f ] --- + + /** + * Specifies the value of a vec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * + * @see Reference Page + */ + public static void glProgramUniform2f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y) { + GL41C.glProgramUniform2f(program, location, x, y); + } + + // --- [ glProgramUniform3f ] --- + + /** + * Specifies the value of a vec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * + * @see Reference Page + */ + public static void glProgramUniform3f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z) { + GL41C.glProgramUniform3f(program, location, x, y, z); + } + + // --- [ glProgramUniform4f ] --- + + /** + * Specifies the value of a vec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + * + * @see Reference Page + */ + public static void glProgramUniform4f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z, @NativeType("GLfloat") float w) { + GL41C.glProgramUniform4f(program, location, x, y, z, w); + } + + // --- [ glProgramUniform1d ] --- + + /** + * Specifies the value of a double uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * + * @see Reference Page + */ + public static void glProgramUniform1d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x) { + GL41C.glProgramUniform1d(program, location, x); + } + + // --- [ glProgramUniform2d ] --- + + /** + * Specifies the value of a dvec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * + * @see Reference Page + */ + public static void glProgramUniform2d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y) { + GL41C.glProgramUniform2d(program, location, x, y); + } + + // --- [ glProgramUniform3d ] --- + + /** + * Specifies the value of a dvec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * + * @see Reference Page + */ + public static void glProgramUniform3d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z) { + GL41C.glProgramUniform3d(program, location, x, y, z); + } + + // --- [ glProgramUniform4d ] --- + + /** + * Specifies the value of a dvec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + * + * @see Reference Page + */ + public static void glProgramUniform4d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w) { + GL41C.glProgramUniform4d(program, location, x, y, z, w); + } + + // --- [ glProgramUniform1iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1iv ProgramUniform1iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform1iv(int program, int location, int count, long value) { + GL41C.nglProgramUniform1iv(program, location, count, value); + } + + /** + * Specifies the value of a single float uniform variable or a float uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform1iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL41C.glProgramUniform1iv(program, location, value); + } + + // --- [ glProgramUniform2iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2iv ProgramUniform2iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform2iv(int program, int location, int count, long value) { + GL41C.nglProgramUniform2iv(program, location, count, value); + } + + /** + * Specifies the value of a single ivec2 uniform variable or an ivec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform2iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL41C.glProgramUniform2iv(program, location, value); + } + + // --- [ glProgramUniform3iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3iv ProgramUniform3iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform3iv(int program, int location, int count, long value) { + GL41C.nglProgramUniform3iv(program, location, count, value); + } + + /** + * Specifies the value of a single ivec3 uniform variable or an ivec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform3iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL41C.glProgramUniform3iv(program, location, value); + } + + // --- [ glProgramUniform4iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4iv ProgramUniform4iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform4iv(int program, int location, int count, long value) { + GL41C.nglProgramUniform4iv(program, location, count, value); + } + + /** + * Specifies the value of a single ivec4 uniform variable or an ivec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform4iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + GL41C.glProgramUniform4iv(program, location, value); + } + + // --- [ glProgramUniform1uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1uiv ProgramUniform1uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform1uiv(int program, int location, int count, long value) { + GL41C.nglProgramUniform1uiv(program, location, count, value); + } + + /** + * Specifies the value of a single uint uniform variable or a uint uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform1uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL41C.glProgramUniform1uiv(program, location, value); + } + + // --- [ glProgramUniform2uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2uiv ProgramUniform2uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform2uiv(int program, int location, int count, long value) { + GL41C.nglProgramUniform2uiv(program, location, count, value); + } + + /** + * Specifies the value of a single uvec2 uniform variable or a uvec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform2uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL41C.glProgramUniform2uiv(program, location, value); + } + + // --- [ glProgramUniform3uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3uiv ProgramUniform3uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform3uiv(int program, int location, int count, long value) { + GL41C.nglProgramUniform3uiv(program, location, count, value); + } + + /** + * Specifies the value of a single uvec3 uniform variable or a uvec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform3uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL41C.glProgramUniform3uiv(program, location, value); + } + + // --- [ glProgramUniform4uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4uiv ProgramUniform4uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform4uiv(int program, int location, int count, long value) { + GL41C.nglProgramUniform4uiv(program, location, count, value); + } + + /** + * Specifies the value of a single uvec4 uniform variable or a uvec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform4uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + GL41C.glProgramUniform4uiv(program, location, value); + } + + // --- [ glProgramUniform1fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1fv ProgramUniform1fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform1fv(int program, int location, int count, long value) { + GL41C.nglProgramUniform1fv(program, location, count, value); + } + + /** + * Specifies the value of a single float uniform variable or a float uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform1fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniform1fv(program, location, value); + } + + // --- [ glProgramUniform2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2fv ProgramUniform2fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform2fv(int program, int location, int count, long value) { + GL41C.nglProgramUniform2fv(program, location, count, value); + } + + /** + * Specifies the value of a single vec2 uniform variable or a vec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniform2fv(program, location, value); + } + + // --- [ glProgramUniform3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3fv ProgramUniform3fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform3fv(int program, int location, int count, long value) { + GL41C.nglProgramUniform3fv(program, location, count, value); + } + + /** + * Specifies the value of a single vec3 uniform variable or a vec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniform3fv(program, location, value); + } + + // --- [ glProgramUniform4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4fv ProgramUniform4fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform4fv(int program, int location, int count, long value) { + GL41C.nglProgramUniform4fv(program, location, count, value); + } + + /** + * Specifies the value of a single vec4 uniform variable or a vec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniform4fv(program, location, value); + } + + // --- [ glProgramUniform1dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1dv ProgramUniform1dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform1dv(int program, int location, int count, long value) { + GL41C.nglProgramUniform1dv(program, location, count, value); + } + + /** + * Specifies the value of a single double uniform variable or a double uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform1dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniform1dv(program, location, value); + } + + // --- [ glProgramUniform2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2dv ProgramUniform2dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform2dv(int program, int location, int count, long value) { + GL41C.nglProgramUniform2dv(program, location, count, value); + } + + /** + * Specifies the value of a single dvec2 uniform variable or a dvec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniform2dv(program, location, value); + } + + // --- [ glProgramUniform3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3dv ProgramUniform3dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform3dv(int program, int location, int count, long value) { + GL41C.nglProgramUniform3dv(program, location, count, value); + } + + /** + * Specifies the value of a single dvec3 uniform variable or a dvec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniform3dv(program, location, value); + } + + // --- [ glProgramUniform4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4dv ProgramUniform4dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static void nglProgramUniform4dv(int program, int location, int count, long value) { + GL41C.nglProgramUniform4dv(program, location, count, value); + } + + /** + * Specifies the value of a single dvec4 uniform variable or a dvec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniform4dv(program, location, value); + } + + // --- [ glProgramUniformMatrix2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2fv ProgramUniformMatrix2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat2 uniform variable or a mat2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix2fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3fv ProgramUniformMatrix3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat3 uniform variable or a mat3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix3fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4fv ProgramUniformMatrix4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat4 uniform variable or a mat4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix4fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2dv ProgramUniformMatrix2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2 uniform variable or a dmat2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix2dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3dv ProgramUniformMatrix3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3 uniform variable or a dmat3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix3dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4dv ProgramUniformMatrix4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4 uniform variable or a dmat4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix4dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix2x3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x3fv ProgramUniformMatrix2x3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2x3fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2x3fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat2x3 uniform variable or a mat2x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix2x3fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3x2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x2fv ProgramUniformMatrix3x2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3x2fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3x2fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat3x2 uniform variable or a mat3x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix3x2fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix2x4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x4fv ProgramUniformMatrix2x4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2x4fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2x4fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat2x4 uniform variable or a mat2x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix2x4fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4x2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x2fv ProgramUniformMatrix4x2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4x2fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4x2fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat4x2 uniform variable or a mat4x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix4x2fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3x4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x4fv ProgramUniformMatrix3x4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3x4fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3x4fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat3x4 uniform variable or a mat3x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix3x4fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4x3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x3fv ProgramUniformMatrix4x3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4x3fv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4x3fv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single mat4x3 uniform variable or a mat4x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + GL41C.glProgramUniformMatrix4x3fv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix2x3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x3dv ProgramUniformMatrix2x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2x3dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2x3dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2x3 uniform variable or a dmat2x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix2x3dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3x2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x2dv ProgramUniformMatrix3x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3x2dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3x2dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3x2 uniform variable or a dmat3x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix3x2dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix2x4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x4dv ProgramUniformMatrix2x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix2x4dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix2x4dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat2x4 uniform variable or a dmat2x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix2x4dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4x2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x2dv ProgramUniformMatrix4x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4x2dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4x2dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4x2 uniform variable or a dmat4x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix4x2dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix3x4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x4dv ProgramUniformMatrix3x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix3x4dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix3x4dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat3x4 uniform variable or a dmat3x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix3x4dv(program, location, transpose, value); + } + + // --- [ glProgramUniformMatrix4x3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x3dv ProgramUniformMatrix4x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static void nglProgramUniformMatrix4x3dv(int program, int location, int count, boolean transpose, long value) { + GL41C.nglProgramUniformMatrix4x3dv(program, location, count, transpose, value); + } + + /** + * Specifies the value of a single dmat4x3 uniform variable or a dmat4x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + GL41C.glProgramUniformMatrix4x3dv(program, location, transpose, value); + } + + // --- [ glValidateProgramPipeline ] --- + + /** + * Validates a program pipeline object against current GL state. + * + * @param pipeline the name of a program pipeline object to validate + * + * @see Reference Page + */ + public static void glValidateProgramPipeline(@NativeType("GLuint") int pipeline) { + GL41C.glValidateProgramPipeline(pipeline); + } + + // --- [ glGetProgramPipelineInfoLog ] --- + + /** + * Unsafe version of: {@link #glGetProgramPipelineInfoLog GetProgramPipelineInfoLog} + * + * @param bufSize the maximum number of characters, including the null terminator, that may be written into {@code infoLog} + */ + public static void nglGetProgramPipelineInfoLog(int pipeline, int bufSize, long length, long infoLog) { + GL41C.nglGetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog); + } + + /** + * Retrieves the info log string from a program pipeline object. + * + * @param pipeline the name of a program pipeline object from which to retrieve the info log + * @param length a variable into which will be written the number of characters written into {@code infoLog} + * @param infoLog an array of characters into which will be written the info log for {@code pipeline} + * + * @see Reference Page + */ + public static void glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer infoLog) { + GL41C.glGetProgramPipelineInfoLog(pipeline, length, infoLog); + } + + /** + * Retrieves the info log string from a program pipeline object. + * + * @param pipeline the name of a program pipeline object from which to retrieve the info log + * @param bufSize the maximum number of characters, including the null terminator, that may be written into {@code infoLog} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline, @NativeType("GLsizei") int bufSize) { + return GL41C.glGetProgramPipelineInfoLog(pipeline, bufSize); + } + + /** + * Retrieves the info log string from a program pipeline object. + * + * @param pipeline the name of a program pipeline object from which to retrieve the info log + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline) { + return glGetProgramPipelineInfoLog(pipeline, glGetProgramPipelinei(pipeline, GL20.GL_INFO_LOG_LENGTH)); + } + + // --- [ glVertexAttribL1d ] --- + + /** + * Specifies the value of a generic vertex attribute. The y and z components are implicitly set to 0.0 and w to 1.0. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * + * @see Reference Page + */ + public static void glVertexAttribL1d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x) { + GL41C.glVertexAttribL1d(index, x); + } + + // --- [ glVertexAttribL2d ] --- + + /** + * Specifies the value of a generic vertex attribute. The y component is implicitly set to 0.0 and w to 1.0. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * + * @see Reference Page + */ + public static void glVertexAttribL2d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y) { + GL41C.glVertexAttribL2d(index, x, y); + } + + // --- [ glVertexAttribL3d ] --- + + /** + * Specifies the value of a generic vertex attribute. The w is implicitly set to 1.0. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * + * @see Reference Page + */ + public static void glVertexAttribL3d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z) { + GL41C.glVertexAttribL3d(index, x, y, z); + } + + // --- [ glVertexAttribL4d ] --- + + /** + * Specifies the value of a generic vertex attribute. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + * + * @see Reference Page + */ + public static void glVertexAttribL4d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w) { + GL41C.glVertexAttribL4d(index, x, y, z, w); + } + + // --- [ glVertexAttribL1dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL1dv VertexAttribL1dv} */ + public static void nglVertexAttribL1dv(int index, long v) { + GL41C.nglVertexAttribL1dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribL1d VertexAttribL1d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribL1dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL41C.glVertexAttribL1dv(index, v); + } + + // --- [ glVertexAttribL2dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL2dv VertexAttribL2dv} */ + public static void nglVertexAttribL2dv(int index, long v) { + GL41C.nglVertexAttribL2dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribL2d VertexAttribL2d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribL2dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL41C.glVertexAttribL2dv(index, v); + } + + // --- [ glVertexAttribL3dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL3dv VertexAttribL3dv} */ + public static void nglVertexAttribL3dv(int index, long v) { + GL41C.nglVertexAttribL3dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribL3d VertexAttribL3d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribL3dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL41C.glVertexAttribL3dv(index, v); + } + + // --- [ glVertexAttribL4dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL4dv VertexAttribL4dv} */ + public static void nglVertexAttribL4dv(int index, long v) { + GL41C.nglVertexAttribL4dv(index, v); + } + + /** + * Pointer version of {@link #glVertexAttribL4d VertexAttribL4d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribL4dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + GL41C.glVertexAttribL4dv(index, v); + } + + // --- [ glVertexAttribLPointer ] --- + + /** + * Unsafe version of: {@link #glVertexAttribLPointer VertexAttribLPointer} + * + * @param type the data type of each component in the array. Must be:
    {@link GL11#GL_DOUBLE DOUBLE}
    + */ + public static void nglVertexAttribLPointer(int index, int size, int type, int stride, long pointer) { + GL41C.nglVertexAttribLPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a 64-bit vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. Must be:
    {@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribLPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + GL41C.glVertexAttribLPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a 64-bit vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. Must be:
    {@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribLPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + GL41C.glVertexAttribLPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a 64-bit vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribLPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLsizei") int stride, @NativeType("void const *") DoubleBuffer pointer) { + GL41C.glVertexAttribLPointer(index, size, stride, pointer); + } + + // --- [ glGetVertexAttribLdv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribLdv GetVertexAttribLdv} */ + public static void nglGetVertexAttribLdv(int index, int pname, long params) { + GL41C.nglGetVertexAttribLdv(index, pname, params); + } + + /** + * Double version of {@link GL20C#glGetVertexAttribiv GetVertexAttribiv}. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribLdv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer params) { + GL41C.glGetVertexAttribLdv(index, pname, params); + } + + // --- [ glViewportArrayv ] --- + + /** + * Unsafe version of: {@link #glViewportArrayv ViewportArrayv} + * + * @param count the number of viewports to set + */ + public static void nglViewportArrayv(int first, int count, long v) { + GL41C.nglViewportArrayv(first, count, v); + } + + /** + * Sets multiple viewports. + * + * @param first the first viewport to set + * @param v an array containing the viewport parameters + * + * @see Reference Page + */ + public static void glViewportArrayv(@NativeType("GLuint") int first, @NativeType("GLfloat const *") FloatBuffer v) { + GL41C.glViewportArrayv(first, v); + } + + // --- [ glViewportIndexedf ] --- + + /** + * Sets a specified viewport. + * + * @param index the viewport to set + * @param x the left viewport coordinate + * @param y the bottom viewport coordinate + * @param w the viewport width + * @param h the viewport height + * + * @see Reference Page + */ + public static void glViewportIndexedf(@NativeType("GLuint") int index, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float w, @NativeType("GLfloat") float h) { + GL41C.glViewportIndexedf(index, x, y, w, h); + } + + // --- [ glViewportIndexedfv ] --- + + /** Unsafe version of: {@link #glViewportIndexedfv ViewportIndexedfv} */ + public static void nglViewportIndexedfv(int index, long v) { + GL41C.nglViewportIndexedfv(index, v); + } + + /** + * Pointer version of {@link #glViewportIndexedf ViewportIndexedf}. + * + * @param index the viewport to set + * @param v the viewport parameters + * + * @see Reference Page + */ + public static void glViewportIndexedfv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + GL41C.glViewportIndexedfv(index, v); + } + + // --- [ glScissorArrayv ] --- + + /** + * Unsafe version of: {@link #glScissorArrayv ScissorArrayv} + * + * @param count the number of scissor boxes to modify + */ + public static void nglScissorArrayv(int first, int count, long v) { + GL41C.nglScissorArrayv(first, count, v); + } + + /** + * Defines the scissor box for multiple viewports. + * + * @param first the index of the first viewport whose scissor box to modify + * @param v an array containing the left, bottom, width and height of each scissor box, in that order + * + * @see Reference Page + */ + public static void glScissorArrayv(@NativeType("GLuint") int first, @NativeType("GLint const *") IntBuffer v) { + GL41C.glScissorArrayv(first, v); + } + + // --- [ glScissorIndexed ] --- + + /** + * Defines the scissor box for a specific viewport. + * + * @param index the index of the viewport whose scissor box to modify + * @param left the left scissor box coordinate + * @param bottom the bottom scissor box coordinate + * @param width the scissor box width + * @param height the scissor box height + * + * @see Reference Page + */ + public static void glScissorIndexed(@NativeType("GLuint") int index, @NativeType("GLint") int left, @NativeType("GLint") int bottom, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL41C.glScissorIndexed(index, left, bottom, width, height); + } + + // --- [ glScissorIndexedv ] --- + + /** Unsafe version of: {@link #glScissorIndexedv ScissorIndexedv} */ + public static void nglScissorIndexedv(int index, long v) { + GL41C.nglScissorIndexedv(index, v); + } + + /** + * Pointer version of {@link #glScissorIndexed ScissorIndexed}. + * + * @param index the index of the viewport whose scissor box to modify + * @param v an array containing the left, bottom, width and height of each scissor box, in that order + * + * @see Reference Page + */ + public static void glScissorIndexedv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + GL41C.glScissorIndexedv(index, v); + } + + // --- [ glDepthRangeArrayv ] --- + + /** + * Unsafe version of: {@link #glDepthRangeArrayv DepthRangeArrayv} + * + * @param count the number of viewports whose depth range to update + */ + public static void nglDepthRangeArrayv(int first, int count, long v) { + GL41C.nglDepthRangeArrayv(first, count, v); + } + + /** + * Specifies mapping of depth values from normalized device coordinates to window coordinates for a specified set of viewports. + * + * @param first the index of the first viewport whose depth range to update + * @param v n array containing the near and far values for the depth range of each modified viewport + * + * @see Reference Page + */ + public static void glDepthRangeArrayv(@NativeType("GLuint") int first, @NativeType("GLdouble const *") DoubleBuffer v) { + GL41C.glDepthRangeArrayv(first, v); + } + + // --- [ glDepthRangeIndexed ] --- + + /** + * Specifies mapping of depth values from normalized device coordinates to window coordinates for a specified viewport. + * + * @param index the index of the viewport whose depth range to update + * @param zNear the mapping of the near clipping plane to window coordinates. The initial value is 0. + * @param zFar the mapping of the far clipping plane to window coordinates. The initial value is 1. + * + * @see Reference Page + */ + public static void glDepthRangeIndexed(@NativeType("GLuint") int index, @NativeType("GLdouble") double zNear, @NativeType("GLdouble") double zFar) { + GL41C.glDepthRangeIndexed(index, zNear, zFar); + } + + // --- [ glGetFloati_v ] --- + + /** Unsafe version of: {@link #glGetFloati_v GetFloati_v} */ + public static void nglGetFloati_v(int target, int index, long data) { + GL41C.nglGetFloati_v(target, index, data); + } + + /** + * Queries the float value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetFloati_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer data) { + GL41C.glGetFloati_v(target, index, data); + } + + /** + * Queries the float value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetFloati(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return GL41C.glGetFloati(target, index); + } + + // --- [ glGetDoublei_v ] --- + + /** Unsafe version of: {@link #glGetDoublei_v GetDoublei_v} */ + public static void nglGetDoublei_v(int target, int index, long data) { + GL41C.nglGetDoublei_v(target, index, data); + } + + /** + * Queries the double value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetDoublei_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") DoubleBuffer data) { + GL41C.glGetDoublei_v(target, index, data); + } + + /** + * Queries the double value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * + * @see Reference Page + */ + @NativeType("void") + public static double glGetDoublei(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + return GL41C.glGetDoublei(target, index); + } + + /** + * Array version of: {@link #glShaderBinary ShaderBinary} + * + * @see Reference Page + */ + public static void glShaderBinary(@NativeType("GLuint const *") int[] shaders, @NativeType("GLenum") int binaryformat, @NativeType("void const *") ByteBuffer binary) { + GL41C.glShaderBinary(shaders, binaryformat, binary); + } + + /** + * Array version of: {@link #glGetShaderPrecisionFormat GetShaderPrecisionFormat} + * + * @see Reference Page + */ + public static void glGetShaderPrecisionFormat(@NativeType("GLenum") int shadertype, @NativeType("GLenum") int precisiontype, @NativeType("GLint *") int[] range, @NativeType("GLint *") int[] precision) { + GL41C.glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); + } + + /** + * Array version of: {@link #glGetProgramBinary GetProgramBinary} + * + * @see Reference Page + */ + public static void glGetProgramBinary(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLenum *") int[] binaryFormat, @NativeType("void *") ByteBuffer binary) { + GL41C.glGetProgramBinary(program, length, binaryFormat, binary); + } + + /** + * Array version of: {@link #glDeleteProgramPipelines DeleteProgramPipelines} + * + * @see Reference Page + */ + public static void glDeleteProgramPipelines(@NativeType("GLuint const *") int[] pipelines) { + GL41C.glDeleteProgramPipelines(pipelines); + } + + /** + * Array version of: {@link #glGenProgramPipelines GenProgramPipelines} + * + * @see Reference Page + */ + public static void glGenProgramPipelines(@NativeType("GLuint *") int[] pipelines) { + GL41C.glGenProgramPipelines(pipelines); + } + + /** + * Array version of: {@link #glGetProgramPipelineiv GetProgramPipelineiv} + * + * @see Reference Page + */ + public static void glGetProgramPipelineiv(@NativeType("GLuint") int pipeline, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL41C.glGetProgramPipelineiv(pipeline, pname, params); + } + + /** + * Array version of: {@link #glProgramUniform1iv ProgramUniform1iv} + * + * @see Reference Page + */ + public static void glProgramUniform1iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL41C.glProgramUniform1iv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform2iv ProgramUniform2iv} + * + * @see Reference Page + */ + public static void glProgramUniform2iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL41C.glProgramUniform2iv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform3iv ProgramUniform3iv} + * + * @see Reference Page + */ + public static void glProgramUniform3iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL41C.glProgramUniform3iv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform4iv ProgramUniform4iv} + * + * @see Reference Page + */ + public static void glProgramUniform4iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + GL41C.glProgramUniform4iv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform1uiv ProgramUniform1uiv} + * + * @see Reference Page + */ + public static void glProgramUniform1uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL41C.glProgramUniform1uiv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform2uiv ProgramUniform2uiv} + * + * @see Reference Page + */ + public static void glProgramUniform2uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL41C.glProgramUniform2uiv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform3uiv ProgramUniform3uiv} + * + * @see Reference Page + */ + public static void glProgramUniform3uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL41C.glProgramUniform3uiv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform4uiv ProgramUniform4uiv} + * + * @see Reference Page + */ + public static void glProgramUniform4uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + GL41C.glProgramUniform4uiv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform1fv ProgramUniform1fv} + * + * @see Reference Page + */ + public static void glProgramUniform1fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniform1fv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform2fv ProgramUniform2fv} + * + * @see Reference Page + */ + public static void glProgramUniform2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniform2fv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform3fv ProgramUniform3fv} + * + * @see Reference Page + */ + public static void glProgramUniform3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniform3fv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform4fv ProgramUniform4fv} + * + * @see Reference Page + */ + public static void glProgramUniform4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniform4fv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform1dv ProgramUniform1dv} + * + * @see Reference Page + */ + public static void glProgramUniform1dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniform1dv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform2dv ProgramUniform2dv} + * + * @see Reference Page + */ + public static void glProgramUniform2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniform2dv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform3dv ProgramUniform3dv} + * + * @see Reference Page + */ + public static void glProgramUniform3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniform3dv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniform4dv ProgramUniform4dv} + * + * @see Reference Page + */ + public static void glProgramUniform4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniform4dv(program, location, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2fv ProgramUniformMatrix2fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix2fv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3fv ProgramUniformMatrix3fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix3fv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4fv ProgramUniformMatrix4fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix4fv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2dv ProgramUniformMatrix2dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix2dv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3dv ProgramUniformMatrix3dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix3dv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4dv ProgramUniformMatrix4dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix4dv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2x3fv ProgramUniformMatrix2x3fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix2x3fv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3x2fv ProgramUniformMatrix3x2fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix3x2fv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2x4fv ProgramUniformMatrix2x4fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix2x4fv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4x2fv ProgramUniformMatrix4x2fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix4x2fv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3x4fv ProgramUniformMatrix3x4fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix3x4fv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4x3fv ProgramUniformMatrix4x3fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + GL41C.glProgramUniformMatrix4x3fv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2x3dv ProgramUniformMatrix2x3dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix2x3dv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3x2dv ProgramUniformMatrix3x2dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix3x2dv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2x4dv ProgramUniformMatrix2x4dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix2x4dv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4x2dv ProgramUniformMatrix4x2dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix4x2dv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3x4dv ProgramUniformMatrix3x4dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix3x4dv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4x3dv ProgramUniformMatrix4x3dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + GL41C.glProgramUniformMatrix4x3dv(program, location, transpose, value); + } + + /** + * Array version of: {@link #glGetProgramPipelineInfoLog GetProgramPipelineInfoLog} + * + * @see Reference Page + */ + public static void glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer infoLog) { + GL41C.glGetProgramPipelineInfoLog(pipeline, length, infoLog); + } + + /** + * Array version of: {@link #glVertexAttribL1dv VertexAttribL1dv} + * + * @see Reference Page + */ + public static void glVertexAttribL1dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL41C.glVertexAttribL1dv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribL2dv VertexAttribL2dv} + * + * @see Reference Page + */ + public static void glVertexAttribL2dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL41C.glVertexAttribL2dv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribL3dv VertexAttribL3dv} + * + * @see Reference Page + */ + public static void glVertexAttribL3dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL41C.glVertexAttribL3dv(index, v); + } + + /** + * Array version of: {@link #glVertexAttribL4dv VertexAttribL4dv} + * + * @see Reference Page + */ + public static void glVertexAttribL4dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + GL41C.glVertexAttribL4dv(index, v); + } + + /** + * Array version of: {@link #glGetVertexAttribLdv GetVertexAttribLdv} + * + * @see Reference Page + */ + public static void glGetVertexAttribLdv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] params) { + GL41C.glGetVertexAttribLdv(index, pname, params); + } + + /** + * Array version of: {@link #glViewportArrayv ViewportArrayv} + * + * @see Reference Page + */ + public static void glViewportArrayv(@NativeType("GLuint") int first, @NativeType("GLfloat const *") float[] v) { + GL41C.glViewportArrayv(first, v); + } + + /** + * Array version of: {@link #glViewportIndexedfv ViewportIndexedfv} + * + * @see Reference Page + */ + public static void glViewportIndexedfv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + GL41C.glViewportIndexedfv(index, v); + } + + /** + * Array version of: {@link #glScissorArrayv ScissorArrayv} + * + * @see Reference Page + */ + public static void glScissorArrayv(@NativeType("GLuint") int first, @NativeType("GLint const *") int[] v) { + GL41C.glScissorArrayv(first, v); + } + + /** + * Array version of: {@link #glScissorIndexedv ScissorIndexedv} + * + * @see Reference Page + */ + public static void glScissorIndexedv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + GL41C.glScissorIndexedv(index, v); + } + + /** + * Array version of: {@link #glDepthRangeArrayv DepthRangeArrayv} + * + * @see Reference Page + */ + public static void glDepthRangeArrayv(@NativeType("GLuint") int first, @NativeType("GLdouble const *") double[] v) { + GL41C.glDepthRangeArrayv(first, v); + } + + /** + * Array version of: {@link #glGetFloati_v GetFloati_v} + * + * @see Reference Page + */ + public static void glGetFloati_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] data) { + GL41C.glGetFloati_v(target, index, data); + } + + /** + * Array version of: {@link #glGetDoublei_v GetDoublei_v} + * + * @see Reference Page + */ + public static void glGetDoublei_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") double[] data) { + GL41C.glGetDoublei_v(target, index, data); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL41C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL41C.java new file mode 100644 index 000000000..86600a7d7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL41C.java @@ -0,0 +1,2795 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; +import org.lwjgl.system.MemoryUtil; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 4.1. Includes only Core Profile symbols. + * + *

    OpenGL 4.1 implementations support revision 4.10 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL41C extends GL40C { + + static { GL.initialize(); } + + /** Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_SHADER_COMPILER = 0x8DFA, + GL_SHADER_BINARY_FORMATS = 0x8DF8, + GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9, + GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB, + GL_MAX_VARYING_VECTORS = 0x8DFC, + GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD, + GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A, + GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B; + + /** Accepted by the {@code type} parameter of VertexAttribPointer. */ + public static final int GL_FIXED = 0x140C; + + /** Accepted by the {@code precisiontype} parameter of GetShaderPrecisionFormat. */ + public static final int + GL_LOW_FLOAT = 0x8DF0, + GL_MEDIUM_FLOAT = 0x8DF1, + GL_HIGH_FLOAT = 0x8DF2, + GL_LOW_INT = 0x8DF3, + GL_MEDIUM_INT = 0x8DF4, + GL_HIGH_INT = 0x8DF5; + + /** Accepted by the {@code format} parameter of most commands taking sized internal formats. */ + public static final int GL_RGB565 = 0x8D62; + + /** Accepted by the {@code pname} parameter of ProgramParameteri and GetProgramiv. */ + public static final int GL_PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_PROGRAM_BINARY_LENGTH = 0x8741; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv and GetDoublev. */ + public static final int + GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE, + GL_PROGRAM_BINARY_FORMATS = 0x87FF; + + /** Accepted by {@code stages} parameter to UseProgramStages. */ + public static final int + GL_VERTEX_SHADER_BIT = 0x1, + GL_FRAGMENT_SHADER_BIT = 0x2, + GL_GEOMETRY_SHADER_BIT = 0x4, + GL_TESS_CONTROL_SHADER_BIT = 0x8, + GL_TESS_EVALUATION_SHADER_BIT = 0x10, + GL_ALL_SHADER_BITS = 0xFFFFFFFF; + + /** Accepted by the {@code pname} parameter of ProgramParameteri and GetProgramiv. */ + public static final int GL_PROGRAM_SEPARABLE = 0x8258; + + /** Accepted by {@code type} parameter to GetProgramPipelineiv. */ + public static final int GL_ACTIVE_PROGRAM = 0x8259; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_PROGRAM_PIPELINE_BINDING = 0x825A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev and GetInteger64v. */ + public static final int + GL_MAX_VIEWPORTS = 0x825B, + GL_VIEWPORT_SUBPIXEL_BITS = 0x825C, + GL_VIEWPORT_BOUNDS_RANGE = 0x825D, + GL_LAYER_PROVOKING_VERTEX = 0x825E, + GL_VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F; + + /** Returned in the {@code data} parameter from a Get query with a {@code pname} of LAYER_PROVOKING_VERTEX or VIEWPORT_INDEX_PROVOKING_VERTEX. */ + public static final int GL_UNDEFINED_VERTEX = 0x8260; + + protected GL41C() { + throw new UnsupportedOperationException(); + } + + // --- [ glReleaseShaderCompiler ] --- + + /** + * Releases resources allocated by the shader compiler. This is a hint from the application, and does not prevent later use of the shader compiler. + * + * @see Reference Page + */ + public static native void glReleaseShaderCompiler(); + + // --- [ glShaderBinary ] --- + + /** + * Unsafe version of: {@link #glShaderBinary ShaderBinary} + * + * @param count the number of shader object handles contained in {@code shaders} + * @param length the length of the array whose address is given in binary + */ + public static native void nglShaderBinary(int count, long shaders, int binaryformat, long binary, int length); + + /** + * Loads pre-compiled shader binaries. + * + * @param shaders an array of shader handles into which to load pre-compiled shader binaries + * @param binaryformat the format of the shader binaries contained in {@code binary} + * @param binary an array of bytes containing pre-compiled binary shader code + * + * @see Reference Page + */ + public static void glShaderBinary(@NativeType("GLuint const *") IntBuffer shaders, @NativeType("GLenum") int binaryformat, @NativeType("void const *") ByteBuffer binary) { + nglShaderBinary(shaders.remaining(), memAddress(shaders), binaryformat, memAddress(binary), binary.remaining()); + } + + // --- [ glGetShaderPrecisionFormat ] --- + + /** Unsafe version of: {@link #glGetShaderPrecisionFormat GetShaderPrecisionFormat} */ + public static native void nglGetShaderPrecisionFormat(int shadertype, int precisiontype, long range, long precision); + + /** + * Retrieves the range and precision for numeric formats supported by the shader compiler. + * + * @param shadertype the type of shader whose precision to query. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}
    + * @param precisiontype the numeric format whose precision and range to query + * @param range the address of array of two integers into which encodings of the implementation's numeric range are returned + * @param precision the address of an integer into which the numeric precision of the implementation is written + * + * @see Reference Page + */ + public static void glGetShaderPrecisionFormat(@NativeType("GLenum") int shadertype, @NativeType("GLenum") int precisiontype, @NativeType("GLint *") IntBuffer range, @NativeType("GLint *") IntBuffer precision) { + if (CHECKS) { + check(range, 2); + check(precision, 1); + } + nglGetShaderPrecisionFormat(shadertype, precisiontype, memAddress(range), memAddress(precision)); + } + + /** + * Retrieves the range and precision for numeric formats supported by the shader compiler. + * + * @param shadertype the type of shader whose precision to query. One of:
    {@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}
    + * @param precisiontype the numeric format whose precision and range to query + * @param range the address of array of two integers into which encodings of the implementation's numeric range are returned + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetShaderPrecisionFormat(@NativeType("GLenum") int shadertype, @NativeType("GLenum") int precisiontype, @NativeType("GLint *") IntBuffer range) { + if (CHECKS) { + check(range, 2); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer precision = stack.callocInt(1); + nglGetShaderPrecisionFormat(shadertype, precisiontype, memAddress(range), memAddress(precision)); + return precision.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDepthRangef ] --- + + /** + * Specifies mapping of depth values from normalized device coordinates to window coordinates + * + * @param zNear the mapping of the near clipping plane to window coordinates. The initial value is 0.0f. + * @param zFar the mapping of the far clipping plane to window coordinates. The initial value is 1.0f. + * + * @see Reference Page + */ + public static native void glDepthRangef(@NativeType("GLfloat") float zNear, @NativeType("GLfloat") float zFar); + + // --- [ glClearDepthf ] --- + + /** + * Specifies the clear value for the depth buffer + * + * @param depth the depth value used when the depth buffer is cleared. The initial value is 1.0f. + * + * @see Reference Page + */ + public static native void glClearDepthf(@NativeType("GLfloat") float depth); + + // --- [ glGetProgramBinary ] --- + + /** + * Unsafe version of: {@link #glGetProgramBinary GetProgramBinary} + * + * @param bufSize the size of the buffer whose address is given by {@code binary} + */ + public static native void nglGetProgramBinary(int program, int bufSize, long length, long binaryFormat, long binary); + + /** + * Returns a binary representation of a program object's compiled and linked executable source. + * + * @param program the name of a program object whose binary representation to retrieve + * @param length the address of a variable to receive the number of bytes written into {@code binary} + * @param binaryFormat a variable to receive a token indicating the format of the binary data returned by the GL + * @param binary an array into which the GL will return {@code program}'s binary representation + * + * @see Reference Page + */ + public static void glGetProgramBinary(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLenum *") IntBuffer binaryFormat, @NativeType("void *") ByteBuffer binary) { + if (CHECKS) { + checkSafe(length, 1); + check(binaryFormat, 1); + } + nglGetProgramBinary(program, binary.remaining(), memAddressSafe(length), memAddress(binaryFormat), memAddress(binary)); + } + + // --- [ glProgramBinary ] --- + + /** + * Unsafe version of: {@link #glProgramBinary ProgramBinary} + * + * @param length the number of bytes contained in {@code binary} + */ + public static native void nglProgramBinary(int program, int binaryFormat, long binary, int length); + + /** + * Loads a program object with a program binary. + * + * @param program the name of a program object into which to load a program binary + * @param binaryFormat the format of the binary data in binary + * @param binary an array containing the binary to be loaded into {@code program} + * + * @see Reference Page + */ + public static void glProgramBinary(@NativeType("GLuint") int program, @NativeType("GLenum") int binaryFormat, @NativeType("void const *") ByteBuffer binary) { + nglProgramBinary(program, binaryFormat, memAddress(binary), binary.remaining()); + } + + // --- [ glProgramParameteri ] --- + + /** + * Specifies the integer value of a program object parameter. + * + * @param program the name of a program object whose parameter to modify + * @param pname the name of the parameter to modify. One of:
    {@link #GL_PROGRAM_BINARY_RETRIEVABLE_HINT PROGRAM_BINARY_RETRIEVABLE_HINT}{@link #GL_PROGRAM_SEPARABLE PROGRAM_SEPARABLE}
    + * @param value the new value of the parameter specified by {@code pname} for {@code program} + * + * @see Reference Page + */ + public static native void glProgramParameteri(@NativeType("GLuint") int program, @NativeType("GLenum") int pname, @NativeType("GLint") int value); + + // --- [ glUseProgramStages ] --- + + /** + * Binds stages of a program object to a program pipeline. + * + * @param pipeline the program pipeline object to which to bind stages from {@code program} + * @param stages a set of program stages to bind to the program pipeline object + * @param program the program object containing the shader executables to use in {@code pipeline} + * + * @see Reference Page + */ + public static native void glUseProgramStages(@NativeType("GLuint") int pipeline, @NativeType("GLbitfield") int stages, @NativeType("GLuint") int program); + + // --- [ glActiveShaderProgram ] --- + + /** + * Sets the active program object for a program pipeline object. + * + * @param pipeline the program pipeline object to set the active program object for + * @param program the program object to set as the active program pipeline object {@code pipeline} + * + * @see Reference Page + */ + public static native void glActiveShaderProgram(@NativeType("GLuint") int pipeline, @NativeType("GLuint") int program); + + // --- [ glCreateShaderProgramv ] --- + + /** + * Unsafe version of: {@link #glCreateShaderProgramv CreateShaderProgramv} + * + * @param count the number of source code strings in the array {@code strings} + */ + public static native int nglCreateShaderProgramv(int type, int count, long strings); + + /** + * Creates a stand-alone program from an array of null-terminated source code strings. + * + *

    {@code glCreateShaderProgram} is equivalent (assuming no errors are generated) to:

    + * + *
    
    +     * const GLuint shader = glCreateShader(type);
    +     * if (shader) {
    +     *     glShaderSource(shader, count, strings, NULL);
    +     *     glCompileShader(shader);
    +     *     const GLuint program = glCreateProgram();
    +     *     if (program) {
    +     *         GLint compiled = GL_FALSE;
    +     *         glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    +     *         glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
    +     *         if (compiled) {
    +     *             glAttachShader(program, shader);
    +     *             glLinkProgram(program);
    +     *             glDetachShader(program, shader);
    +     *         }
    +     *         // append-shader-info-log-to-program-info-log
    +     *     }
    +     *     glDeleteShader(shader);
    +     *     return program;
    +     * } else {
    +     *     return 0;
    +     * }
    + * + *

    The program object created by glCreateShaderProgram has its GL_PROGRAM_SEPARABLE status set to GL_TRUE.

    + * + * @param type the type of shader to create + * @param strings an array of pointers to source code strings from which to create the program object + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glCreateShaderProgramv(@NativeType("GLenum") int type, @NativeType("GLchar const * const *") PointerBuffer strings) { + return nglCreateShaderProgramv(type, strings.remaining(), memAddress(strings)); + } + + /** + * Creates a stand-alone program from an array of null-terminated source code strings. + * + *

    {@code glCreateShaderProgram} is equivalent (assuming no errors are generated) to:

    + * + *
    
    +     * const GLuint shader = glCreateShader(type);
    +     * if (shader) {
    +     *     glShaderSource(shader, count, strings, NULL);
    +     *     glCompileShader(shader);
    +     *     const GLuint program = glCreateProgram();
    +     *     if (program) {
    +     *         GLint compiled = GL_FALSE;
    +     *         glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    +     *         glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
    +     *         if (compiled) {
    +     *             glAttachShader(program, shader);
    +     *             glLinkProgram(program);
    +     *             glDetachShader(program, shader);
    +     *         }
    +     *         // append-shader-info-log-to-program-info-log
    +     *     }
    +     *     glDeleteShader(shader);
    +     *     return program;
    +     * } else {
    +     *     return 0;
    +     * }
    + * + *

    The program object created by glCreateShaderProgram has its GL_PROGRAM_SEPARABLE status set to GL_TRUE.

    + * + * @param type the type of shader to create + * @param strings an array of pointers to source code strings from which to create the program object + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glCreateShaderProgramv(@NativeType("GLenum") int type, @NativeType("GLchar const * const *") CharSequence... strings) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long stringsAddress = APIUtil.apiArray(stack, MemoryUtil::memUTF8, strings); + int __result = nglCreateShaderProgramv(type, strings.length, stringsAddress); + APIUtil.apiArrayFree(stringsAddress, strings.length); + return __result; + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Creates a stand-alone program from an array of null-terminated source code strings. + * + *

    {@code glCreateShaderProgram} is equivalent (assuming no errors are generated) to:

    + * + *
    
    +     * const GLuint shader = glCreateShader(type);
    +     * if (shader) {
    +     *     glShaderSource(shader, count, strings, NULL);
    +     *     glCompileShader(shader);
    +     *     const GLuint program = glCreateProgram();
    +     *     if (program) {
    +     *         GLint compiled = GL_FALSE;
    +     *         glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    +     *         glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
    +     *         if (compiled) {
    +     *             glAttachShader(program, shader);
    +     *             glLinkProgram(program);
    +     *             glDetachShader(program, shader);
    +     *         }
    +     *         // append-shader-info-log-to-program-info-log
    +     *     }
    +     *     glDeleteShader(shader);
    +     *     return program;
    +     * } else {
    +     *     return 0;
    +     * }
    + * + *

    The program object created by glCreateShaderProgram has its GL_PROGRAM_SEPARABLE status set to GL_TRUE.

    + * + * @param type the type of shader to create + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glCreateShaderProgramv(@NativeType("GLenum") int type, @NativeType("GLchar const * const *") CharSequence string) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long stringsAddress = APIUtil.apiArray(stack, MemoryUtil::memUTF8, string); + int __result = nglCreateShaderProgramv(type, 1, stringsAddress); + APIUtil.apiArrayFree(stringsAddress, 1); + return __result; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glBindProgramPipeline ] --- + + /** + * Binds a program pipeline to the current context. + * + * @param pipeline the name of the pipeline object to bind to the context + * + * @see Reference Page + */ + public static native void glBindProgramPipeline(@NativeType("GLuint") int pipeline); + + // --- [ glDeleteProgramPipelines ] --- + + /** + * Unsafe version of: {@link #glDeleteProgramPipelines DeleteProgramPipelines} + * + * @param n the number of program pipeline objects to delete + */ + public static native void nglDeleteProgramPipelines(int n, long pipelines); + + /** + * Deletes program pipeline objects. + * + * @param pipelines an array of names of program pipeline objects to delete + * + * @see Reference Page + */ + public static void glDeleteProgramPipelines(@NativeType("GLuint const *") IntBuffer pipelines) { + nglDeleteProgramPipelines(pipelines.remaining(), memAddress(pipelines)); + } + + /** + * Deletes program pipeline objects. + * + * @see Reference Page + */ + public static void glDeleteProgramPipelines(@NativeType("GLuint const *") int pipeline) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer pipelines = stack.ints(pipeline); + nglDeleteProgramPipelines(1, memAddress(pipelines)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenProgramPipelines ] --- + + /** + * Unsafe version of: {@link #glGenProgramPipelines GenProgramPipelines} + * + * @param n the number of program pipeline object names to reserve + */ + public static native void nglGenProgramPipelines(int n, long pipelines); + + /** + * Reserves program pipeline object names. + * + * @param pipelines an array of into which the reserved names will be written + * + * @see Reference Page + */ + public static void glGenProgramPipelines(@NativeType("GLuint *") IntBuffer pipelines) { + nglGenProgramPipelines(pipelines.remaining(), memAddress(pipelines)); + } + + /** + * Reserves program pipeline object names. + * + * @see Reference Page + */ + @NativeType("void") + public static int glGenProgramPipelines() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer pipelines = stack.callocInt(1); + nglGenProgramPipelines(1, memAddress(pipelines)); + return pipelines.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsProgramPipeline ] --- + + /** + * Determines if a name corresponds to a program pipeline object. + * + * @param pipeline a value that may be the name of a program pipeline object + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glIsProgramPipeline(@NativeType("GLuint") int pipeline); + + // --- [ glGetProgramPipelineiv ] --- + + /** Unsafe version of: {@link #glGetProgramPipelineiv GetProgramPipelineiv} */ + public static native void nglGetProgramPipelineiv(int pipeline, int pname, long params); + + /** + * Retrieves properties of a program pipeline object. + * + * @param pipeline the name of a program pipeline object whose parameter retrieve + * @param pname the name of the parameter to retrieve. One of:
    {@link #GL_ACTIVE_PROGRAM ACTIVE_PROGRAM}{@link GL20#GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}
    {@link GL40#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}{@link GL40#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * @param params a variable into which will be written the value or values of {@code pname} for {@code pipeline} + * + * @see Reference Page + */ + public static void glGetProgramPipelineiv(@NativeType("GLuint") int pipeline, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetProgramPipelineiv(pipeline, pname, memAddress(params)); + } + + /** + * Retrieves properties of a program pipeline object. + * + * @param pipeline the name of a program pipeline object whose parameter retrieve + * @param pname the name of the parameter to retrieve. One of:
    {@link #GL_ACTIVE_PROGRAM ACTIVE_PROGRAM}{@link GL20#GL_INFO_LOG_LENGTH INFO_LOG_LENGTH}{@link GL20#GL_VERTEX_SHADER VERTEX_SHADER}{@link GL20#GL_FRAGMENT_SHADER FRAGMENT_SHADER}{@link GL32#GL_GEOMETRY_SHADER GEOMETRY_SHADER}
    {@link GL40#GL_TESS_CONTROL_SHADER TESS_CONTROL_SHADER}{@link GL40#GL_TESS_EVALUATION_SHADER TESS_EVALUATION_SHADER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetProgramPipelinei(@NativeType("GLuint") int pipeline, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetProgramPipelineiv(pipeline, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glProgramUniform1i ] --- + + /** + * Specifies the value of an int uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * + * @see Reference Page + */ + public static native void glProgramUniform1i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x); + + // --- [ glProgramUniform2i ] --- + + /** + * Specifies the value of an ivec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * + * @see Reference Page + */ + public static native void glProgramUniform2i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x, @NativeType("GLint") int y); + + // --- [ glProgramUniform3i ] --- + + /** + * Specifies the value of an ivec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * + * @see Reference Page + */ + public static native void glProgramUniform3i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z); + + // --- [ glProgramUniform4i ] --- + + /** + * Specifies the value of an ivec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + * + * @see Reference Page + */ + public static native void glProgramUniform4i(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLint") int z, @NativeType("GLint") int w); + + // --- [ glProgramUniform1ui ] --- + + /** + * Specifies the value of a uint uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * + * @see Reference Page + */ + public static native void glProgramUniform1ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x); + + // --- [ glProgramUniform2ui ] --- + + /** + * Specifies the value of a uvec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * + * @see Reference Page + */ + public static native void glProgramUniform2ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x, @NativeType("GLuint") int y); + + // --- [ glProgramUniform3ui ] --- + + /** + * Specifies the value of a uvec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * + * @see Reference Page + */ + public static native void glProgramUniform3ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x, @NativeType("GLuint") int y, @NativeType("GLuint") int z); + + // --- [ glProgramUniform4ui ] --- + + /** + * Specifies the value of a uvec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + * + * @see Reference Page + */ + public static native void glProgramUniform4ui(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint") int x, @NativeType("GLuint") int y, @NativeType("GLuint") int z, @NativeType("GLuint") int w); + + // --- [ glProgramUniform1f ] --- + + /** + * Specifies the value of a float uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * + * @see Reference Page + */ + public static native void glProgramUniform1f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x); + + // --- [ glProgramUniform2f ] --- + + /** + * Specifies the value of a vec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * + * @see Reference Page + */ + public static native void glProgramUniform2f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y); + + // --- [ glProgramUniform3f ] --- + + /** + * Specifies the value of a vec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * + * @see Reference Page + */ + public static native void glProgramUniform3f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z); + + // --- [ glProgramUniform4f ] --- + + /** + * Specifies the value of a vec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + * + * @see Reference Page + */ + public static native void glProgramUniform4f(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float z, @NativeType("GLfloat") float w); + + // --- [ glProgramUniform1d ] --- + + /** + * Specifies the value of a double uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * + * @see Reference Page + */ + public static native void glProgramUniform1d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x); + + // --- [ glProgramUniform2d ] --- + + /** + * Specifies the value of a dvec2 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * + * @see Reference Page + */ + public static native void glProgramUniform2d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y); + + // --- [ glProgramUniform3d ] --- + + /** + * Specifies the value of a dvec3 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * + * @see Reference Page + */ + public static native void glProgramUniform3d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glProgramUniform4d ] --- + + /** + * Specifies the value of a dvec4 uniform variable for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param x the uniform x value + * @param y the uniform y value + * @param z the uniform z value + * @param w the uniform w value + * + * @see Reference Page + */ + public static native void glProgramUniform4d(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w); + + // --- [ glProgramUniform1iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1iv ProgramUniform1iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform1iv(int program, int location, int count, long value); + + /** + * Specifies the value of a single float uniform variable or a float uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform1iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglProgramUniform1iv(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform2iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2iv ProgramUniform2iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform2iv(int program, int location, int count, long value); + + /** + * Specifies the value of a single ivec2 uniform variable or an ivec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform2iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglProgramUniform2iv(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform3iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3iv ProgramUniform3iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform3iv(int program, int location, int count, long value); + + /** + * Specifies the value of a single ivec3 uniform variable or an ivec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform3iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglProgramUniform3iv(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform4iv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4iv ProgramUniform4iv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform4iv(int program, int location, int count, long value); + + /** + * Specifies the value of a single ivec4 uniform variable or an ivec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform4iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") IntBuffer value) { + nglProgramUniform4iv(program, location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glProgramUniform1uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1uiv ProgramUniform1uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform1uiv(int program, int location, int count, long value); + + /** + * Specifies the value of a single uint uniform variable or a uint uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform1uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglProgramUniform1uiv(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform2uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2uiv ProgramUniform2uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform2uiv(int program, int location, int count, long value); + + /** + * Specifies the value of a single uvec2 uniform variable or a uvec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform2uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglProgramUniform2uiv(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform3uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3uiv ProgramUniform3uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform3uiv(int program, int location, int count, long value); + + /** + * Specifies the value of a single uvec3 uniform variable or a uvec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform3uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglProgramUniform3uiv(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform4uiv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4uiv ProgramUniform4uiv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform4uiv(int program, int location, int count, long value); + + /** + * Specifies the value of a single uvec4 uniform variable or a uvec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform4uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") IntBuffer value) { + nglProgramUniform4uiv(program, location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glProgramUniform1fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1fv ProgramUniform1fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform1fv(int program, int location, int count, long value); + + /** + * Specifies the value of a single float uniform variable or a float uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform1fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniform1fv(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2fv ProgramUniform2fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform2fv(int program, int location, int count, long value); + + /** + * Specifies the value of a single vec2 uniform variable or a vec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniform2fv(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3fv ProgramUniform3fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform3fv(int program, int location, int count, long value); + + /** + * Specifies the value of a single vec3 uniform variable or a vec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniform3fv(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4fv ProgramUniform4fv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform4fv(int program, int location, int count, long value); + + /** + * Specifies the value of a single vec4 uniform variable or a vec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniform4fv(program, location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glProgramUniform1dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform1dv ProgramUniform1dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform1dv(int program, int location, int count, long value); + + /** + * Specifies the value of a single double uniform variable or a double uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform1dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniform1dv(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform2dv ProgramUniform2dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform2dv(int program, int location, int count, long value); + + /** + * Specifies the value of a single dvec2 uniform variable or a dvec2 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniform2dv(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform3dv ProgramUniform3dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform3dv(int program, int location, int count, long value); + + /** + * Specifies the value of a single dvec3 uniform variable or a dvec3 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniform3dv(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniform4dv ProgramUniform4dv} + * + * @param count the number of elements that are to be modified. This should be 1 if the targeted uniform variable is not an array, and 1 or more if it is an array. + */ + public static native void nglProgramUniform4dv(int program, int location, int count, long value); + + /** + * Specifies the value of a single dvec4 uniform variable or a dvec4 uniform variable array for a specified program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param value an array of {@code count} values that will be used to update the specified uniform variable + * + * @see Reference Page + */ + public static void glProgramUniform4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniform4dv(program, location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2fv ProgramUniformMatrix2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix2fv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat2 uniform variable or a mat2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix2fv(program, location, value.remaining() >> 2, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3fv ProgramUniformMatrix3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix3fv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat3 uniform variable or a mat3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix3fv(program, location, value.remaining() / 9, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4fv ProgramUniformMatrix4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix4fv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat4 uniform variable or a mat4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix4fv(program, location, value.remaining() >> 4, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2dv ProgramUniformMatrix2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix2dv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat2 uniform variable or a dmat2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix2dv(program, location, value.remaining() >> 2, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3dv ProgramUniformMatrix3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix3dv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat3 uniform variable or a dmat3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix3dv(program, location, value.remaining() / 9, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4dv ProgramUniformMatrix4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix4dv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat4 uniform variable or a dmat4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix4dv(program, location, value.remaining() >> 4, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2x3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x3fv ProgramUniformMatrix2x3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix2x3fv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat2x3 uniform variable or a mat2x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix2x3fv(program, location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3x2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x2fv ProgramUniformMatrix3x2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix3x2fv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat3x2 uniform variable or a mat3x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix3x2fv(program, location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2x4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x4fv ProgramUniformMatrix2x4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix2x4fv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat2x4 uniform variable or a mat2x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix2x4fv(program, location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4x2fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x2fv ProgramUniformMatrix4x2fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix4x2fv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat4x2 uniform variable or a mat4x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix4x2fv(program, location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3x4fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x4fv ProgramUniformMatrix3x4fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix3x4fv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat3x4 uniform variable or a mat3x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix3x4fv(program, location, value.remaining() / 12, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4x3fv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x3fv ProgramUniformMatrix4x3fv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix4x3fv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single mat4x3 uniform variable or a mat4x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") FloatBuffer value) { + nglProgramUniformMatrix4x3fv(program, location, value.remaining() / 12, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2x3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x3dv ProgramUniformMatrix2x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix2x3dv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat2x3 uniform variable or a dmat2x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix2x3dv(program, location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3x2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x2dv ProgramUniformMatrix3x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix3x2dv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat3x2 uniform variable or a dmat3x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix3x2dv(program, location, value.remaining() / 6, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix2x4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix2x4dv ProgramUniformMatrix2x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix2x4dv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat2x4 uniform variable or a dmat2x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix2x4dv(program, location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4x2dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x2dv ProgramUniformMatrix4x2dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix4x2dv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat4x2 uniform variable or a dmat4x2 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix4x2dv(program, location, value.remaining() >> 3, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix3x4dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix3x4dv ProgramUniformMatrix3x4dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix3x4dv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat3x4 uniform variable or a dmat3x4 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix3x4dv(program, location, value.remaining() / 12, transpose, memAddress(value)); + } + + // --- [ glProgramUniformMatrix4x3dv ] --- + + /** + * Unsafe version of: {@link #glProgramUniformMatrix4x3dv ProgramUniformMatrix4x3dv} + * + * @param count the number of matrices that are to be modified. This should be 1 if the targeted uniform variable is not an array of matrices, and 1 or more if it is an array of matrices. + */ + public static native void nglProgramUniformMatrix4x3dv(int program, int location, int count, boolean transpose, long value); + + /** + * Specifies the value of a single dmat4x3 uniform variable or a dmat4x3 uniform variable array for the current program object. + * + * @param program the handle of the program containing the uniform variable to be modified + * @param location the location of the uniform variable to be modified + * @param transpose whether to transpose the matrix as the values are loaded into the uniform variable + * @param value an array of {@code count} values that will be used to update the specified uniform matrix variable + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") DoubleBuffer value) { + nglProgramUniformMatrix4x3dv(program, location, value.remaining() / 12, transpose, memAddress(value)); + } + + // --- [ glValidateProgramPipeline ] --- + + /** + * Validates a program pipeline object against current GL state. + * + * @param pipeline the name of a program pipeline object to validate + * + * @see Reference Page + */ + public static native void glValidateProgramPipeline(@NativeType("GLuint") int pipeline); + + // --- [ glGetProgramPipelineInfoLog ] --- + + /** + * Unsafe version of: {@link #glGetProgramPipelineInfoLog GetProgramPipelineInfoLog} + * + * @param bufSize the maximum number of characters, including the null terminator, that may be written into {@code infoLog} + */ + public static native void nglGetProgramPipelineInfoLog(int pipeline, int bufSize, long length, long infoLog); + + /** + * Retrieves the info log string from a program pipeline object. + * + * @param pipeline the name of a program pipeline object from which to retrieve the info log + * @param length a variable into which will be written the number of characters written into {@code infoLog} + * @param infoLog an array of characters into which will be written the info log for {@code pipeline} + * + * @see Reference Page + */ + public static void glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer infoLog) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetProgramPipelineInfoLog(pipeline, infoLog.remaining(), memAddressSafe(length), memAddress(infoLog)); + } + + /** + * Retrieves the info log string from a program pipeline object. + * + * @param pipeline the name of a program pipeline object from which to retrieve the info log + * @param bufSize the maximum number of characters, including the null terminator, that may be written into {@code infoLog} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline, @NativeType("GLsizei") int bufSize) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + ByteBuffer infoLog = memAlloc(bufSize); + try { + IntBuffer length = stack.ints(0); + nglGetProgramPipelineInfoLog(pipeline, bufSize, memAddress(length), memAddress(infoLog)); + return memUTF8(infoLog, length.get(0)); + } finally { + memFree(infoLog); + stack.setPointer(stackPointer); + } + } + + /** + * Retrieves the info log string from a program pipeline object. + * + * @param pipeline the name of a program pipeline object from which to retrieve the info log + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline) { + return glGetProgramPipelineInfoLog(pipeline, glGetProgramPipelinei(pipeline, GL20.GL_INFO_LOG_LENGTH)); + } + + // --- [ glVertexAttribL1d ] --- + + /** + * Specifies the value of a generic vertex attribute. The y and z components are implicitly set to 0.0 and w to 1.0. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * + * @see Reference Page + */ + public static native void glVertexAttribL1d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x); + + // --- [ glVertexAttribL2d ] --- + + /** + * Specifies the value of a generic vertex attribute. The y component is implicitly set to 0.0 and w to 1.0. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * + * @see Reference Page + */ + public static native void glVertexAttribL2d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y); + + // --- [ glVertexAttribL3d ] --- + + /** + * Specifies the value of a generic vertex attribute. The w is implicitly set to 1.0. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * + * @see Reference Page + */ + public static native void glVertexAttribL3d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z); + + // --- [ glVertexAttribL4d ] --- + + /** + * Specifies the value of a generic vertex attribute. + * + * @param index the index of the generic vertex attribute to be modified + * @param x the vertex attribute x component + * @param y the vertex attribute y component + * @param z the vertex attribute z component + * @param w the vertex attribute w component + * + * @see Reference Page + */ + public static native void glVertexAttribL4d(@NativeType("GLuint") int index, @NativeType("GLdouble") double x, @NativeType("GLdouble") double y, @NativeType("GLdouble") double z, @NativeType("GLdouble") double w); + + // --- [ glVertexAttribL1dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL1dv VertexAttribL1dv} */ + public static native void nglVertexAttribL1dv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribL1d VertexAttribL1d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribL1dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttribL1dv(index, memAddress(v)); + } + + // --- [ glVertexAttribL2dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL2dv VertexAttribL2dv} */ + public static native void nglVertexAttribL2dv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribL2d VertexAttribL2d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribL2dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttribL2dv(index, memAddress(v)); + } + + // --- [ glVertexAttribL3dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL3dv VertexAttribL3dv} */ + public static native void nglVertexAttribL3dv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribL3d VertexAttribL3d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribL3dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttribL3dv(index, memAddress(v)); + } + + // --- [ glVertexAttribL4dv ] --- + + /** Unsafe version of: {@link #glVertexAttribL4dv VertexAttribL4dv} */ + public static native void nglVertexAttribL4dv(int index, long v); + + /** + * Pointer version of {@link #glVertexAttribL4d VertexAttribL4d}. + * + * @param index the index of the generic vertex attribute to be modified + * @param v the vertex attribute buffer + * + * @see Reference Page + */ + public static void glVertexAttribL4dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") DoubleBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribL4dv(index, memAddress(v)); + } + + // --- [ glVertexAttribLPointer ] --- + + /** + * Unsafe version of: {@link #glVertexAttribLPointer VertexAttribLPointer} + * + * @param type the data type of each component in the array. Must be:
    {@link GL11#GL_DOUBLE DOUBLE}
    + */ + public static native void nglVertexAttribLPointer(int index, int size, int type, int stride, long pointer); + + /** + * Specifies the location and organization of a 64-bit vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. Must be:
    {@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribLPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") ByteBuffer pointer) { + nglVertexAttribLPointer(index, size, type, stride, memAddress(pointer)); + } + + /** + * Specifies the location and organization of a 64-bit vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the data type of each component in the array. Must be:
    {@link GL11#GL_DOUBLE DOUBLE}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribLPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride, @NativeType("void const *") long pointer) { + nglVertexAttribLPointer(index, size, type, stride, pointer); + } + + /** + * Specifies the location and organization of a 64-bit vertex attribute array. + * + * @param index the index of the generic vertex attribute to be modified + * @param size the number of values per vertex that are stored in the array. The initial value is 4. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param stride the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in + * the array. The initial value is 0. + * @param pointer the vertex attribute data or the offset of the first component of the first generic vertex attribute in the array in the data store of the buffer + * currently bound to the {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER} target. The initial value is 0. + * + * @see Reference Page + */ + public static void glVertexAttribLPointer(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLsizei") int stride, @NativeType("void const *") DoubleBuffer pointer) { + nglVertexAttribLPointer(index, size, GL11.GL_DOUBLE, stride, memAddress(pointer)); + } + + // --- [ glGetVertexAttribLdv ] --- + + /** Unsafe version of: {@link #glGetVertexAttribLdv GetVertexAttribLdv} */ + public static native void nglGetVertexAttribLdv(int index, int pname, long params); + + /** + * Double version of {@link GL20C#glGetVertexAttribiv GetVertexAttribiv}. + * + * @param index the generic vertex attribute parameter to be queried + * @param pname the symbolic name of the vertex attribute parameter to be queried + * @param params the requested data + * + * @see Reference Page + */ + public static void glGetVertexAttribLdv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") DoubleBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetVertexAttribLdv(index, pname, memAddress(params)); + } + + // --- [ glViewportArrayv ] --- + + /** + * Unsafe version of: {@link #glViewportArrayv ViewportArrayv} + * + * @param count the number of viewports to set + */ + public static native void nglViewportArrayv(int first, int count, long v); + + /** + * Sets multiple viewports. + * + * @param first the first viewport to set + * @param v an array containing the viewport parameters + * + * @see Reference Page + */ + public static void glViewportArrayv(@NativeType("GLuint") int first, @NativeType("GLfloat const *") FloatBuffer v) { + nglViewportArrayv(first, v.remaining() >> 2, memAddress(v)); + } + + // --- [ glViewportIndexedf ] --- + + /** + * Sets a specified viewport. + * + * @param index the viewport to set + * @param x the left viewport coordinate + * @param y the bottom viewport coordinate + * @param w the viewport width + * @param h the viewport height + * + * @see Reference Page + */ + public static native void glViewportIndexedf(@NativeType("GLuint") int index, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y, @NativeType("GLfloat") float w, @NativeType("GLfloat") float h); + + // --- [ glViewportIndexedfv ] --- + + /** Unsafe version of: {@link #glViewportIndexedfv ViewportIndexedfv} */ + public static native void nglViewportIndexedfv(int index, long v); + + /** + * Pointer version of {@link #glViewportIndexedf ViewportIndexedf}. + * + * @param index the viewport to set + * @param v the viewport parameters + * + * @see Reference Page + */ + public static void glViewportIndexedfv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") FloatBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglViewportIndexedfv(index, memAddress(v)); + } + + // --- [ glScissorArrayv ] --- + + /** + * Unsafe version of: {@link #glScissorArrayv ScissorArrayv} + * + * @param count the number of scissor boxes to modify + */ + public static native void nglScissorArrayv(int first, int count, long v); + + /** + * Defines the scissor box for multiple viewports. + * + * @param first the index of the first viewport whose scissor box to modify + * @param v an array containing the left, bottom, width and height of each scissor box, in that order + * + * @see Reference Page + */ + public static void glScissorArrayv(@NativeType("GLuint") int first, @NativeType("GLint const *") IntBuffer v) { + nglScissorArrayv(first, v.remaining() >> 2, memAddress(v)); + } + + // --- [ glScissorIndexed ] --- + + /** + * Defines the scissor box for a specific viewport. + * + * @param index the index of the viewport whose scissor box to modify + * @param left the left scissor box coordinate + * @param bottom the bottom scissor box coordinate + * @param width the scissor box width + * @param height the scissor box height + * + * @see Reference Page + */ + public static native void glScissorIndexed(@NativeType("GLuint") int index, @NativeType("GLint") int left, @NativeType("GLint") int bottom, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glScissorIndexedv ] --- + + /** Unsafe version of: {@link #glScissorIndexedv ScissorIndexedv} */ + public static native void nglScissorIndexedv(int index, long v); + + /** + * Pointer version of {@link #glScissorIndexed ScissorIndexed}. + * + * @param index the index of the viewport whose scissor box to modify + * @param v an array containing the left, bottom, width and height of each scissor box, in that order + * + * @see Reference Page + */ + public static void glScissorIndexedv(@NativeType("GLuint") int index, @NativeType("GLint const *") IntBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglScissorIndexedv(index, memAddress(v)); + } + + // --- [ glDepthRangeArrayv ] --- + + /** + * Unsafe version of: {@link #glDepthRangeArrayv DepthRangeArrayv} + * + * @param count the number of viewports whose depth range to update + */ + public static native void nglDepthRangeArrayv(int first, int count, long v); + + /** + * Specifies mapping of depth values from normalized device coordinates to window coordinates for a specified set of viewports. + * + * @param first the index of the first viewport whose depth range to update + * @param v n array containing the near and far values for the depth range of each modified viewport + * + * @see Reference Page + */ + public static void glDepthRangeArrayv(@NativeType("GLuint") int first, @NativeType("GLdouble const *") DoubleBuffer v) { + nglDepthRangeArrayv(first, v.remaining() >> 1, memAddress(v)); + } + + // --- [ glDepthRangeIndexed ] --- + + /** + * Specifies mapping of depth values from normalized device coordinates to window coordinates for a specified viewport. + * + * @param index the index of the viewport whose depth range to update + * @param zNear the mapping of the near clipping plane to window coordinates. The initial value is 0. + * @param zFar the mapping of the far clipping plane to window coordinates. The initial value is 1. + * + * @see Reference Page + */ + public static native void glDepthRangeIndexed(@NativeType("GLuint") int index, @NativeType("GLdouble") double zNear, @NativeType("GLdouble") double zFar); + + // --- [ glGetFloati_v ] --- + + /** Unsafe version of: {@link #glGetFloati_v GetFloati_v} */ + public static native void nglGetFloati_v(int target, int index, long data); + + /** + * Queries the float value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetFloati_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer data) { + if (CHECKS) { + check(data, 1); + } + nglGetFloati_v(target, index, memAddress(data)); + } + + /** + * Queries the float value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetFloati(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer data = stack.callocFloat(1); + nglGetFloati_v(target, index, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetDoublei_v ] --- + + /** Unsafe version of: {@link #glGetDoublei_v GetDoublei_v} */ + public static native void nglGetDoublei_v(int target, int index, long data); + + /** + * Queries the double value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * @param data a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetDoublei_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") DoubleBuffer data) { + if (CHECKS) { + check(data, 1); + } + nglGetDoublei_v(target, index, memAddress(data)); + } + + /** + * Queries the double value of an indexed state variable. + * + * @param target the indexed state to query + * @param index the index of the element being queried + * + * @see Reference Page + */ + @NativeType("void") + public static double glGetDoublei(@NativeType("GLenum") int target, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer data = stack.callocDouble(1); + nglGetDoublei_v(target, index, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Array version of: {@link #glShaderBinary ShaderBinary} + * + * @see Reference Page + */ + public static void glShaderBinary(@NativeType("GLuint const *") int[] shaders, @NativeType("GLenum") int binaryformat, @NativeType("void const *") ByteBuffer binary) { + long __functionAddress = GL.getICD().glShaderBinary; + if (CHECKS) { + check(__functionAddress); + } + callPPV(shaders.length, shaders, binaryformat, memAddress(binary), binary.remaining(), __functionAddress); + } + + /** + * Array version of: {@link #glGetShaderPrecisionFormat GetShaderPrecisionFormat} + * + * @see Reference Page + */ + public static void glGetShaderPrecisionFormat(@NativeType("GLenum") int shadertype, @NativeType("GLenum") int precisiontype, @NativeType("GLint *") int[] range, @NativeType("GLint *") int[] precision) { + long __functionAddress = GL.getICD().glGetShaderPrecisionFormat; + if (CHECKS) { + check(__functionAddress); + check(range, 2); + check(precision, 1); + } + callPPV(shadertype, precisiontype, range, precision, __functionAddress); + } + + /** + * Array version of: {@link #glGetProgramBinary GetProgramBinary} + * + * @see Reference Page + */ + public static void glGetProgramBinary(@NativeType("GLuint") int program, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLenum *") int[] binaryFormat, @NativeType("void *") ByteBuffer binary) { + long __functionAddress = GL.getICD().glGetProgramBinary; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + check(binaryFormat, 1); + } + callPPPV(program, binary.remaining(), length, binaryFormat, memAddress(binary), __functionAddress); + } + + /** + * Array version of: {@link #glDeleteProgramPipelines DeleteProgramPipelines} + * + * @see Reference Page + */ + public static void glDeleteProgramPipelines(@NativeType("GLuint const *") int[] pipelines) { + long __functionAddress = GL.getICD().glDeleteProgramPipelines; + if (CHECKS) { + check(__functionAddress); + } + callPV(pipelines.length, pipelines, __functionAddress); + } + + /** + * Array version of: {@link #glGenProgramPipelines GenProgramPipelines} + * + * @see Reference Page + */ + public static void glGenProgramPipelines(@NativeType("GLuint *") int[] pipelines) { + long __functionAddress = GL.getICD().glGenProgramPipelines; + if (CHECKS) { + check(__functionAddress); + } + callPV(pipelines.length, pipelines, __functionAddress); + } + + /** + * Array version of: {@link #glGetProgramPipelineiv GetProgramPipelineiv} + * + * @see Reference Page + */ + public static void glGetProgramPipelineiv(@NativeType("GLuint") int pipeline, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetProgramPipelineiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pipeline, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform1iv ProgramUniform1iv} + * + * @see Reference Page + */ + public static void glProgramUniform1iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform1iv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform2iv ProgramUniform2iv} + * + * @see Reference Page + */ + public static void glProgramUniform2iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform2iv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform3iv ProgramUniform3iv} + * + * @see Reference Page + */ + public static void glProgramUniform3iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform3iv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform4iv ProgramUniform4iv} + * + * @see Reference Page + */ + public static void glProgramUniform4iv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform4iv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform1uiv ProgramUniform1uiv} + * + * @see Reference Page + */ + public static void glProgramUniform1uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform1uiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform2uiv ProgramUniform2uiv} + * + * @see Reference Page + */ + public static void glProgramUniform2uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform2uiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform3uiv ProgramUniform3uiv} + * + * @see Reference Page + */ + public static void glProgramUniform3uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform3uiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform4uiv ProgramUniform4uiv} + * + * @see Reference Page + */ + public static void glProgramUniform4uiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint const *") int[] value) { + long __functionAddress = GL.getICD().glProgramUniform4uiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform1fv ProgramUniform1fv} + * + * @see Reference Page + */ + public static void glProgramUniform1fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniform1fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform2fv ProgramUniform2fv} + * + * @see Reference Page + */ + public static void glProgramUniform2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniform2fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform3fv ProgramUniform3fv} + * + * @see Reference Page + */ + public static void glProgramUniform3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniform3fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform4fv ProgramUniform4fv} + * + * @see Reference Page + */ + public static void glProgramUniform4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniform4fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform1dv ProgramUniform1dv} + * + * @see Reference Page + */ + public static void glProgramUniform1dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniform1dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform2dv ProgramUniform2dv} + * + * @see Reference Page + */ + public static void glProgramUniform2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniform2dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform3dv ProgramUniform3dv} + * + * @see Reference Page + */ + public static void glProgramUniform3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniform3dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniform4dv ProgramUniform4dv} + * + * @see Reference Page + */ + public static void glProgramUniform4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniform4dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2fv ProgramUniformMatrix2fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3fv ProgramUniformMatrix3fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 9, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4fv ProgramUniformMatrix4fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 4, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2dv ProgramUniformMatrix2dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3dv ProgramUniformMatrix3dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 9, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4dv ProgramUniformMatrix4dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 4, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2x3fv ProgramUniformMatrix2x3fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2x3fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 6, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3x2fv ProgramUniformMatrix3x2fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3x2fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 6, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2x4fv ProgramUniformMatrix2x4fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2x4fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 3, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4x2fv ProgramUniformMatrix4x2fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x2fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4x2fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 3, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3x4fv ProgramUniformMatrix3x4fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x4fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3x4fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 12, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4x3fv ProgramUniformMatrix4x3fv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x3fv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4x3fv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 12, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2x3dv ProgramUniformMatrix2x3dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2x3dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 6, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3x2dv ProgramUniformMatrix3x2dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3x2dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 6, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix2x4dv ProgramUniformMatrix2x4dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix2x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix2x4dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 3, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4x2dv ProgramUniformMatrix4x2dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x2dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4x2dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 3, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix3x4dv ProgramUniformMatrix3x4dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix3x4dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix3x4dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 12, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glProgramUniformMatrix4x3dv ProgramUniformMatrix4x3dv} + * + * @see Reference Page + */ + public static void glProgramUniformMatrix4x3dv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLboolean") boolean transpose, @NativeType("GLdouble const *") double[] value) { + long __functionAddress = GL.getICD().glProgramUniformMatrix4x3dv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 12, transpose, value, __functionAddress); + } + + /** + * Array version of: {@link #glGetProgramPipelineInfoLog GetProgramPipelineInfoLog} + * + * @see Reference Page + */ + public static void glGetProgramPipelineInfoLog(@NativeType("GLuint") int pipeline, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer infoLog) { + long __functionAddress = GL.getICD().glGetProgramPipelineInfoLog; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(pipeline, infoLog.remaining(), length, memAddress(infoLog), __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribL1dv VertexAttribL1dv} + * + * @see Reference Page + */ + public static void glVertexAttribL1dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttribL1dv; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribL2dv VertexAttribL2dv} + * + * @see Reference Page + */ + public static void glVertexAttribL2dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttribL2dv; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribL3dv VertexAttribL3dv} + * + * @see Reference Page + */ + public static void glVertexAttribL3dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttribL3dv; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glVertexAttribL4dv VertexAttribL4dv} + * + * @see Reference Page + */ + public static void glVertexAttribL4dv(@NativeType("GLuint") int index, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glVertexAttribL4dv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glGetVertexAttribLdv GetVertexAttribLdv} + * + * @see Reference Page + */ + public static void glGetVertexAttribLdv(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribLdv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(index, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glViewportArrayv ViewportArrayv} + * + * @see Reference Page + */ + public static void glViewportArrayv(@NativeType("GLuint") int first, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glViewportArrayv; + if (CHECKS) { + check(__functionAddress); + } + callPV(first, v.length >> 2, v, __functionAddress); + } + + /** + * Array version of: {@link #glViewportIndexedfv ViewportIndexedfv} + * + * @see Reference Page + */ + public static void glViewportIndexedfv(@NativeType("GLuint") int index, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glViewportIndexedfv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glScissorArrayv ScissorArrayv} + * + * @see Reference Page + */ + public static void glScissorArrayv(@NativeType("GLuint") int first, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glScissorArrayv; + if (CHECKS) { + check(__functionAddress); + } + callPV(first, v.length >> 2, v, __functionAddress); + } + + /** + * Array version of: {@link #glScissorIndexedv ScissorIndexedv} + * + * @see Reference Page + */ + public static void glScissorIndexedv(@NativeType("GLuint") int index, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glScissorIndexedv; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** + * Array version of: {@link #glDepthRangeArrayv DepthRangeArrayv} + * + * @see Reference Page + */ + public static void glDepthRangeArrayv(@NativeType("GLuint") int first, @NativeType("GLdouble const *") double[] v) { + long __functionAddress = GL.getICD().glDepthRangeArrayv; + if (CHECKS) { + check(__functionAddress); + } + callPV(first, v.length >> 1, v, __functionAddress); + } + + /** + * Array version of: {@link #glGetFloati_v GetFloati_v} + * + * @see Reference Page + */ + public static void glGetFloati_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] data) { + long __functionAddress = GL.getICD().glGetFloati_v; + if (CHECKS) { + check(__functionAddress); + check(data, 1); + } + callPV(target, index, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetDoublei_v GetDoublei_v} + * + * @see Reference Page + */ + public static void glGetDoublei_v(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLdouble *") double[] data) { + long __functionAddress = GL.getICD().glGetDoublei_v; + if (CHECKS) { + check(__functionAddress); + check(data, 1); + } + callPV(target, index, data, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL42.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL42.java new file mode 100644 index 000000000..381bd58d3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL42.java @@ -0,0 +1,610 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 4.2. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 4.2 implementations support revision 4.20 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL42 extends GL41 { + + static { GL.initialize(); } + + /** Renamed tokens. */ + public static final int + GL_COPY_READ_BUFFER_BINDING = GL31.GL_COPY_READ_BUFFER, + GL_COPY_WRITE_BUFFER_BINDING = GL31.GL_COPY_WRITE_BUFFER, + GL_TRANSFORM_FEEDBACK_ACTIVE = GL40.GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE, + GL_TRANSFORM_FEEDBACK_PAUSED = GL40.GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED; + + /** + * Accepted by the {@code internalformat} parameter of TexImage2D, TexImage3D, CopyTexImage2D, CopyTexImage3D, CompressedTexImage2D, and + * CompressedTexImage3D and the {@code format} parameter of CompressedTexSubImage2D and CompressedTexSubImage3D. + */ + public static final int + GL_COMPRESSED_RGBA_BPTC_UNORM = 0x8E8C, + GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 0x8E8D, + GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 0x8E8E, + GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 0x8E8F; + + /** Accepted by the {@code pname} parameter of PixelStore[fi], GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_UNPACK_COMPRESSED_BLOCK_WIDTH = 0x9127, + GL_UNPACK_COMPRESSED_BLOCK_HEIGHT = 0x9128, + GL_UNPACK_COMPRESSED_BLOCK_DEPTH = 0x9129, + GL_UNPACK_COMPRESSED_BLOCK_SIZE = 0x912A, + GL_PACK_COMPRESSED_BLOCK_WIDTH = 0x912B, + GL_PACK_COMPRESSED_BLOCK_HEIGHT = 0x912C, + GL_PACK_COMPRESSED_BLOCK_DEPTH = 0x912D, + GL_PACK_COMPRESSED_BLOCK_SIZE = 0x912E; + + /** Accepted by the {@code target} parameter of BindBufferBase and BindBufferRange. */ + public static final int GL_ATOMIC_COUNTER_BUFFER = 0x92C0; + + /** + * Accepted by the {@code pname} parameter of GetBooleani_v, GetIntegeri_v, GetFloati_v, GetDoublei_v, GetInteger64i_v, GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, GetDoublev, and GetActiveAtomicCounterBufferiv. + */ + public static final int GL_ATOMIC_COUNTER_BUFFER_BINDING = 0x92C1; + + /** Accepted by the {@code pname} parameter of GetIntegeri_64v. */ + public static final int + GL_ATOMIC_COUNTER_BUFFER_START = 0x92C2, + GL_ATOMIC_COUNTER_BUFFER_SIZE = 0x92C3; + + /** Accepted by the {@code pname} parameter of GetActiveAtomicCounterBufferiv. */ + public static final int + GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE = 0x92C4, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS = 0x92C5, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES = 0x92C6, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER = 0x92C7, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER = 0x92C8, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x92C9, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER = 0x92CA, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER = 0x92CB; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS = 0x92CC, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS = 0x92CD, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS = 0x92CE, + GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS = 0x92CF, + GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS = 0x92D0, + GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS = 0x92D1, + GL_MAX_VERTEX_ATOMIC_COUNTERS = 0x92D2, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS = 0x92D3, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS = 0x92D4, + GL_MAX_GEOMETRY_ATOMIC_COUNTERS = 0x92D5, + GL_MAX_FRAGMENT_ATOMIC_COUNTERS = 0x92D6, + GL_MAX_COMBINED_ATOMIC_COUNTERS = 0x92D7, + GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE = 0x92D8, + GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 0x92DC; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_ACTIVE_ATOMIC_COUNTER_BUFFERS = 0x92D9; + + /** Accepted by the {@code pname} parameter of GetActiveUniformsiv. */ + public static final int GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX = 0x92DA; + + /** Returned in {@code params} by GetActiveUniform and GetActiveUniformsiv. */ + public static final int GL_UNSIGNED_INT_ATOMIC_COUNTER = 0x92DB; + + /** Accepted by the {@code value} parameter of GetTexParameter{if}v. */ + public static final int GL_TEXTURE_IMMUTABLE_FORMAT = 0x912F; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int + GL_MAX_IMAGE_UNITS = 0x8F38, + GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS = 0x8F39, + GL_MAX_IMAGE_SAMPLES = 0x906D, + GL_MAX_VERTEX_IMAGE_UNIFORMS = 0x90CA, + GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS = 0x90CB, + GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS = 0x90CC, + GL_MAX_GEOMETRY_IMAGE_UNIFORMS = 0x90CD, + GL_MAX_FRAGMENT_IMAGE_UNIFORMS = 0x90CE, + GL_MAX_COMBINED_IMAGE_UNIFORMS = 0x90CF; + + /** Accepted by the {@code target} parameter of GetIntegeri_v and GetBooleani_v. */ + public static final int + GL_IMAGE_BINDING_NAME = 0x8F3A, + GL_IMAGE_BINDING_LEVEL = 0x8F3B, + GL_IMAGE_BINDING_LAYERED = 0x8F3C, + GL_IMAGE_BINDING_LAYER = 0x8F3D, + GL_IMAGE_BINDING_ACCESS = 0x8F3E, + GL_IMAGE_BINDING_FORMAT = 0x906E; + + /** Accepted by the {@code barriers} parameter of MemoryBarrier. */ + public static final int + GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT = 0x1, + GL_ELEMENT_ARRAY_BARRIER_BIT = 0x2, + GL_UNIFORM_BARRIER_BIT = 0x4, + GL_TEXTURE_FETCH_BARRIER_BIT = 0x8, + GL_SHADER_IMAGE_ACCESS_BARRIER_BIT = 0x20, + GL_COMMAND_BARRIER_BIT = 0x40, + GL_PIXEL_BUFFER_BARRIER_BIT = 0x80, + GL_TEXTURE_UPDATE_BARRIER_BIT = 0x100, + GL_BUFFER_UPDATE_BARRIER_BIT = 0x200, + GL_FRAMEBUFFER_BARRIER_BIT = 0x400, + GL_TRANSFORM_FEEDBACK_BARRIER_BIT = 0x800, + GL_ATOMIC_COUNTER_BARRIER_BIT = 0x1000, + GL_ALL_BARRIER_BITS = 0xFFFFFFFF; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_IMAGE_1D = 0x904C, + GL_IMAGE_2D = 0x904D, + GL_IMAGE_3D = 0x904E, + GL_IMAGE_2D_RECT = 0x904F, + GL_IMAGE_CUBE = 0x9050, + GL_IMAGE_BUFFER = 0x9051, + GL_IMAGE_1D_ARRAY = 0x9052, + GL_IMAGE_2D_ARRAY = 0x9053, + GL_IMAGE_CUBE_MAP_ARRAY = 0x9054, + GL_IMAGE_2D_MULTISAMPLE = 0x9055, + GL_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9056, + GL_INT_IMAGE_1D = 0x9057, + GL_INT_IMAGE_2D = 0x9058, + GL_INT_IMAGE_3D = 0x9059, + GL_INT_IMAGE_2D_RECT = 0x905A, + GL_INT_IMAGE_CUBE = 0x905B, + GL_INT_IMAGE_BUFFER = 0x905C, + GL_INT_IMAGE_1D_ARRAY = 0x905D, + GL_INT_IMAGE_2D_ARRAY = 0x905E, + GL_INT_IMAGE_CUBE_MAP_ARRAY = 0x905F, + GL_INT_IMAGE_2D_MULTISAMPLE = 0x9060, + GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9061, + GL_UNSIGNED_INT_IMAGE_1D = 0x9062, + GL_UNSIGNED_INT_IMAGE_2D = 0x9063, + GL_UNSIGNED_INT_IMAGE_3D = 0x9064, + GL_UNSIGNED_INT_IMAGE_2D_RECT = 0x9065, + GL_UNSIGNED_INT_IMAGE_CUBE = 0x9066, + GL_UNSIGNED_INT_IMAGE_BUFFER = 0x9067, + GL_UNSIGNED_INT_IMAGE_1D_ARRAY = 0x9068, + GL_UNSIGNED_INT_IMAGE_2D_ARRAY = 0x9069, + GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY = 0x906A, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE = 0x906B, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x906C; + + /** Accepted by the {@code value} parameter of GetTexParameteriv, GetTexParameterfv, GetTexParameterIiv, and GetTexParameterIuiv. */ + public static final int GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7; + + /** + * Returned in the {@code data} parameter of GetTexParameteriv, GetTexParameterfv, GetTexParameterIiv, and GetTexParameterIuiv when {@code value} is + * IMAGE_FORMAT_COMPATIBILITY_TYPE. + */ + public static final int + GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE = 0x90C8, + GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS = 0x90C9; + + /** Accepted by the {@code pname} parameter of GetInternalformativ. */ + public static final int GL_NUM_SAMPLE_COUNTS = 0x9380; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_MIN_MAP_BUFFER_ALIGNMENT = 0x90BC; + + protected GL42() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetActiveAtomicCounterBufferiv ] --- + + /** Unsafe version of: {@link #glGetActiveAtomicCounterBufferiv GetActiveAtomicCounterBufferiv} */ + public static void nglGetActiveAtomicCounterBufferiv(int program, int bufferIndex, int pname, long params) { + GL42C.nglGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params); + } + + /** + * Obtains information about the set of active atomic counter buffers for a program. + * + * @param program the name of a program object for which the command {@link GL20C#glLinkProgram LinkProgram} has been issued in the past + * @param bufferIndex the index of an active atomic counter buffer + * @param pname the parameter to query. One of:
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE ATOMIC_COUNTER_BUFFER_DATA_SIZE}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER}
    + * @param params a buffer in which to place the returned value + * + * @see Reference Page + */ + public static void glGetActiveAtomicCounterBufferiv(@NativeType("GLuint") int program, @NativeType("GLuint") int bufferIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL42C.glGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params); + } + + /** + * Obtains information about the set of active atomic counter buffers for a program. + * + * @param program the name of a program object for which the command {@link GL20C#glLinkProgram LinkProgram} has been issued in the past + * @param bufferIndex the index of an active atomic counter buffer + * @param pname the parameter to query. One of:
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE ATOMIC_COUNTER_BUFFER_DATA_SIZE}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER}
    {@link GL42C#GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetActiveAtomicCounterBufferi(@NativeType("GLuint") int program, @NativeType("GLuint") int bufferIndex, @NativeType("GLenum") int pname) { + return GL42C.glGetActiveAtomicCounterBufferi(program, bufferIndex, pname); + } + + // --- [ glTexStorage1D ] --- + + /** + * Simultaneously specifies storage for all levels of a one-dimensional texture. + * + * @param target the target of the operation. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * + * @see Reference Page + */ + public static void glTexStorage1D(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width) { + GL42C.glTexStorage1D(target, levels, internalformat, width); + } + + // --- [ glTexStorage2D ] --- + + /** + * Simultaneously specifies storage for all levels of a two-dimensional or one-dimensional array texture. + * + * @param target the target of the operation. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * + * @see Reference Page + */ + public static void glTexStorage2D(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL42C.glTexStorage2D(target, levels, internalformat, width, height); + } + + // --- [ glTexStorage3D ] --- + + /** + * Simultaneously specifies storage for all levels of a three-dimensional, two-dimensional array or cube-map array texture. + * + * @param target the target of the operation. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + * + * @see Reference Page + */ + public static void glTexStorage3D(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth) { + GL42C.glTexStorage3D(target, levels, internalformat, width, height, depth); + } + + // --- [ glDrawTransformFeedbackInstanced ] --- + + /** + * Renders multiple instances of primitives using a count derived from a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + * @param primcount the number of instances of the geometry to render + * + * @see Reference Page + */ + public static void glDrawTransformFeedbackInstanced(@NativeType("GLenum") int mode, @NativeType("GLuint") int id, @NativeType("GLsizei") int primcount) { + GL42C.glDrawTransformFeedbackInstanced(mode, id, primcount); + } + + // --- [ glDrawTransformFeedbackStreamInstanced ] --- + + /** + * Renders multiple instances of primitives using a count derived from a specifed stream of a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + * @param stream the index of the transform feedback stream from which to retrieve a primitive count + * @param primcount the number of instances of the geometry to render + * + * @see Reference Page + */ + public static void glDrawTransformFeedbackStreamInstanced(@NativeType("GLenum") int mode, @NativeType("GLuint") int id, @NativeType("GLuint") int stream, @NativeType("GLsizei") int primcount) { + GL42C.glDrawTransformFeedbackStreamInstanced(mode, id, stream, primcount); + } + + // --- [ glDrawArraysInstancedBaseInstance ] --- + + /** + * Draws multiple instances of a range of elements with an offset applied to instanced attributes. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param first the starting index in the enabled arrays + * @param count the number of indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawArraysInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLint") int first, @NativeType("GLsizei") int count, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawArraysInstancedBaseInstance(mode, first, count, primcount, baseinstance); + } + + // --- [ glDrawElementsInstancedBaseInstance ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstancedBaseInstance DrawElementsInstancedBaseInstance} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawElementsInstancedBaseInstance(int mode, int count, int type, long indices, int primcount, int baseinstance) { + GL42C.nglDrawElementsInstancedBaseInstance(mode, count, type, indices, primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseInstance(mode, count, type, indices, primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseInstance(mode, type, indices, primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseInstance(mode, indices, primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseInstance(mode, indices, primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseInstance(mode, indices, primcount, baseinstance); + } + + // --- [ glDrawElementsInstancedBaseVertexBaseInstance ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static void nglDrawElementsInstancedBaseVertexBaseInstance(int mode, int count, int type, long indices, int primcount, int basevertex, int baseinstance) { + GL42C.nglDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseVertexBaseInstance(mode, type, indices, primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseVertexBaseInstance(mode, indices, primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseVertexBaseInstance(mode, indices, primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + GL42C.glDrawElementsInstancedBaseVertexBaseInstance(mode, indices, primcount, basevertex, baseinstance); + } + + // --- [ glBindImageTexture ] --- + + /** + * Binds a level of a texture to an image unit. + * + * @param unit the index of the image unit to which to bind the texture + * @param texture the name of the texture to bind to the image unit + * @param level the level of the texture that is to be bound + * @param layered whether a layered texture binding is to be established + * @param layer if {@code layered} is false, specifies the layer of texture to be bound to the image unit. Ignored otherwise. + * @param access a token indicating the type of access that will be performed on the image + * @param format the format that the elements of the image will be treated as for the purposes of formatted stores + * + * @see Reference Page + */ + public static void glBindImageTexture(@NativeType("GLuint") int unit, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLboolean") boolean layered, @NativeType("GLint") int layer, @NativeType("GLenum") int access, @NativeType("GLenum") int format) { + GL42C.glBindImageTexture(unit, texture, level, layered, layer, access, format); + } + + // --- [ glMemoryBarrier ] --- + + /** + * Defines a barrier ordering memory transactions. + * + * @param barriers the barriers to insert (bitwise combination). One or more of:
    {@link GL42C#GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT VERTEX_ATTRIB_ARRAY_BARRIER_BIT}{@link GL42C#GL_ELEMENT_ARRAY_BARRIER_BIT ELEMENT_ARRAY_BARRIER_BIT}{@link GL42C#GL_UNIFORM_BARRIER_BIT UNIFORM_BARRIER_BIT}
    {@link GL42C#GL_TEXTURE_FETCH_BARRIER_BIT TEXTURE_FETCH_BARRIER_BIT}{@link GL42C#GL_SHADER_IMAGE_ACCESS_BARRIER_BIT SHADER_IMAGE_ACCESS_BARRIER_BIT}{@link GL42C#GL_COMMAND_BARRIER_BIT COMMAND_BARRIER_BIT}
    {@link GL42C#GL_PIXEL_BUFFER_BARRIER_BIT PIXEL_BUFFER_BARRIER_BIT}{@link GL42C#GL_TEXTURE_UPDATE_BARRIER_BIT TEXTURE_UPDATE_BARRIER_BIT}{@link GL42C#GL_BUFFER_UPDATE_BARRIER_BIT BUFFER_UPDATE_BARRIER_BIT}
    {@link GL42C#GL_FRAMEBUFFER_BARRIER_BIT FRAMEBUFFER_BARRIER_BIT}{@link GL42C#GL_TRANSFORM_FEEDBACK_BARRIER_BIT TRANSFORM_FEEDBACK_BARRIER_BIT}{@link GL42C#GL_ATOMIC_COUNTER_BARRIER_BIT ATOMIC_COUNTER_BARRIER_BIT}
    {@link GL42C#GL_ALL_BARRIER_BITS ALL_BARRIER_BITS}{@link GL43#GL_SHADER_STORAGE_BARRIER_BIT SHADER_STORAGE_BARRIER_BIT}
    + * + * @see Reference Page + */ + public static void glMemoryBarrier(@NativeType("GLbitfield") int barriers) { + GL42C.glMemoryBarrier(barriers); + } + + // --- [ glGetInternalformativ ] --- + + /** + * Unsafe version of: {@link #glGetInternalformativ GetInternalformativ} + * + * @param bufSize the maximum number of values that may be written to params by the function + */ + public static void nglGetInternalformativ(int target, int internalformat, int pname, int bufSize, long params) { + GL42C.nglGetInternalformativ(target, internalformat, pname, bufSize, params); + } + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + * @param params a variable into which to write the retrieved information + * + * @see Reference Page + */ + public static void glGetInternalformativ(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL42C.glGetInternalformativ(target, internalformat, pname, params); + } + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetInternalformati(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname) { + return GL42C.glGetInternalformati(target, internalformat, pname); + } + + /** + * Array version of: {@link #glGetActiveAtomicCounterBufferiv GetActiveAtomicCounterBufferiv} + * + * @see Reference Page + */ + public static void glGetActiveAtomicCounterBufferiv(@NativeType("GLuint") int program, @NativeType("GLuint") int bufferIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL42C.glGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params); + } + + /** + * Array version of: {@link #glGetInternalformativ GetInternalformativ} + * + * @see Reference Page + */ + public static void glGetInternalformativ(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL42C.glGetInternalformativ(target, internalformat, pname, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL42C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL42C.java new file mode 100644 index 000000000..6cd3d423a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL42C.java @@ -0,0 +1,617 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 4.2. Includes only Core Profile symbols. + * + *

    OpenGL 4.2 implementations support revision 4.20 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL42C extends GL41C { + + static { GL.initialize(); } + + /** Renamed tokens. */ + public static final int + GL_COPY_READ_BUFFER_BINDING = GL31.GL_COPY_READ_BUFFER, + GL_COPY_WRITE_BUFFER_BINDING = GL31.GL_COPY_WRITE_BUFFER, + GL_TRANSFORM_FEEDBACK_ACTIVE = GL40.GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE, + GL_TRANSFORM_FEEDBACK_PAUSED = GL40.GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED; + + /** + * Accepted by the {@code internalformat} parameter of TexImage2D, TexImage3D, CopyTexImage2D, CopyTexImage3D, CompressedTexImage2D, and + * CompressedTexImage3D and the {@code format} parameter of CompressedTexSubImage2D and CompressedTexSubImage3D. + */ + public static final int + GL_COMPRESSED_RGBA_BPTC_UNORM = 0x8E8C, + GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 0x8E8D, + GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 0x8E8E, + GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 0x8E8F; + + /** Accepted by the {@code pname} parameter of PixelStore[fi], GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_UNPACK_COMPRESSED_BLOCK_WIDTH = 0x9127, + GL_UNPACK_COMPRESSED_BLOCK_HEIGHT = 0x9128, + GL_UNPACK_COMPRESSED_BLOCK_DEPTH = 0x9129, + GL_UNPACK_COMPRESSED_BLOCK_SIZE = 0x912A, + GL_PACK_COMPRESSED_BLOCK_WIDTH = 0x912B, + GL_PACK_COMPRESSED_BLOCK_HEIGHT = 0x912C, + GL_PACK_COMPRESSED_BLOCK_DEPTH = 0x912D, + GL_PACK_COMPRESSED_BLOCK_SIZE = 0x912E; + + /** Accepted by the {@code target} parameter of BindBufferBase and BindBufferRange. */ + public static final int GL_ATOMIC_COUNTER_BUFFER = 0x92C0; + + /** + * Accepted by the {@code pname} parameter of GetBooleani_v, GetIntegeri_v, GetFloati_v, GetDoublei_v, GetInteger64i_v, GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, GetDoublev, and GetActiveAtomicCounterBufferiv. + */ + public static final int GL_ATOMIC_COUNTER_BUFFER_BINDING = 0x92C1; + + /** Accepted by the {@code pname} parameter of GetIntegeri_64v. */ + public static final int + GL_ATOMIC_COUNTER_BUFFER_START = 0x92C2, + GL_ATOMIC_COUNTER_BUFFER_SIZE = 0x92C3; + + /** Accepted by the {@code pname} parameter of GetActiveAtomicCounterBufferiv. */ + public static final int + GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE = 0x92C4, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS = 0x92C5, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES = 0x92C6, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER = 0x92C7, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER = 0x92C8, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x92C9, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER = 0x92CA, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER = 0x92CB; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS = 0x92CC, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS = 0x92CD, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS = 0x92CE, + GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS = 0x92CF, + GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS = 0x92D0, + GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS = 0x92D1, + GL_MAX_VERTEX_ATOMIC_COUNTERS = 0x92D2, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS = 0x92D3, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS = 0x92D4, + GL_MAX_GEOMETRY_ATOMIC_COUNTERS = 0x92D5, + GL_MAX_FRAGMENT_ATOMIC_COUNTERS = 0x92D6, + GL_MAX_COMBINED_ATOMIC_COUNTERS = 0x92D7, + GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE = 0x92D8, + GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 0x92DC; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_ACTIVE_ATOMIC_COUNTER_BUFFERS = 0x92D9; + + /** Accepted by the {@code pname} parameter of GetActiveUniformsiv. */ + public static final int GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX = 0x92DA; + + /** Returned in {@code params} by GetActiveUniform and GetActiveUniformsiv. */ + public static final int GL_UNSIGNED_INT_ATOMIC_COUNTER = 0x92DB; + + /** Accepted by the {@code value} parameter of GetTexParameter{if}v. */ + public static final int GL_TEXTURE_IMMUTABLE_FORMAT = 0x912F; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int + GL_MAX_IMAGE_UNITS = 0x8F38, + GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS = 0x8F39, + GL_MAX_IMAGE_SAMPLES = 0x906D, + GL_MAX_VERTEX_IMAGE_UNIFORMS = 0x90CA, + GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS = 0x90CB, + GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS = 0x90CC, + GL_MAX_GEOMETRY_IMAGE_UNIFORMS = 0x90CD, + GL_MAX_FRAGMENT_IMAGE_UNIFORMS = 0x90CE, + GL_MAX_COMBINED_IMAGE_UNIFORMS = 0x90CF; + + /** Accepted by the {@code target} parameter of GetIntegeri_v and GetBooleani_v. */ + public static final int + GL_IMAGE_BINDING_NAME = 0x8F3A, + GL_IMAGE_BINDING_LEVEL = 0x8F3B, + GL_IMAGE_BINDING_LAYERED = 0x8F3C, + GL_IMAGE_BINDING_LAYER = 0x8F3D, + GL_IMAGE_BINDING_ACCESS = 0x8F3E, + GL_IMAGE_BINDING_FORMAT = 0x906E; + + /** Accepted by the {@code barriers} parameter of MemoryBarrier. */ + public static final int + GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT = 0x1, + GL_ELEMENT_ARRAY_BARRIER_BIT = 0x2, + GL_UNIFORM_BARRIER_BIT = 0x4, + GL_TEXTURE_FETCH_BARRIER_BIT = 0x8, + GL_SHADER_IMAGE_ACCESS_BARRIER_BIT = 0x20, + GL_COMMAND_BARRIER_BIT = 0x40, + GL_PIXEL_BUFFER_BARRIER_BIT = 0x80, + GL_TEXTURE_UPDATE_BARRIER_BIT = 0x100, + GL_BUFFER_UPDATE_BARRIER_BIT = 0x200, + GL_FRAMEBUFFER_BARRIER_BIT = 0x400, + GL_TRANSFORM_FEEDBACK_BARRIER_BIT = 0x800, + GL_ATOMIC_COUNTER_BARRIER_BIT = 0x1000, + GL_ALL_BARRIER_BITS = 0xFFFFFFFF; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_IMAGE_1D = 0x904C, + GL_IMAGE_2D = 0x904D, + GL_IMAGE_3D = 0x904E, + GL_IMAGE_2D_RECT = 0x904F, + GL_IMAGE_CUBE = 0x9050, + GL_IMAGE_BUFFER = 0x9051, + GL_IMAGE_1D_ARRAY = 0x9052, + GL_IMAGE_2D_ARRAY = 0x9053, + GL_IMAGE_CUBE_MAP_ARRAY = 0x9054, + GL_IMAGE_2D_MULTISAMPLE = 0x9055, + GL_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9056, + GL_INT_IMAGE_1D = 0x9057, + GL_INT_IMAGE_2D = 0x9058, + GL_INT_IMAGE_3D = 0x9059, + GL_INT_IMAGE_2D_RECT = 0x905A, + GL_INT_IMAGE_CUBE = 0x905B, + GL_INT_IMAGE_BUFFER = 0x905C, + GL_INT_IMAGE_1D_ARRAY = 0x905D, + GL_INT_IMAGE_2D_ARRAY = 0x905E, + GL_INT_IMAGE_CUBE_MAP_ARRAY = 0x905F, + GL_INT_IMAGE_2D_MULTISAMPLE = 0x9060, + GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9061, + GL_UNSIGNED_INT_IMAGE_1D = 0x9062, + GL_UNSIGNED_INT_IMAGE_2D = 0x9063, + GL_UNSIGNED_INT_IMAGE_3D = 0x9064, + GL_UNSIGNED_INT_IMAGE_2D_RECT = 0x9065, + GL_UNSIGNED_INT_IMAGE_CUBE = 0x9066, + GL_UNSIGNED_INT_IMAGE_BUFFER = 0x9067, + GL_UNSIGNED_INT_IMAGE_1D_ARRAY = 0x9068, + GL_UNSIGNED_INT_IMAGE_2D_ARRAY = 0x9069, + GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY = 0x906A, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE = 0x906B, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x906C; + + /** Accepted by the {@code value} parameter of GetTexParameteriv, GetTexParameterfv, GetTexParameterIiv, and GetTexParameterIuiv. */ + public static final int GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7; + + /** + * Returned in the {@code data} parameter of GetTexParameteriv, GetTexParameterfv, GetTexParameterIiv, and GetTexParameterIuiv when {@code value} is + * IMAGE_FORMAT_COMPATIBILITY_TYPE. + */ + public static final int + GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE = 0x90C8, + GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS = 0x90C9; + + /** Accepted by the {@code pname} parameter of GetInternalformativ. */ + public static final int GL_NUM_SAMPLE_COUNTS = 0x9380; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_MIN_MAP_BUFFER_ALIGNMENT = 0x90BC; + + protected GL42C() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetActiveAtomicCounterBufferiv ] --- + + /** Unsafe version of: {@link #glGetActiveAtomicCounterBufferiv GetActiveAtomicCounterBufferiv} */ + public static native void nglGetActiveAtomicCounterBufferiv(int program, int bufferIndex, int pname, long params); + + /** + * Obtains information about the set of active atomic counter buffers for a program. + * + * @param program the name of a program object for which the command {@link GL20C#glLinkProgram LinkProgram} has been issued in the past + * @param bufferIndex the index of an active atomic counter buffer + * @param pname the parameter to query. One of:
    {@link #GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE ATOMIC_COUNTER_BUFFER_DATA_SIZE}
    {@link #GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS}
    {@link #GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES}
    {@link #GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER}
    {@link #GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER}
    {@link #GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER}
    {@link #GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER}
    {@link #GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER}
    + * @param params a buffer in which to place the returned value + * + * @see Reference Page + */ + public static void glGetActiveAtomicCounterBufferiv(@NativeType("GLuint") int program, @NativeType("GLuint") int bufferIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, memAddress(params)); + } + + /** + * Obtains information about the set of active atomic counter buffers for a program. + * + * @param program the name of a program object for which the command {@link GL20C#glLinkProgram LinkProgram} has been issued in the past + * @param bufferIndex the index of an active atomic counter buffer + * @param pname the parameter to query. One of:
    {@link #GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE ATOMIC_COUNTER_BUFFER_DATA_SIZE}
    {@link #GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS}
    {@link #GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES}
    {@link #GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER}
    {@link #GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER}
    {@link #GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER}
    {@link #GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER}
    {@link #GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetActiveAtomicCounterBufferi(@NativeType("GLuint") int program, @NativeType("GLuint") int bufferIndex, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glTexStorage1D ] --- + + /** + * Simultaneously specifies storage for all levels of a one-dimensional texture. + * + * @param target the target of the operation. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_PROXY_TEXTURE_1D PROXY_TEXTURE_1D}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * + * @see Reference Page + */ + public static native void glTexStorage1D(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width); + + // --- [ glTexStorage2D ] --- + + /** + * Simultaneously specifies storage for all levels of a two-dimensional or one-dimensional array texture. + * + * @param target the target of the operation. One of:
    {@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL11#GL_PROXY_TEXTURE_2D PROXY_TEXTURE_2D}{@link GL30#GL_PROXY_TEXTURE_1D_ARRAY PROXY_TEXTURE_1D_ARRAY}{@link GL31#GL_PROXY_TEXTURE_RECTANGLE PROXY_TEXTURE_RECTANGLE}{@link GL13#GL_PROXY_TEXTURE_CUBE_MAP PROXY_TEXTURE_CUBE_MAP}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * + * @see Reference Page + */ + public static native void glTexStorage2D(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glTexStorage3D ] --- + + /** + * Simultaneously specifies storage for all levels of a three-dimensional, two-dimensional array or cube-map array texture. + * + * @param target the target of the operation. One of:
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL12#GL_PROXY_TEXTURE_3D PROXY_TEXTURE_3D}
    {@link GL30#GL_PROXY_TEXTURE_2D_ARRAY PROXY_TEXTURE_2D_ARRAY}{@link GL40#GL_PROXY_TEXTURE_CUBE_MAP_ARRAY PROXY_TEXTURE_CUBE_MAP_ARRAY}
    + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + * + * @see Reference Page + */ + public static native void glTexStorage3D(@NativeType("GLenum") int target, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth); + + // --- [ glDrawTransformFeedbackInstanced ] --- + + /** + * Renders multiple instances of primitives using a count derived from a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + * @param primcount the number of instances of the geometry to render + * + * @see Reference Page + */ + public static native void glDrawTransformFeedbackInstanced(@NativeType("GLenum") int mode, @NativeType("GLuint") int id, @NativeType("GLsizei") int primcount); + + // --- [ glDrawTransformFeedbackStreamInstanced ] --- + + /** + * Renders multiple instances of primitives using a count derived from a specifed stream of a transform feedback object. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param id the name of a transform feedback object from which to retrieve a primitive count + * @param stream the index of the transform feedback stream from which to retrieve a primitive count + * @param primcount the number of instances of the geometry to render + * + * @see Reference Page + */ + public static native void glDrawTransformFeedbackStreamInstanced(@NativeType("GLenum") int mode, @NativeType("GLuint") int id, @NativeType("GLuint") int stream, @NativeType("GLsizei") int primcount); + + // --- [ glDrawArraysInstancedBaseInstance ] --- + + /** + * Draws multiple instances of a range of elements with an offset applied to instanced attributes. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param first the starting index in the enabled arrays + * @param count the number of indices to be rendered + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static native void glDrawArraysInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLint") int first, @NativeType("GLsizei") int count, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance); + + // --- [ glDrawElementsInstancedBaseInstance ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstancedBaseInstance DrawElementsInstancedBaseInstance} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static native void nglDrawElementsInstancedBaseInstance(int mode, int count, int type, long indices, int primcount, int baseinstance); + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + nglDrawElementsInstancedBaseInstance(mode, count, type, indices, primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + nglDrawElementsInstancedBaseInstance(mode, indices.remaining() >> GLChecks.typeToByteShift(type), type, memAddress(indices), primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + nglDrawElementsInstancedBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, memAddress(indices), primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + nglDrawElementsInstancedBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, memAddress(indices), primcount, baseinstance); + } + + /** + * Draws multiple instances of a set of elements with an offset applied to instanced attributes + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the specified range of indices to be rendered + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLuint") int baseinstance) { + nglDrawElementsInstancedBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, memAddress(indices), primcount, baseinstance); + } + + // --- [ glDrawElementsInstancedBaseVertexBaseInstance ] --- + + /** + * Unsafe version of: {@link #glDrawElementsInstancedBaseVertexBaseInstance DrawElementsInstancedBaseVertexBaseInstance} + * + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + */ + public static native void nglDrawElementsInstancedBaseVertexBaseInstance(int mode, int count, int type, long indices, int primcount, int basevertex, int baseinstance); + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param count the number of elements to be rendered + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLsizei") int count, @NativeType("GLenum") int type, @NativeType("void const *") long indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + nglDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of the values in {@code indices}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + nglDrawElementsInstancedBaseVertexBaseInstance(mode, indices.remaining() >> GLChecks.typeToByteShift(type), type, memAddress(indices), primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + nglDrawElementsInstancedBaseVertexBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, memAddress(indices), primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") ShortBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + nglDrawElementsInstancedBaseVertexBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, memAddress(indices), primcount, basevertex, baseinstance); + } + + /** + * Renders multiple instances of a set of primitives from array data with a per-element offset. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indices a pointer to the location where the indices are stored + * @param primcount the number of instances of the indexed geometry that should be drawn + * @param basevertex a constant that should be added to each element of {@code indices} when choosing elements from the enabled vertex arrays + * @param baseinstance the base instance for use in fetching instanced vertex attributes + * + * @see Reference Page + */ + public static void glDrawElementsInstancedBaseVertexBaseInstance(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indices, @NativeType("GLsizei") int primcount, @NativeType("GLint") int basevertex, @NativeType("GLuint") int baseinstance) { + nglDrawElementsInstancedBaseVertexBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, memAddress(indices), primcount, basevertex, baseinstance); + } + + // --- [ glBindImageTexture ] --- + + /** + * Binds a level of a texture to an image unit. + * + * @param unit the index of the image unit to which to bind the texture + * @param texture the name of the texture to bind to the image unit + * @param level the level of the texture that is to be bound + * @param layered whether a layered texture binding is to be established + * @param layer if {@code layered} is false, specifies the layer of texture to be bound to the image unit. Ignored otherwise. + * @param access a token indicating the type of access that will be performed on the image + * @param format the format that the elements of the image will be treated as for the purposes of formatted stores + * + * @see Reference Page + */ + public static native void glBindImageTexture(@NativeType("GLuint") int unit, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLboolean") boolean layered, @NativeType("GLint") int layer, @NativeType("GLenum") int access, @NativeType("GLenum") int format); + + // --- [ glMemoryBarrier ] --- + + /** + * Defines a barrier ordering memory transactions. + * + * @param barriers the barriers to insert (bitwise combination). One or more of:
    {@link #GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT VERTEX_ATTRIB_ARRAY_BARRIER_BIT}{@link #GL_ELEMENT_ARRAY_BARRIER_BIT ELEMENT_ARRAY_BARRIER_BIT}{@link #GL_UNIFORM_BARRIER_BIT UNIFORM_BARRIER_BIT}
    {@link #GL_TEXTURE_FETCH_BARRIER_BIT TEXTURE_FETCH_BARRIER_BIT}{@link #GL_SHADER_IMAGE_ACCESS_BARRIER_BIT SHADER_IMAGE_ACCESS_BARRIER_BIT}{@link #GL_COMMAND_BARRIER_BIT COMMAND_BARRIER_BIT}
    {@link #GL_PIXEL_BUFFER_BARRIER_BIT PIXEL_BUFFER_BARRIER_BIT}{@link #GL_TEXTURE_UPDATE_BARRIER_BIT TEXTURE_UPDATE_BARRIER_BIT}{@link #GL_BUFFER_UPDATE_BARRIER_BIT BUFFER_UPDATE_BARRIER_BIT}
    {@link #GL_FRAMEBUFFER_BARRIER_BIT FRAMEBUFFER_BARRIER_BIT}{@link #GL_TRANSFORM_FEEDBACK_BARRIER_BIT TRANSFORM_FEEDBACK_BARRIER_BIT}{@link #GL_ATOMIC_COUNTER_BARRIER_BIT ATOMIC_COUNTER_BARRIER_BIT}
    {@link #GL_ALL_BARRIER_BITS ALL_BARRIER_BITS}{@link GL43#GL_SHADER_STORAGE_BARRIER_BIT SHADER_STORAGE_BARRIER_BIT}
    + * + * @see Reference Page + */ + public static native void glMemoryBarrier(@NativeType("GLbitfield") int barriers); + + // --- [ glGetInternalformativ ] --- + + /** + * Unsafe version of: {@link #glGetInternalformativ GetInternalformativ} + * + * @param bufSize the maximum number of values that may be written to params by the function + */ + public static native void nglGetInternalformativ(int target, int internalformat, int pname, int bufSize, long params); + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + * @param params a variable into which to write the retrieved information + * + * @see Reference Page + */ + public static void glGetInternalformativ(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + nglGetInternalformativ(target, internalformat, pname, params.remaining(), memAddress(params)); + } + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetInternalformati(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetInternalformativ(target, internalformat, pname, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Array version of: {@link #glGetActiveAtomicCounterBufferiv GetActiveAtomicCounterBufferiv} + * + * @see Reference Page + */ + public static void glGetActiveAtomicCounterBufferiv(@NativeType("GLuint") int program, @NativeType("GLuint") int bufferIndex, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetActiveAtomicCounterBufferiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, bufferIndex, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetInternalformativ GetInternalformativ} + * + * @see Reference Page + */ + public static void glGetInternalformativ(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetInternalformativ; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, internalformat, pname, params.length, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL43.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL43.java new file mode 100644 index 000000000..0de244cc2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL43.java @@ -0,0 +1,2206 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 4.3. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 4.3 implementations support revision 4.30 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL43 extends GL42 { + + static { GL.initialize(); } + + /** No. of supported Shading Language Versions. Accepted by the {@code pname} parameter of GetIntegerv. */ + public static final int GL_NUM_SHADING_LANGUAGE_VERSIONS = 0x82E9; + + /** Vertex attrib array has unconverted doubles. Accepted by the {@code pname} parameter of GetVertexAttribiv. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_LONG = 0x874E; + + /** Accepted by the {@code internalformat} parameter of CompressedTexImage2D. */ + public static final int + GL_COMPRESSED_RGB8_ETC2 = 0x9274, + GL_COMPRESSED_SRGB8_ETC2 = 0x9275, + GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276, + GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277, + GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9278, + GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279, + GL_COMPRESSED_R11_EAC = 0x9270, + GL_COMPRESSED_SIGNED_R11_EAC = 0x9271, + GL_COMPRESSED_RG11_EAC = 0x9272, + GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273; + + /** Accepted by the {@code target} parameter of Enable and Disable. */ + public static final int GL_PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, GetQueryIndexediv and GetQueryiv. */ + public static final int GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A; + + /** Accepted by the {@code value} parameter of the GetInteger* functions. */ + public static final int GL_MAX_ELEMENT_INDEX = 0x8D6B; + + /** Accepted by the {@code pname} parameters of GetTexParameterfv and GetTexParameteriv. */ + public static final int GL_TEXTURE_IMMUTABLE_LEVELS = 0x82DF; + + /** Accepted by the {@code type} parameter of CreateShader and returned in the {@code params} parameter by GetShaderiv. */ + public static final int GL_COMPUTE_SHADER = 0x91B9; + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetFloatv, GetDoublev and GetInteger64v. */ + public static final int + GL_MAX_COMPUTE_UNIFORM_BLOCKS = 0x91BB, + GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS = 0x91BC, + GL_MAX_COMPUTE_IMAGE_UNIFORMS = 0x91BD, + GL_MAX_COMPUTE_SHARED_MEMORY_SIZE = 0x8262, + GL_MAX_COMPUTE_UNIFORM_COMPONENTS = 0x8263, + GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = 0x8264, + GL_MAX_COMPUTE_ATOMIC_COUNTERS = 0x8265, + GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = 0x8266, + GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS = 0x90EB; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v, GetBooleani_v, GetFloati_v, GetDoublei_v and GetInteger64i_v. */ + public static final int + GL_MAX_COMPUTE_WORK_GROUP_COUNT = 0x91BE, + GL_MAX_COMPUTE_WORK_GROUP_SIZE = 0x91BF; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_COMPUTE_WORK_GROUP_SIZE = 0x8267; + + /** Accepted by the {@code pname} parameter of GetActiveUniformBlockiv. */ + public static final int GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER = 0x90EC; + + /** Accepted by the {@code pname} parameter of GetActiveAtomicCounterBufferiv. */ + public static final int GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER = 0x90ED; + + /** Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. */ + public static final int GL_DISPATCH_INDIRECT_BUFFER = 0x90EE; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF; + + /** Accepted by the {@code stages} parameter of UseProgramStages. */ + public static final int GL_COMPUTE_SHADER_BIT = 0x20; + + /** Tokens accepted by the {@code target} parameters of Enable, Disable, and IsEnabled. */ + public static final int + GL_DEBUG_OUTPUT = 0x92E0, + GL_DEBUG_OUTPUT_SYNCHRONOUS = 0x8242; + + /** Returned by GetIntegerv when {@code pname} is CONTEXT_FLAGS. */ + public static final int GL_CONTEXT_FLAG_DEBUG_BIT = 0x2; + + /** Tokens accepted by the {@code value} parameters of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev and GetInteger64v. */ + public static final int + GL_MAX_DEBUG_MESSAGE_LENGTH = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES = 0x9144, + GL_DEBUG_LOGGED_MESSAGES = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243, + GL_MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C, + GL_DEBUG_GROUP_STACK_DEPTH = 0x826D, + GL_MAX_LABEL_LENGTH = 0x82E8; + + /** Tokens accepted by the {@code pname} parameter of GetPointerv. */ + public static final int + GL_DEBUG_CALLBACK_FUNCTION = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM = 0x8245; + + /** + * Tokens accepted or provided by the {@code source} parameters of DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the {@code sources} parameter + * of GetDebugMessageLog. + */ + public static final int + GL_DEBUG_SOURCE_API = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY = 0x8249, + GL_DEBUG_SOURCE_APPLICATION = 0x824A, + GL_DEBUG_SOURCE_OTHER = 0x824B; + + /** + * Tokens accepted or provided by the {@code type} parameters of DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the {@code types} parameter of + * GetDebugMessageLog. + */ + public static final int + GL_DEBUG_TYPE_ERROR = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E, + GL_DEBUG_TYPE_PORTABILITY = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE = 0x8250, + GL_DEBUG_TYPE_OTHER = 0x8251, + GL_DEBUG_TYPE_MARKER = 0x8268; + + /** Tokens accepted or provided by the {@code type} parameters of DebugMessageControl and DEBUGPROC, and the {@code types} parameter of GetDebugMessageLog. */ + public static final int + GL_DEBUG_TYPE_PUSH_GROUP = 0x8269, + GL_DEBUG_TYPE_POP_GROUP = 0x826A; + + /** + * Tokens accepted or provided by the {@code severity} parameters of DebugMessageControl, DebugMessageInsert and DEBUGPROC callback functions, and the + * {@code severities} parameter of GetDebugMessageLog. + */ + public static final int + GL_DEBUG_SEVERITY_HIGH = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM = 0x9147, + GL_DEBUG_SEVERITY_LOW = 0x9148, + GL_DEBUG_SEVERITY_NOTIFICATION = 0x826B; + + /** Tokens accepted or provided by the {@code identifier} parameters of ObjectLabel and GetObjectLabel. */ + public static final int + GL_BUFFER = 0x82E0, + GL_SHADER = 0x82E1, + GL_PROGRAM = 0x82E2, + GL_QUERY = 0x82E3, + GL_PROGRAM_PIPELINE = 0x82E4, + GL_SAMPLER = 0x82E6, + GL_DISPLAY_LIST = 0x82E7; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int GL_MAX_UNIFORM_LOCATIONS = 0x826E; + + /** + * Accepted by the {@code pname} parameter of FramebufferParameteri, GetFramebufferParameteriv, NamedFramebufferParameteriEXT, and + * GetNamedFramebufferParameterivEXT. + */ + public static final int + GL_FRAMEBUFFER_DEFAULT_WIDTH = 0x9310, + GL_FRAMEBUFFER_DEFAULT_HEIGHT = 0x9311, + GL_FRAMEBUFFER_DEFAULT_LAYERS = 0x9312, + GL_FRAMEBUFFER_DEFAULT_SAMPLES = 0x9313, + GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS = 0x9314; + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_FRAMEBUFFER_WIDTH = 0x9315, + GL_MAX_FRAMEBUFFER_HEIGHT = 0x9316, + GL_MAX_FRAMEBUFFER_LAYERS = 0x9317, + GL_MAX_FRAMEBUFFER_SAMPLES = 0x9318; + + /** Accepted by the {@code pname} parameter of GetInternalformativ and GetInternalformati64v. */ + public static final int + GL_INTERNALFORMAT_SUPPORTED = 0x826F, + GL_INTERNALFORMAT_PREFERRED = 0x8270, + GL_INTERNALFORMAT_RED_SIZE = 0x8271, + GL_INTERNALFORMAT_GREEN_SIZE = 0x8272, + GL_INTERNALFORMAT_BLUE_SIZE = 0x8273, + GL_INTERNALFORMAT_ALPHA_SIZE = 0x8274, + GL_INTERNALFORMAT_DEPTH_SIZE = 0x8275, + GL_INTERNALFORMAT_STENCIL_SIZE = 0x8276, + GL_INTERNALFORMAT_SHARED_SIZE = 0x8277, + GL_INTERNALFORMAT_RED_TYPE = 0x8278, + GL_INTERNALFORMAT_GREEN_TYPE = 0x8279, + GL_INTERNALFORMAT_BLUE_TYPE = 0x827A, + GL_INTERNALFORMAT_ALPHA_TYPE = 0x827B, + GL_INTERNALFORMAT_DEPTH_TYPE = 0x827C, + GL_INTERNALFORMAT_STENCIL_TYPE = 0x827D, + GL_MAX_WIDTH = 0x827E, + GL_MAX_HEIGHT = 0x827F, + GL_MAX_DEPTH = 0x8280, + GL_MAX_LAYERS = 0x8281, + GL_MAX_COMBINED_DIMENSIONS = 0x8282, + GL_COLOR_COMPONENTS = 0x8283, + GL_DEPTH_COMPONENTS = 0x8284, + GL_STENCIL_COMPONENTS = 0x8285, + GL_COLOR_RENDERABLE = 0x8286, + GL_DEPTH_RENDERABLE = 0x8287, + GL_STENCIL_RENDERABLE = 0x8288, + GL_FRAMEBUFFER_RENDERABLE = 0x8289, + GL_FRAMEBUFFER_RENDERABLE_LAYERED = 0x828A, + GL_FRAMEBUFFER_BLEND = 0x828B, + GL_READ_PIXELS = 0x828C, + GL_READ_PIXELS_FORMAT = 0x828D, + GL_READ_PIXELS_TYPE = 0x828E, + GL_TEXTURE_IMAGE_FORMAT = 0x828F, + GL_TEXTURE_IMAGE_TYPE = 0x8290, + GL_GET_TEXTURE_IMAGE_FORMAT = 0x8291, + GL_GET_TEXTURE_IMAGE_TYPE = 0x8292, + GL_MIPMAP = 0x8293, + GL_MANUAL_GENERATE_MIPMAP = 0x8294, + GL_AUTO_GENERATE_MIPMAP = 0x8295, + GL_COLOR_ENCODING = 0x8296, + GL_SRGB_READ = 0x8297, + GL_SRGB_WRITE = 0x8298, + GL_FILTER = 0x829A, + GL_VERTEX_TEXTURE = 0x829B, + GL_TESS_CONTROL_TEXTURE = 0x829C, + GL_TESS_EVALUATION_TEXTURE = 0x829D, + GL_GEOMETRY_TEXTURE = 0x829E, + GL_FRAGMENT_TEXTURE = 0x829F, + GL_COMPUTE_TEXTURE = 0x82A0, + GL_TEXTURE_SHADOW = 0x82A1, + GL_TEXTURE_GATHER = 0x82A2, + GL_TEXTURE_GATHER_SHADOW = 0x82A3, + GL_SHADER_IMAGE_LOAD = 0x82A4, + GL_SHADER_IMAGE_STORE = 0x82A5, + GL_SHADER_IMAGE_ATOMIC = 0x82A6, + GL_IMAGE_TEXEL_SIZE = 0x82A7, + GL_IMAGE_COMPATIBILITY_CLASS = 0x82A8, + GL_IMAGE_PIXEL_FORMAT = 0x82A9, + GL_IMAGE_PIXEL_TYPE = 0x82AA, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST = 0x82AC, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST = 0x82AD, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE = 0x82AE, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE = 0x82AF, + GL_TEXTURE_COMPRESSED_BLOCK_WIDTH = 0x82B1, + GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT = 0x82B2, + GL_TEXTURE_COMPRESSED_BLOCK_SIZE = 0x82B3, + GL_CLEAR_BUFFER = 0x82B4, + GL_TEXTURE_VIEW = 0x82B5, + GL_VIEW_COMPATIBILITY_CLASS = 0x82B6; + + /** Returned as possible responses for various {@code pname} queries to GetInternalformativ and GetInternalformati64v. */ + public static final int + GL_FULL_SUPPORT = 0x82B7, + GL_CAVEAT_SUPPORT = 0x82B8, + GL_IMAGE_CLASS_4_X_32 = 0x82B9, + GL_IMAGE_CLASS_2_X_32 = 0x82BA, + GL_IMAGE_CLASS_1_X_32 = 0x82BB, + GL_IMAGE_CLASS_4_X_16 = 0x82BC, + GL_IMAGE_CLASS_2_X_16 = 0x82BD, + GL_IMAGE_CLASS_1_X_16 = 0x82BE, + GL_IMAGE_CLASS_4_X_8 = 0x82BF, + GL_IMAGE_CLASS_2_X_8 = 0x82C0, + GL_IMAGE_CLASS_1_X_8 = 0x82C1, + GL_IMAGE_CLASS_11_11_10 = 0x82C2, + GL_IMAGE_CLASS_10_10_10_2 = 0x82C3, + GL_VIEW_CLASS_128_BITS = 0x82C4, + GL_VIEW_CLASS_96_BITS = 0x82C5, + GL_VIEW_CLASS_64_BITS = 0x82C6, + GL_VIEW_CLASS_48_BITS = 0x82C7, + GL_VIEW_CLASS_32_BITS = 0x82C8, + GL_VIEW_CLASS_24_BITS = 0x82C9, + GL_VIEW_CLASS_16_BITS = 0x82CA, + GL_VIEW_CLASS_8_BITS = 0x82CB, + GL_VIEW_CLASS_S3TC_DXT1_RGB = 0x82CC, + GL_VIEW_CLASS_S3TC_DXT1_RGBA = 0x82CD, + GL_VIEW_CLASS_S3TC_DXT3_RGBA = 0x82CE, + GL_VIEW_CLASS_S3TC_DXT5_RGBA = 0x82CF, + GL_VIEW_CLASS_RGTC1_RED = 0x82D0, + GL_VIEW_CLASS_RGTC2_RG = 0x82D1, + GL_VIEW_CLASS_BPTC_UNORM = 0x82D2, + GL_VIEW_CLASS_BPTC_FLOAT = 0x82D3; + + /** + * Accepted by the {@code programInterface} parameter of GetProgramInterfaceiv, GetProgramResourceIndex, GetProgramResourceName, GetProgramResourceiv, + * GetProgramResourceLocation, and GetProgramResourceLocationIndex. + */ + public static final int + GL_UNIFORM = 0x92E1, + GL_UNIFORM_BLOCK = 0x92E2, + GL_PROGRAM_INPUT = 0x92E3, + GL_PROGRAM_OUTPUT = 0x92E4, + GL_BUFFER_VARIABLE = 0x92E5, + GL_SHADER_STORAGE_BLOCK = 0x92E6, + GL_VERTEX_SUBROUTINE = 0x92E8, + GL_TESS_CONTROL_SUBROUTINE = 0x92E9, + GL_TESS_EVALUATION_SUBROUTINE = 0x92EA, + GL_GEOMETRY_SUBROUTINE = 0x92EB, + GL_FRAGMENT_SUBROUTINE = 0x92EC, + GL_COMPUTE_SUBROUTINE = 0x92ED, + GL_VERTEX_SUBROUTINE_UNIFORM = 0x92EE, + GL_TESS_CONTROL_SUBROUTINE_UNIFORM = 0x92EF, + GL_TESS_EVALUATION_SUBROUTINE_UNIFORM = 0x92F0, + GL_GEOMETRY_SUBROUTINE_UNIFORM = 0x92F1, + GL_FRAGMENT_SUBROUTINE_UNIFORM = 0x92F2, + GL_COMPUTE_SUBROUTINE_UNIFORM = 0x92F3, + GL_TRANSFORM_FEEDBACK_VARYING = 0x92F4; + + /** Accepted by the {@code pname} parameter of GetProgramInterfaceiv. */ + public static final int + GL_ACTIVE_RESOURCES = 0x92F5, + GL_MAX_NAME_LENGTH = 0x92F6, + GL_MAX_NUM_ACTIVE_VARIABLES = 0x92F7, + GL_MAX_NUM_COMPATIBLE_SUBROUTINES = 0x92F8; + + /** Accepted in the {@code props} array of GetProgramResourceiv. */ + public static final int + GL_NAME_LENGTH = 0x92F9, + GL_TYPE = 0x92FA, + GL_ARRAY_SIZE = 0x92FB, + GL_OFFSET = 0x92FC, + GL_BLOCK_INDEX = 0x92FD, + GL_ARRAY_STRIDE = 0x92FE, + GL_MATRIX_STRIDE = 0x92FF, + GL_IS_ROW_MAJOR = 0x9300, + GL_ATOMIC_COUNTER_BUFFER_INDEX = 0x9301, + GL_BUFFER_BINDING = 0x9302, + GL_BUFFER_DATA_SIZE = 0x9303, + GL_NUM_ACTIVE_VARIABLES = 0x9304, + GL_ACTIVE_VARIABLES = 0x9305, + GL_REFERENCED_BY_VERTEX_SHADER = 0x9306, + GL_REFERENCED_BY_TESS_CONTROL_SHADER = 0x9307, + GL_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x9308, + GL_REFERENCED_BY_GEOMETRY_SHADER = 0x9309, + GL_REFERENCED_BY_FRAGMENT_SHADER = 0x930A, + GL_REFERENCED_BY_COMPUTE_SHADER = 0x930B, + GL_TOP_LEVEL_ARRAY_SIZE = 0x930C, + GL_TOP_LEVEL_ARRAY_STRIDE = 0x930D, + GL_LOCATION = 0x930E, + GL_LOCATION_INDEX = 0x930F, + GL_IS_PER_PATCH = 0x92E7; + + /** Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. */ + public static final int GL_SHADER_STORAGE_BUFFER = 0x90D2; + + /** + * Accepted by the {@code pname} parameter of GetIntegerv, GetIntegeri_v, GetBooleanv, GetInteger64v, GetFloatv, GetDoublev, GetBooleani_v, GetIntegeri_v, + * GetFloati_v, GetDoublei_v, and GetInteger64i_v. + */ + public static final int GL_SHADER_STORAGE_BUFFER_BINDING = 0x90D3; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v, GetBooleani_v, GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v. */ + public static final int + GL_SHADER_STORAGE_BUFFER_START = 0x90D4, + GL_SHADER_STORAGE_BUFFER_SIZE = 0x90D5; + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS = 0x90D6, + GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = 0x90D7, + GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = 0x90D8, + GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = 0x90D9, + GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = 0x90DA, + GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS = 0x90DB, + GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS = 0x90DC, + GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 0x90DD, + GL_MAX_SHADER_STORAGE_BLOCK_SIZE = 0x90DE, + GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = 0x90DF; + + /** Accepted in the {@code barriers} bitfield in glMemoryBarrier. */ + public static final int GL_SHADER_STORAGE_BARRIER_BIT = 0x2000; + + /** Alias for the existing token MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS. */ + public static final int GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES = 0x8F39; + + /** Accepted by the {@code pname} parameter of TexParameter* and GetTexParameter*. */ + public static final int GL_DEPTH_STENCIL_TEXTURE_MODE = 0x90EA; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_BUFFER_OFFSET = 0x919D, + GL_TEXTURE_BUFFER_SIZE = 0x919E; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT = 0x919F; + + /** Accepted by the {@code pname} parameters of GetTexParameterfv and GetTexParameteriv. */ + public static final int + GL_TEXTURE_VIEW_MIN_LEVEL = 0x82DB, + GL_TEXTURE_VIEW_NUM_LEVELS = 0x82DC, + GL_TEXTURE_VIEW_MIN_LAYER = 0x82DD, + GL_TEXTURE_VIEW_NUM_LAYERS = 0x82DE; + + /** Accepted by the {@code pname} parameter of GetVertexAttrib*v. */ + public static final int + GL_VERTEX_ATTRIB_BINDING = 0x82D4, + GL_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D5; + + /** Accepted by the {@code target} parameter of GetBooleani_v, GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v. */ + public static final int + GL_VERTEX_BINDING_DIVISOR = 0x82D6, + GL_VERTEX_BINDING_OFFSET = 0x82D7, + GL_VERTEX_BINDING_STRIDE = 0x82D8, + GL_VERTEX_BINDING_BUFFER = 0x8F4F; + + /** Accepted by the {@code pname} parameter of GetIntegerv, .... */ + public static final int + GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D9, + GL_MAX_VERTEX_ATTRIB_BINDINGS = 0x82DA; + + protected GL43() { + throw new UnsupportedOperationException(); + } + + // --- [ glClearBufferData ] --- + + /** Unsafe version of: {@link #glClearBufferData ClearBufferData} */ + public static void nglClearBufferData(int target, int internalformat, int format, int type, long data) { + GL43C.nglClearBufferData(target, internalformat, format, type, data); + } + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + // --- [ glClearBufferSubData ] --- + + /** Unsafe version of: {@link #glClearBufferSubData ClearBufferSubData} */ + public static void nglClearBufferSubData(int target, int internalformat, long offset, long size, int format, int type, long data) { + GL43C.nglClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43C#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + // --- [ glDispatchCompute ] --- + + /** + * Launches one or more compute work groups. + * + * @param num_groups_x the number of work groups to be launched in the X dimension + * @param num_groups_y the number of work groups to be launched in the Y dimension + * @param num_groups_z the number of work groups to be launched in the Z dimension + * + * @see Reference Page + */ + public static void glDispatchCompute(@NativeType("GLuint") int num_groups_x, @NativeType("GLuint") int num_groups_y, @NativeType("GLuint") int num_groups_z) { + GL43C.glDispatchCompute(num_groups_x, num_groups_y, num_groups_z); + } + + // --- [ glDispatchComputeIndirect ] --- + + /** + * Launches one or more compute work groups using parameters stored in a buffer. + * + *

    The parameters addressed by indirect are packed a structure, which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint num_groups_x;
    +     *     uint num_groups_y;
    +     *     uint num_groups_z;
    +     * } DispatchIndirectCommand;
    + * + *

    A call to {@code glDispatchComputeIndirect} is equivalent, assuming no errors are generated, to:

    + * + *
    
    +     * cmd = (const DispatchIndirectCommand *)indirect;
    +     * glDispatchCompute(cmd->num_groups_x, cmd->num_groups_y, cmd->num_groups_z);
    + * + * @param indirect the offset into the buffer object currently bound to the {@link GL43C#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER} buffer target at which the dispatch parameters are + * stored. + * + * @see Reference Page + */ + public static void glDispatchComputeIndirect(@NativeType("GLintptr") long indirect) { + GL43C.glDispatchComputeIndirect(indirect); + } + + // --- [ glCopyImageSubData ] --- + + /** + * Performs a raw data copy between two images. + * + * @param srcName the name of a texture or renderbuffer object from which to copy + * @param srcTarget the target representing the namespace of the source name {@code srcName} + * @param srcLevel the mipmap level to read from the source + * @param srcX the X coordinate of the left edge of the souce region to copy + * @param srcY the Y coordinate of the top edge of the souce region to copy + * @param srcZ the Z coordinate of the near edge of the souce region to copy + * @param dstName the name of a texture or renderbuffer object to which to copy + * @param dstTarget the target representing the namespace of the destination name {@code dstName} + * @param dstLevel the mipmap level to write to the source + * @param dstX the X coordinate of the left edge of the destination region + * @param dstY the Y coordinate of the top edge of the destination region + * @param dstZ the Z coordinate of the near edge of the destination region + * @param srcWidth the width of the region to be copied + * @param srcHeight the height of the region to be copied + * @param srcDepth the depth of the region to be copied + * + * @see Reference Page + */ + public static void glCopyImageSubData(@NativeType("GLuint") int srcName, @NativeType("GLenum") int srcTarget, @NativeType("GLint") int srcLevel, @NativeType("GLint") int srcX, @NativeType("GLint") int srcY, @NativeType("GLint") int srcZ, @NativeType("GLuint") int dstName, @NativeType("GLenum") int dstTarget, @NativeType("GLint") int dstLevel, @NativeType("GLint") int dstX, @NativeType("GLint") int dstY, @NativeType("GLint") int dstZ, @NativeType("GLsizei") int srcWidth, @NativeType("GLsizei") int srcHeight, @NativeType("GLsizei") int srcDepth) { + GL43C.glCopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); + } + + // --- [ glDebugMessageControl ] --- + + /** + * Unsafe version of: {@link #glDebugMessageControl DebugMessageControl} + * + * @param count the length of the array {@code ids} + */ + public static void nglDebugMessageControl(int source, int type, int severity, int count, long ids, boolean enabled) { + GL43C.nglDebugMessageControl(source, type, severity, count, ids, enabled); + } + + /** + * Controls the volume of debug output in the active debug group, by disabling specific or groups of messages. + * + *

    If {@code enabled} is {@link GL11#GL_TRUE TRUE}, the referenced subset of messages will be enabled. If {@link GL11#GL_FALSE FALSE}, then those messages will be disabled.

    + * + *

    This command can reference different subsets of messages by first considering the set of all messages, and filtering out messages based on the following + * ways:

    + * + *
      + *
    • If {@code source}, {@code type}, or {@code severity} is {@link GL11#GL_DONT_CARE DONT_CARE}, the messages from all sources, of all types, or of all severities are + * referenced respectively.
    • + *
    • When values other than {@link GL11#GL_DONT_CARE DONT_CARE} are specified, all messages whose source, type, or severity match the specified {@code source}, {@code type}, + * or {@code severity} respectively will be referenced.
    • + *
    • If {@code count} is greater than zero, then {@code ids} is an array of {@code count} message IDs for the specified combination of {@code source} and + * {@code type}. In this case, if {@code source} or {@code type} is {@link GL11#GL_DONT_CARE DONT_CARE}, or {@code severity} is not {@link GL11#GL_DONT_CARE DONT_CARE}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated.
    • + *
    + * + *

    Unrecognized message IDs in {@code ids} are ignored. If {@code count} is zero, the value if {@code ids} is ignored.

    + * + *

    Although messages are grouped into an implicit hierarchy by their sources and types, there is no explicit per-source, per-type or per-severity enabled + * state. Instead, the enabled state is stored individually for each message. There is no difference between disabling all messages from one source in a + * single call, and individually disabling all messages from that source using their types and IDs.

    + * + *

    If the {@link GL43C#GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled the GL operates the same as if messages of every {@code source}, {@code type} or {@code severity} are disabled.

    + * + * @param source the source of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link GL43C#GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link GL43C#GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link GL43C#GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link GL43C#GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link GL43C#GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link GL43C#GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link GL43C#GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link GL43C#GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param severity the severity of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link GL43C#GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link GL43C#GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param ids an array of unsigned integers containing the ids of the messages to enable or disable + * @param enabled whether the selected messages should be enabled or disabled + * + * @see Reference Page + */ + public static void glDebugMessageControl(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @Nullable @NativeType("GLuint const *") IntBuffer ids, @NativeType("GLboolean") boolean enabled) { + GL43C.glDebugMessageControl(source, type, severity, ids, enabled); + } + + /** + * Controls the volume of debug output in the active debug group, by disabling specific or groups of messages. + * + *

    If {@code enabled} is {@link GL11#GL_TRUE TRUE}, the referenced subset of messages will be enabled. If {@link GL11#GL_FALSE FALSE}, then those messages will be disabled.

    + * + *

    This command can reference different subsets of messages by first considering the set of all messages, and filtering out messages based on the following + * ways:

    + * + *
      + *
    • If {@code source}, {@code type}, or {@code severity} is {@link GL11#GL_DONT_CARE DONT_CARE}, the messages from all sources, of all types, or of all severities are + * referenced respectively.
    • + *
    • When values other than {@link GL11#GL_DONT_CARE DONT_CARE} are specified, all messages whose source, type, or severity match the specified {@code source}, {@code type}, + * or {@code severity} respectively will be referenced.
    • + *
    • If {@code count} is greater than zero, then {@code ids} is an array of {@code count} message IDs for the specified combination of {@code source} and + * {@code type}. In this case, if {@code source} or {@code type} is {@link GL11#GL_DONT_CARE DONT_CARE}, or {@code severity} is not {@link GL11#GL_DONT_CARE DONT_CARE}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated.
    • + *
    + * + *

    Unrecognized message IDs in {@code ids} are ignored. If {@code count} is zero, the value if {@code ids} is ignored.

    + * + *

    Although messages are grouped into an implicit hierarchy by their sources and types, there is no explicit per-source, per-type or per-severity enabled + * state. Instead, the enabled state is stored individually for each message. There is no difference between disabling all messages from one source in a + * single call, and individually disabling all messages from that source using their types and IDs.

    + * + *

    If the {@link GL43C#GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled the GL operates the same as if messages of every {@code source}, {@code type} or {@code severity} are disabled.

    + * + * @param source the source of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link GL43C#GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link GL43C#GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link GL43C#GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link GL43C#GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link GL43C#GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link GL43C#GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link GL43C#GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link GL43C#GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param severity the severity of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link GL43C#GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link GL43C#GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param enabled whether the selected messages should be enabled or disabled + * + * @see Reference Page + */ + public static void glDebugMessageControl(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @NativeType("GLuint const *") int id, @NativeType("GLboolean") boolean enabled) { + GL43C.glDebugMessageControl(source, type, severity, id, enabled); + } + + // --- [ glDebugMessageInsert ] --- + + /** + * Unsafe version of: {@link #glDebugMessageInsert DebugMessageInsert} + * + * @param length the length of the string contained in the character array whose address is given by {@code message} + */ + public static void nglDebugMessageInsert(int source, int type, int id, int severity, int length, long message) { + GL43C.nglDebugMessageInsert(source, type, id, severity, length, message); + } + + /** + * This function can be called by applications and third-party libraries to generate their own messages, such as ones containing timestamp information or + * signals about specific render system events. + * + *

    The value of {@code id} specifies the ID for the message and {@code severity} indicates its severity level as defined by the caller. The string + * {@code buf} contains the string representation of the message. The parameter {@code length} contains the number of characters in {@code buf}. If + * {@code length} is negative, it is implied that {@code buf} contains a null terminated string. The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated if the + * number of characters in {@code buf}, excluding the null terminator when {@code length} is negative, is not less than the value of + * {@link GL43C#GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + *

    If the {@link GL43C#GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled calls to DebugMessageInsert are discarded and do not generate an error.

    + * + * @param source the source of the debug message to insert. One of:
    {@link GL43C#GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link GL43C#GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link GL43C#GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of the debug message insert. One of:
    {@link GL43C#GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link GL43C#GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link GL43C#GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link GL43C#GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link GL43C#GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link GL43C#GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link GL43C#GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param id the user-supplied identifier of the message to insert. One of:
    {@link GL43C#GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link GL43C#GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link GL43C#GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param severity the severity of the debug messages to insert + * @param message a character array containing the message to insert + * + * @see Reference Page + */ + public static void glDebugMessageInsert(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLuint") int id, @NativeType("GLenum") int severity, @NativeType("GLchar const *") ByteBuffer message) { + GL43C.glDebugMessageInsert(source, type, id, severity, message); + } + + /** + * This function can be called by applications and third-party libraries to generate their own messages, such as ones containing timestamp information or + * signals about specific render system events. + * + *

    The value of {@code id} specifies the ID for the message and {@code severity} indicates its severity level as defined by the caller. The string + * {@code buf} contains the string representation of the message. The parameter {@code length} contains the number of characters in {@code buf}. If + * {@code length} is negative, it is implied that {@code buf} contains a null terminated string. The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated if the + * number of characters in {@code buf}, excluding the null terminator when {@code length} is negative, is not less than the value of + * {@link GL43C#GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + *

    If the {@link GL43C#GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled calls to DebugMessageInsert are discarded and do not generate an error.

    + * + * @param source the source of the debug message to insert. One of:
    {@link GL43C#GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link GL43C#GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link GL43C#GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of the debug message insert. One of:
    {@link GL43C#GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link GL43C#GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link GL43C#GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link GL43C#GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link GL43C#GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link GL43C#GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link GL43C#GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param id the user-supplied identifier of the message to insert. One of:
    {@link GL43C#GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link GL43C#GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link GL43C#GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param severity the severity of the debug messages to insert + * @param message a character array containing the message to insert + * + * @see Reference Page + */ + public static void glDebugMessageInsert(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLuint") int id, @NativeType("GLenum") int severity, @NativeType("GLchar const *") CharSequence message) { + GL43C.glDebugMessageInsert(source, type, id, severity, message); + } + + // --- [ glDebugMessageCallback ] --- + + /** Unsafe version of: {@link #glDebugMessageCallback DebugMessageCallback} */ + public static void nglDebugMessageCallback(long callback, long userParam) { + GL43C.nglDebugMessageCallback(callback, userParam); + } + + /** + * Specifies a callback to receive debugging messages from the GL. + * + *

    The function's prototype must follow the type definition of DEBUGPROC including its platform-dependent calling convention. Anything else will result in + * undefined behavior. Only one debug callback can be specified for the current context, and further calls overwrite the previous callback. Specifying + * {@code NULL} as the value of {@code callback} clears the current callback and disables message output through callbacks. Applications can provide + * user-specified data through the pointer {@code userParam}. The context will store this pointer and will include it as one of the parameters in each call + * to the callback function.

    + * + *

    If the application has specified a callback function for receiving debug output, the implementation will call that function whenever any enabled message + * is generated. The source, type, ID, and severity of the message are specified by the DEBUGPROC parameters {@code source}, {@code type}, {@code id}, and + * {@code severity}, respectively. The string representation of the message is stored in {@code message} and its length (excluding the null-terminator) is + * stored in {@code length}. The parameter {@code userParam} is the user-specified parameter that was given when calling DebugMessageCallback.

    + * + *

    Applications can query the current callback function and the current user-specified parameter by obtaining the values of {@link GL43C#GL_DEBUG_CALLBACK_FUNCTION DEBUG_CALLBACK_FUNCTION} and + * {@link GL43C#GL_DEBUG_CALLBACK_USER_PARAM DEBUG_CALLBACK_USER_PARAM}, respectively.

    + * + *

    Applications that specify a callback function must be aware of certain special conditions when executing code inside a callback when it is called by the + * GL, regardless of the debug source.

    + * + *

    The memory for {@code message} is owned and managed by the GL, and should only be considered valid for the duration of the function call.

    + * + *

    The behavior of calling any GL or window system function from within the callback function is undefined and may lead to program termination.

    + * + *

    Care must also be taken in securing debug callbacks for use with asynchronous debug output by multi-threaded GL implementations.

    + * + *

    If the {@link GL43C#GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled then the GL will not call the callback function.

    + * + * @param callback a callback function that will be called when a debug message is generated + * @param userParam a user supplied pointer that will be passed on each invocation of {@code callback} + * + * @see Reference Page + */ + public static void glDebugMessageCallback(@Nullable @NativeType("GLDEBUGPROC") GLDebugMessageCallbackI callback, @NativeType("void const *") long userParam) { + GL43C.glDebugMessageCallback(callback, userParam); + } + + // --- [ glGetDebugMessageLog ] --- + + /** + * Unsafe version of: {@link #glGetDebugMessageLog GetDebugMessageLog} + * + * @param bufsize the size of the buffer whose address is given by {@code messageLog} + */ + public static int nglGetDebugMessageLog(int count, int bufsize, long sources, long types, long ids, long severities, long lengths, long messageLog) { + return GL43C.nglGetDebugMessageLog(count, bufsize, sources, types, ids, severities, lengths, messageLog); + } + + /** + * Retrieves messages from the debug message log. + * + *

    This function fetches a maximum of {@code count} messages from the message log, and will return the number of messages successfully fetched.

    + * + *

    Messages will be fetched from the log in order of oldest to newest. Those messages that were fetched will be removed from the log.

    + * + *

    The sources, types, severities, IDs, and string lengths of fetched messages will be stored in the application-provided arrays {@code sources}, + * {@code types}, {@code severities}, {@code ids}, and {@code lengths}, respectively. The application is responsible for allocating enough space for each + * array to hold up to {@code count} elements. The string representations of all fetched messages are stored in the {@code messageLog} array. If multiple + * messages are fetched, their strings are concatenated into the same {@code messageLog} array and will be separated by single null terminators. The last + * string in the array will also be null-terminated. The maximum size of {@code messageLog}, including the space used by all null terminators, is given by + * {@code bufSize}. If {@code bufSize} is less than zero and {@code messageLog} is not {@code NULL}, an {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error will be generated. If a message's + * string, including its null terminator, can not fully fit within the {@code messageLog} array's remaining space, then that message and any subsequent + * messages will not be fetched and will remain in the log. The string lengths stored in the array {@code lengths} include the space for the null + * terminator of each string.

    + * + *

    Any or all of the arrays {@code sources}, {@code types}, {@code ids}, {@code severities}, {@code lengths} and {@code messageLog} can also be null + * pointers, which causes the attributes for such arrays to be discarded when messages are fetched, however those messages will still be removed from the + * log. Thus to simply delete up to {@code count} messages from the message log while ignoring their attributes, the application can call the function + * with null pointers for all attribute arrays.

    + * + *

    If the context was created without the {@link GL43C#GL_CONTEXT_FLAG_DEBUG_BIT CONTEXT_FLAG_DEBUG_BIT} in the {@link GL30#GL_CONTEXT_FLAGS CONTEXT_FLAGS} state, then the GL can opt to never add messages to the + * message log so GetDebugMessageLog will always return zero.

    + * + * @param count the number of debug messages to retrieve from the log + * @param sources an array of variables to receive the sources of the retrieved messages + * @param types an array of variables to receive the types of the retrieved messages + * @param ids an array of unsigned integers to receive the ids of the retrieved messages + * @param severities an array of variables to receive the severites of the retrieved messages + * @param lengths an array of variables to receive the lengths of the received messages + * @param messageLog an array of characters that will receive the messages + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetDebugMessageLog(@NativeType("GLuint") int count, @Nullable @NativeType("GLenum *") IntBuffer sources, @Nullable @NativeType("GLenum *") IntBuffer types, @Nullable @NativeType("GLuint *") IntBuffer ids, @Nullable @NativeType("GLenum *") IntBuffer severities, @Nullable @NativeType("GLsizei *") IntBuffer lengths, @Nullable @NativeType("GLchar *") ByteBuffer messageLog) { + return GL43C.glGetDebugMessageLog(count, sources, types, ids, severities, lengths, messageLog); + } + + // --- [ glPushDebugGroup ] --- + + /** + * Unsafe version of: {@link #glPushDebugGroup PushDebugGroup} + * + * @param length the length of the message to be sent to the debug output stream + */ + public static void nglPushDebugGroup(int source, int id, int length, long message) { + GL43C.nglPushDebugGroup(source, id, length, message); + } + + /** + * Pushes a debug group described by the string {@code message} into the command stream. The value of {@code id} specifies the ID of messages generated. + * The parameter {@code length} contains the number of characters in {@code message}. If {@code length} is negative, it is implied that {@code message} + * contains a null terminated string. The message has the specified {@code source} and {@code id}, {@code type} {@link GL43C#GL_DEBUG_TYPE_PUSH_GROUP DEBUG_TYPE_PUSH_GROUP}, and + * {@code severity} {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}. The GL will put a new debug group on top of the debug group stack which inherits the control of the + * volume of debug output of the debug group previously residing on the top of the debug group stack. Because debug groups are strictly hierarchical, any + * additional control of the debug output volume will only apply within the active debug group and the debug groups pushed on top of the active debug group. + * + *

    An {@link GL11#GL_INVALID_ENUM INVALID_ENUM} error is generated if the value of {@code source} is neither {@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION} nor {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}. An + * {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if {@code length} is negative and the number of characters in {@code message}, excluding the null-terminator, is + * not less than the value of {@link GL43C#GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + * @param source the source of the debug message. One of:
    {@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}
    + * @param id the identifier of the message + * @param message a string containing the message to be sent to the debug output stream + * + * @see Reference Page + */ + public static void glPushDebugGroup(@NativeType("GLenum") int source, @NativeType("GLuint") int id, @NativeType("GLchar const *") ByteBuffer message) { + GL43C.glPushDebugGroup(source, id, message); + } + + /** + * Pushes a debug group described by the string {@code message} into the command stream. The value of {@code id} specifies the ID of messages generated. + * The parameter {@code length} contains the number of characters in {@code message}. If {@code length} is negative, it is implied that {@code message} + * contains a null terminated string. The message has the specified {@code source} and {@code id}, {@code type} {@link GL43C#GL_DEBUG_TYPE_PUSH_GROUP DEBUG_TYPE_PUSH_GROUP}, and + * {@code severity} {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}. The GL will put a new debug group on top of the debug group stack which inherits the control of the + * volume of debug output of the debug group previously residing on the top of the debug group stack. Because debug groups are strictly hierarchical, any + * additional control of the debug output volume will only apply within the active debug group and the debug groups pushed on top of the active debug group. + * + *

    An {@link GL11#GL_INVALID_ENUM INVALID_ENUM} error is generated if the value of {@code source} is neither {@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION} nor {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}. An + * {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if {@code length} is negative and the number of characters in {@code message}, excluding the null-terminator, is + * not less than the value of {@link GL43C#GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + * @param source the source of the debug message. One of:
    {@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}
    + * @param id the identifier of the message + * @param message a string containing the message to be sent to the debug output stream + * + * @see Reference Page + */ + public static void glPushDebugGroup(@NativeType("GLenum") int source, @NativeType("GLuint") int id, @NativeType("GLchar const *") CharSequence message) { + GL43C.glPushDebugGroup(source, id, message); + } + + // --- [ glPopDebugGroup ] --- + + /** + * Pops the active debug group. When a debug group is popped, the GL will also generate a debug output message describing its cause based on the + * {@code message} string, the source {@code source}, and an ID {@code id} submitted to the associated {@link #glPushDebugGroup PushDebugGroup} command. {@link GL43C#GL_DEBUG_TYPE_PUSH_GROUP DEBUG_TYPE_PUSH_GROUP} + * and {@link GL43C#GL_DEBUG_TYPE_POP_GROUP DEBUG_TYPE_POP_GROUP} share a single namespace for message {@code id}. {@code severity} has the value {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}. The {@code type} + * has the value {@link GL43C#GL_DEBUG_TYPE_POP_GROUP DEBUG_TYPE_POP_GROUP}. Popping a debug group restores the debug output volume control of the parent debug group. + * + *

    Attempting to pop the default debug group off the stack generates a {@link GL11#GL_STACK_UNDERFLOW STACK_UNDERFLOW} error; pushing a debug group onto a stack containing + * {@link GL43C#GL_MAX_DEBUG_GROUP_STACK_DEPTH MAX_DEBUG_GROUP_STACK_DEPTH} minus one elements will generate a {@link GL11#GL_STACK_OVERFLOW STACK_OVERFLOW} error.

    + * + * @see Reference Page + */ + public static void glPopDebugGroup() { + GL43C.glPopDebugGroup(); + } + + // --- [ glObjectLabel ] --- + + /** + * Unsafe version of: {@link #glObjectLabel ObjectLabel} + * + * @param length the length of the label to be used for the object + */ + public static void nglObjectLabel(int identifier, int name, int length, long label) { + GL43C.nglObjectLabel(identifier, name, length, label); + } + + /** + * Labels a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link GL43C#GL_BUFFER BUFFER}{@link GL43C#GL_SHADER SHADER}{@link GL43C#GL_PROGRAM PROGRAM}{@link GL43C#GL_QUERY QUERY}{@link GL43C#GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link GL43C#GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object to label + * @param label a string containing the label to assign to the object + * + * @see Reference Page + */ + public static void glObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @NativeType("GLchar const *") ByteBuffer label) { + GL43C.glObjectLabel(identifier, name, label); + } + + /** + * Labels a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link GL43C#GL_BUFFER BUFFER}{@link GL43C#GL_SHADER SHADER}{@link GL43C#GL_PROGRAM PROGRAM}{@link GL43C#GL_QUERY QUERY}{@link GL43C#GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link GL43C#GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object to label + * @param label a string containing the label to assign to the object + * + * @see Reference Page + */ + public static void glObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @NativeType("GLchar const *") CharSequence label) { + GL43C.glObjectLabel(identifier, name, label); + } + + // --- [ glGetObjectLabel ] --- + + /** + * Unsafe version of: {@link #glGetObjectLabel GetObjectLabel} + * + * @param bufSize the length of the buffer whose address is in {@code label} + */ + public static void nglGetObjectLabel(int identifier, int name, int bufSize, long length, long label) { + GL43C.nglGetObjectLabel(identifier, name, bufSize, length, label); + } + + /** + * Retrieves the label of a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link GL43C#GL_BUFFER BUFFER}{@link GL43C#GL_SHADER SHADER}{@link GL43C#GL_PROGRAM PROGRAM}{@link GL43C#GL_QUERY QUERY}{@link GL43C#GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link GL43C#GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object whose label to retrieve + * @param length the address of a variable to receive the length of the object label + * @param label a string that will receive the object label + * + * @see Reference Page + */ + public static void glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer label) { + GL43C.glGetObjectLabel(identifier, name, length, label); + } + + /** + * Retrieves the label of a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link GL43C#GL_BUFFER BUFFER}{@link GL43C#GL_SHADER SHADER}{@link GL43C#GL_PROGRAM PROGRAM}{@link GL43C#GL_QUERY QUERY}{@link GL43C#GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link GL43C#GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object whose label to retrieve + * @param bufSize the length of the buffer whose address is in {@code label} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @NativeType("GLsizei") int bufSize) { + return GL43C.glGetObjectLabel(identifier, name, bufSize); + } + + /** + * Retrieves the label of a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link GL43C#GL_BUFFER BUFFER}{@link GL43C#GL_SHADER SHADER}{@link GL43C#GL_PROGRAM PROGRAM}{@link GL43C#GL_QUERY QUERY}{@link GL43C#GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link GL43C#GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object whose label to retrieve + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name) { + return glGetObjectLabel(identifier, name, GL11.glGetInteger(GL_MAX_LABEL_LENGTH)); + } + + // --- [ glObjectPtrLabel ] --- + + /** + * Unsafe version of: {@link #glObjectPtrLabel ObjectPtrLabel} + * + * @param length the length of the label to be used for the object + */ + public static void nglObjectPtrLabel(long ptr, int length, long label) { + GL43C.nglObjectPtrLabel(ptr, length, label); + } + + /** + * Labels a sync object identified by a pointer. + * + * @param ptr a pointer identifying a sync object + * @param label a string containing the label to assign to the object + * + * @see Reference Page + */ + public static void glObjectPtrLabel(@NativeType("void *") long ptr, @NativeType("GLchar const *") ByteBuffer label) { + GL43C.glObjectPtrLabel(ptr, label); + } + + /** + * Labels a sync object identified by a pointer. + * + * @param ptr a pointer identifying a sync object + * @param label a string containing the label to assign to the object + * + * @see Reference Page + */ + public static void glObjectPtrLabel(@NativeType("void *") long ptr, @NativeType("GLchar const *") CharSequence label) { + GL43C.glObjectPtrLabel(ptr, label); + } + + // --- [ glGetObjectPtrLabel ] --- + + /** + * Unsafe version of: {@link #glGetObjectPtrLabel GetObjectPtrLabel} + * + * @param bufSize the length of the buffer whose address is in {@code label} + */ + public static void nglGetObjectPtrLabel(long ptr, int bufSize, long length, long label) { + GL43C.nglGetObjectPtrLabel(ptr, bufSize, length, label); + } + + /** + * Retrieves the label of a sync object identified by a pointer. + * + * @param ptr the name of the sync object whose label to retrieve + * @param length a variable to receive the length of the object label + * @param label a string that will receive the object label + * + * @see Reference Page + */ + public static void glGetObjectPtrLabel(@NativeType("void *") long ptr, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer label) { + GL43C.glGetObjectPtrLabel(ptr, length, label); + } + + /** + * Retrieves the label of a sync object identified by a pointer. + * + * @param ptr the name of the sync object whose label to retrieve + * @param bufSize the length of the buffer whose address is in {@code label} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetObjectPtrLabel(@NativeType("void *") long ptr, @NativeType("GLsizei") int bufSize) { + return GL43C.glGetObjectPtrLabel(ptr, bufSize); + } + + /** + * Retrieves the label of a sync object identified by a pointer. + * + * @param ptr the name of the sync object whose label to retrieve + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetObjectPtrLabel(@NativeType("void *") long ptr) { + return glGetObjectPtrLabel(ptr, GL11.glGetInteger(GL_MAX_LABEL_LENGTH)); + } + + // --- [ glFramebufferParameteri ] --- + + /** + * Sets a named parameter of a framebuffer. + * + * @param target target of the operation. One of:
    {@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param pname a token indicating the parameter to be modified. One of:
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param param the new value for the parameter named {@code pname} + * + * @see Reference Page + */ + public static void glFramebufferParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint") int param) { + GL43C.glFramebufferParameteri(target, pname, param); + } + + // --- [ glGetFramebufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetFramebufferParameteriv GetFramebufferParameteriv} */ + public static void nglGetFramebufferParameteriv(int target, int pname, long params) { + GL43C.nglGetFramebufferParameteriv(target, pname, params); + } + + /** + * Retrieves a named parameter from a framebuffer. + * + * @param target target of the operation. One of:
    {@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param params a variable to receive the value of the parameter named {@code pname} + * + * @see Reference Page + */ + public static void glGetFramebufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL43C.glGetFramebufferParameteriv(target, pname, params); + } + + /** + * Retrieves a named parameter from a framebuffer. + * + * @param target target of the operation. One of:
    {@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43C#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43C#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetFramebufferParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + return GL43C.glGetFramebufferParameteri(target, pname); + } + + // --- [ glGetInternalformati64v ] --- + + /** + * Unsafe version of: {@link #glGetInternalformati64v GetInternalformati64v} + * + * @param bufSize the maximum number of values that may be written to params by the function + */ + public static void nglGetInternalformati64v(int target, int internalformat, int pname, int bufSize, long params) { + GL43C.nglGetInternalformati64v(target, internalformat, pname, bufSize, params); + } + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + * @param params a variable into which to write the retrieved information + * + * @see Reference Page + */ + public static void glGetInternalformati64v(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + GL43C.glGetInternalformati64v(target, internalformat, pname, params); + } + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetInternalformati64(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname) { + return GL43C.glGetInternalformati64(target, internalformat, pname); + } + + // --- [ glInvalidateTexSubImage ] --- + + /** + * Invalidates a region of a texture image. + * + * @param texture the name of a texture object a subregion of which to invalidate + * @param level the level of detail of the texture object within which the region resides + * @param xoffset the X offset of the region to be invalidated + * @param yoffset the Y offset of the region to be invalidated + * @param zoffset the Z offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + * @param depth the depth of the region to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth) { + GL43C.glInvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth); + } + + // --- [ glInvalidateTexImage ] --- + + /** + * Invalidates the entirety of a texture image. + * + * @param texture the name of a texture object to invalidate + * @param level the level of detail of the texture object to invalidate + * + * @see Reference Page + */ + public static void glInvalidateTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level) { + GL43C.glInvalidateTexImage(texture, level); + } + + // --- [ glInvalidateBufferSubData ] --- + + /** + * Invalidates a region of a buffer object's data store. + * + * @param buffer the name of a buffer object, a subrange of whose data store to invalidate + * @param offset the offset within the buffer's data store of the start of the range to be invalidated + * @param length the length of the range within the buffer's data store to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length) { + GL43C.glInvalidateBufferSubData(buffer, offset, length); + } + + // --- [ glInvalidateBufferData ] --- + + /** + * Invalidates the content of a buffer object's data store. + * + * @param buffer the name of a buffer object whose data store to invalidate + * + * @see Reference Page + */ + public static void glInvalidateBufferData(@NativeType("GLuint") int buffer) { + GL43C.glInvalidateBufferData(buffer); + } + + // --- [ glInvalidateFramebuffer ] --- + + /** + * Unsafe version of: {@link #glInvalidateFramebuffer InvalidateFramebuffer} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static void nglInvalidateFramebuffer(int target, int numAttachments, long attachments) { + GL43C.nglInvalidateFramebuffer(target, numAttachments, attachments); + } + + /** + * Invalidate the content some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * @param attachments the address of an array identifying the attachments to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") IntBuffer attachments) { + GL43C.glInvalidateFramebuffer(target, attachments); + } + + /** + * Invalidate the content some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * + * @see Reference Page + */ + public static void glInvalidateFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int attachment) { + GL43C.glInvalidateFramebuffer(target, attachment); + } + + // --- [ glInvalidateSubFramebuffer ] --- + + /** + * Unsafe version of: {@link #glInvalidateSubFramebuffer InvalidateSubFramebuffer} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static void nglInvalidateSubFramebuffer(int target, int numAttachments, long attachments, int x, int y, int width, int height) { + GL43C.nglInvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height); + } + + /** + * Invalidates the content of a region of some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * @param attachments an array identifying the attachments to be invalidated + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateSubFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") IntBuffer attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL43C.glInvalidateSubFramebuffer(target, attachments, x, y, width, height); + } + + /** + * Invalidates the content of a region of some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateSubFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int attachment, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL43C.glInvalidateSubFramebuffer(target, attachment, x, y, width, height); + } + + // --- [ glMultiDrawArraysIndirect ] --- + + /** Unsafe version of: {@link #glMultiDrawArraysIndirect MultiDrawArraysIndirect} */ + public static void nglMultiDrawArraysIndirect(int mode, long indirect, int drawcount, int stride) { + GL43C.nglMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + } + + /** + * Renders multiple sets of primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by {@code indirect} are packed into an array of structures, each element of which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance;
    +     * } DrawArraysIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawArraysIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawArraysIndirect(mode, (DrawArraysIndirectCommand*)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawArraysIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the number of elements in the array of draw parameter structures + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + } + + /** + * Renders multiple sets of primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by {@code indirect} are packed into an array of structures, each element of which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance;
    +     * } DrawArraysIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawArraysIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawArraysIndirect(mode, (DrawArraysIndirectCommand*)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawArraysIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the number of elements in the array of draw parameter structures + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") long indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + } + + /** + * Renders multiple sets of primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by {@code indirect} are packed into an array of structures, each element of which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance;
    +     * } DrawArraysIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawArraysIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawArraysIndirect(mode, (DrawArraysIndirectCommand*)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawArraysIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the number of elements in the array of draw parameter structures + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + } + + // --- [ glMultiDrawElementsIndirect ] --- + + /** Unsafe version of: {@link #glMultiDrawElementsIndirect MultiDrawElementsIndirect} */ + public static void nglMultiDrawElementsIndirect(int mode, int type, long indirect, int drawcount, int stride) { + GL43C.nglMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + + /** + * Renders multiple indexed primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by indirect are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawElementsIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawElementsIndirect(mode, type, (DrawElementsIndirectCommand *)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawElementsIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the number of elements in the array addressed by {@code indirect} + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + + /** + * Renders multiple indexed primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by indirect are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawElementsIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawElementsIndirect(mode, type, (DrawElementsIndirectCommand *)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawElementsIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the number of elements in the array addressed by {@code indirect} + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") long indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + + /** + * Renders multiple indexed primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by indirect are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawElementsIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawElementsIndirect(mode, type, (DrawElementsIndirectCommand *)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawElementsIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the number of elements in the array addressed by {@code indirect} + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + + // --- [ glGetProgramInterfaceiv ] --- + + /** Unsafe version of: {@link #glGetProgramInterfaceiv GetProgramInterfaceiv} */ + public static void nglGetProgramInterfaceiv(int program, int programInterface, int pname, long params) { + GL43C.nglGetProgramInterfaceiv(program, programInterface, pname, params); + } + + /** + * Queries a property of an interface in a program. + * + * @param program the name of a program object whose interface to query + * @param programInterface a token identifying the interface within {@code program} to query. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param pname the name of the parameter within {@code programInterface} to query. One of:
    {@link GL43C#GL_ACTIVE_RESOURCES ACTIVE_RESOURCES}{@link GL43C#GL_MAX_NAME_LENGTH MAX_NAME_LENGTH}{@link GL43C#GL_MAX_NUM_ACTIVE_VARIABLES MAX_NUM_ACTIVE_VARIABLES}
    {@link GL43C#GL_MAX_NUM_COMPATIBLE_SUBROUTINES MAX_NUM_COMPATIBLE_SUBROUTINES}
    + * @param params a variable to retrieve the value of {@code pname} for the program interface + * + * @see Reference Page + */ + public static void glGetProgramInterfaceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL43C.glGetProgramInterfaceiv(program, programInterface, pname, params); + } + + /** + * Queries a property of an interface in a program. + * + * @param program the name of a program object whose interface to query + * @param programInterface a token identifying the interface within {@code program} to query. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param pname the name of the parameter within {@code programInterface} to query. One of:
    {@link GL43C#GL_ACTIVE_RESOURCES ACTIVE_RESOURCES}{@link GL43C#GL_MAX_NAME_LENGTH MAX_NAME_LENGTH}{@link GL43C#GL_MAX_NUM_ACTIVE_VARIABLES MAX_NUM_ACTIVE_VARIABLES}
    {@link GL43C#GL_MAX_NUM_COMPATIBLE_SUBROUTINES MAX_NUM_COMPATIBLE_SUBROUTINES}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetProgramInterfacei(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLenum") int pname) { + return GL43C.glGetProgramInterfacei(program, programInterface, pname); + } + + // --- [ glGetProgramResourceIndex ] --- + + /** Unsafe version of: {@link #glGetProgramResourceIndex GetProgramResourceIndex} */ + public static int nglGetProgramResourceIndex(int program, int programInterface, long name) { + return GL43C.nglGetProgramResourceIndex(program, programInterface, name); + } + + /** + * Queries the index of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {Wcode name}. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param name the name of the resource to query the index of + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetProgramResourceIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") ByteBuffer name) { + return GL43C.glGetProgramResourceIndex(program, programInterface, name); + } + + /** + * Queries the index of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {Wcode name}. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param name the name of the resource to query the index of + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetProgramResourceIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") CharSequence name) { + return GL43C.glGetProgramResourceIndex(program, programInterface, name); + } + + // --- [ glGetProgramResourceName ] --- + + /** + * Unsafe version of: {@link #glGetProgramResourceName GetProgramResourceName} + * + * @param bufSize the size of the character array whose address is given by {@code name} + */ + public static void nglGetProgramResourceName(int program, int programInterface, int index, int bufSize, long length, long name) { + GL43C.nglGetProgramResourceName(program, programInterface, index, bufSize, length, name); + } + + /** + * Queries the name of an indexed resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the indexed resource. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the index of the resource within {@code programInterface} of {@code program} + * @param length a variable which will receive the length of the resource name + * @param name a character array into which will be written the name of the resource + * + * @see Reference Page + */ + public static void glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer name) { + GL43C.glGetProgramResourceName(program, programInterface, index, length, name); + } + + /** + * Queries the name of an indexed resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the indexed resource. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the index of the resource within {@code programInterface} of {@code program} + * @param bufSize the size of the character array whose address is given by {@code name} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufSize) { + return GL43C.glGetProgramResourceName(program, programInterface, index, bufSize); + } + + /** + * Queries the name of an indexed resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the indexed resource. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the index of the resource within {@code programInterface} of {@code program} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index) { + return glGetProgramResourceName(program, programInterface, index, glGetProgramInterfacei(program, programInterface, GL_MAX_NAME_LENGTH)); + } + + // --- [ glGetProgramResourceiv ] --- + + /** + * Unsafe version of: {@link #glGetProgramResourceiv GetProgramResourceiv} + * + * @param propCount the number of properties in {@code props} + * @param bufSize the size of the integer array whose address is given by {@code params} + */ + public static void nglGetProgramResourceiv(int program, int programInterface, int index, int propCount, long props, int bufSize, long length, long params) { + GL43C.nglGetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params); + } + + /** + * Retrieves values for multiple properties of a single active resource within a program object. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name}. One of:
    {@link GL43C#GL_UNIFORM UNIFORM}{@link GL43C#GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link GL43C#GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link GL43C#GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link GL43C#GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link GL43C#GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link GL43C#GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link GL43C#GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link GL43C#GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link GL43C#GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link GL43C#GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link GL43C#GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link GL43C#GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the active resource index + * @param props an array that will receive the active resource properties + * @param length a variable which will receive the number of values returned + * @param params an array that will receive the property values + * + * @see Reference Page + */ + public static void glGetProgramResourceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @NativeType("GLenum const *") IntBuffer props, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer params) { + GL43C.glGetProgramResourceiv(program, programInterface, index, props, length, params); + } + + // --- [ glGetProgramResourceLocation ] --- + + /** Unsafe version of: {@link #glGetProgramResourceLocation GetProgramResourceLocation} */ + public static int nglGetProgramResourceLocation(int program, int programInterface, long name) { + return GL43C.nglGetProgramResourceLocation(program, programInterface, name); + } + + /** + * Queries the location of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name} + * @param name the name of the resource to query the location of + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetProgramResourceLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") ByteBuffer name) { + return GL43C.glGetProgramResourceLocation(program, programInterface, name); + } + + /** + * Queries the location of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name} + * @param name the name of the resource to query the location of + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetProgramResourceLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") CharSequence name) { + return GL43C.glGetProgramResourceLocation(program, programInterface, name); + } + + // --- [ glGetProgramResourceLocationIndex ] --- + + /** Unsafe version of: {@link #glGetProgramResourceLocationIndex GetProgramResourceLocationIndex} */ + public static int nglGetProgramResourceLocationIndex(int program, int programInterface, long name) { + return GL43C.nglGetProgramResourceLocationIndex(program, programInterface, name); + } + + /** + * Queries the fragment color index of a named variable within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name}. Must be:
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}
    + * @param name the name of the resource to query the location of + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetProgramResourceLocationIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") ByteBuffer name) { + return GL43C.glGetProgramResourceLocationIndex(program, programInterface, name); + } + + /** + * Queries the fragment color index of a named variable within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name}. Must be:
    {@link GL43C#GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}
    + * @param name the name of the resource to query the location of + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetProgramResourceLocationIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") CharSequence name) { + return GL43C.glGetProgramResourceLocationIndex(program, programInterface, name); + } + + // --- [ glShaderStorageBlockBinding ] --- + + /** + * Changes an active shader storage block binding. + * + * @param program the name of the program containing the block whose binding to change + * @param storageBlockIndex the index storage block within the program + * @param storageBlockBinding the index storage block binding to associate with the specified storage block + * + * @see Reference Page + */ + public static void glShaderStorageBlockBinding(@NativeType("GLuint") int program, @NativeType("GLuint") int storageBlockIndex, @NativeType("GLuint") int storageBlockBinding) { + GL43C.glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); + } + + // --- [ glTexBufferRange ] --- + + /** + * Binds a range of a buffer's data store to a buffer texture. + * + * @param target the target of the operation. Must be:
    {@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    + * @param internalformat the internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + * @param offset the offset of the start of the range of the buffer's data store to attach + * @param size the size of the range of the buffer's data store to attach + * + * @see Reference Page + */ + public static void glTexBufferRange(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size) { + GL43C.glTexBufferRange(target, internalformat, buffer, offset, size); + } + + // --- [ glTexStorage2DMultisample ] --- + + /** + * Specifies storage for a two-dimensional multisample texture. + * + * @param target the target of the operation. One of:
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}
    + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static void glTexStorage2DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL43C.glTexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); + } + + // --- [ glTexStorage3DMultisample ] --- + + /** + * Specifies storage for a two-dimensional multisample array texture. + * + * @param target the target of the operation. One of:
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}
    + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static void glTexStorage3DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL43C.glTexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); + } + + // --- [ glTextureView ] --- + + /** + * Initializes a texture as a data alias of another texture's data store. + * + * @param texture the texture object to be initialized as a view + * @param target the target to be used for the newly initialized texture + * @param origtexture the name of a texture object of which to make a view + * @param internalformat the internal format for the newly created view + * @param minlevel the lowest level of detail of the view + * @param numlevels the number of levels of detail to include in the view + * @param minlayer the index of the first layer to include in the view + * @param numlayers the number of layers to include in the view + * + * @see Reference Page + */ + public static void glTextureView(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLuint") int origtexture, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int minlevel, @NativeType("GLuint") int numlevels, @NativeType("GLuint") int minlayer, @NativeType("GLuint") int numlayers) { + GL43C.glTextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers); + } + + // --- [ glBindVertexBuffer ] --- + + /** + * Binds a buffer to a vertex buffer bind point. + * + * @param bindingindex the index of the vertex buffer binding point to which to bind the buffer + * @param buffer the name of an existing buffer to bind to the vertex buffer binding point + * @param offset the offset of the first element of the buffer + * @param stride the distance between elements within the buffer + * + * @see Reference Page + */ + public static void glBindVertexBuffer(@NativeType("GLuint") int bindingindex, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizei") int stride) { + GL43C.glBindVertexBuffer(bindingindex, buffer, offset, stride); + } + + // --- [ glVertexAttribFormat ] --- + + /** + * Specifies the organization of data in vertex arrays. + * + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param normalized if true then integer data is normalized to the range [-1, 1] or [0, 1] if it is signed or unsigned, respectively. If false then integer data is + * directly converted to floating point. + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static void glVertexAttribFormat(@NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int relativeoffset) { + GL43C.glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset); + } + + // --- [ glVertexAttribIFormat ] --- + + /** + * Specifies the organization of pure integer data in vertex arrays. + * + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static void glVertexAttribIFormat(@NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset) { + GL43C.glVertexAttribIFormat(attribindex, size, type, relativeoffset); + } + + // --- [ glVertexAttribLFormat ] --- + + /** + * Specifies the organization of 64-bit double data in vertex arrays. + * + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static void glVertexAttribLFormat(@NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset) { + GL43C.glVertexAttribLFormat(attribindex, size, type, relativeoffset); + } + + // --- [ glVertexAttribBinding ] --- + + /** + * Associate a vertex attribute and a vertex buffer binding. + * + * @param attribindex the index of the attribute to associate with a vertex buffer binding + * @param bindingindex the index of the vertex buffer binding with which to associate the generic vertex attribute + * + * @see Reference Page + */ + public static void glVertexAttribBinding(@NativeType("GLuint") int attribindex, @NativeType("GLuint") int bindingindex) { + GL43C.glVertexAttribBinding(attribindex, bindingindex); + } + + // --- [ glVertexBindingDivisor ] --- + + /** + * Modifies the rate at which generic vertex attributes advance during instanced rendering. + * + * @param bindingindex the index of the generic vertex attribute + * @param divisor the number of instances that will pass between updates of the generic attribute at slot {@code index} + * + * @see Reference Page + */ + public static void glVertexBindingDivisor(@NativeType("GLuint") int bindingindex, @NativeType("GLuint") int divisor) { + GL43C.glVertexBindingDivisor(bindingindex, divisor); + } + + /** + * Array version of: {@link #glClearBufferData ClearBufferData} + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** + * Array version of: {@link #glClearBufferData ClearBufferData} + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** + * Array version of: {@link #glClearBufferData ClearBufferData} + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL43C.glClearBufferData(target, internalformat, format, type, data); + } + + /** + * Array version of: {@link #glClearBufferSubData ClearBufferSubData} + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** + * Array version of: {@link #glClearBufferSubData ClearBufferSubData} + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** + * Array version of: {@link #glClearBufferSubData ClearBufferSubData} + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL43C.glClearBufferSubData(target, internalformat, offset, size, format, type, data); + } + + /** + * Array version of: {@link #glDebugMessageControl DebugMessageControl} + * + * @see Reference Page + */ + public static void glDebugMessageControl(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @Nullable @NativeType("GLuint const *") int[] ids, @NativeType("GLboolean") boolean enabled) { + GL43C.glDebugMessageControl(source, type, severity, ids, enabled); + } + + /** + * Array version of: {@link #glGetDebugMessageLog GetDebugMessageLog} + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetDebugMessageLog(@NativeType("GLuint") int count, @Nullable @NativeType("GLenum *") int[] sources, @Nullable @NativeType("GLenum *") int[] types, @Nullable @NativeType("GLuint *") int[] ids, @Nullable @NativeType("GLenum *") int[] severities, @Nullable @NativeType("GLsizei *") int[] lengths, @Nullable @NativeType("GLchar *") ByteBuffer messageLog) { + return GL43C.glGetDebugMessageLog(count, sources, types, ids, severities, lengths, messageLog); + } + + /** + * Array version of: {@link #glGetObjectLabel GetObjectLabel} + * + * @see Reference Page + */ + public static void glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer label) { + GL43C.glGetObjectLabel(identifier, name, length, label); + } + + /** + * Array version of: {@link #glGetObjectPtrLabel GetObjectPtrLabel} + * + * @see Reference Page + */ + public static void glGetObjectPtrLabel(@NativeType("void *") long ptr, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer label) { + GL43C.glGetObjectPtrLabel(ptr, length, label); + } + + /** + * Array version of: {@link #glGetFramebufferParameteriv GetFramebufferParameteriv} + * + * @see Reference Page + */ + public static void glGetFramebufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL43C.glGetFramebufferParameteriv(target, pname, params); + } + + /** + * Array version of: {@link #glGetInternalformati64v GetInternalformati64v} + * + * @see Reference Page + */ + public static void glGetInternalformati64v(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + GL43C.glGetInternalformati64v(target, internalformat, pname, params); + } + + /** + * Array version of: {@link #glInvalidateFramebuffer InvalidateFramebuffer} + * + * @see Reference Page + */ + public static void glInvalidateFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int[] attachments) { + GL43C.glInvalidateFramebuffer(target, attachments); + } + + /** + * Array version of: {@link #glInvalidateSubFramebuffer InvalidateSubFramebuffer} + * + * @see Reference Page + */ + public static void glInvalidateSubFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int[] attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL43C.glInvalidateSubFramebuffer(target, attachments, x, y, width, height); + } + + /** + * Array version of: {@link #glMultiDrawArraysIndirect MultiDrawArraysIndirect} + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") int[] indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + } + + /** + * Array version of: {@link #glMultiDrawElementsIndirect MultiDrawElementsIndirect} + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") int[] indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + GL43C.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + + /** + * Array version of: {@link #glGetProgramInterfaceiv GetProgramInterfaceiv} + * + * @see Reference Page + */ + public static void glGetProgramInterfaceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL43C.glGetProgramInterfaceiv(program, programInterface, pname, params); + } + + /** + * Array version of: {@link #glGetProgramResourceName GetProgramResourceName} + * + * @see Reference Page + */ + public static void glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer name) { + GL43C.glGetProgramResourceName(program, programInterface, index, length, name); + } + + /** + * Array version of: {@link #glGetProgramResourceiv GetProgramResourceiv} + * + * @see Reference Page + */ + public static void glGetProgramResourceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @NativeType("GLenum const *") int[] props, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] params) { + GL43C.glGetProgramResourceiv(program, programInterface, index, props, length, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL43C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL43C.java new file mode 100644 index 000000000..ef8f189ad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL43C.java @@ -0,0 +1,2382 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 4.3. Includes only Core Profile symbols. + * + *

    OpenGL 4.3 implementations support revision 4.30 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL43C extends GL42C { + + static { GL.initialize(); } + + /** No. of supported Shading Language Versions. Accepted by the {@code pname} parameter of GetIntegerv. */ + public static final int GL_NUM_SHADING_LANGUAGE_VERSIONS = 0x82E9; + + /** Vertex attrib array has unconverted doubles. Accepted by the {@code pname} parameter of GetVertexAttribiv. */ + public static final int GL_VERTEX_ATTRIB_ARRAY_LONG = 0x874E; + + /** Accepted by the {@code internalformat} parameter of CompressedTexImage2D. */ + public static final int + GL_COMPRESSED_RGB8_ETC2 = 0x9274, + GL_COMPRESSED_SRGB8_ETC2 = 0x9275, + GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276, + GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277, + GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9278, + GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279, + GL_COMPRESSED_R11_EAC = 0x9270, + GL_COMPRESSED_SIGNED_R11_EAC = 0x9271, + GL_COMPRESSED_RG11_EAC = 0x9272, + GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273; + + /** Accepted by the {@code target} parameter of Enable and Disable. */ + public static final int GL_PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, GetQueryIndexediv and GetQueryiv. */ + public static final int GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A; + + /** Accepted by the {@code value} parameter of the GetInteger* functions. */ + public static final int GL_MAX_ELEMENT_INDEX = 0x8D6B; + + /** Accepted by the {@code pname} parameters of GetTexParameterfv and GetTexParameteriv. */ + public static final int GL_TEXTURE_IMMUTABLE_LEVELS = 0x82DF; + + /** Accepted by the {@code type} parameter of CreateShader and returned in the {@code params} parameter by GetShaderiv. */ + public static final int GL_COMPUTE_SHADER = 0x91B9; + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetFloatv, GetDoublev and GetInteger64v. */ + public static final int + GL_MAX_COMPUTE_UNIFORM_BLOCKS = 0x91BB, + GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS = 0x91BC, + GL_MAX_COMPUTE_IMAGE_UNIFORMS = 0x91BD, + GL_MAX_COMPUTE_SHARED_MEMORY_SIZE = 0x8262, + GL_MAX_COMPUTE_UNIFORM_COMPONENTS = 0x8263, + GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = 0x8264, + GL_MAX_COMPUTE_ATOMIC_COUNTERS = 0x8265, + GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = 0x8266, + GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS = 0x90EB; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v, GetBooleani_v, GetFloati_v, GetDoublei_v and GetInteger64i_v. */ + public static final int + GL_MAX_COMPUTE_WORK_GROUP_COUNT = 0x91BE, + GL_MAX_COMPUTE_WORK_GROUP_SIZE = 0x91BF; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int GL_COMPUTE_WORK_GROUP_SIZE = 0x8267; + + /** Accepted by the {@code pname} parameter of GetActiveUniformBlockiv. */ + public static final int GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER = 0x90EC; + + /** Accepted by the {@code pname} parameter of GetActiveAtomicCounterBufferiv. */ + public static final int GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER = 0x90ED; + + /** Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. */ + public static final int GL_DISPATCH_INDIRECT_BUFFER = 0x90EE; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF; + + /** Accepted by the {@code stages} parameter of UseProgramStages. */ + public static final int GL_COMPUTE_SHADER_BIT = 0x20; + + /** Tokens accepted by the {@code target} parameters of Enable, Disable, and IsEnabled. */ + public static final int + GL_DEBUG_OUTPUT = 0x92E0, + GL_DEBUG_OUTPUT_SYNCHRONOUS = 0x8242; + + /** Returned by GetIntegerv when {@code pname} is CONTEXT_FLAGS. */ + public static final int GL_CONTEXT_FLAG_DEBUG_BIT = 0x2; + + /** Tokens accepted by the {@code value} parameters of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev and GetInteger64v. */ + public static final int + GL_MAX_DEBUG_MESSAGE_LENGTH = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES = 0x9144, + GL_DEBUG_LOGGED_MESSAGES = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243, + GL_MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C, + GL_DEBUG_GROUP_STACK_DEPTH = 0x826D, + GL_MAX_LABEL_LENGTH = 0x82E8; + + /** Tokens accepted by the {@code pname} parameter of GetPointerv. */ + public static final int + GL_DEBUG_CALLBACK_FUNCTION = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM = 0x8245; + + /** + * Tokens accepted or provided by the {@code source} parameters of DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the {@code sources} parameter + * of GetDebugMessageLog. + */ + public static final int + GL_DEBUG_SOURCE_API = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY = 0x8249, + GL_DEBUG_SOURCE_APPLICATION = 0x824A, + GL_DEBUG_SOURCE_OTHER = 0x824B; + + /** + * Tokens accepted or provided by the {@code type} parameters of DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the {@code types} parameter of + * GetDebugMessageLog. + */ + public static final int + GL_DEBUG_TYPE_ERROR = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E, + GL_DEBUG_TYPE_PORTABILITY = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE = 0x8250, + GL_DEBUG_TYPE_OTHER = 0x8251, + GL_DEBUG_TYPE_MARKER = 0x8268; + + /** Tokens accepted or provided by the {@code type} parameters of DebugMessageControl and DEBUGPROC, and the {@code types} parameter of GetDebugMessageLog. */ + public static final int + GL_DEBUG_TYPE_PUSH_GROUP = 0x8269, + GL_DEBUG_TYPE_POP_GROUP = 0x826A; + + /** + * Tokens accepted or provided by the {@code severity} parameters of DebugMessageControl, DebugMessageInsert and DEBUGPROC callback functions, and the + * {@code severities} parameter of GetDebugMessageLog. + */ + public static final int + GL_DEBUG_SEVERITY_HIGH = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM = 0x9147, + GL_DEBUG_SEVERITY_LOW = 0x9148, + GL_DEBUG_SEVERITY_NOTIFICATION = 0x826B; + + /** Tokens accepted or provided by the {@code identifier} parameters of ObjectLabel and GetObjectLabel. */ + public static final int + GL_BUFFER = 0x82E0, + GL_SHADER = 0x82E1, + GL_PROGRAM = 0x82E2, + GL_QUERY = 0x82E3, + GL_PROGRAM_PIPELINE = 0x82E4, + GL_SAMPLER = 0x82E6; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and GetInteger64v. */ + public static final int GL_MAX_UNIFORM_LOCATIONS = 0x826E; + + /** + * Accepted by the {@code pname} parameter of FramebufferParameteri, GetFramebufferParameteriv, NamedFramebufferParameteriEXT, and + * GetNamedFramebufferParameterivEXT. + */ + public static final int + GL_FRAMEBUFFER_DEFAULT_WIDTH = 0x9310, + GL_FRAMEBUFFER_DEFAULT_HEIGHT = 0x9311, + GL_FRAMEBUFFER_DEFAULT_LAYERS = 0x9312, + GL_FRAMEBUFFER_DEFAULT_SAMPLES = 0x9313, + GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS = 0x9314; + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_FRAMEBUFFER_WIDTH = 0x9315, + GL_MAX_FRAMEBUFFER_HEIGHT = 0x9316, + GL_MAX_FRAMEBUFFER_LAYERS = 0x9317, + GL_MAX_FRAMEBUFFER_SAMPLES = 0x9318; + + /** Accepted by the {@code pname} parameter of GetInternalformativ and GetInternalformati64v. */ + public static final int + GL_INTERNALFORMAT_SUPPORTED = 0x826F, + GL_INTERNALFORMAT_PREFERRED = 0x8270, + GL_INTERNALFORMAT_RED_SIZE = 0x8271, + GL_INTERNALFORMAT_GREEN_SIZE = 0x8272, + GL_INTERNALFORMAT_BLUE_SIZE = 0x8273, + GL_INTERNALFORMAT_ALPHA_SIZE = 0x8274, + GL_INTERNALFORMAT_DEPTH_SIZE = 0x8275, + GL_INTERNALFORMAT_STENCIL_SIZE = 0x8276, + GL_INTERNALFORMAT_SHARED_SIZE = 0x8277, + GL_INTERNALFORMAT_RED_TYPE = 0x8278, + GL_INTERNALFORMAT_GREEN_TYPE = 0x8279, + GL_INTERNALFORMAT_BLUE_TYPE = 0x827A, + GL_INTERNALFORMAT_ALPHA_TYPE = 0x827B, + GL_INTERNALFORMAT_DEPTH_TYPE = 0x827C, + GL_INTERNALFORMAT_STENCIL_TYPE = 0x827D, + GL_MAX_WIDTH = 0x827E, + GL_MAX_HEIGHT = 0x827F, + GL_MAX_DEPTH = 0x8280, + GL_MAX_LAYERS = 0x8281, + GL_MAX_COMBINED_DIMENSIONS = 0x8282, + GL_COLOR_COMPONENTS = 0x8283, + GL_DEPTH_COMPONENTS = 0x8284, + GL_STENCIL_COMPONENTS = 0x8285, + GL_COLOR_RENDERABLE = 0x8286, + GL_DEPTH_RENDERABLE = 0x8287, + GL_STENCIL_RENDERABLE = 0x8288, + GL_FRAMEBUFFER_RENDERABLE = 0x8289, + GL_FRAMEBUFFER_RENDERABLE_LAYERED = 0x828A, + GL_FRAMEBUFFER_BLEND = 0x828B, + GL_READ_PIXELS = 0x828C, + GL_READ_PIXELS_FORMAT = 0x828D, + GL_READ_PIXELS_TYPE = 0x828E, + GL_TEXTURE_IMAGE_FORMAT = 0x828F, + GL_TEXTURE_IMAGE_TYPE = 0x8290, + GL_GET_TEXTURE_IMAGE_FORMAT = 0x8291, + GL_GET_TEXTURE_IMAGE_TYPE = 0x8292, + GL_MIPMAP = 0x8293, + GL_MANUAL_GENERATE_MIPMAP = 0x8294, + GL_AUTO_GENERATE_MIPMAP = 0x8295, + GL_COLOR_ENCODING = 0x8296, + GL_SRGB_READ = 0x8297, + GL_SRGB_WRITE = 0x8298, + GL_FILTER = 0x829A, + GL_VERTEX_TEXTURE = 0x829B, + GL_TESS_CONTROL_TEXTURE = 0x829C, + GL_TESS_EVALUATION_TEXTURE = 0x829D, + GL_GEOMETRY_TEXTURE = 0x829E, + GL_FRAGMENT_TEXTURE = 0x829F, + GL_COMPUTE_TEXTURE = 0x82A0, + GL_TEXTURE_SHADOW = 0x82A1, + GL_TEXTURE_GATHER = 0x82A2, + GL_TEXTURE_GATHER_SHADOW = 0x82A3, + GL_SHADER_IMAGE_LOAD = 0x82A4, + GL_SHADER_IMAGE_STORE = 0x82A5, + GL_SHADER_IMAGE_ATOMIC = 0x82A6, + GL_IMAGE_TEXEL_SIZE = 0x82A7, + GL_IMAGE_COMPATIBILITY_CLASS = 0x82A8, + GL_IMAGE_PIXEL_FORMAT = 0x82A9, + GL_IMAGE_PIXEL_TYPE = 0x82AA, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST = 0x82AC, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST = 0x82AD, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE = 0x82AE, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE = 0x82AF, + GL_TEXTURE_COMPRESSED_BLOCK_WIDTH = 0x82B1, + GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT = 0x82B2, + GL_TEXTURE_COMPRESSED_BLOCK_SIZE = 0x82B3, + GL_CLEAR_BUFFER = 0x82B4, + GL_TEXTURE_VIEW = 0x82B5, + GL_VIEW_COMPATIBILITY_CLASS = 0x82B6; + + /** Returned as possible responses for various {@code pname} queries to GetInternalformativ and GetInternalformati64v. */ + public static final int + GL_FULL_SUPPORT = 0x82B7, + GL_CAVEAT_SUPPORT = 0x82B8, + GL_IMAGE_CLASS_4_X_32 = 0x82B9, + GL_IMAGE_CLASS_2_X_32 = 0x82BA, + GL_IMAGE_CLASS_1_X_32 = 0x82BB, + GL_IMAGE_CLASS_4_X_16 = 0x82BC, + GL_IMAGE_CLASS_2_X_16 = 0x82BD, + GL_IMAGE_CLASS_1_X_16 = 0x82BE, + GL_IMAGE_CLASS_4_X_8 = 0x82BF, + GL_IMAGE_CLASS_2_X_8 = 0x82C0, + GL_IMAGE_CLASS_1_X_8 = 0x82C1, + GL_IMAGE_CLASS_11_11_10 = 0x82C2, + GL_IMAGE_CLASS_10_10_10_2 = 0x82C3, + GL_VIEW_CLASS_128_BITS = 0x82C4, + GL_VIEW_CLASS_96_BITS = 0x82C5, + GL_VIEW_CLASS_64_BITS = 0x82C6, + GL_VIEW_CLASS_48_BITS = 0x82C7, + GL_VIEW_CLASS_32_BITS = 0x82C8, + GL_VIEW_CLASS_24_BITS = 0x82C9, + GL_VIEW_CLASS_16_BITS = 0x82CA, + GL_VIEW_CLASS_8_BITS = 0x82CB, + GL_VIEW_CLASS_S3TC_DXT1_RGB = 0x82CC, + GL_VIEW_CLASS_S3TC_DXT1_RGBA = 0x82CD, + GL_VIEW_CLASS_S3TC_DXT3_RGBA = 0x82CE, + GL_VIEW_CLASS_S3TC_DXT5_RGBA = 0x82CF, + GL_VIEW_CLASS_RGTC1_RED = 0x82D0, + GL_VIEW_CLASS_RGTC2_RG = 0x82D1, + GL_VIEW_CLASS_BPTC_UNORM = 0x82D2, + GL_VIEW_CLASS_BPTC_FLOAT = 0x82D3; + + /** + * Accepted by the {@code programInterface} parameter of GetProgramInterfaceiv, GetProgramResourceIndex, GetProgramResourceName, GetProgramResourceiv, + * GetProgramResourceLocation, and GetProgramResourceLocationIndex. + */ + public static final int + GL_UNIFORM = 0x92E1, + GL_UNIFORM_BLOCK = 0x92E2, + GL_PROGRAM_INPUT = 0x92E3, + GL_PROGRAM_OUTPUT = 0x92E4, + GL_BUFFER_VARIABLE = 0x92E5, + GL_SHADER_STORAGE_BLOCK = 0x92E6, + GL_VERTEX_SUBROUTINE = 0x92E8, + GL_TESS_CONTROL_SUBROUTINE = 0x92E9, + GL_TESS_EVALUATION_SUBROUTINE = 0x92EA, + GL_GEOMETRY_SUBROUTINE = 0x92EB, + GL_FRAGMENT_SUBROUTINE = 0x92EC, + GL_COMPUTE_SUBROUTINE = 0x92ED, + GL_VERTEX_SUBROUTINE_UNIFORM = 0x92EE, + GL_TESS_CONTROL_SUBROUTINE_UNIFORM = 0x92EF, + GL_TESS_EVALUATION_SUBROUTINE_UNIFORM = 0x92F0, + GL_GEOMETRY_SUBROUTINE_UNIFORM = 0x92F1, + GL_FRAGMENT_SUBROUTINE_UNIFORM = 0x92F2, + GL_COMPUTE_SUBROUTINE_UNIFORM = 0x92F3, + GL_TRANSFORM_FEEDBACK_VARYING = 0x92F4; + + /** Accepted by the {@code pname} parameter of GetProgramInterfaceiv. */ + public static final int + GL_ACTIVE_RESOURCES = 0x92F5, + GL_MAX_NAME_LENGTH = 0x92F6, + GL_MAX_NUM_ACTIVE_VARIABLES = 0x92F7, + GL_MAX_NUM_COMPATIBLE_SUBROUTINES = 0x92F8; + + /** Accepted in the {@code props} array of GetProgramResourceiv. */ + public static final int + GL_NAME_LENGTH = 0x92F9, + GL_TYPE = 0x92FA, + GL_ARRAY_SIZE = 0x92FB, + GL_OFFSET = 0x92FC, + GL_BLOCK_INDEX = 0x92FD, + GL_ARRAY_STRIDE = 0x92FE, + GL_MATRIX_STRIDE = 0x92FF, + GL_IS_ROW_MAJOR = 0x9300, + GL_ATOMIC_COUNTER_BUFFER_INDEX = 0x9301, + GL_BUFFER_BINDING = 0x9302, + GL_BUFFER_DATA_SIZE = 0x9303, + GL_NUM_ACTIVE_VARIABLES = 0x9304, + GL_ACTIVE_VARIABLES = 0x9305, + GL_REFERENCED_BY_VERTEX_SHADER = 0x9306, + GL_REFERENCED_BY_TESS_CONTROL_SHADER = 0x9307, + GL_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x9308, + GL_REFERENCED_BY_GEOMETRY_SHADER = 0x9309, + GL_REFERENCED_BY_FRAGMENT_SHADER = 0x930A, + GL_REFERENCED_BY_COMPUTE_SHADER = 0x930B, + GL_TOP_LEVEL_ARRAY_SIZE = 0x930C, + GL_TOP_LEVEL_ARRAY_STRIDE = 0x930D, + GL_LOCATION = 0x930E, + GL_LOCATION_INDEX = 0x930F, + GL_IS_PER_PATCH = 0x92E7; + + /** Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and GetBufferPointerv. */ + public static final int GL_SHADER_STORAGE_BUFFER = 0x90D2; + + /** + * Accepted by the {@code pname} parameter of GetIntegerv, GetIntegeri_v, GetBooleanv, GetInteger64v, GetFloatv, GetDoublev, GetBooleani_v, GetIntegeri_v, + * GetFloati_v, GetDoublei_v, and GetInteger64i_v. + */ + public static final int GL_SHADER_STORAGE_BUFFER_BINDING = 0x90D3; + + /** Accepted by the {@code pname} parameter of GetIntegeri_v, GetBooleani_v, GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v. */ + public static final int + GL_SHADER_STORAGE_BUFFER_START = 0x90D4, + GL_SHADER_STORAGE_BUFFER_SIZE = 0x90D5; + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS = 0x90D6, + GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = 0x90D7, + GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = 0x90D8, + GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = 0x90D9, + GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = 0x90DA, + GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS = 0x90DB, + GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS = 0x90DC, + GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 0x90DD, + GL_MAX_SHADER_STORAGE_BLOCK_SIZE = 0x90DE, + GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = 0x90DF; + + /** Accepted in the {@code barriers} bitfield in glMemoryBarrier. */ + public static final int GL_SHADER_STORAGE_BARRIER_BIT = 0x2000; + + /** Alias for the existing token MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS. */ + public static final int GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES = 0x8F39; + + /** Accepted by the {@code pname} parameter of TexParameter* and GetTexParameter*. */ + public static final int GL_DEPTH_STENCIL_TEXTURE_MODE = 0x90EA; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_BUFFER_OFFSET = 0x919D, + GL_TEXTURE_BUFFER_SIZE = 0x919E; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT = 0x919F; + + /** Accepted by the {@code pname} parameters of GetTexParameterfv and GetTexParameteriv. */ + public static final int + GL_TEXTURE_VIEW_MIN_LEVEL = 0x82DB, + GL_TEXTURE_VIEW_NUM_LEVELS = 0x82DC, + GL_TEXTURE_VIEW_MIN_LAYER = 0x82DD, + GL_TEXTURE_VIEW_NUM_LAYERS = 0x82DE; + + /** Accepted by the {@code pname} parameter of GetVertexAttrib*v. */ + public static final int + GL_VERTEX_ATTRIB_BINDING = 0x82D4, + GL_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D5; + + /** Accepted by the {@code target} parameter of GetBooleani_v, GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v. */ + public static final int + GL_VERTEX_BINDING_DIVISOR = 0x82D6, + GL_VERTEX_BINDING_OFFSET = 0x82D7, + GL_VERTEX_BINDING_STRIDE = 0x82D8, + GL_VERTEX_BINDING_BUFFER = 0x8F4F; + + /** Accepted by the {@code pname} parameter of GetIntegerv, .... */ + public static final int + GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D9, + GL_MAX_VERTEX_ATTRIB_BINDINGS = 0x82DA; + + protected GL43C() { + throw new UnsupportedOperationException(); + } + + // --- [ glClearBufferData ] --- + + /** Unsafe version of: {@link #glClearBufferData ClearBufferData} */ + public static native void nglClearBufferData(int target, int internalformat, int format, int type, long data); + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link #GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link #GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + nglClearBufferData(target, internalformat, format, type, memAddressSafe(data)); + } + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link #GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link #GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + nglClearBufferData(target, internalformat, format, type, memAddressSafe(data)); + } + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link #GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link #GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + nglClearBufferData(target, internalformat, format, type, memAddressSafe(data)); + } + + /** + * Fills a buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link #GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link #GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + nglClearBufferData(target, internalformat, format, type, memAddressSafe(data)); + } + + // --- [ glClearBufferSubData ] --- + + /** Unsafe version of: {@link #glClearBufferSubData ClearBufferSubData} */ + public static native void nglClearBufferSubData(int target, int internalformat, long offset, long size, int format, int type, long data); + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link #GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link #GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + nglClearBufferSubData(target, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link #GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link #GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + nglClearBufferSubData(target, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link #GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link #GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + nglClearBufferSubData(target, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + /** + * Fills all or part of buffer object's data store with a fixed value. + * + * @param target the target of the operation. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link #GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link #GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + nglClearBufferSubData(target, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + // --- [ glDispatchCompute ] --- + + /** + * Launches one or more compute work groups. + * + * @param num_groups_x the number of work groups to be launched in the X dimension + * @param num_groups_y the number of work groups to be launched in the Y dimension + * @param num_groups_z the number of work groups to be launched in the Z dimension + * + * @see Reference Page + */ + public static native void glDispatchCompute(@NativeType("GLuint") int num_groups_x, @NativeType("GLuint") int num_groups_y, @NativeType("GLuint") int num_groups_z); + + // --- [ glDispatchComputeIndirect ] --- + + /** + * Launches one or more compute work groups using parameters stored in a buffer. + * + *

    The parameters addressed by indirect are packed a structure, which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint num_groups_x;
    +     *     uint num_groups_y;
    +     *     uint num_groups_z;
    +     * } DispatchIndirectCommand;
    + * + *

    A call to {@code glDispatchComputeIndirect} is equivalent, assuming no errors are generated, to:

    + * + *
    
    +     * cmd = (const DispatchIndirectCommand *)indirect;
    +     * glDispatchCompute(cmd->num_groups_x, cmd->num_groups_y, cmd->num_groups_z);
    + * + * @param indirect the offset into the buffer object currently bound to the {@link #GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER} buffer target at which the dispatch parameters are + * stored. + * + * @see Reference Page + */ + public static native void glDispatchComputeIndirect(@NativeType("GLintptr") long indirect); + + // --- [ glCopyImageSubData ] --- + + /** + * Performs a raw data copy between two images. + * + * @param srcName the name of a texture or renderbuffer object from which to copy + * @param srcTarget the target representing the namespace of the source name {@code srcName} + * @param srcLevel the mipmap level to read from the source + * @param srcX the X coordinate of the left edge of the souce region to copy + * @param srcY the Y coordinate of the top edge of the souce region to copy + * @param srcZ the Z coordinate of the near edge of the souce region to copy + * @param dstName the name of a texture or renderbuffer object to which to copy + * @param dstTarget the target representing the namespace of the destination name {@code dstName} + * @param dstLevel the mipmap level to write to the source + * @param dstX the X coordinate of the left edge of the destination region + * @param dstY the Y coordinate of the top edge of the destination region + * @param dstZ the Z coordinate of the near edge of the destination region + * @param srcWidth the width of the region to be copied + * @param srcHeight the height of the region to be copied + * @param srcDepth the depth of the region to be copied + * + * @see Reference Page + */ + public static native void glCopyImageSubData(@NativeType("GLuint") int srcName, @NativeType("GLenum") int srcTarget, @NativeType("GLint") int srcLevel, @NativeType("GLint") int srcX, @NativeType("GLint") int srcY, @NativeType("GLint") int srcZ, @NativeType("GLuint") int dstName, @NativeType("GLenum") int dstTarget, @NativeType("GLint") int dstLevel, @NativeType("GLint") int dstX, @NativeType("GLint") int dstY, @NativeType("GLint") int dstZ, @NativeType("GLsizei") int srcWidth, @NativeType("GLsizei") int srcHeight, @NativeType("GLsizei") int srcDepth); + + // --- [ glDebugMessageControl ] --- + + /** + * Unsafe version of: {@link #glDebugMessageControl DebugMessageControl} + * + * @param count the length of the array {@code ids} + */ + public static native void nglDebugMessageControl(int source, int type, int severity, int count, long ids, boolean enabled); + + /** + * Controls the volume of debug output in the active debug group, by disabling specific or groups of messages. + * + *

    If {@code enabled} is {@link GL11#GL_TRUE TRUE}, the referenced subset of messages will be enabled. If {@link GL11#GL_FALSE FALSE}, then those messages will be disabled.

    + * + *

    This command can reference different subsets of messages by first considering the set of all messages, and filtering out messages based on the following + * ways:

    + * + *
      + *
    • If {@code source}, {@code type}, or {@code severity} is {@link GL11#GL_DONT_CARE DONT_CARE}, the messages from all sources, of all types, or of all severities are + * referenced respectively.
    • + *
    • When values other than {@link GL11#GL_DONT_CARE DONT_CARE} are specified, all messages whose source, type, or severity match the specified {@code source}, {@code type}, + * or {@code severity} respectively will be referenced.
    • + *
    • If {@code count} is greater than zero, then {@code ids} is an array of {@code count} message IDs for the specified combination of {@code source} and + * {@code type}. In this case, if {@code source} or {@code type} is {@link GL11#GL_DONT_CARE DONT_CARE}, or {@code severity} is not {@link GL11#GL_DONT_CARE DONT_CARE}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated.
    • + *
    + * + *

    Unrecognized message IDs in {@code ids} are ignored. If {@code count} is zero, the value if {@code ids} is ignored.

    + * + *

    Although messages are grouped into an implicit hierarchy by their sources and types, there is no explicit per-source, per-type or per-severity enabled + * state. Instead, the enabled state is stored individually for each message. There is no difference between disabling all messages from one source in a + * single call, and individually disabling all messages from that source using their types and IDs.

    + * + *

    If the {@link #GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled the GL operates the same as if messages of every {@code source}, {@code type} or {@code severity} are disabled.

    + * + * @param source the source of debug messages to enable or disable. One of:
    {@link #GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link #GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link #GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link #GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link #GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link #GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of debug messages to enable or disable. One of:
    {@link #GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link #GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link #GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link #GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link #GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link #GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link #GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param severity the severity of debug messages to enable or disable. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link #GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link #GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link #GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param ids an array of unsigned integers containing the ids of the messages to enable or disable + * @param enabled whether the selected messages should be enabled or disabled + * + * @see Reference Page + */ + public static void glDebugMessageControl(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @Nullable @NativeType("GLuint const *") IntBuffer ids, @NativeType("GLboolean") boolean enabled) { + nglDebugMessageControl(source, type, severity, remainingSafe(ids), memAddressSafe(ids), enabled); + } + + /** + * Controls the volume of debug output in the active debug group, by disabling specific or groups of messages. + * + *

    If {@code enabled} is {@link GL11#GL_TRUE TRUE}, the referenced subset of messages will be enabled. If {@link GL11#GL_FALSE FALSE}, then those messages will be disabled.

    + * + *

    This command can reference different subsets of messages by first considering the set of all messages, and filtering out messages based on the following + * ways:

    + * + *
      + *
    • If {@code source}, {@code type}, or {@code severity} is {@link GL11#GL_DONT_CARE DONT_CARE}, the messages from all sources, of all types, or of all severities are + * referenced respectively.
    • + *
    • When values other than {@link GL11#GL_DONT_CARE DONT_CARE} are specified, all messages whose source, type, or severity match the specified {@code source}, {@code type}, + * or {@code severity} respectively will be referenced.
    • + *
    • If {@code count} is greater than zero, then {@code ids} is an array of {@code count} message IDs for the specified combination of {@code source} and + * {@code type}. In this case, if {@code source} or {@code type} is {@link GL11#GL_DONT_CARE DONT_CARE}, or {@code severity} is not {@link GL11#GL_DONT_CARE DONT_CARE}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated.
    • + *
    + * + *

    Unrecognized message IDs in {@code ids} are ignored. If {@code count} is zero, the value if {@code ids} is ignored.

    + * + *

    Although messages are grouped into an implicit hierarchy by their sources and types, there is no explicit per-source, per-type or per-severity enabled + * state. Instead, the enabled state is stored individually for each message. There is no difference between disabling all messages from one source in a + * single call, and individually disabling all messages from that source using their types and IDs.

    + * + *

    If the {@link #GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled the GL operates the same as if messages of every {@code source}, {@code type} or {@code severity} are disabled.

    + * + * @param source the source of debug messages to enable or disable. One of:
    {@link #GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link #GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link #GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link #GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link #GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link #GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of debug messages to enable or disable. One of:
    {@link #GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link #GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link #GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link #GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link #GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link #GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link #GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param severity the severity of debug messages to enable or disable. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link #GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link #GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link #GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param enabled whether the selected messages should be enabled or disabled + * + * @see Reference Page + */ + public static void glDebugMessageControl(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @NativeType("GLuint const *") int id, @NativeType("GLboolean") boolean enabled) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.ints(id); + nglDebugMessageControl(source, type, severity, 1, memAddress(ids), enabled); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDebugMessageInsert ] --- + + /** + * Unsafe version of: {@link #glDebugMessageInsert DebugMessageInsert} + * + * @param length the length of the string contained in the character array whose address is given by {@code message} + */ + public static native void nglDebugMessageInsert(int source, int type, int id, int severity, int length, long message); + + /** + * This function can be called by applications and third-party libraries to generate their own messages, such as ones containing timestamp information or + * signals about specific render system events. + * + *

    The value of {@code id} specifies the ID for the message and {@code severity} indicates its severity level as defined by the caller. The string + * {@code buf} contains the string representation of the message. The parameter {@code length} contains the number of characters in {@code buf}. If + * {@code length} is negative, it is implied that {@code buf} contains a null terminated string. The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated if the + * number of characters in {@code buf}, excluding the null terminator when {@code length} is negative, is not less than the value of + * {@link #GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + *

    If the {@link #GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled calls to DebugMessageInsert are discarded and do not generate an error.

    + * + * @param source the source of the debug message to insert. One of:
    {@link #GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link #GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link #GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link #GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link #GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link #GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of the debug message insert. One of:
    {@link #GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link #GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link #GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link #GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link #GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link #GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link #GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param id the user-supplied identifier of the message to insert. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link #GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link #GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link #GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param severity the severity of the debug messages to insert + * @param message a character array containing the message to insert + * + * @see Reference Page + */ + public static void glDebugMessageInsert(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLuint") int id, @NativeType("GLenum") int severity, @NativeType("GLchar const *") ByteBuffer message) { + nglDebugMessageInsert(source, type, id, severity, message.remaining(), memAddress(message)); + } + + /** + * This function can be called by applications and third-party libraries to generate their own messages, such as ones containing timestamp information or + * signals about specific render system events. + * + *

    The value of {@code id} specifies the ID for the message and {@code severity} indicates its severity level as defined by the caller. The string + * {@code buf} contains the string representation of the message. The parameter {@code length} contains the number of characters in {@code buf}. If + * {@code length} is negative, it is implied that {@code buf} contains a null terminated string. The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated if the + * number of characters in {@code buf}, excluding the null terminator when {@code length} is negative, is not less than the value of + * {@link #GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + *

    If the {@link #GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled calls to DebugMessageInsert are discarded and do not generate an error.

    + * + * @param source the source of the debug message to insert. One of:
    {@link #GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link #GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link #GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link #GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link #GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link #GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of the debug message insert. One of:
    {@link #GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link #GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link #GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link #GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link #GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link #GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link #GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param id the user-supplied identifier of the message to insert. One of:
    {@link #GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link #GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link #GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link #GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param severity the severity of the debug messages to insert + * @param message a character array containing the message to insert + * + * @see Reference Page + */ + public static void glDebugMessageInsert(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLuint") int id, @NativeType("GLenum") int severity, @NativeType("GLchar const *") CharSequence message) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int messageEncodedLength = stack.nUTF8(message, false); + long messageEncoded = stack.getPointerAddress(); + nglDebugMessageInsert(source, type, id, severity, messageEncodedLength, messageEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDebugMessageCallback ] --- + + /** Unsafe version of: {@link #glDebugMessageCallback DebugMessageCallback} */ + public static native void nglDebugMessageCallback(long callback, long userParam); + + /** + * Specifies a callback to receive debugging messages from the GL. + * + *

    The function's prototype must follow the type definition of DEBUGPROC including its platform-dependent calling convention. Anything else will result in + * undefined behavior. Only one debug callback can be specified for the current context, and further calls overwrite the previous callback. Specifying + * {@code NULL} as the value of {@code callback} clears the current callback and disables message output through callbacks. Applications can provide + * user-specified data through the pointer {@code userParam}. The context will store this pointer and will include it as one of the parameters in each call + * to the callback function.

    + * + *

    If the application has specified a callback function for receiving debug output, the implementation will call that function whenever any enabled message + * is generated. The source, type, ID, and severity of the message are specified by the DEBUGPROC parameters {@code source}, {@code type}, {@code id}, and + * {@code severity}, respectively. The string representation of the message is stored in {@code message} and its length (excluding the null-terminator) is + * stored in {@code length}. The parameter {@code userParam} is the user-specified parameter that was given when calling DebugMessageCallback.

    + * + *

    Applications can query the current callback function and the current user-specified parameter by obtaining the values of {@link #GL_DEBUG_CALLBACK_FUNCTION DEBUG_CALLBACK_FUNCTION} and + * {@link #GL_DEBUG_CALLBACK_USER_PARAM DEBUG_CALLBACK_USER_PARAM}, respectively.

    + * + *

    Applications that specify a callback function must be aware of certain special conditions when executing code inside a callback when it is called by the + * GL, regardless of the debug source.

    + * + *

    The memory for {@code message} is owned and managed by the GL, and should only be considered valid for the duration of the function call.

    + * + *

    The behavior of calling any GL or window system function from within the callback function is undefined and may lead to program termination.

    + * + *

    Care must also be taken in securing debug callbacks for use with asynchronous debug output by multi-threaded GL implementations.

    + * + *

    If the {@link #GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled then the GL will not call the callback function.

    + * + * @param callback a callback function that will be called when a debug message is generated + * @param userParam a user supplied pointer that will be passed on each invocation of {@code callback} + * + * @see Reference Page + */ + public static void glDebugMessageCallback(@Nullable @NativeType("GLDEBUGPROC") GLDebugMessageCallbackI callback, @NativeType("void const *") long userParam) { + nglDebugMessageCallback(memAddressSafe(callback), userParam); + } + + // --- [ glGetDebugMessageLog ] --- + + /** + * Unsafe version of: {@link #glGetDebugMessageLog GetDebugMessageLog} + * + * @param bufsize the size of the buffer whose address is given by {@code messageLog} + */ + public static native int nglGetDebugMessageLog(int count, int bufsize, long sources, long types, long ids, long severities, long lengths, long messageLog); + + /** + * Retrieves messages from the debug message log. + * + *

    This function fetches a maximum of {@code count} messages from the message log, and will return the number of messages successfully fetched.

    + * + *

    Messages will be fetched from the log in order of oldest to newest. Those messages that were fetched will be removed from the log.

    + * + *

    The sources, types, severities, IDs, and string lengths of fetched messages will be stored in the application-provided arrays {@code sources}, + * {@code types}, {@code severities}, {@code ids}, and {@code lengths}, respectively. The application is responsible for allocating enough space for each + * array to hold up to {@code count} elements. The string representations of all fetched messages are stored in the {@code messageLog} array. If multiple + * messages are fetched, their strings are concatenated into the same {@code messageLog} array and will be separated by single null terminators. The last + * string in the array will also be null-terminated. The maximum size of {@code messageLog}, including the space used by all null terminators, is given by + * {@code bufSize}. If {@code bufSize} is less than zero and {@code messageLog} is not {@code NULL}, an {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error will be generated. If a message's + * string, including its null terminator, can not fully fit within the {@code messageLog} array's remaining space, then that message and any subsequent + * messages will not be fetched and will remain in the log. The string lengths stored in the array {@code lengths} include the space for the null + * terminator of each string.

    + * + *

    Any or all of the arrays {@code sources}, {@code types}, {@code ids}, {@code severities}, {@code lengths} and {@code messageLog} can also be null + * pointers, which causes the attributes for such arrays to be discarded when messages are fetched, however those messages will still be removed from the + * log. Thus to simply delete up to {@code count} messages from the message log while ignoring their attributes, the application can call the function + * with null pointers for all attribute arrays.

    + * + *

    If the context was created without the {@link #GL_CONTEXT_FLAG_DEBUG_BIT CONTEXT_FLAG_DEBUG_BIT} in the {@link GL30#GL_CONTEXT_FLAGS CONTEXT_FLAGS} state, then the GL can opt to never add messages to the + * message log so GetDebugMessageLog will always return zero.

    + * + * @param count the number of debug messages to retrieve from the log + * @param sources an array of variables to receive the sources of the retrieved messages + * @param types an array of variables to receive the types of the retrieved messages + * @param ids an array of unsigned integers to receive the ids of the retrieved messages + * @param severities an array of variables to receive the severites of the retrieved messages + * @param lengths an array of variables to receive the lengths of the received messages + * @param messageLog an array of characters that will receive the messages + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetDebugMessageLog(@NativeType("GLuint") int count, @Nullable @NativeType("GLenum *") IntBuffer sources, @Nullable @NativeType("GLenum *") IntBuffer types, @Nullable @NativeType("GLuint *") IntBuffer ids, @Nullable @NativeType("GLenum *") IntBuffer severities, @Nullable @NativeType("GLsizei *") IntBuffer lengths, @Nullable @NativeType("GLchar *") ByteBuffer messageLog) { + if (CHECKS) { + checkSafe(sources, count); + checkSafe(types, count); + checkSafe(ids, count); + checkSafe(severities, count); + checkSafe(lengths, count); + } + return nglGetDebugMessageLog(count, remainingSafe(messageLog), memAddressSafe(sources), memAddressSafe(types), memAddressSafe(ids), memAddressSafe(severities), memAddressSafe(lengths), memAddressSafe(messageLog)); + } + + // --- [ glPushDebugGroup ] --- + + /** + * Unsafe version of: {@link #glPushDebugGroup PushDebugGroup} + * + * @param length the length of the message to be sent to the debug output stream + */ + public static native void nglPushDebugGroup(int source, int id, int length, long message); + + /** + * Pushes a debug group described by the string {@code message} into the command stream. The value of {@code id} specifies the ID of messages generated. + * The parameter {@code length} contains the number of characters in {@code message}. If {@code length} is negative, it is implied that {@code message} + * contains a null terminated string. The message has the specified {@code source} and {@code id}, {@code type} {@link #GL_DEBUG_TYPE_PUSH_GROUP DEBUG_TYPE_PUSH_GROUP}, and + * {@code severity} {@link #GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}. The GL will put a new debug group on top of the debug group stack which inherits the control of the + * volume of debug output of the debug group previously residing on the top of the debug group stack. Because debug groups are strictly hierarchical, any + * additional control of the debug output volume will only apply within the active debug group and the debug groups pushed on top of the active debug group. + * + *

    An {@link GL11#GL_INVALID_ENUM INVALID_ENUM} error is generated if the value of {@code source} is neither {@link #GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION} nor {@link #GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}. An + * {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if {@code length} is negative and the number of characters in {@code message}, excluding the null-terminator, is + * not less than the value of {@link #GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + * @param source the source of the debug message. One of:
    {@link #GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link #GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}
    + * @param id the identifier of the message + * @param message a string containing the message to be sent to the debug output stream + * + * @see Reference Page + */ + public static void glPushDebugGroup(@NativeType("GLenum") int source, @NativeType("GLuint") int id, @NativeType("GLchar const *") ByteBuffer message) { + nglPushDebugGroup(source, id, message.remaining(), memAddress(message)); + } + + /** + * Pushes a debug group described by the string {@code message} into the command stream. The value of {@code id} specifies the ID of messages generated. + * The parameter {@code length} contains the number of characters in {@code message}. If {@code length} is negative, it is implied that {@code message} + * contains a null terminated string. The message has the specified {@code source} and {@code id}, {@code type} {@link #GL_DEBUG_TYPE_PUSH_GROUP DEBUG_TYPE_PUSH_GROUP}, and + * {@code severity} {@link #GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}. The GL will put a new debug group on top of the debug group stack which inherits the control of the + * volume of debug output of the debug group previously residing on the top of the debug group stack. Because debug groups are strictly hierarchical, any + * additional control of the debug output volume will only apply within the active debug group and the debug groups pushed on top of the active debug group. + * + *

    An {@link GL11#GL_INVALID_ENUM INVALID_ENUM} error is generated if the value of {@code source} is neither {@link #GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION} nor {@link #GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}. An + * {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if {@code length} is negative and the number of characters in {@code message}, excluding the null-terminator, is + * not less than the value of {@link #GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + * @param source the source of the debug message. One of:
    {@link #GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link #GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}
    + * @param id the identifier of the message + * @param message a string containing the message to be sent to the debug output stream + * + * @see Reference Page + */ + public static void glPushDebugGroup(@NativeType("GLenum") int source, @NativeType("GLuint") int id, @NativeType("GLchar const *") CharSequence message) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int messageEncodedLength = stack.nUTF8(message, false); + long messageEncoded = stack.getPointerAddress(); + nglPushDebugGroup(source, id, messageEncodedLength, messageEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glPopDebugGroup ] --- + + /** + * Pops the active debug group. When a debug group is popped, the GL will also generate a debug output message describing its cause based on the + * {@code message} string, the source {@code source}, and an ID {@code id} submitted to the associated {@link #glPushDebugGroup PushDebugGroup} command. {@link #GL_DEBUG_TYPE_PUSH_GROUP DEBUG_TYPE_PUSH_GROUP} + * and {@link #GL_DEBUG_TYPE_POP_GROUP DEBUG_TYPE_POP_GROUP} share a single namespace for message {@code id}. {@code severity} has the value {@link #GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}. The {@code type} + * has the value {@link #GL_DEBUG_TYPE_POP_GROUP DEBUG_TYPE_POP_GROUP}. Popping a debug group restores the debug output volume control of the parent debug group. + * + *

    Attempting to pop the default debug group off the stack generates a {@link GL11#GL_STACK_UNDERFLOW STACK_UNDERFLOW} error; pushing a debug group onto a stack containing + * {@link #GL_MAX_DEBUG_GROUP_STACK_DEPTH MAX_DEBUG_GROUP_STACK_DEPTH} minus one elements will generate a {@link GL11#GL_STACK_OVERFLOW STACK_OVERFLOW} error.

    + * + * @see Reference Page + */ + public static native void glPopDebugGroup(); + + // --- [ glObjectLabel ] --- + + /** + * Unsafe version of: {@link #glObjectLabel ObjectLabel} + * + * @param length the length of the label to be used for the object + */ + public static native void nglObjectLabel(int identifier, int name, int length, long label); + + /** + * Labels a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link #GL_BUFFER BUFFER}{@link #GL_SHADER SHADER}{@link #GL_PROGRAM PROGRAM}{@link #GL_QUERY QUERY}{@link #GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link #GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object to label + * @param label a string containing the label to assign to the object + * + * @see Reference Page + */ + public static void glObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @NativeType("GLchar const *") ByteBuffer label) { + nglObjectLabel(identifier, name, label.remaining(), memAddress(label)); + } + + /** + * Labels a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link #GL_BUFFER BUFFER}{@link #GL_SHADER SHADER}{@link #GL_PROGRAM PROGRAM}{@link #GL_QUERY QUERY}{@link #GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link #GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object to label + * @param label a string containing the label to assign to the object + * + * @see Reference Page + */ + public static void glObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @NativeType("GLchar const *") CharSequence label) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int labelEncodedLength = stack.nUTF8(label, false); + long labelEncoded = stack.getPointerAddress(); + nglObjectLabel(identifier, name, labelEncodedLength, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetObjectLabel ] --- + + /** + * Unsafe version of: {@link #glGetObjectLabel GetObjectLabel} + * + * @param bufSize the length of the buffer whose address is in {@code label} + */ + public static native void nglGetObjectLabel(int identifier, int name, int bufSize, long length, long label); + + /** + * Retrieves the label of a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link #GL_BUFFER BUFFER}{@link #GL_SHADER SHADER}{@link #GL_PROGRAM PROGRAM}{@link #GL_QUERY QUERY}{@link #GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link #GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object whose label to retrieve + * @param length the address of a variable to receive the length of the object label + * @param label a string that will receive the object label + * + * @see Reference Page + */ + public static void glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer label) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetObjectLabel(identifier, name, label.remaining(), memAddressSafe(length), memAddress(label)); + } + + /** + * Retrieves the label of a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link #GL_BUFFER BUFFER}{@link #GL_SHADER SHADER}{@link #GL_PROGRAM PROGRAM}{@link #GL_QUERY QUERY}{@link #GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link #GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object whose label to retrieve + * @param bufSize the length of the buffer whose address is in {@code label} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @NativeType("GLsizei") int bufSize) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer label = stack.malloc(bufSize); + nglGetObjectLabel(identifier, name, bufSize, memAddress(length), memAddress(label)); + return memUTF8(label, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Retrieves the label of a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link #GL_BUFFER BUFFER}{@link #GL_SHADER SHADER}{@link #GL_PROGRAM PROGRAM}{@link #GL_QUERY QUERY}{@link #GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link #GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object whose label to retrieve + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name) { + return glGetObjectLabel(identifier, name, GL11.glGetInteger(GL_MAX_LABEL_LENGTH)); + } + + // --- [ glObjectPtrLabel ] --- + + /** + * Unsafe version of: {@link #glObjectPtrLabel ObjectPtrLabel} + * + * @param length the length of the label to be used for the object + */ + public static native void nglObjectPtrLabel(long ptr, int length, long label); + + /** + * Labels a sync object identified by a pointer. + * + * @param ptr a pointer identifying a sync object + * @param label a string containing the label to assign to the object + * + * @see Reference Page + */ + public static void glObjectPtrLabel(@NativeType("void *") long ptr, @NativeType("GLchar const *") ByteBuffer label) { + if (CHECKS) { + check(ptr); + } + nglObjectPtrLabel(ptr, label.remaining(), memAddress(label)); + } + + /** + * Labels a sync object identified by a pointer. + * + * @param ptr a pointer identifying a sync object + * @param label a string containing the label to assign to the object + * + * @see Reference Page + */ + public static void glObjectPtrLabel(@NativeType("void *") long ptr, @NativeType("GLchar const *") CharSequence label) { + if (CHECKS) { + check(ptr); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int labelEncodedLength = stack.nUTF8(label, false); + long labelEncoded = stack.getPointerAddress(); + nglObjectPtrLabel(ptr, labelEncodedLength, labelEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetObjectPtrLabel ] --- + + /** + * Unsafe version of: {@link #glGetObjectPtrLabel GetObjectPtrLabel} + * + * @param bufSize the length of the buffer whose address is in {@code label} + */ + public static native void nglGetObjectPtrLabel(long ptr, int bufSize, long length, long label); + + /** + * Retrieves the label of a sync object identified by a pointer. + * + * @param ptr the name of the sync object whose label to retrieve + * @param length a variable to receive the length of the object label + * @param label a string that will receive the object label + * + * @see Reference Page + */ + public static void glGetObjectPtrLabel(@NativeType("void *") long ptr, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer label) { + if (CHECKS) { + check(ptr); + checkSafe(length, 1); + } + nglGetObjectPtrLabel(ptr, label.remaining(), memAddressSafe(length), memAddress(label)); + } + + /** + * Retrieves the label of a sync object identified by a pointer. + * + * @param ptr the name of the sync object whose label to retrieve + * @param bufSize the length of the buffer whose address is in {@code label} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetObjectPtrLabel(@NativeType("void *") long ptr, @NativeType("GLsizei") int bufSize) { + if (CHECKS) { + check(ptr); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer label = stack.malloc(bufSize); + nglGetObjectPtrLabel(ptr, bufSize, memAddress(length), memAddress(label)); + return memUTF8(label, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Retrieves the label of a sync object identified by a pointer. + * + * @param ptr the name of the sync object whose label to retrieve + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetObjectPtrLabel(@NativeType("void *") long ptr) { + return glGetObjectPtrLabel(ptr, GL11.glGetInteger(GL_MAX_LABEL_LENGTH)); + } + + // --- [ glFramebufferParameteri ] --- + + /** + * Sets a named parameter of a framebuffer. + * + * @param target target of the operation. One of:
    {@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param pname a token indicating the parameter to be modified. One of:
    {@link #GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link #GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link #GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link #GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link #GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param param the new value for the parameter named {@code pname} + * + * @see Reference Page + */ + public static native void glFramebufferParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glGetFramebufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetFramebufferParameteriv GetFramebufferParameteriv} */ + public static native void nglGetFramebufferParameteriv(int target, int pname, long params); + + /** + * Retrieves a named parameter from a framebuffer. + * + * @param target target of the operation. One of:
    {@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link #GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link #GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link #GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link #GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link #GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param params a variable to receive the value of the parameter named {@code pname} + * + * @see Reference Page + */ + public static void glGetFramebufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetFramebufferParameteriv(target, pname, memAddress(params)); + } + + /** + * Retrieves a named parameter from a framebuffer. + * + * @param target target of the operation. One of:
    {@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}
    + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link #GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link #GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link #GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link #GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link #GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetFramebufferParameteri(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetFramebufferParameteriv(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetInternalformati64v ] --- + + /** + * Unsafe version of: {@link #glGetInternalformati64v GetInternalformati64v} + * + * @param bufSize the maximum number of values that may be written to params by the function + */ + public static native void nglGetInternalformati64v(int target, int internalformat, int pname, int bufSize, long params); + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + * @param params a variable into which to write the retrieved information + * + * @see Reference Page + */ + public static void glGetInternalformati64v(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + nglGetInternalformati64v(target, internalformat, pname, params.remaining(), memAddress(params)); + } + + /** + * Retrieves information about implementation-dependent support for internal formats. + * + * @param target the usage of the internal format. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param internalformat the internal format about which to retrieve information + * @param pname the type of information to query + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetInternalformati64(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetInternalformati64v(target, internalformat, pname, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glInvalidateTexSubImage ] --- + + /** + * Invalidates a region of a texture image. + * + * @param texture the name of a texture object a subregion of which to invalidate + * @param level the level of detail of the texture object within which the region resides + * @param xoffset the X offset of the region to be invalidated + * @param yoffset the Y offset of the region to be invalidated + * @param zoffset the Z offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + * @param depth the depth of the region to be invalidated + * + * @see Reference Page + */ + public static native void glInvalidateTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth); + + // --- [ glInvalidateTexImage ] --- + + /** + * Invalidates the entirety of a texture image. + * + * @param texture the name of a texture object to invalidate + * @param level the level of detail of the texture object to invalidate + * + * @see Reference Page + */ + public static native void glInvalidateTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glInvalidateBufferSubData ] --- + + /** + * Invalidates a region of a buffer object's data store. + * + * @param buffer the name of a buffer object, a subrange of whose data store to invalidate + * @param offset the offset within the buffer's data store of the start of the range to be invalidated + * @param length the length of the range within the buffer's data store to be invalidated + * + * @see Reference Page + */ + public static native void glInvalidateBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length); + + // --- [ glInvalidateBufferData ] --- + + /** + * Invalidates the content of a buffer object's data store. + * + * @param buffer the name of a buffer object whose data store to invalidate + * + * @see Reference Page + */ + public static native void glInvalidateBufferData(@NativeType("GLuint") int buffer); + + // --- [ glInvalidateFramebuffer ] --- + + /** + * Unsafe version of: {@link #glInvalidateFramebuffer InvalidateFramebuffer} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static native void nglInvalidateFramebuffer(int target, int numAttachments, long attachments); + + /** + * Invalidate the content some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * @param attachments the address of an array identifying the attachments to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") IntBuffer attachments) { + nglInvalidateFramebuffer(target, attachments.remaining(), memAddress(attachments)); + } + + /** + * Invalidate the content some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * + * @see Reference Page + */ + public static void glInvalidateFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int attachment) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer attachments = stack.ints(attachment); + nglInvalidateFramebuffer(target, 1, memAddress(attachments)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glInvalidateSubFramebuffer ] --- + + /** + * Unsafe version of: {@link #glInvalidateSubFramebuffer InvalidateSubFramebuffer} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static native void nglInvalidateSubFramebuffer(int target, int numAttachments, long attachments, int x, int y, int width, int height); + + /** + * Invalidates the content of a region of some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * @param attachments an array identifying the attachments to be invalidated + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateSubFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") IntBuffer attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + nglInvalidateSubFramebuffer(target, attachments.remaining(), memAddress(attachments), x, y, width, height); + } + + /** + * Invalidates the content of a region of some or all of a framebuffer object's attachments. + * + * @param target the target to which the framebuffer is attached. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}
    + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateSubFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int attachment, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer attachments = stack.ints(attachment); + nglInvalidateSubFramebuffer(target, 1, memAddress(attachments), x, y, width, height); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glMultiDrawArraysIndirect ] --- + + /** Unsafe version of: {@link #glMultiDrawArraysIndirect MultiDrawArraysIndirect} */ + public static native void nglMultiDrawArraysIndirect(int mode, long indirect, int drawcount, int stride); + + /** + * Renders multiple sets of primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by {@code indirect} are packed into an array of structures, each element of which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance;
    +     * } DrawArraysIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawArraysIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawArraysIndirect(mode, (DrawArraysIndirectCommand*)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawArraysIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the number of elements in the array of draw parameter structures + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, drawcount * (stride == 0 ? (4 * 4) : stride)); + } + nglMultiDrawArraysIndirect(mode, memAddress(indirect), drawcount, stride); + } + + /** + * Renders multiple sets of primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by {@code indirect} are packed into an array of structures, each element of which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance;
    +     * } DrawArraysIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawArraysIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawArraysIndirect(mode, (DrawArraysIndirectCommand*)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawArraysIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the number of elements in the array of draw parameter structures + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") long indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + nglMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + } + + /** + * Renders multiple sets of primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by {@code indirect} are packed into an array of structures, each element of which takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint first;
    +     *     uint baseInstance;
    +     * } DrawArraysIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawArraysIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawArraysIndirect(mode, (DrawArraysIndirectCommand*)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawArraysIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the number of elements in the array of draw parameter structures + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, (drawcount * (stride == 0 ? (4 * 4) : stride)) >> 2); + } + nglMultiDrawArraysIndirect(mode, memAddress(indirect), drawcount, stride); + } + + // --- [ glMultiDrawElementsIndirect ] --- + + /** Unsafe version of: {@link #glMultiDrawElementsIndirect MultiDrawElementsIndirect} */ + public static native void nglMultiDrawElementsIndirect(int mode, int type, long indirect, int drawcount, int stride); + + /** + * Renders multiple indexed primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by indirect are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawElementsIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawElementsIndirect(mode, type, (DrawElementsIndirectCommand *)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawElementsIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the number of elements in the array addressed by {@code indirect} + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, drawcount * (stride == 0 ? (5 * 4) : stride)); + } + nglMultiDrawElementsIndirect(mode, type, memAddress(indirect), drawcount, stride); + } + + /** + * Renders multiple indexed primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by indirect are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawElementsIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawElementsIndirect(mode, type, (DrawElementsIndirectCommand *)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawElementsIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the number of elements in the array addressed by {@code indirect} + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") long indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + nglMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + + /** + * Renders multiple indexed primitives from array data, taking parameters from memory. + * + *

    The parameters addressed by indirect are packed into a structure that takes the form (in C):

    + * + *
    
    +     * typedef struct {
    +     *     uint count;
    +     *     uint primCount;
    +     *     uint firstIndex;
    +     *     uint baseVertex;
    +     *     uint baseInstance;
    +     * } DrawElementsIndirectCommand;
    + * + *

    A single call to {@code glMultiDrawElementsIndirect} is equivalent, assuming no errors are generated to:

    + * + *
    
    +     * const ubyte *ptr = (const ubyte *)indirect;
    +     * for ( i = 0; i < drawcount; i++ ) {
    +     *     DrawElementsIndirect(mode, type, (DrawElementsIndirectCommand *)ptr);
    +     *     if ( stride == 0 )
    +     *         ptr += sizeof(DrawElementsIndirectCommand);
    +     *     else
    +     *         ptr += stride;
    +     * }
    + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the number of elements in the array addressed by {@code indirect} + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, (drawcount * (stride == 0 ? (5 * 4) : stride)) >> 2); + } + nglMultiDrawElementsIndirect(mode, type, memAddress(indirect), drawcount, stride); + } + + // --- [ glGetProgramInterfaceiv ] --- + + /** Unsafe version of: {@link #glGetProgramInterfaceiv GetProgramInterfaceiv} */ + public static native void nglGetProgramInterfaceiv(int program, int programInterface, int pname, long params); + + /** + * Queries a property of an interface in a program. + * + * @param program the name of a program object whose interface to query + * @param programInterface a token identifying the interface within {@code program} to query. One of:
    {@link #GL_UNIFORM UNIFORM}{@link #GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link #GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link #GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link #GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link #GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link #GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link #GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link #GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link #GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link #GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link #GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link #GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link #GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link #GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link #GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link #GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link #GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link #GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param pname the name of the parameter within {@code programInterface} to query. One of:
    {@link #GL_ACTIVE_RESOURCES ACTIVE_RESOURCES}{@link #GL_MAX_NAME_LENGTH MAX_NAME_LENGTH}{@link #GL_MAX_NUM_ACTIVE_VARIABLES MAX_NUM_ACTIVE_VARIABLES}
    {@link #GL_MAX_NUM_COMPATIBLE_SUBROUTINES MAX_NUM_COMPATIBLE_SUBROUTINES}
    + * @param params a variable to retrieve the value of {@code pname} for the program interface + * + * @see Reference Page + */ + public static void glGetProgramInterfaceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetProgramInterfaceiv(program, programInterface, pname, memAddress(params)); + } + + /** + * Queries a property of an interface in a program. + * + * @param program the name of a program object whose interface to query + * @param programInterface a token identifying the interface within {@code program} to query. One of:
    {@link #GL_UNIFORM UNIFORM}{@link #GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link #GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link #GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link #GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link #GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link #GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link #GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link #GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link #GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link #GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link #GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link #GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link #GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link #GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link #GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link #GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link #GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link #GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param pname the name of the parameter within {@code programInterface} to query. One of:
    {@link #GL_ACTIVE_RESOURCES ACTIVE_RESOURCES}{@link #GL_MAX_NAME_LENGTH MAX_NAME_LENGTH}{@link #GL_MAX_NUM_ACTIVE_VARIABLES MAX_NUM_ACTIVE_VARIABLES}
    {@link #GL_MAX_NUM_COMPATIBLE_SUBROUTINES MAX_NUM_COMPATIBLE_SUBROUTINES}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetProgramInterfacei(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetProgramInterfaceiv(program, programInterface, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetProgramResourceIndex ] --- + + /** Unsafe version of: {@link #glGetProgramResourceIndex GetProgramResourceIndex} */ + public static native int nglGetProgramResourceIndex(int program, int programInterface, long name); + + /** + * Queries the index of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {Wcode name}. One of:
    {@link #GL_UNIFORM UNIFORM}{@link #GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link #GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link #GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link #GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link #GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link #GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link #GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link #GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link #GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link #GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link #GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link #GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link #GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link #GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link #GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link #GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link #GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link #GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param name the name of the resource to query the index of + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetProgramResourceIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetProgramResourceIndex(program, programInterface, memAddress(name)); + } + + /** + * Queries the index of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {Wcode name}. One of:
    {@link #GL_UNIFORM UNIFORM}{@link #GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link #GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link #GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link #GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link #GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link #GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link #GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link #GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link #GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link #GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link #GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link #GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link #GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link #GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link #GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link #GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link #GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link #GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param name the name of the resource to query the index of + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetProgramResourceIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetProgramResourceIndex(program, programInterface, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetProgramResourceName ] --- + + /** + * Unsafe version of: {@link #glGetProgramResourceName GetProgramResourceName} + * + * @param bufSize the size of the character array whose address is given by {@code name} + */ + public static native void nglGetProgramResourceName(int program, int programInterface, int index, int bufSize, long length, long name); + + /** + * Queries the name of an indexed resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the indexed resource. One of:
    {@link #GL_UNIFORM UNIFORM}{@link #GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link #GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link #GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link #GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link #GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link #GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link #GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link #GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link #GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link #GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link #GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link #GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link #GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link #GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link #GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link #GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link #GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link #GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the index of the resource within {@code programInterface} of {@code program} + * @param length a variable which will receive the length of the resource name + * @param name a character array into which will be written the name of the resource + * + * @see Reference Page + */ + public static void glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer name) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetProgramResourceName(program, programInterface, index, name.remaining(), memAddressSafe(length), memAddress(name)); + } + + /** + * Queries the name of an indexed resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the indexed resource. One of:
    {@link #GL_UNIFORM UNIFORM}{@link #GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link #GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link #GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link #GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link #GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link #GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link #GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link #GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link #GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link #GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link #GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link #GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link #GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link #GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link #GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link #GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link #GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link #GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the index of the resource within {@code programInterface} of {@code program} + * @param bufSize the size of the character array whose address is given by {@code name} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @NativeType("GLsizei") int bufSize) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer length = stack.ints(0); + ByteBuffer name = stack.malloc(bufSize); + nglGetProgramResourceName(program, programInterface, index, bufSize, memAddress(length), memAddress(name)); + return memASCII(name, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Queries the name of an indexed resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the indexed resource. One of:
    {@link #GL_UNIFORM UNIFORM}{@link #GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link #GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link #GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link #GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link #GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link #GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link #GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link #GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link #GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link #GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link #GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link #GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link #GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link #GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link #GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link #GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link #GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link #GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the index of the resource within {@code programInterface} of {@code program} + * + * @see Reference Page + */ + @NativeType("void") + public static String glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index) { + return glGetProgramResourceName(program, programInterface, index, glGetProgramInterfacei(program, programInterface, GL_MAX_NAME_LENGTH)); + } + + // --- [ glGetProgramResourceiv ] --- + + /** + * Unsafe version of: {@link #glGetProgramResourceiv GetProgramResourceiv} + * + * @param propCount the number of properties in {@code props} + * @param bufSize the size of the integer array whose address is given by {@code params} + */ + public static native void nglGetProgramResourceiv(int program, int programInterface, int index, int propCount, long props, int bufSize, long length, long params); + + /** + * Retrieves values for multiple properties of a single active resource within a program object. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name}. One of:
    {@link #GL_UNIFORM UNIFORM}{@link #GL_UNIFORM_BLOCK UNIFORM_BLOCK}{@link #GL_PROGRAM_INPUT PROGRAM_INPUT}
    {@link #GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}{@link #GL_BUFFER_VARIABLE BUFFER_VARIABLE}{@link #GL_SHADER_STORAGE_BLOCK SHADER_STORAGE_BLOCK}
    {@link #GL_VERTEX_SUBROUTINE VERTEX_SUBROUTINE}{@link #GL_TESS_CONTROL_SUBROUTINE TESS_CONTROL_SUBROUTINE}{@link #GL_TESS_EVALUATION_SUBROUTINE TESS_EVALUATION_SUBROUTINE}
    {@link #GL_GEOMETRY_SUBROUTINE GEOMETRY_SUBROUTINE}{@link #GL_FRAGMENT_SUBROUTINE FRAGMENT_SUBROUTINE}{@link #GL_COMPUTE_SUBROUTINE COMPUTE_SUBROUTINE}
    {@link #GL_VERTEX_SUBROUTINE_UNIFORM VERTEX_SUBROUTINE_UNIFORM}{@link #GL_TESS_CONTROL_SUBROUTINE_UNIFORM TESS_CONTROL_SUBROUTINE_UNIFORM}{@link #GL_TESS_EVALUATION_SUBROUTINE_UNIFORM TESS_EVALUATION_SUBROUTINE_UNIFORM}
    {@link #GL_GEOMETRY_SUBROUTINE_UNIFORM GEOMETRY_SUBROUTINE_UNIFORM}{@link #GL_FRAGMENT_SUBROUTINE_UNIFORM FRAGMENT_SUBROUTINE_UNIFORM}{@link #GL_COMPUTE_SUBROUTINE_UNIFORM COMPUTE_SUBROUTINE_UNIFORM}
    {@link #GL_TRANSFORM_FEEDBACK_VARYING TRANSFORM_FEEDBACK_VARYING}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}
    + * @param index the active resource index + * @param props an array that will receive the active resource properties + * @param length a variable which will receive the number of values returned + * @param params an array that will receive the property values + * + * @see Reference Page + */ + public static void glGetProgramResourceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @NativeType("GLenum const *") IntBuffer props, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetProgramResourceiv(program, programInterface, index, props.remaining(), memAddress(props), params.remaining(), memAddressSafe(length), memAddress(params)); + } + + // --- [ glGetProgramResourceLocation ] --- + + /** Unsafe version of: {@link #glGetProgramResourceLocation GetProgramResourceLocation} */ + public static native int nglGetProgramResourceLocation(int program, int programInterface, long name); + + /** + * Queries the location of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name} + * @param name the name of the resource to query the location of + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetProgramResourceLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetProgramResourceLocation(program, programInterface, memAddress(name)); + } + + /** + * Queries the location of a named resource within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name} + * @param name the name of the resource to query the location of + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetProgramResourceLocation(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetProgramResourceLocation(program, programInterface, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetProgramResourceLocationIndex ] --- + + /** Unsafe version of: {@link #glGetProgramResourceLocationIndex GetProgramResourceLocationIndex} */ + public static native int nglGetProgramResourceLocationIndex(int program, int programInterface, long name); + + /** + * Queries the fragment color index of a named variable within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name}. Must be:
    {@link #GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}
    + * @param name the name of the resource to query the location of + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetProgramResourceLocationIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetProgramResourceLocationIndex(program, programInterface, memAddress(name)); + } + + /** + * Queries the fragment color index of a named variable within a program. + * + * @param program the name of a program object whose resources to query + * @param programInterface a token identifying the interface within {@code program} containing the resource named {@code name}. Must be:
    {@link #GL_PROGRAM_OUTPUT PROGRAM_OUTPUT}
    + * @param name the name of the resource to query the location of + * + * @see Reference Page + */ + @NativeType("GLint") + public static int glGetProgramResourceLocationIndex(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetProgramResourceLocationIndex(program, programInterface, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glShaderStorageBlockBinding ] --- + + /** + * Changes an active shader storage block binding. + * + * @param program the name of the program containing the block whose binding to change + * @param storageBlockIndex the index storage block within the program + * @param storageBlockBinding the index storage block binding to associate with the specified storage block + * + * @see Reference Page + */ + public static native void glShaderStorageBlockBinding(@NativeType("GLuint") int program, @NativeType("GLuint") int storageBlockIndex, @NativeType("GLuint") int storageBlockBinding); + + // --- [ glTexBufferRange ] --- + + /** + * Binds a range of a buffer's data store to a buffer texture. + * + * @param target the target of the operation. Must be:
    {@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}
    + * @param internalformat the internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + * @param offset the offset of the start of the range of the buffer's data store to attach + * @param size the size of the range of the buffer's data store to attach + * + * @see Reference Page + */ + public static native void glTexBufferRange(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size); + + // --- [ glTexStorage2DMultisample ] --- + + /** + * Specifies storage for a two-dimensional multisample texture. + * + * @param target the target of the operation. One of:
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}
    + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static native void glTexStorage2DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedsamplelocations); + + // --- [ glTexStorage3DMultisample ] --- + + /** + * Specifies storage for a two-dimensional multisample array texture. + * + * @param target the target of the operation. One of:
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}{@link GL32#GL_PROXY_TEXTURE_2D_MULTISAMPLE PROXY_TEXTURE_2D_MULTISAMPLE}
    + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static native void glTexStorage3DMultisample(@NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedsamplelocations); + + // --- [ glTextureView ] --- + + /** + * Initializes a texture as a data alias of another texture's data store. + * + * @param texture the texture object to be initialized as a view + * @param target the target to be used for the newly initialized texture + * @param origtexture the name of a texture object of which to make a view + * @param internalformat the internal format for the newly created view + * @param minlevel the lowest level of detail of the view + * @param numlevels the number of levels of detail to include in the view + * @param minlayer the index of the first layer to include in the view + * @param numlayers the number of layers to include in the view + * + * @see Reference Page + */ + public static native void glTextureView(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLuint") int origtexture, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int minlevel, @NativeType("GLuint") int numlevels, @NativeType("GLuint") int minlayer, @NativeType("GLuint") int numlayers); + + // --- [ glBindVertexBuffer ] --- + + /** + * Binds a buffer to a vertex buffer bind point. + * + * @param bindingindex the index of the vertex buffer binding point to which to bind the buffer + * @param buffer the name of an existing buffer to bind to the vertex buffer binding point + * @param offset the offset of the first element of the buffer + * @param stride the distance between elements within the buffer + * + * @see Reference Page + */ + public static native void glBindVertexBuffer(@NativeType("GLuint") int bindingindex, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizei") int stride); + + // --- [ glVertexAttribFormat ] --- + + /** + * Specifies the organization of data in vertex arrays. + * + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param normalized if true then integer data is normalized to the range [-1, 1] or [0, 1] if it is signed or unsigned, respectively. If false then integer data is + * directly converted to floating point. + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static native void glVertexAttribFormat(@NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int relativeoffset); + + // --- [ glVertexAttribIFormat ] --- + + /** + * Specifies the organization of pure integer data in vertex arrays. + * + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static native void glVertexAttribIFormat(@NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset); + + // --- [ glVertexAttribLFormat ] --- + + /** + * Specifies the organization of 64-bit double data in vertex arrays. + * + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static native void glVertexAttribLFormat(@NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset); + + // --- [ glVertexAttribBinding ] --- + + /** + * Associate a vertex attribute and a vertex buffer binding. + * + * @param attribindex the index of the attribute to associate with a vertex buffer binding + * @param bindingindex the index of the vertex buffer binding with which to associate the generic vertex attribute + * + * @see Reference Page + */ + public static native void glVertexAttribBinding(@NativeType("GLuint") int attribindex, @NativeType("GLuint") int bindingindex); + + // --- [ glVertexBindingDivisor ] --- + + /** + * Modifies the rate at which generic vertex attributes advance during instanced rendering. + * + * @param bindingindex the index of the generic vertex attribute + * @param divisor the number of instances that will pass between updates of the generic attribute at slot {@code index} + * + * @see Reference Page + */ + public static native void glVertexBindingDivisor(@NativeType("GLuint") int bindingindex, @NativeType("GLuint") int divisor); + + /** + * Array version of: {@link #glClearBufferData ClearBufferData} + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glClearBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, internalformat, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearBufferData ClearBufferData} + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glClearBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, internalformat, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearBufferData ClearBufferData} + * + * @see Reference Page + */ + public static void glClearBufferData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glClearBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, internalformat, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearBufferSubData ClearBufferSubData} + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glClearBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, internalformat, offset, size, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearBufferSubData ClearBufferSubData} + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glClearBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, internalformat, offset, size, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearBufferSubData ClearBufferSubData} + * + * @see Reference Page + */ + public static void glClearBufferSubData(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glClearBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(target, internalformat, offset, size, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glDebugMessageControl DebugMessageControl} + * + * @see Reference Page + */ + public static void glDebugMessageControl(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @Nullable @NativeType("GLuint const *") int[] ids, @NativeType("GLboolean") boolean enabled) { + long __functionAddress = GL.getICD().glDebugMessageControl; + if (CHECKS) { + check(__functionAddress); + } + callPV(source, type, severity, lengthSafe(ids), ids, enabled, __functionAddress); + } + + /** + * Array version of: {@link #glGetDebugMessageLog GetDebugMessageLog} + * + * @see Reference Page + */ + @NativeType("GLuint") + public static int glGetDebugMessageLog(@NativeType("GLuint") int count, @Nullable @NativeType("GLenum *") int[] sources, @Nullable @NativeType("GLenum *") int[] types, @Nullable @NativeType("GLuint *") int[] ids, @Nullable @NativeType("GLenum *") int[] severities, @Nullable @NativeType("GLsizei *") int[] lengths, @Nullable @NativeType("GLchar *") ByteBuffer messageLog) { + long __functionAddress = GL.getICD().glGetDebugMessageLog; + if (CHECKS) { + check(__functionAddress); + checkSafe(sources, count); + checkSafe(types, count); + checkSafe(ids, count); + checkSafe(severities, count); + checkSafe(lengths, count); + } + return callPPPPPPI(count, remainingSafe(messageLog), sources, types, ids, severities, lengths, memAddressSafe(messageLog), __functionAddress); + } + + /** + * Array version of: {@link #glGetObjectLabel GetObjectLabel} + * + * @see Reference Page + */ + public static void glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer label) { + long __functionAddress = GL.getICD().glGetObjectLabel; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(identifier, name, label.remaining(), length, memAddress(label), __functionAddress); + } + + /** + * Array version of: {@link #glGetObjectPtrLabel GetObjectPtrLabel} + * + * @see Reference Page + */ + public static void glGetObjectPtrLabel(@NativeType("void *") long ptr, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer label) { + long __functionAddress = GL.getICD().glGetObjectPtrLabel; + if (CHECKS) { + check(__functionAddress); + check(ptr); + checkSafe(length, 1); + } + callPPPV(ptr, label.remaining(), length, memAddress(label), __functionAddress); + } + + /** + * Array version of: {@link #glGetFramebufferParameteriv GetFramebufferParameteriv} + * + * @see Reference Page + */ + public static void glGetFramebufferParameteriv(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetFramebufferParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetInternalformati64v GetInternalformati64v} + * + * @see Reference Page + */ + public static void glGetInternalformati64v(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetInternalformati64v; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, internalformat, pname, params.length, params, __functionAddress); + } + + /** + * Array version of: {@link #glInvalidateFramebuffer InvalidateFramebuffer} + * + * @see Reference Page + */ + public static void glInvalidateFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int[] attachments) { + long __functionAddress = GL.getICD().glInvalidateFramebuffer; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, attachments.length, attachments, __functionAddress); + } + + /** + * Array version of: {@link #glInvalidateSubFramebuffer InvalidateSubFramebuffer} + * + * @see Reference Page + */ + public static void glInvalidateSubFramebuffer(@NativeType("GLenum") int target, @NativeType("GLenum const *") int[] attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + long __functionAddress = GL.getICD().glInvalidateSubFramebuffer; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, attachments.length, attachments, x, y, width, height, __functionAddress); + } + + /** + * Array version of: {@link #glMultiDrawArraysIndirect MultiDrawArraysIndirect} + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirect(@NativeType("GLenum") int mode, @NativeType("void const *") int[] indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + long __functionAddress = GL.getICD().glMultiDrawArraysIndirect; + if (CHECKS) { + check(__functionAddress); + check(indirect, (drawcount * (stride == 0 ? (4 * 4) : stride)) >> 2); + } + callPV(mode, indirect, drawcount, stride, __functionAddress); + } + + /** + * Array version of: {@link #glMultiDrawElementsIndirect MultiDrawElementsIndirect} + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirect(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") int[] indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride) { + long __functionAddress = GL.getICD().glMultiDrawElementsIndirect; + if (CHECKS) { + check(__functionAddress); + check(indirect, (drawcount * (stride == 0 ? (5 * 4) : stride)) >> 2); + } + callPV(mode, type, indirect, drawcount, stride, __functionAddress); + } + + /** + * Array version of: {@link #glGetProgramInterfaceiv GetProgramInterfaceiv} + * + * @see Reference Page + */ + public static void glGetProgramInterfaceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetProgramInterfaceiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, programInterface, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetProgramResourceName GetProgramResourceName} + * + * @see Reference Page + */ + public static void glGetProgramResourceName(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer name) { + long __functionAddress = GL.getICD().glGetProgramResourceName; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPV(program, programInterface, index, name.remaining(), length, memAddress(name), __functionAddress); + } + + /** + * Array version of: {@link #glGetProgramResourceiv GetProgramResourceiv} + * + * @see Reference Page + */ + public static void glGetProgramResourceiv(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @NativeType("GLenum const *") int[] props, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetProgramResourceiv; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPPV(program, programInterface, index, props.length, props, params.length, length, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL44.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL44.java new file mode 100644 index 000000000..acc7d264b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL44.java @@ -0,0 +1,1169 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 4.4. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 4.4 implementations support revision 4.40 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL44 extends GL43 { + + static { GL.initialize(); } + + /** Implementation-dependent state which constrains the maximum value of stride parameters to vertex array pointer-setting commands. */ + public static final int GL_MAX_VERTEX_ATTRIB_STRIDE = 0x82E5; + + /** + * Implementations are not required to support primitive restart for separate patch primitives (primitive type PATCHES). Support can be queried by calling + * GetBooleanv with the symbolic constant PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED. A value of FALSE indicates that primitive restart is treated as + * disabled when drawing patches, no matter the value of the enables. A value of TRUE indicates that primitive restart behaves normally for patches. + */ + public static final int GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED = 0x8221; + + /** Equivalent to {@link ARBTextureBufferObject#GL_TEXTURE_BUFFER_ARB TEXTURE_BUFFER_ARB} query, but named more consistently. */ + public static final int GL_TEXTURE_BUFFER_BINDING = 0x8C2A; + + /** Accepted in the {@code flags} parameter of {@link #glBufferStorage BufferStorage} and {@link ARBBufferStorage#glNamedBufferStorageEXT NamedBufferStorageEXT}. */ + public static final int + GL_MAP_PERSISTENT_BIT = 0x40, + GL_MAP_COHERENT_BIT = 0x80, + GL_DYNAMIC_STORAGE_BIT = 0x100, + GL_CLIENT_STORAGE_BIT = 0x200; + + /** Accepted by the {@code pname} parameter of {@code GetBufferParameter{i|i64}v}. */ + public static final int + GL_BUFFER_IMMUTABLE_STORAGE = 0x821F, + GL_BUFFER_STORAGE_FLAGS = 0x8220; + + /** Accepted by the {@code barriers} parameter of {@link GL42C#glMemoryBarrier MemoryBarrier}. */ + public static final int GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT = 0x4000; + + /** Accepted by the {@code pname} parameter for {@link GL42C#glGetInternalformativ GetInternalformativ} and {@link GL43C#glGetInternalformati64v GetInternalformati64v}. */ + public static final int GL_CLEAR_TEXTURE = 0x9365; + + /** Accepted in the {@code props} array of {@link GL43C#glGetProgramResourceiv GetProgramResourceiv}. */ + public static final int + GL_LOCATION_COMPONENT = 0x934A, + GL_TRANSFORM_FEEDBACK_BUFFER_INDEX = 0x934B, + GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE = 0x934C; + + /** Accepted by the {@code pname} parameter of {@link GL15C#glGetQueryObjectiv GetQueryObjectiv}, {@link GL15C#glGetQueryObjectuiv GetQueryObjectuiv}, {@link GL33C#glGetQueryObjecti64v GetQueryObjecti64v} and {@link GL33C#glGetQueryObjectui64v GetQueryObjectui64v}. */ + public static final int GL_QUERY_RESULT_NO_WAIT = 0x9194; + + /** + * Accepted by the {@code target} parameter of {@link GL15C#glBindBuffer BindBuffer}, {@link GL15C#glBufferData BufferData}, {@link GL15C#glBufferSubData BufferSubData}, + * {@link GL15C#glMapBuffer MapBuffer}, {@link GL15C#glUnmapBuffer UnmapBuffer}, {@link GL30C#glMapBufferRange MapBufferRange}, {@link GL15C#glGetBufferSubData GetBufferSubData}, + * {@link GL15C#glGetBufferParameteriv GetBufferParameteriv}, {@link GL32C#glGetBufferParameteri64v GetBufferParameteri64v}, {@link GL15C#glGetBufferPointerv GetBufferPointerv}, + * {@link GL43C#glClearBufferSubData ClearBufferSubData}, and the {@code readtarget} and {@code writetarget} parameters of {@link GL31C#glCopyBufferSubData CopyBufferSubData}. + */ + public static final int GL_QUERY_BUFFER = 0x9192; + + /** + * Accepted by the {@code pname} parameter of {@link GL11C#glGetBooleanv GetBooleanv}, {@link GL11C#glGetIntegerv GetIntegerv}, {@link GL11C#glGetFloatv GetFloatv}, + * and {@link GL11C#glGetDoublev GetDoublev}. + */ + public static final int GL_QUERY_BUFFER_BINDING = 0x9193; + + /** Accepted in the {@code barriers} bitfield in {@link GL42C#glMemoryBarrier MemoryBarrier}. */ + public static final int GL_QUERY_BUFFER_BARRIER_BIT = 0x8000; + + /** + * Accepted by the {@code param} parameter of TexParameter{if}, SamplerParameter{if} and SamplerParameter{if}v, and by the {@code params} parameter of + * TexParameter{if}v, TexParameterI{i ui}v and SamplerParameterI{i ui}v when their {@code pname} parameter is {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}, {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}, or + * {@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}, + */ + public static final int GL_MIRROR_CLAMP_TO_EDGE = 0x8743; + + protected GL44() { + throw new UnsupportedOperationException(); + } + + // --- [ glBufferStorage ] --- + + /** + * Unsafe version of: {@link #glBufferStorage BufferStorage} + * + * @param size the size of the data store in basic machine units + */ + public static void nglBufferStorage(int target, long size, long data, int flags) { + GL44C.nglBufferStorage(target, size, data, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param size the size of the data store in basic machine units + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("GLsizeiptr") long size, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, size, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") ByteBuffer data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") ShortBuffer data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") IntBuffer data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") FloatBuffer data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44C#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44C#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44C#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44C#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44C#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") DoubleBuffer data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + // --- [ glClearTexSubImage ] --- + + /** Unsafe version of: {@link #glClearTexSubImage ClearTexSubImage} */ + public static void nglClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long data) { + GL44C.nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + // --- [ glClearTexImage ] --- + + /** Unsafe version of: {@link #glClearTexImage ClearTexImage} */ + public static void nglClearTexImage(int texture, int level, int format, int type, long data) { + GL44C.nglClearTexImage(texture, level, format, type, data); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + // --- [ glBindBuffersBase ] --- + + /** + * Unsafe version of: {@link #glBindBuffersBase BindBuffersBase} + * + * @param count the number of bindings + */ + public static void nglBindBuffersBase(int target, int first, int count, long buffers) { + GL44C.nglBindBuffersBase(target, first, count, buffers); + } + + /** + * Binds {@code count} existing buffer objects to bindings numbered {@code first} through {@code first+count-1} in the array of buffer binding points + * corresponding to {@code target}. If {@code buffers} is not {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name + * of an existing buffer object. It is equivalent to: + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( buffers == NULL ) {
    +     *         glBindBufferBase(target, first + i, 0);
    +     *     } else {
    +     *         glBindBufferBase(target, first + i, buffers[i]);
    +     *     }
    +     * }
    + * + *

    except that the single general buffer binding corresponding to {@code target} is unmodified, and that buffers will not be created if they do not exist.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param first the first binding + * @param buffers an array of zeros or names of existing buffers objects + * + * @see Reference Page + */ + public static void glBindBuffersBase(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers) { + GL44C.glBindBuffersBase(target, first, buffers); + } + + // --- [ glBindBuffersRange ] --- + + /** + * Unsafe version of: {@link #glBindBuffersRange BindBuffersRange} + * + * @param count the number of bindings + */ + public static void nglBindBuffersRange(int target, int first, int count, long buffers, long offsets, long sizes) { + GL44C.nglBindBuffersRange(target, first, count, buffers, offsets, sizes); + } + + /** + * Binds {@code count} existing buffer objects to bindings numbered {@code first} through {@code first+count-1} in the array of buffer binding points + * corresponding to {@code target}. {@code offsets} and {@code sizes} specify arrays of {@code count} values indicating the range of each buffer to bind. + * If {@code buffers} is {@code NULL}, all bindings from {@code first} through {@code first+count-1} are reset to their unbound (zero) state. In this + * case, the offsets and sizes associated with the binding points are set to default values, ignoring {@code offsets} and {@code sizes}. It is equivalent + * to: + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( buffers == NULL ) {
    +     *         glBindBufferRange(target, first + i, 0, 0, 0);
    +     *     } else {
    +     *         glBindBufferRange(target, first + i, buffers[i], offsets[i], sizes[i]);
    +     *     }
    +     * }
    + * + *

    except that the single general buffer binding corresponding to {@code target} is unmodified, and that buffers will not be created if they do not exist.

    + * + *

    The values specified in {@code buffers}, {@code offsets}, and {@code sizes} will be checked separately for each binding point. When values for a + * specific binding point are invalid, the state for that binding point will be unchanged and an error will be generated. However, state for other binding + * points will still be changed if their corresponding values are valid.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param first the first binding + * @param buffers an array of names of existing buffers objects + * @param offsets an array of offsets + * @param sizes an array of sizes + * + * @see Reference Page + */ + public static void glBindBuffersRange(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizeiptr const *") PointerBuffer sizes) { + GL44C.glBindBuffersRange(target, first, buffers, offsets, sizes); + } + + // --- [ glBindTextures ] --- + + /** + * Unsafe version of: {@link #glBindTextures BindTextures} + * + * @param count the number of texture objects + */ + public static void nglBindTextures(int first, int count, long textures) { + GL44C.nglBindTextures(first, count, textures); + } + + /** + * Binds {@code count} existing texture objects to texture image units numbered {@code first} through {@code first+count-1}. If {@code textures} is not + * {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name of an existing texture object. When an entry in + * {@code textures} is the name of an existing texture object, that object is bound to corresponding texture unit for the target specified when the texture + * object was created. When an entry in {@code textures} is zero, each of the targets enumerated at the beginning of this section is reset to its default + * texture for the corresponding texture image unit. If {@code textures} is {@code NULL}, each target of each affected texture image unit from {@code first} + * through {@code first+count-1} is reset to its default texture. + * + *

    {@code BindTextures} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     uint texture;
    +     *     if ( textures == NULL ) {
    +     *         texture = 0;
    +     *     } else {
    +     *         texture = textures[i];
    +     *     }
    +     *     ActiveTexture(TEXTURE0 + first + i);
    +     *     if ( texture != 0 ) {
    +     *         enum target; // target of texture object textures[i]
    +     *         BindTexture(target, textures[i]);
    +     *     } else {
    +     *         for ( target in all supported targets ) {
    +     *             BindTexture(target, 0);
    +     *         }
    +     *     }
    +     * }
    + * + *

    except that the active texture selector retains its original value upon completion of the command, and that textures will not be created if they do not + * exist.

    + * + *

    The values specified in {@code textures} will be checked separately for each texture image unit. When a value for a specific texture image unit is + * invalid, the state for that texture image unit will be unchanged and an error will be generated. However, state for other texture image units will still + * be changed if their corresponding values are valid.

    + * + * @param first the first texture objects + * @param textures an array of zeros or names of existing texture objects + * + * @see Reference Page + */ + public static void glBindTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer textures) { + GL44C.glBindTextures(first, textures); + } + + // --- [ glBindSamplers ] --- + + /** + * Unsafe version of: {@link #glBindSamplers BindSamplers} + * + * @param count the number of sampler objects + */ + public static void nglBindSamplers(int first, int count, long samplers) { + GL44C.nglBindSamplers(first, count, samplers); + } + + /** + * Binds {@code count} existing sampler objects to texture image units numbered {@code first} through {@code first+count-1}. If {@code samplers} is not + * {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name of an existing sampler object. If {@code samplers} is {@code NULL}, + * each affected texture image unit from {@code first} through {@code first+count-1} will be reset to have no bound sampler object. + * + *

    {@code BindSamplers} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( samplers == NULL ) {
    +     *         glBindSampler(first + i, 0);
    +     *     } else {
    +     *         glBindSampler(first + i, samplers[i]);
    +     *     }
    +     * }
    + * + *

    The values specified in {@code samplers} will be checked separately for each texture image unit. When a value for a specific texture image unit is + * invalid, the state for that texture image unit will be unchanged and an error will be generated. However, state for other texture image units will still + * be changed if their corresponding values are valid.

    + * + * @param first the first sampler object + * @param samplers an array of zeros or names of existing sampler objects + * + * @see Reference Page + */ + public static void glBindSamplers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer samplers) { + GL44C.glBindSamplers(first, samplers); + } + + // --- [ glBindImageTextures ] --- + + /** + * Unsafe version of: {@link #glBindImageTextures BindImageTextures} + * + * @param count the number of image units + */ + public static void nglBindImageTextures(int first, int count, long textures) { + GL44C.nglBindImageTextures(first, count, textures); + } + + /** + * Binds {@code count} existing texture objects to image units numbered {@code first} through {@code first+count-1}. If {@code textures} is not {@code NULL}, it + * specifies an array of {@code count} values, each of which must be zero or the name of an existing texture object. If {@code textures} is {@code NULL}, each + * affected image unit from {@code first} through {@code first+count-1} will be reset to have no bound texture object. + * + *

    When binding a non-zero texture object to an image unit, the image unit {@code level}, {@code layered}, {@code layer}, and {@code access} parameters are + * set to zero, {@link GL11#GL_TRUE TRUE}, zero, and {@link GL15#GL_READ_WRITE READ_WRITE}, respectively. The image unit {@code format} parameter is taken from the internal + * format of the texture image at level zero of the texture object identified by {@code textures}. For cube map textures, the internal format of the + * {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X} image of level zero is used. For multisample, multisample array, buffer, and rectangle textures, the internal + * format of the single texture level is used.

    + * + *

    When unbinding a texture object from an image unit, the image unit parameters {@code level}, {@code layered}, {@code layer}, and {@code format} will be + * reset to their default values of zero, {@link GL11#GL_FALSE FALSE}, 0, and {@link GL30#GL_R8 R8}, respectively.

    + * + *

    {@code BindImageTextures} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( textures == NULL || textures[i] = 0 ) {
    +     *         glBindImageTexture(first + i, 0, 0, FALSE, 0, READ_ONLY, R8);
    +     *     } else {
    +     *         glBindImageTexture(first + i, textures[i], 0, TRUE, 0, READ_WRITE, lookupInternalFormat(textures[i]));
    +     *     }
    +     * }
    + * + *

    where {@code lookupInternalFormat} returns the internal format of the specified texture object.

    + * + *

    The values specified in {@code textures} will be checked separately for each image unit. When a value for a specific image unit is invalid, the state + * for that image unit will be unchanged and an error will be generated. However, state for other image units will still be changed if their corresponding + * values are valid.

    + * + * @param first the first image unit + * @param textures an array of zeros or names of existing texture objects + * + * @see Reference Page + */ + public static void glBindImageTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer textures) { + GL44C.glBindImageTextures(first, textures); + } + + // --- [ glBindVertexBuffers ] --- + + /** + * Unsafe version of: {@link #glBindVertexBuffers BindVertexBuffers} + * + * @param count the number of vertex buffer binding points + */ + public static void nglBindVertexBuffers(int first, int count, long buffers, long offsets, long strides) { + GL44C.nglBindVertexBuffers(first, count, buffers, offsets, strides); + } + + /** + * Binds {@code count} existing buffer objects to vertex buffer binding points numbered {@code first} through {@code first+count-1}. If {@code buffers} is + * not {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name of an existing buffer object. {@code offsets} and + * {@code strides} specify arrays of {@code count} values indicating the offset of the first element and stride between elements in each buffer, + * respectively. If {@code buffers} is {@code NULL}, each affected vertex buffer binding point from {@code first} through {@code first+count-1} will be reset to + * have no bound buffer object. In this case, the offsets and strides associated with the binding points are set to default values, ignoring + * {@code offsets} and {@code strides}. + * + *

    {@code BindVertexBuffers} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( buffers == NULL ) {
    +     *         glBindVertexBuffer(first + i, 0, 0, 16);
    +     *     } else {
    +     *         glBindVertexBuffer(first + i, buffers[i], offsets[i], strides[i]);
    +     *     }
    +     * }
    + * + *

    except that buffers will not be created if they do not exist.

    + * + *

    The values specified in {@code buffers}, {@code offsets}, and {@code strides} will be checked separately for each vertex buffer binding point. When a + * value for a specific binding point is invalid, the state for that binding point will be unchanged and an error will be generated. However, state for + * other binding points will still be changed if their corresponding values are valid.

    + * + * @param first the first vertex buffer binding point + * @param buffers an array of zeros or names of existing buffers objects + * @param offsets an array of offses + * @param strides an array of stride values + * + * @see Reference Page + */ + public static void glBindVertexBuffers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") IntBuffer strides) { + GL44C.glBindVertexBuffers(first, buffers, offsets, strides); + } + + /** + * Array version of: {@link #glBufferStorage BufferStorage} + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") short[] data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Array version of: {@link #glBufferStorage BufferStorage} + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") int[] data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Array version of: {@link #glBufferStorage BufferStorage} + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") float[] data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Array version of: {@link #glBufferStorage BufferStorage} + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") double[] data, @NativeType("GLbitfield") int flags) { + GL44C.glBufferStorage(target, data, flags); + } + + /** + * Array version of: {@link #glClearTexSubImage ClearTexSubImage} + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Array version of: {@link #glClearTexSubImage ClearTexSubImage} + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Array version of: {@link #glClearTexSubImage ClearTexSubImage} + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Array version of: {@link #glClearTexSubImage ClearTexSubImage} + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] data) { + GL44C.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + + /** + * Array version of: {@link #glClearTexImage ClearTexImage} + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Array version of: {@link #glClearTexImage ClearTexImage} + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Array version of: {@link #glClearTexImage ClearTexImage} + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Array version of: {@link #glClearTexImage ClearTexImage} + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] data) { + GL44C.glClearTexImage(texture, level, format, type, data); + } + + /** + * Array version of: {@link #glBindBuffersBase BindBuffersBase} + * + * @see Reference Page + */ + public static void glBindBuffersBase(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers) { + GL44C.glBindBuffersBase(target, first, buffers); + } + + /** + * Array version of: {@link #glBindBuffersRange BindBuffersRange} + * + * @see Reference Page + */ + public static void glBindBuffersRange(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizeiptr const *") PointerBuffer sizes) { + GL44C.glBindBuffersRange(target, first, buffers, offsets, sizes); + } + + /** + * Array version of: {@link #glBindTextures BindTextures} + * + * @see Reference Page + */ + public static void glBindTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] textures) { + GL44C.glBindTextures(first, textures); + } + + /** + * Array version of: {@link #glBindSamplers BindSamplers} + * + * @see Reference Page + */ + public static void glBindSamplers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] samplers) { + GL44C.glBindSamplers(first, samplers); + } + + /** + * Array version of: {@link #glBindImageTextures BindImageTextures} + * + * @see Reference Page + */ + public static void glBindImageTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] textures) { + GL44C.glBindImageTextures(first, textures); + } + + /** + * Array version of: {@link #glBindVertexBuffers BindVertexBuffers} + * + * @see Reference Page + */ + public static void glBindVertexBuffers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") int[] strides) { + GL44C.glBindVertexBuffers(first, buffers, offsets, strides); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL44C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL44C.java new file mode 100644 index 000000000..ae07c1f4e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL44C.java @@ -0,0 +1,1239 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 4.4. Includes only Core Profile symbols. + * + *

    OpenGL 4.4 implementations support revision 4.40 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL44C extends GL43C { + + static { GL.initialize(); } + + /** Implementation-dependent state which constrains the maximum value of stride parameters to vertex array pointer-setting commands. */ + public static final int GL_MAX_VERTEX_ATTRIB_STRIDE = 0x82E5; + + /** + * Implementations are not required to support primitive restart for separate patch primitives (primitive type PATCHES). Support can be queried by calling + * GetBooleanv with the symbolic constant PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED. A value of FALSE indicates that primitive restart is treated as + * disabled when drawing patches, no matter the value of the enables. A value of TRUE indicates that primitive restart behaves normally for patches. + */ + public static final int GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED = 0x8221; + + /** Equivalent to {@link ARBTextureBufferObject#GL_TEXTURE_BUFFER_ARB TEXTURE_BUFFER_ARB} query, but named more consistently. */ + public static final int GL_TEXTURE_BUFFER_BINDING = 0x8C2A; + + /** Accepted in the {@code flags} parameter of {@link #glBufferStorage BufferStorage} and {@link ARBBufferStorage#glNamedBufferStorageEXT NamedBufferStorageEXT}. */ + public static final int + GL_MAP_PERSISTENT_BIT = 0x40, + GL_MAP_COHERENT_BIT = 0x80, + GL_DYNAMIC_STORAGE_BIT = 0x100, + GL_CLIENT_STORAGE_BIT = 0x200; + + /** Accepted by the {@code pname} parameter of {@code GetBufferParameter{i|i64}v}. */ + public static final int + GL_BUFFER_IMMUTABLE_STORAGE = 0x821F, + GL_BUFFER_STORAGE_FLAGS = 0x8220; + + /** Accepted by the {@code barriers} parameter of {@link GL42C#glMemoryBarrier MemoryBarrier}. */ + public static final int GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT = 0x4000; + + /** Accepted by the {@code pname} parameter for {@link GL42C#glGetInternalformativ GetInternalformativ} and {@link GL43C#glGetInternalformati64v GetInternalformati64v}. */ + public static final int GL_CLEAR_TEXTURE = 0x9365; + + /** Accepted in the {@code props} array of {@link GL43C#glGetProgramResourceiv GetProgramResourceiv}. */ + public static final int + GL_LOCATION_COMPONENT = 0x934A, + GL_TRANSFORM_FEEDBACK_BUFFER_INDEX = 0x934B, + GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE = 0x934C; + + /** Accepted by the {@code pname} parameter of {@link GL15C#glGetQueryObjectiv GetQueryObjectiv}, {@link GL15C#glGetQueryObjectuiv GetQueryObjectuiv}, {@link GL33C#glGetQueryObjecti64v GetQueryObjecti64v} and {@link GL33C#glGetQueryObjectui64v GetQueryObjectui64v}. */ + public static final int GL_QUERY_RESULT_NO_WAIT = 0x9194; + + /** + * Accepted by the {@code target} parameter of {@link GL15C#glBindBuffer BindBuffer}, {@link GL15C#glBufferData BufferData}, {@link GL15C#glBufferSubData BufferSubData}, + * {@link GL15C#glMapBuffer MapBuffer}, {@link GL15C#glUnmapBuffer UnmapBuffer}, {@link GL30C#glMapBufferRange MapBufferRange}, {@link GL15C#glGetBufferSubData GetBufferSubData}, + * {@link GL15C#glGetBufferParameteriv GetBufferParameteriv}, {@link GL32C#glGetBufferParameteri64v GetBufferParameteri64v}, {@link GL15C#glGetBufferPointerv GetBufferPointerv}, + * {@link GL43C#glClearBufferSubData ClearBufferSubData}, and the {@code readtarget} and {@code writetarget} parameters of {@link GL31C#glCopyBufferSubData CopyBufferSubData}. + */ + public static final int GL_QUERY_BUFFER = 0x9192; + + /** + * Accepted by the {@code pname} parameter of {@link GL11C#glGetBooleanv GetBooleanv}, {@link GL11C#glGetIntegerv GetIntegerv}, {@link GL11C#glGetFloatv GetFloatv}, + * and {@link GL11C#glGetDoublev GetDoublev}. + */ + public static final int GL_QUERY_BUFFER_BINDING = 0x9193; + + /** Accepted in the {@code barriers} bitfield in {@link GL42C#glMemoryBarrier MemoryBarrier}. */ + public static final int GL_QUERY_BUFFER_BARRIER_BIT = 0x8000; + + /** + * Accepted by the {@code param} parameter of TexParameter{if}, SamplerParameter{if} and SamplerParameter{if}v, and by the {@code params} parameter of + * TexParameter{if}v, TexParameterI{i ui}v and SamplerParameterI{i ui}v when their {@code pname} parameter is {@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}, {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}, or + * {@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}, + */ + public static final int GL_MIRROR_CLAMP_TO_EDGE = 0x8743; + + protected GL44C() { + throw new UnsupportedOperationException(); + } + + // --- [ glBufferStorage ] --- + + /** + * Unsafe version of: {@link #glBufferStorage BufferStorage} + * + * @param size the size of the data store in basic machine units + */ + public static native void nglBufferStorage(int target, long size, long data, int flags); + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param size the size of the data store in basic machine units + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("GLsizeiptr") long size, @NativeType("GLbitfield") int flags) { + nglBufferStorage(target, size, NULL, flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") ByteBuffer data, @NativeType("GLbitfield") int flags) { + nglBufferStorage(target, data.remaining(), memAddress(data), flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") ShortBuffer data, @NativeType("GLbitfield") int flags) { + nglBufferStorage(target, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data), flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") IntBuffer data, @NativeType("GLbitfield") int flags) { + nglBufferStorage(target, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") FloatBuffer data, @NativeType("GLbitfield") int flags) { + nglBufferStorage(target, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), flags); + } + + /** + * Creates the data store of a buffer object. + * + *

    The data store of the buffer object bound to {@code target} is allocated as a result of a call to this function and cannot be de-allocated until the + * buffer is deleted with a call to {@link GL15C#glDeleteBuffers DeleteBuffers}. Such a store may not be re-allocated through further calls to {@code BufferStorage} + * or {@link GL15C#glBufferData BufferData}.

    + * + *

    {@code BufferStorage} deletes any existing data store. If any portion of the buffer object is mapped in the current context or any context current to + * another thread, it is as though {@link GL15C#glUnmapBuffer UnmapBuffer} is executed in each such context prior to deleting the existing data store.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link #GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link #GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link #GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link #GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link #GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") DoubleBuffer data, @NativeType("GLbitfield") int flags) { + nglBufferStorage(target, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data), flags); + } + + // --- [ glClearTexSubImage ] --- + + /** Unsafe version of: {@link #glClearTexSubImage ClearTexSubImage} */ + public static native void nglClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long data); + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddressSafe(data)); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddressSafe(data)); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddressSafe(data)); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddressSafe(data)); + } + + /** + * Fills all or part of a texture image with a constant value. + * + *

    Arguments {@code xoffset}, {@code yoffset}, and {@code zoffset} specify the lower left texel coordinates of a {@code width}-wide by {@code height}-high + * by {@code depth}-deep rectangular subregion of the texel array and are interpreted as they are in {@link GL12C#glTexSubImage3D TexSubImage3D}.

    + * + *

    For 1D array textures, {@code yoffset} is interpreted as the first layer to be cleared and {@code height} is the number of layers to clear. For 2D array + * textures, {@code zoffset} is interpreted as the first layer to be cleared and {@code depth} is the number of layers to clear. Cube map textures are + * treated as an array of six slices in the z-dimension, where the value of {@code zoffset} is interpreted as specifying the cube map face for the + * corresponding {@code layer} and {@code depth} is the number of faces to clear. For cube map array textures, {@code zoffset} is the first layer-face to + * clear, and {@code depth} is the number of layer-faces to clear. Each layer-face is translated into an array layer and a cube map face.

    + * + *

    Negative values of {@code xoffset}, {@code yoffset}, and {@code zoffset} correspond to the coordinates of border texels.

    + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer data) { + nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddressSafe(data)); + } + + // --- [ glClearTexImage ] --- + + /** Unsafe version of: {@link #glClearTexImage ClearTexImage} */ + public static native void nglClearTexImage(int texture, int level, int format, int type, long data); + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + nglClearTexImage(texture, level, format, type, memAddressSafe(data)); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + nglClearTexImage(texture, level, format, type, memAddressSafe(data)); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + nglClearTexImage(texture, level, format, type, memAddressSafe(data)); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + nglClearTexImage(texture, level, format, type, memAddressSafe(data)); + } + + /** + * Is equivalent to calling {@link #glClearTexSubImage ClearTexSubImage} with {@code xoffset}, {@code yoffset}, and {@code zoffset} equal to -{@code b} and {@code width}, + * {@code height}, and {@code depth} equal to the dimensions of the texture image plus {@code 2xb} (or zero and one for dimensions the texture doesn't + * have). + * + * @param texture the texture to clear. It is an error if {@code texture} is zero or not the name of a texture object, if {@code texture} is a buffer texture, or if + * the texture image has a compressed internal format + * @param level the texture level to clear + * @param format the format of the source data. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the source data. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data an array of between one and four components of texel data that will be used as the source for the constant fill value. If {@code data} is {@code NULL}, + * then the pointer is ignored and the sub-range of the texture image is filled with zeros. + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") DoubleBuffer data) { + nglClearTexImage(texture, level, format, type, memAddressSafe(data)); + } + + // --- [ glBindBuffersBase ] --- + + /** + * Unsafe version of: {@link #glBindBuffersBase BindBuffersBase} + * + * @param count the number of bindings + */ + public static native void nglBindBuffersBase(int target, int first, int count, long buffers); + + /** + * Binds {@code count} existing buffer objects to bindings numbered {@code first} through {@code first+count-1} in the array of buffer binding points + * corresponding to {@code target}. If {@code buffers} is not {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name + * of an existing buffer object. It is equivalent to: + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( buffers == NULL ) {
    +     *         glBindBufferBase(target, first + i, 0);
    +     *     } else {
    +     *         glBindBufferBase(target, first + i, buffers[i]);
    +     *     }
    +     * }
    + * + *

    except that the single general buffer binding corresponding to {@code target} is unmodified, and that buffers will not be created if they do not exist.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param first the first binding + * @param buffers an array of zeros or names of existing buffers objects + * + * @see Reference Page + */ + public static void glBindBuffersBase(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers) { + nglBindBuffersBase(target, first, remainingSafe(buffers), memAddressSafe(buffers)); + } + + // --- [ glBindBuffersRange ] --- + + /** + * Unsafe version of: {@link #glBindBuffersRange BindBuffersRange} + * + * @param count the number of bindings + */ + public static native void nglBindBuffersRange(int target, int first, int count, long buffers, long offsets, long sizes); + + /** + * Binds {@code count} existing buffer objects to bindings numbered {@code first} through {@code first+count-1} in the array of buffer binding points + * corresponding to {@code target}. {@code offsets} and {@code sizes} specify arrays of {@code count} values indicating the range of each buffer to bind. + * If {@code buffers} is {@code NULL}, all bindings from {@code first} through {@code first+count-1} are reset to their unbound (zero) state. In this + * case, the offsets and sizes associated with the binding points are set to default values, ignoring {@code offsets} and {@code sizes}. It is equivalent + * to: + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( buffers == NULL ) {
    +     *         glBindBufferRange(target, first + i, 0, 0, 0);
    +     *     } else {
    +     *         glBindBufferRange(target, first + i, buffers[i], offsets[i], sizes[i]);
    +     *     }
    +     * }
    + * + *

    except that the single general buffer binding corresponding to {@code target} is unmodified, and that buffers will not be created if they do not exist.

    + * + *

    The values specified in {@code buffers}, {@code offsets}, and {@code sizes} will be checked separately for each binding point. When values for a + * specific binding point are invalid, the state for that binding point will be unchanged and an error will be generated. However, state for other binding + * points will still be changed if their corresponding values are valid.

    + * + * @param target the buffer object target. One of:
    {@link GL15#GL_ARRAY_BUFFER ARRAY_BUFFER}{@link GL15#GL_ELEMENT_ARRAY_BUFFER ELEMENT_ARRAY_BUFFER}{@link GL21#GL_PIXEL_PACK_BUFFER PIXEL_PACK_BUFFER}{@link GL21#GL_PIXEL_UNPACK_BUFFER PIXEL_UNPACK_BUFFER}
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER TRANSFORM_FEEDBACK_BUFFER}{@link GL31#GL_UNIFORM_BUFFER UNIFORM_BUFFER}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL31#GL_COPY_READ_BUFFER COPY_READ_BUFFER}
    {@link GL31#GL_COPY_WRITE_BUFFER COPY_WRITE_BUFFER}{@link GL40#GL_DRAW_INDIRECT_BUFFER DRAW_INDIRECT_BUFFER}{@link GL42#GL_ATOMIC_COUNTER_BUFFER ATOMIC_COUNTER_BUFFER}{@link GL43#GL_DISPATCH_INDIRECT_BUFFER DISPATCH_INDIRECT_BUFFER}
    {@link GL43#GL_SHADER_STORAGE_BUFFER SHADER_STORAGE_BUFFER}{@link ARBIndirectParameters#GL_PARAMETER_BUFFER_ARB PARAMETER_BUFFER_ARB}
    + * @param first the first binding + * @param buffers an array of names of existing buffers objects + * @param offsets an array of offsets + * @param sizes an array of sizes + * + * @see Reference Page + */ + public static void glBindBuffersRange(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizeiptr const *") PointerBuffer sizes) { + if (CHECKS) { + checkSafe(offsets, remainingSafe(buffers)); + checkSafe(sizes, remainingSafe(buffers)); + } + nglBindBuffersRange(target, first, remainingSafe(buffers), memAddressSafe(buffers), memAddressSafe(offsets), memAddressSafe(sizes)); + } + + // --- [ glBindTextures ] --- + + /** + * Unsafe version of: {@link #glBindTextures BindTextures} + * + * @param count the number of texture objects + */ + public static native void nglBindTextures(int first, int count, long textures); + + /** + * Binds {@code count} existing texture objects to texture image units numbered {@code first} through {@code first+count-1}. If {@code textures} is not + * {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name of an existing texture object. When an entry in + * {@code textures} is the name of an existing texture object, that object is bound to corresponding texture unit for the target specified when the texture + * object was created. When an entry in {@code textures} is zero, each of the targets enumerated at the beginning of this section is reset to its default + * texture for the corresponding texture image unit. If {@code textures} is {@code NULL}, each target of each affected texture image unit from {@code first} + * through {@code first+count-1} is reset to its default texture. + * + *

    {@code BindTextures} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     uint texture;
    +     *     if ( textures == NULL ) {
    +     *         texture = 0;
    +     *     } else {
    +     *         texture = textures[i];
    +     *     }
    +     *     ActiveTexture(TEXTURE0 + first + i);
    +     *     if ( texture != 0 ) {
    +     *         enum target; // target of texture object textures[i]
    +     *         BindTexture(target, textures[i]);
    +     *     } else {
    +     *         for ( target in all supported targets ) {
    +     *             BindTexture(target, 0);
    +     *         }
    +     *     }
    +     * }
    + * + *

    except that the active texture selector retains its original value upon completion of the command, and that textures will not be created if they do not + * exist.

    + * + *

    The values specified in {@code textures} will be checked separately for each texture image unit. When a value for a specific texture image unit is + * invalid, the state for that texture image unit will be unchanged and an error will be generated. However, state for other texture image units will still + * be changed if their corresponding values are valid.

    + * + * @param first the first texture objects + * @param textures an array of zeros or names of existing texture objects + * + * @see Reference Page + */ + public static void glBindTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer textures) { + nglBindTextures(first, remainingSafe(textures), memAddressSafe(textures)); + } + + // --- [ glBindSamplers ] --- + + /** + * Unsafe version of: {@link #glBindSamplers BindSamplers} + * + * @param count the number of sampler objects + */ + public static native void nglBindSamplers(int first, int count, long samplers); + + /** + * Binds {@code count} existing sampler objects to texture image units numbered {@code first} through {@code first+count-1}. If {@code samplers} is not + * {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name of an existing sampler object. If {@code samplers} is {@code NULL}, + * each affected texture image unit from {@code first} through {@code first+count-1} will be reset to have no bound sampler object. + * + *

    {@code BindSamplers} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( samplers == NULL ) {
    +     *         glBindSampler(first + i, 0);
    +     *     } else {
    +     *         glBindSampler(first + i, samplers[i]);
    +     *     }
    +     * }
    + * + *

    The values specified in {@code samplers} will be checked separately for each texture image unit. When a value for a specific texture image unit is + * invalid, the state for that texture image unit will be unchanged and an error will be generated. However, state for other texture image units will still + * be changed if their corresponding values are valid.

    + * + * @param first the first sampler object + * @param samplers an array of zeros or names of existing sampler objects + * + * @see Reference Page + */ + public static void glBindSamplers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer samplers) { + nglBindSamplers(first, remainingSafe(samplers), memAddressSafe(samplers)); + } + + // --- [ glBindImageTextures ] --- + + /** + * Unsafe version of: {@link #glBindImageTextures BindImageTextures} + * + * @param count the number of image units + */ + public static native void nglBindImageTextures(int first, int count, long textures); + + /** + * Binds {@code count} existing texture objects to image units numbered {@code first} through {@code first+count-1}. If {@code textures} is not {@code NULL}, it + * specifies an array of {@code count} values, each of which must be zero or the name of an existing texture object. If {@code textures} is {@code NULL}, each + * affected image unit from {@code first} through {@code first+count-1} will be reset to have no bound texture object. + * + *

    When binding a non-zero texture object to an image unit, the image unit {@code level}, {@code layered}, {@code layer}, and {@code access} parameters are + * set to zero, {@link GL11#GL_TRUE TRUE}, zero, and {@link GL15#GL_READ_WRITE READ_WRITE}, respectively. The image unit {@code format} parameter is taken from the internal + * format of the texture image at level zero of the texture object identified by {@code textures}. For cube map textures, the internal format of the + * {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X} image of level zero is used. For multisample, multisample array, buffer, and rectangle textures, the internal + * format of the single texture level is used.

    + * + *

    When unbinding a texture object from an image unit, the image unit parameters {@code level}, {@code layered}, {@code layer}, and {@code format} will be + * reset to their default values of zero, {@link GL11#GL_FALSE FALSE}, 0, and {@link GL30#GL_R8 R8}, respectively.

    + * + *

    {@code BindImageTextures} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( textures == NULL || textures[i] = 0 ) {
    +     *         glBindImageTexture(first + i, 0, 0, FALSE, 0, READ_ONLY, R8);
    +     *     } else {
    +     *         glBindImageTexture(first + i, textures[i], 0, TRUE, 0, READ_WRITE, lookupInternalFormat(textures[i]));
    +     *     }
    +     * }
    + * + *

    where {@code lookupInternalFormat} returns the internal format of the specified texture object.

    + * + *

    The values specified in {@code textures} will be checked separately for each image unit. When a value for a specific image unit is invalid, the state + * for that image unit will be unchanged and an error will be generated. However, state for other image units will still be changed if their corresponding + * values are valid.

    + * + * @param first the first image unit + * @param textures an array of zeros or names of existing texture objects + * + * @see Reference Page + */ + public static void glBindImageTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer textures) { + nglBindImageTextures(first, remainingSafe(textures), memAddressSafe(textures)); + } + + // --- [ glBindVertexBuffers ] --- + + /** + * Unsafe version of: {@link #glBindVertexBuffers BindVertexBuffers} + * + * @param count the number of vertex buffer binding points + */ + public static native void nglBindVertexBuffers(int first, int count, long buffers, long offsets, long strides); + + /** + * Binds {@code count} existing buffer objects to vertex buffer binding points numbered {@code first} through {@code first+count-1}. If {@code buffers} is + * not {@code NULL}, it specifies an array of {@code count} values, each of which must be zero or the name of an existing buffer object. {@code offsets} and + * {@code strides} specify arrays of {@code count} values indicating the offset of the first element and stride between elements in each buffer, + * respectively. If {@code buffers} is {@code NULL}, each affected vertex buffer binding point from {@code first} through {@code first+count-1} will be reset to + * have no bound buffer object. In this case, the offsets and strides associated with the binding points are set to default values, ignoring + * {@code offsets} and {@code strides}. + * + *

    {@code BindVertexBuffers} is equivalent to:

    + * + *
    
    +     * for ( i = 0; i < count; i++ ) {
    +     *     if ( buffers == NULL ) {
    +     *         glBindVertexBuffer(first + i, 0, 0, 16);
    +     *     } else {
    +     *         glBindVertexBuffer(first + i, buffers[i], offsets[i], strides[i]);
    +     *     }
    +     * }
    + * + *

    except that buffers will not be created if they do not exist.

    + * + *

    The values specified in {@code buffers}, {@code offsets}, and {@code strides} will be checked separately for each vertex buffer binding point. When a + * value for a specific binding point is invalid, the state for that binding point will be unchanged and an error will be generated. However, state for + * other binding points will still be changed if their corresponding values are valid.

    + * + * @param first the first vertex buffer binding point + * @param buffers an array of zeros or names of existing buffers objects + * @param offsets an array of offses + * @param strides an array of stride values + * + * @see Reference Page + */ + public static void glBindVertexBuffers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") IntBuffer strides) { + if (CHECKS) { + checkSafe(offsets, remainingSafe(buffers)); + checkSafe(strides, remainingSafe(buffers)); + } + nglBindVertexBuffers(first, remainingSafe(buffers), memAddressSafe(buffers), memAddressSafe(offsets), memAddressSafe(strides)); + } + + /** + * Array version of: {@link #glBufferStorage BufferStorage} + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") short[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glBufferStorage; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 1, data, flags, __functionAddress); + } + + /** + * Array version of: {@link #glBufferStorage BufferStorage} + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") int[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glBufferStorage; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 2, data, flags, __functionAddress); + } + + /** + * Array version of: {@link #glBufferStorage BufferStorage} + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") float[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glBufferStorage; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 2, data, flags, __functionAddress); + } + + /** + * Array version of: {@link #glBufferStorage BufferStorage} + * + * @see Reference Page + */ + public static void glBufferStorage(@NativeType("GLenum") int target, @NativeType("void const *") double[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glBufferStorage; + if (CHECKS) { + check(__functionAddress); + } + callPPV(target, Integer.toUnsignedLong(data.length) << 3, data, flags, __functionAddress); + } + + /** + * Array version of: {@link #glClearTexSubImage ClearTexSubImage} + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glClearTexSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearTexSubImage ClearTexSubImage} + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glClearTexSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearTexSubImage ClearTexSubImage} + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glClearTexSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearTexSubImage ClearTexSubImage} + * + * @see Reference Page + */ + public static void glClearTexSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] data) { + long __functionAddress = GL.getICD().glClearTexSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearTexImage ClearTexImage} + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glClearTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearTexImage ClearTexImage} + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glClearTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearTexImage ClearTexImage} + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glClearTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearTexImage ClearTexImage} + * + * @see Reference Page + */ + public static void glClearTexImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") double[] data) { + long __functionAddress = GL.getICD().glClearTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glBindBuffersBase BindBuffersBase} + * + * @see Reference Page + */ + public static void glBindBuffersBase(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers) { + long __functionAddress = GL.getICD().glBindBuffersBase; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, first, lengthSafe(buffers), buffers, __functionAddress); + } + + /** + * Array version of: {@link #glBindBuffersRange BindBuffersRange} + * + * @see Reference Page + */ + public static void glBindBuffersRange(@NativeType("GLenum") int target, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizeiptr const *") PointerBuffer sizes) { + long __functionAddress = GL.getICD().glBindBuffersRange; + if (CHECKS) { + check(__functionAddress); + checkSafe(offsets, lengthSafe(buffers)); + checkSafe(sizes, lengthSafe(buffers)); + } + callPPPV(target, first, lengthSafe(buffers), buffers, memAddressSafe(offsets), memAddressSafe(sizes), __functionAddress); + } + + /** + * Array version of: {@link #glBindTextures BindTextures} + * + * @see Reference Page + */ + public static void glBindTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] textures) { + long __functionAddress = GL.getICD().glBindTextures; + if (CHECKS) { + check(__functionAddress); + } + callPV(first, lengthSafe(textures), textures, __functionAddress); + } + + /** + * Array version of: {@link #glBindSamplers BindSamplers} + * + * @see Reference Page + */ + public static void glBindSamplers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] samplers) { + long __functionAddress = GL.getICD().glBindSamplers; + if (CHECKS) { + check(__functionAddress); + } + callPV(first, lengthSafe(samplers), samplers, __functionAddress); + } + + /** + * Array version of: {@link #glBindImageTextures BindImageTextures} + * + * @see Reference Page + */ + public static void glBindImageTextures(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] textures) { + long __functionAddress = GL.getICD().glBindImageTextures; + if (CHECKS) { + check(__functionAddress); + } + callPV(first, lengthSafe(textures), textures, __functionAddress); + } + + /** + * Array version of: {@link #glBindVertexBuffers BindVertexBuffers} + * + * @see Reference Page + */ + public static void glBindVertexBuffers(@NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") int[] strides) { + long __functionAddress = GL.getICD().glBindVertexBuffers; + if (CHECKS) { + check(__functionAddress); + checkSafe(offsets, lengthSafe(buffers)); + checkSafe(strides, lengthSafe(buffers)); + } + callPPPV(first, lengthSafe(buffers), buffers, memAddressSafe(offsets), strides, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL45.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL45.java new file mode 100644 index 000000000..3f7b9b8ef --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL45.java @@ -0,0 +1,5682 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 4.5. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 4.5 implementations support revision 4.50 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL45 extends GL44 { + + static { GL.initialize(); } + + /** Accepted by the {@code depth} parameter of {@link #glClipControl ClipControl}. */ + public static final int + GL_NEGATIVE_ONE_TO_ONE = 0x935E, + GL_ZERO_TO_ONE = 0x935F; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_CLIP_ORIGIN = 0x935C, + GL_CLIP_DEPTH_MODE = 0x935D; + + /** Accepted by the {@code mode} parameter of {@link GL30C#glBeginConditionalRender BeginConditionalRender}. */ + public static final int + GL_QUERY_WAIT_INVERTED = 0x8E17, + GL_QUERY_NO_WAIT_INVERTED = 0x8E18, + GL_QUERY_BY_REGION_WAIT_INVERTED = 0x8E19, + GL_QUERY_BY_REGION_NO_WAIT_INVERTED = 0x8E1A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v. */ + public static final int + GL_MAX_CULL_DISTANCES = 0x82F9, + GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES = 0x82FA; + + /** Accepted by the {@code pname} parameter of GetTextureParameter{if}v and GetTextureParameterI{i ui}v. */ + public static final int GL_TEXTURE_TARGET = 0x1006; + + /** Accepted by the {@code pname} parameter of GetQueryObjectiv. */ + public static final int GL_QUERY_TARGET = 0x82EA; + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetFloatv, GetBooleanv GetDoublev and GetInteger64v. */ + public static final int GL_CONTEXT_RELEASE_BEHAVIOR = 0x82FB; + + /** Returned in {@code data} by GetIntegerv, GetFloatv, GetBooleanv GetDoublev and GetInteger64v when {@code pname} is {@link #GL_CONTEXT_RELEASE_BEHAVIOR CONTEXT_RELEASE_BEHAVIOR}. */ + public static final int GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH = 0x82FC; + + /** Returned by {@link #glGetGraphicsResetStatus GetGraphicsResetStatus}. */ + public static final int + GL_GUILTY_CONTEXT_RESET = 0x8253, + GL_INNOCENT_CONTEXT_RESET = 0x8254, + GL_UNKNOWN_CONTEXT_RESET = 0x8255; + + /** Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, and GetFloatv. */ + public static final int GL_RESET_NOTIFICATION_STRATEGY = 0x8256; + + /** Returned by GetIntegerv and related simple queries when {@code value} is {@link #GL_RESET_NOTIFICATION_STRATEGY RESET_NOTIFICATION_STRATEGY}. */ + public static final int + GL_LOSE_CONTEXT_ON_RESET = 0x8252, + GL_NO_RESET_NOTIFICATION = 0x8261; + + /** Returned by GetIntegerv when {@code pname} is CONTEXT_FLAGS. */ + public static final int GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT = 0x4; + + /** Returned by {@link GL11C#glGetError GetError}. */ + public static final int GL_CONTEXT_LOST = 0x507; + + protected GL45() { + throw new UnsupportedOperationException(); + } + + // --- [ glClipControl ] --- + + /** + * Controls the clipping volume behavior. + * + *

    These parameters update the clip control origin and depth mode respectively. The initial value of the clip control origin is {@link GL20#GL_LOWER_LEFT LOWER_LEFT} and the + * initial value of the depth mode is {@link GL45C#GL_NEGATIVE_ONE_TO_ONE NEGATIVE_ONE_TO_ONE}.

    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if ClipControl is executed between the execution of {@link GL11#glBegin Begin} and the corresponding + * execution of {@link GL11#glEnd End}.

    + * + * @param origin the clip origin. One of:
    {@link GL20#GL_LOWER_LEFT LOWER_LEFT}{@link GL20#GL_UPPER_LEFT UPPER_LEFT}
    + * @param depth the clip depth mode. One of:
    {@link GL45C#GL_NEGATIVE_ONE_TO_ONE NEGATIVE_ONE_TO_ONE}{@link GL45C#GL_ZERO_TO_ONE ZERO_TO_ONE}
    + * + * @see Reference Page + */ + public static void glClipControl(@NativeType("GLenum") int origin, @NativeType("GLenum") int depth) { + GL45C.glClipControl(origin, depth); + } + + // --- [ glCreateTransformFeedbacks ] --- + + /** + * Unsafe version of: {@link #glCreateTransformFeedbacks CreateTransformFeedbacks} + * + * @param n the number of transform feedback object names to create + */ + public static void nglCreateTransformFeedbacks(int n, long ids) { + GL45C.nglCreateTransformFeedbacks(n, ids); + } + + /** + * Returns {@code n} previously unused transform feedback object names in {@code ids}, each representing a new state vector. + * + * @param ids the buffer in which to return the names + * + * @see Reference Page + */ + public static void glCreateTransformFeedbacks(@NativeType("GLuint *") IntBuffer ids) { + GL45C.glCreateTransformFeedbacks(ids); + } + + /** + * Returns {@code n} previously unused transform feedback object names in {@code ids}, each representing a new state vector. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateTransformFeedbacks() { + return GL45C.glCreateTransformFeedbacks(); + } + + // --- [ glTransformFeedbackBufferBase ] --- + + /** + * Binds a buffer object to a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param index the transform feedback stream index + * @param buffer the name of an existing buffer object + * + * @see Reference Page + */ + public static void glTransformFeedbackBufferBase(@NativeType("GLuint") int xfb, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer) { + GL45C.glTransformFeedbackBufferBase(xfb, index, buffer); + } + + // --- [ glTransformFeedbackBufferRange ] --- + + /** + * Binds a region of a buffer object to a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param index the transform feedback stream index + * @param buffer the name of an existing buffer object + * @param offset the starting offset in basic machine units into the buffer object + * @param size the amount of data in machine units + * + * @see Reference Page + */ + public static void glTransformFeedbackBufferRange(@NativeType("GLuint") int xfb, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size) { + GL45C.glTransformFeedbackBufferRange(xfb, index, buffer, offset, size); + } + + // --- [ glGetTransformFeedbackiv ] --- + + /** Unsafe version of: {@link #glGetTransformFeedbackiv GetTransformFeedbackiv} */ + public static void nglGetTransformFeedbackiv(int xfb, int pname, long param) { + GL45C.nglGetTransformFeedbackiv(xfb, pname, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL42#GL_TRANSFORM_FEEDBACK_PAUSED TRANSFORM_FEEDBACK_PAUSED}{@link GL42#GL_TRANSFORM_FEEDBACK_ACTIVE TRANSFORM_FEEDBACK_ACTIVE}
    + * @param param the buffer in which to return the parameter value + * + * @see Reference Page + */ + public static void glGetTransformFeedbackiv(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + GL45C.glGetTransformFeedbackiv(xfb, pname, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL42#GL_TRANSFORM_FEEDBACK_PAUSED TRANSFORM_FEEDBACK_PAUSED}{@link GL42#GL_TRANSFORM_FEEDBACK_ACTIVE TRANSFORM_FEEDBACK_ACTIVE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTransformFeedbacki(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname) { + return GL45C.glGetTransformFeedbacki(xfb, pname); + } + + // --- [ glGetTransformFeedbacki_v ] --- + + /** Unsafe version of: {@link #glGetTransformFeedbacki_v GetTransformFeedbacki_v} */ + public static void nglGetTransformFeedbacki_v(int xfb, int pname, int index, long param) { + GL45C.nglGetTransformFeedbacki_v(xfb, pname, index, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. Must be:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_BINDING TRANSFORM_FEEDBACK_BUFFER_BINDING}
    + * @param index the transform feedback stream index + * @param param the buffer in which to return the parameter value + * + * @see Reference Page + */ + public static void glGetTransformFeedbacki_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer param) { + GL45C.glGetTransformFeedbacki_v(xfb, pname, index, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. Must be:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_BINDING TRANSFORM_FEEDBACK_BUFFER_BINDING}
    + * @param index the transform feedback stream index + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTransformFeedbacki(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + return GL45C.glGetTransformFeedbacki(xfb, pname, index); + } + + // --- [ glGetTransformFeedbacki64_v ] --- + + /** Unsafe version of: {@link #glGetTransformFeedbacki64_v GetTransformFeedbacki64_v} */ + public static void nglGetTransformFeedbacki64_v(int xfb, int pname, int index, long param) { + GL45C.nglGetTransformFeedbacki64_v(xfb, pname, index, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_START TRANSFORM_FEEDBACK_BUFFER_START}{@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_SIZE TRANSFORM_FEEDBACK_BUFFER_SIZE}
    + * @param index the transform feedback stream index + * @param param the buffer in which to return the parameter value + * + * @see Reference Page + */ + public static void glGetTransformFeedbacki64_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint64 *") LongBuffer param) { + GL45C.glGetTransformFeedbacki64_v(xfb, pname, index, param); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_START TRANSFORM_FEEDBACK_BUFFER_START}{@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_SIZE TRANSFORM_FEEDBACK_BUFFER_SIZE}
    + * @param index the transform feedback stream index + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetTransformFeedbacki64(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + return GL45C.glGetTransformFeedbacki64(xfb, pname, index); + } + + // --- [ glCreateBuffers ] --- + + /** + * Unsafe version of: {@link #glCreateBuffers CreateBuffers} + * + * @param n the number of buffer names to create + */ + public static void nglCreateBuffers(int n, long buffers) { + GL45C.nglCreateBuffers(n, buffers); + } + + /** + * Returns {@code n} previously unused buffer names in {@code buffers}, each representing a new buffer object initialized as if it had been bound to an + * unspecified target. + * + * @param buffers the buffer in which to return the names + * + * @see Reference Page + */ + public static void glCreateBuffers(@NativeType("GLuint *") IntBuffer buffers) { + GL45C.glCreateBuffers(buffers); + } + + /** + * Returns {@code n} previously unused buffer names in {@code buffers}, each representing a new buffer object initialized as if it had been bound to an + * unspecified target. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateBuffers() { + return GL45C.glCreateBuffers(); + } + + // --- [ glNamedBufferStorage ] --- + + /** + * Unsafe version of: {@link #glNamedBufferStorage NamedBufferStorage} + * + * @param size the size of the data store in basic machine units + */ + public static void nglNamedBufferStorage(int buffer, long size, long data, int flags) { + GL45C.nglNamedBufferStorage(buffer, size, data, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param size the size of the data store in basic machine units + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("GLsizeiptr") long size, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, size, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") ByteBuffer data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") ShortBuffer data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") IntBuffer data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") FloatBuffer data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") DoubleBuffer data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + // --- [ glNamedBufferData ] --- + + /** + * Unsafe version of: {@link #glNamedBufferData NamedBufferData} + * + * @param size the size in bytes of the buffer object's new data store + */ + public static void nglNamedBufferData(int buffer, long size, long data, int usage) { + GL45C.nglNamedBufferData(buffer, size, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param size the size in bytes of the buffer object's new data store + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, size, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") ByteBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") ShortBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") IntBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") LongBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") FloatBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") DoubleBuffer data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + // --- [ glNamedBufferSubData ] --- + + /** + * Unsafe version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @param size the size in bytes of the data store region being replaced + */ + public static void nglNamedBufferSubData(int buffer, long offset, long size, long data) { + GL45C.nglNamedBufferSubData(buffer, offset, size, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") ByteBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") ShortBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") IntBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") LongBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") FloatBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") DoubleBuffer data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + // --- [ glCopyNamedBufferSubData ] --- + + /** + * DSA version of {@link GL31C#glCopyBufferSubData CopyBufferSubData}. + * + * @param readBuffer the source buffer object name + * @param writeBuffer the destination buffer object name + * @param readOffset the source buffer object offset, in bytes + * @param writeOffset the destination buffer object offset, in bytes + * @param size the number of bytes to copy + * + * @see Reference Page + */ + public static void glCopyNamedBufferSubData(@NativeType("GLuint") int readBuffer, @NativeType("GLuint") int writeBuffer, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size) { + GL45C.glCopyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size); + } + + // --- [ glClearNamedBufferData ] --- + + /** Unsafe version of: {@link #glClearNamedBufferData ClearNamedBufferData} */ + public static void nglClearNamedBufferData(int buffer, int internalformat, int format, int type, long data) { + GL45C.nglClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + // --- [ glClearNamedBufferSubData ] --- + + /** Unsafe version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} */ + public static void nglClearNamedBufferSubData(int buffer, int internalformat, long offset, long size, int format, int type, long data) { + GL45C.nglClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + // --- [ glMapNamedBuffer ] --- + + /** Unsafe version of: {@link #glMapNamedBuffer MapNamedBuffer} */ + public static long nglMapNamedBuffer(int buffer, int access) { + return GL45C.nglMapNamedBuffer(buffer, access); + } + + /** + * DSA version of {@link GL15C#glMapBuffer MapBuffer}. + * + * @param buffer the buffer object name + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15#GL_READ_ONLY READ_ONLY}{@link GL15#GL_WRITE_ONLY WRITE_ONLY}{@link GL15#GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBuffer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access) { + return GL45C.glMapNamedBuffer(buffer, access); + } + + /** + * DSA version of {@link GL15C#glMapBuffer MapBuffer}. + * + * @param buffer the buffer object name + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15#GL_READ_ONLY READ_ONLY}{@link GL15#GL_WRITE_ONLY WRITE_ONLY}{@link GL15#GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBuffer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access, @Nullable ByteBuffer old_buffer) { + return GL45C.glMapNamedBuffer(buffer, access, old_buffer); + } + + /** + * DSA version of {@link GL15C#glMapBuffer MapBuffer}. + * + * @param buffer the buffer object name + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15#GL_READ_ONLY READ_ONLY}{@link GL15#GL_WRITE_ONLY WRITE_ONLY}{@link GL15#GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBuffer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access, long length, @Nullable ByteBuffer old_buffer) { + return GL45C.glMapNamedBuffer(buffer, access, length, old_buffer); + } + + // --- [ glMapNamedBufferRange ] --- + + /** Unsafe version of: {@link #glMapNamedBufferRange MapNamedBufferRange} */ + public static long nglMapNamedBufferRange(int buffer, long offset, long length, int access) { + return GL45C.nglMapNamedBufferRange(buffer, offset, length, access); + } + + /** + * DSA version of {@link GL30C#glMapBufferRange MapBufferRange}. + * + * @param buffer the buffer object name + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link GL30#GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link GL30#GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link GL30#GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link GL30#GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBufferRange(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access) { + return GL45C.glMapNamedBufferRange(buffer, offset, length, access); + } + + /** + * DSA version of {@link GL30C#glMapBufferRange MapBufferRange}. + * + * @param buffer the buffer object name + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link GL30#GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link GL30#GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link GL30#GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link GL30#GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBufferRange(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access, @Nullable ByteBuffer old_buffer) { + return GL45C.glMapNamedBufferRange(buffer, offset, length, access, old_buffer); + } + + // --- [ glUnmapNamedBuffer ] --- + + /** + * DSA version of {@link GL15C#glUnmapBuffer UnmapBuffer}. + * + * @param buffer the buffer object name + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static boolean glUnmapNamedBuffer(@NativeType("GLuint") int buffer) { + return GL45C.glUnmapNamedBuffer(buffer); + } + + // --- [ glFlushMappedNamedBufferRange ] --- + + /** + * DSA version of {@link GL30C#glFlushMappedBufferRange FlushMappedBufferRange}. + * + * @param buffer the buffer object name + * @param offset the start of the buffer subrange, in basic machine units + * @param length the length of the buffer subrange, in basic machine units + * + * @see Reference Page + */ + public static void glFlushMappedNamedBufferRange(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length) { + GL45C.glFlushMappedNamedBufferRange(buffer, offset, length); + } + + // --- [ glGetNamedBufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedBufferParameteriv GetNamedBufferParameteriv} */ + public static void nglGetNamedBufferParameteriv(int buffer, int pname, long params) { + GL45C.nglGetNamedBufferParameteriv(buffer, pname, params); + } + + /** + * DSA version of {@link GL15C#glGetBufferParameteriv GetBufferParameteriv}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * @param params the requested parameter + * + * @see Reference Page + */ + public static void glGetNamedBufferParameteriv(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetNamedBufferParameteriv(buffer, pname, params); + } + + /** + * DSA version of {@link GL15C#glGetBufferParameteriv GetBufferParameteriv}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetNamedBufferParameteri(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedBufferParameteri(buffer, pname); + } + + // --- [ glGetNamedBufferParameteri64v ] --- + + /** Unsafe version of: {@link #glGetNamedBufferParameteri64v GetNamedBufferParameteri64v} */ + public static void nglGetNamedBufferParameteri64v(int buffer, int pname, long params) { + GL45C.nglGetNamedBufferParameteri64v(buffer, pname, params); + } + + /** + * DSA version of {@link GL32C#glGetBufferParameteri64v GetBufferParameteri64v}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * @param params the requested parameter + * + * @see Reference Page + */ + public static void glGetNamedBufferParameteri64v(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + GL45C.glGetNamedBufferParameteri64v(buffer, pname, params); + } + + /** + * DSA version of {@link GL32C#glGetBufferParameteri64v GetBufferParameteri64v}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetNamedBufferParameteri64(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedBufferParameteri64(buffer, pname); + } + + // --- [ glGetNamedBufferPointerv ] --- + + /** Unsafe version of: {@link #glGetNamedBufferPointerv GetNamedBufferPointerv} */ + public static void nglGetNamedBufferPointerv(int buffer, int pname, long params) { + GL45C.nglGetNamedBufferPointerv(buffer, pname, params); + } + + /** + * DSA version of {@link GL15C#glGetBufferPointerv GetBufferPointerv}. + * + * @param buffer the buffer object name + * @param pname the pointer to be returned. Must be:
    {@link GL15#GL_BUFFER_MAP_POINTER BUFFER_MAP_POINTER}
    + * @param params the pointer value specified by {@code pname} + * + * @see Reference Page + */ + public static void glGetNamedBufferPointerv(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer params) { + GL45C.glGetNamedBufferPointerv(buffer, pname, params); + } + + /** + * DSA version of {@link GL15C#glGetBufferPointerv GetBufferPointerv}. + * + * @param buffer the buffer object name + * @param pname the pointer to be returned. Must be:
    {@link GL15#GL_BUFFER_MAP_POINTER BUFFER_MAP_POINTER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetNamedBufferPointer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedBufferPointer(buffer, pname); + } + + // --- [ glGetNamedBufferSubData ] --- + + /** + * Unsafe version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @param size the size in bytes of the data store region being returned + */ + public static void nglGetNamedBufferSubData(int buffer, long offset, long size, long data) { + GL45C.nglGetNamedBufferSubData(buffer, offset, size, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") ByteBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") ShortBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") IntBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") LongBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") FloatBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") DoubleBuffer data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + // --- [ glCreateFramebuffers ] --- + + /** + * Unsafe version of: {@link #glCreateFramebuffers CreateFramebuffers} + * + * @param n the number of framebuffer names to create + */ + public static void nglCreateFramebuffers(int n, long framebuffers) { + GL45C.nglCreateFramebuffers(n, framebuffers); + } + + /** + * Returns {@code n} previously unused framebuffer names in {@code framebuffers}, each representing a new framebuffer object. + * + * @param framebuffers the buffer in which to store the framebuffer names + * + * @see Reference Page + */ + public static void glCreateFramebuffers(@NativeType("GLuint *") IntBuffer framebuffers) { + GL45C.glCreateFramebuffers(framebuffers); + } + + /** + * Returns {@code n} previously unused framebuffer names in {@code framebuffers}, each representing a new framebuffer object. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateFramebuffers() { + return GL45C.glCreateFramebuffers(); + } + + // --- [ glNamedFramebufferRenderbuffer ] --- + + /** + * DSA version of {@link GL30C#glFramebufferRenderbuffer FramebufferRenderbuffer}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param renderbuffertarget the renderbuffer target. Must be:
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}
    + * @param renderbuffer the name of an existing renderbuffer object of type {@code renderbuffertarget} to attach + * + * @see Reference Page + */ + public static void glNamedFramebufferRenderbuffer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int renderbuffertarget, @NativeType("GLuint") int renderbuffer) { + GL45C.glNamedFramebufferRenderbuffer(framebuffer, attachment, renderbuffertarget, renderbuffer); + } + + // --- [ glNamedFramebufferParameteri ] --- + + /** + * DSA version of {@link GL43C#glFramebufferParameteri FramebufferParameteri}. + * + * @param framebuffer the framebuffer name + * @param pname a token indicating the parameter to be modified. One of:
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param param the new value for the parameter named {@code pname} + * + * @see Reference Page + */ + public static void glNamedFramebufferParameteri(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint") int param) { + GL45C.glNamedFramebufferParameteri(framebuffer, pname, param); + } + + // --- [ glNamedFramebufferTexture ] --- + + /** + * DSA version of {@link GL32C#glFramebufferTexture FramebufferTexture}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment point of the framebuffer + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * + * @see Reference Page + */ + public static void glNamedFramebufferTexture(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level) { + GL45C.glNamedFramebufferTexture(framebuffer, attachment, texture, level); + } + + // --- [ glNamedFramebufferTextureLayer ] --- + + /** + * DSA version of {@link GL30C#glFramebufferTextureLayer FramebufferTextureLayer}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * @param layer the layer of {@code texture} to attach. + * + * @see Reference Page + */ + public static void glNamedFramebufferTextureLayer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer) { + GL45C.glNamedFramebufferTextureLayer(framebuffer, attachment, texture, level, layer); + } + + // --- [ glNamedFramebufferDrawBuffer ] --- + + /** + * DSA version of {@link GL11C#glDrawBuffer DrawBuffer}. + * + * @param framebuffer the framebuffer name + * @param buf the color buffer to draw to. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_LEFT LEFT}
    {@link GL11#GL_RIGHT RIGHT}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static void glNamedFramebufferDrawBuffer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buf) { + GL45C.glNamedFramebufferDrawBuffer(framebuffer, buf); + } + + // --- [ glNamedFramebufferDrawBuffers ] --- + + /** + * Unsafe version of: {@link #glNamedFramebufferDrawBuffers NamedFramebufferDrawBuffers} + * + * @param n the number of buffers in {@code bufs} + */ + public static void nglNamedFramebufferDrawBuffers(int framebuffer, int n, long bufs) { + GL45C.nglNamedFramebufferDrawBuffers(framebuffer, n, bufs); + } + + /** + * DSA version of {@link GL20C#glDrawBuffers DrawBuffers}. + * + * @param framebuffer the framebuffer name + * @param bufs an array of symbolic constants specifying the buffers into which fragment colors or data values will be written. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}
    GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static void glNamedFramebufferDrawBuffers(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") IntBuffer bufs) { + GL45C.glNamedFramebufferDrawBuffers(framebuffer, bufs); + } + + /** + * DSA version of {@link GL20C#glDrawBuffers DrawBuffers}. + * + * @param framebuffer the framebuffer name + * + * @see Reference Page + */ + public static void glNamedFramebufferDrawBuffers(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int buf) { + GL45C.glNamedFramebufferDrawBuffers(framebuffer, buf); + } + + // --- [ glNamedFramebufferReadBuffer ] --- + + /** + * DSA version of {@link GL11C#glReadBuffer ReadBuffer}. + * + * @param framebuffer the framebuffer name + * @param src the color buffer to read from. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_LEFT LEFT}
    {@link GL11#GL_RIGHT RIGHT}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static void glNamedFramebufferReadBuffer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int src) { + GL45C.glNamedFramebufferReadBuffer(framebuffer, src); + } + + // --- [ glInvalidateNamedFramebufferData ] --- + + /** + * Unsafe version of: {@link #glInvalidateNamedFramebufferData InvalidateNamedFramebufferData} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static void nglInvalidateNamedFramebufferData(int framebuffer, int numAttachments, long attachments) { + GL45C.nglInvalidateNamedFramebufferData(framebuffer, numAttachments, attachments); + } + + /** + * DSA version of {@link GL43C#glInvalidateFramebuffer InvalidateFramebuffer}. + * + * @param framebuffer the framebuffer name + * @param attachments the address of an array identifying the attachments to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") IntBuffer attachments) { + GL45C.glInvalidateNamedFramebufferData(framebuffer, attachments); + } + + /** + * DSA version of {@link GL43C#glInvalidateFramebuffer InvalidateFramebuffer}. + * + * @param framebuffer the framebuffer name + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int attachment) { + GL45C.glInvalidateNamedFramebufferData(framebuffer, attachment); + } + + // --- [ glInvalidateNamedFramebufferSubData ] --- + + /** + * Unsafe version of: {@link #glInvalidateNamedFramebufferSubData InvalidateNamedFramebufferSubData} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static void nglInvalidateNamedFramebufferSubData(int framebuffer, int numAttachments, long attachments, int x, int y, int width, int height) { + GL45C.nglInvalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, x, y, width, height); + } + + /** + * DSA version of {@link GL43C#glInvalidateSubFramebuffer InvalidateSubFramebuffer}. + * + * @param framebuffer the framebuffer name + * @param attachments an array identifying the attachments to be invalidated + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferSubData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") IntBuffer attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glInvalidateNamedFramebufferSubData(framebuffer, attachments, x, y, width, height); + } + + /** + * DSA version of {@link GL43C#glInvalidateSubFramebuffer InvalidateSubFramebuffer}. + * + * @param framebuffer the framebuffer name + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferSubData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int attachment, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glInvalidateNamedFramebufferSubData(framebuffer, attachment, x, y, width, height); + } + + // --- [ glClearNamedFramebufferiv ] --- + + /** Unsafe version of: {@link #glClearNamedFramebufferiv ClearNamedFramebufferiv} */ + public static void nglClearNamedFramebufferiv(int framebuffer, int buffer, int drawbuffer, long value) { + GL45C.nglClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); + } + + /** + * DSA version of {@link GL30C#glClearBufferiv ClearBufferiv}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. One of:
    {@link GL11#GL_COLOR COLOR}{@link GL11#GL_STENCIL STENCIL}
    + * @param drawbuffer the draw buffer to clear + * @param value for color buffers, a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to. For stencil buffers, a pointer to a + * single stencil value to clear the buffer to. + * + * @see Reference Page + */ + public static void glClearNamedFramebufferiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") IntBuffer value) { + GL45C.glClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); + } + + // --- [ glClearNamedFramebufferuiv ] --- + + /** Unsafe version of: {@link #glClearNamedFramebufferuiv ClearNamedFramebufferuiv} */ + public static void nglClearNamedFramebufferuiv(int framebuffer, int buffer, int drawbuffer, long value) { + GL45C.nglClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); + } + + /** + * DSA version of {@link GL30C#glClearBufferuiv ClearBufferuiv}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. Must be:
    {@link GL11#GL_COLOR COLOR}
    + * @param drawbuffer the draw buffer to clear + * @param value a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to + * + * @see Reference Page + */ + public static void glClearNamedFramebufferuiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") IntBuffer value) { + GL45C.glClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); + } + + // --- [ glClearNamedFramebufferfv ] --- + + /** Unsafe version of: {@link #glClearNamedFramebufferfv ClearNamedFramebufferfv} */ + public static void nglClearNamedFramebufferfv(int framebuffer, int buffer, int drawbuffer, long value) { + GL45C.nglClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); + } + + /** + * DSA version of {@link GL30C#glClearBufferfv ClearBufferfv}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. One of:
    {@link GL11#GL_COLOR COLOR}{@link GL11#GL_DEPTH DEPTH}
    + * @param drawbuffer the draw buffer to clear + * @param value for color buffers, a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to. For depth buffers, a pointer to a + * single depth value to clear the buffer to. + * + * @see Reference Page + */ + public static void glClearNamedFramebufferfv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat const *") FloatBuffer value) { + GL45C.glClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); + } + + // --- [ glClearNamedFramebufferfi ] --- + + /** + * DSA version of {@link GL30C#glClearBufferfi ClearBufferfi}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. Must be:
    {@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param drawbuffer the draw buffer to clear + * @param depth the depth value to clear the buffer to + * @param stencil the stencil value to clear the buffer to + * + * @see Reference Page + */ + public static void glClearNamedFramebufferfi(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat") float depth, @NativeType("GLint") int stencil) { + GL45C.glClearNamedFramebufferfi(framebuffer, buffer, drawbuffer, depth, stencil); + } + + // --- [ glBlitNamedFramebuffer ] --- + + /** + * DSA version of {@link GL30C#glBlitFramebuffer BlitFramebuffer}. + * + * @param readFramebuffer the source framebuffer name + * @param drawFramebuffer the destination framebuffer name + * @param srcX0 the lower-left coordinate of the source rectangle within the read buffer + * @param srcY0 the upper-left coordinate of the source rectangle within the read buffer + * @param srcX1 the lower-right coordinate of the source rectangle within the read buffer + * @param srcY1 the upper-right coordinate of the source rectangle within the read buffer + * @param dstX0 the lower-left coordinate of the destination rectangle within the write buffer + * @param dstY0 the upper-left coordinate of the destination rectangle within the write buffer + * @param dstX1 the lower-right coordinate of the destination rectangle within the write buffer + * @param dstY1 the upper-right coordinate of the destination rectangle within the write buffer + * @param mask the bitwise OR of the flags indicating which buffers are to be copied. One of:
    {@link GL11#GL_COLOR_BUFFER_BIT COLOR_BUFFER_BIT}{@link GL11#GL_DEPTH_BUFFER_BIT DEPTH_BUFFER_BIT}{@link GL11#GL_STENCIL_BUFFER_BIT STENCIL_BUFFER_BIT}
    + * @param filter the interpolation to be applied if the image is stretched. One of:
    {@link GL11#GL_NEAREST NEAREST}{@link GL11#GL_LINEAR LINEAR}
    + * + * @see Reference Page + */ + public static void glBlitNamedFramebuffer(@NativeType("GLuint") int readFramebuffer, @NativeType("GLuint") int drawFramebuffer, @NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter) { + GL45C.glBlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + } + + // --- [ glCheckNamedFramebufferStatus ] --- + + /** + * DSA version of {@link GL30C#glCheckFramebufferStatus CheckFramebufferStatus}. + * + * @param framebuffer the framebuffer name + * @param target the target of the framebuffer completeness check. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * + * @see Reference Page + */ + @NativeType("GLenum") + public static int glCheckNamedFramebufferStatus(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int target) { + return GL45C.glCheckNamedFramebufferStatus(framebuffer, target); + } + + // --- [ glGetNamedFramebufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedFramebufferParameteriv GetNamedFramebufferParameteriv} */ + public static void nglGetNamedFramebufferParameteriv(int framebuffer, int pname, long params) { + GL45C.nglGetNamedFramebufferParameteriv(framebuffer, pname, params); + } + + /** + * DSA version of {@link GL43C#glGetFramebufferParameteriv GetFramebufferParameteriv}. + * + * @param framebuffer the framebuffer name + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param params a variable to receive the value of the parameter named {@code pname} + * + * @see Reference Page + */ + public static void glGetNamedFramebufferParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetNamedFramebufferParameteriv(framebuffer, pname, params); + } + + /** + * DSA version of {@link GL43C#glGetFramebufferParameteriv GetFramebufferParameteriv}. + * + * @param framebuffer the framebuffer name + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetNamedFramebufferParameteri(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedFramebufferParameteri(framebuffer, pname); + } + + // --- [ glGetNamedFramebufferAttachmentParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedFramebufferAttachmentParameteriv GetNamedFramebufferAttachmentParameteriv} */ + public static void nglGetNamedFramebufferAttachmentParameteriv(int framebuffer, int attachment, int pname, long params) { + GL45C.nglGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment within {@code target}. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + * @param params an array to receive the value of the queried parameter + * + * @see Reference Page + */ + public static void glGetNamedFramebufferAttachmentParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment within {@code target}. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetNamedFramebufferAttachmentParameteri(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedFramebufferAttachmentParameteri(framebuffer, attachment, pname); + } + + // --- [ glCreateRenderbuffers ] --- + + /** + * Unsafe version of: {@link #glCreateRenderbuffers CreateRenderbuffers} + * + * @param n the number of renderbuffer names to create + */ + public static void nglCreateRenderbuffers(int n, long renderbuffers) { + GL45C.nglCreateRenderbuffers(n, renderbuffers); + } + + /** + * Returns {@code n} previously unused renderbuffer names in {@code renderbuffers}, each representing a new renderbuffer object. + * + * @param renderbuffers the buffer in which to store the created renderbuffer names + * + * @see Reference Page + */ + public static void glCreateRenderbuffers(@NativeType("GLuint *") IntBuffer renderbuffers) { + GL45C.glCreateRenderbuffers(renderbuffers); + } + + /** + * Returns {@code n} previously unused renderbuffer names in {@code renderbuffers}, each representing a new renderbuffer object. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateRenderbuffers() { + return GL45C.glCreateRenderbuffers(); + } + + // --- [ glNamedRenderbufferStorage ] --- + + /** + * DSA version of {@link GL30C#glRenderbufferStorage RenderbufferStorage}. + * + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + * + * @see Reference Page + */ + public static void glNamedRenderbufferStorage(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glNamedRenderbufferStorage(renderbuffer, internalformat, width, height); + } + + // --- [ glNamedRenderbufferStorageMultisample ] --- + + /** + * DSA version of {@link GL30C#glRenderbufferStorageMultisample RenderbufferStorageMultisample}. + * + * @param samples the number of samples to be used for the renderbuffer object's storage + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + * + * @see Reference Page + */ + public static void glNamedRenderbufferStorageMultisample(@NativeType("GLuint") int renderbuffer, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glNamedRenderbufferStorageMultisample(renderbuffer, samples, internalformat, width, height); + } + + // --- [ glGetNamedRenderbufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedRenderbufferParameteriv GetNamedRenderbufferParameteriv} */ + public static void nglGetNamedRenderbufferParameteriv(int renderbuffer, int pname, long params) { + GL45C.nglGetNamedRenderbufferParameteriv(renderbuffer, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetRenderbufferParameteriv GetRenderbufferParameteriv}. + * + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link GL30#GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link GL30#GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link GL30#GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link GL30#GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link GL30#GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link GL30#GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link GL30#GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link GL30#GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link GL30#GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link GL30#GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + * @param params an array to receive the value of the queried parameter + * + * @see Reference Page + */ + public static void glGetNamedRenderbufferParameteriv(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetNamedRenderbufferParameteriv(renderbuffer, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetRenderbufferParameteriv GetRenderbufferParameteriv}. + * + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link GL30#GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link GL30#GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link GL30#GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link GL30#GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link GL30#GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link GL30#GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link GL30#GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link GL30#GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link GL30#GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link GL30#GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetNamedRenderbufferParameteri(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname) { + return GL45C.glGetNamedRenderbufferParameteri(renderbuffer, pname); + } + + // --- [ glCreateTextures ] --- + + /** + * Unsafe version of: {@link #glCreateTextures CreateTextures} + * + * @param n the number of texture names to create + */ + public static void nglCreateTextures(int target, int n, long textures) { + GL45C.nglCreateTextures(target, n, textures); + } + + /** + * Returns {@code n} previously unused texture names in {@code textures}, each representing a new texture object. + * + * @param target the texture target. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param textures the buffer in which to store the created texture names + * + * @see Reference Page + */ + public static void glCreateTextures(@NativeType("GLenum") int target, @NativeType("GLuint *") IntBuffer textures) { + GL45C.glCreateTextures(target, textures); + } + + /** + * Returns {@code n} previously unused texture names in {@code textures}, each representing a new texture object. + * + * @param target the texture target. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateTextures(@NativeType("GLenum") int target) { + return GL45C.glCreateTextures(target); + } + + // --- [ glTextureBuffer ] --- + + /** + * DSA version of {@link GL31C#glTexBuffer TexBuffer}. + * + * @param texture the texture name + * @param internalformat the sized internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + * + * @see Reference Page + */ + public static void glTextureBuffer(@NativeType("GLuint") int texture, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer) { + GL45C.glTextureBuffer(texture, internalformat, buffer); + } + + // --- [ glTextureBufferRange ] --- + + /** + * DSA version of {@link GL43C#glTexBufferRange TexBufferRange}. + * + * @param texture the texture name + * @param internalformat the internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + * @param offset the offset of the start of the range of the buffer's data store to attach + * @param size the size of the range of the buffer's data store to attach + * + * @see Reference Page + */ + public static void glTextureBufferRange(@NativeType("GLuint") int texture, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size) { + GL45C.glTextureBufferRange(texture, internalformat, buffer, offset, size); + } + + // --- [ glTextureStorage1D ] --- + + /** + * DSA version of {@link GL42C#glTexStorage1D TexStorage1D}. + * + * @param texture the texture name + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * + * @see Reference Page + */ + public static void glTextureStorage1D(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width) { + GL45C.glTextureStorage1D(texture, levels, internalformat, width); + } + + // --- [ glTextureStorage2D ] --- + + /** + * DSA version of {@link GL42C#glTexStorage2D TexStorage2D}. + * + * @param texture the texture name + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * + * @see Reference Page + */ + public static void glTextureStorage2D(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glTextureStorage2D(texture, levels, internalformat, width, height); + } + + // --- [ glTextureStorage3D ] --- + + /** + * DSA version of {@link GL42C#glTexStorage3D TexStorage3D}. + * + * @param texture the texture name + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + * + * @see Reference Page + */ + public static void glTextureStorage3D(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth) { + GL45C.glTextureStorage3D(texture, levels, internalformat, width, height, depth); + } + + // --- [ glTextureStorage2DMultisample ] --- + + /** + * DSA version of {@link GL43C#glTexStorage2DMultisample TexStorage2DMultisample}. + * + * @param texture the texture name + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static void glTextureStorage2DMultisample(@NativeType("GLuint") int texture, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL45C.glTextureStorage2DMultisample(texture, samples, internalformat, width, height, fixedsamplelocations); + } + + // --- [ glTextureStorage3DMultisample ] --- + + /** + * DSA version of {@link GL43C#glTexStorage3DMultisample TexStorage3DMultisample}. + * + * @param texture the texture name + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static void glTextureStorage3DMultisample(@NativeType("GLuint") int texture, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedsamplelocations) { + GL45C.glTextureStorage3DMultisample(texture, samples, internalformat, width, height, depth, fixedsamplelocations); + } + + // --- [ glTextureSubImage1D ] --- + + /** Unsafe version of: {@link #glTextureSubImage1D TextureSubImage1D} */ + public static void nglTextureSubImage1D(int texture, int level, int xoffset, int width, int format, int type, long pixels) { + GL45C.nglTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + // --- [ glTextureSubImage2D ] --- + + /** Unsafe version of: {@link #glTextureSubImage2D TextureSubImage2D} */ + public static void nglTextureSubImage2D(int texture, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels) { + GL45C.nglTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + // --- [ glTextureSubImage3D ] --- + + /** Unsafe version of: {@link #glTextureSubImage3D TextureSubImage3D} */ + public static void nglTextureSubImage3D(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels) { + GL45C.nglTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + // --- [ glCompressedTextureSubImage1D ] --- + + /** + * Unsafe version of: {@link #glCompressedTextureSubImage1D CompressedTextureSubImage1D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTextureSubImage1D(int texture, int level, int xoffset, int width, int format, int imageSize, long data) { + GL45C.nglCompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage1D CompressedTexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL45C.glCompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage1D CompressedTexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + GL45C.glCompressedTextureSubImage1D(texture, level, xoffset, width, format, data); + } + + // --- [ glCompressedTextureSubImage2D ] --- + + /** + * Unsafe version of: {@link #glCompressedTextureSubImage2D CompressedTextureSubImage2D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTextureSubImage2D(int texture, int level, int xoffset, int yoffset, int width, int height, int format, int imageSize, long data) { + GL45C.nglCompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage2D CompressedTexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL45C.glCompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage2D CompressedTexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + GL45C.glCompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, data); + } + + // --- [ glCompressedTextureSubImage3D ] --- + + /** + * Unsafe version of: {@link #glCompressedTextureSubImage3D CompressedTextureSubImage3D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static void nglCompressedTextureSubImage3D(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, long data) { + GL45C.nglCompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage3D CompressedTexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + GL45C.glCompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage3D CompressedTexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + GL45C.glCompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, data); + } + + // --- [ glCopyTextureSubImage1D ] --- + + /** + * DSA version of {@link GL11C#glCopyTexSubImage1D CopyTexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param xoffset the left texel coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * + * @see Reference Page + */ + public static void glCopyTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width) { + GL45C.glCopyTextureSubImage1D(texture, level, xoffset, x, y, width); + } + + // --- [ glCopyTextureSubImage2D ] --- + + /** + * DSA version of {@link GL11C#glCopyTexSubImage2D CopyTexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param xoffset the left texel coordinate of the texture subregion to update + * @param yoffset the lower texel coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * @param height the texture subregion height + * + * @see Reference Page + */ + public static void glCopyTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glCopyTextureSubImage2D(texture, level, xoffset, yoffset, x, y, width, height); + } + + // --- [ glCopyTextureSubImage3D ] --- + + /** + * DSA version of {@link GL12C#glCopyTexSubImage3D CopyTexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param xoffset the x coordinate of the texture subregion to update + * @param yoffset the y coordinate of the texture subregion to update + * @param zoffset the z coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * @param height the texture subregion height + * + * @see Reference Page + */ + public static void glCopyTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glCopyTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, x, y, width, height); + } + + // --- [ glTextureParameterf ] --- + + /** + * DSA version of {@link GL11C#glTexParameterf TexParameterf}. + * + * @param texture the texture name + * @param pname the parameter to set + * @param param the parameter value + * + * @see Reference Page + */ + public static void glTextureParameterf(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param) { + GL45C.glTextureParameterf(texture, pname, param); + } + + // --- [ glTextureParameterfv ] --- + + /** Unsafe version of: {@link #glTextureParameterfv TextureParameterfv} */ + public static void nglTextureParameterfv(int texture, int pname, long params) { + GL45C.nglTextureParameterfv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glTexParameterfv TexParameterfv}. + * + * @param texture the texture name + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + GL45C.glTextureParameterfv(texture, pname, params); + } + + // --- [ glTextureParameteri ] --- + + /** + * DSA version of {@link GL11C#glTexParameteri TexParameteri}. + * + * @param texture the texture name + * @param pname the parameter to set. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    + * @param param the parameter value + * + * @see Reference Page + */ + public static void glTextureParameteri(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint") int param) { + GL45C.glTextureParameteri(texture, pname, param); + } + + // --- [ glTextureParameterIiv ] --- + + /** Unsafe version of: {@link #glTextureParameterIiv TextureParameterIiv} */ + public static void nglTextureParameterIiv(int texture, int pname, long params) { + GL45C.nglTextureParameterIiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glTexParameterIiv TexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + * @param params the value of {@code pname} + * + * @see Reference Page + */ + public static void glTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + GL45C.glTextureParameterIiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glTexParameterIiv TexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + * + * @see Reference Page + */ + public static void glTextureParameterIi(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") int param) { + GL45C.glTextureParameterIi(texture, pname, param); + } + + // --- [ glTextureParameterIuiv ] --- + + /** Unsafe version of: {@link #glTextureParameterIuiv TextureParameterIuiv} */ + public static void nglTextureParameterIuiv(int texture, int pname, long params) { + GL45C.nglTextureParameterIuiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glTexParameterIuiv TexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + * @param params the value of {@code pname} + * + * @see Reference Page + */ + public static void glTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint const *") IntBuffer params) { + GL45C.glTextureParameterIuiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glTexParameterIuiv TexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + * + * @see Reference Page + */ + public static void glTextureParameterIui(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int param) { + GL45C.glTextureParameterIui(texture, pname, param); + } + + // --- [ glTextureParameteriv ] --- + + /** Unsafe version of: {@link #glTextureParameteriv TextureParameteriv} */ + public static void nglTextureParameteriv(int texture, int pname, long params) { + GL45C.nglTextureParameteriv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glTexParameteriv TexParameteriv}. + * + * @param texture the texture name + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + GL45C.glTextureParameteriv(texture, pname, params); + } + + // --- [ glGenerateTextureMipmap ] --- + + /** + * DSA version of {@link GL30C#glGenerateMipmap GenerateMipmap}. + * + * @param texture the texture name + * + * @see Reference Page + */ + public static void glGenerateTextureMipmap(@NativeType("GLuint") int texture) { + GL45C.glGenerateTextureMipmap(texture); + } + + // --- [ glBindTextureUnit ] --- + + /** + * Binds an existing texture object to the texture unit numbered {@code unit}. + * + *

    {@code texture} must be zero or the name of an existing texture object. When {@code texture} is the name of an existing texture object, that object is + * bound to the target, in the corresponding texture unit, that was specified when the object was created. When {@code texture} is zero, each of the targets + * enumerated at the beginning of this section is reset to its default texture for the corresponding texture image unit.

    + * + * @param unit the texture unit number + * @param texture the texture name + * + * @see Reference Page + */ + public static void glBindTextureUnit(@NativeType("GLuint") int unit, @NativeType("GLuint") int texture) { + GL45C.glBindTextureUnit(unit, texture); + } + + // --- [ glGetTextureImage ] --- + + /** + * Unsafe version of: {@link #glGetTextureImage GetTextureImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static void nglGetTextureImage(int texture, int level, int format, int type, int bufSize, long pixels) { + GL45C.nglGetTextureImage(texture, level, format, type, bufSize, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + GL45C.glGetTextureImage(texture, level, format, type, bufSize, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + // --- [ glGetCompressedTextureImage ] --- + + /** + * Unsafe version of: {@link #glGetCompressedTextureImage GetCompressedTextureImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static void nglGetCompressedTextureImage(int texture, int level, int bufSize, long pixels) { + GL45C.nglGetCompressedTextureImage(texture, level, bufSize, pixels); + } + + /** + * DSA version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels a buffer in which to return the compressed texture image + * + * @see Reference Page + */ + public static void glGetCompressedTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + GL45C.glGetCompressedTextureImage(texture, level, bufSize, pixels); + } + + /** + * DSA version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param pixels a buffer in which to return the compressed texture image + * + * @see Reference Page + */ + public static void glGetCompressedTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("void *") ByteBuffer pixels) { + GL45C.glGetCompressedTextureImage(texture, level, pixels); + } + + // --- [ glGetTextureLevelParameterfv ] --- + + /** Unsafe version of: {@link #glGetTextureLevelParameterfv GetTextureLevelParameterfv} */ + public static void nglGetTextureLevelParameterfv(int texture, int level, int pname, long params) { + GL45C.nglGetTextureLevelParameterfv(texture, level, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexLevelParameterfv GetTexLevelParameterfv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureLevelParameterfv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + GL45C.glGetTextureLevelParameterfv(texture, level, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexLevelParameterfv GetTexLevelParameterfv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetTextureLevelParameterf(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureLevelParameterf(texture, level, pname); + } + + // --- [ glGetTextureLevelParameteriv ] --- + + /** Unsafe version of: {@link #glGetTextureLevelParameteriv GetTextureLevelParameteriv} */ + public static void nglGetTextureLevelParameteriv(int texture, int level, int pname, long params) { + GL45C.nglGetTextureLevelParameteriv(texture, level, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexLevelParameteriv GetTexLevelParameteriv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query. One of:
    {@link GL11#GL_TEXTURE_WIDTH TEXTURE_WIDTH}{@link GL11#GL_TEXTURE_HEIGHT TEXTURE_HEIGHT}{@link GL12#GL_TEXTURE_DEPTH TEXTURE_DEPTH}{@link GL32#GL_TEXTURE_SAMPLES TEXTURE_SAMPLES}
    {@link GL32#GL_TEXTURE_FIXED_SAMPLE_LOCATIONS TEXTURE_FIXED_SAMPLE_LOCATIONS}{@link GL11#GL_TEXTURE_INTERNAL_FORMAT TEXTURE_INTERNAL_FORMAT}{@link GL11#GL_TEXTURE_RED_SIZE TEXTURE_RED_SIZE}{@link GL11#GL_TEXTURE_GREEN_SIZE TEXTURE_GREEN_SIZE}
    {@link GL11#GL_TEXTURE_BLUE_SIZE TEXTURE_BLUE_SIZE}{@link GL11#GL_TEXTURE_ALPHA_SIZE TEXTURE_ALPHA_SIZE}{@link GL14#GL_TEXTURE_DEPTH_SIZE TEXTURE_DEPTH_SIZE}{@link GL30#GL_TEXTURE_STENCIL_SIZE TEXTURE_STENCIL_SIZE}
    {@link GL30#GL_TEXTURE_SHARED_SIZE TEXTURE_SHARED_SIZE}{@link GL30#GL_TEXTURE_ALPHA_TYPE TEXTURE_ALPHA_TYPE}{@link GL30#GL_TEXTURE_DEPTH_TYPE TEXTURE_DEPTH_TYPE}{@link GL13#GL_TEXTURE_COMPRESSED TEXTURE_COMPRESSED}
    {@link GL13#GL_TEXTURE_COMPRESSED_IMAGE_SIZE TEXTURE_COMPRESSED_IMAGE_SIZE}{@link GL31#GL_TEXTURE_BUFFER_DATA_STORE_BINDING TEXTURE_BUFFER_DATA_STORE_BINDING}{@link GL43#GL_TEXTURE_BUFFER_OFFSET TEXTURE_BUFFER_OFFSET}{@link GL43#GL_TEXTURE_BUFFER_SIZE TEXTURE_BUFFER_SIZE}
    + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureLevelParameteriv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetTextureLevelParameteriv(texture, level, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexLevelParameteriv GetTexLevelParameteriv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query. One of:
    {@link GL11#GL_TEXTURE_WIDTH TEXTURE_WIDTH}{@link GL11#GL_TEXTURE_HEIGHT TEXTURE_HEIGHT}{@link GL12#GL_TEXTURE_DEPTH TEXTURE_DEPTH}{@link GL32#GL_TEXTURE_SAMPLES TEXTURE_SAMPLES}
    {@link GL32#GL_TEXTURE_FIXED_SAMPLE_LOCATIONS TEXTURE_FIXED_SAMPLE_LOCATIONS}{@link GL11#GL_TEXTURE_INTERNAL_FORMAT TEXTURE_INTERNAL_FORMAT}{@link GL11#GL_TEXTURE_RED_SIZE TEXTURE_RED_SIZE}{@link GL11#GL_TEXTURE_GREEN_SIZE TEXTURE_GREEN_SIZE}
    {@link GL11#GL_TEXTURE_BLUE_SIZE TEXTURE_BLUE_SIZE}{@link GL11#GL_TEXTURE_ALPHA_SIZE TEXTURE_ALPHA_SIZE}{@link GL14#GL_TEXTURE_DEPTH_SIZE TEXTURE_DEPTH_SIZE}{@link GL30#GL_TEXTURE_STENCIL_SIZE TEXTURE_STENCIL_SIZE}
    {@link GL30#GL_TEXTURE_SHARED_SIZE TEXTURE_SHARED_SIZE}{@link GL30#GL_TEXTURE_ALPHA_TYPE TEXTURE_ALPHA_TYPE}{@link GL30#GL_TEXTURE_DEPTH_TYPE TEXTURE_DEPTH_TYPE}{@link GL13#GL_TEXTURE_COMPRESSED TEXTURE_COMPRESSED}
    {@link GL13#GL_TEXTURE_COMPRESSED_IMAGE_SIZE TEXTURE_COMPRESSED_IMAGE_SIZE}{@link GL31#GL_TEXTURE_BUFFER_DATA_STORE_BINDING TEXTURE_BUFFER_DATA_STORE_BINDING}{@link GL43#GL_TEXTURE_BUFFER_OFFSET TEXTURE_BUFFER_OFFSET}{@link GL43#GL_TEXTURE_BUFFER_SIZE TEXTURE_BUFFER_SIZE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTextureLevelParameteri(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureLevelParameteri(texture, level, pname); + } + + // --- [ glGetTextureParameterfv ] --- + + /** Unsafe version of: {@link #glGetTextureParameterfv GetTextureParameterfv} */ + public static void nglGetTextureParameterfv(int texture, int pname, long params) { + GL45C.nglGetTextureParameterfv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexParameterfv GetTexParameterfv}. + * + * @param texture the texture name + * @param pname the parameter to query + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + GL45C.glGetTextureParameterfv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexParameterfv GetTexParameterfv}. + * + * @param texture the texture name + * @param pname the parameter to query + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetTextureParameterf(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureParameterf(texture, pname); + } + + // --- [ glGetTextureParameterIiv ] --- + + /** Unsafe version of: {@link #glGetTextureParameterIiv GetTextureParameterIiv} */ + public static void nglGetTextureParameterIiv(int texture, int pname, long params) { + GL45C.nglGetTextureParameterIiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetTexParameterIiv GetTexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + * @param params returns the texture parameter value + * + * @see Reference Page + */ + public static void glGetTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetTextureParameterIiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetTexParameterIiv GetTexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTextureParameterIi(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureParameterIi(texture, pname); + } + + // --- [ glGetTextureParameterIuiv ] --- + + /** Unsafe version of: {@link #glGetTextureParameterIuiv GetTextureParameterIuiv} */ + public static void nglGetTextureParameterIuiv(int texture, int pname, long params) { + GL45C.nglGetTextureParameterIuiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetTexParameterIuiv GetTexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + * @param params returns the texture parameter value + * + * @see Reference Page + */ + public static void glGetTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + GL45C.glGetTextureParameterIuiv(texture, pname, params); + } + + /** + * DSA version of {@link GL30C#glGetTexParameterIuiv GetTexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTextureParameterIui(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureParameterIui(texture, pname); + } + + // --- [ glGetTextureParameteriv ] --- + + /** Unsafe version of: {@link #glGetTextureParameteriv GetTextureParameteriv} */ + public static void nglGetTextureParameteriv(int texture, int pname, long params) { + GL45C.nglGetTextureParameteriv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexParameteriv GetTexParameteriv}. + * + * @param texture the texture name + * @param pname the parameter to query. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    {@link GL42#GL_IMAGE_FORMAT_COMPATIBILITY_TYPE IMAGE_FORMAT_COMPATIBILITY_TYPE}{@link GL42#GL_TEXTURE_IMMUTABLE_FORMAT TEXTURE_IMMUTABLE_FORMAT}{@link GL43#GL_TEXTURE_IMMUTABLE_LEVELS TEXTURE_IMMUTABLE_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LEVEL TEXTURE_VIEW_MIN_LEVEL}
    {@link GL43#GL_TEXTURE_VIEW_NUM_LEVELS TEXTURE_VIEW_NUM_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LAYER TEXTURE_VIEW_MIN_LAYER}{@link GL43#GL_TEXTURE_VIEW_NUM_LAYERS TEXTURE_VIEW_NUM_LAYERS}
    + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetTextureParameteriv(texture, pname, params); + } + + /** + * DSA version of {@link GL11C#glGetTexParameteriv GetTexParameteriv}. + * + * @param texture the texture name + * @param pname the parameter to query. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    {@link GL42#GL_IMAGE_FORMAT_COMPATIBILITY_TYPE IMAGE_FORMAT_COMPATIBILITY_TYPE}{@link GL42#GL_TEXTURE_IMMUTABLE_FORMAT TEXTURE_IMMUTABLE_FORMAT}{@link GL43#GL_TEXTURE_IMMUTABLE_LEVELS TEXTURE_IMMUTABLE_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LEVEL TEXTURE_VIEW_MIN_LEVEL}
    {@link GL43#GL_TEXTURE_VIEW_NUM_LEVELS TEXTURE_VIEW_NUM_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LAYER TEXTURE_VIEW_MIN_LAYER}{@link GL43#GL_TEXTURE_VIEW_NUM_LAYERS TEXTURE_VIEW_NUM_LAYERS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTextureParameteri(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + return GL45C.glGetTextureParameteri(texture, pname); + } + + // --- [ glCreateVertexArrays ] --- + + /** + * Unsafe version of: {@link #glCreateVertexArrays CreateVertexArrays} + * + * @param n the number of vertex array object names to create + */ + public static void nglCreateVertexArrays(int n, long arrays) { + GL45C.nglCreateVertexArrays(n, arrays); + } + + /** + * Returns {@code n} previously unused vertex array object names in {@code arrays}. + * + * @param arrays the buffer in which to return the created vertex array object names + * + * @see Reference Page + */ + public static void glCreateVertexArrays(@NativeType("GLuint *") IntBuffer arrays) { + GL45C.glCreateVertexArrays(arrays); + } + + /** + * Returns {@code n} previously unused vertex array object names in {@code arrays}. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateVertexArrays() { + return GL45C.glCreateVertexArrays(); + } + + // --- [ glDisableVertexArrayAttrib ] --- + + /** + * DSA version of {@link GL20C#glDisableVertexAttribArray DisableVertexAttribArray}. + * + * @param vaobj the vertex array object name + * @param index the index of the generic vertex attribute to be disabled + * + * @see Reference Page + */ + public static void glDisableVertexArrayAttrib(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index) { + GL45C.glDisableVertexArrayAttrib(vaobj, index); + } + + // --- [ glEnableVertexArrayAttrib ] --- + + /** + * DSA version of {@link GL20C#glEnableVertexAttribArray EnableVertexAttribArray}. + * + * @param vaobj the vertex array object name + * @param index the index of the generic vertex attribute to be enabled + * + * @see Reference Page + */ + public static void glEnableVertexArrayAttrib(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index) { + GL45C.glEnableVertexArrayAttrib(vaobj, index); + } + + // --- [ glVertexArrayElementBuffer ] --- + + /** + * Binds a buffer object to the element array buffer bind point of a vertex array object. + * + * @param vaobj the vertex array object name + * @param buffer the buffer object name. If {@code buffer} is zero, any existing element array buffer binding to {@code vaobj} is removed. + * + * @see Reference Page + */ + public static void glVertexArrayElementBuffer(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer) { + GL45C.glVertexArrayElementBuffer(vaobj, buffer); + } + + // --- [ glVertexArrayVertexBuffer ] --- + + /** + * DSA version of {@link GL43C#glBindVertexBuffer BindVertexBuffer}. + * + * @param vaobj the vertex array object name + * @param bindingindex the index of the vertex buffer binding point to which to bind the buffer + * @param buffer the name of an existing buffer to bind to the vertex buffer binding point + * @param offset the offset of the first element of the buffer + * @param stride the distance between elements within the buffer + * + * @see Reference Page + */ + public static void glVertexArrayVertexBuffer(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int bindingindex, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizei") int stride) { + GL45C.glVertexArrayVertexBuffer(vaobj, bindingindex, buffer, offset, stride); + } + + // --- [ glVertexArrayVertexBuffers ] --- + + /** + * Unsafe version of: {@link #glVertexArrayVertexBuffers VertexArrayVertexBuffers} + * + * @param count the number of vertex buffer binding points + */ + public static void nglVertexArrayVertexBuffers(int vaobj, int first, int count, long buffers, long offsets, long strides) { + GL45C.nglVertexArrayVertexBuffers(vaobj, first, count, buffers, offsets, strides); + } + + /** + * DSA version of {@link GL44C#glBindVertexBuffers BindVertexBuffers}. + * + * @param vaobj the vertex array object name + * @param first the first vertex buffer binding point + * @param buffers an array of zeros or names of existing buffers objects + * @param offsets an array of offses + * @param strides an array of stride values + * + * @see Reference Page + */ + public static void glVertexArrayVertexBuffers(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") IntBuffer strides) { + GL45C.glVertexArrayVertexBuffers(vaobj, first, buffers, offsets, strides); + } + + // --- [ glVertexArrayAttribFormat ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribFormat VertexAttribFormat}. + * + * @param vaobj the vertex array object name + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param normalized if true then integer data is normalized to the range [-1, 1] or [0, 1] if it is signed or unsigned, respectively. If false then integer data is + * directly converted to floating point. + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static void glVertexArrayAttribFormat(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int relativeoffset) { + GL45C.glVertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset); + } + + // --- [ glVertexArrayAttribIFormat ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribIFormat VertexAttribIFormat}. + * + * @param vaobj the vertex array object name + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static void glVertexArrayAttribIFormat(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset) { + GL45C.glVertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset); + } + + // --- [ glVertexArrayAttribLFormat ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribLFormat VertexAttribLFormat}. + * + * @param vaobj the vertex array object name + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static void glVertexArrayAttribLFormat(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset) { + GL45C.glVertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset); + } + + // --- [ glVertexArrayAttribBinding ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribBinding VertexAttribBinding}. + * + * @param vaobj the vertex array object name + * @param attribindex the index of the attribute to associate with a vertex buffer binding + * @param bindingindex the index of the vertex buffer binding with which to associate the generic vertex attribute + * + * @see Reference Page + */ + public static void glVertexArrayAttribBinding(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLuint") int bindingindex) { + GL45C.glVertexArrayAttribBinding(vaobj, attribindex, bindingindex); + } + + // --- [ glVertexArrayBindingDivisor ] --- + + /** + * DSA version of {@link GL43C#glVertexBindingDivisor VertexBindingDivisor}. + * + * @param vaobj the vertex array object name + * @param bindingindex the index of the generic vertex attribute + * @param divisor the number of instances that will pass between updates of the generic attribute at slot {@code index} + * + * @see Reference Page + */ + public static void glVertexArrayBindingDivisor(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int bindingindex, @NativeType("GLuint") int divisor) { + GL45C.glVertexArrayBindingDivisor(vaobj, bindingindex, divisor); + } + + // --- [ glGetVertexArrayiv ] --- + + /** Unsafe version of: {@link #glGetVertexArrayiv GetVertexArrayiv} */ + public static void nglGetVertexArrayiv(int vaobj, int pname, long param) { + GL45C.nglGetVertexArrayiv(vaobj, pname, param); + } + + /** + * Queries parameters of a vertex array object. + * + * @param vaobj the vertex array object name + * @param pname the parameter to query. Must be:
    {@link GL15#GL_ELEMENT_ARRAY_BUFFER_BINDING ELEMENT_ARRAY_BUFFER_BINDING}
    + * @param param the buffer in which to return the parameter values + * + * @see Reference Page + */ + public static void glGetVertexArrayiv(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + GL45C.glGetVertexArrayiv(vaobj, pname, param); + } + + /** + * Queries parameters of a vertex array object. + * + * @param vaobj the vertex array object name + * @param pname the parameter to query. Must be:
    {@link GL15#GL_ELEMENT_ARRAY_BUFFER_BINDING ELEMENT_ARRAY_BUFFER_BINDING}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetVertexArrayi(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname) { + return GL45C.glGetVertexArrayi(vaobj, pname); + } + + // --- [ glGetVertexArrayIndexediv ] --- + + /** Unsafe version of: {@link #glGetVertexArrayIndexediv GetVertexArrayIndexediv} */ + public static void nglGetVertexArrayIndexediv(int vaobj, int index, int pname, long param) { + GL45C.nglGetVertexArrayIndexediv(vaobj, index, pname, param); + } + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. One of:
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_ENABLED VERTEX_ATTRIB_ARRAY_ENABLED}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_SIZE VERTEX_ATTRIB_ARRAY_SIZE},
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_STRIDE VERTEX_ATTRIB_ARRAY_STRIDE}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_TYPE VERTEX_ATTRIB_ARRAY_TYPE}
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_NORMALIZED VERTEX_ATTRIB_ARRAY_NORMALIZED}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}{@link GL43#GL_VERTEX_ATTRIB_ARRAY_LONG VERTEX_ATTRIB_ARRAY_LONG}
    {@link GL43#GL_VERTEX_ATTRIB_RELATIVE_OFFSET VERTEX_ATTRIB_RELATIVE_OFFSET}
    + * @param param the buffer in which to return the parameter values + * + * @see Reference Page + */ + public static void glGetVertexArrayIndexediv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + GL45C.glGetVertexArrayIndexediv(vaobj, index, pname, param); + } + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. One of:
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_ENABLED VERTEX_ATTRIB_ARRAY_ENABLED}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_SIZE VERTEX_ATTRIB_ARRAY_SIZE},
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_STRIDE VERTEX_ATTRIB_ARRAY_STRIDE}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_TYPE VERTEX_ATTRIB_ARRAY_TYPE}
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_NORMALIZED VERTEX_ATTRIB_ARRAY_NORMALIZED}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}{@link GL43#GL_VERTEX_ATTRIB_ARRAY_LONG VERTEX_ATTRIB_ARRAY_LONG}
    {@link GL43#GL_VERTEX_ATTRIB_RELATIVE_OFFSET VERTEX_ATTRIB_RELATIVE_OFFSET}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetVertexArrayIndexedi(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL45C.glGetVertexArrayIndexedi(vaobj, index, pname); + } + + // --- [ glGetVertexArrayIndexed64iv ] --- + + /** Unsafe version of: {@link #glGetVertexArrayIndexed64iv GetVertexArrayIndexed64iv} */ + public static void nglGetVertexArrayIndexed64iv(int vaobj, int index, int pname, long param) { + GL45C.nglGetVertexArrayIndexed64iv(vaobj, index, pname, param); + } + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. Must be:
    {@link GL43#GL_VERTEX_BINDING_OFFSET VERTEX_BINDING_OFFSET}
    + * @param param the buffer in which to return the parameter values + * + * @see Reference Page + */ + public static void glGetVertexArrayIndexed64iv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer param) { + GL45C.glGetVertexArrayIndexed64iv(vaobj, index, pname, param); + } + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. Must be:
    {@link GL43#GL_VERTEX_BINDING_OFFSET VERTEX_BINDING_OFFSET}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetVertexArrayIndexed64i(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + return GL45C.glGetVertexArrayIndexed64i(vaobj, index, pname); + } + + // --- [ glCreateSamplers ] --- + + /** + * Unsafe version of: {@link #glCreateSamplers CreateSamplers} + * + * @param n the number of sampler object names to create + */ + public static void nglCreateSamplers(int n, long samplers) { + GL45C.nglCreateSamplers(n, samplers); + } + + /** + * Returns {@code n} previously unused sampler names in {@code samplers}, each representing a new sampler object. + * + * @param samplers the buffer in which to return the created sampler object names + * + * @see Reference Page + */ + public static void glCreateSamplers(@NativeType("GLuint *") IntBuffer samplers) { + GL45C.glCreateSamplers(samplers); + } + + /** + * Returns {@code n} previously unused sampler names in {@code samplers}, each representing a new sampler object. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateSamplers() { + return GL45C.glCreateSamplers(); + } + + // --- [ glCreateProgramPipelines ] --- + + /** + * Unsafe version of: {@link #glCreateProgramPipelines CreateProgramPipelines} + * + * @param n the number of program pipeline names to create + */ + public static void nglCreateProgramPipelines(int n, long pipelines) { + GL45C.nglCreateProgramPipelines(n, pipelines); + } + + /** + * Returns {@code n} previously unused program pipeline names in {@code pipelines}, each representing a new program pipeline object. + * + * @param pipelines the buffer in which to return the created program pipeline names + * + * @see Reference Page + */ + public static void glCreateProgramPipelines(@NativeType("GLuint *") IntBuffer pipelines) { + GL45C.glCreateProgramPipelines(pipelines); + } + + /** + * Returns {@code n} previously unused program pipeline names in {@code pipelines}, each representing a new program pipeline object. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateProgramPipelines() { + return GL45C.glCreateProgramPipelines(); + } + + // --- [ glCreateQueries ] --- + + /** + * Unsafe version of: {@link #glCreateQueries CreateQueries} + * + * @param n the number of query object names to create + */ + public static void nglCreateQueries(int target, int n, long ids) { + GL45C.nglCreateQueries(target, n, ids); + } + + /** + * Returns {@code n} previously unused query object names in {@code ids}, each representing a new query object with the specified {@code target}. + * + * @param target the query target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param ids the buffer in which to return the created query object names + * + * @see Reference Page + */ + public static void glCreateQueries(@NativeType("GLenum") int target, @NativeType("GLuint *") IntBuffer ids) { + GL45C.glCreateQueries(target, ids); + } + + /** + * Returns {@code n} previously unused query object names in {@code ids}, each representing a new query object with the specified {@code target}. + * + * @param target the query target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateQueries(@NativeType("GLenum") int target) { + return GL45C.glCreateQueries(target); + } + + // --- [ glGetQueryBufferObjectiv ] --- + + /** + * Queries the state of a query object. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + * + * @see Reference Page + */ + public static void glGetQueryBufferObjectiv(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset) { + GL45C.glGetQueryBufferObjectiv(id, buffer, pname, offset); + } + + // --- [ glGetQueryBufferObjectuiv ] --- + + /** + * Unsigned version of {@link #glGetQueryBufferObjectiv GetQueryBufferObjectiv}. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + * + * @see Reference Page + */ + public static void glGetQueryBufferObjectuiv(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset) { + GL45C.glGetQueryBufferObjectuiv(id, buffer, pname, offset); + } + + // --- [ glGetQueryBufferObjecti64v ] --- + + /** + * 64bit version of {@link #glGetQueryBufferObjectiv GetQueryBufferObjectiv}. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + * + * @see Reference Page + */ + public static void glGetQueryBufferObjecti64v(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset) { + GL45C.glGetQueryBufferObjecti64v(id, buffer, pname, offset); + } + + // --- [ glGetQueryBufferObjectui64v ] --- + + /** + * 64bit version of {@link #glGetQueryBufferObjectuiv GetQueryBufferObjectuiv}. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + * + * @see Reference Page + */ + public static void glGetQueryBufferObjectui64v(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset) { + GL45C.glGetQueryBufferObjectui64v(id, buffer, pname, offset); + } + + // --- [ glMemoryBarrierByRegion ] --- + + /** + * Behaves like {@link GL42C#glMemoryBarrier MemoryBarrier}, with two differences: + * + *

    First, it narrows the region under consideration so that only reads/writes of prior fragment shaders that are invoked for a smaller region of the + * framebuffer will be completed/reflected prior to subsequent reads/write of following fragment shaders. The size of the region is implementation + * dependent and may be as small as one framebuffer pixel.

    + * + *

    Second, it only applies to memory transactions that may be read by or written by a fragment shader.

    + * + *

    When barriers is {@link GL42#GL_ALL_BARRIER_BITS ALL_BARRIER_BITS}, shader memory accesses will be synchronized relative to all these barrier bits, but not to other + * barrier bits specific to {@link GL42C#glMemoryBarrier MemoryBarrier}. This implies that reads/writes for scatter/gather-like algorithms may or may not be + * completed/reflected after a MemoryBarrierByRegion command. However, for uses such as deferred shading, where a linked list of visible + * surfaces with the head at a framebuffer address may be constructed, and the entirety of the list is only dependent on previous executions at that + * framebuffer address, MemoryBarrierByRegion may be significantly more efficient than {@link GL42C#glMemoryBarrier MemoryBarrier}.

    + * + * @param barriers the barriers to insert. One or more of:
    {@link GL42#GL_ATOMIC_COUNTER_BARRIER_BIT ATOMIC_COUNTER_BARRIER_BIT}{@link GL42#GL_FRAMEBUFFER_BARRIER_BIT FRAMEBUFFER_BARRIER_BIT}{@link GL42#GL_SHADER_IMAGE_ACCESS_BARRIER_BIT SHADER_IMAGE_ACCESS_BARRIER_BIT}
    {@link GL43#GL_SHADER_STORAGE_BARRIER_BIT SHADER_STORAGE_BARRIER_BIT}{@link GL42#GL_TEXTURE_FETCH_BARRIER_BIT TEXTURE_FETCH_BARRIER_BIT}{@link GL42#GL_UNIFORM_BARRIER_BIT UNIFORM_BARRIER_BIT}
    + * + * @see Reference Page + */ + public static void glMemoryBarrierByRegion(@NativeType("GLbitfield") int barriers) { + GL45C.glMemoryBarrierByRegion(barriers); + } + + // --- [ glGetTextureSubImage ] --- + + /** + * Unsafe version of: {@link #glGetTextureSubImage GetTextureSubImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static void nglGetTextureSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, int bufSize, long pixels) { + GL45C.nglGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + // --- [ glGetCompressedTextureSubImage ] --- + + /** + * Unsafe version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static void nglGetCompressedTextureSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int bufSize, long pixels) { + GL45C.nglGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") ByteBuffer pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") ShortBuffer pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") IntBuffer pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") FloatBuffer pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") DoubleBuffer pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + // --- [ glTextureBarrier ] --- + + /** + * Guarantees that writes have completed and caches have been invalidated before subsequent Draws are executed. + * + * @see Reference Page + */ + public static void glTextureBarrier() { + GL45C.glTextureBarrier(); + } + + // --- [ glGetGraphicsResetStatus ] --- + + /** + * Indicates if the GL context has been in a reset state at any point since the last call to GetGraphicsResetStatus: + * + *
      + *
    • {@link GL11#GL_NO_ERROR NO_ERROR} indicates that the GL context has not been in a reset state since the last call.
    • + *
    • {@link GL45C#GL_GUILTY_CONTEXT_RESET GUILTY_CONTEXT_RESET} indicates that a reset has been detected that is attributable to the current GL context.
    • + *
    • {@link GL45C#GL_INNOCENT_CONTEXT_RESET INNOCENT_CONTEXT_RESET} indicates a reset has been detected that is not attributable to the current GL context.
    • + *
    • {@link GL45C#GL_UNKNOWN_CONTEXT_RESET UNKNOWN_CONTEXT_RESET} indicates a detected graphics reset whose cause is unknown.
    • + *
    + * + *

    If a reset status other than NO_ERROR is returned and subsequent calls return NO_ERROR, the context reset was encountered and completed. If a reset + * status is repeatedly returned, the context may be in the process of resetting.

    + * + *

    Reset notification behavior is determined at context creation time, and may be queried by calling GetIntegerv with the symbolic constant + * {@link GL45C#GL_RESET_NOTIFICATION_STRATEGY RESET_NOTIFICATION_STRATEGY}.

    + * + *

    If the reset notification behavior is {@link GL45C#GL_NO_RESET_NOTIFICATION NO_RESET_NOTIFICATION}, then the implementation will never deliver notification of reset events, and + * GetGraphicsResetStatus will always return NO_ERROR.

    + * + *

    If the behavior is {@link GL45C#GL_LOSE_CONTEXT_ON_RESET LOSE_CONTEXT_ON_RESET}, a graphics reset will result in a lost context and require creating a new context as described + * above. In this case GetGraphicsResetStatus will return an appropriate value from those described above.

    + * + *

    If a graphics reset notification occurs in a context, a notification must also occur in all other contexts which share objects with that context.

    + * + *

    After a graphics reset has occurred on a context, subsequent GL commands on that context (or any context which shares with that context) will generate a + * {@link GL45C#GL_CONTEXT_LOST CONTEXT_LOST} error. Such commands will not have side effects (in particular, they will not modify memory passed by pointer for query results, + * and may not block indefinitely or cause termination of the application. Exceptions to this behavior include:

    + * + *
      + *
    • {@link GL11C#glGetError GetError} and GetGraphicsResetStatus behave normally following a graphics reset, so that the application can determine a reset has + * occurred, and when it is safe to destroy and recreate the context.
    • + *
    • Any commands which might cause a polling application to block indefinitely will generate a CONTEXT_LOST error, but will also return a value + * indicating completion to the application.
    • + *
    + * + * @see Reference Page + */ + @NativeType("GLenum") + public static int glGetGraphicsResetStatus() { + return GL45C.glGetGraphicsResetStatus(); + } + + // --- [ glGetnMapdv ] --- + + /** + * Unsafe version of: {@link #glGetnMapdv GetnMapdv} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnMapdv(int target, int query, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetMapdv GetMapdv} + * + * @param target the evaluator map + * @param query the information to query + * @param data a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnMapdv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLdouble *") DoubleBuffer data) { + nglGetnMapdv(target, query, data.remaining(), memAddress(data)); + } + + /** + * Robust version of {@link GL11#glGetMapdv GetMapdv} + * + * @param target the evaluator map + * @param query the information to query + * + * @see Reference Page + */ + @NativeType("void") + public static double glGetnMapd(@NativeType("GLenum") int target, @NativeType("GLenum") int query) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer data = stack.callocDouble(1); + nglGetnMapdv(target, query, 1, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnMapfv ] --- + + /** + * Unsafe version of: {@link #glGetnMapfv GetnMapfv} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnMapfv(int target, int query, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetMapfv GetMapfv} + * + * @param target the evaluator map + * @param query the information to query + * @param data a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnMapfv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLfloat *") FloatBuffer data) { + nglGetnMapfv(target, query, data.remaining(), memAddress(data)); + } + + /** + * Robust version of {@link GL11#glGetMapfv GetMapfv} + * + * @param target the evaluator map + * @param query the information to query + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetnMapf(@NativeType("GLenum") int target, @NativeType("GLenum") int query) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer data = stack.callocFloat(1); + nglGetnMapfv(target, query, 1, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnMapiv ] --- + + /** + * Unsafe version of: {@link #glGetnMapiv GetnMapiv} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnMapiv(int target, int query, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetMapiv GetMapiv} + * + * @param target the evaluator target. One of:
    {@link GL11#GL_MAP1_VERTEX_3 MAP1_VERTEX_3}{@link GL11#GL_MAP1_VERTEX_4 MAP1_VERTEX_4}{@link GL11#GL_MAP1_COLOR_4 MAP1_COLOR_4}{@link GL11#GL_MAP1_NORMAL MAP1_NORMAL}{@link GL11#GL_MAP1_TEXTURE_COORD_1 MAP1_TEXTURE_COORD_1}
    {@link GL11#GL_MAP1_TEXTURE_COORD_2 MAP1_TEXTURE_COORD_2}{@link GL11#GL_MAP1_TEXTURE_COORD_3 MAP1_TEXTURE_COORD_3}{@link GL11#GL_MAP1_TEXTURE_COORD_4 MAP1_TEXTURE_COORD_4}{@link GL11#GL_MAP2_VERTEX_3 MAP2_VERTEX_3}{@link GL11#GL_MAP2_VERTEX_4 MAP2_VERTEX_4}
    {@link GL11#GL_MAP2_COLOR_4 MAP2_COLOR_4}{@link GL11#GL_MAP2_NORMAL MAP2_NORMAL}{@link GL11#GL_MAP2_TEXTURE_COORD_1 MAP2_TEXTURE_COORD_1}{@link GL11#GL_MAP2_TEXTURE_COORD_2 MAP2_TEXTURE_COORD_2}{@link GL11#GL_MAP2_TEXTURE_COORD_3 MAP2_TEXTURE_COORD_3}
    {@link GL11#GL_MAP2_TEXTURE_COORD_4 MAP2_TEXTURE_COORD_4}
    + * @param query the information to query. One of:
    {@link GL11#GL_ORDER ORDER}{@link GL11#GL_COEFF COEFF}{@link GL11#GL_DOMAIN DOMAIN}
    + * @param data a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnMapiv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLint *") IntBuffer data) { + nglGetnMapiv(target, query, data.remaining(), memAddress(data)); + } + + /** + * Robust version of {@link GL11#glGetMapiv GetMapiv} + * + * @param target the evaluator target. One of:
    {@link GL11#GL_MAP1_VERTEX_3 MAP1_VERTEX_3}{@link GL11#GL_MAP1_VERTEX_4 MAP1_VERTEX_4}{@link GL11#GL_MAP1_COLOR_4 MAP1_COLOR_4}{@link GL11#GL_MAP1_NORMAL MAP1_NORMAL}{@link GL11#GL_MAP1_TEXTURE_COORD_1 MAP1_TEXTURE_COORD_1}
    {@link GL11#GL_MAP1_TEXTURE_COORD_2 MAP1_TEXTURE_COORD_2}{@link GL11#GL_MAP1_TEXTURE_COORD_3 MAP1_TEXTURE_COORD_3}{@link GL11#GL_MAP1_TEXTURE_COORD_4 MAP1_TEXTURE_COORD_4}{@link GL11#GL_MAP2_VERTEX_3 MAP2_VERTEX_3}{@link GL11#GL_MAP2_VERTEX_4 MAP2_VERTEX_4}
    {@link GL11#GL_MAP2_COLOR_4 MAP2_COLOR_4}{@link GL11#GL_MAP2_NORMAL MAP2_NORMAL}{@link GL11#GL_MAP2_TEXTURE_COORD_1 MAP2_TEXTURE_COORD_1}{@link GL11#GL_MAP2_TEXTURE_COORD_2 MAP2_TEXTURE_COORD_2}{@link GL11#GL_MAP2_TEXTURE_COORD_3 MAP2_TEXTURE_COORD_3}
    {@link GL11#GL_MAP2_TEXTURE_COORD_4 MAP2_TEXTURE_COORD_4}
    + * @param query the information to query. One of:
    {@link GL11#GL_ORDER ORDER}{@link GL11#GL_COEFF COEFF}{@link GL11#GL_DOMAIN DOMAIN}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetnMapi(@NativeType("GLenum") int target, @NativeType("GLenum") int query) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer data = stack.callocInt(1); + nglGetnMapiv(target, query, 1, memAddress(data)); + return data.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnPixelMapfv ] --- + + /** + * Unsafe version of: {@link #glGetnPixelMapfv GetnPixelMapfv} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnPixelMapfv(int map, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetPixelMapfv GetPixelMapfv} + * + * @param map the pixel map parameter to query. One of:
    {@link GL11#GL_PIXEL_MAP_I_TO_I PIXEL_MAP_I_TO_I}{@link GL11#GL_PIXEL_MAP_S_TO_S PIXEL_MAP_S_TO_S}{@link GL11#GL_PIXEL_MAP_I_TO_R PIXEL_MAP_I_TO_R}{@link GL11#GL_PIXEL_MAP_I_TO_G PIXEL_MAP_I_TO_G}{@link GL11#GL_PIXEL_MAP_I_TO_B PIXEL_MAP_I_TO_B}
    {@link GL11#GL_PIXEL_MAP_I_TO_A PIXEL_MAP_I_TO_A}{@link GL11#GL_PIXEL_MAP_R_TO_R PIXEL_MAP_R_TO_R}{@link GL11#GL_PIXEL_MAP_G_TO_G PIXEL_MAP_G_TO_G}{@link GL11#GL_PIXEL_MAP_B_TO_B PIXEL_MAP_B_TO_B}{@link GL11#GL_PIXEL_MAP_A_TO_A PIXEL_MAP_A_TO_A}
    + * @param data a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnPixelMapfv(@NativeType("GLenum") int map, @NativeType("GLfloat *") FloatBuffer data) { + nglGetnPixelMapfv(map, data.remaining(), memAddress(data)); + } + + // --- [ glGetnPixelMapuiv ] --- + + /** + * Unsafe version of: {@link #glGetnPixelMapuiv GetnPixelMapuiv} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnPixelMapuiv(int map, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetPixelMapuiv GetPixelMapuiv} + * + * @param map the pixel map parameter to query + * @param data a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnPixelMapuiv(@NativeType("GLenum") int map, @NativeType("GLuint *") IntBuffer data) { + nglGetnPixelMapuiv(map, data.remaining(), memAddress(data)); + } + + // --- [ glGetnPixelMapusv ] --- + + /** + * Unsafe version of: {@link #glGetnPixelMapusv GetnPixelMapusv} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglGetnPixelMapusv(int map, int bufSize, long data); + + /** + * Robust version of {@link GL11#glGetPixelMapusv GetPixelMapusv} + * + * @param map the pixel map parameter to query + * @param data a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnPixelMapusv(@NativeType("GLenum") int map, @NativeType("GLushort *") ShortBuffer data) { + nglGetnPixelMapusv(map, data.remaining(), memAddress(data)); + } + + // --- [ glGetnPolygonStipple ] --- + + /** + * Unsafe version of: {@link #glGetnPolygonStipple GetnPolygonStipple} + * + * @param bufSize the maximum number of bytes to write into {@code pattern} + */ + public static native void nglGetnPolygonStipple(int bufSize, long pattern); + + /** + * Robust version of {@link GL11#glGetPolygonStipple GetPolygonStipple} + * + * @param bufSize the maximum number of bytes to write into {@code pattern} + * @param pattern a buffer in which to place the returned pattern + * + * @see Reference Page + */ + public static void glGetnPolygonStipple(@NativeType("GLsizei") int bufSize, @NativeType("GLubyte *") long pattern) { + nglGetnPolygonStipple(bufSize, pattern); + } + + /** + * Robust version of {@link GL11#glGetPolygonStipple GetPolygonStipple} + * + * @param pattern a buffer in which to place the returned pattern + * + * @see Reference Page + */ + public static void glGetnPolygonStipple(@NativeType("GLubyte *") ByteBuffer pattern) { + nglGetnPolygonStipple(pattern.remaining(), memAddress(pattern)); + } + + // --- [ glGetnTexImage ] --- + + /** + * Unsafe version of: {@link #glGetnTexImage GetnTexImage} + * + * @param bufSize the maximum number of bytes to write into {@code img} + */ + public static void nglGetnTexImage(int tex, int level, int format, int type, int bufSize, long img) { + GL45C.nglGetnTexImage(tex, level, format, type, bufSize, img); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param bufSize the maximum number of bytes to write into {@code img} + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long img) { + GL45C.glGetnTexImage(tex, level, format, type, bufSize, img); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer img) { + GL45C.glGetnTexImage(tex, level, format, type, img); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer img) { + GL45C.glGetnTexImage(tex, level, format, type, img); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer img) { + GL45C.glGetnTexImage(tex, level, format, type, img); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer img) { + GL45C.glGetnTexImage(tex, level, format, type, img); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer img) { + GL45C.glGetnTexImage(tex, level, format, type, img); + } + + // --- [ glReadnPixels ] --- + + /** + * Unsafe version of: {@link #glReadnPixels ReadnPixels} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static void nglReadnPixels(int x, int y, int width, int height, int format, int type, int bufSize, long pixels) { + GL45C.nglReadnPixels(x, y, width, height, format, type, bufSize, pixels); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param bufSize the maximum number of bytes to write into {@code data} + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, bufSize, pixels); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + // --- [ glGetnColorTable ] --- + + /** + * Unsafe version of: {@link #glGetnColorTable GetnColorTable} + * + * @param bufSize the maximum number of bytes to write into {@code table} + */ + public static native void nglGetnColorTable(int target, int format, int type, int bufSize, long table); + + /** + * Robust version of {@link ARBImaging#glGetColorTable GetColorTable} + * + * @param target the color table target. One of:
    {@link ARBImaging#GL_COLOR_TABLE COLOR_TABLE}{@link ARBImaging#GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link ARBImaging#GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param bufSize the maximum number of bytes to write into {@code table} + * @param table a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long table) { + nglGetnColorTable(target, format, type, bufSize, table); + } + + /** + * Robust version of {@link ARBImaging#glGetColorTable GetColorTable} + * + * @param target the color table target. One of:
    {@link ARBImaging#GL_COLOR_TABLE COLOR_TABLE}{@link ARBImaging#GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link ARBImaging#GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer table) { + nglGetnColorTable(target, format, type, table.remaining(), memAddress(table)); + } + + /** + * Robust version of {@link ARBImaging#glGetColorTable GetColorTable} + * + * @param target the color table target. One of:
    {@link ARBImaging#GL_COLOR_TABLE COLOR_TABLE}{@link ARBImaging#GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link ARBImaging#GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer table) { + nglGetnColorTable(target, format, type, table.remaining() << 1, memAddress(table)); + } + + /** + * Robust version of {@link ARBImaging#glGetColorTable GetColorTable} + * + * @param target the color table target. One of:
    {@link ARBImaging#GL_COLOR_TABLE COLOR_TABLE}{@link ARBImaging#GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link ARBImaging#GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer table) { + nglGetnColorTable(target, format, type, table.remaining() << 2, memAddress(table)); + } + + /** + * Robust version of {@link ARBImaging#glGetColorTable GetColorTable} + * + * @param target the color table target. One of:
    {@link ARBImaging#GL_COLOR_TABLE COLOR_TABLE}{@link ARBImaging#GL_POST_CONVOLUTION_COLOR_TABLE POST_CONVOLUTION_COLOR_TABLE}{@link ARBImaging#GL_POST_COLOR_MATRIX_COLOR_TABLE POST_COLOR_MATRIX_COLOR_TABLE}
    + * @param format the color data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the color data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param table a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer table) { + nglGetnColorTable(target, format, type, table.remaining() << 2, memAddress(table)); + } + + // --- [ glGetnConvolutionFilter ] --- + + /** + * Unsafe version of: {@link #glGetnConvolutionFilter GetnConvolutionFilter} + * + * @param bufSize the maximum number of bytes to write into {@code image} + */ + public static native void nglGetnConvolutionFilter(int target, int format, int type, int bufSize, long image); + + /** + * Robust version of {@link ARBImaging#glGetConvolutionFilter GetConvolutionFilter} + * + * @param target the convolution target. One of:
    {@link ARBImaging#GL_CONVOLUTION_1D CONVOLUTION_1D}{@link ARBImaging#GL_CONVOLUTION_2D CONVOLUTION_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param bufSize the maximum number of bytes to write into {@code image} + * @param image a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnConvolutionFilter(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long image) { + nglGetnConvolutionFilter(target, format, type, bufSize, image); + } + + /** + * Robust version of {@link ARBImaging#glGetConvolutionFilter GetConvolutionFilter} + * + * @param target the convolution target. One of:
    {@link ARBImaging#GL_CONVOLUTION_1D CONVOLUTION_1D}{@link ARBImaging#GL_CONVOLUTION_2D CONVOLUTION_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param image a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnConvolutionFilter(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer image) { + nglGetnConvolutionFilter(target, format, type, image.remaining(), memAddress(image)); + } + + // --- [ glGetnSeparableFilter ] --- + + /** + * Unsafe version of: {@link #glGetnSeparableFilter GetnSeparableFilter} + * + * @param rowBufSize the maximum number of bytes to write into {@code row} + * @param columnBufSize the maximum number of bytes to write into {@code column} + */ + public static native void nglGetnSeparableFilter(int target, int format, int type, int rowBufSize, long row, int columnBufSize, long column, long span); + + /** + * Robust version of {@link ARBImaging#glGetSeparableFilter GetSeparableFilter} + * + * @param target the filter target. Must be:
    {@link ARBImaging#GL_SEPARABLE_2D SEPARABLE_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param rowBufSize the maximum number of bytes to write into {@code row} + * @param row a buffer in which to return the filter row + * @param columnBufSize the maximum number of bytes to write into {@code column} + * @param column a buffer in which to return the filter column + * + * @see Reference Page + */ + public static void glGetnSeparableFilter(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int rowBufSize, @NativeType("void *") long row, @NativeType("GLsizei") int columnBufSize, @NativeType("void *") long column, @Nullable @NativeType("void *") ByteBuffer span) { + nglGetnSeparableFilter(target, format, type, rowBufSize, row, columnBufSize, column, memAddressSafe(span)); + } + + /** + * Robust version of {@link ARBImaging#glGetSeparableFilter GetSeparableFilter} + * + * @param target the filter target. Must be:
    {@link ARBImaging#GL_SEPARABLE_2D SEPARABLE_2D}
    + * @param format the filter data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the filter data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param row a buffer in which to return the filter row + * @param column a buffer in which to return the filter column + * + * @see Reference Page + */ + public static void glGetnSeparableFilter(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer row, @NativeType("void *") ByteBuffer column, @Nullable @NativeType("void *") ByteBuffer span) { + nglGetnSeparableFilter(target, format, type, row.remaining(), memAddress(row), column.remaining(), memAddress(column), memAddressSafe(span)); + } + + // --- [ glGetnHistogram ] --- + + /** + * Unsafe version of: {@link #glGetnHistogram GetnHistogram} + * + * @param bufSize the maximum number of bytes to write into {@code values} + */ + public static native void nglGetnHistogram(int target, boolean reset, int format, int type, int bufSize, long values); + + /** + * Robust version of {@link ARBImaging#glGetHistogram GetHistogram} + * + * @param target the histogram target. Must be:
    {@link ARBImaging#GL_HISTOGRAM HISTOGRAM}
    + * @param reset if {@link GL11#GL_TRUE TRUE}, then all counters of all elements of the histogram are reset to zero. Counters are reset whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data types. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param bufSize the maximum number of bytes to write into {@code values} + * @param values a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnHistogram(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long values) { + nglGetnHistogram(target, reset, format, type, bufSize, values); + } + + /** + * Robust version of {@link ARBImaging#glGetHistogram GetHistogram} + * + * @param target the histogram target. Must be:
    {@link ARBImaging#GL_HISTOGRAM HISTOGRAM}
    + * @param reset if {@link GL11#GL_TRUE TRUE}, then all counters of all elements of the histogram are reset to zero. Counters are reset whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data types. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param values a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnHistogram(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer values) { + nglGetnHistogram(target, reset, format, type, values.remaining(), memAddress(values)); + } + + // --- [ glGetnMinmax ] --- + + /** + * Unsafe version of: {@link #glGetnMinmax GetnMinmax} + * + * @param bufSize the maximum number of bytes to write into {@code values} + */ + public static native void nglGetnMinmax(int target, boolean reset, int format, int type, int bufSize, long values); + + /** + * Robust version of {@link ARBImaging#glGetMinmax GetMinmax} + * + * @param target the minmax target. Must be:
    {@link ARBImaging#GL_MINMAX MINMAX}
    + * @param reset If {@link GL11#GL_TRUE TRUE}, then each minimum value is reset to the maximum representable value, and each maximum value is reset to the minimum + * representable value. All values are reset, whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param bufSize the maximum number of bytes to write into {@code values} + * @param values a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnMinmax(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long values) { + nglGetnMinmax(target, reset, format, type, bufSize, values); + } + + /** + * Robust version of {@link ARBImaging#glGetMinmax GetMinmax} + * + * @param target the minmax target. Must be:
    {@link ARBImaging#GL_MINMAX MINMAX}
    + * @param reset If {@link GL11#GL_TRUE TRUE}, then each minimum value is reset to the maximum representable value, and each maximum value is reset to the minimum + * representable value. All values are reset, whether returned or not. + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL11#GL_RGB RGB}{@link GL11#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}{@link GL12#GL_BGRA BGRA}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}
    {@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}{@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}
    {@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    + * @param values a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnMinmax(@NativeType("GLenum") int target, @NativeType("GLboolean") boolean reset, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer values) { + nglGetnMinmax(target, reset, format, type, values.remaining(), memAddress(values)); + } + + // --- [ glGetnCompressedTexImage ] --- + + /** + * Unsafe version of: {@link #glGetnCompressedTexImage GetnCompressedTexImage} + * + * @param bufSize the maximum number of bytes to write into {@code img} + */ + public static void nglGetnCompressedTexImage(int target, int level, int bufSize, long img) { + GL45C.nglGetnCompressedTexImage(target, level, bufSize, img); + } + + /** + * Robust version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage} + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param bufSize the maximum number of bytes to write into {@code img} + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnCompressedTexImage(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLsizei") int bufSize, @NativeType("void *") long img) { + GL45C.glGetnCompressedTexImage(target, level, bufSize, img); + } + + /** + * Robust version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage} + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnCompressedTexImage(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") ByteBuffer img) { + GL45C.glGetnCompressedTexImage(target, level, img); + } + + // --- [ glGetnUniformfv ] --- + + /** + * Unsafe version of: {@link #glGetnUniformfv GetnUniformfv} + * + * @param bufSize the maximum number of bytes to write to {@code params} + */ + public static void nglGetnUniformfv(int program, int location, int bufSize, long params) { + GL45C.nglGetnUniformfv(program, location, bufSize, params); + } + + /** + * Returns the value or values of a uniform of the default uniform block. + * + * @param program the program object + * @param location the uniform location + * @param params the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnUniformfv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") FloatBuffer params) { + GL45C.glGetnUniformfv(program, location, params); + } + + /** + * Returns the value or values of a uniform of the default uniform block. + * + * @param program the program object + * @param location the uniform location + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetnUniformf(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL45C.glGetnUniformf(program, location); + } + + // --- [ glGetnUniformdv ] --- + + /** + * Unsafe version of: {@link #glGetnUniformdv GetnUniformdv} + * + * @param bufSize the maximum number of bytes to write to {@code params} + */ + public static void nglGetnUniformdv(int program, int location, int bufSize, long params) { + GL45C.nglGetnUniformdv(program, location, bufSize, params); + } + + /** + * Double version of {@link #glGetnUniformfv GetnUniformfv}. + * + * @param program the program object + * @param location the uniform location + * @param params the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnUniformdv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") DoubleBuffer params) { + GL45C.glGetnUniformdv(program, location, params); + } + + /** + * Double version of {@link #glGetnUniformfv GetnUniformfv}. + * + * @param program the program object + * @param location the uniform location + * + * @see Reference Page + */ + @NativeType("void") + public static double glGetnUniformd(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL45C.glGetnUniformd(program, location); + } + + // --- [ glGetnUniformiv ] --- + + /** + * Unsafe version of: {@link #glGetnUniformiv GetnUniformiv} + * + * @param bufSize the maximum number of bytes to write to {@code params} + */ + public static void nglGetnUniformiv(int program, int location, int bufSize, long params) { + GL45C.nglGetnUniformiv(program, location, bufSize, params); + } + + /** + * Integer version of {@link #glGetnUniformfv GetnUniformfv}. + * + * @param program the program object + * @param location the uniform location + * @param params the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnUniformiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetnUniformiv(program, location, params); + } + + /** + * Integer version of {@link #glGetnUniformfv GetnUniformfv}. + * + * @param program the program object + * @param location the uniform location + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetnUniformi(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL45C.glGetnUniformi(program, location); + } + + // --- [ glGetnUniformuiv ] --- + + /** + * Unsafe version of: {@link #glGetnUniformuiv GetnUniformuiv} + * + * @param bufSize the maximum number of bytes to write to {@code params} + */ + public static void nglGetnUniformuiv(int program, int location, int bufSize, long params) { + GL45C.nglGetnUniformuiv(program, location, bufSize, params); + } + + /** + * Unsigned version of {@link #glGetnUniformiv GetnUniformiv}. + * + * @param program the program object + * @param location the uniform location + * @param params the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnUniformuiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") IntBuffer params) { + GL45C.glGetnUniformuiv(program, location, params); + } + + /** + * Unsigned version of {@link #glGetnUniformiv GetnUniformiv}. + * + * @param program the program object + * @param location the uniform location + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetnUniformui(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL45C.glGetnUniformui(program, location); + } + + /** + * Array version of: {@link #glCreateTransformFeedbacks CreateTransformFeedbacks} + * + * @see Reference Page + */ + public static void glCreateTransformFeedbacks(@NativeType("GLuint *") int[] ids) { + GL45C.glCreateTransformFeedbacks(ids); + } + + /** + * Array version of: {@link #glGetTransformFeedbackiv GetTransformFeedbackiv} + * + * @see Reference Page + */ + public static void glGetTransformFeedbackiv(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + GL45C.glGetTransformFeedbackiv(xfb, pname, param); + } + + /** + * Array version of: {@link #glGetTransformFeedbacki_v GetTransformFeedbacki_v} + * + * @see Reference Page + */ + public static void glGetTransformFeedbacki_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint *") int[] param) { + GL45C.glGetTransformFeedbacki_v(xfb, pname, index, param); + } + + /** + * Array version of: {@link #glGetTransformFeedbacki64_v GetTransformFeedbacki64_v} + * + * @see Reference Page + */ + public static void glGetTransformFeedbacki64_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint64 *") long[] param) { + GL45C.glGetTransformFeedbacki64_v(xfb, pname, index, param); + } + + /** + * Array version of: {@link #glCreateBuffers CreateBuffers} + * + * @see Reference Page + */ + public static void glCreateBuffers(@NativeType("GLuint *") int[] buffers) { + GL45C.glCreateBuffers(buffers); + } + + /** + * Array version of: {@link #glNamedBufferStorage NamedBufferStorage} + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") short[] data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * Array version of: {@link #glNamedBufferStorage NamedBufferStorage} + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") int[] data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * Array version of: {@link #glNamedBufferStorage NamedBufferStorage} + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") float[] data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * Array version of: {@link #glNamedBufferStorage NamedBufferStorage} + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") double[] data, @NativeType("GLbitfield") int flags) { + GL45C.glNamedBufferStorage(buffer, data, flags); + } + + /** + * Array version of: {@link #glNamedBufferData NamedBufferData} + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") short[] data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * Array version of: {@link #glNamedBufferData NamedBufferData} + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") int[] data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * Array version of: {@link #glNamedBufferData NamedBufferData} + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") long[] data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * Array version of: {@link #glNamedBufferData NamedBufferData} + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") float[] data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * Array version of: {@link #glNamedBufferData NamedBufferData} + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") double[] data, @NativeType("GLenum") int usage) { + GL45C.glNamedBufferData(buffer, data, usage); + } + + /** + * Array version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") short[] data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * Array version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") int[] data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * Array version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") long[] data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * Array version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") float[] data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * Array version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") double[] data) { + GL45C.glNamedBufferSubData(buffer, offset, data); + } + + /** + * Array version of: {@link #glClearNamedBufferData ClearNamedBufferData} + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** + * Array version of: {@link #glClearNamedBufferData ClearNamedBufferData} + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** + * Array version of: {@link #glClearNamedBufferData ClearNamedBufferData} + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL45C.glClearNamedBufferData(buffer, internalformat, format, type, data); + } + + /** + * Array version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** + * Array version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** + * Array version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + GL45C.glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); + } + + /** + * Array version of: {@link #glGetNamedBufferParameteriv GetNamedBufferParameteriv} + * + * @see Reference Page + */ + public static void glGetNamedBufferParameteriv(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetNamedBufferParameteriv(buffer, pname, params); + } + + /** + * Array version of: {@link #glGetNamedBufferParameteri64v GetNamedBufferParameteri64v} + * + * @see Reference Page + */ + public static void glGetNamedBufferParameteri64v(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + GL45C.glGetNamedBufferParameteri64v(buffer, pname, params); + } + + /** + * Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") short[] data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") int[] data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") long[] data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") float[] data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") double[] data) { + GL45C.glGetNamedBufferSubData(buffer, offset, data); + } + + /** + * Array version of: {@link #glCreateFramebuffers CreateFramebuffers} + * + * @see Reference Page + */ + public static void glCreateFramebuffers(@NativeType("GLuint *") int[] framebuffers) { + GL45C.glCreateFramebuffers(framebuffers); + } + + /** + * Array version of: {@link #glNamedFramebufferDrawBuffers NamedFramebufferDrawBuffers} + * + * @see Reference Page + */ + public static void glNamedFramebufferDrawBuffers(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int[] bufs) { + GL45C.glNamedFramebufferDrawBuffers(framebuffer, bufs); + } + + /** + * Array version of: {@link #glInvalidateNamedFramebufferData InvalidateNamedFramebufferData} + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int[] attachments) { + GL45C.glInvalidateNamedFramebufferData(framebuffer, attachments); + } + + /** + * Array version of: {@link #glInvalidateNamedFramebufferSubData InvalidateNamedFramebufferSubData} + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferSubData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int[] attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + GL45C.glInvalidateNamedFramebufferSubData(framebuffer, attachments, x, y, width, height); + } + + /** + * Array version of: {@link #glClearNamedFramebufferiv ClearNamedFramebufferiv} + * + * @see Reference Page + */ + public static void glClearNamedFramebufferiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") int[] value) { + GL45C.glClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); + } + + /** + * Array version of: {@link #glClearNamedFramebufferuiv ClearNamedFramebufferuiv} + * + * @see Reference Page + */ + public static void glClearNamedFramebufferuiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") int[] value) { + GL45C.glClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); + } + + /** + * Array version of: {@link #glClearNamedFramebufferfv ClearNamedFramebufferfv} + * + * @see Reference Page + */ + public static void glClearNamedFramebufferfv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat const *") float[] value) { + GL45C.glClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); + } + + /** + * Array version of: {@link #glGetNamedFramebufferParameteriv GetNamedFramebufferParameteriv} + * + * @see Reference Page + */ + public static void glGetNamedFramebufferParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetNamedFramebufferParameteriv(framebuffer, pname, params); + } + + /** + * Array version of: {@link #glGetNamedFramebufferAttachmentParameteriv GetNamedFramebufferAttachmentParameteriv} + * + * @see Reference Page + */ + public static void glGetNamedFramebufferAttachmentParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params); + } + + /** + * Array version of: {@link #glCreateRenderbuffers CreateRenderbuffers} + * + * @see Reference Page + */ + public static void glCreateRenderbuffers(@NativeType("GLuint *") int[] renderbuffers) { + GL45C.glCreateRenderbuffers(renderbuffers); + } + + /** + * Array version of: {@link #glGetNamedRenderbufferParameteriv GetNamedRenderbufferParameteriv} + * + * @see Reference Page + */ + public static void glGetNamedRenderbufferParameteriv(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetNamedRenderbufferParameteriv(renderbuffer, pname, params); + } + + /** + * Array version of: {@link #glCreateTextures CreateTextures} + * + * @see Reference Page + */ + public static void glCreateTextures(@NativeType("GLenum") int target, @NativeType("GLuint *") int[] textures) { + GL45C.glCreateTextures(target, textures); + } + + /** + * Array version of: {@link #glTextureSubImage1D TextureSubImage1D} + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureSubImage1D TextureSubImage1D} + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureSubImage1D TextureSubImage1D} + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureSubImage1D TextureSubImage1D} + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + GL45C.glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureSubImage2D TextureSubImage2D} + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureSubImage2D TextureSubImage2D} + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureSubImage2D TextureSubImage2D} + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureSubImage2D TextureSubImage2D} + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + GL45C.glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureSubImage3D TextureSubImage3D} + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureSubImage3D TextureSubImage3D} + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureSubImage3D TextureSubImage3D} + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureSubImage3D TextureSubImage3D} + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + GL45C.glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Array version of: {@link #glTextureParameterfv TextureParameterfv} + * + * @see Reference Page + */ + public static void glTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + GL45C.glTextureParameterfv(texture, pname, params); + } + + /** + * Array version of: {@link #glTextureParameterIiv TextureParameterIiv} + * + * @see Reference Page + */ + public static void glTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + GL45C.glTextureParameterIiv(texture, pname, params); + } + + /** + * Array version of: {@link #glTextureParameterIuiv TextureParameterIuiv} + * + * @see Reference Page + */ + public static void glTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int[] params) { + GL45C.glTextureParameterIuiv(texture, pname, params); + } + + /** + * Array version of: {@link #glTextureParameteriv TextureParameteriv} + * + * @see Reference Page + */ + public static void glTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + GL45C.glTextureParameteriv(texture, pname, params); + } + + /** + * Array version of: {@link #glGetTextureImage GetTextureImage} + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * Array version of: {@link #glGetTextureImage GetTextureImage} + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * Array version of: {@link #glGetTextureImage GetTextureImage} + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * Array version of: {@link #glGetTextureImage GetTextureImage} + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] pixels) { + GL45C.glGetTextureImage(texture, level, format, type, pixels); + } + + /** + * Array version of: {@link #glGetTextureLevelParameterfv GetTextureLevelParameterfv} + * + * @see Reference Page + */ + public static void glGetTextureLevelParameterfv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + GL45C.glGetTextureLevelParameterfv(texture, level, pname, params); + } + + /** + * Array version of: {@link #glGetTextureLevelParameteriv GetTextureLevelParameteriv} + * + * @see Reference Page + */ + public static void glGetTextureLevelParameteriv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetTextureLevelParameteriv(texture, level, pname, params); + } + + /** + * Array version of: {@link #glGetTextureParameterfv GetTextureParameterfv} + * + * @see Reference Page + */ + public static void glGetTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + GL45C.glGetTextureParameterfv(texture, pname, params); + } + + /** + * Array version of: {@link #glGetTextureParameterIiv GetTextureParameterIiv} + * + * @see Reference Page + */ + public static void glGetTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetTextureParameterIiv(texture, pname, params); + } + + /** + * Array version of: {@link #glGetTextureParameterIuiv GetTextureParameterIuiv} + * + * @see Reference Page + */ + public static void glGetTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + GL45C.glGetTextureParameterIuiv(texture, pname, params); + } + + /** + * Array version of: {@link #glGetTextureParameteriv GetTextureParameteriv} + * + * @see Reference Page + */ + public static void glGetTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + GL45C.glGetTextureParameteriv(texture, pname, params); + } + + /** + * Array version of: {@link #glCreateVertexArrays CreateVertexArrays} + * + * @see Reference Page + */ + public static void glCreateVertexArrays(@NativeType("GLuint *") int[] arrays) { + GL45C.glCreateVertexArrays(arrays); + } + + /** + * Array version of: {@link #glVertexArrayVertexBuffers VertexArrayVertexBuffers} + * + * @see Reference Page + */ + public static void glVertexArrayVertexBuffers(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") int[] strides) { + GL45C.glVertexArrayVertexBuffers(vaobj, first, buffers, offsets, strides); + } + + /** + * Array version of: {@link #glGetVertexArrayiv GetVertexArrayiv} + * + * @see Reference Page + */ + public static void glGetVertexArrayiv(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + GL45C.glGetVertexArrayiv(vaobj, pname, param); + } + + /** + * Array version of: {@link #glGetVertexArrayIndexediv GetVertexArrayIndexediv} + * + * @see Reference Page + */ + public static void glGetVertexArrayIndexediv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + GL45C.glGetVertexArrayIndexediv(vaobj, index, pname, param); + } + + /** + * Array version of: {@link #glGetVertexArrayIndexed64iv GetVertexArrayIndexed64iv} + * + * @see Reference Page + */ + public static void glGetVertexArrayIndexed64iv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] param) { + GL45C.glGetVertexArrayIndexed64iv(vaobj, index, pname, param); + } + + /** + * Array version of: {@link #glCreateSamplers CreateSamplers} + * + * @see Reference Page + */ + public static void glCreateSamplers(@NativeType("GLuint *") int[] samplers) { + GL45C.glCreateSamplers(samplers); + } + + /** + * Array version of: {@link #glCreateProgramPipelines CreateProgramPipelines} + * + * @see Reference Page + */ + public static void glCreateProgramPipelines(@NativeType("GLuint *") int[] pipelines) { + GL45C.glCreateProgramPipelines(pipelines); + } + + /** + * Array version of: {@link #glCreateQueries CreateQueries} + * + * @see Reference Page + */ + public static void glCreateQueries(@NativeType("GLenum") int target, @NativeType("GLuint *") int[] ids) { + GL45C.glCreateQueries(target, ids); + } + + /** + * Array version of: {@link #glGetTextureSubImage GetTextureSubImage} + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Array version of: {@link #glGetTextureSubImage GetTextureSubImage} + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Array version of: {@link #glGetTextureSubImage GetTextureSubImage} + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Array version of: {@link #glGetTextureSubImage GetTextureSubImage} + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] pixels) { + GL45C.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") short[] pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") int[] pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") float[] pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") double[] pixels) { + GL45C.glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels); + } + + /** + * Array version of: {@link #glGetnMapdv GetnMapdv} + * + * @see Reference Page + */ + public static void glGetnMapdv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLdouble *") double[] data) { + long __functionAddress = GL.getICD().glGetnMapdv; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, query, data.length, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetnMapfv GetnMapfv} + * + * @see Reference Page + */ + public static void glGetnMapfv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLfloat *") float[] data) { + long __functionAddress = GL.getICD().glGetnMapfv; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, query, data.length, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetnMapiv GetnMapiv} + * + * @see Reference Page + */ + public static void glGetnMapiv(@NativeType("GLenum") int target, @NativeType("GLenum") int query, @NativeType("GLint *") int[] data) { + long __functionAddress = GL.getICD().glGetnMapiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, query, data.length, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetnPixelMapfv GetnPixelMapfv} + * + * @see Reference Page + */ + public static void glGetnPixelMapfv(@NativeType("GLenum") int map, @NativeType("GLfloat *") float[] data) { + long __functionAddress = GL.getICD().glGetnPixelMapfv; + if (CHECKS) { + check(__functionAddress); + } + callPV(map, data.length, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetnPixelMapuiv GetnPixelMapuiv} + * + * @see Reference Page + */ + public static void glGetnPixelMapuiv(@NativeType("GLenum") int map, @NativeType("GLuint *") int[] data) { + long __functionAddress = GL.getICD().glGetnPixelMapuiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(map, data.length, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetnPixelMapusv GetnPixelMapusv} + * + * @see Reference Page + */ + public static void glGetnPixelMapusv(@NativeType("GLenum") int map, @NativeType("GLushort *") short[] data) { + long __functionAddress = GL.getICD().glGetnPixelMapusv; + if (CHECKS) { + check(__functionAddress); + } + callPV(map, data.length, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetnTexImage GetnTexImage} + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] img) { + GL45C.glGetnTexImage(tex, level, format, type, img); + } + + /** + * Array version of: {@link #glGetnTexImage GetnTexImage} + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] img) { + GL45C.glGetnTexImage(tex, level, format, type, img); + } + + /** + * Array version of: {@link #glGetnTexImage GetnTexImage} + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] img) { + GL45C.glGetnTexImage(tex, level, format, type, img); + } + + /** + * Array version of: {@link #glGetnTexImage GetnTexImage} + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] img) { + GL45C.glGetnTexImage(tex, level, format, type, img); + } + + /** + * Array version of: {@link #glReadnPixels ReadnPixels} + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glReadnPixels ReadnPixels} + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glReadnPixels ReadnPixels} + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** + * Array version of: {@link #glGetnColorTable GetnColorTable} + * + * @see Reference Page + */ + public static void glGetnColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] table) { + long __functionAddress = GL.getICD().glGetnColorTable; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, format, type, table.length << 1, table, __functionAddress); + } + + /** + * Array version of: {@link #glGetnColorTable GetnColorTable} + * + * @see Reference Page + */ + public static void glGetnColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] table) { + long __functionAddress = GL.getICD().glGetnColorTable; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, format, type, table.length << 2, table, __functionAddress); + } + + /** + * Array version of: {@link #glGetnColorTable GetnColorTable} + * + * @see Reference Page + */ + public static void glGetnColorTable(@NativeType("GLenum") int target, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] table) { + long __functionAddress = GL.getICD().glGetnColorTable; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, format, type, table.length << 2, table, __functionAddress); + } + + /** + * Array version of: {@link #glGetnUniformfv GetnUniformfv} + * + * @see Reference Page + */ + public static void glGetnUniformfv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") float[] params) { + GL45C.glGetnUniformfv(program, location, params); + } + + /** + * Array version of: {@link #glGetnUniformdv GetnUniformdv} + * + * @see Reference Page + */ + public static void glGetnUniformdv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") double[] params) { + GL45C.glGetnUniformdv(program, location, params); + } + + /** + * Array version of: {@link #glGetnUniformiv GetnUniformiv} + * + * @see Reference Page + */ + public static void glGetnUniformiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") int[] params) { + GL45C.glGetnUniformiv(program, location, params); + } + + /** + * Array version of: {@link #glGetnUniformuiv GetnUniformuiv} + * + * @see Reference Page + */ + public static void glGetnUniformuiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") int[] params) { + GL45C.glGetnUniformuiv(program, location, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL45C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL45C.java new file mode 100644 index 000000000..17ef971f8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL45C.java @@ -0,0 +1,5639 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 4.5. Includes only Core Profile symbols. + * + *

    OpenGL 4.5 implementations support revision 4.50 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL45C extends GL44C { + + static { GL.initialize(); } + + /** Accepted by the {@code depth} parameter of {@link #glClipControl ClipControl}. */ + public static final int + GL_NEGATIVE_ONE_TO_ONE = 0x935E, + GL_ZERO_TO_ONE = 0x935F; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_CLIP_ORIGIN = 0x935C, + GL_CLIP_DEPTH_MODE = 0x935D; + + /** Accepted by the {@code mode} parameter of {@link GL30C#glBeginConditionalRender BeginConditionalRender}. */ + public static final int + GL_QUERY_WAIT_INVERTED = 0x8E17, + GL_QUERY_NO_WAIT_INVERTED = 0x8E18, + GL_QUERY_BY_REGION_WAIT_INVERTED = 0x8E19, + GL_QUERY_BY_REGION_NO_WAIT_INVERTED = 0x8E1A; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v. */ + public static final int + GL_MAX_CULL_DISTANCES = 0x82F9, + GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES = 0x82FA; + + /** Accepted by the {@code pname} parameter of GetTextureParameter{if}v and GetTextureParameterI{i ui}v. */ + public static final int GL_TEXTURE_TARGET = 0x1006; + + /** Accepted by the {@code pname} parameter of GetQueryObjectiv. */ + public static final int GL_QUERY_TARGET = 0x82EA; + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetFloatv, GetBooleanv GetDoublev and GetInteger64v. */ + public static final int GL_CONTEXT_RELEASE_BEHAVIOR = 0x82FB; + + /** Returned in {@code data} by GetIntegerv, GetFloatv, GetBooleanv GetDoublev and GetInteger64v when {@code pname} is {@link #GL_CONTEXT_RELEASE_BEHAVIOR CONTEXT_RELEASE_BEHAVIOR}. */ + public static final int GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH = 0x82FC; + + /** Returned by {@link #glGetGraphicsResetStatus GetGraphicsResetStatus}. */ + public static final int + GL_GUILTY_CONTEXT_RESET = 0x8253, + GL_INNOCENT_CONTEXT_RESET = 0x8254, + GL_UNKNOWN_CONTEXT_RESET = 0x8255; + + /** Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, and GetFloatv. */ + public static final int GL_RESET_NOTIFICATION_STRATEGY = 0x8256; + + /** Returned by GetIntegerv and related simple queries when {@code value} is {@link #GL_RESET_NOTIFICATION_STRATEGY RESET_NOTIFICATION_STRATEGY}. */ + public static final int + GL_LOSE_CONTEXT_ON_RESET = 0x8252, + GL_NO_RESET_NOTIFICATION = 0x8261; + + /** Returned by GetIntegerv when {@code pname} is CONTEXT_FLAGS. */ + public static final int GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT = 0x4; + + /** Returned by {@link GL11C#glGetError GetError}. */ + public static final int GL_CONTEXT_LOST = 0x507; + + protected GL45C() { + throw new UnsupportedOperationException(); + } + + // --- [ glClipControl ] --- + + /** + * Controls the clipping volume behavior. + * + *

    These parameters update the clip control origin and depth mode respectively. The initial value of the clip control origin is {@link GL20#GL_LOWER_LEFT LOWER_LEFT} and the + * initial value of the depth mode is {@link #GL_NEGATIVE_ONE_TO_ONE NEGATIVE_ONE_TO_ONE}.

    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if ClipControl is executed between the execution of {@link GL11#glBegin Begin} and the corresponding + * execution of {@link GL11#glEnd End}.

    + * + * @param origin the clip origin. One of:
    {@link GL20#GL_LOWER_LEFT LOWER_LEFT}{@link GL20#GL_UPPER_LEFT UPPER_LEFT}
    + * @param depth the clip depth mode. One of:
    {@link #GL_NEGATIVE_ONE_TO_ONE NEGATIVE_ONE_TO_ONE}{@link #GL_ZERO_TO_ONE ZERO_TO_ONE}
    + * + * @see Reference Page + */ + public static native void glClipControl(@NativeType("GLenum") int origin, @NativeType("GLenum") int depth); + + // --- [ glCreateTransformFeedbacks ] --- + + /** + * Unsafe version of: {@link #glCreateTransformFeedbacks CreateTransformFeedbacks} + * + * @param n the number of transform feedback object names to create + */ + public static native void nglCreateTransformFeedbacks(int n, long ids); + + /** + * Returns {@code n} previously unused transform feedback object names in {@code ids}, each representing a new state vector. + * + * @param ids the buffer in which to return the names + * + * @see Reference Page + */ + public static void glCreateTransformFeedbacks(@NativeType("GLuint *") IntBuffer ids) { + nglCreateTransformFeedbacks(ids.remaining(), memAddress(ids)); + } + + /** + * Returns {@code n} previously unused transform feedback object names in {@code ids}, each representing a new state vector. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateTransformFeedbacks() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.callocInt(1); + nglCreateTransformFeedbacks(1, memAddress(ids)); + return ids.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glTransformFeedbackBufferBase ] --- + + /** + * Binds a buffer object to a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param index the transform feedback stream index + * @param buffer the name of an existing buffer object + * + * @see Reference Page + */ + public static native void glTransformFeedbackBufferBase(@NativeType("GLuint") int xfb, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer); + + // --- [ glTransformFeedbackBufferRange ] --- + + /** + * Binds a region of a buffer object to a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param index the transform feedback stream index + * @param buffer the name of an existing buffer object + * @param offset the starting offset in basic machine units into the buffer object + * @param size the amount of data in machine units + * + * @see Reference Page + */ + public static native void glTransformFeedbackBufferRange(@NativeType("GLuint") int xfb, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size); + + // --- [ glGetTransformFeedbackiv ] --- + + /** Unsafe version of: {@link #glGetTransformFeedbackiv GetTransformFeedbackiv} */ + public static native void nglGetTransformFeedbackiv(int xfb, int pname, long param); + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL42#GL_TRANSFORM_FEEDBACK_PAUSED TRANSFORM_FEEDBACK_PAUSED}{@link GL42#GL_TRANSFORM_FEEDBACK_ACTIVE TRANSFORM_FEEDBACK_ACTIVE}
    + * @param param the buffer in which to return the parameter value + * + * @see Reference Page + */ + public static void glGetTransformFeedbackiv(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + if (CHECKS) { + check(param, 1); + } + nglGetTransformFeedbackiv(xfb, pname, memAddress(param)); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL42#GL_TRANSFORM_FEEDBACK_PAUSED TRANSFORM_FEEDBACK_PAUSED}{@link GL42#GL_TRANSFORM_FEEDBACK_ACTIVE TRANSFORM_FEEDBACK_ACTIVE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTransformFeedbacki(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer param = stack.callocInt(1); + nglGetTransformFeedbackiv(xfb, pname, memAddress(param)); + return param.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTransformFeedbacki_v ] --- + + /** Unsafe version of: {@link #glGetTransformFeedbacki_v GetTransformFeedbacki_v} */ + public static native void nglGetTransformFeedbacki_v(int xfb, int pname, int index, long param); + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. Must be:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_BINDING TRANSFORM_FEEDBACK_BUFFER_BINDING}
    + * @param index the transform feedback stream index + * @param param the buffer in which to return the parameter value + * + * @see Reference Page + */ + public static void glGetTransformFeedbacki_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer param) { + if (CHECKS) { + check(param, 1); + } + nglGetTransformFeedbacki_v(xfb, pname, index, memAddress(param)); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. Must be:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_BINDING TRANSFORM_FEEDBACK_BUFFER_BINDING}
    + * @param index the transform feedback stream index + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTransformFeedbacki(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer param = stack.callocInt(1); + nglGetTransformFeedbacki_v(xfb, pname, index, memAddress(param)); + return param.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTransformFeedbacki64_v ] --- + + /** Unsafe version of: {@link #glGetTransformFeedbacki64_v GetTransformFeedbacki64_v} */ + public static native void nglGetTransformFeedbacki64_v(int xfb, int pname, int index, long param); + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_START TRANSFORM_FEEDBACK_BUFFER_START}{@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_SIZE TRANSFORM_FEEDBACK_BUFFER_SIZE}
    + * @param index the transform feedback stream index + * @param param the buffer in which to return the parameter value + * + * @see Reference Page + */ + public static void glGetTransformFeedbacki64_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint64 *") LongBuffer param) { + if (CHECKS) { + check(param, 1); + } + nglGetTransformFeedbacki64_v(xfb, pname, index, memAddress(param)); + } + + /** + * Returns information about a transform feedback object. + * + * @param xfb zero or the name of an existing transform feedback object + * @param pname the parameter to query. One of:
    {@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_START TRANSFORM_FEEDBACK_BUFFER_START}{@link GL30#GL_TRANSFORM_FEEDBACK_BUFFER_SIZE TRANSFORM_FEEDBACK_BUFFER_SIZE}
    + * @param index the transform feedback stream index + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetTransformFeedbacki64(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer param = stack.callocLong(1); + nglGetTransformFeedbacki64_v(xfb, pname, index, memAddress(param)); + return param.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCreateBuffers ] --- + + /** + * Unsafe version of: {@link #glCreateBuffers CreateBuffers} + * + * @param n the number of buffer names to create + */ + public static native void nglCreateBuffers(int n, long buffers); + + /** + * Returns {@code n} previously unused buffer names in {@code buffers}, each representing a new buffer object initialized as if it had been bound to an + * unspecified target. + * + * @param buffers the buffer in which to return the names + * + * @see Reference Page + */ + public static void glCreateBuffers(@NativeType("GLuint *") IntBuffer buffers) { + nglCreateBuffers(buffers.remaining(), memAddress(buffers)); + } + + /** + * Returns {@code n} previously unused buffer names in {@code buffers}, each representing a new buffer object initialized as if it had been bound to an + * unspecified target. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateBuffers() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer buffers = stack.callocInt(1); + nglCreateBuffers(1, memAddress(buffers)); + return buffers.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glNamedBufferStorage ] --- + + /** + * Unsafe version of: {@link #glNamedBufferStorage NamedBufferStorage} + * + * @param size the size of the data store in basic machine units + */ + public static native void nglNamedBufferStorage(int buffer, long size, long data, int flags); + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param size the size of the data store in basic machine units + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("GLsizeiptr") long size, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorage(buffer, size, NULL, flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") ByteBuffer data, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorage(buffer, data.remaining(), memAddress(data), flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") ShortBuffer data, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorage(buffer, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data), flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") IntBuffer data, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorage(buffer, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") FloatBuffer data, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorage(buffer, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), flags); + } + + /** + * DSA version of {@link GL44C#glBufferStorage BufferStorage}. + * + * @param buffer the buffer object name + * @param data the address in client memory of the data that should be used to initialize the buffer's data store. If {@code data} is {@code NULL}, the data store of the + * buffer is created, but contains undefined data. Otherwise, {@code data} should point to an array of at least {@code size} basic machine units. + * @param flags the bitwise {@code OR} of flags describing the intended usage of the buffer object's data store by the application. Valid flags and their meanings + * are as follows: + * + *
      + *
    • {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT} – The contents of the data store may be updated after creation through calls to + * {@link GL15C#glBufferSubData BufferSubData}. If this bit is not set, the buffer content may not be directly updated by the client. The {@code data} + * argument may be used to specify the initial content of the buffer's data store regardless of the presence of the {@link GL44#GL_DYNAMIC_STORAGE_BIT DYNAMIC_STORAGE_BIT}. + * Regardless of the presence of this bit, buffers may always be updated with server-side calls such as {@link GL31C#glCopyBufferSubData CopyBufferSubData} and + * {@link GL43C#glClearBufferSubData ClearBufferSubData}.
    • + *
    • {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} – The buffer's data store may be mapped by the client for read access and a pointer in the client's address space + * obtained that may be read from.
    • + *
    • {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT} – The buffer's data store may be mapped by the client for write access and a pointer in the client's address + * space obtained that may be written to.
    • + *
    • {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT} – The client may request that the server read from or write to the buffer while it is mapped. The client's + * pointer to the data store remains valid so long as the data store is mapped, even during execution of drawing or dispatch commands.
    • + *
    • {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} – Shared access to buffers that are simultaneously mapped for client access and are used by the server will be + * coherent, so long as that mapping is performed using MapBufferRange. That is, data written to the store by either the client or server will be + * immediately visible to the other with no further action taken by the application. In particular: + * + *
        + *
      • If {@code MAP_COHERENT_BIT} is not set and the client performs a write followed by a call to the {@link GL42C#glMemoryBarrier MemoryBarrier} command with + * the {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the client performs a write, then in subsequent commands the server will see the writes.
      • + *
      • If {@code MAP_COHERENT_BIT} is not set and the server performs a write, the application must call {@link GL42C#glMemoryBarrier MemoryBarrier} with the + * {@link GL44#GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT CLIENT_MAPPED_BUFFER_BARRIER_BIT} set and then call {@link GL32C#glFenceSync FenceSync} with {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or + * {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
      • If {@code MAP_COHERENT_BIT} is set and the server does a write, the app must call {@link GL32C#glFenceSync FenceSync} with + * {@link GL32#GL_SYNC_GPU_COMMANDS_COMPLETE SYNC_GPU_COMMANDS_COMPLETE} (or {@link GL11C#glFinish Finish}). Then the CPU will see the writes after the sync is complete.
      • + *
    • + *
    • {@link GL44#GL_CLIENT_STORAGE_BIT CLIENT_STORAGE_BIT} – When all other criteria for the buffer storage allocation are met, this bit may be used by an + * implementation to determine whether to use storage that is local to the server or to the client to serve as the backing store for the buffer.
    • + *
    + * + *

    If {@code flags} contains {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}, it must also contain at least one of {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT} or {@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}.

    + * + *

    It is an error to specify {@link GL44#GL_MAP_COHERENT_BIT MAP_COHERENT_BIT} without also specifying {@link GL44#GL_MAP_PERSISTENT_BIT MAP_PERSISTENT_BIT}.

    + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") DoubleBuffer data, @NativeType("GLbitfield") int flags) { + nglNamedBufferStorage(buffer, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data), flags); + } + + // --- [ glNamedBufferData ] --- + + /** + * Unsafe version of: {@link #glNamedBufferData NamedBufferData} + * + * @param size the size in bytes of the buffer object's new data store + */ + public static native void nglNamedBufferData(int buffer, long size, long data, int usage); + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param size the size in bytes of the buffer object's new data store + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int usage) { + nglNamedBufferData(buffer, size, NULL, usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") ByteBuffer data, @NativeType("GLenum") int usage) { + nglNamedBufferData(buffer, data.remaining(), memAddress(data), usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") ShortBuffer data, @NativeType("GLenum") int usage) { + nglNamedBufferData(buffer, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data), usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") IntBuffer data, @NativeType("GLenum") int usage) { + nglNamedBufferData(buffer, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") LongBuffer data, @NativeType("GLenum") int usage) { + nglNamedBufferData(buffer, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data), usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") FloatBuffer data, @NativeType("GLenum") int usage) { + nglNamedBufferData(buffer, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data), usage); + } + + /** + * DSA version of {@link GL15C#glBufferData BufferData}. + * + * @param data a pointer to data that will be copied into the data store for initialization, or {@code NULL} if no data is to be copied + * @param usage the expected usage pattern of the data store. One of:
    {@link GL15#GL_STREAM_DRAW STREAM_DRAW}{@link GL15#GL_STREAM_READ STREAM_READ}{@link GL15#GL_STREAM_COPY STREAM_COPY}{@link GL15#GL_STATIC_DRAW STATIC_DRAW}{@link GL15#GL_STATIC_READ STATIC_READ}{@link GL15#GL_STATIC_COPY STATIC_COPY}{@link GL15#GL_DYNAMIC_DRAW DYNAMIC_DRAW}
    {@link GL15#GL_DYNAMIC_READ DYNAMIC_READ}{@link GL15#GL_DYNAMIC_COPY DYNAMIC_COPY}
    + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") DoubleBuffer data, @NativeType("GLenum") int usage) { + nglNamedBufferData(buffer, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data), usage); + } + + // --- [ glNamedBufferSubData ] --- + + /** + * Unsafe version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @param size the size in bytes of the data store region being replaced + */ + public static native void nglNamedBufferSubData(int buffer, long offset, long size, long data); + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") ByteBuffer data) { + nglNamedBufferSubData(buffer, offset, data.remaining(), memAddress(data)); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") ShortBuffer data) { + nglNamedBufferSubData(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data)); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") IntBuffer data) { + nglNamedBufferSubData(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") LongBuffer data) { + nglNamedBufferSubData(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") FloatBuffer data) { + nglNamedBufferSubData(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * DSA version of {@link GL15C#glBufferSubData BufferSubData}. + * + * @param offset the offset into the buffer object's data store where data replacement will begin, measured in bytes + * @param data a pointer to the new data that will be copied into the data store + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") DoubleBuffer data) { + nglNamedBufferSubData(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + // --- [ glCopyNamedBufferSubData ] --- + + /** + * DSA version of {@link GL31C#glCopyBufferSubData CopyBufferSubData}. + * + * @param readBuffer the source buffer object name + * @param writeBuffer the destination buffer object name + * @param readOffset the source buffer object offset, in bytes + * @param writeOffset the destination buffer object offset, in bytes + * @param size the number of bytes to copy + * + * @see Reference Page + */ + public static native void glCopyNamedBufferSubData(@NativeType("GLuint") int readBuffer, @NativeType("GLuint") int writeBuffer, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size); + + // --- [ glClearNamedBufferData ] --- + + /** Unsafe version of: {@link #glClearNamedBufferData ClearNamedBufferData} */ + public static native void nglClearNamedBufferData(int buffer, int internalformat, int format, int type, long data); + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + nglClearNamedBufferData(buffer, internalformat, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + nglClearNamedBufferData(buffer, internalformat, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + nglClearNamedBufferData(buffer, internalformat, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link GL43C#glClearBufferData ClearBufferData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + nglClearNamedBufferData(buffer, internalformat, format, type, memAddressSafe(data)); + } + + // --- [ glClearNamedBufferSubData ] --- + + /** Unsafe version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} */ + public static native void nglClearNamedBufferSubData(int buffer, int internalformat, long offset, long size, int format, int type, long data); + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ByteBuffer data) { + nglClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") ShortBuffer data) { + nglClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") IntBuffer data) { + nglClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + /** + * DSA version of {@link GL43C#glClearBufferSubData ClearBufferSubData}. + * + * @param buffer the buffer object name + * @param internalformat the internal format with which the data will be stored in the buffer object + * @param offset the offset, in basic machine units into the buffer object's data store at which to start filling + * @param size the size, in basic machine units of the range of the data store to fill + * @param format the format of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the type of the data in memory addressed by {@code data}. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param data the buffer containing the data to be used as the source of the constant fill value. The elements of data are converted by the GL into the format + * specified by internalformat, and then used to fill the specified range of the destination buffer. If data is {@code NULL}, then it is ignored and the + * sub-range of the buffer is filled with zeros. + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") FloatBuffer data) { + nglClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, memAddressSafe(data)); + } + + // --- [ glMapNamedBuffer ] --- + + /** Unsafe version of: {@link #glMapNamedBuffer MapNamedBuffer} */ + public static native long nglMapNamedBuffer(int buffer, int access); + + /** + * DSA version of {@link GL15C#glMapBuffer MapBuffer}. + * + * @param buffer the buffer object name + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15#GL_READ_ONLY READ_ONLY}{@link GL15#GL_WRITE_ONLY WRITE_ONLY}{@link GL15#GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBuffer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access) { + long __result = nglMapNamedBuffer(buffer, access); + return memByteBufferSafe(__result, glGetNamedBufferParameteri(buffer, GL15.GL_BUFFER_SIZE)); + } + + /** + * DSA version of {@link GL15C#glMapBuffer MapBuffer}. + * + * @param buffer the buffer object name + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15#GL_READ_ONLY READ_ONLY}{@link GL15#GL_WRITE_ONLY WRITE_ONLY}{@link GL15#GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBuffer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access, @Nullable ByteBuffer old_buffer) { + long __result = nglMapNamedBuffer(buffer, access); + int length = glGetNamedBufferParameteri(buffer, GL15.GL_BUFFER_SIZE); + return apiGetMappedBuffer(old_buffer, __result, length); + } + + /** + * DSA version of {@link GL15C#glMapBuffer MapBuffer}. + * + * @param buffer the buffer object name + * @param access the access policy, indicating whether it will be possible to read from, write to, or both read from and write to the buffer object's mapped data store. One of:
    {@link GL15#GL_READ_ONLY READ_ONLY}{@link GL15#GL_WRITE_ONLY WRITE_ONLY}{@link GL15#GL_READ_WRITE READ_WRITE}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBuffer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access, long length, @Nullable ByteBuffer old_buffer) { + long __result = nglMapNamedBuffer(buffer, access); + return apiGetMappedBuffer(old_buffer, __result, (int)length); + } + + // --- [ glMapNamedBufferRange ] --- + + /** Unsafe version of: {@link #glMapNamedBufferRange MapNamedBufferRange} */ + public static native long nglMapNamedBufferRange(int buffer, long offset, long length, int access); + + /** + * DSA version of {@link GL30C#glMapBufferRange MapBufferRange}. + * + * @param buffer the buffer object name + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link GL30#GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link GL30#GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link GL30#GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link GL30#GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBufferRange(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access) { + long __result = nglMapNamedBufferRange(buffer, offset, length, access); + return memByteBufferSafe(__result, (int)length); + } + + /** + * DSA version of {@link GL30C#glMapBufferRange MapBufferRange}. + * + * @param buffer the buffer object name + * @param offset the starting offset within the buffer of the range to be mapped + * @param length the length of the range to be mapped + * @param access a combination of access flags indicating the desired access to the range. One or more of:
    {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}{@link GL30#GL_MAP_INVALIDATE_RANGE_BIT MAP_INVALIDATE_RANGE_BIT}{@link GL30#GL_MAP_INVALIDATE_BUFFER_BIT MAP_INVALIDATE_BUFFER_BIT}
    {@link GL30#GL_MAP_FLUSH_EXPLICIT_BIT MAP_FLUSH_EXPLICIT_BIT}{@link GL30#GL_MAP_UNSYNCHRONIZED_BIT MAP_UNSYNCHRONIZED_BIT}
    + * + * @see Reference Page + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapNamedBufferRange(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length, @NativeType("GLbitfield") int access, @Nullable ByteBuffer old_buffer) { + long __result = nglMapNamedBufferRange(buffer, offset, length, access); + return apiGetMappedBuffer(old_buffer, __result, (int)length); + } + + // --- [ glUnmapNamedBuffer ] --- + + /** + * DSA version of {@link GL15C#glUnmapBuffer UnmapBuffer}. + * + * @param buffer the buffer object name + * + * @see Reference Page + */ + @NativeType("GLboolean") + public static native boolean glUnmapNamedBuffer(@NativeType("GLuint") int buffer); + + // --- [ glFlushMappedNamedBufferRange ] --- + + /** + * DSA version of {@link GL30C#glFlushMappedBufferRange FlushMappedBufferRange}. + * + * @param buffer the buffer object name + * @param offset the start of the buffer subrange, in basic machine units + * @param length the length of the buffer subrange, in basic machine units + * + * @see Reference Page + */ + public static native void glFlushMappedNamedBufferRange(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long length); + + // --- [ glGetNamedBufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedBufferParameteriv GetNamedBufferParameteriv} */ + public static native void nglGetNamedBufferParameteriv(int buffer, int pname, long params); + + /** + * DSA version of {@link GL15C#glGetBufferParameteriv GetBufferParameteriv}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * @param params the requested parameter + * + * @see Reference Page + */ + public static void glGetNamedBufferParameteriv(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedBufferParameteriv(buffer, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL15C#glGetBufferParameteriv GetBufferParameteriv}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetNamedBufferParameteri(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetNamedBufferParameteriv(buffer, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetNamedBufferParameteri64v ] --- + + /** Unsafe version of: {@link #glGetNamedBufferParameteri64v GetNamedBufferParameteri64v} */ + public static native void nglGetNamedBufferParameteri64v(int buffer, int pname, long params); + + /** + * DSA version of {@link GL32C#glGetBufferParameteri64v GetBufferParameteri64v}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * @param params the requested parameter + * + * @see Reference Page + */ + public static void glGetNamedBufferParameteri64v(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedBufferParameteri64v(buffer, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL32C#glGetBufferParameteri64v GetBufferParameteri64v}. + * + * @param buffer the buffer object name + * @param pname the symbolic name of a buffer object parameter. One of:
    {@link GL15#GL_BUFFER_SIZE BUFFER_SIZE}{@link GL15#GL_BUFFER_USAGE BUFFER_USAGE}{@link GL15#GL_BUFFER_ACCESS BUFFER_ACCESS}{@link GL15#GL_BUFFER_MAPPED BUFFER_MAPPED}
    {@link GL30#GL_BUFFER_ACCESS_FLAGS BUFFER_ACCESS_FLAGS}{@link GL30#GL_BUFFER_MAP_LENGTH BUFFER_MAP_LENGTH}{@link GL30#GL_BUFFER_MAP_OFFSET BUFFER_MAP_OFFSET}{@link GL44#GL_BUFFER_IMMUTABLE_STORAGE BUFFER_IMMUTABLE_STORAGE}
    {@link GL44#GL_BUFFER_STORAGE_FLAGS BUFFER_STORAGE_FLAGS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetNamedBufferParameteri64(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetNamedBufferParameteri64v(buffer, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetNamedBufferPointerv ] --- + + /** Unsafe version of: {@link #glGetNamedBufferPointerv GetNamedBufferPointerv} */ + public static native void nglGetNamedBufferPointerv(int buffer, int pname, long params); + + /** + * DSA version of {@link GL15C#glGetBufferPointerv GetBufferPointerv}. + * + * @param buffer the buffer object name + * @param pname the pointer to be returned. Must be:
    {@link GL15#GL_BUFFER_MAP_POINTER BUFFER_MAP_POINTER}
    + * @param params the pointer value specified by {@code pname} + * + * @see Reference Page + */ + public static void glGetNamedBufferPointerv(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("void **") PointerBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedBufferPointerv(buffer, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL15C#glGetBufferPointerv GetBufferPointerv}. + * + * @param buffer the buffer object name + * @param pname the pointer to be returned. Must be:
    {@link GL15#GL_BUFFER_MAP_POINTER BUFFER_MAP_POINTER}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetNamedBufferPointer(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer params = stack.callocPointer(1); + nglGetNamedBufferPointerv(buffer, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetNamedBufferSubData ] --- + + /** + * Unsafe version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @param size the size in bytes of the data store region being returned + */ + public static native void nglGetNamedBufferSubData(int buffer, long offset, long size, long data); + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") ByteBuffer data) { + nglGetNamedBufferSubData(buffer, offset, data.remaining(), memAddress(data)); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") ShortBuffer data) { + nglGetNamedBufferSubData(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data)); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") IntBuffer data) { + nglGetNamedBufferSubData(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") LongBuffer data) { + nglGetNamedBufferSubData(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") FloatBuffer data) { + nglGetNamedBufferSubData(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + /** + * DSA version of {@link GL15C#glGetBufferSubData GetBufferSubData}. + * + * @param buffer the buffer object name + * @param offset the offset into the buffer object's data store from which data will be returned, measured in bytes + * @param data a pointer to the location where buffer object data is returned + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") DoubleBuffer data) { + nglGetNamedBufferSubData(buffer, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + // --- [ glCreateFramebuffers ] --- + + /** + * Unsafe version of: {@link #glCreateFramebuffers CreateFramebuffers} + * + * @param n the number of framebuffer names to create + */ + public static native void nglCreateFramebuffers(int n, long framebuffers); + + /** + * Returns {@code n} previously unused framebuffer names in {@code framebuffers}, each representing a new framebuffer object. + * + * @param framebuffers the buffer in which to store the framebuffer names + * + * @see Reference Page + */ + public static void glCreateFramebuffers(@NativeType("GLuint *") IntBuffer framebuffers) { + nglCreateFramebuffers(framebuffers.remaining(), memAddress(framebuffers)); + } + + /** + * Returns {@code n} previously unused framebuffer names in {@code framebuffers}, each representing a new framebuffer object. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateFramebuffers() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer framebuffers = stack.callocInt(1); + nglCreateFramebuffers(1, memAddress(framebuffers)); + return framebuffers.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glNamedFramebufferRenderbuffer ] --- + + /** + * DSA version of {@link GL30C#glFramebufferRenderbuffer FramebufferRenderbuffer}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param renderbuffertarget the renderbuffer target. Must be:
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}
    + * @param renderbuffer the name of an existing renderbuffer object of type {@code renderbuffertarget} to attach + * + * @see Reference Page + */ + public static native void glNamedFramebufferRenderbuffer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int renderbuffertarget, @NativeType("GLuint") int renderbuffer); + + // --- [ glNamedFramebufferParameteri ] --- + + /** + * DSA version of {@link GL43C#glFramebufferParameteri FramebufferParameteri}. + * + * @param framebuffer the framebuffer name + * @param pname a token indicating the parameter to be modified. One of:
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param param the new value for the parameter named {@code pname} + * + * @see Reference Page + */ + public static native void glNamedFramebufferParameteri(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glNamedFramebufferTexture ] --- + + /** + * DSA version of {@link GL32C#glFramebufferTexture FramebufferTexture}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment point of the framebuffer + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * + * @see Reference Page + */ + public static native void glNamedFramebufferTexture(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glNamedFramebufferTextureLayer ] --- + + /** + * DSA version of {@link GL30C#glFramebufferTextureLayer FramebufferTextureLayer}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * @param layer the layer of {@code texture} to attach. + * + * @see Reference Page + */ + public static native void glNamedFramebufferTextureLayer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int layer); + + // --- [ glNamedFramebufferDrawBuffer ] --- + + /** + * DSA version of {@link GL11C#glDrawBuffer DrawBuffer}. + * + * @param framebuffer the framebuffer name + * @param buf the color buffer to draw to. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_LEFT LEFT}
    {@link GL11#GL_RIGHT RIGHT}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static native void glNamedFramebufferDrawBuffer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buf); + + // --- [ glNamedFramebufferDrawBuffers ] --- + + /** + * Unsafe version of: {@link #glNamedFramebufferDrawBuffers NamedFramebufferDrawBuffers} + * + * @param n the number of buffers in {@code bufs} + */ + public static native void nglNamedFramebufferDrawBuffers(int framebuffer, int n, long bufs); + + /** + * DSA version of {@link GL20C#glDrawBuffers DrawBuffers}. + * + * @param framebuffer the framebuffer name + * @param bufs an array of symbolic constants specifying the buffers into which fragment colors or data values will be written. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}
    GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static void glNamedFramebufferDrawBuffers(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") IntBuffer bufs) { + nglNamedFramebufferDrawBuffers(framebuffer, bufs.remaining(), memAddress(bufs)); + } + + /** + * DSA version of {@link GL20C#glDrawBuffers DrawBuffers}. + * + * @param framebuffer the framebuffer name + * + * @see Reference Page + */ + public static void glNamedFramebufferDrawBuffers(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int buf) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer bufs = stack.ints(buf); + nglNamedFramebufferDrawBuffers(framebuffer, 1, memAddress(bufs)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glNamedFramebufferReadBuffer ] --- + + /** + * DSA version of {@link GL11C#glReadBuffer ReadBuffer}. + * + * @param framebuffer the framebuffer name + * @param src the color buffer to read from. One of:
    {@link GL11#GL_NONE NONE}{@link GL11#GL_FRONT_LEFT FRONT_LEFT}{@link GL11#GL_FRONT_RIGHT FRONT_RIGHT}{@link GL11#GL_BACK_LEFT BACK_LEFT}{@link GL11#GL_BACK_RIGHT BACK_RIGHT}{@link GL11#GL_FRONT FRONT}{@link GL11#GL_BACK BACK}{@link GL11#GL_LEFT LEFT}
    {@link GL11#GL_RIGHT RIGHT}{@link GL11#GL_FRONT_AND_BACK FRONT_AND_BACK}{@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}GL30.GL_COLOR_ATTACHMENT[1-15]
    + * + * @see Reference Page + */ + public static native void glNamedFramebufferReadBuffer(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int src); + + // --- [ glInvalidateNamedFramebufferData ] --- + + /** + * Unsafe version of: {@link #glInvalidateNamedFramebufferData InvalidateNamedFramebufferData} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static native void nglInvalidateNamedFramebufferData(int framebuffer, int numAttachments, long attachments); + + /** + * DSA version of {@link GL43C#glInvalidateFramebuffer InvalidateFramebuffer}. + * + * @param framebuffer the framebuffer name + * @param attachments the address of an array identifying the attachments to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") IntBuffer attachments) { + nglInvalidateNamedFramebufferData(framebuffer, attachments.remaining(), memAddress(attachments)); + } + + /** + * DSA version of {@link GL43C#glInvalidateFramebuffer InvalidateFramebuffer}. + * + * @param framebuffer the framebuffer name + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int attachment) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer attachments = stack.ints(attachment); + nglInvalidateNamedFramebufferData(framebuffer, 1, memAddress(attachments)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glInvalidateNamedFramebufferSubData ] --- + + /** + * Unsafe version of: {@link #glInvalidateNamedFramebufferSubData InvalidateNamedFramebufferSubData} + * + * @param numAttachments the number of entries in the {@code attachments} array + */ + public static native void nglInvalidateNamedFramebufferSubData(int framebuffer, int numAttachments, long attachments, int x, int y, int width, int height); + + /** + * DSA version of {@link GL43C#glInvalidateSubFramebuffer InvalidateSubFramebuffer}. + * + * @param framebuffer the framebuffer name + * @param attachments an array identifying the attachments to be invalidated + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferSubData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") IntBuffer attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + nglInvalidateNamedFramebufferSubData(framebuffer, attachments.remaining(), memAddress(attachments), x, y, width, height); + } + + /** + * DSA version of {@link GL43C#glInvalidateSubFramebuffer InvalidateSubFramebuffer}. + * + * @param framebuffer the framebuffer name + * @param x the X offset of the region to be invalidated + * @param y the Y offset of the region to be invalidated + * @param width the width of the region to be invalidated + * @param height the height of the region to be invalidated + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferSubData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int attachment, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer attachments = stack.ints(attachment); + nglInvalidateNamedFramebufferSubData(framebuffer, 1, memAddress(attachments), x, y, width, height); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glClearNamedFramebufferiv ] --- + + /** Unsafe version of: {@link #glClearNamedFramebufferiv ClearNamedFramebufferiv} */ + public static native void nglClearNamedFramebufferiv(int framebuffer, int buffer, int drawbuffer, long value); + + /** + * DSA version of {@link GL30C#glClearBufferiv ClearBufferiv}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. One of:
    {@link GL11#GL_COLOR COLOR}{@link GL11#GL_STENCIL STENCIL}
    + * @param drawbuffer the draw buffer to clear + * @param value for color buffers, a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to. For stencil buffers, a pointer to a + * single stencil value to clear the buffer to. + * + * @see Reference Page + */ + public static void glClearNamedFramebufferiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, memAddress(value)); + } + + // --- [ glClearNamedFramebufferuiv ] --- + + /** Unsafe version of: {@link #glClearNamedFramebufferuiv ClearNamedFramebufferuiv} */ + public static native void nglClearNamedFramebufferuiv(int framebuffer, int buffer, int drawbuffer, long value); + + /** + * DSA version of {@link GL30C#glClearBufferuiv ClearBufferuiv}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. Must be:
    {@link GL11#GL_COLOR COLOR}
    + * @param drawbuffer the draw buffer to clear + * @param value a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to + * + * @see Reference Page + */ + public static void glClearNamedFramebufferuiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") IntBuffer value) { + if (CHECKS) { + check(value, 4); + } + nglClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, memAddress(value)); + } + + // --- [ glClearNamedFramebufferfv ] --- + + /** Unsafe version of: {@link #glClearNamedFramebufferfv ClearNamedFramebufferfv} */ + public static native void nglClearNamedFramebufferfv(int framebuffer, int buffer, int drawbuffer, long value); + + /** + * DSA version of {@link GL30C#glClearBufferfv ClearBufferfv}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. One of:
    {@link GL11#GL_COLOR COLOR}{@link GL11#GL_DEPTH DEPTH}
    + * @param drawbuffer the draw buffer to clear + * @param value for color buffers, a pointer to a four-element vector specifying R, G, B and A values to clear the buffer to. For depth buffers, a pointer to a + * single depth value to clear the buffer to. + * + * @see Reference Page + */ + public static void glClearNamedFramebufferfv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat const *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, memAddress(value)); + } + + // --- [ glClearNamedFramebufferfi ] --- + + /** + * DSA version of {@link GL30C#glClearBufferfi ClearBufferfi}. + * + * @param framebuffer the framebuffer name + * @param buffer the buffer to clear. Must be:
    {@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param drawbuffer the draw buffer to clear + * @param depth the depth value to clear the buffer to + * @param stencil the stencil value to clear the buffer to + * + * @see Reference Page + */ + public static native void glClearNamedFramebufferfi(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat") float depth, @NativeType("GLint") int stencil); + + // --- [ glBlitNamedFramebuffer ] --- + + /** + * DSA version of {@link GL30C#glBlitFramebuffer BlitFramebuffer}. + * + * @param readFramebuffer the source framebuffer name + * @param drawFramebuffer the destination framebuffer name + * @param srcX0 the lower-left coordinate of the source rectangle within the read buffer + * @param srcY0 the upper-left coordinate of the source rectangle within the read buffer + * @param srcX1 the lower-right coordinate of the source rectangle within the read buffer + * @param srcY1 the upper-right coordinate of the source rectangle within the read buffer + * @param dstX0 the lower-left coordinate of the destination rectangle within the write buffer + * @param dstY0 the upper-left coordinate of the destination rectangle within the write buffer + * @param dstX1 the lower-right coordinate of the destination rectangle within the write buffer + * @param dstY1 the upper-right coordinate of the destination rectangle within the write buffer + * @param mask the bitwise OR of the flags indicating which buffers are to be copied. One of:
    {@link GL11#GL_COLOR_BUFFER_BIT COLOR_BUFFER_BIT}{@link GL11#GL_DEPTH_BUFFER_BIT DEPTH_BUFFER_BIT}{@link GL11#GL_STENCIL_BUFFER_BIT STENCIL_BUFFER_BIT}
    + * @param filter the interpolation to be applied if the image is stretched. One of:
    {@link GL11#GL_NEAREST NEAREST}{@link GL11#GL_LINEAR LINEAR}
    + * + * @see Reference Page + */ + public static native void glBlitNamedFramebuffer(@NativeType("GLuint") int readFramebuffer, @NativeType("GLuint") int drawFramebuffer, @NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter); + + // --- [ glCheckNamedFramebufferStatus ] --- + + /** + * DSA version of {@link GL30C#glCheckFramebufferStatus CheckFramebufferStatus}. + * + * @param framebuffer the framebuffer name + * @param target the target of the framebuffer completeness check. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * + * @see Reference Page + */ + @NativeType("GLenum") + public static native int glCheckNamedFramebufferStatus(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int target); + + // --- [ glGetNamedFramebufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedFramebufferParameteriv GetNamedFramebufferParameteriv} */ + public static native void nglGetNamedFramebufferParameteriv(int framebuffer, int pname, long params); + + /** + * DSA version of {@link GL43C#glGetFramebufferParameteriv GetFramebufferParameteriv}. + * + * @param framebuffer the framebuffer name + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * @param params a variable to receive the value of the parameter named {@code pname} + * + * @see Reference Page + */ + public static void glGetNamedFramebufferParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedFramebufferParameteriv(framebuffer, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL43C#glGetFramebufferParameteriv GetFramebufferParameteriv}. + * + * @param framebuffer the framebuffer name + * @param pname a token indicating the parameter to be retrieved. One of:
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_WIDTH FRAMEBUFFER_DEFAULT_WIDTH}{@link GL43#GL_FRAMEBUFFER_DEFAULT_HEIGHT FRAMEBUFFER_DEFAULT_HEIGHT}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_LAYERS FRAMEBUFFER_DEFAULT_LAYERS}{@link GL43#GL_FRAMEBUFFER_DEFAULT_SAMPLES FRAMEBUFFER_DEFAULT_SAMPLES}
    {@link GL43#GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetNamedFramebufferParameteri(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetNamedFramebufferParameteriv(framebuffer, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetNamedFramebufferAttachmentParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedFramebufferAttachmentParameteriv GetNamedFramebufferAttachmentParameteriv} */ + public static native void nglGetNamedFramebufferAttachmentParameteriv(int framebuffer, int attachment, int pname, long params); + + /** + * DSA version of {@link GL30C#glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment within {@code target}. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + * @param params an array to receive the value of the queried parameter + * + * @see Reference Page + */ + public static void glGetNamedFramebufferAttachmentParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL30C#glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv}. + * + * @param framebuffer the framebuffer name + * @param attachment the attachment within {@code target}. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param pname the parameter of {@code attachment} to query. One of:
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME FRAMEBUFFER_ATTACHMENT_OBJECT_NAME}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE FRAMEBUFFER_ATTACHMENT_RED_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE FRAMEBUFFER_ATTACHMENT_GREEN_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE FRAMEBUFFER_ATTACHMENT_BLUE_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE}{@link GL30#GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE}
    {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetNamedFramebufferAttachmentParameteri(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCreateRenderbuffers ] --- + + /** + * Unsafe version of: {@link #glCreateRenderbuffers CreateRenderbuffers} + * + * @param n the number of renderbuffer names to create + */ + public static native void nglCreateRenderbuffers(int n, long renderbuffers); + + /** + * Returns {@code n} previously unused renderbuffer names in {@code renderbuffers}, each representing a new renderbuffer object. + * + * @param renderbuffers the buffer in which to store the created renderbuffer names + * + * @see Reference Page + */ + public static void glCreateRenderbuffers(@NativeType("GLuint *") IntBuffer renderbuffers) { + nglCreateRenderbuffers(renderbuffers.remaining(), memAddress(renderbuffers)); + } + + /** + * Returns {@code n} previously unused renderbuffer names in {@code renderbuffers}, each representing a new renderbuffer object. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateRenderbuffers() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer renderbuffers = stack.callocInt(1); + nglCreateRenderbuffers(1, memAddress(renderbuffers)); + return renderbuffers.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glNamedRenderbufferStorage ] --- + + /** + * DSA version of {@link GL30C#glRenderbufferStorage RenderbufferStorage}. + * + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + * + * @see Reference Page + */ + public static native void glNamedRenderbufferStorage(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glNamedRenderbufferStorageMultisample ] --- + + /** + * DSA version of {@link GL30C#glRenderbufferStorageMultisample RenderbufferStorageMultisample}. + * + * @param samples the number of samples to be used for the renderbuffer object's storage + * @param internalformat the internal format to use for the renderbuffer object's image. Must be a color-renderable, depth-renderable, or stencil-renderable format. + * @param width the width of the renderbuffer, in pixels + * @param height the height of the renderbuffer, in pixels + * + * @see Reference Page + */ + public static native void glNamedRenderbufferStorageMultisample(@NativeType("GLuint") int renderbuffer, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glGetNamedRenderbufferParameteriv ] --- + + /** Unsafe version of: {@link #glGetNamedRenderbufferParameteriv GetNamedRenderbufferParameteriv} */ + public static native void nglGetNamedRenderbufferParameteriv(int renderbuffer, int pname, long params); + + /** + * DSA version of {@link GL30C#glGetRenderbufferParameteriv GetRenderbufferParameteriv}. + * + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link GL30#GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link GL30#GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link GL30#GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link GL30#GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link GL30#GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link GL30#GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link GL30#GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link GL30#GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link GL30#GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link GL30#GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + * @param params an array to receive the value of the queried parameter + * + * @see Reference Page + */ + public static void glGetNamedRenderbufferParameteriv(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedRenderbufferParameteriv(renderbuffer, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL30C#glGetRenderbufferParameteriv GetRenderbufferParameteriv}. + * + * @param pname the parameter whose value to retrieve from the renderbuffer bound to {@code target}. One of:
    {@link GL30#GL_RENDERBUFFER_WIDTH RENDERBUFFER_WIDTH}{@link GL30#GL_RENDERBUFFER_HEIGHT RENDERBUFFER_HEIGHT}{@link GL30#GL_RENDERBUFFER_INTERNAL_FORMAT RENDERBUFFER_INTERNAL_FORMAT}
    {@link GL30#GL_RENDERBUFFER_RED_SIZE RENDERBUFFER_RED_SIZE}{@link GL30#GL_RENDERBUFFER_GREEN_SIZE RENDERBUFFER_GREEN_SIZE}{@link GL30#GL_RENDERBUFFER_BLUE_SIZE RENDERBUFFER_BLUE_SIZE}
    {@link GL30#GL_RENDERBUFFER_ALPHA_SIZE RENDERBUFFER_ALPHA_SIZE}{@link GL30#GL_RENDERBUFFER_DEPTH_SIZE RENDERBUFFER_DEPTH_SIZE}{@link GL30#GL_RENDERBUFFER_STENCIL_SIZE RENDERBUFFER_STENCIL_SIZE}
    {@link GL30#GL_RENDERBUFFER_SAMPLES RENDERBUFFER_SAMPLES}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetNamedRenderbufferParameteri(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetNamedRenderbufferParameteriv(renderbuffer, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCreateTextures ] --- + + /** + * Unsafe version of: {@link #glCreateTextures CreateTextures} + * + * @param n the number of texture names to create + */ + public static native void nglCreateTextures(int target, int n, long textures); + + /** + * Returns {@code n} previously unused texture names in {@code textures}, each representing a new texture object. + * + * @param target the texture target. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * @param textures the buffer in which to store the created texture names + * + * @see Reference Page + */ + public static void glCreateTextures(@NativeType("GLenum") int target, @NativeType("GLuint *") IntBuffer textures) { + nglCreateTextures(target, textures.remaining(), memAddress(textures)); + } + + /** + * Returns {@code n} previously unused texture names in {@code textures}, each representing a new texture object. + * + * @param target the texture target. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP TEXTURE_CUBE_MAP}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}{@link GL31#GL_TEXTURE_BUFFER TEXTURE_BUFFER}{@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}
    {@link GL32#GL_TEXTURE_2D_MULTISAMPLE_ARRAY TEXTURE_2D_MULTISAMPLE_ARRAY}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateTextures(@NativeType("GLenum") int target) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer textures = stack.callocInt(1); + nglCreateTextures(target, 1, memAddress(textures)); + return textures.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glTextureBuffer ] --- + + /** + * DSA version of {@link GL31C#glTexBuffer TexBuffer}. + * + * @param texture the texture name + * @param internalformat the sized internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + * + * @see Reference Page + */ + public static native void glTextureBuffer(@NativeType("GLuint") int texture, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer); + + // --- [ glTextureBufferRange ] --- + + /** + * DSA version of {@link GL43C#glTexBufferRange TexBufferRange}. + * + * @param texture the texture name + * @param internalformat the internal format of the data in the store belonging to {@code buffer} + * @param buffer the name of the buffer object whose storage to attach to the active buffer texture + * @param offset the offset of the start of the range of the buffer's data store to attach + * @param size the size of the range of the buffer's data store to attach + * + * @see Reference Page + */ + public static native void glTextureBufferRange(@NativeType("GLuint") int texture, @NativeType("GLenum") int internalformat, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size); + + // --- [ glTextureStorage1D ] --- + + /** + * DSA version of {@link GL42C#glTexStorage1D TexStorage1D}. + * + * @param texture the texture name + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * + * @see Reference Page + */ + public static native void glTextureStorage1D(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width); + + // --- [ glTextureStorage2D ] --- + + /** + * DSA version of {@link GL42C#glTexStorage2D TexStorage2D}. + * + * @param texture the texture name + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * + * @see Reference Page + */ + public static native void glTextureStorage2D(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glTextureStorage3D ] --- + + /** + * DSA version of {@link GL42C#glTexStorage3D TexStorage3D}. + * + * @param texture the texture name + * @param levels the number of texture levels + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + * + * @see Reference Page + */ + public static native void glTextureStorage3D(@NativeType("GLuint") int texture, @NativeType("GLsizei") int levels, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth); + + // --- [ glTextureStorage2DMultisample ] --- + + /** + * DSA version of {@link GL43C#glTexStorage2DMultisample TexStorage2DMultisample}. + * + * @param texture the texture name + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static native void glTextureStorage2DMultisample(@NativeType("GLuint") int texture, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedsamplelocations); + + // --- [ glTextureStorage3DMultisample ] --- + + /** + * DSA version of {@link GL43C#glTexStorage3DMultisample TexStorage3DMultisample}. + * + * @param texture the texture name + * @param samples the number of samples in the texture + * @param internalformat the sized internal format to be used to store texture image data + * @param width the width of the texture, in texels + * @param height the height of the texture, in texels + * @param depth the depth of the texture, in texels + * @param fixedsamplelocations whether the image will use identical sample locations and the same number of samples for all texels in the image, and the sample locations will not + * depend on the internal format or size of the image + * + * @see Reference Page + */ + public static native void glTextureStorage3DMultisample(@NativeType("GLuint") int texture, @NativeType("GLsizei") int samples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedsamplelocations); + + // --- [ glTextureSubImage1D ] --- + + /** Unsafe version of: {@link #glTextureSubImage1D TextureSubImage1D} */ + public static native void nglTextureSubImage1D(int texture, int level, int xoffset, int width, int format, int type, long pixels); + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglTextureSubImage1D(texture, level, xoffset, width, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglTextureSubImage1D(texture, level, xoffset, width, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglTextureSubImage1D(texture, level, xoffset, width, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglTextureSubImage1D(texture, level, xoffset, width, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glTexSubImage1D TexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param width the subregion width + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglTextureSubImage1D(texture, level, xoffset, width, format, type, memAddress(pixels)); + } + + // --- [ glTextureSubImage2D ] --- + + /** Unsafe version of: {@link #glTextureSubImage2D TextureSubImage2D} */ + public static native void nglTextureSubImage2D(int texture, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels); + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glTexSubImage2D TexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the left coordinate of the texel subregion + * @param yoffset the bottom coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, memAddress(pixels)); + } + + // --- [ glTextureSubImage3D ] --- + + /** Unsafe version of: {@link #glTextureSubImage3D TextureSubImage3D} */ + public static native void nglTextureSubImage3D(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels); + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer pixels) { + nglTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") long pixels) { + nglTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") ShortBuffer pixels) { + nglTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer pixels) { + nglTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") FloatBuffer pixels) { + nglTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + /** + * DSA version of {@link GL12C#glTexSubImage3D TexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail-number + * @param xoffset the x coordinate of the texel subregion + * @param yoffset the y coordinate of the texel subregion + * @param zoffset the z coordinate of the texel subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel data format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel data type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the pixel data + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") DoubleBuffer pixels) { + nglTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, memAddress(pixels)); + } + + // --- [ glCompressedTextureSubImage1D ] --- + + /** + * Unsafe version of: {@link #glCompressedTextureSubImage1D CompressedTextureSubImage1D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTextureSubImage1D(int texture, int level, int xoffset, int width, int format, int imageSize, long data); + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage1D CompressedTexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage1D CompressedTexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param width the width of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTextureSubImage1D(texture, level, xoffset, width, format, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedTextureSubImage2D ] --- + + /** + * Unsafe version of: {@link #glCompressedTextureSubImage2D CompressedTextureSubImage2D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTextureSubImage2D(int texture, int level, int xoffset, int yoffset, int width, int height, int format, int imageSize, long data); + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage2D CompressedTexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage2D CompressedTexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, data.remaining(), memAddress(data)); + } + + // --- [ glCompressedTextureSubImage3D ] --- + + /** + * Unsafe version of: {@link #glCompressedTextureSubImage3D CompressedTextureSubImage3D} + * + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + */ + public static native void nglCompressedTextureSubImage3D(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, long data); + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage3D CompressedTexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param imageSize the number of unsigned bytes of image data starting at the address specified by {@code data} + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLsizei") int imageSize, @NativeType("void const *") long data) { + nglCompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } + + /** + * DSA version of {@link GL13C#glCompressedTexSubImage3D CompressedTexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param xoffset a texel offset in the x direction within the texture array + * @param yoffset a texel offset in the y direction within the texture array + * @param zoffset a texel offset in the z direction within the texture array + * @param width the width of the texture subimage + * @param height the height of the texture subimage + * @param depth the depth of the texture subimage + * @param format the format of the compressed image data stored at address {@code data}. One of:
    {@link GL30#GL_COMPRESSED_RED_RGTC1 COMPRESSED_RED_RGTC1}{@link GL30#GL_COMPRESSED_SIGNED_RED_RGTC1 COMPRESSED_SIGNED_RED_RGTC1}
    {@link GL30#GL_COMPRESSED_RG_RGTC2 COMPRESSED_RG_RGTC2}{@link GL30#GL_COMPRESSED_SIGNED_RG_RGTC2 COMPRESSED_SIGNED_RG_RGTC2}
    {@link GL42#GL_COMPRESSED_RGBA_BPTC_UNORM COMPRESSED_RGBA_BPTC_UNORM}{@link GL42#GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM COMPRESSED_SRGB_ALPHA_BPTC_UNORM}
    {@link GL42#GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT COMPRESSED_RGB_BPTC_SIGNED_FLOAT}{@link GL42#GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT}
    {@link GL43#GL_COMPRESSED_RGB8_ETC2 COMPRESSED_RGB8_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_ETC2 COMPRESSED_SRGB8_ETC2}
    {@link GL43#GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}{@link GL43#GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}
    {@link GL43#GL_COMPRESSED_RGBA8_ETC2_EAC COMPRESSED_RGBA8_ETC2_EAC}{@link GL43#GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}
    {@link GL43#GL_COMPRESSED_R11_EAC COMPRESSED_R11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_R11_EAC COMPRESSED_SIGNED_R11_EAC}
    {@link GL43#GL_COMPRESSED_RG11_EAC COMPRESSED_RG11_EAC}{@link GL43#GL_COMPRESSED_SIGNED_RG11_EAC COMPRESSED_SIGNED_RG11_EAC}
    see {@link EXTTextureCompressionS3TC}see {@link EXTTextureCompressionLATC}
    see {@link ATITextureCompression3DC}see {@link KHRTextureCompressionASTCLDR}
    + * @param data a pointer to the compressed image data + * + * @see Reference Page + */ + public static void glCompressedTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer data) { + nglCompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, data.remaining(), memAddress(data)); + } + + // --- [ glCopyTextureSubImage1D ] --- + + /** + * DSA version of {@link GL11C#glCopyTexSubImage1D CopyTexSubImage1D}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param xoffset the left texel coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * + * @see Reference Page + */ + public static native void glCopyTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width); + + // --- [ glCopyTextureSubImage2D ] --- + + /** + * DSA version of {@link GL11C#glCopyTexSubImage2D CopyTexSubImage2D}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param xoffset the left texel coordinate of the texture subregion to update + * @param yoffset the lower texel coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * @param height the texture subregion height + * + * @see Reference Page + */ + public static native void glCopyTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glCopyTextureSubImage3D ] --- + + /** + * DSA version of {@link GL12C#glCopyTexSubImage3D CopyTexSubImage3D}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param xoffset the x coordinate of the texture subregion to update + * @param yoffset the y coordinate of the texture subregion to update + * @param zoffset the z coordinate of the texture subregion to update + * @param x the left framebuffer pixel coordinate + * @param y the lower framebuffer pixel coordinate + * @param width the texture subregion width + * @param height the texture subregion height + * + * @see Reference Page + */ + public static native void glCopyTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + // --- [ glTextureParameterf ] --- + + /** + * DSA version of {@link GL11C#glTexParameterf TexParameterf}. + * + * @param texture the texture name + * @param pname the parameter to set + * @param param the parameter value + * + * @see Reference Page + */ + public static native void glTextureParameterf(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat") float param); + + // --- [ glTextureParameterfv ] --- + + /** Unsafe version of: {@link #glTextureParameterfv TextureParameterfv} */ + public static native void nglTextureParameterfv(int texture, int pname, long params); + + /** + * DSA version of {@link GL11C#glTexParameterfv TexParameterfv}. + * + * @param texture the texture name + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglTextureParameterfv(texture, pname, memAddress(params)); + } + + // --- [ glTextureParameteri ] --- + + /** + * DSA version of {@link GL11C#glTexParameteri TexParameteri}. + * + * @param texture the texture name + * @param pname the parameter to set. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    + * @param param the parameter value + * + * @see Reference Page + */ + public static native void glTextureParameteri(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glTextureParameterIiv ] --- + + /** Unsafe version of: {@link #glTextureParameterIiv TextureParameterIiv} */ + public static native void nglTextureParameterIiv(int texture, int pname, long params); + + /** + * DSA version of {@link GL30C#glTexParameterIiv TexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + * @param params the value of {@code pname} + * + * @see Reference Page + */ + public static void glTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglTextureParameterIiv(texture, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL30C#glTexParameterIiv TexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + * + * @see Reference Page + */ + public static void glTextureParameterIi(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.ints(param); + nglTextureParameterIiv(texture, pname, memAddress(params)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glTextureParameterIuiv ] --- + + /** Unsafe version of: {@link #glTextureParameterIuiv TextureParameterIuiv} */ + public static native void nglTextureParameterIuiv(int texture, int pname, long params); + + /** + * DSA version of {@link GL30C#glTexParameterIuiv TexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + * @param params the value of {@code pname} + * + * @see Reference Page + */ + public static void glTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglTextureParameterIuiv(texture, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL30C#glTexParameterIuiv TexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a single-valued texture parameter + * + * @see Reference Page + */ + public static void glTextureParameterIui(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int param) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.ints(param); + nglTextureParameterIuiv(texture, pname, memAddress(params)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glTextureParameteriv ] --- + + /** Unsafe version of: {@link #glTextureParameteriv TextureParameteriv} */ + public static native void nglTextureParameteriv(int texture, int pname, long params); + + /** + * DSA version of {@link GL11C#glTexParameteriv TexParameteriv}. + * + * @param texture the texture name + * @param pname the parameter to set + * @param params the parameter value + * + * @see Reference Page + */ + public static void glTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 4); + } + nglTextureParameteriv(texture, pname, memAddress(params)); + } + + // --- [ glGenerateTextureMipmap ] --- + + /** + * DSA version of {@link GL30C#glGenerateMipmap GenerateMipmap}. + * + * @param texture the texture name + * + * @see Reference Page + */ + public static native void glGenerateTextureMipmap(@NativeType("GLuint") int texture); + + // --- [ glBindTextureUnit ] --- + + /** + * Binds an existing texture object to the texture unit numbered {@code unit}. + * + *

    {@code texture} must be zero or the name of an existing texture object. When {@code texture} is the name of an existing texture object, that object is + * bound to the target, in the corresponding texture unit, that was specified when the object was created. When {@code texture} is zero, each of the targets + * enumerated at the beginning of this section is reset to its default texture for the corresponding texture image unit.

    + * + * @param unit the texture unit number + * @param texture the texture name + * + * @see Reference Page + */ + public static native void glBindTextureUnit(@NativeType("GLuint") int unit, @NativeType("GLuint") int texture); + + // --- [ glGetTextureImage ] --- + + /** + * Unsafe version of: {@link #glGetTextureImage GetTextureImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static native void nglGetTextureImage(int texture, int level, int format, int type, int bufSize, long pixels); + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + nglGetTextureImage(texture, level, format, type, bufSize, pixels); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + nglGetTextureImage(texture, level, format, type, pixels.remaining(), memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + nglGetTextureImage(texture, level, format, type, pixels.remaining() << 1, memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + nglGetTextureImage(texture, level, format, type, pixels.remaining() << 2, memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + nglGetTextureImage(texture, level, format, type, pixels.remaining() << 2, memAddress(pixels)); + } + + /** + * DSA version of {@link GL11C#glGetTexImage GetTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer pixels) { + nglGetTextureImage(texture, level, format, type, pixels.remaining() << 3, memAddress(pixels)); + } + + // --- [ glGetCompressedTextureImage ] --- + + /** + * Unsafe version of: {@link #glGetCompressedTextureImage GetCompressedTextureImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static native void nglGetCompressedTextureImage(int texture, int level, int bufSize, long pixels); + + /** + * DSA version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels a buffer in which to return the compressed texture image + * + * @see Reference Page + */ + public static void glGetCompressedTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + nglGetCompressedTextureImage(texture, level, bufSize, pixels); + } + + /** + * DSA version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage}. + * + * @param texture the texture name + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param pixels a buffer in which to return the compressed texture image + * + * @see Reference Page + */ + public static void glGetCompressedTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("void *") ByteBuffer pixels) { + if (CHECKS) { + if (DEBUG) { + check(pixels, glGetTextureLevelParameteri(texture, level, GL13.GL_TEXTURE_COMPRESSED_IMAGE_SIZE)); + } + } + nglGetCompressedTextureImage(texture, level, pixels.remaining(), memAddress(pixels)); + } + + // --- [ glGetTextureLevelParameterfv ] --- + + /** Unsafe version of: {@link #glGetTextureLevelParameterfv GetTextureLevelParameterfv} */ + public static native void nglGetTextureLevelParameterfv(int texture, int level, int pname, long params); + + /** + * DSA version of {@link GL11C#glGetTexLevelParameterfv GetTexLevelParameterfv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureLevelParameterfv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureLevelParameterfv(texture, level, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL11C#glGetTexLevelParameterfv GetTexLevelParameterfv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetTextureLevelParameterf(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetTextureLevelParameterfv(texture, level, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTextureLevelParameteriv ] --- + + /** Unsafe version of: {@link #glGetTextureLevelParameteriv GetTextureLevelParameteriv} */ + public static native void nglGetTextureLevelParameteriv(int texture, int level, int pname, long params); + + /** + * DSA version of {@link GL11C#glGetTexLevelParameteriv GetTexLevelParameteriv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query. One of:
    {@link GL11#GL_TEXTURE_WIDTH TEXTURE_WIDTH}{@link GL11#GL_TEXTURE_HEIGHT TEXTURE_HEIGHT}{@link GL12#GL_TEXTURE_DEPTH TEXTURE_DEPTH}{@link GL32#GL_TEXTURE_SAMPLES TEXTURE_SAMPLES}
    {@link GL32#GL_TEXTURE_FIXED_SAMPLE_LOCATIONS TEXTURE_FIXED_SAMPLE_LOCATIONS}{@link GL11#GL_TEXTURE_INTERNAL_FORMAT TEXTURE_INTERNAL_FORMAT}{@link GL11#GL_TEXTURE_RED_SIZE TEXTURE_RED_SIZE}{@link GL11#GL_TEXTURE_GREEN_SIZE TEXTURE_GREEN_SIZE}
    {@link GL11#GL_TEXTURE_BLUE_SIZE TEXTURE_BLUE_SIZE}{@link GL11#GL_TEXTURE_ALPHA_SIZE TEXTURE_ALPHA_SIZE}{@link GL14#GL_TEXTURE_DEPTH_SIZE TEXTURE_DEPTH_SIZE}{@link GL30#GL_TEXTURE_STENCIL_SIZE TEXTURE_STENCIL_SIZE}
    {@link GL30#GL_TEXTURE_SHARED_SIZE TEXTURE_SHARED_SIZE}{@link GL30#GL_TEXTURE_ALPHA_TYPE TEXTURE_ALPHA_TYPE}{@link GL30#GL_TEXTURE_DEPTH_TYPE TEXTURE_DEPTH_TYPE}{@link GL13#GL_TEXTURE_COMPRESSED TEXTURE_COMPRESSED}
    {@link GL13#GL_TEXTURE_COMPRESSED_IMAGE_SIZE TEXTURE_COMPRESSED_IMAGE_SIZE}{@link GL31#GL_TEXTURE_BUFFER_DATA_STORE_BINDING TEXTURE_BUFFER_DATA_STORE_BINDING}{@link GL43#GL_TEXTURE_BUFFER_OFFSET TEXTURE_BUFFER_OFFSET}{@link GL43#GL_TEXTURE_BUFFER_SIZE TEXTURE_BUFFER_SIZE}
    + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureLevelParameteriv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureLevelParameteriv(texture, level, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL11C#glGetTexLevelParameteriv GetTexLevelParameteriv}. + * + * @param texture the texture name + * @param level the level-of-detail number + * @param pname the parameter to query. One of:
    {@link GL11#GL_TEXTURE_WIDTH TEXTURE_WIDTH}{@link GL11#GL_TEXTURE_HEIGHT TEXTURE_HEIGHT}{@link GL12#GL_TEXTURE_DEPTH TEXTURE_DEPTH}{@link GL32#GL_TEXTURE_SAMPLES TEXTURE_SAMPLES}
    {@link GL32#GL_TEXTURE_FIXED_SAMPLE_LOCATIONS TEXTURE_FIXED_SAMPLE_LOCATIONS}{@link GL11#GL_TEXTURE_INTERNAL_FORMAT TEXTURE_INTERNAL_FORMAT}{@link GL11#GL_TEXTURE_RED_SIZE TEXTURE_RED_SIZE}{@link GL11#GL_TEXTURE_GREEN_SIZE TEXTURE_GREEN_SIZE}
    {@link GL11#GL_TEXTURE_BLUE_SIZE TEXTURE_BLUE_SIZE}{@link GL11#GL_TEXTURE_ALPHA_SIZE TEXTURE_ALPHA_SIZE}{@link GL14#GL_TEXTURE_DEPTH_SIZE TEXTURE_DEPTH_SIZE}{@link GL30#GL_TEXTURE_STENCIL_SIZE TEXTURE_STENCIL_SIZE}
    {@link GL30#GL_TEXTURE_SHARED_SIZE TEXTURE_SHARED_SIZE}{@link GL30#GL_TEXTURE_ALPHA_TYPE TEXTURE_ALPHA_TYPE}{@link GL30#GL_TEXTURE_DEPTH_TYPE TEXTURE_DEPTH_TYPE}{@link GL13#GL_TEXTURE_COMPRESSED TEXTURE_COMPRESSED}
    {@link GL13#GL_TEXTURE_COMPRESSED_IMAGE_SIZE TEXTURE_COMPRESSED_IMAGE_SIZE}{@link GL31#GL_TEXTURE_BUFFER_DATA_STORE_BINDING TEXTURE_BUFFER_DATA_STORE_BINDING}{@link GL43#GL_TEXTURE_BUFFER_OFFSET TEXTURE_BUFFER_OFFSET}{@link GL43#GL_TEXTURE_BUFFER_SIZE TEXTURE_BUFFER_SIZE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTextureLevelParameteri(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTextureLevelParameteriv(texture, level, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTextureParameterfv ] --- + + /** Unsafe version of: {@link #glGetTextureParameterfv GetTextureParameterfv} */ + public static native void nglGetTextureParameterfv(int texture, int pname, long params); + + /** + * DSA version of {@link GL11C#glGetTexParameterfv GetTexParameterfv}. + * + * @param texture the texture name + * @param pname the parameter to query + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureParameterfv(texture, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL11C#glGetTexParameterfv GetTexParameterfv}. + * + * @param texture the texture name + * @param pname the parameter to query + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetTextureParameterf(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetTextureParameterfv(texture, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTextureParameterIiv ] --- + + /** Unsafe version of: {@link #glGetTextureParameterIiv GetTextureParameterIiv} */ + public static native void nglGetTextureParameterIiv(int texture, int pname, long params); + + /** + * DSA version of {@link GL30C#glGetTexParameterIiv GetTexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + * @param params returns the texture parameter value + * + * @see Reference Page + */ + public static void glGetTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureParameterIiv(texture, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL30C#glGetTexParameterIiv GetTexParameterIiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTextureParameterIi(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTextureParameterIiv(texture, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTextureParameterIuiv ] --- + + /** Unsafe version of: {@link #glGetTextureParameterIuiv GetTextureParameterIuiv} */ + public static native void nglGetTextureParameterIuiv(int texture, int pname, long params); + + /** + * DSA version of {@link GL30C#glGetTexParameterIuiv GetTexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + * @param params returns the texture parameter value + * + * @see Reference Page + */ + public static void glGetTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureParameterIuiv(texture, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL30C#glGetTexParameterIuiv GetTexParameterIuiv}. + * + * @param texture the texture name + * @param pname the symbolic name of a texture parameter + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTextureParameterIui(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTextureParameterIuiv(texture, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetTextureParameteriv ] --- + + /** Unsafe version of: {@link #glGetTextureParameteriv GetTextureParameteriv} */ + public static native void nglGetTextureParameteriv(int texture, int pname, long params); + + /** + * DSA version of {@link GL11C#glGetTexParameteriv GetTexParameteriv}. + * + * @param texture the texture name + * @param pname the parameter to query. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    {@link GL42#GL_IMAGE_FORMAT_COMPATIBILITY_TYPE IMAGE_FORMAT_COMPATIBILITY_TYPE}{@link GL42#GL_TEXTURE_IMMUTABLE_FORMAT TEXTURE_IMMUTABLE_FORMAT}{@link GL43#GL_TEXTURE_IMMUTABLE_LEVELS TEXTURE_IMMUTABLE_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LEVEL TEXTURE_VIEW_MIN_LEVEL}
    {@link GL43#GL_TEXTURE_VIEW_NUM_LEVELS TEXTURE_VIEW_NUM_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LAYER TEXTURE_VIEW_MIN_LAYER}{@link GL43#GL_TEXTURE_VIEW_NUM_LAYERS TEXTURE_VIEW_NUM_LAYERS}
    + * @param params a scalar or buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetTextureParameteriv(texture, pname, memAddress(params)); + } + + /** + * DSA version of {@link GL11C#glGetTexParameteriv GetTexParameteriv}. + * + * @param texture the texture name + * @param pname the parameter to query. One of:
    {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL}{@link GL11#GL_TEXTURE_BORDER_COLOR TEXTURE_BORDER_COLOR}{@link GL14#GL_TEXTURE_COMPARE_MODE TEXTURE_COMPARE_MODE}{@link GL14#GL_TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_FUNC}
    {@link GL14#GL_TEXTURE_LOD_BIAS TEXTURE_LOD_BIAS}{@link GL11#GL_TEXTURE_MAG_FILTER TEXTURE_MAG_FILTER}{@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL}{@link GL12#GL_TEXTURE_MAX_LOD TEXTURE_MAX_LOD}
    {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER}{@link GL12#GL_TEXTURE_MIN_LOD TEXTURE_MIN_LOD}{@link GL33#GL_TEXTURE_SWIZZLE_R TEXTURE_SWIZZLE_R}{@link GL33#GL_TEXTURE_SWIZZLE_G TEXTURE_SWIZZLE_G}
    {@link GL33#GL_TEXTURE_SWIZZLE_B TEXTURE_SWIZZLE_B}{@link GL33#GL_TEXTURE_SWIZZLE_A TEXTURE_SWIZZLE_A}{@link GL33#GL_TEXTURE_SWIZZLE_RGBA TEXTURE_SWIZZLE_RGBA}{@link GL11#GL_TEXTURE_WRAP_S TEXTURE_WRAP_S}
    {@link GL11#GL_TEXTURE_WRAP_T TEXTURE_WRAP_T}{@link GL12#GL_TEXTURE_WRAP_R TEXTURE_WRAP_R}{@link GL14#GL_DEPTH_TEXTURE_MODE DEPTH_TEXTURE_MODE}{@link GL14#GL_GENERATE_MIPMAP GENERATE_MIPMAP}
    {@link GL42#GL_IMAGE_FORMAT_COMPATIBILITY_TYPE IMAGE_FORMAT_COMPATIBILITY_TYPE}{@link GL42#GL_TEXTURE_IMMUTABLE_FORMAT TEXTURE_IMMUTABLE_FORMAT}{@link GL43#GL_TEXTURE_IMMUTABLE_LEVELS TEXTURE_IMMUTABLE_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LEVEL TEXTURE_VIEW_MIN_LEVEL}
    {@link GL43#GL_TEXTURE_VIEW_NUM_LEVELS TEXTURE_VIEW_NUM_LEVELS}{@link GL43#GL_TEXTURE_VIEW_MIN_LAYER TEXTURE_VIEW_MIN_LAYER}{@link GL43#GL_TEXTURE_VIEW_NUM_LAYERS TEXTURE_VIEW_NUM_LAYERS}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetTextureParameteri(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetTextureParameteriv(texture, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCreateVertexArrays ] --- + + /** + * Unsafe version of: {@link #glCreateVertexArrays CreateVertexArrays} + * + * @param n the number of vertex array object names to create + */ + public static native void nglCreateVertexArrays(int n, long arrays); + + /** + * Returns {@code n} previously unused vertex array object names in {@code arrays}. + * + * @param arrays the buffer in which to return the created vertex array object names + * + * @see Reference Page + */ + public static void glCreateVertexArrays(@NativeType("GLuint *") IntBuffer arrays) { + nglCreateVertexArrays(arrays.remaining(), memAddress(arrays)); + } + + /** + * Returns {@code n} previously unused vertex array object names in {@code arrays}. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateVertexArrays() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer arrays = stack.callocInt(1); + nglCreateVertexArrays(1, memAddress(arrays)); + return arrays.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDisableVertexArrayAttrib ] --- + + /** + * DSA version of {@link GL20C#glDisableVertexAttribArray DisableVertexAttribArray}. + * + * @param vaobj the vertex array object name + * @param index the index of the generic vertex attribute to be disabled + * + * @see Reference Page + */ + public static native void glDisableVertexArrayAttrib(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index); + + // --- [ glEnableVertexArrayAttrib ] --- + + /** + * DSA version of {@link GL20C#glEnableVertexAttribArray EnableVertexAttribArray}. + * + * @param vaobj the vertex array object name + * @param index the index of the generic vertex attribute to be enabled + * + * @see Reference Page + */ + public static native void glEnableVertexArrayAttrib(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index); + + // --- [ glVertexArrayElementBuffer ] --- + + /** + * Binds a buffer object to the element array buffer bind point of a vertex array object. + * + * @param vaobj the vertex array object name + * @param buffer the buffer object name. If {@code buffer} is zero, any existing element array buffer binding to {@code vaobj} is removed. + * + * @see Reference Page + */ + public static native void glVertexArrayElementBuffer(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int buffer); + + // --- [ glVertexArrayVertexBuffer ] --- + + /** + * DSA version of {@link GL43C#glBindVertexBuffer BindVertexBuffer}. + * + * @param vaobj the vertex array object name + * @param bindingindex the index of the vertex buffer binding point to which to bind the buffer + * @param buffer the name of an existing buffer to bind to the vertex buffer binding point + * @param offset the offset of the first element of the buffer + * @param stride the distance between elements within the buffer + * + * @see Reference Page + */ + public static native void glVertexArrayVertexBuffer(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int bindingindex, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizei") int stride); + + // --- [ glVertexArrayVertexBuffers ] --- + + /** + * Unsafe version of: {@link #glVertexArrayVertexBuffers VertexArrayVertexBuffers} + * + * @param count the number of vertex buffer binding points + */ + public static native void nglVertexArrayVertexBuffers(int vaobj, int first, int count, long buffers, long offsets, long strides); + + /** + * DSA version of {@link GL44C#glBindVertexBuffers BindVertexBuffers}. + * + * @param vaobj the vertex array object name + * @param first the first vertex buffer binding point + * @param buffers an array of zeros or names of existing buffers objects + * @param offsets an array of offses + * @param strides an array of stride values + * + * @see Reference Page + */ + public static void glVertexArrayVertexBuffers(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") IntBuffer buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") IntBuffer strides) { + if (CHECKS) { + checkSafe(offsets, remainingSafe(buffers)); + checkSafe(strides, remainingSafe(buffers)); + } + nglVertexArrayVertexBuffers(vaobj, first, remainingSafe(buffers), memAddressSafe(buffers), memAddressSafe(offsets), memAddressSafe(strides)); + } + + // --- [ glVertexArrayAttribFormat ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribFormat VertexAttribFormat}. + * + * @param vaobj the vertex array object name + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param normalized if true then integer data is normalized to the range [-1, 1] or [0, 1] if it is signed or unsigned, respectively. If false then integer data is + * directly converted to floating point. + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static native void glVertexArrayAttribFormat(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLuint") int relativeoffset); + + // --- [ glVertexArrayAttribIFormat ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribIFormat VertexAttribIFormat}. + * + * @param vaobj the vertex array object name + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static native void glVertexArrayAttribIFormat(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset); + + // --- [ glVertexArrayAttribLFormat ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribLFormat VertexAttribLFormat}. + * + * @param vaobj the vertex array object name + * @param attribindex the generic vertex attribute array being described + * @param size the number of values per vertex that are stored in the array. One of:
    1234{@link GL12#GL_BGRA BGRA}
    + * @param type the type of the data stored in the array + * @param relativeoffset the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from + * + * @see Reference Page + */ + public static native void glVertexArrayAttribLFormat(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLuint") int relativeoffset); + + // --- [ glVertexArrayAttribBinding ] --- + + /** + * DSA version of {@link GL43C#glVertexAttribBinding VertexAttribBinding}. + * + * @param vaobj the vertex array object name + * @param attribindex the index of the attribute to associate with a vertex buffer binding + * @param bindingindex the index of the vertex buffer binding with which to associate the generic vertex attribute + * + * @see Reference Page + */ + public static native void glVertexArrayAttribBinding(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int attribindex, @NativeType("GLuint") int bindingindex); + + // --- [ glVertexArrayBindingDivisor ] --- + + /** + * DSA version of {@link GL43C#glVertexBindingDivisor VertexBindingDivisor}. + * + * @param vaobj the vertex array object name + * @param bindingindex the index of the generic vertex attribute + * @param divisor the number of instances that will pass between updates of the generic attribute at slot {@code index} + * + * @see Reference Page + */ + public static native void glVertexArrayBindingDivisor(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int bindingindex, @NativeType("GLuint") int divisor); + + // --- [ glGetVertexArrayiv ] --- + + /** Unsafe version of: {@link #glGetVertexArrayiv GetVertexArrayiv} */ + public static native void nglGetVertexArrayiv(int vaobj, int pname, long param); + + /** + * Queries parameters of a vertex array object. + * + * @param vaobj the vertex array object name + * @param pname the parameter to query. Must be:
    {@link GL15#GL_ELEMENT_ARRAY_BUFFER_BINDING ELEMENT_ARRAY_BUFFER_BINDING}
    + * @param param the buffer in which to return the parameter values + * + * @see Reference Page + */ + public static void glGetVertexArrayiv(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + if (CHECKS) { + check(param, 1); + } + nglGetVertexArrayiv(vaobj, pname, memAddress(param)); + } + + /** + * Queries parameters of a vertex array object. + * + * @param vaobj the vertex array object name + * @param pname the parameter to query. Must be:
    {@link GL15#GL_ELEMENT_ARRAY_BUFFER_BINDING ELEMENT_ARRAY_BUFFER_BINDING}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetVertexArrayi(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer param = stack.callocInt(1); + nglGetVertexArrayiv(vaobj, pname, memAddress(param)); + return param.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexArrayIndexediv ] --- + + /** Unsafe version of: {@link #glGetVertexArrayIndexediv GetVertexArrayIndexediv} */ + public static native void nglGetVertexArrayIndexediv(int vaobj, int index, int pname, long param); + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. One of:
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_ENABLED VERTEX_ATTRIB_ARRAY_ENABLED}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_SIZE VERTEX_ATTRIB_ARRAY_SIZE},
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_STRIDE VERTEX_ATTRIB_ARRAY_STRIDE}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_TYPE VERTEX_ATTRIB_ARRAY_TYPE}
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_NORMALIZED VERTEX_ATTRIB_ARRAY_NORMALIZED}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}{@link GL43#GL_VERTEX_ATTRIB_ARRAY_LONG VERTEX_ATTRIB_ARRAY_LONG}
    {@link GL43#GL_VERTEX_ATTRIB_RELATIVE_OFFSET VERTEX_ATTRIB_RELATIVE_OFFSET}
    + * @param param the buffer in which to return the parameter values + * + * @see Reference Page + */ + public static void glGetVertexArrayIndexediv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer param) { + if (CHECKS) { + check(param, 1); + } + nglGetVertexArrayIndexediv(vaobj, index, pname, memAddress(param)); + } + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. One of:
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_ENABLED VERTEX_ATTRIB_ARRAY_ENABLED}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_SIZE VERTEX_ATTRIB_ARRAY_SIZE},
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_STRIDE VERTEX_ATTRIB_ARRAY_STRIDE}{@link GL20#GL_VERTEX_ATTRIB_ARRAY_TYPE VERTEX_ATTRIB_ARRAY_TYPE}
    {@link GL20#GL_VERTEX_ATTRIB_ARRAY_NORMALIZED VERTEX_ATTRIB_ARRAY_NORMALIZED}{@link GL30#GL_VERTEX_ATTRIB_ARRAY_INTEGER VERTEX_ATTRIB_ARRAY_INTEGER}
    {@link GL33#GL_VERTEX_ATTRIB_ARRAY_DIVISOR VERTEX_ATTRIB_ARRAY_DIVISOR}{@link GL43#GL_VERTEX_ATTRIB_ARRAY_LONG VERTEX_ATTRIB_ARRAY_LONG}
    {@link GL43#GL_VERTEX_ATTRIB_RELATIVE_OFFSET VERTEX_ATTRIB_RELATIVE_OFFSET}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetVertexArrayIndexedi(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer param = stack.callocInt(1); + nglGetVertexArrayIndexediv(vaobj, index, pname, memAddress(param)); + return param.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexArrayIndexed64iv ] --- + + /** Unsafe version of: {@link #glGetVertexArrayIndexed64iv GetVertexArrayIndexed64iv} */ + public static native void nglGetVertexArrayIndexed64iv(int vaobj, int index, int pname, long param); + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. Must be:
    {@link GL43#GL_VERTEX_BINDING_OFFSET VERTEX_BINDING_OFFSET}
    + * @param param the buffer in which to return the parameter values + * + * @see Reference Page + */ + public static void glGetVertexArrayIndexed64iv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer param) { + if (CHECKS) { + check(param, 1); + } + nglGetVertexArrayIndexed64iv(vaobj, index, pname, memAddress(param)); + } + + /** + * Queries parameters of an attribute of a vertex array object. + * + * @param vaobj the vertex array object name + * @param index the attribute to query + * @param pname the parameter to query. Must be:
    {@link GL43#GL_VERTEX_BINDING_OFFSET VERTEX_BINDING_OFFSET}
    + * + * @see Reference Page + */ + @NativeType("void") + public static long glGetVertexArrayIndexed64i(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer param = stack.callocLong(1); + nglGetVertexArrayIndexed64iv(vaobj, index, pname, memAddress(param)); + return param.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCreateSamplers ] --- + + /** + * Unsafe version of: {@link #glCreateSamplers CreateSamplers} + * + * @param n the number of sampler object names to create + */ + public static native void nglCreateSamplers(int n, long samplers); + + /** + * Returns {@code n} previously unused sampler names in {@code samplers}, each representing a new sampler object. + * + * @param samplers the buffer in which to return the created sampler object names + * + * @see Reference Page + */ + public static void glCreateSamplers(@NativeType("GLuint *") IntBuffer samplers) { + nglCreateSamplers(samplers.remaining(), memAddress(samplers)); + } + + /** + * Returns {@code n} previously unused sampler names in {@code samplers}, each representing a new sampler object. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateSamplers() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer samplers = stack.callocInt(1); + nglCreateSamplers(1, memAddress(samplers)); + return samplers.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCreateProgramPipelines ] --- + + /** + * Unsafe version of: {@link #glCreateProgramPipelines CreateProgramPipelines} + * + * @param n the number of program pipeline names to create + */ + public static native void nglCreateProgramPipelines(int n, long pipelines); + + /** + * Returns {@code n} previously unused program pipeline names in {@code pipelines}, each representing a new program pipeline object. + * + * @param pipelines the buffer in which to return the created program pipeline names + * + * @see Reference Page + */ + public static void glCreateProgramPipelines(@NativeType("GLuint *") IntBuffer pipelines) { + nglCreateProgramPipelines(pipelines.remaining(), memAddress(pipelines)); + } + + /** + * Returns {@code n} previously unused program pipeline names in {@code pipelines}, each representing a new program pipeline object. + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateProgramPipelines() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer pipelines = stack.callocInt(1); + nglCreateProgramPipelines(1, memAddress(pipelines)); + return pipelines.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glCreateQueries ] --- + + /** + * Unsafe version of: {@link #glCreateQueries CreateQueries} + * + * @param n the number of query object names to create + */ + public static native void nglCreateQueries(int target, int n, long ids); + + /** + * Returns {@code n} previously unused query object names in {@code ids}, each representing a new query object with the specified {@code target}. + * + * @param target the query target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * @param ids the buffer in which to return the created query object names + * + * @see Reference Page + */ + public static void glCreateQueries(@NativeType("GLenum") int target, @NativeType("GLuint *") IntBuffer ids) { + nglCreateQueries(target, ids.remaining(), memAddress(ids)); + } + + /** + * Returns {@code n} previously unused query object names in {@code ids}, each representing a new query object with the specified {@code target}. + * + * @param target the query target. One of:
    {@link GL15#GL_SAMPLES_PASSED SAMPLES_PASSED}{@link GL30#GL_PRIMITIVES_GENERATED PRIMITIVES_GENERATED}{@link GL30#GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN}{@link GL33#GL_TIME_ELAPSED TIME_ELAPSED}
    {@link GL33#GL_TIMESTAMP TIMESTAMP}{@link GL33#GL_ANY_SAMPLES_PASSED ANY_SAMPLES_PASSED}{@link GL43#GL_ANY_SAMPLES_PASSED_CONSERVATIVE ANY_SAMPLES_PASSED_CONSERVATIVE}
    + * + * @see Reference Page + */ + @NativeType("void") + public static int glCreateQueries(@NativeType("GLenum") int target) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.callocInt(1); + nglCreateQueries(target, 1, memAddress(ids)); + return ids.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetQueryBufferObjectiv ] --- + + /** + * Queries the state of a query object. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + * + * @see Reference Page + */ + public static native void glGetQueryBufferObjectiv(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset); + + // --- [ glGetQueryBufferObjectuiv ] --- + + /** + * Unsigned version of {@link #glGetQueryBufferObjectiv GetQueryBufferObjectiv}. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + * + * @see Reference Page + */ + public static native void glGetQueryBufferObjectuiv(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset); + + // --- [ glGetQueryBufferObjecti64v ] --- + + /** + * 64bit version of {@link #glGetQueryBufferObjectiv GetQueryBufferObjectiv}. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + * + * @see Reference Page + */ + public static native void glGetQueryBufferObjecti64v(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset); + + // --- [ glGetQueryBufferObjectui64v ] --- + + /** + * 64bit version of {@link #glGetQueryBufferObjectuiv GetQueryBufferObjectuiv}. + * + * @param id the name of a query object + * @param buffer the name of a buffer object + * @param pname the state to query + * @param offset the offset into {@code buffer} at which the queried value is written + * + * @see Reference Page + */ + public static native void glGetQueryBufferObjectui64v(@NativeType("GLuint") int id, @NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLintptr") long offset); + + // --- [ glMemoryBarrierByRegion ] --- + + /** + * Behaves like {@link GL42C#glMemoryBarrier MemoryBarrier}, with two differences: + * + *

    First, it narrows the region under consideration so that only reads/writes of prior fragment shaders that are invoked for a smaller region of the + * framebuffer will be completed/reflected prior to subsequent reads/write of following fragment shaders. The size of the region is implementation + * dependent and may be as small as one framebuffer pixel.

    + * + *

    Second, it only applies to memory transactions that may be read by or written by a fragment shader.

    + * + *

    When barriers is {@link GL42#GL_ALL_BARRIER_BITS ALL_BARRIER_BITS}, shader memory accesses will be synchronized relative to all these barrier bits, but not to other + * barrier bits specific to {@link GL42C#glMemoryBarrier MemoryBarrier}. This implies that reads/writes for scatter/gather-like algorithms may or may not be + * completed/reflected after a MemoryBarrierByRegion command. However, for uses such as deferred shading, where a linked list of visible + * surfaces with the head at a framebuffer address may be constructed, and the entirety of the list is only dependent on previous executions at that + * framebuffer address, MemoryBarrierByRegion may be significantly more efficient than {@link GL42C#glMemoryBarrier MemoryBarrier}.

    + * + * @param barriers the barriers to insert. One or more of:
    {@link GL42#GL_ATOMIC_COUNTER_BARRIER_BIT ATOMIC_COUNTER_BARRIER_BIT}{@link GL42#GL_FRAMEBUFFER_BARRIER_BIT FRAMEBUFFER_BARRIER_BIT}{@link GL42#GL_SHADER_IMAGE_ACCESS_BARRIER_BIT SHADER_IMAGE_ACCESS_BARRIER_BIT}
    {@link GL43#GL_SHADER_STORAGE_BARRIER_BIT SHADER_STORAGE_BARRIER_BIT}{@link GL42#GL_TEXTURE_FETCH_BARRIER_BIT TEXTURE_FETCH_BARRIER_BIT}{@link GL42#GL_UNIFORM_BARRIER_BIT UNIFORM_BARRIER_BIT}
    + * + * @see Reference Page + */ + public static native void glMemoryBarrierByRegion(@NativeType("GLbitfield") int barriers); + + // --- [ glGetTextureSubImage ] --- + + /** + * Unsafe version of: {@link #glGetTextureSubImage GetTextureSubImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static native void nglGetTextureSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, int bufSize, long pixels); + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + nglGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + nglGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels.remaining(), memAddress(pixels)); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + nglGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels.remaining() << 1, memAddress(pixels)); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + nglGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels.remaining() << 2, memAddress(pixels)); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + nglGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels.remaining() << 2, memAddress(pixels)); + } + + /** + * Obtains sub-regions of a texture image from a texture object. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer pixels) { + nglGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels.remaining() << 3, memAddress(pixels)); + } + + // --- [ glGetCompressedTextureSubImage ] --- + + /** + * Unsafe version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} + * + * @param bufSize the size of the buffer to receive the retrieved pixel data + */ + public static native void nglGetCompressedTextureSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int bufSize, long pixels); + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param bufSize the size of the buffer to receive the retrieved pixel data + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + nglGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") ByteBuffer pixels) { + nglGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels.remaining(), memAddress(pixels)); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") ShortBuffer pixels) { + nglGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels.remaining() << 1, memAddress(pixels)); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") IntBuffer pixels) { + nglGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels.remaining() << 2, memAddress(pixels)); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") FloatBuffer pixels) { + nglGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels.remaining() << 2, memAddress(pixels)); + } + + /** + * Obtains a sub-region of a compressed texture image. + * + * @param texture the source texture object name + * @param level the level-of-detail number + * @param xoffset the x-position of the subregion + * @param yoffset the y-position of the subregion + * @param zoffset the z-position of the subregion + * @param width the subregion width + * @param height the subregion height + * @param depth the subregion depth + * @param pixels the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") DoubleBuffer pixels) { + nglGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels.remaining() << 3, memAddress(pixels)); + } + + // --- [ glTextureBarrier ] --- + + /** + * Guarantees that writes have completed and caches have been invalidated before subsequent Draws are executed. + * + * @see Reference Page + */ + public static native void glTextureBarrier(); + + // --- [ glGetGraphicsResetStatus ] --- + + /** + * Indicates if the GL context has been in a reset state at any point since the last call to GetGraphicsResetStatus: + * + *
      + *
    • {@link GL11#GL_NO_ERROR NO_ERROR} indicates that the GL context has not been in a reset state since the last call.
    • + *
    • {@link #GL_GUILTY_CONTEXT_RESET GUILTY_CONTEXT_RESET} indicates that a reset has been detected that is attributable to the current GL context.
    • + *
    • {@link #GL_INNOCENT_CONTEXT_RESET INNOCENT_CONTEXT_RESET} indicates a reset has been detected that is not attributable to the current GL context.
    • + *
    • {@link #GL_UNKNOWN_CONTEXT_RESET UNKNOWN_CONTEXT_RESET} indicates a detected graphics reset whose cause is unknown.
    • + *
    + * + *

    If a reset status other than NO_ERROR is returned and subsequent calls return NO_ERROR, the context reset was encountered and completed. If a reset + * status is repeatedly returned, the context may be in the process of resetting.

    + * + *

    Reset notification behavior is determined at context creation time, and may be queried by calling GetIntegerv with the symbolic constant + * {@link #GL_RESET_NOTIFICATION_STRATEGY RESET_NOTIFICATION_STRATEGY}.

    + * + *

    If the reset notification behavior is {@link #GL_NO_RESET_NOTIFICATION NO_RESET_NOTIFICATION}, then the implementation will never deliver notification of reset events, and + * GetGraphicsResetStatus will always return NO_ERROR.

    + * + *

    If the behavior is {@link #GL_LOSE_CONTEXT_ON_RESET LOSE_CONTEXT_ON_RESET}, a graphics reset will result in a lost context and require creating a new context as described + * above. In this case GetGraphicsResetStatus will return an appropriate value from those described above.

    + * + *

    If a graphics reset notification occurs in a context, a notification must also occur in all other contexts which share objects with that context.

    + * + *

    After a graphics reset has occurred on a context, subsequent GL commands on that context (or any context which shares with that context) will generate a + * {@link #GL_CONTEXT_LOST CONTEXT_LOST} error. Such commands will not have side effects (in particular, they will not modify memory passed by pointer for query results, + * and may not block indefinitely or cause termination of the application. Exceptions to this behavior include:

    + * + *
      + *
    • {@link GL11C#glGetError GetError} and GetGraphicsResetStatus behave normally following a graphics reset, so that the application can determine a reset has + * occurred, and when it is safe to destroy and recreate the context.
    • + *
    • Any commands which might cause a polling application to block indefinitely will generate a CONTEXT_LOST error, but will also return a value + * indicating completion to the application.
    • + *
    + * + * @see Reference Page + */ + @NativeType("GLenum") + public static native int glGetGraphicsResetStatus(); + + // --- [ glGetnTexImage ] --- + + /** + * Unsafe version of: {@link #glGetnTexImage GetnTexImage} + * + * @param bufSize the maximum number of bytes to write into {@code img} + */ + public static native void nglGetnTexImage(int tex, int level, int format, int type, int bufSize, long img); + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param bufSize the maximum number of bytes to write into {@code img} + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long img) { + nglGetnTexImage(tex, level, format, type, bufSize, img); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer img) { + nglGetnTexImage(tex, level, format, type, img.remaining(), memAddress(img)); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer img) { + nglGetnTexImage(tex, level, format, type, img.remaining() << 1, memAddress(img)); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer img) { + nglGetnTexImage(tex, level, format, type, img.remaining() << 2, memAddress(img)); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer img) { + nglGetnTexImage(tex, level, format, type, img.remaining() << 2, memAddress(img)); + } + + /** + * Robust version of {@link GL11C#glGetTexImage GetTexImage} + * + * @param tex the texture (or texture face) to be obtained. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    + * @param level the level-of-detail number + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") DoubleBuffer img) { + nglGetnTexImage(tex, level, format, type, img.remaining() << 3, memAddress(img)); + } + + // --- [ glReadnPixels ] --- + + /** + * Unsafe version of: {@link #glReadnPixels ReadnPixels} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static native void nglReadnPixels(int x, int y, int width, int height, int format, int type, int bufSize, long pixels); + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param bufSize the maximum number of bytes to write into {@code data} + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + nglReadnPixels(x, y, width, height, format, type, bufSize, pixels); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + nglReadnPixels(x, y, width, height, format, type, pixels.remaining(), memAddress(pixels)); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + nglReadnPixels(x, y, width, height, format, type, pixels.remaining() << 1, memAddress(pixels)); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + nglReadnPixels(x, y, width, height, format, type, pixels.remaining() << 2, memAddress(pixels)); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + nglReadnPixels(x, y, width, height, format, type, pixels.remaining() << 2, memAddress(pixels)); + } + + // --- [ glGetnCompressedTexImage ] --- + + /** + * Unsafe version of: {@link #glGetnCompressedTexImage GetnCompressedTexImage} + * + * @param bufSize the maximum number of bytes to write into {@code img} + */ + public static native void nglGetnCompressedTexImage(int target, int level, int bufSize, long img); + + /** + * Robust version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage} + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param bufSize the maximum number of bytes to write into {@code img} + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnCompressedTexImage(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("GLsizei") int bufSize, @NativeType("void *") long img) { + nglGetnCompressedTexImage(target, level, bufSize, img); + } + + /** + * Robust version of {@link GL13C#glGetCompressedTexImage GetCompressedTexImage} + * + * @param target the target texture. One of:
    {@link GL11#GL_TEXTURE_1D TEXTURE_1D}{@link GL11#GL_TEXTURE_2D TEXTURE_2D}{@link GL30#GL_TEXTURE_1D_ARRAY TEXTURE_1D_ARRAY}
    {@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_POSITIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Y}
    {@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y}{@link GL13#GL_TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_POSITIVE_Z}{@link GL13#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z}
    {@link GL12#GL_TEXTURE_3D TEXTURE_3D}{@link GL30#GL_TEXTURE_2D_ARRAY TEXTURE_2D_ARRAY}{@link GL40#GL_TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP_ARRAY}
    + * @param level the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. + * @param img a buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnCompressedTexImage(@NativeType("GLenum") int target, @NativeType("GLint") int level, @NativeType("void *") ByteBuffer img) { + if (CHECKS) { + if (DEBUG) { + check(img, GL11.glGetTexLevelParameteri(target, level, GL13.GL_TEXTURE_COMPRESSED_IMAGE_SIZE)); + } + } + nglGetnCompressedTexImage(target, level, img.remaining(), memAddress(img)); + } + + // --- [ glGetnUniformfv ] --- + + /** + * Unsafe version of: {@link #glGetnUniformfv GetnUniformfv} + * + * @param bufSize the maximum number of bytes to write to {@code params} + */ + public static native void nglGetnUniformfv(int program, int location, int bufSize, long params); + + /** + * Returns the value or values of a uniform of the default uniform block. + * + * @param program the program object + * @param location the uniform location + * @param params the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnUniformfv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") FloatBuffer params) { + nglGetnUniformfv(program, location, params.remaining(), memAddress(params)); + } + + /** + * Returns the value or values of a uniform of the default uniform block. + * + * @param program the program object + * @param location the uniform location + * + * @see Reference Page + */ + @NativeType("void") + public static float glGetnUniformf(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer params = stack.callocFloat(1); + nglGetnUniformfv(program, location, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnUniformdv ] --- + + /** + * Unsafe version of: {@link #glGetnUniformdv GetnUniformdv} + * + * @param bufSize the maximum number of bytes to write to {@code params} + */ + public static native void nglGetnUniformdv(int program, int location, int bufSize, long params); + + /** + * Double version of {@link #glGetnUniformfv GetnUniformfv}. + * + * @param program the program object + * @param location the uniform location + * @param params the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnUniformdv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") DoubleBuffer params) { + nglGetnUniformdv(program, location, params.remaining(), memAddress(params)); + } + + /** + * Double version of {@link #glGetnUniformfv GetnUniformfv}. + * + * @param program the program object + * @param location the uniform location + * + * @see Reference Page + */ + @NativeType("void") + public static double glGetnUniformd(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + DoubleBuffer params = stack.callocDouble(1); + nglGetnUniformdv(program, location, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnUniformiv ] --- + + /** + * Unsafe version of: {@link #glGetnUniformiv GetnUniformiv} + * + * @param bufSize the maximum number of bytes to write to {@code params} + */ + public static native void nglGetnUniformiv(int program, int location, int bufSize, long params); + + /** + * Integer version of {@link #glGetnUniformfv GetnUniformfv}. + * + * @param program the program object + * @param location the uniform location + * @param params the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnUniformiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") IntBuffer params) { + nglGetnUniformiv(program, location, params.remaining(), memAddress(params)); + } + + /** + * Integer version of {@link #glGetnUniformfv GetnUniformfv}. + * + * @param program the program object + * @param location the uniform location + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetnUniformi(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetnUniformiv(program, location, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetnUniformuiv ] --- + + /** + * Unsafe version of: {@link #glGetnUniformuiv GetnUniformuiv} + * + * @param bufSize the maximum number of bytes to write to {@code params} + */ + public static native void nglGetnUniformuiv(int program, int location, int bufSize, long params); + + /** + * Unsigned version of {@link #glGetnUniformiv GetnUniformiv}. + * + * @param program the program object + * @param location the uniform location + * @param params the buffer in which to place the returned data + * + * @see Reference Page + */ + public static void glGetnUniformuiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") IntBuffer params) { + nglGetnUniformuiv(program, location, params.remaining(), memAddress(params)); + } + + /** + * Unsigned version of {@link #glGetnUniformiv GetnUniformiv}. + * + * @param program the program object + * @param location the uniform location + * + * @see Reference Page + */ + @NativeType("void") + public static int glGetnUniformui(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetnUniformuiv(program, location, 1, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Array version of: {@link #glCreateTransformFeedbacks CreateTransformFeedbacks} + * + * @see Reference Page + */ + public static void glCreateTransformFeedbacks(@NativeType("GLuint *") int[] ids) { + long __functionAddress = GL.getICD().glCreateTransformFeedbacks; + if (CHECKS) { + check(__functionAddress); + } + callPV(ids.length, ids, __functionAddress); + } + + /** + * Array version of: {@link #glGetTransformFeedbackiv GetTransformFeedbackiv} + * + * @see Reference Page + */ + public static void glGetTransformFeedbackiv(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + long __functionAddress = GL.getICD().glGetTransformFeedbackiv; + if (CHECKS) { + check(__functionAddress); + check(param, 1); + } + callPV(xfb, pname, param, __functionAddress); + } + + /** + * Array version of: {@link #glGetTransformFeedbacki_v GetTransformFeedbacki_v} + * + * @see Reference Page + */ + public static void glGetTransformFeedbacki_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint *") int[] param) { + long __functionAddress = GL.getICD().glGetTransformFeedbacki_v; + if (CHECKS) { + check(__functionAddress); + check(param, 1); + } + callPV(xfb, pname, index, param, __functionAddress); + } + + /** + * Array version of: {@link #glGetTransformFeedbacki64_v GetTransformFeedbacki64_v} + * + * @see Reference Page + */ + public static void glGetTransformFeedbacki64_v(@NativeType("GLuint") int xfb, @NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLint64 *") long[] param) { + long __functionAddress = GL.getICD().glGetTransformFeedbacki64_v; + if (CHECKS) { + check(__functionAddress); + check(param, 1); + } + callPV(xfb, pname, index, param, __functionAddress); + } + + /** + * Array version of: {@link #glCreateBuffers CreateBuffers} + * + * @see Reference Page + */ + public static void glCreateBuffers(@NativeType("GLuint *") int[] buffers) { + long __functionAddress = GL.getICD().glCreateBuffers; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffers.length, buffers, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferStorage NamedBufferStorage} + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") short[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glNamedBufferStorage; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 1, data, flags, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferStorage NamedBufferStorage} + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") int[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glNamedBufferStorage; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 2, data, flags, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferStorage NamedBufferStorage} + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") float[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glNamedBufferStorage; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 2, data, flags, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferStorage NamedBufferStorage} + * + * @see Reference Page + */ + public static void glNamedBufferStorage(@NativeType("GLuint") int buffer, @NativeType("void const *") double[] data, @NativeType("GLbitfield") int flags) { + long __functionAddress = GL.getICD().glNamedBufferStorage; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 3, data, flags, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferData NamedBufferData} + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") short[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glNamedBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 1, data, usage, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferData NamedBufferData} + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") int[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glNamedBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 2, data, usage, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferData NamedBufferData} + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") long[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glNamedBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 3, data, usage, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferData NamedBufferData} + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") float[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glNamedBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 2, data, usage, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferData NamedBufferData} + * + * @see Reference Page + */ + public static void glNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("void const *") double[] data, @NativeType("GLenum") int usage) { + long __functionAddress = GL.getICD().glNamedBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPPV(buffer, Integer.toUnsignedLong(data.length) << 3, data, usage, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 1, data, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") long[] data) { + long __functionAddress = GL.getICD().glNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** + * Array version of: {@link #glNamedBufferSubData NamedBufferSubData} + * + * @see Reference Page + */ + public static void glNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") double[] data) { + long __functionAddress = GL.getICD().glNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearNamedBufferData ClearNamedBufferData} + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffer, internalformat, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearNamedBufferData ClearNamedBufferData} + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffer, internalformat, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearNamedBufferData ClearNamedBufferData} + * + * @see Reference Page + */ + public static void glClearNamedBufferData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferData; + if (CHECKS) { + check(__functionAddress); + } + callPV(buffer, internalformat, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, internalformat, offset, size, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, internalformat, offset, size, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glClearNamedBufferSubData ClearNamedBufferSubData} + * + * @see Reference Page + */ + public static void glClearNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLenum") int internalformat, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @Nullable @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glClearNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, internalformat, offset, size, format, type, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetNamedBufferParameteriv GetNamedBufferParameteriv} + * + * @see Reference Page + */ + public static void glGetNamedBufferParameteriv(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedBufferParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(buffer, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetNamedBufferParameteri64v GetNamedBufferParameteri64v} + * + * @see Reference Page + */ + public static void glGetNamedBufferParameteri64v(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + long __functionAddress = GL.getICD().glGetNamedBufferParameteri64v; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(buffer, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") short[] data) { + long __functionAddress = GL.getICD().glGetNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 1, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") int[] data) { + long __functionAddress = GL.getICD().glGetNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") long[] data) { + long __functionAddress = GL.getICD().glGetNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") float[] data) { + long __functionAddress = GL.getICD().glGetNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** + * Array version of: {@link #glGetNamedBufferSubData GetNamedBufferSubData} + * + * @see Reference Page + */ + public static void glGetNamedBufferSubData(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void *") double[] data) { + long __functionAddress = GL.getICD().glGetNamedBufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(buffer, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** + * Array version of: {@link #glCreateFramebuffers CreateFramebuffers} + * + * @see Reference Page + */ + public static void glCreateFramebuffers(@NativeType("GLuint *") int[] framebuffers) { + long __functionAddress = GL.getICD().glCreateFramebuffers; + if (CHECKS) { + check(__functionAddress); + } + callPV(framebuffers.length, framebuffers, __functionAddress); + } + + /** + * Array version of: {@link #glNamedFramebufferDrawBuffers NamedFramebufferDrawBuffers} + * + * @see Reference Page + */ + public static void glNamedFramebufferDrawBuffers(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int[] bufs) { + long __functionAddress = GL.getICD().glNamedFramebufferDrawBuffers; + if (CHECKS) { + check(__functionAddress); + } + callPV(framebuffer, bufs.length, bufs, __functionAddress); + } + + /** + * Array version of: {@link #glInvalidateNamedFramebufferData InvalidateNamedFramebufferData} + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int[] attachments) { + long __functionAddress = GL.getICD().glInvalidateNamedFramebufferData; + if (CHECKS) { + check(__functionAddress); + } + callPV(framebuffer, attachments.length, attachments, __functionAddress); + } + + /** + * Array version of: {@link #glInvalidateNamedFramebufferSubData InvalidateNamedFramebufferSubData} + * + * @see Reference Page + */ + public static void glInvalidateNamedFramebufferSubData(@NativeType("GLuint") int framebuffer, @NativeType("GLenum const *") int[] attachments, @NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height) { + long __functionAddress = GL.getICD().glInvalidateNamedFramebufferSubData; + if (CHECKS) { + check(__functionAddress); + } + callPV(framebuffer, attachments.length, attachments, x, y, width, height, __functionAddress); + } + + /** + * Array version of: {@link #glClearNamedFramebufferiv ClearNamedFramebufferiv} + * + * @see Reference Page + */ + public static void glClearNamedFramebufferiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glClearNamedFramebufferiv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(framebuffer, buffer, drawbuffer, value, __functionAddress); + } + + /** + * Array version of: {@link #glClearNamedFramebufferuiv ClearNamedFramebufferuiv} + * + * @see Reference Page + */ + public static void glClearNamedFramebufferuiv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glClearNamedFramebufferuiv; + if (CHECKS) { + check(__functionAddress); + check(value, 4); + } + callPV(framebuffer, buffer, drawbuffer, value, __functionAddress); + } + + /** + * Array version of: {@link #glClearNamedFramebufferfv ClearNamedFramebufferfv} + * + * @see Reference Page + */ + public static void glClearNamedFramebufferfv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int buffer, @NativeType("GLint") int drawbuffer, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glClearNamedFramebufferfv; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(framebuffer, buffer, drawbuffer, value, __functionAddress); + } + + /** + * Array version of: {@link #glGetNamedFramebufferParameteriv GetNamedFramebufferParameteriv} + * + * @see Reference Page + */ + public static void glGetNamedFramebufferParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedFramebufferParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(framebuffer, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetNamedFramebufferAttachmentParameteriv GetNamedFramebufferAttachmentParameteriv} + * + * @see Reference Page + */ + public static void glGetNamedFramebufferAttachmentParameteriv(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedFramebufferAttachmentParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(framebuffer, attachment, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glCreateRenderbuffers CreateRenderbuffers} + * + * @see Reference Page + */ + public static void glCreateRenderbuffers(@NativeType("GLuint *") int[] renderbuffers) { + long __functionAddress = GL.getICD().glCreateRenderbuffers; + if (CHECKS) { + check(__functionAddress); + } + callPV(renderbuffers.length, renderbuffers, __functionAddress); + } + + /** + * Array version of: {@link #glGetNamedRenderbufferParameteriv GetNamedRenderbufferParameteriv} + * + * @see Reference Page + */ + public static void glGetNamedRenderbufferParameteriv(@NativeType("GLuint") int renderbuffer, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetNamedRenderbufferParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(renderbuffer, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glCreateTextures CreateTextures} + * + * @see Reference Page + */ + public static void glCreateTextures(@NativeType("GLenum") int target, @NativeType("GLuint *") int[] textures) { + long __functionAddress = GL.getICD().glCreateTextures; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, textures.length, textures, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage1D TextureSubImage1D} + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage1D TextureSubImage1D} + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage1D TextureSubImage1D} + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage1D TextureSubImage1D} + * + * @see Reference Page + */ + public static void glTextureSubImage1D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLsizei") int width, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage1D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, width, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage2D TextureSubImage2D} + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage2D TextureSubImage2D} + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage2D TextureSubImage2D} + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage2D TextureSubImage2D} + * + * @see Reference Page + */ + public static void glTextureSubImage2D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage2D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, width, height, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage3D TextureSubImage3D} + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") short[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage3D TextureSubImage3D} + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") int[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage3D TextureSubImage3D} + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") float[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureSubImage3D TextureSubImage3D} + * + * @see Reference Page + */ + public static void glTextureSubImage3D(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void const *") double[] pixels) { + long __functionAddress = GL.getICD().glTextureSubImage3D; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glTextureParameterfv TextureParameterfv} + * + * @see Reference Page + */ + public static void glTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] params) { + long __functionAddress = GL.getICD().glTextureParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(texture, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTextureParameterIiv TextureParameterIiv} + * + * @see Reference Page + */ + public static void glTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glTextureParameterIiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTextureParameterIuiv TextureParameterIuiv} + * + * @see Reference Page + */ + public static void glTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint const *") int[] params) { + long __functionAddress = GL.getICD().glTextureParameterIuiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glTextureParameteriv TextureParameteriv} + * + * @see Reference Page + */ + public static void glTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glTextureParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 4); + } + callPV(texture, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureImage GetTextureImage} + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + long __functionAddress = GL.getICD().glGetTextureImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, format, type, pixels.length << 1, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureImage GetTextureImage} + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + long __functionAddress = GL.getICD().glGetTextureImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, format, type, pixels.length << 2, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureImage GetTextureImage} + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + long __functionAddress = GL.getICD().glGetTextureImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, format, type, pixels.length << 2, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureImage GetTextureImage} + * + * @see Reference Page + */ + public static void glGetTextureImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] pixels) { + long __functionAddress = GL.getICD().glGetTextureImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, format, type, pixels.length << 3, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureLevelParameterfv GetTextureLevelParameterfv} + * + * @see Reference Page + */ + public static void glGetTextureLevelParameterfv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetTextureLevelParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, level, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureLevelParameteriv GetTextureLevelParameteriv} + * + * @see Reference Page + */ + public static void glGetTextureLevelParameteriv(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetTextureLevelParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, level, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureParameterfv GetTextureParameterfv} + * + * @see Reference Page + */ + public static void glGetTextureParameterfv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetTextureParameterfv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureParameterIiv GetTextureParameterIiv} + * + * @see Reference Page + */ + public static void glGetTextureParameterIiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetTextureParameterIiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureParameterIuiv GetTextureParameterIuiv} + * + * @see Reference Page + */ + public static void glGetTextureParameterIuiv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetTextureParameterIuiv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureParameteriv GetTextureParameteriv} + * + * @see Reference Page + */ + public static void glGetTextureParameteriv(@NativeType("GLuint") int texture, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetTextureParameteriv; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(texture, pname, params, __functionAddress); + } + + /** + * Array version of: {@link #glCreateVertexArrays CreateVertexArrays} + * + * @see Reference Page + */ + public static void glCreateVertexArrays(@NativeType("GLuint *") int[] arrays) { + long __functionAddress = GL.getICD().glCreateVertexArrays; + if (CHECKS) { + check(__functionAddress); + } + callPV(arrays.length, arrays, __functionAddress); + } + + /** + * Array version of: {@link #glVertexArrayVertexBuffers VertexArrayVertexBuffers} + * + * @see Reference Page + */ + public static void glVertexArrayVertexBuffers(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int first, @Nullable @NativeType("GLuint const *") int[] buffers, @Nullable @NativeType("GLintptr const *") PointerBuffer offsets, @Nullable @NativeType("GLsizei const *") int[] strides) { + long __functionAddress = GL.getICD().glVertexArrayVertexBuffers; + if (CHECKS) { + check(__functionAddress); + checkSafe(offsets, lengthSafe(buffers)); + checkSafe(strides, lengthSafe(buffers)); + } + callPPPV(vaobj, first, lengthSafe(buffers), buffers, memAddressSafe(offsets), strides, __functionAddress); + } + + /** + * Array version of: {@link #glGetVertexArrayiv GetVertexArrayiv} + * + * @see Reference Page + */ + public static void glGetVertexArrayiv(@NativeType("GLuint") int vaobj, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + long __functionAddress = GL.getICD().glGetVertexArrayiv; + if (CHECKS) { + check(__functionAddress); + check(param, 1); + } + callPV(vaobj, pname, param, __functionAddress); + } + + /** + * Array version of: {@link #glGetVertexArrayIndexediv GetVertexArrayIndexediv} + * + * @see Reference Page + */ + public static void glGetVertexArrayIndexediv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] param) { + long __functionAddress = GL.getICD().glGetVertexArrayIndexediv; + if (CHECKS) { + check(__functionAddress); + check(param, 1); + } + callPV(vaobj, index, pname, param, __functionAddress); + } + + /** + * Array version of: {@link #glGetVertexArrayIndexed64iv GetVertexArrayIndexed64iv} + * + * @see Reference Page + */ + public static void glGetVertexArrayIndexed64iv(@NativeType("GLuint") int vaobj, @NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] param) { + long __functionAddress = GL.getICD().glGetVertexArrayIndexed64iv; + if (CHECKS) { + check(__functionAddress); + check(param, 1); + } + callPV(vaobj, index, pname, param, __functionAddress); + } + + /** + * Array version of: {@link #glCreateSamplers CreateSamplers} + * + * @see Reference Page + */ + public static void glCreateSamplers(@NativeType("GLuint *") int[] samplers) { + long __functionAddress = GL.getICD().glCreateSamplers; + if (CHECKS) { + check(__functionAddress); + } + callPV(samplers.length, samplers, __functionAddress); + } + + /** + * Array version of: {@link #glCreateProgramPipelines CreateProgramPipelines} + * + * @see Reference Page + */ + public static void glCreateProgramPipelines(@NativeType("GLuint *") int[] pipelines) { + long __functionAddress = GL.getICD().glCreateProgramPipelines; + if (CHECKS) { + check(__functionAddress); + } + callPV(pipelines.length, pipelines, __functionAddress); + } + + /** + * Array version of: {@link #glCreateQueries CreateQueries} + * + * @see Reference Page + */ + public static void glCreateQueries(@NativeType("GLenum") int target, @NativeType("GLuint *") int[] ids) { + long __functionAddress = GL.getICD().glCreateQueries; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, ids.length, ids, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureSubImage GetTextureSubImage} + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + long __functionAddress = GL.getICD().glGetTextureSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels.length << 1, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureSubImage GetTextureSubImage} + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + long __functionAddress = GL.getICD().glGetTextureSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels.length << 2, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureSubImage GetTextureSubImage} + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + long __functionAddress = GL.getICD().glGetTextureSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels.length << 2, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetTextureSubImage GetTextureSubImage} + * + * @see Reference Page + */ + public static void glGetTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] pixels) { + long __functionAddress = GL.getICD().glGetTextureSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels.length << 3, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") short[] pixels) { + long __functionAddress = GL.getICD().glGetCompressedTextureSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels.length << 1, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") int[] pixels) { + long __functionAddress = GL.getICD().glGetCompressedTextureSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels.length << 2, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") float[] pixels) { + long __functionAddress = GL.getICD().glGetCompressedTextureSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels.length << 2, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetCompressedTextureSubImage GetCompressedTextureSubImage} + * + * @see Reference Page + */ + public static void glGetCompressedTextureSubImage(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("void *") double[] pixels) { + long __functionAddress = GL.getICD().glGetCompressedTextureSubImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(texture, level, xoffset, yoffset, zoffset, width, height, depth, pixels.length << 3, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetnTexImage GetnTexImage} + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] img) { + long __functionAddress = GL.getICD().glGetnTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, img.length << 1, img, __functionAddress); + } + + /** + * Array version of: {@link #glGetnTexImage GetnTexImage} + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] img) { + long __functionAddress = GL.getICD().glGetnTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, img.length << 2, img, __functionAddress); + } + + /** + * Array version of: {@link #glGetnTexImage GetnTexImage} + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] img) { + long __functionAddress = GL.getICD().glGetnTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, img.length << 2, img, __functionAddress); + } + + /** + * Array version of: {@link #glGetnTexImage GetnTexImage} + * + * @see Reference Page + */ + public static void glGetnTexImage(@NativeType("GLenum") int tex, @NativeType("GLint") int level, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") double[] img) { + long __functionAddress = GL.getICD().glGetnTexImage; + if (CHECKS) { + check(__functionAddress); + } + callPV(tex, level, format, type, img.length << 3, img, __functionAddress); + } + + /** + * Array version of: {@link #glReadnPixels ReadnPixels} + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + long __functionAddress = GL.getICD().glReadnPixels; + if (CHECKS) { + check(__functionAddress); + } + callPV(x, y, width, height, format, type, pixels.length << 1, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glReadnPixels ReadnPixels} + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + long __functionAddress = GL.getICD().glReadnPixels; + if (CHECKS) { + check(__functionAddress); + } + callPV(x, y, width, height, format, type, pixels.length << 2, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glReadnPixels ReadnPixels} + * + * @see Reference Page + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + long __functionAddress = GL.getICD().glReadnPixels; + if (CHECKS) { + check(__functionAddress); + } + callPV(x, y, width, height, format, type, pixels.length << 2, pixels, __functionAddress); + } + + /** + * Array version of: {@link #glGetnUniformfv GetnUniformfv} + * + * @see Reference Page + */ + public static void glGetnUniformfv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetnUniformfv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, params.length, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetnUniformdv GetnUniformdv} + * + * @see Reference Page + */ + public static void glGetnUniformdv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLdouble *") double[] params) { + long __functionAddress = GL.getICD().glGetnUniformdv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, params.length, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetnUniformiv GetnUniformiv} + * + * @see Reference Page + */ + public static void glGetnUniformiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetnUniformiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, params.length, params, __functionAddress); + } + + /** + * Array version of: {@link #glGetnUniformuiv GetnUniformuiv} + * + * @see Reference Page + */ + public static void glGetnUniformuiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetnUniformuiv; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, params.length, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL46.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL46.java new file mode 100644 index 000000000..dafe9a727 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL46.java @@ -0,0 +1,373 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * The OpenGL functionality up to version 4.6. Includes the deprecated symbols of the Compatibility Profile. + * + *

    OpenGL 4.6 implementations support revision 4.60 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL46 extends GL45 { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, + * MapBufferRange, FlushMappedBufferRange, GetBufferParameteriv, and CopyBufferSubData. + */ + public static final int GL_PARAMETER_BUFFER = 0x80EE; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int GL_PARAMETER_BUFFER_BINDING = 0x80EF; + + /** + * Accepted by the {@code target} parameter of {@link GL15C#glBeginQuery BeginQuery}, {@link GL15C#glEndQuery EndQuery}, {@link GL15C#glGetQueryiv GetQueryiv}, + * {@link GL40C#glBeginQueryIndexed BeginQueryIndexed}, {@link GL40C#glEndQueryIndexed EndQueryIndexed} and {@link GL40C#glGetQueryIndexediv GetQueryIndexediv}. + */ + public static final int + GL_VERTICES_SUBMITTED = 0x82EE, + GL_PRIMITIVES_SUBMITTED = 0x82EF, + GL_VERTEX_SHADER_INVOCATIONS = 0x82F0, + GL_TESS_CONTROL_SHADER_PATCHES = 0x82F1, + GL_TESS_EVALUATION_SHADER_INVOCATIONS = 0x82F2, + GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED = 0x82F3, + GL_FRAGMENT_SHADER_INVOCATIONS = 0x82F4, + GL_COMPUTE_SHADER_INVOCATIONS = 0x82F5, + GL_CLIPPING_INPUT_PRIMITIVES = 0x82F6, + GL_CLIPPING_OUTPUT_PRIMITIVES = 0x82F7; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_POLYGON_OFFSET_CLAMP = 0x8E1B; + + /** If set in {@link GL30#GL_CONTEXT_FLAGS CONTEXT_FLAGS}, then no error behavior is enabled for this context. */ + public static final int GL_CONTEXT_FLAG_NO_ERROR_BIT = 0x8; + + /** Accepted by the {@code binaryformat} parameter of {@link GL41C#glShaderBinary ShaderBinary}. */ + public static final int GL_SHADER_BINARY_FORMAT_SPIR_V = 0x9551; + + /** Accepted by the {@code pname} parameter of {@link GL20C#glGetShaderiv GetShaderiv}. */ + public static final int GL_SPIR_V_BINARY = 0x9552; + + /** Accepted by the {@code name} parameter of {@link GL30C#glGetStringi GetStringi}. */ + public static final int GL_SPIR_V_EXTENSIONS = 0x9553; + + /** Accepted by the {@code pname} parameter of {@link GL11C#glGetIntegerv GetIntegerv}. */ + public static final int GL_NUM_SPIR_V_EXTENSIONS = 0x9554; + + /** Accepted by the {@code pname} parameters of GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameterfv, TexParameteri, and TexParameteriv. */ + public static final int GL_TEXTURE_MAX_ANISOTROPY = 0x84FE; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv. */ + public static final int GL_MAX_TEXTURE_MAX_ANISOTROPY = 0x84FF; + + /** + * Accepted by the {@code target} parameter of {@link GL15C#glBeginQuery BeginQuery}, {@link GL15C#glEndQuery EndQuery}, {@link GL15C#glGetQueryiv GetQueryiv}, + * {@link GL40C#glBeginQueryIndexed BeginQueryIndexed}, {@link GL40C#glEndQueryIndexed EndQueryIndexed} and {@link GL40C#glGetQueryIndexediv GetQueryIndexediv}. + */ + public static final int + GL_TRANSFORM_FEEDBACK_OVERFLOW = 0x82EC, + GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW = 0x82ED; + + protected GL46() { + throw new UnsupportedOperationException(); + } + + // --- [ glMultiDrawArraysIndirectCount ] --- + + /** Unsafe version of: {@link #glMultiDrawArraysIndirectCount MultiDrawArraysIndirectCount} */ + public static void nglMultiDrawArraysIndirectCount(int mode, long indirect, long drawcount, int maxdrawcount, int stride) { + GL46C.nglMultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link GL46C#GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirectCount(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + GL46C.glMultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link GL46C#GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirectCount(@NativeType("GLenum") int mode, @NativeType("void const *") long indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + GL46C.glMultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link GL46C#GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirectCount(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + GL46C.glMultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride); + } + + // --- [ glMultiDrawElementsIndirectCount ] --- + + /** Unsafe version of: {@link #glMultiDrawElementsIndirectCount MultiDrawElementsIndirectCount} */ + public static void nglMultiDrawElementsIndirectCount(int mode, int type, long indirect, long drawcount, int maxdrawcount, int stride) { + GL46C.nglMultiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link GL46C#GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirectCount(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + GL46C.glMultiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link GL46C#GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirectCount(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") long indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + GL46C.glMultiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link GL46C#GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirectCount(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + GL46C.glMultiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride); + } + + // --- [ glPolygonOffsetClamp ] --- + + /** + * The depth values of all fragments generated by the rasterization of a polygon may be offset by a single value that is computed for that polygon. This + * function determines this value. + * + *

    {@code factor} scales the maximum depth slope of the polygon, and {@code units} scales an implementation-dependent constant that relates to the usable + * resolution of the depth buffer. The resulting values are summed to produce the polygon offset value, which may then be clamped to a minimum or maximum + * value specified by {@code clamp}.

    + * + *

    The values {@code factor}, {@code units}, and {@code clamp} may each be positive, negative, or zero. Calling the command {@link GL11C#glPolygonOffset PolygonOffset} is equivalent + * to calling the command {@code PolygonOffsetClamp} with clamp equal to zero.

    + * + * @param factor scales the maximum depth slope of the polygon + * @param units scales an implementation-dependent constant that relates to the usable resolution of the depth buffer + * @param clamp the minimum or maximum polygon offset value + * + * @see Reference Page + */ + public static void glPolygonOffsetClamp(@NativeType("GLfloat") float factor, @NativeType("GLfloat") float units, @NativeType("GLfloat") float clamp) { + GL46C.glPolygonOffsetClamp(factor, units, clamp); + } + + // --- [ glSpecializeShader ] --- + + /** + * Unsafe version of: {@link #glSpecializeShader SpecializeShader} + * + * @param numSpecializationConstants the number of specialization constants whose values to set in this call + */ + public static void nglSpecializeShader(int shader, long pEntryPoint, int numSpecializationConstants, long pConstantIndex, long pConstantValue) { + GL46C.nglSpecializeShader(shader, pEntryPoint, numSpecializationConstants, pConstantIndex, pConstantValue); + } + + /** + * Specializes a shader created from a SPIR-V module. + * + *

    Shaders associated with SPIR-V modules must be specialized before they can be linked into a program object. It is not necessary to specialize the + * shader before it is attached to a program object. Once specialized, a shader may not be specialized again without first re-associating the original + * SPIR-V module with it, through {@link GL41C#glShaderBinary ShaderBinary}.

    + * + *

    Specialization does two things:

    + * + *
      + *
    • Selects the name of the entry point, for that shader’s stage, from the SPIR-V module.
    • + *
    • Sets the values of all, or a subset of, the specialization constants in the SPIRV module.
    • + *
    + * + *

    On successful shader specialization, the compile status for shader is set to {@link GL11#GL_TRUE TRUE}. On failure, the compile status for shader is set to {@link GL11#GL_FALSE FALSE} and + * additional information about the cause of the failure may be available in the shader compilation log.

    + * + * @param shader the name of a shader object containing unspecialized SPIR-V as created from a successful call to {@link GL41C#glShaderBinary ShaderBinary} to which a SPIR-V module was + * passed + * @param pEntryPoint a pointer to a null-terminated UTF-8 string specifying the name of the entry point in the SPIR-V module to use for this shader + * @param pConstantIndex is a pointer to an array of {@code numSpecializationConstants} unsigned integers, each holding the index of a specialization constant in the SPIR-V + * module whose value to set. + * + *

    Specialization constants not referenced by {@code pConstantIndex} retain their default values as specified in the SPIR-V module.

    + * @param pConstantValue an entry in {@code pConstantValue} is used to set the value of the specialization constant indexed by the corresponding entry in + * {@code pConstantIndex}. + * + *

    Although this array is of unsigned integer, each entry is bitcast to the appropriate type for the module, and therefore, floating-point constants + * may be set by including their IEEE-754 bit representation in the {@code pConstantValue} array.

    + * + * @see Reference Page + */ + public static void glSpecializeShader(@NativeType("GLuint") int shader, @NativeType("GLchar const *") ByteBuffer pEntryPoint, @Nullable @NativeType("GLuint const *") IntBuffer pConstantIndex, @Nullable @NativeType("GLuint const *") IntBuffer pConstantValue) { + GL46C.glSpecializeShader(shader, pEntryPoint, pConstantIndex, pConstantValue); + } + + /** + * Specializes a shader created from a SPIR-V module. + * + *

    Shaders associated with SPIR-V modules must be specialized before they can be linked into a program object. It is not necessary to specialize the + * shader before it is attached to a program object. Once specialized, a shader may not be specialized again without first re-associating the original + * SPIR-V module with it, through {@link GL41C#glShaderBinary ShaderBinary}.

    + * + *

    Specialization does two things:

    + * + *
      + *
    • Selects the name of the entry point, for that shader’s stage, from the SPIR-V module.
    • + *
    • Sets the values of all, or a subset of, the specialization constants in the SPIRV module.
    • + *
    + * + *

    On successful shader specialization, the compile status for shader is set to {@link GL11#GL_TRUE TRUE}. On failure, the compile status for shader is set to {@link GL11#GL_FALSE FALSE} and + * additional information about the cause of the failure may be available in the shader compilation log.

    + * + * @param shader the name of a shader object containing unspecialized SPIR-V as created from a successful call to {@link GL41C#glShaderBinary ShaderBinary} to which a SPIR-V module was + * passed + * @param pEntryPoint a pointer to a null-terminated UTF-8 string specifying the name of the entry point in the SPIR-V module to use for this shader + * @param pConstantIndex is a pointer to an array of {@code numSpecializationConstants} unsigned integers, each holding the index of a specialization constant in the SPIR-V + * module whose value to set. + * + *

    Specialization constants not referenced by {@code pConstantIndex} retain their default values as specified in the SPIR-V module.

    + * @param pConstantValue an entry in {@code pConstantValue} is used to set the value of the specialization constant indexed by the corresponding entry in + * {@code pConstantIndex}. + * + *

    Although this array is of unsigned integer, each entry is bitcast to the appropriate type for the module, and therefore, floating-point constants + * may be set by including their IEEE-754 bit representation in the {@code pConstantValue} array.

    + * + * @see Reference Page + */ + public static void glSpecializeShader(@NativeType("GLuint") int shader, @NativeType("GLchar const *") CharSequence pEntryPoint, @Nullable @NativeType("GLuint const *") IntBuffer pConstantIndex, @Nullable @NativeType("GLuint const *") IntBuffer pConstantValue) { + GL46C.glSpecializeShader(shader, pEntryPoint, pConstantIndex, pConstantValue); + } + + /** + * Array version of: {@link #glMultiDrawArraysIndirectCount MultiDrawArraysIndirectCount} + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirectCount(@NativeType("GLenum") int mode, @NativeType("void const *") int[] indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + GL46C.glMultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Array version of: {@link #glMultiDrawElementsIndirectCount MultiDrawElementsIndirectCount} + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirectCount(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") int[] indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + GL46C.glMultiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Array version of: {@link #glSpecializeShader SpecializeShader} + * + * @see Reference Page + */ + public static void glSpecializeShader(@NativeType("GLuint") int shader, @NativeType("GLchar const *") ByteBuffer pEntryPoint, @Nullable @NativeType("GLuint const *") int[] pConstantIndex, @Nullable @NativeType("GLuint const *") int[] pConstantValue) { + GL46C.glSpecializeShader(shader, pEntryPoint, pConstantIndex, pConstantValue); + } + + /** + * Array version of: {@link #glSpecializeShader SpecializeShader} + * + * @see Reference Page + */ + public static void glSpecializeShader(@NativeType("GLuint") int shader, @NativeType("GLchar const *") CharSequence pEntryPoint, @Nullable @NativeType("GLuint const *") int[] pConstantIndex, @Nullable @NativeType("GLuint const *") int[] pConstantValue) { + GL46C.glSpecializeShader(shader, pEntryPoint, pConstantIndex, pConstantValue); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL46C.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL46C.java new file mode 100644 index 000000000..a994ab3d4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GL46C.java @@ -0,0 +1,424 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The OpenGL functionality up to version 4.6. Includes only Core Profile symbols. + * + *

    OpenGL 4.6 implementations support revision 4.60 of the OpenGL Shading Language.

    + * + *

    Extensions promoted to core in this release:

    + * + * + */ +public class GL46C extends GL45C { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, + * MapBufferRange, FlushMappedBufferRange, GetBufferParameteriv, and CopyBufferSubData. + */ + public static final int GL_PARAMETER_BUFFER = 0x80EE; + + /** Accepted by the {@code value} parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev. */ + public static final int GL_PARAMETER_BUFFER_BINDING = 0x80EF; + + /** + * Accepted by the {@code target} parameter of {@link GL15C#glBeginQuery BeginQuery}, {@link GL15C#glEndQuery EndQuery}, {@link GL15C#glGetQueryiv GetQueryiv}, + * {@link GL40C#glBeginQueryIndexed BeginQueryIndexed}, {@link GL40C#glEndQueryIndexed EndQueryIndexed} and {@link GL40C#glGetQueryIndexediv GetQueryIndexediv}. + */ + public static final int + GL_VERTICES_SUBMITTED = 0x82EE, + GL_PRIMITIVES_SUBMITTED = 0x82EF, + GL_VERTEX_SHADER_INVOCATIONS = 0x82F0, + GL_TESS_CONTROL_SHADER_PATCHES = 0x82F1, + GL_TESS_EVALUATION_SHADER_INVOCATIONS = 0x82F2, + GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED = 0x82F3, + GL_FRAGMENT_SHADER_INVOCATIONS = 0x82F4, + GL_COMPUTE_SHADER_INVOCATIONS = 0x82F5, + GL_CLIPPING_INPUT_PRIMITIVES = 0x82F6, + GL_CLIPPING_OUTPUT_PRIMITIVES = 0x82F7; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_POLYGON_OFFSET_CLAMP = 0x8E1B; + + /** If set in {@link GL30#GL_CONTEXT_FLAGS CONTEXT_FLAGS}, then no error behavior is enabled for this context. */ + public static final int GL_CONTEXT_FLAG_NO_ERROR_BIT = 0x8; + + /** Accepted by the {@code binaryformat} parameter of {@link GL41C#glShaderBinary ShaderBinary}. */ + public static final int GL_SHADER_BINARY_FORMAT_SPIR_V = 0x9551; + + /** Accepted by the {@code pname} parameter of {@link GL20C#glGetShaderiv GetShaderiv}. */ + public static final int GL_SPIR_V_BINARY = 0x9552; + + /** Accepted by the {@code name} parameter of {@link GL30C#glGetStringi GetStringi}. */ + public static final int GL_SPIR_V_EXTENSIONS = 0x9553; + + /** Accepted by the {@code pname} parameter of {@link GL11C#glGetIntegerv GetIntegerv}. */ + public static final int GL_NUM_SPIR_V_EXTENSIONS = 0x9554; + + /** Accepted by the {@code pname} parameters of GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameterfv, TexParameteri, and TexParameteriv. */ + public static final int GL_TEXTURE_MAX_ANISOTROPY = 0x84FE; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetDoublev, GetFloatv, and GetIntegerv. */ + public static final int GL_MAX_TEXTURE_MAX_ANISOTROPY = 0x84FF; + + /** + * Accepted by the {@code target} parameter of {@link GL15C#glBeginQuery BeginQuery}, {@link GL15C#glEndQuery EndQuery}, {@link GL15C#glGetQueryiv GetQueryiv}, + * {@link GL40C#glBeginQueryIndexed BeginQueryIndexed}, {@link GL40C#glEndQueryIndexed EndQueryIndexed} and {@link GL40C#glGetQueryIndexediv GetQueryIndexediv}. + */ + public static final int + GL_TRANSFORM_FEEDBACK_OVERFLOW = 0x82EC, + GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW = 0x82ED; + + protected GL46C() { + throw new UnsupportedOperationException(); + } + + // --- [ glMultiDrawArraysIndirectCount ] --- + + /** Unsafe version of: {@link #glMultiDrawArraysIndirectCount MultiDrawArraysIndirectCount} */ + public static native void nglMultiDrawArraysIndirectCount(int mode, long indirect, long drawcount, int maxdrawcount, int stride); + + /** + * Behaves similarly to {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirectCount(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, maxdrawcount * (stride == 0 ? (4 * 4) : stride)); + } + nglMultiDrawArraysIndirectCount(mode, memAddress(indirect), drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirectCount(@NativeType("GLenum") int mode, @NativeType("void const *") long indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + nglMultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of structures containing the draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirectCount(@NativeType("GLenum") int mode, @NativeType("void const *") IntBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, (maxdrawcount * (stride == 0 ? (4 * 4) : stride)) >> 2); + } + nglMultiDrawArraysIndirectCount(mode, memAddress(indirect), drawcount, maxdrawcount, stride); + } + + // --- [ glMultiDrawElementsIndirectCount ] --- + + /** Unsafe version of: {@link #glMultiDrawElementsIndirectCount MultiDrawElementsIndirectCount} */ + public static native void nglMultiDrawElementsIndirectCount(int mode, int type, long indirect, long drawcount, int maxdrawcount, int stride); + + /** + * Behaves similarly to {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirectCount(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, maxdrawcount * (stride == 0 ? (5 * 4) : stride)); + } + nglMultiDrawElementsIndirectCount(mode, type, memAddress(indirect), drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirectCount(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") long indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + nglMultiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride); + } + + /** + * Behaves similarly to {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect}, except that {@code drawcount} defines an offset (in bytes) into the buffer object bound to the + * {@link #GL_PARAMETER_BUFFER PARAMETER_BUFFER} binding point at which a single {@code sizei} typed value is stored, which contains the draw count. {@code maxdrawcount} specifies + * the maximum number of draws that are expected to be stored in the buffer. If the value stored at {@code drawcount} into the buffer is greater than + * {@code maxdrawcount}, the implementation stops processing draws after {@code maxdrawcount} parameter sets. {@code drawcount} must be a multiple of + * four. + * + * @param mode what kind of primitives to render. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the type of data in the buffer bound to the GL_ELEMENT_ARRAY_BUFFER binding. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect a structure containing an array of draw parameters + * @param drawcount the offset into the parameter buffer object + * @param maxdrawcount the maximum number of draws + * @param stride the distance in basic machine units between elements of the draw parameter array + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirectCount(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") IntBuffer indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + if (CHECKS) { + check(indirect, (maxdrawcount * (stride == 0 ? (5 * 4) : stride)) >> 2); + } + nglMultiDrawElementsIndirectCount(mode, type, memAddress(indirect), drawcount, maxdrawcount, stride); + } + + // --- [ glPolygonOffsetClamp ] --- + + /** + * The depth values of all fragments generated by the rasterization of a polygon may be offset by a single value that is computed for that polygon. This + * function determines this value. + * + *

    {@code factor} scales the maximum depth slope of the polygon, and {@code units} scales an implementation-dependent constant that relates to the usable + * resolution of the depth buffer. The resulting values are summed to produce the polygon offset value, which may then be clamped to a minimum or maximum + * value specified by {@code clamp}.

    + * + *

    The values {@code factor}, {@code units}, and {@code clamp} may each be positive, negative, or zero. Calling the command {@link GL11C#glPolygonOffset PolygonOffset} is equivalent + * to calling the command {@code PolygonOffsetClamp} with clamp equal to zero.

    + * + * @param factor scales the maximum depth slope of the polygon + * @param units scales an implementation-dependent constant that relates to the usable resolution of the depth buffer + * @param clamp the minimum or maximum polygon offset value + * + * @see Reference Page + */ + public static native void glPolygonOffsetClamp(@NativeType("GLfloat") float factor, @NativeType("GLfloat") float units, @NativeType("GLfloat") float clamp); + + // --- [ glSpecializeShader ] --- + + /** + * Unsafe version of: {@link #glSpecializeShader SpecializeShader} + * + * @param numSpecializationConstants the number of specialization constants whose values to set in this call + */ + public static native void nglSpecializeShader(int shader, long pEntryPoint, int numSpecializationConstants, long pConstantIndex, long pConstantValue); + + /** + * Specializes a shader created from a SPIR-V module. + * + *

    Shaders associated with SPIR-V modules must be specialized before they can be linked into a program object. It is not necessary to specialize the + * shader before it is attached to a program object. Once specialized, a shader may not be specialized again without first re-associating the original + * SPIR-V module with it, through {@link GL41C#glShaderBinary ShaderBinary}.

    + * + *

    Specialization does two things:

    + * + *
      + *
    • Selects the name of the entry point, for that shader’s stage, from the SPIR-V module.
    • + *
    • Sets the values of all, or a subset of, the specialization constants in the SPIRV module.
    • + *
    + * + *

    On successful shader specialization, the compile status for shader is set to {@link GL11#GL_TRUE TRUE}. On failure, the compile status for shader is set to {@link GL11#GL_FALSE FALSE} and + * additional information about the cause of the failure may be available in the shader compilation log.

    + * + * @param shader the name of a shader object containing unspecialized SPIR-V as created from a successful call to {@link GL41C#glShaderBinary ShaderBinary} to which a SPIR-V module was + * passed + * @param pEntryPoint a pointer to a null-terminated UTF-8 string specifying the name of the entry point in the SPIR-V module to use for this shader + * @param pConstantIndex is a pointer to an array of {@code numSpecializationConstants} unsigned integers, each holding the index of a specialization constant in the SPIR-V + * module whose value to set. + * + *

    Specialization constants not referenced by {@code pConstantIndex} retain their default values as specified in the SPIR-V module.

    + * @param pConstantValue an entry in {@code pConstantValue} is used to set the value of the specialization constant indexed by the corresponding entry in + * {@code pConstantIndex}. + * + *

    Although this array is of unsigned integer, each entry is bitcast to the appropriate type for the module, and therefore, floating-point constants + * may be set by including their IEEE-754 bit representation in the {@code pConstantValue} array.

    + * + * @see Reference Page + */ + public static void glSpecializeShader(@NativeType("GLuint") int shader, @NativeType("GLchar const *") ByteBuffer pEntryPoint, @Nullable @NativeType("GLuint const *") IntBuffer pConstantIndex, @Nullable @NativeType("GLuint const *") IntBuffer pConstantValue) { + if (CHECKS) { + checkNT1(pEntryPoint); + checkSafe(pConstantValue, remainingSafe(pConstantIndex)); + } + nglSpecializeShader(shader, memAddress(pEntryPoint), remainingSafe(pConstantIndex), memAddressSafe(pConstantIndex), memAddressSafe(pConstantValue)); + } + + /** + * Specializes a shader created from a SPIR-V module. + * + *

    Shaders associated with SPIR-V modules must be specialized before they can be linked into a program object. It is not necessary to specialize the + * shader before it is attached to a program object. Once specialized, a shader may not be specialized again without first re-associating the original + * SPIR-V module with it, through {@link GL41C#glShaderBinary ShaderBinary}.

    + * + *

    Specialization does two things:

    + * + *
      + *
    • Selects the name of the entry point, for that shader’s stage, from the SPIR-V module.
    • + *
    • Sets the values of all, or a subset of, the specialization constants in the SPIRV module.
    • + *
    + * + *

    On successful shader specialization, the compile status for shader is set to {@link GL11#GL_TRUE TRUE}. On failure, the compile status for shader is set to {@link GL11#GL_FALSE FALSE} and + * additional information about the cause of the failure may be available in the shader compilation log.

    + * + * @param shader the name of a shader object containing unspecialized SPIR-V as created from a successful call to {@link GL41C#glShaderBinary ShaderBinary} to which a SPIR-V module was + * passed + * @param pEntryPoint a pointer to a null-terminated UTF-8 string specifying the name of the entry point in the SPIR-V module to use for this shader + * @param pConstantIndex is a pointer to an array of {@code numSpecializationConstants} unsigned integers, each holding the index of a specialization constant in the SPIR-V + * module whose value to set. + * + *

    Specialization constants not referenced by {@code pConstantIndex} retain their default values as specified in the SPIR-V module.

    + * @param pConstantValue an entry in {@code pConstantValue} is used to set the value of the specialization constant indexed by the corresponding entry in + * {@code pConstantIndex}. + * + *

    Although this array is of unsigned integer, each entry is bitcast to the appropriate type for the module, and therefore, floating-point constants + * may be set by including their IEEE-754 bit representation in the {@code pConstantValue} array.

    + * + * @see Reference Page + */ + public static void glSpecializeShader(@NativeType("GLuint") int shader, @NativeType("GLchar const *") CharSequence pEntryPoint, @Nullable @NativeType("GLuint const *") IntBuffer pConstantIndex, @Nullable @NativeType("GLuint const *") IntBuffer pConstantValue) { + if (CHECKS) { + checkSafe(pConstantValue, remainingSafe(pConstantIndex)); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(pEntryPoint, true); + long pEntryPointEncoded = stack.getPointerAddress(); + nglSpecializeShader(shader, pEntryPointEncoded, remainingSafe(pConstantIndex), memAddressSafe(pConstantIndex), memAddressSafe(pConstantValue)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Array version of: {@link #glMultiDrawArraysIndirectCount MultiDrawArraysIndirectCount} + * + * @see Reference Page + */ + public static void glMultiDrawArraysIndirectCount(@NativeType("GLenum") int mode, @NativeType("void const *") int[] indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + long __functionAddress = GL.getICD().glMultiDrawArraysIndirectCount; + if (CHECKS) { + check(__functionAddress); + check(indirect, (maxdrawcount * (stride == 0 ? (4 * 4) : stride)) >> 2); + } + callPPV(mode, indirect, drawcount, maxdrawcount, stride, __functionAddress); + } + + /** + * Array version of: {@link #glMultiDrawElementsIndirectCount MultiDrawElementsIndirectCount} + * + * @see Reference Page + */ + public static void glMultiDrawElementsIndirectCount(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") int[] indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride) { + long __functionAddress = GL.getICD().glMultiDrawElementsIndirectCount; + if (CHECKS) { + check(__functionAddress); + check(indirect, (maxdrawcount * (stride == 0 ? (5 * 4) : stride)) >> 2); + } + callPPV(mode, type, indirect, drawcount, maxdrawcount, stride, __functionAddress); + } + + /** + * Array version of: {@link #glSpecializeShader SpecializeShader} + * + * @see Reference Page + */ + public static void glSpecializeShader(@NativeType("GLuint") int shader, @NativeType("GLchar const *") ByteBuffer pEntryPoint, @Nullable @NativeType("GLuint const *") int[] pConstantIndex, @Nullable @NativeType("GLuint const *") int[] pConstantValue) { + long __functionAddress = GL.getICD().glSpecializeShader; + if (CHECKS) { + check(__functionAddress); + checkNT1(pEntryPoint); + checkSafe(pConstantValue, lengthSafe(pConstantIndex)); + } + callPPPV(shader, memAddress(pEntryPoint), lengthSafe(pConstantIndex), pConstantIndex, pConstantValue, __functionAddress); + } + + /** + * Array version of: {@link #glSpecializeShader SpecializeShader} + * + * @see Reference Page + */ + public static void glSpecializeShader(@NativeType("GLuint") int shader, @NativeType("GLchar const *") CharSequence pEntryPoint, @Nullable @NativeType("GLuint const *") int[] pConstantIndex, @Nullable @NativeType("GLuint const *") int[] pConstantValue) { + long __functionAddress = GL.getICD().glSpecializeShader; + if (CHECKS) { + check(__functionAddress); + checkSafe(pConstantValue, lengthSafe(pConstantIndex)); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(pEntryPoint, true); + long pEntryPointEncoded = stack.getPointerAddress(); + callPPPV(shader, pEntryPointEncoded, lengthSafe(pConstantIndex), pConstantIndex, pConstantValue, __functionAddress); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLCapabilities.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLCapabilities.java new file mode 100644 index 000000000..6ad0096a8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLCapabilities.java @@ -0,0 +1,10780 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; +import java.util.Set; +import org.lwjgl.*; +import java.util.function.IntFunction; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Defines the capabilities of an OpenGL context. */ +public final class GLCapabilities { + + static final int ADDRESS_BUFFER_SIZE = 2227; + + // GL11 + public final long + glEnable, + glDisable, + glAccum, + glAlphaFunc, + glAreTexturesResident, + glArrayElement, + glBegin, + glBindTexture, + glBitmap, + glBlendFunc, + glCallList, + glCallLists, + glClear, + glClearAccum, + glClearColor, + glClearDepth, + glClearIndex, + glClearStencil, + glClipPlane, + glColor3b, + glColor3s, + glColor3i, + glColor3f, + glColor3d, + glColor3ub, + glColor3us, + glColor3ui, + glColor3bv, + glColor3sv, + glColor3iv, + glColor3fv, + glColor3dv, + glColor3ubv, + glColor3usv, + glColor3uiv, + glColor4b, + glColor4s, + glColor4i, + glColor4f, + glColor4d, + glColor4ub, + glColor4us, + glColor4ui, + glColor4bv, + glColor4sv, + glColor4iv, + glColor4fv, + glColor4dv, + glColor4ubv, + glColor4usv, + glColor4uiv, + glColorMask, + glColorMaterial, + glColorPointer, + glCopyPixels, + glCullFace, + glDeleteLists, + glDepthFunc, + glDepthMask, + glDepthRange, + glDisableClientState, + glDrawArrays, + glDrawBuffer, + glDrawElements, + glDrawPixels, + glEdgeFlag, + glEdgeFlagv, + glEdgeFlagPointer, + glEnableClientState, + glEnd, + glEvalCoord1f, + glEvalCoord1fv, + glEvalCoord1d, + glEvalCoord1dv, + glEvalCoord2f, + glEvalCoord2fv, + glEvalCoord2d, + glEvalCoord2dv, + glEvalMesh1, + glEvalMesh2, + glEvalPoint1, + glEvalPoint2, + glFeedbackBuffer, + glFinish, + glFlush, + glFogi, + glFogiv, + glFogf, + glFogfv, + glFrontFace, + glGenLists, + glGenTextures, + glDeleteTextures, + glGetClipPlane, + glGetBooleanv, + glGetFloatv, + glGetIntegerv, + glGetDoublev, + glGetError, + glGetLightiv, + glGetLightfv, + glGetMapiv, + glGetMapfv, + glGetMapdv, + glGetMaterialiv, + glGetMaterialfv, + glGetPixelMapfv, + glGetPixelMapusv, + glGetPixelMapuiv, + glGetPointerv, + glGetPolygonStipple, + glGetString, + glGetTexEnviv, + glGetTexEnvfv, + glGetTexGeniv, + glGetTexGenfv, + glGetTexGendv, + glGetTexImage, + glGetTexLevelParameteriv, + glGetTexLevelParameterfv, + glGetTexParameteriv, + glGetTexParameterfv, + glHint, + glIndexi, + glIndexub, + glIndexs, + glIndexf, + glIndexd, + glIndexiv, + glIndexubv, + glIndexsv, + glIndexfv, + glIndexdv, + glIndexMask, + glIndexPointer, + glInitNames, + glInterleavedArrays, + glIsEnabled, + glIsList, + glIsTexture, + glLightModeli, + glLightModelf, + glLightModeliv, + glLightModelfv, + glLighti, + glLightf, + glLightiv, + glLightfv, + glLineStipple, + glLineWidth, + glListBase, + glLoadMatrixf, + glLoadMatrixd, + glLoadIdentity, + glLoadName, + glLogicOp, + glMap1f, + glMap1d, + glMap2f, + glMap2d, + glMapGrid1f, + glMapGrid1d, + glMapGrid2f, + glMapGrid2d, + glMateriali, + glMaterialf, + glMaterialiv, + glMaterialfv, + glMatrixMode, + glMultMatrixf, + glMultMatrixd, + glFrustum, + glNewList, + glEndList, + glNormal3f, + glNormal3b, + glNormal3s, + glNormal3i, + glNormal3d, + glNormal3fv, + glNormal3bv, + glNormal3sv, + glNormal3iv, + glNormal3dv, + glNormalPointer, + glOrtho, + glPassThrough, + glPixelMapfv, + glPixelMapusv, + glPixelMapuiv, + glPixelStorei, + glPixelStoref, + glPixelTransferi, + glPixelTransferf, + glPixelZoom, + glPointSize, + glPolygonMode, + glPolygonOffset, + glPolygonStipple, + glPushAttrib, + glPushClientAttrib, + glPopAttrib, + glPopClientAttrib, + glPopMatrix, + glPopName, + glPrioritizeTextures, + glPushMatrix, + glPushName, + glRasterPos2i, + glRasterPos2s, + glRasterPos2f, + glRasterPos2d, + glRasterPos2iv, + glRasterPos2sv, + glRasterPos2fv, + glRasterPos2dv, + glRasterPos3i, + glRasterPos3s, + glRasterPos3f, + glRasterPos3d, + glRasterPos3iv, + glRasterPos3sv, + glRasterPos3fv, + glRasterPos3dv, + glRasterPos4i, + glRasterPos4s, + glRasterPos4f, + glRasterPos4d, + glRasterPos4iv, + glRasterPos4sv, + glRasterPos4fv, + glRasterPos4dv, + glReadBuffer, + glReadPixels, + glRecti, + glRects, + glRectf, + glRectd, + glRectiv, + glRectsv, + glRectfv, + glRectdv, + glRenderMode, + glRotatef, + glRotated, + glScalef, + glScaled, + glScissor, + glSelectBuffer, + glShadeModel, + glStencilFunc, + glStencilMask, + glStencilOp, + glTexCoord1f, + glTexCoord1s, + glTexCoord1i, + glTexCoord1d, + glTexCoord1fv, + glTexCoord1sv, + glTexCoord1iv, + glTexCoord1dv, + glTexCoord2f, + glTexCoord2s, + glTexCoord2i, + glTexCoord2d, + glTexCoord2fv, + glTexCoord2sv, + glTexCoord2iv, + glTexCoord2dv, + glTexCoord3f, + glTexCoord3s, + glTexCoord3i, + glTexCoord3d, + glTexCoord3fv, + glTexCoord3sv, + glTexCoord3iv, + glTexCoord3dv, + glTexCoord4f, + glTexCoord4s, + glTexCoord4i, + glTexCoord4d, + glTexCoord4fv, + glTexCoord4sv, + glTexCoord4iv, + glTexCoord4dv, + glTexCoordPointer, + glTexEnvi, + glTexEnviv, + glTexEnvf, + glTexEnvfv, + glTexGeni, + glTexGeniv, + glTexGenf, + glTexGenfv, + glTexGend, + glTexGendv, + glTexImage1D, + glTexImage2D, + glCopyTexImage1D, + glCopyTexImage2D, + glCopyTexSubImage1D, + glCopyTexSubImage2D, + glTexParameteri, + glTexParameteriv, + glTexParameterf, + glTexParameterfv, + glTexSubImage1D, + glTexSubImage2D, + glTranslatef, + glTranslated, + glVertex2f, + glVertex2s, + glVertex2i, + glVertex2d, + glVertex2fv, + glVertex2sv, + glVertex2iv, + glVertex2dv, + glVertex3f, + glVertex3s, + glVertex3i, + glVertex3d, + glVertex3fv, + glVertex3sv, + glVertex3iv, + glVertex3dv, + glVertex4f, + glVertex4s, + glVertex4i, + glVertex4d, + glVertex4fv, + glVertex4sv, + glVertex4iv, + glVertex4dv, + glVertexPointer, + glViewport; + + // GL12 + public final long + glTexImage3D, + glTexSubImage3D, + glCopyTexSubImage3D, + glDrawRangeElements; + + // GL13 + public final long + glCompressedTexImage3D, + glCompressedTexImage2D, + glCompressedTexImage1D, + glCompressedTexSubImage3D, + glCompressedTexSubImage2D, + glCompressedTexSubImage1D, + glGetCompressedTexImage, + glSampleCoverage, + glActiveTexture, + glClientActiveTexture, + glMultiTexCoord1f, + glMultiTexCoord1s, + glMultiTexCoord1i, + glMultiTexCoord1d, + glMultiTexCoord1fv, + glMultiTexCoord1sv, + glMultiTexCoord1iv, + glMultiTexCoord1dv, + glMultiTexCoord2f, + glMultiTexCoord2s, + glMultiTexCoord2i, + glMultiTexCoord2d, + glMultiTexCoord2fv, + glMultiTexCoord2sv, + glMultiTexCoord2iv, + glMultiTexCoord2dv, + glMultiTexCoord3f, + glMultiTexCoord3s, + glMultiTexCoord3i, + glMultiTexCoord3d, + glMultiTexCoord3fv, + glMultiTexCoord3sv, + glMultiTexCoord3iv, + glMultiTexCoord3dv, + glMultiTexCoord4f, + glMultiTexCoord4s, + glMultiTexCoord4i, + glMultiTexCoord4d, + glMultiTexCoord4fv, + glMultiTexCoord4sv, + glMultiTexCoord4iv, + glMultiTexCoord4dv, + glLoadTransposeMatrixf, + glLoadTransposeMatrixd, + glMultTransposeMatrixf, + glMultTransposeMatrixd; + + // GL14 + public final long + glBlendColor, + glBlendEquation, + glFogCoordf, + glFogCoordd, + glFogCoordfv, + glFogCoorddv, + glFogCoordPointer, + glMultiDrawArrays, + glMultiDrawElements, + glPointParameterf, + glPointParameteri, + glPointParameterfv, + glPointParameteriv, + glSecondaryColor3b, + glSecondaryColor3s, + glSecondaryColor3i, + glSecondaryColor3f, + glSecondaryColor3d, + glSecondaryColor3ub, + glSecondaryColor3us, + glSecondaryColor3ui, + glSecondaryColor3bv, + glSecondaryColor3sv, + glSecondaryColor3iv, + glSecondaryColor3fv, + glSecondaryColor3dv, + glSecondaryColor3ubv, + glSecondaryColor3usv, + glSecondaryColor3uiv, + glSecondaryColorPointer, + glBlendFuncSeparate, + glWindowPos2i, + glWindowPos2s, + glWindowPos2f, + glWindowPos2d, + glWindowPos2iv, + glWindowPos2sv, + glWindowPos2fv, + glWindowPos2dv, + glWindowPos3i, + glWindowPos3s, + glWindowPos3f, + glWindowPos3d, + glWindowPos3iv, + glWindowPos3sv, + glWindowPos3fv, + glWindowPos3dv; + + // GL15 + public final long + glBindBuffer, + glDeleteBuffers, + glGenBuffers, + glIsBuffer, + glBufferData, + glBufferSubData, + glGetBufferSubData, + glMapBuffer, + glUnmapBuffer, + glGetBufferParameteriv, + glGetBufferPointerv, + glGenQueries, + glDeleteQueries, + glIsQuery, + glBeginQuery, + glEndQuery, + glGetQueryiv, + glGetQueryObjectiv, + glGetQueryObjectuiv; + + // GL20 + public final long + glCreateProgram, + glDeleteProgram, + glIsProgram, + glCreateShader, + glDeleteShader, + glIsShader, + glAttachShader, + glDetachShader, + glShaderSource, + glCompileShader, + glLinkProgram, + glUseProgram, + glValidateProgram, + glUniform1f, + glUniform2f, + glUniform3f, + glUniform4f, + glUniform1i, + glUniform2i, + glUniform3i, + glUniform4i, + glUniform1fv, + glUniform2fv, + glUniform3fv, + glUniform4fv, + glUniform1iv, + glUniform2iv, + glUniform3iv, + glUniform4iv, + glUniformMatrix2fv, + glUniformMatrix3fv, + glUniformMatrix4fv, + glGetShaderiv, + glGetProgramiv, + glGetShaderInfoLog, + glGetProgramInfoLog, + glGetAttachedShaders, + glGetUniformLocation, + glGetActiveUniform, + glGetUniformfv, + glGetUniformiv, + glGetShaderSource, + glVertexAttrib1f, + glVertexAttrib1s, + glVertexAttrib1d, + glVertexAttrib2f, + glVertexAttrib2s, + glVertexAttrib2d, + glVertexAttrib3f, + glVertexAttrib3s, + glVertexAttrib3d, + glVertexAttrib4f, + glVertexAttrib4s, + glVertexAttrib4d, + glVertexAttrib4Nub, + glVertexAttrib1fv, + glVertexAttrib1sv, + glVertexAttrib1dv, + glVertexAttrib2fv, + glVertexAttrib2sv, + glVertexAttrib2dv, + glVertexAttrib3fv, + glVertexAttrib3sv, + glVertexAttrib3dv, + glVertexAttrib4fv, + glVertexAttrib4sv, + glVertexAttrib4dv, + glVertexAttrib4iv, + glVertexAttrib4bv, + glVertexAttrib4ubv, + glVertexAttrib4usv, + glVertexAttrib4uiv, + glVertexAttrib4Nbv, + glVertexAttrib4Nsv, + glVertexAttrib4Niv, + glVertexAttrib4Nubv, + glVertexAttrib4Nusv, + glVertexAttrib4Nuiv, + glVertexAttribPointer, + glEnableVertexAttribArray, + glDisableVertexAttribArray, + glBindAttribLocation, + glGetActiveAttrib, + glGetAttribLocation, + glGetVertexAttribiv, + glGetVertexAttribfv, + glGetVertexAttribdv, + glGetVertexAttribPointerv, + glDrawBuffers, + glBlendEquationSeparate, + glStencilOpSeparate, + glStencilFuncSeparate, + glStencilMaskSeparate; + + // GL21 + public final long + glUniformMatrix2x3fv, + glUniformMatrix3x2fv, + glUniformMatrix2x4fv, + glUniformMatrix4x2fv, + glUniformMatrix3x4fv, + glUniformMatrix4x3fv; + + // GL30 + public final long + glGetStringi, + glClearBufferiv, + glClearBufferuiv, + glClearBufferfv, + glClearBufferfi, + glVertexAttribI1i, + glVertexAttribI2i, + glVertexAttribI3i, + glVertexAttribI4i, + glVertexAttribI1ui, + glVertexAttribI2ui, + glVertexAttribI3ui, + glVertexAttribI4ui, + glVertexAttribI1iv, + glVertexAttribI2iv, + glVertexAttribI3iv, + glVertexAttribI4iv, + glVertexAttribI1uiv, + glVertexAttribI2uiv, + glVertexAttribI3uiv, + glVertexAttribI4uiv, + glVertexAttribI4bv, + glVertexAttribI4sv, + glVertexAttribI4ubv, + glVertexAttribI4usv, + glVertexAttribIPointer, + glGetVertexAttribIiv, + glGetVertexAttribIuiv, + glUniform1ui, + glUniform2ui, + glUniform3ui, + glUniform4ui, + glUniform1uiv, + glUniform2uiv, + glUniform3uiv, + glUniform4uiv, + glGetUniformuiv, + glBindFragDataLocation, + glGetFragDataLocation, + glBeginConditionalRender, + glEndConditionalRender, + glMapBufferRange, + glFlushMappedBufferRange, + glClampColor, + glIsRenderbuffer, + glBindRenderbuffer, + glDeleteRenderbuffers, + glGenRenderbuffers, + glRenderbufferStorage, + glRenderbufferStorageMultisample, + glGetRenderbufferParameteriv, + glIsFramebuffer, + glBindFramebuffer, + glDeleteFramebuffers, + glGenFramebuffers, + glCheckFramebufferStatus, + glFramebufferTexture1D, + glFramebufferTexture2D, + glFramebufferTexture3D, + glFramebufferTextureLayer, + glFramebufferRenderbuffer, + glGetFramebufferAttachmentParameteriv, + glBlitFramebuffer, + glGenerateMipmap, + glTexParameterIiv, + glTexParameterIuiv, + glGetTexParameterIiv, + glGetTexParameterIuiv, + glColorMaski, + glGetBooleani_v, + glGetIntegeri_v, + glEnablei, + glDisablei, + glIsEnabledi, + glBindBufferRange, + glBindBufferBase, + glBeginTransformFeedback, + glEndTransformFeedback, + glTransformFeedbackVaryings, + glGetTransformFeedbackVarying, + glBindVertexArray, + glDeleteVertexArrays, + glGenVertexArrays, + glIsVertexArray; + + // GL31 + public final long + glDrawArraysInstanced, + glDrawElementsInstanced, + glCopyBufferSubData, + glPrimitiveRestartIndex, + glTexBuffer, + glGetUniformIndices, + glGetActiveUniformsiv, + glGetActiveUniformName, + glGetUniformBlockIndex, + glGetActiveUniformBlockiv, + glGetActiveUniformBlockName, + glUniformBlockBinding; + + // GL32 + public final long + glGetBufferParameteri64v, + glDrawElementsBaseVertex, + glDrawRangeElementsBaseVertex, + glDrawElementsInstancedBaseVertex, + glMultiDrawElementsBaseVertex, + glProvokingVertex, + glTexImage2DMultisample, + glTexImage3DMultisample, + glGetMultisamplefv, + glSampleMaski, + glFramebufferTexture, + glFenceSync, + glIsSync, + glDeleteSync, + glClientWaitSync, + glWaitSync, + glGetInteger64v, + glGetInteger64i_v, + glGetSynciv; + + // GL33 + public final long + glBindFragDataLocationIndexed, + glGetFragDataIndex, + glGenSamplers, + glDeleteSamplers, + glIsSampler, + glBindSampler, + glSamplerParameteri, + glSamplerParameterf, + glSamplerParameteriv, + glSamplerParameterfv, + glSamplerParameterIiv, + glSamplerParameterIuiv, + glGetSamplerParameteriv, + glGetSamplerParameterfv, + glGetSamplerParameterIiv, + glGetSamplerParameterIuiv, + glQueryCounter, + glGetQueryObjecti64v, + glGetQueryObjectui64v, + glVertexAttribDivisor, + glVertexP2ui, + glVertexP3ui, + glVertexP4ui, + glVertexP2uiv, + glVertexP3uiv, + glVertexP4uiv, + glTexCoordP1ui, + glTexCoordP2ui, + glTexCoordP3ui, + glTexCoordP4ui, + glTexCoordP1uiv, + glTexCoordP2uiv, + glTexCoordP3uiv, + glTexCoordP4uiv, + glMultiTexCoordP1ui, + glMultiTexCoordP2ui, + glMultiTexCoordP3ui, + glMultiTexCoordP4ui, + glMultiTexCoordP1uiv, + glMultiTexCoordP2uiv, + glMultiTexCoordP3uiv, + glMultiTexCoordP4uiv, + glNormalP3ui, + glNormalP3uiv, + glColorP3ui, + glColorP4ui, + glColorP3uiv, + glColorP4uiv, + glSecondaryColorP3ui, + glSecondaryColorP3uiv, + glVertexAttribP1ui, + glVertexAttribP2ui, + glVertexAttribP3ui, + glVertexAttribP4ui, + glVertexAttribP1uiv, + glVertexAttribP2uiv, + glVertexAttribP3uiv, + glVertexAttribP4uiv; + + // GL40 + public final long + glBlendEquationi, + glBlendEquationSeparatei, + glBlendFunci, + glBlendFuncSeparatei, + glDrawArraysIndirect, + glDrawElementsIndirect, + glUniform1d, + glUniform2d, + glUniform3d, + glUniform4d, + glUniform1dv, + glUniform2dv, + glUniform3dv, + glUniform4dv, + glUniformMatrix2dv, + glUniformMatrix3dv, + glUniformMatrix4dv, + glUniformMatrix2x3dv, + glUniformMatrix2x4dv, + glUniformMatrix3x2dv, + glUniformMatrix3x4dv, + glUniformMatrix4x2dv, + glUniformMatrix4x3dv, + glGetUniformdv, + glMinSampleShading, + glGetSubroutineUniformLocation, + glGetSubroutineIndex, + glGetActiveSubroutineUniformiv, + glGetActiveSubroutineUniformName, + glGetActiveSubroutineName, + glUniformSubroutinesuiv, + glGetUniformSubroutineuiv, + glGetProgramStageiv, + glPatchParameteri, + glPatchParameterfv, + glBindTransformFeedback, + glDeleteTransformFeedbacks, + glGenTransformFeedbacks, + glIsTransformFeedback, + glPauseTransformFeedback, + glResumeTransformFeedback, + glDrawTransformFeedback, + glDrawTransformFeedbackStream, + glBeginQueryIndexed, + glEndQueryIndexed, + glGetQueryIndexediv; + + // GL41 + public final long + glReleaseShaderCompiler, + glShaderBinary, + glGetShaderPrecisionFormat, + glDepthRangef, + glClearDepthf, + glGetProgramBinary, + glProgramBinary, + glProgramParameteri, + glUseProgramStages, + glActiveShaderProgram, + glCreateShaderProgramv, + glBindProgramPipeline, + glDeleteProgramPipelines, + glGenProgramPipelines, + glIsProgramPipeline, + glGetProgramPipelineiv, + glProgramUniform1i, + glProgramUniform2i, + glProgramUniform3i, + glProgramUniform4i, + glProgramUniform1ui, + glProgramUniform2ui, + glProgramUniform3ui, + glProgramUniform4ui, + glProgramUniform1f, + glProgramUniform2f, + glProgramUniform3f, + glProgramUniform4f, + glProgramUniform1d, + glProgramUniform2d, + glProgramUniform3d, + glProgramUniform4d, + glProgramUniform1iv, + glProgramUniform2iv, + glProgramUniform3iv, + glProgramUniform4iv, + glProgramUniform1uiv, + glProgramUniform2uiv, + glProgramUniform3uiv, + glProgramUniform4uiv, + glProgramUniform1fv, + glProgramUniform2fv, + glProgramUniform3fv, + glProgramUniform4fv, + glProgramUniform1dv, + glProgramUniform2dv, + glProgramUniform3dv, + glProgramUniform4dv, + glProgramUniformMatrix2fv, + glProgramUniformMatrix3fv, + glProgramUniformMatrix4fv, + glProgramUniformMatrix2dv, + glProgramUniformMatrix3dv, + glProgramUniformMatrix4dv, + glProgramUniformMatrix2x3fv, + glProgramUniformMatrix3x2fv, + glProgramUniformMatrix2x4fv, + glProgramUniformMatrix4x2fv, + glProgramUniformMatrix3x4fv, + glProgramUniformMatrix4x3fv, + glProgramUniformMatrix2x3dv, + glProgramUniformMatrix3x2dv, + glProgramUniformMatrix2x4dv, + glProgramUniformMatrix4x2dv, + glProgramUniformMatrix3x4dv, + glProgramUniformMatrix4x3dv, + glValidateProgramPipeline, + glGetProgramPipelineInfoLog, + glVertexAttribL1d, + glVertexAttribL2d, + glVertexAttribL3d, + glVertexAttribL4d, + glVertexAttribL1dv, + glVertexAttribL2dv, + glVertexAttribL3dv, + glVertexAttribL4dv, + glVertexAttribLPointer, + glGetVertexAttribLdv, + glViewportArrayv, + glViewportIndexedf, + glViewportIndexedfv, + glScissorArrayv, + glScissorIndexed, + glScissorIndexedv, + glDepthRangeArrayv, + glDepthRangeIndexed, + glGetFloati_v, + glGetDoublei_v; + + // GL42 + public final long + glGetActiveAtomicCounterBufferiv, + glTexStorage1D, + glTexStorage2D, + glTexStorage3D, + glDrawTransformFeedbackInstanced, + glDrawTransformFeedbackStreamInstanced, + glDrawArraysInstancedBaseInstance, + glDrawElementsInstancedBaseInstance, + glDrawElementsInstancedBaseVertexBaseInstance, + glBindImageTexture, + glMemoryBarrier, + glGetInternalformativ; + + // GL43 + public final long + glClearBufferData, + glClearBufferSubData, + glDispatchCompute, + glDispatchComputeIndirect, + glCopyImageSubData, + glDebugMessageControl, + glDebugMessageInsert, + glDebugMessageCallback, + glGetDebugMessageLog, + glPushDebugGroup, + glPopDebugGroup, + glObjectLabel, + glGetObjectLabel, + glObjectPtrLabel, + glGetObjectPtrLabel, + glFramebufferParameteri, + glGetFramebufferParameteriv, + glGetInternalformati64v, + glInvalidateTexSubImage, + glInvalidateTexImage, + glInvalidateBufferSubData, + glInvalidateBufferData, + glInvalidateFramebuffer, + glInvalidateSubFramebuffer, + glMultiDrawArraysIndirect, + glMultiDrawElementsIndirect, + glGetProgramInterfaceiv, + glGetProgramResourceIndex, + glGetProgramResourceName, + glGetProgramResourceiv, + glGetProgramResourceLocation, + glGetProgramResourceLocationIndex, + glShaderStorageBlockBinding, + glTexBufferRange, + glTexStorage2DMultisample, + glTexStorage3DMultisample, + glTextureView, + glBindVertexBuffer, + glVertexAttribFormat, + glVertexAttribIFormat, + glVertexAttribLFormat, + glVertexAttribBinding, + glVertexBindingDivisor; + + // GL44 + public final long + glBufferStorage, + glClearTexSubImage, + glClearTexImage, + glBindBuffersBase, + glBindBuffersRange, + glBindTextures, + glBindSamplers, + glBindImageTextures, + glBindVertexBuffers; + + // GL45 + public final long + glClipControl, + glCreateTransformFeedbacks, + glTransformFeedbackBufferBase, + glTransformFeedbackBufferRange, + glGetTransformFeedbackiv, + glGetTransformFeedbacki_v, + glGetTransformFeedbacki64_v, + glCreateBuffers, + glNamedBufferStorage, + glNamedBufferData, + glNamedBufferSubData, + glCopyNamedBufferSubData, + glClearNamedBufferData, + glClearNamedBufferSubData, + glMapNamedBuffer, + glMapNamedBufferRange, + glUnmapNamedBuffer, + glFlushMappedNamedBufferRange, + glGetNamedBufferParameteriv, + glGetNamedBufferParameteri64v, + glGetNamedBufferPointerv, + glGetNamedBufferSubData, + glCreateFramebuffers, + glNamedFramebufferRenderbuffer, + glNamedFramebufferParameteri, + glNamedFramebufferTexture, + glNamedFramebufferTextureLayer, + glNamedFramebufferDrawBuffer, + glNamedFramebufferDrawBuffers, + glNamedFramebufferReadBuffer, + glInvalidateNamedFramebufferData, + glInvalidateNamedFramebufferSubData, + glClearNamedFramebufferiv, + glClearNamedFramebufferuiv, + glClearNamedFramebufferfv, + glClearNamedFramebufferfi, + glBlitNamedFramebuffer, + glCheckNamedFramebufferStatus, + glGetNamedFramebufferParameteriv, + glGetNamedFramebufferAttachmentParameteriv, + glCreateRenderbuffers, + glNamedRenderbufferStorage, + glNamedRenderbufferStorageMultisample, + glGetNamedRenderbufferParameteriv, + glCreateTextures, + glTextureBuffer, + glTextureBufferRange, + glTextureStorage1D, + glTextureStorage2D, + glTextureStorage3D, + glTextureStorage2DMultisample, + glTextureStorage3DMultisample, + glTextureSubImage1D, + glTextureSubImage2D, + glTextureSubImage3D, + glCompressedTextureSubImage1D, + glCompressedTextureSubImage2D, + glCompressedTextureSubImage3D, + glCopyTextureSubImage1D, + glCopyTextureSubImage2D, + glCopyTextureSubImage3D, + glTextureParameterf, + glTextureParameterfv, + glTextureParameteri, + glTextureParameterIiv, + glTextureParameterIuiv, + glTextureParameteriv, + glGenerateTextureMipmap, + glBindTextureUnit, + glGetTextureImage, + glGetCompressedTextureImage, + glGetTextureLevelParameterfv, + glGetTextureLevelParameteriv, + glGetTextureParameterfv, + glGetTextureParameterIiv, + glGetTextureParameterIuiv, + glGetTextureParameteriv, + glCreateVertexArrays, + glDisableVertexArrayAttrib, + glEnableVertexArrayAttrib, + glVertexArrayElementBuffer, + glVertexArrayVertexBuffer, + glVertexArrayVertexBuffers, + glVertexArrayAttribFormat, + glVertexArrayAttribIFormat, + glVertexArrayAttribLFormat, + glVertexArrayAttribBinding, + glVertexArrayBindingDivisor, + glGetVertexArrayiv, + glGetVertexArrayIndexediv, + glGetVertexArrayIndexed64iv, + glCreateSamplers, + glCreateProgramPipelines, + glCreateQueries, + glGetQueryBufferObjectiv, + glGetQueryBufferObjectuiv, + glGetQueryBufferObjecti64v, + glGetQueryBufferObjectui64v, + glMemoryBarrierByRegion, + glGetTextureSubImage, + glGetCompressedTextureSubImage, + glTextureBarrier, + glGetGraphicsResetStatus, + glGetnMapdv, + glGetnMapfv, + glGetnMapiv, + glGetnPixelMapfv, + glGetnPixelMapuiv, + glGetnPixelMapusv, + glGetnPolygonStipple, + glGetnTexImage, + glReadnPixels, + glGetnColorTable, + glGetnConvolutionFilter, + glGetnSeparableFilter, + glGetnHistogram, + glGetnMinmax, + glGetnCompressedTexImage, + glGetnUniformfv, + glGetnUniformdv, + glGetnUniformiv, + glGetnUniformuiv; + + // GL46 + public final long + glMultiDrawArraysIndirectCount, + glMultiDrawElementsIndirectCount, + glPolygonOffsetClamp, + glSpecializeShader; + + // AMD_debug_output + public final long + glDebugMessageEnableAMD, + glDebugMessageInsertAMD, + glDebugMessageCallbackAMD, + glGetDebugMessageLogAMD; + + // AMD_draw_buffers_blend + public final long + glBlendFuncIndexedAMD, + glBlendFuncSeparateIndexedAMD, + glBlendEquationIndexedAMD, + glBlendEquationSeparateIndexedAMD; + + // AMD_framebuffer_multisample_advanced + public final long + glRenderbufferStorageMultisampleAdvancedAMD, + glNamedRenderbufferStorageMultisampleAdvancedAMD; + + // AMD_gpu_shader_int64 + public final long + glUniform1i64NV, + glUniform2i64NV, + glUniform3i64NV, + glUniform4i64NV, + glUniform1i64vNV, + glUniform2i64vNV, + glUniform3i64vNV, + glUniform4i64vNV, + glUniform1ui64NV, + glUniform2ui64NV, + glUniform3ui64NV, + glUniform4ui64NV, + glUniform1ui64vNV, + glUniform2ui64vNV, + glUniform3ui64vNV, + glUniform4ui64vNV, + glGetUniformi64vNV, + glGetUniformui64vNV, + glProgramUniform1i64NV, + glProgramUniform2i64NV, + glProgramUniform3i64NV, + glProgramUniform4i64NV, + glProgramUniform1i64vNV, + glProgramUniform2i64vNV, + glProgramUniform3i64vNV, + glProgramUniform4i64vNV, + glProgramUniform1ui64NV, + glProgramUniform2ui64NV, + glProgramUniform3ui64NV, + glProgramUniform4ui64NV, + glProgramUniform1ui64vNV, + glProgramUniform2ui64vNV, + glProgramUniform3ui64vNV, + glProgramUniform4ui64vNV; + + // AMD_interleaved_elements + public final long + glVertexAttribParameteriAMD; + + // AMD_occlusion_query_event + public final long + glQueryObjectParameteruiAMD; + + // AMD_performance_monitor + public final long + glGetPerfMonitorGroupsAMD, + glGetPerfMonitorCountersAMD, + glGetPerfMonitorGroupStringAMD, + glGetPerfMonitorCounterStringAMD, + glGetPerfMonitorCounterInfoAMD, + glGenPerfMonitorsAMD, + glDeletePerfMonitorsAMD, + glSelectPerfMonitorCountersAMD, + glBeginPerfMonitorAMD, + glEndPerfMonitorAMD, + glGetPerfMonitorCounterDataAMD; + + // AMD_sample_positions + public final long + glSetMultisamplefvAMD; + + // AMD_sparse_texture + public final long + glTexStorageSparseAMD, + glTextureStorageSparseAMD; + + // AMD_stencil_operation_extended + public final long + glStencilOpValueAMD; + + // AMD_vertex_shader_tessellator + public final long + glTessellationFactorAMD, + glTessellationModeAMD; + + // ARB_bindless_texture + public final long + glGetTextureHandleARB, + glGetTextureSamplerHandleARB, + glMakeTextureHandleResidentARB, + glMakeTextureHandleNonResidentARB, + glGetImageHandleARB, + glMakeImageHandleResidentARB, + glMakeImageHandleNonResidentARB, + glUniformHandleui64ARB, + glUniformHandleui64vARB, + glProgramUniformHandleui64ARB, + glProgramUniformHandleui64vARB, + glIsTextureHandleResidentARB, + glIsImageHandleResidentARB, + glVertexAttribL1ui64ARB, + glVertexAttribL1ui64vARB, + glGetVertexAttribLui64vARB; + + // ARB_buffer_storage + public final long + glNamedBufferStorageEXT; + + // ARB_clear_buffer_object + public final long + glClearNamedBufferDataEXT, + glClearNamedBufferSubDataEXT; + + // ARB_color_buffer_float + public final long + glClampColorARB; + + // ARB_compute_variable_group_size + public final long + glDispatchComputeGroupSizeARB; + + // ARB_debug_output + public final long + glDebugMessageControlARB, + glDebugMessageInsertARB, + glDebugMessageCallbackARB, + glGetDebugMessageLogARB; + + // ARB_draw_buffers + public final long + glDrawBuffersARB; + + // ARB_draw_buffers_blend + public final long + glBlendEquationiARB, + glBlendEquationSeparateiARB, + glBlendFunciARB, + glBlendFuncSeparateiARB; + + // ARB_draw_instanced + public final long + glDrawArraysInstancedARB, + glDrawElementsInstancedARB; + + // ARB_ES3_2_compatibility + public final long + glPrimitiveBoundingBoxARB; + + // ARB_framebuffer_no_attachments + public final long + glNamedFramebufferParameteriEXT, + glGetNamedFramebufferParameterivEXT; + + // ARB_geometry_shader4 + public final long + glProgramParameteriARB, + glFramebufferTextureARB, + glFramebufferTextureLayerARB, + glFramebufferTextureFaceARB; + + // ARB_gl_spirv + public final long + glSpecializeShaderARB; + + // ARB_gpu_shader_fp64 + public final long + glProgramUniform1dEXT, + glProgramUniform2dEXT, + glProgramUniform3dEXT, + glProgramUniform4dEXT, + glProgramUniform1dvEXT, + glProgramUniform2dvEXT, + glProgramUniform3dvEXT, + glProgramUniform4dvEXT, + glProgramUniformMatrix2dvEXT, + glProgramUniformMatrix3dvEXT, + glProgramUniformMatrix4dvEXT, + glProgramUniformMatrix2x3dvEXT, + glProgramUniformMatrix2x4dvEXT, + glProgramUniformMatrix3x2dvEXT, + glProgramUniformMatrix3x4dvEXT, + glProgramUniformMatrix4x2dvEXT, + glProgramUniformMatrix4x3dvEXT; + + // ARB_gpu_shader_int64 + public final long + glUniform1i64ARB, + glUniform1i64vARB, + glProgramUniform1i64ARB, + glProgramUniform1i64vARB, + glUniform2i64ARB, + glUniform2i64vARB, + glProgramUniform2i64ARB, + glProgramUniform2i64vARB, + glUniform3i64ARB, + glUniform3i64vARB, + glProgramUniform3i64ARB, + glProgramUniform3i64vARB, + glUniform4i64ARB, + glUniform4i64vARB, + glProgramUniform4i64ARB, + glProgramUniform4i64vARB, + glUniform1ui64ARB, + glUniform1ui64vARB, + glProgramUniform1ui64ARB, + glProgramUniform1ui64vARB, + glUniform2ui64ARB, + glUniform2ui64vARB, + glProgramUniform2ui64ARB, + glProgramUniform2ui64vARB, + glUniform3ui64ARB, + glUniform3ui64vARB, + glProgramUniform3ui64ARB, + glProgramUniform3ui64vARB, + glUniform4ui64ARB, + glUniform4ui64vARB, + glProgramUniform4ui64ARB, + glProgramUniform4ui64vARB, + glGetUniformi64vARB, + glGetUniformui64vARB, + glGetnUniformi64vARB, + glGetnUniformui64vARB; + + // ARB_imaging + public final long + glColorTable, + glCopyColorTable, + glColorTableParameteriv, + glColorTableParameterfv, + glGetColorTable, + glGetColorTableParameteriv, + glGetColorTableParameterfv, + glColorSubTable, + glCopyColorSubTable, + glConvolutionFilter1D, + glConvolutionFilter2D, + glCopyConvolutionFilter1D, + glCopyConvolutionFilter2D, + glGetConvolutionFilter, + glSeparableFilter2D, + glGetSeparableFilter, + glConvolutionParameteri, + glConvolutionParameteriv, + glConvolutionParameterf, + glConvolutionParameterfv, + glGetConvolutionParameteriv, + glGetConvolutionParameterfv, + glHistogram, + glResetHistogram, + glGetHistogram, + glGetHistogramParameteriv, + glGetHistogramParameterfv, + glMinmax, + glResetMinmax, + glGetMinmax, + glGetMinmaxParameteriv, + glGetMinmaxParameterfv; + + // ARB_indirect_parameters + public final long + glMultiDrawArraysIndirectCountARB, + glMultiDrawElementsIndirectCountARB; + + // ARB_instanced_arrays + public final long + glVertexAttribDivisorARB, + glVertexArrayVertexAttribDivisorEXT; + + // ARB_matrix_palette + public final long + glCurrentPaletteMatrixARB, + glMatrixIndexuivARB, + glMatrixIndexubvARB, + glMatrixIndexusvARB, + glMatrixIndexPointerARB; + + // ARB_multisample + public final long + glSampleCoverageARB; + + // ARB_multitexture + public final long + glActiveTextureARB, + glClientActiveTextureARB, + glMultiTexCoord1fARB, + glMultiTexCoord1sARB, + glMultiTexCoord1iARB, + glMultiTexCoord1dARB, + glMultiTexCoord1fvARB, + glMultiTexCoord1svARB, + glMultiTexCoord1ivARB, + glMultiTexCoord1dvARB, + glMultiTexCoord2fARB, + glMultiTexCoord2sARB, + glMultiTexCoord2iARB, + glMultiTexCoord2dARB, + glMultiTexCoord2fvARB, + glMultiTexCoord2svARB, + glMultiTexCoord2ivARB, + glMultiTexCoord2dvARB, + glMultiTexCoord3fARB, + glMultiTexCoord3sARB, + glMultiTexCoord3iARB, + glMultiTexCoord3dARB, + glMultiTexCoord3fvARB, + glMultiTexCoord3svARB, + glMultiTexCoord3ivARB, + glMultiTexCoord3dvARB, + glMultiTexCoord4fARB, + glMultiTexCoord4sARB, + glMultiTexCoord4iARB, + glMultiTexCoord4dARB, + glMultiTexCoord4fvARB, + glMultiTexCoord4svARB, + glMultiTexCoord4ivARB, + glMultiTexCoord4dvARB; + + // ARB_occlusion_query + public final long + glGenQueriesARB, + glDeleteQueriesARB, + glIsQueryARB, + glBeginQueryARB, + glEndQueryARB, + glGetQueryivARB, + glGetQueryObjectivARB, + glGetQueryObjectuivARB; + + // ARB_parallel_shader_compile + public final long + glMaxShaderCompilerThreadsARB; + + // ARB_point_parameters + public final long + glPointParameterfARB, + glPointParameterfvARB; + + // ARB_robustness + public final long + glGetGraphicsResetStatusARB, + glGetnMapdvARB, + glGetnMapfvARB, + glGetnMapivARB, + glGetnPixelMapfvARB, + glGetnPixelMapuivARB, + glGetnPixelMapusvARB, + glGetnPolygonStippleARB, + glGetnTexImageARB, + glReadnPixelsARB, + glGetnColorTableARB, + glGetnConvolutionFilterARB, + glGetnSeparableFilterARB, + glGetnHistogramARB, + glGetnMinmaxARB, + glGetnCompressedTexImageARB, + glGetnUniformfvARB, + glGetnUniformivARB, + glGetnUniformuivARB, + glGetnUniformdvARB; + + // ARB_sample_locations + public final long + glFramebufferSampleLocationsfvARB, + glNamedFramebufferSampleLocationsfvARB, + glEvaluateDepthValuesARB; + + // ARB_sample_shading + public final long + glMinSampleShadingARB; + + // ARB_shader_objects + public final long + glDeleteObjectARB, + glGetHandleARB, + glDetachObjectARB, + glCreateShaderObjectARB, + glShaderSourceARB, + glCompileShaderARB, + glCreateProgramObjectARB, + glAttachObjectARB, + glLinkProgramARB, + glUseProgramObjectARB, + glValidateProgramARB, + glUniform1fARB, + glUniform2fARB, + glUniform3fARB, + glUniform4fARB, + glUniform1iARB, + glUniform2iARB, + glUniform3iARB, + glUniform4iARB, + glUniform1fvARB, + glUniform2fvARB, + glUniform3fvARB, + glUniform4fvARB, + glUniform1ivARB, + glUniform2ivARB, + glUniform3ivARB, + glUniform4ivARB, + glUniformMatrix2fvARB, + glUniformMatrix3fvARB, + glUniformMatrix4fvARB, + glGetObjectParameterfvARB, + glGetObjectParameterivARB, + glGetInfoLogARB, + glGetAttachedObjectsARB, + glGetUniformLocationARB, + glGetActiveUniformARB, + glGetUniformfvARB, + glGetUniformivARB, + glGetShaderSourceARB; + + // ARB_shading_language_include + public final long + glNamedStringARB, + glDeleteNamedStringARB, + glCompileShaderIncludeARB, + glIsNamedStringARB, + glGetNamedStringARB, + glGetNamedStringivARB; + + // ARB_sparse_buffer + public final long + glBufferPageCommitmentARB, + glNamedBufferPageCommitmentEXT, + glNamedBufferPageCommitmentARB; + + // ARB_sparse_texture + public final long + glTexPageCommitmentARB, + glTexturePageCommitmentEXT; + + // ARB_texture_buffer_object + public final long + glTexBufferARB; + + // ARB_texture_buffer_range + public final long + glTextureBufferRangeEXT; + + // ARB_texture_compression + public final long + glCompressedTexImage3DARB, + glCompressedTexImage2DARB, + glCompressedTexImage1DARB, + glCompressedTexSubImage3DARB, + glCompressedTexSubImage2DARB, + glCompressedTexSubImage1DARB, + glGetCompressedTexImageARB; + + // ARB_texture_storage + public final long + glTextureStorage1DEXT, + glTextureStorage2DEXT, + glTextureStorage3DEXT; + + // ARB_texture_storage_multisample + public final long + glTextureStorage2DMultisampleEXT, + glTextureStorage3DMultisampleEXT; + + // ARB_transpose_matrix + public final long + glLoadTransposeMatrixfARB, + glLoadTransposeMatrixdARB, + glMultTransposeMatrixfARB, + glMultTransposeMatrixdARB; + + // ARB_vertex_attrib_64bit + public final long + glVertexArrayVertexAttribLOffsetEXT; + + // ARB_vertex_attrib_binding + public final long + glVertexArrayBindVertexBufferEXT, + glVertexArrayVertexAttribFormatEXT, + glVertexArrayVertexAttribIFormatEXT, + glVertexArrayVertexAttribLFormatEXT, + glVertexArrayVertexAttribBindingEXT, + glVertexArrayVertexBindingDivisorEXT; + + // ARB_vertex_blend + public final long + glWeightfvARB, + glWeightbvARB, + glWeightubvARB, + glWeightsvARB, + glWeightusvARB, + glWeightivARB, + glWeightuivARB, + glWeightdvARB, + glWeightPointerARB, + glVertexBlendARB; + + // ARB_vertex_buffer_object + public final long + glBindBufferARB, + glDeleteBuffersARB, + glGenBuffersARB, + glIsBufferARB, + glBufferDataARB, + glBufferSubDataARB, + glGetBufferSubDataARB, + glMapBufferARB, + glUnmapBufferARB, + glGetBufferParameterivARB, + glGetBufferPointervARB; + + // ARB_vertex_program + public final long + glVertexAttrib1sARB, + glVertexAttrib1fARB, + glVertexAttrib1dARB, + glVertexAttrib2sARB, + glVertexAttrib2fARB, + glVertexAttrib2dARB, + glVertexAttrib3sARB, + glVertexAttrib3fARB, + glVertexAttrib3dARB, + glVertexAttrib4sARB, + glVertexAttrib4fARB, + glVertexAttrib4dARB, + glVertexAttrib4NubARB, + glVertexAttrib1svARB, + glVertexAttrib1fvARB, + glVertexAttrib1dvARB, + glVertexAttrib2svARB, + glVertexAttrib2fvARB, + glVertexAttrib2dvARB, + glVertexAttrib3svARB, + glVertexAttrib3fvARB, + glVertexAttrib3dvARB, + glVertexAttrib4fvARB, + glVertexAttrib4bvARB, + glVertexAttrib4svARB, + glVertexAttrib4ivARB, + glVertexAttrib4ubvARB, + glVertexAttrib4usvARB, + glVertexAttrib4uivARB, + glVertexAttrib4dvARB, + glVertexAttrib4NbvARB, + glVertexAttrib4NsvARB, + glVertexAttrib4NivARB, + glVertexAttrib4NubvARB, + glVertexAttrib4NusvARB, + glVertexAttrib4NuivARB, + glVertexAttribPointerARB, + glEnableVertexAttribArrayARB, + glDisableVertexAttribArrayARB, + glProgramStringARB, + glBindProgramARB, + glDeleteProgramsARB, + glGenProgramsARB, + glProgramEnvParameter4dARB, + glProgramEnvParameter4dvARB, + glProgramEnvParameter4fARB, + glProgramEnvParameter4fvARB, + glProgramLocalParameter4dARB, + glProgramLocalParameter4dvARB, + glProgramLocalParameter4fARB, + glProgramLocalParameter4fvARB, + glGetProgramEnvParameterfvARB, + glGetProgramEnvParameterdvARB, + glGetProgramLocalParameterfvARB, + glGetProgramLocalParameterdvARB, + glGetProgramivARB, + glGetProgramStringARB, + glGetVertexAttribfvARB, + glGetVertexAttribdvARB, + glGetVertexAttribivARB, + glGetVertexAttribPointervARB, + glIsProgramARB; + + // ARB_vertex_shader + public final long + glBindAttribLocationARB, + glGetActiveAttribARB, + glGetAttribLocationARB; + + // ARB_window_pos + public final long + glWindowPos2iARB, + glWindowPos2sARB, + glWindowPos2fARB, + glWindowPos2dARB, + glWindowPos2ivARB, + glWindowPos2svARB, + glWindowPos2fvARB, + glWindowPos2dvARB, + glWindowPos3iARB, + glWindowPos3sARB, + glWindowPos3fARB, + glWindowPos3dARB, + glWindowPos3ivARB, + glWindowPos3svARB, + glWindowPos3fvARB, + glWindowPos3dvARB; + + // EXT_bindable_uniform + public final long + glUniformBufferEXT, + glGetUniformBufferSizeEXT, + glGetUniformOffsetEXT; + + // EXT_blend_color + public final long + glBlendColorEXT; + + // EXT_blend_equation_separate + public final long + glBlendEquationSeparateEXT; + + // EXT_blend_func_separate + public final long + glBlendFuncSeparateEXT; + + // EXT_blend_minmax + public final long + glBlendEquationEXT; + + // EXT_compiled_vertex_array + public final long + glLockArraysEXT, + glUnlockArraysEXT; + + // EXT_debug_label + public final long + glLabelObjectEXT, + glGetObjectLabelEXT; + + // EXT_debug_marker + public final long + glInsertEventMarkerEXT, + glPushGroupMarkerEXT, + glPopGroupMarkerEXT; + + // EXT_depth_bounds_test + public final long + glDepthBoundsEXT; + + // EXT_direct_state_access + public final long + glClientAttribDefaultEXT, + glPushClientAttribDefaultEXT, + glMatrixLoadfEXT, + glMatrixLoaddEXT, + glMatrixMultfEXT, + glMatrixMultdEXT, + glMatrixLoadIdentityEXT, + glMatrixRotatefEXT, + glMatrixRotatedEXT, + glMatrixScalefEXT, + glMatrixScaledEXT, + glMatrixTranslatefEXT, + glMatrixTranslatedEXT, + glMatrixOrthoEXT, + glMatrixFrustumEXT, + glMatrixPushEXT, + glMatrixPopEXT, + glTextureParameteriEXT, + glTextureParameterivEXT, + glTextureParameterfEXT, + glTextureParameterfvEXT, + glTextureImage1DEXT, + glTextureImage2DEXT, + glTextureSubImage1DEXT, + glTextureSubImage2DEXT, + glCopyTextureImage1DEXT, + glCopyTextureImage2DEXT, + glCopyTextureSubImage1DEXT, + glCopyTextureSubImage2DEXT, + glGetTextureImageEXT, + glGetTextureParameterfvEXT, + glGetTextureParameterivEXT, + glGetTextureLevelParameterfvEXT, + glGetTextureLevelParameterivEXT, + glTextureImage3DEXT, + glTextureSubImage3DEXT, + glCopyTextureSubImage3DEXT, + glBindMultiTextureEXT, + glMultiTexCoordPointerEXT, + glMultiTexEnvfEXT, + glMultiTexEnvfvEXT, + glMultiTexEnviEXT, + glMultiTexEnvivEXT, + glMultiTexGendEXT, + glMultiTexGendvEXT, + glMultiTexGenfEXT, + glMultiTexGenfvEXT, + glMultiTexGeniEXT, + glMultiTexGenivEXT, + glGetMultiTexEnvfvEXT, + glGetMultiTexEnvivEXT, + glGetMultiTexGendvEXT, + glGetMultiTexGenfvEXT, + glGetMultiTexGenivEXT, + glMultiTexParameteriEXT, + glMultiTexParameterivEXT, + glMultiTexParameterfEXT, + glMultiTexParameterfvEXT, + glMultiTexImage1DEXT, + glMultiTexImage2DEXT, + glMultiTexSubImage1DEXT, + glMultiTexSubImage2DEXT, + glCopyMultiTexImage1DEXT, + glCopyMultiTexImage2DEXT, + glCopyMultiTexSubImage1DEXT, + glCopyMultiTexSubImage2DEXT, + glGetMultiTexImageEXT, + glGetMultiTexParameterfvEXT, + glGetMultiTexParameterivEXT, + glGetMultiTexLevelParameterfvEXT, + glGetMultiTexLevelParameterivEXT, + glMultiTexImage3DEXT, + glMultiTexSubImage3DEXT, + glCopyMultiTexSubImage3DEXT, + glEnableClientStateIndexedEXT, + glDisableClientStateIndexedEXT, + glEnableClientStateiEXT, + glDisableClientStateiEXT, + glGetFloatIndexedvEXT, + glGetDoubleIndexedvEXT, + glGetPointerIndexedvEXT, + glGetFloati_vEXT, + glGetDoublei_vEXT, + glGetPointeri_vEXT, + glEnableIndexedEXT, + glDisableIndexedEXT, + glIsEnabledIndexedEXT, + glGetIntegerIndexedvEXT, + glGetBooleanIndexedvEXT, + glNamedProgramStringEXT, + glNamedProgramLocalParameter4dEXT, + glNamedProgramLocalParameter4dvEXT, + glNamedProgramLocalParameter4fEXT, + glNamedProgramLocalParameter4fvEXT, + glGetNamedProgramLocalParameterdvEXT, + glGetNamedProgramLocalParameterfvEXT, + glGetNamedProgramivEXT, + glGetNamedProgramStringEXT, + glCompressedTextureImage3DEXT, + glCompressedTextureImage2DEXT, + glCompressedTextureImage1DEXT, + glCompressedTextureSubImage3DEXT, + glCompressedTextureSubImage2DEXT, + glCompressedTextureSubImage1DEXT, + glGetCompressedTextureImageEXT, + glCompressedMultiTexImage3DEXT, + glCompressedMultiTexImage2DEXT, + glCompressedMultiTexImage1DEXT, + glCompressedMultiTexSubImage3DEXT, + glCompressedMultiTexSubImage2DEXT, + glCompressedMultiTexSubImage1DEXT, + glGetCompressedMultiTexImageEXT, + glMatrixLoadTransposefEXT, + glMatrixLoadTransposedEXT, + glMatrixMultTransposefEXT, + glMatrixMultTransposedEXT, + glNamedBufferDataEXT, + glNamedBufferSubDataEXT, + glMapNamedBufferEXT, + glUnmapNamedBufferEXT, + glGetNamedBufferParameterivEXT, + glGetNamedBufferSubDataEXT, + glProgramUniform1fEXT, + glProgramUniform2fEXT, + glProgramUniform3fEXT, + glProgramUniform4fEXT, + glProgramUniform1iEXT, + glProgramUniform2iEXT, + glProgramUniform3iEXT, + glProgramUniform4iEXT, + glProgramUniform1fvEXT, + glProgramUniform2fvEXT, + glProgramUniform3fvEXT, + glProgramUniform4fvEXT, + glProgramUniform1ivEXT, + glProgramUniform2ivEXT, + glProgramUniform3ivEXT, + glProgramUniform4ivEXT, + glProgramUniformMatrix2fvEXT, + glProgramUniformMatrix3fvEXT, + glProgramUniformMatrix4fvEXT, + glProgramUniformMatrix2x3fvEXT, + glProgramUniformMatrix3x2fvEXT, + glProgramUniformMatrix2x4fvEXT, + glProgramUniformMatrix4x2fvEXT, + glProgramUniformMatrix3x4fvEXT, + glProgramUniformMatrix4x3fvEXT, + glTextureBufferEXT, + glMultiTexBufferEXT, + glTextureParameterIivEXT, + glTextureParameterIuivEXT, + glGetTextureParameterIivEXT, + glGetTextureParameterIuivEXT, + glMultiTexParameterIivEXT, + glMultiTexParameterIuivEXT, + glGetMultiTexParameterIivEXT, + glGetMultiTexParameterIuivEXT, + glProgramUniform1uiEXT, + glProgramUniform2uiEXT, + glProgramUniform3uiEXT, + glProgramUniform4uiEXT, + glProgramUniform1uivEXT, + glProgramUniform2uivEXT, + glProgramUniform3uivEXT, + glProgramUniform4uivEXT, + glNamedProgramLocalParameters4fvEXT, + glNamedProgramLocalParameterI4iEXT, + glNamedProgramLocalParameterI4ivEXT, + glNamedProgramLocalParametersI4ivEXT, + glNamedProgramLocalParameterI4uiEXT, + glNamedProgramLocalParameterI4uivEXT, + glNamedProgramLocalParametersI4uivEXT, + glGetNamedProgramLocalParameterIivEXT, + glGetNamedProgramLocalParameterIuivEXT, + glNamedRenderbufferStorageEXT, + glGetNamedRenderbufferParameterivEXT, + glNamedRenderbufferStorageMultisampleEXT, + glNamedRenderbufferStorageMultisampleCoverageEXT, + glCheckNamedFramebufferStatusEXT, + glNamedFramebufferTexture1DEXT, + glNamedFramebufferTexture2DEXT, + glNamedFramebufferTexture3DEXT, + glNamedFramebufferRenderbufferEXT, + glGetNamedFramebufferAttachmentParameterivEXT, + glGenerateTextureMipmapEXT, + glGenerateMultiTexMipmapEXT, + glFramebufferDrawBufferEXT, + glFramebufferDrawBuffersEXT, + glFramebufferReadBufferEXT, + glGetFramebufferParameterivEXT, + glNamedCopyBufferSubDataEXT, + glNamedFramebufferTextureEXT, + glNamedFramebufferTextureLayerEXT, + glNamedFramebufferTextureFaceEXT, + glTextureRenderbufferEXT, + glMultiTexRenderbufferEXT, + glVertexArrayVertexOffsetEXT, + glVertexArrayColorOffsetEXT, + glVertexArrayEdgeFlagOffsetEXT, + glVertexArrayIndexOffsetEXT, + glVertexArrayNormalOffsetEXT, + glVertexArrayTexCoordOffsetEXT, + glVertexArrayMultiTexCoordOffsetEXT, + glVertexArrayFogCoordOffsetEXT, + glVertexArraySecondaryColorOffsetEXT, + glVertexArrayVertexAttribOffsetEXT, + glVertexArrayVertexAttribIOffsetEXT, + glEnableVertexArrayEXT, + glDisableVertexArrayEXT, + glEnableVertexArrayAttribEXT, + glDisableVertexArrayAttribEXT, + glGetVertexArrayIntegervEXT, + glGetVertexArrayPointervEXT, + glGetVertexArrayIntegeri_vEXT, + glGetVertexArrayPointeri_vEXT, + glMapNamedBufferRangeEXT, + glFlushMappedNamedBufferRangeEXT; + + // EXT_draw_buffers2 + public final long + glColorMaskIndexedEXT; + + // EXT_draw_instanced + public final long + glDrawArraysInstancedEXT, + glDrawElementsInstancedEXT; + + // EXT_EGL_image_storage + public final long + glEGLImageTargetTexStorageEXT, + glEGLImageTargetTextureStorageEXT; + + // EXT_external_buffer + public final long + glBufferStorageExternalEXT, + glNamedBufferStorageExternalEXT; + + // EXT_framebuffer_blit + public final long + glBlitFramebufferEXT; + + // EXT_framebuffer_blit_layers + public final long + glBlitFramebufferLayersEXT, + glBlitFramebufferLayerEXT; + + // EXT_framebuffer_multisample + public final long + glRenderbufferStorageMultisampleEXT; + + // EXT_framebuffer_object + public final long + glIsRenderbufferEXT, + glBindRenderbufferEXT, + glDeleteRenderbuffersEXT, + glGenRenderbuffersEXT, + glRenderbufferStorageEXT, + glGetRenderbufferParameterivEXT, + glIsFramebufferEXT, + glBindFramebufferEXT, + glDeleteFramebuffersEXT, + glGenFramebuffersEXT, + glCheckFramebufferStatusEXT, + glFramebufferTexture1DEXT, + glFramebufferTexture2DEXT, + glFramebufferTexture3DEXT, + glFramebufferRenderbufferEXT, + glGetFramebufferAttachmentParameterivEXT, + glGenerateMipmapEXT; + + // EXT_geometry_shader4 + public final long + glProgramParameteriEXT, + glFramebufferTextureEXT, + glFramebufferTextureLayerEXT, + glFramebufferTextureFaceEXT; + + // EXT_gpu_program_parameters + public final long + glProgramEnvParameters4fvEXT, + glProgramLocalParameters4fvEXT; + + // EXT_gpu_shader4 + public final long + glVertexAttribI1iEXT, + glVertexAttribI2iEXT, + glVertexAttribI3iEXT, + glVertexAttribI4iEXT, + glVertexAttribI1uiEXT, + glVertexAttribI2uiEXT, + glVertexAttribI3uiEXT, + glVertexAttribI4uiEXT, + glVertexAttribI1ivEXT, + glVertexAttribI2ivEXT, + glVertexAttribI3ivEXT, + glVertexAttribI4ivEXT, + glVertexAttribI1uivEXT, + glVertexAttribI2uivEXT, + glVertexAttribI3uivEXT, + glVertexAttribI4uivEXT, + glVertexAttribI4bvEXT, + glVertexAttribI4svEXT, + glVertexAttribI4ubvEXT, + glVertexAttribI4usvEXT, + glVertexAttribIPointerEXT, + glGetVertexAttribIivEXT, + glGetVertexAttribIuivEXT, + glGetUniformuivEXT, + glBindFragDataLocationEXT, + glGetFragDataLocationEXT, + glUniform1uiEXT, + glUniform2uiEXT, + glUniform3uiEXT, + glUniform4uiEXT, + glUniform1uivEXT, + glUniform2uivEXT, + glUniform3uivEXT, + glUniform4uivEXT; + + // EXT_memory_object + public final long + glGetUnsignedBytevEXT, + glGetUnsignedBytei_vEXT, + glDeleteMemoryObjectsEXT, + glIsMemoryObjectEXT, + glCreateMemoryObjectsEXT, + glMemoryObjectParameterivEXT, + glGetMemoryObjectParameterivEXT, + glTexStorageMem2DEXT, + glTexStorageMem2DMultisampleEXT, + glTexStorageMem3DEXT, + glTexStorageMem3DMultisampleEXT, + glBufferStorageMemEXT, + glTextureStorageMem2DEXT, + glTextureStorageMem2DMultisampleEXT, + glTextureStorageMem3DEXT, + glTextureStorageMem3DMultisampleEXT, + glNamedBufferStorageMemEXT, + glTexStorageMem1DEXT, + glTextureStorageMem1DEXT; + + // EXT_memory_object_fd + public final long + glImportMemoryFdEXT; + + // EXT_memory_object_win32 + public final long + glImportMemoryWin32HandleEXT, + glImportMemoryWin32NameEXT; + + // EXT_point_parameters + public final long + glPointParameterfEXT, + glPointParameterfvEXT; + + // EXT_polygon_offset_clamp + public final long + glPolygonOffsetClampEXT; + + // EXT_provoking_vertex + public final long + glProvokingVertexEXT; + + // EXT_raster_multisample + public final long + glRasterSamplesEXT; + + // EXT_secondary_color + public final long + glSecondaryColor3bEXT, + glSecondaryColor3sEXT, + glSecondaryColor3iEXT, + glSecondaryColor3fEXT, + glSecondaryColor3dEXT, + glSecondaryColor3ubEXT, + glSecondaryColor3usEXT, + glSecondaryColor3uiEXT, + glSecondaryColor3bvEXT, + glSecondaryColor3svEXT, + glSecondaryColor3ivEXT, + glSecondaryColor3fvEXT, + glSecondaryColor3dvEXT, + glSecondaryColor3ubvEXT, + glSecondaryColor3usvEXT, + glSecondaryColor3uivEXT, + glSecondaryColorPointerEXT; + + // EXT_semaphore + public final long + glGenSemaphoresEXT, + glDeleteSemaphoresEXT, + glIsSemaphoreEXT, + glSemaphoreParameterui64vEXT, + glGetSemaphoreParameterui64vEXT, + glWaitSemaphoreEXT, + glSignalSemaphoreEXT; + + // EXT_semaphore_fd + public final long + glImportSemaphoreFdEXT; + + // EXT_semaphore_win32 + public final long + glImportSemaphoreWin32HandleEXT, + glImportSemaphoreWin32NameEXT; + + // EXT_separate_shader_objects + public final long + glUseShaderProgramEXT, + glActiveProgramEXT, + glCreateShaderProgramEXT; + + // EXT_shader_framebuffer_fetch_non_coherent + public final long + glFramebufferFetchBarrierEXT; + + // EXT_shader_image_load_store + public final long + glBindImageTextureEXT, + glMemoryBarrierEXT; + + // EXT_stencil_clear_tag + public final long + glStencilClearTagEXT; + + // EXT_stencil_two_side + public final long + glActiveStencilFaceEXT; + + // EXT_texture_buffer_object + public final long + glTexBufferEXT; + + // EXT_texture_integer + public final long + glClearColorIiEXT, + glClearColorIuiEXT, + glTexParameterIivEXT, + glTexParameterIuivEXT, + glGetTexParameterIivEXT, + glGetTexParameterIuivEXT; + + // EXT_texture_storage + public final long + glTexStorage1DEXT, + glTexStorage2DEXT, + glTexStorage3DEXT; + + // EXT_timer_query + public final long + glGetQueryObjecti64vEXT, + glGetQueryObjectui64vEXT; + + // EXT_transform_feedback + public final long + glBindBufferRangeEXT, + glBindBufferOffsetEXT, + glBindBufferBaseEXT, + glBeginTransformFeedbackEXT, + glEndTransformFeedbackEXT, + glTransformFeedbackVaryingsEXT, + glGetTransformFeedbackVaryingEXT; + + // EXT_vertex_attrib_64bit + public final long + glVertexAttribL1dEXT, + glVertexAttribL2dEXT, + glVertexAttribL3dEXT, + glVertexAttribL4dEXT, + glVertexAttribL1dvEXT, + glVertexAttribL2dvEXT, + glVertexAttribL3dvEXT, + glVertexAttribL4dvEXT, + glVertexAttribLPointerEXT, + glGetVertexAttribLdvEXT; + + // EXT_win32_keyed_mutex + public final long + glAcquireKeyedMutexWin32EXT, + glReleaseKeyedMutexWin32EXT; + + // EXT_window_rectangles + public final long + glWindowRectanglesEXT; + + // EXT_x11_sync_object + public final long + glImportSyncEXT; + + // GREMEDY_frame_terminator + public final long + glFrameTerminatorGREMEDY; + + // GREMEDY_string_marker + public final long + glStringMarkerGREMEDY; + + // INTEL_framebuffer_CMAA + public final long + glApplyFramebufferAttachmentCMAAINTEL; + + // INTEL_map_texture + public final long + glSyncTextureINTEL, + glUnmapTexture2DINTEL, + glMapTexture2DINTEL; + + // INTEL_performance_query + public final long + glBeginPerfQueryINTEL, + glCreatePerfQueryINTEL, + glDeletePerfQueryINTEL, + glEndPerfQueryINTEL, + glGetFirstPerfQueryIdINTEL, + glGetNextPerfQueryIdINTEL, + glGetPerfCounterInfoINTEL, + glGetPerfQueryDataINTEL, + glGetPerfQueryIdByNameINTEL, + glGetPerfQueryInfoINTEL; + + // KHR_blend_equation_advanced + public final long + glBlendBarrierKHR; + + // KHR_parallel_shader_compile + public final long + glMaxShaderCompilerThreadsKHR; + + // MESA_framebuffer_flip_y + public final long + glFramebufferParameteriMESA, + glGetFramebufferParameterivMESA; + + // NV_alpha_to_coverage_dither_control + public final long + glAlphaToCoverageDitherControlNV; + + // NV_bindless_multi_draw_indirect + public final long + glMultiDrawArraysIndirectBindlessNV, + glMultiDrawElementsIndirectBindlessNV; + + // NV_bindless_multi_draw_indirect_count + public final long + glMultiDrawArraysIndirectBindlessCountNV, + glMultiDrawElementsIndirectBindlessCountNV; + + // NV_bindless_texture + public final long + glGetTextureHandleNV, + glGetTextureSamplerHandleNV, + glMakeTextureHandleResidentNV, + glMakeTextureHandleNonResidentNV, + glGetImageHandleNV, + glMakeImageHandleResidentNV, + glMakeImageHandleNonResidentNV, + glUniformHandleui64NV, + glUniformHandleui64vNV, + glProgramUniformHandleui64NV, + glProgramUniformHandleui64vNV, + glIsTextureHandleResidentNV, + glIsImageHandleResidentNV; + + // NV_blend_equation_advanced + public final long + glBlendParameteriNV, + glBlendBarrierNV; + + // NV_clip_space_w_scaling + public final long + glViewportPositionWScaleNV; + + // NV_command_list + public final long + glCreateStatesNV, + glDeleteStatesNV, + glIsStateNV, + glStateCaptureNV, + glGetCommandHeaderNV, + glGetStageIndexNV, + glDrawCommandsNV, + glDrawCommandsAddressNV, + glDrawCommandsStatesNV, + glDrawCommandsStatesAddressNV, + glCreateCommandListsNV, + glDeleteCommandListsNV, + glIsCommandListNV, + glListDrawCommandsStatesClientNV, + glCommandListSegmentsNV, + glCompileCommandListNV, + glCallCommandListNV; + + // NV_conditional_render + public final long + glBeginConditionalRenderNV, + glEndConditionalRenderNV; + + // NV_conservative_raster + public final long + glSubpixelPrecisionBiasNV; + + // NV_conservative_raster_dilate + public final long + glConservativeRasterParameterfNV; + + // NV_conservative_raster_pre_snap_triangles + public final long + glConservativeRasterParameteriNV; + + // NV_copy_image + public final long + glCopyImageSubDataNV; + + // NV_depth_buffer_float + public final long + glDepthRangedNV, + glClearDepthdNV, + glDepthBoundsdNV; + + // NV_draw_texture + public final long + glDrawTextureNV; + + // NV_draw_vulkan_image + public final long + glDrawVkImageNV, + glGetVkProcAddrNV, + glWaitVkSemaphoreNV, + glSignalVkSemaphoreNV, + glSignalVkFenceNV; + + // NV_explicit_multisample + public final long + glGetMultisamplefvNV, + glSampleMaskIndexedNV, + glTexRenderbufferNV; + + // NV_fence + public final long + glDeleteFencesNV, + glGenFencesNV, + glIsFenceNV, + glTestFenceNV, + glGetFenceivNV, + glFinishFenceNV, + glSetFenceNV; + + // NV_fragment_coverage_to_color + public final long + glFragmentCoverageColorNV; + + // NV_framebuffer_mixed_samples + public final long + glCoverageModulationTableNV, + glGetCoverageModulationTableNV, + glCoverageModulationNV; + + // NV_framebuffer_multisample_coverage + public final long + glRenderbufferStorageMultisampleCoverageNV; + + // NV_gpu_multicast + public final long + glRenderGpuMaskNV, + glMulticastBufferSubDataNV, + glMulticastCopyBufferSubDataNV, + glMulticastCopyImageSubDataNV, + glMulticastBlitFramebufferNV, + glMulticastFramebufferSampleLocationsfvNV, + glMulticastBarrierNV, + glMulticastWaitSyncNV, + glMulticastGetQueryObjectivNV, + glMulticastGetQueryObjectuivNV, + glMulticastGetQueryObjecti64vNV, + glMulticastGetQueryObjectui64vNV; + + // NV_half_float + public final long + glVertex2hNV, + glVertex2hvNV, + glVertex3hNV, + glVertex3hvNV, + glVertex4hNV, + glVertex4hvNV, + glNormal3hNV, + glNormal3hvNV, + glColor3hNV, + glColor3hvNV, + glColor4hNV, + glColor4hvNV, + glTexCoord1hNV, + glTexCoord1hvNV, + glTexCoord2hNV, + glTexCoord2hvNV, + glTexCoord3hNV, + glTexCoord3hvNV, + glTexCoord4hNV, + glTexCoord4hvNV, + glMultiTexCoord1hNV, + glMultiTexCoord1hvNV, + glMultiTexCoord2hNV, + glMultiTexCoord2hvNV, + glMultiTexCoord3hNV, + glMultiTexCoord3hvNV, + glMultiTexCoord4hNV, + glMultiTexCoord4hvNV, + glFogCoordhNV, + glFogCoordhvNV, + glSecondaryColor3hNV, + glSecondaryColor3hvNV, + glVertexWeighthNV, + glVertexWeighthvNV, + glVertexAttrib1hNV, + glVertexAttrib1hvNV, + glVertexAttrib2hNV, + glVertexAttrib2hvNV, + glVertexAttrib3hNV, + glVertexAttrib3hvNV, + glVertexAttrib4hNV, + glVertexAttrib4hvNV, + glVertexAttribs1hvNV, + glVertexAttribs2hvNV, + glVertexAttribs3hvNV, + glVertexAttribs4hvNV; + + // NV_internalformat_sample_query + public final long + glGetInternalformatSampleivNV; + + // NV_memory_attachment + public final long + glGetMemoryObjectDetachedResourcesuivNV, + glResetMemoryObjectParameterNV, + glTexAttachMemoryNV, + glBufferAttachMemoryNV, + glTextureAttachMemoryNV, + glNamedBufferAttachMemoryNV; + + // NV_memory_object_sparse + public final long + glBufferPageCommitmentMemNV, + glNamedBufferPageCommitmentMemNV, + glTexPageCommitmentMemNV, + glTexturePageCommitmentMemNV; + + // NV_mesh_shader + public final long + glDrawMeshTasksNV, + glDrawMeshTasksIndirectNV, + glMultiDrawMeshTasksIndirectNV, + glMultiDrawMeshTasksIndirectCountNV; + + // NV_path_rendering + public final long + glPathCommandsNV, + glPathCoordsNV, + glPathSubCommandsNV, + glPathSubCoordsNV, + glPathStringNV, + glPathGlyphsNV, + glPathGlyphRangeNV, + glPathGlyphIndexArrayNV, + glPathMemoryGlyphIndexArrayNV, + glCopyPathNV, + glWeightPathsNV, + glInterpolatePathsNV, + glTransformPathNV, + glPathParameterivNV, + glPathParameteriNV, + glPathParameterfvNV, + glPathParameterfNV, + glPathDashArrayNV, + glGenPathsNV, + glDeletePathsNV, + glIsPathNV, + glPathStencilFuncNV, + glPathStencilDepthOffsetNV, + glStencilFillPathNV, + glStencilStrokePathNV, + glStencilFillPathInstancedNV, + glStencilStrokePathInstancedNV, + glPathCoverDepthFuncNV, + glPathColorGenNV, + glPathTexGenNV, + glPathFogGenNV, + glCoverFillPathNV, + glCoverStrokePathNV, + glCoverFillPathInstancedNV, + glCoverStrokePathInstancedNV, + glStencilThenCoverFillPathNV, + glStencilThenCoverStrokePathNV, + glStencilThenCoverFillPathInstancedNV, + glStencilThenCoverStrokePathInstancedNV, + glPathGlyphIndexRangeNV, + glProgramPathFragmentInputGenNV, + glGetPathParameterivNV, + glGetPathParameterfvNV, + glGetPathCommandsNV, + glGetPathCoordsNV, + glGetPathDashArrayNV, + glGetPathMetricsNV, + glGetPathMetricRangeNV, + glGetPathSpacingNV, + glGetPathColorGenivNV, + glGetPathColorGenfvNV, + glGetPathTexGenivNV, + glGetPathTexGenfvNV, + glIsPointInFillPathNV, + glIsPointInStrokePathNV, + glGetPathLengthNV, + glPointAlongPathNV, + glMatrixLoad3x2fNV, + glMatrixLoad3x3fNV, + glMatrixLoadTranspose3x3fNV, + glMatrixMult3x2fNV, + glMatrixMult3x3fNV, + glMatrixMultTranspose3x3fNV, + glGetProgramResourcefvNV; + + // NV_pixel_data_range + public final long + glPixelDataRangeNV, + glFlushPixelDataRangeNV; + + // NV_point_sprite + public final long + glPointParameteriNV, + glPointParameterivNV; + + // NV_primitive_restart + public final long + glPrimitiveRestartNV, + glPrimitiveRestartIndexNV; + + // NV_query_resource + public final long + glQueryResourceNV; + + // NV_query_resource_tag + public final long + glGenQueryResourceTagNV, + glDeleteQueryResourceTagNV, + glQueryResourceTagNV; + + // NV_sample_locations + public final long + glFramebufferSampleLocationsfvNV, + glNamedFramebufferSampleLocationsfvNV, + glResolveDepthValuesNV; + + // NV_scissor_exclusive + public final long + glScissorExclusiveArrayvNV, + glScissorExclusiveNV; + + // NV_shader_buffer_load + public final long + glMakeBufferResidentNV, + glMakeBufferNonResidentNV, + glIsBufferResidentNV, + glMakeNamedBufferResidentNV, + glMakeNamedBufferNonResidentNV, + glIsNamedBufferResidentNV, + glGetBufferParameterui64vNV, + glGetNamedBufferParameterui64vNV, + glGetIntegerui64vNV, + glUniformui64NV, + glUniformui64vNV, + glProgramUniformui64NV, + glProgramUniformui64vNV; + + // NV_shading_rate_image + public final long + glBindShadingRateImageNV, + glShadingRateImagePaletteNV, + glGetShadingRateImagePaletteNV, + glShadingRateImageBarrierNV, + glShadingRateSampleOrderNV, + glShadingRateSampleOrderCustomNV, + glGetShadingRateSampleLocationivNV; + + // NV_texture_barrier + public final long + glTextureBarrierNV; + + // NV_texture_multisample + public final long + glTexImage2DMultisampleCoverageNV, + glTexImage3DMultisampleCoverageNV, + glTextureImage2DMultisampleNV, + glTextureImage3DMultisampleNV, + glTextureImage2DMultisampleCoverageNV, + glTextureImage3DMultisampleCoverageNV; + + // NV_timeline_semaphore + public final long + glCreateSemaphoresNV, + glSemaphoreParameterivNV, + glGetSemaphoreParameterivNV; + + // NV_transform_feedback + public final long + glBeginTransformFeedbackNV, + glEndTransformFeedbackNV, + glTransformFeedbackAttribsNV, + glBindBufferRangeNV, + glBindBufferOffsetNV, + glBindBufferBaseNV, + glTransformFeedbackVaryingsNV, + glActiveVaryingNV, + glGetVaryingLocationNV, + glGetActiveVaryingNV, + glGetTransformFeedbackVaryingNV, + glTransformFeedbackStreamAttribsNV; + + // NV_transform_feedback2 + public final long + glBindTransformFeedbackNV, + glDeleteTransformFeedbacksNV, + glGenTransformFeedbacksNV, + glIsTransformFeedbackNV, + glPauseTransformFeedbackNV, + glResumeTransformFeedbackNV, + glDrawTransformFeedbackNV; + + // NV_vertex_array_range + public final long + glVertexArrayRangeNV, + glFlushVertexArrayRangeNV; + + // NV_vertex_attrib_integer_64bit + public final long + glVertexAttribL1i64NV, + glVertexAttribL2i64NV, + glVertexAttribL3i64NV, + glVertexAttribL4i64NV, + glVertexAttribL1i64vNV, + glVertexAttribL2i64vNV, + glVertexAttribL3i64vNV, + glVertexAttribL4i64vNV, + glVertexAttribL1ui64NV, + glVertexAttribL2ui64NV, + glVertexAttribL3ui64NV, + glVertexAttribL4ui64NV, + glVertexAttribL1ui64vNV, + glVertexAttribL2ui64vNV, + glVertexAttribL3ui64vNV, + glVertexAttribL4ui64vNV, + glGetVertexAttribLi64vNV, + glGetVertexAttribLui64vNV, + glVertexAttribLFormatNV; + + // NV_vertex_buffer_unified_memory + public final long + glBufferAddressRangeNV, + glVertexFormatNV, + glNormalFormatNV, + glColorFormatNV, + glIndexFormatNV, + glTexCoordFormatNV, + glEdgeFlagFormatNV, + glSecondaryColorFormatNV, + glFogCoordFormatNV, + glVertexAttribFormatNV, + glVertexAttribIFormatNV, + glGetIntegerui64i_vNV; + + // NV_viewport_swizzle + public final long + glViewportSwizzleNV; + + // NVX_conditional_render + public final long + glBeginConditionalRenderNVX, + glEndConditionalRenderNVX; + + // NVX_gpu_multicast2 + public final long + glAsyncCopyImageSubDataNVX, + glAsyncCopyBufferSubDataNVX, + glUploadGpuMaskNVX, + glMulticastViewportArrayvNVX, + glMulticastScissorArrayvNVX, + glMulticastViewportPositionWScaleNVX; + + // NVX_progress_fence + public final long + glCreateProgressFenceNVX, + glSignalSemaphoreui64NVX, + glWaitSemaphoreui64NVX, + glClientWaitSemaphoreui64NVX; + + // OVR_multiview + public final long + glFramebufferTextureMultiviewOVR, + glNamedFramebufferTextureMultiviewOVR; + + /** When true, {@link GL11} is supported. */ + public final boolean OpenGL11; + /** When true, {@link GL12} is supported. */ + public final boolean OpenGL12; + /** When true, {@link GL13} is supported. */ + public final boolean OpenGL13; + /** When true, {@link GL14} is supported. */ + public final boolean OpenGL14; + /** When true, {@link GL15} is supported. */ + public final boolean OpenGL15; + /** When true, {@link GL20} is supported. */ + public final boolean OpenGL20; + /** When true, {@link GL21} is supported. */ + public final boolean OpenGL21; + /** When true, {@link GL30} is supported. */ + public final boolean OpenGL30; + /** When true, {@link GL31} is supported. */ + public final boolean OpenGL31; + /** When true, {@link GL32} is supported. */ + public final boolean OpenGL32; + /** When true, {@link GL33} is supported. */ + public final boolean OpenGL33; + /** When true, {@link GL40} is supported. */ + public final boolean OpenGL40; + /** When true, {@link GL41} is supported. */ + public final boolean OpenGL41; + /** When true, {@link GL42} is supported. */ + public final boolean OpenGL42; + /** When true, {@link GL43} is supported. */ + public final boolean OpenGL43; + /** When true, {@link GL44} is supported. */ + public final boolean OpenGL44; + /** When true, {@link GL45} is supported. */ + public final boolean OpenGL45; + /** When true, {@link GL46} is supported. */ + public final boolean OpenGL46; + /** When true, {@link _3DFXTextureCompressionFXT1} is supported. */ + public final boolean GL_3DFX_texture_compression_FXT1; + /** When true, {@link AMDBlendMinmaxFactor} is supported. */ + public final boolean GL_AMD_blend_minmax_factor; + /** + * When true, the AMD_conservative_depth extension is supported. + * + *

    There is a common optimization for hardware accelerated implementation of OpenGL which relies on an early depth test to be run before the fragment + * shader so that the shader evaluation can be skipped if the fragment ends up being discarded because it is occluded.

    + * + *

    This optimization does not affect the final rendering, and is typically possible when the fragment does not change the depth programmatically. (i.e.: it + * does not write to the built-in {@code gl_FragDepth} output). There are, however a class of operations on the depth in the shader which could still be + * performed while allowing the early depth test to operate.

    + * + *

    This extension allows the application to pass enough information to the GL implementation to activate such optimizations safely.

    + * + *

    Requires {@link GL30 OpenGL 3.0}. Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ + public final boolean GL_AMD_conservative_depth; + /** When true, {@link AMDDebugOutput} is supported. */ + public final boolean GL_AMD_debug_output; + /** When true, {@link AMDDepthClampSeparate} is supported. */ + public final boolean GL_AMD_depth_clamp_separate; + /** When true, {@link AMDDrawBuffersBlend} is supported. */ + public final boolean GL_AMD_draw_buffers_blend; + /** When true, {@link AMDFramebufferMultisampleAdvanced} is supported. */ + public final boolean GL_AMD_framebuffer_multisample_advanced; + /** + * When true, the AMD_gcn_shader extension is supported. + * + *

    This extension exposes miscellaneous features of the AMD "Graphics Core Next" shader architecture that do not cleanly fit into other extensions + * and are not significant enough alone to warrant their own extensions. This includes cross-SIMD lane ballots, cube map query functions and a + * functionality to query the elapsed shader core time.

    + * + *

    Requires {@link #GL_AMD_gpu_shader_int64 AMD_gpu_shader_int64} or {@link #GL_NV_gpu_shader5 NV_gpu_shader5}.

    + */ + public final boolean GL_AMD_gcn_shader; + /** When true, {@link AMDGPUShaderHalfFloat} is supported. */ + public final boolean GL_AMD_gpu_shader_half_float; + /** When true, {@link AMDGPUShaderHalfFloatFetch} is supported. */ + public final boolean GL_AMD_gpu_shader_half_float_fetch; + /** + * When true, the AMD_gpu_shader_int16 extension is supported. + * + *

    This extension was developed to allow implementations supporting 16-bit integers to expose the feature in GLSL.

    + * + *

    The extension introduces the following features for all shader types:

    + * + *
      + *
    • new built-in functions to pack and unpack 32-bit integer types into a two-component 16-bit integer vector;
    • + *
    • new built-in functions to convert half-precision floating-point values to or from their 16-bit integer bit encodings;
    • + *
    • vector relational functions supporting comparisons of vectors of 16-bit integer types; and
    • + *
    • common functions abs, frexp, ldexp, sign, min, max, clamp, and mix supporting arguments of 16-bit integer types.
    • + *
    + * + *

    Requires GLSL 4.00.

    + */ + public final boolean GL_AMD_gpu_shader_int16; + /** When true, {@link AMDGPUShaderInt64} is supported. */ + public final boolean GL_AMD_gpu_shader_int64; + /** When true, {@link AMDInterleavedElements} is supported. */ + public final boolean GL_AMD_interleaved_elements; + /** When true, {@link AMDOcclusionQueryEvent} is supported. */ + public final boolean GL_AMD_occlusion_query_event; + /** When true, {@link AMDPerformanceMonitor} is supported. */ + public final boolean GL_AMD_performance_monitor; + /** When true, {@link AMDPinnedMemory} is supported. */ + public final boolean GL_AMD_pinned_memory; + /** When true, {@link AMDQueryBufferObject} is supported. */ + public final boolean GL_AMD_query_buffer_object; + /** When true, {@link AMDSamplePositions} is supported. */ + public final boolean GL_AMD_sample_positions; + /** When true, {@link AMDSeamlessCubemapPerTexture} is supported. */ + public final boolean GL_AMD_seamless_cubemap_per_texture; + /** + * When true, the AMD_shader_atomic_counter_ops extension is supported. + * + *

    This extension is written against the OpenGL 4.3 (core) specification and the GLSL 4.30.7 specification.

    + * + *

    Requires {@link GL42 OpenGL 4.2} or {@link #GL_ARB_shader_atomic_counters ARB_shader_atomic_counters}.

    + */ + public final boolean GL_AMD_shader_atomic_counter_ops; + /** + * When true, the AMD_shader_ballot extension is supported. + * + *

    The extensions {@code ARB_shader_group_vote} and {@code ARB_shader_ballot} introduced the concept of sub-groups and a set of operations that allow data + * exchange across shader invocations within a sub-group.

    + * + *

    This extension further extends the capabilities of these extensions with additional sub-group operations.

    + * + *

    Requires {@link #GL_ARB_shader_group_vote ARB_shader_group_vote}, {@link #GL_ARB_shader_ballot ARB_shader_ballot} and {@link ARBGPUShaderInt64 ARB_gpu_shader_int64} or {@link AMDGPUShaderInt64 AMD_gpu_shader_int64}.

    + */ + public final boolean GL_AMD_shader_ballot; + /** + * When true, the AMD_shader_explicit_vertex_parameter extension is supported. + * + *

    Unextended GLSL provides a set of fixed function interpolation modes and even those are limited to certain types of interpolants (for example, + * interpolation of integer and double isn't supported).

    + * + *

    This extension introduces new built-in functions allowing access to vertex parameters explicitly in the fragment shader. It also exposes barycentric + * coordinates as new built-in variables, which can be used to implement custom interpolation algorithms using shader code.

    + * + *

    Requires {@link GL20 OpenGL 2.0} or {@link ARBShaderObjects ARB_shader_objects}.

    + */ + public final boolean GL_AMD_shader_explicit_vertex_parameter; + /** + * When true, the AMD_shader_image_load_store_lod extension is supported. + * + *

    This extension was developed based on the {@link ARBShaderImageLoadStore ARB_shader_image_load_store} extension to allow implementations supporting loads and stores on mipmap + * texture images.

    + * + *

    Requires {@link GL40 OpenGL 4.0} and GLSL 4.00

    + */ + public final boolean GL_AMD_shader_image_load_store_lod; + /** + * When true, the AMD_shader_stencil_export extension is supported. + * + *

    In OpenGL, the stencil test is a powerful mechanism to selectively discard fragments based on the content of the stencil buffer. However, facilites to + * update the content of the stencil buffer are limited to operations such as incrementing the existing value, or overwriting with a fixed reference value.

    + * + *

    This extension provides a mechanism whereby a shader may generate the stencil reference value per invocation. When stencil testing is enabled, this + * allows the test to be performed against the value generated in the shader. When the stencil operation is set to {@link GL11#GL_REPLACE REPLACE}, this allows a value generated + * in the shader to be written to the stencil buffer directly.

    + * + *

    Requires {@link #GL_ARB_fragment_shader ARB_fragment_shader}.

    + */ + public final boolean GL_AMD_shader_stencil_export; + /** + * When true, the AMD_shader_trinary_minmax extension is supported. + * + *

    This extension introduces three new trinary built-in functions to the OpenGL Shading Languages. These functions allow the minimum, maximum or median of + * three inputs to be found with a single function call. These operations may be useful for sorting and filtering operations, for example. By explicitly + * performing a trinary operation with a single built-in function, shader compilers and optimizers may be able to generate better instruction sequences for + * perform sorting and other multi-input functions.

    + * + *

    Requires {@link GL20 OpenGL 2.0} or {@link #GL_ARB_shader_objects ARB_shader_objects}.

    + */ + public final boolean GL_AMD_shader_trinary_minmax; + /** When true, {@link AMDSparseTexture} is supported. */ + public final boolean GL_AMD_sparse_texture; + /** When true, {@link AMDStencilOperationExtended} is supported. */ + public final boolean GL_AMD_stencil_operation_extended; + /** + * When true, the AMD_texture_gather_bias_lod extension is supported. + * + *

    This extension was developed based on existing built-in texture gather functions to allow implementations supporting bias of implicit level of detail + * and explicit control of level of detail in texture gather operations.

    + */ + public final boolean GL_AMD_texture_gather_bias_lod; + /** + * When true, the AMD_texture_texture4 extension is supported. + * + *

    This extension adds new shading language built-in texture functions to the shading language.

    + * + *

    These texture functions may be used to access one component textures.

    + * + *

    The {@code texture4} built-in function returns a texture value derived from a 2x2 set of texels in the image array of level levelbase is selected. These + * texels are selected in the same way as when the value of {@link GL11#GL_TEXTURE_MIN_FILTER TEXTURE_MIN_FILTER} is {@link GL11#GL_LINEAR LINEAR}, but instead of these texels being filtered to generate the + * texture value, the R, G, B and A texture values are derived directly from these four texels.

    + */ + public final boolean GL_AMD_texture_texture4; + /** + * When true, the AMD_transform_feedback3_lines_triangles extension is supported. + * + *

    OpenGL 4.0 introduced the ability to record primitives into multiple output streams using transform feedback. However, the restriction that all streams + * must output {@link GL11#GL_POINT POINT} primitives when more than one output stream is active was also introduced. This extension simply removes that restriction, allowing + * the same set of primitives to be used with multiple transform feedback streams as with a single stream.

    + * + *

    Requires {@link GL40 OpenGL 4.0} or {@link ARBTransformFeedback3 ARB_transform_feedback3}.

    + */ + public final boolean GL_AMD_transform_feedback3_lines_triangles; + /** When true, {@link AMDTransformFeedback4} is supported. */ + public final boolean GL_AMD_transform_feedback4; + /** + * When true, the AMD_vertex_shader_layer extension is supported. + * + *

    The {@code gl_Layer} built-in shading language variable was introduced with the {@link #GL_ARB_geometry_shader4 ARB_geometry_shader4} extension and subsequently promoted to core + * OpenGL in version 3.2. This variable is an output from the geometry shader stage that allows rendering to be directed to a specific layer of an array + * texture, slice of a 3D texture or face of a cube map or cube map array attachment of the framebuffer. Thus, this extremely useful functionality is only + * available if a geometry shader is present - even if the geometry shader is not otherwise required by the application. This adds overhead to the graphics + * processing pipeline, and complexity to applications. It also precludes implementations that cannot support geometry shaders from supporting rendering to + * layered framebuffer attachments.

    + * + *

    This extension exposes the {@code gl_Layer} built-in variable in the vertex shader, allowing rendering to be directed to layered framebuffer attachments + * with only a vertex and fragment shader present. Combined with features such as instancing, or static vertex attributes and so on, this allows a wide + * variety of techniques to be implemented without the requirement for a geometry shader to be present.

    + * + *

    Requires {@link GL30 OpenGL 3.0} or {@link #GL_EXT_texture_array EXT_texture_array}.

    + */ + public final boolean GL_AMD_vertex_shader_layer; + /** When true, {@link AMDVertexShaderTessellator} is supported. */ + public final boolean GL_AMD_vertex_shader_tessellator; + /** + * When true, the AMD_vertex_shader_viewport_index extension is supported. + * + *

    The {@code gl_ViewportIndex} built-in variable was introduced by the {@link #GL_ARB_viewport_array ARB_viewport_array} extension and {@link GL41 OpenGL 4.1}. This variable is available + * in un-extended OpenGL only to the geometry shader. When written in the geometry shader, it causes geometry to be directed to one of an array of several + * independent viewport rectangles.

    + * + *

    In order to use any viewport other than zero, a geometry shader must be present. Geometry shaders introduce processing overhead and potential + * performance issues. This extension exposes the {@code gl_ViewportIndex} built-in variable to the vertex shader, allowing the functionality introduced by + * ARB_viewport_array to be accessed without requiring a geometry shader to be present.

    + * + *

    Requires {@link GL41 OpenGL 4.1} or {@link #GL_ARB_viewport_array ARB_viewport_array}.

    + */ + public final boolean GL_AMD_vertex_shader_viewport_index; + /** + * When true, the ARB_arrays_of_arrays extension is supported. + * + *

    This extension removes the restriction that arrays cannot be formed into arrays, allowing arrays of arrays to be declared.

    + * + *

    Requires GLSL 1.2. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ + public final boolean GL_ARB_arrays_of_arrays; + /** When true, {@link ARBBaseInstance} is supported. */ + public final boolean GL_ARB_base_instance; + /** When true, {@link ARBBindlessTexture} is supported. */ + public final boolean GL_ARB_bindless_texture; + /** When true, {@link ARBBlendFuncExtended} is supported. */ + public final boolean GL_ARB_blend_func_extended; + /** When true, {@link ARBBufferStorage} is supported. */ + public final boolean GL_ARB_buffer_storage; + /** When true, {@link ARBClearBufferObject} is supported. */ + public final boolean GL_ARB_clear_buffer_object; + /** When true, {@link ARBClearTexture} is supported. */ + public final boolean GL_ARB_clear_texture; + /** When true, {@link ARBClipControl} is supported. */ + public final boolean GL_ARB_clip_control; + /** When true, {@link ARBColorBufferFloat} is supported. */ + public final boolean GL_ARB_color_buffer_float; + /** + * When true, the ARB_compatibility extension is supported. + * + *

    This extension restores features deprecated by {@link GL30 OpenGL 3.0}.

    + */ + public final boolean GL_ARB_compatibility; + /** When true, {@link ARBCompressedTexturePixelStorage} is supported. */ + public final boolean GL_ARB_compressed_texture_pixel_storage; + /** When true, {@link ARBComputeShader} is supported. */ + public final boolean GL_ARB_compute_shader; + /** When true, {@link ARBComputeVariableGroupSize} is supported. */ + public final boolean GL_ARB_compute_variable_group_size; + /** When true, {@link ARBConditionalRenderInverted} is supported. */ + public final boolean GL_ARB_conditional_render_inverted; + /** + * When true, the ARB_conservative_depth extension is supported. + * + *

    There is a common optimization for hardware accelerated implementation of OpenGL which relies on an early depth test to be run before the fragment + * shader so that the shader evaluation can be skipped if the fragment ends up being discarded because it is occluded.

    + * + *

    This optimization does not affect the final rendering, and is typically possible when the fragment does not change the depth programmatically. (i.e.: it + * does not write to the built-in gl_FragDepth output). There are, however a class of operations on the depth in the shader which could still be performed + * while allowing the early depth test to operate.

    + * + *

    This extension allows the application to pass enough information to the GL implementation to activate such optimizations safely.

    + * + *

    Requires {@link GL30 OpenGL 3.0}. Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ + public final boolean GL_ARB_conservative_depth; + /** When true, {@link ARBCopyBuffer} is supported. */ + public final boolean GL_ARB_copy_buffer; + /** When true, {@link ARBCopyImage} is supported. */ + public final boolean GL_ARB_copy_image; + /** When true, {@link ARBCullDistance} is supported. */ + public final boolean GL_ARB_cull_distance; + /** When true, {@link ARBDebugOutput} is supported. */ + public final boolean GL_ARB_debug_output; + /** When true, {@link ARBDepthBufferFloat} is supported. */ + public final boolean GL_ARB_depth_buffer_float; + /** When true, {@link ARBDepthClamp} is supported. */ + public final boolean GL_ARB_depth_clamp; + /** When true, {@link ARBDepthTexture} is supported. */ + public final boolean GL_ARB_depth_texture; + /** + * When true, the ARB_derivative_control extension is supported. + * + *

    This extension provides control over the spacial granularity at which the underlying implementation computes derivatives.

    + * + *

    For example, for the coarse-granularity derivative, a single x derivative could be computed for each 2x2 group of pixels, using that same derivative + * value for all 4 pixels. For the fine-granularity derivative, two derivatives could be computed for each 2x2 group of pixels; one for the top row and one + * for the bottom row. Implementations vary somewhat on how this is done.

    + * + *

    To select the coarse derivative, use:

    + * + *
    
    +     * dFdxCoarse(p)
    +     * dFdyCoarse(p)
    +     * fwidthCoarse(p)
    + * + *

    To select the fine derivative, use:

    + * + *
    
    +     * dFdxFine(p)
    +     * dFdyFine(p)
    +     * fwidthFine(p)
    + * + *

    To select which ever is "better" (based on performance, API hints, or other factors), use:

    + * + *
    
    +     * dFdx(p)
    +     * dFdy(p)
    +     * fwidth(p)
    + * + *

    This last set is the set of previously existing built-ins for derivatives, and continues to work in a backward compatible way.

    + * + *

    Requires {@link GL40 OpenGL 4.0} and GLSL 4.00. Promoted to core in {@link GL45 OpenGL 4.5}.

    + */ + public final boolean GL_ARB_derivative_control; + /** When true, {@link ARBDirectStateAccess} is supported. */ + public final boolean GL_ARB_direct_state_access; + /** When true, {@link ARBDrawBuffers} is supported. */ + public final boolean GL_ARB_draw_buffers; + /** When true, {@link ARBDrawBuffersBlend} is supported. */ + public final boolean GL_ARB_draw_buffers_blend; + /** When true, {@link ARBDrawElementsBaseVertex} is supported. */ + public final boolean GL_ARB_draw_elements_base_vertex; + /** When true, {@link ARBDrawIndirect} is supported. */ + public final boolean GL_ARB_draw_indirect; + /** When true, {@link ARBDrawInstanced} is supported. */ + public final boolean GL_ARB_draw_instanced; + /** When true, {@link ARBEnhancedLayouts} is supported. */ + public final boolean GL_ARB_enhanced_layouts; + /** When true, {@link ARBES2Compatibility} is supported. */ + public final boolean GL_ARB_ES2_compatibility; + /** When true, {@link ARBES31Compatibility} is supported. */ + public final boolean GL_ARB_ES3_1_compatibility; + /** When true, {@link ARBES32Compatibility} is supported. */ + public final boolean GL_ARB_ES3_2_compatibility; + /** When true, {@link ARBES3Compatibility} is supported. */ + public final boolean GL_ARB_ES3_compatibility; + /** + * When true, the ARB_explicit_attrib_location extension is supported. + * + *

    This extension provides a method to pre-assign attribute locations to named vertex shader inputs and color numbers to named fragment shader outputs. + * This allows applications to globally assign a particular semantic meaning, such as diffuse color or vertex normal, to a particular attribute location + * without knowing how that attribute will be named in any particular shader.

    + * + *

    Requires {@link GL20 OpenGL 2.0} or {@link #GL_ARB_vertex_shader ARB_vertex_shader}. Promoted to core in {@link GL33 OpenGL 3.3}.

    + */ + public final boolean GL_ARB_explicit_attrib_location; + /** When true, {@link ARBExplicitUniformLocation} is supported. */ + public final boolean GL_ARB_explicit_uniform_location; + /** + * When true, the ARB_fragment_coord_conventions extension is supported. + * + *

    This extension provides alternative conventions for the fragment coordinate XY location available for programmable fragment processing.

    + * + *

    The scope of this extension deals *only* with how the fragment coordinate XY location appears during programming fragment processing. Beyond the scope + * of this extension are coordinate conventions used for rasterization or transformation.

    + * + *

    In the case of the coordinate conventions for rasterization and transformation, some combination of the viewport, depth range, culling state, and + * projection matrix state can be reconfigured to adopt other arbitrary clip-space and window-space coordinate space conventions. Adopting other clip-space + * and window-space conventions involves adjusting existing OpenGL state. However it is non-trivial to massage an arbitrary fragment shader or program to + * adopt a different window-space coordinate system because such shaders are encoded in various textual representations.

    + * + *

    The dominant 2D and 3D rendering APIs make two basic choices of convention when locating fragments in window space. The two choices are:

    + * + *
      + *
    1. Is the origin nearest the lower-left- or upper-left-most pixel of the window?
    2. + *
    3. Is the (x,y) location of the pixel nearest the origin at (0,0) or (0.5,0.5)?
    4. + *
    + * + *

    OpenGL assumes a lower-left origin for window coordinates and assumes pixel centers are located at half-pixel coordinates. This means the XY location + * (0.5,0.5) corresponds to the lower-left-most pixel in a window.

    + * + *

    Other window coordinate conventions exist for other rendering APIs. X11, GDI, and Direct3D version through DirectX 9 assume an upper-left window origin + * and locate pixel centers at integer XY values. By this alternative convention, the XY location (0,0) corresponds to the upper-left-most pixel in a window.

    + * + *

    Direct3D for DirectX 10 assumes an upper-left origin (as do prior DirectX versions) yet assumes half-pixel coordinates (unlike prior DirectX versions). + * By the DirectX 10 convention, the XY location (0.5,0.5) corresponds to the upper-left-most pixel in a window.

    + * + *

    Fragment shaders can directly access the location of a given processed fragment in window space. We call this location the "fragment coordinate".

    + * + *

    This extension provides a means for fragment shaders written in GLSL or OpenGL assembly extensions to specify alternative conventions for determining + * the fragment coordinate value accessed during programmable fragment processing.

    + * + *

    The motivation for this extension is to provide an easy, efficient means for fragment shaders accessing a fragment's window-space location to adopt the + * fragment coordinate convention for which the shader was originally written.

    + * + *

    Promoted to core in {@link GL32 OpenGL 3.2}.

    + */ + public final boolean GL_ARB_fragment_coord_conventions; + /** + * When true, the ARB_fragment_layer_viewport extension is supported. + * + *

    The geometry shader has the special built-in variables gl_Layer and gl_ViewportIndex that specify which layer and viewport primitives are rendered to. + * Currently the fragment shader does not know which layer or viewport the fragments are being written to without the application implementing their own + * interface variables between the geometry and fragment shaders.

    + * + *

    This extension specifies that the gl_Layer and gl_ViewportIndex built-in variables are also available to the fragment shader so the application doesn't + * need to implement these manually.

    + * + *

    Requires {@link GL30 OpenGL 3.0} and {@link #GL_ARB_geometry_shader4 ARB_geometry_shader4}, or {@link GL32 OpenGL 3.2}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ + public final boolean GL_ARB_fragment_layer_viewport; + /** When true, {@link ARBFragmentProgram} is supported. */ + public final boolean GL_ARB_fragment_program; + /** + * When true, the ARB_fragment_program_shadow extension is supported. + * + *

    This extension extends ARB_fragment_program to remove the interaction with ARB_shadow and defines the program option "ARB_fragment_program_shadow".

    + * + *

    Requires {@link #GL_ARB_fragment_program ARB_fragment_program} and {@link #GL_ARB_shadow ARB_shadow}.

    + */ + public final boolean GL_ARB_fragment_program_shadow; + /** When true, {@link ARBFragmentShader} is supported. */ + public final boolean GL_ARB_fragment_shader; + /** + * When true, the ARB_fragment_shader_interlock extension is supported. + * + *

    In unextended OpenGL 4.5, applications may produce a large number of fragment shader invocations that perform loads and stores to memory using image + * uniforms, atomic counter uniforms, buffer variables, or pointers. The order in which loads and stores to common addresses are performed by different + * fragment shader invocations is largely undefined. For algorithms that use shader writes and touch the same pixels more than once, one or more of the + * following techniques may be required to ensure proper execution ordering:

    + * + *
      + *
    • inserting Finish or WaitSync commands to drain the pipeline between different "passes" or "layers";
    • + *
    • using only atomic memory operations to write to shader memory (which may be relatively slow and limits how memory may be updated); or
    • + *
    • injecting spin loops into shaders to prevent multiple shader invocations from touching the same memory concurrently.
    • + *
    + * + *

    This extension provides new GLSL built-in functions beginInvocationInterlockARB() and endInvocationInterlockARB() that delimit a critical section of + * fragment shader code. For pairs of shader invocations with "overlapping" coverage in a given pixel, the OpenGL implementation will guarantee that the + * critical section of the fragment shader will be executed for only one fragment at a time.

    + * + *

    There are four different interlock modes supported by this extension, which are identified by layout qualifiers. The qualifiers + * "pixel_interlock_ordered" and "pixel_interlock_unordered" provides mutual exclusion in the critical section for any pair of fragments corresponding to + * the same pixel. When using multisampling, the qualifiers "sample_interlock_ordered" and "sample_interlock_unordered" only provide mutual exclusion for + * pairs of fragments that both cover at least one common sample in the same pixel; these are recommended for performance if shaders use per-sample data + * structures.

    + * + *

    Additionally, when the "pixel_interlock_ordered" or "sample_interlock_ordered" layout qualifier is used, the interlock also guarantees that the + * critical section for multiple shader invocations with "overlapping" coverage will be executed in the order in which the primitives were processed by + * the GL. Such a guarantee is useful for applications like blending in the fragment shader, where an application requires that fragment values to be + * composited in the framebuffer in primitive order.

    + * + *

    This extension can be useful for algorithms that need to access per-pixel data structures via shader loads and stores. Such algorithms using this + * extension can access such data structures in the critical section without worrying about other invocations for the same pixel accessing the data + * structures concurrently. Additionally, the ordering guarantees are useful for cases where the API ordering of fragments is meaningful. For example, + * applications may be able to execute programmable blending operations in the fragment shader, where the destination buffer is read via image loads and + * the final value is written via image stores.

    + * + *

    Requires {@link GL42 OpenGL 4.2} or {@link ARBShaderImageLoadStore ARB_shader_image_load_store}.

    + */ + public final boolean GL_ARB_fragment_shader_interlock; + /** When true, {@link ARBFramebufferNoAttachments} is supported. */ + public final boolean GL_ARB_framebuffer_no_attachments; + /** When true, {@link ARBFramebufferObject} is supported. */ + public final boolean GL_ARB_framebuffer_object; + /** When true, {@link ARBFramebufferSRGB} is supported. */ + public final boolean GL_ARB_framebuffer_sRGB; + /** When true, {@link ARBGeometryShader4} is supported. */ + public final boolean GL_ARB_geometry_shader4; + /** When true, {@link ARBGetProgramBinary} is supported. */ + public final boolean GL_ARB_get_program_binary; + /** When true, {@link ARBGetTextureSubImage} is supported. */ + public final boolean GL_ARB_get_texture_sub_image; + /** When true, {@link ARBGLSPIRV} is supported. */ + public final boolean GL_ARB_gl_spirv; + /** When true, {@link ARBGPUShader5} is supported. */ + public final boolean GL_ARB_gpu_shader5; + /** When true, {@link ARBGPUShaderFP64} is supported. */ + public final boolean GL_ARB_gpu_shader_fp64; + /** When true, {@link ARBGPUShaderInt64} is supported. */ + public final boolean GL_ARB_gpu_shader_int64; + /** When true, {@link ARBHalfFloatPixel} is supported. */ + public final boolean GL_ARB_half_float_pixel; + /** When true, {@link ARBHalfFloatVertex} is supported. */ + public final boolean GL_ARB_half_float_vertex; + /** When true, {@link ARBImaging} is supported. */ + public final boolean GL_ARB_imaging; + /** When true, {@link ARBIndirectParameters} is supported. */ + public final boolean GL_ARB_indirect_parameters; + /** When true, {@link ARBInstancedArrays} is supported. */ + public final boolean GL_ARB_instanced_arrays; + /** When true, {@link ARBInternalformatQuery} is supported. */ + public final boolean GL_ARB_internalformat_query; + /** When true, {@link ARBInternalformatQuery2} is supported. */ + public final boolean GL_ARB_internalformat_query2; + /** When true, {@link ARBInvalidateSubdata} is supported. */ + public final boolean GL_ARB_invalidate_subdata; + /** When true, {@link ARBMapBufferAlignment} is supported. */ + public final boolean GL_ARB_map_buffer_alignment; + /** When true, {@link ARBMapBufferRange} is supported. */ + public final boolean GL_ARB_map_buffer_range; + /** When true, {@link ARBMatrixPalette} is supported. */ + public final boolean GL_ARB_matrix_palette; + /** When true, {@link ARBMultiBind} is supported. */ + public final boolean GL_ARB_multi_bind; + /** When true, {@link ARBMultiDrawIndirect} is supported. */ + public final boolean GL_ARB_multi_draw_indirect; + /** When true, {@link ARBMultisample} is supported. */ + public final boolean GL_ARB_multisample; + /** When true, {@link ARBMultitexture} is supported. */ + public final boolean GL_ARB_multitexture; + /** When true, {@link ARBOcclusionQuery} is supported. */ + public final boolean GL_ARB_occlusion_query; + /** When true, {@link ARBOcclusionQuery2} is supported. */ + public final boolean GL_ARB_occlusion_query2; + /** When true, {@link ARBParallelShaderCompile} is supported. */ + public final boolean GL_ARB_parallel_shader_compile; + /** When true, {@link ARBPipelineStatisticsQuery} is supported. */ + public final boolean GL_ARB_pipeline_statistics_query; + /** When true, {@link ARBPixelBufferObject} is supported. */ + public final boolean GL_ARB_pixel_buffer_object; + /** When true, {@link ARBPointParameters} is supported. */ + public final boolean GL_ARB_point_parameters; + /** When true, {@link ARBPointSprite} is supported. */ + public final boolean GL_ARB_point_sprite; + /** When true, {@link ARBPolygonOffsetClamp} is supported. */ + public final boolean GL_ARB_polygon_offset_clamp; + /** + * When true, the ARB_post_depth_coverage extension is supported. + * + *

    This extension allows the fragment shader to control whether values in {@code gl_SampleMaskIn[]} reflect the coverage after application of the early + * depth and stencil tests. This feature can be enabled with the following layout qualifier in the fragment shader:

    + * + *
    
    +     *         layout(post_depth_coverage) in;
    + * + *

    Use of this feature implicitly enables early fragment tests.

    + */ + public final boolean GL_ARB_post_depth_coverage; + /** When true, {@link ARBProgramInterfaceQuery} is supported. */ + public final boolean GL_ARB_program_interface_query; + /** When true, {@link ARBProvokingVertex} is supported. */ + public final boolean GL_ARB_provoking_vertex; + /** When true, {@link ARBQueryBufferObject} is supported. */ + public final boolean GL_ARB_query_buffer_object; + /** + * When true, the ARB_robust_buffer_access_behavior extension is supported. + * + *

    This extension specifies the behavior of out-of-bounds buffer and array accesses. This is an improvement over the existing ARB_robustness extension + * which stated that the application should not crash, but the behavior is otherwise undefined. This extension specifies the access protection provided by + * the GL to ensure that out-of-bounds accesses cannot read from or write to data not owned by the application. All accesses are contained within the + * buffer object and program area they reference. These additional robustness guarantees apply to contexts created with the + * {@code CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB} feature enabled.

    + * + *

    Requires {@link ARBRobustness ARB_robustness}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ + public final boolean GL_ARB_robust_buffer_access_behavior; + /** When true, {@link ARBRobustness} is supported. */ + public final boolean GL_ARB_robustness; + /** + * When true, the ARB_robustness_application_isolation extension is supported. + * + *

    {@link ARBRobustness ARB_robustness} and supporting window system extensions allow creating an OpenGL context supporting graphics reset notification behavior. This + * extension provides stronger guarantees about the possible side-effects of a graphics reset.

    + * + *

    It is expected that there may be a performance cost associated with isolating an application or share group from other contexts on the GPU. For this + * reason, ARB_robustness_isolation is phrased as an opt-in mechanism, with a new context creation bit defined in the window system bindings. It is + * expected that implementations might only advertise the strings in this extension if both the implementation supports the desired isolation properties, + * and the context was created with the appropriate reset isolation bit.

    + * + *

    If the graphics driver advertises the {@code GL_ARB_robustness_application_isolation} extension string, then the driver guarantees that if a particular + * application causes a graphics reset to occur:

    + * + *
      + *
    1. No other application on the system is affected by the graphics reset.
    2. + *
    3. No other application on the system receives any notification that the graphics reset occurred.
    4. + *
    + * + *

    Requires {@link ARBRobustness ARB_robustness}. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ + public final boolean GL_ARB_robustness_application_isolation; + /** + * When true, the ARB_robustness_share_group_isolation extension is supported. + * + *

    See {@link #GL_ARB_robustness_application_isolation ARB_robustness_application_isolation}.

    + * + *

    If the graphics driver advertises the {@code GL_ARB_robustness_share_group_isolation} extension string, then the driver guarantees that if a context in + * a particular share group causes a graphics reset to occur:

    + * + *
      + *
    1. No other share group within the application is affected by the graphics reset. Additionally, no other application on the system is affected by the + * graphics reset.
    2. + *
    3. No other share group within the application receives any notification that the graphics reset occurred. Additionally, no other application on the + * system receives any notification that the graphics reset occurred.
    4. + *
    + */ + public final boolean GL_ARB_robustness_share_group_isolation; + /** When true, {@link ARBSampleLocations} is supported. */ + public final boolean GL_ARB_sample_locations; + /** When true, {@link ARBSampleShading} is supported. */ + public final boolean GL_ARB_sample_shading; + /** When true, {@link ARBSamplerObjects} is supported. */ + public final boolean GL_ARB_sampler_objects; + /** When true, {@link ARBSeamlessCubeMap} is supported. */ + public final boolean GL_ARB_seamless_cube_map; + /** When true, {@link ARBSeamlessCubemapPerTexture} is supported. */ + public final boolean GL_ARB_seamless_cubemap_per_texture; + /** When true, {@link ARBSeparateShaderObjects} is supported. */ + public final boolean GL_ARB_separate_shader_objects; + /** + * When true, the ARB_shader_atomic_counter_ops extension is supported. + * + *

    The {@link ARBShaderAtomicCounters ARB_shader_atomic_counters} extension introduced atomic counters, but it limits list of potential operations that can be performed on them + * to increment, decrement, and query. This extension extends the list of GLSL built-in functions that can operate on atomic counters. The list of new + * operations include:

    + * + *
      + *
    • Addition and subtraction
    • + *
    • Minimum and maximum
    • + *
    • Bitwise operators (AND, OR, XOR, etc.)
    • + *
    • Exchange, and compare and exchange operators
    • + *
    + * + *

    Requires {@link GL42 OpenGL 4.2} or {@link ARBShaderAtomicCounters ARB_shader_atomic_counters}.

    + */ + public final boolean GL_ARB_shader_atomic_counter_ops; + /** When true, {@link ARBShaderAtomicCounters} is supported. */ + public final boolean GL_ARB_shader_atomic_counters; + /** + * When true, the ARB_shader_ballot extension is supported. + * + *

    This extension provides the ability for a group of invocations which execute in lockstep to do limited forms of cross-invocation communication via a + * group broadcast of a invocation value, or broadcast of a bitarray representing a predicate value from each invocation in the group.

    + * + *

    Requires {@link ARBGPUShaderInt64 ARB_gpu_shader_int64}.

    + */ + public final boolean GL_ARB_shader_ballot; + /** + * When true, the ARB_shader_bit_encoding extension is supported. + * + *

    This extension trivially adds built-in functions for getting/setting the bit encoding for floating-point values in the OpenGL Shading Language.

    + * + *

    Promoted to core in {@link GL33 OpenGL 3.3}.

    + */ + public final boolean GL_ARB_shader_bit_encoding; + /** + * When true, the ARB_shader_clock extension is supported. + * + *

    This extension exposes a 64-bit monotonically incrementing shader counter which may be used to derive local timing information within a single shader + * invocation.

    + */ + public final boolean GL_ARB_shader_clock; + /** + * When true, the ARB_shader_draw_parameters extension is supported. + * + *

    In unextended GL, vertex shaders have inputs named {@code gl_VertexID} and {@code gl_InstanceID}, which contain, respectively the index of the vertex + * and instance. The value of {@code gl_VertexID} is the implicitly passed index of the vertex being processed, which includes the value of baseVertex, for + * those commands that accept it. Meanwhile, {@code gl_InstanceID} is the integer index of the current instance being processed, but, even for commands + * that accept a baseInstance parameter, it does not include the value of this argument. Furthermore, the equivalents to these variables in other graphics + * APIs do not necessarily follow these conventions. The reason for this inconsistency is that there are legitimate use cases for both inclusion and + * exclusion of the baseVertex or baseInstance parameters in {@code gl_VertexID} and {@code gl_InstanceID}, respectively.

    + * + *

    Rather than change the semantics of either built-in variable, this extension adds two new built-in variables to the GL shading language, + * {@code gl_BaseVertexARB} and {@code gl_BaseInstanceARB}, which contain the values passed in the baseVertex and baseInstance parameters, respectively. + * Shaders provided by the application may use these variables to offset {@code gl_VertexID} or {@code gl_InstanceID} if desired, or use them for any other + * purpose.

    + * + *

    Additionally, this extension adds a further built-in variable, {@code gl_DrawID} to the shading language. This variable contains the index of the draw + * currently being processed by a Multi* variant of a drawing command (such as {@link GL14C#glMultiDrawElements MultiDrawElements} or {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}).

    + * + *

    Requires {@link GL31 OpenGL 3.1}. Promoted to core in {@link GL33 OpenGL 3.3}.

    + */ + public final boolean GL_ARB_shader_draw_parameters; + /** + * When true, the ARB_shader_group_vote extension is supported. + * + *

    This extension provides new built-in functions to compute the composite of a set of boolean conditions across a group of shader invocations. These + * composite results may be used to execute shaders more efficiently on a single-instruction multiple-data (SIMD) processor. The set of shader invocations + * across which boolean conditions are evaluated is implementation-dependent, and this extension provides no guarantee over how individual shader + * invocations are assigned to such sets. In particular, the set of shader invocations has no necessary relationship with the compute shader local work + * group -- a pair of shader invocations in a single compute shader work group may end up in different sets used by these built-ins.

    + * + *

    Compute shaders operate on an explicitly specified group of threads (a local work group), but many implementations of OpenGL 4.3 will even group + * non-compute shader invocations and execute them in a SIMD fashion. When executing code like

    + * + *
    
    +     * if (condition) {
    +     *     result = do_fast_path();
    +     * } else {
    +     *     result = do_general_path();
    +     * }
    + * + *

    where {@code condition} diverges between invocations, a SIMD implementation might first call do_fast_path() for the invocations where {@code condition} + * is true and leave the other invocations dormant. Once do_fast_path() returns, it might call do_general_path() for invocations where {@code condition} is + * false and leave the other invocations dormant. In this case, the shader executes *both* the fast and the general path and might be better off just using + * the general path for all invocations.

    + * + *

    This extension provides the ability to avoid divergent execution by evaluting a condition across an entire SIMD invocation group using code like:

    + * + *
    
    +     * if (allInvocationsARB(condition)) {
    +     *     result = do_fast_path();
    +     * } else {
    +     *     result = do_general_path();
    +     * }
    + * + *

    The built-in function allInvocationsARB() will return the same value for all invocations in the group, so the group will either execute do_fast_path() + * or do_general_path(), but never both. For example, shader code might want to evaluate a complex function iteratively by starting with an approximation + * of the result and then refining the approximation. Some input values may require a small number of iterations to generate an accurate result + * (do_fast_path) while others require a larger number (do_general_path). In another example, shader code might want to evaluate a complex function + * (do_general_path) that can be greatly simplified when assuming a specific value for one of its inputs (do_fast_path).

    + * + *

    Requires {@link GL43 OpenGL 4.3} or {@link ARBComputeShader ARB_compute_shader}.

    + */ + public final boolean GL_ARB_shader_group_vote; + /** When true, {@link ARBShaderImageLoadStore} is supported. */ + public final boolean GL_ARB_shader_image_load_store; + /** + * When true, the ARB_shader_image_size extension is supported. + * + *

    This extension provides GLSL built-in functions allowing shaders to query the size of an image.

    + * + *

    Requires {@link GL42 OpenGL 4.2} and GLSL 4.20. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ + public final boolean GL_ARB_shader_image_size; + /** When true, {@link ARBShaderObjects} is supported. */ + public final boolean GL_ARB_shader_objects; + /** + * When true, the ARB_shader_precision extension is supported. + * + *

    This extension more clearly restricts the precision requirements of implementations of the GLSL specification. These include precision of arithmetic + * operations (operators '+', '/', ...), transcendentals (log, exp, pow, reciprocal sqrt, ...), when NaNs (not a number) and INFs (infinities) will be + * supported and generated, and denorm flushing behavior. Trigonometric built-ins and some other categories of built-ins are not addressed.

    + * + *

    Requires {@link GL40 OpenGL 4.0}. Promoted to core in {@link GL41 OpenGL 4.1}.

    + */ + public final boolean GL_ARB_shader_precision; + /** + * When true, the ARB_shader_stencil_export extension is supported. + * + *

    In OpenGL, the stencil test is a powerful mechanism to selectively discard fragments based on the content of the stencil buffer. However, facilites to + * update the content of the stencil buffer are limited to operations such as incrementing the existing value, or overwriting with a fixed reference value.

    + * + *

    This extension provides a mechanism whereby a shader may generate the stencil reference value per invocation. When stencil testing is enabled, this + * allows the test to be performed against the value generated in the shader. When the stencil operation is set to {@link GL11#GL_REPLACE REPLACE}, this allows a value generated + * in the shader to be written to the stencil buffer directly.

    + * + *

    Requires {@link #GL_ARB_fragment_shader ARB_fragment_shader}.

    + */ + public final boolean GL_ARB_shader_stencil_export; + /** When true, {@link ARBShaderStorageBufferObject} is supported. */ + public final boolean GL_ARB_shader_storage_buffer_object; + /** When true, {@link ARBShaderSubroutine} is supported. */ + public final boolean GL_ARB_shader_subroutine; + /** + * When true, the ARB_shader_texture_image_samples extension is supported. + * + *

    This extension provides GLSL built-in functions allowing shaders to query the number of samples of a texture.

    + * + *

    Requires GLSL 1.50 or {@link ARBTextureMultisample ARB_texture_multisample}.

    + */ + public final boolean GL_ARB_shader_texture_image_samples; + /** + * When true, the ARB_shader_texture_lod extension is supported. + * + *

    This extension adds additional texture functions to the OpenGL Shading Language which provide the shader writer with explicit control of LOD.

    + * + *

    Mipmap texture fetches and anisotropic texture fetches require an implicit derivatives to calculate rho, lambda and/or the line of anisotropy. These + * implicit derivatives will be undefined for texture fetches occurring inside non-uniform control flow or for vertex shader texture fetches, resulting in + * undefined texels.

    + * + *

    The additional texture functions introduced with this extension provide explict control of LOD (isotropic texture functions) or provide explicit + * derivatives (anisotropic texture functions).

    + * + *

    Anisotropic texture functions return defined texels for mipmap texture fetches or anisotropic texture fetches, even inside non-uniform control flow. + * Isotropic texture functions return defined texels for mipmap texture fetches, even inside non-uniform control flow. However, isotropic texture functions + * return undefined texels for anisotropic texture fetches.

    + * + *

    The existing isotropic vertex texture functions:

    + * + *
    
    +     * texture1DLod,   texture1DProjLod,
    +     * texture2DLod,   texture2DProjLod,
    +     * texture3DLod,   texture3DProjLod,
    +     * textureCubeLod,
    +     * shadow1DLod,    shadow1DProjLod,
    +     * shadow2DLod,    shadow2DProjLod
    + * + *

    are added to the built-in functions for fragment shaders.

    + * + *

    New anisotropic texture functions, providing explicit derivatives:

    + * + *
    
    +     * texture1DGradARB(
    +     *     sampler1D sampler,
    +     *     float P, float dPdx, float dPdy);
    +     * texture1DProjGradARB(
    +     *     sampler1D sampler,
    +     *     vec2 P, float dPdx, float dPdy);
    +     * texture1DProjGradARB(
    +     *     sampler1D sampler,
    +     *     vec4 P, float dPdx, float dPdy);
    +     * texture2DGradARB(
    +     *     sampler2D sampler,
    +     *     vec2 P, vec2 dPdx, vec2 dPdy);
    +     * texture2DProjGradARB(
    +     *     sampler2D sampler,
    +     *     vec3 P, vec2 dPdx, vec2 dPdy);
    +     * texture2DProjGradARB(
    +     *     sampler2D sampler,
    +     *     vec4 P, vec2 dPdx, vec2 dPdy);
    +     * texture3DGradARB(
    +     *     sampler3D sampler,
    +     *     vec3 P, vec3 dPdx, vec3 dPdy);
    +     * texture3DProjGradARB(
    +     *     sampler3D sampler,
    +     *     vec4 P, vec3 dPdx, vec3 dPdy);
    +     * textureCubeGradARB(
    +     *     samplerCube sampler,
    +     *     vec3 P, vec3 dPdx, vec3 dPdy);
    +     * 
    +     * shadow1DGradARB(
    +     *     sampler1DShadow sampler,
    +     *     vec3 P, float dPdx, float dPdy);
    +     * shadow1DProjGradARB(
    +     *     sampler1DShadow sampler,
    +     *     vec4 P, float dPdx, float dPdy);
    +     * shadow2DGradARB(
    +     *     sampler2DShadow sampler,
    +     *     vec3 P, vec2 dPdx, vec2 dPdy);
    +     * shadow2DProjGradARB(
    +     *     sampler2DShadow sampler,
    +     *     vec4 P, vec2 dPdx, vec2 dPdy);
    +     * 
    +     * texture2DRectGradARB(
    +     *     sampler2DRect sampler,
    +     *     vec2 P, vec2 dPdx, vec2 dPdy);
    +     * texture2DRectProjGradARB(
    +     *     sampler2DRect sampler,
    +     *     vec3 P, vec2 dPdx, vec2 dPdy);
    +     * texture2DRectProjGradARB(
    +     *     sampler2DRect sampler,
    +     *     vec4 P, vec2 dPdx, vec2 dPdy);
    +     * 
    +     * shadow2DRectGradARB(
    +     *     sampler2DRectShadow sampler,
    +     *     vec3 P, vec2 dPdx, vec2 dPdy);
    +     * shadow2DRectProjGradARB(
    +     *     sampler2DRectShadow sampler,
    +     *     vec4 P, vec2 dPdx, vec2 dPdy);
    + * + *

    are added to the built-in functions for vertex shaders and fragment shaders.

    + * + *

    Requires {@link #GL_ARB_shader_objects ARB_shader_objects}. Promoted to core in {@link GL30 OpenGL 3.0}.

    + */ + public final boolean GL_ARB_shader_texture_lod; + /** + * When true, the ARB_shader_viewport_layer_array extension is supported. + * + *

    The gl_ViewportIndex and gl_Layer built-in variables were introduced by the in OpenGL 4.1. These variables are available in un-extended OpenGL only to + * the geometry shader. When written in the geometry shader, they cause geometry to be directed to one of an array of several independent viewport + * rectangles or framebuffer attachment layers, respectively.

    + * + *

    In order to use any viewport or attachment layer other than zero, a geometry shader must be present. Geometry shaders introduce processing overhead and + * potential performance issues. The AMD_vertex_shader_layer and AMD_vertex_shader_viewport_index extensions allowed the gl_Layer and gl_ViewportIndex + * outputs to be written directly from the vertex shader with no geometry shader present.

    + * + *

    This extension effectively merges the AMD_vertex_shader_layer and AMD_vertex_shader_viewport_index extensions together and extends them further to + * allow both outputs to be written from tessellation evaluation shaders.

    + * + *

    Requires {@link GL41 OpenGL 4.1}.

    + */ + public final boolean GL_ARB_shader_viewport_layer_array; + /** When true, {@link ARBShadingLanguage100} is supported. */ + public final boolean GL_ARB_shading_language_100; + /** + * When true, the ARB_shading_language_420pack extension is supported. + * + *

    This is a language feature only extension formed from changes made to version 4.20 of GLSL. It includes:

    + * + *
      + *
    • Add line-continuation using '', as in C++.
    • + *
    • Change from ASCII to UTF-8 for the language character set and also allow any characters inside comments.
    • + *
    • Allow implicit conversions of return values to the declared type of the function.
    • + *
    • The *const* keyword can be used to declare variables within a function body with initializer expressions that are not constant expressions.
    • + *
    • Qualifiers on variable declarations no longer have to follow a strict order. The layout qualifier can be used multiple times, and multiple parameter + * qualifiers can be used. However, this is not as straightforward as saying declarations have arbitrary lists of initializers. Typically, one + * qualifier from each class of qualifiers is allowed, so care is now taken to classify them and say so. Then, of these, order restrictions are removed.
    • + *
    • Add layout qualifier identifier "binding" to bind the location of a uniform block. This requires version 1.4 of GLSL. If this extension is used with + * an earlier version than 1.4, this feature is not present.
    • + *
    • Add layout qualifier identifier "binding" to bind units to sampler and image variable declarations.
    • + *
    • Add C-style curly brace initializer lists syntax for initializers. Full initialization of aggregates is required when these are used.
    • + *
    • Allow ".length()" to be applied to vectors and matrices, returning the number of components or columns.
    • + *
    • Allow swizzle operations on scalars.
    • + *
    • Built-in constants for {@code gl_MinProgramTexelOffset} and {@code gl_MaxProgramTexelOffset}.
    • + *
    + * + *

    Requires GLSL 1.30. Requires GLSL 1.40 for uniform block bindings. Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ + public final boolean GL_ARB_shading_language_420pack; + /** When true, {@link ARBShadingLanguageInclude} is supported. */ + public final boolean GL_ARB_shading_language_include; + /** + * When true, the ARB_shading_language_packing extension is supported. + * + *

    This extension provides the GLSL built-in functions to convert a 32-bit unsigned integer holding a pair of 16-bit floating-point values to or from a + * two-component floating-point vector (vec2).

    + * + *

    This mechanism allows GLSL shaders to read and write 16-bit floating-point encodings (via 32-bit unsigned integers) without introducing a full set of + * 16-bit floating-point data types.

    + * + *

    This extension also adds the GLSL built-in packing functions included in GLSL version 4.00 and the ARB_gpu_shader5 extension which pack and unpack + * vectors of small fixed-point data types into a larger scalar. By putting these packing functions in this separate extension it allows implementations to + * provide these functions in hardware that supports them independent of the other {@link #GL_ARB_gpu_shader5 ARB_gpu_shader5} features.

    + * + *

    In addition to the packing functions from ARB_gpu_shader5 this extension also adds the missing {@code [un]packSnorm2x16} for completeness.

    + * + *

    Promoted to core in {@link GL42 OpenGL 4.2}.

    + */ + public final boolean GL_ARB_shading_language_packing; + /** When true, {@link ARBShadow} is supported. */ + public final boolean GL_ARB_shadow; + /** When true, {@link ARBShadowAmbient} is supported. */ + public final boolean GL_ARB_shadow_ambient; + /** When true, {@link ARBSparseBuffer} is supported. */ + public final boolean GL_ARB_sparse_buffer; + /** When true, {@link ARBSparseTexture} is supported. */ + public final boolean GL_ARB_sparse_texture; + /** + * When true, the ARB_sparse_texture2 extension is supported. + * + *

    This extension builds on the {@link ARBSparseTexture ARB_sparse_texture} extension, providing the following new functionality:

    + * + *
      + *
    • New built-in GLSL texture lookup and image load functions are provided that return information on whether the texels accessed for the texture + * lookup accessed uncommitted texture memory.
    • + *
    • New built-in GLSL texture lookup functions are provided that specify a minimum level of detail to use for lookups where the level of detail is + * computed automatically. This allows shaders to avoid accessing unpopulated portions of high-resolution levels of detail when it knows that the + * memory accessed is unpopulated, either from a priori knowledge or from feedback provided by the return value of previously executed "sparse" + * texture lookup functions.
    • + *
    • Reads of uncommitted texture memory will act as though such memory were filled with zeroes; previously, the values returned by reads were + * undefined.
    • + *
    • Standard implementation-independent virtual page sizes for internal formats required to be supported with sparse textures. These standard sizes can + * be requested by leaving {@link ARBSparseTexture#GL_VIRTUAL_PAGE_SIZE_INDEX_ARB VIRTUAL_PAGE_SIZE_INDEX_ARB} at its initial value (0).
    • + *
    • Support for creating sparse multisample and multisample array textures is added. However, the virtual page sizes for such textures remain fully + * implementation-dependent.
    • + *
    + * + *

    Requires {@link ARBSparseTexture ARB_sparse_texture}

    + */ + public final boolean GL_ARB_sparse_texture2; + /** + * When true, the ARB_sparse_texture_clamp extension is supported. + * + *

    This extension builds on the {@link #GL_ARB_sparse_texture2 ARB_sparse_texture2} extension, providing the following new functionality:

    + * + *

    New built-in GLSL texture lookup functions are provided that specify a minimum level of detail to use for lookups where the level of detail is + * computed automatically. This allows shaders to avoid accessing unpopulated portions of high-resolution levels of detail when it knows that the memory + * accessed is unpopulated, either from a priori knowledge or from feedback provided by the return value of previously executed "sparse" texture lookup + * functions.

    + * + *

    Requires {@link #GL_ARB_sparse_texture2 ARB_sparse_texture2}

    + */ + public final boolean GL_ARB_sparse_texture_clamp; + /** When true, {@link ARBSPIRVExtensions} is supported. */ + public final boolean GL_ARB_spirv_extensions; + /** When true, {@link ARBStencilTexturing} is supported. */ + public final boolean GL_ARB_stencil_texturing; + /** When true, {@link ARBSync} is supported. */ + public final boolean GL_ARB_sync; + /** When true, {@link ARBTessellationShader} is supported. */ + public final boolean GL_ARB_tessellation_shader; + /** When true, {@link ARBTextureBarrier} is supported. */ + public final boolean GL_ARB_texture_barrier; + /** When true, {@link ARBTextureBorderClamp} is supported. */ + public final boolean GL_ARB_texture_border_clamp; + /** When true, {@link ARBTextureBufferObject} is supported. */ + public final boolean GL_ARB_texture_buffer_object; + /** + * When true, the ARB_texture_buffer_object_rgb32 extension is supported. + * + *

    This extension adds three new buffer texture formats - RGB32F, RGB32I, and RGB32UI. This partially addresses one of the limitations of buffer textures + * in the original {@link #GL_EXT_texture_buffer_object EXT_texture_buffer_object} extension and in {@link GL31 OpenGL 3.1}, which provide no support for three-component formats.

    + * + *

    Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ + public final boolean GL_ARB_texture_buffer_object_rgb32; + /** When true, {@link ARBTextureBufferRange} is supported. */ + public final boolean GL_ARB_texture_buffer_range; + /** When true, {@link ARBTextureCompression} is supported. */ + public final boolean GL_ARB_texture_compression; + /** When true, {@link ARBTextureCompressionBPTC} is supported. */ + public final boolean GL_ARB_texture_compression_bptc; + /** When true, {@link ARBTextureCompressionRGTC} is supported. */ + public final boolean GL_ARB_texture_compression_rgtc; + /** When true, {@link ARBTextureCubeMap} is supported. */ + public final boolean GL_ARB_texture_cube_map; + /** When true, {@link ARBTextureCubeMapArray} is supported. */ + public final boolean GL_ARB_texture_cube_map_array; + /** + * When true, the ARB_texture_env_add extension is supported. + * + *

    This extension adds a new texture environment function: ADD.

    + * + *

    Promoted to core in {@link GL13 OpenGL 1.3}.

    + */ + public final boolean GL_ARB_texture_env_add; + /** When true, {@link ARBTextureEnvCombine} is supported. */ + public final boolean GL_ARB_texture_env_combine; + /** + * When true, the ARB_texture_env_crossbar extension is supported. + * + *

    This extension adds the capability to use the texture color from other texture units as sources to the {@link ARBTextureEnvCombine#GL_COMBINE_ARB COMBINE_ARB} environment + * function. The {@link ARBTextureEnvCombine ARB_texture_env_combine} extension defined texture environment functions which could use the color from the current texture unit + * as a source. This extension adds the ability to use the color from any texture unit as a source.

    + * + *

    Requires {@link #GL_ARB_multitexture ARB_multitexture} and {@link ARBTextureEnvCombine ARB_texture_env_combine}. Promoted to core in {@link GL14 OpenGL 1.4}.

    + */ + public final boolean GL_ARB_texture_env_crossbar; + /** When true, {@link ARBTextureEnvDot3} is supported. */ + public final boolean GL_ARB_texture_env_dot3; + /** When true, {@link ARBTextureFilterAnisotropic} is supported. */ + public final boolean GL_ARB_texture_filter_anisotropic; + /** When true, {@link ARBTextureFilterMinmax} is supported. */ + public final boolean GL_ARB_texture_filter_minmax; + /** When true, {@link ARBTextureFloat} is supported. */ + public final boolean GL_ARB_texture_float; + /** When true, {@link ARBTextureGather} is supported. */ + public final boolean GL_ARB_texture_gather; + /** When true, {@link ARBTextureMirrorClampToEdge} is supported. */ + public final boolean GL_ARB_texture_mirror_clamp_to_edge; + /** When true, {@link ARBTextureMirroredRepeat} is supported. */ + public final boolean GL_ARB_texture_mirrored_repeat; + /** When true, {@link ARBTextureMultisample} is supported. */ + public final boolean GL_ARB_texture_multisample; + /** + * When true, the ARB_texture_non_power_of_two extension is supported. + * + *

    Conventional OpenGL texturing is limited to images with power-of-two dimensions and an optional 1-texel border. This extension relaxes the size + * restrictions for the 1D, 2D, cube map, and 3D texture targets.

    + * + *

    Promoted to core in {@link GL20 OpenGL 2.0}.

    + */ + public final boolean GL_ARB_texture_non_power_of_two; + /** + * When true, the ARB_texture_query_levels extension is supported. + * + *

    This extension provides a new set of texture functions ({@code textureQueryLevels}) in the OpenGL Shading Language that exposes the number of accessible + * mipmap levels in the texture associated with a GLSL sampler variable. The set of accessible levels includes all the levels of the texture defined either + * through TexImage*, TexStorage*, or TextureView* ({@link ARBTextureView ARB_texture_view}) APIs that are not below the {@link GL12#GL_TEXTURE_BASE_LEVEL TEXTURE_BASE_LEVEL} or above the + * {@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL} parameters. For textures defined with TexImage*, the set of resident levels is somewhat implementation-dependent. For fully + * defined results, applications should use TexStorage*/TextureView unless the texture has a full mipmap chain and is used with a mipmapped minification + * filter.

    + * + *

    These functions means that shaders are not required to manually recompute, approximate, or maintain a uniform holding a pre-computed level count, since + * the true level count is already available to the implementation. This value can be used to avoid black or leaking pixel artifacts for rendering methods + * which are using texture images as memory pages (eg: virtual textures); methods that can't only rely on the fixed pipeline texture functions which take + * advantage of {@link GL12#GL_TEXTURE_MAX_LEVEL TEXTURE_MAX_LEVEL} for their sampling.

    + * + *

    Requires {@link GL30 OpenGL 3.0} and GLSL 1.30. Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ + public final boolean GL_ARB_texture_query_levels; + /** + * When true, the ARB_texture_query_lod extension is supported. + * + *

    This extension provides a new set of fragment shader texture functions ({@code textureLOD}) that return the results of automatic level-of-detail + * computations that would be performed if a texture lookup were performed.

    + * + *

    Requires {@link GL20 OpenGL 2.0}, {@link #GL_EXT_gpu_shader4 EXT_gpu_shader4}, {@link #GL_EXT_texture_array EXT_texture_array} and GLSL 1.30. Promoted to core in {@link GL40 OpenGL 4.0}.

    + */ + public final boolean GL_ARB_texture_query_lod; + /** When true, {@link ARBTextureRectangle} is supported. */ + public final boolean GL_ARB_texture_rectangle; + /** When true, {@link ARBTextureRG} is supported. */ + public final boolean GL_ARB_texture_rg; + /** When true, {@link ARBTextureRGB10_A2UI} is supported. */ + public final boolean GL_ARB_texture_rgb10_a2ui; + /** + * When true, the ARB_texture_stencil8 extension is supported. + * + *

    This extension accepts {@link GL30#GL_STENCIL_INDEX8 STENCIL_INDEX8} as a texture internal format, and adds STENCIL_INDEX8 to the required internal format list. This removes the + * need to use renderbuffers if a stencil-only format is desired.

    + * + *

    Promoted to core in {@link GL44 OpenGL 4.4}.

    + */ + public final boolean GL_ARB_texture_stencil8; + /** When true, {@link ARBTextureStorage} is supported. */ + public final boolean GL_ARB_texture_storage; + /** When true, {@link ARBTextureStorageMultisample} is supported. */ + public final boolean GL_ARB_texture_storage_multisample; + /** When true, {@link ARBTextureSwizzle} is supported. */ + public final boolean GL_ARB_texture_swizzle; + /** When true, {@link ARBTextureView} is supported. */ + public final boolean GL_ARB_texture_view; + /** When true, {@link ARBTimerQuery} is supported. */ + public final boolean GL_ARB_timer_query; + /** When true, {@link ARBTransformFeedback2} is supported. */ + public final boolean GL_ARB_transform_feedback2; + /** When true, {@link ARBTransformFeedback3} is supported. */ + public final boolean GL_ARB_transform_feedback3; + /** When true, {@link ARBTransformFeedbackInstanced} is supported. */ + public final boolean GL_ARB_transform_feedback_instanced; + /** When true, {@link ARBTransformFeedbackOverflowQuery} is supported. */ + public final boolean GL_ARB_transform_feedback_overflow_query; + /** When true, {@link ARBTransposeMatrix} is supported. */ + public final boolean GL_ARB_transpose_matrix; + /** When true, {@link ARBUniformBufferObject} is supported. */ + public final boolean GL_ARB_uniform_buffer_object; + /** When true, {@link ARBVertexArrayBGRA} is supported. */ + public final boolean GL_ARB_vertex_array_bgra; + /** When true, {@link ARBVertexArrayObject} is supported. */ + public final boolean GL_ARB_vertex_array_object; + /** When true, {@link ARBVertexAttrib64Bit} is supported. */ + public final boolean GL_ARB_vertex_attrib_64bit; + /** When true, {@link ARBVertexAttribBinding} is supported. */ + public final boolean GL_ARB_vertex_attrib_binding; + /** When true, {@link ARBVertexBlend} is supported. */ + public final boolean GL_ARB_vertex_blend; + /** When true, {@link ARBVertexBufferObject} is supported. */ + public final boolean GL_ARB_vertex_buffer_object; + /** When true, {@link ARBVertexProgram} is supported. */ + public final boolean GL_ARB_vertex_program; + /** When true, {@link ARBVertexShader} is supported. */ + public final boolean GL_ARB_vertex_shader; + /** + * When true, the ARB_vertex_type_10f_11f_11f_rev extension is supported. + * + *

    This extension a new vertex attribute data format: a packed 11.11.10 unsigned float vertex data format. This vertex data format can be used to describe + * a compressed 3 component stream of values that can be represented by 10- or 11-bit unsigned floating point values.

    + * + *

    The {@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV} vertex attribute type is equivalent to the {@link GL30#GL_R11F_G11F_B10F R11F_G11F_B10F} texture internal format.

    + * + *

    Requires {@link GL30 OpenGL 3.0} and {@link ARBVertexType2_10_10_10_REV ARB_vertex_type_2_10_10_10_rev}. Promoted to core in {@link GL44 OpenGL 4.4}.

    + */ + public final boolean GL_ARB_vertex_type_10f_11f_11f_rev; + /** When true, {@link ARBVertexType2_10_10_10_REV} is supported. */ + public final boolean GL_ARB_vertex_type_2_10_10_10_rev; + /** When true, {@link ARBViewportArray} is supported. */ + public final boolean GL_ARB_viewport_array; + /** When true, {@link ARBWindowPos} is supported. */ + public final boolean GL_ARB_window_pos; + /** When true, {@link ATIMeminfo} is supported. */ + public final boolean GL_ATI_meminfo; + /** When true, the ATI_shader_texture_lod extension is supported. */ + public final boolean GL_ATI_shader_texture_lod; + /** When true, {@link ATITextureCompression3DC} is supported. */ + public final boolean GL_ATI_texture_compression_3dc; + /** When true, {@link EXT422Pixels} is supported. */ + public final boolean GL_EXT_422_pixels; + /** When true, {@link EXTABGR} is supported. */ + public final boolean GL_EXT_abgr; + /** When true, {@link EXTBGRA} is supported. */ + public final boolean GL_EXT_bgra; + /** When true, {@link EXTBindableUniform} is supported. */ + public final boolean GL_EXT_bindable_uniform; + /** When true, {@link EXTBlendColor} is supported. */ + public final boolean GL_EXT_blend_color; + /** When true, {@link EXTBlendEquationSeparate} is supported. */ + public final boolean GL_EXT_blend_equation_separate; + /** When true, {@link EXTBlendFuncSeparate} is supported. */ + public final boolean GL_EXT_blend_func_separate; + /** When true, {@link EXTBlendMinmax} is supported. */ + public final boolean GL_EXT_blend_minmax; + /** When true, {@link EXTBlendSubtract} is supported. */ + public final boolean GL_EXT_blend_subtract; + /** When true, {@link EXTClipVolumeHint} is supported. */ + public final boolean GL_EXT_clip_volume_hint; + /** When true, {@link EXTCompiledVertexArray} is supported. */ + public final boolean GL_EXT_compiled_vertex_array; + /** When true, {@link EXTDebugLabel} is supported. */ + public final boolean GL_EXT_debug_label; + /** When true, {@link EXTDebugMarker} is supported. */ + public final boolean GL_EXT_debug_marker; + /** When true, {@link EXTDepthBoundsTest} is supported. */ + public final boolean GL_EXT_depth_bounds_test; + /** When true, {@link EXTDirectStateAccess} is supported. */ + public final boolean GL_EXT_direct_state_access; + /** When true, {@link EXTDrawBuffers2} is supported. */ + public final boolean GL_EXT_draw_buffers2; + /** When true, {@link EXTDrawInstanced} is supported. */ + public final boolean GL_EXT_draw_instanced; + /** When true, {@link EXTEGLImageStorage} is supported. */ + public final boolean GL_EXT_EGL_image_storage; + /** + * When true, the EXT_EGL_sync extension is supported. + * + *

    This extension extends {@code EGL_KHR_fence_sync} with client API support for OpenGL (compatibility or core profiles) as an EXT extension.

    + * + *

    The {@code "GL_EXT_EGL_sync"} string indicates that a fence sync object can be created in association with a fence command placed in the command stream + * of a bound OpenGL context.

    + */ + public final boolean GL_EXT_EGL_sync; + /** When true, {@link EXTExternalBuffer} is supported. */ + public final boolean GL_EXT_external_buffer; + /** When true, {@link EXTFramebufferBlit} is supported. */ + public final boolean GL_EXT_framebuffer_blit; + /** When true, {@link EXTFramebufferBlitLayers} is supported. */ + public final boolean GL_EXT_framebuffer_blit_layers; + /** When true, {@link EXTFramebufferMultisample} is supported. */ + public final boolean GL_EXT_framebuffer_multisample; + /** When true, {@link EXTFramebufferMultisampleBlitScaled} is supported. */ + public final boolean GL_EXT_framebuffer_multisample_blit_scaled; + /** When true, {@link EXTFramebufferObject} is supported. */ + public final boolean GL_EXT_framebuffer_object; + /** When true, {@link EXTFramebufferSRGB} is supported. */ + public final boolean GL_EXT_framebuffer_sRGB; + /** When true, {@link EXTGeometryShader4} is supported. */ + public final boolean GL_EXT_geometry_shader4; + /** When true, {@link EXTGPUProgramParameters} is supported. */ + public final boolean GL_EXT_gpu_program_parameters; + /** When true, {@link EXTGPUShader4} is supported. */ + public final boolean GL_EXT_gpu_shader4; + /** When true, {@link EXTMemoryObject} is supported. */ + public final boolean GL_EXT_memory_object; + /** When true, {@link EXTMemoryObjectFD} is supported. */ + public final boolean GL_EXT_memory_object_fd; + /** When true, {@link EXTMemoryObjectWin32} is supported. */ + public final boolean GL_EXT_memory_object_win32; + /** + * When true, the EXT_multiview_tessellation_geometry_shader extension is supported. + * + *

    This extension removes one of the limitations of the {@code OVR_multiview} extension by allowing the use of tessellation control, tessellation + * evaluation, and geometry shaders during multiview rendering. {@code OVR_multiview} by itself forbids the use of any of these shader types.

    + * + *

    When using tessellation control, tessellation evaluation, and geometry shaders during multiview rendering, any such shader must use the + * "{@code num_views}" layout qualifier provided by the matching shading language extension to specify a view count. The view count specified in these + * shaders must match the count specified in the vertex shader. Additionally, the shading language extension allows these shaders to use the + * {@code gl_ViewID_OVR} built-in to handle tessellation or geometry shader processing differently for each view.

    + * + *

    {@code OVR_multiview2} extends {@code OVR_multiview} by allowing view-dependent values for any vertex attributes instead of just the position. This new + * extension does not imply the availability of {@code OVR_multiview2}, but if both are available, view-dependent values for any vertex attributes are + * also allowed in tessellation control, tessellation evaluation, and geometry shaders.

    + * + *

    Requires {@link GL40 OpenGL 4.0} and {@link OVRMultiview OVR_multiview}.

    + */ + public final boolean GL_EXT_multiview_tessellation_geometry_shader; + /** + * When true, the EXT_multiview_texture_multisample extension is supported. + * + *

    This extension removes one of the limitations of the {@code OVR_multiview} extension by allowing the use of multisample textures during multiview + * rendering.

    + * + *

    This is one of two extensions that allow multisampling when using {@code OVR_multiview}. Each supports one of the two different approaches to + * multisampling in OpenGL:

    + * + *

    Core OpenGL has explicit support for multisample texture types, such as {@link GL32#GL_TEXTURE_2D_MULTISAMPLE TEXTURE_2D_MULTISAMPLE}. Applications can access the values of individual + * samples and can explicitly "resolve" the samples of each pixel down to a single color.

    + * + *

    The extension {@code EXT_multisampled_render_to_texture} provides support for multisampled rendering to non-multisample texture types, such as + * {@link GL11#GL_TEXTURE_2D TEXTURE_2D}. The individual samples for each pixel are maintained internally by the implementation and can not be accessed directly by applications. + * These samples are eventually resolved implicitly to a single color for each pixel.

    + * + *

    This extension supports the first multisampling style with multiview rendering; the {@code OVR_multiview_multisampled_render_to_texture} extension + * supports the second style. Note that support for one of these multiview extensions does not imply support for the other.

    + * + *

    Requires {@link GL40 OpenGL 4.0} and {@link OVRMultiview OVR_multiview}.

    + */ + public final boolean GL_EXT_multiview_texture_multisample; + /** + * When true, the EXT_multiview_timer_query extension is supported. + * + *

    This extension removes one of the limitations of the {@code OVR_multiview} extension by allowing the use of timer queries during multiview rendering. + * {@code OVR_multiview} does not specify defined behavior for such usage.

    + * + *

    Requires {@link GL40 OpenGL 4.0} and {@link OVRMultiview OVR_multiview}.

    + */ + public final boolean GL_EXT_multiview_timer_query; + /** When true, {@link EXTPackedDepthStencil} is supported. */ + public final boolean GL_EXT_packed_depth_stencil; + /** When true, {@link EXTPackedFloat} is supported. */ + public final boolean GL_EXT_packed_float; + /** When true, {@link EXTPixelBufferObject} is supported. */ + public final boolean GL_EXT_pixel_buffer_object; + /** When true, {@link EXTPointParameters} is supported. */ + public final boolean GL_EXT_point_parameters; + /** When true, {@link EXTPolygonOffsetClamp} is supported. */ + public final boolean GL_EXT_polygon_offset_clamp; + /** + * When true, the EXT_post_depth_coverage extension is supported. + * + *

    This extension allows the fragment shader to control whether values in {@code gl_SampleMaskIn[]} reflect the coverage after application of the early + * depth and stencil tests. This feature can be enabled with the following layout qualifier in the fragment shader:

    + * + *
    
    +     * layout(post_depth_coverage) in;
    + * + *

    To use this feature, early fragment tests must also be enabled in the fragment shader via:

    + * + *
    
    +     * layout(early_fragment_tests) in;
    + */ + public final boolean GL_EXT_post_depth_coverage; + /** When true, {@link EXTProvokingVertex} is supported. */ + public final boolean GL_EXT_provoking_vertex; + /** When true, {@link EXTRasterMultisample} is supported. */ + public final boolean GL_EXT_raster_multisample; + /** When true, {@link EXTSecondaryColor} is supported. */ + public final boolean GL_EXT_secondary_color; + /** When true, {@link EXTSemaphore} is supported. */ + public final boolean GL_EXT_semaphore; + /** When true, {@link EXTSemaphoreFD} is supported. */ + public final boolean GL_EXT_semaphore_fd; + /** When true, {@link EXTSemaphoreWin32} is supported. */ + public final boolean GL_EXT_semaphore_win32; + /** When true, {@link EXTSeparateShaderObjects} is supported. */ + public final boolean GL_EXT_separate_shader_objects; + /** When true, {@link EXTShaderFramebufferFetch} is supported. */ + public final boolean GL_EXT_shader_framebuffer_fetch; + /** When true, {@link EXTShaderFramebufferFetchNonCoherent} is supported. */ + public final boolean GL_EXT_shader_framebuffer_fetch_non_coherent; + /** + * When true, the EXT_shader_image_load_formatted extension is supported. + * + *

    {@link ARBShaderImageLoadStore ARB_shader_image_load_store} (and OpenGL 4.2) added support for random access load and store from/to texture images, but due to hardware + * limitations, loads were required to declare the image format in the shader source. This extension relaxes that requirement, and the return values from + * {@code imageLoad} can be format-converted based on the format of the image binding.

    + */ + public final boolean GL_EXT_shader_image_load_formatted; + /** When true, {@link EXTShaderImageLoadStore} is supported. */ + public final boolean GL_EXT_shader_image_load_store; + /** + * When true, the EXT_shader_integer_mix extension is supported. + * + *

    GLSL 1.30 (and GLSL ES 3.00) expanded the mix() built-in function to operate on a boolean third argument that does not interpolate but selects. This + * extension extends mix() to select between int, uint, and bool components.

    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ + public final boolean GL_EXT_shader_integer_mix; + /** + * When true, the EXT_shader_samples_identical extension is supported. + * + *

    Multisampled antialiasing has become a common method for improving the quality of rendered images. Multisampling differs from supersampling in that the + * color of a primitive that covers all or part of a pixel is resolved once, regardless of the number of samples covered. If a large polygon is rendered, + * the colors of all samples in each interior pixel will be the same. This suggests a simple compression scheme that can reduce the necessary memory + * bandwidth requirements. In one such scheme, each sample is stored in a separate slice of the multisample surface. An additional multisample control + * surface (MCS) contains a mapping from pixel samples to slices.

    + * + *

    If all the values stored in the MCS for a particular pixel are the same, then all the samples have the same value. Applications can take advantage of + * this information to reduce the bandwidth of reading multisample textures. A custom multisample resolve filter could optimize resolving pixels where + * every sample is identical by reading the color once.

    + * + *
    
    +     * color = texelFetch(sampler, coordinate, 0);
    +     * if (!textureSamplesIdenticalEXT(sampler, coordinate)) {
    +     *     for (int i = 1; i < MAX_SAMPLES; i++) {
    +     *         vec4 c = texelFetch(sampler, coordinate, i);
    +     * 
    +     *         //... accumulate c into color
    +     * 
    +     *     }
    +     * }
    + * + *

    Requires {@link GL32 OpenGL 3.2} or {@link ARBTextureMultisample ARB_texture_multisample}.

    + */ + public final boolean GL_EXT_shader_samples_identical; + /** + * When true, the EXT_shadow_funcs extension is supported. + * + *

    This extension generalizes the {@link #GL_ARB_shadow ARB_shadow} extension to support all eight binary texture comparison functions rather than just {@link GL11#GL_LEQUAL LEQUAL} and + * {@link GL11#GL_GEQUAL GEQUAL}.

    + * + *

    Requires {@link #GL_ARB_depth_texture ARB_depth_texture} and {@link #GL_ARB_shadow ARB_shadow}.

    + */ + public final boolean GL_EXT_shadow_funcs; + /** When true, {@link EXTSharedTexturePalette} is supported. */ + public final boolean GL_EXT_shared_texture_palette; + /** + * When true, the EXT_sparse_texture2 extension is supported. + * + *

    This extension builds on the {@link ARBSparseTexture ARB_sparse_texture} extension, providing the following new functionality:

    + * + *
      + *
    • New built-in GLSL texture lookup and image load functions are provided that return information on whether the texels accessed for the texture + * lookup accessed uncommitted texture memory. + * + *

      New built-in GLSL texture lookup functions are provided that specify a minimum level of detail to use for lookups where the level of detail is + * computed automatically. This allows shaders to avoid accessing unpopulated portions of high-resolution levels of detail when it knows that the + * memory accessed is unpopulated, either from a priori knowledge or from feedback provided by the return value of previously executed "sparse" + * texture lookup functions.

      + * + *

      Reads of uncommitted texture memory will act as though such memory were filled with zeroes; previously, the values returned by reads were undefined.

      + * + *

      Standard implementation-independent virtual page sizes for internal formats required to be supported with sparse textures. These standard sizes can + * be requested by leaving {@link ARBSparseTexture#GL_VIRTUAL_PAGE_SIZE_INDEX_ARB VIRTUAL_PAGE_SIZE_INDEX_ARB} at its initial value (0).

      + * + *

      Support for creating sparse multisample and multisample array textures is added. However, the virtual page sizes for such textures remain fully + * implementation-dependent.

    • + *
    + * + *

    Requires {@link ARBSparseTexture ARB_sparse_texture}.

    + */ + public final boolean GL_EXT_sparse_texture2; + /** When true, {@link EXTStencilClearTag} is supported. */ + public final boolean GL_EXT_stencil_clear_tag; + /** When true, {@link EXTStencilTwoSide} is supported. */ + public final boolean GL_EXT_stencil_two_side; + /** When true, {@link EXTStencilWrap} is supported. */ + public final boolean GL_EXT_stencil_wrap; + /** When true, {@link EXTTextureArray} is supported. */ + public final boolean GL_EXT_texture_array; + /** When true, {@link EXTTextureBufferObject} is supported. */ + public final boolean GL_EXT_texture_buffer_object; + /** When true, {@link EXTTextureCompressionLATC} is supported. */ + public final boolean GL_EXT_texture_compression_latc; + /** When true, {@link EXTTextureCompressionRGTC} is supported. */ + public final boolean GL_EXT_texture_compression_rgtc; + /** When true, {@link EXTTextureCompressionS3TC} is supported. */ + public final boolean GL_EXT_texture_compression_s3tc; + /** When true, {@link EXTTextureFilterAnisotropic} is supported. */ + public final boolean GL_EXT_texture_filter_anisotropic; + /** When true, {@link EXTTextureFilterMinmax} is supported. */ + public final boolean GL_EXT_texture_filter_minmax; + /** When true, {@link EXTTextureInteger} is supported. */ + public final boolean GL_EXT_texture_integer; + /** When true, {@link EXTTextureMirrorClamp} is supported. */ + public final boolean GL_EXT_texture_mirror_clamp; + /** + * This extension adds support for various shadow sampler types with texture functions having interactions with the LOD of texture lookups. + * + *

    Modern shading languages support LOD queries for shadow sampler types, but until now the OpenGL Shading Language Specification has excluded multiple + * texture function overloads involving LOD calculations with various shadow samplers. Shading languages for other APIs do support the equivalent + * LOD-based texture sampling functions for these types which has made porting between those shading languages to GLSL cumbersome and has required the + * usage of sub-optimal workarounds.

    + * + *

    Requires {@link GL20 OpenGL 2.0} and {@link EXTGPUShader4 EXT_gpu_shader4} or equivalent functionality.

    + */ + public final boolean GL_EXT_texture_shadow_lod; + /** When true, {@link EXTTextureSharedExponent} is supported. */ + public final boolean GL_EXT_texture_shared_exponent; + /** When true, {@link EXTTextureSnorm} is supported. */ + public final boolean GL_EXT_texture_snorm; + /** When true, {@link EXTTextureSRGB} is supported. */ + public final boolean GL_EXT_texture_sRGB; + /** When true, {@link EXTTextureSRGBDecode} is supported. */ + public final boolean GL_EXT_texture_sRGB_decode; + /** When true, {@link EXTTextureSRGBR8} is supported. */ + public final boolean GL_EXT_texture_sRGB_R8; + /** When true, {@link EXTTextureSRGBRG8} is supported. */ + public final boolean GL_EXT_texture_sRGB_RG8; + /** When true, {@link EXTTextureStorage} is supported. */ + public final boolean GL_EXT_texture_storage; + /** When true, {@link EXTTextureSwizzle} is supported. */ + public final boolean GL_EXT_texture_swizzle; + /** When true, {@link EXTTimerQuery} is supported. */ + public final boolean GL_EXT_timer_query; + /** When true, {@link EXTTransformFeedback} is supported. */ + public final boolean GL_EXT_transform_feedback; + /** + * When true, the EXT_vertex_array_bgra extension is supported. + * + *

    This extension provides a single new component format for vertex arrays to read 4-component unsigned byte vertex attributes with a BGRA component + * ordering.

    + * + *

    OpenGL expects vertex arrays containing 4 unsigned bytes per element to be in the RGBA, STRQ, or XYZW order (reading components left-to-right in their + * lower address to higher address order). Essentially the order the components appear in memory is the order the components appear in the resulting + * vertex attribute vector.

    + * + *

    However Direct3D has color (diffuse and specular) vertex arrays containing 4 unsigned bytes per element that are in a BGRA order (again reading + * components left-to-right in their lower address to higher address order). Direct3D calls this "ARGB" reading the components in the opposite order + * (reading components left-to-right in their higher address to lower address order). This ordering is generalized in the DirectX 10 by the + * DXGI_FORMAT_B8G8R8A8_UNORM format.

    + * + *

    For an OpenGL application to source color data from a vertex buffer formatted for Direct3D's color array format conventions, the application is forced + * to either:

    + * + *
      + *
    1. Rely on a vertex program or shader to swizzle the color components from the BGRA to conventional RGBA order.
    2. + *
    3. Re-order the color data components in the vertex buffer from Direct3D's native BGRA order to OpenGL's native RGBA order.
    4. + *
    + * + *

    Neither option is entirely satisfactory.

    + * + *

    Option 1 means vertex shaders have to be re-written to source colors differently. If the same vertex shader is used with vertex arrays configured to + * source the color as 4 floating-point color components, the swizzle for BGRA colors stored as 4 unsigned bytes is no longer appropriate. The shader's + * swizzling of colors becomes dependent on the type and number of color components. Ideally the vertex shader should be independent from the format and + * component ordering of the data it sources.

    + * + *

    Option 2 is expensive because vertex buffers may have to be reformatted prior to use. OpenGL treats the memory for vertex arrays (whether client-side + * memory or buffer objects) as essentially untyped memory and vertex arrays can be stored separately, interleaved, or even interwoven (where multiple + * arrays overlap with differing strides and formats).

    + * + *

    Rather than force a re-ordering of either vertex array components in memory or a vertex array format-dependent re-ordering of vertex shader inputs, + * OpenGL can simply provide a vertex array format that matches the Direct3D color component ordering.

    + * + *

    This approach mimics that of the EXT_bgra extension for pixel and texel formats except for vertex instead of image data.

    + */ + public final boolean GL_EXT_vertex_array_bgra; + /** When true, {@link EXTVertexAttrib64bit} is supported. */ + public final boolean GL_EXT_vertex_attrib_64bit; + /** When true, {@link EXTWin32KeyedMutex} is supported. */ + public final boolean GL_EXT_win32_keyed_mutex; + /** When true, {@link EXTWindowRectangles} is supported. */ + public final boolean GL_EXT_window_rectangles; + /** When true, {@link EXTX11SyncObject} is supported. */ + public final boolean GL_EXT_x11_sync_object; + /** When true, {@link GREMEDYFrameTerminator} is supported. */ + public final boolean GL_GREMEDY_frame_terminator; + /** When true, {@link GREMEDYStringMarker} is supported. */ + public final boolean GL_GREMEDY_string_marker; + /** When true, {@link INTELBlackholeRender} is supported. */ + public final boolean GL_INTEL_blackhole_render; + /** When true, {@link INTELConservativeRasterization} is supported. */ + public final boolean GL_INTEL_conservative_rasterization; + /** + * When true, the INTEL_fragment_shader_ordering extension is supported. + * + *

    Graphics devices may execute in parallel fragment shaders referring to the same window xy coordinates. Framebuffer writes are guaranteed to be + * processed in primitive rasterization order, but there is no order guarantee for other instructions and image or buffer object accesses in particular.

    + * + *

    The extension introduces a new GLSL built-in function, beginFragmentShaderOrderingINTEL(), which blocks execution of a fragment shader invocation until + * invocations from previous primitives that map to the same xy window coordinates (and same sample when per-sample shading is active) complete their + * execution. All memory transactions from previous fragment shader invocations are made visible to the fragment shader invocation that called + * beginFragmentShaderOrderingINTEL() when the function returns.

    + */ + public final boolean GL_INTEL_fragment_shader_ordering; + /** When true, {@link INTELFramebufferCMAA} is supported. */ + public final boolean GL_INTEL_framebuffer_CMAA; + /** When true, {@link INTELMapTexture} is supported. */ + public final boolean GL_INTEL_map_texture; + /** When true, {@link INTELPerformanceQuery} is supported. */ + public final boolean GL_INTEL_performance_query; + /** + * When true, the INTEL_shader_integer_functions2 extension is supported. + * + *

    OpenCL and other GPU programming environments provides a number of useful functions operating on integer data. Many of these functions are supported by + * specialized instructions various GPUs. Correct GLSL implementations for some of these functions are non-trivial. Recognizing open-coded versions of + * these functions is often impractical. As a result, potential performance improvements go unrealized.

    + * + *

    This extension makes available a number of functions that have specialized instruction support on Intel GPUs.

    + * + *

    Requires GLSL 1.30 or EXT_gpu_shader4.

    + */ + public final boolean GL_INTEL_shader_integer_functions2; + /** When true, {@link KHRBlendEquationAdvanced} is supported. */ + public final boolean GL_KHR_blend_equation_advanced; + /** When true, {@link KHRBlendEquationAdvancedCoherent} is supported. */ + public final boolean GL_KHR_blend_equation_advanced_coherent; + /** When true, {@link KHRContextFlushControl} is supported. */ + public final boolean GL_KHR_context_flush_control; + /** When true, {@link KHRDebug} is supported. */ + public final boolean GL_KHR_debug; + /** When true, {@link KHRNoError} is supported. */ + public final boolean GL_KHR_no_error; + /** When true, {@link KHRParallelShaderCompile} is supported. */ + public final boolean GL_KHR_parallel_shader_compile; + /** + * When true, the KHR_robust_buffer_access_behavior extension is supported. + * + *

    This extension specifies the behavior of out-of-bounds buffer and array accesses. This is an improvement over the existing {@link #GL_KHR_robustness KHR_robustness} + * extension which states that the application should not crash, but that behavior is otherwise undefined. This extension specifies the access protection + * provided by the GL to ensure that out-of-bounds accesses cannot read from or write to data not owned by the application. All accesses are contained + * within the buffer object and program area they reference. These additional robustness guarantees apply to contexts created with the robust access flag + * set.

    + * + *

    Requires {@link GL32 OpenGL 3.2} and {@link #GL_KHR_robustness KHR_robustness}.

    + */ + public final boolean GL_KHR_robust_buffer_access_behavior; + /** When true, {@link KHRRobustness} is supported. */ + public final boolean GL_KHR_robustness; + /** When true, {@link KHRShaderSubgroup} is supported. */ + public final boolean GL_KHR_shader_subgroup; + /** + * When true, the KHR_texture_compression_astc_hdr extension is supported. + * + *

    This extension corresponds to the ASTC HDR Profile, see {@link KHRTextureCompressionASTCLDR KHR_texture_compression_astc_ldr} for details.

    + */ + public final boolean GL_KHR_texture_compression_astc_hdr; + /** When true, {@link KHRTextureCompressionASTCLDR} is supported. */ + public final boolean GL_KHR_texture_compression_astc_ldr; + /** + * When true, the KHR_texture_compression_astc_sliced_3d extension is supported. + * + *

    Adaptive Scalable Texture Compression (ASTC) is a new texture compression technology that offers unprecendented flexibility, while producing better or + * comparable results than existing texture compressions at all bit rates. It includes support for 2D and slice-based 3D textures, with low and high + * dynamic range, at bitrates from below 1 bit/pixel up to 8 bits/pixel in fine steps.

    + * + *

    This extension extends the functionality of {@link KHRTextureCompressionASTCLDR KHR_texture_compression_astc_ldr} to include slice-based 3D textures for textures using the LDR + * profile in the same way as the HDR profile allows slice-based 3D textures.

    + * + *

    Requires {@link KHRTextureCompressionASTCLDR KHR_texture_compression_astc_ldr}.

    + */ + public final boolean GL_KHR_texture_compression_astc_sliced_3d; + /** When true, {@link MESAFramebufferFlipX} is supported. */ + public final boolean GL_MESA_framebuffer_flip_x; + /** When true, {@link MESAFramebufferFlipY} is supported. */ + public final boolean GL_MESA_framebuffer_flip_y; + /** When true, {@link MESAFramebufferSwapXY} is supported. */ + public final boolean GL_MESA_framebuffer_swap_xy; + /** + * When true, the MESA_tile_raster_order extension is supported. + * + *

    This extension extends the sampling-from-the-framebuffer behavior provided by {@code GL_ARB_texture_barrier} to allow setting the rasterization order + * of the scene, so that overlapping blits can be implemented. This can be used for scrolling or window movement within in 2D scenes, without first + * copying to a temporary.

    + * + *

    Requires {@link ARBTextureBarrier ARB_texture_barrier} or {@link NVTextureBarrier NV_texture_barrier}.

    + */ + public final boolean GL_MESA_tile_raster_order; + /** When true, {@link NVAlphaToCoverageDitherControl} is supported. */ + public final boolean GL_NV_alpha_to_coverage_dither_control; + /** When true, {@link NVBindlessMultiDrawIndirect} is supported. */ + public final boolean GL_NV_bindless_multi_draw_indirect; + /** When true, {@link NVBindlessMultiDrawIndirectCount} is supported. */ + public final boolean GL_NV_bindless_multi_draw_indirect_count; + /** When true, {@link NVBindlessTexture} is supported. */ + public final boolean GL_NV_bindless_texture; + /** When true, {@link NVBlendEquationAdvanced} is supported. */ + public final boolean GL_NV_blend_equation_advanced; + /** When true, {@link NVBlendEquationAdvancedCoherent} is supported. */ + public final boolean GL_NV_blend_equation_advanced_coherent; + /** When true, {@link NVBlendMinmaxFactor} is supported. */ + public final boolean GL_NV_blend_minmax_factor; + /** When true, the NV_blend_square extension is supported. */ + public final boolean GL_NV_blend_square; + /** When true, {@link NVClipSpaceWScaling} is supported. */ + public final boolean GL_NV_clip_space_w_scaling; + /** When true, {@link NVCommandList} is supported. */ + public final boolean GL_NV_command_list; + /** + * When true, the NV_compute_shader_derivatives extension is supported. + * + *

    This extension adds OpenGL API support for the OpenGL Shading Language (GLSL) extension {@code "NV_compute_shader_derivatives"}.

    + * + *

    That extension, when enabled, allows applications to use derivatives in compute shaders. It adds compute shader support for explicit derivative + * built-in functions like {@code dFdx()}, automatic derivative computation in texture lookup functions like {@code texture()}, use of the optional LOD + * bias parameter to adjust the computed level of detail values in texture lookup functions, and the texture level of detail query function + * {@code textureQueryLod()}.

    + * + *

    Requires {@link GL45 OpenGL 4.5}.

    + */ + public final boolean GL_NV_compute_shader_derivatives; + /** When true, {@link NVConditionalRender} is supported. */ + public final boolean GL_NV_conditional_render; + /** When true, {@link NVConservativeRaster} is supported. */ + public final boolean GL_NV_conservative_raster; + /** When true, {@link NVConservativeRasterDilate} is supported. */ + public final boolean GL_NV_conservative_raster_dilate; + /** When true, {@link NVConservativeRasterPreSnap} is supported. */ + public final boolean GL_NV_conservative_raster_pre_snap; + /** When true, {@link NVConservativeRasterPreSnapTriangles} is supported. */ + public final boolean GL_NV_conservative_raster_pre_snap_triangles; + /** + * When true, the NV_conservative_raster_underestimation extension is supported. + * + *

    The extension {@link NVConservativeRaster NV_conservative_raster} provides a new rasterization mode known as "Overestimated Conservative Rasterization", where any pixel + * that is partially covered, even if no sample location is covered, is treated as fully covered and a corresponding fragment will be shaded. There is + * also an "Underestimated Conservative Rasterization" variant, where only the pixels that are completely covered by the primitive are rasterized.

    + * + *

    This extension provides the underestimated conservative rasterization information for each fragment in the fragment shader through a new built-in + * {@code gl_FragFullyCoveredNV}.

    + */ + public final boolean GL_NV_conservative_raster_underestimation; + /** When true, {@link NVCopyDepthToColor} is supported. */ + public final boolean GL_NV_copy_depth_to_color; + /** When true, {@link NVCopyImage} is supported. */ + public final boolean GL_NV_copy_image; + /** When true, {@link NVDeepTexture3D} is supported. */ + public final boolean GL_NV_deep_texture3D; + /** When true, {@link NVDepthBufferFloat} is supported. */ + public final boolean GL_NV_depth_buffer_float; + /** When true, {@link NVDepthClamp} is supported. */ + public final boolean GL_NV_depth_clamp; + /** When true, {@link NVDrawTexture} is supported. */ + public final boolean GL_NV_draw_texture; + /** When true, {@link NVDrawVulkanImage} is supported. */ + public final boolean GL_NV_draw_vulkan_image; + /** When true, the NV_ES3_1_compatibility extension is supported. */ + public final boolean GL_NV_ES3_1_compatibility; + /** When true, {@link NVExplicitMultisample} is supported. */ + public final boolean GL_NV_explicit_multisample; + /** When true, {@link NVFence} is supported. */ + public final boolean GL_NV_fence; + /** When true, {@link NVFillRectangle} is supported. */ + public final boolean GL_NV_fill_rectangle; + /** When true, {@link NVFloatBuffer} is supported. */ + public final boolean GL_NV_float_buffer; + /** When true, {@link NVFogDistance} is supported. */ + public final boolean GL_NV_fog_distance; + /** When true, {@link NVFragmentCoverageToColor} is supported. */ + public final boolean GL_NV_fragment_coverage_to_color; + /** When true, the NV_fragment_program4 extension is supported. */ + public final boolean GL_NV_fragment_program4; + /** When true, the NV_fragment_program_option extension is supported. */ + public final boolean GL_NV_fragment_program_option; + /** + * When true, the NV_fragment_shader_barycentric extension is supported. + * + *

    This extension advertises OpenGL support for the OpenGL Shading Language (GLSL) extension {@code "NV_fragment_shader_barycentric"}, which provides + * fragment shader built-in variables holding barycentric weight vectors that identify the location of the fragment within its primitive. Additionally, + * the GLSL extension allows fragment the ability to read raw attribute values for each of the vertices of the primitive that produced the fragment.

    + * + *

    Requires {@link GL45 OpenGL 4.5}.

    + */ + public final boolean GL_NV_fragment_shader_barycentric; + /** + * When true, the NV_fragment_shader_interlock extension is supported. + * + *

    In unextended OpenGL 4.3, applications may produce a large number of fragment shader invocations that perform loads and stores to memory using image + * uniforms, atomic counter uniforms, buffer variables, or pointers. The order in which loads and stores to common addresses are performed by different + * fragment shader invocations is largely undefined. For algorithms that use shader writes and touch the same pixels more than once, one or more of the + * following techniques may be required to ensure proper execution ordering:

    + * + *
      + *
    • inserting Finish or WaitSync commands to drain the pipeline between different "passes" or "layers";
    • + *
    • using only atomic memory operations to write to shader memory (which may be relatively slow and limits how memory may be updated); or
    • + *
    • injecting spin loops into shaders to prevent multiple shader invocations from touching the same memory concurrently.
    • + *
    + * + *

    This extension provides new GLSL built-in functions beginInvocationInterlockNV() and endInvocationInterlockNV() that delimit a critical section of + * fragment shader code. For pairs of shader invocations with "overlapping" coverage in a given pixel, the OpenGL implementation will guarantee that the + * critical section of the fragment shader will be executed for only one fragment at a time.

    + * + *

    There are four different interlock modes supported by this extension, which are identified by layout qualifiers. The qualifiers + * "pixel_interlock_ordered" and "pixel_interlock_unordered" provides mutual exclusion in the critical section for any pair of fragments corresponding to + * the same pixel. When using multisampling, the qualifiers "sample_interlock_ordered" and "sample_interlock_unordered" only provide mutual exclusion for + * pairs of fragments that both cover at least one common sample in the same pixel; these are recommended for performance if shaders use per-sample data + * structures.

    + * + *

    Additionally, when the "pixel_interlock_ordered" or "sample_interlock_ordered" layout qualifier is used, the interlock also guarantees that the + * critical section for multiple shader invocations with "overlapping" coverage will be executed in the order in which the primitives were processed by + * the GL. Such a guarantee is useful for applications like blending in the fragment shader, where an application requires that fragment values to be + * composited in the framebuffer in primitive order.

    + * + *

    This extension can be useful for algorithms that need to access per-pixel data structures via shader loads and stores. Such algorithms using this + * extension can access such data structures in the critical section without worrying about other invocations for the same pixel accessing the data + * structures concurrently. Additionally, the ordering guarantees are useful for cases where the API ordering of fragments is meaningful. For example, + * applications may be able to execute programmable blending operations in the fragment shader, where the destination buffer is read via image loads and + * the final value is written via image stores.

    + * + *

    Requires {@link GL43 OpenGL 4.3} and GLSL 4.30.

    + */ + public final boolean GL_NV_fragment_shader_interlock; + /** When true, {@link NVFramebufferMixedSamples} is supported. */ + public final boolean GL_NV_framebuffer_mixed_samples; + /** When true, {@link NVFramebufferMultisampleCoverage} is supported. */ + public final boolean GL_NV_framebuffer_multisample_coverage; + /** + * When true, the NV_geometry_shader4 extension is supported. + * + *

    This extension builds upon the {@link #GL_EXT_geometry_shader4 EXT_geometry_shader4} specification to provide two additional capabilities:

    + * + *
      + *
    • Support for QUADS, QUAD_STRIP, and POLYGON primitive types when geometry shaders are enabled. Such primitives will be tessellated into individual + * triangles.
    • + *
    • Setting the value of GEOMETRY_VERTICES_OUT_EXT will take effect immediately. It is not necessary to link the program object in order for this change + * to take effect, as is the case in the EXT version of this extension.
    • + *
    + * + *

    Requires {@link #GL_EXT_geometry_shader4 EXT_geometry_shader4}.

    + */ + public final boolean GL_NV_geometry_shader4; + /** + * When true, the NV_geometry_shader_passthrough extension is supported. + * + *

    This extension provides a shading language abstraction to express such shaders without requiring explicit logic to manually copy attributes from input + * vertices to output vertices.

    + */ + public final boolean GL_NV_geometry_shader_passthrough; + /** When true, {@link NVGPUMulticast} is supported. */ + public final boolean GL_NV_gpu_multicast; + /** When true, {@link NVGPUShader5} is supported. */ + public final boolean GL_NV_gpu_shader5; + /** When true, {@link NVHalfFloat} is supported. */ + public final boolean GL_NV_half_float; + /** When true, {@link NVInternalformatSampleQuery} is supported. */ + public final boolean GL_NV_internalformat_sample_query; + /** When true, {@link NVLightMaxExponent} is supported. */ + public final boolean GL_NV_light_max_exponent; + /** When true, {@link NVMemoryAttachment} is supported. */ + public final boolean GL_NV_memory_attachment; + /** When true, {@link NVMemoryObjectSparse} is supported. */ + public final boolean GL_NV_memory_object_sparse; + /** When true, {@link NVMeshShader} is supported. */ + public final boolean GL_NV_mesh_shader; + /** When true, {@link NVMultisampleCoverage} is supported. */ + public final boolean GL_NV_multisample_coverage; + /** When true, {@link NVMultisampleFilterHint} is supported. */ + public final boolean GL_NV_multisample_filter_hint; + /** When true, {@link NVPackedDepthStencil} is supported. */ + public final boolean GL_NV_packed_depth_stencil; + /** When true, {@link NVPathRendering} is supported. */ + public final boolean GL_NV_path_rendering; + /** When true, {@link NVPathRenderingSharedEdge} is supported. */ + public final boolean GL_NV_path_rendering_shared_edge; + /** When true, {@link NVPixelDataRange} is supported. */ + public final boolean GL_NV_pixel_data_range; + /** When true, {@link NVPointSprite} is supported. */ + public final boolean GL_NV_point_sprite; + /** When true, {@link NVPrimitiveRestart} is supported. */ + public final boolean GL_NV_primitive_restart; + /** When true, {@link NVPrimitiveShadingRate} is supported. */ + public final boolean GL_NV_primitive_shading_rate; + /** When true, {@link NVQueryResource} is supported. */ + public final boolean GL_NV_query_resource; + /** When true, {@link NVQueryResourceTag} is supported. */ + public final boolean GL_NV_query_resource_tag; + /** When true, {@link NVRepresentativeFragmentTest} is supported. */ + public final boolean GL_NV_representative_fragment_test; + /** When true, {@link NVRobustnessVideoMemoryPurge} is supported. */ + public final boolean GL_NV_robustness_video_memory_purge; + /** When true, {@link NVSampleLocations} is supported. */ + public final boolean GL_NV_sample_locations; + /** + * When true, the NV_sample_mask_override_coverage extension is supported. + * + *

    This extension allows the fragment shader to control whether the gl_SampleMask output can enable samples that were not covered by the original + * primitive, or that failed the early depth/stencil tests.

    + */ + public final boolean GL_NV_sample_mask_override_coverage; + /** When true, {@link NVScissorExclusive} is supported. */ + public final boolean GL_NV_scissor_exclusive; + /** + * When true, the NV_shader_atomic_float extension is supported. + * + *

    This extension provides GLSL built-in functions and assembly opcodes allowing shaders to perform atomic read-modify-write operations to buffer or + * texture memory with floating-point components. The set of atomic operations provided by this extension is limited to adds and exchanges. Providing + * atomic add support allows shaders to atomically accumulate the sum of floating-point values into buffer or texture memory across multiple (possibly + * concurrent) shader invocations.

    + * + *

    This extension provides GLSL support for atomics targeting image uniforms (if GLSL 4.20, {@link #GL_ARB_shader_image_load_store ARB_shader_image_load_store}, or + * {@link #GL_EXT_shader_image_load_store EXT_shader_image_load_store} is supported) or floating-point pointers (if {@link #GL_NV_gpu_shader5 NV_gpu_shader5} is supported). Additionally, assembly opcodes + * for these operations is also provided if NV_gpu_program5 is supported.

    + */ + public final boolean GL_NV_shader_atomic_float; + /** + * When true, the NV_shader_atomic_float64 extension is supported. + * + *

    This extension provides GLSL built-in functions and assembly opcodes allowing shaders to perform atomic read-modify-write operations to buffer or + * shared memory with double-precision floating-point components. The set of atomic operations provided by this extension is limited to adds and + * exchanges. Providing atomic add support allows shaders to atomically accumulate the sum of double-precision floating-point values into buffer memory + * across multiple (possibly concurrent) shader invocations.

    + * + *

    This extension provides GLSL support for atomics targeting double-precision floating-point pointers (if {@link NVGPUShader5 NV_gpu_shader5} is supported). + * Additionally, assembly opcodes for these operations are also provided if {@code NV_gpu_program5} is supported.

    + * + *

    Requires {@link ARBGPUShaderFP64 ARB_gpu_shader_fp64} or {@code NV_gpu_program_fp64}.

    + */ + public final boolean GL_NV_shader_atomic_float64; + /** + * When true, the NV_shader_atomic_fp16_vector extension is supported. + * + *

    This extension provides GLSL built-in functions and assembly opcodes allowing shaders to perform a limited set of atomic read-modify-write operations + * to buffer or texture memory with 16-bit floating point vector surface formats.

    + * + *

    Requires {@link #GL_NV_gpu_shader5 NV_gpu_shader5}.

    + */ + public final boolean GL_NV_shader_atomic_fp16_vector; + /** + * When true, the NV_shader_atomic_int64 extension is supported. + * + *

    This extension provides additional GLSL built-in functions and assembly opcodes allowing shaders to perform additional atomic read-modify-write + * operations on 64-bit signed and unsigned integers stored in buffer object memory.

    + */ + public final boolean GL_NV_shader_atomic_int64; + /** When true, {@link NVShaderBufferLoad} is supported. */ + public final boolean GL_NV_shader_buffer_load; + /** When true, {@link NVShaderBufferStore} is supported. */ + public final boolean GL_NV_shader_buffer_store; + /** When true, {@link NVShaderSubgroupPartitioned} is supported. */ + public final boolean GL_NV_shader_subgroup_partitioned; + /** + * When true, the NV_shader_texture_footprint extension is supported. + * + *

    This extension adds OpenGL API support for the OpenGL Shading Language (GLSL) extension {@code "NV_shader_texture_footprint"}. That extension adds a + * new set of texture query functions ({@code "textureFootprint*NV"}) to GLSL. These built-in functions prepare to perform a filtered texture lookup based + * on coordinates and other parameters passed in by the calling code. However, instead of returning data from the provided texture image, these query + * functions instead return data identifying the texture footprint for an equivalent texture access. The texture footprint identifies a set of + * texels that may be accessed in order to return a filtered result for the texture access.

    + * + *

    The footprint itself is a structure that includes integer values that identify a small neighborhood of texels in the texture being accessed and a + * bitfield that indicates which texels in that neighborhood would be used. Each bit in the returned bitfield identifies whether any texel in a small + * aligned block of texels would be fetched by the texture lookup. The size of each block is specified by an access granularity provided by the + * shader. The minimum granularity supported by this extension is 2x2 (for 2D textures) and 2x2x2 (for 3D textures); the maximum granularity is 256x256 + * (for 2D textures) or 64x32x32 (for 3D textures). Each footprint query returns the footprint from a single texture level. When using minification + * filters that combine accesses from multiple mipmap levels, shaders must perform separate queries for the two levels accessed ("fine" and "coarse"). The + * footprint query also returns a flag indicating if the texture lookup would access texels from only one mipmap level or from two neighboring levels.

    + * + *

    This extension should be useful for multi-pass rendering operations that do an initial expensive rendering pass to produce a first image that is then + * used as a texture for a second pass. If the second pass ends up accessing only portions of the first image (e.g., due to visibility), the work spent + * rendering the non-accessed portion of the first image was wasted. With this feature, an application can limit this waste using an initial pass over the + * geometry in the second image that performs a footprint query for each visible pixel to determine the set of pixels that it needs from the first image. + * This pass would accumulate an aggregate footprint of all visible pixels into a separate "footprint texture" using shader atomics. Then, when rendering + * the first image, the application can kill all shading work for pixels not in this aggregate footprint.

    + * + *

    The implementation of this extension has a number of limitations. The texture footprint query functions are only supported for two- and + * three-dimensional textures ({@link GL11#GL_TEXTURE_2D TEXTURE_2D}, {@link GL12#GL_TEXTURE_3D TEXTURE_3D}). Texture footprint evaluation only supports the {@link GL12#GL_CLAMP_TO_EDGE CLAMP_TO_EDGE} wrap mode; results are undefined + * for all other wrap modes. The implementation supports only a limited set of granularity values and does not support separate coverage information for + * each texel in the original texture.

    + * + *

    Requires {@link GL45 OpenGL 4.5}.

    + */ + public final boolean GL_NV_shader_texture_footprint; + /** When true, {@link NVShaderThreadGroup} is supported. */ + public final boolean GL_NV_shader_thread_group; + /** + * When true, the NV_shader_thread_shuffle extension is supported. + * + *

    Implementations of the OpenGL Shading Language may, but are not required, to run multiple shader threads for a single stage as a SIMD thread group, + * where individual execution threads are assigned to thread groups in an undefined, implementation-dependent order. This extension provides a set of + * new features to the OpenGL Shading Language to share data between multiple threads within a thread group.

    + * + *

    Requires {@link GL43 OpenGL 4.3} and GLSL 4.3.

    + */ + public final boolean GL_NV_shader_thread_shuffle; + /** When true, {@link NVShadingRateImage} is supported. */ + public final boolean GL_NV_shading_rate_image; + /** + * When true, the NV_stereo_view_rendering extension is supported. + * + *

    Virtual reality (VR) applications often render a single logical scene from multiple views corresponding to a pair of eyes. The views (eyes) are + * separated by a fixed offset in the X direction.

    + * + *

    Traditionally, multiple views are rendered via multiple rendering passes. This is expensive for the GPU because the objects in the scene must be + * transformed, rasterized, shaded, and fragment processed redundantly. This is expensive for the CPU because the scene graph needs to be visited multiple + * times and driver validation happens for each view. Rendering N passes tends to take N times longer than a single pass.

    + * + *

    This extension provides a mechanism to render binocular (stereo) views from a single stream of OpenGL rendering commands. Vertex, tessellation, and + * geometry (VTG) shaders can output two positions for each vertex corresponding to the two eye views. A built-in "gl_SecondaryPositionNV" is added to + * specify the second position. The positions from each view may be sent to different viewports and/or layers. A built-in "gl_SecondaryViewportMaskNV[]" + * is also added to specify the viewport mask for the second view. A new layout-qualifier "secondary_view_offset" is added for built-in output "gl_Layer" + * which allows for the geometry from each view to be sent to different layers for rendering.

    + * + *

    Requires {@link #GL_NV_viewport_array2 NV_viewport_array2}.

    + */ + public final boolean GL_NV_stereo_view_rendering; + /** When true, {@link NVTexgenReflection} is supported. */ + public final boolean GL_NV_texgen_reflection; + /** When true, {@link NVTextureBarrier} is supported. */ + public final boolean GL_NV_texture_barrier; + /** + * When true, the NV_texture_compression_vtc extension is supported. + * + *

    This extension adds support for the VTC 3D texture compression formats, which are analogous to the S3TC texture compression formats, with the addition + * of some retiling in the Z direction. VTC has the same compression ratio as S3TC and uses 4x4x1, 4x4x2, (4x4x3 when non-power-of-two textures are + * supported), or 4x4x4 blocks.

    + */ + public final boolean GL_NV_texture_compression_vtc; + /** When true, {@link NVTextureMultisample} is supported. */ + public final boolean GL_NV_texture_multisample; + /** + * When true, the NV_texture_rectangle_compressed extension is supported. + * + *

    This extension allows applications to use compressed texture formats with the {@link GL31#GL_TEXTURE_RECTANGLE TEXTURE_RECTANGLE} texture target, removing an old limitation that + * prohibited such usage globally for rectangle textures.

    + */ + public final boolean GL_NV_texture_rectangle_compressed; + /** When true, {@link NVTextureShader} is supported. */ + public final boolean GL_NV_texture_shader; + /** When true, {@link NVTextureShader2} is supported. */ + public final boolean GL_NV_texture_shader2; + /** When true, {@link NVTextureShader3} is supported. */ + public final boolean GL_NV_texture_shader3; + /** When true, {@link NVTimelineSemaphore} is supported. */ + public final boolean GL_NV_timeline_semaphore; + /** When true, {@link NVTransformFeedback} is supported. */ + public final boolean GL_NV_transform_feedback; + /** When true, {@link NVTransformFeedback2} is supported. */ + public final boolean GL_NV_transform_feedback2; + /** + * When true, the NV_uniform_buffer_std430_layout extension is supported. + * + *

    OpenGL 4.3 (and {@code ARB_enhanced_layouts}) provide an enhanced layout qualifier syntax for aligning members of uniform and shader storage blocks. + * The std430 enhanced layout qualifier is advantageous, compared with std140, because it provides a more space-efficient layout of arrays that more + * easily matches the data layout in C/C++ structures stored in CPU memory.

    + * + *

    However OpenGL 4.3 precluded using the std430 layout qualifier for uniform blocks (by mandating a compilation error be generated).

    + * + *

    This extension makes std430 a legal layout qualifier for uniform blocks in GLSL when the extension's GLSL {@code #extension} functionality is enabled + * or required.

    + */ + public final boolean GL_NV_uniform_buffer_std430_layout; + /** When true, {@link NVUniformBufferUnifiedMemory} is supported. */ + public final boolean GL_NV_uniform_buffer_unified_memory; + /** When true, {@link NVVertexArrayRange} is supported. */ + public final boolean GL_NV_vertex_array_range; + /** When true, {@link NVVertexArrayRange2} is supported. */ + public final boolean GL_NV_vertex_array_range2; + /** When true, {@link NVVertexAttribInteger64bit} is supported. */ + public final boolean GL_NV_vertex_attrib_integer_64bit; + /** When true, {@link NVVertexBufferUnifiedMemory} is supported. */ + public final boolean GL_NV_vertex_buffer_unified_memory; + /** + * When true, the NV_viewport_array2 extension is supported. + * + *

    This extension provides new support allowing a single primitive to be broadcast to multiple viewports and/or multiple layers. A shader output + * gl_ViewportMask[] is provided, allowing a single primitive to be output to multiple viewports simultaneously. Also, a new shader option is provided to + * control whether the effective viewport index is added into gl_Layer. These capabilities allow a single primitive to be output to multiple layers + * simultaneously.

    + * + *

    The gl_ViewportMask[] output is available in vertex, tessellation control, tessellation evaluation, and geometry shaders. gl_ViewportIndex and gl_Layer + * are also made available in all these shader stages. The actual viewport index or mask and render target layer values are taken from the last active + * shader stage from this set of stages.

    + * + *

    This extension is a superset of the GL_AMD_vertex_shader_layer and GL_AMD_vertex_shader_viewport_index extensions, and thus those extension strings are + * expected to be exported if GL_NV_viewport_array2 is supported.

    + */ + public final boolean GL_NV_viewport_array2; + /** When true, {@link NVViewportSwizzle} is supported. */ + public final boolean GL_NV_viewport_swizzle; + /** + * When true, the NVX_blend_equation_advanced_multi_draw_buffers extension is supported. + * + *

    This extension adds support for using advanced blend equations introduced with {@link NVBlendEquationAdvanced NV_blend_equation_advanced} (and standardized by + * {@link KHRBlendEquationAdvanced KHR_blend_equation_advanced}) in conjunction with multiple draw buffers. The NV_blend_equation_advanced extension supports advanced blending + * equations only when rending to a single color buffer using fragment color zero and throws and {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error when multiple draw buffers are + * used. This extension removes this restriction.

    + * + *

    Requires either {@link NVBlendEquationAdvanced NV_blend_equation_advanced} or {@link KHRBlendEquationAdvanced KHR_blend_equation_advanced}.

    + */ + public final boolean GL_NVX_blend_equation_advanced_multi_draw_buffers; + /** When true, {@link NVXConditionalRender} is supported. */ + public final boolean GL_NVX_conditional_render; + /** When true, {@link NVXGPUMemoryInfo} is supported. */ + public final boolean GL_NVX_gpu_memory_info; + /** When true, {@link NVXGpuMulticast2} is supported. */ + public final boolean GL_NVX_gpu_multicast2; + /** When true, {@link NVXProgressFence} is supported. */ + public final boolean GL_NVX_progress_fence; + /** When true, {@link OVRMultiview} is supported. */ + public final boolean GL_OVR_multiview; + /** + * When true, the OVR_multiview2 extension is supported. + * + *

    This extension relaxes the restriction in OVR_multiview that only {@code gl_Position} can depend on {@code ViewID} in the vertex shader. With this + * change, view-dependent outputs like reflection vectors and similar are allowed.

    + * + *

    Requires {@link GL30 OpenGL 3.0} and {@link OVRMultiview OVR_multiview}.

    + */ + public final boolean GL_OVR_multiview2; + /** When true, {@link S3S3TC} is supported. */ + public final boolean GL_S3_s3tc; + + /** When true, deprecated functions are not available. */ + public final boolean forwardCompatible; + + /** Off-heap array of the above function addresses. */ + final PointerBuffer addresses; + + GLCapabilities(FunctionProvider provider, Set ext, boolean fc, IntFunction bufferFactory) { + forwardCompatible = fc; + + PointerBuffer caps = bufferFactory.apply(ADDRESS_BUFFER_SIZE); + + OpenGL11 = check_GL11(provider, caps, ext, fc); + OpenGL12 = check_GL12(provider, caps, ext); + OpenGL13 = check_GL13(provider, caps, ext, fc); + OpenGL14 = check_GL14(provider, caps, ext, fc); + OpenGL15 = check_GL15(provider, caps, ext); + OpenGL20 = check_GL20(provider, caps, ext); + OpenGL21 = check_GL21(provider, caps, ext); + OpenGL30 = check_GL30(provider, caps, ext); + OpenGL31 = check_GL31(provider, caps, ext); + OpenGL32 = check_GL32(provider, caps, ext); + OpenGL33 = check_GL33(provider, caps, ext, fc); + OpenGL40 = check_GL40(provider, caps, ext); + OpenGL41 = check_GL41(provider, caps, ext); + OpenGL42 = check_GL42(provider, caps, ext); + OpenGL43 = check_GL43(provider, caps, ext); + OpenGL44 = check_GL44(provider, caps, ext); + OpenGL45 = check_GL45(provider, caps, ext); + OpenGL46 = check_GL46(provider, caps, ext); + GL_3DFX_texture_compression_FXT1 = ext.contains("GL_3DFX_texture_compression_FXT1"); + GL_AMD_blend_minmax_factor = ext.contains("GL_AMD_blend_minmax_factor"); + GL_AMD_conservative_depth = ext.contains("GL_AMD_conservative_depth"); + GL_AMD_debug_output = check_AMD_debug_output(provider, caps, ext); + GL_AMD_depth_clamp_separate = ext.contains("GL_AMD_depth_clamp_separate"); + GL_AMD_draw_buffers_blend = check_AMD_draw_buffers_blend(provider, caps, ext); + GL_AMD_framebuffer_multisample_advanced = check_AMD_framebuffer_multisample_advanced(provider, caps, ext); + GL_AMD_gcn_shader = ext.contains("GL_AMD_gcn_shader"); + GL_AMD_gpu_shader_half_float = ext.contains("GL_AMD_gpu_shader_half_float"); + GL_AMD_gpu_shader_half_float_fetch = ext.contains("GL_AMD_gpu_shader_half_float_fetch"); + GL_AMD_gpu_shader_int16 = ext.contains("GL_AMD_gpu_shader_int16"); + GL_AMD_gpu_shader_int64 = check_AMD_gpu_shader_int64(provider, caps, ext); + GL_AMD_interleaved_elements = check_AMD_interleaved_elements(provider, caps, ext); + GL_AMD_occlusion_query_event = check_AMD_occlusion_query_event(provider, caps, ext); + GL_AMD_performance_monitor = check_AMD_performance_monitor(provider, caps, ext); + GL_AMD_pinned_memory = ext.contains("GL_AMD_pinned_memory"); + GL_AMD_query_buffer_object = ext.contains("GL_AMD_query_buffer_object"); + GL_AMD_sample_positions = check_AMD_sample_positions(provider, caps, ext); + GL_AMD_seamless_cubemap_per_texture = ext.contains("GL_AMD_seamless_cubemap_per_texture"); + GL_AMD_shader_atomic_counter_ops = ext.contains("GL_AMD_shader_atomic_counter_ops"); + GL_AMD_shader_ballot = ext.contains("GL_AMD_shader_ballot"); + GL_AMD_shader_explicit_vertex_parameter = ext.contains("GL_AMD_shader_explicit_vertex_parameter"); + GL_AMD_shader_image_load_store_lod = ext.contains("GL_AMD_shader_image_load_store_lod"); + GL_AMD_shader_stencil_export = ext.contains("GL_AMD_shader_stencil_export"); + GL_AMD_shader_trinary_minmax = ext.contains("GL_AMD_shader_trinary_minmax"); + GL_AMD_sparse_texture = check_AMD_sparse_texture(provider, caps, ext); + GL_AMD_stencil_operation_extended = check_AMD_stencil_operation_extended(provider, caps, ext); + GL_AMD_texture_gather_bias_lod = ext.contains("GL_AMD_texture_gather_bias_lod"); + GL_AMD_texture_texture4 = ext.contains("GL_AMD_texture_texture4"); + GL_AMD_transform_feedback3_lines_triangles = ext.contains("GL_AMD_transform_feedback3_lines_triangles"); + GL_AMD_transform_feedback4 = ext.contains("GL_AMD_transform_feedback4"); + GL_AMD_vertex_shader_layer = ext.contains("GL_AMD_vertex_shader_layer"); + GL_AMD_vertex_shader_tessellator = check_AMD_vertex_shader_tessellator(provider, caps, ext); + GL_AMD_vertex_shader_viewport_index = ext.contains("GL_AMD_vertex_shader_viewport_index"); + GL_ARB_arrays_of_arrays = ext.contains("GL_ARB_arrays_of_arrays"); + GL_ARB_base_instance = check_ARB_base_instance(provider, caps, ext); + GL_ARB_bindless_texture = check_ARB_bindless_texture(provider, caps, ext); + GL_ARB_blend_func_extended = check_ARB_blend_func_extended(provider, caps, ext); + GL_ARB_buffer_storage = check_ARB_buffer_storage(provider, caps, ext); + GL_ARB_clear_buffer_object = check_ARB_clear_buffer_object(provider, caps, ext); + GL_ARB_clear_texture = check_ARB_clear_texture(provider, caps, ext); + GL_ARB_clip_control = check_ARB_clip_control(provider, caps, ext); + GL_ARB_color_buffer_float = check_ARB_color_buffer_float(provider, caps, ext); + GL_ARB_compatibility = ext.contains("GL_ARB_compatibility"); + GL_ARB_compressed_texture_pixel_storage = ext.contains("GL_ARB_compressed_texture_pixel_storage"); + GL_ARB_compute_shader = check_ARB_compute_shader(provider, caps, ext); + GL_ARB_compute_variable_group_size = check_ARB_compute_variable_group_size(provider, caps, ext); + GL_ARB_conditional_render_inverted = ext.contains("GL_ARB_conditional_render_inverted"); + GL_ARB_conservative_depth = ext.contains("GL_ARB_conservative_depth"); + GL_ARB_copy_buffer = check_ARB_copy_buffer(provider, caps, ext); + GL_ARB_copy_image = check_ARB_copy_image(provider, caps, ext); + GL_ARB_cull_distance = ext.contains("GL_ARB_cull_distance"); + GL_ARB_debug_output = check_ARB_debug_output(provider, caps, ext); + GL_ARB_depth_buffer_float = ext.contains("GL_ARB_depth_buffer_float"); + GL_ARB_depth_clamp = ext.contains("GL_ARB_depth_clamp"); + GL_ARB_depth_texture = ext.contains("GL_ARB_depth_texture"); + GL_ARB_derivative_control = ext.contains("GL_ARB_derivative_control"); + GL_ARB_direct_state_access = check_ARB_direct_state_access(provider, caps, ext); + GL_ARB_draw_buffers = check_ARB_draw_buffers(provider, caps, ext); + GL_ARB_draw_buffers_blend = check_ARB_draw_buffers_blend(provider, caps, ext); + GL_ARB_draw_elements_base_vertex = check_ARB_draw_elements_base_vertex(provider, caps, ext); + GL_ARB_draw_indirect = check_ARB_draw_indirect(provider, caps, ext); + GL_ARB_draw_instanced = check_ARB_draw_instanced(provider, caps, ext); + GL_ARB_enhanced_layouts = ext.contains("GL_ARB_enhanced_layouts"); + GL_ARB_ES2_compatibility = check_ARB_ES2_compatibility(provider, caps, ext); + GL_ARB_ES3_1_compatibility = check_ARB_ES3_1_compatibility(provider, caps, ext); + GL_ARB_ES3_2_compatibility = check_ARB_ES3_2_compatibility(provider, caps, ext); + GL_ARB_ES3_compatibility = ext.contains("GL_ARB_ES3_compatibility"); + GL_ARB_explicit_attrib_location = ext.contains("GL_ARB_explicit_attrib_location"); + GL_ARB_explicit_uniform_location = ext.contains("GL_ARB_explicit_uniform_location"); + GL_ARB_fragment_coord_conventions = ext.contains("GL_ARB_fragment_coord_conventions"); + GL_ARB_fragment_layer_viewport = ext.contains("GL_ARB_fragment_layer_viewport"); + GL_ARB_fragment_program = ext.contains("GL_ARB_fragment_program"); + GL_ARB_fragment_program_shadow = ext.contains("GL_ARB_fragment_program_shadow"); + GL_ARB_fragment_shader = ext.contains("GL_ARB_fragment_shader"); + GL_ARB_fragment_shader_interlock = ext.contains("GL_ARB_fragment_shader_interlock"); + GL_ARB_framebuffer_no_attachments = check_ARB_framebuffer_no_attachments(provider, caps, ext); + GL_ARB_framebuffer_object = check_ARB_framebuffer_object(provider, caps, ext); + GL_ARB_framebuffer_sRGB = ext.contains("GL_ARB_framebuffer_sRGB"); + GL_ARB_geometry_shader4 = check_ARB_geometry_shader4(provider, caps, ext); + GL_ARB_get_program_binary = check_ARB_get_program_binary(provider, caps, ext); + GL_ARB_get_texture_sub_image = check_ARB_get_texture_sub_image(provider, caps, ext); + GL_ARB_gl_spirv = check_ARB_gl_spirv(provider, caps, ext); + GL_ARB_gpu_shader5 = ext.contains("GL_ARB_gpu_shader5"); + GL_ARB_gpu_shader_fp64 = check_ARB_gpu_shader_fp64(provider, caps, ext); + GL_ARB_gpu_shader_int64 = check_ARB_gpu_shader_int64(provider, caps, ext); + GL_ARB_half_float_pixel = ext.contains("GL_ARB_half_float_pixel"); + GL_ARB_half_float_vertex = ext.contains("GL_ARB_half_float_vertex"); + GL_ARB_imaging = check_ARB_imaging(provider, caps, ext, fc); + GL_ARB_indirect_parameters = check_ARB_indirect_parameters(provider, caps, ext); + GL_ARB_instanced_arrays = check_ARB_instanced_arrays(provider, caps, ext); + GL_ARB_internalformat_query = check_ARB_internalformat_query(provider, caps, ext); + GL_ARB_internalformat_query2 = check_ARB_internalformat_query2(provider, caps, ext); + GL_ARB_invalidate_subdata = check_ARB_invalidate_subdata(provider, caps, ext); + GL_ARB_map_buffer_alignment = ext.contains("GL_ARB_map_buffer_alignment"); + GL_ARB_map_buffer_range = check_ARB_map_buffer_range(provider, caps, ext); + GL_ARB_matrix_palette = check_ARB_matrix_palette(provider, caps, ext); + GL_ARB_multi_bind = check_ARB_multi_bind(provider, caps, ext); + GL_ARB_multi_draw_indirect = check_ARB_multi_draw_indirect(provider, caps, ext); + GL_ARB_multisample = check_ARB_multisample(provider, caps, ext); + GL_ARB_multitexture = check_ARB_multitexture(provider, caps, ext); + GL_ARB_occlusion_query = check_ARB_occlusion_query(provider, caps, ext); + GL_ARB_occlusion_query2 = ext.contains("GL_ARB_occlusion_query2"); + GL_ARB_parallel_shader_compile = check_ARB_parallel_shader_compile(provider, caps, ext); + GL_ARB_pipeline_statistics_query = ext.contains("GL_ARB_pipeline_statistics_query"); + GL_ARB_pixel_buffer_object = ext.contains("GL_ARB_pixel_buffer_object"); + GL_ARB_point_parameters = check_ARB_point_parameters(provider, caps, ext); + GL_ARB_point_sprite = ext.contains("GL_ARB_point_sprite"); + GL_ARB_polygon_offset_clamp = check_ARB_polygon_offset_clamp(provider, caps, ext); + GL_ARB_post_depth_coverage = ext.contains("GL_ARB_post_depth_coverage"); + GL_ARB_program_interface_query = check_ARB_program_interface_query(provider, caps, ext); + GL_ARB_provoking_vertex = check_ARB_provoking_vertex(provider, caps, ext); + GL_ARB_query_buffer_object = ext.contains("GL_ARB_query_buffer_object"); + GL_ARB_robust_buffer_access_behavior = ext.contains("GL_ARB_robust_buffer_access_behavior"); + GL_ARB_robustness = check_ARB_robustness(provider, caps, ext); + GL_ARB_robustness_application_isolation = ext.contains("GL_ARB_robustness_application_isolation"); + GL_ARB_robustness_share_group_isolation = ext.contains("GL_ARB_robustness_share_group_isolation"); + GL_ARB_sample_locations = check_ARB_sample_locations(provider, caps, ext); + GL_ARB_sample_shading = check_ARB_sample_shading(provider, caps, ext); + GL_ARB_sampler_objects = check_ARB_sampler_objects(provider, caps, ext); + GL_ARB_seamless_cube_map = ext.contains("GL_ARB_seamless_cube_map"); + GL_ARB_seamless_cubemap_per_texture = ext.contains("GL_ARB_seamless_cubemap_per_texture"); + GL_ARB_separate_shader_objects = check_ARB_separate_shader_objects(provider, caps, ext); + GL_ARB_shader_atomic_counter_ops = ext.contains("GL_ARB_shader_atomic_counter_ops"); + GL_ARB_shader_atomic_counters = check_ARB_shader_atomic_counters(provider, caps, ext); + GL_ARB_shader_ballot = ext.contains("GL_ARB_shader_ballot"); + GL_ARB_shader_bit_encoding = ext.contains("GL_ARB_shader_bit_encoding"); + GL_ARB_shader_clock = ext.contains("GL_ARB_shader_clock"); + GL_ARB_shader_draw_parameters = ext.contains("GL_ARB_shader_draw_parameters"); + GL_ARB_shader_group_vote = ext.contains("GL_ARB_shader_group_vote"); + GL_ARB_shader_image_load_store = check_ARB_shader_image_load_store(provider, caps, ext); + GL_ARB_shader_image_size = ext.contains("GL_ARB_shader_image_size"); + GL_ARB_shader_objects = check_ARB_shader_objects(provider, caps, ext); + GL_ARB_shader_precision = ext.contains("GL_ARB_shader_precision"); + GL_ARB_shader_stencil_export = ext.contains("GL_ARB_shader_stencil_export"); + GL_ARB_shader_storage_buffer_object = check_ARB_shader_storage_buffer_object(provider, caps, ext); + GL_ARB_shader_subroutine = check_ARB_shader_subroutine(provider, caps, ext); + GL_ARB_shader_texture_image_samples = ext.contains("GL_ARB_shader_texture_image_samples"); + GL_ARB_shader_texture_lod = ext.contains("GL_ARB_shader_texture_lod"); + GL_ARB_shader_viewport_layer_array = ext.contains("GL_ARB_shader_viewport_layer_array"); + GL_ARB_shading_language_100 = ext.contains("GL_ARB_shading_language_100"); + GL_ARB_shading_language_420pack = ext.contains("GL_ARB_shading_language_420pack"); + GL_ARB_shading_language_include = check_ARB_shading_language_include(provider, caps, ext); + GL_ARB_shading_language_packing = ext.contains("GL_ARB_shading_language_packing"); + GL_ARB_shadow = ext.contains("GL_ARB_shadow"); + GL_ARB_shadow_ambient = ext.contains("GL_ARB_shadow_ambient"); + GL_ARB_sparse_buffer = check_ARB_sparse_buffer(provider, caps, ext); + GL_ARB_sparse_texture = check_ARB_sparse_texture(provider, caps, ext); + GL_ARB_sparse_texture2 = ext.contains("GL_ARB_sparse_texture2"); + GL_ARB_sparse_texture_clamp = ext.contains("GL_ARB_sparse_texture_clamp"); + GL_ARB_spirv_extensions = ext.contains("GL_ARB_spirv_extensions"); + GL_ARB_stencil_texturing = ext.contains("GL_ARB_stencil_texturing"); + GL_ARB_sync = check_ARB_sync(provider, caps, ext); + GL_ARB_tessellation_shader = check_ARB_tessellation_shader(provider, caps, ext); + GL_ARB_texture_barrier = check_ARB_texture_barrier(provider, caps, ext); + GL_ARB_texture_border_clamp = ext.contains("GL_ARB_texture_border_clamp"); + GL_ARB_texture_buffer_object = check_ARB_texture_buffer_object(provider, caps, ext); + GL_ARB_texture_buffer_object_rgb32 = ext.contains("GL_ARB_texture_buffer_object_rgb32"); + GL_ARB_texture_buffer_range = check_ARB_texture_buffer_range(provider, caps, ext); + GL_ARB_texture_compression = check_ARB_texture_compression(provider, caps, ext); + GL_ARB_texture_compression_bptc = ext.contains("GL_ARB_texture_compression_bptc"); + GL_ARB_texture_compression_rgtc = ext.contains("GL_ARB_texture_compression_rgtc"); + GL_ARB_texture_cube_map = ext.contains("GL_ARB_texture_cube_map"); + GL_ARB_texture_cube_map_array = ext.contains("GL_ARB_texture_cube_map_array"); + GL_ARB_texture_env_add = ext.contains("GL_ARB_texture_env_add"); + GL_ARB_texture_env_combine = ext.contains("GL_ARB_texture_env_combine"); + GL_ARB_texture_env_crossbar = ext.contains("GL_ARB_texture_env_crossbar"); + GL_ARB_texture_env_dot3 = ext.contains("GL_ARB_texture_env_dot3"); + GL_ARB_texture_filter_anisotropic = ext.contains("GL_ARB_texture_filter_anisotropic"); + GL_ARB_texture_filter_minmax = ext.contains("GL_ARB_texture_filter_minmax"); + GL_ARB_texture_float = ext.contains("GL_ARB_texture_float"); + GL_ARB_texture_gather = ext.contains("GL_ARB_texture_gather"); + GL_ARB_texture_mirror_clamp_to_edge = ext.contains("GL_ARB_texture_mirror_clamp_to_edge"); + GL_ARB_texture_mirrored_repeat = ext.contains("GL_ARB_texture_mirrored_repeat"); + GL_ARB_texture_multisample = check_ARB_texture_multisample(provider, caps, ext); + GL_ARB_texture_non_power_of_two = ext.contains("GL_ARB_texture_non_power_of_two"); + GL_ARB_texture_query_levels = ext.contains("GL_ARB_texture_query_levels"); + GL_ARB_texture_query_lod = ext.contains("GL_ARB_texture_query_lod"); + GL_ARB_texture_rectangle = ext.contains("GL_ARB_texture_rectangle"); + GL_ARB_texture_rg = ext.contains("GL_ARB_texture_rg"); + GL_ARB_texture_rgb10_a2ui = ext.contains("GL_ARB_texture_rgb10_a2ui"); + GL_ARB_texture_stencil8 = ext.contains("GL_ARB_texture_stencil8"); + GL_ARB_texture_storage = check_ARB_texture_storage(provider, caps, ext); + GL_ARB_texture_storage_multisample = check_ARB_texture_storage_multisample(provider, caps, ext); + GL_ARB_texture_swizzle = ext.contains("GL_ARB_texture_swizzle"); + GL_ARB_texture_view = check_ARB_texture_view(provider, caps, ext); + GL_ARB_timer_query = check_ARB_timer_query(provider, caps, ext); + GL_ARB_transform_feedback2 = check_ARB_transform_feedback2(provider, caps, ext); + GL_ARB_transform_feedback3 = check_ARB_transform_feedback3(provider, caps, ext); + GL_ARB_transform_feedback_instanced = check_ARB_transform_feedback_instanced(provider, caps, ext); + GL_ARB_transform_feedback_overflow_query = ext.contains("GL_ARB_transform_feedback_overflow_query"); + GL_ARB_transpose_matrix = check_ARB_transpose_matrix(provider, caps, ext); + GL_ARB_uniform_buffer_object = check_ARB_uniform_buffer_object(provider, caps, ext); + GL_ARB_vertex_array_bgra = ext.contains("GL_ARB_vertex_array_bgra"); + GL_ARB_vertex_array_object = check_ARB_vertex_array_object(provider, caps, ext); + GL_ARB_vertex_attrib_64bit = check_ARB_vertex_attrib_64bit(provider, caps, ext); + GL_ARB_vertex_attrib_binding = check_ARB_vertex_attrib_binding(provider, caps, ext); + GL_ARB_vertex_blend = check_ARB_vertex_blend(provider, caps, ext); + GL_ARB_vertex_buffer_object = check_ARB_vertex_buffer_object(provider, caps, ext); + GL_ARB_vertex_program = check_ARB_vertex_program(provider, caps, ext); + GL_ARB_vertex_shader = check_ARB_vertex_shader(provider, caps, ext); + GL_ARB_vertex_type_10f_11f_11f_rev = ext.contains("GL_ARB_vertex_type_10f_11f_11f_rev"); + GL_ARB_vertex_type_2_10_10_10_rev = check_ARB_vertex_type_2_10_10_10_rev(provider, caps, ext, fc); + GL_ARB_viewport_array = check_ARB_viewport_array(provider, caps, ext); + GL_ARB_window_pos = check_ARB_window_pos(provider, caps, ext); + GL_ATI_meminfo = ext.contains("GL_ATI_meminfo"); + GL_ATI_shader_texture_lod = ext.contains("GL_ATI_shader_texture_lod"); + GL_ATI_texture_compression_3dc = ext.contains("GL_ATI_texture_compression_3dc"); + GL_EXT_422_pixels = ext.contains("GL_EXT_422_pixels"); + GL_EXT_abgr = ext.contains("GL_EXT_abgr"); + GL_EXT_bgra = ext.contains("GL_EXT_bgra"); + GL_EXT_bindable_uniform = check_EXT_bindable_uniform(provider, caps, ext); + GL_EXT_blend_color = check_EXT_blend_color(provider, caps, ext); + GL_EXT_blend_equation_separate = check_EXT_blend_equation_separate(provider, caps, ext); + GL_EXT_blend_func_separate = check_EXT_blend_func_separate(provider, caps, ext); + GL_EXT_blend_minmax = check_EXT_blend_minmax(provider, caps, ext); + GL_EXT_blend_subtract = ext.contains("GL_EXT_blend_subtract"); + GL_EXT_clip_volume_hint = ext.contains("GL_EXT_clip_volume_hint"); + GL_EXT_compiled_vertex_array = check_EXT_compiled_vertex_array(provider, caps, ext); + GL_EXT_debug_label = check_EXT_debug_label(provider, caps, ext); + GL_EXT_debug_marker = check_EXT_debug_marker(provider, caps, ext); + GL_EXT_depth_bounds_test = check_EXT_depth_bounds_test(provider, caps, ext); + GL_EXT_direct_state_access = check_EXT_direct_state_access(provider, caps, ext); + GL_EXT_draw_buffers2 = check_EXT_draw_buffers2(provider, caps, ext); + GL_EXT_draw_instanced = check_EXT_draw_instanced(provider, caps, ext); + GL_EXT_EGL_image_storage = check_EXT_EGL_image_storage(provider, caps, ext); + GL_EXT_EGL_sync = ext.contains("GL_EXT_EGL_sync"); + GL_EXT_external_buffer = check_EXT_external_buffer(provider, caps, ext); + GL_EXT_framebuffer_blit = check_EXT_framebuffer_blit(provider, caps, ext); + GL_EXT_framebuffer_blit_layers = check_EXT_framebuffer_blit_layers(provider, caps, ext); + GL_EXT_framebuffer_multisample = check_EXT_framebuffer_multisample(provider, caps, ext); + GL_EXT_framebuffer_multisample_blit_scaled = ext.contains("GL_EXT_framebuffer_multisample_blit_scaled"); + GL_EXT_framebuffer_object = check_EXT_framebuffer_object(provider, caps, ext); + GL_EXT_framebuffer_sRGB = ext.contains("GL_EXT_framebuffer_sRGB"); + GL_EXT_geometry_shader4 = check_EXT_geometry_shader4(provider, caps, ext); + GL_EXT_gpu_program_parameters = check_EXT_gpu_program_parameters(provider, caps, ext); + GL_EXT_gpu_shader4 = check_EXT_gpu_shader4(provider, caps, ext); + GL_EXT_memory_object = check_EXT_memory_object(provider, caps, ext); + GL_EXT_memory_object_fd = check_EXT_memory_object_fd(provider, caps, ext); + GL_EXT_memory_object_win32 = check_EXT_memory_object_win32(provider, caps, ext); + GL_EXT_multiview_tessellation_geometry_shader = ext.contains("GL_EXT_multiview_tessellation_geometry_shader"); + GL_EXT_multiview_texture_multisample = ext.contains("GL_EXT_multiview_texture_multisample"); + GL_EXT_multiview_timer_query = ext.contains("GL_EXT_multiview_timer_query"); + GL_EXT_packed_depth_stencil = ext.contains("GL_EXT_packed_depth_stencil"); + GL_EXT_packed_float = ext.contains("GL_EXT_packed_float"); + GL_EXT_pixel_buffer_object = ext.contains("GL_EXT_pixel_buffer_object"); + GL_EXT_point_parameters = check_EXT_point_parameters(provider, caps, ext); + GL_EXT_polygon_offset_clamp = check_EXT_polygon_offset_clamp(provider, caps, ext); + GL_EXT_post_depth_coverage = ext.contains("GL_EXT_post_depth_coverage"); + GL_EXT_provoking_vertex = check_EXT_provoking_vertex(provider, caps, ext); + GL_EXT_raster_multisample = check_EXT_raster_multisample(provider, caps, ext); + GL_EXT_secondary_color = check_EXT_secondary_color(provider, caps, ext); + GL_EXT_semaphore = check_EXT_semaphore(provider, caps, ext); + GL_EXT_semaphore_fd = check_EXT_semaphore_fd(provider, caps, ext); + GL_EXT_semaphore_win32 = check_EXT_semaphore_win32(provider, caps, ext); + GL_EXT_separate_shader_objects = check_EXT_separate_shader_objects(provider, caps, ext); + GL_EXT_shader_framebuffer_fetch = ext.contains("GL_EXT_shader_framebuffer_fetch"); + GL_EXT_shader_framebuffer_fetch_non_coherent = check_EXT_shader_framebuffer_fetch_non_coherent(provider, caps, ext); + GL_EXT_shader_image_load_formatted = ext.contains("GL_EXT_shader_image_load_formatted"); + GL_EXT_shader_image_load_store = check_EXT_shader_image_load_store(provider, caps, ext); + GL_EXT_shader_integer_mix = ext.contains("GL_EXT_shader_integer_mix"); + GL_EXT_shader_samples_identical = ext.contains("GL_EXT_shader_samples_identical"); + GL_EXT_shadow_funcs = ext.contains("GL_EXT_shadow_funcs"); + GL_EXT_shared_texture_palette = ext.contains("GL_EXT_shared_texture_palette"); + GL_EXT_sparse_texture2 = ext.contains("GL_EXT_sparse_texture2"); + GL_EXT_stencil_clear_tag = check_EXT_stencil_clear_tag(provider, caps, ext); + GL_EXT_stencil_two_side = check_EXT_stencil_two_side(provider, caps, ext); + GL_EXT_stencil_wrap = ext.contains("GL_EXT_stencil_wrap"); + GL_EXT_texture_array = check_EXT_texture_array(provider, caps, ext); + GL_EXT_texture_buffer_object = check_EXT_texture_buffer_object(provider, caps, ext); + GL_EXT_texture_compression_latc = ext.contains("GL_EXT_texture_compression_latc"); + GL_EXT_texture_compression_rgtc = ext.contains("GL_EXT_texture_compression_rgtc"); + GL_EXT_texture_compression_s3tc = ext.contains("GL_EXT_texture_compression_s3tc"); + GL_EXT_texture_filter_anisotropic = ext.contains("GL_EXT_texture_filter_anisotropic"); + GL_EXT_texture_filter_minmax = ext.contains("GL_EXT_texture_filter_minmax"); + GL_EXT_texture_integer = check_EXT_texture_integer(provider, caps, ext); + GL_EXT_texture_mirror_clamp = ext.contains("GL_EXT_texture_mirror_clamp"); + GL_EXT_texture_shadow_lod = ext.contains("GL_EXT_texture_shadow_lod"); + GL_EXT_texture_shared_exponent = ext.contains("GL_EXT_texture_shared_exponent"); + GL_EXT_texture_snorm = ext.contains("GL_EXT_texture_snorm"); + GL_EXT_texture_sRGB = ext.contains("GL_EXT_texture_sRGB"); + GL_EXT_texture_sRGB_decode = ext.contains("GL_EXT_texture_sRGB_decode"); + GL_EXT_texture_sRGB_R8 = ext.contains("GL_EXT_texture_sRGB_R8"); + GL_EXT_texture_sRGB_RG8 = ext.contains("GL_EXT_texture_sRGB_RG8"); + GL_EXT_texture_storage = check_EXT_texture_storage(provider, caps, ext); + GL_EXT_texture_swizzle = ext.contains("GL_EXT_texture_swizzle"); + GL_EXT_timer_query = check_EXT_timer_query(provider, caps, ext); + GL_EXT_transform_feedback = check_EXT_transform_feedback(provider, caps, ext); + GL_EXT_vertex_array_bgra = ext.contains("GL_EXT_vertex_array_bgra"); + GL_EXT_vertex_attrib_64bit = check_EXT_vertex_attrib_64bit(provider, caps, ext); + GL_EXT_win32_keyed_mutex = check_EXT_win32_keyed_mutex(provider, caps, ext); + GL_EXT_window_rectangles = check_EXT_window_rectangles(provider, caps, ext); + GL_EXT_x11_sync_object = check_EXT_x11_sync_object(provider, caps, ext); + GL_GREMEDY_frame_terminator = check_GREMEDY_frame_terminator(provider, caps, ext); + GL_GREMEDY_string_marker = check_GREMEDY_string_marker(provider, caps, ext); + GL_INTEL_blackhole_render = ext.contains("GL_INTEL_blackhole_render"); + GL_INTEL_conservative_rasterization = ext.contains("GL_INTEL_conservative_rasterization"); + GL_INTEL_fragment_shader_ordering = ext.contains("GL_INTEL_fragment_shader_ordering"); + GL_INTEL_framebuffer_CMAA = check_INTEL_framebuffer_CMAA(provider, caps, ext); + GL_INTEL_map_texture = check_INTEL_map_texture(provider, caps, ext); + GL_INTEL_performance_query = check_INTEL_performance_query(provider, caps, ext); + GL_INTEL_shader_integer_functions2 = ext.contains("GL_INTEL_shader_integer_functions2"); + GL_KHR_blend_equation_advanced = check_KHR_blend_equation_advanced(provider, caps, ext); + GL_KHR_blend_equation_advanced_coherent = ext.contains("GL_KHR_blend_equation_advanced_coherent"); + GL_KHR_context_flush_control = ext.contains("GL_KHR_context_flush_control"); + GL_KHR_debug = check_KHR_debug(provider, caps, ext); + GL_KHR_no_error = ext.contains("GL_KHR_no_error"); + GL_KHR_parallel_shader_compile = check_KHR_parallel_shader_compile(provider, caps, ext); + GL_KHR_robust_buffer_access_behavior = ext.contains("GL_KHR_robust_buffer_access_behavior"); + GL_KHR_robustness = check_KHR_robustness(provider, caps, ext); + GL_KHR_shader_subgroup = ext.contains("GL_KHR_shader_subgroup"); + GL_KHR_texture_compression_astc_hdr = ext.contains("GL_KHR_texture_compression_astc_hdr"); + GL_KHR_texture_compression_astc_ldr = ext.contains("GL_KHR_texture_compression_astc_ldr"); + GL_KHR_texture_compression_astc_sliced_3d = ext.contains("GL_KHR_texture_compression_astc_sliced_3d"); + GL_MESA_framebuffer_flip_x = ext.contains("GL_MESA_framebuffer_flip_x"); + GL_MESA_framebuffer_flip_y = check_MESA_framebuffer_flip_y(provider, caps, ext); + GL_MESA_framebuffer_swap_xy = ext.contains("GL_MESA_framebuffer_swap_xy"); + GL_MESA_tile_raster_order = ext.contains("GL_MESA_tile_raster_order"); + GL_NV_alpha_to_coverage_dither_control = check_NV_alpha_to_coverage_dither_control(provider, caps, ext); + GL_NV_bindless_multi_draw_indirect = check_NV_bindless_multi_draw_indirect(provider, caps, ext); + GL_NV_bindless_multi_draw_indirect_count = check_NV_bindless_multi_draw_indirect_count(provider, caps, ext); + GL_NV_bindless_texture = check_NV_bindless_texture(provider, caps, ext); + GL_NV_blend_equation_advanced = check_NV_blend_equation_advanced(provider, caps, ext); + GL_NV_blend_equation_advanced_coherent = ext.contains("GL_NV_blend_equation_advanced_coherent"); + GL_NV_blend_minmax_factor = ext.contains("GL_NV_blend_minmax_factor"); + GL_NV_blend_square = ext.contains("GL_NV_blend_square"); + GL_NV_clip_space_w_scaling = check_NV_clip_space_w_scaling(provider, caps, ext); + GL_NV_command_list = check_NV_command_list(provider, caps, ext); + GL_NV_compute_shader_derivatives = ext.contains("GL_NV_compute_shader_derivatives"); + GL_NV_conditional_render = check_NV_conditional_render(provider, caps, ext); + GL_NV_conservative_raster = check_NV_conservative_raster(provider, caps, ext); + GL_NV_conservative_raster_dilate = check_NV_conservative_raster_dilate(provider, caps, ext); + GL_NV_conservative_raster_pre_snap = ext.contains("GL_NV_conservative_raster_pre_snap"); + GL_NV_conservative_raster_pre_snap_triangles = check_NV_conservative_raster_pre_snap_triangles(provider, caps, ext); + GL_NV_conservative_raster_underestimation = ext.contains("GL_NV_conservative_raster_underestimation"); + GL_NV_copy_depth_to_color = ext.contains("GL_NV_copy_depth_to_color"); + GL_NV_copy_image = check_NV_copy_image(provider, caps, ext); + GL_NV_deep_texture3D = ext.contains("GL_NV_deep_texture3D"); + GL_NV_depth_buffer_float = check_NV_depth_buffer_float(provider, caps, ext); + GL_NV_depth_clamp = ext.contains("GL_NV_depth_clamp"); + GL_NV_draw_texture = check_NV_draw_texture(provider, caps, ext); + GL_NV_draw_vulkan_image = check_NV_draw_vulkan_image(provider, caps, ext); + GL_NV_ES3_1_compatibility = ext.contains("GL_NV_ES3_1_compatibility"); + GL_NV_explicit_multisample = check_NV_explicit_multisample(provider, caps, ext); + GL_NV_fence = check_NV_fence(provider, caps, ext); + GL_NV_fill_rectangle = ext.contains("GL_NV_fill_rectangle"); + GL_NV_float_buffer = ext.contains("GL_NV_float_buffer"); + GL_NV_fog_distance = ext.contains("GL_NV_fog_distance"); + GL_NV_fragment_coverage_to_color = check_NV_fragment_coverage_to_color(provider, caps, ext); + GL_NV_fragment_program4 = ext.contains("GL_NV_fragment_program4"); + GL_NV_fragment_program_option = ext.contains("GL_NV_fragment_program_option"); + GL_NV_fragment_shader_barycentric = ext.contains("GL_NV_fragment_shader_barycentric"); + GL_NV_fragment_shader_interlock = ext.contains("GL_NV_fragment_shader_interlock"); + GL_NV_framebuffer_mixed_samples = check_NV_framebuffer_mixed_samples(provider, caps, ext); + GL_NV_framebuffer_multisample_coverage = check_NV_framebuffer_multisample_coverage(provider, caps, ext); + GL_NV_geometry_shader4 = ext.contains("GL_NV_geometry_shader4"); + GL_NV_geometry_shader_passthrough = ext.contains("GL_NV_geometry_shader_passthrough"); + GL_NV_gpu_multicast = check_NV_gpu_multicast(provider, caps, ext); + GL_NV_gpu_shader5 = check_NV_gpu_shader5(provider, caps, ext); + GL_NV_half_float = check_NV_half_float(provider, caps, ext); + GL_NV_internalformat_sample_query = check_NV_internalformat_sample_query(provider, caps, ext); + GL_NV_light_max_exponent = ext.contains("GL_NV_light_max_exponent"); + GL_NV_memory_attachment = check_NV_memory_attachment(provider, caps, ext); + GL_NV_memory_object_sparse = check_NV_memory_object_sparse(provider, caps, ext); + GL_NV_mesh_shader = check_NV_mesh_shader(provider, caps, ext); + GL_NV_multisample_coverage = ext.contains("GL_NV_multisample_coverage"); + GL_NV_multisample_filter_hint = ext.contains("GL_NV_multisample_filter_hint"); + GL_NV_packed_depth_stencil = ext.contains("GL_NV_packed_depth_stencil"); + GL_NV_path_rendering = check_NV_path_rendering(provider, caps, ext); + GL_NV_path_rendering_shared_edge = ext.contains("GL_NV_path_rendering_shared_edge"); + GL_NV_pixel_data_range = check_NV_pixel_data_range(provider, caps, ext); + GL_NV_point_sprite = check_NV_point_sprite(provider, caps, ext); + GL_NV_primitive_restart = check_NV_primitive_restart(provider, caps, ext); + GL_NV_primitive_shading_rate = ext.contains("GL_NV_primitive_shading_rate"); + GL_NV_query_resource = check_NV_query_resource(provider, caps, ext); + GL_NV_query_resource_tag = check_NV_query_resource_tag(provider, caps, ext); + GL_NV_representative_fragment_test = ext.contains("GL_NV_representative_fragment_test"); + GL_NV_robustness_video_memory_purge = ext.contains("GL_NV_robustness_video_memory_purge"); + GL_NV_sample_locations = check_NV_sample_locations(provider, caps, ext); + GL_NV_sample_mask_override_coverage = ext.contains("GL_NV_sample_mask_override_coverage"); + GL_NV_scissor_exclusive = check_NV_scissor_exclusive(provider, caps, ext); + GL_NV_shader_atomic_float = ext.contains("GL_NV_shader_atomic_float"); + GL_NV_shader_atomic_float64 = ext.contains("GL_NV_shader_atomic_float64"); + GL_NV_shader_atomic_fp16_vector = ext.contains("GL_NV_shader_atomic_fp16_vector"); + GL_NV_shader_atomic_int64 = ext.contains("GL_NV_shader_atomic_int64"); + GL_NV_shader_buffer_load = check_NV_shader_buffer_load(provider, caps, ext); + GL_NV_shader_buffer_store = ext.contains("GL_NV_shader_buffer_store"); + GL_NV_shader_subgroup_partitioned = ext.contains("GL_NV_shader_subgroup_partitioned"); + GL_NV_shader_texture_footprint = ext.contains("GL_NV_shader_texture_footprint"); + GL_NV_shader_thread_group = ext.contains("GL_NV_shader_thread_group"); + GL_NV_shader_thread_shuffle = ext.contains("GL_NV_shader_thread_shuffle"); + GL_NV_shading_rate_image = check_NV_shading_rate_image(provider, caps, ext); + GL_NV_stereo_view_rendering = ext.contains("GL_NV_stereo_view_rendering"); + GL_NV_texgen_reflection = ext.contains("GL_NV_texgen_reflection"); + GL_NV_texture_barrier = check_NV_texture_barrier(provider, caps, ext); + GL_NV_texture_compression_vtc = ext.contains("GL_NV_texture_compression_vtc"); + GL_NV_texture_multisample = check_NV_texture_multisample(provider, caps, ext); + GL_NV_texture_rectangle_compressed = ext.contains("GL_NV_texture_rectangle_compressed"); + GL_NV_texture_shader = ext.contains("GL_NV_texture_shader"); + GL_NV_texture_shader2 = ext.contains("GL_NV_texture_shader2"); + GL_NV_texture_shader3 = ext.contains("GL_NV_texture_shader3"); + GL_NV_timeline_semaphore = check_NV_timeline_semaphore(provider, caps, ext); + GL_NV_transform_feedback = check_NV_transform_feedback(provider, caps, ext); + GL_NV_transform_feedback2 = check_NV_transform_feedback2(provider, caps, ext); + GL_NV_uniform_buffer_std430_layout = ext.contains("GL_NV_uniform_buffer_std430_layout"); + GL_NV_uniform_buffer_unified_memory = ext.contains("GL_NV_uniform_buffer_unified_memory"); + GL_NV_vertex_array_range = check_NV_vertex_array_range(provider, caps, ext); + GL_NV_vertex_array_range2 = ext.contains("GL_NV_vertex_array_range2"); + GL_NV_vertex_attrib_integer_64bit = check_NV_vertex_attrib_integer_64bit(provider, caps, ext); + GL_NV_vertex_buffer_unified_memory = check_NV_vertex_buffer_unified_memory(provider, caps, ext); + GL_NV_viewport_array2 = ext.contains("GL_NV_viewport_array2"); + GL_NV_viewport_swizzle = check_NV_viewport_swizzle(provider, caps, ext); + GL_NVX_blend_equation_advanced_multi_draw_buffers = ext.contains("GL_NVX_blend_equation_advanced_multi_draw_buffers"); + GL_NVX_conditional_render = check_NVX_conditional_render(provider, caps, ext); + GL_NVX_gpu_memory_info = ext.contains("GL_NVX_gpu_memory_info"); + GL_NVX_gpu_multicast2 = check_NVX_gpu_multicast2(provider, caps, ext); + GL_NVX_progress_fence = check_NVX_progress_fence(provider, caps, ext); + GL_OVR_multiview = check_OVR_multiview(provider, caps, ext); + GL_OVR_multiview2 = ext.contains("GL_OVR_multiview2"); + GL_S3_s3tc = ext.contains("GL_S3_s3tc"); + + glEnable = caps.get(0); + glDisable = caps.get(1); + glAccum = caps.get(2); + glAlphaFunc = caps.get(3); + glAreTexturesResident = caps.get(4); + glArrayElement = caps.get(5); + glBegin = caps.get(6); + glBindTexture = caps.get(7); + glBitmap = caps.get(8); + glBlendFunc = caps.get(9); + glCallList = caps.get(10); + glCallLists = caps.get(11); + glClear = caps.get(12); + glClearAccum = caps.get(13); + glClearColor = caps.get(14); + glClearDepth = caps.get(15); + glClearIndex = caps.get(16); + glClearStencil = caps.get(17); + glClipPlane = caps.get(18); + glColor3b = caps.get(19); + glColor3s = caps.get(20); + glColor3i = caps.get(21); + glColor3f = caps.get(22); + glColor3d = caps.get(23); + glColor3ub = caps.get(24); + glColor3us = caps.get(25); + glColor3ui = caps.get(26); + glColor3bv = caps.get(27); + glColor3sv = caps.get(28); + glColor3iv = caps.get(29); + glColor3fv = caps.get(30); + glColor3dv = caps.get(31); + glColor3ubv = caps.get(32); + glColor3usv = caps.get(33); + glColor3uiv = caps.get(34); + glColor4b = caps.get(35); + glColor4s = caps.get(36); + glColor4i = caps.get(37); + glColor4f = caps.get(38); + glColor4d = caps.get(39); + glColor4ub = caps.get(40); + glColor4us = caps.get(41); + glColor4ui = caps.get(42); + glColor4bv = caps.get(43); + glColor4sv = caps.get(44); + glColor4iv = caps.get(45); + glColor4fv = caps.get(46); + glColor4dv = caps.get(47); + glColor4ubv = caps.get(48); + glColor4usv = caps.get(49); + glColor4uiv = caps.get(50); + glColorMask = caps.get(51); + glColorMaterial = caps.get(52); + glColorPointer = caps.get(53); + glCopyPixels = caps.get(54); + glCullFace = caps.get(55); + glDeleteLists = caps.get(56); + glDepthFunc = caps.get(57); + glDepthMask = caps.get(58); + glDepthRange = caps.get(59); + glDisableClientState = caps.get(60); + glDrawArrays = caps.get(61); + glDrawBuffer = caps.get(62); + glDrawElements = caps.get(63); + glDrawPixels = caps.get(64); + glEdgeFlag = caps.get(65); + glEdgeFlagv = caps.get(66); + glEdgeFlagPointer = caps.get(67); + glEnableClientState = caps.get(68); + glEnd = caps.get(69); + glEvalCoord1f = caps.get(70); + glEvalCoord1fv = caps.get(71); + glEvalCoord1d = caps.get(72); + glEvalCoord1dv = caps.get(73); + glEvalCoord2f = caps.get(74); + glEvalCoord2fv = caps.get(75); + glEvalCoord2d = caps.get(76); + glEvalCoord2dv = caps.get(77); + glEvalMesh1 = caps.get(78); + glEvalMesh2 = caps.get(79); + glEvalPoint1 = caps.get(80); + glEvalPoint2 = caps.get(81); + glFeedbackBuffer = caps.get(82); + glFinish = caps.get(83); + glFlush = caps.get(84); + glFogi = caps.get(85); + glFogiv = caps.get(86); + glFogf = caps.get(87); + glFogfv = caps.get(88); + glFrontFace = caps.get(89); + glGenLists = caps.get(90); + glGenTextures = caps.get(91); + glDeleteTextures = caps.get(92); + glGetClipPlane = caps.get(93); + glGetBooleanv = caps.get(94); + glGetFloatv = caps.get(95); + glGetIntegerv = caps.get(96); + glGetDoublev = caps.get(97); + glGetError = caps.get(98); + glGetLightiv = caps.get(99); + glGetLightfv = caps.get(100); + glGetMapiv = caps.get(101); + glGetMapfv = caps.get(102); + glGetMapdv = caps.get(103); + glGetMaterialiv = caps.get(104); + glGetMaterialfv = caps.get(105); + glGetPixelMapfv = caps.get(106); + glGetPixelMapusv = caps.get(107); + glGetPixelMapuiv = caps.get(108); + glGetPointerv = caps.get(109); + glGetPolygonStipple = caps.get(110); + glGetString = caps.get(111); + glGetTexEnviv = caps.get(112); + glGetTexEnvfv = caps.get(113); + glGetTexGeniv = caps.get(114); + glGetTexGenfv = caps.get(115); + glGetTexGendv = caps.get(116); + glGetTexImage = caps.get(117); + glGetTexLevelParameteriv = caps.get(118); + glGetTexLevelParameterfv = caps.get(119); + glGetTexParameteriv = caps.get(120); + glGetTexParameterfv = caps.get(121); + glHint = caps.get(122); + glIndexi = caps.get(123); + glIndexub = caps.get(124); + glIndexs = caps.get(125); + glIndexf = caps.get(126); + glIndexd = caps.get(127); + glIndexiv = caps.get(128); + glIndexubv = caps.get(129); + glIndexsv = caps.get(130); + glIndexfv = caps.get(131); + glIndexdv = caps.get(132); + glIndexMask = caps.get(133); + glIndexPointer = caps.get(134); + glInitNames = caps.get(135); + glInterleavedArrays = caps.get(136); + glIsEnabled = caps.get(137); + glIsList = caps.get(138); + glIsTexture = caps.get(139); + glLightModeli = caps.get(140); + glLightModelf = caps.get(141); + glLightModeliv = caps.get(142); + glLightModelfv = caps.get(143); + glLighti = caps.get(144); + glLightf = caps.get(145); + glLightiv = caps.get(146); + glLightfv = caps.get(147); + glLineStipple = caps.get(148); + glLineWidth = caps.get(149); + glListBase = caps.get(150); + glLoadMatrixf = caps.get(151); + glLoadMatrixd = caps.get(152); + glLoadIdentity = caps.get(153); + glLoadName = caps.get(154); + glLogicOp = caps.get(155); + glMap1f = caps.get(156); + glMap1d = caps.get(157); + glMap2f = caps.get(158); + glMap2d = caps.get(159); + glMapGrid1f = caps.get(160); + glMapGrid1d = caps.get(161); + glMapGrid2f = caps.get(162); + glMapGrid2d = caps.get(163); + glMateriali = caps.get(164); + glMaterialf = caps.get(165); + glMaterialiv = caps.get(166); + glMaterialfv = caps.get(167); + glMatrixMode = caps.get(168); + glMultMatrixf = caps.get(169); + glMultMatrixd = caps.get(170); + glFrustum = caps.get(171); + glNewList = caps.get(172); + glEndList = caps.get(173); + glNormal3f = caps.get(174); + glNormal3b = caps.get(175); + glNormal3s = caps.get(176); + glNormal3i = caps.get(177); + glNormal3d = caps.get(178); + glNormal3fv = caps.get(179); + glNormal3bv = caps.get(180); + glNormal3sv = caps.get(181); + glNormal3iv = caps.get(182); + glNormal3dv = caps.get(183); + glNormalPointer = caps.get(184); + glOrtho = caps.get(185); + glPassThrough = caps.get(186); + glPixelMapfv = caps.get(187); + glPixelMapusv = caps.get(188); + glPixelMapuiv = caps.get(189); + glPixelStorei = caps.get(190); + glPixelStoref = caps.get(191); + glPixelTransferi = caps.get(192); + glPixelTransferf = caps.get(193); + glPixelZoom = caps.get(194); + glPointSize = caps.get(195); + glPolygonMode = caps.get(196); + glPolygonOffset = caps.get(197); + glPolygonStipple = caps.get(198); + glPushAttrib = caps.get(199); + glPushClientAttrib = caps.get(200); + glPopAttrib = caps.get(201); + glPopClientAttrib = caps.get(202); + glPopMatrix = caps.get(203); + glPopName = caps.get(204); + glPrioritizeTextures = caps.get(205); + glPushMatrix = caps.get(206); + glPushName = caps.get(207); + glRasterPos2i = caps.get(208); + glRasterPos2s = caps.get(209); + glRasterPos2f = caps.get(210); + glRasterPos2d = caps.get(211); + glRasterPos2iv = caps.get(212); + glRasterPos2sv = caps.get(213); + glRasterPos2fv = caps.get(214); + glRasterPos2dv = caps.get(215); + glRasterPos3i = caps.get(216); + glRasterPos3s = caps.get(217); + glRasterPos3f = caps.get(218); + glRasterPos3d = caps.get(219); + glRasterPos3iv = caps.get(220); + glRasterPos3sv = caps.get(221); + glRasterPos3fv = caps.get(222); + glRasterPos3dv = caps.get(223); + glRasterPos4i = caps.get(224); + glRasterPos4s = caps.get(225); + glRasterPos4f = caps.get(226); + glRasterPos4d = caps.get(227); + glRasterPos4iv = caps.get(228); + glRasterPos4sv = caps.get(229); + glRasterPos4fv = caps.get(230); + glRasterPos4dv = caps.get(231); + glReadBuffer = caps.get(232); + glReadPixels = caps.get(233); + glRecti = caps.get(234); + glRects = caps.get(235); + glRectf = caps.get(236); + glRectd = caps.get(237); + glRectiv = caps.get(238); + glRectsv = caps.get(239); + glRectfv = caps.get(240); + glRectdv = caps.get(241); + glRenderMode = caps.get(242); + glRotatef = caps.get(243); + glRotated = caps.get(244); + glScalef = caps.get(245); + glScaled = caps.get(246); + glScissor = caps.get(247); + glSelectBuffer = caps.get(248); + glShadeModel = caps.get(249); + glStencilFunc = caps.get(250); + glStencilMask = caps.get(251); + glStencilOp = caps.get(252); + glTexCoord1f = caps.get(253); + glTexCoord1s = caps.get(254); + glTexCoord1i = caps.get(255); + glTexCoord1d = caps.get(256); + glTexCoord1fv = caps.get(257); + glTexCoord1sv = caps.get(258); + glTexCoord1iv = caps.get(259); + glTexCoord1dv = caps.get(260); + glTexCoord2f = caps.get(261); + glTexCoord2s = caps.get(262); + glTexCoord2i = caps.get(263); + glTexCoord2d = caps.get(264); + glTexCoord2fv = caps.get(265); + glTexCoord2sv = caps.get(266); + glTexCoord2iv = caps.get(267); + glTexCoord2dv = caps.get(268); + glTexCoord3f = caps.get(269); + glTexCoord3s = caps.get(270); + glTexCoord3i = caps.get(271); + glTexCoord3d = caps.get(272); + glTexCoord3fv = caps.get(273); + glTexCoord3sv = caps.get(274); + glTexCoord3iv = caps.get(275); + glTexCoord3dv = caps.get(276); + glTexCoord4f = caps.get(277); + glTexCoord4s = caps.get(278); + glTexCoord4i = caps.get(279); + glTexCoord4d = caps.get(280); + glTexCoord4fv = caps.get(281); + glTexCoord4sv = caps.get(282); + glTexCoord4iv = caps.get(283); + glTexCoord4dv = caps.get(284); + glTexCoordPointer = caps.get(285); + glTexEnvi = caps.get(286); + glTexEnviv = caps.get(287); + glTexEnvf = caps.get(288); + glTexEnvfv = caps.get(289); + glTexGeni = caps.get(290); + glTexGeniv = caps.get(291); + glTexGenf = caps.get(292); + glTexGenfv = caps.get(293); + glTexGend = caps.get(294); + glTexGendv = caps.get(295); + glTexImage1D = caps.get(296); + glTexImage2D = caps.get(297); + glCopyTexImage1D = caps.get(298); + glCopyTexImage2D = caps.get(299); + glCopyTexSubImage1D = caps.get(300); + glCopyTexSubImage2D = caps.get(301); + glTexParameteri = caps.get(302); + glTexParameteriv = caps.get(303); + glTexParameterf = caps.get(304); + glTexParameterfv = caps.get(305); + glTexSubImage1D = caps.get(306); + glTexSubImage2D = caps.get(307); + glTranslatef = caps.get(308); + glTranslated = caps.get(309); + glVertex2f = caps.get(310); + glVertex2s = caps.get(311); + glVertex2i = caps.get(312); + glVertex2d = caps.get(313); + glVertex2fv = caps.get(314); + glVertex2sv = caps.get(315); + glVertex2iv = caps.get(316); + glVertex2dv = caps.get(317); + glVertex3f = caps.get(318); + glVertex3s = caps.get(319); + glVertex3i = caps.get(320); + glVertex3d = caps.get(321); + glVertex3fv = caps.get(322); + glVertex3sv = caps.get(323); + glVertex3iv = caps.get(324); + glVertex3dv = caps.get(325); + glVertex4f = caps.get(326); + glVertex4s = caps.get(327); + glVertex4i = caps.get(328); + glVertex4d = caps.get(329); + glVertex4fv = caps.get(330); + glVertex4sv = caps.get(331); + glVertex4iv = caps.get(332); + glVertex4dv = caps.get(333); + glVertexPointer = caps.get(334); + glViewport = caps.get(335); + glTexImage3D = caps.get(336); + glTexSubImage3D = caps.get(337); + glCopyTexSubImage3D = caps.get(338); + glDrawRangeElements = caps.get(339); + glCompressedTexImage3D = caps.get(340); + glCompressedTexImage2D = caps.get(341); + glCompressedTexImage1D = caps.get(342); + glCompressedTexSubImage3D = caps.get(343); + glCompressedTexSubImage2D = caps.get(344); + glCompressedTexSubImage1D = caps.get(345); + glGetCompressedTexImage = caps.get(346); + glSampleCoverage = caps.get(347); + glActiveTexture = caps.get(348); + glClientActiveTexture = caps.get(349); + glMultiTexCoord1f = caps.get(350); + glMultiTexCoord1s = caps.get(351); + glMultiTexCoord1i = caps.get(352); + glMultiTexCoord1d = caps.get(353); + glMultiTexCoord1fv = caps.get(354); + glMultiTexCoord1sv = caps.get(355); + glMultiTexCoord1iv = caps.get(356); + glMultiTexCoord1dv = caps.get(357); + glMultiTexCoord2f = caps.get(358); + glMultiTexCoord2s = caps.get(359); + glMultiTexCoord2i = caps.get(360); + glMultiTexCoord2d = caps.get(361); + glMultiTexCoord2fv = caps.get(362); + glMultiTexCoord2sv = caps.get(363); + glMultiTexCoord2iv = caps.get(364); + glMultiTexCoord2dv = caps.get(365); + glMultiTexCoord3f = caps.get(366); + glMultiTexCoord3s = caps.get(367); + glMultiTexCoord3i = caps.get(368); + glMultiTexCoord3d = caps.get(369); + glMultiTexCoord3fv = caps.get(370); + glMultiTexCoord3sv = caps.get(371); + glMultiTexCoord3iv = caps.get(372); + glMultiTexCoord3dv = caps.get(373); + glMultiTexCoord4f = caps.get(374); + glMultiTexCoord4s = caps.get(375); + glMultiTexCoord4i = caps.get(376); + glMultiTexCoord4d = caps.get(377); + glMultiTexCoord4fv = caps.get(378); + glMultiTexCoord4sv = caps.get(379); + glMultiTexCoord4iv = caps.get(380); + glMultiTexCoord4dv = caps.get(381); + glLoadTransposeMatrixf = caps.get(382); + glLoadTransposeMatrixd = caps.get(383); + glMultTransposeMatrixf = caps.get(384); + glMultTransposeMatrixd = caps.get(385); + glBlendColor = caps.get(386); + glBlendEquation = caps.get(387); + glFogCoordf = caps.get(388); + glFogCoordd = caps.get(389); + glFogCoordfv = caps.get(390); + glFogCoorddv = caps.get(391); + glFogCoordPointer = caps.get(392); + glMultiDrawArrays = caps.get(393); + glMultiDrawElements = caps.get(394); + glPointParameterf = caps.get(395); + glPointParameteri = caps.get(396); + glPointParameterfv = caps.get(397); + glPointParameteriv = caps.get(398); + glSecondaryColor3b = caps.get(399); + glSecondaryColor3s = caps.get(400); + glSecondaryColor3i = caps.get(401); + glSecondaryColor3f = caps.get(402); + glSecondaryColor3d = caps.get(403); + glSecondaryColor3ub = caps.get(404); + glSecondaryColor3us = caps.get(405); + glSecondaryColor3ui = caps.get(406); + glSecondaryColor3bv = caps.get(407); + glSecondaryColor3sv = caps.get(408); + glSecondaryColor3iv = caps.get(409); + glSecondaryColor3fv = caps.get(410); + glSecondaryColor3dv = caps.get(411); + glSecondaryColor3ubv = caps.get(412); + glSecondaryColor3usv = caps.get(413); + glSecondaryColor3uiv = caps.get(414); + glSecondaryColorPointer = caps.get(415); + glBlendFuncSeparate = caps.get(416); + glWindowPos2i = caps.get(417); + glWindowPos2s = caps.get(418); + glWindowPos2f = caps.get(419); + glWindowPos2d = caps.get(420); + glWindowPos2iv = caps.get(421); + glWindowPos2sv = caps.get(422); + glWindowPos2fv = caps.get(423); + glWindowPos2dv = caps.get(424); + glWindowPos3i = caps.get(425); + glWindowPos3s = caps.get(426); + glWindowPos3f = caps.get(427); + glWindowPos3d = caps.get(428); + glWindowPos3iv = caps.get(429); + glWindowPos3sv = caps.get(430); + glWindowPos3fv = caps.get(431); + glWindowPos3dv = caps.get(432); + glBindBuffer = caps.get(433); + glDeleteBuffers = caps.get(434); + glGenBuffers = caps.get(435); + glIsBuffer = caps.get(436); + glBufferData = caps.get(437); + glBufferSubData = caps.get(438); + glGetBufferSubData = caps.get(439); + glMapBuffer = caps.get(440); + glUnmapBuffer = caps.get(441); + glGetBufferParameteriv = caps.get(442); + glGetBufferPointerv = caps.get(443); + glGenQueries = caps.get(444); + glDeleteQueries = caps.get(445); + glIsQuery = caps.get(446); + glBeginQuery = caps.get(447); + glEndQuery = caps.get(448); + glGetQueryiv = caps.get(449); + glGetQueryObjectiv = caps.get(450); + glGetQueryObjectuiv = caps.get(451); + glCreateProgram = caps.get(452); + glDeleteProgram = caps.get(453); + glIsProgram = caps.get(454); + glCreateShader = caps.get(455); + glDeleteShader = caps.get(456); + glIsShader = caps.get(457); + glAttachShader = caps.get(458); + glDetachShader = caps.get(459); + glShaderSource = caps.get(460); + glCompileShader = caps.get(461); + glLinkProgram = caps.get(462); + glUseProgram = caps.get(463); + glValidateProgram = caps.get(464); + glUniform1f = caps.get(465); + glUniform2f = caps.get(466); + glUniform3f = caps.get(467); + glUniform4f = caps.get(468); + glUniform1i = caps.get(469); + glUniform2i = caps.get(470); + glUniform3i = caps.get(471); + glUniform4i = caps.get(472); + glUniform1fv = caps.get(473); + glUniform2fv = caps.get(474); + glUniform3fv = caps.get(475); + glUniform4fv = caps.get(476); + glUniform1iv = caps.get(477); + glUniform2iv = caps.get(478); + glUniform3iv = caps.get(479); + glUniform4iv = caps.get(480); + glUniformMatrix2fv = caps.get(481); + glUniformMatrix3fv = caps.get(482); + glUniformMatrix4fv = caps.get(483); + glGetShaderiv = caps.get(484); + glGetProgramiv = caps.get(485); + glGetShaderInfoLog = caps.get(486); + glGetProgramInfoLog = caps.get(487); + glGetAttachedShaders = caps.get(488); + glGetUniformLocation = caps.get(489); + glGetActiveUniform = caps.get(490); + glGetUniformfv = caps.get(491); + glGetUniformiv = caps.get(492); + glGetShaderSource = caps.get(493); + glVertexAttrib1f = caps.get(494); + glVertexAttrib1s = caps.get(495); + glVertexAttrib1d = caps.get(496); + glVertexAttrib2f = caps.get(497); + glVertexAttrib2s = caps.get(498); + glVertexAttrib2d = caps.get(499); + glVertexAttrib3f = caps.get(500); + glVertexAttrib3s = caps.get(501); + glVertexAttrib3d = caps.get(502); + glVertexAttrib4f = caps.get(503); + glVertexAttrib4s = caps.get(504); + glVertexAttrib4d = caps.get(505); + glVertexAttrib4Nub = caps.get(506); + glVertexAttrib1fv = caps.get(507); + glVertexAttrib1sv = caps.get(508); + glVertexAttrib1dv = caps.get(509); + glVertexAttrib2fv = caps.get(510); + glVertexAttrib2sv = caps.get(511); + glVertexAttrib2dv = caps.get(512); + glVertexAttrib3fv = caps.get(513); + glVertexAttrib3sv = caps.get(514); + glVertexAttrib3dv = caps.get(515); + glVertexAttrib4fv = caps.get(516); + glVertexAttrib4sv = caps.get(517); + glVertexAttrib4dv = caps.get(518); + glVertexAttrib4iv = caps.get(519); + glVertexAttrib4bv = caps.get(520); + glVertexAttrib4ubv = caps.get(521); + glVertexAttrib4usv = caps.get(522); + glVertexAttrib4uiv = caps.get(523); + glVertexAttrib4Nbv = caps.get(524); + glVertexAttrib4Nsv = caps.get(525); + glVertexAttrib4Niv = caps.get(526); + glVertexAttrib4Nubv = caps.get(527); + glVertexAttrib4Nusv = caps.get(528); + glVertexAttrib4Nuiv = caps.get(529); + glVertexAttribPointer = caps.get(530); + glEnableVertexAttribArray = caps.get(531); + glDisableVertexAttribArray = caps.get(532); + glBindAttribLocation = caps.get(533); + glGetActiveAttrib = caps.get(534); + glGetAttribLocation = caps.get(535); + glGetVertexAttribiv = caps.get(536); + glGetVertexAttribfv = caps.get(537); + glGetVertexAttribdv = caps.get(538); + glGetVertexAttribPointerv = caps.get(539); + glDrawBuffers = caps.get(540); + glBlendEquationSeparate = caps.get(541); + glStencilOpSeparate = caps.get(542); + glStencilFuncSeparate = caps.get(543); + glStencilMaskSeparate = caps.get(544); + glUniformMatrix2x3fv = caps.get(545); + glUniformMatrix3x2fv = caps.get(546); + glUniformMatrix2x4fv = caps.get(547); + glUniformMatrix4x2fv = caps.get(548); + glUniformMatrix3x4fv = caps.get(549); + glUniformMatrix4x3fv = caps.get(550); + glGetStringi = caps.get(551); + glClearBufferiv = caps.get(552); + glClearBufferuiv = caps.get(553); + glClearBufferfv = caps.get(554); + glClearBufferfi = caps.get(555); + glVertexAttribI1i = caps.get(556); + glVertexAttribI2i = caps.get(557); + glVertexAttribI3i = caps.get(558); + glVertexAttribI4i = caps.get(559); + glVertexAttribI1ui = caps.get(560); + glVertexAttribI2ui = caps.get(561); + glVertexAttribI3ui = caps.get(562); + glVertexAttribI4ui = caps.get(563); + glVertexAttribI1iv = caps.get(564); + glVertexAttribI2iv = caps.get(565); + glVertexAttribI3iv = caps.get(566); + glVertexAttribI4iv = caps.get(567); + glVertexAttribI1uiv = caps.get(568); + glVertexAttribI2uiv = caps.get(569); + glVertexAttribI3uiv = caps.get(570); + glVertexAttribI4uiv = caps.get(571); + glVertexAttribI4bv = caps.get(572); + glVertexAttribI4sv = caps.get(573); + glVertexAttribI4ubv = caps.get(574); + glVertexAttribI4usv = caps.get(575); + glVertexAttribIPointer = caps.get(576); + glGetVertexAttribIiv = caps.get(577); + glGetVertexAttribIuiv = caps.get(578); + glUniform1ui = caps.get(579); + glUniform2ui = caps.get(580); + glUniform3ui = caps.get(581); + glUniform4ui = caps.get(582); + glUniform1uiv = caps.get(583); + glUniform2uiv = caps.get(584); + glUniform3uiv = caps.get(585); + glUniform4uiv = caps.get(586); + glGetUniformuiv = caps.get(587); + glBindFragDataLocation = caps.get(588); + glGetFragDataLocation = caps.get(589); + glBeginConditionalRender = caps.get(590); + glEndConditionalRender = caps.get(591); + glMapBufferRange = caps.get(592); + glFlushMappedBufferRange = caps.get(593); + glClampColor = caps.get(594); + glIsRenderbuffer = caps.get(595); + glBindRenderbuffer = caps.get(596); + glDeleteRenderbuffers = caps.get(597); + glGenRenderbuffers = caps.get(598); + glRenderbufferStorage = caps.get(599); + glRenderbufferStorageMultisample = caps.get(600); + glGetRenderbufferParameteriv = caps.get(601); + glIsFramebuffer = caps.get(602); + glBindFramebuffer = caps.get(603); + glDeleteFramebuffers = caps.get(604); + glGenFramebuffers = caps.get(605); + glCheckFramebufferStatus = caps.get(606); + glFramebufferTexture1D = caps.get(607); + glFramebufferTexture2D = caps.get(608); + glFramebufferTexture3D = caps.get(609); + glFramebufferTextureLayer = caps.get(610); + glFramebufferRenderbuffer = caps.get(611); + glGetFramebufferAttachmentParameteriv = caps.get(612); + glBlitFramebuffer = caps.get(613); + glGenerateMipmap = caps.get(614); + glTexParameterIiv = caps.get(615); + glTexParameterIuiv = caps.get(616); + glGetTexParameterIiv = caps.get(617); + glGetTexParameterIuiv = caps.get(618); + glColorMaski = caps.get(619); + glGetBooleani_v = caps.get(620); + glGetIntegeri_v = caps.get(621); + glEnablei = caps.get(622); + glDisablei = caps.get(623); + glIsEnabledi = caps.get(624); + glBindBufferRange = caps.get(625); + glBindBufferBase = caps.get(626); + glBeginTransformFeedback = caps.get(627); + glEndTransformFeedback = caps.get(628); + glTransformFeedbackVaryings = caps.get(629); + glGetTransformFeedbackVarying = caps.get(630); + glBindVertexArray = caps.get(631); + glDeleteVertexArrays = caps.get(632); + glGenVertexArrays = caps.get(633); + glIsVertexArray = caps.get(634); + glDrawArraysInstanced = caps.get(635); + glDrawElementsInstanced = caps.get(636); + glCopyBufferSubData = caps.get(637); + glPrimitiveRestartIndex = caps.get(638); + glTexBuffer = caps.get(639); + glGetUniformIndices = caps.get(640); + glGetActiveUniformsiv = caps.get(641); + glGetActiveUniformName = caps.get(642); + glGetUniformBlockIndex = caps.get(643); + glGetActiveUniformBlockiv = caps.get(644); + glGetActiveUniformBlockName = caps.get(645); + glUniformBlockBinding = caps.get(646); + glGetBufferParameteri64v = caps.get(647); + glDrawElementsBaseVertex = caps.get(648); + glDrawRangeElementsBaseVertex = caps.get(649); + glDrawElementsInstancedBaseVertex = caps.get(650); + glMultiDrawElementsBaseVertex = caps.get(651); + glProvokingVertex = caps.get(652); + glTexImage2DMultisample = caps.get(653); + glTexImage3DMultisample = caps.get(654); + glGetMultisamplefv = caps.get(655); + glSampleMaski = caps.get(656); + glFramebufferTexture = caps.get(657); + glFenceSync = caps.get(658); + glIsSync = caps.get(659); + glDeleteSync = caps.get(660); + glClientWaitSync = caps.get(661); + glWaitSync = caps.get(662); + glGetInteger64v = caps.get(663); + glGetInteger64i_v = caps.get(664); + glGetSynciv = caps.get(665); + glBindFragDataLocationIndexed = caps.get(666); + glGetFragDataIndex = caps.get(667); + glGenSamplers = caps.get(668); + glDeleteSamplers = caps.get(669); + glIsSampler = caps.get(670); + glBindSampler = caps.get(671); + glSamplerParameteri = caps.get(672); + glSamplerParameterf = caps.get(673); + glSamplerParameteriv = caps.get(674); + glSamplerParameterfv = caps.get(675); + glSamplerParameterIiv = caps.get(676); + glSamplerParameterIuiv = caps.get(677); + glGetSamplerParameteriv = caps.get(678); + glGetSamplerParameterfv = caps.get(679); + glGetSamplerParameterIiv = caps.get(680); + glGetSamplerParameterIuiv = caps.get(681); + glQueryCounter = caps.get(682); + glGetQueryObjecti64v = caps.get(683); + glGetQueryObjectui64v = caps.get(684); + glVertexAttribDivisor = caps.get(685); + glVertexP2ui = caps.get(686); + glVertexP3ui = caps.get(687); + glVertexP4ui = caps.get(688); + glVertexP2uiv = caps.get(689); + glVertexP3uiv = caps.get(690); + glVertexP4uiv = caps.get(691); + glTexCoordP1ui = caps.get(692); + glTexCoordP2ui = caps.get(693); + glTexCoordP3ui = caps.get(694); + glTexCoordP4ui = caps.get(695); + glTexCoordP1uiv = caps.get(696); + glTexCoordP2uiv = caps.get(697); + glTexCoordP3uiv = caps.get(698); + glTexCoordP4uiv = caps.get(699); + glMultiTexCoordP1ui = caps.get(700); + glMultiTexCoordP2ui = caps.get(701); + glMultiTexCoordP3ui = caps.get(702); + glMultiTexCoordP4ui = caps.get(703); + glMultiTexCoordP1uiv = caps.get(704); + glMultiTexCoordP2uiv = caps.get(705); + glMultiTexCoordP3uiv = caps.get(706); + glMultiTexCoordP4uiv = caps.get(707); + glNormalP3ui = caps.get(708); + glNormalP3uiv = caps.get(709); + glColorP3ui = caps.get(710); + glColorP4ui = caps.get(711); + glColorP3uiv = caps.get(712); + glColorP4uiv = caps.get(713); + glSecondaryColorP3ui = caps.get(714); + glSecondaryColorP3uiv = caps.get(715); + glVertexAttribP1ui = caps.get(716); + glVertexAttribP2ui = caps.get(717); + glVertexAttribP3ui = caps.get(718); + glVertexAttribP4ui = caps.get(719); + glVertexAttribP1uiv = caps.get(720); + glVertexAttribP2uiv = caps.get(721); + glVertexAttribP3uiv = caps.get(722); + glVertexAttribP4uiv = caps.get(723); + glBlendEquationi = caps.get(724); + glBlendEquationSeparatei = caps.get(725); + glBlendFunci = caps.get(726); + glBlendFuncSeparatei = caps.get(727); + glDrawArraysIndirect = caps.get(728); + glDrawElementsIndirect = caps.get(729); + glUniform1d = caps.get(730); + glUniform2d = caps.get(731); + glUniform3d = caps.get(732); + glUniform4d = caps.get(733); + glUniform1dv = caps.get(734); + glUniform2dv = caps.get(735); + glUniform3dv = caps.get(736); + glUniform4dv = caps.get(737); + glUniformMatrix2dv = caps.get(738); + glUniformMatrix3dv = caps.get(739); + glUniformMatrix4dv = caps.get(740); + glUniformMatrix2x3dv = caps.get(741); + glUniformMatrix2x4dv = caps.get(742); + glUniformMatrix3x2dv = caps.get(743); + glUniformMatrix3x4dv = caps.get(744); + glUniformMatrix4x2dv = caps.get(745); + glUniformMatrix4x3dv = caps.get(746); + glGetUniformdv = caps.get(747); + glMinSampleShading = caps.get(748); + glGetSubroutineUniformLocation = caps.get(749); + glGetSubroutineIndex = caps.get(750); + glGetActiveSubroutineUniformiv = caps.get(751); + glGetActiveSubroutineUniformName = caps.get(752); + glGetActiveSubroutineName = caps.get(753); + glUniformSubroutinesuiv = caps.get(754); + glGetUniformSubroutineuiv = caps.get(755); + glGetProgramStageiv = caps.get(756); + glPatchParameteri = caps.get(757); + glPatchParameterfv = caps.get(758); + glBindTransformFeedback = caps.get(759); + glDeleteTransformFeedbacks = caps.get(760); + glGenTransformFeedbacks = caps.get(761); + glIsTransformFeedback = caps.get(762); + glPauseTransformFeedback = caps.get(763); + glResumeTransformFeedback = caps.get(764); + glDrawTransformFeedback = caps.get(765); + glDrawTransformFeedbackStream = caps.get(766); + glBeginQueryIndexed = caps.get(767); + glEndQueryIndexed = caps.get(768); + glGetQueryIndexediv = caps.get(769); + glReleaseShaderCompiler = caps.get(770); + glShaderBinary = caps.get(771); + glGetShaderPrecisionFormat = caps.get(772); + glDepthRangef = caps.get(773); + glClearDepthf = caps.get(774); + glGetProgramBinary = caps.get(775); + glProgramBinary = caps.get(776); + glProgramParameteri = caps.get(777); + glUseProgramStages = caps.get(778); + glActiveShaderProgram = caps.get(779); + glCreateShaderProgramv = caps.get(780); + glBindProgramPipeline = caps.get(781); + glDeleteProgramPipelines = caps.get(782); + glGenProgramPipelines = caps.get(783); + glIsProgramPipeline = caps.get(784); + glGetProgramPipelineiv = caps.get(785); + glProgramUniform1i = caps.get(786); + glProgramUniform2i = caps.get(787); + glProgramUniform3i = caps.get(788); + glProgramUniform4i = caps.get(789); + glProgramUniform1ui = caps.get(790); + glProgramUniform2ui = caps.get(791); + glProgramUniform3ui = caps.get(792); + glProgramUniform4ui = caps.get(793); + glProgramUniform1f = caps.get(794); + glProgramUniform2f = caps.get(795); + glProgramUniform3f = caps.get(796); + glProgramUniform4f = caps.get(797); + glProgramUniform1d = caps.get(798); + glProgramUniform2d = caps.get(799); + glProgramUniform3d = caps.get(800); + glProgramUniform4d = caps.get(801); + glProgramUniform1iv = caps.get(802); + glProgramUniform2iv = caps.get(803); + glProgramUniform3iv = caps.get(804); + glProgramUniform4iv = caps.get(805); + glProgramUniform1uiv = caps.get(806); + glProgramUniform2uiv = caps.get(807); + glProgramUniform3uiv = caps.get(808); + glProgramUniform4uiv = caps.get(809); + glProgramUniform1fv = caps.get(810); + glProgramUniform2fv = caps.get(811); + glProgramUniform3fv = caps.get(812); + glProgramUniform4fv = caps.get(813); + glProgramUniform1dv = caps.get(814); + glProgramUniform2dv = caps.get(815); + glProgramUniform3dv = caps.get(816); + glProgramUniform4dv = caps.get(817); + glProgramUniformMatrix2fv = caps.get(818); + glProgramUniformMatrix3fv = caps.get(819); + glProgramUniformMatrix4fv = caps.get(820); + glProgramUniformMatrix2dv = caps.get(821); + glProgramUniformMatrix3dv = caps.get(822); + glProgramUniformMatrix4dv = caps.get(823); + glProgramUniformMatrix2x3fv = caps.get(824); + glProgramUniformMatrix3x2fv = caps.get(825); + glProgramUniformMatrix2x4fv = caps.get(826); + glProgramUniformMatrix4x2fv = caps.get(827); + glProgramUniformMatrix3x4fv = caps.get(828); + glProgramUniformMatrix4x3fv = caps.get(829); + glProgramUniformMatrix2x3dv = caps.get(830); + glProgramUniformMatrix3x2dv = caps.get(831); + glProgramUniformMatrix2x4dv = caps.get(832); + glProgramUniformMatrix4x2dv = caps.get(833); + glProgramUniformMatrix3x4dv = caps.get(834); + glProgramUniformMatrix4x3dv = caps.get(835); + glValidateProgramPipeline = caps.get(836); + glGetProgramPipelineInfoLog = caps.get(837); + glVertexAttribL1d = caps.get(838); + glVertexAttribL2d = caps.get(839); + glVertexAttribL3d = caps.get(840); + glVertexAttribL4d = caps.get(841); + glVertexAttribL1dv = caps.get(842); + glVertexAttribL2dv = caps.get(843); + glVertexAttribL3dv = caps.get(844); + glVertexAttribL4dv = caps.get(845); + glVertexAttribLPointer = caps.get(846); + glGetVertexAttribLdv = caps.get(847); + glViewportArrayv = caps.get(848); + glViewportIndexedf = caps.get(849); + glViewportIndexedfv = caps.get(850); + glScissorArrayv = caps.get(851); + glScissorIndexed = caps.get(852); + glScissorIndexedv = caps.get(853); + glDepthRangeArrayv = caps.get(854); + glDepthRangeIndexed = caps.get(855); + glGetFloati_v = caps.get(856); + glGetDoublei_v = caps.get(857); + glGetActiveAtomicCounterBufferiv = caps.get(858); + glTexStorage1D = caps.get(859); + glTexStorage2D = caps.get(860); + glTexStorage3D = caps.get(861); + glDrawTransformFeedbackInstanced = caps.get(862); + glDrawTransformFeedbackStreamInstanced = caps.get(863); + glDrawArraysInstancedBaseInstance = caps.get(864); + glDrawElementsInstancedBaseInstance = caps.get(865); + glDrawElementsInstancedBaseVertexBaseInstance = caps.get(866); + glBindImageTexture = caps.get(867); + glMemoryBarrier = caps.get(868); + glGetInternalformativ = caps.get(869); + glClearBufferData = caps.get(870); + glClearBufferSubData = caps.get(871); + glDispatchCompute = caps.get(872); + glDispatchComputeIndirect = caps.get(873); + glCopyImageSubData = caps.get(874); + glDebugMessageControl = caps.get(875); + glDebugMessageInsert = caps.get(876); + glDebugMessageCallback = caps.get(877); + glGetDebugMessageLog = caps.get(878); + glPushDebugGroup = caps.get(879); + glPopDebugGroup = caps.get(880); + glObjectLabel = caps.get(881); + glGetObjectLabel = caps.get(882); + glObjectPtrLabel = caps.get(883); + glGetObjectPtrLabel = caps.get(884); + glFramebufferParameteri = caps.get(885); + glGetFramebufferParameteriv = caps.get(886); + glGetInternalformati64v = caps.get(887); + glInvalidateTexSubImage = caps.get(888); + glInvalidateTexImage = caps.get(889); + glInvalidateBufferSubData = caps.get(890); + glInvalidateBufferData = caps.get(891); + glInvalidateFramebuffer = caps.get(892); + glInvalidateSubFramebuffer = caps.get(893); + glMultiDrawArraysIndirect = caps.get(894); + glMultiDrawElementsIndirect = caps.get(895); + glGetProgramInterfaceiv = caps.get(896); + glGetProgramResourceIndex = caps.get(897); + glGetProgramResourceName = caps.get(898); + glGetProgramResourceiv = caps.get(899); + glGetProgramResourceLocation = caps.get(900); + glGetProgramResourceLocationIndex = caps.get(901); + glShaderStorageBlockBinding = caps.get(902); + glTexBufferRange = caps.get(903); + glTexStorage2DMultisample = caps.get(904); + glTexStorage3DMultisample = caps.get(905); + glTextureView = caps.get(906); + glBindVertexBuffer = caps.get(907); + glVertexAttribFormat = caps.get(908); + glVertexAttribIFormat = caps.get(909); + glVertexAttribLFormat = caps.get(910); + glVertexAttribBinding = caps.get(911); + glVertexBindingDivisor = caps.get(912); + glBufferStorage = caps.get(913); + glClearTexSubImage = caps.get(914); + glClearTexImage = caps.get(915); + glBindBuffersBase = caps.get(916); + glBindBuffersRange = caps.get(917); + glBindTextures = caps.get(918); + glBindSamplers = caps.get(919); + glBindImageTextures = caps.get(920); + glBindVertexBuffers = caps.get(921); + glClipControl = caps.get(922); + glCreateTransformFeedbacks = caps.get(923); + glTransformFeedbackBufferBase = caps.get(924); + glTransformFeedbackBufferRange = caps.get(925); + glGetTransformFeedbackiv = caps.get(926); + glGetTransformFeedbacki_v = caps.get(927); + glGetTransformFeedbacki64_v = caps.get(928); + glCreateBuffers = caps.get(929); + glNamedBufferStorage = caps.get(930); + glNamedBufferData = caps.get(931); + glNamedBufferSubData = caps.get(932); + glCopyNamedBufferSubData = caps.get(933); + glClearNamedBufferData = caps.get(934); + glClearNamedBufferSubData = caps.get(935); + glMapNamedBuffer = caps.get(936); + glMapNamedBufferRange = caps.get(937); + glUnmapNamedBuffer = caps.get(938); + glFlushMappedNamedBufferRange = caps.get(939); + glGetNamedBufferParameteriv = caps.get(940); + glGetNamedBufferParameteri64v = caps.get(941); + glGetNamedBufferPointerv = caps.get(942); + glGetNamedBufferSubData = caps.get(943); + glCreateFramebuffers = caps.get(944); + glNamedFramebufferRenderbuffer = caps.get(945); + glNamedFramebufferParameteri = caps.get(946); + glNamedFramebufferTexture = caps.get(947); + glNamedFramebufferTextureLayer = caps.get(948); + glNamedFramebufferDrawBuffer = caps.get(949); + glNamedFramebufferDrawBuffers = caps.get(950); + glNamedFramebufferReadBuffer = caps.get(951); + glInvalidateNamedFramebufferData = caps.get(952); + glInvalidateNamedFramebufferSubData = caps.get(953); + glClearNamedFramebufferiv = caps.get(954); + glClearNamedFramebufferuiv = caps.get(955); + glClearNamedFramebufferfv = caps.get(956); + glClearNamedFramebufferfi = caps.get(957); + glBlitNamedFramebuffer = caps.get(958); + glCheckNamedFramebufferStatus = caps.get(959); + glGetNamedFramebufferParameteriv = caps.get(960); + glGetNamedFramebufferAttachmentParameteriv = caps.get(961); + glCreateRenderbuffers = caps.get(962); + glNamedRenderbufferStorage = caps.get(963); + glNamedRenderbufferStorageMultisample = caps.get(964); + glGetNamedRenderbufferParameteriv = caps.get(965); + glCreateTextures = caps.get(966); + glTextureBuffer = caps.get(967); + glTextureBufferRange = caps.get(968); + glTextureStorage1D = caps.get(969); + glTextureStorage2D = caps.get(970); + glTextureStorage3D = caps.get(971); + glTextureStorage2DMultisample = caps.get(972); + glTextureStorage3DMultisample = caps.get(973); + glTextureSubImage1D = caps.get(974); + glTextureSubImage2D = caps.get(975); + glTextureSubImage3D = caps.get(976); + glCompressedTextureSubImage1D = caps.get(977); + glCompressedTextureSubImage2D = caps.get(978); + glCompressedTextureSubImage3D = caps.get(979); + glCopyTextureSubImage1D = caps.get(980); + glCopyTextureSubImage2D = caps.get(981); + glCopyTextureSubImage3D = caps.get(982); + glTextureParameterf = caps.get(983); + glTextureParameterfv = caps.get(984); + glTextureParameteri = caps.get(985); + glTextureParameterIiv = caps.get(986); + glTextureParameterIuiv = caps.get(987); + glTextureParameteriv = caps.get(988); + glGenerateTextureMipmap = caps.get(989); + glBindTextureUnit = caps.get(990); + glGetTextureImage = caps.get(991); + glGetCompressedTextureImage = caps.get(992); + glGetTextureLevelParameterfv = caps.get(993); + glGetTextureLevelParameteriv = caps.get(994); + glGetTextureParameterfv = caps.get(995); + glGetTextureParameterIiv = caps.get(996); + glGetTextureParameterIuiv = caps.get(997); + glGetTextureParameteriv = caps.get(998); + glCreateVertexArrays = caps.get(999); + glDisableVertexArrayAttrib = caps.get(1000); + glEnableVertexArrayAttrib = caps.get(1001); + glVertexArrayElementBuffer = caps.get(1002); + glVertexArrayVertexBuffer = caps.get(1003); + glVertexArrayVertexBuffers = caps.get(1004); + glVertexArrayAttribFormat = caps.get(1005); + glVertexArrayAttribIFormat = caps.get(1006); + glVertexArrayAttribLFormat = caps.get(1007); + glVertexArrayAttribBinding = caps.get(1008); + glVertexArrayBindingDivisor = caps.get(1009); + glGetVertexArrayiv = caps.get(1010); + glGetVertexArrayIndexediv = caps.get(1011); + glGetVertexArrayIndexed64iv = caps.get(1012); + glCreateSamplers = caps.get(1013); + glCreateProgramPipelines = caps.get(1014); + glCreateQueries = caps.get(1015); + glGetQueryBufferObjectiv = caps.get(1016); + glGetQueryBufferObjectuiv = caps.get(1017); + glGetQueryBufferObjecti64v = caps.get(1018); + glGetQueryBufferObjectui64v = caps.get(1019); + glMemoryBarrierByRegion = caps.get(1020); + glGetTextureSubImage = caps.get(1021); + glGetCompressedTextureSubImage = caps.get(1022); + glTextureBarrier = caps.get(1023); + glGetGraphicsResetStatus = caps.get(1024); + glGetnMapdv = caps.get(1025); + glGetnMapfv = caps.get(1026); + glGetnMapiv = caps.get(1027); + glGetnPixelMapfv = caps.get(1028); + glGetnPixelMapuiv = caps.get(1029); + glGetnPixelMapusv = caps.get(1030); + glGetnPolygonStipple = caps.get(1031); + glGetnTexImage = caps.get(1032); + glReadnPixels = caps.get(1033); + glGetnColorTable = caps.get(1034); + glGetnConvolutionFilter = caps.get(1035); + glGetnSeparableFilter = caps.get(1036); + glGetnHistogram = caps.get(1037); + glGetnMinmax = caps.get(1038); + glGetnCompressedTexImage = caps.get(1039); + glGetnUniformfv = caps.get(1040); + glGetnUniformdv = caps.get(1041); + glGetnUniformiv = caps.get(1042); + glGetnUniformuiv = caps.get(1043); + glMultiDrawArraysIndirectCount = caps.get(1044); + glMultiDrawElementsIndirectCount = caps.get(1045); + glPolygonOffsetClamp = caps.get(1046); + glSpecializeShader = caps.get(1047); + glDebugMessageEnableAMD = caps.get(1048); + glDebugMessageInsertAMD = caps.get(1049); + glDebugMessageCallbackAMD = caps.get(1050); + glGetDebugMessageLogAMD = caps.get(1051); + glBlendFuncIndexedAMD = caps.get(1052); + glBlendFuncSeparateIndexedAMD = caps.get(1053); + glBlendEquationIndexedAMD = caps.get(1054); + glBlendEquationSeparateIndexedAMD = caps.get(1055); + glRenderbufferStorageMultisampleAdvancedAMD = caps.get(1056); + glNamedRenderbufferStorageMultisampleAdvancedAMD = caps.get(1057); + glUniform1i64NV = caps.get(1058); + glUniform2i64NV = caps.get(1059); + glUniform3i64NV = caps.get(1060); + glUniform4i64NV = caps.get(1061); + glUniform1i64vNV = caps.get(1062); + glUniform2i64vNV = caps.get(1063); + glUniform3i64vNV = caps.get(1064); + glUniform4i64vNV = caps.get(1065); + glUniform1ui64NV = caps.get(1066); + glUniform2ui64NV = caps.get(1067); + glUniform3ui64NV = caps.get(1068); + glUniform4ui64NV = caps.get(1069); + glUniform1ui64vNV = caps.get(1070); + glUniform2ui64vNV = caps.get(1071); + glUniform3ui64vNV = caps.get(1072); + glUniform4ui64vNV = caps.get(1073); + glGetUniformi64vNV = caps.get(1074); + glGetUniformui64vNV = caps.get(1075); + glProgramUniform1i64NV = caps.get(1076); + glProgramUniform2i64NV = caps.get(1077); + glProgramUniform3i64NV = caps.get(1078); + glProgramUniform4i64NV = caps.get(1079); + glProgramUniform1i64vNV = caps.get(1080); + glProgramUniform2i64vNV = caps.get(1081); + glProgramUniform3i64vNV = caps.get(1082); + glProgramUniform4i64vNV = caps.get(1083); + glProgramUniform1ui64NV = caps.get(1084); + glProgramUniform2ui64NV = caps.get(1085); + glProgramUniform3ui64NV = caps.get(1086); + glProgramUniform4ui64NV = caps.get(1087); + glProgramUniform1ui64vNV = caps.get(1088); + glProgramUniform2ui64vNV = caps.get(1089); + glProgramUniform3ui64vNV = caps.get(1090); + glProgramUniform4ui64vNV = caps.get(1091); + glVertexAttribParameteriAMD = caps.get(1092); + glQueryObjectParameteruiAMD = caps.get(1093); + glGetPerfMonitorGroupsAMD = caps.get(1094); + glGetPerfMonitorCountersAMD = caps.get(1095); + glGetPerfMonitorGroupStringAMD = caps.get(1096); + glGetPerfMonitorCounterStringAMD = caps.get(1097); + glGetPerfMonitorCounterInfoAMD = caps.get(1098); + glGenPerfMonitorsAMD = caps.get(1099); + glDeletePerfMonitorsAMD = caps.get(1100); + glSelectPerfMonitorCountersAMD = caps.get(1101); + glBeginPerfMonitorAMD = caps.get(1102); + glEndPerfMonitorAMD = caps.get(1103); + glGetPerfMonitorCounterDataAMD = caps.get(1104); + glSetMultisamplefvAMD = caps.get(1105); + glTexStorageSparseAMD = caps.get(1106); + glTextureStorageSparseAMD = caps.get(1107); + glStencilOpValueAMD = caps.get(1108); + glTessellationFactorAMD = caps.get(1109); + glTessellationModeAMD = caps.get(1110); + glGetTextureHandleARB = caps.get(1111); + glGetTextureSamplerHandleARB = caps.get(1112); + glMakeTextureHandleResidentARB = caps.get(1113); + glMakeTextureHandleNonResidentARB = caps.get(1114); + glGetImageHandleARB = caps.get(1115); + glMakeImageHandleResidentARB = caps.get(1116); + glMakeImageHandleNonResidentARB = caps.get(1117); + glUniformHandleui64ARB = caps.get(1118); + glUniformHandleui64vARB = caps.get(1119); + glProgramUniformHandleui64ARB = caps.get(1120); + glProgramUniformHandleui64vARB = caps.get(1121); + glIsTextureHandleResidentARB = caps.get(1122); + glIsImageHandleResidentARB = caps.get(1123); + glVertexAttribL1ui64ARB = caps.get(1124); + glVertexAttribL1ui64vARB = caps.get(1125); + glGetVertexAttribLui64vARB = caps.get(1126); + glNamedBufferStorageEXT = caps.get(1127); + glClearNamedBufferDataEXT = caps.get(1128); + glClearNamedBufferSubDataEXT = caps.get(1129); + glClampColorARB = caps.get(1130); + glDispatchComputeGroupSizeARB = caps.get(1131); + glDebugMessageControlARB = caps.get(1132); + glDebugMessageInsertARB = caps.get(1133); + glDebugMessageCallbackARB = caps.get(1134); + glGetDebugMessageLogARB = caps.get(1135); + glDrawBuffersARB = caps.get(1136); + glBlendEquationiARB = caps.get(1137); + glBlendEquationSeparateiARB = caps.get(1138); + glBlendFunciARB = caps.get(1139); + glBlendFuncSeparateiARB = caps.get(1140); + glDrawArraysInstancedARB = caps.get(1141); + glDrawElementsInstancedARB = caps.get(1142); + glPrimitiveBoundingBoxARB = caps.get(1143); + glNamedFramebufferParameteriEXT = caps.get(1144); + glGetNamedFramebufferParameterivEXT = caps.get(1145); + glProgramParameteriARB = caps.get(1146); + glFramebufferTextureARB = caps.get(1147); + glFramebufferTextureLayerARB = caps.get(1148); + glFramebufferTextureFaceARB = caps.get(1149); + glSpecializeShaderARB = caps.get(1150); + glProgramUniform1dEXT = caps.get(1151); + glProgramUniform2dEXT = caps.get(1152); + glProgramUniform3dEXT = caps.get(1153); + glProgramUniform4dEXT = caps.get(1154); + glProgramUniform1dvEXT = caps.get(1155); + glProgramUniform2dvEXT = caps.get(1156); + glProgramUniform3dvEXT = caps.get(1157); + glProgramUniform4dvEXT = caps.get(1158); + glProgramUniformMatrix2dvEXT = caps.get(1159); + glProgramUniformMatrix3dvEXT = caps.get(1160); + glProgramUniformMatrix4dvEXT = caps.get(1161); + glProgramUniformMatrix2x3dvEXT = caps.get(1162); + glProgramUniformMatrix2x4dvEXT = caps.get(1163); + glProgramUniformMatrix3x2dvEXT = caps.get(1164); + glProgramUniformMatrix3x4dvEXT = caps.get(1165); + glProgramUniformMatrix4x2dvEXT = caps.get(1166); + glProgramUniformMatrix4x3dvEXT = caps.get(1167); + glUniform1i64ARB = caps.get(1168); + glUniform1i64vARB = caps.get(1169); + glProgramUniform1i64ARB = caps.get(1170); + glProgramUniform1i64vARB = caps.get(1171); + glUniform2i64ARB = caps.get(1172); + glUniform2i64vARB = caps.get(1173); + glProgramUniform2i64ARB = caps.get(1174); + glProgramUniform2i64vARB = caps.get(1175); + glUniform3i64ARB = caps.get(1176); + glUniform3i64vARB = caps.get(1177); + glProgramUniform3i64ARB = caps.get(1178); + glProgramUniform3i64vARB = caps.get(1179); + glUniform4i64ARB = caps.get(1180); + glUniform4i64vARB = caps.get(1181); + glProgramUniform4i64ARB = caps.get(1182); + glProgramUniform4i64vARB = caps.get(1183); + glUniform1ui64ARB = caps.get(1184); + glUniform1ui64vARB = caps.get(1185); + glProgramUniform1ui64ARB = caps.get(1186); + glProgramUniform1ui64vARB = caps.get(1187); + glUniform2ui64ARB = caps.get(1188); + glUniform2ui64vARB = caps.get(1189); + glProgramUniform2ui64ARB = caps.get(1190); + glProgramUniform2ui64vARB = caps.get(1191); + glUniform3ui64ARB = caps.get(1192); + glUniform3ui64vARB = caps.get(1193); + glProgramUniform3ui64ARB = caps.get(1194); + glProgramUniform3ui64vARB = caps.get(1195); + glUniform4ui64ARB = caps.get(1196); + glUniform4ui64vARB = caps.get(1197); + glProgramUniform4ui64ARB = caps.get(1198); + glProgramUniform4ui64vARB = caps.get(1199); + glGetUniformi64vARB = caps.get(1200); + glGetUniformui64vARB = caps.get(1201); + glGetnUniformi64vARB = caps.get(1202); + glGetnUniformui64vARB = caps.get(1203); + glColorTable = caps.get(1204); + glCopyColorTable = caps.get(1205); + glColorTableParameteriv = caps.get(1206); + glColorTableParameterfv = caps.get(1207); + glGetColorTable = caps.get(1208); + glGetColorTableParameteriv = caps.get(1209); + glGetColorTableParameterfv = caps.get(1210); + glColorSubTable = caps.get(1211); + glCopyColorSubTable = caps.get(1212); + glConvolutionFilter1D = caps.get(1213); + glConvolutionFilter2D = caps.get(1214); + glCopyConvolutionFilter1D = caps.get(1215); + glCopyConvolutionFilter2D = caps.get(1216); + glGetConvolutionFilter = caps.get(1217); + glSeparableFilter2D = caps.get(1218); + glGetSeparableFilter = caps.get(1219); + glConvolutionParameteri = caps.get(1220); + glConvolutionParameteriv = caps.get(1221); + glConvolutionParameterf = caps.get(1222); + glConvolutionParameterfv = caps.get(1223); + glGetConvolutionParameteriv = caps.get(1224); + glGetConvolutionParameterfv = caps.get(1225); + glHistogram = caps.get(1226); + glResetHistogram = caps.get(1227); + glGetHistogram = caps.get(1228); + glGetHistogramParameteriv = caps.get(1229); + glGetHistogramParameterfv = caps.get(1230); + glMinmax = caps.get(1231); + glResetMinmax = caps.get(1232); + glGetMinmax = caps.get(1233); + glGetMinmaxParameteriv = caps.get(1234); + glGetMinmaxParameterfv = caps.get(1235); + glMultiDrawArraysIndirectCountARB = caps.get(1236); + glMultiDrawElementsIndirectCountARB = caps.get(1237); + glVertexAttribDivisorARB = caps.get(1238); + glVertexArrayVertexAttribDivisorEXT = caps.get(1239); + glCurrentPaletteMatrixARB = caps.get(1240); + glMatrixIndexuivARB = caps.get(1241); + glMatrixIndexubvARB = caps.get(1242); + glMatrixIndexusvARB = caps.get(1243); + glMatrixIndexPointerARB = caps.get(1244); + glSampleCoverageARB = caps.get(1245); + glActiveTextureARB = caps.get(1246); + glClientActiveTextureARB = caps.get(1247); + glMultiTexCoord1fARB = caps.get(1248); + glMultiTexCoord1sARB = caps.get(1249); + glMultiTexCoord1iARB = caps.get(1250); + glMultiTexCoord1dARB = caps.get(1251); + glMultiTexCoord1fvARB = caps.get(1252); + glMultiTexCoord1svARB = caps.get(1253); + glMultiTexCoord1ivARB = caps.get(1254); + glMultiTexCoord1dvARB = caps.get(1255); + glMultiTexCoord2fARB = caps.get(1256); + glMultiTexCoord2sARB = caps.get(1257); + glMultiTexCoord2iARB = caps.get(1258); + glMultiTexCoord2dARB = caps.get(1259); + glMultiTexCoord2fvARB = caps.get(1260); + glMultiTexCoord2svARB = caps.get(1261); + glMultiTexCoord2ivARB = caps.get(1262); + glMultiTexCoord2dvARB = caps.get(1263); + glMultiTexCoord3fARB = caps.get(1264); + glMultiTexCoord3sARB = caps.get(1265); + glMultiTexCoord3iARB = caps.get(1266); + glMultiTexCoord3dARB = caps.get(1267); + glMultiTexCoord3fvARB = caps.get(1268); + glMultiTexCoord3svARB = caps.get(1269); + glMultiTexCoord3ivARB = caps.get(1270); + glMultiTexCoord3dvARB = caps.get(1271); + glMultiTexCoord4fARB = caps.get(1272); + glMultiTexCoord4sARB = caps.get(1273); + glMultiTexCoord4iARB = caps.get(1274); + glMultiTexCoord4dARB = caps.get(1275); + glMultiTexCoord4fvARB = caps.get(1276); + glMultiTexCoord4svARB = caps.get(1277); + glMultiTexCoord4ivARB = caps.get(1278); + glMultiTexCoord4dvARB = caps.get(1279); + glGenQueriesARB = caps.get(1280); + glDeleteQueriesARB = caps.get(1281); + glIsQueryARB = caps.get(1282); + glBeginQueryARB = caps.get(1283); + glEndQueryARB = caps.get(1284); + glGetQueryivARB = caps.get(1285); + glGetQueryObjectivARB = caps.get(1286); + glGetQueryObjectuivARB = caps.get(1287); + glMaxShaderCompilerThreadsARB = caps.get(1288); + glPointParameterfARB = caps.get(1289); + glPointParameterfvARB = caps.get(1290); + glGetGraphicsResetStatusARB = caps.get(1291); + glGetnMapdvARB = caps.get(1292); + glGetnMapfvARB = caps.get(1293); + glGetnMapivARB = caps.get(1294); + glGetnPixelMapfvARB = caps.get(1295); + glGetnPixelMapuivARB = caps.get(1296); + glGetnPixelMapusvARB = caps.get(1297); + glGetnPolygonStippleARB = caps.get(1298); + glGetnTexImageARB = caps.get(1299); + glReadnPixelsARB = caps.get(1300); + glGetnColorTableARB = caps.get(1301); + glGetnConvolutionFilterARB = caps.get(1302); + glGetnSeparableFilterARB = caps.get(1303); + glGetnHistogramARB = caps.get(1304); + glGetnMinmaxARB = caps.get(1305); + glGetnCompressedTexImageARB = caps.get(1306); + glGetnUniformfvARB = caps.get(1307); + glGetnUniformivARB = caps.get(1308); + glGetnUniformuivARB = caps.get(1309); + glGetnUniformdvARB = caps.get(1310); + glFramebufferSampleLocationsfvARB = caps.get(1311); + glNamedFramebufferSampleLocationsfvARB = caps.get(1312); + glEvaluateDepthValuesARB = caps.get(1313); + glMinSampleShadingARB = caps.get(1314); + glDeleteObjectARB = caps.get(1315); + glGetHandleARB = caps.get(1316); + glDetachObjectARB = caps.get(1317); + glCreateShaderObjectARB = caps.get(1318); + glShaderSourceARB = caps.get(1319); + glCompileShaderARB = caps.get(1320); + glCreateProgramObjectARB = caps.get(1321); + glAttachObjectARB = caps.get(1322); + glLinkProgramARB = caps.get(1323); + glUseProgramObjectARB = caps.get(1324); + glValidateProgramARB = caps.get(1325); + glUniform1fARB = caps.get(1326); + glUniform2fARB = caps.get(1327); + glUniform3fARB = caps.get(1328); + glUniform4fARB = caps.get(1329); + glUniform1iARB = caps.get(1330); + glUniform2iARB = caps.get(1331); + glUniform3iARB = caps.get(1332); + glUniform4iARB = caps.get(1333); + glUniform1fvARB = caps.get(1334); + glUniform2fvARB = caps.get(1335); + glUniform3fvARB = caps.get(1336); + glUniform4fvARB = caps.get(1337); + glUniform1ivARB = caps.get(1338); + glUniform2ivARB = caps.get(1339); + glUniform3ivARB = caps.get(1340); + glUniform4ivARB = caps.get(1341); + glUniformMatrix2fvARB = caps.get(1342); + glUniformMatrix3fvARB = caps.get(1343); + glUniformMatrix4fvARB = caps.get(1344); + glGetObjectParameterfvARB = caps.get(1345); + glGetObjectParameterivARB = caps.get(1346); + glGetInfoLogARB = caps.get(1347); + glGetAttachedObjectsARB = caps.get(1348); + glGetUniformLocationARB = caps.get(1349); + glGetActiveUniformARB = caps.get(1350); + glGetUniformfvARB = caps.get(1351); + glGetUniformivARB = caps.get(1352); + glGetShaderSourceARB = caps.get(1353); + glNamedStringARB = caps.get(1354); + glDeleteNamedStringARB = caps.get(1355); + glCompileShaderIncludeARB = caps.get(1356); + glIsNamedStringARB = caps.get(1357); + glGetNamedStringARB = caps.get(1358); + glGetNamedStringivARB = caps.get(1359); + glBufferPageCommitmentARB = caps.get(1360); + glNamedBufferPageCommitmentEXT = caps.get(1361); + glNamedBufferPageCommitmentARB = caps.get(1362); + glTexPageCommitmentARB = caps.get(1363); + glTexturePageCommitmentEXT = caps.get(1364); + glTexBufferARB = caps.get(1365); + glTextureBufferRangeEXT = caps.get(1366); + glCompressedTexImage3DARB = caps.get(1367); + glCompressedTexImage2DARB = caps.get(1368); + glCompressedTexImage1DARB = caps.get(1369); + glCompressedTexSubImage3DARB = caps.get(1370); + glCompressedTexSubImage2DARB = caps.get(1371); + glCompressedTexSubImage1DARB = caps.get(1372); + glGetCompressedTexImageARB = caps.get(1373); + glTextureStorage1DEXT = caps.get(1374); + glTextureStorage2DEXT = caps.get(1375); + glTextureStorage3DEXT = caps.get(1376); + glTextureStorage2DMultisampleEXT = caps.get(1377); + glTextureStorage3DMultisampleEXT = caps.get(1378); + glLoadTransposeMatrixfARB = caps.get(1379); + glLoadTransposeMatrixdARB = caps.get(1380); + glMultTransposeMatrixfARB = caps.get(1381); + glMultTransposeMatrixdARB = caps.get(1382); + glVertexArrayVertexAttribLOffsetEXT = caps.get(1383); + glVertexArrayBindVertexBufferEXT = caps.get(1384); + glVertexArrayVertexAttribFormatEXT = caps.get(1385); + glVertexArrayVertexAttribIFormatEXT = caps.get(1386); + glVertexArrayVertexAttribLFormatEXT = caps.get(1387); + glVertexArrayVertexAttribBindingEXT = caps.get(1388); + glVertexArrayVertexBindingDivisorEXT = caps.get(1389); + glWeightfvARB = caps.get(1390); + glWeightbvARB = caps.get(1391); + glWeightubvARB = caps.get(1392); + glWeightsvARB = caps.get(1393); + glWeightusvARB = caps.get(1394); + glWeightivARB = caps.get(1395); + glWeightuivARB = caps.get(1396); + glWeightdvARB = caps.get(1397); + glWeightPointerARB = caps.get(1398); + glVertexBlendARB = caps.get(1399); + glBindBufferARB = caps.get(1400); + glDeleteBuffersARB = caps.get(1401); + glGenBuffersARB = caps.get(1402); + glIsBufferARB = caps.get(1403); + glBufferDataARB = caps.get(1404); + glBufferSubDataARB = caps.get(1405); + glGetBufferSubDataARB = caps.get(1406); + glMapBufferARB = caps.get(1407); + glUnmapBufferARB = caps.get(1408); + glGetBufferParameterivARB = caps.get(1409); + glGetBufferPointervARB = caps.get(1410); + glVertexAttrib1sARB = caps.get(1411); + glVertexAttrib1fARB = caps.get(1412); + glVertexAttrib1dARB = caps.get(1413); + glVertexAttrib2sARB = caps.get(1414); + glVertexAttrib2fARB = caps.get(1415); + glVertexAttrib2dARB = caps.get(1416); + glVertexAttrib3sARB = caps.get(1417); + glVertexAttrib3fARB = caps.get(1418); + glVertexAttrib3dARB = caps.get(1419); + glVertexAttrib4sARB = caps.get(1420); + glVertexAttrib4fARB = caps.get(1421); + glVertexAttrib4dARB = caps.get(1422); + glVertexAttrib4NubARB = caps.get(1423); + glVertexAttrib1svARB = caps.get(1424); + glVertexAttrib1fvARB = caps.get(1425); + glVertexAttrib1dvARB = caps.get(1426); + glVertexAttrib2svARB = caps.get(1427); + glVertexAttrib2fvARB = caps.get(1428); + glVertexAttrib2dvARB = caps.get(1429); + glVertexAttrib3svARB = caps.get(1430); + glVertexAttrib3fvARB = caps.get(1431); + glVertexAttrib3dvARB = caps.get(1432); + glVertexAttrib4fvARB = caps.get(1433); + glVertexAttrib4bvARB = caps.get(1434); + glVertexAttrib4svARB = caps.get(1435); + glVertexAttrib4ivARB = caps.get(1436); + glVertexAttrib4ubvARB = caps.get(1437); + glVertexAttrib4usvARB = caps.get(1438); + glVertexAttrib4uivARB = caps.get(1439); + glVertexAttrib4dvARB = caps.get(1440); + glVertexAttrib4NbvARB = caps.get(1441); + glVertexAttrib4NsvARB = caps.get(1442); + glVertexAttrib4NivARB = caps.get(1443); + glVertexAttrib4NubvARB = caps.get(1444); + glVertexAttrib4NusvARB = caps.get(1445); + glVertexAttrib4NuivARB = caps.get(1446); + glVertexAttribPointerARB = caps.get(1447); + glEnableVertexAttribArrayARB = caps.get(1448); + glDisableVertexAttribArrayARB = caps.get(1449); + glProgramStringARB = caps.get(1450); + glBindProgramARB = caps.get(1451); + glDeleteProgramsARB = caps.get(1452); + glGenProgramsARB = caps.get(1453); + glProgramEnvParameter4dARB = caps.get(1454); + glProgramEnvParameter4dvARB = caps.get(1455); + glProgramEnvParameter4fARB = caps.get(1456); + glProgramEnvParameter4fvARB = caps.get(1457); + glProgramLocalParameter4dARB = caps.get(1458); + glProgramLocalParameter4dvARB = caps.get(1459); + glProgramLocalParameter4fARB = caps.get(1460); + glProgramLocalParameter4fvARB = caps.get(1461); + glGetProgramEnvParameterfvARB = caps.get(1462); + glGetProgramEnvParameterdvARB = caps.get(1463); + glGetProgramLocalParameterfvARB = caps.get(1464); + glGetProgramLocalParameterdvARB = caps.get(1465); + glGetProgramivARB = caps.get(1466); + glGetProgramStringARB = caps.get(1467); + glGetVertexAttribfvARB = caps.get(1468); + glGetVertexAttribdvARB = caps.get(1469); + glGetVertexAttribivARB = caps.get(1470); + glGetVertexAttribPointervARB = caps.get(1471); + glIsProgramARB = caps.get(1472); + glBindAttribLocationARB = caps.get(1473); + glGetActiveAttribARB = caps.get(1474); + glGetAttribLocationARB = caps.get(1475); + glWindowPos2iARB = caps.get(1476); + glWindowPos2sARB = caps.get(1477); + glWindowPos2fARB = caps.get(1478); + glWindowPos2dARB = caps.get(1479); + glWindowPos2ivARB = caps.get(1480); + glWindowPos2svARB = caps.get(1481); + glWindowPos2fvARB = caps.get(1482); + glWindowPos2dvARB = caps.get(1483); + glWindowPos3iARB = caps.get(1484); + glWindowPos3sARB = caps.get(1485); + glWindowPos3fARB = caps.get(1486); + glWindowPos3dARB = caps.get(1487); + glWindowPos3ivARB = caps.get(1488); + glWindowPos3svARB = caps.get(1489); + glWindowPos3fvARB = caps.get(1490); + glWindowPos3dvARB = caps.get(1491); + glUniformBufferEXT = caps.get(1492); + glGetUniformBufferSizeEXT = caps.get(1493); + glGetUniformOffsetEXT = caps.get(1494); + glBlendColorEXT = caps.get(1495); + glBlendEquationSeparateEXT = caps.get(1496); + glBlendFuncSeparateEXT = caps.get(1497); + glBlendEquationEXT = caps.get(1498); + glLockArraysEXT = caps.get(1499); + glUnlockArraysEXT = caps.get(1500); + glLabelObjectEXT = caps.get(1501); + glGetObjectLabelEXT = caps.get(1502); + glInsertEventMarkerEXT = caps.get(1503); + glPushGroupMarkerEXT = caps.get(1504); + glPopGroupMarkerEXT = caps.get(1505); + glDepthBoundsEXT = caps.get(1506); + glClientAttribDefaultEXT = caps.get(1507); + glPushClientAttribDefaultEXT = caps.get(1508); + glMatrixLoadfEXT = caps.get(1509); + glMatrixLoaddEXT = caps.get(1510); + glMatrixMultfEXT = caps.get(1511); + glMatrixMultdEXT = caps.get(1512); + glMatrixLoadIdentityEXT = caps.get(1513); + glMatrixRotatefEXT = caps.get(1514); + glMatrixRotatedEXT = caps.get(1515); + glMatrixScalefEXT = caps.get(1516); + glMatrixScaledEXT = caps.get(1517); + glMatrixTranslatefEXT = caps.get(1518); + glMatrixTranslatedEXT = caps.get(1519); + glMatrixOrthoEXT = caps.get(1520); + glMatrixFrustumEXT = caps.get(1521); + glMatrixPushEXT = caps.get(1522); + glMatrixPopEXT = caps.get(1523); + glTextureParameteriEXT = caps.get(1524); + glTextureParameterivEXT = caps.get(1525); + glTextureParameterfEXT = caps.get(1526); + glTextureParameterfvEXT = caps.get(1527); + glTextureImage1DEXT = caps.get(1528); + glTextureImage2DEXT = caps.get(1529); + glTextureSubImage1DEXT = caps.get(1530); + glTextureSubImage2DEXT = caps.get(1531); + glCopyTextureImage1DEXT = caps.get(1532); + glCopyTextureImage2DEXT = caps.get(1533); + glCopyTextureSubImage1DEXT = caps.get(1534); + glCopyTextureSubImage2DEXT = caps.get(1535); + glGetTextureImageEXT = caps.get(1536); + glGetTextureParameterfvEXT = caps.get(1537); + glGetTextureParameterivEXT = caps.get(1538); + glGetTextureLevelParameterfvEXT = caps.get(1539); + glGetTextureLevelParameterivEXT = caps.get(1540); + glTextureImage3DEXT = caps.get(1541); + glTextureSubImage3DEXT = caps.get(1542); + glCopyTextureSubImage3DEXT = caps.get(1543); + glBindMultiTextureEXT = caps.get(1544); + glMultiTexCoordPointerEXT = caps.get(1545); + glMultiTexEnvfEXT = caps.get(1546); + glMultiTexEnvfvEXT = caps.get(1547); + glMultiTexEnviEXT = caps.get(1548); + glMultiTexEnvivEXT = caps.get(1549); + glMultiTexGendEXT = caps.get(1550); + glMultiTexGendvEXT = caps.get(1551); + glMultiTexGenfEXT = caps.get(1552); + glMultiTexGenfvEXT = caps.get(1553); + glMultiTexGeniEXT = caps.get(1554); + glMultiTexGenivEXT = caps.get(1555); + glGetMultiTexEnvfvEXT = caps.get(1556); + glGetMultiTexEnvivEXT = caps.get(1557); + glGetMultiTexGendvEXT = caps.get(1558); + glGetMultiTexGenfvEXT = caps.get(1559); + glGetMultiTexGenivEXT = caps.get(1560); + glMultiTexParameteriEXT = caps.get(1561); + glMultiTexParameterivEXT = caps.get(1562); + glMultiTexParameterfEXT = caps.get(1563); + glMultiTexParameterfvEXT = caps.get(1564); + glMultiTexImage1DEXT = caps.get(1565); + glMultiTexImage2DEXT = caps.get(1566); + glMultiTexSubImage1DEXT = caps.get(1567); + glMultiTexSubImage2DEXT = caps.get(1568); + glCopyMultiTexImage1DEXT = caps.get(1569); + glCopyMultiTexImage2DEXT = caps.get(1570); + glCopyMultiTexSubImage1DEXT = caps.get(1571); + glCopyMultiTexSubImage2DEXT = caps.get(1572); + glGetMultiTexImageEXT = caps.get(1573); + glGetMultiTexParameterfvEXT = caps.get(1574); + glGetMultiTexParameterivEXT = caps.get(1575); + glGetMultiTexLevelParameterfvEXT = caps.get(1576); + glGetMultiTexLevelParameterivEXT = caps.get(1577); + glMultiTexImage3DEXT = caps.get(1578); + glMultiTexSubImage3DEXT = caps.get(1579); + glCopyMultiTexSubImage3DEXT = caps.get(1580); + glEnableClientStateIndexedEXT = caps.get(1581); + glDisableClientStateIndexedEXT = caps.get(1582); + glEnableClientStateiEXT = caps.get(1583); + glDisableClientStateiEXT = caps.get(1584); + glGetFloatIndexedvEXT = caps.get(1585); + glGetDoubleIndexedvEXT = caps.get(1586); + glGetPointerIndexedvEXT = caps.get(1587); + glGetFloati_vEXT = caps.get(1588); + glGetDoublei_vEXT = caps.get(1589); + glGetPointeri_vEXT = caps.get(1590); + glEnableIndexedEXT = caps.get(1591); + glDisableIndexedEXT = caps.get(1592); + glIsEnabledIndexedEXT = caps.get(1593); + glGetIntegerIndexedvEXT = caps.get(1594); + glGetBooleanIndexedvEXT = caps.get(1595); + glNamedProgramStringEXT = caps.get(1596); + glNamedProgramLocalParameter4dEXT = caps.get(1597); + glNamedProgramLocalParameter4dvEXT = caps.get(1598); + glNamedProgramLocalParameter4fEXT = caps.get(1599); + glNamedProgramLocalParameter4fvEXT = caps.get(1600); + glGetNamedProgramLocalParameterdvEXT = caps.get(1601); + glGetNamedProgramLocalParameterfvEXT = caps.get(1602); + glGetNamedProgramivEXT = caps.get(1603); + glGetNamedProgramStringEXT = caps.get(1604); + glCompressedTextureImage3DEXT = caps.get(1605); + glCompressedTextureImage2DEXT = caps.get(1606); + glCompressedTextureImage1DEXT = caps.get(1607); + glCompressedTextureSubImage3DEXT = caps.get(1608); + glCompressedTextureSubImage2DEXT = caps.get(1609); + glCompressedTextureSubImage1DEXT = caps.get(1610); + glGetCompressedTextureImageEXT = caps.get(1611); + glCompressedMultiTexImage3DEXT = caps.get(1612); + glCompressedMultiTexImage2DEXT = caps.get(1613); + glCompressedMultiTexImage1DEXT = caps.get(1614); + glCompressedMultiTexSubImage3DEXT = caps.get(1615); + glCompressedMultiTexSubImage2DEXT = caps.get(1616); + glCompressedMultiTexSubImage1DEXT = caps.get(1617); + glGetCompressedMultiTexImageEXT = caps.get(1618); + glMatrixLoadTransposefEXT = caps.get(1619); + glMatrixLoadTransposedEXT = caps.get(1620); + glMatrixMultTransposefEXT = caps.get(1621); + glMatrixMultTransposedEXT = caps.get(1622); + glNamedBufferDataEXT = caps.get(1623); + glNamedBufferSubDataEXT = caps.get(1624); + glMapNamedBufferEXT = caps.get(1625); + glUnmapNamedBufferEXT = caps.get(1626); + glGetNamedBufferParameterivEXT = caps.get(1627); + glGetNamedBufferSubDataEXT = caps.get(1628); + glProgramUniform1fEXT = caps.get(1629); + glProgramUniform2fEXT = caps.get(1630); + glProgramUniform3fEXT = caps.get(1631); + glProgramUniform4fEXT = caps.get(1632); + glProgramUniform1iEXT = caps.get(1633); + glProgramUniform2iEXT = caps.get(1634); + glProgramUniform3iEXT = caps.get(1635); + glProgramUniform4iEXT = caps.get(1636); + glProgramUniform1fvEXT = caps.get(1637); + glProgramUniform2fvEXT = caps.get(1638); + glProgramUniform3fvEXT = caps.get(1639); + glProgramUniform4fvEXT = caps.get(1640); + glProgramUniform1ivEXT = caps.get(1641); + glProgramUniform2ivEXT = caps.get(1642); + glProgramUniform3ivEXT = caps.get(1643); + glProgramUniform4ivEXT = caps.get(1644); + glProgramUniformMatrix2fvEXT = caps.get(1645); + glProgramUniformMatrix3fvEXT = caps.get(1646); + glProgramUniformMatrix4fvEXT = caps.get(1647); + glProgramUniformMatrix2x3fvEXT = caps.get(1648); + glProgramUniformMatrix3x2fvEXT = caps.get(1649); + glProgramUniformMatrix2x4fvEXT = caps.get(1650); + glProgramUniformMatrix4x2fvEXT = caps.get(1651); + glProgramUniformMatrix3x4fvEXT = caps.get(1652); + glProgramUniformMatrix4x3fvEXT = caps.get(1653); + glTextureBufferEXT = caps.get(1654); + glMultiTexBufferEXT = caps.get(1655); + glTextureParameterIivEXT = caps.get(1656); + glTextureParameterIuivEXT = caps.get(1657); + glGetTextureParameterIivEXT = caps.get(1658); + glGetTextureParameterIuivEXT = caps.get(1659); + glMultiTexParameterIivEXT = caps.get(1660); + glMultiTexParameterIuivEXT = caps.get(1661); + glGetMultiTexParameterIivEXT = caps.get(1662); + glGetMultiTexParameterIuivEXT = caps.get(1663); + glProgramUniform1uiEXT = caps.get(1664); + glProgramUniform2uiEXT = caps.get(1665); + glProgramUniform3uiEXT = caps.get(1666); + glProgramUniform4uiEXT = caps.get(1667); + glProgramUniform1uivEXT = caps.get(1668); + glProgramUniform2uivEXT = caps.get(1669); + glProgramUniform3uivEXT = caps.get(1670); + glProgramUniform4uivEXT = caps.get(1671); + glNamedProgramLocalParameters4fvEXT = caps.get(1672); + glNamedProgramLocalParameterI4iEXT = caps.get(1673); + glNamedProgramLocalParameterI4ivEXT = caps.get(1674); + glNamedProgramLocalParametersI4ivEXT = caps.get(1675); + glNamedProgramLocalParameterI4uiEXT = caps.get(1676); + glNamedProgramLocalParameterI4uivEXT = caps.get(1677); + glNamedProgramLocalParametersI4uivEXT = caps.get(1678); + glGetNamedProgramLocalParameterIivEXT = caps.get(1679); + glGetNamedProgramLocalParameterIuivEXT = caps.get(1680); + glNamedRenderbufferStorageEXT = caps.get(1681); + glGetNamedRenderbufferParameterivEXT = caps.get(1682); + glNamedRenderbufferStorageMultisampleEXT = caps.get(1683); + glNamedRenderbufferStorageMultisampleCoverageEXT = caps.get(1684); + glCheckNamedFramebufferStatusEXT = caps.get(1685); + glNamedFramebufferTexture1DEXT = caps.get(1686); + glNamedFramebufferTexture2DEXT = caps.get(1687); + glNamedFramebufferTexture3DEXT = caps.get(1688); + glNamedFramebufferRenderbufferEXT = caps.get(1689); + glGetNamedFramebufferAttachmentParameterivEXT = caps.get(1690); + glGenerateTextureMipmapEXT = caps.get(1691); + glGenerateMultiTexMipmapEXT = caps.get(1692); + glFramebufferDrawBufferEXT = caps.get(1693); + glFramebufferDrawBuffersEXT = caps.get(1694); + glFramebufferReadBufferEXT = caps.get(1695); + glGetFramebufferParameterivEXT = caps.get(1696); + glNamedCopyBufferSubDataEXT = caps.get(1697); + glNamedFramebufferTextureEXT = caps.get(1698); + glNamedFramebufferTextureLayerEXT = caps.get(1699); + glNamedFramebufferTextureFaceEXT = caps.get(1700); + glTextureRenderbufferEXT = caps.get(1701); + glMultiTexRenderbufferEXT = caps.get(1702); + glVertexArrayVertexOffsetEXT = caps.get(1703); + glVertexArrayColorOffsetEXT = caps.get(1704); + glVertexArrayEdgeFlagOffsetEXT = caps.get(1705); + glVertexArrayIndexOffsetEXT = caps.get(1706); + glVertexArrayNormalOffsetEXT = caps.get(1707); + glVertexArrayTexCoordOffsetEXT = caps.get(1708); + glVertexArrayMultiTexCoordOffsetEXT = caps.get(1709); + glVertexArrayFogCoordOffsetEXT = caps.get(1710); + glVertexArraySecondaryColorOffsetEXT = caps.get(1711); + glVertexArrayVertexAttribOffsetEXT = caps.get(1712); + glVertexArrayVertexAttribIOffsetEXT = caps.get(1713); + glEnableVertexArrayEXT = caps.get(1714); + glDisableVertexArrayEXT = caps.get(1715); + glEnableVertexArrayAttribEXT = caps.get(1716); + glDisableVertexArrayAttribEXT = caps.get(1717); + glGetVertexArrayIntegervEXT = caps.get(1718); + glGetVertexArrayPointervEXT = caps.get(1719); + glGetVertexArrayIntegeri_vEXT = caps.get(1720); + glGetVertexArrayPointeri_vEXT = caps.get(1721); + glMapNamedBufferRangeEXT = caps.get(1722); + glFlushMappedNamedBufferRangeEXT = caps.get(1723); + glColorMaskIndexedEXT = caps.get(1724); + glDrawArraysInstancedEXT = caps.get(1725); + glDrawElementsInstancedEXT = caps.get(1726); + glEGLImageTargetTexStorageEXT = caps.get(1727); + glEGLImageTargetTextureStorageEXT = caps.get(1728); + glBufferStorageExternalEXT = caps.get(1729); + glNamedBufferStorageExternalEXT = caps.get(1730); + glBlitFramebufferEXT = caps.get(1731); + glBlitFramebufferLayersEXT = caps.get(1732); + glBlitFramebufferLayerEXT = caps.get(1733); + glRenderbufferStorageMultisampleEXT = caps.get(1734); + glIsRenderbufferEXT = caps.get(1735); + glBindRenderbufferEXT = caps.get(1736); + glDeleteRenderbuffersEXT = caps.get(1737); + glGenRenderbuffersEXT = caps.get(1738); + glRenderbufferStorageEXT = caps.get(1739); + glGetRenderbufferParameterivEXT = caps.get(1740); + glIsFramebufferEXT = caps.get(1741); + glBindFramebufferEXT = caps.get(1742); + glDeleteFramebuffersEXT = caps.get(1743); + glGenFramebuffersEXT = caps.get(1744); + glCheckFramebufferStatusEXT = caps.get(1745); + glFramebufferTexture1DEXT = caps.get(1746); + glFramebufferTexture2DEXT = caps.get(1747); + glFramebufferTexture3DEXT = caps.get(1748); + glFramebufferRenderbufferEXT = caps.get(1749); + glGetFramebufferAttachmentParameterivEXT = caps.get(1750); + glGenerateMipmapEXT = caps.get(1751); + glProgramParameteriEXT = caps.get(1752); + glFramebufferTextureEXT = caps.get(1753); + glFramebufferTextureLayerEXT = caps.get(1754); + glFramebufferTextureFaceEXT = caps.get(1755); + glProgramEnvParameters4fvEXT = caps.get(1756); + glProgramLocalParameters4fvEXT = caps.get(1757); + glVertexAttribI1iEXT = caps.get(1758); + glVertexAttribI2iEXT = caps.get(1759); + glVertexAttribI3iEXT = caps.get(1760); + glVertexAttribI4iEXT = caps.get(1761); + glVertexAttribI1uiEXT = caps.get(1762); + glVertexAttribI2uiEXT = caps.get(1763); + glVertexAttribI3uiEXT = caps.get(1764); + glVertexAttribI4uiEXT = caps.get(1765); + glVertexAttribI1ivEXT = caps.get(1766); + glVertexAttribI2ivEXT = caps.get(1767); + glVertexAttribI3ivEXT = caps.get(1768); + glVertexAttribI4ivEXT = caps.get(1769); + glVertexAttribI1uivEXT = caps.get(1770); + glVertexAttribI2uivEXT = caps.get(1771); + glVertexAttribI3uivEXT = caps.get(1772); + glVertexAttribI4uivEXT = caps.get(1773); + glVertexAttribI4bvEXT = caps.get(1774); + glVertexAttribI4svEXT = caps.get(1775); + glVertexAttribI4ubvEXT = caps.get(1776); + glVertexAttribI4usvEXT = caps.get(1777); + glVertexAttribIPointerEXT = caps.get(1778); + glGetVertexAttribIivEXT = caps.get(1779); + glGetVertexAttribIuivEXT = caps.get(1780); + glGetUniformuivEXT = caps.get(1781); + glBindFragDataLocationEXT = caps.get(1782); + glGetFragDataLocationEXT = caps.get(1783); + glUniform1uiEXT = caps.get(1784); + glUniform2uiEXT = caps.get(1785); + glUniform3uiEXT = caps.get(1786); + glUniform4uiEXT = caps.get(1787); + glUniform1uivEXT = caps.get(1788); + glUniform2uivEXT = caps.get(1789); + glUniform3uivEXT = caps.get(1790); + glUniform4uivEXT = caps.get(1791); + glGetUnsignedBytevEXT = caps.get(1792); + glGetUnsignedBytei_vEXT = caps.get(1793); + glDeleteMemoryObjectsEXT = caps.get(1794); + glIsMemoryObjectEXT = caps.get(1795); + glCreateMemoryObjectsEXT = caps.get(1796); + glMemoryObjectParameterivEXT = caps.get(1797); + glGetMemoryObjectParameterivEXT = caps.get(1798); + glTexStorageMem2DEXT = caps.get(1799); + glTexStorageMem2DMultisampleEXT = caps.get(1800); + glTexStorageMem3DEXT = caps.get(1801); + glTexStorageMem3DMultisampleEXT = caps.get(1802); + glBufferStorageMemEXT = caps.get(1803); + glTextureStorageMem2DEXT = caps.get(1804); + glTextureStorageMem2DMultisampleEXT = caps.get(1805); + glTextureStorageMem3DEXT = caps.get(1806); + glTextureStorageMem3DMultisampleEXT = caps.get(1807); + glNamedBufferStorageMemEXT = caps.get(1808); + glTexStorageMem1DEXT = caps.get(1809); + glTextureStorageMem1DEXT = caps.get(1810); + glImportMemoryFdEXT = caps.get(1811); + glImportMemoryWin32HandleEXT = caps.get(1812); + glImportMemoryWin32NameEXT = caps.get(1813); + glPointParameterfEXT = caps.get(1814); + glPointParameterfvEXT = caps.get(1815); + glPolygonOffsetClampEXT = caps.get(1816); + glProvokingVertexEXT = caps.get(1817); + glRasterSamplesEXT = caps.get(1818); + glSecondaryColor3bEXT = caps.get(1819); + glSecondaryColor3sEXT = caps.get(1820); + glSecondaryColor3iEXT = caps.get(1821); + glSecondaryColor3fEXT = caps.get(1822); + glSecondaryColor3dEXT = caps.get(1823); + glSecondaryColor3ubEXT = caps.get(1824); + glSecondaryColor3usEXT = caps.get(1825); + glSecondaryColor3uiEXT = caps.get(1826); + glSecondaryColor3bvEXT = caps.get(1827); + glSecondaryColor3svEXT = caps.get(1828); + glSecondaryColor3ivEXT = caps.get(1829); + glSecondaryColor3fvEXT = caps.get(1830); + glSecondaryColor3dvEXT = caps.get(1831); + glSecondaryColor3ubvEXT = caps.get(1832); + glSecondaryColor3usvEXT = caps.get(1833); + glSecondaryColor3uivEXT = caps.get(1834); + glSecondaryColorPointerEXT = caps.get(1835); + glGenSemaphoresEXT = caps.get(1836); + glDeleteSemaphoresEXT = caps.get(1837); + glIsSemaphoreEXT = caps.get(1838); + glSemaphoreParameterui64vEXT = caps.get(1839); + glGetSemaphoreParameterui64vEXT = caps.get(1840); + glWaitSemaphoreEXT = caps.get(1841); + glSignalSemaphoreEXT = caps.get(1842); + glImportSemaphoreFdEXT = caps.get(1843); + glImportSemaphoreWin32HandleEXT = caps.get(1844); + glImportSemaphoreWin32NameEXT = caps.get(1845); + glUseShaderProgramEXT = caps.get(1846); + glActiveProgramEXT = caps.get(1847); + glCreateShaderProgramEXT = caps.get(1848); + glFramebufferFetchBarrierEXT = caps.get(1849); + glBindImageTextureEXT = caps.get(1850); + glMemoryBarrierEXT = caps.get(1851); + glStencilClearTagEXT = caps.get(1852); + glActiveStencilFaceEXT = caps.get(1853); + glTexBufferEXT = caps.get(1854); + glClearColorIiEXT = caps.get(1855); + glClearColorIuiEXT = caps.get(1856); + glTexParameterIivEXT = caps.get(1857); + glTexParameterIuivEXT = caps.get(1858); + glGetTexParameterIivEXT = caps.get(1859); + glGetTexParameterIuivEXT = caps.get(1860); + glTexStorage1DEXT = caps.get(1861); + glTexStorage2DEXT = caps.get(1862); + glTexStorage3DEXT = caps.get(1863); + glGetQueryObjecti64vEXT = caps.get(1864); + glGetQueryObjectui64vEXT = caps.get(1865); + glBindBufferRangeEXT = caps.get(1866); + glBindBufferOffsetEXT = caps.get(1867); + glBindBufferBaseEXT = caps.get(1868); + glBeginTransformFeedbackEXT = caps.get(1869); + glEndTransformFeedbackEXT = caps.get(1870); + glTransformFeedbackVaryingsEXT = caps.get(1871); + glGetTransformFeedbackVaryingEXT = caps.get(1872); + glVertexAttribL1dEXT = caps.get(1873); + glVertexAttribL2dEXT = caps.get(1874); + glVertexAttribL3dEXT = caps.get(1875); + glVertexAttribL4dEXT = caps.get(1876); + glVertexAttribL1dvEXT = caps.get(1877); + glVertexAttribL2dvEXT = caps.get(1878); + glVertexAttribL3dvEXT = caps.get(1879); + glVertexAttribL4dvEXT = caps.get(1880); + glVertexAttribLPointerEXT = caps.get(1881); + glGetVertexAttribLdvEXT = caps.get(1882); + glAcquireKeyedMutexWin32EXT = caps.get(1883); + glReleaseKeyedMutexWin32EXT = caps.get(1884); + glWindowRectanglesEXT = caps.get(1885); + glImportSyncEXT = caps.get(1886); + glFrameTerminatorGREMEDY = caps.get(1887); + glStringMarkerGREMEDY = caps.get(1888); + glApplyFramebufferAttachmentCMAAINTEL = caps.get(1889); + glSyncTextureINTEL = caps.get(1890); + glUnmapTexture2DINTEL = caps.get(1891); + glMapTexture2DINTEL = caps.get(1892); + glBeginPerfQueryINTEL = caps.get(1893); + glCreatePerfQueryINTEL = caps.get(1894); + glDeletePerfQueryINTEL = caps.get(1895); + glEndPerfQueryINTEL = caps.get(1896); + glGetFirstPerfQueryIdINTEL = caps.get(1897); + glGetNextPerfQueryIdINTEL = caps.get(1898); + glGetPerfCounterInfoINTEL = caps.get(1899); + glGetPerfQueryDataINTEL = caps.get(1900); + glGetPerfQueryIdByNameINTEL = caps.get(1901); + glGetPerfQueryInfoINTEL = caps.get(1902); + glBlendBarrierKHR = caps.get(1903); + glMaxShaderCompilerThreadsKHR = caps.get(1904); + glFramebufferParameteriMESA = caps.get(1905); + glGetFramebufferParameterivMESA = caps.get(1906); + glAlphaToCoverageDitherControlNV = caps.get(1907); + glMultiDrawArraysIndirectBindlessNV = caps.get(1908); + glMultiDrawElementsIndirectBindlessNV = caps.get(1909); + glMultiDrawArraysIndirectBindlessCountNV = caps.get(1910); + glMultiDrawElementsIndirectBindlessCountNV = caps.get(1911); + glGetTextureHandleNV = caps.get(1912); + glGetTextureSamplerHandleNV = caps.get(1913); + glMakeTextureHandleResidentNV = caps.get(1914); + glMakeTextureHandleNonResidentNV = caps.get(1915); + glGetImageHandleNV = caps.get(1916); + glMakeImageHandleResidentNV = caps.get(1917); + glMakeImageHandleNonResidentNV = caps.get(1918); + glUniformHandleui64NV = caps.get(1919); + glUniformHandleui64vNV = caps.get(1920); + glProgramUniformHandleui64NV = caps.get(1921); + glProgramUniformHandleui64vNV = caps.get(1922); + glIsTextureHandleResidentNV = caps.get(1923); + glIsImageHandleResidentNV = caps.get(1924); + glBlendParameteriNV = caps.get(1925); + glBlendBarrierNV = caps.get(1926); + glViewportPositionWScaleNV = caps.get(1927); + glCreateStatesNV = caps.get(1928); + glDeleteStatesNV = caps.get(1929); + glIsStateNV = caps.get(1930); + glStateCaptureNV = caps.get(1931); + glGetCommandHeaderNV = caps.get(1932); + glGetStageIndexNV = caps.get(1933); + glDrawCommandsNV = caps.get(1934); + glDrawCommandsAddressNV = caps.get(1935); + glDrawCommandsStatesNV = caps.get(1936); + glDrawCommandsStatesAddressNV = caps.get(1937); + glCreateCommandListsNV = caps.get(1938); + glDeleteCommandListsNV = caps.get(1939); + glIsCommandListNV = caps.get(1940); + glListDrawCommandsStatesClientNV = caps.get(1941); + glCommandListSegmentsNV = caps.get(1942); + glCompileCommandListNV = caps.get(1943); + glCallCommandListNV = caps.get(1944); + glBeginConditionalRenderNV = caps.get(1945); + glEndConditionalRenderNV = caps.get(1946); + glSubpixelPrecisionBiasNV = caps.get(1947); + glConservativeRasterParameterfNV = caps.get(1948); + glConservativeRasterParameteriNV = caps.get(1949); + glCopyImageSubDataNV = caps.get(1950); + glDepthRangedNV = caps.get(1951); + glClearDepthdNV = caps.get(1952); + glDepthBoundsdNV = caps.get(1953); + glDrawTextureNV = caps.get(1954); + glDrawVkImageNV = caps.get(1955); + glGetVkProcAddrNV = caps.get(1956); + glWaitVkSemaphoreNV = caps.get(1957); + glSignalVkSemaphoreNV = caps.get(1958); + glSignalVkFenceNV = caps.get(1959); + glGetMultisamplefvNV = caps.get(1960); + glSampleMaskIndexedNV = caps.get(1961); + glTexRenderbufferNV = caps.get(1962); + glDeleteFencesNV = caps.get(1963); + glGenFencesNV = caps.get(1964); + glIsFenceNV = caps.get(1965); + glTestFenceNV = caps.get(1966); + glGetFenceivNV = caps.get(1967); + glFinishFenceNV = caps.get(1968); + glSetFenceNV = caps.get(1969); + glFragmentCoverageColorNV = caps.get(1970); + glCoverageModulationTableNV = caps.get(1971); + glGetCoverageModulationTableNV = caps.get(1972); + glCoverageModulationNV = caps.get(1973); + glRenderbufferStorageMultisampleCoverageNV = caps.get(1974); + glRenderGpuMaskNV = caps.get(1975); + glMulticastBufferSubDataNV = caps.get(1976); + glMulticastCopyBufferSubDataNV = caps.get(1977); + glMulticastCopyImageSubDataNV = caps.get(1978); + glMulticastBlitFramebufferNV = caps.get(1979); + glMulticastFramebufferSampleLocationsfvNV = caps.get(1980); + glMulticastBarrierNV = caps.get(1981); + glMulticastWaitSyncNV = caps.get(1982); + glMulticastGetQueryObjectivNV = caps.get(1983); + glMulticastGetQueryObjectuivNV = caps.get(1984); + glMulticastGetQueryObjecti64vNV = caps.get(1985); + glMulticastGetQueryObjectui64vNV = caps.get(1986); + glVertex2hNV = caps.get(1987); + glVertex2hvNV = caps.get(1988); + glVertex3hNV = caps.get(1989); + glVertex3hvNV = caps.get(1990); + glVertex4hNV = caps.get(1991); + glVertex4hvNV = caps.get(1992); + glNormal3hNV = caps.get(1993); + glNormal3hvNV = caps.get(1994); + glColor3hNV = caps.get(1995); + glColor3hvNV = caps.get(1996); + glColor4hNV = caps.get(1997); + glColor4hvNV = caps.get(1998); + glTexCoord1hNV = caps.get(1999); + glTexCoord1hvNV = caps.get(2000); + glTexCoord2hNV = caps.get(2001); + glTexCoord2hvNV = caps.get(2002); + glTexCoord3hNV = caps.get(2003); + glTexCoord3hvNV = caps.get(2004); + glTexCoord4hNV = caps.get(2005); + glTexCoord4hvNV = caps.get(2006); + glMultiTexCoord1hNV = caps.get(2007); + glMultiTexCoord1hvNV = caps.get(2008); + glMultiTexCoord2hNV = caps.get(2009); + glMultiTexCoord2hvNV = caps.get(2010); + glMultiTexCoord3hNV = caps.get(2011); + glMultiTexCoord3hvNV = caps.get(2012); + glMultiTexCoord4hNV = caps.get(2013); + glMultiTexCoord4hvNV = caps.get(2014); + glFogCoordhNV = caps.get(2015); + glFogCoordhvNV = caps.get(2016); + glSecondaryColor3hNV = caps.get(2017); + glSecondaryColor3hvNV = caps.get(2018); + glVertexWeighthNV = caps.get(2019); + glVertexWeighthvNV = caps.get(2020); + glVertexAttrib1hNV = caps.get(2021); + glVertexAttrib1hvNV = caps.get(2022); + glVertexAttrib2hNV = caps.get(2023); + glVertexAttrib2hvNV = caps.get(2024); + glVertexAttrib3hNV = caps.get(2025); + glVertexAttrib3hvNV = caps.get(2026); + glVertexAttrib4hNV = caps.get(2027); + glVertexAttrib4hvNV = caps.get(2028); + glVertexAttribs1hvNV = caps.get(2029); + glVertexAttribs2hvNV = caps.get(2030); + glVertexAttribs3hvNV = caps.get(2031); + glVertexAttribs4hvNV = caps.get(2032); + glGetInternalformatSampleivNV = caps.get(2033); + glGetMemoryObjectDetachedResourcesuivNV = caps.get(2034); + glResetMemoryObjectParameterNV = caps.get(2035); + glTexAttachMemoryNV = caps.get(2036); + glBufferAttachMemoryNV = caps.get(2037); + glTextureAttachMemoryNV = caps.get(2038); + glNamedBufferAttachMemoryNV = caps.get(2039); + glBufferPageCommitmentMemNV = caps.get(2040); + glNamedBufferPageCommitmentMemNV = caps.get(2041); + glTexPageCommitmentMemNV = caps.get(2042); + glTexturePageCommitmentMemNV = caps.get(2043); + glDrawMeshTasksNV = caps.get(2044); + glDrawMeshTasksIndirectNV = caps.get(2045); + glMultiDrawMeshTasksIndirectNV = caps.get(2046); + glMultiDrawMeshTasksIndirectCountNV = caps.get(2047); + glPathCommandsNV = caps.get(2048); + glPathCoordsNV = caps.get(2049); + glPathSubCommandsNV = caps.get(2050); + glPathSubCoordsNV = caps.get(2051); + glPathStringNV = caps.get(2052); + glPathGlyphsNV = caps.get(2053); + glPathGlyphRangeNV = caps.get(2054); + glPathGlyphIndexArrayNV = caps.get(2055); + glPathMemoryGlyphIndexArrayNV = caps.get(2056); + glCopyPathNV = caps.get(2057); + glWeightPathsNV = caps.get(2058); + glInterpolatePathsNV = caps.get(2059); + glTransformPathNV = caps.get(2060); + glPathParameterivNV = caps.get(2061); + glPathParameteriNV = caps.get(2062); + glPathParameterfvNV = caps.get(2063); + glPathParameterfNV = caps.get(2064); + glPathDashArrayNV = caps.get(2065); + glGenPathsNV = caps.get(2066); + glDeletePathsNV = caps.get(2067); + glIsPathNV = caps.get(2068); + glPathStencilFuncNV = caps.get(2069); + glPathStencilDepthOffsetNV = caps.get(2070); + glStencilFillPathNV = caps.get(2071); + glStencilStrokePathNV = caps.get(2072); + glStencilFillPathInstancedNV = caps.get(2073); + glStencilStrokePathInstancedNV = caps.get(2074); + glPathCoverDepthFuncNV = caps.get(2075); + glPathColorGenNV = caps.get(2076); + glPathTexGenNV = caps.get(2077); + glPathFogGenNV = caps.get(2078); + glCoverFillPathNV = caps.get(2079); + glCoverStrokePathNV = caps.get(2080); + glCoverFillPathInstancedNV = caps.get(2081); + glCoverStrokePathInstancedNV = caps.get(2082); + glStencilThenCoverFillPathNV = caps.get(2083); + glStencilThenCoverStrokePathNV = caps.get(2084); + glStencilThenCoverFillPathInstancedNV = caps.get(2085); + glStencilThenCoverStrokePathInstancedNV = caps.get(2086); + glPathGlyphIndexRangeNV = caps.get(2087); + glProgramPathFragmentInputGenNV = caps.get(2088); + glGetPathParameterivNV = caps.get(2089); + glGetPathParameterfvNV = caps.get(2090); + glGetPathCommandsNV = caps.get(2091); + glGetPathCoordsNV = caps.get(2092); + glGetPathDashArrayNV = caps.get(2093); + glGetPathMetricsNV = caps.get(2094); + glGetPathMetricRangeNV = caps.get(2095); + glGetPathSpacingNV = caps.get(2096); + glGetPathColorGenivNV = caps.get(2097); + glGetPathColorGenfvNV = caps.get(2098); + glGetPathTexGenivNV = caps.get(2099); + glGetPathTexGenfvNV = caps.get(2100); + glIsPointInFillPathNV = caps.get(2101); + glIsPointInStrokePathNV = caps.get(2102); + glGetPathLengthNV = caps.get(2103); + glPointAlongPathNV = caps.get(2104); + glMatrixLoad3x2fNV = caps.get(2105); + glMatrixLoad3x3fNV = caps.get(2106); + glMatrixLoadTranspose3x3fNV = caps.get(2107); + glMatrixMult3x2fNV = caps.get(2108); + glMatrixMult3x3fNV = caps.get(2109); + glMatrixMultTranspose3x3fNV = caps.get(2110); + glGetProgramResourcefvNV = caps.get(2111); + glPixelDataRangeNV = caps.get(2112); + glFlushPixelDataRangeNV = caps.get(2113); + glPointParameteriNV = caps.get(2114); + glPointParameterivNV = caps.get(2115); + glPrimitiveRestartNV = caps.get(2116); + glPrimitiveRestartIndexNV = caps.get(2117); + glQueryResourceNV = caps.get(2118); + glGenQueryResourceTagNV = caps.get(2119); + glDeleteQueryResourceTagNV = caps.get(2120); + glQueryResourceTagNV = caps.get(2121); + glFramebufferSampleLocationsfvNV = caps.get(2122); + glNamedFramebufferSampleLocationsfvNV = caps.get(2123); + glResolveDepthValuesNV = caps.get(2124); + glScissorExclusiveArrayvNV = caps.get(2125); + glScissorExclusiveNV = caps.get(2126); + glMakeBufferResidentNV = caps.get(2127); + glMakeBufferNonResidentNV = caps.get(2128); + glIsBufferResidentNV = caps.get(2129); + glMakeNamedBufferResidentNV = caps.get(2130); + glMakeNamedBufferNonResidentNV = caps.get(2131); + glIsNamedBufferResidentNV = caps.get(2132); + glGetBufferParameterui64vNV = caps.get(2133); + glGetNamedBufferParameterui64vNV = caps.get(2134); + glGetIntegerui64vNV = caps.get(2135); + glUniformui64NV = caps.get(2136); + glUniformui64vNV = caps.get(2137); + glProgramUniformui64NV = caps.get(2138); + glProgramUniformui64vNV = caps.get(2139); + glBindShadingRateImageNV = caps.get(2140); + glShadingRateImagePaletteNV = caps.get(2141); + glGetShadingRateImagePaletteNV = caps.get(2142); + glShadingRateImageBarrierNV = caps.get(2143); + glShadingRateSampleOrderNV = caps.get(2144); + glShadingRateSampleOrderCustomNV = caps.get(2145); + glGetShadingRateSampleLocationivNV = caps.get(2146); + glTextureBarrierNV = caps.get(2147); + glTexImage2DMultisampleCoverageNV = caps.get(2148); + glTexImage3DMultisampleCoverageNV = caps.get(2149); + glTextureImage2DMultisampleNV = caps.get(2150); + glTextureImage3DMultisampleNV = caps.get(2151); + glTextureImage2DMultisampleCoverageNV = caps.get(2152); + glTextureImage3DMultisampleCoverageNV = caps.get(2153); + glCreateSemaphoresNV = caps.get(2154); + glSemaphoreParameterivNV = caps.get(2155); + glGetSemaphoreParameterivNV = caps.get(2156); + glBeginTransformFeedbackNV = caps.get(2157); + glEndTransformFeedbackNV = caps.get(2158); + glTransformFeedbackAttribsNV = caps.get(2159); + glBindBufferRangeNV = caps.get(2160); + glBindBufferOffsetNV = caps.get(2161); + glBindBufferBaseNV = caps.get(2162); + glTransformFeedbackVaryingsNV = caps.get(2163); + glActiveVaryingNV = caps.get(2164); + glGetVaryingLocationNV = caps.get(2165); + glGetActiveVaryingNV = caps.get(2166); + glGetTransformFeedbackVaryingNV = caps.get(2167); + glTransformFeedbackStreamAttribsNV = caps.get(2168); + glBindTransformFeedbackNV = caps.get(2169); + glDeleteTransformFeedbacksNV = caps.get(2170); + glGenTransformFeedbacksNV = caps.get(2171); + glIsTransformFeedbackNV = caps.get(2172); + glPauseTransformFeedbackNV = caps.get(2173); + glResumeTransformFeedbackNV = caps.get(2174); + glDrawTransformFeedbackNV = caps.get(2175); + glVertexArrayRangeNV = caps.get(2176); + glFlushVertexArrayRangeNV = caps.get(2177); + glVertexAttribL1i64NV = caps.get(2178); + glVertexAttribL2i64NV = caps.get(2179); + glVertexAttribL3i64NV = caps.get(2180); + glVertexAttribL4i64NV = caps.get(2181); + glVertexAttribL1i64vNV = caps.get(2182); + glVertexAttribL2i64vNV = caps.get(2183); + glVertexAttribL3i64vNV = caps.get(2184); + glVertexAttribL4i64vNV = caps.get(2185); + glVertexAttribL1ui64NV = caps.get(2186); + glVertexAttribL2ui64NV = caps.get(2187); + glVertexAttribL3ui64NV = caps.get(2188); + glVertexAttribL4ui64NV = caps.get(2189); + glVertexAttribL1ui64vNV = caps.get(2190); + glVertexAttribL2ui64vNV = caps.get(2191); + glVertexAttribL3ui64vNV = caps.get(2192); + glVertexAttribL4ui64vNV = caps.get(2193); + glGetVertexAttribLi64vNV = caps.get(2194); + glGetVertexAttribLui64vNV = caps.get(2195); + glVertexAttribLFormatNV = caps.get(2196); + glBufferAddressRangeNV = caps.get(2197); + glVertexFormatNV = caps.get(2198); + glNormalFormatNV = caps.get(2199); + glColorFormatNV = caps.get(2200); + glIndexFormatNV = caps.get(2201); + glTexCoordFormatNV = caps.get(2202); + glEdgeFlagFormatNV = caps.get(2203); + glSecondaryColorFormatNV = caps.get(2204); + glFogCoordFormatNV = caps.get(2205); + glVertexAttribFormatNV = caps.get(2206); + glVertexAttribIFormatNV = caps.get(2207); + glGetIntegerui64i_vNV = caps.get(2208); + glViewportSwizzleNV = caps.get(2209); + glBeginConditionalRenderNVX = caps.get(2210); + glEndConditionalRenderNVX = caps.get(2211); + glAsyncCopyImageSubDataNVX = caps.get(2212); + glAsyncCopyBufferSubDataNVX = caps.get(2213); + glUploadGpuMaskNVX = caps.get(2214); + glMulticastViewportArrayvNVX = caps.get(2215); + glMulticastScissorArrayvNVX = caps.get(2216); + glMulticastViewportPositionWScaleNVX = caps.get(2217); + glCreateProgressFenceNVX = caps.get(2218); + glSignalSemaphoreui64NVX = caps.get(2219); + glWaitSemaphoreui64NVX = caps.get(2220); + glClientWaitSemaphoreui64NVX = caps.get(2221); + glFramebufferTextureMultiviewOVR = caps.get(2222); + glNamedFramebufferTextureMultiviewOVR = caps.get(2223); + + addresses = ThreadLocalUtil.setupAddressBuffer(caps); + } + + /** Returns the buffer of OpenGL function pointers. */ + public PointerBuffer getAddressBuffer() { + return addresses; + } + + /** Ensures that the lwjgl_opengl shared library has been loaded. */ + public static void initialize() { + // intentionally empty to trigger static initializer + } + + private static boolean check_GL11(FunctionProvider provider, PointerBuffer caps, Set ext, boolean fc) { + if (!ext.contains("OpenGL11")) { + return false; + } + + int flag0 = !fc || ext.contains("GL_NV_vertex_buffer_unified_memory") ? 0 : Integer.MIN_VALUE; + + return ((fc || checkFunctions(provider, caps, new int[] { + 2, 3, 4, 5, 6, 8, 10, 11, 13, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 52, 53, 54, 56, 64, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 85, 86, 87, 88, 90, 93, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 110, 112, 113, 114, 115, 116, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 138, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 150, 151, 152, 153, 154, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 192, 193, 194, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 248, 249, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334 + }, + "glAccum", "glAlphaFunc", "glAreTexturesResident", "glArrayElement", "glBegin", "glBitmap", "glCallList", "glCallLists", "glClearAccum", + "glClearIndex", "glClipPlane", "glColor3b", "glColor3s", "glColor3i", "glColor3f", "glColor3d", "glColor3ub", "glColor3us", "glColor3ui", + "glColor3bv", "glColor3sv", "glColor3iv", "glColor3fv", "glColor3dv", "glColor3ubv", "glColor3usv", "glColor3uiv", "glColor4b", "glColor4s", + "glColor4i", "glColor4f", "glColor4d", "glColor4ub", "glColor4us", "glColor4ui", "glColor4bv", "glColor4sv", "glColor4iv", "glColor4fv", + "glColor4dv", "glColor4ubv", "glColor4usv", "glColor4uiv", "glColorMaterial", "glColorPointer", "glCopyPixels", "glDeleteLists", "glDrawPixels", + "glEdgeFlag", "glEdgeFlagv", "glEdgeFlagPointer", "glEnd", "glEvalCoord1f", "glEvalCoord1fv", "glEvalCoord1d", "glEvalCoord1dv", "glEvalCoord2f", + "glEvalCoord2fv", "glEvalCoord2d", "glEvalCoord2dv", "glEvalMesh1", "glEvalMesh2", "glEvalPoint1", "glEvalPoint2", "glFeedbackBuffer", "glFogi", + "glFogiv", "glFogf", "glFogfv", "glGenLists", "glGetClipPlane", "glGetLightiv", "glGetLightfv", "glGetMapiv", "glGetMapfv", "glGetMapdv", + "glGetMaterialiv", "glGetMaterialfv", "glGetPixelMapfv", "glGetPixelMapusv", "glGetPixelMapuiv", "glGetPolygonStipple", "glGetTexEnviv", + "glGetTexEnvfv", "glGetTexGeniv", "glGetTexGenfv", "glGetTexGendv", "glIndexi", "glIndexub", "glIndexs", "glIndexf", "glIndexd", "glIndexiv", + "glIndexubv", "glIndexsv", "glIndexfv", "glIndexdv", "glIndexMask", "glIndexPointer", "glInitNames", "glInterleavedArrays", "glIsList", + "glLightModeli", "glLightModelf", "glLightModeliv", "glLightModelfv", "glLighti", "glLightf", "glLightiv", "glLightfv", "glLineStipple", + "glListBase", "glLoadMatrixf", "glLoadMatrixd", "glLoadIdentity", "glLoadName", "glMap1f", "glMap1d", "glMap2f", "glMap2d", "glMapGrid1f", + "glMapGrid1d", "glMapGrid2f", "glMapGrid2d", "glMateriali", "glMaterialf", "glMaterialiv", "glMaterialfv", "glMatrixMode", "glMultMatrixf", + "glMultMatrixd", "glFrustum", "glNewList", "glEndList", "glNormal3f", "glNormal3b", "glNormal3s", "glNormal3i", "glNormal3d", "glNormal3fv", + "glNormal3bv", "glNormal3sv", "glNormal3iv", "glNormal3dv", "glNormalPointer", "glOrtho", "glPassThrough", "glPixelMapfv", "glPixelMapusv", + "glPixelMapuiv", "glPixelTransferi", "glPixelTransferf", "glPixelZoom", "glPolygonStipple", "glPushAttrib", "glPushClientAttrib", "glPopAttrib", + "glPopClientAttrib", "glPopMatrix", "glPopName", "glPrioritizeTextures", "glPushMatrix", "glPushName", "glRasterPos2i", "glRasterPos2s", + "glRasterPos2f", "glRasterPos2d", "glRasterPos2iv", "glRasterPos2sv", "glRasterPos2fv", "glRasterPos2dv", "glRasterPos3i", "glRasterPos3s", + "glRasterPos3f", "glRasterPos3d", "glRasterPos3iv", "glRasterPos3sv", "glRasterPos3fv", "glRasterPos3dv", "glRasterPos4i", "glRasterPos4s", + "glRasterPos4f", "glRasterPos4d", "glRasterPos4iv", "glRasterPos4sv", "glRasterPos4fv", "glRasterPos4dv", "glRecti", "glRects", "glRectf", + "glRectd", "glRectiv", "glRectsv", "glRectfv", "glRectdv", "glRenderMode", "glRotatef", "glRotated", "glScalef", "glScaled", "glSelectBuffer", + "glShadeModel", "glTexCoord1f", "glTexCoord1s", "glTexCoord1i", "glTexCoord1d", "glTexCoord1fv", "glTexCoord1sv", "glTexCoord1iv", "glTexCoord1dv", + "glTexCoord2f", "glTexCoord2s", "glTexCoord2i", "glTexCoord2d", "glTexCoord2fv", "glTexCoord2sv", "glTexCoord2iv", "glTexCoord2dv", "glTexCoord3f", + "glTexCoord3s", "glTexCoord3i", "glTexCoord3d", "glTexCoord3fv", "glTexCoord3sv", "glTexCoord3iv", "glTexCoord3dv", "glTexCoord4f", "glTexCoord4s", + "glTexCoord4i", "glTexCoord4d", "glTexCoord4fv", "glTexCoord4sv", "glTexCoord4iv", "glTexCoord4dv", "glTexCoordPointer", "glTexEnvi", "glTexEnviv", + "glTexEnvf", "glTexEnvfv", "glTexGeni", "glTexGeniv", "glTexGenf", "glTexGenfv", "glTexGend", "glTexGendv", "glTranslatef", "glTranslated", + "glVertex2f", "glVertex2s", "glVertex2i", "glVertex2d", "glVertex2fv", "glVertex2sv", "glVertex2iv", "glVertex2dv", "glVertex3f", "glVertex3s", + "glVertex3i", "glVertex3d", "glVertex3fv", "glVertex3sv", "glVertex3iv", "glVertex3dv", "glVertex4f", "glVertex4s", "glVertex4i", "glVertex4d", + "glVertex4fv", "glVertex4sv", "glVertex4iv", "glVertex4dv", "glVertexPointer" + )) && checkFunctions(provider, caps, new int[] { + 0, 1, 7, 9, 12, 14, 15, 17, 51, 55, 57, 58, 59, flag0 + 60, 61, 62, 63, flag0 + 68, 83, 84, 89, 91, 92, 94, 95, 96, 97, 98, 109, 111, 117, 118, 119, + 120, 121, 122, 137, 139, 149, 155, 190, 191, 195, 196, 197, 232, 233, 247, 250, 251, 252, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 335 + }, + "glEnable", "glDisable", "glBindTexture", "glBlendFunc", "glClear", "glClearColor", "glClearDepth", "glClearStencil", "glColorMask", "glCullFace", + "glDepthFunc", "glDepthMask", "glDepthRange", "glDisableClientState", "glDrawArrays", "glDrawBuffer", "glDrawElements", "glEnableClientState", + "glFinish", "glFlush", "glFrontFace", "glGenTextures", "glDeleteTextures", "glGetBooleanv", "glGetFloatv", "glGetIntegerv", "glGetDoublev", + "glGetError", "glGetPointerv", "glGetString", "glGetTexImage", "glGetTexLevelParameteriv", "glGetTexLevelParameterfv", "glGetTexParameteriv", + "glGetTexParameterfv", "glHint", "glIsEnabled", "glIsTexture", "glLineWidth", "glLogicOp", "glPixelStorei", "glPixelStoref", "glPointSize", + "glPolygonMode", "glPolygonOffset", "glReadBuffer", "glReadPixels", "glScissor", "glStencilFunc", "glStencilMask", "glStencilOp", "glTexImage1D", + "glTexImage2D", "glCopyTexImage1D", "glCopyTexImage2D", "glCopyTexSubImage1D", "glCopyTexSubImage2D", "glTexParameteri", "glTexParameteriv", + "glTexParameterf", "glTexParameterfv", "glTexSubImage1D", "glTexSubImage2D", "glViewport" + )) || reportMissing("GL", "OpenGL11"); + } + + private static boolean check_GL12(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenGL12")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 336, 337, 338, 339 + }, + "glTexImage3D", "glTexSubImage3D", "glCopyTexSubImage3D", "glDrawRangeElements" + )) || reportMissing("GL", "OpenGL12"); + } + + private static boolean check_GL13(FunctionProvider provider, PointerBuffer caps, Set ext, boolean fc) { + if (!ext.contains("OpenGL13")) { + return false; + } + + return ((fc || checkFunctions(provider, caps, new int[] { + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385 + }, + "glClientActiveTexture", "glMultiTexCoord1f", "glMultiTexCoord1s", "glMultiTexCoord1i", "glMultiTexCoord1d", "glMultiTexCoord1fv", + "glMultiTexCoord1sv", "glMultiTexCoord1iv", "glMultiTexCoord1dv", "glMultiTexCoord2f", "glMultiTexCoord2s", "glMultiTexCoord2i", + "glMultiTexCoord2d", "glMultiTexCoord2fv", "glMultiTexCoord2sv", "glMultiTexCoord2iv", "glMultiTexCoord2dv", "glMultiTexCoord3f", + "glMultiTexCoord3s", "glMultiTexCoord3i", "glMultiTexCoord3d", "glMultiTexCoord3fv", "glMultiTexCoord3sv", "glMultiTexCoord3iv", + "glMultiTexCoord3dv", "glMultiTexCoord4f", "glMultiTexCoord4s", "glMultiTexCoord4i", "glMultiTexCoord4d", "glMultiTexCoord4fv", + "glMultiTexCoord4sv", "glMultiTexCoord4iv", "glMultiTexCoord4dv", "glLoadTransposeMatrixf", "glLoadTransposeMatrixd", "glMultTransposeMatrixf", + "glMultTransposeMatrixd" + )) && checkFunctions(provider, caps, new int[] { + 340, 341, 342, 343, 344, 345, 346, 347, 348 + }, + "glCompressedTexImage3D", "glCompressedTexImage2D", "glCompressedTexImage1D", "glCompressedTexSubImage3D", "glCompressedTexSubImage2D", + "glCompressedTexSubImage1D", "glGetCompressedTexImage", "glSampleCoverage", "glActiveTexture" + )) || reportMissing("GL", "OpenGL13"); + } + + private static boolean check_GL14(FunctionProvider provider, PointerBuffer caps, Set ext, boolean fc) { + if (!ext.contains("OpenGL14")) { + return false; + } + + return ((fc || checkFunctions(provider, caps, new int[] { + 388, 389, 390, 391, 392, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432 + }, + "glFogCoordf", "glFogCoordd", "glFogCoordfv", "glFogCoorddv", "glFogCoordPointer", "glSecondaryColor3b", "glSecondaryColor3s", "glSecondaryColor3i", + "glSecondaryColor3f", "glSecondaryColor3d", "glSecondaryColor3ub", "glSecondaryColor3us", "glSecondaryColor3ui", "glSecondaryColor3bv", + "glSecondaryColor3sv", "glSecondaryColor3iv", "glSecondaryColor3fv", "glSecondaryColor3dv", "glSecondaryColor3ubv", "glSecondaryColor3usv", + "glSecondaryColor3uiv", "glSecondaryColorPointer", "glWindowPos2i", "glWindowPos2s", "glWindowPos2f", "glWindowPos2d", "glWindowPos2iv", + "glWindowPos2sv", "glWindowPos2fv", "glWindowPos2dv", "glWindowPos3i", "glWindowPos3s", "glWindowPos3f", "glWindowPos3d", "glWindowPos3iv", + "glWindowPos3sv", "glWindowPos3fv", "glWindowPos3dv" + )) && checkFunctions(provider, caps, new int[] { + 386, 387, 393, 394, 395, 396, 397, 398, 416 + }, + "glBlendColor", "glBlendEquation", "glMultiDrawArrays", "glMultiDrawElements", "glPointParameterf", "glPointParameteri", "glPointParameterfv", + "glPointParameteriv", "glBlendFuncSeparate" + )) || reportMissing("GL", "OpenGL14"); + } + + private static boolean check_GL15(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenGL15")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451 + }, + "glBindBuffer", "glDeleteBuffers", "glGenBuffers", "glIsBuffer", "glBufferData", "glBufferSubData", "glGetBufferSubData", "glMapBuffer", + "glUnmapBuffer", "glGetBufferParameteriv", "glGetBufferPointerv", "glGenQueries", "glDeleteQueries", "glIsQuery", "glBeginQuery", "glEndQuery", + "glGetQueryiv", "glGetQueryObjectiv", "glGetQueryObjectuiv" + )) || reportMissing("GL", "OpenGL15"); + } + + private static boolean check_GL20(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenGL20")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544 + }, + "glCreateProgram", "glDeleteProgram", "glIsProgram", "glCreateShader", "glDeleteShader", "glIsShader", "glAttachShader", "glDetachShader", + "glShaderSource", "glCompileShader", "glLinkProgram", "glUseProgram", "glValidateProgram", "glUniform1f", "glUniform2f", "glUniform3f", + "glUniform4f", "glUniform1i", "glUniform2i", "glUniform3i", "glUniform4i", "glUniform1fv", "glUniform2fv", "glUniform3fv", "glUniform4fv", + "glUniform1iv", "glUniform2iv", "glUniform3iv", "glUniform4iv", "glUniformMatrix2fv", "glUniformMatrix3fv", "glUniformMatrix4fv", "glGetShaderiv", + "glGetProgramiv", "glGetShaderInfoLog", "glGetProgramInfoLog", "glGetAttachedShaders", "glGetUniformLocation", "glGetActiveUniform", + "glGetUniformfv", "glGetUniformiv", "glGetShaderSource", "glVertexAttrib1f", "glVertexAttrib1s", "glVertexAttrib1d", "glVertexAttrib2f", + "glVertexAttrib2s", "glVertexAttrib2d", "glVertexAttrib3f", "glVertexAttrib3s", "glVertexAttrib3d", "glVertexAttrib4f", "glVertexAttrib4s", + "glVertexAttrib4d", "glVertexAttrib4Nub", "glVertexAttrib1fv", "glVertexAttrib1sv", "glVertexAttrib1dv", "glVertexAttrib2fv", "glVertexAttrib2sv", + "glVertexAttrib2dv", "glVertexAttrib3fv", "glVertexAttrib3sv", "glVertexAttrib3dv", "glVertexAttrib4fv", "glVertexAttrib4sv", "glVertexAttrib4dv", + "glVertexAttrib4iv", "glVertexAttrib4bv", "glVertexAttrib4ubv", "glVertexAttrib4usv", "glVertexAttrib4uiv", "glVertexAttrib4Nbv", + "glVertexAttrib4Nsv", "glVertexAttrib4Niv", "glVertexAttrib4Nubv", "glVertexAttrib4Nusv", "glVertexAttrib4Nuiv", "glVertexAttribPointer", + "glEnableVertexAttribArray", "glDisableVertexAttribArray", "glBindAttribLocation", "glGetActiveAttrib", "glGetAttribLocation", + "glGetVertexAttribiv", "glGetVertexAttribfv", "glGetVertexAttribdv", "glGetVertexAttribPointerv", "glDrawBuffers", "glBlendEquationSeparate", + "glStencilOpSeparate", "glStencilFuncSeparate", "glStencilMaskSeparate" + )) || reportMissing("GL", "OpenGL20"); + } + + private static boolean check_GL21(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenGL21")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 545, 546, 547, 548, 549, 550 + }, + "glUniformMatrix2x3fv", "glUniformMatrix3x2fv", "glUniformMatrix2x4fv", "glUniformMatrix4x2fv", "glUniformMatrix3x4fv", "glUniformMatrix4x3fv" + )) || reportMissing("GL", "OpenGL21"); + } + + private static boolean check_GL30(FunctionProvider provider, PointerBuffer caps, Set ext) { + + return (checkFunctions(provider, caps, new int[] { + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634 + }, + "glGetStringi", "glClearBufferiv", "glClearBufferuiv", "glClearBufferfv", "glClearBufferfi", "glVertexAttribI1i", "glVertexAttribI2i", + "glVertexAttribI3i", "glVertexAttribI4i", "glVertexAttribI1ui", "glVertexAttribI2ui", "glVertexAttribI3ui", "glVertexAttribI4ui", + "glVertexAttribI1iv", "glVertexAttribI2iv", "glVertexAttribI3iv", "glVertexAttribI4iv", "glVertexAttribI1uiv", "glVertexAttribI2uiv", + "glVertexAttribI3uiv", "glVertexAttribI4uiv", "glVertexAttribI4bv", "glVertexAttribI4sv", "glVertexAttribI4ubv", "glVertexAttribI4usv", + "glVertexAttribIPointer", "glGetVertexAttribIiv", "glGetVertexAttribIuiv", "glUniform1ui", "glUniform2ui", "glUniform3ui", "glUniform4ui", + "glUniform1uiv", "glUniform2uiv", "glUniform3uiv", "glUniform4uiv", "glGetUniformuiv", "glBindFragDataLocation", "glGetFragDataLocation", + "glBeginConditionalRender", "glEndConditionalRender", "glMapBufferRange", "glFlushMappedBufferRange", "glClampColor", "glIsRenderbuffer", + "glBindRenderbuffer", "glDeleteRenderbuffers", "glGenRenderbuffers", "glRenderbufferStorage", "glRenderbufferStorageMultisample", + "glGetRenderbufferParameteriv", "glIsFramebuffer", "glBindFramebuffer", "glDeleteFramebuffers", "glGenFramebuffers", "glCheckFramebufferStatus", + "glFramebufferTexture1D", "glFramebufferTexture2D", "glFramebufferTexture3D", "glFramebufferTextureLayer", "glFramebufferRenderbuffer", + "glGetFramebufferAttachmentParameteriv", "glBlitFramebuffer", "glGenerateMipmap", "glTexParameterIiv", "glTexParameterIuiv", "glGetTexParameterIiv", + "glGetTexParameterIuiv", "glColorMaski", "glGetBooleani_v", "glGetIntegeri_v", "glEnablei", "glDisablei", "glIsEnabledi", "glBindBufferRange", + "glBindBufferBase", "glBeginTransformFeedback", "glEndTransformFeedback", "glTransformFeedbackVaryings", "glGetTransformFeedbackVarying", + "glBindVertexArray", "glDeleteVertexArrays", "glGenVertexArrays", "glIsVertexArray" + )) && ext.contains("OpenGL30") || reportMissing("GL", "OpenGL30"); + } + + private static boolean check_GL31(FunctionProvider provider, PointerBuffer caps, Set ext) { + + return (checkFunctions(provider, caps, new int[] { + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646 + }, + "glDrawArraysInstanced", "glDrawElementsInstanced", "glCopyBufferSubData", "glPrimitiveRestartIndex", "glTexBuffer", "glGetUniformIndices", + "glGetActiveUniformsiv", "glGetActiveUniformName", "glGetUniformBlockIndex", "glGetActiveUniformBlockiv", "glGetActiveUniformBlockName", + "glUniformBlockBinding" + )) && ext.contains("OpenGL31") || reportMissing("GL", "OpenGL31"); + } + + private static boolean check_GL32(FunctionProvider provider, PointerBuffer caps, Set ext) { + + return (checkFunctions(provider, caps, new int[] { + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665 + }, + "glGetBufferParameteri64v", "glDrawElementsBaseVertex", "glDrawRangeElementsBaseVertex", "glDrawElementsInstancedBaseVertex", + "glMultiDrawElementsBaseVertex", "glProvokingVertex", "glTexImage2DMultisample", "glTexImage3DMultisample", "glGetMultisamplefv", "glSampleMaski", + "glFramebufferTexture", "glFenceSync", "glIsSync", "glDeleteSync", "glClientWaitSync", "glWaitSync", "glGetInteger64v", "glGetInteger64i_v", + "glGetSynciv" + )) && ext.contains("OpenGL32") || reportMissing("GL", "OpenGL32"); + } + + private static boolean check_GL33(FunctionProvider provider, PointerBuffer caps, Set ext, boolean fc) { + + return ((fc || checkFunctions(provider, caps, new int[] { + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715 + }, + "glVertexP2ui", "glVertexP3ui", "glVertexP4ui", "glVertexP2uiv", "glVertexP3uiv", "glVertexP4uiv", "glTexCoordP1ui", "glTexCoordP2ui", + "glTexCoordP3ui", "glTexCoordP4ui", "glTexCoordP1uiv", "glTexCoordP2uiv", "glTexCoordP3uiv", "glTexCoordP4uiv", "glMultiTexCoordP1ui", + "glMultiTexCoordP2ui", "glMultiTexCoordP3ui", "glMultiTexCoordP4ui", "glMultiTexCoordP1uiv", "glMultiTexCoordP2uiv", "glMultiTexCoordP3uiv", + "glMultiTexCoordP4uiv", "glNormalP3ui", "glNormalP3uiv", "glColorP3ui", "glColorP4ui", "glColorP3uiv", "glColorP4uiv", "glSecondaryColorP3ui", + "glSecondaryColorP3uiv" + )) && checkFunctions(provider, caps, new int[] { + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 716, 717, 718, 719, 720, 721, 722, 723 + }, + "glBindFragDataLocationIndexed", "glGetFragDataIndex", "glGenSamplers", "glDeleteSamplers", "glIsSampler", "glBindSampler", "glSamplerParameteri", + "glSamplerParameterf", "glSamplerParameteriv", "glSamplerParameterfv", "glSamplerParameterIiv", "glSamplerParameterIuiv", "glGetSamplerParameteriv", + "glGetSamplerParameterfv", "glGetSamplerParameterIiv", "glGetSamplerParameterIuiv", "glQueryCounter", "glGetQueryObjecti64v", + "glGetQueryObjectui64v", "glVertexAttribDivisor", "glVertexAttribP1ui", "glVertexAttribP2ui", "glVertexAttribP3ui", "glVertexAttribP4ui", + "glVertexAttribP1uiv", "glVertexAttribP2uiv", "glVertexAttribP3uiv", "glVertexAttribP4uiv" + )) && ext.contains("OpenGL33") || reportMissing("GL", "OpenGL33"); + } + + private static boolean check_GL40(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenGL40")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769 + }, + "glBlendEquationi", "glBlendEquationSeparatei", "glBlendFunci", "glBlendFuncSeparatei", "glDrawArraysIndirect", "glDrawElementsIndirect", + "glUniform1d", "glUniform2d", "glUniform3d", "glUniform4d", "glUniform1dv", "glUniform2dv", "glUniform3dv", "glUniform4dv", "glUniformMatrix2dv", + "glUniformMatrix3dv", "glUniformMatrix4dv", "glUniformMatrix2x3dv", "glUniformMatrix2x4dv", "glUniformMatrix3x2dv", "glUniformMatrix3x4dv", + "glUniformMatrix4x2dv", "glUniformMatrix4x3dv", "glGetUniformdv", "glMinSampleShading", "glGetSubroutineUniformLocation", "glGetSubroutineIndex", + "glGetActiveSubroutineUniformiv", "glGetActiveSubroutineUniformName", "glGetActiveSubroutineName", "glUniformSubroutinesuiv", + "glGetUniformSubroutineuiv", "glGetProgramStageiv", "glPatchParameteri", "glPatchParameterfv", "glBindTransformFeedback", + "glDeleteTransformFeedbacks", "glGenTransformFeedbacks", "glIsTransformFeedback", "glPauseTransformFeedback", "glResumeTransformFeedback", + "glDrawTransformFeedback", "glDrawTransformFeedbackStream", "glBeginQueryIndexed", "glEndQueryIndexed", "glGetQueryIndexediv" + )) || reportMissing("GL", "OpenGL40"); + } + + private static boolean check_GL41(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenGL41")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, + 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, + 857 + }, + "glReleaseShaderCompiler", "glShaderBinary", "glGetShaderPrecisionFormat", "glDepthRangef", "glClearDepthf", "glGetProgramBinary", + "glProgramBinary", "glProgramParameteri", "glUseProgramStages", "glActiveShaderProgram", "glCreateShaderProgramv", "glBindProgramPipeline", + "glDeleteProgramPipelines", "glGenProgramPipelines", "glIsProgramPipeline", "glGetProgramPipelineiv", "glProgramUniform1i", "glProgramUniform2i", + "glProgramUniform3i", "glProgramUniform4i", "glProgramUniform1ui", "glProgramUniform2ui", "glProgramUniform3ui", "glProgramUniform4ui", + "glProgramUniform1f", "glProgramUniform2f", "glProgramUniform3f", "glProgramUniform4f", "glProgramUniform1d", "glProgramUniform2d", + "glProgramUniform3d", "glProgramUniform4d", "glProgramUniform1iv", "glProgramUniform2iv", "glProgramUniform3iv", "glProgramUniform4iv", + "glProgramUniform1uiv", "glProgramUniform2uiv", "glProgramUniform3uiv", "glProgramUniform4uiv", "glProgramUniform1fv", "glProgramUniform2fv", + "glProgramUniform3fv", "glProgramUniform4fv", "glProgramUniform1dv", "glProgramUniform2dv", "glProgramUniform3dv", "glProgramUniform4dv", + "glProgramUniformMatrix2fv", "glProgramUniformMatrix3fv", "glProgramUniformMatrix4fv", "glProgramUniformMatrix2dv", "glProgramUniformMatrix3dv", + "glProgramUniformMatrix4dv", "glProgramUniformMatrix2x3fv", "glProgramUniformMatrix3x2fv", "glProgramUniformMatrix2x4fv", + "glProgramUniformMatrix4x2fv", "glProgramUniformMatrix3x4fv", "glProgramUniformMatrix4x3fv", "glProgramUniformMatrix2x3dv", + "glProgramUniformMatrix3x2dv", "glProgramUniformMatrix2x4dv", "glProgramUniformMatrix4x2dv", "glProgramUniformMatrix3x4dv", + "glProgramUniformMatrix4x3dv", "glValidateProgramPipeline", "glGetProgramPipelineInfoLog", "glVertexAttribL1d", "glVertexAttribL2d", + "glVertexAttribL3d", "glVertexAttribL4d", "glVertexAttribL1dv", "glVertexAttribL2dv", "glVertexAttribL3dv", "glVertexAttribL4dv", + "glVertexAttribLPointer", "glGetVertexAttribLdv", "glViewportArrayv", "glViewportIndexedf", "glViewportIndexedfv", "glScissorArrayv", + "glScissorIndexed", "glScissorIndexedv", "glDepthRangeArrayv", "glDepthRangeIndexed", "glGetFloati_v", "glGetDoublei_v" + )) || reportMissing("GL", "OpenGL41"); + } + + private static boolean check_GL42(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenGL42")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869 + }, + "glGetActiveAtomicCounterBufferiv", "glTexStorage1D", "glTexStorage2D", "glTexStorage3D", "glDrawTransformFeedbackInstanced", + "glDrawTransformFeedbackStreamInstanced", "glDrawArraysInstancedBaseInstance", "glDrawElementsInstancedBaseInstance", + "glDrawElementsInstancedBaseVertexBaseInstance", "glBindImageTexture", "glMemoryBarrier", "glGetInternalformativ" + )) || reportMissing("GL", "OpenGL42"); + } + + private static boolean check_GL43(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenGL43")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, + 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912 + }, + "glClearBufferData", "glClearBufferSubData", "glDispatchCompute", "glDispatchComputeIndirect", "glCopyImageSubData", "glDebugMessageControl", + "glDebugMessageInsert", "glDebugMessageCallback", "glGetDebugMessageLog", "glPushDebugGroup", "glPopDebugGroup", "glObjectLabel", + "glGetObjectLabel", "glObjectPtrLabel", "glGetObjectPtrLabel", "glFramebufferParameteri", "glGetFramebufferParameteriv", "glGetInternalformati64v", + "glInvalidateTexSubImage", "glInvalidateTexImage", "glInvalidateBufferSubData", "glInvalidateBufferData", "glInvalidateFramebuffer", + "glInvalidateSubFramebuffer", "glMultiDrawArraysIndirect", "glMultiDrawElementsIndirect", "glGetProgramInterfaceiv", "glGetProgramResourceIndex", + "glGetProgramResourceName", "glGetProgramResourceiv", "glGetProgramResourceLocation", "glGetProgramResourceLocationIndex", + "glShaderStorageBlockBinding", "glTexBufferRange", "glTexStorage2DMultisample", "glTexStorage3DMultisample", "glTextureView", "glBindVertexBuffer", + "glVertexAttribFormat", "glVertexAttribIFormat", "glVertexAttribLFormat", "glVertexAttribBinding", "glVertexBindingDivisor" + )) || reportMissing("GL", "OpenGL43"); + } + + private static boolean check_GL44(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenGL44")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 913, 914, 915, 916, 917, 918, 919, 920, 921 + }, + "glBufferStorage", "glClearTexSubImage", "glClearTexImage", "glBindBuffersBase", "glBindBuffersRange", "glBindTextures", "glBindSamplers", + "glBindImageTextures", "glBindVertexBuffers" + )) || reportMissing("GL", "OpenGL44"); + } + + private static boolean check_GL45(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenGL45")) { + return false; + } + + int flag0 = provider.getFunctionAddress("glGetMapdv") != NULL ? 0 : Integer.MIN_VALUE; + int flag1 = provider.getFunctionAddress("glGetMapfv") != NULL ? 0 : Integer.MIN_VALUE; + int flag2 = provider.getFunctionAddress("glGetMapiv") != NULL ? 0 : Integer.MIN_VALUE; + int flag3 = provider.getFunctionAddress("glGetPixelMapfv") != NULL ? 0 : Integer.MIN_VALUE; + int flag4 = provider.getFunctionAddress("glGetPixelMapuiv") != NULL ? 0 : Integer.MIN_VALUE; + int flag5 = provider.getFunctionAddress("glGetPixelMapusv") != NULL ? 0 : Integer.MIN_VALUE; + int flag6 = provider.getFunctionAddress("glGetPolygonStipple") != NULL ? 0 : Integer.MIN_VALUE; + int flag7 = ext.contains("GL_ARB_imaging") && provider.getFunctionAddress("glGetColorTable") != NULL ? 0 : Integer.MIN_VALUE; + int flag8 = ext.contains("GL_ARB_imaging") && provider.getFunctionAddress("glGetConvolutionFilter") != NULL ? 0 : Integer.MIN_VALUE; + int flag9 = ext.contains("GL_ARB_imaging") && provider.getFunctionAddress("glGetSeparableFilter") != NULL ? 0 : Integer.MIN_VALUE; + int flag10 = ext.contains("GL_ARB_imaging") && provider.getFunctionAddress("glGetHistogram") != NULL ? 0 : Integer.MIN_VALUE; + int flag11 = ext.contains("GL_ARB_imaging") && provider.getFunctionAddress("glGetMinmax") != NULL ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, + 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, + 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1033, 1040, 1042, 1043 + }, + "glClipControl", "glCreateTransformFeedbacks", "glTransformFeedbackBufferBase", "glTransformFeedbackBufferRange", "glGetTransformFeedbackiv", + "glGetTransformFeedbacki_v", "glGetTransformFeedbacki64_v", "glCreateBuffers", "glNamedBufferStorage", "glNamedBufferData", "glNamedBufferSubData", + "glCopyNamedBufferSubData", "glClearNamedBufferData", "glClearNamedBufferSubData", "glMapNamedBuffer", "glMapNamedBufferRange", + "glUnmapNamedBuffer", "glFlushMappedNamedBufferRange", "glGetNamedBufferParameteriv", "glGetNamedBufferParameteri64v", "glGetNamedBufferPointerv", + "glGetNamedBufferSubData", "glCreateFramebuffers", "glNamedFramebufferRenderbuffer", "glNamedFramebufferParameteri", "glNamedFramebufferTexture", + "glNamedFramebufferTextureLayer", "glNamedFramebufferDrawBuffer", "glNamedFramebufferDrawBuffers", "glNamedFramebufferReadBuffer", + "glInvalidateNamedFramebufferData", "glInvalidateNamedFramebufferSubData", "glClearNamedFramebufferiv", "glClearNamedFramebufferuiv", + "glClearNamedFramebufferfv", "glClearNamedFramebufferfi", "glBlitNamedFramebuffer", "glCheckNamedFramebufferStatus", + "glGetNamedFramebufferParameteriv", "glGetNamedFramebufferAttachmentParameteriv", "glCreateRenderbuffers", "glNamedRenderbufferStorage", + "glNamedRenderbufferStorageMultisample", "glGetNamedRenderbufferParameteriv", "glCreateTextures", "glTextureBuffer", "glTextureBufferRange", + "glTextureStorage1D", "glTextureStorage2D", "glTextureStorage3D", "glTextureStorage2DMultisample", "glTextureStorage3DMultisample", + "glTextureSubImage1D", "glTextureSubImage2D", "glTextureSubImage3D", "glCompressedTextureSubImage1D", "glCompressedTextureSubImage2D", + "glCompressedTextureSubImage3D", "glCopyTextureSubImage1D", "glCopyTextureSubImage2D", "glCopyTextureSubImage3D", "glTextureParameterf", + "glTextureParameterfv", "glTextureParameteri", "glTextureParameterIiv", "glTextureParameterIuiv", "glTextureParameteriv", "glGenerateTextureMipmap", + "glBindTextureUnit", "glGetTextureImage", "glGetCompressedTextureImage", "glGetTextureLevelParameterfv", "glGetTextureLevelParameteriv", + "glGetTextureParameterfv", "glGetTextureParameterIiv", "glGetTextureParameterIuiv", "glGetTextureParameteriv", "glCreateVertexArrays", + "glDisableVertexArrayAttrib", "glEnableVertexArrayAttrib", "glVertexArrayElementBuffer", "glVertexArrayVertexBuffer", "glVertexArrayVertexBuffers", + "glVertexArrayAttribFormat", "glVertexArrayAttribIFormat", "glVertexArrayAttribLFormat", "glVertexArrayAttribBinding", + "glVertexArrayBindingDivisor", "glGetVertexArrayiv", "glGetVertexArrayIndexediv", "glGetVertexArrayIndexed64iv", "glCreateSamplers", + "glCreateProgramPipelines", "glCreateQueries", "glGetQueryBufferObjectiv", "glGetQueryBufferObjectuiv", "glGetQueryBufferObjecti64v", + "glGetQueryBufferObjectui64v", "glMemoryBarrierByRegion", "glGetTextureSubImage", "glGetCompressedTextureSubImage", "glTextureBarrier", + "glGetGraphicsResetStatus", "glReadnPixels", "glGetnUniformfv", "glGetnUniformiv", "glGetnUniformuiv" + )) || reportMissing("GL", "OpenGL45"); + } + + private static boolean check_GL46(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("OpenGL46")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1044, 1045, 1046, 1047 + }, + "glMultiDrawArraysIndirectCount", "glMultiDrawElementsIndirectCount", "glPolygonOffsetClamp", "glSpecializeShader" + )) || reportMissing("GL", "OpenGL46"); + } + + private static boolean check_AMD_debug_output(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_AMD_debug_output")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1048, 1049, 1050, 1051 + }, + "glDebugMessageEnableAMD", "glDebugMessageInsertAMD", "glDebugMessageCallbackAMD", "glGetDebugMessageLogAMD" + )) || reportMissing("GL", "GL_AMD_debug_output"); + } + + private static boolean check_AMD_draw_buffers_blend(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_AMD_draw_buffers_blend")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1052, 1053, 1054, 1055 + }, + "glBlendFuncIndexedAMD", "glBlendFuncSeparateIndexedAMD", "glBlendEquationIndexedAMD", "glBlendEquationSeparateIndexedAMD" + )) || reportMissing("GL", "GL_AMD_draw_buffers_blend"); + } + + private static boolean check_AMD_framebuffer_multisample_advanced(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_AMD_framebuffer_multisample_advanced")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1056, 1057 + }, + "glRenderbufferStorageMultisampleAdvancedAMD", "glNamedRenderbufferStorageMultisampleAdvancedAMD" + )) || reportMissing("GL", "GL_AMD_framebuffer_multisample_advanced"); + } + + private static boolean check_AMD_gpu_shader_int64(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_AMD_gpu_shader_int64")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, flag0 + 1076, flag0 + 1077, + flag0 + 1078, flag0 + 1079, flag0 + 1080, flag0 + 1081, flag0 + 1082, flag0 + 1083, flag0 + 1084, flag0 + 1085, flag0 + 1086, flag0 + 1087, + flag0 + 1088, flag0 + 1089, flag0 + 1090, flag0 + 1091 + }, + "glUniform1i64NV", "glUniform2i64NV", "glUniform3i64NV", "glUniform4i64NV", "glUniform1i64vNV", "glUniform2i64vNV", "glUniform3i64vNV", + "glUniform4i64vNV", "glUniform1ui64NV", "glUniform2ui64NV", "glUniform3ui64NV", "glUniform4ui64NV", "glUniform1ui64vNV", "glUniform2ui64vNV", + "glUniform3ui64vNV", "glUniform4ui64vNV", "glGetUniformi64vNV", "glGetUniformui64vNV", "glProgramUniform1i64NV", "glProgramUniform2i64NV", + "glProgramUniform3i64NV", "glProgramUniform4i64NV", "glProgramUniform1i64vNV", "glProgramUniform2i64vNV", "glProgramUniform3i64vNV", + "glProgramUniform4i64vNV", "glProgramUniform1ui64NV", "glProgramUniform2ui64NV", "glProgramUniform3ui64NV", "glProgramUniform4ui64NV", + "glProgramUniform1ui64vNV", "glProgramUniform2ui64vNV", "glProgramUniform3ui64vNV", "glProgramUniform4ui64vNV" + )) || reportMissing("GL", "GL_AMD_gpu_shader_int64"); + } + + private static boolean check_AMD_interleaved_elements(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_AMD_interleaved_elements")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1092 + }, + "glVertexAttribParameteriAMD" + )) || reportMissing("GL", "GL_AMD_interleaved_elements"); + } + + private static boolean check_AMD_occlusion_query_event(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_AMD_occlusion_query_event")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1093 + }, + "glQueryObjectParameteruiAMD" + )) || reportMissing("GL", "GL_AMD_occlusion_query_event"); + } + + private static boolean check_AMD_performance_monitor(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_AMD_performance_monitor")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104 + }, + "glGetPerfMonitorGroupsAMD", "glGetPerfMonitorCountersAMD", "glGetPerfMonitorGroupStringAMD", "glGetPerfMonitorCounterStringAMD", + "glGetPerfMonitorCounterInfoAMD", "glGenPerfMonitorsAMD", "glDeletePerfMonitorsAMD", "glSelectPerfMonitorCountersAMD", "glBeginPerfMonitorAMD", + "glEndPerfMonitorAMD", "glGetPerfMonitorCounterDataAMD" + )) || reportMissing("GL", "GL_AMD_performance_monitor"); + } + + private static boolean check_AMD_sample_positions(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_AMD_sample_positions")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1105 + }, + "glSetMultisamplefvAMD" + )) || reportMissing("GL", "GL_AMD_sample_positions"); + } + + private static boolean check_AMD_sparse_texture(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_AMD_sparse_texture")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1106, 1107 + }, + "glTexStorageSparseAMD", "glTextureStorageSparseAMD" + )) || reportMissing("GL", "GL_AMD_sparse_texture"); + } + + private static boolean check_AMD_stencil_operation_extended(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_AMD_stencil_operation_extended")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1108 + }, + "glStencilOpValueAMD" + )) || reportMissing("GL", "GL_AMD_stencil_operation_extended"); + } + + private static boolean check_AMD_vertex_shader_tessellator(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_AMD_vertex_shader_tessellator")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1109, 1110 + }, + "glTessellationFactorAMD", "glTessellationModeAMD" + )) || reportMissing("GL", "GL_AMD_vertex_shader_tessellator"); + } + + private static boolean check_ARB_base_instance(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_base_instance")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 864, 865, 866 + }, + "glDrawArraysInstancedBaseInstance", "glDrawElementsInstancedBaseInstance", "glDrawElementsInstancedBaseVertexBaseInstance" + )) || reportMissing("GL", "GL_ARB_base_instance"); + } + + private static boolean check_ARB_bindless_texture(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_bindless_texture")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126 + }, + "glGetTextureHandleARB", "glGetTextureSamplerHandleARB", "glMakeTextureHandleResidentARB", "glMakeTextureHandleNonResidentARB", + "glGetImageHandleARB", "glMakeImageHandleResidentARB", "glMakeImageHandleNonResidentARB", "glUniformHandleui64ARB", "glUniformHandleui64vARB", + "glProgramUniformHandleui64ARB", "glProgramUniformHandleui64vARB", "glIsTextureHandleResidentARB", "glIsImageHandleResidentARB", + "glVertexAttribL1ui64ARB", "glVertexAttribL1ui64vARB", "glGetVertexAttribLui64vARB" + )) || reportMissing("GL", "GL_ARB_bindless_texture"); + } + + private static boolean check_ARB_blend_func_extended(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_blend_func_extended")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 666, 667 + }, + "glBindFragDataLocationIndexed", "glGetFragDataIndex" + )) || reportMissing("GL", "GL_ARB_blend_func_extended"); + } + + private static boolean check_ARB_buffer_storage(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_buffer_storage")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 913, flag0 + 1127 + }, + "glBufferStorage", "glNamedBufferStorageEXT" + )) || reportMissing("GL", "GL_ARB_buffer_storage"); + } + + private static boolean check_ARB_clear_buffer_object(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_clear_buffer_object")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 870, 871, flag0 + 1128, flag0 + 1129 + }, + "glClearBufferData", "glClearBufferSubData", "glClearNamedBufferDataEXT", "glClearNamedBufferSubDataEXT" + )) || reportMissing("GL", "GL_ARB_clear_buffer_object"); + } + + private static boolean check_ARB_clear_texture(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_clear_texture")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 914, 915 + }, + "glClearTexSubImage", "glClearTexImage" + )) || reportMissing("GL", "GL_ARB_clear_texture"); + } + + private static boolean check_ARB_clip_control(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_clip_control")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 922 + }, + "glClipControl" + )) || reportMissing("GL", "GL_ARB_clip_control"); + } + + private static boolean check_ARB_color_buffer_float(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_color_buffer_float")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1130 + }, + "glClampColorARB" + )) || reportMissing("GL", "GL_ARB_color_buffer_float"); + } + + private static boolean check_ARB_compute_shader(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_compute_shader")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 872, 873 + }, + "glDispatchCompute", "glDispatchComputeIndirect" + )) || reportMissing("GL", "GL_ARB_compute_shader"); + } + + private static boolean check_ARB_compute_variable_group_size(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_compute_variable_group_size")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1131 + }, + "glDispatchComputeGroupSizeARB" + )) || reportMissing("GL", "GL_ARB_compute_variable_group_size"); + } + + private static boolean check_ARB_copy_buffer(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_copy_buffer")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 637 + }, + "glCopyBufferSubData" + )) || reportMissing("GL", "GL_ARB_copy_buffer"); + } + + private static boolean check_ARB_copy_image(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_copy_image")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 874 + }, + "glCopyImageSubData" + )) || reportMissing("GL", "GL_ARB_copy_image"); + } + + private static boolean check_ARB_debug_output(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_debug_output")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1132, 1133, 1134, 1135 + }, + "glDebugMessageControlARB", "glDebugMessageInsertARB", "glDebugMessageCallbackARB", "glGetDebugMessageLogARB" + )) || reportMissing("GL", "GL_ARB_debug_output"); + } + + private static boolean check_ARB_direct_state_access(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_direct_state_access")) { + return false; + } + + int flag0 = ARB_transform_feedback2(ext) ? 0 : Integer.MIN_VALUE; + int flag1 = ARB_uniform_buffer_object(ext) ? 0 : Integer.MIN_VALUE; + int flag6 = ARB_buffer_storage(ext) ? 0 : Integer.MIN_VALUE; + int flag7 = ARB_copy_buffer(ext) ? 0 : Integer.MIN_VALUE; + int flag8 = ARB_clear_texture(ext) ? 0 : Integer.MIN_VALUE; + int flag10 = ARB_map_buffer_range(ext) ? 0 : Integer.MIN_VALUE; + int flag12 = ARB_framebuffer_object(ext) ? 0 : Integer.MIN_VALUE; + int flag14 = ARB_framebuffer_no_attachments(ext) ? 0 : Integer.MIN_VALUE; + int flag20 = ARB_invalidate_subdata(ext) ? 0 : Integer.MIN_VALUE; + int flag34 = ARB_texture_buffer_object(ext) ? 0 : Integer.MIN_VALUE; + int flag35 = ARB_texture_buffer_range(ext) ? 0 : Integer.MIN_VALUE; + int flag36 = ARB_texture_storage(ext) ? 0 : Integer.MIN_VALUE; + int flag39 = ARB_texture_storage_multisample(ext) ? 0 : Integer.MIN_VALUE; + int flag42 = ARB_vertex_array_object(ext) ? 0 : Integer.MIN_VALUE; + int flag46 = ARB_vertex_attrib_binding(ext) ? 0 : Integer.MIN_VALUE; + int flag47 = ARB_multi_bind(ext) ? 0 : Integer.MIN_VALUE; + int flag56 = ARB_sampler_objects(ext) ? 0 : Integer.MIN_VALUE; + int flag57 = ARB_separate_shader_objects(ext) ? 0 : Integer.MIN_VALUE; + int flag58 = ARB_query_buffer_object(ext) ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + flag0 + 923, flag1 + 924, flag1 + 925, flag0 + 926, flag0 + 927, flag0 + 928, 929, flag6 + 930, 931, 932, flag7 + 933, flag8 + 934, flag8 + 935, + 936, flag10 + 937, 938, flag10 + 939, 940, 941, 942, 943, flag12 + 944, flag12 + 945, flag14 + 946, flag12 + 947, flag12 + 948, flag12 + 949, + flag12 + 950, flag12 + 951, flag20 + 952, flag20 + 953, flag12 + 954, flag12 + 955, flag12 + 956, flag12 + 957, flag12 + 958, flag12 + 959, + flag14 + 960, flag12 + 961, flag12 + 962, flag12 + 963, flag12 + 964, flag12 + 965, 966, flag34 + 967, flag35 + 968, flag36 + 969, flag36 + 970, + flag36 + 971, flag39 + 972, flag39 + 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, flag12 + 989, 990, 991, 992, + 993, 994, 995, 996, 997, 998, flag42 + 999, flag42 + 1000, flag42 + 1001, flag42 + 1002, flag46 + 1003, flag47 + 1004, flag46 + 1005, flag46 + 1006, + flag46 + 1007, flag46 + 1008, flag46 + 1009, flag42 + 1010, flag42 + 1011, flag42 + 1012, flag56 + 1013, flag57 + 1014, 1015, flag58 + 1018, + flag58 + 1016, flag58 + 1019, flag58 + 1017 + }, + "glCreateTransformFeedbacks", "glTransformFeedbackBufferBase", "glTransformFeedbackBufferRange", "glGetTransformFeedbackiv", + "glGetTransformFeedbacki_v", "glGetTransformFeedbacki64_v", "glCreateBuffers", "glNamedBufferStorage", "glNamedBufferData", "glNamedBufferSubData", + "glCopyNamedBufferSubData", "glClearNamedBufferData", "glClearNamedBufferSubData", "glMapNamedBuffer", "glMapNamedBufferRange", + "glUnmapNamedBuffer", "glFlushMappedNamedBufferRange", "glGetNamedBufferParameteriv", "glGetNamedBufferParameteri64v", "glGetNamedBufferPointerv", + "glGetNamedBufferSubData", "glCreateFramebuffers", "glNamedFramebufferRenderbuffer", "glNamedFramebufferParameteri", "glNamedFramebufferTexture", + "glNamedFramebufferTextureLayer", "glNamedFramebufferDrawBuffer", "glNamedFramebufferDrawBuffers", "glNamedFramebufferReadBuffer", + "glInvalidateNamedFramebufferData", "glInvalidateNamedFramebufferSubData", "glClearNamedFramebufferiv", "glClearNamedFramebufferuiv", + "glClearNamedFramebufferfv", "glClearNamedFramebufferfi", "glBlitNamedFramebuffer", "glCheckNamedFramebufferStatus", + "glGetNamedFramebufferParameteriv", "glGetNamedFramebufferAttachmentParameteriv", "glCreateRenderbuffers", "glNamedRenderbufferStorage", + "glNamedRenderbufferStorageMultisample", "glGetNamedRenderbufferParameteriv", "glCreateTextures", "glTextureBuffer", "glTextureBufferRange", + "glTextureStorage1D", "glTextureStorage2D", "glTextureStorage3D", "glTextureStorage2DMultisample", "glTextureStorage3DMultisample", + "glTextureSubImage1D", "glTextureSubImage2D", "glTextureSubImage3D", "glCompressedTextureSubImage1D", "glCompressedTextureSubImage2D", + "glCompressedTextureSubImage3D", "glCopyTextureSubImage1D", "glCopyTextureSubImage2D", "glCopyTextureSubImage3D", "glTextureParameterf", + "glTextureParameterfv", "glTextureParameteri", "glTextureParameterIiv", "glTextureParameterIuiv", "glTextureParameteriv", "glGenerateTextureMipmap", + "glBindTextureUnit", "glGetTextureImage", "glGetCompressedTextureImage", "glGetTextureLevelParameterfv", "glGetTextureLevelParameteriv", + "glGetTextureParameterfv", "glGetTextureParameterIiv", "glGetTextureParameterIuiv", "glGetTextureParameteriv", "glCreateVertexArrays", + "glDisableVertexArrayAttrib", "glEnableVertexArrayAttrib", "glVertexArrayElementBuffer", "glVertexArrayVertexBuffer", "glVertexArrayVertexBuffers", + "glVertexArrayAttribFormat", "glVertexArrayAttribIFormat", "glVertexArrayAttribLFormat", "glVertexArrayAttribBinding", + "glVertexArrayBindingDivisor", "glGetVertexArrayiv", "glGetVertexArrayIndexediv", "glGetVertexArrayIndexed64iv", "glCreateSamplers", + "glCreateProgramPipelines", "glCreateQueries", "glGetQueryBufferObjecti64v", "glGetQueryBufferObjectiv", "glGetQueryBufferObjectui64v", + "glGetQueryBufferObjectuiv" + )) || reportMissing("GL", "GL_ARB_direct_state_access"); + } + + private static boolean check_ARB_draw_buffers(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_draw_buffers")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1136 + }, + "glDrawBuffersARB" + )) || reportMissing("GL", "GL_ARB_draw_buffers"); + } + + private static boolean check_ARB_draw_buffers_blend(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_draw_buffers_blend")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1137, 1138, 1139, 1140 + }, + "glBlendEquationiARB", "glBlendEquationSeparateiARB", "glBlendFunciARB", "glBlendFuncSeparateiARB" + )) || reportMissing("GL", "GL_ARB_draw_buffers_blend"); + } + + private static boolean check_ARB_draw_elements_base_vertex(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_draw_elements_base_vertex")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 648, 649, 650, 651 + }, + "glDrawElementsBaseVertex", "glDrawRangeElementsBaseVertex", "glDrawElementsInstancedBaseVertex", "glMultiDrawElementsBaseVertex" + )) || reportMissing("GL", "GL_ARB_draw_elements_base_vertex"); + } + + private static boolean check_ARB_draw_indirect(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_draw_indirect")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 728, 729 + }, + "glDrawArraysIndirect", "glDrawElementsIndirect" + )) || reportMissing("GL", "GL_ARB_draw_indirect"); + } + + private static boolean check_ARB_draw_instanced(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_draw_instanced")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1141, 1142 + }, + "glDrawArraysInstancedARB", "glDrawElementsInstancedARB" + )) || reportMissing("GL", "GL_ARB_draw_instanced"); + } + + private static boolean check_ARB_ES2_compatibility(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_ES2_compatibility")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 770, 771, 772, 773, 774 + }, + "glReleaseShaderCompiler", "glShaderBinary", "glGetShaderPrecisionFormat", "glDepthRangef", "glClearDepthf" + )) || reportMissing("GL", "GL_ARB_ES2_compatibility"); + } + + private static boolean check_ARB_ES3_1_compatibility(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_ES3_1_compatibility")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1020 + }, + "glMemoryBarrierByRegion" + )) || reportMissing("GL", "GL_ARB_ES3_1_compatibility"); + } + + private static boolean check_ARB_ES3_2_compatibility(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_ES3_2_compatibility")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1143 + }, + "glPrimitiveBoundingBoxARB" + )) || reportMissing("GL", "GL_ARB_ES3_2_compatibility"); + } + + private static boolean check_ARB_framebuffer_no_attachments(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_framebuffer_no_attachments")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 885, 886, flag0 + 1144, flag0 + 1145 + }, + "glFramebufferParameteri", "glGetFramebufferParameteriv", "glNamedFramebufferParameteriEXT", "glGetNamedFramebufferParameterivEXT" + )) || reportMissing("GL", "GL_ARB_framebuffer_no_attachments"); + } + + private static boolean check_ARB_framebuffer_object(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_framebuffer_object")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614 + }, + "glIsRenderbuffer", "glBindRenderbuffer", "glDeleteRenderbuffers", "glGenRenderbuffers", "glRenderbufferStorage", + "glRenderbufferStorageMultisample", "glGetRenderbufferParameteriv", "glIsFramebuffer", "glBindFramebuffer", "glDeleteFramebuffers", + "glGenFramebuffers", "glCheckFramebufferStatus", "glFramebufferTexture1D", "glFramebufferTexture2D", "glFramebufferTexture3D", + "glFramebufferTextureLayer", "glFramebufferRenderbuffer", "glGetFramebufferAttachmentParameteriv", "glBlitFramebuffer", "glGenerateMipmap" + )) || reportMissing("GL", "GL_ARB_framebuffer_object"); + } + + private static boolean check_ARB_geometry_shader4(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_geometry_shader4")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1146, 1147, 1148, 1149 + }, + "glProgramParameteriARB", "glFramebufferTextureARB", "glFramebufferTextureLayerARB", "glFramebufferTextureFaceARB" + )) || reportMissing("GL", "GL_ARB_geometry_shader4"); + } + + private static boolean check_ARB_get_program_binary(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_get_program_binary")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 775, 776, 777 + }, + "glGetProgramBinary", "glProgramBinary", "glProgramParameteri" + )) || reportMissing("GL", "GL_ARB_get_program_binary"); + } + + private static boolean check_ARB_get_texture_sub_image(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_get_texture_sub_image")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1021, 1022 + }, + "glGetTextureSubImage", "glGetCompressedTextureSubImage" + )) || reportMissing("GL", "GL_ARB_get_texture_sub_image"); + } + + private static boolean check_ARB_gl_spirv(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_gl_spirv")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1150 + }, + "glSpecializeShaderARB" + )) || reportMissing("GL", "GL_ARB_gl_spirv"); + } + + private static boolean check_ARB_gpu_shader_fp64(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_gpu_shader_fp64")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747 + }, + "glUniform1d", "glUniform2d", "glUniform3d", "glUniform4d", "glUniform1dv", "glUniform2dv", "glUniform3dv", "glUniform4dv", "glUniformMatrix2dv", + "glUniformMatrix3dv", "glUniformMatrix4dv", "glUniformMatrix2x3dv", "glUniformMatrix2x4dv", "glUniformMatrix3x2dv", "glUniformMatrix3x4dv", + "glUniformMatrix4x2dv", "glUniformMatrix4x3dv", "glGetUniformdv" + )) || reportMissing("GL", "GL_ARB_gpu_shader_fp64"); + } + + private static boolean check_ARB_gpu_shader_int64(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_gpu_shader_int64")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, + 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203 + }, + "glUniform1i64ARB", "glUniform1i64vARB", "glProgramUniform1i64ARB", "glProgramUniform1i64vARB", "glUniform2i64ARB", "glUniform2i64vARB", + "glProgramUniform2i64ARB", "glProgramUniform2i64vARB", "glUniform3i64ARB", "glUniform3i64vARB", "glProgramUniform3i64ARB", + "glProgramUniform3i64vARB", "glUniform4i64ARB", "glUniform4i64vARB", "glProgramUniform4i64ARB", "glProgramUniform4i64vARB", "glUniform1ui64ARB", + "glUniform1ui64vARB", "glProgramUniform1ui64ARB", "glProgramUniform1ui64vARB", "glUniform2ui64ARB", "glUniform2ui64vARB", + "glProgramUniform2ui64ARB", "glProgramUniform2ui64vARB", "glUniform3ui64ARB", "glUniform3ui64vARB", "glProgramUniform3ui64ARB", + "glProgramUniform3ui64vARB", "glUniform4ui64ARB", "glUniform4ui64vARB", "glProgramUniform4ui64ARB", "glProgramUniform4ui64vARB", + "glGetUniformi64vARB", "glGetUniformui64vARB", "glGetnUniformi64vARB", "glGetnUniformui64vARB" + )) || reportMissing("GL", "GL_ARB_gpu_shader_int64"); + } + + private static boolean check_ARB_imaging(FunctionProvider provider, PointerBuffer caps, Set ext, boolean fc) { + if (!ext.contains("GL_ARB_imaging")) { + return false; + } + + return ((fc || checkFunctions(provider, caps, new int[] { + 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, + 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235 + }, + "glColorTable", "glCopyColorTable", "glColorTableParameteriv", "glColorTableParameterfv", "glGetColorTable", "glGetColorTableParameteriv", + "glGetColorTableParameterfv", "glColorSubTable", "glCopyColorSubTable", "glConvolutionFilter1D", "glConvolutionFilter2D", + "glCopyConvolutionFilter1D", "glCopyConvolutionFilter2D", "glGetConvolutionFilter", "glSeparableFilter2D", "glGetSeparableFilter", + "glConvolutionParameteri", "glConvolutionParameteriv", "glConvolutionParameterf", "glConvolutionParameterfv", "glGetConvolutionParameteriv", + "glGetConvolutionParameterfv", "glHistogram", "glResetHistogram", "glGetHistogram", "glGetHistogramParameteriv", "glGetHistogramParameterfv", + "glMinmax", "glResetMinmax", "glGetMinmax", "glGetMinmaxParameteriv", "glGetMinmaxParameterfv" + )) && checkFunctions(provider, caps, new int[] { + 386, 387 + }, + "glBlendColor", "glBlendEquation" + )) || reportMissing("GL", "GL_ARB_imaging"); + } + + private static boolean check_ARB_indirect_parameters(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_indirect_parameters")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1236, 1237 + }, + "glMultiDrawArraysIndirectCountARB", "glMultiDrawElementsIndirectCountARB" + )) || reportMissing("GL", "GL_ARB_indirect_parameters"); + } + + private static boolean check_ARB_instanced_arrays(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_instanced_arrays")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1238 + }, + "glVertexAttribDivisorARB" + )) || reportMissing("GL", "GL_ARB_instanced_arrays"); + } + + private static boolean check_ARB_internalformat_query(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_internalformat_query")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 869 + }, + "glGetInternalformativ" + )) || reportMissing("GL", "GL_ARB_internalformat_query"); + } + + private static boolean check_ARB_internalformat_query2(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_internalformat_query2")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 887 + }, + "glGetInternalformati64v" + )) || reportMissing("GL", "GL_ARB_internalformat_query2"); + } + + private static boolean check_ARB_invalidate_subdata(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_invalidate_subdata")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 888, 889, 890, 891, 892, 893 + }, + "glInvalidateTexSubImage", "glInvalidateTexImage", "glInvalidateBufferSubData", "glInvalidateBufferData", "glInvalidateFramebuffer", + "glInvalidateSubFramebuffer" + )) || reportMissing("GL", "GL_ARB_invalidate_subdata"); + } + + private static boolean check_ARB_map_buffer_range(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_map_buffer_range")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 592, 593 + }, + "glMapBufferRange", "glFlushMappedBufferRange" + )) || reportMissing("GL", "GL_ARB_map_buffer_range"); + } + + private static boolean check_ARB_matrix_palette(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_matrix_palette")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1240, 1241, 1242, 1243, 1244 + }, + "glCurrentPaletteMatrixARB", "glMatrixIndexuivARB", "glMatrixIndexubvARB", "glMatrixIndexusvARB", "glMatrixIndexPointerARB" + )) || reportMissing("GL", "GL_ARB_matrix_palette"); + } + + private static boolean check_ARB_multi_bind(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_multi_bind")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 916, 917, 918, 919, 920, 921 + }, + "glBindBuffersBase", "glBindBuffersRange", "glBindTextures", "glBindSamplers", "glBindImageTextures", "glBindVertexBuffers" + )) || reportMissing("GL", "GL_ARB_multi_bind"); + } + + private static boolean check_ARB_multi_draw_indirect(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_multi_draw_indirect")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 894, 895 + }, + "glMultiDrawArraysIndirect", "glMultiDrawElementsIndirect" + )) || reportMissing("GL", "GL_ARB_multi_draw_indirect"); + } + + private static boolean check_ARB_multisample(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_multisample")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1245 + }, + "glSampleCoverageARB" + )) || reportMissing("GL", "GL_ARB_multisample"); + } + + private static boolean check_ARB_multitexture(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_multitexture")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, + 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279 + }, + "glActiveTextureARB", "glClientActiveTextureARB", "glMultiTexCoord1fARB", "glMultiTexCoord1sARB", "glMultiTexCoord1iARB", "glMultiTexCoord1dARB", + "glMultiTexCoord1fvARB", "glMultiTexCoord1svARB", "glMultiTexCoord1ivARB", "glMultiTexCoord1dvARB", "glMultiTexCoord2fARB", "glMultiTexCoord2sARB", + "glMultiTexCoord2iARB", "glMultiTexCoord2dARB", "glMultiTexCoord2fvARB", "glMultiTexCoord2svARB", "glMultiTexCoord2ivARB", "glMultiTexCoord2dvARB", + "glMultiTexCoord3fARB", "glMultiTexCoord3sARB", "glMultiTexCoord3iARB", "glMultiTexCoord3dARB", "glMultiTexCoord3fvARB", "glMultiTexCoord3svARB", + "glMultiTexCoord3ivARB", "glMultiTexCoord3dvARB", "glMultiTexCoord4fARB", "glMultiTexCoord4sARB", "glMultiTexCoord4iARB", "glMultiTexCoord4dARB", + "glMultiTexCoord4fvARB", "glMultiTexCoord4svARB", "glMultiTexCoord4ivARB", "glMultiTexCoord4dvARB" + )) || reportMissing("GL", "GL_ARB_multitexture"); + } + + private static boolean check_ARB_occlusion_query(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_occlusion_query")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287 + }, + "glGenQueriesARB", "glDeleteQueriesARB", "glIsQueryARB", "glBeginQueryARB", "glEndQueryARB", "glGetQueryivARB", "glGetQueryObjectivARB", + "glGetQueryObjectuivARB" + )) || reportMissing("GL", "GL_ARB_occlusion_query"); + } + + private static boolean check_ARB_parallel_shader_compile(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_parallel_shader_compile")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1288 + }, + "glMaxShaderCompilerThreadsARB" + )) || reportMissing("GL", "GL_ARB_parallel_shader_compile"); + } + + private static boolean check_ARB_point_parameters(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_point_parameters")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1289, 1290 + }, + "glPointParameterfARB", "glPointParameterfvARB" + )) || reportMissing("GL", "GL_ARB_point_parameters"); + } + + private static boolean check_ARB_polygon_offset_clamp(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_polygon_offset_clamp")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1046 + }, + "glPolygonOffsetClamp" + )) || reportMissing("GL", "GL_ARB_polygon_offset_clamp"); + } + + private static boolean check_ARB_program_interface_query(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_program_interface_query")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 896, 897, 898, 899, 900, 901 + }, + "glGetProgramInterfaceiv", "glGetProgramResourceIndex", "glGetProgramResourceName", "glGetProgramResourceiv", "glGetProgramResourceLocation", + "glGetProgramResourceLocationIndex" + )) || reportMissing("GL", "GL_ARB_program_interface_query"); + } + + private static boolean check_ARB_provoking_vertex(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_provoking_vertex")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 652 + }, + "glProvokingVertex" + )) || reportMissing("GL", "GL_ARB_provoking_vertex"); + } + + private static boolean check_ARB_robustness(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_robustness")) { + return false; + } + + int flag0 = provider.getFunctionAddress("glGetMapdv") != NULL ? 0 : Integer.MIN_VALUE; + int flag1 = provider.getFunctionAddress("glGetMapfv") != NULL ? 0 : Integer.MIN_VALUE; + int flag2 = provider.getFunctionAddress("glGetMapiv") != NULL ? 0 : Integer.MIN_VALUE; + int flag3 = provider.getFunctionAddress("glGetPixelMapfv") != NULL ? 0 : Integer.MIN_VALUE; + int flag4 = provider.getFunctionAddress("glGetPixelMapuiv") != NULL ? 0 : Integer.MIN_VALUE; + int flag5 = provider.getFunctionAddress("glGetPixelMapusv") != NULL ? 0 : Integer.MIN_VALUE; + int flag6 = provider.getFunctionAddress("glGetPolygonStipple") != NULL ? 0 : Integer.MIN_VALUE; + int flag7 = ext.contains("GL_ARB_imaging") && provider.getFunctionAddress("glGetColorTable") != NULL ? 0 : Integer.MIN_VALUE; + int flag8 = ext.contains("GL_ARB_imaging") && provider.getFunctionAddress("glGetConvolutionFilter") != NULL ? 0 : Integer.MIN_VALUE; + int flag9 = ext.contains("GL_ARB_imaging") && provider.getFunctionAddress("glGetSeparableFilter") != NULL ? 0 : Integer.MIN_VALUE; + int flag10 = ext.contains("GL_ARB_imaging") && provider.getFunctionAddress("glGetHistogram") != NULL ? 0 : Integer.MIN_VALUE; + int flag11 = ext.contains("GL_ARB_imaging") && provider.getFunctionAddress("glGetMinmax") != NULL ? 0 : Integer.MIN_VALUE; + int flag12 = ext.contains("OpenGL13") ? 0 : Integer.MIN_VALUE; + int flag13 = ext.contains("OpenGL20") ? 0 : Integer.MIN_VALUE; + int flag15 = ext.contains("OpenGL30") ? 0 : Integer.MIN_VALUE; + int flag16 = ext.contains("OpenGL40") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1291, flag0 + 1292, flag1 + 1293, flag2 + 1294, flag3 + 1295, flag4 + 1296, flag5 + 1297, flag6 + 1298, 1299, 1300, flag7 + 1301, flag8 + 1302, + flag9 + 1303, flag10 + 1304, flag11 + 1305, flag12 + 1306, flag13 + 1307, flag13 + 1308, flag15 + 1309, flag16 + 1310 + }, + "glGetGraphicsResetStatusARB", "glGetnMapdvARB", "glGetnMapfvARB", "glGetnMapivARB", "glGetnPixelMapfvARB", "glGetnPixelMapuivARB", + "glGetnPixelMapusvARB", "glGetnPolygonStippleARB", "glGetnTexImageARB", "glReadnPixelsARB", "glGetnColorTableARB", "glGetnConvolutionFilterARB", + "glGetnSeparableFilterARB", "glGetnHistogramARB", "glGetnMinmaxARB", "glGetnCompressedTexImageARB", "glGetnUniformfvARB", "glGetnUniformivARB", + "glGetnUniformuivARB", "glGetnUniformdvARB" + )) || reportMissing("GL", "GL_ARB_robustness"); + } + + private static boolean check_ARB_sample_locations(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_sample_locations")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1311, 1312, 1313 + }, + "glFramebufferSampleLocationsfvARB", "glNamedFramebufferSampleLocationsfvARB", "glEvaluateDepthValuesARB" + )) || reportMissing("GL", "GL_ARB_sample_locations"); + } + + private static boolean check_ARB_sample_shading(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_sample_shading")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1314 + }, + "glMinSampleShadingARB" + )) || reportMissing("GL", "GL_ARB_sample_shading"); + } + + private static boolean check_ARB_sampler_objects(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_sampler_objects")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681 + }, + "glGenSamplers", "glDeleteSamplers", "glIsSampler", "glBindSampler", "glSamplerParameteri", "glSamplerParameterf", "glSamplerParameteriv", + "glSamplerParameterfv", "glSamplerParameterIiv", "glSamplerParameterIuiv", "glGetSamplerParameteriv", "glGetSamplerParameterfv", + "glGetSamplerParameterIiv", "glGetSamplerParameterIuiv" + )) || reportMissing("GL", "GL_ARB_sampler_objects"); + } + + private static boolean check_ARB_separate_shader_objects(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_separate_shader_objects")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 778, 779, 780, 781, 782, 783, 784, 777, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, + 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837 + }, + "glUseProgramStages", "glActiveShaderProgram", "glCreateShaderProgramv", "glBindProgramPipeline", "glDeleteProgramPipelines", + "glGenProgramPipelines", "glIsProgramPipeline", "glProgramParameteri", "glGetProgramPipelineiv", "glProgramUniform1i", "glProgramUniform2i", + "glProgramUniform3i", "glProgramUniform4i", "glProgramUniform1ui", "glProgramUniform2ui", "glProgramUniform3ui", "glProgramUniform4ui", + "glProgramUniform1f", "glProgramUniform2f", "glProgramUniform3f", "glProgramUniform4f", "glProgramUniform1d", "glProgramUniform2d", + "glProgramUniform3d", "glProgramUniform4d", "glProgramUniform1iv", "glProgramUniform2iv", "glProgramUniform3iv", "glProgramUniform4iv", + "glProgramUniform1uiv", "glProgramUniform2uiv", "glProgramUniform3uiv", "glProgramUniform4uiv", "glProgramUniform1fv", "glProgramUniform2fv", + "glProgramUniform3fv", "glProgramUniform4fv", "glProgramUniform1dv", "glProgramUniform2dv", "glProgramUniform3dv", "glProgramUniform4dv", + "glProgramUniformMatrix2fv", "glProgramUniformMatrix3fv", "glProgramUniformMatrix4fv", "glProgramUniformMatrix2dv", "glProgramUniformMatrix3dv", + "glProgramUniformMatrix4dv", "glProgramUniformMatrix2x3fv", "glProgramUniformMatrix3x2fv", "glProgramUniformMatrix2x4fv", + "glProgramUniformMatrix4x2fv", "glProgramUniformMatrix3x4fv", "glProgramUniformMatrix4x3fv", "glProgramUniformMatrix2x3dv", + "glProgramUniformMatrix3x2dv", "glProgramUniformMatrix2x4dv", "glProgramUniformMatrix4x2dv", "glProgramUniformMatrix3x4dv", + "glProgramUniformMatrix4x3dv", "glValidateProgramPipeline", "glGetProgramPipelineInfoLog" + )) || reportMissing("GL", "GL_ARB_separate_shader_objects"); + } + + private static boolean check_ARB_shader_atomic_counters(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_shader_atomic_counters")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 858 + }, + "glGetActiveAtomicCounterBufferiv" + )) || reportMissing("GL", "GL_ARB_shader_atomic_counters"); + } + + private static boolean check_ARB_shader_image_load_store(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_shader_image_load_store")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 867, 868 + }, + "glBindImageTexture", "glMemoryBarrier" + )) || reportMissing("GL", "GL_ARB_shader_image_load_store"); + } + + private static boolean check_ARB_shader_objects(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_shader_objects")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, + 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353 + }, + "glDeleteObjectARB", "glGetHandleARB", "glDetachObjectARB", "glCreateShaderObjectARB", "glShaderSourceARB", "glCompileShaderARB", + "glCreateProgramObjectARB", "glAttachObjectARB", "glLinkProgramARB", "glUseProgramObjectARB", "glValidateProgramARB", "glUniform1fARB", + "glUniform2fARB", "glUniform3fARB", "glUniform4fARB", "glUniform1iARB", "glUniform2iARB", "glUniform3iARB", "glUniform4iARB", "glUniform1fvARB", + "glUniform2fvARB", "glUniform3fvARB", "glUniform4fvARB", "glUniform1ivARB", "glUniform2ivARB", "glUniform3ivARB", "glUniform4ivARB", + "glUniformMatrix2fvARB", "glUniformMatrix3fvARB", "glUniformMatrix4fvARB", "glGetObjectParameterfvARB", "glGetObjectParameterivARB", + "glGetInfoLogARB", "glGetAttachedObjectsARB", "glGetUniformLocationARB", "glGetActiveUniformARB", "glGetUniformfvARB", "glGetUniformivARB", + "glGetShaderSourceARB" + )) || reportMissing("GL", "GL_ARB_shader_objects"); + } + + private static boolean check_ARB_shader_storage_buffer_object(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_shader_storage_buffer_object")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 902 + }, + "glShaderStorageBlockBinding" + )) || reportMissing("GL", "GL_ARB_shader_storage_buffer_object"); + } + + private static boolean check_ARB_shader_subroutine(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_shader_subroutine")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 749, 750, 751, 752, 753, 754, 755, 756 + }, + "glGetSubroutineUniformLocation", "glGetSubroutineIndex", "glGetActiveSubroutineUniformiv", "glGetActiveSubroutineUniformName", + "glGetActiveSubroutineName", "glUniformSubroutinesuiv", "glGetUniformSubroutineuiv", "glGetProgramStageiv" + )) || reportMissing("GL", "GL_ARB_shader_subroutine"); + } + + private static boolean check_ARB_shading_language_include(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_shading_language_include")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1354, 1355, 1356, 1357, 1358, 1359 + }, + "glNamedStringARB", "glDeleteNamedStringARB", "glCompileShaderIncludeARB", "glIsNamedStringARB", "glGetNamedStringARB", "glGetNamedStringivARB" + )) || reportMissing("GL", "GL_ARB_shading_language_include"); + } + + private static boolean check_ARB_sparse_buffer(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_sparse_buffer")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + int flag1 = ext.contains("GL_ARB_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1360 + }, + "glBufferPageCommitmentARB" + )) || reportMissing("GL", "GL_ARB_sparse_buffer"); + } + + private static boolean check_ARB_sparse_texture(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_sparse_texture")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1363, flag0 + 1364 + }, + "glTexPageCommitmentARB", "glTexturePageCommitmentEXT" + )) || reportMissing("GL", "GL_ARB_sparse_texture"); + } + + private static boolean check_ARB_sync(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_sync")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 658, 659, 660, 661, 662, 663, 665 + }, + "glFenceSync", "glIsSync", "glDeleteSync", "glClientWaitSync", "glWaitSync", "glGetInteger64v", "glGetSynciv" + )) || reportMissing("GL", "GL_ARB_sync"); + } + + private static boolean check_ARB_tessellation_shader(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_tessellation_shader")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 757, 758 + }, + "glPatchParameteri", "glPatchParameterfv" + )) || reportMissing("GL", "GL_ARB_tessellation_shader"); + } + + private static boolean check_ARB_texture_barrier(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_texture_barrier")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1023 + }, + "glTextureBarrier" + )) || reportMissing("GL", "GL_ARB_texture_barrier"); + } + + private static boolean check_ARB_texture_buffer_object(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_texture_buffer_object")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1365 + }, + "glTexBufferARB" + )) || reportMissing("GL", "GL_ARB_texture_buffer_object"); + } + + private static boolean check_ARB_texture_buffer_range(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_texture_buffer_range")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 903, flag0 + 1366 + }, + "glTexBufferRange", "glTextureBufferRangeEXT" + )) || reportMissing("GL", "GL_ARB_texture_buffer_range"); + } + + private static boolean check_ARB_texture_compression(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_texture_compression")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1367, 1368, 1369, 1370, 1371, 1372, 1373 + }, + "glCompressedTexImage3DARB", "glCompressedTexImage2DARB", "glCompressedTexImage1DARB", "glCompressedTexSubImage3DARB", + "glCompressedTexSubImage2DARB", "glCompressedTexSubImage1DARB", "glGetCompressedTexImageARB" + )) || reportMissing("GL", "GL_ARB_texture_compression"); + } + + private static boolean check_ARB_texture_multisample(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_texture_multisample")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 653, 654, 655, 656 + }, + "glTexImage2DMultisample", "glTexImage3DMultisample", "glGetMultisamplefv", "glSampleMaski" + )) || reportMissing("GL", "GL_ARB_texture_multisample"); + } + + private static boolean check_ARB_texture_storage(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_texture_storage")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 859, 860, 861, flag0 + 1374, flag0 + 1375, flag0 + 1376 + }, + "glTexStorage1D", "glTexStorage2D", "glTexStorage3D", "glTextureStorage1DEXT", "glTextureStorage2DEXT", "glTextureStorage3DEXT" + )) || reportMissing("GL", "GL_ARB_texture_storage"); + } + + private static boolean check_ARB_texture_storage_multisample(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_texture_storage_multisample")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 904, 905, flag0 + 1377, flag0 + 1378 + }, + "glTexStorage2DMultisample", "glTexStorage3DMultisample", "glTextureStorage2DMultisampleEXT", "glTextureStorage3DMultisampleEXT" + )) || reportMissing("GL", "GL_ARB_texture_storage_multisample"); + } + + private static boolean check_ARB_texture_view(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_texture_view")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 906 + }, + "glTextureView" + )) || reportMissing("GL", "GL_ARB_texture_view"); + } + + private static boolean check_ARB_timer_query(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_timer_query")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 682, 683, 684 + }, + "glQueryCounter", "glGetQueryObjecti64v", "glGetQueryObjectui64v" + )) || reportMissing("GL", "GL_ARB_timer_query"); + } + + private static boolean check_ARB_transform_feedback2(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_transform_feedback2")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 759, 760, 761, 762, 763, 764, 765 + }, + "glBindTransformFeedback", "glDeleteTransformFeedbacks", "glGenTransformFeedbacks", "glIsTransformFeedback", "glPauseTransformFeedback", + "glResumeTransformFeedback", "glDrawTransformFeedback" + )) || reportMissing("GL", "GL_ARB_transform_feedback2"); + } + + private static boolean check_ARB_transform_feedback3(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_transform_feedback3")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 766, 767, 768, 769 + }, + "glDrawTransformFeedbackStream", "glBeginQueryIndexed", "glEndQueryIndexed", "glGetQueryIndexediv" + )) || reportMissing("GL", "GL_ARB_transform_feedback3"); + } + + private static boolean check_ARB_transform_feedback_instanced(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_transform_feedback_instanced")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 862, 863 + }, + "glDrawTransformFeedbackInstanced", "glDrawTransformFeedbackStreamInstanced" + )) || reportMissing("GL", "GL_ARB_transform_feedback_instanced"); + } + + private static boolean check_ARB_transpose_matrix(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_transpose_matrix")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1379, 1380, 1381, 1382 + }, + "glLoadTransposeMatrixfARB", "glLoadTransposeMatrixdARB", "glMultTransposeMatrixfARB", "glMultTransposeMatrixdARB" + )) || reportMissing("GL", "GL_ARB_transpose_matrix"); + } + + private static boolean check_ARB_uniform_buffer_object(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_uniform_buffer_object")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 640, 641, 642, 643, 644, 645, 625, 626, 621, 646 + }, + "glGetUniformIndices", "glGetActiveUniformsiv", "glGetActiveUniformName", "glGetUniformBlockIndex", "glGetActiveUniformBlockiv", + "glGetActiveUniformBlockName", "glBindBufferRange", "glBindBufferBase", "glGetIntegeri_v", "glUniformBlockBinding" + )) || reportMissing("GL", "GL_ARB_uniform_buffer_object"); + } + + private static boolean check_ARB_vertex_array_object(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_vertex_array_object")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 631, 632, 633, 634 + }, + "glBindVertexArray", "glDeleteVertexArrays", "glGenVertexArrays", "glIsVertexArray" + )) || reportMissing("GL", "GL_ARB_vertex_array_object"); + } + + private static boolean check_ARB_vertex_attrib_64bit(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_vertex_attrib_64bit")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, flag0 + 1383 + }, + "glVertexAttribL1d", "glVertexAttribL2d", "glVertexAttribL3d", "glVertexAttribL4d", "glVertexAttribL1dv", "glVertexAttribL2dv", + "glVertexAttribL3dv", "glVertexAttribL4dv", "glVertexAttribLPointer", "glGetVertexAttribLdv", "glVertexArrayVertexAttribLOffsetEXT" + )) || reportMissing("GL", "GL_ARB_vertex_attrib_64bit"); + } + + private static boolean check_ARB_vertex_attrib_binding(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_vertex_attrib_binding")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 907, 908, 909, 910, 911, 912, flag0 + 1384, flag0 + 1385, flag0 + 1386, flag0 + 1387, flag0 + 1388, flag0 + 1389 + }, + "glBindVertexBuffer", "glVertexAttribFormat", "glVertexAttribIFormat", "glVertexAttribLFormat", "glVertexAttribBinding", "glVertexBindingDivisor", + "glVertexArrayBindVertexBufferEXT", "glVertexArrayVertexAttribFormatEXT", "glVertexArrayVertexAttribIFormatEXT", + "glVertexArrayVertexAttribLFormatEXT", "glVertexArrayVertexAttribBindingEXT", "glVertexArrayVertexBindingDivisorEXT" + )) || reportMissing("GL", "GL_ARB_vertex_attrib_binding"); + } + + private static boolean check_ARB_vertex_blend(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_vertex_blend")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399 + }, + "glWeightfvARB", "glWeightbvARB", "glWeightubvARB", "glWeightsvARB", "glWeightusvARB", "glWeightivARB", "glWeightuivARB", "glWeightdvARB", + "glWeightPointerARB", "glVertexBlendARB" + )) || reportMissing("GL", "GL_ARB_vertex_blend"); + } + + private static boolean check_ARB_vertex_buffer_object(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_vertex_buffer_object")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410 + }, + "glBindBufferARB", "glDeleteBuffersARB", "glGenBuffersARB", "glIsBufferARB", "glBufferDataARB", "glBufferSubDataARB", "glGetBufferSubDataARB", + "glMapBufferARB", "glUnmapBufferARB", "glGetBufferParameterivARB", "glGetBufferPointervARB" + )) || reportMissing("GL", "GL_ARB_vertex_buffer_object"); + } + + private static boolean check_ARB_vertex_program(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_vertex_program")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, + 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, + 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472 + }, + "glVertexAttrib1sARB", "glVertexAttrib1fARB", "glVertexAttrib1dARB", "glVertexAttrib2sARB", "glVertexAttrib2fARB", "glVertexAttrib2dARB", + "glVertexAttrib3sARB", "glVertexAttrib3fARB", "glVertexAttrib3dARB", "glVertexAttrib4sARB", "glVertexAttrib4fARB", "glVertexAttrib4dARB", + "glVertexAttrib4NubARB", "glVertexAttrib1svARB", "glVertexAttrib1fvARB", "glVertexAttrib1dvARB", "glVertexAttrib2svARB", "glVertexAttrib2fvARB", + "glVertexAttrib2dvARB", "glVertexAttrib3svARB", "glVertexAttrib3fvARB", "glVertexAttrib3dvARB", "glVertexAttrib4fvARB", "glVertexAttrib4bvARB", + "glVertexAttrib4svARB", "glVertexAttrib4ivARB", "glVertexAttrib4ubvARB", "glVertexAttrib4usvARB", "glVertexAttrib4uivARB", "glVertexAttrib4dvARB", + "glVertexAttrib4NbvARB", "glVertexAttrib4NsvARB", "glVertexAttrib4NivARB", "glVertexAttrib4NubvARB", "glVertexAttrib4NusvARB", + "glVertexAttrib4NuivARB", "glVertexAttribPointerARB", "glEnableVertexAttribArrayARB", "glDisableVertexAttribArrayARB", "glProgramStringARB", + "glBindProgramARB", "glDeleteProgramsARB", "glGenProgramsARB", "glProgramEnvParameter4dARB", "glProgramEnvParameter4dvARB", + "glProgramEnvParameter4fARB", "glProgramEnvParameter4fvARB", "glProgramLocalParameter4dARB", "glProgramLocalParameter4dvARB", + "glProgramLocalParameter4fARB", "glProgramLocalParameter4fvARB", "glGetProgramEnvParameterfvARB", "glGetProgramEnvParameterdvARB", + "glGetProgramLocalParameterfvARB", "glGetProgramLocalParameterdvARB", "glGetProgramivARB", "glGetProgramStringARB", "glGetVertexAttribfvARB", + "glGetVertexAttribdvARB", "glGetVertexAttribivARB", "glGetVertexAttribPointervARB", "glIsProgramARB" + )) || reportMissing("GL", "GL_ARB_vertex_program"); + } + + private static boolean check_ARB_vertex_shader(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_vertex_shader")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1412, 1411, 1413, 1415, 1414, 1416, 1418, 1417, 1419, 1421, 1420, 1422, 1423, 1425, 1424, 1426, 1428, 1427, 1429, 1431, 1430, 1432, 1433, 1435, + 1440, 1436, 1434, 1437, 1438, 1439, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1473, 1474, 1475, 1470, 1468, 1469, 1471 + }, + "glVertexAttrib1fARB", "glVertexAttrib1sARB", "glVertexAttrib1dARB", "glVertexAttrib2fARB", "glVertexAttrib2sARB", "glVertexAttrib2dARB", + "glVertexAttrib3fARB", "glVertexAttrib3sARB", "glVertexAttrib3dARB", "glVertexAttrib4fARB", "glVertexAttrib4sARB", "glVertexAttrib4dARB", + "glVertexAttrib4NubARB", "glVertexAttrib1fvARB", "glVertexAttrib1svARB", "glVertexAttrib1dvARB", "glVertexAttrib2fvARB", "glVertexAttrib2svARB", + "glVertexAttrib2dvARB", "glVertexAttrib3fvARB", "glVertexAttrib3svARB", "glVertexAttrib3dvARB", "glVertexAttrib4fvARB", "glVertexAttrib4svARB", + "glVertexAttrib4dvARB", "glVertexAttrib4ivARB", "glVertexAttrib4bvARB", "glVertexAttrib4ubvARB", "glVertexAttrib4usvARB", "glVertexAttrib4uivARB", + "glVertexAttrib4NbvARB", "glVertexAttrib4NsvARB", "glVertexAttrib4NivARB", "glVertexAttrib4NubvARB", "glVertexAttrib4NusvARB", + "glVertexAttrib4NuivARB", "glVertexAttribPointerARB", "glEnableVertexAttribArrayARB", "glDisableVertexAttribArrayARB", "glBindAttribLocationARB", + "glGetActiveAttribARB", "glGetAttribLocationARB", "glGetVertexAttribivARB", "glGetVertexAttribfvARB", "glGetVertexAttribdvARB", + "glGetVertexAttribPointervARB" + )) || reportMissing("GL", "GL_ARB_vertex_shader"); + } + + private static boolean check_ARB_vertex_type_2_10_10_10_rev(FunctionProvider provider, PointerBuffer caps, Set ext, boolean fc) { + if (!ext.contains("GL_ARB_vertex_type_2_10_10_10_rev")) { + return false; + } + + return ((fc || checkFunctions(provider, caps, new int[] { + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715 + }, + "glVertexP2ui", "glVertexP3ui", "glVertexP4ui", "glVertexP2uiv", "glVertexP3uiv", "glVertexP4uiv", "glTexCoordP1ui", "glTexCoordP2ui", + "glTexCoordP3ui", "glTexCoordP4ui", "glTexCoordP1uiv", "glTexCoordP2uiv", "glTexCoordP3uiv", "glTexCoordP4uiv", "glMultiTexCoordP1ui", + "glMultiTexCoordP2ui", "glMultiTexCoordP3ui", "glMultiTexCoordP4ui", "glMultiTexCoordP1uiv", "glMultiTexCoordP2uiv", "glMultiTexCoordP3uiv", + "glMultiTexCoordP4uiv", "glNormalP3ui", "glNormalP3uiv", "glColorP3ui", "glColorP4ui", "glColorP3uiv", "glColorP4uiv", "glSecondaryColorP3ui", + "glSecondaryColorP3uiv" + )) && checkFunctions(provider, caps, new int[] { + 716, 717, 718, 719, 720, 721, 722, 723 + }, + "glVertexAttribP1ui", "glVertexAttribP2ui", "glVertexAttribP3ui", "glVertexAttribP4ui", "glVertexAttribP1uiv", "glVertexAttribP2uiv", + "glVertexAttribP3uiv", "glVertexAttribP4uiv" + )) || reportMissing("GL", "GL_ARB_vertex_type_2_10_10_10_rev"); + } + + private static boolean check_ARB_viewport_array(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_viewport_array")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 848, 849, 850, 851, 852, 853, 854, 855, 856, 857 + }, + "glViewportArrayv", "glViewportIndexedf", "glViewportIndexedfv", "glScissorArrayv", "glScissorIndexed", "glScissorIndexedv", "glDepthRangeArrayv", + "glDepthRangeIndexed", "glGetFloati_v", "glGetDoublei_v" + )) || reportMissing("GL", "GL_ARB_viewport_array"); + } + + private static boolean check_ARB_window_pos(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_ARB_window_pos")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491 + }, + "glWindowPos2iARB", "glWindowPos2sARB", "glWindowPos2fARB", "glWindowPos2dARB", "glWindowPos2ivARB", "glWindowPos2svARB", "glWindowPos2fvARB", + "glWindowPos2dvARB", "glWindowPos3iARB", "glWindowPos3sARB", "glWindowPos3fARB", "glWindowPos3dARB", "glWindowPos3ivARB", "glWindowPos3svARB", + "glWindowPos3fvARB", "glWindowPos3dvARB" + )) || reportMissing("GL", "GL_ARB_window_pos"); + } + + private static boolean check_EXT_bindable_uniform(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_bindable_uniform")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1492, 1493, 1494 + }, + "glUniformBufferEXT", "glGetUniformBufferSizeEXT", "glGetUniformOffsetEXT" + )) || reportMissing("GL", "GL_EXT_bindable_uniform"); + } + + private static boolean check_EXT_blend_color(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_blend_color")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1495 + }, + "glBlendColorEXT" + )) || reportMissing("GL", "GL_EXT_blend_color"); + } + + private static boolean check_EXT_blend_equation_separate(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_blend_equation_separate")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1496 + }, + "glBlendEquationSeparateEXT" + )) || reportMissing("GL", "GL_EXT_blend_equation_separate"); + } + + private static boolean check_EXT_blend_func_separate(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_blend_func_separate")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1497 + }, + "glBlendFuncSeparateEXT" + )) || reportMissing("GL", "GL_EXT_blend_func_separate"); + } + + private static boolean check_EXT_blend_minmax(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_blend_minmax")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1498 + }, + "glBlendEquationEXT" + )) || reportMissing("GL", "GL_EXT_blend_minmax"); + } + + private static boolean check_EXT_compiled_vertex_array(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_compiled_vertex_array")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1499, 1500 + }, + "glLockArraysEXT", "glUnlockArraysEXT" + )) || reportMissing("GL", "GL_EXT_compiled_vertex_array"); + } + + private static boolean check_EXT_debug_label(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_debug_label")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1501, 1502 + }, + "glLabelObjectEXT", "glGetObjectLabelEXT" + )) || reportMissing("GL", "GL_EXT_debug_label"); + } + + private static boolean check_EXT_debug_marker(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_debug_marker")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1503, 1504, 1505 + }, + "glInsertEventMarkerEXT", "glPushGroupMarkerEXT", "glPopGroupMarkerEXT" + )) || reportMissing("GL", "GL_EXT_debug_marker"); + } + + private static boolean check_EXT_depth_bounds_test(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_depth_bounds_test")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1506 + }, + "glDepthBoundsEXT" + )) || reportMissing("GL", "GL_EXT_depth_bounds_test"); + } + + private static boolean check_EXT_direct_state_access(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_direct_state_access")) { + return false; + } + + int flag0 = ext.contains("OpenGL12") ? 0 : Integer.MIN_VALUE; + int flag3 = ext.contains("OpenGL13") ? 0 : Integer.MIN_VALUE; + int flag42 = ext.contains("OpenGL30") ? 0 : Integer.MIN_VALUE; + int flag55 = ext.contains("GL_ARB_vertex_program") ? 0 : Integer.MIN_VALUE; + int flag82 = ext.contains("OpenGL15") ? 0 : Integer.MIN_VALUE; + int flag88 = ext.contains("OpenGL20") ? 0 : Integer.MIN_VALUE; + int flag107 = ext.contains("OpenGL21") ? 0 : Integer.MIN_VALUE; + int flag113 = ext.contains("GL_EXT_texture_buffer_object") ? 0 : Integer.MIN_VALUE; + int flag115 = ext.contains("GL_EXT_texture_integer") ? 0 : Integer.MIN_VALUE; + int flag123 = ext.contains("GL_EXT_gpu_shader4") ? 0 : Integer.MIN_VALUE; + int flag131 = ext.contains("GL_EXT_gpu_program_parameters") ? 0 : Integer.MIN_VALUE; + int flag132 = ext.contains("GL_NV_gpu_program4") ? 0 : Integer.MIN_VALUE; + int flag143 = ext.contains("GL_NV_framebuffer_multisample_coverage") ? 0 : Integer.MIN_VALUE; + int flag157 = ext.contains("GL_EXT_geometry_shader4") || ext.contains("GL_NV_gpu_program4") ? 0 : Integer.MIN_VALUE; + int flag160 = ext.contains("GL_NV_explicit_multisample") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, + 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, flag0 + 1541, flag0 + 1542, flag0 + 1543, flag3 + 1544, flag3 + 1545, flag3 + 1546, + flag3 + 1547, flag3 + 1548, flag3 + 1549, flag3 + 1550, flag3 + 1551, flag3 + 1552, flag3 + 1553, flag3 + 1554, flag3 + 1555, flag3 + 1556, + flag3 + 1557, flag3 + 1558, flag3 + 1559, flag3 + 1560, flag3 + 1561, flag3 + 1562, flag3 + 1563, flag3 + 1564, flag3 + 1565, flag3 + 1566, + flag3 + 1567, flag3 + 1568, flag3 + 1569, flag3 + 1570, flag3 + 1571, flag3 + 1572, flag3 + 1573, flag3 + 1574, flag3 + 1575, flag3 + 1576, + flag3 + 1577, flag3 + 1578, flag3 + 1579, flag3 + 1580, flag3 + 1581, flag3 + 1582, flag3 + 1585, flag3 + 1586, flag3 + 1587, flag3 + 1591, + flag3 + 1592, flag3 + 1593, flag3 + 1594, flag3 + 1595, flag55 + 1596, flag55 + 1597, flag55 + 1598, flag55 + 1599, flag55 + 1600, flag55 + 1601, + flag55 + 1602, flag55 + 1603, flag55 + 1604, flag3 + 1605, flag3 + 1606, flag3 + 1607, flag3 + 1608, flag3 + 1609, flag3 + 1610, flag3 + 1611, + flag3 + 1612, flag3 + 1613, flag3 + 1614, flag3 + 1615, flag3 + 1616, flag3 + 1617, flag3 + 1618, flag3 + 1619, flag3 + 1620, flag3 + 1621, + flag3 + 1622, flag82 + 1623, flag82 + 1624, flag82 + 1625, flag82 + 1626, flag82 + 1627, flag82 + 1628, flag88 + 1629, flag88 + 1630, flag88 + 1631, + flag88 + 1632, flag88 + 1633, flag88 + 1634, flag88 + 1635, flag88 + 1636, flag88 + 1637, flag88 + 1638, flag88 + 1639, flag88 + 1640, + flag88 + 1641, flag88 + 1642, flag88 + 1643, flag88 + 1644, flag88 + 1645, flag88 + 1646, flag88 + 1647, flag107 + 1648, flag107 + 1649, + flag107 + 1650, flag107 + 1651, flag107 + 1652, flag107 + 1653, flag113 + 1654, flag113 + 1655, flag115 + 1656, flag115 + 1657, flag115 + 1658, + flag115 + 1659, flag115 + 1660, flag115 + 1661, flag115 + 1662, flag115 + 1663, flag123 + 1664, flag123 + 1665, flag123 + 1666, flag123 + 1667, + flag123 + 1668, flag123 + 1669, flag123 + 1670, flag123 + 1671, flag131 + 1672, flag132 + 1673, flag132 + 1674, flag132 + 1675, flag132 + 1676, + flag132 + 1677, flag132 + 1678, flag132 + 1679, flag132 + 1680, flag42 + 1681, flag42 + 1682, flag42 + 1683, flag143 + 1684, flag42 + 1685, + flag42 + 1686, flag42 + 1687, flag42 + 1688, flag42 + 1689, flag42 + 1690, flag42 + 1691, flag42 + 1692, flag42 + 1693, flag42 + 1694, + flag42 + 1695, flag42 + 1696, flag42 + 1697, flag157 + 1698, flag157 + 1699, flag157 + 1700, flag160 + 1701, flag160 + 1702, flag42 + 1703, + flag42 + 1704, flag42 + 1705, flag42 + 1706, flag42 + 1707, flag42 + 1708, flag42 + 1709, flag42 + 1710, flag42 + 1711, flag42 + 1712, + flag42 + 1713, flag42 + 1714, flag42 + 1715, flag42 + 1716, flag42 + 1717, flag42 + 1718, flag42 + 1719, flag42 + 1720, flag42 + 1721, + flag42 + 1722, flag42 + 1723 + }, + "glClientAttribDefaultEXT", "glPushClientAttribDefaultEXT", "glMatrixLoadfEXT", "glMatrixLoaddEXT", "glMatrixMultfEXT", "glMatrixMultdEXT", + "glMatrixLoadIdentityEXT", "glMatrixRotatefEXT", "glMatrixRotatedEXT", "glMatrixScalefEXT", "glMatrixScaledEXT", "glMatrixTranslatefEXT", + "glMatrixTranslatedEXT", "glMatrixOrthoEXT", "glMatrixFrustumEXT", "glMatrixPushEXT", "glMatrixPopEXT", "glTextureParameteriEXT", + "glTextureParameterivEXT", "glTextureParameterfEXT", "glTextureParameterfvEXT", "glTextureImage1DEXT", "glTextureImage2DEXT", + "glTextureSubImage1DEXT", "glTextureSubImage2DEXT", "glCopyTextureImage1DEXT", "glCopyTextureImage2DEXT", "glCopyTextureSubImage1DEXT", + "glCopyTextureSubImage2DEXT", "glGetTextureImageEXT", "glGetTextureParameterfvEXT", "glGetTextureParameterivEXT", "glGetTextureLevelParameterfvEXT", + "glGetTextureLevelParameterivEXT", "glTextureImage3DEXT", "glTextureSubImage3DEXT", "glCopyTextureSubImage3DEXT", "glBindMultiTextureEXT", + "glMultiTexCoordPointerEXT", "glMultiTexEnvfEXT", "glMultiTexEnvfvEXT", "glMultiTexEnviEXT", "glMultiTexEnvivEXT", "glMultiTexGendEXT", + "glMultiTexGendvEXT", "glMultiTexGenfEXT", "glMultiTexGenfvEXT", "glMultiTexGeniEXT", "glMultiTexGenivEXT", "glGetMultiTexEnvfvEXT", + "glGetMultiTexEnvivEXT", "glGetMultiTexGendvEXT", "glGetMultiTexGenfvEXT", "glGetMultiTexGenivEXT", "glMultiTexParameteriEXT", + "glMultiTexParameterivEXT", "glMultiTexParameterfEXT", "glMultiTexParameterfvEXT", "glMultiTexImage1DEXT", "glMultiTexImage2DEXT", + "glMultiTexSubImage1DEXT", "glMultiTexSubImage2DEXT", "glCopyMultiTexImage1DEXT", "glCopyMultiTexImage2DEXT", "glCopyMultiTexSubImage1DEXT", + "glCopyMultiTexSubImage2DEXT", "glGetMultiTexImageEXT", "glGetMultiTexParameterfvEXT", "glGetMultiTexParameterivEXT", + "glGetMultiTexLevelParameterfvEXT", "glGetMultiTexLevelParameterivEXT", "glMultiTexImage3DEXT", "glMultiTexSubImage3DEXT", + "glCopyMultiTexSubImage3DEXT", "glEnableClientStateIndexedEXT", "glDisableClientStateIndexedEXT", "glGetFloatIndexedvEXT", "glGetDoubleIndexedvEXT", + "glGetPointerIndexedvEXT", "glEnableIndexedEXT", "glDisableIndexedEXT", "glIsEnabledIndexedEXT", "glGetIntegerIndexedvEXT", + "glGetBooleanIndexedvEXT", "glNamedProgramStringEXT", "glNamedProgramLocalParameter4dEXT", "glNamedProgramLocalParameter4dvEXT", + "glNamedProgramLocalParameter4fEXT", "glNamedProgramLocalParameter4fvEXT", "glGetNamedProgramLocalParameterdvEXT", + "glGetNamedProgramLocalParameterfvEXT", "glGetNamedProgramivEXT", "glGetNamedProgramStringEXT", "glCompressedTextureImage3DEXT", + "glCompressedTextureImage2DEXT", "glCompressedTextureImage1DEXT", "glCompressedTextureSubImage3DEXT", "glCompressedTextureSubImage2DEXT", + "glCompressedTextureSubImage1DEXT", "glGetCompressedTextureImageEXT", "glCompressedMultiTexImage3DEXT", "glCompressedMultiTexImage2DEXT", + "glCompressedMultiTexImage1DEXT", "glCompressedMultiTexSubImage3DEXT", "glCompressedMultiTexSubImage2DEXT", "glCompressedMultiTexSubImage1DEXT", + "glGetCompressedMultiTexImageEXT", "glMatrixLoadTransposefEXT", "glMatrixLoadTransposedEXT", "glMatrixMultTransposefEXT", + "glMatrixMultTransposedEXT", "glNamedBufferDataEXT", "glNamedBufferSubDataEXT", "glMapNamedBufferEXT", "glUnmapNamedBufferEXT", + "glGetNamedBufferParameterivEXT", "glGetNamedBufferSubDataEXT", "glProgramUniform1fEXT", "glProgramUniform2fEXT", "glProgramUniform3fEXT", + "glProgramUniform4fEXT", "glProgramUniform1iEXT", "glProgramUniform2iEXT", "glProgramUniform3iEXT", "glProgramUniform4iEXT", + "glProgramUniform1fvEXT", "glProgramUniform2fvEXT", "glProgramUniform3fvEXT", "glProgramUniform4fvEXT", "glProgramUniform1ivEXT", + "glProgramUniform2ivEXT", "glProgramUniform3ivEXT", "glProgramUniform4ivEXT", "glProgramUniformMatrix2fvEXT", "glProgramUniformMatrix3fvEXT", + "glProgramUniformMatrix4fvEXT", "glProgramUniformMatrix2x3fvEXT", "glProgramUniformMatrix3x2fvEXT", "glProgramUniformMatrix2x4fvEXT", + "glProgramUniformMatrix4x2fvEXT", "glProgramUniformMatrix3x4fvEXT", "glProgramUniformMatrix4x3fvEXT", "glTextureBufferEXT", "glMultiTexBufferEXT", + "glTextureParameterIivEXT", "glTextureParameterIuivEXT", "glGetTextureParameterIivEXT", "glGetTextureParameterIuivEXT", "glMultiTexParameterIivEXT", + "glMultiTexParameterIuivEXT", "glGetMultiTexParameterIivEXT", "glGetMultiTexParameterIuivEXT", "glProgramUniform1uiEXT", "glProgramUniform2uiEXT", + "glProgramUniform3uiEXT", "glProgramUniform4uiEXT", "glProgramUniform1uivEXT", "glProgramUniform2uivEXT", "glProgramUniform3uivEXT", + "glProgramUniform4uivEXT", "glNamedProgramLocalParameters4fvEXT", "glNamedProgramLocalParameterI4iEXT", "glNamedProgramLocalParameterI4ivEXT", + "glNamedProgramLocalParametersI4ivEXT", "glNamedProgramLocalParameterI4uiEXT", "glNamedProgramLocalParameterI4uivEXT", + "glNamedProgramLocalParametersI4uivEXT", "glGetNamedProgramLocalParameterIivEXT", "glGetNamedProgramLocalParameterIuivEXT", + "glNamedRenderbufferStorageEXT", "glGetNamedRenderbufferParameterivEXT", "glNamedRenderbufferStorageMultisampleEXT", + "glNamedRenderbufferStorageMultisampleCoverageEXT", "glCheckNamedFramebufferStatusEXT", "glNamedFramebufferTexture1DEXT", + "glNamedFramebufferTexture2DEXT", "glNamedFramebufferTexture3DEXT", "glNamedFramebufferRenderbufferEXT", + "glGetNamedFramebufferAttachmentParameterivEXT", "glGenerateTextureMipmapEXT", "glGenerateMultiTexMipmapEXT", "glFramebufferDrawBufferEXT", + "glFramebufferDrawBuffersEXT", "glFramebufferReadBufferEXT", "glGetFramebufferParameterivEXT", "glNamedCopyBufferSubDataEXT", + "glNamedFramebufferTextureEXT", "glNamedFramebufferTextureLayerEXT", "glNamedFramebufferTextureFaceEXT", "glTextureRenderbufferEXT", + "glMultiTexRenderbufferEXT", "glVertexArrayVertexOffsetEXT", "glVertexArrayColorOffsetEXT", "glVertexArrayEdgeFlagOffsetEXT", + "glVertexArrayIndexOffsetEXT", "glVertexArrayNormalOffsetEXT", "glVertexArrayTexCoordOffsetEXT", "glVertexArrayMultiTexCoordOffsetEXT", + "glVertexArrayFogCoordOffsetEXT", "glVertexArraySecondaryColorOffsetEXT", "glVertexArrayVertexAttribOffsetEXT", + "glVertexArrayVertexAttribIOffsetEXT", "glEnableVertexArrayEXT", "glDisableVertexArrayEXT", "glEnableVertexArrayAttribEXT", + "glDisableVertexArrayAttribEXT", "glGetVertexArrayIntegervEXT", "glGetVertexArrayPointervEXT", "glGetVertexArrayIntegeri_vEXT", + "glGetVertexArrayPointeri_vEXT", "glMapNamedBufferRangeEXT", "glFlushMappedNamedBufferRangeEXT" + )) || reportMissing("GL", "GL_EXT_direct_state_access"); + } + + private static boolean check_EXT_draw_buffers2(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_draw_buffers2")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1724, 1595, 1594, 1591, 1592, 1593 + }, + "glColorMaskIndexedEXT", "glGetBooleanIndexedvEXT", "glGetIntegerIndexedvEXT", "glEnableIndexedEXT", "glDisableIndexedEXT", "glIsEnabledIndexedEXT" + )) || reportMissing("GL", "GL_EXT_draw_buffers2"); + } + + private static boolean check_EXT_draw_instanced(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_draw_instanced")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1725, 1726 + }, + "glDrawArraysInstancedEXT", "glDrawElementsInstancedEXT" + )) || reportMissing("GL", "GL_EXT_draw_instanced"); + } + + private static boolean check_EXT_EGL_image_storage(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_EGL_image_storage")) { + return false; + } + + int flag0 = hasDSA(ext) ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1727, flag0 + 1728 + }, + "glEGLImageTargetTexStorageEXT", "glEGLImageTargetTextureStorageEXT" + )) || reportMissing("GL", "GL_EXT_EGL_image_storage"); + } + + private static boolean check_EXT_external_buffer(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_external_buffer")) { + return false; + } + + int flag0 = hasDSA(ext) ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1729, flag0 + 1730 + }, + "glBufferStorageExternalEXT", "glNamedBufferStorageExternalEXT" + )) || reportMissing("GL", "GL_EXT_external_buffer"); + } + + private static boolean check_EXT_framebuffer_blit(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_framebuffer_blit")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1731 + }, + "glBlitFramebufferEXT" + )) || reportMissing("GL", "GL_EXT_framebuffer_blit"); + } + + private static boolean check_EXT_framebuffer_blit_layers(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_framebuffer_blit_layers")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1732, 1733 + }, + "glBlitFramebufferLayersEXT", "glBlitFramebufferLayerEXT" + )) || reportMissing("GL", "GL_EXT_framebuffer_blit_layers"); + } + + private static boolean check_EXT_framebuffer_multisample(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_framebuffer_multisample")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1734 + }, + "glRenderbufferStorageMultisampleEXT" + )) || reportMissing("GL", "GL_EXT_framebuffer_multisample"); + } + + private static boolean check_EXT_framebuffer_object(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_framebuffer_object")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751 + }, + "glIsRenderbufferEXT", "glBindRenderbufferEXT", "glDeleteRenderbuffersEXT", "glGenRenderbuffersEXT", "glRenderbufferStorageEXT", + "glGetRenderbufferParameterivEXT", "glIsFramebufferEXT", "glBindFramebufferEXT", "glDeleteFramebuffersEXT", "glGenFramebuffersEXT", + "glCheckFramebufferStatusEXT", "glFramebufferTexture1DEXT", "glFramebufferTexture2DEXT", "glFramebufferTexture3DEXT", + "glFramebufferRenderbufferEXT", "glGetFramebufferAttachmentParameterivEXT", "glGenerateMipmapEXT" + )) || reportMissing("GL", "GL_EXT_framebuffer_object"); + } + + private static boolean check_EXT_geometry_shader4(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_geometry_shader4")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1752, 1753, 1754, 1755 + }, + "glProgramParameteriEXT", "glFramebufferTextureEXT", "glFramebufferTextureLayerEXT", "glFramebufferTextureFaceEXT" + )) || reportMissing("GL", "GL_EXT_geometry_shader4"); + } + + private static boolean check_EXT_gpu_program_parameters(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_gpu_program_parameters")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1756, 1757 + }, + "glProgramEnvParameters4fvEXT", "glProgramLocalParameters4fvEXT" + )) || reportMissing("GL", "GL_EXT_gpu_program_parameters"); + } + + private static boolean check_EXT_gpu_shader4(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_gpu_shader4")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, + 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791 + }, + "glVertexAttribI1iEXT", "glVertexAttribI2iEXT", "glVertexAttribI3iEXT", "glVertexAttribI4iEXT", "glVertexAttribI1uiEXT", "glVertexAttribI2uiEXT", + "glVertexAttribI3uiEXT", "glVertexAttribI4uiEXT", "glVertexAttribI1ivEXT", "glVertexAttribI2ivEXT", "glVertexAttribI3ivEXT", + "glVertexAttribI4ivEXT", "glVertexAttribI1uivEXT", "glVertexAttribI2uivEXT", "glVertexAttribI3uivEXT", "glVertexAttribI4uivEXT", + "glVertexAttribI4bvEXT", "glVertexAttribI4svEXT", "glVertexAttribI4ubvEXT", "glVertexAttribI4usvEXT", "glVertexAttribIPointerEXT", + "glGetVertexAttribIivEXT", "glGetVertexAttribIuivEXT", "glGetUniformuivEXT", "glBindFragDataLocationEXT", "glGetFragDataLocationEXT", + "glUniform1uiEXT", "glUniform2uiEXT", "glUniform3uiEXT", "glUniform4uiEXT", "glUniform1uivEXT", "glUniform2uivEXT", "glUniform3uivEXT", + "glUniform4uivEXT" + )) || reportMissing("GL", "GL_EXT_gpu_shader4"); + } + + private static boolean check_EXT_memory_object(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_memory_object")) { + return false; + } + + int flag0 = hasDSA(ext) ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, flag0 + 1804, flag0 + 1805, flag0 + 1806, flag0 + 1807, flag0 + 1808, 1809, + flag0 + 1810 + }, + "glGetUnsignedBytevEXT", "glGetUnsignedBytei_vEXT", "glDeleteMemoryObjectsEXT", "glIsMemoryObjectEXT", "glCreateMemoryObjectsEXT", + "glMemoryObjectParameterivEXT", "glGetMemoryObjectParameterivEXT", "glTexStorageMem2DEXT", "glTexStorageMem2DMultisampleEXT", + "glTexStorageMem3DEXT", "glTexStorageMem3DMultisampleEXT", "glBufferStorageMemEXT", "glTextureStorageMem2DEXT", + "glTextureStorageMem2DMultisampleEXT", "glTextureStorageMem3DEXT", "glTextureStorageMem3DMultisampleEXT", "glNamedBufferStorageMemEXT", + "glTexStorageMem1DEXT", "glTextureStorageMem1DEXT" + )) || reportMissing("GL", "GL_EXT_memory_object"); + } + + private static boolean check_EXT_memory_object_fd(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_memory_object_fd")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1811 + }, + "glImportMemoryFdEXT" + )) || reportMissing("GL", "GL_EXT_memory_object_fd"); + } + + private static boolean check_EXT_memory_object_win32(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_memory_object_win32")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1812, 1813 + }, + "glImportMemoryWin32HandleEXT", "glImportMemoryWin32NameEXT" + )) || reportMissing("GL", "GL_EXT_memory_object_win32"); + } + + private static boolean check_EXT_point_parameters(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_point_parameters")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1814, 1815 + }, + "glPointParameterfEXT", "glPointParameterfvEXT" + )) || reportMissing("GL", "GL_EXT_point_parameters"); + } + + private static boolean check_EXT_polygon_offset_clamp(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_polygon_offset_clamp")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1816 + }, + "glPolygonOffsetClampEXT" + )) || reportMissing("GL", "GL_EXT_polygon_offset_clamp"); + } + + private static boolean check_EXT_provoking_vertex(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_provoking_vertex")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1817 + }, + "glProvokingVertexEXT" + )) || reportMissing("GL", "GL_EXT_provoking_vertex"); + } + + private static boolean check_EXT_raster_multisample(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_raster_multisample")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1818 + }, + "glRasterSamplesEXT" + )) || reportMissing("GL", "GL_EXT_raster_multisample"); + } + + private static boolean check_EXT_secondary_color(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_secondary_color")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835 + }, + "glSecondaryColor3bEXT", "glSecondaryColor3sEXT", "glSecondaryColor3iEXT", "glSecondaryColor3fEXT", "glSecondaryColor3dEXT", + "glSecondaryColor3ubEXT", "glSecondaryColor3usEXT", "glSecondaryColor3uiEXT", "glSecondaryColor3bvEXT", "glSecondaryColor3svEXT", + "glSecondaryColor3ivEXT", "glSecondaryColor3fvEXT", "glSecondaryColor3dvEXT", "glSecondaryColor3ubvEXT", "glSecondaryColor3usvEXT", + "glSecondaryColor3uivEXT", "glSecondaryColorPointerEXT" + )) || reportMissing("GL", "GL_EXT_secondary_color"); + } + + private static boolean check_EXT_semaphore(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_semaphore")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1792, 1793, 1836, 1837, 1838, 1839, 1840, 1841, 1842 + }, + "glGetUnsignedBytevEXT", "glGetUnsignedBytei_vEXT", "glGenSemaphoresEXT", "glDeleteSemaphoresEXT", "glIsSemaphoreEXT", + "glSemaphoreParameterui64vEXT", "glGetSemaphoreParameterui64vEXT", "glWaitSemaphoreEXT", "glSignalSemaphoreEXT" + )) || reportMissing("GL", "GL_EXT_semaphore"); + } + + private static boolean check_EXT_semaphore_fd(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_semaphore_fd")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1843 + }, + "glImportSemaphoreFdEXT" + )) || reportMissing("GL", "GL_EXT_semaphore_fd"); + } + + private static boolean check_EXT_semaphore_win32(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_semaphore_win32")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1844, 1845 + }, + "glImportSemaphoreWin32HandleEXT", "glImportSemaphoreWin32NameEXT" + )) || reportMissing("GL", "GL_EXT_semaphore_win32"); + } + + private static boolean check_EXT_separate_shader_objects(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_separate_shader_objects")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1846, 1847, 1848 + }, + "glUseShaderProgramEXT", "glActiveProgramEXT", "glCreateShaderProgramEXT" + )) || reportMissing("GL", "GL_EXT_separate_shader_objects"); + } + + private static boolean check_EXT_shader_framebuffer_fetch_non_coherent(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_shader_framebuffer_fetch_non_coherent")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1849 + }, + "glFramebufferFetchBarrierEXT" + )) || reportMissing("GL", "GL_EXT_shader_framebuffer_fetch_non_coherent"); + } + + private static boolean check_EXT_shader_image_load_store(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_shader_image_load_store")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1850, 1851 + }, + "glBindImageTextureEXT", "glMemoryBarrierEXT" + )) || reportMissing("GL", "GL_EXT_shader_image_load_store"); + } + + private static boolean check_EXT_stencil_clear_tag(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_stencil_clear_tag")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1852 + }, + "glStencilClearTagEXT" + )) || reportMissing("GL", "GL_EXT_stencil_clear_tag"); + } + + private static boolean check_EXT_stencil_two_side(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_stencil_two_side")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1853 + }, + "glActiveStencilFaceEXT" + )) || reportMissing("GL", "GL_EXT_stencil_two_side"); + } + + private static boolean check_EXT_texture_array(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_texture_array")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1754 + }, + "glFramebufferTextureLayerEXT" + )) || reportMissing("GL", "GL_EXT_texture_array"); + } + + private static boolean check_EXT_texture_buffer_object(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_texture_buffer_object")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1854 + }, + "glTexBufferEXT" + )) || reportMissing("GL", "GL_EXT_texture_buffer_object"); + } + + private static boolean check_EXT_texture_integer(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_texture_integer")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1855, 1856, 1857, 1858, 1859, 1860 + }, + "glClearColorIiEXT", "glClearColorIuiEXT", "glTexParameterIivEXT", "glTexParameterIuivEXT", "glGetTexParameterIivEXT", "glGetTexParameterIuivEXT" + )) || reportMissing("GL", "GL_EXT_texture_integer"); + } + + private static boolean check_EXT_texture_storage(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_texture_storage")) { + return false; + } + + int flag0 = hasDSA(ext) ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1861, 1862, 1863, flag0 + 1374, flag0 + 1375, flag0 + 1376 + }, + "glTexStorage1DEXT", "glTexStorage2DEXT", "glTexStorage3DEXT", "glTextureStorage1DEXT", "glTextureStorage2DEXT", "glTextureStorage3DEXT" + )) || reportMissing("GL", "GL_EXT_texture_storage"); + } + + private static boolean check_EXT_timer_query(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_timer_query")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1864, 1865 + }, + "glGetQueryObjecti64vEXT", "glGetQueryObjectui64vEXT" + )) || reportMissing("GL", "GL_EXT_timer_query"); + } + + private static boolean check_EXT_transform_feedback(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_transform_feedback")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1594, 1595 + }, + "glBindBufferRangeEXT", "glBindBufferOffsetEXT", "glBindBufferBaseEXT", "glBeginTransformFeedbackEXT", "glEndTransformFeedbackEXT", + "glTransformFeedbackVaryingsEXT", "glGetTransformFeedbackVaryingEXT", "glGetIntegerIndexedvEXT", "glGetBooleanIndexedvEXT" + )) || reportMissing("GL", "GL_EXT_transform_feedback"); + } + + private static boolean check_EXT_vertex_attrib_64bit(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_vertex_attrib_64bit")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, flag0 + 1383 + }, + "glVertexAttribL1dEXT", "glVertexAttribL2dEXT", "glVertexAttribL3dEXT", "glVertexAttribL4dEXT", "glVertexAttribL1dvEXT", "glVertexAttribL2dvEXT", + "glVertexAttribL3dvEXT", "glVertexAttribL4dvEXT", "glVertexAttribLPointerEXT", "glGetVertexAttribLdvEXT", "glVertexArrayVertexAttribLOffsetEXT" + )) || reportMissing("GL", "GL_EXT_vertex_attrib_64bit"); + } + + private static boolean check_EXT_win32_keyed_mutex(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_win32_keyed_mutex")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1883, 1884 + }, + "glAcquireKeyedMutexWin32EXT", "glReleaseKeyedMutexWin32EXT" + )) || reportMissing("GL", "GL_EXT_win32_keyed_mutex"); + } + + private static boolean check_EXT_window_rectangles(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_window_rectangles")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1885 + }, + "glWindowRectanglesEXT" + )) || reportMissing("GL", "GL_EXT_window_rectangles"); + } + + private static boolean check_EXT_x11_sync_object(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_EXT_x11_sync_object")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1886 + }, + "glImportSyncEXT" + )) || reportMissing("GL", "GL_EXT_x11_sync_object"); + } + + private static boolean check_GREMEDY_frame_terminator(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_GREMEDY_frame_terminator")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1887 + }, + "glFrameTerminatorGREMEDY" + )) || reportMissing("GL", "GL_GREMEDY_frame_terminator"); + } + + private static boolean check_GREMEDY_string_marker(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_GREMEDY_string_marker")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1888 + }, + "glStringMarkerGREMEDY" + )) || reportMissing("GL", "GL_GREMEDY_string_marker"); + } + + private static boolean check_INTEL_framebuffer_CMAA(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_INTEL_framebuffer_CMAA")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1889 + }, + "glApplyFramebufferAttachmentCMAAINTEL" + )) || reportMissing("GL", "GL_INTEL_framebuffer_CMAA"); + } + + private static boolean check_INTEL_map_texture(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_INTEL_map_texture")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1890, 1891, 1892 + }, + "glSyncTextureINTEL", "glUnmapTexture2DINTEL", "glMapTexture2DINTEL" + )) || reportMissing("GL", "GL_INTEL_map_texture"); + } + + private static boolean check_INTEL_performance_query(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_INTEL_performance_query")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902 + }, + "glBeginPerfQueryINTEL", "glCreatePerfQueryINTEL", "glDeletePerfQueryINTEL", "glEndPerfQueryINTEL", "glGetFirstPerfQueryIdINTEL", + "glGetNextPerfQueryIdINTEL", "glGetPerfCounterInfoINTEL", "glGetPerfQueryDataINTEL", "glGetPerfQueryIdByNameINTEL", "glGetPerfQueryInfoINTEL" + )) || reportMissing("GL", "GL_INTEL_performance_query"); + } + + private static boolean check_KHR_blend_equation_advanced(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_KHR_blend_equation_advanced")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1903 + }, + "glBlendBarrierKHR" + )) || reportMissing("GL", "GL_KHR_blend_equation_advanced"); + } + + private static boolean check_KHR_debug(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_KHR_debug")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 875, 876, 877, 878, 879, 880, 881, 882, 883, 884 + }, + "glDebugMessageControl", "glDebugMessageInsert", "glDebugMessageCallback", "glGetDebugMessageLog", "glPushDebugGroup", "glPopDebugGroup", + "glObjectLabel", "glGetObjectLabel", "glObjectPtrLabel", "glGetObjectPtrLabel" + )) || reportMissing("GL", "GL_KHR_debug"); + } + + private static boolean check_KHR_parallel_shader_compile(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_KHR_parallel_shader_compile")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1904 + }, + "glMaxShaderCompilerThreadsKHR" + )) || reportMissing("GL", "GL_KHR_parallel_shader_compile"); + } + + private static boolean check_KHR_robustness(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_KHR_robustness")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1024, 1033, 1040, 1042, 1043 + }, + "glGetGraphicsResetStatus", "glReadnPixels", "glGetnUniformfv", "glGetnUniformiv", "glGetnUniformuiv" + )) || reportMissing("GL", "GL_KHR_robustness"); + } + + private static boolean check_MESA_framebuffer_flip_y(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_MESA_framebuffer_flip_y")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1905, 1906 + }, + "glFramebufferParameteriMESA", "glGetFramebufferParameterivMESA" + )) || reportMissing("GL", "GL_MESA_framebuffer_flip_y"); + } + + private static boolean check_NV_alpha_to_coverage_dither_control(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_alpha_to_coverage_dither_control")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1907 + }, + "glAlphaToCoverageDitherControlNV" + )) || reportMissing("GL", "GL_NV_alpha_to_coverage_dither_control"); + } + + private static boolean check_NV_bindless_multi_draw_indirect(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_bindless_multi_draw_indirect")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1908, 1909 + }, + "glMultiDrawArraysIndirectBindlessNV", "glMultiDrawElementsIndirectBindlessNV" + )) || reportMissing("GL", "GL_NV_bindless_multi_draw_indirect"); + } + + private static boolean check_NV_bindless_multi_draw_indirect_count(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_bindless_multi_draw_indirect_count")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1910, 1911 + }, + "glMultiDrawArraysIndirectBindlessCountNV", "glMultiDrawElementsIndirectBindlessCountNV" + )) || reportMissing("GL", "GL_NV_bindless_multi_draw_indirect_count"); + } + + private static boolean check_NV_bindless_texture(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_bindless_texture")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924 + }, + "glGetTextureHandleNV", "glGetTextureSamplerHandleNV", "glMakeTextureHandleResidentNV", "glMakeTextureHandleNonResidentNV", "glGetImageHandleNV", + "glMakeImageHandleResidentNV", "glMakeImageHandleNonResidentNV", "glUniformHandleui64NV", "glUniformHandleui64vNV", "glProgramUniformHandleui64NV", + "glProgramUniformHandleui64vNV", "glIsTextureHandleResidentNV", "glIsImageHandleResidentNV" + )) || reportMissing("GL", "GL_NV_bindless_texture"); + } + + private static boolean check_NV_blend_equation_advanced(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_blend_equation_advanced")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1925, 1926 + }, + "glBlendParameteriNV", "glBlendBarrierNV" + )) || reportMissing("GL", "GL_NV_blend_equation_advanced"); + } + + private static boolean check_NV_clip_space_w_scaling(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_clip_space_w_scaling")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1927 + }, + "glViewportPositionWScaleNV" + )) || reportMissing("GL", "GL_NV_clip_space_w_scaling"); + } + + private static boolean check_NV_command_list(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_command_list")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944 + }, + "glCreateStatesNV", "glDeleteStatesNV", "glIsStateNV", "glStateCaptureNV", "glGetCommandHeaderNV", "glGetStageIndexNV", "glDrawCommandsNV", + "glDrawCommandsAddressNV", "glDrawCommandsStatesNV", "glDrawCommandsStatesAddressNV", "glCreateCommandListsNV", "glDeleteCommandListsNV", + "glIsCommandListNV", "glListDrawCommandsStatesClientNV", "glCommandListSegmentsNV", "glCompileCommandListNV", "glCallCommandListNV" + )) || reportMissing("GL", "GL_NV_command_list"); + } + + private static boolean check_NV_conditional_render(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_conditional_render")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1945, 1946 + }, + "glBeginConditionalRenderNV", "glEndConditionalRenderNV" + )) || reportMissing("GL", "GL_NV_conditional_render"); + } + + private static boolean check_NV_conservative_raster(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_conservative_raster")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1947 + }, + "glSubpixelPrecisionBiasNV" + )) || reportMissing("GL", "GL_NV_conservative_raster"); + } + + private static boolean check_NV_conservative_raster_dilate(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_conservative_raster_dilate")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1948 + }, + "glConservativeRasterParameterfNV" + )) || reportMissing("GL", "GL_NV_conservative_raster_dilate"); + } + + private static boolean check_NV_conservative_raster_pre_snap_triangles(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_conservative_raster_pre_snap_triangles")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1949 + }, + "glConservativeRasterParameteriNV" + )) || reportMissing("GL", "GL_NV_conservative_raster_pre_snap_triangles"); + } + + private static boolean check_NV_copy_image(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_copy_image")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1950 + }, + "glCopyImageSubDataNV" + )) || reportMissing("GL", "GL_NV_copy_image"); + } + + private static boolean check_NV_depth_buffer_float(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_depth_buffer_float")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1951, 1952, 1953 + }, + "glDepthRangedNV", "glClearDepthdNV", "glDepthBoundsdNV" + )) || reportMissing("GL", "GL_NV_depth_buffer_float"); + } + + private static boolean check_NV_draw_texture(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_draw_texture")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1954 + }, + "glDrawTextureNV" + )) || reportMissing("GL", "GL_NV_draw_texture"); + } + + private static boolean check_NV_draw_vulkan_image(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_draw_vulkan_image")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1955, 1956, 1957, 1958, 1959 + }, + "glDrawVkImageNV", "glGetVkProcAddrNV", "glWaitVkSemaphoreNV", "glSignalVkSemaphoreNV", "glSignalVkFenceNV" + )) || reportMissing("GL", "GL_NV_draw_vulkan_image"); + } + + private static boolean check_NV_explicit_multisample(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_explicit_multisample")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1960, 1961, 1962 + }, + "glGetMultisamplefvNV", "glSampleMaskIndexedNV", "glTexRenderbufferNV" + )) || reportMissing("GL", "GL_NV_explicit_multisample"); + } + + private static boolean check_NV_fence(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_fence")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1963, 1964, 1965, 1966, 1967, 1968, 1969 + }, + "glDeleteFencesNV", "glGenFencesNV", "glIsFenceNV", "glTestFenceNV", "glGetFenceivNV", "glFinishFenceNV", "glSetFenceNV" + )) || reportMissing("GL", "GL_NV_fence"); + } + + private static boolean check_NV_fragment_coverage_to_color(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_fragment_coverage_to_color")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1970 + }, + "glFragmentCoverageColorNV" + )) || reportMissing("GL", "GL_NV_fragment_coverage_to_color"); + } + + private static boolean check_NV_framebuffer_mixed_samples(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_framebuffer_mixed_samples")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1818, 1971, 1972, 1973 + }, + "glRasterSamplesEXT", "glCoverageModulationTableNV", "glGetCoverageModulationTableNV", "glCoverageModulationNV" + )) || reportMissing("GL", "GL_NV_framebuffer_mixed_samples"); + } + + private static boolean check_NV_framebuffer_multisample_coverage(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_framebuffer_multisample_coverage")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1974 + }, + "glRenderbufferStorageMultisampleCoverageNV" + )) || reportMissing("GL", "GL_NV_framebuffer_multisample_coverage"); + } + + private static boolean check_NV_gpu_multicast(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_gpu_multicast")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986 + }, + "glRenderGpuMaskNV", "glMulticastBufferSubDataNV", "glMulticastCopyBufferSubDataNV", "glMulticastCopyImageSubDataNV", + "glMulticastBlitFramebufferNV", "glMulticastFramebufferSampleLocationsfvNV", "glMulticastBarrierNV", "glMulticastWaitSyncNV", + "glMulticastGetQueryObjectivNV", "glMulticastGetQueryObjectuivNV", "glMulticastGetQueryObjecti64vNV", "glMulticastGetQueryObjectui64vNV" + )) || reportMissing("GL", "GL_NV_gpu_multicast"); + } + + private static boolean check_NV_gpu_shader5(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_gpu_shader5")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_direct_state_access") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, flag0 + 1076, flag0 + 1077, + flag0 + 1078, flag0 + 1079, flag0 + 1080, flag0 + 1081, flag0 + 1082, flag0 + 1083, flag0 + 1084, flag0 + 1085, flag0 + 1086, flag0 + 1087, + flag0 + 1088, flag0 + 1089, flag0 + 1090, flag0 + 1091 + }, + "glUniform1i64NV", "glUniform2i64NV", "glUniform3i64NV", "glUniform4i64NV", "glUniform1i64vNV", "glUniform2i64vNV", "glUniform3i64vNV", + "glUniform4i64vNV", "glUniform1ui64NV", "glUniform2ui64NV", "glUniform3ui64NV", "glUniform4ui64NV", "glUniform1ui64vNV", "glUniform2ui64vNV", + "glUniform3ui64vNV", "glUniform4ui64vNV", "glGetUniformi64vNV", "glGetUniformui64vNV", "glProgramUniform1i64NV", "glProgramUniform2i64NV", + "glProgramUniform3i64NV", "glProgramUniform4i64NV", "glProgramUniform1i64vNV", "glProgramUniform2i64vNV", "glProgramUniform3i64vNV", + "glProgramUniform4i64vNV", "glProgramUniform1ui64NV", "glProgramUniform2ui64NV", "glProgramUniform3ui64NV", "glProgramUniform4ui64NV", + "glProgramUniform1ui64vNV", "glProgramUniform2ui64vNV", "glProgramUniform3ui64vNV", "glProgramUniform4ui64vNV" + )) || reportMissing("GL", "GL_NV_gpu_shader5"); + } + + private static boolean check_NV_half_float(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_half_float")) { + return false; + } + + int flag0 = ext.contains("GL_EXT_fog_coord") ? 0 : Integer.MIN_VALUE; + int flag2 = ext.contains("GL_EXT_secondary_color") ? 0 : Integer.MIN_VALUE; + int flag4 = ext.contains("GL_EXT_vertex_weighting") ? 0 : Integer.MIN_VALUE; + int flag6 = ext.contains("GL_NV_vertex_program") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, + 2011, 2012, 2013, 2014, flag0 + 2015, flag0 + 2016, flag2 + 2017, flag2 + 2018, flag4 + 2019, flag4 + 2020, flag6 + 2021, flag6 + 2022, + flag6 + 2023, flag6 + 2024, flag6 + 2025, flag6 + 2026, flag6 + 2027, flag6 + 2028, flag6 + 2029, flag6 + 2030, flag6 + 2031, flag6 + 2032 + }, + "glVertex2hNV", "glVertex2hvNV", "glVertex3hNV", "glVertex3hvNV", "glVertex4hNV", "glVertex4hvNV", "glNormal3hNV", "glNormal3hvNV", "glColor3hNV", + "glColor3hvNV", "glColor4hNV", "glColor4hvNV", "glTexCoord1hNV", "glTexCoord1hvNV", "glTexCoord2hNV", "glTexCoord2hvNV", "glTexCoord3hNV", + "glTexCoord3hvNV", "glTexCoord4hNV", "glTexCoord4hvNV", "glMultiTexCoord1hNV", "glMultiTexCoord1hvNV", "glMultiTexCoord2hNV", + "glMultiTexCoord2hvNV", "glMultiTexCoord3hNV", "glMultiTexCoord3hvNV", "glMultiTexCoord4hNV", "glMultiTexCoord4hvNV", "glFogCoordhNV", + "glFogCoordhvNV", "glSecondaryColor3hNV", "glSecondaryColor3hvNV", "glVertexWeighthNV", "glVertexWeighthvNV", "glVertexAttrib1hNV", + "glVertexAttrib1hvNV", "glVertexAttrib2hNV", "glVertexAttrib2hvNV", "glVertexAttrib3hNV", "glVertexAttrib3hvNV", "glVertexAttrib4hNV", + "glVertexAttrib4hvNV", "glVertexAttribs1hvNV", "glVertexAttribs2hvNV", "glVertexAttribs3hvNV", "glVertexAttribs4hvNV" + )) || reportMissing("GL", "GL_NV_half_float"); + } + + private static boolean check_NV_internalformat_sample_query(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_internalformat_sample_query")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2033 + }, + "glGetInternalformatSampleivNV" + )) || reportMissing("GL", "GL_NV_internalformat_sample_query"); + } + + private static boolean check_NV_memory_attachment(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_memory_attachment")) { + return false; + } + + int flag0 = hasDSA(ext) ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 2034, 2035, 2036, 2037, flag0 + 2038, flag0 + 2039 + }, + "glGetMemoryObjectDetachedResourcesuivNV", "glResetMemoryObjectParameterNV", "glTexAttachMemoryNV", "glBufferAttachMemoryNV", + "glTextureAttachMemoryNV", "glNamedBufferAttachMemoryNV" + )) || reportMissing("GL", "GL_NV_memory_attachment"); + } + + private static boolean check_NV_memory_object_sparse(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_memory_object_sparse")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2040, 2041, 2042, 2043 + }, + "glBufferPageCommitmentMemNV", "glNamedBufferPageCommitmentMemNV", "glTexPageCommitmentMemNV", "glTexturePageCommitmentMemNV" + )) || reportMissing("GL", "GL_NV_memory_object_sparse"); + } + + private static boolean check_NV_mesh_shader(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_mesh_shader")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2044, 2045, 2046, 2047 + }, + "glDrawMeshTasksNV", "glDrawMeshTasksIndirectNV", "glMultiDrawMeshTasksIndirectNV", "glMultiDrawMeshTasksIndirectCountNV" + )) || reportMissing("GL", "GL_NV_mesh_shader"); + } + + private static boolean check_NV_path_rendering(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_path_rendering")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2057, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, + 2075, 2079, 2080, 2081, 2082, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2101, 2102, 2103, 2104 + }, + "glPathCommandsNV", "glPathCoordsNV", "glPathSubCommandsNV", "glPathSubCoordsNV", "glPathStringNV", "glPathGlyphsNV", "glPathGlyphRangeNV", + "glCopyPathNV", "glInterpolatePathsNV", "glTransformPathNV", "glPathParameterivNV", "glPathParameteriNV", "glPathParameterfvNV", + "glPathParameterfNV", "glPathDashArrayNV", "glGenPathsNV", "glDeletePathsNV", "glIsPathNV", "glPathStencilFuncNV", "glPathStencilDepthOffsetNV", + "glStencilFillPathNV", "glStencilStrokePathNV", "glStencilFillPathInstancedNV", "glStencilStrokePathInstancedNV", "glPathCoverDepthFuncNV", + "glCoverFillPathNV", "glCoverStrokePathNV", "glCoverFillPathInstancedNV", "glCoverStrokePathInstancedNV", "glGetPathParameterivNV", + "glGetPathParameterfvNV", "glGetPathCommandsNV", "glGetPathCoordsNV", "glGetPathDashArrayNV", "glGetPathMetricsNV", "glGetPathMetricRangeNV", + "glGetPathSpacingNV", "glIsPointInFillPathNV", "glIsPointInStrokePathNV", "glGetPathLengthNV", "glPointAlongPathNV" + )) || reportMissing("GL", "GL_NV_path_rendering"); + } + + private static boolean check_NV_pixel_data_range(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_pixel_data_range")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2112, 2113 + }, + "glPixelDataRangeNV", "glFlushPixelDataRangeNV" + )) || reportMissing("GL", "GL_NV_pixel_data_range"); + } + + private static boolean check_NV_point_sprite(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_point_sprite")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2114, 2115 + }, + "glPointParameteriNV", "glPointParameterivNV" + )) || reportMissing("GL", "GL_NV_point_sprite"); + } + + private static boolean check_NV_primitive_restart(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_primitive_restart")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2116, 2117 + }, + "glPrimitiveRestartNV", "glPrimitiveRestartIndexNV" + )) || reportMissing("GL", "GL_NV_primitive_restart"); + } + + private static boolean check_NV_query_resource(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_query_resource")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2118 + }, + "glQueryResourceNV" + )) || reportMissing("GL", "GL_NV_query_resource"); + } + + private static boolean check_NV_query_resource_tag(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_query_resource_tag")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2119, 2120, 2121 + }, + "glGenQueryResourceTagNV", "glDeleteQueryResourceTagNV", "glQueryResourceTagNV" + )) || reportMissing("GL", "GL_NV_query_resource_tag"); + } + + private static boolean check_NV_sample_locations(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_sample_locations")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2122, 2123, 2124 + }, + "glFramebufferSampleLocationsfvNV", "glNamedFramebufferSampleLocationsfvNV", "glResolveDepthValuesNV" + )) || reportMissing("GL", "GL_NV_sample_locations"); + } + + private static boolean check_NV_scissor_exclusive(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_scissor_exclusive")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2125, 2126 + }, + "glScissorExclusiveArrayvNV", "glScissorExclusiveNV" + )) || reportMissing("GL", "GL_NV_scissor_exclusive"); + } + + private static boolean check_NV_shader_buffer_load(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_shader_buffer_load")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 1075, 2138, 2139 + }, + "glMakeBufferResidentNV", "glMakeBufferNonResidentNV", "glIsBufferResidentNV", "glMakeNamedBufferResidentNV", "glMakeNamedBufferNonResidentNV", + "glIsNamedBufferResidentNV", "glGetBufferParameterui64vNV", "glGetNamedBufferParameterui64vNV", "glGetIntegerui64vNV", "glUniformui64NV", + "glUniformui64vNV", "glGetUniformui64vNV", "glProgramUniformui64NV", "glProgramUniformui64vNV" + )) || reportMissing("GL", "GL_NV_shader_buffer_load"); + } + + private static boolean check_NV_shading_rate_image(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_shading_rate_image")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2140, 2141, 2142, 2143, 2144, 2145, 2146 + }, + "glBindShadingRateImageNV", "glShadingRateImagePaletteNV", "glGetShadingRateImagePaletteNV", "glShadingRateImageBarrierNV", + "glShadingRateSampleOrderNV", "glShadingRateSampleOrderCustomNV", "glGetShadingRateSampleLocationivNV" + )) || reportMissing("GL", "GL_NV_shading_rate_image"); + } + + private static boolean check_NV_texture_barrier(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_texture_barrier")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2147 + }, + "glTextureBarrierNV" + )) || reportMissing("GL", "GL_NV_texture_barrier"); + } + + private static boolean check_NV_texture_multisample(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_texture_multisample")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2148, 2149, 2150, 2151, 2152, 2153 + }, + "glTexImage2DMultisampleCoverageNV", "glTexImage3DMultisampleCoverageNV", "glTextureImage2DMultisampleNV", "glTextureImage3DMultisampleNV", + "glTextureImage2DMultisampleCoverageNV", "glTextureImage3DMultisampleCoverageNV" + )) || reportMissing("GL", "GL_NV_texture_multisample"); + } + + private static boolean check_NV_timeline_semaphore(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_timeline_semaphore")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2154, 2155, 2156 + }, + "glCreateSemaphoresNV", "glSemaphoreParameterivNV", "glGetSemaphoreParameterivNV" + )) || reportMissing("GL", "GL_NV_timeline_semaphore"); + } + + private static boolean check_NV_transform_feedback(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_transform_feedback")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168 + }, + "glBeginTransformFeedbackNV", "glEndTransformFeedbackNV", "glTransformFeedbackAttribsNV", "glBindBufferRangeNV", "glBindBufferOffsetNV", + "glBindBufferBaseNV", "glTransformFeedbackVaryingsNV", "glActiveVaryingNV", "glGetVaryingLocationNV", "glGetActiveVaryingNV", + "glGetTransformFeedbackVaryingNV", "glTransformFeedbackStreamAttribsNV" + )) || reportMissing("GL", "GL_NV_transform_feedback"); + } + + private static boolean check_NV_transform_feedback2(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_transform_feedback2")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2169, 2170, 2171, 2172, 2173, 2174, 2175 + }, + "glBindTransformFeedbackNV", "glDeleteTransformFeedbacksNV", "glGenTransformFeedbacksNV", "glIsTransformFeedbackNV", "glPauseTransformFeedbackNV", + "glResumeTransformFeedbackNV", "glDrawTransformFeedbackNV" + )) || reportMissing("GL", "GL_NV_transform_feedback2"); + } + + private static boolean check_NV_vertex_array_range(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_vertex_array_range")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2176, 2177 + }, + "glVertexArrayRangeNV", "glFlushVertexArrayRangeNV" + )) || reportMissing("GL", "GL_NV_vertex_array_range"); + } + + private static boolean check_NV_vertex_attrib_integer_64bit(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_vertex_attrib_integer_64bit")) { + return false; + } + + int flag0 = ext.contains("GL_NV_vertex_buffer_unified_memory") ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, flag0 + 2196 + }, + "glVertexAttribL1i64NV", "glVertexAttribL2i64NV", "glVertexAttribL3i64NV", "glVertexAttribL4i64NV", "glVertexAttribL1i64vNV", + "glVertexAttribL2i64vNV", "glVertexAttribL3i64vNV", "glVertexAttribL4i64vNV", "glVertexAttribL1ui64NV", "glVertexAttribL2ui64NV", + "glVertexAttribL3ui64NV", "glVertexAttribL4ui64NV", "glVertexAttribL1ui64vNV", "glVertexAttribL2ui64vNV", "glVertexAttribL3ui64vNV", + "glVertexAttribL4ui64vNV", "glGetVertexAttribLi64vNV", "glGetVertexAttribLui64vNV", "glVertexAttribLFormatNV" + )) || reportMissing("GL", "GL_NV_vertex_attrib_integer_64bit"); + } + + private static boolean check_NV_vertex_buffer_unified_memory(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_vertex_buffer_unified_memory")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208 + }, + "glBufferAddressRangeNV", "glVertexFormatNV", "glNormalFormatNV", "glColorFormatNV", "glIndexFormatNV", "glTexCoordFormatNV", "glEdgeFlagFormatNV", + "glSecondaryColorFormatNV", "glFogCoordFormatNV", "glVertexAttribFormatNV", "glVertexAttribIFormatNV", "glGetIntegerui64i_vNV" + )) || reportMissing("GL", "GL_NV_vertex_buffer_unified_memory"); + } + + private static boolean check_NV_viewport_swizzle(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NV_viewport_swizzle")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2209 + }, + "glViewportSwizzleNV" + )) || reportMissing("GL", "GL_NV_viewport_swizzle"); + } + + private static boolean check_NVX_conditional_render(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NVX_conditional_render")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2210, 2211 + }, + "glBeginConditionalRenderNVX", "glEndConditionalRenderNVX" + )) || reportMissing("GL", "GL_NVX_conditional_render"); + } + + private static boolean check_NVX_gpu_multicast2(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NVX_gpu_multicast2")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2212, 2213, 2214, 2215, 2216, 2217 + }, + "glAsyncCopyImageSubDataNVX", "glAsyncCopyBufferSubDataNVX", "glUploadGpuMaskNVX", "glMulticastViewportArrayvNVX", "glMulticastScissorArrayvNVX", + "glMulticastViewportPositionWScaleNVX" + )) || reportMissing("GL", "GL_NVX_gpu_multicast2"); + } + + private static boolean check_NVX_progress_fence(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_NVX_progress_fence")) { + return false; + } + + return (checkFunctions(provider, caps, new int[] { + 2218, 2219, 2220, 2221 + }, + "glCreateProgressFenceNVX", "glSignalSemaphoreui64NVX", "glWaitSemaphoreui64NVX", "glClientWaitSemaphoreui64NVX" + )) || reportMissing("GL", "GL_NVX_progress_fence"); + } + + private static boolean check_OVR_multiview(FunctionProvider provider, PointerBuffer caps, Set ext) { + if (!ext.contains("GL_OVR_multiview")) { + return false; + } + + int flag0 = hasDSA(ext) ? 0 : Integer.MIN_VALUE; + + return (checkFunctions(provider, caps, new int[] { + 2222, flag0 + 2223 + }, + "glFramebufferTextureMultiviewOVR", "glNamedFramebufferTextureMultiviewOVR" + )) || reportMissing("GL", "GL_OVR_multiview"); + } + + private static boolean hasDSA(Set ext) { + return ext.contains("GL45") || ext.contains("GL_ARB_direct_state_access") || ext.contains("GL_EXT_direct_state_access"); + } + + private static boolean ARB_framebuffer_object(Set ext) { return ext.contains("OpenGL30") || ext.contains("GL_ARB_framebuffer_object"); } + private static boolean ARB_map_buffer_range(Set ext) { return ext.contains("OpenGL30") || ext.contains("GL_ARB_map_buffer_range"); } + private static boolean ARB_vertex_array_object(Set ext) { return ext.contains("OpenGL30") || ext.contains("GL_ARB_vertex_array_object"); } + private static boolean ARB_copy_buffer(Set ext) { return ext.contains("OpenGL31") || ext.contains("GL_ARB_copy_buffer"); } + private static boolean ARB_texture_buffer_object(Set ext) { return ext.contains("OpenGL31") || ext.contains("GL_ARB_texture_buffer_object"); } + private static boolean ARB_uniform_buffer_object(Set ext) { return ext.contains("OpenGL31") || ext.contains("GL_ARB_uniform_buffer_object"); } + private static boolean ARB_instanced_arrays(Set ext) { return ext.contains("OpenGL33") || ext.contains("GL_ARB_instanced_arrays"); } + private static boolean ARB_sampler_objects(Set ext) { return ext.contains("OpenGL33") || ext.contains("GL_ARB_sampler_objects"); } + private static boolean ARB_transform_feedback2(Set ext) { return ext.contains("OpenGL40") || ext.contains("GL_ARB_transform_feedback2"); } + private static boolean ARB_vertex_attrib_64bit(Set ext) { return ext.contains("OpenGL41") || ext.contains("GL_ARB_vertex_attrib_64bit"); } + private static boolean ARB_separate_shader_objects(Set ext) { return ext.contains("OpenGL41") || ext.contains("GL_ARB_separate_shader_objects"); } + private static boolean ARB_texture_storage(Set ext) { return ext.contains("OpenGL42") || ext.contains("GL_ARB_texture_storage"); } + private static boolean ARB_texture_storage_multisample(Set ext) { return ext.contains("OpenGL43") || ext.contains("GL_ARB_texture_storage_multisample"); } + private static boolean ARB_vertex_attrib_binding(Set ext) { return ext.contains("OpenGL43") || ext.contains("GL_ARB_vertex_attrib_binding"); } + private static boolean ARB_invalidate_subdata(Set ext) { return ext.contains("OpenGL43") || ext.contains("GL_ARB_invalidate_subdata"); } + private static boolean ARB_texture_buffer_range(Set ext) { return ext.contains("OpenGL43") || ext.contains("GL_ARB_texture_buffer_range"); } + private static boolean ARB_clear_buffer_object(Set ext) { return ext.contains("OpenGL43") || ext.contains("GL_ARB_clear_buffer_object"); } + private static boolean ARB_framebuffer_no_attachments(Set ext) { return ext.contains("OpenGL43") || ext.contains("GL_ARB_framebuffer_no_attachments"); } + private static boolean ARB_buffer_storage(Set ext) { return ext.contains("OpenGL44") || ext.contains("GL_ARB_buffer_storage"); } + private static boolean ARB_clear_texture(Set ext) { return ext.contains("OpenGL44") || ext.contains("GL_ARB_clear_texture"); } + private static boolean ARB_multi_bind(Set ext) { return ext.contains("OpenGL44") || ext.contains("GL_ARB_multi_bind"); } + private static boolean ARB_query_buffer_object(Set ext) { return ext.contains("OpenGL44") || ext.contains("GL_ARB_query_buffer_object"); } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLChecks.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLChecks.java new file mode 100644 index 000000000..91cac0f6b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLChecks.java @@ -0,0 +1,109 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.opengl; + +import static org.lwjgl.opengl.GL41.*; +import static org.lwjgl.opengl.NVGPUShader5.*; +import static org.lwjgl.system.APIUtil.*; + +final class GLChecks { + + private GLChecks() { + } + + /** + * Returns the number of bytes required to store the specified OpenGL type. + * + * @param type the OpenGL type to translate + * + * @return the number of bytes + */ + static int typeToBytes(int type) { + switch (type) { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + return 1; + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_2_BYTES: + case GL_HALF_FLOAT: + return 2; + case GL_3_BYTES: + return 3; + case GL_INT: + case GL_UNSIGNED_INT: + case GL_FLOAT: + case GL_4_BYTES: + case GL_FIXED: + return 4; + case GL_DOUBLE: + case GL_INT64_NV: + case GL_UNSIGNED_INT64_NV: + return 8; + default: + throw new IllegalArgumentException(apiUnknownToken("Unsupported OpenGL type", type)); + } + } + + /** + * Returns the power-of-two of the number of bytes required to store the specified OpenGL type. + * + * @param type the OpenGL type to translate + * + * @return the number of bytes PoT value + */ + static int typeToByteShift(int type) { + switch (type) { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + return 0; + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_2_BYTES: + case GL_HALF_FLOAT: + return 1; + case GL_INT: + case GL_UNSIGNED_INT: + case GL_FLOAT: + case GL_4_BYTES: + case GL_FIXED: + return 2; + case GL_DOUBLE: + case GL_INT64_NV: + case GL_UNSIGNED_INT64_NV: + return 3; + default: + throw new IllegalArgumentException(apiUnknownToken("Unsupported OpenGL type", type)); + } + } + + /** + * Queries the specified parameter of the specified texture object level. If direct-state-access functionality is not available, the texture must be + * currently bound to the specified texture target. + * + * @param texture the texture object + * @param target the texture target + * @param level the texture level + * @param pname the parameter to query + * + * @return the parameter value + */ + static int getTexLevelParameteri(int texture, int target, int level, int pname) { + GLCapabilities caps = GL.getCapabilities(); + + if (caps.OpenGL45) { + return GL45.glGetTextureLevelParameteri(texture, level, pname); + } + if (caps.GL_ARB_direct_state_access) { + return ARBDirectStateAccess.glGetTextureLevelParameteri(texture, level, pname); + } + if (caps.GL_EXT_direct_state_access) { + return EXTDirectStateAccess.glGetTextureLevelParameteriEXT(texture, target, level, pname); + } + + return glGetTexLevelParameteri(target, level, pname); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLContext.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLContext.java new file mode 100644 index 000000000..abcb5615a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLContext.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +public class GLContext { + + private static ThreadLocal contextCapabilities = new ThreadLocal<>(); + + public static GLContext createFromCurrent() { + return new GLContext(); + } + public static void initCapabilities() { + if(contextCapabilities.get() == null) { + System.out.println("LWJGL: GL caps init"); + contextCapabilities.set(new ContextCapabilities()); + } + } + public static ContextCapabilities getCapabilities() { + return contextCapabilities.get(); + } +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageAMDCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageAMDCallback.java new file mode 100644 index 000000000..59c5cc020 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageAMDCallback.java @@ -0,0 +1,94 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be passed to the {@link AMDDebugOutput#glDebugMessageCallbackAMD DebugMessageCallbackAMD} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLuint id,
    + *     GLenum category,
    + *     GLenum severity,
    + *     GLsizei length,
    + *     GLchar const *message,
    + *     void *userParam
    + * )
    + */ +public abstract class GLDebugMessageAMDCallback extends Callback implements GLDebugMessageAMDCallbackI { + + /** + * Creates a {@code GLDebugMessageAMDCallback} instance from the specified function pointer. + * + * @return the new {@code GLDebugMessageAMDCallback} + */ + public static GLDebugMessageAMDCallback create(long functionPointer) { + GLDebugMessageAMDCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLDebugMessageAMDCallback + ? (GLDebugMessageAMDCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLDebugMessageAMDCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLDebugMessageAMDCallback} instance that delegates to the specified {@code GLDebugMessageAMDCallbackI} instance. */ + public static GLDebugMessageAMDCallback create(GLDebugMessageAMDCallbackI instance) { + return instance instanceof GLDebugMessageAMDCallback + ? (GLDebugMessageAMDCallback)instance + : new Container(instance.address(), instance); + } + + protected GLDebugMessageAMDCallback() { + super(CIF); + } + + GLDebugMessageAMDCallback(long functionPointer) { + super(functionPointer); + } + + /** + * Converts the specified {@link GLDebugMessageAMDCallback} arguments to a String. + * + *

    This method may only be used inside a GLDebugMessageAMDCallback invocation.

    + * + * @param length the GLDebugMessageAMDCallback {@code length} argument + * @param message the GLDebugMessageAMDCallback {@code message} argument + * + * @return the message as a String + */ + public static String getMessage(int length, long message) { + return memUTF8(memByteBuffer(message, length)); + } + + private static final class Container extends GLDebugMessageAMDCallback { + + private final GLDebugMessageAMDCallbackI delegate; + + Container(long functionPointer, GLDebugMessageAMDCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(int id, int category, int severity, int length, long message, long userParam) { + delegate.invoke(id, category, severity, length, message, userParam); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageAMDCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageAMDCallbackI.java new file mode 100644 index 000000000..8319823af --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageAMDCallbackI.java @@ -0,0 +1,67 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link AMDDebugOutput#glDebugMessageCallbackAMD DebugMessageCallbackAMD} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLuint id,
    + *     GLenum category,
    + *     GLenum severity,
    + *     GLsizei length,
    + *     GLchar const *message,
    + *     void *userParam
    + * )
    + */ +@FunctionalInterface +@NativeType("GLDEBUGPROCAMD") +public interface GLDebugMessageAMDCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + apiStdcall(), + ffi_type_void, + ffi_type_uint32, ffi_type_uint32, ffi_type_uint32, ffi_type_sint32, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetInt(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 3 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 4 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 5 * POINTER_SIZE)) + ); + } + + /** + * Will be called when a debug message is generated. + * + * @param id the message ID + * @param category the message category + * @param severity the message severity + * @param length the message length, excluding the null-terminator + * @param message a pointer to the message string representation + * @param userParam the user-specified value that was passed when calling {@link AMDDebugOutput#glDebugMessageCallbackAMD DebugMessageCallbackAMD} + */ + void invoke(@NativeType("GLuint") int id, @NativeType("GLenum") int category, @NativeType("GLenum") int severity, @NativeType("GLsizei") int length, @NativeType("GLchar const *") long message, @NativeType("void *") long userParam); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageARBCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageARBCallback.java new file mode 100644 index 000000000..13e28546b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageARBCallback.java @@ -0,0 +1,95 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be passed to the {@link ARBDebugOutput#glDebugMessageCallbackARB DebugMessageCallbackARB} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLenum source,
    + *     GLenum type,
    + *     GLuint id,
    + *     GLenum severity,
    + *     GLsizei length,
    + *     GLchar const *message,
    + *     void const *userParam
    + * )
    + */ +public abstract class GLDebugMessageARBCallback extends Callback implements GLDebugMessageARBCallbackI { + + /** + * Creates a {@code GLDebugMessageARBCallback} instance from the specified function pointer. + * + * @return the new {@code GLDebugMessageARBCallback} + */ + public static GLDebugMessageARBCallback create(long functionPointer) { + GLDebugMessageARBCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLDebugMessageARBCallback + ? (GLDebugMessageARBCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLDebugMessageARBCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLDebugMessageARBCallback} instance that delegates to the specified {@code GLDebugMessageARBCallbackI} instance. */ + public static GLDebugMessageARBCallback create(GLDebugMessageARBCallbackI instance) { + return instance instanceof GLDebugMessageARBCallback + ? (GLDebugMessageARBCallback)instance + : new Container(instance.address(), instance); + } + + protected GLDebugMessageARBCallback() { + super(CIF); + } + + GLDebugMessageARBCallback(long functionPointer) { + super(functionPointer); + } + + /** + * Converts the specified {@link GLDebugMessageARBCallback} arguments to a String. + * + *

    This method may only be used inside a GLDebugMessageARBCallback invocation.

    + * + * @param length the GLDebugMessageARBCallback {@code length} argument + * @param message the GLDebugMessageARBCallback {@code message} argument + * + * @return the message as a String + */ + public static String getMessage(int length, long message) { + return memUTF8(memByteBuffer(message, length)); + } + + private static final class Container extends GLDebugMessageARBCallback { + + private final GLDebugMessageARBCallbackI delegate; + + Container(long functionPointer, GLDebugMessageARBCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(int source, int type, int id, int severity, int length, long message, long userParam) { + delegate.invoke(source, type, id, severity, length, message, userParam); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageARBCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageARBCallbackI.java new file mode 100644 index 000000000..b19e2f776 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageARBCallbackI.java @@ -0,0 +1,70 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link ARBDebugOutput#glDebugMessageCallbackARB DebugMessageCallbackARB} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLenum source,
    + *     GLenum type,
    + *     GLuint id,
    + *     GLenum severity,
    + *     GLsizei length,
    + *     GLchar const *message,
    + *     void const *userParam
    + * )
    + */ +@FunctionalInterface +@NativeType("GLDEBUGPROCARB") +public interface GLDebugMessageARBCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + apiStdcall(), + ffi_type_void, + ffi_type_uint32, ffi_type_uint32, ffi_type_uint32, ffi_type_uint32, ffi_type_sint32, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetInt(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 3 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 4 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 5 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 6 * POINTER_SIZE)) + ); + } + + /** + * Will be called when a debug message is generated. + * + * @param source the message source + * @param type the message type + * @param id the message ID + * @param severity the message severity + * @param length the message length, excluding the null-terminator + * @param message a pointer to the message string representation + * @param userParam the user-specified value that was passed when calling {@link ARBDebugOutput#glDebugMessageCallbackARB DebugMessageCallbackARB} + */ + void invoke(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLuint") int id, @NativeType("GLenum") int severity, @NativeType("GLsizei") int length, @NativeType("GLchar const *") long message, @NativeType("void const *") long userParam); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageCallback.java new file mode 100644 index 000000000..79eb6aff7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageCallback.java @@ -0,0 +1,95 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be passed to the {@link GL43#glDebugMessageCallback} and {@link KHRDebug#glDebugMessageCallback} methods. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLenum source,
    + *     GLenum type,
    + *     GLuint id,
    + *     GLenum severity,
    + *     GLsizei length,
    + *     GLchar const *message,
    + *     void const *userParam
    + * )
    + */ +public abstract class GLDebugMessageCallback extends Callback implements GLDebugMessageCallbackI { + + /** + * Creates a {@code GLDebugMessageCallback} instance from the specified function pointer. + * + * @return the new {@code GLDebugMessageCallback} + */ + public static GLDebugMessageCallback create(long functionPointer) { + GLDebugMessageCallbackI instance = Callback.get(functionPointer); + return instance instanceof GLDebugMessageCallback + ? (GLDebugMessageCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static GLDebugMessageCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code GLDebugMessageCallback} instance that delegates to the specified {@code GLDebugMessageCallbackI} instance. */ + public static GLDebugMessageCallback create(GLDebugMessageCallbackI instance) { + return instance instanceof GLDebugMessageCallback + ? (GLDebugMessageCallback)instance + : new Container(instance.address(), instance); + } + + protected GLDebugMessageCallback() { + super(CIF); + } + + GLDebugMessageCallback(long functionPointer) { + super(functionPointer); + } + + /** + * Converts the specified {@link GLDebugMessageCallback} arguments to a String. + * + *

    This method may only be used inside a GLDebugMessageCallback invocation.

    + * + * @param length the GLDebugMessageCallback {@code length} argument + * @param message the GLDebugMessageCallback {@code message} argument + * + * @return the message as a String + */ + public static String getMessage(int length, long message) { + return memUTF8(memByteBuffer(message, length)); + } + + private static final class Container extends GLDebugMessageCallback { + + private final GLDebugMessageCallbackI delegate; + + Container(long functionPointer, GLDebugMessageCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(int source, int type, int id, int severity, int length, long message, long userParam) { + delegate.invoke(source, type, id, severity, length, message, userParam); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageCallbackI.java new file mode 100644 index 000000000..c62a759f5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLDebugMessageCallbackI.java @@ -0,0 +1,70 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link GL43#glDebugMessageCallback} and {@link KHRDebug#glDebugMessageCallback} methods. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     GLenum source,
    + *     GLenum type,
    + *     GLuint id,
    + *     GLenum severity,
    + *     GLsizei length,
    + *     GLchar const *message,
    + *     void const *userParam
    + * )
    + */ +@FunctionalInterface +@NativeType("GLDEBUGPROC") +public interface GLDebugMessageCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + apiStdcall(), + ffi_type_void, + ffi_type_uint32, ffi_type_uint32, ffi_type_uint32, ffi_type_uint32, ffi_type_sint32, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetInt(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 3 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 4 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 5 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 6 * POINTER_SIZE)) + ); + } + + /** + * Will be called when a debug message is generated. + * + * @param source the message source + * @param type the message type + * @param id the message ID + * @param severity the message severity + * @param length the message length, excluding the null-terminator + * @param message a pointer to the message string representation + * @param userParam the user-specified value that was passed when calling {@link GL43#glDebugMessageCallback} or {@link KHRDebug#glDebugMessageCallback} + */ + void invoke(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLuint") int id, @NativeType("GLenum") int severity, @NativeType("GLsizei") int length, @NativeType("GLchar const *") long message, @NativeType("void const *") long userParam); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLSync.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLSync.java new file mode 100644 index 000000000..f9166b09e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLSync.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * This class is a wrapper around a GLsync pointer. + * + * @author spasi + */ +public final class GLSync extends PointerWrapperAbstract { + + GLSync(final long sync) { + super(sync); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLUtil.java new file mode 100644 index 000000000..cf9f07c7c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLUtil.java @@ -0,0 +1,277 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import javax.annotation.*; +import java.io.*; + +import static org.lwjgl.opengl.AMDDebugOutput.*; +import static org.lwjgl.opengl.ARBDebugOutput.*; +import static org.lwjgl.opengl.GL43C.*; +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** OpenGL utilities. */ +public final class GLUtil { + + private GLUtil() { + } + + /** + * Detects the best debug output functionality to use and creates a callback that prints information to {@link APIUtil#DEBUG_STREAM}. The callback + * function is returned as a {@link Callback}, that should be {@link Callback#free freed} when no longer needed. + */ + @Nullable + public static Callback setupDebugMessageCallback() { + return setupDebugMessageCallback(APIUtil.DEBUG_STREAM); + } + + /** + * Detects the best debug output functionality to use and creates a callback that prints information to the specified {@link PrintStream}. The callback + * function is returned as a {@link Callback}, that should be {@link Callback#free freed} when no longer needed. + * + * @param stream the output {@link PrintStream} + */ + @Nullable + public static Callback setupDebugMessageCallback(PrintStream stream) { + GLCapabilities caps = GL.getCapabilities(); + + if (caps.OpenGL43) { + apiLog("[GL] Using OpenGL 4.3 for error logging."); + GLDebugMessageCallback proc = GLDebugMessageCallback.create((source, type, id, severity, length, message, userParam) -> { + StringBuilder sb = new StringBuilder(300); + + sb.append("[LWJGL] OpenGL debug message\n"); + printDetail(sb, "ID", "0x" + Integer.toHexString(id).toUpperCase()); + printDetail(sb, "Source", getDebugSource(source)); + printDetail(sb, "Type", getDebugType(type)); + printDetail(sb, "Severity", getDebugSeverity(severity)); + printDetail(sb, "Message", GLDebugMessageCallback.getMessage(length, message)); + + stream.print(sb); + }); + glDebugMessageCallback(proc, NULL); + if ((glGetInteger(GL_CONTEXT_FLAGS) & GL_CONTEXT_FLAG_DEBUG_BIT) == 0) { + apiLog("[GL] Warning: A non-debug context may not produce any debug output."); + glEnable(GL_DEBUG_OUTPUT); + } + return proc; + } + + if (caps.GL_KHR_debug) { + apiLog("[GL] Using KHR_debug for error logging."); + GLDebugMessageCallback proc = GLDebugMessageCallback.create((source, type, id, severity, length, message, userParam) -> { + StringBuilder sb = new StringBuilder(300); + + sb.append("[LWJGL] OpenGL debug message\n"); + printDetail(sb, "ID", "0x" + Integer.toHexString(id).toUpperCase()); + printDetail(sb, "Source", getDebugSource(source)); + printDetail(sb, "Type", getDebugType(type)); + printDetail(sb, "Severity", getDebugSeverity(severity)); + printDetail(sb, "Message", GLDebugMessageCallback.getMessage(length, message)); + + stream.print(sb); + }); + KHRDebug.glDebugMessageCallback(proc, NULL); + if (caps.OpenGL30 && (glGetInteger(GL_CONTEXT_FLAGS) & GL_CONTEXT_FLAG_DEBUG_BIT) == 0) { + apiLog("[GL] Warning: A non-debug context may not produce any debug output."); + glEnable(GL_DEBUG_OUTPUT); + } + return proc; + } + + if (caps.GL_ARB_debug_output) { + apiLog("[GL] Using ARB_debug_output for error logging."); + GLDebugMessageARBCallback proc = GLDebugMessageARBCallback.create((source, type, id, severity, length, message, userParam) -> { + StringBuilder sb = new StringBuilder(300); + + sb.append("[LWJGL] ARB_debug_output message\n"); + printDetail(sb, "ID", "0x" + Integer.toHexString(id).toUpperCase()); + printDetail(sb, "Source", getSourceARB(source)); + printDetail(sb, "Type", getTypeARB(type)); + printDetail(sb, "Severity", getSeverityARB(severity)); + printDetail(sb, "Message", GLDebugMessageARBCallback.getMessage(length, message)); + + stream.print(sb); + }); + glDebugMessageCallbackARB(proc, NULL); + return proc; + } + + if (caps.GL_AMD_debug_output) { + apiLog("[GL] Using AMD_debug_output for error logging."); + GLDebugMessageAMDCallback proc = GLDebugMessageAMDCallback.create((id, category, severity, length, message, userParam) -> { + StringBuilder sb = new StringBuilder(300); + + sb.append("[LWJGL] AMD_debug_output message\n"); + printDetail(sb, "ID", "0x" + Integer.toHexString(id).toUpperCase()); + printDetail(sb, "Category", getCategoryAMD(category)); + printDetail(sb, "Severity", getSeverityAMD(severity)); + printDetail(sb, "Message", GLDebugMessageAMDCallback.getMessage(length, message)); + + stream.print(sb); + }); + glDebugMessageCallbackAMD(proc, NULL); + return proc; + } + + apiLog("[GL] No debug output implementation is available."); + return null; + } + + private static void printDetail(StringBuilder sb, String type, String message) { + sb + .append("\t") + .append(type) + .append(": ") + .append(message) + .append("\n"); + } + + private static String getDebugSource(int source) { + switch (source) { + case GL_DEBUG_SOURCE_API: + return "API"; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: + return "WINDOW SYSTEM"; + case GL_DEBUG_SOURCE_SHADER_COMPILER: + return "SHADER COMPILER"; + case GL_DEBUG_SOURCE_THIRD_PARTY: + return "THIRD PARTY"; + case GL_DEBUG_SOURCE_APPLICATION: + return "APPLICATION"; + case GL_DEBUG_SOURCE_OTHER: + return "OTHER"; + default: + return apiUnknownToken(source); + } + } + + private static String getDebugType(int type) { + switch (type) { + case GL_DEBUG_TYPE_ERROR: + return "ERROR"; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: + return "DEPRECATED BEHAVIOR"; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: + return "UNDEFINED BEHAVIOR"; + case GL_DEBUG_TYPE_PORTABILITY: + return "PORTABILITY"; + case GL_DEBUG_TYPE_PERFORMANCE: + return "PERFORMANCE"; + case GL_DEBUG_TYPE_OTHER: + return "OTHER"; + case GL_DEBUG_TYPE_MARKER: + return "MARKER"; + default: + return apiUnknownToken(type); + } + } + + private static String getDebugSeverity(int severity) { + switch (severity) { + case GL_DEBUG_SEVERITY_HIGH: + return "HIGH"; + case GL_DEBUG_SEVERITY_MEDIUM: + return "MEDIUM"; + case GL_DEBUG_SEVERITY_LOW: + return "LOW"; + case GL_DEBUG_SEVERITY_NOTIFICATION: + return "NOTIFICATION"; + default: + return apiUnknownToken(severity); + } + } + + private static String getSourceARB(int source) { + switch (source) { + case GL_DEBUG_SOURCE_API_ARB: + return "API"; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB: + return "WINDOW SYSTEM"; + case GL_DEBUG_SOURCE_SHADER_COMPILER_ARB: + return "SHADER COMPILER"; + case GL_DEBUG_SOURCE_THIRD_PARTY_ARB: + return "THIRD PARTY"; + case GL_DEBUG_SOURCE_APPLICATION_ARB: + return "APPLICATION"; + case GL_DEBUG_SOURCE_OTHER_ARB: + return "OTHER"; + default: + return apiUnknownToken(source); + } + } + + private static String getTypeARB(int type) { + switch (type) { + case GL_DEBUG_TYPE_ERROR_ARB: + return "ERROR"; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB: + return "DEPRECATED BEHAVIOR"; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB: + return "UNDEFINED BEHAVIOR"; + case GL_DEBUG_TYPE_PORTABILITY_ARB: + return "PORTABILITY"; + case GL_DEBUG_TYPE_PERFORMANCE_ARB: + return "PERFORMANCE"; + case GL_DEBUG_TYPE_OTHER_ARB: + return "OTHER"; + default: + return apiUnknownToken(type); + } + } + + private static String getSeverityARB(int severity) { + switch (severity) { + case GL_DEBUG_SEVERITY_HIGH_ARB: + return "HIGH"; + case GL_DEBUG_SEVERITY_MEDIUM_ARB: + return "MEDIUM"; + case GL_DEBUG_SEVERITY_LOW_ARB: + return "LOW"; + default: + return apiUnknownToken(severity); + } + } + + private static String getCategoryAMD(int category) { + switch (category) { + case GL_DEBUG_CATEGORY_API_ERROR_AMD: + return "API ERROR"; + case GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD: + return "WINDOW SYSTEM"; + case GL_DEBUG_CATEGORY_DEPRECATION_AMD: + return "DEPRECATION"; + case GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD: + return "UNDEFINED BEHAVIOR"; + case GL_DEBUG_CATEGORY_PERFORMANCE_AMD: + return "PERFORMANCE"; + case GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD: + return "SHADER COMPILER"; + case GL_DEBUG_CATEGORY_APPLICATION_AMD: + return "APPLICATION"; + case GL_DEBUG_CATEGORY_OTHER_AMD: + return "OTHER"; + default: + return apiUnknownToken(category); + } + } + + private static String getSeverityAMD(int severity) { + switch (severity) { + case GL_DEBUG_SEVERITY_HIGH_AMD: + return "HIGH"; + case GL_DEBUG_SEVERITY_MEDIUM_AMD: + return "MEDIUM"; + case GL_DEBUG_SEVERITY_LOW_AMD: + return "LOW"; + default: + return apiUnknownToken(severity); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX.java new file mode 100644 index 000000000..26761e9e2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX.java @@ -0,0 +1,483 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +import org.lwjgl.system.linux.*; + +/** Native bindings to GLX. */ +public class GLX { + + /** Contains the function pointers loaded from {@code GL.getFunctionProvider()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + QueryExtension = apiGetFunctionAddress(GL.getFunctionProvider(), "glXQueryExtension"), + QueryVersion = apiGetFunctionAddress(GL.getFunctionProvider(), "glXQueryVersion"), + GetConfig = apiGetFunctionAddress(GL.getFunctionProvider(), "glXGetConfig"), + ChooseVisual = apiGetFunctionAddress(GL.getFunctionProvider(), "glXChooseVisual"), + CreateContext = apiGetFunctionAddress(GL.getFunctionProvider(), "glXCreateContext"), + MakeCurrent = apiGetFunctionAddress(GL.getFunctionProvider(), "glXMakeCurrent"), + CopyContext = apiGetFunctionAddress(GL.getFunctionProvider(), "glXCopyContext"), + IsDirect = apiGetFunctionAddress(GL.getFunctionProvider(), "glXIsDirect"), + DestroyContext = apiGetFunctionAddress(GL.getFunctionProvider(), "glXDestroyContext"), + GetCurrentContext = apiGetFunctionAddress(GL.getFunctionProvider(), "glXGetCurrentContext"), + GetCurrentDrawable = apiGetFunctionAddress(GL.getFunctionProvider(), "glXGetCurrentDrawable"), + WaitGL = apiGetFunctionAddress(GL.getFunctionProvider(), "glXWaitGL"), + WaitX = apiGetFunctionAddress(GL.getFunctionProvider(), "glXWaitX"), + SwapBuffers = apiGetFunctionAddress(GL.getFunctionProvider(), "glXSwapBuffers"), + UseXFont = apiGetFunctionAddress(GL.getFunctionProvider(), "glXUseXFont"), + CreateGLXPixmap = apiGetFunctionAddress(GL.getFunctionProvider(), "glXCreateGLXPixmap"), + DestroyGLXPixmap = apiGetFunctionAddress(GL.getFunctionProvider(), "glXDestroyGLXPixmap"); + + } + + /** Errors. */ + public static final int + GLXBadContext = 0, + GLXBadContextState = 1, + GLXBadDrawable = 2, + GLXBadPixmap = 3, + GLXBadContextTag = 4, + GLXBadCurrentWindow = 5, + GLXBadRenderRequest = 6, + GLXBadLargeRequest = 7, + GLXUnsupportedPrivateRequest = 8, + GLXBadFBConfig = 9, + GLXBadPbuffer = 10, + GLXBadCurrentDrawable = 11, + GLXBadWindow = 12; + + /** Names for attributes to {@link #glXGetConfig GetConfig}. */ + public static final int + GLX_USE_GL = 1, + GLX_BUFFER_SIZE = 2, + GLX_LEVEL = 3, + GLX_RGBA = 4, + GLX_DOUBLEBUFFER = 5, + GLX_STEREO = 6, + GLX_AUX_BUFFERS = 7, + GLX_RED_SIZE = 8, + GLX_GREEN_SIZE = 9, + GLX_BLUE_SIZE = 10, + GLX_ALPHA_SIZE = 11, + GLX_DEPTH_SIZE = 12, + GLX_STENCIL_SIZE = 13, + GLX_ACCUM_RED_SIZE = 14, + GLX_ACCUM_GREEN_SIZE = 15, + GLX_ACCUM_BLUE_SIZE = 16, + GLX_ACCUM_ALPHA_SIZE = 17; + + /** Error return values from {@link #glXGetConfig GetConfig}. Success is indicated by a value of 0. */ + public static final int + GLX_BAD_SCREEN = 1, + GLX_BAD_ATTRIBUTE = 2, + GLX_NO_EXTENSION = 3, + GLX_BAD_VISUAL = 4, + GLX_BAD_CONTEXT = 5, + GLX_BAD_VALUE = 6, + GLX_BAD_ENUM = 7; + + protected GLX() { + throw new UnsupportedOperationException(); + } + + // --- [ glXQueryExtension ] --- + + /** Unsafe version of: {@link #glXQueryExtension QueryExtension} */ + public static int nglXQueryExtension(long display, long error_base, long event_base) { + long __functionAddress = Functions.QueryExtension; + if (CHECKS) { + check(display); + } + return callPPPI(display, error_base, event_base, __functionAddress); + } + + /** + * Ascertains if the GLX extension is defined for an X server. + * + * @param display the connection to the X server + * @param error_base returns the value of the first error code + * @param event_base returns the value of the first event code + */ + @NativeType("Bool") + public static boolean glXQueryExtension(@NativeType("Display *") long display, @NativeType("int *") IntBuffer error_base, @NativeType("int *") IntBuffer event_base) { + if (CHECKS) { + check(error_base, 1); + check(event_base, 1); + } + return nglXQueryExtension(display, memAddress(error_base), memAddress(event_base)) != 0; + } + + // --- [ glXQueryVersion ] --- + + /** Unsafe version of: {@link #glXQueryVersion QueryVersion} */ + public static int nglXQueryVersion(long display, long major, long minor) { + long __functionAddress = Functions.QueryVersion; + if (CHECKS) { + check(display); + } + return callPPPI(display, major, minor, __functionAddress); + } + + /** + * Queries the GLX version supported. + * + * @param display the connection to the X server + * @param major returns the major version + * @param minor returns the minor version + */ + @NativeType("Bool") + public static boolean glXQueryVersion(@NativeType("Display *") long display, @NativeType("int *") IntBuffer major, @NativeType("int *") IntBuffer minor) { + if (CHECKS) { + check(major, 1); + check(minor, 1); + } + return nglXQueryVersion(display, memAddress(major), memAddress(minor)) != 0; + } + + // --- [ glXGetConfig ] --- + + /** Unsafe version of: {@link #glXGetConfig GetConfig} */ + public static int nglXGetConfig(long display, long visual, int attribute, long value) { + long __functionAddress = Functions.GetConfig; + if (CHECKS) { + check(display); + XVisualInfo.validate(visual); + } + return callPPPI(display, visual, attribute, value, __functionAddress); + } + + /** + * Returns a description of an OpenGL attribute exported by a Visual. + * + * @param display the connection to the X server + * @param visual a pointer to an {@link XVisualInfo} structure + * @param attribute the attribute to query + * @param value returns the attribute value + */ + public static int glXGetConfig(@NativeType("Display *") long display, @NativeType("XVisualInfo *") XVisualInfo visual, int attribute, @NativeType("int *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + return nglXGetConfig(display, visual.address(), attribute, memAddress(value)); + } + + // --- [ glXChooseVisual ] --- + + /** Unsafe version of: {@link #glXChooseVisual ChooseVisual} */ + public static long nglXChooseVisual(long display, int screen, long attrib_list) { + long __functionAddress = Functions.ChooseVisual; + if (CHECKS) { + check(display); + } + return callPPP(display, screen, attrib_list, __functionAddress); + } + + /** + * Finds a visual that matches the client’s specified attributes. + * + * @param display the connection to the X server + * @param screen the screen number + * @param attrib_list a list of attributes terminated with {@code None} + * + * @return a pointer to an {@code XVisualInfo} structure describing the visual that best matches the specified attributes. If no matching visual exists, {@code NULL} is + * returned. + */ + @Nullable + @NativeType("XVisualInfo *") + public static XVisualInfo glXChooseVisual(@NativeType("Display *") long display, int screen, @Nullable @NativeType("int *") IntBuffer attrib_list) { + if (CHECKS) { + checkNTSafe(attrib_list); + } + long __result = nglXChooseVisual(display, screen, memAddressSafe(attrib_list)); + return XVisualInfo.createSafe(__result); + } + + // --- [ glXCreateContext ] --- + + /** Unsafe version of: {@link #glXCreateContext CreateContext} */ + public static long nglXCreateContext(long display, long visual, long share_list, int direct) { + long __functionAddress = Functions.CreateContext; + if (CHECKS) { + check(display); + XVisualInfo.validate(visual); + } + return callPPPP(display, visual, share_list, direct, __functionAddress); + } + + /** + * Creates an OpenGL context. + * + * @param display the connection to the X server + * @param visual a pointer to an {@link XVisualInfo} structure + * @param share_list the GLXContext to share objects with + * @param direct whether direct rendering is requested + */ + @NativeType("GLXContext") + public static long glXCreateContext(@NativeType("Display *") long display, @NativeType("XVisualInfo *") XVisualInfo visual, @NativeType("GLXContext") long share_list, @NativeType("Bool") boolean direct) { + return nglXCreateContext(display, visual.address(), share_list, direct ? 1 : 0); + } + + // --- [ glXMakeCurrent ] --- + + /** + * Makes a context current in the current thread + * + * @param display the connection to the X server + * @param draw the draw GLXdrawable + * @param ctx the GLXContext to make current + */ + @NativeType("Bool") + public static boolean glXMakeCurrent(@NativeType("Display *") long display, @NativeType("GLXDrawable") long draw, @NativeType("GLXContext") long ctx) { + long __functionAddress = Functions.MakeCurrent; + if (CHECKS) { + check(display); + } + return callPPPI(display, draw, ctx, __functionAddress) != 0; + } + + // --- [ glXCopyContext ] --- + + /** + * Copies OpenGL rendering state from one context to another. + * + * @param display the connection to the X server + * @param source the source GLXContext + * @param dest the destination GLXContext + * @param mask indicates which groups of state variables are to be copied; it contains the bitwise OR of the symbolic names for the attribute groups + */ + public static void glXCopyContext(@NativeType("Display *") long display, @NativeType("GLXContext") long source, @NativeType("GLXContext") long dest, @NativeType("unsigned long") long mask) { + long __functionAddress = Functions.CopyContext; + if (CHECKS) { + check(display); + check(source); + check(dest); + } + callPPPNV(display, source, dest, mask, __functionAddress); + } + + // --- [ glXIsDirect ] --- + + /** + * Determines if an OpenGL rendering context is direct. + * + * @param display the connection to the X server + * @param ctx the GLXContext to query + */ + @NativeType("Bool") + public static boolean glXIsDirect(@NativeType("Display *") long display, @NativeType("GLXContext") long ctx) { + long __functionAddress = Functions.IsDirect; + if (CHECKS) { + check(display); + check(ctx); + } + return callPPI(display, ctx, __functionAddress) != 0; + } + + // --- [ glXDestroyContext ] --- + + /** + * Destroys an OpenGL context. + * + *

    If {@code ctx} is still current to any thread, {@code ctx} is not destroyed until it is no longer current. In any event, the associated XID will be + * destroyed and {@code ctx} cannot subsequently be made current to any thread.

    + * + * @param display the connection to the X server + * @param ctx the GLXContext to destroy + */ + public static void glXDestroyContext(@NativeType("Display *") long display, @NativeType("GLXContext") long ctx) { + long __functionAddress = Functions.DestroyContext; + if (CHECKS) { + check(display); + check(ctx); + } + callPPV(display, ctx, __functionAddress); + } + + // --- [ glXGetCurrentContext ] --- + + /** Returns the GLXContext that is current in the current thread. */ + @NativeType("GLXContext") + public static long glXGetCurrentContext() { + long __functionAddress = Functions.GetCurrentContext; + return callP(__functionAddress); + } + + // --- [ glXGetCurrentDrawable ] --- + + /** Returns the XID of the current drawable used for rendering. */ + @NativeType("GLXDrawable") + public static long glXGetCurrentDrawable() { + long __functionAddress = Functions.GetCurrentDrawable; + return callP(__functionAddress); + } + + // --- [ glXWaitGL ] --- + + /** + * Prevents X requests from executing until any outstanding OpenGL rendering is done. + * + *

    OpenGL calls made prior to {@code glXWaitGL} are guaranteed to be executed before X rendering calls made after {@code glXWaitGL}. While the same result + * can be achieved using {@link GL11C#glFinish Finish}, {@code glXWaitGL} does not require a round trip to the server, and is therefore more efficient in cases + * where the client and server are on separate machines.

    + */ + public static void glXWaitGL() { + long __functionAddress = Functions.WaitGL; + callV(__functionAddress); + } + + // --- [ glXWaitX ] --- + + /** + * Prevents the OpenGL command sequence from executing until any outstanding X requests are completed. + * + *

    X rendering calls made prior to {@code glXWaitX} are guaranteed to be executed before OpenGL rendering calls made after {@code glXWaitX}. While the same + * result can be achieved using {@code XSync()}, {@code glXWaitX} does not require a round trip to the server, and may therefore be more efficient.

    + */ + public static void glXWaitX() { + long __functionAddress = Functions.WaitX; + callV(__functionAddress); + } + + // --- [ glXSwapBuffers ] --- + + /** + * For drawables that are double buffered, makes the contexts of the back buffer potentially visible (i.e., become the contents of the front buffer). + * + *

    The contents of the back buffer then become undefined. This operation is a no-op if draw was created with a non-double-buffered GLXFBConfig, or if draw + * is a GLXPixmap.

    + * + * @param display the connection to the X server + * @param draw a double buffered GLXDrawable + */ + public static void glXSwapBuffers(@NativeType("Display *") long display, @NativeType("GLXDrawable") long draw) { + long __functionAddress = Functions.SwapBuffers; + if (CHECKS) { + check(display); + check(draw); + } + callPPV(display, draw, __functionAddress); + } + + // --- [ glXUseXFont ] --- + + /** + * Provides a shortcut for using X fonts. + * + * @param font the font to use + * @param first the first glyph in the font to use + * @param count the number of display lists to define + * @param list_base the base list number + */ + public static void glXUseXFont(@NativeType("Font") long font, int first, int count, int list_base) { + long __functionAddress = Functions.UseXFont; + callNV(font, first, count, list_base, __functionAddress); + } + + // --- [ glXCreateGLXPixmap ] --- + + /** Unsafe version of: {@link #glXCreateGLXPixmap CreateGLXPixmap} */ + public static long nglXCreateGLXPixmap(long display, long visual, long pixmap) { + long __functionAddress = Functions.CreateGLXPixmap; + if (CHECKS) { + check(display); + XVisualInfo.validate(visual); + } + return callPPNP(display, visual, pixmap, __functionAddress); + } + + /** + * Creates a GLXPixmap from a Pixmap. + * + * @param display the connection to the X server + * @param visual a pointer to a {@link XVisualInfo} structure + * @param pixmap the Pixmap + */ + @NativeType("GLXPixmap") + public static long glXCreateGLXPixmap(@NativeType("Display *") long display, @NativeType("XVisualInfo *") XVisualInfo visual, @NativeType("Pixmap") long pixmap) { + return nglXCreateGLXPixmap(display, visual.address(), pixmap); + } + + // --- [ glXDestroyGLXPixmap ] --- + + /** + * Destroys a GLXPixmap. + * + * @param display the connection to the X server + * @param pixmap the GLXPixmap to destroy. + */ + public static void glXDestroyGLXPixmap(@NativeType("Display *") long display, @NativeType("GLXPixmap") long pixmap) { + long __functionAddress = Functions.DestroyGLXPixmap; + if (CHECKS) { + check(display); + check(pixmap); + } + callPPV(display, pixmap, __functionAddress); + } + + /** Array version of: {@link #glXQueryExtension QueryExtension} */ + @NativeType("Bool") + public static boolean glXQueryExtension(@NativeType("Display *") long display, @NativeType("int *") int[] error_base, @NativeType("int *") int[] event_base) { + long __functionAddress = Functions.QueryExtension; + if (CHECKS) { + check(display); + check(error_base, 1); + check(event_base, 1); + } + return callPPPI(display, error_base, event_base, __functionAddress) != 0; + } + + /** Array version of: {@link #glXQueryVersion QueryVersion} */ + @NativeType("Bool") + public static boolean glXQueryVersion(@NativeType("Display *") long display, @NativeType("int *") int[] major, @NativeType("int *") int[] minor) { + long __functionAddress = Functions.QueryVersion; + if (CHECKS) { + check(display); + check(major, 1); + check(minor, 1); + } + return callPPPI(display, major, minor, __functionAddress) != 0; + } + + /** Array version of: {@link #glXGetConfig GetConfig} */ + public static int glXGetConfig(@NativeType("Display *") long display, @NativeType("XVisualInfo *") XVisualInfo visual, int attribute, @NativeType("int *") int[] value) { + long __functionAddress = Functions.GetConfig; + if (CHECKS) { + check(display); + check(value, 1); + XVisualInfo.validate(visual.address()); + } + return callPPPI(display, visual.address(), attribute, value, __functionAddress); + } + + /** Array version of: {@link #glXChooseVisual ChooseVisual} */ + @Nullable + @NativeType("XVisualInfo *") + public static XVisualInfo glXChooseVisual(@NativeType("Display *") long display, int screen, @Nullable @NativeType("int *") int[] attrib_list) { + long __functionAddress = Functions.ChooseVisual; + if (CHECKS) { + check(display); + checkNTSafe(attrib_list); + } + long __result = callPPP(display, screen, attrib_list, __functionAddress); + return XVisualInfo.createSafe(__result); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX11.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX11.java new file mode 100644 index 000000000..eb096d7bb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX11.java @@ -0,0 +1,105 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to GLX 1.1. */ +public class GLX11 extends GLX { + + /** Names for attributes to {@link #glXGetClientString GetClientString}. */ + public static final int + GLX_VENDOR = 0x1, + GLX_VERSION = 0x2, + GLX_EXTENSIONS = 0x3; + + protected GLX11() { + throw new UnsupportedOperationException(); + } + + // --- [ glXQueryExtensionsString ] --- + + /** Unsafe version of: {@link #glXQueryExtensionsString QueryExtensionsString} */ + public static long nglXQueryExtensionsString(long display, int screen) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryExtensionsString; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPP(display, screen, __functionAddress); + } + + /** + * Returns a string describing which GLX extensions are supported on the connection. + * + * @param display the connection to the X server + * @param screen the screen number + */ + @Nullable + @NativeType("char const *") + public static String glXQueryExtensionsString(@NativeType("Display *") long display, int screen) { + long __result = nglXQueryExtensionsString(display, screen); + return memASCIISafe(__result); + } + + // --- [ glXGetClientString ] --- + + /** Unsafe version of: {@link #glXGetClientString GetClientString} */ + public static long nglXGetClientString(long display, int name) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetClientString; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPP(display, name, __functionAddress); + } + + /** + * Returns a pointer to a string describing some aspect of the client library. + * + * @param display the connection to the X server + * @param name the string to query + */ + @Nullable + @NativeType("char const *") + public static String glXGetClientString(@NativeType("Display *") long display, int name) { + long __result = nglXGetClientString(display, name); + return memASCIISafe(__result); + } + + // --- [ glXQueryServerString ] --- + + /** Unsafe version of: {@link #glXQueryServerString QueryServerString} */ + public static long nglXQueryServerString(long display, int screen, int name) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryServerString; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPP(display, screen, name, __functionAddress); + } + + /** + * Returns a pointer to a string describing some aspect of the server's GLX extension. + * + * @param display the connection to the X server + * @param screen the screen number + * @param name the string to query + */ + @Nullable + @NativeType("char const *") + public static String glXQueryServerString(@NativeType("Display *") long display, int screen, int name) { + long __result = nglXQueryServerString(display, screen, name); + return memASCIISafe(__result); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX12.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX12.java new file mode 100644 index 000000000..1a52bd251 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX12.java @@ -0,0 +1,32 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** Native bindings to GLX 1.2. */ +public class GLX12 extends GLX11 { + + protected GLX12() { + throw new UnsupportedOperationException(); + } + + // --- [ glXGetCurrentDisplay ] --- + + /** Returns the display associated with the current context and drawable. */ + @NativeType("Display *") + public static long glXGetCurrentDisplay() { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetCurrentDisplay; + if (CHECKS) { + check(__functionAddress); + } + return callP(__functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX13.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX13.java new file mode 100644 index 000000000..772196406 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX13.java @@ -0,0 +1,609 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +import org.lwjgl.system.linux.*; + +/** Native bindings to GLX 1.3. */ +public class GLX13 extends GLX12 { + + /** Added in GLX 1.3. */ + public static final int + GLX_WINDOW_BIT = 0x1, + GLX_PIXMAP_BIT = 0x2, + GLX_PBUFFER_BIT = 0x4, + GLX_RGBA_BIT = 0x1, + GLX_COLOR_INDEX_BIT = 0x2, + GLX_PBUFFER_CLOBBER_MASK = 0x8000000, + GLX_FRONT_LEFT_BUFFER_BIT = 0x1, + GLX_FRONT_RIGHT_BUFFER_BIT = 0x2, + GLX_BACK_LEFT_BUFFER_BIT = 0x4, + GLX_BACK_RIGHT_BUFFER_BIT = 0x8, + GLX_AUX_BUFFERS_BIT = 0x10, + GLX_DEPTH_BUFFER_BIT = 0x20, + GLX_STENCIL_BUFFER_BIT = 0x40, + GLX_ACCUM_BUFFER_BIT = 0x80, + GLX_CONFIG_CAVEAT = 0x20, + GLX_X_VISUAL_TYPE = 0x22, + GLX_TRANSPARENT_TYPE = 0x23, + GLX_TRANSPARENT_INDEX_VALUE = 0x24, + GLX_TRANSPARENT_RED_VALUE = 0x25, + GLX_TRANSPARENT_GREEN_VALUE = 0x26, + GLX_TRANSPARENT_BLUE_VALUE = 0x27, + GLX_TRANSPARENT_ALPHA_VALUE = 0x28, + GLX_DONT_CARE = 0xFFFFFFFF, + GLX_NONE = 0x8000, + GLX_SLOW_CONFIG = 0x8001, + GLX_TRUE_COLOR = 0x8002, + GLX_DIRECT_COLOR = 0x8003, + GLX_PSEUDO_COLOR = 0x8004, + GLX_STATIC_COLOR = 0x8005, + GLX_GRAY_SCALE = 0x8006, + GLX_STATIC_GRAY = 0x8007, + GLX_TRANSPARENT_RGB = 0x8008, + GLX_TRANSPARENT_INDEX = 0x8009, + GLX_VISUAL_ID = 0x800B, + GLX_SCREEN = 0x800C, + GLX_NON_CONFORMANT_CONFIG = 0x800D, + GLX_DRAWABLE_TYPE = 0x8010, + GLX_RENDER_TYPE = 0x8011, + GLX_X_RENDERABLE = 0x8012, + GLX_FBCONFIG_ID = 0x8013, + GLX_RGBA_TYPE = 0x8014, + GLX_COLOR_INDEX_TYPE = 0x8015, + GLX_MAX_PBUFFER_WIDTH = 0x8016, + GLX_MAX_PBUFFER_HEIGHT = 0x8017, + GLX_MAX_PBUFFER_PIXELS = 0x8018, + GLX_PRESERVED_CONTENTS = 0x801B, + GLX_LARGEST_PBUFFER = 0x801C, + GLX_WIDTH = 0x801D, + GLX_HEIGHT = 0x801E, + GLX_EVENT_MASK = 0x801F, + GLX_DAMAGED = 0x8020, + GLX_SAVED = 0x8021, + GLX_WINDOW = 0x8022, + GLX_PBUFFER = 0x8023, + GLX_PBUFFER_HEIGHT = 0x8040, + GLX_PBUFFER_WIDTH = 0x8041; + + protected GLX13() { + throw new UnsupportedOperationException(); + } + + // --- [ glXGetFBConfigs ] --- + + /** + * Unsafe version of: {@link #glXGetFBConfigs GetFBConfigs} + * + * @param nelements returns the number of GLXFBConfigs in the returned list + */ + public static long nglXGetFBConfigs(long display, int screen, long nelements) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetFBConfigs; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPPP(display, screen, nelements, __functionAddress); + } + + /** + * Returns the list of all GLXFBConfigs that are available on the specified screen. + * + * @param display the connection to the X server + * @param screen the screen number + */ + @Nullable + @NativeType("GLXFBConfig *") + public static PointerBuffer glXGetFBConfigs(@NativeType("Display *") long display, int screen) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer nelements = stack.callocInt(1); + try { + long __result = nglXGetFBConfigs(display, screen, memAddress(nelements)); + return memPointerBufferSafe(__result, nelements.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glXChooseFBConfig ] --- + + /** + * Unsafe version of: {@link #glXChooseFBConfig ChooseFBConfig} + * + * @param nelements returns the number of GLXFBConfigs matched + */ + public static long nglXChooseFBConfig(long display, int screen, long attrib_list, long nelements) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXChooseFBConfig; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPPPP(display, screen, attrib_list, nelements, __functionAddress); + } + + /** + * Returns a list of GLXFBConfigs that match a list of attributes. + * + * @param display the connection to the X server + * @param screen the screen number + * @param attrib_list a list of attributes terminated with {@code None} + */ + @Nullable + @NativeType("GLXFBConfig *") + public static PointerBuffer glXChooseFBConfig(@NativeType("Display *") long display, int screen, @Nullable @NativeType("int const *") IntBuffer attrib_list) { + if (CHECKS) { + checkNTSafe(attrib_list); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer nelements = stack.callocInt(1); + try { + long __result = nglXChooseFBConfig(display, screen, memAddressSafe(attrib_list), memAddress(nelements)); + return memPointerBufferSafe(__result, nelements.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glXGetFBConfigAttrib ] --- + + /** Unsafe version of: {@link #glXGetFBConfigAttrib GetFBConfigAttrib} */ + public static int nglXGetFBConfigAttrib(long display, long config, int attribute, long value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetFBConfigAttrib; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + } + return callPPPI(display, config, attribute, value, __functionAddress); + } + + /** + * Queries the value of a GLX attribute for a GLXFBConfig. + * + * @param display the connection to the X server + * @param config the GLXFBConfig being queried + * @param attribute the attribute to query + * @param value the attribute value + */ + public static int glXGetFBConfigAttrib(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, int attribute, @NativeType("int *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + return nglXGetFBConfigAttrib(display, config, attribute, memAddress(value)); + } + + // --- [ glXGetVisualFromFBConfig ] --- + + /** Unsafe version of: {@link #glXGetVisualFromFBConfig GetVisualFromFBConfig} */ + public static long nglXGetVisualFromFBConfig(long display, long config) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetVisualFromFBConfig; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + } + return callPPP(display, config, __functionAddress); + } + + /** + * Retrieves the associated visual of a GLXFBConfig. + * + * @param display the connection to the X server + * @param config the GLXFBConfig + */ + @Nullable + @NativeType("XVisualInfo *") + public static XVisualInfo glXGetVisualFromFBConfig(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config) { + long __result = nglXGetVisualFromFBConfig(display, config); + return XVisualInfo.createSafe(__result); + } + + // --- [ glXCreateWindow ] --- + + /** Unsafe version of: {@link #glXCreateWindow CreateWindow} */ + public static long nglXCreateWindow(long display, long config, long win, long attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateWindow; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + } + return callPPNPP(display, config, win, attrib_list, __functionAddress); + } + + /** + * Create an onscreen rendering area from an X Window and a desired GLXFBConfig. + * + * @param display the connection to the X server + * @param config the GLXFBConfig + * @param win the X Window + * @param attrib_list a list of attributes terminated with {@code None} + */ + @NativeType("GLXWindow") + public static long glXCreateWindow(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, @NativeType("Window") long win, @Nullable @NativeType("int const *") IntBuffer attrib_list) { + if (CHECKS) { + checkNTSafe(attrib_list); + } + return nglXCreateWindow(display, config, win, memAddressSafe(attrib_list)); + } + + // --- [ glXCreatePixmap ] --- + + /** Unsafe version of: {@link #glXCreatePixmap CreatePixmap} */ + public static long nglXCreatePixmap(long display, long config, long pixmap, long attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreatePixmap; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + } + return callPPNPP(display, config, pixmap, attrib_list, __functionAddress); + } + + /** + * Creates a GLXPixmap offscreen rendering area from an X Pixmap and a desired GLXFBConfig. + * + * @param display the connection to the X server + * @param config the GLXFBConfig + * @param pixmap the X Pixmap + * @param attrib_list a list of attributes terminated with {@code None} + */ + @NativeType("GLXPixmap") + public static long glXCreatePixmap(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, @NativeType("Pixmap") long pixmap, @Nullable @NativeType("int const *") IntBuffer attrib_list) { + if (CHECKS) { + checkNTSafe(attrib_list); + } + return nglXCreatePixmap(display, config, pixmap, memAddressSafe(attrib_list)); + } + + // --- [ glXDestroyPixmap ] --- + + /** + * Destroys a GLXPixmap. + * + * @param display the connection to the X server + * @param pixmap the GLXPixmap to destroy + */ + public static void glXDestroyPixmap(@NativeType("Display *") long display, @NativeType("GLXPixmap") long pixmap) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXDestroyPixmap; + if (CHECKS) { + check(__functionAddress); + check(display); + check(pixmap); + } + callPPV(display, pixmap, __functionAddress); + } + + // --- [ glXCreatePbuffer ] --- + + /** Unsafe version of: {@link #glXCreatePbuffer CreatePbuffer} */ + public static long nglXCreatePbuffer(long display, long config, long attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreatePbuffer; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + } + return callPPPP(display, config, attrib_list, __functionAddress); + } + + /** + * Creates a GLXPbuffer from a GLXFBConfig. + * + * @param display the connection to the X server + * @param config the GLXFBConfig + * @param attrib_list a list of attributes terminated with {@code None} + */ + @NativeType("GLXPbuffer") + public static long glXCreatePbuffer(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, @Nullable @NativeType("int const *") IntBuffer attrib_list) { + if (CHECKS) { + checkNTSafe(attrib_list); + } + return nglXCreatePbuffer(display, config, memAddressSafe(attrib_list)); + } + + // --- [ glXDestroyPbuffer ] --- + + /** + * Destroys a GLXPbuffer. + * + * @param display the connection to the X server + * @param pbuf the GLXPbuffer to destroy + */ + public static void glXDestroyPbuffer(@NativeType("Display *") long display, @NativeType("GLXPbuffer") long pbuf) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXDestroyPbuffer; + if (CHECKS) { + check(__functionAddress); + check(display); + check(pbuf); + } + callPPV(display, pbuf, __functionAddress); + } + + // --- [ glXQueryDrawable ] --- + + /** Unsafe version of: {@link #glXQueryDrawable QueryDrawable} */ + public static void nglXQueryDrawable(long display, long draw, int attribute, long value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryDrawable; + if (CHECKS) { + check(__functionAddress); + check(display); + check(draw); + } + callPPPV(display, draw, attribute, value, __functionAddress); + } + + /** + * Queries an attribute associated with a GLXDrawable. + * + * @param display the connection to the X server + * @param draw the GLXDrawable being queried + * @param attribute the attribute to query + * @param value returns the attribute value + */ + public static void glXQueryDrawable(@NativeType("Display *") long display, @NativeType("GLXDrawable") long draw, int attribute, @NativeType("unsigned int *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglXQueryDrawable(display, draw, attribute, memAddress(value)); + } + + /** + * Queries an attribute associated with a GLXDrawable. + * + * @param display the connection to the X server + * @param draw the GLXDrawable being queried + * @param attribute the attribute to query + */ + @NativeType("void") + public static int glXQueryDrawable(@NativeType("Display *") long display, @NativeType("GLXDrawable") long draw, int attribute) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer value = stack.callocInt(1); + nglXQueryDrawable(display, draw, attribute, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glXCreateNewContext ] --- + + /** + * Creates an OpenGL rendering context. + * + * @param display the connection to the X server + * @param config the GLXFBConfig + * @param render_type the render type + * @param share_list a GLXContext to share objects with + * @param direct whether direct rendering is requested + */ + @NativeType("GLXContext") + public static long glXCreateNewContext(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, int render_type, @NativeType("GLXContext") long share_list, @NativeType("Bool") boolean direct) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateNewContext; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + } + return callPPPP(display, config, render_type, share_list, direct ? 1 : 0, __functionAddress); + } + + // --- [ glXMakeContextCurrent ] --- + + /** + * Makes a GLXContext current in the current thread. + * + * @param display the connection to the X server + * @param draw the draw GLXDrawable + * @param read the read GLXDrawable + * @param ctx the GLXContext + */ + @NativeType("Bool") + public static boolean glXMakeContextCurrent(@NativeType("Display *") long display, @NativeType("GLXDrawable") long draw, @NativeType("GLXDrawable") long read, @NativeType("GLXContext") long ctx) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXMakeContextCurrent; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPPPPI(display, draw, read, ctx, __functionAddress) != 0; + } + + // --- [ glXGetCurrentReadDrawable ] --- + + /** Returns the current GLXDrawable used for reading in the current thread. */ + @NativeType("GLXDrawable") + public static long glXGetCurrentReadDrawable() { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetCurrentReadDrawable; + if (CHECKS) { + check(__functionAddress); + } + return callP(__functionAddress); + } + + // --- [ glXQueryContext ] --- + + /** Unsafe version of: {@link #glXQueryContext QueryContext} */ + public static int nglXQueryContext(long display, long ctx, int attribute, long value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryContext; + if (CHECKS) { + check(__functionAddress); + check(display); + check(ctx); + } + return callPPPI(display, ctx, attribute, value, __functionAddress); + } + + /** + * Queries the value of a GLXContext attribute. + * + * @param display the connection to the X server + * @param ctx the GLXContext being queried + * @param attribute the attribute to query + * @param value returns the attribute value + */ + public static int glXQueryContext(@NativeType("Display *") long display, @NativeType("GLXContext") long ctx, int attribute, @NativeType("int *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + return nglXQueryContext(display, ctx, attribute, memAddress(value)); + } + + // --- [ glXSelectEvent ] --- + + /** + * Selects which GLX events should be received on a GLXDrawable. + * + * @param display the connection to the X server + * @param draw the GLXDrawable + * @param event_mask the selection mask + */ + public static void glXSelectEvent(@NativeType("Display *") long display, @NativeType("GLXDrawable") long draw, @NativeType("unsigned long") long event_mask) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXSelectEvent; + if (CHECKS) { + check(__functionAddress); + check(display); + check(draw); + } + callPPNV(display, draw, event_mask, __functionAddress); + } + + // --- [ glXGetSelectedEvent ] --- + + /** Unsafe version of: {@link #glXGetSelectedEvent GetSelectedEvent} */ + public static void nglXGetSelectedEvent(long display, long draw, long event_mask) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetSelectedEvent; + if (CHECKS) { + check(__functionAddress); + check(display); + check(draw); + } + callPPPV(display, draw, event_mask, __functionAddress); + } + + /** + * Returns which GLX events are selected for a GLXDrawable. + * + * @param display the connection to the X server + * @param draw the GLXDrawable + * @param event_mask returns the selection mask + */ + public static void glXGetSelectedEvent(@NativeType("Display *") long display, @NativeType("GLXDrawable") long draw, @NativeType("unsigned long *") CLongBuffer event_mask) { + if (CHECKS) { + check(event_mask, 1); + } + nglXGetSelectedEvent(display, draw, memAddress(event_mask)); + } + + /** Array version of: {@link #glXChooseFBConfig ChooseFBConfig} */ + @Nullable + @NativeType("GLXFBConfig *") + public static PointerBuffer glXChooseFBConfig(@NativeType("Display *") long display, int screen, @Nullable @NativeType("int const *") int[] attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXChooseFBConfig; + if (CHECKS) { + check(__functionAddress); + check(display); + checkNTSafe(attrib_list); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer nelements = stack.callocInt(1); + try { + long __result = callPPPP(display, screen, attrib_list, memAddress(nelements), __functionAddress); + return memPointerBufferSafe(__result, nelements.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glXGetFBConfigAttrib GetFBConfigAttrib} */ + public static int glXGetFBConfigAttrib(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, int attribute, @NativeType("int *") int[] value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetFBConfigAttrib; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + check(value, 1); + } + return callPPPI(display, config, attribute, value, __functionAddress); + } + + /** Array version of: {@link #glXCreateWindow CreateWindow} */ + @NativeType("GLXWindow") + public static long glXCreateWindow(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, @NativeType("Window") long win, @Nullable @NativeType("int const *") int[] attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateWindow; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + checkNTSafe(attrib_list); + } + return callPPNPP(display, config, win, attrib_list, __functionAddress); + } + + /** Array version of: {@link #glXCreatePixmap CreatePixmap} */ + @NativeType("GLXPixmap") + public static long glXCreatePixmap(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, @NativeType("Pixmap") long pixmap, @Nullable @NativeType("int const *") int[] attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreatePixmap; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + checkNTSafe(attrib_list); + } + return callPPNPP(display, config, pixmap, attrib_list, __functionAddress); + } + + /** Array version of: {@link #glXCreatePbuffer CreatePbuffer} */ + @NativeType("GLXPbuffer") + public static long glXCreatePbuffer(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, @Nullable @NativeType("int const *") int[] attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreatePbuffer; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + checkNTSafe(attrib_list); + } + return callPPPP(display, config, attrib_list, __functionAddress); + } + + /** Array version of: {@link #glXQueryDrawable QueryDrawable} */ + public static void glXQueryDrawable(@NativeType("Display *") long display, @NativeType("GLXDrawable") long draw, int attribute, @NativeType("unsigned int *") int[] value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryDrawable; + if (CHECKS) { + check(__functionAddress); + check(display); + check(draw); + check(value, 1); + } + callPPPV(display, draw, attribute, value, __functionAddress); + } + + /** Array version of: {@link #glXQueryContext QueryContext} */ + public static int glXQueryContext(@NativeType("Display *") long display, @NativeType("GLXContext") long ctx, int attribute, @NativeType("int *") int[] value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryContext; + if (CHECKS) { + check(__functionAddress); + check(display); + check(ctx); + check(value, 1); + } + return callPPPI(display, ctx, attribute, value, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX14.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX14.java new file mode 100644 index 000000000..5471bd80e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLX14.java @@ -0,0 +1,102 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to GLX 1.4. */ +public class GLX14 extends GLX13 { + + /** Added in GLX 1.4. */ + public static final int + GLX_SAMPLE_BUFFERS = 0x186A0, + GLX_SAMPLES = 0x186A1; + + protected GLX14() { + throw new UnsupportedOperationException(); + } + + // --- [ glXGetProcAddress ] --- + + /** Unsafe version of: {@link #glXGetProcAddress GetProcAddress} */ + public static long nglXGetProcAddress(long procName) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetProcAddress; + if (CHECKS) { + check(__functionAddress); + } + return callPP(procName, __functionAddress); + } + + /** + * Returns the address of the extension function named by {@code procName}. The pointer returned should be cast to a function pointer type matching the + * extension function's definition in that extension specification. A return value of {@code NULL} indicates that the specified function does not exist for the + * implementation. + * + *

    A non-{@code NULL} return value for {@code glXGetProcAddress} does not guarantee that an extension function is actually supported at runtime. The client must + * also query {@link GL11C#glGetString GetString}({@link GL11#GL_EXTENSIONS}) or {@link GLX11#glXQueryExtensionsString QueryExtensionsString} to determine if an extension is supported by a particular context.

    + * + *

    GL function pointers returned by {@code glXGetProcAddress} are independent of the currently bound context and may be used by any context which supports + * the extension.

    + * + *

    {@code glXGetProcAddress} may be queried for all of the following functions:

    + * + *
      + *
    • All GL and GLX extension functions supported by the implementation (whether those extensions are supported by the current context or not).
    • + *
    • All core (non-extension) functions in GL and GLX from version 1.0 up to and including the versions of those specifications supported by the + * implementation, as determined by {@link GL11C#glGetString GetString}({@link GL11#GL_VERSION}) and {@link GLX#glXQueryVersion QueryVersion} queries.
    • + *
    + * + * @param procName the function name to query + */ + @NativeType("void *") + public static long glXGetProcAddress(@NativeType("GLchar const *") ByteBuffer procName) { + if (CHECKS) { + checkNT1(procName); + } + return nglXGetProcAddress(memAddress(procName)); + } + + /** + * Returns the address of the extension function named by {@code procName}. The pointer returned should be cast to a function pointer type matching the + * extension function's definition in that extension specification. A return value of {@code NULL} indicates that the specified function does not exist for the + * implementation. + * + *

    A non-{@code NULL} return value for {@code glXGetProcAddress} does not guarantee that an extension function is actually supported at runtime. The client must + * also query {@link GL11C#glGetString GetString}({@link GL11#GL_EXTENSIONS}) or {@link GLX11#glXQueryExtensionsString QueryExtensionsString} to determine if an extension is supported by a particular context.

    + * + *

    GL function pointers returned by {@code glXGetProcAddress} are independent of the currently bound context and may be used by any context which supports + * the extension.

    + * + *

    {@code glXGetProcAddress} may be queried for all of the following functions:

    + * + *
      + *
    • All GL and GLX extension functions supported by the implementation (whether those extensions are supported by the current context or not).
    • + *
    • All core (non-extension) functions in GL and GLX from version 1.0 up to and including the versions of those specifications supported by the + * implementation, as determined by {@link GL11C#glGetString GetString}({@link GL11#GL_VERSION}) and {@link GLX#glXQueryVersion QueryVersion} queries.
    • + *
    + * + * @param procName the function name to query + */ + @NativeType("void *") + public static long glXGetProcAddress(@NativeType("GLchar const *") CharSequence procName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(procName, true); + long procNameEncoded = stack.getPointerAddress(); + return nglXGetProcAddress(procNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXAMDGPUAssociation.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXAMDGPUAssociation.java new file mode 100644 index 000000000..33f3dd236 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXAMDGPUAssociation.java @@ -0,0 +1,199 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the GLX_AMD_gpu_association extension. + * + *

    There currently is no way for applications to efficiently use GPU resources in systems that contain more than one GPU. Vendors have provided methods + * that attempt to split the workload for an application among the available GPU resources. This has proven to be very inefficient because most + * applications were never written with these sorts of optimizations in mind.

    + * + *

    This extension provides a mechanism for applications to explicitly use the GPU resources on a given system individually. By providing this + * functionality, a driver allows applications to make appropriate decisions regarding where and when to distribute rendering tasks.

    + * + *

    Requires {@link GL15 OpenGL 1.5}, {@link GLX13 GLX 1.3}, {@link EXTFramebufferObject EXT_framebuffer_object} and {@link GLXARBGetProcAddress GLX_ARB_get_proc_address}.

    + */ +public class GLXAMDGPUAssociation { + + /** Accepted by the {@code property} parameter of {@link #glXGetGPUInfoAMD GetGPUInfoAMD}. */ + public static final int + GLX_GPU_VENDOR_AMD = 0x1F00, + GLX_GPU_RENDERER_STRING_AMD = 0x1F01, + GLX_GPU_OPENGL_VERSION_STRING_AMD = 0x1F02, + GLX_GPU_FASTEST_TARGET_GPUS_AMD = 0x21A2, + GLX_GPU_RAM_AMD = 0x21A3, + GLX_GPU_CLOCK_AMD = 0x21A4, + GLX_GPU_NUM_PIPES_AMD = 0x21A5, + GLX_GPU_NUM_SIMD_AMD = 0x21A6, + GLX_GPU_NUM_RB_AMD = 0x21A7, + GLX_GPU_NUM_SPI_AMD = 0x21A8; + + protected GLXAMDGPUAssociation() { + throw new UnsupportedOperationException(); + } + + // --- [ glXBlitContextFramebufferAMD ] --- + + public static void glXBlitContextFramebufferAMD(@NativeType("GLXContext") long dstCtx, @NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXBlitContextFramebufferAMD; + if (CHECKS) { + check(__functionAddress); + check(dstCtx); + } + callPV(dstCtx, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter, __functionAddress); + } + + // --- [ glXCreateAssociatedContextAMD ] --- + + /** Creates an associated context. */ + @NativeType("GLXContext") + public static long glXCreateAssociatedContextAMD(@NativeType("unsigned int") int id, @NativeType("GLXContext") long share_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateAssociatedContextAMD; + if (CHECKS) { + check(__functionAddress); + check(share_list); + } + return callPP(id, share_list, __functionAddress); + } + + // --- [ glXCreateAssociatedContextAttribsAMD ] --- + + /** Unsafe version of: {@link #glXCreateAssociatedContextAttribsAMD CreateAssociatedContextAttribsAMD} */ + public static long nglXCreateAssociatedContextAttribsAMD(int id, long share_context, long attribList) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateAssociatedContextAttribsAMD; + if (CHECKS) { + check(__functionAddress); + check(share_context); + } + return callPPP(id, share_context, attribList, __functionAddress); + } + + /** Creates an associated context and requests a specific GL version. */ + @NativeType("GLXContext") + public static long glXCreateAssociatedContextAttribsAMD(@NativeType("unsigned int") int id, @NativeType("GLXContext") long share_context, @NativeType("int const *") IntBuffer attribList) { + if (CHECKS) { + checkNT(attribList); + } + return nglXCreateAssociatedContextAttribsAMD(id, share_context, memAddress(attribList)); + } + + // --- [ glXDeleteAssociatedContextAMD ] --- + + /** + * Deletes an associated context. + * + * @param ctx the GLXContext + */ + @NativeType("Bool") + public static boolean glXDeleteAssociatedContextAMD(@NativeType("GLXContext") long ctx) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXDeleteAssociatedContextAMD; + if (CHECKS) { + check(__functionAddress); + check(ctx); + } + return callPI(ctx, __functionAddress) != 0; + } + + // --- [ glXGetContextGPUIDAMD ] --- + + /** + * Determines which GPU a context is attached to. + * + * @param ctx the GLXContext + */ + @NativeType("unsigned int") + public static int glXGetContextGPUIDAMD(@NativeType("GLXContext") long ctx) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetContextGPUIDAMD; + if (CHECKS) { + check(__functionAddress); + check(ctx); + } + return callPI(ctx, __functionAddress); + } + + // --- [ glXGetCurrentAssociatedContextAMD ] --- + + /** Queries the crrent associated context. */ + @NativeType("GLXContext") + public static long glXGetCurrentAssociatedContextAMD() { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetCurrentAssociatedContextAMD; + if (CHECKS) { + check(__functionAddress); + } + return callP(__functionAddress); + } + + // --- [ glXGetGPUIDsAMD ] --- + + /** Queries the IDs for available GPUs. */ + @NativeType("unsigned int") + public static int glXGetGPUIDsAMD(@NativeType("unsigned int") int maxCount, @NativeType("unsigned int") int ids) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetGPUIDsAMD; + if (CHECKS) { + check(__functionAddress); + } + return callI(maxCount, ids, __functionAddress); + } + + // --- [ glXGetGPUInfoAMD ] --- + + /** Unsafe version of: {@link #glXGetGPUInfoAMD GetGPUInfoAMD} */ + public static int nglXGetGPUInfoAMD(int id, int property, int dataType, int size, long data) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetGPUInfoAMD; + if (CHECKS) { + check(__functionAddress); + } + return callPI(id, property, dataType, size, data, __functionAddress); + } + + /** + * Queries GPU properties. + * + * @param property one of:
    {@link #GLX_GPU_VENDOR_AMD GPU_VENDOR_AMD}{@link #GLX_GPU_RENDERER_STRING_AMD GPU_RENDERER_STRING_AMD}{@link #GLX_GPU_OPENGL_VERSION_STRING_AMD GPU_OPENGL_VERSION_STRING_AMD}{@link #GLX_GPU_FASTEST_TARGET_GPUS_AMD GPU_FASTEST_TARGET_GPUS_AMD}
    {@link #GLX_GPU_RAM_AMD GPU_RAM_AMD}{@link #GLX_GPU_CLOCK_AMD GPU_CLOCK_AMD}{@link #GLX_GPU_NUM_PIPES_AMD GPU_NUM_PIPES_AMD}{@link #GLX_GPU_NUM_SIMD_AMD GPU_NUM_SIMD_AMD}
    {@link #GLX_GPU_NUM_RB_AMD GPU_NUM_RB_AMD}{@link #GLX_GPU_NUM_SPI_AMD GPU_NUM_SPI_AMD}
    + */ + public static int glXGetGPUInfoAMD(@NativeType("unsigned int") int id, int property, @NativeType("GLenum") int dataType, @NativeType("void *") ByteBuffer data) { + return nglXGetGPUInfoAMD(id, property, dataType, data.remaining(), memAddress(data)); + } + + // --- [ glXMakeAssociatedContextCurrentAMD ] --- + + /** + * Makes an associated context current in the current thread. + * + * @param ctx the GLXContext + */ + @NativeType("Bool") + public static boolean glXMakeAssociatedContextCurrentAMD(@NativeType("GLXContext") long ctx) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXMakeAssociatedContextCurrentAMD; + if (CHECKS) { + check(__functionAddress); + check(ctx); + } + return callPI(ctx, __functionAddress) != 0; + } + + /** Array version of: {@link #glXCreateAssociatedContextAttribsAMD CreateAssociatedContextAttribsAMD} */ + @NativeType("GLXContext") + public static long glXCreateAssociatedContextAttribsAMD(@NativeType("unsigned int") int id, @NativeType("GLXContext") long share_context, @NativeType("int const *") int[] attribList) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateAssociatedContextAttribsAMD; + if (CHECKS) { + check(__functionAddress); + check(share_context); + checkNT(attribList); + } + return callPPP(id, share_context, attribList, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBContextFlushControl.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBContextFlushControl.java new file mode 100644 index 000000000..06fbcabbd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBContextFlushControl.java @@ -0,0 +1,29 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_ARB_context_flush_control extension. + * + *

    The GLX version of {@link KHRContextFlushControl}. This extension adds new context creation parameters the allow an application to specify the behavior + * that is desired when a context is made non-current, and specifically to opt out of the implicit flush behavior.

    + */ +public final class GLXARBContextFlushControl { + + /** Accepted as an attribute name in the {@code *attrib_list} argument to {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. */ + public static final int GLX_CONTEXT_RELEASE_BEHAVIOR_ARB = 0x2097; + + /** + * Accepted as an attribute value for {@link #GLX_CONTEXT_RELEASE_BEHAVIOR_ARB CONTEXT_RELEASE_BEHAVIOR_ARB} in the {@code *attrib_list} argument to + * {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. + */ + public static final int + GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB = 0x0, + GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB = 0x2098; + + private GLXARBContextFlushControl() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContext.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContext.java new file mode 100644 index 000000000..98fee629e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContext.java @@ -0,0 +1,107 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the GLX_ARB_create_context extension. + * + *

    With the advent of new versions of OpenGL which deprecate features and/or break backward compatibility with older versions, there is a need and desire + * to indicate at context creation which interface will be used. These extensions add a new context creation routine with attributes specifying the GL + * version and context properties requested for the context, and additionally add an attribute specifying the GL profile requested for a context of OpenGL + * 3.2 or later. It also allows making an OpenGL 3.0 or later context current without providing a default framebuffer.

    + * + *

    Requires {@link GLX14 GLX 1.4}.

    + */ +public class GLXARBCreateContext { + + /** Accepted as an attribute name in {@code attrib_list}. */ + public static final int + GLX_CONTEXT_MAJOR_VERSION_ARB = 0x2091, + GLX_CONTEXT_MINOR_VERSION_ARB = 0x2092, + GLX_CONTEXT_FLAGS_ARB = 0x2094; + + /** Accepted as bits in the attribute value for {@link #GLX_CONTEXT_FLAGS_ARB CONTEXT_FLAGS_ARB} in {@code attrib_list}. */ + public static final int + GLX_CONTEXT_DEBUG_BIT_ARB = 0x1, + GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = 0x2; + + protected GLXARBCreateContext() { + throw new UnsupportedOperationException(); + } + + // --- [ glXCreateContextAttribsARB ] --- + + /** Unsafe version of: {@link #glXCreateContextAttribsARB CreateContextAttribsARB} */ + public static long nglXCreateContextAttribsARB(long display, long config, long share_context, int direct, long attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateContextAttribsARB; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + } + return callPPPPP(display, config, share_context, direct, attrib_list, __functionAddress); + } + + /** + * Creates an OpenGL rendering context. + * + *

    If {@code glXCreateContextAttribsARB} succeeds, it initializes the context to the initial state defined by the OpenGL specification, and returns a + * handle to it. This handle can be used to render to any GLX surface (window, pixmap, or pbuffer) compatible with {@code config}, subject to constraints + * imposed by the OpenGL API version of the context.

    + * + *

    If {@code share_context} is not {@code NULL}, then all shareable data (excluding OpenGL texture objects named 0) will be shared by {@code share_context}, all + * other contexts {@code share_context} already shares with, and the newly created context. An arbitrary number of {@code GLXContexts} can share data in + * this fashion. The server context state for all sharing contexts must exist in a single address space.

    + * + * @param display the connection to the X server + * @param config the {@code GLXFBConfig} + * @param share_context if not {@code NULL}, then all shareable data (excluding OpenGL texture objects named 0) will be shared by {@code share_context}, all other contexts + * {@code share_context} already shares with, and the newly created context. An arbitrary number of GLXContexts can share data in this fashion. The + * server context state for all sharing contexts must exist in a single address space. + * @param direct direct rendering is requested if {@code direct} is {@code True}, and indirect rendering if {@code direct} is {@code False}. If + * {@code direct} is {@code True}, the implementation may nonetheless create an indirect rendering context if any of the following conditions hold: + * + *
      + *
    • The implementation does not support direct rendering.
    • + *
    • {@code display} is not a local X server.
    • + *
    • Implementation-dependent limits on the number of direct rendering contexts that can be supported simultaneously are exceeded.
    • + *
    + * + *

    Use {@link GLX#glXIsDirect IsDirect} to determine whether or not a request for a direct rendering context succeeded.

    + * @param attrib_list an optional list of attributes for the context, terminated with {@code None} + */ + @NativeType("GLXContext") + public static long glXCreateContextAttribsARB(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, @NativeType("GLXContext") long share_context, @NativeType("Bool") boolean direct, @Nullable @NativeType("int const *") IntBuffer attrib_list) { + if (CHECKS) { + checkNTSafe(attrib_list); + } + return nglXCreateContextAttribsARB(display, config, share_context, direct ? 1 : 0, memAddressSafe(attrib_list)); + } + + /** Array version of: {@link #glXCreateContextAttribsARB CreateContextAttribsARB} */ + @NativeType("GLXContext") + public static long glXCreateContextAttribsARB(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, @NativeType("GLXContext") long share_context, @NativeType("Bool") boolean direct, @Nullable @NativeType("int const *") int[] attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateContextAttribsARB; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + checkNTSafe(attrib_list); + } + return callPPPPP(display, config, share_context, direct ? 1 : 0, attrib_list, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextNoError.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextNoError.java new file mode 100644 index 000000000..1b23e5365 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextNoError.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_ARB_create_context_no_error extension. + * + *

    This extension allows the creation of an OpenGL or OpenGL ES context that doesn't generate errors if the context supports a no error mode. The + * implications of this feature are discussed in the {@link KHRNoError KHR_no_error} extension.

    + * + *

    Requires {@link WGLARBCreateContext WGL_ARB_create_context}.

    + */ +public final class GLXARBCreateContextNoError { + + /** Accepted as an attribute name in the {@code *attrib_list} argument to {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. */ + public static final int GLX_CONTEXT_OPENGL_NO_ERROR_ARB = 0x31B3; + + private GLXARBCreateContextNoError() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextProfile.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextProfile.java new file mode 100644 index 000000000..f81bb1e3b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextProfile.java @@ -0,0 +1,30 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_ARB_create_context_profile extension. + * + *

    Adds an attribute to {@link GLXARBCreateContext}, specifying the GL profile requested for a context of OpenGL 3.2 or later.

    + * + *

    Requires {@link GLX14 GLX 1.4} and {@link GL32 OpenGL 3.2}.

    + */ +public final class GLXARBCreateContextProfile { + + /** Accepted as an attribute name in {@code attrib_list}. */ + public static final int GLX_CONTEXT_PROFILE_MASK_ARB = 0x9126; + + /** Accepted as bits in the attribute value for {@link #GLX_CONTEXT_PROFILE_MASK_ARB CONTEXT_PROFILE_MASK_ARB} in {@code attrib_list}. */ + public static final int + GLX_CONTEXT_CORE_PROFILE_BIT_ARB = 0x1, + GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = 0x2; + + /** GLX error. */ + public static final int GLXBadProfileARB = 13; + + private GLXARBCreateContextProfile() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextRobustness.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextRobustness.java new file mode 100644 index 000000000..f8f995eca --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBCreateContextRobustness.java @@ -0,0 +1,36 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_ARB_create_context_robustness extension. + * + *

    This extension allows creating an OpenGL context supporting robust buffer access behavior and a specified graphics reset notification behavior.

    + * + *

    Requires {@link GLX14 GLX 1.4}, {@link GLXARBCreateContext GLX_ARB_create_context} and {@link ARBRobustness ARB_robustness}.

    + */ +public final class GLXARBCreateContextRobustness { + + /** + * Accepted as a bit in the attribute value for {@link GLXARBCreateContext#GLX_CONTEXT_FLAGS_ARB CONTEXT_FLAGS_ARB} in the {@code attrib_list} argument to + * {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. + */ + public static final int GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB = 0x4; + + /** Accepted as an attribute name in the {@code attrib_list} argument to {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. */ + public static final int GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB = 0x8256; + + /** + * Accepted as an attribute value for {@link #GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB} in the {@code attrib_list} argument to + * {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. + */ + public static final int + GLX_NO_RESET_NOTIFICATION_ARB = 0x8261, + GLX_LOSE_CONTEXT_ON_RESET_ARB = 0x8252; + + private GLXARBCreateContextRobustness() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBFBConfigFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBFBConfigFloat.java new file mode 100644 index 000000000..510c044df --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBFBConfigFloat.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_ARB_fbconfig_float extension. + * + *

    The standard OpenGL pipeline is based on a fixed-point pipeline. While color components are nominally floating-point values in the pipeline, components + * are frequently clamped to the range [0,1] to accomodate the fixed-point color buffer representation and allow for fixed-point computational hardware.

    + * + *

    This extension adds pixel formats or visuals with floating-point RGBA color components and controls for clamping of color components within the pipeline.

    + */ +public final class GLXARBFBConfigFloat { + + /** Accepted as values of the {@code render_type} arguments in the {@link GLX13#glXCreateNewContext CreateNewContext} and {@link GLX#glXCreateContext CreateContext} functions. */ + public static final int GLX_RGBA_FLOAT_TYPE_ARB = 0x20B9; + + /** Accepted as a bit set in the GLX_RENDER_TYPE variable. */ + public static final int GLX_RGBA_FLOAT_BIT_ARB = 0x4; + + private GLXARBFBConfigFloat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBFramebufferSRGB.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBFramebufferSRGB.java new file mode 100644 index 000000000..25cb8f055 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBFramebufferSRGB.java @@ -0,0 +1,20 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_ARB_framebuffer_sRGB extension. + * + *

    GLX functionality for {@link ARBFramebufferSRGB ARB_framebuffer_sRGB}.

    + */ +public final class GLXARBFramebufferSRGB { + + /** Accepted by the {@code attribList} parameter of {@link GLX#glXChooseVisual ChooseVisual}, and by the {@code attrib} parameter of {@link GLX#glXGetConfig GetConfig}. */ + public static final int GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB = 0x20B2; + + private GLXARBFramebufferSRGB() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBGetProcAddress.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBGetProcAddress.java new file mode 100644 index 000000000..e167a8bf0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBGetProcAddress.java @@ -0,0 +1,105 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the GLX_ARB_get_proc_address extension. + * + *

    This extension adds a function to return the address of GLX and GL extension functions, given the function name. This is necessary with (for example) + * heterogenous implementations where hardware drivers may implement extension functions not known to the link library; a similar situation on Windows + * implementations resulted in the {@code wglGetProcAddress} function.

    + */ +public class GLXARBGetProcAddress { + + protected GLXARBGetProcAddress() { + throw new UnsupportedOperationException(); + } + + // --- [ glXGetProcAddressARB ] --- + + /** Unsafe version of: {@link #glXGetProcAddressARB GetProcAddressARB} */ + public static long nglXGetProcAddressARB(long procName) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetProcAddressARB; + if (CHECKS) { + check(__functionAddress); + } + return callPP(procName, __functionAddress); + } + + /** + * Returns the address of the extension function named by procName. The pointer returned should be cast to a function pointer type matching the extension + * function's definition in that extension specification. A return value of {@code NULL} indicates that the specified function does not exist for the + * implementation. + * + *

    A non-{@code NULL} return value for {@code glXGetProcAddressARB} does not guarantee that an extension function is actually supported at runtime. The client + * must must also query {@link GL11C#glGetString GetString}({@link GL11#GL_EXTENSIONS}) or {@link GLX11#glXQueryExtensionsString QueryExtensionsString} to determine if an extension is supported by a particular + * context.

    + * + *

    GL function pointers returned by {@code glXGetProcAddressARB} are independent of the currently bound context and may be used by any context which + * supports the extension.

    + * + *

    {@code glXGetProcAddressARB} may be queried for all of the following functions:

    + * + *
      + *
    • All GL and GLX extension functions supported by the implementation (whether those extensions are supported by the current context or not).
    • + *
    • All core (non-extension) functions in GL and GLX from version 1.0 up to and including the versions of those specifications supported by the + * implementation, as determined by {@link GL11C#glGetString GetString}({@link GL11#GL_VERSION}) and {@link GLX#glXQueryVersion QueryVersion} queries.
    • + *
    + * + * @param procName the function name to query + */ + @NativeType("void *") + public static long glXGetProcAddressARB(@NativeType("GLchar const *") ByteBuffer procName) { + if (CHECKS) { + checkNT1(procName); + } + return nglXGetProcAddressARB(memAddress(procName)); + } + + /** + * Returns the address of the extension function named by procName. The pointer returned should be cast to a function pointer type matching the extension + * function's definition in that extension specification. A return value of {@code NULL} indicates that the specified function does not exist for the + * implementation. + * + *

    A non-{@code NULL} return value for {@code glXGetProcAddressARB} does not guarantee that an extension function is actually supported at runtime. The client + * must must also query {@link GL11C#glGetString GetString}({@link GL11#GL_EXTENSIONS}) or {@link GLX11#glXQueryExtensionsString QueryExtensionsString} to determine if an extension is supported by a particular + * context.

    + * + *

    GL function pointers returned by {@code glXGetProcAddressARB} are independent of the currently bound context and may be used by any context which + * supports the extension.

    + * + *

    {@code glXGetProcAddressARB} may be queried for all of the following functions:

    + * + *
      + *
    • All GL and GLX extension functions supported by the implementation (whether those extensions are supported by the current context or not).
    • + *
    • All core (non-extension) functions in GL and GLX from version 1.0 up to and including the versions of those specifications supported by the + * implementation, as determined by {@link GL11C#glGetString GetString}({@link GL11#GL_VERSION}) and {@link GLX#glXQueryVersion QueryVersion} queries.
    • + *
    + * + * @param procName the function name to query + */ + @NativeType("void *") + public static long glXGetProcAddressARB(@NativeType("GLchar const *") CharSequence procName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(procName, true); + long procNameEncoded = stack.getPointerAddress(); + return nglXGetProcAddressARB(procNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBMultisample.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBMultisample.java new file mode 100644 index 000000000..3f3805fae --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBMultisample.java @@ -0,0 +1,22 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_ARB_multisample extension. + * + *

    See {@link ARBMultisample} for details.

    + */ +public final class GLXARBMultisample { + + /** Accepted by the {@code attribList} parameter of {@link GLX#glXChooseVisual ChooseVisual}, and by the {@code attrib} parameter of {@link GLX#glXGetConfig GetConfig}. */ + public static final int + GLX_SAMPLE_BUFFERS_ARB = 100000, + GLX_SAMPLES_ARB = 100001; + + private GLXARBMultisample() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBRobustnessApplicationIsolation.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBRobustnessApplicationIsolation.java new file mode 100644 index 000000000..cbfe747c8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBRobustnessApplicationIsolation.java @@ -0,0 +1,34 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_ARB_robustness_application_isolation extension. + * + *

    GL_ARB_robustness and GLX_ARB_create_context_robustness allow creating an OpenGL context supporting graphics reset notification behavior. + * GLX_ARB_robustness_application_isolation provides stronger guarantees about the possible side-effects of a graphics reset.

    + * + *

    If the graphics driver advertises the GLX_ARB_robustness_application_isolation extension string, then the driver guarantees that if a particular + * application causes a graphics reset to occur:

    + * + *
      + *
    1. No other application on the system is affected by the graphics reset.
    2. + *
    3. No other application on the system receives any notification that the graphics reset occurred.
    4. + *
    + * + *

    Requires {@link GLX14 GLX 1.4} and {@link GLXARBCreateContextRobustness GLX_ARB_create_context_robustness}.

    + */ +public final class GLXARBRobustnessApplicationIsolation { + + /** + * Accepted as a bit in the attribute value for {@link GLXARBCreateContext#GLX_CONTEXT_FLAGS_ARB CONTEXT_FLAGS_ARB} in the {@code attrib_list} argument to + * {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. + */ + public static final int GLX_CONTEXT_RESET_ISOLATION_BIT_ARB = 0x8; + + private GLXARBRobustnessApplicationIsolation() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBVertexBufferObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBVertexBufferObject.java new file mode 100644 index 000000000..17ebb0844 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXARBVertexBufferObject.java @@ -0,0 +1,27 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_ARB_vertex_buffer_object extension. + * + *

    It is the client's responsibility to convert buffer data to and from the server's byte order. Since only the client knows the correct format of the + * data, and there may be multiple clients with different byte orderings sharing a single buffer object, it is unreasonable to ask the GL to handle buffer + * object byte-swapping. To avoid errors caused by naive clients attempting to use buffer objects without performing the appropriate byte swapping, clients + * must opt in to buffer object support at context creation time using the {@link #GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB} context attrib. If this attribute + * is not specified and the byte ordering of the client and server differ, the VBO extension must not be exposed and the maximum context version that can + * be reported is 1.4.

    + * + *

    Requires {@link GLXARBCreateContext GLX_ARB_create_context} and {@link ARBVertexBufferObject ARB_vertex_buffer_object}.

    + */ +public final class GLXARBVertexBufferObject { + + /** Accepted as an attribute name in the {@code attrib_list} parameter of {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. */ + public static final int GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB = 0x2095; + + private GLXARBVertexBufferObject() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXCapabilities.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXCapabilities.java new file mode 100644 index 000000000..b0394b2a4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXCapabilities.java @@ -0,0 +1,652 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; +import java.util.Set; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; + +/** Defines the GLX capabilities of a connection. */ +public final class GLXCapabilities { + + // GLX11 + public final long + glXQueryExtensionsString, + glXGetClientString, + glXQueryServerString; + + // GLX12 + public final long + glXGetCurrentDisplay; + + // GLX13 + public final long + glXGetFBConfigs, + glXChooseFBConfig, + glXGetFBConfigAttrib, + glXGetVisualFromFBConfig, + glXCreateWindow, + glXCreatePixmap, + glXDestroyPixmap, + glXCreatePbuffer, + glXDestroyPbuffer, + glXQueryDrawable, + glXCreateNewContext, + glXMakeContextCurrent, + glXGetCurrentReadDrawable, + glXQueryContext, + glXSelectEvent, + glXGetSelectedEvent; + + // GLX14 + public final long + glXGetProcAddress; + + // GLX_AMD_gpu_association + public final long + glXBlitContextFramebufferAMD, + glXCreateAssociatedContextAMD, + glXCreateAssociatedContextAttribsAMD, + glXDeleteAssociatedContextAMD, + glXGetContextGPUIDAMD, + glXGetCurrentAssociatedContextAMD, + glXGetGPUIDsAMD, + glXGetGPUInfoAMD, + glXMakeAssociatedContextCurrentAMD; + + // GLX_ARB_create_context + public final long + glXCreateContextAttribsARB; + + // GLX_ARB_get_proc_address + public final long + glXGetProcAddressARB; + + // GLX_EXT_import_context + public final long + glXGetCurrentDisplayEXT, + glXQueryContextInfoEXT, + glXGetContextIDEXT, + glXImportContextEXT, + glXFreeContextEXT; + + // GLX_EXT_swap_control + public final long + glXSwapIntervalEXT; + + // GLX_EXT_texture_from_pixmap + public final long + glXBindTexImageEXT, + glXReleaseTexImageEXT; + + // GLX_NV_copy_buffer + public final long + glXCopyBufferSubDataNV, + glXNamedCopyBufferSubDataNV; + + // GLX_NV_copy_image + public final long + glXCopyImageSubDataNV; + + // GLX_NV_delay_before_swap + public final long + glXDelayBeforeSwapNV; + + // GLX_NV_swap_group + public final long + glXJoinSwapGroupNV, + glXBindSwapBarrierNV, + glXQuerySwapGroupNV, + glXQueryMaxSwapGroupsNV, + glXQueryFrameCountNV, + glXResetFrameCountNV; + + // GLX_SGI_make_current_read + public final long + glXMakeCurrentReadSGI, + glXGetCurrentReadDrawableSGI; + + // GLX_SGI_swap_control + public final long + glXSwapIntervalSGI; + + // GLX_SGI_video_sync + public final long + glXGetVideoSyncSGI, + glXWaitVideoSyncSGI; + + // GLX_SGIX_fbconfig + public final long + glXGetFBConfigAttribSGIX, + glXChooseFBConfigSGIX, + glXCreateGLXPixmapWithConfigSGIX, + glXCreateContextWithConfigSGIX, + glXGetVisualFromFBConfigSGIX, + glXGetFBConfigFromVisualSGIX; + + // GLX_SGIX_pbuffer + public final long + glXCreateGLXPbufferSGIX, + glXDestroyGLXPbufferSGIX, + glXQueryGLXPbufferSGIX, + glXSelectEventSGIX, + glXGetSelectedEventSGIX; + + // GLX_SGIX_swap_barrier + public final long + glXBindSwapBarrierSGIX, + glXQueryMaxSwapBarriersSGIX; + + // GLX_SGIX_swap_group + public final long + glXJoinSwapGroupSGIX; + + /** When true, {@link GLX11} is supported. */ + public final boolean GLX11; + /** When true, {@link GLX12} is supported. */ + public final boolean GLX12; + /** When true, {@link GLX13} is supported. */ + public final boolean GLX13; + /** When true, {@link GLX14} is supported. */ + public final boolean GLX14; + /** When true, {@link GLXAMDGPUAssociation} is supported. */ + public final boolean GLX_AMD_gpu_association; + /** When true, {@link GLXARBContextFlushControl} is supported. */ + public final boolean GLX_ARB_context_flush_control; + /** When true, {@link GLXARBCreateContext} is supported. */ + public final boolean GLX_ARB_create_context; + /** When true, {@link GLXARBCreateContextNoError} is supported. */ + public final boolean GLX_ARB_create_context_no_error; + /** When true, {@link GLXARBCreateContextProfile} is supported. */ + public final boolean GLX_ARB_create_context_profile; + /** When true, {@link GLXARBCreateContextRobustness} is supported. */ + public final boolean GLX_ARB_create_context_robustness; + /** When true, {@link GLXARBFBConfigFloat} is supported. */ + public final boolean GLX_ARB_fbconfig_float; + /** When true, {@link GLXARBFramebufferSRGB} is supported. */ + public final boolean GLX_ARB_framebuffer_sRGB; + /** When true, {@link GLXARBGetProcAddress} is supported. */ + public final boolean GLX_ARB_get_proc_address; + /** When true, {@link GLXARBMultisample} is supported. */ + public final boolean GLX_ARB_multisample; + /** When true, {@link GLXARBRobustnessApplicationIsolation} is supported. */ + public final boolean GLX_ARB_robustness_application_isolation; + /** + * When true, the GLX_ARB_robustness_share_group_isolation extension is supported. + * + *

    GL_ARB_robustness and GLX_ARB_create_context_robustness allow creating an OpenGL context supporting graphics reset notification behavior. + * GLX_ARB_robustness_share_group_isolation provides stronger guarantees about the possible side-effects of a graphics reset.

    + * + *

    If the graphics driver advertises the GLX_ARB_robustness_share_group_isolation extension string, then the driver guarantees that if a context in a + * particular share group causes a graphics reset to occur:

    + * + *
      + *
    1. No other share group within the application, nor any other application on the system, is affected by the graphics reset.
    2. + *
    3. No other share group within the application, nor any other application on the system, receives any notification that the graphics reset occurred.
    4. + *
    + * + *

    Requires {@link GLX14 GLX 1.4} and {@link GLXARBCreateContextRobustness GLX_ARB_create_context_robustness}.

    + */ + public final boolean GLX_ARB_robustness_share_group_isolation; + /** When true, {@link GLXARBVertexBufferObject} is supported. */ + public final boolean GLX_ARB_vertex_buffer_object; + /** When true, {@link GLXEXTBufferAge} is supported. */ + public final boolean GLX_EXT_buffer_age; + /** When true, {@link GLXEXTContextPriority} is supported. */ + public final boolean GLX_EXT_context_priority; + /** When true, {@link GLXEXTCreateContextES2Profile} is supported. */ + public final boolean GLX_EXT_create_context_es2_profile; + /** When true, {@link GLXEXTCreateContextESProfile} is supported. */ + public final boolean GLX_EXT_create_context_es_profile; + /** When true, {@link GLXEXTFBConfigPackedFloat} is supported. */ + public final boolean GLX_EXT_fbconfig_packed_float; + /** When true, {@link GLXEXTFramebufferSRGB} is supported. */ + public final boolean GLX_EXT_framebuffer_sRGB; + /** + * When true, the GLX_EXT_get_drawable_type extension is supported. + * + *

    This extension adds {@link GLX13#GLX_DRAWABLE_TYPE DRAWABLE_TYPE} to the set of drawable attributes that are sent in a {@code GLXGetDrawableAttributes} request, and that can be + * queried with {@link GLX13#glXQueryDrawable QueryDrawable}. While this is primarily a convenience for the client library implementation, it may also be useful for applications.

    + */ + public final boolean GLX_EXT_get_drawable_type; + /** When true, {@link GLXEXTImportContext} is supported. */ + public final boolean GLX_EXT_import_context; + /** + * When true, the GLX_EXT_no_config_context extension is supported. + * + *

    Modern GPUs allow contexts to render to almost any combination of supported color and auxiliary buffer formats. Traditionally GLX context creation is + * done with respect to a GLXFBConfig specifying buffer formats, and constrains contexts to only work with drawables created with a "compatible" config.

    + * + *

    This extension allows creation of GL & ES contexts without specifying a {@code GLXFBConfig}.

    + */ + public final boolean GLX_EXT_no_config_context; + /** When true, {@link GLXEXTStereoTree} is supported. */ + public final boolean GLX_EXT_stereo_tree; + /** When true, {@link GLXEXTSwapControl} is supported. */ + public final boolean GLX_EXT_swap_control; + /** When true, {@link GLXEXTSwapControlTear} is supported. */ + public final boolean GLX_EXT_swap_control_tear; + /** When true, {@link GLXEXTTextureFromPixmap} is supported. */ + public final boolean GLX_EXT_texture_from_pixmap; + /** When true, {@link GLXEXTVisualInfo} is supported. */ + public final boolean GLX_EXT_visual_info; + /** When true, {@link GLXEXTVisualRating} is supported. */ + public final boolean GLX_EXT_visual_rating; + /** When true, {@link GLXINTELSwapEvent} is supported. */ + public final boolean GLX_INTEL_swap_event; + /** When true, {@link GLXNVCopyBuffer} is supported. */ + public final boolean GLX_NV_copy_buffer; + /** When true, {@link GLXNVCopyImage} is supported. */ + public final boolean GLX_NV_copy_image; + /** When true, {@link GLXNVDelayBeforeSwap} is supported. */ + public final boolean GLX_NV_delay_before_swap; + /** When true, {@link GLXNVFloatBuffer} is supported. */ + public final boolean GLX_NV_float_buffer; + /** When true, {@link GLXNVMultiGPUContext} is supported. */ + public final boolean GLX_NV_multigpu_context; + /** When true, {@link GLXNVMultisampleCoverage} is supported. */ + public final boolean GLX_NV_multisample_coverage; + /** When true, {@link GLXNVRobustnessVideoMemoryPurge} is supported. */ + public final boolean GLX_NV_robustness_video_memory_purge; + /** When true, {@link GLXNVSwapGroup} is supported. */ + public final boolean GLX_NV_swap_group; + /** When true, {@link GLXSGIMakeCurrentRead} is supported. */ + public final boolean GLX_SGI_make_current_read; + /** When true, {@link GLXSGISwapControl} is supported. */ + public final boolean GLX_SGI_swap_control; + /** When true, {@link GLXSGIVideoSync} is supported. */ + public final boolean GLX_SGI_video_sync; + /** When true, {@link GLXSGIXFBConfig} is supported. */ + public final boolean GLX_SGIX_fbconfig; + /** When true, {@link GLXSGIXPbuffer} is supported. */ + public final boolean GLX_SGIX_pbuffer; + /** When true, {@link GLXSGIXSwapBarrier} is supported. */ + public final boolean GLX_SGIX_swap_barrier; + /** When true, {@link GLXSGIXSwapGroup} is supported. */ + public final boolean GLX_SGIX_swap_group; + + GLXCapabilities(FunctionProvider provider, Set ext) { + long[] caps = new long[69]; + + GLX11 = check_GLX11(provider, caps, ext); + GLX12 = check_GLX12(provider, caps, ext); + GLX13 = check_GLX13(provider, caps, ext); + GLX14 = check_GLX14(provider, caps, ext); + GLX_AMD_gpu_association = check_GLX_AMD_gpu_association(provider, caps, ext); + GLX_ARB_context_flush_control = ext.contains("GLX_ARB_context_flush_control"); + GLX_ARB_create_context = check_GLX_ARB_create_context(provider, caps, ext); + GLX_ARB_create_context_no_error = ext.contains("GLX_ARB_create_context_no_error"); + GLX_ARB_create_context_profile = ext.contains("GLX_ARB_create_context_profile"); + GLX_ARB_create_context_robustness = ext.contains("GLX_ARB_create_context_robustness"); + GLX_ARB_fbconfig_float = ext.contains("GLX_ARB_fbconfig_float"); + GLX_ARB_framebuffer_sRGB = ext.contains("GLX_ARB_framebuffer_sRGB"); + GLX_ARB_get_proc_address = check_GLX_ARB_get_proc_address(provider, caps, ext); + GLX_ARB_multisample = ext.contains("GLX_ARB_multisample"); + GLX_ARB_robustness_application_isolation = ext.contains("GLX_ARB_robustness_application_isolation"); + GLX_ARB_robustness_share_group_isolation = ext.contains("GLX_ARB_robustness_share_group_isolation"); + GLX_ARB_vertex_buffer_object = ext.contains("GLX_ARB_vertex_buffer_object"); + GLX_EXT_buffer_age = ext.contains("GLX_EXT_buffer_age"); + GLX_EXT_context_priority = ext.contains("GLX_EXT_context_priority"); + GLX_EXT_create_context_es2_profile = ext.contains("GLX_EXT_create_context_es2_profile"); + GLX_EXT_create_context_es_profile = ext.contains("GLX_EXT_create_context_es_profile"); + GLX_EXT_fbconfig_packed_float = ext.contains("GLX_EXT_fbconfig_packed_float"); + GLX_EXT_framebuffer_sRGB = ext.contains("GLX_EXT_framebuffer_sRGB"); + GLX_EXT_get_drawable_type = ext.contains("GLX_EXT_get_drawable_type"); + GLX_EXT_import_context = check_GLX_EXT_import_context(provider, caps, ext); + GLX_EXT_no_config_context = ext.contains("GLX_EXT_no_config_context"); + GLX_EXT_stereo_tree = ext.contains("GLX_EXT_stereo_tree"); + GLX_EXT_swap_control = check_GLX_EXT_swap_control(provider, caps, ext); + GLX_EXT_swap_control_tear = ext.contains("GLX_EXT_swap_control_tear"); + GLX_EXT_texture_from_pixmap = check_GLX_EXT_texture_from_pixmap(provider, caps, ext); + GLX_EXT_visual_info = ext.contains("GLX_EXT_visual_info"); + GLX_EXT_visual_rating = ext.contains("GLX_EXT_visual_rating"); + GLX_INTEL_swap_event = ext.contains("GLX_INTEL_swap_event"); + GLX_NV_copy_buffer = check_GLX_NV_copy_buffer(provider, caps, ext); + GLX_NV_copy_image = check_GLX_NV_copy_image(provider, caps, ext); + GLX_NV_delay_before_swap = check_GLX_NV_delay_before_swap(provider, caps, ext); + GLX_NV_float_buffer = ext.contains("GLX_NV_float_buffer"); + GLX_NV_multigpu_context = ext.contains("GLX_NV_multigpu_context"); + GLX_NV_multisample_coverage = ext.contains("GLX_NV_multisample_coverage"); + GLX_NV_robustness_video_memory_purge = ext.contains("GLX_NV_robustness_video_memory_purge"); + GLX_NV_swap_group = check_GLX_NV_swap_group(provider, caps, ext); + GLX_SGI_make_current_read = check_GLX_SGI_make_current_read(provider, caps, ext); + GLX_SGI_swap_control = check_GLX_SGI_swap_control(provider, caps, ext); + GLX_SGI_video_sync = check_GLX_SGI_video_sync(provider, caps, ext); + GLX_SGIX_fbconfig = check_GLX_SGIX_fbconfig(provider, caps, ext); + GLX_SGIX_pbuffer = check_GLX_SGIX_pbuffer(provider, caps, ext); + GLX_SGIX_swap_barrier = check_GLX_SGIX_swap_barrier(provider, caps, ext); + GLX_SGIX_swap_group = check_GLX_SGIX_swap_group(provider, caps, ext); + + glXQueryExtensionsString = caps[0]; + glXGetClientString = caps[1]; + glXQueryServerString = caps[2]; + glXGetCurrentDisplay = caps[3]; + glXGetFBConfigs = caps[4]; + glXChooseFBConfig = caps[5]; + glXGetFBConfigAttrib = caps[6]; + glXGetVisualFromFBConfig = caps[7]; + glXCreateWindow = caps[8]; + glXCreatePixmap = caps[9]; + glXDestroyPixmap = caps[10]; + glXCreatePbuffer = caps[11]; + glXDestroyPbuffer = caps[12]; + glXQueryDrawable = caps[13]; + glXCreateNewContext = caps[14]; + glXMakeContextCurrent = caps[15]; + glXGetCurrentReadDrawable = caps[16]; + glXQueryContext = caps[17]; + glXSelectEvent = caps[18]; + glXGetSelectedEvent = caps[19]; + glXGetProcAddress = caps[20]; + glXBlitContextFramebufferAMD = caps[21]; + glXCreateAssociatedContextAMD = caps[22]; + glXCreateAssociatedContextAttribsAMD = caps[23]; + glXDeleteAssociatedContextAMD = caps[24]; + glXGetContextGPUIDAMD = caps[25]; + glXGetCurrentAssociatedContextAMD = caps[26]; + glXGetGPUIDsAMD = caps[27]; + glXGetGPUInfoAMD = caps[28]; + glXMakeAssociatedContextCurrentAMD = caps[29]; + glXCreateContextAttribsARB = caps[30]; + glXGetProcAddressARB = caps[31]; + glXGetCurrentDisplayEXT = caps[32]; + glXQueryContextInfoEXT = caps[33]; + glXGetContextIDEXT = caps[34]; + glXImportContextEXT = caps[35]; + glXFreeContextEXT = caps[36]; + glXSwapIntervalEXT = caps[37]; + glXBindTexImageEXT = caps[38]; + glXReleaseTexImageEXT = caps[39]; + glXCopyBufferSubDataNV = caps[40]; + glXNamedCopyBufferSubDataNV = caps[41]; + glXCopyImageSubDataNV = caps[42]; + glXDelayBeforeSwapNV = caps[43]; + glXJoinSwapGroupNV = caps[44]; + glXBindSwapBarrierNV = caps[45]; + glXQuerySwapGroupNV = caps[46]; + glXQueryMaxSwapGroupsNV = caps[47]; + glXQueryFrameCountNV = caps[48]; + glXResetFrameCountNV = caps[49]; + glXMakeCurrentReadSGI = caps[50]; + glXGetCurrentReadDrawableSGI = caps[51]; + glXSwapIntervalSGI = caps[52]; + glXGetVideoSyncSGI = caps[53]; + glXWaitVideoSyncSGI = caps[54]; + glXGetFBConfigAttribSGIX = caps[55]; + glXChooseFBConfigSGIX = caps[56]; + glXCreateGLXPixmapWithConfigSGIX = caps[57]; + glXCreateContextWithConfigSGIX = caps[58]; + glXGetVisualFromFBConfigSGIX = caps[59]; + glXGetFBConfigFromVisualSGIX = caps[60]; + glXCreateGLXPbufferSGIX = caps[61]; + glXDestroyGLXPbufferSGIX = caps[62]; + glXQueryGLXPbufferSGIX = caps[63]; + glXSelectEventSGIX = caps[64]; + glXGetSelectedEventSGIX = caps[65]; + glXBindSwapBarrierSGIX = caps[66]; + glXQueryMaxSwapBarriersSGIX = caps[67]; + glXJoinSwapGroupSGIX = caps[68]; + } + + private static boolean check_GLX11(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX11")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 0, 1, 2 + }, + "glXQueryExtensionsString", "glXGetClientString", "glXQueryServerString" + ) || reportMissing("GLX", "GLX11"); + } + + private static boolean check_GLX12(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX12")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 3 + }, + "glXGetCurrentDisplay" + ) || reportMissing("GLX", "GLX12"); + } + + private static boolean check_GLX13(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX13")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + }, + "glXGetFBConfigs", "glXChooseFBConfig", "glXGetFBConfigAttrib", "glXGetVisualFromFBConfig", "glXCreateWindow", "glXCreatePixmap", + "glXDestroyPixmap", "glXCreatePbuffer", "glXDestroyPbuffer", "glXQueryDrawable", "glXCreateNewContext", "glXMakeContextCurrent", + "glXGetCurrentReadDrawable", "glXQueryContext", "glXSelectEvent", "glXGetSelectedEvent" + ) || reportMissing("GLX", "GLX13"); + } + + private static boolean check_GLX14(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX14")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 20 + }, + "glXGetProcAddress" + ) || reportMissing("GLX", "GLX14"); + } + + private static boolean check_GLX_AMD_gpu_association(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_AMD_gpu_association")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 21, 22, 23, 24, 25, 26, 27, 28, 29 + }, + "glXBlitContextFramebufferAMD", "glXCreateAssociatedContextAMD", "glXCreateAssociatedContextAttribsAMD", "glXDeleteAssociatedContextAMD", + "glXGetContextGPUIDAMD", "glXGetCurrentAssociatedContextAMD", "glXGetGPUIDsAMD", "glXGetGPUInfoAMD", "glXMakeAssociatedContextCurrentAMD" + ) || reportMissing("GLX", "GLX_AMD_gpu_association"); + } + + private static boolean check_GLX_ARB_create_context(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_ARB_create_context")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 30 + }, + "glXCreateContextAttribsARB" + ) || reportMissing("GLX", "GLX_ARB_create_context"); + } + + private static boolean check_GLX_ARB_get_proc_address(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_ARB_get_proc_address")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 31 + }, + "glXGetProcAddressARB" + ) || reportMissing("GLX", "GLX_ARB_get_proc_address"); + } + + private static boolean check_GLX_EXT_import_context(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_EXT_import_context")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 32, 33, 34, 35, 36 + }, + "glXGetCurrentDisplayEXT", "glXQueryContextInfoEXT", "glXGetContextIDEXT", "glXImportContextEXT", "glXFreeContextEXT" + ) || reportMissing("GLX", "GLX_EXT_import_context"); + } + + private static boolean check_GLX_EXT_swap_control(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_EXT_swap_control")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 37 + }, + "glXSwapIntervalEXT" + ) || reportMissing("GLX", "GLX_EXT_swap_control"); + } + + private static boolean check_GLX_EXT_texture_from_pixmap(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_EXT_texture_from_pixmap")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 38, 39 + }, + "glXBindTexImageEXT", "glXReleaseTexImageEXT" + ) || reportMissing("GLX", "GLX_EXT_texture_from_pixmap"); + } + + private static boolean check_GLX_NV_copy_buffer(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_NV_copy_buffer")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 40, 41 + }, + "glXCopyBufferSubDataNV", "glXNamedCopyBufferSubDataNV" + ) || reportMissing("GLX", "GLX_NV_copy_buffer"); + } + + private static boolean check_GLX_NV_copy_image(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_NV_copy_image")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 42 + }, + "glXCopyImageSubDataNV" + ) || reportMissing("GLX", "GLX_NV_copy_image"); + } + + private static boolean check_GLX_NV_delay_before_swap(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_NV_delay_before_swap")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 43 + }, + "glXDelayBeforeSwapNV" + ) || reportMissing("GLX", "GLX_NV_delay_before_swap"); + } + + private static boolean check_GLX_NV_swap_group(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_NV_swap_group")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 44, 45, 46, 47, 48, 49 + }, + "glXJoinSwapGroupNV", "glXBindSwapBarrierNV", "glXQuerySwapGroupNV", "glXQueryMaxSwapGroupsNV", "glXQueryFrameCountNV", "glXResetFrameCountNV" + ) || reportMissing("GLX", "GLX_NV_swap_group"); + } + + private static boolean check_GLX_SGI_make_current_read(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_SGI_make_current_read")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 50, 51 + }, + "glXMakeCurrentReadSGI", "glXGetCurrentReadDrawableSGI" + ) || reportMissing("GLX", "GLX_SGI_make_current_read"); + } + + private static boolean check_GLX_SGI_swap_control(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_SGI_swap_control")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 52 + }, + "glXSwapIntervalSGI" + ) || reportMissing("GLX", "GLX_SGI_swap_control"); + } + + private static boolean check_GLX_SGI_video_sync(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_SGI_video_sync")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 53, 54 + }, + "glXGetVideoSyncSGI", "glXWaitVideoSyncSGI" + ) || reportMissing("GLX", "GLX_SGI_video_sync"); + } + + private static boolean check_GLX_SGIX_fbconfig(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_SGIX_fbconfig")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 55, 56, 57, 58, 59, 60 + }, + "glXGetFBConfigAttribSGIX", "glXChooseFBConfigSGIX", "glXCreateGLXPixmapWithConfigSGIX", "glXCreateContextWithConfigSGIX", + "glXGetVisualFromFBConfigSGIX", "glXGetFBConfigFromVisualSGIX" + ) || reportMissing("GLX", "GLX_SGIX_fbconfig"); + } + + private static boolean check_GLX_SGIX_pbuffer(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_SGIX_pbuffer")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 61, 62, 63, 64, 65 + }, + "glXCreateGLXPbufferSGIX", "glXDestroyGLXPbufferSGIX", "glXQueryGLXPbufferSGIX", "glXSelectEventSGIX", "glXGetSelectedEventSGIX" + ) || reportMissing("GLX", "GLX_SGIX_pbuffer"); + } + + private static boolean check_GLX_SGIX_swap_barrier(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_SGIX_swap_barrier")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 66, 67 + }, + "glXBindSwapBarrierSGIX", "glXQueryMaxSwapBarriersSGIX" + ) || reportMissing("GLX", "GLX_SGIX_swap_barrier"); + } + + private static boolean check_GLX_SGIX_swap_group(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("GLX_SGIX_swap_group")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 68 + }, + "glXJoinSwapGroupSGIX" + ) || reportMissing("GLX", "GLX_SGIX_swap_group"); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTBufferAge.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTBufferAge.java new file mode 100644 index 000000000..6c16db1df --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTBufferAge.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_EXT_buffer_age extension. + * + *

    The aim of this extension is to expose enough information to applications about how the driver manages the set of front and back buffers associated with + * a given surface to allow applications to re-use the contents of old frames and minimize how much must be redrawn for the next frame.

    + * + *

    Requires {@link GLX14 GLX 1.4}.

    + */ +public final class GLXEXTBufferAge { + + /** Accepted by {@link GLX13#glXQueryDrawable QueryDrawable}. */ + public static final int GLX_BACK_BUFFER_AGE_EXT = 0x20F4; + + private GLXEXTBufferAge() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTContextPriority.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTContextPriority.java new file mode 100644 index 000000000..1e2acc808 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTContextPriority.java @@ -0,0 +1,30 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_EXT_context_priority extension. + * + *

    This extension allows a {@code GLXContext} to be created with a priority hint. It is possible that an implementation will not honour the hint, + * especially if there are constraints on the number of high priority contexts available in the system, or system policy limits access to high priority + * contexts to appropriate system privilege level. A query is provided to find the real priority level assigned to the context after creation.

    + * + *

    Requires {@link GLXARBCreateContext GLX_ARB_create_context}.

    + */ +public final class GLXEXTContextPriority { + + /** New attributes accepted by the {@code attrib_list} argument of {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. */ + public static final int GLX_CONTEXT_PRIORITY_LEVEL_EXT = 0x3100; + + /** New attribute values accepted in the {@code attrib_list} argument of {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. */ + public static final int + GLX_CONTEXT_PRIORITY_HIGH_EXT = 0x3101, + GLX_CONTEXT_PRIORITY_MEDIUM_EXT = 0x3102, + GLX_CONTEXT_PRIORITY_LOW_EXT = 0x3103; + + private GLXEXTContextPriority() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTCreateContextES2Profile.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTCreateContextES2Profile.java new file mode 100644 index 000000000..eda886eff --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTCreateContextES2Profile.java @@ -0,0 +1,22 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_EXT_create_context_es2_profile extension. + * + *

    This extension allows creating an OpenGL ES context.

    + * + *

    Requires {@link GLX14 GLX 1.4}, {@link GLXARBCreateContext GLX_ARB_create_context}, {@link GLXARBCreateContextProfile GLX_ARB_create_context_profile} and an OpenGL ES implemenation.

    + */ +public final class GLXEXTCreateContextES2Profile { + + /** Accepted as a bit in the attribute value for {@link GLXARBCreateContextProfile#GLX_CONTEXT_PROFILE_MASK_ARB CONTEXT_PROFILE_MASK_ARB} in {@code attrib_list}. */ + public static final int GLX_CONTEXT_ES2_PROFILE_BIT_EXT = 0x4; + + private GLXEXTCreateContextES2Profile() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTCreateContextESProfile.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTCreateContextESProfile.java new file mode 100644 index 000000000..00daa1c6f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTCreateContextESProfile.java @@ -0,0 +1,22 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_EXT_create_context_es_profile extension. + * + *

    This extension allows creating an OpenGL ES context.

    + * + *

    Requires {@link GLX14 GLX 1.4}, {@link GLXARBCreateContext GLX_ARB_create_context}, {@link GLXARBCreateContextProfile GLX_ARB_create_context_profile} and an OpenGL ES implemenation.

    + */ +public final class GLXEXTCreateContextESProfile { + + /** Accepted as a bit in the attribute value for {@link GLXARBCreateContextProfile#GLX_CONTEXT_PROFILE_MASK_ARB CONTEXT_PROFILE_MASK_ARB} in {@code attrib_list}. */ + public static final int GLX_CONTEXT_ES_PROFILE_BIT_EXT = 0x4; + + private GLXEXTCreateContextESProfile() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTFBConfigPackedFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTFBConfigPackedFloat.java new file mode 100644 index 000000000..9ccabe109 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTFBConfigPackedFloat.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_EXT_fbconfig_packed_float extension. + * + *

    This extension adds a new 3-component floating-point texture format that fits within a single 32-bit word. This format stores 5 bits of biased exponent + * per component in the same manner as 16-bit floating-point formats, but rather than 10 mantissa bits, the red, green, and blue components have 6, 6, and + * 5 bits respectively. Each mantissa is assumed to have an implied leading one except in the denorm exponent case. There is no sign bit so only + * non-negative values can be represented. Positive infinity, positive denorms, and positive NaN values are representable. The value of the fourth + * component returned by a texture fetch is always 1.0.

    + * + *

    This extension also provides support for rendering into an unsigned floating-point rendering format with the assumption that the texture format + * described above could also be advertised as an unsigned floating-point format for rendering.

    + * + *

    The extension also provides a pixel external format for specifying packed float values directly.

    + * + *

    Requires {@link GLX13 GLX 1.3}.

    + */ +public final class GLXEXTFBConfigPackedFloat { + + /** Accepted as values of the {@code render_type} arguments in the {@link GLX13#glXCreateNewContext CreateNewContext} and {@link GLX#glXCreateContext CreateContext} functions. */ + public static final int GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT = 0x20B1; + + /** + * Returned by {@link GLX13#glXGetFBConfigAttrib GetFBConfigAttrib} (when {@code attribute} is set to GLX_RENDER_TYPE) and accepted by the {@code attrib_list} parameter of + * {@link GLX13#glXChooseFBConfig ChooseFBConfig} (following the GLX_RENDER_TYPE token). + */ + public static final int GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT = 0x8; + + private GLXEXTFBConfigPackedFloat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTFramebufferSRGB.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTFramebufferSRGB.java new file mode 100644 index 000000000..6aaee7d7d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTFramebufferSRGB.java @@ -0,0 +1,20 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_EXT_framebuffer_sRGB extension. + * + *

    GLX functionality for {@link EXTFramebufferSRGB EXT_framebuffer_sRGB}.

    + */ +public final class GLXEXTFramebufferSRGB { + + /** Accepted by the {@code attribList} parameter of glXChooseVisual, and by the {@code attrib} parameter of glXGetConfig. */ + public static final int GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT = 0x20B2; + + private GLXEXTFramebufferSRGB() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTImportContext.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTImportContext.java new file mode 100644 index 000000000..7b5d27ba1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTImportContext.java @@ -0,0 +1,140 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the GLX_EXT_import_context extension. + * + *

    This extension allows multiple X clients to share an indirect rendering context.

    + * + *

    Additional convenience procedures to get the current Display* bound to a context as well as other context information are also added.

    + */ +public class GLXEXTImportContext { + + /** Accepted by the {@code attribute} parameter of {@link #glXQueryContextInfoEXT QueryContextInfoEXT}. */ + public static final int + GLX_SHARE_CONTEXT_EXT = 0x800A, + GLX_VISUAL_ID_EXT = 0x800B, + GLX_SCREEN_EXT = 0x800C; + + protected GLXEXTImportContext() { + throw new UnsupportedOperationException(); + } + + // --- [ glXGetCurrentDisplayEXT ] --- + + /** Returns the display associated with the current context. */ + @NativeType("Display *") + public static long glXGetCurrentDisplayEXT() { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetCurrentDisplayEXT; + if (CHECKS) { + check(__functionAddress); + } + return callP(__functionAddress); + } + + // --- [ glXQueryContextInfoEXT ] --- + + /** Unsafe version of: {@link #glXQueryContextInfoEXT QueryContextInfoEXT} */ + public static int nglXQueryContextInfoEXT(long display, long context, int attribute, long value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryContextInfoEXT; + if (CHECKS) { + check(__functionAddress); + check(display); + check(context); + } + return callPPPI(display, context, attribute, value, __functionAddress); + } + + /** + * Obtains the value of a context's attribute. + * + * @param display the connection to the X server + * @param context the context being queried + * @param attribute the attribute to query + * @param value returns the attribute value + */ + public static int glXQueryContextInfoEXT(@NativeType("Display *") long display, @NativeType("GLXContext") long context, int attribute, @NativeType("int *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + return nglXQueryContextInfoEXT(display, context, attribute, memAddress(value)); + } + + // --- [ glXGetContextIDEXT ] --- + + /** + * Returns the XID of a GLXContext. + * + * @param context the context + */ + @NativeType("GLXContextID") + public static long glXGetContextIDEXT(@NativeType("GLXContext const") long context) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetContextIDEXT; + if (CHECKS) { + check(__functionAddress); + check(context); + } + return callPN(context, __functionAddress); + } + + // --- [ glXImportContextEXT ] --- + + /** + * May be used in place of glXCreateContext to share another process's indirect rendering context. + * + * @param display the connection to the X server + * @param contextID the context XID + */ + @NativeType("GLXContext") + public static long glXImportContextEXT(@NativeType("Display *") long display, @NativeType("GLXContextID") long contextID) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXImportContextEXT; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPNP(display, contextID, __functionAddress); + } + + // --- [ glXFreeContextEXT ] --- + + /** + * Frees the client-side part of a GLXContext that was created with {@link #glXImportContextEXT ImportContextEXT}. + * + * @param display the connection to the X server + * @param context the context to free + */ + public static void glXFreeContextEXT(@NativeType("Display *") long display, @NativeType("GLXContext") long context) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXFreeContextEXT; + if (CHECKS) { + check(__functionAddress); + check(display); + check(context); + } + callPPV(display, context, __functionAddress); + } + + /** Array version of: {@link #glXQueryContextInfoEXT QueryContextInfoEXT} */ + public static int glXQueryContextInfoEXT(@NativeType("Display *") long display, @NativeType("GLXContext") long context, int attribute, @NativeType("int *") int[] value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryContextInfoEXT; + if (CHECKS) { + check(__functionAddress); + check(display); + check(context); + check(value, 1); + } + return callPPPI(display, context, attribute, value, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTStereoTree.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTStereoTree.java new file mode 100644 index 000000000..1bfd86642 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTStereoTree.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_EXT_stereo_tree extension. + * + *

    When using stereoscopic rendering with the X composite extension, a stereo-aware GLX composite manager can be used to composite both the left and right + * buffers of a window's backing pixmap to the left and right buffers of the root or composite overlay window to preserve the stereo effect of a + * redirected window or any of its child windows. However, to do this, the composite manager needs a method to determine which windows have both left and + * right buffers available without needing to walk entire window trees or be aware of other clients' GLX drawables.

    + * + *

    This extension provides a new drawable tree query, which can be used by the composite manager when it begins tracking a window, and an event, which can + * be used to listen for updates to a tracked window. This query and event provide the composite manager with a boolean value representing the stereo + * status of an entire redirected window tree. With this information, the composite manager is able to properly choose between a stereoscopic or + * monoscopic format when creating a GLXPixmap for a given window tree's backing pixmap.

    + */ +public final class GLXEXTStereoTree { + + /** Accepted by the {@code attribute} parameter of glXQueryDrawable and glXQueryGLXPbufferSGIX. */ + public static final int GLX_STEREO_TREE_EXT = 0x20F5; + + /** + * Accepted in the {@code event_mask} parameter of glXSelectEvent and glXSelectEventSGIX, and returned in the {@code event_mask} parameter of + * glXGetSelectedEvent and glXGetSelectedEventSGIX. + */ + public static final int GLX_STEREO_NOTIFY_MASK_EXT = 0x1; + + /** Returned in the {@code evtype} field of XGenericEventCookie events. */ + public static final int GLX_STEREO_NOTIFY_EXT = 0x0; + + private GLXEXTStereoTree() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTSwapControl.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTSwapControl.java new file mode 100644 index 000000000..389ce848a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTSwapControl.java @@ -0,0 +1,51 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the GLX_EXT_swap_control extension. + * + *

    This extension allows an application to specify a minimum periodicity of color buffer swaps, measured in video frame periods, for a particular drawable. + * It also allows an application to query the swap interval and the implementation-dependent maximum swap interval of a drawable.

    + */ +public class GLXEXTSwapControl { + + /** The current swap interval and implementation-dependent max swap interval for a particular drawable. */ + public static final int + GLX_SWAP_INTERVAL_EXT = 0x20F1, + GLX_MAX_SWAP_INTERVAL_EXT = 0x20F2; + + protected GLXEXTSwapControl() { + throw new UnsupportedOperationException(); + } + + // --- [ glXSwapIntervalEXT ] --- + + /** + * Specifies the minimum number of video frame periods per buffer swap for a particular GLX drawable (e.g. a value of two means that the color buffers will + * be swapped at most every other video frame). The interval takes effect when {@link GLX#glXSwapBuffers SwapBuffers} is first called on the drawable subsequent to the + * {@code glXSwapIntervalEXT} call. + * + * @param display the connection to the X server + * @param drawable the drawable + * @param interval the swap interval + */ + public static void glXSwapIntervalEXT(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, int interval) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXSwapIntervalEXT; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + } + callPPV(display, drawable, interval, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTSwapControlTear.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTSwapControlTear.java new file mode 100644 index 000000000..1b847d26f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTSwapControlTear.java @@ -0,0 +1,24 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_EXT_swap_control_tear extension. + * + *

    This extension extends the existing GLX_EXT_swap_control extension by allowing a negative {@code interval} parameter to + * {@link GLXEXTSwapControl#glXSwapIntervalEXT SwapIntervalEXT}. The negative {@code interval} allows late swaps to occur without synchronization to the video frame. This + * reduces the visual stutter on late frames and reduces the stall on subsequent frames.

    + * + *

    Requires {@link GLXEXTSwapControl GLX_EXT_swap_control}.

    + */ +public final class GLXEXTSwapControlTear { + + /** Accepted by {@link GLX13#glXQueryDrawable QueryDrawable}. */ + public static final int GLX_LATE_SWAPS_TEAR_EXT = 0x20F3; + + private GLXEXTSwapControlTear() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTTextureFromPixmap.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTTextureFromPixmap.java new file mode 100644 index 000000000..02316a1ee --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTTextureFromPixmap.java @@ -0,0 +1,148 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the GLX_EXT_texture_from_pixmap extension. + * + *

    This extension allows a color buffer to be used for both rendering and texturing.

    + * + *

    Requires {@link GLX13 GLX 1.3}.

    + */ +public class GLXEXTTextureFromPixmap { + + /** Accepted by the {@code attribute} parameter of {@link GLX13#glXGetFBConfigAttrib GetFBConfigAttrib} and the {@code attrib_list} parameter of {@link GLX13#glXChooseFBConfig ChooseFBConfig}. */ + public static final int + GLX_BIND_TO_TEXTURE_RGB_EXT = 0x20D0, + GLX_BIND_TO_TEXTURE_RGBA_EXT = 0x20D1, + GLX_BIND_TO_MIPMAP_TEXTURE_EXT = 0x20D2, + GLX_BIND_TO_TEXTURE_TARGETS_EXT = 0x20D3, + GLX_Y_INVERTED_EXT = 0x20D4; + + /** Accepted as an attribute in the {@code attrib_list} parameter of {@link GLX13#glXCreatePixmap CreatePixmap}, and by the {@code attribute} parameter of {@link GLX13#glXQueryDrawable QueryDrawable}. */ + public static final int + GLX_TEXTURE_FORMAT_EXT = 0x20D5, + GLX_TEXTURE_TARGET_EXT = 0x20D6, + GLX_MIPMAP_TEXTURE_EXT = 0x20D7; + + /** + * Accepted as a value in the {@code attrib_list} parameter of {@link GLX13#glXCreatePixmap CreatePixmap} and returned in the {@code value} parameter of + * {@link GLX13#glXQueryDrawable QueryDrawable} when {@code attribute} is {@link #GLX_TEXTURE_FORMAT_EXT TEXTURE_FORMAT_EXT}. + */ + public static final int + GLX_TEXTURE_FORMAT_NONE_EXT = 0x20D8, + GLX_TEXTURE_FORMAT_RGB_EXT = 0x20D9, + GLX_TEXTURE_FORMAT_RGBA_EXT = 0x20DA; + + /** Accepted as bits in the {@link #GLX_BIND_TO_TEXTURE_TARGETS_EXT BIND_TO_TEXTURE_TARGETS_EXT} variable. */ + public static final int + GLX_TEXTURE_1D_BIT_EXT = 0x1, + GLX_TEXTURE_2D_BIT_EXT = 0x2, + GLX_TEXTURE_RECTANGLE_BIT_EXT = 0x4; + + /** + * Accepted as a value in the {@code attrib_list} parameter of {@link GLX13#glXCreatePixmap CreatePixmap} and returned in the {@code value} parameter of + * {@link GLX13#glXQueryDrawable QueryDrawable} when {@code attribute} is {@link #GLX_TEXTURE_TARGET_EXT TEXTURE_TARGET_EXT}. + */ + public static final int + GLX_TEXTURE_1D_EXT = 0x20DB, + GLX_TEXTURE_2D_EXT = 0x20DC, + GLX_TEXTURE_RECTANGLE_EXT = 0x20DD; + + /** Accepted by the {@code buffer} parameter of {@link #glXBindTexImageEXT BindTexImageEXT} and {@link #glXReleaseTexImageEXT ReleaseTexImageEXT}. */ + public static final int + GLX_FRONT_LEFT_EXT = 0x20DE, + GLX_FRONT_RIGHT_EXT = 0x20DF, + GLX_BACK_LEFT_EXT = 0x20E0, + GLX_BACK_RIGHT_EXT = 0x20E1, + GLX_FRONT_EXT = GLX_FRONT_LEFT_EXT, + GLX_BACK_EXT = GLX_BACK_LEFT_EXT, + GLX_AUX0_EXT = 0x20E2, + GLX_AUX1_EXT = 0x20E3, + GLX_AUX2_EXT = 0x20E4, + GLX_AUX3_EXT = 0x20E5, + GLX_AUX4_EXT = 0x20E6, + GLX_AUX5_EXT = 0x20E7, + GLX_AUX6_EXT = 0x20E8, + GLX_AUX7_EXT = 0x20E9, + GLX_AUX8_EXT = 0x20EA, + GLX_AUX9_EXT = 0x20EB; + + protected GLXEXTTextureFromPixmap() { + throw new UnsupportedOperationException(); + } + + // --- [ glXBindTexImageEXT ] --- + + /** Unsafe version of: {@link #glXBindTexImageEXT BindTexImageEXT} */ + public static void nglXBindTexImageEXT(long display, long drawable, int buffer, long attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXBindTexImageEXT; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + } + callPPPV(display, drawable, buffer, attrib_list, __functionAddress); + } + + /** + * Defines a one- or two-dimensional texture image. The texture image is taken from {@code buffer} and need not be copied. The texture target, the texture + * format, and the size of the texture components are derived from attributes of {@code drawable}. + * + * @param display the connection to the X server + * @param drawable the drawable + * @param buffer the buffer + * @param attrib_list an optional null-terminated list of attributes + */ + public static void glXBindTexImageEXT(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, int buffer, @Nullable @NativeType("int const *") IntBuffer attrib_list) { + if (CHECKS) { + checkNTSafe(attrib_list); + } + nglXBindTexImageEXT(display, drawable, buffer, memAddressSafe(attrib_list)); + } + + // --- [ glXReleaseTexImageEXT ] --- + + /** + * Releases a color buffer that is being used as a texture. + * + * @param display the connection to the X server + * @param drawable the drawable + * @param buffer the buffer + */ + public static void glXReleaseTexImageEXT(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, int buffer) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXReleaseTexImageEXT; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + } + callPPV(display, drawable, buffer, __functionAddress); + } + + /** Array version of: {@link #glXBindTexImageEXT BindTexImageEXT} */ + public static void glXBindTexImageEXT(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, int buffer, @Nullable @NativeType("int const *") int[] attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXBindTexImageEXT; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + checkNTSafe(attrib_list); + } + callPPPV(display, drawable, buffer, attrib_list, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTVisualInfo.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTVisualInfo.java new file mode 100644 index 000000000..fdcaca2ae --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTVisualInfo.java @@ -0,0 +1,53 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_EXT_visual_info extension. + * + *

    This extension allows the user to request a particular X visual type to be associated with a GLX visual, and allows the user to query the X visual type + * underlying a GLX visual.

    + * + *

    In addition, this extension provides a means to request a visual with a transparent pixel and to query whether a visual supports a transparent pixel + * value and the value of the transparent pixel. Note that the notion of level and transparent pixels are orthogonal as both layer 1 and layer 0 visuals + * may or may not have a transparent pixel value.

    + */ +public final class GLXEXTVisualInfo { + + /** Accepted by the {@code attrib} parameter of {@link GLX#glXGetConfig GetConfig}, and by the {@code attrib_list} parameter of {@link GLX#glXChooseVisual ChooseVisual}. */ + public static final int + GLX_X_VISUAL_TYPE_EXT = 0x22, + GLX_TRANSPARENT_TYPE_EXT = 0x23, + GLX_TRANSPARENT_INDEX_VALUE_EXT = 0x24, + GLX_TRANSPARENT_RED_VALUE_EXT = 0x25, + GLX_TRANSPARENT_GREEN_VALUE_EXT = 0x26, + GLX_TRANSPARENT_BLUE_VALUE_EXT = 0x27, + GLX_TRANSPARENT_ALPHA_VALUE_EXT = 0x28; + + /** + * Returned by {@link GLX#glXGetConfig GetConfig}, and accepted by the {@code attrib_list} parameter of {@link GLX#glXChooseVisual ChooseVisual} (following the + * {@link #GLX_X_VISUAL_TYPE_EXT X_VISUAL_TYPE_EXT} token). + */ + public static final int + GLX_TRUE_COLOR_EXT = 0x8002, + GLX_DIRECT_COLOR_EXT = 0x8003, + GLX_PSEUDO_COLOR_EXT = 0x8004, + GLX_STATIC_COLOR_EXT = 0x8005, + GLX_GRAY_SCALE_EXT = 0x8006, + GLX_STATIC_GRAY_EXT = 0x8007; + + /** + * Returned by {@link GLX#glXGetConfig GetConfig}, and accepted by the {@code attrib_list} parameter of {@link GLX#glXChooseVisual ChooseVisual} (following the + * {@link #GLX_TRANSPARENT_TYPE_EXT TRANSPARENT_TYPE_EXT} token). + */ + public static final int + GLX_NONE_EXT = 0x8000, + GLX_TRANSPARENT_RGB_EXT = 0x8008, + GLX_TRANSPARENT_INDEX_EXT = 0x8009; + + private GLXEXTVisualInfo() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTVisualRating.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTVisualRating.java new file mode 100644 index 000000000..247e2605b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXEXTVisualRating.java @@ -0,0 +1,35 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_EXT_visual_rating extension. + * + *

    This extension allows servers to identify a particular GLX visual as undesirable. A new visual attribute is introduced, providing a way for servers to + * specify caveats (e.g., slow) for a visual. The attribute may be queried using {@link GLX#glXGetConfig GetConfig}, and can therefore be used by + * application-specific visual selection routines. The new attribute is also used by {@link GLX#glXChooseVisual ChooseVisual} to discriminate against visuals with + * caveats.

    + * + *

    This extension allows servers to export visuals with improved features or image quality, but lower performance or greater system burden, without having + * to have these visuals selected preferentially. It is intended to insure that most applications get the "right" visual, not that all applications do.

    + */ +public final class GLXEXTVisualRating { + + /** Accepted by the {@code attribute} parameter of {@link GLX#glXGetConfig GetConfig} and by the {@code attrib_list} parameter of {@link GLX#glXChooseVisual ChooseVisual}. */ + public static final int GLX_VISUAL_CAVEAT_EXT = 0x20; + + /** + * Returned by the {@code value} parameter of {@link GLX#glXGetConfig GetConfig} (when {@code attribute} is set to {@link #GLX_VISUAL_CAVEAT_EXT VISUAL_CAVEAT_EXT}) and accepted by the {@code attrib_list} + * parameter of {@link GLX#glXChooseVisual ChooseVisual} (following the {@link #GLX_VISUAL_CAVEAT_EXT VISUAL_CAVEAT_EXT} token). + */ + public static final int + GLX_NONE_EXT = 0x8000, + GLX_SLOW_VISUAL_EXT = 0x8001, + GLX_NON_CONFORMANT_VISUAL_EXT = 0x800D; + + private GLXEXTVisualRating() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXINTELSwapEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXINTELSwapEvent.java new file mode 100644 index 000000000..ad1a8e3cf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXINTELSwapEvent.java @@ -0,0 +1,29 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_INTEL_swap_event extension. + * + *

    This extension adds a new event type, {@link #GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK BUFFER_SWAP_COMPLETE_INTEL_MASK}, which is sent to the client via the X11 event stream and + * selected/consumed by the normal GLX event mask mechanisms, to indicate when a previously queued swap has completed.

    + * + *

    Requires {@link GLX13 GLX 1.3}.

    + */ +public final class GLXINTELSwapEvent { + + /** Accepted by the {@code mask} parameter of {@link GLX13#glXSelectEvent SelectEvent} and returned in the {@code mask} parameter of {@link GLX13#glXGetSelectedEvent GetSelectedEvent}. */ + public static final int GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK = 0x4000000; + + /** Returned in the {@code event_type} field of a "swap complete" event. */ + public static final int + GLX_EXCHANGE_COMPLETE_INTEL = 0x8180, + GLX_COPY_COMPLETE_INTEL = 0x8181, + GLX_FLIP_COMPLETE_INTEL = 0x8182; + + private GLXINTELSwapEvent() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVCopyBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVCopyBuffer.java new file mode 100644 index 000000000..a6a8e7d01 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVCopyBuffer.java @@ -0,0 +1,52 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the GLX_NV_copy_buffer extension. + * + *

    Extends {@link ARBCopyBuffer ARB_copy_buffer} to have GLX bindings.

    + */ +public class GLXNVCopyBuffer { + + protected GLXNVCopyBuffer() { + throw new UnsupportedOperationException(); + } + + // --- [ glXCopyBufferSubDataNV ] --- + + /** @param display the connection to the X server */ + public static void glXCopyBufferSubDataNV(@NativeType("Display *") long display, @NativeType("GLXContext") long readCtx, @NativeType("GLXContext") long writeCtx, @NativeType("GLenum") int readTarget, @NativeType("GLenum") int writeTarget, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCopyBufferSubDataNV; + if (CHECKS) { + check(__functionAddress); + check(display); + check(readCtx); + check(writeCtx); + } + callPPPPPPV(display, readCtx, writeCtx, readTarget, writeTarget, readOffset, writeOffset, size, __functionAddress); + } + + // --- [ glXNamedCopyBufferSubDataNV ] --- + + /** @param display the connection to the X server */ + public static void glXNamedCopyBufferSubDataNV(@NativeType("Display *") long display, @NativeType("GLXContext") long readCtx, @NativeType("GLXContext") long writeCtx, @NativeType("GLuint") int readBuffer, @NativeType("GLuint") int writeBuffer, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXNamedCopyBufferSubDataNV; + if (CHECKS) { + check(__functionAddress); + check(display); + check(readCtx); + check(writeCtx); + } + callPPPPPPV(display, readCtx, writeCtx, readBuffer, writeBuffer, readOffset, writeOffset, size, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVCopyImage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVCopyImage.java new file mode 100644 index 000000000..b12cc6fc5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVCopyImage.java @@ -0,0 +1,46 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the GLX_NV_copy_image extension. + * + *

    This extension enables efficient image data transfer between image objects (i.e. textures and renderbuffers) without the need to bind the objects or + * otherwise configure the rendering pipeline. The GLX version allows copying between images in different contexts, even if those contexts are in different + * sharelists or even on different physical devices.

    + */ +public class GLXNVCopyImage { + + protected GLXNVCopyImage() { + throw new UnsupportedOperationException(); + } + + // --- [ glXCopyImageSubDataNV ] --- + + /** + * Behaves identically to the core function {@link #glXCopyImageSubDataNV CopyImageSubDataNV}, except that the {@code srcCtx} and {@code dstCtx} parameters specify + * the contexts in which to look up the source and destination objects, respectively. A value of {@code NULL} for either context indicates that the value which is + * returned by {@link GLX#glXGetCurrentContext GetCurrentContext} should be used instead. Both contexts must share the same address space. + * + * @param display the connection to the X server + * @param srcCtx the source context + * @param dstCtx the destination context + */ + public static void glXCopyImageSubDataNV(@NativeType("Display *") long display, @NativeType("GLXContext") long srcCtx, @NativeType("GLuint") int srcName, @NativeType("GLenum") int srcTarget, @NativeType("GLint") int srcLevel, @NativeType("GLint") int srcX, @NativeType("GLint") int srcY, @NativeType("GLint") int srcZ, @NativeType("GLXContext") long dstCtx, @NativeType("GLuint") int dstName, @NativeType("GLenum") int dstTarget, @NativeType("GLint") int dstLevel, @NativeType("GLint") int dstX, @NativeType("GLint") int dstY, @NativeType("GLint") int dstZ, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCopyImageSubDataNV; + if (CHECKS) { + check(__functionAddress); + check(display); + } + callPPPV(display, srcCtx, srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstCtx, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVDelayBeforeSwap.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVDelayBeforeSwap.java new file mode 100644 index 000000000..cc93f007f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVDelayBeforeSwap.java @@ -0,0 +1,65 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the GLX_NV_delay_before_swap extension. + * + *

    For most interactive applications, the standard rendering loop responding to input events on a frame granularity is sufficient. Some more demanding + * applications may want to exchange performance for the ability to sample input closer to the final frame swap and adjust rendering accordingly. This + * extension adds functionality to allow the application to wait until a specified time before a swapbuffers command would be able to execute.

    + * + *

    Requires {@link GLX11 GLX11} and {@link GLXEXTSwapControl GLX_EXT_swap_control}.

    + */ +public class GLXNVDelayBeforeSwap { + + protected GLXNVDelayBeforeSwap() { + throw new UnsupportedOperationException(); + } + + // --- [ glXDelayBeforeSwapNV ] --- + + /** + * Blocks the CPU until {@code seconds} seconds before a synchronized swap would occur on a particular GLX window drawable. It also returns a boolean value + * equal to {@code True} when the implementation had to wait for the synchronized swap and {@code False} otherwise. + * + *

    The parameter {@code seconds} accepts positive floating point values not larger than the length in seconds of the swap period on the associated + * drawable. When buffer swaps are synchronized, the swap period is composed of one or multiple video frame periods. A video frame period is the time + * required by the monitor to display a full frame of video data. A swap interval set to a value of 2 means that the color buffers will be swapped at most + * every other video frame. If {@code seconds} is smaller than 0, {@code DelayBeforeSwapNV} will return False and will not wait for the end of the swap + * period. If {@code seconds} is greater than a swap period, {@code DelayBeforeSwapNV} will return immediately without generating any error and the return + * value will be False.

    + * + *

    The application should use a {@code seconds} delay large enough to have time to complete its work before the end of the swap period. If {@code seconds} + * is close to 0.0, the application may miss the end of the swap period and it will have to wait an additional swap period before it can swap.

    + * + *

    If {@code DelayBeforeSwapNV} detects that there is less than {@code seconds} seconds before the end of the swap period, it will return immediately and + * the return value will be False. The implementation will not wait an additional video frame period to have an exact delay of {@code seconds} seconds.

    + * + *

    If buffer swaps are unsynchronized, {@code DelayBeforeSwapNV} will return immediately and the return value will be False. It could happen for multiple + * reasons, for example if the swap interval is equal to 0, if the window is in a mode switch or if no monitors are active.

    + * + * @param display the connection to the X server + * @param drawable the window drawable + * @param seconds the delay, in seconds + */ + @NativeType("Bool") + public static boolean glXDelayBeforeSwapNV(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, @NativeType("GLfloat") float seconds) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXDelayBeforeSwapNV; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + } + return callPPI(display, drawable, seconds, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVFloatBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVFloatBuffer.java new file mode 100644 index 000000000..00c5ecfd3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVFloatBuffer.java @@ -0,0 +1,20 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_NV_float_buffer extension. + * + *

    GLX functionality for {@link NVFloatBuffer NV_float_buffer}.

    + */ +public final class GLXNVFloatBuffer { + + /** Accepted in the {@code value} array of glXGetFBConfigAttrib (and glXGetFBConfigAttribSGIX). */ + public static final int GLX_FLOAT_COMPONENTS_NV = 0x20B0; + + private GLXNVFloatBuffer() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVMultiGPUContext.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVMultiGPUContext.java new file mode 100644 index 000000000..f8301b498 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVMultiGPUContext.java @@ -0,0 +1,47 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_NV_multigpu_context extension. + * + *

    This extension allows the creation of an OpenGL context in a multi-GPU environment with a specified multi-GPU strategy (known as SLI mode) which takes + * precedence over process-wide multi-GPU mode settings.

    + * + *

    The multi-GPU mode denotes vendor specific techniques to allow distributed rendering on multiple GPUs, further called AFR (alternate frame rendering) + * and Multicast (as defined in NV_gpu_multicast).

    + * + *

    OpenGL supports multiple contexts. The semantics of switching contexts is generally left to window system binding APIs such as WGL, GLX and EGL. The + * extension {@code GLX_NV_multigpu_context} allows to specify a preferred multi-GPU rendering mode per context, thus context switching can also switch + * the current multi-GPU rendering mode.

    + * + *

    In addition to the modes described above, this extension allows creating contexts in single mode to force all rendering to be done on a single GPU, and + * multi-display multicast mode to allow multicast rendering on a multi-display configuration where displays attached to multiple GPUs are linked together + * in a desktop configuration spanning multiple GPUs.

    + * + *

    The implementation is platform dependent and the actual multi-GPU rendering mode of the created context may vary on different hardware and operation + * system platforms.

    + * + *

    Requires {@link GLX14 GLX14} and {@link GLXARBCreateContext GLX_ARB_create_context}.

    + */ +public final class GLXNVMultiGPUContext { + + /** Accepted as an attribute name in the {@code *attrib_list} argument to {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. */ + public static final int GLX_CONTEXT_MULTIGPU_ATTRIB_NV = 0x20AA; + + /** + * Accepted as an attribute value for {@link #GLX_CONTEXT_MULTIGPU_ATTRIB_NV CONTEXT_MULTIGPU_ATTRIB_NV} in the {@code *attrib_list} argument to + * {@link GLXARBCreateContext#glXCreateContextAttribsARB CreateContextAttribsARB}. + */ + public static final int + GLX_CONTEXT_MULTIGPU_ATTRIB_SINGLE_NV = 0x20AB, + GLX_CONTEXT_MULTIGPU_ATTRIB_AFR_NV = 0x20AC, + GLX_CONTEXT_MULTIGPU_ATTRIB_MULTICAST_NV = 0x20AD, + GLX_CONTEXT_MULTIGPU_ATTRIB_MULTI_DISPLAY_MULTICAST_NV = 0x20AE; + + private GLXNVMultiGPUContext() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVMultisampleCoverage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVMultisampleCoverage.java new file mode 100644 index 000000000..92541caa7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVMultisampleCoverage.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_NV_multisample_coverage extension. + * + *

    GLX functionality for {@link NVMultisampleCoverage NV_multisample_coverage}.

    + */ +public final class GLXNVMultisampleCoverage { + + /** + * Accepted by the {@code attribList} parameter of glXChooseVisual, and by the {@code attrib} parameter of glXGetConfig, the + * {@code attrib_list} parameter of glXChooseFBConfig, and the {@code attribute} parameter of glXGetFBConfigAttrib. + */ + public static final int + GLX_COVERAGE_SAMPLES_NV = 100001, + GLX_COLOR_SAMPLES_NV = 0x20B3; + + private GLXNVMultisampleCoverage() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVRobustnessVideoMemoryPurge.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVRobustnessVideoMemoryPurge.java new file mode 100644 index 000000000..a76cc53a2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVRobustnessVideoMemoryPurge.java @@ -0,0 +1,20 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the GLX_NV_robustness_video_memory_purge extension. + * + *

    GLX functionality for {@link NVRobustnessVideoMemoryPurge NV_robustness_video_memory_purge}.

    + */ +public final class GLXNVRobustnessVideoMemoryPurge { + + /** Accepted as an attribute name in the {@code *attrib_list} argument of glXCreateContextAttribsARB. */ + public static final int GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV = 0x20F7; + + private GLXNVRobustnessVideoMemoryPurge() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVSwapGroup.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVSwapGroup.java new file mode 100644 index 000000000..3acbcea98 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXNVSwapGroup.java @@ -0,0 +1,178 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the GLX_NV_swap_group extension. + * + *

    This extension provides the capability to synchronize the buffer swaps of a group of OpenGL windows. A swap group is created, and windows are added as + * members to the swap group. Buffer swaps to members of the swap group will then take place concurrently.

    + * + *

    This extension also provides the capability to sychronize the buffer swaps of different swap groups, which may reside on distributed systems on a + * network. For this purpose swap groups can be bound to a swap barrier.

    + * + *

    This extension extends the set of conditions that must be met before a buffer swap can take place.

    + */ +public class GLXNVSwapGroup { + + protected GLXNVSwapGroup() { + throw new UnsupportedOperationException(); + } + + // --- [ glXJoinSwapGroupNV ] --- + + /** @param display the connection to the X server */ + @NativeType("Bool") + public static boolean glXJoinSwapGroupNV(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, @NativeType("GLuint") int group) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXJoinSwapGroupNV; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + } + return callPPI(display, drawable, group, __functionAddress) != 0; + } + + // --- [ glXBindSwapBarrierNV ] --- + + /** @param display the connection to the X server */ + @NativeType("Bool") + public static boolean glXBindSwapBarrierNV(@NativeType("Display *") long display, @NativeType("GLuint") int group, @NativeType("GLuint") int barrier) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXBindSwapBarrierNV; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPI(display, group, barrier, __functionAddress) != 0; + } + + // --- [ glXQuerySwapGroupNV ] --- + + /** Unsafe version of: {@link #glXQuerySwapGroupNV QuerySwapGroupNV} */ + public static int nglXQuerySwapGroupNV(long display, long drawable, long group, long barrier) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQuerySwapGroupNV; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + } + return callPPPPI(display, drawable, group, barrier, __functionAddress); + } + + /** @param display the connection to the X server */ + @NativeType("Bool") + public static boolean glXQuerySwapGroupNV(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, @NativeType("GLuint *") IntBuffer group, @NativeType("GLuint *") IntBuffer barrier) { + if (CHECKS) { + check(group, 1); + check(barrier, 1); + } + return nglXQuerySwapGroupNV(display, drawable, memAddress(group), memAddress(barrier)) != 0; + } + + // --- [ glXQueryMaxSwapGroupsNV ] --- + + /** Unsafe version of: {@link #glXQueryMaxSwapGroupsNV QueryMaxSwapGroupsNV} */ + public static int nglXQueryMaxSwapGroupsNV(long display, int screen, long maxGroups, long maxBarriers) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryMaxSwapGroupsNV; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPPPI(display, screen, maxGroups, maxBarriers, __functionAddress); + } + + /** @param display the connection to the X server */ + @NativeType("Bool") + public static boolean glXQueryMaxSwapGroupsNV(@NativeType("Display *") long display, int screen, @NativeType("GLuint *") IntBuffer maxGroups, @NativeType("GLuint *") IntBuffer maxBarriers) { + if (CHECKS) { + check(maxGroups, 1); + check(maxBarriers, 1); + } + return nglXQueryMaxSwapGroupsNV(display, screen, memAddress(maxGroups), memAddress(maxBarriers)) != 0; + } + + // --- [ glXQueryFrameCountNV ] --- + + /** Unsafe version of: {@link #glXQueryFrameCountNV QueryFrameCountNV} */ + public static int nglXQueryFrameCountNV(long display, int screen, long count) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryFrameCountNV; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPPI(display, screen, count, __functionAddress); + } + + /** @param display the connection to the X server */ + @NativeType("Bool") + public static boolean glXQueryFrameCountNV(@NativeType("Display *") long display, int screen, @NativeType("GLuint *") IntBuffer count) { + if (CHECKS) { + check(count, 1); + } + return nglXQueryFrameCountNV(display, screen, memAddress(count)) != 0; + } + + // --- [ glXResetFrameCountNV ] --- + + /** @param display the connection to the X server */ + @NativeType("Bool") + public static boolean glXResetFrameCountNV(@NativeType("Display *") long display, int screen) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXResetFrameCountNV; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPI(display, screen, __functionAddress) != 0; + } + + /** Array version of: {@link #glXQuerySwapGroupNV QuerySwapGroupNV} */ + @NativeType("Bool") + public static boolean glXQuerySwapGroupNV(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, @NativeType("GLuint *") int[] group, @NativeType("GLuint *") int[] barrier) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQuerySwapGroupNV; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + check(group, 1); + check(barrier, 1); + } + return callPPPPI(display, drawable, group, barrier, __functionAddress) != 0; + } + + /** Array version of: {@link #glXQueryMaxSwapGroupsNV QueryMaxSwapGroupsNV} */ + @NativeType("Bool") + public static boolean glXQueryMaxSwapGroupsNV(@NativeType("Display *") long display, int screen, @NativeType("GLuint *") int[] maxGroups, @NativeType("GLuint *") int[] maxBarriers) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryMaxSwapGroupsNV; + if (CHECKS) { + check(__functionAddress); + check(display); + check(maxGroups, 1); + check(maxBarriers, 1); + } + return callPPPI(display, screen, maxGroups, maxBarriers, __functionAddress) != 0; + } + + /** Array version of: {@link #glXQueryFrameCountNV QueryFrameCountNV} */ + @NativeType("Bool") + public static boolean glXQueryFrameCountNV(@NativeType("Display *") long display, int screen, @NativeType("GLuint *") int[] count) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryFrameCountNV; + if (CHECKS) { + check(__functionAddress); + check(display); + check(count, 1); + } + return callPPI(display, screen, count, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIMakeCurrentRead.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIMakeCurrentRead.java new file mode 100644 index 000000000..48aa6bc89 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIMakeCurrentRead.java @@ -0,0 +1,58 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the GLX_SGI_make_current_read extension. + * + *

    The association of the current context with a drawable is extended to allow separate write and read drawables. This paves the way for allowing + * preprocessing of image data in an "off screen" window which is then read into the visible window for final display. Similarly it sets the frame-work + * for direct transfer of video to the GL, by treating the video as a special kind of read drawable (a.k.a, readable).

    + */ +public class GLXSGIMakeCurrentRead { + + protected GLXSGIMakeCurrentRead() { + throw new UnsupportedOperationException(); + } + + // --- [ glXMakeCurrentReadSGI ] --- + + /** + * Associates two {@code GLXDrawables} with the current rendering context. + * + * @param display the connection to the X server + * @param draw the draw drawable + * @param read the read drawable + * @param ctx the current context + */ + @NativeType("Bool") + public static boolean glXMakeCurrentReadSGI(@NativeType("Display *") long display, @NativeType("GLXDrawable") long draw, @NativeType("GLXDrawable") long read, @NativeType("GLXContext") long ctx) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXMakeCurrentReadSGI; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPPPPI(display, draw, read, ctx, __functionAddress) != 0; + } + + // --- [ glXGetCurrentReadDrawableSGI ] --- + + /** Returns the name of the {@code GLXDrawable} currently being used as a pixel query source. */ + @NativeType("GLXDrawable") + public static long glXGetCurrentReadDrawableSGI() { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetCurrentReadDrawableSGI; + if (CHECKS) { + check(__functionAddress); + } + return callP(__functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGISwapControl.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGISwapControl.java new file mode 100644 index 000000000..974941ddb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGISwapControl.java @@ -0,0 +1,45 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the GLX_SGI_swap_control extension. + * + *

    This extension allows an application to specify a minimum periodicity of color buffer swaps, measured in video frame periods.

    + */ +public class GLXSGISwapControl { + + protected GLXSGISwapControl() { + throw new UnsupportedOperationException(); + } + + // --- [ glXSwapIntervalSGI ] --- + + /** + * Specifies the minimum number of video frame periods per buffer swap. (e.g. a value of two means that the color buffers will be swapped at most every + * other video frame.) A return value of zero indicates success; otherwise an error occurred. The interval takes effect when {@link GLX#glXSwapBuffers SwapBuffers} + * is first called subsequent to the {@code glXSwapIntervalSGI} call. + * + *

    A video frame period is the time required by the monitor to display a full frame of video data. In the case of an interlaced monitor, this is typically + * the time required to display both the even and odd fields of a frame of video data.

    + * + * @param interval the swap interval + */ + @NativeType("GLint") + public static int glXSwapIntervalSGI(int interval) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXSwapIntervalSGI; + if (CHECKS) { + check(__functionAddress); + } + return callI(interval, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIVideoSync.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIVideoSync.java new file mode 100644 index 000000000..2a41bc3a1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIVideoSync.java @@ -0,0 +1,105 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the GLX_SGI_video_sync extension. + * + *

    This extension provides a means for synchronization with the video frame rate of a monitor.

    + */ +public class GLXSGIVideoSync { + + protected GLXSGIVideoSync() { + throw new UnsupportedOperationException(); + } + + // --- [ glXGetVideoSyncSGI ] --- + + /** Unsafe version of: {@link #glXGetVideoSyncSGI GetVideoSyncSGI} */ + public static int nglXGetVideoSyncSGI(long count) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetVideoSyncSGI; + if (CHECKS) { + check(__functionAddress); + } + return callPI(count, __functionAddress); + } + + /** + * Returns the value of the video sync counter in {@code count}. Zero is returned if the call is successful. + * + * @param count the video sync counter value + */ + @NativeType("GLint") + public static int glXGetVideoSyncSGI(@NativeType("unsigned int *") IntBuffer count) { + if (CHECKS) { + check(count, 1); + } + return nglXGetVideoSyncSGI(memAddress(count)); + } + + // --- [ glXWaitVideoSyncSGI ] --- + + /** Unsafe version of: {@link #glXWaitVideoSyncSGI WaitVideoSyncSGI} */ + public static int nglXWaitVideoSyncSGI(int divisor, int remainder, long count) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXWaitVideoSyncSGI; + if (CHECKS) { + check(__functionAddress); + } + return callPI(divisor, remainder, count, __functionAddress); + } + + /** + * Puts the calling process to sleep until + * + *

    {@code (C mod D) = R}

    + * + *

    where {@code C} is the video sync counter, {@code D} is specified by the {@code divisor} parameter of {@code glXWaitVideoSyncSGI}, and {@code R} is + * specified by the {@code remainder} parameter of {@code glXWaitVideoSyncSGI}. {@code glXWaitVideoSyncSGI} returns the current video sync counter value in + * {@code count}. Zero is returned by {@code glXWaitVideoSyncSGI} if it is successful.

    + * + * @param divisor the divisor value + * @param remainder the remainder value + * @param count the video sync counter value + */ + @NativeType("GLint") + public static int glXWaitVideoSyncSGI(int divisor, int remainder, @NativeType("unsigned int *") IntBuffer count) { + if (CHECKS) { + check(count, 1); + } + return nglXWaitVideoSyncSGI(divisor, remainder, memAddress(count)); + } + + /** Array version of: {@link #glXGetVideoSyncSGI GetVideoSyncSGI} */ + @NativeType("GLint") + public static int glXGetVideoSyncSGI(@NativeType("unsigned int *") int[] count) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetVideoSyncSGI; + if (CHECKS) { + check(__functionAddress); + check(count, 1); + } + return callPI(count, __functionAddress); + } + + /** Array version of: {@link #glXWaitVideoSyncSGI WaitVideoSyncSGI} */ + @NativeType("GLint") + public static int glXWaitVideoSyncSGI(int divisor, int remainder, @NativeType("unsigned int *") int[] count) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXWaitVideoSyncSGI; + if (CHECKS) { + check(__functionAddress); + check(count, 1); + } + return callPI(divisor, remainder, count, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXFBConfig.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXFBConfig.java new file mode 100644 index 000000000..003b376e4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXFBConfig.java @@ -0,0 +1,265 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +import org.lwjgl.system.linux.*; + +/** + * Native bindings to the GLX_SGIX_fbconfig extension. + * + *

    This extension introduces a new way to describe the capabilities of a GLX drawable (i.e., to describe the depth of color buffer components and the type + * and size of ancillary buffers), removes the "similarity" requirement when making a context current to a drawable, and supports RGBA rendering to + * one-and two-component Windows and GLX Pixmaps.

    + */ +public class GLXSGIXFBConfig { + + /** Accepted by the {@code attribute} parameter of {@link #glXGetFBConfigAttribSGIX GetFBConfigAttribSGIX}, and by the {@code attrib_list} parameter of {@link #glXChooseFBConfigSGIX ChooseFBConfigSGIX}. */ + public static final int + GLX_DRAWABLE_TYPE_SGIX = 0x8010, + GLX_RENDER_TYPE_SGIX = 0x8011, + GLX_X_RENDERABLE_SGIX = 0x8012; + + /** + * Accepted by the {@code attribute} parameter of {@link #glXGetFBConfigAttribSGIX GetFBConfigAttribSGIX}, the {@code attrib_list} parameter of {@link #glXChooseFBConfigSGIX ChooseFBConfigSGIX}, + * by the {@code attribute} parameter of {@link GLXSGIXPbuffer#glXQueryGLXPbufferSGIX QueryGLXPbufferSGIX} and by the {@code attribute} parameter of + * {@link GLXEXTImportContext#glXQueryContextInfoEXT QueryContextInfoEXT}. + */ + public static final int GLX_FBCONFIG_ID_SGIX = 0x8013; + + /** Accepted by the {@code attribute} parameter of {@link #glXGetFBConfigAttribSGIX GetFBConfigAttribSGIX}. */ + public static final int GLX_SCREEN_EXT = 0x800C; + + /** + * Returned by {@link #glXGetFBConfigAttribSGIX GetFBConfigAttribSGIX} (when {@code attribute} is set to {@link #GLX_DRAWABLE_TYPE_SGIX DRAWABLE_TYPE_SGIX}) and accepted by the {@code attrib_list} + * parameter of {@link #glXChooseFBConfigSGIX ChooseFBConfigSGIX} (following the {@link #GLX_DRAWABLE_TYPE_SGIX DRAWABLE_TYPE_SGIX} token). + */ + public static final int + GLX_WINDOW_BIT_SGIX = 0x1, + GLX_PIXMAP_BIT_SGIX = 0x2; + + /** + * Returned by {@link #glXGetFBConfigAttribSGIX GetFBConfigAttribSGIX} (when {@code attribute} is set to {@link #GLX_RENDER_TYPE_SGIX RENDER_TYPE_SGIX}) and accepted by the {@code attrib_list} + * parameter of {@link #glXChooseFBConfigSGIX ChooseFBConfigSGIX} (following the {@link #GLX_RENDER_TYPE_SGIX RENDER_TYPE_SGIX} token). + */ + public static final int + GLX_RGBA_BIT_SGIX = 0x1, + GLX_COLOR_INDEX_BIT_SGIX = 0x2; + + /** Accepted by the {@code render_type} parameter of {@link #glXCreateContextWithConfigSGIX CreateContextWithConfigSGIX}. */ + public static final int + GLX_RGBA_TYPE_SGIX = 0x8014, + GLX_COLOR_INDEX_TYPE_SGIX = 0x8015; + + protected GLXSGIXFBConfig() { + throw new UnsupportedOperationException(); + } + + // --- [ glXGetFBConfigAttribSGIX ] --- + + /** Unsafe version of: {@link #glXGetFBConfigAttribSGIX GetFBConfigAttribSGIX} */ + public static int nglXGetFBConfigAttribSGIX(long display, long config, int attribute, long value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetFBConfigAttribSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + } + return callPPPI(display, config, attribute, value, __functionAddress); + } + + /** + * Gets the value of a GLX attribute for a {@code GLXFBConfigSGIX}. + * + * @param display the connection to the X server + * @param config the {@code GLXFBConfigSGIX} being queried + * @param attribute the attribute to query + * @param value returns the attribute value + */ + public static int glXGetFBConfigAttribSGIX(@NativeType("Display *") long display, @NativeType("GLXFBConfigSGIX") long config, int attribute, @NativeType("int *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + return nglXGetFBConfigAttribSGIX(display, config, attribute, memAddress(value)); + } + + // --- [ glXChooseFBConfigSGIX ] --- + + /** + * Unsafe version of: {@link #glXChooseFBConfigSGIX ChooseFBConfigSGIX} + * + * @param nelements the number of {@code GLXFBConfigSGIX} returned + */ + public static long nglXChooseFBConfigSGIX(long display, int screen, long attrib_list, long nelements) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXChooseFBConfigSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPPPP(display, screen, attrib_list, nelements, __functionAddress); + } + + /** + * Gets {@code GLXFBConfigSGIX}s that match a list of attributes or to get the list of GLXFBConfigSGIXs that are available on the specified screen. + * + * @param display the connection to the X server + * @param screen the screen number + * @param attrib_list an optional list of attributes, terminated with org.lwjgl.system.linux.{@code None} + */ + @Nullable + @NativeType("GLXFBConfigSGIX *") + public static PointerBuffer glXChooseFBConfigSGIX(@NativeType("Display *") long display, int screen, @Nullable @NativeType("int const *") IntBuffer attrib_list) { + if (CHECKS) { + checkNTSafe(attrib_list); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer nelements = stack.callocInt(1); + try { + long __result = nglXChooseFBConfigSGIX(display, screen, memAddressSafe(attrib_list), memAddress(nelements)); + return memPointerBufferSafe(__result, nelements.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glXCreateGLXPixmapWithConfigSGIX ] --- + + /** + * Creates a GLX pixmap using a {@code GLXFBConfigSGIX}. + * + * @param display the connection to the X server + * @param config the {@code GLXFBConfigSGIX} + * @param pixmap the pixmap + */ + @NativeType("GLXPixmap") + public static long glXCreateGLXPixmapWithConfigSGIX(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, @NativeType("Pixmap") long pixmap) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateGLXPixmapWithConfigSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + } + return callPPNP(display, config, pixmap, __functionAddress); + } + + // --- [ glXCreateContextWithConfigSGIX ] --- + + /** + * Creates a GLX context using a {@code GLXFBConfigSGIX}. + * + * @param display the connection to the X server + * @param config the {@code GLXFBConfigSGIX} + * @param render_type the render type. One of:
    {@link #GLX_RGBA_TYPE_SGIX RGBA_TYPE_SGIX}{@link #GLX_COLOR_INDEX_TYPE_SGIX COLOR_INDEX_TYPE_SGIX}
    + * @param share_list the GLX context to share objects with + * @param direct direct rendering request + */ + @NativeType("GLXContext") + public static long glXCreateContextWithConfigSGIX(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, int render_type, @NativeType("GLXContext") long share_list, @NativeType("Bool") boolean direct) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateContextWithConfigSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + check(share_list); + } + return callPPPP(display, config, render_type, share_list, direct ? 1 : 0, __functionAddress); + } + + // --- [ glXGetVisualFromFBConfigSGIX ] --- + + /** Unsafe version of: {@link #glXGetVisualFromFBConfigSGIX GetVisualFromFBConfigSGIX} */ + public static long nglXGetVisualFromFBConfigSGIX(long display, long config) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetVisualFromFBConfigSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + } + return callPPP(display, config, __functionAddress); + } + + /** + * Retrieves the associated visual of a {@code GLXFBConfigSGIX}. + * + * @param display the connection to the X server + * @param config the {@code GLXFBConfigSGIX} + */ + @Nullable + @NativeType("XVisualInfo *") + public static XVisualInfo glXGetVisualFromFBConfigSGIX(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config) { + long __result = nglXGetVisualFromFBConfigSGIX(display, config); + return XVisualInfo.createSafe(__result); + } + + // --- [ glXGetFBConfigFromVisualSGIX ] --- + + /** Unsafe version of: {@link #glXGetFBConfigFromVisualSGIX GetFBConfigFromVisualSGIX} */ + public static long nglXGetFBConfigFromVisualSGIX(long display, long vis) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetFBConfigFromVisualSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + XVisualInfo.validate(vis); + } + return callPPP(display, vis, __functionAddress); + } + + /** + * Retrieves the {@code GLXFBConfigSGIX} associated with a visual. + * + * @param display the connection to the X server + * @param vis the visual + */ + @NativeType("GLXFBConfigSGIX") + public static long glXGetFBConfigFromVisualSGIX(@NativeType("Display *") long display, @NativeType("XVisualInfo *") XVisualInfo vis) { + return nglXGetFBConfigFromVisualSGIX(display, vis.address()); + } + + /** Array version of: {@link #glXGetFBConfigAttribSGIX GetFBConfigAttribSGIX} */ + public static int glXGetFBConfigAttribSGIX(@NativeType("Display *") long display, @NativeType("GLXFBConfigSGIX") long config, int attribute, @NativeType("int *") int[] value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetFBConfigAttribSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + check(value, 1); + } + return callPPPI(display, config, attribute, value, __functionAddress); + } + + /** Array version of: {@link #glXChooseFBConfigSGIX ChooseFBConfigSGIX} */ + @Nullable + @NativeType("GLXFBConfigSGIX *") + public static PointerBuffer glXChooseFBConfigSGIX(@NativeType("Display *") long display, int screen, @Nullable @NativeType("int const *") int[] attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXChooseFBConfigSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + checkNTSafe(attrib_list); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer nelements = stack.callocInt(1); + try { + long __result = callPPPP(display, screen, attrib_list, memAddress(nelements), __functionAddress); + return memPointerBufferSafe(__result, nelements.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXPbuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXPbuffer.java new file mode 100644 index 000000000..af29974d4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXPbuffer.java @@ -0,0 +1,230 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the GLX_SGIX_pbuffer extension. + * + *

    This extension defines pixel buffers (GLXPbuffers, or pbuffer for short). GLXPbuffers are additional non-visible rendering buffers for an OpenGL + * renderer.

    + */ +public class GLXSGIXPbuffer { + + /** Accepted by the {@code attribute} parameter of {@link GLXSGIXFBConfig#glXGetFBConfigAttribSGIX GetFBConfigAttribSGIX}. */ + public static final int + GLX_MAX_PBUFFER_WIDTH_SGIX = 0x8016, + GLX_MAX_PBUFFER_HEIGHT_SGIX = 0x8017, + GLX_MAX_PBUFFER_PIXELS_SGIX = 0x8018, + GLX_OPTIMAL_PBUFFER_WIDTH_SGIX = 0x8019, + GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX = 0x801A; + + /** + * Returned by {@link GLXSGIXFBConfig#glXGetFBConfigAttribSGIX GetFBConfigAttribSGIX} (when {@code attribute} is set to {@link GLXSGIXFBConfig#GLX_DRAWABLE_TYPE_SGIX DRAWABLE_TYPE_SGIX}) and + * accepted by the {@code attrib_list} parameter of {@link GLXSGIXFBConfig#glXChooseFBConfigSGIX ChooseFBConfigSGIX} (following the + * {@link GLXSGIXFBConfig#GLX_DRAWABLE_TYPE_SGIX DRAWABLE_TYPE_SGIX} token). + */ + public static final int GLX_PBUFFER_BIT_SGIX = 0x4; + + /** Accepted by the {@code attrib_list} parameter of {@link #glXCreateGLXPbufferSGIX CreateGLXPbufferSGIX} and by the {@code attribute} parameter of {@link #glXQueryGLXPbufferSGIX QueryGLXPbufferSGIX}. */ + public static final int + GLX_PRESERVED_CONTENTS_SGIX = 0x801B, + GLX_LARGEST_PBUFFER_SGIX = 0x801C; + + /** Accepted by the {@code attribute} parameter of {@link #glXQueryGLXPbufferSGIX QueryGLXPbufferSGIX}. */ + public static final int + GLX_WIDTH_SGIX = 0x801D, + GLX_HEIGHT_SGIX = 0x801E, + GLX_EVENT_MASK_SGIX = 0x801F; + + /** Accepted by the {@code mask} parameter of {@link #glXSelectEventSGIX SelectEventSGIX} and returned in the {@code mask} parameter of {@link #glXGetSelectedEventSGIX GetSelectedEventSGIX}. */ + public static final int GLX_BUFFER_CLOBBER_MASK_SGIX = 0x8000000; + + /** Returned in the {@code event_type} field of a "buffer clobber" event. */ + public static final int + GLX_DAMAGED_SGIX = 0x8020, + GLX_SAVED_SGIX = 0x8021; + + /** Returned in the {@code draw_type} field of a "buffer clobber" event. */ + public static final int + GLX_WINDOW_SGIX = 0x8022, + GLX_PBUFFER_SGIX = 0x8023; + + /** Returned in the {@code mask} field of a "buffer clobber" event. */ + public static final int + GLX_FRONT_LEFT_BUFFER_BIT_SGIX = 0x1, + GLX_FRONT_RIGHT_BUFFER_BIT_SGIX = 0x2, + GLX_BACK_LEFT_BUFFER_BIT_SGIX = 0x4, + GLX_BACK_RIGHT_BUFFER_BIT_SGIX = 0x8, + GLX_AUX_BUFFERS_BIT_SGIX = 0x10, + GLX_DEPTH_BUFFER_BIT_SGIX = 0x20, + GLX_STENCIL_BUFFER_BIT_SGIX = 0x40, + GLX_ACCUM_BUFFER_BIT_SGIX = 0x80, + GLX_SAMPLE_BUFFERS_BIT_SGIX = 0x100; + + protected GLXSGIXPbuffer() { + throw new UnsupportedOperationException(); + } + + // --- [ glXCreateGLXPbufferSGIX ] --- + + /** Unsafe version of: {@link #glXCreateGLXPbufferSGIX CreateGLXPbufferSGIX} */ + public static long nglXCreateGLXPbufferSGIX(long display, long config, int width, int height, long attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateGLXPbufferSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + } + return callPPPP(display, config, width, height, attrib_list, __functionAddress); + } + + /** + * Creates a single GLXPbuffer and returns its XID. + * + * @param display the connection to the X server + * @param config the {@code GLXFBConfig} + * @param width the pbuffer width + * @param height the pbuffer height + * @param attrib_list an optional null-terminated list of attributes + */ + @NativeType("GLXPbuffer") + public static long glXCreateGLXPbufferSGIX(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, @NativeType("unsigned int") int width, @NativeType("unsigned int") int height, @Nullable @NativeType("int *") IntBuffer attrib_list) { + if (CHECKS) { + checkNTSafe(attrib_list); + } + return nglXCreateGLXPbufferSGIX(display, config, width, height, memAddressSafe(attrib_list)); + } + + // --- [ glXDestroyGLXPbufferSGIX ] --- + + /** + * Destroys a GLXPbuffer. + * + * @param display the connection to the X server + * @param pbuf the pbuffer to destroy + */ + public static void glXDestroyGLXPbufferSGIX(@NativeType("Display *") long display, @NativeType("GLXPbuffer") long pbuf) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXDestroyGLXPbufferSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(pbuf); + } + callPPV(display, pbuf, __functionAddress); + } + + // --- [ glXQueryGLXPbufferSGIX ] --- + + /** Unsafe version of: {@link #glXQueryGLXPbufferSGIX QueryGLXPbufferSGIX} */ + public static void nglXQueryGLXPbufferSGIX(long display, long pbuf, int attribute, long value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryGLXPbufferSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(pbuf); + } + callPPPV(display, pbuf, attribute, value, __functionAddress); + } + + /** + * Queries an attribute associated with a GLXPbuffer. + * + * @param display the connection to the X server + * @param pbuf the pbuffer being queried + * @param attribute the attribute to query + * @param value returns the attribute value + */ + public static void glXQueryGLXPbufferSGIX(@NativeType("Display *") long display, @NativeType("GLXPbuffer") long pbuf, int attribute, @NativeType("unsigned int *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglXQueryGLXPbufferSGIX(display, pbuf, attribute, memAddress(value)); + } + + // --- [ glXSelectEventSGIX ] --- + + /** + * Selects which GLX events should be received on a GLXdrawable. + * + * @param display the connection to the X server + * @param drawable the GLXDrawable + * @param mask the selection mask + */ + public static void glXSelectEventSGIX(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, @NativeType("unsigned long") long mask) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXSelectEventSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + } + callPPNV(display, drawable, mask, __functionAddress); + } + + // --- [ glXGetSelectedEventSGIX ] --- + + /** Unsafe version of: {@link #glXGetSelectedEventSGIX GetSelectedEventSGIX} */ + public static void nglXGetSelectedEventSGIX(long display, long drawable, long mask) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXGetSelectedEventSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + } + callPPPV(display, drawable, mask, __functionAddress); + } + + /** + * Returns which GLX events are selected for a GLXdrawable. + * + * @param display the connection to the X server + * @param drawable the GLXDrawable + * @param mask returns the selection mask + */ + public static void glXGetSelectedEventSGIX(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, @NativeType("unsigned long *") CLongBuffer mask) { + if (CHECKS) { + check(mask, 1); + } + nglXGetSelectedEventSGIX(display, drawable, memAddress(mask)); + } + + /** Array version of: {@link #glXCreateGLXPbufferSGIX CreateGLXPbufferSGIX} */ + @NativeType("GLXPbuffer") + public static long glXCreateGLXPbufferSGIX(@NativeType("Display *") long display, @NativeType("GLXFBConfig") long config, @NativeType("unsigned int") int width, @NativeType("unsigned int") int height, @Nullable @NativeType("int *") int[] attrib_list) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXCreateGLXPbufferSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(config); + checkNTSafe(attrib_list); + } + return callPPPP(display, config, width, height, attrib_list, __functionAddress); + } + + /** Array version of: {@link #glXQueryGLXPbufferSGIX QueryGLXPbufferSGIX} */ + public static void glXQueryGLXPbufferSGIX(@NativeType("Display *") long display, @NativeType("GLXPbuffer") long pbuf, int attribute, @NativeType("unsigned int *") int[] value) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryGLXPbufferSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(pbuf); + check(value, 1); + } + callPPPV(display, pbuf, attribute, value, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXSwapBarrier.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXSwapBarrier.java new file mode 100644 index 000000000..0c9f64490 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXSwapBarrier.java @@ -0,0 +1,88 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the GLX_SGIX_swap_barrier extension. + * + *

    This extension provides the capability to sychronize the buffer swaps of different swap groups.

    + * + *

    Requires {@link GLXSGIXSwapGroup GLX_SGIX_swap_group}.

    + */ +public class GLXSGIXSwapBarrier { + + protected GLXSGIXSwapBarrier() { + throw new UnsupportedOperationException(); + } + + // --- [ glXBindSwapBarrierSGIX ] --- + + /** + * Binds the swap group that contains {@code drawable} to {@code barrier}. Subsequent buffer swaps for that group will be subject to this binding, until + * the group is unbound from {@code barrier}. If {@code barrier} is zero, the group is unbound from its current barrier, if any. + * + * @param display the connection to the X server + * @param drawable the swap group GLXDrawable + * @param barrier the swap barrier + */ + public static void glXBindSwapBarrierSGIX(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, int barrier) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXBindSwapBarrierSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + } + callPPV(display, drawable, barrier, __functionAddress); + } + + // --- [ glXQueryMaxSwapBarriersSGIX ] --- + + /** Unsafe version of: {@link #glXQueryMaxSwapBarriersSGIX QueryMaxSwapBarriersSGIX} */ + public static int nglXQueryMaxSwapBarriersSGIX(long display, int screen, long max) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryMaxSwapBarriersSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + } + return callPPI(display, screen, max, __functionAddress); + } + + /** + * Returns in {@code max} the maximum number of barriers supported by an implementation on {@code screen}. + * + * @param display the connection to the X server + * @param screen the screen + * @param max returns the maximum number of barriers + */ + @NativeType("Bool") + public static boolean glXQueryMaxSwapBarriersSGIX(@NativeType("Display *") long display, int screen, @NativeType("int *") IntBuffer max) { + if (CHECKS) { + check(max, 1); + } + return nglXQueryMaxSwapBarriersSGIX(display, screen, memAddress(max)) != 0; + } + + /** Array version of: {@link #glXQueryMaxSwapBarriersSGIX QueryMaxSwapBarriersSGIX} */ + @NativeType("Bool") + public static boolean glXQueryMaxSwapBarriersSGIX(@NativeType("Display *") long display, int screen, @NativeType("int *") int[] max) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXQueryMaxSwapBarriersSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(max, 1); + } + return callPPI(display, screen, max, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXSwapGroup.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXSwapGroup.java new file mode 100644 index 000000000..71ebde3d0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXSGIXSwapGroup.java @@ -0,0 +1,48 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the GLX_SGIX_swap_group extension. + * + *

    This extension provides the capability to synchronize the buffer swaps of a group of GLX drawables. A swap group is created, and drawables are added as + * members to the swap group. Buffer swaps to members of the swap group will then take place concurrently.

    + * + *

    This extension extends the set of conditions that must be met before a buffer swap can take place.

    + */ +public class GLXSGIXSwapGroup { + + protected GLXSGIXSwapGroup() { + throw new UnsupportedOperationException(); + } + + // --- [ glXJoinSwapGroupSGIX ] --- + + /** + * Adds {@code drawable} to the swap group containing {@code member} as a member. If {@code drawable} is already a member of a different group, it is + * implicitly removed from that group first. If {@code member} is {@code None}, {@code drawable} is removed from the swap group that it belongs to, if + * any. + * + * @param display the connection to the X server + * @param drawable the GLXDrawable to add to the swap group + * @param member a member of the swap group or {@code None} + */ + public static void glXJoinSwapGroupSGIX(@NativeType("Display *") long display, @NativeType("GLXDrawable") long drawable, @NativeType("GLXDrawable") long member) { + long __functionAddress = GL.getCapabilitiesGLXClient().glXJoinSwapGroupSGIX; + if (CHECKS) { + check(__functionAddress); + check(display); + check(drawable); + } + callPPPV(display, drawable, member, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXStereoNotifyEventEXT.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXStereoNotifyEventEXT.java new file mode 100644 index 000000000..dc33e1b9b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GLXStereoNotifyEventEXT.java @@ -0,0 +1,229 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Layout

    + * + *
    
    + * struct GLXStereoNotifyEventEXT {
    + *     int {@link #type};
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     int {@link #extension};
    + *     int {@link #evtype};
    + *     GLXDrawable {@link #window};
    + *     Bool {@link #stereo_tree};
    + * }
    + */ +public class GLXStereoNotifyEventEXT extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + EXTENSION, + EVTYPE, + WINDOW, + STEREO_TREE; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + EXTENSION = layout.offsetof(4); + EVTYPE = layout.offsetof(5); + WINDOW = layout.offsetof(6); + STEREO_TREE = layout.offsetof(7); + } + + protected GLXStereoNotifyEventEXT(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected GLXStereoNotifyEventEXT create(long address, @Nullable ByteBuffer container) { + return new GLXStereoNotifyEventEXT(address, container); + } + + /** + * Creates a {@code GLXStereoNotifyEventEXT} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public GLXStereoNotifyEventEXT(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** GenericEvent */ + public int type() { return ntype(address()); } + /** \# of last request server processed */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** {@code True} if generated by {@code SendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** display the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** GLX major opcode, from {@code XQueryExtension} */ + public int extension() { return nextension(address()); } + /** always {@code GLX_STEREO_NOTIFY_EXT} */ + public int evtype() { return nevtype(address()); } + /** XID of the X window affected */ + @NativeType("GLXDrawable") + public long window() { return nwindow(address()); } + /** {@code True} if tree contains stereo windows */ + @NativeType("Bool") + public boolean stereo_tree() { return nstereo_tree(address()) != 0; } + + // ----------------------------------- + + /** Returns a new {@code GLXStereoNotifyEventEXT} instance for the specified memory address. */ + public static GLXStereoNotifyEventEXT create(long address) { + return new GLXStereoNotifyEventEXT(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static GLXStereoNotifyEventEXT createSafe(long address) { + return address == NULL ? null : new GLXStereoNotifyEventEXT(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + GLXStereoNotifyEventEXT.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + GLXStereoNotifyEventEXT.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + GLXStereoNotifyEventEXT.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + GLXStereoNotifyEventEXT.DISPLAY); } + /** Unsafe version of {@link #extension}. */ + public static int nextension(long struct) { return UNSAFE.getInt(null, struct + GLXStereoNotifyEventEXT.EXTENSION); } + /** Unsafe version of {@link #evtype}. */ + public static int nevtype(long struct) { return UNSAFE.getInt(null, struct + GLXStereoNotifyEventEXT.EVTYPE); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetAddress(struct + GLXStereoNotifyEventEXT.WINDOW); } + /** Unsafe version of {@link #stereo_tree}. */ + public static int nstereo_tree(long struct) { return UNSAFE.getInt(null, struct + GLXStereoNotifyEventEXT.STEREO_TREE); } + + // ----------------------------------- + + /** An array of {@link GLXStereoNotifyEventEXT} structs. */ + public static class Buffer extends StructBuffer { + + private static final GLXStereoNotifyEventEXT ELEMENT_FACTORY = GLXStereoNotifyEventEXT.create(-1L); + + /** + * Creates a new {@code GLXStereoNotifyEventEXT.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link GLXStereoNotifyEventEXT#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected GLXStereoNotifyEventEXT getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link GLXStereoNotifyEventEXT#type} field. */ + public int type() { return GLXStereoNotifyEventEXT.ntype(address()); } + /** @return the value of the {@link GLXStereoNotifyEventEXT#serial} field. */ + @NativeType("unsigned long") + public long serial() { return GLXStereoNotifyEventEXT.nserial(address()); } + /** @return the value of the {@link GLXStereoNotifyEventEXT#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return GLXStereoNotifyEventEXT.nsend_event(address()) != 0; } + /** @return the value of the {@link GLXStereoNotifyEventEXT#display} field. */ + @NativeType("Display *") + public long display() { return GLXStereoNotifyEventEXT.ndisplay(address()); } + /** @return the value of the {@link GLXStereoNotifyEventEXT#extension} field. */ + public int extension() { return GLXStereoNotifyEventEXT.nextension(address()); } + /** @return the value of the {@link GLXStereoNotifyEventEXT#evtype} field. */ + public int evtype() { return GLXStereoNotifyEventEXT.nevtype(address()); } + /** @return the value of the {@link GLXStereoNotifyEventEXT#window} field. */ + @NativeType("GLXDrawable") + public long window() { return GLXStereoNotifyEventEXT.nwindow(address()); } + /** @return the value of the {@link GLXStereoNotifyEventEXT#stereo_tree} field. */ + @NativeType("Bool") + public boolean stereo_tree() { return GLXStereoNotifyEventEXT.nstereo_tree(address()) != 0; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GPU_DEVICE.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GPU_DEVICE.java new file mode 100644 index 000000000..159dfc963 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GPU_DEVICE.java @@ -0,0 +1,335 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +import org.lwjgl.system.windows.*; + +/** + * Receives information about the display device specified by the {@code deviceIndex} parameter of the {@link WGLNVGPUAffinity#wglEnumGpuDevicesNV EnumGpuDevicesNV} function. + * + *

    Layout

    + * + *
    
    + * struct GPU_DEVICE {
    + *     DWORD {@link #cb};
    + *     CHAR {@link #DeviceName}[32];
    + *     CHAR {@link #DeviceString}[128];
    + *     DWORD {@link #Flags};
    + *     {@link RECT RECT} {@link #rcVirtualScreen};
    + * }
    + */ +public class GPU_DEVICE extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + CB, + DEVICENAME, + DEVICESTRING, + FLAGS, + RCVIRTUALSCREEN; + + static { + Layout layout = __struct( + __member(4), + __array(1, 32), + __array(1, 128), + __member(4), + __member(RECT.SIZEOF, RECT.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + CB = layout.offsetof(0); + DEVICENAME = layout.offsetof(1); + DEVICESTRING = layout.offsetof(2); + FLAGS = layout.offsetof(3); + RCVIRTUALSCREEN = layout.offsetof(4); + } + + protected GPU_DEVICE(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected GPU_DEVICE create(long address, @Nullable ByteBuffer container) { + return new GPU_DEVICE(address, container); + } + + /** + * Creates a {@code GPU_DEVICE} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public GPU_DEVICE(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the size of the {@code GPU_DEVICE} structure. Before calling {@link WGLNVGPUAffinity#wglEnumGpuDevicesNV EnumGpuDevicesNV}, set {@code cb} to the size, in bytes, of {@code GPU_DEVICE}. */ + @NativeType("DWORD") + public int cb() { return ncb(address()); } + /** + * a string identifying the display device name. This will be the same string as stored in the {@code DeviceName} field of the {@code DISPLAY_DEVICE} + * structure, which is filled in by {@code EnumDisplayDevices}. + */ + @NativeType("CHAR[32]") + public ByteBuffer DeviceName() { return nDeviceName(address()); } + /** + * a string identifying the display device name. This will be the same string as stored in the {@code DeviceName} field of the {@code DISPLAY_DEVICE} + * structure, which is filled in by {@code EnumDisplayDevices}. + */ + @NativeType("CHAR[32]") + public String DeviceNameString() { return nDeviceNameString(address()); } + /** + * a string describing the GPU for this display device. It is the same string as stored in the {@code DeviceString} field in the {@code DISPLAY_DEVICE} + * structure that is filled in by {@code EnumDisplayDevices} when it describes a display adapter (and not a monitor). + */ + @NativeType("CHAR[128]") + public ByteBuffer DeviceString() { return nDeviceString(address()); } + /** + * a string describing the GPU for this display device. It is the same string as stored in the {@code DeviceString} field in the {@code DISPLAY_DEVICE} + * structure that is filled in by {@code EnumDisplayDevices} when it describes a display adapter (and not a monitor). + */ + @NativeType("CHAR[128]") + public String DeviceStringString() { return nDeviceStringString(address()); } + /** indicates the state of the display device */ + @NativeType("DWORD") + public int Flags() { return nFlags(address()); } + /** + * specifies the display device rectangle, in virtual screen coordinates. The value of {@code rcVirtualScreen} is undefined if the device is not part of + * the desktop, i.e. {@code DISPLAY_DEVICE_ATTACHED_TO_DESKTOP} is not set in the {@code Flags} field. + */ + public RECT rcVirtualScreen() { return nrcVirtualScreen(address()); } + + // ----------------------------------- + + /** Returns a new {@code GPU_DEVICE} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static GPU_DEVICE malloc() { + return new GPU_DEVICE(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code GPU_DEVICE} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static GPU_DEVICE calloc() { + return new GPU_DEVICE(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code GPU_DEVICE} instance allocated with {@link BufferUtils}. */ + public static GPU_DEVICE create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new GPU_DEVICE(memAddress(container), container); + } + + /** Returns a new {@code GPU_DEVICE} instance for the specified memory address. */ + public static GPU_DEVICE create(long address) { + return new GPU_DEVICE(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static GPU_DEVICE createSafe(long address) { + return address == NULL ? null : new GPU_DEVICE(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static GPU_DEVICE mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static GPU_DEVICE callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static GPU_DEVICE mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static GPU_DEVICE callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code GPU_DEVICE} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static GPU_DEVICE malloc(MemoryStack stack) { + return new GPU_DEVICE(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code GPU_DEVICE} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static GPU_DEVICE calloc(MemoryStack stack) { + return new GPU_DEVICE(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #cb}. */ + public static int ncb(long struct) { return UNSAFE.getInt(null, struct + GPU_DEVICE.CB); } + /** Unsafe version of {@link #DeviceName}. */ + public static ByteBuffer nDeviceName(long struct) { return memByteBuffer(struct + GPU_DEVICE.DEVICENAME, 32); } + /** Unsafe version of {@link #DeviceNameString}. */ + public static String nDeviceNameString(long struct) { return memASCII(struct + GPU_DEVICE.DEVICENAME); } + /** Unsafe version of {@link #DeviceString}. */ + public static ByteBuffer nDeviceString(long struct) { return memByteBuffer(struct + GPU_DEVICE.DEVICESTRING, 128); } + /** Unsafe version of {@link #DeviceStringString}. */ + public static String nDeviceStringString(long struct) { return memASCII(struct + GPU_DEVICE.DEVICESTRING); } + /** Unsafe version of {@link #Flags}. */ + public static int nFlags(long struct) { return UNSAFE.getInt(null, struct + GPU_DEVICE.FLAGS); } + /** Unsafe version of {@link #rcVirtualScreen}. */ + public static RECT nrcVirtualScreen(long struct) { return RECT.create(struct + GPU_DEVICE.RCVIRTUALSCREEN); } + + // ----------------------------------- + + /** An array of {@link GPU_DEVICE} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final GPU_DEVICE ELEMENT_FACTORY = GPU_DEVICE.create(-1L); + + /** + * Creates a new {@code GPU_DEVICE.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link GPU_DEVICE#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected GPU_DEVICE getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link GPU_DEVICE#cb} field. */ + @NativeType("DWORD") + public int cb() { return GPU_DEVICE.ncb(address()); } + /** @return a {@link ByteBuffer} view of the {@link GPU_DEVICE#DeviceName} field. */ + @NativeType("CHAR[32]") + public ByteBuffer DeviceName() { return GPU_DEVICE.nDeviceName(address()); } + /** @return the null-terminated string stored in the {@link GPU_DEVICE#DeviceName} field. */ + @NativeType("CHAR[32]") + public String DeviceNameString() { return GPU_DEVICE.nDeviceNameString(address()); } + /** @return a {@link ByteBuffer} view of the {@link GPU_DEVICE#DeviceString} field. */ + @NativeType("CHAR[128]") + public ByteBuffer DeviceString() { return GPU_DEVICE.nDeviceString(address()); } + /** @return the null-terminated string stored in the {@link GPU_DEVICE#DeviceString} field. */ + @NativeType("CHAR[128]") + public String DeviceStringString() { return GPU_DEVICE.nDeviceStringString(address()); } + /** @return the value of the {@link GPU_DEVICE#Flags} field. */ + @NativeType("DWORD") + public int Flags() { return GPU_DEVICE.nFlags(address()); } + /** @return a {@link RECT} view of the {@link GPU_DEVICE#rcVirtualScreen} field. */ + public RECT rcVirtualScreen() { return GPU_DEVICE.nrcVirtualScreen(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GREMEDYFrameTerminator.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GREMEDYFrameTerminator.java new file mode 100644 index 000000000..6651cf865 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GREMEDYFrameTerminator.java @@ -0,0 +1,43 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the GREMEDY_frame_terminator extension. + * + *

    This extension defines a mechanism that enables marking the end of render frames within the OpenGL stream.

    + * + *

    When debugging or profiling an OpenGL application, the debuggers and profilers needs to know when a render frame is ended. This is important for frame + * per second measurements, statistical analysis, marking and clearing stream loggers logs, performance counters sampling and more.

    + * + *

    When an application uses off screen buffers, the debugger / profiler cannot be guaranteed that the application will call a certain function at the end + * of each off-screen frame (e.g: SwapBuffers / glClear / etc). This extension enables the application to notify the debugger / profiler whenever a render + * frame is ended.

    + * + *

    This extension is mainly useful for debuggers and profilers. It is not expected that standard drivers would implement this extension. The main point of + * having this extension is to allow applications to have a clean way of accessing this functionality only when they are run under the control of a + * debugger / profiler, without having to recompile or change the application source code.

    + */ +public class GREMEDYFrameTerminator { + + static { GL.initialize(); } + + protected GREMEDYFrameTerminator() { + throw new UnsupportedOperationException(); + } + + // --- [ glFrameTerminatorGREMEDY ] --- + + /** + * Can be used to insert a frame terminator marker into the command stream. This frame terminator marker can be used by appropriate debugging tools / + * profiling tools / profiling drivers for frame per second measurements, statistical analysis, marking and clearing stream loggers logs, performance + * counters sampling and more. This command has no influence on the rendered image or the OpenGL state. + */ + public static native void glFrameTerminatorGREMEDY(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GREMEDYStringMarker.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GREMEDYStringMarker.java new file mode 100644 index 000000000..b2713a406 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GREMEDYStringMarker.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the GREMEDY_string_marker extension. + * + *

    This extension defines a mechanism to insert textual markers into the OpenGL stream.

    + * + *

    When debugging or profiling an OpenGL application some of the most important tools are stream loggers, which just output a list of the called OpenGL + * commands, and profilers, which show at which points the pipeline is bottlenecked for a given part of the frame. The problem in using these is that + * there is a definite loss of information between the application and the used debugger/profiler. The application generally has a pretty good idea what + * is rendered when (e.g. rendering background, landscape, building, players, particle effects, bullets etc.), but the debugger/profiler only sees the + * OpenGL stream. To analyze the stream developers have to guess what is done when by following the program code and the log output in parallel, which can + * get difficult for systems that restructure their internal pipeline or do lazy changes.

    + * + *

    This extension is really only useful for these debuggers and profilers, and not for actual drivers. In fact, it is not expected that any standard + * driver would ever implement this extension. The main point of having this extension is to allow applications to have a clean way of accessing this + * functionality only when they are run under the control of a debugger/profiler, without having to recompile or change the application source code.

    + */ +public class GREMEDYStringMarker { + + static { GL.initialize(); } + + protected GREMEDYStringMarker() { + throw new UnsupportedOperationException(); + } + + // --- [ glStringMarkerGREMEDY ] --- + + /** + * Unsafe version of: {@link #glStringMarkerGREMEDY StringMarkerGREMEDY} + * + * @param len the length of the array. If {@code string} is null-terminated, {@code len} should not include the terminator. If {@code len} is 0, then the string + * is assumed to be null-terminated. + */ + public static native void nglStringMarkerGREMEDY(int len, long string); + + /** + * Can be used to insert arbitrary marker strings into the command stream that can be recorded by appropriate debugging tools / profiling tools / drivers. + * They have no influence on the rendered image or the OpenGL state. + * + * @param string a pointer to the array of bytes representing the marker being inserted, which need not be null-terminated + */ + public static void glStringMarkerGREMEDY(@NativeType("GLchar const *") ByteBuffer string) { + nglStringMarkerGREMEDY(string.remaining(), memAddress(string)); + } + + /** + * Can be used to insert arbitrary marker strings into the command stream that can be recorded by appropriate debugging tools / profiling tools / drivers. + * They have no influence on the rendered image or the OpenGL state. + * + * @param string a pointer to the array of bytes representing the marker being inserted, which need not be null-terminated + */ + public static void glStringMarkerGREMEDY(@NativeType("GLchar const *") CharSequence string) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + int stringEncodedLength = stack.nUTF8(string, false); + long stringEncoded = stack.getPointerAddress(); + nglStringMarkerGREMEDY(stringEncodedLength, stringEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GlobalLock.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GlobalLock.java new file mode 100644 index 000000000..0dc7c5eec --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/GlobalLock.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +/** + * This class contains the global lock that LWJGL will use to + * synchronize access to Display. + */ +final class GlobalLock { + static final Object lock = new Object(); +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELBlackholeRender.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELBlackholeRender.java new file mode 100644 index 000000000..061ee6573 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELBlackholeRender.java @@ -0,0 +1,28 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the INTEL_blackhole_render extension. + * + *

    The purpose of this extension is to allow an application to disable all rendering operations emitted to the GPU through the OpenGL rendering commands + * ({@code Draw*}, {@code DispatchCompute*}, {@code BlitFramebuffer}, etc...). Changes to the OpenGL pipeline are not affected.

    + * + *

    New preprocessor {@code #defines} are added to the OpenGL Shading Language:

    + * + *
    
    + * #define GL_INTEL_blackhole_render 1
    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ +public final class INTELBlackholeRender { + + /** Accepted by the {@code target} parameter of Enable, Disable, IsEnabled. */ + public static final int GL_BLACKHOLE_RENDER_INTEL = 0x83FC; + + private INTELBlackholeRender() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELConservativeRasterization.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELConservativeRasterization.java new file mode 100644 index 000000000..02dd7614b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELConservativeRasterization.java @@ -0,0 +1,31 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the INTEL_conservative_rasterization extension. + * + *

    Regular rasterization includes fragments with at least one sample covered by a polygon. Conservative rasterization includes all fragments that are at + * least partially covered by the polygon.

    + * + *

    In some use cases, it is also important to know if a fragment is fully covered by a polygon, i.e. if all parts of the fragment are within the polygon. + * An application may, for example, want to process fully covered fragments different from the "edge" pixels. This extension adds an option for the + * fragment shader to receive this information via {@code gl_SampleMaskIn[]}.

    + * + *

    This extension affects only polygons in {@link GL11#GL_FILL FILL} mode and specifically does not imply any changes in processing of lines or points.

    + * + *

    Conservative rasterization automatically disables polygon antialiasing rasterization if enabled by {@link GL11#GL_POLYGON_SMOOTH POLYGON_SMOOTH}.

    + * + *

    Requires {@link GL42 OpenGL 4.2}.

    + */ +public final class INTELConservativeRasterization { + + /** Accepted by the {@code target} parameter of {@link GL11#glEnable Enable}, {@link GL11#glDisable Disable}, {@link GL11#glIsEnabled IsEnabled}. */ + public static final int GL_CONSERVATIVE_RASTERIZATION_INTEL = 0x83FE; + + private INTELConservativeRasterization() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELFramebufferCMAA.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELFramebufferCMAA.java new file mode 100644 index 000000000..0ad37a665 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELFramebufferCMAA.java @@ -0,0 +1,43 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the INTEL_framebuffer_CMAA extension. + * + *

    Multisampling is a mechanism to antialias all GL primitives and is part of the GL specification.

    + * + *

    Better visual quality can be achieved by applying multisampling. However, on certain platforms it comes at a high performance cost. In general, the + * greater number of samples per pixel, the bigger the cost.

    + * + *

    Conservative Morphological Anti-Aliasing (CMAA) is an alternative approach to antialiasing, which operates on the final image. This post processing + * technique results in image quality comparable to multisampling at much lower cost and better performance.

    + * + *

    This extension incorporates an optimized CMAA algorithm implementation into the GL implementation.

    + * + *

    For more information on CMAA refer to software.intel.com.

    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ +public class INTELFramebufferCMAA { + + static { GL.initialize(); } + + protected INTELFramebufferCMAA() { + throw new UnsupportedOperationException(); + } + + // --- [ glApplyFramebufferAttachmentCMAAINTEL ] --- + + /** + * Requests the post processing of current draw buffers pertaining to the framebuffer bound to the {@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER} target according to the + * Conservative Morphological Anti-Aliasing algorithm. + */ + public static native void glApplyFramebufferAttachmentCMAAINTEL(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELMapTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELMapTexture.java new file mode 100644 index 000000000..e02575760 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELMapTexture.java @@ -0,0 +1,203 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the INTEL_map_texture extension. + * + *

    Systems with integrated GPUs can share the same physical memory between CPU and GPU. This feature, if exposed by API, can bring significant performance + * benefits for graphics applications by reducing the complexity of uploading/accessing texture contents. This extension enables CPU direct access to the + * GPU memory holding textures.

    + * + *

    The problem with texture memory directly exposed to clients is that textures are often 'tiled'. Texels are kept in specific layout to improve locality + * of reference and thus performance of texturing. This 'tiling' is specific to particular hardware and would be thus difficult to use.

    + * + *

    This extension allows to create textures with 'linear' layout which allows for simplified access on user side (potentially sacrificing some performance + * during texture sampling).

    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ +public class INTELMapTexture { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of TexParameteri, for target TEXTURE_2D. */ + public static final int GL_TEXTURE_MEMORY_LAYOUT_INTEL = 0x83FF; + + /** Accepted by the {@code params} when {@code pname} is set to {@code TEXTURE_MEMORY_LAYOUT_INTEL}. */ + public static final int + GL_LAYOUT_DEFAULT_INTEL = 0, + GL_LAYOUT_LINEAR_INTEL = 1, + GL_LAYOUT_LINEAR_CPU_CACHED_INTEL = 2; + + protected INTELMapTexture() { + throw new UnsupportedOperationException(); + } + + // --- [ glSyncTextureINTEL ] --- + + /** + * Makes sure that changes made by CPU are visible to GPU by flushing texture cache in GPU. The GL implementation tracks the cache usage and ignores the + * command if such flush is not needed. + * + *

    It is worth noting that this extension does not address automatic synchronization between CPU and GPU when both entities operate on the same texture at + * the same time. This is up to the application to assure such synchronization. Otherwise, the results may not be deterministic (writes from different + * entities may interleave in a non-deterministic way).

    + * + * @param texture the texture to synchronize + */ + public static native void glSyncTextureINTEL(@NativeType("GLuint") int texture); + + // --- [ glUnmapTexture2DINTEL ] --- + + /** + * Releases the pointer obtained previously via {@link #glMapTexture2DINTEL MapTexture2DINTEL}. This means that virtual memory space dedicated to make the texture available via a + * pointer is released and an application can no longer assume this memory is accessible from CPU. Successful execution of this command has an additional + * effect as if {@link #glSyncTextureINTEL SyncTextureINTEL} was called with {@code texture} parameter. + * + * @param texture the texture to unmap + * @param level the mipmap level-of-detail of the texture + */ + public static native void glUnmapTexture2DINTEL(@NativeType("GLuint") int texture, @NativeType("GLint") int level); + + // --- [ glMapTexture2DINTEL ] --- + + /** Unsafe version of: {@link #glMapTexture2DINTEL MapTexture2DINTEL} */ + public static native long nglMapTexture2DINTEL(int texture, int level, int access, long stride, long layout); + + /** + * Attempts to return a direct pointer to the graphics storage for 2D texture indicated by the {@code texture} parameter. + * + *

    LWJGL note: If glMapTexture2DINTEL without an explicit length argument is used and direct-state-access functionality is not available in the + * current context, the texture object must currently be bound to the GL_TEXTURE_2D target.

    + * + * @param texture the texture to map + * @param level the mipmap level-of-detail of the texture + * @param access the type of access that will be performed by the application. One of:
    {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}
    + * @param stride returns the distance in bytes between subsequent rows in the texture + * @param layout returns the internal layout of the texture in the graphics memory + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapTexture2DINTEL(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLbitfield") int access, @NativeType("GLint *") IntBuffer stride, @NativeType("GLenum *") IntBuffer layout) { + if (CHECKS) { + check(stride, 1); + check(layout, 1); + } + long __result = nglMapTexture2DINTEL(texture, level, access, memAddress(stride), memAddress(layout)); + return memByteBufferSafe(__result, getStride(stride) * GLChecks.getTexLevelParameteri(texture, GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT)); + } + + /** + * Attempts to return a direct pointer to the graphics storage for 2D texture indicated by the {@code texture} parameter. + * + *

    LWJGL note: If glMapTexture2DINTEL without an explicit length argument is used and direct-state-access functionality is not available in the + * current context, the texture object must currently be bound to the GL_TEXTURE_2D target.

    + * + * @param texture the texture to map + * @param level the mipmap level-of-detail of the texture + * @param access the type of access that will be performed by the application. One of:
    {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}
    + * @param stride returns the distance in bytes between subsequent rows in the texture + * @param layout returns the internal layout of the texture in the graphics memory + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapTexture2DINTEL(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLbitfield") int access, @NativeType("GLint *") IntBuffer stride, @NativeType("GLenum *") IntBuffer layout, @Nullable ByteBuffer old_buffer) { + if (CHECKS) { + check(stride, 1); + check(layout, 1); + } + long __result = nglMapTexture2DINTEL(texture, level, access, memAddress(stride), memAddress(layout)); + int length = getStride(stride) * GLChecks.getTexLevelParameteri(texture, GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT); + return apiGetMappedBuffer(old_buffer, __result, length); + } + + /** + * Attempts to return a direct pointer to the graphics storage for 2D texture indicated by the {@code texture} parameter. + * + *

    LWJGL note: If glMapTexture2DINTEL without an explicit length argument is used and direct-state-access functionality is not available in the + * current context, the texture object must currently be bound to the GL_TEXTURE_2D target.

    + * + * @param texture the texture to map + * @param level the mipmap level-of-detail of the texture + * @param access the type of access that will be performed by the application. One of:
    {@link GL30#GL_MAP_READ_BIT MAP_READ_BIT}{@link GL30#GL_MAP_WRITE_BIT MAP_WRITE_BIT}
    + * @param stride returns the distance in bytes between subsequent rows in the texture + * @param layout returns the internal layout of the texture in the graphics memory + */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapTexture2DINTEL(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLbitfield") int access, @NativeType("GLint *") IntBuffer stride, @NativeType("GLenum *") IntBuffer layout, long length, @Nullable ByteBuffer old_buffer) { + if (CHECKS) { + check(stride, 1); + check(layout, 1); + } + long __result = nglMapTexture2DINTEL(texture, level, access, memAddress(stride), memAddress(layout)); + return apiGetMappedBuffer(old_buffer, __result, (int)length); + } + + /** Array version of: {@link #glMapTexture2DINTEL MapTexture2DINTEL} */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapTexture2DINTEL(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLbitfield") int access, @NativeType("GLint *") int[] stride, @NativeType("GLenum *") int[] layout) { + long __functionAddress = GL.getICD().glMapTexture2DINTEL; + if (CHECKS) { + check(__functionAddress); + check(stride, 1); + check(layout, 1); + } + long __result = callPPP(texture, level, access, stride, layout, __functionAddress); + return memByteBufferSafe(__result, getStride(stride) * GLChecks.getTexLevelParameteri(texture, GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT)); + } + + /** Array version of: {@link #glMapTexture2DINTEL MapTexture2DINTEL} */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapTexture2DINTEL(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLbitfield") int access, @NativeType("GLint *") int[] stride, @NativeType("GLenum *") int[] layout, @Nullable ByteBuffer old_buffer) { + long __functionAddress = GL.getICD().glMapTexture2DINTEL; + if (CHECKS) { + check(__functionAddress); + check(stride, 1); + check(layout, 1); + } + long __result = callPPP(texture, level, access, stride, layout, __functionAddress); + int length = getStride(stride) * GLChecks.getTexLevelParameteri(texture, GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT); + return apiGetMappedBuffer(old_buffer, __result, length); + } + + /** Array version of: {@link #glMapTexture2DINTEL MapTexture2DINTEL} */ + @Nullable + @NativeType("void *") + public static ByteBuffer glMapTexture2DINTEL(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLbitfield") int access, @NativeType("GLint *") int[] stride, @NativeType("GLenum *") int[] layout, long length, @Nullable ByteBuffer old_buffer) { + long __functionAddress = GL.getICD().glMapTexture2DINTEL; + if (CHECKS) { + check(__functionAddress); + check(stride, 1); + check(layout, 1); + } + long __result = callPPP(texture, level, access, stride, layout, __functionAddress); + return apiGetMappedBuffer(old_buffer, __result, (int)length); + } + + private static int getStride(IntBuffer stride) { + return stride.get(stride.position()); + } + + private static int getStride(int[] stride) { + return stride[0]; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELPerformanceQuery.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELPerformanceQuery.java new file mode 100644 index 000000000..f620200f4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/INTELPerformanceQuery.java @@ -0,0 +1,347 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the INTEL_performance_query extension. + * + *

    The purpose of this extension is to expose Intel proprietary hardware performance counters to the OpenGL applications. Performance counters may count:

    + * + *
      + *
    • number of hardware events such as number of spawned vertex shaders. In this case the results represent the number of events.
    • + *
    • duration of certain activity, like time took by all fragment shader invocations. In that case the result usually represents the number of clocks in + * which the particular HW unit was busy. In order to use such counter efficiently, it should be normalized to the range of <0,1> by dividing + * its value by the number of render clocks.
    • + *
    • used throughput of certain memory types such as texture memory. In that case the result of performance counter usually represents the number of + * bytes transferred between GPU and memory.
    • + *
    + * + *

    This extension specifies universal API to manage performance counters on different Intel hardware platforms. Performance counters are grouped together + * into proprietary, hardware-specific, fixed sets of counters that are measured together by the GPU.

    + * + *

    It is assumed that performance counters are started and ended on any arbitrary boundaries during rendering.

    + * + *

    A set of performance counters is represented by a unique query type. Each query type is identified by assigned name and ID. Multiple query types (sets + * of performance counters) are supported by the Intel hardware. However each Intel hardware generation supports different sets of performance counters. + * Therefore the query types between hardware generations can be different. The definition of query types and their results structures can be learned + * through the API. It is also documented in a separate document of Intel OGL Performance Counters Specification issued per each new hardware generation.

    + * + *

    The API allows to create multiple instances of any query type and to sample different fragments of 3D rendering with such instances. Query instances + * are identified with handles.

    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ +public class INTELPerformanceQuery { + + static { GL.initialize(); } + + /** Returned by the capsMask parameter of GetPerfQueryInfoINTEL. */ + public static final int + GL_PERFQUERY_SINGLE_CONTEXT_INTEL = 0x0, + GL_PERFQUERY_GLOBAL_CONTEXT_INTEL = 0x1; + + /** Accepted by the flags parameter of GetPerfQueryDataINTEL. */ + public static final int + GL_PERFQUERY_WAIT_INTEL = 0x83FB, + GL_PERFQUERY_FLUSH_INTEL = 0x83FA, + GL_PERFQUERY_DONOT_FLUSH_INTEL = 0x83F9; + + /** Returned by GetPerfCounterInfoINTEL function as counter type enumeration in location pointed by counterTypeEnum. */ + public static final int + GL_PERFQUERY_COUNTER_EVENT_INTEL = 0x94F0, + GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL = 0x94F1, + GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL = 0x94F2, + GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL = 0x94F3, + GL_PERFQUERY_COUNTER_RAW_INTEL = 0x94F4, + GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL = 0x94F5; + + /** Returned by glGetPerfCounterInfoINTEL function as counter data type enumeration in location pointed by counterDataTypeEnum. */ + public static final int + GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL = 0x94F8, + GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL = 0x94F9, + GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL = 0x94FA, + GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL = 0x94FB, + GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL = 0x94FC; + + /** Accepted by the {@code pname} parameter of GetIntegerv. */ + public static final int + GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL = 0x94FD, + GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL = 0x94FE, + GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL = 0x94FF; + + /** Accepted by the {@code pname} parameter of GetBooleanv. */ + public static final int GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL = 0x9500; + + protected INTELPerformanceQuery() { + throw new UnsupportedOperationException(); + } + + // --- [ glBeginPerfQueryINTEL ] --- + + public static native void glBeginPerfQueryINTEL(@NativeType("GLuint") int queryHandle); + + // --- [ glCreatePerfQueryINTEL ] --- + + public static native void nglCreatePerfQueryINTEL(int queryId, long queryHandle); + + public static void glCreatePerfQueryINTEL(@NativeType("GLuint") int queryId, @NativeType("GLuint *") IntBuffer queryHandle) { + if (CHECKS) { + check(queryHandle, 1); + } + nglCreatePerfQueryINTEL(queryId, memAddress(queryHandle)); + } + + @NativeType("void") + public static int glCreatePerfQueryINTEL(@NativeType("GLuint") int queryId) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer queryHandle = stack.callocInt(1); + nglCreatePerfQueryINTEL(queryId, memAddress(queryHandle)); + return queryHandle.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDeletePerfQueryINTEL ] --- + + public static native void glDeletePerfQueryINTEL(@NativeType("GLuint") int queryHandle); + + // --- [ glEndPerfQueryINTEL ] --- + + public static native void glEndPerfQueryINTEL(@NativeType("GLuint") int queryHandle); + + // --- [ glGetFirstPerfQueryIdINTEL ] --- + + public static native void nglGetFirstPerfQueryIdINTEL(long queryId); + + public static void glGetFirstPerfQueryIdINTEL(@NativeType("GLuint *") IntBuffer queryId) { + if (CHECKS) { + check(queryId, 1); + } + nglGetFirstPerfQueryIdINTEL(memAddress(queryId)); + } + + @NativeType("void") + public static int glGetFirstPerfQueryIdINTEL() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer queryId = stack.callocInt(1); + nglGetFirstPerfQueryIdINTEL(memAddress(queryId)); + return queryId.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetNextPerfQueryIdINTEL ] --- + + public static native void nglGetNextPerfQueryIdINTEL(int queryId, long nextQueryId); + + public static void glGetNextPerfQueryIdINTEL(@NativeType("GLuint") int queryId, @NativeType("GLuint *") IntBuffer nextQueryId) { + if (CHECKS) { + check(nextQueryId, 1); + } + nglGetNextPerfQueryIdINTEL(queryId, memAddress(nextQueryId)); + } + + @NativeType("void") + public static int glGetNextPerfQueryIdINTEL(@NativeType("GLuint") int queryId) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer nextQueryId = stack.callocInt(1); + nglGetNextPerfQueryIdINTEL(queryId, memAddress(nextQueryId)); + return nextQueryId.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetPerfCounterInfoINTEL ] --- + + public static native void nglGetPerfCounterInfoINTEL(int queryId, int counterId, int counterNameLength, long counterName, int counterDescLength, long counterDesc, long counterOffset, long counterDataSize, long counterTypeEnum, long counterDataTypeEnum, long rawCounterMaxValue); + + public static void glGetPerfCounterInfoINTEL(@NativeType("GLuint") int queryId, @NativeType("GLuint") int counterId, @NativeType("GLchar *") ByteBuffer counterName, @NativeType("GLchar *") ByteBuffer counterDesc, @NativeType("GLuint *") IntBuffer counterOffset, @NativeType("GLuint *") IntBuffer counterDataSize, @NativeType("GLuint *") IntBuffer counterTypeEnum, @NativeType("GLuint *") IntBuffer counterDataTypeEnum, @NativeType("GLuint64 *") LongBuffer rawCounterMaxValue) { + if (CHECKS) { + check(counterOffset, 1); + check(counterDataSize, 1); + check(counterTypeEnum, 1); + check(counterDataTypeEnum, 1); + check(rawCounterMaxValue, 1); + } + nglGetPerfCounterInfoINTEL(queryId, counterId, counterName.remaining(), memAddress(counterName), counterDesc.remaining(), memAddress(counterDesc), memAddress(counterOffset), memAddress(counterDataSize), memAddress(counterTypeEnum), memAddress(counterDataTypeEnum), memAddress(rawCounterMaxValue)); + } + + // --- [ glGetPerfQueryDataINTEL ] --- + + public static native void nglGetPerfQueryDataINTEL(int queryHandle, int flags, int dataSize, long data, long bytesWritten); + + public static void glGetPerfQueryDataINTEL(@NativeType("GLuint") int queryHandle, @NativeType("GLuint") int flags, @NativeType("void *") ByteBuffer data, @NativeType("GLuint *") IntBuffer bytesWritten) { + if (CHECKS) { + check(bytesWritten, 1); + } + nglGetPerfQueryDataINTEL(queryHandle, flags, data.remaining(), memAddress(data), memAddress(bytesWritten)); + } + + // --- [ glGetPerfQueryIdByNameINTEL ] --- + + public static native void nglGetPerfQueryIdByNameINTEL(long queryName, long queryId); + + public static void glGetPerfQueryIdByNameINTEL(@NativeType("GLchar *") ByteBuffer queryName, @NativeType("GLuint *") IntBuffer queryId) { + if (CHECKS) { + checkNT1(queryName); + check(queryId, 1); + } + nglGetPerfQueryIdByNameINTEL(memAddress(queryName), memAddress(queryId)); + } + + public static void glGetPerfQueryIdByNameINTEL(@NativeType("GLchar *") CharSequence queryName, @NativeType("GLuint *") IntBuffer queryId) { + if (CHECKS) { + check(queryId, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(queryName, true); + long queryNameEncoded = stack.getPointerAddress(); + nglGetPerfQueryIdByNameINTEL(queryNameEncoded, memAddress(queryId)); + } finally { + stack.setPointer(stackPointer); + } + } + + @NativeType("void") + public static int glGetPerfQueryIdByNameINTEL(@NativeType("GLchar *") CharSequence queryName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(queryName, true); + long queryNameEncoded = stack.getPointerAddress(); + IntBuffer queryId = stack.callocInt(1); + nglGetPerfQueryIdByNameINTEL(queryNameEncoded, memAddress(queryId)); + return queryId.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetPerfQueryInfoINTEL ] --- + + public static native void nglGetPerfQueryInfoINTEL(int queryId, int queryNameLength, long queryName, long dataSize, long noCounters, long noInstances, long capsMask); + + public static void glGetPerfQueryInfoINTEL(@NativeType("GLuint") int queryId, @NativeType("GLchar *") ByteBuffer queryName, @NativeType("GLuint *") IntBuffer dataSize, @NativeType("GLuint *") IntBuffer noCounters, @NativeType("GLuint *") IntBuffer noInstances, @NativeType("GLuint *") IntBuffer capsMask) { + if (CHECKS) { + check(dataSize, 1); + check(noCounters, 1); + check(noInstances, 1); + check(capsMask, 1); + } + nglGetPerfQueryInfoINTEL(queryId, queryName.remaining(), memAddress(queryName), memAddress(dataSize), memAddress(noCounters), memAddress(noInstances), memAddress(capsMask)); + } + + /** Array version of: {@link #glCreatePerfQueryINTEL CreatePerfQueryINTEL} */ + public static void glCreatePerfQueryINTEL(@NativeType("GLuint") int queryId, @NativeType("GLuint *") int[] queryHandle) { + long __functionAddress = GL.getICD().glCreatePerfQueryINTEL; + if (CHECKS) { + check(__functionAddress); + check(queryHandle, 1); + } + callPV(queryId, queryHandle, __functionAddress); + } + + /** Array version of: {@link #glGetFirstPerfQueryIdINTEL GetFirstPerfQueryIdINTEL} */ + public static void glGetFirstPerfQueryIdINTEL(@NativeType("GLuint *") int[] queryId) { + long __functionAddress = GL.getICD().glGetFirstPerfQueryIdINTEL; + if (CHECKS) { + check(__functionAddress); + check(queryId, 1); + } + callPV(queryId, __functionAddress); + } + + /** Array version of: {@link #glGetNextPerfQueryIdINTEL GetNextPerfQueryIdINTEL} */ + public static void glGetNextPerfQueryIdINTEL(@NativeType("GLuint") int queryId, @NativeType("GLuint *") int[] nextQueryId) { + long __functionAddress = GL.getICD().glGetNextPerfQueryIdINTEL; + if (CHECKS) { + check(__functionAddress); + check(nextQueryId, 1); + } + callPV(queryId, nextQueryId, __functionAddress); + } + + /** Array version of: {@link #glGetPerfCounterInfoINTEL GetPerfCounterInfoINTEL} */ + public static void glGetPerfCounterInfoINTEL(@NativeType("GLuint") int queryId, @NativeType("GLuint") int counterId, @NativeType("GLchar *") ByteBuffer counterName, @NativeType("GLchar *") ByteBuffer counterDesc, @NativeType("GLuint *") int[] counterOffset, @NativeType("GLuint *") int[] counterDataSize, @NativeType("GLuint *") int[] counterTypeEnum, @NativeType("GLuint *") int[] counterDataTypeEnum, @NativeType("GLuint64 *") long[] rawCounterMaxValue) { + long __functionAddress = GL.getICD().glGetPerfCounterInfoINTEL; + if (CHECKS) { + check(__functionAddress); + check(counterOffset, 1); + check(counterDataSize, 1); + check(counterTypeEnum, 1); + check(counterDataTypeEnum, 1); + check(rawCounterMaxValue, 1); + } + callPPPPPPPV(queryId, counterId, counterName.remaining(), memAddress(counterName), counterDesc.remaining(), memAddress(counterDesc), counterOffset, counterDataSize, counterTypeEnum, counterDataTypeEnum, rawCounterMaxValue, __functionAddress); + } + + /** Array version of: {@link #glGetPerfQueryDataINTEL GetPerfQueryDataINTEL} */ + public static void glGetPerfQueryDataINTEL(@NativeType("GLuint") int queryHandle, @NativeType("GLuint") int flags, @NativeType("void *") ByteBuffer data, @NativeType("GLuint *") int[] bytesWritten) { + long __functionAddress = GL.getICD().glGetPerfQueryDataINTEL; + if (CHECKS) { + check(__functionAddress); + check(bytesWritten, 1); + } + callPPV(queryHandle, flags, data.remaining(), memAddress(data), bytesWritten, __functionAddress); + } + + /** Array version of: {@link #glGetPerfQueryIdByNameINTEL GetPerfQueryIdByNameINTEL} */ + public static void glGetPerfQueryIdByNameINTEL(@NativeType("GLchar *") ByteBuffer queryName, @NativeType("GLuint *") int[] queryId) { + long __functionAddress = GL.getICD().glGetPerfQueryIdByNameINTEL; + if (CHECKS) { + check(__functionAddress); + checkNT1(queryName); + check(queryId, 1); + } + callPPV(memAddress(queryName), queryId, __functionAddress); + } + + /** Array version of: {@link #glGetPerfQueryIdByNameINTEL GetPerfQueryIdByNameINTEL} */ + public static void glGetPerfQueryIdByNameINTEL(@NativeType("GLchar *") CharSequence queryName, @NativeType("GLuint *") int[] queryId) { + long __functionAddress = GL.getICD().glGetPerfQueryIdByNameINTEL; + if (CHECKS) { + check(__functionAddress); + check(queryId, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(queryName, true); + long queryNameEncoded = stack.getPointerAddress(); + callPPV(queryNameEncoded, queryId, __functionAddress); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glGetPerfQueryInfoINTEL GetPerfQueryInfoINTEL} */ + public static void glGetPerfQueryInfoINTEL(@NativeType("GLuint") int queryId, @NativeType("GLchar *") ByteBuffer queryName, @NativeType("GLuint *") int[] dataSize, @NativeType("GLuint *") int[] noCounters, @NativeType("GLuint *") int[] noInstances, @NativeType("GLuint *") int[] capsMask) { + long __functionAddress = GL.getICD().glGetPerfQueryInfoINTEL; + if (CHECKS) { + check(__functionAddress); + check(dataSize, 1); + check(noCounters, 1); + check(noInstances, 1); + check(capsMask, 1); + } + callPPPPPV(queryId, queryName.remaining(), memAddress(queryName), dataSize, noCounters, noInstances, capsMask, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/InputImplementation.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/InputImplementation.java new file mode 100644 index 000000000..b134e60d0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/InputImplementation.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +/** + * This is the input implementation interface. Mouse and Keyboard delegates + * to implementors of this interface. There is one InputImplementation + * for each supported platform. + * @author elias_naur + */ + +import org.lwjgl.LWJGLException; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface InputImplementation { + /* + * Mouse methods + */ + /** Query of wheel support */ + boolean hasWheel(); + + /** Query of button count */ + int getButtonCount(); + + /** + * Method to create the mouse. + */ + void createMouse() throws LWJGLException; + + /** + * Method the destroy the mouse + */ + void destroyMouse(); + + /** + * Method to poll the mouse + */ + void pollMouse(IntBuffer coord_buffer, ByteBuffer buttons); + + /** + * Method to read the mouse buffer + */ + void readMouse(ByteBuffer buffer); + + void grabMouse(boolean grab); + + /** + * Function to determine native cursor support + */ + int getNativeCursorCapabilities(); + + /** Method to set the native cursor position */ + void setCursorPosition(int x, int y); + + /** Method to set the native cursor */ + void setNativeCursor(Object handle) throws LWJGLException; + + /** Method returning the minimum cursor size */ + int getMinCursorSize(); + + /** Method returning the maximum cursor size */ + int getMaxCursorSize(); + + /* + * Keyboard methods + */ + + /** + * Method to create the keyboard + */ + void createKeyboard() throws LWJGLException; + + /** + * Method to destroy the keyboard + */ + void destroyKeyboard(); + + /** + * Method to poll the keyboard. + * + * @param keyDownBuffer the address of a 256-byte buffer to place + * key states in. + */ + void pollKeyboard(ByteBuffer keyDownBuffer); + + /** + * Method to read the keyboard buffer + */ + void readKeyboard(ByteBuffer buffer); + +// int isStateKeySet(int key); + + /** Native cursor handles */ + Object createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException; + + void destroyCursor(Object cursor_handle); + + int getWidth(); + + int getHeight(); + + boolean isInsideWindow(); +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRBlendEquationAdvanced.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRBlendEquationAdvanced.java new file mode 100644 index 000000000..812fd00ba --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRBlendEquationAdvanced.java @@ -0,0 +1,89 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the KHR_blend_equation_advanced extension. + * + *

    This extension adds a number of "advanced" blending equations that can be used to perform new color blending operations, many of which are more complex + * than the standard blend modes provided by unextended OpenGL. This extension provides two different extension string entries:

    + * + *
      + *
    • KHR_blend_equation_advanced:Provides the new blending equations, but guarantees defined results only if each sample is touched no more than + * once in any single rendering pass. The command {@link #glBlendBarrierKHR BlendBarrierKHR} is provided to indicate a boundary between passes.
    • + *
    • {@link KHRBlendEquationAdvancedCoherent KHR_blend_equation_advanced_coherent}: Provides the new blending equations, and guarantees that blending is + * done coherently and in API primitive order. An enable is provided to allow implementations to opt out of fully coherent blending and instead behave + * as though only KHR_blend_equation_advanced were supported.
    • + *
    + * + *

    Some implementations may support KHR_blend_equation_advanced without supporting KHR_blend_equation_advanced_coherent.

    + * + *

    In unextended OpenGL, the set of blending equations is limited, and can be expressed very simply. The {@link GL14#GL_MIN MIN} and {@link GL14#GL_MAX MAX} blend equations + * simply compute component-wise minimums or maximums of source and destination color components. The {@link GL14#GL_FUNC_ADD FUNC_ADD}, {@link GL14#GL_FUNC_SUBTRACT FUNC_SUBTRACT}, and + * {@link GL14#GL_FUNC_REVERSE_SUBTRACT FUNC_REVERSE_SUBTRACT} multiply the source and destination colors by source and destination factors and either add the two products together + * or subtract one from the other. This limited set of operations supports many common blending operations but precludes the use of more sophisticated + * transparency and blending operations commonly available in many dedicated imaging APIs.

    + * + *

    This extension provides a number of new "advanced" blending equations. Unlike traditional blending operations using the {@link GL14#GL_FUNC_ADD FUNC_ADD} equation, + * these blending equations do not use source and destination factors specified by {@link GL11C#glBlendFunc BlendFunc}. Instead, each blend equation specifies a complete + * equation based on the source and destination colors. These new blend equations are used for both RGB and alpha components; they may not be used to + * perform separate RGB and alpha blending (via functions like {@link GL20C#glBlendEquationSeparate BlendEquationSeparate}).

    + * + *

    These blending operations are performed using premultiplied source and destination colors, where RGB colors produced by the fragment shader and stored + * in the framebuffer are considered to be multiplied by alpha (coverage). Many of these advanced blending equations are formulated where the result of + * blending source and destination colors with partial coverage have three separate contributions: from the portions covered by both the source and the + * destination, from the portion covered only by the source, and from the portion covered only by the destination. Such equations are defined assuming that + * the source and destination coverage have no spatial correlation within the pixel.

    + * + *

    In addition to the coherency issues on implementations not supporting KHR_blend_equation_advanced_coherent, this extension has several limitations worth + * noting. First, the new blend equations are not supported while rendering to more than one color buffer at once; an {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} will be + * generated if an application attempts to render any primitives in this unsupported configuration. Additionally, blending precision may be limited to + * 16-bit floating-point, which could result in a loss of precision and dynamic range for framebuffer formats with 32-bit floating-point components, and in + * a loss of precision for formats with 12- and 16-bit signed or unsigned normalized integer components.

    + * + *

    Requires {@link GL20 OpenGL 2.0}.

    + */ +public class KHRBlendEquationAdvanced { + + static { GL.initialize(); } + + /** Accepted by the {@code mode} parameter of BlendEquation and BlendEquationi. */ + public static final int + GL_MULTIPLY_KHR = 0x9294, + GL_SCREEN_KHR = 0x9295, + GL_OVERLAY_KHR = 0x9296, + GL_DARKEN_KHR = 0x9297, + GL_LIGHTEN_KHR = 0x9298, + GL_COLORDODGE_KHR = 0x9299, + GL_COLORBURN_KHR = 0x929A, + GL_HARDLIGHT_KHR = 0x929B, + GL_SOFTLIGHT_KHR = 0x929C, + GL_DIFFERENCE_KHR = 0x929E, + GL_EXCLUSION_KHR = 0x92A0, + GL_HSL_HUE_KHR = 0x92AD, + GL_HSL_SATURATION_KHR = 0x92AE, + GL_HSL_COLOR_KHR = 0x92AF, + GL_HSL_LUMINOSITY_KHR = 0x92B0; + + protected KHRBlendEquationAdvanced() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendBarrierKHR ] --- + + /** + * Specifies a boundary between passes when using advanced blend equations. + * + *

    When using advanced blending equations, applications should split their rendering into a collection of blending passes, none of which touch an + * individual sample in the framebuffer more than once. The results of blending are undefined if the sample being blended has been touched previously in + * the same pass. Any command that causes the value of a sample to be modified using the framebuffer is considered to touch the sample, including clears, + * blended or unblended primitives, and {@link GL30C#glBlitFramebuffer BlitFramebuffer} copies.

    + */ + public static native void glBlendBarrierKHR(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRBlendEquationAdvancedCoherent.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRBlendEquationAdvancedCoherent.java new file mode 100644 index 000000000..05287f198 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRBlendEquationAdvancedCoherent.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the KHR_blend_equation_advanced_coherent extension. + * + *

    This extension guarantees that blending is done coherently and in API primitive order. An enable is provided to allow implementations to opt out of + * fully coherent blending and instead behave as though only {@link KHRBlendEquationAdvanced KHR_blend_equation_advanced} were supported.

    + * + *

    Requires {@link GL20 OpenGL 2.0}.

    + */ +public final class KHRBlendEquationAdvancedCoherent { + + /** + * Accepted by the {@code cap} parameter of Disable, Enable, and IsEnabled, and by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetFloatv, + * GetDoublev and GetInteger64v. + */ + public static final int GL_BLEND_ADVANCED_COHERENT_KHR = 0x9285; + + private KHRBlendEquationAdvancedCoherent() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRContextFlushControl.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRContextFlushControl.java new file mode 100644 index 000000000..4dbff592f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRContextFlushControl.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the KHR_context_flush_control extension. + * + *

    OpenGL and OpenGL ES have long supported multiple contexts. The semantics of switching contexts is generally left to window system binding APIs such as + * WGL, GLX and EGL. Most of these APIs (if not all) specify that when the current context for a thread is changed, the outgoing context performs an + * implicit flush of any commands that have been issued to that point. OpenGL and OpenGL ES define a flush as sending any pending commands for execution + * and that this action will result in their completion in finite time.

    + * + *

    This behavior has subtle consequences. For example, if an application is rendering to the front buffer and switches contexts, it may assume that any + * rendering performed thus far will eventually be visible to the user. With recent introduction of shared memory buffers, there become inumerable ways in + * which applications may observe side effects of an implicit flush (or lack thereof).

    + * + *

    In general, a full flush is not the desired behavior of the application. Nonetheless, applications that switch contexts frequently suffer the + * performance consequences of this unless implementations make special considerations for them, which is generally untenable.

    + * + *

    This extension allows querying the context flush behavior.

    + * + *

    Promoted to core in {@link GL45 OpenGL 4.5}.

    + */ +public final class KHRContextFlushControl { + + /** Accepted by the {@code pname} parameter of GetIntegerv, GetFloatv, GetBooleanv GetDoublev and GetInteger64v. */ + public static final int GL_CONTEXT_RELEASE_BEHAVIOR = 0x82FB; + + /** Returned in {@code data} by GetIntegerv, GetFloatv, GetBooleanv GetDoublev and GetInteger64v when {@code pname} is {@link #GL_CONTEXT_RELEASE_BEHAVIOR CONTEXT_RELEASE_BEHAVIOR}. */ + public static final int GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH = 0x82FC; + + private KHRContextFlushControl() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRDebug.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRDebug.java new file mode 100644 index 000000000..46a36cdac --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRDebug.java @@ -0,0 +1,632 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the KHR_debug extension. + * + *

    This extension allows the GL to notify applications when various events occur that may be useful during application development, debugging and + * profiling.

    + * + *

    These events are represented in the form of enumerable messages with a human-readable string representation. Examples of debug events include incorrect + * use of the GL, warnings of undefined behavior, and performance warnings.

    + * + *

    A message is uniquely identified by a source, a type and an implementation-dependent ID within the source and type pair.

    + * + *

    A message's source identifies the origin of the message and can either describe components of the GL, the window system, third-party external sources + * such as external debuggers, or even the application itself.

    + * + *

    The type of the message roughly identifies the nature of the event that caused the message. Examples include errors, performance warnings, warnings + * about undefined behavior or notifications identifying that the application is within a specific section of the application code.

    + * + *

    A message's ID for a given source and type further distinguishes messages within namespaces. For example, an error caused by a negative parameter value + * or an invalid internal texture format are both errors generated by the API, but would likely have different message IDs.

    + * + *

    Each message is also assigned to a severity level that denotes roughly how "important" that message is in comparison to other messages across all + * sources and types. For example, notification of a GL error would likely have a higher severity than a performance warning due to redundant state changes.

    + * + *

    Furthermore, every message contains an implementation-dependent string representation that provides a useful description of the event.

    + * + *

    Messages are communicated to the application through an application-defined callback function that is called by the GL implementation on each debug + * message. The motivation for the callback routine is to free application developers from actively having to query whether a GL error, or any other + * debuggable event has happened after each call to a GL function. With a callback, developers can keep their code free of debug checks, set breakpoints in + * the callback function, and only have to react to messages as they occur. In situations where using a callback is not possible, a message log is also + * provided that stores only copies of recent messages until they are actively queried.

    + * + *

    To control the volume of debug output, messages can be disabled either individually by ID, or entire sets of messages can be turned off based on + * combination of source and type, through the entire application code or only section of the code encapsulated in debug groups. A debug group may also be + * used to annotate the command stream using descriptive texts.

    + * + *

    This extension also defines debug markers, a mechanism for the OpenGL application to annotate the command stream with markers for discrete events.

    + * + *

    When profiling or debugging an OpenGL application with a built-in or an external debugger or profiler, it is difficult to relate the commands within the + * command stream to the elements of the scene or parts of the program code to which they correspond. Debug markers and debug groups help obviate this by + * allowing applications to specify this link. For example, a debug marker can be used to identify the beginning of a frame in the command stream and a + * debug group can encapsulate a specific command stream to identify a rendering pass. Debug groups also allow control of the debug outputs volume per + * section of an application code providing an effective way to handle the massive amount of debug outputs that drivers can generate.

    + * + *

    Some existing implementations of {@link ARBDebugOutput ARB_debug_output} only expose the ARB_debug_output extension string if the context was created with the debug + * flag {GLX|WGL}_CONTEXT_DEBUG_BIT_ARB as specified in {GLX|WGL}_ARB_create_context. The behavior is not obvious when the functionality is brought into + * the OpenGL core specification because the extension string and function entry points must always exist.

    + * + *

    This extension modifies the existing ARB_debug_output extension to allow implementations to always have an empty message log. The specific messages + * written to the message log or callback routines are already implementation defined, so this specification simply makes it explicit that it's fine for + * there to be zero messages generated, even when a GL error occurs, which is useful if the context is non-debug.

    + * + *

    Debug output can be enabled and disabled by changing the {@link #GL_DEBUG_OUTPUT DEBUG_OUTPUT} state. It is implementation defined how much debug output is generated if the + * context was created without the {@link #GL_CONTEXT_FLAG_DEBUG_BIT CONTEXT_FLAG_DEBUG_BIT} set. This is a new query bit added to the existing {@link GL30#GL_CONTEXT_FLAGS CONTEXT_FLAGS} state to specify whether the + * context was created with debug enabled.

    + * + *

    Finally, this extension defines a mechanism for OpenGL applications to label their objects (textures, buffers, shaders, etc.) with a descriptive string.

    + * + *

    When profiling or debugging an OpenGL application within an external or built-in (debut output API) debugger or profiler it is difficult to identify + * objects from their object names (integers).

    + * + *

    Even when the object itself is viewed it can be problematic to differentiate between similar objects. Attaching a descriptive string, a label, to an + * object obviates this difficulty.

    + * + *

    The intended purpose of this extension is purely to improve the user experience within OpenGL development tools and application built-in profilers and + * debuggers. This extension typically improves OpenGL programmers efficiency by allowing them to instantly detect issues and the reason for these issues + * giving him more time to focus on adding new features to an OpenGL application.

    + * + *

    Promoted to core in {@link GL43 OpenGL 4.3}.

    + */ +public class KHRDebug { + + static { GL.initialize(); } + + /** Tokens accepted by the {@code target} parameters of Enable, Disable, and IsEnabled. */ + public static final int + GL_DEBUG_OUTPUT = 0x92E0, + GL_DEBUG_OUTPUT_SYNCHRONOUS = 0x8242; + + /** Returned by GetIntegerv when {@code pname} is CONTEXT_FLAGS. */ + public static final int GL_CONTEXT_FLAG_DEBUG_BIT = 0x2; + + /** Tokens accepted by the {@code value} parameters of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev and GetInteger64v. */ + public static final int + GL_MAX_DEBUG_MESSAGE_LENGTH = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES = 0x9144, + GL_DEBUG_LOGGED_MESSAGES = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243, + GL_MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C, + GL_DEBUG_GROUP_STACK_DEPTH = 0x826D, + GL_MAX_LABEL_LENGTH = 0x82E8; + + /** Tokens accepted by the {@code pname} parameter of GetPointerv. */ + public static final int + GL_DEBUG_CALLBACK_FUNCTION = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM = 0x8245; + + /** + * Tokens accepted or provided by the {@code source} parameters of DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the {@code sources} parameter + * of GetDebugMessageLog (some commands restrict {@code source} to a subset of these parameters; see the specification body for details). + */ + public static final int + GL_DEBUG_SOURCE_API = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY = 0x8249, + GL_DEBUG_SOURCE_APPLICATION = 0x824A, + GL_DEBUG_SOURCE_OTHER = 0x824B; + + /** + * Tokens accepted or provided by the {@code type} parameters of DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the {@code types} parameter of + * GetDebugMessageLog. + */ + public static final int + GL_DEBUG_TYPE_ERROR = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E, + GL_DEBUG_TYPE_PORTABILITY = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE = 0x8250, + GL_DEBUG_TYPE_OTHER = 0x8251, + GL_DEBUG_TYPE_MARKER = 0x8268; + + /** Tokens accepted or provided by the {@code type} parameters of DebugMessageControl and DEBUGPROC, and the {@code types} parameter of GetDebugMessageLog. */ + public static final int + GL_DEBUG_TYPE_PUSH_GROUP = 0x8269, + GL_DEBUG_TYPE_POP_GROUP = 0x826A; + + /** + * Tokens accepted or provided by the {@code severity} parameters of DebugMessageControl, DebugMessageInsert and DEBUGPROC callback functions, and the + * {@code severities} parameter of GetDebugMessageLog. + */ + public static final int + GL_DEBUG_SEVERITY_HIGH = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM = 0x9147, + GL_DEBUG_SEVERITY_LOW = 0x9148, + GL_DEBUG_SEVERITY_NOTIFICATION = 0x826B; + + /** Tokens accepted or provided by the {@code identifier} parameters of ObjectLabel and GetObjectLabel. */ + public static final int + GL_BUFFER = 0x82E0, + GL_SHADER = 0x82E1, + GL_PROGRAM = 0x82E2, + GL_QUERY = 0x82E3, + GL_PROGRAM_PIPELINE = 0x82E4, + GL_SAMPLER = 0x82E6, + GL_DISPLAY_LIST = 0x82E7; + + protected KHRDebug() { + throw new UnsupportedOperationException(); + } + + // --- [ glDebugMessageControl ] --- + + /** + * Unsafe version of: {@link #glDebugMessageControl DebugMessageControl} + * + * @param count the length of the array {@code ids} + */ + public static void nglDebugMessageControl(int source, int type, int severity, int count, long ids, boolean enabled) { + GL43C.nglDebugMessageControl(source, type, severity, count, ids, enabled); + } + + /** + * Controls the volume of debug output in the active debug group, by disabling specific or groups of messages. + * + *

    If {@code enabled} is {@link GL11#GL_TRUE TRUE}, the referenced subset of messages will be enabled. If {@link GL11#GL_FALSE FALSE}, then those messages will be disabled.

    + * + *

    This command can reference different subsets of messages by first considering the set of all messages, and filtering out messages based on the following + * ways:

    + * + *
      + *
    • If {@code source}, {@code type}, or {@code severity} is {@link GL11#GL_DONT_CARE DONT_CARE}, the messages from all sources, of all types, or of all severities are + * referenced respectively.
    • + *
    • When values other than {@link GL11#GL_DONT_CARE DONT_CARE} are specified, all messages whose source, type, or severity match the specified {@code source}, {@code type}, + * or {@code severity} respectively will be referenced.
    • + *
    • If {@code count} is greater than zero, then {@code ids} is an array of {@code count} message IDs for the specified combination of {@code source} and + * {@code type}. In this case, if {@code source} or {@code type} is {@link GL11#GL_DONT_CARE DONT_CARE}, or {@code severity} is not {@link GL11#GL_DONT_CARE DONT_CARE}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated.
    • + *
    + * + *

    Unrecognized message IDs in {@code ids} are ignored. If {@code count} is zero, the value if {@code ids} is ignored.

    + * + *

    Although messages are grouped into an implicit hierarchy by their sources and types, there is no explicit per-source, per-type or per-severity enabled + * state. Instead, the enabled state is stored individually for each message. There is no difference between disabling all messages from one source in a + * single call, and individually disabling all messages from that source using their types and IDs.

    + * + *

    If the {@link GL43C#GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled the GL operates the same as if messages of every {@code source}, {@code type} or {@code severity} are disabled.

    + * + * @param source the source of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link GL43C#GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link GL43C#GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link GL43C#GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link GL43C#GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link GL43C#GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link GL43C#GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link GL43C#GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link GL43C#GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param severity the severity of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link GL43C#GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link GL43C#GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param ids an array of unsigned integers containing the ids of the messages to enable or disable + * @param enabled whether the selected messages should be enabled or disabled + */ + public static void glDebugMessageControl(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @Nullable @NativeType("GLuint const *") IntBuffer ids, @NativeType("GLboolean") boolean enabled) { + GL43C.glDebugMessageControl(source, type, severity, ids, enabled); + } + + /** + * Controls the volume of debug output in the active debug group, by disabling specific or groups of messages. + * + *

    If {@code enabled} is {@link GL11#GL_TRUE TRUE}, the referenced subset of messages will be enabled. If {@link GL11#GL_FALSE FALSE}, then those messages will be disabled.

    + * + *

    This command can reference different subsets of messages by first considering the set of all messages, and filtering out messages based on the following + * ways:

    + * + *
      + *
    • If {@code source}, {@code type}, or {@code severity} is {@link GL11#GL_DONT_CARE DONT_CARE}, the messages from all sources, of all types, or of all severities are + * referenced respectively.
    • + *
    • When values other than {@link GL11#GL_DONT_CARE DONT_CARE} are specified, all messages whose source, type, or severity match the specified {@code source}, {@code type}, + * or {@code severity} respectively will be referenced.
    • + *
    • If {@code count} is greater than zero, then {@code ids} is an array of {@code count} message IDs for the specified combination of {@code source} and + * {@code type}. In this case, if {@code source} or {@code type} is {@link GL11#GL_DONT_CARE DONT_CARE}, or {@code severity} is not {@link GL11#GL_DONT_CARE DONT_CARE}, the error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated.
    • + *
    + * + *

    Unrecognized message IDs in {@code ids} are ignored. If {@code count} is zero, the value if {@code ids} is ignored.

    + * + *

    Although messages are grouped into an implicit hierarchy by their sources and types, there is no explicit per-source, per-type or per-severity enabled + * state. Instead, the enabled state is stored individually for each message. There is no difference between disabling all messages from one source in a + * single call, and individually disabling all messages from that source using their types and IDs.

    + * + *

    If the {@link GL43C#GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled the GL operates the same as if messages of every {@code source}, {@code type} or {@code severity} are disabled.

    + * + * @param source the source of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link GL43C#GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link GL43C#GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link GL43C#GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link GL43C#GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link GL43C#GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link GL43C#GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link GL43C#GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link GL43C#GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param severity the severity of debug messages to enable or disable. One of:
    {@link GL43C#GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link GL43C#GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link GL43C#GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param enabled whether the selected messages should be enabled or disabled + */ + public static void glDebugMessageControl(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @NativeType("GLuint const *") int id, @NativeType("GLboolean") boolean enabled) { + GL43C.glDebugMessageControl(source, type, severity, id, enabled); + } + + // --- [ glDebugMessageInsert ] --- + + /** + * Unsafe version of: {@link #glDebugMessageInsert DebugMessageInsert} + * + * @param length the length of the string contained in the character array whose address is given by {@code message} + */ + public static void nglDebugMessageInsert(int source, int type, int id, int severity, int length, long message) { + GL43C.nglDebugMessageInsert(source, type, id, severity, length, message); + } + + /** + * This function can be called by applications and third-party libraries to generate their own messages, such as ones containing timestamp information or + * signals about specific render system events. + * + *

    The value of {@code id} specifies the ID for the message and {@code severity} indicates its severity level as defined by the caller. The string + * {@code buf} contains the string representation of the message. The parameter {@code length} contains the number of characters in {@code buf}. If + * {@code length} is negative, it is implied that {@code buf} contains a null terminated string. The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated if the + * number of characters in {@code buf}, excluding the null terminator when {@code length} is negative, is not less than the value of + * {@link GL43C#GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + *

    If the {@link GL43C#GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled calls to DebugMessageInsert are discarded and do not generate an error.

    + * + * @param source the source of the debug message to insert. One of:
    {@link GL43C#GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link GL43C#GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link GL43C#GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of the debug message insert. One of:
    {@link GL43C#GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link GL43C#GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link GL43C#GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link GL43C#GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link GL43C#GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link GL43C#GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link GL43C#GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param id the user-supplied identifier of the message to insert. One of:
    {@link GL43C#GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link GL43C#GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link GL43C#GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param severity the severity of the debug messages to insert + * @param message a character array containing the message to insert + */ + public static void glDebugMessageInsert(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLuint") int id, @NativeType("GLenum") int severity, @NativeType("GLchar const *") ByteBuffer message) { + GL43C.glDebugMessageInsert(source, type, id, severity, message); + } + + /** + * This function can be called by applications and third-party libraries to generate their own messages, such as ones containing timestamp information or + * signals about specific render system events. + * + *

    The value of {@code id} specifies the ID for the message and {@code severity} indicates its severity level as defined by the caller. The string + * {@code buf} contains the string representation of the message. The parameter {@code length} contains the number of characters in {@code buf}. If + * {@code length} is negative, it is implied that {@code buf} contains a null terminated string. The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} will be generated if the + * number of characters in {@code buf}, excluding the null terminator when {@code length} is negative, is not less than the value of + * {@link GL43C#GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + *

    If the {@link GL43C#GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled calls to DebugMessageInsert are discarded and do not generate an error.

    + * + * @param source the source of the debug message to insert. One of:
    {@link GL43C#GL_DEBUG_SOURCE_API DEBUG_SOURCE_API}{@link GL43C#GL_DEBUG_SOURCE_WINDOW_SYSTEM DEBUG_SOURCE_WINDOW_SYSTEM}{@link GL43C#GL_DEBUG_SOURCE_SHADER_COMPILER DEBUG_SOURCE_SHADER_COMPILER}
    {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}{@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_OTHER DEBUG_SOURCE_OTHER}
    + * @param type the type of the debug message insert. One of:
    {@link GL43C#GL_DEBUG_TYPE_ERROR DEBUG_TYPE_ERROR}{@link GL43C#GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR DEBUG_TYPE_DEPRECATED_BEHAVIOR}{@link GL43C#GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR DEBUG_TYPE_UNDEFINED_BEHAVIOR}
    {@link GL43C#GL_DEBUG_TYPE_PORTABILITY DEBUG_TYPE_PORTABILITY}{@link GL43C#GL_DEBUG_TYPE_PERFORMANCE DEBUG_TYPE_PERFORMANCE}{@link GL43C#GL_DEBUG_TYPE_OTHER DEBUG_TYPE_OTHER}
    {@link GL43C#GL_DEBUG_TYPE_MARKER DEBUG_TYPE_MARKER}
    + * @param id the user-supplied identifier of the message to insert. One of:
    {@link GL43C#GL_DEBUG_SEVERITY_HIGH DEBUG_SEVERITY_HIGH}{@link GL43C#GL_DEBUG_SEVERITY_MEDIUM DEBUG_SEVERITY_MEDIUM}{@link GL43C#GL_DEBUG_SEVERITY_LOW DEBUG_SEVERITY_LOW}
    {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}
    + * @param severity the severity of the debug messages to insert + * @param message a character array containing the message to insert + */ + public static void glDebugMessageInsert(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLuint") int id, @NativeType("GLenum") int severity, @NativeType("GLchar const *") CharSequence message) { + GL43C.glDebugMessageInsert(source, type, id, severity, message); + } + + // --- [ glDebugMessageCallback ] --- + + /** Unsafe version of: {@link #glDebugMessageCallback DebugMessageCallback} */ + public static void nglDebugMessageCallback(long callback, long userParam) { + GL43C.nglDebugMessageCallback(callback, userParam); + } + + /** + * Specifies a callback to receive debugging messages from the GL. + * + *

    The function's prototype must follow the type definition of DEBUGPROC including its platform-dependent calling convention. Anything else will result in + * undefined behavior. Only one debug callback can be specified for the current context, and further calls overwrite the previous callback. Specifying + * {@code NULL} as the value of {@code callback} clears the current callback and disables message output through callbacks. Applications can provide + * user-specified data through the pointer {@code userParam}. The context will store this pointer and will include it as one of the parameters in each call + * to the callback function.

    + * + *

    If the application has specified a callback function for receiving debug output, the implementation will call that function whenever any enabled message + * is generated. The source, type, ID, and severity of the message are specified by the DEBUGPROC parameters {@code source}, {@code type}, {@code id}, and + * {@code severity}, respectively. The string representation of the message is stored in {@code message} and its length (excluding the null-terminator) is + * stored in {@code length}. The parameter {@code userParam} is the user-specified parameter that was given when calling DebugMessageCallback.

    + * + *

    Applications can query the current callback function and the current user-specified parameter by obtaining the values of {@link GL43C#GL_DEBUG_CALLBACK_FUNCTION DEBUG_CALLBACK_FUNCTION} and + * {@link GL43C#GL_DEBUG_CALLBACK_USER_PARAM DEBUG_CALLBACK_USER_PARAM}, respectively.

    + * + *

    Applications that specify a callback function must be aware of certain special conditions when executing code inside a callback when it is called by the + * GL, regardless of the debug source.

    + * + *

    The memory for {@code message} is owned and managed by the GL, and should only be considered valid for the duration of the function call.

    + * + *

    The behavior of calling any GL or window system function from within the callback function is undefined and may lead to program termination.

    + * + *

    Care must also be taken in securing debug callbacks for use with asynchronous debug output by multi-threaded GL implementations.

    + * + *

    If the {@link GL43C#GL_DEBUG_OUTPUT DEBUG_OUTPUT} state is disabled then the GL will not call the callback function.

    + * + * @param callback a callback function that will be called when a debug message is generated + * @param userParam a user supplied pointer that will be passed on each invocation of {@code callback} + */ + public static void glDebugMessageCallback(@Nullable @NativeType("GLDEBUGPROC") GLDebugMessageCallbackI callback, @NativeType("void const *") long userParam) { + GL43C.glDebugMessageCallback(callback, userParam); + } + + // --- [ glGetDebugMessageLog ] --- + + /** + * Unsafe version of: {@link #glGetDebugMessageLog GetDebugMessageLog} + * + * @param bufsize the size of the buffer whose address is given by {@code messageLog} + */ + public static int nglGetDebugMessageLog(int count, int bufsize, long sources, long types, long ids, long severities, long lengths, long messageLog) { + return GL43C.nglGetDebugMessageLog(count, bufsize, sources, types, ids, severities, lengths, messageLog); + } + + /** + * Retrieves messages from the debug message log. + * + *

    This function fetches a maximum of {@code count} messages from the message log, and will return the number of messages successfully fetched.

    + * + *

    Messages will be fetched from the log in order of oldest to newest. Those messages that were fetched will be removed from the log.

    + * + *

    The sources, types, severities, IDs, and string lengths of fetched messages will be stored in the application-provided arrays {@code sources}, + * {@code types}, {@code severities}, {@code ids}, and {@code lengths}, respectively. The application is responsible for allocating enough space for each + * array to hold up to {@code count} elements. The string representations of all fetched messages are stored in the {@code messageLog} array. If multiple + * messages are fetched, their strings are concatenated into the same {@code messageLog} array and will be separated by single null terminators. The last + * string in the array will also be null-terminated. The maximum size of {@code messageLog}, including the space used by all null terminators, is given by + * {@code bufSize}. If {@code bufSize} is less than zero and {@code messageLog} is not {@code NULL}, an {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error will be generated. If a message's + * string, including its null terminator, can not fully fit within the {@code messageLog} array's remaining space, then that message and any subsequent + * messages will not be fetched and will remain in the log. The string lengths stored in the array {@code lengths} include the space for the null + * terminator of each string.

    + * + *

    Any or all of the arrays {@code sources}, {@code types}, {@code ids}, {@code severities}, {@code lengths} and {@code messageLog} can also be null + * pointers, which causes the attributes for such arrays to be discarded when messages are fetched, however those messages will still be removed from the + * log. Thus to simply delete up to {@code count} messages from the message log while ignoring their attributes, the application can call the function + * with null pointers for all attribute arrays.

    + * + *

    If the context was created without the {@link GL43C#GL_CONTEXT_FLAG_DEBUG_BIT CONTEXT_FLAG_DEBUG_BIT} in the {@link GL30#GL_CONTEXT_FLAGS CONTEXT_FLAGS} state, then the GL can opt to never add messages to the + * message log so GetDebugMessageLog will always return zero.

    + * + * @param count the number of debug messages to retrieve from the log + * @param sources an array of variables to receive the sources of the retrieved messages + * @param types an array of variables to receive the types of the retrieved messages + * @param ids an array of unsigned integers to receive the ids of the retrieved messages + * @param severities an array of variables to receive the severites of the retrieved messages + * @param lengths an array of variables to receive the lengths of the received messages + * @param messageLog an array of characters that will receive the messages + */ + @NativeType("GLuint") + public static int glGetDebugMessageLog(@NativeType("GLuint") int count, @Nullable @NativeType("GLenum *") IntBuffer sources, @Nullable @NativeType("GLenum *") IntBuffer types, @Nullable @NativeType("GLuint *") IntBuffer ids, @Nullable @NativeType("GLenum *") IntBuffer severities, @Nullable @NativeType("GLsizei *") IntBuffer lengths, @Nullable @NativeType("GLchar *") ByteBuffer messageLog) { + return GL43C.glGetDebugMessageLog(count, sources, types, ids, severities, lengths, messageLog); + } + + // --- [ glPushDebugGroup ] --- + + /** + * Unsafe version of: {@link #glPushDebugGroup PushDebugGroup} + * + * @param length the length of the message to be sent to the debug output stream + */ + public static void nglPushDebugGroup(int source, int id, int length, long message) { + GL43C.nglPushDebugGroup(source, id, length, message); + } + + /** + * Pushes a debug group described by the string {@code message} into the command stream. The value of {@code id} specifies the ID of messages generated. + * The parameter {@code length} contains the number of characters in {@code message}. If {@code length} is negative, it is implied that {@code message} + * contains a null terminated string. The message has the specified {@code source} and {@code id}, {@code type} {@link GL43C#GL_DEBUG_TYPE_PUSH_GROUP DEBUG_TYPE_PUSH_GROUP}, and + * {@code severity} {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}. The GL will put a new debug group on top of the debug group stack which inherits the control of the + * volume of debug output of the debug group previously residing on the top of the debug group stack. Because debug groups are strictly hierarchical, any + * additional control of the debug output volume will only apply within the active debug group and the debug groups pushed on top of the active debug group. + * + *

    An {@link GL11#GL_INVALID_ENUM INVALID_ENUM} error is generated if the value of {@code source} is neither {@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION} nor {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}. An + * {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if {@code length} is negative and the number of characters in {@code message}, excluding the null-terminator, is + * not less than the value of {@link GL43C#GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + * @param source the source of the debug message. One of:
    {@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}
    + * @param id the identifier of the message + * @param message a string containing the message to be sent to the debug output stream + */ + public static void glPushDebugGroup(@NativeType("GLenum") int source, @NativeType("GLuint") int id, @NativeType("GLchar const *") ByteBuffer message) { + GL43C.glPushDebugGroup(source, id, message); + } + + /** + * Pushes a debug group described by the string {@code message} into the command stream. The value of {@code id} specifies the ID of messages generated. + * The parameter {@code length} contains the number of characters in {@code message}. If {@code length} is negative, it is implied that {@code message} + * contains a null terminated string. The message has the specified {@code source} and {@code id}, {@code type} {@link GL43C#GL_DEBUG_TYPE_PUSH_GROUP DEBUG_TYPE_PUSH_GROUP}, and + * {@code severity} {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}. The GL will put a new debug group on top of the debug group stack which inherits the control of the + * volume of debug output of the debug group previously residing on the top of the debug group stack. Because debug groups are strictly hierarchical, any + * additional control of the debug output volume will only apply within the active debug group and the debug groups pushed on top of the active debug group. + * + *

    An {@link GL11#GL_INVALID_ENUM INVALID_ENUM} error is generated if the value of {@code source} is neither {@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION} nor {@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}. An + * {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if {@code length} is negative and the number of characters in {@code message}, excluding the null-terminator, is + * not less than the value of {@link GL43C#GL_MAX_DEBUG_MESSAGE_LENGTH MAX_DEBUG_MESSAGE_LENGTH}.

    + * + * @param source the source of the debug message. One of:
    {@link GL43C#GL_DEBUG_SOURCE_APPLICATION DEBUG_SOURCE_APPLICATION}{@link GL43C#GL_DEBUG_SOURCE_THIRD_PARTY DEBUG_SOURCE_THIRD_PARTY}
    + * @param id the identifier of the message + * @param message a string containing the message to be sent to the debug output stream + */ + public static void glPushDebugGroup(@NativeType("GLenum") int source, @NativeType("GLuint") int id, @NativeType("GLchar const *") CharSequence message) { + GL43C.glPushDebugGroup(source, id, message); + } + + // --- [ glPopDebugGroup ] --- + + /** + * Pops the active debug group. When a debug group is popped, the GL will also generate a debug output message describing its cause based on the + * {@code message} string, the source {@code source}, and an ID {@code id} submitted to the associated {@link #glPushDebugGroup PushDebugGroup} command. {@link GL43C#GL_DEBUG_TYPE_PUSH_GROUP DEBUG_TYPE_PUSH_GROUP} + * and {@link GL43C#GL_DEBUG_TYPE_POP_GROUP DEBUG_TYPE_POP_GROUP} share a single namespace for message {@code id}. {@code severity} has the value {@link GL43C#GL_DEBUG_SEVERITY_NOTIFICATION DEBUG_SEVERITY_NOTIFICATION}. The {@code type} + * has the value {@link GL43C#GL_DEBUG_TYPE_POP_GROUP DEBUG_TYPE_POP_GROUP}. Popping a debug group restores the debug output volume control of the parent debug group. + * + *

    Attempting to pop the default debug group off the stack generates a {@link GL11#GL_STACK_UNDERFLOW STACK_UNDERFLOW} error; pushing a debug group onto a stack containing + * {@link GL43C#GL_MAX_DEBUG_GROUP_STACK_DEPTH MAX_DEBUG_GROUP_STACK_DEPTH} minus one elements will generate a {@link GL11#GL_STACK_OVERFLOW STACK_OVERFLOW} error.

    + */ + public static void glPopDebugGroup() { + GL43C.glPopDebugGroup(); + } + + // --- [ glObjectLabel ] --- + + /** + * Unsafe version of: {@link #glObjectLabel ObjectLabel} + * + * @param length the length of the label to be used for the object + */ + public static void nglObjectLabel(int identifier, int name, int length, long label) { + GL43C.nglObjectLabel(identifier, name, length, label); + } + + /** + * Labels a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link GL43C#GL_BUFFER BUFFER}{@link GL43C#GL_SHADER SHADER}{@link GL43C#GL_PROGRAM PROGRAM}{@link GL43C#GL_QUERY QUERY}{@link GL43C#GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link GL43C#GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object to label + * @param label a string containing the label to assign to the object + */ + public static void glObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @NativeType("GLchar const *") ByteBuffer label) { + GL43C.glObjectLabel(identifier, name, label); + } + + /** + * Labels a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link GL43C#GL_BUFFER BUFFER}{@link GL43C#GL_SHADER SHADER}{@link GL43C#GL_PROGRAM PROGRAM}{@link GL43C#GL_QUERY QUERY}{@link GL43C#GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link GL43C#GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object to label + * @param label a string containing the label to assign to the object + */ + public static void glObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @NativeType("GLchar const *") CharSequence label) { + GL43C.glObjectLabel(identifier, name, label); + } + + // --- [ glGetObjectLabel ] --- + + /** + * Unsafe version of: {@link #glGetObjectLabel GetObjectLabel} + * + * @param bufSize the length of the buffer whose address is in {@code label} + */ + public static void nglGetObjectLabel(int identifier, int name, int bufSize, long length, long label) { + GL43C.nglGetObjectLabel(identifier, name, bufSize, length, label); + } + + /** + * Retrieves the label of a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link GL43C#GL_BUFFER BUFFER}{@link GL43C#GL_SHADER SHADER}{@link GL43C#GL_PROGRAM PROGRAM}{@link GL43C#GL_QUERY QUERY}{@link GL43C#GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link GL43C#GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object whose label to retrieve + * @param length the address of a variable to receive the length of the object label + * @param label a string that will receive the object label + */ + public static void glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer label) { + GL43C.glGetObjectLabel(identifier, name, length, label); + } + + /** + * Retrieves the label of a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link GL43C#GL_BUFFER BUFFER}{@link GL43C#GL_SHADER SHADER}{@link GL43C#GL_PROGRAM PROGRAM}{@link GL43C#GL_QUERY QUERY}{@link GL43C#GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link GL43C#GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object whose label to retrieve + * @param bufSize the length of the buffer whose address is in {@code label} + */ + @NativeType("void") + public static String glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @NativeType("GLsizei") int bufSize) { + return GL43C.glGetObjectLabel(identifier, name, bufSize); + } + + /** + * Retrieves the label of a named object identified within a namespace. + * + * @param identifier the namespace from which the name of the object is allocated. One of:
    {@link GL43C#GL_BUFFER BUFFER}{@link GL43C#GL_SHADER SHADER}{@link GL43C#GL_PROGRAM PROGRAM}{@link GL43C#GL_QUERY QUERY}{@link GL43C#GL_PROGRAM_PIPELINE PROGRAM_PIPELINE}{@link GL43C#GL_SAMPLER SAMPLER}{@link GL11#GL_VERTEX_ARRAY VERTEX_ARRAY}{@link GL11#GL_TEXTURE TEXTURE}
    {@link GL30#GL_RENDERBUFFER RENDERBUFFER}{@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL40#GL_TRANSFORM_FEEDBACK TRANSFORM_FEEDBACK}
    + * @param name the name of the object whose label to retrieve + */ + @NativeType("void") + public static String glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name) { + return glGetObjectLabel(identifier, name, GL11.glGetInteger(GL_MAX_LABEL_LENGTH)); + } + + // --- [ glObjectPtrLabel ] --- + + /** + * Unsafe version of: {@link #glObjectPtrLabel ObjectPtrLabel} + * + * @param length the length of the label to be used for the object + */ + public static void nglObjectPtrLabel(long ptr, int length, long label) { + GL43C.nglObjectPtrLabel(ptr, length, label); + } + + /** + * Labels a sync object identified by a pointer. + * + * @param ptr a pointer identifying a sync object + * @param label a string containing the label to assign to the object + */ + public static void glObjectPtrLabel(@NativeType("void *") long ptr, @NativeType("GLchar const *") ByteBuffer label) { + GL43C.glObjectPtrLabel(ptr, label); + } + + /** + * Labels a sync object identified by a pointer. + * + * @param ptr a pointer identifying a sync object + * @param label a string containing the label to assign to the object + */ + public static void glObjectPtrLabel(@NativeType("void *") long ptr, @NativeType("GLchar const *") CharSequence label) { + GL43C.glObjectPtrLabel(ptr, label); + } + + // --- [ glGetObjectPtrLabel ] --- + + /** + * Unsafe version of: {@link #glGetObjectPtrLabel GetObjectPtrLabel} + * + * @param bufSize the length of the buffer whose address is in {@code label} + */ + public static void nglGetObjectPtrLabel(long ptr, int bufSize, long length, long label) { + GL43C.nglGetObjectPtrLabel(ptr, bufSize, length, label); + } + + /** + * Retrieves the label of a sync object identified by a pointer. + * + * @param ptr the name of the sync object whose label to retrieve + * @param length a variable to receive the length of the object label + * @param label a string that will receive the object label + */ + public static void glGetObjectPtrLabel(@NativeType("void *") long ptr, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLchar *") ByteBuffer label) { + GL43C.glGetObjectPtrLabel(ptr, length, label); + } + + /** + * Retrieves the label of a sync object identified by a pointer. + * + * @param ptr the name of the sync object whose label to retrieve + * @param bufSize the length of the buffer whose address is in {@code label} + */ + @NativeType("void") + public static String glGetObjectPtrLabel(@NativeType("void *") long ptr, @NativeType("GLsizei") int bufSize) { + return GL43C.glGetObjectPtrLabel(ptr, bufSize); + } + + /** + * Retrieves the label of a sync object identified by a pointer. + * + * @param ptr the name of the sync object whose label to retrieve + */ + @NativeType("void") + public static String glGetObjectPtrLabel(@NativeType("void *") long ptr) { + return glGetObjectPtrLabel(ptr, GL11.glGetInteger(GL_MAX_LABEL_LENGTH)); + } + + /** Array version of: {@link #glDebugMessageControl DebugMessageControl} */ + public static void glDebugMessageControl(@NativeType("GLenum") int source, @NativeType("GLenum") int type, @NativeType("GLenum") int severity, @Nullable @NativeType("GLuint const *") int[] ids, @NativeType("GLboolean") boolean enabled) { + GL43C.glDebugMessageControl(source, type, severity, ids, enabled); + } + + /** Array version of: {@link #glGetDebugMessageLog GetDebugMessageLog} */ + @NativeType("GLuint") + public static int glGetDebugMessageLog(@NativeType("GLuint") int count, @Nullable @NativeType("GLenum *") int[] sources, @Nullable @NativeType("GLenum *") int[] types, @Nullable @NativeType("GLuint *") int[] ids, @Nullable @NativeType("GLenum *") int[] severities, @Nullable @NativeType("GLsizei *") int[] lengths, @Nullable @NativeType("GLchar *") ByteBuffer messageLog) { + return GL43C.glGetDebugMessageLog(count, sources, types, ids, severities, lengths, messageLog); + } + + /** Array version of: {@link #glGetObjectLabel GetObjectLabel} */ + public static void glGetObjectLabel(@NativeType("GLenum") int identifier, @NativeType("GLuint") int name, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer label) { + GL43C.glGetObjectLabel(identifier, name, length, label); + } + + /** Array version of: {@link #glGetObjectPtrLabel GetObjectPtrLabel} */ + public static void glGetObjectPtrLabel(@NativeType("void *") long ptr, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLchar *") ByteBuffer label) { + GL43C.glGetObjectPtrLabel(ptr, length, label); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRNoError.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRNoError.java new file mode 100644 index 000000000..237188602 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRNoError.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the KHR_no_error extension. + * + *

    With this extension enabled any behavior that generates a GL error will have undefined behavior. The reason this extension exists is performance can be + * increased and power usage decreased. When this mode is used, a GL driver can have undefined behavior where it would have generated a GL error without + * this extension. This could include application termination. In general this extension should be used after you have verified all the GL errors are + * removed, and an application is not the kind that would check for GL errors and adjust behavior based on those errors.

    + * + *

    Requires {@link GL20 OpenGL 2.0}.

    + */ +public final class KHRNoError { + + /** If set in {@link GL30#GL_CONTEXT_FLAGS CONTEXT_FLAGS}, then no error behavior is enabled for this context. */ + public static final int GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR = 0x8; + + private KHRNoError() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRParallelShaderCompile.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRParallelShaderCompile.java new file mode 100644 index 000000000..065215d57 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRParallelShaderCompile.java @@ -0,0 +1,47 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the KHR_parallel_shader_compile extension. + * + *

    Compiling GLSL into implementation-specific code can be a time consuming process, so a GL implementation may wish to perform the compilation in a + * separate CPU thread. This extension provides a mechanism for the application to provide a hint to limit the number of threads it wants to be used to + * compile shaders, as well as a query to determine if the compilation process is complete.

    + */ +public class KHRParallelShaderCompile { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int GL_MAX_SHADER_COMPILER_THREADS_KHR = 0x91B0; + + /** Accepted as part of the {@code pname} parameter to {@link GL20C#glGetShaderiv GetShaderiv} and accepted as part of the {@code pname} parameter to {@link GL20C#glGetProgramiv GetProgramiv}. */ + public static final int GL_COMPLETION_STATUS_KHR = 0x91B1; + + protected KHRParallelShaderCompile() { + throw new UnsupportedOperationException(); + } + + // --- [ glMaxShaderCompilerThreadsKHR ] --- + + /** + * Applications may use this function to hint to the driver the maximum number background threads it would like to be used in the process of compiling + * shaders or linking programs, + * + *

    An implementation may combine the maximum compiler thread request from multiple contexts in a share group in an implementation-specific way.

    + * + *

    An application can query the current {@code MaxShaderCompilerThreadsKHR} {@code count} by calling {@link GL11C#glGetIntegerv GetIntegerv} with {@code pname} set to + * {@link #GL_MAX_SHADER_COMPILER_THREADS_KHR MAX_SHADER_COMPILER_THREADS_KHR}, which returns the value of the current state.

    + * + * @param count the number of background threads. A {@code count} of zero specifies a request for no parallel compiling or linking and a {@code count} of + * {@code 0xFFFFFFFF} requests an implementation-specific maximum. + */ + public static native void glMaxShaderCompilerThreadsKHR(@NativeType("GLuint") int count); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRRobustness.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRRobustness.java new file mode 100644 index 000000000..d54b6c928 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRRobustness.java @@ -0,0 +1,335 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +/** + * Native bindings to the KHR_robustness extension. + * + *

    Several recent trends in how OpenGL ES integrates into modern computer systems have created new requirements for robustness and security for GL + * rendering contexts.

    + * + *

    Additionally GPU architectures now support hardware fault detection; for example, video memory supporting ECC (error correcting codes) and error + * detection. GL contexts should be capable of recovering from hardware faults such as uncorrectable memory errors. Along with recovery from such hardware + * faults, the recovery mechanism can also allow recovery from video memory access exceptions and system software failures. System software failures can + * be due to device changes or driver failures.

    + * + *

    GL queries that return (write) some number of bytes to a buffer indicated by a pointer parameter introduce risk of buffer overflows that might be + * exploitable by malware. To address this, queries with return value sizes that are not expressed directly by the parameters to the query itself are + * given additional API functions with an additional parameter that specifies the number of bytes in the buffer and never writing bytes beyond that limit. + * This is particularly useful for multi-threaded usage of GL contexts in a "share group" where one context can change objects in ways that can cause + * buffer overflows for another context's GL queries.

    + * + *

    The original ARB_vertex_buffer_object extension includes an issue that explicitly states program termination is allowed when out-of-bounds vertex + * buffer object fetches occur. Modern graphics hardware is capable of well-defined behavior in the case of out-of- bounds vertex buffer object fetches. + * Older hardware may require extra checks to enforce well-defined (and termination free) behavior, but this expense is warranted when processing + * potentially untrusted content.

    + * + *

    The intent of this extension is to address some specific robustness goals:

    + * + *
      + *
    • For all existing GL queries, provide additional "safe" APIs that limit data written to user pointers to a buffer size in bytes that is an explicit + * additional parameter of the query.
    • + *
    • Provide a mechanism for a GL application to learn about graphics resets that affect the context. When a graphics reset occurs, the GL context + * becomes unusable and the application must create a new context to continue operation. Detecting a graphics reset happens through an inexpensive query.
    • + *
    • Define behavior of OpenGL calls made after a graphics reset.
    • + *
    • Provide an enable to guarantee that out-of-bounds buffer object accesses by the GPU will have deterministic behavior and preclude application + * instability or termination due to an incorrect buffer access. Such accesses include vertex buffer fetches of attributes and indices, and indexed + * reads of uniforms or parameters from buffers.
    • + *
    + * + *

    Requires {@link GL32 OpenGL 3.2}.

    + */ +public class KHRRobustness { + + static { GL.initialize(); } + + /** Returned by {@link #glGetGraphicsResetStatus GetGraphicsResetStatus}. */ + public static final int + GL_NO_ERROR = 0x0, + GL_GUILTY_CONTEXT_RESET = 0x8253, + GL_INNOCENT_CONTEXT_RESET = 0x8254, + GL_UNKNOWN_CONTEXT_RESET = 0x8255; + + /** Accepted by the {@code value} parameter of GetBooleanv, GetIntegerv, and GetFloatv. */ + public static final int + GL_CONTEXT_ROBUST_ACCESS = 0x90F3, + GL_RESET_NOTIFICATION_STRATEGY = 0x8256; + + /** Returned by GetIntegerv and related simple queries when {@code value} is {@link #GL_RESET_NOTIFICATION_STRATEGY RESET_NOTIFICATION_STRATEGY}. */ + public static final int + GL_LOSE_CONTEXT_ON_RESET = 0x8252, + GL_NO_RESET_NOTIFICATION = 0x8261; + + /** Returned by {@link GL11C#glGetError GetError}. */ + public static final int GL_CONTEXT_LOST = 0x507; + + protected KHRRobustness() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetGraphicsResetStatus ] --- + + /** + * Indicates if the GL context has been in a reset state at any point since the last call to GetGraphicsResetStatus: + * + *
      + *
    • {@link GL11#GL_NO_ERROR NO_ERROR} indicates that the GL context has not been in a reset state since the last call.
    • + *
    • {@link GL45C#GL_GUILTY_CONTEXT_RESET GUILTY_CONTEXT_RESET} indicates that a reset has been detected that is attributable to the current GL context.
    • + *
    • {@link GL45C#GL_INNOCENT_CONTEXT_RESET INNOCENT_CONTEXT_RESET} indicates a reset has been detected that is not attributable to the current GL context.
    • + *
    • {@link GL45C#GL_UNKNOWN_CONTEXT_RESET UNKNOWN_CONTEXT_RESET} indicates a detected graphics reset whose cause is unknown.
    • + *
    + * + *

    If a reset status other than NO_ERROR is returned and subsequent calls return NO_ERROR, the context reset was encountered and completed. If a reset + * status is repeatedly returned, the context may be in the process of resetting.

    + * + *

    Reset notification behavior is determined at context creation time, and may be queried by calling GetIntegerv with the symbolic constant + * {@link GL45C#GL_RESET_NOTIFICATION_STRATEGY RESET_NOTIFICATION_STRATEGY}.

    + * + *

    If the reset notification behavior is {@link GL45C#GL_NO_RESET_NOTIFICATION NO_RESET_NOTIFICATION}, then the implementation will never deliver notification of reset events, and + * GetGraphicsResetStatus will always return NO_ERROR.

    + * + *

    If the behavior is {@link GL45C#GL_LOSE_CONTEXT_ON_RESET LOSE_CONTEXT_ON_RESET}, a graphics reset will result in a lost context and require creating a new context as described + * above. In this case GetGraphicsResetStatus will return an appropriate value from those described above.

    + * + *

    If a graphics reset notification occurs in a context, a notification must also occur in all other contexts which share objects with that context.

    + * + *

    After a graphics reset has occurred on a context, subsequent GL commands on that context (or any context which shares with that context) will generate a + * {@link GL45C#GL_CONTEXT_LOST CONTEXT_LOST} error. Such commands will not have side effects (in particular, they will not modify memory passed by pointer for query results, + * and may not block indefinitely or cause termination of the application. Exceptions to this behavior include:

    + * + *
      + *
    • {@link GL11C#glGetError GetError} and GetGraphicsResetStatus behave normally following a graphics reset, so that the application can determine a reset has + * occurred, and when it is safe to destroy and recreate the context.
    • + *
    • Any commands which might cause a polling application to block indefinitely will generate a CONTEXT_LOST error, but will also return a value + * indicating completion to the application.
    • + *
    + */ + @NativeType("GLenum") + public static int glGetGraphicsResetStatus() { + return GL45C.glGetGraphicsResetStatus(); + } + + // --- [ glReadnPixels ] --- + + /** + * Unsafe version of: {@link #glReadnPixels ReadnPixels} + * + * @param bufSize the maximum number of bytes to write into {@code data} + */ + public static void nglReadnPixels(int x, int y, int width, int height, int format, int type, int bufSize, long pixels) { + GL45C.nglReadnPixels(x, y, width, height, format, type, bufSize, pixels); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param bufSize the maximum number of bytes to write into {@code data} + * @param pixels a buffer in which to place the returned pixel data + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("GLsizei") int bufSize, @NativeType("void *") long pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, bufSize, pixels); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ByteBuffer pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") ShortBuffer pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") IntBuffer pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** + * Behaves identically to {@link GL11C#glReadPixels ReadPixels} except that it does not write more than {@code bufSize} bytes into {@code data} + * + * @param x the left pixel coordinate + * @param y the lower pixel coordinate + * @param width the number of pixels to read in the x-dimension + * @param height the number of pixels to read in the y-dimension + * @param format the pixel format. One of:
    {@link GL11#GL_RED RED}{@link GL11#GL_GREEN GREEN}{@link GL11#GL_BLUE BLUE}{@link GL11#GL_ALPHA ALPHA}{@link GL30#GL_RG RG}{@link GL11#GL_RGB RGB}{@link GL11C#GL_RGBA RGBA}{@link GL12#GL_BGR BGR}
    {@link GL12#GL_BGRA BGRA}{@link GL30#GL_RED_INTEGER RED_INTEGER}{@link GL30#GL_GREEN_INTEGER GREEN_INTEGER}{@link GL30#GL_BLUE_INTEGER BLUE_INTEGER}{@link GL30#GL_ALPHA_INTEGER ALPHA_INTEGER}{@link GL30#GL_RG_INTEGER RG_INTEGER}{@link GL30#GL_RGB_INTEGER RGB_INTEGER}{@link GL30#GL_RGBA_INTEGER RGBA_INTEGER}
    {@link GL30#GL_BGR_INTEGER BGR_INTEGER}{@link GL30#GL_BGRA_INTEGER BGRA_INTEGER}{@link GL11#GL_STENCIL_INDEX STENCIL_INDEX}{@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT}{@link GL30#GL_DEPTH_STENCIL DEPTH_STENCIL}{@link GL11#GL_LUMINANCE LUMINANCE}{@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA}
    + * @param type the pixel type. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_SHORT SHORT}
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL30#GL_HALF_FLOAT HALF_FLOAT}{@link GL11#GL_FLOAT FLOAT}
    {@link GL12#GL_UNSIGNED_BYTE_3_3_2 UNSIGNED_BYTE_3_3_2}{@link GL12#GL_UNSIGNED_BYTE_2_3_3_REV UNSIGNED_BYTE_2_3_3_REV}{@link GL12#GL_UNSIGNED_SHORT_5_6_5 UNSIGNED_SHORT_5_6_5}{@link GL12#GL_UNSIGNED_SHORT_5_6_5_REV UNSIGNED_SHORT_5_6_5_REV}
    {@link GL12#GL_UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_4_4_4_4}{@link GL12#GL_UNSIGNED_SHORT_4_4_4_4_REV UNSIGNED_SHORT_4_4_4_4_REV}{@link GL12#GL_UNSIGNED_SHORT_5_5_5_1 UNSIGNED_SHORT_5_5_5_1}{@link GL12#GL_UNSIGNED_SHORT_1_5_5_5_REV UNSIGNED_SHORT_1_5_5_5_REV}
    {@link GL12#GL_UNSIGNED_INT_8_8_8_8 UNSIGNED_INT_8_8_8_8}{@link GL12#GL_UNSIGNED_INT_8_8_8_8_REV UNSIGNED_INT_8_8_8_8_REV}{@link GL12#GL_UNSIGNED_INT_10_10_10_2 UNSIGNED_INT_10_10_10_2}{@link GL12#GL_UNSIGNED_INT_2_10_10_10_REV UNSIGNED_INT_2_10_10_10_REV}
    {@link GL30#GL_UNSIGNED_INT_24_8 UNSIGNED_INT_24_8}{@link GL30#GL_UNSIGNED_INT_10F_11F_11F_REV UNSIGNED_INT_10F_11F_11F_REV}{@link GL30#GL_UNSIGNED_INT_5_9_9_9_REV UNSIGNED_INT_5_9_9_9_REV}{@link GL30#GL_FLOAT_32_UNSIGNED_INT_24_8_REV FLOAT_32_UNSIGNED_INT_24_8_REV}
    {@link GL11#GL_BITMAP BITMAP}
    + * @param pixels a buffer in which to place the returned pixel data + */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") FloatBuffer pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + // --- [ glGetnUniformfv ] --- + + /** + * Unsafe version of: {@link #glGetnUniformfv GetnUniformfv} + * + * @param bufSize the maximum number of bytes to write to {@code params} + */ + public static void nglGetnUniformfv(int program, int location, int bufSize, long params) { + GL45C.nglGetnUniformfv(program, location, bufSize, params); + } + + /** + * Returns the value or values of a uniform of the default uniform block. + * + * @param program the program object + * @param location the uniform location + * @param params the buffer in which to place the returned data + */ + public static void glGetnUniformfv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") FloatBuffer params) { + GL45C.glGetnUniformfv(program, location, params); + } + + /** + * Returns the value or values of a uniform of the default uniform block. + * + * @param program the program object + * @param location the uniform location + */ + @NativeType("void") + public static float glGetnUniformf(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL45C.glGetnUniformf(program, location); + } + + // --- [ glGetnUniformiv ] --- + + /** + * Unsafe version of: {@link #glGetnUniformiv GetnUniformiv} + * + * @param bufSize the maximum number of bytes to write to {@code params} + */ + public static void nglGetnUniformiv(int program, int location, int bufSize, long params) { + GL45C.nglGetnUniformiv(program, location, bufSize, params); + } + + /** + * Integer version of {@link #glGetnUniformfv GetnUniformfv}. + * + * @param program the program object + * @param location the uniform location + * @param params the buffer in which to place the returned data + */ + public static void glGetnUniformiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") IntBuffer params) { + GL45C.glGetnUniformiv(program, location, params); + } + + /** + * Integer version of {@link #glGetnUniformfv GetnUniformfv}. + * + * @param program the program object + * @param location the uniform location + */ + @NativeType("void") + public static int glGetnUniformi(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL45C.glGetnUniformi(program, location); + } + + // --- [ glGetnUniformuiv ] --- + + /** + * Unsafe version of: {@link #glGetnUniformuiv GetnUniformuiv} + * + * @param bufSize the maximum number of bytes to write to {@code params} + */ + public static void nglGetnUniformuiv(int program, int location, int bufSize, long params) { + GL45C.nglGetnUniformuiv(program, location, bufSize, params); + } + + /** + * Unsigned version of {@link #glGetnUniformiv GetnUniformiv}. + * + * @param program the program object + * @param location the uniform location + * @param params the buffer in which to place the returned data + */ + public static void glGetnUniformuiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") IntBuffer params) { + GL45C.glGetnUniformuiv(program, location, params); + } + + /** + * Unsigned version of {@link #glGetnUniformiv GetnUniformiv}. + * + * @param program the program object + * @param location the uniform location + */ + @NativeType("void") + public static int glGetnUniformui(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return GL45C.glGetnUniformui(program, location); + } + + /** Array version of: {@link #glReadnPixels ReadnPixels} */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") short[] pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** Array version of: {@link #glReadnPixels ReadnPixels} */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") int[] pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** Array version of: {@link #glReadnPixels ReadnPixels} */ + public static void glReadnPixels(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLenum") int format, @NativeType("GLenum") int type, @NativeType("void *") float[] pixels) { + GL45C.glReadnPixels(x, y, width, height, format, type, pixels); + } + + /** Array version of: {@link #glGetnUniformfv GetnUniformfv} */ + public static void glGetnUniformfv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLfloat *") float[] params) { + GL45C.glGetnUniformfv(program, location, params); + } + + /** Array version of: {@link #glGetnUniformiv GetnUniformiv} */ + public static void glGetnUniformiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint *") int[] params) { + GL45C.glGetnUniformiv(program, location, params); + } + + /** Array version of: {@link #glGetnUniformuiv GetnUniformuiv} */ + public static void glGetnUniformuiv(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint *") int[] params) { + GL45C.glGetnUniformuiv(program, location, params); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRShaderSubgroup.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRShaderSubgroup.java new file mode 100644 index 000000000..ef08380f6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRShaderSubgroup.java @@ -0,0 +1,51 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the KHR_shader_subgroup extension. + * + *

    This extension enables support for the {@code KHR_shader_subgroup} shading language extension in OpenGL.

    + * + *

    The extension adds API queries to be able to query

    + * + *
      + *
    • the size of subgroups in this implementation ({@link #GL_SUBGROUP_SIZE_KHR SUBGROUP_SIZE_KHR})
    • + *
    • which shader stages support subgroup operations ({@link #GL_SUBGROUP_SUPPORTED_STAGES_KHR SUBGROUP_SUPPORTED_STAGES_KHR})
    • + *
    • which subgroup features are supported ({@link #GL_SUBGROUP_SUPPORTED_FEATURES_KHR SUBGROUP_SUPPORTED_FEATURES_KHR})
    • + *
    • whether quad subgroup operations are supported in all stages supporting subgroup operations ({@link #GL_SUBGROUP_QUAD_ALL_STAGES_KHR SUBGROUP_QUAD_ALL_STAGES_KHR})
    • + *
    + * + *

    In OpenGL implementations supporting SPIR-V, this extension enables the minimal subset of SPIR-V 1.3 which is required to support the subgroup features + * that are supported by the implementation.

    + * + *

    Requires {@link GL43 OpenGL 4.3}.

    + */ +public final class KHRShaderSubgroup { + + /** Accepted as the {@code pname} argument for {@link GL11C#glGetIntegerv GetIntegerv} and {@link GL32C#glGetInteger64v GetInteger64v}. */ + public static final int + GL_SUBGROUP_SIZE_KHR = 0x9532, + GL_SUBGROUP_SUPPORTED_STAGES_KHR = 0x9533, + GL_SUBGROUP_SUPPORTED_FEATURES_KHR = 0x9534; + + /** Accepted as the {@code pname} argument for {@link GL11C#glGetBooleanv GetBooleanv}. */ + public static final int GL_SUBGROUP_QUAD_ALL_STAGES_KHR = 0x9535; + + /** Returned as bitfield in the {@code data} argument when {@link GL11C#glGetIntegerv GetIntegerv} is queried with a {@code pname} of {@link #GL_SUBGROUP_SUPPORTED_FEATURES_KHR SUBGROUP_SUPPORTED_FEATURES_KHR}. */ + public static final int + GL_SUBGROUP_FEATURE_BASIC_BIT_KHR = 0x1, + GL_SUBGROUP_FEATURE_VOTE_BIT_KHR = 0x2, + GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR = 0x4, + GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR = 0x8, + GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR = 0x10, + GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR = 0x20, + GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR = 0x40, + GL_SUBGROUP_FEATURE_QUAD_BIT_KHR = 0x80; + + private KHRShaderSubgroup() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRTextureCompressionASTCLDR.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRTextureCompressionASTCLDR.java new file mode 100644 index 000000000..d1a41fde7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/KHRTextureCompressionASTCLDR.java @@ -0,0 +1,80 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the KHR_texture_compression_astc_ldr extension. + * + *

    Adaptive Scalable Texture Compression (ASTC) is a new texture compression technology that offers unprecendented flexibility, while producing better or + * comparable results than existing texture compressions at all bit rates. It includes support for 2D and slice-based 3D textures, with low and high + * dynamic range, at bitrates from below 1 bit/pixel up to 8 bits/pixel in fine steps.

    + * + *

    The goal of this extension is to support the full 2D profile of the ASTC texture compression specification, and allow construction of 3D textures from + * multiple 2D slices.

    + * + *

    ASTC-compressed textures are handled in OpenGL by adding new supported formats to the existing mechanisms for handling compressed textures.

    + * + *

    What is ASTC

    + * + *

    ASTC stands for Adaptive Scalable Texture Compression. The ASTC formats form a family of related compressed texture image formats. They are all derived + * from a common set of definitions.

    + * + *

    ASTC textures may be either 2D or 3D.

    + * + *

    ASTC textures may be encoded using either high or low dynamic range. Low dynamic range images may optionally be specified using the sRGB color space.

    + * + *

    A sub-profile ("HDR Profile") is defined, which supports only 2D images (and 3D images made up of multiple 2D slices) at low or high dynamic range.

    + * + *

    Support for this profile is indicated by the presence of the extension string "GL_KHR_texture_compression_astc_hdr". If, in future, the full profile is + * supported, "GL_KHR_texture_compression_astc_hdr" must still be published, in order to ensure backward compatibility.

    + * + *

    A lower sub-profile ("LDR Profile") may be implemented, which supports only 2D images at low dynamic range. This is indicated by the presence of the + * extension string "GL_KHR_texture_compression_astc_ldr". If either the HDR or full profile are implemented, then both name strings + * "GL_KHR_texture_compression_astc_ldr" and "GL_KHR_texture_compression_astc_hdr" must be published.

    + * + *

    ASTC textures may be encoded as 1, 2, 3 or 4 components, but they are all decoded into RGBA.

    + * + *

    ASTC has a variable block size, and this is specified as part of the name of the token passed to CompressedImage2D and its related functions.

    + */ +public final class KHRTextureCompressionASTCLDR { + + /** + * Accepted by the {@code internalformat} parameter of CompressedTexImage2D, CompressedTexSubImage2D, TexStorage2D, TextureStorage2D, TexStorage3D, and + * TextureStorage3D. + */ + public static final int + GL_COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0, + GL_COMPRESSED_RGBA_ASTC_5x4_KHR = 0x93B1, + GL_COMPRESSED_RGBA_ASTC_5x5_KHR = 0x93B2, + GL_COMPRESSED_RGBA_ASTC_6x5_KHR = 0x93B3, + GL_COMPRESSED_RGBA_ASTC_6x6_KHR = 0x93B4, + GL_COMPRESSED_RGBA_ASTC_8x5_KHR = 0x93B5, + GL_COMPRESSED_RGBA_ASTC_8x6_KHR = 0x93B6, + GL_COMPRESSED_RGBA_ASTC_8x8_KHR = 0x93B7, + GL_COMPRESSED_RGBA_ASTC_10x5_KHR = 0x93B8, + GL_COMPRESSED_RGBA_ASTC_10x6_KHR = 0x93B9, + GL_COMPRESSED_RGBA_ASTC_10x8_KHR = 0x93BA, + GL_COMPRESSED_RGBA_ASTC_10x10_KHR = 0x93BB, + GL_COMPRESSED_RGBA_ASTC_12x10_KHR = 0x93BC, + GL_COMPRESSED_RGBA_ASTC_12x12_KHR = 0x93BD, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 0x93D0, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR = 0x93D1, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR = 0x93D2, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR = 0x93D3, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR = 0x93D4, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR = 0x93D5, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR = 0x93D6, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR = 0x93D7, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR = 0x93D8, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR = 0x93D9, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR = 0x93DA, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR = 0x93DB, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR = 0x93DC, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR = 0x93DD; + + private KHRTextureCompressionASTCLDR() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferFlipX.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferFlipX.java new file mode 100644 index 000000000..7ebedb3cd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferFlipX.java @@ -0,0 +1,31 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the MESA_framebuffer_flip_x extension. + * + *

    This extension defines a new framebuffer parameter, {@link #GL_FRAMEBUFFER_FLIP_X_MESA FRAMEBUFFER_FLIP_X_MESA}, that changes the behavior of the reads and writes to the framebuffer + * attachment points. When {@code GL_FRAMEBUFFER_FLIP_X_MESA} is {@link GL11#GL_TRUE TRUE}, render commands and pixel transfer operations access the backing store of each + * attachment point with an x-inverted coordinate system. This x-inversion is relative to the coordinate system set when + * {@code GL_FRAMEBUFFER_FLIP_X_MESA} is {@link GL11#GL_FALSE FALSE}.

    + * + *

    Access through {@link GL11C#glTexSubImage2D TexSubImage2D} and similar calls will notice the effect of the flip when they are not attached to framebuffer objects because + * {@code GL_FRAMEBUFFER_FLIP_X_MESA} is associated with the framebuffer object and not the attachment points.

    + * + *

    This extension is mainly for pre-rotation and recommended to use it with {@code MESA_framebuffer_flip_y} and {@code MESA_framebuffer_swap_xy} to have + * rotated result.

    + * + *

    Requires {@link GL43 OpenGL 4.3}.

    + */ +public final class MESAFramebufferFlipX { + + /** Accepted by the {@code pname} argument of {@link GL43C#glFramebufferParameteri FramebufferParameteri} and {@link GL43C#glGetFramebufferParameteriv GetFramebufferParameteriv}. */ + public static final int GL_FRAMEBUFFER_FLIP_X_MESA = 0x8BBC; + + private MESAFramebufferFlipX() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferFlipY.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferFlipY.java new file mode 100644 index 000000000..94ccafc53 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferFlipY.java @@ -0,0 +1,65 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the MESA_framebuffer_flip_y extension. + * + *

    This extension defines a new framebuffer parameter, {@link #GL_FRAMEBUFFER_FLIP_Y_MESA FRAMEBUFFER_FLIP_Y_MESA}, that changes the behavior of the reads and writes to the framebuffer + * attachment points. When {@code GL_FRAMEBUFFER_FLIP_Y_MESA} is {@link GL11#GL_TRUE TRUE}, render commands and pixel transfer operations access the backing store of each + * attachment point with an y-inverted coordinate system. This y-inversion is relative to the coordinate system set when + * {@code GL_FRAMEBUFFER_FLIP_Y_MESA} is {@link GL11#GL_FALSE FALSE}.

    + * + *

    Access through {@link GL11C#glTexSubImage2D TexSubImage2D} and similar calls will notice the effect of the flip when they are not attached to framebuffer objects because + * {@code GL_FRAMEBUFFER_FLIP_Y_MESA} is associated with the framebuffer object and not the attachment points.

    + * + *

    Requires {@link GL43 OpenGL 4.3} or {@link ARBFramebufferNoAttachments ARB_framebuffer_no_attachments}.

    + */ +public class MESAFramebufferFlipY { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} argument of {@link #glFramebufferParameteriMESA FramebufferParameteriMESA} and {@link #glGetFramebufferParameterivMESA GetFramebufferParameterivMESA}. */ + public static final int GL_FRAMEBUFFER_FLIP_Y_MESA = 0x8BBB; + + protected MESAFramebufferFlipY() { + throw new UnsupportedOperationException(); + } + + // --- [ glFramebufferParameteriMESA ] --- + + public static native void glFramebufferParameteriMESA(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glGetFramebufferParameterivMESA ] --- + + public static native void nglGetFramebufferParameterivMESA(int target, int pname, long params); + + public static void glGetFramebufferParameterivMESA(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetFramebufferParameterivMESA(target, pname, memAddress(params)); + } + + /** Array version of: {@link #glGetFramebufferParameterivMESA GetFramebufferParameterivMESA} */ + public static void glGetFramebufferParameterivMESA(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetFramebufferParameterivMESA; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferSwapXY.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferSwapXY.java new file mode 100644 index 000000000..2704f8fe0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/MESAFramebufferSwapXY.java @@ -0,0 +1,33 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the MESA_framebuffer_swap_xy extension. + * + *

    This extension defines a new framebuffer parameter, {@link #GL_FRAMEBUFFER_SWAP_XY_MESA FRAMEBUFFER_SWAP_XY_MESA}, that changes the behavior of the reads and writes to the framebuffer + * attachment points. When {@code GL_FRAMEBUFFER_SWAP_XY_MESA} is {@link GL11#GL_TRUE TRUE}, render commands and pixel transfer operations access the backing store of each + * attachment point with an xy-swapped coordinate system. This xy-inversion is relative to the coordinate system set when + * {@code GL_FRAMEBUFFER_SWAP_XY_MESA} is {@link GL11#GL_FALSE FALSE}.

    + * + *

    Access through {@link GL11C#glTexSubImage2D TexSubImage2D} and similar calls will notice the effect of the swap when they are not attached to framebuffer objects because + * {@code GL_FRAMEBUFFER_SWAP_XY_MESA} is associated with the framebuffer object and not the attachment points.

    + * + *

    The application should notice the display width and height are also swapped when {@code GL_FRAMEBUFFER_SWAP_XY_MESA} is {@code GL_TRUE}.

    + * + *

    This extension is mainly for pre-rotation and recommended to use it with {@code MESA_framebuffer_flip_x} and {@code MESA_framebuffer_flip_y} to have + * rotated result.

    + * + *

    Requires {@link GL43 OpenGL 4.3}.

    + */ +public final class MESAFramebufferSwapXY { + + /** Accepted by the {@code pname} argument of {@link GL43C#glFramebufferParameteri FramebufferParameteri} and {@link GL43C#glGetFramebufferParameteriv GetFramebufferParameteriv}. */ + public static final int GL_FRAMEBUFFER_SWAP_XY_MESA = 0x8BBD; + + private MESAFramebufferSwapXY() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVAlphaToCoverageDitherControl.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVAlphaToCoverageDitherControl.java new file mode 100644 index 000000000..3667272c4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVAlphaToCoverageDitherControl.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_alpha_to_coverage_dither_control extension. + * + *

    {@code NV_alpha_to_coverage_dither_control} provides a new mechanism to control whether dithering is applied when the existing alpha to coverage + * functionality is used.

    + */ +public class NVAlphaToCoverageDitherControl { + + static { GL.initialize(); } + + /** Accepted by the {@code param} parameter of {@link #glAlphaToCoverageDitherControlNV AlphaToCoverageDitherControlNV}. */ + public static final int + GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV = 0x934D, + GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV = 0x934E, + GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV = 0x934F; + + /** Accepted by the {@code param} of {@link GL11C#glGetIntegerv GetIntegerv}. */ + public static final int GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV = 0x92BF; + + protected NVAlphaToCoverageDitherControl() { + throw new UnsupportedOperationException(); + } + + // --- [ glAlphaToCoverageDitherControlNV ] --- + + public static native void glAlphaToCoverageDitherControlNV(@NativeType("GLenum") int mode); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessMultiDrawIndirect.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessMultiDrawIndirect.java new file mode 100644 index 000000000..20a3b157b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessMultiDrawIndirect.java @@ -0,0 +1,169 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_bindless_multi_draw_indirect extension. + * + *

    This extension combines {@code NV_vertex_buffer_unified_memory} and {@code ARB_multi_draw_indirect} to allow the processing of multiple drawing + * commands, whose vertex and index data can be sourced from arbitrary buffer locations, by a single function call.

    + * + *

    The {@code NV_vertex_buffer_unified_memory} extension provided a mechanism to specify vertex attrib and element array locations using GPU addresses. + * Prior to this extension, these addresses had to be set through explicit function calls. Now the ability to set the pointer addresses indirectly by + * extending the {@link ARBDrawIndirect ARB_draw_indirect} mechanism has been added.

    + * + *

    Combined with other "bindless" extensions, such as {@link NVBindlessTexture NV_bindless_texture} and {@link NVShaderBufferLoad NV_shader_buffer_load}, it is now possible for the GPU to + * create draw commands that source all resource inputs, which are common to change frequently between draw calls from the GPU: vertex and index buffers, + * samplers, images and other shader input data stored in buffers.

    + * + *

    Requires {@link GL43 OpenGL 4.3} or {@link ARBMultiDrawIndirect ARB_multi_draw_indirect}, and {@link NVVertexBufferUnifiedMemory NV_vertex_buffer_unified_memory}.

    + */ +public class NVBindlessMultiDrawIndirect { + + static { GL.initialize(); } + + protected NVBindlessMultiDrawIndirect() { + throw new UnsupportedOperationException(); + } + + // --- [ glMultiDrawArraysIndirectBindlessNV ] --- + + /** Unsafe version of: {@link #glMultiDrawArraysIndirectBindlessNV MultiDrawArraysIndirectBindlessNV} */ + public static native void nglMultiDrawArraysIndirectBindlessNV(int mode, long indirect, int drawCount, int stride, int vertexBufferCount); + + /** + * Behaves similar to {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}, except that {@code indirect} is treated as an array of {@code drawCount} + * {@code DrawArraysIndirectBindlessCommandNV} structures: + * + *
    
    +     * typedef struct {
    +     *   GLuint   index;
    +     *   GLuint   reserved;
    +     *   GLuint64 address;
    +     *   GLuint64 length;
    +     * } BindlessPtrNV;
    +     * 
    +     * typedef struct {
    +     *   DrawArraysIndirectCommand   cmd;
    +     *   BindlessPtrNV               vertexBuffers[];
    +     * } DrawArraysIndirectBindlessCommandNV;
    + * + * @param mode the primitive mode. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of {@code DrawArraysIndirectBindlessCommandNV} structures (see the extension spec for more information) + * @param drawCount the number of structures in the {@code indirect} array + * @param stride the size of one {@code DrawArraysIndirectBindlessCommandNV} structure + * @param vertexBufferCount the number of vertex buffers in the {@code DrawArraysIndirectBindlessCommandNV} structure + */ + public static void glMultiDrawArraysIndirectBindlessNV(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLsizei") int drawCount, @NativeType("GLsizei") int stride, @NativeType("GLint") int vertexBufferCount) { + if (CHECKS) { + check(indirect, drawCount * (stride == 0 ? (16 + vertexBufferCount * 24) : stride)); + } + nglMultiDrawArraysIndirectBindlessNV(mode, memAddress(indirect), drawCount, stride, vertexBufferCount); + } + + /** + * Behaves similar to {@link GL43C#glMultiDrawArraysIndirect MultiDrawArraysIndirect}, except that {@code indirect} is treated as an array of {@code drawCount} + * {@code DrawArraysIndirectBindlessCommandNV} structures: + * + *
    
    +     * typedef struct {
    +     *   GLuint   index;
    +     *   GLuint   reserved;
    +     *   GLuint64 address;
    +     *   GLuint64 length;
    +     * } BindlessPtrNV;
    +     * 
    +     * typedef struct {
    +     *   DrawArraysIndirectCommand   cmd;
    +     *   BindlessPtrNV               vertexBuffers[];
    +     * } DrawArraysIndirectBindlessCommandNV;
    + * + * @param mode the primitive mode. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of {@code DrawArraysIndirectBindlessCommandNV} structures (see the extension spec for more information) + * @param drawCount the number of structures in the {@code indirect} array + * @param stride the size of one {@code DrawArraysIndirectBindlessCommandNV} structure + * @param vertexBufferCount the number of vertex buffers in the {@code DrawArraysIndirectBindlessCommandNV} structure + */ + public static void glMultiDrawArraysIndirectBindlessNV(@NativeType("GLenum") int mode, @NativeType("void const *") long indirect, @NativeType("GLsizei") int drawCount, @NativeType("GLsizei") int stride, @NativeType("GLint") int vertexBufferCount) { + nglMultiDrawArraysIndirectBindlessNV(mode, indirect, drawCount, stride, vertexBufferCount); + } + + // --- [ glMultiDrawElementsIndirectBindlessNV ] --- + + /** Unsafe version of: {@link #glMultiDrawElementsIndirectBindlessNV MultiDrawElementsIndirectBindlessNV} */ + public static native void nglMultiDrawElementsIndirectBindlessNV(int mode, int type, long indirect, int drawCount, int stride, int vertexBufferCount); + + /** + * Behaves similar to {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect}, except that {@code indirect} is treated as an array of {@code drawCount} + * {@code DrawElementsIndirectBindlessCommandNV} structures: + * + *
    
    +     *  typedef struct {
    +     *   GLuint   index;
    +     *   GLuint   reserved;
    +     *   GLuint64 address;
    +     *   GLuint64 length;
    +     * } BindlessPtrNV;
    +     * 
    +     * typedef struct {
    +     *   DrawElementsIndirectCommand cmd;
    +     *   GLuint                      reserved;
    +     *   BindlessPtrNV               indexBuffer;
    +     *   BindlessPtrNV               vertexBuffers[];
    +     * } DrawElementsIndirectBindlessCommandNV;
    + * + * @param mode the primitive mode. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the data type of the element indices. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect an array of {@code DrawElementsIndirectBindlessCommandNV} structures (see the extension spec for more information) + * @param drawCount the number of structures in the {@code indirect} array + * @param stride the size of one {@code DrawElementsIndirectBindlessCommandNV} structure + * @param vertexBufferCount the number of vertex buffers in the {@code DrawElementsIndirectBindlessCommandNV} structure + */ + public static void glMultiDrawElementsIndirectBindlessNV(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLsizei") int drawCount, @NativeType("GLsizei") int stride, @NativeType("GLint") int vertexBufferCount) { + if (CHECKS) { + check(indirect, drawCount * (stride == 0 ? ((vertexBufferCount + 2) * 24) : stride)); + } + nglMultiDrawElementsIndirectBindlessNV(mode, type, memAddress(indirect), drawCount, stride, vertexBufferCount); + } + + /** + * Behaves similar to {@link GL43C#glMultiDrawElementsIndirect MultiDrawElementsIndirect}, except that {@code indirect} is treated as an array of {@code drawCount} + * {@code DrawElementsIndirectBindlessCommandNV} structures: + * + *
    
    +     *  typedef struct {
    +     *   GLuint   index;
    +     *   GLuint   reserved;
    +     *   GLuint64 address;
    +     *   GLuint64 length;
    +     * } BindlessPtrNV;
    +     * 
    +     * typedef struct {
    +     *   DrawElementsIndirectCommand cmd;
    +     *   GLuint                      reserved;
    +     *   BindlessPtrNV               indexBuffer;
    +     *   BindlessPtrNV               vertexBuffers[];
    +     * } DrawElementsIndirectBindlessCommandNV;
    + * + * @param mode the primitive mode. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the data type of the element indices. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect an array of {@code DrawElementsIndirectBindlessCommandNV} structures (see the extension spec for more information) + * @param drawCount the number of structures in the {@code indirect} array + * @param stride the size of one {@code DrawElementsIndirectBindlessCommandNV} structure + * @param vertexBufferCount the number of vertex buffers in the {@code DrawElementsIndirectBindlessCommandNV} structure + */ + public static void glMultiDrawElementsIndirectBindlessNV(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") long indirect, @NativeType("GLsizei") int drawCount, @NativeType("GLsizei") int stride, @NativeType("GLint") int vertexBufferCount) { + nglMultiDrawElementsIndirectBindlessNV(mode, type, indirect, drawCount, stride, vertexBufferCount); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessMultiDrawIndirectCount.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessMultiDrawIndirectCount.java new file mode 100644 index 000000000..e8bdddc2a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessMultiDrawIndirectCount.java @@ -0,0 +1,117 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_bindless_multi_draw_indirect_count extension. + * + *

    This extension adds the possibility to define the number of drawcalls within a multi-draw-indirect call from the GPU, as provided by + * {@code ARB_indirect_parameters}, for the functions added in {@code NV_bindless_multi_draw_indirect}.

    + * + *

    Requires {@link NVBindlessMultiDrawIndirect NV_bindless_multi_draw_indirect}, {@link ARBIndirectParameters ARB_indirect_parameters}.

    + */ +public class NVBindlessMultiDrawIndirectCount { + + static { GL.initialize(); } + + protected NVBindlessMultiDrawIndirectCount() { + throw new UnsupportedOperationException(); + } + + // --- [ glMultiDrawArraysIndirectBindlessCountNV ] --- + + /** Unsafe version of: {@link #glMultiDrawArraysIndirectBindlessCountNV MultiDrawArraysIndirectBindlessCountNV} */ + public static native void nglMultiDrawArraysIndirectBindlessCountNV(int mode, long indirect, long drawCount, int maxDrawCount, int stride, int vertexBufferCount); + + /** + * Behaves similarly to {@link NVBindlessMultiDrawIndirect#glMultiDrawArraysIndirectBindlessNV MultiDrawArraysIndirectBindlessNV}, except that {@code drawCount} defines an offset (in bytes) into + * the buffer object bound to the PARAMETER_BUFFER_ARB binding point at which a single {@code sizei} typed value is stored, which contains the draw count. + * If the value stored at {@code drawCount} into the buffer is greater than {@code maxDrawCount}, an implementation may stop processing draws after + * {@code maxDrawCount} parameter sets. + * + * @param mode the primitive mode. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of DrawArraysIndirectBindlessCommandNV structures (see the extension spec for more information) + * @param drawCount the byte offset into the buffer object containing the draw count. This offset must be a multiple of 4 + * @param maxDrawCount the maximum number of draws that are expected to be stored in the buffer + * @param stride the size of one DrawArraysIndirectBindlessCommandNV structure + * @param vertexBufferCount the number of vertex buffers in the DrawArraysIndirectBindlessCommandNV structure + */ + public static void glMultiDrawArraysIndirectBindlessCountNV(@NativeType("GLenum") int mode, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLintptr") long drawCount, @NativeType("GLsizei") int maxDrawCount, @NativeType("GLsizei") int stride, @NativeType("GLint") int vertexBufferCount) { + if (CHECKS) { + check(indirect, maxDrawCount * (stride == 0 ? (16 + vertexBufferCount * 24) : stride)); + } + nglMultiDrawArraysIndirectBindlessCountNV(mode, memAddress(indirect), drawCount, maxDrawCount, stride, vertexBufferCount); + } + + /** + * Behaves similarly to {@link NVBindlessMultiDrawIndirect#glMultiDrawArraysIndirectBindlessNV MultiDrawArraysIndirectBindlessNV}, except that {@code drawCount} defines an offset (in bytes) into + * the buffer object bound to the PARAMETER_BUFFER_ARB binding point at which a single {@code sizei} typed value is stored, which contains the draw count. + * If the value stored at {@code drawCount} into the buffer is greater than {@code maxDrawCount}, an implementation may stop processing draws after + * {@code maxDrawCount} parameter sets. + * + * @param mode the primitive mode. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param indirect an array of DrawArraysIndirectBindlessCommandNV structures (see the extension spec for more information) + * @param drawCount the byte offset into the buffer object containing the draw count. This offset must be a multiple of 4 + * @param maxDrawCount the maximum number of draws that are expected to be stored in the buffer + * @param stride the size of one DrawArraysIndirectBindlessCommandNV structure + * @param vertexBufferCount the number of vertex buffers in the DrawArraysIndirectBindlessCommandNV structure + */ + public static void glMultiDrawArraysIndirectBindlessCountNV(@NativeType("GLenum") int mode, @NativeType("void const *") long indirect, @NativeType("GLintptr") long drawCount, @NativeType("GLsizei") int maxDrawCount, @NativeType("GLsizei") int stride, @NativeType("GLint") int vertexBufferCount) { + nglMultiDrawArraysIndirectBindlessCountNV(mode, indirect, drawCount, maxDrawCount, stride, vertexBufferCount); + } + + // --- [ glMultiDrawElementsIndirectBindlessCountNV ] --- + + /** Unsafe version of: {@link #glMultiDrawElementsIndirectBindlessCountNV MultiDrawElementsIndirectBindlessCountNV} */ + public static native void nglMultiDrawElementsIndirectBindlessCountNV(int mode, int type, long indirect, long drawCount, int maxDrawCount, int stride, int vertexBufferCount); + + /** + * Behaves similarly to {@link NVBindlessMultiDrawIndirect#glMultiDrawElementsIndirectBindlessNV MultiDrawElementsIndirectBindlessNV}, except that {@code drawCount} defines an offset (in bytes) into + * the buffer object bound to the PARAMETER_BUFFER_ARB binding point at which a single {@code sizei} typed value is stored, which contains the draw count. + * If the value stored at {@code drawCount} into the buffer is greater than {@code maxDrawCount}, an implementation may stop processing draws after + * {@code maxDrawCount} parameter sets. + * + * @param mode the primitive mode. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the data type of the element indices. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect an array of DrawElementsIndirectBindlessCommandNV structures (see the extension spec for more information) + * @param drawCount the byte offset into the buffer object containing the draw count. This offset must be a multiple of 4 + * @param maxDrawCount the maximum number of draws that are expected to be stored in the buffer + * @param stride the size of one DrawElementsIndirectBindlessCommandNV structure + * @param vertexBufferCount the number of vertex buffers in the DrawElementsIndirectBindlessCommandNV structure + */ + public static void glMultiDrawElementsIndirectBindlessCountNV(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer indirect, @NativeType("GLintptr") long drawCount, @NativeType("GLsizei") int maxDrawCount, @NativeType("GLsizei") int stride, @NativeType("GLint") int vertexBufferCount) { + if (CHECKS) { + check(indirect, maxDrawCount * (stride == 0 ? ((vertexBufferCount + 2) * 24) : stride)); + } + nglMultiDrawElementsIndirectBindlessCountNV(mode, type, memAddress(indirect), drawCount, maxDrawCount, stride, vertexBufferCount); + } + + /** + * Behaves similarly to {@link NVBindlessMultiDrawIndirect#glMultiDrawElementsIndirectBindlessNV MultiDrawElementsIndirectBindlessNV}, except that {@code drawCount} defines an offset (in bytes) into + * the buffer object bound to the PARAMETER_BUFFER_ARB binding point at which a single {@code sizei} typed value is stored, which contains the draw count. + * If the value stored at {@code drawCount} into the buffer is greater than {@code maxDrawCount}, an implementation may stop processing draws after + * {@code maxDrawCount} parameter sets. + * + * @param mode the primitive mode. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINE_STRIP LINE_STRIP}{@link GL11#GL_LINE_LOOP LINE_LOOP}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLE_STRIP TRIANGLE_STRIP}{@link GL11#GL_TRIANGLE_FAN TRIANGLE_FAN}{@link GL11#GL_TRIANGLES TRIANGLES}
    {@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_LINE_STRIP_ADJACENCY LINE_STRIP_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL32#GL_TRIANGLE_STRIP_ADJACENCY TRIANGLE_STRIP_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}{@link GL11#GL_POLYGON POLYGON}{@link GL11#GL_QUADS QUADS}
    {@link GL11#GL_QUAD_STRIP QUAD_STRIP}
    + * @param type the data type of the element indices. One of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}
    + * @param indirect an array of DrawElementsIndirectBindlessCommandNV structures (see the extension spec for more information) + * @param drawCount the byte offset into the buffer object containing the draw count. This offset must be a multiple of 4 + * @param maxDrawCount the maximum number of draws that are expected to be stored in the buffer + * @param stride the size of one DrawElementsIndirectBindlessCommandNV structure + * @param vertexBufferCount the number of vertex buffers in the DrawElementsIndirectBindlessCommandNV structure + */ + public static void glMultiDrawElementsIndirectBindlessCountNV(@NativeType("GLenum") int mode, @NativeType("GLenum") int type, @NativeType("void const *") long indirect, @NativeType("GLintptr") long drawCount, @NativeType("GLsizei") int maxDrawCount, @NativeType("GLsizei") int stride, @NativeType("GLint") int vertexBufferCount) { + nglMultiDrawElementsIndirectBindlessCountNV(mode, type, indirect, drawCount, maxDrawCount, stride, vertexBufferCount); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessTexture.java new file mode 100644 index 000000000..22548613d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBindlessTexture.java @@ -0,0 +1,318 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_bindless_texture extension. + * + *

    This extension allows OpenGL applications to access texture objects in + * shaders without first binding each texture to one of a limited number of + * texture image units. Using this extension, an application can query a + * 64-bit unsigned integer texture handle for each texture that it wants to + * access and then use that handle directly in GLSL or assembly-based + * shaders. The ability to access textures without having to bind and/or + * re-bind them is similar to the capability provided by the + * NV_shader_buffer_load extension that allows shaders to access buffer + * objects without binding them. In both cases, these extensions + * significantly reduce the amount of API and internal GL driver overhead + * needed to manage resource bindings.

    + * + *

    This extension also provides similar capability for the image load, store, + * and atomic functionality provided by OpenGL 4.2, OpenGL ES 3.1 and the + * ARB_shader_image_load_store and EXT_shader_image_load_store extensions, + * where a texture can be accessed without first binding it to an image unit. + * An image handle can be extracted from a texture object using an API with a + * set of parameters similar to those for BindImageTextureEXT.

    + * + *

    This extension adds no new data types to GLSL. Instead, it uses existing + * sampler and image data types and allows them to be populated with texture + * and image handles. This extension does permit sampler and image data + * types to be used in more contexts than in unextended GLSL 4.00. In + * particular, sampler and image types may be used as shader inputs/outputs, + * temporary variables, and uniform block members, and may be assigned to by + * shader code. Constructors are provided to convert 64-bit unsigned integer + * values to and from sampler and image data types. Additionally, new APIs + * are provided to load values for sampler and image uniforms with 64-bit + * handle inputs. The use of existing integer-based Uniform* APIs is still + * permitted, in which case the integer specified will identify a texture + * image or image unit. For samplers and images with values specified as + * texture image or image units, the GL implemenation will translate the unit + * number to an internal handle as required.

    + * + *

    To access texture or image resources using handles, the handles must first + * be made resident. Accessing a texture or image by handle without first + * making it resident can result in undefined results, including program + * termination. Since the amount of texture memory required by an + * application may exceed the amount of memory available to the system, this + * extension provides API calls allowing applications to manage overall + * texture memory consumption by making a texture resident and non-resident + * as required.

    + * + *

    Requires {@link GL40 OpenGL 4.0}.

    + */ +public class NVBindlessTexture { + + static { GL.initialize(); } + + protected NVBindlessTexture() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetTextureHandleNV ] --- + + /** + * Creates a texture handle using the current state of the texture named {@code texture}, including any embedded sampler state. See + * {@link #glGetTextureSamplerHandleNV GetTextureSamplerHandleNV} for details. + * + * @param texture the texture object + */ + @NativeType("GLuint64") + public static native long glGetTextureHandleNV(@NativeType("GLuint") int texture); + + // --- [ glGetTextureSamplerHandleNV ] --- + + /** + * Creates a texture handle using the current non-sampler state from the texture named {@code texture} and the sampler state from the sampler object + * {@code sampler}. In both cases, a 64-bit unsigned integer handle is returned. The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated if {@code texture} is zero or is + * not the name of an existing texture object or if {@code sampler} is zero or is not the name of an existing sampler object. The error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if the texture object {@code texture} is not complete. If an error occurs, a handle of zero is returned. + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if the border color (taken from the embedded sampler for GetTextureHandleNV or from the {@code sampler} + * for GetTextureSamplerHandleNV) is not one of the following allowed values. If the texture's base internal format is signed or unsigned integer, allowed + * values are (0,0,0,0), (0,0,0,1), (1,1,1,0), and (1,1,1,1). If the base internal format is not integer, allowed values are (0.0,0.0,0.0,0.0), + * (0.0,0.0,0.0,1.0), (1.0,1.0,1.0,0.0), and (1.0,1.0,1.0,1.0).

    + * + *

    The handle for each texture or texture/sampler pair is unique; the same handle will be returned if GetTextureHandleNV is called multiple times for the + * same texture or if GetTextureSamplerHandleNV is called multiple times for the same texture/sampler pair.

    + * + *

    When a texture object is referenced by one or more texture handles, the texture parameters of the object may not be changed, and the size and format of + * the images in the texture object may not be re-specified. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if the functions TexImage*, CopyTexImage*, + * CompressedTexImage*, TexBuffer*, or TexParameter* are called to modify a texture object referenced by one or more texture handles. The contents of the + * images in a texture object may still be updated via commands such as TexSubImage*, CopyTexSubImage*, and CompressedTexSubImage*, and by rendering to a + * framebuffer object, even if the texture object is referenced by one or more texture handles.

    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by {@link GL15C#glBufferData BufferData} if it is called to modify a buffer object bound to a buffer texture while that + * texture object is referenced by one or more texture handles. The contents of the buffer object may still be updated via buffer update commands such as + * {@link GL15C#glBufferSubData BufferSubData} and MapBuffer*, or via the texture update commands, even if the buffer is bound to a texture while that buffer texture object is + * referenced by one or more texture handles.

    + * + *

    When a sampler object is referenced by one or more texture handles, the sampler parameters of the object may not be changed. The error + * {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated when calling SamplerParameter* functions to modify a sampler object referenced by one or more texture handles.

    + * + * @param texture the texture object + * @param sampler the sampler object + */ + @NativeType("GLuint64") + public static native long glGetTextureSamplerHandleNV(@NativeType("GLuint") int texture, @NativeType("GLuint") int sampler); + + // --- [ glMakeTextureHandleResidentNV ] --- + + /** + * Make a texture handle resident, so that it is accessible to shaders for texture mapping operations. + * + *

    While the texture handle is resident, it may be used in texture mapping operations. If a shader attempts to perform a texture mapping operation using a + * handle that is not resident, the results of that operation are undefined and may lead to application termination. When a texture handle is resident, the + * texture it references is also considered resident for the purposes of the {@link GL11#glAreTexturesResident AreTexturesResident} command. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is + * generated if {@code handle} is not a valid texture handle, or if {@code handle} is already resident in the current GL context.

    + * + * @param handle the texture handle + */ + public static native void glMakeTextureHandleResidentNV(@NativeType("GLuint64") long handle); + + // --- [ glMakeTextureHandleNonResidentNV ] --- + + /** + * Makes a texture handle inaccessible to shaders. + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if {@code handle} is not a valid texture handle, or if {@code handle} is not resident in the current GL + * context.

    + * + * @param handle the texture handle + */ + public static native void glMakeTextureHandleNonResidentNV(@NativeType("GLuint64") long handle); + + // --- [ glGetImageHandleNV ] --- + + /** + * Creates and returns an image handle for level {@code level} of the texture named {@code texture}. If {@code layered} is {@link GL11#GL_TRUE TRUE}, a handle is created + * for the entire texture level. If {@code layered} is {@link GL11#GL_FALSE FALSE}, a handle is created for only the layer {@code layer} of the texture level. + * {@code format} specifies a format used to interpret the texels of the image when used for image loads, stores, and atomics, and has the same meaning as + * the {@code format} parameter of BindImageTextureEXT(). A 64-bit unsigned integer handle is returned if the command succeeds; otherwise, zero is returned. + * + *

    The error {@link GL11#GL_INVALID_VALUE INVALID_VALUE} is generated by GetImageHandleNV if:

    + * + *
      + *
    • {@code texture} is zero or not the name of an existing texture object;
    • + *
    • the image for the texture level {@code level} doesn't exist (i.e., has a size of zero in {@code texture}); or
    • + *
    • {@code layered} is FALSE and {@code layer} is greater than or equal to the number of layers in the image at level {@code level}.
    • + *
    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by GetImageHandleNV if:

    + * + *
      + *
    • the texture object {@code texture} is not complete (section 3.9.14);
    • + *
    • {@code layered} is TRUE and the texture is not a three-dimensional, one-dimensional array, two dimensional array, cube map, or cube map array + * texture.
    • + *
    + * + *

    When a texture object is referenced by one or more image handles, the texture parameters of the object may not be changed, and the size and format of + * the images in the texture object may not be re-specified. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated when calling TexImage*, CopyTexImage*, + * CompressedTexImage*, TexBuffer*, or TexParameter* functions while a texture object is referenced by one or more image handles. The contents of the + * images in a texture object may still be updated via commands such as TexSubImage*, CopyTexSubImage*, and CompressedTexSubImage*, and by rendering to a + * framebuffer object, even if the texture object is referenced by one or more image handles.

    + * + *

    The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated by {@link GL15C#glBufferData BufferData} if it is called to modify a buffer object bound to a buffer texture while that texture + * object is referenced by one or more image handles. The contents of the buffer object may still be updated via buffer update commands such as + * {@link GL15C#glBufferSubData BufferSubData} and MapBuffer*, or via the texture update commands, even if the buffer is bound to a texture while that buffer texture object is + * referenced by one or more image handles.

    + * + *

    The handle returned for each combination of {@code texture}, {@code level}, {@code layered}, {@code layer}, and {@code format} is unique; the same + * handle will be returned if GetImageHandleNV is called multiple times with the same parameters.

    + * + * @param texture the texture object + * @param level the texture level + * @param layered the layered flag + * @param layer the texture layer + * @param format the texture format + */ + @NativeType("GLuint64") + public static native long glGetImageHandleNV(@NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLboolean") boolean layered, @NativeType("GLint") int layer, @NativeType("GLenum") int format); + + // --- [ glMakeImageHandleResidentNV ] --- + + /** + * Makes an image handle resident, so that it is accessible to shaders for image loads, stores, and atomic operations. + * + *

    {@code access} specifies whether the texture bound to the image handle will be treated as {@link GL15#GL_READ_ONLY READ_ONLY}, {@link GL15#GL_WRITE_ONLY WRITE_ONLY}, or {@link GL15#GL_READ_WRITE READ_WRITE}. If a + * shader reads from an image handle made resident as {@link GL15#GL_WRITE_ONLY WRITE_ONLY}, or writes to an image handle made resident as {@link GL15#GL_READ_ONLY READ_ONLY}, the results of that + * shader operation are undefined and may lead to application termination. The error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} is generated if {@code handle} is not a valid + * image handle, or if {@code handle} is already resident in the current GL context.

    + * + *

    While the image handle is resident, it may be used in image load, store, and atomic operations. If a shader attempts to perform an image operation using + * a handle that is not resident, the results of that operation are undefined and may lead to application termination. When an image handle is resident, + * the texture it references is not necessarily considered resident for the purposes of the {@link GL11#glAreTexturesResident AreTexturesResident} command.

    + * + * @param handle the image handle + * @param access the access type. One of:
    {@link GL15#GL_READ_ONLY READ_ONLY}{@link GL15#GL_WRITE_ONLY WRITE_ONLY}{@link GL15#GL_READ_WRITE READ_WRITE}
    + */ + public static native void glMakeImageHandleResidentNV(@NativeType("GLuint64") long handle, @NativeType("GLenum") int access); + + // --- [ glMakeImageHandleNonResidentNV ] --- + + /** + * Makes an image handle inaccessible to shaders. + * + * @param handle the image handle + */ + public static native void glMakeImageHandleNonResidentNV(@NativeType("GLuint64") long handle); + + // --- [ glUniformHandleui64NV ] --- + + /** + * Loads a 64-bit unsigned integer handle into a uniform location corresponding to sampler or image variable types. + * + * @param location the uniform location + * @param value the handle value + */ + public static native void glUniformHandleui64NV(@NativeType("GLint") int location, @NativeType("GLuint64") long value); + + // --- [ glUniformHandleui64vNV ] --- + + /** + * Unsafe version of: {@link #glUniformHandleui64vNV UniformHandleui64vNV} + * + * @param count the number of handles to load + */ + public static native void nglUniformHandleui64vNV(int location, int count, long values); + + /** + * Loads {@code count} 64-bit unsigned integer handles into a uniform location corresponding to sampler or image variable types. + * + * @param location the uniform location + * @param values a buffer from which to load the handles + */ + public static void glUniformHandleui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer values) { + nglUniformHandleui64vNV(location, values.remaining(), memAddress(values)); + } + + // --- [ glProgramUniformHandleui64NV ] --- + + /** + * DSA version of {@link #glUniformHandleui64NV UniformHandleui64NV}. + * + * @param program the program object + * @param location the uniform location + * @param value the handle value + */ + public static native void glProgramUniformHandleui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64") long value); + + // --- [ glProgramUniformHandleui64vNV ] --- + + /** + * Unsafe version of: {@link #glProgramUniformHandleui64vNV ProgramUniformHandleui64vNV} + * + * @param count the number of handles to load + */ + public static native void nglProgramUniformHandleui64vNV(int program, int location, int count, long values); + + /** + * DSA version of {@link #glUniformHandleui64vNV UniformHandleui64vNV}. + * + * @param program the program object + * @param location the uniform location + * @param values a buffer from which to load the handles + */ + public static void glProgramUniformHandleui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") LongBuffer values) { + nglProgramUniformHandleui64vNV(program, location, values.remaining(), memAddress(values)); + } + + // --- [ glIsTextureHandleResidentNV ] --- + + /** + * Returns {@link GL11#GL_TRUE TRUE} if the specified texture handle is resident in the current context. + * + * @param handle the texture handle + */ + @NativeType("GLboolean") + public static native boolean glIsTextureHandleResidentNV(@NativeType("GLuint64") long handle); + + // --- [ glIsImageHandleResidentNV ] --- + + /** + * Returns {@link GL11#GL_TRUE TRUE} if the specified image handle is resident in the current context. + * + * @param handle the image handle + */ + @NativeType("GLboolean") + public static native boolean glIsImageHandleResidentNV(@NativeType("GLuint64") long handle); + + /** Array version of: {@link #glUniformHandleui64vNV UniformHandleui64vNV} */ + public static void glUniformHandleui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] values) { + long __functionAddress = GL.getICD().glUniformHandleui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, values.length, values, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformHandleui64vNV ProgramUniformHandleui64vNV} */ + public static void glProgramUniformHandleui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64 const *") long[] values) { + long __functionAddress = GL.getICD().glProgramUniformHandleui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, values.length, values, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendEquationAdvanced.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendEquationAdvanced.java new file mode 100644 index 000000000..338a915b4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendEquationAdvanced.java @@ -0,0 +1,95 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_blend_equation_advanced extension. + * + *

    This extension adds a number of "advanced" blending equations that can be used to perform new color blending operations, many of which are more complex + * than the standard blend modes provided by unextended OpenGL.

    + * + *

    Provides the new blending equations, but guarantees defined results only if each sample is touched no more than once in any single rendering pass. The + * command {@link #glBlendBarrierNV BlendBarrierNV} is provided to indicate a boundary between passes.

    + * + *

    Requires {@link GL20 OpenGL 2.0}.

    + */ +public class NVBlendEquationAdvanced { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of BlendParameteriNV, GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_BLEND_PREMULTIPLIED_SRC_NV = 0x9280, + GL_BLEND_OVERLAP_NV = 0x9281; + + /** Accepted by the {@code value} parameter of BlendParameteriNV when {@code pname} is BLEND_OVERLAP_NV. */ + public static final int + GL_UNCORRELATED_NV = 0x8521, + GL_DISJOINT_NV = 0x9283, + GL_CONJOINT_NV = 0x9284; + + /** Accepted by the {@code mode} parameter of BlendEquation and BlendEquationi. */ + public static final int + GL_SRC_NV = 0x9286, + GL_DST_NV = 0x9287, + GL_SRC_OVER_NV = 0x9288, + GL_DST_OVER_NV = 0x9289, + GL_SRC_IN_NV = 0x928A, + GL_DST_IN_NV = 0x928B, + GL_SRC_OUT_NV = 0x928C, + GL_DST_OUT_NV = 0x928D, + GL_SRC_ATOP_NV = 0x928E, + GL_DST_ATOP_NV = 0x928F, + GL_XOR_NV = 0x1506, + GL_MULTIPLY_NV = 0x9294, + GL_SCREEN_NV = 0x9295, + GL_OVERLAY_NV = 0x9296, + GL_DARKEN_NV = 0x9297, + GL_LIGHTEN_NV = 0x9298, + GL_COLORDODGE_NV = 0x9299, + GL_COLORBURN_NV = 0x929A, + GL_HARDLIGHT_NV = 0x929B, + GL_SOFTLIGHT_NV = 0x929C, + GL_DIFFERENCE_NV = 0x929E, + GL_EXCLUSION_NV = 0x92A0, + GL_INVERT_RGB_NV = 0x92A3, + GL_LINEARDODGE_NV = 0x92A4, + GL_LINEARBURN_NV = 0x92A5, + GL_VIVIDLIGHT_NV = 0x92A6, + GL_LINEARLIGHT_NV = 0x92A7, + GL_PINLIGHT_NV = 0x92A8, + GL_HARDMIX_NV = 0x92A9, + GL_HSL_HUE_NV = 0x92AD, + GL_HSL_SATURATION_NV = 0x92AE, + GL_HSL_COLOR_NV = 0x92AF, + GL_HSL_LUMINOSITY_NV = 0x92B0, + GL_PLUS_NV = 0x9291, + GL_PLUS_CLAMPED_NV = 0x92B1, + GL_PLUS_CLAMPED_ALPHA_NV = 0x92B2, + GL_PLUS_DARKER_NV = 0x9292, + GL_MINUS_NV = 0x929F, + GL_MINUS_CLAMPED_NV = 0x92B3, + GL_CONTRAST_NV = 0x92A1, + GL_INVERT_OVG_NV = 0x92B4, + GL_RED_NV = 0x1903, + GL_GREEN_NV = 0x1904, + GL_BLUE_NV = 0x1905; + + protected NVBlendEquationAdvanced() { + throw new UnsupportedOperationException(); + } + + // --- [ glBlendParameteriNV ] --- + + public static native void glBlendParameteriNV(@NativeType("GLenum") int pname, @NativeType("GLint") int value); + + // --- [ glBlendBarrierNV ] --- + + public static native void glBlendBarrierNV(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendEquationAdvancedCoherent.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendEquationAdvancedCoherent.java new file mode 100644 index 000000000..13a7a4e6c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendEquationAdvancedCoherent.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_blend_equation_advanced_coherent extension. + * + *

    Similar to NV_blend_equation_advanced, but guarantees that blending is done coherently and in API primitive ordering. An enable is provided to allow + * implementations to opt out of fully coherent blending and instead behave as though only NV_blend_equation_advanced were supported.

    + * + *

    Requires {@link GL20 OpenGL 2.0} and {@link NVBlendEquationAdvanced NV_blend_equation_advanced}.

    + */ +public final class NVBlendEquationAdvancedCoherent { + + /** + * Accepted by the {@code cap} parameter of Disable, Enable, and IsEnabled, and by the {@code pname} parameter of GetIntegerv, GetBooleanv, GetFloatv, GetDoublev + * and GetInteger64v. + */ + public static final int GL_BLEND_ADVANCED_COHERENT_NV = 0x9285; + + private NVBlendEquationAdvancedCoherent() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendMinmaxFactor.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendMinmaxFactor.java new file mode 100644 index 000000000..c9ea7d270 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVBlendMinmaxFactor.java @@ -0,0 +1,31 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_blend_minmax_factor extension. + * + *

    The {@link EXTBlendMinmax EXT_blend_minmax} extension extended the GL's blending functionality to allow the blending equation to be specified by the application. That + * extension introduced the {@link EXTBlendMinmax#GL_MIN_EXT MIN_EXT} and {@link EXTBlendMinmax#GL_MAX_EXT MAX_EXT} blend equations, which caused the result of the blend equation to become the minimum or maximum of the + * source color and destination color, respectively.

    + * + *

    The {@code MIN_EXT} and {@code MAX_EXT} blend equations, however, do not include the source or destination blend factors in the arguments to the min + * and max functions. This extension provides two new blend equations that produce the minimum or maximum of the products of the source color and source + * factor, and the destination color and destination factor.

    + */ +public final class NVBlendMinmaxFactor { + + /** + * Accepted by the {@code mode} parameter of BlendEquation and BlendEquationi, and by the {@code modeRGB} and {@code modeAlpha} parameters of + * BlendEquationSeparate and BlendEquationSeparatei. + */ + public static final int + GL_FACTOR_MIN_AMD = 0x901C, + GL_FACTOR_MAX_AMD = 0x901D; + + private NVBlendMinmaxFactor() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVClipSpaceWScaling.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVClipSpaceWScaling.java new file mode 100644 index 000000000..eeecd5340 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVClipSpaceWScaling.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Virtual Reality (VR) applications often involve a post-processing step to apply a "barrel" distortion to the rendered image to correct the "pincushion" + * distortion introduced by the optics in a VR device. The barrel distorted image has lower resolution along the edges compared to the center. Since the + * original image is rendered at high resolution, which is uniform across the complete image, a lot of pixels towards the edges do not make it to the + * final post-processed image. + * + *

    This extension also provides a mechanism to render VR scenes at a non-uniform resolution, in particular a resolution that falls linearly from the + * center towards the edges. This is achieved by scaling the "w" coordinate of the vertices in the clip space before perspective divide. The clip space + * "w" coordinate of the vertices may be offset as of a function of "x" and "y" coordinates as follows:

    + * + *
    
    + * w' = w + Ax + By
    + * + *

    In the intended use case for viewport position scaling, an application should use a set of 4 viewports, one for each of the 4 quadrants of a Cartesian + * coordinate system. Each viewport is set to the dimension of the image, but is scissored to the quadrant it represents. The application should specify A + * and B coefficients of the w-scaling equation above, that have the same value, but different signs, for each of the viewports. The signs of A and B + * should match the signs of X and Y for the quadrant that they represent such that the value of "w'" will always be greater than or equal to the original + * "w" value for the entire image. Since the offset to "w", (Ax + By), is always positive and increases with the absolute values of "x" and "y", the + * effective resolution will fall off linearly from the center of the image to its edges.

    + */ +public class NVClipSpaceWScaling { + + static { GL.initialize(); } + + /** Accepted by the {@code cap} parameter of Enable, Disable, IsEnabled. */ + public static final int GL_VIEWPORT_POSITION_W_SCALE_NV = 0x937C; + + /** Accepted by the {@code pname} parameter of GetBooleani_v, GetDoublei_v, GetIntegeri_v, GetFloati_v, and GetInteger64i_v. */ + public static final int + GL_VIEWPORT_POSITION_W_SCALE_X_COEFF = 0x937D, + GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF = 0x937E; + + protected NVClipSpaceWScaling() { + throw new UnsupportedOperationException(); + } + + // --- [ glViewportPositionWScaleNV ] --- + + /** + * If {@link #GL_VIEWPORT_POSITION_W_SCALE_NV VIEWPORT_POSITION_W_SCALE_NV} is enabled, the w coordinates for each primitive sent to a given viewport will be scaled as a function of its x and y + * coordinates using the following equation: + * + *
    
    +     * w' = xcoeff * x + ycoeff * y + w;
    + * + *

    The coefficients for "x" and "y" used in the above equation depend on the viewport index, and are controlled by this command.

    + * + *

    The viewport specified by {@code index} has its coefficients for "x" and "y" set to the {@code xcoeff} and {@code ycoeff} values. Specifying these + * coefficients enables rendering images at a non-uniform resolution, in particular a resolution that falls off linearly from the center towards the + * edges, which is useful for VR applications. VR applications often involve a post-processing step to apply a "barrel" distortion to the rendered image + * to correct the "pincushion" distortion introduced by the optics in a VR device. The barrel distorted image, has lower resolution along the edges + * compared to the center. Since the original image is rendered at high resolution, which is uniform across the complete image, a lot of pixels towards + * the edges do not make it to the final post-processed image. VR applications may use the w-scaling to minimize the processing of unused fragments. To + * achieve the intended effect, applications should use a set of 4 viewports one for each of the 4 quadrants of a Cartesian coordinate system. Each + * viewport is set to the dimension of the image, but is scissored to the quadrant it represents. The application should specify the x and y coefficients + * of the w-scaling equation above, that have the same value, but different signs, for each of the viewports. The signs of {@code xcoeff} and + * {@code ycoeff} should match the signs of X and Y for the quadrant that they represent such that the value of "w'" will always be greater than or equal + * to the original "w" value for the entire image. Since the offset to "w", (Ax + By), is always positive and increases with the absolute values of "x" + * and "y", the effective resolution will fall off linearly from the center of the image to its edges.

    + * + * @param index the viewport index + * @param xcoeff the x coefficient + * @param ycoeff the y coefficient + */ + public static native void glViewportPositionWScaleNV(@NativeType("GLuint") int index, @NativeType("GLfloat") float xcoeff, @NativeType("GLfloat") float ycoeff); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCommandList.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCommandList.java new file mode 100644 index 000000000..c2a090346 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCommandList.java @@ -0,0 +1,659 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_command_list extension. + * + *

    This extension adds a few new features designed to provide very low overhead batching and replay of rendering commands and state changes:

    + * + *
      + *
    • A state object, which stores a pre-validated representation of the state of (almost) the entire pipeline.
    • + *
    • A more flexible and extensible MultiDrawIndirect (MDI) type of mechanism, using a token-based command stream, allowing to setup binding state and + * emit draw calls.
    • + *
    • A set of functions to execute a list of the token-based command streams with state object changes interleaved with the streams.
    • + *
    • Command lists enabling compilation and reuse of sequences of command streams and state object changes.
    • + *
    + * + *

    Because state objects reflect the state of the entire pipeline, it is expected that they can be pre-validated and executed efficiently. It is also + * expected that when state objects are combined into a command list, the command list can diff consecutive state objects to produce a reduced/ optimized + * set of state changes specific to that transition.

    + * + *

    The token-based command stream can also be stored in regular buffer objects and therefore be modified by the server itself. This allows more complex + * work creation than the original MDI approach, which was limited to emitting draw calls only.

    + * + *

    Command structures

    + * + *
    
    + * typedef struct {
    + *   uint  header;
    + * } TerminateSequenceCommandNV;
    + * 
    + * typedef struct {
    + *   uint  header;
    + * } NOPCommandNV;
    + * 
    + * typedef  struct {
    + *   uint  header;
    + *   uint  count;
    + *   uint  firstIndex;
    + *   uint  baseVertex;
    + * } DrawElementsCommandNV;
    + * 
    + * typedef  struct {
    + *   uint  header;
    + *   uint  count;
    + *   uint  first;
    + * } DrawArraysCommandNV;
    + * 
    + * typedef  struct {
    + *   uint  header;
    + *   uint  mode;
    + *   uint  count;
    + *   uint  instanceCount;
    + *   uint  firstIndex;
    + *   uint  baseVertex;
    + *   uint  baseInstance;
    + * } DrawElementsInstancedCommandNV;
    + * 
    + * typedef  struct {
    + *   uint  header;
    + *   uint  mode;
    + *   uint  count;
    + *   uint  instanceCount;
    + *   uint  first;
    + *   uint  baseInstance;
    + * } DrawArraysInstancedCommandNV;
    + * 
    + * typedef struct {
    + *   uint  header;
    + *   uint  addressLo;
    + *   uint  addressHi;
    + *   uint  typeSizeInByte;
    + * } ElementAddressCommandNV;
    + * 
    + * typedef struct {
    + *   uint  header;
    + *   uint  index;
    + *   uint  addressLo;
    + *   uint  addressHi;
    + * } AttributeAddressCommandNV;
    + * 
    + * typedef struct {
    + *   uint    header;
    + *   ushort  index;
    + *   ushort  stage;
    + *   uint    addressLo;
    + *   uint    addressHi;
    + * } UniformAddressCommandNV;
    + * 
    + * typedef struct {
    + *   uint  header;
    + *   float red;
    + *   float green;
    + *   float blue;
    + *   float alpha;
    + * } BlendColorCommandNV;
    + * 
    + * typedef struct {
    + *   uint  header;
    + *   uint  frontStencilRef;
    + *   uint  backStencilRef;
    + * } StencilRefCommandNV;
    + * 
    + * typedef struct {
    + *   uint  header;
    + *   float lineWidth;
    + * } LineWidthCommandNV;
    + * 
    + * typedef struct {
    + *   uint  header;
    + *   float scale;
    + *   float bias;
    + * } PolygonOffsetCommandNV;
    + * 
    + * typedef struct {
    + *   uint  header;
    + *   float alphaRef;
    + * } AlphaRefCommandNV;
    + * 
    + * typedef struct {
    + *   uint  header;
    + *   uint  x;
    + *   uint  y;
    + *   uint  width;
    + *   uint  height;
    + * } ViewportCommandNV; // only ViewportIndex 0
    + * 
    + * typedef struct {
    + *   uint  header;
    + *   uint  x;
    + *   uint  y;
    + *   uint  width;
    + *   uint  height;
    + * } ScissorCommandNV; // only ViewportIndex 0
    + * 
    + * typedef struct {
    + *   uint  header;
    + *   uint  frontFace; // 0 for CW, 1 for CCW
    + * } FrontFaceCommandNV;
    + * + *

    Tight packing is used for all structures.

    + */ +public class NVCommandList { + + static { GL.initialize(); } + + /** Used in DrawCommandsStates buffer formats, in GetCommandHeaderNV to return the header. */ + public static final int + GL_TERMINATE_SEQUENCE_COMMAND_NV = 0x0, + GL_NOP_COMMAND_NV = 0x1, + GL_DRAW_ELEMENTS_COMMAND_NV = 0x2, + GL_DRAW_ARRAYS_COMMAND_NV = 0x3, + GL_DRAW_ELEMENTS_STRIP_COMMAND_NV = 0x4, + GL_DRAW_ARRAYS_STRIP_COMMAND_NV = 0x5, + GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV = 0x6, + GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV = 0x7, + GL_ELEMENT_ADDRESS_COMMAND_NV = 0x8, + GL_ATTRIBUTE_ADDRESS_COMMAND_NV = 0x9, + GL_UNIFORM_ADDRESS_COMMAND_NV = 0xA, + GL_BLEND_COLOR_COMMAND_NV = 0xB, + GL_STENCIL_REF_COMMAND_NV = 0xC, + GL_LINE_WIDTH_COMMAND_NV = 0xD, + GL_POLYGON_OFFSET_COMMAND_NV = 0xE, + GL_ALPHA_REF_COMMAND_NV = 0xF, + GL_VIEWPORT_COMMAND_NV = 0x10, + GL_SCISSOR_COMMAND_NV = 0x11, + GL_FRONT_FACE_COMMAND_NV = 0x12; + + protected NVCommandList() { + throw new UnsupportedOperationException(); + } + + // --- [ glCreateStatesNV ] --- + + /** + * Unsafe version of: {@link #glCreateStatesNV CreateStatesNV} + * + * @param n the number of state object names to create + */ + public static native void nglCreateStatesNV(int n, long states); + + /** + * Returns {@code n} previously unused state object names in {@code states}, and creates a state object in the initial state for each name. + * + * @param states the buffer in which to write the created state object names + */ + public static void glCreateStatesNV(@NativeType("GLuint *") IntBuffer states) { + nglCreateStatesNV(states.remaining(), memAddress(states)); + } + + /** Returns {@code n} previously unused state object names in {@code states}, and creates a state object in the initial state for each name. */ + @NativeType("void") + public static int glCreateStatesNV() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer states = stack.callocInt(1); + nglCreateStatesNV(1, memAddress(states)); + return states.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDeleteStatesNV ] --- + + /** + * Unsafe version of: {@link #glDeleteStatesNV DeleteStatesNV} + * + * @param n the number of state object names to delete + */ + public static native void nglDeleteStatesNV(int n, long states); + + /** + * Deletes {@code n} names of state objects given by {@code states}. Once a state object is deleted it has no contents and its name is again unused. + * Unused names in {@code states} are silently ignored, as is the value zero. + * + * @param states the buffer from which to read the state object names to delete + */ + public static void glDeleteStatesNV(@NativeType("GLuint const *") IntBuffer states) { + nglDeleteStatesNV(states.remaining(), memAddress(states)); + } + + /** + * Deletes {@code n} names of state objects given by {@code states}. Once a state object is deleted it has no contents and its name is again unused. + * Unused names in {@code states} are silently ignored, as is the value zero. + */ + public static void glDeleteStatesNV(@NativeType("GLuint const *") int state) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer states = stack.ints(state); + nglDeleteStatesNV(1, memAddress(states)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsStateNV ] --- + + /** + * Returns true if the specified name corresponds to a state object. + * + * @param state the object name to test + */ + @NativeType("GLboolean") + public static native boolean glIsStateNV(@NativeType("GLuint") int state); + + // --- [ glStateCaptureNV ] --- + + /** + * Captures the current state of the rendering pipeline into the object indicated by {@code state}. + * + *

    The captured rendering state includes:

    + * + *
      + *
    • Vertex attribute enable state, formats, types, relative offsets and strides, but not bound vertex buffers or vertex unified addresses, nor their + * offsets, nor bound index buffers/addresses.
    • + *
    • Primitive state such as primitive restart and patch parameters, provoking vertex.
    • + *
    • Immediate vertex attribute values as provided by glVertexAttrib* or glVertexAttribI*
    • + *
    • All active program binaries except compute (either from the active program pipeline or from UseProgram) with their current subroutine configuration + * excluding all default-block uniform values.
    • + *
    • Rasterization, multisample fragment operation, depth, stencil, and blending state.
    • + *
    • Rasterization state such as line widths, stippling, polygon modes and offsets.
    • + *
    • Viewport, scissor, and depth range state.
    • + *
    • Framebuffer attachment configuration: attachment state including attachment formats, drawbuffer state, and target/layer information, but not + * including actual attachments or sizes of attachments (these are stored separately).
    • + *
    • Framebuffer attachment textures (but not residency state).
    • + *
    + * + * @param state the state object into which to capture the current rendering state + * @param mode the basic Begin mode that this state object must be used with. One of:
    {@link GL11#GL_POINTS POINTS}{@link GL11#GL_LINES LINES}{@link GL11#GL_TRIANGLES TRIANGLES}{@link GL11#GL_QUADS QUADS}{@link GL32#GL_LINES_ADJACENCY LINES_ADJACENCY}{@link GL32#GL_TRIANGLES_ADJACENCY TRIANGLES_ADJACENCY}{@link GL40#GL_PATCHES PATCHES}
    + */ + public static native void glStateCaptureNV(@NativeType("GLuint") int state, @NativeType("GLenum") int mode); + + // --- [ glGetCommandHeaderNV ] --- + + /** + * Returns the encoded 32bit header value for a given command; the returned value is implementation specific. + * + * @param tokenID the command to query. One of:
    {@link #GL_TERMINATE_SEQUENCE_COMMAND_NV TERMINATE_SEQUENCE_COMMAND_NV}{@link #GL_NOP_COMMAND_NV NOP_COMMAND_NV}{@link #GL_DRAW_ELEMENTS_COMMAND_NV DRAW_ELEMENTS_COMMAND_NV}
    {@link #GL_DRAW_ARRAYS_COMMAND_NV DRAW_ARRAYS_COMMAND_NV}{@link #GL_DRAW_ELEMENTS_STRIP_COMMAND_NV DRAW_ELEMENTS_STRIP_COMMAND_NV}{@link #GL_DRAW_ARRAYS_STRIP_COMMAND_NV DRAW_ARRAYS_STRIP_COMMAND_NV}
    {@link #GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV DRAW_ELEMENTS_INSTANCED_COMMAND_NV}{@link #GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV DRAW_ARRAYS_INSTANCED_COMMAND_NV}{@link #GL_ELEMENT_ADDRESS_COMMAND_NV ELEMENT_ADDRESS_COMMAND_NV}
    {@link #GL_ATTRIBUTE_ADDRESS_COMMAND_NV ATTRIBUTE_ADDRESS_COMMAND_NV}{@link #GL_UNIFORM_ADDRESS_COMMAND_NV UNIFORM_ADDRESS_COMMAND_NV}{@link #GL_BLEND_COLOR_COMMAND_NV BLEND_COLOR_COMMAND_NV}
    {@link #GL_STENCIL_REF_COMMAND_NV STENCIL_REF_COMMAND_NV}{@link #GL_LINE_WIDTH_COMMAND_NV LINE_WIDTH_COMMAND_NV}{@link #GL_POLYGON_OFFSET_COMMAND_NV POLYGON_OFFSET_COMMAND_NV}
    {@link #GL_ALPHA_REF_COMMAND_NV ALPHA_REF_COMMAND_NV}{@link #GL_VIEWPORT_COMMAND_NV VIEWPORT_COMMAND_NV}{@link #GL_SCISSOR_COMMAND_NV SCISSOR_COMMAND_NV}
    {@link #GL_FRONT_FACE_COMMAND_NV FRONT_FACE_COMMAND_NV}
    + * @param size provided as basic consistency check, since the size of each structure is fixed and no padding is allowed. The value is the sum of the header and + * the command specific structure. + */ + @NativeType("GLuint") + public static native int glGetCommandHeaderNV(@NativeType("GLenum") int tokenID, @NativeType("GLuint") int size); + + // --- [ glGetStageIndexNV ] --- + + /** + * Returns the 16bit value for a specific shader stage; the returned value is implementation specific. The value is to be used with the stage field within + * {@code UniformAddressCommandNV} tokens. + * + * @param shadertype the shader stage type + */ + @NativeType("GLushort") + public static native short glGetStageIndexNV(@NativeType("GLenum") int shadertype); + + // --- [ glDrawCommandsNV ] --- + + /** + * Unsafe version of: {@link #glDrawCommandsNV DrawCommandsNV} + * + * @param count the number of commands + */ + public static native void nglDrawCommandsNV(int primitiveMode, int buffer, long indirects, long sizes, int count); + + /** + * Accepts arrays of buffer addresses as an array of offsets {@code indirects} into a buffer named by {@code buffer}, an array of command lengths in + * {@code sizes}. All arrays have {@code count} entries. + * + * @param primitiveMode the primitive mode + * @param buffer the buffer object name + * @param indirects the array of offsets into the buffer + * @param sizes the array of command lengths + */ + public static void glDrawCommandsNV(@NativeType("GLenum") int primitiveMode, @NativeType("GLuint") int buffer, @NativeType("GLintptr const *") PointerBuffer indirects, @NativeType("GLsizei const *") IntBuffer sizes) { + if (CHECKS) { + check(sizes, indirects.remaining()); + } + nglDrawCommandsNV(primitiveMode, buffer, memAddress(indirects), memAddress(sizes), indirects.remaining()); + } + + // --- [ glDrawCommandsAddressNV ] --- + + /** + * Unsafe version of: {@link #glDrawCommandsAddressNV DrawCommandsAddressNV} + * + * @param count the number of commands + */ + public static native void nglDrawCommandsAddressNV(int primitiveMode, long indirects, long sizes, int count); + + /** + * Accepts arrays of buffer addresses as an array of GPU addresses {@code indirects}, an array of sequence lengths in {@code sizes}. All arrays have + * {@code count} entries. + * + * @param primitiveMode the primitive mode + * @param indirects the array of GPU addreses + * @param sizes the array of command lengths + */ + public static void glDrawCommandsAddressNV(@NativeType("GLenum") int primitiveMode, @NativeType("GLuint64 const *") LongBuffer indirects, @NativeType("GLsizei const *") IntBuffer sizes) { + if (CHECKS) { + check(sizes, indirects.remaining()); + } + nglDrawCommandsAddressNV(primitiveMode, memAddress(indirects), memAddress(sizes), indirects.remaining()); + } + + // --- [ glDrawCommandsStatesNV ] --- + + /** + * Unsafe version of: {@link #glDrawCommandsStatesNV DrawCommandsStatesNV} + * + * @param count the number of commands + */ + public static native void nglDrawCommandsStatesNV(int buffer, long indirects, long sizes, long states, long fbos, int count); + + /** + * Accepts arrays of buffer addresses as an array of offsets {@code indirects} into a buffer named by {@code buffer}, an array of command lengths in + * {@code sizes}, and an array of state object names in {@code states}, of which all names must be non-zero. Frame buffer object names are stored in + * {@code fbos} and can be either zero or non-zero. All arrays have {@code count} entries. The residency of textures used as attachment inside the state + * object's captured fbo or the passed fbo must managed explicitly. + * + * @param buffer the buffer object name + * @param indirects the array of offsets into the buffer + * @param sizes the array of command lengths + * @param states the array of state object names + * @param fbos the array of framebuffer object names + */ + public static void glDrawCommandsStatesNV(@NativeType("GLuint") int buffer, @NativeType("GLintptr const *") PointerBuffer indirects, @NativeType("GLsizei const *") IntBuffer sizes, @NativeType("GLuint const *") IntBuffer states, @NativeType("GLuint const *") IntBuffer fbos) { + if (CHECKS) { + check(sizes, indirects.remaining()); + check(states, indirects.remaining()); + check(fbos, indirects.remaining()); + } + nglDrawCommandsStatesNV(buffer, memAddress(indirects), memAddress(sizes), memAddress(states), memAddress(fbos), indirects.remaining()); + } + + // --- [ glDrawCommandsStatesAddressNV ] --- + + /** + * Unsafe version of: {@link #glDrawCommandsStatesAddressNV DrawCommandsStatesAddressNV} + * + * @param count the number of commands + */ + public static native void nglDrawCommandsStatesAddressNV(long indirects, long sizes, long states, long fbos, int count); + + /** + * Accepts arrays of buffer addresses as an array of GPU addresses {@code indirects}, an array of command lengths in {@code sizes}, and an array of state + * object names in {@code states}, of which all names must be non-zero. Frame buffer object names are stored in {@code fbos} and can be either zero or + * non-zero. All arrays have {@code count} entries. The residency of textures used as attachment inside the state object's captured fbo or the passed fbo + * must managed explicitly. + * + * @param indirects the array of GPU addresses + * @param sizes the array of command lengths + * @param states the array of state object names + * @param fbos the array of framebuffer object names + */ + public static void glDrawCommandsStatesAddressNV(@NativeType("GLuint64 const *") LongBuffer indirects, @NativeType("GLsizei const *") IntBuffer sizes, @NativeType("GLuint const *") IntBuffer states, @NativeType("GLuint const *") IntBuffer fbos) { + if (CHECKS) { + check(sizes, indirects.remaining()); + check(states, indirects.remaining()); + check(fbos, indirects.remaining()); + } + nglDrawCommandsStatesAddressNV(memAddress(indirects), memAddress(sizes), memAddress(states), memAddress(fbos), indirects.remaining()); + } + + // --- [ glCreateCommandListsNV ] --- + + /** + * Unsafe version of: {@link #glCreateCommandListsNV CreateCommandListsNV} + * + * @param n the number of command list names to create + */ + public static native void nglCreateCommandListsNV(int n, long lists); + + /** + * Returns {@code n} previously unused command list names in {@code lists}, and creates a command list in the initial state for each name. + * + * @param lists the buffer in which to return the created command list names + */ + public static void glCreateCommandListsNV(@NativeType("GLuint *") IntBuffer lists) { + nglCreateCommandListsNV(lists.remaining(), memAddress(lists)); + } + + /** Returns {@code n} previously unused command list names in {@code lists}, and creates a command list in the initial state for each name. */ + @NativeType("void") + public static int glCreateCommandListsNV() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer lists = stack.callocInt(1); + nglCreateCommandListsNV(1, memAddress(lists)); + return lists.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDeleteCommandListsNV ] --- + + /** + * Unsafe version of: {@link #glDeleteCommandListsNV DeleteCommandListsNV} + * + * @param n the number of command list names to delete + */ + public static native void nglDeleteCommandListsNV(int n, long lists); + + /** + * Deletes {@code n} command lists stored in {@code lists}. Once a command list is deleted it has no contents and its name is again unused. Unused names + * in {@code lists} are silently ignored, as is the value zero. + * + * @param lists the buffer from which to read the command list names to delete + */ + public static void glDeleteCommandListsNV(@NativeType("GLuint const *") IntBuffer lists) { + nglDeleteCommandListsNV(lists.remaining(), memAddress(lists)); + } + + /** + * Deletes {@code n} command lists stored in {@code lists}. Once a command list is deleted it has no contents and its name is again unused. Unused names + * in {@code lists} are silently ignored, as is the value zero. + */ + public static void glDeleteCommandListsNV(@NativeType("GLuint const *") int list) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer lists = stack.ints(list); + nglDeleteCommandListsNV(1, memAddress(lists)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsCommandListNV ] --- + + /** + * Returns true if the specified name corresponds to a command list. + * + * @param list the object name to query + */ + @NativeType("GLboolean") + public static native boolean glIsCommandListNV(@NativeType("GLuint") int list); + + // --- [ glListDrawCommandsStatesClientNV ] --- + + /** + * Unsafe version of: {@link #glListDrawCommandsStatesClientNV ListDrawCommandsStatesClientNV} + * + * @param count the number of commands + */ + public static native void nglListDrawCommandsStatesClientNV(int list, int segment, long indirects, long sizes, long states, long fbos, int count); + + /** + * A list has multiple segments and each segment enqueues an ordered list of commands. This command enqueues the equivalent of the + * DrawCommandsStatesClientNV commands into the list indicated by {@code list} on the segment indicated by {@code segment}. + * + *

    A list has multiple segments and each segment enqueues an ordered list of command sequences. This command enqueues the equivalent of the + * DrawCommandsStatesNV commands into the list indicated by {@code list} on the segment indicated by {@code segment} except that the sequence data is + * copied from the sequences pointed to by the {@code indirects} pointer. The {@code indirects} pointer should point to a list of size {@code count} of + * pointers, each of which should point to a command sequence.

    + * + *

    The pre-validated state from {@code states} is saved into the command list, rather than a reference to the state object (i.e. the state objects or fbos + * could be deleted and the command list would be unaffected). This includes native GPU addresses for all textures indirectly referenced through the fbos + * passed or state objects' fbos attachments, therefore a recompile of the command list is required if such referenced textures change their allocation + * (for example due to resizing), as well as explicit management of the residency of the textures prior {@link #glCallCommandListNV CallCommandListNV}.

    + * + *

    ListDrawCommandsStatesClientNV performs a by-value copy of the indirect data based on the provided client-side pointers. In this case the content is + * fully immutable, while the buffer-based versions can change the content of the buffers at any later time.

    + * + * @param list the command list + * @param segment the segment + * @param indirects the array of GPU addresses + * @param sizes the array of command lengths + * @param states the array of state object names + * @param fbos the array of framebuffer object names + */ + public static void glListDrawCommandsStatesClientNV(@NativeType("GLuint") int list, @NativeType("GLuint") int segment, @NativeType("void const **") PointerBuffer indirects, @NativeType("GLsizei const *") IntBuffer sizes, @NativeType("GLuint const *") IntBuffer states, @NativeType("GLuint const *") IntBuffer fbos) { + if (CHECKS) { + check(sizes, indirects.remaining()); + check(states, indirects.remaining()); + check(fbos, indirects.remaining()); + } + nglListDrawCommandsStatesClientNV(list, segment, memAddress(indirects), memAddress(sizes), memAddress(states), memAddress(fbos), indirects.remaining()); + } + + // --- [ glCommandListSegmentsNV ] --- + + /** + * Indicates that {@code list} will have {@code segments} number of segments, each of which is a list of command sequences that it enqueues. This must be + * called before any commands are enqueued. In the initial state, a command list has a single segment. + * + * @param list the command list + * @param segments the number of ordered sequences of commands + */ + public static native void glCommandListSegmentsNV(@NativeType("GLuint") int list, @NativeType("GLuint") int segments); + + // --- [ glCompileCommandListNV ] --- + + /** + * Makes the list indicated by {@code list} switch from allowing collection of commands to allowing its execution. At this time, the implementation may + * generate optimized commands to transition between states as efficiently as possible. + * + * @param list the command list to compile + */ + public static native void glCompileCommandListNV(@NativeType("GLuint") int list); + + // --- [ glCallCommandListNV ] --- + + /** + * Executes the command list indicated by {@code list}, which operates as if the DrawCommandsStates* commands were replayed in the order they were + * enqueued on each segment, starting from segment zero and proceeding to the maximum segment. All buffer or texture resources' residency must be managed + * explicitly, including texture attachments of the effective fbos during list enqueuing. + * + * @param list the command list to call + */ + public static native void glCallCommandListNV(@NativeType("GLuint") int list); + + /** Array version of: {@link #glCreateStatesNV CreateStatesNV} */ + public static void glCreateStatesNV(@NativeType("GLuint *") int[] states) { + long __functionAddress = GL.getICD().glCreateStatesNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(states.length, states, __functionAddress); + } + + /** Array version of: {@link #glDeleteStatesNV DeleteStatesNV} */ + public static void glDeleteStatesNV(@NativeType("GLuint const *") int[] states) { + long __functionAddress = GL.getICD().glDeleteStatesNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(states.length, states, __functionAddress); + } + + /** Array version of: {@link #glDrawCommandsNV DrawCommandsNV} */ + public static void glDrawCommandsNV(@NativeType("GLenum") int primitiveMode, @NativeType("GLuint") int buffer, @NativeType("GLintptr const *") PointerBuffer indirects, @NativeType("GLsizei const *") int[] sizes) { + long __functionAddress = GL.getICD().glDrawCommandsNV; + if (CHECKS) { + check(__functionAddress); + check(sizes, indirects.remaining()); + } + callPPV(primitiveMode, buffer, memAddress(indirects), sizes, indirects.remaining(), __functionAddress); + } + + /** Array version of: {@link #glDrawCommandsAddressNV DrawCommandsAddressNV} */ + public static void glDrawCommandsAddressNV(@NativeType("GLenum") int primitiveMode, @NativeType("GLuint64 const *") long[] indirects, @NativeType("GLsizei const *") int[] sizes) { + long __functionAddress = GL.getICD().glDrawCommandsAddressNV; + if (CHECKS) { + check(__functionAddress); + check(sizes, indirects.length); + } + callPPV(primitiveMode, indirects, sizes, indirects.length, __functionAddress); + } + + /** Array version of: {@link #glDrawCommandsStatesNV DrawCommandsStatesNV} */ + public static void glDrawCommandsStatesNV(@NativeType("GLuint") int buffer, @NativeType("GLintptr const *") PointerBuffer indirects, @NativeType("GLsizei const *") int[] sizes, @NativeType("GLuint const *") int[] states, @NativeType("GLuint const *") int[] fbos) { + long __functionAddress = GL.getICD().glDrawCommandsStatesNV; + if (CHECKS) { + check(__functionAddress); + check(sizes, indirects.remaining()); + check(states, indirects.remaining()); + check(fbos, indirects.remaining()); + } + callPPPPV(buffer, memAddress(indirects), sizes, states, fbos, indirects.remaining(), __functionAddress); + } + + /** Array version of: {@link #glDrawCommandsStatesAddressNV DrawCommandsStatesAddressNV} */ + public static void glDrawCommandsStatesAddressNV(@NativeType("GLuint64 const *") long[] indirects, @NativeType("GLsizei const *") int[] sizes, @NativeType("GLuint const *") int[] states, @NativeType("GLuint const *") int[] fbos) { + long __functionAddress = GL.getICD().glDrawCommandsStatesAddressNV; + if (CHECKS) { + check(__functionAddress); + check(sizes, indirects.length); + check(states, indirects.length); + check(fbos, indirects.length); + } + callPPPPV(indirects, sizes, states, fbos, indirects.length, __functionAddress); + } + + /** Array version of: {@link #glCreateCommandListsNV CreateCommandListsNV} */ + public static void glCreateCommandListsNV(@NativeType("GLuint *") int[] lists) { + long __functionAddress = GL.getICD().glCreateCommandListsNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(lists.length, lists, __functionAddress); + } + + /** Array version of: {@link #glDeleteCommandListsNV DeleteCommandListsNV} */ + public static void glDeleteCommandListsNV(@NativeType("GLuint const *") int[] lists) { + long __functionAddress = GL.getICD().glDeleteCommandListsNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(lists.length, lists, __functionAddress); + } + + /** Array version of: {@link #glListDrawCommandsStatesClientNV ListDrawCommandsStatesClientNV} */ + public static void glListDrawCommandsStatesClientNV(@NativeType("GLuint") int list, @NativeType("GLuint") int segment, @NativeType("void const **") PointerBuffer indirects, @NativeType("GLsizei const *") int[] sizes, @NativeType("GLuint const *") int[] states, @NativeType("GLuint const *") int[] fbos) { + long __functionAddress = GL.getICD().glListDrawCommandsStatesClientNV; + if (CHECKS) { + check(__functionAddress); + check(sizes, indirects.remaining()); + check(states, indirects.remaining()); + check(fbos, indirects.remaining()); + } + callPPPPV(list, segment, memAddress(indirects), sizes, states, fbos, indirects.remaining(), __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConditionalRender.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConditionalRender.java new file mode 100644 index 000000000..73a843298 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConditionalRender.java @@ -0,0 +1,51 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_conditional_render extension. + * + *

    This extension provides support for conditional rendering based on the results of an occlusion query. This mechanism allows an application to + * potentially reduce the latency between the completion of an occlusion query and the rendering commands depending on its result. It additionally allows + * the decision of whether to render to be made without application intervention.

    + * + *

    This extension defines two new functions, {@link #glBeginConditionalRenderNV BeginConditionalRenderNV} and {@link #glEndConditionalRenderNV EndConditionalRenderNV}, between which rendering commands may be discarded + * based on the results of an occlusion query. If the specified occlusion query returns a non-zero value, rendering commands between these calls are + * executed. If the occlusion query returns a value of zero, all rendering commands between the calls are discarded.

    + * + *

    If the occlusion query results are not available when {@link #glBeginConditionalRenderNV BeginConditionalRenderNV} is executed, the {@code mode} parameter specifies whether the GL + * should wait for the query to complete or should simply render the subsequent geometry unconditionally.

    + * + *

    Additionally, the extension provides a set of "by region" modes, allowing for implementations that divide rendering work by screen regions to perform + * the conditional query test on a region-by-region basis without checking the query results from other regions. Such a mode is useful for cases like + * split-frame SLI, where a frame is divided between multiple GPUs, each of which has its own occlusion query hardware.

    + */ +public class NVConditionalRender { + + static { GL.initialize(); } + + /** Accepted by the {@code mode} parameter of BeginConditionalRenderNV. */ + public static final int + GL_QUERY_WAIT_NV = 0x8E13, + GL_QUERY_NO_WAIT_NV = 0x8E14, + GL_QUERY_BY_REGION_WAIT_NV = 0x8E15, + GL_QUERY_BY_REGION_NO_WAIT_NV = 0x8E16; + + protected NVConditionalRender() { + throw new UnsupportedOperationException(); + } + + // --- [ glBeginConditionalRenderNV ] --- + + public static native void glBeginConditionalRenderNV(@NativeType("GLuint") int id, @NativeType("GLenum") int mode); + + // --- [ glEndConditionalRenderNV ] --- + + public static native void glEndConditionalRenderNV(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRaster.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRaster.java new file mode 100644 index 000000000..1ae91aa4d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRaster.java @@ -0,0 +1,57 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_conservative_raster extension. + * + *

    This extension adds a "conservative" rasterization mode where any pixel that is partially covered, even if no sample location is covered, is treated as + * fully covered and a corresponding fragment will be shaded.

    + * + *

    A new control is also added to modify window coordinate snapping precision.

    + * + *

    These controls can be used to implement "binning" to a low-resolution render target, for example to determine which tiles of a sparse texture need to + * be populated. An app can construct a framebuffer where there is one pixel per tile in the sparse texture, and adjust the number of subpixel bits such + * that snapping occurs to the same effective grid as when rendering to the sparse texture. Then triangles should cover (at least) the same pixels in the + * low-res framebuffer as they do tiles in the sparse texture.

    + */ +public class NVConservativeRaster { + + static { GL.initialize(); } + + /** Accepted by the {@code cap} parameter of Enable, Disable, IsEnabled. */ + public static final int GL_CONSERVATIVE_RASTERIZATION_NV = 0x9346; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV = 0x9347, + GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV = 0x9348, + GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV = 0x9349; + + protected NVConservativeRaster() { + throw new UnsupportedOperationException(); + } + + // --- [ glSubpixelPrecisionBiasNV ] --- + + /** + * Sets the {@link #GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV SUBPIXEL_PRECISION_BIAS_X_BITS_NV} and {@link #GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV SUBPIXEL_PRECISION_BIAS_Y_BITS_NV} values. + * + *

    The vertex's window x and y coordinates may be optionally converted to fixed-point values with {@code N} fractional bits. If + * {@link #GL_CONSERVATIVE_RASTERIZATION_NV CONSERVATIVE_RASTERIZATION_NV} is disabled, then {@code N} is the implementation-dependent value of {@link GL11#GL_SUBPIXEL_BITS SUBPIXEL_BITS}. If + * {@link #GL_CONSERVATIVE_RASTERIZATION_NV CONSERVATIVE_RASTERIZATION_NV} is enabled, {@code N} is computed as the sum of the value of {@link GL11#GL_SUBPIXEL_BITS SUBPIXEL_BITS} and programmable values of + * {@link #GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV SUBPIXEL_PRECISION_BIAS_X_BITS_NV} and {@link #GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV SUBPIXEL_PRECISION_BIAS_Y_BITS_NV}.

    + * + *

    When these values are non-zero, the invariance requirement may not apply because the subpixel precision may not be the same at all window coordinates.

    + * + * @param xbits the {@link #GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV SUBPIXEL_PRECISION_BIAS_X_BITS_NV} value. The initial value is zero. + * @param ybits the {@link #GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV SUBPIXEL_PRECISION_BIAS_Y_BITS_NV} value. The initial value is zero. + */ + public static native void glSubpixelPrecisionBiasNV(@NativeType("GLuint") int xbits, @NativeType("GLuint") int ybits); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterDilate.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterDilate.java new file mode 100644 index 000000000..b4bd00385 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterDilate.java @@ -0,0 +1,40 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_conservative_raster_dilate extension. + * + *

    This extension extends the conservative rasterization funtionality provided by NV_conservative_raster. It provides a new control to generate an + * "over-conservative" rasterization by dilating primitives prior to rasterization.

    + * + *

    When using conservative raster to bin geometry, this extension provides a programmable overlap region between adjacent primitives. Regular + * rasterization bins triangles with a shared edge uniquely into pixels. Conservative raster has a one-pixel overlap along the shared edge. Using a + * half-pixel raster dilation, this overlap region increases to two pixels.

    + * + *

    Requires {@link NVConservativeRaster NV_conservative_raster}.

    + */ +public class NVConservativeRasterDilate { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of ConservativeRasterParameterfNV, GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_CONSERVATIVE_RASTER_DILATE_NV = 0x9379, + GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV = 0x937A, + GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV = 0x937B; + + protected NVConservativeRasterDilate() { + throw new UnsupportedOperationException(); + } + + // --- [ glConservativeRasterParameterfNV ] --- + + public static native void glConservativeRasterParameterfNV(@NativeType("GLenum") int pname, @NativeType("GLfloat") float value); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterPreSnap.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterPreSnap.java new file mode 100644 index 000000000..bfa600765 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterPreSnap.java @@ -0,0 +1,24 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_conservative_raster_pre_snap extension. + * + *

    {@link NVConservativeRasterPreSnapTriangles NV_conservative_raster_pre_snap_triangles} provides a new mode to achieve rasterization of triangles that is conservative w.r.t the triangle at + * infinite precision i.e. before it is snapped to the sub-pixel grid. This extension provides a new mode that expands this functionality to lines and + * points.

    + * + *

    Requires {@link NVConservativeRasterPreSnapTriangles NV_conservative_raster_pre_snap_triangles}.

    + */ +public final class NVConservativeRasterPreSnap { + + /** Accepted by the {@code param} parameter of {@link NVConservativeRasterPreSnapTriangles#glConservativeRasterParameteriNV ConservativeRasterParameteriNV} */ + public static final int GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV = 0x9550; + + private NVConservativeRasterPreSnap() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterPreSnapTriangles.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterPreSnapTriangles.java new file mode 100644 index 000000000..c8013f901 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVConservativeRasterPreSnapTriangles.java @@ -0,0 +1,58 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * When {@link NVConservativeRaster#GL_CONSERVATIVE_RASTERIZATION_NV CONSERVATIVE_RASTERIZATION_NV} is enabled, the fragments generated for a primitive are conservative with respect to the primitive after snapping + * to sub-pixel grid. This extension provides a new mode of rasterization for triangles where the fragments generated are conservative with respect to the + * primitive at infinite precision before vertex snapping. + * + *

    When the conservative raster mode is set to {@link #GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV}, triangles are rasterized more conservatively, and may + * generate fragments not generated when the mode is {@link #GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV CONSERVATIVE_RASTER_MODE_POST_SNAP_NV} (default). In particular it may generate fragments for pixels + * covered by triangles with zero area, or for pixels that are adjacent to but not covered by any triangle. This modified behavior may be useful in + * compensating for rounding errors caused by snapping vertex positions to a sub-pixel grid during rasterization. It's possible that a non-degenerate + * triangle becomes degenerate due to snapping. It's additionally possible that rounding errors in computing the position of a vertex or from snapping may + * cause a primitive that would cover a pixel at infinite precision to fail to cover the pixel post-snap. Rasterizing such primitives more conservatively + * may be useful for "binning" algorithms described in {@link NVConservativeRaster NV_conservative_raster}.

    + * + *

    Requires {@link NVConservativeRaster NV_conservative_raster}.

    + */ +public class NVConservativeRasterPreSnapTriangles { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of ConservativeRasterParameteriNV. */ + public static final int GL_CONSERVATIVE_RASTER_MODE_NV = 0x954D; + + /** Accepted by the {@code param} parameter of ConservativeRasterParameteriNV. */ + public static final int + GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV = 0x954E, + GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV = 0x954F; + + protected NVConservativeRasterPreSnapTriangles() { + throw new UnsupportedOperationException(); + } + + // --- [ glConservativeRasterParameteriNV ] --- + + /** + * When {@link NVConservativeRaster#GL_CONSERVATIVE_RASTERIZATION_NV CONSERVATIVE_RASTERIZATION_NV} is enabled, the rasterization behavior may be controlled by calling the this command. + * + *

    If the mode is set to {@link #GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV CONSERVATIVE_RASTER_MODE_POST_SNAP_NV}, the generated fragments are conservative w.r.t the primitive after it is snapped to + * sub-pixel grid. If the mode is set to {@link #GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV} the fragments generated for triangles will be conservative w.r.t + * the triangle at infinite precision. Since non-degenerate triangles may become degenerate due to vertex snapping, this mode will generate fragments for + * zero area triangles that are otherwise culled when the mode is {@link #GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV CONSERVATIVE_RASTER_MODE_POST_SNAP_NV}. This mode may also generate fragments for pixels + * that are within half a sub-pixel distance away from a triangle's infinite precision boundary. The default mode is set to + * {@link #GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV CONSERVATIVE_RASTER_MODE_POST_SNAP_NV}.

    + * + * @param pname the parameter to set. Must be:
    {@link #GL_CONSERVATIVE_RASTER_MODE_NV CONSERVATIVE_RASTER_MODE_NV}
    + * @param param specifies the conservative raster mode to be used. One of:
    {@link #GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV CONSERVATIVE_RASTER_MODE_POST_SNAP_NV}
    {@link #GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV}
    + */ + public static native void glConservativeRasterParameteriNV(@NativeType("GLenum") int pname, @NativeType("GLint") int param); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCopyDepthToColor.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCopyDepthToColor.java new file mode 100644 index 000000000..d4800ee29 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCopyDepthToColor.java @@ -0,0 +1,29 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Some applications, especially systems for distributed OpenGL rendering, would like to have a fast way of copying their depth buffer into a color + * buffer; for example, this allows the depth buffer to be scanned out, allowing downstream compositing operations. + * + *

    To do this operation in unextended OpenGL, the app must use {@link GL11C#glReadPixels ReadPixels} of {@link GL11#GL_DEPTH_COMPONENT DEPTH_COMPONENT} data, followed by {@link GL11#glDrawPixels DrawPixels} of {@link GL11#GL_RGBA RGBA} + * data. However, this typically will not provide adequate performance.

    + * + *

    This extension provides a way to copy the depth data directly into the color buffer, by adding two new options for the "type" parameter of + * {@link GL11#glCopyPixels CopyPixels}: {@link #GL_DEPTH_STENCIL_TO_RGBA_NV DEPTH_STENCIL_TO_RGBA_NV} and {@link #GL_DEPTH_STENCIL_TO_BGRA_NV DEPTH_STENCIL_TO_BGRA_NV}.

    + * + *

    Requires {@link NVPackedDepthStencil NV_packed_depth_stencil}.

    + */ +public final class NVCopyDepthToColor { + + /** Accepted by the {@code type} parameter of CopyPixels. */ + public static final int + GL_DEPTH_STENCIL_TO_RGBA_NV = 0x886E, + GL_DEPTH_STENCIL_TO_BGRA_NV = 0x886F; + + private NVCopyDepthToColor() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCopyImage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCopyImage.java new file mode 100644 index 000000000..7ff7196dd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVCopyImage.java @@ -0,0 +1,30 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_copy_image extension. + * + *

    This extension enables efficient image data transfer between image objects (i.e. textures and renderbuffers) without the need to bind the objects or + * otherwise configure the rendering pipeline. The WGL and GLX versions allow copying between images in different contexts, even if those contexts are in + * different sharelists or even on different physical devices.

    + */ +public class NVCopyImage { + + static { GL.initialize(); } + + protected NVCopyImage() { + throw new UnsupportedOperationException(); + } + + // --- [ glCopyImageSubDataNV ] --- + + /** Copies a region of texel data between two image objects. An image object may be either a texture or a renderbuffer. */ + public static native void glCopyImageSubDataNV(@NativeType("GLuint") int srcName, @NativeType("GLenum") int srcTarget, @NativeType("GLint") int srcLevel, @NativeType("GLint") int srcX, @NativeType("GLint") int srcY, @NativeType("GLint") int srcZ, @NativeType("GLuint") int dstName, @NativeType("GLenum") int dstTarget, @NativeType("GLint") int dstLevel, @NativeType("GLint") int dstX, @NativeType("GLint") int dstY, @NativeType("GLint") int dstZ, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDeepTexture3D.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDeepTexture3D.java new file mode 100644 index 000000000..5b8cbca7c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDeepTexture3D.java @@ -0,0 +1,24 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_deep_texture3D extension. + * + *

    Some applications require 3D textures that have a significant number of slices, but less resolution in width and height. In the current spec, the + * maximum value for the size of all three dimensions is specified by a single value. This extension adds a second set of limits against which 3D textures + * can be checked if an application needs deeper textures than would be allowed by the symmetric texture limits.

    + */ +public final class NVDeepTexture3D { + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv and GetFloatv. */ + public static final int + GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV = 0x90D0, + GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV = 0x90D1; + + private NVDeepTexture3D() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDepthBufferFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDepthBufferFloat.java new file mode 100644 index 000000000..fc2804583 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDepthBufferFloat.java @@ -0,0 +1,65 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_depth_buffer_float extension. + * + *

    This extension provides new texture internal formats whose depth components are stored as 32-bit floating-point values, rather than the normalized + * unsigned integers used in existing depth formats. Floating-point depth textures support all the functionality supported for fixed-point depth textures, + * including shadow mapping and rendering support via EXT_framebuffer_object. Floating-point depth textures can store values outside the range [0,1].

    + * + *

    By default, OpenGL entry points taking depth values implicitly clamp the values to the range [0,1]. This extension provides new DepthClear, DepthRange, + * and DepthBoundsEXT entry points that allow applications to specify depth values that are not clamped.

    + * + *

    Additionally, this extension provides new packed depth/stencil pixel formats (see EXT_packed_depth_stencil) that have 64-bit pixels consisting of a + * 32-bit floating-point depth value, 8 bits of stencil, and 24 unused bites. A packed depth/stencil texture internal format is also provided.

    + * + *

    This extension does not provide support for WGL or GLX pixel formats with floating-point depth buffers. The existing (but not commonly used) + * WGL_EXT_depth_float extension could be used for this purpose.

    + * + *

    Requires {@link GL20 OpenGL 2.0}, {@link ARBColorBufferFloat ARB_color_buffer_float}, {@link EXTPackedDepthStencil EXT_packed_depth_stencil} and {@link EXTFramebufferObject EXT_framebuffer_object}.

    + */ +public class NVDepthBufferFloat { + + static { GL.initialize(); } + + /** + * Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorageEXT, and + * returned in the {@code data} parameter of GetTexLevelParameter and GetRenderbufferParameterivEXT. + */ + public static final int + GL_DEPTH_COMPONENT32F_NV = 0x8DAB, + GL_DEPTH32F_STENCIL8_NV = 0x8DAC; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage. + */ + public static final int GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV = 0x8DAD; + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_DEPTH_BUFFER_FLOAT_MODE_NV = 0x8DAF; + + protected NVDepthBufferFloat() { + throw new UnsupportedOperationException(); + } + + // --- [ glDepthRangedNV ] --- + + public static native void glDepthRangedNV(@NativeType("GLdouble") double zNear, @NativeType("GLdouble") double zFar); + + // --- [ glClearDepthdNV ] --- + + public static native void glClearDepthdNV(@NativeType("GLdouble") double depth); + + // --- [ glDepthBoundsdNV ] --- + + public static native void glDepthBoundsdNV(@NativeType("GLdouble") double zmin, @NativeType("GLdouble") double zmax); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDepthClamp.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDepthClamp.java new file mode 100644 index 000000000..ef32ac097 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDepthClamp.java @@ -0,0 +1,36 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_depth_clamp extension. + * + *

    In some rendering applications such as shadow volumes, it is useful + * to allow line and polygon primitives to be rasterized without + * clipping the primitive to the near or far clip volume planes (side + * clip volume planes clip normally). Without the near and far clip + * planes, rasterization (pixel coverage determination) in X and Y + * can proceed normally if we ignore the near and far clip planes. + * The one major issue is that fragments of a primitive may extend + * beyond the conventional window space depth range for depth values + * (typically the range [0,1]). Rather than discarding fragments that + * defy the window space depth range (effectively what near and far + * plane clipping accomplish), the depth values can be clamped to the + * current depth range.

    + * + *

    This extension provides exactly such functionality.

    + */ +public final class NVDepthClamp { + + /** + * Accepted by the {@code cap} parameter Enable, Disable, and IsEnabled, + * and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. + */ + public static final int GL_DEPTH_CLAMP_NV = 0x864F; + + private NVDepthClamp() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDrawTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDrawTexture.java new file mode 100644 index 000000000..a690442f3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDrawTexture.java @@ -0,0 +1,34 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_draw_texture extension. + * + *

    This extension provides a new function, DrawTextureNV(), allowing + * applications to draw an screen-aligned rectangle displaying some or all of + * the contents of a two-dimensional or rectangle texture. Callers specify a + * texture object, an optional sampler object, window coordinates of the + * rectangle to draw, and texture coordinates corresponding to the corners of + * the rectangle. For each fragment produced by the rectangle, DrawTextureNV + * interpolates the texture coordinates, performs a texture lookup, and uses + * the texture result as the fragment color.

    + */ +public class NVDrawTexture { + + static { GL.initialize(); } + + protected NVDrawTexture() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawTextureNV ] --- + + public static native void glDrawTextureNV(@NativeType("GLuint") int texture, @NativeType("GLuint") int sampler, @NativeType("GLfloat") float x0, @NativeType("GLfloat") float y0, @NativeType("GLfloat") float x1, @NativeType("GLfloat") float y1, @NativeType("GLfloat") float z, @NativeType("GLfloat") float s0, @NativeType("GLfloat") float t0, @NativeType("GLfloat") float s1, @NativeType("GLfloat") float t1); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDrawVulkanImage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDrawVulkanImage.java new file mode 100644 index 000000000..38a94a594 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVDrawVulkanImage.java @@ -0,0 +1,126 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_draw_vulkan_image extension. + * + *

    This extension provides a new function, {@link #glDrawVkImageNV DrawVkImageNV}, allowing applications to draw a screen-aligned rectangle displaying some or all of the + * contents of a two-dimensional Vulkan VkImage. Callers specify a Vulkan {@code VkImage} handle, an optional OpenGL sampler object, window coordinates of + * the rectangle to draw, and texture coordinates corresponding to the corners of the rectangle. For each fragment produced by the rectangle, + * {@code DrawVkImageNV} interpolates the texture coordinates, performs a texture lookup, and uses the texture result as the fragment color.

    + * + *

    No shaders are used by {@code DrawVkImageNV}; the results of the texture lookup are used in lieu of a fragment shader output. The fragments generated + * are processed by all per-fragment operations. In particular, {@code DrawVkImageNV()} fully supports blending and multisampling.

    + * + *

    In order to synchronize between Vulkan and OpenGL there are three other functions provided; {@link #glWaitVkSemaphoreNV WaitVkSemaphoreNV}, {@link #glSignalVkSemaphoreNV SignalVkSemaphoreNV} and + * {@link #glSignalVkFenceNV SignalVkFenceNV}. These allow OpenGL to wait for Vulkan to complete work and also Vulkan to wait for OpenGL to complete work. Together OpenGL and + * Vulkan can synchronize on the server without application interation.

    + * + *

    Finally the function {@code GetVkProcAddrNV()} is provided to allow the OpenGL context to query the Vulkan entry points directly and avoid having to + * load them through the typical Vulkan loader.

    + */ +public class NVDrawVulkanImage { + + static { GL.initialize(); } + + protected NVDrawVulkanImage() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawVkImageNV ] --- + + /** + * Draws a screen-aligned rectangle displaying a portion of the contents of the Vulkan {@code VkImage}. + * + * @param vkImage the Vulkan image handle + * @param sampler an optional sampler object + * @param x0 the rectangle left window coordinate + * @param y0 the rectangle bottom window coordinate + * @param x1 the rectangle right window coordinate + * @param y1 the rectangle top window coordinate + * @param z the Z window coordinate + * @param s0 the left texture coordinate + * @param t0 the bottom texture coordinate + * @param s1 the right texture coordinate + * @param t1 the top texture coordinate + */ + public static native void glDrawVkImageNV(@NativeType("GLuint64") long vkImage, @NativeType("GLuint") int sampler, @NativeType("GLfloat") float x0, @NativeType("GLfloat") float y0, @NativeType("GLfloat") float x1, @NativeType("GLfloat") float y1, @NativeType("GLfloat") float z, @NativeType("GLfloat") float s0, @NativeType("GLfloat") float t0, @NativeType("GLfloat") float s1, @NativeType("GLfloat") float t1); + + // --- [ glGetVkProcAddrNV ] --- + + /** Unsafe version of: {@link #glGetVkProcAddrNV GetVkProcAddrNV} */ + public static native long nglGetVkProcAddrNV(long name); + + /** + * Queries the Vulkan function entry points from within an OpenGL context. + * + * @param name name of the Vulkan function + */ + @NativeType("VULKANPROCNV") + public static long glGetVkProcAddrNV(@NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetVkProcAddrNV(memAddress(name)); + } + + /** + * Queries the Vulkan function entry points from within an OpenGL context. + * + * @param name name of the Vulkan function + */ + @NativeType("VULKANPROCNV") + public static long glGetVkProcAddrNV(@NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetVkProcAddrNV(nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glWaitVkSemaphoreNV ] --- + + /** + * Causes the GL server to block until the Vulkan {@code VkSemaphore} is signalled. No GL commands after this command are executed by the server until the + * semaphore is signaled. + * + * @param vkSemaphore a valid Vulkan {@code VkSemaphore} non-dispatchable handle otherwise the operation is undefined + */ + public static native void glWaitVkSemaphoreNV(@NativeType("GLuint64") long vkSemaphore); + + // --- [ glSignalVkSemaphoreNV ] --- + + /** + * Causes the GL server to signal the Vulkan {@code VkSemaphore} when it executes this command. The semaphore is not signalled by GL until all commands + * issued before this have completed execution on the GL server. + * + * @param vkSemaphore a valid Vulkan {@code VkSemaphore} non-dispatchable handle otherwise the operation is undefined + */ + public static native void glSignalVkSemaphoreNV(@NativeType("GLuint64") long vkSemaphore); + + // --- [ glSignalVkFenceNV ] --- + + /** + * Causes the GL server to signal the Vulkan {@code VkFence} object when it executes this command. The fence is not signalled by the GL until all commands + * issued before this have completed execution on the GL server. + * + * @param vkFence a valid Vulkan VkFence non-dispatcable handle otherwise the operation is undefined + */ + public static native void glSignalVkFenceNV(@NativeType("GLuint64") long vkFence); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVExplicitMultisample.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVExplicitMultisample.java new file mode 100644 index 000000000..3f431ad3f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVExplicitMultisample.java @@ -0,0 +1,96 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_explicit_multisample extension. + * + *

    In traditional multisample specs, the API only allows access to the samples indirectly through methods such as coverage values and downsampled + * readbacks. NV_explicit_multisample adds a set of new capabilities to allow more precise control over the use of multisamples. Specifically, it adds:

    + * + *
      + *
    • A query in the API to query the location of samples within the pixel
    • + *
    • An explicit control for the multisample sample mask to augment the control provided by SampleCoverage
    • + *
    • A new texture target to wrap a renderbuffer and allow a restricted class of accesses to the samples
    • + *
    • The ability to fetch a specific sample from a multisampled texture from within a shader
    • + *
    • A program option to enable the new behavior
    • + *
    + * + *

    Requires {@link GL20 OpenGL 2.0} and {@link ARBMultisample ARB_multisample}.

    + */ +public class NVExplicitMultisample { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetMultisamplefvNV. */ + public static final int GL_SAMPLE_POSITION_NV = 0x8E50; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_SAMPLE_MASK_NV = 0x8E51; + + /** Accepted by the {@code pname} parameter of GetBooleanIndexedvEXT and GetIntegerIndexedvEXT. */ + public static final int GL_SAMPLE_MASK_VALUE_NV = 0x8E52; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_TEXTURE_BINDING_RENDERBUFFER_NV = 0x8E53, + GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV = 0x8E54, + GL_MAX_SAMPLE_MASK_WORDS_NV = 0x8E59; + + /** Accepted by the {@code target} parameter of BindTexture, and TexRenderbufferNV. */ + public static final int GL_TEXTURE_RENDERBUFFER_NV = 0x8E55; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int + GL_SAMPLER_RENDERBUFFER_NV = 0x8E56, + GL_INT_SAMPLER_RENDERBUFFER_NV = 0x8E57, + GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV = 0x8E58; + + protected NVExplicitMultisample() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetMultisamplefvNV ] --- + + public static native void nglGetMultisamplefvNV(int pname, int index, long val); + + public static void glGetMultisamplefvNV(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat *") FloatBuffer val) { + if (CHECKS) { + check(val, 2); + } + nglGetMultisamplefvNV(pname, index, memAddress(val)); + } + + // --- [ glSampleMaskIndexedNV ] --- + + public static native void glSampleMaskIndexedNV(@NativeType("GLuint") int index, @NativeType("GLbitfield") int mask); + + // --- [ glTexRenderbufferNV ] --- + + public static native void glTexRenderbufferNV(@NativeType("GLenum") int target, @NativeType("GLuint") int renderbuffer); + + /** Array version of: {@link #glGetMultisamplefvNV GetMultisamplefvNV} */ + public static void glGetMultisamplefvNV(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLfloat *") float[] val) { + long __functionAddress = GL.getICD().glGetMultisamplefvNV; + if (CHECKS) { + check(__functionAddress); + check(val, 2); + } + callPV(pname, index, val, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFence.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFence.java new file mode 100644 index 000000000..cb26003ad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFence.java @@ -0,0 +1,159 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_fence extension. + * + *

    The goal of this extension is provide a finer granularity of synchronizing GL command completion than offered by standard OpenGL, which offers only two + * mechanisms for synchronization: Flush and Finish. Since Flush merely assures the user that the commands complete in a finite (though undetermined) + * amount of time, it is, thus, of only modest utility. Finish, on the other hand, stalls CPU execution until all pending GL commands have completed. This + * extension offers a middle ground - the ability to "finish" a subset of the command stream, and the ability to determine whether a given command has + * completed or not.

    + * + *

    This extension introduces the concept of a "fence" to the OpenGL command stream. Once the fence is inserted into the command stream, it can be queried + * for a given condition - typically, its completion. Moreover, the application may also request a partial Finish -- that is, all commands prior to the + * fence will be forced to complete until control is returned to the calling process. These new mechanisms allow for synchronization between the host CPU + * and the GPU, which may be accessing the same resources (typically memory).

    + * + *

    This extension is useful in conjunction with NV_vertex_array_range to determine when vertex information has been pulled from the vertex array range. + * Once a fence has been tested TRUE or finished, all vertex indices issued before the fence must have been pulled. This ensures that the vertex data + * memory corresponding to the issued vertex indices can be safely modified (assuming no other outstanding vertex indices are issued subsequent to the + * fence).

    + */ +public class NVFence { + + static { GL.initialize(); } + + /** Accepted by the {@code condition} parameter of SetFenceNV. */ + public static final int GL_ALL_COMPLETED_NV = 0x84F2; + + /** Accepted by the {@code pname} parameter of GetFenceivNV. */ + public static final int + GL_FENCE_STATUS_NV = 0x84F3, + GL_FENCE_CONDITION_NV = 0x84F4; + + protected NVFence() { + throw new UnsupportedOperationException(); + } + + // --- [ glDeleteFencesNV ] --- + + public static native void nglDeleteFencesNV(int n, long fences); + + public static void glDeleteFencesNV(@NativeType("GLuint const *") IntBuffer fences) { + nglDeleteFencesNV(fences.remaining(), memAddress(fences)); + } + + public static void glDeleteFencesNV(@NativeType("GLuint const *") int fence) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer fences = stack.ints(fence); + nglDeleteFencesNV(1, memAddress(fences)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenFencesNV ] --- + + public static native void nglGenFencesNV(int n, long fences); + + public static void glGenFencesNV(@NativeType("GLuint *") IntBuffer fences) { + nglGenFencesNV(fences.remaining(), memAddress(fences)); + } + + @NativeType("void") + public static int glGenFencesNV() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer fences = stack.callocInt(1); + nglGenFencesNV(1, memAddress(fences)); + return fences.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsFenceNV ] --- + + @NativeType("GLboolean") + public static native boolean glIsFenceNV(@NativeType("GLuint") int fence); + + // --- [ glTestFenceNV ] --- + + @NativeType("GLboolean") + public static native boolean glTestFenceNV(@NativeType("GLuint") int fence); + + // --- [ glGetFenceivNV ] --- + + public static native void nglGetFenceivNV(int fence, int pname, long params); + + public static void glGetFenceivNV(@NativeType("GLuint") int fence, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetFenceivNV(fence, pname, memAddress(params)); + } + + @NativeType("void") + public static int glGetFenceiNV(@NativeType("GLuint") int fence, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglGetFenceivNV(fence, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glFinishFenceNV ] --- + + public static native void glFinishFenceNV(@NativeType("GLuint") int fence); + + // --- [ glSetFenceNV ] --- + + public static native void glSetFenceNV(@NativeType("GLuint") int fence, @NativeType("GLenum") int condition); + + /** Array version of: {@link #glDeleteFencesNV DeleteFencesNV} */ + public static void glDeleteFencesNV(@NativeType("GLuint const *") int[] fences) { + long __functionAddress = GL.getICD().glDeleteFencesNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(fences.length, fences, __functionAddress); + } + + /** Array version of: {@link #glGenFencesNV GenFencesNV} */ + public static void glGenFencesNV(@NativeType("GLuint *") int[] fences) { + long __functionAddress = GL.getICD().glGenFencesNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(fences.length, fences, __functionAddress); + } + + /** Array version of: {@link #glGetFenceivNV GetFenceivNV} */ + public static void glGetFenceivNV(@NativeType("GLuint") int fence, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetFenceivNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(fence, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFillRectangle.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFillRectangle.java new file mode 100644 index 000000000..a6fd1fe47 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFillRectangle.java @@ -0,0 +1,22 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_fill_rectangle extension. + * + *

    This extension adds a new {@link GL11C#glPolygonMode PolygonMode} setting where a triangle is rasterized by computing and filling its axis-aligned screen-space bounding + * box, disregarding the actual triangle edges. This can be useful for drawing a rectangle without being split into two triangles with an internal edge. + * It is also useful to minimize the number of primitives that need to be drawn, particularly for a user-interface.

    + */ +public final class NVFillRectangle { + + /** Accepted by the {@code mode} parameter of PolygonMode. */ + public static final int GL_FILL_RECTANGLE_NV = 0x933C; + + private NVFillRectangle() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFloatBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFloatBuffer.java new file mode 100644 index 000000000..7485e9a7f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFloatBuffer.java @@ -0,0 +1,41 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_float_buffer extension. + * + *

    This extension builds upon NV_fragment_program to provide a framebuffer and texture format that allows fragment programs to read and write + * unconstrained floating point data.

    + */ +public final class NVFloatBuffer { + + /** Accepted by the {@code internalformat} parameter of TexImage2D and CopyTexImage2D. */ + public static final int + GL_FLOAT_R_NV = 0x8880, + GL_FLOAT_RG_NV = 0x8881, + GL_FLOAT_RGB_NV = 0x8882, + GL_FLOAT_RGBA_NV = 0x8883, + GL_FLOAT_R16_NV = 0x8884, + GL_FLOAT_R32_NV = 0x8885, + GL_FLOAT_RG16_NV = 0x8886, + GL_FLOAT_RG32_NV = 0x8887, + GL_FLOAT_RGB16_NV = 0x8888, + GL_FLOAT_RGB32_NV = 0x8889, + GL_FLOAT_RGBA16_NV = 0x888A, + GL_FLOAT_RGBA32_NV = 0x888B; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameterfv and GetTexLevelParameteriv. */ + public static final int GL_TEXTURE_FLOAT_COMPONENTS_NV = 0x888C; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_FLOAT_CLEAR_COLOR_VALUE_NV = 0x888D, + GL_FLOAT_RGBA_MODE_NV = 0x888E; + + private NVFloatBuffer() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFogDistance.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFogDistance.java new file mode 100644 index 000000000..b5fe48926 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFogDistance.java @@ -0,0 +1,44 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_fog_distance extension. + * + *

    Ideally, the fog distance (used to compute the fog factor as described in Section 3.10) should be computed as the per-fragment Euclidean distance to + * the fragment center from the eye. In practice, implementations "may choose to approximate the eye-coordinate distance from the eye to each fragment + * center by abs(ze). Further, [the fog factor] f need not be computed at each fragment, but may be computed at each vertex and interpolated as other data + * are."

    + * + *

    This extension provides the application specific control over how OpenGL computes the distance used in computing the fog factor.

    + * + *

    The extension supports three fog distance modes: "eye plane absolute", where the fog distance is the absolute planar distance from the eye plane (i.e., + * OpenGL's standard implementation allowance as cited above); "eye plane", where the fog distance is the signed planar distance from the eye plane; and + * "eye radial", where the fog distance is computed as a Euclidean distance. In the case of the eye radial fog distance mode, the distance may be computed + * per-vertex and then interpolated per-fragment.

    + * + *

    The intent of this extension is to provide applications with better control over the tradeoff between performance and fog quality. The "eye planar" + * modes (signed or absolute) are straightforward to implement with good performance, but scenes are consistently under-fogged at the edges of the field + * of view. The "eye radial" mode can provide for more accurate fog at the edges of the field of view, but this assumes that either the eye radial fog + * distance is computed per-fragment, or if the fog distance is computed per-vertex and then interpolated per-fragment, then the scene must be + * sufficiently tessellated.

    + */ +public final class NVFogDistance { + + /** Accepted by the {@code pname} parameters of Fogf, Fogi, Fogfv, Fogiv, GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_FOG_DISTANCE_MODE_NV = 0x855A; + + /** + * When the {@code pname} parameter of Fogf, Fogi, Foggv, and Fogiv, is FOG_DISTANCE_MODE_NV, then the value of {@code param} or the value pointed to by + * {@code params} may be. + */ + public static final int + GL_EYE_RADIAL_NV = 0x855B, + GL_EYE_PLANE_ABSOLUTE_NV = 0x855C; + + private NVFogDistance() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFragmentCoverageToColor.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFragmentCoverageToColor.java new file mode 100644 index 000000000..9b427e222 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFragmentCoverageToColor.java @@ -0,0 +1,41 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_fragment_coverage_to_color extension. + * + *

    This extension allows the fragment coverage value, represented as an + * integer bitfield, to be substituted for a color output being written to a + * single-component color buffer with integer components (e.g., R8UI). The + * capability provided by this extension is different from simply writing the + * gl_SampleMask fragment shader output in that the coverage value written to + * the framebuffer is taken after alpha test, stencil test, and depth test, + * as well as after the multisample fragment operations such as + * alpha-to-coverage.

    + */ +public class NVFragmentCoverageToColor { + + static { GL.initialize(); } + + /** Accepted by the {@code cap} parameter of Enable, Disable, IsEnabled. */ + public static final int GL_FRAGMENT_COVERAGE_TO_COLOR_NV = 0x92DD; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int GL_FRAGMENT_COVERAGE_COLOR_NV = 0x92DE; + + protected NVFragmentCoverageToColor() { + throw new UnsupportedOperationException(); + } + + // --- [ glFragmentCoverageColorNV ] --- + + /** @param color the draw buffer index that the coverage value will be written to. Must be between 0 and the value of MAX_DRAW_BUFFERS minus one, inclusive. */ + public static native void glFragmentCoverageColorNV(@NativeType("GLuint") int color); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFramebufferMixedSamples.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFramebufferMixedSamples.java new file mode 100644 index 000000000..3b452a548 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFramebufferMixedSamples.java @@ -0,0 +1,137 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_framebuffer_mixed_samples extension. + * + *

    This extension allows multisample rendering with a raster and + * depth/stencil sample count that is larger than the color sample count. + * Rasterization and the results of the depth and stencil tests together + * determine the portion of a pixel that is "covered". It can be useful to + * evaluate coverage at a higher frequency than color samples are stored. + * This coverage is then "reduced" to a collection of covered color samples, + * each having an opacity value corresponding to the fraction of the color + * sample covered. The opacity can optionally be blended into individual + * color samples.

    + */ +public class NVFramebufferMixedSamples { + + static { GL.initialize(); } + + /** Accepted by the {@code cap} parameter of Enable, Disable, IsEnabled. */ + public static final int + GL_RASTER_MULTISAMPLE_EXT = 0x9327, + GL_COVERAGE_MODULATION_TABLE_NV = 0x9331; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_RASTER_SAMPLES_EXT = 0x9328, + GL_MAX_RASTER_SAMPLES_EXT = 0x9329, + GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT = 0x932A, + GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT = 0x932B, + GL_EFFECTIVE_RASTER_SAMPLES_EXT = 0x932C, + GL_COLOR_SAMPLES_NV = 0x8E20, + GL_DEPTH_SAMPLES_NV = 0x932D, + GL_STENCIL_SAMPLES_NV = 0x932E, + GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV = 0x932F, + GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV = 0x9330, + GL_COVERAGE_MODULATION_NV = 0x9332, + GL_COVERAGE_MODULATION_TABLE_SIZE_NV = 0x9333; + + protected NVFramebufferMixedSamples() { + throw new UnsupportedOperationException(); + } + + // --- [ glRasterSamplesEXT ] --- + + /** + * Selects the number of samples to be used for rasterization. {@code samples} represents a request for a desired minimum number of samples. Since + * different implementations may support different sample counts, the actual sample pattern used is implementation-dependent. However, the resulting value + * for {@link EXTRasterMultisample#GL_RASTER_SAMPLES_EXT RASTER_SAMPLES_EXT} is guaranteed to be greater than or equal to {@code samples} and no more than the next larger sample count supported by the + * implementation. If {@code fixedsamplelocations} is {@link GL11#GL_TRUE TRUE}, identical sample locations will be used for all pixels. The sample locations chosen are a + * function of only the parameters to RasterSamplesEXT and not of any other state. + * + *

    If {@link EXTRasterMultisample#GL_RASTER_MULTISAMPLE_EXT RASTER_MULTISAMPLE_EXT} is enabled, then the sample pattern chosen by RasterSamplesEXT will be used instead of sampling at the center of the pixel. + * The sample locations can be queried with {@link GL32C#glGetMultisamplefv GetMultisamplefv} with a {@code pname} of {@link GL32#GL_SAMPLE_POSITION SAMPLE_POSITION}, similar to normal multisample sample + * locations.

    + * + *

    The value {@link EXTRasterMultisample#GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT MULTISAMPLE_RASTERIZATION_ALLOWED_EXT} is {@link GL11#GL_TRUE TRUE} if {@link GL13#GL_SAMPLE_BUFFERS SAMPLE_BUFFERS} is one or if {@link EXTRasterMultisample#GL_RASTER_MULTISAMPLE_EXT RASTER_MULTISAMPLE_EXT} is enabled. The value + * {@link EXTRasterMultisample#GL_EFFECTIVE_RASTER_SAMPLES_EXT EFFECTIVE_RASTER_SAMPLES_EXT} is equal to {@link EXTRasterMultisample#GL_RASTER_SAMPLES_EXT RASTER_SAMPLES_EXT} if {@link EXTRasterMultisample#GL_RASTER_MULTISAMPLE_EXT RASTER_MULTISAMPLE_EXT} is enabled, otherwise is equal to {@link GL13#GL_SAMPLES SAMPLES}.

    + * + *

    Explicit multisample rasterization can not be used in conjunction with depth, stencil, or depth bounds tests, multisample framebuffers, or if + * {@link EXTRasterMultisample#GL_RASTER_SAMPLES_EXT RASTER_SAMPLES_EXT} is zero. If {@link EXTRasterMultisample#GL_RASTER_MULTISAMPLE_EXT RASTER_MULTISAMPLE_EXT} is enabled, the error {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} will be generated by Draw commands if

    + * + *
      + *
    • the value of {@link EXTRasterMultisample#GL_RASTER_SAMPLES_EXT RASTER_SAMPLES_EXT} is zero
    • + *
    • the depth, stencil, or depth bounds test is enabled
    • + *
    • a multisample draw framebuffer is bound ({@link GL13#GL_SAMPLE_BUFFERS SAMPLE_BUFFERS} is one)
    • + *
    + * + *
    Errors
    + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if {@code samples} is greater than the value of {@link EXTRasterMultisample#GL_MAX_RASTER_SAMPLES_EXT MAX_RASTER_SAMPLES_EXT} (the implementation-dependent maximum + * number of samples).

    + * + * @param samples the number of samples to be used for rasterization + * @param fixedsamplelocations if {@link GL11#GL_TRUE TRUE}, identical sample locations will be used for all pixels + */ + public static void glRasterSamplesEXT(@NativeType("GLuint") int samples, @NativeType("GLboolean") boolean fixedsamplelocations) { + EXTRasterMultisample.glRasterSamplesEXT(samples, fixedsamplelocations); + } + + // --- [ glCoverageModulationTableNV ] --- + + /** + * Unsafe version of: {@link #glCoverageModulationTableNV CoverageModulationTableNV} + * + * @param n The size of the coverage modulation table. Must be equal to the value of COVERAGE_MODULATION_TABLE_SIZE_NV. + */ + public static native void nglCoverageModulationTableNV(int n, long v); + + public static void glCoverageModulationTableNV(@NativeType("GLfloat const *") FloatBuffer v) { + nglCoverageModulationTableNV(v.remaining(), memAddress(v)); + } + + // --- [ glGetCoverageModulationTableNV ] --- + + public static native void nglGetCoverageModulationTableNV(int bufsize, long v); + + public static void glGetCoverageModulationTableNV(@NativeType("GLfloat *") FloatBuffer v) { + nglGetCoverageModulationTableNV(v.remaining(), memAddress(v)); + } + + // --- [ glCoverageModulationNV ] --- + + public static native void glCoverageModulationNV(@NativeType("GLenum") int components); + + /** Array version of: {@link #glCoverageModulationTableNV CoverageModulationTableNV} */ + public static void glCoverageModulationTableNV(@NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glCoverageModulationTableNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(v.length, v, __functionAddress); + } + + /** Array version of: {@link #glGetCoverageModulationTableNV GetCoverageModulationTableNV} */ + public static void glGetCoverageModulationTableNV(@NativeType("GLfloat *") float[] v) { + long __functionAddress = GL.getICD().glGetCoverageModulationTableNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(v.length, v, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFramebufferMultisampleCoverage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFramebufferMultisampleCoverage.java new file mode 100644 index 000000000..c5cc8a67c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVFramebufferMultisampleCoverage.java @@ -0,0 +1,48 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_framebuffer_multisample_coverage extension. + * + *

    This extension extends the EXT_framebuffer_multisample specification by providing a new function, RenderBufferStorageMultisampleCoverageNV, that + * distinguishes between color samples and coverage samples.

    + * + *

    EXT_framebuffer_multisample introduced the function RenderbufferStorageMultisampleEXT as a method of defining the storage parameters for a multisample + * render buffer. This function takes a {@code samples} parameter. Using rules provided by the specification, the {@code samples} parameter is resolved to + * an actual number of samples that is supported by the underlying hardware. EXT_framebuffer_multisample does not specify whether {@code samples} refers + * to coverage samples or color samples.

    + * + *

    This extension adds the function RenderbufferStorageMultisamplCoverageNV, which takes a {@code coverageSamples} parameter as well as a + * {@code colorSamples} parameter. These two parameters give developers more fine grained control over the quality of multisampled images.

    + * + *

    Requires {@link EXTFramebufferObject EXT_framebuffer_object}, {@link EXTFramebufferBlit EXT_framebuffer_blit} and {@link EXTFramebufferMultisample EXT_framebuffer_multisample}.

    + */ +public class NVFramebufferMultisampleCoverage { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetRenderbufferParameterivEXT. */ + public static final int + GL_RENDERBUFFER_COVERAGE_SAMPLES_NV = 0x8CAB, + GL_RENDERBUFFER_COLOR_SAMPLES_NV = 0x8E10; + + /** Accepted by the {@code pname} parameter of GetIntegerv. */ + public static final int + GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV = 0x8E11, + GL_MULTISAMPLE_COVERAGE_MODES_NV = 0x8E12; + + protected NVFramebufferMultisampleCoverage() { + throw new UnsupportedOperationException(); + } + + // --- [ glRenderbufferStorageMultisampleCoverageNV ] --- + + public static native void glRenderbufferStorageMultisampleCoverageNV(@NativeType("GLenum") int target, @NativeType("GLsizei") int coverageSamples, @NativeType("GLsizei") int colorSamples, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVGPUMulticast.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVGPUMulticast.java new file mode 100644 index 000000000..97e457497 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVGPUMulticast.java @@ -0,0 +1,306 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_gpu_multicast extension. + * + *

    This extension enables novel multi-GPU rendering techniques by providing application control over a group of linked GPUs with identical hardware + * configuration.

    + * + *

    Multi-GPU rendering techniques fall into two categories: implicit and explicit. Existing explicit approaches like {@link WGLNVGPUAffinity WGL_NV_gpu_affinity} have two + * main drawbacks: CPU overhead and application complexity. An application must manage one context per GPU and multi-pump the API stream. Implicit + * multi-GPU rendering techniques avoid these issues by broadcasting rendering from one context to multiple GPUs. Common implicit approaches include + * alternate-frame rendering (AFR), split-frame rendering (SFR) and multi-GPU anti-aliasing. They each have drawbacks. AFR scales nicely but interacts + * poorly with inter-frame dependencies. SFR can improve latency but has challenges with offscreen rendering and scaling of vertex processing. With + * multi-GPU anti-aliasing, each GPU renders the same content with alternate sample positions and the driver blends the result to improve quality. This + * also has issues with offscreen rendering and can conflict with other anti-aliasing techniques.

    + * + *

    These issues with implicit multi-GPU rendering all have the same root cause: the driver lacks adequate knowledge to accelerate every application. To + * resolve this, NV_gpu_multicast provides fine-grained, explicit application control over multiple GPUs with a single context.

    + * + *

    Key points:

    + * + *
      + *
    • One context controls multiple GPUs. Every GPU in the linked group can access every object.
    • + *
    • Rendering is broadcast. Each draw is repeated across all GPUs in the linked group.
    • + *
    • Each GPU gets its own instance of all framebuffers, allowing individualized output for each GPU. Input data can be customized for each GPU using + * buffers created with the storage flag, {@link #GL_PER_GPU_STORAGE_BIT_NV PER_GPU_STORAGE_BIT_NV} and a new API, {@link #glMulticastBufferSubDataNV MulticastBufferSubDataNV}.
    • + *
    • New interfaces provide mechanisms to transfer textures and buffers from one GPU to another.
    • + *
    + * + *

    Requires {@link ARBCopyImage ARB_copy_image} and {@link EXTDirectStateAccess EXT_direct_state_access}.

    + */ +public class NVGPUMulticast { + + static { GL.initialize(); } + + /** Accepted in the {@code flags} parameter of BufferStorage and NamedBufferStorageEXT. */ + public static final int GL_PER_GPU_STORAGE_BIT_NV = 0x800; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_MULTICAST_GPUS_NV = 0x92BA, + GL_RENDER_GPU_MASK_NV = 0x9558; + + /** + * Accepted as a value for {@code pname} for the TexParameter{if}, TexParameter{if}v, TextureParameter{if}, TextureParameter{if}v, MultiTexParameter{if}EXT + * and MultiTexParameter{if}vEXT commands and for the {@code value} parameter of GetTexParameter{if}v, GetTextureParameter{if}vEXT and + * GetMultiTexParameter{if}vEXT. + */ + public static final int GL_PER_GPU_STORAGE_NV = 0x9548; + + /** Accepted by the {@code pname} parameter of GetMultisamplefv. */ + public static final int GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV = 0x9549; + + protected NVGPUMulticast() { + throw new UnsupportedOperationException(); + } + + // --- [ glRenderGpuMaskNV ] --- + + /** Restricts render commands to a specific set of GPUs. */ + public static native void glRenderGpuMaskNV(@NativeType("GLbitfield") int mask); + + // --- [ glMulticastBufferSubDataNV ] --- + + public static native void nglMulticastBufferSubDataNV(int gpuMask, int buffer, long offset, long size, long data); + + public static void glMulticastBufferSubDataNV(@NativeType("GLbitfield") int gpuMask, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") ByteBuffer data) { + nglMulticastBufferSubDataNV(gpuMask, buffer, offset, data.remaining(), memAddress(data)); + } + + public static void glMulticastBufferSubDataNV(@NativeType("GLbitfield") int gpuMask, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") ShortBuffer data) { + nglMulticastBufferSubDataNV(gpuMask, buffer, offset, Integer.toUnsignedLong(data.remaining()) << 1, memAddress(data)); + } + + public static void glMulticastBufferSubDataNV(@NativeType("GLbitfield") int gpuMask, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") IntBuffer data) { + nglMulticastBufferSubDataNV(gpuMask, buffer, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + public static void glMulticastBufferSubDataNV(@NativeType("GLbitfield") int gpuMask, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") FloatBuffer data) { + nglMulticastBufferSubDataNV(gpuMask, buffer, offset, Integer.toUnsignedLong(data.remaining()) << 2, memAddress(data)); + } + + public static void glMulticastBufferSubDataNV(@NativeType("GLbitfield") int gpuMask, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") DoubleBuffer data) { + nglMulticastBufferSubDataNV(gpuMask, buffer, offset, Integer.toUnsignedLong(data.remaining()) << 3, memAddress(data)); + } + + // --- [ glMulticastCopyBufferSubDataNV ] --- + + public static native void glMulticastCopyBufferSubDataNV(@NativeType("GLuint") int readGpu, @NativeType("GLbitfield") int writeGpuMask, @NativeType("GLuint") int readBuffer, @NativeType("GLuint") int writeBuffer, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size); + + // --- [ glMulticastCopyImageSubDataNV ] --- + + public static native void glMulticastCopyImageSubDataNV(@NativeType("GLuint") int srcGpu, @NativeType("GLbitfield") int dstGpuMask, @NativeType("GLuint") int srcName, @NativeType("GLenum") int srcTarget, @NativeType("GLint") int srcLevel, @NativeType("GLint") int srcX, @NativeType("GLint") int srxY, @NativeType("GLint") int srcZ, @NativeType("GLuint") int dstName, @NativeType("GLenum") int dstTarget, @NativeType("GLint") int dstLevel, @NativeType("GLint") int dstX, @NativeType("GLint") int dstY, @NativeType("GLint") int dstZ, @NativeType("GLsizei") int srcWidth, @NativeType("GLsizei") int srcHeight, @NativeType("GLsizei") int srcDepth); + + // --- [ glMulticastBlitFramebufferNV ] --- + + public static native void glMulticastBlitFramebufferNV(@NativeType("GLuint") int srcGpu, @NativeType("GLuint") int dstGpu, @NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter); + + // --- [ glMulticastFramebufferSampleLocationsfvNV ] --- + + public static native void nglMulticastFramebufferSampleLocationsfvNV(int gpu, int framebuffer, int start, int count, long v); + + public static void glMulticastFramebufferSampleLocationsfvNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int framebuffer, @NativeType("GLuint") int start, @NativeType("GLfloat const *") FloatBuffer v) { + nglMulticastFramebufferSampleLocationsfvNV(gpu, framebuffer, start, v.remaining() >> 1, memAddress(v)); + } + + // --- [ glMulticastBarrierNV ] --- + + public static native void glMulticastBarrierNV(); + + // --- [ glMulticastWaitSyncNV ] --- + + public static native void glMulticastWaitSyncNV(@NativeType("GLuint") int signalGpu, @NativeType("GLbitfield") int waitGpuMask); + + // --- [ glMulticastGetQueryObjectivNV ] --- + + public static native void nglMulticastGetQueryObjectivNV(int gpu, int id, int pname, long params); + + public static void glMulticastGetQueryObjectivNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglMulticastGetQueryObjectivNV(gpu, id, pname, memAddress(params)); + } + + @NativeType("void") + public static int glMulticastGetQueryObjectiNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglMulticastGetQueryObjectivNV(gpu, id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glMulticastGetQueryObjectuivNV ] --- + + public static native void nglMulticastGetQueryObjectuivNV(int gpu, int id, int pname, long params); + + public static void glMulticastGetQueryObjectuivNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglMulticastGetQueryObjectuivNV(gpu, id, pname, memAddress(params)); + } + + @NativeType("void") + public static int glMulticastGetQueryObjectuiNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer params = stack.callocInt(1); + nglMulticastGetQueryObjectuivNV(gpu, id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glMulticastGetQueryObjecti64vNV ] --- + + public static native void nglMulticastGetQueryObjecti64vNV(int gpu, int id, int pname, long params); + + public static void glMulticastGetQueryObjecti64vNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglMulticastGetQueryObjecti64vNV(gpu, id, pname, memAddress(params)); + } + + @NativeType("void") + public static long glMulticastGetQueryObjecti64NV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglMulticastGetQueryObjecti64vNV(gpu, id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glMulticastGetQueryObjectui64vNV ] --- + + public static native void nglMulticastGetQueryObjectui64vNV(int gpu, int id, int pname, long params); + + public static void glMulticastGetQueryObjectui64vNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglMulticastGetQueryObjectui64vNV(gpu, id, pname, memAddress(params)); + } + + @NativeType("void") + public static long glMulticastGetQueryObjectui64NV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglMulticastGetQueryObjectui64vNV(gpu, id, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glMulticastBufferSubDataNV MulticastBufferSubDataNV} */ + public static void glMulticastBufferSubDataNV(@NativeType("GLbitfield") int gpuMask, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") short[] data) { + long __functionAddress = GL.getICD().glMulticastBufferSubDataNV; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(gpuMask, buffer, offset, Integer.toUnsignedLong(data.length) << 1, data, __functionAddress); + } + + /** Array version of: {@link #glMulticastBufferSubDataNV MulticastBufferSubDataNV} */ + public static void glMulticastBufferSubDataNV(@NativeType("GLbitfield") int gpuMask, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") int[] data) { + long __functionAddress = GL.getICD().glMulticastBufferSubDataNV; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(gpuMask, buffer, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** Array version of: {@link #glMulticastBufferSubDataNV MulticastBufferSubDataNV} */ + public static void glMulticastBufferSubDataNV(@NativeType("GLbitfield") int gpuMask, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") float[] data) { + long __functionAddress = GL.getICD().glMulticastBufferSubDataNV; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(gpuMask, buffer, offset, Integer.toUnsignedLong(data.length) << 2, data, __functionAddress); + } + + /** Array version of: {@link #glMulticastBufferSubDataNV MulticastBufferSubDataNV} */ + public static void glMulticastBufferSubDataNV(@NativeType("GLbitfield") int gpuMask, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("void const *") double[] data) { + long __functionAddress = GL.getICD().glMulticastBufferSubDataNV; + if (CHECKS) { + check(__functionAddress); + } + callPPPV(gpuMask, buffer, offset, Integer.toUnsignedLong(data.length) << 3, data, __functionAddress); + } + + /** Array version of: {@link #glMulticastFramebufferSampleLocationsfvNV MulticastFramebufferSampleLocationsfvNV} */ + public static void glMulticastFramebufferSampleLocationsfvNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int framebuffer, @NativeType("GLuint") int start, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glMulticastFramebufferSampleLocationsfvNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(gpu, framebuffer, start, v.length >> 1, v, __functionAddress); + } + + /** Array version of: {@link #glMulticastGetQueryObjectivNV MulticastGetQueryObjectivNV} */ + public static void glMulticastGetQueryObjectivNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glMulticastGetQueryObjectivNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(gpu, id, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMulticastGetQueryObjectuivNV MulticastGetQueryObjectuivNV} */ + public static void glMulticastGetQueryObjectuivNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glMulticastGetQueryObjectuivNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(gpu, id, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMulticastGetQueryObjecti64vNV MulticastGetQueryObjecti64vNV} */ + public static void glMulticastGetQueryObjecti64vNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLint64 *") long[] params) { + long __functionAddress = GL.getICD().glMulticastGetQueryObjecti64vNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(gpu, id, pname, params, __functionAddress); + } + + /** Array version of: {@link #glMulticastGetQueryObjectui64vNV MulticastGetQueryObjectui64vNV} */ + public static void glMulticastGetQueryObjectui64vNV(@NativeType("GLuint") int gpu, @NativeType("GLuint") int id, @NativeType("GLenum") int pname, @NativeType("GLuint64 *") long[] params) { + long __functionAddress = GL.getICD().glMulticastGetQueryObjectui64vNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(gpu, id, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVGPUShader5.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVGPUShader5.java new file mode 100644 index 000000000..a575c23b3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVGPUShader5.java @@ -0,0 +1,490 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_gpu_shader5 extension. + * + *

    This extension provides a set of new features to the OpenGL Shading Language and related APIs to support capabilities of new GPUs. Shaders using the + * new functionality provided by this extension should enable this functionality via the construct

    + * + *
    
    + * \#extension GL_NV_gpu_shader5 : require (or enable)
    + * + *

    This extension was developed concurrently with the ARB_gpu_shader5 extension, and provides a superset of the features provided there. The features + * common to both extensions are documented in the ARB_gpu_shader5 specification; this document describes only the addition language features not + * available via ARB_gpu_shader5. A shader that enables this extension via an \#extension directive also implicitly enables the common capabilities + * provided by ARB_gpu_shader5.

    + * + *

    In addition to the capabilities of ARB_gpu_shader5, this extension provides a variety of new features for all shader types, including:

    + * + *
      + *
    • support for a full set of 8-, 16-, 32-, and 64-bit scalar and vector data types, including uniform API, uniform buffer object, and shader input and + * output support;
    • + *
    • the ability to aggregate samplers into arrays, index these arrays with arbitrary expressions, and not require that non-constant indices be uniform + * across all shader invocations;
    • + *
    • new built-in functions to pack and unpack 64-bit integer types into a two-component 32-bit integer vector;
    • + *
    • new built-in functions to pack and unpack 32-bit unsigned integer types into a two-component 16-bit floating-point vector;
    • + *
    • new built-in functions to convert double-precision floating-point values to or from their 64-bit integer bit encodings;
    • + *
    • new built-in functions to compute the composite of a set of boolean conditions a group of shader threads;
    • + *
    • vector relational functions supporting comparisons of vectors of 8-, 16-, and 64-bit integer types or 16-bit floating-point types; and
    • + *
    • extending texel offset support to allow loading texel offsets from regular integer operands computed at run-time, except for lookups with gradients + * (textureGrad*).
    • + *
    + * + *

    This extension also provides additional support for processing patch primitives (introduced by ARB_tessellation_shader). ARB_tessellation_shader + * requires the use of a tessellation evaluation shader when processing patches, which means that patches will never survive past the tessellation + * pipeline stage. This extension lifts that restriction, and allows patches to proceed further in the pipeline and be used

    + * + *
      + *
    • as input to a geometry shader, using a new "patches" layout qualifier;
    • + *
    • as input to transform feedback;
    • + *
    • by fixed-function rasterization stages, in which case the patches are drawn as independent points.
    • + *
    + * + *

    Additionally, it allows geometry shaders to read per-patch attributes written by a tessellation control shader using input variables declared with + * "patch in".

    + * + *

    Requires {@link GL32 OpenGL 3.2}, GLSL 1.50 and {@link ARBGPUShader5 ARB_gpu_shader5}.

    + */ +public class NVGPUShader5 { + + static { GL.initialize(); } + + /** Returned by the {@code type} parameter of GetActiveAttrib, GetActiveUniform, and GetTransformFeedbackVarying. */ + public static final int + GL_INT64_NV = 0x140E, + GL_UNSIGNED_INT64_NV = 0x140F, + GL_INT8_NV = 0x8FE0, + GL_INT8_VEC2_NV = 0x8FE1, + GL_INT8_VEC3_NV = 0x8FE2, + GL_INT8_VEC4_NV = 0x8FE3, + GL_INT16_NV = 0x8FE4, + GL_INT16_VEC2_NV = 0x8FE5, + GL_INT16_VEC3_NV = 0x8FE6, + GL_INT16_VEC4_NV = 0x8FE7, + GL_INT64_VEC2_NV = 0x8FE9, + GL_INT64_VEC3_NV = 0x8FEA, + GL_INT64_VEC4_NV = 0x8FEB, + GL_UNSIGNED_INT8_NV = 0x8FEC, + GL_UNSIGNED_INT8_VEC2_NV = 0x8FED, + GL_UNSIGNED_INT8_VEC3_NV = 0x8FEE, + GL_UNSIGNED_INT8_VEC4_NV = 0x8FEF, + GL_UNSIGNED_INT16_NV = 0x8FF0, + GL_UNSIGNED_INT16_VEC2_NV = 0x8FF1, + GL_UNSIGNED_INT16_VEC3_NV = 0x8FF2, + GL_UNSIGNED_INT16_VEC4_NV = 0x8FF3, + GL_UNSIGNED_INT64_VEC2_NV = 0x8FF5, + GL_UNSIGNED_INT64_VEC3_NV = 0x8FF6, + GL_UNSIGNED_INT64_VEC4_NV = 0x8FF7, + GL_FLOAT16_NV = 0x8FF8, + GL_FLOAT16_VEC2_NV = 0x8FF9, + GL_FLOAT16_VEC3_NV = 0x8FFA, + GL_FLOAT16_VEC4_NV = 0x8FFB; + + protected NVGPUShader5() { + throw new UnsupportedOperationException(); + } + + // --- [ glUniform1i64NV ] --- + + public static native void glUniform1i64NV(@NativeType("GLint") int location, @NativeType("GLint64EXT") long x); + + // --- [ glUniform2i64NV ] --- + + public static native void glUniform2i64NV(@NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y); + + // --- [ glUniform3i64NV ] --- + + public static native void glUniform3i64NV(@NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y, @NativeType("GLint64EXT") long z); + + // --- [ glUniform4i64NV ] --- + + public static native void glUniform4i64NV(@NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y, @NativeType("GLint64EXT") long z, @NativeType("GLint64EXT") long w); + + // --- [ glUniform1i64vNV ] --- + + public static native void nglUniform1i64vNV(int location, int count, long value); + + public static void glUniform1i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + nglUniform1i64vNV(location, value.remaining(), memAddress(value)); + } + + // --- [ glUniform2i64vNV ] --- + + public static native void nglUniform2i64vNV(int location, int count, long value); + + public static void glUniform2i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + nglUniform2i64vNV(location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glUniform3i64vNV ] --- + + public static native void nglUniform3i64vNV(int location, int count, long value); + + public static void glUniform3i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + nglUniform3i64vNV(location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glUniform4i64vNV ] --- + + public static native void nglUniform4i64vNV(int location, int count, long value); + + public static void glUniform4i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + nglUniform4i64vNV(location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glUniform1ui64NV ] --- + + public static native void glUniform1ui64NV(@NativeType("GLint") int location, @NativeType("GLuint64EXT") long x); + + // --- [ glUniform2ui64NV ] --- + + public static native void glUniform2ui64NV(@NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y); + + // --- [ glUniform3ui64NV ] --- + + public static native void glUniform3ui64NV(@NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y, @NativeType("GLuint64EXT") long z); + + // --- [ glUniform4ui64NV ] --- + + public static native void glUniform4ui64NV(@NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y, @NativeType("GLuint64EXT") long z, @NativeType("GLuint64EXT") long w); + + // --- [ glUniform1ui64vNV ] --- + + public static native void nglUniform1ui64vNV(int location, int count, long value); + + public static void glUniform1ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + nglUniform1ui64vNV(location, value.remaining(), memAddress(value)); + } + + // --- [ glUniform2ui64vNV ] --- + + public static native void nglUniform2ui64vNV(int location, int count, long value); + + public static void glUniform2ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT *") LongBuffer value) { + nglUniform2ui64vNV(location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glUniform3ui64vNV ] --- + + public static native void nglUniform3ui64vNV(int location, int count, long value); + + public static void glUniform3ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + nglUniform3ui64vNV(location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glUniform4ui64vNV ] --- + + public static native void nglUniform4ui64vNV(int location, int count, long value); + + public static void glUniform4ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + nglUniform4ui64vNV(location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glGetUniformi64vNV ] --- + + public static native void nglGetUniformi64vNV(int program, int location, long params); + + public static void glGetUniformi64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformi64vNV(program, location, memAddress(params)); + } + + @NativeType("void") + public static long glGetUniformi64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetUniformi64vNV(program, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetUniformui64vNV ] --- + + public static void nglGetUniformui64vNV(int program, int location, long params) { + NVShaderBufferLoad.nglGetUniformui64vNV(program, location, params); + } + + public static void glGetUniformui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT *") LongBuffer params) { + NVShaderBufferLoad.glGetUniformui64vNV(program, location, params); + } + + @NativeType("void") + public static long glGetUniformui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + return NVShaderBufferLoad.glGetUniformui64NV(program, location); + } + + // --- [ glProgramUniform1i64NV ] --- + + public static native void glProgramUniform1i64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT") long x); + + // --- [ glProgramUniform2i64NV ] --- + + public static native void glProgramUniform2i64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y); + + // --- [ glProgramUniform3i64NV ] --- + + public static native void glProgramUniform3i64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y, @NativeType("GLint64EXT") long z); + + // --- [ glProgramUniform4i64NV ] --- + + public static native void glProgramUniform4i64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y, @NativeType("GLint64EXT") long z, @NativeType("GLint64EXT") long w); + + // --- [ glProgramUniform1i64vNV ] --- + + public static native void nglProgramUniform1i64vNV(int program, int location, int count, long value); + + public static void glProgramUniform1i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + nglProgramUniform1i64vNV(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform2i64vNV ] --- + + public static native void nglProgramUniform2i64vNV(int program, int location, int count, long value); + + public static void glProgramUniform2i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + nglProgramUniform2i64vNV(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform3i64vNV ] --- + + public static native void nglProgramUniform3i64vNV(int program, int location, int count, long value); + + public static void glProgramUniform3i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + nglProgramUniform3i64vNV(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform4i64vNV ] --- + + public static native void nglProgramUniform4i64vNV(int program, int location, int count, long value); + + public static void glProgramUniform4i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") LongBuffer value) { + nglProgramUniform4i64vNV(program, location, value.remaining() >> 2, memAddress(value)); + } + + // --- [ glProgramUniform1ui64NV ] --- + + public static native void glProgramUniform1ui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT") long x); + + // --- [ glProgramUniform2ui64NV ] --- + + public static native void glProgramUniform2ui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y); + + // --- [ glProgramUniform3ui64NV ] --- + + public static native void glProgramUniform3ui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y, @NativeType("GLuint64EXT") long z); + + // --- [ glProgramUniform4ui64NV ] --- + + public static native void glProgramUniform4ui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y, @NativeType("GLuint64EXT") long z, @NativeType("GLuint64EXT") long w); + + // --- [ glProgramUniform1ui64vNV ] --- + + public static native void nglProgramUniform1ui64vNV(int program, int location, int count, long value); + + public static void glProgramUniform1ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + nglProgramUniform1ui64vNV(program, location, value.remaining(), memAddress(value)); + } + + // --- [ glProgramUniform2ui64vNV ] --- + + public static native void nglProgramUniform2ui64vNV(int program, int location, int count, long value); + + public static void glProgramUniform2ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + nglProgramUniform2ui64vNV(program, location, value.remaining() >> 1, memAddress(value)); + } + + // --- [ glProgramUniform3ui64vNV ] --- + + public static native void nglProgramUniform3ui64vNV(int program, int location, int count, long value); + + public static void glProgramUniform3ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + nglProgramUniform3ui64vNV(program, location, value.remaining() / 3, memAddress(value)); + } + + // --- [ glProgramUniform4ui64vNV ] --- + + public static native void nglProgramUniform4ui64vNV(int program, int location, int count, long value); + + public static void glProgramUniform4ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + nglProgramUniform4ui64vNV(program, location, value.remaining() >> 2, memAddress(value)); + } + + /** Array version of: {@link #glUniform1i64vNV Uniform1i64vNV} */ + public static void glUniform1i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glUniform1i64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glUniform2i64vNV Uniform2i64vNV} */ + public static void glUniform2i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glUniform2i64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glUniform3i64vNV Uniform3i64vNV} */ + public static void glUniform3i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glUniform3i64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glUniform4i64vNV Uniform4i64vNV} */ + public static void glUniform4i64vNV(@NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glUniform4i64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glUniform1ui64vNV Uniform1ui64vNV} */ + public static void glUniform1ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glUniform1ui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glUniform2ui64vNV Uniform2ui64vNV} */ + public static void glUniform2ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT *") long[] value) { + long __functionAddress = GL.getICD().glUniform2ui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glUniform3ui64vNV Uniform3ui64vNV} */ + public static void glUniform3ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glUniform3ui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glUniform4ui64vNV Uniform4ui64vNV} */ + public static void glUniform4ui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glUniform4ui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glGetUniformi64vNV GetUniformi64vNV} */ + public static void glGetUniformi64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT *") long[] params) { + long __functionAddress = GL.getICD().glGetUniformi64vNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, location, params, __functionAddress); + } + + /** Array version of: {@link #glGetUniformui64vNV GetUniformui64vNV} */ + public static void glGetUniformui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT *") long[] params) { + NVShaderBufferLoad.glGetUniformui64vNV(program, location, params); + } + + /** Array version of: {@link #glProgramUniform1i64vNV ProgramUniform1i64vNV} */ + public static void glProgramUniform1i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform1i64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform2i64vNV ProgramUniform2i64vNV} */ + public static void glProgramUniform2i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform2i64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform3i64vNV ProgramUniform3i64vNV} */ + public static void glProgramUniform3i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform3i64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform4i64vNV ProgramUniform4i64vNV} */ + public static void glProgramUniform4i64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform4i64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform1ui64vNV ProgramUniform1ui64vNV} */ + public static void glProgramUniform1ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform1ui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform2ui64vNV ProgramUniform2ui64vNV} */ + public static void glProgramUniform2ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform2ui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 1, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform3ui64vNV ProgramUniform3ui64vNV} */ + public static void glProgramUniform3ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform3ui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length / 3, value, __functionAddress); + } + + /** Array version of: {@link #glProgramUniform4ui64vNV ProgramUniform4ui64vNV} */ + public static void glProgramUniform4ui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniform4ui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length >> 2, value, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVHalfFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVHalfFloat.java new file mode 100644 index 000000000..879db1bc5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVHalfFloat.java @@ -0,0 +1,636 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_half_float extension. + * + *

    This extension introduces a new storage format and data type for half-precision (16-bit) floating-point quantities. The floating-point format is very + * similar to the IEEE single-precision floating-point standard, except that it has only 5 exponent bits and 10 mantissa bits. Half-precision floats are + * smaller than full precision floats and provide a larger dynamic range than similarly-sized normalized scalar data types.

    + * + *

    This extension allows applications to use half-precision floating point data when specifying vertices or pixel data. It adds new commands to specify + * vertex attributes using the new data type, and extends the existing vertex array and image specification commands to accept the new data type.

    + * + *

    This storage format is also used to represent 16-bit components in the floating-point frame buffers, as defined in the NV_float_buffer extension.

    + */ +public class NVHalfFloat { + + static { GL.initialize(); } + + /** + * Accepted by the {@code type} argument of VertexPointer, NormalPointer, ColorPointer, TexCoordPointer, FogCoordPointerEXT, SecondaryColorPointerEXT, + * VertexWeightPointerEXT, VertexAttribPointerNV, DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, + * and GetTexImage. + */ + public static final int GL_HALF_FLOAT_NV = 0x140B; + + protected NVHalfFloat() { + throw new UnsupportedOperationException(); + } + + // --- [ glVertex2hNV ] --- + + public static native void glVertex2hNV(@NativeType("GLhalfNV") short x, @NativeType("GLhalfNV") short y); + + // --- [ glVertex2hvNV ] --- + + public static native void nglVertex2hvNV(long v); + + public static void glVertex2hvNV(@NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertex2hvNV(memAddress(v)); + } + + // --- [ glVertex3hNV ] --- + + public static native void glVertex3hNV(@NativeType("GLhalfNV") short x, @NativeType("GLhalfNV") short y, @NativeType("GLhalfNV") short z); + + // --- [ glVertex3hvNV ] --- + + public static native void nglVertex3hvNV(long v); + + public static void glVertex3hvNV(@NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertex3hvNV(memAddress(v)); + } + + // --- [ glVertex4hNV ] --- + + public static native void glVertex4hNV(@NativeType("GLhalfNV") short x, @NativeType("GLhalfNV") short y, @NativeType("GLhalfNV") short z, @NativeType("GLhalfNV") short w); + + // --- [ glVertex4hvNV ] --- + + public static native void nglVertex4hvNV(long v); + + public static void glVertex4hvNV(@NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertex4hvNV(memAddress(v)); + } + + // --- [ glNormal3hNV ] --- + + public static native void glNormal3hNV(@NativeType("GLhalfNV") short nx, @NativeType("GLhalfNV") short ny, @NativeType("GLhalfNV") short nz); + + // --- [ glNormal3hvNV ] --- + + public static native void nglNormal3hvNV(long v); + + public static void glNormal3hvNV(@NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglNormal3hvNV(memAddress(v)); + } + + // --- [ glColor3hNV ] --- + + public static native void glColor3hNV(@NativeType("GLhalfNV") short red, @NativeType("GLhalfNV") short green, @NativeType("GLhalfNV") short blue); + + // --- [ glColor3hvNV ] --- + + public static native void nglColor3hvNV(long v); + + public static void glColor3hvNV(@NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglColor3hvNV(memAddress(v)); + } + + // --- [ glColor4hNV ] --- + + public static native void glColor4hNV(@NativeType("GLhalfNV") short red, @NativeType("GLhalfNV") short green, @NativeType("GLhalfNV") short blue, @NativeType("GLhalfNV") short alpha); + + // --- [ glColor4hvNV ] --- + + public static native void nglColor4hvNV(long v); + + public static void glColor4hvNV(@NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglColor4hvNV(memAddress(v)); + } + + // --- [ glTexCoord1hNV ] --- + + public static native void glTexCoord1hNV(@NativeType("GLhalfNV") short s); + + // --- [ glTexCoord1hvNV ] --- + + public static native void nglTexCoord1hvNV(long v); + + public static void glTexCoord1hvNV(@NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglTexCoord1hvNV(memAddress(v)); + } + + // --- [ glTexCoord2hNV ] --- + + public static native void glTexCoord2hNV(@NativeType("GLhalfNV") short s, @NativeType("GLhalfNV") short t); + + // --- [ glTexCoord2hvNV ] --- + + public static native void nglTexCoord2hvNV(long v); + + public static void glTexCoord2hvNV(@NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglTexCoord2hvNV(memAddress(v)); + } + + // --- [ glTexCoord3hNV ] --- + + public static native void glTexCoord3hNV(@NativeType("GLhalfNV") short s, @NativeType("GLhalfNV") short t, @NativeType("GLhalfNV") short r); + + // --- [ glTexCoord3hvNV ] --- + + public static native void nglTexCoord3hvNV(long v); + + public static void glTexCoord3hvNV(@NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglTexCoord3hvNV(memAddress(v)); + } + + // --- [ glTexCoord4hNV ] --- + + public static native void glTexCoord4hNV(@NativeType("GLhalfNV") short s, @NativeType("GLhalfNV") short t, @NativeType("GLhalfNV") short r, @NativeType("GLhalfNV") short q); + + // --- [ glTexCoord4hvNV ] --- + + public static native void nglTexCoord4hvNV(long v); + + public static void glTexCoord4hvNV(@NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglTexCoord4hvNV(memAddress(v)); + } + + // --- [ glMultiTexCoord1hNV ] --- + + public static native void glMultiTexCoord1hNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV") short s); + + // --- [ glMultiTexCoord1hvNV ] --- + + public static native void nglMultiTexCoord1hvNV(int target, long v); + + public static void glMultiTexCoord1hvNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglMultiTexCoord1hvNV(target, memAddress(v)); + } + + // --- [ glMultiTexCoord2hNV ] --- + + public static native void glMultiTexCoord2hNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV") short s, @NativeType("GLhalfNV") short t); + + // --- [ glMultiTexCoord2hvNV ] --- + + public static native void nglMultiTexCoord2hvNV(int target, long v); + + public static void glMultiTexCoord2hvNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglMultiTexCoord2hvNV(target, memAddress(v)); + } + + // --- [ glMultiTexCoord3hNV ] --- + + public static native void glMultiTexCoord3hNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV") short s, @NativeType("GLhalfNV") short t, @NativeType("GLhalfNV") short r); + + // --- [ glMultiTexCoord3hvNV ] --- + + public static native void nglMultiTexCoord3hvNV(int target, long v); + + public static void glMultiTexCoord3hvNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglMultiTexCoord3hvNV(target, memAddress(v)); + } + + // --- [ glMultiTexCoord4hNV ] --- + + public static native void glMultiTexCoord4hNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV") short s, @NativeType("GLhalfNV") short t, @NativeType("GLhalfNV") short r, @NativeType("GLhalfNV") short q); + + // --- [ glMultiTexCoord4hvNV ] --- + + public static native void nglMultiTexCoord4hvNV(int target, long v); + + public static void glMultiTexCoord4hvNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglMultiTexCoord4hvNV(target, memAddress(v)); + } + + // --- [ glFogCoordhNV ] --- + + public static native void glFogCoordhNV(@NativeType("GLhalfNV") short fog); + + // --- [ glFogCoordhvNV ] --- + + public static native void nglFogCoordhvNV(long fog); + + public static void glFogCoordhvNV(@NativeType("GLhalfNV const *") ShortBuffer fog) { + if (CHECKS) { + check(fog, 1); + } + nglFogCoordhvNV(memAddress(fog)); + } + + // --- [ glSecondaryColor3hNV ] --- + + public static native void glSecondaryColor3hNV(@NativeType("GLhalfNV") short red, @NativeType("GLhalfNV") short green, @NativeType("GLhalfNV") short blue); + + // --- [ glSecondaryColor3hvNV ] --- + + public static native void nglSecondaryColor3hvNV(long v); + + public static void glSecondaryColor3hvNV(@NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglSecondaryColor3hvNV(memAddress(v)); + } + + // --- [ glVertexWeighthNV ] --- + + public static native void glVertexWeighthNV(@NativeType("GLhalfNV") short weight); + + // --- [ glVertexWeighthvNV ] --- + + public static native void nglVertexWeighthvNV(long weight); + + public static void glVertexWeighthvNV(@NativeType("GLhalfNV const *") ShortBuffer weight) { + if (CHECKS) { + check(weight, 1); + } + nglVertexWeighthvNV(memAddress(weight)); + } + + // --- [ glVertexAttrib1hNV ] --- + + public static native void glVertexAttrib1hNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV") short x); + + // --- [ glVertexAttrib1hvNV ] --- + + public static native void nglVertexAttrib1hvNV(int index, long v); + + public static void glVertexAttrib1hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttrib1hvNV(index, memAddress(v)); + } + + // --- [ glVertexAttrib2hNV ] --- + + public static native void glVertexAttrib2hNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV") short x, @NativeType("GLhalfNV") short y); + + // --- [ glVertexAttrib2hvNV ] --- + + public static native void nglVertexAttrib2hvNV(int index, long v); + + public static void glVertexAttrib2hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttrib2hvNV(index, memAddress(v)); + } + + // --- [ glVertexAttrib3hNV ] --- + + public static native void glVertexAttrib3hNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV") short x, @NativeType("GLhalfNV") short y, @NativeType("GLhalfNV") short z); + + // --- [ glVertexAttrib3hvNV ] --- + + public static native void nglVertexAttrib3hvNV(int index, long v); + + public static void glVertexAttrib3hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttrib3hvNV(index, memAddress(v)); + } + + // --- [ glVertexAttrib4hNV ] --- + + public static native void glVertexAttrib4hNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV") short x, @NativeType("GLhalfNV") short y, @NativeType("GLhalfNV") short z, @NativeType("GLhalfNV") short w); + + // --- [ glVertexAttrib4hvNV ] --- + + public static native void nglVertexAttrib4hvNV(int index, long v); + + public static void glVertexAttrib4hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") ShortBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttrib4hvNV(index, memAddress(v)); + } + + // --- [ glVertexAttribs1hvNV ] --- + + public static native void nglVertexAttribs1hvNV(int index, int n, long v); + + public static void glVertexAttribs1hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") ShortBuffer v) { + nglVertexAttribs1hvNV(index, v.remaining(), memAddress(v)); + } + + // --- [ glVertexAttribs2hvNV ] --- + + public static native void nglVertexAttribs2hvNV(int index, int n, long v); + + public static void glVertexAttribs2hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") ShortBuffer v) { + nglVertexAttribs2hvNV(index, v.remaining() >> 1, memAddress(v)); + } + + // --- [ glVertexAttribs3hvNV ] --- + + public static native void nglVertexAttribs3hvNV(int index, int n, long v); + + public static void glVertexAttribs3hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") ShortBuffer v) { + nglVertexAttribs3hvNV(index, v.remaining() / 3, memAddress(v)); + } + + // --- [ glVertexAttribs4hvNV ] --- + + public static native void nglVertexAttribs4hvNV(int index, int n, long v); + + public static void glVertexAttribs4hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") ShortBuffer v) { + nglVertexAttribs4hvNV(index, v.remaining() >> 2, memAddress(v)); + } + + /** Array version of: {@link #glVertex2hvNV Vertex2hvNV} */ + public static void glVertex2hvNV(@NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glVertex2hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glVertex3hvNV Vertex3hvNV} */ + public static void glVertex3hvNV(@NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glVertex3hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glVertex4hvNV Vertex4hvNV} */ + public static void glVertex4hvNV(@NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glVertex4hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glNormal3hvNV Normal3hvNV} */ + public static void glNormal3hvNV(@NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glNormal3hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glColor3hvNV Color3hvNV} */ + public static void glColor3hvNV(@NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glColor3hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glColor4hvNV Color4hvNV} */ + public static void glColor4hvNV(@NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glColor4hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glTexCoord1hvNV TexCoord1hvNV} */ + public static void glTexCoord1hvNV(@NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glTexCoord1hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glTexCoord2hvNV TexCoord2hvNV} */ + public static void glTexCoord2hvNV(@NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glTexCoord2hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glTexCoord3hvNV TexCoord3hvNV} */ + public static void glTexCoord3hvNV(@NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glTexCoord3hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glTexCoord4hvNV TexCoord4hvNV} */ + public static void glTexCoord4hvNV(@NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glTexCoord4hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord1hvNV MultiTexCoord1hvNV} */ + public static void glMultiTexCoord1hvNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord1hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(target, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord2hvNV MultiTexCoord2hvNV} */ + public static void glMultiTexCoord2hvNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord2hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(target, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord3hvNV MultiTexCoord3hvNV} */ + public static void glMultiTexCoord3hvNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord3hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(target, v, __functionAddress); + } + + /** Array version of: {@link #glMultiTexCoord4hvNV MultiTexCoord4hvNV} */ + public static void glMultiTexCoord4hvNV(@NativeType("GLenum") int target, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glMultiTexCoord4hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(target, v, __functionAddress); + } + + /** Array version of: {@link #glFogCoordhvNV FogCoordhvNV} */ + public static void glFogCoordhvNV(@NativeType("GLhalfNV const *") short[] fog) { + long __functionAddress = GL.getICD().glFogCoordhvNV; + if (CHECKS) { + check(__functionAddress); + check(fog, 1); + } + callPV(fog, __functionAddress); + } + + /** Array version of: {@link #glSecondaryColor3hvNV SecondaryColor3hvNV} */ + public static void glSecondaryColor3hvNV(@NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glSecondaryColor3hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(v, __functionAddress); + } + + /** Array version of: {@link #glVertexWeighthvNV VertexWeighthvNV} */ + public static void glVertexWeighthvNV(@NativeType("GLhalfNV const *") short[] weight) { + long __functionAddress = GL.getICD().glVertexWeighthvNV; + if (CHECKS) { + check(__functionAddress); + check(weight, 1); + } + callPV(weight, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib1hvNV VertexAttrib1hvNV} */ + public static void glVertexAttrib1hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib1hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib2hvNV VertexAttrib2hvNV} */ + public static void glVertexAttrib2hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib2hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib3hvNV VertexAttrib3hvNV} */ + public static void glVertexAttrib3hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib3hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttrib4hvNV VertexAttrib4hvNV} */ + public static void glVertexAttrib4hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttrib4hvNV; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribs1hvNV VertexAttribs1hvNV} */ + public static void glVertexAttribs1hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttribs1hvNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(index, v.length, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribs2hvNV VertexAttribs2hvNV} */ + public static void glVertexAttribs2hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttribs2hvNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(index, v.length >> 1, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribs3hvNV VertexAttribs3hvNV} */ + public static void glVertexAttribs3hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttribs3hvNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(index, v.length / 3, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribs4hvNV VertexAttribs4hvNV} */ + public static void glVertexAttribs4hvNV(@NativeType("GLuint") int index, @NativeType("GLhalfNV const *") short[] v) { + long __functionAddress = GL.getICD().glVertexAttribs4hvNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(index, v.length >> 2, v, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVInternalformatSampleQuery.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVInternalformatSampleQuery.java new file mode 100644 index 000000000..ea7230d14 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVInternalformatSampleQuery.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_internalformat_sample_query extension. + * + *

    Some OpenGL implementations support modes of multisampling which have + * properties which are non-obvious to applications and/or which may not be + * standards conformant. The idea of non-conformant AA modes is not new, + * and is exposed in both GLX and EGL with config caveats and the + * GLX_NON_CONFORMANT_CONFIG for GLX and EGL_NON_CONFORMANT_CONFIG for EGL, + * or by querying the EGL_CONFORMANT attribute in newer versions of EGL.

    + * + *

    Both of these mechanisms operate on a per-config basis, which works as + * intended for window-based configs. However, with the advent of + * application-created FBOs, it is now possible to do all the multisample + * operations in an application-created FBO and never use a multisample + * window.

    + * + *

    This extension further extends the internalformat query mechanism + * (first introduced by ARB_internalformat_query and extended in + * ARB_internalformat_query2) and introduces a mechanism for a + * implementation to report properties of formats that may also be + * dependent on the number of samples. This includes information + * such as whether the combination of format and samples should be + * considered conformant. This enables an implementation to report + * caveats which might apply to both window and FBO-based rendering + * configurations.

    + * + *

    Requires {@link GL42 OpenGL 4.2} or {@link ARBInternalformatQuery ARB_internalformat_query}.

    + */ +public class NVInternalformatSampleQuery { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetInternalformatSampleivNV */ + public static final int + GL_MULTISAMPLES_NV = 0x9371, + GL_SUPERSAMPLE_SCALE_X_NV = 0x9372, + GL_SUPERSAMPLE_SCALE_Y_NV = 0x9373, + GL_CONFORMANT_NV = 0x9374; + + protected NVInternalformatSampleQuery() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetInternalformatSampleivNV ] --- + + public static native void nglGetInternalformatSampleivNV(int target, int internalformat, int samples, int pname, int bufSize, long params); + + public static void glGetInternalformatSampleivNV(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int samples, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + nglGetInternalformatSampleivNV(target, internalformat, samples, pname, params.remaining(), memAddress(params)); + } + + /** Array version of: {@link #glGetInternalformatSampleivNV GetInternalformatSampleivNV} */ + public static void glGetInternalformatSampleivNV(@NativeType("GLenum") int target, @NativeType("GLenum") int internalformat, @NativeType("GLsizei") int samples, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetInternalformatSampleivNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, internalformat, samples, pname, params.length, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVLightMaxExponent.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVLightMaxExponent.java new file mode 100644 index 000000000..1996a224b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVLightMaxExponent.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_light_max_exponent extension. + * + *

    Default OpenGL does not permit a shininess or spot exponent over 128.0. This extension permits implementations to support and advertise a maximum + * shininess and spot exponent beyond 128.0.

    + */ +public final class NVLightMaxExponent { + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev */ + public static final int + GL_MAX_SHININESS_NV = 0x8504, + GL_MAX_SPOT_EXPONENT_NV = 0x8505; + + private NVLightMaxExponent() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMemoryAttachment.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMemoryAttachment.java new file mode 100644 index 000000000..6dec12ce1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMemoryAttachment.java @@ -0,0 +1,99 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_memory_attachment extension. + * + *

    This extension extends the memory objects introduced with {@link EXTMemoryObject EXT_memory_object} to allow existing textures and buffers to be migrated to an + * imported memory allocation. The primary use-case of this extension is plug-in development where resource management (creation, deletion, sizing etc.) + * is handled by inaccessible host application code.

    + * + *

    Requires {@link EXTMemoryObject EXT_memory_object} and {@link ARBTextureStorage ARB_texture_storage} or a version of OpenGL that incorporates it.

    + */ +public class NVMemoryAttachment { + + static { GL.initialize(); } + + /** + * Accepted by the {@code pname} parameter of TexParameter{ifx}{v}, TexParameterI{i ui}v, TextureParameter{if}{v}, TextureParameterI{i ui}v, + * GetTexParameter{if}v, GetTexParameterI{i ui}v, GetTextureParameter{if}v, GetTextureParameterI{i ui}v, GetBufferParameter{i|i64}v and + * GetNamedBufferParameter{i|i64}v. + */ + public static final int + GL_ATTACHED_MEMORY_OBJECT_NV = 0x95A4, + GL_ATTACHED_MEMORY_OFFSET_NV = 0x95A5, + GL_MEMORY_ATTACHABLE_ALIGNMENT_NV = 0x95A6, + GL_MEMORY_ATTACHABLE_SIZE_NV = 0x95A7, + GL_MEMORY_ATTACHABLE_NV = 0x95A8; + + /** + * Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetFloatv, GetIntegerv, GetInteger64v, GetUnsignedBytevEXT, + * GetMemoryObjectParameterivEXT, and the {@code target} parameter of GetBooleani_v, GetIntegeri_v,GetFloati_v, GetDoublei_v, GetInteger64i_v and + * GetUnsignedBytei_vEXT. + */ + public static final int GL_DETACHED_MEMORY_INCARNATION_NV = 0x95A9; + + /** Accepted by the {@code pname} parameter of GetMemoryObjectParameterivEXT, GetMemoryObjectDetachedResourcesuivNV and ResetMemoryObjectParameterNV. */ + public static final int + GL_DETACHED_TEXTURES_NV = 0x95AA, + GL_DETACHED_BUFFERS_NV = 0x95AB; + + /** Accepted by the {@code pname} parameter of MemoryObjectParameterivEXT, GetMemoryObjectParameterivEXT. */ + public static final int + GL_MAX_DETACHED_TEXTURES_NV = 0x95AC, + GL_MAX_DETACHED_BUFFERS_NV = 0x95AD; + + protected NVMemoryAttachment() { + throw new UnsupportedOperationException(); + } + + // --- [ glGetMemoryObjectDetachedResourcesuivNV ] --- + + public static native void nglGetMemoryObjectDetachedResourcesuivNV(int memory, int pname, int first, int count, long params); + + public static void glGetMemoryObjectDetachedResourcesuivNV(@NativeType("GLuint") int memory, @NativeType("GLenum") int pname, @NativeType("GLint") int first, @NativeType("GLuint *") IntBuffer params) { + nglGetMemoryObjectDetachedResourcesuivNV(memory, pname, first, params.remaining(), memAddress(params)); + } + + // --- [ glResetMemoryObjectParameterNV ] --- + + public static native void glResetMemoryObjectParameterNV(@NativeType("GLuint") int memory, @NativeType("GLenum") int pname); + + // --- [ glTexAttachMemoryNV ] --- + + public static native void glTexAttachMemoryNV(@NativeType("GLenum") int target, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glBufferAttachMemoryNV ] --- + + public static native void glBufferAttachMemoryNV(@NativeType("GLenum") int target, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glTextureAttachMemoryNV ] --- + + public static native void glTextureAttachMemoryNV(@NativeType("GLuint") int texture, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + // --- [ glNamedBufferAttachMemoryNV ] --- + + public static native void glNamedBufferAttachMemoryNV(@NativeType("GLuint") int buffer, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset); + + /** Array version of: {@link #glGetMemoryObjectDetachedResourcesuivNV GetMemoryObjectDetachedResourcesuivNV} */ + public static void glGetMemoryObjectDetachedResourcesuivNV(@NativeType("GLuint") int memory, @NativeType("GLenum") int pname, @NativeType("GLint") int first, @NativeType("GLuint *") int[] params) { + long __functionAddress = GL.getICD().glGetMemoryObjectDetachedResourcesuivNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(memory, pname, first, params.length, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMemoryObjectSparse.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMemoryObjectSparse.java new file mode 100644 index 000000000..34ec74175 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMemoryObjectSparse.java @@ -0,0 +1,41 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_memory_object_sparse extension. + * + *

    This extension adds sparse support to {@code EXT_memory_object} extension.

    + * + *

    Requires {@link EXTMemoryObject EXT_memory_object}, {@link ARBSparseTexture ARB_sparse_texture} and/or {@link ARBSparseBuffer ARB_sparse_buffer} or a version of OpenGL that incorporates it.

    + */ +public class NVMemoryObjectSparse { + + static { GL.initialize(); } + + protected NVMemoryObjectSparse() { + throw new UnsupportedOperationException(); + } + + // --- [ glBufferPageCommitmentMemNV ] --- + + public static native void glBufferPageCommitmentMemNV(@NativeType("GLenum") int target, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLuint") int memory, @NativeType("GLuint64") long memOffset, @NativeType("GLboolean") boolean commit); + + // --- [ glNamedBufferPageCommitmentMemNV ] --- + + public static native void glNamedBufferPageCommitmentMemNV(@NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size, @NativeType("GLuint") int memory, @NativeType("GLuint64") long memOffset, @NativeType("GLboolean") boolean commit); + + // --- [ glTexPageCommitmentMemNV ] --- + + public static native void glTexPageCommitmentMemNV(@NativeType("GLenum") int target, @NativeType("GLint") int layer, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset, @NativeType("GLboolean") boolean commit); + + // --- [ glTexturePageCommitmentMemNV ] --- + + public static native void glTexturePageCommitmentMemNV(@NativeType("GLuint") int texture, @NativeType("GLint") int layer, @NativeType("GLint") int level, @NativeType("GLint") int xoffset, @NativeType("GLint") int yoffset, @NativeType("GLint") int zoffset, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLuint") int memory, @NativeType("GLuint64") long offset, @NativeType("GLboolean") boolean commit); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMeshShader.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMeshShader.java new file mode 100644 index 000000000..a4a12fe9c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMeshShader.java @@ -0,0 +1,122 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_mesh_shader extension. + * + *

    This extension provides a new mechanism allowing applications to use two new programmable shader types -- the task and mesh shader -- to generate + * collections of geometric primitives to be processed by fixed-function primitive assembly and rasterization logic. When the task and mesh shaders are + * drawn, they replace the standard programmable vertex processing pipeline, including vertex array attribute fetching, vertex shader processing, + * tessellation, and the geometry shader processing.

    + * + *

    Requires {@link GL45 OpenGL 4.5}.

    + */ +public class NVMeshShader { + + static { GL.initialize(); } + + /** Accepted by the {@code type} parameter of {@link GL20C#glCreateShader CreateShader} and returned by the {@code params} parameter of {@link GL20C#glGetShaderiv GetShaderiv}. */ + public static final int + GL_MESH_SHADER_NV = 0x9559, + GL_TASK_SHADER_NV = 0x955A; + + /** Accepted by the {@code pname} parameter of {@link GL11C#glGetIntegerv GetIntegerv}, {@link GL11C#glGetBooleanv GetBooleanv}, {@link GL11C#glGetFloatv GetFloatv}, {@link GL11C#glGetDoublev GetDoublev} and {@link GL32C#glGetInteger64v GetInteger64v}. */ + public static final int + GL_MAX_MESH_UNIFORM_BLOCKS_NV = 0x8E60, + GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV = 0x8E61, + GL_MAX_MESH_IMAGE_UNIFORMS_NV = 0x8E62, + GL_MAX_MESH_UNIFORM_COMPONENTS_NV = 0x8E63, + GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV = 0x8E64, + GL_MAX_MESH_ATOMIC_COUNTERS_NV = 0x8E65, + GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV = 0x8E66, + GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV = 0x8E67, + GL_MAX_TASK_UNIFORM_BLOCKS_NV = 0x8E68, + GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV = 0x8E69, + GL_MAX_TASK_IMAGE_UNIFORMS_NV = 0x8E6A, + GL_MAX_TASK_UNIFORM_COMPONENTS_NV = 0x8E6B, + GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV = 0x8E6C, + GL_MAX_TASK_ATOMIC_COUNTERS_NV = 0x8E6D, + GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV = 0x8E6E, + GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV = 0x8E6F, + GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV = 0x95A2, + GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV = 0x95A3, + GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV = 0x9536, + GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV = 0x9537, + GL_MAX_MESH_OUTPUT_VERTICES_NV = 0x9538, + GL_MAX_MESH_OUTPUT_PRIMITIVES_NV = 0x9539, + GL_MAX_TASK_OUTPUT_COUNT_NV = 0x953A, + GL_MAX_DRAW_MESH_TASKS_COUNT_NV = 0x953D, + GL_MAX_MESH_VIEWS_NV = 0x9557, + GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV = 0x92DF, + GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV = 0x9543; + + /** Accepted by the {@code pname} parameter of {@link GL30C#glGetIntegeri_v GetIntegeri_v}, {@link GL30C#glGetBooleani_v GetBooleani_v}, {@link GL41C#glGetFloati_v GetFloati_v}, {@link GL41C#glGetDoublei_v GetDoublei_v} and {@link GL32C#glGetInteger64i_v GetInteger64i_v}. */ + public static final int + GL_MAX_MESH_WORK_GROUP_SIZE_NV = 0x953B, + GL_MAX_TASK_WORK_GROUP_SIZE_NV = 0x953C; + + /** Accepted by the {@code pname} parameter of {@link GL20C#glGetProgramiv GetProgramiv}. */ + public static final int + GL_MESH_WORK_GROUP_SIZE_NV = 0x953E, + GL_TASK_WORK_GROUP_SIZE_NV = 0x953F, + GL_MESH_VERTICES_OUT_NV = 0x9579, + GL_MESH_PRIMITIVES_OUT_NV = 0x957A, + GL_MESH_OUTPUT_TYPE_NV = 0x957B; + + /** Accepted by the {@code pname} parameter of {@link GL31C#glGetActiveUniformBlockiv GetActiveUniformBlockiv}. */ + public static final int + GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV = 0x959C, + GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV = 0x959D; + + /** Accepted by the {@code pname} parameter of {@link GL42C#glGetActiveAtomicCounterBufferiv GetActiveAtomicCounterBufferiv}. */ + public static final int + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV = 0x959E, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV = 0x959F; + + /** Accepted in the {@code props} array of {@link GL43C#glGetProgramResourceiv GetProgramResourceiv}. */ + public static final int + GL_REFERENCED_BY_MESH_SHADER_NV = 0x95A0, + GL_REFERENCED_BY_TASK_SHADER_NV = 0x95A1; + + /** + * Accepted by the {@code programInterface} parameter of {@link GL43C#glGetProgramInterfaceiv GetProgramInterfaceiv}, {@link GL43C#glGetProgramResourceIndex GetProgramResourceIndex}, {@link GL43C#glGetProgramResourceName GetProgramResourceName}, + * {@link GL43C#glGetProgramResourceiv GetProgramResourceiv}, {@link GL43C#glGetProgramResourceLocation GetProgramResourceLocation}, and {@link GL43C#glGetProgramResourceLocationIndex GetProgramResourceLocationIndex}. + */ + public static final int + GL_MESH_SUBROUTINE_NV = 0x957C, + GL_TASK_SUBROUTINE_NV = 0x957D, + GL_MESH_SUBROUTINE_UNIFORM_NV = 0x957E, + GL_TASK_SUBROUTINE_UNIFORM_NV = 0x957F; + + /** Accepted by the {@code stages} parameter of {@link GL41C#glUseProgramStages UseProgramStages}. */ + public static final int + GL_MESH_SHADER_BIT_NV = 0x40, + GL_TASK_SHADER_BIT_NV = 0x80; + + protected NVMeshShader() { + throw new UnsupportedOperationException(); + } + + // --- [ glDrawMeshTasksNV ] --- + + public static native void glDrawMeshTasksNV(@NativeType("GLuint") int first, @NativeType("GLuint") int count); + + // --- [ glDrawMeshTasksIndirectNV ] --- + + public static native void glDrawMeshTasksIndirectNV(@NativeType("GLintptr") long indirect); + + // --- [ glMultiDrawMeshTasksIndirectNV ] --- + + public static native void glMultiDrawMeshTasksIndirectNV(@NativeType("GLintptr") long indirect, @NativeType("GLsizei") int drawcount, @NativeType("GLsizei") int stride); + + // --- [ glMultiDrawMeshTasksIndirectCountNV ] --- + + public static native void glMultiDrawMeshTasksIndirectCountNV(@NativeType("GLintptr") long indirect, @NativeType("GLintptr") long drawcount, @NativeType("GLsizei") int maxdrawcount, @NativeType("GLsizei") int stride); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMultisampleCoverage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMultisampleCoverage.java new file mode 100644 index 000000000..1be1cc19a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMultisampleCoverage.java @@ -0,0 +1,33 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_multisample_coverage extension. + * + *

    The ARB_multisample extension provides a mechanism for antialiasing primitives. This mechanism allows an application to request an additional buffer, + * the multisample buffer, that is added to the framebuffer. An application can request the number of samples per fragment that are stored in the + * multisample buffer. Rendering proceeds by writing color, depth, and stencil values for each sample to the multisample buffer. The results are + * automatically resolved to a single displayable color each time a pixel is updated.

    + * + *

    Coverage Sample Anti-Aliasing (CSAA) is an extension to multisample antialiasing. The technique separates "samples" into two types of samples. "Color + * samples" are samples with color, depth, and stencil information stored in the multisample buffer. "Coverage samples" include both color samples and + * additional samples that only provide pixel coverage information.

    + * + *

    This extension follows the example of the NV_framebuffer_multisample_coverage extension, which adds CSAA support for framebuffer objects. The base + * description of multisample rendering is written in terms of coverage samples and color samples. The windows system notion of "samples" (SAMPLES_ARB) is + * layered on top of coverage and color samples.

    + * + *

    Requires {@link ARBMultisample ARB_multisample}.

    + */ +public final class NVMultisampleCoverage { + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int GL_COLOR_SAMPLES_NV = 0x8E20; + + private NVMultisampleCoverage() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMultisampleFilterHint.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMultisampleFilterHint.java new file mode 100644 index 000000000..ca703581e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVMultisampleFilterHint.java @@ -0,0 +1,27 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_multisample_filter_hint extension. + * + *

    OpenGL multisampling typically assumes that the samples of a given pixel are weighted uniformly and averaged to compute the pixel's resolved color. + * This extension provides a hint that permits implementations to provide an alternative method of resolving the color of multisampled pixels.

    + * + *

    As an example of such an alternative method, NVIDIA's GeForce3 GPU provides a technique known as Quincunx filtering. This technique is used in + * two-sample multisampling, but it blends the pixel's two samples and three additional samples from adjacent pixels. The sample pattern is analogous to + * the 5 pattern on a die. The quality of this technique is widely regarded as comparable to 4 sample multisampling.

    + * + *

    Requires {@link ARBMultisample ARB_multisample}.

    + */ +public final class NVMultisampleFilterHint { + + /** Accepted by the {@code target} parameter of Hint and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_MULTISAMPLE_FILTER_HINT_NV = 0x8534; + + private NVMultisampleFilterHint() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPackedDepthStencil.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPackedDepthStencil.java new file mode 100644 index 000000000..ab3e4ef45 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPackedDepthStencil.java @@ -0,0 +1,30 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * This extension provides a new data format, {@link #GL_DEPTH_STENCIL_NV DEPTH_STENCIL_NV}, that can be used with the glDrawPixels, glReadPixels, and glCopyPixels commands, as well + * as a packed data type, {@link #GL_UNSIGNED_INT_24_8_NV UNSIGNED_INT_24_8_NV}, that is meant to be used with GL_DEPTH_STENCIL_NV. No other formats are supported with + * GL_DEPTH_STENCIL_NV. If SGIX_depth_texture is supported, GL_DEPTH_STENCIL_NV/GL_UNSIGNED_INT_24_8_NV data can also be used for + * textures; this provides a more efficient way to supply data for a 24-bit depth texture. + */ +public final class NVPackedDepthStencil { + + /** + * Accepted by the {@code format} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, + * and GetTexImage, and by the {@code type} parameter of CopyPixels. + */ + public static final int GL_DEPTH_STENCIL_NV = 0x84F9; + + /** + * Accepted by the {@code type} parameter of DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage. + */ + public static final int GL_UNSIGNED_INT_24_8_NV = 0x84FA; + + private NVPackedDepthStencil() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPathRendering.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPathRendering.java new file mode 100644 index 000000000..c11ee9752 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPathRendering.java @@ -0,0 +1,1713 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.opengl.GL11.*; + +/** + * Native bindings to the NV_path_rendering extension. + * + *

    Conventional OpenGL supports rendering images (pixel rectangles and bitmaps) and simple geometric primitives (points, lines, polygons).

    + * + *

    This extension adds a new rendering paradigm, known as path rendering, for rendering filled and stroked paths. Path rendering is not novel but rather a + * standard part of most resolution-independent 2D rendering systems such as Flash, PDF, Silverlight, SVG, Java 2D, Office drawings, TrueType fonts, + * PostScript and its fonts, Quartz 2D, XML Paper Specification (XPS), and OpenVG. What is novel is the ability to mix path rendering with arbitrary + * OpenGL 3D rendering and imaging.

    + * + *

    With this extension, path rendering becomes a first-class rendering mode within the OpenGL graphics system that can be arbitrarily mixed with existing + * OpenGL rendering and can take advantage of OpenGL's existing mechanisms for texturing, programmability, and per-fragment operations.

    + * + *

    Unlike geometric primitive rendering, paths are specified on a 2D (non-projective) plane rather than in 3D (projective) space. Even though the path is + * defined in a 2D plane, every path can be transformed into 3D clip space allowing for 3D view frustum & user-defined clipping, depth offset, and + * depth testing in the same manner as geometric primitive rendering.

    + * + *

    Both geometric primitive rendering and path rendering support rasterization of edges defined by line segments; however, path rendering also allows path + * segments to be specified by Bezier (cubic or quadratic) curves or partial elliptical arcs. This allows path rendering to define truly curved primitive + * boundaries unlike the straight edges of line and polygon primitives. Whereas geometric primitive rendering requires convex polygons for well-defined + * rendering results, path rendering allows (and encourages!) concave and curved outlines to be specified. These paths are even allowed to self-intersect.

    + * + *

    When filling closed paths, the winding of paths (counterclockwise or clockwise) determines whether pixels are inside or outside of the path.

    + * + *

    Paths can also be stroked whereby, conceptually, a fixed-width "brush" is pulled along the path such that the brush remains orthogonal to the gradient + * of each path segment. Samples within the sweep of this brush are considered inside the stroke of the path.

    + * + *

    This extension supports path rendering through a sequence of three operations:

    + * + *
      + *
    1. Path specification is the process of creating and updating a path object consisting of a set of path commands and a corresponding set of 2D + * vertices. + * + *

      Path commands can be specified explicitly from path command and coordinate data, parsed from a string based on standard grammars for representing + * paths, or specified by a particular glyph of standard font representations. Also new paths can be specified by weighting one or more existing paths + * so long as all the weighted paths have consistent command sequences.

      + * + *

      Each path object contains zero or more subpaths specified by a sequence of line segments, partial elliptical arcs, and (cubic or quadratic) Bezier + * curve segments. Each path may contain multiple subpaths that can be closed (forming a contour) or open.

    2. + *
    3. Path stenciling is the process of updating the stencil buffer based on a path's coverage transformed into window space. + * + *

      Path stenciling can determine either the filled or stroked coverage of a path.

      + * + *

      The details of path stenciling are explained within the core of the specification.

      + * + *

      Stenciling a stroked path supports all the standard embellishments for path stroking such as end caps, join styles, miter limits, dashing, and dash + * caps. These stroking properties specified are parameters of path objects.

    4. + *
    5. Path covering is the process of emitting simple (convex & planar) geometry that (conservatively) "covers" the path's sample coverage in the + * stencil buffer. During path covering, stencil testing can be configured to discard fragments not within the actual coverage of the path as + * determined by prior path stenciling. + * + *

      Path covering can cover either the filled or stroked coverage of a path.

      + * + *

      The details of path covering are explained within the core of the specification.

    6. + *
    + * + *

    To render a path object into the color buffer, an application specifies a path object and then uses a two-step rendering process. First, the path + * object is stenciled whereby the path object's stroked or filled coverage is rasterized into the stencil buffer. Second, the path object is covered + * whereby conservative bounding geometry for the path is transformed and rasterized with stencil testing configured to test against the coverage + * information written to the stencil buffer in the first step so that only fragments covered by the path are written during this second step. Also during + * this second step written pixels typically have their stencil value reset (so there's no need for clearing the stencil buffer between rendering each + * path).

    + */ +public class NVPathRendering { + + static { GL.initialize(); } + + /** Accepted in elements of the {@code commands} array parameter of PathCommandsNV and PathSubCommandsNV. */ + public static final byte + GL_CLOSE_PATH_NV = 0x0, + GL_MOVE_TO_NV = 0x2, + GL_RELATIVE_MOVE_TO_NV = 0x3, + GL_LINE_TO_NV = 0x4, + GL_RELATIVE_LINE_TO_NV = 0x5, + GL_HORIZONTAL_LINE_TO_NV = 0x6, + GL_RELATIVE_HORIZONTAL_LINE_TO_NV = 0x7, + GL_VERTICAL_LINE_TO_NV = 0x8, + GL_RELATIVE_VERTICAL_LINE_TO_NV = 0x9, + GL_QUADRATIC_CURVE_TO_NV = 0xA, + GL_RELATIVE_QUADRATIC_CURVE_TO_NV = 0xB, + GL_CUBIC_CURVE_TO_NV = 0xC, + GL_RELATIVE_CUBIC_CURVE_TO_NV = 0xD, + GL_SMOOTH_QUADRATIC_CURVE_TO_NV = 0xE, + GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV = 0xF, + GL_SMOOTH_CUBIC_CURVE_TO_NV = 0x10, + GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV = 0x11, + GL_SMALL_CCW_ARC_TO_NV = 0x12, + GL_RELATIVE_SMALL_CCW_ARC_TO_NV = 0x13, + GL_SMALL_CW_ARC_TO_NV = 0x14, + GL_RELATIVE_SMALL_CW_ARC_TO_NV = 0x15, + GL_LARGE_CCW_ARC_TO_NV = 0x16, + GL_RELATIVE_LARGE_CCW_ARC_TO_NV = 0x17, + GL_LARGE_CW_ARC_TO_NV = 0x18, + GL_RELATIVE_LARGE_CW_ARC_TO_NV = 0x19, + GL_CONIC_CURVE_TO_NV = 0x1A, + GL_RELATIVE_CONIC_CURVE_TO_NV = 0x1B, + GL_ROUNDED_RECT_NV = (byte)0xE8, + GL_RELATIVE_ROUNDED_RECT_NV = (byte)0xE9, + GL_ROUNDED_RECT2_NV = (byte)0xEA, + GL_RELATIVE_ROUNDED_RECT2_NV = (byte)0xEB, + GL_ROUNDED_RECT4_NV = (byte)0xEC, + GL_RELATIVE_ROUNDED_RECT4_NV = (byte)0xED, + GL_ROUNDED_RECT8_NV = (byte)0xEE, + GL_RELATIVE_ROUNDED_RECT8_NV = (byte)0xEF, + GL_RESTART_PATH_NV = (byte)0xF0, + GL_DUP_FIRST_CUBIC_CURVE_TO_NV = (byte)0xF2, + GL_DUP_LAST_CUBIC_CURVE_TO_NV = (byte)0xF4, + GL_RECT_NV = (byte)0xF6, + GL_RELATIVE_RECT_NV = (byte)0xF7, + GL_CIRCULAR_CCW_ARC_TO_NV = (byte)0xF8, + GL_CIRCULAR_CW_ARC_TO_NV = (byte)0xFA, + GL_CIRCULAR_TANGENT_ARC_TO_NV = (byte)0xFC, + GL_ARC_TO_NV = (byte)0xFE, + GL_RELATIVE_ARC_TO_NV = (byte)0xFF; + + /** Accepted by the {@code format} parameter of PathStringNV. */ + public static final int + GL_PATH_FORMAT_SVG_NV = 0x9070, + GL_PATH_FORMAT_PS_NV = 0x9071; + + /** Accepted by the {@code fontTarget} parameter of PathGlyphsNV, PathGlyphRangeNV, and PathGlyphIndexRangeNV. */ + public static final int + GL_STANDARD_FONT_NAME_NV = 0x9072, + GL_SYSTEM_FONT_NAME_NV = 0x9073, + GL_FILE_NAME_NV = 0x9074; + + /** Accepted by the {@code fontTarget} parameter of PathMemoryGlyphIndexArrayNV. */ + public static final int GL_STANDARD_FONT_FORMAT_NV = 0x936C; + + /** Accepted by the {@code handleMissingGlyph} parameter of PathGlyphsNV and PathGlyphRangeNV. */ + public static final int + GL_SKIP_MISSING_GLYPH_NV = 0x90A9, + GL_USE_MISSING_GLYPH_NV = 0x90AA; + + /** Returned by PathGlyphIndexRangeNV. */ + public static final int + GL_FONT_GLYPHS_AVAILABLE_NV = 0x9368, + GL_FONT_TARGET_UNAVAILABLE_NV = 0x9369, + GL_FONT_UNAVAILABLE_NV = 0x936A, + GL_FONT_UNINTELLIGIBLE_NV = 0x936B; + + /** + * Accepted by the {@code pname} parameter of PathParameterfNV, PathParameterfvNV, GetPathParameterfvNV, PathParameteriNV, PathParameterivNV, and + * GetPathParameterivNV. + */ + public static final int + GL_PATH_STROKE_WIDTH_NV = 0x9075, + GL_PATH_INITIAL_END_CAP_NV = 0x9077, + GL_PATH_TERMINAL_END_CAP_NV = 0x9078, + GL_PATH_JOIN_STYLE_NV = 0x9079, + GL_PATH_MITER_LIMIT_NV = 0x907A, + GL_PATH_INITIAL_DASH_CAP_NV = 0x907C, + GL_PATH_TERMINAL_DASH_CAP_NV = 0x907D, + GL_PATH_DASH_OFFSET_NV = 0x907E, + GL_PATH_CLIENT_LENGTH_NV = 0x907F, + GL_PATH_DASH_OFFSET_RESET_NV = 0x90B4, + GL_PATH_FILL_MODE_NV = 0x9080, + GL_PATH_FILL_MASK_NV = 0x9081, + GL_PATH_FILL_COVER_MODE_NV = 0x9082, + GL_PATH_STROKE_COVER_MODE_NV = 0x9083, + GL_PATH_STROKE_MASK_NV = 0x9084, + GL_PATH_STROKE_BOUND_NV = 0x9086; + + /** Accepted by the {@code pname} parameter of PathParameterfNV and PathParameterfvNV. */ + public static final int + GL_PATH_END_CAPS_NV = 0x9076, + GL_PATH_DASH_CAPS_NV = 0x907B; + + /** Accepted by the {@code fillMode} parameter of StencilFillPathNV and StencilFillPathInstancedNV. */ + public static final int + GL_COUNT_UP_NV = 0x9088, + GL_COUNT_DOWN_NV = 0x9089; + + /** Accepted by the {@code color} parameter of PathColorGenNV, GetPathColorGenivNV, and GetPathColorGenfvNV. */ + public static final int + GL_PRIMARY_COLOR_NV = 0x852C, + GL_SECONDARY_COLOR_NV = 0x852D; + + /** Accepted by the {@code genMode} parameter of PathColorGenNV, PathTexGenNV, ProgramPathFragmentInputGenNV. */ + public static final int GL_PATH_OBJECT_BOUNDING_BOX_NV = 0x908A; + + /** Accepted by the {@code coverMode} parameter of CoverFillPathNV and CoverFillPathInstancedNV. */ + public static final int + GL_CONVEX_HULL_NV = 0x908B, + GL_BOUNDING_BOX_NV = 0x908D; + + /** + * Accepted by the {@code transformType} parameter of StencilFillPathInstancedNV, StencilStrokePathInstancedNV, CoverFillPathInstancedNV, and + * CoverStrokePathInstancedNV. + */ + public static final int + GL_TRANSLATE_X_NV = 0x908E, + GL_TRANSLATE_Y_NV = 0x908F, + GL_TRANSLATE_2D_NV = 0x9090, + GL_TRANSLATE_3D_NV = 0x9091, + GL_AFFINE_2D_NV = 0x9092, + GL_AFFINE_3D_NV = 0x9094, + GL_TRANSPOSE_AFFINE_2D_NV = 0x9096, + GL_TRANSPOSE_AFFINE_3D_NV = 0x9098; + + /** + * Accepted by the {@code type} or {@code pathNameType} parameter of StencilFillPathInstancedNV, StencilStrokePathInstancedNV, CoverFillPathInstancedNV, + * CoverStrokePathInstancedNV, GetPathMetricsNV, and GetPathSpacingNV. + */ + public static final int + GL_UTF8_NV = 0x909A, + GL_UTF16_NV = 0x909B; + + /** Accepted by the {@code coverMode} parameter of CoverFillPathInstancedNV. */ + public static final int GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV = 0x909C; + + /** Accepted by the {@code pname} parameter of GetPathParameterfvNV and GetPathParameterivNV. */ + public static final int + GL_PATH_COMMAND_COUNT_NV = 0x909D, + GL_PATH_COORD_COUNT_NV = 0x909E, + GL_PATH_DASH_ARRAY_COUNT_NV = 0x909F, + GL_PATH_COMPUTED_LENGTH_NV = 0x90A0, + GL_PATH_FILL_BOUNDING_BOX_NV = 0x90A1, + GL_PATH_STROKE_BOUNDING_BOX_NV = 0x90A2; + + /** + * Accepted by the {@code value} parameter of PathParameterfNV, PathParameterfvNV, PathParameteriNV, and PathParameterivNV when {@code pname} is one of + * PATH_END_CAPS_NV, PATH_INTIAL_END_CAP_NV, PATH_TERMINAL_END_CAP_NV, PATH_DASH_CAPS_NV, PATH_INITIAL_DASH_CAP_NV, and PATH_TERMINAL_DASH_CAP_NV. + */ + public static final int + GL_SQUARE_NV = 0x90A3, + GL_ROUND_NV = 0x90A4, + GL_TRIANGULAR_NV = 0x90A5; + + /** + * Accepted by the {@code value} parameter of PathParameterfNV, PathParameterfvNV, PathParameteriNV, and PathParameterivNV when {@code pname} is + * PATH_JOIN_STYLE_NV. + */ + public static final int + GL_BEVEL_NV = 0x90A6, + GL_MITER_REVERT_NV = 0x90A7, + GL_MITER_TRUNCATE_NV = 0x90A8; + + /** + * Accepted by the {@code value} parameter of PathParameterfNV, PathParameterfvNV, PathParameteriNV, and PathParameterivNV when {@code pname} is + * PATH_DASH_OFFSET_RESET_NV. + */ + public static final int + GL_MOVE_TO_RESETS_NV = 0x90B5, + GL_MOVE_TO_CONTINUES_NV = 0x90B6; + + /** Accepted by the {@code fontStyle} parameter of PathGlyphsNV, PathGlyphRangeNV, and PathGlyphIndexRangeNV. */ + public static final int + GL_BOLD_BIT_NV = 0x1, + GL_ITALIC_BIT_NV = 0x2; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_PATH_ERROR_POSITION_NV = 0x90AB, + GL_PATH_FOG_GEN_MODE_NV = 0x90AC, + GL_PATH_STENCIL_FUNC_NV = 0x90B7, + GL_PATH_STENCIL_REF_NV = 0x90B8, + GL_PATH_STENCIL_VALUE_MASK_NV = 0x90B9, + GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV = 0x90BD, + GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV = 0x90BE, + GL_PATH_COVER_DEPTH_FUNC_NV = 0x90BF; + + /** Accepted as a bit within the {@code metricQueryMask} parameter of GetPathMetricRangeNV or GetPathMetricsNV. */ + public static final int + GL_GLYPH_WIDTH_BIT_NV = 0x1, + GL_GLYPH_HEIGHT_BIT_NV = 0x2, + GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV = 0x4, + GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV = 0x8, + GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV = 0x10, + GL_GLYPH_VERTICAL_BEARING_X_BIT_NV = 0x20, + GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV = 0x40, + GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV = 0x80, + GL_GLYPH_HAS_KERNING_BIT_NV = 0x100, + GL_FONT_X_MIN_BOUNDS_BIT_NV = 0x10000, + GL_FONT_Y_MIN_BOUNDS_BIT_NV = 0x20000, + GL_FONT_X_MAX_BOUNDS_BIT_NV = 0x40000, + GL_FONT_Y_MAX_BOUNDS_BIT_NV = 0x80000, + GL_FONT_UNITS_PER_EM_BIT_NV = 0x100000, + GL_FONT_ASCENDER_BIT_NV = 0x200000, + GL_FONT_DESCENDER_BIT_NV = 0x400000, + GL_FONT_HEIGHT_BIT_NV = 0x800000, + GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV = 0x1000000, + GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV = 0x2000000, + GL_FONT_UNDERLINE_POSITION_BIT_NV = 0x4000000, + GL_FONT_UNDERLINE_THICKNESS_BIT_NV = 0x8000000, + GL_FONT_HAS_KERNING_BIT_NV = 0x10000000, + GL_FONT_NUM_GLYPH_INDICES_BIT_NV = 0x20000000; + + /** Accepted by the {@code pathListMode} parameter of GetPathSpacingNV. */ + public static final int + GL_ACCUM_ADJACENT_PAIRS_NV = 0x90AD, + GL_ADJACENT_PAIRS_NV = 0x90AE, + GL_FIRST_TO_REST_NV = 0x90AF; + + /** Accepted by the {@code pname} parameter of GetPathColorGenivNV, GetPathColorGenfvNV, GetPathTexGenivNV and GetPathTexGenfvNV. */ + public static final int + GL_PATH_GEN_MODE_NV = 0x90B0, + GL_PATH_GEN_COEFF_NV = 0x90B1; + + /** Accepted by the {@code pname} parameter of GetPathColorGenivNV and GetPathColorGenfvNV. */ + public static final int GL_PATH_GEN_COLOR_FORMAT_NV = 0x90B2; + + /** Accepted by the {@code pname} parameter of GetPathTexGenivNV and GetPathTexGenfvNV. */ + public static final int GL_PATH_GEN_COMPONENTS_NV = 0x90B3; + + /** + * Accepted by the {@code programInterface} parameter of GetProgramInterfaceiv, GetProgramResourceIndex, GetProgramResourceName, GetProgramResourceiv, + * GetProgramResourcefvNV, and GetProgramResourceLocation. + */ + public static final int GL_FRAGMENT_INPUT_NV = 0x936D; + + /** Token values for matrices. */ + public static final int + GL_PATH_PROJECTION_NV = 0x1701, + GL_PATH_MODELVIEW_NV = 0x1700, + GL_PATH_MODELVIEW_STACK_DEPTH_NV = 0xBA3, + GL_PATH_MODELVIEW_MATRIX_NV = 0xBA6, + GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV = 0xD36, + GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV = 0x84E3, + GL_PATH_PROJECTION_STACK_DEPTH_NV = 0xBA4, + GL_PATH_PROJECTION_MATRIX_NV = 0xBA7, + GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV = 0xD38, + GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV = 0x84E4; + + /** The following types are defined as alias to the GL tokens. */ + public static final int + GL_2_BYTES_NV = 0x1407, + GL_3_BYTES_NV = 0x1408, + GL_4_BYTES_NV = 0x1409, + GL_EYE_LINEAR_NV = 0x2400, + GL_OBJECT_LINEAR_NV = 0x2401, + GL_CONSTANT_NV = 0x8576; + + protected NVPathRendering() { + throw new UnsupportedOperationException(); + } + + // --- [ glPathCommandsNV ] --- + + /** Unsafe version of: {@link #glPathCommandsNV PathCommandsNV} */ + public static native void nglPathCommandsNV(int path, int numCommands, long commands, int numCoords, int coordType, long coords); + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathCommandsNV(@NativeType("GLuint") int path, @NativeType("GLubyte const *") ByteBuffer commands, @NativeType("GLenum") int coordType, @NativeType("void const *") ByteBuffer coords) { + nglPathCommandsNV(path, commands.remaining(), memAddress(commands), coords.remaining() >> GLChecks.typeToByteShift(coordType), coordType, memAddress(coords)); + } + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathCommandsNV(@NativeType("GLuint") int path, @NativeType("GLubyte const *") ByteBuffer commands, @NativeType("GLenum") int coordType, @NativeType("void const *") ShortBuffer coords) { + nglPathCommandsNV(path, commands.remaining(), memAddress(commands), (int)(((long)coords.remaining() << 1) >> GLChecks.typeToByteShift(coordType)), coordType, memAddress(coords)); + } + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathCommandsNV(@NativeType("GLuint") int path, @NativeType("GLubyte const *") ByteBuffer commands, @NativeType("GLenum") int coordType, @NativeType("void const *") FloatBuffer coords) { + nglPathCommandsNV(path, commands.remaining(), memAddress(commands), (int)(((long)coords.remaining() << 2) >> GLChecks.typeToByteShift(coordType)), coordType, memAddress(coords)); + } + + // --- [ glPathCoordsNV ] --- + + /** Unsafe version of: {@link #glPathCoordsNV PathCoordsNV} */ + public static native void nglPathCoordsNV(int path, int numCoords, int coordType, long coords); + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathCoordsNV(@NativeType("GLuint") int path, @NativeType("GLenum") int coordType, @NativeType("void const *") ByteBuffer coords) { + nglPathCoordsNV(path, coords.remaining() >> GLChecks.typeToByteShift(coordType), coordType, memAddress(coords)); + } + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathCoordsNV(@NativeType("GLuint") int path, @NativeType("GLenum") int coordType, @NativeType("void const *") ShortBuffer coords) { + nglPathCoordsNV(path, (int)(((long)coords.remaining() << 1) >> GLChecks.typeToByteShift(coordType)), coordType, memAddress(coords)); + } + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathCoordsNV(@NativeType("GLuint") int path, @NativeType("GLenum") int coordType, @NativeType("void const *") FloatBuffer coords) { + nglPathCoordsNV(path, (int)(((long)coords.remaining() << 2) >> GLChecks.typeToByteShift(coordType)), coordType, memAddress(coords)); + } + + // --- [ glPathSubCommandsNV ] --- + + /** Unsafe version of: {@link #glPathSubCommandsNV PathSubCommandsNV} */ + public static native void nglPathSubCommandsNV(int path, int commandStart, int commandsToDelete, int numCommands, long commands, int numCoords, int coordType, long coords); + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathSubCommandsNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int commandStart, @NativeType("GLsizei") int commandsToDelete, @NativeType("GLubyte const *") ByteBuffer commands, @NativeType("GLenum") int coordType, @NativeType("void const *") ByteBuffer coords) { + nglPathSubCommandsNV(path, commandStart, commandsToDelete, commands.remaining(), memAddress(commands), coords.remaining() >> GLChecks.typeToByteShift(coordType), coordType, memAddress(coords)); + } + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathSubCommandsNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int commandStart, @NativeType("GLsizei") int commandsToDelete, @NativeType("GLubyte const *") ByteBuffer commands, @NativeType("GLenum") int coordType, @NativeType("void const *") ShortBuffer coords) { + nglPathSubCommandsNV(path, commandStart, commandsToDelete, commands.remaining(), memAddress(commands), (int)(((long)coords.remaining() << 1) >> GLChecks.typeToByteShift(coordType)), coordType, memAddress(coords)); + } + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathSubCommandsNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int commandStart, @NativeType("GLsizei") int commandsToDelete, @NativeType("GLubyte const *") ByteBuffer commands, @NativeType("GLenum") int coordType, @NativeType("void const *") FloatBuffer coords) { + nglPathSubCommandsNV(path, commandStart, commandsToDelete, commands.remaining(), memAddress(commands), (int)(((long)coords.remaining() << 2) >> GLChecks.typeToByteShift(coordType)), coordType, memAddress(coords)); + } + + // --- [ glPathSubCoordsNV ] --- + + /** Unsafe version of: {@link #glPathSubCoordsNV PathSubCoordsNV} */ + public static native void nglPathSubCoordsNV(int path, int coordStart, int numCoords, int coordType, long coords); + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathSubCoordsNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int coordStart, @NativeType("GLenum") int coordType, @NativeType("void const *") ByteBuffer coords) { + nglPathSubCoordsNV(path, coordStart, coords.remaining() >> GLChecks.typeToByteShift(coordType), coordType, memAddress(coords)); + } + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathSubCoordsNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int coordStart, @NativeType("GLenum") int coordType, @NativeType("void const *") ShortBuffer coords) { + nglPathSubCoordsNV(path, coordStart, (int)(((long)coords.remaining() << 1) >> GLChecks.typeToByteShift(coordType)), coordType, memAddress(coords)); + } + + /** @param coordType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_FLOAT FLOAT}
    */ + public static void glPathSubCoordsNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int coordStart, @NativeType("GLenum") int coordType, @NativeType("void const *") FloatBuffer coords) { + nglPathSubCoordsNV(path, coordStart, (int)(((long)coords.remaining() << 2) >> GLChecks.typeToByteShift(coordType)), coordType, memAddress(coords)); + } + + // --- [ glPathStringNV ] --- + + /** Unsafe version of: {@link #glPathStringNV PathStringNV} */ + public static native void nglPathStringNV(int path, int format, int length, long pathString); + + /** @param format one of:
    {@link #GL_PATH_FORMAT_SVG_NV PATH_FORMAT_SVG_NV}{@link #GL_PATH_FORMAT_PS_NV PATH_FORMAT_PS_NV}
    */ + public static void glPathStringNV(@NativeType("GLuint") int path, @NativeType("GLenum") int format, @NativeType("void const *") ByteBuffer pathString) { + nglPathStringNV(path, format, pathString.remaining(), memAddress(pathString)); + } + + // --- [ glPathGlyphsNV ] --- + + /** Unsafe version of: {@link #glPathGlyphsNV PathGlyphsNV} */ + public static native void nglPathGlyphsNV(int firstPathName, int fontTarget, long fontName, int fontStyle, int numGlyphs, int type, long charcodes, int handleMissingGlyphs, int pathParameterTemplate, float emScale); + + /** + * @param fontTarget one of:
    {@link #GL_STANDARD_FONT_NAME_NV STANDARD_FONT_NAME_NV}{@link #GL_SYSTEM_FONT_NAME_NV SYSTEM_FONT_NAME_NV}{@link #GL_FILE_NAME_NV FILE_NAME_NV}
    + * @param fontStyle one or more of:
    {@link #GL_BOLD_BIT_NV BOLD_BIT_NV}{@link #GL_ITALIC_BIT_NV ITALIC_BIT_NV}
    + * @param type one of:
    {@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link #GL_UTF8_NV UTF8_NV}{@link #GL_UTF16_NV UTF16_NV}{@link #GL_2_BYTES_NV 2_BYTES_NV}{@link #GL_3_BYTES_NV 3_BYTES_NV}
    {@link #GL_4_BYTES_NV 4_BYTES_NV}
    + * @param handleMissingGlyphs one of:
    {@link #GL_SKIP_MISSING_GLYPH_NV SKIP_MISSING_GLYPH_NV}{@link #GL_USE_MISSING_GLYPH_NV USE_MISSING_GLYPH_NV}
    + */ + public static void glPathGlyphsNV(@NativeType("GLuint") int firstPathName, @NativeType("GLenum") int fontTarget, @NativeType("void const *") ByteBuffer fontName, @NativeType("GLbitfield") int fontStyle, @NativeType("GLenum") int type, @NativeType("void const *") ByteBuffer charcodes, @NativeType("GLenum") int handleMissingGlyphs, @NativeType("GLuint") int pathParameterTemplate, @NativeType("GLfloat") float emScale) { + if (CHECKS) { + checkNT1(fontName); + } + nglPathGlyphsNV(firstPathName, fontTarget, memAddress(fontName), fontStyle, charcodes.remaining() / charcodeTypeToBytes(type), type, memAddress(charcodes), handleMissingGlyphs, pathParameterTemplate, emScale); + } + + // --- [ glPathGlyphRangeNV ] --- + + /** Unsafe version of: {@link #glPathGlyphRangeNV PathGlyphRangeNV} */ + public static native void nglPathGlyphRangeNV(int firstPathName, int fontTarget, long fontName, int fontStyle, int firstGlyph, int numGlyphs, int handleMissingGlyphs, int pathParameterTemplate, float emScale); + + /** + * @param fontTarget one of:
    {@link #GL_STANDARD_FONT_NAME_NV STANDARD_FONT_NAME_NV}{@link #GL_SYSTEM_FONT_NAME_NV SYSTEM_FONT_NAME_NV}{@link #GL_FILE_NAME_NV FILE_NAME_NV}
    + * @param fontStyle one or more of:
    {@link #GL_BOLD_BIT_NV BOLD_BIT_NV}{@link #GL_ITALIC_BIT_NV ITALIC_BIT_NV}
    + * @param handleMissingGlyphs one of:
    {@link #GL_SKIP_MISSING_GLYPH_NV SKIP_MISSING_GLYPH_NV}{@link #GL_USE_MISSING_GLYPH_NV USE_MISSING_GLYPH_NV}
    + */ + public static void glPathGlyphRangeNV(@NativeType("GLuint") int firstPathName, @NativeType("GLenum") int fontTarget, @NativeType("void const *") ByteBuffer fontName, @NativeType("GLbitfield") int fontStyle, @NativeType("GLuint") int firstGlyph, @NativeType("GLsizei") int numGlyphs, @NativeType("GLenum") int handleMissingGlyphs, @NativeType("GLuint") int pathParameterTemplate, @NativeType("GLfloat") float emScale) { + if (CHECKS) { + checkNT1(fontName); + } + nglPathGlyphRangeNV(firstPathName, fontTarget, memAddress(fontName), fontStyle, firstGlyph, numGlyphs, handleMissingGlyphs, pathParameterTemplate, emScale); + } + + // --- [ glPathGlyphIndexArrayNV ] --- + + /** Unsafe version of: {@link #glPathGlyphIndexArrayNV PathGlyphIndexArrayNV} */ + public static native int nglPathGlyphIndexArrayNV(int firstPathName, int fontTarget, long fontName, int fontStyle, int firstGlyphIndex, int numGlyphs, int pathParameterTemplate, float emScale); + + /** + * @param fontTarget one of:
    {@link #GL_STANDARD_FONT_NAME_NV STANDARD_FONT_NAME_NV}{@link #GL_SYSTEM_FONT_NAME_NV SYSTEM_FONT_NAME_NV}{@link #GL_FILE_NAME_NV FILE_NAME_NV}
    + * @param fontStyle one or more of:
    {@link #GL_BOLD_BIT_NV BOLD_BIT_NV}{@link #GL_ITALIC_BIT_NV ITALIC_BIT_NV}
    + */ + @NativeType("GLenum") + public static int glPathGlyphIndexArrayNV(@NativeType("GLuint") int firstPathName, @NativeType("GLenum") int fontTarget, @NativeType("void const *") ByteBuffer fontName, @NativeType("GLbitfield") int fontStyle, @NativeType("GLuint") int firstGlyphIndex, @NativeType("GLsizei") int numGlyphs, @NativeType("GLuint") int pathParameterTemplate, @NativeType("GLfloat") float emScale) { + if (CHECKS) { + checkNT1(fontName); + } + return nglPathGlyphIndexArrayNV(firstPathName, fontTarget, memAddress(fontName), fontStyle, firstGlyphIndex, numGlyphs, pathParameterTemplate, emScale); + } + + // --- [ glPathMemoryGlyphIndexArrayNV ] --- + + /** Unsafe version of: {@link #glPathMemoryGlyphIndexArrayNV PathMemoryGlyphIndexArrayNV} */ + public static native int nglPathMemoryGlyphIndexArrayNV(int firstPathName, int fontTarget, long fontSize, long fontData, int faceIndex, int firstGlyphIndex, int numGlyphs, int pathParameterTemplate, float emScale); + + /** @param fontTarget one of:
    {@link #GL_STANDARD_FONT_NAME_NV STANDARD_FONT_NAME_NV}{@link #GL_SYSTEM_FONT_NAME_NV SYSTEM_FONT_NAME_NV}{@link #GL_FILE_NAME_NV FILE_NAME_NV}
    */ + @NativeType("GLenum") + public static int glPathMemoryGlyphIndexArrayNV(@NativeType("GLuint") int firstPathName, @NativeType("GLenum") int fontTarget, @NativeType("void const *") ByteBuffer fontData, @NativeType("GLsizei") int faceIndex, @NativeType("GLuint") int firstGlyphIndex, @NativeType("GLsizei") int numGlyphs, @NativeType("GLuint") int pathParameterTemplate, @NativeType("GLfloat") float emScale) { + return nglPathMemoryGlyphIndexArrayNV(firstPathName, fontTarget, fontData.remaining(), memAddress(fontData), faceIndex, firstGlyphIndex, numGlyphs, pathParameterTemplate, emScale); + } + + // --- [ glCopyPathNV ] --- + + public static native void glCopyPathNV(@NativeType("GLuint") int resultPath, @NativeType("GLuint") int srcPath); + + // --- [ glWeightPathsNV ] --- + + public static native void nglWeightPathsNV(int resultPath, int numPaths, long paths, long weights); + + public static void glWeightPathsNV(@NativeType("GLuint") int resultPath, @NativeType("GLuint const *") IntBuffer paths, @NativeType("GLfloat const *") FloatBuffer weights) { + if (CHECKS) { + check(weights, paths.remaining()); + } + nglWeightPathsNV(resultPath, paths.remaining(), memAddress(paths), memAddress(weights)); + } + + // --- [ glInterpolatePathsNV ] --- + + public static native void glInterpolatePathsNV(@NativeType("GLuint") int resultPath, @NativeType("GLuint") int pathA, @NativeType("GLuint") int pathB, @NativeType("GLfloat") float weight); + + // --- [ glTransformPathNV ] --- + + /** Unsafe version of: {@link #glTransformPathNV TransformPathNV} */ + public static native void nglTransformPathNV(int resultPath, int srcPath, int transformType, long transformValues); + + /** @param transformType one of:
    {@link #GL_TRANSLATE_X_NV TRANSLATE_X_NV}{@link #GL_TRANSLATE_Y_NV TRANSLATE_Y_NV}{@link #GL_TRANSLATE_2D_NV TRANSLATE_2D_NV}{@link #GL_TRANSLATE_3D_NV TRANSLATE_3D_NV}{@link #GL_AFFINE_2D_NV AFFINE_2D_NV}
    {@link #GL_AFFINE_3D_NV AFFINE_3D_NV}{@link #GL_TRANSPOSE_AFFINE_2D_NV TRANSPOSE_AFFINE_2D_NV}{@link #GL_TRANSPOSE_AFFINE_3D_NV TRANSPOSE_AFFINE_3D_NV}
    */ + public static void glTransformPathNV(@NativeType("GLuint") int resultPath, @NativeType("GLuint") int srcPath, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") FloatBuffer transformValues) { + if (CHECKS) { + check(transformValues, transformTypeToElements(transformType)); + } + nglTransformPathNV(resultPath, srcPath, transformType, memAddress(transformValues)); + } + + // --- [ glPathParameterivNV ] --- + + /** Unsafe version of: {@link #glPathParameterivNV PathParameterivNV} */ + public static native void nglPathParameterivNV(int path, int pname, long value); + + /** @param pname one of:
    {@link #GL_PATH_STROKE_WIDTH_NV PATH_STROKE_WIDTH_NV}{@link #GL_PATH_INITIAL_END_CAP_NV PATH_INITIAL_END_CAP_NV}{@link #GL_PATH_TERMINAL_END_CAP_NV PATH_TERMINAL_END_CAP_NV}
    {@link #GL_PATH_JOIN_STYLE_NV PATH_JOIN_STYLE_NV}{@link #GL_PATH_MITER_LIMIT_NV PATH_MITER_LIMIT_NV}{@link #GL_PATH_INITIAL_DASH_CAP_NV PATH_INITIAL_DASH_CAP_NV}
    {@link #GL_PATH_TERMINAL_DASH_CAP_NV PATH_TERMINAL_DASH_CAP_NV}{@link #GL_PATH_DASH_OFFSET_NV PATH_DASH_OFFSET_NV}{@link #GL_PATH_CLIENT_LENGTH_NV PATH_CLIENT_LENGTH_NV}
    {@link #GL_PATH_DASH_OFFSET_RESET_NV PATH_DASH_OFFSET_RESET_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}{@link #GL_PATH_FILL_MASK_NV PATH_FILL_MASK_NV}
    {@link #GL_PATH_FILL_COVER_MODE_NV PATH_FILL_COVER_MODE_NV}{@link #GL_PATH_STROKE_COVER_MODE_NV PATH_STROKE_COVER_MODE_NV}{@link #GL_PATH_STROKE_MASK_NV PATH_STROKE_MASK_NV}
    {@link #GL_PATH_STROKE_BOUND_NV PATH_STROKE_BOUND_NV}
    */ + public static void glPathParameterivNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglPathParameterivNV(path, pname, memAddress(value)); + } + + // --- [ glPathParameteriNV ] --- + + /** @param pname one of:
    {@link #GL_PATH_STROKE_WIDTH_NV PATH_STROKE_WIDTH_NV}{@link #GL_PATH_INITIAL_END_CAP_NV PATH_INITIAL_END_CAP_NV}{@link #GL_PATH_TERMINAL_END_CAP_NV PATH_TERMINAL_END_CAP_NV}
    {@link #GL_PATH_JOIN_STYLE_NV PATH_JOIN_STYLE_NV}{@link #GL_PATH_MITER_LIMIT_NV PATH_MITER_LIMIT_NV}{@link #GL_PATH_INITIAL_DASH_CAP_NV PATH_INITIAL_DASH_CAP_NV}
    {@link #GL_PATH_TERMINAL_DASH_CAP_NV PATH_TERMINAL_DASH_CAP_NV}{@link #GL_PATH_DASH_OFFSET_NV PATH_DASH_OFFSET_NV}{@link #GL_PATH_CLIENT_LENGTH_NV PATH_CLIENT_LENGTH_NV}
    {@link #GL_PATH_DASH_OFFSET_RESET_NV PATH_DASH_OFFSET_RESET_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}{@link #GL_PATH_FILL_MASK_NV PATH_FILL_MASK_NV}
    {@link #GL_PATH_FILL_COVER_MODE_NV PATH_FILL_COVER_MODE_NV}{@link #GL_PATH_STROKE_COVER_MODE_NV PATH_STROKE_COVER_MODE_NV}{@link #GL_PATH_STROKE_MASK_NV PATH_STROKE_MASK_NV}
    {@link #GL_PATH_STROKE_BOUND_NV PATH_STROKE_BOUND_NV}
    */ + public static native void glPathParameteriNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname, @NativeType("GLint") int value); + + // --- [ glPathParameterfvNV ] --- + + /** Unsafe version of: {@link #glPathParameterfvNV PathParameterfvNV} */ + public static native void nglPathParameterfvNV(int path, int pname, long value); + + /** @param pname one of:
    {@link #GL_PATH_STROKE_WIDTH_NV PATH_STROKE_WIDTH_NV}{@link #GL_PATH_INITIAL_END_CAP_NV PATH_INITIAL_END_CAP_NV}{@link #GL_PATH_TERMINAL_END_CAP_NV PATH_TERMINAL_END_CAP_NV}
    {@link #GL_PATH_JOIN_STYLE_NV PATH_JOIN_STYLE_NV}{@link #GL_PATH_MITER_LIMIT_NV PATH_MITER_LIMIT_NV}{@link #GL_PATH_INITIAL_DASH_CAP_NV PATH_INITIAL_DASH_CAP_NV}
    {@link #GL_PATH_TERMINAL_DASH_CAP_NV PATH_TERMINAL_DASH_CAP_NV}{@link #GL_PATH_DASH_OFFSET_NV PATH_DASH_OFFSET_NV}{@link #GL_PATH_CLIENT_LENGTH_NV PATH_CLIENT_LENGTH_NV}
    {@link #GL_PATH_DASH_OFFSET_RESET_NV PATH_DASH_OFFSET_RESET_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}{@link #GL_PATH_FILL_MASK_NV PATH_FILL_MASK_NV}
    {@link #GL_PATH_FILL_COVER_MODE_NV PATH_FILL_COVER_MODE_NV}{@link #GL_PATH_STROKE_COVER_MODE_NV PATH_STROKE_COVER_MODE_NV}{@link #GL_PATH_STROKE_MASK_NV PATH_STROKE_MASK_NV}
    {@link #GL_PATH_STROKE_BOUND_NV PATH_STROKE_BOUND_NV}{@link #GL_PATH_END_CAPS_NV PATH_END_CAPS_NV}{@link #GL_PATH_DASH_CAPS_NV PATH_DASH_CAPS_NV}
    */ + public static void glPathParameterfvNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglPathParameterfvNV(path, pname, memAddress(value)); + } + + // --- [ glPathParameterfNV ] --- + + /** @param pname one of:
    {@link #GL_PATH_STROKE_WIDTH_NV PATH_STROKE_WIDTH_NV}{@link #GL_PATH_INITIAL_END_CAP_NV PATH_INITIAL_END_CAP_NV}{@link #GL_PATH_TERMINAL_END_CAP_NV PATH_TERMINAL_END_CAP_NV}
    {@link #GL_PATH_JOIN_STYLE_NV PATH_JOIN_STYLE_NV}{@link #GL_PATH_MITER_LIMIT_NV PATH_MITER_LIMIT_NV}{@link #GL_PATH_INITIAL_DASH_CAP_NV PATH_INITIAL_DASH_CAP_NV}
    {@link #GL_PATH_TERMINAL_DASH_CAP_NV PATH_TERMINAL_DASH_CAP_NV}{@link #GL_PATH_DASH_OFFSET_NV PATH_DASH_OFFSET_NV}{@link #GL_PATH_CLIENT_LENGTH_NV PATH_CLIENT_LENGTH_NV}
    {@link #GL_PATH_DASH_OFFSET_RESET_NV PATH_DASH_OFFSET_RESET_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}{@link #GL_PATH_FILL_MASK_NV PATH_FILL_MASK_NV}
    {@link #GL_PATH_FILL_COVER_MODE_NV PATH_FILL_COVER_MODE_NV}{@link #GL_PATH_STROKE_COVER_MODE_NV PATH_STROKE_COVER_MODE_NV}{@link #GL_PATH_STROKE_MASK_NV PATH_STROKE_MASK_NV}
    {@link #GL_PATH_STROKE_BOUND_NV PATH_STROKE_BOUND_NV}{@link #GL_PATH_END_CAPS_NV PATH_END_CAPS_NV}{@link #GL_PATH_DASH_CAPS_NV PATH_DASH_CAPS_NV}
    */ + public static native void glPathParameterfNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname, @NativeType("GLfloat") float value); + + // --- [ glPathDashArrayNV ] --- + + public static native void nglPathDashArrayNV(int path, int dashCount, long dashArray); + + public static void glPathDashArrayNV(@NativeType("GLuint") int path, @NativeType("GLfloat const *") FloatBuffer dashArray) { + nglPathDashArrayNV(path, dashArray.remaining(), memAddress(dashArray)); + } + + // --- [ glGenPathsNV ] --- + + @NativeType("GLuint") + public static native int glGenPathsNV(@NativeType("GLsizei") int range); + + // --- [ glDeletePathsNV ] --- + + public static native void glDeletePathsNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int range); + + // --- [ glIsPathNV ] --- + + @NativeType("GLboolean") + public static native boolean glIsPathNV(@NativeType("GLuint") int path); + + // --- [ glPathStencilFuncNV ] --- + + public static native void glPathStencilFuncNV(@NativeType("GLenum") int func, @NativeType("GLint") int ref, @NativeType("GLuint") int mask); + + // --- [ glPathStencilDepthOffsetNV ] --- + + public static native void glPathStencilDepthOffsetNV(@NativeType("GLfloat") float factor, @NativeType("GLfloat") float units); + + // --- [ glStencilFillPathNV ] --- + + /** @param fillMode one of:
    {@link GL11#GL_INVERT INVERT}{@link #GL_COUNT_UP_NV COUNT_UP_NV}{@link #GL_COUNT_DOWN_NV COUNT_DOWN_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}
    */ + public static native void glStencilFillPathNV(@NativeType("GLuint") int path, @NativeType("GLenum") int fillMode, @NativeType("GLuint") int mask); + + // --- [ glStencilStrokePathNV ] --- + + public static native void glStencilStrokePathNV(@NativeType("GLuint") int path, @NativeType("GLint") int reference, @NativeType("GLuint") int mask); + + // --- [ glStencilFillPathInstancedNV ] --- + + /** Unsafe version of: {@link #glStencilFillPathInstancedNV StencilFillPathInstancedNV} */ + public static native void nglStencilFillPathInstancedNV(int numPaths, int pathNameType, long paths, int pathBase, int fillMode, int mask, int transformType, long transformValues); + + /** + * @param pathNameType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link #GL_UTF8_NV UTF8_NV}{@link #GL_UTF16_NV UTF16_NV}{@link #GL_2_BYTES_NV 2_BYTES_NV}
    {@link #GL_3_BYTES_NV 3_BYTES_NV}{@link #GL_4_BYTES_NV 4_BYTES_NV}
    + * @param fillMode one of:
    {@link GL11#GL_INVERT INVERT}{@link #GL_COUNT_UP_NV COUNT_UP_NV}{@link #GL_COUNT_DOWN_NV COUNT_DOWN_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}
    + * @param transformType one of:
    {@link #GL_TRANSLATE_X_NV TRANSLATE_X_NV}{@link #GL_TRANSLATE_Y_NV TRANSLATE_Y_NV}{@link #GL_TRANSLATE_2D_NV TRANSLATE_2D_NV}{@link #GL_TRANSLATE_3D_NV TRANSLATE_3D_NV}{@link #GL_AFFINE_2D_NV AFFINE_2D_NV}
    {@link #GL_AFFINE_3D_NV AFFINE_3D_NV}{@link #GL_TRANSPOSE_AFFINE_2D_NV TRANSPOSE_AFFINE_2D_NV}{@link #GL_TRANSPOSE_AFFINE_3D_NV TRANSPOSE_AFFINE_3D_NV}
    + */ + public static void glStencilFillPathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLenum") int fillMode, @NativeType("GLuint") int mask, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") FloatBuffer transformValues) { + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + nglStencilFillPathInstancedNV(numPaths, pathNameType, memAddress(paths), pathBase, fillMode, mask, transformType, memAddress(transformValues)); + } + + // --- [ glStencilStrokePathInstancedNV ] --- + + /** Unsafe version of: {@link #glStencilStrokePathInstancedNV StencilStrokePathInstancedNV} */ + public static native void nglStencilStrokePathInstancedNV(int numPaths, int pathNameType, long paths, int pathBase, int reference, int mask, int transformType, long transformValues); + + /** + * @param pathNameType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link #GL_UTF8_NV UTF8_NV}{@link #GL_UTF16_NV UTF16_NV}{@link #GL_2_BYTES_NV 2_BYTES_NV}
    {@link #GL_3_BYTES_NV 3_BYTES_NV}{@link #GL_4_BYTES_NV 4_BYTES_NV}
    + * @param transformType one of:
    {@link #GL_TRANSLATE_X_NV TRANSLATE_X_NV}{@link #GL_TRANSLATE_Y_NV TRANSLATE_Y_NV}{@link #GL_TRANSLATE_2D_NV TRANSLATE_2D_NV}{@link #GL_TRANSLATE_3D_NV TRANSLATE_3D_NV}{@link #GL_AFFINE_2D_NV AFFINE_2D_NV}
    {@link #GL_AFFINE_3D_NV AFFINE_3D_NV}{@link #GL_TRANSPOSE_AFFINE_2D_NV TRANSPOSE_AFFINE_2D_NV}{@link #GL_TRANSPOSE_AFFINE_3D_NV TRANSPOSE_AFFINE_3D_NV}
    + */ + public static void glStencilStrokePathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLint") int reference, @NativeType("GLuint") int mask, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") FloatBuffer transformValues) { + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + nglStencilStrokePathInstancedNV(numPaths, pathNameType, memAddress(paths), pathBase, reference, mask, transformType, memAddress(transformValues)); + } + + // --- [ glPathCoverDepthFuncNV ] --- + + public static native void glPathCoverDepthFuncNV(@NativeType("GLenum") int zfunc); + + // --- [ glPathColorGenNV ] --- + + /** Unsafe version of: {@link #glPathColorGenNV PathColorGenNV} */ + public static native void nglPathColorGenNV(int color, int genMode, int colorFormat, long coeffs); + + /** + * @param color one of:
    {@link GL13#GL_PRIMARY_COLOR PRIMARY_COLOR}{@link #GL_PRIMARY_COLOR_NV PRIMARY_COLOR_NV}{@link #GL_SECONDARY_COLOR_NV SECONDARY_COLOR_NV}
    + * @param genMode one of:
    {@link GL11#GL_NONE NONE}{@link #GL_OBJECT_LINEAR_NV OBJECT_LINEAR_NV}{@link #GL_PATH_OBJECT_BOUNDING_BOX_NV PATH_OBJECT_BOUNDING_BOX_NV}{@link #GL_EYE_LINEAR_NV EYE_LINEAR_NV}{@link #GL_CONSTANT_NV CONSTANT_NV}
    + * @param colorFormat {@link GL11#GL_LUMINANCE LUMINANCE} {@link GL11#GL_ALPHA ALPHA} {@link GL11#GL_INTENSITY INTENSITY} {@link GL11#GL_LUMINANCE_ALPHA LUMINANCE_ALPHA} {@link GL11#GL_RGB RGB} {@link GL11#GL_RGBA RGBA} + */ + public static void glPathColorGenNV(@NativeType("GLenum") int color, @NativeType("GLenum") int genMode, @NativeType("GLenum") int colorFormat, @NativeType("GLfloat const *") FloatBuffer coeffs) { + if (CHECKS) { + check(coeffs, genModeToElements(genMode) * colorFormatToComponents(colorFormat)); + } + nglPathColorGenNV(color, genMode, colorFormat, memAddress(coeffs)); + } + + // --- [ glPathTexGenNV ] --- + + public static native void nglPathTexGenNV(int texCoordSet, int genMode, int components, long coeffs); + + public static void glPathTexGenNV(@NativeType("GLenum") int texCoordSet, @NativeType("GLenum") int genMode, @NativeType("GLint") int components, @NativeType("GLfloat const *") FloatBuffer coeffs) { + if (CHECKS) { + check(coeffs, genModeToElements(genMode) * components); + } + nglPathTexGenNV(texCoordSet, genMode, components, memAddress(coeffs)); + } + + // --- [ glPathFogGenNV ] --- + + public static native void glPathFogGenNV(@NativeType("GLenum") int genMode); + + // --- [ glCoverFillPathNV ] --- + + /** @param coverMode one of:
    {@link #GL_CONVEX_HULL_NV CONVEX_HULL_NV}{@link #GL_BOUNDING_BOX_NV BOUNDING_BOX_NV}
    */ + public static native void glCoverFillPathNV(@NativeType("GLuint") int path, @NativeType("GLenum") int coverMode); + + // --- [ glCoverStrokePathNV ] --- + + /** @param coverMode one of:
    {@link #GL_CONVEX_HULL_NV CONVEX_HULL_NV}{@link #GL_BOUNDING_BOX_NV BOUNDING_BOX_NV}
    */ + public static native void glCoverStrokePathNV(@NativeType("GLuint") int path, @NativeType("GLenum") int coverMode); + + // --- [ glCoverFillPathInstancedNV ] --- + + /** Unsafe version of: {@link #glCoverFillPathInstancedNV CoverFillPathInstancedNV} */ + public static native void nglCoverFillPathInstancedNV(int numPaths, int pathNameType, long paths, int pathBase, int coverMode, int transformType, long transformValues); + + /** + * @param pathNameType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link #GL_UTF8_NV UTF8_NV}{@link #GL_UTF16_NV UTF16_NV}{@link #GL_2_BYTES_NV 2_BYTES_NV}
    {@link #GL_3_BYTES_NV 3_BYTES_NV}{@link #GL_4_BYTES_NV 4_BYTES_NV}
    + * @param coverMode one of:
    {@link #GL_CONVEX_HULL_NV CONVEX_HULL_NV}{@link #GL_BOUNDING_BOX_NV BOUNDING_BOX_NV}{@link #GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV BOUNDING_BOX_OF_BOUNDING_BOXES_NV}
    + * @param transformType one of:
    {@link #GL_TRANSLATE_X_NV TRANSLATE_X_NV}{@link #GL_TRANSLATE_Y_NV TRANSLATE_Y_NV}{@link #GL_TRANSLATE_2D_NV TRANSLATE_2D_NV}{@link #GL_TRANSLATE_3D_NV TRANSLATE_3D_NV}{@link #GL_AFFINE_2D_NV AFFINE_2D_NV}
    {@link #GL_AFFINE_3D_NV AFFINE_3D_NV}{@link #GL_TRANSPOSE_AFFINE_2D_NV TRANSPOSE_AFFINE_2D_NV}{@link #GL_TRANSPOSE_AFFINE_3D_NV TRANSPOSE_AFFINE_3D_NV}
    + */ + public static void glCoverFillPathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLenum") int coverMode, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") FloatBuffer transformValues) { + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + nglCoverFillPathInstancedNV(numPaths, pathNameType, memAddress(paths), pathBase, coverMode, transformType, memAddress(transformValues)); + } + + // --- [ glCoverStrokePathInstancedNV ] --- + + /** Unsafe version of: {@link #glCoverStrokePathInstancedNV CoverStrokePathInstancedNV} */ + public static native void nglCoverStrokePathInstancedNV(int numPaths, int pathNameType, long paths, int pathBase, int coverMode, int transformType, long transformValues); + + /** + * @param pathNameType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link #GL_UTF8_NV UTF8_NV}{@link #GL_UTF16_NV UTF16_NV}{@link #GL_2_BYTES_NV 2_BYTES_NV}
    {@link #GL_3_BYTES_NV 3_BYTES_NV}{@link #GL_4_BYTES_NV 4_BYTES_NV}
    + * @param coverMode one of:
    {@link #GL_CONVEX_HULL_NV CONVEX_HULL_NV}{@link #GL_BOUNDING_BOX_NV BOUNDING_BOX_NV}{@link #GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV BOUNDING_BOX_OF_BOUNDING_BOXES_NV}
    + * @param transformType one of:
    {@link #GL_TRANSLATE_X_NV TRANSLATE_X_NV}{@link #GL_TRANSLATE_Y_NV TRANSLATE_Y_NV}{@link #GL_TRANSLATE_2D_NV TRANSLATE_2D_NV}{@link #GL_TRANSLATE_3D_NV TRANSLATE_3D_NV}{@link #GL_AFFINE_2D_NV AFFINE_2D_NV}
    {@link #GL_AFFINE_3D_NV AFFINE_3D_NV}{@link #GL_TRANSPOSE_AFFINE_2D_NV TRANSPOSE_AFFINE_2D_NV}{@link #GL_TRANSPOSE_AFFINE_3D_NV TRANSPOSE_AFFINE_3D_NV}
    + */ + public static void glCoverStrokePathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLenum") int coverMode, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") FloatBuffer transformValues) { + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + nglCoverStrokePathInstancedNV(numPaths, pathNameType, memAddress(paths), pathBase, coverMode, transformType, memAddress(transformValues)); + } + + // --- [ glStencilThenCoverFillPathNV ] --- + + /** + * @param fillMode one of:
    {@link GL11#GL_INVERT INVERT}{@link #GL_COUNT_UP_NV COUNT_UP_NV}{@link #GL_COUNT_DOWN_NV COUNT_DOWN_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}
    + * @param coverMode one of:
    {@link #GL_CONVEX_HULL_NV CONVEX_HULL_NV}{@link #GL_BOUNDING_BOX_NV BOUNDING_BOX_NV}
    + */ + public static native void glStencilThenCoverFillPathNV(@NativeType("GLuint") int path, @NativeType("GLenum") int fillMode, @NativeType("GLuint") int mask, @NativeType("GLenum") int coverMode); + + // --- [ glStencilThenCoverStrokePathNV ] --- + + /** @param coverMode one of:
    {@link #GL_CONVEX_HULL_NV CONVEX_HULL_NV}{@link #GL_BOUNDING_BOX_NV BOUNDING_BOX_NV}
    */ + public static native void glStencilThenCoverStrokePathNV(@NativeType("GLuint") int path, @NativeType("GLint") int reference, @NativeType("GLuint") int mask, @NativeType("GLenum") int coverMode); + + // --- [ glStencilThenCoverFillPathInstancedNV ] --- + + /** Unsafe version of: {@link #glStencilThenCoverFillPathInstancedNV StencilThenCoverFillPathInstancedNV} */ + public static native void nglStencilThenCoverFillPathInstancedNV(int numPaths, int pathNameType, long paths, int pathBase, int fillMode, int mask, int coverMode, int transformType, long transformValues); + + /** + * @param pathNameType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link #GL_UTF8_NV UTF8_NV}{@link #GL_UTF16_NV UTF16_NV}{@link #GL_2_BYTES_NV 2_BYTES_NV}
    {@link #GL_3_BYTES_NV 3_BYTES_NV}{@link #GL_4_BYTES_NV 4_BYTES_NV}
    + * @param fillMode one of:
    {@link GL11#GL_INVERT INVERT}{@link #GL_COUNT_UP_NV COUNT_UP_NV}{@link #GL_COUNT_DOWN_NV COUNT_DOWN_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}
    + * @param coverMode one of:
    {@link #GL_CONVEX_HULL_NV CONVEX_HULL_NV}{@link #GL_BOUNDING_BOX_NV BOUNDING_BOX_NV}{@link #GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV BOUNDING_BOX_OF_BOUNDING_BOXES_NV}
    + * @param transformType one of:
    {@link #GL_TRANSLATE_X_NV TRANSLATE_X_NV}{@link #GL_TRANSLATE_Y_NV TRANSLATE_Y_NV}{@link #GL_TRANSLATE_2D_NV TRANSLATE_2D_NV}{@link #GL_TRANSLATE_3D_NV TRANSLATE_3D_NV}{@link #GL_AFFINE_2D_NV AFFINE_2D_NV}
    {@link #GL_AFFINE_3D_NV AFFINE_3D_NV}{@link #GL_TRANSPOSE_AFFINE_2D_NV TRANSPOSE_AFFINE_2D_NV}{@link #GL_TRANSPOSE_AFFINE_3D_NV TRANSPOSE_AFFINE_3D_NV}
    + */ + public static void glStencilThenCoverFillPathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLenum") int fillMode, @NativeType("GLuint") int mask, @NativeType("GLenum") int coverMode, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") FloatBuffer transformValues) { + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + nglStencilThenCoverFillPathInstancedNV(numPaths, pathNameType, memAddress(paths), pathBase, fillMode, mask, coverMode, transformType, memAddress(transformValues)); + } + + // --- [ glStencilThenCoverStrokePathInstancedNV ] --- + + /** Unsafe version of: {@link #glStencilThenCoverStrokePathInstancedNV StencilThenCoverStrokePathInstancedNV} */ + public static native void nglStencilThenCoverStrokePathInstancedNV(int numPaths, int pathNameType, long paths, int pathBase, int reference, int mask, int coverMode, int transformType, long transformValues); + + /** + * @param pathNameType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link #GL_UTF8_NV UTF8_NV}{@link #GL_UTF16_NV UTF16_NV}{@link #GL_2_BYTES_NV 2_BYTES_NV}
    {@link #GL_3_BYTES_NV 3_BYTES_NV}{@link #GL_4_BYTES_NV 4_BYTES_NV}
    + * @param coverMode one of:
    {@link #GL_CONVEX_HULL_NV CONVEX_HULL_NV}{@link #GL_BOUNDING_BOX_NV BOUNDING_BOX_NV}{@link #GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV BOUNDING_BOX_OF_BOUNDING_BOXES_NV}
    + * @param transformType one of:
    {@link #GL_TRANSLATE_X_NV TRANSLATE_X_NV}{@link #GL_TRANSLATE_Y_NV TRANSLATE_Y_NV}{@link #GL_TRANSLATE_2D_NV TRANSLATE_2D_NV}{@link #GL_TRANSLATE_3D_NV TRANSLATE_3D_NV}{@link #GL_AFFINE_2D_NV AFFINE_2D_NV}
    {@link #GL_AFFINE_3D_NV AFFINE_3D_NV}{@link #GL_TRANSPOSE_AFFINE_2D_NV TRANSPOSE_AFFINE_2D_NV}{@link #GL_TRANSPOSE_AFFINE_3D_NV TRANSPOSE_AFFINE_3D_NV}
    + */ + public static void glStencilThenCoverStrokePathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLint") int reference, @NativeType("GLuint") int mask, @NativeType("GLenum") int coverMode, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") FloatBuffer transformValues) { + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + nglStencilThenCoverStrokePathInstancedNV(numPaths, pathNameType, memAddress(paths), pathBase, reference, mask, coverMode, transformType, memAddress(transformValues)); + } + + // --- [ glPathGlyphIndexRangeNV ] --- + + /** Unsafe version of: {@link #glPathGlyphIndexRangeNV PathGlyphIndexRangeNV} */ + public static native int nglPathGlyphIndexRangeNV(int fontTarget, long fontName, int fontStyle, int pathParameterTemplate, float emScale, long baseAndCount); + + /** + * @param fontTarget one of:
    {@link #GL_STANDARD_FONT_NAME_NV STANDARD_FONT_NAME_NV}{@link #GL_SYSTEM_FONT_NAME_NV SYSTEM_FONT_NAME_NV}{@link #GL_FILE_NAME_NV FILE_NAME_NV}
    + * @param fontStyle one or more of:
    {@link #GL_BOLD_BIT_NV BOLD_BIT_NV}{@link #GL_ITALIC_BIT_NV ITALIC_BIT_NV}
    + */ + @NativeType("GLenum") + public static int glPathGlyphIndexRangeNV(@NativeType("GLenum") int fontTarget, @NativeType("void const *") ByteBuffer fontName, @NativeType("GLbitfield") int fontStyle, @NativeType("GLuint") int pathParameterTemplate, @NativeType("GLfloat") float emScale, @NativeType("GLuint *") IntBuffer baseAndCount) { + if (CHECKS) { + checkNT1(fontName); + check(baseAndCount, 2); + } + return nglPathGlyphIndexRangeNV(fontTarget, memAddress(fontName), fontStyle, pathParameterTemplate, emScale, memAddress(baseAndCount)); + } + + // --- [ glProgramPathFragmentInputGenNV ] --- + + public static native void nglProgramPathFragmentInputGenNV(int program, int location, int genMode, int components, long coeffs); + + public static void glProgramPathFragmentInputGenNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLenum") int genMode, @NativeType("GLint") int components, @NativeType("GLfloat const *") FloatBuffer coeffs) { + if (CHECKS) { + check(coeffs, genModeToElements(genMode) * components); + } + nglProgramPathFragmentInputGenNV(program, location, genMode, components, memAddress(coeffs)); + } + + // --- [ glGetPathParameterivNV ] --- + + /** Unsafe version of: {@link #glGetPathParameterivNV GetPathParameterivNV} */ + public static native void nglGetPathParameterivNV(int path, int pname, long value); + + /** @param pname one of:
    {@link #GL_PATH_STROKE_WIDTH_NV PATH_STROKE_WIDTH_NV}{@link #GL_PATH_INITIAL_END_CAP_NV PATH_INITIAL_END_CAP_NV}{@link #GL_PATH_TERMINAL_END_CAP_NV PATH_TERMINAL_END_CAP_NV}
    {@link #GL_PATH_JOIN_STYLE_NV PATH_JOIN_STYLE_NV}{@link #GL_PATH_MITER_LIMIT_NV PATH_MITER_LIMIT_NV}{@link #GL_PATH_INITIAL_DASH_CAP_NV PATH_INITIAL_DASH_CAP_NV}
    {@link #GL_PATH_TERMINAL_DASH_CAP_NV PATH_TERMINAL_DASH_CAP_NV}{@link #GL_PATH_DASH_OFFSET_NV PATH_DASH_OFFSET_NV}{@link #GL_PATH_CLIENT_LENGTH_NV PATH_CLIENT_LENGTH_NV}
    {@link #GL_PATH_DASH_OFFSET_RESET_NV PATH_DASH_OFFSET_RESET_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}{@link #GL_PATH_FILL_MASK_NV PATH_FILL_MASK_NV}
    {@link #GL_PATH_FILL_COVER_MODE_NV PATH_FILL_COVER_MODE_NV}{@link #GL_PATH_STROKE_COVER_MODE_NV PATH_STROKE_COVER_MODE_NV}{@link #GL_PATH_STROKE_MASK_NV PATH_STROKE_MASK_NV}
    {@link #GL_PATH_STROKE_BOUND_NV PATH_STROKE_BOUND_NV}{@link #GL_PATH_COMMAND_COUNT_NV PATH_COMMAND_COUNT_NV}{@link #GL_PATH_COORD_COUNT_NV PATH_COORD_COUNT_NV}
    {@link #GL_PATH_DASH_ARRAY_COUNT_NV PATH_DASH_ARRAY_COUNT_NV}{@link #GL_PATH_COMPUTED_LENGTH_NV PATH_COMPUTED_LENGTH_NV}{@link #GL_PATH_FILL_BOUNDING_BOX_NV PATH_FILL_BOUNDING_BOX_NV}
    {@link #GL_PATH_STROKE_BOUNDING_BOX_NV PATH_STROKE_BOUNDING_BOX_NV}
    */ + public static void glGetPathParameterivNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglGetPathParameterivNV(path, pname, memAddress(value)); + } + + /** @param pname one of:
    {@link #GL_PATH_STROKE_WIDTH_NV PATH_STROKE_WIDTH_NV}{@link #GL_PATH_INITIAL_END_CAP_NV PATH_INITIAL_END_CAP_NV}{@link #GL_PATH_TERMINAL_END_CAP_NV PATH_TERMINAL_END_CAP_NV}
    {@link #GL_PATH_JOIN_STYLE_NV PATH_JOIN_STYLE_NV}{@link #GL_PATH_MITER_LIMIT_NV PATH_MITER_LIMIT_NV}{@link #GL_PATH_INITIAL_DASH_CAP_NV PATH_INITIAL_DASH_CAP_NV}
    {@link #GL_PATH_TERMINAL_DASH_CAP_NV PATH_TERMINAL_DASH_CAP_NV}{@link #GL_PATH_DASH_OFFSET_NV PATH_DASH_OFFSET_NV}{@link #GL_PATH_CLIENT_LENGTH_NV PATH_CLIENT_LENGTH_NV}
    {@link #GL_PATH_DASH_OFFSET_RESET_NV PATH_DASH_OFFSET_RESET_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}{@link #GL_PATH_FILL_MASK_NV PATH_FILL_MASK_NV}
    {@link #GL_PATH_FILL_COVER_MODE_NV PATH_FILL_COVER_MODE_NV}{@link #GL_PATH_STROKE_COVER_MODE_NV PATH_STROKE_COVER_MODE_NV}{@link #GL_PATH_STROKE_MASK_NV PATH_STROKE_MASK_NV}
    {@link #GL_PATH_STROKE_BOUND_NV PATH_STROKE_BOUND_NV}{@link #GL_PATH_COMMAND_COUNT_NV PATH_COMMAND_COUNT_NV}{@link #GL_PATH_COORD_COUNT_NV PATH_COORD_COUNT_NV}
    {@link #GL_PATH_DASH_ARRAY_COUNT_NV PATH_DASH_ARRAY_COUNT_NV}{@link #GL_PATH_COMPUTED_LENGTH_NV PATH_COMPUTED_LENGTH_NV}{@link #GL_PATH_FILL_BOUNDING_BOX_NV PATH_FILL_BOUNDING_BOX_NV}
    {@link #GL_PATH_STROKE_BOUNDING_BOX_NV PATH_STROKE_BOUNDING_BOX_NV}
    */ + @NativeType("void") + public static int glGetPathParameteriNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer value = stack.callocInt(1); + nglGetPathParameterivNV(path, pname, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetPathParameterfvNV ] --- + + /** Unsafe version of: {@link #glGetPathParameterfvNV GetPathParameterfvNV} */ + public static native void nglGetPathParameterfvNV(int path, int pname, long value); + + /** @param pname one of:
    {@link #GL_PATH_STROKE_WIDTH_NV PATH_STROKE_WIDTH_NV}{@link #GL_PATH_INITIAL_END_CAP_NV PATH_INITIAL_END_CAP_NV}{@link #GL_PATH_TERMINAL_END_CAP_NV PATH_TERMINAL_END_CAP_NV}
    {@link #GL_PATH_JOIN_STYLE_NV PATH_JOIN_STYLE_NV}{@link #GL_PATH_MITER_LIMIT_NV PATH_MITER_LIMIT_NV}{@link #GL_PATH_INITIAL_DASH_CAP_NV PATH_INITIAL_DASH_CAP_NV}
    {@link #GL_PATH_TERMINAL_DASH_CAP_NV PATH_TERMINAL_DASH_CAP_NV}{@link #GL_PATH_DASH_OFFSET_NV PATH_DASH_OFFSET_NV}{@link #GL_PATH_CLIENT_LENGTH_NV PATH_CLIENT_LENGTH_NV}
    {@link #GL_PATH_DASH_OFFSET_RESET_NV PATH_DASH_OFFSET_RESET_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}{@link #GL_PATH_FILL_MASK_NV PATH_FILL_MASK_NV}
    {@link #GL_PATH_FILL_COVER_MODE_NV PATH_FILL_COVER_MODE_NV}{@link #GL_PATH_STROKE_COVER_MODE_NV PATH_STROKE_COVER_MODE_NV}{@link #GL_PATH_STROKE_MASK_NV PATH_STROKE_MASK_NV}
    {@link #GL_PATH_STROKE_BOUND_NV PATH_STROKE_BOUND_NV}{@link #GL_PATH_COMMAND_COUNT_NV PATH_COMMAND_COUNT_NV}{@link #GL_PATH_COORD_COUNT_NV PATH_COORD_COUNT_NV}
    {@link #GL_PATH_DASH_ARRAY_COUNT_NV PATH_DASH_ARRAY_COUNT_NV}{@link #GL_PATH_COMPUTED_LENGTH_NV PATH_COMPUTED_LENGTH_NV}{@link #GL_PATH_FILL_BOUNDING_BOX_NV PATH_FILL_BOUNDING_BOX_NV}
    {@link #GL_PATH_STROKE_BOUNDING_BOX_NV PATH_STROKE_BOUNDING_BOX_NV}
    */ + public static void glGetPathParameterfvNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglGetPathParameterfvNV(path, pname, memAddress(value)); + } + + /** @param pname one of:
    {@link #GL_PATH_STROKE_WIDTH_NV PATH_STROKE_WIDTH_NV}{@link #GL_PATH_INITIAL_END_CAP_NV PATH_INITIAL_END_CAP_NV}{@link #GL_PATH_TERMINAL_END_CAP_NV PATH_TERMINAL_END_CAP_NV}
    {@link #GL_PATH_JOIN_STYLE_NV PATH_JOIN_STYLE_NV}{@link #GL_PATH_MITER_LIMIT_NV PATH_MITER_LIMIT_NV}{@link #GL_PATH_INITIAL_DASH_CAP_NV PATH_INITIAL_DASH_CAP_NV}
    {@link #GL_PATH_TERMINAL_DASH_CAP_NV PATH_TERMINAL_DASH_CAP_NV}{@link #GL_PATH_DASH_OFFSET_NV PATH_DASH_OFFSET_NV}{@link #GL_PATH_CLIENT_LENGTH_NV PATH_CLIENT_LENGTH_NV}
    {@link #GL_PATH_DASH_OFFSET_RESET_NV PATH_DASH_OFFSET_RESET_NV}{@link #GL_PATH_FILL_MODE_NV PATH_FILL_MODE_NV}{@link #GL_PATH_FILL_MASK_NV PATH_FILL_MASK_NV}
    {@link #GL_PATH_FILL_COVER_MODE_NV PATH_FILL_COVER_MODE_NV}{@link #GL_PATH_STROKE_COVER_MODE_NV PATH_STROKE_COVER_MODE_NV}{@link #GL_PATH_STROKE_MASK_NV PATH_STROKE_MASK_NV}
    {@link #GL_PATH_STROKE_BOUND_NV PATH_STROKE_BOUND_NV}{@link #GL_PATH_COMMAND_COUNT_NV PATH_COMMAND_COUNT_NV}{@link #GL_PATH_COORD_COUNT_NV PATH_COORD_COUNT_NV}
    {@link #GL_PATH_DASH_ARRAY_COUNT_NV PATH_DASH_ARRAY_COUNT_NV}{@link #GL_PATH_COMPUTED_LENGTH_NV PATH_COMPUTED_LENGTH_NV}{@link #GL_PATH_FILL_BOUNDING_BOX_NV PATH_FILL_BOUNDING_BOX_NV}
    {@link #GL_PATH_STROKE_BOUNDING_BOX_NV PATH_STROKE_BOUNDING_BOX_NV}
    */ + @NativeType("void") + public static float glGetPathParameterfNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer value = stack.callocFloat(1); + nglGetPathParameterfvNV(path, pname, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetPathCommandsNV ] --- + + public static native void nglGetPathCommandsNV(int path, long commands); + + public static void glGetPathCommandsNV(@NativeType("GLuint") int path, @NativeType("GLubyte *") ByteBuffer commands) { + if (CHECKS) { + if (DEBUG) { + check(commands, glGetPathParameteriNV(path, GL_PATH_COMMAND_COUNT_NV)); + } + } + nglGetPathCommandsNV(path, memAddress(commands)); + } + + // --- [ glGetPathCoordsNV ] --- + + public static native void nglGetPathCoordsNV(int path, long coords); + + public static void glGetPathCoordsNV(@NativeType("GLuint") int path, @NativeType("GLfloat *") FloatBuffer coords) { + if (CHECKS) { + if (DEBUG) { + check(coords, glGetPathParameteriNV(path, GL_PATH_COORD_COUNT_NV)); + } + } + nglGetPathCoordsNV(path, memAddress(coords)); + } + + // --- [ glGetPathDashArrayNV ] --- + + public static native void nglGetPathDashArrayNV(int path, long dashArray); + + public static void glGetPathDashArrayNV(@NativeType("GLuint") int path, @NativeType("GLfloat *") FloatBuffer dashArray) { + if (CHECKS) { + if (DEBUG) { + check(dashArray, glGetPathParameteriNV(path, GL_PATH_DASH_ARRAY_COUNT_NV)); + } + } + nglGetPathDashArrayNV(path, memAddress(dashArray)); + } + + // --- [ glGetPathMetricsNV ] --- + + /** Unsafe version of: {@link #glGetPathMetricsNV GetPathMetricsNV} */ + public static native void nglGetPathMetricsNV(int metricQueryMask, int numPaths, int pathNameType, long paths, int pathBase, int stride, long metrics); + + /** + * @param metricQueryMask one or more of:
    {@link #GL_GLYPH_WIDTH_BIT_NV GLYPH_WIDTH_BIT_NV}{@link #GL_GLYPH_HEIGHT_BIT_NV GLYPH_HEIGHT_BIT_NV}
    {@link #GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV GLYPH_HORIZONTAL_BEARING_X_BIT_NV}{@link #GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV GLYPH_HORIZONTAL_BEARING_Y_BIT_NV}
    {@link #GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV}{@link #GL_GLYPH_VERTICAL_BEARING_X_BIT_NV GLYPH_VERTICAL_BEARING_X_BIT_NV}
    {@link #GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV GLYPH_VERTICAL_BEARING_Y_BIT_NV}{@link #GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV}
    {@link #GL_GLYPH_HAS_KERNING_BIT_NV GLYPH_HAS_KERNING_BIT_NV}{@link #GL_FONT_X_MIN_BOUNDS_BIT_NV FONT_X_MIN_BOUNDS_BIT_NV}
    {@link #GL_FONT_Y_MIN_BOUNDS_BIT_NV FONT_Y_MIN_BOUNDS_BIT_NV}{@link #GL_FONT_X_MAX_BOUNDS_BIT_NV FONT_X_MAX_BOUNDS_BIT_NV}
    {@link #GL_FONT_Y_MAX_BOUNDS_BIT_NV FONT_Y_MAX_BOUNDS_BIT_NV}{@link #GL_FONT_UNITS_PER_EM_BIT_NV FONT_UNITS_PER_EM_BIT_NV}
    {@link #GL_FONT_ASCENDER_BIT_NV FONT_ASCENDER_BIT_NV}{@link #GL_FONT_DESCENDER_BIT_NV FONT_DESCENDER_BIT_NV}
    {@link #GL_FONT_HEIGHT_BIT_NV FONT_HEIGHT_BIT_NV}{@link #GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV FONT_MAX_ADVANCE_WIDTH_BIT_NV}
    {@link #GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV FONT_MAX_ADVANCE_HEIGHT_BIT_NV}{@link #GL_FONT_UNDERLINE_POSITION_BIT_NV FONT_UNDERLINE_POSITION_BIT_NV}
    {@link #GL_FONT_UNDERLINE_THICKNESS_BIT_NV FONT_UNDERLINE_THICKNESS_BIT_NV}{@link #GL_FONT_HAS_KERNING_BIT_NV FONT_HAS_KERNING_BIT_NV}
    {@link #GL_FONT_NUM_GLYPH_INDICES_BIT_NV FONT_NUM_GLYPH_INDICES_BIT_NV}
    + * @param pathNameType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link #GL_UTF8_NV UTF8_NV}{@link #GL_UTF16_NV UTF16_NV}{@link #GL_2_BYTES_NV 2_BYTES_NV}
    {@link #GL_3_BYTES_NV 3_BYTES_NV}{@link #GL_4_BYTES_NV 4_BYTES_NV}
    + */ + public static void glGetPathMetricsNV(@NativeType("GLbitfield") int metricQueryMask, @NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLsizei") int stride, @NativeType("GLfloat *") FloatBuffer metrics) { + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(metrics, numPaths * (stride == 0 ? Integer.bitCount(metricQueryMask) : (stride >> 2))); + } + nglGetPathMetricsNV(metricQueryMask, numPaths, pathNameType, memAddress(paths), pathBase, stride, memAddress(metrics)); + } + + // --- [ glGetPathMetricRangeNV ] --- + + /** Unsafe version of: {@link #glGetPathMetricRangeNV GetPathMetricRangeNV} */ + public static native void nglGetPathMetricRangeNV(int metricQueryMask, int firstPathName, int numPaths, int stride, long metrics); + + /** @param metricQueryMask one or more of:
    {@link #GL_GLYPH_WIDTH_BIT_NV GLYPH_WIDTH_BIT_NV}{@link #GL_GLYPH_HEIGHT_BIT_NV GLYPH_HEIGHT_BIT_NV}
    {@link #GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV GLYPH_HORIZONTAL_BEARING_X_BIT_NV}{@link #GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV GLYPH_HORIZONTAL_BEARING_Y_BIT_NV}
    {@link #GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV}{@link #GL_GLYPH_VERTICAL_BEARING_X_BIT_NV GLYPH_VERTICAL_BEARING_X_BIT_NV}
    {@link #GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV GLYPH_VERTICAL_BEARING_Y_BIT_NV}{@link #GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV}
    {@link #GL_GLYPH_HAS_KERNING_BIT_NV GLYPH_HAS_KERNING_BIT_NV}{@link #GL_FONT_X_MIN_BOUNDS_BIT_NV FONT_X_MIN_BOUNDS_BIT_NV}
    {@link #GL_FONT_Y_MIN_BOUNDS_BIT_NV FONT_Y_MIN_BOUNDS_BIT_NV}{@link #GL_FONT_X_MAX_BOUNDS_BIT_NV FONT_X_MAX_BOUNDS_BIT_NV}
    {@link #GL_FONT_Y_MAX_BOUNDS_BIT_NV FONT_Y_MAX_BOUNDS_BIT_NV}{@link #GL_FONT_UNITS_PER_EM_BIT_NV FONT_UNITS_PER_EM_BIT_NV}
    {@link #GL_FONT_ASCENDER_BIT_NV FONT_ASCENDER_BIT_NV}{@link #GL_FONT_DESCENDER_BIT_NV FONT_DESCENDER_BIT_NV}
    {@link #GL_FONT_HEIGHT_BIT_NV FONT_HEIGHT_BIT_NV}{@link #GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV FONT_MAX_ADVANCE_WIDTH_BIT_NV}
    {@link #GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV FONT_MAX_ADVANCE_HEIGHT_BIT_NV}{@link #GL_FONT_UNDERLINE_POSITION_BIT_NV FONT_UNDERLINE_POSITION_BIT_NV}
    {@link #GL_FONT_UNDERLINE_THICKNESS_BIT_NV FONT_UNDERLINE_THICKNESS_BIT_NV}{@link #GL_FONT_HAS_KERNING_BIT_NV FONT_HAS_KERNING_BIT_NV}
    {@link #GL_FONT_NUM_GLYPH_INDICES_BIT_NV FONT_NUM_GLYPH_INDICES_BIT_NV}
    */ + public static void glGetPathMetricRangeNV(@NativeType("GLbitfield") int metricQueryMask, @NativeType("GLuint") int firstPathName, @NativeType("GLsizei") int numPaths, @NativeType("GLsizei") int stride, @NativeType("GLfloat *") FloatBuffer metrics) { + if (CHECKS) { + check(metrics, numPaths * (stride == 0 ? Integer.bitCount(metricQueryMask) : (stride >> 2))); + } + nglGetPathMetricRangeNV(metricQueryMask, firstPathName, numPaths, stride, memAddress(metrics)); + } + + // --- [ glGetPathSpacingNV ] --- + + /** Unsafe version of: {@link #glGetPathSpacingNV GetPathSpacingNV} */ + public static native void nglGetPathSpacingNV(int pathListMode, int numPaths, int pathNameType, long paths, int pathBase, float advanceScale, float kerningScale, int transformType, long returnedSpacing); + + /** + * @param pathListMode one of:
    {@link #GL_ACCUM_ADJACENT_PAIRS_NV ACCUM_ADJACENT_PAIRS_NV}{@link #GL_ADJACENT_PAIRS_NV ADJACENT_PAIRS_NV}{@link #GL_FIRST_TO_REST_NV FIRST_TO_REST_NV}
    + * @param pathNameType one of:
    {@link GL11#GL_BYTE BYTE}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}{@link GL11#GL_SHORT SHORT}{@link GL11#GL_UNSIGNED_SHORT UNSIGNED_SHORT}{@link GL11#GL_INT INT}{@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_FLOAT FLOAT}{@link #GL_UTF8_NV UTF8_NV}{@link #GL_UTF16_NV UTF16_NV}{@link #GL_2_BYTES_NV 2_BYTES_NV}
    {@link #GL_3_BYTES_NV 3_BYTES_NV}{@link #GL_4_BYTES_NV 4_BYTES_NV}
    + * @param transformType one of:
    {@link #GL_TRANSLATE_X_NV TRANSLATE_X_NV}{@link #GL_TRANSLATE_2D_NV TRANSLATE_2D_NV}
    + */ + public static void glGetPathSpacingNV(@NativeType("GLenum") int pathListMode, @NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLfloat") float advanceScale, @NativeType("GLfloat") float kerningScale, @NativeType("GLenum") int transformType, @NativeType("GLfloat *") FloatBuffer returnedSpacing) { + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(returnedSpacing, (numPaths - 1) * (transformType == GL_TRANSLATE_X_NV ? 1 : 2)); + } + nglGetPathSpacingNV(pathListMode, numPaths, pathNameType, memAddress(paths), pathBase, advanceScale, kerningScale, transformType, memAddress(returnedSpacing)); + } + + // --- [ glGetPathColorGenivNV ] --- + + /** Unsafe version of: {@link #glGetPathColorGenivNV GetPathColorGenivNV} */ + public static native void nglGetPathColorGenivNV(int color, int pname, long value); + + /** + * @param color one of:
    {@link GL13#GL_PRIMARY_COLOR PRIMARY_COLOR}{@link #GL_PRIMARY_COLOR_NV PRIMARY_COLOR_NV}{@link #GL_SECONDARY_COLOR_NV SECONDARY_COLOR_NV}
    + * @param pname one of:
    {@link #GL_PATH_GEN_MODE_NV PATH_GEN_MODE_NV}{@link #GL_PATH_GEN_COEFF_NV PATH_GEN_COEFF_NV}{@link #GL_PATH_GEN_COLOR_FORMAT_NV PATH_GEN_COLOR_FORMAT_NV}
    + */ + public static void glGetPathColorGenivNV(@NativeType("GLenum") int color, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglGetPathColorGenivNV(color, pname, memAddress(value)); + } + + /** + * @param color one of:
    {@link GL13#GL_PRIMARY_COLOR PRIMARY_COLOR}{@link #GL_PRIMARY_COLOR_NV PRIMARY_COLOR_NV}{@link #GL_SECONDARY_COLOR_NV SECONDARY_COLOR_NV}
    + * @param pname one of:
    {@link #GL_PATH_GEN_MODE_NV PATH_GEN_MODE_NV}{@link #GL_PATH_GEN_COEFF_NV PATH_GEN_COEFF_NV}{@link #GL_PATH_GEN_COLOR_FORMAT_NV PATH_GEN_COLOR_FORMAT_NV}
    + */ + @NativeType("void") + public static int glGetPathColorGeniNV(@NativeType("GLenum") int color, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer value = stack.callocInt(1); + nglGetPathColorGenivNV(color, pname, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetPathColorGenfvNV ] --- + + /** Unsafe version of: {@link #glGetPathColorGenfvNV GetPathColorGenfvNV} */ + public static native void nglGetPathColorGenfvNV(int color, int pname, long value); + + /** + * @param color one of:
    {@link GL13#GL_PRIMARY_COLOR PRIMARY_COLOR}{@link #GL_PRIMARY_COLOR_NV PRIMARY_COLOR_NV}{@link #GL_SECONDARY_COLOR_NV SECONDARY_COLOR_NV}
    + * @param pname one of:
    {@link #GL_PATH_GEN_MODE_NV PATH_GEN_MODE_NV}{@link #GL_PATH_GEN_COEFF_NV PATH_GEN_COEFF_NV}{@link #GL_PATH_GEN_COLOR_FORMAT_NV PATH_GEN_COLOR_FORMAT_NV}
    + */ + public static void glGetPathColorGenfvNV(@NativeType("GLenum") int color, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglGetPathColorGenfvNV(color, pname, memAddress(value)); + } + + /** + * @param color one of:
    {@link GL13#GL_PRIMARY_COLOR PRIMARY_COLOR}{@link #GL_PRIMARY_COLOR_NV PRIMARY_COLOR_NV}{@link #GL_SECONDARY_COLOR_NV SECONDARY_COLOR_NV}
    + * @param pname one of:
    {@link #GL_PATH_GEN_MODE_NV PATH_GEN_MODE_NV}{@link #GL_PATH_GEN_COEFF_NV PATH_GEN_COEFF_NV}{@link #GL_PATH_GEN_COLOR_FORMAT_NV PATH_GEN_COLOR_FORMAT_NV}
    + */ + @NativeType("void") + public static float glGetPathColorGenfNV(@NativeType("GLenum") int color, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer value = stack.callocFloat(1); + nglGetPathColorGenfvNV(color, pname, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetPathTexGenivNV ] --- + + /** Unsafe version of: {@link #glGetPathTexGenivNV GetPathTexGenivNV} */ + public static native void nglGetPathTexGenivNV(int texCoordSet, int pname, long value); + + /** @param pname {@link #GL_PATH_GEN_MODE_NV PATH_GEN_MODE_NV} {@link #GL_PATH_GEN_COEFF_NV PATH_GEN_COEFF_NV} {@link #GL_PATH_GEN_COMPONENTS_NV PATH_GEN_COMPONENTS_NV} */ + public static void glGetPathTexGenivNV(@NativeType("GLenum") int texCoordSet, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglGetPathTexGenivNV(texCoordSet, pname, memAddress(value)); + } + + /** @param pname {@link #GL_PATH_GEN_MODE_NV PATH_GEN_MODE_NV} {@link #GL_PATH_GEN_COEFF_NV PATH_GEN_COEFF_NV} {@link #GL_PATH_GEN_COMPONENTS_NV PATH_GEN_COMPONENTS_NV} */ + @NativeType("void") + public static int glGetPathTexGeniNV(@NativeType("GLenum") int texCoordSet, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer value = stack.callocInt(1); + nglGetPathTexGenivNV(texCoordSet, pname, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetPathTexGenfvNV ] --- + + /** Unsafe version of: {@link #glGetPathTexGenfvNV GetPathTexGenfvNV} */ + public static native void nglGetPathTexGenfvNV(int texCoordSet, int pname, long value); + + /** @param pname {@link #GL_PATH_GEN_MODE_NV PATH_GEN_MODE_NV} {@link #GL_PATH_GEN_COEFF_NV PATH_GEN_COEFF_NV} {@link #GL_PATH_GEN_COMPONENTS_NV PATH_GEN_COMPONENTS_NV} */ + public static void glGetPathTexGenfvNV(@NativeType("GLenum") int texCoordSet, @NativeType("GLenum") int pname, @NativeType("GLfloat *") FloatBuffer value) { + if (CHECKS) { + check(value, 1); + } + nglGetPathTexGenfvNV(texCoordSet, pname, memAddress(value)); + } + + /** @param pname {@link #GL_PATH_GEN_MODE_NV PATH_GEN_MODE_NV} {@link #GL_PATH_GEN_COEFF_NV PATH_GEN_COEFF_NV} {@link #GL_PATH_GEN_COMPONENTS_NV PATH_GEN_COMPONENTS_NV} */ + @NativeType("void") + public static float glGetPathTexGenfNV(@NativeType("GLenum") int texCoordSet, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + FloatBuffer value = stack.callocFloat(1); + nglGetPathTexGenfvNV(texCoordSet, pname, memAddress(value)); + return value.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsPointInFillPathNV ] --- + + @NativeType("GLboolean") + public static native boolean glIsPointInFillPathNV(@NativeType("GLuint") int path, @NativeType("GLuint") int mask, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y); + + // --- [ glIsPointInStrokePathNV ] --- + + @NativeType("GLboolean") + public static native boolean glIsPointInStrokePathNV(@NativeType("GLuint") int path, @NativeType("GLfloat") float x, @NativeType("GLfloat") float y); + + // --- [ glGetPathLengthNV ] --- + + @NativeType("GLfloat") + public static native float glGetPathLengthNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int startSegment, @NativeType("GLsizei") int numSegments); + + // --- [ glPointAlongPathNV ] --- + + public static native boolean nglPointAlongPathNV(int path, int startSegment, int numSegments, float distance, long x, long y, long tangentX, long tangentY); + + @NativeType("GLboolean") + public static boolean glPointAlongPathNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int startSegment, @NativeType("GLsizei") int numSegments, @NativeType("GLfloat") float distance, @Nullable @NativeType("GLfloat *") FloatBuffer x, @Nullable @NativeType("GLfloat *") FloatBuffer y, @Nullable @NativeType("GLfloat *") FloatBuffer tangentX, @Nullable @NativeType("GLfloat *") FloatBuffer tangentY) { + if (CHECKS) { + checkSafe(x, 1); + checkSafe(y, 1); + checkSafe(tangentX, 1); + checkSafe(tangentY, 1); + } + return nglPointAlongPathNV(path, startSegment, numSegments, distance, memAddressSafe(x), memAddressSafe(y), memAddressSafe(tangentX), memAddressSafe(tangentY)); + } + + // --- [ glMatrixLoad3x2fNV ] --- + + /** Unsafe version of: {@link #glMatrixLoad3x2fNV MatrixLoad3x2fNV} */ + public static native void nglMatrixLoad3x2fNV(int matrixMode, long m); + + /** @param matrixMode one of:
    {@link #GL_PATH_PROJECTION_NV PATH_PROJECTION_NV}{@link #GL_PATH_MODELVIEW_NV PATH_MODELVIEW_NV}
    */ + public static void glMatrixLoad3x2fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 6); + } + nglMatrixLoad3x2fNV(matrixMode, memAddress(m)); + } + + // --- [ glMatrixLoad3x3fNV ] --- + + /** Unsafe version of: {@link #glMatrixLoad3x3fNV MatrixLoad3x3fNV} */ + public static native void nglMatrixLoad3x3fNV(int matrixMode, long m); + + /** @param matrixMode one of:
    {@link #GL_PATH_PROJECTION_NV PATH_PROJECTION_NV}{@link #GL_PATH_MODELVIEW_NV PATH_MODELVIEW_NV}
    */ + public static void glMatrixLoad3x3fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 9); + } + nglMatrixLoad3x3fNV(matrixMode, memAddress(m)); + } + + // --- [ glMatrixLoadTranspose3x3fNV ] --- + + /** Unsafe version of: {@link #glMatrixLoadTranspose3x3fNV MatrixLoadTranspose3x3fNV} */ + public static native void nglMatrixLoadTranspose3x3fNV(int matrixMode, long m); + + /** @param matrixMode one of:
    {@link #GL_PATH_PROJECTION_NV PATH_PROJECTION_NV}{@link #GL_PATH_MODELVIEW_NV PATH_MODELVIEW_NV}
    */ + public static void glMatrixLoadTranspose3x3fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 9); + } + nglMatrixLoadTranspose3x3fNV(matrixMode, memAddress(m)); + } + + // --- [ glMatrixMult3x2fNV ] --- + + /** Unsafe version of: {@link #glMatrixMult3x2fNV MatrixMult3x2fNV} */ + public static native void nglMatrixMult3x2fNV(int matrixMode, long m); + + /** @param matrixMode one of:
    {@link #GL_PATH_PROJECTION_NV PATH_PROJECTION_NV}{@link #GL_PATH_MODELVIEW_NV PATH_MODELVIEW_NV}
    */ + public static void glMatrixMult3x2fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 6); + } + nglMatrixMult3x2fNV(matrixMode, memAddress(m)); + } + + // --- [ glMatrixMult3x3fNV ] --- + + /** Unsafe version of: {@link #glMatrixMult3x3fNV MatrixMult3x3fNV} */ + public static native void nglMatrixMult3x3fNV(int matrixMode, long m); + + /** @param matrixMode one of:
    {@link #GL_PATH_PROJECTION_NV PATH_PROJECTION_NV}{@link #GL_PATH_MODELVIEW_NV PATH_MODELVIEW_NV}
    */ + public static void glMatrixMult3x3fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 9); + } + nglMatrixMult3x3fNV(matrixMode, memAddress(m)); + } + + // --- [ glMatrixMultTranspose3x3fNV ] --- + + /** Unsafe version of: {@link #glMatrixMultTranspose3x3fNV MatrixMultTranspose3x3fNV} */ + public static native void nglMatrixMultTranspose3x3fNV(int matrixMode, long m); + + /** @param matrixMode one of:
    {@link #GL_PATH_PROJECTION_NV PATH_PROJECTION_NV}{@link #GL_PATH_MODELVIEW_NV PATH_MODELVIEW_NV}
    */ + public static void glMatrixMultTranspose3x3fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") FloatBuffer m) { + if (CHECKS) { + check(m, 9); + } + nglMatrixMultTranspose3x3fNV(matrixMode, memAddress(m)); + } + + // --- [ glGetProgramResourcefvNV ] --- + + public static native void nglGetProgramResourcefvNV(int program, int programInterface, int index, int propCount, long props, int bufSize, long length, long params); + + public static void glGetProgramResourcefvNV(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @NativeType("GLenum const *") IntBuffer props, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLfloat *") FloatBuffer params) { + if (CHECKS) { + checkSafe(length, 1); + } + nglGetProgramResourcefvNV(program, programInterface, index, props.remaining(), memAddress(props), params.remaining(), memAddressSafe(length), memAddress(params)); + } + + /** Array version of: {@link #glPathCommandsNV PathCommandsNV} */ + public static void glPathCommandsNV(@NativeType("GLuint") int path, @NativeType("GLubyte const *") ByteBuffer commands, @NativeType("GLenum") int coordType, @NativeType("void const *") short[] coords) { + long __functionAddress = GL.getICD().glPathCommandsNV; + if (CHECKS) { + check(__functionAddress); + } + callPPV(path, commands.remaining(), memAddress(commands), coords.length, coordType, coords, __functionAddress); + } + + /** Array version of: {@link #glPathCommandsNV PathCommandsNV} */ + public static void glPathCommandsNV(@NativeType("GLuint") int path, @NativeType("GLubyte const *") ByteBuffer commands, @NativeType("GLenum") int coordType, @NativeType("void const *") float[] coords) { + long __functionAddress = GL.getICD().glPathCommandsNV; + if (CHECKS) { + check(__functionAddress); + } + callPPV(path, commands.remaining(), memAddress(commands), coords.length, coordType, coords, __functionAddress); + } + + /** Array version of: {@link #glPathCoordsNV PathCoordsNV} */ + public static void glPathCoordsNV(@NativeType("GLuint") int path, @NativeType("GLenum") int coordType, @NativeType("void const *") short[] coords) { + long __functionAddress = GL.getICD().glPathCoordsNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(path, coords.length, coordType, coords, __functionAddress); + } + + /** Array version of: {@link #glPathCoordsNV PathCoordsNV} */ + public static void glPathCoordsNV(@NativeType("GLuint") int path, @NativeType("GLenum") int coordType, @NativeType("void const *") float[] coords) { + long __functionAddress = GL.getICD().glPathCoordsNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(path, coords.length, coordType, coords, __functionAddress); + } + + /** Array version of: {@link #glPathSubCommandsNV PathSubCommandsNV} */ + public static void glPathSubCommandsNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int commandStart, @NativeType("GLsizei") int commandsToDelete, @NativeType("GLubyte const *") ByteBuffer commands, @NativeType("GLenum") int coordType, @NativeType("void const *") short[] coords) { + long __functionAddress = GL.getICD().glPathSubCommandsNV; + if (CHECKS) { + check(__functionAddress); + } + callPPV(path, commandStart, commandsToDelete, commands.remaining(), memAddress(commands), coords.length, coordType, coords, __functionAddress); + } + + /** Array version of: {@link #glPathSubCommandsNV PathSubCommandsNV} */ + public static void glPathSubCommandsNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int commandStart, @NativeType("GLsizei") int commandsToDelete, @NativeType("GLubyte const *") ByteBuffer commands, @NativeType("GLenum") int coordType, @NativeType("void const *") float[] coords) { + long __functionAddress = GL.getICD().glPathSubCommandsNV; + if (CHECKS) { + check(__functionAddress); + } + callPPV(path, commandStart, commandsToDelete, commands.remaining(), memAddress(commands), coords.length, coordType, coords, __functionAddress); + } + + /** Array version of: {@link #glPathSubCoordsNV PathSubCoordsNV} */ + public static void glPathSubCoordsNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int coordStart, @NativeType("GLenum") int coordType, @NativeType("void const *") short[] coords) { + long __functionAddress = GL.getICD().glPathSubCoordsNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(path, coordStart, coords.length, coordType, coords, __functionAddress); + } + + /** Array version of: {@link #glPathSubCoordsNV PathSubCoordsNV} */ + public static void glPathSubCoordsNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int coordStart, @NativeType("GLenum") int coordType, @NativeType("void const *") float[] coords) { + long __functionAddress = GL.getICD().glPathSubCoordsNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(path, coordStart, coords.length, coordType, coords, __functionAddress); + } + + /** Array version of: {@link #glWeightPathsNV WeightPathsNV} */ + public static void glWeightPathsNV(@NativeType("GLuint") int resultPath, @NativeType("GLuint const *") int[] paths, @NativeType("GLfloat const *") float[] weights) { + long __functionAddress = GL.getICD().glWeightPathsNV; + if (CHECKS) { + check(__functionAddress); + check(weights, paths.length); + } + callPPV(resultPath, paths.length, paths, weights, __functionAddress); + } + + /** Array version of: {@link #glTransformPathNV TransformPathNV} */ + public static void glTransformPathNV(@NativeType("GLuint") int resultPath, @NativeType("GLuint") int srcPath, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") float[] transformValues) { + long __functionAddress = GL.getICD().glTransformPathNV; + if (CHECKS) { + check(__functionAddress); + check(transformValues, transformTypeToElements(transformType)); + } + callPV(resultPath, srcPath, transformType, transformValues, __functionAddress); + } + + /** Array version of: {@link #glPathParameterivNV PathParameterivNV} */ + public static void glPathParameterivNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] value) { + long __functionAddress = GL.getICD().glPathParameterivNV; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(path, pname, value, __functionAddress); + } + + /** Array version of: {@link #glPathParameterfvNV PathParameterfvNV} */ + public static void glPathParameterfvNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname, @NativeType("GLfloat const *") float[] value) { + long __functionAddress = GL.getICD().glPathParameterfvNV; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(path, pname, value, __functionAddress); + } + + /** Array version of: {@link #glPathDashArrayNV PathDashArrayNV} */ + public static void glPathDashArrayNV(@NativeType("GLuint") int path, @NativeType("GLfloat const *") float[] dashArray) { + long __functionAddress = GL.getICD().glPathDashArrayNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(path, dashArray.length, dashArray, __functionAddress); + } + + /** Array version of: {@link #glStencilFillPathInstancedNV StencilFillPathInstancedNV} */ + public static void glStencilFillPathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLenum") int fillMode, @NativeType("GLuint") int mask, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") float[] transformValues) { + long __functionAddress = GL.getICD().glStencilFillPathInstancedNV; + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(__functionAddress); + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + callPPV(numPaths, pathNameType, memAddress(paths), pathBase, fillMode, mask, transformType, transformValues, __functionAddress); + } + + /** Array version of: {@link #glStencilStrokePathInstancedNV StencilStrokePathInstancedNV} */ + public static void glStencilStrokePathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLint") int reference, @NativeType("GLuint") int mask, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") float[] transformValues) { + long __functionAddress = GL.getICD().glStencilStrokePathInstancedNV; + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(__functionAddress); + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + callPPV(numPaths, pathNameType, memAddress(paths), pathBase, reference, mask, transformType, transformValues, __functionAddress); + } + + /** Array version of: {@link #glPathColorGenNV PathColorGenNV} */ + public static void glPathColorGenNV(@NativeType("GLenum") int color, @NativeType("GLenum") int genMode, @NativeType("GLenum") int colorFormat, @NativeType("GLfloat const *") float[] coeffs) { + long __functionAddress = GL.getICD().glPathColorGenNV; + if (CHECKS) { + check(__functionAddress); + check(coeffs, genModeToElements(genMode) * colorFormatToComponents(colorFormat)); + } + callPV(color, genMode, colorFormat, coeffs, __functionAddress); + } + + /** Array version of: {@link #glPathTexGenNV PathTexGenNV} */ + public static void glPathTexGenNV(@NativeType("GLenum") int texCoordSet, @NativeType("GLenum") int genMode, @NativeType("GLint") int components, @NativeType("GLfloat const *") float[] coeffs) { + long __functionAddress = GL.getICD().glPathTexGenNV; + if (CHECKS) { + check(__functionAddress); + check(coeffs, genModeToElements(genMode) * components); + } + callPV(texCoordSet, genMode, components, coeffs, __functionAddress); + } + + /** Array version of: {@link #glCoverFillPathInstancedNV CoverFillPathInstancedNV} */ + public static void glCoverFillPathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLenum") int coverMode, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") float[] transformValues) { + long __functionAddress = GL.getICD().glCoverFillPathInstancedNV; + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(__functionAddress); + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + callPPV(numPaths, pathNameType, memAddress(paths), pathBase, coverMode, transformType, transformValues, __functionAddress); + } + + /** Array version of: {@link #glCoverStrokePathInstancedNV CoverStrokePathInstancedNV} */ + public static void glCoverStrokePathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLenum") int coverMode, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") float[] transformValues) { + long __functionAddress = GL.getICD().glCoverStrokePathInstancedNV; + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(__functionAddress); + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + callPPV(numPaths, pathNameType, memAddress(paths), pathBase, coverMode, transformType, transformValues, __functionAddress); + } + + /** Array version of: {@link #glStencilThenCoverFillPathInstancedNV StencilThenCoverFillPathInstancedNV} */ + public static void glStencilThenCoverFillPathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLenum") int fillMode, @NativeType("GLuint") int mask, @NativeType("GLenum") int coverMode, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") float[] transformValues) { + long __functionAddress = GL.getICD().glStencilThenCoverFillPathInstancedNV; + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(__functionAddress); + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + callPPV(numPaths, pathNameType, memAddress(paths), pathBase, fillMode, mask, coverMode, transformType, transformValues, __functionAddress); + } + + /** Array version of: {@link #glStencilThenCoverStrokePathInstancedNV StencilThenCoverStrokePathInstancedNV} */ + public static void glStencilThenCoverStrokePathInstancedNV(@NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLint") int reference, @NativeType("GLuint") int mask, @NativeType("GLenum") int coverMode, @NativeType("GLenum") int transformType, @NativeType("GLfloat const *") float[] transformValues) { + long __functionAddress = GL.getICD().glStencilThenCoverStrokePathInstancedNV; + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(__functionAddress); + check(transformValues, numPaths * transformTypeToElements(transformType)); + } + callPPV(numPaths, pathNameType, memAddress(paths), pathBase, reference, mask, coverMode, transformType, transformValues, __functionAddress); + } + + /** Array version of: {@link #glPathGlyphIndexRangeNV PathGlyphIndexRangeNV} */ + @NativeType("GLenum") + public static int glPathGlyphIndexRangeNV(@NativeType("GLenum") int fontTarget, @NativeType("void const *") ByteBuffer fontName, @NativeType("GLbitfield") int fontStyle, @NativeType("GLuint") int pathParameterTemplate, @NativeType("GLfloat") float emScale, @NativeType("GLuint *") int[] baseAndCount) { + long __functionAddress = GL.getICD().glPathGlyphIndexRangeNV; + if (CHECKS) { + check(__functionAddress); + checkNT1(fontName); + check(baseAndCount, 2); + } + return callPPI(fontTarget, memAddress(fontName), fontStyle, pathParameterTemplate, emScale, baseAndCount, __functionAddress); + } + + /** Array version of: {@link #glProgramPathFragmentInputGenNV ProgramPathFragmentInputGenNV} */ + public static void glProgramPathFragmentInputGenNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLenum") int genMode, @NativeType("GLint") int components, @NativeType("GLfloat const *") float[] coeffs) { + long __functionAddress = GL.getICD().glProgramPathFragmentInputGenNV; + if (CHECKS) { + check(__functionAddress); + check(coeffs, genModeToElements(genMode) * components); + } + callPV(program, location, genMode, components, coeffs, __functionAddress); + } + + /** Array version of: {@link #glGetPathParameterivNV GetPathParameterivNV} */ + public static void glGetPathParameterivNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] value) { + long __functionAddress = GL.getICD().glGetPathParameterivNV; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(path, pname, value, __functionAddress); + } + + /** Array version of: {@link #glGetPathParameterfvNV GetPathParameterfvNV} */ + public static void glGetPathParameterfvNV(@NativeType("GLuint") int path, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] value) { + long __functionAddress = GL.getICD().glGetPathParameterfvNV; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(path, pname, value, __functionAddress); + } + + /** Array version of: {@link #glGetPathCoordsNV GetPathCoordsNV} */ + public static void glGetPathCoordsNV(@NativeType("GLuint") int path, @NativeType("GLfloat *") float[] coords) { + long __functionAddress = GL.getICD().glGetPathCoordsNV; + if (CHECKS) { + check(__functionAddress); + if (DEBUG) { + check(coords, glGetPathParameteriNV(path, GL_PATH_COORD_COUNT_NV)); + } + } + callPV(path, coords, __functionAddress); + } + + /** Array version of: {@link #glGetPathDashArrayNV GetPathDashArrayNV} */ + public static void glGetPathDashArrayNV(@NativeType("GLuint") int path, @NativeType("GLfloat *") float[] dashArray) { + long __functionAddress = GL.getICD().glGetPathDashArrayNV; + if (CHECKS) { + check(__functionAddress); + if (DEBUG) { + check(dashArray, glGetPathParameteriNV(path, GL_PATH_DASH_ARRAY_COUNT_NV)); + } + } + callPV(path, dashArray, __functionAddress); + } + + /** Array version of: {@link #glGetPathMetricsNV GetPathMetricsNV} */ + public static void glGetPathMetricsNV(@NativeType("GLbitfield") int metricQueryMask, @NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLsizei") int stride, @NativeType("GLfloat *") float[] metrics) { + long __functionAddress = GL.getICD().glGetPathMetricsNV; + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(__functionAddress); + check(metrics, numPaths * (stride == 0 ? Integer.bitCount(metricQueryMask) : (stride >> 2))); + } + callPPV(metricQueryMask, numPaths, pathNameType, memAddress(paths), pathBase, stride, metrics, __functionAddress); + } + + /** Array version of: {@link #glGetPathMetricRangeNV GetPathMetricRangeNV} */ + public static void glGetPathMetricRangeNV(@NativeType("GLbitfield") int metricQueryMask, @NativeType("GLuint") int firstPathName, @NativeType("GLsizei") int numPaths, @NativeType("GLsizei") int stride, @NativeType("GLfloat *") float[] metrics) { + long __functionAddress = GL.getICD().glGetPathMetricRangeNV; + if (CHECKS) { + check(__functionAddress); + check(metrics, numPaths * (stride == 0 ? Integer.bitCount(metricQueryMask) : (stride >> 2))); + } + callPV(metricQueryMask, firstPathName, numPaths, stride, metrics, __functionAddress); + } + + /** Array version of: {@link #glGetPathSpacingNV GetPathSpacingNV} */ + public static void glGetPathSpacingNV(@NativeType("GLenum") int pathListMode, @NativeType("GLenum") int pathNameType, @NativeType("void const *") ByteBuffer paths, @NativeType("GLuint") int pathBase, @NativeType("GLfloat") float advanceScale, @NativeType("GLfloat") float kerningScale, @NativeType("GLenum") int transformType, @NativeType("GLfloat *") float[] returnedSpacing) { + long __functionAddress = GL.getICD().glGetPathSpacingNV; + int numPaths = paths.remaining() / pathNameTypeToBytes(pathNameType); + if (CHECKS) { + check(__functionAddress); + check(returnedSpacing, (numPaths - 1) * (transformType == GL_TRANSLATE_X_NV ? 1 : 2)); + } + callPPV(pathListMode, numPaths, pathNameType, memAddress(paths), pathBase, advanceScale, kerningScale, transformType, returnedSpacing, __functionAddress); + } + + /** Array version of: {@link #glGetPathColorGenivNV GetPathColorGenivNV} */ + public static void glGetPathColorGenivNV(@NativeType("GLenum") int color, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] value) { + long __functionAddress = GL.getICD().glGetPathColorGenivNV; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(color, pname, value, __functionAddress); + } + + /** Array version of: {@link #glGetPathColorGenfvNV GetPathColorGenfvNV} */ + public static void glGetPathColorGenfvNV(@NativeType("GLenum") int color, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] value) { + long __functionAddress = GL.getICD().glGetPathColorGenfvNV; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(color, pname, value, __functionAddress); + } + + /** Array version of: {@link #glGetPathTexGenivNV GetPathTexGenivNV} */ + public static void glGetPathTexGenivNV(@NativeType("GLenum") int texCoordSet, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] value) { + long __functionAddress = GL.getICD().glGetPathTexGenivNV; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(texCoordSet, pname, value, __functionAddress); + } + + /** Array version of: {@link #glGetPathTexGenfvNV GetPathTexGenfvNV} */ + public static void glGetPathTexGenfvNV(@NativeType("GLenum") int texCoordSet, @NativeType("GLenum") int pname, @NativeType("GLfloat *") float[] value) { + long __functionAddress = GL.getICD().glGetPathTexGenfvNV; + if (CHECKS) { + check(__functionAddress); + check(value, 1); + } + callPV(texCoordSet, pname, value, __functionAddress); + } + + /** Array version of: {@link #glPointAlongPathNV PointAlongPathNV} */ + @NativeType("GLboolean") + public static boolean glPointAlongPathNV(@NativeType("GLuint") int path, @NativeType("GLsizei") int startSegment, @NativeType("GLsizei") int numSegments, @NativeType("GLfloat") float distance, @Nullable @NativeType("GLfloat *") float[] x, @Nullable @NativeType("GLfloat *") float[] y, @Nullable @NativeType("GLfloat *") float[] tangentX, @Nullable @NativeType("GLfloat *") float[] tangentY) { + long __functionAddress = GL.getICD().glPointAlongPathNV; + if (CHECKS) { + check(__functionAddress); + checkSafe(x, 1); + checkSafe(y, 1); + checkSafe(tangentX, 1); + checkSafe(tangentY, 1); + } + return callPPPPZ(path, startSegment, numSegments, distance, x, y, tangentX, tangentY, __functionAddress); + } + + /** Array version of: {@link #glMatrixLoad3x2fNV MatrixLoad3x2fNV} */ + public static void glMatrixLoad3x2fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMatrixLoad3x2fNV; + if (CHECKS) { + check(__functionAddress); + check(m, 6); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glMatrixLoad3x3fNV MatrixLoad3x3fNV} */ + public static void glMatrixLoad3x3fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMatrixLoad3x3fNV; + if (CHECKS) { + check(__functionAddress); + check(m, 9); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glMatrixLoadTranspose3x3fNV MatrixLoadTranspose3x3fNV} */ + public static void glMatrixLoadTranspose3x3fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMatrixLoadTranspose3x3fNV; + if (CHECKS) { + check(__functionAddress); + check(m, 9); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glMatrixMult3x2fNV MatrixMult3x2fNV} */ + public static void glMatrixMult3x2fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMatrixMult3x2fNV; + if (CHECKS) { + check(__functionAddress); + check(m, 6); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glMatrixMult3x3fNV MatrixMult3x3fNV} */ + public static void glMatrixMult3x3fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMatrixMult3x3fNV; + if (CHECKS) { + check(__functionAddress); + check(m, 9); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glMatrixMultTranspose3x3fNV MatrixMultTranspose3x3fNV} */ + public static void glMatrixMultTranspose3x3fNV(@NativeType("GLenum") int matrixMode, @NativeType("GLfloat const *") float[] m) { + long __functionAddress = GL.getICD().glMatrixMultTranspose3x3fNV; + if (CHECKS) { + check(__functionAddress); + check(m, 9); + } + callPV(matrixMode, m, __functionAddress); + } + + /** Array version of: {@link #glGetProgramResourcefvNV GetProgramResourcefvNV} */ + public static void glGetProgramResourcefvNV(@NativeType("GLuint") int program, @NativeType("GLenum") int programInterface, @NativeType("GLuint") int index, @NativeType("GLenum const *") int[] props, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLfloat *") float[] params) { + long __functionAddress = GL.getICD().glGetProgramResourcefvNV; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + } + callPPPV(program, programInterface, index, props.length, props, params.length, length, params, __functionAddress); + } + + private static int charcodeTypeToBytes(int type) { + switch ( type ) { + case GL_UNSIGNED_BYTE: + case GL_UTF8_NV: + return 1; + case GL_UNSIGNED_SHORT: + case GL_2_BYTES_NV: + case GL_UTF16_NV: + return 2; + case GL_3_BYTES_NV: + return 3; + case GL_UNSIGNED_INT: + case GL_4_BYTES_NV: + return 4; + default: + throw new IllegalArgumentException(String.format("Unsupported charcode type: 0x%X", type)); + } + } + + private static int pathNameTypeToBytes(int type) { + switch ( type ) { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + case GL_UTF8_NV: + return 1; + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_2_BYTES_NV: + case GL_UTF16_NV: + return 2; + case GL_3_BYTES_NV: + return 3; + case GL_INT: + case GL_UNSIGNED_INT: + case GL_4_BYTES_NV: + return 4; + default: + throw new IllegalArgumentException(String.format("Unsupported path name type: 0x%X", type)); + } + } + + private static int transformTypeToElements(int type) { + switch ( type ) { + case GL_NONE: + return 0; + case GL_TRANSLATE_X_NV: + case GL_TRANSLATE_Y_NV: + return 1; + case GL_TRANSLATE_2D_NV: + return 2; + case GL_TRANSLATE_3D_NV: + return 3; + case GL_AFFINE_2D_NV: + case GL_TRANSPOSE_AFFINE_2D_NV: + return 6; + case GL_AFFINE_3D_NV: + case GL_TRANSPOSE_AFFINE_3D_NV: + return 12; + default: + throw new IllegalArgumentException(String.format("Unsupported transform type: 0x%X", type)); + } + } + + private static int colorFormatToComponents(int colorFormat) { + switch ( colorFormat ) { + case GL_LUMINANCE: + case GL_INTENSITY: + case GL_ALPHA: + return 1; + case GL_LUMINANCE_ALPHA: + return 2; + case GL_RGB: + return 3; + case GL_RGBA: + return 4; + default: + throw new IllegalArgumentException(String.format("Unsupported colorFormat specified: 0x%X", colorFormat)); + } + } + + private static int genModeToElements(int genMode) { + switch ( genMode ) { + case GL_NONE: + return 0; + case GL_CONSTANT_NV: + return 1; + case GL_OBJECT_LINEAR_NV: + case GL_PATH_OBJECT_BOUNDING_BOX_NV: + return 3; + case GL_EYE_LINEAR_NV: + return 4; + default: + throw new IllegalArgumentException(String.format("Unsupported genMode specified: 0x%X", genMode)); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPathRenderingSharedEdge.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPathRenderingSharedEdge.java new file mode 100644 index 000000000..8ff8750e1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPathRenderingSharedEdge.java @@ -0,0 +1,27 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_path_rendering_shared_edge extension. + * + *

    This extension introduces a new path command modifier to the NV_path_rendering extension to indicate that a path command represents an edge (either + * straight or curved) that is shared with another path.

    + * + *

    When used in conjunction with {@link NVFramebufferMixedSamples NV_framebuffer_mixed_samples}, a shared edge (or a whole path including shared edges) will use modified + * rasterization rules in order to ensure that groups of raster samples associated with a given coverage sample will all produce consistent coverage + * results, in order to avoid artifacts described further in the issues section at the end of this document.

    + * + *

    Requires {@link NVPathRendering NV_path_rendering}.

    + */ +public final class NVPathRenderingSharedEdge { + + /** Allowed to be added to command tokens in elements of the {@code commands} array parameter of PathCommandsNV and PathSubCommandsNV. */ + public static final int GL_SHARED_EDGE_NV = 0xC0; + + private NVPathRenderingSharedEdge() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPixelDataRange.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPixelDataRange.java new file mode 100644 index 000000000..4e0810cc6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPixelDataRange.java @@ -0,0 +1,87 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_pixel_data_range extension. + * + *

    The vertex array range extension is intended to improve the efficiency of OpenGL vertex arrays. OpenGL vertex arrays' coherency model and ability to + * access memory from arbitrary locations in memory prevented implementations from using DMA (Direct Memory Access) operations.

    + * + *

    Many image-intensive applications, such as those that use dynamically generated textures, face similar problems. These applications would like to be + * able to sustain throughputs of hundreds of millions of pixels per second through DrawPixels and hundreds of millions of texels per second through + * TexSubImage.

    + * + *

    However, the same restrictions that limited vertex throughput also limit pixel throughput.

    + * + *

    By the time that any pixel operation that reads data from user memory returns, OpenGL requires that it must be safe for the application to start using + * that memory for a different purpose. This coherency model prevents asynchronous DMA transfers directly out of the user's buffer.

    + * + *

    There are also no restrictions on the pointer provided to pixel operations or on the size of the data. To facilitate DMA implementations, the driver + * needs to know in advance what region of the address space to lock down.

    + * + *

    Vertex arrays faced both of these restrictions already, but pixel operations have one additional complicating factor -- they are bidirectional. Vertex + * array data is always being transfered from the application to the driver and the HW, whereas pixel operations sometimes transfer data to the + * application from the driver and HW. Note that the types of memory that are suitable for DMA for reading and writing purposes are often different. For + * example, on many PC platforms, DMA pulling is best accomplished with write-combined (uncached) AGP memory, while pushing data should use cached memory + * so that the application can read the data efficiently once it has been read back over the AGP bus.

    + * + *

    This extension defines an API where an application can specify two pixel data ranges, which are analogous to vertex array ranges, except that one is + * for operations where the application is reading data (e.g. glReadPixels) and one is for operations where the application is writing data (e.g. + * glDrawPixels, glTexSubImage2D, etc.). Each pixel data range has a pointer to its start and a length in bytes.

    + * + *

    When the pixel data range is enabled, and if the pointer specified as the argument to a pixel operation is inside the corresponding pixel data range, + * the implementation may choose to asynchronously pull data from the pixel data range or push data to the pixel data range. Data pulled from outside the + * pixel data range is undefined, while pushing data to outside the pixel data range produces undefined results.

    + * + *

    The application may synchronize with the hardware in one of two ways: by flushing the pixel data range (or causing an implicit flush) or by using the + * NV_fence extension to insert fences in the command stream.

    + */ +public class NVPixelDataRange { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameter of PixelDataRangeNV and FlushPixelDataRangeNV, and by the {@code cap} parameter of EnableClientState, + * DisableClientState, and IsEnabled. + */ + public static final int + GL_WRITE_PIXEL_DATA_RANGE_NV = 0x8878, + GL_READ_PIXEL_DATA_RANGE_NV = 0x8879; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV = 0x887A, + GL_READ_PIXEL_DATA_RANGE_LENGTH_NV = 0x887B; + + /** Accepted by the {@code pname} parameter of GetPointerv. */ + public static final int + GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV = 0x887C, + GL_READ_PIXEL_DATA_RANGE_POINTER_NV = 0x887D; + + protected NVPixelDataRange() { + throw new UnsupportedOperationException(); + } + + // --- [ glPixelDataRangeNV ] --- + + public static native void nglPixelDataRangeNV(int target, int length, long pointer); + + public static void glPixelDataRangeNV(@NativeType("GLenum") int target, @NativeType("void const *") ByteBuffer pointer) { + nglPixelDataRangeNV(target, pointer.remaining(), memAddress(pointer)); + } + + // --- [ glFlushPixelDataRangeNV ] --- + + public static native void glFlushPixelDataRangeNV(@NativeType("GLenum") int target); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPointSprite.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPointSprite.java new file mode 100644 index 000000000..54b89a922 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPointSprite.java @@ -0,0 +1,85 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_point_sprite extension. + * + *

    Applications such as particle systems usually must use OpenGL quads rather than points to render their geometry, since they would like to use a + * custom-drawn texture for each particle, rather than the traditional OpenGL round antialiased points, and each fragment in a point has the same texture + * coordinates as every other fragment.

    + * + *

    Unfortunately, specifying the geometry for these quads can be quite expensive, since it quadruples the amount of geometry required, and it may also + * require the application to do extra processing to compute the location of each vertex.

    + * + *

    The goal of this extension is to allow such apps to use points rather than quads. When {@link #GL_POINT_SPRITE_NV POINT_SPRITE_NV} is enabled, the state of point antialiasing + * is ignored. For each texture unit, the app can then specify whether to replace the existing texture coordinates with point sprite texture coordinates, + * which are interpolated across the point. Finally, the app can set a global parameter for the way to generate the R coordinate for point sprites; the R + * coordinate can either be zero, the input S coordinate, or the input R coordinate. This allows applications to use a 3D texture to represent a point + * sprite that goes through an animation, with filtering between frames, for example.

    + * + *

    Requires {@link EXTPointParameters EXT_point_parameters}.

    + */ +public class NVPointSprite { + + static { GL.initialize(); } + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of TexEnvi, TexEnviv, TexEnvf, TexEnvfv, GetTexEnviv, and GetTexEnvfv. + */ + public static final int GL_POINT_SPRITE_NV = 0x8861; + + /** + * When the {@code target} parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, GetTexEnvfv, or GetTexEnviv is POINT_SPRITE_NV, then the value of + * {@code pname} may be. + */ + public static final int GL_COORD_REPLACE_NV = 0x8862; + + /** + * Accepted by the {@code pname} parameter of PointParameteriNV, PointParameterfEXT, PointParameterivNV, PointParameterfvEXT, GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + public static final int GL_POINT_SPRITE_R_MODE_NV = 0x8863; + + protected NVPointSprite() { + throw new UnsupportedOperationException(); + } + + // --- [ glPointParameteriNV ] --- + + public static native void glPointParameteriNV(@NativeType("GLenum") int pname, @NativeType("GLint") int param); + + // --- [ glPointParameterivNV ] --- + + public static native void nglPointParameterivNV(int pname, long params); + + public static void glPointParameterivNV(@NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglPointParameterivNV(pname, memAddress(params)); + } + + /** Array version of: {@link #glPointParameterivNV PointParameterivNV} */ + public static void glPointParameterivNV(@NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glPointParameterivNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPrimitiveRestart.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPrimitiveRestart.java new file mode 100644 index 000000000..6d487f06c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPrimitiveRestart.java @@ -0,0 +1,52 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_primitive_restart extension. + * + *

    This extension allows applications to easily and inexpensively restart a primitive in its middle. A "primitive restart" is simply the same as an End + * command, followed by another Begin command with the same mode as the original. The typical expected use of this feature is to draw a mesh with many + * triangle strips, though primitive restarts are legal for all primitive types, even for points (where they are not useful).

    + * + *

    Although the EXT_multi_draw_arrays extension did reduce the overhead of such drawing techniques, they still remain more expensive than one would like.

    + * + *

    This extension provides an extremely lightweight primitive restart, which is accomplished by allowing the application to choose a special index number + * that signals that a primitive restart should occur, rather than a vertex being provoked. This index can be an arbitrary 32-bit integer for maximum + * application convenience.

    + * + *

    In addition, for full orthogonality, a special OpenGL command is provided to restart primitives when in immediate mode. This command is not likely to + * increase performance in any significant fashion, but providing it greatly simplifies the specification and implementation of display list compilation + * and indirect rendering.

    + */ +public class NVPrimitiveRestart { + + static { GL.initialize(); } + + /** + * Accepted by the {@code array} parameter of EnableClientState and DisableClientState, by the {@code cap} parameter of IsEnabled, and by the {@code pname} + * parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. + */ + public static final int GL_PRIMITIVE_RESTART_NV = 0x8558; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int GL_PRIMITIVE_RESTART_INDEX_NV = 0x8559; + + protected NVPrimitiveRestart() { + throw new UnsupportedOperationException(); + } + + // --- [ glPrimitiveRestartNV ] --- + + public static native void glPrimitiveRestartNV(); + + // --- [ glPrimitiveRestartIndexNV ] --- + + public static native void glPrimitiveRestartIndexNV(@NativeType("GLuint") int index); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPrimitiveShadingRate.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPrimitiveShadingRate.java new file mode 100644 index 000000000..c8565adda --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVPrimitiveShadingRate.java @@ -0,0 +1,39 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_primitive_shading_rate extension. + * + *

    This extension builds on top of the {@code NV_shading_rate_image} extension to provide OpenGL API support for using a per-primitive shading rate value + * to control the computation of the rate used to process each fragment.

    + * + *

    In the {@code NV_shading_rate_image} extension, the shading rate for each fragment produced by a primitive is determined by looking up a texel in the + * bound shading rate image and using that value as an index into a shading rate palette. That extension provides a separate shading rate image lookup + * enable and palette for each viewport. When a primitive is rasterized, the implementation uses the enable and palette associated with the primitive's + * viewport to determine the shading rate.

    + * + *

    This extension decouples the shading rate image enables and palettes from viewports. The number of enables/palettes now comes from the + * implementation-dependent constant {@link #GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV SHADING_RATE_IMAGE_PALETTE_COUNT_NV}. When {@code SHADING_RATE_IMAGE_PER_PRIMITIVE_NV} (added here) is enabled, the + * value of the new {@code gl_ShadingRateNV} built-in output is used to select an enable and palette to determine the shading rate. Otherwise, the + * viewport number for the primitive is used, as in {@code NV_shading_rate_image}.

    + * + *

    Requires {@link GL45 OpenGL 4.5} and {@link NVShadingRateImage NV_shading_rate_image}.

    + */ +public final class NVPrimitiveShadingRate { + + /** + * Accepted by the {@code cap} parameter of {@link CGL#CGLEnable Enable}, {@link CGL#CGLDisable Disable}, and {@link CGL#CGLIsEnabled IsEnabled} and by the {@code pname} parameter of {@link GL11C#glGetBooleanv GetBooleanv}, {@link GL11C#glGetIntegerv GetIntegerv}, + * {@link GL32C#glGetInteger64v GetInteger64v}, {@link GL11C#glGetFloatv GetFloatv}, {@link GL11C#glGetDoublev GetDoublev}. + */ + public static final int GL_SHADING_RATE_IMAGE_PER_PRIMITIVE_NV = 0x95B1; + + /** Accepted by the {@code pname} parameter of {@link GL11C#glGetBooleanv GetBooleanv}, {@link GL11C#glGetDoublev GetDoublev}, {@link GL11C#glGetIntegerv GetIntegerv}, and {@link GL11C#glGetFloatv GetFloatv}. */ + public static final int GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV = 0x95B2; + + private NVPrimitiveShadingRate() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVQueryResource.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVQueryResource.java new file mode 100644 index 000000000..9e460461f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVQueryResource.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_query_resource extension. + * + *

    OpenGL implementations manage the residence of textures, shaders, and other graphical objects in GPU accessible memory (whether in on-board video + * memory or addressable system memory is implementation dependent). With more insight into OpenGL's memory usage 1) applications could make educated + * decisions on better utilizing the limited GPU resources, 2) users could better optimize their workflow when working with multiple tools, and 3) + * administrators can make better decisions regarding resource allocation and system configurations.

    + * + *

    The purpose of this extension is to return a more detailed breakdown of memory usage in terms of the OpenGL objects residing in memory (textures, + * render buffers, buffer objects, system reserved objects, ...). This extension differs from GL_NVX_gpu_memory_info in that this extension returns + * detailed memory usage at the object level for video memory while the other extension only reports total vidmem usage.

    + * + *

    For the purposes of this specification the term vidmem refers to video memory resident on the graphics card that is directly accessible to the GPU at + * the highest performance level.

    + * + *

    Requires {@link GL20 OpenGL 2.0}.

    + */ +public class NVQueryResource { + + static { GL.initialize(); } + + /** Accepted by the {@code queryType} parameter of {@link #glQueryResourceNV QueryResourceNV}. */ + public static final int GL_QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV = 0x9540; + + /** New enums defined. */ + public static final int + GL_QUERY_RESOURCE_MEMTYPE_VIDMEM_NV = 0x9542, + GL_QUERY_RESOURCE_SYS_RESERVED_NV = 0x9544, + GL_QUERY_RESOURCE_TEXTURE_NV = 0x9545, + GL_QUERY_RESOURCE_RENDERBUFFER_NV = 0x9546, + GL_QUERY_RESOURCE_BUFFEROBJECT_NV = 0x9547; + + protected NVQueryResource() { + throw new UnsupportedOperationException(); + } + + // --- [ glQueryResourceNV ] --- + + /** Unsafe version of: {@link #glQueryResourceNV QueryResourceNV} */ + public static native int nglQueryResourceNV(int queryType, int pname, int bufSize, long buffer); + + /** @param queryType must be:
    {@link #GL_QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV}
    */ + @NativeType("GLint") + public static int glQueryResourceNV(@NativeType("GLenum") int queryType, @NativeType("GLint") int pname, @NativeType("GLint *") IntBuffer buffer) { + return nglQueryResourceNV(queryType, pname, buffer.remaining(), memAddress(buffer)); + } + + /** Array version of: {@link #glQueryResourceNV QueryResourceNV} */ + @NativeType("GLint") + public static int glQueryResourceNV(@NativeType("GLenum") int queryType, @NativeType("GLint") int pname, @NativeType("GLint *") int[] buffer) { + long __functionAddress = GL.getICD().glQueryResourceNV; + if (CHECKS) { + check(__functionAddress); + } + return callPI(queryType, pname, buffer.length, buffer, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVQueryResourceTag.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVQueryResourceTag.java new file mode 100644 index 000000000..4180383f7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVQueryResourceTag.java @@ -0,0 +1,112 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_query_resource_tag extension. + * + *

    This extension adds the capability to associate a tag with one or more memory resource allocations. This tag can be reported back during + * {@code queryResource} operations and also be used to limit resource reporting to only those allocations with the specified tag. A tag is a previously + * reserved id and an optional text string.

    + * + *

    Requires {@link GL20 OpenGL 2.0} and {@link NVQueryResource NV_query_resource}.

    + */ +public class NVQueryResourceTag { + + static { GL.initialize(); } + + protected NVQueryResourceTag() { + throw new UnsupportedOperationException(); + } + + // --- [ glGenQueryResourceTagNV ] --- + + public static native void nglGenQueryResourceTagNV(int n, long tagIds); + + public static void glGenQueryResourceTagNV(@NativeType("GLuint *") IntBuffer tagIds) { + nglGenQueryResourceTagNV(tagIds.remaining(), memAddress(tagIds)); + } + + @NativeType("void") + public static int glGenQueryResourceTagNV() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer tagIds = stack.callocInt(1); + nglGenQueryResourceTagNV(1, memAddress(tagIds)); + return tagIds.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glDeleteQueryResourceTagNV ] --- + + public static native void nglDeleteQueryResourceTagNV(int n, long tagIds); + + public static void glDeleteQueryResourceTagNV(@NativeType("GLuint const *") IntBuffer tagIds) { + nglDeleteQueryResourceTagNV(tagIds.remaining(), memAddress(tagIds)); + } + + public static void glDeleteQueryResourceTagNV(@NativeType("GLuint const *") int tagId) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer tagIds = stack.ints(tagId); + nglDeleteQueryResourceTagNV(1, memAddress(tagIds)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glQueryResourceTagNV ] --- + + public static native void nglQueryResourceTagNV(int tagId, long tagString); + + public static void glQueryResourceTagNV(@NativeType("GLuint") int tagId, @NativeType("GLchar const *") ByteBuffer tagString) { + if (CHECKS) { + checkNT1(tagString); + } + nglQueryResourceTagNV(tagId, memAddress(tagString)); + } + + public static void glQueryResourceTagNV(@NativeType("GLuint") int tagId, @NativeType("GLchar const *") CharSequence tagString) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(tagString, true); + long tagStringEncoded = stack.getPointerAddress(); + nglQueryResourceTagNV(tagId, tagStringEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glGenQueryResourceTagNV GenQueryResourceTagNV} */ + public static void glGenQueryResourceTagNV(@NativeType("GLuint *") int[] tagIds) { + long __functionAddress = GL.getICD().glGenQueryResourceTagNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(tagIds.length, tagIds, __functionAddress); + } + + /** Array version of: {@link #glDeleteQueryResourceTagNV DeleteQueryResourceTagNV} */ + public static void glDeleteQueryResourceTagNV(@NativeType("GLuint const *") int[] tagIds) { + long __functionAddress = GL.getICD().glDeleteQueryResourceTagNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(tagIds.length, tagIds, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVRepresentativeFragmentTest.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVRepresentativeFragmentTest.java new file mode 100644 index 000000000..271924a38 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVRepresentativeFragmentTest.java @@ -0,0 +1,38 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_representative_fragment_test extension. + * + *

    This extension provides a new representative fragment test that allows implementations to reduce the amount of rasterization and fragment + * processing work performed for each point, line, or triangle primitive. For any primitive that produces one or more fragments that pass all other early + * fragment tests, the implementation is permitted to choose one or more "representative" fragments for processing and discard all other fragments. For + * draw calls rendering multiple points, lines, or triangles arranged in lists, strips, or fans, the representative fragment test is performed + * independently for each of those primitives.

    + * + *

    This extension is useful for applications that use an early render pass to determine the full set of primitives that would be visible in the final + * scene. In this render pass, such applications would set up a fragment shader that enables early fragment tests and writes to an image or shader storage + * buffer to record the ID of the primitive that generated the fragment. Without this extension, the shader would record the ID separately for each + * visible fragment of each primitive. With this extension, fewer stores will be performed, particularly for large primitives.

    + * + *

    The representative fragment test has no effect if early fragment tests are not enabled via the fragment shader. The set of fragments discarded by the + * representative fragment test is implementation-dependent and may vary from frame to frame. In some cases, the representative fragment test may not + * discard any fragments for a given primitive.

    + * + *

    Requires {@link GL45 OpenGL 4.5}.

    + */ +public final class NVRepresentativeFragmentTest { + + /** + * Accepted by the {@code cap} parameter of {@link CGL#CGLEnable Enable}, {@link CGL#CGLDisable Disable}, and {@link CGL#CGLIsEnabled IsEnabled}, and by the {@code pname} parameter of {@link GL11C#glGetBooleanv GetBooleanv}, {@link GL11C#glGetIntegerv GetIntegerv}, + * {@link GL11C#glGetFloatv GetFloatv}, and {@link GL11C#glGetDoublev GetDoublev}. + */ + public static final int GL_REPRESENTATIVE_FRAGMENT_TEST_NV = 0x937F; + + private NVRepresentativeFragmentTest() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVRobustnessVideoMemoryPurge.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVRobustnessVideoMemoryPurge.java new file mode 100644 index 000000000..102532be6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVRobustnessVideoMemoryPurge.java @@ -0,0 +1,32 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_robustness_video_memory_purge extension. + * + *

    This extension allows applications to be notified when video memory has been purged.

    + * + *

    The NVIDIA OpenGL driver architecture on Linux has a limitation: resources located in video memory are not persistent across certain events. VT + * switches, suspend/resume events, and mode switching events may erase the contents of video memory. Any resource that is located exclusively in video + * memory, such as framebuffer objects (FBOs), will be lost. As the OpenGL specification makes no mention of events where the video memory is allowed to + * be cleared, the driver attempts to hide this fact from the application, but cannot do it for all resources.

    + * + *

    This extension provides a way for applications to discover when video memory content has been lost, so that the application can re-populate the video + * memory content as necessary.

    + * + *

    This extension will have a limited lifespan, as planned architectural evolutions in the NVIDIA Linux driver stack will allow video memory to be + * persistent. Any driver that exposes this extension is a driver that considers video memory to be volatile. Once the driver stack has been improved, the + * extension will no longer be exposed.

    + */ +public final class NVRobustnessVideoMemoryPurge { + + /** Returned by GetGraphicsResetStatusARB, in addition to other tokens defined in ARB_robustness. */ + public static final int GL_PURGED_CONTEXT_RESET_NV = 0x92BB; + + private NVRobustnessVideoMemoryPurge() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVSampleLocations.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVSampleLocations.java new file mode 100644 index 000000000..174e7ea7f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVSampleLocations.java @@ -0,0 +1,129 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_sample_locations extension. + * + *

    This extension allows an application to modify the locations of samples within a pixel used in multisample rasterization. Additionally, it allows + * applications to specify different sample locations for each pixel in a group of adjacent pixels, which may increase antialiasing quality (particularly + * if a custom resolve shader is used that takes advantage of these different locations).

    + * + *

    It is common for implementations to optimize the storage of depth values by storing values that can be used to reconstruct depth at each sample + * location, rather than storing separate depth values for each sample. For example, the depth values from a single triangle can be represented using + * plane equations. When the depth value for a sample is needed, it is automatically evaluated at the sample location. Modifying the sample locations + * causes the reconstruction to no longer evaluate the same depth values as when the samples were originally generated. This extension provides a command + * to "resolve" and store per-sample depth values using the currently programmed sample locations, which allows the application to manage this issue + * if/when necessary.

    + * + *

    The programmable sample locations are used during rasterization and for evaluation of depth functions during normal geometric rendering. The + * programmable locations are associated with a framebuffer object rather than an individual depth buffer, so if the depth buffer is used as a texture the + * texture sampling may be done at the standard sample locations. Additionally, commands that do not render geometric primitives (e.g. ReadPixels, + * BlitFramebuffer, CopyTexSubImage2D, etc.) may use the standard sample locations to resolve depth functions rather than the programmable locations. If a + * single depth buffer is used at different times with different sample locations, the depth functions may be interpreted using the current sample + * locations.

    + */ +public class NVSampleLocations { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev. */ + public static final int + GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV = 0x933D, + GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV = 0x933E, + GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV = 0x933F, + GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV = 0x9340; + + /** Accepted by the {@code pname} parameter of GetMultisamplefv. */ + public static final int + GL_SAMPLE_LOCATION_NV = 0x8E50, + GL_PROGRAMMABLE_SAMPLE_LOCATION_NV = 0x9341; + + /** Accepted by the {@code pname} parameter of FramebufferParameteri, GetFramebufferParameteriv. */ + public static final int + GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV = 0x9342, + GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV = 0x9343; + + protected NVSampleLocations() { + throw new UnsupportedOperationException(); + } + + // --- [ glFramebufferSampleLocationsfvNV ] --- + + /** + * Unsafe version of: {@link #glFramebufferSampleLocationsfvNV FramebufferSampleLocationsfvNV} + * + * @param count the number of sample locations to modify + */ + public static native void nglFramebufferSampleLocationsfvNV(int target, int start, int count, long v); + + /** + * Updates the programmable sample locations + * + * @param target the framebuffer whose programmable sample locations are modified + * @param start the index of the first sample location to modify + * @param v a pair of floating point values in the range [0,1] for each sample location + */ + public static void glFramebufferSampleLocationsfvNV(@NativeType("GLenum") int target, @NativeType("GLuint") int start, @NativeType("GLfloat const *") FloatBuffer v) { + nglFramebufferSampleLocationsfvNV(target, start, v.remaining() >> 1, memAddress(v)); + } + + // --- [ glNamedFramebufferSampleLocationsfvNV ] --- + + /** + * Unsafe version of: {@link #glNamedFramebufferSampleLocationsfvNV NamedFramebufferSampleLocationsfvNV} + * + * @param count the number of sample locations to modify + */ + public static native void nglNamedFramebufferSampleLocationsfvNV(int framebuffer, int start, int count, long v); + + /** + * Updates the programmable sample locations + * + * @param framebuffer the framebuffer whose programmable sample locations are modified + * @param start the index of the first sample location to modify + * @param v a pair of floating point values in the range [0,1] for each sample location + */ + public static void glNamedFramebufferSampleLocationsfvNV(@NativeType("GLuint") int framebuffer, @NativeType("GLuint") int start, @NativeType("GLfloat const *") FloatBuffer v) { + nglNamedFramebufferSampleLocationsfvNV(framebuffer, start, v.remaining() >> 1, memAddress(v)); + } + + // --- [ glResolveDepthValuesNV ] --- + + /** + * Evaluates depth values for all samples in the current depth buffer (subject to the pixel ownership and scissor tests) and stores each value in the + * depth buffer. This can be used to ensure that later accesses will use depth values consistent with the sample locations used when the samples were + * generated. If the current framebuffer has no depth buffer, ResolveDepthValuesNV will have no effect. + */ + public static native void glResolveDepthValuesNV(); + + /** Array version of: {@link #glFramebufferSampleLocationsfvNV FramebufferSampleLocationsfvNV} */ + public static void glFramebufferSampleLocationsfvNV(@NativeType("GLenum") int target, @NativeType("GLuint") int start, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glFramebufferSampleLocationsfvNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(target, start, v.length >> 1, v, __functionAddress); + } + + /** Array version of: {@link #glNamedFramebufferSampleLocationsfvNV NamedFramebufferSampleLocationsfvNV} */ + public static void glNamedFramebufferSampleLocationsfvNV(@NativeType("GLuint") int framebuffer, @NativeType("GLuint") int start, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glNamedFramebufferSampleLocationsfvNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(framebuffer, start, v.length >> 1, v, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVScissorExclusive.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVScissorExclusive.java new file mode 100644 index 000000000..9292d8b5d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVScissorExclusive.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_scissor_exclusive extension. + * + *

    In unextended OpenGL, applications can enable a per-viewport scissor test ({@link GL11#GL_SCISSOR_TEST SCISSOR_TEST}) where fragments are discarded if their (x,y) coordinates lie + * outside the corresponding scissor rectangle. In this extension, we provide a separate per-viewport exclusive scissor test, where fragments are + * discarded if their (x,y) coordinates lie inside the corresponding exclusive scissor rectangle.

    + * + *

    The regular (inclusive) scissor test and exclusive scissor test are orthogonal; applications can enable either or both tests for each viewport. If both + * tests are enabled, fragments will be discarded unless their (x,y) coordinates are both inside the regular scissor rectangle and outside the exclusive + * scissor rectangle.

    + * + *

    Requires {@link GL45 OpenGL 4.5}.

    + */ +public class NVScissorExclusive { + + static { GL.initialize(); } + + /** + * Accepted by the {@code cap} parameter of {@link CGL#CGLEnable Enable}, {@link CGL#CGLDisable Disable}, and {@link CGL#CGLIsEnabled IsEnabled}, by the {@code target} parameter of {@link GL30C#glEnablei Enablei}, {@link GL30C#glDisablei Disablei}, + * {@link GL30C#glIsEnabledi IsEnabledi}, {@link EXTDrawBuffers2#glEnableIndexedEXT EnableIndexedEXT}, {@link EXTDrawBuffers2#glDisableIndexedEXT DisableIndexedEXT}, and {@link EXTDrawBuffers2#glIsEnabledIndexedEXT IsEnabledIndexedEXT}, and by the {@code pname} parameter of {@link GL11C#glGetBooleanv GetBooleanv}, + * {@link GL11C#glGetIntegerv GetIntegerv}, {@link GL32C#glGetInteger64v GetInteger64v}, {@link GL11C#glGetFloatv GetFloatv}, {@link GL11C#glGetDoublev GetDoublev}, {@link EXTDirectStateAccess#glGetDoubleIndexedvEXT GetDoubleIndexedvEXT}, {@link GL30C#glGetBooleani_v GetBooleani_v}, {@link GL30C#glGetIntegeri_v GetIntegeri_v}, {@link GL32C#glGetInteger64i_v GetInteger64i_v}, + * {@link GL41C#glGetFloati_v GetFloati_v}, {@link GL41C#glGetDoublei_v GetDoublei_v}, {@link EXTDrawBuffers2#glGetBooleanIndexedvEXT GetBooleanIndexedvEXT}, {@link EXTDrawBuffers2#glGetIntegerIndexedvEXT GetIntegerIndexedvEXT}, and {@link EXTDirectStateAccess#glGetFloatIndexedvEXT GetFloatIndexedvEXT}. + */ + public static final int GL_SCISSOR_TEST_EXCLUSIVE_NV = 0x9555; + + /** + * Accepted by the {@code pname} parameter of {@link GL11C#glGetBooleanv GetBooleanv}, {@link GL11C#glGetIntegerv GetIntegerv}, {@link GL32C#glGetInteger64v GetInteger64v}, {@link GL11C#glGetFloatv GetFloatv}, {@link GL11C#glGetDoublev GetDoublev}, {@link GL30C#glGetBooleani_v GetBooleani_v}, + * {@link GL30C#glGetIntegeri_v GetIntegeri_v}, {@link GL32C#glGetInteger64i_v GetInteger64i_v}, {@link GL41C#glGetFloati_v GetFloati_v}, {@link GL41C#glGetDoublei_v GetDoublei_v}, {@link EXTDirectStateAccess#glGetDoubleIndexedvEXT GetDoubleIndexedvEXT}, {@link EXTDrawBuffers2#glGetBooleanIndexedvEXT GetBooleanIndexedvEXT}, {@link EXTDrawBuffers2#glGetIntegerIndexedvEXT GetIntegerIndexedvEXT}, and + * {@link EXTDirectStateAccess#glGetFloatIndexedvEXT GetFloatIndexedvEXT}. + */ + public static final int GL_SCISSOR_BOX_EXCLUSIVE_NV = 0x9556; + + protected NVScissorExclusive() { + throw new UnsupportedOperationException(); + } + + // --- [ glScissorExclusiveArrayvNV ] --- + + public static native void nglScissorExclusiveArrayvNV(int first, int count, long v); + + public static void glScissorExclusiveArrayvNV(@NativeType("GLuint") int first, @NativeType("GLint const *") IntBuffer v) { + nglScissorExclusiveArrayvNV(first, v.remaining() >> 2, memAddress(v)); + } + + // --- [ glScissorExclusiveNV ] --- + + public static native void glScissorExclusiveNV(@NativeType("GLint") int x, @NativeType("GLint") int y, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height); + + /** Array version of: {@link #glScissorExclusiveArrayvNV ScissorExclusiveArrayvNV} */ + public static void glScissorExclusiveArrayvNV(@NativeType("GLuint") int first, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glScissorExclusiveArrayvNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(first, v.length >> 2, v, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderBufferLoad.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderBufferLoad.java new file mode 100644 index 000000000..063ea90c7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderBufferLoad.java @@ -0,0 +1,307 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_shader_buffer_load extension. + * + *

    At a very coarse level, GL has evolved in a way that allows applications to replace many of the original state machine variables with blocks of + * user-defined data. For example, the current vertex state has been augmented by vertex buffer objects, fixed-function shading state and parameters have + * been replaced by shaders/programs and constant buffers, etc. Applications switch between coarse sets of state by binding objects to the context or to + * other container objects (e.g. vertex array objects) instead of manipulating state variables of the context. In terms of the number of GL commands + * required to draw an object, modern applications are orders of magnitude more efficient than legacy applications, but this explosion of objects bound to + * other objects has led to a new bottleneck - pointer chasing and CPU L2 cache misses in the driver, and general L2 cache pollution.

    + * + *

    This extension provides a mechanism to read from a flat, 64-bit GPU address space from programs/shaders, to query GPU addresses of buffer objects at the + * API level, and to bind buffer objects to the context in such a way that they can be accessed via their GPU addresses in any shader stage.

    + * + *

    The intent is that applications can avoid re-binding buffer objects or updating constants between each Draw call and instead simply use a VertexAttrib + * (or TexCoord, or InstanceID, or...) to "point" to the new object's state. In this way, one of the cheapest "state" updates (from the CPU's point of + * view) can be used to effect a significant state change in the shader similarly to how a pointer change may on the CPU. At the same time, this relieves + * the limits on how many buffer objects can be accessed at once by shaders, and allows these buffer object accesses to be exposed as C-style pointer + * dereferences in the shading language.

    + * + *

    As a very simple example, imagine packing a group of similar objects' constants into a single buffer object and pointing your program at object + * <i> by setting {@code glVertexAttribI1iEXT(attrLoc, i);} and using a shader as such:

    + * + *
    
    + * struct MyObjectType {
    + *     mat4x4 modelView;
    + *     vec4 materialPropertyX;
    + *     // etc.
    + * };
    + * uniform MyObjectType *allObjects;
    + * in int objectID; // bound to attrLoc
    + * 
    + * ...
    + * 
    + * mat4x4 thisObjectsMatrix = allObjects[objectID].modelView;
    + * // do transform, shading, etc.
    + * + *

    This is beneficial in much the same way that texture arrays allow choosing between similar, but independent, texture maps with a single coordinate + * identifying which slice of the texture to use. It also resembles instancing, where a lightweight change (incrementing the instance ID) can be used to + * generate a different and interesting result, but with additional flexibility over instancing because the values are app-controlled and not a single incrementing counter.

    + * + *

    Dependent pointer fetches are allowed, so more complex scene graph structures can be built into buffer objects providing significant new flexibility in + * the use of shaders. Another simple example, showing something you can't do with existing functionality, is to do dependent fetches into many buffer + * objects:

    + * + *
    
    + * GenBuffers(N, dataBuffers);
    + * GenBuffers(1, &pointerBuffer);
    + * 
    + * GLuint64EXT gpuAddrs[N];
    + * for (i = 0; i < N; ++i) {
    + *     BindBuffer(target, dataBuffers[i]);
    + *     BufferData(target, size[i], myData[i], STATIC_DRAW);
    + * 
    + *     // get the address of this buffer and make it resident.
    + *     GetBufferParameterui64vNV(target, BUFFER_GPU_ADDRESS,
    + *                               gpuaddrs[i]);
    + *     MakeBufferResidentNV(target, READ_ONLY);
    + * }
    + * 
    + * GLuint64EXT pointerBufferAddr;
    + * BindBuffer(target, pointerBuffer);
    + * BufferData(target, sizeof(GLuint64EXT)*N, gpuAddrs, STATIC_DRAW);
    + * GetBufferParameterui64vNV(target, BUFFER_GPU_ADDRESS,
    + *                           &pointerBufferAddr);
    + * MakeBufferResidentNV(target, READ_ONLY);
    + * 
    + * // now in the shader, we can use a double indirection
    + * vec4 **ptrToBuffers = pointerBufferAddr;
    + * vec4 *ptrToBufferI = ptrToBuffers[i];
    + * + *

    This allows simultaneous access to more buffers than {@link EXTBindableUniform EXT_bindable_uniform} ({@link EXTBindableUniform#GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT MAX_VERTEX_BINDABLE_UNIFORMS_EXT}, etc.) and each can be larger than + * {@link EXTBindableUniform#GL_MAX_BINDABLE_UNIFORM_SIZE_EXT MAX_BINDABLE_UNIFORM_SIZE_EXT}.

    + */ +public class NVShaderBufferLoad { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetBufferParameterui64vNV, GetNamedBufferParameterui64vNV. */ + public static final int GL_BUFFER_GPU_ADDRESS_NV = 0x8F1D; + + /** Returned by the {@code type} parameter of GetActiveUniform. */ + public static final int GL_GPU_ADDRESS_NV = 0x8F34; + + /** Accepted by the {@code value} parameter of GetIntegerui64vNV. */ + public static final int GL_MAX_SHADER_BUFFER_ADDRESS_NV = 0x8F35; + + protected NVShaderBufferLoad() { + throw new UnsupportedOperationException(); + } + + // --- [ glMakeBufferResidentNV ] --- + + public static native void glMakeBufferResidentNV(@NativeType("GLenum") int target, @NativeType("GLenum") int access); + + // --- [ glMakeBufferNonResidentNV ] --- + + public static native void glMakeBufferNonResidentNV(@NativeType("GLenum") int target); + + // --- [ glIsBufferResidentNV ] --- + + @NativeType("GLboolean") + public static native boolean glIsBufferResidentNV(@NativeType("GLenum") int target); + + // --- [ glMakeNamedBufferResidentNV ] --- + + public static native void glMakeNamedBufferResidentNV(@NativeType("GLuint") int buffer, @NativeType("GLenum") int access); + + // --- [ glMakeNamedBufferNonResidentNV ] --- + + public static native void glMakeNamedBufferNonResidentNV(@NativeType("GLuint") int buffer); + + // --- [ glIsNamedBufferResidentNV ] --- + + @NativeType("GLboolean") + public static native boolean glIsNamedBufferResidentNV(@NativeType("GLuint") int buffer); + + // --- [ glGetBufferParameterui64vNV ] --- + + public static native void nglGetBufferParameterui64vNV(int target, int pname, long params); + + public static void glGetBufferParameterui64vNV(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint64EXT *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetBufferParameterui64vNV(target, pname, memAddress(params)); + } + + @NativeType("void") + public static long glGetBufferParameterui64NV(@NativeType("GLenum") int target, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetBufferParameterui64vNV(target, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetNamedBufferParameterui64vNV ] --- + + public static native void nglGetNamedBufferParameterui64vNV(int buffer, int pname, long params); + + public static void glGetNamedBufferParameterui64vNV(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLuint64EXT *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetNamedBufferParameterui64vNV(buffer, pname, memAddress(params)); + } + + @NativeType("void") + public static long glGetNamedBufferParameterui64NV(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetNamedBufferParameterui64vNV(buffer, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetIntegerui64vNV ] --- + + public static native void nglGetIntegerui64vNV(int value, long result); + + public static void glGetIntegerui64vNV(@NativeType("GLenum") int value, @NativeType("GLuint64EXT *") LongBuffer result) { + if (CHECKS) { + check(result, 1); + } + nglGetIntegerui64vNV(value, memAddress(result)); + } + + @NativeType("void") + public static long glGetIntegerui64NV(@NativeType("GLenum") int value) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer result = stack.callocLong(1); + nglGetIntegerui64vNV(value, memAddress(result)); + return result.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glUniformui64NV ] --- + + public static native void glUniformui64NV(@NativeType("GLint") int location, @NativeType("GLuint64EXT") long value); + + // --- [ glUniformui64vNV ] --- + + public static native void nglUniformui64vNV(int location, int count, long value); + + public static void glUniformui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + nglUniformui64vNV(location, value.remaining(), memAddress(value)); + } + + // --- [ glGetUniformui64vNV ] --- + + public static native void nglGetUniformui64vNV(int program, int location, long params); + + public static void glGetUniformui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetUniformui64vNV(program, location, memAddress(params)); + } + + @NativeType("void") + public static long glGetUniformui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetUniformui64vNV(program, location, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glProgramUniformui64NV ] --- + + public static native void glProgramUniformui64NV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT") long value); + + // --- [ glProgramUniformui64vNV ] --- + + public static native void nglProgramUniformui64vNV(int program, int location, int count, long value); + + public static void glProgramUniformui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") LongBuffer value) { + nglProgramUniformui64vNV(program, location, value.remaining(), memAddress(value)); + } + + /** Array version of: {@link #glGetBufferParameterui64vNV GetBufferParameterui64vNV} */ + public static void glGetBufferParameterui64vNV(@NativeType("GLenum") int target, @NativeType("GLenum") int pname, @NativeType("GLuint64EXT *") long[] params) { + long __functionAddress = GL.getICD().glGetBufferParameterui64vNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(target, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetNamedBufferParameterui64vNV GetNamedBufferParameterui64vNV} */ + public static void glGetNamedBufferParameterui64vNV(@NativeType("GLuint") int buffer, @NativeType("GLenum") int pname, @NativeType("GLuint64EXT *") long[] params) { + long __functionAddress = GL.getICD().glGetNamedBufferParameterui64vNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(buffer, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetIntegerui64vNV GetIntegerui64vNV} */ + public static void glGetIntegerui64vNV(@NativeType("GLenum") int value, @NativeType("GLuint64EXT *") long[] result) { + long __functionAddress = GL.getICD().glGetIntegerui64vNV; + if (CHECKS) { + check(__functionAddress); + check(result, 1); + } + callPV(value, result, __functionAddress); + } + + /** Array version of: {@link #glUniformui64vNV Uniformui64vNV} */ + public static void glUniformui64vNV(@NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glUniformui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(location, value.length, value, __functionAddress); + } + + /** Array version of: {@link #glGetUniformui64vNV GetUniformui64vNV} */ + public static void glGetUniformui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT *") long[] params) { + long __functionAddress = GL.getICD().glGetUniformui64vNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(program, location, params, __functionAddress); + } + + /** Array version of: {@link #glProgramUniformui64vNV ProgramUniformui64vNV} */ + public static void glProgramUniformui64vNV(@NativeType("GLuint") int program, @NativeType("GLint") int location, @NativeType("GLuint64EXT const *") long[] value) { + long __functionAddress = GL.getICD().glProgramUniformui64vNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, location, value.length, value, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderBufferStore.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderBufferStore.java new file mode 100644 index 000000000..cb0f796b0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderBufferStore.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_shader_buffer_store extension. + * + *

    This extension builds upon the mechanisms added by the NV_shader_buffer_load extension to allow shaders to perform random-access + * reads to buffer object memory without using dedicated buffer object binding points. Instead, it allowed an application to make a buffer + * object resident, query a GPU address (pointer) for the buffer object, and then use that address as a pointer in shader code. This approach allows + * shaders to access a large number of buffer objects without needing to repeatedly bind buffers to a limited number of fixed-functionality binding + * points.

    + * + *

    Requires {@link GL30 OpenGL 3.0}, GLSL 1.30, {@link NVShaderBufferLoad NV_shader_buffer_load}, NV_gpu_program5 and/or {@link NVGPUShader5 NV_gpu_shader5}.

    + */ +public final class NVShaderBufferStore { + + /** Accepted by the {@code barriers} parameter of MemoryBarrierNV. */ + public static final int GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV = 0x10; + + private NVShaderBufferStore() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderSubgroupPartitioned.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderSubgroupPartitioned.java new file mode 100644 index 000000000..17277acf4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderSubgroupPartitioned.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_shader_subgroup_partitioned extension. + * + *

    This extension enables support for the {@code NV_shader_subgroup_partitioned} shading language extension in OpenGL.

    + * + *

    This extension adds a new {@link #GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV SUBGROUP_FEATURE_PARTITIONED_BIT_NV} feature bit that is returned by queryies for {@link KHRShaderSubgroup#GL_SUBGROUP_SUPPORTED_FEATURES_KHR SUBGROUP_SUPPORTED_FEATURES_KHR}.

    + * + *

    In OpenGL implementations supporting SPIR-V, this extension enables support for the {@code SPV_NV_shader_subgroup_partitioned} extension.

    + * + *

    Requires {@link GL43 OpenGL 4.3} and {@link KHRShaderSubgroup KHR_shader_subgroup}.

    + */ +public final class NVShaderSubgroupPartitioned { + + /** Returned as bitfield in the {@code data} argument when {@link GL11C#glGetIntegerv GetIntegerv} is queried with a {@code pname} of {@link KHRShaderSubgroup#GL_SUBGROUP_SUPPORTED_FEATURES_KHR SUBGROUP_SUPPORTED_FEATURES_KHR}. */ + public static final int GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV = 0x100; + + private NVShaderSubgroupPartitioned() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderThreadGroup.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderThreadGroup.java new file mode 100644 index 000000000..3579376eb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShaderThreadGroup.java @@ -0,0 +1,27 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_shader_thread_group extension. + * + *

    Implementations of the OpenGL Shading Language may, but are not required to, run multiple shader threads for a single stage as a SIMD thread group, + * where individual execution threads are assigned to thread groups in an undefined, implementation-dependent order. This extension provides a set of new + * features to the OpenGL Shading Language to query thread states and to share data between fragments within a 2x2 pixel quad.

    + * + *

    Requires {@link GL43 OpenGL 4.3}.

    + */ +public final class NVShaderThreadGroup { + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_WARP_SIZE_NV = 0x9339, + GL_WARPS_PER_SM_NV = 0x933A, + GL_SM_COUNT_NV = 0x933B; + + private NVShaderThreadGroup() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShadingRateImage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShadingRateImage.java new file mode 100644 index 000000000..a9f78ad7f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVShadingRateImage.java @@ -0,0 +1,180 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_shading_rate_image extension. + * + *

    By default, OpenGL runs a fragment shader once for each pixel covered by a primitive being rasterized. When using multisampling, the outputs of that + * fragment shader are broadcast to each covered sample of the fragment's pixel. When using multisampling, applications can also request that the fragment + * shader be run once per color sample (when using the {@code "sample"} qualifier on one or more active fragment shader inputs), or run a fixed number of + * times per pixel using {@link GL40#GL_SAMPLE_SHADING SAMPLE_SHADING} enable and the {@link GL40C#glMinSampleShading MinSampleShading} frequency value. In all of these approaches, the number of fragment shader + * invocations per pixel is fixed, based on API state.

    + * + *

    This extension allows applications to bind and enable a shading rate image that can be used to vary the number of fragment shader invocations across + * the framebuffer. This can be useful for applications like eye tracking for virtual reality, where the portion of the framebuffer that the user is + * looking at directly can be processed at high frequency, while distant corners of the image can be processed at lower frequency. The shading rate image + * is an immutable-format two-dimensional or two-dimensional array texture that uses a format of {@link GL30#GL_R8UI R8UI}. Each texel represents a fixed-size rectangle in + * the framebuffer, covering 16x16 pixels in the initial implementation of this extension. When rasterizing a primitive covering one of these rectangles, + * the OpenGL implementation reads the texel in the bound shading rate image and looks up the fetched value in a palette of shading rates. The shading + * rate used can vary from (finest) 16 fragment shader invocations per pixel to (coarsest) one fragment shader invocation for each 4x4 block of pixels.

    + * + *

    When this extension is advertised by an OpenGL implementation, the implementation must also support the GLSL extension + * {@code "GL_NV_shading_rate_image"} (documented separately), which provides new built-in variables that allow fragment shaders to determine the + * effective shading rate used for each fragment. Additionally, the GLSL extension also provides new layout qualifiers allowing the interlock + * functionality provided by ARB_fragment_shader_interlock to guarantee mutual exclusion across an entire fragment when the shading rate specifies + * multiple pixels per fragment shader invocation.

    + * + *

    Note that this extension requires the use of a framebuffer object; the shading rate image and related state are ignored when rendering to the default + * framebuffer.

    + * + *

    Requires {@link GL45 OpenGL 4.5} and {@link NVFramebufferMixedSamples NV_framebuffer_mixed_samples}.

    + */ +public class NVShadingRateImage { + + static { GL.initialize(); } + + /** + * Accepted by the {@code cap} parameter of {@link CGL#CGLEnable Enable}, {@link CGL#CGLDisable Disable}, and {@link CGL#CGLIsEnabled IsEnabled}, by the {@code target} parameter of {@link GL30C#glEnablei Enablei}, {@link GL30C#glDisablei Disablei}, + * {@link GL30C#glIsEnabledi IsEnabledi}, {@link EXTDrawBuffers2#glEnableIndexedEXT EnableIndexedEXT}, {@link EXTDrawBuffers2#glDisableIndexedEXT DisableIndexedEXT}, and {@link EXTDrawBuffers2#glIsEnabledIndexedEXT IsEnabledIndexedEXT}, and by the {@code pname} parameter of {@link GL11C#glGetBooleanv GetBooleanv}, + * {@link GL11C#glGetIntegerv GetIntegerv}, {@link GL32C#glGetInteger64v GetInteger64v}, {@link GL11C#glGetFloatv GetFloatv}, {@link GL11C#glGetDoublev GetDoublev}, {@link EXTDirectStateAccess#glGetDoubleIndexedvEXT GetDoubleIndexedvEXT}, {@link GL30C#glGetBooleani_v GetBooleani_v}, {@link GL30C#glGetIntegeri_v GetIntegeri_v}, {@link GL32C#glGetInteger64i_v GetInteger64i_v}, + * {@link GL41C#glGetFloati_v GetFloati_v}, {@link GL41C#glGetDoublei_v GetDoublei_v}, {@link EXTDrawBuffers2#glGetBooleanIndexedvEXT GetBooleanIndexedvEXT}, {@link EXTDrawBuffers2#glGetIntegerIndexedvEXT GetIntegerIndexedvEXT}, and {@link EXTDirectStateAccess#glGetFloatIndexedvEXT GetFloatIndexedvEXT}. + */ + public static final int GL_SHADING_RATE_IMAGE_NV = 0x9563; + + /** + * Accepted in the {@code rates} parameter of {@link #glShadingRateImagePaletteNV ShadingRateImagePaletteNV} and the {@code rate} parameter of {@link #glShadingRateSampleOrderCustomNV ShadingRateSampleOrderCustomNV} and + * {@link #glGetShadingRateSampleLocationivNV GetShadingRateSampleLocationivNV}; returned in the {@code rate} parameter of {@link #glGetShadingRateImagePaletteNV GetShadingRateImagePaletteNV}. + */ + public static final int + GL_SHADING_RATE_NO_INVOCATIONS_NV = 0x9564, + GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV = 0x9565, + GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV = 0x9566, + GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV = 0x9567, + GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV = 0x9568, + GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV = 0x9569, + GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV = 0x956A, + GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV = 0x956B, + GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV = 0x956C, + GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV = 0x956D, + GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV = 0x956E, + GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV = 0x956F; + + /** Accepted by the {@code pname} parameter of {@link GL11C#glGetBooleanv GetBooleanv}, {@link GL11C#glGetDoublev GetDoublev}, {@link GL11C#glGetIntegerv GetIntegerv}, and {@link GL11C#glGetFloatv GetFloatv}. */ + public static final int + GL_SHADING_RATE_IMAGE_BINDING_NV = 0x955B, + GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV = 0x955C, + GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV = 0x955D, + GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV = 0x955E, + GL_MAX_COARSE_FRAGMENT_SAMPLES_NV = 0x955F; + + /** Accepted by the {@code order} parameter of {@link #glShadingRateSampleOrderNV ShadingRateSampleOrderNV}. */ + public static final int + GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV = 0x95AE, + GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV = 0x95AF, + GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV = 0x95B0; + + protected NVShadingRateImage() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindShadingRateImageNV ] --- + + public static native void glBindShadingRateImageNV(@NativeType("GLuint") int texture); + + // --- [ glShadingRateImagePaletteNV ] --- + + public static native void nglShadingRateImagePaletteNV(int viewport, int first, int count, long rates); + + public static void glShadingRateImagePaletteNV(@NativeType("GLuint") int viewport, @NativeType("GLuint") int first, @NativeType("GLenum const *") IntBuffer rates) { + nglShadingRateImagePaletteNV(viewport, first, rates.remaining(), memAddress(rates)); + } + + // --- [ glGetShadingRateImagePaletteNV ] --- + + public static native void nglGetShadingRateImagePaletteNV(int viewport, int entry, long rate); + + public static void glGetShadingRateImagePaletteNV(@NativeType("GLuint") int viewport, @NativeType("GLuint") int entry, @NativeType("GLenum *") IntBuffer rate) { + if (CHECKS) { + check(rate, 1); + } + nglGetShadingRateImagePaletteNV(viewport, entry, memAddress(rate)); + } + + // --- [ glShadingRateImageBarrierNV ] --- + + public static native void glShadingRateImageBarrierNV(@NativeType("GLboolean") boolean synchronize); + + // --- [ glShadingRateSampleOrderNV ] --- + + public static native void glShadingRateSampleOrderNV(@NativeType("GLenum") int order); + + // --- [ glShadingRateSampleOrderCustomNV ] --- + + public static native void nglShadingRateSampleOrderCustomNV(int rate, int samples, long locations); + + public static void glShadingRateSampleOrderCustomNV(@NativeType("GLenum") int rate, @NativeType("GLuint") int samples, @NativeType("GLint const *") IntBuffer locations) { + nglShadingRateSampleOrderCustomNV(rate, samples, memAddress(locations)); + } + + // --- [ glGetShadingRateSampleLocationivNV ] --- + + public static native void nglGetShadingRateSampleLocationivNV(int rate, int samples, int index, long location); + + public static void glGetShadingRateSampleLocationivNV(@NativeType("GLenum") int rate, @NativeType("GLuint") int samples, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer location) { + if (CHECKS) { + check(location, 3); + } + nglGetShadingRateSampleLocationivNV(rate, samples, index, memAddress(location)); + } + + /** Array version of: {@link #glShadingRateImagePaletteNV ShadingRateImagePaletteNV} */ + public static void glShadingRateImagePaletteNV(@NativeType("GLuint") int viewport, @NativeType("GLuint") int first, @NativeType("GLenum const *") int[] rates) { + long __functionAddress = GL.getICD().glShadingRateImagePaletteNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(viewport, first, rates.length, rates, __functionAddress); + } + + /** Array version of: {@link #glGetShadingRateImagePaletteNV GetShadingRateImagePaletteNV} */ + public static void glGetShadingRateImagePaletteNV(@NativeType("GLuint") int viewport, @NativeType("GLuint") int entry, @NativeType("GLenum *") int[] rate) { + long __functionAddress = GL.getICD().glGetShadingRateImagePaletteNV; + if (CHECKS) { + check(__functionAddress); + check(rate, 1); + } + callPV(viewport, entry, rate, __functionAddress); + } + + /** Array version of: {@link #glShadingRateSampleOrderCustomNV ShadingRateSampleOrderCustomNV} */ + public static void glShadingRateSampleOrderCustomNV(@NativeType("GLenum") int rate, @NativeType("GLuint") int samples, @NativeType("GLint const *") int[] locations) { + long __functionAddress = GL.getICD().glShadingRateSampleOrderCustomNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(rate, samples, locations, __functionAddress); + } + + /** Array version of: {@link #glGetShadingRateSampleLocationivNV GetShadingRateSampleLocationivNV} */ + public static void glGetShadingRateSampleLocationivNV(@NativeType("GLenum") int rate, @NativeType("GLuint") int samples, @NativeType("GLuint") int index, @NativeType("GLint *") int[] location) { + long __functionAddress = GL.getICD().glGetShadingRateSampleLocationivNV; + if (CHECKS) { + check(__functionAddress); + check(location, 3); + } + callPV(rate, samples, index, location, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTexgenReflection.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTexgenReflection.java new file mode 100644 index 000000000..c21e42910 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTexgenReflection.java @@ -0,0 +1,22 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_texgen_reflection extension. + * + *

    This extension provides two new texture coordinate generation modes that are useful texture-based lighting and environment mapping.

    + */ +public final class NVTexgenReflection { + + /** Accepted by the {@code param} parameter of TexGend, TexGenf, TexGeni when {@code pname} parameter is TEXTURE_GEN_MODE */ + public static final int + GL_NORMAL_MAP_NV = 0x8511, + GL_REFLECTION_MAP_NV = 0x8512; + + private NVTexgenReflection() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureBarrier.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureBarrier.java new file mode 100644 index 000000000..8a610605a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureBarrier.java @@ -0,0 +1,28 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_texture_barrier extension. + * + *

    This extension relaxes the restrictions on rendering to a currently bound texture and provides a mechanism to avoid read-after-write hazards.

    + */ +public class NVTextureBarrier { + + static { GL.initialize(); } + + protected NVTextureBarrier() { + throw new UnsupportedOperationException(); + } + + // --- [ glTextureBarrierNV ] --- + + /** Guarantees that writes have completed and caches have been invalidated before subsequent Draws are executed. */ + public static native void glTextureBarrierNV(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureMultisample.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureMultisample.java new file mode 100644 index 000000000..cc1111d19 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureMultisample.java @@ -0,0 +1,55 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_texture_multisample extension. + * + *

    This specification extends NV_gpu_program4 to support per-sample fetching from multisample textures described in + * {@link ARBTextureMultisample ARB_texture_multisample}.

    + * + *

    Requires {@link GL20 OpenGL 2.0}, {@link ARBTextureMultisample ARB_texture_multisample}.

    + */ +public class NVTextureMultisample { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of GetTexLevelParameter. */ + public static final int + GL_TEXTURE_COVERAGE_SAMPLES_NV = 0x9045, + GL_TEXTURE_COLOR_SAMPLES_NV = 0x9046; + + protected NVTextureMultisample() { + throw new UnsupportedOperationException(); + } + + // --- [ glTexImage2DMultisampleCoverageNV ] --- + + public static native void glTexImage2DMultisampleCoverageNV(@NativeType("GLenum") int target, @NativeType("GLsizei") int coverageSamples, @NativeType("GLsizei") int colorSamples, @NativeType("GLint") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedSampleLocations); + + // --- [ glTexImage3DMultisampleCoverageNV ] --- + + public static native void glTexImage3DMultisampleCoverageNV(@NativeType("GLenum") int target, @NativeType("GLsizei") int coverageSamples, @NativeType("GLsizei") int colorSamples, @NativeType("GLint") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedSampleLocations); + + // --- [ glTextureImage2DMultisampleNV ] --- + + public static native void glTextureImage2DMultisampleNV(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLint") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedSampleLocations); + + // --- [ glTextureImage3DMultisampleNV ] --- + + public static native void glTextureImage3DMultisampleNV(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int samples, @NativeType("GLint") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedSampleLocations); + + // --- [ glTextureImage2DMultisampleCoverageNV ] --- + + public static native void glTextureImage2DMultisampleCoverageNV(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int coverageSamples, @NativeType("GLsizei") int colorSamples, @NativeType("GLint") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLboolean") boolean fixedSampleLocations); + + // --- [ glTextureImage3DMultisampleCoverageNV ] --- + + public static native void glTextureImage3DMultisampleCoverageNV(@NativeType("GLuint") int texture, @NativeType("GLenum") int target, @NativeType("GLsizei") int coverageSamples, @NativeType("GLsizei") int colorSamples, @NativeType("GLint") int internalFormat, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth, @NativeType("GLboolean") boolean fixedSampleLocations); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader.java new file mode 100644 index 000000000..64594dc4d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader.java @@ -0,0 +1,162 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_texture_shader extension. + * + *

    Standard OpenGL and the ARB_multitexture extension define a straightforward direct mechanism for mapping sets of texture coordinates to filtered + * colors. This extension provides a more functional mechanism.

    + * + *

    OpenGL's standard texturing mechanism defines a set of texture targets. Each texture target defines how the texture image is specified and accessed via + * a set of texture coordinates. OpenGL 1.0 defines the 1D and 2D texture targets. OpenGL 1.2 (and/or the EXT_texture3D extension) defines the 3D texture + * target. The ARB_texture_cube_map extension defines the cube map texture target. Each texture unit's texture coordinate set is mapped to a color using + * the unit's highest priority enabled texture target.

    + * + *

    This extension introduces texture shader stages. A sequence of texture shader stages provides a more flexible mechanism for mapping sets of texture + * coordinates to texture unit RGBA results than standard OpenGL.

    + * + *

    When the texture shader enable is on, the extension replaces the conventional OpenGL mechanism for mapping sets of texture coordinates to filtered + * colors with this extension's sequence of texture shader stages.

    + * + *

    Each texture shader stage runs one of 21 canned texture shader programs. These programs support conventional OpenGL texture mapping but also support + * dependent texture accesses, dot product texture programs, and special modes. (3D texture mapping texture shader operations are NOT provided by this + * extension; 3D texture mapping texture shader operations are added by the NV_texture_shader2 extension that is layered on this extension. See the + * NV_texture_shader2 specification.)

    + * + *

    To facilitate the new texture shader programs, this extension introduces several new texture formats and variations on existing formats. Existing color + * texture formats are extended by introducing new signed variants. Two new types of texture formats (beyond colors) are also introduced. Texture offset + * groups encode two signed offsets, and optionally a magnitude or a magnitude and an intensity. The new HILO (pronounced high-low) formats provide + * possibly signed, high precision (16-bit) two-component textures.

    + * + *

    Each program takes as input the stage's interpolated texture coordinate set (s,t,r,q). Each program generates two results: a shader stage result that + * may be used as an input to subsequent shader stage programs, and a texture unit RGBA result that becomes the texture color used by the texture unit's + * texture environment function or becomes the initial value for the corresponding texture register for register combiners. The texture unit RGBA result + * is always an RGBA color, but the shader stage result may be one of an RGBA color, a HILO value, a texture offset group, a floating-point value, or an + * invalid result. When both results are RGBA colors, the shader stage result and the texture unit RGBA result are usually identical (though not in all + * cases).

    + * + *

    Additionally, certain programs have a side-effect such as culling the fragment or replacing the fragment's depth value.

    + * + *

    Requires {@link ARBMultitexture ARB_multitexture} and {@link ARBTextureCubeMap ARB_texture_cube_map}.

    + */ +public final class NVTextureShader { + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the {@code target} parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, GetTexEnvfv, and GetTexEnviv. + */ + public static final int GL_TEXTURE_SHADER_NV = 0x86DE; + + /** + * When the {@code target} parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, GetTexEnvfv, and GetTexEnviv is TEXTURE_SHADER_NV, then the value of + * {@code pname} may be. + */ + public static final int + GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV = 0x86D9, + GL_SHADER_OPERATION_NV = 0x86DF, + GL_OFFSET_TEXTURE_SCALE_NV = 0x86E2, + GL_OFFSET_TEXTURE_BIAS_NV = 0x86E3, + GL_PREVIOUS_TEXTURE_INPUT_NV = 0x86E4; + + /** When the {@code target} parameter of TexEnvfv, TexEnviv, GetTexEnvfv, and GetTexEnviv is TEXTURE_SHADER_NV, then the value of {@code pname} may be. */ + public static final int + GL_CULL_MODES_NV = 0x86E0, + GL_OFFSET_TEXTURE_MATRIX_NV = 0x86E1, + GL_CONST_EYE_NV = 0x86E5; + + /** When the {@code target} parameter GetTexEnvfv and GetTexEnviv is TEXTURE_SHADER_NV, then the value of {@code pname} may be. */ + public static final int GL_SHADER_CONSISTENT_NV = 0x86DD; + + /** + * When the {@code target} and {@code pname} parameters of TexEnvf, TexEnvfv, TexEnvi, and TexEnviv are TEXTURE_SHADER_NV and SHADER_OPERATION_NV + * respectively, then the value of {@code param} or the value pointed to by {@code params} may be. + */ + public static final int + GL_PASS_THROUGH_NV = 0x86E6, + GL_CULL_FRAGMENT_NV = 0x86E7, + GL_OFFSET_TEXTURE_2D_NV = 0x86E8, + GL_OFFSET_TEXTURE_RECTANGLE_NV = 0x864C, + GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV = 0x864D, + GL_DEPENDENT_AR_TEXTURE_2D_NV = 0x86E9, + GL_DEPENDENT_GB_TEXTURE_2D_NV = 0x86EA, + GL_DOT_PRODUCT_NV = 0x86EC, + GL_DOT_PRODUCT_DEPTH_REPLACE_NV = 0x86ED, + GL_DOT_PRODUCT_TEXTURE_2D_NV = 0x86EE, + GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV = 0x864E, + GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV = 0x86F0, + GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV = 0x86F1, + GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV = 0x86F2, + GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV = 0x86F3; + + /** Accepted by the {@code format} parameter of GetTexImage, TexImage1D, TexImage2D, TexSubImage1D, and TexSubImage2D. */ + public static final int + GL_HILO_NV = 0x86F4, + GL_DSDT_NV = 0x86F5, + GL_DSDT_MAG_NV = 0x86F6, + GL_DSDT_MAG_VIB_NV = 0x86F7; + + /** Accepted by the {@code type} parameter of GetTexImage, TexImage1D, TexImage2D, TexSubImage1D, and TexSubImage2D. */ + public static final int + GL_UNSIGNED_INT_S8_S8_8_8_NV = 0x86DA, + GL_UNSIGNED_INT_8_8_S8_S8_REV_NV = 0x86DB; + + /** Accepted by the {@code internalformat} parameter of CopyTexImage1D, CopyTexImage2D, TexImage1D, and TexImage2D. */ + public static final int + GL_SIGNED_RGBA_NV = 0x86FB, + GL_SIGNED_RGBA8_NV = 0x86FC, + GL_SIGNED_RGB_NV = 0x86FE, + GL_SIGNED_RGB8_NV = 0x86FF, + GL_SIGNED_LUMINANCE_NV = 0x8701, + GL_SIGNED_LUMINANCE8_NV = 0x8702, + GL_SIGNED_LUMINANCE_ALPHA_NV = 0x8703, + GL_SIGNED_LUMINANCE8_ALPHA8_NV = 0x8704, + GL_SIGNED_ALPHA_NV = 0x8705, + GL_SIGNED_ALPHA8_NV = 0x8706, + GL_SIGNED_INTENSITY_NV = 0x8707, + GL_SIGNED_INTENSITY8_NV = 0x8708, + GL_SIGNED_RGB_UNSIGNED_ALPHA_NV = 0x870C, + GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV = 0x870D; + + /** Accepted by the {@code internalformat} parameter of TexImage1D and TexImage2D. */ + public static final int + GL_HILO16_NV = 0x86F8, + GL_SIGNED_HILO_NV = 0x86F9, + GL_SIGNED_HILO16_NV = 0x86FA, + GL_DSDT8_NV = 0x8709, + GL_DSDT8_MAG8_NV = 0x870A, + GL_DSDT_MAG_INTENSITY_NV = 0x86DC, + GL_DSDT8_MAG8_INTENSITY8_NV = 0x870B; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, PixelTransferf, and PixelTransferi. */ + public static final int + GL_HI_SCALE_NV = 0x870E, + GL_LO_SCALE_NV = 0x870F, + GL_DS_SCALE_NV = 0x8710, + GL_DT_SCALE_NV = 0x8711, + GL_MAGNITUDE_SCALE_NV = 0x8712, + GL_VIBRANCE_SCALE_NV = 0x8713, + GL_HI_BIAS_NV = 0x8714, + GL_LO_BIAS_NV = 0x8715, + GL_DS_BIAS_NV = 0x8716, + GL_DT_BIAS_NV = 0x8717, + GL_MAGNITUDE_BIAS_NV = 0x8718, + GL_VIBRANCE_BIAS_NV = 0x8719; + + /** Accepted by the {@code pname} parameter of TexParameteriv, TexParameterfv, GetTexParameterfv and GetTexParameteriv. */ + public static final int GL_TEXTURE_BORDER_VALUES_NV = 0x871A; + + /** Accepted by the {@code pname} parameter of GetTexLevelParameterfv and GetTexLevelParameteriv. */ + public static final int + GL_TEXTURE_HI_SIZE_NV = 0x871B, + GL_TEXTURE_LO_SIZE_NV = 0x871C, + GL_TEXTURE_DS_SIZE_NV = 0x871D, + GL_TEXTURE_DT_SIZE_NV = 0x871E, + GL_TEXTURE_MAG_SIZE_NV = 0x871F; + + private NVTextureShader() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader2.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader2.java new file mode 100644 index 000000000..2ff9038c9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader2.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_texture_shader2 extension. + * + *

    This extension extends the {@code NV_texture_shader} functionality to support texture shader operations for 3D textures.

    + * + *

    Requires {@link NVTextureShader NV_texture_shader}.

    + */ +public final class NVTextureShader2 { + + /** + * When the {@code target} and {@code pname} parameters of TexEnvf, TexEnvfv, TexEnvi, and TexEnviv are TEXTURE_SHADER_NV and SHADER_OPERATION_NV + * respectively, then the value of {@code param} or the value pointed to by {@code params} may be. + */ + public static final int GL_DOT_PRODUCT_TEXTURE_3D_NV = 0x86EF; + + private NVTextureShader2() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader3.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader3.java new file mode 100644 index 000000000..781bfef27 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTextureShader3.java @@ -0,0 +1,52 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_texture_shader3 extension. + * + *

    {@code NV_texture_shader3} extends the {@code NV_texture_shader} functionality by adding several new texture shader operations, extending several + * existing texture shader operations, adding a new {@code HILO8} internal format, and adding new and more flexible re-mapping modes for dot product and + * dependent texture shader operations.

    + * + *

    Requires {@link NVTextureShader NV_texture_shader} and {@link NVTextureShader2 NV_texture_shader2}.

    + */ +public final class NVTextureShader3 { + + /** + * When the {@code target} and {@code pname} parameters of TexEnvf, TexEnvfv, TexEnvi, and TexEnviv are TEXTURE_SHADER_NV and SHADER_OPERATION_NV + * respectively, then the value of {@code param} or the value pointed to by {@code params} may be. + */ + public static final int + GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV = 0x8850, + GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV = 0x8851, + GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV = 0x8852, + GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV = 0x8853, + GL_OFFSET_HILO_TEXTURE_2D_NV = 0x8854, + GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV = 0x8855, + GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV = 0x8856, + GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV = 0x8857, + GL_DEPENDENT_HILO_TEXTURE_2D_NV = 0x8858, + GL_DEPENDENT_RGB_TEXTURE_3D_NV = 0x8859, + GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV = 0x885A, + GL_DOT_PRODUCT_PASS_THROUGH_NV = 0x885B, + GL_DOT_PRODUCT_TEXTURE_1D_NV = 0x885C, + GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV = 0x885D; + + /** Accepted by the {@code internalformat} parameter of TexImage1D, TexImage2D, and TexImage3D. */ + public static final int + GL_HILO8_NV = 0x885E, + GL_SIGNED_HILO8_NV = 0x885F; + + /** + * When the {@code target} and {@code pname} parameters of TexEnvf, TexEnvfv, TexEnvi, and TexEnviv are TEXTURE_SHADER_NV and + * RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV respectively, then the value of {@code param} or the value pointed to by {@code params} may be. + */ + public static final int GL_FORCE_BLUE_TO_ONE_NV = 0x8860; + + private NVTextureShader3() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTimelineSemaphore.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTimelineSemaphore.java new file mode 100644 index 000000000..86c56de14 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTimelineSemaphore.java @@ -0,0 +1,119 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_timeline_semaphore extension. + * + *

    The Vulkan API introduces the concept of timeline semaphores. This extension brings those concepts to the OpenGL API by adding a semaphore type to the + * semaphore object. In OpenGL, timeline semaphore signal and wait operations are similar to the corresponding operations on imported Direct3D 12 fences + * defined in EXT_external_objects_win32.

    + * + *

    Requires {@link EXTSemaphore EXT_semaphore} or a version of OpenGL that incorporates it.

    + */ +public class NVTimelineSemaphore { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of SemaphoreParameterivNV and GetSemaphoreParameterivNV. */ + public static final int GL_SEMAPHORE_TYPE_NV = 0x95B3; + + /** Accepted by the {@code param} parameter of SemaphoreParameterivNV and GetSemaphoreParameterivNV when {@code pname} parameter is SEMAPHORE_TYPE_NV. */ + public static final int + GL_SEMAPHORE_TYPE_BINARY_NV = 0x95B4, + GL_SEMAPHORE_TYPE_TIMELINE_NV = 0x95B5; + + /** Accepted by the {@code pname} parameter of SemaphoreParameterui64vNV and GetSemaphoreParameterui64vNV. */ + public static final int GL_TIMELINE_SEMAPHORE_VALUE_NV = 0x9595; + + /** Accepted by the {@code pname} parameter to GetIntegerv, GetFloatv, GetDoublev, GetInteger64v, and GetBooleanv. */ + public static final int GL_MAX_TIMELINE_SEMAPHORE_VALUE_DIFFERENCE_NV = 0x95B6; + + protected NVTimelineSemaphore() { + throw new UnsupportedOperationException(); + } + + // --- [ glCreateSemaphoresNV ] --- + + public static native void nglCreateSemaphoresNV(int n, long semaphores); + + public static void glCreateSemaphoresNV(@NativeType("GLuint *") IntBuffer semaphores) { + nglCreateSemaphoresNV(semaphores.remaining(), memAddress(semaphores)); + } + + @NativeType("void") + public static int glCreateSemaphoresNV() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer semaphores = stack.callocInt(1); + nglCreateSemaphoresNV(1, memAddress(semaphores)); + return semaphores.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glSemaphoreParameterivNV ] --- + + public static native void nglSemaphoreParameterivNV(int semaphore, int pname, long params); + + public static void glSemaphoreParameterivNV(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int pname, @NativeType("GLint const *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglSemaphoreParameterivNV(semaphore, pname, memAddress(params)); + } + + // --- [ glGetSemaphoreParameterivNV ] --- + + public static native void nglGetSemaphoreParameterivNV(int semaphore, int pname, long params); + + public static void glGetSemaphoreParameterivNV(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int pname, @NativeType("GLint *") IntBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetSemaphoreParameterivNV(semaphore, pname, memAddress(params)); + } + + /** Array version of: {@link #glCreateSemaphoresNV CreateSemaphoresNV} */ + public static void glCreateSemaphoresNV(@NativeType("GLuint *") int[] semaphores) { + long __functionAddress = GL.getICD().glCreateSemaphoresNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(semaphores.length, semaphores, __functionAddress); + } + + /** Array version of: {@link #glSemaphoreParameterivNV SemaphoreParameterivNV} */ + public static void glSemaphoreParameterivNV(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int pname, @NativeType("GLint const *") int[] params) { + long __functionAddress = GL.getICD().glSemaphoreParameterivNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(semaphore, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetSemaphoreParameterivNV GetSemaphoreParameterivNV} */ + public static void glGetSemaphoreParameterivNV(@NativeType("GLuint") int semaphore, @NativeType("GLenum") int pname, @NativeType("GLint *") int[] params) { + long __functionAddress = GL.getICD().glGetSemaphoreParameterivNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(semaphore, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTransformFeedback.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTransformFeedback.java new file mode 100644 index 000000000..51222b68f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTransformFeedback.java @@ -0,0 +1,287 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_transform_feedback extension. + * + *

    This extension provides a new mode to the GL, called transform feedback, which records vertex attributes of the primitives processed by the GL. The + * selected attributes are written into buffer objects, and can be written with each attribute in a separate buffer object or with all attributes + * interleaved into a single buffer object. If a geometry program or shader is active, the primitives recorded are those emitted by the geometry program. + * Otherwise, transform feedback captures primitives whose vertex are transformed by a vertex program or shader, or by fixed-function vertex processing. + * In either case, the primitives captured are those generated prior to clipping. Transform feedback mode is capable of capturing transformed vertex data + * generated by fixed-function vertex processing, outputs from assembly vertex or geometry programs, or varying variables emitted from GLSL vertex or + * geometry shaders.

    + * + *

    The vertex data recorded in transform feedback mode is stored into buffer objects as an array of vertex attributes. The regular representation and the + * use of buffer objects allows the recorded data to be processed directly by the GL without requiring CPU intervention to copy data. In particular, + * transform feedback data can be used for vertex arrays (via vertex buffer objects), as the source for pixel data (via pixel buffer objects), as program + * constant data (via the NV_parameter_buffer_object or EXT_bindable_uniform extension), or via any other extension that makes use of buffer objects.

    + * + *

    This extension introduces new query object support to allow transform feedback mode to operate asynchronously. Query objects allow applications to + * determine when transform feedback results are complete, as well as the number of primitives processed and written back to buffer objects while in + * transform feedback mode. This extension also provides a new rasterizer discard enable, which allows applications to use transform feedback to capture + * vertex attributes without rendering anything.

    + * + *

    Requires {@link GL15 OpenGL 1.5}.

    + */ +public class NVTransformFeedback { + + static { GL.initialize(); } + + /** + * Accepted by the {@code target} parameters of BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, GetBufferPointerv, + * BindBufferRangeNV, BindBufferOffsetNV and BindBufferBaseNV. + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_NV = 0x8C8E; + + /** Accepted by the {@code param} parameter of GetIntegerIndexedvEXT and GetBooleanIndexedvEXT. */ + public static final int + GL_TRANSFORM_FEEDBACK_BUFFER_START_NV = 0x8C84, + GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV = 0x8C85, + GL_TRANSFORM_FEEDBACK_RECORD_NV = 0x8C86; + + /** + * Accepted by the {@code param} parameter of GetIntegerIndexedvEXT and GetBooleanIndexedvEXT, and by the {@code pname} parameter of GetBooleanv, + * GetDoublev, GetIntegerv, and GetFloatv. + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV = 0x8C8F; + + /** Accepted by the {@code bufferMode} parameter of TransformFeedbackAttribsNV and TransformFeedbackVaryingsNV. */ + public static final int + GL_INTERLEAVED_ATTRIBS_NV = 0x8C8C, + GL_SEPARATE_ATTRIBS_NV = 0x8C8D; + + /** Accepted by the {@code target} parameter of BeginQuery, EndQuery, and GetQueryiv. */ + public static final int + GL_PRIMITIVES_GENERATED_NV = 0x8C87, + GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV = 0x8C88; + + /** + * Accepted by the {@code cap} parameter of Enable, Disable, and IsEnabled, and by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev. + */ + public static final int GL_RASTERIZER_DISCARD_NV = 0x8C89; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV = 0x8C8A, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV = 0x8C8B, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV = 0x8C80, + GL_TRANSFORM_FEEDBACK_ATTRIBS_NV = 0x8C7E; + + /** Accepted by the {@code pname} parameter of GetProgramiv. */ + public static final int + GL_ACTIVE_VARYINGS_NV = 0x8C81, + GL_ACTIVE_VARYING_MAX_LENGTH_NV = 0x8C82, + GL_TRANSFORM_FEEDBACK_VARYINGS_NV = 0x8C83; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, GetFloatv, and GetProgramiv. */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV = 0x8C7F; + + /** Accepted by the {@code attribs} parameter of TransformFeedbackAttribsNV. */ + public static final int + GL_BACK_PRIMARY_COLOR_NV = 0x8C77, + GL_BACK_SECONDARY_COLOR_NV = 0x8C78, + GL_TEXTURE_COORD_NV = 0x8C79, + GL_CLIP_DISTANCE_NV = 0x8C7A, + GL_VERTEX_ID_NV = 0x8C7B, + GL_PRIMITIVE_ID_NV = 0x8C7C, + GL_GENERIC_ATTRIB_NV = 0x8C7D, + GL_SECONDARY_COLOR_NV = 0x852D, + GL_LAYER_NV = 0x8DAA; + + protected NVTransformFeedback() { + throw new UnsupportedOperationException(); + } + + // --- [ glBeginTransformFeedbackNV ] --- + + public static native void glBeginTransformFeedbackNV(@NativeType("GLenum") int primitiveMode); + + // --- [ glEndTransformFeedbackNV ] --- + + public static native void glEndTransformFeedbackNV(); + + // --- [ glTransformFeedbackAttribsNV ] --- + + public static native void nglTransformFeedbackAttribsNV(int count, long attribs, int bufferMode); + + public static void glTransformFeedbackAttribsNV(@NativeType("GLint const *") IntBuffer attribs, @NativeType("GLenum") int bufferMode) { + nglTransformFeedbackAttribsNV(attribs.remaining(), memAddress(attribs), bufferMode); + } + + // --- [ glBindBufferRangeNV ] --- + + public static native void glBindBufferRangeNV(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset, @NativeType("GLsizeiptr") long size); + + // --- [ glBindBufferOffsetNV ] --- + + public static native void glBindBufferOffsetNV(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer, @NativeType("GLintptr") long offset); + + // --- [ glBindBufferBaseNV ] --- + + public static native void glBindBufferBaseNV(@NativeType("GLenum") int target, @NativeType("GLuint") int index, @NativeType("GLuint") int buffer); + + // --- [ glTransformFeedbackVaryingsNV ] --- + + public static native void nglTransformFeedbackVaryingsNV(int program, int count, long locations, int bufferMode); + + public static void glTransformFeedbackVaryingsNV(@NativeType("GLuint") int program, @NativeType("GLint const *") IntBuffer locations, @NativeType("GLenum") int bufferMode) { + nglTransformFeedbackVaryingsNV(program, locations.remaining(), memAddress(locations), bufferMode); + } + + // --- [ glActiveVaryingNV ] --- + + public static native void nglActiveVaryingNV(int program, long name); + + public static void glActiveVaryingNV(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + nglActiveVaryingNV(program, memAddress(name)); + } + + public static void glActiveVaryingNV(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + nglActiveVaryingNV(program, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVaryingLocationNV ] --- + + public static native int nglGetVaryingLocationNV(int program, long name); + + @NativeType("GLint") + public static int glGetVaryingLocationNV(@NativeType("GLuint") int program, @NativeType("GLchar const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nglGetVaryingLocationNV(program, memAddress(name)); + } + + @NativeType("GLint") + public static int glGetVaryingLocationNV(@NativeType("GLuint") int program, @NativeType("GLchar const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nglGetVaryingLocationNV(program, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetActiveVaryingNV ] --- + + public static native void nglGetActiveVaryingNV(int program, int index, int bufSize, long length, long size, long type, long name); + + public static void glGetActiveVaryingNV(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") IntBuffer length, @NativeType("GLsizei *") IntBuffer size, @NativeType("GLenum *") IntBuffer type, @NativeType("GLchar *") ByteBuffer name) { + if (CHECKS) { + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + nglGetActiveVaryingNV(program, index, name.remaining(), memAddressSafe(length), memAddress(size), memAddress(type), memAddress(name)); + } + + // --- [ glGetTransformFeedbackVaryingNV ] --- + + public static native void nglGetTransformFeedbackVaryingNV(int program, int index, long location); + + public static void glGetTransformFeedbackVaryingNV(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLint *") IntBuffer location) { + if (CHECKS) { + check(location, 1); + } + nglGetTransformFeedbackVaryingNV(program, index, memAddress(location)); + } + + @NativeType("void") + public static int glGetTransformFeedbackVaryingNV(@NativeType("GLuint") int program, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer location = stack.callocInt(1); + nglGetTransformFeedbackVaryingNV(program, index, memAddress(location)); + return location.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glTransformFeedbackStreamAttribsNV ] --- + + public static native void nglTransformFeedbackStreamAttribsNV(int count, long attribs, int nbuffers, long bufstreams, int bufferMode); + + public static void glTransformFeedbackStreamAttribsNV(@NativeType("GLint const *") IntBuffer attribs, @NativeType("GLint const *") IntBuffer bufstreams, @NativeType("GLenum") int bufferMode) { + nglTransformFeedbackStreamAttribsNV(attribs.remaining(), memAddress(attribs), bufstreams.remaining(), memAddress(bufstreams), bufferMode); + } + + /** Array version of: {@link #glTransformFeedbackAttribsNV TransformFeedbackAttribsNV} */ + public static void glTransformFeedbackAttribsNV(@NativeType("GLint const *") int[] attribs, @NativeType("GLenum") int bufferMode) { + long __functionAddress = GL.getICD().glTransformFeedbackAttribsNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(attribs.length, attribs, bufferMode, __functionAddress); + } + + /** Array version of: {@link #glTransformFeedbackVaryingsNV TransformFeedbackVaryingsNV} */ + public static void glTransformFeedbackVaryingsNV(@NativeType("GLuint") int program, @NativeType("GLint const *") int[] locations, @NativeType("GLenum") int bufferMode) { + long __functionAddress = GL.getICD().glTransformFeedbackVaryingsNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(program, locations.length, locations, bufferMode, __functionAddress); + } + + /** Array version of: {@link #glGetActiveVaryingNV GetActiveVaryingNV} */ + public static void glGetActiveVaryingNV(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @Nullable @NativeType("GLsizei *") int[] length, @NativeType("GLsizei *") int[] size, @NativeType("GLenum *") int[] type, @NativeType("GLchar *") ByteBuffer name) { + long __functionAddress = GL.getICD().glGetActiveVaryingNV; + if (CHECKS) { + check(__functionAddress); + checkSafe(length, 1); + check(size, 1); + check(type, 1); + } + callPPPPV(program, index, name.remaining(), length, size, type, memAddress(name), __functionAddress); + } + + /** Array version of: {@link #glGetTransformFeedbackVaryingNV GetTransformFeedbackVaryingNV} */ + public static void glGetTransformFeedbackVaryingNV(@NativeType("GLuint") int program, @NativeType("GLuint") int index, @NativeType("GLint *") int[] location) { + long __functionAddress = GL.getICD().glGetTransformFeedbackVaryingNV; + if (CHECKS) { + check(__functionAddress); + check(location, 1); + } + callPV(program, index, location, __functionAddress); + } + + /** Array version of: {@link #glTransformFeedbackStreamAttribsNV TransformFeedbackStreamAttribsNV} */ + public static void glTransformFeedbackStreamAttribsNV(@NativeType("GLint const *") int[] attribs, @NativeType("GLint const *") int[] bufstreams, @NativeType("GLenum") int bufferMode) { + long __functionAddress = GL.getICD().glTransformFeedbackStreamAttribsNV; + if (CHECKS) { + check(__functionAddress); + } + callPPV(attribs.length, attribs, bufstreams.length, bufstreams, bufferMode, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTransformFeedback2.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTransformFeedback2.java new file mode 100644 index 000000000..78fcc4ba1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVTransformFeedback2.java @@ -0,0 +1,133 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_transform_feedback2 extension. + * + *

    The NV_transform_feedback and EXT_transform_feedback extensions allow applications to capture primitives to one or more buffer objects when transformed + * by the GL. This extension provides a few additional capabilities to these extensions, making transform feedback mode more useful.

    + * + *

    First, it provides transform feedback objects encapsulating transform feedback-related state, allowing applications to replace the entire transform + * feedback configuration in a single bind call. Second, it provides the ability to pause and resume transform feedback operations. When transform + * feedback is paused, applications may render without transform feedback or may use transform feedback with different state and a different transform + * feedback object. When transform feedback is resumed, additional primitives are captured and appended to previously captured primitives for the object.

    + * + *

    Additionally, this extension provides the ability to draw primitives captured in transform feedback mode without querying the captured primitive count. + * The command DrawTransformFeedbackNV() is equivalent to {@code glDrawArrays(, 0, )}, where {@code count} is the number of vertices captured + * to buffer objects during the last transform feedback capture operation on the transform feedback object used. This draw operation only provides a + * vertex count -- it does not automatically set up vertex array state or vertex buffer object bindings, which must be done separately by the application.

    + * + *

    Requires {@link GL15 OpenGL 1.5} and {@link NVTransformFeedback NV_transform_feedback} or {@link EXTTransformFeedback EXT_transform_feedback}.

    + */ +public class NVTransformFeedback2 { + + static { GL.initialize(); } + + /** Accepted by the {@code target} parameter of BindTransformFeedbackNV. */ + public static final int GL_TRANSFORM_FEEDBACK_NV = 0x8E22; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetDoublev, GetIntegerv, and GetFloatv. */ + public static final int + GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV = 0x8E23, + GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV = 0x8E24, + GL_TRANSFORM_FEEDBACK_BINDING_NV = 0x8E25; + + protected NVTransformFeedback2() { + throw new UnsupportedOperationException(); + } + + // --- [ glBindTransformFeedbackNV ] --- + + public static native void glBindTransformFeedbackNV(@NativeType("GLenum") int target, @NativeType("GLuint") int id); + + // --- [ glDeleteTransformFeedbacksNV ] --- + + public static native void nglDeleteTransformFeedbacksNV(int n, long ids); + + public static void glDeleteTransformFeedbacksNV(@NativeType("GLuint const *") IntBuffer ids) { + nglDeleteTransformFeedbacksNV(ids.remaining(), memAddress(ids)); + } + + public static void glDeleteTransformFeedbacksNV(@NativeType("GLuint const *") int id) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.ints(id); + nglDeleteTransformFeedbacksNV(1, memAddress(ids)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGenTransformFeedbacksNV ] --- + + public static native void nglGenTransformFeedbacksNV(int n, long ids); + + public static void glGenTransformFeedbacksNV(@NativeType("GLuint *") IntBuffer ids) { + if (CHECKS) { + check(ids, 1); + } + nglGenTransformFeedbacksNV(ids.remaining(), memAddress(ids)); + } + + @NativeType("void") + public static int glGenTransformFeedbacksNV() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer ids = stack.callocInt(1); + nglGenTransformFeedbacksNV(1, memAddress(ids)); + return ids.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glIsTransformFeedbackNV ] --- + + @NativeType("GLboolean") + public static native boolean glIsTransformFeedbackNV(@NativeType("GLuint") int id); + + // --- [ glPauseTransformFeedbackNV ] --- + + public static native void glPauseTransformFeedbackNV(); + + // --- [ glResumeTransformFeedbackNV ] --- + + public static native void glResumeTransformFeedbackNV(); + + // --- [ glDrawTransformFeedbackNV ] --- + + public static native void glDrawTransformFeedbackNV(@NativeType("GLenum") int mode, @NativeType("GLuint") int id); + + /** Array version of: {@link #glDeleteTransformFeedbacksNV DeleteTransformFeedbacksNV} */ + public static void glDeleteTransformFeedbacksNV(@NativeType("GLuint const *") int[] ids) { + long __functionAddress = GL.getICD().glDeleteTransformFeedbacksNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(ids.length, ids, __functionAddress); + } + + /** Array version of: {@link #glGenTransformFeedbacksNV GenTransformFeedbacksNV} */ + public static void glGenTransformFeedbacksNV(@NativeType("GLuint *") int[] ids) { + long __functionAddress = GL.getICD().glGenTransformFeedbacksNV; + if (CHECKS) { + check(__functionAddress); + check(ids, 1); + } + callPV(ids.length, ids, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVUniformBufferUnifiedMemory.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVUniformBufferUnifiedMemory.java new file mode 100644 index 000000000..69ef91ad1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVUniformBufferUnifiedMemory.java @@ -0,0 +1,34 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_uniform_buffer_unified_memory extension. + * + *

    This extension provides a mechanism to specify uniform buffers + * using GPU addresses.

    + * + *

    Binding uniform buffers is one of the most frequent and expensive + * operations in many GL applications, due to the cost of chasing + * pointers and binding objects described in the overview of + * NV_shader_buffer_load. The intent of this extension is to enable a + * way for the application to specify uniform buffer state that alleviates + * the overhead of object binds and driver memory management.

    + */ +public final class NVUniformBufferUnifiedMemory { + + /** Accepted by the {@code cap} parameter of DisableClientState, EnableClientState, IsEnabled. */ + public static final int GL_UNIFORM_BUFFER_UNIFIED_NV = 0x936E; + + /** Accepted by the {@code pname} parameter of BufferAddressRangeNV and the {@code value} parameter of GetIntegerui64i_vNV. */ + public static final int GL_UNIFORM_BUFFER_ADDRESS_NV = 0x936F; + + /** Accepted by the {@code target} parameter of GetIntegeri_vNV. */ + public static final int GL_UNIFORM_BUFFER_LENGTH_NV = 0x9370; + + private NVUniformBufferUnifiedMemory() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexArrayRange.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexArrayRange.java new file mode 100644 index 000000000..b77038043 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexArrayRange.java @@ -0,0 +1,52 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_vertex_array_range extension. + * + *

    The goal of this extension is to permit extremely high vertex processing rates via OpenGL vertex arrays even when the CPU lacks the necessary data + * movement bandwidth to keep up with the rate at which the vertex engine can consume vertices.

    + */ +public class NVVertexArrayRange { + + static { GL.initialize(); } + + /** Accepted by the {@code cap} parameter of EnableClientState, DisableClientState, and IsEnabled. */ + public static final int GL_VERTEX_ARRAY_RANGE_NV = 0x851D; + + /** Accepted by the {@code pname} parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + GL_VERTEX_ARRAY_RANGE_LENGTH_NV = 0x851E, + GL_VERTEX_ARRAY_RANGE_VALID_NV = 0x851F, + GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV = 0x8520; + + /** Accepted by the {@code pname} parameter of GetPointerv. */ + public static final int GL_VERTEX_ARRAY_RANGE_POINTER_NV = 0x8521; + + protected NVVertexArrayRange() { + throw new UnsupportedOperationException(); + } + + // --- [ glVertexArrayRangeNV ] --- + + public static native void nglVertexArrayRangeNV(int length, long pointer); + + public static void glVertexArrayRangeNV(@NativeType("void *") ByteBuffer pointer) { + nglVertexArrayRangeNV(pointer.remaining(), memAddress(pointer)); + } + + // --- [ glFlushVertexArrayRangeNV ] --- + + public static native void glFlushVertexArrayRangeNV(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexArrayRange2.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexArrayRange2.java new file mode 100644 index 000000000..9a65e52ec --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexArrayRange2.java @@ -0,0 +1,27 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NV_vertex_array_range2 extension. + * + *

    Enabling and disabling the vertex array range is specified by the original NV_vertex_array_range extension specification to flush the vertex array + * range implicitly. In retrospect, this semantic is extremely misconceived and creates terrible performance problems for any application that wishes to + * mix conventional vertex arrays with vertex arrange range-enabled vertex arrays.

    + * + *

    This extension provides a new token for enabling/disabling the vertex array range that does NOT perform an implicit vertex array range flush when the + * enable/disable is performed.

    + * + *

    Requires {@link NVVertexArrayRange NV_vertex_array_range}.

    + */ +public final class NVVertexArrayRange2 { + + /** Accepted by the {@code cap} parameter of EnableClientState, DisableClientState. */ + public static final int GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV = 0x8533; + + private NVVertexArrayRange2() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexAttribInteger64bit.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexAttribInteger64bit.java new file mode 100644 index 000000000..0834d5060 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexAttribInteger64bit.java @@ -0,0 +1,311 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_vertex_attrib_integer_64bit extension. + * + *

    This extension provides support for specifying vertex attributes with 64-bit integer components, analagous to the 64-bit floating point support added + * in EXT_vertex_attrib_64bit.

    + * + *

    Additionally, it provides the VertexAttribLFormatNV entry point to specify bindless vertex attribute arrays with 64-bit integer or floating-point + * components in conjunction with the NV_vertex_buffer_unified_memory extension.

    + * + *

    Requires {@link GL30 OpenGL 3.0}, GLSL 1.30, {@link NVGPUShader5 NV_gpu_shader5} or equivalent functionality and {@link EXTVertexAttrib64bit EXT_vertex_attrib_64bit}.

    + */ +public class NVVertexAttribInteger64bit { + + static { GL.initialize(); } + + /** Accepted by the {@code type} parameter of VertexAttribLPointerEXT, VertexArrayVertexAttribLOffsetEXT, and VertexAttribLFormatNV. */ + public static final int + GL_INT64_NV = 0x140E, + GL_UNSIGNED_INT64_NV = 0x140F; + + protected NVVertexAttribInteger64bit() { + throw new UnsupportedOperationException(); + } + + // --- [ glVertexAttribL1i64NV ] --- + + public static native void glVertexAttribL1i64NV(@NativeType("GLuint") int index, @NativeType("GLint64EXT") long x); + + // --- [ glVertexAttribL2i64NV ] --- + + public static native void glVertexAttribL2i64NV(@NativeType("GLuint") int index, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y); + + // --- [ glVertexAttribL3i64NV ] --- + + public static native void glVertexAttribL3i64NV(@NativeType("GLuint") int index, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y, @NativeType("GLint64EXT") long z); + + // --- [ glVertexAttribL4i64NV ] --- + + public static native void glVertexAttribL4i64NV(@NativeType("GLuint") int index, @NativeType("GLint64EXT") long x, @NativeType("GLint64EXT") long y, @NativeType("GLint64EXT") long z, @NativeType("GLint64EXT") long w); + + // --- [ glVertexAttribL1i64vNV ] --- + + public static native void nglVertexAttribL1i64vNV(int index, long v); + + public static void glVertexAttribL1i64vNV(@NativeType("GLuint") int index, @NativeType("GLint64EXT const *") LongBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttribL1i64vNV(index, memAddress(v)); + } + + // --- [ glVertexAttribL2i64vNV ] --- + + public static native void nglVertexAttribL2i64vNV(int index, long v); + + public static void glVertexAttribL2i64vNV(@NativeType("GLuint") int index, @NativeType("GLint64EXT const *") LongBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttribL2i64vNV(index, memAddress(v)); + } + + // --- [ glVertexAttribL3i64vNV ] --- + + public static native void nglVertexAttribL3i64vNV(int index, long v); + + public static void glVertexAttribL3i64vNV(@NativeType("GLuint") int index, @NativeType("GLint64EXT const *") LongBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttribL3i64vNV(index, memAddress(v)); + } + + // --- [ glVertexAttribL4i64vNV ] --- + + public static native void nglVertexAttribL4i64vNV(int index, long v); + + public static void glVertexAttribL4i64vNV(@NativeType("GLuint") int index, @NativeType("GLint64EXT const *") LongBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribL4i64vNV(index, memAddress(v)); + } + + // --- [ glVertexAttribL1ui64NV ] --- + + public static native void glVertexAttribL1ui64NV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT") long x); + + // --- [ glVertexAttribL2ui64NV ] --- + + public static native void glVertexAttribL2ui64NV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y); + + // --- [ glVertexAttribL3ui64NV ] --- + + public static native void glVertexAttribL3ui64NV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y, @NativeType("GLuint64EXT") long z); + + // --- [ glVertexAttribL4ui64NV ] --- + + public static native void glVertexAttribL4ui64NV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT") long x, @NativeType("GLuint64EXT") long y, @NativeType("GLuint64EXT") long z, @NativeType("GLuint64EXT") long w); + + // --- [ glVertexAttribL1ui64vNV ] --- + + public static native void nglVertexAttribL1ui64vNV(int index, long v); + + public static void glVertexAttribL1ui64vNV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT const *") LongBuffer v) { + if (CHECKS) { + check(v, 1); + } + nglVertexAttribL1ui64vNV(index, memAddress(v)); + } + + // --- [ glVertexAttribL2ui64vNV ] --- + + public static native void nglVertexAttribL2ui64vNV(int index, long v); + + public static void glVertexAttribL2ui64vNV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT const *") LongBuffer v) { + if (CHECKS) { + check(v, 2); + } + nglVertexAttribL2ui64vNV(index, memAddress(v)); + } + + // --- [ glVertexAttribL3ui64vNV ] --- + + public static native void nglVertexAttribL3ui64vNV(int index, long v); + + public static void glVertexAttribL3ui64vNV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT const *") LongBuffer v) { + if (CHECKS) { + check(v, 3); + } + nglVertexAttribL3ui64vNV(index, memAddress(v)); + } + + // --- [ glVertexAttribL4ui64vNV ] --- + + public static native void nglVertexAttribL4ui64vNV(int index, long v); + + public static void glVertexAttribL4ui64vNV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT const *") LongBuffer v) { + if (CHECKS) { + check(v, 4); + } + nglVertexAttribL4ui64vNV(index, memAddress(v)); + } + + // --- [ glGetVertexAttribLi64vNV ] --- + + public static native void nglGetVertexAttribLi64vNV(int index, int pname, long params); + + public static void glGetVertexAttribLi64vNV(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint64EXT *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetVertexAttribLi64vNV(index, pname, memAddress(params)); + } + + @NativeType("void") + public static long glGetVertexAttribLi64NV(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetVertexAttribLi64vNV(index, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glGetVertexAttribLui64vNV ] --- + + public static native void nglGetVertexAttribLui64vNV(int index, int pname, long params); + + public static void glGetVertexAttribLui64vNV(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLuint64EXT *") LongBuffer params) { + if (CHECKS) { + check(params, 1); + } + nglGetVertexAttribLui64vNV(index, pname, memAddress(params)); + } + + @NativeType("void") + public static long glGetVertexAttribLui64NV(@NativeType("GLuint") int index, @NativeType("GLenum") int pname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer params = stack.callocLong(1); + nglGetVertexAttribLui64vNV(index, pname, memAddress(params)); + return params.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ glVertexAttribLFormatNV ] --- + + public static native void glVertexAttribLFormatNV(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride); + + /** Array version of: {@link #glVertexAttribL1i64vNV VertexAttribL1i64vNV} */ + public static void glVertexAttribL1i64vNV(@NativeType("GLuint") int index, @NativeType("GLint64EXT const *") long[] v) { + long __functionAddress = GL.getICD().glVertexAttribL1i64vNV; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribL2i64vNV VertexAttribL2i64vNV} */ + public static void glVertexAttribL2i64vNV(@NativeType("GLuint") int index, @NativeType("GLint64EXT const *") long[] v) { + long __functionAddress = GL.getICD().glVertexAttribL2i64vNV; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribL3i64vNV VertexAttribL3i64vNV} */ + public static void glVertexAttribL3i64vNV(@NativeType("GLuint") int index, @NativeType("GLint64EXT const *") long[] v) { + long __functionAddress = GL.getICD().glVertexAttribL3i64vNV; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribL4i64vNV VertexAttribL4i64vNV} */ + public static void glVertexAttribL4i64vNV(@NativeType("GLuint") int index, @NativeType("GLint64EXT const *") long[] v) { + long __functionAddress = GL.getICD().glVertexAttribL4i64vNV; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribL1ui64vNV VertexAttribL1ui64vNV} */ + public static void glVertexAttribL1ui64vNV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT const *") long[] v) { + long __functionAddress = GL.getICD().glVertexAttribL1ui64vNV; + if (CHECKS) { + check(__functionAddress); + check(v, 1); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribL2ui64vNV VertexAttribL2ui64vNV} */ + public static void glVertexAttribL2ui64vNV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT const *") long[] v) { + long __functionAddress = GL.getICD().glVertexAttribL2ui64vNV; + if (CHECKS) { + check(__functionAddress); + check(v, 2); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribL3ui64vNV VertexAttribL3ui64vNV} */ + public static void glVertexAttribL3ui64vNV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT const *") long[] v) { + long __functionAddress = GL.getICD().glVertexAttribL3ui64vNV; + if (CHECKS) { + check(__functionAddress); + check(v, 3); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glVertexAttribL4ui64vNV VertexAttribL4ui64vNV} */ + public static void glVertexAttribL4ui64vNV(@NativeType("GLuint") int index, @NativeType("GLuint64EXT const *") long[] v) { + long __functionAddress = GL.getICD().glVertexAttribL4ui64vNV; + if (CHECKS) { + check(__functionAddress); + check(v, 4); + } + callPV(index, v, __functionAddress); + } + + /** Array version of: {@link #glGetVertexAttribLi64vNV GetVertexAttribLi64vNV} */ + public static void glGetVertexAttribLi64vNV(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLint64EXT *") long[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribLi64vNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(index, pname, params, __functionAddress); + } + + /** Array version of: {@link #glGetVertexAttribLui64vNV GetVertexAttribLui64vNV} */ + public static void glGetVertexAttribLui64vNV(@NativeType("GLuint") int index, @NativeType("GLenum") int pname, @NativeType("GLuint64EXT *") long[] params) { + long __functionAddress = GL.getICD().glGetVertexAttribLui64vNV; + if (CHECKS) { + check(__functionAddress); + check(params, 1); + } + callPV(index, pname, params, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexBufferUnifiedMemory.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexBufferUnifiedMemory.java new file mode 100644 index 000000000..7ef536809 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVVertexBufferUnifiedMemory.java @@ -0,0 +1,148 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NV_vertex_buffer_unified_memory extension. + * + *

    This extension provides a mechanism to specify vertex attrib and element array locations using GPU addresses.

    + * + *

    Binding vertex buffers is one of the most frequent and expensive operations in many GL applications, due to the cost of chasing pointers and binding + * objects described in the Overview of {@link NVShaderBufferLoad NV_shader_buffer_load}. The intent of this extension is to enable a way for the application to specify + * vertex attrib state that alleviates the overhead of object binds and driver memory management.

    + */ +public class NVVertexBufferUnifiedMemory { + + static { GL.initialize(); } + + /** Accepted by the {@code cap} parameter of DisableClientState, EnableClientState, IsEnabled. */ + public static final int + GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV = 0x8F1E, + GL_ELEMENT_ARRAY_UNIFIED_NV = 0x8F1F; + + /** Accepted by the {@code pname} parameter of BufferAddressRangeNV and the {@code value} parameter of GetIntegerui64i_vNV. */ + public static final int + GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV = 0x8F20, + GL_TEXTURE_COORD_ARRAY_ADDRESS_NV = 0x8F25; + + /** Accepted by the {@code pname} parameter of BufferAddressRangeNV and the {@code value} parameter of GetIntegerui64vNV. */ + public static final int + GL_VERTEX_ARRAY_ADDRESS_NV = 0x8F21, + GL_NORMAL_ARRAY_ADDRESS_NV = 0x8F22, + GL_COLOR_ARRAY_ADDRESS_NV = 0x8F23, + GL_INDEX_ARRAY_ADDRESS_NV = 0x8F24, + GL_EDGE_FLAG_ARRAY_ADDRESS_NV = 0x8F26, + GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV = 0x8F27, + GL_FOG_COORD_ARRAY_ADDRESS_NV = 0x8F28, + GL_ELEMENT_ARRAY_ADDRESS_NV = 0x8F29; + + /** Accepted by the {@code target} parameter of GetIntegeri_vNV. */ + public static final int + GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV = 0x8F2A, + GL_TEXTURE_COORD_ARRAY_LENGTH_NV = 0x8F2F; + + /** Accepted by the {@code value} parameter of GetIntegerv. */ + public static final int + GL_VERTEX_ARRAY_LENGTH_NV = 0x8F2B, + GL_NORMAL_ARRAY_LENGTH_NV = 0x8F2C, + GL_COLOR_ARRAY_LENGTH_NV = 0x8F2D, + GL_INDEX_ARRAY_LENGTH_NV = 0x8F2E, + GL_EDGE_FLAG_ARRAY_LENGTH_NV = 0x8F30, + GL_SECONDARY_COLOR_ARRAY_LENGTH_NV = 0x8F31, + GL_FOG_COORD_ARRAY_LENGTH_NV = 0x8F32, + GL_ELEMENT_ARRAY_LENGTH_NV = 0x8F33; + + protected NVVertexBufferUnifiedMemory() { + throw new UnsupportedOperationException(); + } + + // --- [ glBufferAddressRangeNV ] --- + + public static native void glBufferAddressRangeNV(@NativeType("GLenum") int pname, @NativeType("GLuint") int index, @NativeType("GLuint64EXT") long address, @NativeType("GLsizeiptr") long length); + + // --- [ glVertexFormatNV ] --- + + public static native void glVertexFormatNV(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride); + + // --- [ glNormalFormatNV ] --- + + public static native void glNormalFormatNV(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride); + + // --- [ glColorFormatNV ] --- + + public static native void glColorFormatNV(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride); + + // --- [ glIndexFormatNV ] --- + + public static native void glIndexFormatNV(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride); + + // --- [ glTexCoordFormatNV ] --- + + public static native void glTexCoordFormatNV(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride); + + // --- [ glEdgeFlagFormatNV ] --- + + public static native void glEdgeFlagFormatNV(@NativeType("GLsizei") int stride); + + // --- [ glSecondaryColorFormatNV ] --- + + public static native void glSecondaryColorFormatNV(@NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride); + + // --- [ glFogCoordFormatNV ] --- + + public static native void glFogCoordFormatNV(@NativeType("GLenum") int type, @NativeType("GLsizei") int stride); + + // --- [ glVertexAttribFormatNV ] --- + + public static native void glVertexAttribFormatNV(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLboolean") boolean normalized, @NativeType("GLsizei") int stride); + + // --- [ glVertexAttribIFormatNV ] --- + + public static native void glVertexAttribIFormatNV(@NativeType("GLuint") int index, @NativeType("GLint") int size, @NativeType("GLenum") int type, @NativeType("GLsizei") int stride); + + // --- [ glGetIntegerui64i_vNV ] --- + + public static native void nglGetIntegerui64i_vNV(int value, int index, long result); + + public static void glGetIntegerui64i_vNV(@NativeType("GLenum") int value, @NativeType("GLuint") int index, @NativeType("GLuint64EXT *") LongBuffer result) { + if (CHECKS) { + check(result, 1); + } + nglGetIntegerui64i_vNV(value, index, memAddress(result)); + } + + @NativeType("void") + public static long glGetIntegerui64iNV(@NativeType("GLenum") int value, @NativeType("GLuint") int index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + LongBuffer result = stack.callocLong(1); + nglGetIntegerui64i_vNV(value, index, memAddress(result)); + return result.get(0); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #glGetIntegerui64i_vNV GetIntegerui64i_vNV} */ + public static void glGetIntegerui64i_vNV(@NativeType("GLenum") int value, @NativeType("GLuint") int index, @NativeType("GLuint64EXT *") long[] result) { + long __functionAddress = GL.getICD().glGetIntegerui64i_vNV; + if (CHECKS) { + check(__functionAddress); + check(result, 1); + } + callPV(value, index, result, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVViewportSwizzle.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVViewportSwizzle.java new file mode 100644 index 000000000..5d74f497d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVViewportSwizzle.java @@ -0,0 +1,61 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NV_viewport_swizzle extension. + * + *

    This extension provides a new per-viewport swizzle that can modify the position of primitives sent to each viewport. New viewport swizzle state is + * added for each viewport, and a new position vector is computed for each vertex by selecting from and optionally negating any of the four components of + * the original position vector.

    + * + *

    This new viewport swizzle is useful for a number of algorithms, including single-pass cubemap rendering (broadcasting a primitive to multiple faces and + * reorienting the vertex position for each face) and voxel rasterization. The per-viewport component remapping and negation provided by the swizzle + * allows application code to re-orient three-dimensional geometry with a view along any of the X, Y, or Z axes. If a perspective projection and depth + * buffering is required, 1/W buffering should be used, as described in the single-pass cubemap rendering example in the "Issues" section below.

    + */ +public class NVViewportSwizzle { + + static { GL.initialize(); } + + /** Accepted by the {@code swizzlex}, {@code swizzley}, {@code swizzlez}, and {@code swizzlew} parameters of ViewportSwizzleNV. */ + public static final int + GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV = 0x9350, + GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV = 0x9351, + GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV = 0x9352, + GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV = 0x9353, + GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV = 0x9354, + GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV = 0x9355, + GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV = 0x9356, + GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV = 0x9357; + + /** Accepted by the {@code pname} parameter of GetBooleani_v, GetDoublei_v, GetIntegeri_v, GetFloati_v, and GetInteger64i_v. */ + public static final int + GL_VIEWPORT_SWIZZLE_X_NV = 0x9358, + GL_VIEWPORT_SWIZZLE_Y_NV = 0x9359, + GL_VIEWPORT_SWIZZLE_Z_NV = 0x935A, + GL_VIEWPORT_SWIZZLE_W_NV = 0x935B; + + protected NVViewportSwizzle() { + throw new UnsupportedOperationException(); + } + + // --- [ glViewportSwizzleNV ] --- + + /** + * Sets the swizzle state for the specified viewport. + * + * @param index the viewport index + * @param swizzlex the x swizzle state. One of:
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV VIEWPORT_SWIZZLE_POSITIVE_X_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV VIEWPORT_SWIZZLE_NEGATIVE_X_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV VIEWPORT_SWIZZLE_POSITIVE_Y_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV VIEWPORT_SWIZZLE_NEGATIVE_Y_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV VIEWPORT_SWIZZLE_POSITIVE_Z_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV VIEWPORT_SWIZZLE_NEGATIVE_Z_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV VIEWPORT_SWIZZLE_POSITIVE_W_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV VIEWPORT_SWIZZLE_NEGATIVE_W_NV}
    + * @param swizzley the y swizzle state. One of:
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV VIEWPORT_SWIZZLE_POSITIVE_X_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV VIEWPORT_SWIZZLE_NEGATIVE_X_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV VIEWPORT_SWIZZLE_POSITIVE_Y_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV VIEWPORT_SWIZZLE_NEGATIVE_Y_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV VIEWPORT_SWIZZLE_POSITIVE_Z_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV VIEWPORT_SWIZZLE_NEGATIVE_Z_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV VIEWPORT_SWIZZLE_POSITIVE_W_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV VIEWPORT_SWIZZLE_NEGATIVE_W_NV}
    + * @param swizzlez the z swizzle state. One of:
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV VIEWPORT_SWIZZLE_POSITIVE_X_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV VIEWPORT_SWIZZLE_NEGATIVE_X_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV VIEWPORT_SWIZZLE_POSITIVE_Y_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV VIEWPORT_SWIZZLE_NEGATIVE_Y_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV VIEWPORT_SWIZZLE_POSITIVE_Z_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV VIEWPORT_SWIZZLE_NEGATIVE_Z_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV VIEWPORT_SWIZZLE_POSITIVE_W_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV VIEWPORT_SWIZZLE_NEGATIVE_W_NV}
    + * @param swizzlew the w swizzle state. One of:
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV VIEWPORT_SWIZZLE_POSITIVE_X_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV VIEWPORT_SWIZZLE_NEGATIVE_X_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV VIEWPORT_SWIZZLE_POSITIVE_Y_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV VIEWPORT_SWIZZLE_NEGATIVE_Y_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV VIEWPORT_SWIZZLE_POSITIVE_Z_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV VIEWPORT_SWIZZLE_NEGATIVE_Z_NV}
    {@link #GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV VIEWPORT_SWIZZLE_POSITIVE_W_NV}{@link #GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV VIEWPORT_SWIZZLE_NEGATIVE_W_NV}
    + */ + public static native void glViewportSwizzleNV(@NativeType("GLuint") int index, @NativeType("GLenum") int swizzlex, @NativeType("GLenum") int swizzley, @NativeType("GLenum") int swizzlez, @NativeType("GLenum") int swizzlew); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXConditionalRender.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXConditionalRender.java new file mode 100644 index 000000000..1a51164c5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXConditionalRender.java @@ -0,0 +1,38 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the NVX_conditional_render extension. + * + *

    This extension provides support for conditional rendering based on the + * results of an occlusion query. This mechanism allows an application to + * potentially reduce the latency between the completion of an occlusion + * query and the rendering commands depending on its result. It additionally + * allows the decision of whether to render to be made without application + * intervention.

    + * + *

    Requires {@link GL15 OpenGL 1.5} or {@link ARBOcclusionQuery ARB_occlusion_query}

    + */ +public class NVXConditionalRender { + + static { GL.initialize(); } + + protected NVXConditionalRender() { + throw new UnsupportedOperationException(); + } + + // --- [ glBeginConditionalRenderNVX ] --- + + public static native void glBeginConditionalRenderNVX(@NativeType("GLuint") int id); + + // --- [ glEndConditionalRenderNVX ] --- + + public static native void glEndConditionalRenderNVX(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXGPUMemoryInfo.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXGPUMemoryInfo.java new file mode 100644 index 000000000..a9e8a9008 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXGPUMemoryInfo.java @@ -0,0 +1,28 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the NVX_gpu_memory_info extension. + * + *

    GL_NVX_gpu_memory_info provides applications visibility into GPU hardware memory utilization in order to allow the application to effectively manage + * its resource allocations in the scope of the current available GPU memory.

    + * + *

    Requires {@link GL20 OpenGL 2.0}

    + */ +public final class NVXGPUMemoryInfo { + + /** Accepted by the {@code param} parameter of GetIntegerv. */ + public static final int + GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX = 0x9047, + GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX = 0x9048, + GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX = 0x9049, + GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX = 0x904A, + GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX = 0x904B; + + private NVXGPUMemoryInfo() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXGpuMulticast2.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXGpuMulticast2.java new file mode 100644 index 000000000..522fef329 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXGpuMulticast2.java @@ -0,0 +1,123 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NVX_gpu_multicast2 extension. + * + *

    This extension provides additional mechanisms that influence multicast rendering which is simultaneous rendering to multiple GPUs.

    + * + *

    Requires {@link NVGPUMulticast NV_gpu_multicast}, {@code EXT_device_group}, {@code NV_viewport_array}, {@link NVClipSpaceWScaling NV_clip_space_w_scaling} and {@link NVXProgressFence NVX_progress_fence}.

    + */ +public class NVXGpuMulticast2 { + + static { GL.initialize(); } + + protected NVXGpuMulticast2() { + throw new UnsupportedOperationException(); + } + + // --- [ glAsyncCopyImageSubDataNVX ] --- + + public static native int nglAsyncCopyImageSubDataNVX(int waitSemaphoreCount, long waitSemaphoreArray, long waitValueArray, int srcGpu, int dstGpuMask, int srcName, int srcTarget, int srcLevel, int srcX, int srcY, int srcZ, int dstName, int dstTarget, int dstLevel, int dstX, int dstY, int dstZ, int srcWidth, int srcHeight, int srcDepth, int signalSemaphoreCount, long signalSemaphoreArray, long signalValueArray); + + @NativeType("GLuint") + public static int glAsyncCopyImageSubDataNVX(@NativeType("GLuint const *") IntBuffer waitSemaphoreArray, @NativeType("GLuint64 const *") LongBuffer waitValueArray, @NativeType("GLuint") int srcGpu, @NativeType("GLbitfield") int dstGpuMask, @NativeType("GLuint") int srcName, @NativeType("GLenum") int srcTarget, @NativeType("GLint") int srcLevel, @NativeType("GLint") int srcX, @NativeType("GLint") int srcY, @NativeType("GLint") int srcZ, @NativeType("GLuint") int dstName, @NativeType("GLenum") int dstTarget, @NativeType("GLint") int dstLevel, @NativeType("GLint") int dstX, @NativeType("GLint") int dstY, @NativeType("GLint") int dstZ, @NativeType("GLsizei") int srcWidth, @NativeType("GLsizei") int srcHeight, @NativeType("GLsizei") int srcDepth, @NativeType("GLuint const *") IntBuffer signalSemaphoreArray, @NativeType("GLuint64 const *") LongBuffer signalValueArray) { + if (CHECKS) { + check(waitValueArray, waitSemaphoreArray.remaining()); + check(signalValueArray, signalSemaphoreArray.remaining()); + } + return nglAsyncCopyImageSubDataNVX(waitSemaphoreArray.remaining(), memAddress(waitSemaphoreArray), memAddress(waitValueArray), srcGpu, dstGpuMask, srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth, signalSemaphoreArray.remaining(), memAddress(signalSemaphoreArray), memAddress(signalValueArray)); + } + + // --- [ glAsyncCopyBufferSubDataNVX ] --- + + public static native long nglAsyncCopyBufferSubDataNVX(int waitSemaphoreCount, long waitSemaphoreArray, long fenceValueArray, int readGpu, int writeGpuMask, int readBuffer, int writeBuffer, long readOffset, long writeOffset, long size, int signalSemaphoreCount, long signalSemaphoreArray, long signalValueArray); + + @NativeType("GLsync") + public static long glAsyncCopyBufferSubDataNVX(@NativeType("GLuint const *") IntBuffer waitSemaphoreArray, @NativeType("GLuint64 const *") LongBuffer fenceValueArray, @NativeType("GLuint") int readGpu, @NativeType("GLbitfield") int writeGpuMask, @NativeType("GLuint") int readBuffer, @NativeType("GLuint") int writeBuffer, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size, @NativeType("GLuint const *") IntBuffer signalSemaphoreArray, @NativeType("GLuint64 const *") LongBuffer signalValueArray) { + if (CHECKS) { + check(fenceValueArray, waitSemaphoreArray.remaining()); + check(signalValueArray, signalSemaphoreArray.remaining()); + } + return nglAsyncCopyBufferSubDataNVX(waitSemaphoreArray.remaining(), memAddress(waitSemaphoreArray), memAddress(fenceValueArray), readGpu, writeGpuMask, readBuffer, writeBuffer, readOffset, writeOffset, size, signalSemaphoreArray.remaining(), memAddress(signalSemaphoreArray), memAddress(signalValueArray)); + } + + // --- [ glUploadGpuMaskNVX ] --- + + public static native void glUploadGpuMaskNVX(@NativeType("GLbitfield") int mask); + + // --- [ glMulticastViewportArrayvNVX ] --- + + public static native void nglMulticastViewportArrayvNVX(int gpu, int first, int count, long v); + + public static void glMulticastViewportArrayvNVX(@NativeType("GLuint") int gpu, @NativeType("GLuint") int first, @NativeType("GLfloat const *") FloatBuffer v) { + nglMulticastViewportArrayvNVX(gpu, first, v.remaining() >> 2, memAddress(v)); + } + + // --- [ glMulticastScissorArrayvNVX ] --- + + public static native void nglMulticastScissorArrayvNVX(int gpu, int first, int count, long v); + + public static void glMulticastScissorArrayvNVX(@NativeType("GLuint") int gpu, @NativeType("GLuint") int first, @NativeType("GLint const *") IntBuffer v) { + nglMulticastScissorArrayvNVX(gpu, first, v.remaining() >> 2, memAddress(v)); + } + + // --- [ glMulticastViewportPositionWScaleNVX ] --- + + public static native void glMulticastViewportPositionWScaleNVX(@NativeType("GLuint") int gpu, @NativeType("GLuint") int index, @NativeType("GLfloat") float xcoeff, @NativeType("GLfloat") float ycoeff); + + /** Array version of: {@link #glAsyncCopyImageSubDataNVX AsyncCopyImageSubDataNVX} */ + @NativeType("GLuint") + public static int glAsyncCopyImageSubDataNVX(@NativeType("GLuint const *") int[] waitSemaphoreArray, @NativeType("GLuint64 const *") long[] waitValueArray, @NativeType("GLuint") int srcGpu, @NativeType("GLbitfield") int dstGpuMask, @NativeType("GLuint") int srcName, @NativeType("GLenum") int srcTarget, @NativeType("GLint") int srcLevel, @NativeType("GLint") int srcX, @NativeType("GLint") int srcY, @NativeType("GLint") int srcZ, @NativeType("GLuint") int dstName, @NativeType("GLenum") int dstTarget, @NativeType("GLint") int dstLevel, @NativeType("GLint") int dstX, @NativeType("GLint") int dstY, @NativeType("GLint") int dstZ, @NativeType("GLsizei") int srcWidth, @NativeType("GLsizei") int srcHeight, @NativeType("GLsizei") int srcDepth, @NativeType("GLuint const *") int[] signalSemaphoreArray, @NativeType("GLuint64 const *") long[] signalValueArray) { + long __functionAddress = GL.getICD().glAsyncCopyImageSubDataNVX; + if (CHECKS) { + check(__functionAddress); + check(waitValueArray, waitSemaphoreArray.length); + check(signalValueArray, signalSemaphoreArray.length); + } + return callPPPPI(waitSemaphoreArray.length, waitSemaphoreArray, waitValueArray, srcGpu, dstGpuMask, srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth, signalSemaphoreArray.length, signalSemaphoreArray, signalValueArray, __functionAddress); + } + + /** Array version of: {@link #glAsyncCopyBufferSubDataNVX AsyncCopyBufferSubDataNVX} */ + @NativeType("GLsync") + public static long glAsyncCopyBufferSubDataNVX(@NativeType("GLuint const *") int[] waitSemaphoreArray, @NativeType("GLuint64 const *") long[] fenceValueArray, @NativeType("GLuint") int readGpu, @NativeType("GLbitfield") int writeGpuMask, @NativeType("GLuint") int readBuffer, @NativeType("GLuint") int writeBuffer, @NativeType("GLintptr") long readOffset, @NativeType("GLintptr") long writeOffset, @NativeType("GLsizeiptr") long size, @NativeType("GLuint const *") int[] signalSemaphoreArray, @NativeType("GLuint64 const *") long[] signalValueArray) { + long __functionAddress = GL.getICD().glAsyncCopyBufferSubDataNVX; + if (CHECKS) { + check(__functionAddress); + check(fenceValueArray, waitSemaphoreArray.length); + check(signalValueArray, signalSemaphoreArray.length); + } + return callPPPPPPPP(waitSemaphoreArray.length, waitSemaphoreArray, fenceValueArray, readGpu, writeGpuMask, readBuffer, writeBuffer, readOffset, writeOffset, size, signalSemaphoreArray.length, signalSemaphoreArray, signalValueArray, __functionAddress); + } + + /** Array version of: {@link #glMulticastViewportArrayvNVX MulticastViewportArrayvNVX} */ + public static void glMulticastViewportArrayvNVX(@NativeType("GLuint") int gpu, @NativeType("GLuint") int first, @NativeType("GLfloat const *") float[] v) { + long __functionAddress = GL.getICD().glMulticastViewportArrayvNVX; + if (CHECKS) { + check(__functionAddress); + } + callPV(gpu, first, v.length >> 2, v, __functionAddress); + } + + /** Array version of: {@link #glMulticastScissorArrayvNVX MulticastScissorArrayvNVX} */ + public static void glMulticastScissorArrayvNVX(@NativeType("GLuint") int gpu, @NativeType("GLuint") int first, @NativeType("GLint const *") int[] v) { + long __functionAddress = GL.getICD().glMulticastScissorArrayvNVX; + if (CHECKS) { + check(__functionAddress); + } + callPV(gpu, first, v.length >> 2, v, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXProgressFence.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXProgressFence.java new file mode 100644 index 000000000..b8321dad6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/NVXProgressFence.java @@ -0,0 +1,108 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the NVX_progress_fence extension. + * + *

    This extension uses the concept of GL semaphores as defined in {@link EXTSemaphore EXT_semaphore} to better coordinate operations between multiple GPU command + * streams. A semaphore type called "progress fence" is derived from the GL semaphore. The progress fence semaphore is created by + * {@link #glCreateProgressFenceNVX CreateProgressFenceNVX}) returning the name of a newly created semaphore object. Like other semaphores, these are signaled by the GL server. Each + * signal operation is queued in the GPU command stream with an associated fence value that is written to the semaphore at the completion of a signal + * operation.

    + * + *

    A GL server wait can be added to the command stream using {@link #glWaitSemaphoreui64NVX WaitSemaphoreui64NVX}. This blocks the GPU until the progress fence semaphore reaches or + * exceeds the specified fence value.

    + * + *

    A GL client wait can be initiated using {@link #glClientWaitSemaphoreui64NVX ClientWaitSemaphoreui64NVX}. This blocks the CPU until the specified fence value is reached.

    + * + *

    Requires {@code EXT_external_objects} and {@code EXT_external_objects_win32}.

    + */ +public class NVXProgressFence { + + static { GL.initialize(); } + + protected NVXProgressFence() { + throw new UnsupportedOperationException(); + } + + // --- [ glCreateProgressFenceNVX ] --- + + @NativeType("GLuint") + public static native int glCreateProgressFenceNVX(); + + // --- [ glSignalSemaphoreui64NVX ] --- + + public static native void nglSignalSemaphoreui64NVX(int signalGpu, int fenceObjectCount, long semaphoreArray, long fenceValueArray); + + public static void glSignalSemaphoreui64NVX(@NativeType("GLuint") int signalGpu, @NativeType("GLuint const *") IntBuffer semaphoreArray, @NativeType("GLuint64 const *") LongBuffer fenceValueArray) { + if (CHECKS) { + check(fenceValueArray, semaphoreArray.remaining()); + } + nglSignalSemaphoreui64NVX(signalGpu, semaphoreArray.remaining(), memAddress(semaphoreArray), memAddress(fenceValueArray)); + } + + // --- [ glWaitSemaphoreui64NVX ] --- + + public static native void nglWaitSemaphoreui64NVX(int waitGpu, int fenceObjectCount, long semaphoreArray, long fenceValueArray); + + public static void glWaitSemaphoreui64NVX(@NativeType("GLuint") int waitGpu, @NativeType("GLuint const *") IntBuffer semaphoreArray, @NativeType("GLuint64 const *") LongBuffer fenceValueArray) { + if (CHECKS) { + check(fenceValueArray, semaphoreArray.remaining()); + } + nglWaitSemaphoreui64NVX(waitGpu, semaphoreArray.remaining(), memAddress(semaphoreArray), memAddress(fenceValueArray)); + } + + // --- [ glClientWaitSemaphoreui64NVX ] --- + + public static native void nglClientWaitSemaphoreui64NVX(int fenceObjectCount, long semaphoreArray, long fenceValueArray); + + public static void glClientWaitSemaphoreui64NVX(@NativeType("GLuint const *") IntBuffer semaphoreArray, @NativeType("GLuint64 const *") LongBuffer fenceValueArray) { + if (CHECKS) { + check(fenceValueArray, semaphoreArray.remaining()); + } + nglClientWaitSemaphoreui64NVX(semaphoreArray.remaining(), memAddress(semaphoreArray), memAddress(fenceValueArray)); + } + + /** Array version of: {@link #glSignalSemaphoreui64NVX SignalSemaphoreui64NVX} */ + public static void glSignalSemaphoreui64NVX(@NativeType("GLuint") int signalGpu, @NativeType("GLuint const *") int[] semaphoreArray, @NativeType("GLuint64 const *") long[] fenceValueArray) { + long __functionAddress = GL.getICD().glSignalSemaphoreui64NVX; + if (CHECKS) { + check(__functionAddress); + check(fenceValueArray, semaphoreArray.length); + } + callPPV(signalGpu, semaphoreArray.length, semaphoreArray, fenceValueArray, __functionAddress); + } + + /** Array version of: {@link #glWaitSemaphoreui64NVX WaitSemaphoreui64NVX} */ + public static void glWaitSemaphoreui64NVX(@NativeType("GLuint") int waitGpu, @NativeType("GLuint const *") int[] semaphoreArray, @NativeType("GLuint64 const *") long[] fenceValueArray) { + long __functionAddress = GL.getICD().glWaitSemaphoreui64NVX; + if (CHECKS) { + check(__functionAddress); + check(fenceValueArray, semaphoreArray.length); + } + callPPV(waitGpu, semaphoreArray.length, semaphoreArray, fenceValueArray, __functionAddress); + } + + /** Array version of: {@link #glClientWaitSemaphoreui64NVX ClientWaitSemaphoreui64NVX} */ + public static void glClientWaitSemaphoreui64NVX(@NativeType("GLuint const *") int[] semaphoreArray, @NativeType("GLuint64 const *") long[] fenceValueArray) { + long __functionAddress = GL.getICD().glClientWaitSemaphoreui64NVX; + if (CHECKS) { + check(__functionAddress); + check(fenceValueArray, semaphoreArray.length); + } + callPPV(semaphoreArray.length, semaphoreArray, fenceValueArray, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/OVRMultiview.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/OVRMultiview.java new file mode 100644 index 000000000..f3d258f80 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/OVRMultiview.java @@ -0,0 +1,120 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +/** + * Native bindings to the OVR_multiview extension. + * + *

    The method of stereo rendering supported in OpenGL is currently achieved by rendering to the two eye buffers sequentially. This typically incurs double + * the application and driver overhead, despite the fact that the command streams and render states are almost identical.

    + * + *

    This extension seeks to address the inefficiency of sequential multiview rendering by adding a means to render to multiple elements of a 2D texture + * array simultaneously. In multiview rendering, draw calls are instanced into each corresponding element of the texture array. The vertex program uses a + * new {@code gl_ViewID_OVR} variable to compute per-view values, typically the vertex position and view-dependent variables like reflection.

    + * + *

    The formulation of this extension is high level in order to allow implementation freedom. On existing hardware, applications and drivers can realize + * the benefits of a single scene traversal, even if all GPU work is fully duplicated per-view. But future support could enable simultaneous rendering via + * multi-GPU, tile-based architectures could sort geometry into tiles for multiple views in a single pass, and the implementation could even choose to + * interleave at the fragment level for better texture cache utilization and more coherent fragment shader branching.

    + * + *

    The most obvious use case in this model is to support two simultaneous views: one view for each eye. However, we also anticipate a usage where two + * views are rendered per eye, where one has a wide field of view and the other has a narrow one. The nature of wide field of view planar projection is + * that the sample density can become unacceptably low in the view direction. By rendering two inset eye views per eye, we can get the required sample + * density in the center of projection without wasting samples, memory, and time by oversampling in the periphery.

    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ +public class OVRMultiview { + + static { GL.initialize(); } + + /** Accepted by the {@code pname} parameter of {@link GL30C#glGetFramebufferAttachmentParameteriv GetFramebufferAttachmentParameteriv}. */ + public static final int + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR = 0x9630, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR = 0x9632; + + /** Accepted by the {@code pname} parameter of GetIntegerv. */ + public static final int GL_MAX_VIEWS_OVR = 0x9631; + + /** Returned by {@link GL30C#glCheckFramebufferStatus CheckFramebufferStatus}. */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR = 0x9633; + + protected OVRMultiview() { + throw new UnsupportedOperationException(); + } + + // --- [ glFramebufferTextureMultiviewOVR ] --- + + /** + * Operates similarly to the {@link GL30C#glFramebufferTextureLayer FramebufferTextureLayer} command, except that {@code baseViewIndex} and {@code numViews} select a range of texture array + * elements that will be targeted when rendering. Such an attachment is considered multiview and rendering commands issued when such a framebuffer + * object is bound are termed "multiview rendering". The maximum number of views which can be bound simultaneously is determined by the value of + * {@link #GL_MAX_VIEWS_OVR MAX_VIEWS_OVR}, which can be queried with the {@link GL11C#glGetIntegerv GetIntegerv} command. + * + *

    The command

    + * + *
    
    +     * View( uint id );
    + * + *

    does not exist in the GL, but is used here to describe the multiview functionality in this section. The effect of this hypothetical function is to set + * the value of the shader built-in input {@code gl_ViewID_OVR}.

    + * + *

    When multiview rendering is enabled, the {@code Clear}, {@code ClearBuffer*}, {@code Draw*}, and {@code Dispatch*} commands have the same effect as:

    + * + *
    
    +     * for( int i = 0; i < numViews; i++ ) {
    +     *     FramebufferTextureLayer( target, attachment, texture, level, baseViewIndex + i );
    +     *     View( i );
    +     *     <drawing-command>
    +     * }
    + * + *

    The result is that every drawing command is broadcast into every active view. The shader uses {@code gl_ViewID_OVR} to compute view dependent outputs.

    + * + *

    The number of views, as specified by {@code numViews}, must be the same for all framebuffer attachments points where the value of + * {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE} is not {@link GL11#GL_NONE NONE} or the framebuffer is incomplete.

    + * + *

    If {@code texture} is non-zero and the command does not result in an error, the framebuffer attachment state corresponding to {@code attachment} is + * updated as in the {@link GL30C#glFramebufferTextureLayer FramebufferTextureLayer} command, except that the values of {@link GL30#GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER} and + * {@link #GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR} are is set to {@code baseViewIndex}, and the value of {@link #GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR} + * is set to {@code numViews}.

    + * + *
    Errors
    + * + *

    In addition to the corresponding errors for {@link GL30C#glFramebufferTextureLayer FramebufferTextureLayer} when called with the same parameters (other than {@code layer}):

    + * + *

    An {@link GL11#GL_INVALID_VALUE INVALID_VALUE} error is generated if:

    + * + *
      + *
    • {@code numViews} is less than 1 or if {@code numViews} is greater than {@link #GL_MAX_VIEWS_OVR MAX_VIEWS_OVR}.
    • + *
    • {@code texture} is a two-dimensional array texture and {@code baseViewIndex} + {@code numViews} is larger than the value of + * {@link GL30#GL_MAX_ARRAY_TEXTURE_LAYERS MAX_ARRAY_TEXTURE_LAYERS} minus one.
    • + *
    • {@code texture} is non-zero and {@code baseViewIndex} is negative.
    • + *
    + * + *

    An {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION} error is generated if texture is non-zero and is not the name of a two-dimensional array texture.

    + * + * @param target the framebuffer target. One of:
    {@link GL30#GL_FRAMEBUFFER FRAMEBUFFER}{@link GL30#GL_READ_FRAMEBUFFER READ_FRAMEBUFFER}{@link GL30#GL_DRAW_FRAMEBUFFER DRAW_FRAMEBUFFER}
    + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + * @param baseViewIndex the base framebuffer texture layer index + * @param numViews the number of views to target when rendering + */ + public static native void glFramebufferTextureMultiviewOVR(@NativeType("GLenum") int target, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int baseViewIndex, @NativeType("GLsizei") int numViews); + + // --- [ glNamedFramebufferTextureMultiviewOVR ] --- + + /** + * @param framebuffer the framebuffer name + * @param attachment the attachment point of the framebuffer. One of:
    {@link GL30#GL_COLOR_ATTACHMENT0 COLOR_ATTACHMENT0}{@link GL30#GL_COLOR_ATTACHMENT1 COLOR_ATTACHMENT1}{@link GL30#GL_COLOR_ATTACHMENT2 COLOR_ATTACHMENT2}{@link GL30#GL_COLOR_ATTACHMENT3 COLOR_ATTACHMENT3}
    {@link GL30#GL_COLOR_ATTACHMENT4 COLOR_ATTACHMENT4}{@link GL30#GL_COLOR_ATTACHMENT5 COLOR_ATTACHMENT5}{@link GL30#GL_COLOR_ATTACHMENT6 COLOR_ATTACHMENT6}{@link GL30#GL_COLOR_ATTACHMENT7 COLOR_ATTACHMENT7}
    {@link GL30#GL_COLOR_ATTACHMENT8 COLOR_ATTACHMENT8}{@link GL30#GL_COLOR_ATTACHMENT9 COLOR_ATTACHMENT9}{@link GL30#GL_COLOR_ATTACHMENT10 COLOR_ATTACHMENT10}{@link GL30#GL_COLOR_ATTACHMENT11 COLOR_ATTACHMENT11}
    {@link GL30#GL_COLOR_ATTACHMENT12 COLOR_ATTACHMENT12}{@link GL30#GL_COLOR_ATTACHMENT13 COLOR_ATTACHMENT13}{@link GL30#GL_COLOR_ATTACHMENT14 COLOR_ATTACHMENT14}{@link GL30#GL_COLOR_ATTACHMENT15 COLOR_ATTACHMENT15}
    {@link GL30#GL_COLOR_ATTACHMENT16 COLOR_ATTACHMENT16}{@link GL30#GL_COLOR_ATTACHMENT17 COLOR_ATTACHMENT17}{@link GL30#GL_COLOR_ATTACHMENT18 COLOR_ATTACHMENT18}{@link GL30#GL_COLOR_ATTACHMENT19 COLOR_ATTACHMENT19}
    {@link GL30#GL_COLOR_ATTACHMENT20 COLOR_ATTACHMENT20}{@link GL30#GL_COLOR_ATTACHMENT21 COLOR_ATTACHMENT21}{@link GL30#GL_COLOR_ATTACHMENT22 COLOR_ATTACHMENT22}{@link GL30#GL_COLOR_ATTACHMENT23 COLOR_ATTACHMENT23}
    {@link GL30#GL_COLOR_ATTACHMENT24 COLOR_ATTACHMENT24}{@link GL30#GL_COLOR_ATTACHMENT25 COLOR_ATTACHMENT25}{@link GL30#GL_COLOR_ATTACHMENT26 COLOR_ATTACHMENT26}{@link GL30#GL_COLOR_ATTACHMENT27 COLOR_ATTACHMENT27}
    {@link GL30#GL_COLOR_ATTACHMENT28 COLOR_ATTACHMENT28}{@link GL30#GL_COLOR_ATTACHMENT29 COLOR_ATTACHMENT29}{@link GL30#GL_COLOR_ATTACHMENT30 COLOR_ATTACHMENT30}{@link GL30#GL_COLOR_ATTACHMENT31 COLOR_ATTACHMENT31}
    {@link GL30#GL_DEPTH_ATTACHMENT DEPTH_ATTACHMENT}{@link GL30#GL_STENCIL_ATTACHMENT STENCIL_ATTACHMENT}{@link GL30#GL_DEPTH_STENCIL_ATTACHMENT DEPTH_STENCIL_ATTACHMENT}
    + * @param texture the texture object to attach to the framebuffer attachment point named by {@code attachment} + * @param level the mipmap level of {@code texture} to attach + */ + public static native void glNamedFramebufferTextureMultiviewOVR(@NativeType("GLuint") int framebuffer, @NativeType("GLenum") int attachment, @NativeType("GLuint") int texture, @NativeType("GLint") int level, @NativeType("GLint") int baseViewIndex, @NativeType("GLsizei") int numViews); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/OpenGLException.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/OpenGLException.java new file mode 100644 index 000000000..29fec005f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/OpenGLException.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +/** + *

    + * Thrown by the debug build library of the LWJGL if any OpenGL operation causes an error. + * + * @author cix_foo + * @version $Revision$ + * $Id$ + */ +public class OpenGLException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + /** Constructor for OpenGLException. */ + public OpenGLException(int gl_error_code) { + this(createErrorMessage(gl_error_code)); + } + + private static String createErrorMessage(int gl_error_code) { + String error_string = Util.translateGLErrorString(gl_error_code); + return error_string + " (" + gl_error_code + ")"; + } + + /** Constructor for OpenGLException. */ + public OpenGLException() { + super(); + } + + /** + * Constructor for OpenGLException. + * + * @param message + */ + public OpenGLException(String message) { + super(message); + } + + /** + * Constructor for OpenGLException. + * + * @param message + * @param cause + */ + public OpenGLException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Constructor for OpenGLException. + * + * @param cause + */ + public OpenGLException(Throwable cause) { + super(cause); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Pbuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Pbuffer.java new file mode 100644 index 000000000..e5ec5ad07 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Pbuffer.java @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; + +import java.nio.IntBuffer; + +/** + *

    + * Pbuffer encapsulates an OpenGL pbuffer. + *

    + * + * This class is thread-safe. + * + * @author elias_naur + * @version $Revision$ + * $Id$ + */ +public final class Pbuffer extends DrawableGL { + /** + * Indicates that Pbuffers can be created. + */ + public static final int PBUFFER_SUPPORTED = 1 << 0; + + /** + * Indicates that Pbuffers can be used as render-textures. + */ + public static final int RENDER_TEXTURE_SUPPORTED = 1 << 1; + + /** + * Indicates that Pbuffers can be used as non-power-of-two render-textures. + */ + public static final int RENDER_TEXTURE_RECTANGLE_SUPPORTED = 1 << 2; + + /** + * Indicates that Pbuffers can be used as depth render-textures. + */ + public static final int RENDER_DEPTH_TEXTURE_SUPPORTED = 1 << 3; + + /** + * The render-to-texture mipmap level attribute. + */ + public static final int MIPMAP_LEVEL = RenderTexture.WGL_MIPMAP_LEVEL_ARB; + + /** + * The render-to-texture cube map face attribute. + */ + public static final int CUBE_MAP_FACE = RenderTexture.WGL_CUBE_MAP_FACE_ARB; + + /** + * The render-to-texture cube map positive X face value. + */ + public static final int TEXTURE_CUBE_MAP_POSITIVE_X = RenderTexture.WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB; + + /** + * The render-to-texture cube map negative X face value. + */ + public static final int TEXTURE_CUBE_MAP_NEGATIVE_X = RenderTexture.WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB; + + /** + * The render-to-texture cube map positive Y face value. + */ + public static final int TEXTURE_CUBE_MAP_POSITIVE_Y = RenderTexture.WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB; + + /** + * The render-to-texture cube map negative Y face value. + */ + public static final int TEXTURE_CUBE_MAP_NEGATIVE_Y = RenderTexture.WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB; + + /** + * The render-to-texture cube map positive Z face value. + */ + public static final int TEXTURE_CUBE_MAP_POSITIVE_Z = RenderTexture.WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB; + + /** + * The render-to-texture cube map negative Z face value. + */ + public static final int TEXTURE_CUBE_MAP_NEGATIVE_Z = RenderTexture.WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB; + + /** + * The Pbuffer front left buffer. + */ + public static final int FRONT_LEFT_BUFFER = RenderTexture.WGL_FRONT_LEFT_ARB; + + /** + * The Pbuffer front right buffer. + */ + public static final int FRONT_RIGHT_BUFFER = RenderTexture.WGL_FRONT_RIGHT_ARB; + + /** + * The Pbuffer back left buffer. + */ + public static final int BACK_LEFT_BUFFER = RenderTexture.WGL_BACK_LEFT_ARB; + + /** + * The Pbuffer back right buffer. + */ + public static final int BACK_RIGHT_BUFFER = RenderTexture.WGL_BACK_RIGHT_ARB; + + /** + * The Pbuffer depth buffer. + */ + public static final int DEPTH_BUFFER = RenderTexture.WGL_DEPTH_COMPONENT_NV; + + /** + * Width + */ + private final int width; + + /** + * Height + */ + private final int height; + + static { + Sys.initialize(); + } + + /** + * Create an instance of a Pbuffer with a unique OpenGL context. The buffer is single-buffered. + *

    + * NOTE: The Pbuffer will have its own context that shares display lists and textures with shared_context, + * or, if shared_context is null, the Display context if it is created. The Pbuffer + * will have its own OpenGL state. Therefore, state changes to a pbuffer will not be seen in the window context and vice versa. + *

    + * + * @param width Pbuffer width + * @param height Pbuffer height + * @param pixel_format Minimum Pbuffer context properties + * @param shared_drawable If non-null the Pbuffer will share display lists and textures with it. Otherwise, the Pbuffer will share + * with the Display context (if created). + */ + public Pbuffer(int width, int height, PixelFormat pixel_format, Drawable shared_drawable) throws LWJGLException { + this(width, height, pixel_format, null, shared_drawable); + } + + /** + * Create an instance of a Pbuffer with a unique OpenGL context. The buffer is single-buffered. + *

    + * NOTE: The Pbuffer will have its own context that shares display lists and textures with shared_context, + * or, if shared_context is null, the Display context if it is created. The Pbuffer + * will have its own OpenGL state. Therefore, state changes to a pbuffer will not be seen in the window context and vice versa. + *

    + * The renderTexture parameter defines the necessary state for enabling render-to-texture. When this parameter is null, + * render-to-texture is not available. Before using render-to-texture, the Pbuffer capabilities must be queried to ensure that + * it is supported. Currently only windows platform can support this feature, so it is recommended that EXT_framebuffer_object + * or similar is used if available, for maximum portability. + *

    + * + * @param width Pbuffer width + * @param height Pbuffer height + * @param pixel_format Minimum Pbuffer context properties + * @param renderTexture + * @param shared_drawable If non-null the Pbuffer will share display lists and textures with it. Otherwise, the Pbuffer will share + * with the Display context (if created). + */ + public Pbuffer(int width, int height, PixelFormat pixel_format, RenderTexture renderTexture, Drawable shared_drawable) throws LWJGLException { + this(width, height, pixel_format, renderTexture, shared_drawable, null); + } + + /** + * Create an instance of a Pbuffer with a unique OpenGL context. The buffer is single-buffered. + *

    + * NOTE: The Pbuffer will have its own context that shares display lists and textures with shared_context, + * or, if shared_context is null, the Display context if it is created. The Pbuffer + * will have its own OpenGL state. Therefore, state changes to a pbuffer will not be seen in the window context and vice versa. + *

    + * The renderTexture parameter defines the necessary state for enabling render-to-texture. When this parameter is null, + * render-to-texture is not available. Before using render-to-texture, the Pbuffer capabilities must be queried to ensure that + * it is supported. Currently only windows platform can support this feature, so it is recommended that EXT_framebuffer_object + * or similar is used if available, for maximum portability. + *

    + * + * @param width Pbuffer width + * @param height Pbuffer height + * @param pixel_format Minimum Pbuffer context properties + * @param renderTexture + * @param shared_drawable If non-null the Pbuffer will share display lists and textures with it. Otherwise, the Pbuffer will share + * with the Display context (if created). + * @param attribs The ContextAttribs to use when creating the context. (optional, may be null) + */ + public Pbuffer(int width, int height, PixelFormat pixel_format, RenderTexture renderTexture, Drawable shared_drawable, ContextAttribs attribs) throws LWJGLException { + if (pixel_format == null) + throw new NullPointerException("Pixel format must be non-null"); + this.width = width; + this.height = height; + this.peer_info = createPbuffer(width, height, pixel_format, attribs, renderTexture); + Context shared_context = null; + if ( shared_drawable == null ) + shared_drawable = Display.getDrawable(); // May be null + if (shared_drawable != null) + shared_context = ((DrawableLWJGL)shared_drawable).getContext(); + this.context = new ContextGL(peer_info, attribs, (ContextGL)shared_context); + } + + private static PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs, RenderTexture renderTexture) throws LWJGLException { + if ( renderTexture == null ) { + // Though null is a perfectly valid argument, Matrox Parhelia drivers expect + // a 0 terminated list, or else they crash. Supplying NULL or 0, should + // cause the drivers to use default settings + IntBuffer defaultAttribs = BufferUtils.createIntBuffer(1); + return Display.getImplementation().createPbuffer(width, height, pixel_format, attribs, null, defaultAttribs); + } else + return Display.getImplementation().createPbuffer(width, height, pixel_format, attribs, + renderTexture.pixelFormatCaps, + renderTexture.pBufferAttribs); + } + + /** + * Method to test for validity of the buffer. If this function returns true, the buffer contents is lost. The buffer can still + * be used, but the results are undefined. The application is expected to release the buffer if needed, destroy it and recreate + * a new buffer. + * + * @return true if the buffer is lost and destroyed, false if the buffer is valid. + */ + public synchronized boolean isBufferLost() { + checkDestroyed(); + return Display.getImplementation().isBufferLost(peer_info); + } + + /** + * Gets the Pbuffer capabilities. + * + * @return a bitmask of Pbuffer capabilities. + */ + public static int getCapabilities() { + return Display.getImplementation().getPbufferCapabilities(); + } + + // ----------------------------------------------------------------------------------------- + // ------------------------------- Render-to-Texture Methods ------------------------------- + // ----------------------------------------------------------------------------------------- + + /** + * Sets a render-to-texture attribute. + *

    + * The attrib parameter can be one of MIPMAP_LEVEL and CUBE_MAP_FACE. When the attrib parameter is CUBE_MAP_FACE then the value + * parameter can be on of the following: + *

    + * TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y + * TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z + * + * @param attrib + * @param value + */ + public synchronized void setAttrib(int attrib, int value) { + checkDestroyed(); + Display.getImplementation().setPbufferAttrib(peer_info, attrib, value); + } + + /** + * Binds the currently bound texture to the buffer specified. The buffer can be one of the following: + *

    + * FRONT_LEFT_BUFFER FRONT_RIGHT_BUFFER BACK_LEFT_BUFFER BACK_RIGHT_BUFFER DEPTH_BUFFER + * + * @param buffer + */ + public synchronized void bindTexImage(int buffer) { + checkDestroyed(); + Display.getImplementation().bindTexImageToPbuffer(peer_info, buffer); + } + + /** + * Releases the currently bound texture from the buffer specified. + * + * @param buffer + */ + public synchronized void releaseTexImage(int buffer) { + checkDestroyed(); + Display.getImplementation().releaseTexImageFromPbuffer(peer_info, buffer); + } + + /** + * @return Returns the height. + */ + public synchronized int getHeight() { + checkDestroyed(); + return height; + } + + /** + * @return Returns the width. + */ + public synchronized int getWidth() { + checkDestroyed(); + return width; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/PeerInfo.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/PeerInfo.java new file mode 100644 index 000000000..6b54f994b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/PeerInfo.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; + +import java.nio.ByteBuffer; + +/** + * + * @author elias_naur + * @version $Revision$ + * $Id$ + */ +abstract class PeerInfo { + private final ByteBuffer handle; + private Thread locking_thread; // Thread that has locked this PeerInfo + private int lock_count; + + protected PeerInfo(ByteBuffer handle) { + this.handle = handle; + } + + private void lockAndInitHandle() throws LWJGLException { + doLockAndInitHandle(); + } + + public final synchronized void unlock() throws LWJGLException { + if (lock_count <= 0) + throw new IllegalStateException("PeerInfo not locked!"); + if (Thread.currentThread() != locking_thread) + throw new IllegalStateException("PeerInfo already locked by " + locking_thread); + lock_count--; + if (lock_count == 0) { + doUnlock(); + locking_thread = null; + notify(); + } + } + + protected abstract void doLockAndInitHandle() throws LWJGLException; + protected abstract void doUnlock() throws LWJGLException; + + public final synchronized ByteBuffer lockAndGetHandle() throws LWJGLException { + Thread this_thread = Thread.currentThread(); + while (locking_thread != null && locking_thread != this_thread) { + try { + wait(); + } catch (InterruptedException e) { + LWJGLUtil.log("Interrupted while waiting for PeerInfo lock: " + e); + } + } + if (lock_count == 0) { + locking_thread = this_thread; + doLockAndInitHandle(); + } + lock_count++; + return getHandle(); + } + + protected final ByteBuffer getHandle() { + return handle; + } + + public void destroy() { + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/PixelFormat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/PixelFormat.java new file mode 100644 index 000000000..10559f30c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/PixelFormat.java @@ -0,0 +1,424 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +/** + * This class describes pixel format properties for an OpenGL context. Instances + * of this class is used as arguments to Display.create(), Pbuffer.create() and + * AWTGLCanvas, to indicate minimum required properties. + *

    + * Instants of this class are immutable. An example of the expected way to set + * the PixelFormat property values is the following: + * PixelFormat pf = new PixelFormat().withDepthBits(24).withSamples(4).withSRGB(true); + *

    + * WARNING: Some pixel formats are known to cause troubles on certain buggy drivers. + * Example: Under Windows, specifying samples != 0 will enable the ARB + * pixel format selection path, which could trigger a crash. + * + * @author elias_naur@sourceforge.net + * @version $Revision$ + */ +public final class PixelFormat implements PixelFormatLWJGL { + + /** + * The number of bits per pixel, exluding alpha. + * This parameter is ignored in Display.create(). + */ + private int bpp; + /** The number of alpha bits. */ + private int alpha; + /** The number of depth buffer bits */ + private int depth; + /** The number of stencil bits */ + private int stencil; + /** + * The number of samples to use in anti-aliasing. + * 0 means that anti-aliasing is disabled. + */ + private int samples; + /** + * The number of COLOR_SAMPLES_NV to use for Coverage Sample Anti-aliasing (CSAA). + * When this number is greater than 0, the {@code samples} property will be treated + * as if it were the COVERAGE_SAMPLES_NV property. + *

    + * This property is currently a no-op for the MacOS implementation. + */ + private int colorSamples; + /** The number of auxiliary buffers */ + private int num_aux_buffers; + /** The number of bits per pixel in the accumulation buffer */ + private int accum_bpp; + /** The number of alpha bits in the accumulation buffer */ + private int accum_alpha; + /** Whether this format requires a stereo buffer */ + private boolean stereo; + /** Whether this format specifies a floating point format */ + private boolean floating_point; + /** + * Whether this format specifies a packed floating point format (32 bit unsigned - R11F_G11F_B10F) + * This property is currently a no-op for the MacOS implementation. + */ + private boolean floating_point_packed; + /** + * Whether this format specifies an sRGB format + * This property is currently a no-op for the MacOS implementation. + */ + private boolean sRGB; + + /** + * Default pixel format is minimum 8 bits depth, and no alpha + * nor stencil requirements. + */ + public PixelFormat() { + this(0, 8, 0); + } + + public PixelFormat(int alpha, int depth, int stencil) { + this(alpha, depth, stencil, 0); + } + + public PixelFormat(int alpha, int depth, int stencil, int samples) { + this(0, alpha, depth, stencil, samples); + } + + public PixelFormat(int bpp, int alpha, int depth, int stencil, int samples) { + this(bpp, alpha, depth, stencil, samples, 0, 0, 0, false); + } + + public PixelFormat(int bpp, int alpha, int depth, int stencil, int samples, int num_aux_buffers, int accum_bpp, int accum_alpha, boolean stereo) { + this(bpp, alpha, depth, stencil, samples, num_aux_buffers, accum_bpp, accum_alpha, stereo, false); + } + + public PixelFormat(int bpp, int alpha, int depth, int stencil, int samples, int num_aux_buffers, int accum_bpp, int accum_alpha, boolean stereo, boolean floating_point) { + this.bpp = bpp; + this.alpha = alpha; + this.depth = depth; + this.stencil = stencil; + + this.samples = samples; + + this.num_aux_buffers = num_aux_buffers; + + this.accum_bpp = accum_bpp; + this.accum_alpha = accum_alpha; + + this.stereo = stereo; + + this.floating_point = floating_point; + this.floating_point_packed = false; + this.sRGB = false; + } + + private PixelFormat(final PixelFormat pf) { + this.bpp = pf.bpp; + this.alpha = pf.alpha; + this.depth = pf.depth; + this.stencil = pf.stencil; + + this.samples = pf.samples; + this.colorSamples = pf.colorSamples; + + this.num_aux_buffers = pf.num_aux_buffers; + + this.accum_bpp = pf.accum_bpp; + this.accum_alpha = pf.accum_alpha; + + this.stereo = pf.stereo; + + this.floating_point = pf.floating_point; + this.floating_point_packed = pf.floating_point_packed; + this.sRGB = pf.sRGB; + } + + public int getBitsPerPixel() { + return bpp; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new bits per pixel value. + * + * @param bpp the new bits per pixel value. + * + * @return the new PixelFormat + */ + public PixelFormat withBitsPerPixel(final int bpp) { + if ( bpp < 0 ) + throw new IllegalArgumentException("Invalid number of bits per pixel specified: " + bpp); + + final PixelFormat pf = new PixelFormat(this); + pf.bpp = bpp; + return pf; + } + + public int getAlphaBits() { + return alpha; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new alpha bits value. + * + * @param alpha the new alpha bits value. + * + * @return the new PixelFormat + */ + public PixelFormat withAlphaBits(final int alpha) { + if ( alpha < 0 ) + throw new IllegalArgumentException("Invalid number of alpha bits specified: " + alpha); + + final PixelFormat pf = new PixelFormat(this); + pf.alpha = alpha; + return pf; + } + + public int getDepthBits() { + return depth; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new depth bits value. + * + * @param depth the new depth bits value. + * + * @return the new PixelFormat + */ + public PixelFormat withDepthBits(final int depth) { + if ( depth < 0 ) + throw new IllegalArgumentException("Invalid number of depth bits specified: " + depth); + + final PixelFormat pf = new PixelFormat(this); + pf.depth = depth; + return pf; + } + + public int getStencilBits() { + return stencil; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new stencil bits value. + * + * @param stencil the new stencil bits value. + * + * @return the new PixelFormat + */ + public PixelFormat withStencilBits(final int stencil) { + if ( stencil < 0 ) + throw new IllegalArgumentException("Invalid number of stencil bits specified: " + stencil); + + final PixelFormat pf = new PixelFormat(this); + pf.stencil = stencil; + return pf; + } + + public int getSamples() { + return samples; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new samples value. + * + * @param samples the new samples value. + * + * @return the new PixelFormat + */ + public PixelFormat withSamples(final int samples) { + if ( samples < 0 ) + throw new IllegalArgumentException("Invalid number of samples specified: " + samples); + + final PixelFormat pf = new PixelFormat(this); + pf.samples = samples; + return pf; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new color samples values. + * A value greater than 0 is valid only if the {@code samples} property is also greater than 0. Additionally, the + * color samples value needs to be lower than or equal to the {@code samples} property. + * + * @param colorSamples the new color samples value. + * + * @return the new PixelFormat + */ + public PixelFormat withCoverageSamples(final int colorSamples) { + return withCoverageSamples(colorSamples, samples); + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new color samples + * and coverage samples values. + * + * @param colorSamples the new color samples value. This value must be lower than or equal to the coverage samples value. + * @param coverageSamples the new coverage samples value. + * + * @return the new PixelFormat + */ + public PixelFormat withCoverageSamples(final int colorSamples, final int coverageSamples) { + if ( coverageSamples < 0 || colorSamples < 0 || (coverageSamples == 0 && 0 < colorSamples) || coverageSamples < colorSamples ) + throw new IllegalArgumentException("Invalid number of coverage samples specified: " + coverageSamples + " - " + colorSamples); + + final PixelFormat pf = new PixelFormat(this); + pf.samples = coverageSamples; + pf.colorSamples = colorSamples; + return pf; + } + + public int getAuxBuffers() { + return num_aux_buffers; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new auxiliary buffers value. + * + * @param num_aux_buffers the new auxiliary buffers value. + * + * @return the new PixelFormat + */ + public PixelFormat withAuxBuffers(final int num_aux_buffers) { + if ( num_aux_buffers < 0 ) + throw new IllegalArgumentException("Invalid number of auxiliary buffers specified: " + num_aux_buffers); + + final PixelFormat pf = new PixelFormat(this); + pf.num_aux_buffers = num_aux_buffers; + return pf; + } + + public int getAccumulationBitsPerPixel() { + return accum_bpp; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new bits per pixel in the accumulation buffer value. + * + * @param accum_bpp the new bits per pixel in the accumulation buffer value. + * + * @return the new PixelFormat + */ + public PixelFormat withAccumulationBitsPerPixel(final int accum_bpp) { + if ( accum_bpp < 0 ) + throw new IllegalArgumentException("Invalid number of bits per pixel in the accumulation buffer specified: " + accum_bpp); + + final PixelFormat pf = new PixelFormat(this); + pf.accum_bpp = accum_bpp; + return pf; + } + + public int getAccumulationAlpha() { + return accum_alpha; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new alpha bits in the accumulation buffer value. + * + * @param accum_alpha the new alpha bits in the accumulation buffer value. + * + * @return the new PixelFormat + */ + public PixelFormat withAccumulationAlpha(final int accum_alpha) { + if ( accum_alpha < 0 ) + throw new IllegalArgumentException("Invalid number of alpha bits in the accumulation buffer specified: " + accum_alpha); + + final PixelFormat pf = new PixelFormat(this); + pf.accum_alpha = accum_alpha; + return pf; + } + + public boolean isStereo() { + return stereo; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new stereo value. + * + * @param stereo the new stereo value. + * + * @return the new PixelFormat + */ + public PixelFormat withStereo(final boolean stereo) { + final PixelFormat pf = new PixelFormat(this); + pf.stereo = stereo; + return pf; + } + + public boolean isFloatingPoint() { + return floating_point; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new floating point value. + * If floating_point is true, floating_point_packed will be reset to false. + * + * @param floating_point the new floating point value. + * + * @return the new PixelFormat + */ + public PixelFormat withFloatingPoint(final boolean floating_point) { + final PixelFormat pf = new PixelFormat(this); + pf.floating_point = floating_point; + if ( floating_point ) + pf.floating_point_packed = false; + return pf; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new packed floating point value. + * If floating_point_packed is true, floating_point will be reset to false. + * + * @param floating_point_packed the new packed floating point value. + * + * @return the new PixelFormat + */ + public PixelFormat withFloatingPointPacked(final boolean floating_point_packed) { + final PixelFormat pf = new PixelFormat(this); + pf.floating_point_packed = floating_point_packed; + if ( floating_point_packed ) + pf.floating_point = false; + return pf; + } + + public boolean isSRGB() { + return sRGB; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new sRGB value. + * + * @param sRGB the new floating point value. + * + * @return the new PixelFormat + */ + public PixelFormat withSRGB(final boolean sRGB) { + final PixelFormat pf = new PixelFormat(this); + pf.sRGB = sRGB; + return pf; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/PixelFormatLWJGL.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/PixelFormatLWJGL.java new file mode 100644 index 000000000..d270dac03 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/PixelFormatLWJGL.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2011 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.opengl; + +/** + * [INTERNAL USE ONLY] + * + * @author Spasi + */ +public interface PixelFormatLWJGL { + // Marker interface +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/RenderTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/RenderTexture.java new file mode 100644 index 000000000..8d30e1423 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/RenderTexture.java @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +import static org.lwjgl.opengl.GL11.GL_TRUE; + +import org.lwjgl.BufferUtils; + +import java.nio.IntBuffer; + +/** This class represents the state necessary for render-to-texture. */ +public final class RenderTexture { + + // ---------------------------------------------------------------------------------- + // ----------------------------- WGL_ARB_render_texture ----------------------------- + // ---------------------------------------------------------------------------------- + + /* + Accepted by the parameter of wglGetPixelFormatAttribivARB, + wglGetPixelFormatAttribfvARB, and the and + parameters of wglChoosePixelFormatARB: + */ + private static final int WGL_BIND_TO_TEXTURE_RGB_ARB = 0x2070; + private static final int WGL_BIND_TO_TEXTURE_RGBA_ARB = 0x2071; + + /* + Accepted by the parameter of wglCreatePbufferARB and + by the parameter of wglQueryPbufferARB: + */ + private static final int WGL_TEXTURE_FORMAT_ARB = 0x2072; + private static final int WGL_TEXTURE_TARGET_ARB = 0x2073; + private static final int WGL_MIPMAP_TEXTURE_ARB = 0x2074; + + /* + Accepted as a value in the parameter of + wglCreatePbufferARB and returned in the value parameter of + wglQueryPbufferARB when is WGL_TEXTURE_FORMAT_ARB: + */ + private static final int WGL_TEXTURE_RGB_ARB = 0x2075; + private static final int WGL_TEXTURE_RGBA_ARB = 0x2076; + + /* + Accepted as a value in the parameter of + wglCreatePbufferARB and returned in the value parameter of + wglQueryPbufferARB when is WGL_TEXTURE_TARGET_ARB: + */ + private static final int WGL_TEXTURE_CUBE_MAP_ARB = 0x2078; + private static final int WGL_TEXTURE_1D_ARB = 0x2079; + private static final int WGL_TEXTURE_2D_ARB = 0x207A; + private static final int WGL_NO_TEXTURE_ARB = 0x2077; + + /* + Accepted by the parameter of wglSetPbufferAttribARB and + by the parameter of wglQueryPbufferARB: + */ + static final int WGL_MIPMAP_LEVEL_ARB = 0x207B; + static final int WGL_CUBE_MAP_FACE_ARB = 0x207C; + + /* + Accepted as a value in the parameter of + wglSetPbufferAttribARB and returned in the value parameter of + wglQueryPbufferARB when is WGL_CUBE_MAP_FACE_ARB: + */ + static final int WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = 0x207D; + static final int WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = 0x207E; + static final int WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = 0x207F; + static final int WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = 0x2080; + static final int WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = 0x2081; + static final int WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = 0x2082; + + /* + Accepted by the parameter of wglBindTexImageARB and + wglReleaseTexImageARB: + */ + static final int WGL_FRONT_LEFT_ARB = 0x2083; + static final int WGL_FRONT_RIGHT_ARB = 0x2084; + static final int WGL_BACK_LEFT_ARB = 0x2085; + static final int WGL_BACK_RIGHT_ARB = 0x2086; + + /* + private static final int WGL_AUX0_ARB = 0x2087; + private static final int WGL_AUX1_ARB = 0x2088; + private static final int WGL_AUX2_ARB = 0x2089; + private static final int WGL_AUX3_ARB = 0x208A; + private static final int WGL_AUX4_ARB = 0x208B; + private static final int WGL_AUX5_ARB = 0x208C; + private static final int WGL_AUX6_ARB = 0x208D; + private static final int WGL_AUX7_ARB = 0x208E; + private static final int WGL_AUX8_ARB = 0x208F; + private static final int WGL_AUX9_ARB = 0x2090; + */ + + // ------------------------------------------------------------------------------------------- + // ----------------------------- WGL_NV_render_texture_rectangle ----------------------------- + // ------------------------------------------------------------------------------------------- + + /* + Accepted by the parameter of wglGetPixelFormatAttribivARB, + wglGetPixelFormatAttribfvARB, and the and + parameters of wglChoosePixelFormatARB: + */ + private static final int WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV = 0x20A0; + private static final int WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV = 0x20A1; + + /* + Accepted as a value in the parameter of wglCreatePbufferARB + and returned in the value parameter of wglQueryPbufferARB when + is WGL_TEXTURE_TARGET_ARB: + */ + private static final int WGL_TEXTURE_RECTANGLE_NV = 0x20A2; + + // --------------------------------------------------------------------------------------- + // ----------------------------- WGL_NV_render_depth_texture ----------------------------- + // --------------------------------------------------------------------------------------- + + /* + Accepted by the parameter of wglGetPixelFormatAttribivARB, + wglGetPixelFormatAttribfvARB, and the and + parameters of wglChoosePixelFormatARB: + */ + private static final int WGL_BIND_TO_TEXTURE_DEPTH_NV = 0x20A3; + private static final int WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV = 0x20A4; + + /* + Accepted by the parameter of wglCreatePbufferARB and + by the parameter of wglQueryPbufferARB: + */ + private static final int WGL_DEPTH_TEXTURE_FORMAT_NV = 0x20A5; + + /* + Accepted as a value in the parameter of wglCreatePbufferARB + and returned in the value parameter of wglQueryPbufferARB when + is WGL_DEPTH_TEXTURE_FORMAT_NV: + */ + private static final int WGL_TEXTURE_DEPTH_COMPONENT_NV = 0x20A6; + + /* + Accepted by the parameter of wglBindTexImageARB: + */ + static final int WGL_DEPTH_COMPONENT_NV = 0x20A7; + + /** The TEXTURE_1D target. */ + public static final int RENDER_TEXTURE_1D = WGL_TEXTURE_1D_ARB; + + /** The TEXTURE_2D target. */ + public static final int RENDER_TEXTURE_2D = WGL_TEXTURE_2D_ARB; + + /** The TEXTURE_RECTANGLE target. */ + public static final int RENDER_TEXTURE_RECTANGLE = WGL_TEXTURE_RECTANGLE_NV; + + /** The TEXTURE_CUBE_MAP target. */ + public static final int RENDER_TEXTURE_CUBE_MAP = WGL_TEXTURE_CUBE_MAP_ARB; + + IntBuffer pixelFormatCaps; + IntBuffer pBufferAttribs; + + /** + * Creates a RenderTexture object for enabling render-to-texture on a P-buffer. + *

    + * NOTE: Only one of useRGB and useRGBA can be true at the same time. + *

    + * NOTE: useRGB(A) and useDepth can be true at the same time, thus allowing two different render textures. + *

    + * NOTE: The target parameter can be one of the following: + *

    + * RENDER_TEXTURE_1D RENDER_TEXTURE_2D RENDER_TEXTURE_RECTANGLE RENDER_TEXTURE_CUBE_MAP + * + * @param useRGB - When true the P-buffer can be used as an RGB render texture. + * @param useRGBA - When true the P-buffer can be used as an RGBA render texture. + * @param useDepth - When true the P-buffer can be used as a depth render texture. + * @param isRectangle - When true rectangle textures will be allowed on the P-buffer. + * @param target - The texture target of the render texture. + * @param mipmaps - How many mipmap levels to allocate on the P-buffer. + */ + public RenderTexture(boolean useRGB, boolean useRGBA, boolean useDepth, boolean isRectangle, int target, int mipmaps) { + if ( useRGB && useRGBA ) + throw new IllegalArgumentException("A RenderTexture can't be both RGB and RGBA."); + + if ( mipmaps < 0 ) + throw new IllegalArgumentException("The mipmap levels can't be negative."); + + if ( isRectangle && target != RENDER_TEXTURE_RECTANGLE ) + throw new IllegalArgumentException("When the RenderTexture is rectangle the target must be RENDER_TEXTURE_RECTANGLE."); + + pixelFormatCaps = BufferUtils.createIntBuffer(4); + pBufferAttribs = BufferUtils.createIntBuffer(8); + + if ( useRGB ) { + pixelFormatCaps.put(isRectangle ? WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV : WGL_BIND_TO_TEXTURE_RGB_ARB); + pixelFormatCaps.put(GL_TRUE); + + pBufferAttribs.put(WGL_TEXTURE_FORMAT_ARB); + pBufferAttribs.put(WGL_TEXTURE_RGB_ARB); + } else if ( useRGBA ) { + pixelFormatCaps.put(isRectangle ? WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV : WGL_BIND_TO_TEXTURE_RGBA_ARB); + pixelFormatCaps.put(GL_TRUE); + + pBufferAttribs.put(WGL_TEXTURE_FORMAT_ARB); + pBufferAttribs.put(WGL_TEXTURE_RGBA_ARB); + } + + if ( useDepth ) { + pixelFormatCaps.put(isRectangle ? WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV : WGL_BIND_TO_TEXTURE_DEPTH_NV); + pixelFormatCaps.put(GL_TRUE); + + pBufferAttribs.put(WGL_DEPTH_TEXTURE_FORMAT_NV); + pBufferAttribs.put(WGL_TEXTURE_DEPTH_COMPONENT_NV); + } + + pBufferAttribs.put(WGL_TEXTURE_TARGET_ARB); + pBufferAttribs.put(target); + + if ( mipmaps != 0 ) { + pBufferAttribs.put(WGL_MIPMAP_TEXTURE_ARB); + pBufferAttribs.put(mipmaps); + } + + pixelFormatCaps.flip(); + pBufferAttribs.flip(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/S3S3TC.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/S3S3TC.java new file mode 100644 index 000000000..641ff819e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/S3S3TC.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the S3_s3tc extension. + * + *

    This extension allows specifying texture data in compressed S3TC format.

    + */ +public final class S3S3TC { + + /** Accepted by the ??? parameter of ??? (presumably by the {@code format} argument of TexImage2D?. */ + public static final int + GL_RGB_S3TC = 0x83A0, + GL_RGB4_S3TC = 0x83A1, + GL_RGBA_S3TC = 0x83A2, + GL_RGBA4_S3TC = 0x83A3, + GL_RGBA_DXT5_S3TC = 0x83A4, + GL_RGBA4_DXT5_S3TC = 0x83A5; + + private S3S3TC() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/SharedDrawable.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/SharedDrawable.java new file mode 100644 index 000000000..72273297e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/SharedDrawable.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +import org.lwjgl.LWJGLException; + +/** + * @author Spasi + */ + +/** + * A Drawable implementation that shares its context with another Drawable. This is useful + * for background loading of resources. See org.lwjgl.test.opengl.multithread.BackgroundLoad + * for an example. + * + * @author Spasi + */ +public final class SharedDrawable extends DrawableGL { + + public SharedDrawable(final Drawable drawable) throws LWJGLException { + this.context = (ContextGL)((DrawableLWJGL)drawable).createSharedContext(); + } + + public ContextGL createSharedContext() { + throw new UnsupportedOperationException(); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Sync.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Sync.java new file mode 100644 index 000000000..51560ddf2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Sync.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2002-2012 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.opengl; + +import org.lwjgl.Sys; + +/** +* A highly accurate sync method that continually adapts to the system +* it runs on to provide reliable results. +* +* @author Riven +* @author kappaOne +*/ +class Sync { + + /** number of nano seconds in a second */ + private static final long NANOS_IN_SECOND = 1000L * 1000L * 1000L; + + /** The time to sleep/yield until the next frame */ + private static long nextFrame = 0; + + /** whether the initialisation code has run */ + private static boolean initialised = false; + + /** for calculating the averages the previous sleep/yield times are stored */ + private static RunningAvg sleepDurations = new RunningAvg(10); + private static RunningAvg yieldDurations = new RunningAvg(10); + + + /** + * An accurate sync method that will attempt to run at a constant frame rate. + * It should be called once every frame. + * + * @param fps - the desired frame rate, in frames per second + */ + public static void sync(int fps) { + if (fps <= 0) return; + if (!initialised) initialise(); + + try { + // sleep until the average sleep time is greater than the time remaining till nextFrame + for (long t0 = getTime(), t1; (nextFrame - t0) > sleepDurations.avg(); t0 = t1) { + Thread.sleep(1); + sleepDurations.add((t1 = getTime()) - t0); // update average sleep time + } + + // slowly dampen sleep average if too high to avoid yielding too much + sleepDurations.dampenForLowResTicker(); + + // yield until the average yield time is greater than the time remaining till nextFrame + for (long t0 = getTime(), t1; (nextFrame - t0) > yieldDurations.avg(); t0 = t1) { + Thread.yield(); + yieldDurations.add((t1 = getTime()) - t0); // update average yield time + } + } catch (InterruptedException e) { + + } + + // schedule next frame, drop frame(s) if already too late for next frame + nextFrame = Math.max(nextFrame + NANOS_IN_SECOND / fps, getTime()); + } + + /** + * This method will initialise the sync method by setting initial + * values for sleepDurations/yieldDurations and nextFrame. + * + * If running on windows it will start the sleep timer fix. + */ + private static void initialise() { + initialised = true; + + sleepDurations.init(1000 * 1000); + yieldDurations.init((int) (-(getTime() - getTime()) * 1.333)); + + nextFrame = getTime(); + + String osName = System.getProperty("os.name"); + + if (osName.startsWith("Win")) { + // On windows the sleep functions can be highly inaccurate by + // over 10ms making in unusable. However it can be forced to + // be a bit more accurate by running a separate sleeping daemon + // thread. + Thread timerAccuracyThread = new Thread(new Runnable() { + public void run() { + try { + Thread.sleep(Long.MAX_VALUE); + } catch (Exception e) {} + } + }); + + timerAccuracyThread.setName("LWJGL Timer"); + timerAccuracyThread.setDaemon(true); + timerAccuracyThread.start(); + } + } + + /** + * Get the system time in nano seconds + * + * @return will return the current time in nano's + */ + private static long getTime() { + return (Sys.getTime() * NANOS_IN_SECOND) / Sys.getTimerResolution(); + } + + private static class RunningAvg { + private final long[] slots; + private int offset; + + private static final long DAMPEN_THRESHOLD = 10 * 1000L * 1000L; // 10ms + private static final float DAMPEN_FACTOR = 0.9f; // don't change: 0.9f is exactly right! + + public RunningAvg(int slotCount) { + this.slots = new long[slotCount]; + this.offset = 0; + } + + public void init(long value) { + while (this.offset < this.slots.length) { + this.slots[this.offset++] = value; + } + } + + public void add(long value) { + this.slots[this.offset++ % this.slots.length] = value; + this.offset %= this.slots.length; + } + + public long avg() { + long sum = 0; + for (int i = 0; i < this.slots.length; i++) { + sum += this.slots[i]; + } + return sum / this.slots.length; + } + + public void dampenForLowResTicker() { + if (this.avg() > DAMPEN_THRESHOLD) { + for (int i = 0; i < this.slots.length; i++) { + this.slots[i] *= DAMPEN_FACTOR; + } + } + } + } +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Util.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Util.java new file mode 100644 index 000000000..3e94a172e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/Util.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2002-2008 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.opengl; + +import static org.lwjgl.opengl.ARBImaging.GL_TABLE_TOO_LARGE; +import static org.lwjgl.opengl.GL11.GL_INVALID_ENUM; +import static org.lwjgl.opengl.GL11.GL_INVALID_OPERATION; +import static org.lwjgl.opengl.GL11.GL_INVALID_VALUE; +import static org.lwjgl.opengl.GL11.GL_NO_ERROR; +import static org.lwjgl.opengl.GL11.GL_OUT_OF_MEMORY; +import static org.lwjgl.opengl.GL11.GL_STACK_OVERFLOW; +import static org.lwjgl.opengl.GL11.GL_STACK_UNDERFLOW; +import static org.lwjgl.opengl.GL11.glGetError; +import static org.lwjgl.opengl.GL30.GL_INVALID_FRAMEBUFFER_OPERATION; + +/** + * Simple utility class. + * + * @author cix_foo + * @version $Revision$ + */ + +public final class Util { + /** No c'tor */ + private Util() { + } + + /** + * Throws OpenGLException if glGetError() returns anything else than GL_NO_ERROR + * + */ + public static void checkGLError() throws OpenGLException { + int err = glGetError(); + if ( err != GL_NO_ERROR ) { + throw new OpenGLException(err); + } + } + + /** + * Translate a GL error code to a String describing the error + */ + public static String translateGLErrorString(int error_code) { + switch (error_code) { + case GL_NO_ERROR: + return "No error"; + case GL_INVALID_ENUM: + return "Invalid enum"; + case GL_INVALID_VALUE: + return "Invalid value"; + case GL_INVALID_OPERATION: + return "Invalid operation"; + case GL_STACK_OVERFLOW: + return "Stack overflow"; + case GL_STACK_UNDERFLOW: + return "Stack underflow"; + case GL_OUT_OF_MEMORY: + return "Out of memory"; + case GL_TABLE_TOO_LARGE: + return "Table too large"; + case GL_INVALID_FRAMEBUFFER_OPERATION: + return "Invalid framebuffer operation"; + default: + return null; + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGL.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGL.java new file mode 100644 index 000000000..0206da126 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGL.java @@ -0,0 +1,281 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +import org.lwjgl.system.windows.*; + +/** Native bindings to WGL functionality. */ +public class WGL { + + static { GL.initialize(); } + + /** Contains the function pointers loaded from {@code GL.getFunctionProvider()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + CreateContext = apiGetFunctionAddress(GL.getFunctionProvider(), "wglCreateContext"), + CreateLayerContext = apiGetFunctionAddress(GL.getFunctionProvider(), "wglCreateLayerContext"), + CopyContext = apiGetFunctionAddress(GL.getFunctionProvider(), "wglCopyContext"), + DeleteContext = apiGetFunctionAddress(GL.getFunctionProvider(), "wglDeleteContext"), + GetCurrentContext = apiGetFunctionAddress(GL.getFunctionProvider(), "wglGetCurrentContext"), + GetCurrentDC = apiGetFunctionAddress(GL.getFunctionProvider(), "wglGetCurrentDC"), + GetProcAddress = apiGetFunctionAddress(GL.getFunctionProvider(), "wglGetProcAddress"), + MakeCurrent = apiGetFunctionAddress(GL.getFunctionProvider(), "wglMakeCurrent"), + ShareLists = apiGetFunctionAddress(GL.getFunctionProvider(), "wglShareLists"); + + } + + /** UseFontOutlines format. */ + public static final int + WGL_FONT_LINES = 0, + WGL_FONT_POLYGONS = 1; + + /** SwapLayerBuffers flags. */ + public static final int + WGL_SWAP_MAIN_PLANE = 0x1, + WGL_SWAP_OVERLAY1 = 0x2, + WGL_SWAP_OVERLAY2 = 0x4, + WGL_SWAP_OVERLAY3 = 0x8, + WGL_SWAP_OVERLAY4 = 0x10, + WGL_SWAP_OVERLAY5 = 0x20, + WGL_SWAP_OVERLAY6 = 0x40, + WGL_SWAP_OVERLAY7 = 0x80, + WGL_SWAP_OVERLAY8 = 0x100, + WGL_SWAP_OVERLAY9 = 0x200, + WGL_SWAP_OVERLAY10 = 0x400, + WGL_SWAP_OVERLAY11 = 0x800, + WGL_SWAP_OVERLAY12 = 0x1000, + WGL_SWAP_OVERLAY13 = 0x2000, + WGL_SWAP_OVERLAY14 = 0x4000, + WGL_SWAP_OVERLAY15 = 0x8000, + WGL_SWAP_UNDERLAY1 = 0x10000, + WGL_SWAP_UNDERLAY2 = 0x20000, + WGL_SWAP_UNDERLAY3 = 0x40000, + WGL_SWAP_UNDERLAY4 = 0x80000, + WGL_SWAP_UNDERLAY5 = 0x100000, + WGL_SWAP_UNDERLAY6 = 0x200000, + WGL_SWAP_UNDERLAY7 = 0x400000, + WGL_SWAP_UNDERLAY8 = 0x800000, + WGL_SWAP_UNDERLAY9 = 0x1000000, + WGL_SWAP_UNDERLAY10 = 0x2000000, + WGL_SWAP_UNDERLAY11 = 0x4000000, + WGL_SWAP_UNDERLAY12 = 0x8000000, + WGL_SWAP_UNDERLAY13 = 0x10000000, + WGL_SWAP_UNDERLAY14 = 0x20000000, + WGL_SWAP_UNDERLAY15 = 0x40000000; + + protected WGL() { + throw new UnsupportedOperationException(); + } + + // --- [ wglCreateContext ] --- + + /** Unsafe version of: {@link #wglCreateContext CreateContext} */ + public static native long nwglCreateContext(long hdc, long __functionAddress); + + /** + * Creates a new OpenGL rendering context, which is suitable for drawing on the device referenced by device. The rendering context has the same pixel + * format as the device context. + * + * @param hdc handle to a device context for which the function creates a suitable OpenGL rendering context + */ + @NativeType("HGLRC") + public static long wglCreateContext(@NativeType("HDC") long hdc) { + long __functionAddress = Functions.CreateContext; + if (CHECKS) { + check(hdc); + } + return nwglCreateContext(hdc, __functionAddress); + } + + // --- [ wglCreateLayerContext ] --- + + /** Unsafe version of: {@link #wglCreateLayerContext CreateLayerContext} */ + public static native long nwglCreateLayerContext(long hdc, int layerPlane, long __functionAddress); + + /** + * Creates a new OpenGL rendering context for drawing to a specified layer plane on a device context. + * + * @param hdc the device context for a new rendering context + * @param layerPlane the layer plane to which you want to bind a rendering context. The value 0 identifies the main plane. Positive values of {@code layerPlace} identify + * overlay planes, where 1 is the first overlay plane over the main plane, 2 is the second overlay plane over the first overlay plane, and so on. + * Negative values identify underlay planes, where 1 is the first underlay plane under the main plane, 2 is the second underlay plane under the first + * underlay plane, and so on. The number of overlay and underlay planes is given in the {@code reserved} member of the {@link PIXELFORMATDESCRIPTOR} + * structure. + */ + @NativeType("HGLRC") + public static long wglCreateLayerContext(@NativeType("HDC") long hdc, int layerPlane) { + long __functionAddress = Functions.CreateLayerContext; + if (CHECKS) { + check(hdc); + } + return nwglCreateLayerContext(hdc, layerPlane, __functionAddress); + } + + // --- [ wglCopyContext ] --- + + /** Unsafe version of: {@link #wglCopyContext CopyContext} */ + public static native int nwglCopyContext(long src, long dst, int mask, long __functionAddress); + + /** + * Copies selected groups of rendering states from one OpenGL rendering context to another. + * + * @param src the source OpenGL rendering context whose state information is to be copied + * @param dst the destination OpenGL rendering context to which state information is to be copied + * @param mask which groups of the {@code src} rendering state are to be copied to {@code dst}. It contains the bitwise-OR of the same symbolic names that are + * passed to the {@link GL11#glPushAttrib PushAttrib} function. You can use {@link GL11#GL_ALL_ATTRIB_BITS ALL_ATTRIB_BITS} to copy all the rendering state information. + */ + @NativeType("BOOL") + public static boolean wglCopyContext(@NativeType("HGLRC") long src, @NativeType("HGLRC") long dst, @NativeType("UINT") int mask) { + long __functionAddress = Functions.CopyContext; + if (CHECKS) { + check(src); + check(dst); + } + return nwglCopyContext(src, dst, mask, __functionAddress) != 0; + } + + // --- [ wglDeleteContext ] --- + + /** Unsafe version of: {@link #wglDeleteContext DeleteContext} */ + public static native int nwglDeleteContext(long context, long __functionAddress); + + /** + * Deletes a specified OpenGL rendering context. + * + * @param context handle to an OpenGL rendering context that the function will delete + */ + @NativeType("BOOL") + public static boolean wglDeleteContext(@NativeType("HGLRC") long context) { + long __functionAddress = Functions.DeleteContext; + if (CHECKS) { + check(context); + } + return nwglDeleteContext(context, __functionAddress) != 0; + } + + // --- [ wglGetCurrentContext ] --- + + /** Unsafe version of: {@link #wglGetCurrentContext GetCurrentContext} */ + public static native long nwglGetCurrentContext(long __functionAddress); + + /** Obtains a handle to the current OpenGL rendering context of the calling thread. */ + @NativeType("HGLRC") + public static long wglGetCurrentContext() { + long __functionAddress = Functions.GetCurrentContext; + return nwglGetCurrentContext(__functionAddress); + } + + // --- [ wglGetCurrentDC ] --- + + /** Unsafe version of: {@link #wglGetCurrentDC GetCurrentDC} */ + public static native long nwglGetCurrentDC(long __functionAddress); + + /** Obtains a handle to the device context that is associated with the current OpenGL rendering context of the calling thread. */ + @NativeType("HDC") + public static long wglGetCurrentDC() { + long __functionAddress = Functions.GetCurrentDC; + return nwglGetCurrentDC(__functionAddress); + } + + // --- [ wglGetProcAddress ] --- + + /** Unsafe version of: {@link #wglGetProcAddress GetProcAddress} */ + public static native long nwglGetProcAddress(long proc, long __functionAddress); + + /** Unsafe version of: {@link #wglGetProcAddress GetProcAddress} */ + public static long nwglGetProcAddress(long proc) { + long __functionAddress = Functions.GetProcAddress; + return nwglGetProcAddress(proc, __functionAddress); + } + + /** + * Returns the address of an OpenGL extension function for use with the current OpenGL rendering context. + * + * @param proc points to a null-terminated string that is the name of the extension function. The name of the extension function must be identical to a + * corresponding function implemented by OpenGL. + */ + @NativeType("PROC") + public static long wglGetProcAddress(@NativeType("LPCSTR") ByteBuffer proc) { + if (CHECKS) { + checkNT1(proc); + } + return nwglGetProcAddress(memAddress(proc)); + } + + /** + * Returns the address of an OpenGL extension function for use with the current OpenGL rendering context. + * + * @param proc points to a null-terminated string that is the name of the extension function. The name of the extension function must be identical to a + * corresponding function implemented by OpenGL. + */ + @NativeType("PROC") + public static long wglGetProcAddress(@NativeType("LPCSTR") CharSequence proc) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(proc, true); + long procEncoded = stack.getPointerAddress(); + return nwglGetProcAddress(procEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ wglMakeCurrent ] --- + + /** Unsafe version of: {@link #wglMakeCurrent MakeCurrent} */ + public static native int nwglMakeCurrent(long hdc, long hglrc, long __functionAddress); + + /** + * Makes a specified OpenGL rendering context the calling thread's current rendering context. All subsequent OpenGL calls made by the thread are drawn on + * the device identified by device. You can also use MakeCurrent to change the calling thread's current rendering context so it's no longer current. + * + * @param hdc handle to a device context. Subsequent OpenGL calls made by the calling thread are drawn on the device identified by {@code dc}. + * @param hglrc handle to an OpenGL rendering context that the function sets as the calling thread's rendering context. If {@code context} is {@code NULL}, the function + * makes the calling thread's current rendering context no longer current, and releases the device context that is used by the rendering context. In + * this case, {@code hdc} is ignored. + */ + @NativeType("BOOL") + public static boolean wglMakeCurrent(@NativeType("HDC") long hdc, @NativeType("HGLRC") long hglrc) { + long __functionAddress = Functions.MakeCurrent; + return nwglMakeCurrent(hdc, hglrc, __functionAddress) != 0; + } + + // --- [ wglShareLists ] --- + + /** Unsafe version of: {@link #wglShareLists ShareLists} */ + public static native int nwglShareLists(long hglrc1, long hglrc2, long __functionAddress); + + /** + * Enables multiple OpenGL rendering contexts to share a single display-list space. + * + * @param hglrc1 the OpenGL rendering context with which to share display lists. + * @param hglrc2 the OpenGL rendering context to share display lists with {@code hglrc1}. The {@code hglrc2} parameter should not contain any existing display lists + * when {@code wglShareLists} is called. + */ + @NativeType("BOOL") + public static boolean wglShareLists(@NativeType("HGLRC") long hglrc1, @NativeType("HGLRC") long hglrc2) { + long __functionAddress = Functions.ShareLists; + if (CHECKS) { + check(hglrc1); + check(hglrc2); + } + return nwglShareLists(hglrc1, hglrc2, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLAMDGPUAssociation.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLAMDGPUAssociation.java new file mode 100644 index 000000000..5d5fcde56 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLAMDGPUAssociation.java @@ -0,0 +1,324 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the WGL_AMD_gpu_association extension. + * + *

    There currently is no way for applications to efficiently use GPU resources in systems that contain more than one GPU. Vendors have provided methods + * that attempt to split the workload for an application among the available GPU resources. This has proven to be very inefficient because most + * applications were never written with these sorts of optimizations in mind.

    + * + *

    This extension provides a mechanism for applications to explicitly use the GPU resources on a given system individually. By providing this + * functionality, a driver allows applications to make appropriate decisions regarding where and when to distribute rendering tasks.

    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string} and {@link EXTFramebufferObject EXT_framebuffer_object}.

    + */ +public class WGLAMDGPUAssociation { + + /** Accepted by the {@code property} parameter of {@link #wglGetGPUInfoAMD GetGPUInfoAMD}. */ + public static final int + WGL_GPU_VENDOR_AMD = 0x1F00, + WGL_GPU_RENDERER_STRING_AMD = 0x1F01, + WGL_GPU_OPENGL_VERSION_STRING_AMD = 0x1F02, + WGL_GPU_FASTEST_TARGET_GPUS_AMD = 0x21A2, + WGL_GPU_RAM_AMD = 0x21A3, + WGL_GPU_CLOCK_AMD = 0x21A4, + WGL_GPU_NUM_PIPES_AMD = 0x21A5, + WGL_GPU_NUM_SIMD_AMD = 0x21A6, + WGL_GPU_NUM_RB_AMD = 0x21A7, + WGL_GPU_NUM_SPI_AMD = 0x21A8; + + protected WGLAMDGPUAssociation() { + throw new UnsupportedOperationException(); + } + + // --- [ wglGetGPUIDsAMD ] --- + + /** + * Unsafe version of: {@link #wglGetGPUIDsAMD GetGPUIDsAMD} + * + * @param maxCount the max number of IDs that can be returned + */ + public static int nwglGetGPUIDsAMD(int maxCount, long ids) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetGPUIDsAMD; + if (CHECKS) { + check(__functionAddress); + } + return callPI(maxCount, ids, __functionAddress); + } + + /** + * Returns the IDs for available GPUs. + * + *

    If the function succeeds, the return value is the number of total GPUs available. The value 0 is returned if no GPUs are available or if the call has + * failed. The ID 0 is reserved and will not be retuned as a valid GPU ID. If the array {@code ids} is {@code NULL}, the function will only return the total + * number of GPUs. {@code ids} will be tightly packed with no 0 values between valid ids.

    + * + * @param ids the array of returned IDs + */ + @NativeType("UINT") + public static int wglGetGPUIDsAMD(@Nullable @NativeType("UINT *") IntBuffer ids) { + return nwglGetGPUIDsAMD(remainingSafe(ids), memAddressSafe(ids)); + } + + // --- [ wglGetGPUInfoAMD ] --- + + /** + * Unsafe version of: {@link #wglGetGPUInfoAMD GetGPUInfoAMD} + * + * @param size the size of the {@code data} buffer + */ + public static int nwglGetGPUInfoAMD(int id, int property, int dataType, int size, long data) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetGPUInfoAMD; + if (CHECKS) { + check(__functionAddress); + } + return callPI(id, property, dataType, size, data, __functionAddress); + } + + /** + * Each GPU in a system may have different properties, performance characteristics and different supported OpenGL versions. Use this function to determine + * which GPU is best suited for a specific task. + * + *

    For a string, {@code size} will be the number of characters allocated and will include {@code NULL} termination. For arrays of type GL_UNSIGNED_INT, GL_INT, + * and GL_FLOAT {@code size} will be the array depth. If the function succeeds, the number of values written will be returned. If the number of values + * written is equal to {@code size}, the query should be repeated with a larger {@code data} buffer. Strings should be queried using the GL_UNSIGNED_BYTE + * type, are UTF-8 encoded and will be {@code NULL} terminated. If the function fails, -1 will be returned.

    + * + * @param id a GPU id obtained from calling {@link #wglGetGPUIDsAMD GetGPUIDsAMD} + * @param property the information being queried. One of:
    {@link #WGL_GPU_VENDOR_AMD GPU_VENDOR_AMD}{@link #WGL_GPU_RENDERER_STRING_AMD GPU_RENDERER_STRING_AMD}{@link #WGL_GPU_OPENGL_VERSION_STRING_AMD GPU_OPENGL_VERSION_STRING_AMD}{@link #WGL_GPU_FASTEST_TARGET_GPUS_AMD GPU_FASTEST_TARGET_GPUS_AMD}
    {@link #WGL_GPU_RAM_AMD GPU_RAM_AMD}{@link #WGL_GPU_CLOCK_AMD GPU_CLOCK_AMD}{@link #WGL_GPU_NUM_PIPES_AMD GPU_NUM_PIPES_AMD}{@link #WGL_GPU_NUM_SIMD_AMD GPU_NUM_SIMD_AMD}
    {@link #WGL_GPU_NUM_RB_AMD GPU_NUM_RB_AMD}{@link #WGL_GPU_NUM_SPI_AMD GPU_NUM_SPI_AMD}
    + * @param dataType the data type to be returned. One of:
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}
    + * @param data the buffer which will be filled with the requested information + */ + public static int wglGetGPUInfoAMD(@NativeType("UINT") int id, int property, @NativeType("GLenum") int dataType, @NativeType("void *") ByteBuffer data) { + return nwglGetGPUInfoAMD(id, property, dataType, data.remaining() >> GLChecks.typeToByteShift(dataType), memAddress(data)); + } + + /** + * Each GPU in a system may have different properties, performance characteristics and different supported OpenGL versions. Use this function to determine + * which GPU is best suited for a specific task. + * + *

    For a string, {@code size} will be the number of characters allocated and will include {@code NULL} termination. For arrays of type GL_UNSIGNED_INT, GL_INT, + * and GL_FLOAT {@code size} will be the array depth. If the function succeeds, the number of values written will be returned. If the number of values + * written is equal to {@code size}, the query should be repeated with a larger {@code data} buffer. Strings should be queried using the GL_UNSIGNED_BYTE + * type, are UTF-8 encoded and will be {@code NULL} terminated. If the function fails, -1 will be returned.

    + * + * @param id a GPU id obtained from calling {@link #wglGetGPUIDsAMD GetGPUIDsAMD} + * @param property the information being queried. One of:
    {@link #WGL_GPU_VENDOR_AMD GPU_VENDOR_AMD}{@link #WGL_GPU_RENDERER_STRING_AMD GPU_RENDERER_STRING_AMD}{@link #WGL_GPU_OPENGL_VERSION_STRING_AMD GPU_OPENGL_VERSION_STRING_AMD}{@link #WGL_GPU_FASTEST_TARGET_GPUS_AMD GPU_FASTEST_TARGET_GPUS_AMD}
    {@link #WGL_GPU_RAM_AMD GPU_RAM_AMD}{@link #WGL_GPU_CLOCK_AMD GPU_CLOCK_AMD}{@link #WGL_GPU_NUM_PIPES_AMD GPU_NUM_PIPES_AMD}{@link #WGL_GPU_NUM_SIMD_AMD GPU_NUM_SIMD_AMD}
    {@link #WGL_GPU_NUM_RB_AMD GPU_NUM_RB_AMD}{@link #WGL_GPU_NUM_SPI_AMD GPU_NUM_SPI_AMD}
    + * @param dataType the data type to be returned. One of:
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}
    + * @param data the buffer which will be filled with the requested information + */ + public static int wglGetGPUInfoAMD(@NativeType("UINT") int id, int property, @NativeType("GLenum") int dataType, @NativeType("void *") IntBuffer data) { + return nwglGetGPUInfoAMD(id, property, dataType, (int)(((long)data.remaining() << 2) >> GLChecks.typeToByteShift(dataType)), memAddress(data)); + } + + /** + * Each GPU in a system may have different properties, performance characteristics and different supported OpenGL versions. Use this function to determine + * which GPU is best suited for a specific task. + * + *

    For a string, {@code size} will be the number of characters allocated and will include {@code NULL} termination. For arrays of type GL_UNSIGNED_INT, GL_INT, + * and GL_FLOAT {@code size} will be the array depth. If the function succeeds, the number of values written will be returned. If the number of values + * written is equal to {@code size}, the query should be repeated with a larger {@code data} buffer. Strings should be queried using the GL_UNSIGNED_BYTE + * type, are UTF-8 encoded and will be {@code NULL} terminated. If the function fails, -1 will be returned.

    + * + * @param id a GPU id obtained from calling {@link #wglGetGPUIDsAMD GetGPUIDsAMD} + * @param property the information being queried. One of:
    {@link #WGL_GPU_VENDOR_AMD GPU_VENDOR_AMD}{@link #WGL_GPU_RENDERER_STRING_AMD GPU_RENDERER_STRING_AMD}{@link #WGL_GPU_OPENGL_VERSION_STRING_AMD GPU_OPENGL_VERSION_STRING_AMD}{@link #WGL_GPU_FASTEST_TARGET_GPUS_AMD GPU_FASTEST_TARGET_GPUS_AMD}
    {@link #WGL_GPU_RAM_AMD GPU_RAM_AMD}{@link #WGL_GPU_CLOCK_AMD GPU_CLOCK_AMD}{@link #WGL_GPU_NUM_PIPES_AMD GPU_NUM_PIPES_AMD}{@link #WGL_GPU_NUM_SIMD_AMD GPU_NUM_SIMD_AMD}
    {@link #WGL_GPU_NUM_RB_AMD GPU_NUM_RB_AMD}{@link #WGL_GPU_NUM_SPI_AMD GPU_NUM_SPI_AMD}
    + * @param dataType the data type to be returned. One of:
    {@link GL11#GL_UNSIGNED_INT UNSIGNED_INT}{@link GL11#GL_INT INT}{@link GL11#GL_FLOAT FLOAT}{@link GL11#GL_UNSIGNED_BYTE UNSIGNED_BYTE}
    + * @param data the buffer which will be filled with the requested information + */ + public static int wglGetGPUInfoAMD(@NativeType("UINT") int id, int property, @NativeType("GLenum") int dataType, @NativeType("void *") FloatBuffer data) { + return nwglGetGPUInfoAMD(id, property, dataType, (int)(((long)data.remaining() << 2) >> GLChecks.typeToByteShift(dataType)), memAddress(data)); + } + + // --- [ wglGetContextGPUIDAMD ] --- + + /** + * Determine which GPU a context is attached to. + * + *

    Unassociated contexts are created by calling {@link WGL#wglCreateContext CreateContext}. Although these contexts are unassociated, their use will still be tied to a single + * GPU in most cases. For this reason it is advantageous to be able to query the GPU an existing unassociated context resides on. If multiple GPUs are + * available, it would be undesirable to use one for rendering to visible surfaces and then chose the same one for off-screen rendering.

    + * + * @param hglrc the context for which the GPU id will be returned + */ + @NativeType("UINT") + public static int wglGetContextGPUIDAMD(@NativeType("HGLRC") long hglrc) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetContextGPUIDAMD; + if (CHECKS) { + check(__functionAddress); + check(hglrc); + } + return callPI(hglrc, __functionAddress); + } + + // --- [ wglCreateAssociatedContextAMD ] --- + + /** + * Creates an associated context. Upon successful creation, no pixel format is tied to an associated context. + * + * @param id a valid GPU id + */ + @NativeType("HGLRC") + public static long wglCreateAssociatedContextAMD(@NativeType("UINT") int id) { + long __functionAddress = GL.getCapabilitiesWGL().wglCreateAssociatedContextAMD; + if (CHECKS) { + check(__functionAddress); + } + return callP(id, __functionAddress); + } + + // --- [ wglCreateAssociatedContextAttribsAMD ] --- + + /** Unsafe version of: {@link #wglCreateAssociatedContextAttribsAMD CreateAssociatedContextAttribsAMD} */ + public static long nwglCreateAssociatedContextAttribsAMD(int id, long shareContext, long attribList) { + long __functionAddress = GL.getCapabilitiesWGL().wglCreateAssociatedContextAttribsAMD; + if (CHECKS) { + check(__functionAddress); + } + return callPPP(id, shareContext, attribList, __functionAddress); + } + + /** + * Create an associated context with a specific GL version. + * + *

    All capabilities and limitations of {@link WGLARBCreateContext#wglCreateContextAttribsARB CreateContextAttribsARB} apply to {@code CreateAssociatedContextAttribsAMD}.

    + * + * @param id a valid GPU id + * @param shareContext must either be {@code NULL} or that of an associated context created with the same GPU ID as {@code id} + * @param attribList a 0-terminated list of attributes for the context + */ + @NativeType("HGLRC") + public static long wglCreateAssociatedContextAttribsAMD(@NativeType("UINT") int id, @NativeType("HGLRC") long shareContext, @Nullable @NativeType("int const *") IntBuffer attribList) { + if (CHECKS) { + checkNTSafe(attribList); + } + return nwglCreateAssociatedContextAttribsAMD(id, shareContext, memAddressSafe(attribList)); + } + + // --- [ wglDeleteAssociatedContextAMD ] --- + + /** + * Deletes an associated context. An associated context cannot be deleted by calling {@link WGL#wglDeleteContext DeleteContext}. + * + * @param hglrc a valid associated context created by calling {@link #wglCreateAssociatedContextAMD CreateAssociatedContextAMD} + */ + @NativeType("BOOL") + public static boolean wglDeleteAssociatedContextAMD(@NativeType("HGLRC") long hglrc) { + long __functionAddress = GL.getCapabilitiesWGL().wglDeleteAssociatedContextAMD; + if (CHECKS) { + check(__functionAddress); + check(hglrc); + } + return callPI(hglrc, __functionAddress) != 0; + } + + // --- [ wglMakeAssociatedContextCurrentAMD ] --- + + /** + * Makes an associated context current in the current thread. + * + * @param hglrc a context handle created by calling {@link #wglCreateAssociatedContextAMD CreateAssociatedContextAMD} + */ + @NativeType("BOOL") + public static boolean wglMakeAssociatedContextCurrentAMD(@NativeType("HGLRC") long hglrc) { + long __functionAddress = GL.getCapabilitiesWGL().wglMakeAssociatedContextCurrentAMD; + if (CHECKS) { + check(__functionAddress); + check(hglrc); + } + return callPI(hglrc, __functionAddress) != 0; + } + + // --- [ wglGetCurrentAssociatedContextAMD ] --- + + /** Returns the current associated context in the current thread. */ + @NativeType("HGLRC") + public static long wglGetCurrentAssociatedContextAMD() { + long __functionAddress = GL.getCapabilitiesWGL().wglGetCurrentAssociatedContextAMD; + if (CHECKS) { + check(__functionAddress); + } + return callP(__functionAddress); + } + + // --- [ wglBlitContextFramebufferAMD ] --- + + /** + * Blits data from one context to another. This facilitates high performance data communication between multiple contexts. + * + * @param dstCtx the context handle for the write context + * @param srcX0 the source x0 coordinate + * @param srcY0 the source Y0 coordinate + * @param srcX1 the source X1 coordinate + * @param srcY1 the source Y1 coordinate + * @param dstX0 the destination X0 coordinate + * @param dstY0 the destination Y0 coordinate + * @param dstX1 the destination X1 coordinate + * @param dstY1 the destination Y1 coordinate + * @param mask the bitwise OR of a number of values indicating which buffers are to be copied. One or more of:
    {@link GL11#GL_COLOR_BUFFER_BIT COLOR_BUFFER_BIT}{@link GL11#GL_DEPTH_BUFFER_BIT DEPTH_BUFFER_BIT}{@link GL11#GL_STENCIL_BUFFER_BIT STENCIL_BUFFER_BIT}
    + * @param filter the interpolation method to apply if the image is stretched. One of:
    {@link GL11#GL_LINEAR LINEAR}{@link GL11#GL_NEAREST NEAREST}
    + */ + @NativeType("VOID") + public static void wglBlitContextFramebufferAMD(@NativeType("HGLRC") long dstCtx, @NativeType("GLint") int srcX0, @NativeType("GLint") int srcY0, @NativeType("GLint") int srcX1, @NativeType("GLint") int srcY1, @NativeType("GLint") int dstX0, @NativeType("GLint") int dstY0, @NativeType("GLint") int dstX1, @NativeType("GLint") int dstY1, @NativeType("GLbitfield") int mask, @NativeType("GLenum") int filter) { + long __functionAddress = GL.getCapabilitiesWGL().wglBlitContextFramebufferAMD; + if (CHECKS) { + check(__functionAddress); + check(dstCtx); + } + callPV(dstCtx, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter, __functionAddress); + } + + /** Array version of: {@link #wglGetGPUIDsAMD GetGPUIDsAMD} */ + @NativeType("UINT") + public static int wglGetGPUIDsAMD(@Nullable @NativeType("UINT *") int[] ids) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetGPUIDsAMD; + if (CHECKS) { + check(__functionAddress); + } + return callPI(lengthSafe(ids), ids, __functionAddress); + } + + /** Array version of: {@link #wglGetGPUInfoAMD GetGPUInfoAMD} */ + public static int wglGetGPUInfoAMD(@NativeType("UINT") int id, int property, @NativeType("GLenum") int dataType, @NativeType("void *") int[] data) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetGPUInfoAMD; + if (CHECKS) { + check(__functionAddress); + } + return callPI(id, property, dataType, data.length, data, __functionAddress); + } + + /** Array version of: {@link #wglGetGPUInfoAMD GetGPUInfoAMD} */ + public static int wglGetGPUInfoAMD(@NativeType("UINT") int id, int property, @NativeType("GLenum") int dataType, @NativeType("void *") float[] data) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetGPUInfoAMD; + if (CHECKS) { + check(__functionAddress); + } + return callPI(id, property, dataType, data.length, data, __functionAddress); + } + + /** Array version of: {@link #wglCreateAssociatedContextAttribsAMD CreateAssociatedContextAttribsAMD} */ + @NativeType("HGLRC") + public static long wglCreateAssociatedContextAttribsAMD(@NativeType("UINT") int id, @NativeType("HGLRC") long shareContext, @Nullable @NativeType("int const *") int[] attribList) { + long __functionAddress = GL.getCapabilitiesWGL().wglCreateAssociatedContextAttribsAMD; + if (CHECKS) { + check(__functionAddress); + checkNTSafe(attribList); + } + return callPPP(id, shareContext, attribList, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBBufferRegion.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBBufferRegion.java new file mode 100644 index 000000000..a21a829bb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBBufferRegion.java @@ -0,0 +1,123 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the WGL_ARB_buffer_region extension. + * + *

    The buffer region extension is a mechanism that allows an area of an OpenGL window to be saved in off-screen memory for quick restores. The off-screen + * memory can either be frame buffer memory or system memory, although frame buffer memory might offer optimal performance.

    + * + *

    A buffer region can be created for the front color, back color, depth, and/or stencil buffer. Multiple buffer regions for the same buffer type can + * exist.

    + */ +public class WGLARBBufferRegion { + + /** Accepted by the {@code type} parameter of {@link #wglCreateBufferRegionARB CreateBufferRegionARB}. */ + public static final int + WGL_FRONT_COLOR_BUFFER_BIT_ARB = 0x1, + WGL_BACK_COLOR_BUFFER_BIT_ARB = 0x2, + WGL_DEPTH_BUFFER_BIT_ARB = 0x4, + WGL_STENCIL_BUFFER_BIT_ARB = 0x8; + + protected WGLARBBufferRegion() { + throw new UnsupportedOperationException(); + } + + // --- [ wglCreateBufferRegionARB ] --- + + /** + * Creates a buffer region and returns a handle associated with it. + * + * @param hdc the device context for the device on which the buffer region is created + * @param layerPlane the layer plane. Positive values identify overlay planes, negative values identify underlay planes. A value of 0 identifies the main plane. + * @param type a bitwise OR of any of the following values indicating which buffers can be saved or restored. Multiple bits can be set and may result in better + * performance if multiple buffers are saved or restored. One of:
    {@link #WGL_FRONT_COLOR_BUFFER_BIT_ARB FRONT_COLOR_BUFFER_BIT_ARB}{@link #WGL_BACK_COLOR_BUFFER_BIT_ARB BACK_COLOR_BUFFER_BIT_ARB}{@link #WGL_DEPTH_BUFFER_BIT_ARB DEPTH_BUFFER_BIT_ARB}
    {@link #WGL_STENCIL_BUFFER_BIT_ARB STENCIL_BUFFER_BIT_ARB}
    + */ + @NativeType("HANDLE") + public static long wglCreateBufferRegionARB(@NativeType("HDC") long hdc, int layerPlane, @NativeType("UINT") int type) { + long __functionAddress = GL.getCapabilitiesWGL().wglCreateBufferRegionARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + } + return callPP(hdc, layerPlane, type, __functionAddress); + } + + // --- [ wglDeleteBufferRegionARB ] --- + + /** + * Deletes a buffer region. + * + * @param region a handle to a buffer region previously created with {@link #wglCreateBufferRegionARB CreateBufferRegionARB}. + */ + @NativeType("VOID") + public static void wglDeleteBufferRegionARB(@NativeType("HANDLE") long region) { + long __functionAddress = GL.getCapabilitiesWGL().wglDeleteBufferRegionARB; + if (CHECKS) { + check(__functionAddress); + check(region); + } + callPV(region, __functionAddress); + } + + // --- [ wglSaveBufferRegionARB ] --- + + /** + * Saves image, depth, and stencil data into the buffer region. + * + *

    Data outside the window for the specified rectangle is undefined. The OpenGL coordinate system is used for specifying the rectangle ({@code x} and + * {@code y} specify the lower-left corner of the rectangle).

    + * + *

    If an RC is current to the calling thread, a flush will occur before the save operation.

    + * + *

    The saved buffer region area can be freed by calling {@code wglSaveBufferRegionARB} with {@code width} or {@code height} set to a value of 0.

    + * + * @param region a handle to a buffer region previously created with {@link #wglCreateBufferRegionARB CreateBufferRegionARB}. + * @param x the window x-coordinate for the source rectangle + * @param y the window y-coordinate for the source rectangle + * @param width the source rectangle width + * @param height the source rectangle height + */ + @NativeType("BOOL") + public static boolean wglSaveBufferRegionARB(@NativeType("HANDLE") long region, int x, int y, int width, int height) { + long __functionAddress = GL.getCapabilitiesWGL().wglSaveBufferRegionARB; + if (CHECKS) { + check(__functionAddress); + check(region); + } + return callPI(region, x, y, width, height, __functionAddress) != 0; + } + + // --- [ wglRestoreBufferRegionARB ] --- + + /** + * Restores a previously saved buffer region. + * + * @param region a handle to a buffer region previously created with {@link #wglCreateBufferRegionARB CreateBufferRegionARB}. + * @param x the window x-coordinate for the destination rectangle + * @param y the window y-coordinate for the destination rectangle + * @param width the destination rectangle width + * @param height the destination rectangle height + * @param xSrc the buffer region x-coordinate for the source of the data + * @param ySrc the buffer region y-coordinate for the source of the data + */ + @NativeType("BOOL") + public static boolean wglRestoreBufferRegionARB(@NativeType("HANDLE") long region, int x, int y, int width, int height, int xSrc, int ySrc) { + long __functionAddress = GL.getCapabilitiesWGL().wglRestoreBufferRegionARB; + if (CHECKS) { + check(__functionAddress); + check(region); + } + return callPI(region, x, y, width, height, xSrc, ySrc, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBContextFlushControl.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBContextFlushControl.java new file mode 100644 index 000000000..04cb7ffce --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBContextFlushControl.java @@ -0,0 +1,29 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_ARB_context_flush_control extension. + * + *

    The WGL version of {@link KHRContextFlushControl}. This extension adds new context creation parameters the allow an application to specify the behavior + * that is desired when a context is made non-current, and specifically to opt out of the implicit flush behavior.

    + */ +public final class WGLARBContextFlushControl { + + /** Accepted as an attribute name in the {@code *attrib_list} argument to {@link WGLARBCreateContext#wglCreateContextAttribsARB CreateContextAttribsARB}. */ + public static final int WGL_CONTEXT_RELEASE_BEHAVIOR_ARB = 0x2097; + + /** + * Accepted as an attribute value for {@link #WGL_CONTEXT_RELEASE_BEHAVIOR_ARB CONTEXT_RELEASE_BEHAVIOR_ARB} in the {@code *attrib_list} argument to + * {@link WGLARBCreateContext#wglCreateContextAttribsARB CreateContextAttribsARB}. + */ + public static final int + WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB = 0x0, + WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB = 0x2098; + + private WGLARBContextFlushControl() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContext.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContext.java new file mode 100644 index 000000000..0d8637e01 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContext.java @@ -0,0 +1,90 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the WGL_ARB_create_context extension. + * + *

    With the advent of new versions of OpenGL which deprecate features and/or break backward compatibility with older versions, there is a need and desire + * to indicate at context creation which interface will be used. This extension add a new context creation routine with attributes specifying the GL + * version and context properties requested for the context.

    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string}.

    + */ +public class WGLARBCreateContext { + + /** Accepted as an attribute name in {@code attribList}. */ + public static final int + WGL_CONTEXT_MAJOR_VERSION_ARB = 0x2091, + WGL_CONTEXT_MINOR_VERSION_ARB = 0x2092, + WGL_CONTEXT_LAYER_PLANE_ARB = 0x2093, + WGL_CONTEXT_FLAGS_ARB = 0x2094; + + /** Accepted as bits in the attribute value for {@link #WGL_CONTEXT_FLAGS_ARB CONTEXT_FLAGS_ARB} in {@code attribList}. */ + public static final int + WGL_CONTEXT_DEBUG_BIT_ARB = 0x1, + WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = 0x2; + + /** New errors returned by {@link org.lwjgl.system.windows.WinBase#GetLastError}. */ + public static final int ERROR_INVALID_VERSION_ARB = 0x2095; + + protected WGLARBCreateContext() { + throw new UnsupportedOperationException(); + } + + // --- [ wglCreateContextAttribsARB ] --- + + /** Unsafe version of: {@link #wglCreateContextAttribsARB CreateContextAttribsARB} */ + public static long nwglCreateContextAttribsARB(long hdc, long shareContext, long attribList) { + long __functionAddress = GL.getCapabilitiesWGL().wglCreateContextAttribsARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + } + return callPPPP(hdc, shareContext, attribList, __functionAddress); + } + + /** + * Creates an OpenGL context. + * + *

    If {@code shareContext} is not {@code NULL}, then all shareable data (excluding OpenGL texture objects named 0) will be shared by {@code shareContext}, all + * other contexts {@code shareContext} already shares with, and the newly created context. An arbitrary number of contexts can share data in this fashion.

    + * + * @param attribList a list of attributes for the context. The list consists of a sequence of <name, value> pairs terminated by the value 0. If an attribute is not + * specified in {@code attribList}, then the default value is used instead. If an attribute is specified more than once, then the last value specified + * is used. + */ + @NativeType("HGLRC") + public static long wglCreateContextAttribsARB(@NativeType("HDC") long hdc, @NativeType("HGLRC") long shareContext, @Nullable @NativeType("int const *") IntBuffer attribList) { + if (CHECKS) { + checkNTSafe(attribList); + } + return nwglCreateContextAttribsARB(hdc, shareContext, memAddressSafe(attribList)); + } + + /** Array version of: {@link #wglCreateContextAttribsARB CreateContextAttribsARB} */ + @NativeType("HGLRC") + public static long wglCreateContextAttribsARB(@NativeType("HDC") long hdc, @NativeType("HGLRC") long shareContext, @Nullable @NativeType("int const *") int[] attribList) { + long __functionAddress = GL.getCapabilitiesWGL().wglCreateContextAttribsARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + checkNTSafe(attribList); + } + return callPPPP(hdc, shareContext, attribList, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextNoError.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextNoError.java new file mode 100644 index 000000000..75e211b22 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextNoError.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_ARB_create_context_no_error extension. + * + *

    This extension allows the creation of an OpenGL or OpenGL ES context that doesn't generate errors if the context supports a no error mode. The + * implications of this feature are discussed in the {@link KHRNoError KHR_no_error} extension.

    + * + *

    Requires {@link WGLARBCreateContext WGL_ARB_create_context}.

    + */ +public final class WGLARBCreateContextNoError { + + /** Accepted as an attribute name in the {@code *attrib_list} argument to {@link WGLARBCreateContext#wglCreateContextAttribsARB CreateContextAttribsARB}. */ + public static final int WGL_CONTEXT_OPENGL_NO_ERROR_ARB = 0x31B3; + + private WGLARBCreateContextNoError() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextProfile.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextProfile.java new file mode 100644 index 000000000..b7aeb194d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextProfile.java @@ -0,0 +1,30 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_ARB_create_context_profile extension. + * + *

    Adds an attribute to {@link WGLARBCreateContext}, specifying the GL profile requested for a context of OpenGL 3.2 or later.

    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string} and {@link GL32 OpenGL 3.2}.

    + */ +public final class WGLARBCreateContextProfile { + + /** Accepted as an attribute name in {@code attribList}. */ + public static final int WGL_CONTEXT_PROFILE_MASK_ARB = 0x9126; + + /** Accepted as bits in the attribute value for {@link #WGL_CONTEXT_PROFILE_MASK_ARB CONTEXT_PROFILE_MASK_ARB} in {@code attribList}. */ + public static final int + WGL_CONTEXT_CORE_PROFILE_BIT_ARB = 0x1, + WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = 0x2; + + /** New errors returned by {@link org.lwjgl.system.windows.WinBase#GetLastError}. */ + public static final int ERROR_INVALID_PROFILE_ARB = 0x2096; + + private WGLARBCreateContextProfile() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextRobustness.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextRobustness.java new file mode 100644 index 000000000..699633820 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBCreateContextRobustness.java @@ -0,0 +1,36 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_ARB_create_context_robustness extension. + * + *

    This extension allows creating an OpenGL context supporting robust buffer access behavior and a specified graphics reset notification behavior.

    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string}, {@link WGLARBCreateContext WGL_ARB_create_context} and {@link ARBRobustness ARB_robustness}.

    + */ +public final class WGLARBCreateContextRobustness { + + /** + * Accepted as a bit in the attribute value for {@link WGLARBCreateContext#WGL_CONTEXT_FLAGS_ARB CONTEXT_FLAGS_ARB} in the {@code attrib_list} argument to + * {@link WGLARBCreateContext#wglCreateContextAttribsARB CreateContextAttribsARB}. + */ + public static final int WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB = 0x4; + + /** Accepted as an attribute name in the {@code attrib_list} argument to {@link WGLARBCreateContext#wglCreateContextAttribsARB CreateContextAttribsARB}. */ + public static final int WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB = 0x8256; + + /** + * Accepted as an attribute value for {@link #WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB} in the {@code attrib_list} argument to + * {@link WGLARBCreateContext#wglCreateContextAttribsARB CreateContextAttribsARB}. + */ + public static final int + WGL_NO_RESET_NOTIFICATION_ARB = 0x8261, + WGL_LOSE_CONTEXT_ON_RESET_ARB = 0x8252; + + private WGLARBCreateContextRobustness() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBExtensionsString.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBExtensionsString.java new file mode 100644 index 000000000..19ab87c26 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBExtensionsString.java @@ -0,0 +1,54 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the WGL_ARB_extensions_string extension. + * + *

    This extension provides a way for applications to determine which WGL extensions are supported by a device. This is the foundation upon which other WGL + * extensions are built.

    + */ +public class WGLARBExtensionsString { + + protected WGLARBExtensionsString() { + throw new UnsupportedOperationException(); + } + + // --- [ wglGetExtensionsStringARB ] --- + + /** Unsafe version of: {@link #wglGetExtensionsStringARB GetExtensionsStringARB} */ + public static long nwglGetExtensionsStringARB(long hdc) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetExtensionsStringARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + } + return callPP(hdc, __functionAddress); + } + + /** + * Returns a list of supported extensions to WGL. Although the contents of the string is implementation specific, the string will be {@code NULL} terminated and + * will contain a space-separated list of extension names. (The extension names themselves do not contain spaces.) If there are no extensions then the + * empty string is returned. + * + * @param hdc the device context to query extensions for + */ + @Nullable + @NativeType("char const *") + public static String wglGetExtensionsStringARB(@NativeType("HDC") long hdc) { + long __result = nwglGetExtensionsStringARB(hdc); + return memASCIISafe(__result); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBFramebufferSRGB.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBFramebufferSRGB.java new file mode 100644 index 000000000..a114bc024 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBFramebufferSRGB.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_ARB_framebuffer_sRGB extension. + * + *

    WGL functionality for {@link ARBFramebufferSRGB ARB_framebuffer_sRGB}.

    + * + *

    Requires {@link WGLEXTExtensionsString WGL_EXT_extensions_string}, {@link WGLARBPixelFormat WGL_ARB_pixel_format} and {@link ARBFramebufferObject ARB_framebuffer_object}.

    + */ +public final class WGLARBFramebufferSRGB { + + /** + * Accepted by the {@code attributes} parameter of {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB} and the {@code attribIList} of + * {@link WGLARBPixelFormat#wglChoosePixelFormatARB ChoosePixelFormatARB}. + */ + public static final int WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB = 0x20A9; + + private WGLARBFramebufferSRGB() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBMakeCurrentRead.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBMakeCurrentRead.java new file mode 100644 index 000000000..f3c415b08 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBMakeCurrentRead.java @@ -0,0 +1,85 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the WGL_ARB_make_current_read extension. + * + *

    The association of a separate "read" and "draw" DC with the current context allows for preprocessing of image data in an "off screen" DC which is then + * read into a visible DC for final display.

    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string}.

    + */ +public class WGLARBMakeCurrentRead { + + /** New errors returned by {@link org.lwjgl.system.windows.WinBase#GetLastError}. */ + public static final int + ERROR_INVALID_PIXEL_TYPE_ARB = 0x2043, + ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB = 0x2054; + + protected WGLARBMakeCurrentRead() { + throw new UnsupportedOperationException(); + } + + // --- [ wglMakeContextCurrentARB ] --- + + /** + * Associates the context {@code hglrc} with the device {@code drawDC} for draws and the device {@code readDC} for reads. All subsequent OpenGL calls made + * by the calling thread are drawn on the device identified by {@code drawDC} and read on the device identified by {@code readDC}. + * + *

    The {@code drawDC} and {@code readDC} parameters must refer to drawing surfaces supported by OpenGL. These parameters need not be the same {@code hdc} + * that was passed to {@link WGL#wglCreateContext CreateContext} when {@code hglrc} was created. {@code drawDC} must have the same pixel format and be created on the same + * physical device as the {@code hdc} that was passed into wglCreateContext. {@code readDC} must be created on the same device as the {@code hdc} that was + * passed to wglCreateContext and it must support the same pixel type as the pixel format of the {@code hdc} that was passed to wglCreateContext.

    + * + *

    If {@code wglMakeContextCurrentARB} is used to associate a different device for reads than for draws, the "read" device will be used for the following + * OpenGL operations:

    + * + *
      + *
    1. Any pixel data that are sourced based on the value of {@link GL11#GL_READ_BUFFER READ_BUFFER}. Note, that accumulation operations use the value of {@code READ_BUFFER}, but + * are not allowed when a different device context is used for reads. In this case, the accumulation operation will generate {@link GL11#GL_INVALID_OPERATION INVALID_OPERATION}.
    2. + *
    3. Any depth values that are retrieved by {@link GL11C#glReadPixels ReadPixels}, {@link GL11#glCopyPixels CopyPixels}, or any OpenGL extension that sources depth images from the frame buffer in the + * manner of {@code ReadPixels} and {@code CopyPixels}.
    4. + *
    5. Any stencil values that are retrieved by {@code ReadPixels}, {@code CopyPixels}, or any OpenGL extension that sources stencil images from the + * framebuffer in the manner of {@code ReadPixels} and {@code CopyPixels}.
    6. + *
    + * + *

    These frame buffer values are taken from the surface associated with the device context specified by {@code readDC}.

    + * + * @param drawDC the "draw" device context + * @param readDC the "read" device context + * @param hglrc the OpenGL context + */ + @NativeType("BOOL") + public static boolean wglMakeContextCurrentARB(@NativeType("HDC") long drawDC, @NativeType("HDC") long readDC, @NativeType("HGLRC") long hglrc) { + long __functionAddress = GL.getCapabilitiesWGL().wglMakeContextCurrentARB; + if (CHECKS) { + check(__functionAddress); + check(drawDC); + check(readDC); + check(hglrc); + } + return callPPPI(drawDC, readDC, hglrc, __functionAddress) != 0; + } + + // --- [ wglGetCurrentReadDCARB ] --- + + /** Returns the "read" device context for the current OpenGL context. */ + @NativeType("HDC") + public static long wglGetCurrentReadDCARB() { + long __functionAddress = GL.getCapabilitiesWGL().wglGetCurrentReadDCARB; + if (CHECKS) { + check(__functionAddress); + } + return callP(__functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBMultisample.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBMultisample.java new file mode 100644 index 000000000..997431cbf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBMultisample.java @@ -0,0 +1,28 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_ARB_multisample extension. + * + *

    See {@link ARBMultisample} for details.

    + * + *

    Requires {@link WGLEXTExtensionsString WGL_EXT_extensions_string} and {@link WGLARBPixelFormat WGL_ARB_pixel_format}.

    + */ +public final class WGLARBMultisample { + + /** + * Accepted by the {@code attributes} parameter of {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB}, + * {@link WGLARBPixelFormat#wglGetPixelFormatAttribfvARB GetPixelFormatAttribfvARB}, and the {@code attribIList} and {@code attribFList} of + * {@link WGLARBPixelFormat#wglChoosePixelFormatARB ChoosePixelFormatARB}. + */ + public static final int + WGL_SAMPLE_BUFFERS_ARB = 0x2041, + WGL_SAMPLES_ARB = 0x2042; + + private WGLARBMultisample() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPbuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPbuffer.java new file mode 100644 index 000000000..be9162ffd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPbuffer.java @@ -0,0 +1,206 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the WGL_ARB_pbuffer extension. + * + *

    This extension defines pixel buffers (pbuffer for short). Pbuffers are additional non-visible rendering buffers for an OpenGL renderer. Pbuffers are + * equivalent to a window that has the same pixel format descriptor with the following exceptions:

    + * + *
      + *
    1. There is no rendering to a pbuffer by GDI.
    2. + *
    3. The pixel format descriptors used for a pbuffer can only be those that are supported by the ICD. Generic formats are not valid.
    4. + *
    5. The allocation of a pbuffer can fail if there are insufficient resources (i.e., all the pbuffer memory has been allocated).
    6. + *
    7. The pixel buffer might be lost if a display mode change occurs. A query is provided that can be called after a display mode change to determine the + * state of the pixel buffer.
    8. + *
    + * + *

    The intent of the pbuffer semantics is to enable implementations to allocate pbuffers in non-visible frame buffer memory. These pbuffers are intended to + * be "static" resources in that a program will typically allocate them only once rather than as a part of its rendering loop. (Pbuffers should be + * deallocated when the program is no longer using them -- for example, if the program is iconified.)

    + * + *

    The frame buffer resources that are associated with a pbuffer are also static and are deallocated when the pbuffer is destroyed or possibly when a + * display mode change occurs.

    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string} and {@link WGLARBPixelFormat WGL_ARB_pixel_format}.

    + */ +public class WGLARBPbuffer { + + /** + * Accepted by the {@code attribIList} parameter of {@link WGLARBPixelFormat#wglChoosePixelFormatARB ChoosePixelFormatARB} and the {@code attributes} parameter of + * {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB}. + */ + public static final int WGL_DRAW_TO_PBUFFER_ARB = 0x202D; + + /** Accepted by the {@code attributes} parameter of {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB}. */ + public static final int + WGL_MAX_PBUFFER_PIXELS_ARB = 0x202E, + WGL_MAX_PBUFFER_WIDTH_ARB = 0x202F, + WGL_MAX_PBUFFER_HEIGHT_ARB = 0x2030; + + /** Accepted by the {@code attribList} parameter of {@link #wglCreatePbufferARB CreatePbufferARB}. */ + public static final int WGL_PBUFFER_LARGEST_ARB = 0x2033; + + /** Accepted by the {@code attribute} parameter of {@link #wglQueryPbufferARB QueryPbufferARB}. */ + public static final int + WGL_PBUFFER_WIDTH_ARB = 0x2034, + WGL_PBUFFER_HEIGHT_ARB = 0x2035, + WGL_PBUFFER_LOST_ARB = 0x2036; + + protected WGLARBPbuffer() { + throw new UnsupportedOperationException(); + } + + // --- [ wglCreatePbufferARB ] --- + + /** Unsafe version of: {@link #wglCreatePbufferARB CreatePbufferARB} */ + public static long nwglCreatePbufferARB(long hdc, int pixelFormat, int width, int height, long attribList) { + long __functionAddress = GL.getCapabilitiesWGL().wglCreatePbufferARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + } + return callPPP(hdc, pixelFormat, width, height, attribList, __functionAddress); + } + + /** + * Creates a pixel buffer (pbuffer) and returns a handle to it. + * + *

    Support for pbuffers may be restricted to specific pixel formats. Use {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB} to query the {@link #WGL_DRAW_TO_PBUFFER_ARB DRAW_TO_PBUFFER_ARB} + * attribute to determine which pixel formats support the creation of pbuffers.

    + * + * @param hdc a device context for the device on which the pbuffer is created + * @param pixelFormat a non-generic pixel format descriptor index + * @param width the pixel width of the rectangular pbuffer + * @param height the pixel height of the rectangular pbuffer + * @param attribList a 0-terminated list of attributes {type, value} pairs containing integer attribute values + */ + @NativeType("HPBUFFERARB") + public static long wglCreatePbufferARB(@NativeType("HDC") long hdc, int pixelFormat, int width, int height, @Nullable @NativeType("int const *") IntBuffer attribList) { + if (CHECKS) { + checkNTSafe(attribList); + } + return nwglCreatePbufferARB(hdc, pixelFormat, width, height, memAddressSafe(attribList)); + } + + // --- [ wglGetPbufferDCARB ] --- + + /** + * Creates a device context for the pbuffer. + * + * @param pbuffer a pbuffer handle returned from a previous call to {@link #wglCreatePbufferARB CreatePbufferARB} + */ + @NativeType("HDC") + public static long wglGetPbufferDCARB(@NativeType("HPBUFFERARB") long pbuffer) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetPbufferDCARB; + if (CHECKS) { + check(__functionAddress); + check(pbuffer); + } + return callPP(pbuffer, __functionAddress); + } + + // --- [ wglReleasePbufferDCARB ] --- + + /** + * Releases a device context obtained from a previous call to {@link #wglGetPbufferDCARB GetPbufferDCARB}. + * + * @param pbuffer a pbuffer handle + * @param hdc a device context handle + */ + public static int wglReleasePbufferDCARB(@NativeType("HPBUFFERARB") long pbuffer, @NativeType("HDC") long hdc) { + long __functionAddress = GL.getCapabilitiesWGL().wglReleasePbufferDCARB; + if (CHECKS) { + check(__functionAddress); + check(pbuffer); + check(hdc); + } + return callPPI(pbuffer, hdc, __functionAddress); + } + + // --- [ wglDestroyPbufferARB ] --- + + /** + * Destroys a pbuffer. + * + *

    The pbuffer is destroyed once it is no longer current to any rendering context. When a pbuffer is destroyed, any memory resources that are attached to + * it are freed and its handle is no longer valid.

    + * + * @param pbuffer a pbuffer handle + */ + @NativeType("BOOL") + public static boolean wglDestroyPbufferARB(@NativeType("HPBUFFERARB") long pbuffer) { + long __functionAddress = GL.getCapabilitiesWGL().wglDestroyPbufferARB; + if (CHECKS) { + check(__functionAddress); + check(pbuffer); + } + return callPI(pbuffer, __functionAddress) != 0; + } + + // --- [ wglQueryPbufferARB ] --- + + /** Unsafe version of: {@link #wglQueryPbufferARB QueryPbufferARB} */ + public static int nwglQueryPbufferARB(long pbuffer, int attribute, long value) { + long __functionAddress = GL.getCapabilitiesWGL().wglQueryPbufferARB; + if (CHECKS) { + check(__functionAddress); + check(pbuffer); + } + return callPPI(pbuffer, attribute, value, __functionAddress); + } + + /** + * Queries an attribute associated with a specific pbuffer. + * + * @param pbuffer a pbuffer handle + * @param attribute the attribute to query. One of:
    {@link #WGL_PBUFFER_WIDTH_ARB PBUFFER_WIDTH_ARB}{@link #WGL_PBUFFER_HEIGHT_ARB PBUFFER_HEIGHT_ARB}{@link #WGL_PBUFFER_LOST_ARB PBUFFER_LOST_ARB}
    + * @param value the attribute value + */ + @NativeType("BOOL") + public static boolean wglQueryPbufferARB(@NativeType("HPBUFFERARB") long pbuffer, int attribute, @NativeType("int *") IntBuffer value) { + if (CHECKS) { + check(value, 1); + } + return nwglQueryPbufferARB(pbuffer, attribute, memAddress(value)) != 0; + } + + /** Array version of: {@link #wglCreatePbufferARB CreatePbufferARB} */ + @NativeType("HPBUFFERARB") + public static long wglCreatePbufferARB(@NativeType("HDC") long hdc, int pixelFormat, int width, int height, @Nullable @NativeType("int const *") int[] attribList) { + long __functionAddress = GL.getCapabilitiesWGL().wglCreatePbufferARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + checkNTSafe(attribList); + } + return callPPP(hdc, pixelFormat, width, height, attribList, __functionAddress); + } + + /** Array version of: {@link #wglQueryPbufferARB QueryPbufferARB} */ + @NativeType("BOOL") + public static boolean wglQueryPbufferARB(@NativeType("HPBUFFERARB") long pbuffer, int attribute, @NativeType("int *") int[] value) { + long __functionAddress = GL.getCapabilitiesWGL().wglQueryPbufferARB; + if (CHECKS) { + check(__functionAddress); + check(pbuffer); + check(value, 1); + } + return callPPI(pbuffer, attribute, value, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPixelFormat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPixelFormat.java new file mode 100644 index 000000000..a972aac2d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPixelFormat.java @@ -0,0 +1,278 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the WGL_ARB_pixel_format extension. + * + *

    This extension adds functions to query pixel format attributes and to choose from the list of supported pixel formats.

    + * + *

    These functions treat pixel formats as opaque types: attributes are specified by name rather than by accessing them directly as fields in a structure. + * Thus the list of attributes can be easily extended.

    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string}.

    + */ +public class WGLARBPixelFormat { + + /** + * Accepted in the {@code attributes} parameter array of {@link #wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB}, and {@link #wglGetPixelFormatAttribfvARB GetPixelFormatAttribfvARB}, and as a type in + * the {@code attribIList} and {@code attribFList} parameter arrays of {@link #wglChoosePixelFormatARB ChoosePixelFormatARB}. + */ + public static final int + WGL_NUMBER_PIXEL_FORMATS_ARB = 0x2000, + WGL_DRAW_TO_WINDOW_ARB = 0x2001, + WGL_DRAW_TO_BITMAP_ARB = 0x2002, + WGL_ACCELERATION_ARB = 0x2003, + WGL_NEED_PALETTE_ARB = 0x2004, + WGL_NEED_SYSTEM_PALETTE_ARB = 0x2005, + WGL_SWAP_LAYER_BUFFERS_ARB = 0x2006, + WGL_SWAP_METHOD_ARB = 0x2007, + WGL_NUMBER_OVERLAYS_ARB = 0x2008, + WGL_NUMBER_UNDERLAYS_ARB = 0x2009, + WGL_TRANSPARENT_ARB = 0x200A, + WGL_TRANSPARENT_RED_VALUE_ARB = 0x2037, + WGL_TRANSPARENT_GREEN_VALUE_ARB = 0x2038, + WGL_TRANSPARENT_BLUE_VALUE_ARB = 0x2039, + WGL_TRANSPARENT_ALPHA_VALUE_ARB = 0x203A, + WGL_TRANSPARENT_INDEX_VALUE_ARB = 0x203B, + WGL_SHARE_DEPTH_ARB = 0x200C, + WGL_SHARE_STENCIL_ARB = 0x200D, + WGL_SHARE_ACCUM_ARB = 0x200E, + WGL_SUPPORT_GDI_ARB = 0x200F, + WGL_SUPPORT_OPENGL_ARB = 0x2010, + WGL_DOUBLE_BUFFER_ARB = 0x2011, + WGL_STEREO_ARB = 0x2012, + WGL_PIXEL_TYPE_ARB = 0x2013, + WGL_COLOR_BITS_ARB = 0x2014, + WGL_RED_BITS_ARB = 0x2015, + WGL_RED_SHIFT_ARB = 0x2016, + WGL_GREEN_BITS_ARB = 0x2017, + WGL_GREEN_SHIFT_ARB = 0x2018, + WGL_BLUE_BITS_ARB = 0x2019, + WGL_BLUE_SHIFT_ARB = 0x201A, + WGL_ALPHA_BITS_ARB = 0x201B, + WGL_ALPHA_SHIFT_ARB = 0x201C, + WGL_ACCUM_BITS_ARB = 0x201D, + WGL_ACCUM_RED_BITS_ARB = 0x201E, + WGL_ACCUM_GREEN_BITS_ARB = 0x201F, + WGL_ACCUM_BLUE_BITS_ARB = 0x2020, + WGL_ACCUM_ALPHA_BITS_ARB = 0x2021, + WGL_DEPTH_BITS_ARB = 0x2022, + WGL_STENCIL_BITS_ARB = 0x2023, + WGL_AUX_BUFFERS_ARB = 0x2024; + + /** + * Accepted as a value in the {@code attribIList} and {@code attribFList} parameter arrays of {@link #wglChoosePixelFormatARB ChoosePixelFormatARB}, and returned in the + * {@code values} parameter array of {@link #wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB} and {@link #wglGetPixelFormatAttribfvARB GetPixelFormatAttribfvARB}. + */ + public static final int + WGL_NO_ACCELERATION_ARB = 0x2025, + WGL_GENERIC_ACCELERATION_ARB = 0x2026, + WGL_FULL_ACCELERATION_ARB = 0x2027, + WGL_SWAP_EXCHANGE_ARB = 0x2028, + WGL_SWAP_COPY_ARB = 0x2029, + WGL_SWAP_UNDEFINED_ARB = 0x202A, + WGL_TYPE_RGBA_ARB = 0x202B, + WGL_TYPE_COLORINDEX_ARB = 0x202C; + + protected WGLARBPixelFormat() { + throw new UnsupportedOperationException(); + } + + // --- [ wglGetPixelFormatAttribivARB ] --- + + /** + * Unsafe version of: {@link #wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB} + * + * @param n the number of attributes being queried + */ + public static int nwglGetPixelFormatAttribivARB(long hdc, int pixelFormat, int layerPlane, int n, long attributes, long values) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetPixelFormatAttribivARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + } + return callPPPI(hdc, pixelFormat, layerPlane, n, attributes, values, __functionAddress); + } + + /** + * @param hdc the device context on which the pixel format is supported + * @param pixelFormat an index that specifies the pixel format + * @param layerPlane the plane being queried + * @param attributes an array of pixel format attribute identifiers which specify the attributes to be queried. One of:
    {@link #WGL_NUMBER_PIXEL_FORMATS_ARB NUMBER_PIXEL_FORMATS_ARB}{@link #WGL_DRAW_TO_WINDOW_ARB DRAW_TO_WINDOW_ARB}{@link #WGL_DRAW_TO_BITMAP_ARB DRAW_TO_BITMAP_ARB}{@link #WGL_ACCELERATION_ARB ACCELERATION_ARB}
    {@link #WGL_NEED_PALETTE_ARB NEED_PALETTE_ARB}{@link #WGL_NEED_SYSTEM_PALETTE_ARB NEED_SYSTEM_PALETTE_ARB}{@link #WGL_SWAP_LAYER_BUFFERS_ARB SWAP_LAYER_BUFFERS_ARB}{@link #WGL_SWAP_METHOD_ARB SWAP_METHOD_ARB}
    {@link #WGL_NUMBER_OVERLAYS_ARB NUMBER_OVERLAYS_ARB}{@link #WGL_NUMBER_UNDERLAYS_ARB NUMBER_UNDERLAYS_ARB}{@link #WGL_TRANSPARENT_ARB TRANSPARENT_ARB}{@link #WGL_TRANSPARENT_RED_VALUE_ARB TRANSPARENT_RED_VALUE_ARB}
    {@link #WGL_TRANSPARENT_GREEN_VALUE_ARB TRANSPARENT_GREEN_VALUE_ARB}{@link #WGL_TRANSPARENT_BLUE_VALUE_ARB TRANSPARENT_BLUE_VALUE_ARB}{@link #WGL_TRANSPARENT_ALPHA_VALUE_ARB TRANSPARENT_ALPHA_VALUE_ARB}{@link #WGL_TRANSPARENT_INDEX_VALUE_ARB TRANSPARENT_INDEX_VALUE_ARB}
    {@link #WGL_SHARE_DEPTH_ARB SHARE_DEPTH_ARB}{@link #WGL_SHARE_STENCIL_ARB SHARE_STENCIL_ARB}{@link #WGL_SHARE_ACCUM_ARB SHARE_ACCUM_ARB}{@link #WGL_SUPPORT_GDI_ARB SUPPORT_GDI_ARB}
    {@link #WGL_SUPPORT_OPENGL_ARB SUPPORT_OPENGL_ARB}{@link #WGL_DOUBLE_BUFFER_ARB DOUBLE_BUFFER_ARB}{@link #WGL_STEREO_ARB STEREO_ARB}{@link #WGL_PIXEL_TYPE_ARB PIXEL_TYPE_ARB}
    {@link #WGL_COLOR_BITS_ARB COLOR_BITS_ARB}{@link #WGL_RED_BITS_ARB RED_BITS_ARB}{@link #WGL_RED_SHIFT_ARB RED_SHIFT_ARB}{@link #WGL_GREEN_BITS_ARB GREEN_BITS_ARB}
    {@link #WGL_GREEN_SHIFT_ARB GREEN_SHIFT_ARB}{@link #WGL_BLUE_BITS_ARB BLUE_BITS_ARB}{@link #WGL_BLUE_SHIFT_ARB BLUE_SHIFT_ARB}{@link #WGL_ALPHA_BITS_ARB ALPHA_BITS_ARB}
    {@link #WGL_ALPHA_SHIFT_ARB ALPHA_SHIFT_ARB}{@link #WGL_ACCUM_BITS_ARB ACCUM_BITS_ARB}{@link #WGL_ACCUM_RED_BITS_ARB ACCUM_RED_BITS_ARB}{@link #WGL_ACCUM_GREEN_BITS_ARB ACCUM_GREEN_BITS_ARB}
    {@link #WGL_ACCUM_BLUE_BITS_ARB ACCUM_BLUE_BITS_ARB}{@link #WGL_ACCUM_ALPHA_BITS_ARB ACCUM_ALPHA_BITS_ARB}{@link #WGL_DEPTH_BITS_ARB DEPTH_BITS_ARB}{@link #WGL_STENCIL_BITS_ARB STENCIL_BITS_ARB}
    {@link #WGL_AUX_BUFFERS_ARB AUX_BUFFERS_ARB}
    + * @param values a buffer into which the results of the query will be placed + */ + @NativeType("BOOL") + public static boolean wglGetPixelFormatAttribivARB(@NativeType("HDC") long hdc, int pixelFormat, int layerPlane, @NativeType("int const *") IntBuffer attributes, @NativeType("int *") IntBuffer values) { + if (CHECKS) { + check(values, attributes.remaining()); + } + return nwglGetPixelFormatAttribivARB(hdc, pixelFormat, layerPlane, attributes.remaining(), memAddress(attributes), memAddress(values)) != 0; + } + + /** + * @param hdc the device context on which the pixel format is supported + * @param pixelFormat an index that specifies the pixel format + * @param layerPlane the plane being queried + * @param values a buffer into which the results of the query will be placed + */ + @NativeType("BOOL") + public static boolean wglGetPixelFormatAttribiARB(@NativeType("HDC") long hdc, int pixelFormat, int layerPlane, @NativeType("int const *") int attribute, @NativeType("int *") IntBuffer values) { + if (CHECKS) { + check(values, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer attributes = stack.ints(attribute); + return nwglGetPixelFormatAttribivARB(hdc, pixelFormat, layerPlane, 1, memAddress(attributes), memAddress(values)) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ wglGetPixelFormatAttribfvARB ] --- + + /** + * Unsafe version of: {@link #wglGetPixelFormatAttribfvARB GetPixelFormatAttribfvARB} + * + * @param n the number of attributes being queried + */ + public static int nwglGetPixelFormatAttribfvARB(long hdc, int pixelFormat, int layerPlane, int n, long attributes, long values) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetPixelFormatAttribfvARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + } + return callPPPI(hdc, pixelFormat, layerPlane, n, attributes, values, __functionAddress); + } + + /** + * Float version of {@link #wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB}. + * + * @param hdc the device context on which the pixel format is supported + * @param pixelFormat an index that specifies the pixel format + * @param layerPlane the plane being queried + * @param attributes an array of pixel format attribute identifiers which specify the attributes to be queried + * @param values a buffer into which the results of the query will be placed + */ + @NativeType("BOOL") + public static boolean wglGetPixelFormatAttribfvARB(@NativeType("HDC") long hdc, int pixelFormat, int layerPlane, @NativeType("int const *") IntBuffer attributes, @NativeType("FLOAT *") FloatBuffer values) { + if (CHECKS) { + check(values, attributes.remaining()); + } + return nwglGetPixelFormatAttribfvARB(hdc, pixelFormat, layerPlane, attributes.remaining(), memAddress(attributes), memAddress(values)) != 0; + } + + /** + * Float version of {@link #wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB}. + * + * @param hdc the device context on which the pixel format is supported + * @param pixelFormat an index that specifies the pixel format + * @param layerPlane the plane being queried + * @param values a buffer into which the results of the query will be placed + */ + @NativeType("BOOL") + public static boolean wglGetPixelFormatAttribfARB(@NativeType("HDC") long hdc, int pixelFormat, int layerPlane, @NativeType("int const *") int attribute, @NativeType("FLOAT *") FloatBuffer values) { + if (CHECKS) { + check(values, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer attributes = stack.ints(attribute); + return nwglGetPixelFormatAttribfvARB(hdc, pixelFormat, layerPlane, 1, memAddress(attributes), memAddress(values)) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ wglChoosePixelFormatARB ] --- + + /** + * Unsafe version of: {@link #wglChoosePixelFormatARB ChoosePixelFormatARB} + * + * @param maxFormats the number of attributes being queried + */ + public static int nwglChoosePixelFormatARB(long hdc, long attribIList, long attribFList, int maxFormats, long formats, long numFormats) { + long __functionAddress = GL.getCapabilitiesWGL().wglChoosePixelFormatARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + } + return callPPPPPI(hdc, attribIList, attribFList, maxFormats, formats, numFormats, __functionAddress); + } + + /** + * Selects from among all of the available pixel formats (including both accelerated and generic formats and non-displayable formats). This function + * accepts attributes for the main planes. A list of pixel formats that match the specified attributes is returned with the "best" pixel formats at the + * start of the list (order is device dependent). + * + * @param hdc the device context on which the pixel format is supported + * @param attribIList a list of attribute {type, value} pairs containing integer attribute values. One of:
    {@link #WGL_NUMBER_PIXEL_FORMATS_ARB NUMBER_PIXEL_FORMATS_ARB}{@link #WGL_DRAW_TO_WINDOW_ARB DRAW_TO_WINDOW_ARB}{@link #WGL_DRAW_TO_BITMAP_ARB DRAW_TO_BITMAP_ARB}{@link #WGL_ACCELERATION_ARB ACCELERATION_ARB}
    {@link #WGL_NEED_PALETTE_ARB NEED_PALETTE_ARB}{@link #WGL_NEED_SYSTEM_PALETTE_ARB NEED_SYSTEM_PALETTE_ARB}{@link #WGL_SWAP_LAYER_BUFFERS_ARB SWAP_LAYER_BUFFERS_ARB}{@link #WGL_SWAP_METHOD_ARB SWAP_METHOD_ARB}
    {@link #WGL_NUMBER_OVERLAYS_ARB NUMBER_OVERLAYS_ARB}{@link #WGL_NUMBER_UNDERLAYS_ARB NUMBER_UNDERLAYS_ARB}{@link #WGL_TRANSPARENT_ARB TRANSPARENT_ARB}{@link #WGL_TRANSPARENT_RED_VALUE_ARB TRANSPARENT_RED_VALUE_ARB}
    {@link #WGL_TRANSPARENT_GREEN_VALUE_ARB TRANSPARENT_GREEN_VALUE_ARB}{@link #WGL_TRANSPARENT_BLUE_VALUE_ARB TRANSPARENT_BLUE_VALUE_ARB}{@link #WGL_TRANSPARENT_ALPHA_VALUE_ARB TRANSPARENT_ALPHA_VALUE_ARB}{@link #WGL_TRANSPARENT_INDEX_VALUE_ARB TRANSPARENT_INDEX_VALUE_ARB}
    {@link #WGL_SHARE_DEPTH_ARB SHARE_DEPTH_ARB}{@link #WGL_SHARE_STENCIL_ARB SHARE_STENCIL_ARB}{@link #WGL_SHARE_ACCUM_ARB SHARE_ACCUM_ARB}{@link #WGL_SUPPORT_GDI_ARB SUPPORT_GDI_ARB}
    {@link #WGL_SUPPORT_OPENGL_ARB SUPPORT_OPENGL_ARB}{@link #WGL_DOUBLE_BUFFER_ARB DOUBLE_BUFFER_ARB}{@link #WGL_STEREO_ARB STEREO_ARB}{@link #WGL_PIXEL_TYPE_ARB PIXEL_TYPE_ARB}
    {@link #WGL_COLOR_BITS_ARB COLOR_BITS_ARB}{@link #WGL_RED_BITS_ARB RED_BITS_ARB}{@link #WGL_RED_SHIFT_ARB RED_SHIFT_ARB}{@link #WGL_GREEN_BITS_ARB GREEN_BITS_ARB}
    {@link #WGL_GREEN_SHIFT_ARB GREEN_SHIFT_ARB}{@link #WGL_BLUE_BITS_ARB BLUE_BITS_ARB}{@link #WGL_BLUE_SHIFT_ARB BLUE_SHIFT_ARB}{@link #WGL_ALPHA_BITS_ARB ALPHA_BITS_ARB}
    {@link #WGL_ALPHA_SHIFT_ARB ALPHA_SHIFT_ARB}{@link #WGL_ACCUM_BITS_ARB ACCUM_BITS_ARB}{@link #WGL_ACCUM_RED_BITS_ARB ACCUM_RED_BITS_ARB}{@link #WGL_ACCUM_GREEN_BITS_ARB ACCUM_GREEN_BITS_ARB}
    {@link #WGL_ACCUM_BLUE_BITS_ARB ACCUM_BLUE_BITS_ARB}{@link #WGL_ACCUM_ALPHA_BITS_ARB ACCUM_ALPHA_BITS_ARB}{@link #WGL_DEPTH_BITS_ARB DEPTH_BITS_ARB}{@link #WGL_STENCIL_BITS_ARB STENCIL_BITS_ARB}
    {@link #WGL_AUX_BUFFERS_ARB AUX_BUFFERS_ARB}
    + * @param attribFList a list of attribute {type, value} pairs containing floating point attribute values + * @param formats an array of returned indices of the matching pixel formats. The best pixel formats (i.e. closest match and best format for the hardware) are at the + * head of the list. + * @param numFormats returns the number of matching formats + */ + @NativeType("BOOL") + public static boolean wglChoosePixelFormatARB(@NativeType("HDC") long hdc, @Nullable @NativeType("int const *") IntBuffer attribIList, @Nullable @NativeType("FLOAT const *") FloatBuffer attribFList, @NativeType("int *") IntBuffer formats, @NativeType("UINT *") IntBuffer numFormats) { + if (CHECKS) { + checkNTSafe(attribIList); + checkNTSafe(attribFList); + check(numFormats, 1); + } + return nwglChoosePixelFormatARB(hdc, memAddressSafe(attribIList), memAddressSafe(attribFList), formats.remaining(), memAddress(formats), memAddress(numFormats)) != 0; + } + + /** Array version of: {@link #wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB} */ + @NativeType("BOOL") + public static boolean wglGetPixelFormatAttribivARB(@NativeType("HDC") long hdc, int pixelFormat, int layerPlane, @NativeType("int const *") int[] attributes, @NativeType("int *") int[] values) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetPixelFormatAttribivARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + check(values, attributes.length); + } + return callPPPI(hdc, pixelFormat, layerPlane, attributes.length, attributes, values, __functionAddress) != 0; + } + + /** Array version of: {@link #wglGetPixelFormatAttribfvARB GetPixelFormatAttribfvARB} */ + @NativeType("BOOL") + public static boolean wglGetPixelFormatAttribfvARB(@NativeType("HDC") long hdc, int pixelFormat, int layerPlane, @NativeType("int const *") int[] attributes, @NativeType("FLOAT *") float[] values) { + long __functionAddress = GL.getCapabilitiesWGL().wglGetPixelFormatAttribfvARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + check(values, attributes.length); + } + return callPPPI(hdc, pixelFormat, layerPlane, attributes.length, attributes, values, __functionAddress) != 0; + } + + /** Array version of: {@link #wglChoosePixelFormatARB ChoosePixelFormatARB} */ + @NativeType("BOOL") + public static boolean wglChoosePixelFormatARB(@NativeType("HDC") long hdc, @Nullable @NativeType("int const *") int[] attribIList, @Nullable @NativeType("FLOAT const *") float[] attribFList, @NativeType("int *") int[] formats, @NativeType("UINT *") int[] numFormats) { + long __functionAddress = GL.getCapabilitiesWGL().wglChoosePixelFormatARB; + if (CHECKS) { + check(__functionAddress); + check(hdc); + checkNTSafe(attribIList); + checkNTSafe(attribFList); + check(numFormats, 1); + } + return callPPPPPI(hdc, attribIList, attribFList, formats.length, formats, numFormats, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPixelFormatFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPixelFormatFloat.java new file mode 100644 index 000000000..41f20d691 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBPixelFormatFloat.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_ARB_pixel_format_float extension. + * + *

    This extension adds pixel formats with floating-point RGBA color components.

    + * + *

    Requires {@link WGLARBPixelFormat WGL_ARB_pixel_format} and {@link GL15 OpenGL 1.5}.

    + */ +public final class WGLARBPixelFormatFloat { + + /** + * Accepted as a value in the {@code attribIList} parameter array of {@link WGLARBPixelFormat#wglChoosePixelFormatARB ChoosePixelFormatARB}, and returned in the {@code values} + * parameter array of {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB}. + */ + public static final int WGL_TYPE_RGBA_FLOAT_ARB = 0x21A0; + + private WGLARBPixelFormatFloat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBRenderTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBRenderTexture.java new file mode 100644 index 000000000..fd0d8ce15 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBRenderTexture.java @@ -0,0 +1,192 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the WGL_ARB_render_texture extension. + * + *

    This extension allows a color buffer to be used for both rendering and texturing. When a color buffer is bound to a texture target it cannot be + * rendered to. Once it has been released from the texture it can be rendered to once again.

    + * + *

    This extension may provide a performance boost and reduce memory requirements on architectures that support rendering to the same memory where textures + * reside and in the same memory format and layout required by texturing. The functionality is similar to CopyTexImage1D and CopyTexImage2D. However, some + * changes were made to make it easier to avoid copying data:

    + * + *
      + *
    • Only color buffers of a pbuffer can be bound as a texture. It is not possible to use the color buffer of a window as a texture.
    • + *
    • The texture internal format is determined when the color buffer is associated with the texture, guaranteeing that the color buffer format is + * equivalent to the texture internal format.
    • + *
    • When a color buffer of a pbuffer is being used as a texture, the pbuffer can not be used for rendering; this makes it easier for implementations to + * avoid a copy of the image since the semantics of the pointer swap are clear.
    • + *
    • The application must release the color buffer from the texture before it can render to the pbuffer again. When the color buffer is bound as a + * texture, draw and read operations on the pbuffer are undefined.
    • + *
    • A mipmap attribute can be set, in which case memory will be allocated up front for mipmaps. The application can render the mipmap images or, if + * SGIS_generate_mipmap is supported, they can be automatically generated when the color buffer is bound as a texture.
    • + *
    • A texture target is associated with the pbuffer, so that cubemap images can be rendered into a single color buffer.
    • + *
    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string}, {@link WGLARBPixelFormat WGL_ARB_pixel_format}, {@link WGLARBPbuffer WGL_ARB_pbuffer}.

    + */ +public class WGLARBRenderTexture { + + /** + * Accepted by the {@code attributes} parameter of {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB}, and the {@code attribIList} parameters of + * {@link WGLARBPixelFormat#wglChoosePixelFormatARB ChoosePixelFormatARB}. + */ + public static final int + WGL_BIND_TO_TEXTURE_RGB_ARB = 0x2070, + WGL_BIND_TO_TEXTURE_RGBA_ARB = 0x2071; + + /** Accepted by the {@code attribList} parameter of {@link WGLARBPbuffer#wglCreatePbufferARB CreatePbufferARB} and by the {@code attribute} parameter of {@link WGLARBPbuffer#wglQueryPbufferARB QueryPbufferARB}. */ + public static final int + WGL_TEXTURE_FORMAT_ARB = 0x2072, + WGL_TEXTURE_TARGET_ARB = 0x2073, + WGL_MIPMAP_TEXTURE_ARB = 0x2074; + + /** + * Accepted as a value in the {@code attribList} parameter of {@link WGLARBPbuffer#wglCreatePbufferARB CreatePbufferARB} and returned in the value parameter of {@link WGLARBPbuffer#wglQueryPbufferARB QueryPbufferARB} when + * {@code attribute} is {@link #WGL_TEXTURE_FORMAT_ARB TEXTURE_FORMAT_ARB}. + */ + public static final int + WGL_TEXTURE_RGB_ARB = 0x2075, + WGL_TEXTURE_RGBA_ARB = 0x2076, + WGL_NO_TEXTURE_ARB = 0x2077; + + /** + * Accepted as a value in the {@code attribList} parameter of {@link WGLARBPbuffer#wglCreatePbufferARB CreatePbufferARB} and returned in the value parameter of {@link WGLARBPbuffer#wglQueryPbufferARB QueryPbufferARB} when + * {@code attribute} is {@link #WGL_TEXTURE_TARGET_ARB TEXTURE_TARGET_ARB}. + */ + public static final int + WGL_TEXTURE_CUBE_MAP_ARB = 0x2078, + WGL_TEXTURE_1D_ARB = 0x2079, + WGL_TEXTURE_2D_ARB = 0x207A; + + /** Accepted by the {@code attribList} parameter of {@link #wglSetPbufferAttribARB SetPbufferAttribARB} and by the {@code attribute} parameter of {@link WGLARBPbuffer#wglQueryPbufferARB QueryPbufferARB}. */ + public static final int + WGL_MIPMAP_LEVEL_ARB = 0x207B, + WGL_CUBE_MAP_FACE_ARB = 0x207C; + + /** + * Accepted as a value in the {@code attribList} parameter of {@link #wglSetPbufferAttribARB SetPbufferAttribARB} and returned in the value parameter of {@link WGLARBPbuffer#wglQueryPbufferARB QueryPbufferARB} when + * {@code attribute} is {@link #WGL_CUBE_MAP_FACE_ARB CUBE_MAP_FACE_ARB}. + */ + public static final int + WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = 0x207D, + WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = 0x207E, + WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = 0x207F, + WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = 0x2080, + WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = 0x2081, + WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = 0x2082; + + /** Accepted by the {@code buffer} parameter of {@link #wglBindTexImageARB BindTexImageARB} and {@link #wglReleaseTexImageARB ReleaseTexImageARB}. */ + public static final int + WGL_FRONT_LEFT_ARB = 0x2083, + WGL_FRONT_RIGHT_ARB = 0x2084, + WGL_BACK_LEFT_ARB = 0x2085, + WGL_BACK_RIGHT_ARB = 0x2086, + WGL_AUX0_ARB = 0x2087, + WGL_AUX1_ARB = 0x2088, + WGL_AUX2_ARB = 0x2089, + WGL_AUX3_ARB = 0x208A, + WGL_AUX4_ARB = 0x208B, + WGL_AUX5_ARB = 0x208C, + WGL_AUX6_ARB = 0x208D, + WGL_AUX7_ARB = 0x208E, + WGL_AUX8_ARB = 0x208F, + WGL_AUX9_ARB = 0x2090; + + protected WGLARBRenderTexture() { + throw new UnsupportedOperationException(); + } + + // --- [ wglBindTexImageARB ] --- + + /** + * Defines a one-dimensional texture image or two-dimensional texture image or a set of two-dimensional cube map texture images. The texture image or + * images consist of the image data in {@code buffer} for the specified {@code pbuffer} and need not be copied. The texture target, the texture format and + * the size of the texture components are derived from attributes of pbuffer specified by {@code pbuffer}. + * + * @param pbuffer a pbuffer handle + * @param buffer the target buffer. One of:
    {@link #WGL_FRONT_LEFT_ARB FRONT_LEFT_ARB}{@link #WGL_FRONT_RIGHT_ARB FRONT_RIGHT_ARB}{@link #WGL_BACK_LEFT_ARB BACK_LEFT_ARB}{@link #WGL_BACK_RIGHT_ARB BACK_RIGHT_ARB}{@link #WGL_AUX0_ARB AUX0_ARB}WGL_AUX[1-9]_ARB
    + */ + @NativeType("BOOL") + public static boolean wglBindTexImageARB(@NativeType("HPBUFFERARB") long pbuffer, int buffer) { + long __functionAddress = GL.getCapabilitiesWGL().wglBindTexImageARB; + if (CHECKS) { + check(__functionAddress); + check(pbuffer); + } + return callPI(pbuffer, buffer, __functionAddress) != 0; + } + + // --- [ wglReleaseTexImageARB ] --- + + /** + * Releases the specified color buffer back to the pbuffer. The pbuffer is made available for reading and writing when it no longer has any color buffers + * bound as textures. + * + * @param pbuffer a pbuffer handle + * @param buffer the target buffer. One of:
    {@link #WGL_FRONT_LEFT_ARB FRONT_LEFT_ARB}{@link #WGL_FRONT_RIGHT_ARB FRONT_RIGHT_ARB}{@link #WGL_BACK_LEFT_ARB BACK_LEFT_ARB}{@link #WGL_BACK_RIGHT_ARB BACK_RIGHT_ARB}{@link #WGL_AUX0_ARB AUX0_ARB}WGL_AUX[1-9]_ARB
    + */ + @NativeType("BOOL") + public static boolean wglReleaseTexImageARB(@NativeType("HPBUFFERARB") long pbuffer, int buffer) { + long __functionAddress = GL.getCapabilitiesWGL().wglReleaseTexImageARB; + if (CHECKS) { + check(__functionAddress); + check(pbuffer); + } + return callPI(pbuffer, buffer, __functionAddress) != 0; + } + + // --- [ wglSetPbufferAttribARB ] --- + + /** Unsafe version of: {@link #wglSetPbufferAttribARB SetPbufferAttribARB} */ + public static int nwglSetPbufferAttribARB(long pbuffer, long attribList) { + long __functionAddress = GL.getCapabilitiesWGL().wglSetPbufferAttribARB; + if (CHECKS) { + check(__functionAddress); + check(pbuffer); + } + return callPPI(pbuffer, attribList, __functionAddress); + } + + /** + * Sets an attribute to the specified pbuffer. + * + * @param pbuffer a pbuffer handle + * @param attribList a 0-terminated list of attribute {type, value} pairs containing integer values + */ + @NativeType("BOOL") + public static boolean wglSetPbufferAttribARB(@NativeType("HPBUFFERARB") long pbuffer, @Nullable @NativeType("int const *") IntBuffer attribList) { + if (CHECKS) { + checkNTSafe(attribList); + } + return nwglSetPbufferAttribARB(pbuffer, memAddressSafe(attribList)) != 0; + } + + /** Array version of: {@link #wglSetPbufferAttribARB SetPbufferAttribARB} */ + @NativeType("BOOL") + public static boolean wglSetPbufferAttribARB(@NativeType("HPBUFFERARB") long pbuffer, @Nullable @NativeType("int const *") int[] attribList) { + long __functionAddress = GL.getCapabilitiesWGL().wglSetPbufferAttribARB; + if (CHECKS) { + check(__functionAddress); + check(pbuffer); + checkNTSafe(attribList); + } + return callPPI(pbuffer, attribList, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBRobustnessApplicationIsolation.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBRobustnessApplicationIsolation.java new file mode 100644 index 000000000..61e609ab0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLARBRobustnessApplicationIsolation.java @@ -0,0 +1,34 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_ARB_robustness_application_isolation extension. + * + *

    GL_ARB_robustness and WGL_ARB_create_context_robustness allow creating an OpenGL context supporting graphics reset notification behavior. + * WGL_ARB_robustness_application_isolation provides stronger guarantees about the possible side-effects of a graphics reset.

    + * + *

    If the graphics driver advertises the WGL_ARB_robustness_application_isolation extension string, then the driver guarantees that if a particular + * application causes a graphics reset to occur:

    + * + *
      + *
    1. No other application on the system is affected by the graphics reset.
    2. + *
    3. No other application on the system receives any notification that the graphics reset occurred.
    4. + *
    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string} and {@link WGLARBCreateContextRobustness WGL_ARB_create_context_robustness}.

    + */ +public final class WGLARBRobustnessApplicationIsolation { + + /** + * Accepted as a bit in the attribute value for {@link WGLARBCreateContext#WGL_CONTEXT_FLAGS_ARB CONTEXT_FLAGS_ARB} in the {@code attribList} argument to + * {@link WGLARBCreateContext#wglCreateContextAttribsARB CreateContextAttribsARB}. + */ + public static final int WGL_CONTEXT_RESET_ISOLATION_BIT_ARB = 0x8; + + private WGLARBRobustnessApplicationIsolation() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLATIPixelFormatFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLATIPixelFormatFloat.java new file mode 100644 index 000000000..80693fe1e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLATIPixelFormatFloat.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_ATI_pixel_format_float extension. + * + *

    This extension adds pixel formats with floating-point RGBA color components.

    + * + *

    The size of each float components is specified using the same WGL_RED_BITS_ARB, WGL_GREEN_BITS_ARB, WGL_BLUE_BITS_ARB and WGL_ALPHA_BITS_ARB pixel + * format attributes that are used for defining the size of fixed-point components. 32 bit floating- point components are in the standard IEEE float + * format. 16 bit floating-point components have 1 sign bit, 5 exponent bits, and 10 mantissa bits.

    + * + *

    In standard OpenGL RGBA color components are normally clamped to the range [0,1]. The color components of a float buffer are clamped to the limits of + * the range representable by their format.

    + * + *

    Requires {@link WGLARBPixelFormat WGL_ARB_pixel_format}.

    + */ +public final class WGLATIPixelFormatFloat { + + /** Accepted by the {@code pname} parameters of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. */ + public static final int + WGL_RGBA_FLOAT_MODE_ATI = 0x8820, + WGL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI = 0x8835; + + /** + * Accepted as a value in the {@code piAttribIList} and {@code pfAttribFList} parameter arrays of wglChoosePixelFormatARB, and returned in the + * {@code piValues} parameter array of wglGetPixelFormatAttribivARB, and the {@code pfValues} parameter array of wglGetPixelFormatAttribfvARB. + */ + public static final int WGL_TYPE_RGBA_FLOAT_ATI = 0x21A0; + + private WGLATIPixelFormatFloat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLATIRenderTextureRectangle.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLATIRenderTextureRectangle.java new file mode 100644 index 000000000..f35027179 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLATIRenderTextureRectangle.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_ATI_render_texture_rectangle extension. + * + *

    This extension builds upon {@link WGLARBRenderTexture WGL_ARB_render_texture} and allows a pbuffer to be bound to a texture rectangle target.

    + * + *

    Requires {@link WGLARBRenderTexture WGL_ARB_render_texture} and {@link ARBTextureRectangle ARB_texture_rectangle}.

    + */ +public final class WGLATIRenderTextureRectangle { + + /** + * Accepted as a value in the {@code piAttribList} parameter of wglCreatePbufferARB and returned in the value parameter of wglQueryPbufferARB when + * {@code iAttribute} is WGL_TEXTURE_TARGET_ARB. + */ + public static final int WGL_TEXTURE_RECTANGLE_ATI = 0x21A5; + + private WGLATIRenderTextureRectangle() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLCapabilities.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLCapabilities.java new file mode 100644 index 000000000..847d421a5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLCapabilities.java @@ -0,0 +1,523 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; +import java.util.Set; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; + +/** Defines the WGL capabilities of an OpenGL device. */ +public final class WGLCapabilities { + + // WGL_AMD_gpu_association + public final long + wglGetGPUIDsAMD, + wglGetGPUInfoAMD, + wglGetContextGPUIDAMD, + wglCreateAssociatedContextAMD, + wglCreateAssociatedContextAttribsAMD, + wglDeleteAssociatedContextAMD, + wglMakeAssociatedContextCurrentAMD, + wglGetCurrentAssociatedContextAMD, + wglBlitContextFramebufferAMD; + + // WGL_ARB_buffer_region + public final long + wglCreateBufferRegionARB, + wglDeleteBufferRegionARB, + wglSaveBufferRegionARB, + wglRestoreBufferRegionARB; + + // WGL_ARB_create_context + public final long + wglCreateContextAttribsARB; + + // WGL_ARB_extensions_string + public final long + wglGetExtensionsStringARB; + + // WGL_ARB_make_current_read + public final long + wglMakeContextCurrentARB, + wglGetCurrentReadDCARB; + + // WGL_ARB_pbuffer + public final long + wglCreatePbufferARB, + wglGetPbufferDCARB, + wglReleasePbufferDCARB, + wglDestroyPbufferARB, + wglQueryPbufferARB; + + // WGL_ARB_pixel_format + public final long + wglGetPixelFormatAttribivARB, + wglGetPixelFormatAttribfvARB, + wglChoosePixelFormatARB; + + // WGL_ARB_render_texture + public final long + wglBindTexImageARB, + wglReleaseTexImageARB, + wglSetPbufferAttribARB; + + // WGL_EXT_extensions_string + public final long + wglGetExtensionsStringEXT; + + // WGL_EXT_swap_control + public final long + wglSwapIntervalEXT, + wglGetSwapIntervalEXT; + + // WGL_NV_copy_image + public final long + wglCopyImageSubDataNV; + + // WGL_NV_delay_before_swap + public final long + wglDelayBeforeSwapNV; + + // WGL_NV_DX_interop + public final long + wglDXSetResourceShareHandleNV, + wglDXOpenDeviceNV, + wglDXCloseDeviceNV, + wglDXRegisterObjectNV, + wglDXUnregisterObjectNV, + wglDXObjectAccessNV, + wglDXLockObjectsNV, + wglDXUnlockObjectsNV; + + // WGL_NV_gpu_affinity + public final long + wglEnumGpusNV, + wglEnumGpuDevicesNV, + wglCreateAffinityDCNV, + wglEnumGpusFromAffinityDCNV, + wglDeleteDCNV; + + // WGL_NV_swap_group + public final long + wglJoinSwapGroupNV, + wglBindSwapBarrierNV, + wglQuerySwapGroupNV, + wglQueryMaxSwapGroupsNV, + wglQueryFrameCountNV, + wglResetFrameCountNV; + + // WGL_NV_vertex_array_range + public final long + wglAllocateMemoryNV, + wglFreeMemoryNV; + + /** When true, {@link WGLAMDGPUAssociation} is supported. */ + public final boolean WGL_AMD_gpu_association; + /** When true, {@link WGLARBBufferRegion} is supported. */ + public final boolean WGL_ARB_buffer_region; + /** When true, {@link WGLARBContextFlushControl} is supported. */ + public final boolean WGL_ARB_context_flush_control; + /** When true, {@link WGLARBCreateContext} is supported. */ + public final boolean WGL_ARB_create_context; + /** When true, {@link WGLARBCreateContextNoError} is supported. */ + public final boolean WGL_ARB_create_context_no_error; + /** When true, {@link WGLARBCreateContextProfile} is supported. */ + public final boolean WGL_ARB_create_context_profile; + /** When true, {@link WGLARBCreateContextRobustness} is supported. */ + public final boolean WGL_ARB_create_context_robustness; + /** When true, {@link WGLARBExtensionsString} is supported. */ + public final boolean WGL_ARB_extensions_string; + /** When true, {@link WGLARBFramebufferSRGB} is supported. */ + public final boolean WGL_ARB_framebuffer_sRGB; + /** When true, {@link WGLARBMakeCurrentRead} is supported. */ + public final boolean WGL_ARB_make_current_read; + /** When true, {@link WGLARBMultisample} is supported. */ + public final boolean WGL_ARB_multisample; + /** When true, {@link WGLARBPbuffer} is supported. */ + public final boolean WGL_ARB_pbuffer; + /** When true, {@link WGLARBPixelFormat} is supported. */ + public final boolean WGL_ARB_pixel_format; + /** When true, {@link WGLARBPixelFormatFloat} is supported. */ + public final boolean WGL_ARB_pixel_format_float; + /** When true, {@link WGLARBRenderTexture} is supported. */ + public final boolean WGL_ARB_render_texture; + /** When true, {@link WGLARBRobustnessApplicationIsolation} is supported. */ + public final boolean WGL_ARB_robustness_application_isolation; + /** + * Native bindings to the WGL_ARB_robustness_share_group_isolation extension. + * + *

    GL_ARB_robustness and WGL_ARB_create_context_robustness allow creating an OpenGL context supporting graphics reset notification behavior. + * WGL_ARB_robustness_share_group_isolation provides stronger guarantees about the possible side-effects of a graphics reset.

    + * + *

    If the graphics driver advertises the WGL_ARB_robustness_share_group_isolation extension string, then the driver guarantees that if a context in a + * particular share group causes a graphics reset to occur:

    + * + *
      + *
    1. No other share group within the application is affected by the graphics reset. Additionally, no other application on the system is affected by the + * graphics reset.
    2. + *
    3. No other share group within the application receives any notification that the graphics reset occurred. Additionally, no other application on the + * system receives any notification that the graphics reset occurred.
    4. + *
    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string} and {@link WGLARBCreateContextRobustness WGL_ARB_create_context_robustness}.

    + */ + public final boolean WGL_ARB_robustness_share_group_isolation; + /** When true, {@link WGLATIPixelFormatFloat} is supported. */ + public final boolean WGL_ATI_pixel_format_float; + /** When true, {@link WGLATIRenderTextureRectangle} is supported. */ + public final boolean WGL_ATI_render_texture_rectangle; + /** When true, {@link WGLEXTColorspace} is supported. */ + public final boolean WGL_EXT_colorspace; + /** When true, {@link WGLEXTCreateContextES2Profile} is supported. */ + public final boolean WGL_EXT_create_context_es2_profile; + /** When true, {@link WGLEXTCreateContextESProfile} is supported. */ + public final boolean WGL_EXT_create_context_es_profile; + /** When true, {@link WGLEXTDepthFloat} is supported. */ + public final boolean WGL_EXT_depth_float; + /** When true, {@link WGLEXTExtensionsString} is supported. */ + public final boolean WGL_EXT_extensions_string; + /** When true, {@link WGLEXTFramebufferSRGB} is supported. */ + public final boolean WGL_EXT_framebuffer_sRGB; + /** When true, {@link WGLEXTPixelFormatPackedFloat} is supported. */ + public final boolean WGL_EXT_pixel_format_packed_float; + /** When true, {@link WGLEXTSwapControl} is supported. */ + public final boolean WGL_EXT_swap_control; + /** + * When true, the WGL_EXT_swap_control_tear extension is supported. + * + *

    This extension extends the existing {@link WGLEXTSwapControl WGL_EXT_swap_control} extension by allowing a negative {@code interval} parameter to + * {@link WGLEXTSwapControl#wglSwapIntervalEXT SwapIntervalEXT}. The negative {@code interval} allows late swaps to occur without synchronization to the video frame. This + * reduces the visual stutter on late frames and reduces the stall on subsequent frames.

    + */ + public final boolean WGL_EXT_swap_control_tear; + /** When true, {@link WGLNVCopyImage} is supported. */ + public final boolean WGL_NV_copy_image; + /** When true, {@link WGLNVDelayBeforeSwap} is supported. */ + public final boolean WGL_NV_delay_before_swap; + /** When true, {@link WGLNVDXInterop} is supported. */ + public final boolean WGL_NV_DX_interop; + /** + * When true, the WGL_NV_DX_interop2 extension is supported. + * + *

    This extension expands on the specification of {@link WGLNVDXInterop WGL_NV_DX_interop} to add support for DirectX version 10, 10.1 and 11 resources.

    + * + *

    Requires {@link GL20 OpenGL 2.0} and {@link WGLNVDXInterop WGL_NV_DX_interop}.

    + */ + public final boolean WGL_NV_DX_interop2; + /** When true, {@link WGLNVFloatBuffer} is supported. */ + public final boolean WGL_NV_float_buffer; + /** When true, {@link WGLNVGPUAffinity} is supported. */ + public final boolean WGL_NV_gpu_affinity; + /** When true, {@link WGLNVMultigpuContext} is supported. */ + public final boolean WGL_NV_multigpu_context; + /** When true, {@link WGLNVMultisampleCoverage} is supported. */ + public final boolean WGL_NV_multisample_coverage; + /** When true, {@link WGLNVRenderDepthTexture} is supported. */ + public final boolean WGL_NV_render_depth_texture; + /** When true, {@link WGLNVRenderTextureRectangle} is supported. */ + public final boolean WGL_NV_render_texture_rectangle; + /** When true, {@link WGLNVSwapGroup} is supported. */ + public final boolean WGL_NV_swap_group; + /** When true, {@code WGL_NV_vertex_array_range} is supported. */ + public final boolean WGL_NV_vertex_array_range; + + WGLCapabilities(FunctionProvider provider, Set ext) { + long[] caps = new long[54]; + + WGL_AMD_gpu_association = check_WGL_AMD_gpu_association(provider, caps, ext); + WGL_ARB_buffer_region = check_WGL_ARB_buffer_region(provider, caps, ext); + WGL_ARB_context_flush_control = ext.contains("WGL_ARB_context_flush_control"); + WGL_ARB_create_context = check_WGL_ARB_create_context(provider, caps, ext); + WGL_ARB_create_context_no_error = ext.contains("WGL_ARB_create_context_no_error"); + WGL_ARB_create_context_profile = ext.contains("WGL_ARB_create_context_profile"); + WGL_ARB_create_context_robustness = ext.contains("WGL_ARB_create_context_robustness"); + WGL_ARB_extensions_string = check_WGL_ARB_extensions_string(provider, caps, ext); + WGL_ARB_framebuffer_sRGB = ext.contains("WGL_ARB_framebuffer_sRGB"); + WGL_ARB_make_current_read = check_WGL_ARB_make_current_read(provider, caps, ext); + WGL_ARB_multisample = ext.contains("WGL_ARB_multisample"); + WGL_ARB_pbuffer = check_WGL_ARB_pbuffer(provider, caps, ext); + WGL_ARB_pixel_format = check_WGL_ARB_pixel_format(provider, caps, ext); + WGL_ARB_pixel_format_float = ext.contains("WGL_ARB_pixel_format_float"); + WGL_ARB_render_texture = check_WGL_ARB_render_texture(provider, caps, ext); + WGL_ARB_robustness_application_isolation = ext.contains("WGL_ARB_robustness_application_isolation"); + WGL_ARB_robustness_share_group_isolation = ext.contains("WGL_ARB_robustness_share_group_isolation"); + WGL_ATI_pixel_format_float = ext.contains("WGL_ATI_pixel_format_float"); + WGL_ATI_render_texture_rectangle = ext.contains("WGL_ATI_render_texture_rectangle"); + WGL_EXT_colorspace = ext.contains("WGL_EXT_colorspace"); + WGL_EXT_create_context_es2_profile = ext.contains("WGL_EXT_create_context_es2_profile"); + WGL_EXT_create_context_es_profile = ext.contains("WGL_EXT_create_context_es_profile"); + WGL_EXT_depth_float = ext.contains("WGL_EXT_depth_float"); + WGL_EXT_extensions_string = check_WGL_EXT_extensions_string(provider, caps, ext); + WGL_EXT_framebuffer_sRGB = ext.contains("WGL_EXT_framebuffer_sRGB"); + WGL_EXT_pixel_format_packed_float = ext.contains("WGL_EXT_pixel_format_packed_float"); + WGL_EXT_swap_control = check_WGL_EXT_swap_control(provider, caps, ext); + WGL_EXT_swap_control_tear = ext.contains("WGL_EXT_swap_control_tear"); + WGL_NV_copy_image = check_WGL_NV_copy_image(provider, caps, ext); + WGL_NV_delay_before_swap = check_WGL_NV_delay_before_swap(provider, caps, ext); + WGL_NV_DX_interop = check_WGL_NV_DX_interop(provider, caps, ext); + WGL_NV_DX_interop2 = ext.contains("WGL_NV_DX_interop2"); + WGL_NV_float_buffer = ext.contains("WGL_NV_float_buffer"); + WGL_NV_gpu_affinity = check_WGL_NV_gpu_affinity(provider, caps, ext); + WGL_NV_multigpu_context = ext.contains("WGL_NV_multigpu_context"); + WGL_NV_multisample_coverage = ext.contains("WGL_NV_multisample_coverage"); + WGL_NV_render_depth_texture = ext.contains("WGL_NV_render_depth_texture"); + WGL_NV_render_texture_rectangle = ext.contains("WGL_NV_render_texture_rectangle"); + WGL_NV_swap_group = check_WGL_NV_swap_group(provider, caps, ext); + WGL_NV_vertex_array_range = check_WGL_NV_vertex_array_range(provider, caps, ext); + + wglGetGPUIDsAMD = caps[0]; + wglGetGPUInfoAMD = caps[1]; + wglGetContextGPUIDAMD = caps[2]; + wglCreateAssociatedContextAMD = caps[3]; + wglCreateAssociatedContextAttribsAMD = caps[4]; + wglDeleteAssociatedContextAMD = caps[5]; + wglMakeAssociatedContextCurrentAMD = caps[6]; + wglGetCurrentAssociatedContextAMD = caps[7]; + wglBlitContextFramebufferAMD = caps[8]; + wglCreateBufferRegionARB = caps[9]; + wglDeleteBufferRegionARB = caps[10]; + wglSaveBufferRegionARB = caps[11]; + wglRestoreBufferRegionARB = caps[12]; + wglCreateContextAttribsARB = caps[13]; + wglGetExtensionsStringARB = caps[14]; + wglMakeContextCurrentARB = caps[15]; + wglGetCurrentReadDCARB = caps[16]; + wglCreatePbufferARB = caps[17]; + wglGetPbufferDCARB = caps[18]; + wglReleasePbufferDCARB = caps[19]; + wglDestroyPbufferARB = caps[20]; + wglQueryPbufferARB = caps[21]; + wglGetPixelFormatAttribivARB = caps[22]; + wglGetPixelFormatAttribfvARB = caps[23]; + wglChoosePixelFormatARB = caps[24]; + wglBindTexImageARB = caps[25]; + wglReleaseTexImageARB = caps[26]; + wglSetPbufferAttribARB = caps[27]; + wglGetExtensionsStringEXT = caps[28]; + wglSwapIntervalEXT = caps[29]; + wglGetSwapIntervalEXT = caps[30]; + wglCopyImageSubDataNV = caps[31]; + wglDelayBeforeSwapNV = caps[32]; + wglDXSetResourceShareHandleNV = caps[33]; + wglDXOpenDeviceNV = caps[34]; + wglDXCloseDeviceNV = caps[35]; + wglDXRegisterObjectNV = caps[36]; + wglDXUnregisterObjectNV = caps[37]; + wglDXObjectAccessNV = caps[38]; + wglDXLockObjectsNV = caps[39]; + wglDXUnlockObjectsNV = caps[40]; + wglEnumGpusNV = caps[41]; + wglEnumGpuDevicesNV = caps[42]; + wglCreateAffinityDCNV = caps[43]; + wglEnumGpusFromAffinityDCNV = caps[44]; + wglDeleteDCNV = caps[45]; + wglJoinSwapGroupNV = caps[46]; + wglBindSwapBarrierNV = caps[47]; + wglQuerySwapGroupNV = caps[48]; + wglQueryMaxSwapGroupsNV = caps[49]; + wglQueryFrameCountNV = caps[50]; + wglResetFrameCountNV = caps[51]; + wglAllocateMemoryNV = caps[52]; + wglFreeMemoryNV = caps[53]; + } + + private static boolean check_WGL_AMD_gpu_association(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_AMD_gpu_association")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 0, 1, 2, 3, 4, 5, 6, 7 + }, + "wglGetGPUIDsAMD", "wglGetGPUInfoAMD", "wglGetContextGPUIDAMD", "wglCreateAssociatedContextAMD", "wglCreateAssociatedContextAttribsAMD", + "wglDeleteAssociatedContextAMD", "wglMakeAssociatedContextCurrentAMD", "wglGetCurrentAssociatedContextAMD" + ) || reportMissing("WGL", "WGL_AMD_gpu_association"); + } + + private static boolean check_WGL_ARB_buffer_region(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_ARB_buffer_region")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 9, 10, 11, 12 + }, + "wglCreateBufferRegionARB", "wglDeleteBufferRegionARB", "wglSaveBufferRegionARB", "wglRestoreBufferRegionARB" + ) || reportMissing("WGL", "WGL_ARB_buffer_region"); + } + + private static boolean check_WGL_ARB_create_context(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_ARB_create_context")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 13 + }, + "wglCreateContextAttribsARB" + ) || reportMissing("WGL", "WGL_ARB_create_context"); + } + + private static boolean check_WGL_ARB_extensions_string(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_ARB_extensions_string")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 14 + }, + "wglGetExtensionsStringARB" + ) || reportMissing("WGL", "WGL_ARB_extensions_string"); + } + + private static boolean check_WGL_ARB_make_current_read(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_ARB_make_current_read")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 15, 16 + }, + "wglMakeContextCurrentARB", "wglGetCurrentReadDCARB" + ) || reportMissing("WGL", "WGL_ARB_make_current_read"); + } + + private static boolean check_WGL_ARB_pbuffer(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_ARB_pbuffer")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 17, 18, 19, 20, 21 + }, + "wglCreatePbufferARB", "wglGetPbufferDCARB", "wglReleasePbufferDCARB", "wglDestroyPbufferARB", "wglQueryPbufferARB" + ) || reportMissing("WGL", "WGL_ARB_pbuffer"); + } + + private static boolean check_WGL_ARB_pixel_format(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_ARB_pixel_format")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 22, 23, 24 + }, + "wglGetPixelFormatAttribivARB", "wglGetPixelFormatAttribfvARB", "wglChoosePixelFormatARB" + ) || reportMissing("WGL", "WGL_ARB_pixel_format"); + } + + private static boolean check_WGL_ARB_render_texture(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_ARB_render_texture")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 25, 26, 27 + }, + "wglBindTexImageARB", "wglReleaseTexImageARB", "wglSetPbufferAttribARB" + ) || reportMissing("WGL", "WGL_ARB_render_texture"); + } + + private static boolean check_WGL_EXT_extensions_string(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_EXT_extensions_string")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 28 + }, + "wglGetExtensionsStringEXT" + ) || reportMissing("WGL", "WGL_EXT_extensions_string"); + } + + private static boolean check_WGL_EXT_swap_control(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_EXT_swap_control")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 29, 30 + }, + "wglSwapIntervalEXT", "wglGetSwapIntervalEXT" + ) || reportMissing("WGL", "WGL_EXT_swap_control"); + } + + private static boolean check_WGL_NV_copy_image(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_NV_copy_image")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 31 + }, + "wglCopyImageSubDataNV" + ) || reportMissing("WGL", "WGL_NV_copy_image"); + } + + private static boolean check_WGL_NV_delay_before_swap(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_NV_delay_before_swap")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 32 + }, + "wglDelayBeforeSwapNV" + ) || reportMissing("WGL", "WGL_NV_delay_before_swap"); + } + + private static boolean check_WGL_NV_DX_interop(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_NV_DX_interop")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 33, 34, 35, 36, 37, 38, 39, 40 + }, + "wglDXSetResourceShareHandleNV", "wglDXOpenDeviceNV", "wglDXCloseDeviceNV", "wglDXRegisterObjectNV", "wglDXUnregisterObjectNV", + "wglDXObjectAccessNV", "wglDXLockObjectsNV", "wglDXUnlockObjectsNV" + ) || reportMissing("WGL", "WGL_NV_DX_interop"); + } + + private static boolean check_WGL_NV_gpu_affinity(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_NV_gpu_affinity")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 41, 42, 43, 44, 45 + }, + "wglEnumGpusNV", "wglEnumGpuDevicesNV", "wglCreateAffinityDCNV", "wglEnumGpusFromAffinityDCNV", "wglDeleteDCNV" + ) || reportMissing("WGL", "WGL_NV_gpu_affinity"); + } + + private static boolean check_WGL_NV_swap_group(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_NV_swap_group")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 46, 47, 48, 49, 50, 51 + }, + "wglJoinSwapGroupNV", "wglBindSwapBarrierNV", "wglQuerySwapGroupNV", "wglQueryMaxSwapGroupsNV", "wglQueryFrameCountNV", "wglResetFrameCountNV" + ) || reportMissing("WGL", "WGL_NV_swap_group"); + } + + private static boolean check_WGL_NV_vertex_array_range(FunctionProvider provider, long[] caps, Set ext) { + if (!ext.contains("WGL_NV_vertex_array_range")) { + return false; + } + + return checkFunctions(provider, caps, new int[] { + 52, 53 + }, + "wglAllocateMemoryNV", "wglFreeMemoryNV" + ) || reportMissing("WGL", "WGL_NV_vertex_array_range"); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTColorspace.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTColorspace.java new file mode 100644 index 000000000..e17f9bb87 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTColorspace.java @@ -0,0 +1,28 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_EXT_colorspace extension. + * + *

    Applications may wish to use sRGB format default framebuffers to more easily achieve sRGB rendering to display devices. This extension allows creating + * pixel formats which will be rendered to in sRGB by OpenGL/ES contexts supporting that capability.

    + * + *

    Requires {@link GL30 OpenGL 3.0}.

    + */ +public final class WGLEXTColorspace { + + /** Accepted as an attribute name by {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB}, {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB} and {@link WGLARBPixelFormat#wglChoosePixelFormatARB ChoosePixelFormatARB}. */ + public static final int WGL_COLORSPACE_EXT = 0x309D; + + /** Accepted as attribute values for {@link #WGL_COLORSPACE_EXT COLORSPACE_EXT} by {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB}, {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB} and {@link WGLARBPixelFormat#wglChoosePixelFormatARB ChoosePixelFormatARB}. */ + public static final int + WGL_COLORSPACE_SRGB_EXT = 0x3089, + WGL_COLORSPACE_LINEAR_EXT = 0x308A; + + private WGLEXTColorspace() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTCreateContextES2Profile.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTCreateContextES2Profile.java new file mode 100644 index 000000000..c11c31a34 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTCreateContextES2Profile.java @@ -0,0 +1,22 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_EXT_create_context_es2_profile extension. + * + *

    This extension allows creating an OpenGL ES context.

    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string}, {@link WGLARBCreateContext WGL_ARB_create_context}, {@link WGLARBCreateContextProfile WGL_ARB_create_context_profile} and an OpenGL ES implementation.

    + */ +public final class WGLEXTCreateContextES2Profile { + + /** Accepted as a bit in the attribute value for {@link WGLARBCreateContextProfile#WGL_CONTEXT_PROFILE_MASK_ARB CONTEXT_PROFILE_MASK_ARB} in {@code attribList}. */ + public static final int WGL_CONTEXT_ES2_PROFILE_BIT_EXT = 0x4; + + private WGLEXTCreateContextES2Profile() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTCreateContextESProfile.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTCreateContextESProfile.java new file mode 100644 index 000000000..280934ef5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTCreateContextESProfile.java @@ -0,0 +1,22 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_EXT_create_context_es_profile extension. + * + *

    This extension allows creating an OpenGL ES context.

    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string}, {@link WGLARBCreateContext WGL_ARB_create_context}, {@link WGLARBCreateContextProfile WGL_ARB_create_context_profile} and an OpenGL ES implementation.

    + */ +public final class WGLEXTCreateContextESProfile { + + /** Accepted as a bit in the attribute value for {@link WGLARBCreateContextProfile#WGL_CONTEXT_PROFILE_MASK_ARB CONTEXT_PROFILE_MASK_ARB} in {@code attribList}. */ + public static final int WGL_CONTEXT_ES_PROFILE_BIT_EXT = 0x4; + + private WGLEXTCreateContextESProfile() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTDepthFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTDepthFloat.java new file mode 100644 index 000000000..604a392e3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTDepthFloat.java @@ -0,0 +1,27 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_EXT_depth_float extension. + * + *

    For perspective scenes, the density of objects (vertices) increases as the distance from the eye increases. For a linear depth buffer, this means that + * objects (vertices) are sparse for a large portion of the depth range and are dense for a small portion of the depth buffer.

    + * + *

    This behavior is obvious if you consider standing in a boat looking at the shore. The near objects include only the boat while the far objects include + * the entire shoreline which may include an entire city.

    + * + *

    A non-linear (floating-point) depth buffer helps this problem. If the near clipping plane is set to 1.0, and the far clipping plane is set to 0.0, a + * much greater resolution of objects can occur.

    + */ +public final class WGLEXTDepthFloat { + + /** Accepted by the {@code attribute} parameter of wglGetPixelFormatAttribivEXT, wglGetPixelFormatAttribfvEXT, and wglChoosePixelFormatExEXT. */ + public static final int WGL_DEPTH_FLOAT_EXT = 0x2040; + + private WGLEXTDepthFloat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTExtensionsString.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTExtensionsString.java new file mode 100644 index 000000000..c727262f1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTExtensionsString.java @@ -0,0 +1,46 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to the WGL_EXT_extensions_string extension. */ +public class WGLEXTExtensionsString { + + protected WGLEXTExtensionsString() { + throw new UnsupportedOperationException(); + } + + // --- [ wglGetExtensionsStringEXT ] --- + + /** Unsafe version of: {@link #wglGetExtensionsStringEXT GetExtensionsStringEXT} */ + public static long nwglGetExtensionsStringEXT() { + long __functionAddress = GL.getCapabilitiesWGL().wglGetExtensionsStringEXT; + if (CHECKS) { + check(__functionAddress); + } + return callP(__functionAddress); + } + + /** + * Returns a list of supported extensions to WGL. Although the contents of the string is implementation specific, the string will be {@code NULL} terminated and + * will contain a space-separated list of extension names. (The extension names themselves do not contain spaces.) If there are no extensions then the + * empty string is returned. + */ + @Nullable + @NativeType("char const *") + public static String wglGetExtensionsStringEXT() { + long __result = nwglGetExtensionsStringEXT(); + return memASCIISafe(__result); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTFramebufferSRGB.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTFramebufferSRGB.java new file mode 100644 index 000000000..d94c5d96c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTFramebufferSRGB.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_EXT_framebuffer_sRGB extension. + * + *

    WGL functionality for {@link EXTFramebufferSRGB EXT_framebuffer_sRGB}.

    + * + *

    Requires {@link WGLEXTExtensionsString WGL_EXT_extensions_string} and {@link WGLARBPixelFormat WGL_ARB_pixel_format}.

    + */ +public final class WGLEXTFramebufferSRGB { + + /** + * Accepted by the {@code piAttributes} parameter of wglGetPixelFormatAttribivEXT, wglGetPixelFormatAttribfvEXT, and the {@code piAttribIList} and + * {@code pfAttribIList} of wglChoosePixelFormatEXT. + */ + public static final int WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT = 0x20A9; + + private WGLEXTFramebufferSRGB() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTPixelFormatPackedFloat.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTPixelFormatPackedFloat.java new file mode 100644 index 000000000..05710b83e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTPixelFormatPackedFloat.java @@ -0,0 +1,26 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_EXT_pixel_format_packed_float extension. + * + *

    This extension provides support for rendering into an unsigned floating-point rendering format with the assumption that the texture format described in + * {@link EXTPackedFloat} could also be advertised as an unsigned floating-point format for rendering.

    + * + *

    Requires {@link WGLARBPixelFormat WGL_ARB_pixel_format}.

    + */ +public final class WGLEXTPixelFormatPackedFloat { + + /** + * Accepted as a value in the {@code attribIList} parameter array of {@link WGLARBPixelFormat#wglChoosePixelFormatARB ChoosePixelFormatARB}, and returned in the {@code values} + * parameter array of {@link WGLARBPixelFormat#wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB}. + */ + public static final int WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT = 0x20A8; + + private WGLEXTPixelFormatPackedFloat() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTSwapControl.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTSwapControl.java new file mode 100644 index 000000000..e5c608bcd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLEXTSwapControl.java @@ -0,0 +1,63 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the WGL_EXT_swap_control extension. + * + *

    This extension allows an application to specify a minimum periodicity of color buffer swaps, measured in video frame periods.

    + * + *

    Requires {@link WGLEXTExtensionsString WGL_EXT_extensions_string}.

    + */ +public class WGLEXTSwapControl { + + protected WGLEXTSwapControl() { + throw new UnsupportedOperationException(); + } + + // --- [ wglSwapIntervalEXT ] --- + + /** + * Specifies the minimum number of video frame periods per buffer swap for the window associated with the current context. The interval takes effect when + * {@link org.lwjgl.system.windows.GDI32#SwapBuffers} or wglSwapLayerBuffer is first called subsequent to the {@code wglSwapIntervalEXT} call. + * + *

    A video frame period is the time required by the monitor to display a full frame of video data. In the case of an interlaced monitor, this is typically + * the time required to display both the even and odd fields of a frame of video data. An interval set to a value of 2 means that the color buffers will + * be swapped at most every other video frame.

    + * + *

    If {@code interval} is set to a value of 0, buffer swaps are not synchronized to a video frame. The {@code interval} value is silently clamped to the + * maximum implementation-dependent value supported before being stored.

    + * + *

    The swap interval is not part of the render context state. It cannot be pushed or popped. The default swap interval is 1.

    + * + * @param interval the minimum number of video frames that are displayed before a buffer swap will occur + */ + @NativeType("BOOL") + public static boolean wglSwapIntervalEXT(int interval) { + long __functionAddress = GL.getCapabilitiesWGL().wglSwapIntervalEXT; + if (CHECKS) { + check(__functionAddress); + } + return callI(interval, __functionAddress) != 0; + } + + // --- [ wglGetSwapIntervalEXT ] --- + + /** Returns the current swap interval for the window associated with the current context. */ + public static int wglGetSwapIntervalEXT() { + long __functionAddress = GL.getCapabilitiesWGL().wglGetSwapIntervalEXT; + if (CHECKS) { + check(__functionAddress); + } + return callI(__functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVCopyImage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVCopyImage.java new file mode 100644 index 000000000..23ea6ab1e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVCopyImage.java @@ -0,0 +1,62 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** + * Native bindings to the WGL_NV_copy_image extension. + * + *

    This extension enables efficient image data transfer between image objects (i.e. textures and renderbuffers) without the need to bind the objects or + * otherwise configure the rendering pipeline. The WGL version allows copying between images in different contexts, even if those contexts are in + * different sharelists or even on different physical devices.

    + */ +public class WGLNVCopyImage { + + protected WGLNVCopyImage() { + throw new UnsupportedOperationException(); + } + + // --- [ wglCopyImageSubDataNV ] --- + + /** + * Behaves identically to the core function {@link #wglCopyImageSubDataNV CopyImageSubDataNV}, except that the {@code srcRC} and {@code dstRC} parameters specify + * the contexts in which to look up the source and destination objects, respectively. A value of zero indicates that the currently bound context should be + * used instead. + * + * @param srcRC the source OpenGL context + * @param srcName the source object + * @param srcTarget the source object target + * @param srcLevel the source level-of-detail number + * @param srcX the source texel x coordinate + * @param srcY the source texel y coordinate + * @param srcZ the source texel z coordinate + * @param dstRC the destination OpenGL context + * @param dstName the destination object + * @param dstTarget the destination object target + * @param dstLevel the destination level-of-detail number + * @param dstX the destination texel x coordinate + * @param dstY the destination texel y coordinate + * @param dstZ the destination texel z coordinate + * @param width the number of texels to copy in the x-dimension + * @param height the number of texels to copy in the y-dimension + * @param depth the number of texels to copy in the z-dimension + */ + @NativeType("BOOL") + public static boolean wglCopyImageSubDataNV(@NativeType("HGLRC") long srcRC, @NativeType("GLuint") int srcName, @NativeType("GLenum") int srcTarget, @NativeType("GLint") int srcLevel, @NativeType("GLint") int srcX, @NativeType("GLint") int srcY, @NativeType("GLint") int srcZ, @NativeType("HGLRC") long dstRC, @NativeType("GLuint") int dstName, @NativeType("GLenum") int dstTarget, @NativeType("GLint") int dstLevel, @NativeType("GLint") int dstX, @NativeType("GLint") int dstY, @NativeType("GLint") int dstZ, @NativeType("GLsizei") int width, @NativeType("GLsizei") int height, @NativeType("GLsizei") int depth) { + long __functionAddress = GL.getCapabilitiesWGL().wglCopyImageSubDataNV; + if (CHECKS) { + check(__functionAddress); + check(srcRC); + check(dstRC); + } + return callPPI(srcRC, srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstRC, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVDXInterop.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVDXInterop.java new file mode 100644 index 000000000..e8f8ba603 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVDXInterop.java @@ -0,0 +1,196 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the WGL_NV_DX_interop extension. + * + *

    This extension allows OpenGL to directly access DirectX buffers and surfaces. A DirectX vertex buffer may be shared as an OpenGL buffer object and a + * DirectX surface may be shared as an OpenGL texture or renderbuffer object.

    + * + *

    Requires {@link GL21 OpenGL 2.1}.

    + */ +public class WGLNVDXInterop { + + /** Accepted by the {@code access} parameters of {@link #wglDXRegisterObjectNV DXRegisterObjectNV} and {@link #wglDXObjectAccessNV DXObjectAccessNV}. */ + public static final int + WGL_ACCESS_READ_ONLY_NV = 0x0, + WGL_ACCESS_READ_WRITE_NV = 0x1, + WGL_ACCESS_WRITE_DISCARD_NV = 0x2; + + protected WGLNVDXInterop() { + throw new UnsupportedOperationException(); + } + + // --- [ wglDXSetResourceShareHandleNV ] --- + + /** + * @param dxObject a pointer to the DirectX resource that will be shared + * @param shareHandle the share handle that the OS generated for the resource + */ + @NativeType("BOOL") + public static boolean wglDXSetResourceShareHandleNV(@NativeType("void *") long dxObject, @NativeType("HANDLE") long shareHandle) { + long __functionAddress = GL.getCapabilitiesWGL().wglDXSetResourceShareHandleNV; + if (CHECKS) { + check(__functionAddress); + check(dxObject); + check(shareHandle); + } + return callPPI(dxObject, shareHandle, __functionAddress) != 0; + } + + // --- [ wglDXOpenDeviceNV ] --- + + /** + * Prepares a DirectX device for interoperability and returns a handle to a GL/DirectX interop device. + * + * @param dxDevice a pointer to a supported Direct3D device object + */ + @NativeType("HANDLE") + public static long wglDXOpenDeviceNV(@NativeType("void *") long dxDevice) { + long __functionAddress = GL.getCapabilitiesWGL().wglDXOpenDeviceNV; + if (CHECKS) { + check(__functionAddress); + check(dxDevice); + } + return callPP(dxDevice, __functionAddress); + } + + // --- [ wglDXCloseDeviceNV ] --- + + @NativeType("BOOL") + public static boolean wglDXCloseDeviceNV(@NativeType("HANDLE") long device) { + long __functionAddress = GL.getCapabilitiesWGL().wglDXCloseDeviceNV; + if (CHECKS) { + check(__functionAddress); + check(device); + } + return callPI(device, __functionAddress) != 0; + } + + // --- [ wglDXRegisterObjectNV ] --- + + /** + * Prepares a DirectX object for use by the GL and returns a handle to a GL/DirectX interop object. + * + * @param device a GL/DirectX interop device handle, as returned by {@link #wglDXOpenDeviceNV DXOpenDeviceNV} + * @param dxResource a pointer to a DirectX resource to be registered with the GL + * @param name the GL object name to be assigned to the DirectX resource in the namespace of the objects identified by {@code type} in the current GL context + * @param type the GL object type that will map to the DirectX resource being shared + * @param access indicates the intended usage of the resource in GL. One of:
    {@link #WGL_ACCESS_READ_ONLY_NV ACCESS_READ_ONLY_NV}{@link #WGL_ACCESS_READ_WRITE_NV ACCESS_READ_WRITE_NV}{@link #WGL_ACCESS_WRITE_DISCARD_NV ACCESS_WRITE_DISCARD_NV}
    + */ + @NativeType("HANDLE") + public static long wglDXRegisterObjectNV(@NativeType("HANDLE") long device, @NativeType("void *") long dxResource, @NativeType("GLuint") int name, @NativeType("GLenum") int type, @NativeType("GLenum") int access) { + long __functionAddress = GL.getCapabilitiesWGL().wglDXRegisterObjectNV; + if (CHECKS) { + check(__functionAddress); + check(device); + check(dxResource); + } + return callPPP(device, dxResource, name, type, access, __functionAddress); + } + + // --- [ wglDXUnregisterObjectNV ] --- + + @NativeType("BOOL") + public static boolean wglDXUnregisterObjectNV(@NativeType("HANDLE") long device, @NativeType("HANDLE") long object) { + long __functionAddress = GL.getCapabilitiesWGL().wglDXUnregisterObjectNV; + if (CHECKS) { + check(__functionAddress); + check(device); + check(object); + } + return callPPI(device, object, __functionAddress) != 0; + } + + // --- [ wglDXObjectAccessNV ] --- + + /** + * Modifies the access mode of an interop object, if a different access mode is required after the object has been registered. + * + * @param object the GL/DirectX interop object + * @param access the new access mode. One of:
    {@link #WGL_ACCESS_READ_ONLY_NV ACCESS_READ_ONLY_NV}{@link #WGL_ACCESS_READ_WRITE_NV ACCESS_READ_WRITE_NV}{@link #WGL_ACCESS_WRITE_DISCARD_NV ACCESS_WRITE_DISCARD_NV}
    + */ + @NativeType("BOOL") + public static boolean wglDXObjectAccessNV(@NativeType("HANDLE") long object, @NativeType("GLenum") int access) { + long __functionAddress = GL.getCapabilitiesWGL().wglDXObjectAccessNV; + if (CHECKS) { + check(__functionAddress); + check(object); + } + return callPI(object, access, __functionAddress) != 0; + } + + // --- [ wglDXLockObjectsNV ] --- + + /** + * Unsafe version of: {@link #wglDXLockObjectsNV DXLockObjectsNV} + * + * @param count the number of objects to lock + */ + public static int nwglDXLockObjectsNV(long device, int count, long objects) { + long __functionAddress = GL.getCapabilitiesWGL().wglDXLockObjectsNV; + if (CHECKS) { + check(__functionAddress); + check(device); + } + return callPPI(device, count, objects, __functionAddress); + } + + /** + * Before a GL object which is associated with a DirectX resource may be used, it must be locked with this function. + * + *

    A return value of TRUE indicates that all objects were successfully locked. A return value of FALSE indicates an error. If the function returns FALSE, + * none of the objects will be locked.

    + * + *

    Attempting to access an interop object via GL when the object is not locked, or attempting to access the DirectX resource through the DirectX API when + * it is locked by GL, will result in undefined behavior and may result in data corruption or program termination. Likewise, passing invalid interop device + * or object handles to this function has undefined results, including program termination.

    + * + * @param device the GL/DirectX interop device handle + * @param objects an array of {@code count} interop objects + */ + @NativeType("BOOL") + public static boolean wglDXLockObjectsNV(@NativeType("HANDLE") long device, @NativeType("HANDLE *") PointerBuffer objects) { + return nwglDXLockObjectsNV(device, objects.remaining(), memAddress(objects)) != 0; + } + + // --- [ wglDXUnlockObjectsNV ] --- + + /** + * Unsafe version of: {@link #wglDXUnlockObjectsNV DXUnlockObjectsNV} + * + * @param count the number of objects to unlock + */ + public static int nwglDXUnlockObjectsNV(long device, int count, long objects) { + long __functionAddress = GL.getCapabilitiesWGL().wglDXUnlockObjectsNV; + if (CHECKS) { + check(__functionAddress); + check(device); + } + return callPPI(device, count, objects, __functionAddress); + } + + /** + * Return control of an object to DirectX. + * + * @param device the GL/DirectX interop device handle + * @param objects an array of {@code count} interop objects + */ + @NativeType("BOOL") + public static boolean wglDXUnlockObjectsNV(@NativeType("HANDLE") long device, @NativeType("HANDLE *") PointerBuffer objects) { + return nwglDXUnlockObjectsNV(device, objects.remaining(), memAddress(objects)) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVDelayBeforeSwap.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVDelayBeforeSwap.java new file mode 100644 index 000000000..41247f225 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVDelayBeforeSwap.java @@ -0,0 +1,69 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +import org.lwjgl.system.windows.WinBase; + +/** + * Native bindings to the WGL_NV_delay_before_swap extension. + * + *

    For most interactive applications, the standard rendering loop responding to input events on a frame granularity is sufficient. Some more demanding + * applications may want to exchange performance for the ability to sample input closer to the final frame swap and adjust rendering accordingly. This + * extension adds functionality to allow the application to wait until a specified time before a swapbuffers command would be able to execute.

    + * + *

    Requires {@link GL21 OpenGL 2.1}.

    + */ +public class WGLNVDelayBeforeSwap { + + protected WGLNVDelayBeforeSwap() { + throw new UnsupportedOperationException(); + } + + // --- [ wglDelayBeforeSwapNV ] --- + + /** + * Blocks the CPU until {@code seconds} seconds before a synchronized swap would occur on the window associated with {@code hDC}. It also returns a boolean + * value equal to {@link WinBase#TRUE} when the implementation had to wait for the synchronized swap and {@link WinBase#FALSE} otherwise. + * + *

    The parameter {@code hDC} must be a valid device context associated with a graphic adapter. If {@code hDC} is not valid, {@link WinBase#GetLastError} will + * return WGL_INVALID_HDC, {@code DelayBeforeSwapNV} will return FALSE and will not wait for the swap. If {@code hDC} is not associated with a graphic + * adapter, {@code GetLastError} will return ERROR_DC_NOT_FOUND, {@code DelayBeforeSwapNV} will return FALSE and will not wait for the swap.

    + * + *

    The parameter {@code seconds} accepts positive floating point values not larger than the length in seconds of the swap period on the associated window. + * When buffer swaps are synchronized, the swap period is composed of one or multiple video frame periods. A video frame period is the time required by the + * monitor to display a full frame of video data. A swap interval set to a value of 2 means that the color buffers will be swapped at most every other + * video frame. If {@code seconds} is smaller than 0, {@code GetLastError} will return ERROR_INVALID_DATA, {@code DelayBeforeSwapNV} will return FALSE and + * will not wait for the end of the swap period. If {@code seconds} is greater than a swap period, {@code DelayBeforeSwapNV} will return immediately + * without generating any error and the return value will be FALSE.

    + * + *

    The application should use a {@code seconds} delay large enough to have time to complete its work before the end of the swap period. If {@code seconds} + * is close to 0.0, the application may miss the end of the swap period and it will have to wait an additional swap period before it can swap.

    + * + *

    If {@code DelayBeforeSwapNV} detects that there is less than {@code seconds} seconds before the end of the swap period, it will return immediately and + * the return value will be FALSE. The implementation will not wait an additional video frame period to have an exact delay of {@code seconds} seconds.

    + * + *

    If buffer swaps are unsynchronized, {@code DelayBeforeSwapNV} will return immediately and the return value will be FALSE. It could happen for multiple + * reasons, for example if the swap interval is equal to 0, if the window is in a mode switch or if no monitors are active.

    + * + * @param hDC a handle to the DC + * @param seconds the delay, in seconds + */ + @NativeType("BOOL") + public static boolean wglDelayBeforeSwapNV(@NativeType("HDC") long hDC, @NativeType("GLfloat") float seconds) { + long __functionAddress = GL.getCapabilitiesWGL().wglDelayBeforeSwapNV; + if (CHECKS) { + check(__functionAddress); + check(hDC); + } + return callPI(hDC, seconds, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVFloatBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVFloatBuffer.java new file mode 100644 index 000000000..ecea6ba4d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVFloatBuffer.java @@ -0,0 +1,38 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_NV_float_buffer extension. + * + *

    WGL functionality for {@link NVFloatBuffer NV_float_buffer}.

    + */ +public final class WGLNVFloatBuffer { + + /** + * Accepted in the {@code piAttributes} array of wglGetPixelFormatAttribivARB and wglGetPixelFormatAttribfvARB and in the {@code piAttribIList} and + * {@code pfAttribFList} arrays of wglChoosePixelFormatARB. + */ + public static final int + WGL_FLOAT_COMPONENTS_NV = 0x20B0, + WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV = 0x20B1, + WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV = 0x20B2, + WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV = 0x20B3, + WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV = 0x20B4; + + /** + * Accepted in the {@code piAttribIList} array of wglCreatePbufferARB and returned in the {@code value} parameter of wglQueryPbufferARB when + * {@code iAttribute} is TEXTURE_FORMAT_ARB. + */ + public static final int + WGL_TEXTURE_FLOAT_R_NV = 0x20B5, + WGL_TEXTURE_FLOAT_RG_NV = 0x20B6, + WGL_TEXTURE_FLOAT_RGB_NV = 0x20B7, + WGL_TEXTURE_FLOAT_RGBA_NV = 0x20B8; + + private WGLNVFloatBuffer() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVGPUAffinity.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVGPUAffinity.java new file mode 100644 index 000000000..72d358721 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVGPUAffinity.java @@ -0,0 +1,170 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the WGL_NV_gpu_affinity extension. + * + *

    On systems with more than one GPU it is desirable to be able to select which GPU(s) in the system become the target for OpenGL rendering commands. This + * extension introduces the concept of a GPU affinity mask. OpenGL rendering commands are directed to the GPU(s) specified by the affinity mask. GPU + * affinity is immutable. Once set, it cannot be changed.

    + * + *

    This extension also introduces the concept called affinity-DC. An affinity-DC is a device context with a GPU affinity mask embedded in it. This + * restricts the device context to only allow OpenGL commands to be sent to the GPU(s) in the affinity mask.

    + * + *

    Requires {@link WGLARBExtensionsString WGL_ARB_extensions_string}.

    + */ +public class WGLNVGPUAffinity { + + /** New error code set by wglShareLists, wglMakeCurrent and {@link WGLARBMakeCurrentRead#wglMakeContextCurrentARB MakeContextCurrentARB}. */ + public static final int ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV = 0x20D0; + + /** New error code set by {@link WGL#wglMakeCurrent MakeCurrent} and {@link WGLARBMakeCurrentRead#wglMakeContextCurrentARB MakeContextCurrentARB}. */ + public static final int ERROR_MISSING_AFFINITY_MASK_NV = 0x20D1; + + protected WGLNVGPUAffinity() { + throw new UnsupportedOperationException(); + } + + // --- [ wglEnumGpusNV ] --- + + /** Unsafe version of: {@link #wglEnumGpusNV EnumGpusNV} */ + public static int nwglEnumGpusNV(int gpuIndex, long gpu) { + long __functionAddress = GL.getCapabilitiesWGL().wglEnumGpusNV; + if (CHECKS) { + check(__functionAddress); + } + return callPI(gpuIndex, gpu, __functionAddress); + } + + /** + * Returns the handles for all GPUs in a system. + * + *

    By looping over {@code wglEnumGpusNV} and incrementing {@code gpuIndex}, starting at index 0, all GPU handles can be queried. If the function succeeds, + * the return value is TRUE. If the function fails, the return value is FALSE and {@code gpu} will be unmodified. The function fails if {@code gpuIndex} is + * greater or equal than the number of GPUs supported by the system.

    + * + * @param gpuIndex an index value that specifies a GPU + * @param gpu returns a handle for GPU number {@code gpuIndex}. The first GPU will be index 0. + */ + @NativeType("BOOL") + public static boolean wglEnumGpusNV(@NativeType("UINT") int gpuIndex, @NativeType("HGPUNV *") PointerBuffer gpu) { + if (CHECKS) { + check(gpu, 1); + } + return nwglEnumGpusNV(gpuIndex, memAddress(gpu)) != 0; + } + + // --- [ wglEnumGpuDevicesNV ] --- + + /** Unsafe version of: {@link #wglEnumGpuDevicesNV EnumGpuDevicesNV} */ + public static int nwglEnumGpuDevicesNV(long gpu, int deviceIndex, long gpuDevice) { + long __functionAddress = GL.getCapabilitiesWGL().wglEnumGpuDevicesNV; + if (CHECKS) { + check(__functionAddress); + check(gpu); + } + return callPPI(gpu, deviceIndex, gpuDevice, __functionAddress); + } + + /** + * Retrieve information about the display devices supported by a GPU. + * + * @param gpu a handle to the GPU to query + * @param deviceIndex an index value that specifies a display device, supported by {@code gpu}, to query. The first display device will be index 0. + * @param gpuDevice a {@link GPU_DEVICE} structure which will receive information about the display device at index {@code deviceIndex}. + */ + @NativeType("BOOL") + public static boolean wglEnumGpuDevicesNV(@NativeType("HGPUNV") long gpu, @NativeType("UINT") int deviceIndex, @NativeType("PGPU_DEVICE") GPU_DEVICE gpuDevice) { + return nwglEnumGpuDevicesNV(gpu, deviceIndex, gpuDevice.address()) != 0; + } + + // --- [ wglCreateAffinityDCNV ] --- + + /** Unsafe version of: {@link #wglCreateAffinityDCNV CreateAffinityDCNV} */ + public static long nwglCreateAffinityDCNV(long gpuList) { + long __functionAddress = GL.getCapabilitiesWGL().wglCreateAffinityDCNV; + if (CHECKS) { + check(__functionAddress); + } + return callPP(gpuList, __functionAddress); + } + + /** + * Creates an affinity-DC. Affinity-DCs, a new type of DC, can be used to direct OpenGL commands to a specific GPU or set of GPUs. An affinity-DC is a + * device context with a GPU affinity mask embedded in it. This restricts the device context to only allow OpenGL commands to be sent to the GPU(s) in the + * affinity mask. An affinity-DC can be created directly, using the new function {@code wglCreateAffinityDCNV} and also indirectly by calling + * {@link WGLARBPbuffer#wglCreatePbufferARB CreatePbufferARB} followed by {@link WGLARBPbuffer#wglGetPbufferDCARB GetPbufferDCARB}. + * + *

    If successful, the function returns an affinity-DC handle. If it fails, {@code NULL} will be returned.

    + * + * @param gpuList a {@code NULL}-terminated array of GPU handles to which the affinity-DC will be restricted + */ + @NativeType("HDC") + public static long wglCreateAffinityDCNV(@NativeType("HGPUNV const *") PointerBuffer gpuList) { + if (CHECKS) { + checkNT(gpuList); + } + return nwglCreateAffinityDCNV(memAddress(gpuList)); + } + + // --- [ wglEnumGpusFromAffinityDCNV ] --- + + /** Unsafe version of: {@link #wglEnumGpusFromAffinityDCNV EnumGpusFromAffinityDCNV} */ + public static int nwglEnumGpusFromAffinityDCNV(long affinityDC, int gpuIndex, long gpu) { + long __functionAddress = GL.getCapabilitiesWGL().wglEnumGpusFromAffinityDCNV; + if (CHECKS) { + check(__functionAddress); + check(affinityDC); + } + return callPPI(affinityDC, gpuIndex, gpu, __functionAddress); + } + + /** + * Retrieves a list of GPU handles that make up the affinity-mask of an affinity-DC. + * + *

    By looping over {@code wglEnumGpusFromAffinityDCNV} and incrementing {@code gpuIndex}, starting at index 0, all GPU handles associated with the DC can + * be queried. If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE and {@code gpu} will be unmodified. The + * function fails if {@code gpuIndex} is greater or equal than the number of GPUs associated with {@code affinityDC}.

    + * + * @param affinityDC a handle of the affinity-DC to query + * @param gpuIndex an index value of the GPU handle in the affinity mask of {@code affinityDC} to query + * @param gpu returns a handle for GPU number {@code gpuIndex}. The first GPU will be at index 0. + */ + @NativeType("BOOL") + public static boolean wglEnumGpusFromAffinityDCNV(@NativeType("HDC") long affinityDC, @NativeType("UINT") int gpuIndex, @NativeType("HGPUNV *") PointerBuffer gpu) { + if (CHECKS) { + check(gpu, 1); + } + return nwglEnumGpusFromAffinityDCNV(affinityDC, gpuIndex, memAddress(gpu)) != 0; + } + + // --- [ wglDeleteDCNV ] --- + + /** + * Deletes an affinity-DC. + * + * @param hdc a handle of an affinity-DC to delete + */ + @NativeType("BOOL") + public static boolean wglDeleteDCNV(@NativeType("HDC") long hdc) { + long __functionAddress = GL.getCapabilitiesWGL().wglDeleteDCNV; + if (CHECKS) { + check(__functionAddress); + check(hdc); + } + return callPI(hdc, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVMultigpuContext.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVMultigpuContext.java new file mode 100644 index 000000000..0aa2cd012 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVMultigpuContext.java @@ -0,0 +1,43 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_NV_multigpu_context extension. + * + *

    This extension allows the creation of an OpenGL context in a multi-GPU environment with a specified multi-GPU strategy (known as SLI mode) which takes + * precedence over process-wide multi-GPU mode settings.

    + * + *

    The multi-GPU mode denotes vendor specific techniques to allow distributed rendering on multiple GPUs, further called AFR (alternate frame rendering) + * and Multicast (as defined in NV_gpu_multicast).

    + * + *

    OpenGL supports multiple contexts. The semantics of switching contexts is generally left to window system binding APIs such as WGL, GLX and EGL. The + * extension {@code WGL_NV_multigpu_context} allows to specify a preferred multi-GPU rendering mode per context, thus context switching can also switch + * the current multi-GPU rendering mode.

    + * + *

    The implementation is platform dependent and the actual multi-GPU rendering mode of the created context may vary on different hardware and operation + * system platforms.

    + * + *

    Requires {@link WGLARBCreateContext WGL_ARB_create_context}.

    + */ +public final class WGLNVMultigpuContext { + + /** Accepted as an attribute name in the {@code *attrib_list} argument to {@link WGLARBCreateContext#wglCreateContextAttribsARB CreateContextAttribsARB}. */ + public static final int WGL_CONTEXT_MULTIGPU_ATTRIB_NV = 0x20AA; + + /** + * Accepted as an attribute value for {@link #WGL_CONTEXT_MULTIGPU_ATTRIB_NV CONTEXT_MULTIGPU_ATTRIB_NV} in the {@code *attrib_list} argument to + * {@link WGLARBCreateContext#wglCreateContextAttribsARB CreateContextAttribsARB}. + */ + public static final int + WGL_CONTEXT_MULTIGPU_ATTRIB_SINGLE_NV = 0x20AB, + WGL_CONTEXT_MULTIGPU_ATTRIB_AFR_NV = 0x20AC, + WGL_CONTEXT_MULTIGPU_ATTRIB_MULTICAST_NV = 0x20AD, + WGL_CONTEXT_MULTIGPU_ATTRIB_MULTI_DISPLAY_MULTICAST_NV = 0x20AE; + + private WGLNVMultigpuContext() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVMultisampleCoverage.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVMultisampleCoverage.java new file mode 100644 index 000000000..1ab131d0a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVMultisampleCoverage.java @@ -0,0 +1,25 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_NV_multisample_coverage extension. + * + *

    WGL functionality for {@link NVMultisampleCoverage NV_multisample_coverage}.

    + */ +public final class WGLNVMultisampleCoverage { + + /** + * Accepted by the {@code piAttributes} parameter of wglGetPixelFormatAttribivEXT, wglGetPixelFormatAttribfvEXT, and the + * {@code piAttribIList} and {@code pfAttribIList} of wglChoosePixelFormatEXT. + */ + public static final int + WGL_COVERAGE_SAMPLES_NV = 0x2042, + WGL_COLOR_SAMPLES_NV = 0x20B9; + + private WGLNVMultisampleCoverage() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVRenderDepthTexture.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVRenderDepthTexture.java new file mode 100644 index 000000000..76c358727 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVRenderDepthTexture.java @@ -0,0 +1,40 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_NV_render_depth_texture extension. + * + *

    This extension allows a depth buffer to be used for both rendering and texturing. It is built upon the ARB_render_texture extension; the only addition + * in this extension is the ability to use a depth buffer as a DEPTH_COMPONENT texture map.

    + */ +public final class WGLNVRenderDepthTexture { + + /** + * Accepted by the {@code piAttributes} parameter of wglGetPixelFormatAttribivARB, wglGetPixelFormatAttribfvARB, and the {@code piAttribIList} and + * {@code pfAttribIList} parameters of wglChoosePixelFormatARB. + */ + public static final int + WGL_BIND_TO_TEXTURE_DEPTH_NV = 0x20A3, + WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV = 0x20A4; + + /** Accepted by the {@code piAttribList} parameter of wglCreatePbufferARB and by the {@code iAttribute} parameter of wglQueryPbufferARB. */ + public static final int WGL_DEPTH_TEXTURE_FORMAT_NV = 0x20A5; + + /** + * Accepted as a value in the {@code piAttribList} parameter of wglCreatePbufferARB and returned in the value parameter of wglQueryPbufferARB when + * {@code iAttribute} is WGL_DEPTH_TEXTURE_FORMAT_NV. + */ + public static final int + WGL_TEXTURE_DEPTH_COMPONENT_NV = 0x20A6, + WGL_NO_TEXTURE_ARB = 0x2077; + + /** Accepted by the {@code iBuffer} parameter of wglBindTexImageARB. */ + public static final int WGL_DEPTH_COMPONENT_NV = 0x20A7; + + private WGLNVRenderDepthTexture() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVRenderTextureRectangle.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVRenderTextureRectangle.java new file mode 100644 index 000000000..63bdc4bc3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVRenderTextureRectangle.java @@ -0,0 +1,33 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the WGL_NV_render_texture_rectangle extension. + * + *

    This extension allows a color buffer with non-power-of-two dimensions to be used for both rendering and texturing. It is built upon the + * ARB_render_texture extension; the only addition in this extension is the ability to bind a texture to a texture rectangle target, as provided through + * the NV_texture_rectangle extension.

    + */ +public final class WGLNVRenderTextureRectangle { + + /** + * Accepted by the {@code piAttributes} parameter of wglGetPixelFormatAttribivARB, wglGetPixelFormatAttribfvARB, and the {@code piAttribIList} and + * {@code pfAttribIList} parameters of wglChoosePixelFormatARB. + */ + public static final int + WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV = 0x20A0, + WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV = 0x20A1; + + /** + * Accepted as a value in the {@code piAttribList} parameter of wglCreatePbufferARB and returned in the value parameter of wglQueryPbufferARB when + * {@code iAttribute} is WGL_TEXTURE_TARGET_ARB. + */ + public static final int WGL_TEXTURE_RECTANGLE_NV = 0x20A2; + + private WGLNVRenderTextureRectangle() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVSwapGroup.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVSwapGroup.java new file mode 100644 index 000000000..f96b7ef63 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVSwapGroup.java @@ -0,0 +1,165 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the WGL_NV_swap_group extension. + * + *

    This extension provides the capability to synchronize the buffer swaps of a group of OpenGL windows. A swap group is created, and windows are added as + * members to the swap group. Buffer swaps to members of the swap group will then take place concurrently.

    + * + *

    This extension also provides the capability to sychronize the buffer swaps of different swap groups, which may reside on distributed systems on a + * network. For this purpose swap groups can be bound to a swap barrier.

    + * + *

    This extension extends the set of conditions that must be met before a buffer swap can take place.

    + */ +public class WGLNVSwapGroup { + + protected WGLNVSwapGroup() { + throw new UnsupportedOperationException(); + } + + // --- [ wglJoinSwapGroupNV ] --- + + @NativeType("BOOL") + public static boolean wglJoinSwapGroupNV(@NativeType("HDC") long hDC, @NativeType("GLuint") int group) { + long __functionAddress = GL.getCapabilitiesWGL().wglJoinSwapGroupNV; + if (CHECKS) { + check(__functionAddress); + check(hDC); + } + return callPI(hDC, group, __functionAddress) != 0; + } + + // --- [ wglBindSwapBarrierNV ] --- + + @NativeType("BOOL") + public static boolean wglBindSwapBarrierNV(@NativeType("GLuint") int group, @NativeType("GLuint") int barrier) { + long __functionAddress = GL.getCapabilitiesWGL().wglBindSwapBarrierNV; + if (CHECKS) { + check(__functionAddress); + } + return callI(group, barrier, __functionAddress) != 0; + } + + // --- [ wglQuerySwapGroupNV ] --- + + public static int nwglQuerySwapGroupNV(long hDC, long group, long barrier) { + long __functionAddress = GL.getCapabilitiesWGL().wglQuerySwapGroupNV; + if (CHECKS) { + check(__functionAddress); + check(hDC); + } + return callPPPI(hDC, group, barrier, __functionAddress); + } + + @NativeType("BOOL") + public static boolean wglQuerySwapGroupNV(@NativeType("HDC") long hDC, @NativeType("GLuint *") IntBuffer group, @NativeType("GLuint *") IntBuffer barrier) { + if (CHECKS) { + check(group, 1); + check(barrier, 1); + } + return nwglQuerySwapGroupNV(hDC, memAddress(group), memAddress(barrier)) != 0; + } + + // --- [ wglQueryMaxSwapGroupsNV ] --- + + public static int nwglQueryMaxSwapGroupsNV(long hDC, long maxGroups, long maxBarriers) { + long __functionAddress = GL.getCapabilitiesWGL().wglQueryMaxSwapGroupsNV; + if (CHECKS) { + check(__functionAddress); + check(hDC); + } + return callPPPI(hDC, maxGroups, maxBarriers, __functionAddress); + } + + @NativeType("BOOL") + public static boolean wglQueryMaxSwapGroupsNV(@NativeType("HDC") long hDC, @NativeType("GLuint *") IntBuffer maxGroups, @NativeType("GLuint *") IntBuffer maxBarriers) { + if (CHECKS) { + check(maxGroups, 1); + check(maxBarriers, 1); + } + return nwglQueryMaxSwapGroupsNV(hDC, memAddress(maxGroups), memAddress(maxBarriers)) != 0; + } + + // --- [ wglQueryFrameCountNV ] --- + + public static int nwglQueryFrameCountNV(long hDC, long count) { + long __functionAddress = GL.getCapabilitiesWGL().wglQueryFrameCountNV; + if (CHECKS) { + check(__functionAddress); + check(hDC); + } + return callPPI(hDC, count, __functionAddress); + } + + @NativeType("BOOL") + public static boolean wglQueryFrameCountNV(@NativeType("HDC") long hDC, @NativeType("GLuint *") IntBuffer count) { + if (CHECKS) { + check(count, 1); + } + return nwglQueryFrameCountNV(hDC, memAddress(count)) != 0; + } + + // --- [ wglResetFrameCountNV ] --- + + @NativeType("BOOL") + public static boolean wglResetFrameCountNV(@NativeType("HDC") long hDC) { + long __functionAddress = GL.getCapabilitiesWGL().wglResetFrameCountNV; + if (CHECKS) { + check(__functionAddress); + check(hDC); + } + return callPI(hDC, __functionAddress) != 0; + } + + /** Array version of: {@link #wglQuerySwapGroupNV QuerySwapGroupNV} */ + @NativeType("BOOL") + public static boolean wglQuerySwapGroupNV(@NativeType("HDC") long hDC, @NativeType("GLuint *") int[] group, @NativeType("GLuint *") int[] barrier) { + long __functionAddress = GL.getCapabilitiesWGL().wglQuerySwapGroupNV; + if (CHECKS) { + check(__functionAddress); + check(hDC); + check(group, 1); + check(barrier, 1); + } + return callPPPI(hDC, group, barrier, __functionAddress) != 0; + } + + /** Array version of: {@link #wglQueryMaxSwapGroupsNV QueryMaxSwapGroupsNV} */ + @NativeType("BOOL") + public static boolean wglQueryMaxSwapGroupsNV(@NativeType("HDC") long hDC, @NativeType("GLuint *") int[] maxGroups, @NativeType("GLuint *") int[] maxBarriers) { + long __functionAddress = GL.getCapabilitiesWGL().wglQueryMaxSwapGroupsNV; + if (CHECKS) { + check(__functionAddress); + check(hDC); + check(maxGroups, 1); + check(maxBarriers, 1); + } + return callPPPI(hDC, maxGroups, maxBarriers, __functionAddress) != 0; + } + + /** Array version of: {@link #wglQueryFrameCountNV QueryFrameCountNV} */ + @NativeType("BOOL") + public static boolean wglQueryFrameCountNV(@NativeType("HDC") long hDC, @NativeType("GLuint *") int[] count) { + long __functionAddress = GL.getCapabilitiesWGL().wglQueryFrameCountNV; + if (CHECKS) { + check(__functionAddress); + check(hDC); + check(count, 1); + } + return callPPI(hDC, count, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVVertexArrayRange.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVVertexArrayRange.java new file mode 100644 index 000000000..d799db7e0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/WGLNVVertexArrayRange.java @@ -0,0 +1,55 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +public class WGLNVVertexArrayRange { + + protected WGLNVVertexArrayRange() { + throw new UnsupportedOperationException(); + } + + // --- [ wglAllocateMemoryNV ] --- + + public static long nwglAllocateMemoryNV(int size, float readfreq, float writefreq, float priority) { + long __functionAddress = GL.getCapabilitiesWGL().wglAllocateMemoryNV; + if (CHECKS) { + check(__functionAddress); + } + return callP(size, readfreq, writefreq, priority, __functionAddress); + } + + @Nullable + @NativeType("void *") + public static ByteBuffer wglAllocateMemoryNV(@NativeType("GLsizei") int size, @NativeType("GLfloat") float readfreq, @NativeType("GLfloat") float writefreq, @NativeType("GLfloat") float priority) { + long __result = nwglAllocateMemoryNV(size, readfreq, writefreq, priority); + return memByteBufferSafe(__result, size); + } + + // --- [ wglFreeMemoryNV ] --- + + public static void nwglFreeMemoryNV(long pointer) { + long __functionAddress = GL.getCapabilitiesWGL().wglFreeMemoryNV; + if (CHECKS) { + check(__functionAddress); + } + callPV(pointer, __functionAddress); + } + + public static void wglFreeMemoryNV(@NativeType("void *") ByteBuffer pointer) { + nwglFreeMemoryNV(memAddress(pointer)); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/opengl/_3DFXTextureCompressionFXT1.java b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/_3DFXTextureCompressionFXT1.java new file mode 100644 index 000000000..7b2d37b90 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/opengl/_3DFXTextureCompressionFXT1.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.opengl; + +/** + * Native bindings to the 3DFX_texture_compression_FXT1 extension. + * + *

    This extension additional texture compression functionality's FXT1 format, specific to 3dfxsubject to all the requirements and limitations described by + * the extension {@code GL_ARB_texture_compression}. The FXT1 texture format supports only 2D and 3D images without borders.

    + * + *

    Because 3dfx expects to make continual improvement to its FXT1 compressor implementation, 3dfx recommends that to achieve best visual quality + * applications adopt the following procedure with respect to reuse of textures compressed by the GL:

    + * + *
      + *
    1. Save the RENDERER and VERSION strings along with images compressed by the GL;
    2. + *
    3. Before reuse of the textures, compare the stored strings with strings newly returned from the current GL;
    4. + *
    5. If out-of-date, repeat the compression and storage steps.
    6. + *
    + * + *

    Requires {@link ARBTextureCompression ARB_texture_compression}.

    + */ +public final class _3DFXTextureCompressionFXT1 { + + /** + * Accepted by the {@code internalformat} parameter of TexImage2D, CopyTexImage2D, TexImage3D, CopyTexImage3D, and by the {@code internalformat} and + * {@code format} parameters of CompressedTexImage2D_ARB, CompressedTexSubImage2D_ARB, CompressedTexImage3D_ARB, CompressedTexSubImage3D_ARB. + */ + public static final int + GL_COMPRESSED_RGB_FXT1_3DFX = 0x86B0, + GL_COMPRESSED_RGBA_FXT1_3DFX = 0x86B1; + + private _3DFXTextureCompressionFXT1() {} + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/LibSTB.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/LibSTB.java new file mode 100644 index 000000000..2ab14a77b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/LibSTB.java @@ -0,0 +1,46 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** Initializes the stb shared library. */ +final class LibSTB { + + static { + String libName = Platform.mapLibraryNameBundled("lwjgl_stb"); + Library.loadSystem(System::load, System::loadLibrary, LibSTB.class, "org.lwjgl.stb", libName); + + MemoryAllocator allocator = getAllocator(Configuration.DEBUG_MEMORY_ALLOCATOR_INTERNAL.get(true)); + setupMalloc( + allocator.getMalloc(), + allocator.getCalloc(), + allocator.getRealloc(), + allocator.getFree(), + allocator.getAlignedAlloc(), + allocator.getAlignedFree() + ); + } + + private LibSTB() { + } + + static void initialize() { + // intentionally empty to trigger static initializer + } + + private static native void setupMalloc( + long malloc, + long calloc, + long realloc, + long free, + long aligned_alloc, + long aligned_free + ); + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBDXT.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBDXT.java new file mode 100644 index 000000000..167a12774 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBDXT.java @@ -0,0 +1,98 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to stb_dxt.h from the stb library. + * + *

    DXT1/DXT5 compressor.

    + */ +public class STBDXT { + + static { LibSTB.initialize(); } + + public static final int STB_DXT_NORMAL = 0x0; + + /** Use dithering. Was always dubious, now deprecated. Does nothing! */ + public static final int STB_DXT_DITHER = 0x1; + + /** High quality mode, does two refinement steps instead of 1. ~30-40% slower. */ + public static final int STB_DXT_HIGHQUAL = 0x2; + + protected STBDXT() { + throw new UnsupportedOperationException(); + } + + // --- [ stb_compress_dxt_block ] --- + + /** Unsafe version of: {@link #stb_compress_dxt_block compress_dxt_block} */ + public static native void nstb_compress_dxt_block(long dest, long src_rgba_four_bytes_per_pixel, int alpha, int mode); + + /** + * Call this function for every block (you must pad). + * + *

    The source should be a 4x4 block of RGBA data in row-major order. Alpha channel is not stored if you specify {@code alpha=0} (but you must supply some + * constant alpha in the alpha channel). You can turn on dithering and "high quality" using {@code mode}.

    + * + * @param dest a buffer in which to store the compressed block + * @param src_rgba_four_bytes_per_pixel the block to compress + * @param alpha 1 to compress the alpha channel, 0 to ignore it + * @param mode the compression mode. One of:
    {@link #STB_DXT_NORMAL DXT_NORMAL}{@link #STB_DXT_DITHER DXT_DITHER}{@link #STB_DXT_HIGHQUAL DXT_HIGHQUAL}
    + */ + public static void stb_compress_dxt_block(@NativeType("unsigned char *") ByteBuffer dest, @NativeType("unsigned char const *") ByteBuffer src_rgba_four_bytes_per_pixel, @NativeType("int") boolean alpha, int mode) { + if (CHECKS) { + check(dest, alpha ? 16 : 8); + check(src_rgba_four_bytes_per_pixel, 64); + } + nstb_compress_dxt_block(memAddress(dest), memAddress(src_rgba_four_bytes_per_pixel), alpha ? 1 : 0, mode); + } + + // --- [ stb_compress_bc4_block ] --- + + /** Unsafe version of: {@link #stb_compress_bc4_block compress_bc4_block} */ + public static native void nstb_compress_bc4_block(long dest, long src_r_one_byte_per_pixel); + + /** + * Call this function for every block (you must pad). The source should be a 4x4 block of A data in row-major order. + * + * @param dest a buffer in which to store the compressed block + * @param src_r_one_byte_per_pixel the block to compress + */ + public static void stb_compress_bc4_block(@NativeType("unsigned char *") ByteBuffer dest, @NativeType("unsigned char const *") ByteBuffer src_r_one_byte_per_pixel) { + if (CHECKS) { + check(dest, 8); + check(src_r_one_byte_per_pixel, 16); + } + nstb_compress_bc4_block(memAddress(dest), memAddress(src_r_one_byte_per_pixel)); + } + + // --- [ stb_compress_bc5_block ] --- + + /** Unsafe version of: {@link #stb_compress_bc5_block compress_bc5_block} */ + public static native void nstb_compress_bc5_block(long dest, long src_rg_two_byte_per_pixel); + + /** + * Call this function for every block (you must pad). The source should be a 4x4 block of RG data in row-major order. + * + * @param dest a buffer in which to store the compressed block + * @param src_rg_two_byte_per_pixel the block to compress + */ + public static void stb_compress_bc5_block(@NativeType("unsigned char *") ByteBuffer dest, @NativeType("unsigned char const *") ByteBuffer src_rg_two_byte_per_pixel) { + if (CHECKS) { + check(dest, 16); + check(src_rg_two_byte_per_pixel, 32); + } + nstb_compress_bc5_block(memAddress(dest), memAddress(src_rg_two_byte_per_pixel)); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBEasyFont.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBEasyFont.java new file mode 100644 index 000000000..c0c4e2400 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBEasyFont.java @@ -0,0 +1,241 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to stb_easy_font.h from the stb library. + * + *

    Bitmap font for use in 3D APIs:

    + * + *
      + *
    • Easy-to-deploy
    • + *
    • reasonably compact
    • + *
    • extremely inefficient performance-wise
    • + *
    • crappy-looking
    • + *
    • ASCII-only
    • + *
    + * + *

    Intended for when you just want to get some text displaying in a 3D app as quickly as possible.

    + * + *

    Doesn't use any textures, instead builds characters out of quads.

    + * + *

    SAMPLE CODE

    + * + *

    Here's sample code for old OpenGL; it's a lot more complicated to make work on modern APIs, and that's your problem.

    + * + *
    
    + * void print_string(float x, float y, char *text, float r, float g, float b)
    + * {
    + *     static char buffer[99999]; // ~500 chars
    + *     int num_quads;
    + * 
    + *     num_quads = stb_easy_font_print(x, y, text, NULL, buffer, sizeof(buffer));
    + * 
    + *     glColor3f(r,g,b);
    + *     glEnableClientState(GL_VERTEX_ARRAY);
    + *     glVertexPointer(2, GL_FLOAT, 16, buffer);
    + *     glDrawArrays(GL_QUADS, 0, num_quads*4);
    + *     glDisableClientState(GL_VERTEX_ARRAY);
    + * }
    + */ +public class STBEasyFont { + + static { LibSTB.initialize(); } + + protected STBEasyFont() { + throw new UnsupportedOperationException(); + } + + // --- [ stb_easy_font_width ] --- + + /** Unsafe version of: {@link #stb_easy_font_width easy_font_width} */ + public static native int nstb_easy_font_width(long text); + + /** + * Takes a string and returns the horizontal size. + * + * @param text an ASCII string + * + * @return the horizontal size, in pixels + */ + public static int stb_easy_font_width(@NativeType("char *") ByteBuffer text) { + if (CHECKS) { + checkNT1(text); + } + return nstb_easy_font_width(memAddress(text)); + } + + /** + * Takes a string and returns the horizontal size. + * + * @param text an ASCII string + * + * @return the horizontal size, in pixels + */ + public static int stb_easy_font_width(@NativeType("char *") CharSequence text) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(text, true); + long textEncoded = stack.getPointerAddress(); + return nstb_easy_font_width(textEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stb_easy_font_height ] --- + + /** Unsafe version of: {@link #stb_easy_font_height easy_font_height} */ + public static native int nstb_easy_font_height(long text); + + /** + * Takes a string and returns the vertical size (which can vary if {@code text} has newlines). + * + * @param text an ASCII string + * + * @return the vertical size, in pixels + */ + public static int stb_easy_font_height(@NativeType("char *") ByteBuffer text) { + if (CHECKS) { + checkNT1(text); + } + return nstb_easy_font_height(memAddress(text)); + } + + /** + * Takes a string and returns the vertical size (which can vary if {@code text} has newlines). + * + * @param text an ASCII string + * + * @return the vertical size, in pixels + */ + public static int stb_easy_font_height(@NativeType("char *") CharSequence text) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(text, true); + long textEncoded = stack.getPointerAddress(); + return nstb_easy_font_height(textEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stb_easy_font_print ] --- + + /** + * Unsafe version of: {@link #stb_easy_font_print easy_font_print} + * + * @param vbuf_size the {@code vertex_buffer} size, in bytes + */ + public static native int nstb_easy_font_print(float x, float y, long text, long color, long vertex_buffer, int vbuf_size); + + /** + * Takes a string (which can contain '\n') and fills out a vertex buffer with renderable data to draw the string. Output data assumes increasing x is + * rightwards, increasing y is downwards. + * + *

    The vertex data is divided into quads, i.e. there are four vertices in the vertex buffer for each quad.

    + * + *

    The vertices are stored in an interleaved format:

    + * + *
    
    +     * x:float
    +     * y:float
    +     * z:float
    +     * color:uint8[4]
    + * + *

    You can ignore z and color if you get them from elsewhere. This format was chosen in the hopes it would make it easier for you to reuse existing + * buffer-drawing code.

    + * + *

    If you pass in {@code NULL} for color, it becomes {@code 255,255,255,255}.

    + * + *

    If the buffer isn't large enough, it will truncate. Expect it to use an average of ~270 bytes per character.

    + * + *

    If your API doesn't draw quads, build a reusable index list that allows you to render quads as indexed triangles.

    + * + * @param x the x offset + * @param y the y offset + * @param text an ASCII string + * @param color the text color, in RGBA (4 bytes) + * @param vertex_buffer a pointer to memory in which to store the vertex data + * + * @return the number of quads + */ + public static int stb_easy_font_print(float x, float y, @NativeType("char *") ByteBuffer text, @Nullable @NativeType("unsigned char *") ByteBuffer color, @NativeType("void *") ByteBuffer vertex_buffer) { + if (CHECKS) { + checkNT1(text); + checkSafe(color, 4); + } + return nstb_easy_font_print(x, y, memAddress(text), memAddressSafe(color), memAddress(vertex_buffer), vertex_buffer.remaining()); + } + + /** + * Takes a string (which can contain '\n') and fills out a vertex buffer with renderable data to draw the string. Output data assumes increasing x is + * rightwards, increasing y is downwards. + * + *

    The vertex data is divided into quads, i.e. there are four vertices in the vertex buffer for each quad.

    + * + *

    The vertices are stored in an interleaved format:

    + * + *
    
    +     * x:float
    +     * y:float
    +     * z:float
    +     * color:uint8[4]
    + * + *

    You can ignore z and color if you get them from elsewhere. This format was chosen in the hopes it would make it easier for you to reuse existing + * buffer-drawing code.

    + * + *

    If you pass in {@code NULL} for color, it becomes {@code 255,255,255,255}.

    + * + *

    If the buffer isn't large enough, it will truncate. Expect it to use an average of ~270 bytes per character.

    + * + *

    If your API doesn't draw quads, build a reusable index list that allows you to render quads as indexed triangles.

    + * + * @param x the x offset + * @param y the y offset + * @param text an ASCII string + * @param color the text color, in RGBA (4 bytes) + * @param vertex_buffer a pointer to memory in which to store the vertex data + * + * @return the number of quads + */ + public static int stb_easy_font_print(float x, float y, @NativeType("char *") CharSequence text, @Nullable @NativeType("unsigned char *") ByteBuffer color, @NativeType("void *") ByteBuffer vertex_buffer) { + if (CHECKS) { + checkSafe(color, 4); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(text, true); + long textEncoded = stack.getPointerAddress(); + return nstb_easy_font_print(x, y, textEncoded, memAddressSafe(color), memAddress(vertex_buffer), vertex_buffer.remaining()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stb_easy_font_spacing ] --- + + /** + * Use positive values to expand the space between characters, and small negative values (no smaller than {@code -1.5}) to contract the space between characters. + * + *

    E.g. {@code spacing = 1} adds one "pixel" of spacing between the characters. {@code spacing = -1} is reasonable but feels a bit too compact to me; + * {@code -0.5} is a reasonable compromise as long as you're scaling the font up.

    + * + * @param spacing the font spacing + */ + public static native void stb_easy_font_spacing(float spacing); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIEOFCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIEOFCallback.java new file mode 100644 index 000000000..d5fd61f1e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIEOFCallback.java @@ -0,0 +1,75 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be set to the {@code eof} field of the {@link STBIIOCallbacks} struct. + * + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     void *user
    + * )
    + */ +public abstract class STBIEOFCallback extends Callback implements STBIEOFCallbackI { + + /** + * Creates a {@code STBIEOFCallback} instance from the specified function pointer. + * + * @return the new {@code STBIEOFCallback} + */ + public static STBIEOFCallback create(long functionPointer) { + STBIEOFCallbackI instance = Callback.get(functionPointer); + return instance instanceof STBIEOFCallback + ? (STBIEOFCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static STBIEOFCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code STBIEOFCallback} instance that delegates to the specified {@code STBIEOFCallbackI} instance. */ + public static STBIEOFCallback create(STBIEOFCallbackI instance) { + return instance instanceof STBIEOFCallback + ? (STBIEOFCallback)instance + : new Container(instance.address(), instance); + } + + protected STBIEOFCallback() { + super(CIF); + } + + STBIEOFCallback(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends STBIEOFCallback { + + private final STBIEOFCallbackI delegate; + + Container(long functionPointer, STBIEOFCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long user) { + return delegate.invoke(user); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIEOFCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIEOFCallbackI.java new file mode 100644 index 000000000..3092afebd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIEOFCallbackI.java @@ -0,0 +1,55 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to the {@code eof} field of the {@link STBIIOCallbacks} struct. + * + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     void *user
    + * )
    + */ +@FunctionalInterface +@NativeType("int (*) (void *)") +public interface STBIEOFCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)) + ); + apiClosureRet(ret, __result); + } + + /** + * The {@code stbi_io_callbacks.eof} callback. + * + * @param user a pointer to user data + * + * @return nonzero if we are at the end of file/data + */ + int invoke(@NativeType("void *") long user); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIIOCallbacks.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIIOCallbacks.java new file mode 100644 index 000000000..2c228bebf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIIOCallbacks.java @@ -0,0 +1,339 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Image IO callbacks, used by {@link STBImage#stbi_load_from_callbacks load_from_callbacks}. + * + *

    Layout

    + * + *
    
    + * struct stbi_io_callbacks {
    + *     int (*{@link STBIReadCallbackI read}) (void *user, char *data, int size);
    + *     void (*{@link STBISkipCallbackI skip}) (void *user, int n);
    + *     int (*{@link STBIEOFCallbackI eof}) (void *user);
    + * }
    + */ +@NativeType("struct stbi_io_callbacks") +public class STBIIOCallbacks extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + READ, + SKIP, + EOF; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + READ = layout.offsetof(0); + SKIP = layout.offsetof(1); + EOF = layout.offsetof(2); + } + + protected STBIIOCallbacks(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBIIOCallbacks create(long address, @Nullable ByteBuffer container) { + return new STBIIOCallbacks(address, container); + } + + /** + * Creates a {@code STBIIOCallbacks} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBIIOCallbacks(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** fill {@code data} with {@code size} bytes. Return number of bytes actually read. */ + @NativeType("int (*) (void *, char *, int)") + public STBIReadCallback read() { return nread(address()); } + /** skip the next {@code n} bytes, or {@code unget} the last -n bytes if negative */ + @NativeType("void (*) (void *, int)") + public STBISkipCallback skip() { return nskip(address()); } + /** returns nonzero if we are at end of file/data */ + @NativeType("int (*) (void *)") + public STBIEOFCallback eof() { return neof(address()); } + + /** Sets the specified value to the {@link #read} field. */ + public STBIIOCallbacks read(@NativeType("int (*) (void *, char *, int)") STBIReadCallbackI value) { nread(address(), value); return this; } + /** Sets the specified value to the {@link #skip} field. */ + public STBIIOCallbacks skip(@NativeType("void (*) (void *, int)") STBISkipCallbackI value) { nskip(address(), value); return this; } + /** Sets the specified value to the {@link #eof} field. */ + public STBIIOCallbacks eof(@NativeType("int (*) (void *)") STBIEOFCallbackI value) { neof(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public STBIIOCallbacks set( + STBIReadCallbackI read, + STBISkipCallbackI skip, + STBIEOFCallbackI eof + ) { + read(read); + skip(skip); + eof(eof); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public STBIIOCallbacks set(STBIIOCallbacks src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code STBIIOCallbacks} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBIIOCallbacks malloc() { + return new STBIIOCallbacks(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBIIOCallbacks} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBIIOCallbacks calloc() { + return new STBIIOCallbacks(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBIIOCallbacks} instance allocated with {@link BufferUtils}. */ + public static STBIIOCallbacks create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBIIOCallbacks(memAddress(container), container); + } + + /** Returns a new {@code STBIIOCallbacks} instance for the specified memory address. */ + public static STBIIOCallbacks create(long address) { + return new STBIIOCallbacks(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBIIOCallbacks createSafe(long address) { + return address == NULL ? null : new STBIIOCallbacks(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBIIOCallbacks mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBIIOCallbacks callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBIIOCallbacks mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBIIOCallbacks callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBIIOCallbacks} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBIIOCallbacks malloc(MemoryStack stack) { + return new STBIIOCallbacks(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBIIOCallbacks} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBIIOCallbacks calloc(MemoryStack stack) { + return new STBIIOCallbacks(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #read}. */ + public static STBIReadCallback nread(long struct) { return STBIReadCallback.create(memGetAddress(struct + STBIIOCallbacks.READ)); } + /** Unsafe version of {@link #skip}. */ + public static STBISkipCallback nskip(long struct) { return STBISkipCallback.create(memGetAddress(struct + STBIIOCallbacks.SKIP)); } + /** Unsafe version of {@link #eof}. */ + public static STBIEOFCallback neof(long struct) { return STBIEOFCallback.create(memGetAddress(struct + STBIIOCallbacks.EOF)); } + + /** Unsafe version of {@link #read(STBIReadCallbackI) read}. */ + public static void nread(long struct, STBIReadCallbackI value) { memPutAddress(struct + STBIIOCallbacks.READ, value.address()); } + /** Unsafe version of {@link #skip(STBISkipCallbackI) skip}. */ + public static void nskip(long struct, STBISkipCallbackI value) { memPutAddress(struct + STBIIOCallbacks.SKIP, value.address()); } + /** Unsafe version of {@link #eof(STBIEOFCallbackI) eof}. */ + public static void neof(long struct, STBIEOFCallbackI value) { memPutAddress(struct + STBIIOCallbacks.EOF, value.address()); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + STBIIOCallbacks.READ)); + check(memGetAddress(struct + STBIIOCallbacks.SKIP)); + check(memGetAddress(struct + STBIIOCallbacks.EOF)); + } + + // ----------------------------------- + + /** An array of {@link STBIIOCallbacks} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBIIOCallbacks ELEMENT_FACTORY = STBIIOCallbacks.create(-1L); + + /** + * Creates a new {@code STBIIOCallbacks.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBIIOCallbacks#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBIIOCallbacks getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link STBIIOCallbacks#read} field. */ + @NativeType("int (*) (void *, char *, int)") + public STBIReadCallback read() { return STBIIOCallbacks.nread(address()); } + /** @return the value of the {@link STBIIOCallbacks#skip} field. */ + @NativeType("void (*) (void *, int)") + public STBISkipCallback skip() { return STBIIOCallbacks.nskip(address()); } + /** @return the value of the {@link STBIIOCallbacks#eof} field. */ + @NativeType("int (*) (void *)") + public STBIEOFCallback eof() { return STBIIOCallbacks.neof(address()); } + + /** Sets the specified value to the {@link STBIIOCallbacks#read} field. */ + public Buffer read(@NativeType("int (*) (void *, char *, int)") STBIReadCallbackI value) { STBIIOCallbacks.nread(address(), value); return this; } + /** Sets the specified value to the {@link STBIIOCallbacks#skip} field. */ + public Buffer skip(@NativeType("void (*) (void *, int)") STBISkipCallbackI value) { STBIIOCallbacks.nskip(address(), value); return this; } + /** Sets the specified value to the {@link STBIIOCallbacks#eof} field. */ + public Buffer eof(@NativeType("int (*) (void *)") STBIEOFCallbackI value) { STBIIOCallbacks.neof(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIReadCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIReadCallback.java new file mode 100644 index 000000000..094e8e310 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIReadCallback.java @@ -0,0 +1,93 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import java.nio.*; + +/** + * Instances of this class may be set to the {@code read} field of the {@link STBIIOCallbacks} struct. + * + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     void *user,
    + *     char *data,
    + *     int size
    + * )
    + */ +public abstract class STBIReadCallback extends Callback implements STBIReadCallbackI { + + /** + * Creates a {@code STBIReadCallback} instance from the specified function pointer. + * + * @return the new {@code STBIReadCallback} + */ + public static STBIReadCallback create(long functionPointer) { + STBIReadCallbackI instance = Callback.get(functionPointer); + return instance instanceof STBIReadCallback + ? (STBIReadCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static STBIReadCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code STBIReadCallback} instance that delegates to the specified {@code STBIReadCallbackI} instance. */ + public static STBIReadCallback create(STBIReadCallbackI instance) { + return instance instanceof STBIReadCallback + ? (STBIReadCallback)instance + : new Container(instance.address(), instance); + } + + protected STBIReadCallback() { + super(CIF); + } + + STBIReadCallback(long functionPointer) { + super(functionPointer); + } + + /** + * Converts the specified {@link STBIReadCallback} arguments to a ByteBuffer. + * + *

    This method may only be used inside a STBIReadCallback invocation.

    + * + * @param data the STBIReadCallback {@code data} argument + * @param size the STBIReadCallback {@code size} argument + * + * @return the data as a ByteBuffer + */ + public static ByteBuffer getData(long data, int size) { + return memByteBuffer(data, size); + } + + private static final class Container extends STBIReadCallback { + + private final STBIReadCallbackI delegate; + + Container(long functionPointer, STBIReadCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long user, long data, int size) { + return delegate.invoke(user, data, size); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIReadCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIReadCallbackI.java new file mode 100644 index 000000000..e7bfa8494 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIReadCallbackI.java @@ -0,0 +1,61 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to the {@code read} field of the {@link STBIIOCallbacks} struct. + * + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     void *user,
    + *     char *data,
    + *     int size
    + * )
    + */ +@FunctionalInterface +@NativeType("int (*) (void *, char *, int)") +public interface STBIReadCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_pointer, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** + * The {@code stbi_io_callbacks.read} callback. + * + * @param user a pointer to user data + * @param data the data buffer to fill + * @param size the number of bytes to read + * + * @return the number of bytes actually read + */ + int invoke(@NativeType("void *") long user, @NativeType("char *") long data, int size); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBISkipCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBISkipCallback.java new file mode 100644 index 000000000..188fde430 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBISkipCallback.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be set to the {@code skip} field of the {@link STBIIOCallbacks} struct. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     void *user,
    + *     int n
    + * )
    + */ +public abstract class STBISkipCallback extends Callback implements STBISkipCallbackI { + + /** + * Creates a {@code STBISkipCallback} instance from the specified function pointer. + * + * @return the new {@code STBISkipCallback} + */ + public static STBISkipCallback create(long functionPointer) { + STBISkipCallbackI instance = Callback.get(functionPointer); + return instance instanceof STBISkipCallback + ? (STBISkipCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static STBISkipCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code STBISkipCallback} instance that delegates to the specified {@code STBISkipCallbackI} instance. */ + public static STBISkipCallback create(STBISkipCallbackI instance) { + return instance instanceof STBISkipCallback + ? (STBISkipCallback)instance + : new Container(instance.address(), instance); + } + + protected STBISkipCallback() { + super(CIF); + } + + STBISkipCallback(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends STBISkipCallback { + + private final STBISkipCallbackI delegate; + + Container(long functionPointer, STBISkipCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long user, int n) { + delegate.invoke(user, n); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBISkipCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBISkipCallbackI.java new file mode 100644 index 000000000..4bb5ebc94 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBISkipCallbackI.java @@ -0,0 +1,55 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to the {@code skip} field of the {@link STBIIOCallbacks} struct. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     void *user,
    + *     int n
    + * )
    + */ +@FunctionalInterface +@NativeType("void (*) (void *, int)") +public interface STBISkipCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)) + ); + } + + /** + * The {@code stbi_io_callbacks.skip} callback. + * + * @param user a pointer to user data + * @param n the number of bytes to skip if positive, or unget the last {@code -n} bytes if negative + */ + void invoke(@NativeType("void *") long user, int n); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIWriteCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIWriteCallback.java new file mode 100644 index 000000000..33c583bed --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIWriteCallback.java @@ -0,0 +1,93 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +import java.nio.*; + +/** + * Instances of this class may be used with the {@link STBImageWrite} {@code write_type_to_func} functions. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     void *context,
    + *     void *data,
    + *     int size
    + * )
    + */ +public abstract class STBIWriteCallback extends Callback implements STBIWriteCallbackI { + + /** + * Creates a {@code STBIWriteCallback} instance from the specified function pointer. + * + * @return the new {@code STBIWriteCallback} + */ + public static STBIWriteCallback create(long functionPointer) { + STBIWriteCallbackI instance = Callback.get(functionPointer); + return instance instanceof STBIWriteCallback + ? (STBIWriteCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static STBIWriteCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code STBIWriteCallback} instance that delegates to the specified {@code STBIWriteCallbackI} instance. */ + public static STBIWriteCallback create(STBIWriteCallbackI instance) { + return instance instanceof STBIWriteCallback + ? (STBIWriteCallback)instance + : new Container(instance.address(), instance); + } + + protected STBIWriteCallback() { + super(CIF); + } + + STBIWriteCallback(long functionPointer) { + super(functionPointer); + } + + /** + * Converts the specified {@link STBIWriteCallback} arguments to a ByteBuffer. + * + *

    This method may only be used inside a STBIWriteCallback invocation.

    + * + * @param data the STBIWriteCallback {@code data} argument + * @param size the STBIWriteCallback {@code size} argument + * + * @return the data as a ByteBuffer + */ + public static ByteBuffer getData(long data, int size) { + return memByteBuffer(data, size); + } + + private static final class Container extends STBIWriteCallback { + + private final STBIWriteCallbackI delegate; + + Container(long functionPointer, STBIWriteCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long context, long data, int size) { + delegate.invoke(context, data, size); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIWriteCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIWriteCallbackI.java new file mode 100644 index 000000000..ac8048e2b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIWriteCallbackI.java @@ -0,0 +1,58 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be used with the {@link STBImageWrite} {@code write_type_to_func} functions. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     void *context,
    + *     void *data,
    + *     int size
    + * )
    + */ +@FunctionalInterface +@NativeType("stbi_write_func *") +public interface STBIWriteCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_pointer, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetInt(memGetAddress(args + 2 * POINTER_SIZE)) + ); + } + + /** + * The {@code stbi_write_func} callback. + * + * @param context the context passed to the write function + * @param data the data to write + * @param size the number of bytes in {@code data} + */ + void invoke(@NativeType("void *") long context, @NativeType("void *") long data, int size); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIZlibCompress.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIZlibCompress.java new file mode 100644 index 000000000..11589c6cc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIZlibCompress.java @@ -0,0 +1,78 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be set to {@link STBImageWrite#stbi_zlib_compress}. + * + *

    Type

    + * + *
    
    + * unsigned char * (*{@link #invoke}) (
    + *     unsigned char *data,
    + *     int data_len,
    + *     int *out_len,
    + *     int quality
    + * )
    + */ +public abstract class STBIZlibCompress extends Callback implements STBIZlibCompressI { + + /** + * Creates a {@code STBIZlibCompress} instance from the specified function pointer. + * + * @return the new {@code STBIZlibCompress} + */ + public static STBIZlibCompress create(long functionPointer) { + STBIZlibCompressI instance = Callback.get(functionPointer); + return instance instanceof STBIZlibCompress + ? (STBIZlibCompress)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static STBIZlibCompress createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code STBIZlibCompress} instance that delegates to the specified {@code STBIZlibCompressI} instance. */ + public static STBIZlibCompress create(STBIZlibCompressI instance) { + return instance instanceof STBIZlibCompress + ? (STBIZlibCompress)instance + : new Container(instance.address(), instance); + } + + protected STBIZlibCompress() { + super(CIF); + } + + STBIZlibCompress(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends STBIZlibCompress { + + private final STBIZlibCompressI delegate; + + Container(long functionPointer, STBIZlibCompressI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public long invoke(long data, int data_len, long out_len, int quality) { + return delegate.invoke(data, data_len, out_len, quality); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIZlibCompressI.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIZlibCompressI.java new file mode 100644 index 000000000..b3488432f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBIZlibCompressI.java @@ -0,0 +1,66 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to {@link STBImageWrite#stbi_zlib_compress}. + * + *

    Type

    + * + *
    
    + * unsigned char * (*{@link #invoke}) (
    + *     unsigned char *data,
    + *     int data_len,
    + *     int *out_len,
    + *     int quality
    + * )
    + */ +@FunctionalInterface +@NativeType("unsigned char * (*) (unsigned char *, int, int *, int)") +public interface STBIZlibCompressI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_pointer, + ffi_type_pointer, ffi_type_sint32, ffi_type_pointer, ffi_type_sint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + long __result = invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 3 * POINTER_SIZE)) + ); + apiClosureRetP(ret, __result); + } + + /** + * Compresses a block of data using Zlib compression. + * + *

    The returned data will be freed with {@link MemoryUtil#memFree} so it must be heap allocated with {@link MemoryUtil#memAlloc}.

    + * + * @param data the data to compress + * @param data_len the data length, in bytes + * @param out_len returns the compressed data length, in bytes + * @param quality the compression quality to use + * + * @return the compressed data + */ + @NativeType("unsigned char *") long invoke(@NativeType("unsigned char *") long data, int data_len, @NativeType("int *") long out_len, int quality); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImage.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImage.java new file mode 100644 index 000000000..1ea0ee4a4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImage.java @@ -0,0 +1,1389 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to stb_image.h from the stb library. + * + *

    Quick notes

    + * + *

    Primarily of interest to game developers and other people who can avoid problematic images and only need the trivial interface. Supported formats:

    + * + *
      + *
    • JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib
    • + *
    • PNG 1/2/4/8/16-bit-per-channel
    • + *
    • TGA (not sure what subset, if a subset)
    • + *
    • BMP non-1bpp, non-RLE
    • + *
    • PSD (composited view only, no extra channels, 8/16 bit-per-channel)
    • + *
    • GIF (*desired_channels always reports as 4-channel)
    • + *
    • HDR (radiance rgbE format)
    • + *
    • PIC (Softimage PIC)
    • + *
    • PNM (PPM and PGM binary only)
    • + *
    + * + *

    Animated GIF still needs a proper API, but here's one way to do it.

    + * + *

    Features:

    + * + *
      + *
    • decode from memory
    • + *
    • decode from arbitrary I/O callbacks
    • + *
    • SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)
    • + *
    + * + *

    Limitations:

    + * + *
      + *
    • no 12-bit-per-channel JPEG
    • + *
    • no JPEGs with arithmetic coding
    • + *
    • GIF always returns *channels_in_file=4
    • + *
    + * + *

    Basic usage (see HDR discussion below for HDR usage):

    + * + *
    
    + * int x,y,n;
    + * unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
    + * // ... process data if not NULL ...
    + * // ... x = width, y = height, n = # 8-bit components per pixel ...
    + * // ... replace '0' with '1'..'4' to force that many components per pixel
    + * // ... but 'n' will always be the number that it would have been if you said 0
    + * stbi_image_free(data)
    + * + *

    HDR image support

    + * + *

    stb_image supports loading HDR images in general, and currently the Radiance .HDR file format specifically. You can still load any file through the + * existing interface; if you attempt to load an HDR file, it will be automatically remapped to LDR, assuming gamma 2.2 and an arbitrary scale factor + * defaulting to 1; both of these constants can be reconfigured through this interface:

    + * + *
    
    + * stbi_hdr_to_ldr_gamma(2.2f);
    + * stbi_hdr_to_ldr_scale(1.0f);
    + * + *

    (note, do not use inverse constants; stbi_image will invert them appropriately).

    + * + *

    Additionally, there is a new, parallel interface for loading files as (linear) floats to preserve the full dynamic range:

    + * + *
    
    + * float *data = stbi_loadf(filename, &x, &y, &n, 0);
    + * + *

    If you load LDR images through this interface, those images will be promoted to floating point values, run through the inverse of constants + * corresponding to the above:

    + * + *
    
    + * stbi_ldr_to_hdr_scale(1.0f);
    + * stbi_ldr_to_hdr_gamma(2.2f);
    + * + *

    Finally, given a filename (or an open file or memory block) containing image data, you can query for the "most appropriate" interface to use (that is, + * whether the image is HDR or not), using:

    + * + *
    
    + * stbi_is_hdr(char *filename);
    + * + *

    iPhone PNG support

    + * + *

    We optionally support converting iPhone-formatted PNGs (which store premultiplied BGRA) back to RGB, even though they're internally encoded + * differently. To enable this conversion, call {@link #stbi_convert_iphone_png_to_rgb convert_iphone_png_to_rgb}(1).

    + * + *

    Call {@link #stbi_set_unpremultiply_on_load set_unpremultiply_on_load}(1) as well to force a divide per pixel to remove any premultiplied alpha *only* if the image file explicitly says + * there's premultiplied data (currently only happens in iPhone images, and only if iPhone convert-to-rgb processing is on).

    + */ +public class STBImage { + + static { LibSTB.initialize(); } + + /** + * Component count. + * + *
    Enum values:
    + * + *
      + *
    • {@link #STBI_default default} - Default component count, used as an argument to {@code desired_channels}.
    • + *
    • {@link #STBI_grey grey}
    • + *
    • {@link #STBI_grey_alpha grey_alpha}
    • + *
    • {@link #STBI_rgb rgb}
    • + *
    • {@link #STBI_rgb_alpha rgb_alpha}
    • + *
    + */ + public static final int + STBI_default = 0, + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4; + + protected STBImage() { + throw new UnsupportedOperationException(); + } + + // --- [ stbi_load ] --- + + /** Unsafe version of: {@link #stbi_load load} */ + public static native long nstbi_load(long filename, long x, long y, long channels_in_file, int desired_channels); + + /** + * Loads an image from the specified file. + * + *

    The return value from an image loader is an {@code 'unsigned char *'} which points to the pixel data, or {@code NULL} on an allocation failure or if the image + * is corrupt or invalid. The pixel data consists of {@code *y} scanlines of {@code *x} pixels, with each pixel consisting of N interleaved 8-bit + * components; the first pixel pointed to is top-left-most in the image. There is no padding between image scanlines or between pixels, regardless of + * format. The number of components N is {@code 'desired_channels'} if {@code desired_channels} is non-zero, or {@code *channels_in_file} otherwise. If + * {@code desired_channels} is non-zero, {@code *channels_in_file} has the number of components that would have been output otherwise. E.g. if you + * set {@code desired_channels} to 4, you will always get RGBA output, but you can check {@code *channels_in_file} to see if it's trivially opaque because + * e.g. there were only 3 channels in the source image.

    + * + *

    An output image with N components has the following components interleaved in this order in each pixel:

    + * + *
    
    +     * N=#channels_in_file     components
    +     *   1                     grey
    +     *   2                     grey, alpha
    +     *   3                     red, green, blue
    +     *   4                     red, green, blue, alpha
    + * + *

    If image loading fails for any reason, the return value will be {@code NULL}, and {@code *x}, {@code *y}, {@code *channels_in_file} will be unchanged. The + * function {@link #stbi_failure_reason failure_reason} can be queried for an extremely brief, end-user unfriendly explanation of why the load failed.

    + * + *

    Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.

    + * + *

    To query the width, height and component count of an image without having to decode the full file, you can use the {@code stbi_info} family of + * functions:

    + * + *
    
    +     * int x,y,n,ok;
    +     * ok = stbi_info(filename, &x, &y, &n);
    +     * // returns ok=1 and sets x, y, n if image is a supported format,
    +     * // 0 otherwise.
    + * + *

    Note that stb_image pervasively uses {@code ints} in its public API for sizes, including sizes of memory buffers. This is now part of the API and thus + * hard to change without causing breakage. As a result, the various image loaders all have certain limits on image size; these differ somewhat by format + * but generally boil down to either just under 2GB or just under 1GB. When the decoded image would be larger than this, stb_image decoding will fail.

    + * + *

    Additionally, stb_image will reject image files that have any of their dimensions set to a larger value than the configurable + * {@code STBI_MAX_DIMENSIONS}, which defaults to {@code 2**24 = 16777216} pixels. Due to the above memory limit, the only way to have an image with such + * dimensions load correctly is for it to have a rather extreme aspect ratio. Either way, the assumption here is that such larger images are likely to be + * malformed or malicious. If you do need to load an image with individual dimensions larger than that, and it still fits in the overall size limit, you + * can {@code #define STBI_MAX_DIMENSIONS} on your own to be something larger.

    + * + * @param filename the file name + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("stbi_uc *") + public static ByteBuffer stbi_load(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + checkNT1(filename); + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_load(memAddress(filename), memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memByteBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } + + /** + * Loads an image from the specified file. + * + *

    The return value from an image loader is an {@code 'unsigned char *'} which points to the pixel data, or {@code NULL} on an allocation failure or if the image + * is corrupt or invalid. The pixel data consists of {@code *y} scanlines of {@code *x} pixels, with each pixel consisting of N interleaved 8-bit + * components; the first pixel pointed to is top-left-most in the image. There is no padding between image scanlines or between pixels, regardless of + * format. The number of components N is {@code 'desired_channels'} if {@code desired_channels} is non-zero, or {@code *channels_in_file} otherwise. If + * {@code desired_channels} is non-zero, {@code *channels_in_file} has the number of components that would have been output otherwise. E.g. if you + * set {@code desired_channels} to 4, you will always get RGBA output, but you can check {@code *channels_in_file} to see if it's trivially opaque because + * e.g. there were only 3 channels in the source image.

    + * + *

    An output image with N components has the following components interleaved in this order in each pixel:

    + * + *
    
    +     * N=#channels_in_file     components
    +     *   1                     grey
    +     *   2                     grey, alpha
    +     *   3                     red, green, blue
    +     *   4                     red, green, blue, alpha
    + * + *

    If image loading fails for any reason, the return value will be {@code NULL}, and {@code *x}, {@code *y}, {@code *channels_in_file} will be unchanged. The + * function {@link #stbi_failure_reason failure_reason} can be queried for an extremely brief, end-user unfriendly explanation of why the load failed.

    + * + *

    Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.

    + * + *

    To query the width, height and component count of an image without having to decode the full file, you can use the {@code stbi_info} family of + * functions:

    + * + *
    
    +     * int x,y,n,ok;
    +     * ok = stbi_info(filename, &x, &y, &n);
    +     * // returns ok=1 and sets x, y, n if image is a supported format,
    +     * // 0 otherwise.
    + * + *

    Note that stb_image pervasively uses {@code ints} in its public API for sizes, including sizes of memory buffers. This is now part of the API and thus + * hard to change without causing breakage. As a result, the various image loaders all have certain limits on image size; these differ somewhat by format + * but generally boil down to either just under 2GB or just under 1GB. When the decoded image would be larger than this, stb_image decoding will fail.

    + * + *

    Additionally, stb_image will reject image files that have any of their dimensions set to a larger value than the configurable + * {@code STBI_MAX_DIMENSIONS}, which defaults to {@code 2**24 = 16777216} pixels. Due to the above memory limit, the only way to have an image with such + * dimensions load correctly is for it to have a rather extreme aspect ratio. Either way, the assumption here is that such larger images are likely to be + * malformed or malicious. If you do need to load an image with individual dimensions larger than that, and it still fits in the overall size limit, you + * can {@code #define STBI_MAX_DIMENSIONS} on your own to be something larger.

    + * + * @param filename the file name + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("stbi_uc *") + public static ByteBuffer stbi_load(@NativeType("char const *") CharSequence filename, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + long __result = nstbi_load(filenameEncoded, memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memByteBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_load_from_memory ] --- + + /** + * Unsafe version of: {@link #stbi_load_from_memory load_from_memory} + * + * @param len the buffer length, in bytes + */ + public static native long nstbi_load_from_memory(long buffer, int len, long x, long y, long channels_in_file, int desired_channels); + + /** + * In-memory version of {@link #stbi_load load}. + * + * @param buffer the buffer from which to load the image data + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("stbi_uc *") + public static ByteBuffer stbi_load_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_load_from_memory(memAddress(buffer), buffer.remaining(), memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memByteBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } + + // --- [ stbi_load_from_callbacks ] --- + + /** Unsafe version of: {@link #stbi_load_from_callbacks load_from_callbacks} */ + public static native long nstbi_load_from_callbacks(long clbk, long user, long x, long y, long channels_in_file, int desired_channels); + + /** + * Callback version of {@link #stbi_load load}. + * + *

    I/O callbacks allow you to read from arbitrary sources, like packaged files or some other source. Data read from callbacks are processed through a + * small internal buffer (currently 128 bytes) to try to reduce overhead.

    + * + *

    The three functions you must define are "read" (reads some bytes of data), "skip" (skips some bytes of data), "eof" (reports if the stream is at the + * end).

    + * + * @param clbk an {@link STBIIOCallbacks} struct + * @param user a pointer to user data + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("stbi_uc *") + public static ByteBuffer stbi_load_from_callbacks(@NativeType("stbi_io_callbacks const *") STBIIOCallbacks clbk, @NativeType("void *") long user, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + STBIIOCallbacks.validate(clbk.address()); + } + long __result = nstbi_load_from_callbacks(clbk.address(), user, memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memByteBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } + + // --- [ stbi_load_gif_from_memory ] --- + + /** + * Unsafe version of: {@link #stbi_load_gif_from_memory load_gif_from_memory} + * + * @param len the buffer length, in bytes + */ + public static native long nstbi_load_gif_from_memory(long buffer, int len, long delays, long x, long y, long z, long channels_in_file, int desired_channels); + + /** + * gif version of {@link #stbi_load_from_memory load_from_memory}. + * + * @param buffer the buffer from which to load the image data + * @param delays output the delays of each layer in the image + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param z outputs the number of layers in the image + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("stbi_uc *") + public static ByteBuffer stbi_load_gif_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer, @NativeType("int **") PointerBuffer delays, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer z, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + check(delays, 1); + check(x, 1); + check(y, 1); + check(z, 1); + check(channels_in_file, 1); + } + long __result = nstbi_load_gif_from_memory(memAddress(buffer), buffer.remaining(), memAddress(delays), memAddress(x), memAddress(y), memAddress(z), memAddress(channels_in_file), desired_channels); + return memByteBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * z.get(z.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } + + // --- [ stbi_load_16 ] --- + + /** Unsafe version of: {@link #stbi_load_16 load_16} */ + public static native long nstbi_load_16(long filename, long x, long y, long channels_in_file, int desired_channels); + + /** + * 16-bits-per-channel version of {@link #stbi_load load}. + * + * @param filename the file name + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("stbi_us *") + public static ShortBuffer stbi_load_16(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + checkNT1(filename); + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_load_16(memAddress(filename), memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memShortBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } + + /** + * 16-bits-per-channel version of {@link #stbi_load load}. + * + * @param filename the file name + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("stbi_us *") + public static ShortBuffer stbi_load_16(@NativeType("char const *") CharSequence filename, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + long __result = nstbi_load_16(filenameEncoded, memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memShortBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_load_16_from_memory ] --- + + /** + * Unsafe version of: {@link #stbi_load_16_from_memory load_16_from_memory} + * + * @param len the buffer length, in bytes + */ + public static native long nstbi_load_16_from_memory(long buffer, int len, long x, long y, long channels_in_file, int desired_channels); + + /** + * In-memory version of {@link #stbi_load_16 load_16}. + * + * @param buffer the buffer from which to load the image data + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("stbi_us *") + public static ShortBuffer stbi_load_16_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_load_16_from_memory(memAddress(buffer), buffer.remaining(), memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memShortBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } + + // --- [ stbi_load_16_from_callbacks ] --- + + /** Unsafe version of: {@link #stbi_load_16_from_callbacks load_16_from_callbacks} */ + public static native long nstbi_load_16_from_callbacks(long clbk, long user, long x, long y, long channels_in_file, int desired_channels); + + /** + * Callback version of {@link #stbi_load_16 load_16}. + * + * @param clbk an {@link STBIIOCallbacks} struct + * @param user a pointer to user data + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("stbi_us *") + public static ShortBuffer stbi_load_16_from_callbacks(@NativeType("stbi_io_callbacks const *") STBIIOCallbacks clbk, @NativeType("void *") long user, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + STBIIOCallbacks.validate(clbk.address()); + } + long __result = nstbi_load_16_from_callbacks(clbk.address(), user, memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memShortBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } + + // --- [ stbi_loadf ] --- + + /** Unsafe version of: {@link #stbi_loadf loadf} */ + public static native long nstbi_loadf(long filename, long x, long y, long channels_in_file, int desired_channels); + + /** + * Floating-point version of {@link #stbi_load load}. + * + * @param filename the file name + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("float *") + public static FloatBuffer stbi_loadf(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + checkNT1(filename); + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_loadf(memAddress(filename), memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memFloatBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } + + /** + * Floating-point version of {@link #stbi_load load}. + * + * @param filename the file name + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("float *") + public static FloatBuffer stbi_loadf(@NativeType("char const *") CharSequence filename, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + long __result = nstbi_loadf(filenameEncoded, memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memFloatBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_loadf_from_memory ] --- + + /** + * Unsafe version of: {@link #stbi_loadf_from_memory loadf_from_memory} + * + * @param len the buffer length, in bytes + */ + public static native long nstbi_loadf_from_memory(long buffer, int len, long x, long y, long channels_in_file, int desired_channels); + + /** + * Floating-point version of {@link #stbi_load_from_memory load_from_memory}. + * + * @param buffer the buffer from which to load the image data + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("float *") + public static FloatBuffer stbi_loadf_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_loadf_from_memory(memAddress(buffer), buffer.remaining(), memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memFloatBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } + + // --- [ stbi_loadf_from_callbacks ] --- + + /** Unsafe version of: {@link #stbi_loadf_from_callbacks loadf_from_callbacks} */ + public static native long nstbi_loadf_from_callbacks(long clbk, long user, long x, long y, long channels_in_file, int desired_channels); + + /** + * Floating-point version of {@link #stbi_load_from_callbacks load_from_callbacks}. + * + * @param clbk an {@link STBIIOCallbacks} struct + * @param user a pointer to user data + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param channels_in_file outputs number of components in image + * @param desired_channels 0 or 1..4 to force that many components per pixel. One of:
    01234
    + */ + @Nullable + @NativeType("float *") + public static FloatBuffer stbi_loadf_from_callbacks(@NativeType("stbi_io_callbacks const *") STBIIOCallbacks clbk, @NativeType("void *") long user, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + STBIIOCallbacks.validate(clbk.address()); + } + long __result = nstbi_loadf_from_callbacks(clbk.address(), user, memAddress(x), memAddress(y), memAddress(channels_in_file), desired_channels); + return memFloatBufferSafe(__result, x.get(x.position()) * y.get(y.position()) * (desired_channels != 0 ? desired_channels : channels_in_file.get(channels_in_file.position()))); + } + + // --- [ stbi_hdr_to_ldr_gamma ] --- + + /** + * Changes the gamma value used when converting HDR images to LDR. The default value is 2.2f + * + * @param gamma the gamma value + */ + public static native void stbi_hdr_to_ldr_gamma(float gamma); + + // --- [ stbi_hdr_to_ldr_scale ] --- + + /** + * Changes the scale factor used when converting HDR images to LDR. The default value is 1.0f + * + * @param scale the scale factor + */ + public static native void stbi_hdr_to_ldr_scale(float scale); + + // --- [ stbi_ldr_to_hdr_gamma ] --- + + /** + * Changes the gamma value used when converting LDR images to HDR. The default value is 2.2f + * + * @param gamma the gamma value + */ + public static native void stbi_ldr_to_hdr_gamma(float gamma); + + // --- [ stbi_ldr_to_hdr_scale ] --- + + /** + * Changes the scale value used when converting LDR images to HDR. The default value is 1.0f + * + * @param scale the scale factor + */ + public static native void stbi_ldr_to_hdr_scale(float scale); + + // --- [ stbi_is_hdr ] --- + + /** Unsafe version of: {@link #stbi_is_hdr is_hdr} */ + public static native int nstbi_is_hdr(long filename); + + /** + * Checks if the specified file contains an HDR image. + * + * @param filename the file name + * + * @return 1 if the image is HDR, 0 otherwise + */ + @NativeType("int") + public static boolean stbi_is_hdr(@NativeType("char const *") ByteBuffer filename) { + if (CHECKS) { + checkNT1(filename); + } + return nstbi_is_hdr(memAddress(filename)) != 0; + } + + /** + * Checks if the specified file contains an HDR image. + * + * @param filename the file name + * + * @return 1 if the image is HDR, 0 otherwise + */ + @NativeType("int") + public static boolean stbi_is_hdr(@NativeType("char const *") CharSequence filename) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstbi_is_hdr(filenameEncoded) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_is_hdr_from_memory ] --- + + /** + * Unsafe version of: {@link #stbi_is_hdr_from_memory is_hdr_from_memory} + * + * @param len the buffer length, in bytes + */ + public static native int nstbi_is_hdr_from_memory(long buffer, int len); + + /** + * In-memory version of {@link #stbi_is_hdr is_hdr}. + * + * @param buffer the buffer from which to load the image data + */ + @NativeType("int") + public static boolean stbi_is_hdr_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer) { + return nstbi_is_hdr_from_memory(memAddress(buffer), buffer.remaining()) != 0; + } + + // --- [ stbi_is_hdr_from_callbacks ] --- + + /** Unsafe version of: {@link #stbi_is_hdr_from_callbacks is_hdr_from_callbacks} */ + public static native int nstbi_is_hdr_from_callbacks(long clbk, long user); + + /** + * Callback version of {@link #stbi_is_hdr is_hdr}. + * + * @param clbk an {@link STBIIOCallbacks} struct + * @param user a pointer to user data + */ + @NativeType("int") + public static boolean stbi_is_hdr_from_callbacks(@NativeType("stbi_io_callbacks const *") STBIIOCallbacks clbk, @NativeType("void *") long user) { + if (CHECKS) { + STBIIOCallbacks.validate(clbk.address()); + } + return nstbi_is_hdr_from_callbacks(clbk.address(), user) != 0; + } + + // --- [ stbi_failure_reason ] --- + + /** Unsafe version of: {@link #stbi_failure_reason failure_reason} */ + public static native long nstbi_failure_reason(); + + /** Returns a brief reason for failure. */ + @Nullable + @NativeType("char const *") + public static String stbi_failure_reason() { + long __result = nstbi_failure_reason(); + return memASCIISafe(__result); + } + + // --- [ stbi_image_free ] --- + + /** Unsafe version of: {@link #stbi_image_free image_free} */ + public static native void nstbi_image_free(long retval_from_stbi_load); + + /** + * Frees a loaded image + * + * @param retval_from_stbi_load an stb image + */ + public static void stbi_image_free(@NativeType("void *") ByteBuffer retval_from_stbi_load) { + nstbi_image_free(memAddress(retval_from_stbi_load)); + } + + /** + * Frees a loaded image + * + * @param retval_from_stbi_load an stb image + */ + public static void stbi_image_free(@NativeType("void *") ShortBuffer retval_from_stbi_load) { + nstbi_image_free(memAddress(retval_from_stbi_load)); + } + + /** + * Frees a loaded image + * + * @param retval_from_stbi_load an stb image + */ + public static void stbi_image_free(@NativeType("void *") FloatBuffer retval_from_stbi_load) { + nstbi_image_free(memAddress(retval_from_stbi_load)); + } + + // --- [ stbi_info ] --- + + /** Unsafe version of: {@link #stbi_info info} */ + public static native int nstbi_info(long filename, long x, long y, long comp); + + /** + * Returns image dimensions & components without fully decoding the image. + * + * @param filename the file name + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param comp outputs number of components in image + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_info(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer comp) { + if (CHECKS) { + checkNT1(filename); + check(x, 1); + check(y, 1); + check(comp, 1); + } + return nstbi_info(memAddress(filename), memAddress(x), memAddress(y), memAddress(comp)) != 0; + } + + /** + * Returns image dimensions & components without fully decoding the image. + * + * @param filename the file name + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param comp outputs number of components in image + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_info(@NativeType("char const *") CharSequence filename, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer comp) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(comp, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstbi_info(filenameEncoded, memAddress(x), memAddress(y), memAddress(comp)) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_info_from_memory ] --- + + /** + * Unsafe version of: {@link #stbi_info_from_memory info_from_memory} + * + * @param len the buffer length, in bytes + */ + public static native int nstbi_info_from_memory(long buffer, int len, long x, long y, long comp); + + /** + * In-memory version of {@link #stbi_info info}. + * + * @param buffer the buffer from which to load the image data + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param comp outputs number of components in image + */ + @NativeType("int") + public static boolean stbi_info_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer comp) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(comp, 1); + } + return nstbi_info_from_memory(memAddress(buffer), buffer.remaining(), memAddress(x), memAddress(y), memAddress(comp)) != 0; + } + + // --- [ stbi_info_from_callbacks ] --- + + /** Unsafe version of: {@link #stbi_info_from_callbacks info_from_callbacks} */ + public static native int nstbi_info_from_callbacks(long clbk, long user, long x, long y, long comp); + + /** + * Callback version of {@link #stbi_info info}. + * + * @param clbk an {@link STBIIOCallbacks} struct + * @param user a pointer to user data + * @param x outputs the image width in pixels + * @param y outputs the image height in pixels + * @param comp outputs number of components in image + */ + @NativeType("int") + public static boolean stbi_info_from_callbacks(@NativeType("stbi_io_callbacks const *") STBIIOCallbacks clbk, @NativeType("void *") long user, @NativeType("int *") IntBuffer x, @NativeType("int *") IntBuffer y, @NativeType("int *") IntBuffer comp) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(comp, 1); + STBIIOCallbacks.validate(clbk.address()); + } + return nstbi_info_from_callbacks(clbk.address(), user, memAddress(x), memAddress(y), memAddress(comp)) != 0; + } + + // --- [ stbi_is_16_bit ] --- + + /** Unsafe version of: {@link #stbi_is_16_bit is_16_bit} */ + public static native int nstbi_is_16_bit(long filename); + + /** + * Returns {@code true} if the file contains a 16-bit image. + * + * @param filename the file name + */ + @NativeType("int") + public static boolean stbi_is_16_bit(@NativeType("char const *") ByteBuffer filename) { + if (CHECKS) { + checkNT1(filename); + } + return nstbi_is_16_bit(memAddress(filename)) != 0; + } + + /** + * Returns {@code true} if the file contains a 16-bit image. + * + * @param filename the file name + */ + @NativeType("int") + public static boolean stbi_is_16_bit(@NativeType("char const *") CharSequence filename) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstbi_is_16_bit(filenameEncoded) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_is_16_bit_from_memory ] --- + + /** + * Unsafe version of: {@link #stbi_is_16_bit_from_memory is_16_bit_from_memory} + * + * @param len the buffer length, in bytes + */ + public static native int nstbi_is_16_bit_from_memory(long buffer, int len); + + /** + * In-memory version of {@link #stbi_is_16_bit is_16_bit}. + * + * @param buffer the buffer from which to load the image data + */ + @NativeType("int") + public static boolean stbi_is_16_bit_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer) { + return nstbi_is_16_bit_from_memory(memAddress(buffer), buffer.remaining()) != 0; + } + + // --- [ stbi_is_16_bit_from_callbacks ] --- + + /** Unsafe version of: {@link #stbi_is_16_bit_from_callbacks is_16_bit_from_callbacks} */ + public static native int nstbi_is_16_bit_from_callbacks(long clbk, long user); + + /** + * Callback version of {@link #stbi_is_16_bit is_16_bit}. + * + * @param clbk an {@link STBIIOCallbacks} struct + * @param user a pointer to user data + */ + @NativeType("int") + public static boolean stbi_is_16_bit_from_callbacks(@NativeType("stbi_io_callbacks const *") STBIIOCallbacks clbk, @NativeType("void *") long user) { + if (CHECKS) { + STBIIOCallbacks.validate(clbk.address()); + } + return nstbi_is_16_bit_from_callbacks(clbk.address(), user) != 0; + } + + // --- [ stbi_set_unpremultiply_on_load ] --- + + /** Unsafe version of: {@link #stbi_set_unpremultiply_on_load set_unpremultiply_on_load} */ + public static native void nstbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + + /** + * For image formats that explicitly notate that they have premultiplied alpha, we just return the colors as stored in the file. Set this flag to force + * unpremultiplication. Results are undefined if the unpremultiply overflows. + * + * @param flag_true_if_should_unpremultiply the unpremultiply flag + */ + public static void stbi_set_unpremultiply_on_load(@NativeType("int") boolean flag_true_if_should_unpremultiply) { + nstbi_set_unpremultiply_on_load(flag_true_if_should_unpremultiply ? 1 : 0); + } + + // --- [ stbi_convert_iphone_png_to_rgb ] --- + + /** Unsafe version of: {@link #stbi_convert_iphone_png_to_rgb convert_iphone_png_to_rgb} */ + public static native void nstbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + + /** + * Indicate whether we should process iPhone images back to canonical format, or just pass them through "as-is". + * + * @param flag_true_if_should_convert the convert iPhone PNG to RGB flag + */ + public static void stbi_convert_iphone_png_to_rgb(@NativeType("int") boolean flag_true_if_should_convert) { + nstbi_convert_iphone_png_to_rgb(flag_true_if_should_convert ? 1 : 0); + } + + // --- [ stbi_set_flip_vertically_on_load ] --- + + /** Unsafe version of: {@link #stbi_set_flip_vertically_on_load set_flip_vertically_on_load} */ + public static native void nstbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + + /** + * Flips the image vertically, so the first pixel in the output array is the bottom left. + * + * @param flag_true_if_should_flip the flip vertically on load flag + */ + public static void stbi_set_flip_vertically_on_load(@NativeType("int") boolean flag_true_if_should_flip) { + nstbi_set_flip_vertically_on_load(flag_true_if_should_flip ? 1 : 0); + } + + // --- [ stbi_set_unpremultiply_on_load_thread ] --- + + /** Unsafe version of: {@link #stbi_set_unpremultiply_on_load_thread set_unpremultiply_on_load_thread} */ + public static native void nstbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); + + /** As {@link #stbi_set_unpremultiply_on_load set_unpremultiply_on_load}, but only applies to images loaded on the thread that calls the function. */ + public static void stbi_set_unpremultiply_on_load_thread(@NativeType("int") boolean flag_true_if_should_unpremultiply) { + nstbi_set_unpremultiply_on_load_thread(flag_true_if_should_unpremultiply ? 1 : 0); + } + + // --- [ stbi_convert_iphone_png_to_rgb_thread ] --- + + /** Unsafe version of: {@link #stbi_convert_iphone_png_to_rgb_thread convert_iphone_png_to_rgb_thread} */ + public static native void nstbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); + + /** As {@link #stbi_convert_iphone_png_to_rgb convert_iphone_png_to_rgb}, but only applies to images loaded on the thread that calls the function. */ + public static void stbi_convert_iphone_png_to_rgb_thread(@NativeType("int") boolean flag_true_if_should_convert) { + nstbi_convert_iphone_png_to_rgb_thread(flag_true_if_should_convert ? 1 : 0); + } + + // --- [ stbi_set_flip_vertically_on_load_thread ] --- + + /** + * As {@link #stbi_set_flip_vertically_on_load set_flip_vertically_on_load}, but only applies to images loaded on the thread that calls the function. + * + * @param flag_true_if_should_flip the flip vertically on load flag + */ + public static native void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); + + // --- [ stbi_zlib_decode_malloc_guesssize ] --- + + /** Unsafe version of: {@link #stbi_zlib_decode_malloc_guesssize zlib_decode_malloc_guesssize} */ + public static native long nstbi_zlib_decode_malloc_guesssize(long buffer, int len, int initial_size, long outlen); + + /** ZLIB client - used by PNG, available for other purposes */ + @Nullable + @NativeType("char *") + public static ByteBuffer stbi_zlib_decode_malloc_guesssize(@NativeType("char const *") ByteBuffer buffer, int initial_size) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer outlen = stack.callocInt(1); + long __result = nstbi_zlib_decode_malloc_guesssize(memAddress(buffer), buffer.remaining(), initial_size, memAddress(outlen)); + return memByteBufferSafe(__result, outlen.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_zlib_decode_malloc_guesssize_headerflag ] --- + + /** Unsafe version of: {@link #stbi_zlib_decode_malloc_guesssize_headerflag zlib_decode_malloc_guesssize_headerflag} */ + public static native long nstbi_zlib_decode_malloc_guesssize_headerflag(long buffer, int len, int initial_size, long outlen, int parse_header); + + /** ZLIB client - used by PNG, available for other purposes */ + @Nullable + @NativeType("char *") + public static ByteBuffer stbi_zlib_decode_malloc_guesssize_headerflag(@NativeType("char const *") ByteBuffer buffer, int initial_size, @NativeType("int") boolean parse_header) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer outlen = stack.callocInt(1); + long __result = nstbi_zlib_decode_malloc_guesssize_headerflag(memAddress(buffer), buffer.remaining(), initial_size, memAddress(outlen), parse_header ? 1 : 0); + return memByteBufferSafe(__result, outlen.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_zlib_decode_malloc ] --- + + /** Unsafe version of: {@link #stbi_zlib_decode_malloc zlib_decode_malloc} */ + public static native long nstbi_zlib_decode_malloc(long buffer, int len, long outlen); + + /** ZLIB client - used by PNG, available for other purposes */ + @Nullable + @NativeType("char *") + public static ByteBuffer stbi_zlib_decode_malloc(@NativeType("char const *") ByteBuffer buffer) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer outlen = stack.callocInt(1); + long __result = nstbi_zlib_decode_malloc(memAddress(buffer), buffer.remaining(), memAddress(outlen)); + return memByteBufferSafe(__result, outlen.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_zlib_decode_buffer ] --- + + /** Unsafe version of: {@link #stbi_zlib_decode_buffer zlib_decode_buffer} */ + public static native int nstbi_zlib_decode_buffer(long obuffer, int olen, long ibuffer, int ilen); + + /** ZLIB client - used by PNG, available for other purposes */ + public static int stbi_zlib_decode_buffer(@NativeType("char *") ByteBuffer obuffer, @NativeType("char const *") ByteBuffer ibuffer) { + return nstbi_zlib_decode_buffer(memAddress(obuffer), obuffer.remaining(), memAddress(ibuffer), ibuffer.remaining()); + } + + // --- [ stbi_zlib_decode_noheader_malloc ] --- + + /** Unsafe version of: {@link #stbi_zlib_decode_noheader_malloc zlib_decode_noheader_malloc} */ + public static native long nstbi_zlib_decode_noheader_malloc(long buffer, int len, long outlen); + + /** ZLIB client - used by PNG, available for other purposes */ + @Nullable + @NativeType("char *") + public static ByteBuffer stbi_zlib_decode_noheader_malloc(@NativeType("char const *") ByteBuffer buffer) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer outlen = stack.callocInt(1); + long __result = nstbi_zlib_decode_noheader_malloc(memAddress(buffer), buffer.remaining(), memAddress(outlen)); + return memByteBufferSafe(__result, outlen.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_zlib_decode_noheader_buffer ] --- + + /** Unsafe version of: {@link #stbi_zlib_decode_noheader_buffer zlib_decode_noheader_buffer} */ + public static native int nstbi_zlib_decode_noheader_buffer(long obuffer, int olen, long ibuffer, int ilen); + + /** ZLIB client - used by PNG, available for other purposes */ + public static int stbi_zlib_decode_noheader_buffer(@NativeType("char *") ByteBuffer obuffer, @NativeType("char const *") ByteBuffer ibuffer) { + return nstbi_zlib_decode_noheader_buffer(memAddress(obuffer), obuffer.remaining(), memAddress(ibuffer), ibuffer.remaining()); + } + + /** Array version of: {@link #nstbi_load} */ + public static native long nstbi_load(long filename, int[] x, int[] y, int[] channels_in_file, int desired_channels); + + /** Array version of: {@link #stbi_load load} */ + @Nullable + @NativeType("stbi_uc *") + public static ByteBuffer stbi_load(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + checkNT1(filename); + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_load(memAddress(filename), x, y, channels_in_file, desired_channels); + return memByteBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } + + /** Array version of: {@link #stbi_load load} */ + @Nullable + @NativeType("stbi_uc *") + public static ByteBuffer stbi_load(@NativeType("char const *") CharSequence filename, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + long __result = nstbi_load(filenameEncoded, x, y, channels_in_file, desired_channels); + return memByteBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #nstbi_load_from_memory} */ + public static native long nstbi_load_from_memory(long buffer, int len, int[] x, int[] y, int[] channels_in_file, int desired_channels); + + /** Array version of: {@link #stbi_load_from_memory load_from_memory} */ + @Nullable + @NativeType("stbi_uc *") + public static ByteBuffer stbi_load_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_load_from_memory(memAddress(buffer), buffer.remaining(), x, y, channels_in_file, desired_channels); + return memByteBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } + + /** Array version of: {@link #nstbi_load_from_callbacks} */ + public static native long nstbi_load_from_callbacks(long clbk, long user, int[] x, int[] y, int[] channels_in_file, int desired_channels); + + /** Array version of: {@link #stbi_load_from_callbacks load_from_callbacks} */ + @Nullable + @NativeType("stbi_uc *") + public static ByteBuffer stbi_load_from_callbacks(@NativeType("stbi_io_callbacks const *") STBIIOCallbacks clbk, @NativeType("void *") long user, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + STBIIOCallbacks.validate(clbk.address()); + } + long __result = nstbi_load_from_callbacks(clbk.address(), user, x, y, channels_in_file, desired_channels); + return memByteBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } + + /** Array version of: {@link #nstbi_load_gif_from_memory} */ + public static native long nstbi_load_gif_from_memory(long buffer, int len, long delays, int[] x, int[] y, int[] z, int[] channels_in_file, int desired_channels); + + /** Array version of: {@link #stbi_load_gif_from_memory load_gif_from_memory} */ + @Nullable + @NativeType("stbi_uc *") + public static ByteBuffer stbi_load_gif_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer, @NativeType("int **") PointerBuffer delays, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] z, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + check(delays, 1); + check(x, 1); + check(y, 1); + check(z, 1); + check(channels_in_file, 1); + } + long __result = nstbi_load_gif_from_memory(memAddress(buffer), buffer.remaining(), memAddress(delays), x, y, z, channels_in_file, desired_channels); + return memByteBufferSafe(__result, x[0] * y[0] * z[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } + + /** Array version of: {@link #nstbi_load_16} */ + public static native long nstbi_load_16(long filename, int[] x, int[] y, int[] channels_in_file, int desired_channels); + + /** Array version of: {@link #stbi_load_16 load_16} */ + @Nullable + @NativeType("stbi_us *") + public static ShortBuffer stbi_load_16(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + checkNT1(filename); + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_load_16(memAddress(filename), x, y, channels_in_file, desired_channels); + return memShortBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } + + /** Array version of: {@link #stbi_load_16 load_16} */ + @Nullable + @NativeType("stbi_us *") + public static ShortBuffer stbi_load_16(@NativeType("char const *") CharSequence filename, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + long __result = nstbi_load_16(filenameEncoded, x, y, channels_in_file, desired_channels); + return memShortBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #nstbi_load_16_from_memory} */ + public static native long nstbi_load_16_from_memory(long buffer, int len, int[] x, int[] y, int[] channels_in_file, int desired_channels); + + /** Array version of: {@link #stbi_load_16_from_memory load_16_from_memory} */ + @Nullable + @NativeType("stbi_us *") + public static ShortBuffer stbi_load_16_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_load_16_from_memory(memAddress(buffer), buffer.remaining(), x, y, channels_in_file, desired_channels); + return memShortBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } + + /** Array version of: {@link #nstbi_load_16_from_callbacks} */ + public static native long nstbi_load_16_from_callbacks(long clbk, long user, int[] x, int[] y, int[] channels_in_file, int desired_channels); + + /** Array version of: {@link #stbi_load_16_from_callbacks load_16_from_callbacks} */ + @Nullable + @NativeType("stbi_us *") + public static ShortBuffer stbi_load_16_from_callbacks(@NativeType("stbi_io_callbacks const *") STBIIOCallbacks clbk, @NativeType("void *") long user, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + STBIIOCallbacks.validate(clbk.address()); + } + long __result = nstbi_load_16_from_callbacks(clbk.address(), user, x, y, channels_in_file, desired_channels); + return memShortBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } + + /** Array version of: {@link #nstbi_loadf} */ + public static native long nstbi_loadf(long filename, int[] x, int[] y, int[] channels_in_file, int desired_channels); + + /** Array version of: {@link #stbi_loadf loadf} */ + @Nullable + @NativeType("float *") + public static FloatBuffer stbi_loadf(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + checkNT1(filename); + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_loadf(memAddress(filename), x, y, channels_in_file, desired_channels); + return memFloatBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } + + /** Array version of: {@link #stbi_loadf loadf} */ + @Nullable + @NativeType("float *") + public static FloatBuffer stbi_loadf(@NativeType("char const *") CharSequence filename, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + long __result = nstbi_loadf(filenameEncoded, x, y, channels_in_file, desired_channels); + return memFloatBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #nstbi_loadf_from_memory} */ + public static native long nstbi_loadf_from_memory(long buffer, int len, int[] x, int[] y, int[] channels_in_file, int desired_channels); + + /** Array version of: {@link #stbi_loadf_from_memory loadf_from_memory} */ + @Nullable + @NativeType("float *") + public static FloatBuffer stbi_loadf_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + } + long __result = nstbi_loadf_from_memory(memAddress(buffer), buffer.remaining(), x, y, channels_in_file, desired_channels); + return memFloatBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } + + /** Array version of: {@link #nstbi_loadf_from_callbacks} */ + public static native long nstbi_loadf_from_callbacks(long clbk, long user, int[] x, int[] y, int[] channels_in_file, int desired_channels); + + /** Array version of: {@link #stbi_loadf_from_callbacks loadf_from_callbacks} */ + @Nullable + @NativeType("float *") + public static FloatBuffer stbi_loadf_from_callbacks(@NativeType("stbi_io_callbacks const *") STBIIOCallbacks clbk, @NativeType("void *") long user, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] channels_in_file, int desired_channels) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(channels_in_file, 1); + STBIIOCallbacks.validate(clbk.address()); + } + long __result = nstbi_loadf_from_callbacks(clbk.address(), user, x, y, channels_in_file, desired_channels); + return memFloatBufferSafe(__result, x[0] * y[0] * (desired_channels != 0 ? desired_channels : channels_in_file[0])); + } + + /** Array version of: {@link #nstbi_info} */ + public static native int nstbi_info(long filename, int[] x, int[] y, int[] comp); + + /** Array version of: {@link #stbi_info info} */ + @NativeType("int") + public static boolean stbi_info(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] comp) { + if (CHECKS) { + checkNT1(filename); + check(x, 1); + check(y, 1); + check(comp, 1); + } + return nstbi_info(memAddress(filename), x, y, comp) != 0; + } + + /** Array version of: {@link #stbi_info info} */ + @NativeType("int") + public static boolean stbi_info(@NativeType("char const *") CharSequence filename, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] comp) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(comp, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstbi_info(filenameEncoded, x, y, comp) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #nstbi_info_from_memory} */ + public static native int nstbi_info_from_memory(long buffer, int len, int[] x, int[] y, int[] comp); + + /** Array version of: {@link #stbi_info_from_memory info_from_memory} */ + @NativeType("int") + public static boolean stbi_info_from_memory(@NativeType("stbi_uc const *") ByteBuffer buffer, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] comp) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(comp, 1); + } + return nstbi_info_from_memory(memAddress(buffer), buffer.remaining(), x, y, comp) != 0; + } + + /** Array version of: {@link #nstbi_info_from_callbacks} */ + public static native int nstbi_info_from_callbacks(long clbk, long user, int[] x, int[] y, int[] comp); + + /** Array version of: {@link #stbi_info_from_callbacks info_from_callbacks} */ + @NativeType("int") + public static boolean stbi_info_from_callbacks(@NativeType("stbi_io_callbacks const *") STBIIOCallbacks clbk, @NativeType("void *") long user, @NativeType("int *") int[] x, @NativeType("int *") int[] y, @NativeType("int *") int[] comp) { + if (CHECKS) { + check(x, 1); + check(y, 1); + check(comp, 1); + STBIIOCallbacks.validate(clbk.address()); + } + return nstbi_info_from_callbacks(clbk.address(), user, x, y, comp) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImageResize.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImageResize.java new file mode 100644 index 000000000..96715b012 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImageResize.java @@ -0,0 +1,565 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to stb_image_resize.h from the stb library. + * + *

    Written with emphasis on usability, portability, and efficiency. (No SIMD or threads, so it be easily outperformed by libs that use those.) Only + * scaling and translation is supported, no rotations or shears. Easy API downsamples w/Mitchell filter, upsamples w/cubic interpolation.

    + * + *

    QUICKSTART

    + * + *
    
    + * stbir_resize_uint8(      input_pixels , in_w , in_h , 0,
    + *                          output_pixels, out_w, out_h, 0, num_channels)
    + * stbir_resize_float(...)
    + * stbir_resize_uint8_srgb( input_pixels , in_w , in_h , 0,
    + *                          output_pixels, out_w, out_h, 0,
    + *                          num_channels , alpha_chan  , 0)
    + * stbir_resize_uint8_srgb_edgemode(
    + *                          input_pixels , in_w , in_h , 0,
    + *                          output_pixels, out_w, out_h, 0,
    + *                          num_channels , alpha_chan  , 0, STBIR_EDGE_CLAMP)
    + *                                                       // WRAP/REFLECT/ZERO
    + * + *

    ALPHA CHANNEL

    + * + *

    Most of the resizing functions provide the ability to control how the alpha channel of an image is processed. The important things to know about this:

    + * + *
      + *
    1. The best mathematically-behaved version of alpha to use is called "premultiplied alpha", in which the other color channels have had the alpha value + * multiplied in. If you use premultiplied alpha, linear filtering (such as image resampling done by this library, or performed in texture units on + * GPUs) does the "right thing". While premultiplied alpha is standard in the movie CGI industry, it is still uncommon in the videogame/real-time + * world. If you linearly filter non-premultiplied alpha, strange effects occur. (For example, the average of 1% opaque bright green and 99% opaque + * black produces 50% transparent dark green when non-premultiplied, whereas premultiplied it produces 50% transparent near-black. The former + * introduces green energy that doesn't exist in the source image.)
    2. + *
    3. Artists should not edit premultiplied-alpha images; artists want non-premultiplied alpha images. Thus, art tools generally output non-premultiplied + * alpha images.
    4. + *
    5. You will get best results in most cases by converting images to premultiplied alpha before processing them mathematically.
    6. + *
    7. If you pass the flag {@link #STBIR_FLAG_ALPHA_PREMULTIPLIED FLAG_ALPHA_PREMULTIPLIED}, the resizer does not do anything special for the alpha channel; it is resampled identically to + * other channels. This produces the correct results for premultiplied-alpha images, but produces less-than-ideal results for non-premultiplied-alpha + * images.
    8. + *
    9. If you do not pass the flag {@link #STBIR_FLAG_ALPHA_PREMULTIPLIED FLAG_ALPHA_PREMULTIPLIED}, then the resizer weights the contribution of input pixels based on their alpha values, or, + * equivalently, it multiplies the alpha value into the color channels, resamples, then divides by the resultant alpha value. Input pixels which have + * {@code alpha=0} do not contribute at all to output pixels unless all of the input pixels affecting that output pixel have {@code alpha=0}, + * in which case the result for that pixel is the same as it would be without {@link #STBIR_FLAG_ALPHA_PREMULTIPLIED FLAG_ALPHA_PREMULTIPLIED}. However, this is only true for input images + * in integer formats. For input images in float format, input pixels with {@code alpha=0} have no effect, and output pixels which have + * {@code alpha=0} will be 0 in all channels. (For float images, you can manually achieve the same result by adding a tiny epsilon value to the alpha + * channel of every image, and then subtracting or clamping it at the end.)
    10. + *
    11. You can separately control whether the alpha channel is interpreted as linear or affected by the colorspace. By default it is linear; you almost + * never want to apply the colorspace. (For example, graphics hardware does not apply sRGB conversion to the alpha channel.)
    12. + *
    + */ +public class STBImageResize { + + static { LibSTB.initialize(); } + + /** Set this flag if you have no alpha channel, or otherwise provide the index of the alpha channel. */ + public static final int STBIR_ALPHA_CHANNEL_NONE = -1; + + /** + * Set this flag if your texture has premultiplied alpha. Otherwise, stbir will use alpha-weighted resampling (effectively premultiplying, resampling, + * then unpremultiplying). + */ + public static final int STBIR_FLAG_ALPHA_PREMULTIPLIED = 1 << 0; + + /** The specified alpha channel should be handled as gamma-corrected value even when doing sRGB operations. */ + public static final int STBIR_FLAG_ALPHA_USES_COLORSPACE = 1 << 1; + + /** + * Edge wrap mode. + * + *
    Enum values:
    + * + *
      + *
    • {@link #STBIR_EDGE_CLAMP EDGE_CLAMP}
    • + *
    • {@link #STBIR_EDGE_REFLECT EDGE_REFLECT}
    • + *
    • {@link #STBIR_EDGE_WRAP EDGE_WRAP}
    • + *
    • {@link #STBIR_EDGE_ZERO EDGE_ZERO}
    • + *
    + */ + public static final int + STBIR_EDGE_CLAMP = 0x1, + STBIR_EDGE_REFLECT = 0x2, + STBIR_EDGE_WRAP = 0x3, + STBIR_EDGE_ZERO = 0x4; + + /** + * Filters. + * + *
    Enum values:
    + * + *
      + *
    • {@link #STBIR_FILTER_DEFAULT FILTER_DEFAULT} - Use same filter type that easy-to-use API chooses.
    • + *
    • {@link #STBIR_FILTER_BOX FILTER_BOX} - A trapezoid w/1-pixel wide ramps, same result as box for integer scale ratios.
    • + *
    • {@link #STBIR_FILTER_TRIANGLE FILTER_TRIANGLE} - On upsampling, produces same results as bilinear texture filtering.
    • + *
    • {@link #STBIR_FILTER_CUBICBSPLINE FILTER_CUBICBSPLINE} - The cubic b-spline (aka Mitchell-Netrevalli with B=1,C=0), gaussian-esque.
    • + *
    • {@link #STBIR_FILTER_CATMULLROM FILTER_CATMULLROM} - An interpolating cubic spline.
    • + *
    • {@link #STBIR_FILTER_MITCHELL FILTER_MITCHELL} - Mitchell-Netrevalli filter with B=1/3, C=1/3.
    • + *
    + */ + public static final int + STBIR_FILTER_DEFAULT = 0, + STBIR_FILTER_BOX = 1, + STBIR_FILTER_TRIANGLE = 2, + STBIR_FILTER_CUBICBSPLINE = 3, + STBIR_FILTER_CATMULLROM = 4, + STBIR_FILTER_MITCHELL = 5; + + /** + * Colorspace. + * + *
    Enum values:
    + * + *
      + *
    • {@link #STBIR_COLORSPACE_LINEAR COLORSPACE_LINEAR}
    • + *
    • {@link #STBIR_COLORSPACE_SRGB COLORSPACE_SRGB}
    • + *
    + */ + public static final int + STBIR_COLORSPACE_LINEAR = 0, + STBIR_COLORSPACE_SRGB = 1; + + /** + * Data type. + * + *
    Enum values:
    + * + *
      + *
    • {@link #STBIR_TYPE_UINT8 TYPE_UINT8}
    • + *
    • {@link #STBIR_TYPE_UINT16 TYPE_UINT16}
    • + *
    • {@link #STBIR_TYPE_UINT32 TYPE_UINT32}
    • + *
    • {@link #STBIR_TYPE_FLOAT TYPE_FLOAT}
    • + *
    + */ + public static final int + STBIR_TYPE_UINT8 = 0, + STBIR_TYPE_UINT16 = 1, + STBIR_TYPE_UINT32 = 2, + STBIR_TYPE_FLOAT = 3; + + protected STBImageResize() { + throw new UnsupportedOperationException(); + } + + // --- [ stbir_resize_uint8 ] --- + + /** Unsafe version of: {@link #stbir_resize_uint8 resize_uint8} */ + public static native int nstbir_resize_uint8(long input_pixels, int input_w, int input_h, int input_stride_in_bytes, long output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels); + + /** + * Easy-to-use API for resizing images. + * + *
      + *
    • The colorspace is linear.
    • + *
    • The alpha channel is treated identically to other channels.
    • + *
    • Memory required grows approximately linearly with input and output size, but with discontinuities at {@code input_w == output_w} and + * {@code input_h == output_h}.
    • + *
    + * + *

    This function uses the default resampling filter defined at compile time. For a different filter, use the medium-complexity API.

    + * + * @param input_pixels the source image data + * @param input_w the source image width + * @param input_h the source image height + * @param input_stride_in_bytes the offset between successive rows of the source image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param output_pixels returns the scaled image data + * @param output_w the resized image width + * @param output_h the resized image height + * @param output_stride_in_bytes the offset between successive rows of the resized image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param num_channels the number of channels in the image (e.g. RGB=3, RGBA=4) + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbir_resize_uint8(@NativeType("unsigned char const *") ByteBuffer input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("unsigned char *") ByteBuffer output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? input_w * num_channels : input_stride_in_bytes)); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? output_w * num_channels : output_stride_in_bytes)); + } + return nstbir_resize_uint8(memAddress(input_pixels), input_w, input_h, input_stride_in_bytes, memAddress(output_pixels), output_w, output_h, output_stride_in_bytes, num_channels) != 0; + } + + // --- [ stbir_resize_float ] --- + + /** Unsafe version of: {@link #stbir_resize_float resize_float} */ + public static native int nstbir_resize_float(long input_pixels, int input_w, int input_h, int input_stride_in_bytes, long output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels); + + /** + * Float version of {@link #stbir_resize_uint8 resize_uint8}. + * + * @param input_pixels the source image data + * @param input_w the source image width + * @param input_h the source image height + * @param input_stride_in_bytes the offset between successive rows of the source image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param output_pixels returns the scaled image data + * @param output_w the resized image width + * @param output_h the resized image height + * @param output_stride_in_bytes the offset between successive rows of the resized image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param num_channels the number of channels in the image (e.g. RGB=3, RGBA=4) + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbir_resize_float(@NativeType("float const *") FloatBuffer input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("float *") FloatBuffer output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? input_w * num_channels : (input_stride_in_bytes >> 2))); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? output_w * num_channels : (output_stride_in_bytes >> 2))); + } + return nstbir_resize_float(memAddress(input_pixels), input_w, input_h, input_stride_in_bytes, memAddress(output_pixels), output_w, output_h, output_stride_in_bytes, num_channels) != 0; + } + + // --- [ stbir_resize_uint8_srgb ] --- + + /** Unsafe version of: {@link #stbir_resize_uint8_srgb resize_uint8_srgb} */ + public static native int nstbir_resize_uint8_srgb(long input_pixels, int input_w, int input_h, int input_stride_in_bytes, long output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags); + + /** + * Easy-to-use API for resizing images. + * + *
      + *
    • The image data is interpreted as gamma-corrected sRGB.
    • + *
    • Memory required grows approximately linearly with input and output size, but with discontinuities at {@code input_w == output_w} and + * {@code input_h == output_h}.
    • + *
    + * + *

    This function uses the default resampling filter defined at compile time. For a different filter, use the medium-complexity API.

    + * + * @param input_pixels the source image data + * @param input_w the source image width + * @param input_h the source image height + * @param input_stride_in_bytes the offset between successive rows of the source image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param output_pixels returns the scaled image data + * @param output_w the resized image width + * @param output_h the resized image height + * @param output_stride_in_bytes the offset between successive rows of the resized image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param num_channels the number of channels in the image (e.g. RGB=3, RGBA=4) + * @param alpha_channel the alpha channel index, or {@link #STBIR_ALPHA_CHANNEL_NONE ALPHA_CHANNEL_NONE} if there is no alpha channel + * @param flags the alpha channel flags. 0 will propably do the right thing if you're not sure what the flags mean. One of:
    {@link #STBIR_FLAG_ALPHA_PREMULTIPLIED FLAG_ALPHA_PREMULTIPLIED}{@link #STBIR_FLAG_ALPHA_USES_COLORSPACE FLAG_ALPHA_USES_COLORSPACE}
    + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbir_resize_uint8_srgb(@NativeType("unsigned char const *") ByteBuffer input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("unsigned char *") ByteBuffer output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? input_w * num_channels : input_stride_in_bytes)); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? output_w * num_channels : output_stride_in_bytes)); + } + return nstbir_resize_uint8_srgb(memAddress(input_pixels), input_w, input_h, input_stride_in_bytes, memAddress(output_pixels), output_w, output_h, output_stride_in_bytes, num_channels, alpha_channel, flags) != 0; + } + + // --- [ stbir_resize_uint8_srgb_edgemode ] --- + + /** Unsafe version of: {@link #stbir_resize_uint8_srgb_edgemode resize_uint8_srgb_edgemode} */ + public static native int nstbir_resize_uint8_srgb_edgemode(long input_pixels, int input_w, int input_h, int input_stride_in_bytes, long output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, int edge_wrap_mode); + + /** + * Same as {@link #stbir_resize_uint8_srgb resize_uint8_srgb}, but adds the ability to specify how requests to sample off the edge of the image are handled. + * + * @param input_pixels the source image data + * @param input_w the source image width + * @param input_h the source image height + * @param input_stride_in_bytes the offset between successive rows of the source image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param output_pixels returns the scaled image data + * @param output_w the resized image width + * @param output_h the resized image height + * @param output_stride_in_bytes the offset between successive rows of the resized image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param num_channels the number of channels in the image (e.g. RGB=3, RGBA=4) + * @param alpha_channel the alpha channel index, or {@link #STBIR_ALPHA_CHANNEL_NONE ALPHA_CHANNEL_NONE} if there is no alpha channel + * @param flags the alpha channel flags. 0 will propably do the right thing if you're not sure what the flags mean. One of:
    {@link #STBIR_FLAG_ALPHA_PREMULTIPLIED FLAG_ALPHA_PREMULTIPLIED}{@link #STBIR_FLAG_ALPHA_USES_COLORSPACE FLAG_ALPHA_USES_COLORSPACE}
    + * @param edge_wrap_mode the edge wrap mode. One of:
    {@link #STBIR_EDGE_CLAMP EDGE_CLAMP}{@link #STBIR_EDGE_REFLECT EDGE_REFLECT}{@link #STBIR_EDGE_WRAP EDGE_WRAP}{@link #STBIR_EDGE_ZERO EDGE_ZERO}
    + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbir_resize_uint8_srgb_edgemode(@NativeType("unsigned char const *") ByteBuffer input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("unsigned char *") ByteBuffer output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, @NativeType("stbir_edge") int edge_wrap_mode) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? input_w * num_channels : input_stride_in_bytes)); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? output_w * num_channels : output_stride_in_bytes)); + } + return nstbir_resize_uint8_srgb_edgemode(memAddress(input_pixels), input_w, input_h, input_stride_in_bytes, memAddress(output_pixels), output_w, output_h, output_stride_in_bytes, num_channels, alpha_channel, flags, edge_wrap_mode) != 0; + } + + // --- [ stbir_resize_uint8_generic ] --- + + /** Unsafe version of: {@link #stbir_resize_uint8_generic resize_uint8_generic} */ + public static native int nstbir_resize_uint8_generic(long input_pixels, int input_w, int input_h, int input_stride_in_bytes, long output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, int edge_wrap_mode, int filter, int space, long alloc_context); + + /** + * Medium-complexity version of {@link #stbir_resize_uint8 resize_uint8}. + * + * @param input_pixels the source image data + * @param input_w the source image width + * @param input_h the source image height + * @param input_stride_in_bytes the offset between successive rows of the source image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param output_pixels returns the scaled image data + * @param output_w the resized image width + * @param output_h the resized image height + * @param output_stride_in_bytes the offset between successive rows of the resized image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param num_channels the number of channels in the image (e.g. RGB=3, RGBA=4) + * @param alpha_channel the alpha channel index, or {@link #STBIR_ALPHA_CHANNEL_NONE ALPHA_CHANNEL_NONE} if there is no alpha channel + * @param flags the alpha channel flags. 0 will propably do the right thing if you're not sure what the flags mean. One of:
    {@link #STBIR_FLAG_ALPHA_PREMULTIPLIED FLAG_ALPHA_PREMULTIPLIED}{@link #STBIR_FLAG_ALPHA_USES_COLORSPACE FLAG_ALPHA_USES_COLORSPACE}
    + * @param edge_wrap_mode the edge wrap mode. One of:
    {@link #STBIR_EDGE_CLAMP EDGE_CLAMP}{@link #STBIR_EDGE_REFLECT EDGE_REFLECT}{@link #STBIR_EDGE_WRAP EDGE_WRAP}{@link #STBIR_EDGE_ZERO EDGE_ZERO}
    + * @param filter the scale filter. One of:
    {@link #STBIR_FILTER_DEFAULT FILTER_DEFAULT}{@link #STBIR_FILTER_BOX FILTER_BOX}{@link #STBIR_FILTER_TRIANGLE FILTER_TRIANGLE}{@link #STBIR_FILTER_CUBICBSPLINE FILTER_CUBICBSPLINE}{@link #STBIR_FILTER_CATMULLROM FILTER_CATMULLROM}
    {@link #STBIR_FILTER_MITCHELL FILTER_MITCHELL}
    + * @param space the image colorspace. One of:
    {@link #STBIR_COLORSPACE_LINEAR COLORSPACE_LINEAR}{@link #STBIR_COLORSPACE_SRGB COLORSPACE_SRGB}
    + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbir_resize_uint8_generic(@NativeType("unsigned char const *") ByteBuffer input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("unsigned char *") ByteBuffer output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, @NativeType("stbir_edge") int edge_wrap_mode, @NativeType("stbir_filter") int filter, @NativeType("stbir_colorspace") int space) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? input_w * num_channels : input_stride_in_bytes)); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? output_w * num_channels : output_stride_in_bytes)); + } + return nstbir_resize_uint8_generic(memAddress(input_pixels), input_w, input_h, input_stride_in_bytes, memAddress(output_pixels), output_w, output_h, output_stride_in_bytes, num_channels, alpha_channel, flags, edge_wrap_mode, filter, space, NULL) != 0; + } + + // --- [ stbir_resize_uint16_generic ] --- + + /** Unsafe version of: {@link #stbir_resize_uint16_generic resize_uint16_generic} */ + public static native int nstbir_resize_uint16_generic(long input_pixels, int input_w, int input_h, int input_stride_in_bytes, long output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, int edge_wrap_mode, int filter, int space, long alloc_context); + + /** + * Short version of {@link #stbir_resize_uint8_generic resize_uint8_generic}. + * + * @param input_pixels the source image data + * @param input_w the source image width + * @param input_h the source image height + * @param input_stride_in_bytes the offset between successive rows of the source image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param output_pixels returns the scaled image data + * @param output_w the resized image width + * @param output_h the resized image height + * @param output_stride_in_bytes the offset between successive rows of the resized image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param num_channels the number of channels in the image (e.g. RGB=3, RGBA=4) + * @param alpha_channel the alpha channel index, or {@link #STBIR_ALPHA_CHANNEL_NONE ALPHA_CHANNEL_NONE} if there is no alpha channel + * @param flags the alpha channel flags. 0 will propably do the right thing if you're not sure what the flags mean. One of:
    {@link #STBIR_FLAG_ALPHA_PREMULTIPLIED FLAG_ALPHA_PREMULTIPLIED}{@link #STBIR_FLAG_ALPHA_USES_COLORSPACE FLAG_ALPHA_USES_COLORSPACE}
    + * @param edge_wrap_mode the edge wrap mode. One of:
    {@link #STBIR_EDGE_CLAMP EDGE_CLAMP}{@link #STBIR_EDGE_REFLECT EDGE_REFLECT}{@link #STBIR_EDGE_WRAP EDGE_WRAP}{@link #STBIR_EDGE_ZERO EDGE_ZERO}
    + * @param filter the scale filter. One of:
    {@link #STBIR_FILTER_DEFAULT FILTER_DEFAULT}{@link #STBIR_FILTER_BOX FILTER_BOX}{@link #STBIR_FILTER_TRIANGLE FILTER_TRIANGLE}{@link #STBIR_FILTER_CUBICBSPLINE FILTER_CUBICBSPLINE}{@link #STBIR_FILTER_CATMULLROM FILTER_CATMULLROM}
    {@link #STBIR_FILTER_MITCHELL FILTER_MITCHELL}
    + * @param space the image colorspace. One of:
    {@link #STBIR_COLORSPACE_LINEAR COLORSPACE_LINEAR}{@link #STBIR_COLORSPACE_SRGB COLORSPACE_SRGB}
    + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbir_resize_uint16_generic(@NativeType("stbir_uint16 const *") ShortBuffer input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("stbir_uint16 *") ShortBuffer output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, @NativeType("stbir_edge") int edge_wrap_mode, @NativeType("stbir_filter") int filter, @NativeType("stbir_colorspace") int space) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? input_w * num_channels : (input_stride_in_bytes >> 1))); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? output_w * num_channels : (output_stride_in_bytes >> 1))); + } + return nstbir_resize_uint16_generic(memAddress(input_pixels), input_w, input_h, input_stride_in_bytes, memAddress(output_pixels), output_w, output_h, output_stride_in_bytes, num_channels, alpha_channel, flags, edge_wrap_mode, filter, space, NULL) != 0; + } + + // --- [ stbir_resize_float_generic ] --- + + /** Unsafe version of: {@link #stbir_resize_float_generic resize_float_generic} */ + public static native int nstbir_resize_float_generic(long input_pixels, int input_w, int input_h, int input_stride_in_bytes, long output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, int edge_wrap_mode, int filter, int space, long alloc_context); + + /** + * Float version of {@link #stbir_resize_uint8_generic resize_uint8_generic}. + * + * @param input_pixels the source image data + * @param input_w the source image width + * @param input_h the source image height + * @param input_stride_in_bytes the offset between successive rows of the source image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param output_pixels returns the scaled image data + * @param output_w the resized image width + * @param output_h the resized image height + * @param output_stride_in_bytes the offset between successive rows of the resized image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param num_channels the number of channels in the image (e.g. RGB=3, RGBA=4) + * @param alpha_channel the alpha channel index, or {@link #STBIR_ALPHA_CHANNEL_NONE ALPHA_CHANNEL_NONE} if there is no alpha channel + * @param flags the alpha channel flags. 0 will propably do the right thing if you're not sure what the flags mean. One of:
    {@link #STBIR_FLAG_ALPHA_PREMULTIPLIED FLAG_ALPHA_PREMULTIPLIED}{@link #STBIR_FLAG_ALPHA_USES_COLORSPACE FLAG_ALPHA_USES_COLORSPACE}
    + * @param edge_wrap_mode the edge wrap mode. One of:
    {@link #STBIR_EDGE_CLAMP EDGE_CLAMP}{@link #STBIR_EDGE_REFLECT EDGE_REFLECT}{@link #STBIR_EDGE_WRAP EDGE_WRAP}{@link #STBIR_EDGE_ZERO EDGE_ZERO}
    + * @param filter the scale filter. One of:
    {@link #STBIR_FILTER_DEFAULT FILTER_DEFAULT}{@link #STBIR_FILTER_BOX FILTER_BOX}{@link #STBIR_FILTER_TRIANGLE FILTER_TRIANGLE}{@link #STBIR_FILTER_CUBICBSPLINE FILTER_CUBICBSPLINE}{@link #STBIR_FILTER_CATMULLROM FILTER_CATMULLROM}
    {@link #STBIR_FILTER_MITCHELL FILTER_MITCHELL}
    + * @param space the image colorspace. One of:
    {@link #STBIR_COLORSPACE_LINEAR COLORSPACE_LINEAR}{@link #STBIR_COLORSPACE_SRGB COLORSPACE_SRGB}
    + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbir_resize_float_generic(@NativeType("float const *") FloatBuffer input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("float *") FloatBuffer output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, @NativeType("stbir_edge") int edge_wrap_mode, @NativeType("stbir_filter") int filter, @NativeType("stbir_colorspace") int space) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? input_w * num_channels : (input_stride_in_bytes >> 2))); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? output_w * num_channels : (output_stride_in_bytes >> 2))); + } + return nstbir_resize_float_generic(memAddress(input_pixels), input_w, input_h, input_stride_in_bytes, memAddress(output_pixels), output_w, output_h, output_stride_in_bytes, num_channels, alpha_channel, flags, edge_wrap_mode, filter, space, NULL) != 0; + } + + // --- [ stbir_resize ] --- + + /** Unsafe version of: {@link #stbir_resize resize} */ + public static native int nstbir_resize(long input_pixels, int input_w, int input_h, int input_stride_in_bytes, long output_pixels, int output_w, int output_h, int output_stride_in_bytes, int datatype, int num_channels, int alpha_channel, int flags, int edge_mode_horizontal, int edge_mode_vertical, int filter_horizontal, int filter_vertical, int space, long alloc_context); + + /** + * Full-complexity version of {@link #stbir_resize_uint8_generic resize_uint8_generic}. + * + * @param input_pixels the source image data + * @param input_w the source image width + * @param input_h the source image height + * @param input_stride_in_bytes the offset between successive rows of the source image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param output_pixels returns the scaled image data + * @param output_w the resized image width + * @param output_h the resized image height + * @param output_stride_in_bytes the offset between successive rows of the resized image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param datatype the image data type. One of:
    {@link #STBIR_TYPE_UINT8 TYPE_UINT8}{@link #STBIR_TYPE_UINT16 TYPE_UINT16}{@link #STBIR_TYPE_UINT32 TYPE_UINT32}{@link #STBIR_TYPE_FLOAT TYPE_FLOAT}
    + * @param num_channels the number of channels in the image (e.g. RGB=3, RGBA=4) + * @param alpha_channel the alpha channel index, or {@link #STBIR_ALPHA_CHANNEL_NONE ALPHA_CHANNEL_NONE} if there is no alpha channel + * @param flags the alpha channel flags. 0 will propably do the right thing if you're not sure what the flags mean. One of:
    {@link #STBIR_FLAG_ALPHA_PREMULTIPLIED FLAG_ALPHA_PREMULTIPLIED}{@link #STBIR_FLAG_ALPHA_USES_COLORSPACE FLAG_ALPHA_USES_COLORSPACE}
    + * @param edge_mode_horizontal the horizontal edge wrap mode + * @param edge_mode_vertical the vertical edge wrap mode + * @param filter_horizontal the horizontal scale filter + * @param filter_vertical the vertical scale filter + * @param space the image colorspace. One of:
    {@link #STBIR_COLORSPACE_LINEAR COLORSPACE_LINEAR}{@link #STBIR_COLORSPACE_SRGB COLORSPACE_SRGB}
    + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbir_resize(@NativeType("void const *") ByteBuffer input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("void *") ByteBuffer output_pixels, int output_w, int output_h, int output_stride_in_bytes, @NativeType("stbir_datatype") int datatype, int num_channels, int alpha_channel, int flags, @NativeType("stbir_edge") int edge_mode_horizontal, @NativeType("stbir_edge") int edge_mode_vertical, @NativeType("stbir_filter") int filter_horizontal, @NativeType("stbir_filter") int filter_vertical, @NativeType("stbir_colorspace") int space) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? (input_w * num_channels) << getTypeShift(datatype) : input_stride_in_bytes)); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? (output_w * num_channels) << getTypeShift(datatype) : output_stride_in_bytes)); + } + return nstbir_resize(memAddress(input_pixels), input_w, input_h, input_stride_in_bytes, memAddress(output_pixels), output_w, output_h, output_stride_in_bytes, datatype, num_channels, alpha_channel, flags, edge_mode_horizontal, edge_mode_vertical, filter_horizontal, filter_vertical, space, NULL) != 0; + } + + // --- [ stbir_resize_subpixel ] --- + + /** Unsafe version of: {@link #stbir_resize_subpixel resize_subpixel} */ + public static native int nstbir_resize_subpixel(long input_pixels, int input_w, int input_h, int input_stride_in_bytes, long output_pixels, int output_w, int output_h, int output_stride_in_bytes, int datatype, int num_channels, int alpha_channel, int flags, int edge_mode_horizontal, int edge_mode_vertical, int filter_horizontal, int filter_vertical, int space, long alloc_context, float x_scale, float y_scale, float x_offset, float y_offset); + + /** + * Subpixel version of {@link #stbir_resize resize}. + * + * @param input_pixels the source image data + * @param input_w the source image width + * @param input_h the source image height + * @param input_stride_in_bytes the offset between successive rows of the source image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param output_pixels returns the scaled image data + * @param output_w the resized image width + * @param output_h the resized image height + * @param output_stride_in_bytes the offset between successive rows of the resized image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param datatype the image data type. One of:
    {@link #STBIR_TYPE_UINT8 TYPE_UINT8}{@link #STBIR_TYPE_UINT16 TYPE_UINT16}{@link #STBIR_TYPE_UINT32 TYPE_UINT32}{@link #STBIR_TYPE_FLOAT TYPE_FLOAT}
    + * @param num_channels the number of channels in the image (e.g. RGB=3, RGBA=4) + * @param alpha_channel the alpha channel index, or {@link #STBIR_ALPHA_CHANNEL_NONE ALPHA_CHANNEL_NONE} if there is no alpha channel + * @param flags the alpha channel flags. 0 will propably do the right thing if you're not sure what the flags mean. One of:
    {@link #STBIR_FLAG_ALPHA_PREMULTIPLIED FLAG_ALPHA_PREMULTIPLIED}{@link #STBIR_FLAG_ALPHA_USES_COLORSPACE FLAG_ALPHA_USES_COLORSPACE}
    + * @param edge_mode_horizontal the horizontal edge wrap mode + * @param edge_mode_vertical the vertical edge wrap mode + * @param filter_horizontal the horizontal scale filter + * @param filter_vertical the vertical scale filter + * @param space the image colorspace. One of:
    {@link #STBIR_COLORSPACE_LINEAR COLORSPACE_LINEAR}{@link #STBIR_COLORSPACE_SRGB COLORSPACE_SRGB}
    + * @param x_scale horizontal scale for subpixel correctness + * @param y_scale vertical scale for subpixel correctness + * @param x_offset horizontal offset for subpixel correctness + * @param y_offset vertical offset for subpixel correctness + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbir_resize_subpixel(@NativeType("void const *") ByteBuffer input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("void *") ByteBuffer output_pixels, int output_w, int output_h, int output_stride_in_bytes, @NativeType("stbir_datatype") int datatype, int num_channels, int alpha_channel, int flags, @NativeType("stbir_edge") int edge_mode_horizontal, @NativeType("stbir_edge") int edge_mode_vertical, @NativeType("stbir_filter") int filter_horizontal, @NativeType("stbir_filter") int filter_vertical, @NativeType("stbir_colorspace") int space, float x_scale, float y_scale, float x_offset, float y_offset) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? (input_w * num_channels) << getTypeShift(datatype) : input_stride_in_bytes)); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? (output_w * num_channels) << getTypeShift(datatype) : output_stride_in_bytes)); + } + return nstbir_resize_subpixel(memAddress(input_pixels), input_w, input_h, input_stride_in_bytes, memAddress(output_pixels), output_w, output_h, output_stride_in_bytes, datatype, num_channels, alpha_channel, flags, edge_mode_horizontal, edge_mode_vertical, filter_horizontal, filter_vertical, space, NULL, x_scale, y_scale, x_offset, y_offset) != 0; + } + + // --- [ stbir_resize_region ] --- + + /** Unsafe version of: {@link #stbir_resize_region resize_region} */ + public static native int nstbir_resize_region(long input_pixels, int input_w, int input_h, int input_stride_in_bytes, long output_pixels, int output_w, int output_h, int output_stride_in_bytes, int datatype, int num_channels, int alpha_channel, int flags, int edge_mode_horizontal, int edge_mode_vertical, int filter_horizontal, int filter_vertical, int space, long alloc_context, float s0, float t0, float s1, float t1); + + /** + * Region version of {@link #stbir_resize resize}, using texture coordinates. + * + * @param input_pixels the source image data + * @param input_w the source image width + * @param input_h the source image height + * @param input_stride_in_bytes the offset between successive rows of the source image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param output_pixels returns the scaled image data + * @param output_w the resized image width + * @param output_h the resized image height + * @param output_stride_in_bytes the offset between successive rows of the resized image data in memory, in bytes. You can specify 0 to mean packed continuously in memory + * @param datatype the image data type. One of:
    {@link #STBIR_TYPE_UINT8 TYPE_UINT8}{@link #STBIR_TYPE_UINT16 TYPE_UINT16}{@link #STBIR_TYPE_UINT32 TYPE_UINT32}{@link #STBIR_TYPE_FLOAT TYPE_FLOAT}
    + * @param num_channels the number of channels in the image (e.g. RGB=3, RGBA=4) + * @param alpha_channel the alpha channel index, or {@link #STBIR_ALPHA_CHANNEL_NONE ALPHA_CHANNEL_NONE} if there is no alpha channel + * @param flags the alpha channel flags. 0 will propably do the right thing if you're not sure what the flags mean. One of:
    {@link #STBIR_FLAG_ALPHA_PREMULTIPLIED FLAG_ALPHA_PREMULTIPLIED}{@link #STBIR_FLAG_ALPHA_USES_COLORSPACE FLAG_ALPHA_USES_COLORSPACE}
    + * @param edge_mode_horizontal the horizontal edge wrap mode + * @param edge_mode_vertical the vertical edge wrap mode + * @param filter_horizontal the horizontal scale filter + * @param filter_vertical the vertical scale filter + * @param space the image colorspace. One of:
    {@link #STBIR_COLORSPACE_LINEAR COLORSPACE_LINEAR}{@link #STBIR_COLORSPACE_SRGB COLORSPACE_SRGB}
    + * @param s0 the left texture coordinate of the region to scale + * @param t0 the top texture coordinate of the region to scale + * @param s1 the right texture coordinate of the region to scale + * @param t1 the bottom texture coordinate of the region to scale + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbir_resize_region(@NativeType("void const *") ByteBuffer input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("void *") ByteBuffer output_pixels, int output_w, int output_h, int output_stride_in_bytes, @NativeType("stbir_datatype") int datatype, int num_channels, int alpha_channel, int flags, @NativeType("stbir_edge") int edge_mode_horizontal, @NativeType("stbir_edge") int edge_mode_vertical, @NativeType("stbir_filter") int filter_horizontal, @NativeType("stbir_filter") int filter_vertical, @NativeType("stbir_colorspace") int space, float s0, float t0, float s1, float t1) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? (input_w * num_channels) << getTypeShift(datatype) : input_stride_in_bytes)); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? (output_w * num_channels) << getTypeShift(datatype) : output_stride_in_bytes)); + } + return nstbir_resize_region(memAddress(input_pixels), input_w, input_h, input_stride_in_bytes, memAddress(output_pixels), output_w, output_h, output_stride_in_bytes, datatype, num_channels, alpha_channel, flags, edge_mode_horizontal, edge_mode_vertical, filter_horizontal, filter_vertical, space, NULL, s0, t0, s1, t1) != 0; + } + + /** Array version of: {@link #nstbir_resize_float} */ + public static native int nstbir_resize_float(float[] input_pixels, int input_w, int input_h, int input_stride_in_bytes, float[] output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels); + + /** Array version of: {@link #stbir_resize_float resize_float} */ + @NativeType("int") + public static boolean stbir_resize_float(@NativeType("float const *") float[] input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("float *") float[] output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? input_w * num_channels : (input_stride_in_bytes >> 2))); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? output_w * num_channels : (output_stride_in_bytes >> 2))); + } + return nstbir_resize_float(input_pixels, input_w, input_h, input_stride_in_bytes, output_pixels, output_w, output_h, output_stride_in_bytes, num_channels) != 0; + } + + /** Array version of: {@link #nstbir_resize_uint16_generic} */ + public static native int nstbir_resize_uint16_generic(short[] input_pixels, int input_w, int input_h, int input_stride_in_bytes, short[] output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, int edge_wrap_mode, int filter, int space, long alloc_context); + + /** Array version of: {@link #stbir_resize_uint16_generic resize_uint16_generic} */ + @NativeType("int") + public static boolean stbir_resize_uint16_generic(@NativeType("stbir_uint16 const *") short[] input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("stbir_uint16 *") short[] output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, @NativeType("stbir_edge") int edge_wrap_mode, @NativeType("stbir_filter") int filter, @NativeType("stbir_colorspace") int space) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? input_w * num_channels : (input_stride_in_bytes >> 1))); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? output_w * num_channels : (output_stride_in_bytes >> 1))); + } + return nstbir_resize_uint16_generic(input_pixels, input_w, input_h, input_stride_in_bytes, output_pixels, output_w, output_h, output_stride_in_bytes, num_channels, alpha_channel, flags, edge_wrap_mode, filter, space, NULL) != 0; + } + + /** Array version of: {@link #nstbir_resize_float_generic} */ + public static native int nstbir_resize_float_generic(float[] input_pixels, int input_w, int input_h, int input_stride_in_bytes, float[] output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, int edge_wrap_mode, int filter, int space, long alloc_context); + + /** Array version of: {@link #stbir_resize_float_generic resize_float_generic} */ + @NativeType("int") + public static boolean stbir_resize_float_generic(@NativeType("float const *") float[] input_pixels, int input_w, int input_h, int input_stride_in_bytes, @NativeType("float *") float[] output_pixels, int output_w, int output_h, int output_stride_in_bytes, int num_channels, int alpha_channel, int flags, @NativeType("stbir_edge") int edge_wrap_mode, @NativeType("stbir_filter") int filter, @NativeType("stbir_colorspace") int space) { + if (CHECKS) { + check(input_pixels, input_h * (input_stride_in_bytes == 0 ? input_w * num_channels : (input_stride_in_bytes >> 2))); + check(output_pixels, output_h * (output_stride_in_bytes == 0 ? output_w * num_channels : (output_stride_in_bytes >> 2))); + } + return nstbir_resize_float_generic(input_pixels, input_w, input_h, input_stride_in_bytes, output_pixels, output_w, output_h, output_stride_in_bytes, num_channels, alpha_channel, flags, edge_wrap_mode, filter, space, NULL) != 0; + } + + private static int getTypeShift(int type) { + switch (type) { + case STBIR_TYPE_UINT8: + return 0; + case STBIR_TYPE_UINT16: + return 1; + default: + return 2; + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImageWrite.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImageWrite.java new file mode 100644 index 000000000..8d7575b95 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBImageWrite.java @@ -0,0 +1,611 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to stb_image_write.h from the stb library. + * + *

    ABOUT

    + * + *

    This header file is a library for writing images to C stdio.

    + * + *

    The PNG output is not optimal; it is 20-50% larger than the file written by a decent optimizing implementation; though providing a custom zlib compress + * function (see {@link #stbi_zlib_compress zlib_compress}) can mitigate that. This library is designed for source code compactness and simplicity, not optimal image + * file size or run-time performance.

    + * + *

    USAGE

    + * + *

    There are five functions, one for each image file format:

    + * + *
    
    + * int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes);
    + * int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data);
    + * int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);
    + * int stbi_write_hdr(char const *filename, int w, int h, int comp, const void *data);
    + * int stbi_write_jpg(char const *filename, int w, int h, int comp, const float *data, int quality);
    + * 
    + * void stbi_flip_vertically_on_write(int flag); // flag is non-zero to flip data vertically
    + * + *

    There are also five equivalent functions that use an arbitrary write function. You are expected to open/close your file-equivalent before and after + * calling these:

    + * + *
    
    + * int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data, int stride_in_bytes);
    + * int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);
    + * int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);
    + * int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data);
    + * int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality);
    + * + *

    where the callback is:

    + * + *
    
    + * void stbi_write_func(void *context, void *data, int size);
    + * + *

    You can configure it with these global variables:

    + * + *
    
    + * int stbi_write_tga_with_rle;             // defaults to true; set to 0 to disable RLE
    + * int stbi_write_png_compression_level;    // defaults to 8; set to higher for more compression
    + * int stbi_write_force_png_filter;         // defaults to -1; set to 0..5 to force a filter mode
    + * + *

    The functions create an image file defined by the parameters. The image is a rectangle of pixels stored from left-to-right, top-to-bottom. Each pixel + * contains {@code comp} channels of data stored interleaved with 8-bits per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is monochrome + * color.) The rectangle is {@code w} pixels wide and {@code h} pixels tall. The {@code *data} pointer points to the first byte of the top-left-most + * pixel.

    + */ +public class STBImageWrite { + + static { LibSTB.initialize(); } + + protected STBImageWrite() { + throw new UnsupportedOperationException(); + } + + // --- [ stbi_write_png ] --- + + /** Unsafe version of: {@link #stbi_write_png write_png} */ + public static native int nstbi_write_png(long filename, int w, int h, int comp, long data, int stride_in_bytes); + + /** + * Writes a PNR image file. + * + *

    PNG creates output files with the same number of components as the input.

    + * + *

    PNG supports writing rectangles of data even when the bytes storing rows of data are not consecutive in memory (e.g. sub-rectangles of a larger image), + * by supplying the stride between the beginning of adjacent rows. The other formats do not. (Thus you cannot write a native-format BMP through the BMP + * writer, both because it is in BGR order and because it may have padding at the end of the line.)

    + * + *

    PNG allows you to set the deflate compression level by setting the global variable {@link #stbi_write_png_compression_level write_png_compression_level} (it defaults to 8).

    + * + * @param filename the image file path + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * @param stride_in_bytes the distance in bytes from the first byte of a row of pixels to the first byte of the next row of pixels + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_png(@NativeType("char const *") ByteBuffer filename, int w, int h, int comp, @NativeType("void const *") ByteBuffer data, int stride_in_bytes) { + if (CHECKS) { + checkNT1(filename); + check(data, (stride_in_bytes != 0 ? stride_in_bytes : w * comp) * h); + } + return nstbi_write_png(memAddress(filename), w, h, comp, memAddress(data), stride_in_bytes) != 0; + } + + /** + * Writes a PNR image file. + * + *

    PNG creates output files with the same number of components as the input.

    + * + *

    PNG supports writing rectangles of data even when the bytes storing rows of data are not consecutive in memory (e.g. sub-rectangles of a larger image), + * by supplying the stride between the beginning of adjacent rows. The other formats do not. (Thus you cannot write a native-format BMP through the BMP + * writer, both because it is in BGR order and because it may have padding at the end of the line.)

    + * + *

    PNG allows you to set the deflate compression level by setting the global variable {@link #stbi_write_png_compression_level write_png_compression_level} (it defaults to 8).

    + * + * @param filename the image file path + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * @param stride_in_bytes the distance in bytes from the first byte of a row of pixels to the first byte of the next row of pixels + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_png(@NativeType("char const *") CharSequence filename, int w, int h, int comp, @NativeType("void const *") ByteBuffer data, int stride_in_bytes) { + if (CHECKS) { + check(data, (stride_in_bytes != 0 ? stride_in_bytes : w * comp) * h); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstbi_write_png(filenameEncoded, w, h, comp, memAddress(data), stride_in_bytes) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_write_png_compression_level ] --- + + private static native long nstbi_write_png_compression_level(); + + @NativeType("int *") + private static IntBuffer stbi_write_png_compression_level() { + long __result = nstbi_write_png_compression_level(); + return memIntBuffer(__result, 1); + } + + /** Returns the address of the global variable {@code stbi_write_png_compression_level}. */ + public static final IntBuffer stbi_write_png_compression_level = stbi_write_png_compression_level(); + + // --- [ stbi_write_force_png_filter ] --- + + private static native long nstbi_write_force_png_filter(); + + @NativeType("int *") + private static IntBuffer stbi_write_force_png_filter() { + long __result = nstbi_write_force_png_filter(); + return memIntBuffer(__result, 1); + } + + /** Returns the address of the global variable {@code stbi_write_force_png_filter}. */ + public static final IntBuffer stbi_write_force_png_filter = stbi_write_force_png_filter(); + + // --- [ stbi_zlib_compress ] --- + + private static native long nstbi_zlib_compress(); + + @NativeType("unsigned char * (*) (unsigned char *, int, int *, int) *") + private static PointerBuffer stbi_zlib_compress() { + long __result = nstbi_zlib_compress(); + return memPointerBuffer(__result, 1); + } + + /** + * Returns the address of the global variable {@code stbi_zlib_compress}. + * + *

    The address of an {@link STBIZlibCompress} instance may be set to this variable, in order to override the Zlib compression implementation.

    + */ + public static final PointerBuffer stbi_zlib_compress = stbi_zlib_compress(); + + // --- [ stbi_write_bmp ] --- + + /** Unsafe version of: {@link #stbi_write_bmp write_bmp} */ + public static native int nstbi_write_bmp(long filename, int w, int h, int comp, long data); + + /** + * Writes a BMP image file. + * + *

    The BMP format expands Y to RGB in the file format and does not output alpha.

    + * + * @param filename the image file path + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_bmp(@NativeType("char const *") ByteBuffer filename, int w, int h, int comp, @NativeType("void const *") ByteBuffer data) { + if (CHECKS) { + checkNT1(filename); + check(data, w * h * comp); + } + return nstbi_write_bmp(memAddress(filename), w, h, comp, memAddress(data)) != 0; + } + + /** + * Writes a BMP image file. + * + *

    The BMP format expands Y to RGB in the file format and does not output alpha.

    + * + * @param filename the image file path + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_bmp(@NativeType("char const *") CharSequence filename, int w, int h, int comp, @NativeType("void const *") ByteBuffer data) { + if (CHECKS) { + check(data, w * h * comp); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstbi_write_bmp(filenameEncoded, w, h, comp, memAddress(data)) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_write_tga ] --- + + /** Unsafe version of: {@link #stbi_write_tga write_tga} */ + public static native int nstbi_write_tga(long filename, int w, int h, int comp, long data); + + /** + * Writes a TGA image file. + * + *

    TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed data, set the global variable {@code stbi_write_tga_with_rle} to 0. The variable + * can be accessed with {@link #stbi_write_tga_with_rle write_tga_with_rle}.

    + * + * @param filename the image file path + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_tga(@NativeType("char const *") ByteBuffer filename, int w, int h, int comp, @NativeType("void const *") ByteBuffer data) { + if (CHECKS) { + checkNT1(filename); + check(data, w * h * comp); + } + return nstbi_write_tga(memAddress(filename), w, h, comp, memAddress(data)) != 0; + } + + /** + * Writes a TGA image file. + * + *

    TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed data, set the global variable {@code stbi_write_tga_with_rle} to 0. The variable + * can be accessed with {@link #stbi_write_tga_with_rle write_tga_with_rle}.

    + * + * @param filename the image file path + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_tga(@NativeType("char const *") CharSequence filename, int w, int h, int comp, @NativeType("void const *") ByteBuffer data) { + if (CHECKS) { + check(data, w * h * comp); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstbi_write_tga(filenameEncoded, w, h, comp, memAddress(data)) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_write_tga_with_rle ] --- + + private static native long nstbi_write_tga_with_rle(); + + @NativeType("int *") + private static IntBuffer stbi_write_tga_with_rle() { + long __result = nstbi_write_tga_with_rle(); + return memIntBuffer(__result, 1); + } + + /** Returns the address of the global variable {@code stbi_write_tga_with_rle}. */ + public static final IntBuffer stbi_write_tga_with_rle = stbi_write_tga_with_rle(); + + // --- [ stbi_write_hdr ] --- + + /** Unsafe version of: {@link #stbi_write_hdr write_hdr} */ + public static native int nstbi_write_hdr(long filename, int w, int h, int comp, long data); + + /** + * Writes an HDR image file. + * + *

    HDR expects linear float data. Since the format is always 32-bit rgb(e) data, alpha (if provided) is discarded, and for monochrome data it is + * replicated across all three channels.

    + * + * @param filename the image file path + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_hdr(@NativeType("char const *") ByteBuffer filename, int w, int h, int comp, @NativeType("float const *") FloatBuffer data) { + if (CHECKS) { + checkNT1(filename); + check(data, w * h * comp); + } + return nstbi_write_hdr(memAddress(filename), w, h, comp, memAddress(data)) != 0; + } + + /** + * Writes an HDR image file. + * + *

    HDR expects linear float data. Since the format is always 32-bit rgb(e) data, alpha (if provided) is discarded, and for monochrome data it is + * replicated across all three channels.

    + * + * @param filename the image file path + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_hdr(@NativeType("char const *") CharSequence filename, int w, int h, int comp, @NativeType("float const *") FloatBuffer data) { + if (CHECKS) { + check(data, w * h * comp); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstbi_write_hdr(filenameEncoded, w, h, comp, memAddress(data)) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_write_jpg ] --- + + /** Unsafe version of: {@link #stbi_write_jpg write_jpg} */ + public static native int nstbi_write_jpg(long filename, int w, int h, int comp, long data, int quality); + + /** + * Writes a JPEG image file. + * + *

    JPEG does ignore alpha channels in input data; quality is between 1 and 100. Higher quality looks better but results in a bigger image. JPEG baseline + * (no JPEG progressive).

    + * + * @param filename the image file path + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * @param quality the compression quality + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_jpg(@NativeType("char const *") ByteBuffer filename, int w, int h, int comp, @NativeType("void const *") ByteBuffer data, int quality) { + if (CHECKS) { + checkNT1(filename); + check(data, w * h * comp); + } + return nstbi_write_jpg(memAddress(filename), w, h, comp, memAddress(data), quality) != 0; + } + + /** + * Writes a JPEG image file. + * + *

    JPEG does ignore alpha channels in input data; quality is between 1 and 100. Higher quality looks better but results in a bigger image. JPEG baseline + * (no JPEG progressive).

    + * + * @param filename the image file path + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * @param quality the compression quality + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_jpg(@NativeType("char const *") CharSequence filename, int w, int h, int comp, @NativeType("void const *") ByteBuffer data, int quality) { + if (CHECKS) { + check(data, w * h * comp); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstbi_write_jpg(filenameEncoded, w, h, comp, memAddress(data), quality) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbi_write_png_to_func ] --- + + /** Unsafe version of: {@link #stbi_write_png_to_func write_png_to_func} */ + public static native int nstbi_write_png_to_func(long func, long context, int w, int h, int comp, long data, int stride_in_bytes); + + /** + * Callback version of {@link #stbi_write_png write_png}. + * + * @param func the callback function + * @param context a context that will be passed to {@code func} + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * @param stride_in_bytes the distance in bytes from the first byte of a row of pixels to the first byte of the next row of pixels + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_png_to_func(@NativeType("stbi_write_func *") STBIWriteCallbackI func, @NativeType("void *") long context, int w, int h, int comp, @NativeType("void const *") ByteBuffer data, int stride_in_bytes) { + if (CHECKS) { + check(data, (stride_in_bytes != 0 ? stride_in_bytes : w * comp) * h); + } + return nstbi_write_png_to_func(func.address(), context, w, h, comp, memAddress(data), stride_in_bytes) != 0; + } + + // --- [ stbi_write_bmp_to_func ] --- + + /** Unsafe version of: {@link #stbi_write_bmp_to_func write_bmp_to_func} */ + public static native int nstbi_write_bmp_to_func(long func, long context, int w, int h, int comp, long data); + + /** + * Callback version of {@link #stbi_write_bmp write_bmp}. + * + * @param func the callback function + * @param context a context that will be passed to {@code func} + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_bmp_to_func(@NativeType("stbi_write_func *") STBIWriteCallbackI func, @NativeType("void *") long context, int w, int h, int comp, @NativeType("void const *") ByteBuffer data) { + if (CHECKS) { + check(data, w * h * comp); + } + return nstbi_write_bmp_to_func(func.address(), context, w, h, comp, memAddress(data)) != 0; + } + + // --- [ stbi_write_tga_to_func ] --- + + /** Unsafe version of: {@link #stbi_write_tga_to_func write_tga_to_func} */ + public static native int nstbi_write_tga_to_func(long func, long context, int w, int h, int comp, long data); + + /** + * Callback version of {@link #stbi_write_tga write_tga}. + * + * @param func the callback function + * @param context a context that will be passed to {@code func} + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_tga_to_func(@NativeType("stbi_write_func *") STBIWriteCallbackI func, @NativeType("void *") long context, int w, int h, int comp, @NativeType("void const *") ByteBuffer data) { + if (CHECKS) { + check(data, w * h * comp); + } + return nstbi_write_tga_to_func(func.address(), context, w, h, comp, memAddress(data)) != 0; + } + + // --- [ stbi_write_hdr_to_func ] --- + + /** Unsafe version of: {@link #stbi_write_hdr_to_func write_hdr_to_func} */ + public static native int nstbi_write_hdr_to_func(long func, long context, int w, int h, int comp, long data); + + /** + * Callback version of {@link #stbi_write_hdr write_hdr}. + * + * @param func the callback function + * @param context a context that will be passed to {@code func} + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbi_write_hdr_to_func(@NativeType("stbi_write_func *") STBIWriteCallbackI func, @NativeType("void *") long context, int w, int h, int comp, @NativeType("float const *") FloatBuffer data) { + if (CHECKS) { + check(data, w * h * comp); + } + return nstbi_write_hdr_to_func(func.address(), context, w, h, comp, memAddress(data)) != 0; + } + + // --- [ stbi_write_jpg_to_func ] --- + + /** Unsafe version of: {@link #stbi_write_jpg_to_func write_jpg_to_func} */ + public static native int nstbi_write_jpg_to_func(long func, long context, int w, int h, int comp, long data, int quality); + + /** + * Callback version of {@link #stbi_write_jpg write_jpg}. + * + * @param func the callback function + * @param context a context that will be passed to {@code func} + * @param w the image width, in pixels + * @param h the image height, in pixels + * @param comp the number of channels in each pixel + * @param data the image data + * @param quality the compression quality + * + * @return 1 on success, 0 on failure + */ + public static int stbi_write_jpg_to_func(@NativeType("stbi_write_func *") STBIWriteCallbackI func, @NativeType("void *") long context, int w, int h, int comp, @NativeType("void const *") ByteBuffer data, int quality) { + if (CHECKS) { + check(data, w * h * comp); + } + return nstbi_write_jpg_to_func(func.address(), context, w, h, comp, memAddress(data), quality); + } + + // --- [ stbi_flip_vertically_on_write ] --- + + /** Unsafe version of: {@link #stbi_flip_vertically_on_write flip_vertically_on_write} */ + public static native void nstbi_flip_vertically_on_write(int flip_boolean); + + /** + * Configures if the written image should flipped vertically. + * + * @param flip_boolean true to flip data vertically + */ + public static void stbi_flip_vertically_on_write(@NativeType("int") boolean flip_boolean) { + nstbi_flip_vertically_on_write(flip_boolean ? 1 : 0); + } + + /** Array version of: {@link #nstbi_write_hdr} */ + public static native int nstbi_write_hdr(long filename, int w, int h, int comp, float[] data); + + /** Array version of: {@link #stbi_write_hdr write_hdr} */ + @NativeType("int") + public static boolean stbi_write_hdr(@NativeType("char const *") ByteBuffer filename, int w, int h, int comp, @NativeType("float const *") float[] data) { + if (CHECKS) { + checkNT1(filename); + check(data, w * h * comp); + } + return nstbi_write_hdr(memAddress(filename), w, h, comp, data) != 0; + } + + /** Array version of: {@link #stbi_write_hdr write_hdr} */ + @NativeType("int") + public static boolean stbi_write_hdr(@NativeType("char const *") CharSequence filename, int w, int h, int comp, @NativeType("float const *") float[] data) { + if (CHECKS) { + check(data, w * h * comp); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstbi_write_hdr(filenameEncoded, w, h, comp, data) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #nstbi_write_hdr_to_func} */ + public static native int nstbi_write_hdr_to_func(long func, long context, int w, int h, int comp, float[] data); + + /** Array version of: {@link #stbi_write_hdr_to_func write_hdr_to_func} */ + @NativeType("int") + public static boolean stbi_write_hdr_to_func(@NativeType("stbi_write_func *") STBIWriteCallbackI func, @NativeType("void *") long context, int w, int h, int comp, @NativeType("float const *") float[] data) { + if (CHECKS) { + check(data, w * h * comp); + } + return nstbi_write_hdr_to_func(func.address(), context, w, h, comp, data) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBPerlin.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBPerlin.java new file mode 100644 index 000000000..ecad457d0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBPerlin.java @@ -0,0 +1,107 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import org.lwjgl.system.*; + +/** + * Native bindings to stb_perlin.h from the stb library. + * + *

    Revised Perlin noise (3D input, 1D output).

    + */ +public class STBPerlin { + + static { LibSTB.initialize(); } + + protected STBPerlin() { + throw new UnsupportedOperationException(); + } + + // --- [ stb_perlin_noise3 ] --- + + /** + * Computes a random value at the coordinate (x,y,z). + * + *

    Adjacent random values are continuous but the noise fluctuates its randomness with period 1, i.e. takes on wholly unrelated values at integer points. + * Specifically, this implements Ken Perlin's revised noise function from 2002.

    + * + *

    The "wrap" parameters can be used to create wraparound noise that wraps at powers of two. The numbers MUST be powers of two. Specify 0 to mean "don't + * care". (The noise always wraps every 256 due details of the implementation, even if you ask for larger or no wrapping.)

    + * + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coordinate + * @param x_wrap 0, or a power of two value that specifies the x wraparound coordinate + * @param y_wrap 0, or a power of two value that specifies the y wraparound coordinate + * @param z_wrap 0, or a power of two value that specifies the z wraparound coordinate + */ + public static native float stb_perlin_noise3(float x, float y, float z, int x_wrap, int y_wrap, int z_wrap); + + // --- [ stb_perlin_noise3_seed ] --- + + /** + * As {@link #stb_perlin_noise3 perlin_noise3}, but {@code seed} selects from multiple different variations of the noise function. + * + *

    The current implementation only uses the bottom 8 bits of {@code seed}, but possibly in the future more bits will be used.

    + * + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coordinate + * @param x_wrap 0, or a power of two value that specifies the x wraparound coordinate + * @param y_wrap 0, or a power of two value that specifies the y wraparound coordinate + * @param z_wrap 0, or a power of two value that specifies the z wraparound coordinate + * @param seed selects from multiple different variations of the noise function + */ + public static native float stb_perlin_noise3_seed(float x, float y, float z, int x_wrap, int y_wrap, int z_wrap, int seed); + + // --- [ stb_perlin_ridge_noise3 ] --- + + /** + * Computes ridged noise. Calls {@link #stb_perlin_noise3 perlin_noise3} {@code octaves} times, so this parameter will affect runtime. + * + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coordinate + * @param lacunarity spacing between successive octaves (use exactly 2.0 for wrapping output) + * @param gain relative weighting applied to each successive octave + * @param offset used to invert the ridges, may need to be larger, not sure + * @param octaves number of "octaves" of {@code noise3()} to sum + */ + public static native float stb_perlin_ridge_noise3(float x, float y, float z, float lacunarity, float gain, float offset, int octaves); + + // --- [ stb_perlin_fbm_noise3 ] --- + + /** + * Computes Fractal Brownian Motion noise. Calls {@link #stb_perlin_noise3 perlin_noise3} {@code octaves} times, so this parameter will affect runtime. + * + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coordinate + * @param lacunarity spacing between successive octaves (use exactly 2.0 for wrapping output) + * @param gain relative weighting applied to each successive octave + * @param octaves number of "octaves" of {@code noise3()} to sum + */ + public static native float stb_perlin_fbm_noise3(float x, float y, float z, float lacunarity, float gain, int octaves); + + // --- [ stb_perlin_turbulence_noise3 ] --- + + /** + * Computes turbulence noise. Calls {@link #stb_perlin_noise3 perlin_noise3} {@code octaves} times, so this parameter will affect runtime. + * + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coordinate + * @param lacunarity spacing between successive octaves (use exactly 2.0 for wrapping output) + * @param gain relative weighting applied to each successive octave + * @param octaves number of "octaves" of {@code noise3()} to sum + */ + public static native float stb_perlin_turbulence_noise3(float x, float y, float z, float lacunarity, float gain, int octaves); + + // --- [ stb_perlin_noise3_wrap_nonpow2 ] --- + + public static native float stb_perlin_noise3_wrap_nonpow2(float x, float y, float z, int x_wrap, int y_wrap, int z_wrap, @NativeType("unsigned char") byte seed); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPContext.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPContext.java new file mode 100644 index 000000000..b3834bfff --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPContext.java @@ -0,0 +1,356 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * The opaque {@code stbrp_context} struct. + * + *

    Layout

    + * + *
    
    + * struct stbrp_context {
    + *     int width;
    + *     int height;
    + *     int align;
    + *     int init_mode;
    + *     int heuristic;
    + *     int num_nodes;
    + *     {@link STBRPNode stbrp_node} * active_head;
    + *     {@link STBRPNode stbrp_node} * free_head;
    + *     {@link STBRPNode stbrp_node} {@link #extra}[2];
    + * }
    + */ +@NativeType("struct stbrp_context") +public class STBRPContext extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + WIDTH, + HEIGHT, + ALIGN, + INIT_MODE, + HEURISTIC, + NUM_NODES, + ACTIVE_HEAD, + FREE_HEAD, + EXTRA; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __array(STBRPNode.SIZEOF, STBRPNode.ALIGNOF, 2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + WIDTH = layout.offsetof(0); + HEIGHT = layout.offsetof(1); + ALIGN = layout.offsetof(2); + INIT_MODE = layout.offsetof(3); + HEURISTIC = layout.offsetof(4); + NUM_NODES = layout.offsetof(5); + ACTIVE_HEAD = layout.offsetof(6); + FREE_HEAD = layout.offsetof(7); + EXTRA = layout.offsetof(8); + } + + protected STBRPContext(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBRPContext create(long address, @Nullable ByteBuffer container) { + return new STBRPContext(address, container); + } + + /** + * Creates a {@code STBRPContext} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBRPContext(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code width} field. */ + public int width() { return nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return nheight(address()); } + /** @return the value of the {@code align} field. */ + public int align() { return nalign(address()); } + /** @return the value of the {@code init_mode} field. */ + public int init_mode() { return ninit_mode(address()); } + /** @return the value of the {@code heuristic} field. */ + public int heuristic() { return nheuristic(address()); } + /** @return the value of the {@code num_nodes} field. */ + public int num_nodes() { return nnum_nodes(address()); } + /** @return a {@link STBRPNode} view of the struct pointed to by the {@code active_head} field. */ + @Nullable + @NativeType("stbrp_node *") + public STBRPNode active_head() { return nactive_head(address()); } + /** @return a {@link STBRPNode} view of the struct pointed to by the {@code free_head} field. */ + @Nullable + @NativeType("stbrp_node *") + public STBRPNode free_head() { return nfree_head(address()); } + /** we allocate two extra nodes so optimal user-node-count is {@code width} not {@code width+2} */ + @NativeType("stbrp_node[2]") + public STBRPNode.Buffer extra() { return nextra(address()); } + /** we allocate two extra nodes so optimal user-node-count is {@code width} not {@code width+2} */ + @NativeType("stbrp_node") + public STBRPNode extra(int index) { return nextra(address(), index); } + + // ----------------------------------- + + /** Returns a new {@code STBRPContext} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBRPContext malloc() { + return new STBRPContext(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBRPContext} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBRPContext calloc() { + return new STBRPContext(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBRPContext} instance allocated with {@link BufferUtils}. */ + public static STBRPContext create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBRPContext(memAddress(container), container); + } + + /** Returns a new {@code STBRPContext} instance for the specified memory address. */ + public static STBRPContext create(long address) { + return new STBRPContext(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBRPContext createSafe(long address) { + return address == NULL ? null : new STBRPContext(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBRPContext mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBRPContext callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBRPContext mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBRPContext callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBRPContext} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBRPContext malloc(MemoryStack stack) { + return new STBRPContext(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBRPContext} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBRPContext calloc(MemoryStack stack) { + return new STBRPContext(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + STBRPContext.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + STBRPContext.HEIGHT); } + /** Unsafe version of {@link #align}. */ + public static int nalign(long struct) { return UNSAFE.getInt(null, struct + STBRPContext.ALIGN); } + /** Unsafe version of {@link #init_mode}. */ + public static int ninit_mode(long struct) { return UNSAFE.getInt(null, struct + STBRPContext.INIT_MODE); } + /** Unsafe version of {@link #heuristic}. */ + public static int nheuristic(long struct) { return UNSAFE.getInt(null, struct + STBRPContext.HEURISTIC); } + /** Unsafe version of {@link #num_nodes}. */ + public static int nnum_nodes(long struct) { return UNSAFE.getInt(null, struct + STBRPContext.NUM_NODES); } + /** Unsafe version of {@link #active_head}. */ + @Nullable public static STBRPNode nactive_head(long struct) { return STBRPNode.createSafe(memGetAddress(struct + STBRPContext.ACTIVE_HEAD)); } + /** Unsafe version of {@link #free_head}. */ + @Nullable public static STBRPNode nfree_head(long struct) { return STBRPNode.createSafe(memGetAddress(struct + STBRPContext.FREE_HEAD)); } + /** Unsafe version of {@link #extra}. */ + public static STBRPNode.Buffer nextra(long struct) { return STBRPNode.create(struct + STBRPContext.EXTRA, 2); } + /** Unsafe version of {@link #extra(int) extra}. */ + public static STBRPNode nextra(long struct, int index) { + return STBRPNode.create(struct + STBRPContext.EXTRA + check(index, 2) * STBRPNode.SIZEOF); + } + + // ----------------------------------- + + /** An array of {@link STBRPContext} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBRPContext ELEMENT_FACTORY = STBRPContext.create(-1L); + + /** + * Creates a new {@code STBRPContext.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBRPContext#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBRPContext getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code width} field. */ + public int width() { return STBRPContext.nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return STBRPContext.nheight(address()); } + /** @return the value of the {@code align} field. */ + public int align() { return STBRPContext.nalign(address()); } + /** @return the value of the {@code init_mode} field. */ + public int init_mode() { return STBRPContext.ninit_mode(address()); } + /** @return the value of the {@code heuristic} field. */ + public int heuristic() { return STBRPContext.nheuristic(address()); } + /** @return the value of the {@code num_nodes} field. */ + public int num_nodes() { return STBRPContext.nnum_nodes(address()); } + /** @return a {@link STBRPNode} view of the struct pointed to by the {@code active_head} field. */ + @Nullable + @NativeType("stbrp_node *") + public STBRPNode active_head() { return STBRPContext.nactive_head(address()); } + /** @return a {@link STBRPNode} view of the struct pointed to by the {@code free_head} field. */ + @Nullable + @NativeType("stbrp_node *") + public STBRPNode free_head() { return STBRPContext.nfree_head(address()); } + /** @return a {@link STBRPNode}.Buffer view of the {@link STBRPContext#extra} field. */ + @NativeType("stbrp_node[2]") + public STBRPNode.Buffer extra() { return STBRPContext.nextra(address()); } + /** @return a {@link STBRPNode} view of the struct at the specified index of the {@link STBRPContext#extra} field. */ + @NativeType("stbrp_node") + public STBRPNode extra(int index) { return STBRPContext.nextra(address(), index); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPNode.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPNode.java new file mode 100644 index 000000000..244f1efb3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPNode.java @@ -0,0 +1,283 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * The opaque {@code stbrp_node} struct. + * + *

    Layout

    + * + *
    
    + * struct stbrp_node {
    + *     stbrp_coord x;
    + *     stbrp_coord y;
    + *     {@link STBRPNode stbrp_node} * next;
    + * }
    + */ +@NativeType("struct stbrp_node") +public class STBRPNode extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X, + Y, + NEXT; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X = layout.offsetof(0); + Y = layout.offsetof(1); + NEXT = layout.offsetof(2); + } + + protected STBRPNode(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBRPNode create(long address, @Nullable ByteBuffer container) { + return new STBRPNode(address, container); + } + + /** + * Creates a {@code STBRPNode} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBRPNode(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code x} field. */ + @NativeType("stbrp_coord") + public int x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + @NativeType("stbrp_coord") + public int y() { return ny(address()); } + /** @return a {@link STBRPNode} view of the struct pointed to by the {@code next} field. */ + @Nullable + @NativeType("stbrp_node *") + public STBRPNode next() { return nnext(address()); } + + // ----------------------------------- + + /** Returns a new {@code STBRPNode} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBRPNode malloc() { + return new STBRPNode(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBRPNode} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBRPNode calloc() { + return new STBRPNode(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBRPNode} instance allocated with {@link BufferUtils}. */ + public static STBRPNode create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBRPNode(memAddress(container), container); + } + + /** Returns a new {@code STBRPNode} instance for the specified memory address. */ + public static STBRPNode create(long address) { + return new STBRPNode(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBRPNode createSafe(long address) { + return address == NULL ? null : new STBRPNode(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBRPNode mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBRPNode callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBRPNode mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBRPNode callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBRPNode} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBRPNode malloc(MemoryStack stack) { + return new STBRPNode(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBRPNode} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBRPNode calloc(MemoryStack stack) { + return new STBRPNode(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + STBRPNode.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + STBRPNode.Y); } + /** Unsafe version of {@link #next}. */ + @Nullable public static STBRPNode nnext(long struct) { return STBRPNode.createSafe(memGetAddress(struct + STBRPNode.NEXT)); } + + // ----------------------------------- + + /** An array of {@link STBRPNode} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBRPNode ELEMENT_FACTORY = STBRPNode.create(-1L); + + /** + * Creates a new {@code STBRPNode.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBRPNode#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBRPNode getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code x} field. */ + @NativeType("stbrp_coord") + public int x() { return STBRPNode.nx(address()); } + /** @return the value of the {@code y} field. */ + @NativeType("stbrp_coord") + public int y() { return STBRPNode.ny(address()); } + /** @return a {@link STBRPNode} view of the struct pointed to by the {@code next} field. */ + @Nullable + @NativeType("stbrp_node *") + public STBRPNode next() { return STBRPNode.nnext(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPRect.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPRect.java new file mode 100644 index 000000000..ccb916ffe --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRPRect.java @@ -0,0 +1,385 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A packed rectangle. + * + *

    Layout

    + * + *
    
    + * struct stbrp_rect {
    + *     int {@link #id};
    + *     stbrp_coord {@link #w};
    + *     stbrp_coord {@link #h};
    + *     stbrp_coord {@link #x};
    + *     stbrp_coord {@link #y};
    + *     int {@link #was_packed};
    + * }
    + */ +@NativeType("struct stbrp_rect") +public class STBRPRect extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ID, + W, + H, + X, + Y, + WAS_PACKED; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + ID = layout.offsetof(0); + W = layout.offsetof(1); + H = layout.offsetof(2); + X = layout.offsetof(3); + Y = layout.offsetof(4); + WAS_PACKED = layout.offsetof(5); + } + + protected STBRPRect(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBRPRect create(long address, @Nullable ByteBuffer container) { + return new STBRPRect(address, container); + } + + /** + * Creates a {@code STBRPRect} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBRPRect(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** reserved for your use */ + public int id() { return nid(address()); } + /** input width */ + @NativeType("stbrp_coord") + public int w() { return nw(address()); } + /** input height */ + @NativeType("stbrp_coord") + public int h() { return nh(address()); } + /** output x coordinate */ + @NativeType("stbrp_coord") + public int x() { return nx(address()); } + /** output y coordinate */ + @NativeType("stbrp_coord") + public int y() { return ny(address()); } + /** non-zero if valid packing */ + @NativeType("int") + public boolean was_packed() { return nwas_packed(address()) != 0; } + + /** Sets the specified value to the {@link #id} field. */ + public STBRPRect id(int value) { nid(address(), value); return this; } + /** Sets the specified value to the {@link #w} field. */ + public STBRPRect w(@NativeType("stbrp_coord") int value) { nw(address(), value); return this; } + /** Sets the specified value to the {@link #h} field. */ + public STBRPRect h(@NativeType("stbrp_coord") int value) { nh(address(), value); return this; } + /** Sets the specified value to the {@link #x} field. */ + public STBRPRect x(@NativeType("stbrp_coord") int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@link #y} field. */ + public STBRPRect y(@NativeType("stbrp_coord") int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@link #was_packed} field. */ + public STBRPRect was_packed(@NativeType("int") boolean value) { nwas_packed(address(), value ? 1 : 0); return this; } + + /** Initializes this struct with the specified values. */ + public STBRPRect set( + int id, + int w, + int h, + int x, + int y, + boolean was_packed + ) { + id(id); + w(w); + h(h); + x(x); + y(y); + was_packed(was_packed); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public STBRPRect set(STBRPRect src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code STBRPRect} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBRPRect malloc() { + return new STBRPRect(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBRPRect} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBRPRect calloc() { + return new STBRPRect(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBRPRect} instance allocated with {@link BufferUtils}. */ + public static STBRPRect create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBRPRect(memAddress(container), container); + } + + /** Returns a new {@code STBRPRect} instance for the specified memory address. */ + public static STBRPRect create(long address) { + return new STBRPRect(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBRPRect createSafe(long address) { + return address == NULL ? null : new STBRPRect(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBRPRect mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBRPRect callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBRPRect mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBRPRect callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBRPRect} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBRPRect malloc(MemoryStack stack) { + return new STBRPRect(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBRPRect} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBRPRect calloc(MemoryStack stack) { + return new STBRPRect(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #id}. */ + public static int nid(long struct) { return UNSAFE.getInt(null, struct + STBRPRect.ID); } + /** Unsafe version of {@link #w}. */ + public static int nw(long struct) { return UNSAFE.getInt(null, struct + STBRPRect.W); } + /** Unsafe version of {@link #h}. */ + public static int nh(long struct) { return UNSAFE.getInt(null, struct + STBRPRect.H); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + STBRPRect.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + STBRPRect.Y); } + /** Unsafe version of {@link #was_packed}. */ + public static int nwas_packed(long struct) { return UNSAFE.getInt(null, struct + STBRPRect.WAS_PACKED); } + + /** Unsafe version of {@link #id(int) id}. */ + public static void nid(long struct, int value) { UNSAFE.putInt(null, struct + STBRPRect.ID, value); } + /** Unsafe version of {@link #w(int) w}. */ + public static void nw(long struct, int value) { UNSAFE.putInt(null, struct + STBRPRect.W, value); } + /** Unsafe version of {@link #h(int) h}. */ + public static void nh(long struct, int value) { UNSAFE.putInt(null, struct + STBRPRect.H, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + STBRPRect.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + STBRPRect.Y, value); } + /** Unsafe version of {@link #was_packed(boolean) was_packed}. */ + public static void nwas_packed(long struct, int value) { UNSAFE.putInt(null, struct + STBRPRect.WAS_PACKED, value); } + + // ----------------------------------- + + /** An array of {@link STBRPRect} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBRPRect ELEMENT_FACTORY = STBRPRect.create(-1L); + + /** + * Creates a new {@code STBRPRect.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBRPRect#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBRPRect getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link STBRPRect#id} field. */ + public int id() { return STBRPRect.nid(address()); } + /** @return the value of the {@link STBRPRect#w} field. */ + @NativeType("stbrp_coord") + public int w() { return STBRPRect.nw(address()); } + /** @return the value of the {@link STBRPRect#h} field. */ + @NativeType("stbrp_coord") + public int h() { return STBRPRect.nh(address()); } + /** @return the value of the {@link STBRPRect#x} field. */ + @NativeType("stbrp_coord") + public int x() { return STBRPRect.nx(address()); } + /** @return the value of the {@link STBRPRect#y} field. */ + @NativeType("stbrp_coord") + public int y() { return STBRPRect.ny(address()); } + /** @return the value of the {@link STBRPRect#was_packed} field. */ + @NativeType("int") + public boolean was_packed() { return STBRPRect.nwas_packed(address()) != 0; } + + /** Sets the specified value to the {@link STBRPRect#id} field. */ + public Buffer id(int value) { STBRPRect.nid(address(), value); return this; } + /** Sets the specified value to the {@link STBRPRect#w} field. */ + public Buffer w(@NativeType("stbrp_coord") int value) { STBRPRect.nw(address(), value); return this; } + /** Sets the specified value to the {@link STBRPRect#h} field. */ + public Buffer h(@NativeType("stbrp_coord") int value) { STBRPRect.nh(address(), value); return this; } + /** Sets the specified value to the {@link STBRPRect#x} field. */ + public Buffer x(@NativeType("stbrp_coord") int value) { STBRPRect.nx(address(), value); return this; } + /** Sets the specified value to the {@link STBRPRect#y} field. */ + public Buffer y(@NativeType("stbrp_coord") int value) { STBRPRect.ny(address(), value); return this; } + /** Sets the specified value to the {@link STBRPRect#was_packed} field. */ + public Buffer was_packed(@NativeType("int") boolean value) { STBRPRect.nwas_packed(address(), value ? 1 : 0); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRectPack.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRectPack.java new file mode 100644 index 000000000..d8ce2e549 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBRectPack.java @@ -0,0 +1,149 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import org.lwjgl.system.*; + +/** + * Native bindings to stb_rect_pack.h from the stb library. + * + *

    Useful for e.g. packing rectangular textures into an atlas. Does not do rotation.

    + * + *

    This library currently uses the Skyline Bottom-Left algorithm. Not necessarily the awesomest packing method, but better than the totally naive one in + * stb_truetype (which is primarily what this is meant to replace).

    + */ +public class STBRectPack { + + static { LibSTB.initialize(); } + + /** Mostly for internal use, but this is the maximum supported coordinate value. */ + public static final int STBRP__MAXVAL = 0x7FFFFFFF; + + /** + * Packing heuristics + * + *
    Enum values:
    + * + *
      + *
    • {@link #STBRP_HEURISTIC_Skyline_default HEURISTIC_Skyline_default}
    • + *
    • {@link #STBRP_HEURISTIC_Skyline_BL_sortHeight HEURISTIC_Skyline_BL_sortHeight}
    • + *
    • {@link #STBRP_HEURISTIC_Skyline_BF_sortHeight HEURISTIC_Skyline_BF_sortHeight}
    • + *
    + */ + public static final int + STBRP_HEURISTIC_Skyline_default = 0, + STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, + STBRP_HEURISTIC_Skyline_BF_sortHeight = 1; + + protected STBRectPack() { + throw new UnsupportedOperationException(); + } + + // --- [ stbrp_pack_rects ] --- + + /** + * Unsafe version of: {@link #stbrp_pack_rects pack_rects} + * + * @param num_rects the number of structs in {@code rects} + */ + public static native int nstbrp_pack_rects(long context, long rects, int num_rects); + + /** + * Assigns packed locations to rectangles. The rectangles are of type {@link STBRPRect}, stored in the array {@code rects}, and there are {@code num_rects} many + * of them. + * + *

    Rectangles which are successfully packed have the {@code was_packed} flag set to a non-zero value and {@code x} and {@code y} store the minimum + * location on each axis (i.e. bottom-left in cartesian coordinates, top-left if you imagine y increasing downwards). Rectangles which do not fit have the + * {@code was_packed} flag set to 0.

    + * + *

    You should not try to access the {@code rects} array from another thread while this function is running, as the function temporarily reorders the array + * while it executes.

    + * + *

    To pack into another rectangle, you need to call {@link #stbrp_init_target init_target} again. To continue packing into the same rectangle, you can call this function again. + * Calling this multiple times with multiple rect arrays will probably produce worse packing results than calling it a single time with the full rectangle + * array, but the option is available.

    + * + * @param context an {@link STBRPContext} struct + * @param rects an array of {@link STBRPRect} structs + * + * @return 1 if all of the rectangles were successfully packed and 0 otherwise + */ + public static int stbrp_pack_rects(@NativeType("stbrp_context *") STBRPContext context, @NativeType("stbrp_rect *") STBRPRect.Buffer rects) { + return nstbrp_pack_rects(context.address(), rects.address(), rects.remaining()); + } + + // --- [ stbrp_init_target ] --- + + /** + * Unsafe version of: {@link #stbrp_init_target init_target} + * + * @param num_nodes the number of structs in {@code nodes} + */ + public static native void nstbrp_init_target(long context, int width, int height, long nodes, int num_nodes); + + /** + * Initialize a rectangle packer to: pack a rectangle that is {@code width} by {@code height} in dimensions using temporary storage provided by the array + * {@code nodes}, which is {@code num_nodes} long. + * + *

    You must call this function every time you start packing into a new target.

    + * + *

    There is no "shutdown" function. The {@code nodes} memory must stay valid for the following {@link #stbrp_pack_rects pack_rects} call (or calls), but can be freed after the + * call (or calls) finish.

    + * + *

    Note: to guarantee best results, either:

    + * + *
      + *
    1. make sure {@code num_nodes ≥ width}
    2. + *
    3. or, call {@link #stbrp_setup_allow_out_of_mem setup_allow_out_of_mem} with {@code allow_out_of_mem = 1}
    4. + *
    + * + *

    If you don't do either of the above things, widths will be quantized to multiples of small integers to guarantee the algorithm doesn't run out of + * temporary storage.

    + * + *

    If you do #2, then the non-quantized algorithm will be used, but the algorithm may run out of temporary storage and be unable to pack some rectangles.

    + * + * @param context an {@link STBRPContext} struct + * @param width the rectangle width + * @param height the rectangle height + * @param nodes an array of {@link STBRPNode} structs + */ + public static void stbrp_init_target(@NativeType("stbrp_context *") STBRPContext context, int width, int height, @NativeType("stbrp_node *") STBRPNode.Buffer nodes) { + nstbrp_init_target(context.address(), width, height, nodes.address(), nodes.remaining()); + } + + // --- [ stbrp_setup_allow_out_of_mem ] --- + + /** Unsafe version of: {@link #stbrp_setup_allow_out_of_mem setup_allow_out_of_mem} */ + public static native void nstbrp_setup_allow_out_of_mem(long context, int allow_out_of_mem); + + /** + * Optionally call this function after init but before doing any packing to change the handling of the out-of-temp-memory scenario, described in + * {@link #stbrp_init_target init_target}. If you call init again, this will be reset to the default (false). + * + * @param context an {@link STBRPContext} struct + * @param allow_out_of_mem 1 to allow running out of temporary storage + */ + public static void stbrp_setup_allow_out_of_mem(@NativeType("stbrp_context *") STBRPContext context, @NativeType("int") boolean allow_out_of_mem) { + nstbrp_setup_allow_out_of_mem(context.address(), allow_out_of_mem ? 1 : 0); + } + + // --- [ stbrp_setup_heuristic ] --- + + /** Unsafe version of: {@link #stbrp_setup_heuristic setup_heuristic} */ + public static native void nstbrp_setup_heuristic(long context, int heuristic); + + /** + * Optionally select which packing heuristic the library should use. Different heuristics will produce better/worse results for different data sets. If + * you call init again, this will be reset to the default. + * + * @param context an {@link STBRPContext} struct + * @param heuristic the packing heuristic + */ + public static void stbrp_setup_heuristic(@NativeType("stbrp_context *") STBRPContext context, int heuristic) { + nstbrp_setup_heuristic(context.address(), heuristic); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTAlignedQuad.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTAlignedQuad.java new file mode 100644 index 000000000..544ddb910 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTAlignedQuad.java @@ -0,0 +1,325 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Quad used for drawing a baked character, returned by {@link STBTruetype#stbtt_GetBakedQuad GetBakedQuad}. + * + *

    Layout

    + * + *
    
    + * struct stbtt_aligned_quad {
    + *     float x0;
    + *     float y0;
    + *     float s0;
    + *     float t0;
    + *     float x1;
    + *     float y1;
    + *     float s1;
    + *     float t1;
    + * }
    + */ +@NativeType("struct stbtt_aligned_quad") +public class STBTTAlignedQuad extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X0, + Y0, + S0, + T0, + X1, + Y1, + S1, + T1; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X0 = layout.offsetof(0); + Y0 = layout.offsetof(1); + S0 = layout.offsetof(2); + T0 = layout.offsetof(3); + X1 = layout.offsetof(4); + Y1 = layout.offsetof(5); + S1 = layout.offsetof(6); + T1 = layout.offsetof(7); + } + + protected STBTTAlignedQuad(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBTTAlignedQuad create(long address, @Nullable ByteBuffer container) { + return new STBTTAlignedQuad(address, container); + } + + /** + * Creates a {@code STBTTAlignedQuad} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBTTAlignedQuad(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code x0} field. */ + public float x0() { return nx0(address()); } + /** @return the value of the {@code y0} field. */ + public float y0() { return ny0(address()); } + /** @return the value of the {@code s0} field. */ + public float s0() { return ns0(address()); } + /** @return the value of the {@code t0} field. */ + public float t0() { return nt0(address()); } + /** @return the value of the {@code x1} field. */ + public float x1() { return nx1(address()); } + /** @return the value of the {@code y1} field. */ + public float y1() { return ny1(address()); } + /** @return the value of the {@code s1} field. */ + public float s1() { return ns1(address()); } + /** @return the value of the {@code t1} field. */ + public float t1() { return nt1(address()); } + + // ----------------------------------- + + /** Returns a new {@code STBTTAlignedQuad} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBTTAlignedQuad malloc() { + return new STBTTAlignedQuad(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBTTAlignedQuad} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBTTAlignedQuad calloc() { + return new STBTTAlignedQuad(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBTTAlignedQuad} instance allocated with {@link BufferUtils}. */ + public static STBTTAlignedQuad create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBTTAlignedQuad(memAddress(container), container); + } + + /** Returns a new {@code STBTTAlignedQuad} instance for the specified memory address. */ + public static STBTTAlignedQuad create(long address) { + return new STBTTAlignedQuad(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBTTAlignedQuad createSafe(long address) { + return address == NULL ? null : new STBTTAlignedQuad(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTAlignedQuad mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTAlignedQuad callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTAlignedQuad mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTAlignedQuad callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBTTAlignedQuad} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBTTAlignedQuad malloc(MemoryStack stack) { + return new STBTTAlignedQuad(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBTTAlignedQuad} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBTTAlignedQuad calloc(MemoryStack stack) { + return new STBTTAlignedQuad(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x0}. */ + public static float nx0(long struct) { return UNSAFE.getFloat(null, struct + STBTTAlignedQuad.X0); } + /** Unsafe version of {@link #y0}. */ + public static float ny0(long struct) { return UNSAFE.getFloat(null, struct + STBTTAlignedQuad.Y0); } + /** Unsafe version of {@link #s0}. */ + public static float ns0(long struct) { return UNSAFE.getFloat(null, struct + STBTTAlignedQuad.S0); } + /** Unsafe version of {@link #t0}. */ + public static float nt0(long struct) { return UNSAFE.getFloat(null, struct + STBTTAlignedQuad.T0); } + /** Unsafe version of {@link #x1}. */ + public static float nx1(long struct) { return UNSAFE.getFloat(null, struct + STBTTAlignedQuad.X1); } + /** Unsafe version of {@link #y1}. */ + public static float ny1(long struct) { return UNSAFE.getFloat(null, struct + STBTTAlignedQuad.Y1); } + /** Unsafe version of {@link #s1}. */ + public static float ns1(long struct) { return UNSAFE.getFloat(null, struct + STBTTAlignedQuad.S1); } + /** Unsafe version of {@link #t1}. */ + public static float nt1(long struct) { return UNSAFE.getFloat(null, struct + STBTTAlignedQuad.T1); } + + // ----------------------------------- + + /** An array of {@link STBTTAlignedQuad} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBTTAlignedQuad ELEMENT_FACTORY = STBTTAlignedQuad.create(-1L); + + /** + * Creates a new {@code STBTTAlignedQuad.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBTTAlignedQuad#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBTTAlignedQuad getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code x0} field. */ + public float x0() { return STBTTAlignedQuad.nx0(address()); } + /** @return the value of the {@code y0} field. */ + public float y0() { return STBTTAlignedQuad.ny0(address()); } + /** @return the value of the {@code s0} field. */ + public float s0() { return STBTTAlignedQuad.ns0(address()); } + /** @return the value of the {@code t0} field. */ + public float t0() { return STBTTAlignedQuad.nt0(address()); } + /** @return the value of the {@code x1} field. */ + public float x1() { return STBTTAlignedQuad.nx1(address()); } + /** @return the value of the {@code y1} field. */ + public float y1() { return STBTTAlignedQuad.ny1(address()); } + /** @return the value of the {@code s1} field. */ + public float s1() { return STBTTAlignedQuad.ns1(address()); } + /** @return the value of the {@code t1} field. */ + public float t1() { return STBTTAlignedQuad.nt1(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTBakedChar.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTBakedChar.java new file mode 100644 index 000000000..0f5963085 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTBakedChar.java @@ -0,0 +1,323 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Baked character data, returned by {@link STBTruetype#stbtt_BakeFontBitmap BakeFontBitmap}. + * + *

    Layout

    + * + *
    
    + * struct stbtt_bakedchar {
    + *     unsigned short x0;
    + *     unsigned short y0;
    + *     unsigned short x1;
    + *     unsigned short y1;
    + *     float xoff;
    + *     float yoff;
    + *     float xadvance;
    + * }
    + */ +@NativeType("struct stbtt_bakedchar") +public class STBTTBakedChar extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X0, + Y0, + X1, + Y1, + XOFF, + YOFF, + XADVANCE; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(2), + __member(2), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X0 = layout.offsetof(0); + Y0 = layout.offsetof(1); + X1 = layout.offsetof(2); + Y1 = layout.offsetof(3); + XOFF = layout.offsetof(4); + YOFF = layout.offsetof(5); + XADVANCE = layout.offsetof(6); + } + + protected STBTTBakedChar(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBTTBakedChar create(long address, @Nullable ByteBuffer container) { + return new STBTTBakedChar(address, container); + } + + /** + * Creates a {@code STBTTBakedChar} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBTTBakedChar(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code x0} field. */ + @NativeType("unsigned short") + public short x0() { return nx0(address()); } + /** @return the value of the {@code y0} field. */ + @NativeType("unsigned short") + public short y0() { return ny0(address()); } + /** @return the value of the {@code x1} field. */ + @NativeType("unsigned short") + public short x1() { return nx1(address()); } + /** @return the value of the {@code y1} field. */ + @NativeType("unsigned short") + public short y1() { return ny1(address()); } + /** @return the value of the {@code xoff} field. */ + public float xoff() { return nxoff(address()); } + /** @return the value of the {@code yoff} field. */ + public float yoff() { return nyoff(address()); } + /** @return the value of the {@code xadvance} field. */ + public float xadvance() { return nxadvance(address()); } + + // ----------------------------------- + + /** Returns a new {@code STBTTBakedChar} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBTTBakedChar malloc() { + return new STBTTBakedChar(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBTTBakedChar} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBTTBakedChar calloc() { + return new STBTTBakedChar(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBTTBakedChar} instance allocated with {@link BufferUtils}. */ + public static STBTTBakedChar create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBTTBakedChar(memAddress(container), container); + } + + /** Returns a new {@code STBTTBakedChar} instance for the specified memory address. */ + public static STBTTBakedChar create(long address) { + return new STBTTBakedChar(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBTTBakedChar createSafe(long address) { + return address == NULL ? null : new STBTTBakedChar(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTBakedChar mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTBakedChar callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTBakedChar mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTBakedChar callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBTTBakedChar} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBTTBakedChar malloc(MemoryStack stack) { + return new STBTTBakedChar(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBTTBakedChar} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBTTBakedChar calloc(MemoryStack stack) { + return new STBTTBakedChar(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x0}. */ + public static short nx0(long struct) { return UNSAFE.getShort(null, struct + STBTTBakedChar.X0); } + /** Unsafe version of {@link #y0}. */ + public static short ny0(long struct) { return UNSAFE.getShort(null, struct + STBTTBakedChar.Y0); } + /** Unsafe version of {@link #x1}. */ + public static short nx1(long struct) { return UNSAFE.getShort(null, struct + STBTTBakedChar.X1); } + /** Unsafe version of {@link #y1}. */ + public static short ny1(long struct) { return UNSAFE.getShort(null, struct + STBTTBakedChar.Y1); } + /** Unsafe version of {@link #xoff}. */ + public static float nxoff(long struct) { return UNSAFE.getFloat(null, struct + STBTTBakedChar.XOFF); } + /** Unsafe version of {@link #yoff}. */ + public static float nyoff(long struct) { return UNSAFE.getFloat(null, struct + STBTTBakedChar.YOFF); } + /** Unsafe version of {@link #xadvance}. */ + public static float nxadvance(long struct) { return UNSAFE.getFloat(null, struct + STBTTBakedChar.XADVANCE); } + + // ----------------------------------- + + /** An array of {@link STBTTBakedChar} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBTTBakedChar ELEMENT_FACTORY = STBTTBakedChar.create(-1L); + + /** + * Creates a new {@code STBTTBakedChar.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBTTBakedChar#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBTTBakedChar getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code x0} field. */ + @NativeType("unsigned short") + public short x0() { return STBTTBakedChar.nx0(address()); } + /** @return the value of the {@code y0} field. */ + @NativeType("unsigned short") + public short y0() { return STBTTBakedChar.ny0(address()); } + /** @return the value of the {@code x1} field. */ + @NativeType("unsigned short") + public short x1() { return STBTTBakedChar.nx1(address()); } + /** @return the value of the {@code y1} field. */ + @NativeType("unsigned short") + public short y1() { return STBTTBakedChar.ny1(address()); } + /** @return the value of the {@code xoff} field. */ + public float xoff() { return STBTTBakedChar.nxoff(address()); } + /** @return the value of the {@code yoff} field. */ + public float yoff() { return STBTTBakedChar.nyoff(address()); } + /** @return the value of the {@code xadvance} field. */ + public float xadvance() { return STBTTBakedChar.nxadvance(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTBitmap.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTBitmap.java new file mode 100644 index 000000000..5082dc568 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTBitmap.java @@ -0,0 +1,359 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Bitmap data. + * + *

    Layout

    + * + *
    
    + * struct stbtt__bitmap {
    + *     int {@link #w};
    + *     int {@link #h};
    + *     int {@link #stride};
    + *     unsigned char * {@link #pixels};
    + * }
    + */ +@NativeType("struct stbtt__bitmap") +public class STBTTBitmap extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + W, + H, + STRIDE, + PIXELS; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + W = layout.offsetof(0); + H = layout.offsetof(1); + STRIDE = layout.offsetof(2); + PIXELS = layout.offsetof(3); + } + + protected STBTTBitmap(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBTTBitmap create(long address, @Nullable ByteBuffer container) { + return new STBTTBitmap(address, container); + } + + /** + * Creates a {@code STBTTBitmap} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBTTBitmap(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the bitmap width */ + public int w() { return nw(address()); } + /** the bitmap height */ + public int h() { return nh(address()); } + /** the row stride, in bytes */ + public int stride() { return nstride(address()); } + /** + * @param capacity the number of elements in the returned buffer + * + * @return the bitmap data + */ + @NativeType("unsigned char *") + public ByteBuffer pixels(int capacity) { return npixels(address(), capacity); } + + /** Sets the specified value to the {@link #w} field. */ + public STBTTBitmap w(int value) { nw(address(), value); return this; } + /** Sets the specified value to the {@link #h} field. */ + public STBTTBitmap h(int value) { nh(address(), value); return this; } + /** Sets the specified value to the {@link #stride} field. */ + public STBTTBitmap stride(int value) { nstride(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@link #pixels} field. */ + public STBTTBitmap pixels(@NativeType("unsigned char *") ByteBuffer value) { npixels(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public STBTTBitmap set( + int w, + int h, + int stride, + ByteBuffer pixels + ) { + w(w); + h(h); + stride(stride); + pixels(pixels); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public STBTTBitmap set(STBTTBitmap src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code STBTTBitmap} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBTTBitmap malloc() { + return new STBTTBitmap(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBTTBitmap} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBTTBitmap calloc() { + return new STBTTBitmap(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBTTBitmap} instance allocated with {@link BufferUtils}. */ + public static STBTTBitmap create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBTTBitmap(memAddress(container), container); + } + + /** Returns a new {@code STBTTBitmap} instance for the specified memory address. */ + public static STBTTBitmap create(long address) { + return new STBTTBitmap(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBTTBitmap createSafe(long address) { + return address == NULL ? null : new STBTTBitmap(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTBitmap mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTBitmap callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTBitmap mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTBitmap callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBTTBitmap} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBTTBitmap malloc(MemoryStack stack) { + return new STBTTBitmap(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBTTBitmap} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBTTBitmap calloc(MemoryStack stack) { + return new STBTTBitmap(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #w}. */ + public static int nw(long struct) { return UNSAFE.getInt(null, struct + STBTTBitmap.W); } + /** Unsafe version of {@link #h}. */ + public static int nh(long struct) { return UNSAFE.getInt(null, struct + STBTTBitmap.H); } + /** Unsafe version of {@link #stride}. */ + public static int nstride(long struct) { return UNSAFE.getInt(null, struct + STBTTBitmap.STRIDE); } + /** Unsafe version of {@link #pixels(int) pixels}. */ + public static ByteBuffer npixels(long struct, int capacity) { return memByteBuffer(memGetAddress(struct + STBTTBitmap.PIXELS), capacity); } + + /** Unsafe version of {@link #w(int) w}. */ + public static void nw(long struct, int value) { UNSAFE.putInt(null, struct + STBTTBitmap.W, value); } + /** Unsafe version of {@link #h(int) h}. */ + public static void nh(long struct, int value) { UNSAFE.putInt(null, struct + STBTTBitmap.H, value); } + /** Unsafe version of {@link #stride(int) stride}. */ + public static void nstride(long struct, int value) { UNSAFE.putInt(null, struct + STBTTBitmap.STRIDE, value); } + /** Unsafe version of {@link #pixels(ByteBuffer) pixels}. */ + public static void npixels(long struct, ByteBuffer value) { memPutAddress(struct + STBTTBitmap.PIXELS, memAddress(value)); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + STBTTBitmap.PIXELS)); + } + + // ----------------------------------- + + /** An array of {@link STBTTBitmap} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBTTBitmap ELEMENT_FACTORY = STBTTBitmap.create(-1L); + + /** + * Creates a new {@code STBTTBitmap.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBTTBitmap#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBTTBitmap getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link STBTTBitmap#w} field. */ + public int w() { return STBTTBitmap.nw(address()); } + /** @return the value of the {@link STBTTBitmap#h} field. */ + public int h() { return STBTTBitmap.nh(address()); } + /** @return the value of the {@link STBTTBitmap#stride} field. */ + public int stride() { return STBTTBitmap.nstride(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@link STBTTBitmap#pixels} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned char *") + public ByteBuffer pixels(int capacity) { return STBTTBitmap.npixels(address(), capacity); } + + /** Sets the specified value to the {@link STBTTBitmap#w} field. */ + public Buffer w(int value) { STBTTBitmap.nw(address(), value); return this; } + /** Sets the specified value to the {@link STBTTBitmap#h} field. */ + public Buffer h(int value) { STBTTBitmap.nh(address(), value); return this; } + /** Sets the specified value to the {@link STBTTBitmap#stride} field. */ + public Buffer stride(int value) { STBTTBitmap.nstride(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@link STBTTBitmap#pixels} field. */ + public Buffer pixels(@NativeType("unsigned char *") ByteBuffer value) { STBTTBitmap.npixels(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTFontinfo.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTFontinfo.java new file mode 100644 index 000000000..85e1db97a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTFontinfo.java @@ -0,0 +1,234 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** An opaque structure that contains font information. */ +@NativeType("struct stbtt_fontinfo") +public class STBTTFontinfo extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + static { + LibSTB.initialize(); + + try (MemoryStack stack = stackPush()) { + IntBuffer offsets = stack.mallocInt(1); + SIZEOF = offsets(memAddress(offsets)); + ALIGNOF = offsets.get(0); + } + } + + private static native int offsets(long buffer); + + protected STBTTFontinfo(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBTTFontinfo create(long address, @Nullable ByteBuffer container) { + return new STBTTFontinfo(address, container); + } + + /** + * Creates a {@code STBTTFontinfo} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBTTFontinfo(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + // ----------------------------------- + + /** Returns a new {@code STBTTFontinfo} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBTTFontinfo malloc() { + return new STBTTFontinfo(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBTTFontinfo} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBTTFontinfo calloc() { + return new STBTTFontinfo(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBTTFontinfo} instance allocated with {@link BufferUtils}. */ + public static STBTTFontinfo create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBTTFontinfo(memAddress(container), container); + } + + /** Returns a new {@code STBTTFontinfo} instance for the specified memory address. */ + public static STBTTFontinfo create(long address) { + return new STBTTFontinfo(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBTTFontinfo createSafe(long address) { + return address == NULL ? null : new STBTTFontinfo(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTFontinfo mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTFontinfo callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTFontinfo mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTFontinfo callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBTTFontinfo} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBTTFontinfo malloc(MemoryStack stack) { + return new STBTTFontinfo(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBTTFontinfo} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBTTFontinfo calloc(MemoryStack stack) { + return new STBTTFontinfo(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + // ----------------------------------- + + /** An array of {@link STBTTFontinfo} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBTTFontinfo ELEMENT_FACTORY = STBTTFontinfo.create(-1L); + + /** + * Creates a new {@code STBTTFontinfo.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBTTFontinfo#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBTTFontinfo getElementFactory() { + return ELEMENT_FACTORY; + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTKerningentry.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTKerningentry.java new file mode 100644 index 000000000..7cf971ebf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTKerningentry.java @@ -0,0 +1,254 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct stbtt_kerningentry {
    + *     int glyph1;
    + *     int glyph2;
    + *     int advance;
    + * }
    + */ +@NativeType("struct stbtt_kerningentry") +public class STBTTKerningentry extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + GLYPH1, + GLYPH2, + ADVANCE; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + GLYPH1 = layout.offsetof(0); + GLYPH2 = layout.offsetof(1); + ADVANCE = layout.offsetof(2); + } + + protected STBTTKerningentry(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBTTKerningentry create(long address, @Nullable ByteBuffer container) { + return new STBTTKerningentry(address, container); + } + + /** + * Creates a {@code STBTTKerningentry} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBTTKerningentry(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code glyph1} field. */ + public int glyph1() { return nglyph1(address()); } + /** @return the value of the {@code glyph2} field. */ + public int glyph2() { return nglyph2(address()); } + /** @return the value of the {@code advance} field. */ + public int advance() { return nadvance(address()); } + + // ----------------------------------- + + /** Returns a new {@code STBTTKerningentry} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBTTKerningentry malloc() { + return new STBTTKerningentry(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBTTKerningentry} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBTTKerningentry calloc() { + return new STBTTKerningentry(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBTTKerningentry} instance allocated with {@link BufferUtils}. */ + public static STBTTKerningentry create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBTTKerningentry(memAddress(container), container); + } + + /** Returns a new {@code STBTTKerningentry} instance for the specified memory address. */ + public static STBTTKerningentry create(long address) { + return new STBTTKerningentry(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBTTKerningentry createSafe(long address) { + return address == NULL ? null : new STBTTKerningentry(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code STBTTKerningentry} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBTTKerningentry malloc(MemoryStack stack) { + return new STBTTKerningentry(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBTTKerningentry} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBTTKerningentry calloc(MemoryStack stack) { + return new STBTTKerningentry(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #glyph1}. */ + public static int nglyph1(long struct) { return UNSAFE.getInt(null, struct + STBTTKerningentry.GLYPH1); } + /** Unsafe version of {@link #glyph2}. */ + public static int nglyph2(long struct) { return UNSAFE.getInt(null, struct + STBTTKerningentry.GLYPH2); } + /** Unsafe version of {@link #advance}. */ + public static int nadvance(long struct) { return UNSAFE.getInt(null, struct + STBTTKerningentry.ADVANCE); } + + // ----------------------------------- + + /** An array of {@link STBTTKerningentry} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBTTKerningentry ELEMENT_FACTORY = STBTTKerningentry.create(-1L); + + /** + * Creates a new {@code STBTTKerningentry.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBTTKerningentry#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBTTKerningentry getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code glyph1} field. */ + public int glyph1() { return STBTTKerningentry.nglyph1(address()); } + /** @return the value of the {@code glyph2} field. */ + public int glyph2() { return STBTTKerningentry.nglyph2(address()); } + /** @return the value of the {@code advance} field. */ + public int advance() { return STBTTKerningentry.nadvance(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackContext.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackContext.java new file mode 100644 index 000000000..cadb33239 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackContext.java @@ -0,0 +1,385 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * An opaque structure which holds all the context needed from {@link STBTruetype#stbtt_PackBegin PackBegin} to {@link STBTruetype#stbtt_PackEnd PackEnd}. + * + *

    Layout

    + * + *
    
    + * struct stbtt_pack_context {
    + *     void * user_allocator_context;
    + *     {@link STBRPContext stbrp_context} * pack_info;
    + *     int width;
    + *     int height;
    + *     int stride_in_bytes;
    + *     int padding;
    + *     int skip_missing;
    + *     unsigned int h_oversample;
    + *     unsigned int v_oversample;
    + *     unsigned char * pixels;
    + *     {@link STBRPNode stbrp_node} * nodes;
    + * }
    + */ +@NativeType("struct stbtt_pack_context") +public class STBTTPackContext extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + USER_ALLOCATOR_CONTEXT, + PACK_INFO, + WIDTH, + HEIGHT, + STRIDE_IN_BYTES, + PADDING, + SKIP_MISSING, + H_OVERSAMPLE, + V_OVERSAMPLE, + PIXELS, + NODES; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + USER_ALLOCATOR_CONTEXT = layout.offsetof(0); + PACK_INFO = layout.offsetof(1); + WIDTH = layout.offsetof(2); + HEIGHT = layout.offsetof(3); + STRIDE_IN_BYTES = layout.offsetof(4); + PADDING = layout.offsetof(5); + SKIP_MISSING = layout.offsetof(6); + H_OVERSAMPLE = layout.offsetof(7); + V_OVERSAMPLE = layout.offsetof(8); + PIXELS = layout.offsetof(9); + NODES = layout.offsetof(10); + } + + protected STBTTPackContext(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBTTPackContext create(long address, @Nullable ByteBuffer container) { + return new STBTTPackContext(address, container); + } + + /** + * Creates a {@code STBTTPackContext} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBTTPackContext(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code user_allocator_context} field. */ + @NativeType("void *") + public long user_allocator_context() { return nuser_allocator_context(address()); } + /** @return a {@link STBRPContext} view of the struct pointed to by the {@code pack_info} field. */ + @NativeType("stbrp_context *") + public STBRPContext pack_info() { return npack_info(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return nheight(address()); } + /** @return the value of the {@code stride_in_bytes} field. */ + public int stride_in_bytes() { return nstride_in_bytes(address()); } + /** @return the value of the {@code padding} field. */ + public int padding() { return npadding(address()); } + /** @return the value of the {@code skip_missing} field. */ + @NativeType("int") + public boolean skip_missing() { return nskip_missing(address()) != 0; } + /** @return the value of the {@code h_oversample} field. */ + @NativeType("unsigned int") + public int h_oversample() { return nh_oversample(address()); } + /** @return the value of the {@code v_oversample} field. */ + @NativeType("unsigned int") + public int v_oversample() { return nv_oversample(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code pixels} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned char *") + public ByteBuffer pixels(int capacity) { return npixels(address(), capacity); } + /** + * @return a {@link STBRPNode.Buffer} view of the struct array pointed to by the {@code nodes} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("stbrp_node *") + public STBRPNode.Buffer nodes(int capacity) { return nnodes(address(), capacity); } + + // ----------------------------------- + + /** Returns a new {@code STBTTPackContext} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBTTPackContext malloc() { + return new STBTTPackContext(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBTTPackContext} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBTTPackContext calloc() { + return new STBTTPackContext(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBTTPackContext} instance allocated with {@link BufferUtils}. */ + public static STBTTPackContext create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBTTPackContext(memAddress(container), container); + } + + /** Returns a new {@code STBTTPackContext} instance for the specified memory address. */ + public static STBTTPackContext create(long address) { + return new STBTTPackContext(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBTTPackContext createSafe(long address) { + return address == NULL ? null : new STBTTPackContext(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackContext mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackContext callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackContext mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackContext callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBTTPackContext} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBTTPackContext malloc(MemoryStack stack) { + return new STBTTPackContext(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBTTPackContext} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBTTPackContext calloc(MemoryStack stack) { + return new STBTTPackContext(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #user_allocator_context}. */ + public static long nuser_allocator_context(long struct) { return memGetAddress(struct + STBTTPackContext.USER_ALLOCATOR_CONTEXT); } + /** Unsafe version of {@link #pack_info}. */ + public static STBRPContext npack_info(long struct) { return STBRPContext.create(memGetAddress(struct + STBTTPackContext.PACK_INFO)); } + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + STBTTPackContext.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + STBTTPackContext.HEIGHT); } + /** Unsafe version of {@link #stride_in_bytes}. */ + public static int nstride_in_bytes(long struct) { return UNSAFE.getInt(null, struct + STBTTPackContext.STRIDE_IN_BYTES); } + /** Unsafe version of {@link #padding}. */ + public static int npadding(long struct) { return UNSAFE.getInt(null, struct + STBTTPackContext.PADDING); } + /** Unsafe version of {@link #skip_missing}. */ + public static int nskip_missing(long struct) { return UNSAFE.getInt(null, struct + STBTTPackContext.SKIP_MISSING); } + /** Unsafe version of {@link #h_oversample}. */ + public static int nh_oversample(long struct) { return UNSAFE.getInt(null, struct + STBTTPackContext.H_OVERSAMPLE); } + /** Unsafe version of {@link #v_oversample}. */ + public static int nv_oversample(long struct) { return UNSAFE.getInt(null, struct + STBTTPackContext.V_OVERSAMPLE); } + /** Unsafe version of {@link #pixels(int) pixels}. */ + public static ByteBuffer npixels(long struct, int capacity) { return memByteBuffer(memGetAddress(struct + STBTTPackContext.PIXELS), capacity); } + /** Unsafe version of {@link #nodes}. */ + public static STBRPNode.Buffer nnodes(long struct, int capacity) { return STBRPNode.create(memGetAddress(struct + STBTTPackContext.NODES), capacity); } + + // ----------------------------------- + + /** An array of {@link STBTTPackContext} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBTTPackContext ELEMENT_FACTORY = STBTTPackContext.create(-1L); + + /** + * Creates a new {@code STBTTPackContext.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBTTPackContext#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBTTPackContext getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code user_allocator_context} field. */ + @NativeType("void *") + public long user_allocator_context() { return STBTTPackContext.nuser_allocator_context(address()); } + /** @return a {@link STBRPContext} view of the struct pointed to by the {@code pack_info} field. */ + @NativeType("stbrp_context *") + public STBRPContext pack_info() { return STBTTPackContext.npack_info(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return STBTTPackContext.nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return STBTTPackContext.nheight(address()); } + /** @return the value of the {@code stride_in_bytes} field. */ + public int stride_in_bytes() { return STBTTPackContext.nstride_in_bytes(address()); } + /** @return the value of the {@code padding} field. */ + public int padding() { return STBTTPackContext.npadding(address()); } + /** @return the value of the {@code skip_missing} field. */ + @NativeType("int") + public boolean skip_missing() { return STBTTPackContext.nskip_missing(address()) != 0; } + /** @return the value of the {@code h_oversample} field. */ + @NativeType("unsigned int") + public int h_oversample() { return STBTTPackContext.nh_oversample(address()); } + /** @return the value of the {@code v_oversample} field. */ + @NativeType("unsigned int") + public int v_oversample() { return STBTTPackContext.nv_oversample(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code pixels} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned char *") + public ByteBuffer pixels(int capacity) { return STBTTPackContext.npixels(address(), capacity); } + /** + * @return a {@link STBRPNode.Buffer} view of the struct array pointed to by the {@code nodes} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("stbrp_node *") + public STBRPNode.Buffer nodes(int capacity) { return STBTTPackContext.nnodes(address(), capacity); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackRange.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackRange.java new file mode 100644 index 000000000..382ba82c9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackRange.java @@ -0,0 +1,413 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A range of packed character data, used by {@link STBTruetype#stbtt_PackFontRanges PackFontRanges} + * + *

    Layout

    + * + *
    
    + * struct stbtt_pack_range {
    + *     float {@link #font_size};
    + *     int {@link #first_unicode_codepoint_in_range};
    + *     int * {@link #array_of_unicode_codepoints};
    + *     int {@link #num_chars};
    + *     {@link STBTTPackedchar stbtt_packedchar} * {@link #chardata_for_range};
    + *     unsigned char {@link #h_oversample};
    + *     unsigned char {@link #v_oversample};
    + * }
    + */ +@NativeType("struct stbtt_pack_range") +public class STBTTPackRange extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FONT_SIZE, + FIRST_UNICODE_CODEPOINT_IN_RANGE, + ARRAY_OF_UNICODE_CODEPOINTS, + NUM_CHARS, + CHARDATA_FOR_RANGE, + H_OVERSAMPLE, + V_OVERSAMPLE; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(1), + __member(1) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FONT_SIZE = layout.offsetof(0); + FIRST_UNICODE_CODEPOINT_IN_RANGE = layout.offsetof(1); + ARRAY_OF_UNICODE_CODEPOINTS = layout.offsetof(2); + NUM_CHARS = layout.offsetof(3); + CHARDATA_FOR_RANGE = layout.offsetof(4); + H_OVERSAMPLE = layout.offsetof(5); + V_OVERSAMPLE = layout.offsetof(6); + } + + protected STBTTPackRange(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBTTPackRange create(long address, @Nullable ByteBuffer container) { + return new STBTTPackRange(address, container); + } + + /** + * Creates a {@code STBTTPackRange} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBTTPackRange(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the font size */ + public float font_size() { return nfont_size(address()); } + /** if non-zero, then the chars are continuous, and this is the first codepoint */ + public int first_unicode_codepoint_in_range() { return nfirst_unicode_codepoint_in_range(address()); } + /** if non-zero, then this is an array of unicode codepoints */ + @Nullable + @NativeType("int *") + public IntBuffer array_of_unicode_codepoints() { return narray_of_unicode_codepoints(address()); } + /** the number of codepoints in the range */ + public int num_chars() { return nnum_chars(address()); } + /** output */ + @NativeType("stbtt_packedchar *") + public STBTTPackedchar.Buffer chardata_for_range() { return nchardata_for_range(address()); } + /** used internally */ + @NativeType("unsigned char") + public byte h_oversample() { return nh_oversample(address()); } + /** used internally */ + @NativeType("unsigned char") + public byte v_oversample() { return nv_oversample(address()); } + + /** Sets the specified value to the {@link #font_size} field. */ + public STBTTPackRange font_size(float value) { nfont_size(address(), value); return this; } + /** Sets the specified value to the {@link #first_unicode_codepoint_in_range} field. */ + public STBTTPackRange first_unicode_codepoint_in_range(int value) { nfirst_unicode_codepoint_in_range(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@link #array_of_unicode_codepoints} field. */ + public STBTTPackRange array_of_unicode_codepoints(@Nullable @NativeType("int *") IntBuffer value) { narray_of_unicode_codepoints(address(), value); return this; } + /** Sets the specified value to the {@link #num_chars} field. */ + public STBTTPackRange num_chars(int value) { nnum_chars(address(), value); return this; } + /** Sets the address of the specified {@link STBTTPackedchar.Buffer} to the {@link #chardata_for_range} field. */ + public STBTTPackRange chardata_for_range(@NativeType("stbtt_packedchar *") STBTTPackedchar.Buffer value) { nchardata_for_range(address(), value); return this; } + /** Sets the specified value to the {@link #h_oversample} field. */ + public STBTTPackRange h_oversample(@NativeType("unsigned char") byte value) { nh_oversample(address(), value); return this; } + /** Sets the specified value to the {@link #v_oversample} field. */ + public STBTTPackRange v_oversample(@NativeType("unsigned char") byte value) { nv_oversample(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public STBTTPackRange set( + float font_size, + int first_unicode_codepoint_in_range, + @Nullable IntBuffer array_of_unicode_codepoints, + int num_chars, + STBTTPackedchar.Buffer chardata_for_range, + byte h_oversample, + byte v_oversample + ) { + font_size(font_size); + first_unicode_codepoint_in_range(first_unicode_codepoint_in_range); + array_of_unicode_codepoints(array_of_unicode_codepoints); + num_chars(num_chars); + chardata_for_range(chardata_for_range); + h_oversample(h_oversample); + v_oversample(v_oversample); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public STBTTPackRange set(STBTTPackRange src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code STBTTPackRange} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBTTPackRange malloc() { + return new STBTTPackRange(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBTTPackRange} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBTTPackRange calloc() { + return new STBTTPackRange(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBTTPackRange} instance allocated with {@link BufferUtils}. */ + public static STBTTPackRange create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBTTPackRange(memAddress(container), container); + } + + /** Returns a new {@code STBTTPackRange} instance for the specified memory address. */ + public static STBTTPackRange create(long address) { + return new STBTTPackRange(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBTTPackRange createSafe(long address) { + return address == NULL ? null : new STBTTPackRange(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackRange mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackRange callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackRange mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackRange callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBTTPackRange} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBTTPackRange malloc(MemoryStack stack) { + return new STBTTPackRange(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBTTPackRange} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBTTPackRange calloc(MemoryStack stack) { + return new STBTTPackRange(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #font_size}. */ + public static float nfont_size(long struct) { return UNSAFE.getFloat(null, struct + STBTTPackRange.FONT_SIZE); } + /** Unsafe version of {@link #first_unicode_codepoint_in_range}. */ + public static int nfirst_unicode_codepoint_in_range(long struct) { return UNSAFE.getInt(null, struct + STBTTPackRange.FIRST_UNICODE_CODEPOINT_IN_RANGE); } + /** Unsafe version of {@link #array_of_unicode_codepoints() array_of_unicode_codepoints}. */ + @Nullable public static IntBuffer narray_of_unicode_codepoints(long struct) { return memIntBufferSafe(memGetAddress(struct + STBTTPackRange.ARRAY_OF_UNICODE_CODEPOINTS), nnum_chars(struct)); } + /** Unsafe version of {@link #num_chars}. */ + public static int nnum_chars(long struct) { return UNSAFE.getInt(null, struct + STBTTPackRange.NUM_CHARS); } + /** Unsafe version of {@link #chardata_for_range}. */ + public static STBTTPackedchar.Buffer nchardata_for_range(long struct) { return STBTTPackedchar.create(memGetAddress(struct + STBTTPackRange.CHARDATA_FOR_RANGE), nnum_chars(struct)); } + /** Unsafe version of {@link #h_oversample}. */ + public static byte nh_oversample(long struct) { return UNSAFE.getByte(null, struct + STBTTPackRange.H_OVERSAMPLE); } + /** Unsafe version of {@link #v_oversample}. */ + public static byte nv_oversample(long struct) { return UNSAFE.getByte(null, struct + STBTTPackRange.V_OVERSAMPLE); } + + /** Unsafe version of {@link #font_size(float) font_size}. */ + public static void nfont_size(long struct, float value) { UNSAFE.putFloat(null, struct + STBTTPackRange.FONT_SIZE, value); } + /** Unsafe version of {@link #first_unicode_codepoint_in_range(int) first_unicode_codepoint_in_range}. */ + public static void nfirst_unicode_codepoint_in_range(long struct, int value) { UNSAFE.putInt(null, struct + STBTTPackRange.FIRST_UNICODE_CODEPOINT_IN_RANGE, value); } + /** Unsafe version of {@link #array_of_unicode_codepoints(IntBuffer) array_of_unicode_codepoints}. */ + public static void narray_of_unicode_codepoints(long struct, @Nullable IntBuffer value) { memPutAddress(struct + STBTTPackRange.ARRAY_OF_UNICODE_CODEPOINTS, memAddressSafe(value)); } + /** Sets the specified value to the {@code num_chars} field of the specified {@code struct}. */ + public static void nnum_chars(long struct, int value) { UNSAFE.putInt(null, struct + STBTTPackRange.NUM_CHARS, value); } + /** Unsafe version of {@link #chardata_for_range(STBTTPackedchar.Buffer) chardata_for_range}. */ + public static void nchardata_for_range(long struct, STBTTPackedchar.Buffer value) { memPutAddress(struct + STBTTPackRange.CHARDATA_FOR_RANGE, value.address()); } + /** Unsafe version of {@link #h_oversample(byte) h_oversample}. */ + public static void nh_oversample(long struct, byte value) { UNSAFE.putByte(null, struct + STBTTPackRange.H_OVERSAMPLE, value); } + /** Unsafe version of {@link #v_oversample(byte) v_oversample}. */ + public static void nv_oversample(long struct, byte value) { UNSAFE.putByte(null, struct + STBTTPackRange.V_OVERSAMPLE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + STBTTPackRange.CHARDATA_FOR_RANGE)); + } + + // ----------------------------------- + + /** An array of {@link STBTTPackRange} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBTTPackRange ELEMENT_FACTORY = STBTTPackRange.create(-1L); + + /** + * Creates a new {@code STBTTPackRange.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBTTPackRange#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBTTPackRange getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link STBTTPackRange#font_size} field. */ + public float font_size() { return STBTTPackRange.nfont_size(address()); } + /** @return the value of the {@link STBTTPackRange#first_unicode_codepoint_in_range} field. */ + public int first_unicode_codepoint_in_range() { return STBTTPackRange.nfirst_unicode_codepoint_in_range(address()); } + /** @return a {@link IntBuffer} view of the data pointed to by the {@link STBTTPackRange#array_of_unicode_codepoints} field. */ + @Nullable + @NativeType("int *") + public IntBuffer array_of_unicode_codepoints() { return STBTTPackRange.narray_of_unicode_codepoints(address()); } + /** @return the value of the {@link STBTTPackRange#num_chars} field. */ + public int num_chars() { return STBTTPackRange.nnum_chars(address()); } + /** @return a {@link STBTTPackedchar.Buffer} view of the struct array pointed to by the {@link STBTTPackRange#chardata_for_range} field. */ + @NativeType("stbtt_packedchar *") + public STBTTPackedchar.Buffer chardata_for_range() { return STBTTPackRange.nchardata_for_range(address()); } + /** @return the value of the {@link STBTTPackRange#h_oversample} field. */ + @NativeType("unsigned char") + public byte h_oversample() { return STBTTPackRange.nh_oversample(address()); } + /** @return the value of the {@link STBTTPackRange#v_oversample} field. */ + @NativeType("unsigned char") + public byte v_oversample() { return STBTTPackRange.nv_oversample(address()); } + + /** Sets the specified value to the {@link STBTTPackRange#font_size} field. */ + public Buffer font_size(float value) { STBTTPackRange.nfont_size(address(), value); return this; } + /** Sets the specified value to the {@link STBTTPackRange#first_unicode_codepoint_in_range} field. */ + public Buffer first_unicode_codepoint_in_range(int value) { STBTTPackRange.nfirst_unicode_codepoint_in_range(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@link STBTTPackRange#array_of_unicode_codepoints} field. */ + public Buffer array_of_unicode_codepoints(@Nullable @NativeType("int *") IntBuffer value) { STBTTPackRange.narray_of_unicode_codepoints(address(), value); return this; } + /** Sets the specified value to the {@link STBTTPackRange#num_chars} field. */ + public Buffer num_chars(int value) { STBTTPackRange.nnum_chars(address(), value); return this; } + /** Sets the address of the specified {@link STBTTPackedchar.Buffer} to the {@link STBTTPackRange#chardata_for_range} field. */ + public Buffer chardata_for_range(@NativeType("stbtt_packedchar *") STBTTPackedchar.Buffer value) { STBTTPackRange.nchardata_for_range(address(), value); return this; } + /** Sets the specified value to the {@link STBTTPackRange#h_oversample} field. */ + public Buffer h_oversample(@NativeType("unsigned char") byte value) { STBTTPackRange.nh_oversample(address(), value); return this; } + /** Sets the specified value to the {@link STBTTPackRange#v_oversample} field. */ + public Buffer v_oversample(@NativeType("unsigned char") byte value) { STBTTPackRange.nv_oversample(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackedchar.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackedchar.java new file mode 100644 index 000000000..4d78e84af --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTPackedchar.java @@ -0,0 +1,437 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Packed character data, returned by {@link STBTruetype#stbtt_PackFontRange PackFontRange} + * + *

    Layout

    + * + *
    
    + * struct stbtt_packedchar {
    + *     unsigned short x0;
    + *     unsigned short y0;
    + *     unsigned short x1;
    + *     unsigned short y1;
    + *     float xoff;
    + *     float yoff;
    + *     float xadvance;
    + *     float xoff2;
    + *     float yoff2;
    + * }
    + */ +@NativeType("struct stbtt_packedchar") +public class STBTTPackedchar extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X0, + Y0, + X1, + Y1, + XOFF, + YOFF, + XADVANCE, + XOFF2, + YOFF2; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(2), + __member(2), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X0 = layout.offsetof(0); + Y0 = layout.offsetof(1); + X1 = layout.offsetof(2); + Y1 = layout.offsetof(3); + XOFF = layout.offsetof(4); + YOFF = layout.offsetof(5); + XADVANCE = layout.offsetof(6); + XOFF2 = layout.offsetof(7); + YOFF2 = layout.offsetof(8); + } + + protected STBTTPackedchar(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBTTPackedchar create(long address, @Nullable ByteBuffer container) { + return new STBTTPackedchar(address, container); + } + + /** + * Creates a {@code STBTTPackedchar} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBTTPackedchar(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code x0} field. */ + @NativeType("unsigned short") + public short x0() { return nx0(address()); } + /** @return the value of the {@code y0} field. */ + @NativeType("unsigned short") + public short y0() { return ny0(address()); } + /** @return the value of the {@code x1} field. */ + @NativeType("unsigned short") + public short x1() { return nx1(address()); } + /** @return the value of the {@code y1} field. */ + @NativeType("unsigned short") + public short y1() { return ny1(address()); } + /** @return the value of the {@code xoff} field. */ + public float xoff() { return nxoff(address()); } + /** @return the value of the {@code yoff} field. */ + public float yoff() { return nyoff(address()); } + /** @return the value of the {@code xadvance} field. */ + public float xadvance() { return nxadvance(address()); } + /** @return the value of the {@code xoff2} field. */ + public float xoff2() { return nxoff2(address()); } + /** @return the value of the {@code yoff2} field. */ + public float yoff2() { return nyoff2(address()); } + + /** Sets the specified value to the {@code x0} field. */ + public STBTTPackedchar x0(@NativeType("unsigned short") short value) { nx0(address(), value); return this; } + /** Sets the specified value to the {@code y0} field. */ + public STBTTPackedchar y0(@NativeType("unsigned short") short value) { ny0(address(), value); return this; } + /** Sets the specified value to the {@code x1} field. */ + public STBTTPackedchar x1(@NativeType("unsigned short") short value) { nx1(address(), value); return this; } + /** Sets the specified value to the {@code y1} field. */ + public STBTTPackedchar y1(@NativeType("unsigned short") short value) { ny1(address(), value); return this; } + /** Sets the specified value to the {@code xoff} field. */ + public STBTTPackedchar xoff(float value) { nxoff(address(), value); return this; } + /** Sets the specified value to the {@code yoff} field. */ + public STBTTPackedchar yoff(float value) { nyoff(address(), value); return this; } + /** Sets the specified value to the {@code xadvance} field. */ + public STBTTPackedchar xadvance(float value) { nxadvance(address(), value); return this; } + /** Sets the specified value to the {@code xoff2} field. */ + public STBTTPackedchar xoff2(float value) { nxoff2(address(), value); return this; } + /** Sets the specified value to the {@code yoff2} field. */ + public STBTTPackedchar yoff2(float value) { nyoff2(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public STBTTPackedchar set( + short x0, + short y0, + short x1, + short y1, + float xoff, + float yoff, + float xadvance, + float xoff2, + float yoff2 + ) { + x0(x0); + y0(y0); + x1(x1); + y1(y1); + xoff(xoff); + yoff(yoff); + xadvance(xadvance); + xoff2(xoff2); + yoff2(yoff2); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public STBTTPackedchar set(STBTTPackedchar src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code STBTTPackedchar} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBTTPackedchar malloc() { + return new STBTTPackedchar(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBTTPackedchar} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBTTPackedchar calloc() { + return new STBTTPackedchar(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBTTPackedchar} instance allocated with {@link BufferUtils}. */ + public static STBTTPackedchar create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBTTPackedchar(memAddress(container), container); + } + + /** Returns a new {@code STBTTPackedchar} instance for the specified memory address. */ + public static STBTTPackedchar create(long address) { + return new STBTTPackedchar(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBTTPackedchar createSafe(long address) { + return address == NULL ? null : new STBTTPackedchar(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackedchar mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackedchar callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackedchar mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTPackedchar callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBTTPackedchar} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBTTPackedchar malloc(MemoryStack stack) { + return new STBTTPackedchar(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBTTPackedchar} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBTTPackedchar calloc(MemoryStack stack) { + return new STBTTPackedchar(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x0}. */ + public static short nx0(long struct) { return UNSAFE.getShort(null, struct + STBTTPackedchar.X0); } + /** Unsafe version of {@link #y0}. */ + public static short ny0(long struct) { return UNSAFE.getShort(null, struct + STBTTPackedchar.Y0); } + /** Unsafe version of {@link #x1}. */ + public static short nx1(long struct) { return UNSAFE.getShort(null, struct + STBTTPackedchar.X1); } + /** Unsafe version of {@link #y1}. */ + public static short ny1(long struct) { return UNSAFE.getShort(null, struct + STBTTPackedchar.Y1); } + /** Unsafe version of {@link #xoff}. */ + public static float nxoff(long struct) { return UNSAFE.getFloat(null, struct + STBTTPackedchar.XOFF); } + /** Unsafe version of {@link #yoff}. */ + public static float nyoff(long struct) { return UNSAFE.getFloat(null, struct + STBTTPackedchar.YOFF); } + /** Unsafe version of {@link #xadvance}. */ + public static float nxadvance(long struct) { return UNSAFE.getFloat(null, struct + STBTTPackedchar.XADVANCE); } + /** Unsafe version of {@link #xoff2}. */ + public static float nxoff2(long struct) { return UNSAFE.getFloat(null, struct + STBTTPackedchar.XOFF2); } + /** Unsafe version of {@link #yoff2}. */ + public static float nyoff2(long struct) { return UNSAFE.getFloat(null, struct + STBTTPackedchar.YOFF2); } + + /** Unsafe version of {@link #x0(short) x0}. */ + public static void nx0(long struct, short value) { UNSAFE.putShort(null, struct + STBTTPackedchar.X0, value); } + /** Unsafe version of {@link #y0(short) y0}. */ + public static void ny0(long struct, short value) { UNSAFE.putShort(null, struct + STBTTPackedchar.Y0, value); } + /** Unsafe version of {@link #x1(short) x1}. */ + public static void nx1(long struct, short value) { UNSAFE.putShort(null, struct + STBTTPackedchar.X1, value); } + /** Unsafe version of {@link #y1(short) y1}. */ + public static void ny1(long struct, short value) { UNSAFE.putShort(null, struct + STBTTPackedchar.Y1, value); } + /** Unsafe version of {@link #xoff(float) xoff}. */ + public static void nxoff(long struct, float value) { UNSAFE.putFloat(null, struct + STBTTPackedchar.XOFF, value); } + /** Unsafe version of {@link #yoff(float) yoff}. */ + public static void nyoff(long struct, float value) { UNSAFE.putFloat(null, struct + STBTTPackedchar.YOFF, value); } + /** Unsafe version of {@link #xadvance(float) xadvance}. */ + public static void nxadvance(long struct, float value) { UNSAFE.putFloat(null, struct + STBTTPackedchar.XADVANCE, value); } + /** Unsafe version of {@link #xoff2(float) xoff2}. */ + public static void nxoff2(long struct, float value) { UNSAFE.putFloat(null, struct + STBTTPackedchar.XOFF2, value); } + /** Unsafe version of {@link #yoff2(float) yoff2}. */ + public static void nyoff2(long struct, float value) { UNSAFE.putFloat(null, struct + STBTTPackedchar.YOFF2, value); } + + // ----------------------------------- + + /** An array of {@link STBTTPackedchar} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBTTPackedchar ELEMENT_FACTORY = STBTTPackedchar.create(-1L); + + /** + * Creates a new {@code STBTTPackedchar.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBTTPackedchar#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBTTPackedchar getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code x0} field. */ + @NativeType("unsigned short") + public short x0() { return STBTTPackedchar.nx0(address()); } + /** @return the value of the {@code y0} field. */ + @NativeType("unsigned short") + public short y0() { return STBTTPackedchar.ny0(address()); } + /** @return the value of the {@code x1} field. */ + @NativeType("unsigned short") + public short x1() { return STBTTPackedchar.nx1(address()); } + /** @return the value of the {@code y1} field. */ + @NativeType("unsigned short") + public short y1() { return STBTTPackedchar.ny1(address()); } + /** @return the value of the {@code xoff} field. */ + public float xoff() { return STBTTPackedchar.nxoff(address()); } + /** @return the value of the {@code yoff} field. */ + public float yoff() { return STBTTPackedchar.nyoff(address()); } + /** @return the value of the {@code xadvance} field. */ + public float xadvance() { return STBTTPackedchar.nxadvance(address()); } + /** @return the value of the {@code xoff2} field. */ + public float xoff2() { return STBTTPackedchar.nxoff2(address()); } + /** @return the value of the {@code yoff2} field. */ + public float yoff2() { return STBTTPackedchar.nyoff2(address()); } + + /** Sets the specified value to the {@code x0} field. */ + public Buffer x0(@NativeType("unsigned short") short value) { STBTTPackedchar.nx0(address(), value); return this; } + /** Sets the specified value to the {@code y0} field. */ + public Buffer y0(@NativeType("unsigned short") short value) { STBTTPackedchar.ny0(address(), value); return this; } + /** Sets the specified value to the {@code x1} field. */ + public Buffer x1(@NativeType("unsigned short") short value) { STBTTPackedchar.nx1(address(), value); return this; } + /** Sets the specified value to the {@code y1} field. */ + public Buffer y1(@NativeType("unsigned short") short value) { STBTTPackedchar.ny1(address(), value); return this; } + /** Sets the specified value to the {@code xoff} field. */ + public Buffer xoff(float value) { STBTTPackedchar.nxoff(address(), value); return this; } + /** Sets the specified value to the {@code yoff} field. */ + public Buffer yoff(float value) { STBTTPackedchar.nyoff(address(), value); return this; } + /** Sets the specified value to the {@code xadvance} field. */ + public Buffer xadvance(float value) { STBTTPackedchar.nxadvance(address(), value); return this; } + /** Sets the specified value to the {@code xoff2} field. */ + public Buffer xoff2(float value) { STBTTPackedchar.nxoff2(address(), value); return this; } + /** Sets the specified value to the {@code yoff2} field. */ + public Buffer yoff2(float value) { STBTTPackedchar.nyoff2(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTVertex.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTVertex.java new file mode 100644 index 000000000..2547e20f0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTTVertex.java @@ -0,0 +1,329 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Vertex data. + * + *

    Layout

    + * + *
    
    + * struct stbtt_vertex {
    + *     stbtt_vertex_type x;
    + *     stbtt_vertex_type y;
    + *     stbtt_vertex_type cx;
    + *     stbtt_vertex_type cy;
    + *     stbtt_vertex_type cx1;
    + *     stbtt_vertex_type cy1;
    + *     unsigned char type;
    + * }
    + */ +@NativeType("struct stbtt_vertex") +public class STBTTVertex extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X, + Y, + CX, + CY, + CX1, + CY1, + TYPE; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(1) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X = layout.offsetof(0); + Y = layout.offsetof(1); + CX = layout.offsetof(2); + CY = layout.offsetof(3); + CX1 = layout.offsetof(4); + CY1 = layout.offsetof(5); + TYPE = layout.offsetof(6); + } + + protected STBTTVertex(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBTTVertex create(long address, @Nullable ByteBuffer container) { + return new STBTTVertex(address, container); + } + + /** + * Creates a {@code STBTTVertex} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBTTVertex(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code x} field. */ + @NativeType("stbtt_vertex_type") + public short x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + @NativeType("stbtt_vertex_type") + public short y() { return ny(address()); } + /** @return the value of the {@code cx} field. */ + @NativeType("stbtt_vertex_type") + public short cx() { return ncx(address()); } + /** @return the value of the {@code cy} field. */ + @NativeType("stbtt_vertex_type") + public short cy() { return ncy(address()); } + /** @return the value of the {@code cx1} field. */ + @NativeType("stbtt_vertex_type") + public short cx1() { return ncx1(address()); } + /** @return the value of the {@code cy1} field. */ + @NativeType("stbtt_vertex_type") + public short cy1() { return ncy1(address()); } + /** @return the value of the {@code type} field. */ + @NativeType("unsigned char") + public byte type() { return ntype(address()); } + + // ----------------------------------- + + /** Returns a new {@code STBTTVertex} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBTTVertex malloc() { + return new STBTTVertex(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBTTVertex} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBTTVertex calloc() { + return new STBTTVertex(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBTTVertex} instance allocated with {@link BufferUtils}. */ + public static STBTTVertex create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBTTVertex(memAddress(container), container); + } + + /** Returns a new {@code STBTTVertex} instance for the specified memory address. */ + public static STBTTVertex create(long address) { + return new STBTTVertex(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBTTVertex createSafe(long address) { + return address == NULL ? null : new STBTTVertex(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTVertex mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTVertex callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBTTVertex mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBTTVertex callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBTTVertex} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBTTVertex malloc(MemoryStack stack) { + return new STBTTVertex(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBTTVertex} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBTTVertex calloc(MemoryStack stack) { + return new STBTTVertex(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x}. */ + public static short nx(long struct) { return UNSAFE.getShort(null, struct + STBTTVertex.X); } + /** Unsafe version of {@link #y}. */ + public static short ny(long struct) { return UNSAFE.getShort(null, struct + STBTTVertex.Y); } + /** Unsafe version of {@link #cx}. */ + public static short ncx(long struct) { return UNSAFE.getShort(null, struct + STBTTVertex.CX); } + /** Unsafe version of {@link #cy}. */ + public static short ncy(long struct) { return UNSAFE.getShort(null, struct + STBTTVertex.CY); } + /** Unsafe version of {@link #cx1}. */ + public static short ncx1(long struct) { return UNSAFE.getShort(null, struct + STBTTVertex.CX1); } + /** Unsafe version of {@link #cy1}. */ + public static short ncy1(long struct) { return UNSAFE.getShort(null, struct + STBTTVertex.CY1); } + /** Unsafe version of {@link #type}. */ + public static byte ntype(long struct) { return UNSAFE.getByte(null, struct + STBTTVertex.TYPE); } + + // ----------------------------------- + + /** An array of {@link STBTTVertex} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBTTVertex ELEMENT_FACTORY = STBTTVertex.create(-1L); + + /** + * Creates a new {@code STBTTVertex.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBTTVertex#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBTTVertex getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code x} field. */ + @NativeType("stbtt_vertex_type") + public short x() { return STBTTVertex.nx(address()); } + /** @return the value of the {@code y} field. */ + @NativeType("stbtt_vertex_type") + public short y() { return STBTTVertex.ny(address()); } + /** @return the value of the {@code cx} field. */ + @NativeType("stbtt_vertex_type") + public short cx() { return STBTTVertex.ncx(address()); } + /** @return the value of the {@code cy} field. */ + @NativeType("stbtt_vertex_type") + public short cy() { return STBTTVertex.ncy(address()); } + /** @return the value of the {@code cx1} field. */ + @NativeType("stbtt_vertex_type") + public short cx1() { return STBTTVertex.ncx1(address()); } + /** @return the value of the {@code cy1} field. */ + @NativeType("stbtt_vertex_type") + public short cy1() { return STBTTVertex.ncy1(address()); } + /** @return the value of the {@code type} field. */ + @NativeType("unsigned char") + public byte type() { return STBTTVertex.ntype(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTruetype.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTruetype.java new file mode 100644 index 000000000..d4a12f2df --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBTruetype.java @@ -0,0 +1,2223 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to stb_truetype.h from the stb library. + * + *

    This library processes TrueType files:

    + * + *
      + *
    • parse files
    • + *
    • extract glyph metrics
    • + *
    • extract glyph shapes
    • + *
    • render glyphs to one-channel bitmaps with antialiasing (box filter)
    • + *
    + * + *

    ADDITIONAL DOCUMENTATION

    + * + *

    Some important concepts to understand to use this library:

    + * + *

    Codepoint

    + * + *

    Characters are defined by unicode codepoints, e.g. 65 is uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is the hiragana for "ma".

    + * + *

    Glyph

    + * + *

    A visual character shape (every codepoint is rendered as some glyph)

    + * + *

    Glyph index

    + * + *

    A font-specific integer ID representing a glyph

    + * + *

    Baseline

    + * + *

    Glyph shapes are defined relative to a baseline, which is the bottom of uppercase characters. Characters extend both above and below the baseline.

    + * + *

    Current Point

    + * + *

    As you draw text to the screen, you keep track of a "current point" which is the origin of each character. The current point's vertical position is the + * baseline. Even "baked fonts" use this model.

    + * + *

    Vertical Font Metrics

    + * + *

    The vertical qualities of the font, used to vertically position and space the characters. See docs for {@link #stbtt_GetFontVMetrics GetFontVMetrics}.

    + * + *

    Font Size in Pixels or Points

    + * + *

    The preferred interface for specifying font sizes in stb_truetype is to specify how tall the font's vertical extent should be in pixels. If that sounds + * good enough, skip the next paragraph.

    + * + *

    Most font APIs instead use "points", which are a common typographic measurement for describing font size, defined as 72 points per inch. stb_truetype + * provides a point API for compatibility. However, true "per inch" conventions don't make much sense on computer displays since different monitors have + * different number of pixels per inch. For example, Windows traditionally uses a convention that there are 96 pixels per inch, thus making 'inch' + * measurements have nothing to do with inches, and thus effectively defining a point to be 1.333 pixels. Additionally, the TrueType font data provides an + * explicit scale factor to scale a given font's glyphs to points, but the author has observed that this scale factor is often wrong for non-commercial + * fonts, thus making fonts scaled in points according to the TrueType spec incoherently sized in practice.

    + * + *

    DETAILED USAGE

    + * + *

    Scale:

    + * + *

    Select how high you want the font to be, in points or pixels. Call #()ScaleForPixelHeight or {@link #stbtt_ScaleForMappingEmToPixels ScaleForMappingEmToPixels} to compute a scale factor + * {@code SF} that will be used by all other functions.

    + * + *

    Baseline:

    + * + *

    You need to select a y-coordinate that is the baseline of where your text will appear. Call {@link #stbtt_GetFontBoundingBox GetFontBoundingBox} to get the baseline-relative bounding + * box for all characters. {@code SF*-y0} will be the distance in pixels that the worst-case character could extend above the baseline, so if you want the + * top edge of characters to appear at the top of the screen where {@code y=0}, then you would set the baseline to {@code SF*-y0}.

    + * + *

    Current point:

    + * + *

    Set the current point where the first character will appear. The first character could extend left of the current point; this is font dependent. You + * can either choose a current point that is the leftmost point and hope, or add some padding, or check the bounding box or left-side-bearing of the first + * character to be displayed and set the current point based on that.

    + * + *

    Displaying a character:

    + * + *

    Compute the bounding box of the character. It will contain signed values relative to {@code }. I.e. if it returns + * {@code x0,y0,x1,y1}, then the character should be displayed in the rectangle from {@code } to + * {@code + * + *

    Advancing for the next character:

    + * + *

    Call {@link #stbtt_GetGlyphHMetrics GetGlyphHMetrics}, and compute {@code current_point += SF * advance}.

    + * + *

    ADVANCED USAGE

    + * + *

    Quality:

    + * + *
      + *
    • Use the functions with Subpixel at the end to allow your characters to have subpixel positioning. Since the font is anti-aliased, not hinted, this + * is very important for quality. (This is not possible with baked fonts.)
    • + *
    • Kerning is now supported, and if you're supporting subpixel rendering then kerning is worth using to give your text a polished look.
    • + *
    + * + *

    Performance:

    + * + *
      + *
    • Convert Unicode codepoints to glyph indexes and operate on the glyphs; if you don't do this, stb_truetype is forced to do the conversion on every + * call.
    • + *
    • There are a lot of memory allocations. We should modify it to take a temp buffer and allocate from the temp buffer (without freeing), should help + * performance a lot.
    • + *
    + * + *

    NOTES

    + * + *

    The system uses the raw data found in the .ttf file without changing it and without building auxiliary data structures. This is a bit inefficient on + * little-endian systems (the data is big-endian), but assuming you're caching the bitmaps or glyph shapes this shouldn't be a big deal.

    + * + *

    It appears to be very hard to programmatically determine what font a given file is in a general way. I provide an API for this, but I don't recommend + * it.

    + * + *

    SAMPLE PROGRAMS

    + * + *

    Incomplete text-in-3d-api example, which draws quads properly aligned to be lossless:

    + * + *
    
    + * unsigned char ttf_buffer[1<<20];
    + * unsigned char temp_bitmap[512*512];
    + * 
    + * stbtt_bakedchar cdata[96]; // ASCII 32..126 is 95 glyphs
    + * GLuint ftex;
    + * 
    + * void my_stbtt_initfont(void)
    + * {
    + *    fread(ttf_buffer, 1, 1<<20, fopen("c:/windows/fonts/times.ttf", "rb"));
    + *    stbtt_BakeFontBitmap(ttf_buffer,0, 32.0, temp_bitmap,512,512, 32,96, cdata); // no guarantee this fits!
    + *    // can free ttf_buffer at this point
    + *    glGenTextures(1, &ftex);
    + *    glBindTexture(GL_TEXTURE_2D, ftex);
    + *    glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 512,512, 0, GL_ALPHA, GL_UNSIGNED_BYTE, temp_bitmap);
    + *    // can free temp_bitmap at this point
    + *    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    + * }
    + * 
    + * void my_stbtt_print(float x, float y, char *text)
    + * {
    + *    // assume orthographic projection with units = screen pixels, origin at top left
    + *    glEnable(GL_TEXTURE_2D);
    + *    glBindTexture(GL_TEXTURE_2D, ftex);
    + *    glBegin(GL_QUADS);
    + *    while (*text) {
    + *       if (*text ≥ 32 && *text < 128) {
    + *          stbtt_aligned_quad q;
    + *          stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9
    + *          glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0);
    + *          glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0);
    + *          glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1);
    + *          glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y1);
    + *       }
    + *       ++text;
    + *    }
    + *    glEnd();
    + * }
    + * + *

    Complete program (this compiles): get a single bitmap, print as ASCII art:

    + * + *
    
    + * char ttf_buffer[1<<25];
    + * 
    + * int main(int argc, char **argv)
    + * {
    + *    stbtt_fontinfo font;
    + *    unsigned char *bitmap;
    + *    int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20);
    + * 
    + *    fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb"));
    + * 
    + *    stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0));
    + *    bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0);
    + * 
    + *    for (j=0; j < h; ++j) {
    + *       for (i=0; i < w; ++i)
    + *          putchar(" .:ioVM@"[bitmap[j*w+i]>>5]);
    + *       putchar('\n');
    + *    }
    + *    return 0;
    + * }
    + * + *

    Complete program: print "Hello World!" banner, with bugs:

    + * + *
    
    + * char buffer[24<<20];
    + * unsigned char screen[20][79];
    + * 
    + * int main(int arg, char **argv)
    + * {
    + *    stbtt_fontinfo font;
    + *    int i,j,ascent,baseline,ch=0;
    + *    float scale, xpos=2; // leave a little padding in case the character extends left
    + *    char *text = "Heljo World!";
    + * 
    + *    fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb"));
    + *    stbtt_InitFont(&font, buffer, 0);
    + * 
    + *    scale = stbtt_ScaleForPixelHeight(&font, 15);
    + *    stbtt_GetFontVMetrics(&font, &ascent,0,0);
    + *    baseline = (int) (ascent*scale);
    + * 
    + *    while (text[ch]) {
    + *       int advance,lsb,x0,y0,x1,y1;
    + *       float x_shift = xpos - (float) floor(xpos);
    + *       stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb);
    + *       stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1);
    + *       stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]);
    + *       // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong
    + *       // because this API is really for baking character bitmaps into textures. if you want to render
    + *       // a sequence of characters, you really need to render each bitmap to a temp buffer, then
    + *       // "alpha blend" that into the working buffer
    + *       xpos += (advance * scale);
    + *       if (text[ch+1])
    + *          xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]);
    + *       ++ch;
    + *    }
    + * 
    + *    for (j=0; j < 20; ++j) {
    + *       for (i=0; i < 78; ++i)
    + *          putchar(" .:ioVM@"[screen[j][i]>>5]);
    + *       putchar('\n');
    + *    }
    + * 
    + *    return 0;
    + * }
    + * + *

    Finding the right font...

    + * + *

    You should really just solve this offline, keep your own tables of what font is what, and don't try to get it out of the .ttf file. That's because + * getting it out of the .ttf file is really hard, because the names in the file can appear in many possible encodings, in many possible languages, and + * e.g. if you need a case-insensitive comparison, the details of that depend on the encoding & language in a complex way (actually underspecified in + * truetype, but also gigantic).

    + * + *

    But you can use the provided functions in two possible ways:

    + * + *
      + *
    • {@link #stbtt_FindMatchingFont FindMatchingFont} will use *case-sensitive* comparisons on unicode-encoded names to try to find the font you want; you can run this before + * calling {@link #stbtt_InitFont InitFont}
    • + *
    • {@link #stbtt_GetFontNameString GetFontNameString} lets you get any of the various strings from the file yourself and do your own comparisons on them. You have to have called + * {@link #stbtt_InitFont InitFont} first.
    • + *
    + */ +public class STBTruetype { + + static { LibSTB.initialize(); } + + /** Vertex type. */ + public static final byte + STBTT_vmove = 1, + STBTT_vline = 2, + STBTT_vcurve = 3, + STBTT_vcubic = 4; + + /** Style flags, use in {@link #stbtt_FindMatchingFont FindMatchingFont}. */ + public static final int + STBTT_MACSTYLE_DONTCARE = 0, + STBTT_MACSTYLE_BOLD = 1, + STBTT_MACSTYLE_ITALIC = 2, + STBTT_MACSTYLE_UNDERSCORE = 4, + STBTT_MACSTYLE_NONE = 8; + + /** Platform IDs. */ + public static final int + STBTT_PLATFORM_ID_UNICODE = 0, + STBTT_PLATFORM_ID_MAC = 1, + STBTT_PLATFORM_ID_ISO = 2, + STBTT_PLATFORM_ID_MICROSOFT = 3; + + /** Encoding IDs for {@link #STBTT_PLATFORM_ID_UNICODE PLATFORM_ID_UNICODE}. */ + public static final int + STBTT_UNICODE_EID_UNICODE_1_0 = 0, + STBTT_UNICODE_EID_UNICODE_1_1 = 1, + STBTT_UNICODE_EID_ISO_10646 = 2, + STBTT_UNICODE_EID_UNICODE_2_0_BMP = 3, + STBTT_UNICODE_EID_UNICODE_2_0_FULL = 4; + + /** Encoding IDs for {@link #STBTT_PLATFORM_ID_MICROSOFT PLATFORM_ID_MICROSOFT}. */ + public static final int + STBTT_MS_EID_SYMBOL = 0, + STBTT_MS_EID_UNICODE_BMP = 1, + STBTT_MS_EID_SHIFTJIS = 2, + STBTT_MS_EID_UNICODE_FULL = 10; + + /** Encoding IDs for {@link #STBTT_PLATFORM_ID_MAC PLATFORM_ID_MAC}. */ + public static final int + STBTT_MAC_EID_ROMAN = 0, + STBTT_MAC_EID_JAPANESE = 1, + STBTT_MAC_EID_CHINESE_TRAD = 2, + STBTT_MAC_EID_KOREAN = 3, + STBTT_MAC_EID_ARABIC = 4, + STBTT_MAC_EID_HEBREW = 5, + STBTT_MAC_EID_GREEK = 6, + STBTT_MAC_EID_RUSSIAN = 7; + + /** Language ID for {@link #STBTT_PLATFORM_ID_MICROSOFT PLATFORM_ID_MICROSOFT}. */ + public static final int + STBTT_MS_LANG_ENGLISH = 0x409, + STBTT_MS_LANG_CHINESE = 0x804, + STBTT_MS_LANG_DUTCH = 0x413, + STBTT_MS_LANG_FRENCH = 0x40C, + STBTT_MS_LANG_GERMAN = 0x407, + STBTT_MS_LANG_HEBREW = 0x40D, + STBTT_MS_LANG_ITALIAN = 0x410, + STBTT_MS_LANG_JAPANESE = 0x411, + STBTT_MS_LANG_KOREAN = 0x412, + STBTT_MS_LANG_RUSSIAN = 0x419, + STBTT_MS_LANG_SPANISH = 0x409, + STBTT_MS_LANG_SWEDISH = 0x41D; + + /** Language ID for {@link #STBTT_PLATFORM_ID_MAC PLATFORM_ID_MAC}. */ + public static final int + STBTT_MAC_LANG_ENGLISH = 0, + STBTT_MAC_LANG_ARABIC = 12, + STBTT_MAC_LANG_DUTCH = 4, + STBTT_MAC_LANG_FRENCH = 1, + STBTT_MAC_LANG_GERMAN = 2, + STBTT_MAC_LANG_HEBREW = 10, + STBTT_MAC_LANG_ITALIAN = 3, + STBTT_MAC_LANG_JAPANESE = 11, + STBTT_MAC_LANG_KOREAN = 23, + STBTT_MAC_LANG_RUSSIAN = 32, + STBTT_MAC_LANG_SPANISH = 6, + STBTT_MAC_LANG_SWEDISH = 5, + STBTT_MAC_LANG_CHINESE_SIMPLIFIED = 33, + STBTT_MAC_LANG_CHINESE_TRAD = 19; + + protected STBTruetype() { + throw new UnsupportedOperationException(); + } + + // --- [ stbtt_BakeFontBitmap ] --- + + /** + * Unsafe version of: {@link #stbtt_BakeFontBitmap BakeFontBitmap} + * + * @param num_chars the number of characters to bake, starting at {@code first_char} + */ + public static native int nstbtt_BakeFontBitmap(long data, int offset, float pixel_height, long pixels, int pw, int ph, int first_char, int num_chars, long chardata); + + /** + * Bakes a font to a bitmap for use as texture. + * + *

    This uses a very simply packing, use with {@link #stbtt_GetBakedQuad GetBakedQuad}.

    + * + * @param data the font data + * @param pixel_height the font height, in pixels + * @param pixels a buffer in which to write the font bitmap + * @param pw the bitmap width, in pixels + * @param ph the bitmap height, in pixels + * @param first_char the first character to bake + * @param chardata an array of {@link STBTTBakedChar} structs, it's {@code num_chars} long + * + * @return if positive, the first unused row of the bitmap. If negative, returns the negative of the number of characters that fit. If 0, no characters fit and no + * rows were used. + */ + public static int stbtt_BakeFontBitmap(@NativeType("unsigned char const *") ByteBuffer data, float pixel_height, @NativeType("unsigned char *") ByteBuffer pixels, int pw, int ph, int first_char, @NativeType("stbtt_bakedchar *") STBTTBakedChar.Buffer chardata) { + if (CHECKS) { + check(pixels, pw * ph); + } + return nstbtt_BakeFontBitmap(memAddress(data), 0, pixel_height, memAddress(pixels), pw, ph, first_char, chardata.remaining(), chardata.address()); + } + + // --- [ stbtt_GetBakedQuad ] --- + + /** Unsafe version of: {@link #stbtt_GetBakedQuad GetBakedQuad} */ + public static native void nstbtt_GetBakedQuad(long chardata, int pw, int ph, int char_index, long xpos, long ypos, long q, int opengl_fillrule); + + /** + * Computes quad to draw for a given char and advances the current position. + * + *

    The coordinate system used assumes y increases downwards. Characters will extend both above and below the current position; see discussion of + * "BASELINE" above.

    + * + * @param chardata an array of {@link STBTTBakedChar} structs + * @param pw the bitmap width, in pixels + * @param ph the bitmap height, in pixels + * @param char_index the character index in the {@code chardata} array + * @param xpos the current x position, in screen pixel space + * @param ypos the current y position, in screen pixel space + * @param q an {@link STBTTAlignedQuad} struct in which to return the quad to draw + * @param opengl_fillrule 1 if opengl fill rule; 0 if DX9 or earlier + */ + public static void stbtt_GetBakedQuad(@NativeType("stbtt_bakedchar const *") STBTTBakedChar.Buffer chardata, int pw, int ph, int char_index, @NativeType("float *") FloatBuffer xpos, @NativeType("float *") FloatBuffer ypos, @NativeType("stbtt_aligned_quad *") STBTTAlignedQuad q, @NativeType("int") boolean opengl_fillrule) { + if (CHECKS) { + check(chardata, char_index + 1); + check(xpos, 1); + check(ypos, 1); + } + nstbtt_GetBakedQuad(chardata.address(), pw, ph, char_index, memAddress(xpos), memAddress(ypos), q.address(), opengl_fillrule ? 1 : 0); + } + + // --- [ stbtt_GetScaledFontVMetrics ] --- + + /** Unsafe version of: {@link #stbtt_GetScaledFontVMetrics GetScaledFontVMetrics} */ + public static native void nstbtt_GetScaledFontVMetrics(long fontdata, int index, float size, long ascent, long descent, long lineGap); + + /** + * Query the font vertical metrics without having to create a font first. + * + * @param index the font index (use 0 if you don't know what that is) + * @param size the font height, in pixels + * @param ascent returns the coordinate above the baseline the font extends + * @param descent returns the coordinate below the baseline the font extends (i.e. it is typically negative) + * @param lineGap returns the spacing between one row's descent and the next row's ascent + */ + public static void stbtt_GetScaledFontVMetrics(@NativeType("unsigned char const *") ByteBuffer fontdata, int index, float size, @NativeType("float *") FloatBuffer ascent, @NativeType("float *") FloatBuffer descent, @NativeType("float *") FloatBuffer lineGap) { + if (CHECKS) { + check(ascent, 1); + check(descent, 1); + check(lineGap, 1); + } + nstbtt_GetScaledFontVMetrics(memAddress(fontdata), index, size, memAddress(ascent), memAddress(descent), memAddress(lineGap)); + } + + // --- [ stbtt_PackBegin ] --- + + /** Unsafe version of: {@link #stbtt_PackBegin PackBegin} */ + public static native int nstbtt_PackBegin(long spc, long pixels, int width, int height, int stride_in_bytes, int padding, long alloc_context); + + /** + * Initializes a packing context stored in the passed-in {@code stbtt_pack_context}. Future calls using this context will pack characters into the bitmap + * passed in here: a 1-channel bitmap that is width x height. + * + * @param spc an {@link STBTTPackContext} struct + * @param pixels a buffer in which to store the bitmap data + * @param width the bitmap width, in pixels + * @param height the bitmap height, in pixels + * @param stride_in_bytes the distance from one row to the next (or 0 to mean they are packed tightly together) + * @param padding the amount of padding to leave between each character (normally you want '1' for bitmaps you'll use as textures with bilinear filtering) + * @param alloc_context a pointer to an allocation context + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbtt_PackBegin(@NativeType("stbtt_pack_context *") STBTTPackContext spc, @Nullable @NativeType("unsigned char *") ByteBuffer pixels, int width, int height, int stride_in_bytes, int padding, @NativeType("void *") long alloc_context) { + if (CHECKS) { + checkSafe(pixels, (stride_in_bytes != 0 ? stride_in_bytes : width) * height); + } + return nstbtt_PackBegin(spc.address(), memAddressSafe(pixels), width, height, stride_in_bytes, padding, alloc_context) != 0; + } + + /** + * Initializes a packing context stored in the passed-in {@code stbtt_pack_context}. Future calls using this context will pack characters into the bitmap + * passed in here: a 1-channel bitmap that is width x height. + * + * @param spc an {@link STBTTPackContext} struct + * @param pixels a buffer in which to store the bitmap data + * @param width the bitmap width, in pixels + * @param height the bitmap height, in pixels + * @param stride_in_bytes the distance from one row to the next (or 0 to mean they are packed tightly together) + * @param padding the amount of padding to leave between each character (normally you want '1' for bitmaps you'll use as textures with bilinear filtering) + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbtt_PackBegin(@NativeType("stbtt_pack_context *") STBTTPackContext spc, @Nullable @NativeType("unsigned char *") ByteBuffer pixels, int width, int height, int stride_in_bytes, int padding) { + if (CHECKS) { + checkSafe(pixels, (stride_in_bytes != 0 ? stride_in_bytes : width) * height); + } + return nstbtt_PackBegin(spc.address(), memAddressSafe(pixels), width, height, stride_in_bytes, padding, NULL) != 0; + } + + // --- [ stbtt_PackEnd ] --- + + /** Unsafe version of: {@link #stbtt_PackEnd PackEnd} */ + public static native void nstbtt_PackEnd(long spc); + + /** + * Cleans up the packing context and frees all memory. + * + * @param spc an {@link STBTTPackContext} struct + */ + public static void stbtt_PackEnd(@NativeType("stbtt_pack_context *") STBTTPackContext spc) { + nstbtt_PackEnd(spc.address()); + } + + // --- [ STBTT_POINT_SIZE ] --- + + /** + * Converts the full height of a character from ascender to descender, as computed by {@link #stbtt_ScaleForPixelHeight ScaleForPixelHeight}, to a point size as computed by + * {@link #stbtt_ScaleForMappingEmToPixels ScaleForMappingEmToPixels}. + * + * @param font_size the full height of a character + * + * @return the point size of the character + */ + public static int STBTT_POINT_SIZE(int font_size) { + return -font_size; + } + + // --- [ stbtt_PackFontRange ] --- + + /** + * Unsafe version of: {@link #stbtt_PackFontRange PackFontRange} + * + * @param num_chars_in_range the number of unicode code points in the range + */ + public static native int nstbtt_PackFontRange(long spc, long fontdata, int font_index, float font_size, int first_unicode_char_in_range, int num_chars_in_range, long chardata_for_range); + + /** + * Creates character bitmaps from the {@code font_index}'th font found in fontdata (use {@code font_index=0} if you don't know what that is). It creates + * {@code num_chars_in_range} bitmaps for characters with unicode values starting at {@code first_unicode_char_in_range} and increasing. Data for how to + * render them is stored in {@code chardata_for_range}; pass these to {@link #stbtt_GetPackedQuad GetPackedQuad} to get back renderable quads. + * + * @param spc an {@link STBTTPackContext} struct + * @param fontdata the font data + * @param font_index the font index (use 0 if you don't know what that is + * @param font_size the full height of the character from ascender to descender, as computed by {@link #stbtt_ScaleForPixelHeight ScaleForPixelHeight}. To use a point size as computed by + * {@link #stbtt_ScaleForMappingEmToPixels ScaleForMappingEmToPixels}, wrap the font size in {@link #STBTT_POINT_SIZE} and pass the result, i.e.: + * + *
    
    +     *                                    ...,                  20 , ... // font max minus min y is 20 pixels tall
    +     *                                    ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall
    + * @param first_unicode_char_in_range the first unicode code point in the range + * @param chardata_for_range an array of {@link STBTTPackedchar} structs + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbtt_PackFontRange(@NativeType("stbtt_pack_context *") STBTTPackContext spc, @NativeType("unsigned char const *") ByteBuffer fontdata, int font_index, float font_size, int first_unicode_char_in_range, @NativeType("stbtt_packedchar *") STBTTPackedchar.Buffer chardata_for_range) { + return nstbtt_PackFontRange(spc.address(), memAddress(fontdata), font_index, font_size, first_unicode_char_in_range, chardata_for_range.remaining(), chardata_for_range.address()) != 0; + } + + // --- [ stbtt_PackFontRanges ] --- + + /** + * Unsafe version of: {@link #stbtt_PackFontRanges PackFontRanges} + * + * @param num_ranges the number of {@link STBTTPackRange} structs in {@code ranges} + */ + public static native int nstbtt_PackFontRanges(long spc, long fontdata, int font_index, long ranges, int num_ranges); + + /** + * Creates character bitmaps from multiple ranges of characters stored in ranges. This will usually create a better-packed bitmap than multiple calls to + * {@link #stbtt_PackFontRange PackFontRange}. Note that you can call this multiple times within a single {@link #stbtt_PackBegin PackBegin}/{@link #stbtt_PackEnd PackEnd}. + * + * @param spc an {@link STBTTPackContext} struct + * @param fontdata the font data + * @param font_index the font index (use 0 if you don't know what that is) + * @param ranges an array of {@link STBTTPackRange} structs + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbtt_PackFontRanges(@NativeType("stbtt_pack_context *") STBTTPackContext spc, @NativeType("unsigned char const *") ByteBuffer fontdata, int font_index, @NativeType("stbtt_pack_range *") STBTTPackRange.Buffer ranges) { + if (CHECKS) { + Struct.validate(ranges.address(), ranges.remaining(), STBTTPackRange.SIZEOF, STBTTPackRange::validate); + } + return nstbtt_PackFontRanges(spc.address(), memAddress(fontdata), font_index, ranges.address(), ranges.remaining()) != 0; + } + + // --- [ stbtt_PackSetOversampling ] --- + + /** Unsafe version of: {@link #stbtt_PackSetOversampling PackSetOversampling} */ + public static native void nstbtt_PackSetOversampling(long spc, int h_oversample, int v_oversample); + + /** + * Oversampling a font increases the quality by allowing higher-quality subpixel positioning, and is especially valuable at smaller text sizes. + * + *

    This function sets the amount of oversampling for all following calls to {@link #stbtt_PackFontRange PackFontRange} or {@link #stbtt_PackFontRangesGatherRects PackFontRangesGatherRects} for a given pack context. The + * default (no oversampling) is achieved by {@code h_oversample=1, v_oversample=1}. The total number of pixels required is + * {@code h_oversample*v_oversample} larger than the default; for example, 2x2 oversampling requires 4x the storage of 1x1. For best results, render + * oversampled textures with bilinear filtering. Look at the readme in + * stb/tests/oversample for information about oversampled fonts.

    + * + *

    To use with PackFontRangesGather etc., you must set it before calls to {@link #stbtt_PackFontRangesGatherRects PackFontRangesGatherRects}.

    + * + * @param spc an {@link STBTTPackContext} struct + * @param h_oversample the horizontal oversampling amount + * @param v_oversample the vertical oversampling amount + */ + public static void stbtt_PackSetOversampling(@NativeType("stbtt_pack_context *") STBTTPackContext spc, @NativeType("unsigned int") int h_oversample, @NativeType("unsigned int") int v_oversample) { + nstbtt_PackSetOversampling(spc.address(), h_oversample, v_oversample); + } + + // --- [ stbtt_PackSetSkipMissingCodepoints ] --- + + /** Unsafe version of: {@link #stbtt_PackSetSkipMissingCodepoints PackSetSkipMissingCodepoints} */ + public static native void nstbtt_PackSetSkipMissingCodepoints(long spc, int skip); + + /** + * If {@code skip != 0}, this tells stb_truetype to skip any codepoints for which there is no corresponding glyph. If {@code skip=0}, which is the + * default, then codepoints without a glyph recived the font's "missing character" glyph, typically an empty box by convention. + * + * @param spc an {@link STBTTPackContext} struct + * @param skip the skip flag + */ + public static void stbtt_PackSetSkipMissingCodepoints(@NativeType("stbtt_pack_context *") STBTTPackContext spc, @NativeType("int") boolean skip) { + nstbtt_PackSetSkipMissingCodepoints(spc.address(), skip ? 1 : 0); + } + + // --- [ stbtt_GetPackedQuad ] --- + + /** Unsafe version of: {@link #stbtt_GetPackedQuad GetPackedQuad} */ + public static native void nstbtt_GetPackedQuad(long chardata, int pw, int ph, int char_index, long xpos, long ypos, long q, int align_to_integer); + + /** + * Computes quad to draw for a given char and advances the current position. + * + *

    The coordinate system used assumes y increases downwards. Characters will extend both above and below the current position; see discussion of + * "BASELINE" above.

    + * + * @param chardata an array of {@link STBTTPackedchar} structs + * @param pw the bitmap width, in pixels + * @param ph the bitmap height, in pixels + * @param char_index the character index in the {@code chardata} array + * @param xpos the current x position, in screen pixel space + * @param ypos the current y position, in screen pixel space + * @param q an {@link STBTTAlignedQuad} struct in which to return the quad to draw + * @param align_to_integer 1 to align the quad to integer coordinates + */ + public static void stbtt_GetPackedQuad(@NativeType("stbtt_packedchar const *") STBTTPackedchar.Buffer chardata, int pw, int ph, int char_index, @NativeType("float *") FloatBuffer xpos, @NativeType("float *") FloatBuffer ypos, @NativeType("stbtt_aligned_quad *") STBTTAlignedQuad q, @NativeType("int") boolean align_to_integer) { + if (CHECKS) { + check(chardata, char_index + 1); + check(xpos, 1); + check(ypos, 1); + } + nstbtt_GetPackedQuad(chardata.address(), pw, ph, char_index, memAddress(xpos), memAddress(ypos), q.address(), align_to_integer ? 1 : 0); + } + + // --- [ stbtt_PackFontRangesGatherRects ] --- + + /** + * Unsafe version of: {@link #stbtt_PackFontRangesGatherRects PackFontRangesGatherRects} + * + * @param num_ranges the number of {@link STBTTPackRange} structs in {@code ranges} + */ + public static native int nstbtt_PackFontRangesGatherRects(long spc, long info, long ranges, int num_ranges, long rects); + + /** + * Calling these functions in sequence is roughly equivalent to calling {@link #stbtt_PackFontRanges PackFontRanges}. If you want more control over the packing of multiple fonts, or + * if you want to pack custom data into a font texture, take a look at the source of {@link #stbtt_PackFontRanges PackFontRanges} and create a custom version using these functions, + * e.g. call {@link #stbtt_PackFontRangesGatherRects PackFontRangesGatherRects} multiple times, building up a single array of rects, then call {@link #stbtt_PackFontRangesPackRects PackFontRangesPackRects} once, then call + * {@link #stbtt_PackFontRangesRenderIntoRects PackFontRangesRenderIntoRects} repeatedly. This may result in a better packing than calling {@link #stbtt_PackFontRanges PackFontRanges} multiple times (or it may not). + * + * @param spc an {@link STBTTPackContext} struct + * @param info an {@link STBTTFontinfo} struct + * @param ranges an array of {@link STBTTPackRange} structs + * @param rects an array of {@link STBRPRect} structs. It must be big enough to accommodate all characters in the given ranges. + * + * @return the number of structs written in {@code rects} + */ + public static int stbtt_PackFontRangesGatherRects(@NativeType("stbtt_pack_context *") STBTTPackContext spc, @NativeType("stbtt_fontinfo *") STBTTFontinfo info, @NativeType("stbtt_pack_range *") STBTTPackRange.Buffer ranges, @NativeType("stbrp_rect *") STBRPRect.Buffer rects) { + if (CHECKS) { + Struct.validate(ranges.address(), ranges.remaining(), STBTTPackRange.SIZEOF, STBTTPackRange::validate); + } + return nstbtt_PackFontRangesGatherRects(spc.address(), info.address(), ranges.address(), ranges.remaining(), rects.address()); + } + + // --- [ stbtt_PackFontRangesPackRects ] --- + + /** + * Unsafe version of: {@link #stbtt_PackFontRangesPackRects PackFontRangesPackRects} + * + * @param num_rects the number of structs in {@code rects} + */ + public static native void nstbtt_PackFontRangesPackRects(long spc, long rects, int num_rects); + + /** + * See {@link #stbtt_PackFontRangesGatherRects PackFontRangesGatherRects}. + * + * @param spc an {@link STBTTPackContext} struct + * @param rects an array of {@link STBRPRect} structs + */ + public static void stbtt_PackFontRangesPackRects(@NativeType("stbtt_pack_context *") STBTTPackContext spc, @NativeType("stbrp_rect *") STBRPRect.Buffer rects) { + nstbtt_PackFontRangesPackRects(spc.address(), rects.address(), rects.remaining()); + } + + // --- [ stbtt_PackFontRangesRenderIntoRects ] --- + + /** + * Unsafe version of: {@link #stbtt_PackFontRangesRenderIntoRects PackFontRangesRenderIntoRects} + * + * @param num_ranges the number of {@link STBTTPackRange} structs in {@code ranges} + */ + public static native int nstbtt_PackFontRangesRenderIntoRects(long spc, long info, long ranges, int num_ranges, long rects); + + /** + * See {@link #stbtt_PackFontRangesGatherRects PackFontRangesGatherRects}. + * + * @param spc an {@link STBTTPackContext} struct + * @param info an {@link STBTTFontinfo} struct + * @param ranges an array of {@link STBTTPackRange} structs + * @param rects an array of {@link STBRPRect} structs. It must be big enough to accommodate all characters in the given ranges. + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbtt_PackFontRangesRenderIntoRects(@NativeType("stbtt_pack_context *") STBTTPackContext spc, @NativeType("stbtt_fontinfo *") STBTTFontinfo info, @NativeType("stbtt_pack_range *") STBTTPackRange.Buffer ranges, @NativeType("stbrp_rect *") STBRPRect.Buffer rects) { + if (CHECKS) { + Struct.validate(ranges.address(), ranges.remaining(), STBTTPackRange.SIZEOF, STBTTPackRange::validate); + } + return nstbtt_PackFontRangesRenderIntoRects(spc.address(), info.address(), ranges.address(), ranges.remaining(), rects.address()) != 0; + } + + // --- [ stbtt_GetNumberOfFonts ] --- + + /** Unsafe version of: {@link #stbtt_GetNumberOfFonts GetNumberOfFonts} */ + public static native int nstbtt_GetNumberOfFonts(long data); + + /** + * Determines the number of fonts in a font file. + * + *

    TrueType collection (.ttc) files may contain multiple fonts, while TrueType font (.ttf) files only contain one font. The number of fonts can be used + * for indexing with {@link #stbtt_GetFontOffsetForIndex GetFontOffsetForIndex} where the index is between zero and one less than the total fonts. If an error occurs, -1 is returned.

    + * + * @param data the font data + */ + public static int stbtt_GetNumberOfFonts(@NativeType("unsigned char const *") ByteBuffer data) { + return nstbtt_GetNumberOfFonts(memAddress(data)); + } + + // --- [ stbtt_GetFontOffsetForIndex ] --- + + /** Unsafe version of: {@link #stbtt_GetFontOffsetForIndex GetFontOffsetForIndex} */ + public static native int nstbtt_GetFontOffsetForIndex(long data, int index); + + /** + * Each .ttf/.ttc file may have more than one font. Each font has a sequential index number starting from 0. Call this function to get the font offset for + * a given index; it returns -1 if the index is out of range. A regular .ttf file will only define one font and it always be at offset 0, so it will + * return '0' for index 0, and -1 for all other indices. + * + * @param data the font data + * @param index the font index + */ + public static int stbtt_GetFontOffsetForIndex(@NativeType("unsigned char const *") ByteBuffer data, int index) { + return nstbtt_GetFontOffsetForIndex(memAddress(data), index); + } + + // --- [ stbtt_InitFont ] --- + + /** Unsafe version of: {@link #stbtt_InitFont InitFont} */ + public static native int nstbtt_InitFont(long info, long data, int offset); + + /** + * Given an offset into the file that defines a font, this function builds the necessary cached info for the rest of the system. You must allocate the + * {@link STBTTFontinfo} yourself, and stbtt_InitFont will fill it out. You don't need to do anything special to free it, because the contents are pure value + * data with no additional data structures. + * + * @param info an {@link STBTTFontinfo} struct + * @param data the font data + * @param offset the font data offset + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbtt_InitFont(@NativeType("stbtt_fontinfo *") STBTTFontinfo info, @NativeType("unsigned char const *") ByteBuffer data, int offset) { + return nstbtt_InitFont(info.address(), memAddress(data), offset) != 0; + } + + /** + * Given an offset into the file that defines a font, this function builds the necessary cached info for the rest of the system. You must allocate the + * {@link STBTTFontinfo} yourself, and stbtt_InitFont will fill it out. You don't need to do anything special to free it, because the contents are pure value + * data with no additional data structures. + * + * @param info an {@link STBTTFontinfo} struct + * @param data the font data + * + * @return 1 on success, 0 on failure + */ + @NativeType("int") + public static boolean stbtt_InitFont(@NativeType("stbtt_fontinfo *") STBTTFontinfo info, @NativeType("unsigned char const *") ByteBuffer data) { + return nstbtt_InitFont(info.address(), memAddress(data), 0) != 0; + } + + // --- [ stbtt_FindGlyphIndex ] --- + + /** Unsafe version of: {@link #stbtt_FindGlyphIndex FindGlyphIndex} */ + public static native int nstbtt_FindGlyphIndex(long info, int unicode_codepoint); + + /** + * If you're going to perform multiple operations on the same character and you want a speed-up, call this function with the character you're going to + * process, then use glyph-based functions instead of the codepoint-based functions. + * + * @param info an {@link STBTTFontinfo} struct + * @param unicode_codepoint the unicode code point + * + * @return the glyph index or 0 if the character codepoint is not defined in the font + */ + public static int stbtt_FindGlyphIndex(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int unicode_codepoint) { + return nstbtt_FindGlyphIndex(info.address(), unicode_codepoint); + } + + // --- [ stbtt_ScaleForPixelHeight ] --- + + /** Unsafe version of: {@link #stbtt_ScaleForPixelHeight ScaleForPixelHeight} */ + public static native float nstbtt_ScaleForPixelHeight(long info, float pixels); + + /** + * Computes a scale factor to produce a font whose "height" is {@code pixels} tall. Height is measured as the distance from the highest ascender to the + * lowest descender; in other words, it's equivalent to calling {@link #stbtt_GetFontVMetrics GetFontVMetrics} and computing: + * + *
    
    +     * scale = pixels / (ascent - descent)
    + * + *

    so if you prefer to measure height by the ascent only, use a similar calculation.

    + * + * @param info an {@link STBTTFontinfo} struct + * @param pixels the font height, in pixels + * + * @return the scale factor + */ + public static float stbtt_ScaleForPixelHeight(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, float pixels) { + return nstbtt_ScaleForPixelHeight(info.address(), pixels); + } + + // --- [ stbtt_ScaleForMappingEmToPixels ] --- + + /** Unsafe version of: {@link #stbtt_ScaleForMappingEmToPixels ScaleForMappingEmToPixels} */ + public static native float nstbtt_ScaleForMappingEmToPixels(long info, float pixels); + + /** + * Computes a scale factor to produce a font whose EM size is mapped to {@code pixels} tall. This is probably what traditional APIs compute, but I'm not + * positive. + * + * @param info an {@link STBTTFontinfo} struct + * @param pixels the font height, in pixels + * + * @return the scale factor + */ + public static float stbtt_ScaleForMappingEmToPixels(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, float pixels) { + return nstbtt_ScaleForMappingEmToPixels(info.address(), pixels); + } + + // --- [ stbtt_GetFontVMetrics ] --- + + /** Unsafe version of: {@link #stbtt_GetFontVMetrics GetFontVMetrics} */ + public static native void nstbtt_GetFontVMetrics(long info, long ascent, long descent, long lineGap); + + /** + * Returns vertical metrics for the specified font. You should advance the vertical position by {@code *ascent - *descent + *lineGap} + * + *

    The returned values are expressed in unscaled coordinates, so you must multiply by the scale factor for a given size.

    + * + * @param info an {@link STBTTFontinfo} struct + * @param ascent returns the coordinate above the baseline the font extends + * @param descent returns the coordinate below the baseline the font extends (i.e. it is typically negative) + * @param lineGap returns the spacing between one row's descent and the next row's ascent + */ + public static void stbtt_GetFontVMetrics(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @Nullable @NativeType("int *") IntBuffer ascent, @Nullable @NativeType("int *") IntBuffer descent, @Nullable @NativeType("int *") IntBuffer lineGap) { + if (CHECKS) { + checkSafe(ascent, 1); + checkSafe(descent, 1); + checkSafe(lineGap, 1); + } + nstbtt_GetFontVMetrics(info.address(), memAddressSafe(ascent), memAddressSafe(descent), memAddressSafe(lineGap)); + } + + // --- [ stbtt_GetFontVMetricsOS2 ] --- + + /** Unsafe version of: {@link #stbtt_GetFontVMetricsOS2 GetFontVMetricsOS2} */ + public static native int nstbtt_GetFontVMetricsOS2(long info, long typoAscent, long typoDescent, long typoLineGap); + + /** + * Analogous to {@link #stbtt_GetFontVMetrics GetFontVMetrics}, but returns the "typographic" values from the OS/2 table (specific to MS/Windows TTF files). + * + * @param info an {@link STBTTFontinfo} struct + * @param typoAscent returns the coordinate above the baseline the font extends + * @param typoDescent returns the coordinate below the baseline the font extends (i.e. it is typically negative) + * @param typoLineGap returns the spacing between one row's descent and the next row's ascent + * + * @return 1 on success (table present), 0 on failure + */ + @NativeType("int") + public static boolean stbtt_GetFontVMetricsOS2(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @Nullable @NativeType("int *") IntBuffer typoAscent, @Nullable @NativeType("int *") IntBuffer typoDescent, @Nullable @NativeType("int *") IntBuffer typoLineGap) { + if (CHECKS) { + checkSafe(typoAscent, 1); + checkSafe(typoDescent, 1); + checkSafe(typoLineGap, 1); + } + return nstbtt_GetFontVMetricsOS2(info.address(), memAddressSafe(typoAscent), memAddressSafe(typoDescent), memAddressSafe(typoLineGap)) != 0; + } + + // --- [ stbtt_GetFontBoundingBox ] --- + + /** Unsafe version of: {@link #stbtt_GetFontBoundingBox GetFontBoundingBox} */ + public static native void nstbtt_GetFontBoundingBox(long info, long x0, long y0, long x1, long y1); + + /** + * Returns the bounding box around all possible characters. + * + * @param info an {@link STBTTFontinfo} struct + * @param x0 the left coordinate + * @param y0 the bottom coordinate + * @param x1 the right coordinate + * @param y1 the top coordinate + */ + public static void stbtt_GetFontBoundingBox(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("int *") IntBuffer x0, @NativeType("int *") IntBuffer y0, @NativeType("int *") IntBuffer x1, @NativeType("int *") IntBuffer y1) { + if (CHECKS) { + check(x0, 1); + check(y0, 1); + check(x1, 1); + check(y1, 1); + } + nstbtt_GetFontBoundingBox(info.address(), memAddress(x0), memAddress(y0), memAddress(x1), memAddress(y1)); + } + + // --- [ stbtt_GetCodepointHMetrics ] --- + + /** Unsafe version of: {@link #stbtt_GetCodepointHMetrics GetCodepointHMetrics} */ + public static native void nstbtt_GetCodepointHMetrics(long info, int codepoint, long advanceWidth, long leftSideBearing); + + /** + * Returns horizontal metrics for the specified codepoint. + * + *

    The returned values are expressed in unscaled coordinates.

    + * + * @param info an {@link STBTTFontinfo} struct + * @param codepoint the unicode codepoint + * @param advanceWidth the offset from the current horizontal position to the next horizontal position + * @param leftSideBearing the offset from the current horizontal position to the left edge of the character + */ + public static void stbtt_GetCodepointHMetrics(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int codepoint, @Nullable @NativeType("int *") IntBuffer advanceWidth, @Nullable @NativeType("int *") IntBuffer leftSideBearing) { + if (CHECKS) { + checkSafe(advanceWidth, 1); + checkSafe(leftSideBearing, 1); + } + nstbtt_GetCodepointHMetrics(info.address(), codepoint, memAddressSafe(advanceWidth), memAddressSafe(leftSideBearing)); + } + + // --- [ stbtt_GetCodepointKernAdvance ] --- + + /** Unsafe version of: {@link #stbtt_GetCodepointKernAdvance GetCodepointKernAdvance} */ + public static native int nstbtt_GetCodepointKernAdvance(long info, int ch1, int ch2); + + /** + * Returns the additional amount to add to the {@code advance} value between {@code ch1} and {@code ch2}. + * + * @param info an {@link STBTTFontinfo} struct + * @param ch1 the first unicode codepoint + * @param ch2 the second unicode codepoint + */ + public static int stbtt_GetCodepointKernAdvance(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int ch1, int ch2) { + return nstbtt_GetCodepointKernAdvance(info.address(), ch1, ch2); + } + + // --- [ stbtt_GetCodepointBox ] --- + + /** Unsafe version of: {@link #stbtt_GetCodepointBox GetCodepointBox} */ + public static native int nstbtt_GetCodepointBox(long info, int codepoint, long x0, long y0, long x1, long y1); + + /** + * Gets the bounding box of the visible part of the glyph, in unscaled coordinates. + * + * @param info an {@link STBTTFontinfo} struct + * @param codepoint the unicode codepoint + * @param x0 returns the left coordinate + * @param y0 returns the bottom coordinate + * @param x1 returns the right coordinate + * @param y1 returns the top coordinate + */ + @NativeType("int") + public static boolean stbtt_GetCodepointBox(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int codepoint, @Nullable @NativeType("int *") IntBuffer x0, @Nullable @NativeType("int *") IntBuffer y0, @Nullable @NativeType("int *") IntBuffer x1, @Nullable @NativeType("int *") IntBuffer y1) { + if (CHECKS) { + checkSafe(x0, 1); + checkSafe(y0, 1); + checkSafe(x1, 1); + checkSafe(y1, 1); + } + return nstbtt_GetCodepointBox(info.address(), codepoint, memAddressSafe(x0), memAddressSafe(y0), memAddressSafe(x1), memAddressSafe(y1)) != 0; + } + + // --- [ stbtt_GetGlyphHMetrics ] --- + + /** Unsafe version of: {@link #stbtt_GetGlyphHMetrics GetGlyphHMetrics} */ + public static native void nstbtt_GetGlyphHMetrics(long info, int glyph_index, long advanceWidth, long leftSideBearing); + + /** + * Glyph version of {@link #stbtt_GetCodepointHMetrics GetCodepointHMetrics}, for greater efficiency. + * + * @param info an {@link STBTTFontinfo} struct + * @param glyph_index the glyph index + * @param advanceWidth the offset from the current horizontal position to the next horizontal position + * @param leftSideBearing the offset from the current horizontal position to the left edge of the character + */ + public static void stbtt_GetGlyphHMetrics(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int glyph_index, @Nullable @NativeType("int *") IntBuffer advanceWidth, @Nullable @NativeType("int *") IntBuffer leftSideBearing) { + if (CHECKS) { + checkSafe(advanceWidth, 1); + checkSafe(leftSideBearing, 1); + } + nstbtt_GetGlyphHMetrics(info.address(), glyph_index, memAddressSafe(advanceWidth), memAddressSafe(leftSideBearing)); + } + + // --- [ stbtt_GetGlyphKernAdvance ] --- + + /** Unsafe version of: {@link #stbtt_GetGlyphKernAdvance GetGlyphKernAdvance} */ + public static native int nstbtt_GetGlyphKernAdvance(long info, int glyph1, int glyph2); + + /** + * Glyph version of {@link #stbtt_GetCodepointKernAdvance GetCodepointKernAdvance}, for greater efficiency. + * + * @param info an {@link STBTTFontinfo} struct + * @param glyph1 the first glyph index + * @param glyph2 the second glyph index + */ + public static int stbtt_GetGlyphKernAdvance(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int glyph1, int glyph2) { + return nstbtt_GetGlyphKernAdvance(info.address(), glyph1, glyph2); + } + + // --- [ stbtt_GetGlyphBox ] --- + + /** Unsafe version of: {@link #stbtt_GetGlyphBox GetGlyphBox} */ + public static native int nstbtt_GetGlyphBox(long info, int glyph_index, long x0, long y0, long x1, long y1); + + /** + * Glyph version of {@link #stbtt_GetCodepointBox GetCodepointBox}, for greater efficiency. + * + * @param info an {@link STBTTFontinfo} struct + * @param glyph_index the glyph index + * @param x0 returns the left coordinate + * @param y0 returns the bottom coordinate + * @param x1 returns the right coordinate + * @param y1 returns the top coordinate + */ + @NativeType("int") + public static boolean stbtt_GetGlyphBox(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int glyph_index, @Nullable @NativeType("int *") IntBuffer x0, @Nullable @NativeType("int *") IntBuffer y0, @Nullable @NativeType("int *") IntBuffer x1, @Nullable @NativeType("int *") IntBuffer y1) { + if (CHECKS) { + checkSafe(x0, 1); + checkSafe(y0, 1); + checkSafe(x1, 1); + checkSafe(y1, 1); + } + return nstbtt_GetGlyphBox(info.address(), glyph_index, memAddressSafe(x0), memAddressSafe(y0), memAddressSafe(x1), memAddressSafe(y1)) != 0; + } + + // --- [ stbtt_GetKerningTableLength ] --- + + public static native int nstbtt_GetKerningTableLength(long info); + + public static int stbtt_GetKerningTableLength(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info) { + return nstbtt_GetKerningTableLength(info.address()); + } + + // --- [ stbtt_GetKerningTable ] --- + + /** Unsafe version of: {@link #stbtt_GetKerningTable GetKerningTable} */ + public static native int nstbtt_GetKerningTable(long info, long table, int table_length); + + /** + * Retrieves a complete list of all of the kerning pairs provided by the font. + * + *

    {@code stbtt_GetKerningTable} never writes more than {@code table_length} entries and returns how many entries it did write. The table will be sorted + * by {@code (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1)}

    + */ + public static int stbtt_GetKerningTable(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("stbtt_kerningentry *") STBTTKerningentry.Buffer table) { + return nstbtt_GetKerningTable(info.address(), table.address(), table.remaining()); + } + + // --- [ stbtt_IsGlyphEmpty ] --- + + /** Unsafe version of: {@link #stbtt_IsGlyphEmpty IsGlyphEmpty} */ + public static native int nstbtt_IsGlyphEmpty(long info, int glyph_index); + + /** + * Returns non-zero if nothing is drawn for this glyph. + * + * @param info an {@link STBTTFontinfo} struct + * @param glyph_index the glyph index + */ + @NativeType("int") + public static boolean stbtt_IsGlyphEmpty(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int glyph_index) { + return nstbtt_IsGlyphEmpty(info.address(), glyph_index) != 0; + } + + // --- [ stbtt_GetCodepointShape ] --- + + /** Unsafe version of: {@link #stbtt_GetCodepointShape GetCodepointShape} */ + public static native int nstbtt_GetCodepointShape(long info, int unicode_codepoint, long vertices); + + /** + * Returns number of vertices and fills {@code *vertices} with the pointer to them + * + *

    The shape is a series of contours. Each one starts with a {@link #STBTT_vmove vmove}, then consists of a series of mixed {@link #STBTT_vline vline} and {@link #STBTT_vcurve vcurve} segments. A {@link #STBTT_vline vline} draws a + * line from previous endpoint to its {@code x,y}; a {@link #STBTT_vcurve vcurve} draws a quadratic bezier from previous endpoint to its {@code x,y}, using {@code cx,cy} as + * the bezier control point.

    + * + *

    The {@link STBTTVertex} values are expressed in "unscaled" coordinates.

    + * + * @param info an {@link STBTTFontinfo} struct + * @param unicode_codepoint the unicode codepoint + * @param vertices returns a pointer to an array of {@link STBTTVertex} structs + */ + public static int stbtt_GetCodepointShape(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int unicode_codepoint, @NativeType("stbtt_vertex **") PointerBuffer vertices) { + if (CHECKS) { + check(vertices, 1); + } + return nstbtt_GetCodepointShape(info.address(), unicode_codepoint, memAddress(vertices)); + } + + /** + * Returns number of vertices and fills {@code *vertices} with the pointer to them + * + *

    The shape is a series of contours. Each one starts with a {@link #STBTT_vmove vmove}, then consists of a series of mixed {@link #STBTT_vline vline} and {@link #STBTT_vcurve vcurve} segments. A {@link #STBTT_vline vline} draws a + * line from previous endpoint to its {@code x,y}; a {@link #STBTT_vcurve vcurve} draws a quadratic bezier from previous endpoint to its {@code x,y}, using {@code cx,cy} as + * the bezier control point.

    + * + *

    The {@link STBTTVertex} values are expressed in "unscaled" coordinates.

    + * + * @param info an {@link STBTTFontinfo} struct + * @param unicode_codepoint the unicode codepoint + */ + @Nullable + @NativeType("int") + public static STBTTVertex.Buffer stbtt_GetCodepointShape(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int unicode_codepoint) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer vertices = stack.pointers(NULL); + int __result = nstbtt_GetCodepointShape(info.address(), unicode_codepoint, memAddress(vertices)); + return STBTTVertex.createSafe(vertices.get(0), __result); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbtt_GetGlyphShape ] --- + + /** Unsafe version of: {@link #stbtt_GetGlyphShape GetGlyphShape} */ + public static native int nstbtt_GetGlyphShape(long info, int glyph_index, long vertices); + + /** + * Glyph version of {@link #stbtt_GetCodepointShape GetCodepointShape}, for greater efficiency. + * + * @param info an {@link STBTTFontinfo} struct + * @param glyph_index the unicode codepoint + * @param vertices returns a pointer to an array of {@link STBTTVertex} structs + */ + public static int stbtt_GetGlyphShape(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int glyph_index, @NativeType("stbtt_vertex **") PointerBuffer vertices) { + if (CHECKS) { + check(vertices, 1); + } + return nstbtt_GetGlyphShape(info.address(), glyph_index, memAddress(vertices)); + } + + /** + * Glyph version of {@link #stbtt_GetCodepointShape GetCodepointShape}, for greater efficiency. + * + * @param info an {@link STBTTFontinfo} struct + * @param glyph_index the unicode codepoint + */ + @Nullable + @NativeType("int") + public static STBTTVertex.Buffer stbtt_GetGlyphShape(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int glyph_index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer vertices = stack.pointers(NULL); + int __result = nstbtt_GetGlyphShape(info.address(), glyph_index, memAddress(vertices)); + return STBTTVertex.createSafe(vertices.get(0), __result); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbtt_FreeShape ] --- + + /** Unsafe version of: {@link #stbtt_FreeShape FreeShape} */ + public static native void nstbtt_FreeShape(long info, long vertices); + + /** + * Frees the data allocated by {@link #stbtt_GetCodepointShape GetCodepointShape} and {@link #stbtt_GetGlyphShape GetGlyphShape}. + * + * @param info an {@link STBTTFontinfo} struct + * @param vertices the array of {@link STBTTVertex} structs to free + */ + public static void stbtt_FreeShape(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("stbtt_vertex *") STBTTVertex.Buffer vertices) { + if (CHECKS) { + check(vertices, 1); + } + nstbtt_FreeShape(info.address(), vertices.address()); + } + + // --- [ stbtt_FindSVGDoc ] --- + + public static native long nstbtt_FindSVGDoc(long info, int gl); + + @NativeType("unsigned char *") + public static long stbtt_FindSVGDoc(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int gl) { + return nstbtt_FindSVGDoc(info.address(), gl); + } + + // --- [ stbtt_GetCodepointSVG ] --- + + /** Unsafe version of: {@link #stbtt_GetCodepointSVG GetCodepointSVG} */ + public static native int nstbtt_GetCodepointSVG(long info, int unicode_codepoint, long svg); + + /** + * Fills {@code svg} with the character's SVG data. + * + * @return data size or 0 if SVG not found + */ + public static int stbtt_GetCodepointSVG(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int unicode_codepoint, @NativeType("char const **") PointerBuffer svg) { + if (CHECKS) { + check(svg, 1); + } + return nstbtt_GetCodepointSVG(info.address(), unicode_codepoint, memAddress(svg)); + } + + // --- [ stbtt_GetGlyphSVG ] --- + + /** Unsafe version of: {@link #stbtt_GetGlyphSVG GetGlyphSVG} */ + public static native int nstbtt_GetGlyphSVG(long info, int gl, long svg); + + /** + * Fills {@code svg} with the character's SVG data. + * + * @return data size or 0 if SVG not found + */ + public static int stbtt_GetGlyphSVG(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int gl, @NativeType("char const **") PointerBuffer svg) { + if (CHECKS) { + check(svg, 1); + } + return nstbtt_GetGlyphSVG(info.address(), gl, memAddress(svg)); + } + + // --- [ stbtt_FreeBitmap ] --- + + /** Unsafe version of: {@link #stbtt_FreeBitmap FreeBitmap} */ + public static native void nstbtt_FreeBitmap(long bitmap, long userdata); + + /** + * Frees a bitmap allocated by {@link #stbtt_GetCodepointBitmap GetCodepointBitmap}, {@link #stbtt_GetCodepointBitmapSubpixel GetCodepointBitmapSubpixel}, {@link #stbtt_GetGlyphBitmap GetGlyphBitmap} or {@link #stbtt_GetGlyphBitmapSubpixel GetGlyphBitmapSubpixel}. + * + * @param bitmap the bitmap to free + * @param userdata a pointer to an allocation context + */ + public static void stbtt_FreeBitmap(@NativeType("unsigned char *") ByteBuffer bitmap, @NativeType("void *") long userdata) { + nstbtt_FreeBitmap(memAddress(bitmap), userdata); + } + + /** + * Frees a bitmap allocated by {@link #stbtt_GetCodepointBitmap GetCodepointBitmap}, {@link #stbtt_GetCodepointBitmapSubpixel GetCodepointBitmapSubpixel}, {@link #stbtt_GetGlyphBitmap GetGlyphBitmap} or {@link #stbtt_GetGlyphBitmapSubpixel GetGlyphBitmapSubpixel}. + * + * @param bitmap the bitmap to free + */ + public static void stbtt_FreeBitmap(@NativeType("unsigned char *") ByteBuffer bitmap) { + nstbtt_FreeBitmap(memAddress(bitmap), NULL); + } + + // --- [ stbtt_GetCodepointBitmap ] --- + + /** Unsafe version of: {@link #stbtt_GetCodepointBitmap GetCodepointBitmap} */ + public static native long nstbtt_GetCodepointBitmap(long info, float scale_x, float scale_y, int codepoint, long width, long height, long xoff, long yoff); + + /** + * Allocates a large-enough single-channel 8bpp bitmap and renders the specified character/glyph at the specified scale into it, with antialiasing. + * + * @param info an {@link STBTTFontinfo} struct + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param codepoint the unicode codepoint to render + * @param width returns the bitmap width + * @param height returns the bitmap height + * @param xoff returns the horizontal offset in pixel space from the glyph origin to the left of the bitmap + * @param yoff returns the vertical offset in pixel space from the glyph origin to the top of the bitmap + */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetCodepointBitmap(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, float scale_x, float scale_y, int codepoint, @NativeType("int *") IntBuffer width, @NativeType("int *") IntBuffer height, @Nullable @NativeType("int *") IntBuffer xoff, @Nullable @NativeType("int *") IntBuffer yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + checkSafe(xoff, 1); + checkSafe(yoff, 1); + } + long __result = nstbtt_GetCodepointBitmap(info.address(), scale_x, scale_y, codepoint, memAddress(width), memAddress(height), memAddressSafe(xoff), memAddressSafe(yoff)); + return memByteBufferSafe(__result, width.get(width.position()) * height.get(height.position())); + } + + // --- [ stbtt_GetCodepointBitmapSubpixel ] --- + + /** Unsafe version of: {@link #stbtt_GetCodepointBitmapSubpixel GetCodepointBitmapSubpixel} */ + public static native long nstbtt_GetCodepointBitmapSubpixel(long info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, long width, long height, long xoff, long yoff); + + /** + * Same as {@link #stbtt_GetCodepointBitmap GetCodepointBitmap}, but you can specify a subpixel shift for the character. + * + * @param info an {@link STBTTFontinfo} struct + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param shift_x the horizontal subpixel shift + * @param shift_y the vertical subpixel shift + * @param codepoint the unicode codepoint to render + * @param width returns the bitmap width + * @param height returns the bitmap height + * @param xoff returns the horizontal offset in pixel space from the glyph origin to the left of the bitmap + * @param yoff returns the vertical offset in pixel space from the glyph origin to the top of the bitmap + */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetCodepointBitmapSubpixel(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, @NativeType("int *") IntBuffer width, @NativeType("int *") IntBuffer height, @Nullable @NativeType("int *") IntBuffer xoff, @Nullable @NativeType("int *") IntBuffer yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + checkSafe(xoff, 1); + checkSafe(yoff, 1); + } + long __result = nstbtt_GetCodepointBitmapSubpixel(info.address(), scale_x, scale_y, shift_x, shift_y, codepoint, memAddress(width), memAddress(height), memAddressSafe(xoff), memAddressSafe(yoff)); + return memByteBufferSafe(__result, width.get(width.position()) * height.get(height.position())); + } + + // --- [ stbtt_MakeCodepointBitmap ] --- + + /** Unsafe version of: {@link #stbtt_MakeCodepointBitmap MakeCodepointBitmap} */ + public static native void nstbtt_MakeCodepointBitmap(long info, long output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); + + /** + * Same as {@link #stbtt_GetCodepointBitmap GetCodepointBitmap}, but you pass in storage for the bitmap in the form of {@code output}, with row spacing of {@code out_stride} bytes. The + * bitmap is clipped to {@code out_w/out_h} bytes. Call {@link #stbtt_GetCodepointBitmapBox GetCodepointBitmapBox} to get the width and height and positioning info for it first. + * + * @param info an {@link STBTTFontinfo} struct + * @param output the bitmap storage + * @param out_w the bitmap width + * @param out_h the bitmap height + * @param out_stride the row stride, in bytes + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param codepoint the unicode codepoint to render + */ + public static void stbtt_MakeCodepointBitmap(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("unsigned char *") ByteBuffer output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) { + if (CHECKS) { + check(output, (out_stride != 0 ? out_stride : out_w) * out_h); + } + nstbtt_MakeCodepointBitmap(info.address(), memAddress(output), out_w, out_h, out_stride, scale_x, scale_y, codepoint); + } + + // --- [ stbtt_MakeCodepointBitmapSubpixel ] --- + + /** Unsafe version of: {@link #stbtt_MakeCodepointBitmapSubpixel MakeCodepointBitmapSubpixel} */ + public static native void nstbtt_MakeCodepointBitmapSubpixel(long info, long output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); + + /** + * Same as {@link #stbtt_MakeCodepointBitmap MakeCodepointBitmap}, but you can specify a subpixel shift for the character. + * + * @param info an {@link STBTTFontinfo} struct + * @param output the bitmap storage + * @param out_w the bitmap width + * @param out_h the bitmap height + * @param out_stride the row stride, in bytes + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param shift_x the horizontal subpixel shift + * @param shift_y the vertical subpixel shift + * @param codepoint the unicode codepoint to render + */ + public static void stbtt_MakeCodepointBitmapSubpixel(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("unsigned char *") ByteBuffer output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) { + if (CHECKS) { + check(output, (out_stride != 0 ? out_stride : out_w) * out_h); + } + nstbtt_MakeCodepointBitmapSubpixel(info.address(), memAddress(output), out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, codepoint); + } + + // --- [ stbtt_MakeCodepointBitmapSubpixelPrefilter ] --- + + /** Unsafe version of: {@link #stbtt_MakeCodepointBitmapSubpixelPrefilter MakeCodepointBitmapSubpixelPrefilter} */ + public static native void nstbtt_MakeCodepointBitmapSubpixelPrefilter(long info, long output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, long sub_x, long sub_y, int codepoint); + + /** + * Same as {@link #stbtt_MakeCodepointBitmapSubpixel MakeCodepointBitmapSubpixel}, but prefiltering is performed (see {@link #stbtt_PackSetOversampling PackSetOversampling}). + * + * @param info an {@link STBTTFontinfo} struct + * @param output the bitmap storage + * @param out_w the bitmap width + * @param out_h the bitmap height + * @param out_stride the row stride, in bytes + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param shift_x the horizontal subpixel shift + * @param shift_y the vertical subpixel shift + * @param oversample_x the horizontal oversampling amount + * @param oversample_y the vertical oversampling amount + * @param sub_x returns the horizontal oversample shift + * @param sub_y returns the vertical oversample shift + * @param codepoint the unicode codepoint to render + */ + public static void stbtt_MakeCodepointBitmapSubpixelPrefilter(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("unsigned char *") ByteBuffer output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, @NativeType("float *") FloatBuffer sub_x, @NativeType("float *") FloatBuffer sub_y, int codepoint) { + if (CHECKS) { + check(output, (out_stride != 0 ? out_stride : out_w) * out_h); + check(sub_x, 1); + check(sub_y, 1); + } + nstbtt_MakeCodepointBitmapSubpixelPrefilter(info.address(), memAddress(output), out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, memAddress(sub_x), memAddress(sub_y), codepoint); + } + + // --- [ stbtt_GetCodepointBitmapBox ] --- + + /** Unsafe version of: {@link #stbtt_GetCodepointBitmapBox GetCodepointBitmapBox} */ + public static native void nstbtt_GetCodepointBitmapBox(long font, int codepoint, float scale_x, float scale_y, long ix0, long iy0, long ix1, long iy1); + + /** + * Get the bbox of the bitmap centered around the glyph origin; so the bitmap width is {@code ix1-ix0}, height is {@code iy1-iy0}, and location to place + * the bitmap top left is {@code (leftSideBearing*scale,iy0)}. + * + *

    Note that the bitmap uses y-increases-down, but the shape uses y-increases-up, so {@code CodepointBitmapBox} and {@code CodepointBox} are inverted.

    + * + * @param font an {@link STBTTFontinfo} struct + * @param codepoint the unicode codepoint + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param ix0 returns the left coordinate + * @param iy0 returns the bottom coordinate + * @param ix1 returns the right coordinate + * @param iy1 returns the top coordinate + */ + public static void stbtt_GetCodepointBitmapBox(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, int codepoint, float scale_x, float scale_y, @Nullable @NativeType("int *") IntBuffer ix0, @Nullable @NativeType("int *") IntBuffer iy0, @Nullable @NativeType("int *") IntBuffer ix1, @Nullable @NativeType("int *") IntBuffer iy1) { + if (CHECKS) { + checkSafe(ix0, 1); + checkSafe(iy0, 1); + checkSafe(ix1, 1); + checkSafe(iy1, 1); + } + nstbtt_GetCodepointBitmapBox(font.address(), codepoint, scale_x, scale_y, memAddressSafe(ix0), memAddressSafe(iy0), memAddressSafe(ix1), memAddressSafe(iy1)); + } + + // --- [ stbtt_GetCodepointBitmapBoxSubpixel ] --- + + /** Unsafe version of: {@link #stbtt_GetCodepointBitmapBoxSubpixel GetCodepointBitmapBoxSubpixel} */ + public static native void nstbtt_GetCodepointBitmapBoxSubpixel(long font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, long ix0, long iy0, long ix1, long iy1); + + /** + * Same as {@link #stbtt_GetCodepointBitmapBox GetCodepointBitmapBox}, but you can specify a subpixel shift for the character. + * + * @param font an {@link STBTTFontinfo} struct + * @param codepoint the unicode codepoint + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param shift_x the horizontal subpixel shift + * @param shift_y the vertical subpixel shift + * @param ix0 returns the left coordinate + * @param iy0 returns the bottom coordinate + * @param ix1 returns the right coordinate + * @param iy1 returns the top coordinate + */ + public static void stbtt_GetCodepointBitmapBoxSubpixel(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, @Nullable @NativeType("int *") IntBuffer ix0, @Nullable @NativeType("int *") IntBuffer iy0, @Nullable @NativeType("int *") IntBuffer ix1, @Nullable @NativeType("int *") IntBuffer iy1) { + if (CHECKS) { + checkSafe(ix0, 1); + checkSafe(iy0, 1); + checkSafe(ix1, 1); + checkSafe(iy1, 1); + } + nstbtt_GetCodepointBitmapBoxSubpixel(font.address(), codepoint, scale_x, scale_y, shift_x, shift_y, memAddressSafe(ix0), memAddressSafe(iy0), memAddressSafe(ix1), memAddressSafe(iy1)); + } + + // --- [ stbtt_GetGlyphBitmap ] --- + + /** Unsafe version of: {@link #stbtt_GetGlyphBitmap GetGlyphBitmap} */ + public static native long nstbtt_GetGlyphBitmap(long info, float scale_x, float scale_y, int glyph, long width, long height, long xoff, long yoff); + + /** + * Allocates a large-enough single-channel 8bpp bitmap and renders the specified character/glyph at the specified scale into it, with antialiasing. + * + * @param info an {@link STBTTFontinfo} struct + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param glyph the glyph index to render + * @param width returns the bitmap width + * @param height returns the bitmap height + * @param xoff returns the horizontal offset in pixel space from the glyph origin to the left of the bitmap + * @param yoff returns the vertical offset in pixel space from the glyph origin to the top of the bitmap + */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetGlyphBitmap(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, float scale_x, float scale_y, int glyph, @NativeType("int *") IntBuffer width, @NativeType("int *") IntBuffer height, @Nullable @NativeType("int *") IntBuffer xoff, @Nullable @NativeType("int *") IntBuffer yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + checkSafe(xoff, 1); + checkSafe(yoff, 1); + } + long __result = nstbtt_GetGlyphBitmap(info.address(), scale_x, scale_y, glyph, memAddress(width), memAddress(height), memAddressSafe(xoff), memAddressSafe(yoff)); + return memByteBufferSafe(__result, width.get(width.position()) * height.get(height.position())); + } + + // --- [ stbtt_GetGlyphBitmapSubpixel ] --- + + /** Unsafe version of: {@link #stbtt_GetGlyphBitmapSubpixel GetGlyphBitmapSubpixel} */ + public static native long nstbtt_GetGlyphBitmapSubpixel(long info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, long width, long height, long xoff, long yoff); + + /** + * Same as {@link #stbtt_GetGlyphBitmap GetGlyphBitmap}, but you can specify a subpixel shift for the character. + * + * @param info an {@link STBTTFontinfo} struct + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param shift_x the horizontal subpixel shift + * @param shift_y the vertical subpixel shift + * @param glyph the glyph index to render + * @param width returns the bitmap width + * @param height returns the bitmap height + * @param xoff returns the horizontal offset in pixel space from the glyph origin to the left of the bitmap + * @param yoff returns the vertical offset in pixel space from the glyph origin to the top of the bitmap + */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetGlyphBitmapSubpixel(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, @NativeType("int *") IntBuffer width, @NativeType("int *") IntBuffer height, @Nullable @NativeType("int *") IntBuffer xoff, @Nullable @NativeType("int *") IntBuffer yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + checkSafe(xoff, 1); + checkSafe(yoff, 1); + } + long __result = nstbtt_GetGlyphBitmapSubpixel(info.address(), scale_x, scale_y, shift_x, shift_y, glyph, memAddress(width), memAddress(height), memAddressSafe(xoff), memAddressSafe(yoff)); + return memByteBufferSafe(__result, width.get(width.position()) * height.get(height.position())); + } + + // --- [ stbtt_MakeGlyphBitmap ] --- + + /** Unsafe version of: {@link #stbtt_MakeGlyphBitmap MakeGlyphBitmap} */ + public static native void nstbtt_MakeGlyphBitmap(long info, long output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); + + /** + * Same as {@link #stbtt_GetGlyphBitmap GetGlyphBitmap}, but you pass in storage for the bitmap in the form of {@code output}, with row spacing of {@code out_stride} bytes. The + * bitmap is clipped to {@code out_w/out_h} bytes. Call {@link #stbtt_GetGlyphBitmapBox GetGlyphBitmapBox} to get the width and height and positioning info for it first. + * + * @param info an {@link STBTTFontinfo} struct + * @param output the bitmap storage + * @param out_w the bitmap width + * @param out_h the bitmap height + * @param out_stride the row stride, in bytes + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param glyph the glyph index to render + */ + public static void stbtt_MakeGlyphBitmap(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("unsigned char *") ByteBuffer output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) { + if (CHECKS) { + check(output, (out_stride != 0 ? out_stride : out_w) * out_h); + } + nstbtt_MakeGlyphBitmap(info.address(), memAddress(output), out_w, out_h, out_stride, scale_x, scale_y, glyph); + } + + // --- [ stbtt_MakeGlyphBitmapSubpixel ] --- + + /** Unsafe version of: {@link #stbtt_MakeGlyphBitmapSubpixel MakeGlyphBitmapSubpixel} */ + public static native void nstbtt_MakeGlyphBitmapSubpixel(long info, long output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); + + /** + * Same as {@link #stbtt_MakeGlyphBitmap MakeGlyphBitmap}, but you can specify a subpixel shift for the character. + * + * @param info an {@link STBTTFontinfo} struct + * @param output the bitmap storage + * @param out_w the bitmap width + * @param out_h the bitmap height + * @param out_stride the row stride, in bytes + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param shift_x the horizontal subpixel shift + * @param shift_y the vertical subpixel shift + * @param glyph the glyph index to render + */ + public static void stbtt_MakeGlyphBitmapSubpixel(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("unsigned char *") ByteBuffer output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) { + if (CHECKS) { + check(output, (out_stride != 0 ? out_stride : out_w) * out_h); + } + nstbtt_MakeGlyphBitmapSubpixel(info.address(), memAddress(output), out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, glyph); + } + + // --- [ stbtt_MakeGlyphBitmapSubpixelPrefilter ] --- + + /** Unsafe version of: {@link #stbtt_MakeGlyphBitmapSubpixelPrefilter MakeGlyphBitmapSubpixelPrefilter} */ + public static native void nstbtt_MakeGlyphBitmapSubpixelPrefilter(long info, long output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, long sub_x, long sub_y, int glyph); + + /** + * Same as {@link #stbtt_MakeGlyphBitmapSubpixel MakeGlyphBitmapSubpixel}, but prefiltering is performed (see {@link #stbtt_PackSetOversampling PackSetOversampling}). + * + * @param info an {@link STBTTFontinfo} struct + * @param output the bitmap storage + * @param out_w the bitmap width + * @param out_h the bitmap height + * @param out_stride the row stride, in bytes + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param shift_x the horizontal subpixel shift + * @param shift_y the vertical subpixel shift + * @param oversample_x the horizontal oversampling amount + * @param oversample_y the vertical oversampling amount + * @param sub_x returns the horizontal oversample shift + * @param sub_y returns the vertical oversample shift + * @param glyph the glyph index to render + */ + public static void stbtt_MakeGlyphBitmapSubpixelPrefilter(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("unsigned char *") ByteBuffer output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, @NativeType("float *") FloatBuffer sub_x, @NativeType("float *") FloatBuffer sub_y, int glyph) { + if (CHECKS) { + check(output, (out_stride != 0 ? out_stride : out_w) * out_h); + check(sub_x, 1); + check(sub_y, 1); + } + nstbtt_MakeGlyphBitmapSubpixelPrefilter(info.address(), memAddress(output), out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, memAddress(sub_x), memAddress(sub_y), glyph); + } + + // --- [ stbtt_GetGlyphBitmapBox ] --- + + /** Unsafe version of: {@link #stbtt_GetGlyphBitmapBox GetGlyphBitmapBox} */ + public static native void nstbtt_GetGlyphBitmapBox(long font, int glyph, float scale_x, float scale_y, long ix0, long iy0, long ix1, long iy1); + + /** + * Get the bbox of the bitmap centered around the glyph origin; so the bitmap width is {@code ix1-ix0}, height is {@code iy1-iy0}, and location to place + * the bitmap top left is {@code (leftSideBearing*scale,iy0)}. + * + *

    Note that the bitmap uses y-increases-down, but the shape uses y-increases-up, so {@code GlyphBitmapBox} and {@code GlyphBox} are inverted.

    + * + * @param font an {@link STBTTFontinfo} struct + * @param glyph the glyph index + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param ix0 returns the left coordinate + * @param iy0 returns the bottom coordinate + * @param ix1 returns the right coordinate + * @param iy1 returns the top coordinate + */ + public static void stbtt_GetGlyphBitmapBox(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, int glyph, float scale_x, float scale_y, @Nullable @NativeType("int *") IntBuffer ix0, @Nullable @NativeType("int *") IntBuffer iy0, @Nullable @NativeType("int *") IntBuffer ix1, @Nullable @NativeType("int *") IntBuffer iy1) { + if (CHECKS) { + checkSafe(ix0, 1); + checkSafe(iy0, 1); + checkSafe(ix1, 1); + checkSafe(iy1, 1); + } + nstbtt_GetGlyphBitmapBox(font.address(), glyph, scale_x, scale_y, memAddressSafe(ix0), memAddressSafe(iy0), memAddressSafe(ix1), memAddressSafe(iy1)); + } + + // --- [ stbtt_GetGlyphBitmapBoxSubpixel ] --- + + /** Unsafe version of: {@link #stbtt_GetGlyphBitmapBoxSubpixel GetGlyphBitmapBoxSubpixel} */ + public static native void nstbtt_GetGlyphBitmapBoxSubpixel(long font, int glyph, float scale_x, float scale_y, float shift_x, float shift_y, long ix0, long iy0, long ix1, long iy1); + + /** + * Same as {@link #stbtt_GetGlyphBitmapBox GetGlyphBitmapBox}, but you can specify a subpixel shift for the character. + * + * @param font an {@link STBTTFontinfo} struct + * @param glyph the glyph index + * @param scale_x the horizontal scale + * @param scale_y the vertical scale + * @param shift_x the horizontal subpixel shift + * @param shift_y the vertical subpixel shift + * @param ix0 returns the left coordinate + * @param iy0 returns the bottom coordinate + * @param ix1 returns the right coordinate + * @param iy1 returns the top coordinate + */ + public static void stbtt_GetGlyphBitmapBoxSubpixel(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, int glyph, float scale_x, float scale_y, float shift_x, float shift_y, @Nullable @NativeType("int *") IntBuffer ix0, @Nullable @NativeType("int *") IntBuffer iy0, @Nullable @NativeType("int *") IntBuffer ix1, @Nullable @NativeType("int *") IntBuffer iy1) { + if (CHECKS) { + checkSafe(ix0, 1); + checkSafe(iy0, 1); + checkSafe(ix1, 1); + checkSafe(iy1, 1); + } + nstbtt_GetGlyphBitmapBoxSubpixel(font.address(), glyph, scale_x, scale_y, shift_x, shift_y, memAddressSafe(ix0), memAddressSafe(iy0), memAddressSafe(ix1), memAddressSafe(iy1)); + } + + // --- [ stbtt_Rasterize ] --- + + /** + * Unsafe version of: {@link #stbtt_Rasterize Rasterize} + * + * @param num_verts number of vertices in above array + */ + public static native void nstbtt_Rasterize(long result, float flatness_in_pixels, long vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, long alloc_context); + + /** + * Rasterize a shape with quadratic beziers into a bitmap. + * + * @param result 1-channel bitmap to draw into + * @param flatness_in_pixels allowable error of curve in pixels + * @param vertices array of vertices defining shape + * @param scale_x horizontal scale applied to input vertices + * @param scale_y vertical scale applied to input vertices + * @param shift_x horizontal translation applied to input vertices + * @param shift_y vertical translation applied to input vertices + * @param x_off another horizontal translation applied to input + * @param y_off another vertical translation applied to input + * @param invert if non-zero, vertically flip shape + */ + public static void stbtt_Rasterize(@NativeType("stbtt__bitmap *") STBTTBitmap result, float flatness_in_pixels, @NativeType("stbtt_vertex *") STBTTVertex.Buffer vertices, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, @NativeType("int") boolean invert) { + nstbtt_Rasterize(result.address(), flatness_in_pixels, vertices.address(), vertices.remaining(), scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert ? 1 : 0, NULL); + } + + // --- [ stbtt_FreeSDF ] --- + + /** Unsafe version of: {@link #stbtt_FreeSDF FreeSDF} */ + public static native void nstbtt_FreeSDF(long bitmap, long userdata); + + /** + * Frees an SDF bitmap. + * + * @param bitmap the SDF bitmap to free + * @param userdata a pointer to an allocation context + */ + public static void stbtt_FreeSDF(@NativeType("unsigned char *") ByteBuffer bitmap, @NativeType("void *") long userdata) { + nstbtt_FreeSDF(memAddress(bitmap), userdata); + } + + /** + * Frees an SDF bitmap. + * + * @param bitmap the SDF bitmap to free + */ + public static void stbtt_FreeSDF(@NativeType("unsigned char *") ByteBuffer bitmap) { + nstbtt_FreeSDF(memAddress(bitmap), NULL); + } + + // --- [ stbtt_GetGlyphSDF ] --- + + /** Unsafe version of: {@link #stbtt_GetGlyphSDF GetGlyphSDF} */ + public static native long nstbtt_GetGlyphSDF(long font, float scale, int glyph, int padding, byte onedge_value, float pixel_dist_scale, long width, long height, long xoff, long yoff); + + /** + * Computes a discretized SDF field for a single character, suitable for storing in a single-channel texture, sampling with bilinear filtering, and + * testing against larger than some threshold to produce scalable fonts. + * + *

    {@code pixel_dist_scale} & {@code onedge_value} are a scale & bias that allows you to make optimal use of the limited {@code 0..255} for your + * application, trading off precision and special effects. SDF values outside the range {@code 0..255} are clamped to {@code 0..255}.

    + * + *

    Example:

    + * + *
    
    +     * scale = stbtt_ScaleForPixelHeight(22)
    +     * padding = 5
    +     * onedge_value = 180
    +     * pixel_dist_scale = 180/5.0 = 36.0
    + * + *

    This will create an SDF bitmap in which the character is about 22 pixels high but the whole bitmap is about {@code 22+5+5=32} pixels high. To produce a + * filled shape, sample the SDF at each pixel and fill the pixel if the SDF value is greater than or equal to {@code 180/255}. (You'll actually want to + * antialias, which is beyond the scope of this example.) Additionally, you can compute offset outlines (e.g. to stroke the character border inside & + * outside, or only outside). For example, to fill outside the character up to 3 SDF pixels, you would compare against {@code (180-36.0*3)/255 = 72/255}. + * The above choice of variables maps a range from 5 pixels outside the shape to 2 pixels inside the shape to {@code 0..255}; this is intended primarily + * for apply outside effects only (the interior range is needed to allow proper antialiasing of the font at smaller sizes).

    + * + *

    The function computes the SDF analytically at each SDF pixel, not by e.g. building a higher-res bitmap and approximating it. In theory the quality + * should be as high as possible for an SDF of this size & representation, but unclear if this is true in practice (perhaps building a higher-res + * bitmap and computing from that can allow drop-out prevention).

    + * + *

    The algorithm has not been optimized at all, so expect it to be slow if computing lots of characters or very large sizes.

    + * + * @param font an {@link STBTTFontinfo} struct + * @param scale controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap + * @param glyph the glyph to generate the SDF for + * @param padding extra "pixels" around the character which are filled with the distance to the character (not 0), which allows effects like bit outlines + * @param onedge_value value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) + * @param pixel_dist_scale what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale). If positive, > {@code onedge_value} + * is inside; if negative, < {@code onedge_value} is inside. + * @param width output width of the SDF bitmap (including padding) + * @param height output height of the SDF bitmap (including padding) + * @param xoff output horizontal origin of the character + * @param yoff output vertical origin of the character + */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetGlyphSDF(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, float scale, int glyph, int padding, @NativeType("unsigned char") byte onedge_value, float pixel_dist_scale, @NativeType("int *") IntBuffer width, @NativeType("int *") IntBuffer height, @NativeType("int *") IntBuffer xoff, @NativeType("int *") IntBuffer yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + check(xoff, 1); + check(yoff, 1); + } + long __result = nstbtt_GetGlyphSDF(font.address(), scale, glyph, padding, onedge_value, pixel_dist_scale, memAddress(width), memAddress(height), memAddress(xoff), memAddress(yoff)); + return memByteBufferSafe(__result, width.get(width.position()) * height.get(height.position())); + } + + // --- [ stbtt_GetCodepointSDF ] --- + + /** Unsafe version of: {@link #stbtt_GetCodepointSDF GetCodepointSDF} */ + public static native long nstbtt_GetCodepointSDF(long font, float scale, int codepoint, int padding, byte onedge_value, float pixel_dist_scale, long width, long height, long xoff, long yoff); + + /** + * Codepoint version of {@link #stbtt_GetGlyphSDF GetGlyphSDF}. + * + * @param font an {@link STBTTFontinfo} struct + * @param scale controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap + * @param codepoint the codepoint to generate the SDF for + * @param padding extra "pixels" around the character which are filled with the distance to the character (not 0), which allows effects like bit outlines + * @param onedge_value value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) + * @param pixel_dist_scale what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale). If positive, > {@code onedge_value} + * is inside; if negative, < {@code onedge_value} is inside. + * @param width output width of the SDF bitmap (including padding) + * @param height output height of the SDF bitmap (including padding) + * @param xoff output horizontal origin of the character + * @param yoff output vertical origin of the character + */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetCodepointSDF(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, float scale, int codepoint, int padding, @NativeType("unsigned char") byte onedge_value, float pixel_dist_scale, @NativeType("int *") IntBuffer width, @NativeType("int *") IntBuffer height, @NativeType("int *") IntBuffer xoff, @NativeType("int *") IntBuffer yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + check(xoff, 1); + check(yoff, 1); + } + long __result = nstbtt_GetCodepointSDF(font.address(), scale, codepoint, padding, onedge_value, pixel_dist_scale, memAddress(width), memAddress(height), memAddress(xoff), memAddress(yoff)); + return memByteBufferSafe(__result, width.get(width.position()) * height.get(height.position())); + } + + // --- [ stbtt_FindMatchingFont ] --- + + /** Unsafe version of: {@link #stbtt_FindMatchingFont FindMatchingFont} */ + public static native int nstbtt_FindMatchingFont(long fontdata, long name, int flags); + + /** + * Returns the offset (not index) of the font that matches, or -1 if none. + * + *

    If you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". If you use any other flag, use a font name like "Arial"; this checks the + * {@code macStyle} header field; I don't know if fonts set this consistently.

    + * + * @param fontdata the font data + * @param name the font name + * @param flags the style flags. One of:
    {@link #STBTT_MACSTYLE_DONTCARE MACSTYLE_DONTCARE}{@link #STBTT_MACSTYLE_BOLD MACSTYLE_BOLD}{@link #STBTT_MACSTYLE_ITALIC MACSTYLE_ITALIC}{@link #STBTT_MACSTYLE_UNDERSCORE MACSTYLE_UNDERSCORE}{@link #STBTT_MACSTYLE_NONE MACSTYLE_NONE}
    + */ + public static int stbtt_FindMatchingFont(@NativeType("unsigned char const *") ByteBuffer fontdata, @NativeType("char const *") ByteBuffer name, int flags) { + if (CHECKS) { + checkNT1(name); + } + return nstbtt_FindMatchingFont(memAddress(fontdata), memAddress(name), flags); + } + + /** + * Returns the offset (not index) of the font that matches, or -1 if none. + * + *

    If you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". If you use any other flag, use a font name like "Arial"; this checks the + * {@code macStyle} header field; I don't know if fonts set this consistently.

    + * + * @param fontdata the font data + * @param name the font name + * @param flags the style flags. One of:
    {@link #STBTT_MACSTYLE_DONTCARE MACSTYLE_DONTCARE}{@link #STBTT_MACSTYLE_BOLD MACSTYLE_BOLD}{@link #STBTT_MACSTYLE_ITALIC MACSTYLE_ITALIC}{@link #STBTT_MACSTYLE_UNDERSCORE MACSTYLE_UNDERSCORE}{@link #STBTT_MACSTYLE_NONE MACSTYLE_NONE}
    + */ + public static int stbtt_FindMatchingFont(@NativeType("unsigned char const *") ByteBuffer fontdata, @NativeType("char const *") CharSequence name, int flags) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nstbtt_FindMatchingFont(memAddress(fontdata), nameEncoded, flags); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stbtt_CompareUTF8toUTF16_bigendian ] --- + + /** + * Unsafe version of: {@link #stbtt_CompareUTF8toUTF16_bigendian CompareUTF8toUTF16_bigendian} + * + * @param len1 the length of the first string, in bytes + * @param len2 the length of the second string, in bytes + */ + public static native int nstbtt_CompareUTF8toUTF16_bigendian(long s1, int len1, long s2, int len2); + + /** + * Returns 1/0 whether the first string interpreted as utf8 is identical to the second string interpreted as big-endian utf16... useful for strings + * returned from {@link #stbtt_GetFontNameString GetFontNameString}. + * + * @param s1 the first string + * @param s2 the second string + */ + @NativeType("int") + public static boolean stbtt_CompareUTF8toUTF16_bigendian(@NativeType("char const *") ByteBuffer s1, @NativeType("char const *") ByteBuffer s2) { + return nstbtt_CompareUTF8toUTF16_bigendian(memAddress(s1), s1.remaining(), memAddress(s2), s2.remaining()) != 0; + } + + // --- [ stbtt_GetFontNameString ] --- + + /** + * Unsafe version of: {@link #stbtt_GetFontNameString GetFontNameString} + * + * @param length returns the string length, in bytes + */ + public static native long nstbtt_GetFontNameString(long font, long length, int platformID, int encodingID, int languageID, int nameID); + + /** + * Returns the string (which may be big-endian double byte, e.g. for unicode) and puts the length in bytes in {@code *length}. + * + *

    See the truetype spec:

    + * + * + * + * @param font an {@link STBTTFontinfo} struct + * @param platformID the platform ID. One of:
    {@link #STBTT_PLATFORM_ID_UNICODE PLATFORM_ID_UNICODE}{@link #STBTT_PLATFORM_ID_MAC PLATFORM_ID_MAC}{@link #STBTT_PLATFORM_ID_ISO PLATFORM_ID_ISO}{@link #STBTT_PLATFORM_ID_MICROSOFT PLATFORM_ID_MICROSOFT}
    + * @param encodingID the encoding ID. One of:
    {@link #STBTT_UNICODE_EID_UNICODE_1_0 UNICODE_EID_UNICODE_1_0}{@link #STBTT_UNICODE_EID_UNICODE_1_1 UNICODE_EID_UNICODE_1_1}{@link #STBTT_UNICODE_EID_ISO_10646 UNICODE_EID_ISO_10646}{@link #STBTT_UNICODE_EID_UNICODE_2_0_BMP UNICODE_EID_UNICODE_2_0_BMP}
    {@link #STBTT_UNICODE_EID_UNICODE_2_0_FULL UNICODE_EID_UNICODE_2_0_FULL}{@link #STBTT_MS_EID_SYMBOL MS_EID_SYMBOL}{@link #STBTT_MS_EID_UNICODE_BMP MS_EID_UNICODE_BMP}{@link #STBTT_MS_EID_SHIFTJIS MS_EID_SHIFTJIS}
    {@link #STBTT_MS_EID_UNICODE_FULL MS_EID_UNICODE_FULL}{@link #STBTT_MAC_EID_ROMAN MAC_EID_ROMAN}{@link #STBTT_MAC_EID_JAPANESE MAC_EID_JAPANESE}{@link #STBTT_MAC_EID_CHINESE_TRAD MAC_EID_CHINESE_TRAD}
    {@link #STBTT_MAC_EID_KOREAN MAC_EID_KOREAN}{@link #STBTT_MAC_EID_ARABIC MAC_EID_ARABIC}{@link #STBTT_MAC_EID_HEBREW MAC_EID_HEBREW}{@link #STBTT_MAC_EID_GREEK MAC_EID_GREEK}
    {@link #STBTT_MAC_EID_RUSSIAN MAC_EID_RUSSIAN}
    + * @param languageID the language ID. One of:
    {@link #STBTT_MS_LANG_ENGLISH MS_LANG_ENGLISH}{@link #STBTT_MS_LANG_CHINESE MS_LANG_CHINESE}{@link #STBTT_MS_LANG_DUTCH MS_LANG_DUTCH}{@link #STBTT_MS_LANG_FRENCH MS_LANG_FRENCH}{@link #STBTT_MS_LANG_GERMAN MS_LANG_GERMAN}
    {@link #STBTT_MS_LANG_HEBREW MS_LANG_HEBREW}{@link #STBTT_MS_LANG_ITALIAN MS_LANG_ITALIAN}{@link #STBTT_MS_LANG_JAPANESE MS_LANG_JAPANESE}{@link #STBTT_MS_LANG_KOREAN MS_LANG_KOREAN}{@link #STBTT_MS_LANG_RUSSIAN MS_LANG_RUSSIAN}
    {@link #STBTT_MS_LANG_SPANISH MS_LANG_SPANISH}{@link #STBTT_MS_LANG_SWEDISH MS_LANG_SWEDISH}{@link #STBTT_MAC_LANG_ENGLISH MAC_LANG_ENGLISH}{@link #STBTT_MAC_LANG_ARABIC MAC_LANG_ARABIC}{@link #STBTT_MAC_LANG_DUTCH MAC_LANG_DUTCH}
    {@link #STBTT_MAC_LANG_FRENCH MAC_LANG_FRENCH}{@link #STBTT_MAC_LANG_GERMAN MAC_LANG_GERMAN}{@link #STBTT_MAC_LANG_HEBREW MAC_LANG_HEBREW}{@link #STBTT_MAC_LANG_ITALIAN MAC_LANG_ITALIAN}{@link #STBTT_MAC_LANG_JAPANESE MAC_LANG_JAPANESE}
    {@link #STBTT_MAC_LANG_KOREAN MAC_LANG_KOREAN}{@link #STBTT_MAC_LANG_RUSSIAN MAC_LANG_RUSSIAN}{@link #STBTT_MAC_LANG_SPANISH MAC_LANG_SPANISH}{@link #STBTT_MAC_LANG_SWEDISH MAC_LANG_SWEDISH}{@link #STBTT_MAC_LANG_CHINESE_SIMPLIFIED MAC_LANG_CHINESE_SIMPLIFIED}
    {@link #STBTT_MAC_LANG_CHINESE_TRAD MAC_LANG_CHINESE_TRAD}
    + * @param nameID the name ID + */ + @Nullable + @NativeType("char const *") + public static ByteBuffer stbtt_GetFontNameString(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, int platformID, int encodingID, int languageID, int nameID) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer length = stack.callocInt(1); + try { + long __result = nstbtt_GetFontNameString(font.address(), memAddress(length), platformID, encodingID, languageID, nameID); + return memByteBufferSafe(__result, length.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #nstbtt_GetBakedQuad} */ + public static native void nstbtt_GetBakedQuad(long chardata, int pw, int ph, int char_index, float[] xpos, float[] ypos, long q, int opengl_fillrule); + + /** Array version of: {@link #stbtt_GetBakedQuad GetBakedQuad} */ + public static void stbtt_GetBakedQuad(@NativeType("stbtt_bakedchar const *") STBTTBakedChar.Buffer chardata, int pw, int ph, int char_index, @NativeType("float *") float[] xpos, @NativeType("float *") float[] ypos, @NativeType("stbtt_aligned_quad *") STBTTAlignedQuad q, @NativeType("int") boolean opengl_fillrule) { + if (CHECKS) { + check(chardata, char_index + 1); + check(xpos, 1); + check(ypos, 1); + } + nstbtt_GetBakedQuad(chardata.address(), pw, ph, char_index, xpos, ypos, q.address(), opengl_fillrule ? 1 : 0); + } + + /** Array version of: {@link #nstbtt_GetScaledFontVMetrics} */ + public static native void nstbtt_GetScaledFontVMetrics(long fontdata, int index, float size, float[] ascent, float[] descent, float[] lineGap); + + /** Array version of: {@link #stbtt_GetScaledFontVMetrics GetScaledFontVMetrics} */ + public static void stbtt_GetScaledFontVMetrics(@NativeType("unsigned char const *") ByteBuffer fontdata, int index, float size, @NativeType("float *") float[] ascent, @NativeType("float *") float[] descent, @NativeType("float *") float[] lineGap) { + if (CHECKS) { + check(ascent, 1); + check(descent, 1); + check(lineGap, 1); + } + nstbtt_GetScaledFontVMetrics(memAddress(fontdata), index, size, ascent, descent, lineGap); + } + + /** Array version of: {@link #nstbtt_GetPackedQuad} */ + public static native void nstbtt_GetPackedQuad(long chardata, int pw, int ph, int char_index, float[] xpos, float[] ypos, long q, int align_to_integer); + + /** Array version of: {@link #stbtt_GetPackedQuad GetPackedQuad} */ + public static void stbtt_GetPackedQuad(@NativeType("stbtt_packedchar const *") STBTTPackedchar.Buffer chardata, int pw, int ph, int char_index, @NativeType("float *") float[] xpos, @NativeType("float *") float[] ypos, @NativeType("stbtt_aligned_quad *") STBTTAlignedQuad q, @NativeType("int") boolean align_to_integer) { + if (CHECKS) { + check(chardata, char_index + 1); + check(xpos, 1); + check(ypos, 1); + } + nstbtt_GetPackedQuad(chardata.address(), pw, ph, char_index, xpos, ypos, q.address(), align_to_integer ? 1 : 0); + } + + /** Array version of: {@link #nstbtt_GetFontVMetrics} */ + public static native void nstbtt_GetFontVMetrics(long info, int[] ascent, int[] descent, int[] lineGap); + + /** Array version of: {@link #stbtt_GetFontVMetrics GetFontVMetrics} */ + public static void stbtt_GetFontVMetrics(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @Nullable @NativeType("int *") int[] ascent, @Nullable @NativeType("int *") int[] descent, @Nullable @NativeType("int *") int[] lineGap) { + if (CHECKS) { + checkSafe(ascent, 1); + checkSafe(descent, 1); + checkSafe(lineGap, 1); + } + nstbtt_GetFontVMetrics(info.address(), ascent, descent, lineGap); + } + + /** Array version of: {@link #nstbtt_GetFontVMetricsOS2} */ + public static native int nstbtt_GetFontVMetricsOS2(long info, int[] typoAscent, int[] typoDescent, int[] typoLineGap); + + /** Array version of: {@link #stbtt_GetFontVMetricsOS2 GetFontVMetricsOS2} */ + @NativeType("int") + public static boolean stbtt_GetFontVMetricsOS2(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @Nullable @NativeType("int *") int[] typoAscent, @Nullable @NativeType("int *") int[] typoDescent, @Nullable @NativeType("int *") int[] typoLineGap) { + if (CHECKS) { + checkSafe(typoAscent, 1); + checkSafe(typoDescent, 1); + checkSafe(typoLineGap, 1); + } + return nstbtt_GetFontVMetricsOS2(info.address(), typoAscent, typoDescent, typoLineGap) != 0; + } + + /** Array version of: {@link #nstbtt_GetFontBoundingBox} */ + public static native void nstbtt_GetFontBoundingBox(long info, int[] x0, int[] y0, int[] x1, int[] y1); + + /** Array version of: {@link #stbtt_GetFontBoundingBox GetFontBoundingBox} */ + public static void stbtt_GetFontBoundingBox(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("int *") int[] x0, @NativeType("int *") int[] y0, @NativeType("int *") int[] x1, @NativeType("int *") int[] y1) { + if (CHECKS) { + check(x0, 1); + check(y0, 1); + check(x1, 1); + check(y1, 1); + } + nstbtt_GetFontBoundingBox(info.address(), x0, y0, x1, y1); + } + + /** Array version of: {@link #nstbtt_GetCodepointHMetrics} */ + public static native void nstbtt_GetCodepointHMetrics(long info, int codepoint, int[] advanceWidth, int[] leftSideBearing); + + /** Array version of: {@link #stbtt_GetCodepointHMetrics GetCodepointHMetrics} */ + public static void stbtt_GetCodepointHMetrics(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int codepoint, @Nullable @NativeType("int *") int[] advanceWidth, @Nullable @NativeType("int *") int[] leftSideBearing) { + if (CHECKS) { + checkSafe(advanceWidth, 1); + checkSafe(leftSideBearing, 1); + } + nstbtt_GetCodepointHMetrics(info.address(), codepoint, advanceWidth, leftSideBearing); + } + + /** Array version of: {@link #nstbtt_GetCodepointBox} */ + public static native int nstbtt_GetCodepointBox(long info, int codepoint, int[] x0, int[] y0, int[] x1, int[] y1); + + /** Array version of: {@link #stbtt_GetCodepointBox GetCodepointBox} */ + @NativeType("int") + public static boolean stbtt_GetCodepointBox(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int codepoint, @Nullable @NativeType("int *") int[] x0, @Nullable @NativeType("int *") int[] y0, @Nullable @NativeType("int *") int[] x1, @Nullable @NativeType("int *") int[] y1) { + if (CHECKS) { + checkSafe(x0, 1); + checkSafe(y0, 1); + checkSafe(x1, 1); + checkSafe(y1, 1); + } + return nstbtt_GetCodepointBox(info.address(), codepoint, x0, y0, x1, y1) != 0; + } + + /** Array version of: {@link #nstbtt_GetGlyphHMetrics} */ + public static native void nstbtt_GetGlyphHMetrics(long info, int glyph_index, int[] advanceWidth, int[] leftSideBearing); + + /** Array version of: {@link #stbtt_GetGlyphHMetrics GetGlyphHMetrics} */ + public static void stbtt_GetGlyphHMetrics(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int glyph_index, @Nullable @NativeType("int *") int[] advanceWidth, @Nullable @NativeType("int *") int[] leftSideBearing) { + if (CHECKS) { + checkSafe(advanceWidth, 1); + checkSafe(leftSideBearing, 1); + } + nstbtt_GetGlyphHMetrics(info.address(), glyph_index, advanceWidth, leftSideBearing); + } + + /** Array version of: {@link #nstbtt_GetGlyphBox} */ + public static native int nstbtt_GetGlyphBox(long info, int glyph_index, int[] x0, int[] y0, int[] x1, int[] y1); + + /** Array version of: {@link #stbtt_GetGlyphBox GetGlyphBox} */ + @NativeType("int") + public static boolean stbtt_GetGlyphBox(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, int glyph_index, @Nullable @NativeType("int *") int[] x0, @Nullable @NativeType("int *") int[] y0, @Nullable @NativeType("int *") int[] x1, @Nullable @NativeType("int *") int[] y1) { + if (CHECKS) { + checkSafe(x0, 1); + checkSafe(y0, 1); + checkSafe(x1, 1); + checkSafe(y1, 1); + } + return nstbtt_GetGlyphBox(info.address(), glyph_index, x0, y0, x1, y1) != 0; + } + + /** Array version of: {@link #nstbtt_GetCodepointBitmap} */ + public static native long nstbtt_GetCodepointBitmap(long info, float scale_x, float scale_y, int codepoint, int[] width, int[] height, int[] xoff, int[] yoff); + + /** Array version of: {@link #stbtt_GetCodepointBitmap GetCodepointBitmap} */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetCodepointBitmap(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, float scale_x, float scale_y, int codepoint, @NativeType("int *") int[] width, @NativeType("int *") int[] height, @Nullable @NativeType("int *") int[] xoff, @Nullable @NativeType("int *") int[] yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + checkSafe(xoff, 1); + checkSafe(yoff, 1); + } + long __result = nstbtt_GetCodepointBitmap(info.address(), scale_x, scale_y, codepoint, width, height, xoff, yoff); + return memByteBufferSafe(__result, width[0] * height[0]); + } + + /** Array version of: {@link #nstbtt_GetCodepointBitmapSubpixel} */ + public static native long nstbtt_GetCodepointBitmapSubpixel(long info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int[] width, int[] height, int[] xoff, int[] yoff); + + /** Array version of: {@link #stbtt_GetCodepointBitmapSubpixel GetCodepointBitmapSubpixel} */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetCodepointBitmapSubpixel(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, @NativeType("int *") int[] width, @NativeType("int *") int[] height, @Nullable @NativeType("int *") int[] xoff, @Nullable @NativeType("int *") int[] yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + checkSafe(xoff, 1); + checkSafe(yoff, 1); + } + long __result = nstbtt_GetCodepointBitmapSubpixel(info.address(), scale_x, scale_y, shift_x, shift_y, codepoint, width, height, xoff, yoff); + return memByteBufferSafe(__result, width[0] * height[0]); + } + + /** Array version of: {@link #nstbtt_MakeCodepointBitmapSubpixelPrefilter} */ + public static native void nstbtt_MakeCodepointBitmapSubpixelPrefilter(long info, long output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float[] sub_x, float[] sub_y, int codepoint); + + /** Array version of: {@link #stbtt_MakeCodepointBitmapSubpixelPrefilter MakeCodepointBitmapSubpixelPrefilter} */ + public static void stbtt_MakeCodepointBitmapSubpixelPrefilter(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("unsigned char *") ByteBuffer output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, @NativeType("float *") float[] sub_x, @NativeType("float *") float[] sub_y, int codepoint) { + if (CHECKS) { + check(output, (out_stride != 0 ? out_stride : out_w) * out_h); + check(sub_x, 1); + check(sub_y, 1); + } + nstbtt_MakeCodepointBitmapSubpixelPrefilter(info.address(), memAddress(output), out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, codepoint); + } + + /** Array version of: {@link #nstbtt_GetCodepointBitmapBox} */ + public static native void nstbtt_GetCodepointBitmapBox(long font, int codepoint, float scale_x, float scale_y, int[] ix0, int[] iy0, int[] ix1, int[] iy1); + + /** Array version of: {@link #stbtt_GetCodepointBitmapBox GetCodepointBitmapBox} */ + public static void stbtt_GetCodepointBitmapBox(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, int codepoint, float scale_x, float scale_y, @Nullable @NativeType("int *") int[] ix0, @Nullable @NativeType("int *") int[] iy0, @Nullable @NativeType("int *") int[] ix1, @Nullable @NativeType("int *") int[] iy1) { + if (CHECKS) { + checkSafe(ix0, 1); + checkSafe(iy0, 1); + checkSafe(ix1, 1); + checkSafe(iy1, 1); + } + nstbtt_GetCodepointBitmapBox(font.address(), codepoint, scale_x, scale_y, ix0, iy0, ix1, iy1); + } + + /** Array version of: {@link #nstbtt_GetCodepointBitmapBoxSubpixel} */ + public static native void nstbtt_GetCodepointBitmapBoxSubpixel(long font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int[] ix0, int[] iy0, int[] ix1, int[] iy1); + + /** Array version of: {@link #stbtt_GetCodepointBitmapBoxSubpixel GetCodepointBitmapBoxSubpixel} */ + public static void stbtt_GetCodepointBitmapBoxSubpixel(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, @Nullable @NativeType("int *") int[] ix0, @Nullable @NativeType("int *") int[] iy0, @Nullable @NativeType("int *") int[] ix1, @Nullable @NativeType("int *") int[] iy1) { + if (CHECKS) { + checkSafe(ix0, 1); + checkSafe(iy0, 1); + checkSafe(ix1, 1); + checkSafe(iy1, 1); + } + nstbtt_GetCodepointBitmapBoxSubpixel(font.address(), codepoint, scale_x, scale_y, shift_x, shift_y, ix0, iy0, ix1, iy1); + } + + /** Array version of: {@link #nstbtt_GetGlyphBitmap} */ + public static native long nstbtt_GetGlyphBitmap(long info, float scale_x, float scale_y, int glyph, int[] width, int[] height, int[] xoff, int[] yoff); + + /** Array version of: {@link #stbtt_GetGlyphBitmap GetGlyphBitmap} */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetGlyphBitmap(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, float scale_x, float scale_y, int glyph, @NativeType("int *") int[] width, @NativeType("int *") int[] height, @Nullable @NativeType("int *") int[] xoff, @Nullable @NativeType("int *") int[] yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + checkSafe(xoff, 1); + checkSafe(yoff, 1); + } + long __result = nstbtt_GetGlyphBitmap(info.address(), scale_x, scale_y, glyph, width, height, xoff, yoff); + return memByteBufferSafe(__result, width[0] * height[0]); + } + + /** Array version of: {@link #nstbtt_GetGlyphBitmapSubpixel} */ + public static native long nstbtt_GetGlyphBitmapSubpixel(long info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int[] width, int[] height, int[] xoff, int[] yoff); + + /** Array version of: {@link #stbtt_GetGlyphBitmapSubpixel GetGlyphBitmapSubpixel} */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetGlyphBitmapSubpixel(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, @NativeType("int *") int[] width, @NativeType("int *") int[] height, @Nullable @NativeType("int *") int[] xoff, @Nullable @NativeType("int *") int[] yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + checkSafe(xoff, 1); + checkSafe(yoff, 1); + } + long __result = nstbtt_GetGlyphBitmapSubpixel(info.address(), scale_x, scale_y, shift_x, shift_y, glyph, width, height, xoff, yoff); + return memByteBufferSafe(__result, width[0] * height[0]); + } + + /** Array version of: {@link #nstbtt_MakeGlyphBitmapSubpixelPrefilter} */ + public static native void nstbtt_MakeGlyphBitmapSubpixelPrefilter(long info, long output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float[] sub_x, float[] sub_y, int glyph); + + /** Array version of: {@link #stbtt_MakeGlyphBitmapSubpixelPrefilter MakeGlyphBitmapSubpixelPrefilter} */ + public static void stbtt_MakeGlyphBitmapSubpixelPrefilter(@NativeType("stbtt_fontinfo const *") STBTTFontinfo info, @NativeType("unsigned char *") ByteBuffer output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, @NativeType("float *") float[] sub_x, @NativeType("float *") float[] sub_y, int glyph) { + if (CHECKS) { + check(output, (out_stride != 0 ? out_stride : out_w) * out_h); + check(sub_x, 1); + check(sub_y, 1); + } + nstbtt_MakeGlyphBitmapSubpixelPrefilter(info.address(), memAddress(output), out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, glyph); + } + + /** Array version of: {@link #nstbtt_GetGlyphBitmapBox} */ + public static native void nstbtt_GetGlyphBitmapBox(long font, int glyph, float scale_x, float scale_y, int[] ix0, int[] iy0, int[] ix1, int[] iy1); + + /** Array version of: {@link #stbtt_GetGlyphBitmapBox GetGlyphBitmapBox} */ + public static void stbtt_GetGlyphBitmapBox(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, int glyph, float scale_x, float scale_y, @Nullable @NativeType("int *") int[] ix0, @Nullable @NativeType("int *") int[] iy0, @Nullable @NativeType("int *") int[] ix1, @Nullable @NativeType("int *") int[] iy1) { + if (CHECKS) { + checkSafe(ix0, 1); + checkSafe(iy0, 1); + checkSafe(ix1, 1); + checkSafe(iy1, 1); + } + nstbtt_GetGlyphBitmapBox(font.address(), glyph, scale_x, scale_y, ix0, iy0, ix1, iy1); + } + + /** Array version of: {@link #nstbtt_GetGlyphBitmapBoxSubpixel} */ + public static native void nstbtt_GetGlyphBitmapBoxSubpixel(long font, int glyph, float scale_x, float scale_y, float shift_x, float shift_y, int[] ix0, int[] iy0, int[] ix1, int[] iy1); + + /** Array version of: {@link #stbtt_GetGlyphBitmapBoxSubpixel GetGlyphBitmapBoxSubpixel} */ + public static void stbtt_GetGlyphBitmapBoxSubpixel(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, int glyph, float scale_x, float scale_y, float shift_x, float shift_y, @Nullable @NativeType("int *") int[] ix0, @Nullable @NativeType("int *") int[] iy0, @Nullable @NativeType("int *") int[] ix1, @Nullable @NativeType("int *") int[] iy1) { + if (CHECKS) { + checkSafe(ix0, 1); + checkSafe(iy0, 1); + checkSafe(ix1, 1); + checkSafe(iy1, 1); + } + nstbtt_GetGlyphBitmapBoxSubpixel(font.address(), glyph, scale_x, scale_y, shift_x, shift_y, ix0, iy0, ix1, iy1); + } + + /** Array version of: {@link #nstbtt_GetGlyphSDF} */ + public static native long nstbtt_GetGlyphSDF(long font, float scale, int glyph, int padding, byte onedge_value, float pixel_dist_scale, int[] width, int[] height, int[] xoff, int[] yoff); + + /** Array version of: {@link #stbtt_GetGlyphSDF GetGlyphSDF} */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetGlyphSDF(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, float scale, int glyph, int padding, @NativeType("unsigned char") byte onedge_value, float pixel_dist_scale, @NativeType("int *") int[] width, @NativeType("int *") int[] height, @NativeType("int *") int[] xoff, @NativeType("int *") int[] yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + check(xoff, 1); + check(yoff, 1); + } + long __result = nstbtt_GetGlyphSDF(font.address(), scale, glyph, padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); + return memByteBufferSafe(__result, width[0] * height[0]); + } + + /** Array version of: {@link #nstbtt_GetCodepointSDF} */ + public static native long nstbtt_GetCodepointSDF(long font, float scale, int codepoint, int padding, byte onedge_value, float pixel_dist_scale, int[] width, int[] height, int[] xoff, int[] yoff); + + /** Array version of: {@link #stbtt_GetCodepointSDF GetCodepointSDF} */ + @Nullable + @NativeType("unsigned char *") + public static ByteBuffer stbtt_GetCodepointSDF(@NativeType("stbtt_fontinfo const *") STBTTFontinfo font, float scale, int codepoint, int padding, @NativeType("unsigned char") byte onedge_value, float pixel_dist_scale, @NativeType("int *") int[] width, @NativeType("int *") int[] height, @NativeType("int *") int[] xoff, @NativeType("int *") int[] yoff) { + if (CHECKS) { + check(width, 1); + check(height, 1); + check(xoff, 1); + check(yoff, 1); + } + long __result = nstbtt_GetCodepointSDF(font.address(), scale, codepoint, padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); + return memByteBufferSafe(__result, width[0] * height[0]); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbis.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbis.java new file mode 100644 index 000000000..e3feaba34 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbis.java @@ -0,0 +1,990 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +import org.lwjgl.system.libc.LibCStdlib; + +/** + * Native bindings to stb_vorbis.c from the stb library. + * + *

    Ogg Vorbis audio decoder.

    + * + *

    Limitations

    + * + *
      + *
    • floor 0 not supported (used in old ogg vorbis files pre-2004)
    • + *
    • lossless sample-truncation at beginning ignored
    • + *
    • cannot concatenate multiple vorbis streams
    • + *
    • sample positions are 32-bit, limiting seekable 192Khz files to around 6 hours (Ogg supports 64-bit)
    • + *
    + * + *

    THREAD SAFETY

    + * + *

    Individual stb_vorbis* handles are not thread-safe; you cannot decode from them from multiple threads at the same time. However, you can have multiple + * {@code stb_vorbis*} handles and decode from them independently in multiple threads.

    + * + *

    PUSHDATA API

    + * + *

    This API allows you to get blocks of data from any source and hand them to stb_vorbis. you have to buffer them; stb_vorbis will tell you how much it + * used, and you have to give it the rest next time; and stb_vorbis may not have enough data to work with and you will need to give it the same data + * again PLUS more. Note that the Vorbis specification does not bound the size of an individual frame.

    + * + *

    PULLING INPUT API

    + * + *

    This API assumes stb_vorbis is allowed to pull data from a source -- either a block of memory containing the _entire_ vorbis stream, or a FILE * that + * you or it create, or possibly some other reading mechanism if you go modify the source to replace the FILE * case with some kind of callback to your + * code. (But if you don't support seeking, you may just want to go ahead and use pushdata.)

    + */ +public class STBVorbis { + + static { LibSTB.initialize(); } + + /** + * Error code. + * + *
    Enum values:
    + * + *
      + *
    • {@link #VORBIS__no_error _no_error}
    • + *
    • {@link #VORBIS_need_more_data need_more_data}
    • + *
    • {@link #VORBIS_invalid_api_mixing invalid_api_mixing}
    • + *
    • {@link #VORBIS_outofmem outofmem}
    • + *
    • {@link #VORBIS_feature_not_supported feature_not_supported}
    • + *
    • {@link #VORBIS_too_many_channels too_many_channels}
    • + *
    • {@link #VORBIS_file_open_failure file_open_failure}
    • + *
    • {@link #VORBIS_seek_without_length seek_without_length}
    • + *
    • {@link #VORBIS_unexpected_eof unexpected_eof}
    • + *
    • {@link #VORBIS_seek_invalid seek_invalid}
    • + *
    • {@link #VORBIS_invalid_setup invalid_setup}
    • + *
    • {@link #VORBIS_invalid_stream invalid_stream}
    • + *
    • {@link #VORBIS_missing_capture_pattern missing_capture_pattern}
    • + *
    • {@link #VORBIS_invalid_stream_structure_version invalid_stream_structure_version}
    • + *
    • {@link #VORBIS_continued_packet_flag_invalid continued_packet_flag_invalid}
    • + *
    • {@link #VORBIS_incorrect_stream_serial_number incorrect_stream_serial_number}
    • + *
    • {@link #VORBIS_invalid_first_page invalid_first_page}
    • + *
    • {@link #VORBIS_bad_packet_type bad_packet_type}
    • + *
    • {@link #VORBIS_cant_find_last_page cant_find_last_page}
    • + *
    • {@link #VORBIS_seek_failed seek_failed}
    • + *
    • {@link #VORBIS_ogg_skeleton_not_supported ogg_skeleton_not_supported}
    • + *
    + */ + public static final int + VORBIS__no_error = 0, + VORBIS_need_more_data = 1, + VORBIS_invalid_api_mixing = 2, + VORBIS_outofmem = 3, + VORBIS_feature_not_supported = 4, + VORBIS_too_many_channels = 5, + VORBIS_file_open_failure = 6, + VORBIS_seek_without_length = 7, + VORBIS_unexpected_eof = 10, + VORBIS_seek_invalid = 11, + VORBIS_invalid_setup = 20, + VORBIS_invalid_stream = 21, + VORBIS_missing_capture_pattern = 30, + VORBIS_invalid_stream_structure_version = 31, + VORBIS_continued_packet_flag_invalid = 32, + VORBIS_incorrect_stream_serial_number = 33, + VORBIS_invalid_first_page = 34, + VORBIS_bad_packet_type = 35, + VORBIS_cant_find_last_page = 36, + VORBIS_seek_failed = 37, + VORBIS_ogg_skeleton_not_supported = 38; + + protected STBVorbis() { + throw new UnsupportedOperationException(); + } + + // --- [ stb_vorbis_get_info ] --- + + /** Unsafe version of: {@link #stb_vorbis_get_info get_info} */ + public static native void nstb_vorbis_get_info(long f, long __result); + + /** + * Returns general information about the specified file. + * + * @param f an ogg vorbis file decoder + */ + @NativeType("stb_vorbis_info") + public static STBVorbisInfo stb_vorbis_get_info(@NativeType("stb_vorbis *") long f, @NativeType("stb_vorbis_info") STBVorbisInfo __result) { + if (CHECKS) { + check(f); + } + nstb_vorbis_get_info(f, __result.address()); + return __result; + } + + // --- [ stb_vorbis_get_comment ] --- + + /** Unsafe version of: {@link #stb_vorbis_get_comment get_comment} */ + public static native void nstb_vorbis_get_comment(long f, long __result); + + /** + * Returns ogg comments. + * + * @param f an ogg vorbis file decoder + */ + @NativeType("stb_vorbis_comment") + public static STBVorbisComment stb_vorbis_get_comment(@NativeType("stb_vorbis *") long f, @NativeType("stb_vorbis_comment") STBVorbisComment __result) { + if (CHECKS) { + check(f); + } + nstb_vorbis_get_comment(f, __result.address()); + return __result; + } + + // --- [ stb_vorbis_get_error ] --- + + /** Unsafe version of: {@link #stb_vorbis_get_error get_error} */ + public static native int nstb_vorbis_get_error(long f); + + /** + * Returns the last error detected (clears it, too). + * + * @param f an ogg vorbis file decoder + */ + public static int stb_vorbis_get_error(@NativeType("stb_vorbis *") long f) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_error(f); + } + + // --- [ stb_vorbis_close ] --- + + /** Unsafe version of: {@link #stb_vorbis_close close} */ + public static native void nstb_vorbis_close(long f); + + /** + * Closes an ogg vorbis file and free all memory in use + * + * @param f an ogg vorbis file decoder + */ + public static void stb_vorbis_close(@NativeType("stb_vorbis *") long f) { + if (CHECKS) { + check(f); + } + nstb_vorbis_close(f); + } + + // --- [ stb_vorbis_get_sample_offset ] --- + + /** Unsafe version of: {@link #stb_vorbis_get_sample_offset get_sample_offset} */ + public static native int nstb_vorbis_get_sample_offset(long f); + + /** + * Returns the offset (in samples) from the beginning of the file that will be returned by the next decode, if it is known, or -1 otherwise. After a + * {@link #stb_vorbis_flush_pushdata flush_pushdata} call, this may take a while before it becomes valid again. + * + *

    NOT WORKING YET after a seek with PULLDATA API.

    + * + * @param f an ogg vorbis file decoder + */ + public static int stb_vorbis_get_sample_offset(@NativeType("stb_vorbis *") long f) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_sample_offset(f); + } + + // --- [ stb_vorbis_get_file_offset ] --- + + /** Unsafe version of: {@link #stb_vorbis_get_file_offset get_file_offset} */ + public static native int nstb_vorbis_get_file_offset(long f); + + /** + * Returns the current seek point within the file, or offset from the beginning of the memory buffer. In pushdata mode it returns 0. + * + * @param f an ogg vorbis file decoder + */ + @NativeType("unsigned int") + public static int stb_vorbis_get_file_offset(@NativeType("stb_vorbis *") long f) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_file_offset(f); + } + + // --- [ stb_vorbis_open_pushdata ] --- + + /** + * Unsafe version of: {@link #stb_vorbis_open_pushdata open_pushdata} + * + * @param datablock_length_in_bytes the length of {@code datablock}, in bytes + */ + public static native long nstb_vorbis_open_pushdata(long datablock, int datablock_length_in_bytes, long datablock_memory_consumed_in_bytes, long error, long alloc_buffer); + + /** + * Creates a vorbis decoder by passing in the initial data block containing the ogg&vorbis headers (you don't need to do parse them, just provide the + * first N bytes of the file -- you're told if it's not enough, see below) + * + * @param datablock the data block containing the ogg vorbis headers + * @param datablock_memory_consumed_in_bytes returns the amount of data parsed/consumed, in bytes + * @param error returns the error code + * @param alloc_buffer an {@link STBVorbisAlloc} struct + * + * @return On success, returns an {@code stb_vorbis *}, does not set error, returns the amount of data parsed/consumed on this call in + * {@code *datablock_memory_consumed_in_bytes}; On failure, returns {@code NULL} on error and sets {@code *error}, does not change + * {@code *datablock_memory_consumed}. If it returns {@code NULL} and {@code *error} is {@link #VORBIS_need_more_data need_more_data}, then the input block was incomplete and you need to pass + * in a larger block from the start of the file. + */ + @NativeType("stb_vorbis *") + public static long stb_vorbis_open_pushdata(@NativeType("unsigned char const *") ByteBuffer datablock, @NativeType("int *") IntBuffer datablock_memory_consumed_in_bytes, @NativeType("int *") IntBuffer error, @Nullable @NativeType("stb_vorbis_alloc const *") STBVorbisAlloc alloc_buffer) { + if (CHECKS) { + check(datablock_memory_consumed_in_bytes, 1); + check(error, 1); + if (alloc_buffer != null) { STBVorbisAlloc.validate(alloc_buffer.address()); } + } + return nstb_vorbis_open_pushdata(memAddress(datablock), datablock.remaining(), memAddress(datablock_memory_consumed_in_bytes), memAddress(error), memAddressSafe(alloc_buffer)); + } + + // --- [ stb_vorbis_decode_frame_pushdata ] --- + + /** + * Unsafe version of: {@link #stb_vorbis_decode_frame_pushdata decode_frame_pushdata} + * + * @param datablock_length_in_bytes the length of {@code datablock}, in bytes + */ + public static native int nstb_vorbis_decode_frame_pushdata(long f, long datablock, int datablock_length_in_bytes, long channels, long output, long samples); + + /** + * Decodes a frame of audio sample data if possible from the passed-in data block. + * + *

    Note that on resynch, stb_vorbis will rarely consume all of the buffer, instead only {@code datablock_length_in_bytes-3} or less. This is because it + * wants to avoid missing parts of a page header if they cross a datablock boundary, without writing state-machiney code to record a partial detection.

    + * + *

    The number of channels returned are stored in *channels (which can be {@code NULL} -- it is always the same as the number of channels reported by {@link #stb_vorbis_get_info get_info}). + * {@code *output} will contain an array of {@code float*} buffers, one per channel. In other words, {@code (*output)[0][0]} contains the first sample + * from the first channel, and {@code (*output)[1][0]} contains the first sample from the second channel.

    + * + *

    {@code *output} points into stb_vorbis's internal output buffer storage; these buffers are owned by stb_vorbis and application code should not free + * them or modify their contents. They are transient and will be overwritten once you ask for more data to get decoded, so be sure to grab any data you + * need before then.

    + * + * @param f an ogg vorbis file decoder + * @param datablock the data block containing the audio sample data + * @param channels place to write number of {@code float *} buffers + * @param output place to write float ** array of float * buffers + * @param samples place to write number of output samples + * + * @return the number of bytes we used from datablock. Possible cases: + * + *
      + *
    • 0 bytes used, 0 samples output (need more data)
    • + *
    • N bytes used, 0 samples output (resynching the stream, keep going)
    • + *
    • N bytes used, M samples output (one frame of data)
    • + *
    + * + *

    Note that after opening a file, you will ALWAYS get one N-bytes,0-sample frame, because Vorbis always "discards" the first frame.

    + */ + public static int stb_vorbis_decode_frame_pushdata(@NativeType("stb_vorbis *") long f, @NativeType("unsigned char const *") ByteBuffer datablock, @Nullable @NativeType("int *") IntBuffer channels, @NativeType("float ***") PointerBuffer output, @NativeType("int *") IntBuffer samples) { + if (CHECKS) { + check(f); + checkSafe(channels, 1); + check(output, 1); + check(samples, 1); + } + return nstb_vorbis_decode_frame_pushdata(f, memAddress(datablock), datablock.remaining(), memAddressSafe(channels), memAddress(output), memAddress(samples)); + } + + // --- [ stb_vorbis_flush_pushdata ] --- + + /** Unsafe version of: {@link #stb_vorbis_flush_pushdata flush_pushdata} */ + public static native void nstb_vorbis_flush_pushdata(long f); + + /** + * Inform stb_vorbis that your next datablock will not be contiguous with previous ones (e.g. you've seeked in the data); future attempts to decode frames + * will cause stb_vorbis to resynchronize (as noted above), and once it sees a valid Ogg page (typically 4-8KB, as large as 64KB), it will begin decoding + * the next frame. + * + *

    If you want to seek using pushdata, you need to seek in your file, then call stb_vorbis_flush_pushdata(), then start calling decoding, then once + * decoding is returning you data, call {@link #stb_vorbis_get_sample_offset get_sample_offset}, and if you don't like the result, seek your file again and repeat.

    + * + * @param f an ogg vorbis file decoder + */ + public static void stb_vorbis_flush_pushdata(@NativeType("stb_vorbis *") long f) { + if (CHECKS) { + check(f); + } + nstb_vorbis_flush_pushdata(f); + } + + // --- [ stb_vorbis_decode_filename ] --- + + /** Unsafe version of: {@link #stb_vorbis_decode_filename decode_filename} */ + public static native int nstb_vorbis_decode_filename(long filename, long channels, long sample_rate, long output); + + /** + * Decode an entire file and output the data interleaved into a {@code malloc()ed} buffer stored in {@code *output}. When you're done with it, just + * {@link LibCStdlib#free} the pointer returned in {@code *output}. + * + * @param filename the file name + * @param channels returns the number of channels + * @param sample_rate returns the sample rate + * @param output returns a pointer to the decoded data + * + * @return the number of samples decoded, or -1 if the file could not be opened or was not an ogg vorbis file + */ + public static int stb_vorbis_decode_filename(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") IntBuffer channels, @NativeType("int *") IntBuffer sample_rate, @NativeType("short **") PointerBuffer output) { + if (CHECKS) { + checkNT1(filename); + check(channels, 1); + check(sample_rate, 1); + check(output, 1); + } + return nstb_vorbis_decode_filename(memAddress(filename), memAddress(channels), memAddress(sample_rate), memAddress(output)); + } + + /** + * Decode an entire file and output the data interleaved into a {@code malloc()ed} buffer stored in {@code *output}. When you're done with it, just + * {@link LibCStdlib#free} the pointer returned in {@code *output}. + * + * @param filename the file name + * @param channels returns the number of channels + * @param sample_rate returns the sample rate + * @param output returns a pointer to the decoded data + * + * @return the number of samples decoded, or -1 if the file could not be opened or was not an ogg vorbis file + */ + public static int stb_vorbis_decode_filename(@NativeType("char const *") CharSequence filename, @NativeType("int *") IntBuffer channels, @NativeType("int *") IntBuffer sample_rate, @NativeType("short **") PointerBuffer output) { + if (CHECKS) { + check(channels, 1); + check(sample_rate, 1); + check(output, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstb_vorbis_decode_filename(filenameEncoded, memAddress(channels), memAddress(sample_rate), memAddress(output)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Decode an entire file and output the data interleaved into a {@code malloc()ed} buffer stored in {@code *output}. When you're done with it, just + * {@link LibCStdlib#free} the pointer returned in {@code *output}. + * + * @param filename the file name + * @param channels returns the number of channels + * @param sample_rate returns the sample rate + * + * @return the number of samples decoded, or -1 if the file could not be opened or was not an ogg vorbis file + */ + @Nullable + @NativeType("int") + public static ShortBuffer stb_vorbis_decode_filename(@NativeType("char const *") CharSequence filename, @NativeType("int *") IntBuffer channels, @NativeType("int *") IntBuffer sample_rate) { + if (CHECKS) { + check(channels, 1); + check(sample_rate, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(filename, true); + long filenameEncoded = stack.getPointerAddress(); + PointerBuffer output = stack.pointers(NULL); + int __result = nstb_vorbis_decode_filename(filenameEncoded, memAddress(channels), memAddress(sample_rate), memAddress(output)); + return memShortBufferSafe(output.get(0), __result * channels.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stb_vorbis_decode_memory ] --- + + /** + * Unsafe version of: {@link #stb_vorbis_decode_memory decode_memory} + * + * @param len the {@code data} length, in bytes + */ + public static native int nstb_vorbis_decode_memory(long mem, int len, long channels, long sample_rate, long output); + + /** + * In-memory version of {@link #stb_vorbis_decode_filename decode_filename}. + * + * @param mem the data to decode + * @param channels returns the number of channels + * @param sample_rate returns the sample rate + * @param output returns a pointer to the decoded data + */ + public static int stb_vorbis_decode_memory(@NativeType("unsigned char const *") ByteBuffer mem, @NativeType("int *") IntBuffer channels, @NativeType("int *") IntBuffer sample_rate, @NativeType("short **") PointerBuffer output) { + if (CHECKS) { + check(channels, 1); + check(sample_rate, 1); + check(output, 1); + } + return nstb_vorbis_decode_memory(memAddress(mem), mem.remaining(), memAddress(channels), memAddress(sample_rate), memAddress(output)); + } + + /** + * In-memory version of {@link #stb_vorbis_decode_filename decode_filename}. + * + * @param mem the data to decode + * @param channels returns the number of channels + * @param sample_rate returns the sample rate + */ + @Nullable + @NativeType("int") + public static ShortBuffer stb_vorbis_decode_memory(@NativeType("unsigned char const *") ByteBuffer mem, @NativeType("int *") IntBuffer channels, @NativeType("int *") IntBuffer sample_rate) { + if (CHECKS) { + check(channels, 1); + check(sample_rate, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + PointerBuffer output = stack.pointers(NULL); + int __result = nstb_vorbis_decode_memory(memAddress(mem), mem.remaining(), memAddress(channels), memAddress(sample_rate), memAddress(output)); + return memShortBufferSafe(output.get(0), __result * channels.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stb_vorbis_open_memory ] --- + + /** + * Unsafe version of: {@link #stb_vorbis_open_memory open_memory} + * + * @param len the {@code data} length, in bytes + */ + public static native long nstb_vorbis_open_memory(long mem, int len, long error, long alloc_buffer); + + /** + * Creates an ogg vorbis decoder from an ogg vorbis stream in memory (note this must be the entire stream!). + * + * @param mem the data to decode + * @param error returns an error code + * @param alloc_buffer an {@link STBVorbisAlloc} struct + * + * @return the ogg vorbis decoder. On failure, returns {@code NULL} and sets {@code *error}. + */ + @NativeType("stb_vorbis *") + public static long stb_vorbis_open_memory(@NativeType("unsigned char const *") ByteBuffer mem, @NativeType("int *") IntBuffer error, @Nullable @NativeType("stb_vorbis_alloc const *") STBVorbisAlloc alloc_buffer) { + if (CHECKS) { + check(error, 1); + if (alloc_buffer != null) { STBVorbisAlloc.validate(alloc_buffer.address()); } + } + return nstb_vorbis_open_memory(memAddress(mem), mem.remaining(), memAddress(error), memAddressSafe(alloc_buffer)); + } + + // --- [ stb_vorbis_open_filename ] --- + + /** Unsafe version of: {@link #stb_vorbis_open_filename open_filename} */ + public static native long nstb_vorbis_open_filename(long filename, long error, long alloc_buffer); + + /** + * Creates an ogg vorbis decoder from a file name. + * + * @param filename the file name + * @param error returns an error code + * @param alloc_buffer an {@link STBVorbisAlloc} struct + * + * @return the ogg vorbis decoder. On failure, returns {@code NULL} and sets {@code *error}. + */ + @NativeType("stb_vorbis *") + public static long stb_vorbis_open_filename(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") IntBuffer error, @Nullable @NativeType("stb_vorbis_alloc const *") STBVorbisAlloc alloc_buffer) { + if (CHECKS) { + checkNT1(filename); + check(error, 1); + if (alloc_buffer != null) { STBVorbisAlloc.validate(alloc_buffer.address()); } + } + return nstb_vorbis_open_filename(memAddress(filename), memAddress(error), memAddressSafe(alloc_buffer)); + } + + /** + * Creates an ogg vorbis decoder from a file name. + * + * @param filename the file name + * @param error returns an error code + * @param alloc_buffer an {@link STBVorbisAlloc} struct + * + * @return the ogg vorbis decoder. On failure, returns {@code NULL} and sets {@code *error}. + */ + @NativeType("stb_vorbis *") + public static long stb_vorbis_open_filename(@NativeType("char const *") CharSequence filename, @NativeType("int *") IntBuffer error, @Nullable @NativeType("stb_vorbis_alloc const *") STBVorbisAlloc alloc_buffer) { + if (CHECKS) { + check(error, 1); + if (alloc_buffer != null) { STBVorbisAlloc.validate(alloc_buffer.address()); } + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstb_vorbis_open_filename(filenameEncoded, memAddress(error), memAddressSafe(alloc_buffer)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ stb_vorbis_seek_frame ] --- + + /** Unsafe version of: {@link #stb_vorbis_seek_frame seek_frame} */ + public static native int nstb_vorbis_seek_frame(long f, int sample_number); + + /** + * Seeks in the Vorbis file to (approximately) {@code sample_number}. After calling seek_frame(), the next call to {@code get_frame_*()} will include the + * specified sample. + * + * @param f an ogg vorbis file decoder + * @param sample_number the sample index + */ + @NativeType("int") + public static boolean stb_vorbis_seek_frame(@NativeType("stb_vorbis *") long f, @NativeType("unsigned int") int sample_number) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_seek_frame(f, sample_number) != 0; + } + + // --- [ stb_vorbis_seek ] --- + + /** Unsafe version of: {@link #stb_vorbis_seek seek} */ + public static native int nstb_vorbis_seek(long f, int sample_number); + + /** + * Seeks in the Vorbis file to (approximately) {@code sample_number}. After calling stb_vorbis_seek(), the next call to {@code stb_vorbis_get_samples_*} + * will start with the specified sample. + * + * @param f an ogg vorbis file decoder + * @param sample_number the sample index + */ + @NativeType("int") + public static boolean stb_vorbis_seek(@NativeType("stb_vorbis *") long f, @NativeType("unsigned int") int sample_number) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_seek(f, sample_number) != 0; + } + + // --- [ stb_vorbis_seek_start ] --- + + /** Unsafe version of: {@link #stb_vorbis_seek_start seek_start} */ + public static native int nstb_vorbis_seek_start(long f); + + /** + * This function is equivalent to {@link #stb_vorbis_seek seek}(f,0). + * + * @param f an ogg vorbis file decoder + */ + @NativeType("int") + public static boolean stb_vorbis_seek_start(@NativeType("stb_vorbis *") long f) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_seek_start(f) != 0; + } + + // --- [ stb_vorbis_stream_length_in_samples ] --- + + /** Unsafe version of: {@link #stb_vorbis_stream_length_in_samples stream_length_in_samples} */ + public static native int nstb_vorbis_stream_length_in_samples(long f); + + /** + * Returns the total length of the vorbis stream, in samples. + * + * @param f an ogg vorbis file decoder + */ + @NativeType("unsigned int") + public static int stb_vorbis_stream_length_in_samples(@NativeType("stb_vorbis *") long f) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_stream_length_in_samples(f); + } + + // --- [ stb_vorbis_stream_length_in_seconds ] --- + + /** Unsafe version of: {@link #stb_vorbis_stream_length_in_seconds stream_length_in_seconds} */ + public static native float nstb_vorbis_stream_length_in_seconds(long f); + + /** + * Returns the total length of the vorbis stream, in samples. + * + * @param f an ogg vorbis file decoder + */ + public static float stb_vorbis_stream_length_in_seconds(@NativeType("stb_vorbis *") long f) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_stream_length_in_seconds(f); + } + + // --- [ stb_vorbis_get_frame_float ] --- + + /** Unsafe version of: {@link #stb_vorbis_get_frame_float get_frame_float} */ + public static native int nstb_vorbis_get_frame_float(long f, long channels, long output); + + /** + * Decodes the next frame and return the number of samples. + * + *

    You generally should not intermix calls to {@code stb_vorbis_get_frame_*()} and {@code stb_vorbis_get_samples_*()}, since the latter calls the former.

    + * + * @param f an ogg vorbis file decoder + * @param channels returns the number of channels. Can be {@code NULL} -- it is always the same as the number of channels reported by {@link #stb_vorbis_get_info get_info}. + * @param output returns a pointer to an array of float* buffers, one per channel. These outputs will be overwritten on the next call to + * {@code stb_vorbis_get_frame_*}. + * + * @return the number of samples per channel + */ + public static int stb_vorbis_get_frame_float(@NativeType("stb_vorbis *") long f, @Nullable @NativeType("int *") IntBuffer channels, @NativeType("float ***") PointerBuffer output) { + if (CHECKS) { + check(f); + checkSafe(channels, 1); + check(output, 1); + } + return nstb_vorbis_get_frame_float(f, memAddressSafe(channels), memAddress(output)); + } + + // --- [ stb_vorbis_get_frame_short ] --- + + /** + * Unsafe version of: {@link #stb_vorbis_get_frame_short get_frame_short} + * + * @param num_c the number of channels + */ + public static native int nstb_vorbis_get_frame_short(long f, int num_c, long buffer, int num_samples); + + /** + * Decodes the next frame and returns the number of samples per channel. Note that for interleaved data, you pass in the number of shorts (the size + * of your array), but the return value is the number of samples per channel, not the total number of samples. + * + *

    The data is coerced to the number of channels you request according to the channel coercion rules (see below). You must pass in the size of your + * buffer(s) so that stb_vorbis will not overwrite the end of the buffer. The maximum buffer size needed can be gotten from {@link #stb_vorbis_get_info get_info}; however, the + * Vorbis I specification implies an absolute maximum of 4096 samples per channel.

    + * + *

    Channel coercion rules

    + * + *

    Let M be the number of channels requested, and N the number of channels present, and Cn be the nth channel; let stereo L be the sum of all L and center + * channels, and stereo R be the sum of all R and center channels (channel assignment from the vorbis spec).

    + * + *
    
    +     * M    N      output
    +     * 1    k      sum(Ck) for all k
    +     * 2    *      stereo L, stereo R
    +     * k    l      k > l, the first l channels, then 0s
    +     * k    l      k ≤ l, the first k channels
    + * + *

    Note that this is not good surround etc. mixing at all! It's just so you get something useful.

    + * + * @param f an ogg vorbis file decoder + * @param buffer the output buffer, an array of pointers with length {@code num_c}, each pointing to a short array with length {@code num_samples} + * @param num_samples the number of samples + * + * @return the number of samples per channel + */ + public static int stb_vorbis_get_frame_short(@NativeType("stb_vorbis *") long f, @NativeType("short **") PointerBuffer buffer, int num_samples) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_frame_short(f, buffer.remaining(), memAddress(buffer), num_samples); + } + + // --- [ stb_vorbis_get_frame_short_interleaved ] --- + + /** + * Unsafe version of: {@link #stb_vorbis_get_frame_short_interleaved get_frame_short_interleaved} + * + * @param num_shorts the size of {@code buffer} + */ + public static native int nstb_vorbis_get_frame_short_interleaved(long f, int num_c, long buffer, int num_shorts); + + /** + * Interleaved version of {@link #stb_vorbis_get_frame_short get_frame_short}. + * + *

    Note that for interleaved data, you pass in the number of shorts (the size of your array), but the return value is the number of samples per channel, + * not the total number of samples.

    + * + * @param f an ogg vorbis file decoder + * @param num_c the number of channels + * @param buffer the output buffer + * + * @return the number of samples per channel + */ + public static int stb_vorbis_get_frame_short_interleaved(@NativeType("stb_vorbis *") long f, int num_c, @NativeType("short *") ShortBuffer buffer) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_frame_short_interleaved(f, num_c, memAddress(buffer), buffer.remaining()); + } + + // --- [ stb_vorbis_get_samples_float ] --- + + /** + * Unsafe version of: {@link #stb_vorbis_get_samples_float get_samples_float} + * + * @param channels the number of channels to decode + */ + public static native int nstb_vorbis_get_samples_float(long f, int channels, long buffer, int num_samples); + + /** + * Gets {@code num_samples} samples, not necessarily on a frame boundary -- this requires buffering so you have to supply the buffers. DOES NOT APPLY THE + * COERCION RULES. + * + * @param f an ogg vorbis file decoder + * @param buffer the output buffer, an array of pointers with length {@code channels}, each pointing to a float array with length {@code num_samples} + * @param num_samples the number of samples to decode + * + * @return the number of samples stored per channel; it may be less than requested at the end of the file. If there are no more samples in the file, returns 0. + */ + public static int stb_vorbis_get_samples_float(@NativeType("stb_vorbis *") long f, @NativeType("float **") PointerBuffer buffer, int num_samples) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_samples_float(f, buffer.remaining(), memAddress(buffer), num_samples); + } + + // --- [ stb_vorbis_get_samples_float_interleaved ] --- + + /** + * Unsafe version of: {@link #stb_vorbis_get_samples_float_interleaved get_samples_float_interleaved} + * + * @param num_floats the size of {@code buffer} + */ + public static native int nstb_vorbis_get_samples_float_interleaved(long f, int channels, long buffer, int num_floats); + + /** + * Interleaved version of {@link #stb_vorbis_get_samples_float get_samples_float}. + * + * @param f an ogg vorbis file decoder + * @param channels the number of channels + * @param buffer the output buffer + * + * @return the number of samples stored per channel; it may be less than requested at the end of the file. If there are no more samples in the file, returns 0. + */ + public static int stb_vorbis_get_samples_float_interleaved(@NativeType("stb_vorbis *") long f, int channels, @NativeType("float *") FloatBuffer buffer) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_samples_float_interleaved(f, channels, memAddress(buffer), buffer.remaining()); + } + + // --- [ stb_vorbis_get_samples_short ] --- + + /** + * Unsafe version of: {@link #stb_vorbis_get_samples_short get_samples_short} + * + * @param channels the number of channels + */ + public static native int nstb_vorbis_get_samples_short(long f, int channels, long buffer, int num_samples); + + /** + * Gets {@code num_samples} samples, not necessarily on a frame boundary -- this requires buffering so you have to supply the buffers. Applies the + * coercion rules above to produce {@code channels} channels. + * + * @param f an ogg vorbis file decoder + * @param buffer the output buffer, an array of pointers with length {@code channels}, each pointing to a short array with length {@code num_samples} + * @param num_samples the number of samples + * + * @return the number of samples stored per channel; it may be less than requested at the end of the file. If there are no more samples in the file, returns 0. + */ + public static int stb_vorbis_get_samples_short(@NativeType("stb_vorbis *") long f, @NativeType("short **") PointerBuffer buffer, int num_samples) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_samples_short(f, buffer.remaining(), memAddress(buffer), num_samples); + } + + // --- [ stb_vorbis_get_samples_short_interleaved ] --- + + /** + * Unsafe version of: {@link #stb_vorbis_get_samples_short_interleaved get_samples_short_interleaved} + * + * @param num_shorts the size of {@code buffer} + */ + public static native int nstb_vorbis_get_samples_short_interleaved(long f, int channels, long buffer, int num_shorts); + + /** + * Interleaved version of {@link #stb_vorbis_get_samples_short get_samples_short}. + * + * @param f an ogg vorbis file decoder + * @param channels the number of channels + * @param buffer the output buffer + * + * @return the number of samples stored per channel; it may be less than requested at the end of the file. If there are no more samples in the file, returns 0. + */ + public static int stb_vorbis_get_samples_short_interleaved(@NativeType("stb_vorbis *") long f, int channels, @NativeType("short *") ShortBuffer buffer) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_samples_short_interleaved(f, channels, memAddress(buffer), buffer.remaining()); + } + + /** Array version of: {@link #nstb_vorbis_open_pushdata} */ + public static native long nstb_vorbis_open_pushdata(long datablock, int datablock_length_in_bytes, int[] datablock_memory_consumed_in_bytes, int[] error, long alloc_buffer); + + /** Array version of: {@link #stb_vorbis_open_pushdata open_pushdata} */ + @NativeType("stb_vorbis *") + public static long stb_vorbis_open_pushdata(@NativeType("unsigned char const *") ByteBuffer datablock, @NativeType("int *") int[] datablock_memory_consumed_in_bytes, @NativeType("int *") int[] error, @Nullable @NativeType("stb_vorbis_alloc const *") STBVorbisAlloc alloc_buffer) { + if (CHECKS) { + check(datablock_memory_consumed_in_bytes, 1); + check(error, 1); + if (alloc_buffer != null) { STBVorbisAlloc.validate(alloc_buffer.address()); } + } + return nstb_vorbis_open_pushdata(memAddress(datablock), datablock.remaining(), datablock_memory_consumed_in_bytes, error, memAddressSafe(alloc_buffer)); + } + + /** Array version of: {@link #nstb_vorbis_decode_frame_pushdata} */ + public static native int nstb_vorbis_decode_frame_pushdata(long f, long datablock, int datablock_length_in_bytes, int[] channels, long output, int[] samples); + + /** Array version of: {@link #stb_vorbis_decode_frame_pushdata decode_frame_pushdata} */ + public static int stb_vorbis_decode_frame_pushdata(@NativeType("stb_vorbis *") long f, @NativeType("unsigned char const *") ByteBuffer datablock, @Nullable @NativeType("int *") int[] channels, @NativeType("float ***") PointerBuffer output, @NativeType("int *") int[] samples) { + if (CHECKS) { + check(f); + checkSafe(channels, 1); + check(output, 1); + check(samples, 1); + } + return nstb_vorbis_decode_frame_pushdata(f, memAddress(datablock), datablock.remaining(), channels, memAddress(output), samples); + } + + /** Array version of: {@link #nstb_vorbis_decode_filename} */ + public static native int nstb_vorbis_decode_filename(long filename, int[] channels, int[] sample_rate, long output); + + /** Array version of: {@link #stb_vorbis_decode_filename decode_filename} */ + public static int stb_vorbis_decode_filename(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") int[] channels, @NativeType("int *") int[] sample_rate, @NativeType("short **") PointerBuffer output) { + if (CHECKS) { + checkNT1(filename); + check(channels, 1); + check(sample_rate, 1); + check(output, 1); + } + return nstb_vorbis_decode_filename(memAddress(filename), channels, sample_rate, memAddress(output)); + } + + /** Array version of: {@link #stb_vorbis_decode_filename decode_filename} */ + public static int stb_vorbis_decode_filename(@NativeType("char const *") CharSequence filename, @NativeType("int *") int[] channels, @NativeType("int *") int[] sample_rate, @NativeType("short **") PointerBuffer output) { + if (CHECKS) { + check(channels, 1); + check(sample_rate, 1); + check(output, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstb_vorbis_decode_filename(filenameEncoded, channels, sample_rate, memAddress(output)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #nstb_vorbis_decode_memory} */ + public static native int nstb_vorbis_decode_memory(long mem, int len, int[] channels, int[] sample_rate, long output); + + /** Array version of: {@link #stb_vorbis_decode_memory decode_memory} */ + public static int stb_vorbis_decode_memory(@NativeType("unsigned char const *") ByteBuffer mem, @NativeType("int *") int[] channels, @NativeType("int *") int[] sample_rate, @NativeType("short **") PointerBuffer output) { + if (CHECKS) { + check(channels, 1); + check(sample_rate, 1); + check(output, 1); + } + return nstb_vorbis_decode_memory(memAddress(mem), mem.remaining(), channels, sample_rate, memAddress(output)); + } + + /** Array version of: {@link #nstb_vorbis_open_memory} */ + public static native long nstb_vorbis_open_memory(long mem, int len, int[] error, long alloc_buffer); + + /** Array version of: {@link #stb_vorbis_open_memory open_memory} */ + @NativeType("stb_vorbis *") + public static long stb_vorbis_open_memory(@NativeType("unsigned char const *") ByteBuffer mem, @NativeType("int *") int[] error, @Nullable @NativeType("stb_vorbis_alloc const *") STBVorbisAlloc alloc_buffer) { + if (CHECKS) { + check(error, 1); + if (alloc_buffer != null) { STBVorbisAlloc.validate(alloc_buffer.address()); } + } + return nstb_vorbis_open_memory(memAddress(mem), mem.remaining(), error, memAddressSafe(alloc_buffer)); + } + + /** Array version of: {@link #nstb_vorbis_open_filename} */ + public static native long nstb_vorbis_open_filename(long filename, int[] error, long alloc_buffer); + + /** Array version of: {@link #stb_vorbis_open_filename open_filename} */ + @NativeType("stb_vorbis *") + public static long stb_vorbis_open_filename(@NativeType("char const *") ByteBuffer filename, @NativeType("int *") int[] error, @Nullable @NativeType("stb_vorbis_alloc const *") STBVorbisAlloc alloc_buffer) { + if (CHECKS) { + checkNT1(filename); + check(error, 1); + if (alloc_buffer != null) { STBVorbisAlloc.validate(alloc_buffer.address()); } + } + return nstb_vorbis_open_filename(memAddress(filename), error, memAddressSafe(alloc_buffer)); + } + + /** Array version of: {@link #stb_vorbis_open_filename open_filename} */ + @NativeType("stb_vorbis *") + public static long stb_vorbis_open_filename(@NativeType("char const *") CharSequence filename, @NativeType("int *") int[] error, @Nullable @NativeType("stb_vorbis_alloc const *") STBVorbisAlloc alloc_buffer) { + if (CHECKS) { + check(error, 1); + if (alloc_buffer != null) { STBVorbisAlloc.validate(alloc_buffer.address()); } + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(filename, true); + long filenameEncoded = stack.getPointerAddress(); + return nstb_vorbis_open_filename(filenameEncoded, error, memAddressSafe(alloc_buffer)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** Array version of: {@link #nstb_vorbis_get_frame_float} */ + public static native int nstb_vorbis_get_frame_float(long f, int[] channels, long output); + + /** Array version of: {@link #stb_vorbis_get_frame_float get_frame_float} */ + public static int stb_vorbis_get_frame_float(@NativeType("stb_vorbis *") long f, @Nullable @NativeType("int *") int[] channels, @NativeType("float ***") PointerBuffer output) { + if (CHECKS) { + check(f); + checkSafe(channels, 1); + check(output, 1); + } + return nstb_vorbis_get_frame_float(f, channels, memAddress(output)); + } + + /** Array version of: {@link #nstb_vorbis_get_frame_short_interleaved} */ + public static native int nstb_vorbis_get_frame_short_interleaved(long f, int num_c, short[] buffer, int num_shorts); + + /** Array version of: {@link #stb_vorbis_get_frame_short_interleaved get_frame_short_interleaved} */ + public static int stb_vorbis_get_frame_short_interleaved(@NativeType("stb_vorbis *") long f, int num_c, @NativeType("short *") short[] buffer) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_frame_short_interleaved(f, num_c, buffer, buffer.length); + } + + /** Array version of: {@link #nstb_vorbis_get_samples_float_interleaved} */ + public static native int nstb_vorbis_get_samples_float_interleaved(long f, int channels, float[] buffer, int num_floats); + + /** Array version of: {@link #stb_vorbis_get_samples_float_interleaved get_samples_float_interleaved} */ + public static int stb_vorbis_get_samples_float_interleaved(@NativeType("stb_vorbis *") long f, int channels, @NativeType("float *") float[] buffer) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_samples_float_interleaved(f, channels, buffer, buffer.length); + } + + /** Array version of: {@link #nstb_vorbis_get_samples_short_interleaved} */ + public static native int nstb_vorbis_get_samples_short_interleaved(long f, int channels, short[] buffer, int num_shorts); + + /** Array version of: {@link #stb_vorbis_get_samples_short_interleaved get_samples_short_interleaved} */ + public static int stb_vorbis_get_samples_short_interleaved(@NativeType("stb_vorbis *") long f, int channels, @NativeType("short *") short[] buffer) { + if (CHECKS) { + check(f); + } + return nstb_vorbis_get_samples_short_interleaved(f, channels, buffer, buffer.length); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisAlloc.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisAlloc.java new file mode 100644 index 000000000..295a2b89a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisAlloc.java @@ -0,0 +1,300 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A buffer to use for allocations by {@link STBVorbis} + * + *

    Layout

    + * + *
    
    + * struct stb_vorbis_alloc {
    + *     char * alloc_buffer;
    + *     int alloc_buffer_length_in_bytes;
    + * }
    + */ +@NativeType("struct stb_vorbis_alloc") +public class STBVorbisAlloc extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ALLOC_BUFFER, + ALLOC_BUFFER_LENGTH_IN_BYTES; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + ALLOC_BUFFER = layout.offsetof(0); + ALLOC_BUFFER_LENGTH_IN_BYTES = layout.offsetof(1); + } + + protected STBVorbisAlloc(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBVorbisAlloc create(long address, @Nullable ByteBuffer container) { + return new STBVorbisAlloc(address, container); + } + + /** + * Creates a {@code STBVorbisAlloc} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBVorbisAlloc(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code alloc_buffer} field. */ + @NativeType("char *") + public ByteBuffer alloc_buffer() { return nalloc_buffer(address()); } + /** @return the value of the {@code alloc_buffer_length_in_bytes} field. */ + public int alloc_buffer_length_in_bytes() { return nalloc_buffer_length_in_bytes(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@code alloc_buffer} field. */ + public STBVorbisAlloc alloc_buffer(@NativeType("char *") ByteBuffer value) { nalloc_buffer(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public STBVorbisAlloc set(STBVorbisAlloc src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code STBVorbisAlloc} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBVorbisAlloc malloc() { + return new STBVorbisAlloc(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBVorbisAlloc} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBVorbisAlloc calloc() { + return new STBVorbisAlloc(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBVorbisAlloc} instance allocated with {@link BufferUtils}. */ + public static STBVorbisAlloc create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBVorbisAlloc(memAddress(container), container); + } + + /** Returns a new {@code STBVorbisAlloc} instance for the specified memory address. */ + public static STBVorbisAlloc create(long address) { + return new STBVorbisAlloc(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBVorbisAlloc createSafe(long address) { + return address == NULL ? null : new STBVorbisAlloc(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBVorbisAlloc mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBVorbisAlloc callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBVorbisAlloc mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBVorbisAlloc callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBVorbisAlloc} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBVorbisAlloc malloc(MemoryStack stack) { + return new STBVorbisAlloc(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBVorbisAlloc} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBVorbisAlloc calloc(MemoryStack stack) { + return new STBVorbisAlloc(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #alloc_buffer() alloc_buffer}. */ + public static ByteBuffer nalloc_buffer(long struct) { return memByteBuffer(memGetAddress(struct + STBVorbisAlloc.ALLOC_BUFFER), nalloc_buffer_length_in_bytes(struct)); } + /** Unsafe version of {@link #alloc_buffer_length_in_bytes}. */ + public static int nalloc_buffer_length_in_bytes(long struct) { return UNSAFE.getInt(null, struct + STBVorbisAlloc.ALLOC_BUFFER_LENGTH_IN_BYTES); } + + /** Unsafe version of {@link #alloc_buffer(ByteBuffer) alloc_buffer}. */ + public static void nalloc_buffer(long struct, ByteBuffer value) { memPutAddress(struct + STBVorbisAlloc.ALLOC_BUFFER, memAddress(value)); nalloc_buffer_length_in_bytes(struct, value.remaining()); } + /** Sets the specified value to the {@code alloc_buffer_length_in_bytes} field of the specified {@code struct}. */ + public static void nalloc_buffer_length_in_bytes(long struct, int value) { UNSAFE.putInt(null, struct + STBVorbisAlloc.ALLOC_BUFFER_LENGTH_IN_BYTES, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + STBVorbisAlloc.ALLOC_BUFFER)); + } + + // ----------------------------------- + + /** An array of {@link STBVorbisAlloc} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBVorbisAlloc ELEMENT_FACTORY = STBVorbisAlloc.create(-1L); + + /** + * Creates a new {@code STBVorbisAlloc.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBVorbisAlloc#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBVorbisAlloc getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code alloc_buffer} field. */ + @NativeType("char *") + public ByteBuffer alloc_buffer() { return STBVorbisAlloc.nalloc_buffer(address()); } + /** @return the value of the {@code alloc_buffer_length_in_bytes} field. */ + public int alloc_buffer_length_in_bytes() { return STBVorbisAlloc.nalloc_buffer_length_in_bytes(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@code alloc_buffer} field. */ + public Buffer alloc_buffer(@NativeType("char *") ByteBuffer value) { STBVorbisAlloc.nalloc_buffer(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisComment.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisComment.java new file mode 100644 index 000000000..602fddd9e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisComment.java @@ -0,0 +1,266 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct stb_vorbis_comment {
    + *     char * vendor;
    + *     int comment_list_length;
    + *     char ** comment_list;
    + * }
    + */ +@NativeType("struct stb_vorbis_comment") +public class STBVorbisComment extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + VENDOR, + COMMENT_LIST_LENGTH, + COMMENT_LIST; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + VENDOR = layout.offsetof(0); + COMMENT_LIST_LENGTH = layout.offsetof(1); + COMMENT_LIST = layout.offsetof(2); + } + + protected STBVorbisComment(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBVorbisComment create(long address, @Nullable ByteBuffer container) { + return new STBVorbisComment(address, container); + } + + /** + * Creates a {@code STBVorbisComment} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBVorbisComment(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code vendor} field. */ + @NativeType("char *") + public ByteBuffer vendor() { return nvendor(address()); } + /** @return the null-terminated string pointed to by the {@code vendor} field. */ + @NativeType("char *") + public String vendorString() { return nvendorString(address()); } + /** @return the value of the {@code comment_list_length} field. */ + public int comment_list_length() { return ncomment_list_length(address()); } + /** @return a {@link PointerBuffer} view of the data pointed to by the {@code comment_list} field. */ + @NativeType("char **") + public PointerBuffer comment_list() { return ncomment_list(address()); } + + // ----------------------------------- + + /** Returns a new {@code STBVorbisComment} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBVorbisComment malloc() { + return new STBVorbisComment(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBVorbisComment} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBVorbisComment calloc() { + return new STBVorbisComment(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBVorbisComment} instance allocated with {@link BufferUtils}. */ + public static STBVorbisComment create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBVorbisComment(memAddress(container), container); + } + + /** Returns a new {@code STBVorbisComment} instance for the specified memory address. */ + public static STBVorbisComment create(long address) { + return new STBVorbisComment(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBVorbisComment createSafe(long address) { + return address == NULL ? null : new STBVorbisComment(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code STBVorbisComment} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBVorbisComment malloc(MemoryStack stack) { + return new STBVorbisComment(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBVorbisComment} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBVorbisComment calloc(MemoryStack stack) { + return new STBVorbisComment(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #vendor}. */ + public static ByteBuffer nvendor(long struct) { return memByteBufferNT1(memGetAddress(struct + STBVorbisComment.VENDOR)); } + /** Unsafe version of {@link #vendorString}. */ + public static String nvendorString(long struct) { return memASCII(memGetAddress(struct + STBVorbisComment.VENDOR)); } + /** Unsafe version of {@link #comment_list_length}. */ + public static int ncomment_list_length(long struct) { return UNSAFE.getInt(null, struct + STBVorbisComment.COMMENT_LIST_LENGTH); } + /** Unsafe version of {@link #comment_list() comment_list}. */ + public static PointerBuffer ncomment_list(long struct) { return memPointerBuffer(memGetAddress(struct + STBVorbisComment.COMMENT_LIST), ncomment_list_length(struct)); } + + // ----------------------------------- + + /** An array of {@link STBVorbisComment} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBVorbisComment ELEMENT_FACTORY = STBVorbisComment.create(-1L); + + /** + * Creates a new {@code STBVorbisComment.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBVorbisComment#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBVorbisComment getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code vendor} field. */ + @NativeType("char *") + public ByteBuffer vendor() { return STBVorbisComment.nvendor(address()); } + /** @return the null-terminated string pointed to by the {@code vendor} field. */ + @NativeType("char *") + public String vendorString() { return STBVorbisComment.nvendorString(address()); } + /** @return the value of the {@code comment_list_length} field. */ + public int comment_list_length() { return STBVorbisComment.ncomment_list_length(address()); } + /** @return a {@link PointerBuffer} view of the data pointed to by the {@code comment_list} field. */ + @NativeType("char **") + public PointerBuffer comment_list() { return STBVorbisComment.ncomment_list(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisInfo.java b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisInfo.java new file mode 100644 index 000000000..fc2148b96 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/stb/STBVorbisInfo.java @@ -0,0 +1,313 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.stb; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Information about a Vorbis stream. + * + *

    Layout

    + * + *
    
    + * struct stb_vorbis_info {
    + *     unsigned int sample_rate;
    + *     int channels;
    + *     unsigned int setup_memory_required;
    + *     unsigned int setup_temp_memory_required;
    + *     unsigned int temp_memory_required;
    + *     int max_frame_size;
    + * }
    + */ +@NativeType("struct stb_vorbis_info") +public class STBVorbisInfo extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + SAMPLE_RATE, + CHANNELS, + SETUP_MEMORY_REQUIRED, + SETUP_TEMP_MEMORY_REQUIRED, + TEMP_MEMORY_REQUIRED, + MAX_FRAME_SIZE; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + SAMPLE_RATE = layout.offsetof(0); + CHANNELS = layout.offsetof(1); + SETUP_MEMORY_REQUIRED = layout.offsetof(2); + SETUP_TEMP_MEMORY_REQUIRED = layout.offsetof(3); + TEMP_MEMORY_REQUIRED = layout.offsetof(4); + MAX_FRAME_SIZE = layout.offsetof(5); + } + + protected STBVorbisInfo(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected STBVorbisInfo create(long address, @Nullable ByteBuffer container) { + return new STBVorbisInfo(address, container); + } + + /** + * Creates a {@code STBVorbisInfo} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public STBVorbisInfo(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code sample_rate} field. */ + @NativeType("unsigned int") + public int sample_rate() { return nsample_rate(address()); } + /** @return the value of the {@code channels} field. */ + public int channels() { return nchannels(address()); } + /** @return the value of the {@code setup_memory_required} field. */ + @NativeType("unsigned int") + public int setup_memory_required() { return nsetup_memory_required(address()); } + /** @return the value of the {@code setup_temp_memory_required} field. */ + @NativeType("unsigned int") + public int setup_temp_memory_required() { return nsetup_temp_memory_required(address()); } + /** @return the value of the {@code temp_memory_required} field. */ + @NativeType("unsigned int") + public int temp_memory_required() { return ntemp_memory_required(address()); } + /** @return the value of the {@code max_frame_size} field. */ + public int max_frame_size() { return nmax_frame_size(address()); } + + // ----------------------------------- + + /** Returns a new {@code STBVorbisInfo} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static STBVorbisInfo malloc() { + return new STBVorbisInfo(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code STBVorbisInfo} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static STBVorbisInfo calloc() { + return new STBVorbisInfo(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code STBVorbisInfo} instance allocated with {@link BufferUtils}. */ + public static STBVorbisInfo create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new STBVorbisInfo(memAddress(container), container); + } + + /** Returns a new {@code STBVorbisInfo} instance for the specified memory address. */ + public static STBVorbisInfo create(long address) { + return new STBVorbisInfo(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static STBVorbisInfo createSafe(long address) { + return address == NULL ? null : new STBVorbisInfo(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBVorbisInfo mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBVorbisInfo callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static STBVorbisInfo mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static STBVorbisInfo callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code STBVorbisInfo} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static STBVorbisInfo malloc(MemoryStack stack) { + return new STBVorbisInfo(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code STBVorbisInfo} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static STBVorbisInfo calloc(MemoryStack stack) { + return new STBVorbisInfo(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #sample_rate}. */ + public static int nsample_rate(long struct) { return UNSAFE.getInt(null, struct + STBVorbisInfo.SAMPLE_RATE); } + /** Unsafe version of {@link #channels}. */ + public static int nchannels(long struct) { return UNSAFE.getInt(null, struct + STBVorbisInfo.CHANNELS); } + /** Unsafe version of {@link #setup_memory_required}. */ + public static int nsetup_memory_required(long struct) { return UNSAFE.getInt(null, struct + STBVorbisInfo.SETUP_MEMORY_REQUIRED); } + /** Unsafe version of {@link #setup_temp_memory_required}. */ + public static int nsetup_temp_memory_required(long struct) { return UNSAFE.getInt(null, struct + STBVorbisInfo.SETUP_TEMP_MEMORY_REQUIRED); } + /** Unsafe version of {@link #temp_memory_required}. */ + public static int ntemp_memory_required(long struct) { return UNSAFE.getInt(null, struct + STBVorbisInfo.TEMP_MEMORY_REQUIRED); } + /** Unsafe version of {@link #max_frame_size}. */ + public static int nmax_frame_size(long struct) { return UNSAFE.getInt(null, struct + STBVorbisInfo.MAX_FRAME_SIZE); } + + // ----------------------------------- + + /** An array of {@link STBVorbisInfo} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final STBVorbisInfo ELEMENT_FACTORY = STBVorbisInfo.create(-1L); + + /** + * Creates a new {@code STBVorbisInfo.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link STBVorbisInfo#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected STBVorbisInfo getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code sample_rate} field. */ + @NativeType("unsigned int") + public int sample_rate() { return STBVorbisInfo.nsample_rate(address()); } + /** @return the value of the {@code channels} field. */ + public int channels() { return STBVorbisInfo.nchannels(address()); } + /** @return the value of the {@code setup_memory_required} field. */ + @NativeType("unsigned int") + public int setup_memory_required() { return STBVorbisInfo.nsetup_memory_required(address()); } + /** @return the value of the {@code setup_temp_memory_required} field. */ + @NativeType("unsigned int") + public int setup_temp_memory_required() { return STBVorbisInfo.nsetup_temp_memory_required(address()); } + /** @return the value of the {@code temp_memory_required} field. */ + @NativeType("unsigned int") + public int temp_memory_required() { return STBVorbisInfo.ntemp_memory_required(address()); } + /** @return the value of the {@code max_frame_size} field. */ + public int max_frame_size() { return STBVorbisInfo.nmax_frame_size(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/APIUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/APIUtil.java new file mode 100644 index 000000000..805fb0240 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/APIUtil.java @@ -0,0 +1,673 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.*; +import org.lwjgl.system.libffi.*; +import org.lwjgl.system.linux.*; +import org.lwjgl.system.fcl.*; +import org.lwjgl.system.macosx.*; +import org.lwjgl.system.windows.*; + +import javax.annotation.*; +import java.io.*; +import java.lang.reflect.*; +import java.nio.*; +import java.nio.file.*; +import java.util.*; +import java.util.function.*; +import java.util.regex.*; +import java.util.stream.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.wrap; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Utility class useful to API bindings. [INTERNAL USE ONLY] + * + *

    Method names in this class are prefixed with {@code api} to avoid ambiguities when used with static imports.

    + * + * @see Configuration#DEBUG_STREAM + */ +public final class APIUtil { + + /** + * The {@link PrintStream} used by LWJGL to print debug information and non-fatal errors. Defaults to {@link System#err} which can be changed with + * {@link Configuration#DEBUG_STREAM}. + */ + public static final PrintStream DEBUG_STREAM = getDebugStream(); + + private static final Pattern API_VERSION_PATTERN; + + static { + String PREFIX = "[^\\d\\n\\r]*"; + String VERSION = "(\\d+)[.](\\d+)(?:[.](\\S+))?"; + String IMPLEMENTATION = "(?:\\s+(.+?))?\\s*"; + + API_VERSION_PATTERN = Pattern.compile("^" + PREFIX + VERSION + IMPLEMENTATION + "$", Pattern.DOTALL); + } + + @SuppressWarnings({"unchecked", "UseOfSystemOutOrSystemErr"}) + private static PrintStream getDebugStream() { + PrintStream debugStream = System.err; + + Object state = Configuration.DEBUG_STREAM.get(); + if (state instanceof String) { + try { + Supplier factory = (Supplier)Class.forName((String)state).getConstructor().newInstance(); + debugStream = factory.get(); + } catch (Exception e) { + e.printStackTrace(); + } + } else if (state instanceof Supplier) { + debugStream = ((Supplier)state).get(); + } else if (state instanceof PrintStream) { + debugStream = (PrintStream)state; + } + + return debugStream; + } + + private APIUtil() { + } + + /** + * Prints the specified message to the {@link #DEBUG_STREAM} if {@link Checks#DEBUG} is true. + * + * @param msg the message to print + */ + public static void apiLog(CharSequence msg) { + if (DEBUG) { + DEBUG_STREAM.print("[LWJGL] " + msg + "\n"); + } + } + + /** + * Same as {@link #apiLog}, but replaces the LWJGL prefix with a tab character. + * + * @param msg the message to print, in continuation of a previous message + */ + public static void apiLogMore(CharSequence msg) { + if (DEBUG) { + DEBUG_STREAM.print("\t" + msg + "\n"); + } + } + + public static void apiLogMissing(String api, ByteBuffer functionName) { + if (DEBUG) { + String function = memASCII(functionName, functionName.remaining() - 1); + DEBUG_STREAM.print("[LWJGL] Failed to locate address for " + api + " function " + function + "\n"); + } + } + + public static String apiFindLibrary(String start, String name) { + String libName = Platform.get().mapLibraryName(name); + try (Stream paths = Files.find( + Paths.get(start).toAbsolutePath(), + Integer.MAX_VALUE, + (path, attributes) -> attributes.isRegularFile() && path.getFileName().toString().equals(libName) + )) { + return paths + .findFirst() + .map(Path::toString) + .orElse(name); + } catch (IOException e) { + return name; + } + } + + public static SharedLibrary apiCreateLibrary(String name) { + switch (Platform.get()) { + case WINDOWS: + return new WindowsLibrary(name); + case LINUX: + return new LinuxLibrary(name); + case MACOSX: + return MacOSXLibrary.create(name); + default: + throw new IllegalStateException(); + } + } + + public static long apiGetFunctionAddress(FunctionProvider provider, String functionName) { + long a = provider.getFunctionAddress(functionName); + if (a == NULL) { + requiredFunctionMissing(functionName); + } + return a; + } + private static void requiredFunctionMissing(String functionName) { + if (!Configuration.DISABLE_FUNCTION_CHECKS.get(false)) { + throw new NullPointerException("A required function is missing: " + functionName); + } + } + + public static long apiGetFunctionAddressOptional(SharedLibrary library, String functionName) { + long a = library.getFunctionAddress(functionName); + if (DEBUG_FUNCTIONS && a == NULL) { + optionalFunctionMissing(library, functionName); + } + return a; + } + private static void optionalFunctionMissing(SharedLibrary library, String functionName) { + if (DEBUG) { + DEBUG_STREAM.print("[LWJGL] Failed to locate address for " + library.getName() + " function " + functionName + "\n"); + } + } + + @Nullable + public static ByteBuffer apiGetMappedBuffer(@Nullable ByteBuffer buffer, long mappedAddress, int capacity) { + if (buffer != null && memAddress(buffer) == mappedAddress && buffer.capacity() == capacity) { + return buffer; + } + return mappedAddress == NULL ? null : wrap(BUFFER_BYTE, mappedAddress, capacity).order(NATIVE_ORDER); + } + + public static long apiGetBytes(int elements, int elementShift) { + return (elements & 0xFFFF_FFFFL) << elementShift; + } + + public static long apiCheckAllocation(int elements, long bytes, long maxBytes) { + if (DEBUG) { + if (elements < 0) { + throw new IllegalArgumentException("Invalid number of elements"); + } + if ((maxBytes + Long.MIN_VALUE) < (bytes + Long.MIN_VALUE)) { // unsigned comparison + throw new IllegalArgumentException("The request allocation is too large"); + } + } + return bytes; + } + + /** A data class for API versioning information. */ + public static class APIVersion implements Comparable { + + /** Returns the API major version. */ + public final int major; + /** Returns the API minor version. */ + public final int minor; + + /** Returns the API revision. May be null. */ + @Nullable + public final String revision; + /** Returns the API implementation-specific versioning information. May be null. */ + @Nullable + public final String implementation; + + public APIVersion(int major, int minor) { + this(major, minor, null, null); + } + + public APIVersion(int major, int minor, @Nullable String revision, @Nullable String implementation) { + this.major = major; + this.minor = minor; + this.revision = revision; + this.implementation = implementation; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(16); + sb.append(major).append('.').append(minor); + if (revision != null) { + sb.append('.').append(revision); + } + if (implementation != null) { + sb.append(" (").append(implementation).append(')'); + } + return sb.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof APIVersion)) { + return false; + } + + APIVersion that = (APIVersion)o; + + return this.major == that.major && + this.minor == that.major && + Objects.equals(this.revision, that.revision) && + Objects.equals(this.implementation, that.implementation); + } + + @Override + public int hashCode() { + int result = major; + result = 31 * result + minor; + result = 31 * result + (revision != null ? revision.hashCode() : 0); + result = 31 * result + (implementation != null ? implementation.hashCode() : 0); + return result; + } + + @Override + public int compareTo(APIVersion other) { + if (this.major != other.major) { + return Integer.compare(this.major, other.major); + } + + if (this.minor != other.minor) { + return Integer.compare(this.minor, other.minor); + } + + return 0; + } + } + + /** + * Returns the {@link APIVersion} value of the specified option. + * + * @param option the option to query + */ + @Nullable + public static APIVersion apiParseVersion(Configuration option) { + APIVersion version; + + Object state = option.get(); + if (state instanceof String) { + version = apiParseVersion((String)state); + } else if (state instanceof APIVersion) { + version = (APIVersion)state; + } else { + version = null; + } + + return version; + } + + /** + * Parses a version string. + * + *

    The version string must have the format {@code PREFIX MAJOR.MINOR.REVISION IMPL}, where {@code PREFIX} is a prefix without digits (string, optional), + * {@code MAJOR} is the major version (integer), {@code MINOR} is the minor version (integer), {@code REVISION} is the revision version (string, optional) + * and {@code IMPL} is implementation-specific information (string, optional).

    + * + * @param version the version string + * + * @return the parsed {@link APIVersion} + */ + public static APIVersion apiParseVersion(String version) { + Matcher matcher = API_VERSION_PATTERN.matcher(version); + if (!matcher.matches()) { + throw new IllegalArgumentException(String.format("Malformed API version string [%s]", version)); + } + + return new APIVersion( + Integer.parseInt(matcher.group(1)), + Integer.parseInt(matcher.group(2)), + matcher.group(3), + matcher.group(4) + ); + } + + public static void apiFilterExtensions(Set extensions, Configuration option) { + Object value = option.get(); + if (value == null) { + return; + } + + if (value instanceof String) { + String s = (String)value; + if (s.indexOf('.') != -1) { // classpath + try { + @SuppressWarnings("unchecked") Predicate predicate = (Predicate)Class.forName(s).newInstance(); + extensions.removeIf(predicate); + } catch (Exception e) { + throw new RuntimeException(e); + } + } else { + for (String extension : s.split(",")) { + extensions.remove(extension); + } + } + } else if (value instanceof List) { + @SuppressWarnings("unchecked") List list = (List)value; + extensions.removeAll(list); + } else if (value instanceof Predicate) { + @SuppressWarnings("unchecked") Predicate predicate = (Predicate)value; + extensions.removeIf(predicate); + } else { + throw new IllegalStateException("Unsupported " + option.getProperty() + " value specified."); + } + } + + public static String apiUnknownToken(int token) { + return apiUnknownToken("Unknown", token); + } + + public static String apiUnknownToken(String description, int token) { + return String.format("%s [0x%X]", description, token); + } + + /** + * Returns a map of public static final integer fields in the specified classes, to their String representations. An optional filter can be specified to + * only include specific fields. The target map may be null, in which case a new map is allocated and returned. + * + *

    This method is useful when debugging to quickly identify values returned from an API.

    + * + * @param filter the filter to use (optional) + * @param target the target map (optional) + * @param tokenClasses the classes to get tokens from + * + * @return the token map + */ + public static Map apiClassTokens(@Nullable BiPredicate filter, @Nullable Map target, Class... tokenClasses) { + if (target == null) { + //noinspection AssignmentToMethodParameter + target = new HashMap<>(64); + } + + int TOKEN_MODIFIERS = Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL; + + for (Class tokenClass : tokenClasses) { + if (tokenClass == null) { + continue; + } + + for (Field field : tokenClass.getDeclaredFields()) { + // Get only fields. + if ((field.getModifiers() & TOKEN_MODIFIERS) == TOKEN_MODIFIERS && field.getType() == int.class) { + try { + Integer value = field.getInt(null); + if (filter != null && !filter.test(field, value)) { + continue; + } + + String name = target.get(value); + target.put(value, name == null ? field.getName() : name + "|" + field.getName()); + } catch (IllegalAccessException e) { + // Ignore + } + } + } + } + + return target; + } + + // ---------------------------------------- + + /** + * Stores the specified array of pointer addresses on the specified {@link MemoryStack}. + * + * @param stack the stack to use + * @param addresses the pointer addresses to store + * + * @return the pointer array address on the stack + */ + public static long apiArray(MemoryStack stack, long... addresses) { + PointerBuffer pointers = memPointerBuffer(stack.nmalloc(POINTER_SIZE, addresses.length << POINTER_SHIFT), addresses.length); + + for (long address : addresses) { + pointers.put(address); + } + + return pointers.address; + } + + /** + * Stores the addresses of the specified array of buffers on the specified {@link MemoryStack}. + * + * @param stack the stack to use + * @param buffers the buffers to store + * + * @return the pointer array address on the stack + */ + public static long apiArray(MemoryStack stack, ByteBuffer... buffers) { + PointerBuffer pointers = memPointerBuffer(stack.nmalloc(POINTER_SIZE, buffers.length << POINTER_SHIFT), buffers.length); + + for (ByteBuffer buffer : buffers) { + pointers.put(buffer); + } + + return pointers.address; + } + + /** + * Stores the addresses of the specified array of buffers on the specified {@link MemoryStack}. A second array that contains the buffer remaining bytes is + * stored immediately after the pointer array. Length values are pointer-sized integers. + * + * @param stack the stack to use + * @param buffers the buffers to store + * + * @return the pointer array address on the stack + */ + public static long apiArrayp(MemoryStack stack, ByteBuffer... buffers) { + long pointers = apiArray(stack, buffers); + + PointerBuffer lengths = stack.mallocPointer(buffers.length); + for (ByteBuffer buffer : buffers) { + lengths.put(buffer.remaining()); + } + + return pointers; + } + + // ---------------------------------------- + + public interface Encoder { + ByteBuffer encode(CharSequence text, boolean nullTerminated); + } + + /** + * Encodes the specified strings with the specified {@link Encoder} and stores an array of pointers to the encoded data on the specified + * {@link MemoryStack}. The encoded strings include null-termination. + * + * @param stack the stack to use + * @param encoder the encoder to use + * @param strings the strings to encode + * + * @return the pointer array address on the stack + */ + public static long apiArray(MemoryStack stack, Encoder encoder, CharSequence... strings) { + PointerBuffer pointers = stack.mallocPointer(strings.length); + + for (CharSequence s : strings) { + pointers.put(encoder.encode(s, true)); + } + + return pointers.address; + } + + /** + * Encodes the specified strings with the specified {@link Encoder} and stores an array of pointers to the encoded data on the specified + * {@link MemoryStack}. A second array that contains the string lengths is stored immediately after the pointer array. Length values are 4-byte integers. + * + *

    The encoded buffers must be freed with {@link #apiArrayFree}.

    + * + * @param stack the stack to use + * @param encoder the encoder to use + * @param strings the strings to encode + * + * @return the pointer array address on the stack + */ + public static long apiArrayi(MemoryStack stack, Encoder encoder, CharSequence... strings) { + // Alignment rules guarantee these two will be contiguous + PointerBuffer pointers = stack.mallocPointer(strings.length); + IntBuffer lengths = stack.mallocInt(strings.length); + + for (CharSequence s : strings) { + ByteBuffer buffer = encoder.encode(s, false); + + pointers.put(buffer); + lengths.put(buffer.capacity()); + } + + return pointers.address; + } + + /** + * Encodes the specified strings with the specified {@link Encoder} and stores an array of pointers to the encoded data on the specified + * {@link MemoryStack}. A second array that contains the string lengths is stored immediately after the pointer array. Length values are pointer-sized + * integers. + * + *

    The encoded buffers must be freed with {@link #apiArrayFree}.

    + * + * @param stack the stack to use + * @param encoder the encoder to use + * @param strings the strings to encode + * + * @return the pointer array address on the stack + */ + public static long apiArrayp(MemoryStack stack, Encoder encoder, CharSequence... strings) { + PointerBuffer pointers = stack.mallocPointer(strings.length); + PointerBuffer lengths = stack.mallocPointer(strings.length); + + for (CharSequence s : strings) { + ByteBuffer buffer = encoder.encode(s, false); + + pointers.put(buffer); + lengths.put(buffer.capacity()); + } + + return pointers.address; + } + + /** + * Frees the specified array of pointers. + * + * @param pointers the pointer array to free + * @param length the pointer array length + */ + public static void apiArrayFree(long pointers, int length) { + for (int i = length; --i >= 0; ) { + nmemFree(memGetAddress(pointers + Integer.toUnsignedLong(i) * POINTER_SIZE)); + } + } + + // ---------------------------------------- + + // These FFITypes will never be deallocated, use the allocator directly to ignore them when detecting memory leaks. + + public static FFIType apiCreateStruct(FFIType... members) { + MemoryAllocator allocator = MemoryUtil.getAllocator(); + + PointerBuffer elementBuffer = PointerBuffer.create( + allocator.malloc((members.length + 1) * POINTER_SIZE), + members.length + 1 + ); + for (int i = 0; i < members.length; i++) { + elementBuffer.put(i, members[i]); + } + elementBuffer.put(members.length, NULL); + + return FFIType.create(allocator.calloc(1, FFIType.SIZEOF)) + .type(FFI_TYPE_STRUCT) + .elements(elementBuffer); + } + + private static FFIType prep(FFIType type) { + try (MemoryStack stack = stackPush()) { + FFICIF cif = FFICIF.calloc(stack); + if (ffi_prep_cif(cif, FFI_DEFAULT_ABI, type, null) != FFI_OK) { + throw new IllegalStateException("Failed to prepare LibFFI type."); + } + } + return type; + } + + public static FFIType apiCreateUnion(FFIType... members) { + MemoryAllocator allocator = MemoryUtil.getAllocator(); + + // ffi_prep_cif is used to make libffi initialize size/alignment of each member + FFIType maxType = prep(members[0]); + short maxAlignment = members[0].alignment(); + for (int i = 1; i < members.length; i++) { + FFIType type = prep(members[i]); + if (maxType.size() < type.size()) { + maxType = type; + } + if (maxAlignment < type.alignment()) { + maxAlignment = type.alignment(); + } + } + + return FFIType.create(allocator.malloc(FFIType.SIZEOF)) + .size(maxType.size()) + .alignment(maxAlignment) + .type(FFI_TYPE_STRUCT) + .elements(PointerBuffer.create(allocator.malloc(2 * POINTER_SIZE), 2) + .put(0, maxType) + .put(1, NULL)); + } + + public static FFIType apiCreateArray(FFIType type, int length) { + MemoryAllocator allocator = MemoryUtil.getAllocator(); + + PointerBuffer elementBuffer = PointerBuffer.create( + allocator.malloc((length + 1) * POINTER_SIZE), + length + 1 + ); + for (int i = 0; i < length; i++) { + elementBuffer.put(i, type); + } + elementBuffer.put(length, NULL); + + return FFIType.create(allocator.calloc(1, FFIType.SIZEOF)) + .type(FFI_TYPE_STRUCT) + .elements(elementBuffer); + } + + /** Allocates and prepares a libffi CIF. */ + public static FFICIF apiCreateCIF(int abi, FFIType rtype, FFIType... atypes) { + // These CIFs will never be deallocated, use the allocator directly to ignore them when detecting memory leaks. + MemoryAllocator allocator = MemoryUtil.getAllocator(); + + PointerBuffer pArgTypes = PointerBuffer.create(allocator.malloc(atypes.length * POINTER_SIZE), atypes.length); + for (int i = 0; i < atypes.length; i++) { + pArgTypes.put(i, atypes[i]); + } + + FFICIF cif = FFICIF.create(allocator.malloc(FFICIF.SIZEOF)); + + int errcode = ffi_prep_cif(cif, abi, rtype, pArgTypes); + if (errcode != FFI_OK) { + throw new IllegalStateException("Failed to prepare libffi CIF: " + errcode); + } + + return cif; + } + + /** Allocates and prepares a libffi var CIF. */ + public static FFICIF apiCreateCIFVar(int abi, int nfixedargs, FFIType rtype, FFIType... atypes) { + // These CIFs will never be deallocated, use the allocator directly to ignore them when detecting memory leaks. + MemoryAllocator allocator = MemoryUtil.getAllocator(); + + PointerBuffer pArgTypes = PointerBuffer.create(allocator.malloc(atypes.length * POINTER_SIZE), atypes.length); + for (int i = 0; i < atypes.length; i++) { + pArgTypes.put(i, atypes[i]); + } + + FFICIF cif = FFICIF.create(allocator.malloc(FFICIF.SIZEOF)); + + int errcode = ffi_prep_cif_var(cif, abi, nfixedargs, rtype, pArgTypes); + if (errcode != FFI_OK) { + throw new IllegalStateException("Failed to prepare libffi var CIF: " + errcode); + } + + return cif; + } + + public static int apiStdcall() { + return Platform.get() == Platform.WINDOWS && Pointer.BITS32 ? FFI_STDCALL : FFI_DEFAULT_ABI; + } + + public static void apiClosureRet(long ret, boolean __result) { memPutAddress(ret, __result ? 1L : 0L); } + public static void apiClosureRet(long ret, byte __result) { memPutAddress(ret, __result & 0xFFL); } + public static void apiClosureRet(long ret, short __result) { memPutAddress(ret, __result & 0xFFFFL); } + public static void apiClosureRet(long ret, int __result) { memPutAddress(ret, __result & 0xFFFF_FFFFL); } + public static void apiClosureRetL(long ret, long __result) { memPutLong(ret, __result); } + public static void apiClosureRetP(long ret, long __result) { memPutAddress(ret, __result); } + public static void apiClosureRet(long ret, float __result) { memPutFloat(ret, __result); } + public static void apiClosureRet(long ret, double __result) { memPutDouble(ret, __result); } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/Callback.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/Callback.java new file mode 100644 index 000000000..8e7a2cf05 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/Callback.java @@ -0,0 +1,237 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.*; +import org.lwjgl.system.libffi.*; + +import javax.annotation.*; +import java.lang.reflect.*; +import java.util.concurrent.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.jni.JNINativeInterface.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Base class for dynamically created native functions that call into Java code. + * + *

    Callback instances use native resources and must be explicitly freed when no longer used by calling the {@link #free} method.

    + */ +public abstract class Callback implements Pointer, NativeResource { + + private static final boolean DEBUG_ALLOCATOR = Configuration.DEBUG_MEMORY_ALLOCATOR.get(false); + + private static final ClosureRegistry CLOSURE_REGISTRY; + + private interface ClosureRegistry { + void put(long executableAddress, FFIClosure closure); + FFIClosure get(long executableAddress); + FFIClosure remove(long executableAddress); + } + + static { + // Detect whether we need to maintain a mapping from executable addresses to FFIClosure structs. + try (MemoryStack stack = stackPush()) { + PointerBuffer code = stack.mallocPointer(1); + + FFIClosure closure = ffi_closure_alloc(FFIClosure.SIZEOF, code); + if (closure == null) { + throw new OutOfMemoryError(); + } + + if (code.get(0) == closure.address()) { + apiLog("Closure Registry: simple"); + + // When the closure address matches the executable address, we don't have to maintain any mappings. + // We can simply cast the executable address to ffi_closure. This is true on many platforms. + CLOSURE_REGISTRY = new ClosureRegistry() { + @Override + public void put(long executableAddress, FFIClosure closure) { + // no-op + } + @Override + public FFIClosure get(long executableAddress) { + return FFIClosure.create(executableAddress); + } + @Override + public FFIClosure remove(long executableAddress) { + return get(executableAddress); + } + }; + } else { + apiLog("Closure Registry: ConcurrentHashMap"); + + CLOSURE_REGISTRY = new ClosureRegistry() { + private final ConcurrentHashMap map = new ConcurrentHashMap<>(); + + @Override + public void put(long executableAddress, FFIClosure closure) { + map.put(executableAddress, closure); + } + @Override + public FFIClosure get(long executableAddress) { + return map.get(executableAddress); + } + @Override + public FFIClosure remove(long executableAddress) { + return map.remove(executableAddress); + } + }; + } + ffi_closure_free(closure); + } + } + + /** Address of the native callback handler that will call the Java method when the native callback function is invoked. */ + private static final long CALLBACK_HANDLER; + + static { + // Setup the native callback handler. + try { + CALLBACK_HANDLER = getCallbackHandler(CallbackI.class.getDeclaredMethod("callback", long.class, long.class)); + } catch (Exception e) { + throw new IllegalStateException("Failed to initialize the native callback handler.", e); + } + + MemoryUtil.getAllocator(); + } + + private long address; + + /** + * Creates a callback instance using the specified libffi CIF. + * + * @param cif the libffi CIF + */ + protected Callback(FFICIF cif) { + this.address = create(cif, this); + } + + /** + * Creates a callback instance using the specified function address + * + * @param address the function address + */ + protected Callback(long address) { + if (CHECKS) { + check(address); + } + this.address = address; + } + + @Override + public long address() { + return address; + } + + @Override + public void free() { + free(address()); + } + + private static native long getCallbackHandler(Method callback); + + /** + * Creates a native function that delegates to the specified instance when called. + * + *

    The native function uses the default calling convention.

    + * + * @param cif the {@code libffi} CIF + * @param instance the callback instance + * + * @return the dynamically generated native function + */ + static long create(FFICIF cif, Object instance) { + FFIClosure closure; + + long executableAddress; + try (MemoryStack stack = stackPush()) { + PointerBuffer code = stack.mallocPointer(1); + + closure = ffi_closure_alloc(FFIClosure.SIZEOF, code); + if (closure == null) { + throw new OutOfMemoryError(); + } + executableAddress = code.get(0); + if (DEBUG_ALLOCATOR) { + MemoryManage.DebugAllocator.track(executableAddress, FFIClosure.SIZEOF); + } + } + + long user_data = NewGlobalRef(instance); + + int errcode = ffi_prep_closure_loc(closure, cif, CALLBACK_HANDLER, user_data, executableAddress); + if (errcode != FFI_OK) { + DeleteGlobalRef(user_data); + ffi_closure_free(closure); + throw new RuntimeException("Failed to prepare the libffi closure"); + } + + CLOSURE_REGISTRY.put(executableAddress, closure); + + return executableAddress; + } + + /** + * Converts the specified function pointer to the {@code CallbackI} instance associated with it. + * + * @param functionPointer a function pointer + * @param the {@code CallbackI} instance type + * + * @return the {@code CallbackI} instance + */ + public static T get(long functionPointer) { + return memGlobalRefToObject(CLOSURE_REGISTRY.get(functionPointer).user_data()); + } + + /** Like {@link #get}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static T getSafe(long functionPointer) { + return functionPointer == NULL ? null : get(functionPointer); + } + + /** + * Frees any resources held by the specified function pointer. + * + * @param functionPointer the function pointer + */ + public static void free(long functionPointer) { + if (DEBUG_ALLOCATOR) { + MemoryManage.DebugAllocator.untrack(functionPointer); + } + + FFIClosure closure = CLOSURE_REGISTRY.get(functionPointer); + + DeleteGlobalRef(closure.user_data()); + ffi_closure_free(closure); + } + + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Callback)) { + return false; + } + + Callback that = (Callback)o; + + return address == that.address(); + } + + public int hashCode() { + return (int)(address ^ (address >>> 32)); + } + + @Override + public String toString() { + return String.format("%s pointer [0x%X]", getClass().getSimpleName(), address); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/CallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/CallbackI.java new file mode 100644 index 000000000..040d89ff5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/CallbackI.java @@ -0,0 +1,43 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.system.libffi.*; + +/** + * Interface for dynamically created native functions that call into Java code (upcalls). + * + *

    Pointers to such functions can be passed to native APIs as callbacks.

    + */ +public interface CallbackI extends Pointer { + + /** + * Returns the libffi Call Interface for this callback function. [INTERNAL API] + * + * @return the CIF structure for this callback function + */ + FFICIF getCallInterface(); + + @Override + default long address() { + return Callback.create(getCallInterface(), this); + } + + /** + * The Java method that will be called from native code when the native callback function is invoked. + * + * @param ret a pointer to the memory used for the function's return value. + * + *

    If the function is declared as returning {@code void}, then this value is garbage and should not be used.

    + * + *

    Otherwise, the callback must fill the object to which this points, following the same special promotion behavior as + * {@link LibFFI#ffi_call}. That is, in most cases, {@code ret} points to an object of exactly the size of the type specified when {@code CIF} + * was constructed. However, integral types narrower than the system register size are widened. In these cases your program may assume that + * {@code ret} points to an {@code ffi_arg} object.

    + * @param args a vector of pointers to memory holding the arguments to the function + */ + void callback(long ret, long args); + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/CheckIntrinsics.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/CheckIntrinsics.java new file mode 100644 index 000000000..1aa3f14b9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/CheckIntrinsics.java @@ -0,0 +1,38 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +/** + * Simple index checks. + * + *

    On Java 9 these checks are replaced with the corresponding {@link java.util.Objects} methods, which perform better.

    + */ +public final class CheckIntrinsics { + + private CheckIntrinsics() { + } + + public static int checkIndex(int index, int length) { + if (index < 0 || length <= index) { + throw new IndexOutOfBoundsException(); + } + return index; + } + + public static int checkFromToIndex(int fromIndex, int toIndex, int length) { + if (fromIndex < 0 || toIndex < fromIndex || length < toIndex) { + throw new IndexOutOfBoundsException(); + } + return fromIndex; + } + + public static int checkFromIndexSize(int fromIndex, int size, int length) { + if ((length | fromIndex | size) < 0 || length - fromIndex < size) { + throw new IndexOutOfBoundsException(); + } + return fromIndex; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/Checks.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/Checks.java new file mode 100644 index 000000000..330f11685 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/Checks.java @@ -0,0 +1,552 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.*; + +import javax.annotation.*; +import java.nio.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.CheckIntrinsics.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A class to check buffer boundaries in general. If there is insufficient space in the buffer when the call is made then a buffer overflow would otherwise + * occur and cause unexpected behaviour, a crash, or worse, a security risk. + * + *

    Internal class, don't use.

    + * + * @see Configuration#DISABLE_CHECKS + * @see Configuration#DEBUG + * @see Configuration#DEBUG_FUNCTIONS + */ +public final class Checks { + + /** + * Runtime checks flag. + * + *

    When enabled, LWJGL will perform basic checks during its operation, mainly to avoid crashes in native code. Examples of such checks are: + * context-specific function address validation, buffer capacity checks, null-termination checks, etc. These checks are generally low-overhead and should + * not have a measurable effect on performance, so its recommended to have them enabled both during development and in production releases.

    + * + *

    If maximum performance is required, they can be disabled by setting {@link Configuration#DISABLE_CHECKS} to true.

    + */ + public static final boolean CHECKS = !Configuration.DISABLE_CHECKS.get(false); + + /** + * Debug mode flag. + * + *

    When enabled, LWJGL will perform additional checks during its operation. These checks are more expensive than the ones enabled with {@link #CHECKS} + * and will have a noticeable effect on performance, so they are disabled by default. Examples of such checks are: buffer object binding state check (GL), + * buffer capacity checks for texture images (GL & CL), etc. LWJGL will also print additional information, mainly during start-up.

    + * + *

    Can be enabled by setting {@link Configuration#DEBUG} to true.

    + */ + public static final boolean DEBUG = Configuration.DEBUG.get(false); + + /** + * Debug functions flag. + * + *

    When enabled, a warning message will be output to the debug stream when LWJGL fails to retrieve a function pointer.

    + * + *

    Can be enabled by setting {@link Configuration#DEBUG_FUNCTIONS} to true.

    + */ + public static final boolean DEBUG_FUNCTIONS = Configuration.DEBUG_FUNCTIONS.get(false); + + static { + if (DEBUG_FUNCTIONS && !DEBUG) { + APIUtil.DEBUG_STREAM.println("[LWJGL] The DEBUG_FUNCTIONS option requires DEBUG to produce output."); + } + } + + private Checks() { + } + + public static int lengthSafe(@Nullable short[] array) { return array == null ? 0 : array.length;} + public static int lengthSafe(@Nullable int[] array) { return array == null ? 0 : array.length;} + public static int lengthSafe(@Nullable long[] array) { return array == null ? 0 : array.length; } + public static int lengthSafe(@Nullable float[] array) { return array == null ? 0 : array.length;} + public static int lengthSafe(@Nullable double[] array) { return array == null ? 0 : array.length;} + public static int remainingSafe(@Nullable Buffer buffer) { return buffer == null ? 0 : buffer.remaining(); } + public static int remainingSafe(@Nullable CustomBuffer buffer) { return buffer == null ? 0 : buffer.remaining(); } + + /** + * Checks if any of the specified functions pointers is {@code NULL}. + * + * @param functions the function pointers to check + * + * @return true if all function pointers are valid, false otherwise. + */ + public static boolean checkFunctions(long... functions) { + for (long pointer : functions) { + if (pointer == NULL) { + return false; + } + } + return true; + } + + /** + * Checks if all functions are available in the function provider. + * + * @param provider the function address provider + * @param caps the function address buffer + * @param indices the function indices + * @param functions the function names + * + * @return true if all functions are available, false otherwise + */ + public static boolean checkFunctions(FunctionProvider provider, PointerBuffer caps, int[] indices, String... functions) { + boolean available = true; + for (int i = 0; i < indices.length; i++) { + int index = indices[i]; + if (index < 0 || caps.get(index) != NULL) { + continue; + } + long address = provider.getFunctionAddress(functions[i]); + if (address == NULL) { + available = false; + continue; + } + caps.put(index, address); + } + return available; + } + + /** + * Checks if all functions are available in the function provider. + * + * @param provider the function address provider + * @param handle the handle to a platform/device/context + * @param caps the function address buffer + * @param indices the function indices + * @param functions the function names + * + * @return true if all functions are available, false otherwise + */ + public static boolean checkFunctions(FunctionProviderLocal provider, long handle, PointerBuffer caps, int[] indices, String... functions) { + boolean available = true; + for (int i = 0; i < indices.length; i++) { + int index = indices[i]; + if (index < 0 || caps.get(index) != NULL) { + continue; + } + long address = provider.getFunctionAddress(handle, functions[i]); + if (address != NULL) { + caps.put(index, address); + continue; + } + available = false; + } + return available; + } + + /** + * Checks if all functions are available in the function provider. + * + * @param provider the function address provider + * @param caps the function address buffer + * @param indices the function indices + * @param functions the function names + * + * @return true if all functions are available, false otherwise + */ + public static boolean checkFunctions(FunctionProvider provider, long[] caps, int[] indices, String... functions) { + boolean available = true; + for (int i = 0; i < indices.length; i++) { + int index = indices[i]; + if (index < 0 || caps[index] != NULL) { + continue; + } + long address = provider.getFunctionAddress(functions[i]); + if (address == NULL) { + available = false; + continue; + } + caps[index] = address; + } + return available; + } + + public static boolean reportMissing(String api, String extension) { + apiLog("[" + api + "] " + extension + " was reported as available but an entry point is missing."); + return false; + } + + /** + * Ensures that the specified pointer is not {@code NULL} (0L). + * + * @param pointer the pointer to check + * + * @throws NullPointerException if {@code pointer} is {@code NULL} + */ + public static long check(long pointer) { + if (pointer == NULL) { + throw new NullPointerException(); + } + + return pointer; + } + + private static void assertNT(boolean found) { + if (!found) { + throw new IllegalArgumentException("Missing termination"); + } + } + + /** Ensures that the specified array is null-terminated. */ + public static void checkNT(int[] buf) { + checkBuffer(buf.length, 1); + assertNT(buf[buf.length - 1] == 0); + } + + /** Ensures that the specified array is terminated with the specified terminator. */ + public static void checkNT(int[] buf, int terminator) { + checkBuffer(buf.length, 1); + assertNT(buf[buf.length - 1] == terminator); + } + + /** Ensures that the specified array is null-terminated. */ + public static void checkNT(long[] buf) { + checkBuffer(buf.length, 1); + assertNT(buf[buf.length - 1] == NULL); + } + + /** Ensures that the specified array is null-terminated. */ + public static void checkNT(float[] buf) { + checkBuffer(buf.length, 1); + assertNT(buf[buf.length - 1] == 0.0f); + } + + /** Ensures that the specified ByteBuffer is null-terminated (last byte equal to 0). */ + public static void checkNT1(ByteBuffer buf) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == 0); + } + + /** Ensures that the specified ByteBuffer is null-terminated (last 2 bytes equal to 0). */ + public static void checkNT2(ByteBuffer buf) { + checkBuffer(buf.remaining(), 2); + assertNT(buf.get(buf.limit() - 2) == 0); + } + + /** Ensures that the specified IntBuffer is null-terminated. */ + public static void checkNT(IntBuffer buf) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == 0); + } + + /** Ensures that the specified IntBuffer is terminated with the specified terminator. */ + public static void checkNT(IntBuffer buf, int terminator) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == terminator); + } + + /** Ensures that the specified LongBuffer is null-terminated. */ + public static void checkNT(LongBuffer buf) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == NULL); + } + + /** Ensures that the specified FloatBuffer is null-terminated. */ + public static void checkNT(FloatBuffer buf) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == 0.0f); + } + + /** Ensures that the specified PointerBuffer is null-terminated. */ + public static void checkNT(PointerBuffer buf) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == NULL); + } + + /** Ensures that the specified PointerBuffer is terminated with the specified terminator. */ + public static void checkNT(PointerBuffer buf, long terminator) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == terminator); + } + + public static void checkNTSafe(@Nullable int[] buf) { + if (buf != null) { + checkBuffer(buf.length, 1); + assertNT(buf[buf.length - 1] == 0); + } + } + public static void checkNTSafe(@Nullable int[] buf, int terminator) { + if (buf != null) { + checkBuffer(buf.length, 1); + assertNT(buf[buf.length - 1] == terminator); + } + } + public static void checkNTSafe(@Nullable long[] buf) { + if (buf != null) { + checkBuffer(buf.length, 1); + assertNT(buf[buf.length - 1] == NULL); + } + } + public static void checkNTSafe(@Nullable float[] buf) { + if (buf != null) { + checkBuffer(buf.length, 1); + assertNT(buf[buf.length - 1] == 0.0f); + } + } + public static void checkNT1Safe(@Nullable ByteBuffer buf) { + if (buf != null) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == 0); + } + } + public static void checkNT2Safe(@Nullable ByteBuffer buf) { + if (buf != null) { + checkBuffer(buf.remaining(), 2); + assertNT(buf.get(buf.limit() - 2) == 0); + } + } + public static void checkNTSafe(@Nullable IntBuffer buf) { + if (buf != null) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == 0); + } + } + public static void checkNTSafe(@Nullable IntBuffer buf, int terminator) { + if (buf != null) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == terminator); + } + } + public static void checkNTSafe(@Nullable LongBuffer buf) { + if (buf != null) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == NULL); + } + } + public static void checkNTSafe(@Nullable FloatBuffer buf) { + if (buf != null) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == 0.0f); + } + } + public static void checkNTSafe(@Nullable PointerBuffer buf) { + if (buf != null) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == NULL); + } + } + public static void checkNTSafe(@Nullable PointerBuffer buf, long terminator) { + if (buf != null) { + checkBuffer(buf.remaining(), 1); + assertNT(buf.get(buf.limit() - 1) == terminator); + } + } + + private static void checkBuffer(int bufferSize, int minimumSize) { + if (bufferSize < minimumSize) { + throwIAE(bufferSize, minimumSize); + } + } + + /** + * Helper method to ensure a array has enough capacity. + * + * @param buf the array to check + * @param size the minimum array capacity + * + * @throws IllegalArgumentException if {@code buf.length < size} + */ + public static void check(byte[] buf, int size) { + checkBuffer(buf.length, size); + } + + /** + * Helper method to ensure a array has enough capacity. + * + * @param buf the array to check + * @param size the minimum array capacity + * + * @throws IllegalArgumentException if {@code buf.length < size} + */ + public static void check(short[] buf, int size) { + checkBuffer(buf.length, size); + } + + /** + * Helper method to ensure a array has enough capacity. + * + * @param buf the array to check + * @param size the minimum array capacity + * + * @throws IllegalArgumentException if {@code buf.length < size} + */ + public static void check(int[] buf, int size) { + checkBuffer(buf.length, size); + } + + /** + * Helper method to ensure a array has enough capacity. + * + * @param buf the array to check + * @param size the minimum array capacity + * + * @throws IllegalArgumentException if {@code buf.length < size} + */ + public static void check(long[] buf, int size) { + checkBuffer(buf.length, size); + } + + /** + * Helper method to ensure a array has enough capacity. + * + * @param buf the array to check + * @param size the minimum array capacity + * + * @throws IllegalArgumentException if {@code buf.length < size} + */ + public static void check(float[] buf, int size) { + checkBuffer(buf.length, size); + } + + /** + * Helper method to ensure a array has enough capacity. + * + * @param buf the array to check + * @param size the minimum array capacity + * + * @throws IllegalArgumentException if {@code buf.length < size} + */ + public static void check(double[] buf, int size) { + checkBuffer(buf.length, size); + } + + /** + * Helper method to ensure a CharSequence has enough characters. + * + * @param text the text to check + * @param size the minimum number of characters + * + * @throws IllegalArgumentException if {@code text.length() < size} + */ + public static void check(CharSequence text, int size) { + checkBuffer(text.length(), size); + } + + /** + * Helper method to ensure a buffer has enough capacity. + * + * @param buf the buffer to check + * @param size the minimum buffer capacity + * + * @throws IllegalArgumentException if {@code buf.remaining() < size} + */ + public static void check(Buffer buf, int size) { + checkBuffer(buf.remaining(), size); + } + + /** @see #check(Buffer, int) */ + public static void check(Buffer buf, long size) { + checkBuffer(buf.remaining(), (int)size); + } + + /** + * Helper method to ensure a {@link CustomBuffer} has enough capacity. + * + * @param buf the buffer to check + * @param size the minimum buffer capacity + * + * @throws IllegalArgumentException if {@code buf.remaining() < size} + */ + public static void check(CustomBuffer buf, int size) { + checkBuffer(buf.remaining(), size); + } + + /** @see #check(CustomBuffer, int) */ + public static void check(CustomBuffer buf, long size) { + checkBuffer(buf.remaining(), (int)size); + } + + public static void checkSafe(@Nullable short[] buf, int size) { + if (buf != null) { + checkBuffer(buf.length, size); + } + } + public static void checkSafe(@Nullable int[] buf, int size) { + if (buf != null) { + checkBuffer(buf.length, size); + } + } + public static void checkSafe(@Nullable long[] buf, int size) { + if (buf != null) { + checkBuffer(buf.length, size); + } + } + public static void checkSafe(@Nullable float[] buf, int size) { + if (buf != null) { + checkBuffer(buf.length, size); + } + } + public static void checkSafe(@Nullable double[] buf, int size) { + if (buf != null) { + checkBuffer(buf.length, size); + } + } + public static void checkSafe(@Nullable Buffer buf, int size) { + if (buf != null) { + checkBuffer(buf.remaining(), size); + } + } + public static void checkSafe(@Nullable Buffer buf, long size) { + if (buf != null) { + checkBuffer(buf.remaining(), (int)size); + } + } + public static void checkSafe(@Nullable CustomBuffer buf, int size) { + if (buf != null) { + checkBuffer(buf.remaining(), size); + } + } + public static void checkSafe(@Nullable CustomBuffer buf, long size) { + if (buf != null) { + checkBuffer(buf.remaining(), (int)size); + } + } + + public static void check(Object[] array, int size) { + checkBuffer(array.length, size); + } + + private static void checkBufferGT(int bufferSize, int maximumSize) { + if (maximumSize < bufferSize) { + throwIAEGT(bufferSize, maximumSize); + } + } + + public static void checkGT(Buffer buf, int size) { + checkBufferGT(buf.remaining(), size); + } + + public static void checkGT(CustomBuffer buf, int size) { + checkBufferGT(buf.remaining(), size); + } + + public static long check(int index, int length) { + if (CHECKS) { + checkIndex(index, length); + } + // Convert to long to support addressing up to 2^31-1 elements, regardless of sizeof(element). + // The unsigned conversion helps the JIT produce code that is as fast as if int was returned. + return Integer.toUnsignedLong(index); + } + + // Separate calls to help inline check. + + private static void throwIAE(int bufferSize, int minimumSize) { + throw new IllegalArgumentException("Number of remaining elements is " + bufferSize + ", must be at least " + minimumSize); + } + + private static void throwIAEGT(int bufferSize, int maximumSize) { + throw new IllegalArgumentException("Number of remaining buffer elements is " + bufferSize + ", must be at most " + maximumSize); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/Configuration.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/Configuration.java new file mode 100644 index 000000000..7e36d6105 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/Configuration.java @@ -0,0 +1,723 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.system.MemoryUtil.*; + +import javax.annotation.*; +import java.io.*; +import java.util.function.*; + +/** + * This class can be used to programmatically set the LWJGL runtime configuration. It is an alternative to using system properties. + * + *

    Care must be taken when setting static options. Such options are only read once or cached in {@code static final} fields. They must be + * configured through this class before touching any other LWJGL class.

    + */ +public class Configuration { + + /** + * Takes priority over {@code java.library.path}. + * + *

    It may contain one or more directory paths, separated by {@link File#pathSeparator}.

    + * + *

    + * Property: org.lwjgl.librarypath
    + *    Usage: Dynamic
    + */ + public static final Configuration LIBRARY_PATH = new Configuration<>("org.lwjgl.librarypath", StateInit.STRING); + + /** + * Sets the mapping algorithm used to resolve the name of bundled shared libraries. + * + *

    Supported values:

    + *
      + *
    • default - Maps {@code } to {@code }.
    • + *
    • legacy - Maps {@code } to {@code is64bit(arch) ? : 32}.
    • + *
    • <classpath> - A class that implements the {@link Function Function<String, String>} interface. It will be instantiated using reflection.
    • + *
    + * + *

    When set programmatically, it can also be a {@link Function Function<String, String>} instance.

    + * + *

    + * Property: org.lwjgl.system.bundledLibrary.nameMapper
    + *     Type: String or a {@link Function Function<String, String>} instance
    + *    Usage: Static

    + */ + public static final Configuration BUNDLED_LIBRARY_NAME_MAPPER = + new Configuration<>("org.lwjgl.system.bundledLibrary.nameMapper", StateInit.STRING); + + /** + * Sets the mapping algorithm used to resolve bundled shared libraries in the classpath/modulepath. + * + *

    Supported values:

    + *
      + *
    • default - Maps {@code } to {@code /}.
    • + *
    • legacy - Maps {@code } to {@code }.
    • + *
    • <classpath> - A class that implements the {@link Function Function<String, String>} interface. It will be instantiated using reflection.
    • + *
    + * + *

    When set programmatically, it can also be a {@link Function Function<String, String>} instance.

    + * + *

    + * Property: org.lwjgl.system.bundledLibrary.nameMapper
    + *     Type: String or a {@link Function Function<String, String>} instance
    + *    Usage: Static

    + */ + public static final Configuration BUNDLED_LIBRARY_PATH_MAPPER = + new Configuration<>("org.lwjgl.system.bundledLibrary.pathMapper", StateInit.STRING); + + /** + * Changes the temporary directory name created by LWJGL when extracting shared libraries from JAR files. + * + *

    If this option is not set, it defaults to lwjgl_<user name>.

    + * + *

    + * Property: org.lwjgl.system.SharedLibraryExtractDirectory
    + *    Usage: Dynamic
    + */ + public static final Configuration SHARED_LIBRARY_EXTRACT_DIRECTORY = new Configuration<>( + "org.lwjgl.system.SharedLibraryExtractDirectory", + StateInit.STRING + ); + + /** + * Changes the path where LWJGL extracts shared libraries from JAR files. + * + *

    If this option is not set, LWJGL will try the following paths and the first successful will be used:

    + *
      + *
    • {@code System.getProperty("java.io.tmpdir")}/extractDir/version/arch/
    • + *
    • <working directory>/.extractDir/version/arch/
    • + *
    • {@code System.getProperty("user.home")}/.extractDir/version/arch/
    • + *
    • {@code Files.createTempDirectory("lwjgl", "")}
    • + *
    + * + * where: + * + *
    
    +     * extractDir = Configuration.SHARED_LIBRARY_EXTRACT_DIRECTORY
    +     * version = Version.getVersion().replace(' ', '-')
    +     * 
    + * + *

    + * Property: org.lwjgl.system.SharedLibraryExtractPath
    + *    Usage: Dynamic

    + */ + public static final Configuration SHARED_LIBRARY_EXTRACT_PATH = new Configuration<>( + "org.lwjgl.system.SharedLibraryExtractPath", + StateInit.STRING + ); + + /** + * When enabled, shared libraries found as regular files (not inside a JAR file) in the classpath will first be copied to the + * {@link #SHARED_LIBRARY_EXTRACT_PATH}, then loaded from there. + * + *

    + * Property: org.lwjgl.system.SharedLibraryExtractForce
    + *    Usage: Dynamic

    + */ + public static final Configuration SHARED_LIBRARY_EXTRACT_FORCE = new Configuration<>( + "org.lwjgl.system.SharedLibraryExtractForce", + StateInit.BOOLEAN + ); + + /** + * EXPERIMENTAL: Emulates {@link System#loadLibrary} behavior in {@link Library#loadNative(Class, String, String, boolean) Library.loadNative}. + * + *

    + * Property: org.lwjgl.system.EmulateSystemLoadLibrary
    + *    Usage: Dynamic

    + */ + public static final Configuration EMULATE_SYSTEM_LOADLIBRARY = new Configuration<>( + "org.lwjgl.system.EmulateSystemLoadLibrary", + StateInit.BOOLEAN + ); + + /** + * Can be used to override the LWJGL library name. + * + *

    It can be an absolute path.

    + * + *

    + * Property: org.lwjgl.libname
    + *    Usage: Dynamic

    + */ + public static final Configuration LIBRARY_NAME = new Configuration<>("org.lwjgl.libname", StateInit.STRING); + + /** + * Sets the allocator used for the {@link MemoryUtil} explicit memory management API + * ({@link MemoryUtil#memAlloc memAlloc}/{@link MemoryUtil#memFree memFree}/etc). + * + *

    Supported values:

    + *
      + *
    • jemalloc - The allocator provided by the jemalloc library.
    • + *
    • rpmalloc - The allocator provided by the rpmalloc library.
      + *

      LWJGL calls {@code rpmalloc_initialize} once, when the allocator is + * created. It never calls {@code rpmalloc_finalize}. The user is responsible for calling {@code rpmalloc_thread_initialize} and + * {@code rpmalloc_thread_finalize} when appropriate.

    • + *
    • system - The default system memory allocator
    • + *
    • <classpath> - A class that implements the {@link MemoryAllocator MemoryAllocator} interface. It will be instantiated using reflection.
    • + *
    + * + *

    When set programmatically, it can also be a {@link MemoryAllocator MemoryAllocator} instance.

    + * + *

    + * Property: org.lwjgl.system.allocator
    + *     Type: String or a {@link MemoryAllocator} instance
    + *    Usage: Static

    + */ + public static final Configuration MEMORY_ALLOCATOR = new Configuration<>("org.lwjgl.system.allocator", StateInit.STRING); + + /** + * Sets the stack size, in kilobytes, that will be used in the default {@link MemoryStack} constructor. + * + *

    This value is also used for the LWJGL-managed, thread-local, {@link MemoryStack} instances. If this option is not set, it defaults to 64.

    + * + *

    + * Property: org.lwjgl.system.stackSize
    + *    Usage: Static

    + */ + public static final Configuration STACK_SIZE = new Configuration<>("org.lwjgl.system.stackSize", StateInit.INT); + + /** + * Sets the size of arrays cached in thread-local storage to minimize allocations while decoding text. + * + *

    The memory cost for the cache is up to two arrays per thread that does text decoding. When the text length is up to this value, a cached array will + * be used. When the text length is longer than this value, a new array buffer will be allocated.

    + * + *

    If this option is not set, it defaults to 8192. Setting the value to 0 will disable the array cache.

    + * + *

    + * Property: org.lwjgl.system.arrayTLCSize
    + *    Usage: Static

    + */ + public static final Configuration ARRAY_TLC_SIZE = new Configuration<>("org.lwjgl.system.arrayTLCSize", StateInit.INT); + + /** + * Overrides the number of functions in the {@code JNINativeInterface_} struct. + * + *

    This is only necessary when LWJGL runs on a JVM with a newer, unsupported JNI version, that has introduced new JNI functions. The function count + * must be accurate in order to use the OpenGL, OpenGL ES, or OpenAL bindings.

    + * + *

    The currently known values are:

    + *
      + *
    • 229 for Java 8
    • + *
    • 230 for Java 9 to Java 18
    • + *
    • 231 for Java 19 or higher
    • + *
    + * + *

    + * Property: org.lwjgl.system.JNINativeInterfaceSize
    + *    Usage: Static

    + */ + public static final Configuration JNI_NATIVE_INTERFACE_FUNCTION_COUNT = new Configuration<>("org.lwjgl.system.JNINativeInterfaceSize", StateInit.INT); + + /** + * Set to true to disable LWJGL's basic checks. + * + *

    These are trivial checks that LWJGL performs to avoid JVM crashes, very useful during development. Their performance impact is usually minimal, but + * they may be disabled for release builds.

    + * + *

    + * Property: org.lwjgl.util.NoChecks
    + *    Usage: Static

    + */ + public static final Configuration DISABLE_CHECKS = new Configuration<>("org.lwjgl.util.NoChecks", StateInit.BOOLEAN); + + /** + * Set to true to disable LWJGL's function lookup checks. + * + *

    These checks ensure that required functions are not missing from dynamically loaded shared libraries. This setting is useful when a trusted + * incompatible library must be loaded.

    + * + *

    + * Property: org.lwjgl.util.NoFunctionChecks
    + *    Usage: Dynamic

    + */ + public static final Configuration DISABLE_FUNCTION_CHECKS = new Configuration<>("org.lwjgl.util.NoFunctionChecks", StateInit.BOOLEAN); + + /** + * Set to true to enable LWJGL's debug mode. + * + *

    Information messages will be printed to the {@link APIUtil#DEBUG_STREAM} and extra runtime checks will be performed (some potentially expensive, + * performance-wise).

    + * + *

    + * Property: org.lwjgl.util.Debug
    + *    Usage: Static

    + */ + public static final Configuration DEBUG = new Configuration<>("org.lwjgl.util.Debug", StateInit.BOOLEAN); + + /** + * When enabled, {@code SharedLibraryLoader} exceptions will be printed to the {@link #DEBUG_STREAM}. + * + *

    This option requires {@link #DEBUG} to be enabled.

    + * + *

    + * Property: org.lwjgl.util.DebugLoader
    + *    Usage: Static

    + */ + public static final Configuration DEBUG_LOADER = new Configuration<>("org.lwjgl.util.DebugLoader", StateInit.BOOLEAN); + + /** + * Can be set to override the default {@link APIUtil#DEBUG_STREAM}. + * + *

    It must be the name of a class that implements the {@link Supplier Supplier<PrintStream>} interface. The class will be instantiated using + * reflection and the result of {@link Supplier#get get} will become the {@code #DEBUG_STREAM} used by LWJGL.

    + * + *

    When set programmatically, it can also be a {@link PrintStream} instance.

    + * + *

    + * Property: org.lwjgl.util.DebugStream
    + *     Type: String or a {@link PrintStream} instance
    + *    Usage: Static

    + */ + public static final Configuration DEBUG_STREAM = new Configuration<>("org.lwjgl.util.DebugStream", StateInit.STRING); + + /** + * Set to true to enable LWJGL's debug mode for the {@link MemoryUtil} explicit memory management API + * ({@link MemoryUtil#memAlloc memAlloc}/{@link MemoryUtil#memFree memFree}/etc). + * + *

    All memory allocations through that API will be tracked and leaks will be reported on JVM exit. The {@code memReport} methods can also be used.

    + * + *

    When this option is enabled, a stacktrace is generated on every allocation, which may negatively impact performance. If this becomes a serious issue, + * the JVM option {@code -XX:MaxJavaStackTraceDepth=d} (where {@code d >= 6}) can be used to reduce the overhead.

    + * + *

    + * Property: org.lwjgl.util.DebugAllocator
    + *    Usage: Static

    + */ + public static final Configuration DEBUG_MEMORY_ALLOCATOR = new Configuration<>("org.lwjgl.util.DebugAllocator", StateInit.BOOLEAN); + + /** + * Set to false to disable tracking of internal memory allocations, in native shared libraries that have been set up to use the LWJGL memory allocator. + * + *

    If this option is not set, it defaults to true.

    + * + *

    + * Property: org.lwjgl.util.DebugAllocator.internal
    + *    Usage: Static

    + */ + public static final Configuration DEBUG_MEMORY_ALLOCATOR_INTERNAL = new Configuration<>("org.lwjgl.util.DebugAllocator.internal", StateInit.BOOLEAN); + + /** + * Set to true to skip stacktrace generation on each tracked allocation. + * + *

    When enabled, this option dramatically reduces the performance overhead of memory leak detection. After a leak is detected, disable this option and + * rerun the application to get the offending allocation's stacktrace.

    + * + *

    This option can also be dynamically toggled on and off, to limit the performance impact in specific portions of the application that are prime + * suspects for memory leaks.

    + * + *

    When reporting memory allocation aggregates, with + * {@link MemoryUtil#memReport(MemoryAllocationReport, MemoryAllocationReport.Aggregate, boolean) memReport} and the options + * {@link MemoryAllocationReport.Aggregate#GROUP_BY_METHOD GROUP_BY_METHOD} or + * {@link MemoryAllocationReport.Aggregate#GROUP_BY_STACKTRACE GROUP_BY_STACKTRACE}, memory allocations without an associated stacktrace will not be + * included.

    + * + *

    + * Property: org.lwjgl.util.DebugAllocator.fast
    + *    Usage: Dynamic

    + */ + public static final Configuration DEBUG_MEMORY_ALLOCATOR_FAST = new Configuration<>("org.lwjgl.util.DebugAllocator.fast", StateInit.BOOLEAN); + + /** + * Set to true to enable LWJGL's debug mode for the {@link MemoryStack}. + * + *

    When using the stack, each frame should be popped in the same method that pushed it. If this symmetry is broken, this mode will report it + * immediately.

    + * + *

    When this option is enabled, a stacktrace is generated on every push or pop to the stack, which may negatively impact performance. If this becomes a + * serious issue, the JVM option {@code -XX:MaxJavaStackTraceDepth=d} (where {@code d >= 5}) can be used to reduce the overhead.

    + * + *

    + * Property: org.lwjgl.util.DebugStack
    + *    Usage: Static

    + */ + public static final Configuration DEBUG_STACK = new Configuration<>("org.lwjgl.util.DebugStack", StateInit.BOOLEAN); + + /** + * When enabled, a warning message will be output to {@link #DEBUG_STREAM} when LWJGL fails to retrieve a function pointer. + * + *

    This option may generate a lot of output and false negatives for functions in unused classes.

    + * + *

    This option requires {@link #DEBUG} to be enabled.

    + * + *

    + * Property: org.lwjgl.util.DebugFunctions
    + *    Usage: Static

    + */ + public static final Configuration DEBUG_FUNCTIONS = new Configuration<>("org.lwjgl.util.DebugFunctions", StateInit.BOOLEAN); + + // -- ASSIMP + + /** Similar to {@link #LIBRARY_NAME} for the AssImp library (org.lwjgl.assimp.libname). */ + public static final Configuration ASSIMP_LIBRARY_NAME = new Configuration<>("org.lwjgl.assimp.libname", StateInit.STRING); + + /** Similar to {@link #LIBRARY_NAME} for the Draco library (org.lwjgl.assimp.draco.libname). */ + public static final Configuration ASSIMP_DRACO_LIBRARY_NAME = new Configuration<>("org.lwjgl.assimp.draco.libname", StateInit.STRING); + + // -- BGFX + + /** Similar to {@link #LIBRARY_NAME} for the BGFX library (org.lwjgl.bgfx.libname). */ + public static final Configuration BGFX_LIBRARY_NAME = new Configuration<>("org.lwjgl.bgfx.libname", StateInit.STRING); + + // -- CUDA + + /** Similar to {@link #LIBRARY_NAME} for the CUDA Driver library – nvcuda (org.lwjgl.cuda.libname). */ + public static final Configuration CUDA_LIBRARY_NAME = new Configuration<>("org.lwjgl.cuda.libname", StateInit.STRING); + + /** + * This option can be used to force a specific CUDA Toolkit version. + * + *

    By default, when LWJGL detects multiple CUDA Toolkits, it will use the toolkit with the greatest version.

    + * + *

    + * Property: org.lwjgl.cuda.toolkit.version
    + *    Usage: Static

    + */ + public static final Configuration CUDA_TOOLKIT_VERSION = new Configuration<>("org.lwjgl.cuda.toolkit.version", StateInit.STRING); + + /** + * This option can be used to load toolkit libraries from a non-standard installation folder. + * + *

    By default, LWJGL will try to detect CUDA Toolkits in the default installation folder.

    + * + *

    + * Property: org.lwjgl.cuda.toolkit.path
    + *    Usage: Static

    + */ + public static final Configuration CUDA_TOOLKIT_PATH = new Configuration<>("org.lwjgl.cuda.toolkit.path", StateInit.STRING); + + /** Similar to {@link #LIBRARY_NAME} for the CUDA NVRTC library (org.lwjgl.cuda.nvrtc.libname). */ + public static final Configuration CUDA_NVRTC_LIBRARY_NAME = new Configuration<>("org.lwjgl.cuda.nvrtc.libname", StateInit.STRING); + + /** Similar to {@link #LIBRARY_NAME} for the CUDA NVRTC Builtins library (org.lwjgl.cuda.nvrtc-builtins.libname). */ + public static final Configuration CUDA_NVRTC_BUILTINS_LIBRARY_NAME = new Configuration<>("org.lwjgl.cuda.nvrtc-builtins.libname", StateInit.STRING); + + /** + * To enable per-thread synchronization, set this option to {@code true} before initializing the CUDA driver. + * + *

    By default, CUDA uses the legacy default stream. To check if the CUDA driver supports PTDS, call + * {@code org.lwjgl.cuda.CUDA.isPerThreadDefaultStreamSupported()}

    + * + *

    + * Property: org.lwjgl.cuda.ptds
    + *    Usage: Static

    + */ + public static final Configuration CUDA_API_PER_THREAD_DEFAULT_STREAM = new Configuration<>("org.lwjgl.cuda.ptds", StateInit.BOOLEAN); + + // -- EGL + + /** + * Set this property to false to disable automatic initialization of the EGL library. + * + *

    By default, LWJGL will automatically initialize the EGL library when it is first accessed.

    + * + *

    + * Property: org.lwjgl.egl.explicitInit
    + *    Usage: Static

    + */ + public static final Configuration EGL_EXPLICIT_INIT = new Configuration<>("org.lwjgl.egl.explicitInit", StateInit.BOOLEAN); + + /** Similar to {@link #LIBRARY_NAME} for the EGL library (org.lwjgl.egl.libname). */ + public static final Configuration EGL_LIBRARY_NAME = new Configuration<>("org.lwjgl.egl.libname", StateInit.STRING); + + /** Similar to {@link #OPENGL_EXTENSION_FILTER} for the EGL library (org.lwjgl.egl.extensionFilter). */ + public static final Configuration EGL_EXTENSION_FILTER = new Configuration<>("org.lwjgl.egl.extensionFilter", StateInit.STRING); + + // -- FMOD + + /** Similar to {@link #LIBRARY_NAME} for the FMOD Core library (org.lwjgl.fmod.libname). */ + public static final Configuration FMOD_LIBRARY_NAME = new Configuration<>("org.lwjgl.fmod.libname", StateInit.STRING); + + /** Similar to {@link #LIBRARY_NAME} for the FMOD Studio library (org.lwjgl.fmod.studio.libname). */ + public static final Configuration FMOD_STUDIO_LIBRARY_NAME = new Configuration<>("org.lwjgl.fmod.studio.libname", StateInit.STRING); + + /** Similar to {@link #LIBRARY_NAME} for the FMOD FSBank library (org.lwjgl.fmod.fsbank.libname). */ + public static final Configuration FMOD_FSBANK_LIBRARY_NAME = new Configuration<>("org.lwjgl.fmod.fsbank.libname", StateInit.STRING); + + // -- FREETYPE + /** Similar to {@link #LIBRARY_NAME} for the FreeType library (org.lwjgl.freetype.libname). */ + public static final Configuration FREETYPE_LIBRARY_NAME = new Configuration<>("org.lwjgl.freetype.libname", StateInit.STRING); + + // -- GLFW + + /** Similar to {@link #LIBRARY_NAME} for the GLFW library (org.lwjgl.glfw.libname). */ + public static final Configuration GLFW_LIBRARY_NAME = new Configuration<>("org.lwjgl.glfw.libname", StateInit.STRING); + + /** + * macOS only: Set this property to false to disable first thread detection on {@code glfwInit}. + * + *

    By default, LWJGL will check if {@code glfwInit} is called on the first thread of the process. If not, an {@link IllegalStateException} will be + * thrown.

    + * + *

    The JVM can be launched with {@code -XstartOnFirstThread} to make the main thread the first thread of the process.

    + * + *

    + * Property: org.lwjgl.glfw.checkThread0
    + *    Usage: Dynamic

    + */ + public static final Configuration GLFW_CHECK_THREAD0 = new Configuration<>("org.lwjgl.glfw.checkThread0", StateInit.BOOLEAN); + + // -- HARFBUZZ + + /** + * Similar to {@link #LIBRARY_NAME} for the HarfBuzz library (org.lwjgl.harfbuzz.libname). + * + *

    The default LWJGL HarfBuzz build does not include FreeType support and the {@code hb_ft_*} functions will not be available. However, LWJGL's FreeType + * build includes HarfBuzz and exports its full API. When working with both HarfBuzz and FreeType, the HarfBuzz bindings can be made to use FreeType's + * shared library, with one of the following ways:

    + * + *
      + *
    • launch the JVM with {@code -Dorg.lwjgl.harfbuzz.libname=freetype}
    • + *
    • run {@code Configuration.HARFBUZZ_LIBRARY_NAME.set("freetype")}
    • + *
    • run {@code Configuration.HARFBUZZ_LIBRARY_NAME.set(FreeType.getLibrary())} - recommended
    • + *
    + * + *

    The {@code org.lwjgl.harfbuzz.natives} module is not necessary when enabling the above.

    + * + *

    + * Property: org.lwjgl.harfbuzz.libname
    + *     Type: String or a {@link SharedLibrary} instance
    + *    Usage: Dynamic

    + */ + public static final Configuration HARFBUZZ_LIBRARY_NAME = new Configuration<>("org.lwjgl.harfbuzz.libname", StateInit.STRING); + + // -- HWLOC + + /** Similar to {@link #LIBRARY_NAME} for the hwloc library (org.lwjgl.hwloc.libname). */ + public static final Configuration HWLOC_LIBRARY_NAME = new Configuration<>("org.lwjgl.hwloc.libname", StateInit.STRING); + + // -- JAWT + + /** Similar to {@link #LIBRARY_NAME} for the jawt library (org.lwjgl.system.jawt.libname). */ + public static final Configuration JAWT_LIBRARY_NAME = new Configuration<>("org.lwjgl.system.jawt.libname", StateInit.STRING); + + // -- JEMALLOC + + /** Similar to {@link #LIBRARY_NAME} for the jemalloc library (org.lwjgl.system.jemalloc.libname). */ + public static final Configuration JEMALLOC_LIBRARY_NAME = new Configuration<>("org.lwjgl.system.jemalloc.libname", StateInit.STRING); + + // -- KTX + + /** Similar to {@link #LIBRARY_NAME} for the KTX library (org.lwjgl.ktx.libname). */ + public static final Configuration KTX_LIBRARY_NAME = new Configuration<>("org.lwjgl.ktx.libname", StateInit.STRING); + + // -- LLVM + + /** Similar to {@link #LIBRARY_NAME} for the LLVM library (org.lwjgl.llvm.libname). */ + public static final Configuration LLVM_LIBRARY_NAME = new Configuration<>("org.lwjgl.llvm.libname", StateInit.STRING); + + /** Similar to {@link #LIBRARY_NAME} for the LLVM/Clang Library (org.lwjgl.llvm.clang.libname). */ + public static final Configuration LLVM_CLANG_LIBRARY_NAME = new Configuration<>("org.lwjgl.llvm.clang.libname", StateInit.STRING); + + /** Similar to {@link #LIBRARY_NAME} for the LLVM/LTO library (org.lwjgl.llvm.clang.libname). */ + public static final Configuration LLVM_LTO_LIBRARY_NAME = new Configuration<>("org.lwjgl.llvm.lto.libname", StateInit.STRING); + + // -- NativeFileDialog + /** + * Set to true to enable NativeFileDialog's XDG Desktop Portal backend on Linux. + * + *

    + * Property: org.lwjgl.nfd.linux.portal
    + *    Usage: Static

    + */ + public static final Configuration NFD_LINUX_PORTAL = new Configuration<>("org.lwjgl.nfd.linux.portal", StateInit.BOOLEAN); + + // -- ODBC + + /** Similar to {@link #LIBRARY_NAME} for the ODBC library (org.lwjgl.odbc.libname). */ + public static final Configuration ODBC_LIBRARY_NAME = new Configuration<>("org.lwjgl.odbc.libname", StateInit.STRING); + + // -- OPENAL + + /** Similar to {@link #EGL_EXPLICIT_INIT} for the OpenAL library (org.lwjgl.openal.explicitInit). */ + public static final Configuration OPENAL_EXPLICIT_INIT = new Configuration<>("org.lwjgl.openal.explicitInit", StateInit.BOOLEAN); + + /** Similar to {@link #LIBRARY_NAME} for the OpenAL library (org.lwjgl.openal.libname). */ + public static final Configuration OPENAL_LIBRARY_NAME = new Configuration<>("org.lwjgl.openal.libname", StateInit.STRING); + + /** Similar to {@link #OPENGL_EXTENSION_FILTER} for the OpenAL library (org.lwjgl.openal.extensionFilter). */ + public static final Configuration OPENAL_EXTENSION_FILTER = new Configuration<>("org.lwjgl.openal.extensionFilter", StateInit.STRING); + + // -- OPENCL + + /** Similar to {@link #EGL_EXPLICIT_INIT} for the OpenCL library (org.lwjgl.opencl.explicitInit). */ + public static final Configuration OPENCL_EXPLICIT_INIT = new Configuration<>("org.lwjgl.opencl.explicitInit", StateInit.BOOLEAN); + + /** Similar to {@link #LIBRARY_NAME} for the OpenCL library (org.lwjgl.opencl.libname). */ + public static final Configuration OPENCL_LIBRARY_NAME = new Configuration<>("org.lwjgl.opencl.libname", StateInit.STRING); + + /** Similar to {@link #OPENGL_EXTENSION_FILTER} for the OpenCL library (org.lwjgl.opencl.extensionFilter). */ + public static final Configuration OPENCL_EXTENSION_FILTER = new Configuration<>("org.lwjgl.opencl.extensionFilter", StateInit.STRING); + + // -- OPENGL + + /** Similar to {@link #EGL_EXPLICIT_INIT} for the OpenGL library (org.lwjgl.opengl.explicitInit). */ + public static final Configuration OPENGL_EXPLICIT_INIT = new Configuration<>("org.lwjgl.opengl.explicitInit", StateInit.BOOLEAN); + + /** Similar to {@link #LIBRARY_NAME} for the OpenGL library (org.lwjgl.opengl.libname). */ + public static final Configuration OPENGL_LIBRARY_NAME = new Configuration<>("org.lwjgl.opengl.libname", StateInit.STRING); + + /** + * Can be used to limit the maximum available OpenGL version. + * + *

    This can be useful to ensure that an application has not accidentally used features only available in a higher OpenGL version. When set + * programmatically, it can also be an {@link APIUtil.APIVersion} instance.

    + * + *

    + * Property: org.lwjgl.opengl.maxVersion
    + *     Type: String (M.n) or an {@link APIUtil.APIVersion} instance
    + *    Usage: Static

    + */ + public static final Configuration OPENGL_MAXVERSION = new Configuration<>("org.lwjgl.opengl.maxVersion", StateInit.STRING); + + /** + * Can be used to disable specific extensions. + * + *

    This can be useful to ensure that an application behaves correctly with or without an extension. Supported values:

    + *
      + *
    • comma-delimited string - A list of extension names to disable.
    • + *
    • <classpath> - A class that implements the {@link Predicate Predicate<String>} interface. It will be instantiated using reflection.
    • + *
    + * + *

    When set programmatically, it can also be:

    + *
      + *
    • a {@link java.util.List List<String>} instance - A list of extension names to disable.
    • + *
    • a {@link Predicate}<String> instance - A predicate that accepts an extension name and returns true if it should be disabled.
    • + *
    + */ + public static final Configuration OPENGL_EXTENSION_FILTER = new Configuration<>("org.lwjgl.opengl.extensionFilter", StateInit.STRING); + + // -- OPENGL ES + + /** Similar to {@link #EGL_EXPLICIT_INIT} for the OpenGL ES library (org.lwjgl.opengles.explicitInit). */ + public static final Configuration OPENGLES_EXPLICIT_INIT = new Configuration<>("org.lwjgl.opengles.explicitInit", StateInit.BOOLEAN); + + /** Similar to {@link #LIBRARY_NAME} for the OpenGL ES library (org.lwjgl.opengles.libname). */ + public static final Configuration OPENGLES_LIBRARY_NAME = new Configuration<>("org.lwjgl.opengles.libname", StateInit.STRING); + + /** Similar to {@link #OPENGL_MAXVERSION} for the OpenGL ES library (org.lwjgl.opengles.maxVersion). */ + public static final Configuration OPENGLES_MAXVERSION = new Configuration<>("org.lwjgl.opengles.maxVersion", StateInit.STRING); + + /** Similar to {@link #OPENGL_EXTENSION_FILTER} for the OpenGL ES library (org.lwjgl.opengles.extensionFilter). */ + public static final Configuration OPENGLES_EXTENSION_FILTER = new Configuration<>("org.lwjgl.opengles.extensionFilter", StateInit.STRING); + + /** + * Defines the API that manages OpenGL ES contexts. + * + *

    Supported values:

    + *
      + *
    • EGL - context management is provided by EGL.
    • + *
    • native - context management is provided by the native platform.
      + *
    + * + *

    If this option is not set, LWJGL will first attempt to use EGL. If EGL is not available, it will attempt to use the native platform API.

    + * + *

    + * Property: org.lwjgl.opengl.contextAPI
    + *     Type: String
    + *    Usage: Dynamic

    + */ + public static final Configuration OPENGLES_CONTEXT_API = new Configuration<>("org.lwjgl.opengles.contextAPI", StateInit.STRING); + + // -- OPENVR + + /** Similar to {@link #LIBRARY_NAME} for the OpenVR library (org.lwjgl.openvr.libname). */ + public static final Configuration OPENVR_LIBRARY_NAME = new Configuration<>("org.lwjgl.openvr.libname", StateInit.STRING); + + // -- OpenXR + + /** Similar to {@link #EGL_EXPLICIT_INIT} for the OpenXR library (org.lwjgl.openxr.explicitInit). */ + public static final Configuration OPENXR_EXPLICIT_INIT = new Configuration<>("org.lwjgl.openxr.explicitInit", StateInit.BOOLEAN); + + /** Similar to {@link #LIBRARY_NAME} for the OpenXR library (org.lwjgl.openxr.libname). */ + public static final Configuration OPENXR_LIBRARY_NAME = new Configuration<>("org.lwjgl.openxr.libname", StateInit.STRING); + + // -- OPUS + + /** Similar to {@link #LIBRARY_NAME} for the Opus library (org.lwjgl.opus.libname). */ + public static final Configuration OPUS_LIBRARY_NAME = new Configuration<>("org.lwjgl.opus.libname", StateInit.STRING); + + // -- SHADERC + + /** Similar to {@link #LIBRARY_NAME} for the Shaderc libshaderc library (org.lwjgl.shaderc.libname). */ + public static final Configuration SHADERC_LIBRARY_NAME = new Configuration<>("org.lwjgl.shaderc.libname", StateInit.STRING); + + // -- SPVC + + /** Similar to {@link #LIBRARY_NAME} for the SPIRV-Cross library (org.lwjgl.spvc.libname). */ + public static final Configuration SPVC_LIBRARY_NAME = new Configuration<>("org.lwjgl.spvc.libname", StateInit.STRING); + + // -- VULKAN + + /** Similar to {@link #EGL_EXPLICIT_INIT} for the Vulkan library (org.lwjgl.vulkan.explicitInit). */ + public static final Configuration VULKAN_EXPLICIT_INIT = new Configuration<>("org.lwjgl.vulkan.explicitInit", StateInit.BOOLEAN); + + /** Similar to {@link #LIBRARY_NAME} for the Vulkan library (org.lwjgl.vulkan.libname). */ + public static final Configuration VULKAN_LIBRARY_NAME = new Configuration<>("org.lwjgl.vulkan.libname", StateInit.STRING); + + private interface StateInit extends Function { + StateInit BOOLEAN = property -> { + String value = System.getProperty(property); + return value == null ? null : Boolean.parseBoolean(value); + }; + + StateInit INT = Integer::getInteger; + + StateInit STRING = System::getProperty; + } + + private final String property; + + @Nullable + private volatile T state; + + Configuration(String property, StateInit init) { + this.property = property; + this.state = init.apply(property); + } + + public String getProperty() { + return property; + } + + /** + * Sets the option value. + * + * @param value the value to set + */ + public void set(@Nullable T value) { + this.state = value; + } + + /** + * Returns the option value. + * + *

    If the option value has not been set, null will be returned.

    + */ + @Nullable + public T get() { + return state; + } + + /** + * Returns the option value. + * + *

    If the option value has not been set, the specified default value will be returned.

    + * + * @param defaultValue the default value + */ + public T get(T defaultValue) { + T state = this.state; + if (state == null) { + state = defaultValue; + } + + return state; + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/CustomBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/CustomBuffer.java new file mode 100644 index 000000000..ae914cb27 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/CustomBuffer.java @@ -0,0 +1,433 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import javax.annotation.*; +import java.nio.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** Base class of custom buffers with an API that mirrors {@code java.nio} for convenience. */ +public abstract class CustomBuffer> extends Pointer.Default { + + @Nullable + protected ByteBuffer container; + + protected int + mark, + position, + limit, + capacity; + + protected CustomBuffer(long address, @Nullable ByteBuffer container, int mark, int position, int limit, int capacity) { + super(address); + + this.container = container; + + this.mark = mark; + this.position = position; + this.limit = limit; + this.capacity = capacity; + } + + /** Returns the {@code sizeof} a single element in the buffer. */ + public abstract int sizeof(); + + /** Returns the buffer's base address. [INTERNAL USE ONLY] */ + public long address0() { + return address; + } + + /** Returns the memory address at the current buffer position. */ + @Override + public long address() { + return address + Integer.toUnsignedLong(position) * sizeof(); + } + + /** Returns the memory address at the specified buffer position. */ + public long address(int position) { + return address + Integer.toUnsignedLong(position) * sizeof(); + } + + /** + * Frees the buffer allocation. + * + *

    This method should not be used if the memory backing this buffer is not owned by the buffer.

    + */ + public void free() { + nmemFree(address); + } + + /** + * Returns this buffer's capacity. + * + * @return the capacity of this buffer + */ + public int capacity() { + return capacity; + } + + /** + * Returns this buffer's position. + * + * @return the position of this buffer + */ + public int position() { + return position; + } + + /** + * Sets this buffer's position. If the mark is defined and larger than the new position then it is discarded. + * + * @param position the new position value; must be non-negative and no larger than the current limit + * + * @return This buffer + * + * @throws IllegalArgumentException If the preconditions on {@code newPosition} do not hold + */ + public SELF position(int position) { + if (position < 0 || limit < position) { + throw new IllegalArgumentException(); + } + this.position = position; + if (position < mark) { + mark = -1; + } + return self(); + } + + /** + * Returns this buffer's limit. + * + * @return the limit of this buffer + */ + public int limit() { + return limit; + } + + /** + * Sets this buffer's limit. If the position is larger than the new limit then it is set to the new limit. If the mark is defined and larger than the new + * limit then it is discarded. + * + * @param limit the new limit value; must be non-negative and no larger than this buffer's capacity + * + * @return This buffer + * + * @throws IllegalArgumentException If the preconditions on {@code newLimit} do not hold + */ + public SELF limit(int limit) { + if (limit < 0 || capacity < limit) { + throw new IllegalArgumentException(); + } + this.limit = limit; + if (limit < position) { + position = limit; + } + if (limit < mark) { + mark = -1; + } + return self(); + } + + /** + * Sets this buffer's mark at its position. + * + * @return This buffer + */ + public SELF mark() { + mark = position; + return self(); + } + + /** + * Resets this buffer's position to the previously-marked position. + * + *

    Invoking this method neither changes nor discards the mark's value.

    + * + * @return This buffer + * + * @throws InvalidMarkException If the mark has not been set + */ + public SELF reset() { + int m = mark; + if (m < 0) { + throw new InvalidMarkException(); + } + position = m; + return self(); + } + + /** + * Clears this buffer. The position is set to zero, the limit is set to the capacity, and the mark is discarded. + * + *

    Invoke this method before using a sequence of channel-read or put operations to fill this buffer. For example:

    + * + *
    +     * buf.clear();     // Prepare buffer for reading
    +     * in.read(buf);    // Read data
    + * + *

    This method does not actually erase the data in the buffer, but it is named as if it did because it will most often be used in situations in which + * that might as well be the case.

    + * + * @return This buffer + */ + public SELF clear() { + position = 0; + limit = capacity; + mark = -1; + return self(); + } + + /** + * Flips this buffer. The limit is set to the current position and then the position is set to zero. If the mark is defined then it is discarded. + * + *

    After a sequence of channel-read or put operations, invoke this method to prepare for a sequence of channel-write or relative get + * operations. For example:

    + * + *
    +     * buf.put(magic);    // Prepend header
    +     * in.read(buf);      // Read data into rest of buffer
    +     * buf.flip();        // Flip buffer
    +     * out.write(buf);    // Write header + data to channel
    + * + *

    This method is often used in conjunction with the {@link #compact} method when transferring data from one place to another.

    + * + * @return This buffer + */ + public SELF flip() { + limit = position; + position = 0; + mark = -1; + return self(); + } + + /** + * Rewinds this buffer. The position is set to zero and the mark is discarded. + * + *

    Invoke this method before a sequence of channel-write or get operations, assuming that the limit has already been set appropriately. For + * example:

    + * + *
    +     * out.write(buf);    // Write remaining data
    +     * buf.rewind();      // Rewind buffer
    +     * buf.get(array);    // Copy data into array
    + * + * @return This buffer + */ + public SELF rewind() { + position = 0; + mark = -1; + return self(); + } + + /** + * Returns the number of elements between the current position and the limit. + * + * @return the number of elements remaining in this buffer + */ + public int remaining() { + return limit - position; + } + + /** + * Tells whether there are any elements between the current position and the limit. + * + * @return {@code true} if, and only if, there is at least one element remaining in this buffer + */ + public boolean hasRemaining() { + return position < limit; + } + + /** + * Creates a new buffer whose content is a shared subsequence of this buffer's content. + * + *

    The content of the new buffer will start at this buffer's current position. Changes to this buffer's content will be visible in the new buffer, and + * vice versa; the two buffers' position, limit, and mark values will be independent.

    + * + *

    The new buffer's position will be zero, its capacity and its limit will be the number of elements remaining in this buffer, and its mark will be + * undefined. The new buffer will be read-only if, and only if, this buffer is read-only.

    + * + * @return the new buffer + */ + @SuppressWarnings("unchecked") + public SELF slice() { + SELF slice; + try { + slice = (SELF)UNSAFE.allocateInstance(this.getClass()); + } catch (InstantiationException e) { + throw new UnsupportedOperationException(e); + } + + UNSAFE.putLong(slice, ADDRESS, address + Integer.toUnsignedLong(position) * sizeof()); + UNSAFE.putInt(slice, BUFFER_MARK, -1); + UNSAFE.putInt(slice, BUFFER_LIMIT, remaining()); + UNSAFE.putInt(slice, BUFFER_CAPACITY, remaining()); + UNSAFE.putObject(slice, BUFFER_CONTAINER, container); + + return slice; + } + + /** + * Returns a slice of this buffer between {@code (buffer.position() + offset)} and {@code (buffer.position() + offset + capacity)}. + * + *

    The position and limit of this buffer are preserved after a call to this method.

    + * + * @param offset the slice offset, it must be ≤ {@code this.remaining()} + * @param capacity the slice length, it must be ≤ {@code this.capacity() - (this.position() + offset)} + * + * @return the sliced buffer + */ + @SuppressWarnings("unchecked") + public SELF slice(int offset, int capacity) { + int position = this.position + offset; + if (offset < 0 || this.limit < offset) { + throw new IllegalArgumentException(); + } + + if (capacity < 0 || this.capacity - position < capacity) { + throw new IllegalArgumentException(); + } + + SELF slice; + try { + slice = (SELF)UNSAFE.allocateInstance(this.getClass()); + } catch (InstantiationException e) { + throw new UnsupportedOperationException(e); + } + + UNSAFE.putLong(slice, ADDRESS, address + Integer.toUnsignedLong(position) * sizeof()); + UNSAFE.putInt(slice, BUFFER_MARK, -1); + UNSAFE.putInt(slice, BUFFER_LIMIT, capacity); + UNSAFE.putInt(slice, BUFFER_CAPACITY, capacity); + UNSAFE.putObject(slice, BUFFER_CONTAINER, container); + + return slice; + } + + /** + * Creates a new buffer that shares this buffer's content. + * + *

    The content of the new buffer will be that of this buffer. Changes to this buffer's content will be visible in the new buffer, and vice versa; the + * two buffers' position, limit, and mark values will be independent. + * + *

    The new buffer's capacity, limit and position will be identical to those of this buffer.

    + * + * @return the new buffer + */ + @SuppressWarnings("unchecked") + public SELF duplicate() { + SELF dup; + try { + dup = (SELF)UNSAFE.allocateInstance(this.getClass()); + } catch (InstantiationException e) { + throw new UnsupportedOperationException(e); + } + + UNSAFE.putLong(dup, ADDRESS, address); + UNSAFE.putInt(dup, BUFFER_MARK, mark); + UNSAFE.putInt(dup, BUFFER_POSITION, position); + UNSAFE.putInt(dup, BUFFER_LIMIT, limit); + UNSAFE.putInt(dup, BUFFER_CAPACITY, capacity); + UNSAFE.putObject(dup, BUFFER_CONTAINER, container); + + return dup; + } + + // -- Bulk get operations -- + + /** + * Relative bulk put method  (optional operation). + * + *

    This method transfers the elements remaining in the specified source buffer into this buffer. If there are more elements remaining in the source + * buffer than in this buffer, that is, if {@code src.remaining()} {@code >} {@code remaining()}, then no elements are transferred and a + * {@link BufferOverflowException} is thrown. + * + *

    Otherwise, this method copies n = {@code src.remaining()} elements from the specified buffer into this buffer, starting at each + * buffer's current position. The positions of both buffers are then incremented by n.

    + * + *

    In other words, an invocation of this method of the form {@code dst.put(src)} has exactly the same effect as the loop

    + * + *
    +     *     while (src.hasRemaining())
    +     *         dst.put(src.get()); 
    + * + *

    except that it first checks that there is sufficient space in this buffer and it is potentially much more efficient.

    + * + * @param src the source buffer from which elements are to be read; must not be this buffer + * + * @return This buffer + * + * @throws BufferOverflowException If there is insufficient space in this buffer for the remaining elements in the source buffer + * @throws IllegalArgumentException If the source buffer is this buffer + * @throws ReadOnlyBufferException If this buffer is read-only + */ + public SELF put(SELF src) { + if (src == this) { + throw new IllegalArgumentException(); + } + int n = src.remaining(); + if (remaining() < n) { + throw new BufferOverflowException(); + } + + memCopy(src.address(), this.address(), Integer.toUnsignedLong(n) * sizeof()); + position += n; + + return self(); + } + + /** + * Compacts this buffer  (optional operation). + * + *

    The elements between the buffer's current position and its limit, if any, are copied to the beginning of the buffer. That is, the element at index + * p = {@code position()} is copied to index zero, the element at index p + 1 is copied to index one, and so forth until + * the element at index {@code limit()} - 1 is copied to index n = {@code limit()} - {@code 1} -  + * p. + * The buffer's position is then set to n+1 and its limit is set to its capacity. The mark, if defined, is discarded. + * + *

    The buffer's position is set to the number of elements copied, rather than to zero, so that an invocation of this method can be followed + * immediately by an invocation of another relative put method.

    + * + * @return This buffer + * + * @throws ReadOnlyBufferException If this buffer is read-only + */ + public SELF compact() { + memCopy(address(), address, Integer.toUnsignedLong(remaining()) * sizeof()); + position(remaining()); + limit(capacity()); + mark = -1; + + return self(); + } + + /** + * Returns a string summarizing the state of this buffer. + * + * @return A summary string + */ + public String toString() { + return getClass().getName() + "[pos=" + position() + " lim=" + limit() + " cap=" + capacity() + "]"; + } + + // ----------------------------- + + protected abstract SELF self(); + + protected final int nextGetIndex() { + if (position < limit) { + return position++; + } + throw new BufferUnderflowException(); + } + + protected final int nextPutIndex() { + if (position < limit) { + return position++; + } + throw new BufferOverflowException(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/FunctionProvider.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/FunctionProvider.java new file mode 100644 index 000000000..51483ad7a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/FunctionProvider.java @@ -0,0 +1,31 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import java.nio.*; + +import static org.lwjgl.system.MemoryStack.*; + +/** A provider of native function addresses. */ +@FunctionalInterface +public interface FunctionProvider { + + /** {@link CharSequence} version of {@link #getFunctionAddress(ByteBuffer)}. */ + default long getFunctionAddress(CharSequence functionName) { + try (MemoryStack stack = stackPush()) { + return getFunctionAddress(stack.ASCII(functionName)); + } + } + + /** + * Returns the function address of the specified function. If the function is not supported, returns 0L. + * + * @param functionName the encoded name of the function to query + * + * @return the function address or 0L if the function is not supported + */ + long getFunctionAddress(ByteBuffer functionName); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/FunctionProviderLocal.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/FunctionProviderLocal.java new file mode 100644 index 000000000..4242c4a9a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/FunctionProviderLocal.java @@ -0,0 +1,31 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import java.nio.*; + +import static org.lwjgl.system.MemoryStack.*; + +/** A platform/device/context specific provider of native function addresses. */ +public interface FunctionProviderLocal extends FunctionProvider { + + /** {@link CharSequence} version of {@link #getFunctionAddress(long, ByteBuffer)}. */ + default long getFunctionAddress(long handle, CharSequence functionName) { + try (MemoryStack stack = stackPush()) { + return getFunctionAddress(handle, stack.ASCII(functionName)); + } + } + + /** + * Returns the function address of the specified function for the specified {@code handle}. If the function is not supported, returns 0L. + * + * @param handle the handle to a platform/device/context + * @param functionName the encoded name of the function to query + * + * @return the function address or 0L if the function is not supported + */ + long getFunctionAddress(long handle, ByteBuffer functionName); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/JNI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/JNI.java new file mode 100644 index 000000000..06122bab9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/JNI.java @@ -0,0 +1,1088 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system; + +import javax.annotation.*; + +/** + * This class contains native methods that can be used to call dynamically loaded functions. It is used internally by the LWJGL bindings, but can also + * be used to call other dynamically loaded functions. Not all possible signatures are available, only those needed by the LWJGL bindings. To call a + * function that does not have a matching JNI method, {@link org.lwjgl.system.libffi.LibFFI LibFFI} can used. + * + *

    All JNI methods in this class take an extra parameter, called {@code __functionAddress}. This must be a valid pointer to a native function with a + * matching signature. Due to overloading, method names are partially mangled:

    + * + *
      + *
    • {@code call} or {@code invoke} + * + *

      Methods with the {@code invoke} prefix will invoke the native function with the default calling convention. Methods with the {@code call} + * prefix will invoke the native function with the {@code __stdcall} calling convention on Windows and the default calling convention on other + * systems.

    • + *
    • a {@code U} (unsigned) or a {@code B} (signed) for each {@code byte} parameter
    • + *
    • a {@code C} (unsigned) or an {@code S} (signed) for each {@code short} parameter
    • + *
    • a {@code J}, a {@code N} or a {@code P} for each {@code long} parameter + * + *

      {@code J} parameters represent 64-bit integer values. {@code N} parameters represent C long values, which may be 32-bit or 64-bit integers + * depending on the platform. {@code P} parameters represent pointer addresses, which maybe 32-bit or 64-bit values depending on the JVM.

    • + *
    • the return value JNI type signature
    • + *
    + */ +public final class JNI { + + static { + Library.initialize(); + } + + private JNI() {} + + // Pointer API + + public static native short invokePC(long param0, long __functionAddress); + public static native double invokeD(long __functionAddress); + public static native double invokeD(int param0, long __functionAddress); + public static native double invokePD(long param0, int param1, long __functionAddress); + public static native double invokePD(long param0, int param1, int param2, long __functionAddress); + public static native float invokeF(int param0, long __functionAddress); + public static native float invokePF(long param0, long __functionAddress); + public static native float invokePF(long param0, int param1, long __functionAddress); + public static native float invokePF(long param0, int param1, int param2, long __functionAddress); + public static native int invokeI(long __functionAddress); + public static native int invokeI(int param0, long __functionAddress); + public static native int invokeI(int param0, int param1, long __functionAddress); + public static native int invokeI(int param0, int param1, int param2, long __functionAddress); + public static native int invokePI(long param0, long __functionAddress); + public static native int invokePI(int param0, long param1, long __functionAddress); + public static native int invokePI(long param0, int param1, long __functionAddress); + public static native int invokePI(long param0, int param1, int param2, long __functionAddress); + public static native int invokePI(long param0, int param1, boolean param2, long __functionAddress); + public static native int invokePI(long param0, int param1, int param2, int param3, long __functionAddress); + public static native int invokePNI(long param0, long param1, long __functionAddress); + public static native int invokePPI(long param0, long param1, long __functionAddress); + public static native int invokePNI(long param0, int param1, long param2, long __functionAddress); + public static native int invokePNI(long param0, long param1, int param2, long __functionAddress); + public static native int invokePPI(int param0, long param1, long param2, long __functionAddress); + public static native int invokePPI(long param0, int param1, long param2, long __functionAddress); + public static native int invokePPI(long param0, long param1, int param2, long __functionAddress); + public static native int invokePPI(long param0, long param1, boolean param2, long __functionAddress); + public static native int invokePPI(long param0, boolean param1, long param2, long __functionAddress); + public static native int invokePPI(long param0, int param1, int param2, long param3, long __functionAddress); + public static native int invokePPI(long param0, int param1, long param2, int param3, long __functionAddress); + public static native int invokePPI(long param0, int param1, long param2, boolean param3, long __functionAddress); + public static native int invokePPI(long param0, int param1, boolean param2, long param3, long __functionAddress); + public static native int invokePPI(long param0, long param1, int param2, int param3, long __functionAddress); + public static native int invokePPI(long param0, long param1, boolean param2, boolean param3, long __functionAddress); + public static native int invokePPI(long param0, int param1, int param2, int param3, long param4, long __functionAddress); + public static native int invokePPI(long param0, int param1, long param2, int param3, int param4, long __functionAddress); + public static native int invokePPI(long param0, int param1, int param2, int param3, int param4, long param5, long __functionAddress); + public static native int invokePCPI(long param0, short param1, long param2, long __functionAddress); + public static native int invokePNNI(long param0, long param1, long param2, long __functionAddress); + public static native int invokePNPI(long param0, long param1, long param2, long __functionAddress); + public static native int invokePPNI(long param0, long param1, long param2, long __functionAddress); + public static native int invokePPPI(long param0, long param1, long param2, long __functionAddress); + public static native int invokePNPI(long param0, long param1, int param2, long param3, long __functionAddress); + public static native int invokePNPI(long param0, long param1, long param2, int param3, long __functionAddress); + public static native int invokePPNI(long param0, int param1, long param2, long param3, long __functionAddress); + public static native int invokePPPI(long param0, int param1, long param2, long param3, long __functionAddress); + public static native int invokePPPI(long param0, long param1, int param2, long param3, long __functionAddress); + public static native int invokePPPI(long param0, long param1, long param2, int param3, long __functionAddress); + public static native int invokePNNI(long param0, long param1, long param2, int param3, int param4, long __functionAddress); + public static native int invokePPPI(long param0, int param1, int param2, long param3, long param4, long __functionAddress); + public static native int invokePPPI(long param0, int param1, long param2, int param3, long param4, long __functionAddress); + public static native int invokePPPI(long param0, int param1, long param2, long param3, int param4, long __functionAddress); + public static native int invokePPPI(long param0, long param1, int param2, int param3, long param4, long __functionAddress); + public static native int invokePPPI(long param0, long param1, int param2, long param3, int param4, long __functionAddress); + public static native int invokePPPI(long param0, long param1, long param2, int param3, int param4, long __functionAddress); + public static native int invokePPPI(long param0, int param1, int param2, int param3, long param4, long param5, long __functionAddress); + public static native int invokePPPI(long param0, int param1, long param2, int param3, long param4, int param5, long __functionAddress); + public static native int invokePPPI(long param0, int param1, int param2, int param3, int param4, long param5, long param6, long __functionAddress); + public static native int invokePPPI(long param0, int param1, int param2, long param3, int param4, long param5, int param6, int param7, long __functionAddress); + public static native int invokePNPPI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int invokePPNNI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int invokePPNPI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int invokePPPNI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int invokePPPPI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int invokePNNPI(long param0, long param1, int param2, long param3, long param4, long __functionAddress); + public static native int invokePPPNI(long param0, long param1, int param2, long param3, long param4, long __functionAddress); + public static native int invokePPPPI(long param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native int invokePPPPI(long param0, long param1, int param2, long param3, long param4, long __functionAddress); + public static native int invokePPPPI(long param0, long param1, long param2, int param3, long param4, long __functionAddress); + public static native int invokePPPPI(long param0, long param1, long param2, long param3, int param4, long __functionAddress); + public static native int invokePPPPI(long param0, int param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native int invokePPPPI(long param0, long param1, int param2, int param3, long param4, long param5, long __functionAddress); + public static native int invokePPPPI(long param0, long param1, int param2, long param3, int param4, long param5, long __functionAddress); + public static native int invokePPPPI(long param0, long param1, int param2, long param3, long param4, int param5, long __functionAddress); + public static native int invokePPPPI(long param0, long param1, long param2, long param3, int param4, int param5, long __functionAddress); + public static native int invokePPPPI(long param0, int param1, int param2, int param3, long param4, long param5, long param6, long __functionAddress); + public static native int invokePPPPI(long param0, int param1, int param2, long param3, int param4, long param5, long param6, int param7, int param8, long __functionAddress); + public static native int invokePNNPPI(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native int invokePPNNPI(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native int invokePPPNNI(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native int invokePPPPNI(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native int invokePPPPPI(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native int invokePJPPNI(long param0, int param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native int invokePPNPPI(long param0, int param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native int invokePPNPPI(long param0, long param1, long param2, int param3, long param4, long param5, long __functionAddress); + public static native int invokePPPNJI(long param0, int param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native int invokePPPNNI(long param0, int param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native int invokePPPNPI(long param0, int param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native int invokePPPPNI(long param0, int param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native int invokePPPPNI(long param0, long param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native int invokePPPPPI(long param0, long param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native int invokePPPPPI(long param0, long param1, long param2, int param3, long param4, long param5, long __functionAddress); + public static native int invokePPPPPI(long param0, long param1, long param2, long param3, long param4, int param5, long __functionAddress); + public static native int invokePNPPPI(long param0, int param1, int param2, long param3, long param4, long param5, long param6, long __functionAddress); + public static native int invokePPPPPI(long param0, long param1, int param2, int param3, long param4, long param5, long param6, long __functionAddress); + public static native int invokePPPPPI(long param0, long param1, int param2, long param3, int param4, long param5, int param6, long param7, long __functionAddress); + public static native int invokePPPPPI(long param0, long param1, long param2, int param3, int param4, int param5, float param6, long param7, long param8, long __functionAddress); + public static native int invokePPPPPPI(long param0, long param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native int invokePPNPPPI(long param0, int param1, long param2, long param3, long param4, long param5, long param6, long __functionAddress); + public static native int invokePPPPPPI(long param0, int param1, long param2, long param3, long param4, long param5, long param6, long __functionAddress); + public static native int invokePNNPPPI(long param0, long param1, long param2, int param3, int param4, long param5, long param6, long param7, long __functionAddress); + public static native int invokePPPPPPI(long param0, int param1, int param2, long param3, long param4, long param5, long param6, long param7, long __functionAddress); + public static native int invokePPPPPPPI(long param0, long param1, long param2, int param3, long param4, float param5, float param6, long param7, long param8, long param9, long __functionAddress); + public static native long invokeJ(long __functionAddress); + public static native long invokePJ(long param0, long __functionAddress); + public static native long invokePJ(long param0, int param1, long __functionAddress); + public static native long invokeNN(long param0, long __functionAddress); + public static native long invokePN(long param0, long __functionAddress); + public static native long invokePN(long param0, int param1, long __functionAddress); + public static native long invokeNNN(long param0, long param1, long __functionAddress); + public static native long invokePPN(long param0, long param1, long __functionAddress); + public static native long invokeNNNN(long param0, long param1, long param2, long __functionAddress); + public static native long invokePNPN(long param0, long param1, long param2, long __functionAddress); + public static native long invokePNPN(long param0, long param1, long param2, int param3, long __functionAddress); + public static native long invokePPNN(long param0, int param1, int param2, long param3, long param4, long __functionAddress); + public static native long invokePNPNN(long param0, long param1, long param2, long param3, long __functionAddress); + public static native long invokePNPNPN(long param0, long param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, long param9, long param10, long param11, long __functionAddress); + public static native long invokeP(long __functionAddress); + public static native long invokeP(int param0, long __functionAddress); + public static native long invokeP(int param0, int param1, long __functionAddress); + public static native long invokePP(long param0, long __functionAddress); + public static native long invokePP(int param0, long param1, long __functionAddress); + public static native long invokePP(long param0, int param1, long __functionAddress); + public static native long invokePP(int param0, int param1, long param2, long __functionAddress); + public static native long invokePP(long param0, int param1, int param2, long __functionAddress); + public static native long invokePP(long param0, int param1, int param2, int param3, long __functionAddress); + public static native long invokePP(long param0, int param1, int param2, int param3, int param4, int param5, long __functionAddress); + public static native long invokePNP(long param0, long param1, long __functionAddress); + public static native long invokePPP(long param0, long param1, long __functionAddress); + public static native long invokePCP(long param0, short param1, boolean param2, long __functionAddress); + public static native long invokePPP(long param0, int param1, long param2, long __functionAddress); + public static native long invokePPP(long param0, long param1, int param2, long __functionAddress); + public static native long invokePPP(long param0, int param1, long param2, int param3, long __functionAddress); + public static native long invokePPP(long param0, long param1, boolean param2, boolean param3, long __functionAddress); + public static native long invokePPP(long param0, boolean param1, boolean param2, long param3, long __functionAddress); + public static native long invokePPPP(long param0, long param1, long param2, long __functionAddress); + public static native long invokePPPP(long param0, int param1, long param2, long param3, long __functionAddress); + public static native long invokePPPP(long param0, long param1, long param2, int param3, long __functionAddress); + public static native long invokePPPP(int param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native long invokePPPP(long param0, int param1, int param2, long param3, long param4, long __functionAddress); + public static native long invokePPPP(long param0, long param1, long param2, int param3, int param4, long __functionAddress); + public static native long invokeJPPP(int param0, int param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native long invokePNNPP(long param0, long param1, long param2, long param3, long __functionAddress); + public static native long invokePPNNP(long param0, long param1, long param2, long param3, long __functionAddress); + public static native long invokePPPPP(long param0, long param1, long param2, long param3, long __functionAddress); + public static native long invokePPPPP(long param0, long param1, int param2, long param3, long param4, long __functionAddress); + public static native long invokePPPPP(long param0, long param1, long param2, int param3, long param4, long __functionAddress); + public static native long invokePJPPP(long param0, int param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native long invokePNNNPP(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native long invokePPPPNP(long param0, long param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native long invokePPPPPP(long param0, long param1, long param2, int param3, long param4, int param5, long param6, long __functionAddress); + public static native long invokePPPPPPP(long param0, long param1, long param2, int param3, long param4, long param5, long param6, long __functionAddress); + public static native long invokePPPPPPP(long param0, long param1, long param2, long param3, long param4, long param5, int param6, long __functionAddress); + public static native byte invokeU(int param0, long __functionAddress); + public static native void invokeV(long __functionAddress); + public static native void invokeV(double param0, long __functionAddress); + public static native void invokeV(float param0, long __functionAddress); + public static native void invokeV(int param0, long __functionAddress); + public static native void invokeV(int param0, float param1, long __functionAddress); + public static native void invokeV(int param0, int param1, long __functionAddress); + public static native void invokeV(int param0, int param1, double param2, long __functionAddress); + public static native void invokeV(int param0, int param1, float param2, long __functionAddress); + public static native void invokeV(int param0, int param1, int param2, long __functionAddress); + public static native void invokeV(int param0, float param1, float param2, float param3, long __functionAddress); + public static native void invokeV(int param0, int param1, int param2, int param3, long __functionAddress); + public static native void invokeV(int param0, int param1, double param2, double param3, double param4, long __functionAddress); + public static native void invokeV(int param0, int param1, float param2, float param3, float param4, long __functionAddress); + public static native void invokeV(int param0, int param1, int param2, int param3, int param4, long __functionAddress); + public static native void invokePV(long param0, long __functionAddress); + public static native void invokeJV(int param0, long param1, long __functionAddress); + public static native void invokePV(int param0, long param1, long __functionAddress); + public static native void invokePV(long param0, float param1, long __functionAddress); + public static native void invokePV(long param0, int param1, long __functionAddress); + public static native void invokePV(long param0, boolean param1, long __functionAddress); + public static native void invokeJV(int param0, int param1, long param2, long __functionAddress); + public static native void invokePV(int param0, int param1, long param2, long __functionAddress); + public static native void invokePV(int param0, long param1, boolean param2, long __functionAddress); + public static native void invokePV(long param0, double param1, double param2, long __functionAddress); + public static native void invokePV(long param0, float param1, float param2, long __functionAddress); + public static native void invokePV(long param0, int param1, double param2, long __functionAddress); + public static native void invokePV(long param0, int param1, float param2, long __functionAddress); + public static native void invokePV(long param0, int param1, int param2, long __functionAddress); + public static native void invokePV(long param0, float param1, float param2, int param3, long __functionAddress); + public static native void invokePV(long param0, int param1, int param2, double param3, long __functionAddress); + public static native void invokePV(long param0, int param1, int param2, float param3, long __functionAddress); + public static native void invokePV(long param0, int param1, int param2, int param3, long __functionAddress); + public static native void invokePV(int param0, int param1, long param2, int param3, int param4, long __functionAddress); + public static native void invokePV(long param0, int param1, int param2, int param3, int param4, long __functionAddress); + public static native void invokePV(int param0, int param1, int param2, int param3, int param4, long param5, long __functionAddress); + public static native void invokePV(int param0, int param1, int param2, int param3, int param4, int param5, long param6, long __functionAddress); + public static native void invokePJV(long param0, long param1, long __functionAddress); + public static native void invokePNV(long param0, long param1, long __functionAddress); + public static native void invokePPV(long param0, long param1, long __functionAddress); + public static native void invokePJV(int param0, long param1, long param2, long __functionAddress); + public static native void invokePJV(long param0, int param1, long param2, long __functionAddress); + public static native void invokePPV(long param0, int param1, long param2, long __functionAddress); + public static native void invokePPV(long param0, long param1, int param2, long __functionAddress); + public static native void invokePPV(long param0, long param1, boolean param2, long __functionAddress); + public static native void invokePBV(long param0, int param1, int param2, byte param3, long __functionAddress); + public static native void invokePCV(long param0, int param1, int param2, short param3, long __functionAddress); + public static native void invokePPV(int param0, int param1, long param2, long param3, long __functionAddress); + public static native void invokePPV(long param0, int param1, int param2, long param3, long __functionAddress); + public static native void invokePPV(long param0, int param1, long param2, int param3, long __functionAddress); + public static native void invokePPV(long param0, long param1, int param2, int param3, long __functionAddress); + public static native void invokePSV(long param0, int param1, int param2, short param3, long __functionAddress); + public static native void invokePUV(long param0, int param1, int param2, byte param3, long __functionAddress); + public static native void invokePPV(int param0, int param1, int param2, long param3, long param4, long __functionAddress); + public static native void invokePPV(long param0, int param1, int param2, int param3, long param4, long __functionAddress); + public static native void invokePPV(long param0, long param1, int param2, int param3, int param4, long __functionAddress); + public static native void invokePPV(int param0, int param1, int param2, int param3, long param4, long param5, long __functionAddress); + public static native void invokePPV(long param0, int param1, int param2, int param3, int param4, long param5, long __functionAddress); + public static native void invokePPV(long param0, long param1, float param2, float param3, float param4, float param5, long __functionAddress); + public static native void invokePPV(long param0, long param1, int param2, int param3, int param4, int param5, int param6, long __functionAddress); + public static native void invokePPV(long param0, long param1, float param2, float param3, float param4, float param5, float param6, float param7, long __functionAddress); + public static native void invokePNNV(long param0, long param1, long param2, long __functionAddress); + public static native void invokePNPV(long param0, long param1, long param2, long __functionAddress); + public static native void invokePPNV(long param0, long param1, long param2, long __functionAddress); + public static native void invokePPPV(long param0, long param1, long param2, long __functionAddress); + public static native void invokePPPV(int param0, long param1, long param2, long param3, long __functionAddress); + public static native void invokePPPV(long param0, int param1, long param2, long param3, long __functionAddress); + public static native void invokePPPV(long param0, long param1, int param2, long param3, long __functionAddress); + public static native void invokePPPV(long param0, long param1, long param2, int param3, long __functionAddress); + public static native void invokeJJJV(int param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native void invokePNNV(long param0, long param1, int param2, int param3, long param4, long __functionAddress); + public static native void invokePPPV(int param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native void invokePPPV(long param0, int param1, int param2, long param3, long param4, long __functionAddress); + public static native void invokePPPV(long param0, long param1, int param2, int param3, long param4, long __functionAddress); + public static native void invokePPPV(long param0, long param1, int param2, long param3, int param4, long __functionAddress); + public static native void invokePPPV(long param0, long param1, long param2, float param3, float param4, long __functionAddress); + public static native void invokePPPV(long param0, long param1, long param2, boolean param3, boolean param4, long __functionAddress); + public static native void invokePPPV(long param0, int param1, int param2, int param3, long param4, long param5, long __functionAddress); + public static native void invokePPPV(long param0, int param1, long param2, int param3, long param4, int param5, long __functionAddress); + public static native void invokePPPV(long param0, int param1, long param2, long param3, int param4, int param5, long __functionAddress); + public static native void invokePPPV(long param0, long param1, long param2, int param3, boolean param4, boolean param5, long __functionAddress); + public static native void invokePPPV(long param0, int param1, int param2, long param3, int param4, long param5, int param6, long __functionAddress); + public static native void invokePPPV(long param0, long param1, float param2, float param3, float param4, float param5, long param6, long __functionAddress); + public static native void invokePPPV(long param0, long param1, long param2, float param3, float param4, float param5, float param6, long __functionAddress); + public static native void invokePPPV(long param0, long param1, float param2, float param3, float param4, float param5, float param6, float param7, long param8, long __functionAddress); + public static native void invokePPPV(long param0, long param1, long param2, float param3, float param4, float param5, float param6, float param7, float param8, long __functionAddress); + public static native void invokePNPPV(long param0, long param1, long param2, long param3, long __functionAddress); + public static native void invokePPPPV(long param0, long param1, long param2, long param3, long __functionAddress); + public static native void invokePPPPV(long param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native void invokePPPPV(long param0, long param1, int param2, long param3, long param4, long __functionAddress); + public static native void invokePPPPV(long param0, long param1, long param2, int param3, long param4, long __functionAddress); + public static native void invokePPPPV(long param0, long param1, long param2, float param3, float param4, long param5, long __functionAddress); + public static native void invokePPPPV(long param0, long param1, long param2, float param3, float param4, float param5, float param6, long param7, long __functionAddress); + public static native void invokePPPPV(long param0, long param1, long param2, int param3, int param4, int param5, float param6, long param7, long __functionAddress); + public static native void invokePPPPV(long param0, long param1, long param2, float param3, float param4, float param5, float param6, float param7, float param8, long param9, long __functionAddress); + public static native void invokePPPPPV(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native void invokePPPPPV(int param0, long param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native void invokePPPPPV(long param0, int param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native void invokePPPPPV(long param0, long param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native void invokePPPPPV(long param0, int param1, int param2, long param3, long param4, long param5, long param6, long __functionAddress); + public static native void invokePPPPPV(long param0, long param1, int param2, long param3, int param4, long param5, int param6, long param7, long __functionAddress); + public static native void invokePPPPPV(long param0, long param1, int param2, long param3, long param4, int param5, int param6, long param7, long __functionAddress); + public static native boolean invokeZ(int param0, long __functionAddress); + public static native boolean invokePZ(long param0, long __functionAddress); + public static native boolean invokePZ(long param0, int param1, long __functionAddress); + public static native boolean invokePZ(long param0, boolean param1, long __functionAddress); + public static native boolean invokePZ(long param0, int param1, int param2, long __functionAddress); + public static native boolean invokePZ(long param0, int param1, int param2, int param3, long __functionAddress); + public static native boolean invokePPZ(long param0, long param1, long __functionAddress); + public static native boolean invokePPZ(long param0, int param1, long param2, long __functionAddress); + public static native boolean invokePPZ(long param0, int param1, int param2, long param3, long __functionAddress); + public static native boolean invokePPPZ(long param0, long param1, long param2, long __functionAddress); + public static native boolean invokePPPZ(long param0, long param1, long param2, int param3, long __functionAddress); + public static native boolean invokePPPZ(long param0, long param1, long param2, boolean param3, int param4, long __functionAddress); + public static native boolean invokePPPPZ(long param0, long param1, long param2, long param3, long __functionAddress); + public static native boolean invokePPPPZ(long param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native boolean invokePPPUPZ(long param0, long param1, long param2, byte param3, long param4, long __functionAddress); + public static native boolean invokePPPPPZ(long param0, long param1, long param2, long param3, long param4, int param5, long __functionAddress); + public static native boolean invokePPPPPZ(long param0, long param1, long param2, long param3, long param4, boolean param5, int param6, long __functionAddress); + public static native short callC(int param0, long __functionAddress); + public static native float callF(int param0, int param1, int param2, long __functionAddress); + public static native float callPF(long param0, float param1, long __functionAddress); + public static native int callI(long __functionAddress); + public static native int callI(int param0, long __functionAddress); + public static native int callI(int param0, int param1, long __functionAddress); + public static native int callI(int param0, int param1, int param2, long __functionAddress); + public static native int callPI(long param0, long __functionAddress); + public static native int callPI(int param0, long param1, long __functionAddress); + public static native int callPI(long param0, float param1, long __functionAddress); + public static native int callPI(long param0, int param1, long __functionAddress); + public static native int callPI(int param0, int param1, long param2, long __functionAddress); + public static native int callPI(int param0, long param1, int param2, long __functionAddress); + public static native int callPI(long param0, float param1, float param2, long __functionAddress); + public static native int callPI(long param0, float param1, int param2, long __functionAddress); + public static native int callPI(long param0, int param1, float param2, long __functionAddress); + public static native int callPI(long param0, int param1, int param2, long __functionAddress); + public static native int callJI(int param0, long param1, int param2, int param3, long __functionAddress); + public static native int callPI(int param0, int param1, int param2, long param3, long __functionAddress); + public static native int callPI(long param0, float param1, float param2, float param3, long __functionAddress); + public static native int callPI(long param0, int param1, float param2, float param3, long __functionAddress); + public static native int callPI(long param0, int param1, int param2, int param3, long __functionAddress); + public static native int callPI(long param0, int param1, int param2, boolean param3, long __functionAddress); + public static native int callPI(int param0, int param1, int param2, int param3, long param4, long __functionAddress); + public static native int callPI(long param0, int param1, float param2, float param3, int param4, long __functionAddress); + public static native int callPI(long param0, int param1, int param2, int param3, int param4, long __functionAddress); + public static native int callPI(int param0, int param1, int param2, int param3, int param4, long param5, long __functionAddress); + public static native int callPI(int param0, long param1, int param2, int param3, float param4, int param5, long __functionAddress); + public static native int callPI(long param0, int param1, int param2, int param3, int param4, int param5, long __functionAddress); + public static native int callPI(long param0, int param1, int param2, int param3, int param4, int param5, int param6, long __functionAddress); + public static native int callPI(int param0, int param1, long param2, int param3, int param4, int param5, int param6, float param7, long __functionAddress); + public static native int callPI(long param0, float param1, float param2, float param3, float param4, float param5, float param6, float param7, float param8, long __functionAddress); + public static native int callPJI(long param0, long param1, long __functionAddress); + public static native int callPPI(long param0, long param1, long __functionAddress); + public static native int callPJI(long param0, int param1, long param2, long __functionAddress); + public static native int callPJI(long param0, long param1, float param2, long __functionAddress); + public static native int callPJI(long param0, long param1, int param2, long __functionAddress); + public static native int callPPI(int param0, long param1, long param2, long __functionAddress); + public static native int callPPI(long param0, float param1, long param2, long __functionAddress); + public static native int callPPI(long param0, int param1, long param2, long __functionAddress); + public static native int callPPI(long param0, long param1, float param2, long __functionAddress); + public static native int callPPI(long param0, long param1, int param2, long __functionAddress); + public static native int callPPI(int param0, int param1, long param2, long param3, long __functionAddress); + public static native int callPPI(long param0, int param1, float param2, long param3, long __functionAddress); + public static native int callPPI(long param0, int param1, int param2, long param3, long __functionAddress); + public static native int callPPI(long param0, int param1, long param2, int param3, long __functionAddress); + public static native int callPPI(long param0, long param1, float param2, float param3, long __functionAddress); + public static native int callPPI(long param0, long param1, float param2, int param3, long __functionAddress); + public static native int callPPI(long param0, long param1, int param2, int param3, long __functionAddress); + public static native int callPPI(long param0, int param1, float param2, float param3, long param4, long __functionAddress); + public static native int callPPI(long param0, int param1, int param2, int param3, long param4, long __functionAddress); + public static native int callPPI(long param0, int param1, int param2, long param3, int param4, long __functionAddress); + public static native int callPPI(long param0, long param1, int param2, int param3, int param4, long __functionAddress); + public static native int callPPI(long param0, long param1, int param2, int param3, boolean param4, long __functionAddress); + public static native int callPPI(int param0, long param1, int param2, int param3, float param4, long param5, long __functionAddress); + public static native int callPPI(long param0, int param1, float param2, float param3, float param4, long param5, long __functionAddress); + public static native int callPPI(long param0, long param1, int param2, int param3, int param4, int param5, long __functionAddress); + public static native int callPPI(long param0, int param1, float param2, float param3, float param4, int param5, long param6, long __functionAddress); + public static native int callPPI(long param0, int param1, int param2, int param3, int param4, int param5, long param6, long __functionAddress); + public static native int callPPI(long param0, int param1, float param2, float param3, float param4, float param5, int param6, long param7, long __functionAddress); + public static native int callPPI(long param0, int param1, int param2, int param3, int param4, int param5, int param6, long param7, long __functionAddress); + public static native int callPPI(int param0, int param1, long param2, long param3, int param4, int param5, int param6, int param7, float param8, long __functionAddress); + public static native int callPPI(long param0, int param1, float param2, float param3, float param4, float param5, float param6, int param7, long param8, long __functionAddress); + public static native int callPPI(long param0, int param1, int param2, float param3, float param4, float param5, float param6, float param7, int param8, long param9, int param10, long __functionAddress); + public static native int callPPI(long param0, int param1, int param2, int param3, int param4, int param5, int param6, long param7, int param8, int param9, int param10, int param11, int param12, int param13, int param14, int param15, int param16, long __functionAddress); + public static native int callPJJI(long param0, long param1, long param2, long __functionAddress); + public static native int callPJPI(long param0, long param1, long param2, long __functionAddress); + public static native int callPPJI(long param0, long param1, long param2, long __functionAddress); + public static native int callPPPI(long param0, long param1, long param2, long __functionAddress); + public static native int callPJJI(long param0, long param1, long param2, float param3, long __functionAddress); + public static native int callPJJI(long param0, long param1, long param2, int param3, long __functionAddress); + public static native int callPJPI(long param0, int param1, long param2, long param3, long __functionAddress); + public static native int callPJPI(long param0, long param1, int param2, long param3, long __functionAddress); + public static native int callPPJI(long param0, int param1, long param2, long param3, long __functionAddress); + public static native int callPPJI(long param0, long param1, int param2, long param3, long __functionAddress); + public static native int callPPNI(long param0, int param1, long param2, long param3, long __functionAddress); + public static native int callPPPI(long param0, int param1, long param2, long param3, long __functionAddress); + public static native int callPPPI(long param0, long param1, int param2, long param3, long __functionAddress); + public static native int callPPPI(long param0, long param1, long param2, int param3, long __functionAddress); + public static native int callPJJI(long param0, long param1, int param2, long param3, int param4, long __functionAddress); + public static native int callPJPI(long param0, int param1, long param2, long param3, int param4, long __functionAddress); + public static native int callPPJI(long param0, int param1, long param2, int param3, long param4, long __functionAddress); + public static native int callPPPI(int param0, long param1, int param2, long param3, long param4, long __functionAddress); + public static native int callPPPI(long param0, int param1, int param2, long param3, long param4, long __functionAddress); + public static native int callPPPI(long param0, int param1, long param2, long param3, int param4, long __functionAddress); + public static native int callPPPI(long param0, long param1, int param2, long param3, int param4, long __functionAddress); + public static native int callPPPI(long param0, long param1, long param2, int param3, int param4, long __functionAddress); + public static native int callPPPI(long param0, int param1, int param2, int param3, long param4, long param5, long __functionAddress); + public static native int callPPPI(long param0, int param1, int param2, long param3, int param4, long param5, long __functionAddress); + public static native int callPPPI(long param0, int param1, long param2, long param3, int param4, int param5, long __functionAddress); + public static native int callPPPI(long param0, long param1, int param2, int param3, int param4, long param5, long __functionAddress); + public static native int callPPPI(long param0, long param1, long param2, int param3, int param4, int param5, long __functionAddress); + public static native int callPPPI(long param0, float param1, float param2, int param3, int param4, long param5, long param6, long __functionAddress); + public static native int callPPPI(long param0, int param1, int param2, int param3, int param4, long param5, long param6, long __functionAddress); + public static native int callPPPI(long param0, int param1, long param2, long param3, int param4, int param5, int param6, long __functionAddress); + public static native int callPPPI(long param0, long param1, int param2, int param3, int param4, int param5, long param6, long __functionAddress); + public static native int callJPPI(int param0, int param1, int param2, int param3, int param4, long param5, long param6, long param7, long __functionAddress); + public static native int callJJPPI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int callPJJJI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int callPJJPI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int callPJPPI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int callPPJPI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int callPPNPI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int callPPPPI(long param0, long param1, long param2, long param3, long __functionAddress); + public static native int callPJJJI(long param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native int callPJPPI(long param0, long param1, int param2, long param3, long param4, long __functionAddress); + public static native int callPPPPI(long param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native int callPPPPI(long param0, long param1, int param2, long param3, long param4, long __functionAddress); + public static native int callPPPPI(long param0, long param1, long param2, int param3, long param4, long __functionAddress); + public static native int callPPPPI(long param0, long param1, long param2, long param3, int param4, long __functionAddress); + public static native int callPJPPI(long param0, long param1, int param2, int param3, long param4, long param5, long __functionAddress); + public static native int callPPPPI(long param0, int param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native int callPPPPI(long param0, int param1, long param2, long param3, int param4, long param5, long __functionAddress); + public static native int callPPPPI(long param0, int param1, long param2, long param3, long param4, int param5, long __functionAddress); + public static native int callPPPPI(long param0, long param1, int param2, long param3, int param4, long param5, long __functionAddress); + public static native int callPPPPI(long param0, long param1, long param2, int param3, int param4, long param5, long __functionAddress); + public static native int callPPPPI(long param0, long param1, long param2, int param3, long param4, int param5, long __functionAddress); + public static native int callPPPPI(long param0, int param1, int param2, int param3, long param4, long param5, long param6, long __functionAddress); + public static native int callPPPPI(int param0, long param1, long param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, int param11, int param12, int param13, int param14, int param15, int param16, int param17, int param18, int param19, int param20, long param21, long param22, long __functionAddress); + public static native int callPJJPPI(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native int callPJPPPI(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native int callPPJPPI(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native int callPPPPPI(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native int callPJJJPI(long param0, long param1, long param2, long param3, int param4, long param5, long __functionAddress); + public static native int callPJPPPI(long param0, long param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native int callPPPPPI(long param0, int param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native int callPPPPPI(long param0, long param1, long param2, int param3, long param4, long param5, long __functionAddress); + public static native int callPPPPPI(long param0, long param1, long param2, long param3, int param4, long param5, long __functionAddress); + public static native int callPPPPPI(int param0, int param1, long param2, long param3, long param4, long param5, long param6, long __functionAddress); + public static native int callPPPPPI(long param0, int param1, int param2, long param3, long param4, long param5, long param6, long __functionAddress); + public static native int callPPPPPI(long param0, int param1, long param2, int param3, long param4, long param5, long param6, long __functionAddress); + public static native int callPPPPPI(long param0, int param1, long param2, long param3, int param4, long param5, long param6, long __functionAddress); + public static native int callJPPPPI(int param0, int param1, long param2, long param3, int param4, long param5, long param6, long param7, long __functionAddress); + public static native int callPJPPJI(long param0, long param1, int param2, int param3, long param4, long param5, long param6, int param7, long __functionAddress); + public static native int callPJJJJPI(long param0, long param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native int callPPPPJPI(long param0, long param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native int callPPPPPPI(long param0, long param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native int callPJJPPPI(long param0, long param1, long param2, int param3, long param4, long param5, long param6, long __functionAddress); + public static native int callPJPPPPI(long param0, int param1, long param2, long param3, long param4, long param5, long param6, long __functionAddress); + public static native int callPPPPPPI(int param0, int param1, long param2, long param3, long param4, long param5, long param6, long param7, long __functionAddress); + public static native int callPPPPPPI(long param0, int param1, long param2, int param3, long param4, long param5, long param6, long param7, long __functionAddress); + public static native int callPPPPPPPI(long param0, long param1, long param2, long param3, long param4, long param5, long param6, int param7, long __functionAddress); + public static native int callPPPPPPPI(long param0, int param1, long param2, int param3, long param4, long param5, long param6, long param7, long param8, long __functionAddress); + public static native int callPPPPPJPPI(long param0, long param1, long param2, long param3, long param4, long param5, long param6, long param7, long __functionAddress); + public static native int callPPPPPPPPI(long param0, int param1, int param2, long param3, long param4, long param5, long param6, int param7, long param8, long param9, long param10, long __functionAddress); + public static native long callJ(long __functionAddress); + public static native long callJ(int param0, long __functionAddress); + public static native long callJ(int param0, int param1, long __functionAddress); + public static native long callJ(int param0, int param1, boolean param2, int param3, int param4, long __functionAddress); + public static native long callPPJ(long param0, long param1, long __functionAddress); + public static native long callPJJ(long param0, long param1, int param2, int param3, long __functionAddress); + public static native long callPN(long param0, long __functionAddress); + public static native long callP(long __functionAddress); + public static native long callP(int param0, long __functionAddress); + public static native long callP(int param0, int param1, long __functionAddress); + public static native long callP(int param0, float param1, float param2, float param3, long __functionAddress); + public static native long callPP(long param0, long __functionAddress); + public static native long callPP(int param0, long param1, long __functionAddress); + public static native long callPP(long param0, int param1, long __functionAddress); + public static native long callPP(int param0, int param1, long param2, long __functionAddress); + public static native long callPP(int param0, long param1, int param2, long __functionAddress); + public static native long callPP(long param0, int param1, int param2, long __functionAddress); + public static native long callPP(int param0, int param1, long param2, int param3, long __functionAddress); + public static native long callPNP(long param0, long param1, long __functionAddress); + public static native long callPPP(long param0, long param1, long __functionAddress); + public static native long callPPP(int param0, long param1, long param2, long __functionAddress); + public static native long callPPP(long param0, int param1, long param2, long __functionAddress); + public static native long callPPP(long param0, long param1, int param2, long __functionAddress); + public static native long callPPP(int param0, long param1, long param2, int param3, long __functionAddress); + public static native long callPPP(long param0, int param1, int param2, long param3, long __functionAddress); + public static native long callPPP(int param0, int param1, int param2, long param3, long param4, long __functionAddress); + public static native long callPPP(long param0, int param1, int param2, int param3, long param4, long __functionAddress); + public static native long callPPP(long param0, long param1, int param2, int param3, int param4, long __functionAddress); + public static native long callPPNP(long param0, long param1, long param2, long __functionAddress); + public static native long callPPPP(long param0, long param1, long param2, long __functionAddress); + public static native long callPPPP(long param0, int param1, long param2, long param3, long __functionAddress); + public static native long callPPPP(long param0, long param1, int param2, long param3, long __functionAddress); + public static native long callPPPP(long param0, long param1, long param2, int param3, long __functionAddress); + public static native long callPPPP(long param0, long param1, int param2, int param3, long param4, long __functionAddress); + public static native long callPPPP(long param0, long param1, int param2, long param3, int param4, long __functionAddress); + public static native long callPPNPP(long param0, long param1, long param2, long param3, long __functionAddress); + public static native long callPPPPP(long param0, long param1, long param2, long param3, long __functionAddress); + public static native long callPPPPP(long param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native long callPPPPP(long param0, long param1, int param2, long param3, long param4, long __functionAddress); + public static native long callPPPPP(long param0, long param1, long param2, int param3, long param4, long __functionAddress); + public static native long callPPPPP(long param0, long param1, long param2, long param3, int param4, long __functionAddress); + public static native long callPPPJPP(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native long callPPPPJPPP(long param0, long param1, long param2, long param3, long param4, long param5, long param6, long __functionAddress); + public static native long callPPPPPPPP(int param0, long param1, long param2, int param3, int param4, int param5, int param6, long param7, long param8, long param9, int param10, long param11, long param12, long __functionAddress); + public static native short callS(int param0, long __functionAddress); + public static native void callV(long __functionAddress); + public static native void callV(double param0, long __functionAddress); + public static native void callV(float param0, long __functionAddress); + public static native void callV(int param0, long __functionAddress); + public static native void callV(boolean param0, long __functionAddress); + public static native void callV(double param0, double param1, long __functionAddress); + public static native void callV(float param0, float param1, long __functionAddress); + public static native void callV(float param0, boolean param1, long __functionAddress); + public static native void callV(int param0, double param1, long __functionAddress); + public static native void callV(int param0, float param1, long __functionAddress); + public static native void callV(int param0, int param1, long __functionAddress); + public static native void callV(int param0, boolean param1, long __functionAddress); + public static native void callV(double param0, double param1, double param2, long __functionAddress); + public static native void callV(float param0, float param1, float param2, long __functionAddress); + public static native void callV(int param0, double param1, double param2, long __functionAddress); + public static native void callV(int param0, float param1, float param2, long __functionAddress); + public static native void callV(int param0, int param1, double param2, long __functionAddress); + public static native void callV(int param0, int param1, float param2, long __functionAddress); + public static native void callV(int param0, int param1, int param2, long __functionAddress); + public static native void callV(int param0, int param1, boolean param2, long __functionAddress); + public static native void callV(double param0, double param1, double param2, double param3, long __functionAddress); + public static native void callV(float param0, float param1, float param2, float param3, long __functionAddress); + public static native void callV(int param0, double param1, double param2, double param3, long __functionAddress); + public static native void callV(int param0, float param1, float param2, float param3, long __functionAddress); + public static native void callV(int param0, int param1, double param2, double param3, long __functionAddress); + public static native void callV(int param0, int param1, float param2, float param3, long __functionAddress); + public static native void callV(int param0, int param1, float param2, int param3, long __functionAddress); + public static native void callV(int param0, int param1, int param2, double param3, long __functionAddress); + public static native void callV(int param0, int param1, int param2, float param3, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, long __functionAddress); + public static native void callV(int param0, int param1, int param2, boolean param3, long __functionAddress); + public static native void callV(int param0, int param1, boolean param2, int param3, long __functionAddress); + public static native void callV(boolean param0, boolean param1, boolean param2, boolean param3, long __functionAddress); + public static native void callV(int param0, double param1, double param2, double param3, double param4, long __functionAddress); + public static native void callV(int param0, float param1, float param2, float param3, float param4, long __functionAddress); + public static native void callV(int param0, int param1, double param2, double param3, double param4, long __functionAddress); + public static native void callV(int param0, int param1, float param2, float param3, float param4, long __functionAddress); + public static native void callV(int param0, int param1, int param2, float param3, int param4, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, long __functionAddress); + public static native void callV(int param0, int param1, int param2, boolean param3, int param4, long __functionAddress); + public static native void callV(int param0, boolean param1, boolean param2, boolean param3, boolean param4, long __functionAddress); + public static native void callV(double param0, double param1, double param2, double param3, double param4, double param5, long __functionAddress); + public static native void callV(int param0, double param1, double param2, int param3, double param4, double param5, long __functionAddress); + public static native void callV(int param0, float param1, float param2, int param3, float param4, float param5, long __functionAddress); + public static native void callV(int param0, int param1, double param2, double param3, double param4, double param5, long __functionAddress); + public static native void callV(int param0, int param1, float param2, float param3, float param4, float param5, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, int param5, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, boolean param5, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, boolean param4, int param5, long __functionAddress); + public static native void callV(int param0, double param1, double param2, double param3, double param4, double param5, double param6, long __functionAddress); + public static native void callV(int param0, int param1, int param2, double param3, double param4, double param5, double param6, long __functionAddress); + public static native void callV(int param0, int param1, int param2, float param3, float param4, float param5, float param6, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, int param5, boolean param6, long __functionAddress); + public static native void callV(int param0, int param1, int param2, boolean param3, int param4, int param5, int param6, long __functionAddress); + public static native void callV(float param0, float param1, float param2, float param3, float param4, float param5, float param6, float param7, long __functionAddress); + public static native void callV(int param0, int param1, int param2, float param3, float param4, float param5, float param6, float param7, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, boolean param7, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, boolean param8, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, long __functionAddress); + public static native void callV(int param0, int param1, float param2, float param3, float param4, float param5, float param6, float param7, float param8, float param9, float param10, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, int param11, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, int param11, int param12, int param13, int param14, long __functionAddress); + public static native void callV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, int param11, int param12, int param13, int param14, int param15, int param16, long __functionAddress); + public static native void callJV(long param0, long __functionAddress); + public static native void callPV(long param0, long __functionAddress); + public static native void callSV(short param0, long __functionAddress); + public static native void callUV(byte param0, long __functionAddress); + public static native void callCV(int param0, short param1, long __functionAddress); + public static native void callJV(int param0, long param1, long __functionAddress); + public static native void callJV(long param0, int param1, long __functionAddress); + public static native void callPV(int param0, long param1, long __functionAddress); + public static native void callPV(long param0, float param1, long __functionAddress); + public static native void callPV(long param0, int param1, long __functionAddress); + public static native void callSV(int param0, short param1, long __functionAddress); + public static native void callJV(int param0, int param1, long param2, long __functionAddress); + public static native void callPV(int param0, int param1, long param2, long __functionAddress); + public static native void callPV(int param0, long param1, int param2, long __functionAddress); + public static native void callPV(long param0, float param1, float param2, long __functionAddress); + public static native void callPV(long param0, int param1, int param2, long __functionAddress); + public static native void callJV(int param0, long param1, int param2, int param3, long __functionAddress); + public static native void callNV(long param0, int param1, int param2, int param3, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, long param3, long __functionAddress); + public static native void callPV(int param0, int param1, long param2, int param3, long __functionAddress); + public static native void callPV(int param0, int param1, boolean param2, long param3, long __functionAddress); + public static native void callPV(int param0, long param1, int param2, int param3, long __functionAddress); + public static native void callPV(long param0, float param1, float param2, float param3, long __functionAddress); + public static native void callPV(long param0, int param1, int param2, int param3, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, long param4, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, long param3, int param4, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, long param3, boolean param4, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, boolean param3, long param4, long __functionAddress); + public static native void callPV(int param0, int param1, long param2, int param3, int param4, long __functionAddress); + public static native void callPV(int param0, long param1, int param2, int param3, int param4, long __functionAddress); + public static native void callPV(int param0, boolean param1, int param2, int param3, long param4, long __functionAddress); + public static native void callPV(long param0, int param1, int param2, int param3, int param4, long __functionAddress); + public static native void callJV(int param0, int param1, int param2, int param3, int param4, long param5, long __functionAddress); + public static native void callPV(int param0, double param1, double param2, int param3, int param4, long param5, long __functionAddress); + public static native void callPV(int param0, float param1, float param2, int param3, int param4, long param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, long param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, long param4, boolean param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, long param3, int param4, int param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, boolean param3, int param4, long param5, long __functionAddress); + public static native void callPV(int param0, int param1, long param2, int param3, int param4, int param5, long __functionAddress); + public static native void callPV(int param0, boolean param1, int param2, int param3, int param4, long param5, long __functionAddress); + public static native void callPV(long param0, int param1, int param2, int param3, int param4, int param5, long __functionAddress); + public static native void callJV(int param0, int param1, int param2, int param3, int param4, int param5, long param6, long __functionAddress); + public static native void callPV(int param0, int param1, float param2, float param3, float param4, float param5, long param6, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, long param6, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, long param5, int param6, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, long param3, int param4, int param5, int param6, long __functionAddress); + public static native void callPV(int param0, int param1, long param2, int param3, int param4, int param5, int param6, long __functionAddress); + public static native void callPV(long param0, int param1, int param2, int param3, int param4, int param5, int param6, long __functionAddress); + public static native void callJV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, long param7, long __functionAddress); + public static native void callJV(int param0, int param1, int param2, int param3, int param4, boolean param5, int param6, long param7, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, long param7, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, boolean param5, int param6, long param7, long __functionAddress); + public static native void callJV(int param0, int param1, int param2, int param3, int param4, int param5, boolean param6, int param7, long param8, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, long param8, long __functionAddress); + public static native void callPV(int param0, int param1, long param2, int param3, int param4, int param5, int param6, int param7, float param8, long __functionAddress); + public static native void callPV(int param0, double param1, double param2, int param3, int param4, double param5, double param6, int param7, int param8, long param9, long __functionAddress); + public static native void callPV(int param0, float param1, float param2, int param3, int param4, float param5, float param6, int param7, int param8, long param9, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, long param9, long __functionAddress); + public static native void callJV(long param0, int param1, float param2, float param3, float param4, float param5, float param6, float param7, float param8, float param9, float param10, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, long param10, long __functionAddress); + public static native void callPV(long param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, long __functionAddress); + public static native void callJV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, long param10, boolean param11, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, long param11, long __functionAddress); + public static native void callPJV(long param0, long param1, long __functionAddress); + public static native void callPPV(long param0, long param1, long __functionAddress); + public static native void callSSV(short param0, short param1, long __functionAddress); + public static native void callJJV(int param0, long param1, long param2, long __functionAddress); + public static native void callPCV(long param0, int param1, short param2, long __functionAddress); + public static native void callPJV(long param0, int param1, long param2, long __functionAddress); + public static native void callPJV(long param0, long param1, float param2, long __functionAddress); + public static native void callPJV(long param0, long param1, int param2, long __functionAddress); + public static native void callPPV(int param0, long param1, long param2, long __functionAddress); + public static native void callPPV(long param0, int param1, long param2, long __functionAddress); + public static native void callPPV(long param0, long param1, int param2, long __functionAddress); + public static native void callSSV(int param0, short param1, short param2, long __functionAddress); + public static native void callJJV(int param0, int param1, long param2, long param3, long __functionAddress); + public static native void callJPV(int param0, int param1, long param2, long param3, long __functionAddress); + public static native void callJPV(int param0, long param1, int param2, long param3, long __functionAddress); + public static native void callPJV(int param0, long param1, int param2, long param3, long __functionAddress); + public static native void callPJV(long param0, int param1, long param2, int param3, long __functionAddress); + public static native void callPJV(long param0, long param1, int param2, int param3, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, long param3, long __functionAddress); + public static native void callPPV(int param0, long param1, int param2, long param3, long __functionAddress); + public static native void callPPV(int param0, long param1, long param2, int param3, long __functionAddress); + public static native void callPPV(int param0, long param1, long param2, boolean param3, long __functionAddress); + public static native void callPPV(long param0, int param1, int param2, long param3, long __functionAddress); + public static native void callPPV(long param0, long param1, int param2, int param3, long __functionAddress); + public static native void callPJV(long param0, long param1, int param2, int param3, int param4, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, long param3, long param4, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, int param3, long param4, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, long param3, int param4, long __functionAddress); + public static native void callPPV(int param0, long param1, int param2, long param3, int param4, long __functionAddress); + public static native void callPPV(int param0, long param1, long param2, int param3, int param4, long __functionAddress); + public static native void callPPV(long param0, int param1, int param2, int param3, long param4, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, int param3, long param4, long param5, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, int param3, int param4, long param5, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, long param3, int param4, int param5, long __functionAddress); + public static native void callPPV(int param0, long param1, long param2, int param3, int param4, int param5, long __functionAddress); + public static native void callPPV(long param0, int param1, long param2, int param3, int param4, int param5, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, int param3, int param4, long param5, long param6, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, long param3, int param4, int param5, long param6, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, int param3, int param4, int param5, long param6, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, long param3, int param4, int param5, int param6, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, int param3, int param4, int param5, long param6, long param7, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, int param3, long param4, int param5, int param6, long param7, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, int param3, int param4, int param5, int param6, long param7, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, long param3, int param4, float param5, float param6, int param7, long param8, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, int param3, int param4, int param5, int param6, int param7, long param8, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, int param3, int param4, int param5, long param6, int param7, int param8, float param9, long __functionAddress); + public static native void callBBBV(byte param0, byte param1, byte param2, long __functionAddress); + public static native void callCCCV(short param0, short param1, short param2, long __functionAddress); + public static native void callPJJV(long param0, long param1, long param2, long __functionAddress); + public static native void callPJPV(long param0, long param1, long param2, long __functionAddress); + public static native void callPPNV(long param0, long param1, long param2, long __functionAddress); + public static native void callPPPV(long param0, long param1, long param2, long __functionAddress); + public static native void callSSSV(short param0, short param1, short param2, long __functionAddress); + public static native void callUUUV(byte param0, byte param1, byte param2, long __functionAddress); + public static native void callJJJV(int param0, long param1, long param2, long param3, long __functionAddress); + public static native void callPJJV(long param0, long param1, long param2, int param3, long __functionAddress); + public static native void callPJPV(long param0, long param1, int param2, long param3, long __functionAddress); + public static native void callPPPV(int param0, long param1, long param2, long param3, long __functionAddress); + public static native void callPPPV(long param0, int param1, long param2, long param3, long __functionAddress); + public static native void callPPPV(long param0, long param1, int param2, long param3, long __functionAddress); + public static native void callSSSV(int param0, short param1, short param2, short param3, long __functionAddress); + public static native void callJJJV(int param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native void callPJJV(long param0, int param1, long param2, long param3, int param4, long __functionAddress); + public static native void callPJJV(long param0, long param1, long param2, int param3, int param4, long __functionAddress); + public static native void callPPPV(int param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native void callPPPV(int param0, long param1, int param2, long param3, long param4, long __functionAddress); + public static native void callPPPV(int param0, long param1, long param2, int param3, long param4, long __functionAddress); + public static native void callPPPV(int param0, long param1, long param2, long param3, int param4, long __functionAddress); + public static native void callPPPV(long param0, int param1, int param2, long param3, long param4, long __functionAddress); + public static native void callPPPV(long param0, int param1, long param2, int param3, long param4, long __functionAddress); + public static native void callPJPV(long param0, int param1, long param2, int param3, int param4, long param5, long __functionAddress); + public static native void callPJPV(long param0, long param1, int param2, int param3, int param4, long param5, long __functionAddress); + public static native void callPPJV(int param0, long param1, long param2, int param3, long param4, boolean param5, long __functionAddress); + public static native void callPPJV(long param0, int param1, long param2, int param3, long param4, int param5, long __functionAddress); + public static native void callPPPV(int param0, int param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native void callPPPV(int param0, int param1, long param2, int param3, long param4, long param5, long __functionAddress); + public static native void callPPPV(int param0, long param1, int param2, long param3, int param4, long param5, long __functionAddress); + public static native void callPJJV(long param0, int param1, int param2, long param3, long param4, int param5, int param6, long __functionAddress); + public static native void callPPPV(int param0, int param1, int param2, int param3, long param4, long param5, long param6, long __functionAddress); + public static native void callPPPV(int param0, int param1, long param2, long param3, int param4, int param5, long param6, long __functionAddress); + public static native void callPPPV(long param0, int param1, long param2, int param3, int param4, int param5, long param6, long __functionAddress); + public static native void callPPPV(int param0, int param1, int param2, int param3, long param4, int param5, long param6, long param7, long __functionAddress); + public static native void callPPPV(long param0, int param1, int param2, int param3, int param4, int param5, long param6, long param7, long __functionAddress); + public static native void callPPPV(long param0, long param1, int param2, int param3, int param4, int param5, int param6, int param7, long param8, int param9, int param10, int param11, int param12, int param13, int param14, int param15, int param16, int param17, long __functionAddress); + public static native void callBBBBV(byte param0, byte param1, byte param2, byte param3, long __functionAddress); + public static native void callCCCCV(short param0, short param1, short param2, short param3, long __functionAddress); + public static native void callPJJPV(long param0, long param1, long param2, long param3, long __functionAddress); + public static native void callPJPPV(long param0, long param1, long param2, long param3, long __functionAddress); + public static native void callPPPNV(long param0, long param1, long param2, long param3, long __functionAddress); + public static native void callPPPPV(long param0, long param1, long param2, long param3, long __functionAddress); + public static native void callSSSSV(short param0, short param1, short param2, short param3, long __functionAddress); + public static native void callUUUUV(byte param0, byte param1, byte param2, byte param3, long __functionAddress); + public static native void callJJJJV(int param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native void callPJJJV(long param0, long param1, long param2, long param3, int param4, long __functionAddress); + public static native void callPJJPV(long param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native void callPJJPV(long param0, long param1, long param2, int param3, long param4, long __functionAddress); + public static native void callPPPPV(long param0, int param1, long param2, long param3, long param4, long __functionAddress); + public static native void callPPPPV(long param0, long param1, long param2, long param3, int param4, long __functionAddress); + public static native void callSSSSV(int param0, short param1, short param2, short param3, short param4, long __functionAddress); + public static native void callUUUUV(int param0, byte param1, byte param2, byte param3, byte param4, long __functionAddress); + public static native void callJJJJV(int param0, int param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native void callPJJPV(long param0, long param1, int param2, long param3, int param4, long param5, long __functionAddress); + public static native void callPJJPV(long param0, long param1, long param2, int param3, int param4, long param5, long __functionAddress); + public static native void callPJPPV(long param0, long param1, int param2, long param3, int param4, long param5, long __functionAddress); + public static native void callPPPPV(int param0, long param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native void callPPPPV(int param0, long param1, long param2, long param3, long param4, int param5, long __functionAddress); + public static native void callPPPPV(long param0, int param1, int param2, long param3, long param4, long param5, long __functionAddress); + public static native void callPJJPV(long param0, long param1, int param2, int param3, long param4, int param5, long param6, long __functionAddress); + public static native void callPJJPV(long param0, long param1, int param2, long param3, int param4, int param5, long param6, long __functionAddress); + public static native void callPJPPV(long param0, int param1, long param2, int param3, int param4, long param5, long param6, long __functionAddress); + public static native void callPPPPV(int param0, int param1, int param2, long param3, long param4, long param5, long param6, long __functionAddress); + public static native void callPPPPV(int param0, int param1, long param2, long param3, long param4, long param5, int param6, long __functionAddress); + public static native void callPJJPV(long param0, long param1, int param2, long param3, int param4, int param5, long param6, int param7, long __functionAddress); + public static native void callPJPPV(long param0, int param1, long param2, int param3, int param4, long param5, int param6, long param7, long __functionAddress); + public static native void callPPPPV(long param0, int param1, int param2, int param3, int param4, long param5, int param6, long param7, int param8, long param9, long __functionAddress); + public static native void callPJJJPV(long param0, long param1, long param2, long param3, long param4, long __functionAddress); + public static native void callPPPPPV(long param0, int param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native void callPJJJJV(long param0, long param1, long param2, long param3, long param4, int param5, int param6, long __functionAddress); + public static native void callPPPPPV(int param0, int param1, long param2, long param3, long param4, long param5, long param6, long __functionAddress); + public static native void callPPPPPV(long param0, int param1, int param2, long param3, long param4, long param5, long param6, long __functionAddress); + public static native void callPJJJJV(long param0, long param1, int param2, int param3, long param4, long param5, long param6, int param7, long __functionAddress); + public static native void callPJPPPV(long param0, int param1, int param2, long param3, long param4, int param5, long param6, long param7, long __functionAddress); + public static native void callPPPPPV(long param0, long param1, long param2, long param3, long param4, int param5, int param6, int param7, long __functionAddress); + public static native void callPPPPPV(long param0, int param1, long param2, int param3, int param4, int param5, long param6, int param7, long param8, int param9, long param10, long __functionAddress); + public static native void callPPPPPJV(long param0, long param1, long param2, long param3, long param4, long param5, long __functionAddress); + public static native void callPPPPPPV(long param0, long param1, long param2, int param3, int param4, long param5, long param6, long param7, long __functionAddress); + public static native void callPPPPPPPV(int param0, int param1, int param2, long param3, int param4, long param5, long param6, long param7, long param8, long param9, long param10, long __functionAddress); + public static native void callPPJJJJJJV(long param0, long param1, long param2, long param3, int param4, long param5, long param6, long param7, long param8, long __functionAddress); + public static native void callPJJJJJJJJJJJV(long param0, long param1, long param2, long param3, long param4, long param5, long param6, long param7, long param8, long param9, long param10, long param11, int param12, int param13, int param14, long __functionAddress); + public static native boolean callZ(int param0, long __functionAddress); + public static native boolean callZ(int param0, int param1, long __functionAddress); + public static native boolean callZ(int param0, float param1, float param2, long __functionAddress); + public static native boolean callZ(int param0, int param1, float param2, float param3, long __functionAddress); + public static native boolean callJZ(long param0, long __functionAddress); + public static native boolean callPZ(long param0, long __functionAddress); + public static native boolean callJZ(int param0, long param1, long __functionAddress); + public static native boolean callPZ(int param0, long param1, long __functionAddress); + public static native boolean callJZ(int param0, long param1, int param2, long __functionAddress); + public static native boolean callPPZ(int param0, long param1, long param2, long __functionAddress); + public static native boolean callPPPPZ(int param0, int param1, int param2, float param3, long param4, long param5, long param6, long param7, long __functionAddress); + + // Array API + + public static native int invokePPI(int param0, long param1, @Nullable int[] param2, long __functionAddress); + public static native int invokePPPPI(long param0, long param1, long param2, @Nullable long[] param3, long __functionAddress); + public static native int invokePPPPPI(long param0, @Nullable int[] param1, @Nullable int[] param2, @Nullable int[] param3, long param4, long __functionAddress); + public static native int invokePNNPPPI(long param0, long param1, long param2, int param3, int param4, @Nullable int[] param5, @Nullable int[] param6, long param7, long __functionAddress); + public static native long invokePPP(long param0, @Nullable int[] param1, long __functionAddress); + public static native void invokePV(int param0, @Nullable double[] param1, long __functionAddress); + public static native void invokePV(int param0, @Nullable float[] param1, long __functionAddress); + public static native void invokePV(int param0, @Nullable int[] param1, long __functionAddress); + public static native void invokePV(int param0, int param1, @Nullable double[] param2, long __functionAddress); + public static native void invokePV(int param0, int param1, @Nullable float[] param2, long __functionAddress); + public static native void invokePV(int param0, int param1, @Nullable int[] param2, long __functionAddress); + public static native void invokePV(int param0, int param1, @Nullable long[] param2, long __functionAddress); + public static native void invokePV(int param0, @Nullable int[] param1, boolean param2, long __functionAddress); + public static native void invokePV(int param0, int param1, @Nullable float[] param2, int param3, int param4, long __functionAddress); + public static native void invokePV(int param0, int param1, @Nullable int[] param2, int param3, int param4, long __functionAddress); + public static native void invokePV(int param0, int param1, @Nullable short[] param2, int param3, int param4, long __functionAddress); + public static native void invokePV(int param0, int param1, int param2, int param3, int param4, @Nullable double[] param5, long __functionAddress); + public static native void invokePV(int param0, int param1, int param2, int param3, int param4, @Nullable float[] param5, long __functionAddress); + public static native void invokePV(int param0, int param1, int param2, int param3, int param4, @Nullable int[] param5, long __functionAddress); + public static native void invokePV(int param0, int param1, int param2, int param3, int param4, @Nullable short[] param5, long __functionAddress); + public static native void invokePV(int param0, int param1, int param2, int param3, int param4, int param5, @Nullable double[] param6, long __functionAddress); + public static native void invokePV(int param0, int param1, int param2, int param3, int param4, int param5, @Nullable float[] param6, long __functionAddress); + public static native void invokePV(int param0, int param1, int param2, int param3, int param4, int param5, @Nullable int[] param6, long __functionAddress); + public static native void invokePV(int param0, int param1, int param2, int param3, int param4, int param5, @Nullable short[] param6, long __functionAddress); + public static native void invokePJV(int param0, @Nullable int[] param1, long param2, long __functionAddress); + public static native void invokePPV(long param0, @Nullable float[] param1, int param2, long __functionAddress); + public static native void invokePPV(long param0, @Nullable int[] param1, int param2, long __functionAddress); + public static native void invokePPV(long param0, @Nullable short[] param1, int param2, long __functionAddress); + public static native void invokePPV(long param0, int param1, int param2, @Nullable int[] param3, long __functionAddress); + public static native void invokePPV(long param0, int param1, int param2, @Nullable long[] param3, long __functionAddress); + public static native void invokePNPV(long param0, long param1, @Nullable short[] param2, long __functionAddress); + public static native void invokePPPV(long param0, @Nullable double[] param1, @Nullable double[] param2, long __functionAddress); + public static native void invokePPPV(long param0, @Nullable float[] param1, @Nullable float[] param2, long __functionAddress); + public static native void invokePPPV(long param0, @Nullable int[] param1, @Nullable int[] param2, long __functionAddress); + public static native void invokePPPV(@Nullable int[] param0, @Nullable int[] param1, @Nullable int[] param2, long __functionAddress); + public static native void invokePPPV(int param0, @Nullable float[] param1, @Nullable float[] param2, @Nullable float[] param3, long __functionAddress); + public static native void invokePPPV(int param0, int param1, @Nullable double[] param2, @Nullable double[] param3, @Nullable double[] param4, long __functionAddress); + public static native void invokePPPV(int param0, int param1, @Nullable float[] param2, @Nullable float[] param3, @Nullable float[] param4, long __functionAddress); + public static native void invokePPPV(int param0, int param1, @Nullable long[] param2, @Nullable long[] param3, @Nullable long[] param4, long __functionAddress); + public static native void invokePNPPV(long param0, long param1, long param2, @Nullable short[] param3, long __functionAddress); + public static native void invokePPPPPV(long param0, @Nullable int[] param1, @Nullable int[] param2, @Nullable int[] param3, @Nullable int[] param4, long __functionAddress); + public static native boolean invokePPZ(long param0, @Nullable int[] param1, long __functionAddress); + public static native boolean invokePPPZ(long param0, long param1, @Nullable int[] param2, long __functionAddress); + public static native int callPI(@Nullable int[] param0, long __functionAddress); + public static native int callPI(int param0, @Nullable int[] param1, long __functionAddress); + public static native int callPI(@Nullable int[] param0, int param1, long __functionAddress); + public static native int callPI(int param0, int param1, @Nullable int[] param2, long __functionAddress); + public static native int callPI(int param0, @Nullable int[] param1, int param2, long __functionAddress); + public static native int callPI(int param0, int param1, int param2, @Nullable int[] param3, long __functionAddress); + public static native int callPI(int param0, int param1, int param2, int param3, @Nullable float[] param4, long __functionAddress); + public static native int callPI(int param0, int param1, int param2, int param3, @Nullable int[] param4, long __functionAddress); + public static native int callPPI(long param0, @Nullable int[] param1, long __functionAddress); + public static native int callPPI(@Nullable int[] param0, long param1, long __functionAddress); + public static native int callPPI(int param0, long param1, @Nullable int[] param2, long __functionAddress); + public static native int callPPI(long param0, int param1, @Nullable int[] param2, long __functionAddress); + public static native int callPPI(long param0, int param1, @Nullable long[] param2, long __functionAddress); + public static native int callPPI(long param0, int param1, int param2, @Nullable int[] param3, long __functionAddress); + public static native int callPPI(long param0, int param1, int param2, @Nullable long[] param3, long __functionAddress); + public static native int callPPI(int param0, long param1, int param2, int param3, float param4, @Nullable int[] param5, long __functionAddress); + public static native int callPJPI(long param0, long param1, @Nullable int[] param2, long __functionAddress); + public static native int callPJPI(long param0, long param1, @Nullable long[] param2, long __functionAddress); + public static native int callPPPI(long param0, long param1, @Nullable int[] param2, long __functionAddress); + public static native int callPPPI(long param0, long param1, @Nullable long[] param2, long __functionAddress); + public static native int callPPPI(long param0, @Nullable int[] param1, long param2, long __functionAddress); + public static native int callPPPI(long param0, @Nullable int[] param1, @Nullable int[] param2, long __functionAddress); + public static native int callPPPI(@Nullable int[] param0, long param1, @Nullable int[] param2, long __functionAddress); + public static native int callPJPI(long param0, int param1, long param2, @Nullable int[] param3, long __functionAddress); + public static native int callPJPI(long param0, long param1, int param2, @Nullable long[] param3, long __functionAddress); + public static native int callPPPI(long param0, int param1, @Nullable int[] param2, @Nullable int[] param3, long __functionAddress); + public static native int callPPPI(long param0, int param1, @Nullable int[] param2, @Nullable long[] param3, long __functionAddress); + public static native int callPPPI(long param0, long param1, int param2, @Nullable int[] param3, long __functionAddress); + public static native int callPPPI(long param0, long param1, int param2, @Nullable long[] param3, long __functionAddress); + public static native int callPPPI(long param0, long param1, @Nullable int[] param2, int param3, long __functionAddress); + public static native int callPPJI(long param0, int param1, @Nullable long[] param2, int param3, long param4, long __functionAddress); + public static native int callPPPI(long param0, int param1, int param2, long param3, @Nullable int[] param4, long __functionAddress); + public static native int callPPPI(long param0, int param1, int param2, int param3, @Nullable int[] param4, @Nullable float[] param5, long __functionAddress); + public static native int callPPPI(long param0, int param1, int param2, int param3, @Nullable int[] param4, @Nullable int[] param5, long __functionAddress); + public static native int callPJPPI(long param0, long param1, long param2, @Nullable int[] param3, long __functionAddress); + public static native int callPJPPI(long param0, long param1, long param2, @Nullable long[] param3, long __functionAddress); + public static native int callPJPPI(long param0, long param1, @Nullable int[] param2, long param3, long __functionAddress); + public static native int callPJPPI(long param0, long param1, @Nullable int[] param2, @Nullable int[] param3, long __functionAddress); + public static native int callPJPPI(long param0, long param1, @Nullable int[] param2, @Nullable long[] param3, long __functionAddress); + public static native int callPPNPI(long param0, long param1, long param2, @Nullable long[] param3, long __functionAddress); + public static native int callPPPPI(long param0, long param1, long param2, @Nullable long[] param3, long __functionAddress); + public static native int callPPPPI(long param0, long param1, @Nullable int[] param2, long param3, long __functionAddress); + public static native int callPPPPI(long param0, long param1, @Nullable int[] param2, @Nullable int[] param3, long __functionAddress); + public static native int callPPPPI(long param0, int param1, long param2, long param3, @Nullable long[] param4, long __functionAddress); + public static native int callPPPPI(long param0, int param1, long param2, @Nullable long[] param3, @Nullable long[] param4, long __functionAddress); + public static native int callPPPPI(long param0, int param1, @Nullable int[] param2, long param3, long param4, long __functionAddress); + public static native int callPPPPI(long param0, long param1, int param2, @Nullable long[] param3, long param4, long __functionAddress); + public static native int callPPPPI(long param0, long param1, long param2, int param3, @Nullable int[] param4, long __functionAddress); + public static native int callPPPPI(long param0, @Nullable int[] param1, long param2, int param3, @Nullable int[] param4, long __functionAddress); + public static native int callPPPPI(long param0, int param1, int param2, @Nullable long[] param3, @Nullable int[] param4, @Nullable int[] param5, long __functionAddress); + public static native int callPPPPI(int param0, @Nullable int[] param1, @Nullable long[] param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, int param11, int param12, int param13, int param14, int param15, int param16, int param17, int param18, int param19, int param20, @Nullable int[] param21, @Nullable long[] param22, long __functionAddress); + public static native int callPJPPPI(long param0, long param1, long param2, long param3, @Nullable long[] param4, long __functionAddress); + public static native int callPPJPPI(long param0, long param1, long param2, @Nullable int[] param3, long param4, long __functionAddress); + public static native int callPPPPPI(long param0, long param1, @Nullable int[] param2, @Nullable int[] param3, @Nullable int[] param4, long __functionAddress); + public static native int callPPPPPI(long param0, long param1, @Nullable int[] param2, @Nullable int[] param3, @Nullable long[] param4, long __functionAddress); + public static native int callPPPPPI(long param0, @Nullable int[] param1, @Nullable int[] param2, @Nullable int[] param3, long param4, long __functionAddress); + public static native int callPJPPPI(long param0, long param1, int param2, long param3, long param4, @Nullable long[] param5, long __functionAddress); + public static native int callPPPPPI(long param0, long param1, long param2, @Nullable int[] param3, int param4, @Nullable int[] param5, long __functionAddress); + public static native int callPPPPPI(long param0, @Nullable int[] param1, @Nullable float[] param2, int param3, @Nullable int[] param4, @Nullable int[] param5, long __functionAddress); + public static native int callPPPPPI(int param0, int param1, @Nullable int[] param2, @Nullable int[] param3, @Nullable int[] param4, @Nullable int[] param5, long param6, long __functionAddress); + public static native int callPPPPPI(long param0, int param1, @Nullable long[] param2, int param3, long param4, long param5, long param6, long __functionAddress); + public static native int callPJPPJI(long param0, long param1, int param2, int param3, long param4, @Nullable int[] param5, long param6, int param7, long __functionAddress); + public static native int callPJPPJI(long param0, long param1, int param2, int param3, long param4, @Nullable long[] param5, long param6, int param7, long __functionAddress); + public static native int callPJJJJPI(long param0, long param1, long param2, long param3, long param4, @Nullable int[] param5, long __functionAddress); + public static native int callPPPPPPI(long param0, @Nullable int[] param1, @Nullable int[] param2, @Nullable int[] param3, @Nullable int[] param4, @Nullable int[] param5, long __functionAddress); + public static native int callPJJPPPI(long param0, long param1, long param2, int param3, long param4, long param5, @Nullable long[] param6, long __functionAddress); + public static native int callPPPPPPI(int param0, int param1, @Nullable int[] param2, @Nullable int[] param3, @Nullable int[] param4, @Nullable int[] param5, @Nullable int[] param6, long param7, long __functionAddress); + public static native long callPP(@Nullable int[] param0, long __functionAddress); + public static native long callPPP(long param0, @Nullable int[] param1, long __functionAddress); + public static native long callPPP(int param0, long param1, @Nullable int[] param2, long __functionAddress); + public static native long callPPP(long param0, int param1, @Nullable int[] param2, long __functionAddress); + public static native long callPPP(int param0, int param1, int param2, @Nullable int[] param3, @Nullable int[] param4, long __functionAddress); + public static native long callPPP(long param0, int param1, int param2, int param3, @Nullable int[] param4, long __functionAddress); + public static native long callPPPP(long param0, long param1, @Nullable int[] param2, long __functionAddress); + public static native long callPPPP(long param0, int param1, @Nullable int[] param2, long param3, long __functionAddress); + public static native long callPPPP(long param0, long param1, int param2, @Nullable int[] param3, long __functionAddress); + public static native long callPPPP(long param0, long param1, int param2, int param3, @Nullable int[] param4, long __functionAddress); + public static native long callPPNPP(long param0, long param1, long param2, @Nullable int[] param3, long __functionAddress); + public static native long callPPPPP(long param0, long param1, long param2, @Nullable int[] param3, long __functionAddress); + public static native long callPPPPP(long param0, int param1, long param2, long param3, @Nullable int[] param4, long __functionAddress); + public static native long callPPPPP(long param0, long param1, int param2, long param3, @Nullable int[] param4, long __functionAddress); + public static native long callPPPPP(long param0, long param1, long param2, int param3, @Nullable int[] param4, long __functionAddress); + public static native long callPPPPPPPP(int param0, @Nullable int[] param1, @Nullable long[] param2, int param3, int param4, int param5, int param6, long param7, long param8, long param9, int param10, @Nullable int[] param11, @Nullable long[] param12, long __functionAddress); + public static native void callPV(@Nullable double[] param0, long __functionAddress); + public static native void callPV(@Nullable float[] param0, long __functionAddress); + public static native void callPV(@Nullable int[] param0, long __functionAddress); + public static native void callPV(@Nullable short[] param0, long __functionAddress); + public static native void callPV(int param0, @Nullable double[] param1, long __functionAddress); + public static native void callPV(int param0, @Nullable float[] param1, long __functionAddress); + public static native void callPV(int param0, @Nullable int[] param1, long __functionAddress); + public static native void callPV(int param0, @Nullable long[] param1, long __functionAddress); + public static native void callPV(int param0, @Nullable short[] param1, long __functionAddress); + public static native void callPV(int param0, int param1, @Nullable double[] param2, long __functionAddress); + public static native void callPV(int param0, int param1, @Nullable float[] param2, long __functionAddress); + public static native void callPV(int param0, int param1, @Nullable int[] param2, long __functionAddress); + public static native void callPV(int param0, int param1, @Nullable long[] param2, long __functionAddress); + public static native void callPV(int param0, int param1, @Nullable short[] param2, long __functionAddress); + public static native void callPV(int param0, @Nullable int[] param1, int param2, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, @Nullable double[] param3, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, @Nullable float[] param3, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, @Nullable int[] param3, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, @Nullable long[] param3, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, @Nullable short[] param3, long __functionAddress); + public static native void callPV(int param0, int param1, boolean param2, @Nullable double[] param3, long __functionAddress); + public static native void callPV(int param0, int param1, boolean param2, @Nullable float[] param3, long __functionAddress); + public static native void callPV(int param0, int param1, boolean param2, @Nullable int[] param3, long __functionAddress); + public static native void callPV(int param0, int param1, @Nullable int[] param2, int param3, long __functionAddress); + public static native void callPV(int param0, @Nullable int[] param1, int param2, int param3, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, @Nullable double[] param4, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, @Nullable float[] param4, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, @Nullable int[] param4, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, @Nullable long[] param4, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, @Nullable short[] param4, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, boolean param3, @Nullable double[] param4, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, boolean param3, @Nullable float[] param4, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, @Nullable int[] param3, boolean param4, long __functionAddress); + public static native void callPV(int param0, int param1, @Nullable int[] param2, int param3, int param4, long __functionAddress); + public static native void callPV(int param0, boolean param1, int param2, int param3, @Nullable int[] param4, long __functionAddress); + public static native void callPV(int param0, double param1, double param2, int param3, int param4, @Nullable double[] param5, long __functionAddress); + public static native void callPV(int param0, float param1, float param2, int param3, int param4, @Nullable float[] param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, @Nullable double[] param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, @Nullable float[] param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, @Nullable int[] param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, @Nullable short[] param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, @Nullable int[] param4, boolean param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, boolean param3, int param4, @Nullable float[] param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, boolean param3, int param4, @Nullable int[] param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, boolean param3, int param4, @Nullable short[] param5, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, @Nullable double[] param6, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, @Nullable float[] param6, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, @Nullable int[] param6, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, @Nullable short[] param6, long __functionAddress); + public static native void callPV(int param0, int param1, @Nullable int[] param2, int param3, int param4, int param5, int param6, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, @Nullable double[] param7, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, @Nullable float[] param7, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, @Nullable int[] param7, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, @Nullable short[] param7, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, @Nullable double[] param8, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, @Nullable float[] param8, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, @Nullable int[] param8, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, @Nullable short[] param8, long __functionAddress); + public static native void callPV(int param0, double param1, double param2, int param3, int param4, double param5, double param6, int param7, int param8, @Nullable double[] param9, long __functionAddress); + public static native void callPV(int param0, float param1, float param2, int param3, int param4, float param5, float param6, int param7, int param8, @Nullable float[] param9, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, @Nullable double[] param9, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, @Nullable float[] param9, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, @Nullable int[] param9, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, @Nullable short[] param9, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, @Nullable double[] param10, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, @Nullable float[] param10, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, @Nullable int[] param10, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, @Nullable short[] param10, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, @Nullable double[] param11, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, @Nullable float[] param11, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, @Nullable int[] param11, long __functionAddress); + public static native void callPV(int param0, int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10, @Nullable short[] param11, long __functionAddress); + public static native void callPPV(long param0, @Nullable float[] param1, long __functionAddress); + public static native void callPPV(long param0, @Nullable int[] param1, long __functionAddress); + public static native void callPPV(@Nullable double[] param0, @Nullable double[] param1, long __functionAddress); + public static native void callPPV(@Nullable float[] param0, @Nullable float[] param1, long __functionAddress); + public static native void callPPV(@Nullable int[] param0, @Nullable int[] param1, long __functionAddress); + public static native void callPPV(@Nullable short[] param0, @Nullable short[] param1, long __functionAddress); + public static native void callPPV(int param0, long param1, @Nullable int[] param2, long __functionAddress); + public static native void callPPV(int param0, @Nullable int[] param1, @Nullable float[] param2, long __functionAddress); + public static native void callPPV(int param0, @Nullable int[] param1, @Nullable int[] param2, long __functionAddress); + public static native void callPPV(int param0, @Nullable int[] param1, @Nullable long[] param2, long __functionAddress); + public static native void callPPV(long param0, int param1, @Nullable float[] param2, long __functionAddress); + public static native void callPPV(long param0, int param1, @Nullable int[] param2, long __functionAddress); + public static native void callPPV(@Nullable int[] param0, int param1, @Nullable int[] param2, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, @Nullable int[] param3, long __functionAddress); + public static native void callPPV(int param0, int param1, @Nullable int[] param2, long param3, long __functionAddress); + public static native void callPPV(int param0, int param1, @Nullable int[] param2, @Nullable float[] param3, long __functionAddress); + public static native void callPPV(int param0, int param1, @Nullable int[] param2, @Nullable int[] param3, long __functionAddress); + public static native void callPPV(int param0, int param1, @Nullable int[] param2, @Nullable long[] param3, long __functionAddress); + public static native void callPPV(int param0, long param1, int param2, @Nullable int[] param3, long __functionAddress); + public static native void callPPV(int param0, long param1, @Nullable double[] param2, int param3, long __functionAddress); + public static native void callPPV(int param0, long param1, @Nullable float[] param2, int param3, long __functionAddress); + public static native void callPPV(int param0, long param1, @Nullable int[] param2, int param3, long __functionAddress); + public static native void callPPV(int param0, long param1, @Nullable long[] param2, int param3, long __functionAddress); + public static native void callPPV(int param0, long param1, @Nullable short[] param2, int param3, long __functionAddress); + public static native void callPPV(int param0, @Nullable int[] param1, @Nullable int[] param2, int param3, long __functionAddress); + public static native void callPPV(int param0, @Nullable long[] param1, @Nullable int[] param2, int param3, long __functionAddress); + public static native void callPPV(long param0, int param1, int param2, @Nullable int[] param3, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, long param3, @Nullable int[] param4, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, @Nullable int[] param3, long param4, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, @Nullable int[] param3, @Nullable int[] param4, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, @Nullable int[] param3, int param4, long __functionAddress); + public static native void callPPV(int param0, int param1, @Nullable int[] param2, int param3, @Nullable int[] param4, long __functionAddress); + public static native void callPPV(int param0, @Nullable int[] param1, int param2, long param3, int param4, long __functionAddress); + public static native void callPPV(int param0, @Nullable int[] param1, int param2, @Nullable int[] param3, int param4, long __functionAddress); + public static native void callPPV(int param0, @Nullable int[] param1, long param2, int param3, int param4, long __functionAddress); + public static native void callPPV(long param0, int param1, int param2, int param3, @Nullable int[] param4, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, int param3, @Nullable int[] param4, long param5, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, int param3, int param4, @Nullable float[] param5, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, int param3, int param4, @Nullable short[] param5, long __functionAddress); + public static native void callPPV(int param0, int param1, @Nullable int[] param2, long param3, int param4, int param5, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, long param3, int param4, int param5, @Nullable float[] param6, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, int param3, int param4, int param5, @Nullable float[] param6, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, int param3, long param4, int param5, int param6, @Nullable float[] param7, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, int param3, long param4, int param5, int param6, @Nullable short[] param7, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, int param3, int param4, int param5, int param6, @Nullable float[] param7, long __functionAddress); + public static native void callPPV(int param0, int param1, int param2, long param3, int param4, float param5, float param6, int param7, @Nullable float[] param8, long __functionAddress); + public static native void callPPV(int param0, int param1, long param2, int param3, int param4, int param5, int param6, int param7, @Nullable float[] param8, long __functionAddress); + public static native void callPJPV(long param0, long param1, @Nullable long[] param2, long __functionAddress); + public static native void callPPPV(long param0, long param1, @Nullable int[] param2, long __functionAddress); + public static native void callPPPV(long param0, @Nullable int[] param1, long param2, long __functionAddress); + public static native void callPJPV(long param0, long param1, int param2, @Nullable long[] param3, long __functionAddress); + public static native void callPPPV(int param0, long param1, long param2, @Nullable double[] param3, long __functionAddress); + public static native void callPPPV(int param0, long param1, long param2, @Nullable float[] param3, long __functionAddress); + public static native void callPPPV(int param0, long param1, long param2, @Nullable int[] param3, long __functionAddress); + public static native void callPPPV(int param0, long param1, long param2, @Nullable long[] param3, long __functionAddress); + public static native void callPPPV(int param0, long param1, long param2, @Nullable short[] param3, long __functionAddress); + public static native void callPPPV(long param0, int param1, @Nullable int[] param2, long param3, long __functionAddress); + public static native void callPPPV(long param0, int param1, @Nullable int[] param2, @Nullable long[] param3, long __functionAddress); + public static native void callPPPV(long param0, int param1, @Nullable long[] param2, long param3, long __functionAddress); + public static native void callPPPV(long param0, long param1, int param2, @Nullable int[] param3, long __functionAddress); + public static native void callPPPV(int param0, int param1, long param2, long param3, @Nullable double[] param4, long __functionAddress); + public static native void callPPPV(int param0, int param1, long param2, long param3, @Nullable float[] param4, long __functionAddress); + public static native void callPPPV(int param0, int param1, long param2, long param3, @Nullable int[] param4, long __functionAddress); + public static native void callPPPV(int param0, int param1, long param2, long param3, @Nullable short[] param4, long __functionAddress); + public static native void callPPPV(int param0, int param1, @Nullable int[] param2, long param3, @Nullable int[] param4, long __functionAddress); + public static native void callPPPV(int param0, int param1, @Nullable int[] param2, @Nullable int[] param3, long param4, long __functionAddress); + public static native void callPPPV(int param0, long param1, int param2, @Nullable int[] param3, long param4, long __functionAddress); + public static native void callPPPV(int param0, long param1, int param2, @Nullable int[] param3, @Nullable int[] param4, long __functionAddress); + public static native void callPPPV(int param0, @Nullable int[] param1, @Nullable int[] param2, int param3, @Nullable int[] param4, long __functionAddress); + public static native void callPPPV(long param0, int param1, int param2, @Nullable int[] param3, @Nullable int[] param4, long __functionAddress); + public static native void callPPPV(long param0, int param1, int param2, @Nullable long[] param3, @Nullable long[] param4, long __functionAddress); + public static native void callPJPV(long param0, long param1, int param2, int param3, int param4, @Nullable double[] param5, long __functionAddress); + public static native void callPJPV(long param0, long param1, int param2, int param3, int param4, @Nullable float[] param5, long __functionAddress); + public static native void callPJPV(long param0, long param1, int param2, int param3, int param4, @Nullable int[] param5, long __functionAddress); + public static native void callPJPV(long param0, long param1, int param2, int param3, int param4, @Nullable long[] param5, long __functionAddress); + public static native void callPJPV(long param0, long param1, int param2, int param3, int param4, @Nullable short[] param5, long __functionAddress); + public static native void callPPJV(long param0, int param1, @Nullable long[] param2, int param3, long param4, int param5, long __functionAddress); + public static native void callPPPV(int param0, int param1, int param2, @Nullable int[] param3, long param4, long param5, long __functionAddress); + public static native void callPPPV(int param0, int param1, int param2, @Nullable int[] param3, long param4, @Nullable int[] param5, long __functionAddress); + public static native void callPPPV(int param0, int param1, @Nullable int[] param2, int param3, @Nullable int[] param4, @Nullable int[] param5, long __functionAddress); + public static native void callPPPV(int param0, @Nullable int[] param1, int param2, long param3, int param4, @Nullable int[] param5, long __functionAddress); + public static native void callPPPV(int param0, int param1, long param2, long param3, int param4, int param5, @Nullable float[] param6, long __functionAddress); + public static native void callPPPV(int param0, int param1, long param2, long param3, int param4, int param5, @Nullable int[] param6, long __functionAddress); + public static native void callPPPV(int param0, int param1, long param2, long param3, int param4, int param5, @Nullable short[] param6, long __functionAddress); + public static native void callPPPV(long param0, int param1, long param2, int param3, int param4, int param5, @Nullable int[] param6, long __functionAddress); + public static native void callPPPV(int param0, int param1, int param2, int param3, @Nullable int[] param4, int param5, @Nullable int[] param6, @Nullable float[] param7, long __functionAddress); + public static native void callPPPV(int param0, int param1, int param2, int param3, @Nullable int[] param4, int param5, @Nullable int[] param6, @Nullable int[] param7, long __functionAddress); + public static native void callPPPV(long param0, int param1, int param2, int param3, int param4, int param5, @Nullable int[] param6, long param7, long __functionAddress); + public static native void callPJPPV(long param0, long param1, @Nullable int[] param2, long param3, long __functionAddress); + public static native void callPPPPV(long param0, long param1, @Nullable int[] param2, long param3, long __functionAddress); + public static native void callPJJPV(long param0, int param1, long param2, long param3, @Nullable long[] param4, long __functionAddress); + public static native void callPPPPV(long param0, int param1, long param2, @Nullable int[] param3, long param4, long __functionAddress); + public static native void callPPPPV(@Nullable long[] param0, @Nullable int[] param1, @Nullable int[] param2, @Nullable int[] param3, int param4, long __functionAddress); + public static native void callPPPPV(int param0, long param1, @Nullable int[] param2, @Nullable int[] param3, @Nullable int[] param4, int param5, long __functionAddress); + public static native void callPPPPV(long param0, int param1, int param2, @Nullable long[] param3, @Nullable long[] param4, @Nullable long[] param5, long __functionAddress); + public static native void callPJPPV(long param0, int param1, long param2, int param3, int param4, @Nullable int[] param5, @Nullable long[] param6, long __functionAddress); + public static native void callPPPPV(int param0, int param1, int param2, @Nullable int[] param3, @Nullable int[] param4, @Nullable int[] param5, long param6, long __functionAddress); + public static native void callPPPPV(int param0, int param1, long param2, @Nullable int[] param3, @Nullable int[] param4, @Nullable int[] param5, int param6, long __functionAddress); + public static native void callPJPPV(long param0, int param1, long param2, int param3, int param4, @Nullable long[] param5, int param6, @Nullable int[] param7, long __functionAddress); + public static native void callPJJJPV(long param0, long param1, long param2, long param3, @Nullable double[] param4, long __functionAddress); + public static native void callPJJJPV(long param0, long param1, long param2, long param3, @Nullable float[] param4, long __functionAddress); + public static native void callPJJJPV(long param0, long param1, long param2, long param3, @Nullable int[] param4, long __functionAddress); + public static native void callPJJJPV(long param0, long param1, long param2, long param3, @Nullable long[] param4, long __functionAddress); + public static native void callPJJJPV(long param0, long param1, long param2, long param3, @Nullable short[] param4, long __functionAddress); + public static native void callPPPPPV(long param0, int param1, long param2, @Nullable long[] param3, @Nullable int[] param4, long param5, long __functionAddress); + public static native void callPPPPPV(int param0, int param1, long param2, @Nullable int[] param3, @Nullable int[] param4, @Nullable int[] param5, @Nullable int[] param6, long __functionAddress); + public static native void callPPPPPV(long param0, int param1, int param2, @Nullable long[] param3, @Nullable long[] param4, @Nullable long[] param5, @Nullable long[] param6, long __functionAddress); + public static native void callPPPPPV(long param0, int param1, @Nullable long[] param2, int param3, int param4, int param5, long param6, int param7, long param8, int param9, long param10, long __functionAddress); + public static native void callPPPPPPPV(int param0, int param1, int param2, long param3, int param4, long param5, @Nullable int[] param6, @Nullable int[] param7, @Nullable int[] param8, @Nullable int[] param9, @Nullable long[] param10, long __functionAddress); + public static native boolean callPPZ(int param0, @Nullable int[] param1, long param2, long __functionAddress); + public static native boolean callPPPPZ(int param0, int param1, int param2, float param3, @Nullable float[] param4, @Nullable float[] param5, @Nullable float[] param6, @Nullable float[] param7, long __functionAddress); + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/Library.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/Library.java new file mode 100644 index 000000000..414e46165 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/Library.java @@ -0,0 +1,642 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.*; + +import javax.annotation.*; +import java.io.*; +import java.lang.reflect.*; +import java.net.*; +import java.nio.channels.*; +import java.nio.file.*; +import java.security.*; +import java.util.*; +import java.util.function.*; +import java.util.jar.*; +import java.util.regex.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; + +/** + * Initializes the LWJGL shared library and handles loading additional shared libraries. + * + * @see Configuration#LIBRARY_NAME + * @see Configuration#LIBRARY_PATH + */ +public final class Library { + + /** The LWJGL shared library name. */ + public static final String JNI_LIBRARY_NAME = Configuration.LIBRARY_NAME.get(Platform.mapLibraryNameBundled("lwjgl")); + + static final String JAVA_LIBRARY_PATH = "java.library.path"; + + private static final Pattern PATH_SEPARATOR = Pattern.compile(File.pathSeparator); + + private static final Pattern NATIVES_JAR = Pattern.compile("/[\\w-]+?-natives-\\w+.jar!/"); + + static { + if (DEBUG) { + DEBUG_STREAM.print( + "[LWJGL] Version: " + Version.getVersion() + + "\n\t OS: " + System.getProperty("os.name") + " v" + System.getProperty("os.version") + + "\n\tJRE: " + Platform.get().getName() + " " + System.getProperty("os.arch") + " " + System.getProperty("java.version") + + "\n\tJVM: " + System.getProperty("java.vm.name") + " v" + System.getProperty("java.vm.version") + " by " + System.getProperty("java.vm.vendor") + + "\n" + ); + } + + loadSystem("org.lwjgl", JNI_LIBRARY_NAME); + } + + private Library() {} + + /** Ensures that the LWJGL shared library has been loaded. */ + public static void initialize() { + // intentionally empty to trigger static initializer + } + + /** Calls {@link #loadSystem(Consumer, Consumer, Class, String, String)} using {@code Library.class} as the context parameter. */ + public static void loadSystem(String module, String name) throws UnsatisfiedLinkError { + loadSystem(System::load, System::loadLibrary, Library.class, module, name); + } + + /** + * Loads a JNI shared library. + * + * @param load should be the {@code System::load} expression. This ensures that {@code System.load} has the same caller as this method. + * @param loadLibrary should be the {@code System::loadLibrary} expression. This ensures that {@code System.loadLibrary} has the same caller as this + * method. + * @param context the class to use to discover the shared library in the classpath + * @param module the module to which the shared library belongs + * @param name the library name. If not an absolute path, it must be the plain library name, without an OS specific prefix or file extension (e.g. + * GL, not libGL.so) + * + * @throws UnsatisfiedLinkError if the library could not be loaded + */ + @SuppressWarnings("try") + public static void loadSystem( + Consumer load, + Consumer loadLibrary, + Class context, + String module, + String name + ) throws UnsatisfiedLinkError { + if (DEBUG) { + DEBUG_STREAM.print( + "[LWJGL] Loading JNI library: " + name + + "\n\tModule: " + module + + "\n" + ); + } + + // METHOD 1: absolute path + if (Paths.get(name).isAbsolute()) { + load.accept(name); + apiLogMore("Success"); + return; + } + + String libName = Platform.get().mapLibraryName(name); + + boolean bundledWithLWJGL = name.contains("lwjgl"); + + // METHOD 2: org.lwjgl.librarypath + URL libURL = findResource(context, module, libName, bundledWithLWJGL); + if (libURL == null) { + if (loadSystemFromLibraryPath(load, context, module, libName, bundledWithLWJGL)) { + return; + } + } else { + boolean debugLoader = Configuration.DEBUG_LOADER.get(false); + try { + if (!Configuration.SHARED_LIBRARY_EXTRACT_FORCE.get(false)) { + String regular = getRegularFilePath(libURL); + if (regular != null) { + load.accept(regular); + apiLogMore("Loaded from classpath: " + regular); + return; + } + } + + // Always use the SLL if the library is found in the classpath, + // so that newer versions can be detected. + if (debugLoader) { + apiLogMore("Using SharedLibraryLoader..."); + } + // Extract from classpath and try org.lwjgl.librarypath + try (FileChannel ignored = SharedLibraryLoader.load(name, libName, libURL, load)) { + if (loadSystemFromLibraryPath(load, context, module, libName, bundledWithLWJGL)) { + return; + } + } + } catch (Exception e) { + if (debugLoader) { + e.printStackTrace(DEBUG_STREAM); + } + } + } + + String javaLibraryPath = System.getProperty(JAVA_LIBRARY_PATH); + + // METHOD 3: java.library.path (bundled only) + if (bundledWithLWJGL && javaLibraryPath != null) { + if (loadSystem(load, context, module, getBundledPath(module, libName), false, JAVA_LIBRARY_PATH, javaLibraryPath)) { + return; + } + } + + // METHOD 4: System.loadLibrary + try { + loadLibrary.accept(name); + + // Success, but java.library.path might be empty, or not include the library. + // In that case, ClassLoader::findLibrary was used to return the library path (e.g. OSGi does this with native libraries in bundles). + Path libFile = javaLibraryPath == null ? null : findFile(javaLibraryPath, module, libName, bundledWithLWJGL); + if (libFile != null) { + apiLogMore(String.format("Loaded from %s: %s", JAVA_LIBRARY_PATH, libFile)); + if (bundledWithLWJGL) { + checkHash(context, libFile, module, libName); + } + } else { + apiLogMore("Loaded from a ClassLoader provided path."); + } + return; + } catch (Throwable t) { + apiLogMore(libName + " not found in " + JAVA_LIBRARY_PATH); + } + + detectPlatformMismatch(context, module); + printError(true); + throw new UnsatisfiedLinkError("Failed to locate library: " + libName); + } + + private static boolean loadSystemFromLibraryPath(Consumer load, Class context, String module, String libName, boolean bundledWithLWJGL) { + String paths = Configuration.LIBRARY_PATH.get(); + return paths != null && loadSystem(load, context, module, libName, bundledWithLWJGL, Configuration.LIBRARY_PATH.getProperty(), paths); + } + + private static boolean loadSystem(Consumer load, Class context, String module, String libName, boolean bundledWithLWJGL, String property, String paths) { + Path libFile = findFile(paths, module, libName, bundledWithLWJGL); + if (libFile == null) { + apiLogMore(libName + " not found in " + property + "=" + paths); + return false; + } + + load.accept(libFile.toAbsolutePath().toString()); + apiLogMore("Loaded from " + property + ": " + libFile); + if (bundledWithLWJGL) { + checkHash(context, libFile, module, libName); + } + return true; + } + + /** Calls {@link #loadNative(Class, String, String)} using {@code Library.class} as the context parameter. */ + public static SharedLibrary loadNative(String module, String name) { + return loadNative(Library.class, module, name); + } + + /** + * Loads a shared library using OS-specific APIs (e.g. {@link org.lwjgl.system.windows.WinBase#LoadLibrary LoadLibrary} or + * {@link org.lwjgl.system.linux.DynamicLinkLoader#dlopen dlopen}). + * + * @param context the class to use to discover the shared library in the classpath + * @param module the module to which the shared library belongs + * @param name the library name. OS-specific prefixes and file extensions are optional (e.g. both {@code "GL"} and {@code "libGL.so.1"} are + * valid on Linux) + * + * @return the shared library + * + * @throws UnsatisfiedLinkError if the library could not be loaded + */ + @SuppressWarnings("try") + public static SharedLibrary loadNative(Class context, String module, String name) { + return loadNative(context, module, name, false); + } + + /** + * Loads a shared library using OS-specific APIs (e.g. {@link org.lwjgl.system.windows.WinBase#LoadLibrary LoadLibrary} or + * {@link org.lwjgl.system.linux.DynamicLinkLoader#dlopen dlopen}). + * + * @param context the class to use to discover the shared library in the classpath + * @param module the module to which the shared library belongs + * @param name the library name. OS-specific prefixes and file extensions are optional (e.g. both {@code "GL"} and {@code "libGL.so.1"} are + * valid on Linux) + * @param bundledWithLWJGL whether the default LWJGL distribution includes the shared library. If true, LWJGL will also try to find the shared library under + * the {@code //} subfolder. + * + * @return the shared library + * + * @throws UnsatisfiedLinkError if the library could not be loaded + */ + public static SharedLibrary loadNative(Class context, String module, String name, boolean bundledWithLWJGL) { + return loadNative(context, module, name, bundledWithLWJGL, true); + } + + @SuppressWarnings("try") + private static SharedLibrary loadNative(Class context, String module, String name, boolean bundledWithLWJGL, boolean printError) { + if (DEBUG) { + DEBUG_STREAM.print( + "[LWJGL] Loading library: " + name + + "\n\tModule: " + module + + "\n" + ); + } + + // METHOD 1: absolute path + if (Paths.get(name).isAbsolute()) { + SharedLibrary lib = apiCreateLibrary(name); + apiLogMore("Success"); + return lib; + } + + String libName = Platform.get().mapLibraryName(name); + SharedLibrary lib; + + // METHOD 2: org.lwjgl.librarypath + URL libURL = findResource(context, module, libName, bundledWithLWJGL); + if (libURL == null) { + lib = loadNativeFromLibraryPath(context, module, libName, bundledWithLWJGL); + if (lib != null) { + return lib; + } + } else { + boolean debugLoader = Configuration.DEBUG_LOADER.get(false); + try { + if (!Configuration.SHARED_LIBRARY_EXTRACT_FORCE.get(false)) { + String regular = getRegularFilePath(libURL); + if (regular != null) { + lib = apiCreateLibrary(regular); + apiLogMore("Loaded from classpath: " + regular); + return lib; + } + } + + // Always use the SLL if the library is found in the classpath, + // so that newer versions can be detected. + if (debugLoader) { + apiLogMore("Using SharedLibraryLoader..."); + } + // Extract from classpath and try org.lwjgl.librarypath + try (FileChannel ignored = SharedLibraryLoader.load(name, libName, libURL, null)) { + lib = loadNativeFromLibraryPath(context, module, libName, bundledWithLWJGL); + if (lib != null) { + return lib; + } + } + } catch (Exception e) { + if (debugLoader) { + e.printStackTrace(DEBUG_STREAM); + } + } + } + + // Use method 4 before 3 for libraries not bundled with LWJGL. + if (!bundledWithLWJGL) { + lib = loadNativeFromSystem(libName); + if (lib != null) { + return lib; + } + } + + // METHOD 3: System.loadLibrary (emulated) + { + if (Configuration.EMULATE_SYSTEM_LOADLIBRARY.get(false)) { + // Try ClassLoader::findLibrary (e.g. OSGi bundle) + try { + Method findLibrary = ClassLoader.class.getDeclaredMethod("findLibrary", String.class); + findLibrary.setAccessible(true); + + String libPath = (String)findLibrary.invoke(context.getClassLoader(), name); + if (libPath != null) { + lib = apiCreateLibrary(libPath); + apiLogMore("Loaded from ClassLoader provided path: " + libPath); + return lib; + } + } catch (Exception ignored) { + // This will fail on JDK 9 without --add-opens java.base/java.lang=ALL-UNNAMED + } + } + + // Then java.library.path + String paths = System.getProperty(JAVA_LIBRARY_PATH); + if (paths != null) { + lib = loadNative(context, module, libName, bundledWithLWJGL, JAVA_LIBRARY_PATH, paths); + if (lib != null) { + return lib; + } + } + } + + // METHOD 4: system-specific + if (bundledWithLWJGL) { + lib = loadNativeFromSystem(libName); + if (lib != null) { + return lib; + } + } + + if (printError) { + detectPlatformMismatch(context, module); + printError(bundledWithLWJGL); + } + throw new UnsatisfiedLinkError("Failed to locate library: " + libName); + } + + @Nullable + private static SharedLibrary loadNativeFromSystem(String libName) { + SharedLibrary lib; + try { + lib = apiCreateLibrary(libName); + String path = lib.getPath(); + apiLogMore(path == null + ? "Loaded from system paths" + : "Loaded from system paths: " + path); + } catch (UnsatisfiedLinkError e) { + lib = null; + apiLogMore(libName + " not found in system paths"); + } + return lib; + } + + @Nullable + private static SharedLibrary loadNativeFromLibraryPath(Class context, String module, String libName, boolean bundledWithLWJGL) { + String paths = Configuration.LIBRARY_PATH.get(); + if (paths == null) { + return null; + } + return loadNative(context, module, libName, bundledWithLWJGL, Configuration.LIBRARY_PATH.getProperty(), paths); + } + + @Nullable + private static SharedLibrary loadNative(Class context, String module, String libName, boolean bundledWithLWJGL, String property, String paths) { + Path libFile = findFile(paths, module, libName, bundledWithLWJGL); + if (libFile == null) { + apiLogMore(libName + " not found in " + property + "=" + paths); + return null; + } + + SharedLibrary lib = apiCreateLibrary(libFile.toAbsolutePath().toString()); + apiLogMore("Loaded from " + property + ": " + libFile); + if (bundledWithLWJGL) { + checkHash(context, libFile, module, libName); + } + return lib; + } + + /** + * Loads a shared library using {@link #loadNative(String, String)} with the name specified by {@code name}. If {@code name} is not set, + * {@link #loadNative(String, String)} will be called with the names specified by {@code defaultNames}. The first successful will be returned. + * + * @param name a {@link Configuration} that specifies the library name + * @param defaultNames the default library name(s) + * + * @return the shared library + * + * @throws UnsatisfiedLinkError if the library could not be loaded + */ + public static SharedLibrary loadNative(Class context, String module, @Nullable Configuration name, String... defaultNames) { + return loadNative(context, module, name, null, defaultNames); + } + + /** + * Loads a shared library using {@link #loadNative(String, String)} with the name specified by {@code name}. If {@code name} is not set, + * {@link #loadNative(String, String)} will be called with the names specified by {@code defaultNames}. The first successful will be returned. If the library could + * not be loaded, the {@code fallback} will be called. + * + * @param name a {@link Configuration} that specifies the library name + * @param fallback fallback to use if everything else fails + * @param defaultNames the default library name(s) + * + * @return the shared library + * + * @throws UnsatisfiedLinkError if the library could not be loaded + */ + public static SharedLibrary loadNative(Class context, String module, @Nullable Configuration name, @Nullable Supplier fallback, String... defaultNames) { + if (defaultNames.length == 0) { + throw new IllegalArgumentException("No default names specified."); + } + + if (name != null) { + String libraryName = name.get(); + if (libraryName != null) { + return loadNative(context, module, libraryName); + } + } + + if (fallback == null && defaultNames.length <= 1) { + return loadNative(context, module, defaultNames[0]); + } + + try { + return loadNative(context, module, defaultNames[0], false, false); // try first + } catch (Throwable t) { + for (int i = 1; i < defaultNames.length; i++) { // try alternatives + try { + return loadNative(context, module, defaultNames[i], false, fallback == null && i == defaultNames.length - 1); + } catch (Throwable ignored) { + } + } + if (fallback != null) { + return fallback.get(); + } + throw t; // original error + } + } + + private static String getBundledPath(String module, String resource) { + return Platform.mapLibraryPathBundled(module.replace('.', '/') + "/" + resource); + } + + @Nullable + static URL findResource(Class context, String module, String resource, boolean bundledWithLWJGL) { + URL url = null; + if (bundledWithLWJGL) { + String bundledResource = getBundledPath(module, resource); + if (!bundledResource.equals(resource)) { + url = context.getClassLoader().getResource(bundledResource); + } + } + return url == null ? context.getClassLoader().getResource(resource) : url; + } + + @Nullable + static String getRegularFilePath(URL url) { + if (url.getProtocol().equals("file")) { + try { + Path path = Paths.get(url.toURI()); + if (path.isAbsolute() && Files.isReadable(path)) { + return path.toString(); + } + } catch (URISyntaxException ignored) { + } + } + return null; + } + + @Nullable + static Path findFile(String path, String module, String file, boolean bundledWithLWJGL) { + if (bundledWithLWJGL) { + String bundledFile = getBundledPath(module, file); + if (!bundledFile.equals(file)) { + Path p = findFile(path, bundledFile); + if (p != null) { + return p; + } + } + } + return findFile(path, file); + } + + @Nullable + private static Path findFile(String path, String file) { + for (String directory : PATH_SEPARATOR.split(path)) { + Path p = Paths.get(directory, file); + if (Files.isReadable(p)) { + return p; + } + } + return null; + } + + private static void detectPlatformMismatch(Class context, String module) { + if (!module.startsWith("org.lwjgl")) { + return; + } + + String moduleTitle = module.equals("org.lwjgl") ? "lwjgl" : "lwjgl-" + module.substring("org.lwjgl.".length()); + + List platforms = new ArrayList<>(8); + try { + Enumeration manifests = context.getClassLoader().getResources(JarFile.MANIFEST_NAME); + while (manifests.hasMoreElements()) { + try (InputStream is = manifests.nextElement().openStream()) { + Manifest manifest = new Manifest(is); + Attributes attribs = manifest.getMainAttributes(); + + if (moduleTitle.equals(attribs.getValue("Implementation-Title"))) { + String jarPlatform = attribs.getValue("LWJGL-Platform"); + if (jarPlatform != null) { + platforms.add(jarPlatform); + } + } + } + } + } catch (IOException ignored) { + } + + if (!platforms.isEmpty()) { + DEBUG_STREAM.print( + "[LWJGL] Platform/architecture mismatch detected for module: " + module + + "\n\tJVM platform:" + + "\t\t" + Platform.get().getName() + " " + System.getProperty("os.arch") + " " + System.getProperty("java.version") + "\n" + + "\t\t" + System.getProperty("java.vm.name") + " v" + System.getProperty("java.vm.version") + " by " + System.getProperty("java.vm.vendor") + "\n" + + "\tPlatform" + (platforms.size() == 1 ? "" : "s") + " available on classpath:\n\t\t" + String.join("\n\t\t", platforms) + "\n" + ); + } + } + + private static void printError(boolean bundledWithLWJGL) { + printError( + "[LWJGL] Failed to load a library. Possible solutions:\n" + (bundledWithLWJGL + ? "\ta) Add the directory that contains the shared library to -Djava.library.path or -Dorg.lwjgl.librarypath.\n" + + "\tb) Add the JAR that contains the shared library to the classpath." + : "\ta) Install the library or the driver that provides the library.\n" + + "\tb) Ensure that the library is accessible from the system library paths." + ) + ); + } + + static void printError(String message) { + StringBuilder sb = new StringBuilder(message); + sb.append("\n"); + + if (!DEBUG) { + sb.append("[LWJGL] Enable debug mode with -Dorg.lwjgl.util.Debug=true for better diagnostics.\n"); + if (!Configuration.DEBUG_LOADER.get(false)) { + sb.append("[LWJGL] Enable the SharedLibraryLoader debug mode with -Dorg.lwjgl.util.DebugLoader=true for better diagnostics.\n"); + } + } + + DEBUG_STREAM.print(sb); + } + + /** + * Compares the shared library hash stored in the classpath, with the hash of the actual library loaded at runtime. + * + *

    This check prints a simple warning when there's a hash mismatch, to help diagnose installation/classpath issues. It is not a security feature.

    + * + * @param context the class to use to discover the shared library hash in the classpath + * @param libFile the library file loaded + */ + private static void checkHash(Class context, Path libFile, String module, String libName) { + if (!CHECKS) { + return; + } + + try { + URL classesURL = null; + URL nativesURL = null; + + Enumeration resources = context.getClassLoader().getResources("META-INF/" + getBundledPath(module, libName) + ".sha1"); + while (resources.hasMoreElements()) { + URL url = resources.nextElement(); + if (NATIVES_JAR.matcher(url.toExternalForm()).find()) { + nativesURL = url; + } else { + classesURL = url; + } + } + if (classesURL == null) { + return; + } + + byte[] expected = getSHA1(classesURL); + byte[] actual = DEBUG || nativesURL == null + ? getSHA1(libFile) + : getSHA1(nativesURL); + + if (!Arrays.equals(expected, actual)) { + DEBUG_STREAM.println( + "[LWJGL] [ERROR] Incompatible Java and native library versions detected.\n" + + "Possible reasons:\n" + + "\ta) -Djava.library.path is set to a folder containing shared libraries of an older LWJGL version.\n" + + "\tb) The classpath contains jar files of an older LWJGL version.\n" + + "Possible solutions:\n" + + "\ta) Make sure to not set -Djava.library.path (it is not needed for developing with LWJGL 3) or make\n" + + "\t sure the folder it points to contains the shared libraries of the correct LWJGL version.\n" + + "\tb) Check the classpath and make sure to only have jar files of the same LWJGL version in it."); + } + } catch (Throwable t) { + if (DEBUG) { + apiLog("Failed to verify native library."); + t.printStackTrace(); + } + } + } + + private static byte[] getSHA1(URL hashURL) throws IOException { + byte[] hash = new byte[20]; + try (InputStream sha1 = hashURL.openStream()) { + for (int i = 0; i < 20; i++) { + hash[i] = (byte)((Character.digit(sha1.read(), 16) << 4) | Character.digit(sha1.read(), 16)); + } + } + return hash; + } + + private static byte[] getSHA1(Path libFile) throws NoSuchAlgorithmException, IOException { + MessageDigest digest = MessageDigest.getInstance("SHA-1"); + try (InputStream input = Files.newInputStream(libFile)) { + byte[] buffer = new byte[8 * 1024]; + for (int n; (n = input.read(buffer)) != -1; ) { + digest.update(buffer, 0, n); + } + } + return digest.digest(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/LibraryResource.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/LibraryResource.java new file mode 100644 index 000000000..cfec1d8a5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/LibraryResource.java @@ -0,0 +1,230 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import javax.annotation.*; +import java.net.*; +import java.nio.channels.*; +import java.nio.file.*; +import java.util.function.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; + +/** + * Handles loading of native resources in LWJGL. [INTERNAL USE ONLY] + * + *

    This class uses the same mechanism as {@link Library} for loading shared libraries. The resource name could be an absolute path, or a relative path that + * is resolved via {@code org.lwjgl.librarypath}, {@code java.library.path}, or even the class/module-path. When the resource is detected in the + * class/module-path, it is extracted automatically to {@code org.lwjgl.librarypath} via the {@code SharedLibraryLoader}.

    + */ +public final class LibraryResource { + + static { + Library.initialize(); + } + + private LibraryResource() {} + + /** Calls {@link #load(Class, String, String)} using {@code LibraryResource.class} as the context parameter. */ + public static Path load(String module, String name) { + return load(LibraryResource.class, module, name); + } + + /** + * Loads a library resource. + * + * @param context the class to use to discover the library resource in the classpath + * @param module the module to which the resource belongs + * @param name the resource name + * + * @return the library resource path + * + * @throws IllegalStateException if the resource could not be found + */ + @SuppressWarnings("try") + public static Path load(Class context, String module, String name) { + return load(context, module, name, false, true); + } + + /** + * Loads a library resource. + * + * @param context the class to use to discover the library resource in the classpath + * @param module the module to which the resource belongs + * @param name the resource name + * @param bundledWithLWJGL whether the default LWJGL distribution includes the resource. If true, LWJGL will also try to find the shared library under the + * {@code //} subfolder. + * + * @return the library resource path + * + * @throws IllegalStateException if the resource could not be found + */ + @SuppressWarnings("try") + public static Path load(Class context, String module, String name, boolean bundledWithLWJGL) { + return load(context, module, name, bundledWithLWJGL, true); + } + + @SuppressWarnings("try") + private static Path load(Class context, String module, String name, boolean bundledWithLWJGL, boolean printError) { + if (DEBUG) { + DEBUG_STREAM.print( + "[LWJGL] Loading library resource: " + name + + "\n\tModule: " + module + + "\n" + ); + } + + // METHOD 1: absolute path + Path path = Paths.get(name); + if (path.isAbsolute()) { + if (!Files.exists(path)) { + if (printError) { + printError(); + } + throw new IllegalStateException("Failed to locate library resource: " + name); + } + apiLogMore("Success"); + return path; + } + + // METHOD 2: org.lwjgl.librarypath + URL resourceURL = Library.findResource(context, module, name, bundledWithLWJGL); + if (resourceURL == null) { + path = loadFromLibraryPath(module, name, bundledWithLWJGL); + if (path != null) { + return path; + } + } else { + boolean debugLoader = Configuration.DEBUG_LOADER.get(false); + try { + String regular = Library.getRegularFilePath(resourceURL); + if (regular != null) { + apiLogMore("Loaded from classpath: " + regular); + return Paths.get(regular); + } + + // Always use the SLL if the resource is found in the classpath, + // so that newer versions can be detected. + if (debugLoader) { + apiLogMore("Using SharedLibraryLoader..."); + } + // Extract from classpath and try org.lwjgl.librarypath + try (FileChannel ignored = SharedLibraryLoader.load(name, name, resourceURL, null)) { + path = loadFromLibraryPath(module, name, bundledWithLWJGL); + if (path != null) { + return path; + } + } + } catch (Exception e) { + if (debugLoader) { + e.printStackTrace(DEBUG_STREAM); + } + } + } + + // METHOD 3: java.library.path + String paths = System.getProperty(Library.JAVA_LIBRARY_PATH); + if (paths != null) { + path = load(module, name, bundledWithLWJGL, Library.JAVA_LIBRARY_PATH, paths); + if (path != null) { + return path; + } + } + + if (printError) { + printError(); + } + throw new IllegalStateException("Failed to locate library resource: " + name); + } + + @Nullable + private static Path loadFromLibraryPath(String module, String libName, boolean bundledWithLWJGL) { + String paths = Configuration.LIBRARY_PATH.get(); + if (paths == null) { + return null; + } + return load(module, libName, bundledWithLWJGL, Configuration.LIBRARY_PATH.getProperty(), paths); + } + + @Nullable + private static Path load(String module, String name, boolean bundledWithLWJGL, String property, String paths) { + Path resource = Library.findFile(paths, module, name, bundledWithLWJGL); + if (resource == null) { + apiLogMore(name + " not found in " + property + "=" + paths); + return null; + } + + apiLogMore("Loaded from " + property + ": " + resource); + return resource; + } + + /** + * Loads a library resource using {@link #load(String, String)} with the name specified by {@code name}. If {@code name} is not set, + * {@link #load(String, String)} will be called with the names specified by {@code defaultNames}. The first successful will be returned. + * + * @param name a {@link Configuration} that specifies the resource name + * @param defaultNames the default resource name(s) + * + * @return the library resource path + * + * @throws IllegalStateException if the resource could not be found + */ + public static Path load(Class context, String module, Configuration name, String... defaultNames) { + return load(context, module, name, null, defaultNames); + } + + /** + * Loads a library resource using {@link #load(Class, String, String) load} with the name specified by {@code name}. If {@code name} is not set, + * {@code load} will be called with the names specified by {@code defaultNames}. The first successful will be returned. If the resource could + * not be found, the {@code fallback} will be called. + * + * @param name a {@link Configuration} that specifies the resource name + * @param fallback fallback to use if everything else fails + * @param defaultNames the default resource name(s) + * + * @return the library resource path + * + * @throws UnsatisfiedLinkError if the resource could not be found + */ + public static Path load(Class context, String module, Configuration name, @Nullable Supplier fallback, String... defaultNames) { + if (defaultNames.length == 0) { + throw new IllegalArgumentException("No default names specified."); + } + + String resourceName = name.get(); + if (resourceName != null) { + return load(context, module, resourceName); + } + + if (fallback == null && defaultNames.length <= 1) { + return load(context, module, defaultNames[0]); + } + + try { + return load(context, module, defaultNames[0], false, false); // try first + } catch (Throwable t) { + for (int i = 1; i < defaultNames.length; i++) { // try alternatives + try { + return load(context, module, defaultNames[i], false, fallback == null && i == defaultNames.length - 1); + } catch (Throwable ignored) { + } + } + if (fallback != null) { + return fallback.get(); + } + throw t; // original error + } + } + + private static void printError() { + Library.printError( + "[LWJGL] Failed to load a library resource. Possible solutions:\n" + + "\ta) Add the directory that contains the resource to -Djava.library.path or -Dorg.lwjgl.librarypath.\n" + + "\tb) Add the JAR that contains the resource to the classpath." + ); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/MathUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/MathUtil.java new file mode 100644 index 000000000..e0fdf2eae --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/MathUtil.java @@ -0,0 +1,171 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import java.math.*; + +/** + * Math utility class. + * + *

    Method names in this class are prefixed with {@code math} to avoid ambiguities when used with static imports.

    + */ +public final class MathUtil { + + private MathUtil() { + } + + /** + * Returns true if the specified integer {@code value} is a power-of-two + * number. + * + * @param value the value to test + * + * @return true if the value if a power-of-two number. + */ + public static boolean mathIsPoT(int value) { + return Integer.bitCount(value) == 1; + } + + /** + * Rounds the specified integer {@code value} up to the next power-of-two + * number. The returned value will be equal to {@code value} if it already + * is a power-of-two number. + * + * @param value the value to round-up. Must be a number between {@code 1} and + * 1 << 30. + * + * @return the power-of-two rounded value + */ + public static int mathRoundPoT(int value) { + return 1 << (32 - Integer.numberOfLeadingZeros(value - 1)); + } + + public static boolean mathHasZeroByte(int value) { + return ((value - 0x01010101) & ~value & 0x80808080) != 0; + } + + public static boolean mathHasZeroByte(long value) { + return ((value - 0x0101010101010101L) & ~value & 0x8080808080808080L) != 0L; + } + + public static boolean mathHasZeroShort(int value) { + return ((value - 0x00010001) & ~value & 0x80008000) != 0; + } + + public static boolean mathHasZeroShort(long value) { + return ((value - 0x0001000100010001L) & ~value & 0x8000800080008000L) != 0L; + } + + /** + * Returns as a {@code long} the most significant 64 bits of the 128-bit product of two {@code uint64_t} factors. + * + * @param x the first value + * @param y the second value + * + * @return the result + */ + public static long mathMultiplyHighU64(long x, long y) { + long x0 = x & 0xFFFF_FFFFL; + long x1 = x >>> 32; + long y0 = y & 0xFFFF_FFFFL; + long y1 = y >>> 32; + + long t = x1 * y0 + ((x0 * y0) >>> 32); + + return x1 * y1 + (t >>> 32) + (((t & 0xFFFF_FFFFL) + x0 * y1) >>> 32); + } + + /** + * Returns as a {@code long} the most significant 64 bits of the 128-bit product of two {@code int64_t} factors. + * + * @param x the first value + * @param y the second value + * + * @return the result + */ + public static long mathMultiplyHighS64(long x, long y) { + long x0 = x & 0xFFFF_FFFFL; + long x1 = x >> 32; + long y0 = y & 0xFFFF_FFFFL; + long y1 = y >> 32; + + long t = x1 * y0 + ((x0 * y0) >>> 32); + + return x1 * y1 + (t >> 32) + (((t & 0xFFFF_FFFFL) + x0 * y1) >> 32); + } + + /** + * Returns the unsigned quotient of dividing the first argument by the second where each argument and the result is interpreted as an unsigned value. + * + *

    When either argument is negative (i.e. a {@code uint64_t} value higher than {@code 0x8000_0000_0000_0000L}), this method uses bit twiddling to + * implement the division. The JDK implementation uses {@link BigInteger} for this case, which has a negative impact on performance.

    + * + * @param dividend the value to be divided + * @param divisor the value doing the dividing + * + * @return the unsigned quotient of the first argument divided by the second argument + */ + public static long mathDivideUnsigned(long dividend, long divisor) { + if (0L <= divisor) { + return 0L <= dividend + ? dividend / divisor + : udivdi3(dividend, divisor); + } else { + return Long.compareUnsigned(dividend, divisor) < 0 ? 0L : 1L; + } + } + + /** + * Returns the unsigned remainder from dividing the first argument by the second where each argument and the result is interpreted as an unsigned value. + * + *

    When either argument is negative (i.e. a {@code uint64_t} value higher than {@code 0x8000_0000_0000_0000L}), this method uses bit twiddling to + * implement the remainder. The JDK implementation uses {@link BigInteger} for this case, which has a negative impact on performance.

    + * + * @param dividend the value to be divided + * @param divisor the value doing the dividing + * + * @return the unsigned remainder of the first argument divided by the second argument + */ + public static long mathRemainderUnsigned(long dividend, long divisor) { + if (0L < dividend && 0L < divisor) { + return dividend % divisor; + } else { + return Long.compareUnsigned(dividend, divisor) < 0 + ? dividend + : dividend - divisor * udivdi3(dividend, divisor); + } + } + + // Implements uint64_t / uint64_t ==> uint64_t division + // Ported from Hacker's Delight (https://github.com/hcs0/Hackers-Delight/blob/master/divDouble.c.txt) + private static long udivdi3(long u, long v) { + if (v >>> 32 == 0) { + // u < 0L in here + if (u >>> 32 < v) { + long q0 = (((u >>> 1) / v) << Long.numberOfLeadingZeros(v)) >>> 31; + if ((u - q0 * v) >= v) { + q0++; + } + return q0; + } else { + long u1 = u >>> 32; + long q1 = u1 / v; + long q0 = (((u1 - q1 * v) << 32) | (u & 0xFFFF_FFFFL)) / v; + return (q1 << 32) | q0; + } + } + + int n = Long.numberOfLeadingZeros(v); + long q0 = (((u >>> 1) / ((v << n) >>> 32)) << n) >>> 31; + if (q0 != 0) { + q0--; + } + if (Long.compareUnsigned((u - q0 * v), v) >= 0) { + q0++; + } + return q0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryAccessJNI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryAccessJNI.java new file mode 100644 index 000000000..f8f79e42f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryAccessJNI.java @@ -0,0 +1,323 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system; + + +import static org.lwjgl.system.Checks.*; + +/** Memory access utilities. */ +final class MemoryAccessJNI { + + static { Library.initialize(); } + + private MemoryAccessJNI() { + throw new UnsupportedOperationException(); + } + + // --- [ getPointerSize ] --- + + /** Returns the {@code sizeof(void *)}. */ + static native int getPointerSize(); + + // --- [ malloc ] --- + + @NativeType("void * (*) (size_t)") + private static native long malloc(); + + /** Returns the address of the stdlib {@code malloc} function. */ + static final long malloc = malloc(); + + // --- [ calloc ] --- + + @NativeType("void * (*) (size_t, size_t)") + private static native long calloc(); + + /** Returns the address of the stdlib {@code calloc} function. */ + static final long calloc = calloc(); + + // --- [ realloc ] --- + + @NativeType("void * (*) (void *, size_t)") + private static native long realloc(); + + /** Returns the address of the stdlib {@code realloc} function. */ + static final long realloc = realloc(); + + // --- [ free ] --- + + @NativeType("void (*) (void *)") + private static native long free(); + + /** Returns the address of the stdlib {@code free} function. */ + static final long free = free(); + + // --- [ aligned_alloc ] --- + + @NativeType("void * (*) (size_t, size_t)") + private static native long aligned_alloc(); + + /** Returns the address of the stdlib {@code aligned_alloc} function. */ + static final long aligned_alloc = aligned_alloc(); + + // --- [ aligned_free ] --- + + @NativeType("void (*) (void *)") + private static native long aligned_free(); + + /** Returns the address of the stdlib {@code aligned_free} function. */ + static final long aligned_free = aligned_free(); + + // --- [ getByte ] --- + + /** Unsafe version of: {@link #getByte} */ + static native byte ngetByte(long ptr); + + /** + * Reads a byte value from the specified memory address. + * + * @param ptr the memory address to read + */ + @NativeType("int8_t") + static byte getByte(@NativeType("void *") long ptr) { + if (CHECKS) { + check(ptr); + } + return ngetByte(ptr); + } + + // --- [ getShort ] --- + + /** Unsafe version of: {@link #getShort} */ + static native short ngetShort(long ptr); + + /** + * Reads a short value from the specified memory address. + * + * @param ptr the memory address to read + */ + @NativeType("int16_t") + static short getShort(@NativeType("void *") long ptr) { + if (CHECKS) { + check(ptr); + } + return ngetShort(ptr); + } + + // --- [ getInt ] --- + + /** Unsafe version of: {@link #getInt} */ + static native int ngetInt(long ptr); + + /** + * Reads an int value from the specified memory address. + * + * @param ptr the memory address to read + */ + @NativeType("int32_t") + static int getInt(@NativeType("void *") long ptr) { + if (CHECKS) { + check(ptr); + } + return ngetInt(ptr); + } + + // --- [ getLong ] --- + + /** Unsafe version of: {@link #getLong} */ + static native long ngetLong(long ptr); + + /** + * Reads a long value from the specified memory address. + * + * @param ptr the memory address to read + */ + @NativeType("int64_t") + static long getLong(@NativeType("void *") long ptr) { + if (CHECKS) { + check(ptr); + } + return ngetLong(ptr); + } + + // --- [ getFloat ] --- + + /** Unsafe version of: {@link #getFloat} */ + static native float ngetFloat(long ptr); + + /** + * Reads a float value from the specified memory address. + * + * @param ptr the memory address to read + */ + static float getFloat(@NativeType("void *") long ptr) { + if (CHECKS) { + check(ptr); + } + return ngetFloat(ptr); + } + + // --- [ getDouble ] --- + + /** Unsafe version of: {@link #getDouble} */ + static native double ngetDouble(long ptr); + + /** + * Reads a double value from the specified memory address. + * + * @param ptr the memory address to read + */ + static double getDouble(@NativeType("void *") long ptr) { + if (CHECKS) { + check(ptr); + } + return ngetDouble(ptr); + } + + // --- [ getAddress ] --- + + /** Unsafe version of: {@link #getAddress} */ + static native long ngetAddress(long ptr); + + /** + * Reads a pointer address from the specified memory address. + * + * @param ptr the memory address to read + */ + @NativeType("uintptr_t") + static long getAddress(@NativeType("void *") long ptr) { + if (CHECKS) { + check(ptr); + } + return ngetAddress(ptr); + } + + // --- [ putByte ] --- + + /** Unsafe version of: {@link #putByte} */ + static native void nputByte(long ptr, byte value); + + /** + * Writes a byte value to the specified memory address. + * + * @param ptr the memory address to write + * @param value the value to write + */ + static void putByte(@NativeType("void *") long ptr, @NativeType("int8_t") byte value) { + if (CHECKS) { + check(ptr); + } + nputByte(ptr, value); + } + + // --- [ putShort ] --- + + /** Unsafe version of: {@link #putShort} */ + static native void nputShort(long ptr, short value); + + /** + * Writes a short value to the specified memory address. + * + * @param ptr the memory address to write + * @param value the value to write + */ + static void putShort(@NativeType("void *") long ptr, @NativeType("int16_t") short value) { + if (CHECKS) { + check(ptr); + } + nputShort(ptr, value); + } + + // --- [ putInt ] --- + + /** Unsafe version of: {@link #putInt} */ + static native void nputInt(long ptr, int value); + + /** + * Writes an int value to the specified memory address. + * + * @param ptr the memory address to write + * @param value the value to write + */ + static void putInt(@NativeType("void *") long ptr, @NativeType("int32_t") int value) { + if (CHECKS) { + check(ptr); + } + nputInt(ptr, value); + } + + // --- [ putLong ] --- + + /** Unsafe version of: {@link #putLong} */ + static native void nputLong(long ptr, long value); + + /** + * Writes a long value to the specified memory address. + * + * @param ptr the memory address to write + * @param value the value to write + */ + static void putLong(@NativeType("void *") long ptr, @NativeType("int64_t") long value) { + if (CHECKS) { + check(ptr); + } + nputLong(ptr, value); + } + + // --- [ putFloat ] --- + + /** Unsafe version of: {@link #putFloat} */ + static native void nputFloat(long ptr, float value); + + /** + * Writes a float value to the specified memory address. + * + * @param ptr the memory address to write + * @param value the value to write + */ + static void putFloat(@NativeType("void *") long ptr, float value) { + if (CHECKS) { + check(ptr); + } + nputFloat(ptr, value); + } + + // --- [ putDouble ] --- + + /** Unsafe version of: {@link #putDouble} */ + static native void nputDouble(long ptr, double value); + + /** + * Writes a double value to the specified memory address. + * + * @param ptr the memory address to write + * @param value the value to write + */ + static void putDouble(@NativeType("void *") long ptr, double value) { + if (CHECKS) { + check(ptr); + } + nputDouble(ptr, value); + } + + // --- [ putAddress ] --- + + /** Unsafe version of: {@link #putAddress} */ + static native void nputAddress(long ptr, long value); + + /** + * Writes a pointer address to the specified memory address. + * + * @param ptr the memory address to write + * @param value the value to write + */ + static void putAddress(@NativeType("void *") long ptr, @NativeType("uintptr_t") long value) { + if (CHECKS) { + check(ptr); + } + nputAddress(ptr, value); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryManage.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryManage.java new file mode 100644 index 000000000..b71af09d7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryManage.java @@ -0,0 +1,495 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.system.libffi.*; + +import javax.annotation.*; +import java.util.*; +import java.util.Map.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.StackWalkUtil.*; +import static org.lwjgl.system.libc.LibCStdlib.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** Provides {@link MemoryAllocator} implementations for {@link MemoryUtil} to use. */ +final class MemoryManage { + + private MemoryManage() { + } + + static MemoryAllocator getInstance() { + Object allocator = Configuration.MEMORY_ALLOCATOR.get(); + if (allocator instanceof MemoryAllocator) { + return (MemoryAllocator)allocator; + } + + if (!"system".equals(allocator)) { + String className; + if (allocator == null || "jemalloc".equals(allocator)) { + className = "org.lwjgl.system.jemalloc.JEmallocAllocator"; + } else if ("rpmalloc".equals(allocator)) { + className = "org.lwjgl.system.rpmalloc.RPmallocAllocator"; + } else { + className = allocator.toString(); + } + + try { + Class allocatorClass = Class.forName(className); + return (MemoryAllocator)allocatorClass.getConstructor().newInstance(); + } catch (Throwable t) { + if (Checks.DEBUG && allocator != null) { + t.printStackTrace(DEBUG_STREAM); + } + apiLog(String.format("Warning: Failed to instantiate memory allocator: %s. Using the system default.", className)); + } + } + + return new StdlibAllocator(); + } + + /** stdlib memory allocator. */ + private static class StdlibAllocator implements MemoryAllocator { + + @Override public long getMalloc() { return MemoryAccessJNI.malloc; } + @Override public long getCalloc() { return MemoryAccessJNI.calloc; } + @Override public long getRealloc() { return MemoryAccessJNI.realloc; } + @Override public long getFree() { return MemoryAccessJNI.free; } + @Override public long getAlignedAlloc() { return MemoryAccessJNI.aligned_alloc; } + @Override public long getAlignedFree() { return MemoryAccessJNI.aligned_free; } + + @Override public long malloc(long size) { return nmalloc(size); } + @Override public long calloc(long num, long size) { return ncalloc(num, size); } + @Override public long realloc(long ptr, long size) { return nrealloc(ptr, size); } + @Override public void free(long ptr) { nfree(ptr); } + @Override public long aligned_alloc(long alignment, long size) { return naligned_alloc(alignment, size); } + @Override public void aligned_free(long ptr) { naligned_free(ptr); } + + } + + /** Wraps a MemoryAllocator to track allocations and detect memory leaks. */ + static class DebugAllocator implements MemoryAllocator { + + private static final ConcurrentMap ALLOCATIONS = new ConcurrentHashMap<>(); + private static final ConcurrentMap THREADS = new ConcurrentHashMap<>(); + + private final MemoryAllocator allocator; + + private final long[] callbacks; + + DebugAllocator(MemoryAllocator allocator) { + this.allocator = allocator; + + this.callbacks = new long[] { + new CallbackI() { + @Override public FFICIF getCallInterface() { + return apiCreateCIF(FFI_DEFAULT_ABI, ffi_type_pointer, ffi_type_pointer); + } + @Override public void callback(long ret, long args) { + long size = memGetAddress(memGetAddress(args)); + memPutAddress(ret, malloc(size)); + } + }.address(), + new CallbackI() { + @Override public FFICIF getCallInterface() { + return apiCreateCIF(FFI_DEFAULT_ABI, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer); + } + @Override public void callback(long ret, long args) { + long num = memGetAddress(memGetAddress(args)); + long size = memGetAddress(memGetAddress(args + POINTER_SIZE)); + memPutAddress(ret, calloc(num, size)); + } + }.address(), + new CallbackI() { + @Override public FFICIF getCallInterface() { + return apiCreateCIF(FFI_DEFAULT_ABI, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer); + } + @Override public void callback(long ret, long args) { + long ptr = memGetAddress(memGetAddress(args)); + long size = memGetAddress(memGetAddress(args + POINTER_SIZE)); + memPutAddress(ret, realloc(ptr, size)); + } + }.address(), + new CallbackI() { + @Override public FFICIF getCallInterface() { + return apiCreateCIF(FFI_DEFAULT_ABI, ffi_type_void, ffi_type_pointer); + } + @Override public void callback(long ret, long args) { + long ptr = memGetAddress(memGetAddress(args)); + free(ptr); + } + }.address(), + new CallbackI() { + @Override public FFICIF getCallInterface() { + return apiCreateCIF(FFI_DEFAULT_ABI, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer); + } + @Override public void callback(long ret, long args) { + long alignment = memGetAddress(memGetAddress(args)); + long size = memGetAddress(memGetAddress(args + POINTER_SIZE)); + memPutAddress(ret, aligned_alloc(alignment, size)); + } + }.address(), + new CallbackI() { + @Override public FFICIF getCallInterface() { + return apiCreateCIF(FFI_DEFAULT_ABI, ffi_type_void, ffi_type_pointer); + } + @Override public void callback(long ret, long args) { + long ptr = memGetAddress(memGetAddress(args)); + aligned_free(ptr); + } + }.address() + }; + + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + for (long callback : callbacks) { + Callback.free(callback); + } + + if (ALLOCATIONS.isEmpty()) { + return; + } + + boolean missingStacktrace = false; + for (Allocation allocation : ALLOCATIONS.keySet()) { + StringBuilder sb = new StringBuilder(512); + + sb + .append("[LWJGL] ") + .append(allocation.size) + .append(" bytes leaked, thread ") + .append(allocation.threadId) + .append(" (") + .append(THREADS.get(allocation.threadId)) + .append("), address: 0x") + .append(Long.toHexString(allocation.address).toUpperCase()) + .append("\n"); + + StackTraceElement[] stackTrace = allocation.getElements(); + if (stackTrace != null) { + for (Object el : stackTrace) { + sb + .append("\tat ") + .append(el.toString()) + .append("\n"); + } + } else { + missingStacktrace = true; + } + + DEBUG_STREAM.print(sb); + } + + if (missingStacktrace) { + DEBUG_STREAM.print("[LWJGL] Reminder: disable Configuration.DEBUG_MEMORY_ALLOCATOR_FAST to get stacktraces of leaking allocations.\n"); + } + })); + } + + @Override public long getMalloc() { return callbacks[0]; } + @Override public long getCalloc() { return callbacks[1]; } + @Override public long getRealloc() { return callbacks[2]; } + @Override public long getFree() { return callbacks[3]; } + @Override public long getAlignedAlloc() { return callbacks[4]; } + @Override public long getAlignedFree() { return callbacks[5]; } + + @Override public long malloc(long size) { + return track(allocator.malloc(size), size); + } + + @Override + public long calloc(long num, long size) { + return track(allocator.calloc(num, size), num * size); + } + + @Override + public long realloc(long ptr, long size) { + /* + realloc semantics: + a) if size == 0 and ptr != NULL => free(ptr), return NULL + b) if size != 0 and ptr == NULL => malloc(size), return new address + c) if ptr != NULL and size < oldSize => + 1) reduce size, return ptr + 2) malloc new address, memcpy, free(ptr), return new address + d) if ptr != NULL and oldSize < size => + 1) expand size, return ptr + 2) malloc new address, memcpy, free(ptr), return new address + 3) malloc fails, return NULL + */ + + long oldSize = untrack(ptr); + + long address = allocator.realloc(ptr, size); + + if (address != NULL) { + track(address, size); + } else if (size != 0L) { + track(ptr, oldSize); // d3 + } + + return address; + } + + @Override + public void free(long ptr) { + untrack(ptr); + allocator.free(ptr); + } + + @Override + public long aligned_alloc(long alignment, long size) { + return track(allocator.aligned_alloc(alignment, size), size); + } + + @Override + public void aligned_free(long ptr) { + untrack(ptr); + allocator.aligned_free(ptr); + } + + static long track(long address, long size) { + if (address != NULL) { + Thread t = Thread.currentThread(); + THREADS.putIfAbsent(t.getId(), t.getName()); + + Allocation allocationNew = new Allocation( + address, + size, + t.getId(), + Configuration.DEBUG_MEMORY_ALLOCATOR_FAST.get(false) ? null : stackWalkGetTrace() + ); + + Allocation allocationOld = ALLOCATIONS.put(allocationNew, allocationNew); + if (allocationOld != null) { + trackAbort(address, allocationOld, allocationNew); + } + } + + return address; + } + private static void trackAbort(long address, Allocation allocationOld, Allocation allocationNew) { + String addressHex = Long.toHexString(address).toUpperCase(); + + trackAbortPrint(allocationOld, "Old", addressHex); + trackAbortPrint(allocationNew, "New", addressHex); + + throw new IllegalStateException("The memory address specified is already being tracked: 0x" + addressHex); + } + private static void trackAbortPrint(Allocation allocation, String name, String address) { + StringBuilder sb = new StringBuilder(512); + + sb + .append("[LWJGL] ") + .append(name) + .append(" allocation with size ") + .append(allocation.size) + .append(", thread ") + .append(allocation.threadId) + .append(" (") + .append(THREADS.get(allocation.threadId)) + .append("), address: 0x") + .append(address) + .append("\n"); + + StackTraceElement[] stackTrace = allocation.getElements(); + if (stackTrace != null) { + for (Object el : stackTrace) { + sb + .append("\tat ") + .append(el.toString()) + .append("\n"); + } + } + + DEBUG_STREAM.print(sb); + } + + static long untrack(long address) { + if (address == NULL) { + return 0L; + } + + Allocation allocation = ALLOCATIONS.remove(new Allocation(address, 0L, NULL, null)); + if (allocation == null) { + untrackAbort(address); + } + + return allocation.size; + } + private static void untrackAbort(long address) { + String addressHex = Long.toHexString(address).toUpperCase(); + + throw new IllegalStateException("The memory address specified is not being tracked: 0x" + addressHex); + } + + private static class Allocation { + + final long address; + final long size; + final long threadId; + + @Nullable + private final Object[] stacktrace; + + Allocation(long address, long size, long threadId, @Nullable Object[] stacktrace) { + this.address = address; + this.size = size; + this.threadId = threadId; + this.stacktrace = stacktrace; + } + + @Nullable + private StackTraceElement[] getElements() { + return stacktrace == null ? null : stackWalkArray(stacktrace); + } + + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") + @Override + public boolean equals(Object other) { + return this.address == ((Allocation)other).address; + } + + @Override + public int hashCode() { + return Long.hashCode(address); + } + + } + + static void report(MemoryAllocationReport report) { + for (Allocation allocation : ALLOCATIONS.keySet()) { + report.invoke(allocation.address, allocation.size, allocation.threadId, THREADS.get(allocation.threadId), allocation.getElements()); + } + } + + private static void aggregate(T t, long size, Map map) { + AtomicLong node = map.computeIfAbsent(t, k -> new AtomicLong()); + node.set(node.get() + size); + } + + static void report( + MemoryAllocationReport report, + MemoryAllocationReport.Aggregate groupByStackTrace, + boolean groupByThread + ) { + switch (groupByStackTrace) { + case ALL: + reportAll(report, groupByThread); + break; + case GROUP_BY_METHOD: + reportByMethod(report, groupByThread); + break; + case GROUP_BY_STACKTRACE: + reportByStacktrace(report, groupByThread); + break; + } + } + private static void reportAll(MemoryAllocationReport report, boolean groupByThread) { + if (groupByThread) { + Map mapThread = new HashMap<>(); + for (Allocation allocation : ALLOCATIONS.values()) { + aggregate(allocation.threadId, allocation.size, mapThread); + } + for (Entry entry : mapThread.entrySet()) { + report.invoke(NULL, entry.getValue().get(), entry.getKey(), THREADS.get(entry.getKey()), (StackTraceElement[])null); + } + } else { + long total = 0L; + for (Allocation allocation : ALLOCATIONS.values()) { + total += allocation.size; + } + report.invoke(NULL, total, NULL, null, (StackTraceElement[])null); + } + } + private static void reportByMethod(MemoryAllocationReport report, boolean groupByThread) { + // Group by stackTrace[0] + if (groupByThread) { + Map> mapThreadMethod = new HashMap<>(); + for (Allocation allocation : ALLOCATIONS.keySet()) { + StackTraceElement[] elements = allocation.getElements(); + if (elements != null) { + Map mapMethod = mapThreadMethod.computeIfAbsent(allocation.threadId, k -> new HashMap<>()); + aggregate(elements[0], allocation.size, mapMethod); + } + } + + for (Entry> tms : mapThreadMethod.entrySet()) { + long threadId = tms.getKey(); + String threadName = THREADS.get(threadId); + for (Entry ms : tms.getValue().entrySet()) { + report.invoke(NULL, ms.getValue().get(), threadId, threadName, ms.getKey()); + } + } + } else { + Map mapMethod = new HashMap<>(); + for (Allocation allocation : ALLOCATIONS.keySet()) { + StackTraceElement[] elements = allocation.getElements(); + if (elements != null) { + aggregate(elements[0], allocation.size, mapMethod); + } + } + for (Entry ms : mapMethod.entrySet()) { + report.invoke(NULL, ms.getValue().get(), NULL, null, ms.getKey()); + } + } + } + private static void reportByStacktrace(MemoryAllocationReport report, boolean groupByThread) { + // Group by stackTrace[] + if (groupByThread) { + Map> mapThreadStackTrace = new HashMap<>(); + for (Allocation allocation : ALLOCATIONS.keySet()) { + StackTraceElement[] elements = allocation.getElements(); + if (elements != null) { + Map mapStackTrace = mapThreadStackTrace.computeIfAbsent(allocation.threadId, k -> new HashMap<>()); + aggregate(new AllocationKey(elements), allocation.size, mapStackTrace); + } + + } + + for (Entry> tss : mapThreadStackTrace.entrySet()) { + long threadId = tss.getKey(); + for (Entry ss : tss.getValue().entrySet()) { + report.invoke(NULL, ss.getValue().get(), threadId, THREADS.get(threadId), ss.getKey().elements); + } + } + } else { + Map mapStackTrace = new HashMap<>(); + for (Allocation allocation : ALLOCATIONS.keySet()) { + StackTraceElement[] elements = allocation.getElements(); + if (elements != null) { + aggregate(new AllocationKey(elements), allocation.size, mapStackTrace); + } + } + for (Entry ss : mapStackTrace.entrySet()) { + report.invoke(NULL, ss.getValue().get(), NULL, null, ss.getKey().elements); + } + } + } + // Used by GROUP_BY_STACKTRACE only. + private static class AllocationKey { + + final StackTraceElement[] elements; + + AllocationKey(StackTraceElement[] elements) { + this.elements = elements; + } + + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") + @Override public boolean equals(Object other) { + return this == other || Arrays.equals(elements, ((AllocationKey)other).elements); + } + + @Override public int hashCode() { + return Arrays.hashCode(elements); + } + + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryStack.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryStack.java new file mode 100644 index 000000000..b5eea83c7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryStack.java @@ -0,0 +1,1127 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.*; + +import javax.annotation.*; +import java.nio.*; +import java.util.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.StackWalkUtil.*; + +/** + * An off-heap memory stack. + * + *

    This class should be used in a thread-local manner for stack allocations.

    + * + * @see Configuration#STACK_SIZE + * @see Configuration#DEBUG_STACK + */ +public class MemoryStack extends Pointer.Default implements AutoCloseable { + + private static final int DEFAULT_STACK_SIZE = Configuration.STACK_SIZE.get(64) * 1024; + private static final int DEFAULT_STACK_FRAMES = 8; + + private static final ThreadLocal TLS = ThreadLocal.withInitial(MemoryStack::create); + + static { + if (DEFAULT_STACK_SIZE < 0) { + throw new IllegalStateException("Invalid stack size."); + } + } + + @SuppressWarnings({"FieldCanBeLocal", "unused"}) + @Nullable + private final ByteBuffer container; + + private final int size; + + private int pointer; + + private int[] frames; + protected int frameIndex; + + /** + * Creates a new {@code MemoryStack} backed by the specified memory region. + * + *

    In the initial state, there is no active stack frame. The {@link #push} method must be used before any allocations.

    + * + * @param container the backing memory buffer, may be null + * @param address the backing memory address + * @param size the backing memory size + */ + protected MemoryStack(@Nullable ByteBuffer container, long address, int size) { + super(address); + this.container = container; + + this.size = size; + this.pointer = size; + + this.frames = new int[DEFAULT_STACK_FRAMES]; + } + + /** + * Creates a new {@code MemoryStack} with the default size. + * + *

    In the initial state, there is no active stack frame. The {@link #push} method must be used before any allocations.

    + */ + public static MemoryStack create() { + return create(DEFAULT_STACK_SIZE); + } + + /** + * Creates a new {@code MemoryStack} with the specified size. + * + *

    In the initial state, there is no active stack frame. The {@link #push} method must be used before any allocations.

    + * + * @param capacity the maximum number of bytes that may be allocated on the stack + */ + public static MemoryStack create(int capacity) { + return create(BufferUtils.createByteBuffer(capacity)); + } + + /** + * Creates a new {@code MemoryStack} backed by the specified memory buffer. + * + *

    In the initial state, there is no active stack frame. The {@link #push} method must be used before any allocations.

    + * + * @param buffer the backing memory buffer + */ + public static MemoryStack create(ByteBuffer buffer) { + long address = memAddress(buffer); + int size = buffer.remaining(); + return Configuration.DEBUG_STACK.get(false) + ? new DebugMemoryStack(buffer, address, size) + : new MemoryStack(buffer, address, size); + } + + /** + * Creates a new {@code MemoryStack} backed by the specified memory region. + * + *

    In the initial state, there is no active stack frame. The {@link #push} method must be used before any allocations.

    + * + * @param address the backing memory address + * @param size the backing memory size + */ + public static MemoryStack ncreate(long address, int size) { + return Configuration.DEBUG_STACK.get(false) + ? new DebugMemoryStack(null, address, size) + : new MemoryStack(null, address, size); + } + + /** + * Stores the current stack pointer and pushes a new frame to the stack. + * + *

    This method should be called when entering a method, before doing any stack allocations. When exiting a method, call the {@link #pop} method to + * restore the previous stack frame.

    + * + *

    Pairs of push/pop calls may be nested. Care must be taken to:

    + *
      + *
    • match every push with a pop
    • + *
    • not call pop before push has been called at least once
    • + *
    • not nest push calls to more than the maximum supported depth
    • + *
    + * + * @return this stack + */ + public MemoryStack push() { + if (frameIndex == frames.length) { + frameOverflow(); + } + + frames[frameIndex++] = pointer; + return this; + } + + private void frameOverflow() { + if (DEBUG) { + apiLog("[WARNING] Out of frame stack space (" + frames.length + ") in thread: " + Thread.currentThread()); + } + frames = Arrays.copyOf(frames, frames.length * 3 / 2); + } + + /** + * Pops the current stack frame and moves the stack pointer to the end of the previous stack frame. + * + * @return this stack + */ + public MemoryStack pop() { + pointer = frames[--frameIndex]; + return this; + } + + /** + * Calls {@link #pop} on this {@code MemoryStack}. + * + *

    This method should not be used directly. It is called automatically when the {@code MemoryStack} is used as a resource in a try-with-resources + * statement.

    + */ + @Override + public void close() { + //noinspection resource + pop(); + } + + /** Stores the method that pushed a frame and checks if it is the same method when the frame is popped. */ + private static class DebugMemoryStack extends MemoryStack { + + private Object[] debugFrames; + + DebugMemoryStack(@Nullable ByteBuffer buffer, long address, int size) { + super(buffer, address, size); + debugFrames = new Object[DEFAULT_STACK_FRAMES]; + } + + @Override + public MemoryStack push() { + if (frameIndex == debugFrames.length) { + frameOverflow(); + } + + debugFrames[frameIndex] = stackWalkGetMethod(MemoryStack.class); + + return super.push(); + } + + private void frameOverflow() { + debugFrames = Arrays.copyOf(debugFrames, debugFrames.length * 3 / 2); + } + + @Override + public MemoryStack pop() { + Object pushed = debugFrames[frameIndex - 1]; + Object popped = stackWalkCheckPop(MemoryStack.class, pushed); + if (popped != null) { + reportAsymmetricPop(pushed, popped); + } + + debugFrames[frameIndex - 1] = null; + return super.pop(); + } + + // No need to check pop in try-with-resources + @Override + public void close() { + debugFrames[frameIndex - 1] = null; + super.pop(); + } + + private static void reportAsymmetricPop(Object pushed, Object popped) { + DEBUG_STREAM.format( + "[LWJGL] Asymmetric pop detected:\n\tPUSHED: %s\n\tPOPPED: %s\n\tTHREAD: %s\n", + pushed, + popped, + Thread.currentThread() + ); + } + + } + + /** + * Returns the address of the backing off-heap memory. + * + *

    The stack grows "downwards", so the bottom of the stack is at {@code address + size}, while the top is at {@code address}.

    + */ + public long getAddress() { + return address; + } + + /** + * Returns the size of the backing off-heap memory. + * + *

    This is the maximum number of bytes that may be allocated on the stack.

    + */ + public int getSize() { + return size; + } + + /** + * Returns the current frame index. + * + *

    This is the current number of nested {@link #push} calls.

    + */ + public int getFrameIndex() { + return frameIndex; + } + + /** Returns the memory address at the current stack pointer. */ + public long getPointerAddress() { + return address + (pointer & 0xFFFF_FFFFL); + } + + /** + * Returns the current stack pointer. + * + *

    The stack grows "downwards", so when the stack is empty {@code pointer} is equal to {@code size}. On every allocation {@code pointer} is reduced by + * the allocated size (after alignment) and {@code address + pointer} points to the first byte of the last allocation.

    + * + *

    Effectively, this methods returns how many more bytes may be allocated on the stack.

    + */ + public int getPointer() { + return pointer; + } + + /** + * Sets the current stack pointer. + * + *

    This method directly manipulates the stack pointer. Using it irresponsibly may break the internal state of the stack. It should only be used in rare + * cases or in auto-generated code.

    + */ + public void setPointer(int pointer) { + if (CHECKS) { + checkPointer(pointer); + } + + this.pointer = pointer; + } + + private void checkPointer(int pointer) { + if (pointer < 0 || size < pointer) { + throw new IndexOutOfBoundsException("Invalid stack pointer"); + } + } + + private static void checkAlignment(int alignment) { + if (Integer.bitCount(alignment) != 1) { + throw new IllegalArgumentException("Alignment must be a power-of-two value."); + } + } + + /** + * Calls {@link #nmalloc(int, int)} with {@code alignment} equal to {@link Pointer#POINTER_SIZE POINTER_SIZE}. + * + * @param size the allocation size + * + * @return the memory address on the stack for the requested allocation + */ + public long nmalloc(int size) { + return nmalloc(POINTER_SIZE, size); + } + + /** + * Allocates a block of {@code size} bytes of memory on the stack. The content of the newly allocated block of memory is not initialized, remaining with + * indeterminate values. + * + * @param alignment the required alignment + * @param size the allocation size + * + * @return the memory address on the stack for the requested allocation + */ + public long nmalloc(int alignment, int size) { + // Align address to the specified alignment + long address = (this.address + pointer - size) & ~Integer.toUnsignedLong(alignment - 1); + + pointer = (int)(address - this.address); + if (CHECKS && pointer < 0) { + throw new OutOfMemoryError("Out of stack space."); + } + + return address; + } + + /** + * Allocates a block of memory on the stack for an array of {@code num} elements, each of them {@code size} bytes long, and initializes all its bits to + * zero. + * + * @param alignment the required element alignment + * @param num num the number of elements to allocate + * @param size the size of each element + * + * @return the memory address on the stack for the requested allocation + */ + public long ncalloc(int alignment, int num, int size) { + int bytes = num * size; + long address = nmalloc(alignment, bytes); + memSet(address, 0, bytes); + return address; + } + + // ------------------------------------------------- + + /** + * Allocates an aligned {@link ByteBuffer} on the stack. + * + * @param alignment the required buffer alignment + * @param size the number of elements in the buffer + * + * @return the allocated buffer + */ + public ByteBuffer malloc(int alignment, int size) { + if (DEBUG) { + checkAlignment(alignment); + } + return MemoryUtil.wrap(BUFFER_BYTE, nmalloc(alignment, size), size).order(NATIVE_ORDER); + } + /** Calloc version of {@link #malloc(int, int)}. */ + public ByteBuffer calloc(int alignment, int size) { + if (DEBUG) { + checkAlignment(alignment); + } + return MemoryUtil.wrap(BUFFER_BYTE, ncalloc(alignment, size, 1), size).order(NATIVE_ORDER); + } + + /** + * Allocates a {@link ByteBuffer} on the stack with {@code alignment} equal to {@link Pointer#POINTER_SIZE POINTER_SIZE}. + * + * @param size the number of elements in the buffer + * + * @return the allocated buffer + */ + public ByteBuffer malloc(int size) { + return MemoryUtil.wrap(BUFFER_BYTE, nmalloc(POINTER_SIZE, size), size).order(NATIVE_ORDER); + } + /** Calloc version of {@link #malloc(int)}. */ + public ByteBuffer calloc(int size) { + return MemoryUtil.wrap(BUFFER_BYTE, ncalloc(POINTER_SIZE, size, 1), size).order(NATIVE_ORDER); + } + + /** Unsafe version of {@link #bytes(byte)}. */ + public long nbyte(byte value) { + long a = nmalloc(1, 1); + memPutByte(a, value); + return a; + } + /** Single value version of {@link #malloc}. */ + public ByteBuffer bytes(byte x) { return malloc(1, 1).put(0, x); } + /** Two value version of {@link #malloc}. */ + public ByteBuffer bytes(byte x, byte y) { return malloc(1, 2).put(0, x).put(1, y); } + /** Three value version of {@link #malloc}. */ + public ByteBuffer bytes(byte x, byte y, byte z) { return malloc(1, 3).put(0, x).put(1, y).put(2, z); } + /** Four value version of {@link #malloc}. */ + public ByteBuffer bytes(byte x, byte y, byte z, byte w) { return malloc(1, 4).put(0, x).put(1, y).put(2, z).put(3, w); } + /** Vararg version of {@link #malloc}. */ + public ByteBuffer bytes(byte... values) { + ByteBuffer buffer = malloc(1, values.length).put(values); + buffer.flip(); + return buffer; + } + + // ------------------------------------------------- + + /** Short version of {@link #malloc(int)}. */ + public ShortBuffer mallocShort(int size) { return MemoryUtil.wrap(BUFFER_SHORT, nmalloc(2, size << 1), size); } + /** Short version of {@link #calloc(int)}. */ + public ShortBuffer callocShort(int size) { + int bytes = size * 2; + long address = nmalloc(2, bytes); + memSet(address, 0, bytes); + return MemoryUtil.wrap(BUFFER_SHORT, address, size); + } + + /** Unsafe version of {@link #shorts(short)}. */ + public long nshort(short value) { + long a = nmalloc(2, 2); + memPutShort(a, value); + return a; + } + /** Single value version of {@link #mallocShort}. */ + public ShortBuffer shorts(short x) { return mallocShort(1).put(0, x); } + /** Two value version of {@link #mallocShort}. */ + public ShortBuffer shorts(short x, short y) { return mallocShort(2).put(0, x).put(1, y); } + /** Three value version of {@link #mallocShort}. */ + public ShortBuffer shorts(short x, short y, short z) { return mallocShort(3).put(0, x).put(1, y).put(2, z); } + /** Four value version of {@link #mallocShort}. */ + public ShortBuffer shorts(short x, short y, short z, short w) { return mallocShort(4).put(0, x).put(1, y).put(2, z).put(3, w); } + /** Vararg version of {@link #mallocShort}. */ + public ShortBuffer shorts(short... values) { + ShortBuffer buffer = mallocShort(values.length).put(values); + buffer.flip(); + return buffer; + } + + // ------------------------------------------------- + + /** Int version of {@link #malloc(int)}. */ + public IntBuffer mallocInt(int size) { return MemoryUtil.wrap(BUFFER_INT, nmalloc(4, size << 2), size); } + /** Int version of {@link #calloc(int)}. */ + public IntBuffer callocInt(int size) { + int bytes = size * 4; + long address = nmalloc(4, bytes); + memSet(address, 0, bytes); + return MemoryUtil.wrap(BUFFER_INT, address, size); + } + + /** Unsafe version of {@link #ints(int)}. */ + public long nint(int value) { + long a = nmalloc(4, 4); + memPutInt(a, value); + return a; + } + /** Single value version of {@link #mallocInt}. */ + public IntBuffer ints(int x) { return mallocInt(1).put(0, x); } + /** Two value version of {@link #mallocInt}. */ + public IntBuffer ints(int x, int y) { return mallocInt(2).put(0, x).put(1, y); } + /** Three value version of {@link #mallocInt}. */ + public IntBuffer ints(int x, int y, int z) { return mallocInt(3).put(0, x).put(1, y).put(2, z); } + /** Four value version of {@link #mallocInt}. */ + public IntBuffer ints(int x, int y, int z, int w) { return mallocInt(4).put(0, x).put(1, y).put(2, z).put(3, w); } + /** Vararg version of {@link #mallocInt}. */ + public IntBuffer ints(int... values) { + IntBuffer buffer = mallocInt(values.length).put(values); + buffer.flip(); + return buffer; + } + + // ------------------------------------------------- + + /** Long version of {@link #malloc(int)}. */ + public LongBuffer mallocLong(int size) { return MemoryUtil.wrap(BUFFER_LONG, nmalloc(8, size << 3), size); } + /** Long version of {@link #calloc(int)}. */ + public LongBuffer callocLong(int size) { + int bytes = size * 8; + long address = nmalloc(8, bytes); + memSet(address, 0, bytes); + return MemoryUtil.wrap(BUFFER_LONG, address, size); + } + + /** Unsafe version of {@link #longs(long)}. */ + public long nlong(long value) { + long a = nmalloc(8, 8); + memPutLong(a, value); + return a; + } + /** Single value version of {@link #mallocLong}. */ + public LongBuffer longs(long x) { return mallocLong(1).put(0, x); } + /** Two value version of {@link #mallocLong}. */ + public LongBuffer longs(long x, long y) { return mallocLong(2).put(0, x).put(1, y); } + /** Three value version of {@link #mallocLong}. */ + public LongBuffer longs(long x, long y, long z) { return mallocLong(3).put(0, x).put(1, y).put(2, z); } + /** Four value version of {@link #mallocLong}. */ + public LongBuffer longs(long x, long y, long z, long w) { return mallocLong(4).put(0, x).put(1, y).put(2, z).put(3, w); } + /** Vararg version of {@link #mallocLong}. */ + public LongBuffer longs(long... more) { + LongBuffer buffer = mallocLong(more.length).put(more); + buffer.flip(); + return buffer; + } + + // ------------------------------------------------- + + /** CLong version of {@link #malloc(int)}. */ + public CLongBuffer mallocCLong(int size) { return CLongBuffer.create(nmalloc(CLONG_SIZE, size << CLONG_SHIFT), size); } + /** CLong version of {@link #calloc(int)}. */ + public CLongBuffer callocCLong(int size) { + int bytes = size * CLONG_SIZE; + long address = nmalloc(CLONG_SIZE, bytes); + memSet(address, 0, bytes); + return CLongBuffer.create(address, size); + } + + /** Unsafe version of {@link #clongs(long)}. */ + public long nclong(long value) { + long a = nmalloc(CLONG_SIZE, CLONG_SIZE); + memPutCLong(a, value); + return a; + } + /** Single value version of {@link #mallocCLong}. */ + public CLongBuffer clongs(long x) { return mallocCLong(1).put(0, x); } + /** Two value version of {@link #mallocCLong}. */ + public CLongBuffer clongs(long x, long y) { return mallocCLong(2).put(0, x).put(1, y); } + /** Three value version of {@link #mallocCLong}. */ + public CLongBuffer clongs(long x, long y, long z) { return mallocCLong(3).put(0, x).put(1, y).put(2, z); } + /** Four value version of {@link #mallocCLong}. */ + public CLongBuffer clongs(long x, long y, long z, long w) { return mallocCLong(4).put(0, x).put(1, y).put(2, z).put(3, w); } + /** Vararg version of {@link #mallocCLong}. */ + public CLongBuffer clongs(long... values) { + CLongBuffer buffer = mallocCLong(values.length).put(values); + buffer.flip(); + return buffer; + } + + // ------------------------------------------------- + + /** Float version of {@link #malloc(int)}. */ + public FloatBuffer mallocFloat(int size) { return MemoryUtil.wrap(BUFFER_FLOAT, nmalloc(4, size << 2), size); } + /** Float version of {@link #calloc(int)}. */ + public FloatBuffer callocFloat(int size) { + int bytes = size * 4; + long address = nmalloc(4, bytes); + memSet(address, 0, bytes); + return MemoryUtil.wrap(BUFFER_FLOAT, address, size); + } + + /** Unsafe version of {@link #floats(float)}. */ + public long nfloat(float value) { + long a = nmalloc(4, 4); + memPutFloat(a, value); + return a; + } + /** Single value version of {@link #mallocFloat}. */ + public FloatBuffer floats(float x) { return mallocFloat(1).put(0, x); } + /** Two value version of {@link #mallocFloat}. */ + public FloatBuffer floats(float x, float y) { return mallocFloat(2).put(0, x).put(1, y); } + /** Three value version of {@link #mallocFloat}. */ + public FloatBuffer floats(float x, float y, float z) { return mallocFloat(3).put(0, x).put(1, y).put(2, z); } + /** Four value version of {@link #mallocFloat}. */ + public FloatBuffer floats(float x, float y, float z, float w) { return mallocFloat(4).put(0, x).put(1, y).put(2, z).put(3, w); } + /** Vararg version of {@link #mallocFloat}. */ + public FloatBuffer floats(float... values) { + FloatBuffer buffer = mallocFloat(values.length).put(values); + buffer.flip(); + return buffer; + } + + // ------------------------------------------------- + + /** Double version of {@link #malloc(int)}. */ + public DoubleBuffer mallocDouble(int size) { return MemoryUtil.wrap(BUFFER_DOUBLE, nmalloc(8, size << 3), size); } + /** Double version of {@link #calloc(int)}. */ + public DoubleBuffer callocDouble(int size) { + int bytes = size * 8; + long address = nmalloc(8, bytes); + memSet(address, 0, bytes); + return MemoryUtil.wrap(BUFFER_DOUBLE, address, size); + } + + /** Unsafe version of {@link #doubles(double)}. */ + public long ndouble(double value) { + long a = nmalloc(8, 8); + memPutDouble(a, value); + return a; + } + /** Single value version of {@link #mallocDouble}. */ + public DoubleBuffer doubles(double x) { return mallocDouble(1).put(0, x); } + /** Two value version of {@link #mallocDouble}. */ + public DoubleBuffer doubles(double x, double y) { return mallocDouble(2).put(0, x).put(1, y); } + /** Three value version of {@link #mallocDouble}. */ + public DoubleBuffer doubles(double x, double y, double z) { return mallocDouble(3).put(0, x).put(1, y).put(2, z); } + /** Four value version of {@link #mallocDouble}. */ + public DoubleBuffer doubles(double x, double y, double z, double w) { return mallocDouble(4).put(0, x).put(1, y).put(2, z).put(3, w); } + /** Vararg version of {@link #mallocDouble}. */ + public DoubleBuffer doubles(double... values) { + DoubleBuffer buffer = mallocDouble(values.length).put(values); + buffer.flip(); + return buffer; + } + + // ------------------------------------------------- + + /** Pointer version of {@link #malloc(int)}. */ + public PointerBuffer mallocPointer(int size) { return PointerBuffer.create(nmalloc(POINTER_SIZE, size << POINTER_SHIFT), size); } + /** Pointer version of {@link #calloc(int)}. */ + public PointerBuffer callocPointer(int size) { + int bytes = size * POINTER_SIZE; + long address = nmalloc(POINTER_SIZE, bytes); + memSet(address, 0, bytes); + return PointerBuffer.create(address, size); + } + + /** Unsafe version of {@link #pointers(long)}. */ + public long npointer(long value) { + long a = nmalloc(POINTER_SIZE, POINTER_SIZE); + memPutAddress(a, value); + return a; + } + /** Single value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(long x) { return mallocPointer(1).put(0, x); } + /** Two value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(long x, long y) { return mallocPointer(2).put(0, x).put(1, y); } + /** Three value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(long x, long y, long z) { return mallocPointer(3).put(0, x).put(1, y).put(2, z); } + /** Four value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(long x, long y, long z, long w) { return mallocPointer(4).put(0, x).put(1, y).put(2, z).put(3, w); } + /** Vararg version of {@link #mallocPointer}. */ + public PointerBuffer pointers(long... values) { + PointerBuffer buffer = mallocPointer(values.length).put(values); + buffer.flip(); + return buffer; + } + + /** Unsafe version of {@link #pointers(Pointer)}. */ + public long npointer(Pointer value) { + long a = nmalloc(POINTER_SIZE, POINTER_SIZE); + memPutAddress(a, value.address()); + return a; + } + /** Single value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(Pointer x) { return mallocPointer(1).put(0, x); } + /** Two value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(Pointer x, Pointer y) { return mallocPointer(2).put(0, x).put(1, y); } + /** Three value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(Pointer x, Pointer y, Pointer z) { return mallocPointer(3).put(0, x).put(1, y).put(2, z); } + /** Four value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(Pointer x, Pointer y, Pointer z, Pointer w) { return mallocPointer(4).put(0, x).put(1, y).put(2, z).put(3, w); } + /** Vararg version of {@link #mallocPointer}. */ + public PointerBuffer pointers(Pointer... values) { + PointerBuffer buffer = mallocPointer(values.length); + for (int i = 0; i < values.length; i++) { + buffer.put(i, values[i]); + } + return buffer; + } + + /** Unsafe version of {@link #pointers(Buffer)}. */ + public long npointer(Buffer value) { + long a = nmalloc(POINTER_SIZE, POINTER_SIZE); + memPutAddress(a, memAddress(value)); + return a; + } + /** Single value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(Buffer x) { + return mallocPointer(1) + .put(0, memAddress(x)); + } + /** Two value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(Buffer x, Buffer y) { + return mallocPointer(2) + .put(0, memAddress(x)) + .put(1, memAddress(y)); + } + /** Three value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(Buffer x, Buffer y, Buffer z) { + return mallocPointer(3) + .put(0, memAddress(x)) + .put(1, memAddress(y)) + .put(2, memAddress(z)); + } + /** Four value version of {@link #mallocPointer}. */ + public PointerBuffer pointers(Buffer x, Buffer y, Buffer z, Buffer w) { + return mallocPointer(4) + .put(0, memAddress(x)) + .put(1, memAddress(y)) + .put(2, memAddress(z)) + .put(3, memAddress(w)); + } + /** Vararg version of {@link #mallocPointer}. */ + public PointerBuffer pointers(Buffer... values) { + PointerBuffer buffer = mallocPointer(values.length); + for (int i = 0; i < values.length; i++) { + buffer.put(i, memAddress(values[i])); + } + return buffer; + } + + // ------------------------------------------------- + + /** + * Allocates a new {@link PointerBuffer} of size {@code buffer.remaining()} + * and fills it with the addresses of the values within the provided {@link CustomBuffer} + * starting at {@code buffer.position()}. + * + * @param buffer the {@link CustomBuffer} to obtain its element addresses of + * + * @return a {@link PointerBuffer} containing the buffer's element addresses + */ + public PointerBuffer pointersOfElements(CustomBuffer buffer) { + int remaining = buffer.remaining(); + long addr = buffer.address(); + long sizeof = buffer.sizeof(); + + PointerBuffer pointerBuffer = mallocPointer(remaining); + for (int i = 0; i < remaining; i++) { + pointerBuffer.put(i, addr + sizeof * i); + } + + return pointerBuffer; + } + + // ------------------------------------------------- + + /** + * Encodes the specified text on the stack using ASCII encoding and returns a {@code ByteBuffer} that points to the encoded text, including a + * null-terminator. + * + *

    The buffer will have {@code alignment} equal to {@link Pointer#POINTER_SIZE POINTER_SIZE}.

    + * + * @param text the text to encode + */ + public ByteBuffer ASCII(CharSequence text) { + return ASCII(text, true); + } + + /** + * Encodes the specified text on the stack using ASCII encoding and returns a {@code ByteBuffer} that points to the encoded text. + * + *

    The buffer will have {@code alignment} equal to {@link Pointer#POINTER_SIZE POINTER_SIZE}.

    + * + * @param text the text to encode + * @param nullTerminated if true, a null-terminator is included at the end of the encoded text + */ + public ByteBuffer ASCII(CharSequence text, boolean nullTerminated) { + int length = memLengthASCII(text, nullTerminated); + long target = nmalloc(POINTER_SIZE, length); + encodeASCIIUnsafe(text, nullTerminated, target); + return MemoryUtil.wrap(BUFFER_BYTE, target, length).order(NATIVE_ORDER); + } + + /** + * Encodes the specified text on the stack using ASCII encoding and returns the encoded text length, in bytes. + * + *

    Use {@link #getPointerAddress} immediately after this method to get the encoded text address, which will have {@code alignment} equal to + * {@link Pointer#POINTER_SIZE POINTER_SIZE}.

    + * + * @param text the text to encode + * @param nullTerminated if true, a null-terminator is included at the end of the encoded text + */ + public int nASCII(CharSequence text, boolean nullTerminated) { + long target = nmalloc(POINTER_SIZE, memLengthASCII(text, nullTerminated)); + return encodeASCIIUnsafe(text, nullTerminated, target); + } + + /** Like {@link #ASCII(CharSequence) ASCII}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public ByteBuffer ASCIISafe(@Nullable CharSequence text) { + return ASCIISafe(text, true); + } + + /** Like {@link #ASCII(CharSequence, boolean) ASCII}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public ByteBuffer ASCIISafe(@Nullable CharSequence text, boolean nullTerminated) { + return text == null ? null : ASCII(text, nullTerminated); + } + + /** Like {@link #nASCII(CharSequence, boolean) nASCII}, but returns 0 if {@code text} is {@code null}. */ + public int nASCIISafe(@Nullable CharSequence text, boolean nullTerminated) { + return text == null ? 0 : nASCII(text, nullTerminated); + } + + /** + * Encodes the specified text on the stack using UTF8 encoding and returns a {@code ByteBuffer} that points to the encoded text, including a + * null-terminator. + * + *

    The buffer will have {@code alignment} equal to {@link Pointer#POINTER_SIZE POINTER_SIZE}.

    + * + * @param text the text to encode + */ + public ByteBuffer UTF8(CharSequence text) { + return UTF8(text, true); + } + + /** + * Encodes the specified text on the stack using UTF8 encoding and returns a {@code ByteBuffer} that points to the encoded text. + * + *

    The buffer will have {@code alignment} equal to {@link Pointer#POINTER_SIZE POINTER_SIZE}.

    + * + * @param text the text to encode + * @param nullTerminated if true, a null-terminator is included at the end of the encoded text + */ + public ByteBuffer UTF8(CharSequence text, boolean nullTerminated) { + int length = memLengthUTF8(text, nullTerminated); + long target = nmalloc(POINTER_SIZE, length); + encodeUTF8Unsafe(text, nullTerminated, target); + return MemoryUtil.wrap(BUFFER_BYTE, target, length).order(NATIVE_ORDER); + } + + /** + * Encodes the specified text on the stack using UTF8 encoding and returns the encoded text length, in bytes. + * + *

    Use {@link #getPointerAddress} immediately after this method to get the encoded text address, which will have {@code alignment} equal to + * {@link Pointer#POINTER_SIZE POINTER_SIZE}.

    + * + * @param text the text to encode + * @param nullTerminated if true, a null-terminator is included at the end of the encoded text + */ + public int nUTF8(CharSequence text, boolean nullTerminated) { + long target = nmalloc(POINTER_SIZE, memLengthUTF8(text, nullTerminated)); + return encodeUTF8Unsafe(text, nullTerminated, target); + } + + /** Like {@link #UTF8(CharSequence) UTF8}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public ByteBuffer UTF8Safe(@Nullable CharSequence text) { + return UTF8Safe(text, true); + } + + /** Like {@link #UTF8(CharSequence, boolean) UTF8}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public ByteBuffer UTF8Safe(@Nullable CharSequence text, boolean nullTerminated) { + return text == null ? null : UTF8(text, nullTerminated); + } + + /** Like {@link #nUTF8(CharSequence, boolean) nUTF8}, but returns 0 if {@code text} is {@code null}. */ + public int nUTF8Safe(@Nullable CharSequence text, boolean nullTerminated) { + return text == null ? 0 : nUTF8(text, nullTerminated); + } + + /** + * Encodes the specified text on the stack using UTF16 encoding and returns a {@code ByteBuffer} that points to the encoded text, including a + * null-terminator. + * + *

    The buffer will have {@code alignment} equal to {@link Pointer#POINTER_SIZE POINTER_SIZE}.

    + * + * @param text the text to encode + */ + public ByteBuffer UTF16(CharSequence text) { + return UTF16(text, true); + } + + /** + * Encodes the specified text on the stack using UTF16 encoding and returns a {@code ByteBuffer} that points to the encoded text. + * + *

    The buffer will have {@code alignment} equal to {@link Pointer#POINTER_SIZE POINTER_SIZE}.

    + * + * @param text the text to encode + * @param nullTerminated if true, a null-terminator is included at the end of the encoded text + */ + public ByteBuffer UTF16(CharSequence text, boolean nullTerminated) { + int length = memLengthUTF16(text, nullTerminated); + long target = nmalloc(POINTER_SIZE, length); + encodeUTF16Unsafe(text, nullTerminated, target); + return MemoryUtil.wrap(BUFFER_BYTE, target, length).order(NATIVE_ORDER); + } + + /** + * Encodes the specified text on the stack using UTF16 encoding and returns the encoded text length, in bytes. + * + *

    Use {@link #getPointerAddress} immediately after this method to get the encoded text address, which will have {@code alignment} equal to + * {@link Pointer#POINTER_SIZE POINTER_SIZE}.

    + * + * @param text the text to encode + * @param nullTerminated if true, a null-terminator is included at the end of the encoded text + */ + public int nUTF16(CharSequence text, boolean nullTerminated) { + long target = nmalloc(POINTER_SIZE, memLengthUTF16(text, nullTerminated)); + return encodeUTF16Unsafe(text, nullTerminated, target); + } + + /** Like {@link #UTF16(CharSequence) UTF16}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public ByteBuffer UTF16Safe(@Nullable CharSequence text) { + return UTF16Safe(text, true); + } + + /** Like {@link #UTF16(CharSequence, boolean) UTF16}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public ByteBuffer UTF16Safe(@Nullable CharSequence text, boolean nullTerminated) { + return text == null ? null : UTF16(text, nullTerminated); + } + + /** Like {@link #nUTF16(CharSequence, boolean) nUTF16}, but returns 0 if {@code text} is {@code null}. */ + public int nUTF16Safe(@Nullable CharSequence text, boolean nullTerminated) { + return text == null ? 0 : nUTF16(text, nullTerminated); + } + + // ----------------------------------------------------- + // ----------------------------------------------------- + // ----------------------------------------------------- + + /** Returns the stack of the current thread. */ + public static MemoryStack stackGet() { + return TLS.get(); + } + + /** + * Calls {@link #push} on the stack of the current thread. + * + * @return the stack of the current thread. + */ + public static MemoryStack stackPush() { + return stackGet().push(); + } + + /** + * Calls {@link #pop} on the stack of the current thread. + * + * @return the stack of the current thread. + */ + public static MemoryStack stackPop() { + return stackGet().pop(); + } + + /** Thread-local version of {@link #nmalloc(int)}. */ + public static long nstackMalloc(int size) { return stackGet().nmalloc(size); } + /** Thread-local version of {@link #nmalloc(int, int)}. */ + public static long nstackMalloc(int alignment, int size) { return stackGet().nmalloc(alignment, size); } + /** Thread-local version of {@link #ncalloc}. */ + public static long nstackCalloc(int alignment, int num, int size) { return stackGet().ncalloc(alignment, num, size); } + + // ------------------------------------------------- + + /** Thread-local version of {@link #malloc(int) malloc}. */ + public static ByteBuffer stackMalloc(int size) { return stackGet().malloc(size); } + /** Thread-local version of {@link #calloc(int) calloc}. */ + public static ByteBuffer stackCalloc(int size) { return stackGet().calloc(size); } + + /** Thread-local version of {@link #bytes(byte)}. */ + public static ByteBuffer stackBytes(byte x) { return stackGet().bytes(x); } + /** Thread-local version of {@link #bytes(byte, byte)}. */ + public static ByteBuffer stackBytes(byte x, byte y) { return stackGet().bytes(x, y); } + /** Thread-local version of {@link #bytes(byte, byte, byte)}. */ + public static ByteBuffer stackBytes(byte x, byte y, byte z) { return stackGet().bytes(x, y, z); } + /** Thread-local version of {@link #bytes(byte, byte, byte, byte)}. */ + public static ByteBuffer stackBytes(byte x, byte y, byte z, byte w) { return stackGet().bytes(x, y, z, w); } + /** Thread-local version of {@link #bytes(byte...)}. */ + public static ByteBuffer stackBytes(byte... values) { return stackGet().bytes(values); } + + // ------------------------------------------------- + + /** Thread-local version of {@link #mallocShort}. */ + public static ShortBuffer stackMallocShort(int size) { return stackGet().mallocShort(size); } + /** Thread-local version of {@link #callocShort}. */ + public static ShortBuffer stackCallocShort(int size) { return stackGet().callocShort(size); } + + /** Thread-local version of {@link #shorts(short)}. */ + public static ShortBuffer stackShorts(short x) { return stackGet().shorts(x); } + /** Thread-local version of {@link #shorts(short, short)}. */ + public static ShortBuffer stackShorts(short x, short y) { return stackGet().shorts(x, y); } + /** Thread-local version of {@link #shorts(short, short, short)}. */ + public static ShortBuffer stackShorts(short x, short y, short z) { return stackGet().shorts(x, y, z); } + /** Thread-local version of {@link #shorts(short, short, short, short)}. */ + public static ShortBuffer stackShorts(short x, short y, short z, short w) { return stackGet().shorts(x, y, z, w); } + /** Thread-local version of {@link #shorts(short...)}. */ + public static ShortBuffer stackShorts(short... values) { return stackGet().shorts(values); } + + // ------------------------------------------------- + + /** Thread-local version of {@link #mallocInt}. */ + public static IntBuffer stackMallocInt(int size) { return stackGet().mallocInt(size); } + /** Thread-local version of {@link #callocInt}. */ + public static IntBuffer stackCallocInt(int size) { return stackGet().callocInt(size); } + + /** Thread-local version of {@link #ints(int)}. */ + public static IntBuffer stackInts(int x) { return stackGet().ints(x); } + /** Thread-local version of {@link #ints(int, int)}. */ + public static IntBuffer stackInts(int x, int y) { return stackGet().ints(x, y); } + /** Thread-local version of {@link #ints(int, int, int)}. */ + public static IntBuffer stackInts(int x, int y, int z) { return stackGet().ints(x, y, z); } + /** Thread-local version of {@link #ints(int, int, int, int)}. */ + public static IntBuffer stackInts(int x, int y, int z, int w) { return stackGet().ints(x, y, z, w); } + /** Thread-local version of {@link #ints(int...)}. */ + public static IntBuffer stackInts(int... values) { return stackGet().ints(values); } + + // ------------------------------------------------- + + /** Thread-local version of {@link #mallocLong}. */ + public static LongBuffer stackMallocLong(int size) { return stackGet().mallocLong(size); } + /** Thread-local version of {@link #callocLong}. */ + public static LongBuffer stackCallocLong(int size) { return stackGet().callocLong(size); } + + /** Thread-local version of {@link #longs(long)}. */ + public static LongBuffer stackLongs(long x) { return stackGet().longs(x); } + /** Thread-local version of {@link #longs(long, long)}. */ + public static LongBuffer stackLongs(long x, long y) { return stackGet().longs(x, y); } + /** Thread-local version of {@link #longs(long, long, long)}. */ + public static LongBuffer stackLongs(long x, long y, long z) { return stackGet().longs(x, y, z); } + /** Thread-local version of {@link #longs(long, long, long, long)}. */ + public static LongBuffer stackLongs(long x, long y, long z, long w) { return stackGet().longs(x, y, z, w); } + /** Thread-local version of {@link #longs(long...)}. */ + public static LongBuffer stackLongs(long... values) { return stackGet().longs(values); } + + // ------------------------------------------------- + + /** Thread-local version of {@link #mallocCLong}. */ + public static CLongBuffer stackMallocCLong(int size) { return stackGet().mallocCLong(size); } + /** Thread-local version of {@link #callocCLong}. */ + public static CLongBuffer stackCallocCLong(int size) { return stackGet().callocCLong(size); } + + /** Thread-local version of {@link #longs(long)}. */ + public static CLongBuffer stackCLongs(long x) { return stackGet().clongs(x); } + /** Thread-local version of {@link #longs(long, long)}. */ + public static CLongBuffer stackCLongs(long x, long y) { return stackGet().clongs(x, y); } + /** Thread-local version of {@link #longs(long, long, long)}. */ + public static CLongBuffer stackCLongs(long x, long y, long z) { return stackGet().clongs(x, y, z); } + /** Thread-local version of {@link #longs(long, long, long, long)}. */ + public static CLongBuffer stackCLongs(long x, long y, long z, long w) { return stackGet().clongs(x, y, z, w); } + /** Thread-local version of {@link #longs(long...)}. */ + public static CLongBuffer stackCLongs(long... values) { return stackGet().clongs(values); } + + // ------------------------------------------------- + + /** Thread-local version of {@link #mallocFloat}. */ + public static FloatBuffer stackMallocFloat(int size) { return stackGet().mallocFloat(size); } + /** Thread-local version of {@link #callocFloat}. */ + public static FloatBuffer stackCallocFloat(int size) { return stackGet().callocFloat(size); } + + /** Thread-local version of {@link #floats(float)}. */ + public static FloatBuffer stackFloats(float x) { return stackGet().floats(x); } + /** Thread-local version of {@link #floats(float, float)}. */ + public static FloatBuffer stackFloats(float x, float y) { return stackGet().floats(x, y); } + /** Thread-local version of {@link #floats(float, float, float)}. */ + public static FloatBuffer stackFloats(float x, float y, float z) { return stackGet().floats(x, y, z); } + /** Thread-local version of {@link #floats(float, float, float, float)}. */ + public static FloatBuffer stackFloats(float x, float y, float z, float w) { return stackGet().floats(x, y, z, w); } + /** Thread-local version of {@link #floats(float...)}. */ + public static FloatBuffer stackFloats(float... values) { return stackGet().floats(values); } + + // ------------------------------------------------- + + /** Thread-local version of {@link #mallocDouble}. */ + public static DoubleBuffer stackMallocDouble(int size) { return stackGet().mallocDouble(size); } + /** Thread-local version of {@link #callocDouble}. */ + public static DoubleBuffer stackCallocDouble(int size) { return stackGet().callocDouble(size); } + + /** Thread-local version of {@link #doubles(double)}. */ + public static DoubleBuffer stackDoubles(double x) { return stackGet().doubles(x); } + /** Thread-local version of {@link #doubles(double, double)}. */ + public static DoubleBuffer stackDoubles(double x, double y) { return stackGet().doubles(x, y); } + /** Thread-local version of {@link #doubles(double, double, double)}. */ + public static DoubleBuffer stackDoubles(double x, double y, double z) { return stackGet().doubles(x, y, z); } + /** Thread-local version of {@link #doubles(double, double, double, double)}. */ + public static DoubleBuffer stackDoubles(double x, double y, double z, double w) { return stackGet().doubles(x, y, z, w); } + /** Thread-local version of {@link #doubles(double...)}. */ + public static DoubleBuffer stackDoubles(double... values) { return stackGet().doubles(values); } + + // ------------------------------------------------- + + /** Thread-local version of {@link #mallocPointer}. */ + public static PointerBuffer stackMallocPointer(int size) { return stackGet().mallocPointer(size); } + /** Thread-local version of {@link #callocPointer}. */ + public static PointerBuffer stackCallocPointer(int size) { return stackGet().callocPointer(size); } + + /** Thread-local version of {@link #pointers(long)}. */ + public static PointerBuffer stackPointers(long x) { return stackGet().pointers(x); } + /** Thread-local version of {@link #pointers(long, long)}. */ + public static PointerBuffer stackPointers(long x, long y) { return stackGet().pointers(x, y); } + /** Thread-local version of {@link #pointers(long, long, long)}. */ + public static PointerBuffer stackPointers(long x, long y, long z) { return stackGet().pointers(x, y, z); } + /** Thread-local version of {@link #pointers(long, long, long, long)}. */ + public static PointerBuffer stackPointers(long x, long y, long z, long w) { return stackGet().pointers(x, y, z, w); } + /** Thread-local version of {@link #pointers(long...)}. */ + public static PointerBuffer stackPointers(long... values) { return stackGet().pointers(values); } + + /** Thread-local version of {@link #pointers(Pointer)}. */ + public static PointerBuffer stackPointers(Pointer x) { return stackGet().pointers(x); } + /** Thread-local version of {@link #pointers(Pointer, Pointer)}. */ + public static PointerBuffer stackPointers(Pointer x, Pointer y) { return stackGet().pointers(x, y); } + /** Thread-local version of {@link #pointers(Pointer, Pointer, Pointer)}. */ + public static PointerBuffer stackPointers(Pointer x, Pointer y, Pointer z) { return stackGet().pointers(x, y, z); } + /** Thread-local version of {@link #pointers(Pointer, Pointer, Pointer, Pointer)}. */ + public static PointerBuffer stackPointers(Pointer x, Pointer y, Pointer z, Pointer w) { return stackGet().pointers(x, y, z, w); } + /** Thread-local version of {@link #pointers(Pointer...)}. */ + public static PointerBuffer stackPointers(Pointer... values) { return stackGet().pointers(values); } + + // ------------------------------------------------- + + /** Thread-local version of {@link #ASCII(CharSequence)}. */ + public static ByteBuffer stackASCII(CharSequence text) { return stackGet().ASCII(text); } + + /** Thread-local version of {@link #ASCII(CharSequence, boolean)}. */ + public static ByteBuffer stackASCII(CharSequence text, boolean nullTerminated) { return stackGet().ASCII(text, nullTerminated); } + + /** Thread-local version of {@link #UTF8(CharSequence)}. */ + public static ByteBuffer stackUTF8(CharSequence text) { return stackGet().UTF8(text); } + + /** Thread-local version of {@link #UTF8(CharSequence, boolean)}. */ + public static ByteBuffer stackUTF8(CharSequence text, boolean nullTerminated) { return stackGet().UTF8(text, nullTerminated); } + + /** Thread-local version of {@link #UTF16(CharSequence)}. */ + public static ByteBuffer stackUTF16(CharSequence text) { return stackGet().UTF16(text); } + + /** Thread-local version of {@link #UTF16(CharSequence, boolean)}. */ + public static ByteBuffer stackUTF16(CharSequence text, boolean nullTerminated) { return stackGet().UTF16(text, nullTerminated); } + + /** Thread-local version of {@link #ASCII(CharSequence)}. */ + @Nullable public static ByteBuffer stackASCIISafe(@Nullable CharSequence text) { return stackGet().ASCIISafe(text); } + + /** Thread-local version of {@link #ASCII(CharSequence, boolean)}. */ + @Nullable public static ByteBuffer stackASCIISafe(@Nullable CharSequence text, boolean nullTerminated) { return stackGet().ASCIISafe(text, nullTerminated); } + + /** Thread-local version of {@link #UTF8(CharSequence)}. */ + @Nullable public static ByteBuffer stackUTF8Safe(@Nullable CharSequence text) { return stackGet().UTF8Safe(text); } + + /** Thread-local version of {@link #UTF8(CharSequence, boolean)}. */ + @Nullable public static ByteBuffer stackUTF8Safe(@Nullable CharSequence text, boolean nullTerminated) { return stackGet().UTF8Safe(text, nullTerminated); } + + /** Thread-local version of {@link #UTF16(CharSequence)}. */ + @Nullable public static ByteBuffer stackUTF16Safe(@Nullable CharSequence text) { return stackGet().UTF16Safe(text); } + + /** Thread-local version of {@link #UTF16(CharSequence, boolean)}. */ + @Nullable public static ByteBuffer stackUTF16Safe(@Nullable CharSequence text, boolean nullTerminated) { return stackGet().UTF16Safe(text, nullTerminated); } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryUtil.java new file mode 100644 index 000000000..b8b9e3531 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/MemoryUtil.java @@ -0,0 +1,3127 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.*; +import org.lwjgl.system.MemoryManage.*; +import org.lwjgl.system.MemoryUtil.MemoryAllocationReport.*; + +import javax.annotation.*; +import java.lang.reflect.*; +import java.nio.*; +import java.nio.charset.*; +import java.util.*; +import java.util.function.*; + +import static java.lang.Character.*; +import static java.lang.Math.*; +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MathUtil.*; +import static org.lwjgl.system.MemoryUtil.LazyInit.*; +import static org.lwjgl.system.Pointer.*; +import static org.lwjgl.system.jni.JNINativeInterface.*; +import static org.lwjgl.system.libc.LibCString.*; + +/** + * This class provides functionality for managing native memory. + * + *

    All methods in this class will make use of {@link sun.misc.Unsafe} if it's available, for performance. If Unsafe is not available, the fallback + * implementations make use of reflection and, in the worst-case, JNI.

    + * + *

    Method names in this class are prefixed with {@code mem} to avoid ambiguities when used with static imports.

    + * + *

    Text encoding/decoding

    + * + * Three codecs are available, each with a different postfix: + *
      + *
    • UTF16 - Direct mapping of 2 bytes to Java char and vice versa
    • + *
    • UTF8 - custom UTF-8 codec without intermediate allocations
    • + *
    • ASCII - Not the original 7bit ASCII, but any character set with a single byte encoding (ISO 8859-1, Windows-1252, etc.)
    • + *
    + * + *

    The codec implementations do no codepoint validation, for improved performance. Therefore, if malformed input or unmappable characters are expected, the + * JDK {@link CharsetEncoder}/{@link CharsetDecoder} classes should be used instead. Methods in bindings that accept/return {@code CharSequence}/{@code String} + * also support {@code ByteBuffer}, so custom codecs can be used if necessary.

    + * + * @see Configuration#MEMORY_ALLOCATOR + * @see Configuration#DEBUG_MEMORY_ALLOCATOR + */ +public final class MemoryUtil { + + /** Alias for the null pointer address. */ + public static final long NULL = 0L; + + /** The memory page size, in bytes. This value is always a power-of-two. */ + public static final int PAGE_SIZE; + + /** The cache-line size, in bytes. This value is always a power-of-two. */ + public static final int CACHE_LINE_SIZE; + + static final int ARRAY_TLC_SIZE = Configuration.ARRAY_TLC_SIZE.get(8192); + + static final ThreadLocal ARRAY_TLC_BYTE = ThreadLocal.withInitial(() -> new byte[ARRAY_TLC_SIZE]); + static final ThreadLocal ARRAY_TLC_CHAR = ThreadLocal.withInitial(() -> new char[ARRAY_TLC_SIZE]); + + static final sun.misc.Unsafe UNSAFE; + + static final ByteOrder NATIVE_ORDER = ByteOrder.nativeOrder(); + + private static final Charset UTF16 = NATIVE_ORDER == ByteOrder.LITTLE_ENDIAN + ? StandardCharsets.UTF_16LE + : StandardCharsets.UTF_16BE; + + static final Class BUFFER_BYTE; + static final Class BUFFER_SHORT; + static final Class BUFFER_CHAR; + static final Class BUFFER_INT; + static final Class BUFFER_LONG; + static final Class BUFFER_FLOAT; + static final Class BUFFER_DOUBLE; + + private static final long MARK; + private static final long POSITION; + private static final long LIMIT; + private static final long CAPACITY; + + private static final long ADDRESS; + + private static final long PARENT_BYTE; + private static final long PARENT_SHORT; + private static final long PARENT_CHAR; + private static final long PARENT_INT; + private static final long PARENT_LONG; + private static final long PARENT_FLOAT; + private static final long PARENT_DOUBLE; + + static { + Library.initialize(); + + ByteBuffer bb = ByteBuffer.allocateDirect(0).order(NATIVE_ORDER); + + BUFFER_BYTE = bb.getClass(); + BUFFER_SHORT = bb.asShortBuffer().getClass(); + BUFFER_CHAR = bb.asCharBuffer().getClass(); + BUFFER_INT = bb.asIntBuffer().getClass(); + BUFFER_LONG = bb.asLongBuffer().getClass(); + BUFFER_FLOAT = bb.asFloatBuffer().getClass(); + BUFFER_DOUBLE = bb.asDoubleBuffer().getClass(); + + UNSAFE = getUnsafeInstance(); + + try { + MARK = getMarkOffset(); + POSITION = getPositionOffset(); + LIMIT = getLimitOffset(); + CAPACITY = getCapacityOffset(); + + ADDRESS = getAddressOffset(); + + PARENT_BYTE = getFieldOffsetObject(bb.duplicate().order(bb.order()), bb); + PARENT_SHORT = getFieldOffsetObject(bb.asShortBuffer(), bb); + PARENT_CHAR = getFieldOffsetObject(bb.asCharBuffer(), bb); + PARENT_INT = getFieldOffsetObject(bb.asIntBuffer(), bb); + PARENT_LONG = getFieldOffsetObject(bb.asLongBuffer(), bb); + PARENT_FLOAT = getFieldOffsetObject(bb.asFloatBuffer(), bb); + PARENT_DOUBLE = getFieldOffsetObject(bb.asDoubleBuffer(), bb); + } catch (Throwable t) { + throw new UnsupportedOperationException(t); + } + + PAGE_SIZE = UNSAFE.pageSize(); + CACHE_LINE_SIZE = 64; // TODO: Can we do better? + } + + static final class LazyInit { + + private LazyInit() { + } + + static final MemoryAllocator ALLOCATOR_IMPL; + static final MemoryAllocator ALLOCATOR; + + static { + boolean debug = Configuration.DEBUG_MEMORY_ALLOCATOR.get(false); + + ALLOCATOR_IMPL = MemoryManage.getInstance(); + ALLOCATOR = debug + ? new DebugAllocator(ALLOCATOR_IMPL) + : ALLOCATOR_IMPL; + + apiLog("MemoryUtil allocator: " + ALLOCATOR.getClass().getSimpleName()); + if (debug && !Configuration.DEBUG_MEMORY_ALLOCATOR_FAST.get(false)) { + apiLogMore("Reminder: enable Configuration.DEBUG_MEMORY_ALLOCATOR_FAST for low overhead allocation tracking."); + } + } + } + + private MemoryUtil() { + } + + /* ------------------------------------- + ------------------------------------- + EXPLICIT MEMORY MANAGEMENT API + ------------------------------------- + ------------------------------------- */ + + /** The interface implemented by the memory allocator used by the explicit memory management API ({@link #memAlloc}, {@link #memFree}, etc). */ + public interface MemoryAllocator { + + /** Returns a pointer to the malloc function. */ + long getMalloc(); + /** Returns a pointer to the calloc function. */ + long getCalloc(); + /** Returns a pointer to the realloc function. */ + long getRealloc(); + /** Returns a pointer to the free function. */ + long getFree(); + /** Returns a pointer to the aligned_alloc function. */ + long getAlignedAlloc(); + /** Returns a pointer to the aligned_free function. */ + long getAlignedFree(); + + /** Called by {@link MemoryUtil#memAlloc}. */ + long malloc(long size); + /** Called by {@link MemoryUtil#memCalloc}. */ + long calloc(long num, long size); + /** Called by {@link MemoryUtil#memRealloc}. */ + long realloc(long ptr, long size); + /** Called by {@link MemoryUtil#memFree}. */ + void free(long ptr); + + /** Called by {@link MemoryUtil#memAlignedAlloc}. */ + long aligned_alloc(long alignment, long size); + /** Called by {@link MemoryUtil#memAlignedFree}. */ + void aligned_free(long ptr); + + } + + /** + * Returns the {@link MemoryAllocator} instance used internally by the explicit memory management API ({@link #memAlloc}, {@link #memFree}, etc). + * + *

    Allocations made through the returned instance will not be tracked for memory leaks, even if {@link Configuration#DEBUG_MEMORY_ALLOCATOR} is enabled. + * This can be useful for {@code static final} allocations that live throughout the application's lifetime and will never be freed until the process is + * terminated. Normally such allocations would be reported as memory leaks by the debug allocator.

    + * + *

    The expectation is that this method will rarely be used, so it does not have the {@code mem} prefix to avoid pollution of auto-complete lists.

    + * + * @return the {@link MemoryAllocator} instance + */ + public static MemoryAllocator getAllocator() { + return getAllocator(false); + } + + /** + * Returns the {@link MemoryAllocator} instance used internally by the explicit memory management API ({@link #memAlloc}, {@link #memFree}, etc). + * + * @param tracked whether allocations will be tracked for memory leaks, if {@link Configuration#DEBUG_MEMORY_ALLOCATOR} is enabled. + * + * @return the {@link MemoryAllocator} instance + */ + public static MemoryAllocator getAllocator(boolean tracked) { + return tracked + ? ALLOCATOR + : ALLOCATOR_IMPL; + } + + // --- [ memAlloc ] --- + + /** Unsafe version of {@link #memAlloc}. May return {@link #NULL} if {@code size} is zero or the allocation failed. */ + public static long nmemAlloc(long size) { + return ALLOCATOR.malloc(size); + } + + /** + * Unsafe version of {@link #memAlloc} that checks the returned pointer. + * + * @return a pointer to the memory block allocated by the function on success. This pointer will never be {@link #NULL}, even if {@code size} is zero. + * + * @throws OutOfMemoryError if the function failed to allocate the requested block of memory + */ + public static long nmemAllocChecked(long size) { + long address = nmemAlloc(size != 0 ? size : 1L); + if (CHECKS && address == NULL) { + throw new OutOfMemoryError(); + } + return address; + } + + private static long getAllocationSize(int elements, int elementShift) { + return apiCheckAllocation(elements, Integer.toUnsignedLong(elements) << elementShift, BITS64 ? Long.MAX_VALUE : 0xFFFF_FFFFL); + } + + /** + * The standard C malloc function. + * + *

    Allocates a block of {@code size} bytes of memory, returning a pointer to the beginning of the block. The content of the newly allocated block of + * memory is not initialized, remaining with indeterminate values.

    + * + *

    Memory allocated with this method must be freed with {@link #memFree}.

    + * + * @param size the size of the memory block to allocate, in bytes. If {@code size} is zero, the returned pointer shall not be dereferenced. + * + * @return on success, a pointer to the memory block allocated by the function + * + * @throws OutOfMemoryError if the function failed to allocate the requested block of memory + */ + public static ByteBuffer memAlloc(int size) { + return wrap(BUFFER_BYTE, nmemAllocChecked(size), size).order(NATIVE_ORDER); + } + + /** + * ShortBuffer version of {@link #memAlloc}. + * + * @param size the number of short values to allocate. + */ + public static ShortBuffer memAllocShort(int size) { + return wrap(BUFFER_SHORT, nmemAllocChecked(getAllocationSize(size, 1)), size); + } + + /** + * IntBuffer version of {@link #memAlloc}. + * + * @param size the number of int values to allocate. + */ + public static IntBuffer memAllocInt(int size) { + return wrap(BUFFER_INT, nmemAllocChecked(getAllocationSize(size, 2)), size); + } + + /** + * FloatBuffer version of {@link #memAlloc}. + * + * @param size the number of float values to allocate. + */ + public static FloatBuffer memAllocFloat(int size) { + return wrap(BUFFER_FLOAT, nmemAllocChecked(getAllocationSize(size, 2)), size); + } + + /** + * LongBuffer version of {@link #memAlloc}. + * + * @param size the number of long values to allocate. + */ + public static LongBuffer memAllocLong(int size) { + return wrap(BUFFER_LONG, nmemAllocChecked(getAllocationSize(size, 3)), size); + } + + /** + * {@code CLongBuffer} version of {@link #memAlloc}. + * + * @param size the number of C long values to allocate. + */ + public static CLongBuffer memAllocCLong(int size) { + return CLongBuffer.create(nmemAllocChecked(getAllocationSize(size, CLONG_SHIFT)), size); + } + + /** + * DoubleBuffer version of {@link #memAlloc}. + * + * @param size the number of double values to allocate. + */ + public static DoubleBuffer memAllocDouble(int size) { + return wrap(BUFFER_DOUBLE, nmemAllocChecked(getAllocationSize(size, 3)), size); + } + + /** + * PointerBuffer version of {@link #memAlloc}. + * + * @param size the number of pointer values to allocate. + */ + public static PointerBuffer memAllocPointer(int size) { + return PointerBuffer.create(nmemAllocChecked(getAllocationSize(size, POINTER_SHIFT)), size); + } + + /** Unsafe version of {@link #memFree}. */ + public static void nmemFree(long ptr) { + ALLOCATOR.free(ptr); + } + + /** + * The standard C free function. + * + *

    A block of memory previously allocated by a call to {@link #memAlloc}, {@link #memCalloc} or {@link #memRealloc} is deallocated, making it available + * again for further allocations.

    + * + * @param ptr pointer to a memory block previously allocated with {@link #memAlloc}, {@link #memCalloc} or {@link #memRealloc}. If {@code ptr} does not + * point to a block of memory allocated with the above functions, it causes undefined behavior. If {@code ptr} is a {@link #NULL} pointer, the + * function does nothing. + */ + public static void memFree(@Nullable Buffer ptr) { + if (ptr != null) { + nmemFree(UNSAFE.getLong(ptr, ADDRESS)); + } + } + + /** {@code CustomBuffer} version of {@link #memFree}. */ + public static void memFree(@Nullable CustomBuffer ptr) { + if (ptr != null) { + nmemFree(ptr.address); + } + } + + // from LWJGL 3.2.2 + /** {@code PointerBuffer} version of {@link #memFree}. */ + public static void memFree(@Nullable PointerBuffer ptr) { + if (ptr != null) { + nmemFree(ptr.address); + } + } + + // --- [ memCalloc ] --- + + /** Unsafe version of {@link #memCalloc}. May return {@link #NULL} if {@code num} or {@code size} are zero or the allocation failed. */ + public static long nmemCalloc(long num, long size) { + return ALLOCATOR.calloc(num, size); + } + + /** + * Unsafe version of {@link #memCalloc} that checks the returned pointer. + * + * @return a pointer to the memory block allocated by the function on success. This pointer will never be {@link #NULL}, even if {@code num} or + * {@code size} are zero. + * + * @throws OutOfMemoryError if the function failed to allocate the requested block of memory + */ + public static long nmemCallocChecked(long num, long size) { + if (num == 0L || size == 0L) { + num = 1L; + size = 1L; + } + + long address = nmemCalloc(num, size); + if (CHECKS && address == NULL) { + throw new OutOfMemoryError(); + } + return address; + } + + /** + * The standard C calloc function. + * + *

    Allocates a block of memory for an array of {@code num} elements, each of them {@code size} bytes long, and initializes all its bits to zero. The + * effective result is the allocation of a zero-initialized memory block of {@code (num*size)} bytes.

    + * + *

    Memory allocated with this method must be freed with {@link #memFree}.

    + * + * @param num the number of elements to allocate. + * @param size the size of each element. If {@code size} is zero, the return value depends on the particular library implementation (it may or may not be + * a null pointer), but the returned pointer shall not be dereferenced. + * + * @return on success, a pointer to the memory block allocated by the function + * + * @throws OutOfMemoryError if the function failed to allocate the requested block of memory + */ + public static ByteBuffer memCalloc(int num, int size) { + return wrap(BUFFER_BYTE, nmemCallocChecked(num, size), num * size).order(NATIVE_ORDER); + } + + /** + * Alternative version of {@link #memCalloc}. + * + * @param num the number of bytes to allocate. + */ + public static ByteBuffer memCalloc(int num) { + return wrap(BUFFER_BYTE, nmemCallocChecked(num, 1), num).order(NATIVE_ORDER); + } + + /** + * ShortBuffer version of {@link #memCalloc}. + * + * @param num the number of short values to allocate. + */ + public static ShortBuffer memCallocShort(int num) { + return wrap(BUFFER_SHORT, nmemCallocChecked(num, 2), num); + } + + /** + * IntBuffer version of {@link #memCalloc}. + * + * @param num the number of int values to allocate. + */ + public static IntBuffer memCallocInt(int num) { + return wrap(BUFFER_INT, nmemCallocChecked(num, 4), num); + } + + /** + * FloatBuffer version of {@link #memCalloc}. + * + * @param num the number of float values to allocate. + */ + public static FloatBuffer memCallocFloat(int num) { + return wrap(BUFFER_FLOAT, nmemCallocChecked(num, 4), num); + } + + /** + * LongBuffer version of {@link #memCalloc}. + * + * @param num the number of long values to allocate. + */ + public static LongBuffer memCallocLong(int num) { + return wrap(BUFFER_LONG, nmemCallocChecked(num, 8), num); + } + + /** + * {@code CLongBuffer} version of {@link #memCalloc}. + * + * @param num the number of C long values to allocate. + */ + public static CLongBuffer memCallocCLong(int num) { + return CLongBuffer.create(nmemCallocChecked(num, CLONG_SIZE), num); + } + + /** + * DoubleBuffer version of {@link #memCalloc}. + * + * @param num the number of double values to allocate. + */ + public static DoubleBuffer memCallocDouble(int num) { + return wrap(BUFFER_DOUBLE, nmemCallocChecked(num, 8), num); + } + + /** + * PointerBuffer version of {@link #memCalloc}. + * + * @param num the number of pointer values to allocate. + */ + public static PointerBuffer memCallocPointer(int num) { + return PointerBuffer.create(nmemCallocChecked(num, POINTER_SIZE), num); + } + + // --- [ memRealloc] --- + + /** Unsafe version of {@link #memRealloc}. May return {@link #NULL} if {@code size} is zero or the allocation failed. */ + public static long nmemRealloc(long ptr, long size) { + return ALLOCATOR.realloc(ptr, size); + } + + /** + * Unsafe version of {@link #memRealloc} that checks the returned pointer. + * + * @return a pointer to the memory block reallocated by the function on success. This pointer will never be {@link #NULL}, even if {@code size} is zero. + * + * @throws OutOfMemoryError if the function failed to allocate the requested block of memory + */ + public static long nmemReallocChecked(long ptr, long size) { + long address = nmemRealloc(ptr, size != 0 ? size : 1L); + if (CHECKS && address == NULL) { + throw new OutOfMemoryError(); + } + return address; + } + + private static T realloc(@Nullable T old_p, T new_p, int size) { + if (old_p != null) { + new_p.position(min(old_p.position(), size)); + } + return new_p; + } + + /** + * The standard C realloc function. + * + *

    Changes the size of the memory block pointed to by {@code ptr}. The function may move the memory block to a new location (whose address is returned + * by the function). The content of the memory block is preserved up to the lesser of the new and old sizes, even if the block is moved to a new location. + * If the new size is larger, the value of the newly allocated portion is indeterminate.

    + * + *

    The memory address used is always the address at the start of {@code ptr}, so the current position of {@code ptr} does not need to be set to 0 for + * this function to work. The current position is preserved, even if the memory block is moved to a new location, unless {@code size} is less than the + * current position in which case position will be equal to capacity. The limit is set to the capacity, and the mark is discarded.

    + * + * @param ptr a pointer to a memory block previously allocated with {@link #memAlloc}, {@link #memCalloc} or {@link #memRealloc}. Alternatively, this can + * be a {@link #NULL} pointer, in which case a new block is allocated (as if {@link #memAlloc} was called). + * @param size the new size for the memory block, in bytes. + * + * @return a pointer to the reallocated memory block, which may be either the same as {@code ptr} or a new location + * + * @throws OutOfMemoryError if the function failed to allocate the requested block of memory. The memory block pointed to by argument {@code ptr} is not + * deallocated (it is still valid, and with its contents unchanged). + */ + public static ByteBuffer memRealloc(@Nullable ByteBuffer ptr, int size) { + return realloc(ptr, memByteBuffer(nmemReallocChecked(ptr == null ? NULL : UNSAFE.getLong(ptr, ADDRESS), size), size), size); + } + + /** + * ShortBuffer version of {@link #memRealloc}. + * + * @param size the number of short values to allocate. + */ + public static ShortBuffer memRealloc(@Nullable ShortBuffer ptr, int size) { + return realloc(ptr, memShortBuffer(nmemReallocChecked(ptr == null ? NULL : UNSAFE.getLong(ptr, ADDRESS), getAllocationSize(size, 1)), size), size); + } + + /** + * IntBuffer version of {@link #memRealloc}. + * + * @param size the number of int values to allocate. + */ + public static IntBuffer memRealloc(@Nullable IntBuffer ptr, int size) { + return realloc(ptr, memIntBuffer(nmemReallocChecked(ptr == null ? NULL : UNSAFE.getLong(ptr, ADDRESS), getAllocationSize(size, 2)), size), size); + } + + /** + * LongBuffer version of {@link #memRealloc}. + * + * @param size the number of long values to allocate. + */ + public static LongBuffer memRealloc(@Nullable LongBuffer ptr, int size) { + return realloc(ptr, memLongBuffer(nmemReallocChecked(ptr == null ? NULL : UNSAFE.getLong(ptr, ADDRESS), getAllocationSize(size, 3)), size), size); + } + + /** + * {@code CLongBuffer} version of {@link #memRealloc}. + * + * @param size the number of C long values to allocate. + */ + public static CLongBuffer memRealloc(@Nullable CLongBuffer ptr, int size) { + CLongBuffer buffer = memCLongBuffer(nmemReallocChecked(ptr == null ? NULL : ptr.address, getAllocationSize(size, CLONG_SIZE)), size); + if (ptr != null) { + buffer.position(min(ptr.position(), size)); + } + return buffer; + } + + /** + * FloatBuffer version of {@link #memRealloc}. + * + * @param size the number of float values to allocate. + */ + public static FloatBuffer memRealloc(@Nullable FloatBuffer ptr, int size) { + return realloc(ptr, memFloatBuffer(nmemReallocChecked(ptr == null ? NULL : UNSAFE.getLong(ptr, ADDRESS), getAllocationSize(size, 2)), size), size); + } + + /** + * DoubleBuffer version of {@link #memRealloc}. + * + * @param size the number of double values to allocate. + */ + public static DoubleBuffer memRealloc(@Nullable DoubleBuffer ptr, int size) { + return realloc(ptr, memDoubleBuffer(nmemReallocChecked(ptr == null ? NULL : UNSAFE.getLong(ptr, ADDRESS), getAllocationSize(size, 3)), size), size); + } + + /** + * PointerBuffer version of {@link #memRealloc}. + * + * @param size the number of pointer values to allocate. + */ + public static PointerBuffer memRealloc(@Nullable PointerBuffer ptr, int size) { + PointerBuffer buffer = memPointerBuffer(nmemReallocChecked(ptr == null ? NULL : ptr.address, getAllocationSize(size, POINTER_SHIFT)), size); + if (ptr != null) { + buffer.position(min(ptr.position(), size)); + } + return buffer; + } + + // --- [ memAlignedAlloc ] --- + + /** Unsafe version of {@link #memAlignedAlloc}. May return {@link #NULL} if {@code size} is zero or the allocation failed. */ + public static long nmemAlignedAlloc(long alignment, long size) { + return ALLOCATOR.aligned_alloc(alignment, size); + } + + /** + * Unsafe version of {@link #memAlignedAlloc} that checks the returned pointer. + * + * @return a pointer to the memory block allocated by the function on success. This pointer will never be {@link #NULL}, even if {@code size} is zero. + * + * @throws OutOfMemoryError if the function failed to allocate the requested block of memory + */ + public static long nmemAlignedAllocChecked(long alignment, long size) { + long address = nmemAlignedAlloc(alignment, size != 0 ? size : 1L); + if (CHECKS && address == NULL) { + throw new OutOfMemoryError(); + } + return address; + } + + /** + * The standard C aligned_alloc function. + * + *

    Allocate {@code size} bytes of uninitialized storage whose alignment is specified by {@code alignment}. The size parameter must be an integral + * multiple of alignment. Memory allocated with memAlignedAlloc() must be freed with {@link #memAlignedFree}.

    + * + * @param alignment the alignment. Must be a power of two value and a multiple of {@code sizeof(void *)}. + * @param size the number of bytes to allocate. Must be a multiple of {@code alignment}. + */ + public static ByteBuffer memAlignedAlloc(int alignment, int size) { + return wrap(BUFFER_BYTE, nmemAlignedAllocChecked(alignment, size), size).order(NATIVE_ORDER); + } + + // --- [ memAlignedFree ] --- + + /** Unsafe version of {@link #memAlignedFree}. */ + public static void nmemAlignedFree(long ptr) { + ALLOCATOR.aligned_free(ptr); + } + + /** + * Frees a block of memory that was allocated with {@link #memAlignedAlloc}. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the aligned block of memory to free + */ + public static void memAlignedFree(@Nullable ByteBuffer ptr) { + if (ptr != null) { + nmemAlignedFree(UNSAFE.getLong(ptr, ADDRESS)); + } + } + + // --- [ DebugAllocator ] --- + + /** The memory allocation report callback. */ + public interface MemoryAllocationReport { + + /** + * Reports allocated memory. + * + * @param address the address of the memory allocated. May be {@link #NULL}. + * @param memory the amount of memory allocated, in bytes + * @param threadId id of the thread that allocated the memory. May be {@link #NULL}. + * @param threadName name of the thread that allocated the memory. May be {@code null}. + * @param stacktrace the allocation stacktrace. May be {@code null}. + */ + void invoke(long address, long memory, long threadId, @Nullable String threadName, @Nullable StackTraceElement... stacktrace); + + /** Specifies how to aggregate the reported allocations. */ + enum Aggregate { + /** Allocations are aggregated over the whole process or thread. */ + ALL, + /** + * Allocations are aggregated based on the first stack trace element. This will return an allocation aggregate per method/line number, regardless + * of how many different code paths lead to that specific method and line number. + */ + GROUP_BY_METHOD, + /** The allocations are aggregated based on the full stack trace chain. */ + GROUP_BY_STACKTRACE + } + } + + /** + * Reports all live allocations. + * + *

    This method can only be used if the {@link Configuration#DEBUG_MEMORY_ALLOCATOR} option has been set to true.

    + * + * @param report the report callback + */ + public static void memReport(MemoryAllocationReport report) { + DebugAllocator.report(report); + } + + /** + * Reports aggregates for the live allocations. + * + *

    This method can only be used if the {@link Configuration#DEBUG_MEMORY_ALLOCATOR} option has been set to true.

    + * + * @param report the report callback + * @param groupByStackTrace how to aggregate the reported allocations + * @param groupByThread if the reported allocations should be grouped by thread + */ + public static void memReport(MemoryAllocationReport report, Aggregate groupByStackTrace, boolean groupByThread) { + DebugAllocator.report(report, groupByStackTrace, groupByThread); + } + + /* ------------------------------------- + ------------------------------------- + BUFFER MANAGEMENT API + ------------------------------------- + ------------------------------------- */ + + // --- [ memAddress0 ] --- + + /** + * Returns the memory address of the specified buffer. [INTERNAL USE ONLY] + * + * @param buffer the buffer + * + * @return the memory address + */ + public static long memAddress0(Buffer buffer) { return UNSAFE.getLong(buffer, ADDRESS); } + + // --- [ Buffer address ] --- + + /** + * Returns the memory address at the current position of the specified buffer. This is effectively a pointer value that can be used in native function + * calls. + * + * @param buffer the buffer + * + * @return the memory address + */ + public static long memAddress(ByteBuffer buffer) { return buffer.position() + memAddress0(buffer); } + + /** + * Returns the memory address at the specified position of the specified buffer. + * + * @param buffer the buffer + * @param position the buffer position + * + * @return the memory address + * + * @see #memAddress(ByteBuffer) + */ + public static long memAddress(ByteBuffer buffer, int position) { + Objects.requireNonNull(buffer); + return memAddress0(buffer) + Integer.toUnsignedLong(position); + } + + private static long address(int position, int elementShift, long address) { + return address + ((position & 0xFFFF_FFFFL) << elementShift); + } + + /** ShortBuffer version of {@link #memAddress(ByteBuffer)}. */ + public static long memAddress(ShortBuffer buffer) { return address(buffer.position(), 1, memAddress0(buffer)); } + /** ShortBuffer version of {@link #memAddress(ByteBuffer, int)}. */ + public static long memAddress(ShortBuffer buffer, int position) { + Objects.requireNonNull(buffer); + return address(position, 1, memAddress0(buffer)); + } + + /** CharBuffer version of {@link #memAddress(ByteBuffer)}. */ + public static long memAddress(CharBuffer buffer) { return address(buffer.position(), 1, memAddress0(buffer)); } + /** CharBuffer version of {@link #memAddress(ByteBuffer, int)}. */ + public static long memAddress(CharBuffer buffer, int position) { + Objects.requireNonNull(buffer); + return address(position, 1, memAddress0(buffer)); + } + + /** IntBuffer version of {@link #memAddress(ByteBuffer)}. */ + public static long memAddress(IntBuffer buffer) { return address(buffer.position(), 2, memAddress0(buffer)); } + /** IntBuffer version of {@link #memAddress(ByteBuffer, int)}. */ + public static long memAddress(IntBuffer buffer, int position) { + Objects.requireNonNull(buffer); + return address(position, 2, memAddress0(buffer)); + } + + /** FloatBuffer version of {@link #memAddress(ByteBuffer)}. */ + public static long memAddress(FloatBuffer buffer) { return address(buffer.position(), 2, memAddress0(buffer)); } + /** FloatBuffer version of {@link #memAddress(ByteBuffer, int)}. */ + public static long memAddress(FloatBuffer buffer, int position) { + Objects.requireNonNull(buffer); + return address(position, 2, memAddress0(buffer)); + } + + /** LongBuffer version of {@link #memAddress(ByteBuffer)}. */ + public static long memAddress(LongBuffer buffer) { return address(buffer.position(), 3, memAddress0(buffer)); } + /** LongBuffer version of {@link #memAddress(ByteBuffer, int)}. */ + public static long memAddress(LongBuffer buffer, int position) { + Objects.requireNonNull(buffer); + return address(position, 3, memAddress0(buffer)); + } + + /** DoubleBuffer version of {@link #memAddress(ByteBuffer)}. */ + public static long memAddress(DoubleBuffer buffer) { return address(buffer.position(), 3, memAddress0(buffer)); } + /** DoubleBuffer version of {@link #memAddress(ByteBuffer, int)}. */ + public static long memAddress(DoubleBuffer buffer, int position) { + Objects.requireNonNull(buffer); + return address(position, 3, memAddress0(buffer)); + } + + /** Polymorphic version of {@link #memAddress(ByteBuffer)}. */ + public static long memAddress(Buffer buffer) { + int elementShift; + if (buffer instanceof ByteBuffer) { + elementShift = 0; + } else if (buffer instanceof ShortBuffer || buffer instanceof CharBuffer) { + elementShift = 1; + } else if (buffer instanceof IntBuffer || buffer instanceof FloatBuffer) { + elementShift = 2; + } else { + elementShift = 3; + } + return address(buffer.position(), elementShift, memAddress0(buffer)); + } + + /** CustomBuffer version of {@link #memAddress(ByteBuffer)}. */ + public static long memAddress(CustomBuffer buffer) { return buffer.address(); } + /** CustomBuffer version of {@link #memAddress(ByteBuffer, int)}. */ + public static long memAddress(CustomBuffer buffer, int position) { return buffer.address(position); } + + // --- [ Buffer address - Safe ] --- + + /** Null-safe version of {@link #memAddress(ByteBuffer)}. Returns {@link #NULL} if the specified buffer is null. */ + public static long memAddressSafe(@Nullable ByteBuffer buffer) { return buffer == null ? NULL : memAddress0(buffer) + buffer.position(); } + + /** ShortBuffer version of {@link #memAddressSafe(ByteBuffer)}. */ + public static long memAddressSafe(@Nullable ShortBuffer buffer) { return buffer == null ? NULL : address(buffer.position(), 1, memAddress0(buffer)); } + + /** CharBuffer version of {@link #memAddressSafe(ByteBuffer)}. */ + public static long memAddressSafe(@Nullable CharBuffer buffer) { return buffer == null ? NULL : address(buffer.position(), 1, memAddress0(buffer)); } + + /** IntBuffer version of {@link #memAddressSafe(ByteBuffer)}. */ + public static long memAddressSafe(@Nullable IntBuffer buffer) { return buffer == null ? NULL : address(buffer.position(), 2, memAddress0(buffer)); } + + /** FloatBuffer version of {@link #memAddressSafe(ByteBuffer)}. */ + public static long memAddressSafe(@Nullable FloatBuffer buffer) { return buffer == null ? NULL : address(buffer.position(), 2, memAddress0(buffer)); } + + /** LongBuffer version of {@link #memAddressSafe(ByteBuffer)}. */ + public static long memAddressSafe(@Nullable LongBuffer buffer) { return buffer == null ? NULL : address(buffer.position(), 3, memAddress0(buffer)); } + + /** DoubleBuffer version of {@link #memAddressSafe(ByteBuffer)}. */ + public static long memAddressSafe(@Nullable DoubleBuffer buffer) { return buffer == null ? NULL : address(buffer.position(), 3, memAddress0(buffer)); } + + /** Pointer version of {@link #memAddressSafe(ByteBuffer)}. */ + public static long memAddressSafe(@Nullable Pointer pointer) { return pointer == null ? NULL : pointer.address(); } + + // --- [ Buffer allocation ] --- + + /** + * Creates a new direct ByteBuffer that starts at the specified memory address and has the specified capacity. The returned ByteBuffer instance will be set + * to the native {@link ByteOrder}. + * + * @param address the starting memory address + * @param capacity the buffer capacity + * + * @return the new ByteBuffer + */ + public static ByteBuffer memByteBuffer(long address, int capacity) { + if (CHECKS) { + check(address); + } + return wrap(BUFFER_BYTE, address, capacity).order(NATIVE_ORDER); + } + + /** Like {@link #memByteBuffer(long, int) memByteBuffer}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static ByteBuffer memByteBufferSafe(long address, int capacity) { + return address == NULL ? null : wrap(BUFFER_BYTE, address, capacity).order(NATIVE_ORDER); + } + + /** + * Creates a {@link ByteBuffer} instance as a view of the specified {@link ShortBuffer} between its current position and limit. + * + *

    This operation is the inverse of {@link ByteBuffer#asShortBuffer()}. The returned {@code ByteBuffer} instance will be set to the native + * {@link ByteOrder}.

    + * + * @param buffer the source buffer + * + * @return the {@code ByteBuffer} view + */ + public static ByteBuffer memByteBuffer(ShortBuffer buffer) { + if (CHECKS && (Integer.MAX_VALUE >> 1) < buffer.remaining()) { + throw new IllegalArgumentException("The source buffer range is too wide"); + } + return wrap(BUFFER_BYTE, memAddress(buffer), buffer.remaining() << 1).order(NATIVE_ORDER); + } + + /** + * Creates a {@link ByteBuffer} instance as a view of the specified {@link CharBuffer} between its current position and limit. + * + *

    This operation is the inverse of {@link ByteBuffer#asCharBuffer()}. The returned {@code ByteBuffer} instance will be set to the native + * {@link ByteOrder}.

    + * + * @param buffer the source buffer + * + * @return the {@code ByteBuffer} view + */ + public static ByteBuffer memByteBuffer(CharBuffer buffer) { + if (CHECKS && (Integer.MAX_VALUE >> 1) < buffer.remaining()) { + throw new IllegalArgumentException("The source buffer range is too wide"); + } + return wrap(BUFFER_BYTE, memAddress(buffer), buffer.remaining() << 1).order(NATIVE_ORDER); + } + + /** + * Creates a {@link ByteBuffer} instance as a view of the specified {@link IntBuffer} between its current position and limit. + * + *

    This operation is the inverse of {@link ByteBuffer#asIntBuffer()}. The returned {@code ByteBuffer} instance will be set to the native + * {@link ByteOrder}.

    + * + * @param buffer the source buffer + * + * @return the {@code ByteBuffer} view + */ + public static ByteBuffer memByteBuffer(IntBuffer buffer) { + if (CHECKS && (Integer.MAX_VALUE >> 2) < buffer.remaining()) { + throw new IllegalArgumentException("The source buffer range is too wide"); + } + return wrap(BUFFER_BYTE, memAddress(buffer), buffer.remaining() << 2).order(NATIVE_ORDER); + } + + /** + * Creates a {@link ByteBuffer} instance as a view of the specified {@link LongBuffer} between its current position and limit. + * + *

    This operation is the inverse of {@link ByteBuffer#asLongBuffer()}. The returned {@code ByteBuffer} instance will be set to the native + * {@link ByteOrder}.

    + * + * @param buffer the source buffer + * + * @return the {@code ByteBuffer} view + */ + public static ByteBuffer memByteBuffer(LongBuffer buffer) { + if (CHECKS && (Integer.MAX_VALUE >> 3) < buffer.remaining()) { + throw new IllegalArgumentException("The source buffer range is too wide"); + } + return wrap(BUFFER_BYTE, memAddress(buffer), buffer.remaining() << 3).order(NATIVE_ORDER); + } + + /** + * Creates a {@link ByteBuffer} instance as a view of the specified {@link FloatBuffer} between its current position and limit. + * + *

    This operation is the inverse of {@link ByteBuffer#asFloatBuffer()}. The returned {@code ByteBuffer} instance will be set to the native + * {@link ByteOrder}.

    + * + * @param buffer the source buffer + * + * @return the {@code ByteBuffer} view + */ + public static ByteBuffer memByteBuffer(FloatBuffer buffer) { + if (CHECKS && (Integer.MAX_VALUE >> 2) < buffer.remaining()) { + throw new IllegalArgumentException("The source buffer range is too wide"); + } + return wrap(BUFFER_BYTE, memAddress(buffer), buffer.remaining() << 2).order(NATIVE_ORDER); + } + + /** + * Creates a {@link ByteBuffer} instance as a view of the specified {@link DoubleBuffer} between its current position and limit. + * + *

    This operation is the inverse of {@link ByteBuffer#asDoubleBuffer()}. The returned {@code ByteBuffer} instance will be set to the native + * {@link ByteOrder}.

    + * + * @param buffer the source buffer + * + * @return the {@code ByteBuffer} view + */ + public static ByteBuffer memByteBuffer(DoubleBuffer buffer) { + if (CHECKS && (Integer.MAX_VALUE >> 3) < buffer.remaining()) { + throw new IllegalArgumentException("The source buffer range is too wide"); + } + return wrap(BUFFER_BYTE, memAddress(buffer), buffer.remaining() << 3).order(NATIVE_ORDER); + } + + /** + * Creates a {@link ByteBuffer} instance as a view of the specified {@link CustomBuffer} between its current position and limit. + * + *

    The returned {@code ByteBuffer} instance will be set to the native {@link ByteOrder}.

    + * + * @param buffer the source buffer + * + * @return the {@code ByteBuffer} view + */ + public static ByteBuffer memByteBuffer(CustomBuffer buffer) { + if (CHECKS && (Integer.MAX_VALUE / buffer.sizeof()) < buffer.remaining()) { + throw new IllegalArgumentException("The source buffer range is too wide"); + } + return wrap(BUFFER_BYTE, memAddress(buffer), buffer.remaining() * buffer.sizeof()).order(NATIVE_ORDER); + } + + /** + * Creates a {@link ByteBuffer} instance as a view of the specified {@link Struct}. + * + *

    The returned {@code ByteBuffer} instance will be set to the native {@link ByteOrder}.

    + * + * @param value the struct value + * + * @return the {@code ByteBuffer} view + */ + public static > ByteBuffer memByteBuffer(T value) { + return wrap(BUFFER_BYTE, value.address, value.sizeof()).order(NATIVE_ORDER); + } + + /** + * Creates a new direct ShortBuffer that starts at the specified memory address and has the specified capacity. + * + *

    The {@code address} specified must be aligned to 2 bytes. If not, use {@code memByteBuffer(address, capacity * 2).asShortBuffer()}.

    + * + * @param address the starting memory address + * @param capacity the buffer capacity + * + * @return the new ShortBuffer + */ + public static ShortBuffer memShortBuffer(long address, int capacity) { + if (CHECKS) { + check(address); + } + return wrap(BUFFER_SHORT, address, capacity); + } + + /** Like {@link #memShortBuffer}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static ShortBuffer memShortBufferSafe(long address, int capacity) { + return address == NULL ? null : wrap(BUFFER_SHORT, address, capacity); + } + + /** + * Creates a new direct CharBuffer that starts at the specified memory address and has the specified capacity. + * + *

    The {@code address} specified must be aligned to 2 bytes. If not, use {@code memByteBuffer(address, capacity * 2).asCharBuffer()}.

    + * + * @param address the starting memory address + * @param capacity the buffer capacity + * + * @return the new CharBuffer + */ + public static CharBuffer memCharBuffer(long address, int capacity) { + if (CHECKS) { + check(address); + } + return wrap(BUFFER_CHAR, address, capacity); + } + + /** Like {@link #memCharBuffer}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static CharBuffer memCharBufferSafe(long address, int capacity) { + return address == NULL ? null : wrap(BUFFER_CHAR, address, capacity); + } + + /** + * Creates a new direct IntBuffer that starts at the specified memory address and has the specified capacity. + * + *

    The {@code address} specified must be aligned to 4 bytes. If not, use {@code memByteBuffer(address, capacity * 4).asIntBuffer()}.

    + * + * @param address the starting memory address + * @param capacity the buffer capacity + * + * @return the new IntBuffer + */ + public static IntBuffer memIntBuffer(long address, int capacity) { + if (CHECKS) { + check(address); + } + return wrap(BUFFER_INT, address, capacity); + } + + /** Like {@link #memIntBuffer}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static IntBuffer memIntBufferSafe(long address, int capacity) { + return address == NULL ? null : wrap(BUFFER_INT, address, capacity); + } + + /** + * Creates a new direct LongBuffer that starts at the specified memory address and has the specified capacity. + * + *

    The {@code address} specified must be aligned to 8 bytes. If not, use {@code memByteBuffer(address, capacity * 8).asLongBuffer()}.

    + * + * @param address the starting memory address + * @param capacity the buffer capacity + * + * @return the new LongBuffer + */ + public static LongBuffer memLongBuffer(long address, int capacity) { + if (CHECKS) { + check(address); + } + return wrap(BUFFER_LONG, address, capacity); + } + + /** Like {@link #memLongBuffer}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static LongBuffer memLongBufferSafe(long address, int capacity) { + return address == NULL ? null : wrap(BUFFER_LONG, address, capacity); + } + + /** + * Creates a new direct {@code CLongBuffer} that starts at the specified memory address and has the specified capacity. + * + *

    The {@code address} specified must be aligned to 8 bytes. If not, use {@code memByteBuffer(address, capacity * 8).asLongBuffer()}.

    + * + * @param address the starting memory address + * @param capacity the buffer capacity + * + * @return the new {@code CLongBuffer} + */ + public static CLongBuffer memCLongBuffer(long address, int capacity) { + if (CHECKS) { + check(address); + } + return CLongBuffer.create(address, capacity); + } + + /** Like {@link #memCLongBuffer}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static CLongBuffer memCLongBufferSafe(long address, int capacity) { + return address == NULL ? null : CLongBuffer.create(address, capacity); + } + + /** + * Creates a new direct FloatBuffer that starts at the specified memory address and has the specified capacity. + * + *

    The {@code address} specified must be aligned to 4 bytes. If not, use {@code memByteBuffer(address, capacity * 4).asFloatBuffer()}.

    + * + * @param address the starting memory address + * @param capacity the buffer capacity + * + * @return the new FloatBuffer + */ + public static FloatBuffer memFloatBuffer(long address, int capacity) { + if (CHECKS) { + check(address); + } + return wrap(BUFFER_FLOAT, address, capacity); + } + + /** Like {@link #memFloatBuffer}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static FloatBuffer memFloatBufferSafe(long address, int capacity) { + return address == NULL ? null : wrap(BUFFER_FLOAT, address, capacity); + } + + /** + * Creates a new direct DoubleBuffer that starts at the specified memory address and has the specified capacity. + * + *

    The {@code address} specified must be aligned to 8 bytes. If not, use {@code memByteBuffer(address, capacity * 8).asDoubleBuffer()}.

    + * + * @param address the starting memory address + * @param capacity the buffer capacity + * + * @return the new DoubleBuffer + */ + public static DoubleBuffer memDoubleBuffer(long address, int capacity) { + if (CHECKS) { + check(address); + } + return wrap(BUFFER_DOUBLE, address, capacity); + } + + /** Like {@link #memDoubleBuffer}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static DoubleBuffer memDoubleBufferSafe(long address, int capacity) { + return address == NULL ? null : wrap(BUFFER_DOUBLE, address, capacity); + } + + /** + * Creates a new PointerBuffer that starts at the specified memory address and has the specified capacity. + * + *

    The {@code address} specified must be aligned to the pointer size. If not, use {@code PointerBuffer.create(memByteBuffer(address, capacity * + * POINTER_SIZE))}.

    + * + * @param address the starting memory address + * @param capacity the buffer capacity + * + * @return the new PointerBuffer + */ + public static PointerBuffer memPointerBuffer(long address, int capacity) { + if (CHECKS) { + check(address); + } + return PointerBuffer.create(address, capacity); + } + + /** Like {@link #memPointerBuffer}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static PointerBuffer memPointerBufferSafe(long address, int capacity) { + return address == NULL ? null : PointerBuffer.create(address, capacity); + } + + // --- [ Buffer duplication ] --- + + /** + * Duplicates the specified buffer. The returned buffer will have the same {@link ByteOrder} as the source buffer. + * + *

    This method should be preferred over {@link ByteBuffer#duplicate} because it has a much shorter call chain. Long call chains may fail to inline due + * to JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to duplicate + * + * @return the duplicated buffer + */ + public static ByteBuffer memDuplicate(ByteBuffer buffer) { + ByteBuffer target; + try { + target = (ByteBuffer)UNSAFE.allocateInstance(BUFFER_BYTE); + } catch (InstantiationException e) { + throw new UnsupportedOperationException(e); + } + + UNSAFE.putLong(target, ADDRESS, UNSAFE.getLong(buffer, ADDRESS)); + UNSAFE.putInt(target, MARK, UNSAFE.getInt(buffer, MARK)); + UNSAFE.putInt(target, POSITION, UNSAFE.getInt(buffer, POSITION)); + UNSAFE.putInt(target, LIMIT, UNSAFE.getInt(buffer, LIMIT)); + UNSAFE.putInt(target, CAPACITY, UNSAFE.getInt(buffer, CAPACITY)); + + Object attachment = UNSAFE.getObject(buffer, PARENT_BYTE); + UNSAFE.putObject(target, PARENT_BYTE, attachment == null ? buffer : attachment); + + return target.order(buffer.order()); + } + + /** + * Duplicates the specified buffer. + * + *

    This method should be preferred over {@link ShortBuffer#duplicate} because it has a much shorter call chain. Long call chains may fail to inline due + * to JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to duplicate + * + * @return the duplicated buffer + */ + public static ShortBuffer memDuplicate(ShortBuffer buffer) { return duplicate(BUFFER_SHORT, buffer, PARENT_SHORT); } + + /** + * Duplicates the specified buffer. + * + *

    This method should be preferred over {@link CharBuffer#duplicate} because it has a much shorter call chain. Long call chains may fail to inline due + * to JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to duplicate + * + * @return the duplicated buffer + */ + public static CharBuffer memDuplicate(CharBuffer buffer) { return duplicate(BUFFER_CHAR, buffer, PARENT_CHAR); } + + /** + * Duplicates the specified buffer. + * + *

    This method should be preferred over {@link IntBuffer#duplicate} because it has a much shorter call chain. Long call chains may fail to inline due + * to JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to duplicate + * + * @return the duplicated buffer + */ + public static IntBuffer memDuplicate(IntBuffer buffer) { return duplicate(BUFFER_INT, buffer, PARENT_INT); } + + /** + * Duplicates the specified buffer. + * + *

    This method should be preferred over {@link LongBuffer#duplicate} because it has a much shorter call chain. Long call chains may fail to inline due + * to JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to duplicate + * + * @return the duplicated buffer + */ + public static LongBuffer memDuplicate(LongBuffer buffer) { return duplicate(BUFFER_LONG, buffer, PARENT_LONG); } + + /** + * Duplicates the specified buffer. + * + *

    This method should be preferred over {@link FloatBuffer#duplicate} because it has a much shorter call chain. Long call chains may fail to inline due + * to JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to duplicate + * + * @return the duplicated buffer + */ + public static FloatBuffer memDuplicate(FloatBuffer buffer) { return duplicate(BUFFER_FLOAT, buffer, PARENT_FLOAT); } + + /** + * Duplicates the specified buffer. + * + *

    This method should be preferred over {@link DoubleBuffer#duplicate} because it has a much shorter call chain. Long call chains may fail to inline due + * to JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to duplicate + * + * @return the duplicated buffer + */ + public static DoubleBuffer memDuplicate(DoubleBuffer buffer) { return duplicate(BUFFER_DOUBLE, buffer, PARENT_DOUBLE); } + + // --- [ Buffer slicing ] --- + + /** + * Slices the specified buffer. The returned buffer will have the same {@link ByteOrder} as the source buffer. + * + *

    This method should be preferred over {@link ByteBuffer#slice} because it has a much shorter call chain. Long call chains may fail to inline due to + * JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to slice + * + * @return the sliced buffer + */ + public static ByteBuffer memSlice(ByteBuffer buffer) { + return slice(buffer, memAddress0(buffer) + buffer.position(), buffer.remaining()); + } + + /** + * Slices the specified buffer. + * + *

    This method should be preferred over {@link ShortBuffer#slice} because it has a much shorter call chain. Long call chains may fail to inline due to + * JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to slice + * + * @return the sliced buffer + */ + public static ShortBuffer memSlice(ShortBuffer buffer) { + return slice(BUFFER_SHORT, buffer, address(buffer.position(), 1, memAddress0(buffer)), buffer.remaining(), PARENT_SHORT); + } + + /** + * Slices the specified buffer. + * + *

    This method should be preferred over {@link CharBuffer#slice} because it has a much shorter call chain. Long call chains may fail to inline due to + * JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to slice + * + * @return the sliced buffer + */ + public static CharBuffer memSlice(CharBuffer buffer) { + return slice(BUFFER_CHAR, buffer, address(buffer.position(), 1, memAddress0(buffer)), buffer.remaining(), PARENT_CHAR); + } + + /** + * Slices the specified buffer. + * + *

    This method should be preferred over {@link IntBuffer#slice} because it has a much shorter call chain. Long call chains may fail to inline due to + * JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to slice + * + * @return the sliced buffer + */ + public static IntBuffer memSlice(IntBuffer buffer) { + return slice(BUFFER_INT, buffer, address(buffer.position(), 2, memAddress0(buffer)), buffer.remaining(), PARENT_INT); + } + + /** + * Slices the specified buffer. + * + *

    This method should be preferred over {@link LongBuffer#slice} because it has a much shorter call chain. Long call chains may fail to inline due to + * JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to slice + * + * @return the sliced buffer + */ + public static LongBuffer memSlice(LongBuffer buffer) { + return slice(BUFFER_LONG, buffer, address(buffer.position(), 3, memAddress0(buffer)), buffer.remaining(), PARENT_LONG); + } + + /** + * Slices the specified buffer. + * + *

    This method should be preferred over {@link FloatBuffer#slice} because it has a much shorter call chain. Long call chains may fail to inline due to + * JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to slice + * + * @return the sliced buffer + */ + public static FloatBuffer memSlice(FloatBuffer buffer) { + return slice(BUFFER_FLOAT, buffer, address(buffer.position(), 2, memAddress0(buffer)), buffer.remaining(), PARENT_FLOAT); + } + + /** + * Slices the specified buffer. + * + *

    This method should be preferred over {@link DoubleBuffer#slice} because it has a much shorter call chain. Long call chains may fail to inline due to + * JVM limits, disabling important optimizations (e.g. scalar replacement via Escape Analysis).

    + * + * @param buffer the buffer to slice + * + * @return the sliced buffer + */ + public static DoubleBuffer memSlice(DoubleBuffer buffer) { + return slice(BUFFER_DOUBLE, buffer, address(buffer.position(), 3, memAddress0(buffer)), buffer.remaining(), PARENT_DOUBLE); + } + /** + * Returns a slice of the specified buffer between {@code (buffer.position() + offset)} and {@code (buffer.position() + offset + capacity)}. The returned + * buffer will have the same {@link ByteOrder} as the original buffer. + * + *

    The position and limit of the original buffer are preserved after a call to this method.

    + * + * @param buffer the buffer to slice + * @param offset the slice offset, it must be ≤ {@code buffer.remaining()} + * @param capacity the slice length, it must be ≤ {@code buffer.capacity() - (buffer.position() + offset)} + * + * @return the sliced buffer + */ + public static ByteBuffer memSlice(ByteBuffer buffer, int offset, int capacity) { + int position = buffer.position() + offset; + if (offset < 0 || buffer.limit() < position) { + throw new IllegalArgumentException(); + } + if (capacity < 0 || buffer.capacity() - position < capacity) { + throw new IllegalArgumentException(); + } + return slice(buffer, memAddress0(buffer) + position, capacity); + } + + /** + * Returns a slice of the specified buffer between {@code (buffer.position() + offset)} and {@code (buffer.position() + offset + capacity)}. + * + *

    The position and limit of the original buffer are preserved after a call to this method.

    + * + * @param buffer the buffer to slice + * @param offset the slice offset, it must be ≤ {@code buffer.remaining()} + * @param capacity the slice length, it must be ≤ {@code buffer.capacity() - (buffer.position() + offset)} + * + * @return the sliced buffer + */ + public static ShortBuffer memSlice(ShortBuffer buffer, int offset, int capacity) { + int position = buffer.position() + offset; + if (offset < 0 || buffer.limit() < position) { + throw new IllegalArgumentException(); + } + if (capacity < 0 || buffer.capacity() - position < capacity) { + throw new IllegalArgumentException(); + } + return slice(BUFFER_SHORT, buffer, address(position, 1, memAddress0(buffer)), capacity, PARENT_SHORT); + } + + /** + * Returns a slice of the specified buffer between {@code (buffer.position() + offset)} and {@code (buffer.position() + offset + capacity)}. + * + *

    The position and limit of the original buffer are preserved after a call to this method.

    + * + * @param buffer the buffer to slice + * @param offset the slice offset, it must be ≤ {@code buffer.remaining()} + * @param capacity the slice length, it must be ≤ {@code buffer.capacity() - (buffer.position() + offset)} + * + * @return the sliced buffer + */ + public static CharBuffer memSlice(CharBuffer buffer, int offset, int capacity) { + int position = buffer.position() + offset; + if (offset < 0 || buffer.limit() < position) { + throw new IllegalArgumentException(); + } + if (capacity < 0 || buffer.capacity() - position < capacity) { + throw new IllegalArgumentException(); + } + return slice(BUFFER_CHAR, buffer, address(position, 1, memAddress0(buffer)), capacity, PARENT_CHAR); + } + + /** + * Returns a slice of the specified buffer between {@code (buffer.position() + offset)} and {@code (buffer.position() + offset + capacity)}. + * + *

    The position and limit of the original buffer are preserved after a call to this method.

    + * + * @param buffer the buffer to slice + * @param offset the slice offset, it must be ≤ {@code buffer.remaining()} + * @param capacity the slice length, it must be ≤ {@code buffer.capacity() - (buffer.position() + offset)} + * + * @return the sliced buffer + */ + public static IntBuffer memSlice(IntBuffer buffer, int offset, int capacity) { + int position = buffer.position() + offset; + if (offset < 0 || buffer.limit() < position) { + throw new IllegalArgumentException(); + } + if (capacity < 0 || buffer.capacity() - position < capacity) { + throw new IllegalArgumentException(); + } + return slice(BUFFER_INT, buffer, address(position, 2, memAddress0(buffer)), capacity, PARENT_INT); + } + + /** + * Returns a slice of the specified buffer between {@code (buffer.position() + offset)} and {@code (buffer.position() + offset + capacity)}. + * + *

    The position and limit of the original buffer are preserved after a call to this method.

    + * + * @param buffer the buffer to slice + * @param offset the slice offset, it must be ≤ {@code buffer.remaining()} + * @param capacity the slice length, it must be ≤ {@code buffer.capacity() - (buffer.position() + offset)} + * + * @return the sliced buffer + */ + public static LongBuffer memSlice(LongBuffer buffer, int offset, int capacity) { + int position = buffer.position() + offset; + if (offset < 0 || buffer.limit() < position) { + throw new IllegalArgumentException(); + } + if (capacity < 0 || buffer.capacity() - position < capacity) { + throw new IllegalArgumentException(); + } + return slice(BUFFER_LONG, buffer, address(position, 3, memAddress0(buffer)), capacity, PARENT_LONG); + } + + /** + * Returns a slice of the specified buffer between {@code (buffer.position() + offset)} and {@code (buffer.position() + offset + capacity)}. + * + *

    The position and limit of the original buffer are preserved after a call to this method.

    + * + * @param buffer the buffer to slice + * @param offset the slice offset, it must be ≤ {@code buffer.remaining()} + * @param capacity the slice length, it must be ≤ {@code buffer.capacity() - (buffer.position() + offset)} + * + * @return the sliced buffer + */ + public static FloatBuffer memSlice(FloatBuffer buffer, int offset, int capacity) { + int position = buffer.position() + offset; + if (offset < 0 || buffer.limit() < position) { + throw new IllegalArgumentException(); + } + if (capacity < 0 || buffer.capacity() - position < capacity) { + throw new IllegalArgumentException(); + } + return slice(BUFFER_FLOAT, buffer, address(position, 2, memAddress0(buffer)), capacity, PARENT_FLOAT); + } + + /** + * Returns a slice of the specified buffer between {@code (buffer.position() + offset)} and {@code (buffer.position() + offset + capacity)}. + * + *

    The position and limit of the original buffer are preserved after a call to this method.

    + * + * @param buffer the buffer to slice + * @param offset the slice offset, it must be ≤ {@code buffer.remaining()} + * @param capacity the slice length, it must be ≤ {@code buffer.capacity() - (buffer.position() + offset)} + * + * @return the sliced buffer + */ + public static DoubleBuffer memSlice(DoubleBuffer buffer, int offset, int capacity) { + int position = buffer.position() + offset; + if (offset < 0 || buffer.limit() < position) { + throw new IllegalArgumentException(); + } + if (capacity < 0 || buffer.capacity() - position < capacity) { + throw new IllegalArgumentException(); + } + return slice(BUFFER_DOUBLE, buffer, address(position, 3, memAddress0(buffer)), capacity, PARENT_DOUBLE); + } + + /** + * Returns a slice of the specified buffer between {@code (buffer.position() + offset)} and {@code (buffer.position() + offset + capacity)}. + * + *

    The position and limit of the original buffer are preserved after a call to this method.

    + * + * @param buffer the buffer to slice + * @param offset the slice offset, it must be ≤ {@code buffer.remaining()} + * @param capacity the slice length, it must be ≤ {@code buffer.capacity() - (buffer.position() + offset)} + * + * @return the sliced buffer + */ + public static > T memSlice(T buffer, int offset, int capacity) { return buffer.slice(offset, capacity); } + + // --- [ memset ] --- + + /** + * Sets all bytes in a specified block of memory to a fixed value (usually zero). + * + * @param ptr the starting memory address + * @param value the value to set (memSet will convert it to unsigned byte) + */ + public static void memSet(ByteBuffer ptr, int value) { memSet(memAddress(ptr), value, ptr.remaining()); } + + /** + * Sets all bytes in a specified block of memory to a fixed value (usually zero). + * + * @param ptr the starting memory address + * @param value the value to set (memSet will convert it to unsigned byte) + */ + public static void memSet(ShortBuffer ptr, int value) { memSet(memAddress(ptr), value, apiGetBytes(ptr.remaining(), 1)); } + + /** + * Sets all bytes in a specified block of memory to a fixed value (usually zero). + * + * @param ptr the starting memory address + * @param value the value to set (memSet will convert it to unsigned byte) + */ + public static void memSet(CharBuffer ptr, int value) { memSet(memAddress(ptr), value, apiGetBytes(ptr.remaining(), 1)); } + + /** + * Sets all bytes in a specified block of memory to a fixed value (usually zero). + * + * @param ptr the starting memory address + * @param value the value to set (memSet will convert it to unsigned byte) + */ + public static void memSet(IntBuffer ptr, int value) { memSet(memAddress(ptr), value, apiGetBytes(ptr.remaining(), 2)); } + + /** + * Sets all bytes in a specified block of memory to a fixed value (usually zero). + * + * @param ptr the starting memory address + * @param value the value to set (memSet will convert it to unsigned byte) + */ + public static void memSet(LongBuffer ptr, int value) { memSet(memAddress(ptr), value, apiGetBytes(ptr.remaining(), 3)); } + + /** + * Sets all bytes in a specified block of memory to a fixed value (usually zero). + * + * @param ptr the starting memory address + * @param value the value to set (memSet will convert it to unsigned byte) + */ + public static void memSet(FloatBuffer ptr, int value) { memSet(memAddress(ptr), value, apiGetBytes(ptr.remaining(), 2)); } + + /** + * Sets all bytes in a specified block of memory to a fixed value (usually zero). + * + * @param ptr the starting memory address + * @param value the value to set (memSet will convert it to unsigned byte) + */ + public static void memSet(DoubleBuffer ptr, int value) { memSet(memAddress(ptr), value, apiGetBytes(ptr.remaining(), 3)); } + + /** + * Sets all bytes in a specified block of memory to a fixed value (usually zero). + * + * @param ptr the starting memory address + * @param value the value to set (memSet will convert it to unsigned byte) + * @param the buffer type + */ + public static > void memSet(T ptr, int value) { memSet(memAddress(ptr), value, Integer.toUnsignedLong(ptr.remaining()) * ptr.sizeof()); } + + /** + * Sets all bytes in a specified block of memory to a fixed value (usually zero). + * + * @param ptr the starting memory address + * @param value the value to set (memSet will convert it to unsigned byte) + * @param the struct type + */ + public static > void memSet(T ptr, int value) { memSet(ptr.address, value, ptr.sizeof()); } + + // --- [ memcpy ] --- + + /** + * Sets all bytes in a specified block of memory to a copy of another block. + * + * @param src the source memory address + * @param dst the destination memory address + */ + public static void memCopy(ByteBuffer src, ByteBuffer dst) { + if (CHECKS) { + check(dst, src.remaining()); + } + MultiReleaseMemCopy.copy(memAddress(src), memAddress(dst), src.remaining()); + } + + /** + * Sets all bytes in a specified block of memory to a copy of another block. + * + * @param src the source memory address + * @param dst the destination memory address + */ + public static void memCopy(ShortBuffer src, ShortBuffer dst) { + if (CHECKS) { + check(dst, src.remaining()); + } + MultiReleaseMemCopy.copy(memAddress(src), memAddress(dst), apiGetBytes(src.remaining(), 1)); + } + + /** + * Sets all bytes in a specified block of memory to a copy of another block. + * + * @param src the source memory address + * @param dst the destination memory address + */ + public static void memCopy(CharBuffer src, CharBuffer dst) { + if (CHECKS) { + check((Buffer)dst, src.remaining()); + } + MultiReleaseMemCopy.copy(memAddress(src), memAddress(dst), apiGetBytes(src.remaining(), 1)); + } + + /** + * Sets all bytes in a specified block of memory to a copy of another block. + * + * @param src the source memory address + * @param dst the destination memory address + */ + public static void memCopy(IntBuffer src, IntBuffer dst) { + if (CHECKS) { + check(dst, src.remaining()); + } + MultiReleaseMemCopy.copy(memAddress(src), memAddress(dst), apiGetBytes(src.remaining(), 2)); + } + + /** + * Sets all bytes in a specified block of memory to a copy of another block. + * + * @param src the source memory address + * @param dst the destination memory address + */ + public static void memCopy(LongBuffer src, LongBuffer dst) { + if (CHECKS) { + check(dst, src.remaining()); + } + MultiReleaseMemCopy.copy(memAddress(src), memAddress(dst), apiGetBytes(src.remaining(), 3)); + } + + /** + * Sets all bytes in a specified block of memory to a copy of another block. + * + * @param src the source memory address + * @param dst the destination memory address + */ + public static void memCopy(FloatBuffer src, FloatBuffer dst) { + if (CHECKS) { + check(dst, src.remaining()); + } + MultiReleaseMemCopy.copy(memAddress(src), memAddress(dst), apiGetBytes(src.remaining(), 2)); + } + + /** + * Sets all bytes in a specified block of memory to a copy of another block. + * + * @param src the source memory address + * @param dst the destination memory address + */ + public static void memCopy(DoubleBuffer src, DoubleBuffer dst) { + if (CHECKS) { + check(dst, src.remaining()); + } + MultiReleaseMemCopy.copy(memAddress(src), memAddress(dst), apiGetBytes(src.remaining(), 3)); + } + + /** + * Sets all bytes in a specified block of memory to a copy of another block. + * + * @param src the source memory address + * @param dst the destination memory address + * @param the buffer type + */ + public static > void memCopy(T src, T dst) { + if (CHECKS) { + check(dst, src.remaining()); + } + MultiReleaseMemCopy.copy(memAddress(src), memAddress(dst), Integer.toUnsignedLong(src.remaining()) * src.sizeof()); + } + + /** + * Sets all bytes of a struct to a copy of another struct. + * + * @param src the source struct + * @param dst the destination struct + * @param the struct type + */ + public static > void memCopy(T src, T dst) { + MultiReleaseMemCopy.copy(src.address, dst.address, src.sizeof()); + } + + /* ------------------------------------- + ------------------------------------- + UNSAFE MEMORY ACCESS API + ------------------------------------- + ------------------------------------- */ + + private static final int FILL_PATTERN_32 = Integer.divideUnsigned(-1, 255); + private static final long FILL_PATTERN_64 = Long.divideUnsigned(-1L, 255L); + + /** + * Sets all bytes in a specified block of memory to a fixed value (usually zero). + * + * @param ptr the starting memory address + * @param value the value to set (memSet will convert it to unsigned byte) + * @param bytes the number of bytes to set + */ + public static void memSet(long ptr, int value, long bytes) { + if (DEBUG && (ptr == NULL || bytes < 0)) { + throw new IllegalArgumentException(); + } + + /* + - Unsafe.setMemory is very slow. + - A custom Java loop is fastest at small sizes, approximately up to 256 bytes. + - The native memset becomes fastest at bigger sizes, when the JNI overhead becomes negligible. + */ + + //UNSAFE.setMemory(ptr, bytes, (byte)(value & 0xFF)); + if (bytes < 256L) { + int p = (int)ptr; + if (BITS64) { + if ((p & 7) == 0) { + memSet64(ptr, value, (int)bytes & 0xFF); + return; + } + } else { + if ((p & 3) == 0) { + memSet32(p, value, (int)bytes & 0xFF); + return; + } + } + } + nmemset(ptr, value, bytes); + } + private static void memSet64(long ptr, int value, int bytes) { + int aligned = bytes & ~7; + + // Aligned body + long valuel = (value & 0xFF) * FILL_PATTERN_64; + for (int i = 0; i < aligned; i += 8) { + UNSAFE.putLong(null, ptr + i, valuel); + } + + // Unaligned tail + byte valueb = (byte)(value & 0xFF); + for (int i = aligned; i < bytes; i++) { + UNSAFE.putByte(null, ptr + i, valueb); + } + } + private static void memSet32(int ptr, int value, int bytes) { + int aligned = bytes & ~3; + + // Aligned body + int vi = (value & 0xFF) * FILL_PATTERN_32; + for (int i = 0; i < aligned; i += 4) { + UNSAFE.putInt(null, (ptr + i) & 0xFFFF_FFFFL, vi); + } + + // Unaligned tail + byte vb = (byte)(value & 0xFF); + for (int i = aligned; i < bytes; i++) { + UNSAFE.putByte(null, (ptr + i) & 0xFFFF_FFFFL, vb); + } + } + + // from LWJGL 3.1.2 + /** + * Sets all bytes in a specified block of memory to a copy of another block. + * + * @param src the source memory address + * @param dst the destination memory address + * @param bytes the number of bytes to copy + */ + public static void memCopy(long src, long dst, int bytes) { + memCopy(src, dst, (long)bytes); + } + + /** + * Sets all bytes in a specified block of memory to a copy of another block. + * + * @param src the source memory address + * @param dst the destination memory address + * @param bytes the number of bytes to copy + */ + public static void memCopy(long src, long dst, long bytes) { + if (DEBUG && (src == NULL || dst == NULL || bytes < 0)) { + throw new IllegalArgumentException(); + } + + MultiReleaseMemCopy.copy(src, dst, bytes); + } + + static void memCopyAligned64(long src, long dst, int bytes) { + int aligned = bytes & ~7; + + // Aligned body + for (int i = 0; i < aligned; i += 8) { + UNSAFE.putLong(null, dst + i, UNSAFE.getLong(null, src + i)); + } + + // Unaligned tail + for (int i = aligned; i < bytes; i++) { + UNSAFE.putByte(null, dst + i, UNSAFE.getByte(null, src + i)); + } + } + static void memCopyAligned32(int src, int dst, int bytes) { + int aligned = bytes & ~3; + + // Aligned body + for (int i = 0; i < aligned; i += 4) { + UNSAFE.putInt(null, (dst + i) & 0xFFFF_FFFFL, UNSAFE.getInt(null, (src + i) & 0xFFFF_FFFFL)); + } + + // Unaligned tail + for (int i = aligned; i < bytes; i++) { + UNSAFE.putByte(null, (dst + i) & 0xFFFF_FFFFL, UNSAFE.getByte(null, (src + i) & 0xFFFF_FFFFL)); + } + } + + public static boolean memGetBoolean(long ptr) { return UNSAFE.getByte(null, ptr) != 0; } + public static byte memGetByte(long ptr) { return UNSAFE.getByte(null, ptr); } + public static short memGetShort(long ptr) { return UNSAFE.getShort(null, ptr); } + public static int memGetInt(long ptr) { return UNSAFE.getInt(null, ptr); } + public static long memGetLong(long ptr) { return UNSAFE.getLong(null, ptr); } + public static float memGetFloat(long ptr) { return UNSAFE.getFloat(null, ptr); } + public static double memGetDouble(long ptr) { return UNSAFE.getDouble(null, ptr); } + public static long memGetCLong(long ptr) { + return CLONG_SIZE == 8 + ? UNSAFE.getLong(null, ptr) + : UNSAFE.getInt(null, ptr); + } + + public static long memGetAddress(long ptr) { + return BITS64 + ? UNSAFE.getLong(null, ptr) + : UNSAFE.getInt(null, ptr) & 0xFFFF_FFFFL; + } + + public static void memPutByte(long ptr, byte value) { UNSAFE.putByte(null, ptr, value); } + public static void memPutShort(long ptr, short value) { UNSAFE.putShort(null, ptr, value); } + public static void memPutInt(long ptr, int value) { UNSAFE.putInt(null, ptr, value); } + public static void memPutLong(long ptr, long value) { UNSAFE.putLong(null, ptr, value); } + public static void memPutFloat(long ptr, float value) { UNSAFE.putFloat(null, ptr, value); } + public static void memPutDouble(long ptr, double value) { UNSAFE.putDouble(null, ptr, value); } + public static void memPutCLong(long ptr, long value) { + if (CLONG_SIZE == 8) { + UNSAFE.putLong(null, ptr, value); + } else { + UNSAFE.putInt(null, ptr, (int)value); + } + } + + public static void memPutAddress(long ptr, long value) { + if (BITS64) { + UNSAFE.putLong(null, ptr, value); + } else { + UNSAFE.putInt(null, ptr, (int)value); + } + } + + /* ------------------------------------- + ------------------------------------- + JNI UTILITIES API + ------------------------------------- + ------------------------------------- */ + + /** + * Returns the object that the specified global reference points to. + * + * @param globalRef the global reference + * @param the object type + * + * @return the object pointed to by {@code globalRef} + */ + public static native T memGlobalRefToObject(long globalRef); + + /* ------------------------------------- + ------------------------------------- + TEXT ENCODING API + ------------------------------------- + ------------------------------------- */ + + private static int write8(long target, int offset, int value) { + UNSAFE.putByte(null, target + Integer.toUnsignedLong(offset), (byte)value); + return offset + 1; + } + private static int write8Safe(long target, int offset, int maxLength, int value) { + if (offset == maxLength) { + throw new BufferOverflowException(); + } + UNSAFE.putByte(null, target + Integer.toUnsignedLong(offset), (byte)value); + return offset + 1; + } + private static int write16(long target, int offset, char value) { + UNSAFE.putShort(null, target + Integer.toUnsignedLong(offset), (short)value); + return offset + 2; + } + + /** + * Returns a ByteBuffer containing the specified text ASCII encoded and null-terminated. + * + * @param text the text to encode + * + * @return the encoded text. The returned buffer must be deallocated manually with {@link #memFree}. + * + * @throws BufferOverflowException if more than {@link Integer#MAX_VALUE} bytes are required to encode the text. + */ + public static ByteBuffer memASCII(CharSequence text) { + return memASCII(text, true); + } + + /** Like {@link #memASCII(CharSequence) memASCII}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public static ByteBuffer memASCIISafe(@Nullable CharSequence text) { + return text == null ? null : memASCII(text, true); + } + + /** + * Returns a {@link ByteBuffer} containing the specified text ASCII encoded and optionally null-terminated. + * + * @param text the text to encode + * @param nullTerminated if true, the text will be terminated with a '\0'. + * + * @return the encoded text. The returned buffer must be deallocated manually with {@link #memFree}. + * + * @throws BufferOverflowException if more than {@link Integer#MAX_VALUE} bytes are required to encode the text. + */ + public static ByteBuffer memASCII(CharSequence text, boolean nullTerminated) { + int length = memLengthASCII(text, nullTerminated); + long target = nmemAlloc(length); + if (CHECKS && target == NULL) { + throw new OutOfMemoryError(); + } + encodeASCIIUnsafe(text, nullTerminated, target); + return wrap(BUFFER_BYTE, target, length).order(NATIVE_ORDER); + } + + /** Like {@link #memASCII(CharSequence, boolean) memASCII}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public static ByteBuffer memASCIISafe(@Nullable CharSequence text, boolean nullTerminated) { + return text == null ? null : memASCII(text, nullTerminated); + } + + /** + * Encodes and optionally null-terminates the specified text using ASCII encoding. The encoded text is stored in the specified {@link ByteBuffer}, at the + * current buffer position. The current buffer position is not modified by this operation. + * + * @param text the text to encode + * @param nullTerminated if true, the text will be terminated with a '\0' + * @param target the buffer where the encoded text should be stored + * + * @return the number of bytes of the encoded string + * + * @throws BufferOverflowException if more than {@code target.remaining()} bytes are required to encode the text. + */ + public static int memASCII(CharSequence text, boolean nullTerminated, ByteBuffer target) { + if (target.remaining() < memLengthASCII(text, nullTerminated)) { + throw new BufferOverflowException(); + } + long address = memAddress(target); + return encodeASCIIUnsafe(text, nullTerminated, address); + } + + /** + * Encodes and optionally null-terminates the specified text using ASCII encoding. The encoded text is stored in the specified {@link ByteBuffer} at the + * specified {@code position} offset. The current buffer position is not modified by this operation. + * + * @param text the text to encode + * @param nullTerminated if true, the text will be terminated with a '\0'. + * @param offset the buffer position to which the string will be encoded + * + * @return the number of bytes of the encoded string + * + * @throws BufferOverflowException if more than {@code target.capacity() - offset} bytes are required to encode the text. + */ + public static int memASCII(CharSequence text, boolean nullTerminated, ByteBuffer target, int offset) { + if (target.capacity() - offset < memLengthASCII(text, nullTerminated)) { + throw new BufferOverflowException(); + } + return encodeASCIIUnsafe(text, nullTerminated, memAddress(target, offset)); + } + + static int encodeASCIIUnsafe(CharSequence text, boolean nullTerminated, long target) { + int i = 0, len = text.length(); + + while (i < len) { + i = write8(target, i, text.charAt(i)); + } + + if (nullTerminated) { + i = write8(target, i, 0); + } + + return i; + } + + /** + * Returns the number of bytes required to encode the specified text in the ASCII encoding. + * + * @param value the text to encode + * @param nullTerminated if true, add the number of bytes required for null-termination + * + * @return the number of bytes + * + * @throws BufferOverflowException if more than {@link Integer#MAX_VALUE} bytes are required to encode the text. + */ + public static int memLengthASCII(CharSequence value, boolean nullTerminated) { + int len = value.length() + (nullTerminated ? 1 : 0); + if (len < 0) { + throw new BufferOverflowException(); + } + return len; + } + + /** + * Returns a ByteBuffer containing the specified text UTF-8 encoded and null-terminated. + * + * @param text the text to encode + * + * @return the encoded text. The returned buffer must be deallocated manually with {@link #memFree}. + * + * @throws BufferOverflowException if more than {@link Integer#MAX_VALUE} bytes are required to encode the text. + */ + public static ByteBuffer memUTF8(CharSequence text) { + return memUTF8(text, true); + } + + /** Like {@link #memUTF8(CharSequence) memUTF8}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public static ByteBuffer memUTF8Safe(@Nullable CharSequence text) { + return text == null ? null : memUTF8(text, true); + } + + /** + * Returns a ByteBuffer containing the specified text UTF-8 encoded and optionally null-terminated. + * + * @param text the text to encode + * @param nullTerminated if true, the text will be terminated with a '\0'. + * + * @return the encoded text. The returned buffer must be deallocated manually with {@link #memFree}. + * + * @throws BufferOverflowException if more than {@link Integer#MAX_VALUE} bytes are required to encode the text. + */ + public static ByteBuffer memUTF8(CharSequence text, boolean nullTerminated) { + int length = memLengthUTF8(text, nullTerminated); + long target = nmemAlloc(length); + if (CHECKS && target == NULL) { + throw new OutOfMemoryError(); + } + encodeUTF8Unsafe(text, nullTerminated, target); + return wrap(BUFFER_BYTE, target, length).order(NATIVE_ORDER); + } + + /** Like {@link #memUTF8(CharSequence, boolean) memUTF8}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public static ByteBuffer memUTF8Safe(@Nullable CharSequence text, boolean nullTerminated) { + return text == null ? null : memUTF8(text, nullTerminated); + } + + /** + * Encodes and optionally null-terminates the specified text using UTF-8 encoding. The encoded text is stored in the specified {@link ByteBuffer}, at the + * current buffer position. The current buffer position is not modified by this operation. + * + * @param text the text to encode + * @param nullTerminated if true, the text will be terminated with a '\0'. + * @param target the buffer in which to store the encoded text + * + * @return the number of bytes of the encoded string + * + * @throws BufferOverflowException if more than {@code target.remaining} bytes are required to encode the text. + */ + public static int memUTF8(CharSequence text, boolean nullTerminated, ByteBuffer target) { + if (target.remaining() < memLengthASCII(text, nullTerminated)) { + throw new BufferOverflowException(); + } + return encodeUTF8Safe(text, nullTerminated, memAddress(target), target.remaining()); + } + + /** + * Encodes and optionally null-terminates the specified text using UTF-8 encoding. The encoded text is stored in the specified {@link ByteBuffer}, at the + * specified {@code position} offset. The current buffer position is not modified by this operation. + * + * @param text the text to encode + * @param nullTerminated if true, the text will be terminated with a '\0'. + * @param target the buffer in which to store the encoded text + * @param offset the buffer position to which the string will be encoded + * + * @return the number of bytes of the encoded string + * + * @throws BufferOverflowException if more than {@code target.capacity() - offset} bytes are required to encode the text. + */ + public static int memUTF8(CharSequence text, boolean nullTerminated, ByteBuffer target, int offset) { + if (target.capacity() - offset < memLengthASCII(text, nullTerminated)) { + throw new BufferOverflowException(); + } + return encodeUTF8Safe(text, nullTerminated, memAddress(target, offset), target.capacity() - offset); + } + + static int encodeUTF8Unsafe(CharSequence text, boolean nullTerminated, long target) { + int p = 0, i = 0, len = text.length(); + + while (i < len) { + char c = text.charAt(i++); + if (c < 0x80) { + p = write8(target, p, c); + } else { + int cp = c; + if (c < 0x800) { + p = write8(target, p, 0xC0 | cp >> 6); + } else { + if (!isHighSurrogate(c)) { + p = write8(target, p, 0xE0 | cp >> 12); + } else { + cp = toCodePoint(c, text.charAt(i++)); + + p = write8(target, p, 0xF0 | cp >> 18); + p = write8(target, p, 0x80 | cp >> 12 & 0x3F); + } + p = write8(target, p, 0x80 | cp >> 6 & 0x3F); + } + p = write8(target, p, 0x80 | cp & 0x3F); + } + } + + if (nullTerminated) { + p = write8(target, p, 0); + } + + return p; + } + + static int encodeUTF8Safe(CharSequence text, boolean nullTerminated, long target, int maxLength) { + int p = 0, i = 0, length = text.length(); + + // ASCII fast path + while (i < length) { + char c = text.charAt(i); + if (0x80 <= c) { + break; + } + p = write8(target, p, c); // have already checked that text.length() <= maxLength + i++; + } + + // Slow path + while (i < length) { + char c = text.charAt(i++); + if (c < 0x80) { + p = write8Safe(target, p, maxLength, c); + } else { + int cp = c; + if (c < 0x800) { + p = write8Safe(target, p, maxLength, 0xC0 | cp >> 6); + } else { + if (!isHighSurrogate(c)) { + p = write8Safe(target, p, maxLength, 0xE0 | cp >> 12); + } else { + cp = toCodePoint(c, text.charAt(i++)); + + p = write8Safe(target, p, maxLength, 0xF0 | cp >> 18); + p = write8Safe(target, p, maxLength, 0x80 | cp >> 12 & 0x3F); + } + p = write8Safe(target, p, maxLength, 0x80 | cp >> 6 & 0x3F); + } + p = write8Safe(target, p, maxLength, 0x80 | cp & 0x3F); + } + } + + if (nullTerminated) { + p = write8Safe(target, p, maxLength, 0); + } + + return p; + } + + /** + * Returns the number of bytes required to encode the specified text in the UTF-8 encoding. + * + * @param value the text to encode + * @param nullTerminated if true, add the number of bytes required for null-termination + * + * @return the number of bytes + * + * @throws BufferOverflowException if more than {@link Integer#MAX_VALUE} bytes are required to encode the text. + */ + public static int memLengthUTF8(CharSequence value, boolean nullTerminated) { + int len = value.length(); + int bytes = len + (nullTerminated ? 1 : 0); // start with 1:1 + + for (int i = 0; i < len; i++) { + char c = value.charAt(i); + + if (c < 0x80) { + // 1 input char -> 1 output byte + } else { + if (c < 0x800) { + // c <= 127: 0 (1 input char -> 1 output byte) + // c >= 128: 1 (1 input char -> 2 output bytes) + bytes += (0x7F - c) >>> 31; + } else { + // non-high-surrogate: 1 input char -> 3 output bytes + // surrogate-pair: 2 input chars -> 4 output bytes + bytes += 2; + if (isHighSurrogate(c)) { + i++; + } + } + if (bytes < 0) { + throw new BufferOverflowException(); + } + } + } + + if (bytes < 0) { + throw new BufferOverflowException(); + } + + return bytes; + } + + /** + * Returns a ByteBuffer containing the specified text UTF-16 encoded and null-terminated. + * + * @param text the text to encode + * + * @return the encoded text. The returned buffer must be deallocated manually with {@link #memFree}. + * + * @throws BufferOverflowException if more than {@link Integer#MAX_VALUE} bytes are required to encode the text. + */ + public static ByteBuffer memUTF16(CharSequence text) { + return memUTF16(text, true); + } + + /** Like {@link #memUTF16(CharSequence) memUTF16}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public static ByteBuffer memUTF16Safe(@Nullable CharSequence text) { + return text == null ? null : memUTF16(text, true); + } + + /** + * Returns a ByteBuffer containing the specified text UTF-16 encoded and optionally null-terminated. + * + * @param text the text to encode + * @param nullTerminated if true, the text will be terminated with a '\0'. + * + * @return the encoded text. The returned buffer must be deallocated manually with {@link #memFree}. + * + * @throws BufferOverflowException if more than {@link Integer#MAX_VALUE} bytes are required to encode the text. + */ + public static ByteBuffer memUTF16(CharSequence text, boolean nullTerminated) { + int length = memLengthUTF16(text, nullTerminated); + long target = nmemAlloc(length); + if (CHECKS && target == NULL) { + throw new OutOfMemoryError(); + } + encodeUTF16Unsafe(text, nullTerminated, target); + return wrap(BUFFER_BYTE, target, length).order(NATIVE_ORDER); + } + + /** Like {@link #memUTF16(CharSequence, boolean) memUTF16}, but returns {@code null} if {@code text} is {@code null}. */ + @Nullable + public static ByteBuffer memUTF16Safe(@Nullable CharSequence text, boolean nullTerminated) { + return text == null ? null : memUTF16(text, nullTerminated); + } + + /** + * Encodes and optionally null-terminates the specified text using UTF-16 encoding. The encoded text is stored in the specified {@link ByteBuffer}, at the + * current buffer position. The current buffer position is not modified by this operation. The {@code target} buffer is assumed to have enough remaining + * space to store the encoded text. + * + * @param text the text to encode + * @param nullTerminated if true, the text will be terminated with a '\0'. + * @param target the buffer in which to store the encoded text + * + * @return the number of bytes of the encoded string + * + * @throws BufferOverflowException if more than {@code target.remaining()} bytes are required to encode the text. + */ + public static int memUTF16(CharSequence text, boolean nullTerminated, ByteBuffer target) { + if (target.remaining() < memLengthUTF16(text, nullTerminated)) { + throw new BufferOverflowException(); + } + long address = memAddress(target); + return encodeUTF16Unsafe(text, nullTerminated, address); + } + + /** + * Encodes and optionally null-terminates the specified text using UTF-16 encoding. The encoded text is stored in the specified {@link ByteBuffer} at the + * specified {@code position} offset. The current buffer position is not modified by this operation. The {@code target} buffer is assumed to have enough + * remaining space to store the encoded text. + * + * @param text the text to encode + * @param nullTerminated if true, the text will be terminated with a '\0'. + * @param target the buffer in which to store the encoded text + * @param offset the buffer position to which the string will be encoded + * + * @return the number of bytes of the encoded string + * + * @throws BufferOverflowException if more than {@code target.capacity() - offset} bytes are required to encode the text. + */ + public static int memUTF16(CharSequence text, boolean nullTerminated, ByteBuffer target, int offset) { + if (target.capacity() - offset < memLengthUTF16(text, nullTerminated)) { + throw new BufferOverflowException(); + } + long address = memAddress(target, offset); + return encodeUTF16Unsafe(text, nullTerminated, address); + } + + static int encodeUTF16Unsafe(CharSequence text, boolean nullTerminated, long target) { + int p = 0, i = 0, len = text.length(); + + while (i < len) { + p = write16(target, p, text.charAt(i++)); + } + + if (nullTerminated) { + p = write16(target, p, '\0'); + } + + return p; + } + + /** + * Returns the number of bytes required to encode the specified text in the UTF-16 encoding. + * + * @param value the text to encode + * @param nullTerminated if true, add the number of bytes required for null-termination + * + * @return the number of bytes + */ + public static int memLengthUTF16(CharSequence value, boolean nullTerminated) { + int len = value.length() + (nullTerminated ? 1 : 0); + if (len < 0 || 0x3FFFFFFF < len) { + throw new BufferOverflowException(); + } + return len << 1; + } + + /* ------------------------------------- + ------------------------------------- + TEXT DECODING API + ------------------------------------- + ------------------------------------- */ + + private static int memLengthNT1(long address, int maxLength) { + if (CHECKS) { + check(address); + } + return BITS64 + ? strlen64NT1(address, maxLength) + : strlen32NT1(address, maxLength); + } + + private static int strlen64NT1(long address, int maxLength) { + int i = 0; + + if (8 <= maxLength) { + int misalignment = (int)address & 7; + if (misalignment != 0) { + // Align to 8 bytes + for (int len = 8 - misalignment; i < len; i++) { + if (UNSAFE.getByte(null, address + i) == 0) { + return i; + } + } + } + + // Aligned longs for performance + for (; i <= maxLength - 8; i += 8) { + if (mathHasZeroByte(UNSAFE.getLong(null, address + i))) { + break; + } + } + } + + // Tail + for (; i < maxLength; i++) { + if (UNSAFE.getByte(null, address + i) == 0) { + break; + } + } + + return i; + } + + private static int strlen32NT1(long address, int maxLength) { + int i = 0; + + if (4 <= maxLength) { + int misalignment = (int)address & 3; + if (misalignment != 0) { + // Align to 4 bytes + for (int len = 4 - misalignment; i < len; i++) { + if (UNSAFE.getByte(null, address + i) == 0) { + return i; + } + } + } + + // Aligned ints for performance + for (; i <= maxLength - 4; i += 4) { + if (mathHasZeroByte(UNSAFE.getInt(null, address + i))) { + break; + } + } + } + + // Tail + for (; i < maxLength; i++) { + if (UNSAFE.getByte(null, address + i) == 0) { + break; + } + } + + return i; + } + + /** + * Calculates the length, in bytes, of the null-terminated string that starts at the current position of the specified buffer. A single \0 character will + * terminate the string. The returned length will NOT include the \0 byte. + * + *

    This method is useful for reading ASCII and UTF8 encoded text.

    + * + * @param buffer the buffer containing the null-terminated string + * + * @return the string length, in bytes + */ + public static int memLengthNT1(ByteBuffer buffer) { + return memLengthNT1(memAddress(buffer), buffer.remaining()); + } + + private static int memLengthNT2(long address, int maxLength) { + if (CHECKS) { + check(address); + } + return BITS64 + ? strlen64NT2(address, maxLength) + : strlen32NT2((int)address, maxLength); + } + + private static int strlen64NT2(long address, int maxLength) { + int i = 0; + + if (8 <= maxLength) { + int misalignment = (int)address & 7; + if (misalignment != 0) { + // Align to 8 bytes + for (int len = 8 - misalignment; i < len; i += 2) { + if (UNSAFE.getShort(null, address + i) == 0) { + return i; + } + } + } + + // Aligned longs for performance + for (; i <= maxLength - 8; i += 8) { + if (mathHasZeroShort(UNSAFE.getLong(null, address + i))) { + break; + } + } + } + + // Tail + for (; i < maxLength; i += 2) { + if (UNSAFE.getShort(null, address + i) == 0) { + break; + } + } + + return i; + } + + private static int strlen32NT2(long address, int maxLength) { + int i = 0; + + if (4 <= maxLength) { + int misalignment = (int)address & 3; + if (misalignment != 0) { + // Align to 4 bytes + for (int len = 4 - misalignment; i < len; i += 2) { + if (UNSAFE.getShort(null, address + i) == 0) { + return i; + } + } + } + + // Aligned longs for performance + while (i <= maxLength - 4) { + if (mathHasZeroShort(UNSAFE.getInt(null, address + i))) { + break; + } + i += 4; + } + } + + // Tail + for (; i < maxLength; i += 2) { + if (UNSAFE.getShort(null, address + i) == 0) { + break; + } + } + + return i; + } + + /** + * Calculates the length, in bytes, of the null-terminated string that starts at the current position of the specified buffer. Two \0 characters will + * terminate the string. The returned buffer will NOT include the \0 bytes. + * + *

    This method is useful for reading UTF16 encoded text.

    + * + * @param buffer the buffer containing the null-terminated string + * + * @return the string length, in bytes + */ + public static int memLengthNT2(ByteBuffer buffer) { + return memLengthNT2(memAddress(buffer), buffer.remaining()); + } + + /** + * Creates a new direct ByteBuffer that starts at the specified memory address and has capacity equal to the null-terminated string starting at that + * address. A single \0 character will terminate the string. The returned buffer will NOT include the \0 byte. + * + *

    This method is useful for reading ASCII and UTF8 encoded text.

    + * + * @param address the starting memory address + * + * @return the new ByteBuffer + */ + public static ByteBuffer memByteBufferNT1(long address) { + return memByteBuffer(address, memLengthNT1(address, Integer.MAX_VALUE)); + } + + /** + * Creates a new direct ByteBuffer that starts at the specified memory address and has capacity equal to the null-terminated string starting at that + * address, up to a maximum of {@code maxLength} bytes. A single \0 character will terminate the string. The returned buffer will NOT include the \0 byte. + * + *

    This method is useful for reading ASCII and UTF8 encoded text.

    + * + * @param address the starting memory address + * @param maxLength the maximum string length, in bytes + * + * @return the new ByteBuffer + */ + public static ByteBuffer memByteBufferNT1(long address, int maxLength) { + return memByteBuffer(address, memLengthNT1(address, maxLength)); + } + + /** Like {@link #memByteBufferNT1(long) memByteBufferNT1}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static ByteBuffer memByteBufferNT1Safe(long address) { + return address == NULL ? null : memByteBuffer(address, memLengthNT1(address, Integer.MAX_VALUE)); + } + + /** Like {@link #memByteBufferNT1(long, int) memByteBufferNT1}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static ByteBuffer memByteBufferNT1Safe(long address, int maxLength) { + return address == NULL ? null : memByteBuffer(address, memLengthNT1(address, maxLength)); + } + + /** + * Creates a new direct ByteBuffer that starts at the specified memory address and has capacity equal to the null-terminated string starting at that + * address. Two \0 characters will terminate the string. The returned buffer will NOT include the \0 bytes. + * + *

    This method is useful for reading UTF16 encoded text.

    + * + * @param address the starting memory address + * + * @return the new ByteBuffer + */ + public static ByteBuffer memByteBufferNT2(long address) { + return memByteBufferNT2(address, Integer.MAX_VALUE - 1); + } + + /** + * Creates a new direct ByteBuffer that starts at the specified memory address and has capacity equal to the null-terminated string starting at that + * address, up to a maximum of {@code maxLength} bytes. Two \0 characters will terminate the string. The returned buffer will NOT include the \0 bytes. + * + *

    This method is useful for reading UTF16 encoded text.

    + * + * @param address the starting memory address + * + * @return the new ByteBuffer + */ + public static ByteBuffer memByteBufferNT2(long address, int maxLength) { + if (DEBUG) { + if ((maxLength & 1) != 0) { + throw new IllegalArgumentException("The maximum length must be an even number."); + } + } + return memByteBuffer(address, memLengthNT2(address, maxLength)); + } + + /** Like {@link #memByteBufferNT2(long) memByteBufferNT2}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static ByteBuffer memByteBufferNT2Safe(long address) { + return address == NULL ? null : memByteBufferNT2(address, Integer.MAX_VALUE - 1); + } + + /** Like {@link #memByteBufferNT2(long, int) memByteBufferNT2}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static ByteBuffer memByteBufferNT2Safe(long address, int maxLength) { + return address == NULL ? null : memByteBufferNT2(address, maxLength); + } + + /** + * Converts the null-terminated ASCII encoded string at the specified memory address to a {@link String}. + * + * @param address the string memory address + * + * @return the decoded {@link String} + */ + public static String memASCII(long address) { + return memASCII(address, memLengthNT1(address, Integer.MAX_VALUE)); + } + + /** + * Converts the ASCII encoded string at the specified memory address to a {@link String}. + * + * @param address the string memory address + * @param length the number of bytes to decode + * + * @return the decoded {@link String} + */ + @SuppressWarnings("deprecation") + public static String memASCII(long address, int length) { + if (length <= 0) { + return ""; + } + + byte[] ascii = length <= ARRAY_TLC_SIZE ? ARRAY_TLC_BYTE.get() : new byte[length]; + memByteBuffer(address, length).get(ascii, 0, length); + return new String(ascii, 0, 0, length); + } + + /** + * Decodes the bytes with index {@code [position(), position()+remaining()}) in {@code buffer}, as an ASCII string. + * + *

    The current {@code position} and {@code limit} of the specified {@code buffer} are not affected by this operation.

    + * + * @param buffer the {@link ByteBuffer} to decode + * + * @return the decoded {@link String} + */ + public static String memASCII(ByteBuffer buffer) { + return memASCII(memAddress(buffer), buffer.remaining()); + } + + /** Like {@link #memASCII(long) memASCII}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static String memASCIISafe(long address) { + return address == NULL ? null : memASCII(address, memLengthNT1(address, Integer.MAX_VALUE)); + } + + /** Like {@link #memASCII(long, int) memASCII}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static String memASCIISafe(long address, int length) { + return address == NULL ? null : memASCII(address, length); + } + + /** Like {@link #memASCII(ByteBuffer) memASCII}, but returns {@code null} if {@code buffer} is {@code null}. */ + @Nullable + public static String memASCIISafe(@Nullable ByteBuffer buffer) { + return buffer == null ? null : memASCII(memAddress(buffer), buffer.remaining()); + } + + /** + * Decodes the bytes with index {@code [position(), position()+length}) in {@code buffer}, as an ASCII string. + * + *

    The current {@code position} and {@code limit} of the specified {@code buffer} are not affected by this operation.

    + * + * @param buffer the {@link ByteBuffer} to decode + * @param length the number of bytes to decode + * + * @return the decoded {@link String} + */ + public static String memASCII(ByteBuffer buffer, int length) { + return memASCII(memAddress(buffer), length); + } + + /** + * Decodes the bytes with index {@code [offset, offset+length}) in {@code buffer}, as an ASCII string. + * + *

    The current {@code position} and {@code limit} of the specified {@code buffer} are not affected by this operation.

    + * + * @param buffer the {@link ByteBuffer} to decode + * @param length the number of bytes to decode + * @param offset the offset at which to start decoding. + * + * @return the decoded {@link String} + */ + public static String memASCII(ByteBuffer buffer, int length, int offset) { + return memASCII(memAddress(buffer, offset), length); + } + + /** + * Converts the null-terminated UTF-8 encoded string at the specified memory address to a {@link String}. + * + * @param address the string memory address + * + * @return the decoded {@link String} + */ + public static String memUTF8(long address) { + return MultiReleaseTextDecoding.decodeUTF8(address, memLengthNT1(address, Integer.MAX_VALUE)); + } + + /** + * Converts the UTF-8 encoded string at the specified memory address to a {@link String}. + * + * @param address the string memory address + * @param length the number of bytes to decode + * + * @return the decoded {@link String} + */ + public static String memUTF8(long address, int length) { + return MultiReleaseTextDecoding.decodeUTF8(address, length); + } + + /** + * Decodes the bytes with index {@code [position(), position()+remaining()}) in {@code buffer}, as a UTF-8 string. + * + *

    The current {@code position} and {@code limit} of the specified {@code buffer} are not affected by this operation.

    + * + * @param buffer the {@link ByteBuffer} to decode + * + * @return the decoded {@link String} + */ + public static String memUTF8(ByteBuffer buffer) { + return MultiReleaseTextDecoding.decodeUTF8(memAddress(buffer), buffer.remaining()); + } + + /** Like {@link #memUTF8(long) memUTF8}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static String memUTF8Safe(long address) { + return address == NULL ? null : MultiReleaseTextDecoding.decodeUTF8(address, memLengthNT1(address, Integer.MAX_VALUE)); + } + + /** Like {@link #memUTF8(long, int) memUTF8}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static String memUTF8Safe(long address, int length) { + return address == NULL ? null : MultiReleaseTextDecoding.decodeUTF8(address, length); + } + + /** Like {@link #memUTF8(ByteBuffer) memUTF8}, but returns {@code null} if {@code buffer} is {@code null}. */ + @Nullable + public static String memUTF8Safe(@Nullable ByteBuffer buffer) { + return buffer == null ? null : MultiReleaseTextDecoding.decodeUTF8(memAddress(buffer), buffer.remaining()); + } + + /** + * Decodes the bytes with index {@code [position(), position()+length}) in {@code buffer}, as a UTF-8 string. + * + *

    The current {@code position} and {@code limit} of the specified {@code buffer} are not affected by this operation.

    + * + * @param buffer the {@link ByteBuffer} to decode + * @param length the number of bytes to decode + * + * @return the decoded {@link String} + */ + public static String memUTF8(ByteBuffer buffer, int length) { + return MultiReleaseTextDecoding.decodeUTF8(memAddress(buffer), length); + } + + /** + * Decodes the bytes with index {@code [offset, offset+length}) in {@code buffer}, as a UTF-8 string. + * + *

    The current {@code position} and {@code limit} of the specified {@code buffer} are not affected by this operation.

    + * + * @param buffer the {@link ByteBuffer} to decode + * @param length the number of bytes to decode + * @param offset the offset at which to start decoding. + * + * @return the decoded {@link String} + */ + public static String memUTF8(ByteBuffer buffer, int length, int offset) { + return MultiReleaseTextDecoding.decodeUTF8(memAddress(buffer, offset), length); + } + + /** + * Converts the null-terminated UTF-16 encoded string at the specified memory address to a {@link String}. + * + * @param address the string memory address + * + * @return the decoded {@link String} + */ + public static String memUTF16(long address) { + return memUTF16(address, memLengthNT2(address, Integer.MAX_VALUE - 1) >> 1); + } + + /** + * Converts the UTF-16 encoded string at the specified memory address to a {@link String}. + * + * @param address the string memory address + * @param length the number of characters to decode + * + * @return the decoded {@link String} + */ + public static String memUTF16(long address, int length) { + if (length <= 0) { + return ""; + } + + if (DEBUG) { + // The implementation below does no codepoint validation. + int len = length << 1; + byte[] bytes = len <= ARRAY_TLC_SIZE ? ARRAY_TLC_BYTE.get() : new byte[len]; + memByteBuffer(address, len).get(bytes, 0, len); + return new String(bytes, 0, len, UTF16); + } + + char[] chars = length <= ARRAY_TLC_SIZE ? ARRAY_TLC_CHAR.get() : new char[length]; + memCharBuffer(address, length).get(chars, 0, length); + return new String(chars, 0, length); + } + + /** + * Decodes the bytes with index {@code [position(), position()+remaining()}) in {@code buffer}, as a UTF-16 string. + * + *

    The current {@code position} and {@code limit} of the specified {@code buffer} are not affected by this operation.

    + * + * @param buffer the {@link ByteBuffer} to decode + * + * @return the decoded {@link String} + */ + public static String memUTF16(ByteBuffer buffer) { + return memUTF16(memAddress(buffer), buffer.remaining() >> 1); + } + + /** Like {@link #memUTF16(long) memUTF16}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static String memUTF16Safe(long address) { + return address == NULL ? null : memUTF16(address, memLengthNT2(address, Integer.MAX_VALUE - 1) >> 1); + } + + /** Like {@link #memUTF16(long, int) memUTF16}, but returns {@code null} if {@code address} is {@link #NULL}. */ + @Nullable + public static String memUTF16Safe(long address, int length) { + return address == NULL ? null : memUTF16(address, length); + } + + /** Like {@link #memUTF16(ByteBuffer) memUTF16}, but returns {@code null} if {@code buffer} is {@code null}. */ + @Nullable + public static String memUTF16Safe(@Nullable ByteBuffer buffer) { + return buffer == null ? null : memUTF16(memAddress(buffer), buffer.remaining() >> 1); + } + + /** + * Decodes the bytes with index {@code [position(), position()+(length*2)}) in {@code buffer}, as a UTF-16 string. + * + *

    The current {@code position} and {@code limit} of the specified {@code buffer} are not affected by this operation.

    + * + * @param buffer the {@link ByteBuffer} to decode + * @param length the number of characters to decode + * + * @return the decoded {@link String} + */ + public static String memUTF16(ByteBuffer buffer, int length) { + return memUTF16(memAddress(buffer), length); + } + + /** + * Decodes the bytes with index {@code [offset, offset+(length*2)}) in {@code buffer}, as a UTF-16 string. + * + *

    The current {@code position} and {@code limit} of the specified {@code buffer} are not affected by this operation.

    + * + * @param buffer the {@link ByteBuffer} to decode + * @param length the number of characters to decode + * @param offset the offset at which to start decoding, in bytes. + * + * @return the decoded {@link String} + */ + public static String memUTF16(ByteBuffer buffer, int length, int offset) { + return memUTF16(memAddress(buffer, offset), length); + } + + // ------------------------------------------------- + // ------------------------------------------------- + // ------------------------------------------------- + + private static sun.misc.Unsafe getUnsafeInstance() { + Field[] fields = sun.misc.Unsafe.class.getDeclaredFields(); + + /* + Different runtimes use different names for the Unsafe singleton, + so we cannot use .getDeclaredField and we scan instead. For example: + + Oracle: theUnsafe + PERC : m_unsafe_instance + Android: THE_ONE + */ + for (Field field : fields) { + if (!field.getType().equals(sun.misc.Unsafe.class)) { + continue; + } + + int modifiers = field.getModifiers(); + if (!(Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers))) { + continue; + } + + try { + field.setAccessible(true); + return (sun.misc.Unsafe)field.get(null); + } catch (Exception ignored) { + } + break; + } + + throw new UnsupportedOperationException("LWJGL requires sun.misc.Unsafe to be available."); + } + + private static long getFieldOffset(Class containerType, Class fieldType, LongPredicate predicate) { + Class c = containerType; + while (c != Object.class) { + Field[] fields = c.getDeclaredFields(); + for (Field field : fields) { + if (!field.getType().isAssignableFrom(fieldType) || Modifier.isStatic(field.getModifiers()) || field.isSynthetic()) { + continue; + } + + long offset = UNSAFE.objectFieldOffset(field); + if (predicate.test(offset)) { + return offset; + } + } + c = c.getSuperclass(); + } + throw new UnsupportedOperationException("Failed to find field offset in class."); + } + + private static long getFieldOffsetInt(Object container, int value) { + return getFieldOffset(container.getClass(), int.class, offset -> UNSAFE.getInt(container, offset) == value); + } + + private static long getFieldOffsetObject(Object container, Object value) { + return getFieldOffset(container.getClass(), value.getClass(), offset -> UNSAFE.getObject(container, offset) == value); + } + + private static long getAddressOffset() { + long MAGIC_ADDRESS = 0xDEADBEEF8BADF00DL & (BITS32 ? 0xFFFF_FFFFL : 0xFFFF_FFFF_FFFF_FFFFL); + + ByteBuffer bb = Objects.requireNonNull(NewDirectByteBuffer(MAGIC_ADDRESS, 0)); + + return getFieldOffset(bb.getClass(), long.class, offset -> UNSAFE.getLong(bb, offset) == MAGIC_ADDRESS); + } + + private static final int MAGIC_CAPACITY = 0x0D15EA5E; + private static final int MAGIC_POSITION = 0x00FACADE; + + private static long getMarkOffset() { + ByteBuffer bb = Objects.requireNonNull(NewDirectByteBuffer(1L, 0)); + return getFieldOffsetInt(bb, -1); + } + + private static long getPositionOffset() { + ByteBuffer bb = Objects.requireNonNull(NewDirectByteBuffer(-1L, MAGIC_CAPACITY)); + bb.position(MAGIC_POSITION); + return getFieldOffsetInt(bb, MAGIC_POSITION); + } + + private static long getLimitOffset() { + ByteBuffer bb = Objects.requireNonNull(NewDirectByteBuffer(-1L, MAGIC_CAPACITY)); + bb.limit(MAGIC_POSITION); + return getFieldOffsetInt(bb, MAGIC_POSITION); + } + + private static long getCapacityOffset() { + ByteBuffer bb = Objects.requireNonNull(NewDirectByteBuffer(-1L, MAGIC_CAPACITY)); + bb.limit(0); + return getFieldOffsetInt(bb, MAGIC_CAPACITY); + } + + @SuppressWarnings("unchecked") + static T wrap(Class clazz, long address, int capacity) { + T buffer; + try { + buffer = (T)UNSAFE.allocateInstance(clazz); + } catch (InstantiationException e) { + throw new UnsupportedOperationException(e); + } + + UNSAFE.putLong(buffer, ADDRESS, address); + UNSAFE.putInt(buffer, MARK, -1); + UNSAFE.putInt(buffer, LIMIT, capacity); + UNSAFE.putInt(buffer, CAPACITY, capacity); + + return buffer; + } + + static ByteBuffer slice(ByteBuffer source, long address, int capacity) { + ByteBuffer target; + try { + target = (ByteBuffer)UNSAFE.allocateInstance(BUFFER_BYTE); + } catch (InstantiationException e) { + throw new UnsupportedOperationException(e); + } + + UNSAFE.putLong(target, ADDRESS, address); + UNSAFE.putInt(target, MARK, -1); + UNSAFE.putInt(target, LIMIT, capacity); + UNSAFE.putInt(target, CAPACITY, capacity); + + Object attachment = UNSAFE.getObject(source, PARENT_BYTE); + UNSAFE.putObject(target, PARENT_BYTE, attachment == null ? source : attachment); + + return target.order(source.order()); + } + + @SuppressWarnings("unchecked") + static T slice(Class clazz, T source, long address, int capacity, long attachmentOffset) { + T target; + try { + target = (T)UNSAFE.allocateInstance(clazz); + } catch (InstantiationException e) { + throw new UnsupportedOperationException(e); + } + + UNSAFE.putLong(target, ADDRESS, address); + UNSAFE.putInt(target, MARK, -1); + UNSAFE.putInt(target, LIMIT, capacity); + UNSAFE.putInt(target, CAPACITY, capacity); + + UNSAFE.putObject(target, attachmentOffset, UNSAFE.getObject(source, attachmentOffset)); + + return target; + } + + @SuppressWarnings("unchecked") + static T duplicate(Class clazz, T source, long attachmentOffset) { + T target; + try { + target = (T)UNSAFE.allocateInstance(clazz); + } catch (InstantiationException e) { + throw new UnsupportedOperationException(e); + } + + UNSAFE.putLong(target, ADDRESS, UNSAFE.getLong(source, ADDRESS)); + UNSAFE.putInt(target, MARK, UNSAFE.getInt(source, MARK)); + UNSAFE.putInt(target, POSITION, UNSAFE.getInt(source, POSITION)); + UNSAFE.putInt(target, LIMIT, UNSAFE.getInt(source, LIMIT)); + UNSAFE.putInt(target, CAPACITY, UNSAFE.getInt(source, CAPACITY)); + + UNSAFE.putObject(target, attachmentOffset, UNSAFE.getObject(source, attachmentOffset)); + + return target; + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/MultiReleaseMemCopy.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/MultiReleaseMemCopy.java new file mode 100644 index 000000000..f6a759970 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/MultiReleaseMemCopy.java @@ -0,0 +1,33 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.Pointer.*; +import static org.lwjgl.system.libc.LibCString.*; + +final class MultiReleaseMemCopy { + + private MultiReleaseMemCopy() { + } + + static void copy(long src, long dst, long bytes) { + if (bytes <= 160) { + // A custom Java loop is fastest at small sizes, approximately up to 160 bytes. + if (BITS64 && ((src | dst) & 7) == 0) { + // both src and dst are aligned to 8 bytes + memCopyAligned64(src, dst, (int)bytes & 0xFF); + } else { + // Unaligned fallback. Poor performance until Java 16. + UNSAFE.copyMemory(null, src, null, dst, bytes); + } + return; + } + + // Fastest at bigger sizes, when the JNI overhead becomes negligible. + nmemcpy(dst, src, bytes); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/MultiReleaseTextDecoding.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/MultiReleaseTextDecoding.java new file mode 100644 index 000000000..7b8cb4071 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/MultiReleaseTextDecoding.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import java.nio.*; +import java.nio.charset.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * String decoding utilities. + * + *

    On Java 9 different implementations are used that work better with compact strings (JEP 254).

    + */ +final class MultiReleaseTextDecoding { + + private MultiReleaseTextDecoding() { + } + + /** @see MemoryUtil#memUTF8(ByteBuffer, int, int) */ + static String decodeUTF8(long source, int length) { + if (length <= 0) { + return ""; + } + + if (DEBUG) { + // The implementation below does no codepoint validation. + byte[] bytes = length <= ARRAY_TLC_SIZE ? ARRAY_TLC_BYTE.get() : new byte[length]; + memByteBuffer(source, length).get(bytes, 0, length); + return new String(bytes, 0, length, StandardCharsets.UTF_8); + } + + char[] string = length <= ARRAY_TLC_SIZE ? ARRAY_TLC_CHAR.get() : new char[length]; + + int i = 0, position = 0; + + while (position < length) { + char c; + + int b0 = UNSAFE.getByte(null, source + position++) & 0xFF; + if (b0 < 0x80) { + c = (char)b0; + } else { + int b1 = UNSAFE.getByte(null, source + position++) & 0x3F; + if ((b0 & 0xE0) == 0xC0) { + c = (char)(((b0 & 0x1F) << 6) | b1); + } else { + int b2 = UNSAFE.getByte(null, source + position++) & 0x3F; + if ((b0 & 0xF0) == 0xE0) { + c = (char)(((b0 & 0x0F) << 12) | (b1 << 6) | b2); + } else { + int b3 = UNSAFE.getByte(null, source + position++) & 0x3F; + int cp = ((b0 & 0x07) << 18) | (b1 << 12) | (b2 << 6) | b3; + + if (i < length) { + string[i++] = (char)((cp >>> 10) + 0xD7C0); + } + c = (char)((cp & 0x3FF) + 0xDC00); + } + } + } + if (i < length) { + string[i++] = c; + } + } + + return new String(string, 0, Math.min(i, length)); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/NativeResource.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/NativeResource.java new file mode 100644 index 000000000..ae8462bb4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/NativeResource.java @@ -0,0 +1,23 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +/** + * Classes that implement this interface are associated with one or more native resources. These resources must be explicitly freed when a class instance is + * no longer used, by calling the {@link #free} method. + * + *

    This interface extends {@link AutoCloseable}, which means that implementations may be used as resources in try-with-resources statements.

    + */ +public interface NativeResource extends AutoCloseable { + + /** Frees any native resources held by this object. */ + void free(); + + @Override + default void close() { + free(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/NativeType.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/NativeType.java new file mode 100644 index 000000000..f8894cc35 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/NativeType.java @@ -0,0 +1,14 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import java.lang.annotation.*; + +/** Annotates parameter and return types in LWJGL bindings with the C type as defined in the native function. */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER}) +public @interface NativeType { + String value(); +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/NonnullDefault.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/NonnullDefault.java new file mode 100644 index 000000000..7ceef49e3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/NonnullDefault.java @@ -0,0 +1,15 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import javax.annotation.*; +import javax.annotation.meta.*; +import java.lang.annotation.*; + +@Documented +@Nonnull +@TypeQualifierDefault({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface NonnullDefault {} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/Platform.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/Platform.java new file mode 100644 index 000000000..1babac919 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/Platform.java @@ -0,0 +1,172 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import javax.annotation.*; +import java.util.function.*; +import java.util.regex.*; + +import static org.lwjgl.system.APIUtil.*; + +/** The platforms supported by LWJGL. */ +public enum Platform { + + LINUX("Linux", "linux") { + private final Pattern SO = Pattern.compile("(?:^|/)lib\\w+[.]so(?:[.]\\d+)*$"); + + @Override + String mapLibraryName(String name) { + if (SO.matcher(name).find()) { + return name; + } + + return System.mapLibraryName(name); + } + }, + // TODO: Rename to MACOS in LWJGL 4 + MACOSX("macOS", "macos") { + private final Pattern DYLIB = Pattern.compile("(?:^|/)lib\\w+(?:[.]\\d+)*[.]dylib$"); + + @Override + String mapLibraryName(String name) { + if (DYLIB.matcher(name).find()) { + return name; + } + + return System.mapLibraryName(name); + } + }, + WINDOWS("Windows", "windows") { + @Override + String mapLibraryName(String name) { + if (name.endsWith(".dll")) { + return name; + } + + return System.mapLibraryName(name); + } + }; + + /** The architectures supported by LWJGL. */ + public enum Architecture { + X64(true), + X86(false), + ARM64(true), + ARM32(false); + + static final Architecture current; + + final boolean is64Bit; + + static { + String osArch = System.getProperty("os.arch"); + boolean is64Bit = osArch.contains("64") || osArch.startsWith("armv8"); + + current = osArch.startsWith("arm") || osArch.startsWith("aarch64") + ? (is64Bit ? Architecture.ARM64 : Architecture.ARM32) + : (is64Bit ? Architecture.X64 : Architecture.X86); + } + + Architecture(boolean is64Bit) { + this.is64Bit = is64Bit; + } + } + + private static final Platform current; + + private static final Function bundledLibraryNameMapper; + private static final Function bundledLibraryPathMapper; + + static { + String osName = System.getProperty("os.name"); + if (osName.startsWith("Windows")) { + current = WINDOWS; + } else if (osName.startsWith("Linux") || osName.startsWith("FreeBSD") || osName.startsWith("SunOS") || osName.startsWith("Unix")) { + current = LINUX; + } else if (osName.startsWith("Mac OS X") || osName.startsWith("Darwin")) { + current = MACOSX; + } else { + throw new LinkageError("Unknown platform: " + osName); + } + + bundledLibraryNameMapper = getMapper( + Configuration.BUNDLED_LIBRARY_NAME_MAPPER.get("default"), + name -> name, + name -> Architecture.current.is64Bit ? name : name + "32" + ); + bundledLibraryPathMapper = getMapper( + Configuration.BUNDLED_LIBRARY_PATH_MAPPER.get("default"), + name -> current.nativePath + "/" + Architecture.current.name().toLowerCase() + "/" + name, + name -> name.substring(name.lastIndexOf('/')) + ); + } + + private final String name; + private final String nativePath; + + Platform(String name, String nativePath) { + this.name = name; + this.nativePath = nativePath; + } + + /** Returns the platform name. */ + public String getName() { + return name; + } + + abstract String mapLibraryName(String name); + + /** Returns the platform on which the library is running. */ + public static Platform get() { + return current; + } + + /** Returns the architecture on which the library is running. */ + public static Architecture getArchitecture() { + return Architecture.current; + } + + public static String mapLibraryNameBundled(String name) { + return bundledLibraryNameMapper.apply(name); + } + + static String mapLibraryPathBundled(String name) { + return bundledLibraryPathMapper.apply(name); + } + + @SuppressWarnings("unchecked") + private static Function getMapper( + @Nullable Object mapper, + Function defaultMapper, + Function legacyMapper + ) { + if (mapper == null || "default".equals(mapper)) { + return defaultMapper; + } + + if ("legacy".equals(mapper)) { + return legacyMapper; + } + + if (mapper instanceof Function) { + return (Function)mapper; + } + + String className = mapper.toString(); + try { + return (Function)Class + .forName(className) + .getConstructor() + .newInstance(); + } catch (Throwable t) { + if (Checks.DEBUG) { + t.printStackTrace(DEBUG_STREAM); + } + apiLog(String.format("Warning: Failed to instantiate bundled library mapper: %s. Using the default.", className)); + return defaultMapper; + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/Pointer.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/Pointer.java new file mode 100644 index 000000000..2fe10e044 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/Pointer.java @@ -0,0 +1,122 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.*; + +import javax.annotation.*; +import java.nio.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Pointer interface. + * + *

    LWJGL can run on both 32bit and 64bit architectures. Since LWJGL applications deal with native memory directly, this interface provides necessary + * information about the underlying architecture of the running JVM process.

    + * + *

    When interacting with native functions, pointer values are mapped to Java {@code long}. LWJGL automatically converts long values to the correct pointer + * addresses when used in native code. Native functions sometimes require arrays of pointer values; the {@link PointerBuffer} class may be used for that + * purpose. It has an API similar to a {@link LongBuffer} but handles pointer casts automatically.

    + */ +public interface Pointer { + + /** The pointer size in bytes. Will be 4 on a 32bit JVM and 8 on a 64bit one. */ + int POINTER_SIZE = MemoryAccessJNI.getPointerSize(); + + /** The pointer size power-of-two. Will be 2 on a 32bit JVM and 3 on a 64bit one. */ + int POINTER_SHIFT = POINTER_SIZE == 8 ? 3 : 2; + + /** The value of {@code sizeof(long)} for the current platform. */ + int CLONG_SIZE = POINTER_SIZE == 8 && Platform.get() == Platform.WINDOWS ? 4 : POINTER_SIZE; + + /** The value of {@code sizeof(long)} as a power-of-two. */ + int CLONG_SHIFT = CLONG_SIZE == 8 ? 3 : 2; + + /** Will be true on a 32bit JVM. */ + boolean BITS32 = POINTER_SIZE * 8 == 32; + + /** Will be true on a 64bit JVM. */ + boolean BITS64 = POINTER_SIZE * 8 == 64; + + /** + * Returns the raw pointer address as a {@code long} value. + * + * @return the pointer address + */ + long address(); + + /** Default {@link Pointer} implementation. */ + abstract class Default implements Pointer { + + protected static final sun.misc.Unsafe UNSAFE; + + protected static final long ADDRESS; + + protected static final long BUFFER_CONTAINER; + + protected static final long BUFFER_MARK; + protected static final long BUFFER_POSITION; + protected static final long BUFFER_LIMIT; + protected static final long BUFFER_CAPACITY; + + static { + UNSAFE = MemoryUtil.UNSAFE; + + try { + ADDRESS = UNSAFE.objectFieldOffset(Default.class.getDeclaredField("address")); + + BUFFER_CONTAINER = UNSAFE.objectFieldOffset(CustomBuffer.class.getDeclaredField("container")); + + BUFFER_MARK = UNSAFE.objectFieldOffset(CustomBuffer.class.getDeclaredField("mark")); + BUFFER_POSITION = UNSAFE.objectFieldOffset(CustomBuffer.class.getDeclaredField("position")); + BUFFER_LIMIT = UNSAFE.objectFieldOffset(CustomBuffer.class.getDeclaredField("limit")); + BUFFER_CAPACITY = UNSAFE.objectFieldOffset(CustomBuffer.class.getDeclaredField("capacity")); + } catch (Throwable t) { + throw new UnsupportedOperationException(t); + } + } + + // Removed final due to JDK-8139758. TODO: Restore if the fix is backported to JDK 8. + protected long address; + + protected Default(long address) { + if (CHECKS && address == NULL) { + throw new NullPointerException(); + } + this.address = address; + } + + @Override + public long address() { + return address; + } + + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Pointer)) { + return false; + } + + Pointer that = (Pointer)o; + + return address == that.address(); + } + + public int hashCode() { + return (int)(address ^ (address >>> 32)); + } + + @Override + public String toString() { + return String.format("%s pointer [0x%X]", getClass().getSimpleName(), address); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibrary.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibrary.java new file mode 100644 index 000000000..3772eaa7c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibrary.java @@ -0,0 +1,69 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import javax.annotation.*; + +/** A {@link FunctionProvider} implementation that opens a platform-specific shared library and returns functions pointers from it. */ +public interface SharedLibrary extends FunctionProvider, NativeResource, Pointer { + + /** Returns the library name. */ + String getName(); + + /** + * Returns the library path, if available. + * + * @return the library path, or {@code null} if the path is not available. + */ + @Nullable + String getPath(); + + abstract class Default extends Pointer.Default implements SharedLibrary { + + private final String name; + + protected Default(String name, long handle) { + super(handle); + this.name = name; + } + + @Override + public String getName() { + return name; + } + + } + + abstract class Delegate implements SharedLibrary { + + protected final SharedLibrary library; + + protected Delegate(SharedLibrary library) { + this.library = library; + } + + @Override + public String getName() { + return library.getName(); + } + + @Nullable + @Override public String getPath() { + return library.getPath(); + } + + @Override + public long address() { + return library.address(); + } + + @Override + public void free() { + library.free(); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibraryLoader.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibraryLoader.java new file mode 100644 index 000000000..ec1b1ab5c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibraryLoader.java @@ -0,0 +1,360 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.*; + +import javax.annotation.*; +import javax.annotation.concurrent.*; +import java.io.*; +import java.net.*; +import java.nio.channels.*; +import java.nio.file.*; +import java.util.*; +import java.util.concurrent.locks.*; +import java.util.function.*; +import java.util.stream.*; +import java.util.zip.*; + +import static org.lwjgl.system.APIUtil.*; + +/** + * Loads shared libraries and native resources from the classpath. + * + *

    The libraries may be packed in JAR files, in which case they will be extracted to a temporary directory and that directory will be prepended to + * {@link Configuration#LIBRARY_PATH}. + *

    + * + * @author Mario Zechner (https://github.com/badlogic) + * @author Nathan Sweet (https://github.com/NathanSweet) + * @see Configuration#SHARED_LIBRARY_EXTRACT_DIRECTORY + * @see Configuration#SHARED_LIBRARY_EXTRACT_PATH + */ +final class SharedLibraryLoader { + + private static final Lock EXTRACT_PATH_LOCK = new ReentrantLock(); + + @GuardedBy("EXTRACT_PATH_LOCK") + @Nullable + private static Path extractPath; + + private static HashSet extractPaths = new HashSet<>(4); + + private static boolean checkedJDK8195129; + + private SharedLibraryLoader() { + } + + /** + * Extracts the specified shared library or native resource from the classpath to a temporary directory. + * + * @param name the resource name + * @param filename the resource filename + * @param resource the classpath {@link URL} were the resource can be found + * @param load should call {@code System::load} in the context of the appropriate ClassLoader + * + * @return a {@link FileChannel} that has locked the resource file + */ + static FileChannel load(String name, String filename, URL resource, @Nullable Consumer load) { + try { + Path extractedFile; + + EXTRACT_PATH_LOCK.lock(); + try { + if (extractPath != null) { + // This path is already tested and safe to use + extractedFile = extractPath.resolve(filename); + } else { + extractedFile = getExtractPath(filename, resource, load); + + Path parent = extractedFile.getParent(); + // Do not store unless the test for JDK-8195129 has passed. + // This means that in the worst case org.lwjgl.librarypath + // will contain multiple directories. (Windows only) + // ----------------- + // Example scenario: + // ----------------- + // * load lwjgl.dll - already extracted and in classpath (SLL not used) + // * load library with loadNative - extracted to a directory with unicode characters + // * then another with loadSystem - this will hit LoadLibraryA in the JVM, need an ANSI-safe directory. + if (Platform.get() != Platform.WINDOWS || checkedJDK8195129) { + extractPath = parent; + } + initExtractPath(parent); + } + } finally { + EXTRACT_PATH_LOCK.unlock(); + } + + return extract(extractedFile, resource); + } catch (Exception e) { + throw new RuntimeException("\tFailed to extract " + name + " library", e); + } + } + + private static void initExtractPath(Path extractPath) { + if (extractPaths.contains(extractPath)) { + return; + } + extractPaths.add(extractPath); + + String newLibPath = extractPath.toAbsolutePath().toString(); + + // Prepend the path in which the libraries were extracted to org.lwjgl.librarypath + String libPath = Configuration.LIBRARY_PATH.get(); + if (libPath != null && !libPath.isEmpty()) { + newLibPath += File.pathSeparator + libPath; + } + + System.setProperty(Configuration.LIBRARY_PATH.getProperty(), newLibPath); + Configuration.LIBRARY_PATH.set(newLibPath); + } + + /** + * Returns a path to a file that can be written. Tries multiple locations and verifies writing succeeds. + * + * @param filename the resource filename + * + * @return the extracted library + */ + private static Path getExtractPath(String filename, URL resource, @Nullable Consumer load) { + Path root, file; + + String override = Configuration.SHARED_LIBRARY_EXTRACT_PATH.get(); + if (override != null) { + file = (root = Paths.get(override)).resolve(filename); + if (canWrite(root, file, resource, load)) { + return file; + } + apiLogMore("The path " + override + " is not accessible. Trying other paths."); + } + + String version = Version.getVersion().replace(' ', '-'); + String arch = Platform.getArchitecture().name().toLowerCase(); + + // Temp directory with username in path + file = (root = Paths.get(System.getProperty("java.io.tmpdir"))) + .resolve(Paths.get(Configuration.SHARED_LIBRARY_EXTRACT_DIRECTORY.get("lwjgl_" + System.getProperty("user.name").trim()), version, arch, filename)); + if (canWrite(root, file, resource, load)) { + return file; + } + + Path lwjgl_version_filename = Paths.get("." + Configuration.SHARED_LIBRARY_EXTRACT_DIRECTORY.get("lwjgl"), version, arch, filename); + + // Working directory + file = (root = Paths.get("").toAbsolutePath()).resolve(lwjgl_version_filename); + if (canWrite(root, file, resource, load)) { + return file; + } + + // User home + file = (root = Paths.get(System.getProperty("user.home"))).resolve(lwjgl_version_filename); + if (canWrite(root, file, resource, load)) { + return file; + } + + if (Platform.get() == Platform.WINDOWS) { + // C:\Windows\Temp + String env = System.getenv("SystemRoot"); + if (env != null) { + file = (root = Paths.get(env, "Temp")).resolve(lwjgl_version_filename); + if (canWrite(root, file, resource, load)) { + return file; + } + } + + // C:\Temp + env = System.getenv("SystemDrive"); + if (env != null) { + file = (root = Paths.get(env + "/")).resolve(Paths.get("Temp").resolve(lwjgl_version_filename)); + if (canWrite(root, file, resource, load)) { + return file; + } + } + } + + // System provided temp directory (in java.io.tmpdir) + try { + file = Files.createTempDirectory("lwjgl"); + root = file.getParent(); + file = file.resolve(filename); + if (canWrite(root, file, resource, load)) { + return file; + } + } catch (IOException ignored) { + } + + throw new RuntimeException("Failed to find an appropriate directory to extract the native library"); + } + + /** + * Extracts a native library resource if it does not already exist or the CRC does not match. + * + * @param resource the resource to extract + * @param file the extracted file + * + * @return a {@link FileChannel} that has locked the resource + * + * @throws IOException if an IO error occurs + */ + private static FileChannel extract(Path file, URL resource) throws IOException { + if (Files.exists(file)) { + try ( + InputStream source = resource.openStream(); + InputStream target = Files.newInputStream(file) + ) { + if (crc(source) == crc(target)) { + if (Configuration.DEBUG_LOADER.get(false)) { + apiLogMore("Found at: " + file); + } + return lock(file); + } + } + } + + // If file doesn't exist or the CRC doesn't match, extract it to the temp dir. + apiLogMore("Extracting: " + resource.getPath()); + //noinspection FieldAccessNotGuarded (already inside the lock) + if (extractPath == null) { + apiLogMore(" to: " + file); + } + + Files.createDirectories(file.getParent()); + try (InputStream source = resource.openStream()) { + Files.copy(source, file, StandardCopyOption.REPLACE_EXISTING); + } + + return lock(file); + } + + /** + * Locks a file. + * + * @param file the file to lock + */ + private static FileChannel lock(Path file) { + // Wait for other processes (usually antivirus software) to unlock the extracted file + // before attempting to load it. + try { + FileChannel fc = FileChannel.open(file); + + if (fc.tryLock(0L, Long.MAX_VALUE, true) == null) { + if (Configuration.DEBUG_LOADER.get(false)) { + apiLogMore("File is locked by another process, waiting..."); + } + + fc.lock(0L, Long.MAX_VALUE, true); // this will block until the file is locked + } + + // the lock will be released when the channel is closed + return fc; + } catch (Exception e) { + throw new RuntimeException("Failed to lock file.", e); + } + } + + /** + * Returns a CRC of the remaining bytes in a stream. + * + * @param input the stream + * + * @return the CRC + */ + private static long crc(InputStream input) throws IOException { + CRC32 crc = new CRC32(); + + byte[] buffer = new byte[8 * 1024]; + for (int n; (n = input.read(buffer)) != -1; ) { + crc.update(buffer, 0, n); + } + + return crc.getValue(); + } + + /** + * Returns true if the parent directories of the file can be created and the file can be written. + * + * @param file the file to test + * + * @return true if the file is writable + */ + private static boolean canWrite(Path root, Path file, URL resource, @Nullable Consumer load) { + Path testFile; + if (Files.exists(file)) { + if (!Files.isWritable(file)) { + return false; + } + + // Don't overwrite existing file just to check if we can write to directory. + testFile = file.getParent().resolve(".lwjgl.test"); + } else { + try { + Files.createDirectories(file.getParent()); + } catch (IOException ignored) { + return false; + } + testFile = file; + } + + try { + Files.write(testFile, new byte[0]); + Files.delete(testFile); + + if (load != null && Platform.get() == Platform.WINDOWS) { + workaroundJDK8195129(file, resource, load); + } + + return true; + } catch (Throwable ignored) { + if (file == testFile) { + canWriteCleanup(root, file); + } + return false; + } + } + + private static void canWriteCleanup(Path root, Path file) { + try { + // remove any files or directories created by canWrite + Files.deleteIfExists(file); + + // delete empty directories from parent down to root (exclusive) + Path parent = file.getParent(); + while (!Files.isSameFile(parent, root)) { + try (Stream dir = Files.list(parent)) { + if (dir.findAny().isPresent()) { + break; + } + } + Files.delete(parent); + parent = parent.getParent(); + } + } catch (IOException ignored) { + } + } + + private static void workaroundJDK8195129(Path file, URL resource, @Nonnull Consumer load) throws Throwable { + String filepath = file.toAbsolutePath().toString(); + if (filepath.endsWith(".dll")) { + boolean mustCheck = false; + for (int i = 0; i < filepath.length(); i++) { + if (0x80 <= filepath.charAt(i)) { + mustCheck = true; + } + } + if (mustCheck) { + // We have full access, the JVM has locked the file, but System.load can still fail if + // the path contains unicode characters, due to JDK-8195129. Test for this here and + // try other paths if it fails. + try (FileChannel ignored = extract(file, resource)) { + load.accept(file.toAbsolutePath().toString()); + } + } + checkedJDK8195129 = true; + } + } + + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibraryUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibraryUtil.java new file mode 100644 index 000000000..be1113dbc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/SharedLibraryUtil.java @@ -0,0 +1,37 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import javax.annotation.*; +import java.nio.*; + +import static org.lwjgl.system.MemoryUtil.*; + +public final class SharedLibraryUtil { + + private static native int getLibraryPath(long pLib, long sOut, int bufSize); + + @Nullable + public static String getLibraryPath(long pLib) { + int maxLen = 256; + + ByteBuffer buffer = memAlloc(maxLen); + try { + while (true) { + int len = getLibraryPath(pLib, memAddress(buffer), maxLen); + if (len == 0) { + return null; + } + if (len < maxLen) { + return memUTF8(buffer, len - 1); // drop the null-terminator + } + buffer = memRealloc(buffer, maxLen = maxLen * 3 / 2); + } + } finally { + memFree(buffer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/StackWalkUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/StackWalkUtil.java new file mode 100644 index 000000000..cf3be0f3a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/StackWalkUtil.java @@ -0,0 +1,104 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import javax.annotation.*; +import java.util.*; + +/** + * Stack-walking utilities. + * + *

    On Java 9 these methods are implemented using {@code java.lang.StackWalker}, which has much lower overhead.

    + */ +final class StackWalkUtil { + + private StackWalkUtil() { + } + + static StackTraceElement[] stackWalkArray(Object[] a) { + return (StackTraceElement[])a; + } + + static Object stackWalkGetMethod(Class after) { + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + + for (int i = 3; i < stackTrace.length; i++) { + if (!stackTrace[i].getClassName().startsWith(after.getName())) { + return stackTrace[i]; + } + } + + throw new IllegalStateException(); + } + + private static boolean isSameMethod(StackTraceElement a, StackTraceElement b) { + return isSameMethod(a, b, b.getMethodName()); + } + + private static boolean isSameMethod(StackTraceElement a, StackTraceElement b, String methodName) { + return a.getMethodName().equals(methodName) && + a.getClassName().equals(b.getClassName()) && + Objects.equals(a.getFileName(), b.getFileName()); + } + + private static boolean isAutoCloseable(StackTraceElement element, StackTraceElement pushed) { + // Java 9 try-with-resources: synthetic $closeResource + if (isSameMethod(element, pushed, "$closeResource")) { + return true; + } + + // Kotlin T.use: kotlin.AutoCloseable::closeFinally + if ("closeFinally".equals(element.getMethodName()) && "AutoCloseable.kt".equals(element.getFileName())) { + return true; + } + + return false; + } + + @Nullable + static Object stackWalkCheckPop(Class after, Object pushedObj) { + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + + for (int i = 3; i < stackTrace.length; i++) { + StackTraceElement element = stackTrace[i]; + if (element.getClassName().startsWith(after.getName())) { + continue; + } + + StackTraceElement pushed = (StackTraceElement)pushedObj; + if (isSameMethod(element, pushed)) { + return null; + } + + if (isAutoCloseable(element, pushed) && i + 1 < stackTrace.length) { + // Some runtimes use a separate method to call AutoCloseable::close in try-with-resources blocks. + // That method suppresses any exceptions thrown by close if necessary. + // When that happens, the pop is 1 level deeper than expected. + element = stackTrace[i + 1]; + if (isSameMethod(pushed, stackTrace[i + 1])) { + return null; + } + } + + return element; + } + + throw new IllegalStateException(); + } + + static Object[] stackWalkGetTrace() { + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + + int i = 3; + for (; i < stackTrace.length; i++) { + if (!stackTrace[i].getClassName().startsWith("org.lwjgl.system.Memory")) { + break; + } + } + + return Arrays.copyOfRange(stackTrace, i, stackTrace.length); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/Struct.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/Struct.java new file mode 100644 index 000000000..2ff9be283 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/Struct.java @@ -0,0 +1,281 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import javax.annotation.*; +import java.nio.*; +import java.util.*; + +import static java.lang.Math.*; +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Base class of all struct implementations. */ +public abstract class Struct> extends Pointer.Default { + + protected static final int DEFAULT_PACK_ALIGNMENT = Platform.get() == Platform.WINDOWS ? 8 : 0x4000_0000; + protected static final int DEFAULT_ALIGN_AS = 0; + + static { + Library.initialize(); + } + + @SuppressWarnings({"unused", "FieldCanBeLocal"}) + @Nullable + protected ByteBuffer container; + + /** + * Creates a struct instance at the specified address. + * + * @param address the struct memory address + * @param container an optional container buffer, to be referenced strongly by the struct instance. + */ + protected Struct(long address, @Nullable ByteBuffer container) { + super(address); + this.container = container; + } + + /** + * Similar to {@link #Struct(long, ByteBuffer) the constructor}, but returns the exact type of the {@code Struct} subclass. + * + *

    Effectively, every {@code Struct} instance is a factory for more instances of the same type. This is used by {@link StructBuffer}.

    + * + * @param address the struct memory address + * @param container an optional container buffer, to be referenced strongly by the struct instance. + */ + protected abstract SELF create(long address, @Nullable ByteBuffer container); + + /** Returns {@code sizeof(struct)}. */ + public abstract int sizeof(); + + /** Zeroes-out the struct data. */ + public void clear() { + memSet(address(), 0, sizeof()); + } + + /** + * Frees the struct allocation. + * + *

    This method should not be used if the memory backing this struct is not owned by the struct.

    + */ + public void free() { + nmemFree(address()); + } + + /** + * Returns true if the pointer member that corresponds to the specified {@code memberOffset} is {@code NULL}. + * + *

    This is useful to verify that not nullable members of an untrusted struct instance are indeed not {@code NULL}.

    + * + * @param memberOffset the byte offset of the member to query + * + * @return true if the member is {@code NULL} + */ + public boolean isNull(int memberOffset) { + if (DEBUG) { + checkMemberOffset(memberOffset); + } + return memGetAddress(address() + memberOffset) == NULL; + } + + // ---------------- Implementation utilities ---------------- + + private void checkMemberOffset(int memberOffset) { + if (memberOffset < 0 || sizeof() - memberOffset < POINTER_SIZE) { + throw new IllegalArgumentException("Invalid member offset."); + } + } + + protected static ByteBuffer __checkContainer(ByteBuffer container, int sizeof) { + if (CHECKS) { + check(container, sizeof); + } + return container; + } + + private static long getBytes(int elements, int elementSize) { + return (elements & 0xFFFF_FFFFL) * elementSize; + } + + protected static long __checkMalloc(int elements, int elementSize) { + long bytes = (elements & 0xFFFF_FFFFL) * elementSize; + if (DEBUG) { + if (elements < 0) { + throw new IllegalArgumentException("Invalid number of elements"); + } + if (BITS32 && 0xFFFF_FFFFL < bytes) { + throw new IllegalArgumentException("The request allocation is too large"); + } + } + return bytes; + } + + protected static ByteBuffer __create(int elements, int elementSize) { + apiCheckAllocation(elements, getBytes(elements, elementSize), 0x7FFF_FFFFL); + return ByteBuffer.allocateDirect(elements * elementSize).order(ByteOrder.nativeOrder()); + } + + @Nullable + protected static > ByteBuffer __getContainer(T struct) { + return struct.container; + } + + @Nullable + protected static ByteBuffer __getContainer(StructBuffer struct) { + return struct.container; + } + + + /** A functional interface that enables lambda expressions to be passed to the {@link #validate} method. [INTERNAL USE ONLY] */ + @FunctionalInterface + public interface StructValidation { + void validate(long struct); + } + + /** + * Validates each struct contained in the specified struct array. [INTERNAL USE ONLY] + * + * @param array the struct array to validate + * @param count the number of structs in {@code array} + * @param SIZEOF the size of each struct, in bytes + */ + public static void validate(long array, int count, int SIZEOF, StructValidation validation) { + for (int i = 0; i < count; i++) { + validation.validate(array + Integer.toUnsignedLong(i) * SIZEOF); + } + } + + // ---------------- Struct Member Layout ---------------- + + protected static class Member { + final int size; + final int alignment; + final boolean forcedAlignment; + + int offset; + + Member(int size, int alignment, boolean forcedAlignment) { + this.size = size; + this.alignment = alignment; + this.forcedAlignment = forcedAlignment; + } + + public int getSize() { + return size; + } + + public int getAlignment() { + return alignment; + } + + public int getAlignment(int packAlignment) { + return forcedAlignment ? alignment : min(alignment, packAlignment); + } + } + + protected static class Layout extends Member { + final Member[] members; + + Layout(int size, int alignment, boolean forceAlignment, Member[] members) { + super(size, alignment, forceAlignment); + this.members = members; + } + + public int offsetof(int member) { + return members[member].offset; + } + } + + protected static Member __padding(int num, boolean condition) { + return __padding(num, 1, condition); + } + + protected static Member __padding(int num, int size, boolean condition) { + return __member(condition ? num * size : 0, size); + } + + protected static Member __member(int size) { + return __member(size, size); + } + + protected static Member __member(int size, int alignment) { + return __member(size, alignment, false); + } + + protected static Member __member(int size, int alignment, boolean forceAlignment) { + return new Member(size, alignment, forceAlignment); + } + + protected static Member __array(int size, int length) { + return __array(size, size, length); + } + protected static Member __array(int size, int alignment, int length) { + return new Member(size * length, alignment, false); + } + protected static Member __array(int size, int alignment, boolean forceAlignment, int length) { + return new Member(size * length, alignment, forceAlignment); + } + + protected static Layout __union(Member... members) { return __union(DEFAULT_PACK_ALIGNMENT, DEFAULT_ALIGN_AS, members); } + protected static Layout __union(int packAlignment, int alignas, Member... members) { + List union = new ArrayList<>(members.length); + + int size = 0; + int alignment = alignas; + for (Member m : members) { + size = max(size, m.size); + alignment = max(alignment, m.getAlignment(packAlignment)); + + m.offset = 0; + union.add(m); + if (m instanceof Layout) { + addNestedMembers(m, union, 0); + } + } + + return new Layout(size, alignment, alignas != 0, union.toArray(new Member[0])); + } + + protected static Layout __struct(Member... members) { return __struct(DEFAULT_PACK_ALIGNMENT, DEFAULT_ALIGN_AS, members); } + protected static Layout __struct(int packAlignment, int alignas, Member... members) { + List struct = new ArrayList<>(members.length); + + int size = 0; + int alignment = alignas; + for (Member m : members) { + int memberAlignment = m.getAlignment(packAlignment); + + m.offset = align(size, memberAlignment); + + size = m.offset + m.size; + alignment = max(alignment, memberAlignment); + + struct.add(m); + if (m instanceof Layout) { + addNestedMembers(m, struct, m.offset); + } + } + + // tail padding + size = align(size, alignment); + + return new Layout(size, alignment, alignas != 0, struct.toArray(new Member[0])); + } + + private static void addNestedMembers(Member nested, List members, int offset) { + Layout layout = (Layout)nested; + + for (Member m : layout.members) { + m.offset += offset; + members.add(m); + } + } + + private static int align(int offset, int alignment) { + return ((offset - 1) | (alignment - 1)) + 1; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/StructBuffer.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/StructBuffer.java new file mode 100644 index 000000000..3e64ef214 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/StructBuffer.java @@ -0,0 +1,318 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import javax.annotation.*; +import java.nio.*; +import java.util.*; +import java.util.function.*; +import java.util.stream.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Base class of struct custom buffers. */ +public abstract class StructBuffer, SELF extends StructBuffer> extends CustomBuffer implements Iterable { + + protected StructBuffer(ByteBuffer container, int remaining) { + super(memAddress(container), container, -1, 0, remaining, remaining); + } + + protected StructBuffer(long address, @Nullable ByteBuffer container, int mark, int position, int limit, int capacity) { + super(address, container, mark, position, limit, capacity); + } + + @Override + public int sizeof() { + return getElementFactory().sizeof(); + } + + /** + * Relative get method. Reads the struct at this buffer's current position, and then increments the position. + * + *

    The struct instance returned is a view of the buffer at the current position. Changes to this buffer's content will be visible in the struct instance + * and vice versa.

    + * + * @return the struct at the buffer's current position + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public T get() { + T factory = getElementFactory(); + return factory.create(address + Integer.toUnsignedLong(nextGetIndex()) * factory.sizeof(), container); + } + + /** + * Relative get method. Reads the struct data at this buffer's current position into the specified struct, and then increments the position. + * + * @return the struct at the buffer's current position + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public SELF get(T value) { + int sizeof = getElementFactory().sizeof(); + memCopy(address + Integer.toUnsignedLong(nextGetIndex()) * sizeof, value.address(), sizeof); + return self(); + } + + /** + * Relative put method  (optional operation). + * + *

    Writes the specified struct into this buffer at the current position, and then increments the position.

    + * + * @param value the struct to be written + * + * @return This buffer + * + * @throws BufferOverflowException If this buffer's current position is not smaller than its limit + * @throws ReadOnlyBufferException If this buffer is read-only + */ + public SELF put(T value) { + int sizeof = getElementFactory().sizeof(); + memCopy(value.address(), address + Integer.toUnsignedLong(nextPutIndex()) * sizeof, sizeof); + return self(); + } + + /** + * Absolute get method. Reads the struct at the specified index. + * + *

    The struct instance returned is a view of the buffer at the specified position. Changes to this buffer's content will be visible in the struct + * instance and vice versa.

    + * + * @param index the index from which the struct will be read + * + * @return the struct at the specified index + * + * @throws IndexOutOfBoundsException If {@code index} is negative or not smaller than the buffer's limit + */ + public T get(int index) { + T factory = getElementFactory(); + return factory.create(address + Integer.toUnsignedLong(check(index, limit)) * factory.sizeof(), container); + } + + /** + * Absolute get method. Reads the struct data at the specified index into the specified struct. + * + * @param index the index from which the struct will be read + * + * @return the struct at the specified index + * + * @throws IndexOutOfBoundsException If {@code index} is negative or not smaller than the buffer's limit + */ + public SELF get(int index, T value) { + int sizeof = getElementFactory().sizeof(); + memCopy(address + Checks.check(index, limit) * sizeof, value.address(), sizeof); + return self(); + } + + /** + * Absolute put method  (optional operation). + * + *

    Writes the specified struct into this buffer at the specified index.

    + * + * @param index the index at which the struct will be written + * @param value the struct value to be written + * + * @return This buffer + * + * @throws IndexOutOfBoundsException If {@code index} is negative or not smaller than the buffer's limit + * @throws ReadOnlyBufferException If this buffer is read-only + */ + public SELF put(int index, T value) { + int sizeof = getElementFactory().sizeof(); + memCopy(value.address(), address + Checks.check(index, limit) * sizeof, sizeof); + return self(); + } + + /** + * Relative apply method. + * + *

    Passes the struct at the buffer's current position to the specified {@link Consumer}, and then increments the position.

    + * + * @return This buffer + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public SELF apply(Consumer consumer) { + consumer.accept(get()); + return self(); + } + + /** + * Absolute apply method. + * + *

    Passes the struct at the specified position to the specified {@link Consumer}.

    + * + * @param index the index where the {@code consumer} will be applied. + * + * @return This buffer + * + * @throws IndexOutOfBoundsException If {@code index} is negative or not smaller than the buffer's limit + */ + public SELF apply(int index, Consumer consumer) { + consumer.accept(get(index)); + return self(); + } + + // -------------------------------------- + + @Override + public Iterator iterator() { + return new StructIterator<>(address, container, getElementFactory(), position, limit); + } + + // This class is static to avoid capturing the StructBuffer instance. Hotspot trivially marks the instance + // as escaping when this happens, even if the iterator instance is not escaping and scalar replaced. This + // is not a problem on Graal. Also, see JDK-8166840. + private static class StructIterator> implements Iterator { + private long address; + + @Nullable + private ByteBuffer container; + + private T factory; + + private int index; + private int fence; + + StructIterator(long address, @Nullable ByteBuffer container, T factory, int position, int limit) { + this.address = address; + this.container = container; + this.factory = factory; + this.index = position; + this.fence = limit; + } + + @Override public boolean hasNext() { + return index < fence; + } + + @Override public T next() { + if (CHECKS && fence <= index) { + throw new NoSuchElementException(); + } + return factory.create(address + Integer.toUnsignedLong(index++) * factory.sizeof(), container); + } + + @Override public void forEachRemaining(Consumer action) { + Objects.requireNonNull(action); + int i = index; + try { + for (int sizeof = factory.sizeof(); i < fence; i++) { + action.accept(factory.create(address + Integer.toUnsignedLong(i) * sizeof, container)); + } + } finally { + index = i; + } + } + } + + @Override + public void forEach(Consumer action) { + Objects.requireNonNull(action); + T factory = getElementFactory(); + for (int i = position, fence = limit, sizeof = factory.sizeof(); i < fence; i++) { + action.accept(factory.create(address + Integer.toUnsignedLong(i) * sizeof(), container)); + } + } + + @Override + public Spliterator spliterator() { + return new StructSpliterator<>(address, container, getElementFactory(), position, limit); + } + + private static class StructSpliterator> implements Spliterator { + private long address; + + @Nullable + private ByteBuffer container; + + private T factory; + + private int index; + private int fence; + + StructSpliterator(long address, @Nullable ByteBuffer container, T factory, int position, int limit) { + this.address = address; + this.container = container; + this.factory = factory; + this.index = position; + this.fence = limit; + } + + @Override + public boolean tryAdvance(Consumer action) { + Objects.requireNonNull(action); + + if (index < fence) { + action.accept(factory.create(address + Integer.toUnsignedLong(index++) * factory.sizeof(), container)); + return true; + } + + return false; + } + + @Override + @Nullable + public Spliterator trySplit() { + int lo = index, + mid = (lo + fence) >>> 1; + + return lo < mid + ? new StructSpliterator<>(address, container, factory, lo, index = mid) + : null; + } + + @Override + public long estimateSize() { + return fence - index; + } + + @Override + public int characteristics() { + return Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL | Spliterator.SIZED | Spliterator.SUBSIZED; + } + + @Override + public void forEachRemaining(Consumer action) { + Objects.requireNonNull(action); + int i = index; + try { + for (int sizeof = factory.sizeof(); i < fence; i++) { + action.accept(factory.create(address + Integer.toUnsignedLong(i) * sizeof, container)); + } + } finally { + index = i; + } + } + + @Override + public Comparator getComparator() { + throw new IllegalStateException(); + } + } + + /** Returns a sequential {@code Stream} with this struct buffer as its source. */ + public Stream stream() { + return StreamSupport.stream(spliterator(), false); + } + + /** Returns a parallel {@code Stream} with this struct buffer as its source. */ + public Stream parallelStream() { + return StreamSupport.stream(spliterator(), true); + } + + // -------------------------------------- + + protected abstract T getElementFactory(); + + private static int check(int index, int length) { + if (CHECKS && (index < 0 || length <= index)) { + throw new IndexOutOfBoundsException(); + } + return index; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/ThreadLocalUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/ThreadLocalUtil.java new file mode 100644 index 000000000..65d7666d5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/ThreadLocalUtil.java @@ -0,0 +1,236 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system; + +import org.lwjgl.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.Pointer.*; +import static org.lwjgl.system.jni.JNINativeInterface.*; + +/** This class supports bindings with thread-local data. [INTERNAL USE ONLY] */ +public final class ThreadLocalUtil { + + /* + The following applies to GL and GLES only: + + OpenGL contexts may have different capabilities (core versions, supported extensions, deprecated functionality) and different function pointers (usually + in multi-GPU setups). A ThreadLocal is used to store the current capabilities instance for each thread. The thread-local lookup that is required for each + function call hurts JIT code generation. We employ two strategies to eliminate this overhead: + + 1) The first capabilities instance encountered is stored in a static write-once holder. This is optimistically assumed to be compatible with all other (if + any) instances we encounter, which is indeed the case for the vast majority of programs. If an incompatible instance is encountered, there is a fall back + to the thread-local lookup. + + The above applies to array overload methods only. All other methods use the following technique: + + 2) The function pointers of a capabilities instance are stored in an off-heap array, which is then stored in one of the reserved members of the + jniNativeInterface struct. This struct is then injected to the Hotspot native thread that corresponds to the Java thread in which the capabilities instance + was made current. When a JNI method is invoked in that thread, it passes its JNIEnv copy to the JNI function, which can then retrieve the correct function + pointer. + + It works like so: + + typedef struct JNINativeInterface_ { + void *reserved0; + void *reserved1; + void *reserved2; + void *reserved3; + + // JNI function pointers + } jniNativeInterface; + + typedef const jniNativeInterface *JNIEnv; + + // Hotspot C++ class + class JavaThread: public Thread { + ... + JNIEnv _jni_environment; + JNIEnv* jni_environment() { return &_jni_environment; } + .. + } + + The injection works because what we get in the JNI function is not a direct pointer to the struct, but a pointer to the JavaThread field that contains the + pointer to the struct. + + Note that all threads point to the same jniNativeInterface struct. Also note that even though reserved0-3 is public API, the size of the struct is not + known. New Java versions may add new function pointers at the end of the struct. JVMTI's GetJNIFunctionTable function could be used to return a valid copy, + but JVMTI is an optional JVM feature and may not be available (e.g. with AOT compilation). The workaround is to call JNI's GetVersion and assume the struct + has as many function pointers as were available in the corresponding JNI version. + + - On startup, a pointer to the global jniNativeInterface is stored. + - On setCapabilities: + * If necessary, a jniNativeInterface copy is created and injected to the current thread (JavaThread::_jni_environment points to the copy). + * A pointer to the capabilities function pointer array is set to jniNativeInterface::reserved3. + - On setCapabilities(null): + * JavaThread::_jni_environment is reset to the global jniNativeInterface. + * The jniNativeInterface copy is freed. + + The above has the following advantages: + + - Eliminates the thread-local lookup. + - Less bytecode and perfectly clean JITed code. + - Works when different threads have incompatible contexts. + + And the following disadvantages: + + - Depends on Hotspot implementation details. + - Requires custom JNI code for each function. + - (minor) Function pointers are not checked anymore. Calling an unsupported function causes a segfault. + - (minor) JVMTI has the ability to intercept JNI functions with SetJNIFunctionTable. This interacts badly with the jniNativeInterface copies, but it should + be easy to workaround (attaching the agent at startup, making sure no contexts are current when the agent is attached, clearing and setting again the + capabilities instance). + + Since 3.3.1: the JNIEnv copies are now also used for storing/retrieving the thread-local errno/LastError values. + */ + + /** The global JNIEnv. */ + private static final long JNI_NATIVE_INTERFACE = memGetAddress(getThreadJNIEnv()); + + /** The number of pointers in the JNIEnv struct. */ + private static final int JNI_NATIVE_INTERFACE_FUNCTION_COUNT; + + /** A function to delegate to when an unsupported function is called. */ + private static final long FUNCTION_MISSING_ABORT = getFunctionMissingAbort(); + + /** + * An array filled with {@link #FUNCTION_MISSING_ABORT}. + * + *

    The array size depends on whether OpenGL or OpenGL ES is used.

    + */ + private static long FUNCTION_MISSING_ABORT_TABLE = NULL; + + /** The offset in JNIEnv at which to store the pointer to the capabilities array. */ + private static final int CAPABILITIES_OFFSET = 3 * POINTER_SIZE; + + static { + int JNI_VERSION = GetVersion(); + + int reservedCount; + switch (JNI_VERSION) { + case JNI_VERSION_1_1: + reservedCount = 12; + break; + default: + reservedCount = 4; + } + + int jniCallCount; + switch (JNI_VERSION) { + case JNI_VERSION_1_1: + jniCallCount = 208; + break; + case JNI_VERSION_1_2: + jniCallCount = 225; + break; + case JNI_VERSION_1_4: + jniCallCount = 228; + break; + case JNI_VERSION_1_6: + case JNI_VERSION_1_8: + jniCallCount = 229; + break; + case JNI_VERSION_9: + case JNI_VERSION_10: + jniCallCount = 230; + break; + case JNI_VERSION_19: + case JNI_VERSION_20: + jniCallCount = 231; + break; + case JNI_VERSION_21: + jniCallCount = 232; + break; + default: + jniCallCount = 232; + DEBUG_STREAM + .println("[LWJGL] [ThreadLocalUtil] Unsupported JNI version detected, this may result in a crash. Please inform LWJGL developers."); + } + JNI_NATIVE_INTERFACE_FUNCTION_COUNT = reservedCount + Configuration.JNI_NATIVE_INTERFACE_FUNCTION_COUNT.get(jniCallCount); + } + + private ThreadLocalUtil() { + } + + private static native long getThreadJNIEnv(); + + private static native long getFunctionMissingAbort(); + + private static native long nsetupEnvData(int functionCount); + public static long setupEnvData() { + return nsetupEnvData(JNI_NATIVE_INTERFACE_FUNCTION_COUNT); + } + + public static void setCapabilities(long capabilities) { + // Get thread's JNIEnv + long env_pp = getThreadJNIEnv(); + long env_p = memGetAddress(env_pp); + + if (capabilities == NULL) { + if (env_p != JNI_NATIVE_INTERFACE) { + memPutAddress(env_p + CAPABILITIES_OFFSET, FUNCTION_MISSING_ABORT_TABLE); + } + } else { + if (env_p == JNI_NATIVE_INTERFACE) { + setupEnvData(); + env_p = memGetAddress(env_pp); + } + memPutAddress(env_p + CAPABILITIES_OFFSET, capabilities); + } + } + + // Ensures FUNCTION_MISSING_ABORT will be called even if no context is current, + public static void setFunctionMissingAddresses(int functionCount) { + // OpenJDK: NULL + // GraalVM Native Image: pointer to UnimplementedWithJNIEnvArgument function (see #875) + long RESERVED0_NULL = memGetAddress(JNI_NATIVE_INTERFACE); + + long ptr = JNI_NATIVE_INTERFACE + CAPABILITIES_OFFSET; + + long currentTable = memGetAddress(ptr); + if (functionCount == 0) { + if (currentTable != RESERVED0_NULL) { + FUNCTION_MISSING_ABORT_TABLE = NULL; + getAllocator().free(currentTable); + memPutAddress(ptr, NULL); + } + } else { + if (currentTable != RESERVED0_NULL) { + throw new IllegalStateException("setFunctionMissingAddresses has been called already"); + } + if (currentTable != NULL) { + // silently abort on Native Image, the global JNIEnv object lives in read-only memory by default. (see #875) + return; + } + + FUNCTION_MISSING_ABORT_TABLE = getAllocator().malloc(Integer.toUnsignedLong(functionCount) * POINTER_SIZE); + for (int i = 0; i < functionCount; i++) { + memPutAddress(FUNCTION_MISSING_ABORT_TABLE + Integer.toUnsignedLong(i) * POINTER_SIZE, FUNCTION_MISSING_ABORT); + } + + memPutAddress(ptr, FUNCTION_MISSING_ABORT_TABLE); + } + } + + public static PointerBuffer setupAddressBuffer(PointerBuffer addresses) { + for (int i = addresses.position(); i < addresses.limit(); i++) { + if (addresses.get(i) == NULL) { + addresses.put(i, FUNCTION_MISSING_ABORT); + } + } + return addresses; + } + + public static boolean areCapabilitiesDifferent(PointerBuffer ref, PointerBuffer caps) { + for (int i = 0; i < ref.remaining(); i++) { + if (ref.get(i) != caps.get(i) && caps.get(i) != NULL) { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/fcl/DynamicLinkLoader.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/fcl/DynamicLinkLoader.java new file mode 100644 index 000000000..718c0c209 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/fcl/DynamicLinkLoader.java @@ -0,0 +1,168 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.fcl; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to <dlfcn.h>. */ +public class DynamicLinkLoader { + + static { Library.initialize(); } + + /** The {@code mode} argument to {@link #dlopen} contains one of the following. */ + public static final int + RTLD_LAZY = 0x1, + RTLD_NOW = 0x2, + RTLD_BINDING_MASK = 0x3, + RTLD_NOLOAD = 0x4, + RTLD_DEEPBIND = 0x8; + + /** + * If the following bit is set in the {@code mode} argument to {@link #dlopen}, the symbols of the loaded object and its dependencies are made visible as + * if the object were linked directly into the program. + */ + public static final int RTLD_GLOBAL = 0x100; + + /** + * Unix98 demands the following flag which is the inverse to {@link #RTLD_GLOBAL}. The implementation does this by default and so we can define the value + * to zero. + */ + public static final int RTLD_LOCAL = 0; + + /** Do not delete object when closed. */ + public static final int RTLD_NODELETE = 0x1000; + + protected DynamicLinkLoader() { + throw new UnsupportedOperationException(); + } + + // --- [ dlopen ] --- + + /** Unsafe version of: {@link #dlopen} */ + public static native long ndlopen(long filename, int mode); + + /** + * Loads the dynamic library file named by the null-terminated string {@code filename} and returns an opaque "handle" for the dynamic library. If + * {@code filename} is {@code NULL}, then the returned handle is for the main program. + * + * @param filename the name of the dynamic library to open, or {@code NULL} + * @param mode a bitfield. One or more of:
    {@link #RTLD_LAZY}{@link #RTLD_NOW}{@link #RTLD_BINDING_MASK}{@link #RTLD_NOLOAD}{@link #RTLD_DEEPBIND}{@link #RTLD_GLOBAL}
    {@link #RTLD_LOCAL}{@link #RTLD_NODELETE}
    + */ + @NativeType("void *") + public static long dlopen(@Nullable @NativeType("char const *") ByteBuffer filename, int mode) { + if (CHECKS) { + checkNT1Safe(filename); + } + return ndlopen(memAddressSafe(filename), mode); + } + + /** + * Loads the dynamic library file named by the null-terminated string {@code filename} and returns an opaque "handle" for the dynamic library. If + * {@code filename} is {@code NULL}, then the returned handle is for the main program. + * + * @param filename the name of the dynamic library to open, or {@code NULL} + * @param mode a bitfield. One or more of:
    {@link #RTLD_LAZY}{@link #RTLD_NOW}{@link #RTLD_BINDING_MASK}{@link #RTLD_NOLOAD}{@link #RTLD_DEEPBIND}{@link #RTLD_GLOBAL}
    {@link #RTLD_LOCAL}{@link #RTLD_NODELETE}
    + */ + @NativeType("void *") + public static long dlopen(@Nullable @NativeType("char const *") CharSequence filename, int mode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(filename, true); + long filenameEncoded = filename == null ? NULL : stack.getPointerAddress(); + return ndlopen(filenameEncoded, mode); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ dlerror ] --- + + /** Unsafe version of: {@link #dlerror} */ + public static native long ndlerror(); + + /** + * Returns a human readable string describing the most recent error that occurred from {@link #dlopen}, {@link #dlsym} or {@link #dlclose} since + * the last call to {@code dlerror()}. It returns {@code NULL} if no errors have occurred since initialization or since it was last called. + */ + @Nullable + @NativeType("char *") + public static String dlerror() { + long __result = ndlerror(); + return memUTF8Safe(__result); + } + + // --- [ dlsym ] --- + + /** Unsafe version of: {@link #dlsym} */ + public static native long ndlsym(long handle, long name); + + /** + * Takes a "handle" of a dynamic library returned by {@link #dlopen} and the null-terminated symbol name, returning the address where that symbol is loaded + * into memory. If the symbol is not found, in the specified library or any of the libraries that were automatically loaded by {@link #dlopen} when that + * library was loaded, {@code dlsym()} returns {@code NULL}. + * + * @param handle the dynamic library handle + * @param name the symbol name + */ + @NativeType("void *") + public static long dlsym(@NativeType("void *") long handle, @NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + check(handle); + checkNT1(name); + } + return ndlsym(handle, memAddress(name)); + } + + /** + * Takes a "handle" of a dynamic library returned by {@link #dlopen} and the null-terminated symbol name, returning the address where that symbol is loaded + * into memory. If the symbol is not found, in the specified library or any of the libraries that were automatically loaded by {@link #dlopen} when that + * library was loaded, {@code dlsym()} returns {@code NULL}. + * + * @param handle the dynamic library handle + * @param name the symbol name + */ + @NativeType("void *") + public static long dlsym(@NativeType("void *") long handle, @NativeType("char const *") CharSequence name) { + if (CHECKS) { + check(handle); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return ndlsym(handle, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ dlclose ] --- + + /** Unsafe version of: {@link #dlclose} */ + public static native int ndlclose(long handle); + + /** + * Decrements the reference count on the dynamic library handle handle. If the reference count drops to zero and no other loaded libraries use symbols in + * it, then the dynamic library is unloaded. + * + * @param handle the dynamic library to close + */ + public static int dlclose(@NativeType("void *") long handle) { + if (CHECKS) { + check(handle); + } + return ndlclose(handle); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/fcl/FCLLibrary.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/fcl/FCLLibrary.java new file mode 100644 index 000000000..503a270e7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/fcl/FCLLibrary.java @@ -0,0 +1,54 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system.fcl; + +import org.lwjgl.system.*; + +import javax.annotation.*; +import java.nio.*; + +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.fcl.DynamicLinkLoader.*; + +/** Implements a {@link SharedLibrary} on the Linux OS. */ +public class FCLLibrary extends SharedLibrary.Default { + + public FCLLibrary(String name) { + this(name, loadLibrary(name)); + } + + public FCLLibrary(String name, long handle) { + super(name, handle); + } + + private static long loadLibrary(String name) { + long handle; + try (MemoryStack stack = stackPush()) { + handle = dlopen(stack.UTF8(name), RTLD_LAZY | RTLD_LOCAL); + } + if (handle == NULL) { + throw new UnsatisfiedLinkError("Failed to dynamically load library: " + name + "(error = " + dlerror() + ")"); + } + return handle; + } + + @Nullable + @Override + public String getPath() { + return SharedLibraryUtil.getLibraryPath(address()); + } + + @Override + public long getFunctionAddress(ByteBuffer functionName) { + return dlsym(address(), functionName); + } + + @Override + public void free() { + dlclose(address()); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentAlloc.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentAlloc.java new file mode 100644 index 000000000..34c9be2dd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentAlloc.java @@ -0,0 +1,81 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *new_addr,
    + *     size_t size,
    + *     size_t alignment,
    + *     bool *zero,
    + *     bool *commit,
    + *     unsigned int arena_ind
    + * )
    + */ +public abstract class ExtentAlloc extends Callback implements ExtentAllocI { + + /** + * Creates a {@code ExtentAlloc} instance from the specified function pointer. + * + * @return the new {@code ExtentAlloc} + */ + public static ExtentAlloc create(long functionPointer) { + ExtentAllocI instance = Callback.get(functionPointer); + return instance instanceof ExtentAlloc + ? (ExtentAlloc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static ExtentAlloc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code ExtentAlloc} instance that delegates to the specified {@code ExtentAllocI} instance. */ + public static ExtentAlloc create(ExtentAllocI instance) { + return instance instanceof ExtentAlloc + ? (ExtentAlloc)instance + : new Container(instance.address(), instance); + } + + protected ExtentAlloc() { + super(CIF); + } + + ExtentAlloc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends ExtentAlloc { + + private final ExtentAllocI delegate; + + Container(long functionPointer, ExtentAllocI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public long invoke(long extent_hooks, long new_addr, long size, long alignment, long zero, long commit, int arena_ind) { + return delegate.invoke(extent_hooks, new_addr, size, alignment, zero, commit, arena_ind); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentAllocI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentAllocI.java new file mode 100644 index 000000000..dd498388d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentAllocI.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *new_addr,
    + *     size_t size,
    + *     size_t alignment,
    + *     bool *zero,
    + *     bool *commit,
    + *     unsigned int arena_ind
    + * )
    + */ +@FunctionalInterface +@NativeType("extent_alloc_t") +public interface ExtentAllocI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_pointer, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + long __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 4 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 5 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 6 * POINTER_SIZE)) + ); + apiClosureRetP(ret, __result); + } + + /** + * Extent allocation hook. + * + *

    An extent allocation function conforms to the {@code extent_alloc_t} type and upon success returns a pointer to {@code size} bytes of mapped memory on + * behalf of arena {@code arena_ind} such that the extent's base address is a multiple of {@code alignment}, as well as setting {@code *zero} to indicate + * whether the extent is zeroed and {@code *commit} to indicate whether the extent is committed. Upon error the function returns {@code NULL} and leaves + * {@code *zero} and {@code *commit} unmodified. The {@code size} parameter is always a multiple of the page size. The {@code alignment} parameter is always a + * power of two at least as large as the page size. Zeroing is mandatory if {@code *zero} is true upon function entry. Committing is mandatory if + * {@code *commit} is true upon function entry. If {@code new_addr} is not {@code NULL}, the returned pointer must be {@code new_addr} on success or {@code NULL} on error. + * Committed memory may be committed in absolute terms as on a system that does not overcommit, or in implicit terms as on a system that overcommits and + * satisfies physical memory needs on demand via soft page faults. Note that replacing the default extent allocation function makes the arena's + * {@code arena.i.dss} setting irrelevant.

    + */ + @NativeType("void *") long invoke(@NativeType("extent_hooks_t *") long extent_hooks, @NativeType("void *") long new_addr, @NativeType("size_t") long size, @NativeType("size_t") long alignment, @NativeType("bool *") long zero, @NativeType("bool *") long commit, @NativeType("unsigned int") int arena_ind); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentCommit.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentCommit.java new file mode 100644 index 000000000..2c79195f5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentCommit.java @@ -0,0 +1,80 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     size_t offset,
    + *     size_t length,
    + *     unsigned int arena_ind
    + * )
    + */ +public abstract class ExtentCommit extends Callback implements ExtentCommitI { + + /** + * Creates a {@code ExtentCommit} instance from the specified function pointer. + * + * @return the new {@code ExtentCommit} + */ + public static ExtentCommit create(long functionPointer) { + ExtentCommitI instance = Callback.get(functionPointer); + return instance instanceof ExtentCommit + ? (ExtentCommit)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static ExtentCommit createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code ExtentCommit} instance that delegates to the specified {@code ExtentCommitI} instance. */ + public static ExtentCommit create(ExtentCommitI instance) { + return instance instanceof ExtentCommit + ? (ExtentCommit)instance + : new Container(instance.address(), instance); + } + + protected ExtentCommit() { + super(CIF); + } + + ExtentCommit(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends ExtentCommit { + + private final ExtentCommitI delegate; + + Container(long functionPointer, ExtentCommitI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public boolean invoke(long extent_hooks, long addr, long size, long offset, long length, int arena_ind) { + return delegate.invoke(extent_hooks, addr, size, offset, length, arena_ind); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentCommitI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentCommitI.java new file mode 100644 index 000000000..4a44e0985 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentCommitI.java @@ -0,0 +1,67 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     size_t offset,
    + *     size_t length,
    + *     unsigned int arena_ind
    + * )
    + */ +@FunctionalInterface +@NativeType("extent_commit_t") +public interface ExtentCommitI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_uint8, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + boolean __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 4 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 5 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** + * Extent commit hook. + * + *

    An extent commit function conforms to the {@code extent_commit_t} type and commits zeroed physical memory to back pages within an extent at given + * {@code addr} and {@code size} at {@code offset} bytes, extending for {@code length} on behalf of arena {@code arena_ind}, returning false upon success. + * Committed memory may be committed in absolute terms as on a system that does not overcommit, or in implicit terms as on a system that overcommits and + * satisfies physical memory needs on demand via soft page faults. If the function returns true, this indicates insufficient physical memory to satisfy the + * request.

    + */ + @NativeType("bool") boolean invoke(@NativeType("extent_hooks_t *") long extent_hooks, @NativeType("void *") long addr, @NativeType("size_t") long size, @NativeType("size_t") long offset, @NativeType("size_t") long length, @NativeType("unsigned int") int arena_ind); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDalloc.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDalloc.java new file mode 100644 index 000000000..db13881ad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDalloc.java @@ -0,0 +1,79 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     bool committed,
    + *     unsigned int arena_ind
    + * )
    + */ +public abstract class ExtentDalloc extends Callback implements ExtentDallocI { + + /** + * Creates a {@code ExtentDalloc} instance from the specified function pointer. + * + * @return the new {@code ExtentDalloc} + */ + public static ExtentDalloc create(long functionPointer) { + ExtentDallocI instance = Callback.get(functionPointer); + return instance instanceof ExtentDalloc + ? (ExtentDalloc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static ExtentDalloc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code ExtentDalloc} instance that delegates to the specified {@code ExtentDallocI} instance. */ + public static ExtentDalloc create(ExtentDallocI instance) { + return instance instanceof ExtentDalloc + ? (ExtentDalloc)instance + : new Container(instance.address(), instance); + } + + protected ExtentDalloc() { + super(CIF); + } + + ExtentDalloc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends ExtentDalloc { + + private final ExtentDallocI delegate; + + Container(long functionPointer, ExtentDallocI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public boolean invoke(long extent_hooks, long addr, long size, boolean committed, int arena_ind) { + return delegate.invoke(extent_hooks, addr, size, committed, arena_ind); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDallocI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDallocI.java new file mode 100644 index 000000000..6b2b7ac9f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDallocI.java @@ -0,0 +1,64 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     bool committed,
    + *     unsigned int arena_ind
    + * )
    + */ +@FunctionalInterface +@NativeType("extent_dalloc_t") +public interface ExtentDallocI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_uint8, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_uint8, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + boolean __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetByte(memGetAddress(args + 3 * POINTER_SIZE)) != 0, + memGetInt(memGetAddress(args + 4 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** + * Extent deallocation hook. + * + *

    An extent deallocation function conforms to the {@code extent_dalloc_t} type and deallocates an extent at given {@code addr} and {@code size} with + * {@code committed}/decommited memory as indicated, on behalf of arena {@code arena_ind}, returning false upon success. If the function returns true, this + * indicates opt-out from deallocation; the virtual memory mapping associated with the extent remains mapped, in the same commit state, and available for + * future use, in which case it will be automatically retained for later reuse.

    + */ + @NativeType("bool") boolean invoke(@NativeType("extent_hooks_t *") long extent_hooks, @NativeType("void *") long addr, @NativeType("size_t") long size, @NativeType("bool") boolean committed, @NativeType("unsigned int") int arena_ind); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDecommit.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDecommit.java new file mode 100644 index 000000000..bdc49b307 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDecommit.java @@ -0,0 +1,80 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     size_t offset,
    + *     size_t length,
    + *     unsigned int arena_ind
    + * )
    + */ +public abstract class ExtentDecommit extends Callback implements ExtentDecommitI { + + /** + * Creates a {@code ExtentDecommit} instance from the specified function pointer. + * + * @return the new {@code ExtentDecommit} + */ + public static ExtentDecommit create(long functionPointer) { + ExtentDecommitI instance = Callback.get(functionPointer); + return instance instanceof ExtentDecommit + ? (ExtentDecommit)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static ExtentDecommit createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code ExtentDecommit} instance that delegates to the specified {@code ExtentDecommitI} instance. */ + public static ExtentDecommit create(ExtentDecommitI instance) { + return instance instanceof ExtentDecommit + ? (ExtentDecommit)instance + : new Container(instance.address(), instance); + } + + protected ExtentDecommit() { + super(CIF); + } + + ExtentDecommit(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends ExtentDecommit { + + private final ExtentDecommitI delegate; + + Container(long functionPointer, ExtentDecommitI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public boolean invoke(long extent_hooks, long addr, long size, long offset, long length, int arena_ind) { + return delegate.invoke(extent_hooks, addr, size, offset, length, arena_ind); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDecommitI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDecommitI.java new file mode 100644 index 000000000..b950f757c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDecommitI.java @@ -0,0 +1,66 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     size_t offset,
    + *     size_t length,
    + *     unsigned int arena_ind
    + * )
    + */ +@FunctionalInterface +@NativeType("extent_decommit_t") +public interface ExtentDecommitI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_uint8, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + boolean __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 4 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 5 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** + * Extent decommit hook. + * + *

    An extent decommit function conforms to the {@code extent_decommit_t} type and decommits any physical memory that is backing pages within an extent at + * given {@code addr} and {@code size} at {@code offset} bytes, extending for {@code length} on behalf of arena {@code arena_ind}, returning false upon + * success, in which case the pages will be committed via the extent commit function before being reused. If the function returns true, this indicates + * opt-out from decommit; the memory remains committed and available for future use, in which case it will be automatically retained for later reuse.

    + */ + @NativeType("bool") boolean invoke(@NativeType("extent_hooks_t *") long extent_hooks, @NativeType("void *") long addr, @NativeType("size_t") long size, @NativeType("size_t") long offset, @NativeType("size_t") long length, @NativeType("unsigned int") int arena_ind); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDestroy.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDestroy.java new file mode 100644 index 000000000..69f7cd012 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDestroy.java @@ -0,0 +1,79 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     bool committed,
    + *     unsigned int arena_ind
    + * )
    + */ +public abstract class ExtentDestroy extends Callback implements ExtentDestroyI { + + /** + * Creates a {@code ExtentDestroy} instance from the specified function pointer. + * + * @return the new {@code ExtentDestroy} + */ + public static ExtentDestroy create(long functionPointer) { + ExtentDestroyI instance = Callback.get(functionPointer); + return instance instanceof ExtentDestroy + ? (ExtentDestroy)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static ExtentDestroy createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code ExtentDestroy} instance that delegates to the specified {@code ExtentDestroyI} instance. */ + public static ExtentDestroy create(ExtentDestroyI instance) { + return instance instanceof ExtentDestroy + ? (ExtentDestroy)instance + : new Container(instance.address(), instance); + } + + protected ExtentDestroy() { + super(CIF); + } + + ExtentDestroy(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends ExtentDestroy { + + private final ExtentDestroyI delegate; + + Container(long functionPointer, ExtentDestroyI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public boolean invoke(long extent_hooks, long addr, long size, boolean committed, int arena_ind) { + return delegate.invoke(extent_hooks, addr, size, committed, arena_ind); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDestroyI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDestroyI.java new file mode 100644 index 000000000..6dd0c5a96 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentDestroyI.java @@ -0,0 +1,63 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     bool committed,
    + *     unsigned int arena_ind
    + * )
    + */ +@FunctionalInterface +@NativeType("extent_destroy_t") +public interface ExtentDestroyI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_uint8, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_uint8, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + boolean __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetByte(memGetAddress(args + 3 * POINTER_SIZE)) != 0, + memGetInt(memGetAddress(args + 4 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** + * Extent destruction hook. + * + *

    An extent destruction function conforms to the {@code extent_destroy_t} type and unconditionally destroys an extent at given {@code addr} and {@code size} + * with {@code committed}/decommited memory as indicated, on behalf of arena {@code arena_ind}. This function may be called to destroy retained extents during + * arena destruction (see {@code arena.i.destroy}).

    + */ + @NativeType("bool") boolean invoke(@NativeType("extent_hooks_t *") long extent_hooks, @NativeType("void *") long addr, @NativeType("size_t") long size, @NativeType("bool") boolean committed, @NativeType("unsigned int") int arena_ind); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentHooks.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentHooks.java new file mode 100644 index 000000000..781622a10 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentHooks.java @@ -0,0 +1,312 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * The {@code extent_hooks_t} structure comprises function pointers which are described individually below. jemalloc uses these functions to manage extent + * lifetime, which starts off with allocation of mapped committed memory, in the simplest case followed by deallocation. However, there are performance + * and platform reasons to retain extents for later reuse. Cleanup attempts cascade from deallocation to decommit to forced purging to lazy purging, which + * gives the extent management functions opportunities to reject the most permanent cleanup operations in favor of less permanent (and often less costly) + * operations. All operations except allocation can be universally opted out of by setting the hook pointers to {@code NULL}, or selectively opted out of by + * returning failure. + * + *

    Layout

    + * + *
    
    + * struct extent_hooks_t {
    + *     {@link ExtentAllocI extent_alloc_t} {@link #alloc};
    + *     {@link ExtentDallocI extent_dalloc_t} {@link #dalloc};
    + *     {@link ExtentDestroyI extent_destroy_t} {@link #destroy};
    + *     {@link ExtentCommitI extent_commit_t} {@link #commit};
    + *     {@link ExtentDecommitI extent_decommit_t} {@link #decommit};
    + *     {@link ExtentPurgeI extent_purge_t} {@link #purge_lazy};
    + *     {@link ExtentPurgeI extent_purge_t} {@link #purge_forced};
    + *     {@link ExtentSplitI extent_split_t} {@link #split};
    + *     {@link ExtentMergeI extent_merge_t} {@link #merge};
    + * }
    + */ +@NativeType("struct extent_hooks_t") +public class ExtentHooks extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ALLOC, + DALLOC, + DESTROY, + COMMIT, + DECOMMIT, + PURGE_LAZY, + PURGE_FORCED, + SPLIT, + MERGE; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + ALLOC = layout.offsetof(0); + DALLOC = layout.offsetof(1); + DESTROY = layout.offsetof(2); + COMMIT = layout.offsetof(3); + DECOMMIT = layout.offsetof(4); + PURGE_LAZY = layout.offsetof(5); + PURGE_FORCED = layout.offsetof(6); + SPLIT = layout.offsetof(7); + MERGE = layout.offsetof(8); + } + + protected ExtentHooks(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected ExtentHooks create(long address, @Nullable ByteBuffer container) { + return new ExtentHooks(address, container); + } + + /** + * Creates a {@code ExtentHooks} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public ExtentHooks(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the extent allocation hook */ + @NativeType("extent_alloc_t") + public ExtentAlloc alloc() { return nalloc(address()); } + /** the extent deallocation hook */ + @Nullable + @NativeType("extent_dalloc_t") + public ExtentDalloc dalloc() { return ndalloc(address()); } + /** the extent destruction hook */ + @Nullable + @NativeType("extent_destroy_t") + public ExtentDestroy destroy() { return ndestroy(address()); } + /** the extent commit hook */ + @Nullable + @NativeType("extent_commit_t") + public ExtentCommit commit() { return ncommit(address()); } + /** the extent decommit hook */ + @Nullable + @NativeType("extent_decommit_t") + public ExtentDecommit decommit() { return ndecommit(address()); } + /** the extent lazy purge hook */ + @Nullable + @NativeType("extent_purge_t") + public ExtentPurge purge_lazy() { return npurge_lazy(address()); } + /** the extent forced purge hook */ + @Nullable + @NativeType("extent_purge_t") + public ExtentPurge purge_forced() { return npurge_forced(address()); } + /** the extent split hook */ + @Nullable + @NativeType("extent_split_t") + public ExtentSplit split() { return nsplit(address()); } + /** the extent merge hook */ + @Nullable + @NativeType("extent_merge_t") + public ExtentMerge merge() { return nmerge(address()); } + + /** Sets the specified value to the {@link #alloc} field. */ + public ExtentHooks alloc(@NativeType("extent_alloc_t") ExtentAllocI value) { nalloc(address(), value); return this; } + /** Sets the specified value to the {@link #dalloc} field. */ + public ExtentHooks dalloc(@Nullable @NativeType("extent_dalloc_t") ExtentDallocI value) { ndalloc(address(), value); return this; } + /** Sets the specified value to the {@link #destroy} field. */ + public ExtentHooks destroy(@Nullable @NativeType("extent_destroy_t") ExtentDestroyI value) { ndestroy(address(), value); return this; } + /** Sets the specified value to the {@link #commit} field. */ + public ExtentHooks commit(@Nullable @NativeType("extent_commit_t") ExtentCommitI value) { ncommit(address(), value); return this; } + /** Sets the specified value to the {@link #decommit} field. */ + public ExtentHooks decommit(@Nullable @NativeType("extent_decommit_t") ExtentDecommitI value) { ndecommit(address(), value); return this; } + /** Sets the specified value to the {@link #purge_lazy} field. */ + public ExtentHooks purge_lazy(@Nullable @NativeType("extent_purge_t") ExtentPurgeI value) { npurge_lazy(address(), value); return this; } + /** Sets the specified value to the {@link #purge_forced} field. */ + public ExtentHooks purge_forced(@Nullable @NativeType("extent_purge_t") ExtentPurgeI value) { npurge_forced(address(), value); return this; } + /** Sets the specified value to the {@link #split} field. */ + public ExtentHooks split(@Nullable @NativeType("extent_split_t") ExtentSplitI value) { nsplit(address(), value); return this; } + /** Sets the specified value to the {@link #merge} field. */ + public ExtentHooks merge(@Nullable @NativeType("extent_merge_t") ExtentMergeI value) { nmerge(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public ExtentHooks set( + ExtentAllocI alloc, + ExtentDallocI dalloc, + ExtentDestroyI destroy, + ExtentCommitI commit, + ExtentDecommitI decommit, + ExtentPurgeI purge_lazy, + ExtentPurgeI purge_forced, + ExtentSplitI split, + ExtentMergeI merge + ) { + alloc(alloc); + dalloc(dalloc); + destroy(destroy); + commit(commit); + decommit(decommit); + purge_lazy(purge_lazy); + purge_forced(purge_forced); + split(split); + merge(merge); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public ExtentHooks set(ExtentHooks src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code ExtentHooks} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static ExtentHooks malloc() { + return new ExtentHooks(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code ExtentHooks} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static ExtentHooks calloc() { + return new ExtentHooks(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code ExtentHooks} instance allocated with {@link BufferUtils}. */ + public static ExtentHooks create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new ExtentHooks(memAddress(container), container); + } + + /** Returns a new {@code ExtentHooks} instance for the specified memory address. */ + public static ExtentHooks create(long address) { + return new ExtentHooks(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static ExtentHooks createSafe(long address) { + return address == NULL ? null : new ExtentHooks(address, null); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static ExtentHooks mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static ExtentHooks callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static ExtentHooks mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static ExtentHooks callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + + /** + * Returns a new {@code ExtentHooks} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static ExtentHooks malloc(MemoryStack stack) { + return new ExtentHooks(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code ExtentHooks} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static ExtentHooks calloc(MemoryStack stack) { + return new ExtentHooks(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + // ----------------------------------- + + /** Unsafe version of {@link #alloc}. */ + public static ExtentAlloc nalloc(long struct) { return ExtentAlloc.create(memGetAddress(struct + ExtentHooks.ALLOC)); } + /** Unsafe version of {@link #dalloc}. */ + @Nullable public static ExtentDalloc ndalloc(long struct) { return ExtentDalloc.createSafe(memGetAddress(struct + ExtentHooks.DALLOC)); } + /** Unsafe version of {@link #destroy}. */ + @Nullable public static ExtentDestroy ndestroy(long struct) { return ExtentDestroy.createSafe(memGetAddress(struct + ExtentHooks.DESTROY)); } + /** Unsafe version of {@link #commit}. */ + @Nullable public static ExtentCommit ncommit(long struct) { return ExtentCommit.createSafe(memGetAddress(struct + ExtentHooks.COMMIT)); } + /** Unsafe version of {@link #decommit}. */ + @Nullable public static ExtentDecommit ndecommit(long struct) { return ExtentDecommit.createSafe(memGetAddress(struct + ExtentHooks.DECOMMIT)); } + /** Unsafe version of {@link #purge_lazy}. */ + @Nullable public static ExtentPurge npurge_lazy(long struct) { return ExtentPurge.createSafe(memGetAddress(struct + ExtentHooks.PURGE_LAZY)); } + /** Unsafe version of {@link #purge_forced}. */ + @Nullable public static ExtentPurge npurge_forced(long struct) { return ExtentPurge.createSafe(memGetAddress(struct + ExtentHooks.PURGE_FORCED)); } + /** Unsafe version of {@link #split}. */ + @Nullable public static ExtentSplit nsplit(long struct) { return ExtentSplit.createSafe(memGetAddress(struct + ExtentHooks.SPLIT)); } + /** Unsafe version of {@link #merge}. */ + @Nullable public static ExtentMerge nmerge(long struct) { return ExtentMerge.createSafe(memGetAddress(struct + ExtentHooks.MERGE)); } + + /** Unsafe version of {@link #alloc(ExtentAllocI) alloc}. */ + public static void nalloc(long struct, ExtentAllocI value) { memPutAddress(struct + ExtentHooks.ALLOC, value.address()); } + /** Unsafe version of {@link #dalloc(ExtentDallocI) dalloc}. */ + public static void ndalloc(long struct, @Nullable ExtentDallocI value) { memPutAddress(struct + ExtentHooks.DALLOC, memAddressSafe(value)); } + /** Unsafe version of {@link #destroy(ExtentDestroyI) destroy}. */ + public static void ndestroy(long struct, @Nullable ExtentDestroyI value) { memPutAddress(struct + ExtentHooks.DESTROY, memAddressSafe(value)); } + /** Unsafe version of {@link #commit(ExtentCommitI) commit}. */ + public static void ncommit(long struct, @Nullable ExtentCommitI value) { memPutAddress(struct + ExtentHooks.COMMIT, memAddressSafe(value)); } + /** Unsafe version of {@link #decommit(ExtentDecommitI) decommit}. */ + public static void ndecommit(long struct, @Nullable ExtentDecommitI value) { memPutAddress(struct + ExtentHooks.DECOMMIT, memAddressSafe(value)); } + /** Unsafe version of {@link #purge_lazy(ExtentPurgeI) purge_lazy}. */ + public static void npurge_lazy(long struct, @Nullable ExtentPurgeI value) { memPutAddress(struct + ExtentHooks.PURGE_LAZY, memAddressSafe(value)); } + /** Unsafe version of {@link #purge_forced(ExtentPurgeI) purge_forced}. */ + public static void npurge_forced(long struct, @Nullable ExtentPurgeI value) { memPutAddress(struct + ExtentHooks.PURGE_FORCED, memAddressSafe(value)); } + /** Unsafe version of {@link #split(ExtentSplitI) split}. */ + public static void nsplit(long struct, @Nullable ExtentSplitI value) { memPutAddress(struct + ExtentHooks.SPLIT, memAddressSafe(value)); } + /** Unsafe version of {@link #merge(ExtentMergeI) merge}. */ + public static void nmerge(long struct, @Nullable ExtentMergeI value) { memPutAddress(struct + ExtentHooks.MERGE, memAddressSafe(value)); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + ExtentHooks.ALLOC)); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentMerge.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentMerge.java new file mode 100644 index 000000000..89ea03ad7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentMerge.java @@ -0,0 +1,81 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr_a,
    + *     size_t size_a,
    + *     void *addr_b,
    + *     size_t size_b,
    + *     bool committed,
    + *     unsigned int arena_ind
    + * )
    + */ +public abstract class ExtentMerge extends Callback implements ExtentMergeI { + + /** + * Creates a {@code ExtentMerge} instance from the specified function pointer. + * + * @return the new {@code ExtentMerge} + */ + public static ExtentMerge create(long functionPointer) { + ExtentMergeI instance = Callback.get(functionPointer); + return instance instanceof ExtentMerge + ? (ExtentMerge)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static ExtentMerge createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code ExtentMerge} instance that delegates to the specified {@code ExtentMergeI} instance. */ + public static ExtentMerge create(ExtentMergeI instance) { + return instance instanceof ExtentMerge + ? (ExtentMerge)instance + : new Container(instance.address(), instance); + } + + protected ExtentMerge() { + super(CIF); + } + + ExtentMerge(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends ExtentMerge { + + private final ExtentMergeI delegate; + + Container(long functionPointer, ExtentMergeI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public boolean invoke(long extent_hooks, long addr_a, long size_a, long addr_b, long size_b, boolean committed, int arena_ind) { + return delegate.invoke(extent_hooks, addr_a, size_a, addr_b, size_b, committed, arena_ind); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentMergeI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentMergeI.java new file mode 100644 index 000000000..f1438c6dc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentMergeI.java @@ -0,0 +1,68 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr_a,
    + *     size_t size_a,
    + *     void *addr_b,
    + *     size_t size_b,
    + *     bool committed,
    + *     unsigned int arena_ind
    + * )
    + */ +@FunctionalInterface +@NativeType("extent_merge_t") +public interface ExtentMergeI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_uint8, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_uint8, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + boolean __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 4 * POINTER_SIZE)), + memGetByte(memGetAddress(args + 5 * POINTER_SIZE)) != 0, + memGetInt(memGetAddress(args + 6 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** + * Extent merge hook. + * + *

    An extent merge function conforms to the {@code extent_merge_t} type and optionally merges adjacent extents, at given {@code addr_a} and {@code size_a} + * with given {@code addr_b} and {@code size_b} into one contiguous extent, operating on {@code committed}/decommitted memory as indicated, on behalf of arena + * {@code arena_ind}, returning false upon success. If the function returns true, this indicates that the extents remain distinct mappings and therefore + * should continue to be operated on independently.

    + */ + @NativeType("bool") boolean invoke(@NativeType("extent_hooks_t *") long extent_hooks, @NativeType("void *") long addr_a, @NativeType("size_t") long size_a, @NativeType("void *") long addr_b, @NativeType("size_t") long size_b, @NativeType("bool") boolean committed, @NativeType("unsigned int") int arena_ind); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentPurge.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentPurge.java new file mode 100644 index 000000000..4726b9c4d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentPurge.java @@ -0,0 +1,80 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     size_t offset,
    + *     size_t length,
    + *     unsigned int arena_ind
    + * )
    + */ +public abstract class ExtentPurge extends Callback implements ExtentPurgeI { + + /** + * Creates a {@code ExtentPurge} instance from the specified function pointer. + * + * @return the new {@code ExtentPurge} + */ + public static ExtentPurge create(long functionPointer) { + ExtentPurgeI instance = Callback.get(functionPointer); + return instance instanceof ExtentPurge + ? (ExtentPurge)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static ExtentPurge createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code ExtentPurge} instance that delegates to the specified {@code ExtentPurgeI} instance. */ + public static ExtentPurge create(ExtentPurgeI instance) { + return instance instanceof ExtentPurge + ? (ExtentPurge)instance + : new Container(instance.address(), instance); + } + + protected ExtentPurge() { + super(CIF); + } + + ExtentPurge(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends ExtentPurge { + + private final ExtentPurgeI delegate; + + Container(long functionPointer, ExtentPurgeI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public boolean invoke(long extent_hooks, long addr, long size, long offset, long length, int arena_ind) { + return delegate.invoke(extent_hooks, addr, size, offset, length, arena_ind); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentPurgeI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentPurgeI.java new file mode 100644 index 000000000..3d6304bbf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentPurgeI.java @@ -0,0 +1,67 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     size_t offset,
    + *     size_t length,
    + *     unsigned int arena_ind
    + * )
    + */ +@FunctionalInterface +@NativeType("extent_purge_t") +public interface ExtentPurgeI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_uint8, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + boolean __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 4 * POINTER_SIZE)), + memGetInt(memGetAddress(args + 5 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** + * Extent purge hook. + * + *

    An extent purge function conforms to the {@code extent_purge_t} type and discards physical pages within the virtual memory mapping associated with an + * extent at given {@code addr} and {@code size} at {@code offset} bytes, extending for {@code length} on behalf of arena {@code arena_ind}. A lazy extent + * purge function (e.g. implemented via {@code madvise(..., MADV_FREE)}) can delay purging indefinitely and leave the pages within the purged virtual memory + * range in an indeterminite state, whereas a forced extent purge function immediately purges, and the pages within the virtual memory range will be + * zero-filled the next time they are accessed. If the function returns true, this indicates failure to purge.

    + */ + @NativeType("bool") boolean invoke(@NativeType("extent_hooks_t *") long extent_hooks, @NativeType("void *") long addr, @NativeType("size_t") long size, @NativeType("size_t") long offset, @NativeType("size_t") long length, @NativeType("unsigned int") int arena_ind); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentSplit.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentSplit.java new file mode 100644 index 000000000..cebf2ba2c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentSplit.java @@ -0,0 +1,81 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     size_t size_a,
    + *     size_t size_b,
    + *     bool committed,
    + *     unsigned int arena_ind
    + * )
    + */ +public abstract class ExtentSplit extends Callback implements ExtentSplitI { + + /** + * Creates a {@code ExtentSplit} instance from the specified function pointer. + * + * @return the new {@code ExtentSplit} + */ + public static ExtentSplit create(long functionPointer) { + ExtentSplitI instance = Callback.get(functionPointer); + return instance instanceof ExtentSplit + ? (ExtentSplit)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static ExtentSplit createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code ExtentSplit} instance that delegates to the specified {@code ExtentSplitI} instance. */ + public static ExtentSplit create(ExtentSplitI instance) { + return instance instanceof ExtentSplit + ? (ExtentSplit)instance + : new Container(instance.address(), instance); + } + + protected ExtentSplit() { + super(CIF); + } + + ExtentSplit(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends ExtentSplit { + + private final ExtentSplitI delegate; + + Container(long functionPointer, ExtentSplitI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public boolean invoke(long extent_hooks, long addr, long size, long size_a, long size_b, boolean committed, int arena_ind) { + return delegate.invoke(extent_hooks, addr, size, size_a, size_b, committed, arena_ind); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentSplitI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentSplitI.java new file mode 100644 index 000000000..bab3b6731 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/ExtentSplitI.java @@ -0,0 +1,68 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be set to the {@link ExtentHooks} struct. + * + *

    Type

    + * + *
    
    + * bool (*{@link #invoke}) (
    + *     extent_hooks_t *extent_hooks,
    + *     void *addr,
    + *     size_t size,
    + *     size_t size_a,
    + *     size_t size_b,
    + *     bool committed,
    + *     unsigned int arena_ind
    + * )
    + */ +@FunctionalInterface +@NativeType("extent_split_t") +public interface ExtentSplitI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_uint8, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_uint8, ffi_type_uint32 + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + boolean __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 4 * POINTER_SIZE)), + memGetByte(memGetAddress(args + 5 * POINTER_SIZE)) != 0, + memGetInt(memGetAddress(args + 6 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** + * Extent split hook. + * + *

    An extent split function conforms to the {@code extent_split_t} type and optionally splits an extent at given {@code addr} and {@code size} into two + * adjacent extents, the first of {@code size_a} bytes, and the second of {@code size_b} bytes, operating on {@code committed}/decommitted memory as + * indicated, on behalf of arena {@code arena_ind}, returning false upon success. If the function returns true, this indicates that the extent remains unsplit + * and therefore should continue to be operated on as a whole.

    + */ + @NativeType("bool") boolean invoke(@NativeType("extent_hooks_t *") long extent_hooks, @NativeType("void *") long addr, @NativeType("size_t") long size, @NativeType("size_t") long size_a, @NativeType("size_t") long size_b, @NativeType("bool") boolean committed, @NativeType("unsigned int") int arena_ind); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/JEmalloc.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/JEmalloc.java new file mode 100644 index 000000000..6054511b2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/JEmalloc.java @@ -0,0 +1,1011 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to jemalloc. + * + *

    jemalloc is a general purpose malloc implementation that emphasizes fragmentation avoidance and scalable concurrency support. jemalloc first came into + * use as the FreeBSD libc allocator in 2005, and since then it has found its way into numerous applications that rely on its predictable behavior. In + * 2010 jemalloc development efforts broadened to include developer support features such as heap profiling, Valgrind integration, and extensive + * monitoring/tuning hooks. Modern jemalloc releases continue to be integrated back into FreeBSD, and therefore versatility remains critical. Ongoing + * development efforts trend toward making jemalloc among the best allocators for a broad range of demanding applications, and eliminating/mitigating + * weaknesses that have practical repercussions for real world applications.

    + */ +public class JEmalloc { + + private static final SharedLibrary JEMALLOC = Library.loadNative(JEmalloc.class, "org.lwjgl.jemalloc", Configuration.JEMALLOC_LIBRARY_NAME.get(Platform.mapLibraryNameBundled("jemalloc")), true); + + /** Contains the function pointers loaded from the jemalloc {@link SharedLibrary}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + malloc_message = apiGetFunctionAddress(JEMALLOC, "je_malloc_message"), + malloc = apiGetFunctionAddress(JEMALLOC, "je_malloc"), + calloc = apiGetFunctionAddress(JEMALLOC, "je_calloc"), + posix_memalign = apiGetFunctionAddress(JEMALLOC, "je_posix_memalign"), + aligned_alloc = apiGetFunctionAddress(JEMALLOC, "je_aligned_alloc"), + realloc = apiGetFunctionAddress(JEMALLOC, "je_realloc"), + free = apiGetFunctionAddress(JEMALLOC, "je_free"), + free_sized = apiGetFunctionAddress(JEMALLOC, "je_free_sized"), + free_aligned_sized = apiGetFunctionAddress(JEMALLOC, "je_free_aligned_sized"), + mallocx = apiGetFunctionAddress(JEMALLOC, "je_mallocx"), + rallocx = apiGetFunctionAddress(JEMALLOC, "je_rallocx"), + xallocx = apiGetFunctionAddress(JEMALLOC, "je_xallocx"), + sallocx = apiGetFunctionAddress(JEMALLOC, "je_sallocx"), + dallocx = apiGetFunctionAddress(JEMALLOC, "je_dallocx"), + sdallocx = apiGetFunctionAddress(JEMALLOC, "je_sdallocx"), + nallocx = apiGetFunctionAddress(JEMALLOC, "je_nallocx"), + mallctl = apiGetFunctionAddress(JEMALLOC, "je_mallctl"), + mallctlnametomib = apiGetFunctionAddress(JEMALLOC, "je_mallctlnametomib"), + mallctlbymib = apiGetFunctionAddress(JEMALLOC, "je_mallctlbymib"), + malloc_stats_print = apiGetFunctionAddress(JEMALLOC, "je_malloc_stats_print"), + malloc_usable_size = apiGetFunctionAddress(JEMALLOC, "je_malloc_usable_size"); + + } + + /** Returns the jemalloc {@link SharedLibrary}. */ + public static SharedLibrary getLibrary() { + return JEMALLOC; + } + + /** The major version. */ + public static final int JEMALLOC_VERSION_MAJOR = 5; + + /** The minor version. */ + public static final int JEMALLOC_VERSION_MINOR = 2; + + /** The bugfix version. */ + public static final int JEMALLOC_VERSION_BUGFIX = 1; + + /** The revision number. */ + public static final int JEMALLOC_VERSION_NREV = 0; + + /** The globally unique identifier (git commit hash). */ + public static final String JEMALLOC_VERSION_GID = "ea6b3e973b477b8061e0076bb257dbd7f3faa756"; + + /** The version string. */ + public static final String JEMALLOC_VERSION = JEMALLOC_VERSION_MAJOR + "." + JEMALLOC_VERSION_MINOR + "." + JEMALLOC_VERSION_BUGFIX + "-" + JEMALLOC_VERSION_NREV + "-g" + JEMALLOC_VERSION_GID; + + /** + * Initialize newly allocated memory to contain zero bytes. In the growing reallocation case, the real size prior to reallocation defines the boundary + * between untouched bytes and those that are initialized to contain zero bytes. If this macro is absent, newly allocated memory is uninitialized. + */ + public static final int MALLOCX_ZERO = 0x40; + + /** + * Do not use a thread-specific cache (tcache). Unless {@link #MALLOCX_TCACHE} or {@code MALLOCX_TCACHE_NONE} is specified, an automatically managed + * tcache will be used under many circumstances. This macro cannot be used in the same {@code flags} argument as {@code MALLOCX_TCACHE(tc)}. + */ + public static final int MALLOCX_TCACHE_NONE = MALLOCX_TCACHE(-1); + + /** Use as arena index in "arena.<i>.{purge,decay,dss}" and "stats.arenas.<i>.*" mallctl interfaces to select all arenas. */ + public static final int MALLCTL_ARENAS_ALL = 0x1000; + + /** Use as arena index in "stats.arenas.<i>.*" mallctl interfaces to select destroyed arenas. */ + public static final int MALLCTL_ARENAS_DESTROYED = 0x1001; + + static { + // Force jemalloc to initialize before anyone else uses it. + // This avoids a dangerous race when the first jemalloc functions are called concurrently. + if (Platform.get() == Platform.WINDOWS) { + invokePV(invokePP(8L, apiGetFunctionAddress(JEMALLOC, "je_malloc")), apiGetFunctionAddress(JEMALLOC, "je_free")); + } + } + + protected JEmalloc() { + throw new UnsupportedOperationException(); + } + + // --- [ je_malloc_message ] --- + + /** Returns the {@code je_malloc_message} variable. */ + @NativeType("void (*) (void *, char const *) *") + public static PointerBuffer je_malloc_message() { + long __result = Functions.malloc_message; + return memPointerBuffer(__result, 1); + } + + // --- [ je_malloc ] --- + + /** Unsafe version of: {@link #je_malloc malloc} */ + public static long nje_malloc(long size) { + long __functionAddress = Functions.malloc; + return invokePP(size, __functionAddress); + } + + /** + * Allocates {@code size} bytes of uninitialized memory. The allocated space is suitably aligned (after possible pointer coercion) for storage of any type + * of object. + * + * @param size the number of bytes to allocate + */ + @Nullable + @NativeType("void *") + public static ByteBuffer je_malloc(@NativeType("size_t") long size) { + long __result = nje_malloc(size); + return memByteBufferSafe(__result, (int)size); + } + + // --- [ je_calloc ] --- + + /** Unsafe version of: {@link #je_calloc calloc} */ + public static long nje_calloc(long num, long size) { + long __functionAddress = Functions.calloc; + return invokePPP(num, size, __functionAddress); + } + + /** + * Allocates space for {@code num} objects, each {@code size} bytes in length. The result is identical to calling {@link #je_malloc malloc} with an argument of + * {@code num * size}, with the exception that the allocated memory is explicitly initialized to zero bytes. + * + * @param num the number of objects to allocate + * @param size the size of each object, in bytes + */ + @Nullable + @NativeType("void *") + public static ByteBuffer je_calloc(@NativeType("size_t") long num, @NativeType("size_t") long size) { + long __result = nje_calloc(num, size); + return memByteBufferSafe(__result, (int)num * (int)size); + } + + // --- [ je_posix_memalign ] --- + + /** Unsafe version of: {@link #je_posix_memalign posix_memalign} */ + public static int nje_posix_memalign(long memptr, long alignment, long size) { + long __functionAddress = Functions.posix_memalign; + return invokePPPI(memptr, alignment, size, __functionAddress); + } + + /** + * Allocates {@code size} bytes of memory such that the allocation's base address is an even multiple of {@code alignment}, and returns the allocation in + * the value pointed to by {@code memptr}. The requested alignment must be a power of 2 at least as large as {@code sizeof(void *)}. + * + * @param memptr returns the allocated memory + * @param alignment the allocation alignment, in bytes + * @param size the number of bytes to allocate + */ + public static int je_posix_memalign(@NativeType("void **") PointerBuffer memptr, @NativeType("size_t") long alignment, @NativeType("size_t") long size) { + if (CHECKS) { + check(memptr, 1); + } + return nje_posix_memalign(memAddress(memptr), alignment, size); + } + + // --- [ je_aligned_alloc ] --- + + /** Unsafe version of: {@link #je_aligned_alloc aligned_alloc} */ + public static long nje_aligned_alloc(long alignment, long size) { + long __functionAddress = Functions.aligned_alloc; + return invokePPP(alignment, size, __functionAddress); + } + + /** + * Allocates {@code size} bytes of memory such that the allocation's base address is an even multiple of {@code alignment}. The requested alignment must + * be a power of 2. Behavior is undefined if {@code size} is not an integral multiple of {@code alignment}. + * + * @param alignment the allocation alignment, in bytes + * @param size the number of bytes to allocate + */ + @Nullable + @NativeType("void *") + public static ByteBuffer je_aligned_alloc(@NativeType("size_t") long alignment, @NativeType("size_t") long size) { + long __result = nje_aligned_alloc(alignment, size); + return memByteBufferSafe(__result, (int)size); + } + + // --- [ je_realloc ] --- + + /** Unsafe version of: {@link #je_realloc realloc} */ + public static long nje_realloc(long ptr, long size) { + long __functionAddress = Functions.realloc; + return invokePPP(ptr, size, __functionAddress); + } + + /** + * Changes the size of the previously allocated memory referenced by {@code ptr} to {@code size} bytes. The contents of the memory are unchanged up to the + * lesser of the new and old sizes. If the new size is larger, the contents of the newly allocated portion of the memory are undefined. Upon success, the + * memory referenced by {@code ptr} is freed and a pointer to the newly allocated memory is returned. Note that realloc() may move the memory allocation, + * resulting in a different return value than {@code ptr}. If {@code ptr} is {@code NULL}, the realloc() function behaves identically to malloc() for the + * specified size. + * + * @param ptr the previously allocated memory or {@code NULL} + * @param size the number of bytes to allocate + */ + @Nullable + @NativeType("void *") + public static ByteBuffer je_realloc(@Nullable @NativeType("void *") ByteBuffer ptr, @NativeType("size_t") long size) { + long __result = nje_realloc(memAddressSafe(ptr), size); + return memByteBufferSafe(__result, (int)size); + } + + // --- [ je_free ] --- + + /** Unsafe version of: {@link #je_free free} */ + public static void nje_free(long ptr) { + long __functionAddress = Functions.free; + invokePV(ptr, __functionAddress); + } + + /** + * Causes the allocated memory referenced by {@code ptr} to be made available for future allocations. If {@code ptr} is {@code NULL}, no action occurs. + * + * @param ptr the allocated memory to free + */ + public static void je_free(@Nullable @NativeType("void *") ByteBuffer ptr) { + nje_free(memAddressSafe(ptr)); + } + + /** + * Causes the allocated memory referenced by {@code ptr} to be made available for future allocations. If {@code ptr} is {@code NULL}, no action occurs. + * + * @param ptr the allocated memory to free + */ + public static void je_free(@Nullable @NativeType("void *") ShortBuffer ptr) { + nje_free(memAddressSafe(ptr)); + } + + /** + * Causes the allocated memory referenced by {@code ptr} to be made available for future allocations. If {@code ptr} is {@code NULL}, no action occurs. + * + * @param ptr the allocated memory to free + */ + public static void je_free(@Nullable @NativeType("void *") IntBuffer ptr) { + nje_free(memAddressSafe(ptr)); + } + + /** + * Causes the allocated memory referenced by {@code ptr} to be made available for future allocations. If {@code ptr} is {@code NULL}, no action occurs. + * + * @param ptr the allocated memory to free + */ + public static void je_free(@Nullable @NativeType("void *") LongBuffer ptr) { + nje_free(memAddressSafe(ptr)); + } + + /** + * Causes the allocated memory referenced by {@code ptr} to be made available for future allocations. If {@code ptr} is {@code NULL}, no action occurs. + * + * @param ptr the allocated memory to free + */ + public static void je_free(@Nullable @NativeType("void *") FloatBuffer ptr) { + nje_free(memAddressSafe(ptr)); + } + + /** + * Causes the allocated memory referenced by {@code ptr} to be made available for future allocations. If {@code ptr} is {@code NULL}, no action occurs. + * + * @param ptr the allocated memory to free + */ + public static void je_free(@Nullable @NativeType("void *") DoubleBuffer ptr) { + nje_free(memAddressSafe(ptr)); + } + + /** + * Causes the allocated memory referenced by {@code ptr} to be made available for future allocations. If {@code ptr} is {@code NULL}, no action occurs. + * + * @param ptr the allocated memory to free + */ + public static void je_free(@Nullable @NativeType("void *") PointerBuffer ptr) { + nje_free(memAddressSafe(ptr)); + } + + // --- [ je_free_sized ] --- + + /** Unsafe version of: {@link #je_free_sized free_sized} */ + public static void nje_free_sized(long ptr, long size) { + long __functionAddress = Functions.free_sized; + invokePPV(ptr, size, __functionAddress); + } + + /** + * The {@code free_sized()} function is an extension of {@link #je_free free} with a {@code size} parameter to allow the caller to pass in the allocation size as an + * optimization. + */ + public static void je_free_sized(@Nullable @NativeType("void *") ByteBuffer ptr) { + nje_free_sized(memAddressSafe(ptr), remainingSafe(ptr)); + } + + /** + * The {@code free_sized()} function is an extension of {@link #je_free free} with a {@code size} parameter to allow the caller to pass in the allocation size as an + * optimization. + */ + public static void je_free_sized(@Nullable @NativeType("void *") ShortBuffer ptr) { + nje_free_sized(memAddressSafe(ptr), Integer.toUnsignedLong(remainingSafe(ptr)) << 1); + } + + /** + * The {@code free_sized()} function is an extension of {@link #je_free free} with a {@code size} parameter to allow the caller to pass in the allocation size as an + * optimization. + */ + public static void je_free_sized(@Nullable @NativeType("void *") IntBuffer ptr) { + nje_free_sized(memAddressSafe(ptr), Integer.toUnsignedLong(remainingSafe(ptr)) << 2); + } + + /** + * The {@code free_sized()} function is an extension of {@link #je_free free} with a {@code size} parameter to allow the caller to pass in the allocation size as an + * optimization. + */ + public static void je_free_sized(@Nullable @NativeType("void *") LongBuffer ptr) { + nje_free_sized(memAddressSafe(ptr), Integer.toUnsignedLong(remainingSafe(ptr)) << 3); + } + + /** + * The {@code free_sized()} function is an extension of {@link #je_free free} with a {@code size} parameter to allow the caller to pass in the allocation size as an + * optimization. + */ + public static void je_free_sized(@Nullable @NativeType("void *") FloatBuffer ptr) { + nje_free_sized(memAddressSafe(ptr), Integer.toUnsignedLong(remainingSafe(ptr)) << 2); + } + + /** + * The {@code free_sized()} function is an extension of {@link #je_free free} with a {@code size} parameter to allow the caller to pass in the allocation size as an + * optimization. + */ + public static void je_free_sized(@Nullable @NativeType("void *") DoubleBuffer ptr) { + nje_free_sized(memAddressSafe(ptr), Integer.toUnsignedLong(remainingSafe(ptr)) << 3); + } + + /** + * The {@code free_sized()} function is an extension of {@link #je_free free} with a {@code size} parameter to allow the caller to pass in the allocation size as an + * optimization. + */ + public static void je_free_sized(@Nullable @NativeType("void *") PointerBuffer ptr) { + nje_free_sized(memAddressSafe(ptr), Integer.toUnsignedLong(remainingSafe(ptr)) << POINTER_SHIFT); + } + + // --- [ je_free_aligned_sized ] --- + + /** Unsafe version of: {@link #je_free_aligned_sized free_aligned_sized} */ + public static void nje_free_aligned_sized(long ptr, long alignment, long size) { + long __functionAddress = Functions.free_aligned_sized; + invokePPPV(ptr, alignment, size, __functionAddress); + } + + /** + * The {@code free_aligned_sized()} function accepts a {@code ptr} which was allocated with a requested {@code size} and {@code alignment}, causing the + * allocated memory referenced by {@code ptr} to be made available for future allocations. + */ + public static void je_free_aligned_sized(@Nullable @NativeType("void *") ByteBuffer ptr, @NativeType("size_t") long alignment) { + nje_free_aligned_sized(memAddressSafe(ptr), alignment, remainingSafe(ptr)); + } + + /** + * The {@code free_aligned_sized()} function accepts a {@code ptr} which was allocated with a requested {@code size} and {@code alignment}, causing the + * allocated memory referenced by {@code ptr} to be made available for future allocations. + */ + public static void je_free_aligned_sized(@Nullable @NativeType("void *") ShortBuffer ptr, @NativeType("size_t") long alignment) { + nje_free_aligned_sized(memAddressSafe(ptr), alignment, Integer.toUnsignedLong(remainingSafe(ptr)) << 1); + } + + /** + * The {@code free_aligned_sized()} function accepts a {@code ptr} which was allocated with a requested {@code size} and {@code alignment}, causing the + * allocated memory referenced by {@code ptr} to be made available for future allocations. + */ + public static void je_free_aligned_sized(@Nullable @NativeType("void *") IntBuffer ptr, @NativeType("size_t") long alignment) { + nje_free_aligned_sized(memAddressSafe(ptr), alignment, Integer.toUnsignedLong(remainingSafe(ptr)) << 2); + } + + /** + * The {@code free_aligned_sized()} function accepts a {@code ptr} which was allocated with a requested {@code size} and {@code alignment}, causing the + * allocated memory referenced by {@code ptr} to be made available for future allocations. + */ + public static void je_free_aligned_sized(@Nullable @NativeType("void *") LongBuffer ptr, @NativeType("size_t") long alignment) { + nje_free_aligned_sized(memAddressSafe(ptr), alignment, Integer.toUnsignedLong(remainingSafe(ptr)) << 3); + } + + /** + * The {@code free_aligned_sized()} function accepts a {@code ptr} which was allocated with a requested {@code size} and {@code alignment}, causing the + * allocated memory referenced by {@code ptr} to be made available for future allocations. + */ + public static void je_free_aligned_sized(@Nullable @NativeType("void *") FloatBuffer ptr, @NativeType("size_t") long alignment) { + nje_free_aligned_sized(memAddressSafe(ptr), alignment, Integer.toUnsignedLong(remainingSafe(ptr)) << 2); + } + + /** + * The {@code free_aligned_sized()} function accepts a {@code ptr} which was allocated with a requested {@code size} and {@code alignment}, causing the + * allocated memory referenced by {@code ptr} to be made available for future allocations. + */ + public static void je_free_aligned_sized(@Nullable @NativeType("void *") DoubleBuffer ptr, @NativeType("size_t") long alignment) { + nje_free_aligned_sized(memAddressSafe(ptr), alignment, Integer.toUnsignedLong(remainingSafe(ptr)) << 3); + } + + /** + * The {@code free_aligned_sized()} function accepts a {@code ptr} which was allocated with a requested {@code size} and {@code alignment}, causing the + * allocated memory referenced by {@code ptr} to be made available for future allocations. + */ + public static void je_free_aligned_sized(@Nullable @NativeType("void *") PointerBuffer ptr, @NativeType("size_t") long alignment) { + nje_free_aligned_sized(memAddressSafe(ptr), alignment, Integer.toUnsignedLong(remainingSafe(ptr)) << POINTER_SHIFT); + } + + // --- [ je_mallocx ] --- + + /** Unsafe version of: {@link #je_mallocx mallocx} */ + public static long nje_mallocx(long size, int flags) { + long __functionAddress = Functions.mallocx; + return invokePP(size, flags, __functionAddress); + } + + /** + * Allocates at least {@code size} bytes of memory, and returns a pointer to the base address of the allocation. Behavior is undefined if {@code size} is + * 0, or if request size overflows due to size class and/or alignment constraints. + * + * @param size the number of bytes to allocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + @Nullable + @NativeType("void *") + public static ByteBuffer je_mallocx(@NativeType("size_t") long size, int flags) { + long __result = nje_mallocx(size, flags); + return memByteBufferSafe(__result, (int)size); + } + + // --- [ je_rallocx ] --- + + /** Unsafe version of: {@link #je_rallocx rallocx} */ + public static long nje_rallocx(long ptr, long size, int flags) { + long __functionAddress = Functions.rallocx; + return invokePPP(ptr, size, flags, __functionAddress); + } + + /** + * Resizes the allocation at {@code ptr} to be at least {@code size} bytes, and returns a pointer to the base address of the resulting allocation, which + * may or may not have moved from its original location. Behavior is undefined if {@code size} is 0, or if request size overflows due to size class and/or + * alignment constraints. + * + * @param ptr the previously allocated memory or {@code NULL} + * @param size the number of bytes to allocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + @Nullable + @NativeType("void *") + public static ByteBuffer je_rallocx(@Nullable @NativeType("void *") ByteBuffer ptr, @NativeType("size_t") long size, int flags) { + long __result = nje_rallocx(memAddressSafe(ptr), size, flags); + return memByteBufferSafe(__result, (int)size); + } + + // --- [ je_xallocx ] --- + + /** Unsafe version of: {@link #je_xallocx xallocx} */ + public static long nje_xallocx(long ptr, long size, long extra, int flags) { + long __functionAddress = Functions.xallocx; + return invokePPPP(ptr, size, extra, flags, __functionAddress); + } + + /** + * Resizes the allocation at {@code ptr} in place to be at least size bytes, and returns the real size of the allocation. If {@code extra} is non-zero, an + * attempt is made to resize the allocation to be at least {@code (size + extra)} bytes, though inability to allocate the extra byte(s) will not by itself + * result in failure to resize. Behavior is undefined if {@code size} is 0, or if {@code (size + extra > SIZE_T_MAX)}. + * + * @param ptr the previously allocated memory or {@code NULL} + * @param size the number of bytes to allocate + * @param extra the number of extra bytes to allocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + @NativeType("size_t") + public static long je_xallocx(@Nullable @NativeType("void *") ByteBuffer ptr, @NativeType("size_t") long size, @NativeType("size_t") long extra, int flags) { + return nje_xallocx(memAddressSafe(ptr), size, extra, flags); + } + + // --- [ je_sallocx ] --- + + /** Unsafe version of: {@link #je_sallocx sallocx} */ + public static long nje_sallocx(long ptr, int flags) { + long __functionAddress = Functions.sallocx; + return invokePP(ptr, flags, __functionAddress); + } + + /** + * Returns the real size of the allocation at {@code ptr}. + * + * @param ptr the allocated memory to query + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + @NativeType("size_t") + public static long je_sallocx(@NativeType("void const *") ByteBuffer ptr, int flags) { + return nje_sallocx(memAddress(ptr), flags); + } + + // --- [ je_dallocx ] --- + + /** Unsafe version of: {@link #je_dallocx dallocx} */ + public static void nje_dallocx(long ptr, int flags) { + long __functionAddress = Functions.dallocx; + invokePV(ptr, flags, __functionAddress); + } + + /** + * Causes the memory referenced by {@code ptr} to be made available for future allocations. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_dallocx(@NativeType("void *") ByteBuffer ptr, int flags) { + nje_dallocx(memAddress(ptr), flags); + } + + /** + * Causes the memory referenced by {@code ptr} to be made available for future allocations. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_dallocx(@NativeType("void *") ShortBuffer ptr, int flags) { + nje_dallocx(memAddress(ptr), flags); + } + + /** + * Causes the memory referenced by {@code ptr} to be made available for future allocations. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_dallocx(@NativeType("void *") IntBuffer ptr, int flags) { + nje_dallocx(memAddress(ptr), flags); + } + + /** + * Causes the memory referenced by {@code ptr} to be made available for future allocations. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_dallocx(@NativeType("void *") LongBuffer ptr, int flags) { + nje_dallocx(memAddress(ptr), flags); + } + + /** + * Causes the memory referenced by {@code ptr} to be made available for future allocations. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_dallocx(@NativeType("void *") FloatBuffer ptr, int flags) { + nje_dallocx(memAddress(ptr), flags); + } + + /** + * Causes the memory referenced by {@code ptr} to be made available for future allocations. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_dallocx(@NativeType("void *") DoubleBuffer ptr, int flags) { + nje_dallocx(memAddress(ptr), flags); + } + + /** + * Causes the memory referenced by {@code ptr} to be made available for future allocations. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_dallocx(@NativeType("void *") PointerBuffer ptr, int flags) { + nje_dallocx(memAddress(ptr), flags); + } + + // --- [ je_sdallocx ] --- + + /** + * Unsafe version of: {@link #je_sdallocx sdallocx} + * + * @param size the number of bytes in {@code ptr} + */ + public static void nje_sdallocx(long ptr, long size, int flags) { + long __functionAddress = Functions.sdallocx; + invokePPV(ptr, size, flags, __functionAddress); + } + + /** + * Sized version of {@link #je_dallocx dallocx}. The primary optimization over {@code dallocx()} is the removal of a metadata read, which often suffers an L1 cache miss. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_sdallocx(@NativeType("void *") ByteBuffer ptr, int flags) { + nje_sdallocx(memAddress(ptr), ptr.remaining(), flags); + } + + /** + * Sized version of {@link #je_dallocx dallocx}. The primary optimization over {@code dallocx()} is the removal of a metadata read, which often suffers an L1 cache miss. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_sdallocx(@NativeType("void *") ShortBuffer ptr, int flags) { + nje_sdallocx(memAddress(ptr), Integer.toUnsignedLong(ptr.remaining()) << 1, flags); + } + + /** + * Sized version of {@link #je_dallocx dallocx}. The primary optimization over {@code dallocx()} is the removal of a metadata read, which often suffers an L1 cache miss. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_sdallocx(@NativeType("void *") IntBuffer ptr, int flags) { + nje_sdallocx(memAddress(ptr), Integer.toUnsignedLong(ptr.remaining()) << 2, flags); + } + + /** + * Sized version of {@link #je_dallocx dallocx}. The primary optimization over {@code dallocx()} is the removal of a metadata read, which often suffers an L1 cache miss. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_sdallocx(@NativeType("void *") LongBuffer ptr, int flags) { + nje_sdallocx(memAddress(ptr), Integer.toUnsignedLong(ptr.remaining()) << 3, flags); + } + + /** + * Sized version of {@link #je_dallocx dallocx}. The primary optimization over {@code dallocx()} is the removal of a metadata read, which often suffers an L1 cache miss. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_sdallocx(@NativeType("void *") FloatBuffer ptr, int flags) { + nje_sdallocx(memAddress(ptr), Integer.toUnsignedLong(ptr.remaining()) << 2, flags); + } + + /** + * Sized version of {@link #je_dallocx dallocx}. The primary optimization over {@code dallocx()} is the removal of a metadata read, which often suffers an L1 cache miss. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_sdallocx(@NativeType("void *") DoubleBuffer ptr, int flags) { + nje_sdallocx(memAddress(ptr), Integer.toUnsignedLong(ptr.remaining()) << 3, flags); + } + + /** + * Sized version of {@link #je_dallocx dallocx}. The primary optimization over {@code dallocx()} is the removal of a metadata read, which often suffers an L1 cache miss. + * + * @param ptr the allocated memory to deallocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + public static void je_sdallocx(@NativeType("void *") PointerBuffer ptr, int flags) { + nje_sdallocx(memAddress(ptr), Integer.toUnsignedLong(ptr.remaining()) << POINTER_SHIFT, flags); + } + + // --- [ je_nallocx ] --- + + /** Unsafe version of: {@link #je_nallocx nallocx} */ + public static long nje_nallocx(long size, int flags) { + long __functionAddress = Functions.nallocx; + return invokePP(size, flags, __functionAddress); + } + + /** + * Allocates no memory, but it performs the same size computation as the {@link #je_mallocx mallocx} function, and returns the real size of the allocation that would + * result from the equivalent {@code mallocx()} function call. Behavior is undefined if {@code size} is 0, or if request size overflows due to size class + * and/or alignment constraints. + * + * @param size the number of bytes to allocate + * @param flags a bitfield of zero or more of the {@code MALLOCX} macros + */ + @Nullable + @NativeType("void *") + public static ByteBuffer je_nallocx(@NativeType("size_t") long size, int flags) { + long __result = nje_nallocx(size, flags); + return memByteBufferSafe(__result, (int)size); + } + + // --- [ je_mallctl ] --- + + /** + * Unsafe version of: {@link #je_mallctl mallctl} + * + * @param newlen the new value length + */ + public static int nje_mallctl(long name, long oldp, long oldlenp, long newp, long newlen) { + long __functionAddress = Functions.mallctl; + return invokePPPPPI(name, oldp, oldlenp, newp, newlen, __functionAddress); + } + + /** + * Provides a general interface for introspecting the memory allocator, as well as setting modifiable parameters and triggering actions. The + * period-separated {@code name} argument specifies a location in a tree-structured namespace; see the + * MALLCTL NAMESPACE section for + * documentation on the tree contents. To read a value, pass a pointer via {@code oldp} to adequate space to contain the value, and a pointer to its + * length via {@code oldlenp}; otherwise pass {@code NULL} and {@code NULL}. Similarly, to write a value, pass a pointer to the value via {@code newp}, and its length + * via {@code newlen}; otherwise pass {@code NULL} and {@code 0}. + * + * @param name the namespace location + * @param oldp returns a value + * @param oldlenp returns the value length + * @param newp the new value + */ + public static int je_mallctl(@NativeType("char const *") ByteBuffer name, @Nullable @NativeType("void *") ByteBuffer oldp, @Nullable @NativeType("size_t *") PointerBuffer oldlenp, @Nullable @NativeType("void *") ByteBuffer newp) { + if (CHECKS) { + checkNT1(name); + checkSafe(oldlenp, 1); + } + return nje_mallctl(memAddress(name), memAddressSafe(oldp), memAddressSafe(oldlenp), memAddressSafe(newp), remainingSafe(newp)); + } + + /** + * Provides a general interface for introspecting the memory allocator, as well as setting modifiable parameters and triggering actions. The + * period-separated {@code name} argument specifies a location in a tree-structured namespace; see the + * MALLCTL NAMESPACE section for + * documentation on the tree contents. To read a value, pass a pointer via {@code oldp} to adequate space to contain the value, and a pointer to its + * length via {@code oldlenp}; otherwise pass {@code NULL} and {@code NULL}. Similarly, to write a value, pass a pointer to the value via {@code newp}, and its length + * via {@code newlen}; otherwise pass {@code NULL} and {@code 0}. + * + * @param name the namespace location + * @param oldp returns a value + * @param oldlenp returns the value length + * @param newp the new value + */ + public static int je_mallctl(@NativeType("char const *") CharSequence name, @Nullable @NativeType("void *") ByteBuffer oldp, @Nullable @NativeType("size_t *") PointerBuffer oldlenp, @Nullable @NativeType("void *") ByteBuffer newp) { + if (CHECKS) { + checkSafe(oldlenp, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nje_mallctl(nameEncoded, memAddressSafe(oldp), memAddressSafe(oldlenp), memAddressSafe(newp), remainingSafe(newp)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ je_mallctlnametomib ] --- + + /** + * Unsafe version of: {@link #je_mallctlnametomib mallctlnametomib} + * + * @param miblenp the number of components in {@code mibp} + */ + public static int nje_mallctlnametomib(long name, long mibp, long miblenp) { + long __functionAddress = Functions.mallctlnametomib; + return invokePPPI(name, mibp, miblenp, __functionAddress); + } + + /** + * Provides a way to avoid repeated name lookups for applications that repeatedly query the same portion of the namespace, by translating a name to a + * “Management Information Base” (MIB) that can be passed repeatedly to {@link #je_mallctlbymib mallctlbymib}. Upon successful return from {@code mallctlnametomib()}, + * {@code mibp} contains an array of {@code *miblenp} integers, where {@code *miblenp} is the lesser of the number of components in name and the input + * value of {@code *miblenp}. Thus it is possible to pass a {@code *miblenp} that is smaller than the number of period-separated name components, which + * results in a partial MIB that can be used as the basis for constructing a complete MIB. For name components that are integers (e.g. the 2 in + * "arenas.bin.2.size"), the corresponding MIB component will always be that integer. Therefore, it is legitimate to construct code like the following: + * + *
    
    +     * unsigned nbins, i;
    +     * size_t mib[4];
    +     * size_t len, miblen;
    +     * 
    +     * len = sizeof(nbins);
    +     * mallctl("arenas.nbins", &nbins, &len, NULL, 0);
    +     * 
    +     * miblen = 4;
    +     * mallctlnametomib("arenas.bin.0.size", mib, &miblen);
    +     * for (i = 0; i < nbins; i++) {
    +     *     size_t bin_size;
    +     * 
    +     *     mib[2] = i;
    +     *     len = sizeof(bin_size);
    +     *     mallctlbymib(mib, miblen, &bin_size, &len, NULL, 0);
    +     *     // Do something with bin_size...
    +     * }
    + * + * @param name the namespace location + * @param mibp an array of integers + * @param miblenp the number of components in {@code mibp} + */ + public static int je_mallctlnametomib(@NativeType("char const *") ByteBuffer name, @NativeType("size_t *") PointerBuffer mibp, @NativeType("size_t *") PointerBuffer miblenp) { + if (CHECKS) { + checkNT1(name); + check(miblenp, 1); + check(mibp, miblenp.get(miblenp.position())); + } + return nje_mallctlnametomib(memAddress(name), memAddress(mibp), memAddress(miblenp)); + } + + /** + * Provides a way to avoid repeated name lookups for applications that repeatedly query the same portion of the namespace, by translating a name to a + * “Management Information Base” (MIB) that can be passed repeatedly to {@link #je_mallctlbymib mallctlbymib}. Upon successful return from {@code mallctlnametomib()}, + * {@code mibp} contains an array of {@code *miblenp} integers, where {@code *miblenp} is the lesser of the number of components in name and the input + * value of {@code *miblenp}. Thus it is possible to pass a {@code *miblenp} that is smaller than the number of period-separated name components, which + * results in a partial MIB that can be used as the basis for constructing a complete MIB. For name components that are integers (e.g. the 2 in + * "arenas.bin.2.size"), the corresponding MIB component will always be that integer. Therefore, it is legitimate to construct code like the following: + * + *
    
    +     * unsigned nbins, i;
    +     * size_t mib[4];
    +     * size_t len, miblen;
    +     * 
    +     * len = sizeof(nbins);
    +     * mallctl("arenas.nbins", &nbins, &len, NULL, 0);
    +     * 
    +     * miblen = 4;
    +     * mallctlnametomib("arenas.bin.0.size", mib, &miblen);
    +     * for (i = 0; i < nbins; i++) {
    +     *     size_t bin_size;
    +     * 
    +     *     mib[2] = i;
    +     *     len = sizeof(bin_size);
    +     *     mallctlbymib(mib, miblen, &bin_size, &len, NULL, 0);
    +     *     // Do something with bin_size...
    +     * }
    + * + * @param name the namespace location + * @param mibp an array of integers + * @param miblenp the number of components in {@code mibp} + */ + public static int je_mallctlnametomib(@NativeType("char const *") CharSequence name, @NativeType("size_t *") PointerBuffer mibp, @NativeType("size_t *") PointerBuffer miblenp) { + if (CHECKS) { + check(miblenp, 1); + check(mibp, miblenp.get(miblenp.position())); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nje_mallctlnametomib(nameEncoded, memAddress(mibp), memAddress(miblenp)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ je_mallctlbymib ] --- + + /** + * Unsafe version of: {@link #je_mallctlbymib mallctlbymib} + * + * @param miblen the number of elements in {@code mib} + * @param newlen the new value length + */ + public static int nje_mallctlbymib(long mib, long miblen, long oldp, long oldlenp, long newp, long newlen) { + long __functionAddress = Functions.mallctlbymib; + return invokePPPPPPI(mib, miblen, oldp, oldlenp, newp, newlen, __functionAddress); + } + + /** + * Similar to {@link #je_mallctl mallctl}, but uses MIBs instead of names. See {@link #je_mallctlnametomib mallctlnametomib} for details. + * + * @param mib a MIB + * @param oldp returns a value + * @param oldlenp returns the value length + * @param newp the new value + */ + public static int je_mallctlbymib(@NativeType("size_t const *") PointerBuffer mib, @Nullable @NativeType("void *") ByteBuffer oldp, @Nullable @NativeType("size_t *") PointerBuffer oldlenp, @Nullable @NativeType("void *") ByteBuffer newp) { + if (CHECKS) { + checkSafe(oldlenp, 1); + } + return nje_mallctlbymib(memAddress(mib), mib.remaining(), memAddressSafe(oldp), memAddressSafe(oldlenp), memAddressSafe(newp), remainingSafe(newp)); + } + + // --- [ je_malloc_stats_print ] --- + + /** Unsafe version of: {@link #je_malloc_stats_print malloc_stats_print} */ + public static void nje_malloc_stats_print(long write_cb, long cbopaque, long opts) { + long __functionAddress = Functions.malloc_stats_print; + invokePPPV(write_cb, cbopaque, opts, __functionAddress); + } + + /** + * Writes human-readable summary statistics via the {@code write_cb} callback function pointer and {@code cbopaque} data passed to {@code write_cb}, or + * {@code malloc_message()} if {@code write_cb} is {@code NULL}. This function can be called repeatedly. General information that never changes during execution + * can be omitted by specifying "g" as a character within the {@code opts} string. Note that {@code malloc_message()} uses the {@code mallctl*()} + * functions internally, so inconsistent statistics can be reported if multiple threads use these functions simultaneously. If {@code --enable-stats} is + * specified during configuration, “m” and “a” can be specified to omit merged arena and per arena statistics, respectively; “b” and “l” can be specified to + * omit per size class statistics for bins and large objects, respectively. Unrecognized characters are silently ignored. Note that thread caching may + * prevent some statistics from being completely up to date, since extra locking would be required to merge counters that track thread cache operations. + * + * @param write_cb the print callback, or {@code NULL} to use {@code malloc_message()} + * @param cbopaque an opaque pointer that will be passed to {@code write_cb} + * @param opts an options string + */ + public static void je_malloc_stats_print(@Nullable @NativeType("void (*) (void *, char const *)") MallocMessageCallbackI write_cb, @NativeType("void *") long cbopaque, @Nullable @NativeType("char const *") ByteBuffer opts) { + if (CHECKS) { + checkNT1Safe(opts); + } + nje_malloc_stats_print(memAddressSafe(write_cb), cbopaque, memAddressSafe(opts)); + } + + /** + * Writes human-readable summary statistics via the {@code write_cb} callback function pointer and {@code cbopaque} data passed to {@code write_cb}, or + * {@code malloc_message()} if {@code write_cb} is {@code NULL}. This function can be called repeatedly. General information that never changes during execution + * can be omitted by specifying "g" as a character within the {@code opts} string. Note that {@code malloc_message()} uses the {@code mallctl*()} + * functions internally, so inconsistent statistics can be reported if multiple threads use these functions simultaneously. If {@code --enable-stats} is + * specified during configuration, “m” and “a” can be specified to omit merged arena and per arena statistics, respectively; “b” and “l” can be specified to + * omit per size class statistics for bins and large objects, respectively. Unrecognized characters are silently ignored. Note that thread caching may + * prevent some statistics from being completely up to date, since extra locking would be required to merge counters that track thread cache operations. + * + * @param write_cb the print callback, or {@code NULL} to use {@code malloc_message()} + * @param cbopaque an opaque pointer that will be passed to {@code write_cb} + * @param opts an options string + */ + public static void je_malloc_stats_print(@Nullable @NativeType("void (*) (void *, char const *)") MallocMessageCallbackI write_cb, @NativeType("void *") long cbopaque, @Nullable @NativeType("char const *") CharSequence opts) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCIISafe(opts, true); + long optsEncoded = opts == null ? NULL : stack.getPointerAddress(); + nje_malloc_stats_print(memAddressSafe(write_cb), cbopaque, optsEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ je_malloc_usable_size ] --- + + /** Unsafe version of: {@link #je_malloc_usable_size malloc_usable_size} */ + public static long nje_malloc_usable_size(long ptr) { + long __functionAddress = Functions.malloc_usable_size; + return invokePP(ptr, __functionAddress); + } + + /** + * Returns the usable size of the allocation pointed to by {@code ptr}. The return value may be larger than the size that was requested during allocation. + * The {@code malloc_usable_size()} function is not a mechanism for in-place {@link #je_realloc realloc}; rather it is provided solely as a tool for introspection + * purposes. Any discrepancy between the requested allocation size and the size reported by {@code malloc_usable_size()} should not be depended on, since + * such behavior is entirely implementation-dependent. + * + * @param ptr the allocated memory to query + */ + @NativeType("size_t") + public static long je_malloc_usable_size(@NativeType("void const *") ByteBuffer ptr) { + return nje_malloc_usable_size(memAddress(ptr)); + } + + /** + * Align the memory allocation to start at an address that is a multiple of {@code (1 << la)}. This macro does not validate that {@code la} is within the + * valid range. + * + * @param la the alignment shift + */ + public static int MALLOCX_LG_ALIGN(int la) { + return la; + } + + /** + * Align the memory allocation to start at an address that is a multiple of {@code a}, where {@code a} is a power of two. This macro does not validate + * that {@code a} is a power of 2. + * + * @param a the alignment + */ + public static int MALLOCX_ALIGN(int a) { + return Integer.numberOfTrailingZeros(a); + } + + /** + * Use the thread-specific cache (tcache) specified by the identifier {@code tc}, which must have been acquired via the {@code tcache.create} mallctl. + * This macro does not validate that {@code tc} specifies a valid identifier. + * + * @param tc the thread-specific cache + */ + public static int MALLOCX_TCACHE(int tc) { + return (tc + 2) << 8; + } + + /** + * Use the arena specified by the index {@code a} (and by necessity bypass the thread cache). This macro has no effect for huge regions, nor for regions + * that were allocated via an arena other than the one specified. This macro does not validate that {@code a} specifies an arena index in the valid range. + * + * @param a the arena index + */ + public static int MALLOCX_ARENA(int a) { + return (a + 1) << 20; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/JEmallocAllocator.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/JEmallocAllocator.java new file mode 100644 index 000000000..83efa9976 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/JEmallocAllocator.java @@ -0,0 +1,68 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import org.lwjgl.system.MemoryUtil.*; + +import static org.lwjgl.system.jemalloc.JEmalloc.*; + +/** A {@link MemoryAllocator} implementation using the jemalloc library. */ +public class JEmallocAllocator implements MemoryAllocator { + + static { + // initialize jemalloc + JEmalloc.getLibrary(); + } + + @Override + public long getMalloc() { return Functions.malloc; } + + @Override + public long getCalloc() { return Functions.calloc; } + + @Override + public long getRealloc() { return Functions.realloc; } + + @Override + public long getFree() { return Functions.free; } + + @Override + public long getAlignedAlloc() { return Functions.aligned_alloc; } + + @Override + public long getAlignedFree() { return Functions.free; } + + @Override + public long malloc(long size) { + return nje_malloc(size); + } + + @Override + public long calloc(long num, long size) { + return nje_calloc(num, size); + } + + @Override + public long realloc(long ptr, long size) { + return nje_realloc(ptr, size); + } + + @Override + public void free(long ptr) { + nje_free(ptr); + } + + @Override + public long aligned_alloc(long alignment, long size) { + return nje_aligned_alloc(alignment, size); + } + + @Override + public void aligned_free(long ptr) { + nje_free(ptr); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/MallocMessageCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/MallocMessageCallback.java new file mode 100644 index 000000000..4539db4e5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/MallocMessageCallback.java @@ -0,0 +1,89 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be passed to the {@link JEmalloc#je_malloc_usable_size malloc_usable_size} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     void *cbopaque,
    + *     char const *s
    + * )
    + */ +public abstract class MallocMessageCallback extends Callback implements MallocMessageCallbackI { + + /** + * Creates a {@code MallocMessageCallback} instance from the specified function pointer. + * + * @return the new {@code MallocMessageCallback} + */ + public static MallocMessageCallback create(long functionPointer) { + MallocMessageCallbackI instance = Callback.get(functionPointer); + return instance instanceof MallocMessageCallback + ? (MallocMessageCallback)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static MallocMessageCallback createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code MallocMessageCallback} instance that delegates to the specified {@code MallocMessageCallbackI} instance. */ + public static MallocMessageCallback create(MallocMessageCallbackI instance) { + return instance instanceof MallocMessageCallback + ? (MallocMessageCallback)instance + : new Container(instance.address(), instance); + } + + protected MallocMessageCallback() { + super(CIF); + } + + MallocMessageCallback(long functionPointer) { + super(functionPointer); + } + + /** + * Converts the specified {@link MallocMessageCallback} arguments to a String. + * + *

    This method may only be used inside a MallocMessageCallback invocation.

    + * + * @param s the MallocMessageCallback {@code s} argument + * + * @return the message as a String + */ + public static String getMessage(long s) { + return memASCII(s); + } + + private static final class Container extends MallocMessageCallback { + + private final MallocMessageCallbackI delegate; + + Container(long functionPointer, MallocMessageCallbackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long cbopaque, long s) { + delegate.invoke(cbopaque, s); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/MallocMessageCallbackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/MallocMessageCallbackI.java new file mode 100644 index 000000000..c7cf1aa8d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jemalloc/MallocMessageCallbackI.java @@ -0,0 +1,55 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jemalloc; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link JEmalloc#je_malloc_usable_size malloc_usable_size} method. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     void *cbopaque,
    + *     char const *s
    + * )
    + */ +@FunctionalInterface +@NativeType("void (*) (void *, char const *)") +public interface MallocMessageCallbackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + } + + /** + * Will be called by the {@link JEmalloc#je_malloc_usable_size malloc_usable_size} method. + * + * @param cbopaque the opaque pointer passed to {@link JEmalloc#je_malloc_usable_size malloc_usable_size} + * @param s the message + */ + void invoke(@NativeType("void *") long cbopaque, @NativeType("char const *") long s); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jni/JNINativeInterface.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jni/JNINativeInterface.java new file mode 100644 index 000000000..d431387f9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jni/JNINativeInterface.java @@ -0,0 +1,1141 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jni; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +import java.lang.reflect.*; + +/** + * Bindings to the Java Native Interface (JNI). + * + *

    The JNI is a native programming interface. It allows Java code that runs inside a Java Virtual Machine (VM) to interoperate with applications and + * libraries written in other programming languages, such as C, C++, and assembly.

    + * + *

    The most important benefit of the JNI is that it imposes no restrictions on the implementation of the underlying Java VM. Therefore, Java VM vendors + * can add support for the JNI without affecting other parts of the VM. Programmers can write one version of a native application or library and expect it + * to work with all Java VMs supporting the JNI.

    + * + *

    LWJGL: Only functions that can reasonably be called from Java are exposed.

    + */ +public class JNINativeInterface { + + static { Library.initialize(); } + + /** JNI versions. */ + public static final int + JNI_VERSION_1_1 = 0x10001, + JNI_VERSION_1_2 = 0x10002, + JNI_VERSION_1_4 = 0x10004, + JNI_VERSION_1_6 = 0x10006, + JNI_VERSION_1_8 = 0x10008, + JNI_VERSION_9 = 0x90000, + JNI_VERSION_10 = 0xA0000, + JNI_VERSION_19 = 0x130000, + JNI_VERSION_20 = 0x140000, + JNI_VERSION_21 = 0x150000; + + /** + * {@code jobjectRefType}: Return values from {@link #GetObjectRefType}. + * + *
    Enum values:
    + * + *
      + *
    • {@link #JNIInvalidRefType JNIInvalidRefType}
    • + *
    • {@link #JNILocalRefType JNILocalRefType}
    • + *
    • {@link #JNIGlobalRefType JNIGlobalRefType}
    • + *
    • {@link #JNIWeakGlobalRefType JNIWeakGlobalRefType}
    • + *
    + */ + public static final int + JNIInvalidRefType = 0, + JNILocalRefType = 1, + JNIGlobalRefType = 2, + JNIWeakGlobalRefType = 3; + + /** jboolean constants. */ + public static final int + JNI_FALSE = 0, + JNI_TRUE = 1; + + /** + * Possible return values for JNI functions. + * + *
    Enum values:
    + * + *
      + *
    • {@link #JNI_OK OK} - success
    • + *
    • {@link #JNI_ERR ERR} - unknown error
    • + *
    • {@link #JNI_EDETACHED EDETACHED} - thread detached from the VM
    • + *
    • {@link #JNI_EVERSION EVERSION} - JNI version error
    • + *
    • {@link #JNI_ENOMEM ENOMEM} - not enough memory
    • + *
    • {@link #JNI_EEXIST EEXIST} - VM already created
    • + *
    • {@link #JNI_EINVAL EINVAL} - invalid arguments
    • + *
    + */ + public static final int + JNI_OK = 0, + JNI_ERR = (-1), + JNI_EDETACHED = (-2), + JNI_EVERSION = (-3), + JNI_ENOMEM = (-4), + JNI_EEXIST = (-5), + JNI_EINVAL = (-6); + + /** Used in {@code ReleaseScalarArrayElements}. */ + public static final int + JNI_COMMIT = 1, + JNI_ABORT = 2; + + protected JNINativeInterface() { + throw new UnsupportedOperationException(); + } + + // --- [ GetVersion ] --- + + /** + * Returns the version of the native method interface. + * + * @return the major version number in the higher 16 bits and the minor version number in the lower 16 bits + */ + @NativeType("jint") + public static native int GetVersion(); + + // --- [ FromReflectedMethod ] --- + + /** Converts a {@link Method} or {@link Constructor} object to a method ID. */ + @NativeType("jmethodID") + public static native long FromReflectedMethod(@NativeType("jobject") Method method); + + // --- [ FromReflectedField ] --- + + /** Converts a {@link Field} to a field ID. */ + @NativeType("jfieldID") + public static native long FromReflectedField(@NativeType("jobject") Field field); + + // --- [ ToReflectedMethod ] --- + + /** Unsafe version of: {@link #ToReflectedMethod} */ + @Nullable + public static native Method nToReflectedMethod(Class cls, long methodID, boolean isStatic); + + /** + * Converts a method ID derived from {@code cls} to a {@link Method} or {@link Constructor} object. + * + * @param isStatic must be set to {@link #JNI_TRUE TRUE} if the method ID refers to a static field, and # FALSE otherwise + */ + @Nullable + @NativeType("jobject") + public static Method ToReflectedMethod(@NativeType("jclass") Class cls, @NativeType("jmethodID") long methodID, @NativeType("jboolean") boolean isStatic) { + if (CHECKS) { + check(methodID); + } + return nToReflectedMethod(cls, methodID, isStatic); + } + + // --- [ ToReflectedField ] --- + + /** Unsafe version of: {@link #ToReflectedField} */ + @Nullable + public static native Field nToReflectedField(Class cls, long fieldID, boolean isStatic); + + /** + * Converts a field ID derived from {@code cls} to a {@link Field} object. + * + * @param isStatic must be set to {@link #JNI_TRUE TRUE} if {@code fieldID} refers to a static field, and {@link #JNI_FALSE FALSE} otherwise + */ + @Nullable + @NativeType("jobject") + public static Field ToReflectedField(@NativeType("jclass") Class cls, @NativeType("jfieldID") long fieldID, @NativeType("jboolean") boolean isStatic) { + if (CHECKS) { + check(fieldID); + } + return nToReflectedField(cls, fieldID, isStatic); + } + + // --- [ NewGlobalRef ] --- + + /** + * Creates a new global reference to the object referred to by the {@code obj} argument. The {@code obj} argument may be a global or local reference. + * Global references must be explicitly disposed of by calling {@link #DeleteGlobalRef}. + * + * @param obj a global or local reference + * + * @return a global reference, or {@code NULL} if the system runs out of memory + */ + @NativeType("void *") + public static native long NewGlobalRef(@NativeType("jobject") Object obj); + + // --- [ DeleteGlobalRef ] --- + + /** Unsafe version of: {@link #DeleteGlobalRef} */ + public static native void nDeleteGlobalRef(long globalRef); + + /** + * Deletes the global reference pointed to by {@code globalRef}. + * + * @param globalRef a global reference + */ + public static void DeleteGlobalRef(@NativeType("void *") long globalRef) { + if (CHECKS) { + check(globalRef); + } + nDeleteGlobalRef(globalRef); + } + + // --- [ GetBooleanArrayElements ] --- + + /** Unsafe version of: {@link #GetBooleanArrayElements} */ + public static native long nGetBooleanArrayElements(byte[] array, long isCopy); + + /** + * Returns the body of the primitive array. The result is valid until the {@link #ReleaseBooleanArrayElements} function is called. Since the returned array + * may be a copy of the Java array, changes made to the returned array will not necessarily be reflected in the original array until + * {@link #ReleaseBooleanArrayElements} is called. + * + *

    If {@code isCopy} is not {@code NULL}, then {@code *isCopy} is set to {@link #JNI_TRUE TRUE} if a copy is made; or it is set to {@link #JNI_FALSE FALSE} if no copy is made.

    + * + * @param array the primitive array + * @param isCopy a pointer to a boolean + * + * @return a pointer to the array elements, or {@code NULL} if the operation fails + */ + @Nullable + @NativeType("jboolean *") + public static ByteBuffer GetBooleanArrayElements(@NativeType("jbooleanArray") byte[] array, @Nullable @NativeType("jboolean *") ByteBuffer isCopy) { + if (CHECKS) { + checkSafe(isCopy, 1); + } + long __result = nGetBooleanArrayElements(array, memAddressSafe(isCopy)); + return memByteBufferSafe(__result, array.length); + } + + // --- [ ReleaseBooleanArrayElements ] --- + + /** Unsafe version of: {@link #ReleaseBooleanArrayElements} */ + public static native void nReleaseBooleanArrayElements(byte[] array, long elems, int mode); + + /** + * Informs the VM that the native code no longer needs access to {@code elems}. The {@code elems} argument is a pointer derived from array using the + * {@link #GetBooleanArrayElements} function. If necessary, this function copies back all changes made to elems to the original array. + * + *

    The {@code mode} argument provides information on how the array buffer should be released. {@code mode} has no effect if {@code elems} is not a + * copy of the elements in array. Otherwise, mode has the following impact, as shown in the following table:

    + * + * + * + * + * + * + *
    modeactions
    0copy back the content and free the elems buffer
    {@link #JNI_COMMIT COMMIT}copy back the content but do not free the elems buffer
    {@link #JNI_ABORT ABORT}free the buffer without copying back the possible changes
    + * + *

    In most cases, programmers pass “0” to the mode argument to ensure consistent behavior for both pinned and copied arrays. The other options give + * the programmer more control over memory management and should be used with extreme care.

    + * + * @param array a Java array object + * @param elems a pointer to array elements + * @param mode the release mode. One of:
    0{@link #JNI_COMMIT COMMIT}{@link #JNI_ABORT ABORT}
    + */ + public static void ReleaseBooleanArrayElements(@NativeType("jbooleanArray") byte[] array, @NativeType("jboolean *") ByteBuffer elems, @NativeType("jint") int mode) { + nReleaseBooleanArrayElements(array, memAddress(elems), mode); + } + + // --- [ GetByteArrayElements ] --- + + /** Unsafe version of: {@link #GetByteArrayElements} */ + public static native long nGetByteArrayElements(byte[] array, long isCopy); + + /** + * Returns the body of the primitive array. The result is valid until the {@link #ReleaseByteArrayElements} function is called. Since the returned array + * may be a copy of the Java array, changes made to the returned array will not necessarily be reflected in the original array until + * {@link #ReleaseByteArrayElements} is called. + * + *

    If {@code isCopy} is not {@code NULL}, then {@code *isCopy} is set to {@link #JNI_TRUE TRUE} if a copy is made; or it is set to {@link #JNI_FALSE FALSE} if no copy is made.

    + * + * @param array the primitive array + * @param isCopy a pointer to a boolean + * + * @return a pointer to the array elements, or {@code NULL} if the operation fails + */ + @Nullable + @NativeType("jbyte *") + public static ByteBuffer GetByteArrayElements(@NativeType("jbyteArray") byte[] array, @Nullable @NativeType("jboolean *") ByteBuffer isCopy) { + if (CHECKS) { + checkSafe(isCopy, 1); + } + long __result = nGetByteArrayElements(array, memAddressSafe(isCopy)); + return memByteBufferSafe(__result, array.length); + } + + // --- [ ReleaseByteArrayElements ] --- + + /** Unsafe version of: {@link #ReleaseByteArrayElements} */ + public static native void nReleaseByteArrayElements(byte[] array, long elems, int mode); + + /** + * Informs the VM that the native code no longer needs access to {@code elems}. The {@code elems} argument is a pointer derived from array using the + * {@link #GetByteArrayElements} function. If necessary, this function copies back all changes made to elems to the original array. + * + *

    The {@code mode} argument provides information on how the array buffer should be released. {@code mode} has no effect if {@code elems} is not a + * copy of the elements in array. Otherwise, mode has the following impact, as shown in the following table:

    + * + * + * + * + * + * + *
    modeactions
    0copy back the content and free the elems buffer
    {@link #JNI_COMMIT COMMIT}copy back the content but do not free the elems buffer
    {@link #JNI_ABORT ABORT}free the buffer without copying back the possible changes
    + * + *

    In most cases, programmers pass “0” to the mode argument to ensure consistent behavior for both pinned and copied arrays. The other options give + * the programmer more control over memory management and should be used with extreme care.

    + * + * @param array a Java array object + * @param elems a pointer to array elements + * @param mode the release mode. One of:
    0{@link #JNI_COMMIT COMMIT}{@link #JNI_ABORT ABORT}
    + */ + public static void ReleaseByteArrayElements(@NativeType("jbyteArray") byte[] array, @NativeType("jbyte *") ByteBuffer elems, @NativeType("jint") int mode) { + nReleaseByteArrayElements(array, memAddress(elems), mode); + } + + // --- [ GetCharArrayElements ] --- + + /** Unsafe version of: {@link #GetCharArrayElements} */ + public static native long nGetCharArrayElements(char[] array, long isCopy); + + /** + * Returns the body of the primitive array. The result is valid until the {@link #ReleaseCharArrayElements} function is called. Since the returned array + * may be a copy of the Java array, changes made to the returned array will not necessarily be reflected in the original array until + * {@link #ReleaseCharArrayElements} is called. + * + *

    If {@code isCopy} is not {@code NULL}, then {@code *isCopy} is set to {@link #JNI_TRUE TRUE} if a copy is made; or it is set to {@link #JNI_FALSE FALSE} if no copy is made.

    + * + * @param array the primitive array + * @param isCopy a pointer to a boolean + * + * @return a pointer to the array elements, or {@code NULL} if the operation fails + */ + @Nullable + @NativeType("jchar *") + public static ShortBuffer GetCharArrayElements(@NativeType("jcharArray") char[] array, @Nullable @NativeType("jboolean *") ByteBuffer isCopy) { + if (CHECKS) { + checkSafe(isCopy, 1); + } + long __result = nGetCharArrayElements(array, memAddressSafe(isCopy)); + return memShortBufferSafe(__result, array.length); + } + + // --- [ ReleaseCharArrayElements ] --- + + /** Unsafe version of: {@link #ReleaseCharArrayElements} */ + public static native void nReleaseCharArrayElements(char[] array, long elems, int mode); + + /** + * Informs the VM that the native code no longer needs access to {@code elems}. The {@code elems} argument is a pointer derived from array using the + * {@link #GetCharArrayElements} function. If necessary, this function copies back all changes made to elems to the original array. + * + *

    The {@code mode} argument provides information on how the array buffer should be released. {@code mode} has no effect if {@code elems} is not a + * copy of the elements in array. Otherwise, mode has the following impact, as shown in the following table:

    + * + * + * + * + * + * + *
    modeactions
    0copy back the content and free the elems buffer
    {@link #JNI_COMMIT COMMIT}copy back the content but do not free the elems buffer
    {@link #JNI_ABORT ABORT}free the buffer without copying back the possible changes
    + * + *

    In most cases, programmers pass “0” to the mode argument to ensure consistent behavior for both pinned and copied arrays. The other options give + * the programmer more control over memory management and should be used with extreme care.

    + * + * @param array a Java array object + * @param elems a pointer to array elements + * @param mode the release mode. One of:
    0{@link #JNI_COMMIT COMMIT}{@link #JNI_ABORT ABORT}
    + */ + public static void ReleaseCharArrayElements(@NativeType("jcharArray") char[] array, @NativeType("jchar *") ShortBuffer elems, @NativeType("jint") int mode) { + nReleaseCharArrayElements(array, memAddress(elems), mode); + } + + // --- [ GetShortArrayElements ] --- + + /** Unsafe version of: {@link #GetShortArrayElements} */ + public static native long nGetShortArrayElements(short[] array, long isCopy); + + /** + * Returns the body of the primitive array. The result is valid until the {@link #ReleaseShortArrayElements} function is called. Since the returned array + * may be a copy of the Java array, changes made to the returned array will not necessarily be reflected in the original array until + * {@link #ReleaseShortArrayElements} is called. + * + *

    If {@code isCopy} is not {@code NULL}, then {@code *isCopy} is set to {@link #JNI_TRUE TRUE} if a copy is made; or it is set to {@link #JNI_FALSE FALSE} if no copy is made.

    + * + * @param array the primitive array + * @param isCopy a pointer to a boolean + * + * @return a pointer to the array elements, or {@code NULL} if the operation fails + */ + @Nullable + @NativeType("jshort *") + public static ShortBuffer GetShortArrayElements(@NativeType("jshortArray") short[] array, @Nullable @NativeType("jboolean *") ByteBuffer isCopy) { + if (CHECKS) { + checkSafe(isCopy, 1); + } + long __result = nGetShortArrayElements(array, memAddressSafe(isCopy)); + return memShortBufferSafe(__result, array.length); + } + + // --- [ ReleaseShortArrayElements ] --- + + /** Unsafe version of: {@link #ReleaseShortArrayElements} */ + public static native void nReleaseShortArrayElements(short[] array, long elems, int mode); + + /** + * Informs the VM that the native code no longer needs access to {@code elems}. The {@code elems} argument is a pointer derived from array using the + * {@link #GetShortArrayElements} function. If necessary, this function copies back all changes made to elems to the original array. + * + *

    The {@code mode} argument provides information on how the array buffer should be released. {@code mode} has no effect if {@code elems} is not a + * copy of the elements in array. Otherwise, mode has the following impact, as shown in the following table:

    + * + * + * + * + * + * + *
    modeactions
    0copy back the content and free the elems buffer
    {@link #JNI_COMMIT COMMIT}copy back the content but do not free the elems buffer
    {@link #JNI_ABORT ABORT}free the buffer without copying back the possible changes
    + * + *

    In most cases, programmers pass “0” to the mode argument to ensure consistent behavior for both pinned and copied arrays. The other options give + * the programmer more control over memory management and should be used with extreme care.

    + * + * @param array a Java array object + * @param elems a pointer to array elements + * @param mode the release mode. One of:
    0{@link #JNI_COMMIT COMMIT}{@link #JNI_ABORT ABORT}
    + */ + public static void ReleaseShortArrayElements(@NativeType("jshortArray") short[] array, @NativeType("jshort *") ShortBuffer elems, @NativeType("jint") int mode) { + nReleaseShortArrayElements(array, memAddress(elems), mode); + } + + // --- [ GetIntArrayElements ] --- + + /** Unsafe version of: {@link #GetIntArrayElements} */ + public static native long nGetIntArrayElements(int[] array, long isCopy); + + /** + * Returns the body of the primitive array. The result is valid until the {@link #ReleaseIntArrayElements} function is called. Since the returned array + * may be a copy of the Java array, changes made to the returned array will not necessarily be reflected in the original array until + * {@link #ReleaseIntArrayElements} is called. + * + *

    If {@code isCopy} is not {@code NULL}, then {@code *isCopy} is set to {@link #JNI_TRUE TRUE} if a copy is made; or it is set to {@link #JNI_FALSE FALSE} if no copy is made.

    + * + * @param array the primitive array + * @param isCopy a pointer to a boolean + * + * @return a pointer to the array elements, or {@code NULL} if the operation fails + */ + @Nullable + @NativeType("jint *") + public static IntBuffer GetIntArrayElements(@NativeType("jintArray") int[] array, @Nullable @NativeType("jboolean *") ByteBuffer isCopy) { + if (CHECKS) { + checkSafe(isCopy, 1); + } + long __result = nGetIntArrayElements(array, memAddressSafe(isCopy)); + return memIntBufferSafe(__result, array.length); + } + + // --- [ ReleaseIntArrayElements ] --- + + /** Unsafe version of: {@link #ReleaseIntArrayElements} */ + public static native void nReleaseIntArrayElements(int[] array, long elems, int mode); + + /** + * Informs the VM that the native code no longer needs access to {@code elems}. The {@code elems} argument is a pointer derived from array using the + * {@link #GetIntArrayElements} function. If necessary, this function copies back all changes made to elems to the original array. + * + *

    The {@code mode} argument provides information on how the array buffer should be released. {@code mode} has no effect if {@code elems} is not a + * copy of the elements in array. Otherwise, mode has the following impact, as shown in the following table:

    + * + * + * + * + * + * + *
    modeactions
    0copy back the content and free the elems buffer
    {@link #JNI_COMMIT COMMIT}copy back the content but do not free the elems buffer
    {@link #JNI_ABORT ABORT}free the buffer without copying back the possible changes
    + * + *

    In most cases, programmers pass “0” to the mode argument to ensure consistent behavior for both pinned and copied arrays. The other options give + * the programmer more control over memory management and should be used with extreme care.

    + * + * @param array a Java array object + * @param elems a pointer to array elements + * @param mode the release mode. One of:
    0{@link #JNI_COMMIT COMMIT}{@link #JNI_ABORT ABORT}
    + */ + public static void ReleaseIntArrayElements(@NativeType("jintArray") int[] array, @NativeType("jint *") IntBuffer elems, @NativeType("jint") int mode) { + nReleaseIntArrayElements(array, memAddress(elems), mode); + } + + // --- [ GetLongArrayElements ] --- + + /** Unsafe version of: {@link #GetLongArrayElements} */ + public static native long nGetLongArrayElements(long[] array, long isCopy); + + /** + * Returns the body of the primitive array. The result is valid until the {@link #ReleaseLongArrayElements} function is called. Since the returned array + * may be a copy of the Java array, changes made to the returned array will not necessarily be reflected in the original array until + * {@link #ReleaseLongArrayElements} is called. + * + *

    If {@code isCopy} is not {@code NULL}, then {@code *isCopy} is set to {@link #JNI_TRUE TRUE} if a copy is made; or it is set to {@link #JNI_FALSE FALSE} if no copy is made.

    + * + * @param array the primitive array + * @param isCopy a pointer to a boolean + * + * @return a pointer to the array elements, or {@code NULL} if the operation fails + */ + @Nullable + @NativeType("jlong *") + public static LongBuffer GetLongArrayElements(@NativeType("jlongArray") long[] array, @Nullable @NativeType("jboolean *") ByteBuffer isCopy) { + if (CHECKS) { + checkSafe(isCopy, 1); + } + long __result = nGetLongArrayElements(array, memAddressSafe(isCopy)); + return memLongBufferSafe(__result, array.length); + } + + // --- [ ReleaseLongArrayElements ] --- + + /** Unsafe version of: {@link #ReleaseLongArrayElements} */ + public static native void nReleaseLongArrayElements(long[] array, long elems, int mode); + + /** + * Informs the VM that the native code no longer needs access to {@code elems}. The {@code elems} argument is a pointer derived from array using the + * {@link #GetLongArrayElements} function. If necessary, this function copies back all changes made to elems to the original array. + * + *

    The {@code mode} argument provides information on how the array buffer should be released. {@code mode} has no effect if {@code elems} is not a + * copy of the elements in array. Otherwise, mode has the following impact, as shown in the following table:

    + * + * + * + * + * + * + *
    modeactions
    0copy back the content and free the elems buffer
    {@link #JNI_COMMIT COMMIT}copy back the content but do not free the elems buffer
    {@link #JNI_ABORT ABORT}free the buffer without copying back the possible changes
    + * + *

    In most cases, programmers pass “0” to the mode argument to ensure consistent behavior for both pinned and copied arrays. The other options give + * the programmer more control over memory management and should be used with extreme care.

    + * + * @param array a Java array object + * @param elems a pointer to array elements + * @param mode the release mode. One of:
    0{@link #JNI_COMMIT COMMIT}{@link #JNI_ABORT ABORT}
    + */ + public static void ReleaseLongArrayElements(@NativeType("jlongArray") long[] array, @NativeType("jlong *") LongBuffer elems, @NativeType("jint") int mode) { + nReleaseLongArrayElements(array, memAddress(elems), mode); + } + + // --- [ GetFloatArrayElements ] --- + + /** Unsafe version of: {@link #GetFloatArrayElements} */ + public static native long nGetFloatArrayElements(float[] array, long isCopy); + + /** + * Returns the body of the primitive array. The result is valid until the {@link #ReleaseFloatArrayElements} function is called. Since the returned array + * may be a copy of the Java array, changes made to the returned array will not necessarily be reflected in the original array until + * {@link #ReleaseFloatArrayElements} is called. + * + *

    If {@code isCopy} is not {@code NULL}, then {@code *isCopy} is set to {@link #JNI_TRUE TRUE} if a copy is made; or it is set to {@link #JNI_FALSE FALSE} if no copy is made.

    + * + * @param array the primitive array + * @param isCopy a pointer to a boolean + * + * @return a pointer to the array elements, or {@code NULL} if the operation fails + */ + @Nullable + @NativeType("jfloat *") + public static FloatBuffer GetFloatArrayElements(@NativeType("jfloatArray") float[] array, @Nullable @NativeType("jboolean *") ByteBuffer isCopy) { + if (CHECKS) { + checkSafe(isCopy, 1); + } + long __result = nGetFloatArrayElements(array, memAddressSafe(isCopy)); + return memFloatBufferSafe(__result, array.length); + } + + // --- [ ReleaseFloatArrayElements ] --- + + /** Unsafe version of: {@link #ReleaseFloatArrayElements} */ + public static native void nReleaseFloatArrayElements(float[] array, long elems, int mode); + + /** + * Informs the VM that the native code no longer needs access to {@code elems}. The {@code elems} argument is a pointer derived from array using the + * {@link #GetFloatArrayElements} function. If necessary, this function copies back all changes made to elems to the original array. + * + *

    The {@code mode} argument provides information on how the array buffer should be released. {@code mode} has no effect if {@code elems} is not a + * copy of the elements in array. Otherwise, mode has the following impact, as shown in the following table:

    + * + * + * + * + * + * + *
    modeactions
    0copy back the content and free the elems buffer
    {@link #JNI_COMMIT COMMIT}copy back the content but do not free the elems buffer
    {@link #JNI_ABORT ABORT}free the buffer without copying back the possible changes
    + * + *

    In most cases, programmers pass “0” to the mode argument to ensure consistent behavior for both pinned and copied arrays. The other options give + * the programmer more control over memory management and should be used with extreme care.

    + * + * @param array a Java array object + * @param elems a pointer to array elements + * @param mode the release mode. One of:
    0{@link #JNI_COMMIT COMMIT}{@link #JNI_ABORT ABORT}
    + */ + public static void ReleaseFloatArrayElements(@NativeType("jfloatArray") float[] array, @NativeType("jfloat *") FloatBuffer elems, @NativeType("jint") int mode) { + nReleaseFloatArrayElements(array, memAddress(elems), mode); + } + + // --- [ GetDoubleArrayElements ] --- + + /** Unsafe version of: {@link #GetDoubleArrayElements} */ + public static native long nGetDoubleArrayElements(double[] array, long isCopy); + + /** + * Returns the body of the primitive array. The result is valid until the {@link #ReleaseDoubleArrayElements} function is called. Since the returned array + * may be a copy of the Java array, changes made to the returned array will not necessarily be reflected in the original array until + * {@link #ReleaseDoubleArrayElements} is called. + * + *

    If {@code isCopy} is not {@code NULL}, then {@code *isCopy} is set to {@link #JNI_TRUE TRUE} if a copy is made; or it is set to {@link #JNI_FALSE FALSE} if no copy is made.

    + * + * @param array the primitive array + * @param isCopy a pointer to a boolean + * + * @return a pointer to the array elements, or {@code NULL} if the operation fails + */ + @Nullable + @NativeType("jdouble *") + public static DoubleBuffer GetDoubleArrayElements(@NativeType("jdoubleArray") double[] array, @Nullable @NativeType("jboolean *") ByteBuffer isCopy) { + if (CHECKS) { + checkSafe(isCopy, 1); + } + long __result = nGetDoubleArrayElements(array, memAddressSafe(isCopy)); + return memDoubleBufferSafe(__result, array.length); + } + + // --- [ ReleaseDoubleArrayElements ] --- + + /** Unsafe version of: {@link #ReleaseDoubleArrayElements} */ + public static native void nReleaseDoubleArrayElements(double[] array, long elems, int mode); + + /** + * Informs the VM that the native code no longer needs access to {@code elems}. The {@code elems} argument is a pointer derived from array using the + * {@link #GetDoubleArrayElements} function. If necessary, this function copies back all changes made to elems to the original array. + * + *

    The {@code mode} argument provides information on how the array buffer should be released. {@code mode} has no effect if {@code elems} is not a + * copy of the elements in array. Otherwise, mode has the following impact, as shown in the following table:

    + * + * + * + * + * + * + *
    modeactions
    0copy back the content and free the elems buffer
    {@link #JNI_COMMIT COMMIT}copy back the content but do not free the elems buffer
    {@link #JNI_ABORT ABORT}free the buffer without copying back the possible changes
    + * + *

    In most cases, programmers pass “0” to the mode argument to ensure consistent behavior for both pinned and copied arrays. The other options give + * the programmer more control over memory management and should be used with extreme care.

    + * + * @param array a Java array object + * @param elems a pointer to array elements + * @param mode the release mode. One of:
    0{@link #JNI_COMMIT COMMIT}{@link #JNI_ABORT ABORT}
    + */ + public static void ReleaseDoubleArrayElements(@NativeType("jdoubleArray") double[] array, @NativeType("jdouble *") DoubleBuffer elems, @NativeType("jint") int mode) { + nReleaseDoubleArrayElements(array, memAddress(elems), mode); + } + + // --- [ GetBooleanArrayRegion ] --- + + /** + * Unsafe version of: {@link #GetBooleanArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nGetBooleanArrayRegion(byte[] array, int start, int len, long buf); + + /** + * Copies a region of a primitive array into a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the destination buffer + */ + public static void GetBooleanArrayRegion(@NativeType("jbooleanArray") byte[] array, @NativeType("jsize") int start, @NativeType("jboolean *") ByteBuffer buf) { + nGetBooleanArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ SetBooleanArrayRegion ] --- + + /** + * Unsafe version of: {@link #SetBooleanArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nSetBooleanArrayRegion(byte[] array, int start, int len, long buf); + + /** + * Copies back a region of a primitive array from a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the source buffer + */ + public static void SetBooleanArrayRegion(@NativeType("jbooleanArray") byte[] array, @NativeType("jsize") int start, @NativeType("jboolean const *") ByteBuffer buf) { + nSetBooleanArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ GetByteArrayRegion ] --- + + /** + * Unsafe version of: {@link #GetByteArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nGetByteArrayRegion(byte[] array, int start, int len, long buf); + + /** + * Copies a region of a primitive array into a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the destination buffer + */ + public static void GetByteArrayRegion(@NativeType("jbyteArray") byte[] array, @NativeType("jsize") int start, @NativeType("jbyte *") ByteBuffer buf) { + nGetByteArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ SetByteArrayRegion ] --- + + /** + * Unsafe version of: {@link #SetByteArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nSetByteArrayRegion(byte[] array, int start, int len, long buf); + + /** + * Copies back a region of a primitive array from a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the source buffer + */ + public static void SetByteArrayRegion(@NativeType("jbyteArray") byte[] array, @NativeType("jsize") int start, @NativeType("jbyte const *") ByteBuffer buf) { + nSetByteArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ GetCharArrayRegion ] --- + + /** + * Unsafe version of: {@link #GetCharArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nGetCharArrayRegion(char[] array, int start, int len, long buf); + + /** + * Copies a region of a primitive array into a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the destination buffer + */ + public static void GetCharArrayRegion(@NativeType("jcharArray") char[] array, @NativeType("jsize") int start, @NativeType("jchar *") ShortBuffer buf) { + nGetCharArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ SetCharArrayRegion ] --- + + /** + * Unsafe version of: {@link #SetCharArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nSetCharArrayRegion(char[] array, int start, int len, long buf); + + /** + * Copies back a region of a primitive array from a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the source buffer + */ + public static void SetCharArrayRegion(@NativeType("jcharArray") char[] array, @NativeType("jsize") int start, @NativeType("jchar const *") ShortBuffer buf) { + nSetCharArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ GetShortArrayRegion ] --- + + /** + * Unsafe version of: {@link #GetShortArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nGetShortArrayRegion(short[] array, int start, int len, long buf); + + /** + * Copies a region of a primitive array into a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the destination buffer + */ + public static void GetShortArrayRegion(@NativeType("jshortArray") short[] array, @NativeType("jsize") int start, @NativeType("jshort *") ShortBuffer buf) { + nGetShortArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ SetShortArrayRegion ] --- + + /** + * Unsafe version of: {@link #SetShortArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nSetShortArrayRegion(short[] array, int start, int len, long buf); + + /** + * Copies back a region of a primitive array from a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the source buffer + */ + public static void SetShortArrayRegion(@NativeType("jshortArray") short[] array, @NativeType("jsize") int start, @NativeType("jshort const *") ShortBuffer buf) { + nSetShortArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ GetIntArrayRegion ] --- + + /** + * Unsafe version of: {@link #GetIntArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nGetIntArrayRegion(int[] array, int start, int len, long buf); + + /** + * Copies a region of a primitive array into a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the destination buffer + */ + public static void GetIntArrayRegion(@NativeType("jintArray") int[] array, @NativeType("jsize") int start, @NativeType("jint *") IntBuffer buf) { + nGetIntArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ SetIntArrayRegion ] --- + + /** + * Unsafe version of: {@link #SetIntArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nSetIntArrayRegion(int[] array, int start, int len, long buf); + + /** + * Copies back a region of a primitive array from a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the source buffer + */ + public static void SetIntArrayRegion(@NativeType("jintArray") int[] array, @NativeType("jsize") int start, @NativeType("jint const *") IntBuffer buf) { + nSetIntArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ GetLongArrayRegion ] --- + + /** + * Unsafe version of: {@link #GetLongArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nGetLongArrayRegion(long[] array, int start, int len, long buf); + + /** + * Copies a region of a primitive array into a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the destination buffer + */ + public static void GetLongArrayRegion(@NativeType("jlongArray") long[] array, @NativeType("jsize") int start, @NativeType("jlong *") LongBuffer buf) { + nGetLongArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ SetLongArrayRegion ] --- + + /** + * Unsafe version of: {@link #SetLongArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nSetLongArrayRegion(long[] array, int start, int len, long buf); + + /** + * Copies back a region of a primitive array from a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the source buffer + */ + public static void SetLongArrayRegion(@NativeType("jlongArray") long[] array, @NativeType("jsize") int start, @NativeType("jlong const *") LongBuffer buf) { + nSetLongArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ GetFloatArrayRegion ] --- + + /** + * Unsafe version of: {@link #GetFloatArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nGetFloatArrayRegion(float[] array, int start, int len, long buf); + + /** + * Copies a region of a primitive array into a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the destination buffer + */ + public static void GetFloatArrayRegion(@NativeType("jfloatArray") float[] array, @NativeType("jsize") int start, @NativeType("jfloat *") FloatBuffer buf) { + nGetFloatArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ SetFloatArrayRegion ] --- + + /** + * Unsafe version of: {@link #SetFloatArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nSetFloatArrayRegion(float[] array, int start, int len, long buf); + + /** + * Copies back a region of a primitive array from a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the source buffer + */ + public static void SetFloatArrayRegion(@NativeType("jfloatArray") float[] array, @NativeType("jsize") int start, @NativeType("jfloat const *") FloatBuffer buf) { + nSetFloatArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ GetDoubleArrayRegion ] --- + + /** + * Unsafe version of: {@link #GetDoubleArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nGetDoubleArrayRegion(double[] array, int start, int len, long buf); + + /** + * Copies a region of a primitive array into a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the destination buffer + */ + public static void GetDoubleArrayRegion(@NativeType("jdoubleArray") double[] array, @NativeType("jsize") int start, @NativeType("jdouble *") DoubleBuffer buf) { + nGetDoubleArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ SetDoubleArrayRegion ] --- + + /** + * Unsafe version of: {@link #SetDoubleArrayRegion} + * + * @param len the number of elements to be copied + */ + public static native void nSetDoubleArrayRegion(double[] array, int start, int len, long buf); + + /** + * Copies back a region of a primitive array from a buffer. + * + * @param array a Java array + * @param start the starting index + * @param buf the source buffer + */ + public static void SetDoubleArrayRegion(@NativeType("jdoubleArray") double[] array, @NativeType("jsize") int start, @NativeType("jdouble const *") DoubleBuffer buf) { + nSetDoubleArrayRegion(array, start, buf.remaining(), memAddress(buf)); + } + + // --- [ RegisterNatives ] --- + + /** + * Unsafe version of: {@link #RegisterNatives} + * + * @param nMethods the number of native methods in the class + */ + public static native int nRegisterNatives(Class targetClass, long methods, int nMethods); + + /** + * Registers native methods with the class specified by the {@code targetClass} argument. The methods parameter specifies an array of JNINativeMethod + * structures that contain the names, signatures, and function pointers of the native methods. The name and signature fields of the {@link JNINativeMethod} + * structure are pointers to modified UTF-8 strings. The {@code nMethods} parameter specifies the number of native methods in the array. + * + * @param methods the native methods in the class + * + * @return “0” on success; returns a negative value on failure + */ + @NativeType("jint") + public static int RegisterNatives(@NativeType("jclass") Class targetClass, @NativeType("JNINativeMethod const *") JNINativeMethod.Buffer methods) { + if (CHECKS) { + Struct.validate(methods.address(), methods.remaining(), JNINativeMethod.SIZEOF, JNINativeMethod::validate); + } + return nRegisterNatives(targetClass, methods.address(), methods.remaining()); + } + + // --- [ UnregisterNatives ] --- + + /** + * Unregisters native methods of a class. The class goes back to the state before it was linked or registered with its native method functions. + * + *

    This function should not be used in normal native code. Instead, it provides special programs a way to reload and relink native libraries.

    + * + * @param targetClass a Java class object + * + * @return “0” on success; returns a negative value on failure + */ + @NativeType("jint") + public static native int UnregisterNatives(@NativeType("jclass") Class targetClass); + + // --- [ GetJavaVM ] --- + + /** Unsafe version of: {@link #GetJavaVM} */ + public static native int nGetJavaVM(long vm); + + /** + * Returns the Java VM interface (used in the Invocation API) associated with the current thread. The result is placed at the location pointed to by the + * second argument, {@code vm}. + * + * @param vm a pointer to where the result should be placed + */ + @NativeType("jint") + public static int GetJavaVM(@NativeType("JavaVM **") PointerBuffer vm) { + if (CHECKS) { + check(vm, 1); + } + return nGetJavaVM(memAddress(vm)); + } + + // --- [ GetStringRegion ] --- + + /** Unsafe version of: {@link #GetStringRegion} */ + public static native void nGetStringRegion(String str, int start, int len, long buf); + + /** Copies {@code len} number of Unicode characters beginning at offset {@code start} to the given buffer {@code buf}. */ + public static void GetStringRegion(@NativeType("jstring") String str, @NativeType("jsize") int start, @NativeType("jchar *") ByteBuffer buf) { + nGetStringRegion(str, start, buf.remaining() >> 1, memAddress(buf)); + } + + // --- [ GetStringUTFRegion ] --- + + /** Unsafe version of: {@link #GetStringUTFRegion} */ + public static native void nGetStringUTFRegion(String str, int start, int len, long buf); + + /** + * Translates {@code len} number of Unicode characters beginning at offset start into modified UTF-8 encoding and place the result in the given buffer + * {@code buf}. + */ + public static void GetStringUTFRegion(@NativeType("jstring") String str, @NativeType("jsize") int start, @NativeType("jsize") int len, @NativeType("char *") ByteBuffer buf) { + if (CHECKS) { + check(buf, len); + } + nGetStringUTFRegion(str, start, len, memAddress(buf)); + } + + // --- [ NewWeakGlobalRef ] --- + + /** + * Creates a new weak global reference. Returns {@code NULL} if {@code obj} refers to null, or if the VM runs out of memory. If the VM runs out of memory, an + * {@code OutOfMemoryError} will be thrown. + */ + @NativeType("void *") + public static native long NewWeakGlobalRef(@NativeType("jobject") Object obj); + + // --- [ DeleteWeakGlobalRef ] --- + + /** Unsafe version of: {@link #DeleteWeakGlobalRef} */ + public static native void nDeleteWeakGlobalRef(long weakGlobalRef); + + /** Delete the VM resources needed for the given weak global reference. */ + public static void DeleteWeakGlobalRef(@NativeType("void *") long weakGlobalRef) { + if (CHECKS) { + check(weakGlobalRef); + } + nDeleteWeakGlobalRef(weakGlobalRef); + } + + // --- [ NewDirectByteBuffer ] --- + + /** Unsafe version of: {@link #NewDirectByteBuffer} */ + @Nullable + public static native ByteBuffer nNewDirectByteBuffer(long address, long capacity); + + /** + * Allocates and returns a direct {@code java.nio.ByteBuffer} referring to the block of memory starting at the memory address address and extending + * capacity bytes. + * + *

    Native code that calls this function and returns the resulting byte-buffer object to Java-level code should ensure that the buffer refers to a valid + * region of memory that is accessible for reading and, if appropriate, writing. An attempt to access an invalid memory location from Java code will + * either return an arbitrary value, have no visible effect, or cause an unspecified exception to be thrown.

    + * + * @param address the starting address of the memory region (must not be {@code NULL}) + * @param capacity the size in bytes of the memory region (must be positive) + * + * @return a local reference to the newly-instantiated {@code java.nio.ByteBuffer} object. Returns {@code NULL} if an exception occurs, or if JNI access to direct + * buffers is not supported by this virtual machine. + */ + @Nullable + @NativeType("jobject") + public static ByteBuffer NewDirectByteBuffer(@NativeType("void *") long address, @NativeType("jlong") long capacity) { + if (CHECKS) { + check(address); + } + return nNewDirectByteBuffer(address, capacity); + } + + // --- [ GetDirectBufferAddress ] --- + + /** + * Fetches and returns the starting address of the memory region referenced by the given direct {@code java.nio.Buffer}. + * + *

    This function allows native code to access the same memory region that is accessible to Java code via the buffer object.

    + * + * @param buf a direct {@code java.nio.Buffer} object (must not be {@code NULL}) + * + * @return the starting address of the memory region referenced by the buffer. Returns {@code NULL} if the memory region is undefined, if the given object is not a + * direct {@code java.nio.Buffer}, or if JNI access to direct buffers is not supported by this virtual machine. + */ + @NativeType("void *") + public static native long GetDirectBufferAddress(@NativeType("jobject") Buffer buf); + + // --- [ GetObjectRefType ] --- + + /** + * Returns the type of the object referred to by the {@code obj} argument. The argument {@code obj} can either be a local, global or weak global + * reference. + * + * @param obj a local, global or weak global reference + */ + @NativeType("jobjectRefType") + public static native int GetObjectRefType(@NativeType("jobject") Object obj); + + // --- [ noop ] --- + + /** No-op JNI function for benchmarking. */ + public static native void noop(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/jni/JNINativeMethod.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/jni/JNINativeMethod.java new file mode 100644 index 000000000..8a572aafd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/jni/JNINativeMethod.java @@ -0,0 +1,358 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.jni; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct JNINativeMethod {
    + *     char * name;
    + *     char * signature;
    + *     void * fnPtr;
    + * }
    + */ +public class JNINativeMethod extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NAME, + SIGNATURE, + FNPTR; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NAME = layout.offsetof(0); + SIGNATURE = layout.offsetof(1); + FNPTR = layout.offsetof(2); + } + + protected JNINativeMethod(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected JNINativeMethod create(long address, @Nullable ByteBuffer container) { + return new JNINativeMethod(address, container); + } + + /** + * Creates a {@code JNINativeMethod} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public JNINativeMethod(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code name} field. */ + @NativeType("char *") + public ByteBuffer name() { return nname(address()); } + /** @return the null-terminated string pointed to by the {@code name} field. */ + @NativeType("char *") + public String nameString() { return nnameString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code signature} field. */ + @NativeType("char *") + public ByteBuffer signature() { return nsignature(address()); } + /** @return the null-terminated string pointed to by the {@code signature} field. */ + @NativeType("char *") + public String signatureString() { return nsignatureString(address()); } + /** @return the value of the {@code fnPtr} field. */ + @NativeType("void *") + public long fnPtr() { return nfnPtr(address()); } + + /** Sets the address of the specified encoded string to the {@code name} field. */ + public JNINativeMethod name(@NativeType("char *") ByteBuffer value) { nname(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@code signature} field. */ + public JNINativeMethod signature(@NativeType("char *") ByteBuffer value) { nsignature(address(), value); return this; } + /** Sets the specified value to the {@code fnPtr} field. */ + public JNINativeMethod fnPtr(@NativeType("void *") long value) { nfnPtr(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public JNINativeMethod set( + ByteBuffer name, + ByteBuffer signature, + long fnPtr + ) { + name(name); + signature(signature); + fnPtr(fnPtr); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public JNINativeMethod set(JNINativeMethod src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code JNINativeMethod} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static JNINativeMethod malloc() { + return new JNINativeMethod(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code JNINativeMethod} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static JNINativeMethod calloc() { + return new JNINativeMethod(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code JNINativeMethod} instance allocated with {@link BufferUtils}. */ + public static JNINativeMethod create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new JNINativeMethod(memAddress(container), container); + } + + /** Returns a new {@code JNINativeMethod} instance for the specified memory address. */ + public static JNINativeMethod create(long address) { + return new JNINativeMethod(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static JNINativeMethod createSafe(long address) { + return address == NULL ? null : new JNINativeMethod(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static JNINativeMethod mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static JNINativeMethod callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static JNINativeMethod mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static JNINativeMethod callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code JNINativeMethod} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static JNINativeMethod malloc(MemoryStack stack) { + return new JNINativeMethod(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code JNINativeMethod} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static JNINativeMethod calloc(MemoryStack stack) { + return new JNINativeMethod(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #name}. */ + public static ByteBuffer nname(long struct) { return memByteBufferNT1(memGetAddress(struct + JNINativeMethod.NAME)); } + /** Unsafe version of {@link #nameString}. */ + public static String nnameString(long struct) { return memUTF8(memGetAddress(struct + JNINativeMethod.NAME)); } + /** Unsafe version of {@link #signature}. */ + public static ByteBuffer nsignature(long struct) { return memByteBufferNT1(memGetAddress(struct + JNINativeMethod.SIGNATURE)); } + /** Unsafe version of {@link #signatureString}. */ + public static String nsignatureString(long struct) { return memUTF8(memGetAddress(struct + JNINativeMethod.SIGNATURE)); } + /** Unsafe version of {@link #fnPtr}. */ + public static long nfnPtr(long struct) { return memGetAddress(struct + JNINativeMethod.FNPTR); } + + /** Unsafe version of {@link #name(ByteBuffer) name}. */ + public static void nname(long struct, ByteBuffer value) { + if (CHECKS) { checkNT1(value); } + memPutAddress(struct + JNINativeMethod.NAME, memAddress(value)); + } + /** Unsafe version of {@link #signature(ByteBuffer) signature}. */ + public static void nsignature(long struct, ByteBuffer value) { + if (CHECKS) { checkNT1(value); } + memPutAddress(struct + JNINativeMethod.SIGNATURE, memAddress(value)); + } + /** Unsafe version of {@link #fnPtr(long) fnPtr}. */ + public static void nfnPtr(long struct, long value) { memPutAddress(struct + JNINativeMethod.FNPTR, check(value)); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + JNINativeMethod.NAME)); + check(memGetAddress(struct + JNINativeMethod.SIGNATURE)); + check(memGetAddress(struct + JNINativeMethod.FNPTR)); + } + + // ----------------------------------- + + /** An array of {@link JNINativeMethod} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final JNINativeMethod ELEMENT_FACTORY = JNINativeMethod.create(-1L); + + /** + * Creates a new {@code JNINativeMethod.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link JNINativeMethod#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected JNINativeMethod getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code name} field. */ + @NativeType("char *") + public ByteBuffer name() { return JNINativeMethod.nname(address()); } + /** @return the null-terminated string pointed to by the {@code name} field. */ + @NativeType("char *") + public String nameString() { return JNINativeMethod.nnameString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code signature} field. */ + @NativeType("char *") + public ByteBuffer signature() { return JNINativeMethod.nsignature(address()); } + /** @return the null-terminated string pointed to by the {@code signature} field. */ + @NativeType("char *") + public String signatureString() { return JNINativeMethod.nsignatureString(address()); } + /** @return the value of the {@code fnPtr} field. */ + @NativeType("void *") + public long fnPtr() { return JNINativeMethod.nfnPtr(address()); } + + /** Sets the address of the specified encoded string to the {@code name} field. */ + public Buffer name(@NativeType("char *") ByteBuffer value) { JNINativeMethod.nname(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@code signature} field. */ + public Buffer signature(@NativeType("char *") ByteBuffer value) { JNINativeMethod.nsignature(address(), value); return this; } + /** Sets the specified value to the {@code fnPtr} field. */ + public Buffer fnPtr(@NativeType("void *") long value) { JNINativeMethod.nfnPtr(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCErrno.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCErrno.java new file mode 100644 index 000000000..46e1b2291 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCErrno.java @@ -0,0 +1,133 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.libc; + +import org.lwjgl.system.*; + +/** Native bindings to errno.h. */ +public class LibCErrno { + + static { Library.initialize(); } + + /** + * Standard error codes. + * + *
    Enum values:
    + * + *
      + *
    • {@link #EPERM EPERM} - Operation not permitted
    • + *
    • {@link #ENOENT ENOENT} - No such file or directory
    • + *
    • {@link #ESRCH ESRCH} - No such process
    • + *
    • {@link #EINTR EINTR} - Interrupted function
    • + *
    • {@link #EIO EIO} - I/O error
    • + *
    • {@link #ENXIO ENXIO} - No such device or address
    • + *
    • {@link #E2BIG E2BIG} - Argument list too long
    • + *
    • {@link #ENOEXEC ENOEXEC} - Exec format error
    • + *
    • {@link #EBADF EBADF} - Bad file number
    • + *
    • {@link #ECHILD ECHILD} - No spawned processes
    • + *
    • {@link #EAGAIN EAGAIN} - No more processes or not enough memory or maximum nesting level reached
    • + *
    • {@link #ENOMEM ENOMEM} - Not enough memory
    • + *
    • {@link #EACCES EACCES} - Permission denied
    • + *
    • {@link #EFAULT EFAULT} - Bad address
    • + *
    • {@link #EBUSY EBUSY} - Device or resource busy
    • + *
    • {@link #EEXIST EEXIST} - File exists
    • + *
    • {@link #EXDEV EXDEV} - Cross-device link
    • + *
    • {@link #ENODEV ENODEV} - No such device
    • + *
    • {@link #ENOTDIR ENOTDIR} - Not a directory
    • + *
    • {@link #EISDIR EISDIR} - Is a directory
    • + *
    • {@link #EINVAL EINVAL} - Invalid argument
    • + *
    • {@link #ENFILE ENFILE} - Too many files open in system
    • + *
    • {@link #EMFILE EMFILE} - Too many open files
    • + *
    • {@link #ENOTTY ENOTTY} - Inappropriate I/O control operation
    • + *
    • {@link #EFBIG EFBIG} - File too large
    • + *
    • {@link #ENOSPC ENOSPC} - No space left on device
    • + *
    • {@link #ESPIPE ESPIPE} - Invalid seek
    • + *
    • {@link #EROFS EROFS} - Read-only file system
    • + *
    • {@link #EMLINK EMLINK} - Too many links
    • + *
    • {@link #EPIPE EPIPE} - Broken pipe
    • + *
    • {@link #EDOM EDOM} - Math argument
    • + *
    • {@link #ERANGE ERANGE} - Result too large
    • + *
    • {@link #EDEADLK EDEADLK} - Resource deadlock would occur
    • + *
    • {@link #EDEADLOCK EDEADLOCK} - Same as EDEADLK for compatibility with older Microsoft C versions
    • + *
    • {@link #ENAMETOOLONG ENAMETOOLONG} - Filename too long
    • + *
    • {@link #ENOLCK ENOLCK} - No locks available
    • + *
    • {@link #ENOSYS ENOSYS} - Function not supported
    • + *
    • {@link #ENOTEMPTY ENOTEMPTY} - Directory not empty
    • + *
    • {@link #EILSEQ EILSEQ} - Illegal byte sequence
    • + *
    • {@link #STRUNCATE STRUNCATE} - String was truncated
    • + *
    + */ + public static final int + EPERM = 0x1, + ENOENT = 0x2, + ESRCH = 0x3, + EINTR = 0x4, + EIO = 0x5, + ENXIO = 0x6, + E2BIG = 0x7, + ENOEXEC = 0x8, + EBADF = 0x9, + ECHILD = 0xA, + EAGAIN = 0xB, + ENOMEM = 0xC, + EACCES = 0xD, + EFAULT = 0xE, + EBUSY = 0x10, + EEXIST = 0x11, + EXDEV = 0x12, + ENODEV = 0x13, + ENOTDIR = 0x14, + EISDIR = 0x15, + EINVAL = 0x16, + ENFILE = 0x17, + EMFILE = 0x18, + ENOTTY = 0x19, + EFBIG = 0x1B, + ENOSPC = 0x1C, + ESPIPE = 0x1D, + EROFS = 0x1E, + EMLINK = 0x1F, + EPIPE = 0x20, + EDOM = 0x21, + ERANGE = 0x22, + EDEADLK = 0x24, + EDEADLOCK = 0x24, + ENAMETOOLONG = 0x26, + ENOLCK = 0x27, + ENOSYS = 0x28, + ENOTEMPTY = 0x29, + EILSEQ = 0x2A, + STRUNCATE = 0x50; + + protected LibCErrno() { + throw new UnsupportedOperationException(); + } + + // --- [ errno ] --- + + /** + * Returns the integer variable {@code errno}, which is set by system calls and some library functions in the event of an error to indicate what went + * wrong. Its value is significant only when the return value of the call indicated an error (i.e., -1 from most system calls; -1 or {@code NULL} from most + * library functions); a function that succeeds is allowed to change errno. + * + *

    LWJGL note: This function cannot be used after another JNI call to a function, because the last error resets before that call returns. For this + * reason, LWJGL stores the last error in thread-local storage, you can use {@link #getErrno} to access it.

    + */ + public static native int errno(); + + // --- [ getErrno ] --- + + /** + * Returns the integer variable {@code errno}, which is set by system calls and some library functions in the event of an error to indicate what went + * wrong. Its value is significant only when the return value of the call indicated an error (i.e., -1 from most system calls; -1 or {@code NULL} from most + * library functions); a function that succeeds is allowed to change errno. + * + *

    LWJGL note: This method has a meaningful value only after another LWJGL JNI call. It does not return {@code errno} from errno.h, but the + * thread-local error code stored by a previous JNI call.

    + */ + public static native int getErrno(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCLocale.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCLocale.java new file mode 100644 index 000000000..31751d57a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCLocale.java @@ -0,0 +1,128 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.libc; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to locale.h. */ +public class LibCLocale { + + static { Library.initialize(); } + + protected LibCLocale() { + throw new UnsupportedOperationException(); + } + + // --- [ LC_ALL ] --- + + private static native int LC_ALL(); + + /** Selects the entire C locale. */ + public static final int LC_ALL = LC_ALL(); + + // --- [ LC_COLLATE ] --- + + private static native int LC_COLLATE(); + + /** Selects the collation category of the C locale. */ + public static final int LC_COLLATE = LC_COLLATE(); + + // --- [ LC_CTYPE ] --- + + private static native int LC_CTYPE(); + + /** Selects the character classification category of the C locale. */ + public static final int LC_CTYPE = LC_CTYPE(); + + // --- [ LC_MONETARY ] --- + + private static native int LC_MONETARY(); + + /** Selects the monetary formatting category of the C locale. */ + public static final int LC_MONETARY = LC_MONETARY(); + + // --- [ LC_NUMERIC ] --- + + private static native int LC_NUMERIC(); + + /** Selects the numeric formatting category of the C locale. */ + public static final int LC_NUMERIC = LC_NUMERIC(); + + // --- [ LC_TIME ] --- + + private static native int LC_TIME(); + + /** Selects the time formatting category of the C locale. */ + public static final int LC_TIME = LC_TIME(); + + // --- [ setlocale ] --- + + /** Unsafe version of: {@link #setlocale} */ + public static native long nsetlocale(int category, long locale); + + /** + * Gets and sets the current C locale. + * + *

    The {@code setlocale} function installs the specified system locale or its portion as the new C locale. The modifications remain in effect and + * influences the execution of all locale-sensitive C library functions until the next call to {@code setlocale}. If {@code locale} is a null pointer, + * {@code setlocale} queries the current C locale without modifying it.

    + * + * @param category the locale category identifier, may by null. One of:
    {@link #LC_ALL}{@link #LC_COLLATE}{@link #LC_CTYPE}{@link #LC_MONETARY}{@link #LC_NUMERIC}{@link #LC_TIME}
    + * @param locale system-specific locale identifier. Can be "" for the user-preferred locale or "C" for the minimal locale. + * + * @return a pointer to a narrow null-terminated string identifying the C locale after applying the changes, if any, or null pointer on failure. + * + *

    A copy of the returned string along with the category used in this call to {@code setlocale} may be used later in the program to restore the locale + * back to the state at the end of this call.

    + */ + @Nullable + @NativeType("char *") + public static String setlocale(int category, @NativeType("char const *") ByteBuffer locale) { + if (CHECKS) { + checkNT1(locale); + } + long __result = nsetlocale(category, memAddress(locale)); + return memASCIISafe(__result); + } + + /** + * Gets and sets the current C locale. + * + *

    The {@code setlocale} function installs the specified system locale or its portion as the new C locale. The modifications remain in effect and + * influences the execution of all locale-sensitive C library functions until the next call to {@code setlocale}. If {@code locale} is a null pointer, + * {@code setlocale} queries the current C locale without modifying it.

    + * + * @param category the locale category identifier, may by null. One of:
    {@link #LC_ALL}{@link #LC_COLLATE}{@link #LC_CTYPE}{@link #LC_MONETARY}{@link #LC_NUMERIC}{@link #LC_TIME}
    + * @param locale system-specific locale identifier. Can be "" for the user-preferred locale or "C" for the minimal locale. + * + * @return a pointer to a narrow null-terminated string identifying the C locale after applying the changes, if any, or null pointer on failure. + * + *

    A copy of the returned string along with the category used in this call to {@code setlocale} may be used later in the program to restore the locale + * back to the state at the end of this call.

    + */ + @Nullable + @NativeType("char *") + public static String setlocale(int category, @NativeType("char const *") CharSequence locale) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(locale, true); + long localeEncoded = stack.getPointerAddress(); + long __result = nsetlocale(category, localeEncoded); + return memASCIISafe(__result); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCStdio.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCStdio.java new file mode 100644 index 000000000..d242732b2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCStdio.java @@ -0,0 +1,148 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.libc; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to stdio.h. */ +public class LibCStdio { + + static { Library.initialize(); } + + protected LibCStdio() { + throw new UnsupportedOperationException(); + } + + // --- [ sscanf ] --- + + @NativeType("void *") + private static native long sscanf(); + + /** The address of the {@code sscanf} function. */ + public static final long sscanf = sscanf(); + + // --- [ vsscanf ] --- + + /** Unsafe version of: {@link #vsscanf} */ + public static native int nvsscanf(long buffer, long format, long vlist); + + /** + * Reads data from the null-terminated character string {@code buffer}, interprets it according to {@code format} and stores the results into locations + * defined by {@code vlist}. + * + * @param buffer pointer to a null-terminated character string to read from + * @param format pointer to a null-terminated character string specifying how to read the input + * @param vlist variable argument list containing the receiving arguments + * + * @return the number of receiving arguments successfully assigned, or {@code EOF} if read failure occurs before the first receiving argument was assigned + */ + public static int vsscanf(@NativeType("char const *") ByteBuffer buffer, @NativeType("char const *") ByteBuffer format, @NativeType("va_list") long vlist) { + if (CHECKS) { + checkNT1(buffer); + checkNT1(format); + check(vlist); + } + return nvsscanf(memAddress(buffer), memAddress(format), vlist); + } + + /** + * Reads data from the null-terminated character string {@code buffer}, interprets it according to {@code format} and stores the results into locations + * defined by {@code vlist}. + * + * @param buffer pointer to a null-terminated character string to read from + * @param format pointer to a null-terminated character string specifying how to read the input + * @param vlist variable argument list containing the receiving arguments + * + * @return the number of receiving arguments successfully assigned, or {@code EOF} if read failure occurs before the first receiving argument was assigned + */ + public static int vsscanf(@NativeType("char const *") CharSequence buffer, @NativeType("char const *") CharSequence format, @NativeType("va_list") long vlist) { + if (CHECKS) { + check(vlist); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(buffer, true); + long bufferEncoded = stack.getPointerAddress(); + stack.nASCII(format, true); + long formatEncoded = stack.getPointerAddress(); + return nvsscanf(bufferEncoded, formatEncoded, vlist); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ snprintf ] --- + + @NativeType("void *") + private static native long snprintf(); + + /** The address of the {@code snprintf} function. */ + public static final long snprintf = snprintf(); + + // --- [ vsnprintf ] --- + + /** + * Unsafe version of: {@link #vsnprintf} + * + * @param buf_size up to {@code buf_size - 1} characters may be written, plus the null terminator + */ + public static native int nvsnprintf(long buffer, long buf_size, long format, long vlist); + + /** + * Loads the data from the locations, defined by {@code vlist}, converts them to character string equivalents and writes the results to a character string + * buffer. + * + * @param buffer pointer to a character string to write to + * @param format pointer to a null-terminated character string specifying how to interpret the data + * @param vlist variable argument list containing the data to print + * + * @return the number of characters written if successful or negative value if an error occurred. If the resulting string gets truncated due to {@code buf_size} + * limit, function returns the total number of characters (not including the terminating null-byte) which would have been written, if the limit was not + * imposed. + */ + public static int vsnprintf(@Nullable @NativeType("char *") ByteBuffer buffer, @NativeType("char const *") ByteBuffer format, @NativeType("va_list") long vlist) { + if (CHECKS) { + checkNT1(format); + check(vlist); + } + return nvsnprintf(memAddressSafe(buffer), remainingSafe(buffer), memAddress(format), vlist); + } + + /** + * Loads the data from the locations, defined by {@code vlist}, converts them to character string equivalents and writes the results to a character string + * buffer. + * + * @param buffer pointer to a character string to write to + * @param format pointer to a null-terminated character string specifying how to interpret the data + * @param vlist variable argument list containing the data to print + * + * @return the number of characters written if successful or negative value if an error occurred. If the resulting string gets truncated due to {@code buf_size} + * limit, function returns the total number of characters (not including the terminating null-byte) which would have been written, if the limit was not + * imposed. + */ + public static int vsnprintf(@Nullable @NativeType("char *") ByteBuffer buffer, @NativeType("char const *") CharSequence format, @NativeType("va_list") long vlist) { + if (CHECKS) { + check(vlist); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(format, true); + long formatEncoded = stack.getPointerAddress(); + return nvsnprintf(memAddressSafe(buffer), remainingSafe(buffer), formatEncoded, vlist); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCStdlib.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCStdlib.java new file mode 100644 index 000000000..1b67d78fe --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCStdlib.java @@ -0,0 +1,249 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.libc; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to stdlib.h. */ +public class LibCStdlib { + + static { Library.initialize(); } + + protected LibCStdlib() { + throw new UnsupportedOperationException(); + } + + // --- [ malloc ] --- + + /** Unsafe version of: {@link #malloc} */ + public static native long nmalloc(long size); + + /** + * Allocates {@code size} bytes and returns a pointer to the allocated memory. The memory is not initialized. If {@code size} is 0, then malloc() returns + * either {@code NULL}, or a unique pointer value that can later be successfully passed to {@link #free}. + * + * @param size the number of bytes to allocate + */ + @Nullable + @NativeType("void *") + public static ByteBuffer malloc(@NativeType("size_t") long size) { + long __result = nmalloc(size); + return memByteBufferSafe(__result, (int)size); + } + + // --- [ calloc ] --- + + /** Unsafe version of: {@link #calloc} */ + public static native long ncalloc(long nmemb, long size); + + /** + * Allocates memory for an array of {@code nmemb} elements of {@code size} bytes each and returns a pointer to the allocated memory. The memory is set to + * zero. If {@code nmemb} or {@code size} is 0, then calloc() returns either {@code NULL}, or a unique pointer value that can later be successfully passed to + * {@link #free}. + * + * @param nmemb the number of elements to allocate + * @param size the number of bytes to allocate per element + */ + @Nullable + @NativeType("void *") + public static ByteBuffer calloc(@NativeType("size_t") long nmemb, @NativeType("size_t") long size) { + long __result = ncalloc(nmemb, size); + return memByteBufferSafe(__result, (int)nmemb * (int)size); + } + + // --- [ realloc ] --- + + /** Unsafe version of: {@link #realloc} */ + public static native long nrealloc(long ptr, long size); + + /** + * Changes the size of the memory block pointed to by {@code ptr} to {@code size} bytes The contents will be unchanged in the range from the start of the + * region up to the minimum of the old and new sizes. If the new size is larger than the old size, the added memory will not be initialized. If + * {@code ptr} is {@code NULL}, then the call is equivalent to {@code malloc(size)}, for all values of {@code size}; if {@code size} is equal to zero, and + * {@code ptr} is not {@code NULL}, then the call is equivalent to {@code free(ptr)}. Unless {@code ptr} is {@code NULL}, it must have been returned by an earlier call + * to {@link #malloc}, {@link #calloc} or {@link #realloc}. If the area pointed to was moved, a {@code free(ptr)} is done. + * + * @param ptr the memory block to reallocate + * @param size the new memory block size, in bytes + */ + @Nullable + @NativeType("void *") + public static ByteBuffer realloc(@Nullable @NativeType("void *") ByteBuffer ptr, @NativeType("size_t") long size) { + long __result = nrealloc(memAddressSafe(ptr), size); + return memByteBufferSafe(__result, (int)size); + } + + // --- [ free ] --- + + /** Unsafe version of: {@link #free} */ + public static native void nfree(long ptr); + + /** + * Frees the memory space pointed to by {@code ptr}, which must have been returned by a previous call to {@link #malloc}, {@link #calloc}, or {@link #realloc}. Otherwise, + * or if {@code free(ptr)} has already been called before, undefined behavior occurs. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the memory space to free + */ + public static void free(@Nullable @NativeType("void *") ByteBuffer ptr) { + nfree(memAddressSafe(ptr)); + } + + /** + * Frees the memory space pointed to by {@code ptr}, which must have been returned by a previous call to {@link #malloc}, {@link #calloc}, or {@link #realloc}. Otherwise, + * or if {@code free(ptr)} has already been called before, undefined behavior occurs. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the memory space to free + */ + public static void free(@Nullable @NativeType("void *") ShortBuffer ptr) { + nfree(memAddressSafe(ptr)); + } + + /** + * Frees the memory space pointed to by {@code ptr}, which must have been returned by a previous call to {@link #malloc}, {@link #calloc}, or {@link #realloc}. Otherwise, + * or if {@code free(ptr)} has already been called before, undefined behavior occurs. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the memory space to free + */ + public static void free(@Nullable @NativeType("void *") IntBuffer ptr) { + nfree(memAddressSafe(ptr)); + } + + /** + * Frees the memory space pointed to by {@code ptr}, which must have been returned by a previous call to {@link #malloc}, {@link #calloc}, or {@link #realloc}. Otherwise, + * or if {@code free(ptr)} has already been called before, undefined behavior occurs. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the memory space to free + */ + public static void free(@Nullable @NativeType("void *") LongBuffer ptr) { + nfree(memAddressSafe(ptr)); + } + + /** + * Frees the memory space pointed to by {@code ptr}, which must have been returned by a previous call to {@link #malloc}, {@link #calloc}, or {@link #realloc}. Otherwise, + * or if {@code free(ptr)} has already been called before, undefined behavior occurs. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the memory space to free + */ + public static void free(@Nullable @NativeType("void *") FloatBuffer ptr) { + nfree(memAddressSafe(ptr)); + } + + /** + * Frees the memory space pointed to by {@code ptr}, which must have been returned by a previous call to {@link #malloc}, {@link #calloc}, or {@link #realloc}. Otherwise, + * or if {@code free(ptr)} has already been called before, undefined behavior occurs. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the memory space to free + */ + public static void free(@Nullable @NativeType("void *") DoubleBuffer ptr) { + nfree(memAddressSafe(ptr)); + } + + /** + * Frees the memory space pointed to by {@code ptr}, which must have been returned by a previous call to {@link #malloc}, {@link #calloc}, or {@link #realloc}. Otherwise, + * or if {@code free(ptr)} has already been called before, undefined behavior occurs. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the memory space to free + */ + public static void free(@Nullable @NativeType("void *") PointerBuffer ptr) { + nfree(memAddressSafe(ptr)); + } + + // --- [ aligned_alloc ] --- + + /** Unsafe version of: {@link #aligned_alloc} */ + public static native long naligned_alloc(long alignment, long size); + + /** + * Allocates {@code size} bytes of uninitialized storage whose alignment is specified by {@code alignment}. The size parameter must be an integral multiple + * of alignment. Memory allocated with aligned_alloc() must be freed with {@link #aligned_free}. + * + * @param alignment the alignment. Must be a power of two value. + * @param size the number of bytes to allocate. Must be a multiple of {@code alignment}. + */ + @Nullable + @NativeType("void *") + public static ByteBuffer aligned_alloc(@NativeType("size_t") long alignment, @NativeType("size_t") long size) { + long __result = naligned_alloc(alignment, size); + return memByteBufferSafe(__result, (int)size); + } + + // --- [ aligned_free ] --- + + /** Unsafe version of: {@link #aligned_free} */ + public static native void naligned_free(long ptr); + + /** + * Frees a block of memory that was allocated with {@link #aligned_alloc}. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the aligned block of memory to free + */ + public static void aligned_free(@Nullable @NativeType("void *") ByteBuffer ptr) { + naligned_free(memAddressSafe(ptr)); + } + + /** + * Frees a block of memory that was allocated with {@link #aligned_alloc}. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the aligned block of memory to free + */ + public static void aligned_free(@Nullable @NativeType("void *") ShortBuffer ptr) { + naligned_free(memAddressSafe(ptr)); + } + + /** + * Frees a block of memory that was allocated with {@link #aligned_alloc}. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the aligned block of memory to free + */ + public static void aligned_free(@Nullable @NativeType("void *") IntBuffer ptr) { + naligned_free(memAddressSafe(ptr)); + } + + /** + * Frees a block of memory that was allocated with {@link #aligned_alloc}. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the aligned block of memory to free + */ + public static void aligned_free(@Nullable @NativeType("void *") LongBuffer ptr) { + naligned_free(memAddressSafe(ptr)); + } + + /** + * Frees a block of memory that was allocated with {@link #aligned_alloc}. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the aligned block of memory to free + */ + public static void aligned_free(@Nullable @NativeType("void *") FloatBuffer ptr) { + naligned_free(memAddressSafe(ptr)); + } + + /** + * Frees a block of memory that was allocated with {@link #aligned_alloc}. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the aligned block of memory to free + */ + public static void aligned_free(@Nullable @NativeType("void *") DoubleBuffer ptr) { + naligned_free(memAddressSafe(ptr)); + } + + /** + * Frees a block of memory that was allocated with {@link #aligned_alloc}. If ptr is {@code NULL}, no operation is performed. + * + * @param ptr the aligned block of memory to free + */ + public static void aligned_free(@Nullable @NativeType("void *") PointerBuffer ptr) { + naligned_free(memAddressSafe(ptr)); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCString.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCString.java new file mode 100644 index 000000000..3faec6020 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/libc/LibCString.java @@ -0,0 +1,612 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.libc; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to string.h. */ +public class LibCString { + + static { Library.initialize(); } + + protected LibCString() { + throw new UnsupportedOperationException(); + } + + // --- [ memset ] --- + + /** + * Unsafe version of: {@link #memset} + * + * @param count number of bytes to fill + */ + public static native long nmemset(long dest, int c, long count); + + /** + * Fills a memory area with a constant byte. + * + * @param dest pointer to the memory area to fill + * @param c byte to set + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memset(@NativeType("void *") ByteBuffer dest, int c) { + return nmemset(memAddress(dest), c, dest.remaining()); + } + + /** + * Fills a memory area with a constant byte. + * + * @param dest pointer to the memory area to fill + * @param c byte to set + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memset(@NativeType("void *") ShortBuffer dest, int c) { + return nmemset(memAddress(dest), c, Integer.toUnsignedLong(dest.remaining()) << 1); + } + + /** + * Fills a memory area with a constant byte. + * + * @param dest pointer to the memory area to fill + * @param c byte to set + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memset(@NativeType("void *") IntBuffer dest, int c) { + return nmemset(memAddress(dest), c, Integer.toUnsignedLong(dest.remaining()) << 2); + } + + /** + * Fills a memory area with a constant byte. + * + * @param dest pointer to the memory area to fill + * @param c byte to set + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memset(@NativeType("void *") LongBuffer dest, int c) { + return nmemset(memAddress(dest), c, Integer.toUnsignedLong(dest.remaining()) << 3); + } + + /** + * Fills a memory area with a constant byte. + * + * @param dest pointer to the memory area to fill + * @param c byte to set + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memset(@NativeType("void *") FloatBuffer dest, int c) { + return nmemset(memAddress(dest), c, Integer.toUnsignedLong(dest.remaining()) << 2); + } + + /** + * Fills a memory area with a constant byte. + * + * @param dest pointer to the memory area to fill + * @param c byte to set + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memset(@NativeType("void *") DoubleBuffer dest, int c) { + return nmemset(memAddress(dest), c, Integer.toUnsignedLong(dest.remaining()) << 3); + } + + // --- [ memcpy ] --- + + /** + * Unsafe version of: {@link #memcpy} + * + * @param count the number of bytes to be copied + */ + public static native long nmemcpy(long dest, long src, long count); + + /** + * Copies bytes between memory areas that must not overlap. + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") ByteBuffer dest, @NativeType("void const *") ByteBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemcpy(memAddress(dest), memAddress(src), src.remaining()); + } + + /** + * Copies bytes between memory areas that must not overlap. + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") ShortBuffer dest, @NativeType("void const *") ShortBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemcpy(memAddress(dest), memAddress(src), Integer.toUnsignedLong(src.remaining()) << 1); + } + + /** + * Copies bytes between memory areas that must not overlap. + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") IntBuffer dest, @NativeType("void const *") IntBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemcpy(memAddress(dest), memAddress(src), Integer.toUnsignedLong(src.remaining()) << 2); + } + + /** + * Copies bytes between memory areas that must not overlap. + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") LongBuffer dest, @NativeType("void const *") LongBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemcpy(memAddress(dest), memAddress(src), Integer.toUnsignedLong(src.remaining()) << 3); + } + + /** + * Copies bytes between memory areas that must not overlap. + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") FloatBuffer dest, @NativeType("void const *") FloatBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemcpy(memAddress(dest), memAddress(src), Integer.toUnsignedLong(src.remaining()) << 2); + } + + /** + * Copies bytes between memory areas that must not overlap. + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") DoubleBuffer dest, @NativeType("void const *") DoubleBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemcpy(memAddress(dest), memAddress(src), Integer.toUnsignedLong(src.remaining()) << 3); + } + + // --- [ memmove ] --- + + /** + * Unsafe version of: {@link #memmove} + * + * @param count the number of bytes to be copied + */ + public static native long nmemmove(long dest, long src, long count); + + /** + * Copies {@code count} bytes from memory area {@code src} to memory area {@code dest}. + * + *

    The memory areas may overlap: copying takes place as though the bytes in {@code src} are first copied into a temporary array that does not overlap + * {@code src} or {@code dest}, and the bytes are then copied from the temporary array to {@code dest}.

    + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memmove(@NativeType("void *") ByteBuffer dest, @NativeType("void const *") ByteBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemmove(memAddress(dest), memAddress(src), src.remaining()); + } + + /** + * Copies {@code count} bytes from memory area {@code src} to memory area {@code dest}. + * + *

    The memory areas may overlap: copying takes place as though the bytes in {@code src} are first copied into a temporary array that does not overlap + * {@code src} or {@code dest}, and the bytes are then copied from the temporary array to {@code dest}.

    + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memmove(@NativeType("void *") ShortBuffer dest, @NativeType("void const *") ShortBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemmove(memAddress(dest), memAddress(src), Integer.toUnsignedLong(src.remaining()) << 1); + } + + /** + * Copies {@code count} bytes from memory area {@code src} to memory area {@code dest}. + * + *

    The memory areas may overlap: copying takes place as though the bytes in {@code src} are first copied into a temporary array that does not overlap + * {@code src} or {@code dest}, and the bytes are then copied from the temporary array to {@code dest}.

    + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memmove(@NativeType("void *") IntBuffer dest, @NativeType("void const *") IntBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemmove(memAddress(dest), memAddress(src), Integer.toUnsignedLong(src.remaining()) << 2); + } + + /** + * Copies {@code count} bytes from memory area {@code src} to memory area {@code dest}. + * + *

    The memory areas may overlap: copying takes place as though the bytes in {@code src} are first copied into a temporary array that does not overlap + * {@code src} or {@code dest}, and the bytes are then copied from the temporary array to {@code dest}.

    + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memmove(@NativeType("void *") LongBuffer dest, @NativeType("void const *") LongBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemmove(memAddress(dest), memAddress(src), Integer.toUnsignedLong(src.remaining()) << 3); + } + + /** + * Copies {@code count} bytes from memory area {@code src} to memory area {@code dest}. + * + *

    The memory areas may overlap: copying takes place as though the bytes in {@code src} are first copied into a temporary array that does not overlap + * {@code src} or {@code dest}, and the bytes are then copied from the temporary array to {@code dest}.

    + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memmove(@NativeType("void *") FloatBuffer dest, @NativeType("void const *") FloatBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemmove(memAddress(dest), memAddress(src), Integer.toUnsignedLong(src.remaining()) << 2); + } + + /** + * Copies {@code count} bytes from memory area {@code src} to memory area {@code dest}. + * + *

    The memory areas may overlap: copying takes place as though the bytes in {@code src} are first copied into a temporary array that does not overlap + * {@code src} or {@code dest}, and the bytes are then copied from the temporary array to {@code dest}.

    + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static long memmove(@NativeType("void *") DoubleBuffer dest, @NativeType("void const *") DoubleBuffer src) { + if (CHECKS) { + check(dest, src.remaining()); + } + return nmemmove(memAddress(dest), memAddress(src), Integer.toUnsignedLong(src.remaining()) << 3); + } + + // --- [ strlen ] --- + + public static native long nstrlen(long str); + + @NativeType("size_t") + public static long strlen(@NativeType("char const *") ByteBuffer str) { + if (CHECKS) { + checkNT1(str); + } + return nstrlen(memAddress(str)); + } + + // --- [ strerror ] --- + + /** Unsafe version of: {@link #strerror} */ + public static native long nstrerror(int errnum); + + /** Returns string describing error number. */ + @Nullable + @NativeType("char *") + public static String strerror(int errnum) { + long __result = nstrerror(errnum); + return memASCIISafe(__result); + } + + /** Array version of: {@link #nmemset} */ + public static native long nmemset(byte[] dest, int c, long count); + + /** Array version of: {@link #memset} */ + @NativeType("void *") + public static long memset(@NativeType("void *") byte[] dest, int c) { + return nmemset(dest, c, Integer.toUnsignedLong(dest.length) << 0); + } + + /** Array version of: {@link #nmemset} */ + public static native long nmemset(short[] dest, int c, long count); + + /** Array version of: {@link #memset} */ + @NativeType("void *") + public static long memset(@NativeType("void *") short[] dest, int c) { + return nmemset(dest, c, Integer.toUnsignedLong(dest.length) << 1); + } + + /** Array version of: {@link #nmemset} */ + public static native long nmemset(int[] dest, int c, long count); + + /** Array version of: {@link #memset} */ + @NativeType("void *") + public static long memset(@NativeType("void *") int[] dest, int c) { + return nmemset(dest, c, Integer.toUnsignedLong(dest.length) << 2); + } + + /** Array version of: {@link #nmemset} */ + public static native long nmemset(long[] dest, int c, long count); + + /** Array version of: {@link #memset} */ + @NativeType("void *") + public static long memset(@NativeType("void *") long[] dest, int c) { + return nmemset(dest, c, Integer.toUnsignedLong(dest.length) << 3); + } + + /** Array version of: {@link #nmemset} */ + public static native long nmemset(float[] dest, int c, long count); + + /** Array version of: {@link #memset} */ + @NativeType("void *") + public static long memset(@NativeType("void *") float[] dest, int c) { + return nmemset(dest, c, Integer.toUnsignedLong(dest.length) << 2); + } + + /** Array version of: {@link #nmemset} */ + public static native long nmemset(double[] dest, int c, long count); + + /** Array version of: {@link #memset} */ + @NativeType("void *") + public static long memset(@NativeType("void *") double[] dest, int c) { + return nmemset(dest, c, Integer.toUnsignedLong(dest.length) << 3); + } + + /** Array version of: {@link #nmemcpy} */ + public static native long nmemcpy(byte[] dest, byte[] src, long count); + + /** Array version of: {@link #memcpy} */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") byte[] dest, @NativeType("void const *") byte[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemcpy(dest, src, Integer.toUnsignedLong(src.length) << 0); + } + + /** Array version of: {@link #nmemcpy} */ + public static native long nmemcpy(short[] dest, short[] src, long count); + + /** Array version of: {@link #memcpy} */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") short[] dest, @NativeType("void const *") short[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemcpy(dest, src, Integer.toUnsignedLong(src.length) << 1); + } + + /** Array version of: {@link #nmemcpy} */ + public static native long nmemcpy(int[] dest, int[] src, long count); + + /** Array version of: {@link #memcpy} */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") int[] dest, @NativeType("void const *") int[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemcpy(dest, src, Integer.toUnsignedLong(src.length) << 2); + } + + /** Array version of: {@link #nmemcpy} */ + public static native long nmemcpy(long[] dest, long[] src, long count); + + /** Array version of: {@link #memcpy} */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") long[] dest, @NativeType("void const *") long[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemcpy(dest, src, Integer.toUnsignedLong(src.length) << 3); + } + + /** Array version of: {@link #nmemcpy} */ + public static native long nmemcpy(float[] dest, float[] src, long count); + + /** Array version of: {@link #memcpy} */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") float[] dest, @NativeType("void const *") float[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemcpy(dest, src, Integer.toUnsignedLong(src.length) << 2); + } + + /** Array version of: {@link #nmemcpy} */ + public static native long nmemcpy(double[] dest, double[] src, long count); + + /** Array version of: {@link #memcpy} */ + @NativeType("void *") + public static long memcpy(@NativeType("void *") double[] dest, @NativeType("void const *") double[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemcpy(dest, src, Integer.toUnsignedLong(src.length) << 3); + } + + /** Array version of: {@link #nmemmove} */ + public static native long nmemmove(byte[] dest, byte[] src, long count); + + /** Array version of: {@link #memmove} */ + @NativeType("void *") + public static long memmove(@NativeType("void *") byte[] dest, @NativeType("void const *") byte[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemmove(dest, src, Integer.toUnsignedLong(src.length) << 0); + } + + /** Array version of: {@link #nmemmove} */ + public static native long nmemmove(short[] dest, short[] src, long count); + + /** Array version of: {@link #memmove} */ + @NativeType("void *") + public static long memmove(@NativeType("void *") short[] dest, @NativeType("void const *") short[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemmove(dest, src, Integer.toUnsignedLong(src.length) << 1); + } + + /** Array version of: {@link #nmemmove} */ + public static native long nmemmove(int[] dest, int[] src, long count); + + /** Array version of: {@link #memmove} */ + @NativeType("void *") + public static long memmove(@NativeType("void *") int[] dest, @NativeType("void const *") int[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemmove(dest, src, Integer.toUnsignedLong(src.length) << 2); + } + + /** Array version of: {@link #nmemmove} */ + public static native long nmemmove(long[] dest, long[] src, long count); + + /** Array version of: {@link #memmove} */ + @NativeType("void *") + public static long memmove(@NativeType("void *") long[] dest, @NativeType("void const *") long[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemmove(dest, src, Integer.toUnsignedLong(src.length) << 3); + } + + /** Array version of: {@link #nmemmove} */ + public static native long nmemmove(float[] dest, float[] src, long count); + + /** Array version of: {@link #memmove} */ + @NativeType("void *") + public static long memmove(@NativeType("void *") float[] dest, @NativeType("void const *") float[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemmove(dest, src, Integer.toUnsignedLong(src.length) << 2); + } + + /** Array version of: {@link #nmemmove} */ + public static native long nmemmove(double[] dest, double[] src, long count); + + /** Array version of: {@link #memmove} */ + @NativeType("void *") + public static long memmove(@NativeType("void *") double[] dest, @NativeType("void const *") double[] src) { + if (CHECKS) { + check(dest, src.length); + } + return nmemmove(dest, src, Integer.toUnsignedLong(src.length) << 3); + } + + /** + * Fills memory with a constant byte. + * + * @param dest pointer to destination + * @param c character to set + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static > long memset(@NativeType("void *") T dest, @NativeType("int") int c) { + return nmemset(memAddress(dest), c, Integer.toUnsignedLong(dest.remaining()) * dest.sizeof()); + } + + /** + * Copies bytes between memory areas that must not overlap. + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static > long memcpy(@NativeType("void *") T dest, @NativeType("void const *") T src) { + if (CHECKS) { + check(src, dest.remaining()); + } + return nmemcpy(memAddress(dest), memAddress(src), (long)src.remaining() * src.sizeof()); + } + + /** + * Copies {@code count} bytes from memory area {@code src} to memory area {@code dest}. + * + *

    The memory areas may overlap: copying takes place as though the bytes in {@code src} are first copied into a temporary array that does not overlap + * {@code src} or {@code dest}, and the bytes are then copied from the temporary array to {@code dest}.

    + * + * @param dest pointer to the destination memory area + * @param src pointer to the source memory area + * + * @return the value of {@code dest} + */ + @NativeType("void *") + public static > long memmove(@NativeType("void *") T dest, @NativeType("void const *") T src) { + if (CHECKS) { + check(src, dest.remaining()); + } + return nmemmove(memAddress(dest), memAddress(src), (long)src.remaining() * src.sizeof()); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFICIF.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFICIF.java new file mode 100644 index 000000000..f13fd7d2d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFICIF.java @@ -0,0 +1,303 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.libffi; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains information about a libffi call interface. + * + *

    Layout

    + * + *
    
    + * struct ffi_cif {
    + *     ffi_abi abi;
    + *     unsigned nargs;
    + *     {@link FFIType ffi_type} ** arg_types;
    + *     {@link FFIType ffi_type} * rtype;
    + *     unsigned bytes;
    + *     unsigned flags;
    + * }
    + */ +@NativeType("struct ffi_cif") +public class FFICIF extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ABI, + NARGS, + ARG_TYPES, + RTYPE, + BYTES, + FLAGS; + + static { + try (MemoryStack stack = stackPush()) { + IntBuffer offsets = stack.mallocInt(7); + SIZEOF = offsets(memAddress(offsets)); + + ABI = offsets.get(0); + NARGS = offsets.get(1); + ARG_TYPES = offsets.get(2); + RTYPE = offsets.get(3); + BYTES = offsets.get(4); + FLAGS = offsets.get(5); + + ALIGNOF = offsets.get(6); + } + } + + private static native int offsets(long buffer); + + protected FFICIF(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FFICIF create(long address, @Nullable ByteBuffer container) { + return new FFICIF(address, container); + } + + /** + * Creates a {@code FFICIF} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FFICIF(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code abi} field. */ + @NativeType("ffi_abi") + public int abi() { return nabi(address()); } + /** @return the value of the {@code nargs} field. */ + @NativeType("unsigned") + public int nargs() { return nnargs(address()); } + /** + * @return a {@link PointerBuffer} view of the data pointed to by the {@code arg_types} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("ffi_type **") + public PointerBuffer arg_types(int capacity) { return narg_types(address(), capacity); } + /** @return a {@link FFIType} view of the struct pointed to by the {@code rtype} field. */ + @NativeType("ffi_type *") + public FFIType rtype() { return nrtype(address()); } + /** @return the value of the {@code bytes} field. */ + @NativeType("unsigned") + public int bytes() { return nbytes(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("unsigned") + public int flags() { return nflags(address()); } + + // ----------------------------------- + + /** Returns a new {@code FFICIF} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FFICIF malloc() { + return new FFICIF(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FFICIF} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FFICIF calloc() { + return new FFICIF(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FFICIF} instance allocated with {@link BufferUtils}. */ + public static FFICIF create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FFICIF(memAddress(container), container); + } + + /** Returns a new {@code FFICIF} instance for the specified memory address. */ + public static FFICIF create(long address) { + return new FFICIF(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FFICIF createSafe(long address) { + return address == NULL ? null : new FFICIF(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FFICIF} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FFICIF malloc(MemoryStack stack) { + return new FFICIF(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FFICIF} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FFICIF calloc(MemoryStack stack) { + return new FFICIF(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #abi}. */ + public static int nabi(long struct) { return UNSAFE.getInt(null, struct + FFICIF.ABI); } + /** Unsafe version of {@link #nargs}. */ + public static int nnargs(long struct) { return UNSAFE.getInt(null, struct + FFICIF.NARGS); } + /** Unsafe version of {@link #arg_types(int) arg_types}. */ + public static PointerBuffer narg_types(long struct, int capacity) { return memPointerBuffer(memGetAddress(struct + FFICIF.ARG_TYPES), capacity); } + /** Unsafe version of {@link #rtype}. */ + public static FFIType nrtype(long struct) { return FFIType.create(memGetAddress(struct + FFICIF.RTYPE)); } + /** Unsafe version of {@link #bytes}. */ + public static int nbytes(long struct) { return UNSAFE.getInt(null, struct + FFICIF.BYTES); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + FFICIF.FLAGS); } + + // ----------------------------------- + + /** An array of {@link FFICIF} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FFICIF ELEMENT_FACTORY = FFICIF.create(-1L); + + /** + * Creates a new {@code FFICIF.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FFICIF#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FFICIF getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code abi} field. */ + @NativeType("ffi_abi") + public int abi() { return FFICIF.nabi(address()); } + /** @return the value of the {@code nargs} field. */ + @NativeType("unsigned") + public int nargs() { return FFICIF.nnargs(address()); } + /** + * @return a {@link PointerBuffer} view of the data pointed to by the {@code arg_types} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("ffi_type **") + public PointerBuffer arg_types(int capacity) { return FFICIF.narg_types(address(), capacity); } + /** @return a {@link FFIType} view of the struct pointed to by the {@code rtype} field. */ + @NativeType("ffi_type *") + public FFIType rtype() { return FFICIF.nrtype(address()); } + /** @return the value of the {@code bytes} field. */ + @NativeType("unsigned") + public int bytes() { return FFICIF.nbytes(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("unsigned") + public int flags() { return FFICIF.nflags(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFIClosure.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFIClosure.java new file mode 100644 index 000000000..1616ab0a9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFIClosure.java @@ -0,0 +1,262 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.libffi; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * The libffi closure structure. + * + *

    Layout

    + * + *
    
    + * struct ffi_closure {
    + *     {@link FFICIF ffi_cif} * {@link #cif};
    + *     void (*)(ffi_cif*,void*,void**,void*) {@link #fun};
    + *     void * {@link #user_data};
    + * }
    + */ +@NativeType("struct ffi_closure") +public class FFIClosure extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + CIF, + FUN, + USER_DATA; + + static { + try (MemoryStack stack = stackPush()) { + IntBuffer offsets = stack.mallocInt(4); + SIZEOF = offsets(memAddress(offsets)); + + CIF = offsets.get(0); + FUN = offsets.get(1); + USER_DATA = offsets.get(2); + + ALIGNOF = offsets.get(3); + } + } + + private static native int offsets(long buffer); + + protected FFIClosure(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FFIClosure create(long address, @Nullable ByteBuffer container) { + return new FFIClosure(address, container); + } + + /** + * Creates a {@code FFIClosure} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FFIClosure(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** a pointer to an {@code ffi_cif} structure */ + @NativeType("ffi_cif *") + public FFICIF cif() { return ncif(address()); } + /** a pointer to a function */ + @NativeType("void (*)(ffi_cif*,void*,void**,void*)") + public long fun() { return nfun(address()); } + /** a pointer to user-specified data */ + @NativeType("void *") + public long user_data() { return nuser_data(address()); } + + // ----------------------------------- + + /** Returns a new {@code FFIClosure} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FFIClosure malloc() { + return new FFIClosure(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FFIClosure} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FFIClosure calloc() { + return new FFIClosure(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FFIClosure} instance allocated with {@link BufferUtils}. */ + public static FFIClosure create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FFIClosure(memAddress(container), container); + } + + /** Returns a new {@code FFIClosure} instance for the specified memory address. */ + public static FFIClosure create(long address) { + return new FFIClosure(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FFIClosure createSafe(long address) { + return address == NULL ? null : new FFIClosure(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FFIClosure} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FFIClosure malloc(MemoryStack stack) { + return new FFIClosure(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FFIClosure} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FFIClosure calloc(MemoryStack stack) { + return new FFIClosure(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #cif}. */ + public static FFICIF ncif(long struct) { return FFICIF.create(memGetAddress(struct + FFIClosure.CIF)); } + /** Unsafe version of {@link #fun}. */ + public static long nfun(long struct) { return memGetAddress(struct + FFIClosure.FUN); } + /** Unsafe version of {@link #user_data}. */ + public static long nuser_data(long struct) { return memGetAddress(struct + FFIClosure.USER_DATA); } + + // ----------------------------------- + + /** An array of {@link FFIClosure} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FFIClosure ELEMENT_FACTORY = FFIClosure.create(-1L); + + /** + * Creates a new {@code FFIClosure.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FFIClosure#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FFIClosure getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FFICIF} view of the struct pointed to by the {@link FFIClosure#cif} field. */ + @NativeType("ffi_cif *") + public FFICIF cif() { return FFIClosure.ncif(address()); } + /** @return the value of the {@link FFIClosure#fun} field. */ + @NativeType("void (*)(ffi_cif*,void*,void**,void*)") + public long fun() { return FFIClosure.nfun(address()); } + /** @return the value of the {@link FFIClosure#user_data} field. */ + @NativeType("void *") + public long user_data() { return FFIClosure.nuser_data(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFIType.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFIType.java new file mode 100644 index 000000000..496e253a7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/FFIType.java @@ -0,0 +1,338 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.libffi; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains information about a libffi type. + * + *

    Layout

    + * + *
    
    + * struct ffi_type {
    + *     size_t {@link #size};
    + *     unsigned short {@link #alignment};
    + *     unsigned short {@link #type};
    + *     ffi_type * {@link #elements};
    + * }
    + */ +@NativeType("struct ffi_type") +public class FFIType extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + SIZE, + ALIGNMENT, + TYPE, + ELEMENTS; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(2), + __member(2), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + SIZE = layout.offsetof(0); + ALIGNMENT = layout.offsetof(1); + TYPE = layout.offsetof(2); + ELEMENTS = layout.offsetof(3); + } + + protected FFIType(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FFIType create(long address, @Nullable ByteBuffer container) { + return new FFIType(address, container); + } + + /** + * Creates a {@code FFIType} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FFIType(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** set by libffi; you should initialize it to zero. */ + @NativeType("size_t") + public long size() { return nsize(address()); } + /** set by libffi; you should initialize it to zero. */ + @NativeType("unsigned short") + public short alignment() { return nalignment(address()); } + /** for a structure, this should be set to {@link LibFFI#FFI_TYPE_STRUCT TYPE_STRUCT}. */ + @NativeType("unsigned short") + public short type() { return ntype(address()); } + /** + * @param capacity the number of elements in the returned buffer + * + * @return a null-terminated array of pointers to {@code ffi_type} objects. There is one element per field of the struct. + */ + @Nullable + @NativeType("ffi_type *") + public PointerBuffer elements(int capacity) { return nelements(address(), capacity); } + + /** Sets the specified value to the {@link #size} field. */ + public FFIType size(@NativeType("size_t") long value) { nsize(address(), value); return this; } + /** Sets the specified value to the {@link #alignment} field. */ + public FFIType alignment(@NativeType("unsigned short") short value) { nalignment(address(), value); return this; } + /** Sets the specified value to the {@link #type} field. */ + public FFIType type(@NativeType("unsigned short") short value) { ntype(address(), value); return this; } + /** Sets the address of the specified {@link PointerBuffer} to the {@link #elements} field. */ + public FFIType elements(@Nullable @NativeType("ffi_type *") PointerBuffer value) { nelements(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FFIType set( + long size, + short alignment, + short type, + @Nullable PointerBuffer elements + ) { + size(size); + alignment(alignment); + type(type); + elements(elements); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FFIType set(FFIType src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FFIType} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FFIType malloc() { + return new FFIType(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FFIType} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FFIType calloc() { + return new FFIType(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FFIType} instance allocated with {@link BufferUtils}. */ + public static FFIType create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FFIType(memAddress(container), container); + } + + /** Returns a new {@code FFIType} instance for the specified memory address. */ + public static FFIType create(long address) { + return new FFIType(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FFIType createSafe(long address) { + return address == NULL ? null : new FFIType(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FFIType} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FFIType malloc(MemoryStack stack) { + return new FFIType(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FFIType} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FFIType calloc(MemoryStack stack) { + return new FFIType(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #size}. */ + public static long nsize(long struct) { return memGetAddress(struct + FFIType.SIZE); } + /** Unsafe version of {@link #alignment}. */ + public static short nalignment(long struct) { return UNSAFE.getShort(null, struct + FFIType.ALIGNMENT); } + /** Unsafe version of {@link #type}. */ + public static short ntype(long struct) { return UNSAFE.getShort(null, struct + FFIType.TYPE); } + /** Unsafe version of {@link #elements(int) elements}. */ + @Nullable public static PointerBuffer nelements(long struct, int capacity) { return memPointerBufferSafe(memGetAddress(struct + FFIType.ELEMENTS), capacity); } + + /** Unsafe version of {@link #size(long) size}. */ + public static void nsize(long struct, long value) { memPutAddress(struct + FFIType.SIZE, value); } + /** Unsafe version of {@link #alignment(short) alignment}. */ + public static void nalignment(long struct, short value) { UNSAFE.putShort(null, struct + FFIType.ALIGNMENT, value); } + /** Unsafe version of {@link #type(short) type}. */ + public static void ntype(long struct, short value) { UNSAFE.putShort(null, struct + FFIType.TYPE, value); } + /** Unsafe version of {@link #elements(PointerBuffer) elements}. */ + public static void nelements(long struct, @Nullable PointerBuffer value) { memPutAddress(struct + FFIType.ELEMENTS, memAddressSafe(value)); } + + // ----------------------------------- + + /** An array of {@link FFIType} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FFIType ELEMENT_FACTORY = FFIType.create(-1L); + + /** + * Creates a new {@code FFIType.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FFIType#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FFIType getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link FFIType#size} field. */ + @NativeType("size_t") + public long size() { return FFIType.nsize(address()); } + /** @return the value of the {@link FFIType#alignment} field. */ + @NativeType("unsigned short") + public short alignment() { return FFIType.nalignment(address()); } + /** @return the value of the {@link FFIType#type} field. */ + @NativeType("unsigned short") + public short type() { return FFIType.ntype(address()); } + /** + * @return a {@link PointerBuffer} view of the data pointed to by the {@link FFIType#elements} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("ffi_type *") + public PointerBuffer elements(int capacity) { return FFIType.nelements(address(), capacity); } + + /** Sets the specified value to the {@link FFIType#size} field. */ + public Buffer size(@NativeType("size_t") long value) { FFIType.nsize(address(), value); return this; } + /** Sets the specified value to the {@link FFIType#alignment} field. */ + public Buffer alignment(@NativeType("unsigned short") short value) { FFIType.nalignment(address(), value); return this; } + /** Sets the specified value to the {@link FFIType#type} field. */ + public Buffer type(@NativeType("unsigned short") short value) { FFIType.ntype(address(), value); return this; } + /** Sets the address of the specified {@link PointerBuffer} to the {@link FFIType#elements} field. */ + public Buffer elements(@Nullable @NativeType("ffi_type *") PointerBuffer value) { FFIType.nelements(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/LibFFI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/LibFFI.java new file mode 100644 index 000000000..d0d6d83f5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/libffi/LibFFI.java @@ -0,0 +1,659 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.libffi; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the libffi library. + * + *

    The foreign function interface provides a mechanism by which a function can generate a call to another function at runtime without requiring knowledge + * of the called function's interface at compile time. This enables use of native libraries that LWJGL does not provide bindings for.

    + * + *

    libffi assumes that you have a pointer to the function you wish to call and that you know the number and types of arguments to pass it, as well as the + * return type of the function.

    + * + *

    The first thing you must do is create an {@link FFICIF} object that matches the signature of the function you wish to call. This is a separate step + * because it is common to make multiple calls using a single {@link FFICIF}. The {@code cif} in {@code ffi_cif} stands for Call InterFace. To prepare a + * call interface object, use the function {@link #ffi_prep_cif prep_cif}. To call a function using an initialized {@code ffi_cif}, use the {@link #ffi_call call} function.

    + */ +public class LibFFI { + + static { Library.initialize(); } + + /** Types used to create custom {@link FFICIF}. */ + public static final short + FFI_TYPE_VOID = 0, + FFI_TYPE_INT = 1, + FFI_TYPE_FLOAT = 2, + FFI_TYPE_DOUBLE = 3, + FFI_TYPE_LONGDOUBLE = FFI_TYPE_DOUBLE(), + FFI_TYPE_UINT8 = 5, + FFI_TYPE_SINT8 = 6, + FFI_TYPE_UINT16 = 7, + FFI_TYPE_SINT16 = 8, + FFI_TYPE_UINT32 = 9, + FFI_TYPE_SINT32 = 10, + FFI_TYPE_UINT64 = 11, + FFI_TYPE_SINT64 = 12, + FFI_TYPE_STRUCT = 13, + FFI_TYPE_POINTER = 14; + + /** + * ABI enumeration. + * + *

    LWJGL note: ABIs that are not applicable to the current platform will have a value of -1 and should not be used.

    + * + *
    Enum values:
    + * + *
      + *
    • {@link #FFI_FIRST_ABI FIRST_ABI}
    • + *
    • {@link #FFI_WIN64 WIN64}
    • + *
    • {@link #FFI_GNUW64 GNUW64}
    • + *
    • {@link #FFI_UNIX64 UNIX64}
    • + *
    • {@link #FFI_EFI64 EFI64}
    • + *
    • {@link #FFI_SYSV SYSV}
    • + *
    • {@link #FFI_STDCALL STDCALL}
    • + *
    • {@link #FFI_THISCALL THISCALL}
    • + *
    • {@link #FFI_FASTCALL FASTCALL}
    • + *
    • {@link #FFI_MS_CDECL MS_CDECL}
    • + *
    • {@link #FFI_PASCAL PASCAL}
    • + *
    • {@link #FFI_REGISTER REGISTER}
    • + *
    • {@link #FFI_VFP VFP}
    • + *
    • {@link #FFI_LAST_ABI LAST_ABI}
    • + *
    • {@link #FFI_DEFAULT_ABI DEFAULT_ABI}
    • + *
    + */ + public static final int + FFI_FIRST_ABI = FFI_FIRST_ABI(), + FFI_WIN64 = FFI_WIN64(), + FFI_GNUW64 = FFI_GNUW64(), + FFI_UNIX64 = FFI_UNIX64(), + FFI_EFI64 = FFI_EFI64(), + FFI_SYSV = FFI_SYSV(), + FFI_STDCALL = FFI_STDCALL(), + FFI_THISCALL = FFI_THISCALL(), + FFI_FASTCALL = FFI_FASTCALL(), + FFI_MS_CDECL = FFI_MS_CDECL(), + FFI_PASCAL = FFI_PASCAL(), + FFI_REGISTER = FFI_REGISTER(), + FFI_VFP = FFI_VFP(), + FFI_LAST_ABI = FFI_LAST_ABI(), + FFI_DEFAULT_ABI = FFI_DEFAULT_ABI(); + + /** + * Status codes. + * + *
    Enum values:
    + * + *
      + *
    • {@link #FFI_OK OK}
    • + *
    • {@link #FFI_BAD_TYPEDEF BAD_TYPEDEF}
    • + *
    • {@link #FFI_BAD_ABI BAD_ABI}
    • + *
    • {@link #FFI_BAD_ARGTYPE BAD_ARGTYPE}
    • + *
    + */ + public static final int + FFI_OK = 0, + FFI_BAD_TYPEDEF = 1, + FFI_BAD_ABI = 2, + FFI_BAD_ARGTYPE = 3; + + protected LibFFI() { + throw new UnsupportedOperationException(); + } + + // --- [ FFI_TYPE_DOUBLE ] --- + + /** The double type. */ + private static native short FFI_TYPE_DOUBLE(); + + // --- [ FFI_WIN64 ] --- + + private static native int FFI_WIN64(); + + // --- [ FFI_GNUW64 ] --- + + private static native int FFI_GNUW64(); + + // --- [ FFI_UNIX64 ] --- + + private static native int FFI_UNIX64(); + + // --- [ FFI_EFI64 ] --- + + private static native int FFI_EFI64(); + + // --- [ FFI_SYSV ] --- + + private static native int FFI_SYSV(); + + // --- [ FFI_STDCALL ] --- + + private static native int FFI_STDCALL(); + + // --- [ FFI_THISCALL ] --- + + private static native int FFI_THISCALL(); + + // --- [ FFI_FASTCALL ] --- + + private static native int FFI_FASTCALL(); + + // --- [ FFI_MS_CDECL ] --- + + private static native int FFI_MS_CDECL(); + + // --- [ FFI_PASCAL ] --- + + private static native int FFI_PASCAL(); + + // --- [ FFI_REGISTER ] --- + + private static native int FFI_REGISTER(); + + // --- [ FFI_VFP ] --- + + private static native int FFI_VFP(); + + // --- [ FFI_FIRST_ABI ] --- + + private static native int FFI_FIRST_ABI(); + + // --- [ FFI_LAST_ABI ] --- + + private static native int FFI_LAST_ABI(); + + // --- [ FFI_DEFAULT_ABI ] --- + + private static native int FFI_DEFAULT_ABI(); + + // --- [ ffi_type_void ] --- + + private static native long nffi_type_void(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_void() { + long __result = nffi_type_void(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_void} struct. */ + public static final FFIType ffi_type_void = ffi_type_void(); + + // --- [ ffi_type_uint8 ] --- + + private static native long nffi_type_uint8(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_uint8() { + long __result = nffi_type_uint8(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_uint8} struct. */ + public static final FFIType ffi_type_uint8 = ffi_type_uint8(); + + // --- [ ffi_type_sint8 ] --- + + private static native long nffi_type_sint8(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_sint8() { + long __result = nffi_type_sint8(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_sint8} struct. */ + public static final FFIType ffi_type_sint8 = ffi_type_sint8(); + + // --- [ ffi_type_uint16 ] --- + + private static native long nffi_type_uint16(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_uint16() { + long __result = nffi_type_uint16(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_uint16} struct. */ + public static final FFIType ffi_type_uint16 = ffi_type_uint16(); + + // --- [ ffi_type_sint16 ] --- + + private static native long nffi_type_sint16(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_sint16() { + long __result = nffi_type_sint16(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_sint16} struct. */ + public static final FFIType ffi_type_sint16 = ffi_type_sint16(); + + // --- [ ffi_type_uint32 ] --- + + private static native long nffi_type_uint32(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_uint32() { + long __result = nffi_type_uint32(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_uint32} struct. */ + public static final FFIType ffi_type_uint32 = ffi_type_uint32(); + + // --- [ ffi_type_sint32 ] --- + + private static native long nffi_type_sint32(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_sint32() { + long __result = nffi_type_sint32(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_sint32} struct. */ + public static final FFIType ffi_type_sint32 = ffi_type_sint32(); + + // --- [ ffi_type_uint64 ] --- + + private static native long nffi_type_uint64(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_uint64() { + long __result = nffi_type_uint64(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_uint64} struct. */ + public static final FFIType ffi_type_uint64 = ffi_type_uint64(); + + // --- [ ffi_type_sint64 ] --- + + private static native long nffi_type_sint64(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_sint64() { + long __result = nffi_type_sint64(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_sint64} struct. */ + public static final FFIType ffi_type_sint64 = ffi_type_sint64(); + + // --- [ ffi_type_uchar ] --- + + private static native long nffi_type_uchar(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_uchar() { + long __result = nffi_type_uchar(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_uchar} struct. */ + public static final FFIType ffi_type_uchar = ffi_type_uchar(); + + // --- [ ffi_type_schar ] --- + + private static native long nffi_type_schar(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_schar() { + long __result = nffi_type_schar(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_schar} struct. */ + public static final FFIType ffi_type_schar = ffi_type_schar(); + + // --- [ ffi_type_ushort ] --- + + private static native long nffi_type_ushort(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_ushort() { + long __result = nffi_type_ushort(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_ushort} struct. */ + public static final FFIType ffi_type_ushort = ffi_type_ushort(); + + // --- [ ffi_type_sshort ] --- + + private static native long nffi_type_sshort(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_sshort() { + long __result = nffi_type_sshort(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_sshort} struct. */ + public static final FFIType ffi_type_sshort = ffi_type_sshort(); + + // --- [ ffi_type_uint ] --- + + private static native long nffi_type_uint(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_uint() { + long __result = nffi_type_uint(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_uint} struct. */ + public static final FFIType ffi_type_uint = ffi_type_uint(); + + // --- [ ffi_type_sint ] --- + + private static native long nffi_type_sint(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_sint() { + long __result = nffi_type_sint(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_sint} struct. */ + public static final FFIType ffi_type_sint = ffi_type_sint(); + + // --- [ ffi_type_ulong ] --- + + private static native long nffi_type_ulong(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_ulong() { + long __result = nffi_type_ulong(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_ulong} struct. */ + public static final FFIType ffi_type_ulong = ffi_type_ulong(); + + // --- [ ffi_type_slong ] --- + + private static native long nffi_type_slong(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_slong() { + long __result = nffi_type_slong(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_slong} struct. */ + public static final FFIType ffi_type_slong = ffi_type_slong(); + + // --- [ ffi_type_float ] --- + + private static native long nffi_type_float(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_float() { + long __result = nffi_type_float(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_float} struct. */ + public static final FFIType ffi_type_float = ffi_type_float(); + + // --- [ ffi_type_double ] --- + + private static native long nffi_type_double(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_double() { + long __result = nffi_type_double(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_double} struct. */ + public static final FFIType ffi_type_double = ffi_type_double(); + + // --- [ ffi_type_longdouble ] --- + + private static native long nffi_type_longdouble(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_longdouble() { + long __result = nffi_type_longdouble(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_longdouble} struct. */ + public static final FFIType ffi_type_longdouble = ffi_type_longdouble(); + + // --- [ ffi_type_pointer ] --- + + private static native long nffi_type_pointer(); + + @NativeType("ffi_type *") + private static FFIType ffi_type_pointer() { + long __result = nffi_type_pointer(); + return FFIType.create(__result); + } + + /** The {@code ffi_type_pointer} struct. */ + public static final FFIType ffi_type_pointer = ffi_type_pointer(); + + // --- [ ffi_prep_cif ] --- + + /** + * Unsafe version of: {@link #ffi_prep_cif prep_cif} + * + * @param nargs the number of arguments that this function accepts + */ + public static native int nffi_prep_cif(long cif, int abi, int nargs, long rtype, long atypes); + + /** + * Initializes the specified Call Interface (CIF) according to the given parameters. + * + *

    The resulting {@code ffi_cif} holds pointers to all the {@code ffi_type} objects that were used during initialization. You must ensure that these type + * objects have a lifetime at least as long as that of the {@code ffi_cif}.

    + * + * @param cif the {@code ffi_cif} structure to prepare + * @param abi the ABI to use; normally {@link #FFI_DEFAULT_ABI DEFAULT_ABI} is what you want. One of:
    {@link #FFI_FIRST_ABI FIRST_ABI}{@link #FFI_WIN64 WIN64}{@link #FFI_GNUW64 GNUW64}{@link #FFI_UNIX64 UNIX64}{@link #FFI_EFI64 EFI64}{@link #FFI_SYSV SYSV}{@link #FFI_STDCALL STDCALL}{@link #FFI_THISCALL THISCALL}{@link #FFI_FASTCALL FASTCALL}{@link #FFI_MS_CDECL MS_CDECL}{@link #FFI_PASCAL PASCAL}
    {@link #FFI_REGISTER REGISTER}{@link #FFI_VFP VFP}{@link #FFI_LAST_ABI LAST_ABI}{@link #FFI_DEFAULT_ABI DEFAULT_ABI}
    + * @param rtype a pointer to an {@code ffi_type} structure that describes the return type of the function + * @param atypes a vector of {@code ffi_type} pointers. {@code atypes} must have {@code nargs} elements. If {@code nargs} is 0, this argument is ignored. + * + * @return a status code, of type {@code ffi_status}. + * + *

    This will be either {@link #FFI_OK OK} if everything worked properly; {@link #FFI_BAD_TYPEDEF BAD_TYPEDEF} if one of the {@code ffi_type} objects is incorrect; or {@link #FFI_BAD_ABI BAD_ABI} if the ABI + * parameter is invalid.

    + */ + @NativeType("ffi_status") + public static int ffi_prep_cif(@NativeType("ffi_cif *") FFICIF cif, @NativeType("ffi_abi") int abi, @NativeType("ffi_type *") FFIType rtype, @Nullable @NativeType("ffi_type **") PointerBuffer atypes) { + return nffi_prep_cif(cif.address(), abi, remainingSafe(atypes), rtype.address(), memAddressSafe(atypes)); + } + + // --- [ ffi_prep_cif_var ] --- + + /** + * Unsafe version of: {@link #ffi_prep_cif_var prep_cif_var} + * + * @param ntotalargs the total number of arguments, including variadic and fixed arguments + */ + public static native int nffi_prep_cif_var(long cif, int abi, int nfixedargs, int ntotalargs, long rtype, long atypes); + + /** + * Initializes the specified Call Interface (CIF) according to the given parameters for a call to a variadic function. + * + *

    Different CIF's must be prepped for calls to the same function when different numbers of arguments are passed. A call to {@code ffi_prep_cif_var} with + * {@code nfixedargs == ntotalargs} is NOT equivalent to a call to {@link #ffi_prep_cif prep_cif}.

    + * + *

    The resulting {@code ffi_cif} holds pointers to all the {@code ffi_type} objects that were used during initialization. You must ensure that these type + * objects have a lifetime at least as long as that of the {@code ffi_cif}.

    + * + * @param cif the {@code ffi_cif} structure to prepare + * @param abi the ABI to use; normally {@link #FFI_DEFAULT_ABI DEFAULT_ABI} is what you want. One of:
    {@link #FFI_FIRST_ABI FIRST_ABI}{@link #FFI_WIN64 WIN64}{@link #FFI_GNUW64 GNUW64}{@link #FFI_UNIX64 UNIX64}{@link #FFI_EFI64 EFI64}{@link #FFI_SYSV SYSV}{@link #FFI_STDCALL STDCALL}{@link #FFI_THISCALL THISCALL}{@link #FFI_FASTCALL FASTCALL}{@link #FFI_MS_CDECL MS_CDECL}{@link #FFI_PASCAL PASCAL}
    {@link #FFI_REGISTER REGISTER}{@link #FFI_VFP VFP}{@link #FFI_LAST_ABI LAST_ABI}{@link #FFI_DEFAULT_ABI DEFAULT_ABI}
    + * @param nfixedargs the number of fixed arguments, prior to any variadic arguments. It must be greater than zero. + * @param rtype a pointer to an {@code ffi_type} structure that describes the return type of the function + * @param atypes a vector of {@code ffi_type} pointers. {@code atypes} must have {@code ntotalargs} elements. + * + * @return a status code, of type {@code ffi_status}. + * + *

    This will be either {@link #FFI_OK OK} if everything worked properly; {@link #FFI_BAD_TYPEDEF BAD_TYPEDEF} if one of the {@code ffi_type} objects is incorrect; or {@link #FFI_BAD_ABI BAD_ABI} if the ABI + * parameter is invalid.

    + */ + @NativeType("ffi_status") + public static int ffi_prep_cif_var(@NativeType("ffi_cif *") FFICIF cif, @NativeType("ffi_abi") int abi, @NativeType("unsigned int") int nfixedargs, @NativeType("ffi_type *") FFIType rtype, @NativeType("ffi_type **") PointerBuffer atypes) { + return nffi_prep_cif_var(cif.address(), abi, nfixedargs, atypes.remaining(), rtype.address(), memAddress(atypes)); + } + + // --- [ ffi_call ] --- + + /** Unsafe version of: {@link #ffi_call call} */ + public static native void nffi_call(long cif, long fn, long rvalue, long avalues); + + /** + * Calls the function {@code fn} according to the description given in {@code cif}. + * + *

    {@code cif} must have already been prepared using {@link #ffi_prep_cif prep_cif}.

    + * + * @param cif a {@link FFICIF} structure. It must be initialized with {@link #ffi_prep_cif prep_cif} or {@link #ffi_prep_cif_var prep_cif_var} before it is used with {@code ffi_call}. + * @param fn the function to call + * @param rvalue a pointer to a chunk of memory that will hold the result of the function call. + * + *

    This must be large enough to hold the result, no smaller than the system register size (generally 32 or 64 bits), and must be suitably aligned; it + * is the caller's responsibility to ensure this. If CIF declares that the function returns {@code void} (using {@link #ffi_type_void type_void}), then {@code rvalue} is + * ignored.

    + * + *

    In most situations, libffi will handle promotion according to the ABI. However, for historical reasons, there is a special case with return values + * that must be handled by your code. In particular, for integral (not {@code struct}) types that are narrower than the system register size, the + * return value will be widened by libffi. libffi provides a type, {@code ffi_arg}, that can be used as the return type. For example, if the CIF was + * defined with a return type of {@code char}, libffi will try to store a full {@code ffi_arg} into the return value.

    + * @param avalues a vector of {@code void *} pointers that point to the memory locations holding the argument values for a call. + * + *

    If {@code cif} declares that the function has no arguments (i.e., {@code nargs} was 0), then {@code avalues} is ignored. Note that argument values + * may be modified by the callee (for instance, structs passed by value); the burden of copying pass-by-value arguments is placed on the caller.

    + * + *

    Note that while the return value must be register-sized, arguments should exactly match their declared type. For example, if an argument is a + * {@code short}, then the entry in {@code avalues} should point to an object declared as {@code short}; but if the return type is {@code short}, then + * {@code rvalue} should point to an object declared as a larger type - usually {@code ffi_arg}.

    + */ + public static void ffi_call(@NativeType("ffi_cif *") FFICIF cif, @NativeType("FFI_FN_TYPE") long fn, @Nullable @NativeType("void *") ByteBuffer rvalue, @Nullable @NativeType("void **") PointerBuffer avalues) { + if (CHECKS) { + check(fn); + } + nffi_call(cif.address(), fn, memAddressSafe(rvalue), memAddressSafe(avalues)); + } + + // --- [ ffi_get_struct_offsets ] --- + + /** Unsafe version of: {@link #ffi_get_struct_offsets get_struct_offsets} */ + public static native int nffi_get_struct_offsets(int abi, long struct_type, long offsets); + + /** + * Computes the offset of each element of the given structure type. + * + * @param abi the ABI to use; this is needed because in some cases the layout depends on the ABI + * @param offsets an out parameter. The caller is responsible for providing enough space for all the results to be written - one element per element type in + * {@code struct_type}. If {@code offsets} is {@code NULL}, then the type will be laid out but not otherwise modified. This can be useful for accessing the + * type's size or layout. + * + * @return returns {@link #FFI_OK OK} on success; {@link #FFI_BAD_ABI BAD_ABI} if {@code abi} is invalid; or {@link #FFI_BAD_TYPEDEF BAD_TYPEDEF} if {@code struct_type} is invalid in some way. Note that only + * {@code FFI_STRUCT} types are valid here. + */ + @NativeType("ffi_status") + public static int ffi_get_struct_offsets(@NativeType("ffi_abi") int abi, @NativeType("ffi_type *") FFIType struct_type, @Nullable @NativeType("size_t *") PointerBuffer offsets) { + return nffi_get_struct_offsets(abi, struct_type.address(), memAddressSafe(offsets)); + } + + // --- [ ffi_closure_alloc ] --- + + /** Unsafe version of: {@link #ffi_closure_alloc closure_alloc} */ + public static native long nffi_closure_alloc(long size, long code); + + /** + * Allocates a chunk of memory holding {@code size} bytes. + * + *

    Returns a pointer to the writable address, and sets {@code *code} to the corresponding executable address.

    + * + * @param size the number of bytes to allocate. Should be sufficient to hold an {@code ffi_closure} object ({@link FFIClosure#SIZEOF}). + * @param code a buffer in which to place the returned executable address + * + * @return a pointer to the writable address + */ + @Nullable + @NativeType("ffi_closure *") + public static FFIClosure ffi_closure_alloc(@NativeType("size_t") long size, @NativeType("void **") PointerBuffer code) { + if (CHECKS) { + check(code, 1); + } + long __result = nffi_closure_alloc(size, memAddress(code)); + return FFIClosure.createSafe(__result); + } + + // --- [ ffi_closure_free ] --- + + /** Unsafe version of: {@link #ffi_closure_free closure_free} */ + public static native void nffi_closure_free(long writable); + + /** + * Frees memory allocated using {@link #ffi_closure_alloc closure_alloc}. + * + * @param writable the address of an {@link FFIClosure} structure + */ + public static void ffi_closure_free(@NativeType("ffi_closure *") FFIClosure writable) { + nffi_closure_free(writable.address()); + } + + // --- [ ffi_prep_closure_loc ] --- + + /** Unsafe version of: {@link #ffi_prep_closure_loc prep_closure_loc} */ + public static native int nffi_prep_closure_loc(long closure, long cif, long fun, long user_data, long codeloc); + + /** + * Prepares a closure function. + * + *

    After calling {@code ffi_prep_closure_loc,} you can cast {@code codeloc} to the appropriate pointer-to-function type.

    + * + * @param closure the address of an {@code ffi_closure} object; this is the writable address returned by {@link #ffi_closure_alloc closure_alloc}. + * @param cif the {@code ffi_cif} describing the function parameters + * @param fun the function which will be called when the closure is invoked. It is called with the arguments: + * + *
      + *
    • {@code cif} - The {@code ffi_cif} passed to {@code ffi_prep_closure_loc}.
    • + *
    • {@code ret} - a pointer to the memory used for the function's return value. + * + *

      If the function is declared as returning {@code void}, then this value is garbage and should not be used.

      + * + *

      Otherwise, {@code fun} must fill the object to which this points, following the same special promotion behavior as {@code ffi_call}. That is, + * in most cases, {@code ret} points to an object of exactly the size of the type specified when {@code cif} was constructed. However, integral + * types narrower than the system register size are widened. In these cases your program may assume that {@code ret} points to an {@code ffi_arg} + * object.

    • + *
    • {@code args} - a vector of pointers to memory holding the arguments to the function.
    • + *
    • {@code user_data} - the same USER_DATA that was passed to {@code ffi_prep_closure_loc}.
    • + *
    + * @param user_data an arbitrary datum that is passed, uninterpreted, to your closure function + * @param codeloc the executable address returned by {@link #ffi_closure_alloc closure_alloc}. + * + * @return {@link #FFI_OK OK} if everything went ok, and one of the other {@code ffi_status} values on error + */ + @NativeType("ffi_status") + public static int ffi_prep_closure_loc(@NativeType("ffi_closure *") FFIClosure closure, @NativeType("ffi_cif *") FFICIF cif, @NativeType("FFI_CLOSURE_FUN") long fun, @NativeType("void *") long user_data, @NativeType("void *") long codeloc) { + if (CHECKS) { + check(fun); + check(codeloc); + } + return nffi_prep_closure_loc(closure.address(), cif.address(), fun, user_data, codeloc); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/CMsghdr.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/CMsghdr.java new file mode 100644 index 000000000..1d829c7e3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/CMsghdr.java @@ -0,0 +1,344 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct cmsghdr {
    + *     socklen_t {@link #cmsg_len};
    + *     int {@link #cmsg_level};
    + *     int {@link #cmsg_type};
    + *     char cmsg_data[0];
    + * }
    + */ +@NativeType("struct cmsghdr") +public class CMsghdr extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + CMSG_LEN, + CMSG_LEVEL, + CMSG_TYPE, + CMSG_DATA; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __array(1, 0) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + CMSG_LEN = layout.offsetof(0); + CMSG_LEVEL = layout.offsetof(1); + CMSG_TYPE = layout.offsetof(2); + CMSG_DATA = layout.offsetof(3); + } + + protected CMsghdr(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected CMsghdr create(long address, @Nullable ByteBuffer container) { + return new CMsghdr(address, container); + } + + /** + * Creates a {@code CMsghdr} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public CMsghdr(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** data byte count, including header */ + @NativeType("socklen_t") + public int cmsg_len() { return ncmsg_len(address()); } + /** originating protocol */ + public int cmsg_level() { return ncmsg_level(address()); } + /** protocol-specific type */ + public int cmsg_type() { return ncmsg_type(address()); } + /** @return a {@link ByteBuffer} view of the {@code cmsg_data} field. */ + @NativeType("char[0]") + public ByteBuffer cmsg_data() { return ncmsg_data(address()); } + /** @return the value at the specified index of the {@code cmsg_data} field. */ + @NativeType("char") + public byte cmsg_data(int index) { return ncmsg_data(address(), index); } + + /** Sets the specified value to the {@link #cmsg_len} field. */ + public CMsghdr cmsg_len(@NativeType("socklen_t") int value) { ncmsg_len(address(), value); return this; } + /** Sets the specified value to the {@link #cmsg_level} field. */ + public CMsghdr cmsg_level(int value) { ncmsg_level(address(), value); return this; } + /** Sets the specified value to the {@link #cmsg_type} field. */ + public CMsghdr cmsg_type(int value) { ncmsg_type(address(), value); return this; } + /** Copies the specified {@link ByteBuffer} to the {@code cmsg_data} field. */ + public CMsghdr cmsg_data(@NativeType("char[0]") ByteBuffer value) { ncmsg_data(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code cmsg_data} field. */ + public CMsghdr cmsg_data(int index, @NativeType("char") byte value) { ncmsg_data(address(), index, value); return this; } + + /** Initializes this struct with the specified values. */ + public CMsghdr set( + int cmsg_len, + int cmsg_level, + int cmsg_type, + ByteBuffer cmsg_data + ) { + cmsg_len(cmsg_len); + cmsg_level(cmsg_level); + cmsg_type(cmsg_type); + cmsg_data(cmsg_data); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public CMsghdr set(CMsghdr src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code CMsghdr} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static CMsghdr malloc() { + return new CMsghdr(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code CMsghdr} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static CMsghdr calloc() { + return new CMsghdr(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code CMsghdr} instance allocated with {@link BufferUtils}. */ + public static CMsghdr create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new CMsghdr(memAddress(container), container); + } + + /** Returns a new {@code CMsghdr} instance for the specified memory address. */ + public static CMsghdr create(long address) { + return new CMsghdr(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static CMsghdr createSafe(long address) { + return address == NULL ? null : new CMsghdr(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code CMsghdr} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static CMsghdr malloc(MemoryStack stack) { + return new CMsghdr(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code CMsghdr} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static CMsghdr calloc(MemoryStack stack) { + return new CMsghdr(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #cmsg_len}. */ + public static int ncmsg_len(long struct) { return UNSAFE.getInt(null, struct + CMsghdr.CMSG_LEN); } + /** Unsafe version of {@link #cmsg_level}. */ + public static int ncmsg_level(long struct) { return UNSAFE.getInt(null, struct + CMsghdr.CMSG_LEVEL); } + /** Unsafe version of {@link #cmsg_type}. */ + public static int ncmsg_type(long struct) { return UNSAFE.getInt(null, struct + CMsghdr.CMSG_TYPE); } + /** Unsafe version of {@link #cmsg_data}. */ + public static ByteBuffer ncmsg_data(long struct) { return memByteBuffer(struct + CMsghdr.CMSG_DATA, 0); } + /** Unsafe version of {@link #cmsg_data(int) cmsg_data}. */ + public static byte ncmsg_data(long struct, int index) { + return UNSAFE.getByte(null, struct + CMsghdr.CMSG_DATA + check(index, 0) * 1); + } + + /** Unsafe version of {@link #cmsg_len(int) cmsg_len}. */ + public static void ncmsg_len(long struct, int value) { UNSAFE.putInt(null, struct + CMsghdr.CMSG_LEN, value); } + /** Unsafe version of {@link #cmsg_level(int) cmsg_level}. */ + public static void ncmsg_level(long struct, int value) { UNSAFE.putInt(null, struct + CMsghdr.CMSG_LEVEL, value); } + /** Unsafe version of {@link #cmsg_type(int) cmsg_type}. */ + public static void ncmsg_type(long struct, int value) { UNSAFE.putInt(null, struct + CMsghdr.CMSG_TYPE, value); } + /** Unsafe version of {@link #cmsg_data(ByteBuffer) cmsg_data}. */ + public static void ncmsg_data(long struct, ByteBuffer value) { + if (CHECKS) { checkGT(value, 0); } + memCopy(memAddress(value), struct + CMsghdr.CMSG_DATA, value.remaining() * 1); + } + /** Unsafe version of {@link #cmsg_data(int, byte) cmsg_data}. */ + public static void ncmsg_data(long struct, int index, byte value) { + UNSAFE.putByte(null, struct + CMsghdr.CMSG_DATA + check(index, 0) * 1, value); + } + + // ----------------------------------- + + /** An array of {@link CMsghdr} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final CMsghdr ELEMENT_FACTORY = CMsghdr.create(-1L); + + /** + * Creates a new {@code CMsghdr.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link CMsghdr#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected CMsghdr getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link CMsghdr#cmsg_len} field. */ + @NativeType("socklen_t") + public int cmsg_len() { return CMsghdr.ncmsg_len(address()); } + /** @return the value of the {@link CMsghdr#cmsg_level} field. */ + public int cmsg_level() { return CMsghdr.ncmsg_level(address()); } + /** @return the value of the {@link CMsghdr#cmsg_type} field. */ + public int cmsg_type() { return CMsghdr.ncmsg_type(address()); } + /** @return a {@link ByteBuffer} view of the {@code cmsg_data} field. */ + @NativeType("char[0]") + public ByteBuffer cmsg_data() { return CMsghdr.ncmsg_data(address()); } + /** @return the value at the specified index of the {@code cmsg_data} field. */ + @NativeType("char") + public byte cmsg_data(int index) { return CMsghdr.ncmsg_data(address(), index); } + + /** Sets the specified value to the {@link CMsghdr#cmsg_len} field. */ + public Buffer cmsg_len(@NativeType("socklen_t") int value) { CMsghdr.ncmsg_len(address(), value); return this; } + /** Sets the specified value to the {@link CMsghdr#cmsg_level} field. */ + public Buffer cmsg_level(int value) { CMsghdr.ncmsg_level(address(), value); return this; } + /** Sets the specified value to the {@link CMsghdr#cmsg_type} field. */ + public Buffer cmsg_type(int value) { CMsghdr.ncmsg_type(address(), value); return this; } + /** Copies the specified {@link ByteBuffer} to the {@code cmsg_data} field. */ + public Buffer cmsg_data(@NativeType("char[0]") ByteBuffer value) { CMsghdr.ncmsg_data(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code cmsg_data} field. */ + public Buffer cmsg_data(int index, @NativeType("char") byte value) { CMsghdr.ncmsg_data(address(), index, value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/DynamicLinkLoader.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/DynamicLinkLoader.java new file mode 100644 index 000000000..785aaffb6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/DynamicLinkLoader.java @@ -0,0 +1,168 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to <dlfcn.h>. */ +public class DynamicLinkLoader { + + static { Library.initialize(); } + + /** The {@code mode} argument to {@link #dlopen} contains one of the following. */ + public static final int + RTLD_LAZY = 0x1, + RTLD_NOW = 0x2, + RTLD_BINDING_MASK = 0x3, + RTLD_NOLOAD = 0x4, + RTLD_DEEPBIND = 0x8; + + /** + * If the following bit is set in the {@code mode} argument to {@link #dlopen}, the symbols of the loaded object and its dependencies are made visible as + * if the object were linked directly into the program. + */ + public static final int RTLD_GLOBAL = 0x100; + + /** + * Unix98 demands the following flag which is the inverse to {@link #RTLD_GLOBAL}. The implementation does this by default and so we can define the value + * to zero. + */ + public static final int RTLD_LOCAL = 0; + + /** Do not delete object when closed. */ + public static final int RTLD_NODELETE = 0x1000; + + protected DynamicLinkLoader() { + throw new UnsupportedOperationException(); + } + + // --- [ dlopen ] --- + + /** Unsafe version of: {@link #dlopen} */ + public static native long ndlopen(long filename, int mode); + + /** + * Loads the dynamic library file named by the null-terminated string {@code filename} and returns an opaque "handle" for the dynamic library. If + * {@code filename} is {@code NULL}, then the returned handle is for the main program. + * + * @param filename the name of the dynamic library to open, or {@code NULL} + * @param mode a bitfield. One or more of:
    {@link #RTLD_LAZY}{@link #RTLD_NOW}{@link #RTLD_BINDING_MASK}{@link #RTLD_NOLOAD}{@link #RTLD_DEEPBIND}{@link #RTLD_GLOBAL}
    {@link #RTLD_LOCAL}{@link #RTLD_NODELETE}
    + */ + @NativeType("void *") + public static long dlopen(@Nullable @NativeType("char const *") ByteBuffer filename, int mode) { + if (CHECKS) { + checkNT1Safe(filename); + } + return ndlopen(memAddressSafe(filename), mode); + } + + /** + * Loads the dynamic library file named by the null-terminated string {@code filename} and returns an opaque "handle" for the dynamic library. If + * {@code filename} is {@code NULL}, then the returned handle is for the main program. + * + * @param filename the name of the dynamic library to open, or {@code NULL} + * @param mode a bitfield. One or more of:
    {@link #RTLD_LAZY}{@link #RTLD_NOW}{@link #RTLD_BINDING_MASK}{@link #RTLD_NOLOAD}{@link #RTLD_DEEPBIND}{@link #RTLD_GLOBAL}
    {@link #RTLD_LOCAL}{@link #RTLD_NODELETE}
    + */ + @NativeType("void *") + public static long dlopen(@Nullable @NativeType("char const *") CharSequence filename, int mode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(filename, true); + long filenameEncoded = filename == null ? NULL : stack.getPointerAddress(); + return ndlopen(filenameEncoded, mode); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ dlerror ] --- + + /** Unsafe version of: {@link #dlerror} */ + public static native long ndlerror(); + + /** + * Returns a human readable string describing the most recent error that occurred from {@link #dlopen}, {@link #dlsym} or {@link #dlclose} since + * the last call to {@code dlerror()}. It returns {@code NULL} if no errors have occurred since initialization or since it was last called. + */ + @Nullable + @NativeType("char *") + public static String dlerror() { + long __result = ndlerror(); + return memUTF8Safe(__result); + } + + // --- [ dlsym ] --- + + /** Unsafe version of: {@link #dlsym} */ + public static native long ndlsym(long handle, long name); + + /** + * Takes a "handle" of a dynamic library returned by {@link #dlopen} and the null-terminated symbol name, returning the address where that symbol is loaded + * into memory. If the symbol is not found, in the specified library or any of the libraries that were automatically loaded by {@link #dlopen} when that + * library was loaded, {@code dlsym()} returns {@code NULL}. + * + * @param handle the dynamic library handle + * @param name the symbol name + */ + @NativeType("void *") + public static long dlsym(@NativeType("void *") long handle, @NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + check(handle); + checkNT1(name); + } + return ndlsym(handle, memAddress(name)); + } + + /** + * Takes a "handle" of a dynamic library returned by {@link #dlopen} and the null-terminated symbol name, returning the address where that symbol is loaded + * into memory. If the symbol is not found, in the specified library or any of the libraries that were automatically loaded by {@link #dlopen} when that + * library was loaded, {@code dlsym()} returns {@code NULL}. + * + * @param handle the dynamic library handle + * @param name the symbol name + */ + @NativeType("void *") + public static long dlsym(@NativeType("void *") long handle, @NativeType("char const *") CharSequence name) { + if (CHECKS) { + check(handle); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return ndlsym(handle, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ dlclose ] --- + + /** Unsafe version of: {@link #dlclose} */ + public static native int ndlclose(long handle); + + /** + * Decrements the reference count on the dynamic library handle handle. If the reference count drops to zero and no other loaded libraries use symbols in + * it, then the dynamic library is unloaded. + * + * @param handle the dynamic library to close + */ + public static int dlclose(@NativeType("void *") long handle) { + if (CHECKS) { + check(handle); + } + return ndlclose(handle); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/EpollData.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/EpollData.java new file mode 100644 index 000000000..3d913117a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/EpollData.java @@ -0,0 +1,310 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * union epoll_data_t {
    + *     void * ptr;
    + *     int fd;
    + *     uint32_t u32;
    + *     uint64_t u64;
    + * }
    + */ +@NativeType("union epoll_data_t") +public class EpollData extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PTR, + FD, + U32, + U64; + + static { + Layout layout = __union( + __member(POINTER_SIZE), + __member(4), + __member(4), + __member(8) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PTR = layout.offsetof(0); + FD = layout.offsetof(1); + U32 = layout.offsetof(2); + U64 = layout.offsetof(3); + } + + protected EpollData(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected EpollData create(long address, @Nullable ByteBuffer container) { + return new EpollData(address, container); + } + + /** + * Creates a {@code EpollData} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public EpollData(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code ptr} field. */ + @NativeType("void *") + public long ptr() { return nptr(address()); } + /** @return the value of the {@code fd} field. */ + public int fd() { return nfd(address()); } + /** @return the value of the {@code u32} field. */ + @NativeType("uint32_t") + public int u32() { return nu32(address()); } + /** @return the value of the {@code u64} field. */ + @NativeType("uint64_t") + public long u64() { return nu64(address()); } + + /** Sets the specified value to the {@code ptr} field. */ + public EpollData ptr(@NativeType("void *") long value) { nptr(address(), value); return this; } + /** Sets the specified value to the {@code fd} field. */ + public EpollData fd(int value) { nfd(address(), value); return this; } + /** Sets the specified value to the {@code u32} field. */ + public EpollData u32(@NativeType("uint32_t") int value) { nu32(address(), value); return this; } + /** Sets the specified value to the {@code u64} field. */ + public EpollData u64(@NativeType("uint64_t") long value) { nu64(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public EpollData set(EpollData src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code EpollData} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static EpollData malloc() { + return new EpollData(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code EpollData} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static EpollData calloc() { + return new EpollData(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code EpollData} instance allocated with {@link BufferUtils}. */ + public static EpollData create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new EpollData(memAddress(container), container); + } + + /** Returns a new {@code EpollData} instance for the specified memory address. */ + public static EpollData create(long address) { + return new EpollData(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static EpollData createSafe(long address) { + return address == NULL ? null : new EpollData(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code EpollData} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static EpollData malloc(MemoryStack stack) { + return new EpollData(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code EpollData} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static EpollData calloc(MemoryStack stack) { + return new EpollData(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #ptr}. */ + public static long nptr(long struct) { return memGetAddress(struct + EpollData.PTR); } + /** Unsafe version of {@link #fd}. */ + public static int nfd(long struct) { return UNSAFE.getInt(null, struct + EpollData.FD); } + /** Unsafe version of {@link #u32}. */ + public static int nu32(long struct) { return UNSAFE.getInt(null, struct + EpollData.U32); } + /** Unsafe version of {@link #u64}. */ + public static long nu64(long struct) { return UNSAFE.getLong(null, struct + EpollData.U64); } + + /** Unsafe version of {@link #ptr(long) ptr}. */ + public static void nptr(long struct, long value) { memPutAddress(struct + EpollData.PTR, check(value)); } + /** Unsafe version of {@link #fd(int) fd}. */ + public static void nfd(long struct, int value) { UNSAFE.putInt(null, struct + EpollData.FD, value); } + /** Unsafe version of {@link #u32(int) u32}. */ + public static void nu32(long struct, int value) { UNSAFE.putInt(null, struct + EpollData.U32, value); } + /** Unsafe version of {@link #u64(long) u64}. */ + public static void nu64(long struct, long value) { UNSAFE.putLong(null, struct + EpollData.U64, value); } + + // ----------------------------------- + + /** An array of {@link EpollData} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final EpollData ELEMENT_FACTORY = EpollData.create(-1L); + + /** + * Creates a new {@code EpollData.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link EpollData#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected EpollData getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code ptr} field. */ + @NativeType("void *") + public long ptr() { return EpollData.nptr(address()); } + /** @return the value of the {@code fd} field. */ + public int fd() { return EpollData.nfd(address()); } + /** @return the value of the {@code u32} field. */ + @NativeType("uint32_t") + public int u32() { return EpollData.nu32(address()); } + /** @return the value of the {@code u64} field. */ + @NativeType("uint64_t") + public long u64() { return EpollData.nu64(address()); } + + /** Sets the specified value to the {@code ptr} field. */ + public Buffer ptr(@NativeType("void *") long value) { EpollData.nptr(address(), value); return this; } + /** Sets the specified value to the {@code fd} field. */ + public Buffer fd(int value) { EpollData.nfd(address(), value); return this; } + /** Sets the specified value to the {@code u32} field. */ + public Buffer u32(@NativeType("uint32_t") int value) { EpollData.nu32(address(), value); return this; } + /** Sets the specified value to the {@code u64} field. */ + public Buffer u64(@NativeType("uint64_t") long value) { EpollData.nu64(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/EpollEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/EpollEvent.java new file mode 100644 index 000000000..5dd89d8d7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/EpollEvent.java @@ -0,0 +1,290 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct epoll_event {
    + *     uint32_t {@link #events};
    + *     {@link EpollData epoll_data_t} {@link #data};
    + * }
    + */ +@NativeType("struct epoll_event") +public class EpollEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + EVENTS, + DATA; + + static { + Layout layout = __struct( + __member(4), + __member(EpollData.SIZEOF, EpollData.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + EVENTS = layout.offsetof(0); + DATA = layout.offsetof(1); + } + + protected EpollEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected EpollEvent create(long address, @Nullable ByteBuffer container) { + return new EpollEvent(address, container); + } + + /** + * Creates a {@code EpollEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public EpollEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** epoll events */ + @NativeType("uint32_t") + public int events() { return nevents(address()); } + /** user data variable */ + @NativeType("epoll_data_t") + public EpollData data() { return ndata(address()); } + + /** Sets the specified value to the {@link #events} field. */ + public EpollEvent events(@NativeType("uint32_t") int value) { nevents(address(), value); return this; } + /** Copies the specified {@link EpollData} to the {@link #data} field. */ + public EpollEvent data(@NativeType("epoll_data_t") EpollData value) { ndata(address(), value); return this; } + /** Passes the {@link #data} field to the specified {@link java.util.function.Consumer Consumer}. */ + public EpollEvent data(java.util.function.Consumer consumer) { consumer.accept(data()); return this; } + + /** Initializes this struct with the specified values. */ + public EpollEvent set( + int events, + EpollData data + ) { + events(events); + data(data); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public EpollEvent set(EpollEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code EpollEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static EpollEvent malloc() { + return new EpollEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code EpollEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static EpollEvent calloc() { + return new EpollEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code EpollEvent} instance allocated with {@link BufferUtils}. */ + public static EpollEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new EpollEvent(memAddress(container), container); + } + + /** Returns a new {@code EpollEvent} instance for the specified memory address. */ + public static EpollEvent create(long address) { + return new EpollEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static EpollEvent createSafe(long address) { + return address == NULL ? null : new EpollEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code EpollEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static EpollEvent malloc(MemoryStack stack) { + return new EpollEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code EpollEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static EpollEvent calloc(MemoryStack stack) { + return new EpollEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #events}. */ + public static int nevents(long struct) { return UNSAFE.getInt(null, struct + EpollEvent.EVENTS); } + /** Unsafe version of {@link #data}. */ + public static EpollData ndata(long struct) { return EpollData.create(struct + EpollEvent.DATA); } + + /** Unsafe version of {@link #events(int) events}. */ + public static void nevents(long struct, int value) { UNSAFE.putInt(null, struct + EpollEvent.EVENTS, value); } + /** Unsafe version of {@link #data(EpollData) data}. */ + public static void ndata(long struct, EpollData value) { memCopy(value.address(), struct + EpollEvent.DATA, EpollData.SIZEOF); } + + // ----------------------------------- + + /** An array of {@link EpollEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final EpollEvent ELEMENT_FACTORY = EpollEvent.create(-1L); + + /** + * Creates a new {@code EpollEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link EpollEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected EpollEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link EpollEvent#events} field. */ + @NativeType("uint32_t") + public int events() { return EpollEvent.nevents(address()); } + /** @return a {@link EpollData} view of the {@link EpollEvent#data} field. */ + @NativeType("epoll_data_t") + public EpollData data() { return EpollEvent.ndata(address()); } + + /** Sets the specified value to the {@link EpollEvent#events} field. */ + public Buffer events(@NativeType("uint32_t") int value) { EpollEvent.nevents(address(), value); return this; } + /** Copies the specified {@link EpollData} to the {@link EpollEvent#data} field. */ + public Buffer data(@NativeType("epoll_data_t") EpollData value) { EpollEvent.ndata(address(), value); return this; } + /** Passes the {@link EpollEvent#data} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer data(java.util.function.Consumer consumer) { consumer.accept(data()); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/FCNTL.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/FCNTL.java new file mode 100644 index 000000000..5a9d3d392 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/FCNTL.java @@ -0,0 +1,858 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to <fcntl.h>. */ +public class FCNTL { + + static { Library.initialize(); } + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #O_ACCMODE O_ACCMODE}
    • + *
    • {@link #O_RDONLY O_RDONLY}
    • + *
    • {@link #O_WRONLY O_WRONLY}
    • + *
    • {@link #O_RDWR O_RDWR}
    • + *
    • {@link #O_APPEND O_APPEND} - + * The file is opened in append mode. + * + *

      Before each {@code write(2)}, the file offset is positioned at the end of the file, as if with {@code lseek(2)}. {@code O_APPEND} may lead to + * corrupted files on NFS file systems if more than one process appends data to a file at once. This is because NFS does not support appending to a + * file, so the client kernel has to simulate it, which can't be done without a race condition.

      + *
    • + *
    • {@link #O_ASYNC O_ASYNC} - + * Enable signal-driven I/O: generate a signal ({@code SIGIO} by default, but this can be changed via {@code fcntl(2)}) when input or output becomes + * possible on this file descriptor. + * + *

      This feature is only available for terminals, pseudoterminals, sockets, and (since Linux 2.6) pipes and FIFOs. See {@code fcntl(2)} for further + * details.

      + *
    • + *
    • {@link #O_CLOEXEC O_CLOEXEC} - + * Enable the close-on-exec flag for the new file descriptor. + * + *

      Specifying this flag permits a program to avoid additional {@code fcntl(2) F_SETFD} operations to set the {@code FD_CLOEXEC} flag. Additionally, + * use of this flag is essential in some multithreaded programs since using a separate {@code fcntl(2) F_SETFD} operation to set the + * {@code FD_CLOEXEC} flag does not suffice to avoid race conditions where one thread opens a file descriptor at the same time as another thread does + * a {@code fork(2)} plus {@code execve(2)}.

      + *
    • + *
    • {@link #O_CREAT O_CREAT} - + * If the file does not exist it will be created. + * + *

      The owner (user ID) of the file is set to the effective user ID of the process. The group ownership (group ID) is set either to the effective group + * ID of the process or to the group ID of the parent directory (depending on file system type and mount options, and the mode of the parent + * directory, see the mount options {@code bsdgroups} and {@code sysvgroups} described in {@code mount(8)}).

      + *
    • + *
    • {@link #O_DIRECT O_DIRECT} - + * Try to minimize cache effects of the I/O to and from this file. + * + *

      In general this will degrade performance, but it is useful in special situations, such as when applications do their own caching. File I/O is done + * directly to/from user-space buffers. The {@code O_DIRECT} flag on its own makes an effort to transfer data synchronously, but does not give the + * guarantees of the {@code O_SYNC} flag that data and necessary metadata are transferred. To guarantee synchronous I/O, {@code O_SYNC} must be used + * in addition to {@code O_DIRECT}.

      + * + *

      A semantically similar (but deprecated) interface for block devices is described in {@code raw(8)}.

      + *
    • + *
    • {@link #O_DIRECTORY O_DIRECTORY} - + * If pathname is not a directory, cause the open to fail. + * + *

      This flag is Linux-specific, and was added in kernel version 2.1.126, to avoid denial-of-service problems if {@code opendir(3)} is called on a FIFO + * or tape device, but should not be used outside of the implementation of {@code opendir(3)}.

      + *
    • + *
    • {@link #O_DSYNC O_DSYNC}
    • + *
    • {@link #O_EXCL O_EXCL} - + * Ensure that this call creates the file: if this flag is specified in conjunction with {@code O_CREAT}, and pathname already exists, then + * {@code open()} will fail. + * + *

      When these two flags are specified, symbolic links are not followed: if {@code pathname} is a symbolic link, then {@code open()} fails regardless + * of where the symbolic link points to.

      + * + *

      In general, the behavior of {@code O_EXCL} is undefined if it is used without {@code O_CREAT}. There is one exception: on Linux 2.6 and later, + * {@code O_EXCL} can be used without {@code O_CREAT} if {@code pathname} refers to a block device. If the block device is in use by the system (e.g., + * mounted), {@code open()} fails with the error {@code EBUSY}.

      + * + *

      On NFS, {@code O_EXCL} is only supported when using NFSv3 or later on kernel 2.6 or later. In NFS environments where {@code O_EXCL} support is not + * provided, programs that rely on it for performing locking tasks will contain a race condition. Portable programs that want to perform atomic file + * locking using a lockfile, and need to avoid reliance on NFS support for {@code O_EXCL}, can create a unique file on the same file system (e.g., + * incorporating hostname and PID), and use {@code link(2)} to make a link to the lockfile. If {@code link(2)} returns 0, the lock is successful. + * Otherwise, use {@code stat(2)} on the unique file to check if its link count has increased to 2, in which case the lock is also successful.

      + *
    • + *
    • {@link #O_LARGEFILE O_LARGEFILE} - + * (LFS) Allow files whose sizes cannot be represented in an {@code off_t} (but can be represented in an {@code off64_t}) to be opened. + * + *

      The {@code _LARGEFILE64_SOURCE} macro must be defined (before including any header files) in order to obtain this definition. Setting the + * {@code _FILE_OFFSET_BITS} feature test macro to 64 (rather than using {@code O_LARGEFILE}) is the preferred method of accessing large files on + * 32-bit systems (see {@code feature_test_macros(7)}).

      + *
    • + *
    • {@link #O_NOATIME O_NOATIME} - + * Do not update the file last access time ({@code st_atime} in the {@code inode}) when the file is {@code read(2)}. + * + *

      This flag is intended for use by indexing or backup programs, where its use can significantly reduce the amount of disk activity. This flag may not + * be effective on all file systems. One example is NFS, where the server maintains the access time.

      + *
    • + *
    • {@link #O_NOCTTY O_NOCTTY} - + * If {@code pathname} refers to a terminal device --see {@code tty(4)}-- it will not become the process's controlling terminal even if the process + * does not have one. + *
    • + *
    • {@link #O_NOFOLLOW O_NOFOLLOW} - + * If {@code pathname} is a symbolic link, then the open fails. + * + *

      This is a FreeBSD extension, which was added to Linux in version 2.1.126. Symbolic links in earlier components of the {@code pathname} will still + * be followed.

      + *
    • + *
    • {@link #O_NONBLOCK O_NONBLOCK} - + * When possible, the file is opened in nonblocking mode. + * + *

      Neither the {@code open()} nor any subsequent operations on the file descriptor which is returned will cause the calling process to wait. For the + * handling of FIFOs (named pipes), see also {@code fifo(7)}. For a discussion of the effect of {@code O_NONBLOCK} in conjunction with mandatory file + * locks and with file leases, see {@code fcntl(2)}.

      + *
    • + *
    • {@link #O_NDELAY O_NDELAY}
    • + *
    • {@link #O_PATH O_PATH}
    • + *
    • {@link #O_SYNC O_SYNC} - + * The file is opened for synchronous I/O. + * + *

      Any {@code write(2)}s on the resulting file descriptor will block the calling process until the data has been physically written to the underlying + * hardware.

      + *
    • + *
    • {@link #O_TMPFILE O_TMPFILE}
    • + *
    • {@link #O_TRUNC O_TRUNC} - + * If the file already exists and is a regular file and the open mode allows writing (i.e., is {@code O_RDWR} or {@code O_WRONLY}) it will be + * truncated to length 0. + * + *

      If the file is a FIFO or terminal device file, the {@code O_TRUNC} flag is ignored. Otherwise the effect of {@code O_TRUNC} is unspecified.

      + *
    • + *
    + */ + public static final int + O_ACCMODE = 00000003, + O_RDONLY = 00000000, + O_WRONLY = 00000001, + O_RDWR = 00000002, + O_APPEND = 00002000, + O_ASYNC = 020000, + O_CLOEXEC = 02000000, + O_CREAT = 00000100, + O_DIRECT = 040000, + O_DIRECTORY = 0200000, + O_DSYNC = 00010000, + O_EXCL = 00000200, + O_LARGEFILE = 00100000, + O_NOATIME = 01000000, + O_NOCTTY = 00000400, + O_NOFOLLOW = 00400000, + O_NONBLOCK = 00004000, + O_NDELAY = O_NONBLOCK, + O_PATH = 010000000, + O_SYNC = 04010000, + O_TMPFILE = 020000000 | O_DIRECTORY, + O_TRUNC = 00001000; + + /** + * File types encoded in type {@code mode_t}. + * + *
    Enum values:
    + * + *
      + *
    • {@link #S_IFMT S_IFMT} - Type of file.
    • + *
    • {@link #S_IFBLK S_IFBLK} - Block special.
    • + *
    • {@link #S_IFCHR S_IFCHR} - Character special.
    • + *
    • {@link #S_IFIFO S_IFIFO} - FIFO special.
    • + *
    • {@link #S_IFREG S_IFREG} - Regular.
    • + *
    • {@link #S_IFDIR S_IFDIR} - Directory.
    • + *
    • {@link #S_IFLNK S_IFLNK} - Symbolic link.
    • + *
    • {@link #S_IFSOCK S_IFSOCK} - Socket.
    • + *
    + */ + public static final int + S_IFMT = 00170000, + S_IFBLK = 0060000, + S_IFCHR = 0020000, + S_IFIFO = 0010000, + S_IFREG = 0100000, + S_IFDIR = 0040000, + S_IFLNK = 0120000, + S_IFSOCK = 0140000; + + /** + * File mode bits encoded in type {@code mode_t}. + * + *
    Enum values:
    + * + *
      + *
    • {@link #S_IRWXU S_IRWXU} - Read, write, execute/search by owner.
    • + *
    • {@link #S_IRUSR S_IRUSR} - Read permission, owner.
    • + *
    • {@link #S_IWUSR S_IWUSR} - Write permission, owner.
    • + *
    • {@link #S_IXUSR S_IXUSR} - Execute/search permission, owner.
    • + *
    • {@link #S_IRWXG S_IRWXG} - Read, write, execute/search by group.
    • + *
    • {@link #S_IRGRP S_IRGRP} - Read permission, group.
    • + *
    • {@link #S_IWGRP S_IWGRP} - Write permission, group.
    • + *
    • {@link #S_IXGRP S_IXGRP} - Execute/search permission, group.
    • + *
    • {@link #S_IRWXO S_IRWXO} - Read, write, execute/search by others.
    • + *
    • {@link #S_IROTH S_IROTH} - Read permission, others.
    • + *
    • {@link #S_IWOTH S_IWOTH} - Write permission, others.
    • + *
    • {@link #S_IXOTH S_IXOTH} - Execute/search permission, others.
    • + *
    • {@link #S_ISUID S_ISUID} - Set-user-ID on execution.
    • + *
    • {@link #S_ISGID S_ISGID} - Set-group-ID on execution.
    • + *
    • {@link #S_ISVTX S_ISVTX} - On directories, restricted deletion flag.
    • + *
    + */ + public static final int + S_IRWXU = 0700, + S_IRUSR = 0400, + S_IWUSR = 0200, + S_IXUSR = 0100, + S_IRWXG = 070, + S_IRGRP = 040, + S_IWGRP = 020, + S_IXGRP = 010, + S_IRWXO = 07, + S_IROTH = 04, + S_IWOTH = 02, + S_IXOTH = 01, + S_ISUID = 04000, + S_ISGID = 02000, + S_ISVTX = 01000; + + /** + * {@link #fcntl} commands. + * + *
    Enum values:
    + * + *
      + *
    • {@link #F_DUPFD F_DUPFD} - + * Duplicate the file descriptor {@code fd} using the lowest-numbered available file descriptor greater than or equal to {@code arg}. + * + *

      This is different from {@code dup2(2)}, which uses exactly the file descriptor specified.

      + * + *

      On success, the new file descriptor is returned.

      + * + *

      See {@code dup(2)} for further details.

      + *
    • + *
    • {@link #F_GETFD F_GETFD} - Return (as the function result) the file descriptor flags; {@code arg} is ignored.
    • + *
    • {@link #F_SETFD F_SETFD} - Set the file descriptor flags to the value specified by {@code arg}.
    • + *
    • {@link #F_GETFL F_GETFL} - Return (as the function result) the file access mode and the file status flags; {@code arg} is ignored.
    • + *
    • {@link #F_SETFL F_SETFL} - + * Set the file status flags to the value specified by {@code arg}. + * + *

      File access mode ({@link #O_RDONLY}, {@link #O_WRONLY}, {@link #O_RDWR}) and file creation flags (i.e., {@link #O_CREAT}, {@link #O_EXCL}, {@link #O_NOCTTY}, {@link #O_TRUNC}) in {@code arg} are ignored. + * On Linux, this command can change only the {@link #O_APPEND}, {@link #O_ASYNC}, {@link #O_DIRECT}, {@link #O_NOATIME}, and {@link #O_NONBLOCK} flags. It is not possible to change the + * {@link #O_DSYNC} and {@link #O_SYNC} flags; see BUGS, below.

      + *
    • + *
    • {@link #F_GETLK F_GETLK} - + * On input to this call, lock describes a lock we would like to place on the file. + * + *

      If the lock could be placed, {@code fcntl()} does not actually place it, but returns {@link #F_UNLCK} in the {@code l_type} field of lock and leaves the + * other fields of the structure unchanged.

      + * + *

      If one or more incompatible locks would prevent this lock being placed, then {@code fcntl()} returns details about one of those locks in the + * {@code l_type}, {@code l_whence}, {@code l_start}, and {@code l_len} fields of lock. If the conflicting lock is a traditional (process-associated) + * record lock, then the {@code l_pid} field is set to the {@code PID} of the process holding that lock. If the conflicting lock is an open file + * description lock, then {@code l_pid} is set to -1. Note that the returned information may already be out of date by the time the caller inspects + * it.

      + *
    • + *
    • {@link #F_SETLK F_SETLK} - + * Acquire a lock (when {@code l_type} is {@link #F_RDLCK} or {@link #F_WRLCK}) or release a lock (when {@code l_type} is {@link #F_UNLCK}) on the bytes specified by the + * {@code l_whence}, {@code l_start}, and {@code l_len} fields of lock. + * + *

      If a conflicting lock is held by another process, this call returns -1 and sets {@code errno} to {@code EACCES} or {@code EAGAIN}. (The error + * returned in this case differs across implementations, so POSIX requires a portable application to check for both errors.)

      + *
    • + *
    • {@link #F_SETLKW F_SETLKW} - + * As for {@link #F_SETLK}, but if a conflicting lock is held on the file, then wait for that lock to be released. + * + *

      If a signal is caught while waiting, then the call is interrupted and (after the signal handler has returned) returns immediately (with return + * value -1 and errno set to {@code EINTR}; see {@code signal(7)}).

      + *
    • + *
    • {@link #F_SETOWN F_SETOWN} - + * Set the process ID or process group ID that will receive {@code SIGIO} and {@code SIGURG} signals for events on the file descriptor {@code fd}. + * + *

      The target process or process group ID is specified in {@code arg}. A process ID is specified as a positive value; a process group ID is specified + * as a negative value. Most commonly, the calling process specifies itself as the owner (that is, {@code arg} is specified as {@code getpid(2)}).

      + * + *

      As well as setting the file descriptor owner, one must also enable generation of signals on the file descriptor. This is done by using the + * {@code fcntl()} {@link #F_SETFL} command to set the {@link #O_ASYNC} file status flag on the file descriptor. Subsequently, a {@code SIGIO} signal is sent whenever + * input or output becomes possible on the file descriptor. The {@code fcntl()} {@link #F_SETSIG} command can be used to obtain delivery of a signal other + * than {@code SIGIO}.

      + * + *

      Sending a signal to the owner process (group) specified by {@code F_SETOWN} is subject to the same permissions checks as are described for + * {@code kill(2)}, where the sending process is the one that employs {@code F_SETOWN} (but see BUGS below). If this permission check fails, then the + * signal is silently discarded. Note: The {@code F_SETOWN} operation records the caller's credentials at the time of the {@code fcntl()} call, and it + * is these saved credentials that are used for the permission checks.

      + * + *

      If the file descriptor {@code fd} refers to a socket, {@code F_SETOWN} also selects the recipient of {@code SIGURG} signals that are delivered when + * out-of-band data arrives on that socket. ({@code SIGURG} is sent in any situation where {@code select(2)} would report the socket as having an + * "exceptional condition".)

      + * + *

      The following was true in 2.6.x kernels up to and including kernel 2.6.11:

      + * + *

      If a nonzero value is given to {@link #F_SETSIG} in a multithreaded process running with a threading library that supports thread groups (e.g., NPTL), then + * a positive value given to {@code F_SETOWN} has a different meaning: instead of being a process ID identifying a whole process, it is a thread ID + * identifying a specific thread within a process. Consequently, it may be necessary to pass {@code F_SETOWN} the result of {@code gettid(2)} instead + * of {@code getpid(2)} to get sensible results when {@code F_SETSIG} is used. (In current Linux threading implementations, a main thread's thread ID + * is the same as its process ID. This means that a single-threaded program can equally use {@code gettid(2)} or {@code getpid(2)} in this scenario.) + * Note, however, that the statements in this paragraph do not apply to the {@code SIGURG} signal generated for out-of-band data on a socket: this + * signal is always sent to either a process or a process group, depending on the value given to {@code F_SETOWN}.

      + * + *

      The above behavior was accidentally dropped in Linux 2.6.12, and won't be restored. From Linux 2.6.32 onward, use {@link #F_SETOWN_EX} to target + * {@code SIGIO} and {@code SIGURG} signals at a particular thread.

      + *
    • + *
    • {@link #F_GETOWN F_GETOWN} - + * Return (as the function result) the process ID or process group ID currently receiving {@code SIGIO} and {@code SIGURG} signals for events on file + * descriptor {@code fd}. + * + *

      Process IDs are returned as positive values; process group IDs are returned as negative values (but see BUGS below). {@code arg} is ignored.

      + *
    • + *
    • {@link #F_SETSIG F_SETSIG} - + * Set the signal sent when input or output becomes possible to the value given in {@code arg}. + * + *

      A value of zero means to send the default {@code SIGIO} signal. Any other value (including {@code SIGIO}) is the signal to send instead, and in + * this case additional info is available to the signal handler if installed with {@code SA_SIGINFO}.

      + * + *

      By using {@code F_SETSIG} with a nonzero value, and setting {@code SA_SIGINFO} for the signal handler (see {@code sigaction(2)}), extra information + * about I/O events is passed to the handler in a {@code siginfo_t} structure. If the {@code si_code} field indicates the source is {@code SI_SIGIO}, + * the {@code si_fd} field gives the file descriptor associated with the event. Otherwise, there is no indication which file descriptors are pending, + * and you should use the usual mechanisms ({@code select(2)}, {@code poll(2)}, {@code read(2)} with {@code O_NONBLOCK} set etc.) to determine which + * file descriptors are available for I/O.

      + * + *

      Note that the file descriptor provided in {@code si_fd} is the one that was specified during the {@code F_SETSIG} operation. This can lead to an + * unusual corner case. If the file descriptor is duplicated ({@code dup(2)} or similar), and the original file descriptor is closed, then I/O events + * will continue to be generated, but the {@code si_fd} field will contain the number of the now closed file descriptor.

      + * + *

      By selecting a real time signal (value ≥ {@code SIGRTMIN}), multiple I/O events may be queued using the same signal numbers. (Queuing is + * dependent on available memory.) Extra information is available if {@code SA_SIGINFO} is set for the signal handler, as above.

      + * + *

      Note that Linux imposes a limit on the number of real-time signals that may be queued to a process (see {@code getrlimit(2)} and {@code signal(7)}) + * and if this limit is reached, then the kernel reverts to delivering {@code SIGIO}, and this signal is delivered to the entire process rather than + * to a specific thread.

      + *
    • + *
    • {@link #F_GETSIG F_GETSIG} - + * Return (as the function result) the signal sent when input or output becomes possible. + * + *

      A value of zero means {@code SIGIO} is sent. Any other value (including {@code SIGIO}) is the signal sent instead, and in this case additional info + * is available to the signal handler if installed with {@code SA_SIGINFO}. {@code arg} is ignored.

      + *
    • + *
    • {@link #F_SETOWN_EX F_SETOWN_EX} - + * This operation performs a similar task to {@link #F_SETOWN}. It allows the caller to direct I/O availability signals to a specific thread, process, or + * process group. + * + *

      The caller specifies the target of signals via {@code arg}, which is a pointer to a {@link FOwnerEx} structure. The type field has one of the following + * values, which define how pid is interpreted: {@link #F_OWNER_TID}, {@link #F_OWNER_PID}, {@link #F_OWNER_PGRP}.

      + *
    • + *
    • {@link #F_GETOWN_EX F_GETOWN_EX} - + * Return the current file descriptor owner settings as defined by a previous {@link #F_SETOWN_EX} operation. + * + *

      The information is returned in the {@link FOwnerEx} structure pointed to by {@code arg}.

      + * + *

      The type field will have one of the values {@link #F_OWNER_TID}, {@link #F_OWNER_PID}, or {@link #F_OWNER_PGRP}. The {@code pid} field is a positive integer representing a + * thread ID, process ID, or process group ID. See {@link #F_SETOWN_EX} for more details.

      + *
    • + *
    • {@link #F_OFD_GETLK F_OFD_GETLK} - + * On input to this call, {@code lock} describes an open file description lock we would like to place on the file. + * + *

      If the lock could be placed, {@code fcntl()} does not actually place it, but returns {@link #F_UNLCK} in the {@code l_type} field of {@code lock} and + * leaves the other fields of the structure unchanged. If one or more incompatible locks would prevent this lock being placed, then details about one + * of these locks are returned via {@code lock}, as described above for {@link #F_GETLK}.

      + *
    • + *
    • {@link #F_OFD_SETLK F_OFD_SETLK} - + * Acquire an open file description lock (when {@code l_type} is {@link #F_RDLCK} or {@link #F_WRLCK}) or release an open file description lock (when {@code l_type} + * is {@link #F_UNLCK}) on the bytes specified by the {@code l_whence}, {@code l_start}, and {@code l_len} fields of {@code lock}. + * + *

      If a conflicting lock is held by another process, this call returns -1 and sets {@code errno} to {@code EAGAIN}.

      + *
    • + *
    • {@link #F_OFD_SETLKW F_OFD_SETLKW} - + * As for {@link #F_OFD_SETLK}, but if a conflicting lock is held on the file, then wait for that lock to be released. + * + *

      If a signal is caught while waiting, then the call is interrupted and (after the signal handler has returned) returns immediately (with return + * value -1 and {@code errno} set to {@code EINTR}; see {@code signal(7)}).

      + *
    • + *
    • {@link #F_SETLEASE F_SETLEASE} - Set or remove a file lease according to which of the following values is specified in the integer {@code arg}: {@link #F_RDLCK}, {@link #F_WRLCK}, {@link #F_UNLCK}
    • + *
    • {@link #F_GETLEASE F_GETLEASE} - + * Indicates what type of lease is associated with the file descriptor {@code fd} by returning either {@link #F_RDLCK}, {@link #F_WRLCK}, or {@link #F_UNLCK}, indicating, + * respectively, a read lease, a write lease, or no lease. {@code arg} is ignored. + *
    • + *
    • {@link #F_NOTIFY F_NOTIFY} - + * (Linux 2.4 onward) Provide notification when the directory referred to by {@code fd} or any of the files that it contains is changed. + * + *

      The events to be notified are specified in {@code arg}, which is a bit mask specified by ORing together zero or more of the following bits: + * {@link #DN_ACCESS}, {@link #DN_MODIFY}, {@link #DN_CREATE}, {@link #DN_DELETE}, {@link #DN_RENAME}, {@link #DN_ATTRIB}

      + * + *

      (In order to obtain these definitions, the {@code _GNU_SOURCE} feature test macro must be defined before including any header files.)

      + * + *

      Directory notifications are normally "one-shot", and the application must reregister to receive further notifications. Alternatively, if + * {@link #DN_MULTISHOT} is included in {@code arg}, then notification will remain in effect until explicitly removed.

      + * + *

      A series of {@code F_NOTIFY} requests is cumulative, with the events in {@code arg} being added to the set already monitored. To disable + * notification of all events, make an {@code F_NOTIFY} call specifying {@code arg} as 0.

      + * + *

      Notification occurs via delivery of a signal. The default signal is {@code SIGIO}, but this can be changed using the {@link #F_SETSIG} command to + * {@code fcntl()}. (Note that {@code SIGIO} is one of the nonqueuing standard signals; switching to the use of a real-time signal means that multiple + * notifications can be queued to the process.) In the latter case, the signal handler receives a {@code siginfo_t} structure as its second argument + * (if the handler was established using {@code SA_SIGINFO}) and the {@code si_fd} field of this structure contains the file descriptor which + * generated the notification (useful when establishing notification on multiple directories).

      + * + *

      Especially when using {@code DN_MULTISHOT}, a real time signal should be used for notification, so that multiple notifications can be queued.

      + * + *

      NOTE: New applications should use the {@code inotify} interface (available since kernel 2.6.13), which provides a much superior interface for + * obtaining notifications of filesystem events. See {@code inotify(7)}.

      + *
    • + *
    • {@link #F_SETPIPE_SZ F_SETPIPE_SZ} - + * Change the capacity of the pipe referred to by {@code fd} to be at least {@code arg} bytes. + * + *

      An unprivileged process can adjust the pipe capacity to any value between the system page size and the limit defined in + * {@code /proc/sys/fs/pipe-max-size} (see {@code proc(5)}). Attempts to set the pipe capacity below the page size are silently rounded up to the page + * size. Attempts by an unprivileged process to set the pipe capacity above the limit in {@code /proc/sys/fs/pipe-max-size} yield the error + * {@code EPERM}; a privileged process ({@code CAP_SYS_RESOURCE}) can override the limit.

      + * + *

      When allocating the buffer for the pipe, the kernel may use a capacity larger than {@code arg}, if that is convenient for the implementation. (In + * the current implementation, the allocation is the next higher power-of-two page-size multiple of the requested size.) The actual capacity (in + * bytes) that is set is returned as the function result.

      + * + *

      Attempting to set the pipe capacity smaller than the amount of buffer space currently used to store data produces the error {@code EBUSY}.

      + * + *

      Note that because of the way the pages of the pipe buffer are employed when data is written to the pipe, the number of bytes that can be written + * may be less than the nominal size, depending on the size of the writes.

      + *
    • + *
    • {@link #F_GETPIPE_SZ F_GETPIPE_SZ} - Return (as the function result) the capacity of the pipe referred to by {@code fd}.
    • + *
    • {@link #F_ADD_SEALS F_ADD_SEALS} - + * Add the seals given in the bit-mask argument {@code arg} to the set of seals of the {@code inode} referred to by the file descriptor {@code fd}. + * + *

      Seals cannot be removed again. Once this call succeeds, the seals are enforced by the kernel immediately. If the current set of seals includes + * {@link #F_SEAL_SEAL} (see below), then this call will be rejected with {@code EPERM}. Adding a seal that is already set is a no-op, in case + * {@code F_SEAL_SEAL} is not set already. In order to place a seal, the file descriptor {@code fd} must be writable.

      + *
    • + *
    • {@link #F_GET_SEALS F_GET_SEALS} - + * Return (as the function result) the current set of seals of the {@code inode} referred to by {@code fd}. + * + *

      If no seals are set, 0 is returned. If the file does not support sealing, -1 is returned and {@code errno} is set to {@code EINVAL}.

      + *
    • + *
    • {@link #F_GET_RW_HINT F_GET_RW_HINT} - Returns the value of the read/write hint associated with the underlying {@code inode} referred to by {@code fd}.
    • + *
    • {@link #F_SET_RW_HINT F_SET_RW_HINT} - + * Sets the read/write hint value associated with the underlying {@code inode} referred to by {@code fd}. + * + *

      This hint persists until either it is explicitly modified or the underlying filesystem is unmounted.

      + *
    • + *
    • {@link #F_GET_FILE_RW_HINT F_GET_FILE_RW_HINT} - Returns the value of the read/write hint associated with the open file description referred to by {@code fd}.
    • + *
    • {@link #F_SET_FILE_RW_HINT F_SET_FILE_RW_HINT} - Sets the read/write hint value associated with the open file description referred to by {@code fd}.
    • + *
    • {@link #F_DUPFD_CLOEXEC F_DUPFD_CLOEXEC} - + * As for {@link #F_DUPFD}, but additionally set the close-on-exec flag for the duplicate file descriptor. + * + *

      Specifying this flag permits a program to avoid an additional {@code fcntl()} {@link #F_SETFD} operation to set the {@link #FD_CLOEXEC} flag. For an explanation of + * why this flag is useful, see the description of {@link #O_CLOEXEC} in {@code open(2)}.

      + *
    • + *
    + */ + public static final int + F_DUPFD = 0, + F_GETFD = 1, + F_SETFD = 2, + F_GETFL = 3, + F_SETFL = 4, + F_GETLK = 5, + F_SETLK = 8, + F_SETLKW = 7, + F_SETOWN = 8, + F_GETOWN = 9, + F_SETSIG = 10, + F_GETSIG = 11, + F_SETOWN_EX = 15, + F_GETOWN_EX = 16, + F_OFD_GETLK = 36, + F_OFD_SETLK = 37, + F_OFD_SETLKW = 38, + F_SETLEASE = 1024, + F_GETLEASE = 1025, + F_NOTIFY = 1026, + F_SETPIPE_SZ = 1031, + F_GETPIPE_SZ = 1032, + F_ADD_SEALS = 1033, + F_GET_SEALS = 1034, + F_GET_RW_HINT = 1035, + F_SET_RW_HINT = 1036, + F_GET_FILE_RW_HINT = 1037, + F_SET_FILE_RW_HINT = 1038, + F_DUPFD_CLOEXEC = 1030; + + public static final int FD_CLOEXEC = 1; + + /** + * For posix {@link #fcntl} and {@code l_type} field of an {@link Flock} for {@code lockf()}. + * + *
    Enum values:
    + * + *
      + *
    • {@link #F_RDLCK F_RDLCK} - + * Take out a read lease. + * + *

      This will cause the calling process to be notified when the file is opened for writing or is truncated. A read lease can be placed only on a file + * descriptor that is opened read-only.

      + *
    • + *
    • {@link #F_WRLCK F_WRLCK} - + * Take out a write lease. + * + *

      This will cause the caller to be notified when the file is opened for reading or writing or is truncated. A write lease may be placed on a file + * only if there are no other open file descriptors for the file.

      + *
    • + *
    • {@link #F_UNLCK F_UNLCK} - Remove our lease from the file.
    • + *
    • {@link #F_EXLCK F_EXLCK}
    • + *
    • {@link #F_SHLCK F_SHLCK}
    • + *
    + */ + public static final int + F_RDLCK = 0, + F_WRLCK = 1, + F_UNLCK = 2, + F_EXLCK = 4, + F_SHLCK = 8; + + /** + * {@link FOwnerEx}{@code ::type} values. + * + *
    Enum values:
    + * + *
      + *
    • {@link #F_OWNER_TID F_OWNER_TID} - + * Send the signal to the thread whose thread ID (the value returned by a call to {@code clone(2)} or {@code gettid(2)}) is specified in {@code pid}. + *
    • + *
    • {@link #F_OWNER_PID F_OWNER_PID} - Send the signal to the process whose ID is specified in {@code pid}.
    • + *
    • {@link #F_OWNER_PGRP F_OWNER_PGRP} - + * Send the signal to the process group whose ID is specified in {@code pid}. + * + *

      (Note that, unlike with {@link #F_SETOWN}, a process group ID is specified as a positive value here.)

      + *
    • + *
    + */ + public static final int + F_OWNER_TID = 0, + F_OWNER_PID = 1, + F_OWNER_PGRP = 2; + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #LOCK_SH LOCK_SH} - shared lock
    • + *
    • {@link #LOCK_EX LOCK_EX} - exclusive lock
    • + *
    • {@link #LOCK_NB LOCK_NB} - or'd with one of the above to prevent blocking
    • + *
    • {@link #LOCK_UN LOCK_UN} - remove lock
    • + *
    • {@link #LOCK_MAND LOCK_MAND} - This is a mandatory flock...
    • + *
    • {@link #LOCK_READ LOCK_READ} - which allows concurrent read operations
    • + *
    • {@link #LOCK_WRITE LOCK_WRITE} - which allows concurrent write operations
    • + *
    • {@link #LOCK_RW LOCK_RW} - which allows concurrent read & writes ops
    • + *
    + */ + public static final int + LOCK_SH = 1, + LOCK_EX = 2, + LOCK_NB = 4, + LOCK_UN = 8, + LOCK_MAND = 32, + LOCK_READ = 64, + LOCK_WRITE = 128, + LOCK_RW = 192; + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #DN_ACCESS DN_ACCESS} - A file was accessed ({@code read(2)}, {@code pread(2)}, {@code readv(2)}, and similar).
    • + *
    • {@link #DN_MODIFY DN_MODIFY} - A file was modified ({@code write(2)}, {@code pwrite(2)}, {@code writev(2)}, {@code truncate(2)}, {@code ftruncate(2)}, and similar).
    • + *
    • {@link #DN_CREATE DN_CREATE} - + * A file was created ({@code open(2)}, {@code creat(2)}, {@code mknod(2)}, {@code mkdir(2)}, {@code link(2)}, {@code symlink(2)}, {@code rename(2)} + * into this directory). + *
    • + *
    • {@link #DN_DELETE DN_DELETE} - A file was unlinked ({@code unlink(2)}, {@code rename(2)} to another directory, {@code rmdir(2)}).
    • + *
    • {@link #DN_RENAME DN_RENAME} - A file was renamed within this directory ({@code rename(2)}).
    • + *
    • {@link #DN_ATTRIB DN_ATTRIB} - The attributes of a file were changed ({@code chown(2)}, {@code chmod(2)}, {@code utime(2)}, {@code utimensat(2)}, and similar).
    • + *
    • {@link #DN_MULTISHOT DN_MULTISHOT} - Don't remove notifier
    • + *
    + */ + public static final int + DN_ACCESS = 0x1, + DN_MODIFY = 0x2, + DN_CREATE = 0x4, + DN_DELETE = 0x8, + DN_RENAME = 0x10, + DN_ATTRIB = 0x20, + DN_MULTISHOT = 0x80000000; + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #F_SEAL_SEAL F_SEAL_SEAL} - + * If this seal is set, any further call to {@code fcntl()} with {@link #F_ADD_SEALS} fails with the error {@code EPERM}. + * + *

      Therefore, this seal prevents any modifications to the set of seals itself. If the initial set of seals of a file includes {@code F_SEAL_SEAL}, + * then this effectively causes the set of seals to be constant and locked.

      + *
    • + *
    • {@link #F_SEAL_SHRINK F_SEAL_SHRINK} - + * If this seal is set, the file in question cannot be reduced in size. + * + *

      This affects {@code open(2)} with the {@link #O_TRUNC} flag as well as {@code truncate(2)} and {@code ftruncate(2)}. Those calls fail with {@code EPERM} if + * you try to shrink the file in question. Increasing the file size is still possible.

      + *
    • + *
    • {@link #F_SEAL_GROW F_SEAL_GROW} - + * If this seal is set, the size of the file in question cannot be increased. + * + *

      This affects {@code write(2)} beyond the end of the file, {@code truncate(2)}, {@code ftruncate(2)}, and {@code fallocate(2)}. These calls fail + * with {@code EPERM} if you use them to increase the file size. If you keep the size or shrink it, those calls still work as expected.

      + *
    • + *
    • {@link #F_SEAL_WRITE F_SEAL_WRITE} - + * If this seal is set, you cannot modify the contents of the file. + * + *

      Note that shrinking or growing the size of the file is still possible and allowed. Thus, this seal is normally used in combination with one of the + * other seals. This seal affects {@code write(2)} and {@code fallocate(2)} (only in combination with the {@code FALLOC_FL_PUNCH_HOLE} flag). Those + * calls fail with {@code EPERM} if this seal is set. Furthermore, trying to create new shared, writable memory-mappings via {@code mmap(2)} will also + * fail with {@code EPERM}.

      + * + *

      Using the {@link #F_ADD_SEALS} operation to set the {@code F_SEAL_WRITE} seal fails with {@code EBUSY} if any writable, shared mapping exists. Such + * mappings must be unmapped before you can add this seal. Furthermore, if there are any asynchronous I/O operations ({@code io_submit(2)}) pending on + * the file, all outstanding writes will be discarded.

      + *
    • + *
    • {@link #F_SEAL_FUTURE_WRITE F_SEAL_FUTURE_WRITE} - + * The effect of this seal is similar to {@link #F_SEAL_WRITE}, but the contents of the file can still be modified via shared writable mappings that were + * created prior to the seal being set. + * + *

      Any attempt to create a new writable mapping on the file via {@code mmap(2)} will fail with {@code EPERM}. Likewise, an attempt to write to the + * file via {@code write(2)} will fail with {@code EPERM}.

      + * + *

      Using this seal, one process can create a memory buffer that it can continue to modify while sharing that buffer on a "read-only" basis with other + * processes.

      + * + *

      (since Linux 5.1)

      + *
    • + *
    + */ + public static final int + F_SEAL_SEAL = 0x0001, + F_SEAL_SHRINK = 0x0002, + F_SEAL_GROW = 0x0004, + F_SEAL_WRITE = 0x0008, + F_SEAL_FUTURE_WRITE = 0x0010; + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #RWH_WRITE_LIFE_NOT_SET RWH_WRITE_LIFE_NOT_SET} - No specific hint has been set. This is the default value.
    • + *
    • {@link #RWH_WRITE_LIFE_NONE RWH_WRITE_LIFE_NONE} - No specific write lifetime is associated with this file or {@code inode}.
    • + *
    • {@link #RWH_WRITE_LIFE_SHORT RWH_WRITE_LIFE_SHORT} - Data written to this {@code inode} or via this open file description is expected to have a short lifetime.
    • + *
    • {@link #RWH_WRITE_LIFE_MEDIUM RWH_WRITE_LIFE_MEDIUM} - + * Data written to this {@code inode} or via this open file description is expected to have a lifetime longer than data written with + * {@link #RWH_WRITE_LIFE_SHORT}. + *
    • + *
    • {@link #RWH_WRITE_LIFE_LONG RWH_WRITE_LIFE_LONG} - + * Data written to this {@code inode} or via this open file description is expected to have a lifetime longer than data written with + * {@link #RWH_WRITE_LIFE_MEDIUM}. + *
    • + *
    • {@link #RWH_WRITE_LIFE_EXTREME RWH_WRITE_LIFE_EXTREME} - + * Data written to this {@code inode} or via this open file description is expected to have a lifetime longer than data written with + * {@link #RWH_WRITE_LIFE_LONG}. + *
    • + *
    + */ + public static final int + RWH_WRITE_LIFE_NOT_SET = 0, + RWH_WRITE_LIFE_NONE = 1, + RWH_WRITE_LIFE_SHORT = 2, + RWH_WRITE_LIFE_MEDIUM = 3, + RWH_WRITE_LIFE_LONG = 4, + RWH_WRITE_LIFE_EXTREME = 5; + + protected FCNTL() { + throw new UnsupportedOperationException(); + } + + // --- [ open ] --- + + /** Unsafe version of: {@link #open} */ + public static native int nopen(long pathname, int flags, int mode); + + /** + * Given a {@code pathname} for a file, {@code open()} returns a file descriptor, a small, nonnegative integer for use in subsequent system calls + * ({@code read(2)}, {@code write(2)}, {@code lseek(2)}, {@code fcntl(2)}, etc.). + * + *

    The file descriptor returned by a successful call will be the lowest-numbered file descriptor not currently open for the process.

    + * + * @param mode one or more of:
    {@link #S_IRWXU}{@link #S_IRUSR}{@link #S_IWUSR}{@link #S_IXUSR}{@link #S_IRWXG}{@link #S_IRGRP}{@link #S_IWGRP}{@link #S_IXGRP}{@link #S_IRWXO}{@link #S_IROTH}{@link #S_IWOTH}
    {@link #S_IXOTH}{@link #S_ISUID}{@link #S_ISGID}{@link #S_ISVTX}
    + * + * @return the new file descriptor, or -1 if an error occurred (in which case, {@code errno} is set appropriately). + */ + public static int open(@NativeType("char const *") ByteBuffer pathname, int flags, @NativeType("mode_t") int mode) { + if (CHECKS) { + checkNT1(pathname); + } + return nopen(memAddress(pathname), flags, mode); + } + + /** + * Given a {@code pathname} for a file, {@code open()} returns a file descriptor, a small, nonnegative integer for use in subsequent system calls + * ({@code read(2)}, {@code write(2)}, {@code lseek(2)}, {@code fcntl(2)}, etc.). + * + *

    The file descriptor returned by a successful call will be the lowest-numbered file descriptor not currently open for the process.

    + * + * @param mode one or more of:
    {@link #S_IRWXU}{@link #S_IRUSR}{@link #S_IWUSR}{@link #S_IXUSR}{@link #S_IRWXG}{@link #S_IRGRP}{@link #S_IWGRP}{@link #S_IXGRP}{@link #S_IRWXO}{@link #S_IROTH}{@link #S_IWOTH}
    {@link #S_IXOTH}{@link #S_ISUID}{@link #S_ISGID}{@link #S_ISVTX}
    + * + * @return the new file descriptor, or -1 if an error occurred (in which case, {@code errno} is set appropriately). + */ + public static int open(@NativeType("char const *") CharSequence pathname, int flags, @NativeType("mode_t") int mode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(pathname, true); + long pathnameEncoded = stack.getPointerAddress(); + return nopen(pathnameEncoded, flags, mode); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ openat ] --- + + /** Unsafe version of: {@link #openat} */ + public static native int nopenat(int dirfd, long pathname, int flags, int mode); + + /** + * The {@code openat()} system call operates in exactly the same way as {@code open(2)}, except for the differences described in this manual page. + * + *

    If the pathname given in {@code pathname} is relative, then it is interpreted relative to the directory referred to by the file descriptor + * {@code dirfd} (rather than relative to the current working directory of the calling process, as is done by {@code open(2)} for a relative pathname).

    + * + *

    If {@code pathname} is relative and {@code dirfd} is the special value {@code AT_FDCWD}, then pathname is interpreted relative to the current working + * directory of the calling process (like {@code open(2)}).

    + * + *

    If {@code pathname} is absolute, then {@code dirfd} is ignored.

    + * + * @param mode one or more of:
    {@link #S_IRWXU}{@link #S_IRUSR}{@link #S_IWUSR}{@link #S_IXUSR}{@link #S_IRWXG}{@link #S_IRGRP}{@link #S_IWGRP}{@link #S_IXGRP}{@link #S_IRWXO}{@link #S_IROTH}{@link #S_IWOTH}
    {@link #S_IXOTH}{@link #S_ISUID}{@link #S_ISGID}{@link #S_ISVTX}
    + * + * @return a new file descriptor on success. On error, -1 is returned and {@code errno} is set to indicate the error. + */ + public static int openat(int dirfd, @NativeType("char const *") ByteBuffer pathname, int flags, @NativeType("mode_t") int mode) { + if (CHECKS) { + checkNT1(pathname); + } + return nopenat(dirfd, memAddress(pathname), flags, mode); + } + + /** + * The {@code openat()} system call operates in exactly the same way as {@code open(2)}, except for the differences described in this manual page. + * + *

    If the pathname given in {@code pathname} is relative, then it is interpreted relative to the directory referred to by the file descriptor + * {@code dirfd} (rather than relative to the current working directory of the calling process, as is done by {@code open(2)} for a relative pathname).

    + * + *

    If {@code pathname} is relative and {@code dirfd} is the special value {@code AT_FDCWD}, then pathname is interpreted relative to the current working + * directory of the calling process (like {@code open(2)}).

    + * + *

    If {@code pathname} is absolute, then {@code dirfd} is ignored.

    + * + * @param mode one or more of:
    {@link #S_IRWXU}{@link #S_IRUSR}{@link #S_IWUSR}{@link #S_IXUSR}{@link #S_IRWXG}{@link #S_IRGRP}{@link #S_IWGRP}{@link #S_IXGRP}{@link #S_IRWXO}{@link #S_IROTH}{@link #S_IWOTH}
    {@link #S_IXOTH}{@link #S_ISUID}{@link #S_ISGID}{@link #S_ISVTX}
    + * + * @return a new file descriptor on success. On error, -1 is returned and {@code errno} is set to indicate the error. + */ + public static int openat(int dirfd, @NativeType("char const *") CharSequence pathname, int flags, @NativeType("mode_t") int mode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(pathname, true); + long pathnameEncoded = stack.getPointerAddress(); + return nopenat(dirfd, pathnameEncoded, flags, mode); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ creat ] --- + + /** Unsafe version of: {@link #creat} */ + public static native int ncreat(long pathname, int mode); + + /** + * Equivalent to {@code open()} with {@code flags} equal to {@code O_CREAT|O_WRONLY|O_TRUNC}. + * + * @param mode one or more of:
    {@link #S_IRWXU}{@link #S_IRUSR}{@link #S_IWUSR}{@link #S_IXUSR}{@link #S_IRWXG}{@link #S_IRGRP}{@link #S_IWGRP}{@link #S_IXGRP}{@link #S_IRWXO}{@link #S_IROTH}{@link #S_IWOTH}
    {@link #S_IXOTH}{@link #S_ISUID}{@link #S_ISGID}{@link #S_ISVTX}
    + */ + public static int creat(@NativeType("char const *") ByteBuffer pathname, @NativeType("mode_t") int mode) { + if (CHECKS) { + checkNT1(pathname); + } + return ncreat(memAddress(pathname), mode); + } + + /** + * Equivalent to {@code open()} with {@code flags} equal to {@code O_CREAT|O_WRONLY|O_TRUNC}. + * + * @param mode one or more of:
    {@link #S_IRWXU}{@link #S_IRUSR}{@link #S_IWUSR}{@link #S_IXUSR}{@link #S_IRWXG}{@link #S_IRGRP}{@link #S_IWGRP}{@link #S_IXGRP}{@link #S_IRWXO}{@link #S_IROTH}{@link #S_IWOTH}
    {@link #S_IXOTH}{@link #S_ISUID}{@link #S_ISGID}{@link #S_ISVTX}
    + */ + public static int creat(@NativeType("char const *") CharSequence pathname, @NativeType("mode_t") int mode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(pathname, true); + long pathnameEncoded = stack.getPointerAddress(); + return ncreat(pathnameEncoded, mode); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ fcntl ] --- + + /** + * Performs one of the operations determined by {@code cmd} on the open file descriptor {@code fd}. + * + *

    {@code fcntl()} can take an optional third argument. Whether or not this argument is required is determined by {@code cmd}. The required argument type + * is indicated in parentheses after each {@code cmd} name (in most cases, the required type is {@code int}, and we identify the argument using the name + * {@code arg}), or {@code void} is specified if the argument is not required.

    + * + *

    LWJGL note: Use {@link #fcntli} or {@link #fcntlp} to pass a third argument of the appropriate type.

    + * + *

    Certain of the operations below are supported only since a particular Linux kernel version. The preferred method of checking whether the host kernel + * supports a particular operation is to invoke {@code fcntl()} with the desired {@code cmd} value and then test whether the call failed with + * {@code EINVAL}, indicating that the kernel does not recognize this value.

    + * + * @param cmd one of:
    {@link #F_DUPFD}{@link #F_GETFD}{@link #F_SETFD}{@link #F_GETFL}{@link #F_SETFL}{@link #F_GETLK}{@link #F_SETLK}{@link #F_SETLKW}
    {@link #F_SETOWN}{@link #F_GETOWN}{@link #F_SETSIG}{@link #F_GETSIG}{@link #F_SETOWN_EX}{@link #F_GETOWN_EX}{@link #F_OFD_GETLK}{@link #F_OFD_SETLK}
    {@link #F_OFD_SETLKW}{@link #F_SETLEASE}{@link #F_GETLEASE}{@link #F_NOTIFY}{@link #F_SETPIPE_SZ}{@link #F_GETPIPE_SZ}{@link #F_ADD_SEALS}{@link #F_GET_SEALS}
    {@link #F_GET_RW_HINT}{@link #F_SET_RW_HINT}{@link #F_GET_FILE_RW_HINT}{@link #F_SET_FILE_RW_HINT}{@link #F_DUPFD_CLOEXEC}
    + */ + public static native int fcntl(int fd, int cmd); + + // --- [ fcntli ] --- + + /** Unsafe version of: {@link #fcntli} */ + public static native int nfcntli(int fd, int cmd, int arg); + + /** + * {@link #fcntl} overload that takes a third argument of type {@code int}. + * + * @param cmd one of:
    {@link #F_DUPFD}{@link #F_GETFD}{@link #F_SETFD}{@link #F_GETFL}{@link #F_SETFL}{@link #F_GETLK}{@link #F_SETLK}{@link #F_SETLKW}
    {@link #F_SETOWN}{@link #F_GETOWN}{@link #F_SETSIG}{@link #F_GETSIG}{@link #F_SETOWN_EX}{@link #F_GETOWN_EX}{@link #F_OFD_GETLK}{@link #F_OFD_SETLK}
    {@link #F_OFD_SETLKW}{@link #F_SETLEASE}{@link #F_GETLEASE}{@link #F_NOTIFY}{@link #F_SETPIPE_SZ}{@link #F_GETPIPE_SZ}{@link #F_ADD_SEALS}{@link #F_GET_SEALS}
    {@link #F_GET_RW_HINT}{@link #F_SET_RW_HINT}{@link #F_GET_FILE_RW_HINT}{@link #F_SET_FILE_RW_HINT}{@link #F_DUPFD_CLOEXEC}
    + */ + public static int fcntli(int fd, int cmd, int arg) { + return nfcntli(fd, cmd, arg); + } + + // --- [ fcntlp ] --- + + /** Unsafe version of: {@link #fcntlp} */ + public static native int nfcntlp(int fd, int cmd, long arg); + + /** + * {@link #fcntl} overload that takes a third argument of type {@code void *}. + * + * @param cmd one of:
    {@link #F_DUPFD}{@link #F_GETFD}{@link #F_SETFD}{@link #F_GETFL}{@link #F_SETFL}{@link #F_GETLK}{@link #F_SETLK}{@link #F_SETLKW}
    {@link #F_SETOWN}{@link #F_GETOWN}{@link #F_SETSIG}{@link #F_GETSIG}{@link #F_SETOWN_EX}{@link #F_GETOWN_EX}{@link #F_OFD_GETLK}{@link #F_OFD_SETLK}
    {@link #F_OFD_SETLKW}{@link #F_SETLEASE}{@link #F_GETLEASE}{@link #F_NOTIFY}{@link #F_SETPIPE_SZ}{@link #F_GETPIPE_SZ}{@link #F_ADD_SEALS}{@link #F_GET_SEALS}
    {@link #F_GET_RW_HINT}{@link #F_SET_RW_HINT}{@link #F_GET_FILE_RW_HINT}{@link #F_SET_FILE_RW_HINT}{@link #F_DUPFD_CLOEXEC}
    + */ + public static int fcntlp(int fd, int cmd, @NativeType("void *") long arg) { + if (CHECKS) { + check(arg); + } + return nfcntlp(fd, cmd, arg); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/FOwnerEx.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/FOwnerEx.java new file mode 100644 index 000000000..c42a523cc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/FOwnerEx.java @@ -0,0 +1,284 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct f_owner_ex {
    + *     int type;
    + *     pid_t pid;
    + * }
    + */ +@NativeType("struct f_owner_ex") +public class FOwnerEx extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + PID; + + static { + Layout layout = __struct( + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + PID = layout.offsetof(1); + } + + protected FOwnerEx(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FOwnerEx create(long address, @Nullable ByteBuffer container) { + return new FOwnerEx(address, container); + } + + /** + * Creates a {@code FOwnerEx} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FOwnerEx(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** @return the value of the {@code pid} field. */ + @NativeType("pid_t") + public int pid() { return npid(address()); } + + /** Sets the specified value to the {@code type} field. */ + public FOwnerEx type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@code pid} field. */ + public FOwnerEx pid(@NativeType("pid_t") int value) { npid(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FOwnerEx set( + int type, + int pid + ) { + type(type); + pid(pid); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FOwnerEx set(FOwnerEx src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FOwnerEx} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FOwnerEx malloc() { + return new FOwnerEx(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FOwnerEx} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FOwnerEx calloc() { + return new FOwnerEx(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FOwnerEx} instance allocated with {@link BufferUtils}. */ + public static FOwnerEx create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FOwnerEx(memAddress(container), container); + } + + /** Returns a new {@code FOwnerEx} instance for the specified memory address. */ + public static FOwnerEx create(long address) { + return new FOwnerEx(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FOwnerEx createSafe(long address) { + return address == NULL ? null : new FOwnerEx(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FOwnerEx} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FOwnerEx malloc(MemoryStack stack) { + return new FOwnerEx(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FOwnerEx} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FOwnerEx calloc(MemoryStack stack) { + return new FOwnerEx(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + FOwnerEx.TYPE); } + /** Unsafe version of {@link #pid}. */ + public static int npid(long struct) { return UNSAFE.getInt(null, struct + FOwnerEx.PID); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + FOwnerEx.TYPE, value); } + /** Unsafe version of {@link #pid(int) pid}. */ + public static void npid(long struct, int value) { UNSAFE.putInt(null, struct + FOwnerEx.PID, value); } + + // ----------------------------------- + + /** An array of {@link FOwnerEx} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FOwnerEx ELEMENT_FACTORY = FOwnerEx.create(-1L); + + /** + * Creates a new {@code FOwnerEx.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FOwnerEx#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FOwnerEx getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return FOwnerEx.ntype(address()); } + /** @return the value of the {@code pid} field. */ + @NativeType("pid_t") + public int pid() { return FOwnerEx.npid(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { FOwnerEx.ntype(address(), value); return this; } + /** Sets the specified value to the {@code pid} field. */ + public Buffer pid(@NativeType("pid_t") int value) { FOwnerEx.npid(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Flock.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Flock.java new file mode 100644 index 000000000..ab1210f71 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Flock.java @@ -0,0 +1,342 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct flock64 {
    + *     short {@link #l_type};
    + *     short {@link #l_whence};
    + *     off_t {@link #l_start};
    + *     off_t {@link #l_len};
    + *     pid_t {@link #l_pid};
    + * }
    + */ +@NativeType("struct flock64") +public class Flock extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + L_TYPE, + L_WHENCE, + L_START, + L_LEN, + L_PID; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(8), + __member(8), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + L_TYPE = layout.offsetof(0); + L_WHENCE = layout.offsetof(1); + L_START = layout.offsetof(2); + L_LEN = layout.offsetof(3); + L_PID = layout.offsetof(4); + } + + protected Flock(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected Flock create(long address, @Nullable ByteBuffer container) { + return new Flock(address, container); + } + + /** + * Creates a {@code Flock} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public Flock(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** type of lock. One of:
    {@link FCNTL#F_RDLCK}{@link FCNTL#F_WRLCK}{@link FCNTL#F_UNLCK}
    */ + public short l_type() { return nl_type(address()); } + /** where {@code l_start} is relative to (like {@code lseek}) */ + public short l_whence() { return nl_whence(address()); } + /** offset where the lock begins */ + @NativeType("off_t") + public long l_start() { return nl_start(address()); } + /** size of the locked area; zero means until EOF */ + @NativeType("off_t") + public long l_len() { return nl_len(address()); } + /** process holding the lock */ + @NativeType("pid_t") + public int l_pid() { return nl_pid(address()); } + + /** Sets the specified value to the {@link #l_type} field. */ + public Flock l_type(short value) { nl_type(address(), value); return this; } + /** Sets the specified value to the {@link #l_whence} field. */ + public Flock l_whence(short value) { nl_whence(address(), value); return this; } + /** Sets the specified value to the {@link #l_start} field. */ + public Flock l_start(@NativeType("off_t") long value) { nl_start(address(), value); return this; } + /** Sets the specified value to the {@link #l_len} field. */ + public Flock l_len(@NativeType("off_t") long value) { nl_len(address(), value); return this; } + /** Sets the specified value to the {@link #l_pid} field. */ + public Flock l_pid(@NativeType("pid_t") int value) { nl_pid(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public Flock set( + short l_type, + short l_whence, + long l_start, + long l_len, + int l_pid + ) { + l_type(l_type); + l_whence(l_whence); + l_start(l_start); + l_len(l_len); + l_pid(l_pid); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public Flock set(Flock src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code Flock} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static Flock malloc() { + return new Flock(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code Flock} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static Flock calloc() { + return new Flock(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code Flock} instance allocated with {@link BufferUtils}. */ + public static Flock create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new Flock(memAddress(container), container); + } + + /** Returns a new {@code Flock} instance for the specified memory address. */ + public static Flock create(long address) { + return new Flock(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Flock createSafe(long address) { + return address == NULL ? null : new Flock(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code Flock} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static Flock malloc(MemoryStack stack) { + return new Flock(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code Flock} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static Flock calloc(MemoryStack stack) { + return new Flock(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #l_type}. */ + public static short nl_type(long struct) { return UNSAFE.getShort(null, struct + Flock.L_TYPE); } + /** Unsafe version of {@link #l_whence}. */ + public static short nl_whence(long struct) { return UNSAFE.getShort(null, struct + Flock.L_WHENCE); } + /** Unsafe version of {@link #l_start}. */ + public static long nl_start(long struct) { return UNSAFE.getLong(null, struct + Flock.L_START); } + /** Unsafe version of {@link #l_len}. */ + public static long nl_len(long struct) { return UNSAFE.getLong(null, struct + Flock.L_LEN); } + /** Unsafe version of {@link #l_pid}. */ + public static int nl_pid(long struct) { return UNSAFE.getInt(null, struct + Flock.L_PID); } + + /** Unsafe version of {@link #l_type(short) l_type}. */ + public static void nl_type(long struct, short value) { UNSAFE.putShort(null, struct + Flock.L_TYPE, value); } + /** Unsafe version of {@link #l_whence(short) l_whence}. */ + public static void nl_whence(long struct, short value) { UNSAFE.putShort(null, struct + Flock.L_WHENCE, value); } + /** Unsafe version of {@link #l_start(long) l_start}. */ + public static void nl_start(long struct, long value) { UNSAFE.putLong(null, struct + Flock.L_START, value); } + /** Unsafe version of {@link #l_len(long) l_len}. */ + public static void nl_len(long struct, long value) { UNSAFE.putLong(null, struct + Flock.L_LEN, value); } + /** Unsafe version of {@link #l_pid(int) l_pid}. */ + public static void nl_pid(long struct, int value) { UNSAFE.putInt(null, struct + Flock.L_PID, value); } + + // ----------------------------------- + + /** An array of {@link Flock} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final Flock ELEMENT_FACTORY = Flock.create(-1L); + + /** + * Creates a new {@code Flock.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link Flock#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected Flock getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link Flock#l_type} field. */ + public short l_type() { return Flock.nl_type(address()); } + /** @return the value of the {@link Flock#l_whence} field. */ + public short l_whence() { return Flock.nl_whence(address()); } + /** @return the value of the {@link Flock#l_start} field. */ + @NativeType("off_t") + public long l_start() { return Flock.nl_start(address()); } + /** @return the value of the {@link Flock#l_len} field. */ + @NativeType("off_t") + public long l_len() { return Flock.nl_len(address()); } + /** @return the value of the {@link Flock#l_pid} field. */ + @NativeType("pid_t") + public int l_pid() { return Flock.nl_pid(address()); } + + /** Sets the specified value to the {@link Flock#l_type} field. */ + public Buffer l_type(short value) { Flock.nl_type(address(), value); return this; } + /** Sets the specified value to the {@link Flock#l_whence} field. */ + public Buffer l_whence(short value) { Flock.nl_whence(address(), value); return this; } + /** Sets the specified value to the {@link Flock#l_start} field. */ + public Buffer l_start(@NativeType("off_t") long value) { Flock.nl_start(address(), value); return this; } + /** Sets the specified value to the {@link Flock#l_len} field. */ + public Buffer l_len(@NativeType("off_t") long value) { Flock.nl_len(address(), value); return this; } + /** Sets the specified value to the {@link Flock#l_pid} field. */ + public Buffer l_pid(@NativeType("pid_t") int value) { Flock.nl_pid(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/IOVec.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/IOVec.java new file mode 100644 index 000000000..fa86763b7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/IOVec.java @@ -0,0 +1,288 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct iovec {
    + *     void * {@link #iov_base};
    + *     size_t {@link #iov_len};
    + * }
    + */ +@NativeType("struct iovec") +public class IOVec extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + IOV_BASE, + IOV_LEN; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + IOV_BASE = layout.offsetof(0); + IOV_LEN = layout.offsetof(1); + } + + protected IOVec(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOVec create(long address, @Nullable ByteBuffer container) { + return new IOVec(address, container); + } + + /** + * Creates a {@code IOVec} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOVec(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** starting address */ + @Nullable + @NativeType("void *") + public ByteBuffer iov_base() { return niov_base(address()); } + /** number of bytes to transfer */ + @NativeType("size_t") + public long iov_len() { return niov_len(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@link #iov_base} field. */ + public IOVec iov_base(@Nullable @NativeType("void *") ByteBuffer value) { niov_base(address(), value); return this; } + /** Sets the specified value to the {@link #iov_len} field. */ + public IOVec iov_len(@NativeType("size_t") long value) { niov_len(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOVec set( + @Nullable ByteBuffer iov_base, + long iov_len + ) { + iov_base(iov_base); + iov_len(iov_len); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOVec set(IOVec src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOVec} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOVec malloc() { + return new IOVec(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOVec} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOVec calloc() { + return new IOVec(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOVec} instance allocated with {@link BufferUtils}. */ + public static IOVec create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOVec(memAddress(container), container); + } + + /** Returns a new {@code IOVec} instance for the specified memory address. */ + public static IOVec create(long address) { + return new IOVec(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOVec createSafe(long address) { + return address == NULL ? null : new IOVec(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOVec} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOVec malloc(MemoryStack stack) { + return new IOVec(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOVec} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOVec calloc(MemoryStack stack) { + return new IOVec(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #iov_base() iov_base}. */ + @Nullable public static ByteBuffer niov_base(long struct) { return memByteBufferSafe(memGetAddress(struct + IOVec.IOV_BASE), (int)niov_len(struct)); } + /** Unsafe version of {@link #iov_len}. */ + public static long niov_len(long struct) { return memGetAddress(struct + IOVec.IOV_LEN); } + + /** Unsafe version of {@link #iov_base(ByteBuffer) iov_base}. */ + public static void niov_base(long struct, @Nullable ByteBuffer value) { memPutAddress(struct + IOVec.IOV_BASE, memAddressSafe(value)); } + /** Unsafe version of {@link #iov_len(long) iov_len}. */ + public static void niov_len(long struct, long value) { memPutAddress(struct + IOVec.IOV_LEN, value); } + + // ----------------------------------- + + /** An array of {@link IOVec} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOVec ELEMENT_FACTORY = IOVec.create(-1L); + + /** + * Creates a new {@code IOVec.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOVec#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOVec getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@link IOVec#iov_base} field. */ + @Nullable + @NativeType("void *") + public ByteBuffer iov_base() { return IOVec.niov_base(address()); } + /** @return the value of the {@link IOVec#iov_len} field. */ + @NativeType("size_t") + public long iov_len() { return IOVec.niov_len(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@link IOVec#iov_base} field. */ + public Buffer iov_base(@Nullable @NativeType("void *") ByteBuffer value) { IOVec.niov_base(address(), value); return this; } + /** Sets the specified value to the {@link IOVec#iov_len} field. */ + public Buffer iov_len(@NativeType("size_t") long value) { IOVec.niov_len(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/KernelTimespec.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/KernelTimespec.java new file mode 100644 index 000000000..aaa99c1cd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/KernelTimespec.java @@ -0,0 +1,286 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct __kernel_timespec {
    + *     int64_t {@link #tv_sec};
    + *     long long {@link #tv_nsec};
    + * }
    + */ +@NativeType("struct __kernel_timespec") +public class KernelTimespec extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TV_SEC, + TV_NSEC; + + static { + Layout layout = __struct( + __member(8), + __member(8) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TV_SEC = layout.offsetof(0); + TV_NSEC = layout.offsetof(1); + } + + protected KernelTimespec(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected KernelTimespec create(long address, @Nullable ByteBuffer container) { + return new KernelTimespec(address, container); + } + + /** + * Creates a {@code KernelTimespec} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public KernelTimespec(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** seconds */ + @NativeType("int64_t") + public long tv_sec() { return ntv_sec(address()); } + /** nanoseconds */ + @NativeType("long long") + public long tv_nsec() { return ntv_nsec(address()); } + + /** Sets the specified value to the {@link #tv_sec} field. */ + public KernelTimespec tv_sec(@NativeType("int64_t") long value) { ntv_sec(address(), value); return this; } + /** Sets the specified value to the {@link #tv_nsec} field. */ + public KernelTimespec tv_nsec(@NativeType("long long") long value) { ntv_nsec(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public KernelTimespec set( + long tv_sec, + long tv_nsec + ) { + tv_sec(tv_sec); + tv_nsec(tv_nsec); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public KernelTimespec set(KernelTimespec src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code KernelTimespec} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static KernelTimespec malloc() { + return new KernelTimespec(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code KernelTimespec} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static KernelTimespec calloc() { + return new KernelTimespec(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code KernelTimespec} instance allocated with {@link BufferUtils}. */ + public static KernelTimespec create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new KernelTimespec(memAddress(container), container); + } + + /** Returns a new {@code KernelTimespec} instance for the specified memory address. */ + public static KernelTimespec create(long address) { + return new KernelTimespec(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static KernelTimespec createSafe(long address) { + return address == NULL ? null : new KernelTimespec(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code KernelTimespec} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static KernelTimespec malloc(MemoryStack stack) { + return new KernelTimespec(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code KernelTimespec} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static KernelTimespec calloc(MemoryStack stack) { + return new KernelTimespec(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #tv_sec}. */ + public static long ntv_sec(long struct) { return UNSAFE.getLong(null, struct + KernelTimespec.TV_SEC); } + /** Unsafe version of {@link #tv_nsec}. */ + public static long ntv_nsec(long struct) { return UNSAFE.getLong(null, struct + KernelTimespec.TV_NSEC); } + + /** Unsafe version of {@link #tv_sec(long) tv_sec}. */ + public static void ntv_sec(long struct, long value) { UNSAFE.putLong(null, struct + KernelTimespec.TV_SEC, value); } + /** Unsafe version of {@link #tv_nsec(long) tv_nsec}. */ + public static void ntv_nsec(long struct, long value) { UNSAFE.putLong(null, struct + KernelTimespec.TV_NSEC, value); } + + // ----------------------------------- + + /** An array of {@link KernelTimespec} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final KernelTimespec ELEMENT_FACTORY = KernelTimespec.create(-1L); + + /** + * Creates a new {@code KernelTimespec.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link KernelTimespec#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected KernelTimespec getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link KernelTimespec#tv_sec} field. */ + @NativeType("int64_t") + public long tv_sec() { return KernelTimespec.ntv_sec(address()); } + /** @return the value of the {@link KernelTimespec#tv_nsec} field. */ + @NativeType("long long") + public long tv_nsec() { return KernelTimespec.ntv_nsec(address()); } + + /** Sets the specified value to the {@link KernelTimespec#tv_sec} field. */ + public Buffer tv_sec(@NativeType("int64_t") long value) { KernelTimespec.ntv_sec(address(), value); return this; } + /** Sets the specified value to the {@link KernelTimespec#tv_nsec} field. */ + public Buffer tv_nsec(@NativeType("long long") long value) { KernelTimespec.ntv_nsec(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/LinuxLibrary.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/LinuxLibrary.java new file mode 100644 index 000000000..0148a731e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/LinuxLibrary.java @@ -0,0 +1,55 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system.linux; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.system.*; + +import javax.annotation.*; +import java.nio.*; + +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.linux.DynamicLinkLoader.*; + +/** Implements a {@link SharedLibrary} on the Linux OS. */ +public class LinuxLibrary extends SharedLibrary.Default { + + public LinuxLibrary(String name) { + this(name, loadLibrary(name)); + } + + public LinuxLibrary(String name, long handle) { + super(name, handle); + } + + private static long loadLibrary(String name) { + long handle; + try (MemoryStack stack = stackPush()) { + handle = dlopen(stack.UTF8(name), RTLD_LAZY | (PointerBuffer.is64Bit() ? RTLD_GLOBAL : 2)); + } + if (handle == NULL) { + throw new UnsatisfiedLinkError("Failed to dynamically load library: " + name + "(error = " + dlerror() + ")"); + } + return handle; + } + + @Nullable + @Override + public String getPath() { + return SharedLibraryUtil.getLibraryPath(address()); + } + + @Override + public long getFunctionAddress(ByteBuffer functionName) { + return dlsym(address(), functionName); + } + + @Override + public void free() { + dlclose(address()); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/MMAN.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/MMAN.java new file mode 100644 index 000000000..76a46367c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/MMAN.java @@ -0,0 +1,256 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to <sys/mman.h>. */ +public class MMAN { + + static { Library.initialize(); } + + /** Return value of {@link #mmap} in case of an error. */ + public static final long MAP_FAILED = -1L; + + /** + * The {@code prot} argument describes the desired memory protection of the mapping (and must not conflict with the open mode of the file). + * + *

    It is either {@code PROT_NONE} or the bitwise OR of one or more of the following flags.

    + * + *
    Enum values:
    + * + *
      + *
    • {@link #PROT_EXEC PROT_EXEC} - Pages may be executed.
    • + *
    • {@link #PROT_READ PROT_READ} - Pages may be read.
    • + *
    • {@link #PROT_WRITE PROT_WRITE} - Pages may be written.
    • + *
    • {@link #PROT_NONE PROT_NONE} - Pages may not be accessed.
    • + *
    • {@link #PROT_GROWSDOWN PROT_GROWSDOWN} - Extend change to start of {@code growsdown} vma ({@code mprotect} only).
    • + *
    • {@link #PROT_GROWSUP PROT_GROWSUP} - Extend change to start of {@code growsup} vma ({@code mprotect} only).
    • + *
    + */ + public static final int + PROT_EXEC = 0x4, + PROT_READ = 0x1, + PROT_WRITE = 0x2, + PROT_NONE = 0x0, + PROT_GROWSDOWN = 0x01000000, + PROT_GROWSUP = 0x02000000; + + /** + * The flags argument determines whether updates to the mapping are visible to other processes mapping the same region, and whether updates are carried + * through to the underlying file. + * + *

    This behavior is determined by including exactly one of the following values in {@code flags}.

    + * + *
    Enum values:
    + * + *
      + *
    • {@link #MAP_SHARED MAP_SHARED} - + * Share this mapping. + * + *

      Updates to the mapping are visible to other processes mapping the same region, and (in the case of file-backed mappings) are carried through to the + * underlying file. (To precisely control when updates are carried through to the underlying file requires the use of {@code msync(2)}.)

      + *
    • + *
    • {@link #MAP_SHARED_VALIDATE MAP_SHARED_VALIDATE} - + * This flag provides the same behavior as {@link #MAP_SHARED} except that {@code MAP_SHARED} mappings ignore unknown flags in {@code flags}. + * + *

      By contrast, when creating a mapping using {@code MAP_SHARED_VALIDATE}, the kernel verifies all passed flags are known and fails the mapping with + * the error {@code EOPNOTSUPP} for unknown flags. This mapping type is also required to be able to use some mapping flags (e.g., {@code MAP_SYNC}).

      + *
    • + *
    • {@link #MAP_PRIVATE MAP_PRIVATE} - + * Create a private copy-on-write mapping. + * + *

      Updates to the mapping are not visible to other processes mapping the same file, and are not carried through to the underlying file. It is + * unspecified whether changes made to the file after the {@link #mmap} call are visible in the mapped region.

      + *
    • + *
    + */ + public static final int + MAP_SHARED = 0x01, + MAP_SHARED_VALIDATE = 0x03, + MAP_PRIVATE = 0x02; + + public static final int MAP_HUGE_SHIFT = 26; + + public static final int MAP_HUGE_MASK = 0x3f; + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #MAP_32BIT MAP_32BIT} - + * Put the mapping into the first 2 Gigabytes of the process address space. + * + *

      This flag is supported only on x86-64, for 64-bit programs. It was added to allow thread stacks to be allocated somewhere in the first 2 GB of + * memory, so as to improve context-switch performance on some early 64-bit processors. Modern x86-64 processors no longer have this performance + * problem, so use of this flag is not required on those systems. The {@code MAP_32BIT} flag is ignored when {@link #MAP_FIXED} is set.

      + *
    • + *
    • {@link #MAP_ANONYMOUS MAP_ANONYMOUS} - + * The mapping is not backed by any file; its contents are initialized to zero. + * + *

      The {@code fd} argument is ignored; however, some implementations require {@code fd} to be -1 if {@code MAP_ANONYMOUS} (or {@link #MAP_ANON}) is specified, + * and portable applications should ensure this. The {@code offset} argument should be zero. The use of {@code MAP_ANONYMOUS} in conjunction with + * {@code MAP_SHARED} is supported on Linux only since kernel 2.4.

      + *
    • + *
    • {@link #MAP_ANON MAP_ANON} - Synonym for MAP_ANONYMOUS; provided for compatibility with other implementations.
    • + *
    • {@link #MAP_DENYWRITE MAP_DENYWRITE} - + * This flag is ignored. + * + *

      (Long ago —Linux 2.0 and earlier— it signaled that attempts to write to the underlying file should fail with {@code ETXTBSY}. But this was a source + * of denial-of-service attacks.)

      + *
    • + *
    • {@link #MAP_EXECUTABLE MAP_EXECUTABLE} - This flag is ignored.
    • + *
    • {@link #MAP_FILE MAP_FILE} - Compatibility flag. Ignored.
    • + *
    • {@link #MAP_FIXED MAP_FIXED} - + * Don't interpret {@code addr} as a hint: place the mapping at exactly that address. + * + *

      {@code addr} must be suitably aligned: for most architectures a multiple of the page size is sufficient; however, some architectures may impose + * additional restrictions. If the memory region specified by {@code addr} and {@code length} overlaps pages of any existing mapping(s), then the + * overlapped part of the existing mapping(s) will be discarded. If the specified address cannot be used, {@link #mmap} will fail.

      + * + *

      Software that aspires to be portable should use the {@code MAP_FIXED} flag with care, keeping in mind that the exact layout of a process's memory + * mappings is allowed to change significantly between kernel versions, C library versions, and operating system releases. Carefully read the + * discussion of this flag in NOTES!

      + *
    • + *
    • {@link #MAP_FIXED_NOREPLACE MAP_FIXED_NOREPLACE} - + * This flag provides behavior that is similar to {@link #MAP_FIXED} with respect to the {@code addr} enforcement, but differs in that + * {@code MAP_FIXED_NOREPLACE} never clobbers a preexisting mapped range. + * + *

      If the requested range would collide with an existing mapping, then this call fails with the error {@code EEXIST}. This flag can therefore be used + * as a way to atomically (with respect to other threads) attempt to map an address range: one thread will succeed; all others will report failure.

      + * + *

      Note that older kernels which do not recognize the {@code MAP_FIXED_NOREPLACE} flag will typically (upon detecting a collision with a preexisting + * mapping) fall back to a "non-{@code MAP_FIXED}" type of behavior: they will return an address that is different from the requested address. + * Therefore, backward-compatible software should check the returned address against the requested address.

      + * + *

      (since Linux 4.17)

      + *
    • + *
    • {@link #MAP_GROWSDOWN MAP_GROWSDOWN} - + * This flag is used for stacks. It indicates to the kernel virtual memory system that the mapping should extend downward in memory. + * + *

      The return address is one page lower than the memory area that is actually created in the process's virtual address space. Touching an address in + * the "guard" page below the mapping will cause the mapping to grow by a page. This growth can be repeated until the mapping grows to within a page + * of the high end of the next lower mapping, at which point touching the "guard" page will result in a {@code SIGSEGV} signal.

      + *
    • + *
    • {@link #MAP_HUGETLB MAP_HUGETLB} - + * Allocate the mapping using "huge" pages. + * + *

      See the Linux kernel source file {@code Documentation/admin-guide/mm/hugetlbpage.rst} for further information, as well as NOTES, below.

      + * + *

      (since Linux 2.6.32)

      + *
    • + *
    • {@link #MAP_HUGE_2MB MAP_HUGE_2MB} - + * Used in conjunction with {@link #MAP_HUGETLB} to select alternative {@code hugetlb} page sizes (respectively, 2 MB and 1 GB) on systems that support + * multiple {@code hugetlb} page sizes. + * + *

      More generally, the desired huge page size can be configured by encoding the base-2 logarithm of the desired page size in the six bits at the + * offset {@link #MAP_HUGE_SHIFT}. (A value of zero in this bit field provides the default huge page size; the default huge page size can be discovered via + * the {@code Hugepagesize} field exposed by {@code /proc/meminfo}.) Thus, the above two constants are defined as:

      + * + *
      
      +     * #define MAP_HUGE_2MB    (21 << MAP_HUGE_SHIFT)
      +     * #define MAP_HUGE_1GB    (30 << MAP_HUGE_SHIFT)
      + * + *

      The range of huge page sizes that are supported by the system can be discovered by listing the subdirectories in {@code /sys/kernel/mm/hugepages}.

      + * + *

      (since Linux 3.8)

      + *
    • + *
    • {@link #MAP_HUGE_1GB MAP_HUGE_1GB} - See {@link #MAP_HUGE_2MB}.
    • + *
    • {@link #MAP_LOCKED MAP_LOCKED} - + *
    • + *
    • {@link #MAP_NONBLOCK MAP_NONBLOCK} - + *
    • + *
    • {@link #MAP_NORESERVE MAP_NORESERVE} - + *
    • + *
    • {@link #MAP_POPULATE MAP_POPULATE} - + *
    • + *
    • {@link #MAP_STACK MAP_STACK} - + *
    • + *
    • {@link #MAP_SYNC MAP_SYNC} - + *
    • + *
    • {@link #MAP_UNINITIALIZED MAP_UNINITIALIZED} - + *
    • + *
    + */ + public static final int + MAP_32BIT = 0x40, + MAP_ANONYMOUS = 0x20, + MAP_ANON = MAP_ANONYMOUS, + MAP_DENYWRITE = 0x00800, + MAP_EXECUTABLE = 0x01000, + MAP_FILE = 0, + MAP_FIXED = 0x10, + MAP_FIXED_NOREPLACE = 0x100000, + MAP_GROWSDOWN = 0x00100, + MAP_HUGETLB = 0x40000, + MAP_HUGE_2MB = 21 << MAP_HUGE_SHIFT, + MAP_HUGE_1GB = 30 << MAP_HUGE_SHIFT, + MAP_LOCKED = 0x02000, + MAP_NONBLOCK = 0x10000, + MAP_NORESERVE = 0x04000, + MAP_POPULATE = 0x08000, + MAP_STACK = 0x20000, + MAP_SYNC = 0x80000, + MAP_UNINITIALIZED = 0x4000000; + + protected MMAN() { + throw new UnsupportedOperationException(); + } + + // --- [ mmap ] --- + + /** + * Creates a new mapping in the virtual address space of the calling process. + * + *

    The starting address for the new mapping is specified in {@code addr}. The {@code length} argument specifies the length of the mapping (which must be + * greater than 0).

    + * + *

    If {@code addr} is {@code NULL}, then the kernel chooses the (page-aligned) address at which to create the mapping; this is the most portable method of + * creating a new mapping. If {@code addr} is not {@code NULL}, then the kernel takes it as a hint about where to place the mapping; on Linux, the kernel will + * pick a nearby page boundary (but always above or equal to the value specified by {@code /proc/sys/vm/mmap_min_addr}) and attempt to create the mapping + * there. If another mapping already exists there, the kernel picks a new address that may or may not depend on the hint. The address of the new mapping + * is returned as the result of the call.

    + * + *

    The contents of a file mapping (as opposed to an anonymous mapping; see {@code MAP_ANONYMOUS} below), are initialized using {@code length} bytes + * starting at offset {@code offset} in the file (or other object) referred to by the file descriptor {@code fd}. {@code offset} must be a multiple of the + * page size as returned by {@code sysconf(_SC_PAGE_SIZE)}.

    + * + *

    After the {@code mmap()} call has returned, the file descriptor, {@code fd}, can be closed immediately without invalidating the mapping.

    + * + * @param prot describes the desired memory protection of the mapping (and must not conflict with the open mode of the file). One or more of:
    {@link #PROT_EXEC}{@link #PROT_READ}{@link #PROT_WRITE}{@link #PROT_NONE}{@link #PROT_GROWSDOWN}{@link #PROT_GROWSUP}
    + * @param flags one or more of:
    {@link #MAP_FAILED}{@link #MAP_SHARED}{@link #MAP_SHARED_VALIDATE}{@link #MAP_PRIVATE}{@link #MAP_HUGE_SHIFT}{@link #MAP_HUGE_MASK}
    {@link #MAP_32BIT}{@link #MAP_ANONYMOUS}{@link #MAP_ANON}{@link #MAP_DENYWRITE}{@link #MAP_EXECUTABLE}{@link #MAP_FILE}
    {@link #MAP_FIXED}{@link #MAP_FIXED_NOREPLACE}{@link #MAP_GROWSDOWN}{@link #MAP_HUGETLB}{@link #MAP_HUGE_2MB}{@link #MAP_HUGE_1GB}
    {@link #MAP_LOCKED}{@link #MAP_NONBLOCK}{@link #MAP_NORESERVE}{@link #MAP_POPULATE}{@link #MAP_STACK}{@link #MAP_SYNC}
    {@link #MAP_UNINITIALIZED}
    + * + * @return on success, returns a pointer to the mapped area. On error, the value {@link #MAP_FAILED} is returned, and {@code errno} is set to indicate the error. + */ + @NativeType("void *") + public static native long mmap(@NativeType("void *") long addr, @NativeType("size_t") long length, int prot, int flags, int fd, @NativeType("off_t") long offset); + + // --- [ munmap ] --- + + /** Unsafe version of: {@link #munmap} */ + public static native int nmunmap(long addr, long length); + + /** + * Deletes the mappings for the specified address range, and causes further references to addresses within the range to generate invalid memory + * references. + * + *

    The region is also automatically unmapped when the process is terminated. On the other hand, closing the file descriptor does not unmap the region.

    + * + *

    The address {@code addr} must be a multiple of the page size (but {@code length} need not be). All pages containing a part of the indicated range are + * unmapped, and subsequent references to these pages will generate {@code SIGSEGV}. It is not an error if the indicated range does not contain any mapped + * pages.

    + * + * @return on success, returns 0. On failure, it returns -1, and {@code errno} is set to indicate the error (probably to {@code EINVAL}). + */ + public static int munmap(@NativeType("void *") ByteBuffer addr) { + return nmunmap(memAddress(addr), addr.remaining()); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Msghdr.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Msghdr.java new file mode 100644 index 000000000..b615a1f60 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Msghdr.java @@ -0,0 +1,378 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct msghdr {
    + *     void * {@link #msg_name};
    + *     socklen_t {@link #msg_namelen};
    + *     {@link IOVec struct iovec} * {@link #msg_iov};
    + *     size_t {@link #msg_iovlen};
    + *     void * {@link #msg_control};
    + *     size_t {@link #msg_controllen};
    + *     int {@link #msg_flags};
    + * }
    + */ +@NativeType("struct msghdr") +public class Msghdr extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + MSG_NAME, + MSG_NAMELEN, + MSG_IOV, + MSG_IOVLEN, + MSG_CONTROL, + MSG_CONTROLLEN, + MSG_FLAGS; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + MSG_NAME = layout.offsetof(0); + MSG_NAMELEN = layout.offsetof(1); + MSG_IOV = layout.offsetof(2); + MSG_IOVLEN = layout.offsetof(3); + MSG_CONTROL = layout.offsetof(4); + MSG_CONTROLLEN = layout.offsetof(5); + MSG_FLAGS = layout.offsetof(6); + } + + protected Msghdr(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected Msghdr create(long address, @Nullable ByteBuffer container) { + return new Msghdr(address, container); + } + + /** + * Creates a {@code Msghdr} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public Msghdr(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** address to send to/receive from */ + @NativeType("void *") + public ByteBuffer msg_name() { return nmsg_name(address()); } + /** length of {@code address} data */ + @NativeType("socklen_t") + public int msg_namelen() { return nmsg_namelen(address()); } + /** vector of data to send/receive into */ + @NativeType("struct iovec *") + public IOVec.Buffer msg_iov() { return nmsg_iov(address()); } + /** number of elements in the vector */ + @NativeType("size_t") + public long msg_iovlen() { return nmsg_iovlen(address()); } + /** ancillary data (eg BSD filedesc passing) */ + @NativeType("void *") + public ByteBuffer msg_control() { return nmsg_control(address()); } + /** ancillary data buffer length */ + @NativeType("size_t") + public long msg_controllen() { return nmsg_controllen(address()); } + /** flags on received message */ + public int msg_flags() { return nmsg_flags(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@link #msg_name} field. */ + public Msghdr msg_name(@NativeType("void *") ByteBuffer value) { nmsg_name(address(), value); return this; } + /** Sets the address of the specified {@link IOVec.Buffer} to the {@link #msg_iov} field. */ + public Msghdr msg_iov(@NativeType("struct iovec *") IOVec.Buffer value) { nmsg_iov(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@link #msg_control} field. */ + public Msghdr msg_control(@NativeType("void *") ByteBuffer value) { nmsg_control(address(), value); return this; } + /** Sets the specified value to the {@link #msg_flags} field. */ + public Msghdr msg_flags(int value) { nmsg_flags(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public Msghdr set( + ByteBuffer msg_name, + IOVec.Buffer msg_iov, + ByteBuffer msg_control, + int msg_flags + ) { + msg_name(msg_name); + msg_iov(msg_iov); + msg_control(msg_control); + msg_flags(msg_flags); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public Msghdr set(Msghdr src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code Msghdr} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static Msghdr malloc() { + return new Msghdr(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code Msghdr} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static Msghdr calloc() { + return new Msghdr(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code Msghdr} instance allocated with {@link BufferUtils}. */ + public static Msghdr create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new Msghdr(memAddress(container), container); + } + + /** Returns a new {@code Msghdr} instance for the specified memory address. */ + public static Msghdr create(long address) { + return new Msghdr(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Msghdr createSafe(long address) { + return address == NULL ? null : new Msghdr(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code Msghdr} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static Msghdr malloc(MemoryStack stack) { + return new Msghdr(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code Msghdr} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static Msghdr calloc(MemoryStack stack) { + return new Msghdr(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #msg_name() msg_name}. */ + public static ByteBuffer nmsg_name(long struct) { return memByteBuffer(memGetAddress(struct + Msghdr.MSG_NAME), nmsg_namelen(struct)); } + /** Unsafe version of {@link #msg_namelen}. */ + public static int nmsg_namelen(long struct) { return UNSAFE.getInt(null, struct + Msghdr.MSG_NAMELEN); } + /** Unsafe version of {@link #msg_iov}. */ + public static IOVec.Buffer nmsg_iov(long struct) { return IOVec.create(memGetAddress(struct + Msghdr.MSG_IOV), (int)nmsg_iovlen(struct)); } + /** Unsafe version of {@link #msg_iovlen}. */ + public static long nmsg_iovlen(long struct) { return memGetAddress(struct + Msghdr.MSG_IOVLEN); } + /** Unsafe version of {@link #msg_control() msg_control}. */ + public static ByteBuffer nmsg_control(long struct) { return memByteBuffer(memGetAddress(struct + Msghdr.MSG_CONTROL), (int)nmsg_controllen(struct)); } + /** Unsafe version of {@link #msg_controllen}. */ + public static long nmsg_controllen(long struct) { return memGetAddress(struct + Msghdr.MSG_CONTROLLEN); } + /** Unsafe version of {@link #msg_flags}. */ + public static int nmsg_flags(long struct) { return UNSAFE.getInt(null, struct + Msghdr.MSG_FLAGS); } + + /** Unsafe version of {@link #msg_name(ByteBuffer) msg_name}. */ + public static void nmsg_name(long struct, ByteBuffer value) { memPutAddress(struct + Msghdr.MSG_NAME, memAddress(value)); nmsg_namelen(struct, value.remaining()); } + /** Sets the specified value to the {@code msg_namelen} field of the specified {@code struct}. */ + public static void nmsg_namelen(long struct, int value) { UNSAFE.putInt(null, struct + Msghdr.MSG_NAMELEN, value); } + /** Unsafe version of {@link #msg_iov(IOVec.Buffer) msg_iov}. */ + public static void nmsg_iov(long struct, IOVec.Buffer value) { memPutAddress(struct + Msghdr.MSG_IOV, value.address()); nmsg_iovlen(struct, value.remaining()); } + /** Sets the specified value to the {@code msg_iovlen} field of the specified {@code struct}. */ + public static void nmsg_iovlen(long struct, long value) { memPutAddress(struct + Msghdr.MSG_IOVLEN, value); } + /** Unsafe version of {@link #msg_control(ByteBuffer) msg_control}. */ + public static void nmsg_control(long struct, ByteBuffer value) { memPutAddress(struct + Msghdr.MSG_CONTROL, memAddress(value)); nmsg_controllen(struct, value.remaining()); } + /** Sets the specified value to the {@code msg_controllen} field of the specified {@code struct}. */ + public static void nmsg_controllen(long struct, long value) { memPutAddress(struct + Msghdr.MSG_CONTROLLEN, value); } + /** Unsafe version of {@link #msg_flags(int) msg_flags}. */ + public static void nmsg_flags(long struct, int value) { UNSAFE.putInt(null, struct + Msghdr.MSG_FLAGS, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + Msghdr.MSG_NAME)); + check(memGetAddress(struct + Msghdr.MSG_IOV)); + check(memGetAddress(struct + Msghdr.MSG_CONTROL)); + } + + // ----------------------------------- + + /** An array of {@link Msghdr} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final Msghdr ELEMENT_FACTORY = Msghdr.create(-1L); + + /** + * Creates a new {@code Msghdr.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link Msghdr#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected Msghdr getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@link Msghdr#msg_name} field. */ + @NativeType("void *") + public ByteBuffer msg_name() { return Msghdr.nmsg_name(address()); } + /** @return the value of the {@link Msghdr#msg_namelen} field. */ + @NativeType("socklen_t") + public int msg_namelen() { return Msghdr.nmsg_namelen(address()); } + /** @return a {@link IOVec.Buffer} view of the struct array pointed to by the {@link Msghdr#msg_iov} field. */ + @NativeType("struct iovec *") + public IOVec.Buffer msg_iov() { return Msghdr.nmsg_iov(address()); } + /** @return the value of the {@link Msghdr#msg_iovlen} field. */ + @NativeType("size_t") + public long msg_iovlen() { return Msghdr.nmsg_iovlen(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@link Msghdr#msg_control} field. */ + @NativeType("void *") + public ByteBuffer msg_control() { return Msghdr.nmsg_control(address()); } + /** @return the value of the {@link Msghdr#msg_controllen} field. */ + @NativeType("size_t") + public long msg_controllen() { return Msghdr.nmsg_controllen(address()); } + /** @return the value of the {@link Msghdr#msg_flags} field. */ + public int msg_flags() { return Msghdr.nmsg_flags(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@link Msghdr#msg_name} field. */ + public Buffer msg_name(@NativeType("void *") ByteBuffer value) { Msghdr.nmsg_name(address(), value); return this; } + /** Sets the address of the specified {@link IOVec.Buffer} to the {@link Msghdr#msg_iov} field. */ + public Buffer msg_iov(@NativeType("struct iovec *") IOVec.Buffer value) { Msghdr.nmsg_iov(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@link Msghdr#msg_control} field. */ + public Buffer msg_control(@NativeType("void *") ByteBuffer value) { Msghdr.nmsg_control(address(), value); return this; } + /** Sets the specified value to the {@link Msghdr#msg_flags} field. */ + public Buffer msg_flags(int value) { Msghdr.nmsg_flags(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/OpenHow.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/OpenHow.java new file mode 100644 index 000000000..c27263c65 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/OpenHow.java @@ -0,0 +1,313 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Arguments for how {@code openat2(2)} should open the target path. + * + *

    If only {@code flags} and {@code @}mode are non-zero, then {@code openat2(2)} operates very similarly to {@code openat(2)}.

    + * + *

    However, unlike {@code openat(2)}, unknown or invalid bits in {@code flags} result in {@code -EINVAL} rather than being silently ignored. {@code mode} + * must be zero unless one of {@link FCNTL#O_CREAT}, {@link FCNTL#O_TMPFILE} are set.

    + * + *

    Layout

    + * + *
    
    + * struct open_how {
    + *     __u64 flags;
    + *     __u64 mode;
    + *     __u64 resolve;
    + * }
    + */ +@NativeType("struct open_how") +public class OpenHow extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FLAGS, + MODE, + RESOLVE; + + static { + Layout layout = __struct( + __member(8), + __member(8), + __member(8) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FLAGS = layout.offsetof(0); + MODE = layout.offsetof(1); + RESOLVE = layout.offsetof(2); + } + + protected OpenHow(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected OpenHow create(long address, @Nullable ByteBuffer container) { + return new OpenHow(address, container); + } + + /** + * Creates a {@code OpenHow} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public OpenHow(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code flags} field. */ + @NativeType("__u64") + public long flags() { return nflags(address()); } + /** @return the value of the {@code mode} field. */ + @NativeType("__u64") + public long mode() { return nmode(address()); } + /** @return the value of the {@code resolve} field. */ + @NativeType("__u64") + public long resolve() { return nresolve(address()); } + + /** Sets the specified value to the {@code flags} field. */ + public OpenHow flags(@NativeType("__u64") long value) { nflags(address(), value); return this; } + /** Sets the specified value to the {@code mode} field. */ + public OpenHow mode(@NativeType("__u64") long value) { nmode(address(), value); return this; } + /** Sets the specified value to the {@code resolve} field. */ + public OpenHow resolve(@NativeType("__u64") long value) { nresolve(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public OpenHow set( + long flags, + long mode, + long resolve + ) { + flags(flags); + mode(mode); + resolve(resolve); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public OpenHow set(OpenHow src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code OpenHow} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static OpenHow malloc() { + return new OpenHow(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code OpenHow} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static OpenHow calloc() { + return new OpenHow(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code OpenHow} instance allocated with {@link BufferUtils}. */ + public static OpenHow create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new OpenHow(memAddress(container), container); + } + + /** Returns a new {@code OpenHow} instance for the specified memory address. */ + public static OpenHow create(long address) { + return new OpenHow(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static OpenHow createSafe(long address) { + return address == NULL ? null : new OpenHow(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code OpenHow} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static OpenHow malloc(MemoryStack stack) { + return new OpenHow(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code OpenHow} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static OpenHow calloc(MemoryStack stack) { + return new OpenHow(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #flags}. */ + public static long nflags(long struct) { return UNSAFE.getLong(null, struct + OpenHow.FLAGS); } + /** Unsafe version of {@link #mode}. */ + public static long nmode(long struct) { return UNSAFE.getLong(null, struct + OpenHow.MODE); } + /** Unsafe version of {@link #resolve}. */ + public static long nresolve(long struct) { return UNSAFE.getLong(null, struct + OpenHow.RESOLVE); } + + /** Unsafe version of {@link #flags(long) flags}. */ + public static void nflags(long struct, long value) { UNSAFE.putLong(null, struct + OpenHow.FLAGS, value); } + /** Unsafe version of {@link #mode(long) mode}. */ + public static void nmode(long struct, long value) { UNSAFE.putLong(null, struct + OpenHow.MODE, value); } + /** Unsafe version of {@link #resolve(long) resolve}. */ + public static void nresolve(long struct, long value) { UNSAFE.putLong(null, struct + OpenHow.RESOLVE, value); } + + // ----------------------------------- + + /** An array of {@link OpenHow} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final OpenHow ELEMENT_FACTORY = OpenHow.create(-1L); + + /** + * Creates a new {@code OpenHow.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link OpenHow#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected OpenHow getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code flags} field. */ + @NativeType("__u64") + public long flags() { return OpenHow.nflags(address()); } + /** @return the value of the {@code mode} field. */ + @NativeType("__u64") + public long mode() { return OpenHow.nmode(address()); } + /** @return the value of the {@code resolve} field. */ + @NativeType("__u64") + public long resolve() { return OpenHow.nresolve(address()); } + + /** Sets the specified value to the {@code flags} field. */ + public Buffer flags(@NativeType("__u64") long value) { OpenHow.nflags(address(), value); return this; } + /** Sets the specified value to the {@code mode} field. */ + public Buffer mode(@NativeType("__u64") long value) { OpenHow.nmode(address(), value); return this; } + /** Sets the specified value to the {@code resolve} field. */ + public Buffer resolve(@NativeType("__u64") long value) { OpenHow.nresolve(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/PThread.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/PThread.java new file mode 100644 index 000000000..ef1dc1bad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/PThread.java @@ -0,0 +1,24 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import org.lwjgl.system.*; + +/** Native bindings to <pthread.h>. */ +public class PThread { + + static { Library.initialize(); } + + protected PThread() { + throw new UnsupportedOperationException(); + } + + // --- [ pthread_self ] --- + + @NativeType("pthread_t") + public static native long pthread_self(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Sockaddr.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Sockaddr.java new file mode 100644 index 000000000..5c2f5eaf8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Sockaddr.java @@ -0,0 +1,310 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Structure describing a generic socket address. + * + *

    Layout

    + * + *
    
    + * struct sockaddr {
    + *     sa_family_t {@link #sa_family};
    + *     char {@link #sa_data}[14];
    + * }
    + */ +@NativeType("struct sockaddr") +public class Sockaddr extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + SA_FAMILY, + SA_DATA; + + static { + Layout layout = __struct( + __member(2), + __array(1, 14) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + SA_FAMILY = layout.offsetof(0); + SA_DATA = layout.offsetof(1); + } + + protected Sockaddr(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected Sockaddr create(long address, @Nullable ByteBuffer container) { + return new Sockaddr(address, container); + } + + /** + * Creates a {@code Sockaddr} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public Sockaddr(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** address family and length */ + @NativeType("sa_family_t") + public short sa_family() { return nsa_family(address()); } + /** address data */ + @NativeType("char[14]") + public ByteBuffer sa_data() { return nsa_data(address()); } + /** address data */ + @NativeType("char") + public byte sa_data(int index) { return nsa_data(address(), index); } + + /** Sets the specified value to the {@link #sa_family} field. */ + public Sockaddr sa_family(@NativeType("sa_family_t") short value) { nsa_family(address(), value); return this; } + /** Copies the specified {@link ByteBuffer} to the {@link #sa_data} field. */ + public Sockaddr sa_data(@NativeType("char[14]") ByteBuffer value) { nsa_data(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link #sa_data} field. */ + public Sockaddr sa_data(int index, @NativeType("char") byte value) { nsa_data(address(), index, value); return this; } + + /** Initializes this struct with the specified values. */ + public Sockaddr set( + short sa_family, + ByteBuffer sa_data + ) { + sa_family(sa_family); + sa_data(sa_data); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public Sockaddr set(Sockaddr src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code Sockaddr} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static Sockaddr malloc() { + return new Sockaddr(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code Sockaddr} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static Sockaddr calloc() { + return new Sockaddr(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code Sockaddr} instance allocated with {@link BufferUtils}. */ + public static Sockaddr create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new Sockaddr(memAddress(container), container); + } + + /** Returns a new {@code Sockaddr} instance for the specified memory address. */ + public static Sockaddr create(long address) { + return new Sockaddr(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Sockaddr createSafe(long address) { + return address == NULL ? null : new Sockaddr(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code Sockaddr} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static Sockaddr malloc(MemoryStack stack) { + return new Sockaddr(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code Sockaddr} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static Sockaddr calloc(MemoryStack stack) { + return new Sockaddr(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #sa_family}. */ + public static short nsa_family(long struct) { return UNSAFE.getShort(null, struct + Sockaddr.SA_FAMILY); } + /** Unsafe version of {@link #sa_data}. */ + public static ByteBuffer nsa_data(long struct) { return memByteBuffer(struct + Sockaddr.SA_DATA, 14); } + /** Unsafe version of {@link #sa_data(int) sa_data}. */ + public static byte nsa_data(long struct, int index) { + return UNSAFE.getByte(null, struct + Sockaddr.SA_DATA + check(index, 14) * 1); + } + + /** Unsafe version of {@link #sa_family(short) sa_family}. */ + public static void nsa_family(long struct, short value) { UNSAFE.putShort(null, struct + Sockaddr.SA_FAMILY, value); } + /** Unsafe version of {@link #sa_data(ByteBuffer) sa_data}. */ + public static void nsa_data(long struct, ByteBuffer value) { + if (CHECKS) { checkGT(value, 14); } + memCopy(memAddress(value), struct + Sockaddr.SA_DATA, value.remaining() * 1); + } + /** Unsafe version of {@link #sa_data(int, byte) sa_data}. */ + public static void nsa_data(long struct, int index, byte value) { + UNSAFE.putByte(null, struct + Sockaddr.SA_DATA + check(index, 14) * 1, value); + } + + // ----------------------------------- + + /** An array of {@link Sockaddr} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final Sockaddr ELEMENT_FACTORY = Sockaddr.create(-1L); + + /** + * Creates a new {@code Sockaddr.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link Sockaddr#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected Sockaddr getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link Sockaddr#sa_family} field. */ + @NativeType("sa_family_t") + public short sa_family() { return Sockaddr.nsa_family(address()); } + /** @return a {@link ByteBuffer} view of the {@link Sockaddr#sa_data} field. */ + @NativeType("char[14]") + public ByteBuffer sa_data() { return Sockaddr.nsa_data(address()); } + /** @return the value at the specified index of the {@link Sockaddr#sa_data} field. */ + @NativeType("char") + public byte sa_data(int index) { return Sockaddr.nsa_data(address(), index); } + + /** Sets the specified value to the {@link Sockaddr#sa_family} field. */ + public Buffer sa_family(@NativeType("sa_family_t") short value) { Sockaddr.nsa_family(address(), value); return this; } + /** Copies the specified {@link ByteBuffer} to the {@link Sockaddr#sa_data} field. */ + public Buffer sa_data(@NativeType("char[14]") ByteBuffer value) { Sockaddr.nsa_data(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link Sockaddr#sa_data} field. */ + public Buffer sa_data(int index, @NativeType("char") byte value) { Sockaddr.nsa_data(address(), index, value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Socket.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Socket.java new file mode 100644 index 000000000..43c895d82 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Socket.java @@ -0,0 +1,46 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import org.lwjgl.system.*; + +/** Native bindings to <sys/socket.h>. */ +public class Socket { + + static { Library.initialize(); } + + /** + * The following constants should be used for the second parameter of {@code shutdown}. + * + *
    Enum values:
    + * + *
      + *
    • {@link #SHUT_RD SHUT_RD} - No more receptions.
    • + *
    • {@link #SHUT_WR SHUT_WR} - No more transmissions.
    • + *
    • {@link #SHUT_RDWR SHUT_RDWR} - No more receptions or transmissions.
    • + *
    + */ + public static final int + SHUT_RD = 0, + SHUT_WR = 1, + SHUT_RDWR = 2; + + protected Socket() { + throw new UnsupportedOperationException(); + } + + // --- [ socket ] --- + + /** + * Create a new socket of type {@code __type} in domain {@code __domain}, using protocol {@code __protocol}. + * + *

    If {@code __protocol} is zero, one is chosen automatically.

    + * + * @return a file descriptor for the new socket, or -1 for errors + */ + public static native int socket(int __domain, int __type, int __protocol); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Stat.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Stat.java new file mode 100644 index 000000000..d0a4aac21 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Stat.java @@ -0,0 +1,62 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to <sys/stat.h>. */ +public class Stat { + + static { Library.initialize(); } + + protected Stat() { + throw new UnsupportedOperationException(); + } + + // --- [ stat ] --- + + public static native int nstat(long __file, long __buf); + + public static int stat(@NativeType("char const *") ByteBuffer __file, @NativeType("struct stat *") long __buf) { + if (CHECKS) { + checkNT1(__file); + check(__buf); + } + return nstat(memAddress(__file), __buf); + } + + public static int stat(@NativeType("char const *") CharSequence __file, @NativeType("struct stat *") long __buf) { + if (CHECKS) { + check(__buf); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(__file, true); + long __fileEncoded = stack.getPointerAddress(); + return nstat(__fileEncoded, __buf); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ fstat ] --- + + public static native int nfstat(int __fd, long __buf); + + public static int fstat(int __fd, @NativeType("struct stat *") long __buf) { + if (CHECKS) { + check(__buf); + } + return nfstat(__fd, __buf); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Statx.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Statx.java new file mode 100644 index 000000000..02b8f625c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Statx.java @@ -0,0 +1,699 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct statx {
    + *     __u32 {@link #stx_mask};
    + *     __u32 {@link #stx_blksize};
    + *     __u64 {@link #stx_attributes};
    + *     __u32 {@link #stx_nlink};
    + *     __u32 {@link #stx_uid};
    + *     __u32 {@link #stx_gid};
    + *     __u16 {@link #stx_mode};
    + *     __u16 __spare0[1];
    + *     __u64 {@link #stx_ino};
    + *     __u64 {@link #stx_size};
    + *     __u64 {@link #stx_blocks};
    + *     __u64 {@link #stx_attributes_mask};
    + *     {@link StatxTimestamp struct statx_timestamp} {@link #stx_atime};
    + *     {@link StatxTimestamp struct statx_timestamp} {@link #stx_btime};
    + *     {@link StatxTimestamp struct statx_timestamp} {@link #stx_ctime};
    + *     {@link StatxTimestamp struct statx_timestamp} {@link #stx_mtime};
    + *     __u32 {@link #stx_rdev_major};
    + *     __u32 stx_rdev_minor;
    + *     __u32 {@link #stx_dev_major};
    + *     __u32 stx_dev_minor;
    + *     __u64 stx_mnt_id;
    + *     __u64 __spare2;
    + *     __u64 __spare3[12];
    + * }
    + */ +@NativeType("struct statx") +public class Statx extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + STX_MASK, + STX_BLKSIZE, + STX_ATTRIBUTES, + STX_NLINK, + STX_UID, + STX_GID, + STX_MODE, + __SPARE0, + STX_INO, + STX_SIZE, + STX_BLOCKS, + STX_ATTRIBUTES_MASK, + STX_ATIME, + STX_BTIME, + STX_CTIME, + STX_MTIME, + STX_RDEV_MAJOR, + STX_RDEV_MINOR, + STX_DEV_MAJOR, + STX_DEV_MINOR, + STX_MNT_ID, + __SPARE2, + __SPARE3; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(8), + __member(4), + __member(4), + __member(4), + __member(2), + __array(2, 1), + __member(8), + __member(8), + __member(8), + __member(8), + __member(StatxTimestamp.SIZEOF, StatxTimestamp.ALIGNOF), + __member(StatxTimestamp.SIZEOF, StatxTimestamp.ALIGNOF), + __member(StatxTimestamp.SIZEOF, StatxTimestamp.ALIGNOF), + __member(StatxTimestamp.SIZEOF, StatxTimestamp.ALIGNOF), + __member(4), + __member(4), + __member(4), + __member(4), + __member(8), + __member(8), + __array(8, 12) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + STX_MASK = layout.offsetof(0); + STX_BLKSIZE = layout.offsetof(1); + STX_ATTRIBUTES = layout.offsetof(2); + STX_NLINK = layout.offsetof(3); + STX_UID = layout.offsetof(4); + STX_GID = layout.offsetof(5); + STX_MODE = layout.offsetof(6); + __SPARE0 = layout.offsetof(7); + STX_INO = layout.offsetof(8); + STX_SIZE = layout.offsetof(9); + STX_BLOCKS = layout.offsetof(10); + STX_ATTRIBUTES_MASK = layout.offsetof(11); + STX_ATIME = layout.offsetof(12); + STX_BTIME = layout.offsetof(13); + STX_CTIME = layout.offsetof(14); + STX_MTIME = layout.offsetof(15); + STX_RDEV_MAJOR = layout.offsetof(16); + STX_RDEV_MINOR = layout.offsetof(17); + STX_DEV_MAJOR = layout.offsetof(18); + STX_DEV_MINOR = layout.offsetof(19); + STX_MNT_ID = layout.offsetof(20); + __SPARE2 = layout.offsetof(21); + __SPARE3 = layout.offsetof(22); + } + + protected Statx(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected Statx create(long address, @Nullable ByteBuffer container) { + return new Statx(address, container); + } + + /** + * Creates a {@code Statx} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public Statx(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** what results were written [uncond] */ + @NativeType("__u32") + public int stx_mask() { return nstx_mask(address()); } + /** preferred general I/O size [uncond] */ + @NativeType("__u32") + public int stx_blksize() { return nstx_blksize(address()); } + /** flags conveying information about the file [uncond] */ + @NativeType("__u64") + public long stx_attributes() { return nstx_attributes(address()); } + /** number of hard links */ + @NativeType("__u32") + public int stx_nlink() { return nstx_nlink(address()); } + /** user ID of owner */ + @NativeType("__u32") + public int stx_uid() { return nstx_uid(address()); } + /** group ID of owner */ + @NativeType("__u32") + public int stx_gid() { return nstx_gid(address()); } + /** file mode */ + @NativeType("__u16") + public short stx_mode() { return nstx_mode(address()); } + /** {@code inode} number */ + @NativeType("__u64") + public long stx_ino() { return nstx_ino(address()); } + /** file size */ + @NativeType("__u64") + public long stx_size() { return nstx_size(address()); } + /** number of 512-byte blocks allocated */ + @NativeType("__u64") + public long stx_blocks() { return nstx_blocks(address()); } + /** mask to show what's supported in {@code stx_attributes} */ + @NativeType("__u64") + public long stx_attributes_mask() { return nstx_attributes_mask(address()); } + /** last access time */ + @NativeType("struct statx_timestamp") + public StatxTimestamp stx_atime() { return nstx_atime(address()); } + /** file creation time */ + @NativeType("struct statx_timestamp") + public StatxTimestamp stx_btime() { return nstx_btime(address()); } + /** last attribute change time */ + @NativeType("struct statx_timestamp") + public StatxTimestamp stx_ctime() { return nstx_ctime(address()); } + /** last data modification time */ + @NativeType("struct statx_timestamp") + public StatxTimestamp stx_mtime() { return nstx_mtime(address()); } + /** device ID of special file [if bdev/cdev] */ + @NativeType("__u32") + public int stx_rdev_major() { return nstx_rdev_major(address()); } + /** @return the value of the {@code stx_rdev_minor} field. */ + @NativeType("__u32") + public int stx_rdev_minor() { return nstx_rdev_minor(address()); } + /** ID of device containing file [uncond] */ + @NativeType("__u32") + public int stx_dev_major() { return nstx_dev_major(address()); } + /** @return the value of the {@code stx_dev_minor} field. */ + @NativeType("__u32") + public int stx_dev_minor() { return nstx_dev_minor(address()); } + /** @return the value of the {@code stx_mnt_id} field. */ + @NativeType("__u64") + public long stx_mnt_id() { return nstx_mnt_id(address()); } + + /** Sets the specified value to the {@link #stx_mask} field. */ + public Statx stx_mask(@NativeType("__u32") int value) { nstx_mask(address(), value); return this; } + /** Sets the specified value to the {@link #stx_blksize} field. */ + public Statx stx_blksize(@NativeType("__u32") int value) { nstx_blksize(address(), value); return this; } + /** Sets the specified value to the {@link #stx_attributes} field. */ + public Statx stx_attributes(@NativeType("__u64") long value) { nstx_attributes(address(), value); return this; } + /** Sets the specified value to the {@link #stx_nlink} field. */ + public Statx stx_nlink(@NativeType("__u32") int value) { nstx_nlink(address(), value); return this; } + /** Sets the specified value to the {@link #stx_uid} field. */ + public Statx stx_uid(@NativeType("__u32") int value) { nstx_uid(address(), value); return this; } + /** Sets the specified value to the {@link #stx_gid} field. */ + public Statx stx_gid(@NativeType("__u32") int value) { nstx_gid(address(), value); return this; } + /** Sets the specified value to the {@link #stx_mode} field. */ + public Statx stx_mode(@NativeType("__u16") short value) { nstx_mode(address(), value); return this; } + /** Sets the specified value to the {@link #stx_ino} field. */ + public Statx stx_ino(@NativeType("__u64") long value) { nstx_ino(address(), value); return this; } + /** Sets the specified value to the {@link #stx_size} field. */ + public Statx stx_size(@NativeType("__u64") long value) { nstx_size(address(), value); return this; } + /** Sets the specified value to the {@link #stx_blocks} field. */ + public Statx stx_blocks(@NativeType("__u64") long value) { nstx_blocks(address(), value); return this; } + /** Sets the specified value to the {@link #stx_attributes_mask} field. */ + public Statx stx_attributes_mask(@NativeType("__u64") long value) { nstx_attributes_mask(address(), value); return this; } + /** Copies the specified {@link StatxTimestamp} to the {@link #stx_atime} field. */ + public Statx stx_atime(@NativeType("struct statx_timestamp") StatxTimestamp value) { nstx_atime(address(), value); return this; } + /** Passes the {@link #stx_atime} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Statx stx_atime(java.util.function.Consumer consumer) { consumer.accept(stx_atime()); return this; } + /** Copies the specified {@link StatxTimestamp} to the {@link #stx_btime} field. */ + public Statx stx_btime(@NativeType("struct statx_timestamp") StatxTimestamp value) { nstx_btime(address(), value); return this; } + /** Passes the {@link #stx_btime} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Statx stx_btime(java.util.function.Consumer consumer) { consumer.accept(stx_btime()); return this; } + /** Copies the specified {@link StatxTimestamp} to the {@link #stx_ctime} field. */ + public Statx stx_ctime(@NativeType("struct statx_timestamp") StatxTimestamp value) { nstx_ctime(address(), value); return this; } + /** Passes the {@link #stx_ctime} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Statx stx_ctime(java.util.function.Consumer consumer) { consumer.accept(stx_ctime()); return this; } + /** Copies the specified {@link StatxTimestamp} to the {@link #stx_mtime} field. */ + public Statx stx_mtime(@NativeType("struct statx_timestamp") StatxTimestamp value) { nstx_mtime(address(), value); return this; } + /** Passes the {@link #stx_mtime} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Statx stx_mtime(java.util.function.Consumer consumer) { consumer.accept(stx_mtime()); return this; } + /** Sets the specified value to the {@link #stx_rdev_major} field. */ + public Statx stx_rdev_major(@NativeType("__u32") int value) { nstx_rdev_major(address(), value); return this; } + /** Sets the specified value to the {@code stx_rdev_minor} field. */ + public Statx stx_rdev_minor(@NativeType("__u32") int value) { nstx_rdev_minor(address(), value); return this; } + /** Sets the specified value to the {@link #stx_dev_major} field. */ + public Statx stx_dev_major(@NativeType("__u32") int value) { nstx_dev_major(address(), value); return this; } + /** Sets the specified value to the {@code stx_dev_minor} field. */ + public Statx stx_dev_minor(@NativeType("__u32") int value) { nstx_dev_minor(address(), value); return this; } + /** Sets the specified value to the {@code stx_mnt_id} field. */ + public Statx stx_mnt_id(@NativeType("__u64") long value) { nstx_mnt_id(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public Statx set( + int stx_mask, + int stx_blksize, + long stx_attributes, + int stx_nlink, + int stx_uid, + int stx_gid, + short stx_mode, + long stx_ino, + long stx_size, + long stx_blocks, + long stx_attributes_mask, + StatxTimestamp stx_atime, + StatxTimestamp stx_btime, + StatxTimestamp stx_ctime, + StatxTimestamp stx_mtime, + int stx_rdev_major, + int stx_rdev_minor, + int stx_dev_major, + int stx_dev_minor, + long stx_mnt_id + ) { + stx_mask(stx_mask); + stx_blksize(stx_blksize); + stx_attributes(stx_attributes); + stx_nlink(stx_nlink); + stx_uid(stx_uid); + stx_gid(stx_gid); + stx_mode(stx_mode); + stx_ino(stx_ino); + stx_size(stx_size); + stx_blocks(stx_blocks); + stx_attributes_mask(stx_attributes_mask); + stx_atime(stx_atime); + stx_btime(stx_btime); + stx_ctime(stx_ctime); + stx_mtime(stx_mtime); + stx_rdev_major(stx_rdev_major); + stx_rdev_minor(stx_rdev_minor); + stx_dev_major(stx_dev_major); + stx_dev_minor(stx_dev_minor); + stx_mnt_id(stx_mnt_id); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public Statx set(Statx src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code Statx} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static Statx malloc() { + return new Statx(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code Statx} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static Statx calloc() { + return new Statx(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code Statx} instance allocated with {@link BufferUtils}. */ + public static Statx create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new Statx(memAddress(container), container); + } + + /** Returns a new {@code Statx} instance for the specified memory address. */ + public static Statx create(long address) { + return new Statx(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Statx createSafe(long address) { + return address == NULL ? null : new Statx(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code Statx} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static Statx malloc(MemoryStack stack) { + return new Statx(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code Statx} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static Statx calloc(MemoryStack stack) { + return new Statx(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #stx_mask}. */ + public static int nstx_mask(long struct) { return UNSAFE.getInt(null, struct + Statx.STX_MASK); } + /** Unsafe version of {@link #stx_blksize}. */ + public static int nstx_blksize(long struct) { return UNSAFE.getInt(null, struct + Statx.STX_BLKSIZE); } + /** Unsafe version of {@link #stx_attributes}. */ + public static long nstx_attributes(long struct) { return UNSAFE.getLong(null, struct + Statx.STX_ATTRIBUTES); } + /** Unsafe version of {@link #stx_nlink}. */ + public static int nstx_nlink(long struct) { return UNSAFE.getInt(null, struct + Statx.STX_NLINK); } + /** Unsafe version of {@link #stx_uid}. */ + public static int nstx_uid(long struct) { return UNSAFE.getInt(null, struct + Statx.STX_UID); } + /** Unsafe version of {@link #stx_gid}. */ + public static int nstx_gid(long struct) { return UNSAFE.getInt(null, struct + Statx.STX_GID); } + /** Unsafe version of {@link #stx_mode}. */ + public static short nstx_mode(long struct) { return UNSAFE.getShort(null, struct + Statx.STX_MODE); } + public static ShortBuffer n__spare0(long struct) { return memShortBuffer(struct + Statx.__SPARE0, 1); } + public static short n__spare0(long struct, int index) { + return UNSAFE.getShort(null, struct + Statx.__SPARE0 + check(index, 1) * 2); + } + /** Unsafe version of {@link #stx_ino}. */ + public static long nstx_ino(long struct) { return UNSAFE.getLong(null, struct + Statx.STX_INO); } + /** Unsafe version of {@link #stx_size}. */ + public static long nstx_size(long struct) { return UNSAFE.getLong(null, struct + Statx.STX_SIZE); } + /** Unsafe version of {@link #stx_blocks}. */ + public static long nstx_blocks(long struct) { return UNSAFE.getLong(null, struct + Statx.STX_BLOCKS); } + /** Unsafe version of {@link #stx_attributes_mask}. */ + public static long nstx_attributes_mask(long struct) { return UNSAFE.getLong(null, struct + Statx.STX_ATTRIBUTES_MASK); } + /** Unsafe version of {@link #stx_atime}. */ + public static StatxTimestamp nstx_atime(long struct) { return StatxTimestamp.create(struct + Statx.STX_ATIME); } + /** Unsafe version of {@link #stx_btime}. */ + public static StatxTimestamp nstx_btime(long struct) { return StatxTimestamp.create(struct + Statx.STX_BTIME); } + /** Unsafe version of {@link #stx_ctime}. */ + public static StatxTimestamp nstx_ctime(long struct) { return StatxTimestamp.create(struct + Statx.STX_CTIME); } + /** Unsafe version of {@link #stx_mtime}. */ + public static StatxTimestamp nstx_mtime(long struct) { return StatxTimestamp.create(struct + Statx.STX_MTIME); } + /** Unsafe version of {@link #stx_rdev_major}. */ + public static int nstx_rdev_major(long struct) { return UNSAFE.getInt(null, struct + Statx.STX_RDEV_MAJOR); } + /** Unsafe version of {@link #stx_rdev_minor}. */ + public static int nstx_rdev_minor(long struct) { return UNSAFE.getInt(null, struct + Statx.STX_RDEV_MINOR); } + /** Unsafe version of {@link #stx_dev_major}. */ + public static int nstx_dev_major(long struct) { return UNSAFE.getInt(null, struct + Statx.STX_DEV_MAJOR); } + /** Unsafe version of {@link #stx_dev_minor}. */ + public static int nstx_dev_minor(long struct) { return UNSAFE.getInt(null, struct + Statx.STX_DEV_MINOR); } + /** Unsafe version of {@link #stx_mnt_id}. */ + public static long nstx_mnt_id(long struct) { return UNSAFE.getLong(null, struct + Statx.STX_MNT_ID); } + public static long n__spare2(long struct) { return UNSAFE.getLong(null, struct + Statx.__SPARE2); } + public static LongBuffer n__spare3(long struct) { return memLongBuffer(struct + Statx.__SPARE3, 12); } + public static long n__spare3(long struct, int index) { + return UNSAFE.getLong(null, struct + Statx.__SPARE3 + check(index, 12) * 8); + } + + /** Unsafe version of {@link #stx_mask(int) stx_mask}. */ + public static void nstx_mask(long struct, int value) { UNSAFE.putInt(null, struct + Statx.STX_MASK, value); } + /** Unsafe version of {@link #stx_blksize(int) stx_blksize}. */ + public static void nstx_blksize(long struct, int value) { UNSAFE.putInt(null, struct + Statx.STX_BLKSIZE, value); } + /** Unsafe version of {@link #stx_attributes(long) stx_attributes}. */ + public static void nstx_attributes(long struct, long value) { UNSAFE.putLong(null, struct + Statx.STX_ATTRIBUTES, value); } + /** Unsafe version of {@link #stx_nlink(int) stx_nlink}. */ + public static void nstx_nlink(long struct, int value) { UNSAFE.putInt(null, struct + Statx.STX_NLINK, value); } + /** Unsafe version of {@link #stx_uid(int) stx_uid}. */ + public static void nstx_uid(long struct, int value) { UNSAFE.putInt(null, struct + Statx.STX_UID, value); } + /** Unsafe version of {@link #stx_gid(int) stx_gid}. */ + public static void nstx_gid(long struct, int value) { UNSAFE.putInt(null, struct + Statx.STX_GID, value); } + /** Unsafe version of {@link #stx_mode(short) stx_mode}. */ + public static void nstx_mode(long struct, short value) { UNSAFE.putShort(null, struct + Statx.STX_MODE, value); } + public static void n__spare0(long struct, ShortBuffer value) { + if (CHECKS) { checkGT(value, 1); } + memCopy(memAddress(value), struct + Statx.__SPARE0, value.remaining() * 2); + } + public static void n__spare0(long struct, int index, short value) { + UNSAFE.putShort(null, struct + Statx.__SPARE0 + check(index, 1) * 2, value); + } + /** Unsafe version of {@link #stx_ino(long) stx_ino}. */ + public static void nstx_ino(long struct, long value) { UNSAFE.putLong(null, struct + Statx.STX_INO, value); } + /** Unsafe version of {@link #stx_size(long) stx_size}. */ + public static void nstx_size(long struct, long value) { UNSAFE.putLong(null, struct + Statx.STX_SIZE, value); } + /** Unsafe version of {@link #stx_blocks(long) stx_blocks}. */ + public static void nstx_blocks(long struct, long value) { UNSAFE.putLong(null, struct + Statx.STX_BLOCKS, value); } + /** Unsafe version of {@link #stx_attributes_mask(long) stx_attributes_mask}. */ + public static void nstx_attributes_mask(long struct, long value) { UNSAFE.putLong(null, struct + Statx.STX_ATTRIBUTES_MASK, value); } + /** Unsafe version of {@link #stx_atime(StatxTimestamp) stx_atime}. */ + public static void nstx_atime(long struct, StatxTimestamp value) { memCopy(value.address(), struct + Statx.STX_ATIME, StatxTimestamp.SIZEOF); } + /** Unsafe version of {@link #stx_btime(StatxTimestamp) stx_btime}. */ + public static void nstx_btime(long struct, StatxTimestamp value) { memCopy(value.address(), struct + Statx.STX_BTIME, StatxTimestamp.SIZEOF); } + /** Unsafe version of {@link #stx_ctime(StatxTimestamp) stx_ctime}. */ + public static void nstx_ctime(long struct, StatxTimestamp value) { memCopy(value.address(), struct + Statx.STX_CTIME, StatxTimestamp.SIZEOF); } + /** Unsafe version of {@link #stx_mtime(StatxTimestamp) stx_mtime}. */ + public static void nstx_mtime(long struct, StatxTimestamp value) { memCopy(value.address(), struct + Statx.STX_MTIME, StatxTimestamp.SIZEOF); } + /** Unsafe version of {@link #stx_rdev_major(int) stx_rdev_major}. */ + public static void nstx_rdev_major(long struct, int value) { UNSAFE.putInt(null, struct + Statx.STX_RDEV_MAJOR, value); } + /** Unsafe version of {@link #stx_rdev_minor(int) stx_rdev_minor}. */ + public static void nstx_rdev_minor(long struct, int value) { UNSAFE.putInt(null, struct + Statx.STX_RDEV_MINOR, value); } + /** Unsafe version of {@link #stx_dev_major(int) stx_dev_major}. */ + public static void nstx_dev_major(long struct, int value) { UNSAFE.putInt(null, struct + Statx.STX_DEV_MAJOR, value); } + /** Unsafe version of {@link #stx_dev_minor(int) stx_dev_minor}. */ + public static void nstx_dev_minor(long struct, int value) { UNSAFE.putInt(null, struct + Statx.STX_DEV_MINOR, value); } + /** Unsafe version of {@link #stx_mnt_id(long) stx_mnt_id}. */ + public static void nstx_mnt_id(long struct, long value) { UNSAFE.putLong(null, struct + Statx.STX_MNT_ID, value); } + public static void n__spare2(long struct, long value) { UNSAFE.putLong(null, struct + Statx.__SPARE2, value); } + public static void n__spare3(long struct, LongBuffer value) { + if (CHECKS) { checkGT(value, 12); } + memCopy(memAddress(value), struct + Statx.__SPARE3, value.remaining() * 8); + } + public static void n__spare3(long struct, int index, long value) { + UNSAFE.putLong(null, struct + Statx.__SPARE3 + check(index, 12) * 8, value); + } + + // ----------------------------------- + + /** An array of {@link Statx} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final Statx ELEMENT_FACTORY = Statx.create(-1L); + + /** + * Creates a new {@code Statx.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link Statx#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected Statx getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link Statx#stx_mask} field. */ + @NativeType("__u32") + public int stx_mask() { return Statx.nstx_mask(address()); } + /** @return the value of the {@link Statx#stx_blksize} field. */ + @NativeType("__u32") + public int stx_blksize() { return Statx.nstx_blksize(address()); } + /** @return the value of the {@link Statx#stx_attributes} field. */ + @NativeType("__u64") + public long stx_attributes() { return Statx.nstx_attributes(address()); } + /** @return the value of the {@link Statx#stx_nlink} field. */ + @NativeType("__u32") + public int stx_nlink() { return Statx.nstx_nlink(address()); } + /** @return the value of the {@link Statx#stx_uid} field. */ + @NativeType("__u32") + public int stx_uid() { return Statx.nstx_uid(address()); } + /** @return the value of the {@link Statx#stx_gid} field. */ + @NativeType("__u32") + public int stx_gid() { return Statx.nstx_gid(address()); } + /** @return the value of the {@link Statx#stx_mode} field. */ + @NativeType("__u16") + public short stx_mode() { return Statx.nstx_mode(address()); } + /** @return the value of the {@link Statx#stx_ino} field. */ + @NativeType("__u64") + public long stx_ino() { return Statx.nstx_ino(address()); } + /** @return the value of the {@link Statx#stx_size} field. */ + @NativeType("__u64") + public long stx_size() { return Statx.nstx_size(address()); } + /** @return the value of the {@link Statx#stx_blocks} field. */ + @NativeType("__u64") + public long stx_blocks() { return Statx.nstx_blocks(address()); } + /** @return the value of the {@link Statx#stx_attributes_mask} field. */ + @NativeType("__u64") + public long stx_attributes_mask() { return Statx.nstx_attributes_mask(address()); } + /** @return a {@link StatxTimestamp} view of the {@link Statx#stx_atime} field. */ + @NativeType("struct statx_timestamp") + public StatxTimestamp stx_atime() { return Statx.nstx_atime(address()); } + /** @return a {@link StatxTimestamp} view of the {@link Statx#stx_btime} field. */ + @NativeType("struct statx_timestamp") + public StatxTimestamp stx_btime() { return Statx.nstx_btime(address()); } + /** @return a {@link StatxTimestamp} view of the {@link Statx#stx_ctime} field. */ + @NativeType("struct statx_timestamp") + public StatxTimestamp stx_ctime() { return Statx.nstx_ctime(address()); } + /** @return a {@link StatxTimestamp} view of the {@link Statx#stx_mtime} field. */ + @NativeType("struct statx_timestamp") + public StatxTimestamp stx_mtime() { return Statx.nstx_mtime(address()); } + /** @return the value of the {@link Statx#stx_rdev_major} field. */ + @NativeType("__u32") + public int stx_rdev_major() { return Statx.nstx_rdev_major(address()); } + /** @return the value of the {@code stx_rdev_minor} field. */ + @NativeType("__u32") + public int stx_rdev_minor() { return Statx.nstx_rdev_minor(address()); } + /** @return the value of the {@link Statx#stx_dev_major} field. */ + @NativeType("__u32") + public int stx_dev_major() { return Statx.nstx_dev_major(address()); } + /** @return the value of the {@code stx_dev_minor} field. */ + @NativeType("__u32") + public int stx_dev_minor() { return Statx.nstx_dev_minor(address()); } + /** @return the value of the {@code stx_mnt_id} field. */ + @NativeType("__u64") + public long stx_mnt_id() { return Statx.nstx_mnt_id(address()); } + + /** Sets the specified value to the {@link Statx#stx_mask} field. */ + public Buffer stx_mask(@NativeType("__u32") int value) { Statx.nstx_mask(address(), value); return this; } + /** Sets the specified value to the {@link Statx#stx_blksize} field. */ + public Buffer stx_blksize(@NativeType("__u32") int value) { Statx.nstx_blksize(address(), value); return this; } + /** Sets the specified value to the {@link Statx#stx_attributes} field. */ + public Buffer stx_attributes(@NativeType("__u64") long value) { Statx.nstx_attributes(address(), value); return this; } + /** Sets the specified value to the {@link Statx#stx_nlink} field. */ + public Buffer stx_nlink(@NativeType("__u32") int value) { Statx.nstx_nlink(address(), value); return this; } + /** Sets the specified value to the {@link Statx#stx_uid} field. */ + public Buffer stx_uid(@NativeType("__u32") int value) { Statx.nstx_uid(address(), value); return this; } + /** Sets the specified value to the {@link Statx#stx_gid} field. */ + public Buffer stx_gid(@NativeType("__u32") int value) { Statx.nstx_gid(address(), value); return this; } + /** Sets the specified value to the {@link Statx#stx_mode} field. */ + public Buffer stx_mode(@NativeType("__u16") short value) { Statx.nstx_mode(address(), value); return this; } + /** Sets the specified value to the {@link Statx#stx_ino} field. */ + public Buffer stx_ino(@NativeType("__u64") long value) { Statx.nstx_ino(address(), value); return this; } + /** Sets the specified value to the {@link Statx#stx_size} field. */ + public Buffer stx_size(@NativeType("__u64") long value) { Statx.nstx_size(address(), value); return this; } + /** Sets the specified value to the {@link Statx#stx_blocks} field. */ + public Buffer stx_blocks(@NativeType("__u64") long value) { Statx.nstx_blocks(address(), value); return this; } + /** Sets the specified value to the {@link Statx#stx_attributes_mask} field. */ + public Buffer stx_attributes_mask(@NativeType("__u64") long value) { Statx.nstx_attributes_mask(address(), value); return this; } + /** Copies the specified {@link StatxTimestamp} to the {@link Statx#stx_atime} field. */ + public Buffer stx_atime(@NativeType("struct statx_timestamp") StatxTimestamp value) { Statx.nstx_atime(address(), value); return this; } + /** Passes the {@link Statx#stx_atime} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer stx_atime(java.util.function.Consumer consumer) { consumer.accept(stx_atime()); return this; } + /** Copies the specified {@link StatxTimestamp} to the {@link Statx#stx_btime} field. */ + public Buffer stx_btime(@NativeType("struct statx_timestamp") StatxTimestamp value) { Statx.nstx_btime(address(), value); return this; } + /** Passes the {@link Statx#stx_btime} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer stx_btime(java.util.function.Consumer consumer) { consumer.accept(stx_btime()); return this; } + /** Copies the specified {@link StatxTimestamp} to the {@link Statx#stx_ctime} field. */ + public Buffer stx_ctime(@NativeType("struct statx_timestamp") StatxTimestamp value) { Statx.nstx_ctime(address(), value); return this; } + /** Passes the {@link Statx#stx_ctime} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer stx_ctime(java.util.function.Consumer consumer) { consumer.accept(stx_ctime()); return this; } + /** Copies the specified {@link StatxTimestamp} to the {@link Statx#stx_mtime} field. */ + public Buffer stx_mtime(@NativeType("struct statx_timestamp") StatxTimestamp value) { Statx.nstx_mtime(address(), value); return this; } + /** Passes the {@link Statx#stx_mtime} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer stx_mtime(java.util.function.Consumer consumer) { consumer.accept(stx_mtime()); return this; } + /** Sets the specified value to the {@link Statx#stx_rdev_major} field. */ + public Buffer stx_rdev_major(@NativeType("__u32") int value) { Statx.nstx_rdev_major(address(), value); return this; } + /** Sets the specified value to the {@code stx_rdev_minor} field. */ + public Buffer stx_rdev_minor(@NativeType("__u32") int value) { Statx.nstx_rdev_minor(address(), value); return this; } + /** Sets the specified value to the {@link Statx#stx_dev_major} field. */ + public Buffer stx_dev_major(@NativeType("__u32") int value) { Statx.nstx_dev_major(address(), value); return this; } + /** Sets the specified value to the {@code stx_dev_minor} field. */ + public Buffer stx_dev_minor(@NativeType("__u32") int value) { Statx.nstx_dev_minor(address(), value); return this; } + /** Sets the specified value to the {@code stx_mnt_id} field. */ + public Buffer stx_mnt_id(@NativeType("__u64") long value) { Statx.nstx_mnt_id(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/StatxTimestamp.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/StatxTimestamp.java new file mode 100644 index 000000000..8fdb4810c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/StatxTimestamp.java @@ -0,0 +1,294 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Timestamp structure for the timestamps in {@code struct statx}. + * + *

    Layout

    + * + *
    
    + * struct statx_timestamp {
    + *     __s64 {@link #tv_sec};
    + *     __u32 {@link #tv_nsec};
    + *     __s32 __reserved;
    + * }
    + */ +@NativeType("struct statx_timestamp") +public class StatxTimestamp extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TV_SEC, + TV_NSEC, + __RESERVED; + + static { + Layout layout = __struct( + __member(8), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TV_SEC = layout.offsetof(0); + TV_NSEC = layout.offsetof(1); + __RESERVED = layout.offsetof(2); + } + + protected StatxTimestamp(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected StatxTimestamp create(long address, @Nullable ByteBuffer container) { + return new StatxTimestamp(address, container); + } + + /** + * Creates a {@code StatxTimestamp} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public StatxTimestamp(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the number of seconds before (negative) or after (positive) {@code 00:00:00 1st January 1970 UTC} */ + @NativeType("__s64") + public long tv_sec() { return ntv_sec(address()); } + /** a number of nanoseconds (0..999,999,999) after the {@code tv_sec} time */ + @NativeType("__u32") + public int tv_nsec() { return ntv_nsec(address()); } + + /** Sets the specified value to the {@link #tv_sec} field. */ + public StatxTimestamp tv_sec(@NativeType("__s64") long value) { ntv_sec(address(), value); return this; } + /** Sets the specified value to the {@link #tv_nsec} field. */ + public StatxTimestamp tv_nsec(@NativeType("__u32") int value) { ntv_nsec(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public StatxTimestamp set( + long tv_sec, + int tv_nsec + ) { + tv_sec(tv_sec); + tv_nsec(tv_nsec); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public StatxTimestamp set(StatxTimestamp src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code StatxTimestamp} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static StatxTimestamp malloc() { + return new StatxTimestamp(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code StatxTimestamp} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static StatxTimestamp calloc() { + return new StatxTimestamp(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code StatxTimestamp} instance allocated with {@link BufferUtils}. */ + public static StatxTimestamp create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new StatxTimestamp(memAddress(container), container); + } + + /** Returns a new {@code StatxTimestamp} instance for the specified memory address. */ + public static StatxTimestamp create(long address) { + return new StatxTimestamp(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static StatxTimestamp createSafe(long address) { + return address == NULL ? null : new StatxTimestamp(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code StatxTimestamp} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static StatxTimestamp malloc(MemoryStack stack) { + return new StatxTimestamp(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code StatxTimestamp} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static StatxTimestamp calloc(MemoryStack stack) { + return new StatxTimestamp(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #tv_sec}. */ + public static long ntv_sec(long struct) { return UNSAFE.getLong(null, struct + StatxTimestamp.TV_SEC); } + /** Unsafe version of {@link #tv_nsec}. */ + public static int ntv_nsec(long struct) { return UNSAFE.getInt(null, struct + StatxTimestamp.TV_NSEC); } + public static int n__reserved(long struct) { return UNSAFE.getInt(null, struct + StatxTimestamp.__RESERVED); } + + /** Unsafe version of {@link #tv_sec(long) tv_sec}. */ + public static void ntv_sec(long struct, long value) { UNSAFE.putLong(null, struct + StatxTimestamp.TV_SEC, value); } + /** Unsafe version of {@link #tv_nsec(int) tv_nsec}. */ + public static void ntv_nsec(long struct, int value) { UNSAFE.putInt(null, struct + StatxTimestamp.TV_NSEC, value); } + public static void n__reserved(long struct, int value) { UNSAFE.putInt(null, struct + StatxTimestamp.__RESERVED, value); } + + // ----------------------------------- + + /** An array of {@link StatxTimestamp} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final StatxTimestamp ELEMENT_FACTORY = StatxTimestamp.create(-1L); + + /** + * Creates a new {@code StatxTimestamp.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link StatxTimestamp#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected StatxTimestamp getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link StatxTimestamp#tv_sec} field. */ + @NativeType("__s64") + public long tv_sec() { return StatxTimestamp.ntv_sec(address()); } + /** @return the value of the {@link StatxTimestamp#tv_nsec} field. */ + @NativeType("__u32") + public int tv_nsec() { return StatxTimestamp.ntv_nsec(address()); } + + /** Sets the specified value to the {@link StatxTimestamp#tv_sec} field. */ + public Buffer tv_sec(@NativeType("__s64") long value) { StatxTimestamp.ntv_sec(address(), value); return this; } + /** Sets the specified value to the {@link StatxTimestamp#tv_nsec} field. */ + public Buffer tv_nsec(@NativeType("__u32") int value) { StatxTimestamp.ntv_nsec(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/UIO.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/UIO.java new file mode 100644 index 000000000..5154ba51d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/UIO.java @@ -0,0 +1,101 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import org.lwjgl.system.*; + +/** Native bindings to <sys/uio.h>. */ +public class UIO { + + static { Library.initialize(); } + + public static final int UIO_FASTIOV = 8; + + public static final int UIO_MAXIOV = 1024; + + /** + * Flags for {@code preadv2}/{@code pwritev2}. + * + *
    Enum values:
    + * + *
      + *
    • {@link #RWF_HIPRI RWF_HIPRI} - High priority request.
    • + *
    • {@link #RWF_DSYNC RWF_DSYNC} - per-IO {@link FCNTL#O_DSYNC}
    • + *
    • {@link #RWF_SYNC RWF_SYNC} - per-IO {@link FCNTL#O_SYNC}
    • + *
    • {@link #RWF_NOWAIT RWF_NOWAIT} - per-IO nonblocking mode
    • + *
    • {@link #RWF_APPEND RWF_APPEND} - per-IO {@link FCNTL#O_APPEND}
    • + *
    + */ + public static final int + RWF_HIPRI = 0x1, + RWF_DSYNC = 0x2, + RWF_SYNC = 0x4, + RWF_NOWAIT = 0x8, + RWF_APPEND = 0x10; + + protected UIO() { + throw new UnsupportedOperationException(); + } + + // --- [ readv ] --- + + public static native long nreadv(int __fd, long __iovec, int __count); + + @NativeType("ssize_t") + public static long readv(int __fd, @NativeType("struct iovec const *") IOVec __iovec, int __count) { + return nreadv(__fd, __iovec.address(), __count); + } + + // --- [ writev ] --- + + public static native long nwritev(int __fd, long __iovec, int __count); + + @NativeType("ssize_t") + public static long writev(int __fd, @NativeType("struct iovec const *") IOVec __iovec, int __count) { + return nwritev(__fd, __iovec.address(), __count); + } + + // --- [ preadv ] --- + + public static native long npreadv(int __fd, long __iovec, int __count, long __offset); + + @NativeType("ssize_t") + public static long preadv(int __fd, @NativeType("struct iovec const *") IOVec __iovec, int __count, @NativeType("off_t") long __offset) { + return npreadv(__fd, __iovec.address(), __count, __offset); + } + + // --- [ pwritev ] --- + + public static native long npwritev(int __fd, long __iovec, int __count, long __offset); + + @NativeType("ssize_t") + public static long pwritev(int __fd, @NativeType("struct iovec const *") IOVec __iovec, int __count, @NativeType("off_t") long __offset) { + return npwritev(__fd, __iovec.address(), __count, __offset); + } + + // --- [ process_vm_readv ] --- + + /** Unsafe version of: {@link #process_vm_readv} */ + public static native long nprocess_vm_readv(int __pid, long __lvec, long __liovcnt, long __rvec, long __riovcnt, long __flags); + + /** Read from another process' address space. */ + @NativeType("ssize_t") + public static long process_vm_readv(@NativeType("pid_t") int __pid, @NativeType("struct iovec const *") IOVec __lvec, @NativeType("unsigned long int") long __liovcnt, @NativeType("struct iovec const *") IOVec __rvec, @NativeType("unsigned long int") long __riovcnt, @NativeType("unsigned long int") long __flags) { + return nprocess_vm_readv(__pid, __lvec.address(), __liovcnt, __rvec.address(), __riovcnt, __flags); + } + + // --- [ process_vm_writev ] --- + + /** Unsafe version of: {@link #process_vm_writev} */ + public static native long nprocess_vm_writev(int __pid, long __lvec, long __liovcnt, long __rvec, long __riovcnt, long __flags); + + /** Write to another process' address space. */ + @NativeType("ssize_t") + public static long process_vm_writev(@NativeType("pid_t") int __pid, @NativeType("struct iovec const *") IOVec __lvec, @NativeType("unsigned long int") long __liovcnt, @NativeType("struct iovec const *") IOVec __rvec, @NativeType("unsigned long int") long __riovcnt, @NativeType("unsigned long int") long __flags) { + return nprocess_vm_writev(__pid, __lvec.address(), __liovcnt, __rvec.address(), __riovcnt, __flags); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/UNISTD.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/UNISTD.java new file mode 100644 index 000000000..26e81dd12 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/UNISTD.java @@ -0,0 +1,71 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to <unistd.h>. */ +public class UNISTD { + + static { Library.initialize(); } + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #_SC_OPEN_MAX _SC_OPEN_MAX}
    • + *
    • {@link #_SC_PAGE_SIZE _SC_PAGE_SIZE}
    • + *
    • {@link #_SC_IOV_MAX _SC_IOV_MAX}
    • + *
    + */ + public static final int + _SC_OPEN_MAX = 4, + _SC_PAGE_SIZE = 30, + _SC_IOV_MAX = 60; + + protected UNISTD() { + throw new UnsupportedOperationException(); + } + + // --- [ close ] --- + + /** */ + public static native int close(int fd); + + // --- [ sysconf ] --- + + /** */ + public static native long sysconf(int name); + + // --- [ read ] --- + + public static native long nread(int fd, long buf, long count); + + @NativeType("ssize_t") + public static long read(int fd, @NativeType("void *") ByteBuffer buf) { + return nread(fd, memAddress(buf), buf.remaining()); + } + + // --- [ getpid ] --- + + @NativeType("pid_t") + public static native int getpid(); + + // --- [ getppid ] --- + + @NativeType("pid_t") + public static native int getppid(); + + // --- [ gettid ] --- + + @NativeType("pid_t") + public static native int gettid(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Visual.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Visual.java new file mode 100644 index 000000000..6bb11d352 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/Visual.java @@ -0,0 +1,420 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Visual structure; contains information about colormapping possible. + * + *

    Layout

    + * + *
    
    + * struct Visual {
    + *     void * ext_data;
    + *     VisualID visualid;
    + *     int class;
    + *     unsigned long red_mask;
    + *     unsigned long green_mask;
    + *     unsigned long blue_mask;
    + *     int bits_per_rgb;
    + *     int map_entries;
    + * }
    + */ +public class Visual extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + EXT_DATA, + VISUALID, + CLASS, + RED_MASK, + GREEN_MASK, + BLUE_MASK, + BITS_PER_RGB, + MAP_ENTRIES; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + EXT_DATA = layout.offsetof(0); + VISUALID = layout.offsetof(1); + CLASS = layout.offsetof(2); + RED_MASK = layout.offsetof(3); + GREEN_MASK = layout.offsetof(4); + BLUE_MASK = layout.offsetof(5); + BITS_PER_RGB = layout.offsetof(6); + MAP_ENTRIES = layout.offsetof(7); + } + + protected Visual(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected Visual create(long address, @Nullable ByteBuffer container) { + return new Visual(address, container); + } + + /** + * Creates a {@code Visual} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public Visual(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code ext_data} field. */ + @NativeType("void *") + public long ext_data() { return next_data(address()); } + /** @return the value of the {@code visualid} field. */ + @NativeType("VisualID") + public long visualid() { return nvisualid(address()); } + /** @return the value of the {@code class} field. */ + public int class$() { return nclass$(address()); } + /** @return the value of the {@code red_mask} field. */ + @NativeType("unsigned long") + public long red_mask() { return nred_mask(address()); } + /** @return the value of the {@code green_mask} field. */ + @NativeType("unsigned long") + public long green_mask() { return ngreen_mask(address()); } + /** @return the value of the {@code blue_mask} field. */ + @NativeType("unsigned long") + public long blue_mask() { return nblue_mask(address()); } + /** @return the value of the {@code bits_per_rgb} field. */ + public int bits_per_rgb() { return nbits_per_rgb(address()); } + /** @return the value of the {@code map_entries} field. */ + public int map_entries() { return nmap_entries(address()); } + + /** Sets the specified value to the {@code ext_data} field. */ + public Visual ext_data(@NativeType("void *") long value) { next_data(address(), value); return this; } + /** Sets the specified value to the {@code visualid} field. */ + public Visual visualid(@NativeType("VisualID") long value) { nvisualid(address(), value); return this; } + /** Sets the specified value to the {@code class} field. */ + public Visual class$(int value) { nclass$(address(), value); return this; } + /** Sets the specified value to the {@code red_mask} field. */ + public Visual red_mask(@NativeType("unsigned long") long value) { nred_mask(address(), value); return this; } + /** Sets the specified value to the {@code green_mask} field. */ + public Visual green_mask(@NativeType("unsigned long") long value) { ngreen_mask(address(), value); return this; } + /** Sets the specified value to the {@code blue_mask} field. */ + public Visual blue_mask(@NativeType("unsigned long") long value) { nblue_mask(address(), value); return this; } + /** Sets the specified value to the {@code bits_per_rgb} field. */ + public Visual bits_per_rgb(int value) { nbits_per_rgb(address(), value); return this; } + /** Sets the specified value to the {@code map_entries} field. */ + public Visual map_entries(int value) { nmap_entries(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public Visual set( + long ext_data, + long visualid, + int class$, + long red_mask, + long green_mask, + long blue_mask, + int bits_per_rgb, + int map_entries + ) { + ext_data(ext_data); + visualid(visualid); + class$(class$); + red_mask(red_mask); + green_mask(green_mask); + blue_mask(blue_mask); + bits_per_rgb(bits_per_rgb); + map_entries(map_entries); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public Visual set(Visual src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code Visual} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static Visual malloc() { + return new Visual(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code Visual} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static Visual calloc() { + return new Visual(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code Visual} instance allocated with {@link BufferUtils}. */ + public static Visual create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new Visual(memAddress(container), container); + } + + /** Returns a new {@code Visual} instance for the specified memory address. */ + public static Visual create(long address) { + return new Visual(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Visual createSafe(long address) { + return address == NULL ? null : new Visual(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static Visual mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static Visual callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static Visual mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static Visual callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code Visual} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static Visual malloc(MemoryStack stack) { + return new Visual(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code Visual} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static Visual calloc(MemoryStack stack) { + return new Visual(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #ext_data}. */ + public static long next_data(long struct) { return memGetAddress(struct + Visual.EXT_DATA); } + /** Unsafe version of {@link #visualid}. */ + public static long nvisualid(long struct) { return memGetCLong(struct + Visual.VISUALID); } + /** Unsafe version of {@link #class$}. */ + public static int nclass$(long struct) { return UNSAFE.getInt(null, struct + Visual.CLASS); } + /** Unsafe version of {@link #red_mask}. */ + public static long nred_mask(long struct) { return memGetCLong(struct + Visual.RED_MASK); } + /** Unsafe version of {@link #green_mask}. */ + public static long ngreen_mask(long struct) { return memGetCLong(struct + Visual.GREEN_MASK); } + /** Unsafe version of {@link #blue_mask}. */ + public static long nblue_mask(long struct) { return memGetCLong(struct + Visual.BLUE_MASK); } + /** Unsafe version of {@link #bits_per_rgb}. */ + public static int nbits_per_rgb(long struct) { return UNSAFE.getInt(null, struct + Visual.BITS_PER_RGB); } + /** Unsafe version of {@link #map_entries}. */ + public static int nmap_entries(long struct) { return UNSAFE.getInt(null, struct + Visual.MAP_ENTRIES); } + + /** Unsafe version of {@link #ext_data(long) ext_data}. */ + public static void next_data(long struct, long value) { memPutAddress(struct + Visual.EXT_DATA, value); } + /** Unsafe version of {@link #visualid(long) visualid}. */ + public static void nvisualid(long struct, long value) { memPutCLong(struct + Visual.VISUALID, value); } + /** Unsafe version of {@link #class$(int) class$}. */ + public static void nclass$(long struct, int value) { UNSAFE.putInt(null, struct + Visual.CLASS, value); } + /** Unsafe version of {@link #red_mask(long) red_mask}. */ + public static void nred_mask(long struct, long value) { memPutCLong(struct + Visual.RED_MASK, value); } + /** Unsafe version of {@link #green_mask(long) green_mask}. */ + public static void ngreen_mask(long struct, long value) { memPutCLong(struct + Visual.GREEN_MASK, value); } + /** Unsafe version of {@link #blue_mask(long) blue_mask}. */ + public static void nblue_mask(long struct, long value) { memPutCLong(struct + Visual.BLUE_MASK, value); } + /** Unsafe version of {@link #bits_per_rgb(int) bits_per_rgb}. */ + public static void nbits_per_rgb(long struct, int value) { UNSAFE.putInt(null, struct + Visual.BITS_PER_RGB, value); } + /** Unsafe version of {@link #map_entries(int) map_entries}. */ + public static void nmap_entries(long struct, int value) { UNSAFE.putInt(null, struct + Visual.MAP_ENTRIES, value); } + + // ----------------------------------- + + /** An array of {@link Visual} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final Visual ELEMENT_FACTORY = Visual.create(-1L); + + /** + * Creates a new {@code Visual.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link Visual#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected Visual getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code ext_data} field. */ + @NativeType("void *") + public long ext_data() { return Visual.next_data(address()); } + /** @return the value of the {@code visualid} field. */ + @NativeType("VisualID") + public long visualid() { return Visual.nvisualid(address()); } + /** @return the value of the {@code class} field. */ + public int class$() { return Visual.nclass$(address()); } + /** @return the value of the {@code red_mask} field. */ + @NativeType("unsigned long") + public long red_mask() { return Visual.nred_mask(address()); } + /** @return the value of the {@code green_mask} field. */ + @NativeType("unsigned long") + public long green_mask() { return Visual.ngreen_mask(address()); } + /** @return the value of the {@code blue_mask} field. */ + @NativeType("unsigned long") + public long blue_mask() { return Visual.nblue_mask(address()); } + /** @return the value of the {@code bits_per_rgb} field. */ + public int bits_per_rgb() { return Visual.nbits_per_rgb(address()); } + /** @return the value of the {@code map_entries} field. */ + public int map_entries() { return Visual.nmap_entries(address()); } + + /** Sets the specified value to the {@code ext_data} field. */ + public Buffer ext_data(@NativeType("void *") long value) { Visual.next_data(address(), value); return this; } + /** Sets the specified value to the {@code visualid} field. */ + public Buffer visualid(@NativeType("VisualID") long value) { Visual.nvisualid(address(), value); return this; } + /** Sets the specified value to the {@code class} field. */ + public Buffer class$(int value) { Visual.nclass$(address(), value); return this; } + /** Sets the specified value to the {@code red_mask} field. */ + public Buffer red_mask(@NativeType("unsigned long") long value) { Visual.nred_mask(address(), value); return this; } + /** Sets the specified value to the {@code green_mask} field. */ + public Buffer green_mask(@NativeType("unsigned long") long value) { Visual.ngreen_mask(address(), value); return this; } + /** Sets the specified value to the {@code blue_mask} field. */ + public Buffer blue_mask(@NativeType("unsigned long") long value) { Visual.nblue_mask(address(), value); return this; } + /** Sets the specified value to the {@code bits_per_rgb} field. */ + public Buffer bits_per_rgb(int value) { Visual.nbits_per_rgb(address(), value); return this; } + /** Sets the specified value to the {@code map_entries} field. */ + public Buffer map_entries(int value) { Visual.nmap_entries(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/X11.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/X11.java new file mode 100644 index 000000000..2cc4bf719 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/X11.java @@ -0,0 +1,839 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to libX11. */ +public class X11 { + + private static final SharedLibrary X11 = Library.loadNative(X11.class, "org.lwjgl", null, "libX11.so.6", "libX11.so"); + + /** Contains the function pointers loaded from the X11 {@link SharedLibrary}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + XOpenDisplay = apiGetFunctionAddress(X11, "XOpenDisplay"), + XCloseDisplay = apiGetFunctionAddress(X11, "XCloseDisplay"), + XDefaultScreen = apiGetFunctionAddress(X11, "XDefaultScreen"), + XRootWindow = apiGetFunctionAddress(X11, "XRootWindow"), + XCreateColormap = apiGetFunctionAddress(X11, "XCreateColormap"), + XFreeColormap = apiGetFunctionAddress(X11, "XFreeColormap"), + XCreateWindow = apiGetFunctionAddress(X11, "XCreateWindow"), + XDestroyWindow = apiGetFunctionAddress(X11, "XDestroyWindow"), + XFree = apiGetFunctionAddress(X11, "XFree"), + XSendEvent = apiGetFunctionAddress(X11, "XSendEvent"), + XDisplayMotionBufferSize = apiGetFunctionAddress(X11, "XDisplayMotionBufferSize"), + XGetMotionEvents = apiGetFunctionAddress(X11, "XGetMotionEvents"), + XTranslateCoordinates = apiGetFunctionAddress(X11, "XTranslateCoordinates"); + + } + + /** Returns the X11 {@link SharedLibrary}. */ + public static SharedLibrary getLibrary() { + return X11; + } + + /** Boolean values */ + public static final int + True = 1, + False = 0; + + /** RESERVED RESOURCE AND CONSTANT DEFINITIONS */ + public static final int + None = 0, + ParentRelative = 1, + CopyFromParent = 0, + PointerWindow = 0, + InputFocus = 1, + PointerRoot = 1, + AnyPropertyType = 0, + AnyKey = 0, + AnyButton = 0, + AllTemporary = 0, + CurrentTime = 0, + NoSymbol = 0; + + /** ERROR CODES */ + public static final int + Success = 0, + BadRequest = 1, + BadValue = 2, + BadWindow = 3, + BadPixmap = 4, + BadAtom = 5, + BadCursor = 6, + BadFont = 7, + BadMatch = 8, + BadDrawable = 9, + BadAccess = 10, + BadAlloc = 11, + BadColor = 12, + BadGC = 13, + BadIDChoice = 14, + BadName = 15, + BadLength = 16, + BadImplementation = 17, + FirstExtensionError = 128, + LastExtensionError = 255; + + /** Window attributes for CreateWindow and ChangeWindowAttributes */ + public static final int + CWBackPixmap = 1 << 0, + CWBackPixel = 1 << 1, + CWBorderPixmap = 1 << 2, + CWBorderPixel = 1 << 3, + CWBitGravity = 1 << 4, + CWWinGravity = 1 << 5, + CWBackingStore = 1 << 6, + CWBackingPlanes = 1 << 7, + CWBackingPixel = 1 << 8, + CWOverrideRedirect = 1 << 9, + CWSaveUnder = 1 << 10, + CWEventMask = 1 << 11, + CWDontPropagate = 1 << 12, + CWColormap = 1 << 13, + CWCursor = 1 << 14; + + /** Input Event Masks. Used as event-mask window attribute and as arguments to Grab requests. Not to be confused with event names. */ + public static final int + NoEventMask = 0, + KeyPressMask = 1 << 0, + KeyReleaseMask = 1 << 1, + ButtonPressMask = 1 << 2, + ButtonReleaseMask = 1 << 3, + EnterWindowMask = 1 << 4, + LeaveWindowMask = 1 << 5, + PointerMotionMask = 1 << 6, + PointerMotionHintMask = 1 << 7, + Button1MotionMask = 1 << 8, + Button2MotionMask = 1 << 9, + Button3MotionMask = 1 << 10, + Button4MotionMask = 1 << 11, + Button5MotionMask = 1 << 12, + ButtonMotionMask = 1 << 13, + KeymapStateMask = 1 << 14, + ExposureMask = 1 << 15, + VisibilityChangeMask = 1 << 16, + StructureNotifyMask = 1 << 17, + ResizeRedirectMask = 1 << 18, + SubstructureNotifyMask = 1 << 19, + SubstructureRedirectMask = 1 << 20, + FocusChangeMask = 1 << 21, + PropertyChangeMask = 1 << 22, + ColormapChangeMask = 1 << 23, + OwnerGrabButtonMask = 1 << 24; + + /** + * Event names. Used in "type" field in {@code XEvent} structures. Not to be confused with event masks above. They start from 2 because 0 and 1 are reserved in + * the protocol for errors and replies. + */ + public static final int + KeyPress = 2, + KeyRelease = 3, + ButtonPress = 4, + ButtonRelease = 5, + MotionNotify = 6, + EnterNotify = 7, + LeaveNotify = 8, + FocusIn = 9, + FocusOut = 10, + KeymapNotify = 11, + Expose = 12, + GraphicsExpose = 13, + NoExpose = 14, + VisibilityNotify = 15, + CreateNotify = 16, + DestroyNotify = 17, + UnmapNotify = 18, + MapNotify = 19, + MapRequest = 20, + ReparentNotify = 21, + ConfigureNotify = 22, + ConfigureRequest = 23, + GravityNotify = 24, + ResizeRequest = 25, + CirculateNotify = 26, + CirculateRequest = 27, + PropertyNotify = 28, + SelectionClear = 29, + SelectionRequest = 30, + SelectionNotify = 31, + ColormapNotify = 32, + ClientMessage = 33, + MappingNotify = 34, + GenericEvent = 35, + LASTEvent = 36; + + /** Key masks. Used as modifiers to GrabButton and GrabKey, results of QueryPointer, state in various key-, mouse-, and button-related events. */ + public static final int + ShiftMask = 1<<0, + LockMask = 1<<1, + ControlMask = 1<<2, + Mod1Mask = 1<<3, + Mod2Mask = 1<<4, + Mod3Mask = 1<<5, + Mod4Mask = 1<<6, + Mod5Mask = 1<<7; + + /** modifier names. Used to build a SetModifierMapping request or to read a GetModifierMapping request. These correspond to the masks defined above. */ + public static final int + ShiftMapIndex = 0, + LockMapIndex = 1, + ControlMapIndex = 2, + Mod1MapIndex = 3, + Mod2MapIndex = 4, + Mod3MapIndex = 5, + Mod4MapIndex = 6, + Mod5MapIndex = 7; + + /** button masks. Used in same manner as Key masks above. Not to be confused with button names below. */ + public static final int + Button1Mask = 1<<8, + Button2Mask = 1<<9, + Button3Mask = 1<<10, + Button4Mask = 1<<11, + Button5Mask = 1<<12, + AnyModifier = 1<<15; + + /** + * button names. Used as arguments to GrabButton and as detail in ButtonPress and ButtonRelease events. Not to be confused with button masks above. Note + * that 0 is already defined above as "AnyButton". + */ + public static final int + Button1 = 1, + Button2 = 2, + Button3 = 3, + Button4 = 4, + Button5 = 5; + + /** Notify modes */ + public static final int + NotifyNormal = 0, + NotifyGrab = 1, + NotifyUngrab = 2, + NotifyWhileGrabbed = 3, + NotifyHint = 1; + + /** Notify detail */ + public static final int + NotifyAncestor = 0, + NotifyVirtual = 1, + NotifyInferior = 2, + NotifyNonlinear = 3, + NotifyNonlinearVirtual = 4, + NotifyPointer = 5, + NotifyPointerRoot = 6, + NotifyDetailNone = 7; + + /** Visibility notify */ + public static final int + VisibilityUnobscured = 0, + VisibilityPartiallyObscured = 1, + VisibilityFullyObscured = 2; + + /** Circulation request */ + public static final int + PlaceOnTop = 0, + PlaceOnBottom = 1; + + /** Property notification */ + public static final int + PropertyNewValue = 0, + PropertyDelete = 1; + + /** Color Map notification */ + public static final int + ColormapUninstalled = 0, + ColormapInstalled = 1; + + /** GrabPointer, GrabButton, GrabKeyboard, GrabKey Modes */ + public static final int + GrabModeSync = 0, + GrabModeAsync = 1; + + /** GrabPointer, GrabKeyboard reply status */ + public static final int + GrabSuccess = 0, + AlreadyGrabbed = 1, + GrabInvalidTime = 2, + GrabNotViewable = 3, + GrabFrozen = 4; + + /** AllowEvents modes */ + public static final int + AsyncPointer = 0, + SyncPointer = 1, + ReplayPointer = 2, + AsyncKeyboard = 3, + SyncKeyboard = 4, + ReplayKeyboard = 5, + AsyncBoth = 6, + SyncBoth = 7; + + /** For {@link #XCreateColormap}. */ + public static final int + AllocNone = 0, + AllocAll = 1; + + /** Used in XSetInputFocus(), XGetInputFocus(). */ + public static final int + RevertToNone = None, + RevertToPointerRoot = PointerRoot, + RevertToParent = 2; + + /** Window classes used by {@link #XCreateWindow}. */ + public static final int + InputOutput = 1, + InputOnly = 2; + + /** SCREEN SAVER STUFF */ + public static final int + DontPreferBlanking = 0, + PreferBlanking = 1, + DefaultBlanking = 2, + DisableScreenSaver = 0, + DisableScreenInterval = 0, + DontAllowExposures = 0, + AllowExposures = 1, + DefaultExposures = 2, + ScreenSaverReset = 0, + ScreenSaverActive = 1; + + /** Property modes */ + public static final int + PropModeReplace = 0, + PropModePrepend = 1, + PropModeAppend = 2; + + /** graphics functions, as in GC.alu */ + public static final int + GXclear = 0x0, + GXand = 0x1, + GXandReverse = 0x2, + GXcopy = 0x3, + GXandInverted = 0x4, + GXnoop = 0x5, + GXxor = 0x6, + GXor = 0x7, + GXnor = 0x8, + GXequiv = 0x9, + GXinvert = 0xA, + GXorReverse = 0xB, + GXcopyInverted = 0xC, + GXorInverted = 0xD, + GXnand = 0xE, + GXset = 0xF; + + /** LineStyle */ + public static final int + LineSolid = 0, + LineOnOffDash = 1, + LineDoubleDash = 2; + + /** capStyle */ + public static final int + CapNotLast = 0, + CapButt = 1, + CapRound = 2, + CapProjecting = 3; + + /** joinStyle */ + public static final int + JoinMiter = 0, + JoinRound = 1, + JoinBevel = 2; + + /** fillStyle */ + public static final int + FillSolid = 0, + FillTiled = 1, + FillStippled = 2, + FillOpaqueStippled = 3; + + /** fillRule */ + public static final int + EvenOddRule = 0, + WindingRule = 1; + + /** subwindow mode */ + public static final int + ClipByChildren = 0, + IncludeInferiors = 1; + + /** SetClipRectangles ordering */ + public static final int + Unsorted = 0, + YSorted = 1, + YXSorted = 2, + YXBanded = 3; + + /** CoordinateMode for drawing routines */ + public static final int + CoordModeOrigin = 0, + CoordModePrevious = 1; + + /** Polygon shapes */ + public static final int + Complex = 0, + Nonconvex = 1, + Convex = 2; + + /** Arc modes for PolyFillArc */ + public static final int + ArcChord = 0, + ArcPieSlice = 1; + + /** GC components: masks used in CreateGC, CopyGC, ChangeGC, OR'ed into GC.stateChanges */ + public static final int + GCFunction = 1<<0, + GCPlaneMask = 1<<1, + GCForeground = 1<<2, + GCBackground = 1<<3, + GCLineWidth = 1<<4, + GCLineStyle = 1<<5, + GCCapStyle = 1<<6, + GCJoinStyle = 1<<7, + GCFillStyle = 1<<8, + GCFillRule = 1<<9, + GCTile = 1<<10, + GCStipple = 1<<11, + GCTileStipXOrigin = 1<<12, + GCTileStipYOrigin = 1<<13, + GCFont = 1<<14, + GCSubwindowMode = 1<<15, + GCGraphicsExposures = 1<<16, + GCClipXOrigin = 1<<17, + GCClipYOrigin = 1<<18, + GCClipMask = 1<<19, + GCDashOffset = 1<<20, + GCDashList = 1<<21, + GCArcMode = 1<<22, + GCLastBit = 22; + + public static final int + Above = 0, + Below = 1, + TopIf = 2, + BottomIf = 3, + Opposite = 4; + + public static final int + MappingModifier = 0, + MappingKeyboard = 1, + MappingPointer = 2; + + protected X11() { + throw new UnsupportedOperationException(); + } + + // --- [ XOpenDisplay ] --- + + /** Unsafe version of: {@link #XOpenDisplay} */ + public static long nXOpenDisplay(long display_name) { + long __functionAddress = Functions.XOpenDisplay; + return invokePP(display_name, __functionAddress); + } + + /** + * Returns a Display structure that serves as the connection to the X server and that contains all the information about that X server. {@code XOpenDisplay} + * connects your application to the X server through TCP or DECnet communications protocols, or through some local inter-process communication protocol. + * If the hostname is a host machine name and a single colon (:) separates the hostname and display number, {@code XOpenDisplay} connects using TCP streams. + * If the hostname is not specified, Xlib uses whatever it believes is the fastest transport. If the hostname is a host machine name and a double colon + * (::) separates the hostname and display number, {@code XOpenDisplay} connects using DECnet. A single X server can support any or all of these transport + * mechanisms simultaneously. A particular Xlib implementation can support many more of these transport mechanisms. + * + * @param display_name the hardware display name, which determines the display and communications domain to be used. On a POSIX-conformant system, if the + * {@code display_name} is {@code NULL}, it defaults to the value of the DISPLAY environment variable. + */ + @NativeType("Display *") + public static long XOpenDisplay(@Nullable @NativeType("char const *") ByteBuffer display_name) { + if (CHECKS) { + checkNT1Safe(display_name); + } + return nXOpenDisplay(memAddressSafe(display_name)); + } + + /** + * Returns a Display structure that serves as the connection to the X server and that contains all the information about that X server. {@code XOpenDisplay} + * connects your application to the X server through TCP or DECnet communications protocols, or through some local inter-process communication protocol. + * If the hostname is a host machine name and a single colon (:) separates the hostname and display number, {@code XOpenDisplay} connects using TCP streams. + * If the hostname is not specified, Xlib uses whatever it believes is the fastest transport. If the hostname is a host machine name and a double colon + * (::) separates the hostname and display number, {@code XOpenDisplay} connects using DECnet. A single X server can support any or all of these transport + * mechanisms simultaneously. A particular Xlib implementation can support many more of these transport mechanisms. + * + * @param display_name the hardware display name, which determines the display and communications domain to be used. On a POSIX-conformant system, if the + * {@code display_name} is {@code NULL}, it defaults to the value of the DISPLAY environment variable. + */ + @NativeType("Display *") + public static long XOpenDisplay(@Nullable @NativeType("char const *") CharSequence display_name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCIISafe(display_name, true); + long display_nameEncoded = display_name == null ? NULL : stack.getPointerAddress(); + return nXOpenDisplay(display_nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ XCloseDisplay ] --- + + /** + * Closes the connection to the X server for the display specified in the {@code Display} structure and destroys all windows, resource IDs (Window, Font, + * Pixmap, Colormap, Cursor, and GContext), or other resources that the client has created on this display, unless the close-down mode of the resource has + * been changed (see {@code XSetCloseDownMode()}). Therefore, these windows, resource IDs, and other resources should never be referenced again or an error will + * be generated. Before exiting, you should call {@code XCloseDisplay()} explicitly so that any pending errors are reported as {@code XCloseDisplay()} + * performs a final {@code XSync()} operation. + * + * @param display the connection to the X server + */ + public static void XCloseDisplay(@NativeType("Display *") long display) { + long __functionAddress = Functions.XCloseDisplay; + if (CHECKS) { + check(display); + } + invokePV(display, __functionAddress); + } + + // --- [ XDefaultScreen ] --- + + /** + * Returns a pointer to the default screen. + * + * @param display the connection to the X server + */ + public static int XDefaultScreen(@NativeType("Display *") long display) { + long __functionAddress = Functions.XDefaultScreen; + if (CHECKS) { + check(display); + } + return invokePI(display, __functionAddress); + } + + // --- [ XRootWindow ] --- + + /** + * Returns the root window of the specified screen. + * + * @param display the connection to the X server + * @param screen_number the appropriate screen number on the host server + */ + @NativeType("Window") + public static long XRootWindow(@NativeType("Display *") long display, int screen_number) { + long __functionAddress = Functions.XRootWindow; + if (CHECKS) { + check(display); + } + return invokePN(display, screen_number, __functionAddress); + } + + // --- [ XCreateColormap ] --- + + /** Unsafe version of: {@link #XCreateColormap} */ + public static long nXCreateColormap(long display, long w, long visual, int alloc) { + long __functionAddress = Functions.XCreateColormap; + if (CHECKS) { + check(display); + } + return invokePNPN(display, w, visual, alloc, __functionAddress); + } + + /** + * Creates a colormap of the specified visual type for the screen on which the specified window resides and returns the colormap ID associated with it. + * Note that the specified window is only used to determine the screen. + * + * @param display the connection to the X server + * @param w the window + * @param visual a visual type supported on the screen. If the visual type is not one supported by the screen, a {@code BadMatch} error results. + * @param alloc the colormap entries to be allocated. You can pass AllocNone or AllocAll. + */ + @NativeType("Colormap") + public static long XCreateColormap(@NativeType("Display *") long display, @NativeType("Window") long w, @NativeType("Visual *") Visual visual, int alloc) { + return nXCreateColormap(display, w, visual.address(), alloc); + } + + // --- [ XFreeColormap ] --- + + /** + * Deletes the association between the {@code colormap} resource ID and the {@code colormap} and frees the {@code colormap} storage. However, this function + * has no effect on the default colormap for a screen. If the specified {@code colormap} is an installed map for a screen, it is uninstalled. If the + * specified {@code colormap} is defined as the {@code colormap} for a window, {@code XFreeColormap()} changes the colormap associated with the window to + * {@link #None} and generates a {@code ColormapNotify} event. X does not define the colors displayed for a window with a colormap of {@link #None}. + * + * @param display the connection to the X server + * @param colormap the colormap to destroy + */ + public static int XFreeColormap(@NativeType("Display *") long display, @NativeType("Colormap") long colormap) { + long __functionAddress = Functions.XFreeColormap; + if (CHECKS) { + check(display); + } + return invokePNI(display, colormap, __functionAddress); + } + + // --- [ XCreateWindow ] --- + + /** Unsafe version of: {@link #XCreateWindow} */ + public static long nXCreateWindow(long display, long parent, int x, int y, int width, int height, int border_width, int depth, int windowClass, long visual, long valuemask, long attributes) { + long __functionAddress = Functions.XCreateWindow; + if (CHECKS) { + check(display); + } + return invokePNPNPN(display, parent, x, y, width, height, border_width, depth, windowClass, visual, valuemask, attributes, __functionAddress); + } + + /** + * Creates an unmapped subwindow for a specified parent window, returns the window ID of the created window, and causes the X server to generate a + * {@code CreateNotify }event. The created window is placed on top in the stacking order with respect to siblings. + * + *

    The coordinate system has the X axis horizontal and the Y axis vertical with the origin [0, 0] at the upper-left corner. Coordinates are integral, in + * terms of pixels, and coincide with pixel centers. Each window and pixmap has its own coordinate system. For a window, the origin is inside the border at + * the inside, upper-left corner.

    + * + *

    The x and y coordinates are the top-left outside corner of the window's borders and are relative to the inside of the parent window's borders.

    + * + *

    The width and height are the created window's inside dimensions and do not include the created window's borders.

    + * + * @param display the connection to the X server + * @param parent the parent window + * @param x the window x-coordinate + * @param y the window y-coordinate + * @param width the window width + * @param height the window height + * @param border_width the border width + * @param depth the window's depth. A depth of {@link #CopyFromParent} means the depth is taken from the parent. + * @param windowClass the created window's class. One of:
    {@link #InputOutput}{@link #InputOnly}{@link #CopyFromParent}
    + * @param visual the visual type. A visual of {@link #CopyFromParent} means the visual type is taken from the parent. + * @param valuemask which window attributes are defined in the attributes argument. This mask is the bitwise inclusive OR of the valid attribute mask bits. If + * {@code valuemask} is zero, the attributes are ignored and are not referenced. + * @param attributes the structure from which the values (as specified by the value mask) are to be taken + */ + @NativeType("Window") + public static long XCreateWindow(@NativeType("Display *") long display, @NativeType("Window") long parent, int x, int y, @NativeType("unsigned int") int width, @NativeType("unsigned int") int height, @NativeType("unsigned int") int border_width, int depth, @NativeType("unsigned int") int windowClass, @NativeType("Visual *") Visual visual, @NativeType("unsigned long") long valuemask, @NativeType("XSetWindowAttributes *") XSetWindowAttributes attributes) { + return nXCreateWindow(display, parent, x, y, width, height, border_width, depth, windowClass, visual.address(), valuemask, attributes.address()); + } + + // --- [ XDestroyWindow ] --- + + /** + * Destroys the specified window as well as all of its subwindows and causes the X server to generate a {@code DestroyNotify} event for each window. The + * window should never be referenced again. If the window specified by the {@code w} argument is mapped, it is unmapped automatically. The ordering of the + * {@code DestroyNotify} events is such that for any given window being destroyed, {@code DestroyNotify} is generated on any inferiors of the window before + * being generated on the window itself. The ordering among siblings and across subhierarchies is not otherwise constrained. If the window you specified is + * a root window, no windows are destroyed. Destroying a mapped window will generate {@code Expose} events on other windows that were obscured by the + * window being destroyed. + * + * @param display the connection to the X server + * @param w the window + */ + public static int XDestroyWindow(@NativeType("Display *") long display, @NativeType("Window") long w) { + long __functionAddress = Functions.XDestroyWindow; + if (CHECKS) { + check(display); + } + return invokePNI(display, w, __functionAddress); + } + + // --- [ XFree ] --- + + /** Unsafe version of: {@link #XFree} */ + public static int nXFree(long data) { + long __functionAddress = Functions.XFree; + return invokePI(data, __functionAddress); + } + + /** + * Free in-memory data that was created by an Xlib function. + * + * @param data the data that is to be freed + */ + public static int XFree(@NativeType("void *") ByteBuffer data) { + return nXFree(memAddress(data)); + } + + /** + * Free in-memory data that was created by an Xlib function. + * + * @param data the data that is to be freed + */ + public static int XFree(@NativeType("void *") PointerBuffer data) { + return nXFree(memAddress(data)); + } + + // --- [ XSendEvent ] --- + + /** Unsafe version of: {@link #XSendEvent} */ + public static int nXSendEvent(long display, long w, int propagate, long event_mask, long event_send) { + long __functionAddress = Functions.XSendEvent; + if (CHECKS) { + check(display); + } + return invokePNNPI(display, w, propagate, event_mask, event_send, __functionAddress); + } + + /** + * The {@code XSendEvent} function identifies the destination window, determines which clients should receive the specified events, and ignores any active + * grabs. This function requires you to pass an event mask. This function uses the {@code w} argument to identify the destination window as follows: + * + *
      + *
    • If {@code w} is {@code PointerWindow}, the destination window is the window that contains the pointer.
    • + *
    • If {@code w} is {@code InputFocus} and if the focus window contains the pointer, the destination window is the window that contains the pointer; + * otherwise, the destination window is the focus window.
    • + *
    + * + *

    To determine which clients should receive the specified events, {@code XSendEvent} uses the propagate argument as follows:

    + * + *
      + *
    • If {@code event_mask} is the empty set, the event is sent to the client that created the destination window. If that client no longer exists, no + * event is sent.
    • + *
    • If {@code propagate} is {@link #False}, the event is sent to every client selecting on destination any of the event types in the {@code event_mask} + * argument.
    • + *
    • If {@code propagate} is {@link #True} and no clients have selected on destination any of the event types in event-mask, the destination is replaced with + * the closest ancestor of destination for which some client has selected a type in event-mask and for which no intervening window has that type in + * its do-not-propagate-mask. If no such window exists or if the window is an ancestor of the focus window and {@link #InputFocus} was originally specified as + * the destination, the event is not sent to any clients. Otherwise, the event is reported to every client selecting on the final destination any of + * the types specified in {@code event_mask}.
    • + *
    + * + *

    The event in the {@code XEvent} structure must be one of the core events or one of the events defined by an extension (or a {@link #BadValue} error results) so + * that the X server can correctly byte-swap the contents as necessary. The contents of the event are otherwise unaltered and unchecked by the X server + * except to force {@code send_event} to {@link #True} in the forwarded event and to set the serial number in the event correctly; therefore these fields and the + * display field are ignored by {@code XSendEvent}.

    + * + *

    {@code XSendEvent} returns zero if the conversion to wire protocol format failed and returns nonzero otherwise. {@code XSendEvent} can generate + * {@link #BadValue} and {@link #BadWindow} errors.

    + * + *

    The server may retain the recent history of the pointer motion and do so to a finer granularity than is reported by {@link #MotionNotify} events. The + * {@link #XGetMotionEvents} function makes this history available.

    + * + * @param display the connection to the X server + * @param w specifies the window the event is to be sent to + * @param propagate specifies a {@code Boolean} value + * @param event_mask specifies the event mask + * @param event_send specifies the event that is to be sent + */ + @NativeType("Status") + public static int XSendEvent(@NativeType("Display *") long display, @NativeType("Window") long w, @NativeType("Bool") boolean propagate, long event_mask, @NativeType("XEvent *") XEvent event_send) { + return nXSendEvent(display, w, propagate ? 1 : 0, event_mask, event_send.address()); + } + + // --- [ XDisplayMotionBufferSize ] --- + + /** @param display the connection to the X server */ + @NativeType("unsigned long") + public static long XDisplayMotionBufferSize(@NativeType("Display *") long display) { + long __functionAddress = Functions.XDisplayMotionBufferSize; + if (CHECKS) { + check(display); + } + return invokePN(display, __functionAddress); + } + + // --- [ XGetMotionEvents ] --- + + /** Unsafe version of: {@link #XGetMotionEvents} */ + public static long nXGetMotionEvents(long display, long w, long start, long stop, long nevents_return) { + long __functionAddress = Functions.XGetMotionEvents; + if (CHECKS) { + check(display); + } + return invokePNNNPP(display, w, start, stop, nevents_return, __functionAddress); + } + + /** + * The {@code XGetMotionEvents} function returns all events in the motion history buffer that fall between the specified start and stop times, inclusive, + * and that have coordinates that lie within the specified window (including its borders) at its present placement. + * + *

    If the server does not support motion history, if the start time is later than the stop time, or if the start time is in the future, no events are + * returned; {@code XGetMotionEvents} returns {@code NULL}. If the stop time is in the future, it is equivalent to specifying {@link #CurrentTime}. + * {@code XGetMotionEvents} can generate a {@link #BadWindow} error.

    + * + * @param display the connection to the X server + */ + @Nullable + @NativeType("XTimeCoord *") + public static XTimeCoord.Buffer XGetMotionEvents(@NativeType("Display *") long display, @NativeType("Window") long w, @NativeType("Time") long start, @NativeType("Time") long stop) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer nevents_return = stack.callocInt(1); + try { + long __result = nXGetMotionEvents(display, w, start, stop, memAddress(nevents_return)); + return XTimeCoord.createSafe(__result, nevents_return.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ XTranslateCoordinates ] --- + + /** Unsafe version of: {@link #XTranslateCoordinates} */ + public static int nXTranslateCoordinates(long display, long src_w, long dest_w, int src_x, int src_y, long dest_x_return, long dest_y_return, long child_return) { + long __functionAddress = Functions.XTranslateCoordinates; + if (CHECKS) { + check(display); + } + return invokePNNPPPI(display, src_w, dest_w, src_x, src_y, dest_x_return, dest_y_return, child_return, __functionAddress); + } + + /** + * Translates window coordinates. + * + *

    If {@code XTranslateCoordinates} returns {@link #True}, it takes the {@code src_x} and {@code src_y} coordinates relative to the source window's origin and + * returns these coordinates to {@code dest_x_return} and {@code dest_y_return} relative to the destination window's origin. If + * {@code XTranslateCoordinates} returns {@link #False}, {@code src_w} and {@code dest_w} are on different screens, and {@code dest_x_return} and + * {@code dest_y_return} are zero. If the coordinates are contained in a mapped child of {@code dest_w}, that child is returned to {@code child_return}. + * Otherwise, {@code child_return} is set to {@link #None}.

    + * + *

    {@code XTranslateCoordinates} can generate a {@link #BadWindow} error.

    + * + * @param display the connection to the X server + * @param src_w specifies the source window + * @param dest_w specifies the destination window + * @param src_x specifies the x coordinate within the source window + * @param src_y specifies the x coordinate within the source window + * @param dest_x_return returns the x coordinate within the destination window + * @param dest_y_return returns the y coordinate within the destination window + * @param child_return returns the child if the coordinates are contained in a mapped child of the destination window + */ + @NativeType("Bool") + public static boolean XTranslateCoordinates(@NativeType("Display *") long display, @NativeType("Window") long src_w, @NativeType("Window") long dest_w, int src_x, int src_y, @NativeType("int *") IntBuffer dest_x_return, @NativeType("int *") IntBuffer dest_y_return, @NativeType("Window *") CLongBuffer child_return) { + if (CHECKS) { + check(dest_x_return, 1); + check(dest_y_return, 1); + check(child_return, 1); + } + return nXTranslateCoordinates(display, src_w, dest_w, src_x, src_y, memAddress(dest_x_return), memAddress(dest_y_return), memAddress(child_return)) != 0; + } + + /** Array version of: {@link #XTranslateCoordinates} */ + @NativeType("Bool") + public static boolean XTranslateCoordinates(@NativeType("Display *") long display, @NativeType("Window") long src_w, @NativeType("Window") long dest_w, int src_x, int src_y, @NativeType("int *") int[] dest_x_return, @NativeType("int *") int[] dest_y_return, @NativeType("Window *") CLongBuffer child_return) { + long __functionAddress = Functions.XTranslateCoordinates; + if (CHECKS) { + check(display); + check(dest_x_return, 1); + check(dest_y_return, 1); + check(child_return, 1); + } + return invokePNNPPPI(display, src_w, dest_w, src_x, src_y, dest_x_return, dest_y_return, memAddress(child_return), __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XAnyEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XAnyEvent.java new file mode 100644 index 000000000..1d9462db9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XAnyEvent.java @@ -0,0 +1,374 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Generic X event. + * + *

    Layout

    + * + *
    
    + * struct XAnyEvent {
    + *     int {@link #type};
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + * }
    + */ +public class XAnyEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + } + + protected XAnyEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XAnyEvent create(long address, @Nullable ByteBuffer container) { + return new XAnyEvent(address, container); + } + + /** + * Creates a {@code XAnyEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XAnyEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the event type constant name that uniquely identifies it */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + + /** Sets the specified value to the {@link #type} field. */ + public XAnyEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XAnyEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XAnyEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XAnyEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XAnyEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XAnyEvent set( + int type, + long serial, + boolean send_event, + long display, + long window + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XAnyEvent set(XAnyEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XAnyEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XAnyEvent malloc() { + return new XAnyEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XAnyEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XAnyEvent calloc() { + return new XAnyEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XAnyEvent} instance allocated with {@link BufferUtils}. */ + public static XAnyEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XAnyEvent(memAddress(container), container); + } + + /** Returns a new {@code XAnyEvent} instance for the specified memory address. */ + public static XAnyEvent create(long address) { + return new XAnyEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XAnyEvent createSafe(long address) { + return address == NULL ? null : new XAnyEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XAnyEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XAnyEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XAnyEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XAnyEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XAnyEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XAnyEvent malloc(MemoryStack stack) { + return new XAnyEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XAnyEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XAnyEvent calloc(MemoryStack stack) { + return new XAnyEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XAnyEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XAnyEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XAnyEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XAnyEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XAnyEvent.WINDOW); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XAnyEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XAnyEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XAnyEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XAnyEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XAnyEvent.WINDOW, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XAnyEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XAnyEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XAnyEvent ELEMENT_FACTORY = XAnyEvent.create(-1L); + + /** + * Creates a new {@code XAnyEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XAnyEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XAnyEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link XAnyEvent#type} field. */ + public int type() { return XAnyEvent.ntype(address()); } + /** @return the value of the {@link XAnyEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XAnyEvent.nserial(address()); } + /** @return the value of the {@link XAnyEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XAnyEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XAnyEvent#display} field. */ + @NativeType("Display *") + public long display() { return XAnyEvent.ndisplay(address()); } + /** @return the value of the {@link XAnyEvent#window} field. */ + @NativeType("Window") + public long window() { return XAnyEvent.nwindow(address()); } + + /** Sets the specified value to the {@link XAnyEvent#type} field. */ + public Buffer type(int value) { XAnyEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XAnyEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XAnyEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XAnyEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XAnyEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XAnyEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XAnyEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XAnyEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XAnyEvent.nwindow(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XButtonEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XButtonEvent.java new file mode 100644 index 000000000..ecf5b74b6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XButtonEvent.java @@ -0,0 +1,566 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Button event. + * + *

    Layout

    + * + *
    
    + * struct XButtonEvent {
    + *     int {@link #type};
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     Window {@link #root};
    + *     Window {@link #subwindow};
    + *     Time {@link #time};
    + *     int {@link #x};
    + *     int {@link #y};
    + *     int {@link #x_root};
    + *     int {@link #y_root};
    + *     unsigned int {@link #state};
    + *     unsigned int {@link #button};
    + *     Bool {@link #same_screen};
    + * }
    + */ +public class XButtonEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + ROOT, + SUBWINDOW, + TIME, + X, + Y, + X_ROOT, + Y_ROOT, + STATE, + BUTTON, + SAME_SCREEN; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + ROOT = layout.offsetof(5); + SUBWINDOW = layout.offsetof(6); + TIME = layout.offsetof(7); + X = layout.offsetof(8); + Y = layout.offsetof(9); + X_ROOT = layout.offsetof(10); + Y_ROOT = layout.offsetof(11); + STATE = layout.offsetof(12); + BUTTON = layout.offsetof(13); + SAME_SCREEN = layout.offsetof(14); + } + + protected XButtonEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XButtonEvent create(long address, @Nullable ByteBuffer container) { + return new XButtonEvent(address, container); + } + + /** + * Creates a {@code XButtonEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XButtonEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the event type. One of:
    {@link X11#ButtonPress}{@link X11#ButtonRelease}
    */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** root window that the event occurred on */ + @NativeType("Window") + public long root() { return nroot(address()); } + /** child window */ + @NativeType("Window") + public long subwindow() { return nsubwindow(address()); } + /** milliseconds */ + @NativeType("Time") + public long time() { return ntime(address()); } + /** pointer x coordinate in event window */ + public int x() { return nx(address()); } + /** pointer y coordinate in event window */ + public int y() { return ny(address()); } + /** x coordinate relative to {@code root} */ + public int x_root() { return nx_root(address()); } + /** y coordinate relative to {@code root} */ + public int y_root() { return ny_root(address()); } + /** button mask */ + @NativeType("unsigned int") + public int state() { return nstate(address()); } + /** detail */ + @NativeType("unsigned int") + public int button() { return nbutton(address()); } + /** same screen flag */ + @NativeType("Bool") + public boolean same_screen() { return nsame_screen(address()) != 0; } + + /** Sets the specified value to the {@link #type} field. */ + public XButtonEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XButtonEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XButtonEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XButtonEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XButtonEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #root} field. */ + public XButtonEvent root(@NativeType("Window") long value) { nroot(address(), value); return this; } + /** Sets the specified value to the {@link #subwindow} field. */ + public XButtonEvent subwindow(@NativeType("Window") long value) { nsubwindow(address(), value); return this; } + /** Sets the specified value to the {@link #time} field. */ + public XButtonEvent time(@NativeType("Time") long value) { ntime(address(), value); return this; } + /** Sets the specified value to the {@link #x} field. */ + public XButtonEvent x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@link #y} field. */ + public XButtonEvent y(int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@link #x_root} field. */ + public XButtonEvent x_root(int value) { nx_root(address(), value); return this; } + /** Sets the specified value to the {@link #y_root} field. */ + public XButtonEvent y_root(int value) { ny_root(address(), value); return this; } + /** Sets the specified value to the {@link #state} field. */ + public XButtonEvent state(@NativeType("unsigned int") int value) { nstate(address(), value); return this; } + /** Sets the specified value to the {@link #button} field. */ + public XButtonEvent button(@NativeType("unsigned int") int value) { nbutton(address(), value); return this; } + /** Sets the specified value to the {@link #same_screen} field. */ + public XButtonEvent same_screen(@NativeType("Bool") boolean value) { nsame_screen(address(), value ? 1 : 0); return this; } + + /** Initializes this struct with the specified values. */ + public XButtonEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + long root, + long subwindow, + long time, + int x, + int y, + int x_root, + int y_root, + int state, + int button, + boolean same_screen + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + root(root); + subwindow(subwindow); + time(time); + x(x); + y(y); + x_root(x_root); + y_root(y_root); + state(state); + button(button); + same_screen(same_screen); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XButtonEvent set(XButtonEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XButtonEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XButtonEvent malloc() { + return new XButtonEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XButtonEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XButtonEvent calloc() { + return new XButtonEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XButtonEvent} instance allocated with {@link BufferUtils}. */ + public static XButtonEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XButtonEvent(memAddress(container), container); + } + + /** Returns a new {@code XButtonEvent} instance for the specified memory address. */ + public static XButtonEvent create(long address) { + return new XButtonEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XButtonEvent createSafe(long address) { + return address == NULL ? null : new XButtonEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XButtonEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XButtonEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XButtonEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XButtonEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XButtonEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XButtonEvent malloc(MemoryStack stack) { + return new XButtonEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XButtonEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XButtonEvent calloc(MemoryStack stack) { + return new XButtonEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XButtonEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XButtonEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XButtonEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XButtonEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XButtonEvent.WINDOW); } + /** Unsafe version of {@link #root}. */ + public static long nroot(long struct) { return memGetCLong(struct + XButtonEvent.ROOT); } + /** Unsafe version of {@link #subwindow}. */ + public static long nsubwindow(long struct) { return memGetCLong(struct + XButtonEvent.SUBWINDOW); } + /** Unsafe version of {@link #time}. */ + public static long ntime(long struct) { return memGetCLong(struct + XButtonEvent.TIME); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + XButtonEvent.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + XButtonEvent.Y); } + /** Unsafe version of {@link #x_root}. */ + public static int nx_root(long struct) { return UNSAFE.getInt(null, struct + XButtonEvent.X_ROOT); } + /** Unsafe version of {@link #y_root}. */ + public static int ny_root(long struct) { return UNSAFE.getInt(null, struct + XButtonEvent.Y_ROOT); } + /** Unsafe version of {@link #state}. */ + public static int nstate(long struct) { return UNSAFE.getInt(null, struct + XButtonEvent.STATE); } + /** Unsafe version of {@link #button}. */ + public static int nbutton(long struct) { return UNSAFE.getInt(null, struct + XButtonEvent.BUTTON); } + /** Unsafe version of {@link #same_screen}. */ + public static int nsame_screen(long struct) { return UNSAFE.getInt(null, struct + XButtonEvent.SAME_SCREEN); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XButtonEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XButtonEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XButtonEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XButtonEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XButtonEvent.WINDOW, value); } + /** Unsafe version of {@link #root(long) root}. */ + public static void nroot(long struct, long value) { memPutCLong(struct + XButtonEvent.ROOT, value); } + /** Unsafe version of {@link #subwindow(long) subwindow}. */ + public static void nsubwindow(long struct, long value) { memPutCLong(struct + XButtonEvent.SUBWINDOW, value); } + /** Unsafe version of {@link #time(long) time}. */ + public static void ntime(long struct, long value) { memPutCLong(struct + XButtonEvent.TIME, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + XButtonEvent.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + XButtonEvent.Y, value); } + /** Unsafe version of {@link #x_root(int) x_root}. */ + public static void nx_root(long struct, int value) { UNSAFE.putInt(null, struct + XButtonEvent.X_ROOT, value); } + /** Unsafe version of {@link #y_root(int) y_root}. */ + public static void ny_root(long struct, int value) { UNSAFE.putInt(null, struct + XButtonEvent.Y_ROOT, value); } + /** Unsafe version of {@link #state(int) state}. */ + public static void nstate(long struct, int value) { UNSAFE.putInt(null, struct + XButtonEvent.STATE, value); } + /** Unsafe version of {@link #button(int) button}. */ + public static void nbutton(long struct, int value) { UNSAFE.putInt(null, struct + XButtonEvent.BUTTON, value); } + /** Unsafe version of {@link #same_screen(boolean) same_screen}. */ + public static void nsame_screen(long struct, int value) { UNSAFE.putInt(null, struct + XButtonEvent.SAME_SCREEN, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XButtonEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XButtonEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XButtonEvent ELEMENT_FACTORY = XButtonEvent.create(-1L); + + /** + * Creates a new {@code XButtonEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XButtonEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XButtonEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link XButtonEvent#type} field. */ + public int type() { return XButtonEvent.ntype(address()); } + /** @return the value of the {@link XButtonEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XButtonEvent.nserial(address()); } + /** @return the value of the {@link XButtonEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XButtonEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XButtonEvent#display} field. */ + @NativeType("Display *") + public long display() { return XButtonEvent.ndisplay(address()); } + /** @return the value of the {@link XButtonEvent#window} field. */ + @NativeType("Window") + public long window() { return XButtonEvent.nwindow(address()); } + /** @return the value of the {@link XButtonEvent#root} field. */ + @NativeType("Window") + public long root() { return XButtonEvent.nroot(address()); } + /** @return the value of the {@link XButtonEvent#subwindow} field. */ + @NativeType("Window") + public long subwindow() { return XButtonEvent.nsubwindow(address()); } + /** @return the value of the {@link XButtonEvent#time} field. */ + @NativeType("Time") + public long time() { return XButtonEvent.ntime(address()); } + /** @return the value of the {@link XButtonEvent#x} field. */ + public int x() { return XButtonEvent.nx(address()); } + /** @return the value of the {@link XButtonEvent#y} field. */ + public int y() { return XButtonEvent.ny(address()); } + /** @return the value of the {@link XButtonEvent#x_root} field. */ + public int x_root() { return XButtonEvent.nx_root(address()); } + /** @return the value of the {@link XButtonEvent#y_root} field. */ + public int y_root() { return XButtonEvent.ny_root(address()); } + /** @return the value of the {@link XButtonEvent#state} field. */ + @NativeType("unsigned int") + public int state() { return XButtonEvent.nstate(address()); } + /** @return the value of the {@link XButtonEvent#button} field. */ + @NativeType("unsigned int") + public int button() { return XButtonEvent.nbutton(address()); } + /** @return the value of the {@link XButtonEvent#same_screen} field. */ + @NativeType("Bool") + public boolean same_screen() { return XButtonEvent.nsame_screen(address()) != 0; } + + /** Sets the specified value to the {@link XButtonEvent#type} field. */ + public Buffer type(int value) { XButtonEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XButtonEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XButtonEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XButtonEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XButtonEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XButtonEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#root} field. */ + public Buffer root(@NativeType("Window") long value) { XButtonEvent.nroot(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#subwindow} field. */ + public Buffer subwindow(@NativeType("Window") long value) { XButtonEvent.nsubwindow(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#time} field. */ + public Buffer time(@NativeType("Time") long value) { XButtonEvent.ntime(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#x} field. */ + public Buffer x(int value) { XButtonEvent.nx(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#y} field. */ + public Buffer y(int value) { XButtonEvent.ny(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#x_root} field. */ + public Buffer x_root(int value) { XButtonEvent.nx_root(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#y_root} field. */ + public Buffer y_root(int value) { XButtonEvent.ny_root(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#state} field. */ + public Buffer state(@NativeType("unsigned int") int value) { XButtonEvent.nstate(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#button} field. */ + public Buffer button(@NativeType("unsigned int") int value) { XButtonEvent.nbutton(address(), value); return this; } + /** Sets the specified value to the {@link XButtonEvent#same_screen} field. */ + public Buffer same_screen(@NativeType("Bool") boolean value) { XButtonEvent.nsame_screen(address(), value ? 1 : 0); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCirculateEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCirculateEvent.java new file mode 100644 index 000000000..defd4e358 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCirculateEvent.java @@ -0,0 +1,410 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XCirculateEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window event;
    + *     Window window;
    + *     int {@link #place};
    + * }
    + */ +public class XCirculateEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + EVENT, + WINDOW, + PLACE; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + EVENT = layout.offsetof(4); + WINDOW = layout.offsetof(5); + PLACE = layout.offsetof(6); + } + + protected XCirculateEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XCirculateEvent create(long address, @Nullable ByteBuffer container) { + return new XCirculateEvent(address, container); + } + + /** + * Creates a {@code XCirculateEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XCirculateEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** one of:
    {@link X11#PlaceOnTop}{@link X11#PlaceOnBottom}
    */ + public int place() { return nplace(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XCirculateEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XCirculateEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XCirculateEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XCirculateEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public XCirculateEvent event(@NativeType("Window") long value) { nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public XCirculateEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #place} field. */ + public XCirculateEvent place(int value) { nplace(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XCirculateEvent set( + int type, + long serial, + boolean send_event, + long display, + long event, + long window, + int place + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + event(event); + window(window); + place(place); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XCirculateEvent set(XCirculateEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XCirculateEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XCirculateEvent malloc() { + return new XCirculateEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XCirculateEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XCirculateEvent calloc() { + return new XCirculateEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XCirculateEvent} instance allocated with {@link BufferUtils}. */ + public static XCirculateEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XCirculateEvent(memAddress(container), container); + } + + /** Returns a new {@code XCirculateEvent} instance for the specified memory address. */ + public static XCirculateEvent create(long address) { + return new XCirculateEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XCirculateEvent createSafe(long address) { + return address == NULL ? null : new XCirculateEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XCirculateEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XCirculateEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XCirculateEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XCirculateEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XCirculateEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XCirculateEvent malloc(MemoryStack stack) { + return new XCirculateEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XCirculateEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XCirculateEvent calloc(MemoryStack stack) { + return new XCirculateEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XCirculateEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XCirculateEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XCirculateEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XCirculateEvent.DISPLAY); } + /** Unsafe version of {@link #event}. */ + public static long nevent(long struct) { return memGetCLong(struct + XCirculateEvent.EVENT); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XCirculateEvent.WINDOW); } + /** Unsafe version of {@link #place}. */ + public static int nplace(long struct) { return UNSAFE.getInt(null, struct + XCirculateEvent.PLACE); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XCirculateEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XCirculateEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XCirculateEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XCirculateEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #event(long) event}. */ + public static void nevent(long struct, long value) { memPutCLong(struct + XCirculateEvent.EVENT, value); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XCirculateEvent.WINDOW, value); } + /** Unsafe version of {@link #place(int) place}. */ + public static void nplace(long struct, int value) { UNSAFE.putInt(null, struct + XCirculateEvent.PLACE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XCirculateEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XCirculateEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XCirculateEvent ELEMENT_FACTORY = XCirculateEvent.create(-1L); + + /** + * Creates a new {@code XCirculateEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XCirculateEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XCirculateEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XCirculateEvent.ntype(address()); } + /** @return the value of the {@link XCirculateEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XCirculateEvent.nserial(address()); } + /** @return the value of the {@link XCirculateEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XCirculateEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XCirculateEvent#display} field. */ + @NativeType("Display *") + public long display() { return XCirculateEvent.ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return XCirculateEvent.nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return XCirculateEvent.nwindow(address()); } + /** @return the value of the {@link XCirculateEvent#place} field. */ + public int place() { return XCirculateEvent.nplace(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XCirculateEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XCirculateEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XCirculateEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XCirculateEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XCirculateEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XCirculateEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XCirculateEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public Buffer event(@NativeType("Window") long value) { XCirculateEvent.nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public Buffer window(@NativeType("Window") long value) { XCirculateEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XCirculateEvent#place} field. */ + public Buffer place(int value) { XCirculateEvent.nplace(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCirculateRequestEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCirculateRequestEvent.java new file mode 100644 index 000000000..69da36346 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCirculateRequestEvent.java @@ -0,0 +1,410 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XCirculateRequestEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window parent;
    + *     Window window;
    + *     int {@link #place};
    + * }
    + */ +public class XCirculateRequestEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + PARENT, + WINDOW, + PLACE; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + PARENT = layout.offsetof(4); + WINDOW = layout.offsetof(5); + PLACE = layout.offsetof(6); + } + + protected XCirculateRequestEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XCirculateRequestEvent create(long address, @Nullable ByteBuffer container) { + return new XCirculateRequestEvent(address, container); + } + + /** + * Creates a {@code XCirculateRequestEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XCirculateRequestEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code parent} field. */ + @NativeType("Window") + public long parent() { return nparent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** one of:
    {@link X11#PlaceOnTop}{@link X11#PlaceOnBottom}
    */ + public int place() { return nplace(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XCirculateRequestEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XCirculateRequestEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XCirculateRequestEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XCirculateRequestEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code parent} field. */ + public XCirculateRequestEvent parent(@NativeType("Window") long value) { nparent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public XCirculateRequestEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #place} field. */ + public XCirculateRequestEvent place(int value) { nplace(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XCirculateRequestEvent set( + int type, + long serial, + boolean send_event, + long display, + long parent, + long window, + int place + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + parent(parent); + window(window); + place(place); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XCirculateRequestEvent set(XCirculateRequestEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XCirculateRequestEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XCirculateRequestEvent malloc() { + return new XCirculateRequestEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XCirculateRequestEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XCirculateRequestEvent calloc() { + return new XCirculateRequestEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XCirculateRequestEvent} instance allocated with {@link BufferUtils}. */ + public static XCirculateRequestEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XCirculateRequestEvent(memAddress(container), container); + } + + /** Returns a new {@code XCirculateRequestEvent} instance for the specified memory address. */ + public static XCirculateRequestEvent create(long address) { + return new XCirculateRequestEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XCirculateRequestEvent createSafe(long address) { + return address == NULL ? null : new XCirculateRequestEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XCirculateRequestEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XCirculateRequestEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XCirculateRequestEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XCirculateRequestEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XCirculateRequestEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XCirculateRequestEvent malloc(MemoryStack stack) { + return new XCirculateRequestEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XCirculateRequestEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XCirculateRequestEvent calloc(MemoryStack stack) { + return new XCirculateRequestEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XCirculateRequestEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XCirculateRequestEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XCirculateRequestEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XCirculateRequestEvent.DISPLAY); } + /** Unsafe version of {@link #parent}. */ + public static long nparent(long struct) { return memGetCLong(struct + XCirculateRequestEvent.PARENT); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XCirculateRequestEvent.WINDOW); } + /** Unsafe version of {@link #place}. */ + public static int nplace(long struct) { return UNSAFE.getInt(null, struct + XCirculateRequestEvent.PLACE); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XCirculateRequestEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XCirculateRequestEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XCirculateRequestEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XCirculateRequestEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #parent(long) parent}. */ + public static void nparent(long struct, long value) { memPutCLong(struct + XCirculateRequestEvent.PARENT, value); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XCirculateRequestEvent.WINDOW, value); } + /** Unsafe version of {@link #place(int) place}. */ + public static void nplace(long struct, int value) { UNSAFE.putInt(null, struct + XCirculateRequestEvent.PLACE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XCirculateRequestEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XCirculateRequestEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XCirculateRequestEvent ELEMENT_FACTORY = XCirculateRequestEvent.create(-1L); + + /** + * Creates a new {@code XCirculateRequestEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XCirculateRequestEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XCirculateRequestEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XCirculateRequestEvent.ntype(address()); } + /** @return the value of the {@link XCirculateRequestEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XCirculateRequestEvent.nserial(address()); } + /** @return the value of the {@link XCirculateRequestEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XCirculateRequestEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XCirculateRequestEvent#display} field. */ + @NativeType("Display *") + public long display() { return XCirculateRequestEvent.ndisplay(address()); } + /** @return the value of the {@code parent} field. */ + @NativeType("Window") + public long parent() { return XCirculateRequestEvent.nparent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return XCirculateRequestEvent.nwindow(address()); } + /** @return the value of the {@link XCirculateRequestEvent#place} field. */ + public int place() { return XCirculateRequestEvent.nplace(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XCirculateRequestEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XCirculateRequestEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XCirculateRequestEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XCirculateRequestEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XCirculateRequestEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XCirculateRequestEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XCirculateRequestEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code parent} field. */ + public Buffer parent(@NativeType("Window") long value) { XCirculateRequestEvent.nparent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public Buffer window(@NativeType("Window") long value) { XCirculateRequestEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XCirculateRequestEvent#place} field. */ + public Buffer place(int value) { XCirculateRequestEvent.nplace(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XClientMessageEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XClientMessageEvent.java new file mode 100644 index 000000000..df5283f84 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XClientMessageEvent.java @@ -0,0 +1,543 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Client message event. + * + *

    The {@code message_type} member is set to an atom that indicates how the data should be interpreted by the receiving client. The {@code format} + * member is set to 8, 16, or 32 and specifies whether the data should be viewed as a list of bytes, shorts, or longs. The {@code data} member is a + * union that contains the members {@code b}, {@code s}, and {@code l}. The {@code b}, {@code s}, and {@code l} members represent data of twenty 8-bit + * values, ten 16-bit values, and five 32-bit values. Particular message types might not make use of all these values. The X server places no + * interpretation on the values in the {@code window}, {@code message_type}, or {@code data} members.

    + * + *

    Layout

    + * + *
    
    + * struct XClientMessageEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     Atom message_type;
    + *     int format;
    + *     struct {
    + *         char b[20];
    + *         short s[10];
    + *         long l[5];
    + *     } data;
    + * }
    + */ +public class XClientMessageEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + MESSAGE_TYPE, + FORMAT, + DATA, + DATA_B, + DATA_S, + DATA_L; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __struct( + __array(1, 20), + __array(2, 10), + __array(CLONG_SIZE, 5) + ) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + MESSAGE_TYPE = layout.offsetof(5); + FORMAT = layout.offsetof(6); + DATA = layout.offsetof(7); + DATA_B = layout.offsetof(8); + DATA_S = layout.offsetof(9); + DATA_L = layout.offsetof(10); + } + + protected XClientMessageEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XClientMessageEvent create(long address, @Nullable ByteBuffer container) { + return new XClientMessageEvent(address, container); + } + + /** + * Creates a {@code XClientMessageEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XClientMessageEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** @return the value of the {@code message_type} field. */ + @NativeType("Atom") + public long message_type() { return nmessage_type(address()); } + /** @return the value of the {@code format} field. */ + public int format() { return nformat(address()); } + /** @return a {@link ByteBuffer} view of the {@code data.b} field. */ + @NativeType("char[20]") + public ByteBuffer data_b() { return ndata_b(address()); } + /** @return the value at the specified index of the {@code data.b} field. */ + @NativeType("char") + public byte data_b(int index) { return ndata_b(address(), index); } + /** @return a {@link ShortBuffer} view of the {@code data.s} field. */ + @NativeType("short[10]") + public ShortBuffer data_s() { return ndata_s(address()); } + /** @return the value at the specified index of the {@code data.s} field. */ + public short data_s(int index) { return ndata_s(address(), index); } + /** @return a {@link CLongBuffer} view of the {@code data.l} field. */ + @NativeType("long[5]") + public CLongBuffer data_l() { return ndata_l(address()); } + /** @return the value at the specified index of the {@code data.l} field. */ + public long data_l(int index) { return ndata_l(address(), index); } + + /** Sets the specified value to the {@code type} field. */ + public XClientMessageEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XClientMessageEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XClientMessageEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XClientMessageEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XClientMessageEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@code message_type} field. */ + public XClientMessageEvent message_type(@NativeType("Atom") long value) { nmessage_type(address(), value); return this; } + /** Sets the specified value to the {@code format} field. */ + public XClientMessageEvent format(int value) { nformat(address(), value); return this; } + /** Copies the specified {@link ByteBuffer} to the {@code b} field. */ + public XClientMessageEvent data_b(@NativeType("char[20]") ByteBuffer value) { ndata_b(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code b} field. */ + public XClientMessageEvent data_b(int index, @NativeType("char") byte value) { ndata_b(address(), index, value); return this; } + /** Copies the specified {@link ShortBuffer} to the {@code s} field. */ + public XClientMessageEvent data_s(@NativeType("short[10]") ShortBuffer value) { ndata_s(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code s} field. */ + public XClientMessageEvent data_s(int index, short value) { ndata_s(address(), index, value); return this; } + /** Copies the specified {@link CLongBuffer} to the {@code l} field. */ + public XClientMessageEvent data_l(@NativeType("long[5]") CLongBuffer value) { ndata_l(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code l} field. */ + public XClientMessageEvent data_l(int index, long value) { ndata_l(address(), index, value); return this; } + + /** Initializes this struct with the specified values. */ + public XClientMessageEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + long message_type, + int format, + ByteBuffer data_b, + ShortBuffer data_s, + CLongBuffer data_l + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + message_type(message_type); + format(format); + data_b(data_b); + data_s(data_s); + data_l(data_l); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XClientMessageEvent set(XClientMessageEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XClientMessageEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XClientMessageEvent malloc() { + return new XClientMessageEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XClientMessageEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XClientMessageEvent calloc() { + return new XClientMessageEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XClientMessageEvent} instance allocated with {@link BufferUtils}. */ + public static XClientMessageEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XClientMessageEvent(memAddress(container), container); + } + + /** Returns a new {@code XClientMessageEvent} instance for the specified memory address. */ + public static XClientMessageEvent create(long address) { + return new XClientMessageEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XClientMessageEvent createSafe(long address) { + return address == NULL ? null : new XClientMessageEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XClientMessageEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XClientMessageEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XClientMessageEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XClientMessageEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XClientMessageEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XClientMessageEvent malloc(MemoryStack stack) { + return new XClientMessageEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XClientMessageEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XClientMessageEvent calloc(MemoryStack stack) { + return new XClientMessageEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XClientMessageEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XClientMessageEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XClientMessageEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XClientMessageEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XClientMessageEvent.WINDOW); } + /** Unsafe version of {@link #message_type}. */ + public static long nmessage_type(long struct) { return memGetCLong(struct + XClientMessageEvent.MESSAGE_TYPE); } + /** Unsafe version of {@link #format}. */ + public static int nformat(long struct) { return UNSAFE.getInt(null, struct + XClientMessageEvent.FORMAT); } + /** Unsafe version of {@link #data_b}. */ + public static ByteBuffer ndata_b(long struct) { return memByteBuffer(struct + XClientMessageEvent.DATA_B, 20); } + /** Unsafe version of {@link #data_b(int) data_b}. */ + public static byte ndata_b(long struct, int index) { + return UNSAFE.getByte(null, struct + XClientMessageEvent.DATA_B + check(index, 20) * 1); + } + /** Unsafe version of {@link #data_s}. */ + public static ShortBuffer ndata_s(long struct) { return memShortBuffer(struct + XClientMessageEvent.DATA_S, 10); } + /** Unsafe version of {@link #data_s(int) data_s}. */ + public static short ndata_s(long struct, int index) { + return UNSAFE.getShort(null, struct + XClientMessageEvent.DATA_S + check(index, 10) * 2); + } + /** Unsafe version of {@link #data_l}. */ + public static CLongBuffer ndata_l(long struct) { return memCLongBuffer(struct + XClientMessageEvent.DATA_L, 5); } + /** Unsafe version of {@link #data_l(int) data_l}. */ + public static long ndata_l(long struct, int index) { + return memGetCLong(struct + XClientMessageEvent.DATA_L + check(index, 5) * CLONG_SIZE); + } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XClientMessageEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XClientMessageEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XClientMessageEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XClientMessageEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XClientMessageEvent.WINDOW, value); } + /** Unsafe version of {@link #message_type(long) message_type}. */ + public static void nmessage_type(long struct, long value) { memPutCLong(struct + XClientMessageEvent.MESSAGE_TYPE, value); } + /** Unsafe version of {@link #format(int) format}. */ + public static void nformat(long struct, int value) { UNSAFE.putInt(null, struct + XClientMessageEvent.FORMAT, value); } + /** Unsafe version of {@link #data_b(ByteBuffer) data_b}. */ + public static void ndata_b(long struct, ByteBuffer value) { + if (CHECKS) { checkGT(value, 20); } + memCopy(memAddress(value), struct + XClientMessageEvent.DATA_B, value.remaining() * 1); + } + /** Unsafe version of {@link #data_b(int, byte) data_b}. */ + public static void ndata_b(long struct, int index, byte value) { + UNSAFE.putByte(null, struct + XClientMessageEvent.DATA_B + check(index, 20) * 1, value); + } + /** Unsafe version of {@link #data_s(ShortBuffer) data_s}. */ + public static void ndata_s(long struct, ShortBuffer value) { + if (CHECKS) { checkGT(value, 10); } + memCopy(memAddress(value), struct + XClientMessageEvent.DATA_S, value.remaining() * 2); + } + /** Unsafe version of {@link #data_s(int, short) data_s}. */ + public static void ndata_s(long struct, int index, short value) { + UNSAFE.putShort(null, struct + XClientMessageEvent.DATA_S + check(index, 10) * 2, value); + } + /** Unsafe version of {@link #data_l(CLongBuffer) data_l}. */ + public static void ndata_l(long struct, CLongBuffer value) { + if (CHECKS) { checkGT(value, 5); } + memCopy(memAddress(value), struct + XClientMessageEvent.DATA_L, value.remaining() * CLONG_SIZE); + } + /** Unsafe version of {@link #data_l(int, long) data_l}. */ + public static void ndata_l(long struct, int index, long value) { + memPutCLong(struct + XClientMessageEvent.DATA_L + check(index, 5) * CLONG_SIZE, value); + } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XClientMessageEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XClientMessageEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XClientMessageEvent ELEMENT_FACTORY = XClientMessageEvent.create(-1L); + + /** + * Creates a new {@code XClientMessageEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XClientMessageEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XClientMessageEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XClientMessageEvent.ntype(address()); } + /** @return the value of the {@link XClientMessageEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XClientMessageEvent.nserial(address()); } + /** @return the value of the {@link XClientMessageEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XClientMessageEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XClientMessageEvent#display} field. */ + @NativeType("Display *") + public long display() { return XClientMessageEvent.ndisplay(address()); } + /** @return the value of the {@link XClientMessageEvent#window} field. */ + @NativeType("Window") + public long window() { return XClientMessageEvent.nwindow(address()); } + /** @return the value of the {@code message_type} field. */ + @NativeType("Atom") + public long message_type() { return XClientMessageEvent.nmessage_type(address()); } + /** @return the value of the {@code format} field. */ + public int format() { return XClientMessageEvent.nformat(address()); } + /** @return a {@link ByteBuffer} view of the {@code data.b} field. */ + @NativeType("char[20]") + public ByteBuffer data_b() { return XClientMessageEvent.ndata_b(address()); } + /** @return the value at the specified index of the {@code data.b} field. */ + @NativeType("char") + public byte data_b(int index) { return XClientMessageEvent.ndata_b(address(), index); } + /** @return a {@link ShortBuffer} view of the {@code data.s} field. */ + @NativeType("short[10]") + public ShortBuffer data_s() { return XClientMessageEvent.ndata_s(address()); } + /** @return the value at the specified index of the {@code data.s} field. */ + public short data_s(int index) { return XClientMessageEvent.ndata_s(address(), index); } + /** @return a {@link CLongBuffer} view of the {@code data.l} field. */ + @NativeType("long[5]") + public CLongBuffer data_l() { return XClientMessageEvent.ndata_l(address()); } + /** @return the value at the specified index of the {@code data.l} field. */ + public long data_l(int index) { return XClientMessageEvent.ndata_l(address(), index); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XClientMessageEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XClientMessageEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XClientMessageEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XClientMessageEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XClientMessageEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XClientMessageEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XClientMessageEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XClientMessageEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XClientMessageEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@code message_type} field. */ + public Buffer message_type(@NativeType("Atom") long value) { XClientMessageEvent.nmessage_type(address(), value); return this; } + /** Sets the specified value to the {@code format} field. */ + public Buffer format(int value) { XClientMessageEvent.nformat(address(), value); return this; } + /** Copies the specified {@link ByteBuffer} to the {@code b} field. */ + public Buffer data_b(@NativeType("char[20]") ByteBuffer value) { XClientMessageEvent.ndata_b(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code b} field. */ + public Buffer data_b(int index, @NativeType("char") byte value) { XClientMessageEvent.ndata_b(address(), index, value); return this; } + /** Copies the specified {@link ShortBuffer} to the {@code s} field. */ + public Buffer data_s(@NativeType("short[10]") ShortBuffer value) { XClientMessageEvent.ndata_s(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code s} field. */ + public Buffer data_s(int index, short value) { XClientMessageEvent.ndata_s(address(), index, value); return this; } + /** Copies the specified {@link CLongBuffer} to the {@code l} field. */ + public Buffer data_l(@NativeType("long[5]") CLongBuffer value) { XClientMessageEvent.ndata_l(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code l} field. */ + public Buffer data_l(int index, long value) { XClientMessageEvent.ndata_l(address(), index, value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XColormapEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XColormapEvent.java new file mode 100644 index 000000000..83575b93a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XColormapEvent.java @@ -0,0 +1,428 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XColormapEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     Colormap {@link #colormap};
    + *     int new;
    + *     int {@link #state};
    + * }
    + */ +public class XColormapEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + COLORMAP, + NEW, + STATE; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + COLORMAP = layout.offsetof(5); + NEW = layout.offsetof(6); + STATE = layout.offsetof(7); + } + + protected XColormapEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XColormapEvent create(long address, @Nullable ByteBuffer container) { + return new XColormapEvent(address, container); + } + + /** + * Creates a {@code XColormapEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XColormapEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** colormap or {@link X11#None} */ + @NativeType("Colormap") + public long colormap() { return ncolormap(address()); } + /** @return the value of the {@code new} field. */ + public int new$() { return nnew$(address()); } + /** one of:
    {@link X11#ColormapInstalled}{@link X11#ColormapUninstalled}
    */ + public int state() { return nstate(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XColormapEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XColormapEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XColormapEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XColormapEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XColormapEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #colormap} field. */ + public XColormapEvent colormap(@NativeType("Colormap") long value) { ncolormap(address(), value); return this; } + /** Sets the specified value to the {@code new} field. */ + public XColormapEvent new$(int value) { nnew$(address(), value); return this; } + /** Sets the specified value to the {@link #state} field. */ + public XColormapEvent state(int value) { nstate(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XColormapEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + long colormap, + int new$, + int state + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + colormap(colormap); + new$(new$); + state(state); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XColormapEvent set(XColormapEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XColormapEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XColormapEvent malloc() { + return new XColormapEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XColormapEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XColormapEvent calloc() { + return new XColormapEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XColormapEvent} instance allocated with {@link BufferUtils}. */ + public static XColormapEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XColormapEvent(memAddress(container), container); + } + + /** Returns a new {@code XColormapEvent} instance for the specified memory address. */ + public static XColormapEvent create(long address) { + return new XColormapEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XColormapEvent createSafe(long address) { + return address == NULL ? null : new XColormapEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XColormapEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XColormapEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XColormapEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XColormapEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XColormapEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XColormapEvent malloc(MemoryStack stack) { + return new XColormapEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XColormapEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XColormapEvent calloc(MemoryStack stack) { + return new XColormapEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XColormapEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XColormapEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XColormapEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XColormapEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XColormapEvent.WINDOW); } + /** Unsafe version of {@link #colormap}. */ + public static long ncolormap(long struct) { return memGetCLong(struct + XColormapEvent.COLORMAP); } + /** Unsafe version of {@link #new$}. */ + public static int nnew$(long struct) { return UNSAFE.getInt(null, struct + XColormapEvent.NEW); } + /** Unsafe version of {@link #state}. */ + public static int nstate(long struct) { return UNSAFE.getInt(null, struct + XColormapEvent.STATE); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XColormapEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XColormapEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XColormapEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XColormapEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XColormapEvent.WINDOW, value); } + /** Unsafe version of {@link #colormap(long) colormap}. */ + public static void ncolormap(long struct, long value) { memPutCLong(struct + XColormapEvent.COLORMAP, value); } + /** Unsafe version of {@link #new$(int) new$}. */ + public static void nnew$(long struct, int value) { UNSAFE.putInt(null, struct + XColormapEvent.NEW, value); } + /** Unsafe version of {@link #state(int) state}. */ + public static void nstate(long struct, int value) { UNSAFE.putInt(null, struct + XColormapEvent.STATE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XColormapEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XColormapEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XColormapEvent ELEMENT_FACTORY = XColormapEvent.create(-1L); + + /** + * Creates a new {@code XColormapEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XColormapEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XColormapEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XColormapEvent.ntype(address()); } + /** @return the value of the {@link XColormapEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XColormapEvent.nserial(address()); } + /** @return the value of the {@link XColormapEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XColormapEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XColormapEvent#display} field. */ + @NativeType("Display *") + public long display() { return XColormapEvent.ndisplay(address()); } + /** @return the value of the {@link XColormapEvent#window} field. */ + @NativeType("Window") + public long window() { return XColormapEvent.nwindow(address()); } + /** @return the value of the {@link XColormapEvent#colormap} field. */ + @NativeType("Colormap") + public long colormap() { return XColormapEvent.ncolormap(address()); } + /** @return the value of the {@code new} field. */ + public int new$() { return XColormapEvent.nnew$(address()); } + /** @return the value of the {@link XColormapEvent#state} field. */ + public int state() { return XColormapEvent.nstate(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XColormapEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XColormapEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XColormapEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XColormapEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XColormapEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XColormapEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XColormapEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XColormapEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XColormapEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XColormapEvent#colormap} field. */ + public Buffer colormap(@NativeType("Colormap") long value) { XColormapEvent.ncolormap(address(), value); return this; } + /** Sets the specified value to the {@code new} field. */ + public Buffer new$(int value) { XColormapEvent.nnew$(address(), value); return this; } + /** Sets the specified value to the {@link XColormapEvent#state} field. */ + public Buffer state(int value) { XColormapEvent.nstate(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XConfigureEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XConfigureEvent.java new file mode 100644 index 000000000..e8f158b75 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XConfigureEvent.java @@ -0,0 +1,504 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Motion event. + * + *

    Layout

    + * + *
    
    + * struct XConfigureEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     int x;
    + *     int y;
    + *     int width;
    + *     int height;
    + *     int border_width;
    + *     Window above;
    + *     Bool override_redirect;
    + * }
    + */ +public class XConfigureEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + X, + Y, + WIDTH, + HEIGHT, + BORDER_WIDTH, + ABOVE, + OVERRIDE_REDIRECT; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(CLONG_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + X = layout.offsetof(5); + Y = layout.offsetof(6); + WIDTH = layout.offsetof(7); + HEIGHT = layout.offsetof(8); + BORDER_WIDTH = layout.offsetof(9); + ABOVE = layout.offsetof(10); + OVERRIDE_REDIRECT = layout.offsetof(11); + } + + protected XConfigureEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XConfigureEvent create(long address, @Nullable ByteBuffer container) { + return new XConfigureEvent(address, container); + } + + /** + * Creates a {@code XConfigureEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XConfigureEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return ny(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return nheight(address()); } + /** @return the value of the {@code border_width} field. */ + public int border_width() { return nborder_width(address()); } + /** @return the value of the {@code above} field. */ + @NativeType("Window") + public long above() { return nabove(address()); } + /** @return the value of the {@code override_redirect} field. */ + @NativeType("Bool") + public boolean override_redirect() { return noverride_redirect(address()) != 0; } + + /** Sets the specified value to the {@code type} field. */ + public XConfigureEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XConfigureEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XConfigureEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XConfigureEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XConfigureEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public XConfigureEvent x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public XConfigureEvent y(int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public XConfigureEvent width(int value) { nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public XConfigureEvent height(int value) { nheight(address(), value); return this; } + /** Sets the specified value to the {@code border_width} field. */ + public XConfigureEvent border_width(int value) { nborder_width(address(), value); return this; } + /** Sets the specified value to the {@code above} field. */ + public XConfigureEvent above(@NativeType("Window") long value) { nabove(address(), value); return this; } + /** Sets the specified value to the {@code override_redirect} field. */ + public XConfigureEvent override_redirect(@NativeType("Bool") boolean value) { noverride_redirect(address(), value ? 1 : 0); return this; } + + /** Initializes this struct with the specified values. */ + public XConfigureEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + int x, + int y, + int width, + int height, + int border_width, + long above, + boolean override_redirect + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + x(x); + y(y); + width(width); + height(height); + border_width(border_width); + above(above); + override_redirect(override_redirect); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XConfigureEvent set(XConfigureEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XConfigureEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XConfigureEvent malloc() { + return new XConfigureEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XConfigureEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XConfigureEvent calloc() { + return new XConfigureEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XConfigureEvent} instance allocated with {@link BufferUtils}. */ + public static XConfigureEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XConfigureEvent(memAddress(container), container); + } + + /** Returns a new {@code XConfigureEvent} instance for the specified memory address. */ + public static XConfigureEvent create(long address) { + return new XConfigureEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XConfigureEvent createSafe(long address) { + return address == NULL ? null : new XConfigureEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XConfigureEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XConfigureEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XConfigureEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XConfigureEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XConfigureEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XConfigureEvent malloc(MemoryStack stack) { + return new XConfigureEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XConfigureEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XConfigureEvent calloc(MemoryStack stack) { + return new XConfigureEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XConfigureEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XConfigureEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XConfigureEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XConfigureEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XConfigureEvent.WINDOW); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + XConfigureEvent.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + XConfigureEvent.Y); } + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + XConfigureEvent.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + XConfigureEvent.HEIGHT); } + /** Unsafe version of {@link #border_width}. */ + public static int nborder_width(long struct) { return UNSAFE.getInt(null, struct + XConfigureEvent.BORDER_WIDTH); } + /** Unsafe version of {@link #above}. */ + public static long nabove(long struct) { return memGetCLong(struct + XConfigureEvent.ABOVE); } + /** Unsafe version of {@link #override_redirect}. */ + public static int noverride_redirect(long struct) { return UNSAFE.getInt(null, struct + XConfigureEvent.OVERRIDE_REDIRECT); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XConfigureEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XConfigureEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XConfigureEvent.WINDOW, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureEvent.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureEvent.Y, value); } + /** Unsafe version of {@link #width(int) width}. */ + public static void nwidth(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureEvent.WIDTH, value); } + /** Unsafe version of {@link #height(int) height}. */ + public static void nheight(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureEvent.HEIGHT, value); } + /** Unsafe version of {@link #border_width(int) border_width}. */ + public static void nborder_width(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureEvent.BORDER_WIDTH, value); } + /** Unsafe version of {@link #above(long) above}. */ + public static void nabove(long struct, long value) { memPutCLong(struct + XConfigureEvent.ABOVE, value); } + /** Unsafe version of {@link #override_redirect(boolean) override_redirect}. */ + public static void noverride_redirect(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureEvent.OVERRIDE_REDIRECT, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XConfigureEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XConfigureEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XConfigureEvent ELEMENT_FACTORY = XConfigureEvent.create(-1L); + + /** + * Creates a new {@code XConfigureEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XConfigureEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XConfigureEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XConfigureEvent.ntype(address()); } + /** @return the value of the {@link XConfigureEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XConfigureEvent.nserial(address()); } + /** @return the value of the {@link XConfigureEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XConfigureEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XConfigureEvent#display} field. */ + @NativeType("Display *") + public long display() { return XConfigureEvent.ndisplay(address()); } + /** @return the value of the {@link XConfigureEvent#window} field. */ + @NativeType("Window") + public long window() { return XConfigureEvent.nwindow(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return XConfigureEvent.nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return XConfigureEvent.ny(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return XConfigureEvent.nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return XConfigureEvent.nheight(address()); } + /** @return the value of the {@code border_width} field. */ + public int border_width() { return XConfigureEvent.nborder_width(address()); } + /** @return the value of the {@code above} field. */ + @NativeType("Window") + public long above() { return XConfigureEvent.nabove(address()); } + /** @return the value of the {@code override_redirect} field. */ + @NativeType("Bool") + public boolean override_redirect() { return XConfigureEvent.noverride_redirect(address()) != 0; } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XConfigureEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XConfigureEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XConfigureEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XConfigureEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XConfigureEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XConfigureEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XConfigureEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XConfigureEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XConfigureEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public Buffer x(int value) { XConfigureEvent.nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public Buffer y(int value) { XConfigureEvent.ny(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public Buffer width(int value) { XConfigureEvent.nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public Buffer height(int value) { XConfigureEvent.nheight(address(), value); return this; } + /** Sets the specified value to the {@code border_width} field. */ + public Buffer border_width(int value) { XConfigureEvent.nborder_width(address(), value); return this; } + /** Sets the specified value to the {@code above} field. */ + public Buffer above(@NativeType("Window") long value) { XConfigureEvent.nabove(address(), value); return this; } + /** Sets the specified value to the {@code override_redirect} field. */ + public Buffer override_redirect(@NativeType("Bool") boolean value) { XConfigureEvent.noverride_redirect(address(), value ? 1 : 0); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XConfigureRequestEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XConfigureRequestEvent.java new file mode 100644 index 000000000..a55fc5ef2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XConfigureRequestEvent.java @@ -0,0 +1,540 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XConfigureRequestEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window parent;
    + *     Window window;
    + *     int x;
    + *     int y;
    + *     int width;
    + *     int height;
    + *     int border_width;
    + *     Window above;
    + *     int {@link #detail};
    + *     unsigned long value_mask;
    + * }
    + */ +public class XConfigureRequestEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + PARENT, + WINDOW, + X, + Y, + WIDTH, + HEIGHT, + BORDER_WIDTH, + ABOVE, + DETAIL, + VALUE_MASK; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + PARENT = layout.offsetof(4); + WINDOW = layout.offsetof(5); + X = layout.offsetof(6); + Y = layout.offsetof(7); + WIDTH = layout.offsetof(8); + HEIGHT = layout.offsetof(9); + BORDER_WIDTH = layout.offsetof(10); + ABOVE = layout.offsetof(11); + DETAIL = layout.offsetof(12); + VALUE_MASK = layout.offsetof(13); + } + + protected XConfigureRequestEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XConfigureRequestEvent create(long address, @Nullable ByteBuffer container) { + return new XConfigureRequestEvent(address, container); + } + + /** + * Creates a {@code XConfigureRequestEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XConfigureRequestEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code parent} field. */ + @NativeType("Window") + public long parent() { return nparent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return ny(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return nheight(address()); } + /** @return the value of the {@code border_width} field. */ + public int border_width() { return nborder_width(address()); } + /** @return the value of the {@code above} field. */ + @NativeType("Window") + public long above() { return nabove(address()); } + /** one of:
    {@link X11#Above}{@link X11#Below}{@link X11#TopIf}{@link X11#BottomIf}{@link X11#Opposite}
    */ + public int detail() { return ndetail(address()); } + /** @return the value of the {@code value_mask} field. */ + @NativeType("unsigned long") + public long value_mask() { return nvalue_mask(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XConfigureRequestEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XConfigureRequestEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XConfigureRequestEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XConfigureRequestEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code parent} field. */ + public XConfigureRequestEvent parent(@NativeType("Window") long value) { nparent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public XConfigureRequestEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public XConfigureRequestEvent x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public XConfigureRequestEvent y(int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public XConfigureRequestEvent width(int value) { nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public XConfigureRequestEvent height(int value) { nheight(address(), value); return this; } + /** Sets the specified value to the {@code border_width} field. */ + public XConfigureRequestEvent border_width(int value) { nborder_width(address(), value); return this; } + /** Sets the specified value to the {@code above} field. */ + public XConfigureRequestEvent above(@NativeType("Window") long value) { nabove(address(), value); return this; } + /** Sets the specified value to the {@link #detail} field. */ + public XConfigureRequestEvent detail(int value) { ndetail(address(), value); return this; } + /** Sets the specified value to the {@code value_mask} field. */ + public XConfigureRequestEvent value_mask(@NativeType("unsigned long") long value) { nvalue_mask(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XConfigureRequestEvent set( + int type, + long serial, + boolean send_event, + long display, + long parent, + long window, + int x, + int y, + int width, + int height, + int border_width, + long above, + int detail, + long value_mask + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + parent(parent); + window(window); + x(x); + y(y); + width(width); + height(height); + border_width(border_width); + above(above); + detail(detail); + value_mask(value_mask); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XConfigureRequestEvent set(XConfigureRequestEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XConfigureRequestEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XConfigureRequestEvent malloc() { + return new XConfigureRequestEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XConfigureRequestEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XConfigureRequestEvent calloc() { + return new XConfigureRequestEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XConfigureRequestEvent} instance allocated with {@link BufferUtils}. */ + public static XConfigureRequestEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XConfigureRequestEvent(memAddress(container), container); + } + + /** Returns a new {@code XConfigureRequestEvent} instance for the specified memory address. */ + public static XConfigureRequestEvent create(long address) { + return new XConfigureRequestEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XConfigureRequestEvent createSafe(long address) { + return address == NULL ? null : new XConfigureRequestEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XConfigureRequestEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XConfigureRequestEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XConfigureRequestEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XConfigureRequestEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XConfigureRequestEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XConfigureRequestEvent malloc(MemoryStack stack) { + return new XConfigureRequestEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XConfigureRequestEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XConfigureRequestEvent calloc(MemoryStack stack) { + return new XConfigureRequestEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XConfigureRequestEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XConfigureRequestEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XConfigureRequestEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XConfigureRequestEvent.DISPLAY); } + /** Unsafe version of {@link #parent}. */ + public static long nparent(long struct) { return memGetCLong(struct + XConfigureRequestEvent.PARENT); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XConfigureRequestEvent.WINDOW); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + XConfigureRequestEvent.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + XConfigureRequestEvent.Y); } + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + XConfigureRequestEvent.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + XConfigureRequestEvent.HEIGHT); } + /** Unsafe version of {@link #border_width}. */ + public static int nborder_width(long struct) { return UNSAFE.getInt(null, struct + XConfigureRequestEvent.BORDER_WIDTH); } + /** Unsafe version of {@link #above}. */ + public static long nabove(long struct) { return memGetCLong(struct + XConfigureRequestEvent.ABOVE); } + /** Unsafe version of {@link #detail}. */ + public static int ndetail(long struct) { return UNSAFE.getInt(null, struct + XConfigureRequestEvent.DETAIL); } + /** Unsafe version of {@link #value_mask}. */ + public static long nvalue_mask(long struct) { return memGetCLong(struct + XConfigureRequestEvent.VALUE_MASK); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureRequestEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XConfigureRequestEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureRequestEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XConfigureRequestEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #parent(long) parent}. */ + public static void nparent(long struct, long value) { memPutCLong(struct + XConfigureRequestEvent.PARENT, value); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XConfigureRequestEvent.WINDOW, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureRequestEvent.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureRequestEvent.Y, value); } + /** Unsafe version of {@link #width(int) width}. */ + public static void nwidth(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureRequestEvent.WIDTH, value); } + /** Unsafe version of {@link #height(int) height}. */ + public static void nheight(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureRequestEvent.HEIGHT, value); } + /** Unsafe version of {@link #border_width(int) border_width}. */ + public static void nborder_width(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureRequestEvent.BORDER_WIDTH, value); } + /** Unsafe version of {@link #above(long) above}. */ + public static void nabove(long struct, long value) { memPutCLong(struct + XConfigureRequestEvent.ABOVE, value); } + /** Unsafe version of {@link #detail(int) detail}. */ + public static void ndetail(long struct, int value) { UNSAFE.putInt(null, struct + XConfigureRequestEvent.DETAIL, value); } + /** Unsafe version of {@link #value_mask(long) value_mask}. */ + public static void nvalue_mask(long struct, long value) { memPutCLong(struct + XConfigureRequestEvent.VALUE_MASK, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XConfigureRequestEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XConfigureRequestEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XConfigureRequestEvent ELEMENT_FACTORY = XConfigureRequestEvent.create(-1L); + + /** + * Creates a new {@code XConfigureRequestEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XConfigureRequestEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XConfigureRequestEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XConfigureRequestEvent.ntype(address()); } + /** @return the value of the {@link XConfigureRequestEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XConfigureRequestEvent.nserial(address()); } + /** @return the value of the {@link XConfigureRequestEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XConfigureRequestEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XConfigureRequestEvent#display} field. */ + @NativeType("Display *") + public long display() { return XConfigureRequestEvent.ndisplay(address()); } + /** @return the value of the {@code parent} field. */ + @NativeType("Window") + public long parent() { return XConfigureRequestEvent.nparent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return XConfigureRequestEvent.nwindow(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return XConfigureRequestEvent.nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return XConfigureRequestEvent.ny(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return XConfigureRequestEvent.nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return XConfigureRequestEvent.nheight(address()); } + /** @return the value of the {@code border_width} field. */ + public int border_width() { return XConfigureRequestEvent.nborder_width(address()); } + /** @return the value of the {@code above} field. */ + @NativeType("Window") + public long above() { return XConfigureRequestEvent.nabove(address()); } + /** @return the value of the {@link XConfigureRequestEvent#detail} field. */ + public int detail() { return XConfigureRequestEvent.ndetail(address()); } + /** @return the value of the {@code value_mask} field. */ + @NativeType("unsigned long") + public long value_mask() { return XConfigureRequestEvent.nvalue_mask(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XConfigureRequestEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XConfigureRequestEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XConfigureRequestEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XConfigureRequestEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XConfigureRequestEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XConfigureRequestEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XConfigureRequestEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code parent} field. */ + public Buffer parent(@NativeType("Window") long value) { XConfigureRequestEvent.nparent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public Buffer window(@NativeType("Window") long value) { XConfigureRequestEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public Buffer x(int value) { XConfigureRequestEvent.nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public Buffer y(int value) { XConfigureRequestEvent.ny(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public Buffer width(int value) { XConfigureRequestEvent.nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public Buffer height(int value) { XConfigureRequestEvent.nheight(address(), value); return this; } + /** Sets the specified value to the {@code border_width} field. */ + public Buffer border_width(int value) { XConfigureRequestEvent.nborder_width(address(), value); return this; } + /** Sets the specified value to the {@code above} field. */ + public Buffer above(@NativeType("Window") long value) { XConfigureRequestEvent.nabove(address(), value); return this; } + /** Sets the specified value to the {@link XConfigureRequestEvent#detail} field. */ + public Buffer detail(int value) { XConfigureRequestEvent.ndetail(address(), value); return this; } + /** Sets the specified value to the {@code value_mask} field. */ + public Buffer value_mask(@NativeType("unsigned long") long value) { XConfigureRequestEvent.nvalue_mask(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCreateWindowEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCreateWindowEvent.java new file mode 100644 index 000000000..9549d32c8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCreateWindowEvent.java @@ -0,0 +1,500 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XCreateWindowEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #parent};
    + *     Window {@link #window};
    + *     int {@link #x};
    + *     int {@link #y};
    + *     int {@link #width};
    + *     int {@link #height};
    + *     int {@link #border_width};
    + *     int {@link #override_redirect};
    + * }
    + */ +public class XCreateWindowEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + PARENT, + WINDOW, + X, + Y, + WIDTH, + HEIGHT, + BORDER_WIDTH, + OVERRIDE_REDIRECT; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + PARENT = layout.offsetof(4); + WINDOW = layout.offsetof(5); + X = layout.offsetof(6); + Y = layout.offsetof(7); + WIDTH = layout.offsetof(8); + HEIGHT = layout.offsetof(9); + BORDER_WIDTH = layout.offsetof(10); + OVERRIDE_REDIRECT = layout.offsetof(11); + } + + protected XCreateWindowEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XCreateWindowEvent create(long address, @Nullable ByteBuffer container) { + return new XCreateWindowEvent(address, container); + } + + /** + * Creates a {@code XCreateWindowEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XCreateWindowEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** parent of the window */ + @NativeType("Window") + public long parent() { return nparent(address()); } + /** window id of window created */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** window location */ + public int x() { return nx(address()); } + /** window location */ + public int y() { return ny(address()); } + /** size of window */ + public int width() { return nwidth(address()); } + /** size of window */ + public int height() { return nheight(address()); } + /** border width */ + public int border_width() { return nborder_width(address()); } + /** creation should be overridden */ + public int override_redirect() { return noverride_redirect(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XCreateWindowEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XCreateWindowEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XCreateWindowEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XCreateWindowEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #parent} field. */ + public XCreateWindowEvent parent(@NativeType("Window") long value) { nparent(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XCreateWindowEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #x} field. */ + public XCreateWindowEvent x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@link #y} field. */ + public XCreateWindowEvent y(int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@link #width} field. */ + public XCreateWindowEvent width(int value) { nwidth(address(), value); return this; } + /** Sets the specified value to the {@link #height} field. */ + public XCreateWindowEvent height(int value) { nheight(address(), value); return this; } + /** Sets the specified value to the {@link #border_width} field. */ + public XCreateWindowEvent border_width(int value) { nborder_width(address(), value); return this; } + /** Sets the specified value to the {@link #override_redirect} field. */ + public XCreateWindowEvent override_redirect(int value) { noverride_redirect(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XCreateWindowEvent set( + int type, + long serial, + boolean send_event, + long display, + long parent, + long window, + int x, + int y, + int width, + int height, + int border_width, + int override_redirect + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + parent(parent); + window(window); + x(x); + y(y); + width(width); + height(height); + border_width(border_width); + override_redirect(override_redirect); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XCreateWindowEvent set(XCreateWindowEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XCreateWindowEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XCreateWindowEvent malloc() { + return new XCreateWindowEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XCreateWindowEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XCreateWindowEvent calloc() { + return new XCreateWindowEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XCreateWindowEvent} instance allocated with {@link BufferUtils}. */ + public static XCreateWindowEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XCreateWindowEvent(memAddress(container), container); + } + + /** Returns a new {@code XCreateWindowEvent} instance for the specified memory address. */ + public static XCreateWindowEvent create(long address) { + return new XCreateWindowEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XCreateWindowEvent createSafe(long address) { + return address == NULL ? null : new XCreateWindowEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XCreateWindowEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XCreateWindowEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XCreateWindowEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XCreateWindowEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XCreateWindowEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XCreateWindowEvent malloc(MemoryStack stack) { + return new XCreateWindowEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XCreateWindowEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XCreateWindowEvent calloc(MemoryStack stack) { + return new XCreateWindowEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XCreateWindowEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XCreateWindowEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XCreateWindowEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XCreateWindowEvent.DISPLAY); } + /** Unsafe version of {@link #parent}. */ + public static long nparent(long struct) { return memGetCLong(struct + XCreateWindowEvent.PARENT); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XCreateWindowEvent.WINDOW); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + XCreateWindowEvent.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + XCreateWindowEvent.Y); } + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + XCreateWindowEvent.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + XCreateWindowEvent.HEIGHT); } + /** Unsafe version of {@link #border_width}. */ + public static int nborder_width(long struct) { return UNSAFE.getInt(null, struct + XCreateWindowEvent.BORDER_WIDTH); } + /** Unsafe version of {@link #override_redirect}. */ + public static int noverride_redirect(long struct) { return UNSAFE.getInt(null, struct + XCreateWindowEvent.OVERRIDE_REDIRECT); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XCreateWindowEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XCreateWindowEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XCreateWindowEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XCreateWindowEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #parent(long) parent}. */ + public static void nparent(long struct, long value) { memPutCLong(struct + XCreateWindowEvent.PARENT, value); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XCreateWindowEvent.WINDOW, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + XCreateWindowEvent.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + XCreateWindowEvent.Y, value); } + /** Unsafe version of {@link #width(int) width}. */ + public static void nwidth(long struct, int value) { UNSAFE.putInt(null, struct + XCreateWindowEvent.WIDTH, value); } + /** Unsafe version of {@link #height(int) height}. */ + public static void nheight(long struct, int value) { UNSAFE.putInt(null, struct + XCreateWindowEvent.HEIGHT, value); } + /** Unsafe version of {@link #border_width(int) border_width}. */ + public static void nborder_width(long struct, int value) { UNSAFE.putInt(null, struct + XCreateWindowEvent.BORDER_WIDTH, value); } + /** Unsafe version of {@link #override_redirect(int) override_redirect}. */ + public static void noverride_redirect(long struct, int value) { UNSAFE.putInt(null, struct + XCreateWindowEvent.OVERRIDE_REDIRECT, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XCreateWindowEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XCreateWindowEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XCreateWindowEvent ELEMENT_FACTORY = XCreateWindowEvent.create(-1L); + + /** + * Creates a new {@code XCreateWindowEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XCreateWindowEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XCreateWindowEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XCreateWindowEvent.ntype(address()); } + /** @return the value of the {@link XCreateWindowEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XCreateWindowEvent.nserial(address()); } + /** @return the value of the {@link XCreateWindowEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XCreateWindowEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XCreateWindowEvent#display} field. */ + @NativeType("Display *") + public long display() { return XCreateWindowEvent.ndisplay(address()); } + /** @return the value of the {@link XCreateWindowEvent#parent} field. */ + @NativeType("Window") + public long parent() { return XCreateWindowEvent.nparent(address()); } + /** @return the value of the {@link XCreateWindowEvent#window} field. */ + @NativeType("Window") + public long window() { return XCreateWindowEvent.nwindow(address()); } + /** @return the value of the {@link XCreateWindowEvent#x} field. */ + public int x() { return XCreateWindowEvent.nx(address()); } + /** @return the value of the {@link XCreateWindowEvent#y} field. */ + public int y() { return XCreateWindowEvent.ny(address()); } + /** @return the value of the {@link XCreateWindowEvent#width} field. */ + public int width() { return XCreateWindowEvent.nwidth(address()); } + /** @return the value of the {@link XCreateWindowEvent#height} field. */ + public int height() { return XCreateWindowEvent.nheight(address()); } + /** @return the value of the {@link XCreateWindowEvent#border_width} field. */ + public int border_width() { return XCreateWindowEvent.nborder_width(address()); } + /** @return the value of the {@link XCreateWindowEvent#override_redirect} field. */ + public int override_redirect() { return XCreateWindowEvent.noverride_redirect(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XCreateWindowEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XCreateWindowEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XCreateWindowEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XCreateWindowEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XCreateWindowEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XCreateWindowEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XCreateWindowEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XCreateWindowEvent#parent} field. */ + public Buffer parent(@NativeType("Window") long value) { XCreateWindowEvent.nparent(address(), value); return this; } + /** Sets the specified value to the {@link XCreateWindowEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XCreateWindowEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XCreateWindowEvent#x} field. */ + public Buffer x(int value) { XCreateWindowEvent.nx(address(), value); return this; } + /** Sets the specified value to the {@link XCreateWindowEvent#y} field. */ + public Buffer y(int value) { XCreateWindowEvent.ny(address(), value); return this; } + /** Sets the specified value to the {@link XCreateWindowEvent#width} field. */ + public Buffer width(int value) { XCreateWindowEvent.nwidth(address(), value); return this; } + /** Sets the specified value to the {@link XCreateWindowEvent#height} field. */ + public Buffer height(int value) { XCreateWindowEvent.nheight(address(), value); return this; } + /** Sets the specified value to the {@link XCreateWindowEvent#border_width} field. */ + public Buffer border_width(int value) { XCreateWindowEvent.nborder_width(address(), value); return this; } + /** Sets the specified value to the {@link XCreateWindowEvent#override_redirect} field. */ + public Buffer override_redirect(int value) { XCreateWindowEvent.noverride_redirect(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCrossingEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCrossingEvent.java new file mode 100644 index 000000000..8a9d2326f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XCrossingEvent.java @@ -0,0 +1,596 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XCrossingEvent {
    + *     int {@link #type};
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     Window {@link #root};
    + *     Window {@link #subwindow};
    + *     Time {@link #time};
    + *     int {@link #x};
    + *     int {@link #y};
    + *     int {@link #x_root};
    + *     int {@link #y_root};
    + *     int {@link #mode};
    + *     int detail;
    + *     int {@link #same_screen};
    + *     int {@link #focus};
    + *     unsigned int {@link #state};
    + * }
    + */ +public class XCrossingEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + ROOT, + SUBWINDOW, + TIME, + X, + Y, + X_ROOT, + Y_ROOT, + MODE, + DETAIL, + SAME_SCREEN, + FOCUS, + STATE; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + ROOT = layout.offsetof(5); + SUBWINDOW = layout.offsetof(6); + TIME = layout.offsetof(7); + X = layout.offsetof(8); + Y = layout.offsetof(9); + X_ROOT = layout.offsetof(10); + Y_ROOT = layout.offsetof(11); + MODE = layout.offsetof(12); + DETAIL = layout.offsetof(13); + SAME_SCREEN = layout.offsetof(14); + FOCUS = layout.offsetof(15); + STATE = layout.offsetof(16); + } + + protected XCrossingEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XCrossingEvent create(long address, @Nullable ByteBuffer container) { + return new XCrossingEvent(address, container); + } + + /** + * Creates a {@code XCrossingEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XCrossingEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** of event */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** root window that the event occurred on */ + @NativeType("Window") + public long root() { return nroot(address()); } + /** child window */ + @NativeType("Window") + public long subwindow() { return nsubwindow(address()); } + /** milliseconds */ + @NativeType("Time") + public long time() { return ntime(address()); } + /** pointer x coordinate in event window */ + public int x() { return nx(address()); } + /** pointer y coordinate in event window */ + public int y() { return ny(address()); } + /** x coordinate relative to {@code root} */ + public int x_root() { return nx_root(address()); } + /** y coordinate relative to {@code root} */ + public int y_root() { return ny_root(address()); } + /** one of:
    {@link X11#NotifyNormal}{@link X11#NotifyGrab}{@link X11#NotifyUngrab}
    */ + public int mode() { return nmode(address()); } + /** @return the value of the {@code detail} field. */ + public int detail() { return ndetail(address()); } + /** same screen flag */ + public int same_screen() { return nsame_screen(address()); } + /** boolean focus */ + public int focus() { return nfocus(address()); } + /** key or button mask */ + @NativeType("unsigned int") + public int state() { return nstate(address()); } + + /** Sets the specified value to the {@link #type} field. */ + public XCrossingEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XCrossingEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XCrossingEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XCrossingEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XCrossingEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #root} field. */ + public XCrossingEvent root(@NativeType("Window") long value) { nroot(address(), value); return this; } + /** Sets the specified value to the {@link #subwindow} field. */ + public XCrossingEvent subwindow(@NativeType("Window") long value) { nsubwindow(address(), value); return this; } + /** Sets the specified value to the {@link #time} field. */ + public XCrossingEvent time(@NativeType("Time") long value) { ntime(address(), value); return this; } + /** Sets the specified value to the {@link #x} field. */ + public XCrossingEvent x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@link #y} field. */ + public XCrossingEvent y(int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@link #x_root} field. */ + public XCrossingEvent x_root(int value) { nx_root(address(), value); return this; } + /** Sets the specified value to the {@link #y_root} field. */ + public XCrossingEvent y_root(int value) { ny_root(address(), value); return this; } + /** Sets the specified value to the {@link #mode} field. */ + public XCrossingEvent mode(int value) { nmode(address(), value); return this; } + /** Sets the specified value to the {@code detail} field. */ + public XCrossingEvent detail(int value) { ndetail(address(), value); return this; } + /** Sets the specified value to the {@link #same_screen} field. */ + public XCrossingEvent same_screen(int value) { nsame_screen(address(), value); return this; } + /** Sets the specified value to the {@link #focus} field. */ + public XCrossingEvent focus(int value) { nfocus(address(), value); return this; } + /** Sets the specified value to the {@link #state} field. */ + public XCrossingEvent state(@NativeType("unsigned int") int value) { nstate(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XCrossingEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + long root, + long subwindow, + long time, + int x, + int y, + int x_root, + int y_root, + int mode, + int detail, + int same_screen, + int focus, + int state + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + root(root); + subwindow(subwindow); + time(time); + x(x); + y(y); + x_root(x_root); + y_root(y_root); + mode(mode); + detail(detail); + same_screen(same_screen); + focus(focus); + state(state); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XCrossingEvent set(XCrossingEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XCrossingEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XCrossingEvent malloc() { + return new XCrossingEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XCrossingEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XCrossingEvent calloc() { + return new XCrossingEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XCrossingEvent} instance allocated with {@link BufferUtils}. */ + public static XCrossingEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XCrossingEvent(memAddress(container), container); + } + + /** Returns a new {@code XCrossingEvent} instance for the specified memory address. */ + public static XCrossingEvent create(long address) { + return new XCrossingEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XCrossingEvent createSafe(long address) { + return address == NULL ? null : new XCrossingEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XCrossingEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XCrossingEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XCrossingEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XCrossingEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XCrossingEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XCrossingEvent malloc(MemoryStack stack) { + return new XCrossingEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XCrossingEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XCrossingEvent calloc(MemoryStack stack) { + return new XCrossingEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XCrossingEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XCrossingEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XCrossingEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XCrossingEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XCrossingEvent.WINDOW); } + /** Unsafe version of {@link #root}. */ + public static long nroot(long struct) { return memGetCLong(struct + XCrossingEvent.ROOT); } + /** Unsafe version of {@link #subwindow}. */ + public static long nsubwindow(long struct) { return memGetCLong(struct + XCrossingEvent.SUBWINDOW); } + /** Unsafe version of {@link #time}. */ + public static long ntime(long struct) { return memGetCLong(struct + XCrossingEvent.TIME); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + XCrossingEvent.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + XCrossingEvent.Y); } + /** Unsafe version of {@link #x_root}. */ + public static int nx_root(long struct) { return UNSAFE.getInt(null, struct + XCrossingEvent.X_ROOT); } + /** Unsafe version of {@link #y_root}. */ + public static int ny_root(long struct) { return UNSAFE.getInt(null, struct + XCrossingEvent.Y_ROOT); } + /** Unsafe version of {@link #mode}. */ + public static int nmode(long struct) { return UNSAFE.getInt(null, struct + XCrossingEvent.MODE); } + /** Unsafe version of {@link #detail}. */ + public static int ndetail(long struct) { return UNSAFE.getInt(null, struct + XCrossingEvent.DETAIL); } + /** Unsafe version of {@link #same_screen}. */ + public static int nsame_screen(long struct) { return UNSAFE.getInt(null, struct + XCrossingEvent.SAME_SCREEN); } + /** Unsafe version of {@link #focus}. */ + public static int nfocus(long struct) { return UNSAFE.getInt(null, struct + XCrossingEvent.FOCUS); } + /** Unsafe version of {@link #state}. */ + public static int nstate(long struct) { return UNSAFE.getInt(null, struct + XCrossingEvent.STATE); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XCrossingEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XCrossingEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XCrossingEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XCrossingEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XCrossingEvent.WINDOW, value); } + /** Unsafe version of {@link #root(long) root}. */ + public static void nroot(long struct, long value) { memPutCLong(struct + XCrossingEvent.ROOT, value); } + /** Unsafe version of {@link #subwindow(long) subwindow}. */ + public static void nsubwindow(long struct, long value) { memPutCLong(struct + XCrossingEvent.SUBWINDOW, value); } + /** Unsafe version of {@link #time(long) time}. */ + public static void ntime(long struct, long value) { memPutCLong(struct + XCrossingEvent.TIME, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + XCrossingEvent.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + XCrossingEvent.Y, value); } + /** Unsafe version of {@link #x_root(int) x_root}. */ + public static void nx_root(long struct, int value) { UNSAFE.putInt(null, struct + XCrossingEvent.X_ROOT, value); } + /** Unsafe version of {@link #y_root(int) y_root}. */ + public static void ny_root(long struct, int value) { UNSAFE.putInt(null, struct + XCrossingEvent.Y_ROOT, value); } + /** Unsafe version of {@link #mode(int) mode}. */ + public static void nmode(long struct, int value) { UNSAFE.putInt(null, struct + XCrossingEvent.MODE, value); } + /** Unsafe version of {@link #detail(int) detail}. */ + public static void ndetail(long struct, int value) { UNSAFE.putInt(null, struct + XCrossingEvent.DETAIL, value); } + /** Unsafe version of {@link #same_screen(int) same_screen}. */ + public static void nsame_screen(long struct, int value) { UNSAFE.putInt(null, struct + XCrossingEvent.SAME_SCREEN, value); } + /** Unsafe version of {@link #focus(int) focus}. */ + public static void nfocus(long struct, int value) { UNSAFE.putInt(null, struct + XCrossingEvent.FOCUS, value); } + /** Unsafe version of {@link #state(int) state}. */ + public static void nstate(long struct, int value) { UNSAFE.putInt(null, struct + XCrossingEvent.STATE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XCrossingEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XCrossingEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XCrossingEvent ELEMENT_FACTORY = XCrossingEvent.create(-1L); + + /** + * Creates a new {@code XCrossingEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XCrossingEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XCrossingEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link XCrossingEvent#type} field. */ + public int type() { return XCrossingEvent.ntype(address()); } + /** @return the value of the {@link XCrossingEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XCrossingEvent.nserial(address()); } + /** @return the value of the {@link XCrossingEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XCrossingEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XCrossingEvent#display} field. */ + @NativeType("Display *") + public long display() { return XCrossingEvent.ndisplay(address()); } + /** @return the value of the {@link XCrossingEvent#window} field. */ + @NativeType("Window") + public long window() { return XCrossingEvent.nwindow(address()); } + /** @return the value of the {@link XCrossingEvent#root} field. */ + @NativeType("Window") + public long root() { return XCrossingEvent.nroot(address()); } + /** @return the value of the {@link XCrossingEvent#subwindow} field. */ + @NativeType("Window") + public long subwindow() { return XCrossingEvent.nsubwindow(address()); } + /** @return the value of the {@link XCrossingEvent#time} field. */ + @NativeType("Time") + public long time() { return XCrossingEvent.ntime(address()); } + /** @return the value of the {@link XCrossingEvent#x} field. */ + public int x() { return XCrossingEvent.nx(address()); } + /** @return the value of the {@link XCrossingEvent#y} field. */ + public int y() { return XCrossingEvent.ny(address()); } + /** @return the value of the {@link XCrossingEvent#x_root} field. */ + public int x_root() { return XCrossingEvent.nx_root(address()); } + /** @return the value of the {@link XCrossingEvent#y_root} field. */ + public int y_root() { return XCrossingEvent.ny_root(address()); } + /** @return the value of the {@link XCrossingEvent#mode} field. */ + public int mode() { return XCrossingEvent.nmode(address()); } + /** @return the value of the {@code detail} field. */ + public int detail() { return XCrossingEvent.ndetail(address()); } + /** @return the value of the {@link XCrossingEvent#same_screen} field. */ + public int same_screen() { return XCrossingEvent.nsame_screen(address()); } + /** @return the value of the {@link XCrossingEvent#focus} field. */ + public int focus() { return XCrossingEvent.nfocus(address()); } + /** @return the value of the {@link XCrossingEvent#state} field. */ + @NativeType("unsigned int") + public int state() { return XCrossingEvent.nstate(address()); } + + /** Sets the specified value to the {@link XCrossingEvent#type} field. */ + public Buffer type(int value) { XCrossingEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XCrossingEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XCrossingEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XCrossingEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XCrossingEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XCrossingEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#root} field. */ + public Buffer root(@NativeType("Window") long value) { XCrossingEvent.nroot(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#subwindow} field. */ + public Buffer subwindow(@NativeType("Window") long value) { XCrossingEvent.nsubwindow(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#time} field. */ + public Buffer time(@NativeType("Time") long value) { XCrossingEvent.ntime(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#x} field. */ + public Buffer x(int value) { XCrossingEvent.nx(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#y} field. */ + public Buffer y(int value) { XCrossingEvent.ny(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#x_root} field. */ + public Buffer x_root(int value) { XCrossingEvent.nx_root(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#y_root} field. */ + public Buffer y_root(int value) { XCrossingEvent.ny_root(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#mode} field. */ + public Buffer mode(int value) { XCrossingEvent.nmode(address(), value); return this; } + /** Sets the specified value to the {@code detail} field. */ + public Buffer detail(int value) { XCrossingEvent.ndetail(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#same_screen} field. */ + public Buffer same_screen(int value) { XCrossingEvent.nsame_screen(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#focus} field. */ + public Buffer focus(int value) { XCrossingEvent.nfocus(address(), value); return this; } + /** Sets the specified value to the {@link XCrossingEvent#state} field. */ + public Buffer state(@NativeType("unsigned int") int value) { XCrossingEvent.nstate(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XDestroyWindowEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XDestroyWindowEvent.java new file mode 100644 index 000000000..f9acaaec2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XDestroyWindowEvent.java @@ -0,0 +1,392 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XDestroyWindowEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window event;
    + *     Window window;
    + * }
    + */ +public class XDestroyWindowEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + EVENT, + WINDOW; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + EVENT = layout.offsetof(4); + WINDOW = layout.offsetof(5); + } + + protected XDestroyWindowEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XDestroyWindowEvent create(long address, @Nullable ByteBuffer container) { + return new XDestroyWindowEvent(address, container); + } + + /** + * Creates a {@code XDestroyWindowEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XDestroyWindowEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return nwindow(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XDestroyWindowEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XDestroyWindowEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XDestroyWindowEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XDestroyWindowEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public XDestroyWindowEvent event(@NativeType("Window") long value) { nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public XDestroyWindowEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XDestroyWindowEvent set( + int type, + long serial, + boolean send_event, + long display, + long event, + long window + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + event(event); + window(window); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XDestroyWindowEvent set(XDestroyWindowEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XDestroyWindowEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XDestroyWindowEvent malloc() { + return new XDestroyWindowEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XDestroyWindowEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XDestroyWindowEvent calloc() { + return new XDestroyWindowEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XDestroyWindowEvent} instance allocated with {@link BufferUtils}. */ + public static XDestroyWindowEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XDestroyWindowEvent(memAddress(container), container); + } + + /** Returns a new {@code XDestroyWindowEvent} instance for the specified memory address. */ + public static XDestroyWindowEvent create(long address) { + return new XDestroyWindowEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XDestroyWindowEvent createSafe(long address) { + return address == NULL ? null : new XDestroyWindowEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XDestroyWindowEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XDestroyWindowEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XDestroyWindowEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XDestroyWindowEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XDestroyWindowEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XDestroyWindowEvent malloc(MemoryStack stack) { + return new XDestroyWindowEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XDestroyWindowEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XDestroyWindowEvent calloc(MemoryStack stack) { + return new XDestroyWindowEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XDestroyWindowEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XDestroyWindowEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XDestroyWindowEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XDestroyWindowEvent.DISPLAY); } + /** Unsafe version of {@link #event}. */ + public static long nevent(long struct) { return memGetCLong(struct + XDestroyWindowEvent.EVENT); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XDestroyWindowEvent.WINDOW); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XDestroyWindowEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XDestroyWindowEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XDestroyWindowEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XDestroyWindowEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #event(long) event}. */ + public static void nevent(long struct, long value) { memPutCLong(struct + XDestroyWindowEvent.EVENT, value); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XDestroyWindowEvent.WINDOW, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XDestroyWindowEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XDestroyWindowEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XDestroyWindowEvent ELEMENT_FACTORY = XDestroyWindowEvent.create(-1L); + + /** + * Creates a new {@code XDestroyWindowEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XDestroyWindowEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XDestroyWindowEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XDestroyWindowEvent.ntype(address()); } + /** @return the value of the {@link XDestroyWindowEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XDestroyWindowEvent.nserial(address()); } + /** @return the value of the {@link XDestroyWindowEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XDestroyWindowEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XDestroyWindowEvent#display} field. */ + @NativeType("Display *") + public long display() { return XDestroyWindowEvent.ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return XDestroyWindowEvent.nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return XDestroyWindowEvent.nwindow(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XDestroyWindowEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XDestroyWindowEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XDestroyWindowEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XDestroyWindowEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XDestroyWindowEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XDestroyWindowEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XDestroyWindowEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public Buffer event(@NativeType("Window") long value) { XDestroyWindowEvent.nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public Buffer window(@NativeType("Window") long value) { XDestroyWindowEvent.nwindow(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XErrorEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XErrorEvent.java new file mode 100644 index 000000000..b0750f435 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XErrorEvent.java @@ -0,0 +1,414 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Error event. + * + *

    Layout

    + * + *
    
    + * struct XErrorEvent {
    + *     int type;
    + *     Display * {@link #display};
    + *     XID {@link #resourceid};
    + *     unsigned long {@link #serial};
    + *     unsigned char {@link #error_code};
    + *     unsigned char {@link #request_code};
    + *     unsigned char {@link #minor_code};
    + * }
    + */ +public class XErrorEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + DISPLAY, + RESOURCEID, + SERIAL, + ERROR_CODE, + REQUEST_CODE, + MINOR_CODE; + + static { + Layout layout = __struct( + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(1), + __member(1), + __member(1) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + DISPLAY = layout.offsetof(1); + RESOURCEID = layout.offsetof(2); + SERIAL = layout.offsetof(3); + ERROR_CODE = layout.offsetof(4); + REQUEST_CODE = layout.offsetof(5); + MINOR_CODE = layout.offsetof(6); + } + + protected XErrorEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XErrorEvent create(long address, @Nullable ByteBuffer container) { + return new XErrorEvent(address, container); + } + + /** + * Creates a {@code XErrorEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XErrorEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** display the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** resource id */ + @NativeType("XID") + public long resourceid() { return nresourceid(address()); } + /** serial number of failed request */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** error code of failed request */ + @NativeType("unsigned char") + public byte error_code() { return nerror_code(address()); } + /** major op-code of failed request */ + @NativeType("unsigned char") + public byte request_code() { return nrequest_code(address()); } + /** minor op-code of failed request */ + @NativeType("unsigned char") + public byte minor_code() { return nminor_code(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XErrorEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XErrorEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #resourceid} field. */ + public XErrorEvent resourceid(@NativeType("XID") long value) { nresourceid(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XErrorEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #error_code} field. */ + public XErrorEvent error_code(@NativeType("unsigned char") byte value) { nerror_code(address(), value); return this; } + /** Sets the specified value to the {@link #request_code} field. */ + public XErrorEvent request_code(@NativeType("unsigned char") byte value) { nrequest_code(address(), value); return this; } + /** Sets the specified value to the {@link #minor_code} field. */ + public XErrorEvent minor_code(@NativeType("unsigned char") byte value) { nminor_code(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XErrorEvent set( + int type, + long display, + long resourceid, + long serial, + byte error_code, + byte request_code, + byte minor_code + ) { + type(type); + display(display); + resourceid(resourceid); + serial(serial); + error_code(error_code); + request_code(request_code); + minor_code(minor_code); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XErrorEvent set(XErrorEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XErrorEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XErrorEvent malloc() { + return new XErrorEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XErrorEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XErrorEvent calloc() { + return new XErrorEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XErrorEvent} instance allocated with {@link BufferUtils}. */ + public static XErrorEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XErrorEvent(memAddress(container), container); + } + + /** Returns a new {@code XErrorEvent} instance for the specified memory address. */ + public static XErrorEvent create(long address) { + return new XErrorEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XErrorEvent createSafe(long address) { + return address == NULL ? null : new XErrorEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XErrorEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XErrorEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XErrorEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XErrorEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XErrorEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XErrorEvent malloc(MemoryStack stack) { + return new XErrorEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XErrorEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XErrorEvent calloc(MemoryStack stack) { + return new XErrorEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XErrorEvent.TYPE); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XErrorEvent.DISPLAY); } + /** Unsafe version of {@link #resourceid}. */ + public static long nresourceid(long struct) { return memGetCLong(struct + XErrorEvent.RESOURCEID); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XErrorEvent.SERIAL); } + /** Unsafe version of {@link #error_code}. */ + public static byte nerror_code(long struct) { return UNSAFE.getByte(null, struct + XErrorEvent.ERROR_CODE); } + /** Unsafe version of {@link #request_code}. */ + public static byte nrequest_code(long struct) { return UNSAFE.getByte(null, struct + XErrorEvent.REQUEST_CODE); } + /** Unsafe version of {@link #minor_code}. */ + public static byte nminor_code(long struct) { return UNSAFE.getByte(null, struct + XErrorEvent.MINOR_CODE); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XErrorEvent.TYPE, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XErrorEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #resourceid(long) resourceid}. */ + public static void nresourceid(long struct, long value) { memPutCLong(struct + XErrorEvent.RESOURCEID, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XErrorEvent.SERIAL, value); } + /** Unsafe version of {@link #error_code(byte) error_code}. */ + public static void nerror_code(long struct, byte value) { UNSAFE.putByte(null, struct + XErrorEvent.ERROR_CODE, value); } + /** Unsafe version of {@link #request_code(byte) request_code}. */ + public static void nrequest_code(long struct, byte value) { UNSAFE.putByte(null, struct + XErrorEvent.REQUEST_CODE, value); } + /** Unsafe version of {@link #minor_code(byte) minor_code}. */ + public static void nminor_code(long struct, byte value) { UNSAFE.putByte(null, struct + XErrorEvent.MINOR_CODE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XErrorEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XErrorEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XErrorEvent ELEMENT_FACTORY = XErrorEvent.create(-1L); + + /** + * Creates a new {@code XErrorEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XErrorEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XErrorEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XErrorEvent.ntype(address()); } + /** @return the value of the {@link XErrorEvent#display} field. */ + @NativeType("Display *") + public long display() { return XErrorEvent.ndisplay(address()); } + /** @return the value of the {@link XErrorEvent#resourceid} field. */ + @NativeType("XID") + public long resourceid() { return XErrorEvent.nresourceid(address()); } + /** @return the value of the {@link XErrorEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XErrorEvent.nserial(address()); } + /** @return the value of the {@link XErrorEvent#error_code} field. */ + @NativeType("unsigned char") + public byte error_code() { return XErrorEvent.nerror_code(address()); } + /** @return the value of the {@link XErrorEvent#request_code} field. */ + @NativeType("unsigned char") + public byte request_code() { return XErrorEvent.nrequest_code(address()); } + /** @return the value of the {@link XErrorEvent#minor_code} field. */ + @NativeType("unsigned char") + public byte minor_code() { return XErrorEvent.nminor_code(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XErrorEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XErrorEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XErrorEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XErrorEvent#resourceid} field. */ + public Buffer resourceid(@NativeType("XID") long value) { XErrorEvent.nresourceid(address(), value); return this; } + /** Sets the specified value to the {@link XErrorEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XErrorEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XErrorEvent#error_code} field. */ + public Buffer error_code(@NativeType("unsigned char") byte value) { XErrorEvent.nerror_code(address(), value); return this; } + /** Sets the specified value to the {@link XErrorEvent#request_code} field. */ + public Buffer request_code(@NativeType("unsigned char") byte value) { XErrorEvent.nrequest_code(address(), value); return this; } + /** Sets the specified value to the {@link XErrorEvent#minor_code} field. */ + public Buffer minor_code(@NativeType("unsigned char") byte value) { XErrorEvent.nminor_code(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XEvent.java new file mode 100644 index 000000000..05047e1d9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XEvent.java @@ -0,0 +1,586 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * This union is defined so Xlib can always use the same sized event structure internally, to avoid memory fragmentation. + * + *

    Layout

    + * + *
    
    + * union XEvent {
    + *     int type;
    + *     {@link XAnyEvent XAnyEvent} xany;
    + *     {@link XKeyEvent XKeyEvent} xkey;
    + *     {@link XButtonEvent XButtonEvent} xbutton;
    + *     {@link XMotionEvent XMotionEvent} xmotion;
    + *     {@link XCrossingEvent XCrossingEvent} xcrossing;
    + *     {@link XFocusChangeEvent XFocusChangeEvent} xfocus;
    + *     {@link XExposeEvent XExposeEvent} xexpose;
    + *     {@link XGraphicsExposeEvent XGraphicsExposeEvent} xgraphicsexpose;
    + *     {@link XNoExposeEvent XNoExposeEvent} xnoexpose;
    + *     {@link XVisibilityEvent XVisibilityEvent} xvisibility;
    + *     {@link XCreateWindowEvent XCreateWindowEvent} xcreatewindow;
    + *     {@link XDestroyWindowEvent XDestroyWindowEvent} xdestroywindow;
    + *     {@link XUnmapEvent XUnmapEvent} xunmap;
    + *     {@link XMapEvent XMapEvent} xmap;
    + *     {@link XMapRequestEvent XMapRequestEvent} xmaprequest;
    + *     {@link XReparentEvent XReparentEvent} xreparent;
    + *     {@link XConfigureEvent XConfigureEvent} xconfigure;
    + *     {@link XGravityEvent XGravityEvent} xgravity;
    + *     {@link XResizeRequestEvent XResizeRequestEvent} xresizerequest;
    + *     {@link XConfigureRequestEvent XConfigureRequestEvent} xconfigurerequest;
    + *     {@link XCirculateEvent XCirculateEvent} xcirculate;
    + *     {@link XCirculateRequestEvent XCirculateRequestEvent} xcirculaterequest;
    + *     {@link XPropertyEvent XPropertyEvent} xproperty;
    + *     {@link XSelectionClearEvent XSelectionClearEvent} xselectionclear;
    + *     {@link XSelectionRequestEvent XSelectionRequestEvent} xselectionrequest;
    + *     {@link XSelectionEvent XSelectionEvent} xselection;
    + *     {@link XColormapEvent XColormapEvent} xcolormap;
    + *     {@link XClientMessageEvent XClientMessageEvent} xclient;
    + *     {@link XMappingEvent XMappingEvent} xmapping;
    + *     {@link XErrorEvent XErrorEvent} xerror;
    + *     {@link XKeymapEvent XKeymapEvent} xkeymap;
    + *     {@link XGenericEvent XGenericEvent} xgeneric;
    + *     {@link XGenericEventCookie XGenericEventCookie} xcookie;
    + *     long[24];
    + * }
    + */ +public class XEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + XANY, + XKEY, + XBUTTON, + XMOTION, + XCROSSING, + XFOCUS, + XEXPOSE, + XGRAPHICSEXPOSE, + XNOEXPOSE, + XVISIBILITY, + XCREATEWINDOW, + XDESTROYWINDOW, + XUNMAP, + XMAP, + XMAPREQUEST, + XREPARENT, + XCONFIGURE, + XGRAVITY, + XRESIZEREQUEST, + XCONFIGUREREQUEST, + XCIRCULATE, + XCIRCULATEREQUEST, + XPROPERTY, + XSELECTIONCLEAR, + XSELECTIONREQUEST, + XSELECTION, + XCOLORMAP, + XCLIENT, + XMAPPING, + XERROR, + XKEYMAP, + XGENERIC, + XCOOKIE; + + static { + Layout layout = __union( + __member(4), + __member(XAnyEvent.SIZEOF, XAnyEvent.ALIGNOF), + __member(XKeyEvent.SIZEOF, XKeyEvent.ALIGNOF), + __member(XButtonEvent.SIZEOF, XButtonEvent.ALIGNOF), + __member(XMotionEvent.SIZEOF, XMotionEvent.ALIGNOF), + __member(XCrossingEvent.SIZEOF, XCrossingEvent.ALIGNOF), + __member(XFocusChangeEvent.SIZEOF, XFocusChangeEvent.ALIGNOF), + __member(XExposeEvent.SIZEOF, XExposeEvent.ALIGNOF), + __member(XGraphicsExposeEvent.SIZEOF, XGraphicsExposeEvent.ALIGNOF), + __member(XNoExposeEvent.SIZEOF, XNoExposeEvent.ALIGNOF), + __member(XVisibilityEvent.SIZEOF, XVisibilityEvent.ALIGNOF), + __member(XCreateWindowEvent.SIZEOF, XCreateWindowEvent.ALIGNOF), + __member(XDestroyWindowEvent.SIZEOF, XDestroyWindowEvent.ALIGNOF), + __member(XUnmapEvent.SIZEOF, XUnmapEvent.ALIGNOF), + __member(XMapEvent.SIZEOF, XMapEvent.ALIGNOF), + __member(XMapRequestEvent.SIZEOF, XMapRequestEvent.ALIGNOF), + __member(XReparentEvent.SIZEOF, XReparentEvent.ALIGNOF), + __member(XConfigureEvent.SIZEOF, XConfigureEvent.ALIGNOF), + __member(XGravityEvent.SIZEOF, XGravityEvent.ALIGNOF), + __member(XResizeRequestEvent.SIZEOF, XResizeRequestEvent.ALIGNOF), + __member(XConfigureRequestEvent.SIZEOF, XConfigureRequestEvent.ALIGNOF), + __member(XCirculateEvent.SIZEOF, XCirculateEvent.ALIGNOF), + __member(XCirculateRequestEvent.SIZEOF, XCirculateRequestEvent.ALIGNOF), + __member(XPropertyEvent.SIZEOF, XPropertyEvent.ALIGNOF), + __member(XSelectionClearEvent.SIZEOF, XSelectionClearEvent.ALIGNOF), + __member(XSelectionRequestEvent.SIZEOF, XSelectionRequestEvent.ALIGNOF), + __member(XSelectionEvent.SIZEOF, XSelectionEvent.ALIGNOF), + __member(XColormapEvent.SIZEOF, XColormapEvent.ALIGNOF), + __member(XClientMessageEvent.SIZEOF, XClientMessageEvent.ALIGNOF), + __member(XMappingEvent.SIZEOF, XMappingEvent.ALIGNOF), + __member(XErrorEvent.SIZEOF, XErrorEvent.ALIGNOF), + __member(XKeymapEvent.SIZEOF, XKeymapEvent.ALIGNOF), + __member(XGenericEvent.SIZEOF, XGenericEvent.ALIGNOF), + __member(XGenericEventCookie.SIZEOF, XGenericEventCookie.ALIGNOF), + __padding(24, CLONG_SIZE, true) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + XANY = layout.offsetof(1); + XKEY = layout.offsetof(2); + XBUTTON = layout.offsetof(3); + XMOTION = layout.offsetof(4); + XCROSSING = layout.offsetof(5); + XFOCUS = layout.offsetof(6); + XEXPOSE = layout.offsetof(7); + XGRAPHICSEXPOSE = layout.offsetof(8); + XNOEXPOSE = layout.offsetof(9); + XVISIBILITY = layout.offsetof(10); + XCREATEWINDOW = layout.offsetof(11); + XDESTROYWINDOW = layout.offsetof(12); + XUNMAP = layout.offsetof(13); + XMAP = layout.offsetof(14); + XMAPREQUEST = layout.offsetof(15); + XREPARENT = layout.offsetof(16); + XCONFIGURE = layout.offsetof(17); + XGRAVITY = layout.offsetof(18); + XRESIZEREQUEST = layout.offsetof(19); + XCONFIGUREREQUEST = layout.offsetof(20); + XCIRCULATE = layout.offsetof(21); + XCIRCULATEREQUEST = layout.offsetof(22); + XPROPERTY = layout.offsetof(23); + XSELECTIONCLEAR = layout.offsetof(24); + XSELECTIONREQUEST = layout.offsetof(25); + XSELECTION = layout.offsetof(26); + XCOLORMAP = layout.offsetof(27); + XCLIENT = layout.offsetof(28); + XMAPPING = layout.offsetof(29); + XERROR = layout.offsetof(30); + XKEYMAP = layout.offsetof(31); + XGENERIC = layout.offsetof(32); + XCOOKIE = layout.offsetof(33); + } + + protected XEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XEvent create(long address, @Nullable ByteBuffer container) { + return new XEvent(address, container); + } + + /** + * Creates a {@code XEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** @return a {@link XAnyEvent} view of the {@code xany} field. */ + public XAnyEvent xany() { return nxany(address()); } + /** @return a {@link XKeyEvent} view of the {@code xkey} field. */ + public XKeyEvent xkey() { return nxkey(address()); } + /** @return a {@link XButtonEvent} view of the {@code xbutton} field. */ + public XButtonEvent xbutton() { return nxbutton(address()); } + /** @return a {@link XMotionEvent} view of the {@code xmotion} field. */ + public XMotionEvent xmotion() { return nxmotion(address()); } + /** @return a {@link XCrossingEvent} view of the {@code xcrossing} field. */ + public XCrossingEvent xcrossing() { return nxcrossing(address()); } + /** @return a {@link XFocusChangeEvent} view of the {@code xfocus} field. */ + public XFocusChangeEvent xfocus() { return nxfocus(address()); } + /** @return a {@link XExposeEvent} view of the {@code xexpose} field. */ + public XExposeEvent xexpose() { return nxexpose(address()); } + /** @return a {@link XGraphicsExposeEvent} view of the {@code xgraphicsexpose} field. */ + public XGraphicsExposeEvent xgraphicsexpose() { return nxgraphicsexpose(address()); } + /** @return a {@link XNoExposeEvent} view of the {@code xnoexpose} field. */ + public XNoExposeEvent xnoexpose() { return nxnoexpose(address()); } + /** @return a {@link XVisibilityEvent} view of the {@code xvisibility} field. */ + public XVisibilityEvent xvisibility() { return nxvisibility(address()); } + /** @return a {@link XCreateWindowEvent} view of the {@code xcreatewindow} field. */ + public XCreateWindowEvent xcreatewindow() { return nxcreatewindow(address()); } + /** @return a {@link XDestroyWindowEvent} view of the {@code xdestroywindow} field. */ + public XDestroyWindowEvent xdestroywindow() { return nxdestroywindow(address()); } + /** @return a {@link XUnmapEvent} view of the {@code xunmap} field. */ + public XUnmapEvent xunmap() { return nxunmap(address()); } + /** @return a {@link XMapEvent} view of the {@code xmap} field. */ + public XMapEvent xmap() { return nxmap(address()); } + /** @return a {@link XMapRequestEvent} view of the {@code xmaprequest} field. */ + public XMapRequestEvent xmaprequest() { return nxmaprequest(address()); } + /** @return a {@link XReparentEvent} view of the {@code xreparent} field. */ + public XReparentEvent xreparent() { return nxreparent(address()); } + /** @return a {@link XConfigureEvent} view of the {@code xconfigure} field. */ + public XConfigureEvent xconfigure() { return nxconfigure(address()); } + /** @return a {@link XGravityEvent} view of the {@code xgravity} field. */ + public XGravityEvent xgravity() { return nxgravity(address()); } + /** @return a {@link XResizeRequestEvent} view of the {@code xresizerequest} field. */ + public XResizeRequestEvent xresizerequest() { return nxresizerequest(address()); } + /** @return a {@link XConfigureRequestEvent} view of the {@code xconfigurerequest} field. */ + public XConfigureRequestEvent xconfigurerequest() { return nxconfigurerequest(address()); } + /** @return a {@link XCirculateEvent} view of the {@code xcirculate} field. */ + public XCirculateEvent xcirculate() { return nxcirculate(address()); } + /** @return a {@link XCirculateRequestEvent} view of the {@code xcirculaterequest} field. */ + public XCirculateRequestEvent xcirculaterequest() { return nxcirculaterequest(address()); } + /** @return a {@link XPropertyEvent} view of the {@code xproperty} field. */ + public XPropertyEvent xproperty() { return nxproperty(address()); } + /** @return a {@link XSelectionClearEvent} view of the {@code xselectionclear} field. */ + public XSelectionClearEvent xselectionclear() { return nxselectionclear(address()); } + /** @return a {@link XSelectionRequestEvent} view of the {@code xselectionrequest} field. */ + public XSelectionRequestEvent xselectionrequest() { return nxselectionrequest(address()); } + /** @return a {@link XSelectionEvent} view of the {@code xselection} field. */ + public XSelectionEvent xselection() { return nxselection(address()); } + /** @return a {@link XColormapEvent} view of the {@code xcolormap} field. */ + public XColormapEvent xcolormap() { return nxcolormap(address()); } + /** @return a {@link XClientMessageEvent} view of the {@code xclient} field. */ + public XClientMessageEvent xclient() { return nxclient(address()); } + /** @return a {@link XMappingEvent} view of the {@code xmapping} field. */ + public XMappingEvent xmapping() { return nxmapping(address()); } + /** @return a {@link XErrorEvent} view of the {@code xerror} field. */ + public XErrorEvent xerror() { return nxerror(address()); } + /** @return a {@link XKeymapEvent} view of the {@code xkeymap} field. */ + public XKeymapEvent xkeymap() { return nxkeymap(address()); } + /** @return a {@link XGenericEvent} view of the {@code xgeneric} field. */ + public XGenericEvent xgeneric() { return nxgeneric(address()); } + /** @return a {@link XGenericEventCookie} view of the {@code xcookie} field. */ + public XGenericEventCookie xcookie() { return nxcookie(address()); } + + // ----------------------------------- + + /** Returns a new {@code XEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XEvent malloc() { + return new XEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XEvent calloc() { + return new XEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XEvent} instance allocated with {@link BufferUtils}. */ + public static XEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XEvent(memAddress(container), container); + } + + /** Returns a new {@code XEvent} instance for the specified memory address. */ + public static XEvent create(long address) { + return new XEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XEvent createSafe(long address) { + return address == NULL ? null : new XEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XEvent malloc(MemoryStack stack) { + return new XEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XEvent calloc(MemoryStack stack) { + return new XEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XEvent.TYPE); } + /** Unsafe version of {@link #xany}. */ + public static XAnyEvent nxany(long struct) { return XAnyEvent.create(struct + XEvent.XANY); } + /** Unsafe version of {@link #xkey}. */ + public static XKeyEvent nxkey(long struct) { return XKeyEvent.create(struct + XEvent.XKEY); } + /** Unsafe version of {@link #xbutton}. */ + public static XButtonEvent nxbutton(long struct) { return XButtonEvent.create(struct + XEvent.XBUTTON); } + /** Unsafe version of {@link #xmotion}. */ + public static XMotionEvent nxmotion(long struct) { return XMotionEvent.create(struct + XEvent.XMOTION); } + /** Unsafe version of {@link #xcrossing}. */ + public static XCrossingEvent nxcrossing(long struct) { return XCrossingEvent.create(struct + XEvent.XCROSSING); } + /** Unsafe version of {@link #xfocus}. */ + public static XFocusChangeEvent nxfocus(long struct) { return XFocusChangeEvent.create(struct + XEvent.XFOCUS); } + /** Unsafe version of {@link #xexpose}. */ + public static XExposeEvent nxexpose(long struct) { return XExposeEvent.create(struct + XEvent.XEXPOSE); } + /** Unsafe version of {@link #xgraphicsexpose}. */ + public static XGraphicsExposeEvent nxgraphicsexpose(long struct) { return XGraphicsExposeEvent.create(struct + XEvent.XGRAPHICSEXPOSE); } + /** Unsafe version of {@link #xnoexpose}. */ + public static XNoExposeEvent nxnoexpose(long struct) { return XNoExposeEvent.create(struct + XEvent.XNOEXPOSE); } + /** Unsafe version of {@link #xvisibility}. */ + public static XVisibilityEvent nxvisibility(long struct) { return XVisibilityEvent.create(struct + XEvent.XVISIBILITY); } + /** Unsafe version of {@link #xcreatewindow}. */ + public static XCreateWindowEvent nxcreatewindow(long struct) { return XCreateWindowEvent.create(struct + XEvent.XCREATEWINDOW); } + /** Unsafe version of {@link #xdestroywindow}. */ + public static XDestroyWindowEvent nxdestroywindow(long struct) { return XDestroyWindowEvent.create(struct + XEvent.XDESTROYWINDOW); } + /** Unsafe version of {@link #xunmap}. */ + public static XUnmapEvent nxunmap(long struct) { return XUnmapEvent.create(struct + XEvent.XUNMAP); } + /** Unsafe version of {@link #xmap}. */ + public static XMapEvent nxmap(long struct) { return XMapEvent.create(struct + XEvent.XMAP); } + /** Unsafe version of {@link #xmaprequest}. */ + public static XMapRequestEvent nxmaprequest(long struct) { return XMapRequestEvent.create(struct + XEvent.XMAPREQUEST); } + /** Unsafe version of {@link #xreparent}. */ + public static XReparentEvent nxreparent(long struct) { return XReparentEvent.create(struct + XEvent.XREPARENT); } + /** Unsafe version of {@link #xconfigure}. */ + public static XConfigureEvent nxconfigure(long struct) { return XConfigureEvent.create(struct + XEvent.XCONFIGURE); } + /** Unsafe version of {@link #xgravity}. */ + public static XGravityEvent nxgravity(long struct) { return XGravityEvent.create(struct + XEvent.XGRAVITY); } + /** Unsafe version of {@link #xresizerequest}. */ + public static XResizeRequestEvent nxresizerequest(long struct) { return XResizeRequestEvent.create(struct + XEvent.XRESIZEREQUEST); } + /** Unsafe version of {@link #xconfigurerequest}. */ + public static XConfigureRequestEvent nxconfigurerequest(long struct) { return XConfigureRequestEvent.create(struct + XEvent.XCONFIGUREREQUEST); } + /** Unsafe version of {@link #xcirculate}. */ + public static XCirculateEvent nxcirculate(long struct) { return XCirculateEvent.create(struct + XEvent.XCIRCULATE); } + /** Unsafe version of {@link #xcirculaterequest}. */ + public static XCirculateRequestEvent nxcirculaterequest(long struct) { return XCirculateRequestEvent.create(struct + XEvent.XCIRCULATEREQUEST); } + /** Unsafe version of {@link #xproperty}. */ + public static XPropertyEvent nxproperty(long struct) { return XPropertyEvent.create(struct + XEvent.XPROPERTY); } + /** Unsafe version of {@link #xselectionclear}. */ + public static XSelectionClearEvent nxselectionclear(long struct) { return XSelectionClearEvent.create(struct + XEvent.XSELECTIONCLEAR); } + /** Unsafe version of {@link #xselectionrequest}. */ + public static XSelectionRequestEvent nxselectionrequest(long struct) { return XSelectionRequestEvent.create(struct + XEvent.XSELECTIONREQUEST); } + /** Unsafe version of {@link #xselection}. */ + public static XSelectionEvent nxselection(long struct) { return XSelectionEvent.create(struct + XEvent.XSELECTION); } + /** Unsafe version of {@link #xcolormap}. */ + public static XColormapEvent nxcolormap(long struct) { return XColormapEvent.create(struct + XEvent.XCOLORMAP); } + /** Unsafe version of {@link #xclient}. */ + public static XClientMessageEvent nxclient(long struct) { return XClientMessageEvent.create(struct + XEvent.XCLIENT); } + /** Unsafe version of {@link #xmapping}. */ + public static XMappingEvent nxmapping(long struct) { return XMappingEvent.create(struct + XEvent.XMAPPING); } + /** Unsafe version of {@link #xerror}. */ + public static XErrorEvent nxerror(long struct) { return XErrorEvent.create(struct + XEvent.XERROR); } + /** Unsafe version of {@link #xkeymap}. */ + public static XKeymapEvent nxkeymap(long struct) { return XKeymapEvent.create(struct + XEvent.XKEYMAP); } + /** Unsafe version of {@link #xgeneric}. */ + public static XGenericEvent nxgeneric(long struct) { return XGenericEvent.create(struct + XEvent.XGENERIC); } + /** Unsafe version of {@link #xcookie}. */ + public static XGenericEventCookie nxcookie(long struct) { return XGenericEventCookie.create(struct + XEvent.XCOOKIE); } + + // ----------------------------------- + + /** An array of {@link XEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XEvent ELEMENT_FACTORY = XEvent.create(-1L); + + /** + * Creates a new {@code XEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XEvent.ntype(address()); } + /** @return a {@link XAnyEvent} view of the {@code xany} field. */ + public XAnyEvent xany() { return XEvent.nxany(address()); } + /** @return a {@link XKeyEvent} view of the {@code xkey} field. */ + public XKeyEvent xkey() { return XEvent.nxkey(address()); } + /** @return a {@link XButtonEvent} view of the {@code xbutton} field. */ + public XButtonEvent xbutton() { return XEvent.nxbutton(address()); } + /** @return a {@link XMotionEvent} view of the {@code xmotion} field. */ + public XMotionEvent xmotion() { return XEvent.nxmotion(address()); } + /** @return a {@link XCrossingEvent} view of the {@code xcrossing} field. */ + public XCrossingEvent xcrossing() { return XEvent.nxcrossing(address()); } + /** @return a {@link XFocusChangeEvent} view of the {@code xfocus} field. */ + public XFocusChangeEvent xfocus() { return XEvent.nxfocus(address()); } + /** @return a {@link XExposeEvent} view of the {@code xexpose} field. */ + public XExposeEvent xexpose() { return XEvent.nxexpose(address()); } + /** @return a {@link XGraphicsExposeEvent} view of the {@code xgraphicsexpose} field. */ + public XGraphicsExposeEvent xgraphicsexpose() { return XEvent.nxgraphicsexpose(address()); } + /** @return a {@link XNoExposeEvent} view of the {@code xnoexpose} field. */ + public XNoExposeEvent xnoexpose() { return XEvent.nxnoexpose(address()); } + /** @return a {@link XVisibilityEvent} view of the {@code xvisibility} field. */ + public XVisibilityEvent xvisibility() { return XEvent.nxvisibility(address()); } + /** @return a {@link XCreateWindowEvent} view of the {@code xcreatewindow} field. */ + public XCreateWindowEvent xcreatewindow() { return XEvent.nxcreatewindow(address()); } + /** @return a {@link XDestroyWindowEvent} view of the {@code xdestroywindow} field. */ + public XDestroyWindowEvent xdestroywindow() { return XEvent.nxdestroywindow(address()); } + /** @return a {@link XUnmapEvent} view of the {@code xunmap} field. */ + public XUnmapEvent xunmap() { return XEvent.nxunmap(address()); } + /** @return a {@link XMapEvent} view of the {@code xmap} field. */ + public XMapEvent xmap() { return XEvent.nxmap(address()); } + /** @return a {@link XMapRequestEvent} view of the {@code xmaprequest} field. */ + public XMapRequestEvent xmaprequest() { return XEvent.nxmaprequest(address()); } + /** @return a {@link XReparentEvent} view of the {@code xreparent} field. */ + public XReparentEvent xreparent() { return XEvent.nxreparent(address()); } + /** @return a {@link XConfigureEvent} view of the {@code xconfigure} field. */ + public XConfigureEvent xconfigure() { return XEvent.nxconfigure(address()); } + /** @return a {@link XGravityEvent} view of the {@code xgravity} field. */ + public XGravityEvent xgravity() { return XEvent.nxgravity(address()); } + /** @return a {@link XResizeRequestEvent} view of the {@code xresizerequest} field. */ + public XResizeRequestEvent xresizerequest() { return XEvent.nxresizerequest(address()); } + /** @return a {@link XConfigureRequestEvent} view of the {@code xconfigurerequest} field. */ + public XConfigureRequestEvent xconfigurerequest() { return XEvent.nxconfigurerequest(address()); } + /** @return a {@link XCirculateEvent} view of the {@code xcirculate} field. */ + public XCirculateEvent xcirculate() { return XEvent.nxcirculate(address()); } + /** @return a {@link XCirculateRequestEvent} view of the {@code xcirculaterequest} field. */ + public XCirculateRequestEvent xcirculaterequest() { return XEvent.nxcirculaterequest(address()); } + /** @return a {@link XPropertyEvent} view of the {@code xproperty} field. */ + public XPropertyEvent xproperty() { return XEvent.nxproperty(address()); } + /** @return a {@link XSelectionClearEvent} view of the {@code xselectionclear} field. */ + public XSelectionClearEvent xselectionclear() { return XEvent.nxselectionclear(address()); } + /** @return a {@link XSelectionRequestEvent} view of the {@code xselectionrequest} field. */ + public XSelectionRequestEvent xselectionrequest() { return XEvent.nxselectionrequest(address()); } + /** @return a {@link XSelectionEvent} view of the {@code xselection} field. */ + public XSelectionEvent xselection() { return XEvent.nxselection(address()); } + /** @return a {@link XColormapEvent} view of the {@code xcolormap} field. */ + public XColormapEvent xcolormap() { return XEvent.nxcolormap(address()); } + /** @return a {@link XClientMessageEvent} view of the {@code xclient} field. */ + public XClientMessageEvent xclient() { return XEvent.nxclient(address()); } + /** @return a {@link XMappingEvent} view of the {@code xmapping} field. */ + public XMappingEvent xmapping() { return XEvent.nxmapping(address()); } + /** @return a {@link XErrorEvent} view of the {@code xerror} field. */ + public XErrorEvent xerror() { return XEvent.nxerror(address()); } + /** @return a {@link XKeymapEvent} view of the {@code xkeymap} field. */ + public XKeymapEvent xkeymap() { return XEvent.nxkeymap(address()); } + /** @return a {@link XGenericEvent} view of the {@code xgeneric} field. */ + public XGenericEvent xgeneric() { return XEvent.nxgeneric(address()); } + /** @return a {@link XGenericEventCookie} view of the {@code xcookie} field. */ + public XGenericEventCookie xcookie() { return XEvent.nxcookie(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XExposeEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XExposeEvent.java new file mode 100644 index 000000000..d1a258c7e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XExposeEvent.java @@ -0,0 +1,462 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XExposeEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     int x;
    + *     int y;
    + *     int width;
    + *     int height;
    + *     int {@link #count};
    + * }
    + */ +public class XExposeEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + X, + Y, + WIDTH, + HEIGHT, + COUNT; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + X = layout.offsetof(5); + Y = layout.offsetof(6); + WIDTH = layout.offsetof(7); + HEIGHT = layout.offsetof(8); + COUNT = layout.offsetof(9); + } + + protected XExposeEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XExposeEvent create(long address, @Nullable ByteBuffer container) { + return new XExposeEvent(address, container); + } + + /** + * Creates a {@code XExposeEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XExposeEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return ny(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return nheight(address()); } + /** if non-zero, at least this many more */ + public int count() { return ncount(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XExposeEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XExposeEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XExposeEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XExposeEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XExposeEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public XExposeEvent x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public XExposeEvent y(int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public XExposeEvent width(int value) { nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public XExposeEvent height(int value) { nheight(address(), value); return this; } + /** Sets the specified value to the {@link #count} field. */ + public XExposeEvent count(int value) { ncount(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XExposeEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + int x, + int y, + int width, + int height, + int count + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + x(x); + y(y); + width(width); + height(height); + count(count); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XExposeEvent set(XExposeEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XExposeEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XExposeEvent malloc() { + return new XExposeEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XExposeEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XExposeEvent calloc() { + return new XExposeEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XExposeEvent} instance allocated with {@link BufferUtils}. */ + public static XExposeEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XExposeEvent(memAddress(container), container); + } + + /** Returns a new {@code XExposeEvent} instance for the specified memory address. */ + public static XExposeEvent create(long address) { + return new XExposeEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XExposeEvent createSafe(long address) { + return address == NULL ? null : new XExposeEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XExposeEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XExposeEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XExposeEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XExposeEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XExposeEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XExposeEvent malloc(MemoryStack stack) { + return new XExposeEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XExposeEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XExposeEvent calloc(MemoryStack stack) { + return new XExposeEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XExposeEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XExposeEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XExposeEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XExposeEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XExposeEvent.WINDOW); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + XExposeEvent.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + XExposeEvent.Y); } + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + XExposeEvent.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + XExposeEvent.HEIGHT); } + /** Unsafe version of {@link #count}. */ + public static int ncount(long struct) { return UNSAFE.getInt(null, struct + XExposeEvent.COUNT); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XExposeEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XExposeEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XExposeEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XExposeEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XExposeEvent.WINDOW, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + XExposeEvent.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + XExposeEvent.Y, value); } + /** Unsafe version of {@link #width(int) width}. */ + public static void nwidth(long struct, int value) { UNSAFE.putInt(null, struct + XExposeEvent.WIDTH, value); } + /** Unsafe version of {@link #height(int) height}. */ + public static void nheight(long struct, int value) { UNSAFE.putInt(null, struct + XExposeEvent.HEIGHT, value); } + /** Unsafe version of {@link #count(int) count}. */ + public static void ncount(long struct, int value) { UNSAFE.putInt(null, struct + XExposeEvent.COUNT, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XExposeEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XExposeEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XExposeEvent ELEMENT_FACTORY = XExposeEvent.create(-1L); + + /** + * Creates a new {@code XExposeEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XExposeEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XExposeEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XExposeEvent.ntype(address()); } + /** @return the value of the {@link XExposeEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XExposeEvent.nserial(address()); } + /** @return the value of the {@link XExposeEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XExposeEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XExposeEvent#display} field. */ + @NativeType("Display *") + public long display() { return XExposeEvent.ndisplay(address()); } + /** @return the value of the {@link XExposeEvent#window} field. */ + @NativeType("Window") + public long window() { return XExposeEvent.nwindow(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return XExposeEvent.nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return XExposeEvent.ny(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return XExposeEvent.nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return XExposeEvent.nheight(address()); } + /** @return the value of the {@link XExposeEvent#count} field. */ + public int count() { return XExposeEvent.ncount(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XExposeEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XExposeEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XExposeEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XExposeEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XExposeEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XExposeEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XExposeEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XExposeEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XExposeEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public Buffer x(int value) { XExposeEvent.nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public Buffer y(int value) { XExposeEvent.ny(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public Buffer width(int value) { XExposeEvent.nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public Buffer height(int value) { XExposeEvent.nheight(address(), value); return this; } + /** Sets the specified value to the {@link XExposeEvent#count} field. */ + public Buffer count(int value) { XExposeEvent.ncount(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XFocusChangeEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XFocusChangeEvent.java new file mode 100644 index 000000000..be23f15d2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XFocusChangeEvent.java @@ -0,0 +1,408 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XFocusChangeEvent {
    + *     int {@link #type};
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     int {@link #mode};
    + *     int {@link #detail};
    + * }
    + */ +public class XFocusChangeEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + MODE, + DETAIL; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + MODE = layout.offsetof(5); + DETAIL = layout.offsetof(6); + } + + protected XFocusChangeEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XFocusChangeEvent create(long address, @Nullable ByteBuffer container) { + return new XFocusChangeEvent(address, container); + } + + /** + * Creates a {@code XFocusChangeEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XFocusChangeEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** one of:
    {@link X11#FocusIn}{@link X11#FocusOut}
    */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** one of:
    {@link X11#NotifyNormal}{@link X11#NotifyWhileGrabbed}{@link X11#NotifyGrab}{@link X11#NotifyUngrab}
    */ + public int mode() { return nmode(address()); } + /** one of:
    {@link X11#NotifyAncestor}{@link X11#NotifyVirtual}{@link X11#NotifyInferior}{@link X11#NotifyNonlinear}{@link X11#NotifyNonlinearVirtual}
    {@link X11#NotifyPointer}{@link X11#NotifyPointerRoot}{@link X11#NotifyDetailNone}
    */ + public int detail() { return ndetail(address()); } + + /** Sets the specified value to the {@link #type} field. */ + public XFocusChangeEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XFocusChangeEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XFocusChangeEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XFocusChangeEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XFocusChangeEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #mode} field. */ + public XFocusChangeEvent mode(int value) { nmode(address(), value); return this; } + /** Sets the specified value to the {@link #detail} field. */ + public XFocusChangeEvent detail(int value) { ndetail(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XFocusChangeEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + int mode, + int detail + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + mode(mode); + detail(detail); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XFocusChangeEvent set(XFocusChangeEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XFocusChangeEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XFocusChangeEvent malloc() { + return new XFocusChangeEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XFocusChangeEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XFocusChangeEvent calloc() { + return new XFocusChangeEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XFocusChangeEvent} instance allocated with {@link BufferUtils}. */ + public static XFocusChangeEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XFocusChangeEvent(memAddress(container), container); + } + + /** Returns a new {@code XFocusChangeEvent} instance for the specified memory address. */ + public static XFocusChangeEvent create(long address) { + return new XFocusChangeEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XFocusChangeEvent createSafe(long address) { + return address == NULL ? null : new XFocusChangeEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XFocusChangeEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XFocusChangeEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XFocusChangeEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XFocusChangeEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XFocusChangeEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XFocusChangeEvent malloc(MemoryStack stack) { + return new XFocusChangeEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XFocusChangeEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XFocusChangeEvent calloc(MemoryStack stack) { + return new XFocusChangeEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XFocusChangeEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XFocusChangeEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XFocusChangeEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XFocusChangeEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XFocusChangeEvent.WINDOW); } + /** Unsafe version of {@link #mode}. */ + public static int nmode(long struct) { return UNSAFE.getInt(null, struct + XFocusChangeEvent.MODE); } + /** Unsafe version of {@link #detail}. */ + public static int ndetail(long struct) { return UNSAFE.getInt(null, struct + XFocusChangeEvent.DETAIL); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XFocusChangeEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XFocusChangeEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XFocusChangeEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XFocusChangeEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XFocusChangeEvent.WINDOW, value); } + /** Unsafe version of {@link #mode(int) mode}. */ + public static void nmode(long struct, int value) { UNSAFE.putInt(null, struct + XFocusChangeEvent.MODE, value); } + /** Unsafe version of {@link #detail(int) detail}. */ + public static void ndetail(long struct, int value) { UNSAFE.putInt(null, struct + XFocusChangeEvent.DETAIL, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XFocusChangeEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XFocusChangeEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XFocusChangeEvent ELEMENT_FACTORY = XFocusChangeEvent.create(-1L); + + /** + * Creates a new {@code XFocusChangeEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XFocusChangeEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XFocusChangeEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link XFocusChangeEvent#type} field. */ + public int type() { return XFocusChangeEvent.ntype(address()); } + /** @return the value of the {@link XFocusChangeEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XFocusChangeEvent.nserial(address()); } + /** @return the value of the {@link XFocusChangeEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XFocusChangeEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XFocusChangeEvent#display} field. */ + @NativeType("Display *") + public long display() { return XFocusChangeEvent.ndisplay(address()); } + /** @return the value of the {@link XFocusChangeEvent#window} field. */ + @NativeType("Window") + public long window() { return XFocusChangeEvent.nwindow(address()); } + /** @return the value of the {@link XFocusChangeEvent#mode} field. */ + public int mode() { return XFocusChangeEvent.nmode(address()); } + /** @return the value of the {@link XFocusChangeEvent#detail} field. */ + public int detail() { return XFocusChangeEvent.ndetail(address()); } + + /** Sets the specified value to the {@link XFocusChangeEvent#type} field. */ + public Buffer type(int value) { XFocusChangeEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XFocusChangeEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XFocusChangeEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XFocusChangeEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XFocusChangeEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XFocusChangeEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XFocusChangeEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XFocusChangeEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XFocusChangeEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XFocusChangeEvent#mode} field. */ + public Buffer mode(int value) { XFocusChangeEvent.nmode(address(), value); return this; } + /** Sets the specified value to the {@link XFocusChangeEvent#detail} field. */ + public Buffer detail(int value) { XFocusChangeEvent.ndetail(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGenericEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGenericEvent.java new file mode 100644 index 000000000..06c533850 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGenericEvent.java @@ -0,0 +1,390 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * GenericEvent. This event is the standard event for all newer extensions. + * + *

    Layout

    + * + *
    
    + * struct XGenericEvent {
    + *     int {@link #type};
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     int {@link #extension};
    + *     int {@link #evtype};
    + * }
    + */ +public class XGenericEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + EXTENSION, + EVTYPE; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + EXTENSION = layout.offsetof(4); + EVTYPE = layout.offsetof(5); + } + + protected XGenericEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XGenericEvent create(long address, @Nullable ByteBuffer container) { + return new XGenericEvent(address, container); + } + + /** + * Creates a {@code XGenericEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XGenericEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** of event. Must be:
    {@link X11#GenericEvent}
    */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** major opcode of extension that caused the event */ + public int extension() { return nextension(address()); } + /** actual event type */ + public int evtype() { return nevtype(address()); } + + /** Sets the specified value to the {@link #type} field. */ + public XGenericEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XGenericEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XGenericEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XGenericEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #extension} field. */ + public XGenericEvent extension(int value) { nextension(address(), value); return this; } + /** Sets the specified value to the {@link #evtype} field. */ + public XGenericEvent evtype(int value) { nevtype(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XGenericEvent set( + int type, + long serial, + boolean send_event, + long display, + int extension, + int evtype + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + extension(extension); + evtype(evtype); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XGenericEvent set(XGenericEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XGenericEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XGenericEvent malloc() { + return new XGenericEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XGenericEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XGenericEvent calloc() { + return new XGenericEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XGenericEvent} instance allocated with {@link BufferUtils}. */ + public static XGenericEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XGenericEvent(memAddress(container), container); + } + + /** Returns a new {@code XGenericEvent} instance for the specified memory address. */ + public static XGenericEvent create(long address) { + return new XGenericEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XGenericEvent createSafe(long address) { + return address == NULL ? null : new XGenericEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XGenericEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XGenericEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XGenericEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XGenericEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XGenericEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XGenericEvent malloc(MemoryStack stack) { + return new XGenericEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XGenericEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XGenericEvent calloc(MemoryStack stack) { + return new XGenericEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XGenericEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XGenericEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XGenericEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XGenericEvent.DISPLAY); } + /** Unsafe version of {@link #extension}. */ + public static int nextension(long struct) { return UNSAFE.getInt(null, struct + XGenericEvent.EXTENSION); } + /** Unsafe version of {@link #evtype}. */ + public static int nevtype(long struct) { return UNSAFE.getInt(null, struct + XGenericEvent.EVTYPE); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XGenericEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XGenericEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XGenericEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XGenericEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #extension(int) extension}. */ + public static void nextension(long struct, int value) { UNSAFE.putInt(null, struct + XGenericEvent.EXTENSION, value); } + /** Unsafe version of {@link #evtype(int) evtype}. */ + public static void nevtype(long struct, int value) { UNSAFE.putInt(null, struct + XGenericEvent.EVTYPE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XGenericEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XGenericEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XGenericEvent ELEMENT_FACTORY = XGenericEvent.create(-1L); + + /** + * Creates a new {@code XGenericEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XGenericEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XGenericEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link XGenericEvent#type} field. */ + public int type() { return XGenericEvent.ntype(address()); } + /** @return the value of the {@link XGenericEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XGenericEvent.nserial(address()); } + /** @return the value of the {@link XGenericEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XGenericEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XGenericEvent#display} field. */ + @NativeType("Display *") + public long display() { return XGenericEvent.ndisplay(address()); } + /** @return the value of the {@link XGenericEvent#extension} field. */ + public int extension() { return XGenericEvent.nextension(address()); } + /** @return the value of the {@link XGenericEvent#evtype} field. */ + public int evtype() { return XGenericEvent.nevtype(address()); } + + /** Sets the specified value to the {@link XGenericEvent#type} field. */ + public Buffer type(int value) { XGenericEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XGenericEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XGenericEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XGenericEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XGenericEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XGenericEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XGenericEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XGenericEvent#extension} field. */ + public Buffer extension(int value) { XGenericEvent.nextension(address(), value); return this; } + /** Sets the specified value to the {@link XGenericEvent#evtype} field. */ + public Buffer evtype(int value) { XGenericEvent.nevtype(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGenericEventCookie.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGenericEventCookie.java new file mode 100644 index 000000000..01ea98e24 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGenericEventCookie.java @@ -0,0 +1,439 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Additional information for an {@code XGenericEvent}. + * + *

    Layout

    + * + *
    
    + * struct XGenericEventCookie {
    + *     int {@link #type};
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     int {@link #extension};
    + *     int {@link #evtype};
    + *     unsigned int cookie;
    + *     void * data;
    + * }
    + */ +public class XGenericEventCookie extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + EXTENSION, + EVTYPE, + COOKIE, + DATA; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(4), + __member(4), + __member(4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + EXTENSION = layout.offsetof(4); + EVTYPE = layout.offsetof(5); + COOKIE = layout.offsetof(6); + DATA = layout.offsetof(7); + } + + protected XGenericEventCookie(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XGenericEventCookie create(long address, @Nullable ByteBuffer container) { + return new XGenericEventCookie(address, container); + } + + /** + * Creates a {@code XGenericEventCookie} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XGenericEventCookie(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** of event. Must be:
    {@link X11#GenericEvent}
    */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** major opcode of extension that caused the event */ + public int extension() { return nextension(address()); } + /** actual event type */ + public int evtype() { return nevtype(address()); } + /** @return the value of the {@code cookie} field. */ + @NativeType("unsigned int") + public int cookie() { return ncookie(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code data} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("void *") + public ByteBuffer data(int capacity) { return ndata(address(), capacity); } + + /** Sets the specified value to the {@link #type} field. */ + public XGenericEventCookie type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XGenericEventCookie serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XGenericEventCookie send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XGenericEventCookie display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #extension} field. */ + public XGenericEventCookie extension(int value) { nextension(address(), value); return this; } + /** Sets the specified value to the {@link #evtype} field. */ + public XGenericEventCookie evtype(int value) { nevtype(address(), value); return this; } + /** Sets the specified value to the {@code cookie} field. */ + public XGenericEventCookie cookie(@NativeType("unsigned int") int value) { ncookie(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code data} field. */ + public XGenericEventCookie data(@NativeType("void *") ByteBuffer value) { ndata(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XGenericEventCookie set( + int type, + long serial, + boolean send_event, + long display, + int extension, + int evtype, + int cookie, + ByteBuffer data + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + extension(extension); + evtype(evtype); + cookie(cookie); + data(data); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XGenericEventCookie set(XGenericEventCookie src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XGenericEventCookie} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XGenericEventCookie malloc() { + return new XGenericEventCookie(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XGenericEventCookie} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XGenericEventCookie calloc() { + return new XGenericEventCookie(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XGenericEventCookie} instance allocated with {@link BufferUtils}. */ + public static XGenericEventCookie create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XGenericEventCookie(memAddress(container), container); + } + + /** Returns a new {@code XGenericEventCookie} instance for the specified memory address. */ + public static XGenericEventCookie create(long address) { + return new XGenericEventCookie(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XGenericEventCookie createSafe(long address) { + return address == NULL ? null : new XGenericEventCookie(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XGenericEventCookie mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XGenericEventCookie callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XGenericEventCookie mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XGenericEventCookie callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XGenericEventCookie} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XGenericEventCookie malloc(MemoryStack stack) { + return new XGenericEventCookie(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XGenericEventCookie} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XGenericEventCookie calloc(MemoryStack stack) { + return new XGenericEventCookie(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XGenericEventCookie.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XGenericEventCookie.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XGenericEventCookie.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XGenericEventCookie.DISPLAY); } + /** Unsafe version of {@link #extension}. */ + public static int nextension(long struct) { return UNSAFE.getInt(null, struct + XGenericEventCookie.EXTENSION); } + /** Unsafe version of {@link #evtype}. */ + public static int nevtype(long struct) { return UNSAFE.getInt(null, struct + XGenericEventCookie.EVTYPE); } + /** Unsafe version of {@link #cookie}. */ + public static int ncookie(long struct) { return UNSAFE.getInt(null, struct + XGenericEventCookie.COOKIE); } + /** Unsafe version of {@link #data(int) data}. */ + public static ByteBuffer ndata(long struct, int capacity) { return memByteBuffer(memGetAddress(struct + XGenericEventCookie.DATA), capacity); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XGenericEventCookie.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XGenericEventCookie.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XGenericEventCookie.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XGenericEventCookie.DISPLAY, check(value)); } + /** Unsafe version of {@link #extension(int) extension}. */ + public static void nextension(long struct, int value) { UNSAFE.putInt(null, struct + XGenericEventCookie.EXTENSION, value); } + /** Unsafe version of {@link #evtype(int) evtype}. */ + public static void nevtype(long struct, int value) { UNSAFE.putInt(null, struct + XGenericEventCookie.EVTYPE, value); } + /** Unsafe version of {@link #cookie(int) cookie}. */ + public static void ncookie(long struct, int value) { UNSAFE.putInt(null, struct + XGenericEventCookie.COOKIE, value); } + /** Unsafe version of {@link #data(ByteBuffer) data}. */ + public static void ndata(long struct, ByteBuffer value) { memPutAddress(struct + XGenericEventCookie.DATA, memAddress(value)); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XGenericEventCookie.DISPLAY)); + check(memGetAddress(struct + XGenericEventCookie.DATA)); + } + + // ----------------------------------- + + /** An array of {@link XGenericEventCookie} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XGenericEventCookie ELEMENT_FACTORY = XGenericEventCookie.create(-1L); + + /** + * Creates a new {@code XGenericEventCookie.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XGenericEventCookie#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XGenericEventCookie getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link XGenericEventCookie#type} field. */ + public int type() { return XGenericEventCookie.ntype(address()); } + /** @return the value of the {@link XGenericEventCookie#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XGenericEventCookie.nserial(address()); } + /** @return the value of the {@link XGenericEventCookie#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XGenericEventCookie.nsend_event(address()) != 0; } + /** @return the value of the {@link XGenericEventCookie#display} field. */ + @NativeType("Display *") + public long display() { return XGenericEventCookie.ndisplay(address()); } + /** @return the value of the {@link XGenericEventCookie#extension} field. */ + public int extension() { return XGenericEventCookie.nextension(address()); } + /** @return the value of the {@link XGenericEventCookie#evtype} field. */ + public int evtype() { return XGenericEventCookie.nevtype(address()); } + /** @return the value of the {@code cookie} field. */ + @NativeType("unsigned int") + public int cookie() { return XGenericEventCookie.ncookie(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code data} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("void *") + public ByteBuffer data(int capacity) { return XGenericEventCookie.ndata(address(), capacity); } + + /** Sets the specified value to the {@link XGenericEventCookie#type} field. */ + public Buffer type(int value) { XGenericEventCookie.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XGenericEventCookie#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XGenericEventCookie.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XGenericEventCookie#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XGenericEventCookie.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XGenericEventCookie#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XGenericEventCookie.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XGenericEventCookie#extension} field. */ + public Buffer extension(int value) { XGenericEventCookie.nextension(address(), value); return this; } + /** Sets the specified value to the {@link XGenericEventCookie#evtype} field. */ + public Buffer evtype(int value) { XGenericEventCookie.nevtype(address(), value); return this; } + /** Sets the specified value to the {@code cookie} field. */ + public Buffer cookie(@NativeType("unsigned int") int value) { XGenericEventCookie.ncookie(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code data} field. */ + public Buffer data(@NativeType("void *") ByteBuffer value) { XGenericEventCookie.ndata(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGraphicsExposeEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGraphicsExposeEvent.java new file mode 100644 index 000000000..cde4de669 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGraphicsExposeEvent.java @@ -0,0 +1,498 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XGraphicsExposeEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Drawable drawable;
    + *     int x;
    + *     int y;
    + *     int width;
    + *     int height;
    + *     int {@link #count};
    + *     int {@link #major_code};
    + *     int {@link #minor_code};
    + * }
    + */ +public class XGraphicsExposeEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + DRAWABLE, + X, + Y, + WIDTH, + HEIGHT, + COUNT, + MAJOR_CODE, + MINOR_CODE; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + DRAWABLE = layout.offsetof(4); + X = layout.offsetof(5); + Y = layout.offsetof(6); + WIDTH = layout.offsetof(7); + HEIGHT = layout.offsetof(8); + COUNT = layout.offsetof(9); + MAJOR_CODE = layout.offsetof(10); + MINOR_CODE = layout.offsetof(11); + } + + protected XGraphicsExposeEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XGraphicsExposeEvent create(long address, @Nullable ByteBuffer container) { + return new XGraphicsExposeEvent(address, container); + } + + /** + * Creates a {@code XGraphicsExposeEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XGraphicsExposeEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code drawable} field. */ + @NativeType("Drawable") + public long drawable() { return ndrawable(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return ny(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return nheight(address()); } + /** if non-zero, at least this many more */ + public int count() { return ncount(address()); } + /** core is {@code CopyArea} or {@code CopyPlane} */ + public int major_code() { return nmajor_code(address()); } + /** not defined in the core */ + public int minor_code() { return nminor_code(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XGraphicsExposeEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XGraphicsExposeEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XGraphicsExposeEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XGraphicsExposeEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code drawable} field. */ + public XGraphicsExposeEvent drawable(@NativeType("Drawable") long value) { ndrawable(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public XGraphicsExposeEvent x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public XGraphicsExposeEvent y(int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public XGraphicsExposeEvent width(int value) { nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public XGraphicsExposeEvent height(int value) { nheight(address(), value); return this; } + /** Sets the specified value to the {@link #count} field. */ + public XGraphicsExposeEvent count(int value) { ncount(address(), value); return this; } + /** Sets the specified value to the {@link #major_code} field. */ + public XGraphicsExposeEvent major_code(int value) { nmajor_code(address(), value); return this; } + /** Sets the specified value to the {@link #minor_code} field. */ + public XGraphicsExposeEvent minor_code(int value) { nminor_code(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XGraphicsExposeEvent set( + int type, + long serial, + boolean send_event, + long display, + long drawable, + int x, + int y, + int width, + int height, + int count, + int major_code, + int minor_code + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + drawable(drawable); + x(x); + y(y); + width(width); + height(height); + count(count); + major_code(major_code); + minor_code(minor_code); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XGraphicsExposeEvent set(XGraphicsExposeEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XGraphicsExposeEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XGraphicsExposeEvent malloc() { + return new XGraphicsExposeEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XGraphicsExposeEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XGraphicsExposeEvent calloc() { + return new XGraphicsExposeEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XGraphicsExposeEvent} instance allocated with {@link BufferUtils}. */ + public static XGraphicsExposeEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XGraphicsExposeEvent(memAddress(container), container); + } + + /** Returns a new {@code XGraphicsExposeEvent} instance for the specified memory address. */ + public static XGraphicsExposeEvent create(long address) { + return new XGraphicsExposeEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XGraphicsExposeEvent createSafe(long address) { + return address == NULL ? null : new XGraphicsExposeEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XGraphicsExposeEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XGraphicsExposeEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XGraphicsExposeEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XGraphicsExposeEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XGraphicsExposeEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XGraphicsExposeEvent malloc(MemoryStack stack) { + return new XGraphicsExposeEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XGraphicsExposeEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XGraphicsExposeEvent calloc(MemoryStack stack) { + return new XGraphicsExposeEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XGraphicsExposeEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XGraphicsExposeEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XGraphicsExposeEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XGraphicsExposeEvent.DISPLAY); } + /** Unsafe version of {@link #drawable}. */ + public static long ndrawable(long struct) { return memGetCLong(struct + XGraphicsExposeEvent.DRAWABLE); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + XGraphicsExposeEvent.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + XGraphicsExposeEvent.Y); } + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + XGraphicsExposeEvent.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + XGraphicsExposeEvent.HEIGHT); } + /** Unsafe version of {@link #count}. */ + public static int ncount(long struct) { return UNSAFE.getInt(null, struct + XGraphicsExposeEvent.COUNT); } + /** Unsafe version of {@link #major_code}. */ + public static int nmajor_code(long struct) { return UNSAFE.getInt(null, struct + XGraphicsExposeEvent.MAJOR_CODE); } + /** Unsafe version of {@link #minor_code}. */ + public static int nminor_code(long struct) { return UNSAFE.getInt(null, struct + XGraphicsExposeEvent.MINOR_CODE); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XGraphicsExposeEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XGraphicsExposeEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XGraphicsExposeEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XGraphicsExposeEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #drawable(long) drawable}. */ + public static void ndrawable(long struct, long value) { memPutCLong(struct + XGraphicsExposeEvent.DRAWABLE, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + XGraphicsExposeEvent.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + XGraphicsExposeEvent.Y, value); } + /** Unsafe version of {@link #width(int) width}. */ + public static void nwidth(long struct, int value) { UNSAFE.putInt(null, struct + XGraphicsExposeEvent.WIDTH, value); } + /** Unsafe version of {@link #height(int) height}. */ + public static void nheight(long struct, int value) { UNSAFE.putInt(null, struct + XGraphicsExposeEvent.HEIGHT, value); } + /** Unsafe version of {@link #count(int) count}. */ + public static void ncount(long struct, int value) { UNSAFE.putInt(null, struct + XGraphicsExposeEvent.COUNT, value); } + /** Unsafe version of {@link #major_code(int) major_code}. */ + public static void nmajor_code(long struct, int value) { UNSAFE.putInt(null, struct + XGraphicsExposeEvent.MAJOR_CODE, value); } + /** Unsafe version of {@link #minor_code(int) minor_code}. */ + public static void nminor_code(long struct, int value) { UNSAFE.putInt(null, struct + XGraphicsExposeEvent.MINOR_CODE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XGraphicsExposeEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XGraphicsExposeEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XGraphicsExposeEvent ELEMENT_FACTORY = XGraphicsExposeEvent.create(-1L); + + /** + * Creates a new {@code XGraphicsExposeEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XGraphicsExposeEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XGraphicsExposeEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XGraphicsExposeEvent.ntype(address()); } + /** @return the value of the {@link XGraphicsExposeEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XGraphicsExposeEvent.nserial(address()); } + /** @return the value of the {@link XGraphicsExposeEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XGraphicsExposeEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XGraphicsExposeEvent#display} field. */ + @NativeType("Display *") + public long display() { return XGraphicsExposeEvent.ndisplay(address()); } + /** @return the value of the {@code drawable} field. */ + @NativeType("Drawable") + public long drawable() { return XGraphicsExposeEvent.ndrawable(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return XGraphicsExposeEvent.nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return XGraphicsExposeEvent.ny(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return XGraphicsExposeEvent.nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return XGraphicsExposeEvent.nheight(address()); } + /** @return the value of the {@link XGraphicsExposeEvent#count} field. */ + public int count() { return XGraphicsExposeEvent.ncount(address()); } + /** @return the value of the {@link XGraphicsExposeEvent#major_code} field. */ + public int major_code() { return XGraphicsExposeEvent.nmajor_code(address()); } + /** @return the value of the {@link XGraphicsExposeEvent#minor_code} field. */ + public int minor_code() { return XGraphicsExposeEvent.nminor_code(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XGraphicsExposeEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XGraphicsExposeEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XGraphicsExposeEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XGraphicsExposeEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XGraphicsExposeEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XGraphicsExposeEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XGraphicsExposeEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code drawable} field. */ + public Buffer drawable(@NativeType("Drawable") long value) { XGraphicsExposeEvent.ndrawable(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public Buffer x(int value) { XGraphicsExposeEvent.nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public Buffer y(int value) { XGraphicsExposeEvent.ny(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public Buffer width(int value) { XGraphicsExposeEvent.nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public Buffer height(int value) { XGraphicsExposeEvent.nheight(address(), value); return this; } + /** Sets the specified value to the {@link XGraphicsExposeEvent#count} field. */ + public Buffer count(int value) { XGraphicsExposeEvent.ncount(address(), value); return this; } + /** Sets the specified value to the {@link XGraphicsExposeEvent#major_code} field. */ + public Buffer major_code(int value) { XGraphicsExposeEvent.nmajor_code(address(), value); return this; } + /** Sets the specified value to the {@link XGraphicsExposeEvent#minor_code} field. */ + public Buffer minor_code(int value) { XGraphicsExposeEvent.nminor_code(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGravityEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGravityEvent.java new file mode 100644 index 000000000..65e05eb42 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XGravityEvent.java @@ -0,0 +1,428 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XGravityEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window event;
    + *     Window window;
    + *     int x;
    + *     int y;
    + * }
    + */ +public class XGravityEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + EVENT, + WINDOW, + X, + Y; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + EVENT = layout.offsetof(4); + WINDOW = layout.offsetof(5); + X = layout.offsetof(6); + Y = layout.offsetof(7); + } + + protected XGravityEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XGravityEvent create(long address, @Nullable ByteBuffer container) { + return new XGravityEvent(address, container); + } + + /** + * Creates a {@code XGravityEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XGravityEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return ny(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XGravityEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XGravityEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XGravityEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XGravityEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public XGravityEvent event(@NativeType("Window") long value) { nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public XGravityEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public XGravityEvent x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public XGravityEvent y(int value) { ny(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XGravityEvent set( + int type, + long serial, + boolean send_event, + long display, + long event, + long window, + int x, + int y + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + event(event); + window(window); + x(x); + y(y); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XGravityEvent set(XGravityEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XGravityEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XGravityEvent malloc() { + return new XGravityEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XGravityEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XGravityEvent calloc() { + return new XGravityEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XGravityEvent} instance allocated with {@link BufferUtils}. */ + public static XGravityEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XGravityEvent(memAddress(container), container); + } + + /** Returns a new {@code XGravityEvent} instance for the specified memory address. */ + public static XGravityEvent create(long address) { + return new XGravityEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XGravityEvent createSafe(long address) { + return address == NULL ? null : new XGravityEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XGravityEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XGravityEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XGravityEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XGravityEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XGravityEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XGravityEvent malloc(MemoryStack stack) { + return new XGravityEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XGravityEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XGravityEvent calloc(MemoryStack stack) { + return new XGravityEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XGravityEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XGravityEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XGravityEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XGravityEvent.DISPLAY); } + /** Unsafe version of {@link #event}. */ + public static long nevent(long struct) { return memGetCLong(struct + XGravityEvent.EVENT); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XGravityEvent.WINDOW); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + XGravityEvent.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + XGravityEvent.Y); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XGravityEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XGravityEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XGravityEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XGravityEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #event(long) event}. */ + public static void nevent(long struct, long value) { memPutCLong(struct + XGravityEvent.EVENT, value); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XGravityEvent.WINDOW, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + XGravityEvent.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + XGravityEvent.Y, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XGravityEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XGravityEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XGravityEvent ELEMENT_FACTORY = XGravityEvent.create(-1L); + + /** + * Creates a new {@code XGravityEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XGravityEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XGravityEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XGravityEvent.ntype(address()); } + /** @return the value of the {@link XGravityEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XGravityEvent.nserial(address()); } + /** @return the value of the {@link XGravityEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XGravityEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XGravityEvent#display} field. */ + @NativeType("Display *") + public long display() { return XGravityEvent.ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return XGravityEvent.nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return XGravityEvent.nwindow(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return XGravityEvent.nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return XGravityEvent.ny(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XGravityEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XGravityEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XGravityEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XGravityEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XGravityEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XGravityEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XGravityEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public Buffer event(@NativeType("Window") long value) { XGravityEvent.nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public Buffer window(@NativeType("Window") long value) { XGravityEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public Buffer x(int value) { XGravityEvent.nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public Buffer y(int value) { XGravityEvent.ny(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XKeyEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XKeyEvent.java new file mode 100644 index 000000000..a79b5dff6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XKeyEvent.java @@ -0,0 +1,566 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Key event. + * + *

    Layout

    + * + *
    
    + * struct XKeyEvent {
    + *     int {@link #type};
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     Window {@link #root};
    + *     Window {@link #subwindow};
    + *     Time {@link #time};
    + *     int {@link #x};
    + *     int {@link #y};
    + *     int {@link #x_root};
    + *     int {@link #y_root};
    + *     unsigned int {@link #state};
    + *     unsigned int {@link #keycode};
    + *     Bool {@link #same_screen};
    + * }
    + */ +public class XKeyEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + ROOT, + SUBWINDOW, + TIME, + X, + Y, + X_ROOT, + Y_ROOT, + STATE, + KEYCODE, + SAME_SCREEN; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + ROOT = layout.offsetof(5); + SUBWINDOW = layout.offsetof(6); + TIME = layout.offsetof(7); + X = layout.offsetof(8); + Y = layout.offsetof(9); + X_ROOT = layout.offsetof(10); + Y_ROOT = layout.offsetof(11); + STATE = layout.offsetof(12); + KEYCODE = layout.offsetof(13); + SAME_SCREEN = layout.offsetof(14); + } + + protected XKeyEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XKeyEvent create(long address, @Nullable ByteBuffer container) { + return new XKeyEvent(address, container); + } + + /** + * Creates a {@code XKeyEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XKeyEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the event type. One of:
    {@link X11#KeyPress}{@link X11#KeyRelease}
    */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** root window that the event occurred on */ + @NativeType("Window") + public long root() { return nroot(address()); } + /** child window */ + @NativeType("Window") + public long subwindow() { return nsubwindow(address()); } + /** milliseconds */ + @NativeType("Time") + public long time() { return ntime(address()); } + /** pointer x coordinate in event window */ + public int x() { return nx(address()); } + /** pointer y coordinate in event window */ + public int y() { return ny(address()); } + /** x coordinate relative to {@code root} */ + public int x_root() { return nx_root(address()); } + /** y coordinate relative to {@code root} */ + public int y_root() { return ny_root(address()); } + /** key mask */ + @NativeType("unsigned int") + public int state() { return nstate(address()); } + /** detail */ + @NativeType("unsigned int") + public int keycode() { return nkeycode(address()); } + /** same screen flag */ + @NativeType("Bool") + public boolean same_screen() { return nsame_screen(address()) != 0; } + + /** Sets the specified value to the {@link #type} field. */ + public XKeyEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XKeyEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XKeyEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XKeyEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XKeyEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #root} field. */ + public XKeyEvent root(@NativeType("Window") long value) { nroot(address(), value); return this; } + /** Sets the specified value to the {@link #subwindow} field. */ + public XKeyEvent subwindow(@NativeType("Window") long value) { nsubwindow(address(), value); return this; } + /** Sets the specified value to the {@link #time} field. */ + public XKeyEvent time(@NativeType("Time") long value) { ntime(address(), value); return this; } + /** Sets the specified value to the {@link #x} field. */ + public XKeyEvent x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@link #y} field. */ + public XKeyEvent y(int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@link #x_root} field. */ + public XKeyEvent x_root(int value) { nx_root(address(), value); return this; } + /** Sets the specified value to the {@link #y_root} field. */ + public XKeyEvent y_root(int value) { ny_root(address(), value); return this; } + /** Sets the specified value to the {@link #state} field. */ + public XKeyEvent state(@NativeType("unsigned int") int value) { nstate(address(), value); return this; } + /** Sets the specified value to the {@link #keycode} field. */ + public XKeyEvent keycode(@NativeType("unsigned int") int value) { nkeycode(address(), value); return this; } + /** Sets the specified value to the {@link #same_screen} field. */ + public XKeyEvent same_screen(@NativeType("Bool") boolean value) { nsame_screen(address(), value ? 1 : 0); return this; } + + /** Initializes this struct with the specified values. */ + public XKeyEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + long root, + long subwindow, + long time, + int x, + int y, + int x_root, + int y_root, + int state, + int keycode, + boolean same_screen + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + root(root); + subwindow(subwindow); + time(time); + x(x); + y(y); + x_root(x_root); + y_root(y_root); + state(state); + keycode(keycode); + same_screen(same_screen); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XKeyEvent set(XKeyEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XKeyEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XKeyEvent malloc() { + return new XKeyEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XKeyEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XKeyEvent calloc() { + return new XKeyEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XKeyEvent} instance allocated with {@link BufferUtils}. */ + public static XKeyEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XKeyEvent(memAddress(container), container); + } + + /** Returns a new {@code XKeyEvent} instance for the specified memory address. */ + public static XKeyEvent create(long address) { + return new XKeyEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XKeyEvent createSafe(long address) { + return address == NULL ? null : new XKeyEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XKeyEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XKeyEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XKeyEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XKeyEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XKeyEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XKeyEvent malloc(MemoryStack stack) { + return new XKeyEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XKeyEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XKeyEvent calloc(MemoryStack stack) { + return new XKeyEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XKeyEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XKeyEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XKeyEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XKeyEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XKeyEvent.WINDOW); } + /** Unsafe version of {@link #root}. */ + public static long nroot(long struct) { return memGetCLong(struct + XKeyEvent.ROOT); } + /** Unsafe version of {@link #subwindow}. */ + public static long nsubwindow(long struct) { return memGetCLong(struct + XKeyEvent.SUBWINDOW); } + /** Unsafe version of {@link #time}. */ + public static long ntime(long struct) { return memGetCLong(struct + XKeyEvent.TIME); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + XKeyEvent.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + XKeyEvent.Y); } + /** Unsafe version of {@link #x_root}. */ + public static int nx_root(long struct) { return UNSAFE.getInt(null, struct + XKeyEvent.X_ROOT); } + /** Unsafe version of {@link #y_root}. */ + public static int ny_root(long struct) { return UNSAFE.getInt(null, struct + XKeyEvent.Y_ROOT); } + /** Unsafe version of {@link #state}. */ + public static int nstate(long struct) { return UNSAFE.getInt(null, struct + XKeyEvent.STATE); } + /** Unsafe version of {@link #keycode}. */ + public static int nkeycode(long struct) { return UNSAFE.getInt(null, struct + XKeyEvent.KEYCODE); } + /** Unsafe version of {@link #same_screen}. */ + public static int nsame_screen(long struct) { return UNSAFE.getInt(null, struct + XKeyEvent.SAME_SCREEN); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XKeyEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XKeyEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XKeyEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XKeyEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XKeyEvent.WINDOW, value); } + /** Unsafe version of {@link #root(long) root}. */ + public static void nroot(long struct, long value) { memPutCLong(struct + XKeyEvent.ROOT, value); } + /** Unsafe version of {@link #subwindow(long) subwindow}. */ + public static void nsubwindow(long struct, long value) { memPutCLong(struct + XKeyEvent.SUBWINDOW, value); } + /** Unsafe version of {@link #time(long) time}. */ + public static void ntime(long struct, long value) { memPutCLong(struct + XKeyEvent.TIME, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + XKeyEvent.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + XKeyEvent.Y, value); } + /** Unsafe version of {@link #x_root(int) x_root}. */ + public static void nx_root(long struct, int value) { UNSAFE.putInt(null, struct + XKeyEvent.X_ROOT, value); } + /** Unsafe version of {@link #y_root(int) y_root}. */ + public static void ny_root(long struct, int value) { UNSAFE.putInt(null, struct + XKeyEvent.Y_ROOT, value); } + /** Unsafe version of {@link #state(int) state}. */ + public static void nstate(long struct, int value) { UNSAFE.putInt(null, struct + XKeyEvent.STATE, value); } + /** Unsafe version of {@link #keycode(int) keycode}. */ + public static void nkeycode(long struct, int value) { UNSAFE.putInt(null, struct + XKeyEvent.KEYCODE, value); } + /** Unsafe version of {@link #same_screen(boolean) same_screen}. */ + public static void nsame_screen(long struct, int value) { UNSAFE.putInt(null, struct + XKeyEvent.SAME_SCREEN, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XKeyEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XKeyEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XKeyEvent ELEMENT_FACTORY = XKeyEvent.create(-1L); + + /** + * Creates a new {@code XKeyEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XKeyEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XKeyEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link XKeyEvent#type} field. */ + public int type() { return XKeyEvent.ntype(address()); } + /** @return the value of the {@link XKeyEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XKeyEvent.nserial(address()); } + /** @return the value of the {@link XKeyEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XKeyEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XKeyEvent#display} field. */ + @NativeType("Display *") + public long display() { return XKeyEvent.ndisplay(address()); } + /** @return the value of the {@link XKeyEvent#window} field. */ + @NativeType("Window") + public long window() { return XKeyEvent.nwindow(address()); } + /** @return the value of the {@link XKeyEvent#root} field. */ + @NativeType("Window") + public long root() { return XKeyEvent.nroot(address()); } + /** @return the value of the {@link XKeyEvent#subwindow} field. */ + @NativeType("Window") + public long subwindow() { return XKeyEvent.nsubwindow(address()); } + /** @return the value of the {@link XKeyEvent#time} field. */ + @NativeType("Time") + public long time() { return XKeyEvent.ntime(address()); } + /** @return the value of the {@link XKeyEvent#x} field. */ + public int x() { return XKeyEvent.nx(address()); } + /** @return the value of the {@link XKeyEvent#y} field. */ + public int y() { return XKeyEvent.ny(address()); } + /** @return the value of the {@link XKeyEvent#x_root} field. */ + public int x_root() { return XKeyEvent.nx_root(address()); } + /** @return the value of the {@link XKeyEvent#y_root} field. */ + public int y_root() { return XKeyEvent.ny_root(address()); } + /** @return the value of the {@link XKeyEvent#state} field. */ + @NativeType("unsigned int") + public int state() { return XKeyEvent.nstate(address()); } + /** @return the value of the {@link XKeyEvent#keycode} field. */ + @NativeType("unsigned int") + public int keycode() { return XKeyEvent.nkeycode(address()); } + /** @return the value of the {@link XKeyEvent#same_screen} field. */ + @NativeType("Bool") + public boolean same_screen() { return XKeyEvent.nsame_screen(address()) != 0; } + + /** Sets the specified value to the {@link XKeyEvent#type} field. */ + public Buffer type(int value) { XKeyEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XKeyEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XKeyEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XKeyEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XKeyEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XKeyEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#root} field. */ + public Buffer root(@NativeType("Window") long value) { XKeyEvent.nroot(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#subwindow} field. */ + public Buffer subwindow(@NativeType("Window") long value) { XKeyEvent.nsubwindow(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#time} field. */ + public Buffer time(@NativeType("Time") long value) { XKeyEvent.ntime(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#x} field. */ + public Buffer x(int value) { XKeyEvent.nx(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#y} field. */ + public Buffer y(int value) { XKeyEvent.ny(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#x_root} field. */ + public Buffer x_root(int value) { XKeyEvent.nx_root(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#y_root} field. */ + public Buffer y_root(int value) { XKeyEvent.ny_root(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#state} field. */ + public Buffer state(@NativeType("unsigned int") int value) { XKeyEvent.nstate(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#keycode} field. */ + public Buffer keycode(@NativeType("unsigned int") int value) { XKeyEvent.nkeycode(address(), value); return this; } + /** Sets the specified value to the {@link XKeyEvent#same_screen} field. */ + public Buffer same_screen(@NativeType("Bool") boolean value) { XKeyEvent.nsame_screen(address(), value ? 1 : 0); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XKeymapEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XKeymapEvent.java new file mode 100644 index 000000000..dbd89f126 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XKeymapEvent.java @@ -0,0 +1,415 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Generated on {@code EnterWindow} and {@code FocusIn} when {@code KeyMapState} selected. + * + *

    Layout

    + * + *
    
    + * struct XKeymapEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     char key_vector[32];
    + * }
    + */ +public class XKeymapEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + KEY_VECTOR; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __array(1, 32) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + KEY_VECTOR = layout.offsetof(5); + } + + protected XKeymapEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XKeymapEvent create(long address, @Nullable ByteBuffer container) { + return new XKeymapEvent(address, container); + } + + /** + * Creates a {@code XKeymapEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XKeymapEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** @return a {@link ByteBuffer} view of the {@code key_vector} field. */ + @NativeType("char[32]") + public ByteBuffer key_vector() { return nkey_vector(address()); } + /** @return the value at the specified index of the {@code key_vector} field. */ + @NativeType("char") + public byte key_vector(int index) { return nkey_vector(address(), index); } + + /** Sets the specified value to the {@code type} field. */ + public XKeymapEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XKeymapEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XKeymapEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XKeymapEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XKeymapEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Copies the specified {@link ByteBuffer} to the {@code key_vector} field. */ + public XKeymapEvent key_vector(@NativeType("char[32]") ByteBuffer value) { nkey_vector(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code key_vector} field. */ + public XKeymapEvent key_vector(int index, @NativeType("char") byte value) { nkey_vector(address(), index, value); return this; } + + /** Initializes this struct with the specified values. */ + public XKeymapEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + ByteBuffer key_vector + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + key_vector(key_vector); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XKeymapEvent set(XKeymapEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XKeymapEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XKeymapEvent malloc() { + return new XKeymapEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XKeymapEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XKeymapEvent calloc() { + return new XKeymapEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XKeymapEvent} instance allocated with {@link BufferUtils}. */ + public static XKeymapEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XKeymapEvent(memAddress(container), container); + } + + /** Returns a new {@code XKeymapEvent} instance for the specified memory address. */ + public static XKeymapEvent create(long address) { + return new XKeymapEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XKeymapEvent createSafe(long address) { + return address == NULL ? null : new XKeymapEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XKeymapEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XKeymapEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XKeymapEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XKeymapEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XKeymapEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XKeymapEvent malloc(MemoryStack stack) { + return new XKeymapEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XKeymapEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XKeymapEvent calloc(MemoryStack stack) { + return new XKeymapEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XKeymapEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XKeymapEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XKeymapEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XKeymapEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XKeymapEvent.WINDOW); } + /** Unsafe version of {@link #key_vector}. */ + public static ByteBuffer nkey_vector(long struct) { return memByteBuffer(struct + XKeymapEvent.KEY_VECTOR, 32); } + /** Unsafe version of {@link #key_vector(int) key_vector}. */ + public static byte nkey_vector(long struct, int index) { + return UNSAFE.getByte(null, struct + XKeymapEvent.KEY_VECTOR + check(index, 32) * 1); + } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XKeymapEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XKeymapEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XKeymapEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XKeymapEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XKeymapEvent.WINDOW, value); } + /** Unsafe version of {@link #key_vector(ByteBuffer) key_vector}. */ + public static void nkey_vector(long struct, ByteBuffer value) { + if (CHECKS) { checkGT(value, 32); } + memCopy(memAddress(value), struct + XKeymapEvent.KEY_VECTOR, value.remaining() * 1); + } + /** Unsafe version of {@link #key_vector(int, byte) key_vector}. */ + public static void nkey_vector(long struct, int index, byte value) { + UNSAFE.putByte(null, struct + XKeymapEvent.KEY_VECTOR + check(index, 32) * 1, value); + } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XKeymapEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XKeymapEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XKeymapEvent ELEMENT_FACTORY = XKeymapEvent.create(-1L); + + /** + * Creates a new {@code XKeymapEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XKeymapEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XKeymapEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XKeymapEvent.ntype(address()); } + /** @return the value of the {@link XKeymapEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XKeymapEvent.nserial(address()); } + /** @return the value of the {@link XKeymapEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XKeymapEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XKeymapEvent#display} field. */ + @NativeType("Display *") + public long display() { return XKeymapEvent.ndisplay(address()); } + /** @return the value of the {@link XKeymapEvent#window} field. */ + @NativeType("Window") + public long window() { return XKeymapEvent.nwindow(address()); } + /** @return a {@link ByteBuffer} view of the {@code key_vector} field. */ + @NativeType("char[32]") + public ByteBuffer key_vector() { return XKeymapEvent.nkey_vector(address()); } + /** @return the value at the specified index of the {@code key_vector} field. */ + @NativeType("char") + public byte key_vector(int index) { return XKeymapEvent.nkey_vector(address(), index); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XKeymapEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XKeymapEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XKeymapEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XKeymapEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XKeymapEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XKeymapEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XKeymapEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XKeymapEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XKeymapEvent.nwindow(address(), value); return this; } + /** Copies the specified {@link ByteBuffer} to the {@code key_vector} field. */ + public Buffer key_vector(@NativeType("char[32]") ByteBuffer value) { XKeymapEvent.nkey_vector(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code key_vector} field. */ + public Buffer key_vector(int index, @NativeType("char") byte value) { XKeymapEvent.nkey_vector(address(), index, value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMapEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMapEvent.java new file mode 100644 index 000000000..917799408 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMapEvent.java @@ -0,0 +1,410 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XMapEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window event;
    + *     Window window;
    + *     int {@link #override_redirect};
    + * }
    + */ +public class XMapEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + EVENT, + WINDOW, + OVERRIDE_REDIRECT; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + EVENT = layout.offsetof(4); + WINDOW = layout.offsetof(5); + OVERRIDE_REDIRECT = layout.offsetof(6); + } + + protected XMapEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XMapEvent create(long address, @Nullable ByteBuffer container) { + return new XMapEvent(address, container); + } + + /** + * Creates a {@code XMapEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XMapEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** boolean, is override set... */ + public int override_redirect() { return noverride_redirect(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XMapEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XMapEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XMapEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XMapEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public XMapEvent event(@NativeType("Window") long value) { nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public XMapEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #override_redirect} field. */ + public XMapEvent override_redirect(int value) { noverride_redirect(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XMapEvent set( + int type, + long serial, + boolean send_event, + long display, + long event, + long window, + int override_redirect + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + event(event); + window(window); + override_redirect(override_redirect); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XMapEvent set(XMapEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XMapEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XMapEvent malloc() { + return new XMapEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XMapEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XMapEvent calloc() { + return new XMapEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XMapEvent} instance allocated with {@link BufferUtils}. */ + public static XMapEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XMapEvent(memAddress(container), container); + } + + /** Returns a new {@code XMapEvent} instance for the specified memory address. */ + public static XMapEvent create(long address) { + return new XMapEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XMapEvent createSafe(long address) { + return address == NULL ? null : new XMapEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XMapEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XMapEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XMapEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XMapEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XMapEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XMapEvent malloc(MemoryStack stack) { + return new XMapEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XMapEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XMapEvent calloc(MemoryStack stack) { + return new XMapEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XMapEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XMapEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XMapEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XMapEvent.DISPLAY); } + /** Unsafe version of {@link #event}. */ + public static long nevent(long struct) { return memGetCLong(struct + XMapEvent.EVENT); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XMapEvent.WINDOW); } + /** Unsafe version of {@link #override_redirect}. */ + public static int noverride_redirect(long struct) { return UNSAFE.getInt(null, struct + XMapEvent.OVERRIDE_REDIRECT); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XMapEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XMapEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XMapEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XMapEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #event(long) event}. */ + public static void nevent(long struct, long value) { memPutCLong(struct + XMapEvent.EVENT, value); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XMapEvent.WINDOW, value); } + /** Unsafe version of {@link #override_redirect(int) override_redirect}. */ + public static void noverride_redirect(long struct, int value) { UNSAFE.putInt(null, struct + XMapEvent.OVERRIDE_REDIRECT, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XMapEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XMapEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XMapEvent ELEMENT_FACTORY = XMapEvent.create(-1L); + + /** + * Creates a new {@code XMapEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XMapEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XMapEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XMapEvent.ntype(address()); } + /** @return the value of the {@link XMapEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XMapEvent.nserial(address()); } + /** @return the value of the {@link XMapEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XMapEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XMapEvent#display} field. */ + @NativeType("Display *") + public long display() { return XMapEvent.ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return XMapEvent.nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return XMapEvent.nwindow(address()); } + /** @return the value of the {@link XMapEvent#override_redirect} field. */ + public int override_redirect() { return XMapEvent.noverride_redirect(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XMapEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XMapEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XMapEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XMapEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XMapEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XMapEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XMapEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public Buffer event(@NativeType("Window") long value) { XMapEvent.nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public Buffer window(@NativeType("Window") long value) { XMapEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XMapEvent#override_redirect} field. */ + public Buffer override_redirect(int value) { XMapEvent.noverride_redirect(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMapRequestEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMapRequestEvent.java new file mode 100644 index 000000000..0216ef596 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMapRequestEvent.java @@ -0,0 +1,392 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XMapRequestEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window parent;
    + *     Window window;
    + * }
    + */ +public class XMapRequestEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + PARENT, + WINDOW; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + PARENT = layout.offsetof(4); + WINDOW = layout.offsetof(5); + } + + protected XMapRequestEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XMapRequestEvent create(long address, @Nullable ByteBuffer container) { + return new XMapRequestEvent(address, container); + } + + /** + * Creates a {@code XMapRequestEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XMapRequestEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code parent} field. */ + @NativeType("Window") + public long parent() { return nparent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return nwindow(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XMapRequestEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XMapRequestEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XMapRequestEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XMapRequestEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code parent} field. */ + public XMapRequestEvent parent(@NativeType("Window") long value) { nparent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public XMapRequestEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XMapRequestEvent set( + int type, + long serial, + boolean send_event, + long display, + long parent, + long window + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + parent(parent); + window(window); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XMapRequestEvent set(XMapRequestEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XMapRequestEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XMapRequestEvent malloc() { + return new XMapRequestEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XMapRequestEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XMapRequestEvent calloc() { + return new XMapRequestEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XMapRequestEvent} instance allocated with {@link BufferUtils}. */ + public static XMapRequestEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XMapRequestEvent(memAddress(container), container); + } + + /** Returns a new {@code XMapRequestEvent} instance for the specified memory address. */ + public static XMapRequestEvent create(long address) { + return new XMapRequestEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XMapRequestEvent createSafe(long address) { + return address == NULL ? null : new XMapRequestEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XMapRequestEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XMapRequestEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XMapRequestEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XMapRequestEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XMapRequestEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XMapRequestEvent malloc(MemoryStack stack) { + return new XMapRequestEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XMapRequestEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XMapRequestEvent calloc(MemoryStack stack) { + return new XMapRequestEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XMapRequestEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XMapRequestEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XMapRequestEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XMapRequestEvent.DISPLAY); } + /** Unsafe version of {@link #parent}. */ + public static long nparent(long struct) { return memGetCLong(struct + XMapRequestEvent.PARENT); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XMapRequestEvent.WINDOW); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XMapRequestEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XMapRequestEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XMapRequestEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XMapRequestEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #parent(long) parent}. */ + public static void nparent(long struct, long value) { memPutCLong(struct + XMapRequestEvent.PARENT, value); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XMapRequestEvent.WINDOW, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XMapRequestEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XMapRequestEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XMapRequestEvent ELEMENT_FACTORY = XMapRequestEvent.create(-1L); + + /** + * Creates a new {@code XMapRequestEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XMapRequestEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XMapRequestEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XMapRequestEvent.ntype(address()); } + /** @return the value of the {@link XMapRequestEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XMapRequestEvent.nserial(address()); } + /** @return the value of the {@link XMapRequestEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XMapRequestEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XMapRequestEvent#display} field. */ + @NativeType("Display *") + public long display() { return XMapRequestEvent.ndisplay(address()); } + /** @return the value of the {@code parent} field. */ + @NativeType("Window") + public long parent() { return XMapRequestEvent.nparent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return XMapRequestEvent.nwindow(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XMapRequestEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XMapRequestEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XMapRequestEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XMapRequestEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XMapRequestEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XMapRequestEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XMapRequestEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code parent} field. */ + public Buffer parent(@NativeType("Window") long value) { XMapRequestEvent.nparent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public Buffer window(@NativeType("Window") long value) { XMapRequestEvent.nwindow(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMappingEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMappingEvent.java new file mode 100644 index 000000000..cef4a8f3f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMappingEvent.java @@ -0,0 +1,426 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XMappingEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     int {@link #request};
    + *     int {@link #first_keycode};
    + *     int {@link #count};
    + * }
    + */ +public class XMappingEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + REQUEST, + FIRST_KEYCODE, + COUNT; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + REQUEST = layout.offsetof(5); + FIRST_KEYCODE = layout.offsetof(6); + COUNT = layout.offsetof(7); + } + + protected XMappingEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XMappingEvent create(long address, @Nullable ByteBuffer container) { + return new XMappingEvent(address, container); + } + + /** + * Creates a {@code XMappingEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XMappingEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** one of:
    {@link X11#MappingModifier}{@link X11#MappingKeyboard}{@link X11#MappingPointer}
    */ + public int request() { return nrequest(address()); } + /** first keycode */ + public int first_keycode() { return nfirst_keycode(address()); } + /** defines range of change w. {@code first_keycode} */ + public int count() { return ncount(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XMappingEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XMappingEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XMappingEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XMappingEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XMappingEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #request} field. */ + public XMappingEvent request(int value) { nrequest(address(), value); return this; } + /** Sets the specified value to the {@link #first_keycode} field. */ + public XMappingEvent first_keycode(int value) { nfirst_keycode(address(), value); return this; } + /** Sets the specified value to the {@link #count} field. */ + public XMappingEvent count(int value) { ncount(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XMappingEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + int request, + int first_keycode, + int count + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + request(request); + first_keycode(first_keycode); + count(count); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XMappingEvent set(XMappingEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XMappingEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XMappingEvent malloc() { + return new XMappingEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XMappingEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XMappingEvent calloc() { + return new XMappingEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XMappingEvent} instance allocated with {@link BufferUtils}. */ + public static XMappingEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XMappingEvent(memAddress(container), container); + } + + /** Returns a new {@code XMappingEvent} instance for the specified memory address. */ + public static XMappingEvent create(long address) { + return new XMappingEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XMappingEvent createSafe(long address) { + return address == NULL ? null : new XMappingEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XMappingEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XMappingEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XMappingEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XMappingEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XMappingEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XMappingEvent malloc(MemoryStack stack) { + return new XMappingEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XMappingEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XMappingEvent calloc(MemoryStack stack) { + return new XMappingEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XMappingEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XMappingEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XMappingEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XMappingEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XMappingEvent.WINDOW); } + /** Unsafe version of {@link #request}. */ + public static int nrequest(long struct) { return UNSAFE.getInt(null, struct + XMappingEvent.REQUEST); } + /** Unsafe version of {@link #first_keycode}. */ + public static int nfirst_keycode(long struct) { return UNSAFE.getInt(null, struct + XMappingEvent.FIRST_KEYCODE); } + /** Unsafe version of {@link #count}. */ + public static int ncount(long struct) { return UNSAFE.getInt(null, struct + XMappingEvent.COUNT); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XMappingEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XMappingEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XMappingEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XMappingEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XMappingEvent.WINDOW, value); } + /** Unsafe version of {@link #request(int) request}. */ + public static void nrequest(long struct, int value) { UNSAFE.putInt(null, struct + XMappingEvent.REQUEST, value); } + /** Unsafe version of {@link #first_keycode(int) first_keycode}. */ + public static void nfirst_keycode(long struct, int value) { UNSAFE.putInt(null, struct + XMappingEvent.FIRST_KEYCODE, value); } + /** Unsafe version of {@link #count(int) count}. */ + public static void ncount(long struct, int value) { UNSAFE.putInt(null, struct + XMappingEvent.COUNT, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XMappingEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XMappingEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XMappingEvent ELEMENT_FACTORY = XMappingEvent.create(-1L); + + /** + * Creates a new {@code XMappingEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XMappingEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XMappingEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XMappingEvent.ntype(address()); } + /** @return the value of the {@link XMappingEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XMappingEvent.nserial(address()); } + /** @return the value of the {@link XMappingEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XMappingEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XMappingEvent#display} field. */ + @NativeType("Display *") + public long display() { return XMappingEvent.ndisplay(address()); } + /** @return the value of the {@link XMappingEvent#window} field. */ + @NativeType("Window") + public long window() { return XMappingEvent.nwindow(address()); } + /** @return the value of the {@link XMappingEvent#request} field. */ + public int request() { return XMappingEvent.nrequest(address()); } + /** @return the value of the {@link XMappingEvent#first_keycode} field. */ + public int first_keycode() { return XMappingEvent.nfirst_keycode(address()); } + /** @return the value of the {@link XMappingEvent#count} field. */ + public int count() { return XMappingEvent.ncount(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XMappingEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XMappingEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XMappingEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XMappingEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XMappingEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XMappingEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XMappingEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XMappingEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XMappingEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XMappingEvent#request} field. */ + public Buffer request(int value) { XMappingEvent.nrequest(address(), value); return this; } + /** Sets the specified value to the {@link XMappingEvent#first_keycode} field. */ + public Buffer first_keycode(int value) { XMappingEvent.nfirst_keycode(address(), value); return this; } + /** Sets the specified value to the {@link XMappingEvent#count} field. */ + public Buffer count(int value) { XMappingEvent.ncount(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMotionEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMotionEvent.java new file mode 100644 index 000000000..df34e0146 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XMotionEvent.java @@ -0,0 +1,566 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Motion event. + * + *

    Layout

    + * + *
    
    + * struct XMotionEvent {
    + *     int {@link #type};
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     Window {@link #root};
    + *     Window {@link #subwindow};
    + *     Time {@link #time};
    + *     int {@link #x};
    + *     int {@link #y};
    + *     int {@link #x_root};
    + *     int {@link #y_root};
    + *     unsigned int {@link #state};
    + *     char {@link #is_hint};
    + *     Bool {@link #same_screen};
    + * }
    + */ +public class XMotionEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + ROOT, + SUBWINDOW, + TIME, + X, + Y, + X_ROOT, + Y_ROOT, + STATE, + IS_HINT, + SAME_SCREEN; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(1), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + ROOT = layout.offsetof(5); + SUBWINDOW = layout.offsetof(6); + TIME = layout.offsetof(7); + X = layout.offsetof(8); + Y = layout.offsetof(9); + X_ROOT = layout.offsetof(10); + Y_ROOT = layout.offsetof(11); + STATE = layout.offsetof(12); + IS_HINT = layout.offsetof(13); + SAME_SCREEN = layout.offsetof(14); + } + + protected XMotionEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XMotionEvent create(long address, @Nullable ByteBuffer container) { + return new XMotionEvent(address, container); + } + + /** + * Creates a {@code XMotionEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XMotionEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the event type. Must be:
    {@link X11#MotionNotify}
    */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** root window that the event occurred on */ + @NativeType("Window") + public long root() { return nroot(address()); } + /** child window */ + @NativeType("Window") + public long subwindow() { return nsubwindow(address()); } + /** milliseconds */ + @NativeType("Time") + public long time() { return ntime(address()); } + /** pointer x coordinate in event window */ + public int x() { return nx(address()); } + /** pointer y coordinate in event window */ + public int y() { return ny(address()); } + /** x coordinate relative to {@code root} */ + public int x_root() { return nx_root(address()); } + /** y coordinate relative to {@code root} */ + public int y_root() { return ny_root(address()); } + /** key or button mask */ + @NativeType("unsigned int") + public int state() { return nstate(address()); } + /** detail */ + @NativeType("char") + public byte is_hint() { return nis_hint(address()); } + /** same screen flag */ + @NativeType("Bool") + public boolean same_screen() { return nsame_screen(address()) != 0; } + + /** Sets the specified value to the {@link #type} field. */ + public XMotionEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XMotionEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XMotionEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XMotionEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XMotionEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #root} field. */ + public XMotionEvent root(@NativeType("Window") long value) { nroot(address(), value); return this; } + /** Sets the specified value to the {@link #subwindow} field. */ + public XMotionEvent subwindow(@NativeType("Window") long value) { nsubwindow(address(), value); return this; } + /** Sets the specified value to the {@link #time} field. */ + public XMotionEvent time(@NativeType("Time") long value) { ntime(address(), value); return this; } + /** Sets the specified value to the {@link #x} field. */ + public XMotionEvent x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@link #y} field. */ + public XMotionEvent y(int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@link #x_root} field. */ + public XMotionEvent x_root(int value) { nx_root(address(), value); return this; } + /** Sets the specified value to the {@link #y_root} field. */ + public XMotionEvent y_root(int value) { ny_root(address(), value); return this; } + /** Sets the specified value to the {@link #state} field. */ + public XMotionEvent state(@NativeType("unsigned int") int value) { nstate(address(), value); return this; } + /** Sets the specified value to the {@link #is_hint} field. */ + public XMotionEvent is_hint(@NativeType("char") byte value) { nis_hint(address(), value); return this; } + /** Sets the specified value to the {@link #same_screen} field. */ + public XMotionEvent same_screen(@NativeType("Bool") boolean value) { nsame_screen(address(), value ? 1 : 0); return this; } + + /** Initializes this struct with the specified values. */ + public XMotionEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + long root, + long subwindow, + long time, + int x, + int y, + int x_root, + int y_root, + int state, + byte is_hint, + boolean same_screen + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + root(root); + subwindow(subwindow); + time(time); + x(x); + y(y); + x_root(x_root); + y_root(y_root); + state(state); + is_hint(is_hint); + same_screen(same_screen); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XMotionEvent set(XMotionEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XMotionEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XMotionEvent malloc() { + return new XMotionEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XMotionEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XMotionEvent calloc() { + return new XMotionEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XMotionEvent} instance allocated with {@link BufferUtils}. */ + public static XMotionEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XMotionEvent(memAddress(container), container); + } + + /** Returns a new {@code XMotionEvent} instance for the specified memory address. */ + public static XMotionEvent create(long address) { + return new XMotionEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XMotionEvent createSafe(long address) { + return address == NULL ? null : new XMotionEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XMotionEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XMotionEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XMotionEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XMotionEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XMotionEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XMotionEvent malloc(MemoryStack stack) { + return new XMotionEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XMotionEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XMotionEvent calloc(MemoryStack stack) { + return new XMotionEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XMotionEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XMotionEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XMotionEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XMotionEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XMotionEvent.WINDOW); } + /** Unsafe version of {@link #root}. */ + public static long nroot(long struct) { return memGetCLong(struct + XMotionEvent.ROOT); } + /** Unsafe version of {@link #subwindow}. */ + public static long nsubwindow(long struct) { return memGetCLong(struct + XMotionEvent.SUBWINDOW); } + /** Unsafe version of {@link #time}. */ + public static long ntime(long struct) { return memGetCLong(struct + XMotionEvent.TIME); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + XMotionEvent.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + XMotionEvent.Y); } + /** Unsafe version of {@link #x_root}. */ + public static int nx_root(long struct) { return UNSAFE.getInt(null, struct + XMotionEvent.X_ROOT); } + /** Unsafe version of {@link #y_root}. */ + public static int ny_root(long struct) { return UNSAFE.getInt(null, struct + XMotionEvent.Y_ROOT); } + /** Unsafe version of {@link #state}. */ + public static int nstate(long struct) { return UNSAFE.getInt(null, struct + XMotionEvent.STATE); } + /** Unsafe version of {@link #is_hint}. */ + public static byte nis_hint(long struct) { return UNSAFE.getByte(null, struct + XMotionEvent.IS_HINT); } + /** Unsafe version of {@link #same_screen}. */ + public static int nsame_screen(long struct) { return UNSAFE.getInt(null, struct + XMotionEvent.SAME_SCREEN); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XMotionEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XMotionEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XMotionEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XMotionEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XMotionEvent.WINDOW, value); } + /** Unsafe version of {@link #root(long) root}. */ + public static void nroot(long struct, long value) { memPutCLong(struct + XMotionEvent.ROOT, value); } + /** Unsafe version of {@link #subwindow(long) subwindow}. */ + public static void nsubwindow(long struct, long value) { memPutCLong(struct + XMotionEvent.SUBWINDOW, value); } + /** Unsafe version of {@link #time(long) time}. */ + public static void ntime(long struct, long value) { memPutCLong(struct + XMotionEvent.TIME, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + XMotionEvent.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + XMotionEvent.Y, value); } + /** Unsafe version of {@link #x_root(int) x_root}. */ + public static void nx_root(long struct, int value) { UNSAFE.putInt(null, struct + XMotionEvent.X_ROOT, value); } + /** Unsafe version of {@link #y_root(int) y_root}. */ + public static void ny_root(long struct, int value) { UNSAFE.putInt(null, struct + XMotionEvent.Y_ROOT, value); } + /** Unsafe version of {@link #state(int) state}. */ + public static void nstate(long struct, int value) { UNSAFE.putInt(null, struct + XMotionEvent.STATE, value); } + /** Unsafe version of {@link #is_hint(byte) is_hint}. */ + public static void nis_hint(long struct, byte value) { UNSAFE.putByte(null, struct + XMotionEvent.IS_HINT, value); } + /** Unsafe version of {@link #same_screen(boolean) same_screen}. */ + public static void nsame_screen(long struct, int value) { UNSAFE.putInt(null, struct + XMotionEvent.SAME_SCREEN, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XMotionEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XMotionEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XMotionEvent ELEMENT_FACTORY = XMotionEvent.create(-1L); + + /** + * Creates a new {@code XMotionEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XMotionEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XMotionEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link XMotionEvent#type} field. */ + public int type() { return XMotionEvent.ntype(address()); } + /** @return the value of the {@link XMotionEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XMotionEvent.nserial(address()); } + /** @return the value of the {@link XMotionEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XMotionEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XMotionEvent#display} field. */ + @NativeType("Display *") + public long display() { return XMotionEvent.ndisplay(address()); } + /** @return the value of the {@link XMotionEvent#window} field. */ + @NativeType("Window") + public long window() { return XMotionEvent.nwindow(address()); } + /** @return the value of the {@link XMotionEvent#root} field. */ + @NativeType("Window") + public long root() { return XMotionEvent.nroot(address()); } + /** @return the value of the {@link XMotionEvent#subwindow} field. */ + @NativeType("Window") + public long subwindow() { return XMotionEvent.nsubwindow(address()); } + /** @return the value of the {@link XMotionEvent#time} field. */ + @NativeType("Time") + public long time() { return XMotionEvent.ntime(address()); } + /** @return the value of the {@link XMotionEvent#x} field. */ + public int x() { return XMotionEvent.nx(address()); } + /** @return the value of the {@link XMotionEvent#y} field. */ + public int y() { return XMotionEvent.ny(address()); } + /** @return the value of the {@link XMotionEvent#x_root} field. */ + public int x_root() { return XMotionEvent.nx_root(address()); } + /** @return the value of the {@link XMotionEvent#y_root} field. */ + public int y_root() { return XMotionEvent.ny_root(address()); } + /** @return the value of the {@link XMotionEvent#state} field. */ + @NativeType("unsigned int") + public int state() { return XMotionEvent.nstate(address()); } + /** @return the value of the {@link XMotionEvent#is_hint} field. */ + @NativeType("char") + public byte is_hint() { return XMotionEvent.nis_hint(address()); } + /** @return the value of the {@link XMotionEvent#same_screen} field. */ + @NativeType("Bool") + public boolean same_screen() { return XMotionEvent.nsame_screen(address()) != 0; } + + /** Sets the specified value to the {@link XMotionEvent#type} field. */ + public Buffer type(int value) { XMotionEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XMotionEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XMotionEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XMotionEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XMotionEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XMotionEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#root} field. */ + public Buffer root(@NativeType("Window") long value) { XMotionEvent.nroot(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#subwindow} field. */ + public Buffer subwindow(@NativeType("Window") long value) { XMotionEvent.nsubwindow(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#time} field. */ + public Buffer time(@NativeType("Time") long value) { XMotionEvent.ntime(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#x} field. */ + public Buffer x(int value) { XMotionEvent.nx(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#y} field. */ + public Buffer y(int value) { XMotionEvent.ny(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#x_root} field. */ + public Buffer x_root(int value) { XMotionEvent.nx_root(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#y_root} field. */ + public Buffer y_root(int value) { XMotionEvent.ny_root(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#state} field. */ + public Buffer state(@NativeType("unsigned int") int value) { XMotionEvent.nstate(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#is_hint} field. */ + public Buffer is_hint(@NativeType("char") byte value) { XMotionEvent.nis_hint(address(), value); return this; } + /** Sets the specified value to the {@link XMotionEvent#same_screen} field. */ + public Buffer same_screen(@NativeType("Bool") boolean value) { XMotionEvent.nsame_screen(address(), value ? 1 : 0); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XNoExposeEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XNoExposeEvent.java new file mode 100644 index 000000000..475d12711 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XNoExposeEvent.java @@ -0,0 +1,408 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XNoExposeEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Drawable drawable;
    + *     int {@link #major_code};
    + *     int {@link #minor_code};
    + * }
    + */ +public class XNoExposeEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + DRAWABLE, + MAJOR_CODE, + MINOR_CODE; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + DRAWABLE = layout.offsetof(4); + MAJOR_CODE = layout.offsetof(5); + MINOR_CODE = layout.offsetof(6); + } + + protected XNoExposeEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XNoExposeEvent create(long address, @Nullable ByteBuffer container) { + return new XNoExposeEvent(address, container); + } + + /** + * Creates a {@code XNoExposeEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XNoExposeEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code drawable} field. */ + @NativeType("Drawable") + public long drawable() { return ndrawable(address()); } + /** core is {@code CopyArea} or {@code CopyPlane} */ + public int major_code() { return nmajor_code(address()); } + /** not defined in the core */ + public int minor_code() { return nminor_code(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XNoExposeEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XNoExposeEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XNoExposeEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XNoExposeEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code drawable} field. */ + public XNoExposeEvent drawable(@NativeType("Drawable") long value) { ndrawable(address(), value); return this; } + /** Sets the specified value to the {@link #major_code} field. */ + public XNoExposeEvent major_code(int value) { nmajor_code(address(), value); return this; } + /** Sets the specified value to the {@link #minor_code} field. */ + public XNoExposeEvent minor_code(int value) { nminor_code(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XNoExposeEvent set( + int type, + long serial, + boolean send_event, + long display, + long drawable, + int major_code, + int minor_code + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + drawable(drawable); + major_code(major_code); + minor_code(minor_code); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XNoExposeEvent set(XNoExposeEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XNoExposeEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XNoExposeEvent malloc() { + return new XNoExposeEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XNoExposeEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XNoExposeEvent calloc() { + return new XNoExposeEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XNoExposeEvent} instance allocated with {@link BufferUtils}. */ + public static XNoExposeEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XNoExposeEvent(memAddress(container), container); + } + + /** Returns a new {@code XNoExposeEvent} instance for the specified memory address. */ + public static XNoExposeEvent create(long address) { + return new XNoExposeEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XNoExposeEvent createSafe(long address) { + return address == NULL ? null : new XNoExposeEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XNoExposeEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XNoExposeEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XNoExposeEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XNoExposeEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XNoExposeEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XNoExposeEvent malloc(MemoryStack stack) { + return new XNoExposeEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XNoExposeEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XNoExposeEvent calloc(MemoryStack stack) { + return new XNoExposeEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XNoExposeEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XNoExposeEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XNoExposeEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XNoExposeEvent.DISPLAY); } + /** Unsafe version of {@link #drawable}. */ + public static long ndrawable(long struct) { return memGetCLong(struct + XNoExposeEvent.DRAWABLE); } + /** Unsafe version of {@link #major_code}. */ + public static int nmajor_code(long struct) { return UNSAFE.getInt(null, struct + XNoExposeEvent.MAJOR_CODE); } + /** Unsafe version of {@link #minor_code}. */ + public static int nminor_code(long struct) { return UNSAFE.getInt(null, struct + XNoExposeEvent.MINOR_CODE); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XNoExposeEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XNoExposeEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XNoExposeEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XNoExposeEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #drawable(long) drawable}. */ + public static void ndrawable(long struct, long value) { memPutCLong(struct + XNoExposeEvent.DRAWABLE, value); } + /** Unsafe version of {@link #major_code(int) major_code}. */ + public static void nmajor_code(long struct, int value) { UNSAFE.putInt(null, struct + XNoExposeEvent.MAJOR_CODE, value); } + /** Unsafe version of {@link #minor_code(int) minor_code}. */ + public static void nminor_code(long struct, int value) { UNSAFE.putInt(null, struct + XNoExposeEvent.MINOR_CODE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XNoExposeEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XNoExposeEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XNoExposeEvent ELEMENT_FACTORY = XNoExposeEvent.create(-1L); + + /** + * Creates a new {@code XNoExposeEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XNoExposeEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XNoExposeEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XNoExposeEvent.ntype(address()); } + /** @return the value of the {@link XNoExposeEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XNoExposeEvent.nserial(address()); } + /** @return the value of the {@link XNoExposeEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XNoExposeEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XNoExposeEvent#display} field. */ + @NativeType("Display *") + public long display() { return XNoExposeEvent.ndisplay(address()); } + /** @return the value of the {@code drawable} field. */ + @NativeType("Drawable") + public long drawable() { return XNoExposeEvent.ndrawable(address()); } + /** @return the value of the {@link XNoExposeEvent#major_code} field. */ + public int major_code() { return XNoExposeEvent.nmajor_code(address()); } + /** @return the value of the {@link XNoExposeEvent#minor_code} field. */ + public int minor_code() { return XNoExposeEvent.nminor_code(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XNoExposeEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XNoExposeEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XNoExposeEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XNoExposeEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XNoExposeEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XNoExposeEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XNoExposeEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code drawable} field. */ + public Buffer drawable(@NativeType("Drawable") long value) { XNoExposeEvent.ndrawable(address(), value); return this; } + /** Sets the specified value to the {@link XNoExposeEvent#major_code} field. */ + public Buffer major_code(int value) { XNoExposeEvent.nmajor_code(address(), value); return this; } + /** Sets the specified value to the {@link XNoExposeEvent#minor_code} field. */ + public Buffer minor_code(int value) { XNoExposeEvent.nminor_code(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XPropertyEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XPropertyEvent.java new file mode 100644 index 000000000..53fb9dc87 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XPropertyEvent.java @@ -0,0 +1,432 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Property event. + * + *

    Layout

    + * + *
    
    + * struct XPropertyEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     Atom atom;
    + *     Time time;
    + *     int {@link #state};
    + * }
    + */ +public class XPropertyEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + ATOM, + TIME, + STATE; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + ATOM = layout.offsetof(5); + TIME = layout.offsetof(6); + STATE = layout.offsetof(7); + } + + protected XPropertyEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XPropertyEvent create(long address, @Nullable ByteBuffer container) { + return new XPropertyEvent(address, container); + } + + /** + * Creates a {@code XPropertyEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XPropertyEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** @return the value of the {@code atom} field. */ + @NativeType("Atom") + public long atom() { return natom(address()); } + /** @return the value of the {@code time} field. */ + @NativeType("Time") + public long time() { return ntime(address()); } + /** one of:
    {@link X11#PropertyNewValue}{@link X11#PropertyDelete}
    */ + public int state() { return nstate(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XPropertyEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XPropertyEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XPropertyEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XPropertyEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XPropertyEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@code atom} field. */ + public XPropertyEvent atom(@NativeType("Atom") long value) { natom(address(), value); return this; } + /** Sets the specified value to the {@code time} field. */ + public XPropertyEvent time(@NativeType("Time") long value) { ntime(address(), value); return this; } + /** Sets the specified value to the {@link #state} field. */ + public XPropertyEvent state(int value) { nstate(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XPropertyEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + long atom, + long time, + int state + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + atom(atom); + time(time); + state(state); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XPropertyEvent set(XPropertyEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XPropertyEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XPropertyEvent malloc() { + return new XPropertyEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XPropertyEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XPropertyEvent calloc() { + return new XPropertyEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XPropertyEvent} instance allocated with {@link BufferUtils}. */ + public static XPropertyEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XPropertyEvent(memAddress(container), container); + } + + /** Returns a new {@code XPropertyEvent} instance for the specified memory address. */ + public static XPropertyEvent create(long address) { + return new XPropertyEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XPropertyEvent createSafe(long address) { + return address == NULL ? null : new XPropertyEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XPropertyEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XPropertyEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XPropertyEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XPropertyEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XPropertyEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XPropertyEvent malloc(MemoryStack stack) { + return new XPropertyEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XPropertyEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XPropertyEvent calloc(MemoryStack stack) { + return new XPropertyEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XPropertyEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XPropertyEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XPropertyEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XPropertyEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XPropertyEvent.WINDOW); } + /** Unsafe version of {@link #atom}. */ + public static long natom(long struct) { return memGetCLong(struct + XPropertyEvent.ATOM); } + /** Unsafe version of {@link #time}. */ + public static long ntime(long struct) { return memGetCLong(struct + XPropertyEvent.TIME); } + /** Unsafe version of {@link #state}. */ + public static int nstate(long struct) { return UNSAFE.getInt(null, struct + XPropertyEvent.STATE); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XPropertyEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XPropertyEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XPropertyEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XPropertyEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XPropertyEvent.WINDOW, value); } + /** Unsafe version of {@link #atom(long) atom}. */ + public static void natom(long struct, long value) { memPutCLong(struct + XPropertyEvent.ATOM, value); } + /** Unsafe version of {@link #time(long) time}. */ + public static void ntime(long struct, long value) { memPutCLong(struct + XPropertyEvent.TIME, value); } + /** Unsafe version of {@link #state(int) state}. */ + public static void nstate(long struct, int value) { UNSAFE.putInt(null, struct + XPropertyEvent.STATE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XPropertyEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XPropertyEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XPropertyEvent ELEMENT_FACTORY = XPropertyEvent.create(-1L); + + /** + * Creates a new {@code XPropertyEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XPropertyEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XPropertyEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XPropertyEvent.ntype(address()); } + /** @return the value of the {@link XPropertyEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XPropertyEvent.nserial(address()); } + /** @return the value of the {@link XPropertyEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XPropertyEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XPropertyEvent#display} field. */ + @NativeType("Display *") + public long display() { return XPropertyEvent.ndisplay(address()); } + /** @return the value of the {@link XPropertyEvent#window} field. */ + @NativeType("Window") + public long window() { return XPropertyEvent.nwindow(address()); } + /** @return the value of the {@code atom} field. */ + @NativeType("Atom") + public long atom() { return XPropertyEvent.natom(address()); } + /** @return the value of the {@code time} field. */ + @NativeType("Time") + public long time() { return XPropertyEvent.ntime(address()); } + /** @return the value of the {@link XPropertyEvent#state} field. */ + public int state() { return XPropertyEvent.nstate(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XPropertyEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XPropertyEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XPropertyEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XPropertyEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XPropertyEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XPropertyEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XPropertyEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XPropertyEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XPropertyEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@code atom} field. */ + public Buffer atom(@NativeType("Atom") long value) { XPropertyEvent.natom(address(), value); return this; } + /** Sets the specified value to the {@code time} field. */ + public Buffer time(@NativeType("Time") long value) { XPropertyEvent.ntime(address(), value); return this; } + /** Sets the specified value to the {@link XPropertyEvent#state} field. */ + public Buffer state(int value) { XPropertyEvent.nstate(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XReparentEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XReparentEvent.java new file mode 100644 index 000000000..3e60573dc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XReparentEvent.java @@ -0,0 +1,466 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XReparentEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window event;
    + *     Window window;
    + *     Window parent;
    + *     int x;
    + *     int y;
    + *     int override_redirect;
    + * }
    + */ +public class XReparentEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + EVENT, + WINDOW, + PARENT, + X, + Y, + OVERRIDE_REDIRECT; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + EVENT = layout.offsetof(4); + WINDOW = layout.offsetof(5); + PARENT = layout.offsetof(6); + X = layout.offsetof(7); + Y = layout.offsetof(8); + OVERRIDE_REDIRECT = layout.offsetof(9); + } + + protected XReparentEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XReparentEvent create(long address, @Nullable ByteBuffer container) { + return new XReparentEvent(address, container); + } + + /** + * Creates a {@code XReparentEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XReparentEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** @return the value of the {@code parent} field. */ + @NativeType("Window") + public long parent() { return nparent(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return ny(address()); } + /** @return the value of the {@code override_redirect} field. */ + public int override_redirect() { return noverride_redirect(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XReparentEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XReparentEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XReparentEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XReparentEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public XReparentEvent event(@NativeType("Window") long value) { nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public XReparentEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@code parent} field. */ + public XReparentEvent parent(@NativeType("Window") long value) { nparent(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public XReparentEvent x(int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public XReparentEvent y(int value) { ny(address(), value); return this; } + /** Sets the specified value to the {@code override_redirect} field. */ + public XReparentEvent override_redirect(int value) { noverride_redirect(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XReparentEvent set( + int type, + long serial, + boolean send_event, + long display, + long event, + long window, + long parent, + int x, + int y, + int override_redirect + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + event(event); + window(window); + parent(parent); + x(x); + y(y); + override_redirect(override_redirect); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XReparentEvent set(XReparentEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XReparentEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XReparentEvent malloc() { + return new XReparentEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XReparentEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XReparentEvent calloc() { + return new XReparentEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XReparentEvent} instance allocated with {@link BufferUtils}. */ + public static XReparentEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XReparentEvent(memAddress(container), container); + } + + /** Returns a new {@code XReparentEvent} instance for the specified memory address. */ + public static XReparentEvent create(long address) { + return new XReparentEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XReparentEvent createSafe(long address) { + return address == NULL ? null : new XReparentEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XReparentEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XReparentEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XReparentEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XReparentEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XReparentEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XReparentEvent malloc(MemoryStack stack) { + return new XReparentEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XReparentEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XReparentEvent calloc(MemoryStack stack) { + return new XReparentEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XReparentEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XReparentEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XReparentEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XReparentEvent.DISPLAY); } + /** Unsafe version of {@link #event}. */ + public static long nevent(long struct) { return memGetCLong(struct + XReparentEvent.EVENT); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XReparentEvent.WINDOW); } + /** Unsafe version of {@link #parent}. */ + public static long nparent(long struct) { return memGetCLong(struct + XReparentEvent.PARENT); } + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + XReparentEvent.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + XReparentEvent.Y); } + /** Unsafe version of {@link #override_redirect}. */ + public static int noverride_redirect(long struct) { return UNSAFE.getInt(null, struct + XReparentEvent.OVERRIDE_REDIRECT); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XReparentEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XReparentEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XReparentEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XReparentEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #event(long) event}. */ + public static void nevent(long struct, long value) { memPutCLong(struct + XReparentEvent.EVENT, value); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XReparentEvent.WINDOW, value); } + /** Unsafe version of {@link #parent(long) parent}. */ + public static void nparent(long struct, long value) { memPutCLong(struct + XReparentEvent.PARENT, value); } + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + XReparentEvent.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + XReparentEvent.Y, value); } + /** Unsafe version of {@link #override_redirect(int) override_redirect}. */ + public static void noverride_redirect(long struct, int value) { UNSAFE.putInt(null, struct + XReparentEvent.OVERRIDE_REDIRECT, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XReparentEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XReparentEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XReparentEvent ELEMENT_FACTORY = XReparentEvent.create(-1L); + + /** + * Creates a new {@code XReparentEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XReparentEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XReparentEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XReparentEvent.ntype(address()); } + /** @return the value of the {@link XReparentEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XReparentEvent.nserial(address()); } + /** @return the value of the {@link XReparentEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XReparentEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XReparentEvent#display} field. */ + @NativeType("Display *") + public long display() { return XReparentEvent.ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return XReparentEvent.nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return XReparentEvent.nwindow(address()); } + /** @return the value of the {@code parent} field. */ + @NativeType("Window") + public long parent() { return XReparentEvent.nparent(address()); } + /** @return the value of the {@code x} field. */ + public int x() { return XReparentEvent.nx(address()); } + /** @return the value of the {@code y} field. */ + public int y() { return XReparentEvent.ny(address()); } + /** @return the value of the {@code override_redirect} field. */ + public int override_redirect() { return XReparentEvent.noverride_redirect(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XReparentEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XReparentEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XReparentEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XReparentEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XReparentEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XReparentEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XReparentEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public Buffer event(@NativeType("Window") long value) { XReparentEvent.nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public Buffer window(@NativeType("Window") long value) { XReparentEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@code parent} field. */ + public Buffer parent(@NativeType("Window") long value) { XReparentEvent.nparent(address(), value); return this; } + /** Sets the specified value to the {@code x} field. */ + public Buffer x(int value) { XReparentEvent.nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public Buffer y(int value) { XReparentEvent.ny(address(), value); return this; } + /** Sets the specified value to the {@code override_redirect} field. */ + public Buffer override_redirect(int value) { XReparentEvent.noverride_redirect(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XResizeRequestEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XResizeRequestEvent.java new file mode 100644 index 000000000..7fa7bf4b7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XResizeRequestEvent.java @@ -0,0 +1,408 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XResizeRequestEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     int width;
    + *     int height;
    + * }
    + */ +public class XResizeRequestEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + WIDTH, + HEIGHT; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + WIDTH = layout.offsetof(5); + HEIGHT = layout.offsetof(6); + } + + protected XResizeRequestEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XResizeRequestEvent create(long address, @Nullable ByteBuffer container) { + return new XResizeRequestEvent(address, container); + } + + /** + * Creates a {@code XResizeRequestEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XResizeRequestEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return nheight(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XResizeRequestEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XResizeRequestEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XResizeRequestEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XResizeRequestEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XResizeRequestEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public XResizeRequestEvent width(int value) { nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public XResizeRequestEvent height(int value) { nheight(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XResizeRequestEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + int width, + int height + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + width(width); + height(height); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XResizeRequestEvent set(XResizeRequestEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XResizeRequestEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XResizeRequestEvent malloc() { + return new XResizeRequestEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XResizeRequestEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XResizeRequestEvent calloc() { + return new XResizeRequestEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XResizeRequestEvent} instance allocated with {@link BufferUtils}. */ + public static XResizeRequestEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XResizeRequestEvent(memAddress(container), container); + } + + /** Returns a new {@code XResizeRequestEvent} instance for the specified memory address. */ + public static XResizeRequestEvent create(long address) { + return new XResizeRequestEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XResizeRequestEvent createSafe(long address) { + return address == NULL ? null : new XResizeRequestEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XResizeRequestEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XResizeRequestEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XResizeRequestEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XResizeRequestEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XResizeRequestEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XResizeRequestEvent malloc(MemoryStack stack) { + return new XResizeRequestEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XResizeRequestEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XResizeRequestEvent calloc(MemoryStack stack) { + return new XResizeRequestEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XResizeRequestEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XResizeRequestEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XResizeRequestEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XResizeRequestEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XResizeRequestEvent.WINDOW); } + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + XResizeRequestEvent.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + XResizeRequestEvent.HEIGHT); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XResizeRequestEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XResizeRequestEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XResizeRequestEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XResizeRequestEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XResizeRequestEvent.WINDOW, value); } + /** Unsafe version of {@link #width(int) width}. */ + public static void nwidth(long struct, int value) { UNSAFE.putInt(null, struct + XResizeRequestEvent.WIDTH, value); } + /** Unsafe version of {@link #height(int) height}. */ + public static void nheight(long struct, int value) { UNSAFE.putInt(null, struct + XResizeRequestEvent.HEIGHT, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XResizeRequestEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XResizeRequestEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XResizeRequestEvent ELEMENT_FACTORY = XResizeRequestEvent.create(-1L); + + /** + * Creates a new {@code XResizeRequestEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XResizeRequestEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XResizeRequestEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XResizeRequestEvent.ntype(address()); } + /** @return the value of the {@link XResizeRequestEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XResizeRequestEvent.nserial(address()); } + /** @return the value of the {@link XResizeRequestEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XResizeRequestEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XResizeRequestEvent#display} field. */ + @NativeType("Display *") + public long display() { return XResizeRequestEvent.ndisplay(address()); } + /** @return the value of the {@link XResizeRequestEvent#window} field. */ + @NativeType("Window") + public long window() { return XResizeRequestEvent.nwindow(address()); } + /** @return the value of the {@code width} field. */ + public int width() { return XResizeRequestEvent.nwidth(address()); } + /** @return the value of the {@code height} field. */ + public int height() { return XResizeRequestEvent.nheight(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XResizeRequestEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XResizeRequestEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XResizeRequestEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XResizeRequestEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XResizeRequestEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XResizeRequestEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XResizeRequestEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XResizeRequestEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XResizeRequestEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public Buffer width(int value) { XResizeRequestEvent.nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public Buffer height(int value) { XResizeRequestEvent.nheight(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionClearEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionClearEvent.java new file mode 100644 index 000000000..39764d60b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionClearEvent.java @@ -0,0 +1,412 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XSelectionClearEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     Atom selection;
    + *     Time time;
    + * }
    + */ +public class XSelectionClearEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + SELECTION, + TIME; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + SELECTION = layout.offsetof(5); + TIME = layout.offsetof(6); + } + + protected XSelectionClearEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XSelectionClearEvent create(long address, @Nullable ByteBuffer container) { + return new XSelectionClearEvent(address, container); + } + + /** + * Creates a {@code XSelectionClearEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XSelectionClearEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** @return the value of the {@code selection} field. */ + @NativeType("Atom") + public long selection() { return nselection(address()); } + /** @return the value of the {@code time} field. */ + @NativeType("Time") + public long time() { return ntime(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XSelectionClearEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XSelectionClearEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XSelectionClearEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XSelectionClearEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XSelectionClearEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@code selection} field. */ + public XSelectionClearEvent selection(@NativeType("Atom") long value) { nselection(address(), value); return this; } + /** Sets the specified value to the {@code time} field. */ + public XSelectionClearEvent time(@NativeType("Time") long value) { ntime(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XSelectionClearEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + long selection, + long time + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + selection(selection); + time(time); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XSelectionClearEvent set(XSelectionClearEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XSelectionClearEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XSelectionClearEvent malloc() { + return new XSelectionClearEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XSelectionClearEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XSelectionClearEvent calloc() { + return new XSelectionClearEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XSelectionClearEvent} instance allocated with {@link BufferUtils}. */ + public static XSelectionClearEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XSelectionClearEvent(memAddress(container), container); + } + + /** Returns a new {@code XSelectionClearEvent} instance for the specified memory address. */ + public static XSelectionClearEvent create(long address) { + return new XSelectionClearEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XSelectionClearEvent createSafe(long address) { + return address == NULL ? null : new XSelectionClearEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionClearEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionClearEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionClearEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionClearEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XSelectionClearEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XSelectionClearEvent malloc(MemoryStack stack) { + return new XSelectionClearEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XSelectionClearEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XSelectionClearEvent calloc(MemoryStack stack) { + return new XSelectionClearEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XSelectionClearEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XSelectionClearEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XSelectionClearEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XSelectionClearEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XSelectionClearEvent.WINDOW); } + /** Unsafe version of {@link #selection}. */ + public static long nselection(long struct) { return memGetCLong(struct + XSelectionClearEvent.SELECTION); } + /** Unsafe version of {@link #time}. */ + public static long ntime(long struct) { return memGetCLong(struct + XSelectionClearEvent.TIME); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XSelectionClearEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XSelectionClearEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XSelectionClearEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XSelectionClearEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XSelectionClearEvent.WINDOW, value); } + /** Unsafe version of {@link #selection(long) selection}. */ + public static void nselection(long struct, long value) { memPutCLong(struct + XSelectionClearEvent.SELECTION, value); } + /** Unsafe version of {@link #time(long) time}. */ + public static void ntime(long struct, long value) { memPutCLong(struct + XSelectionClearEvent.TIME, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XSelectionClearEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XSelectionClearEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XSelectionClearEvent ELEMENT_FACTORY = XSelectionClearEvent.create(-1L); + + /** + * Creates a new {@code XSelectionClearEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XSelectionClearEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XSelectionClearEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XSelectionClearEvent.ntype(address()); } + /** @return the value of the {@link XSelectionClearEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XSelectionClearEvent.nserial(address()); } + /** @return the value of the {@link XSelectionClearEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XSelectionClearEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XSelectionClearEvent#display} field. */ + @NativeType("Display *") + public long display() { return XSelectionClearEvent.ndisplay(address()); } + /** @return the value of the {@link XSelectionClearEvent#window} field. */ + @NativeType("Window") + public long window() { return XSelectionClearEvent.nwindow(address()); } + /** @return the value of the {@code selection} field. */ + @NativeType("Atom") + public long selection() { return XSelectionClearEvent.nselection(address()); } + /** @return the value of the {@code time} field. */ + @NativeType("Time") + public long time() { return XSelectionClearEvent.ntime(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XSelectionClearEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XSelectionClearEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XSelectionClearEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XSelectionClearEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XSelectionClearEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XSelectionClearEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XSelectionClearEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XSelectionClearEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XSelectionClearEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@code selection} field. */ + public Buffer selection(@NativeType("Atom") long value) { XSelectionClearEvent.nselection(address(), value); return this; } + /** Sets the specified value to the {@code time} field. */ + public Buffer time(@NativeType("Time") long value) { XSelectionClearEvent.ntime(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionEvent.java new file mode 100644 index 000000000..372ad0b57 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionEvent.java @@ -0,0 +1,454 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Selection event structure. + * + *

    Layout

    + * + *
    
    + * struct XSelectionEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window requestor;
    + *     Atom selection;
    + *     Atom target;
    + *     Atom {@link #property};
    + *     Time time;
    + * }
    + */ +public class XSelectionEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + REQUESTOR, + SELECTION, + TARGET, + PROPERTY, + TIME; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + REQUESTOR = layout.offsetof(4); + SELECTION = layout.offsetof(5); + TARGET = layout.offsetof(6); + PROPERTY = layout.offsetof(7); + TIME = layout.offsetof(8); + } + + protected XSelectionEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XSelectionEvent create(long address, @Nullable ByteBuffer container) { + return new XSelectionEvent(address, container); + } + + /** + * Creates a {@code XSelectionEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XSelectionEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code requestor} field. */ + @NativeType("Window") + public long requestor() { return nrequestor(address()); } + /** @return the value of the {@code selection} field. */ + @NativeType("Atom") + public long selection() { return nselection(address()); } + /** @return the value of the {@code target} field. */ + @NativeType("Atom") + public long target() { return ntarget(address()); } + /** atom or {@link X11#None} */ + @NativeType("Atom") + public long property() { return nproperty(address()); } + /** @return the value of the {@code time} field. */ + @NativeType("Time") + public long time() { return ntime(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XSelectionEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XSelectionEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XSelectionEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XSelectionEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code requestor} field. */ + public XSelectionEvent requestor(@NativeType("Window") long value) { nrequestor(address(), value); return this; } + /** Sets the specified value to the {@code selection} field. */ + public XSelectionEvent selection(@NativeType("Atom") long value) { nselection(address(), value); return this; } + /** Sets the specified value to the {@code target} field. */ + public XSelectionEvent target(@NativeType("Atom") long value) { ntarget(address(), value); return this; } + /** Sets the specified value to the {@link #property} field. */ + public XSelectionEvent property(@NativeType("Atom") long value) { nproperty(address(), value); return this; } + /** Sets the specified value to the {@code time} field. */ + public XSelectionEvent time(@NativeType("Time") long value) { ntime(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XSelectionEvent set( + int type, + long serial, + boolean send_event, + long display, + long requestor, + long selection, + long target, + long property, + long time + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + requestor(requestor); + selection(selection); + target(target); + property(property); + time(time); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XSelectionEvent set(XSelectionEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XSelectionEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XSelectionEvent malloc() { + return new XSelectionEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XSelectionEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XSelectionEvent calloc() { + return new XSelectionEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XSelectionEvent} instance allocated with {@link BufferUtils}. */ + public static XSelectionEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XSelectionEvent(memAddress(container), container); + } + + /** Returns a new {@code XSelectionEvent} instance for the specified memory address. */ + public static XSelectionEvent create(long address) { + return new XSelectionEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XSelectionEvent createSafe(long address) { + return address == NULL ? null : new XSelectionEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XSelectionEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XSelectionEvent malloc(MemoryStack stack) { + return new XSelectionEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XSelectionEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XSelectionEvent calloc(MemoryStack stack) { + return new XSelectionEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XSelectionEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XSelectionEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XSelectionEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XSelectionEvent.DISPLAY); } + /** Unsafe version of {@link #requestor}. */ + public static long nrequestor(long struct) { return memGetCLong(struct + XSelectionEvent.REQUESTOR); } + /** Unsafe version of {@link #selection}. */ + public static long nselection(long struct) { return memGetCLong(struct + XSelectionEvent.SELECTION); } + /** Unsafe version of {@link #target}. */ + public static long ntarget(long struct) { return memGetCLong(struct + XSelectionEvent.TARGET); } + /** Unsafe version of {@link #property}. */ + public static long nproperty(long struct) { return memGetCLong(struct + XSelectionEvent.PROPERTY); } + /** Unsafe version of {@link #time}. */ + public static long ntime(long struct) { return memGetCLong(struct + XSelectionEvent.TIME); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XSelectionEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XSelectionEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XSelectionEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XSelectionEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #requestor(long) requestor}. */ + public static void nrequestor(long struct, long value) { memPutCLong(struct + XSelectionEvent.REQUESTOR, value); } + /** Unsafe version of {@link #selection(long) selection}. */ + public static void nselection(long struct, long value) { memPutCLong(struct + XSelectionEvent.SELECTION, value); } + /** Unsafe version of {@link #target(long) target}. */ + public static void ntarget(long struct, long value) { memPutCLong(struct + XSelectionEvent.TARGET, value); } + /** Unsafe version of {@link #property(long) property}. */ + public static void nproperty(long struct, long value) { memPutCLong(struct + XSelectionEvent.PROPERTY, value); } + /** Unsafe version of {@link #time(long) time}. */ + public static void ntime(long struct, long value) { memPutCLong(struct + XSelectionEvent.TIME, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XSelectionEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XSelectionEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XSelectionEvent ELEMENT_FACTORY = XSelectionEvent.create(-1L); + + /** + * Creates a new {@code XSelectionEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XSelectionEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XSelectionEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XSelectionEvent.ntype(address()); } + /** @return the value of the {@link XSelectionEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XSelectionEvent.nserial(address()); } + /** @return the value of the {@link XSelectionEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XSelectionEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XSelectionEvent#display} field. */ + @NativeType("Display *") + public long display() { return XSelectionEvent.ndisplay(address()); } + /** @return the value of the {@code requestor} field. */ + @NativeType("Window") + public long requestor() { return XSelectionEvent.nrequestor(address()); } + /** @return the value of the {@code selection} field. */ + @NativeType("Atom") + public long selection() { return XSelectionEvent.nselection(address()); } + /** @return the value of the {@code target} field. */ + @NativeType("Atom") + public long target() { return XSelectionEvent.ntarget(address()); } + /** @return the value of the {@link XSelectionEvent#property} field. */ + @NativeType("Atom") + public long property() { return XSelectionEvent.nproperty(address()); } + /** @return the value of the {@code time} field. */ + @NativeType("Time") + public long time() { return XSelectionEvent.ntime(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XSelectionEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XSelectionEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XSelectionEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XSelectionEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XSelectionEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XSelectionEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XSelectionEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code requestor} field. */ + public Buffer requestor(@NativeType("Window") long value) { XSelectionEvent.nrequestor(address(), value); return this; } + /** Sets the specified value to the {@code selection} field. */ + public Buffer selection(@NativeType("Atom") long value) { XSelectionEvent.nselection(address(), value); return this; } + /** Sets the specified value to the {@code target} field. */ + public Buffer target(@NativeType("Atom") long value) { XSelectionEvent.ntarget(address(), value); return this; } + /** Sets the specified value to the {@link XSelectionEvent#property} field. */ + public Buffer property(@NativeType("Atom") long value) { XSelectionEvent.nproperty(address(), value); return this; } + /** Sets the specified value to the {@code time} field. */ + public Buffer time(@NativeType("Time") long value) { XSelectionEvent.ntime(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionRequestEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionRequestEvent.java new file mode 100644 index 000000000..aec6799c3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSelectionRequestEvent.java @@ -0,0 +1,474 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * SelectionRequest event structure. + * + *

    Layout

    + * + *
    
    + * struct XSelectionRequestEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window owner;
    + *     Window requestor;
    + *     Atom selection;
    + *     Atom target;
    + *     Atom property;
    + *     Time time;
    + * }
    + */ +public class XSelectionRequestEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + OWNER, + REQUESTOR, + SELECTION, + TARGET, + PROPERTY, + TIME; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + OWNER = layout.offsetof(4); + REQUESTOR = layout.offsetof(5); + SELECTION = layout.offsetof(6); + TARGET = layout.offsetof(7); + PROPERTY = layout.offsetof(8); + TIME = layout.offsetof(9); + } + + protected XSelectionRequestEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XSelectionRequestEvent create(long address, @Nullable ByteBuffer container) { + return new XSelectionRequestEvent(address, container); + } + + /** + * Creates a {@code XSelectionRequestEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XSelectionRequestEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code owner} field. */ + @NativeType("Window") + public long owner() { return nowner(address()); } + /** @return the value of the {@code requestor} field. */ + @NativeType("Window") + public long requestor() { return nrequestor(address()); } + /** @return the value of the {@code selection} field. */ + @NativeType("Atom") + public long selection() { return nselection(address()); } + /** @return the value of the {@code target} field. */ + @NativeType("Atom") + public long target() { return ntarget(address()); } + /** @return the value of the {@code property} field. */ + @NativeType("Atom") + public long property() { return nproperty(address()); } + /** @return the value of the {@code time} field. */ + @NativeType("Time") + public long time() { return ntime(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XSelectionRequestEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XSelectionRequestEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XSelectionRequestEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XSelectionRequestEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code owner} field. */ + public XSelectionRequestEvent owner(@NativeType("Window") long value) { nowner(address(), value); return this; } + /** Sets the specified value to the {@code requestor} field. */ + public XSelectionRequestEvent requestor(@NativeType("Window") long value) { nrequestor(address(), value); return this; } + /** Sets the specified value to the {@code selection} field. */ + public XSelectionRequestEvent selection(@NativeType("Atom") long value) { nselection(address(), value); return this; } + /** Sets the specified value to the {@code target} field. */ + public XSelectionRequestEvent target(@NativeType("Atom") long value) { ntarget(address(), value); return this; } + /** Sets the specified value to the {@code property} field. */ + public XSelectionRequestEvent property(@NativeType("Atom") long value) { nproperty(address(), value); return this; } + /** Sets the specified value to the {@code time} field. */ + public XSelectionRequestEvent time(@NativeType("Time") long value) { ntime(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XSelectionRequestEvent set( + int type, + long serial, + boolean send_event, + long display, + long owner, + long requestor, + long selection, + long target, + long property, + long time + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + owner(owner); + requestor(requestor); + selection(selection); + target(target); + property(property); + time(time); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XSelectionRequestEvent set(XSelectionRequestEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XSelectionRequestEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XSelectionRequestEvent malloc() { + return new XSelectionRequestEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XSelectionRequestEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XSelectionRequestEvent calloc() { + return new XSelectionRequestEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XSelectionRequestEvent} instance allocated with {@link BufferUtils}. */ + public static XSelectionRequestEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XSelectionRequestEvent(memAddress(container), container); + } + + /** Returns a new {@code XSelectionRequestEvent} instance for the specified memory address. */ + public static XSelectionRequestEvent create(long address) { + return new XSelectionRequestEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XSelectionRequestEvent createSafe(long address) { + return address == NULL ? null : new XSelectionRequestEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionRequestEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionRequestEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionRequestEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XSelectionRequestEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XSelectionRequestEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XSelectionRequestEvent malloc(MemoryStack stack) { + return new XSelectionRequestEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XSelectionRequestEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XSelectionRequestEvent calloc(MemoryStack stack) { + return new XSelectionRequestEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XSelectionRequestEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XSelectionRequestEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XSelectionRequestEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XSelectionRequestEvent.DISPLAY); } + /** Unsafe version of {@link #owner}. */ + public static long nowner(long struct) { return memGetCLong(struct + XSelectionRequestEvent.OWNER); } + /** Unsafe version of {@link #requestor}. */ + public static long nrequestor(long struct) { return memGetCLong(struct + XSelectionRequestEvent.REQUESTOR); } + /** Unsafe version of {@link #selection}. */ + public static long nselection(long struct) { return memGetCLong(struct + XSelectionRequestEvent.SELECTION); } + /** Unsafe version of {@link #target}. */ + public static long ntarget(long struct) { return memGetCLong(struct + XSelectionRequestEvent.TARGET); } + /** Unsafe version of {@link #property}. */ + public static long nproperty(long struct) { return memGetCLong(struct + XSelectionRequestEvent.PROPERTY); } + /** Unsafe version of {@link #time}. */ + public static long ntime(long struct) { return memGetCLong(struct + XSelectionRequestEvent.TIME); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XSelectionRequestEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XSelectionRequestEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XSelectionRequestEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XSelectionRequestEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #owner(long) owner}. */ + public static void nowner(long struct, long value) { memPutCLong(struct + XSelectionRequestEvent.OWNER, value); } + /** Unsafe version of {@link #requestor(long) requestor}. */ + public static void nrequestor(long struct, long value) { memPutCLong(struct + XSelectionRequestEvent.REQUESTOR, value); } + /** Unsafe version of {@link #selection(long) selection}. */ + public static void nselection(long struct, long value) { memPutCLong(struct + XSelectionRequestEvent.SELECTION, value); } + /** Unsafe version of {@link #target(long) target}. */ + public static void ntarget(long struct, long value) { memPutCLong(struct + XSelectionRequestEvent.TARGET, value); } + /** Unsafe version of {@link #property(long) property}. */ + public static void nproperty(long struct, long value) { memPutCLong(struct + XSelectionRequestEvent.PROPERTY, value); } + /** Unsafe version of {@link #time(long) time}. */ + public static void ntime(long struct, long value) { memPutCLong(struct + XSelectionRequestEvent.TIME, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XSelectionRequestEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XSelectionRequestEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XSelectionRequestEvent ELEMENT_FACTORY = XSelectionRequestEvent.create(-1L); + + /** + * Creates a new {@code XSelectionRequestEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XSelectionRequestEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XSelectionRequestEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XSelectionRequestEvent.ntype(address()); } + /** @return the value of the {@link XSelectionRequestEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XSelectionRequestEvent.nserial(address()); } + /** @return the value of the {@link XSelectionRequestEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XSelectionRequestEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XSelectionRequestEvent#display} field. */ + @NativeType("Display *") + public long display() { return XSelectionRequestEvent.ndisplay(address()); } + /** @return the value of the {@code owner} field. */ + @NativeType("Window") + public long owner() { return XSelectionRequestEvent.nowner(address()); } + /** @return the value of the {@code requestor} field. */ + @NativeType("Window") + public long requestor() { return XSelectionRequestEvent.nrequestor(address()); } + /** @return the value of the {@code selection} field. */ + @NativeType("Atom") + public long selection() { return XSelectionRequestEvent.nselection(address()); } + /** @return the value of the {@code target} field. */ + @NativeType("Atom") + public long target() { return XSelectionRequestEvent.ntarget(address()); } + /** @return the value of the {@code property} field. */ + @NativeType("Atom") + public long property() { return XSelectionRequestEvent.nproperty(address()); } + /** @return the value of the {@code time} field. */ + @NativeType("Time") + public long time() { return XSelectionRequestEvent.ntime(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XSelectionRequestEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XSelectionRequestEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XSelectionRequestEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XSelectionRequestEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XSelectionRequestEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XSelectionRequestEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XSelectionRequestEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code owner} field. */ + public Buffer owner(@NativeType("Window") long value) { XSelectionRequestEvent.nowner(address(), value); return this; } + /** Sets the specified value to the {@code requestor} field. */ + public Buffer requestor(@NativeType("Window") long value) { XSelectionRequestEvent.nrequestor(address(), value); return this; } + /** Sets the specified value to the {@code selection} field. */ + public Buffer selection(@NativeType("Atom") long value) { XSelectionRequestEvent.nselection(address(), value); return this; } + /** Sets the specified value to the {@code target} field. */ + public Buffer target(@NativeType("Atom") long value) { XSelectionRequestEvent.ntarget(address(), value); return this; } + /** Sets the specified value to the {@code property} field. */ + public Buffer property(@NativeType("Atom") long value) { XSelectionRequestEvent.nproperty(address(), value); return this; } + /** Sets the specified value to the {@code time} field. */ + public Buffer time(@NativeType("Time") long value) { XSelectionRequestEvent.ntime(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSetWindowAttributes.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSetWindowAttributes.java new file mode 100644 index 000000000..a2f582c3c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XSetWindowAttributes.java @@ -0,0 +1,556 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Data structure for setting window attributes. + * + *

    Layout

    + * + *
    
    + * struct XSetWindowAttributes {
    + *     Pixmap background_pixmap;
    + *     unsigned long background_pixel;
    + *     Pixmap border_pixmap;
    + *     unsigned long border_pixel;
    + *     int bit_gravity;
    + *     int win_gravity;
    + *     int backing_store;
    + *     unsigned long backing_planes;
    + *     unsigned long backing_pixel;
    + *     Bool save_under;
    + *     long event_mask;
    + *     long do_not_propagate_mask;
    + *     Bool override_redirect;
    + *     Colormap colormap;
    + *     Cursor cursor;
    + * }
    + */ +public class XSetWindowAttributes extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + BACKGROUND_PIXMAP, + BACKGROUND_PIXEL, + BORDER_PIXMAP, + BORDER_PIXEL, + BIT_GRAVITY, + WIN_GRAVITY, + BACKING_STORE, + BACKING_PLANES, + BACKING_PIXEL, + SAVE_UNDER, + EVENT_MASK, + DO_NOT_PROPAGATE_MASK, + OVERRIDE_REDIRECT, + COLORMAP, + CURSOR; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + BACKGROUND_PIXMAP = layout.offsetof(0); + BACKGROUND_PIXEL = layout.offsetof(1); + BORDER_PIXMAP = layout.offsetof(2); + BORDER_PIXEL = layout.offsetof(3); + BIT_GRAVITY = layout.offsetof(4); + WIN_GRAVITY = layout.offsetof(5); + BACKING_STORE = layout.offsetof(6); + BACKING_PLANES = layout.offsetof(7); + BACKING_PIXEL = layout.offsetof(8); + SAVE_UNDER = layout.offsetof(9); + EVENT_MASK = layout.offsetof(10); + DO_NOT_PROPAGATE_MASK = layout.offsetof(11); + OVERRIDE_REDIRECT = layout.offsetof(12); + COLORMAP = layout.offsetof(13); + CURSOR = layout.offsetof(14); + } + + protected XSetWindowAttributes(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XSetWindowAttributes create(long address, @Nullable ByteBuffer container) { + return new XSetWindowAttributes(address, container); + } + + /** + * Creates a {@code XSetWindowAttributes} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XSetWindowAttributes(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code background_pixmap} field. */ + @NativeType("Pixmap") + public long background_pixmap() { return nbackground_pixmap(address()); } + /** @return the value of the {@code background_pixel} field. */ + @NativeType("unsigned long") + public long background_pixel() { return nbackground_pixel(address()); } + /** @return the value of the {@code border_pixmap} field. */ + @NativeType("Pixmap") + public long border_pixmap() { return nborder_pixmap(address()); } + /** @return the value of the {@code border_pixel} field. */ + @NativeType("unsigned long") + public long border_pixel() { return nborder_pixel(address()); } + /** @return the value of the {@code bit_gravity} field. */ + public int bit_gravity() { return nbit_gravity(address()); } + /** @return the value of the {@code win_gravity} field. */ + public int win_gravity() { return nwin_gravity(address()); } + /** @return the value of the {@code backing_store} field. */ + public int backing_store() { return nbacking_store(address()); } + /** @return the value of the {@code backing_planes} field. */ + @NativeType("unsigned long") + public long backing_planes() { return nbacking_planes(address()); } + /** @return the value of the {@code backing_pixel} field. */ + @NativeType("unsigned long") + public long backing_pixel() { return nbacking_pixel(address()); } + /** @return the value of the {@code save_under} field. */ + @NativeType("Bool") + public boolean save_under() { return nsave_under(address()) != 0; } + /** @return the value of the {@code event_mask} field. */ + public long event_mask() { return nevent_mask(address()); } + /** @return the value of the {@code do_not_propagate_mask} field. */ + public long do_not_propagate_mask() { return ndo_not_propagate_mask(address()); } + /** @return the value of the {@code override_redirect} field. */ + @NativeType("Bool") + public boolean override_redirect() { return noverride_redirect(address()) != 0; } + /** @return the value of the {@code colormap} field. */ + @NativeType("Colormap") + public long colormap() { return ncolormap(address()); } + /** @return the value of the {@code cursor} field. */ + @NativeType("Cursor") + public long cursor() { return ncursor(address()); } + + /** Sets the specified value to the {@code background_pixmap} field. */ + public XSetWindowAttributes background_pixmap(@NativeType("Pixmap") long value) { nbackground_pixmap(address(), value); return this; } + /** Sets the specified value to the {@code background_pixel} field. */ + public XSetWindowAttributes background_pixel(@NativeType("unsigned long") long value) { nbackground_pixel(address(), value); return this; } + /** Sets the specified value to the {@code border_pixmap} field. */ + public XSetWindowAttributes border_pixmap(@NativeType("Pixmap") long value) { nborder_pixmap(address(), value); return this; } + /** Sets the specified value to the {@code border_pixel} field. */ + public XSetWindowAttributes border_pixel(@NativeType("unsigned long") long value) { nborder_pixel(address(), value); return this; } + /** Sets the specified value to the {@code bit_gravity} field. */ + public XSetWindowAttributes bit_gravity(int value) { nbit_gravity(address(), value); return this; } + /** Sets the specified value to the {@code win_gravity} field. */ + public XSetWindowAttributes win_gravity(int value) { nwin_gravity(address(), value); return this; } + /** Sets the specified value to the {@code backing_store} field. */ + public XSetWindowAttributes backing_store(int value) { nbacking_store(address(), value); return this; } + /** Sets the specified value to the {@code backing_planes} field. */ + public XSetWindowAttributes backing_planes(@NativeType("unsigned long") long value) { nbacking_planes(address(), value); return this; } + /** Sets the specified value to the {@code backing_pixel} field. */ + public XSetWindowAttributes backing_pixel(@NativeType("unsigned long") long value) { nbacking_pixel(address(), value); return this; } + /** Sets the specified value to the {@code save_under} field. */ + public XSetWindowAttributes save_under(@NativeType("Bool") boolean value) { nsave_under(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@code event_mask} field. */ + public XSetWindowAttributes event_mask(long value) { nevent_mask(address(), value); return this; } + /** Sets the specified value to the {@code do_not_propagate_mask} field. */ + public XSetWindowAttributes do_not_propagate_mask(long value) { ndo_not_propagate_mask(address(), value); return this; } + /** Sets the specified value to the {@code override_redirect} field. */ + public XSetWindowAttributes override_redirect(@NativeType("Bool") boolean value) { noverride_redirect(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@code colormap} field. */ + public XSetWindowAttributes colormap(@NativeType("Colormap") long value) { ncolormap(address(), value); return this; } + /** Sets the specified value to the {@code cursor} field. */ + public XSetWindowAttributes cursor(@NativeType("Cursor") long value) { ncursor(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XSetWindowAttributes set( + long background_pixmap, + long background_pixel, + long border_pixmap, + long border_pixel, + int bit_gravity, + int win_gravity, + int backing_store, + long backing_planes, + long backing_pixel, + boolean save_under, + long event_mask, + long do_not_propagate_mask, + boolean override_redirect, + long colormap, + long cursor + ) { + background_pixmap(background_pixmap); + background_pixel(background_pixel); + border_pixmap(border_pixmap); + border_pixel(border_pixel); + bit_gravity(bit_gravity); + win_gravity(win_gravity); + backing_store(backing_store); + backing_planes(backing_planes); + backing_pixel(backing_pixel); + save_under(save_under); + event_mask(event_mask); + do_not_propagate_mask(do_not_propagate_mask); + override_redirect(override_redirect); + colormap(colormap); + cursor(cursor); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XSetWindowAttributes set(XSetWindowAttributes src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XSetWindowAttributes} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XSetWindowAttributes malloc() { + return new XSetWindowAttributes(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XSetWindowAttributes} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XSetWindowAttributes calloc() { + return new XSetWindowAttributes(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XSetWindowAttributes} instance allocated with {@link BufferUtils}. */ + public static XSetWindowAttributes create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XSetWindowAttributes(memAddress(container), container); + } + + /** Returns a new {@code XSetWindowAttributes} instance for the specified memory address. */ + public static XSetWindowAttributes create(long address) { + return new XSetWindowAttributes(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XSetWindowAttributes createSafe(long address) { + return address == NULL ? null : new XSetWindowAttributes(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XSetWindowAttributes mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XSetWindowAttributes callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XSetWindowAttributes mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XSetWindowAttributes callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XSetWindowAttributes} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XSetWindowAttributes malloc(MemoryStack stack) { + return new XSetWindowAttributes(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XSetWindowAttributes} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XSetWindowAttributes calloc(MemoryStack stack) { + return new XSetWindowAttributes(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #background_pixmap}. */ + public static long nbackground_pixmap(long struct) { return memGetCLong(struct + XSetWindowAttributes.BACKGROUND_PIXMAP); } + /** Unsafe version of {@link #background_pixel}. */ + public static long nbackground_pixel(long struct) { return memGetCLong(struct + XSetWindowAttributes.BACKGROUND_PIXEL); } + /** Unsafe version of {@link #border_pixmap}. */ + public static long nborder_pixmap(long struct) { return memGetCLong(struct + XSetWindowAttributes.BORDER_PIXMAP); } + /** Unsafe version of {@link #border_pixel}. */ + public static long nborder_pixel(long struct) { return memGetCLong(struct + XSetWindowAttributes.BORDER_PIXEL); } + /** Unsafe version of {@link #bit_gravity}. */ + public static int nbit_gravity(long struct) { return UNSAFE.getInt(null, struct + XSetWindowAttributes.BIT_GRAVITY); } + /** Unsafe version of {@link #win_gravity}. */ + public static int nwin_gravity(long struct) { return UNSAFE.getInt(null, struct + XSetWindowAttributes.WIN_GRAVITY); } + /** Unsafe version of {@link #backing_store}. */ + public static int nbacking_store(long struct) { return UNSAFE.getInt(null, struct + XSetWindowAttributes.BACKING_STORE); } + /** Unsafe version of {@link #backing_planes}. */ + public static long nbacking_planes(long struct) { return memGetCLong(struct + XSetWindowAttributes.BACKING_PLANES); } + /** Unsafe version of {@link #backing_pixel}. */ + public static long nbacking_pixel(long struct) { return memGetCLong(struct + XSetWindowAttributes.BACKING_PIXEL); } + /** Unsafe version of {@link #save_under}. */ + public static int nsave_under(long struct) { return UNSAFE.getInt(null, struct + XSetWindowAttributes.SAVE_UNDER); } + /** Unsafe version of {@link #event_mask}. */ + public static long nevent_mask(long struct) { return memGetCLong(struct + XSetWindowAttributes.EVENT_MASK); } + /** Unsafe version of {@link #do_not_propagate_mask}. */ + public static long ndo_not_propagate_mask(long struct) { return memGetCLong(struct + XSetWindowAttributes.DO_NOT_PROPAGATE_MASK); } + /** Unsafe version of {@link #override_redirect}. */ + public static int noverride_redirect(long struct) { return UNSAFE.getInt(null, struct + XSetWindowAttributes.OVERRIDE_REDIRECT); } + /** Unsafe version of {@link #colormap}. */ + public static long ncolormap(long struct) { return memGetCLong(struct + XSetWindowAttributes.COLORMAP); } + /** Unsafe version of {@link #cursor}. */ + public static long ncursor(long struct) { return memGetCLong(struct + XSetWindowAttributes.CURSOR); } + + /** Unsafe version of {@link #background_pixmap(long) background_pixmap}. */ + public static void nbackground_pixmap(long struct, long value) { memPutCLong(struct + XSetWindowAttributes.BACKGROUND_PIXMAP, value); } + /** Unsafe version of {@link #background_pixel(long) background_pixel}. */ + public static void nbackground_pixel(long struct, long value) { memPutCLong(struct + XSetWindowAttributes.BACKGROUND_PIXEL, value); } + /** Unsafe version of {@link #border_pixmap(long) border_pixmap}. */ + public static void nborder_pixmap(long struct, long value) { memPutCLong(struct + XSetWindowAttributes.BORDER_PIXMAP, value); } + /** Unsafe version of {@link #border_pixel(long) border_pixel}. */ + public static void nborder_pixel(long struct, long value) { memPutCLong(struct + XSetWindowAttributes.BORDER_PIXEL, value); } + /** Unsafe version of {@link #bit_gravity(int) bit_gravity}. */ + public static void nbit_gravity(long struct, int value) { UNSAFE.putInt(null, struct + XSetWindowAttributes.BIT_GRAVITY, value); } + /** Unsafe version of {@link #win_gravity(int) win_gravity}. */ + public static void nwin_gravity(long struct, int value) { UNSAFE.putInt(null, struct + XSetWindowAttributes.WIN_GRAVITY, value); } + /** Unsafe version of {@link #backing_store(int) backing_store}. */ + public static void nbacking_store(long struct, int value) { UNSAFE.putInt(null, struct + XSetWindowAttributes.BACKING_STORE, value); } + /** Unsafe version of {@link #backing_planes(long) backing_planes}. */ + public static void nbacking_planes(long struct, long value) { memPutCLong(struct + XSetWindowAttributes.BACKING_PLANES, value); } + /** Unsafe version of {@link #backing_pixel(long) backing_pixel}. */ + public static void nbacking_pixel(long struct, long value) { memPutCLong(struct + XSetWindowAttributes.BACKING_PIXEL, value); } + /** Unsafe version of {@link #save_under(boolean) save_under}. */ + public static void nsave_under(long struct, int value) { UNSAFE.putInt(null, struct + XSetWindowAttributes.SAVE_UNDER, value); } + /** Unsafe version of {@link #event_mask(long) event_mask}. */ + public static void nevent_mask(long struct, long value) { memPutCLong(struct + XSetWindowAttributes.EVENT_MASK, value); } + /** Unsafe version of {@link #do_not_propagate_mask(long) do_not_propagate_mask}. */ + public static void ndo_not_propagate_mask(long struct, long value) { memPutCLong(struct + XSetWindowAttributes.DO_NOT_PROPAGATE_MASK, value); } + /** Unsafe version of {@link #override_redirect(boolean) override_redirect}. */ + public static void noverride_redirect(long struct, int value) { UNSAFE.putInt(null, struct + XSetWindowAttributes.OVERRIDE_REDIRECT, value); } + /** Unsafe version of {@link #colormap(long) colormap}. */ + public static void ncolormap(long struct, long value) { memPutCLong(struct + XSetWindowAttributes.COLORMAP, value); } + /** Unsafe version of {@link #cursor(long) cursor}. */ + public static void ncursor(long struct, long value) { memPutCLong(struct + XSetWindowAttributes.CURSOR, value); } + + // ----------------------------------- + + /** An array of {@link XSetWindowAttributes} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XSetWindowAttributes ELEMENT_FACTORY = XSetWindowAttributes.create(-1L); + + /** + * Creates a new {@code XSetWindowAttributes.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XSetWindowAttributes#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XSetWindowAttributes getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code background_pixmap} field. */ + @NativeType("Pixmap") + public long background_pixmap() { return XSetWindowAttributes.nbackground_pixmap(address()); } + /** @return the value of the {@code background_pixel} field. */ + @NativeType("unsigned long") + public long background_pixel() { return XSetWindowAttributes.nbackground_pixel(address()); } + /** @return the value of the {@code border_pixmap} field. */ + @NativeType("Pixmap") + public long border_pixmap() { return XSetWindowAttributes.nborder_pixmap(address()); } + /** @return the value of the {@code border_pixel} field. */ + @NativeType("unsigned long") + public long border_pixel() { return XSetWindowAttributes.nborder_pixel(address()); } + /** @return the value of the {@code bit_gravity} field. */ + public int bit_gravity() { return XSetWindowAttributes.nbit_gravity(address()); } + /** @return the value of the {@code win_gravity} field. */ + public int win_gravity() { return XSetWindowAttributes.nwin_gravity(address()); } + /** @return the value of the {@code backing_store} field. */ + public int backing_store() { return XSetWindowAttributes.nbacking_store(address()); } + /** @return the value of the {@code backing_planes} field. */ + @NativeType("unsigned long") + public long backing_planes() { return XSetWindowAttributes.nbacking_planes(address()); } + /** @return the value of the {@code backing_pixel} field. */ + @NativeType("unsigned long") + public long backing_pixel() { return XSetWindowAttributes.nbacking_pixel(address()); } + /** @return the value of the {@code save_under} field. */ + @NativeType("Bool") + public boolean save_under() { return XSetWindowAttributes.nsave_under(address()) != 0; } + /** @return the value of the {@code event_mask} field. */ + public long event_mask() { return XSetWindowAttributes.nevent_mask(address()); } + /** @return the value of the {@code do_not_propagate_mask} field. */ + public long do_not_propagate_mask() { return XSetWindowAttributes.ndo_not_propagate_mask(address()); } + /** @return the value of the {@code override_redirect} field. */ + @NativeType("Bool") + public boolean override_redirect() { return XSetWindowAttributes.noverride_redirect(address()) != 0; } + /** @return the value of the {@code colormap} field. */ + @NativeType("Colormap") + public long colormap() { return XSetWindowAttributes.ncolormap(address()); } + /** @return the value of the {@code cursor} field. */ + @NativeType("Cursor") + public long cursor() { return XSetWindowAttributes.ncursor(address()); } + + /** Sets the specified value to the {@code background_pixmap} field. */ + public Buffer background_pixmap(@NativeType("Pixmap") long value) { XSetWindowAttributes.nbackground_pixmap(address(), value); return this; } + /** Sets the specified value to the {@code background_pixel} field. */ + public Buffer background_pixel(@NativeType("unsigned long") long value) { XSetWindowAttributes.nbackground_pixel(address(), value); return this; } + /** Sets the specified value to the {@code border_pixmap} field. */ + public Buffer border_pixmap(@NativeType("Pixmap") long value) { XSetWindowAttributes.nborder_pixmap(address(), value); return this; } + /** Sets the specified value to the {@code border_pixel} field. */ + public Buffer border_pixel(@NativeType("unsigned long") long value) { XSetWindowAttributes.nborder_pixel(address(), value); return this; } + /** Sets the specified value to the {@code bit_gravity} field. */ + public Buffer bit_gravity(int value) { XSetWindowAttributes.nbit_gravity(address(), value); return this; } + /** Sets the specified value to the {@code win_gravity} field. */ + public Buffer win_gravity(int value) { XSetWindowAttributes.nwin_gravity(address(), value); return this; } + /** Sets the specified value to the {@code backing_store} field. */ + public Buffer backing_store(int value) { XSetWindowAttributes.nbacking_store(address(), value); return this; } + /** Sets the specified value to the {@code backing_planes} field. */ + public Buffer backing_planes(@NativeType("unsigned long") long value) { XSetWindowAttributes.nbacking_planes(address(), value); return this; } + /** Sets the specified value to the {@code backing_pixel} field. */ + public Buffer backing_pixel(@NativeType("unsigned long") long value) { XSetWindowAttributes.nbacking_pixel(address(), value); return this; } + /** Sets the specified value to the {@code save_under} field. */ + public Buffer save_under(@NativeType("Bool") boolean value) { XSetWindowAttributes.nsave_under(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@code event_mask} field. */ + public Buffer event_mask(long value) { XSetWindowAttributes.nevent_mask(address(), value); return this; } + /** Sets the specified value to the {@code do_not_propagate_mask} field. */ + public Buffer do_not_propagate_mask(long value) { XSetWindowAttributes.ndo_not_propagate_mask(address(), value); return this; } + /** Sets the specified value to the {@code override_redirect} field. */ + public Buffer override_redirect(@NativeType("Bool") boolean value) { XSetWindowAttributes.noverride_redirect(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@code colormap} field. */ + public Buffer colormap(@NativeType("Colormap") long value) { XSetWindowAttributes.ncolormap(address(), value); return this; } + /** Sets the specified value to the {@code cursor} field. */ + public Buffer cursor(@NativeType("Cursor") long value) { XSetWindowAttributes.ncursor(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XTimeCoord.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XTimeCoord.java new file mode 100644 index 000000000..9696559e7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XTimeCoord.java @@ -0,0 +1,171 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Layout

    + * + *
    
    + * struct XTimeCoord {
    + *     Time {@link #time};
    + *     short {@link #x};
    + *     short {@link #y};
    + * }
    + */ +public class XTimeCoord extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TIME, + X, + Y; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(2), + __member(2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TIME = layout.offsetof(0); + X = layout.offsetof(1); + Y = layout.offsetof(2); + } + + protected XTimeCoord(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XTimeCoord create(long address, @Nullable ByteBuffer container) { + return new XTimeCoord(address, container); + } + + /** + * Creates a {@code XTimeCoord} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XTimeCoord(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the time, in milliseconds */ + @NativeType("Time") + public long time() { return ntime(address()); } + /** the x coordinate of the pointer relative to the origin of the specified window */ + public short x() { return nx(address()); } + /** the y coordinate of the pointer relative to the origin of the specified window */ + public short y() { return ny(address()); } + + // ----------------------------------- + + /** Returns a new {@code XTimeCoord} instance for the specified memory address. */ + public static XTimeCoord create(long address) { + return new XTimeCoord(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XTimeCoord createSafe(long address) { + return address == NULL ? null : new XTimeCoord(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #time}. */ + public static long ntime(long struct) { return memGetCLong(struct + XTimeCoord.TIME); } + /** Unsafe version of {@link #x}. */ + public static short nx(long struct) { return UNSAFE.getShort(null, struct + XTimeCoord.X); } + /** Unsafe version of {@link #y}. */ + public static short ny(long struct) { return UNSAFE.getShort(null, struct + XTimeCoord.Y); } + + // ----------------------------------- + + /** An array of {@link XTimeCoord} structs. */ + public static class Buffer extends StructBuffer { + + private static final XTimeCoord ELEMENT_FACTORY = XTimeCoord.create(-1L); + + /** + * Creates a new {@code XTimeCoord.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XTimeCoord#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XTimeCoord getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link XTimeCoord#time} field. */ + @NativeType("Time") + public long time() { return XTimeCoord.ntime(address()); } + /** @return the value of the {@link XTimeCoord#x} field. */ + public short x() { return XTimeCoord.nx(address()); } + /** @return the value of the {@link XTimeCoord#y} field. */ + public short y() { return XTimeCoord.ny(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XUnmapEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XUnmapEvent.java new file mode 100644 index 000000000..b9f3c4a69 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XUnmapEvent.java @@ -0,0 +1,410 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XUnmapEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window event;
    + *     Window window;
    + *     int from_configure;
    + * }
    + */ +public class XUnmapEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + EVENT, + WINDOW, + FROM_CONFIGURE; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + EVENT = layout.offsetof(4); + WINDOW = layout.offsetof(5); + FROM_CONFIGURE = layout.offsetof(6); + } + + protected XUnmapEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XUnmapEvent create(long address, @Nullable ByteBuffer container) { + return new XUnmapEvent(address, container); + } + + /** + * Creates a {@code XUnmapEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XUnmapEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** @return the value of the {@code from_configure} field. */ + public int from_configure() { return nfrom_configure(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XUnmapEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XUnmapEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XUnmapEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XUnmapEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public XUnmapEvent event(@NativeType("Window") long value) { nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public XUnmapEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@code from_configure} field. */ + public XUnmapEvent from_configure(int value) { nfrom_configure(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XUnmapEvent set( + int type, + long serial, + boolean send_event, + long display, + long event, + long window, + int from_configure + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + event(event); + window(window); + from_configure(from_configure); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XUnmapEvent set(XUnmapEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XUnmapEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XUnmapEvent malloc() { + return new XUnmapEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XUnmapEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XUnmapEvent calloc() { + return new XUnmapEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XUnmapEvent} instance allocated with {@link BufferUtils}. */ + public static XUnmapEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XUnmapEvent(memAddress(container), container); + } + + /** Returns a new {@code XUnmapEvent} instance for the specified memory address. */ + public static XUnmapEvent create(long address) { + return new XUnmapEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XUnmapEvent createSafe(long address) { + return address == NULL ? null : new XUnmapEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XUnmapEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XUnmapEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XUnmapEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XUnmapEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XUnmapEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XUnmapEvent malloc(MemoryStack stack) { + return new XUnmapEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XUnmapEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XUnmapEvent calloc(MemoryStack stack) { + return new XUnmapEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XUnmapEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XUnmapEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XUnmapEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XUnmapEvent.DISPLAY); } + /** Unsafe version of {@link #event}. */ + public static long nevent(long struct) { return memGetCLong(struct + XUnmapEvent.EVENT); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XUnmapEvent.WINDOW); } + /** Unsafe version of {@link #from_configure}. */ + public static int nfrom_configure(long struct) { return UNSAFE.getInt(null, struct + XUnmapEvent.FROM_CONFIGURE); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XUnmapEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XUnmapEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XUnmapEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XUnmapEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #event(long) event}. */ + public static void nevent(long struct, long value) { memPutCLong(struct + XUnmapEvent.EVENT, value); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XUnmapEvent.WINDOW, value); } + /** Unsafe version of {@link #from_configure(int) from_configure}. */ + public static void nfrom_configure(long struct, int value) { UNSAFE.putInt(null, struct + XUnmapEvent.FROM_CONFIGURE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XUnmapEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XUnmapEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XUnmapEvent ELEMENT_FACTORY = XUnmapEvent.create(-1L); + + /** + * Creates a new {@code XUnmapEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XUnmapEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XUnmapEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XUnmapEvent.ntype(address()); } + /** @return the value of the {@link XUnmapEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XUnmapEvent.nserial(address()); } + /** @return the value of the {@link XUnmapEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XUnmapEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XUnmapEvent#display} field. */ + @NativeType("Display *") + public long display() { return XUnmapEvent.ndisplay(address()); } + /** @return the value of the {@code event} field. */ + @NativeType("Window") + public long event() { return XUnmapEvent.nevent(address()); } + /** @return the value of the {@code window} field. */ + @NativeType("Window") + public long window() { return XUnmapEvent.nwindow(address()); } + /** @return the value of the {@code from_configure} field. */ + public int from_configure() { return XUnmapEvent.nfrom_configure(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XUnmapEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XUnmapEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XUnmapEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XUnmapEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XUnmapEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XUnmapEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XUnmapEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@code event} field. */ + public Buffer event(@NativeType("Window") long value) { XUnmapEvent.nevent(address(), value); return this; } + /** Sets the specified value to the {@code window} field. */ + public Buffer window(@NativeType("Window") long value) { XUnmapEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@code from_configure} field. */ + public Buffer from_configure(int value) { XUnmapEvent.nfrom_configure(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XVisibilityEvent.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XVisibilityEvent.java new file mode 100644 index 000000000..dd6632f37 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XVisibilityEvent.java @@ -0,0 +1,390 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct XVisibilityEvent {
    + *     int type;
    + *     unsigned long {@link #serial};
    + *     Bool {@link #send_event};
    + *     Display * {@link #display};
    + *     Window {@link #window};
    + *     int {@link #state};
    + * }
    + */ +public class XVisibilityEvent extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + SERIAL, + SEND_EVENT, + DISPLAY, + WINDOW, + STATE; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + SERIAL = layout.offsetof(1); + SEND_EVENT = layout.offsetof(2); + DISPLAY = layout.offsetof(3); + WINDOW = layout.offsetof(4); + STATE = layout.offsetof(5); + } + + protected XVisibilityEvent(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XVisibilityEvent create(long address, @Nullable ByteBuffer container) { + return new XVisibilityEvent(address, container); + } + + /** + * Creates a {@code XVisibilityEvent} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XVisibilityEvent(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + public int type() { return ntype(address()); } + /** # of last request processed by server */ + @NativeType("unsigned long") + public long serial() { return nserial(address()); } + /** true if this came from an {@link X11#XSendEvent} request */ + @NativeType("Bool") + public boolean send_event() { return nsend_event(address()) != 0; } + /** {@code Display} the event was read from */ + @NativeType("Display *") + public long display() { return ndisplay(address()); } + /** window it reported relative to */ + @NativeType("Window") + public long window() { return nwindow(address()); } + /** visibility state */ + public int state() { return nstate(address()); } + + /** Sets the specified value to the {@code type} field. */ + public XVisibilityEvent type(int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@link #serial} field. */ + public XVisibilityEvent serial(@NativeType("unsigned long") long value) { nserial(address(), value); return this; } + /** Sets the specified value to the {@link #send_event} field. */ + public XVisibilityEvent send_event(@NativeType("Bool") boolean value) { nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link #display} field. */ + public XVisibilityEvent display(@NativeType("Display *") long value) { ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link #window} field. */ + public XVisibilityEvent window(@NativeType("Window") long value) { nwindow(address(), value); return this; } + /** Sets the specified value to the {@link #state} field. */ + public XVisibilityEvent state(int value) { nstate(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XVisibilityEvent set( + int type, + long serial, + boolean send_event, + long display, + long window, + int state + ) { + type(type); + serial(serial); + send_event(send_event); + display(display); + window(window); + state(state); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XVisibilityEvent set(XVisibilityEvent src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XVisibilityEvent} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XVisibilityEvent malloc() { + return new XVisibilityEvent(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XVisibilityEvent} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XVisibilityEvent calloc() { + return new XVisibilityEvent(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XVisibilityEvent} instance allocated with {@link BufferUtils}. */ + public static XVisibilityEvent create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XVisibilityEvent(memAddress(container), container); + } + + /** Returns a new {@code XVisibilityEvent} instance for the specified memory address. */ + public static XVisibilityEvent create(long address) { + return new XVisibilityEvent(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XVisibilityEvent createSafe(long address) { + return address == NULL ? null : new XVisibilityEvent(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XVisibilityEvent mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XVisibilityEvent callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XVisibilityEvent mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XVisibilityEvent callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XVisibilityEvent} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XVisibilityEvent malloc(MemoryStack stack) { + return new XVisibilityEvent(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XVisibilityEvent} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XVisibilityEvent calloc(MemoryStack stack) { + return new XVisibilityEvent(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + XVisibilityEvent.TYPE); } + /** Unsafe version of {@link #serial}. */ + public static long nserial(long struct) { return memGetCLong(struct + XVisibilityEvent.SERIAL); } + /** Unsafe version of {@link #send_event}. */ + public static int nsend_event(long struct) { return UNSAFE.getInt(null, struct + XVisibilityEvent.SEND_EVENT); } + /** Unsafe version of {@link #display}. */ + public static long ndisplay(long struct) { return memGetAddress(struct + XVisibilityEvent.DISPLAY); } + /** Unsafe version of {@link #window}. */ + public static long nwindow(long struct) { return memGetCLong(struct + XVisibilityEvent.WINDOW); } + /** Unsafe version of {@link #state}. */ + public static int nstate(long struct) { return UNSAFE.getInt(null, struct + XVisibilityEvent.STATE); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + XVisibilityEvent.TYPE, value); } + /** Unsafe version of {@link #serial(long) serial}. */ + public static void nserial(long struct, long value) { memPutCLong(struct + XVisibilityEvent.SERIAL, value); } + /** Unsafe version of {@link #send_event(boolean) send_event}. */ + public static void nsend_event(long struct, int value) { UNSAFE.putInt(null, struct + XVisibilityEvent.SEND_EVENT, value); } + /** Unsafe version of {@link #display(long) display}. */ + public static void ndisplay(long struct, long value) { memPutAddress(struct + XVisibilityEvent.DISPLAY, check(value)); } + /** Unsafe version of {@link #window(long) window}. */ + public static void nwindow(long struct, long value) { memPutCLong(struct + XVisibilityEvent.WINDOW, value); } + /** Unsafe version of {@link #state(int) state}. */ + public static void nstate(long struct, int value) { UNSAFE.putInt(null, struct + XVisibilityEvent.STATE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XVisibilityEvent.DISPLAY)); + } + + // ----------------------------------- + + /** An array of {@link XVisibilityEvent} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XVisibilityEvent ELEMENT_FACTORY = XVisibilityEvent.create(-1L); + + /** + * Creates a new {@code XVisibilityEvent.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XVisibilityEvent#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XVisibilityEvent getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + public int type() { return XVisibilityEvent.ntype(address()); } + /** @return the value of the {@link XVisibilityEvent#serial} field. */ + @NativeType("unsigned long") + public long serial() { return XVisibilityEvent.nserial(address()); } + /** @return the value of the {@link XVisibilityEvent#send_event} field. */ + @NativeType("Bool") + public boolean send_event() { return XVisibilityEvent.nsend_event(address()) != 0; } + /** @return the value of the {@link XVisibilityEvent#display} field. */ + @NativeType("Display *") + public long display() { return XVisibilityEvent.ndisplay(address()); } + /** @return the value of the {@link XVisibilityEvent#window} field. */ + @NativeType("Window") + public long window() { return XVisibilityEvent.nwindow(address()); } + /** @return the value of the {@link XVisibilityEvent#state} field. */ + public int state() { return XVisibilityEvent.nstate(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(int value) { XVisibilityEvent.ntype(address(), value); return this; } + /** Sets the specified value to the {@link XVisibilityEvent#serial} field. */ + public Buffer serial(@NativeType("unsigned long") long value) { XVisibilityEvent.nserial(address(), value); return this; } + /** Sets the specified value to the {@link XVisibilityEvent#send_event} field. */ + public Buffer send_event(@NativeType("Bool") boolean value) { XVisibilityEvent.nsend_event(address(), value ? 1 : 0); return this; } + /** Sets the specified value to the {@link XVisibilityEvent#display} field. */ + public Buffer display(@NativeType("Display *") long value) { XVisibilityEvent.ndisplay(address(), value); return this; } + /** Sets the specified value to the {@link XVisibilityEvent#window} field. */ + public Buffer window(@NativeType("Window") long value) { XVisibilityEvent.nwindow(address(), value); return this; } + /** Sets the specified value to the {@link XVisibilityEvent#state} field. */ + public Buffer state(int value) { XVisibilityEvent.nstate(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XVisualInfo.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XVisualInfo.java new file mode 100644 index 000000000..bac705d36 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/XVisualInfo.java @@ -0,0 +1,466 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Information used by the visual utility routines to find desired visual type from the many visuals a display may support. + * + *

    Layout

    + * + *
    
    + * struct XVisualInfo {
    + *     {@link Visual Visual} * visual;
    + *     VisualID visualid;
    + *     int screen;
    + *     int depth;
    + *     int class;
    + *     unsigned long red_mask;
    + *     unsigned long green_mask;
    + *     unsigned long blue_mask;
    + *     int colormap_size;
    + *     int bits_per_rgb;
    + * }
    + */ +public class XVisualInfo extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + VISUAL, + VISUALID, + SCREEN, + DEPTH, + CLASS, + RED_MASK, + GREEN_MASK, + BLUE_MASK, + COLORMAP_SIZE, + BITS_PER_RGB; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(4), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + VISUAL = layout.offsetof(0); + VISUALID = layout.offsetof(1); + SCREEN = layout.offsetof(2); + DEPTH = layout.offsetof(3); + CLASS = layout.offsetof(4); + RED_MASK = layout.offsetof(5); + GREEN_MASK = layout.offsetof(6); + BLUE_MASK = layout.offsetof(7); + COLORMAP_SIZE = layout.offsetof(8); + BITS_PER_RGB = layout.offsetof(9); + } + + protected XVisualInfo(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected XVisualInfo create(long address, @Nullable ByteBuffer container) { + return new XVisualInfo(address, container); + } + + /** + * Creates a {@code XVisualInfo} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public XVisualInfo(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link Visual} view of the struct pointed to by the {@code visual} field. */ + @NativeType("Visual *") + public Visual visual() { return nvisual(address()); } + /** @return the value of the {@code visualid} field. */ + @NativeType("VisualID") + public long visualid() { return nvisualid(address()); } + /** @return the value of the {@code screen} field. */ + public int screen() { return nscreen(address()); } + /** @return the value of the {@code depth} field. */ + public int depth() { return ndepth(address()); } + /** @return the value of the {@code class} field. */ + public int class$() { return nclass$(address()); } + /** @return the value of the {@code red_mask} field. */ + @NativeType("unsigned long") + public long red_mask() { return nred_mask(address()); } + /** @return the value of the {@code green_mask} field. */ + @NativeType("unsigned long") + public long green_mask() { return ngreen_mask(address()); } + /** @return the value of the {@code blue_mask} field. */ + @NativeType("unsigned long") + public long blue_mask() { return nblue_mask(address()); } + /** @return the value of the {@code colormap_size} field. */ + public int colormap_size() { return ncolormap_size(address()); } + /** @return the value of the {@code bits_per_rgb} field. */ + public int bits_per_rgb() { return nbits_per_rgb(address()); } + + /** Sets the address of the specified {@link Visual} to the {@code visual} field. */ + public XVisualInfo visual(@NativeType("Visual *") Visual value) { nvisual(address(), value); return this; } + /** Sets the specified value to the {@code visualid} field. */ + public XVisualInfo visualid(@NativeType("VisualID") long value) { nvisualid(address(), value); return this; } + /** Sets the specified value to the {@code screen} field. */ + public XVisualInfo screen(int value) { nscreen(address(), value); return this; } + /** Sets the specified value to the {@code depth} field. */ + public XVisualInfo depth(int value) { ndepth(address(), value); return this; } + /** Sets the specified value to the {@code class} field. */ + public XVisualInfo class$(int value) { nclass$(address(), value); return this; } + /** Sets the specified value to the {@code red_mask} field. */ + public XVisualInfo red_mask(@NativeType("unsigned long") long value) { nred_mask(address(), value); return this; } + /** Sets the specified value to the {@code green_mask} field. */ + public XVisualInfo green_mask(@NativeType("unsigned long") long value) { ngreen_mask(address(), value); return this; } + /** Sets the specified value to the {@code blue_mask} field. */ + public XVisualInfo blue_mask(@NativeType("unsigned long") long value) { nblue_mask(address(), value); return this; } + /** Sets the specified value to the {@code colormap_size} field. */ + public XVisualInfo colormap_size(int value) { ncolormap_size(address(), value); return this; } + /** Sets the specified value to the {@code bits_per_rgb} field. */ + public XVisualInfo bits_per_rgb(int value) { nbits_per_rgb(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public XVisualInfo set( + Visual visual, + long visualid, + int screen, + int depth, + int class$, + long red_mask, + long green_mask, + long blue_mask, + int colormap_size, + int bits_per_rgb + ) { + visual(visual); + visualid(visualid); + screen(screen); + depth(depth); + class$(class$); + red_mask(red_mask); + green_mask(green_mask); + blue_mask(blue_mask); + colormap_size(colormap_size); + bits_per_rgb(bits_per_rgb); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public XVisualInfo set(XVisualInfo src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code XVisualInfo} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static XVisualInfo malloc() { + return new XVisualInfo(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code XVisualInfo} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static XVisualInfo calloc() { + return new XVisualInfo(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code XVisualInfo} instance allocated with {@link BufferUtils}. */ + public static XVisualInfo create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new XVisualInfo(memAddress(container), container); + } + + /** Returns a new {@code XVisualInfo} instance for the specified memory address. */ + public static XVisualInfo create(long address) { + return new XVisualInfo(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static XVisualInfo createSafe(long address) { + return address == NULL ? null : new XVisualInfo(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XVisualInfo mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XVisualInfo callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static XVisualInfo mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static XVisualInfo callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code XVisualInfo} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static XVisualInfo malloc(MemoryStack stack) { + return new XVisualInfo(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code XVisualInfo} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static XVisualInfo calloc(MemoryStack stack) { + return new XVisualInfo(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #visual}. */ + public static Visual nvisual(long struct) { return Visual.create(memGetAddress(struct + XVisualInfo.VISUAL)); } + /** Unsafe version of {@link #visualid}. */ + public static long nvisualid(long struct) { return memGetCLong(struct + XVisualInfo.VISUALID); } + /** Unsafe version of {@link #screen}. */ + public static int nscreen(long struct) { return UNSAFE.getInt(null, struct + XVisualInfo.SCREEN); } + /** Unsafe version of {@link #depth}. */ + public static int ndepth(long struct) { return UNSAFE.getInt(null, struct + XVisualInfo.DEPTH); } + /** Unsafe version of {@link #class$}. */ + public static int nclass$(long struct) { return UNSAFE.getInt(null, struct + XVisualInfo.CLASS); } + /** Unsafe version of {@link #red_mask}. */ + public static long nred_mask(long struct) { return memGetCLong(struct + XVisualInfo.RED_MASK); } + /** Unsafe version of {@link #green_mask}. */ + public static long ngreen_mask(long struct) { return memGetCLong(struct + XVisualInfo.GREEN_MASK); } + /** Unsafe version of {@link #blue_mask}. */ + public static long nblue_mask(long struct) { return memGetCLong(struct + XVisualInfo.BLUE_MASK); } + /** Unsafe version of {@link #colormap_size}. */ + public static int ncolormap_size(long struct) { return UNSAFE.getInt(null, struct + XVisualInfo.COLORMAP_SIZE); } + /** Unsafe version of {@link #bits_per_rgb}. */ + public static int nbits_per_rgb(long struct) { return UNSAFE.getInt(null, struct + XVisualInfo.BITS_PER_RGB); } + + /** Unsafe version of {@link #visual(Visual) visual}. */ + public static void nvisual(long struct, Visual value) { memPutAddress(struct + XVisualInfo.VISUAL, value.address()); } + /** Unsafe version of {@link #visualid(long) visualid}. */ + public static void nvisualid(long struct, long value) { memPutCLong(struct + XVisualInfo.VISUALID, value); } + /** Unsafe version of {@link #screen(int) screen}. */ + public static void nscreen(long struct, int value) { UNSAFE.putInt(null, struct + XVisualInfo.SCREEN, value); } + /** Unsafe version of {@link #depth(int) depth}. */ + public static void ndepth(long struct, int value) { UNSAFE.putInt(null, struct + XVisualInfo.DEPTH, value); } + /** Unsafe version of {@link #class$(int) class$}. */ + public static void nclass$(long struct, int value) { UNSAFE.putInt(null, struct + XVisualInfo.CLASS, value); } + /** Unsafe version of {@link #red_mask(long) red_mask}. */ + public static void nred_mask(long struct, long value) { memPutCLong(struct + XVisualInfo.RED_MASK, value); } + /** Unsafe version of {@link #green_mask(long) green_mask}. */ + public static void ngreen_mask(long struct, long value) { memPutCLong(struct + XVisualInfo.GREEN_MASK, value); } + /** Unsafe version of {@link #blue_mask(long) blue_mask}. */ + public static void nblue_mask(long struct, long value) { memPutCLong(struct + XVisualInfo.BLUE_MASK, value); } + /** Unsafe version of {@link #colormap_size(int) colormap_size}. */ + public static void ncolormap_size(long struct, int value) { UNSAFE.putInt(null, struct + XVisualInfo.COLORMAP_SIZE, value); } + /** Unsafe version of {@link #bits_per_rgb(int) bits_per_rgb}. */ + public static void nbits_per_rgb(long struct, int value) { UNSAFE.putInt(null, struct + XVisualInfo.BITS_PER_RGB, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + XVisualInfo.VISUAL)); + } + + // ----------------------------------- + + /** An array of {@link XVisualInfo} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final XVisualInfo ELEMENT_FACTORY = XVisualInfo.create(-1L); + + /** + * Creates a new {@code XVisualInfo.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link XVisualInfo#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected XVisualInfo getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link Visual} view of the struct pointed to by the {@code visual} field. */ + @NativeType("Visual *") + public Visual visual() { return XVisualInfo.nvisual(address()); } + /** @return the value of the {@code visualid} field. */ + @NativeType("VisualID") + public long visualid() { return XVisualInfo.nvisualid(address()); } + /** @return the value of the {@code screen} field. */ + public int screen() { return XVisualInfo.nscreen(address()); } + /** @return the value of the {@code depth} field. */ + public int depth() { return XVisualInfo.ndepth(address()); } + /** @return the value of the {@code class} field. */ + public int class$() { return XVisualInfo.nclass$(address()); } + /** @return the value of the {@code red_mask} field. */ + @NativeType("unsigned long") + public long red_mask() { return XVisualInfo.nred_mask(address()); } + /** @return the value of the {@code green_mask} field. */ + @NativeType("unsigned long") + public long green_mask() { return XVisualInfo.ngreen_mask(address()); } + /** @return the value of the {@code blue_mask} field. */ + @NativeType("unsigned long") + public long blue_mask() { return XVisualInfo.nblue_mask(address()); } + /** @return the value of the {@code colormap_size} field. */ + public int colormap_size() { return XVisualInfo.ncolormap_size(address()); } + /** @return the value of the {@code bits_per_rgb} field. */ + public int bits_per_rgb() { return XVisualInfo.nbits_per_rgb(address()); } + + /** Sets the address of the specified {@link Visual} to the {@code visual} field. */ + public Buffer visual(@NativeType("Visual *") Visual value) { XVisualInfo.nvisual(address(), value); return this; } + /** Sets the specified value to the {@code visualid} field. */ + public Buffer visualid(@NativeType("VisualID") long value) { XVisualInfo.nvisualid(address(), value); return this; } + /** Sets the specified value to the {@code screen} field. */ + public Buffer screen(int value) { XVisualInfo.nscreen(address(), value); return this; } + /** Sets the specified value to the {@code depth} field. */ + public Buffer depth(int value) { XVisualInfo.ndepth(address(), value); return this; } + /** Sets the specified value to the {@code class} field. */ + public Buffer class$(int value) { XVisualInfo.nclass$(address(), value); return this; } + /** Sets the specified value to the {@code red_mask} field. */ + public Buffer red_mask(@NativeType("unsigned long") long value) { XVisualInfo.nred_mask(address(), value); return this; } + /** Sets the specified value to the {@code green_mask} field. */ + public Buffer green_mask(@NativeType("unsigned long") long value) { XVisualInfo.ngreen_mask(address(), value); return this; } + /** Sets the specified value to the {@code blue_mask} field. */ + public Buffer blue_mask(@NativeType("unsigned long") long value) { XVisualInfo.nblue_mask(address(), value); return this; } + /** Sets the specified value to the {@code colormap_size} field. */ + public Buffer colormap_size(int value) { XVisualInfo.ncolormap_size(address(), value); return this; } + /** Sets the specified value to the {@code bits_per_rgb} field. */ + public Buffer bits_per_rgb(int value) { XVisualInfo.nbits_per_rgb(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOCQRingOffsets.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOCQRingOffsets.java new file mode 100644 index 000000000..8ee99f92d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOCQRingOffsets.java @@ -0,0 +1,398 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_cqring_offsets {
    + *     __u32 head;
    + *     __u32 tail;
    + *     __u32 ring_mask;
    + *     __u32 ring_entries;
    + *     __u32 overflow;
    + *     __u32 cqes;
    + *     __u32 flags;
    + *     __u32 resv1;
    + *     __u64 resv2;
    + * }
    + */ +@NativeType("struct io_cqring_offsets") +public class IOCQRingOffsets extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + HEAD, + TAIL, + RING_MASK, + RING_ENTRIES, + OVERFLOW, + CQES, + FLAGS, + RESV1, + RESV2; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(8) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + HEAD = layout.offsetof(0); + TAIL = layout.offsetof(1); + RING_MASK = layout.offsetof(2); + RING_ENTRIES = layout.offsetof(3); + OVERFLOW = layout.offsetof(4); + CQES = layout.offsetof(5); + FLAGS = layout.offsetof(6); + RESV1 = layout.offsetof(7); + RESV2 = layout.offsetof(8); + } + + protected IOCQRingOffsets(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOCQRingOffsets create(long address, @Nullable ByteBuffer container) { + return new IOCQRingOffsets(address, container); + } + + /** + * Creates a {@code IOCQRingOffsets} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOCQRingOffsets(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code head} field. */ + @NativeType("__u32") + public int head() { return nhead(address()); } + /** @return the value of the {@code tail} field. */ + @NativeType("__u32") + public int tail() { return ntail(address()); } + /** @return the value of the {@code ring_mask} field. */ + @NativeType("__u32") + public int ring_mask() { return nring_mask(address()); } + /** @return the value of the {@code ring_entries} field. */ + @NativeType("__u32") + public int ring_entries() { return nring_entries(address()); } + /** @return the value of the {@code overflow} field. */ + @NativeType("__u32") + public int overflow() { return noverflow(address()); } + /** @return the value of the {@code cqes} field. */ + @NativeType("__u32") + public int cqes() { return ncqes(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u32") + public int flags() { return nflags(address()); } + + /** Sets the specified value to the {@code head} field. */ + public IOCQRingOffsets head(@NativeType("__u32") int value) { nhead(address(), value); return this; } + /** Sets the specified value to the {@code tail} field. */ + public IOCQRingOffsets tail(@NativeType("__u32") int value) { ntail(address(), value); return this; } + /** Sets the specified value to the {@code ring_mask} field. */ + public IOCQRingOffsets ring_mask(@NativeType("__u32") int value) { nring_mask(address(), value); return this; } + /** Sets the specified value to the {@code ring_entries} field. */ + public IOCQRingOffsets ring_entries(@NativeType("__u32") int value) { nring_entries(address(), value); return this; } + /** Sets the specified value to the {@code overflow} field. */ + public IOCQRingOffsets overflow(@NativeType("__u32") int value) { noverflow(address(), value); return this; } + /** Sets the specified value to the {@code cqes} field. */ + public IOCQRingOffsets cqes(@NativeType("__u32") int value) { ncqes(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public IOCQRingOffsets flags(@NativeType("__u32") int value) { nflags(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOCQRingOffsets set( + int head, + int tail, + int ring_mask, + int ring_entries, + int overflow, + int cqes, + int flags + ) { + head(head); + tail(tail); + ring_mask(ring_mask); + ring_entries(ring_entries); + overflow(overflow); + cqes(cqes); + flags(flags); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOCQRingOffsets set(IOCQRingOffsets src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOCQRingOffsets} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOCQRingOffsets malloc() { + return new IOCQRingOffsets(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOCQRingOffsets} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOCQRingOffsets calloc() { + return new IOCQRingOffsets(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOCQRingOffsets} instance allocated with {@link BufferUtils}. */ + public static IOCQRingOffsets create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOCQRingOffsets(memAddress(container), container); + } + + /** Returns a new {@code IOCQRingOffsets} instance for the specified memory address. */ + public static IOCQRingOffsets create(long address) { + return new IOCQRingOffsets(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOCQRingOffsets createSafe(long address) { + return address == NULL ? null : new IOCQRingOffsets(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOCQRingOffsets} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOCQRingOffsets malloc(MemoryStack stack) { + return new IOCQRingOffsets(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOCQRingOffsets} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOCQRingOffsets calloc(MemoryStack stack) { + return new IOCQRingOffsets(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #head}. */ + public static int nhead(long struct) { return UNSAFE.getInt(null, struct + IOCQRingOffsets.HEAD); } + /** Unsafe version of {@link #tail}. */ + public static int ntail(long struct) { return UNSAFE.getInt(null, struct + IOCQRingOffsets.TAIL); } + /** Unsafe version of {@link #ring_mask}. */ + public static int nring_mask(long struct) { return UNSAFE.getInt(null, struct + IOCQRingOffsets.RING_MASK); } + /** Unsafe version of {@link #ring_entries}. */ + public static int nring_entries(long struct) { return UNSAFE.getInt(null, struct + IOCQRingOffsets.RING_ENTRIES); } + /** Unsafe version of {@link #overflow}. */ + public static int noverflow(long struct) { return UNSAFE.getInt(null, struct + IOCQRingOffsets.OVERFLOW); } + /** Unsafe version of {@link #cqes}. */ + public static int ncqes(long struct) { return UNSAFE.getInt(null, struct + IOCQRingOffsets.CQES); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + IOCQRingOffsets.FLAGS); } + public static int nresv1(long struct) { return UNSAFE.getInt(null, struct + IOCQRingOffsets.RESV1); } + public static long nresv2(long struct) { return UNSAFE.getLong(null, struct + IOCQRingOffsets.RESV2); } + + /** Unsafe version of {@link #head(int) head}. */ + public static void nhead(long struct, int value) { UNSAFE.putInt(null, struct + IOCQRingOffsets.HEAD, value); } + /** Unsafe version of {@link #tail(int) tail}. */ + public static void ntail(long struct, int value) { UNSAFE.putInt(null, struct + IOCQRingOffsets.TAIL, value); } + /** Unsafe version of {@link #ring_mask(int) ring_mask}. */ + public static void nring_mask(long struct, int value) { UNSAFE.putInt(null, struct + IOCQRingOffsets.RING_MASK, value); } + /** Unsafe version of {@link #ring_entries(int) ring_entries}. */ + public static void nring_entries(long struct, int value) { UNSAFE.putInt(null, struct + IOCQRingOffsets.RING_ENTRIES, value); } + /** Unsafe version of {@link #overflow(int) overflow}. */ + public static void noverflow(long struct, int value) { UNSAFE.putInt(null, struct + IOCQRingOffsets.OVERFLOW, value); } + /** Unsafe version of {@link #cqes(int) cqes}. */ + public static void ncqes(long struct, int value) { UNSAFE.putInt(null, struct + IOCQRingOffsets.CQES, value); } + /** Unsafe version of {@link #flags(int) flags}. */ + public static void nflags(long struct, int value) { UNSAFE.putInt(null, struct + IOCQRingOffsets.FLAGS, value); } + public static void nresv1(long struct, int value) { UNSAFE.putInt(null, struct + IOCQRingOffsets.RESV1, value); } + public static void nresv2(long struct, long value) { UNSAFE.putLong(null, struct + IOCQRingOffsets.RESV2, value); } + + // ----------------------------------- + + /** An array of {@link IOCQRingOffsets} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOCQRingOffsets ELEMENT_FACTORY = IOCQRingOffsets.create(-1L); + + /** + * Creates a new {@code IOCQRingOffsets.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOCQRingOffsets#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOCQRingOffsets getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code head} field. */ + @NativeType("__u32") + public int head() { return IOCQRingOffsets.nhead(address()); } + /** @return the value of the {@code tail} field. */ + @NativeType("__u32") + public int tail() { return IOCQRingOffsets.ntail(address()); } + /** @return the value of the {@code ring_mask} field. */ + @NativeType("__u32") + public int ring_mask() { return IOCQRingOffsets.nring_mask(address()); } + /** @return the value of the {@code ring_entries} field. */ + @NativeType("__u32") + public int ring_entries() { return IOCQRingOffsets.nring_entries(address()); } + /** @return the value of the {@code overflow} field. */ + @NativeType("__u32") + public int overflow() { return IOCQRingOffsets.noverflow(address()); } + /** @return the value of the {@code cqes} field. */ + @NativeType("__u32") + public int cqes() { return IOCQRingOffsets.ncqes(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u32") + public int flags() { return IOCQRingOffsets.nflags(address()); } + + /** Sets the specified value to the {@code head} field. */ + public Buffer head(@NativeType("__u32") int value) { IOCQRingOffsets.nhead(address(), value); return this; } + /** Sets the specified value to the {@code tail} field. */ + public Buffer tail(@NativeType("__u32") int value) { IOCQRingOffsets.ntail(address(), value); return this; } + /** Sets the specified value to the {@code ring_mask} field. */ + public Buffer ring_mask(@NativeType("__u32") int value) { IOCQRingOffsets.nring_mask(address(), value); return this; } + /** Sets the specified value to the {@code ring_entries} field. */ + public Buffer ring_entries(@NativeType("__u32") int value) { IOCQRingOffsets.nring_entries(address(), value); return this; } + /** Sets the specified value to the {@code overflow} field. */ + public Buffer overflow(@NativeType("__u32") int value) { IOCQRingOffsets.noverflow(address(), value); return this; } + /** Sets the specified value to the {@code cqes} field. */ + public Buffer cqes(@NativeType("__u32") int value) { IOCQRingOffsets.ncqes(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public Buffer flags(@NativeType("__u32") int value) { IOCQRingOffsets.nflags(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOSQRingOffsets.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOSQRingOffsets.java new file mode 100644 index 000000000..2c28bf6c5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOSQRingOffsets.java @@ -0,0 +1,400 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Filled with the offset for {@code mmap(2)}. + * + *

    Layout

    + * + *
    
    + * struct io_sqring_offsets {
    + *     __u32 head;
    + *     __u32 tail;
    + *     __u32 ring_mask;
    + *     __u32 ring_entries;
    + *     __u32 flags;
    + *     __u32 dropped;
    + *     __u32 array;
    + *     __u32 resv1;
    + *     __u64 resv2;
    + * }
    + */ +@NativeType("struct io_sqring_offsets") +public class IOSQRingOffsets extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + HEAD, + TAIL, + RING_MASK, + RING_ENTRIES, + FLAGS, + DROPPED, + ARRAY, + RESV1, + RESV2; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(8) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + HEAD = layout.offsetof(0); + TAIL = layout.offsetof(1); + RING_MASK = layout.offsetof(2); + RING_ENTRIES = layout.offsetof(3); + FLAGS = layout.offsetof(4); + DROPPED = layout.offsetof(5); + ARRAY = layout.offsetof(6); + RESV1 = layout.offsetof(7); + RESV2 = layout.offsetof(8); + } + + protected IOSQRingOffsets(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOSQRingOffsets create(long address, @Nullable ByteBuffer container) { + return new IOSQRingOffsets(address, container); + } + + /** + * Creates a {@code IOSQRingOffsets} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOSQRingOffsets(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code head} field. */ + @NativeType("__u32") + public int head() { return nhead(address()); } + /** @return the value of the {@code tail} field. */ + @NativeType("__u32") + public int tail() { return ntail(address()); } + /** @return the value of the {@code ring_mask} field. */ + @NativeType("__u32") + public int ring_mask() { return nring_mask(address()); } + /** @return the value of the {@code ring_entries} field. */ + @NativeType("__u32") + public int ring_entries() { return nring_entries(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u32") + public int flags() { return nflags(address()); } + /** @return the value of the {@code dropped} field. */ + @NativeType("__u32") + public int dropped() { return ndropped(address()); } + /** @return the value of the {@code array} field. */ + @NativeType("__u32") + public int array() { return narray(address()); } + + /** Sets the specified value to the {@code head} field. */ + public IOSQRingOffsets head(@NativeType("__u32") int value) { nhead(address(), value); return this; } + /** Sets the specified value to the {@code tail} field. */ + public IOSQRingOffsets tail(@NativeType("__u32") int value) { ntail(address(), value); return this; } + /** Sets the specified value to the {@code ring_mask} field. */ + public IOSQRingOffsets ring_mask(@NativeType("__u32") int value) { nring_mask(address(), value); return this; } + /** Sets the specified value to the {@code ring_entries} field. */ + public IOSQRingOffsets ring_entries(@NativeType("__u32") int value) { nring_entries(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public IOSQRingOffsets flags(@NativeType("__u32") int value) { nflags(address(), value); return this; } + /** Sets the specified value to the {@code dropped} field. */ + public IOSQRingOffsets dropped(@NativeType("__u32") int value) { ndropped(address(), value); return this; } + /** Sets the specified value to the {@code array} field. */ + public IOSQRingOffsets array(@NativeType("__u32") int value) { narray(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOSQRingOffsets set( + int head, + int tail, + int ring_mask, + int ring_entries, + int flags, + int dropped, + int array + ) { + head(head); + tail(tail); + ring_mask(ring_mask); + ring_entries(ring_entries); + flags(flags); + dropped(dropped); + array(array); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOSQRingOffsets set(IOSQRingOffsets src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOSQRingOffsets} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOSQRingOffsets malloc() { + return new IOSQRingOffsets(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOSQRingOffsets} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOSQRingOffsets calloc() { + return new IOSQRingOffsets(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOSQRingOffsets} instance allocated with {@link BufferUtils}. */ + public static IOSQRingOffsets create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOSQRingOffsets(memAddress(container), container); + } + + /** Returns a new {@code IOSQRingOffsets} instance for the specified memory address. */ + public static IOSQRingOffsets create(long address) { + return new IOSQRingOffsets(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOSQRingOffsets createSafe(long address) { + return address == NULL ? null : new IOSQRingOffsets(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOSQRingOffsets} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOSQRingOffsets malloc(MemoryStack stack) { + return new IOSQRingOffsets(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOSQRingOffsets} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOSQRingOffsets calloc(MemoryStack stack) { + return new IOSQRingOffsets(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #head}. */ + public static int nhead(long struct) { return UNSAFE.getInt(null, struct + IOSQRingOffsets.HEAD); } + /** Unsafe version of {@link #tail}. */ + public static int ntail(long struct) { return UNSAFE.getInt(null, struct + IOSQRingOffsets.TAIL); } + /** Unsafe version of {@link #ring_mask}. */ + public static int nring_mask(long struct) { return UNSAFE.getInt(null, struct + IOSQRingOffsets.RING_MASK); } + /** Unsafe version of {@link #ring_entries}. */ + public static int nring_entries(long struct) { return UNSAFE.getInt(null, struct + IOSQRingOffsets.RING_ENTRIES); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + IOSQRingOffsets.FLAGS); } + /** Unsafe version of {@link #dropped}. */ + public static int ndropped(long struct) { return UNSAFE.getInt(null, struct + IOSQRingOffsets.DROPPED); } + /** Unsafe version of {@link #array}. */ + public static int narray(long struct) { return UNSAFE.getInt(null, struct + IOSQRingOffsets.ARRAY); } + public static int nresv1(long struct) { return UNSAFE.getInt(null, struct + IOSQRingOffsets.RESV1); } + public static long nresv2(long struct) { return UNSAFE.getLong(null, struct + IOSQRingOffsets.RESV2); } + + /** Unsafe version of {@link #head(int) head}. */ + public static void nhead(long struct, int value) { UNSAFE.putInt(null, struct + IOSQRingOffsets.HEAD, value); } + /** Unsafe version of {@link #tail(int) tail}. */ + public static void ntail(long struct, int value) { UNSAFE.putInt(null, struct + IOSQRingOffsets.TAIL, value); } + /** Unsafe version of {@link #ring_mask(int) ring_mask}. */ + public static void nring_mask(long struct, int value) { UNSAFE.putInt(null, struct + IOSQRingOffsets.RING_MASK, value); } + /** Unsafe version of {@link #ring_entries(int) ring_entries}. */ + public static void nring_entries(long struct, int value) { UNSAFE.putInt(null, struct + IOSQRingOffsets.RING_ENTRIES, value); } + /** Unsafe version of {@link #flags(int) flags}. */ + public static void nflags(long struct, int value) { UNSAFE.putInt(null, struct + IOSQRingOffsets.FLAGS, value); } + /** Unsafe version of {@link #dropped(int) dropped}. */ + public static void ndropped(long struct, int value) { UNSAFE.putInt(null, struct + IOSQRingOffsets.DROPPED, value); } + /** Unsafe version of {@link #array(int) array}. */ + public static void narray(long struct, int value) { UNSAFE.putInt(null, struct + IOSQRingOffsets.ARRAY, value); } + public static void nresv1(long struct, int value) { UNSAFE.putInt(null, struct + IOSQRingOffsets.RESV1, value); } + public static void nresv2(long struct, long value) { UNSAFE.putLong(null, struct + IOSQRingOffsets.RESV2, value); } + + // ----------------------------------- + + /** An array of {@link IOSQRingOffsets} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOSQRingOffsets ELEMENT_FACTORY = IOSQRingOffsets.create(-1L); + + /** + * Creates a new {@code IOSQRingOffsets.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOSQRingOffsets#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOSQRingOffsets getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code head} field. */ + @NativeType("__u32") + public int head() { return IOSQRingOffsets.nhead(address()); } + /** @return the value of the {@code tail} field. */ + @NativeType("__u32") + public int tail() { return IOSQRingOffsets.ntail(address()); } + /** @return the value of the {@code ring_mask} field. */ + @NativeType("__u32") + public int ring_mask() { return IOSQRingOffsets.nring_mask(address()); } + /** @return the value of the {@code ring_entries} field. */ + @NativeType("__u32") + public int ring_entries() { return IOSQRingOffsets.nring_entries(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u32") + public int flags() { return IOSQRingOffsets.nflags(address()); } + /** @return the value of the {@code dropped} field. */ + @NativeType("__u32") + public int dropped() { return IOSQRingOffsets.ndropped(address()); } + /** @return the value of the {@code array} field. */ + @NativeType("__u32") + public int array() { return IOSQRingOffsets.narray(address()); } + + /** Sets the specified value to the {@code head} field. */ + public Buffer head(@NativeType("__u32") int value) { IOSQRingOffsets.nhead(address(), value); return this; } + /** Sets the specified value to the {@code tail} field. */ + public Buffer tail(@NativeType("__u32") int value) { IOSQRingOffsets.ntail(address(), value); return this; } + /** Sets the specified value to the {@code ring_mask} field. */ + public Buffer ring_mask(@NativeType("__u32") int value) { IOSQRingOffsets.nring_mask(address(), value); return this; } + /** Sets the specified value to the {@code ring_entries} field. */ + public Buffer ring_entries(@NativeType("__u32") int value) { IOSQRingOffsets.nring_entries(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public Buffer flags(@NativeType("__u32") int value) { IOSQRingOffsets.nflags(address(), value); return this; } + /** Sets the specified value to the {@code dropped} field. */ + public Buffer dropped(@NativeType("__u32") int value) { IOSQRingOffsets.ndropped(address(), value); return this; } + /** Sets the specified value to the {@code array} field. */ + public Buffer array(@NativeType("__u32") int value) { IOSQRingOffsets.narray(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURing.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURing.java new file mode 100644 index 000000000..ccf4c1a3f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURing.java @@ -0,0 +1,422 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring {
    + *     {@link IOURingSQ struct io_uring_sq} sq;
    + *     {@link IOURingCQ struct io_uring_cq} cq;
    + *     unsigned int flags;
    + *     int ring_fd;
    + *     unsigned int features;
    + *     int enter_ring_fd;
    + *     __u8 int_flags;
    + *     __u8 pad[3];
    + *     unsigned pad2;
    + * }
    + */ +@NativeType("struct io_uring") +public class IOURing extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + SQ, + CQ, + FLAGS, + RING_FD, + FEATURES, + ENTER_RING_FD, + INT_FLAGS, + PAD, + PAD2; + + static { + Layout layout = __struct( + __member(IOURingSQ.SIZEOF, IOURingSQ.ALIGNOF), + __member(IOURingCQ.SIZEOF, IOURingCQ.ALIGNOF), + __member(4), + __member(4), + __member(4), + __member(4), + __member(1), + __array(1, 3), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + SQ = layout.offsetof(0); + CQ = layout.offsetof(1); + FLAGS = layout.offsetof(2); + RING_FD = layout.offsetof(3); + FEATURES = layout.offsetof(4); + ENTER_RING_FD = layout.offsetof(5); + INT_FLAGS = layout.offsetof(6); + PAD = layout.offsetof(7); + PAD2 = layout.offsetof(8); + } + + protected IOURing(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURing create(long address, @Nullable ByteBuffer container) { + return new IOURing(address, container); + } + + /** + * Creates a {@code IOURing} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURing(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link IOURingSQ} view of the {@code sq} field. */ + @NativeType("struct io_uring_sq") + public IOURingSQ sq() { return nsq(address()); } + /** @return a {@link IOURingCQ} view of the {@code cq} field. */ + @NativeType("struct io_uring_cq") + public IOURingCQ cq() { return ncq(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("unsigned int") + public int flags() { return nflags(address()); } + /** @return the value of the {@code ring_fd} field. */ + public int ring_fd() { return nring_fd(address()); } + /** @return the value of the {@code features} field. */ + @NativeType("unsigned int") + public int features() { return nfeatures(address()); } + /** @return the value of the {@code enter_ring_fd} field. */ + public int enter_ring_fd() { return nenter_ring_fd(address()); } + /** @return the value of the {@code int_flags} field. */ + @NativeType("__u8") + public byte int_flags() { return nint_flags(address()); } + + /** Copies the specified {@link IOURingSQ} to the {@code sq} field. */ + public IOURing sq(@NativeType("struct io_uring_sq") IOURingSQ value) { nsq(address(), value); return this; } + /** Passes the {@code sq} field to the specified {@link java.util.function.Consumer Consumer}. */ + public IOURing sq(java.util.function.Consumer consumer) { consumer.accept(sq()); return this; } + /** Copies the specified {@link IOURingCQ} to the {@code cq} field. */ + public IOURing cq(@NativeType("struct io_uring_cq") IOURingCQ value) { ncq(address(), value); return this; } + /** Passes the {@code cq} field to the specified {@link java.util.function.Consumer Consumer}. */ + public IOURing cq(java.util.function.Consumer consumer) { consumer.accept(cq()); return this; } + /** Sets the specified value to the {@code flags} field. */ + public IOURing flags(@NativeType("unsigned int") int value) { nflags(address(), value); return this; } + /** Sets the specified value to the {@code ring_fd} field. */ + public IOURing ring_fd(int value) { nring_fd(address(), value); return this; } + /** Sets the specified value to the {@code features} field. */ + public IOURing features(@NativeType("unsigned int") int value) { nfeatures(address(), value); return this; } + /** Sets the specified value to the {@code enter_ring_fd} field. */ + public IOURing enter_ring_fd(int value) { nenter_ring_fd(address(), value); return this; } + /** Sets the specified value to the {@code int_flags} field. */ + public IOURing int_flags(@NativeType("__u8") byte value) { nint_flags(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURing set( + IOURingSQ sq, + IOURingCQ cq, + int flags, + int ring_fd, + int features, + int enter_ring_fd, + byte int_flags + ) { + sq(sq); + cq(cq); + flags(flags); + ring_fd(ring_fd); + features(features); + enter_ring_fd(enter_ring_fd); + int_flags(int_flags); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURing set(IOURing src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURing} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURing malloc() { + return new IOURing(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURing} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURing calloc() { + return new IOURing(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURing} instance allocated with {@link BufferUtils}. */ + public static IOURing create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURing(memAddress(container), container); + } + + /** Returns a new {@code IOURing} instance for the specified memory address. */ + public static IOURing create(long address) { + return new IOURing(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURing createSafe(long address) { + return address == NULL ? null : new IOURing(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURing} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURing malloc(MemoryStack stack) { + return new IOURing(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURing} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURing calloc(MemoryStack stack) { + return new IOURing(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #sq}. */ + public static IOURingSQ nsq(long struct) { return IOURingSQ.create(struct + IOURing.SQ); } + /** Unsafe version of {@link #cq}. */ + public static IOURingCQ ncq(long struct) { return IOURingCQ.create(struct + IOURing.CQ); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + IOURing.FLAGS); } + /** Unsafe version of {@link #ring_fd}. */ + public static int nring_fd(long struct) { return UNSAFE.getInt(null, struct + IOURing.RING_FD); } + /** Unsafe version of {@link #features}. */ + public static int nfeatures(long struct) { return UNSAFE.getInt(null, struct + IOURing.FEATURES); } + /** Unsafe version of {@link #enter_ring_fd}. */ + public static int nenter_ring_fd(long struct) { return UNSAFE.getInt(null, struct + IOURing.ENTER_RING_FD); } + /** Unsafe version of {@link #int_flags}. */ + public static byte nint_flags(long struct) { return UNSAFE.getByte(null, struct + IOURing.INT_FLAGS); } + public static ByteBuffer npad(long struct) { return memByteBuffer(struct + IOURing.PAD, 3); } + public static byte npad(long struct, int index) { + return UNSAFE.getByte(null, struct + IOURing.PAD + check(index, 3) * 1); + } + public static int npad2(long struct) { return UNSAFE.getInt(null, struct + IOURing.PAD2); } + + /** Unsafe version of {@link #sq(IOURingSQ) sq}. */ + public static void nsq(long struct, IOURingSQ value) { memCopy(value.address(), struct + IOURing.SQ, IOURingSQ.SIZEOF); } + /** Unsafe version of {@link #cq(IOURingCQ) cq}. */ + public static void ncq(long struct, IOURingCQ value) { memCopy(value.address(), struct + IOURing.CQ, IOURingCQ.SIZEOF); } + /** Unsafe version of {@link #flags(int) flags}. */ + public static void nflags(long struct, int value) { UNSAFE.putInt(null, struct + IOURing.FLAGS, value); } + /** Unsafe version of {@link #ring_fd(int) ring_fd}. */ + public static void nring_fd(long struct, int value) { UNSAFE.putInt(null, struct + IOURing.RING_FD, value); } + /** Unsafe version of {@link #features(int) features}. */ + public static void nfeatures(long struct, int value) { UNSAFE.putInt(null, struct + IOURing.FEATURES, value); } + /** Unsafe version of {@link #enter_ring_fd(int) enter_ring_fd}. */ + public static void nenter_ring_fd(long struct, int value) { UNSAFE.putInt(null, struct + IOURing.ENTER_RING_FD, value); } + /** Unsafe version of {@link #int_flags(byte) int_flags}. */ + public static void nint_flags(long struct, byte value) { UNSAFE.putByte(null, struct + IOURing.INT_FLAGS, value); } + public static void npad(long struct, ByteBuffer value) { + if (CHECKS) { checkGT(value, 3); } + memCopy(memAddress(value), struct + IOURing.PAD, value.remaining() * 1); + } + public static void npad(long struct, int index, byte value) { + UNSAFE.putByte(null, struct + IOURing.PAD + check(index, 3) * 1, value); + } + public static void npad2(long struct, int value) { UNSAFE.putInt(null, struct + IOURing.PAD2, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + IOURingSQ.validate(struct + IOURing.SQ); + IOURingCQ.validate(struct + IOURing.CQ); + } + + // ----------------------------------- + + /** An array of {@link IOURing} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURing ELEMENT_FACTORY = IOURing.create(-1L); + + /** + * Creates a new {@code IOURing.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURing#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURing getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link IOURingSQ} view of the {@code sq} field. */ + @NativeType("struct io_uring_sq") + public IOURingSQ sq() { return IOURing.nsq(address()); } + /** @return a {@link IOURingCQ} view of the {@code cq} field. */ + @NativeType("struct io_uring_cq") + public IOURingCQ cq() { return IOURing.ncq(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("unsigned int") + public int flags() { return IOURing.nflags(address()); } + /** @return the value of the {@code ring_fd} field. */ + public int ring_fd() { return IOURing.nring_fd(address()); } + /** @return the value of the {@code features} field. */ + @NativeType("unsigned int") + public int features() { return IOURing.nfeatures(address()); } + /** @return the value of the {@code enter_ring_fd} field. */ + public int enter_ring_fd() { return IOURing.nenter_ring_fd(address()); } + /** @return the value of the {@code int_flags} field. */ + @NativeType("__u8") + public byte int_flags() { return IOURing.nint_flags(address()); } + + /** Copies the specified {@link IOURingSQ} to the {@code sq} field. */ + public Buffer sq(@NativeType("struct io_uring_sq") IOURingSQ value) { IOURing.nsq(address(), value); return this; } + /** Passes the {@code sq} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer sq(java.util.function.Consumer consumer) { consumer.accept(sq()); return this; } + /** Copies the specified {@link IOURingCQ} to the {@code cq} field. */ + public Buffer cq(@NativeType("struct io_uring_cq") IOURingCQ value) { IOURing.ncq(address(), value); return this; } + /** Passes the {@code cq} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer cq(java.util.function.Consumer consumer) { consumer.accept(cq()); return this; } + /** Sets the specified value to the {@code flags} field. */ + public Buffer flags(@NativeType("unsigned int") int value) { IOURing.nflags(address(), value); return this; } + /** Sets the specified value to the {@code ring_fd} field. */ + public Buffer ring_fd(int value) { IOURing.nring_fd(address(), value); return this; } + /** Sets the specified value to the {@code features} field. */ + public Buffer features(@NativeType("unsigned int") int value) { IOURing.nfeatures(address(), value); return this; } + /** Sets the specified value to the {@code enter_ring_fd} field. */ + public Buffer enter_ring_fd(int value) { IOURing.nenter_ring_fd(address(), value); return this; } + /** Sets the specified value to the {@code int_flags} field. */ + public Buffer int_flags(@NativeType("__u8") byte value) { IOURing.nint_flags(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBuf.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBuf.java new file mode 100644 index 000000000..e0e7c58dd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBuf.java @@ -0,0 +1,326 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_buf {
    + *     __u64 addr;
    + *     __u32 len;
    + *     __u16 bid;
    + *     __u16 resv;
    + * }
    + */ +@NativeType("struct io_uring_buf") +public class IOURingBuf extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ADDR, + LEN, + BID, + RESV; + + static { + Layout layout = __struct( + __member(8), + __member(4), + __member(2), + __member(2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + ADDR = layout.offsetof(0); + LEN = layout.offsetof(1); + BID = layout.offsetof(2); + RESV = layout.offsetof(3); + } + + protected IOURingBuf(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingBuf create(long address, @Nullable ByteBuffer container) { + return new IOURingBuf(address, container); + } + + /** + * Creates a {@code IOURingBuf} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingBuf(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code addr} field. */ + @NativeType("__u64") + public long addr() { return naddr(address()); } + /** @return the value of the {@code len} field. */ + @NativeType("__u32") + public int len() { return nlen(address()); } + /** @return the value of the {@code bid} field. */ + @NativeType("__u16") + public short bid() { return nbid(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u16") + public short resv() { return nresv(address()); } + + /** Sets the specified value to the {@code addr} field. */ + public IOURingBuf addr(@NativeType("__u64") long value) { naddr(address(), value); return this; } + /** Sets the specified value to the {@code len} field. */ + public IOURingBuf len(@NativeType("__u32") int value) { nlen(address(), value); return this; } + /** Sets the specified value to the {@code bid} field. */ + public IOURingBuf bid(@NativeType("__u16") short value) { nbid(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public IOURingBuf resv(@NativeType("__u16") short value) { nresv(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingBuf set( + long addr, + int len, + short bid, + short resv + ) { + addr(addr); + len(len); + bid(bid); + resv(resv); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingBuf set(IOURingBuf src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingBuf} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingBuf malloc() { + return new IOURingBuf(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingBuf} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingBuf calloc() { + return new IOURingBuf(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingBuf} instance allocated with {@link BufferUtils}. */ + public static IOURingBuf create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingBuf(memAddress(container), container); + } + + /** Returns a new {@code IOURingBuf} instance for the specified memory address. */ + public static IOURingBuf create(long address) { + return new IOURingBuf(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingBuf createSafe(long address) { + return address == NULL ? null : new IOURingBuf(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingBuf} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingBuf malloc(MemoryStack stack) { + return new IOURingBuf(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingBuf} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingBuf calloc(MemoryStack stack) { + return new IOURingBuf(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #addr}. */ + public static long naddr(long struct) { return UNSAFE.getLong(null, struct + IOURingBuf.ADDR); } + /** Unsafe version of {@link #len}. */ + public static int nlen(long struct) { return UNSAFE.getInt(null, struct + IOURingBuf.LEN); } + /** Unsafe version of {@link #bid}. */ + public static short nbid(long struct) { return UNSAFE.getShort(null, struct + IOURingBuf.BID); } + /** Unsafe version of {@link #resv}. */ + public static short nresv(long struct) { return UNSAFE.getShort(null, struct + IOURingBuf.RESV); } + + /** Unsafe version of {@link #addr(long) addr}. */ + public static void naddr(long struct, long value) { UNSAFE.putLong(null, struct + IOURingBuf.ADDR, value); } + /** Unsafe version of {@link #len(int) len}. */ + public static void nlen(long struct, int value) { UNSAFE.putInt(null, struct + IOURingBuf.LEN, value); } + /** Unsafe version of {@link #bid(short) bid}. */ + public static void nbid(long struct, short value) { UNSAFE.putShort(null, struct + IOURingBuf.BID, value); } + /** Unsafe version of {@link #resv(short) resv}. */ + public static void nresv(long struct, short value) { UNSAFE.putShort(null, struct + IOURingBuf.RESV, value); } + + // ----------------------------------- + + /** An array of {@link IOURingBuf} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingBuf ELEMENT_FACTORY = IOURingBuf.create(-1L); + + /** + * Creates a new {@code IOURingBuf.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingBuf#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingBuf getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code addr} field. */ + @NativeType("__u64") + public long addr() { return IOURingBuf.naddr(address()); } + /** @return the value of the {@code len} field. */ + @NativeType("__u32") + public int len() { return IOURingBuf.nlen(address()); } + /** @return the value of the {@code bid} field. */ + @NativeType("__u16") + public short bid() { return IOURingBuf.nbid(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u16") + public short resv() { return IOURingBuf.nresv(address()); } + + /** Sets the specified value to the {@code addr} field. */ + public Buffer addr(@NativeType("__u64") long value) { IOURingBuf.naddr(address(), value); return this; } + /** Sets the specified value to the {@code len} field. */ + public Buffer len(@NativeType("__u32") int value) { IOURingBuf.nlen(address(), value); return this; } + /** Sets the specified value to the {@code bid} field. */ + public Buffer bid(@NativeType("__u16") short value) { IOURingBuf.nbid(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public Buffer resv(@NativeType("__u16") short value) { IOURingBuf.nresv(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBufReg.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBufReg.java new file mode 100644 index 000000000..9d70a5fa4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBufReg.java @@ -0,0 +1,370 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Argument for {@code IORING_(UN)REGISTER_PBUF_RING}. + * + *

    Layout

    + * + *
    
    + * struct io_uring_buf_reg {
    + *     __u64 ring_addr;
    + *     __u32 ring_entries;
    + *     __u16 bgid;
    + *     __u16 flags;
    + *     __u64 resv[3];
    + * }
    + */ +@NativeType("struct io_uring_buf_reg") +public class IOURingBufReg extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + RING_ADDR, + RING_ENTRIES, + BGID, + FLAGS, + RESV; + + static { + Layout layout = __struct( + __member(8), + __member(4), + __member(2), + __member(2), + __array(8, 3) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + RING_ADDR = layout.offsetof(0); + RING_ENTRIES = layout.offsetof(1); + BGID = layout.offsetof(2); + FLAGS = layout.offsetof(3); + RESV = layout.offsetof(4); + } + + protected IOURingBufReg(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingBufReg create(long address, @Nullable ByteBuffer container) { + return new IOURingBufReg(address, container); + } + + /** + * Creates a {@code IOURingBufReg} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingBufReg(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code ring_addr} field. */ + @NativeType("__u64") + public long ring_addr() { return nring_addr(address()); } + /** @return the value of the {@code ring_entries} field. */ + @NativeType("__u32") + public int ring_entries() { return nring_entries(address()); } + /** @return the value of the {@code bgid} field. */ + @NativeType("__u16") + public short bgid() { return nbgid(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u16") + public short flags() { return nflags(address()); } + /** @return a {@link LongBuffer} view of the {@code resv} field. */ + @NativeType("__u64[3]") + public LongBuffer resv() { return nresv(address()); } + /** @return the value at the specified index of the {@code resv} field. */ + @NativeType("__u64") + public long resv(int index) { return nresv(address(), index); } + + /** Sets the specified value to the {@code ring_addr} field. */ + public IOURingBufReg ring_addr(@NativeType("__u64") long value) { nring_addr(address(), value); return this; } + /** Sets the specified value to the {@code ring_entries} field. */ + public IOURingBufReg ring_entries(@NativeType("__u32") int value) { nring_entries(address(), value); return this; } + /** Sets the specified value to the {@code bgid} field. */ + public IOURingBufReg bgid(@NativeType("__u16") short value) { nbgid(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public IOURingBufReg flags(@NativeType("__u16") short value) { nflags(address(), value); return this; } + /** Copies the specified {@link LongBuffer} to the {@code resv} field. */ + public IOURingBufReg resv(@NativeType("__u64[3]") LongBuffer value) { nresv(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code resv} field. */ + public IOURingBufReg resv(int index, @NativeType("__u64") long value) { nresv(address(), index, value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingBufReg set( + long ring_addr, + int ring_entries, + short bgid, + short flags, + LongBuffer resv + ) { + ring_addr(ring_addr); + ring_entries(ring_entries); + bgid(bgid); + flags(flags); + resv(resv); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingBufReg set(IOURingBufReg src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingBufReg} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingBufReg malloc() { + return new IOURingBufReg(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingBufReg} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingBufReg calloc() { + return new IOURingBufReg(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingBufReg} instance allocated with {@link BufferUtils}. */ + public static IOURingBufReg create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingBufReg(memAddress(container), container); + } + + /** Returns a new {@code IOURingBufReg} instance for the specified memory address. */ + public static IOURingBufReg create(long address) { + return new IOURingBufReg(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingBufReg createSafe(long address) { + return address == NULL ? null : new IOURingBufReg(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingBufReg} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingBufReg malloc(MemoryStack stack) { + return new IOURingBufReg(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingBufReg} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingBufReg calloc(MemoryStack stack) { + return new IOURingBufReg(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #ring_addr}. */ + public static long nring_addr(long struct) { return UNSAFE.getLong(null, struct + IOURingBufReg.RING_ADDR); } + /** Unsafe version of {@link #ring_entries}. */ + public static int nring_entries(long struct) { return UNSAFE.getInt(null, struct + IOURingBufReg.RING_ENTRIES); } + /** Unsafe version of {@link #bgid}. */ + public static short nbgid(long struct) { return UNSAFE.getShort(null, struct + IOURingBufReg.BGID); } + /** Unsafe version of {@link #flags}. */ + public static short nflags(long struct) { return UNSAFE.getShort(null, struct + IOURingBufReg.FLAGS); } + /** Unsafe version of {@link #resv}. */ + public static LongBuffer nresv(long struct) { return memLongBuffer(struct + IOURingBufReg.RESV, 3); } + /** Unsafe version of {@link #resv(int) resv}. */ + public static long nresv(long struct, int index) { + return UNSAFE.getLong(null, struct + IOURingBufReg.RESV + check(index, 3) * 8); + } + + /** Unsafe version of {@link #ring_addr(long) ring_addr}. */ + public static void nring_addr(long struct, long value) { UNSAFE.putLong(null, struct + IOURingBufReg.RING_ADDR, value); } + /** Unsafe version of {@link #ring_entries(int) ring_entries}. */ + public static void nring_entries(long struct, int value) { UNSAFE.putInt(null, struct + IOURingBufReg.RING_ENTRIES, value); } + /** Unsafe version of {@link #bgid(short) bgid}. */ + public static void nbgid(long struct, short value) { UNSAFE.putShort(null, struct + IOURingBufReg.BGID, value); } + /** Unsafe version of {@link #flags(short) flags}. */ + public static void nflags(long struct, short value) { UNSAFE.putShort(null, struct + IOURingBufReg.FLAGS, value); } + /** Unsafe version of {@link #resv(LongBuffer) resv}. */ + public static void nresv(long struct, LongBuffer value) { + if (CHECKS) { checkGT(value, 3); } + memCopy(memAddress(value), struct + IOURingBufReg.RESV, value.remaining() * 8); + } + /** Unsafe version of {@link #resv(int, long) resv}. */ + public static void nresv(long struct, int index, long value) { + UNSAFE.putLong(null, struct + IOURingBufReg.RESV + check(index, 3) * 8, value); + } + + // ----------------------------------- + + /** An array of {@link IOURingBufReg} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingBufReg ELEMENT_FACTORY = IOURingBufReg.create(-1L); + + /** + * Creates a new {@code IOURingBufReg.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingBufReg#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingBufReg getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code ring_addr} field. */ + @NativeType("__u64") + public long ring_addr() { return IOURingBufReg.nring_addr(address()); } + /** @return the value of the {@code ring_entries} field. */ + @NativeType("__u32") + public int ring_entries() { return IOURingBufReg.nring_entries(address()); } + /** @return the value of the {@code bgid} field. */ + @NativeType("__u16") + public short bgid() { return IOURingBufReg.nbgid(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u16") + public short flags() { return IOURingBufReg.nflags(address()); } + /** @return a {@link LongBuffer} view of the {@code resv} field. */ + @NativeType("__u64[3]") + public LongBuffer resv() { return IOURingBufReg.nresv(address()); } + /** @return the value at the specified index of the {@code resv} field. */ + @NativeType("__u64") + public long resv(int index) { return IOURingBufReg.nresv(address(), index); } + + /** Sets the specified value to the {@code ring_addr} field. */ + public Buffer ring_addr(@NativeType("__u64") long value) { IOURingBufReg.nring_addr(address(), value); return this; } + /** Sets the specified value to the {@code ring_entries} field. */ + public Buffer ring_entries(@NativeType("__u32") int value) { IOURingBufReg.nring_entries(address(), value); return this; } + /** Sets the specified value to the {@code bgid} field. */ + public Buffer bgid(@NativeType("__u16") short value) { IOURingBufReg.nbgid(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public Buffer flags(@NativeType("__u16") short value) { IOURingBufReg.nflags(address(), value); return this; } + /** Copies the specified {@link LongBuffer} to the {@code resv} field. */ + public Buffer resv(@NativeType("__u64[3]") LongBuffer value) { IOURingBufReg.nresv(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code resv} field. */ + public Buffer resv(int index, @NativeType("__u64") long value) { IOURingBufReg.nresv(address(), index, value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBufRing.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBufRing.java new file mode 100644 index 000000000..72b90c02e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingBufRing.java @@ -0,0 +1,367 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_buf_ring {
    + *     union {
    + *         struct {
    + *             __u64 resv1;
    + *             __u32 resv2;
    + *             __u16 resv3;
    + *             __u16 tail;
    + *         };
    + *         {@link IOURingBuf struct io_uring_buf} bufs[0];
    + *     };
    + * }
    + */ +@NativeType("struct io_uring_buf_ring") +public class IOURingBufRing extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + RESV1, + RESV2, + RESV3, + TAIL, + BUFS; + + static { + Layout layout = __struct( + __union( + __struct( + __member(8), + __member(4), + __member(2), + __member(2) + ), + __array(IOURingBuf.SIZEOF, IOURingBuf.ALIGNOF, 0) + ) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + RESV1 = layout.offsetof(2); + RESV2 = layout.offsetof(3); + RESV3 = layout.offsetof(4); + TAIL = layout.offsetof(5); + BUFS = layout.offsetof(6); + } + + protected IOURingBufRing(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingBufRing create(long address, @Nullable ByteBuffer container) { + return new IOURingBufRing(address, container); + } + + /** + * Creates a {@code IOURingBufRing} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingBufRing(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code resv1} field. */ + @NativeType("__u64") + public long resv1() { return nresv1(address()); } + /** @return the value of the {@code resv2} field. */ + @NativeType("__u32") + public int resv2() { return nresv2(address()); } + /** @return the value of the {@code resv3} field. */ + @NativeType("__u16") + public short resv3() { return nresv3(address()); } + /** @return the value of the {@code tail} field. */ + @NativeType("__u16") + public short tail() { return ntail(address()); } + /** @return a {@link IOURingBuf}.Buffer view of the {@code bufs} field. */ + @NativeType("struct io_uring_buf[0]") + public IOURingBuf.Buffer bufs() { return nbufs(address()); } + /** @return a {@link IOURingBuf} view of the struct at the specified index of the {@code bufs} field. */ + @NativeType("struct io_uring_buf") + public IOURingBuf bufs(int index) { return nbufs(address(), index); } + + /** Sets the specified value to the {@code resv1} field. */ + public IOURingBufRing resv1(@NativeType("__u64") long value) { nresv1(address(), value); return this; } + /** Sets the specified value to the {@code resv2} field. */ + public IOURingBufRing resv2(@NativeType("__u32") int value) { nresv2(address(), value); return this; } + /** Sets the specified value to the {@code resv3} field. */ + public IOURingBufRing resv3(@NativeType("__u16") short value) { nresv3(address(), value); return this; } + /** Sets the specified value to the {@code tail} field. */ + public IOURingBufRing tail(@NativeType("__u16") short value) { ntail(address(), value); return this; } + /** Copies the specified {@link IOURingBuf.Buffer} to the {@code bufs} field. */ + public IOURingBufRing bufs(@NativeType("struct io_uring_buf[0]") IOURingBuf.Buffer value) { nbufs(address(), value); return this; } + /** Copies the specified {@link IOURingBuf} at the specified index of the {@code bufs} field. */ + public IOURingBufRing bufs(int index, @NativeType("struct io_uring_buf") IOURingBuf value) { nbufs(address(), index, value); return this; } + /** Passes the {@code bufs} field to the specified {@link java.util.function.Consumer Consumer}. */ + public IOURingBufRing bufs(java.util.function.Consumer consumer) { consumer.accept(bufs()); return this; } + /** Passes the element at {@code index} of the {@code bufs} field to the specified {@link java.util.function.Consumer Consumer}. */ + public IOURingBufRing bufs(int index, java.util.function.Consumer consumer) { consumer.accept(bufs(index)); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingBufRing set(IOURingBufRing src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingBufRing} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingBufRing malloc() { + return new IOURingBufRing(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingBufRing} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingBufRing calloc() { + return new IOURingBufRing(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingBufRing} instance allocated with {@link BufferUtils}. */ + public static IOURingBufRing create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingBufRing(memAddress(container), container); + } + + /** Returns a new {@code IOURingBufRing} instance for the specified memory address. */ + public static IOURingBufRing create(long address) { + return new IOURingBufRing(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingBufRing createSafe(long address) { + return address == NULL ? null : new IOURingBufRing(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingBufRing} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingBufRing malloc(MemoryStack stack) { + return new IOURingBufRing(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingBufRing} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingBufRing calloc(MemoryStack stack) { + return new IOURingBufRing(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #resv1}. */ + public static long nresv1(long struct) { return UNSAFE.getLong(null, struct + IOURingBufRing.RESV1); } + /** Unsafe version of {@link #resv2}. */ + public static int nresv2(long struct) { return UNSAFE.getInt(null, struct + IOURingBufRing.RESV2); } + /** Unsafe version of {@link #resv3}. */ + public static short nresv3(long struct) { return UNSAFE.getShort(null, struct + IOURingBufRing.RESV3); } + /** Unsafe version of {@link #tail}. */ + public static short ntail(long struct) { return UNSAFE.getShort(null, struct + IOURingBufRing.TAIL); } + /** Unsafe version of {@link #bufs}. */ + public static IOURingBuf.Buffer nbufs(long struct) { return IOURingBuf.create(struct + IOURingBufRing.BUFS, 0); } + /** Unsafe version of {@link #bufs(int) bufs}. */ + public static IOURingBuf nbufs(long struct, int index) { + return IOURingBuf.create(struct + IOURingBufRing.BUFS + check(index, 0) * IOURingBuf.SIZEOF); + } + + /** Unsafe version of {@link #resv1(long) resv1}. */ + public static void nresv1(long struct, long value) { UNSAFE.putLong(null, struct + IOURingBufRing.RESV1, value); } + /** Unsafe version of {@link #resv2(int) resv2}. */ + public static void nresv2(long struct, int value) { UNSAFE.putInt(null, struct + IOURingBufRing.RESV2, value); } + /** Unsafe version of {@link #resv3(short) resv3}. */ + public static void nresv3(long struct, short value) { UNSAFE.putShort(null, struct + IOURingBufRing.RESV3, value); } + /** Unsafe version of {@link #tail(short) tail}. */ + public static void ntail(long struct, short value) { UNSAFE.putShort(null, struct + IOURingBufRing.TAIL, value); } + /** Unsafe version of {@link #bufs(IOURingBuf.Buffer) bufs}. */ + public static void nbufs(long struct, IOURingBuf.Buffer value) { + if (CHECKS) { checkGT(value, 0); } + memCopy(value.address(), struct + IOURingBufRing.BUFS, value.remaining() * IOURingBuf.SIZEOF); + } + /** Unsafe version of {@link #bufs(int, IOURingBuf) bufs}. */ + public static void nbufs(long struct, int index, IOURingBuf value) { + memCopy(value.address(), struct + IOURingBufRing.BUFS + check(index, 0) * IOURingBuf.SIZEOF, IOURingBuf.SIZEOF); + } + + // ----------------------------------- + + /** An array of {@link IOURingBufRing} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingBufRing ELEMENT_FACTORY = IOURingBufRing.create(-1L); + + /** + * Creates a new {@code IOURingBufRing.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingBufRing#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingBufRing getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code resv1} field. */ + @NativeType("__u64") + public long resv1() { return IOURingBufRing.nresv1(address()); } + /** @return the value of the {@code resv2} field. */ + @NativeType("__u32") + public int resv2() { return IOURingBufRing.nresv2(address()); } + /** @return the value of the {@code resv3} field. */ + @NativeType("__u16") + public short resv3() { return IOURingBufRing.nresv3(address()); } + /** @return the value of the {@code tail} field. */ + @NativeType("__u16") + public short tail() { return IOURingBufRing.ntail(address()); } + /** @return a {@link IOURingBuf}.Buffer view of the {@code bufs} field. */ + @NativeType("struct io_uring_buf[0]") + public IOURingBuf.Buffer bufs() { return IOURingBufRing.nbufs(address()); } + /** @return a {@link IOURingBuf} view of the struct at the specified index of the {@code bufs} field. */ + @NativeType("struct io_uring_buf") + public IOURingBuf bufs(int index) { return IOURingBufRing.nbufs(address(), index); } + + /** Sets the specified value to the {@code resv1} field. */ + public Buffer resv1(@NativeType("__u64") long value) { IOURingBufRing.nresv1(address(), value); return this; } + /** Sets the specified value to the {@code resv2} field. */ + public Buffer resv2(@NativeType("__u32") int value) { IOURingBufRing.nresv2(address(), value); return this; } + /** Sets the specified value to the {@code resv3} field. */ + public Buffer resv3(@NativeType("__u16") short value) { IOURingBufRing.nresv3(address(), value); return this; } + /** Sets the specified value to the {@code tail} field. */ + public Buffer tail(@NativeType("__u16") short value) { IOURingBufRing.ntail(address(), value); return this; } + /** Copies the specified {@link IOURingBuf.Buffer} to the {@code bufs} field. */ + public Buffer bufs(@NativeType("struct io_uring_buf[0]") IOURingBuf.Buffer value) { IOURingBufRing.nbufs(address(), value); return this; } + /** Copies the specified {@link IOURingBuf} at the specified index of the {@code bufs} field. */ + public Buffer bufs(int index, @NativeType("struct io_uring_buf") IOURingBuf value) { IOURingBufRing.nbufs(address(), index, value); return this; } + /** Passes the {@code bufs} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer bufs(java.util.function.Consumer consumer) { consumer.accept(bufs()); return this; } + /** Passes the element at {@code index} of the {@code bufs} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer bufs(int index, java.util.function.Consumer consumer) { consumer.accept(bufs(index)); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingCQ.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingCQ.java new file mode 100644 index 000000000..1777330e2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingCQ.java @@ -0,0 +1,540 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_cq {
    + *     unsigned * khead;
    + *     unsigned * ktail;
    + *     unsigned * {@link #kring_mask};
    + *     unsigned * {@link #kring_entries};
    + *     unsigned * kflags;
    + *     unsigned * koverflow;
    + *     {@link IOURingCQE struct io_uring_cqe} * cqes;
    + *     size_t ring_sz;
    + *     void * ring_ptr;
    + *     unsigned ring_mask;
    + *     unsigned ring_entries;
    + *     unsigned int pad[2];
    + * }
    + */ +@NativeType("struct io_uring_cq") +public class IOURingCQ extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + KHEAD, + KTAIL, + KRING_MASK, + KRING_ENTRIES, + KFLAGS, + KOVERFLOW, + CQES, + RING_SZ, + RING_PTR, + RING_MASK, + RING_ENTRIES, + PAD; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(4), + __array(4, 2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + KHEAD = layout.offsetof(0); + KTAIL = layout.offsetof(1); + KRING_MASK = layout.offsetof(2); + KRING_ENTRIES = layout.offsetof(3); + KFLAGS = layout.offsetof(4); + KOVERFLOW = layout.offsetof(5); + CQES = layout.offsetof(6); + RING_SZ = layout.offsetof(7); + RING_PTR = layout.offsetof(8); + RING_MASK = layout.offsetof(9); + RING_ENTRIES = layout.offsetof(10); + PAD = layout.offsetof(11); + } + + protected IOURingCQ(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingCQ create(long address, @Nullable ByteBuffer container) { + return new IOURingCQ(address, container); + } + + /** + * Creates a {@code IOURingCQ} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingCQ(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code khead} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer khead(int capacity) { return nkhead(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code ktail} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer ktail(int capacity) { return nktail(address(), capacity); } + /** + * @param capacity the number of elements in the returned buffer + * + * @return Deprecated: use {@code ring_mask} instead of {@code *kring_mask} + */ + @NativeType("unsigned *") + public IntBuffer kring_mask(int capacity) { return nkring_mask(address(), capacity); } + /** + * @param capacity the number of elements in the returned buffer + * + * @return Deprecated: use {@code ring_entries} instead of {@code *kring_entries} + */ + @NativeType("unsigned *") + public IntBuffer kring_entries(int capacity) { return nkring_entries(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code kflags} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer kflags(int capacity) { return nkflags(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code koverflow} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer koverflow(int capacity) { return nkoverflow(address(), capacity); } + /** @return a {@link IOURingCQE} view of the struct pointed to by the {@code cqes} field. */ + @NativeType("struct io_uring_cqe *") + public IOURingCQE cqes() { return ncqes(address()); } + /** @return the value of the {@code ring_sz} field. */ + @NativeType("size_t") + public long ring_sz() { return nring_sz(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code ring_ptr} field. */ + @NativeType("void *") + public ByteBuffer ring_ptr() { return nring_ptr(address()); } + /** @return the value of the {@code ring_mask} field. */ + @NativeType("unsigned") + public int ring_mask() { return nring_mask(address()); } + /** @return the value of the {@code ring_entries} field. */ + @NativeType("unsigned") + public int ring_entries() { return nring_entries(address()); } + + /** Sets the address of the specified {@link IntBuffer} to the {@code khead} field. */ + public IOURingCQ khead(@NativeType("unsigned *") IntBuffer value) { nkhead(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code ktail} field. */ + public IOURingCQ ktail(@NativeType("unsigned *") IntBuffer value) { nktail(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@link #kring_mask} field. */ + public IOURingCQ kring_mask(@NativeType("unsigned *") IntBuffer value) { nkring_mask(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@link #kring_entries} field. */ + public IOURingCQ kring_entries(@NativeType("unsigned *") IntBuffer value) { nkring_entries(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code kflags} field. */ + public IOURingCQ kflags(@NativeType("unsigned *") IntBuffer value) { nkflags(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code koverflow} field. */ + public IOURingCQ koverflow(@NativeType("unsigned *") IntBuffer value) { nkoverflow(address(), value); return this; } + /** Sets the address of the specified {@link IOURingCQE} to the {@code cqes} field. */ + public IOURingCQ cqes(@NativeType("struct io_uring_cqe *") IOURingCQE value) { ncqes(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code ring_ptr} field. */ + public IOURingCQ ring_ptr(@NativeType("void *") ByteBuffer value) { nring_ptr(address(), value); return this; } + /** Sets the specified value to the {@code ring_mask} field. */ + public IOURingCQ ring_mask(@NativeType("unsigned") int value) { nring_mask(address(), value); return this; } + /** Sets the specified value to the {@code ring_entries} field. */ + public IOURingCQ ring_entries(@NativeType("unsigned") int value) { nring_entries(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingCQ set( + IntBuffer khead, + IntBuffer ktail, + IntBuffer kring_mask, + IntBuffer kring_entries, + IntBuffer kflags, + IntBuffer koverflow, + IOURingCQE cqes, + ByteBuffer ring_ptr, + int ring_mask, + int ring_entries + ) { + khead(khead); + ktail(ktail); + kring_mask(kring_mask); + kring_entries(kring_entries); + kflags(kflags); + koverflow(koverflow); + cqes(cqes); + ring_ptr(ring_ptr); + ring_mask(ring_mask); + ring_entries(ring_entries); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingCQ set(IOURingCQ src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingCQ} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingCQ malloc() { + return new IOURingCQ(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingCQ} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingCQ calloc() { + return new IOURingCQ(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingCQ} instance allocated with {@link BufferUtils}. */ + public static IOURingCQ create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingCQ(memAddress(container), container); + } + + /** Returns a new {@code IOURingCQ} instance for the specified memory address. */ + public static IOURingCQ create(long address) { + return new IOURingCQ(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingCQ createSafe(long address) { + return address == NULL ? null : new IOURingCQ(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingCQ} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingCQ malloc(MemoryStack stack) { + return new IOURingCQ(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingCQ} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingCQ calloc(MemoryStack stack) { + return new IOURingCQ(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #khead(int) khead}. */ + public static IntBuffer nkhead(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingCQ.KHEAD), capacity); } + /** Unsafe version of {@link #ktail(int) ktail}. */ + public static IntBuffer nktail(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingCQ.KTAIL), capacity); } + /** Unsafe version of {@link #kring_mask(int) kring_mask}. */ + public static IntBuffer nkring_mask(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingCQ.KRING_MASK), capacity); } + /** Unsafe version of {@link #kring_entries(int) kring_entries}. */ + public static IntBuffer nkring_entries(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingCQ.KRING_ENTRIES), capacity); } + /** Unsafe version of {@link #kflags(int) kflags}. */ + public static IntBuffer nkflags(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingCQ.KFLAGS), capacity); } + /** Unsafe version of {@link #koverflow(int) koverflow}. */ + public static IntBuffer nkoverflow(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingCQ.KOVERFLOW), capacity); } + /** Unsafe version of {@link #cqes}. */ + public static IOURingCQE ncqes(long struct) { return IOURingCQE.create(memGetAddress(struct + IOURingCQ.CQES)); } + /** Unsafe version of {@link #ring_sz}. */ + public static long nring_sz(long struct) { return memGetAddress(struct + IOURingCQ.RING_SZ); } + /** Unsafe version of {@link #ring_ptr() ring_ptr}. */ + public static ByteBuffer nring_ptr(long struct) { return memByteBuffer(memGetAddress(struct + IOURingCQ.RING_PTR), (int)nring_sz(struct)); } + /** Unsafe version of {@link #ring_mask}. */ + public static int nring_mask(long struct) { return UNSAFE.getInt(null, struct + IOURingCQ.RING_MASK); } + /** Unsafe version of {@link #ring_entries}. */ + public static int nring_entries(long struct) { return UNSAFE.getInt(null, struct + IOURingCQ.RING_ENTRIES); } + public static IntBuffer npad(long struct) { return memIntBuffer(struct + IOURingCQ.PAD, 2); } + public static int npad(long struct, int index) { + return UNSAFE.getInt(null, struct + IOURingCQ.PAD + check(index, 2) * 4); + } + + /** Unsafe version of {@link #khead(IntBuffer) khead}. */ + public static void nkhead(long struct, IntBuffer value) { memPutAddress(struct + IOURingCQ.KHEAD, memAddress(value)); } + /** Unsafe version of {@link #ktail(IntBuffer) ktail}. */ + public static void nktail(long struct, IntBuffer value) { memPutAddress(struct + IOURingCQ.KTAIL, memAddress(value)); } + /** Unsafe version of {@link #kring_mask(IntBuffer) kring_mask}. */ + public static void nkring_mask(long struct, IntBuffer value) { memPutAddress(struct + IOURingCQ.KRING_MASK, memAddress(value)); } + /** Unsafe version of {@link #kring_entries(IntBuffer) kring_entries}. */ + public static void nkring_entries(long struct, IntBuffer value) { memPutAddress(struct + IOURingCQ.KRING_ENTRIES, memAddress(value)); } + /** Unsafe version of {@link #kflags(IntBuffer) kflags}. */ + public static void nkflags(long struct, IntBuffer value) { memPutAddress(struct + IOURingCQ.KFLAGS, memAddress(value)); } + /** Unsafe version of {@link #koverflow(IntBuffer) koverflow}. */ + public static void nkoverflow(long struct, IntBuffer value) { memPutAddress(struct + IOURingCQ.KOVERFLOW, memAddress(value)); } + /** Unsafe version of {@link #cqes(IOURingCQE) cqes}. */ + public static void ncqes(long struct, IOURingCQE value) { memPutAddress(struct + IOURingCQ.CQES, value.address()); } + /** Sets the specified value to the {@code ring_sz} field of the specified {@code struct}. */ + public static void nring_sz(long struct, long value) { memPutAddress(struct + IOURingCQ.RING_SZ, value); } + /** Unsafe version of {@link #ring_ptr(ByteBuffer) ring_ptr}. */ + public static void nring_ptr(long struct, ByteBuffer value) { memPutAddress(struct + IOURingCQ.RING_PTR, memAddress(value)); nring_sz(struct, value.remaining()); } + /** Unsafe version of {@link #ring_mask(int) ring_mask}. */ + public static void nring_mask(long struct, int value) { UNSAFE.putInt(null, struct + IOURingCQ.RING_MASK, value); } + /** Unsafe version of {@link #ring_entries(int) ring_entries}. */ + public static void nring_entries(long struct, int value) { UNSAFE.putInt(null, struct + IOURingCQ.RING_ENTRIES, value); } + public static void npad(long struct, IntBuffer value) { + if (CHECKS) { checkGT(value, 2); } + memCopy(memAddress(value), struct + IOURingCQ.PAD, value.remaining() * 4); + } + public static void npad(long struct, int index, int value) { + UNSAFE.putInt(null, struct + IOURingCQ.PAD + check(index, 2) * 4, value); + } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + IOURingCQ.KHEAD)); + check(memGetAddress(struct + IOURingCQ.KTAIL)); + check(memGetAddress(struct + IOURingCQ.KRING_MASK)); + check(memGetAddress(struct + IOURingCQ.KRING_ENTRIES)); + check(memGetAddress(struct + IOURingCQ.KFLAGS)); + check(memGetAddress(struct + IOURingCQ.KOVERFLOW)); + check(memGetAddress(struct + IOURingCQ.CQES)); + check(memGetAddress(struct + IOURingCQ.RING_PTR)); + } + + // ----------------------------------- + + /** An array of {@link IOURingCQ} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingCQ ELEMENT_FACTORY = IOURingCQ.create(-1L); + + /** + * Creates a new {@code IOURingCQ.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingCQ#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingCQ getElementFactory() { + return ELEMENT_FACTORY; + } + + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code khead} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer khead(int capacity) { return IOURingCQ.nkhead(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code ktail} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer ktail(int capacity) { return IOURingCQ.nktail(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@link IOURingCQ#kring_mask} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer kring_mask(int capacity) { return IOURingCQ.nkring_mask(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@link IOURingCQ#kring_entries} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer kring_entries(int capacity) { return IOURingCQ.nkring_entries(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code kflags} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer kflags(int capacity) { return IOURingCQ.nkflags(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code koverflow} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer koverflow(int capacity) { return IOURingCQ.nkoverflow(address(), capacity); } + /** @return a {@link IOURingCQE} view of the struct pointed to by the {@code cqes} field. */ + @NativeType("struct io_uring_cqe *") + public IOURingCQE cqes() { return IOURingCQ.ncqes(address()); } + /** @return the value of the {@code ring_sz} field. */ + @NativeType("size_t") + public long ring_sz() { return IOURingCQ.nring_sz(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code ring_ptr} field. */ + @NativeType("void *") + public ByteBuffer ring_ptr() { return IOURingCQ.nring_ptr(address()); } + /** @return the value of the {@code ring_mask} field. */ + @NativeType("unsigned") + public int ring_mask() { return IOURingCQ.nring_mask(address()); } + /** @return the value of the {@code ring_entries} field. */ + @NativeType("unsigned") + public int ring_entries() { return IOURingCQ.nring_entries(address()); } + + /** Sets the address of the specified {@link IntBuffer} to the {@code khead} field. */ + public Buffer khead(@NativeType("unsigned *") IntBuffer value) { IOURingCQ.nkhead(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code ktail} field. */ + public Buffer ktail(@NativeType("unsigned *") IntBuffer value) { IOURingCQ.nktail(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@link IOURingCQ#kring_mask} field. */ + public Buffer kring_mask(@NativeType("unsigned *") IntBuffer value) { IOURingCQ.nkring_mask(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@link IOURingCQ#kring_entries} field. */ + public Buffer kring_entries(@NativeType("unsigned *") IntBuffer value) { IOURingCQ.nkring_entries(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code kflags} field. */ + public Buffer kflags(@NativeType("unsigned *") IntBuffer value) { IOURingCQ.nkflags(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code koverflow} field. */ + public Buffer koverflow(@NativeType("unsigned *") IntBuffer value) { IOURingCQ.nkoverflow(address(), value); return this; } + /** Sets the address of the specified {@link IOURingCQE} to the {@code cqes} field. */ + public Buffer cqes(@NativeType("struct io_uring_cqe *") IOURingCQE value) { IOURingCQ.ncqes(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code ring_ptr} field. */ + public Buffer ring_ptr(@NativeType("void *") ByteBuffer value) { IOURingCQ.nring_ptr(address(), value); return this; } + /** Sets the specified value to the {@code ring_mask} field. */ + public Buffer ring_mask(@NativeType("unsigned") int value) { IOURingCQ.nring_mask(address(), value); return this; } + /** Sets the specified value to the {@code ring_entries} field. */ + public Buffer ring_entries(@NativeType("unsigned") int value) { IOURingCQ.nring_entries(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingCQE.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingCQE.java new file mode 100644 index 000000000..3cc08fb8a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingCQE.java @@ -0,0 +1,361 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * IO completion data structure (Completion Queue Entry). + * + *

    Layout

    + * + *
    
    + * struct io_uring_cqe {
    + *     __u64 {@link #user_data};
    + *     __s32 {@link #res};
    + *     __u32 {@link #flags};
    + *     __u64 {@link #big_cqe}[0];
    + * }
    + */ +@NativeType("struct io_uring_cqe") +public class IOURingCQE extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + USER_DATA, + RES, + FLAGS, + BIG_CQE; + + static { + Layout layout = __struct( + __member(8), + __member(4), + __member(4), + __array(8, 0) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + USER_DATA = layout.offsetof(0); + RES = layout.offsetof(1); + FLAGS = layout.offsetof(2); + BIG_CQE = layout.offsetof(3); + } + + protected IOURingCQE(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingCQE create(long address, @Nullable ByteBuffer container) { + return new IOURingCQE(address, container); + } + + /** + * Creates a {@code IOURingCQE} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingCQE(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** + * is copied from the field of the same name in the submission queue entry. + * + *

    The primary use case is to store data that the application will need to access upon completion of this particular I/O.

    + */ + @NativeType("__u64") + public long user_data() { return nuser_data(address()); } + /** + * is the operation-specific result, but {@code io_uring}-specific errors (e.g. {@code flags} or {@code opcode} invalid) are returned through this field. + * + *

    For read and write {@code opcodes}, the return values match {@code errno} values documented in the {@code preadv2(2)} and {@code pwritev2(2)} man + * pages, with {@code res} holding the equivalent of {@code -errno} for error cases, or the transferred number of bytes in case the operation is + * successful. Hence both error and success return can be found in that field in the CQE. For other request types, the return values are documented in the + * matching man page for that type, or in the {@code opcodes} section for {@code io_uring}-specific {@code opcodes}.

    + */ + @NativeType("__s32") + public int res() { return nres(address()); } + /** is used for certain commands, like {@link LibIOURing#IORING_OP_POLL_ADD OP_POLL_ADD} or in conjunction with {@link LibIOURing#IOSQE_BUFFER_SELECT}, see those entries */ + @NativeType("__u32") + public int flags() { return nflags(address()); } + /** If the ring is initialized with {@link LibIOURing#IORING_SETUP_CQE32 SETUP_CQE32}, then this field contains 16-bytes of padding, doubling the size of the CQE. */ + @NativeType("__u64[0]") + public LongBuffer big_cqe() { return nbig_cqe(address()); } + /** If the ring is initialized with {@link LibIOURing#IORING_SETUP_CQE32 SETUP_CQE32}, then this field contains 16-bytes of padding, doubling the size of the CQE. */ + @NativeType("__u64") + public long big_cqe(int index) { return nbig_cqe(address(), index); } + + /** Sets the specified value to the {@link #user_data} field. */ + public IOURingCQE user_data(@NativeType("__u64") long value) { nuser_data(address(), value); return this; } + /** Sets the specified value to the {@link #res} field. */ + public IOURingCQE res(@NativeType("__s32") int value) { nres(address(), value); return this; } + /** Sets the specified value to the {@link #flags} field. */ + public IOURingCQE flags(@NativeType("__u32") int value) { nflags(address(), value); return this; } + /** Copies the specified {@link LongBuffer} to the {@link #big_cqe} field. */ + public IOURingCQE big_cqe(@NativeType("__u64[0]") LongBuffer value) { nbig_cqe(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link #big_cqe} field. */ + public IOURingCQE big_cqe(int index, @NativeType("__u64") long value) { nbig_cqe(address(), index, value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingCQE set( + long user_data, + int res, + int flags, + LongBuffer big_cqe + ) { + user_data(user_data); + res(res); + flags(flags); + big_cqe(big_cqe); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingCQE set(IOURingCQE src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingCQE} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingCQE malloc() { + return new IOURingCQE(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingCQE} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingCQE calloc() { + return new IOURingCQE(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingCQE} instance allocated with {@link BufferUtils}. */ + public static IOURingCQE create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingCQE(memAddress(container), container); + } + + /** Returns a new {@code IOURingCQE} instance for the specified memory address. */ + public static IOURingCQE create(long address) { + return new IOURingCQE(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingCQE createSafe(long address) { + return address == NULL ? null : new IOURingCQE(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingCQE} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingCQE malloc(MemoryStack stack) { + return new IOURingCQE(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingCQE} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingCQE calloc(MemoryStack stack) { + return new IOURingCQE(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #user_data}. */ + public static long nuser_data(long struct) { return UNSAFE.getLong(null, struct + IOURingCQE.USER_DATA); } + /** Unsafe version of {@link #res}. */ + public static int nres(long struct) { return UNSAFE.getInt(null, struct + IOURingCQE.RES); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + IOURingCQE.FLAGS); } + /** Unsafe version of {@link #big_cqe}. */ + public static LongBuffer nbig_cqe(long struct) { return memLongBuffer(struct + IOURingCQE.BIG_CQE, 0); } + /** Unsafe version of {@link #big_cqe(int) big_cqe}. */ + public static long nbig_cqe(long struct, int index) { + return UNSAFE.getLong(null, struct + IOURingCQE.BIG_CQE + check(index, 0) * 8); + } + + /** Unsafe version of {@link #user_data(long) user_data}. */ + public static void nuser_data(long struct, long value) { UNSAFE.putLong(null, struct + IOURingCQE.USER_DATA, value); } + /** Unsafe version of {@link #res(int) res}. */ + public static void nres(long struct, int value) { UNSAFE.putInt(null, struct + IOURingCQE.RES, value); } + /** Unsafe version of {@link #flags(int) flags}. */ + public static void nflags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingCQE.FLAGS, value); } + /** Unsafe version of {@link #big_cqe(LongBuffer) big_cqe}. */ + public static void nbig_cqe(long struct, LongBuffer value) { + if (CHECKS) { checkGT(value, 0); } + memCopy(memAddress(value), struct + IOURingCQE.BIG_CQE, value.remaining() * 8); + } + /** Unsafe version of {@link #big_cqe(int, long) big_cqe}. */ + public static void nbig_cqe(long struct, int index, long value) { + UNSAFE.putLong(null, struct + IOURingCQE.BIG_CQE + check(index, 0) * 8, value); + } + + // ----------------------------------- + + /** An array of {@link IOURingCQE} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingCQE ELEMENT_FACTORY = IOURingCQE.create(-1L); + + /** + * Creates a new {@code IOURingCQE.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingCQE#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingCQE getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link IOURingCQE#user_data} field. */ + @NativeType("__u64") + public long user_data() { return IOURingCQE.nuser_data(address()); } + /** @return the value of the {@link IOURingCQE#res} field. */ + @NativeType("__s32") + public int res() { return IOURingCQE.nres(address()); } + /** @return the value of the {@link IOURingCQE#flags} field. */ + @NativeType("__u32") + public int flags() { return IOURingCQE.nflags(address()); } + /** @return a {@link LongBuffer} view of the {@link IOURingCQE#big_cqe} field. */ + @NativeType("__u64[0]") + public LongBuffer big_cqe() { return IOURingCQE.nbig_cqe(address()); } + /** @return the value at the specified index of the {@link IOURingCQE#big_cqe} field. */ + @NativeType("__u64") + public long big_cqe(int index) { return IOURingCQE.nbig_cqe(address(), index); } + + /** Sets the specified value to the {@link IOURingCQE#user_data} field. */ + public Buffer user_data(@NativeType("__u64") long value) { IOURingCQE.nuser_data(address(), value); return this; } + /** Sets the specified value to the {@link IOURingCQE#res} field. */ + public Buffer res(@NativeType("__s32") int value) { IOURingCQE.nres(address(), value); return this; } + /** Sets the specified value to the {@link IOURingCQE#flags} field. */ + public Buffer flags(@NativeType("__u32") int value) { IOURingCQE.nflags(address(), value); return this; } + /** Copies the specified {@link LongBuffer} to the {@link IOURingCQE#big_cqe} field. */ + public Buffer big_cqe(@NativeType("__u64[0]") LongBuffer value) { IOURingCQE.nbig_cqe(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link IOURingCQE#big_cqe} field. */ + public Buffer big_cqe(int index, @NativeType("__u64") long value) { IOURingCQE.nbig_cqe(address(), index, value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingFileIndexRange.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingFileIndexRange.java new file mode 100644 index 000000000..83b179abe --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingFileIndexRange.java @@ -0,0 +1,310 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Argument for {@link LibIOURing#IORING_REGISTER_FILE_ALLOC_RANGE REGISTER_FILE_ALLOC_RANGE}. + * + *

    The range is specified as {@code [off, off + len)}.

    + * + *

    Layout

    + * + *
    
    + * struct io_uring_file_index_range {
    + *     __u32 off;
    + *     __u32 len;
    + *     __u64 resv;
    + * }
    + */ +@NativeType("struct io_uring_file_index_range") +public class IOURingFileIndexRange extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + OFF, + LEN, + RESV; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(8) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + OFF = layout.offsetof(0); + LEN = layout.offsetof(1); + RESV = layout.offsetof(2); + } + + protected IOURingFileIndexRange(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingFileIndexRange create(long address, @Nullable ByteBuffer container) { + return new IOURingFileIndexRange(address, container); + } + + /** + * Creates a {@code IOURingFileIndexRange} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingFileIndexRange(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code off} field. */ + @NativeType("__u32") + public int off() { return noff(address()); } + /** @return the value of the {@code len} field. */ + @NativeType("__u32") + public int len() { return nlen(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u64") + public long resv() { return nresv(address()); } + + /** Sets the specified value to the {@code off} field. */ + public IOURingFileIndexRange off(@NativeType("__u32") int value) { noff(address(), value); return this; } + /** Sets the specified value to the {@code len} field. */ + public IOURingFileIndexRange len(@NativeType("__u32") int value) { nlen(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public IOURingFileIndexRange resv(@NativeType("__u64") long value) { nresv(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingFileIndexRange set( + int off, + int len, + long resv + ) { + off(off); + len(len); + resv(resv); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingFileIndexRange set(IOURingFileIndexRange src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingFileIndexRange} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingFileIndexRange malloc() { + return new IOURingFileIndexRange(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingFileIndexRange} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingFileIndexRange calloc() { + return new IOURingFileIndexRange(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingFileIndexRange} instance allocated with {@link BufferUtils}. */ + public static IOURingFileIndexRange create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingFileIndexRange(memAddress(container), container); + } + + /** Returns a new {@code IOURingFileIndexRange} instance for the specified memory address. */ + public static IOURingFileIndexRange create(long address) { + return new IOURingFileIndexRange(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingFileIndexRange createSafe(long address) { + return address == NULL ? null : new IOURingFileIndexRange(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingFileIndexRange} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingFileIndexRange malloc(MemoryStack stack) { + return new IOURingFileIndexRange(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingFileIndexRange} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingFileIndexRange calloc(MemoryStack stack) { + return new IOURingFileIndexRange(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #off}. */ + public static int noff(long struct) { return UNSAFE.getInt(null, struct + IOURingFileIndexRange.OFF); } + /** Unsafe version of {@link #len}. */ + public static int nlen(long struct) { return UNSAFE.getInt(null, struct + IOURingFileIndexRange.LEN); } + /** Unsafe version of {@link #resv}. */ + public static long nresv(long struct) { return UNSAFE.getLong(null, struct + IOURingFileIndexRange.RESV); } + + /** Unsafe version of {@link #off(int) off}. */ + public static void noff(long struct, int value) { UNSAFE.putInt(null, struct + IOURingFileIndexRange.OFF, value); } + /** Unsafe version of {@link #len(int) len}. */ + public static void nlen(long struct, int value) { UNSAFE.putInt(null, struct + IOURingFileIndexRange.LEN, value); } + /** Unsafe version of {@link #resv(long) resv}. */ + public static void nresv(long struct, long value) { UNSAFE.putLong(null, struct + IOURingFileIndexRange.RESV, value); } + + // ----------------------------------- + + /** An array of {@link IOURingFileIndexRange} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingFileIndexRange ELEMENT_FACTORY = IOURingFileIndexRange.create(-1L); + + /** + * Creates a new {@code IOURingFileIndexRange.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingFileIndexRange#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingFileIndexRange getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code off} field. */ + @NativeType("__u32") + public int off() { return IOURingFileIndexRange.noff(address()); } + /** @return the value of the {@code len} field. */ + @NativeType("__u32") + public int len() { return IOURingFileIndexRange.nlen(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u64") + public long resv() { return IOURingFileIndexRange.nresv(address()); } + + /** Sets the specified value to the {@code off} field. */ + public Buffer off(@NativeType("__u32") int value) { IOURingFileIndexRange.noff(address(), value); return this; } + /** Sets the specified value to the {@code len} field. */ + public Buffer len(@NativeType("__u32") int value) { IOURingFileIndexRange.nlen(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public Buffer resv(@NativeType("__u64") long value) { IOURingFileIndexRange.nresv(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingGeteventsArg.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingGeteventsArg.java new file mode 100644 index 000000000..54f8e88c8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingGeteventsArg.java @@ -0,0 +1,326 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_getevents_arg {
    + *     __u64 sigmask;
    + *     __u32 sigmask_sz;
    + *     __u32 pad;
    + *     __u64 ts;
    + * }
    + */ +@NativeType("struct io_uring_getevents_arg") +public class IOURingGeteventsArg extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + SIGMASK, + SIGMASK_SZ, + PAD, + TS; + + static { + Layout layout = __struct( + __member(8), + __member(4), + __member(4), + __member(8) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + SIGMASK = layout.offsetof(0); + SIGMASK_SZ = layout.offsetof(1); + PAD = layout.offsetof(2); + TS = layout.offsetof(3); + } + + protected IOURingGeteventsArg(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingGeteventsArg create(long address, @Nullable ByteBuffer container) { + return new IOURingGeteventsArg(address, container); + } + + /** + * Creates a {@code IOURingGeteventsArg} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingGeteventsArg(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code sigmask} field. */ + @NativeType("__u64") + public long sigmask() { return nsigmask(address()); } + /** @return the value of the {@code sigmask_sz} field. */ + @NativeType("__u32") + public int sigmask_sz() { return nsigmask_sz(address()); } + /** @return the value of the {@code pad} field. */ + @NativeType("__u32") + public int pad() { return npad(address()); } + /** @return the value of the {@code ts} field. */ + @NativeType("__u64") + public long ts() { return nts(address()); } + + /** Sets the specified value to the {@code sigmask} field. */ + public IOURingGeteventsArg sigmask(@NativeType("__u64") long value) { nsigmask(address(), value); return this; } + /** Sets the specified value to the {@code sigmask_sz} field. */ + public IOURingGeteventsArg sigmask_sz(@NativeType("__u32") int value) { nsigmask_sz(address(), value); return this; } + /** Sets the specified value to the {@code pad} field. */ + public IOURingGeteventsArg pad(@NativeType("__u32") int value) { npad(address(), value); return this; } + /** Sets the specified value to the {@code ts} field. */ + public IOURingGeteventsArg ts(@NativeType("__u64") long value) { nts(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingGeteventsArg set( + long sigmask, + int sigmask_sz, + int pad, + long ts + ) { + sigmask(sigmask); + sigmask_sz(sigmask_sz); + pad(pad); + ts(ts); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingGeteventsArg set(IOURingGeteventsArg src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingGeteventsArg} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingGeteventsArg malloc() { + return new IOURingGeteventsArg(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingGeteventsArg} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingGeteventsArg calloc() { + return new IOURingGeteventsArg(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingGeteventsArg} instance allocated with {@link BufferUtils}. */ + public static IOURingGeteventsArg create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingGeteventsArg(memAddress(container), container); + } + + /** Returns a new {@code IOURingGeteventsArg} instance for the specified memory address. */ + public static IOURingGeteventsArg create(long address) { + return new IOURingGeteventsArg(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingGeteventsArg createSafe(long address) { + return address == NULL ? null : new IOURingGeteventsArg(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingGeteventsArg} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingGeteventsArg malloc(MemoryStack stack) { + return new IOURingGeteventsArg(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingGeteventsArg} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingGeteventsArg calloc(MemoryStack stack) { + return new IOURingGeteventsArg(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #sigmask}. */ + public static long nsigmask(long struct) { return UNSAFE.getLong(null, struct + IOURingGeteventsArg.SIGMASK); } + /** Unsafe version of {@link #sigmask_sz}. */ + public static int nsigmask_sz(long struct) { return UNSAFE.getInt(null, struct + IOURingGeteventsArg.SIGMASK_SZ); } + /** Unsafe version of {@link #pad}. */ + public static int npad(long struct) { return UNSAFE.getInt(null, struct + IOURingGeteventsArg.PAD); } + /** Unsafe version of {@link #ts}. */ + public static long nts(long struct) { return UNSAFE.getLong(null, struct + IOURingGeteventsArg.TS); } + + /** Unsafe version of {@link #sigmask(long) sigmask}. */ + public static void nsigmask(long struct, long value) { UNSAFE.putLong(null, struct + IOURingGeteventsArg.SIGMASK, value); } + /** Unsafe version of {@link #sigmask_sz(int) sigmask_sz}. */ + public static void nsigmask_sz(long struct, int value) { UNSAFE.putInt(null, struct + IOURingGeteventsArg.SIGMASK_SZ, value); } + /** Unsafe version of {@link #pad(int) pad}. */ + public static void npad(long struct, int value) { UNSAFE.putInt(null, struct + IOURingGeteventsArg.PAD, value); } + /** Unsafe version of {@link #ts(long) ts}. */ + public static void nts(long struct, long value) { UNSAFE.putLong(null, struct + IOURingGeteventsArg.TS, value); } + + // ----------------------------------- + + /** An array of {@link IOURingGeteventsArg} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingGeteventsArg ELEMENT_FACTORY = IOURingGeteventsArg.create(-1L); + + /** + * Creates a new {@code IOURingGeteventsArg.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingGeteventsArg#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingGeteventsArg getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code sigmask} field. */ + @NativeType("__u64") + public long sigmask() { return IOURingGeteventsArg.nsigmask(address()); } + /** @return the value of the {@code sigmask_sz} field. */ + @NativeType("__u32") + public int sigmask_sz() { return IOURingGeteventsArg.nsigmask_sz(address()); } + /** @return the value of the {@code pad} field. */ + @NativeType("__u32") + public int pad() { return IOURingGeteventsArg.npad(address()); } + /** @return the value of the {@code ts} field. */ + @NativeType("__u64") + public long ts() { return IOURingGeteventsArg.nts(address()); } + + /** Sets the specified value to the {@code sigmask} field. */ + public Buffer sigmask(@NativeType("__u64") long value) { IOURingGeteventsArg.nsigmask(address(), value); return this; } + /** Sets the specified value to the {@code sigmask_sz} field. */ + public Buffer sigmask_sz(@NativeType("__u32") int value) { IOURingGeteventsArg.nsigmask_sz(address(), value); return this; } + /** Sets the specified value to the {@code pad} field. */ + public Buffer pad(@NativeType("__u32") int value) { IOURingGeteventsArg.npad(address(), value); return this; } + /** Sets the specified value to the {@code ts} field. */ + public Buffer ts(@NativeType("__u64") long value) { IOURingGeteventsArg.nts(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingParams.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingParams.java new file mode 100644 index 000000000..002e64449 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingParams.java @@ -0,0 +1,528 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Passed in for {@link LibURing#io_uring_setup setup}. Copied back with updated info on success. + * + *

    The {@code flags}, {@code sq_thread_cpu}, and {@code sq_thread_idle} fields are used to configure the {@code io_uring} instance. If no {@code flags} + * are specified, the {@code io_uring} instance is setup for interrupt driven I/O. I/O may be submitted using {@link LibURing#io_uring_enter enter} and can be reaped by polling the + * completion queue.

    + * + *

    The rest of the fields are filled in by the kernel, and provide the information necessary to memory map the submission queue, completion queue, and the + * array of submission queue entries.

    + * + *

    {@code sq_off} describes the offsets of various ring buffer fields. Taken together, {@code sq_entries} and {@code sq_off} provide all of the + * information necessary for accessing the submission queue ring buffer and the submission queue entry array. The submission queue can be mapped with a + * call like:

    + * + *
    
    + * ptr = mmap(0, sq_off.array + sq_entries * sizeof(__u32),
    + *            PROT_READ|PROT_WRITE, MAP_SHARED|MAP_POPULATE,
    + *            ring_fd, IORING_OFF_SQ_RING);
    + * + *

    where {@code sq_off} is the {@code io_sqring_offsets} structure, and {@code ring_fd} is the file descriptor returned from {@link LibURing#io_uring_setup setup}. The addition of + * {@code sq_off.array} to the length of the region accounts for the fact that the ring located at the end of the data structure. As an example, the ring + * buffer head pointer can be accessed by adding {@code sq_off.head} to the address returned from {@code mmap(2)}:

    + * + *
    
    + * head = ptr + sq_off.head;
    + * + *

    The array of submission queue entries is mapped with:

    + * + *
    
    + * sqentries = mmap(0, sq_entries * sizeof(struct io_uring_sqe),
    + *                  PROT_READ|PROT_WRITE, MAP_SHARED|MAP_POPULATE,
    + *                  ring_fd, IORING_OFF_SQES);
    + * + *

    The completion queue is described by {@code cq_entries} and {@code cq_off}. The completion queue is simpler, since the entries are not separated from + * the queue itself, and can be mapped with:

    + * + *
    
    + * ptr = mmap(0, cq_off.cqes + cq_entries * sizeof(struct io_uring_cqe),        
    + *            PROT_READ|PROT_WRITE, MAP_SHARED|MAP_POPULATE, ring_fd,
    + *            IORING_OFF_CQ_RING);
    + * + *

    Layout

    + * + *
    
    + * struct io_uring_params {
    + *     __u32 {@link #sq_entries};
    + *     __u32 cq_entries;
    + *     __u32 {@link #flags};
    + *     __u32 sq_thread_cpu;
    + *     __u32 sq_thread_idle;
    + *     __u32 {@link #features};
    + *     __u32 wq_fd;
    + *     __u32 resv[3];
    + *     {@link IOSQRingOffsets struct io_sqring_offsets} {@link #sq_off};
    + *     {@link IOCQRingOffsets struct io_cqring_offsets} cq_off;
    + * }
    + */ +@NativeType("struct io_uring_params") +public class IOURingParams extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + SQ_ENTRIES, + CQ_ENTRIES, + FLAGS, + SQ_THREAD_CPU, + SQ_THREAD_IDLE, + FEATURES, + WQ_FD, + RESV, + SQ_OFF, + CQ_OFF; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __array(4, 3), + __member(IOSQRingOffsets.SIZEOF, IOSQRingOffsets.ALIGNOF), + __member(IOCQRingOffsets.SIZEOF, IOCQRingOffsets.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + SQ_ENTRIES = layout.offsetof(0); + CQ_ENTRIES = layout.offsetof(1); + FLAGS = layout.offsetof(2); + SQ_THREAD_CPU = layout.offsetof(3); + SQ_THREAD_IDLE = layout.offsetof(4); + FEATURES = layout.offsetof(5); + WQ_FD = layout.offsetof(6); + RESV = layout.offsetof(7); + SQ_OFF = layout.offsetof(8); + CQ_OFF = layout.offsetof(9); + } + + protected IOURingParams(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingParams create(long address, @Nullable ByteBuffer container) { + return new IOURingParams(address, container); + } + + /** + * Creates a {@code IOURingParams} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingParams(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the number of submission queue entries allocated */ + @NativeType("__u32") + public int sq_entries() { return nsq_entries(address()); } + /** @return the value of the {@code cq_entries} field. */ + @NativeType("__u32") + public int cq_entries() { return ncq_entries(address()); } + /** one or more of:
    {@link LibIOURing#IORING_SETUP_IOPOLL SETUP_IOPOLL}{@link LibIOURing#IORING_SETUP_SQPOLL SETUP_SQPOLL}{@link LibIOURing#IORING_SETUP_SQ_AFF SETUP_SQ_AFF}{@link LibIOURing#IORING_SETUP_CQSIZE SETUP_CQSIZE}{@link LibIOURing#IORING_SETUP_CLAMP SETUP_CLAMP}
    {@link LibIOURing#IORING_SETUP_ATTACH_WQ SETUP_ATTACH_WQ}{@link LibIOURing#IORING_SETUP_R_DISABLED SETUP_R_DISABLED}{@link LibIOURing#IORING_SETUP_SUBMIT_ALL SETUP_SUBMIT_ALL}{@link LibIOURing#IORING_SETUP_COOP_TASKRUN SETUP_COOP_TASKRUN}{@link LibIOURing#IORING_SETUP_TASKRUN_FLAG SETUP_TASKRUN_FLAG}
    {@link LibIOURing#IORING_SETUP_SQE128 SETUP_SQE128}{@link LibIOURing#IORING_SETUP_CQE32 SETUP_CQE32}{@link LibIOURing#IORING_SETUP_SINGLE_ISSUER SETUP_SINGLE_ISSUER}{@link LibIOURing#IORING_SETUP_DEFER_TASKRUN SETUP_DEFER_TASKRUN}
    */ + @NativeType("__u32") + public int flags() { return nflags(address()); } + /** @return the value of the {@code sq_thread_cpu} field. */ + @NativeType("__u32") + public int sq_thread_cpu() { return nsq_thread_cpu(address()); } + /** @return the value of the {@code sq_thread_idle} field. */ + @NativeType("__u32") + public int sq_thread_idle() { return nsq_thread_idle(address()); } + /** filled in by the kernel, which specifies various features supported by current kernel version. One or more of:
    {@link LibIOURing#IORING_FEAT_SINGLE_MMAP FEAT_SINGLE_MMAP}{@link LibIOURing#IORING_FEAT_NODROP FEAT_NODROP}{@link LibIOURing#IORING_FEAT_SUBMIT_STABLE FEAT_SUBMIT_STABLE}{@link LibIOURing#IORING_FEAT_RW_CUR_POS FEAT_RW_CUR_POS}{@link LibIOURing#IORING_FEAT_CUR_PERSONALITY FEAT_CUR_PERSONALITY}
    {@link LibIOURing#IORING_FEAT_FAST_POLL FEAT_FAST_POLL}{@link LibIOURing#IORING_FEAT_POLL_32BITS FEAT_POLL_32BITS}{@link LibIOURing#IORING_FEAT_SQPOLL_NONFIXED FEAT_SQPOLL_NONFIXED}{@link LibIOURing#IORING_FEAT_EXT_ARG FEAT_EXT_ARG}{@link LibIOURing#IORING_FEAT_NATIVE_WORKERS FEAT_NATIVE_WORKERS}
    {@link LibIOURing#IORING_FEAT_RSRC_TAGS FEAT_RSRC_TAGS}{@link LibIOURing#IORING_FEAT_CQE_SKIP FEAT_CQE_SKIP}{@link LibIOURing#IORING_FEAT_LINKED_FILE FEAT_LINKED_FILE}{@link LibIOURing#IORING_FEAT_REG_REG_RING FEAT_REG_REG_RING}
    */ + @NativeType("__u32") + public int features() { return nfeatures(address()); } + /** @return the value of the {@code wq_fd} field. */ + @NativeType("__u32") + public int wq_fd() { return nwq_fd(address()); } + /** @return a {@link IntBuffer} view of the {@code resv} field. */ + @NativeType("__u32[3]") + public IntBuffer resv() { return nresv(address()); } + /** @return the value at the specified index of the {@code resv} field. */ + @NativeType("__u32") + public int resv(int index) { return nresv(address(), index); } + /** + * The {@code flags} field is used by the kernel to communicate state information to the application. Currently, it is used to inform the application when + * a call to {@link LibURing#io_uring_enter enter} is necessary. + * + *

    The {@code dropped} member is incremented for each invalid submission queue entry encountered in the ring buffer.

    + * + *

    The {@code head} and {@code tail} track the ring buffer state. The {@code tail} is incremented by the application when submitting new I/O, and the + * {@code head} is incremented by the kernel when the I/O has been successfully submitted. Determining the index of the {@code head} or {@code tail} into + * the ring is accomplished by applying a mask:

    + * + *
    
    +     * index = tail & ring_mask;
    + */ + @NativeType("struct io_sqring_offsets") + public IOSQRingOffsets sq_off() { return nsq_off(address()); } + /** @return a {@link IOCQRingOffsets} view of the {@code cq_off} field. */ + @NativeType("struct io_cqring_offsets") + public IOCQRingOffsets cq_off() { return ncq_off(address()); } + + /** Sets the specified value to the {@link #sq_entries} field. */ + public IOURingParams sq_entries(@NativeType("__u32") int value) { nsq_entries(address(), value); return this; } + /** Sets the specified value to the {@code cq_entries} field. */ + public IOURingParams cq_entries(@NativeType("__u32") int value) { ncq_entries(address(), value); return this; } + /** Sets the specified value to the {@link #flags} field. */ + public IOURingParams flags(@NativeType("__u32") int value) { nflags(address(), value); return this; } + /** Sets the specified value to the {@code sq_thread_cpu} field. */ + public IOURingParams sq_thread_cpu(@NativeType("__u32") int value) { nsq_thread_cpu(address(), value); return this; } + /** Sets the specified value to the {@code sq_thread_idle} field. */ + public IOURingParams sq_thread_idle(@NativeType("__u32") int value) { nsq_thread_idle(address(), value); return this; } + /** Sets the specified value to the {@link #features} field. */ + public IOURingParams features(@NativeType("__u32") int value) { nfeatures(address(), value); return this; } + /** Sets the specified value to the {@code wq_fd} field. */ + public IOURingParams wq_fd(@NativeType("__u32") int value) { nwq_fd(address(), value); return this; } + /** Copies the specified {@link IntBuffer} to the {@code resv} field. */ + public IOURingParams resv(@NativeType("__u32[3]") IntBuffer value) { nresv(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code resv} field. */ + public IOURingParams resv(int index, @NativeType("__u32") int value) { nresv(address(), index, value); return this; } + /** Copies the specified {@link IOSQRingOffsets} to the {@link #sq_off} field. */ + public IOURingParams sq_off(@NativeType("struct io_sqring_offsets") IOSQRingOffsets value) { nsq_off(address(), value); return this; } + /** Passes the {@link #sq_off} field to the specified {@link java.util.function.Consumer Consumer}. */ + public IOURingParams sq_off(java.util.function.Consumer consumer) { consumer.accept(sq_off()); return this; } + /** Copies the specified {@link IOCQRingOffsets} to the {@code cq_off} field. */ + public IOURingParams cq_off(@NativeType("struct io_cqring_offsets") IOCQRingOffsets value) { ncq_off(address(), value); return this; } + /** Passes the {@code cq_off} field to the specified {@link java.util.function.Consumer Consumer}. */ + public IOURingParams cq_off(java.util.function.Consumer consumer) { consumer.accept(cq_off()); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingParams set( + int sq_entries, + int cq_entries, + int flags, + int sq_thread_cpu, + int sq_thread_idle, + int features, + int wq_fd, + IntBuffer resv, + IOSQRingOffsets sq_off, + IOCQRingOffsets cq_off + ) { + sq_entries(sq_entries); + cq_entries(cq_entries); + flags(flags); + sq_thread_cpu(sq_thread_cpu); + sq_thread_idle(sq_thread_idle); + features(features); + wq_fd(wq_fd); + resv(resv); + sq_off(sq_off); + cq_off(cq_off); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingParams set(IOURingParams src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingParams} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingParams malloc() { + return new IOURingParams(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingParams} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingParams calloc() { + return new IOURingParams(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingParams} instance allocated with {@link BufferUtils}. */ + public static IOURingParams create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingParams(memAddress(container), container); + } + + /** Returns a new {@code IOURingParams} instance for the specified memory address. */ + public static IOURingParams create(long address) { + return new IOURingParams(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingParams createSafe(long address) { + return address == NULL ? null : new IOURingParams(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingParams} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingParams malloc(MemoryStack stack) { + return new IOURingParams(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingParams} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingParams calloc(MemoryStack stack) { + return new IOURingParams(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #sq_entries}. */ + public static int nsq_entries(long struct) { return UNSAFE.getInt(null, struct + IOURingParams.SQ_ENTRIES); } + /** Unsafe version of {@link #cq_entries}. */ + public static int ncq_entries(long struct) { return UNSAFE.getInt(null, struct + IOURingParams.CQ_ENTRIES); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + IOURingParams.FLAGS); } + /** Unsafe version of {@link #sq_thread_cpu}. */ + public static int nsq_thread_cpu(long struct) { return UNSAFE.getInt(null, struct + IOURingParams.SQ_THREAD_CPU); } + /** Unsafe version of {@link #sq_thread_idle}. */ + public static int nsq_thread_idle(long struct) { return UNSAFE.getInt(null, struct + IOURingParams.SQ_THREAD_IDLE); } + /** Unsafe version of {@link #features}. */ + public static int nfeatures(long struct) { return UNSAFE.getInt(null, struct + IOURingParams.FEATURES); } + /** Unsafe version of {@link #wq_fd}. */ + public static int nwq_fd(long struct) { return UNSAFE.getInt(null, struct + IOURingParams.WQ_FD); } + /** Unsafe version of {@link #resv}. */ + public static IntBuffer nresv(long struct) { return memIntBuffer(struct + IOURingParams.RESV, 3); } + /** Unsafe version of {@link #resv(int) resv}. */ + public static int nresv(long struct, int index) { + return UNSAFE.getInt(null, struct + IOURingParams.RESV + check(index, 3) * 4); + } + /** Unsafe version of {@link #sq_off}. */ + public static IOSQRingOffsets nsq_off(long struct) { return IOSQRingOffsets.create(struct + IOURingParams.SQ_OFF); } + /** Unsafe version of {@link #cq_off}. */ + public static IOCQRingOffsets ncq_off(long struct) { return IOCQRingOffsets.create(struct + IOURingParams.CQ_OFF); } + + /** Unsafe version of {@link #sq_entries(int) sq_entries}. */ + public static void nsq_entries(long struct, int value) { UNSAFE.putInt(null, struct + IOURingParams.SQ_ENTRIES, value); } + /** Unsafe version of {@link #cq_entries(int) cq_entries}. */ + public static void ncq_entries(long struct, int value) { UNSAFE.putInt(null, struct + IOURingParams.CQ_ENTRIES, value); } + /** Unsafe version of {@link #flags(int) flags}. */ + public static void nflags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingParams.FLAGS, value); } + /** Unsafe version of {@link #sq_thread_cpu(int) sq_thread_cpu}. */ + public static void nsq_thread_cpu(long struct, int value) { UNSAFE.putInt(null, struct + IOURingParams.SQ_THREAD_CPU, value); } + /** Unsafe version of {@link #sq_thread_idle(int) sq_thread_idle}. */ + public static void nsq_thread_idle(long struct, int value) { UNSAFE.putInt(null, struct + IOURingParams.SQ_THREAD_IDLE, value); } + /** Unsafe version of {@link #features(int) features}. */ + public static void nfeatures(long struct, int value) { UNSAFE.putInt(null, struct + IOURingParams.FEATURES, value); } + /** Unsafe version of {@link #wq_fd(int) wq_fd}. */ + public static void nwq_fd(long struct, int value) { UNSAFE.putInt(null, struct + IOURingParams.WQ_FD, value); } + /** Unsafe version of {@link #resv(IntBuffer) resv}. */ + public static void nresv(long struct, IntBuffer value) { + if (CHECKS) { checkGT(value, 3); } + memCopy(memAddress(value), struct + IOURingParams.RESV, value.remaining() * 4); + } + /** Unsafe version of {@link #resv(int, int) resv}. */ + public static void nresv(long struct, int index, int value) { + UNSAFE.putInt(null, struct + IOURingParams.RESV + check(index, 3) * 4, value); + } + /** Unsafe version of {@link #sq_off(IOSQRingOffsets) sq_off}. */ + public static void nsq_off(long struct, IOSQRingOffsets value) { memCopy(value.address(), struct + IOURingParams.SQ_OFF, IOSQRingOffsets.SIZEOF); } + /** Unsafe version of {@link #cq_off(IOCQRingOffsets) cq_off}. */ + public static void ncq_off(long struct, IOCQRingOffsets value) { memCopy(value.address(), struct + IOURingParams.CQ_OFF, IOCQRingOffsets.SIZEOF); } + + // ----------------------------------- + + /** An array of {@link IOURingParams} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingParams ELEMENT_FACTORY = IOURingParams.create(-1L); + + /** + * Creates a new {@code IOURingParams.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingParams#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingParams getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link IOURingParams#sq_entries} field. */ + @NativeType("__u32") + public int sq_entries() { return IOURingParams.nsq_entries(address()); } + /** @return the value of the {@code cq_entries} field. */ + @NativeType("__u32") + public int cq_entries() { return IOURingParams.ncq_entries(address()); } + /** @return the value of the {@link IOURingParams#flags} field. */ + @NativeType("__u32") + public int flags() { return IOURingParams.nflags(address()); } + /** @return the value of the {@code sq_thread_cpu} field. */ + @NativeType("__u32") + public int sq_thread_cpu() { return IOURingParams.nsq_thread_cpu(address()); } + /** @return the value of the {@code sq_thread_idle} field. */ + @NativeType("__u32") + public int sq_thread_idle() { return IOURingParams.nsq_thread_idle(address()); } + /** @return the value of the {@link IOURingParams#features} field. */ + @NativeType("__u32") + public int features() { return IOURingParams.nfeatures(address()); } + /** @return the value of the {@code wq_fd} field. */ + @NativeType("__u32") + public int wq_fd() { return IOURingParams.nwq_fd(address()); } + /** @return a {@link IntBuffer} view of the {@code resv} field. */ + @NativeType("__u32[3]") + public IntBuffer resv() { return IOURingParams.nresv(address()); } + /** @return the value at the specified index of the {@code resv} field. */ + @NativeType("__u32") + public int resv(int index) { return IOURingParams.nresv(address(), index); } + /** @return a {@link IOSQRingOffsets} view of the {@link IOURingParams#sq_off} field. */ + @NativeType("struct io_sqring_offsets") + public IOSQRingOffsets sq_off() { return IOURingParams.nsq_off(address()); } + /** @return a {@link IOCQRingOffsets} view of the {@code cq_off} field. */ + @NativeType("struct io_cqring_offsets") + public IOCQRingOffsets cq_off() { return IOURingParams.ncq_off(address()); } + + /** Sets the specified value to the {@link IOURingParams#sq_entries} field. */ + public Buffer sq_entries(@NativeType("__u32") int value) { IOURingParams.nsq_entries(address(), value); return this; } + /** Sets the specified value to the {@code cq_entries} field. */ + public Buffer cq_entries(@NativeType("__u32") int value) { IOURingParams.ncq_entries(address(), value); return this; } + /** Sets the specified value to the {@link IOURingParams#flags} field. */ + public Buffer flags(@NativeType("__u32") int value) { IOURingParams.nflags(address(), value); return this; } + /** Sets the specified value to the {@code sq_thread_cpu} field. */ + public Buffer sq_thread_cpu(@NativeType("__u32") int value) { IOURingParams.nsq_thread_cpu(address(), value); return this; } + /** Sets the specified value to the {@code sq_thread_idle} field. */ + public Buffer sq_thread_idle(@NativeType("__u32") int value) { IOURingParams.nsq_thread_idle(address(), value); return this; } + /** Sets the specified value to the {@link IOURingParams#features} field. */ + public Buffer features(@NativeType("__u32") int value) { IOURingParams.nfeatures(address(), value); return this; } + /** Sets the specified value to the {@code wq_fd} field. */ + public Buffer wq_fd(@NativeType("__u32") int value) { IOURingParams.nwq_fd(address(), value); return this; } + /** Copies the specified {@link IntBuffer} to the {@code resv} field. */ + public Buffer resv(@NativeType("__u32[3]") IntBuffer value) { IOURingParams.nresv(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code resv} field. */ + public Buffer resv(int index, @NativeType("__u32") int value) { IOURingParams.nresv(address(), index, value); return this; } + /** Copies the specified {@link IOSQRingOffsets} to the {@link IOURingParams#sq_off} field. */ + public Buffer sq_off(@NativeType("struct io_sqring_offsets") IOSQRingOffsets value) { IOURingParams.nsq_off(address(), value); return this; } + /** Passes the {@link IOURingParams#sq_off} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer sq_off(java.util.function.Consumer consumer) { consumer.accept(sq_off()); return this; } + /** Copies the specified {@link IOCQRingOffsets} to the {@code cq_off} field. */ + public Buffer cq_off(@NativeType("struct io_cqring_offsets") IOCQRingOffsets value) { IOURingParams.ncq_off(address(), value); return this; } + /** Passes the {@code cq_off} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer cq_off(java.util.function.Consumer consumer) { consumer.accept(cq_off()); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingProbe.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingProbe.java new file mode 100644 index 000000000..c7bd7f314 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingProbe.java @@ -0,0 +1,371 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_probe {
    + *     __u8 last_op;
    + *     __u8 ops_len;
    + *     __u16 resv;
    + *     __u32 resv2[3];
    + *     {@link IOURingProbeOp struct io_uring_probe_op} ops[0];
    + * }
    + */ +@NativeType("struct io_uring_probe") +public class IOURingProbe extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + LAST_OP, + OPS_LEN, + RESV, + RESV2, + OPS; + + static { + Layout layout = __struct( + __member(1), + __member(1), + __member(2), + __array(4, 3), + __array(IOURingProbeOp.SIZEOF, IOURingProbeOp.ALIGNOF, 0) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + LAST_OP = layout.offsetof(0); + OPS_LEN = layout.offsetof(1); + RESV = layout.offsetof(2); + RESV2 = layout.offsetof(3); + OPS = layout.offsetof(4); + } + + protected IOURingProbe(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingProbe create(long address, @Nullable ByteBuffer container) { + return new IOURingProbe(address, container); + } + + /** + * Creates a {@code IOURingProbe} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingProbe(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code last_op} field. */ + @NativeType("__u8") + public byte last_op() { return nlast_op(address()); } + /** @return the value of the {@code ops_len} field. */ + @NativeType("__u8") + public byte ops_len() { return nops_len(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u16") + public short resv() { return nresv(address()); } + /** @return a {@link IOURingProbeOp}.Buffer view of the {@code ops} field. */ + @NativeType("struct io_uring_probe_op[0]") + public IOURingProbeOp.Buffer ops() { return nops(address()); } + /** @return a {@link IOURingProbeOp} view of the struct at the specified index of the {@code ops} field. */ + @NativeType("struct io_uring_probe_op") + public IOURingProbeOp ops(int index) { return nops(address(), index); } + + /** Sets the specified value to the {@code last_op} field. */ + public IOURingProbe last_op(@NativeType("__u8") byte value) { nlast_op(address(), value); return this; } + /** Sets the specified value to the {@code ops_len} field. */ + public IOURingProbe ops_len(@NativeType("__u8") byte value) { nops_len(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public IOURingProbe resv(@NativeType("__u16") short value) { nresv(address(), value); return this; } + /** Copies the specified {@link IOURingProbeOp.Buffer} to the {@code ops} field. */ + public IOURingProbe ops(@NativeType("struct io_uring_probe_op[0]") IOURingProbeOp.Buffer value) { nops(address(), value); return this; } + /** Copies the specified {@link IOURingProbeOp} at the specified index of the {@code ops} field. */ + public IOURingProbe ops(int index, @NativeType("struct io_uring_probe_op") IOURingProbeOp value) { nops(address(), index, value); return this; } + /** Passes the {@code ops} field to the specified {@link java.util.function.Consumer Consumer}. */ + public IOURingProbe ops(java.util.function.Consumer consumer) { consumer.accept(ops()); return this; } + /** Passes the element at {@code index} of the {@code ops} field to the specified {@link java.util.function.Consumer Consumer}. */ + public IOURingProbe ops(int index, java.util.function.Consumer consumer) { consumer.accept(ops(index)); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingProbe set( + byte last_op, + byte ops_len, + short resv, + IOURingProbeOp.Buffer ops + ) { + last_op(last_op); + ops_len(ops_len); + resv(resv); + ops(ops); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingProbe set(IOURingProbe src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingProbe} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingProbe malloc() { + return new IOURingProbe(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingProbe} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingProbe calloc() { + return new IOURingProbe(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingProbe} instance allocated with {@link BufferUtils}. */ + public static IOURingProbe create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingProbe(memAddress(container), container); + } + + /** Returns a new {@code IOURingProbe} instance for the specified memory address. */ + public static IOURingProbe create(long address) { + return new IOURingProbe(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingProbe createSafe(long address) { + return address == NULL ? null : new IOURingProbe(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingProbe} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingProbe malloc(MemoryStack stack) { + return new IOURingProbe(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingProbe} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingProbe calloc(MemoryStack stack) { + return new IOURingProbe(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #last_op}. */ + public static byte nlast_op(long struct) { return UNSAFE.getByte(null, struct + IOURingProbe.LAST_OP); } + /** Unsafe version of {@link #ops_len}. */ + public static byte nops_len(long struct) { return UNSAFE.getByte(null, struct + IOURingProbe.OPS_LEN); } + /** Unsafe version of {@link #resv}. */ + public static short nresv(long struct) { return UNSAFE.getShort(null, struct + IOURingProbe.RESV); } + public static IntBuffer nresv2(long struct) { return memIntBuffer(struct + IOURingProbe.RESV2, 3); } + public static int nresv2(long struct, int index) { + return UNSAFE.getInt(null, struct + IOURingProbe.RESV2 + check(index, 3) * 4); + } + /** Unsafe version of {@link #ops}. */ + public static IOURingProbeOp.Buffer nops(long struct) { return IOURingProbeOp.create(struct + IOURingProbe.OPS, 0); } + /** Unsafe version of {@link #ops(int) ops}. */ + public static IOURingProbeOp nops(long struct, int index) { + return IOURingProbeOp.create(struct + IOURingProbe.OPS + check(index, 0) * IOURingProbeOp.SIZEOF); + } + + /** Unsafe version of {@link #last_op(byte) last_op}. */ + public static void nlast_op(long struct, byte value) { UNSAFE.putByte(null, struct + IOURingProbe.LAST_OP, value); } + /** Unsafe version of {@link #ops_len(byte) ops_len}. */ + public static void nops_len(long struct, byte value) { UNSAFE.putByte(null, struct + IOURingProbe.OPS_LEN, value); } + /** Unsafe version of {@link #resv(short) resv}. */ + public static void nresv(long struct, short value) { UNSAFE.putShort(null, struct + IOURingProbe.RESV, value); } + public static void nresv2(long struct, IntBuffer value) { + if (CHECKS) { checkGT(value, 3); } + memCopy(memAddress(value), struct + IOURingProbe.RESV2, value.remaining() * 4); + } + public static void nresv2(long struct, int index, int value) { + UNSAFE.putInt(null, struct + IOURingProbe.RESV2 + check(index, 3) * 4, value); + } + /** Unsafe version of {@link #ops(IOURingProbeOp.Buffer) ops}. */ + public static void nops(long struct, IOURingProbeOp.Buffer value) { + if (CHECKS) { checkGT(value, 0); } + memCopy(value.address(), struct + IOURingProbe.OPS, value.remaining() * IOURingProbeOp.SIZEOF); + } + /** Unsafe version of {@link #ops(int, IOURingProbeOp) ops}. */ + public static void nops(long struct, int index, IOURingProbeOp value) { + memCopy(value.address(), struct + IOURingProbe.OPS + check(index, 0) * IOURingProbeOp.SIZEOF, IOURingProbeOp.SIZEOF); + } + + // ----------------------------------- + + /** An array of {@link IOURingProbe} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingProbe ELEMENT_FACTORY = IOURingProbe.create(-1L); + + /** + * Creates a new {@code IOURingProbe.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingProbe#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingProbe getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code last_op} field. */ + @NativeType("__u8") + public byte last_op() { return IOURingProbe.nlast_op(address()); } + /** @return the value of the {@code ops_len} field. */ + @NativeType("__u8") + public byte ops_len() { return IOURingProbe.nops_len(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u16") + public short resv() { return IOURingProbe.nresv(address()); } + /** @return a {@link IOURingProbeOp}.Buffer view of the {@code ops} field. */ + @NativeType("struct io_uring_probe_op[0]") + public IOURingProbeOp.Buffer ops() { return IOURingProbe.nops(address()); } + /** @return a {@link IOURingProbeOp} view of the struct at the specified index of the {@code ops} field. */ + @NativeType("struct io_uring_probe_op") + public IOURingProbeOp ops(int index) { return IOURingProbe.nops(address(), index); } + + /** Sets the specified value to the {@code last_op} field. */ + public Buffer last_op(@NativeType("__u8") byte value) { IOURingProbe.nlast_op(address(), value); return this; } + /** Sets the specified value to the {@code ops_len} field. */ + public Buffer ops_len(@NativeType("__u8") byte value) { IOURingProbe.nops_len(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public Buffer resv(@NativeType("__u16") short value) { IOURingProbe.nresv(address(), value); return this; } + /** Copies the specified {@link IOURingProbeOp.Buffer} to the {@code ops} field. */ + public Buffer ops(@NativeType("struct io_uring_probe_op[0]") IOURingProbeOp.Buffer value) { IOURingProbe.nops(address(), value); return this; } + /** Copies the specified {@link IOURingProbeOp} at the specified index of the {@code ops} field. */ + public Buffer ops(int index, @NativeType("struct io_uring_probe_op") IOURingProbeOp value) { IOURingProbe.nops(address(), index, value); return this; } + /** Passes the {@code ops} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer ops(java.util.function.Consumer consumer) { consumer.accept(ops()); return this; } + /** Passes the element at {@code index} of the {@code ops} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer ops(int index, java.util.function.Consumer consumer) { consumer.accept(ops(index)); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingProbeOp.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingProbeOp.java new file mode 100644 index 000000000..adc2f81be --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingProbeOp.java @@ -0,0 +1,326 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_probe_op {
    + *     __u8 op;
    + *     __u8 resv;
    + *     __u16 {@link #flags};
    + *     __u32 resv2;
    + * }
    + */ +@NativeType("struct io_uring_probe_op") +public class IOURingProbeOp extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + OP, + RESV, + FLAGS, + RESV2; + + static { + Layout layout = __struct( + __member(1), + __member(1), + __member(2), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + OP = layout.offsetof(0); + RESV = layout.offsetof(1); + FLAGS = layout.offsetof(2); + RESV2 = layout.offsetof(3); + } + + protected IOURingProbeOp(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingProbeOp create(long address, @Nullable ByteBuffer container) { + return new IOURingProbeOp(address, container); + } + + /** + * Creates a {@code IOURingProbeOp} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingProbeOp(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code op} field. */ + @NativeType("__u8") + public byte op() { return nop(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u8") + public byte resv() { return nresv(address()); } + /** one or more of:
    {@link LibIOURing#IO_URING_OP_SUPPORTED}
    */ + @NativeType("__u16") + public short flags() { return nflags(address()); } + /** @return the value of the {@code resv2} field. */ + @NativeType("__u32") + public int resv2() { return nresv2(address()); } + + /** Sets the specified value to the {@code op} field. */ + public IOURingProbeOp op(@NativeType("__u8") byte value) { nop(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public IOURingProbeOp resv(@NativeType("__u8") byte value) { nresv(address(), value); return this; } + /** Sets the specified value to the {@link #flags} field. */ + public IOURingProbeOp flags(@NativeType("__u16") short value) { nflags(address(), value); return this; } + /** Sets the specified value to the {@code resv2} field. */ + public IOURingProbeOp resv2(@NativeType("__u32") int value) { nresv2(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingProbeOp set( + byte op, + byte resv, + short flags, + int resv2 + ) { + op(op); + resv(resv); + flags(flags); + resv2(resv2); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingProbeOp set(IOURingProbeOp src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingProbeOp} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingProbeOp malloc() { + return new IOURingProbeOp(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingProbeOp} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingProbeOp calloc() { + return new IOURingProbeOp(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingProbeOp} instance allocated with {@link BufferUtils}. */ + public static IOURingProbeOp create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingProbeOp(memAddress(container), container); + } + + /** Returns a new {@code IOURingProbeOp} instance for the specified memory address. */ + public static IOURingProbeOp create(long address) { + return new IOURingProbeOp(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingProbeOp createSafe(long address) { + return address == NULL ? null : new IOURingProbeOp(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingProbeOp} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingProbeOp malloc(MemoryStack stack) { + return new IOURingProbeOp(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingProbeOp} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingProbeOp calloc(MemoryStack stack) { + return new IOURingProbeOp(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #op}. */ + public static byte nop(long struct) { return UNSAFE.getByte(null, struct + IOURingProbeOp.OP); } + /** Unsafe version of {@link #resv}. */ + public static byte nresv(long struct) { return UNSAFE.getByte(null, struct + IOURingProbeOp.RESV); } + /** Unsafe version of {@link #flags}. */ + public static short nflags(long struct) { return UNSAFE.getShort(null, struct + IOURingProbeOp.FLAGS); } + /** Unsafe version of {@link #resv2}. */ + public static int nresv2(long struct) { return UNSAFE.getInt(null, struct + IOURingProbeOp.RESV2); } + + /** Unsafe version of {@link #op(byte) op}. */ + public static void nop(long struct, byte value) { UNSAFE.putByte(null, struct + IOURingProbeOp.OP, value); } + /** Unsafe version of {@link #resv(byte) resv}. */ + public static void nresv(long struct, byte value) { UNSAFE.putByte(null, struct + IOURingProbeOp.RESV, value); } + /** Unsafe version of {@link #flags(short) flags}. */ + public static void nflags(long struct, short value) { UNSAFE.putShort(null, struct + IOURingProbeOp.FLAGS, value); } + /** Unsafe version of {@link #resv2(int) resv2}. */ + public static void nresv2(long struct, int value) { UNSAFE.putInt(null, struct + IOURingProbeOp.RESV2, value); } + + // ----------------------------------- + + /** An array of {@link IOURingProbeOp} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingProbeOp ELEMENT_FACTORY = IOURingProbeOp.create(-1L); + + /** + * Creates a new {@code IOURingProbeOp.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingProbeOp#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingProbeOp getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code op} field. */ + @NativeType("__u8") + public byte op() { return IOURingProbeOp.nop(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u8") + public byte resv() { return IOURingProbeOp.nresv(address()); } + /** @return the value of the {@link IOURingProbeOp#flags} field. */ + @NativeType("__u16") + public short flags() { return IOURingProbeOp.nflags(address()); } + /** @return the value of the {@code resv2} field. */ + @NativeType("__u32") + public int resv2() { return IOURingProbeOp.nresv2(address()); } + + /** Sets the specified value to the {@code op} field. */ + public Buffer op(@NativeType("__u8") byte value) { IOURingProbeOp.nop(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public Buffer resv(@NativeType("__u8") byte value) { IOURingProbeOp.nresv(address(), value); return this; } + /** Sets the specified value to the {@link IOURingProbeOp#flags} field. */ + public Buffer flags(@NativeType("__u16") short value) { IOURingProbeOp.nflags(address(), value); return this; } + /** Sets the specified value to the {@code resv2} field. */ + public Buffer resv2(@NativeType("__u32") int value) { IOURingProbeOp.nresv2(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCRegister.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCRegister.java new file mode 100644 index 000000000..d68466141 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCRegister.java @@ -0,0 +1,346 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_rsrc_register {
    + *     __u32 nr;
    + *     __u32 flags;
    + *     __u64 resv2;
    + *     __u64 data;
    + *     __u64 tags;
    + * }
    + */ +@NativeType("struct io_uring_rsrc_register") +public class IOURingRSRCRegister extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NR, + FLAGS, + RESV2, + DATA, + TAGS; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(8), + __member(8), + __member(8) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NR = layout.offsetof(0); + FLAGS = layout.offsetof(1); + RESV2 = layout.offsetof(2); + DATA = layout.offsetof(3); + TAGS = layout.offsetof(4); + } + + protected IOURingRSRCRegister(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingRSRCRegister create(long address, @Nullable ByteBuffer container) { + return new IOURingRSRCRegister(address, container); + } + + /** + * Creates a {@code IOURingRSRCRegister} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingRSRCRegister(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code nr} field. */ + @NativeType("__u32") + public int nr() { return nnr(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u32") + public int flags() { return nflags(address()); } + /** @return the value of the {@code resv2} field. */ + @NativeType("__u64") + public long resv2() { return nresv2(address()); } + /** @return the value of the {@code data} field. */ + @NativeType("__u64") + public long data() { return ndata(address()); } + /** @return the value of the {@code tags} field. */ + @NativeType("__u64") + public long tags() { return ntags(address()); } + + /** Sets the specified value to the {@code nr} field. */ + public IOURingRSRCRegister nr(@NativeType("__u32") int value) { nnr(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public IOURingRSRCRegister flags(@NativeType("__u32") int value) { nflags(address(), value); return this; } + /** Sets the specified value to the {@code resv2} field. */ + public IOURingRSRCRegister resv2(@NativeType("__u64") long value) { nresv2(address(), value); return this; } + /** Sets the specified value to the {@code data} field. */ + public IOURingRSRCRegister data(@NativeType("__u64") long value) { ndata(address(), value); return this; } + /** Sets the specified value to the {@code tags} field. */ + public IOURingRSRCRegister tags(@NativeType("__u64") long value) { ntags(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingRSRCRegister set( + int nr, + int flags, + long resv2, + long data, + long tags + ) { + nr(nr); + flags(flags); + resv2(resv2); + data(data); + tags(tags); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingRSRCRegister set(IOURingRSRCRegister src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingRSRCRegister} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingRSRCRegister malloc() { + return new IOURingRSRCRegister(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingRSRCRegister} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingRSRCRegister calloc() { + return new IOURingRSRCRegister(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingRSRCRegister} instance allocated with {@link BufferUtils}. */ + public static IOURingRSRCRegister create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingRSRCRegister(memAddress(container), container); + } + + /** Returns a new {@code IOURingRSRCRegister} instance for the specified memory address. */ + public static IOURingRSRCRegister create(long address) { + return new IOURingRSRCRegister(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingRSRCRegister createSafe(long address) { + return address == NULL ? null : new IOURingRSRCRegister(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingRSRCRegister} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingRSRCRegister malloc(MemoryStack stack) { + return new IOURingRSRCRegister(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingRSRCRegister} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingRSRCRegister calloc(MemoryStack stack) { + return new IOURingRSRCRegister(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #nr}. */ + public static int nnr(long struct) { return UNSAFE.getInt(null, struct + IOURingRSRCRegister.NR); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + IOURingRSRCRegister.FLAGS); } + /** Unsafe version of {@link #resv2}. */ + public static long nresv2(long struct) { return UNSAFE.getLong(null, struct + IOURingRSRCRegister.RESV2); } + /** Unsafe version of {@link #data}. */ + public static long ndata(long struct) { return UNSAFE.getLong(null, struct + IOURingRSRCRegister.DATA); } + /** Unsafe version of {@link #tags}. */ + public static long ntags(long struct) { return UNSAFE.getLong(null, struct + IOURingRSRCRegister.TAGS); } + + /** Unsafe version of {@link #nr(int) nr}. */ + public static void nnr(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRSRCRegister.NR, value); } + /** Unsafe version of {@link #flags(int) flags}. */ + public static void nflags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRSRCRegister.FLAGS, value); } + /** Unsafe version of {@link #resv2(long) resv2}. */ + public static void nresv2(long struct, long value) { UNSAFE.putLong(null, struct + IOURingRSRCRegister.RESV2, value); } + /** Unsafe version of {@link #data(long) data}. */ + public static void ndata(long struct, long value) { UNSAFE.putLong(null, struct + IOURingRSRCRegister.DATA, value); } + /** Unsafe version of {@link #tags(long) tags}. */ + public static void ntags(long struct, long value) { UNSAFE.putLong(null, struct + IOURingRSRCRegister.TAGS, value); } + + // ----------------------------------- + + /** An array of {@link IOURingRSRCRegister} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingRSRCRegister ELEMENT_FACTORY = IOURingRSRCRegister.create(-1L); + + /** + * Creates a new {@code IOURingRSRCRegister.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingRSRCRegister#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingRSRCRegister getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code nr} field. */ + @NativeType("__u32") + public int nr() { return IOURingRSRCRegister.nnr(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u32") + public int flags() { return IOURingRSRCRegister.nflags(address()); } + /** @return the value of the {@code resv2} field. */ + @NativeType("__u64") + public long resv2() { return IOURingRSRCRegister.nresv2(address()); } + /** @return the value of the {@code data} field. */ + @NativeType("__u64") + public long data() { return IOURingRSRCRegister.ndata(address()); } + /** @return the value of the {@code tags} field. */ + @NativeType("__u64") + public long tags() { return IOURingRSRCRegister.ntags(address()); } + + /** Sets the specified value to the {@code nr} field. */ + public Buffer nr(@NativeType("__u32") int value) { IOURingRSRCRegister.nnr(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public Buffer flags(@NativeType("__u32") int value) { IOURingRSRCRegister.nflags(address(), value); return this; } + /** Sets the specified value to the {@code resv2} field. */ + public Buffer resv2(@NativeType("__u64") long value) { IOURingRSRCRegister.nresv2(address(), value); return this; } + /** Sets the specified value to the {@code data} field. */ + public Buffer data(@NativeType("__u64") long value) { IOURingRSRCRegister.ndata(address(), value); return this; } + /** Sets the specified value to the {@code tags} field. */ + public Buffer tags(@NativeType("__u64") long value) { IOURingRSRCRegister.ntags(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCUpdate.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCUpdate.java new file mode 100644 index 000000000..574af9267 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCUpdate.java @@ -0,0 +1,306 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_rsrc_update {
    + *     __u32 offset;
    + *     __u32 resv;
    + *     __u64 data;
    + * }
    + */ +@NativeType("struct io_uring_rsrc_update") +public class IOURingRSRCUpdate extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + OFFSET, + RESV, + DATA; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(8) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + OFFSET = layout.offsetof(0); + RESV = layout.offsetof(1); + DATA = layout.offsetof(2); + } + + protected IOURingRSRCUpdate(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingRSRCUpdate create(long address, @Nullable ByteBuffer container) { + return new IOURingRSRCUpdate(address, container); + } + + /** + * Creates a {@code IOURingRSRCUpdate} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingRSRCUpdate(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code offset} field. */ + @NativeType("__u32") + public int offset() { return noffset(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u32") + public int resv() { return nresv(address()); } + /** @return the value of the {@code data} field. */ + @NativeType("__u64") + public long data() { return ndata(address()); } + + /** Sets the specified value to the {@code offset} field. */ + public IOURingRSRCUpdate offset(@NativeType("__u32") int value) { noffset(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public IOURingRSRCUpdate resv(@NativeType("__u32") int value) { nresv(address(), value); return this; } + /** Sets the specified value to the {@code data} field. */ + public IOURingRSRCUpdate data(@NativeType("__u64") long value) { ndata(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingRSRCUpdate set( + int offset, + int resv, + long data + ) { + offset(offset); + resv(resv); + data(data); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingRSRCUpdate set(IOURingRSRCUpdate src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingRSRCUpdate} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingRSRCUpdate malloc() { + return new IOURingRSRCUpdate(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingRSRCUpdate} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingRSRCUpdate calloc() { + return new IOURingRSRCUpdate(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingRSRCUpdate} instance allocated with {@link BufferUtils}. */ + public static IOURingRSRCUpdate create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingRSRCUpdate(memAddress(container), container); + } + + /** Returns a new {@code IOURingRSRCUpdate} instance for the specified memory address. */ + public static IOURingRSRCUpdate create(long address) { + return new IOURingRSRCUpdate(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingRSRCUpdate createSafe(long address) { + return address == NULL ? null : new IOURingRSRCUpdate(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingRSRCUpdate} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingRSRCUpdate malloc(MemoryStack stack) { + return new IOURingRSRCUpdate(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingRSRCUpdate} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingRSRCUpdate calloc(MemoryStack stack) { + return new IOURingRSRCUpdate(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #offset}. */ + public static int noffset(long struct) { return UNSAFE.getInt(null, struct + IOURingRSRCUpdate.OFFSET); } + /** Unsafe version of {@link #resv}. */ + public static int nresv(long struct) { return UNSAFE.getInt(null, struct + IOURingRSRCUpdate.RESV); } + /** Unsafe version of {@link #data}. */ + public static long ndata(long struct) { return UNSAFE.getLong(null, struct + IOURingRSRCUpdate.DATA); } + + /** Unsafe version of {@link #offset(int) offset}. */ + public static void noffset(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRSRCUpdate.OFFSET, value); } + /** Unsafe version of {@link #resv(int) resv}. */ + public static void nresv(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRSRCUpdate.RESV, value); } + /** Unsafe version of {@link #data(long) data}. */ + public static void ndata(long struct, long value) { UNSAFE.putLong(null, struct + IOURingRSRCUpdate.DATA, value); } + + // ----------------------------------- + + /** An array of {@link IOURingRSRCUpdate} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingRSRCUpdate ELEMENT_FACTORY = IOURingRSRCUpdate.create(-1L); + + /** + * Creates a new {@code IOURingRSRCUpdate.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingRSRCUpdate#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingRSRCUpdate getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code offset} field. */ + @NativeType("__u32") + public int offset() { return IOURingRSRCUpdate.noffset(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u32") + public int resv() { return IOURingRSRCUpdate.nresv(address()); } + /** @return the value of the {@code data} field. */ + @NativeType("__u64") + public long data() { return IOURingRSRCUpdate.ndata(address()); } + + /** Sets the specified value to the {@code offset} field. */ + public Buffer offset(@NativeType("__u32") int value) { IOURingRSRCUpdate.noffset(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public Buffer resv(@NativeType("__u32") int value) { IOURingRSRCUpdate.nresv(address(), value); return this; } + /** Sets the specified value to the {@code data} field. */ + public Buffer data(@NativeType("__u64") long value) { IOURingRSRCUpdate.ndata(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCUpdate2.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCUpdate2.java new file mode 100644 index 000000000..c0f47b9fa --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRSRCUpdate2.java @@ -0,0 +1,366 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_rsrc_update2 {
    + *     __u32 offset;
    + *     __u32 resv;
    + *     __u64 data;
    + *     __u64 tags;
    + *     __u32 nr;
    + *     __u32 resv2;
    + * }
    + */ +@NativeType("struct io_uring_rsrc_update2") +public class IOURingRSRCUpdate2 extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + OFFSET, + RESV, + DATA, + TAGS, + NR, + RESV2; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(8), + __member(8), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + OFFSET = layout.offsetof(0); + RESV = layout.offsetof(1); + DATA = layout.offsetof(2); + TAGS = layout.offsetof(3); + NR = layout.offsetof(4); + RESV2 = layout.offsetof(5); + } + + protected IOURingRSRCUpdate2(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingRSRCUpdate2 create(long address, @Nullable ByteBuffer container) { + return new IOURingRSRCUpdate2(address, container); + } + + /** + * Creates a {@code IOURingRSRCUpdate2} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingRSRCUpdate2(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code offset} field. */ + @NativeType("__u32") + public int offset() { return noffset(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u32") + public int resv() { return nresv(address()); } + /** @return the value of the {@code data} field. */ + @NativeType("__u64") + public long data() { return ndata(address()); } + /** @return the value of the {@code tags} field. */ + @NativeType("__u64") + public long tags() { return ntags(address()); } + /** @return the value of the {@code nr} field. */ + @NativeType("__u32") + public int nr() { return nnr(address()); } + /** @return the value of the {@code resv2} field. */ + @NativeType("__u32") + public int resv2() { return nresv2(address()); } + + /** Sets the specified value to the {@code offset} field. */ + public IOURingRSRCUpdate2 offset(@NativeType("__u32") int value) { noffset(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public IOURingRSRCUpdate2 resv(@NativeType("__u32") int value) { nresv(address(), value); return this; } + /** Sets the specified value to the {@code data} field. */ + public IOURingRSRCUpdate2 data(@NativeType("__u64") long value) { ndata(address(), value); return this; } + /** Sets the specified value to the {@code tags} field. */ + public IOURingRSRCUpdate2 tags(@NativeType("__u64") long value) { ntags(address(), value); return this; } + /** Sets the specified value to the {@code nr} field. */ + public IOURingRSRCUpdate2 nr(@NativeType("__u32") int value) { nnr(address(), value); return this; } + /** Sets the specified value to the {@code resv2} field. */ + public IOURingRSRCUpdate2 resv2(@NativeType("__u32") int value) { nresv2(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingRSRCUpdate2 set( + int offset, + int resv, + long data, + long tags, + int nr, + int resv2 + ) { + offset(offset); + resv(resv); + data(data); + tags(tags); + nr(nr); + resv2(resv2); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingRSRCUpdate2 set(IOURingRSRCUpdate2 src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingRSRCUpdate2} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingRSRCUpdate2 malloc() { + return new IOURingRSRCUpdate2(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingRSRCUpdate2} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingRSRCUpdate2 calloc() { + return new IOURingRSRCUpdate2(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingRSRCUpdate2} instance allocated with {@link BufferUtils}. */ + public static IOURingRSRCUpdate2 create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingRSRCUpdate2(memAddress(container), container); + } + + /** Returns a new {@code IOURingRSRCUpdate2} instance for the specified memory address. */ + public static IOURingRSRCUpdate2 create(long address) { + return new IOURingRSRCUpdate2(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingRSRCUpdate2 createSafe(long address) { + return address == NULL ? null : new IOURingRSRCUpdate2(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingRSRCUpdate2} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingRSRCUpdate2 malloc(MemoryStack stack) { + return new IOURingRSRCUpdate2(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingRSRCUpdate2} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingRSRCUpdate2 calloc(MemoryStack stack) { + return new IOURingRSRCUpdate2(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #offset}. */ + public static int noffset(long struct) { return UNSAFE.getInt(null, struct + IOURingRSRCUpdate2.OFFSET); } + /** Unsafe version of {@link #resv}. */ + public static int nresv(long struct) { return UNSAFE.getInt(null, struct + IOURingRSRCUpdate2.RESV); } + /** Unsafe version of {@link #data}. */ + public static long ndata(long struct) { return UNSAFE.getLong(null, struct + IOURingRSRCUpdate2.DATA); } + /** Unsafe version of {@link #tags}. */ + public static long ntags(long struct) { return UNSAFE.getLong(null, struct + IOURingRSRCUpdate2.TAGS); } + /** Unsafe version of {@link #nr}. */ + public static int nnr(long struct) { return UNSAFE.getInt(null, struct + IOURingRSRCUpdate2.NR); } + /** Unsafe version of {@link #resv2}. */ + public static int nresv2(long struct) { return UNSAFE.getInt(null, struct + IOURingRSRCUpdate2.RESV2); } + + /** Unsafe version of {@link #offset(int) offset}. */ + public static void noffset(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRSRCUpdate2.OFFSET, value); } + /** Unsafe version of {@link #resv(int) resv}. */ + public static void nresv(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRSRCUpdate2.RESV, value); } + /** Unsafe version of {@link #data(long) data}. */ + public static void ndata(long struct, long value) { UNSAFE.putLong(null, struct + IOURingRSRCUpdate2.DATA, value); } + /** Unsafe version of {@link #tags(long) tags}. */ + public static void ntags(long struct, long value) { UNSAFE.putLong(null, struct + IOURingRSRCUpdate2.TAGS, value); } + /** Unsafe version of {@link #nr(int) nr}. */ + public static void nnr(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRSRCUpdate2.NR, value); } + /** Unsafe version of {@link #resv2(int) resv2}. */ + public static void nresv2(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRSRCUpdate2.RESV2, value); } + + // ----------------------------------- + + /** An array of {@link IOURingRSRCUpdate2} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingRSRCUpdate2 ELEMENT_FACTORY = IOURingRSRCUpdate2.create(-1L); + + /** + * Creates a new {@code IOURingRSRCUpdate2.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingRSRCUpdate2#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingRSRCUpdate2 getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code offset} field. */ + @NativeType("__u32") + public int offset() { return IOURingRSRCUpdate2.noffset(address()); } + /** @return the value of the {@code resv} field. */ + @NativeType("__u32") + public int resv() { return IOURingRSRCUpdate2.nresv(address()); } + /** @return the value of the {@code data} field. */ + @NativeType("__u64") + public long data() { return IOURingRSRCUpdate2.ndata(address()); } + /** @return the value of the {@code tags} field. */ + @NativeType("__u64") + public long tags() { return IOURingRSRCUpdate2.ntags(address()); } + /** @return the value of the {@code nr} field. */ + @NativeType("__u32") + public int nr() { return IOURingRSRCUpdate2.nnr(address()); } + /** @return the value of the {@code resv2} field. */ + @NativeType("__u32") + public int resv2() { return IOURingRSRCUpdate2.nresv2(address()); } + + /** Sets the specified value to the {@code offset} field. */ + public Buffer offset(@NativeType("__u32") int value) { IOURingRSRCUpdate2.noffset(address(), value); return this; } + /** Sets the specified value to the {@code resv} field. */ + public Buffer resv(@NativeType("__u32") int value) { IOURingRSRCUpdate2.nresv(address(), value); return this; } + /** Sets the specified value to the {@code data} field. */ + public Buffer data(@NativeType("__u64") long value) { IOURingRSRCUpdate2.ndata(address(), value); return this; } + /** Sets the specified value to the {@code tags} field. */ + public Buffer tags(@NativeType("__u64") long value) { IOURingRSRCUpdate2.ntags(address(), value); return this; } + /** Sets the specified value to the {@code nr} field. */ + public Buffer nr(@NativeType("__u32") int value) { IOURingRSRCUpdate2.nnr(address(), value); return this; } + /** Sets the specified value to the {@code resv2} field. */ + public Buffer resv2(@NativeType("__u32") int value) { IOURingRSRCUpdate2.nresv2(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRecvmsgOut.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRecvmsgOut.java new file mode 100644 index 000000000..92b6e1572 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRecvmsgOut.java @@ -0,0 +1,326 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_recvmsg_out {
    + *     __u32 namelen;
    + *     __u32 controllen;
    + *     __u32 payloadlen;
    + *     __u32 flags;
    + * }
    + */ +@NativeType("struct io_uring_recvmsg_out") +public class IOURingRecvmsgOut extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NAMELEN, + CONTROLLEN, + PAYLOADLEN, + FLAGS; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NAMELEN = layout.offsetof(0); + CONTROLLEN = layout.offsetof(1); + PAYLOADLEN = layout.offsetof(2); + FLAGS = layout.offsetof(3); + } + + protected IOURingRecvmsgOut(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingRecvmsgOut create(long address, @Nullable ByteBuffer container) { + return new IOURingRecvmsgOut(address, container); + } + + /** + * Creates a {@code IOURingRecvmsgOut} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingRecvmsgOut(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code namelen} field. */ + @NativeType("__u32") + public int namelen() { return nnamelen(address()); } + /** @return the value of the {@code controllen} field. */ + @NativeType("__u32") + public int controllen() { return ncontrollen(address()); } + /** @return the value of the {@code payloadlen} field. */ + @NativeType("__u32") + public int payloadlen() { return npayloadlen(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u32") + public int flags() { return nflags(address()); } + + /** Sets the specified value to the {@code namelen} field. */ + public IOURingRecvmsgOut namelen(@NativeType("__u32") int value) { nnamelen(address(), value); return this; } + /** Sets the specified value to the {@code controllen} field. */ + public IOURingRecvmsgOut controllen(@NativeType("__u32") int value) { ncontrollen(address(), value); return this; } + /** Sets the specified value to the {@code payloadlen} field. */ + public IOURingRecvmsgOut payloadlen(@NativeType("__u32") int value) { npayloadlen(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public IOURingRecvmsgOut flags(@NativeType("__u32") int value) { nflags(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingRecvmsgOut set( + int namelen, + int controllen, + int payloadlen, + int flags + ) { + namelen(namelen); + controllen(controllen); + payloadlen(payloadlen); + flags(flags); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingRecvmsgOut set(IOURingRecvmsgOut src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingRecvmsgOut} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingRecvmsgOut malloc() { + return new IOURingRecvmsgOut(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingRecvmsgOut} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingRecvmsgOut calloc() { + return new IOURingRecvmsgOut(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingRecvmsgOut} instance allocated with {@link BufferUtils}. */ + public static IOURingRecvmsgOut create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingRecvmsgOut(memAddress(container), container); + } + + /** Returns a new {@code IOURingRecvmsgOut} instance for the specified memory address. */ + public static IOURingRecvmsgOut create(long address) { + return new IOURingRecvmsgOut(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingRecvmsgOut createSafe(long address) { + return address == NULL ? null : new IOURingRecvmsgOut(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingRecvmsgOut} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingRecvmsgOut malloc(MemoryStack stack) { + return new IOURingRecvmsgOut(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingRecvmsgOut} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingRecvmsgOut calloc(MemoryStack stack) { + return new IOURingRecvmsgOut(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #namelen}. */ + public static int nnamelen(long struct) { return UNSAFE.getInt(null, struct + IOURingRecvmsgOut.NAMELEN); } + /** Unsafe version of {@link #controllen}. */ + public static int ncontrollen(long struct) { return UNSAFE.getInt(null, struct + IOURingRecvmsgOut.CONTROLLEN); } + /** Unsafe version of {@link #payloadlen}. */ + public static int npayloadlen(long struct) { return UNSAFE.getInt(null, struct + IOURingRecvmsgOut.PAYLOADLEN); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + IOURingRecvmsgOut.FLAGS); } + + /** Unsafe version of {@link #namelen(int) namelen}. */ + public static void nnamelen(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRecvmsgOut.NAMELEN, value); } + /** Unsafe version of {@link #controllen(int) controllen}. */ + public static void ncontrollen(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRecvmsgOut.CONTROLLEN, value); } + /** Unsafe version of {@link #payloadlen(int) payloadlen}. */ + public static void npayloadlen(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRecvmsgOut.PAYLOADLEN, value); } + /** Unsafe version of {@link #flags(int) flags}. */ + public static void nflags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingRecvmsgOut.FLAGS, value); } + + // ----------------------------------- + + /** An array of {@link IOURingRecvmsgOut} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingRecvmsgOut ELEMENT_FACTORY = IOURingRecvmsgOut.create(-1L); + + /** + * Creates a new {@code IOURingRecvmsgOut.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingRecvmsgOut#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingRecvmsgOut getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code namelen} field. */ + @NativeType("__u32") + public int namelen() { return IOURingRecvmsgOut.nnamelen(address()); } + /** @return the value of the {@code controllen} field. */ + @NativeType("__u32") + public int controllen() { return IOURingRecvmsgOut.ncontrollen(address()); } + /** @return the value of the {@code payloadlen} field. */ + @NativeType("__u32") + public int payloadlen() { return IOURingRecvmsgOut.npayloadlen(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u32") + public int flags() { return IOURingRecvmsgOut.nflags(address()); } + + /** Sets the specified value to the {@code namelen} field. */ + public Buffer namelen(@NativeType("__u32") int value) { IOURingRecvmsgOut.nnamelen(address(), value); return this; } + /** Sets the specified value to the {@code controllen} field. */ + public Buffer controllen(@NativeType("__u32") int value) { IOURingRecvmsgOut.ncontrollen(address(), value); return this; } + /** Sets the specified value to the {@code payloadlen} field. */ + public Buffer payloadlen(@NativeType("__u32") int value) { IOURingRecvmsgOut.npayloadlen(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public Buffer flags(@NativeType("__u32") int value) { IOURingRecvmsgOut.nflags(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRestriction.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRestriction.java new file mode 100644 index 000000000..303161407 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingRestriction.java @@ -0,0 +1,337 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_restriction {
    + *     __u16 opcode;
    + *     union {
    + *         __u8 register_op;
    + *         __u8 sqe_op;
    + *         __u8 sqe_flags;
    + *     };
    + *     __u8 resv;
    + *     __u32 resv2[3];
    + * }
    + */ +@NativeType("struct io_uring_restriction") +public class IOURingRestriction extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + OPCODE, + REGISTER_OP, + SQE_OP, + SQE_FLAGS, + RESV, + RESV2; + + static { + Layout layout = __struct( + __member(2), + __union( + __member(1), + __member(1), + __member(1) + ), + __member(1), + __array(4, 3) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + OPCODE = layout.offsetof(0); + REGISTER_OP = layout.offsetof(2); + SQE_OP = layout.offsetof(3); + SQE_FLAGS = layout.offsetof(4); + RESV = layout.offsetof(5); + RESV2 = layout.offsetof(6); + } + + protected IOURingRestriction(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingRestriction create(long address, @Nullable ByteBuffer container) { + return new IOURingRestriction(address, container); + } + + /** + * Creates a {@code IOURingRestriction} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingRestriction(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code opcode} field. */ + @NativeType("__u16") + public short opcode() { return nopcode(address()); } + /** @return the value of the {@code register_op} field. */ + @NativeType("__u8") + public byte register_op() { return nregister_op(address()); } + /** @return the value of the {@code sqe_op} field. */ + @NativeType("__u8") + public byte sqe_op() { return nsqe_op(address()); } + /** @return the value of the {@code sqe_flags} field. */ + @NativeType("__u8") + public byte sqe_flags() { return nsqe_flags(address()); } + + /** Sets the specified value to the {@code opcode} field. */ + public IOURingRestriction opcode(@NativeType("__u16") short value) { nopcode(address(), value); return this; } + /** Sets the specified value to the {@code register_op} field. */ + public IOURingRestriction register_op(@NativeType("__u8") byte value) { nregister_op(address(), value); return this; } + /** Sets the specified value to the {@code sqe_op} field. */ + public IOURingRestriction sqe_op(@NativeType("__u8") byte value) { nsqe_op(address(), value); return this; } + /** Sets the specified value to the {@code sqe_flags} field. */ + public IOURingRestriction sqe_flags(@NativeType("__u8") byte value) { nsqe_flags(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingRestriction set(IOURingRestriction src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingRestriction} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingRestriction malloc() { + return new IOURingRestriction(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingRestriction} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingRestriction calloc() { + return new IOURingRestriction(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingRestriction} instance allocated with {@link BufferUtils}. */ + public static IOURingRestriction create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingRestriction(memAddress(container), container); + } + + /** Returns a new {@code IOURingRestriction} instance for the specified memory address. */ + public static IOURingRestriction create(long address) { + return new IOURingRestriction(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingRestriction createSafe(long address) { + return address == NULL ? null : new IOURingRestriction(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingRestriction} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingRestriction malloc(MemoryStack stack) { + return new IOURingRestriction(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingRestriction} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingRestriction calloc(MemoryStack stack) { + return new IOURingRestriction(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #opcode}. */ + public static short nopcode(long struct) { return UNSAFE.getShort(null, struct + IOURingRestriction.OPCODE); } + /** Unsafe version of {@link #register_op}. */ + public static byte nregister_op(long struct) { return UNSAFE.getByte(null, struct + IOURingRestriction.REGISTER_OP); } + /** Unsafe version of {@link #sqe_op}. */ + public static byte nsqe_op(long struct) { return UNSAFE.getByte(null, struct + IOURingRestriction.SQE_OP); } + /** Unsafe version of {@link #sqe_flags}. */ + public static byte nsqe_flags(long struct) { return UNSAFE.getByte(null, struct + IOURingRestriction.SQE_FLAGS); } + public static byte nresv(long struct) { return UNSAFE.getByte(null, struct + IOURingRestriction.RESV); } + public static IntBuffer nresv2(long struct) { return memIntBuffer(struct + IOURingRestriction.RESV2, 3); } + public static int nresv2(long struct, int index) { + return UNSAFE.getInt(null, struct + IOURingRestriction.RESV2 + check(index, 3) * 4); + } + + /** Unsafe version of {@link #opcode(short) opcode}. */ + public static void nopcode(long struct, short value) { UNSAFE.putShort(null, struct + IOURingRestriction.OPCODE, value); } + /** Unsafe version of {@link #register_op(byte) register_op}. */ + public static void nregister_op(long struct, byte value) { UNSAFE.putByte(null, struct + IOURingRestriction.REGISTER_OP, value); } + /** Unsafe version of {@link #sqe_op(byte) sqe_op}. */ + public static void nsqe_op(long struct, byte value) { UNSAFE.putByte(null, struct + IOURingRestriction.SQE_OP, value); } + /** Unsafe version of {@link #sqe_flags(byte) sqe_flags}. */ + public static void nsqe_flags(long struct, byte value) { UNSAFE.putByte(null, struct + IOURingRestriction.SQE_FLAGS, value); } + public static void nresv(long struct, byte value) { UNSAFE.putByte(null, struct + IOURingRestriction.RESV, value); } + public static void nresv2(long struct, IntBuffer value) { + if (CHECKS) { checkGT(value, 3); } + memCopy(memAddress(value), struct + IOURingRestriction.RESV2, value.remaining() * 4); + } + public static void nresv2(long struct, int index, int value) { + UNSAFE.putInt(null, struct + IOURingRestriction.RESV2 + check(index, 3) * 4, value); + } + + // ----------------------------------- + + /** An array of {@link IOURingRestriction} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingRestriction ELEMENT_FACTORY = IOURingRestriction.create(-1L); + + /** + * Creates a new {@code IOURingRestriction.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingRestriction#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingRestriction getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code opcode} field. */ + @NativeType("__u16") + public short opcode() { return IOURingRestriction.nopcode(address()); } + /** @return the value of the {@code register_op} field. */ + @NativeType("__u8") + public byte register_op() { return IOURingRestriction.nregister_op(address()); } + /** @return the value of the {@code sqe_op} field. */ + @NativeType("__u8") + public byte sqe_op() { return IOURingRestriction.nsqe_op(address()); } + /** @return the value of the {@code sqe_flags} field. */ + @NativeType("__u8") + public byte sqe_flags() { return IOURingRestriction.nsqe_flags(address()); } + + /** Sets the specified value to the {@code opcode} field. */ + public Buffer opcode(@NativeType("__u16") short value) { IOURingRestriction.nopcode(address(), value); return this; } + /** Sets the specified value to the {@code register_op} field. */ + public Buffer register_op(@NativeType("__u8") byte value) { IOURingRestriction.nregister_op(address(), value); return this; } + /** Sets the specified value to the {@code sqe_op} field. */ + public Buffer sqe_op(@NativeType("__u8") byte value) { IOURingRestriction.nsqe_op(address(), value); return this; } + /** Sets the specified value to the {@code sqe_flags} field. */ + public Buffer sqe_flags(@NativeType("__u8") byte value) { IOURingRestriction.nsqe_flags(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSQ.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSQ.java new file mode 100644 index 000000000..7895baae6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSQ.java @@ -0,0 +1,609 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct io_uring_sq {
    + *     unsigned * khead;
    + *     unsigned * ktail;
    + *     unsigned * {@link #kring_mask};
    + *     unsigned * {@link #kring_entries};
    + *     unsigned * kflags;
    + *     unsigned * kdropped;
    + *     unsigned * array;
    + *     {@link IOURingSQE struct io_uring_sqe} * sqes;
    + *     unsigned sqe_head;
    + *     unsigned sqe_tail;
    + *     size_t ring_sz;
    + *     void * ring_ptr;
    + *     unsigned ring_mask;
    + *     unsigned ring_entries;
    + *     unsigned pad[2];
    + * }
    + */ +@NativeType("struct io_uring_sq") +public class IOURingSQ extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + KHEAD, + KTAIL, + KRING_MASK, + KRING_ENTRIES, + KFLAGS, + KDROPPED, + ARRAY, + SQES, + SQE_HEAD, + SQE_TAIL, + RING_SZ, + RING_PTR, + RING_MASK, + RING_ENTRIES, + PAD; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(4), + __array(4, 2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + KHEAD = layout.offsetof(0); + KTAIL = layout.offsetof(1); + KRING_MASK = layout.offsetof(2); + KRING_ENTRIES = layout.offsetof(3); + KFLAGS = layout.offsetof(4); + KDROPPED = layout.offsetof(5); + ARRAY = layout.offsetof(6); + SQES = layout.offsetof(7); + SQE_HEAD = layout.offsetof(8); + SQE_TAIL = layout.offsetof(9); + RING_SZ = layout.offsetof(10); + RING_PTR = layout.offsetof(11); + RING_MASK = layout.offsetof(12); + RING_ENTRIES = layout.offsetof(13); + PAD = layout.offsetof(14); + } + + protected IOURingSQ(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingSQ create(long address, @Nullable ByteBuffer container) { + return new IOURingSQ(address, container); + } + + /** + * Creates a {@code IOURingSQ} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingSQ(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code khead} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer khead(int capacity) { return nkhead(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code ktail} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer ktail(int capacity) { return nktail(address(), capacity); } + /** + * @param capacity the number of elements in the returned buffer + * + * @return Deprecated: use {@code ring_mask} instead of {@code *kring_mask} + */ + @NativeType("unsigned *") + public IntBuffer kring_mask(int capacity) { return nkring_mask(address(), capacity); } + /** + * @param capacity the number of elements in the returned buffer + * + * @return Deprecated: use {@code ring_entries} instead of {@code *kring_entries} + */ + @NativeType("unsigned *") + public IntBuffer kring_entries(int capacity) { return nkring_entries(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code kflags} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer kflags(int capacity) { return nkflags(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code kdropped} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer kdropped(int capacity) { return nkdropped(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code array} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer array(int capacity) { return narray(address(), capacity); } + /** @return a {@link IOURingSQE} view of the struct pointed to by the {@code sqes} field. */ + @NativeType("struct io_uring_sqe *") + public IOURingSQE sqes() { return nsqes(address()); } + /** @return the value of the {@code sqe_head} field. */ + @NativeType("unsigned") + public int sqe_head() { return nsqe_head(address()); } + /** @return the value of the {@code sqe_tail} field. */ + @NativeType("unsigned") + public int sqe_tail() { return nsqe_tail(address()); } + /** @return the value of the {@code ring_sz} field. */ + @NativeType("size_t") + public long ring_sz() { return nring_sz(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code ring_ptr} field. */ + @NativeType("void *") + public ByteBuffer ring_ptr() { return nring_ptr(address()); } + /** @return the value of the {@code ring_mask} field. */ + @NativeType("unsigned") + public int ring_mask() { return nring_mask(address()); } + /** @return the value of the {@code ring_entries} field. */ + @NativeType("unsigned") + public int ring_entries() { return nring_entries(address()); } + + /** Sets the address of the specified {@link IntBuffer} to the {@code khead} field. */ + public IOURingSQ khead(@NativeType("unsigned *") IntBuffer value) { nkhead(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code ktail} field. */ + public IOURingSQ ktail(@NativeType("unsigned *") IntBuffer value) { nktail(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@link #kring_mask} field. */ + public IOURingSQ kring_mask(@NativeType("unsigned *") IntBuffer value) { nkring_mask(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@link #kring_entries} field. */ + public IOURingSQ kring_entries(@NativeType("unsigned *") IntBuffer value) { nkring_entries(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code kflags} field. */ + public IOURingSQ kflags(@NativeType("unsigned *") IntBuffer value) { nkflags(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code kdropped} field. */ + public IOURingSQ kdropped(@NativeType("unsigned *") IntBuffer value) { nkdropped(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code array} field. */ + public IOURingSQ array(@NativeType("unsigned *") IntBuffer value) { narray(address(), value); return this; } + /** Sets the address of the specified {@link IOURingSQE} to the {@code sqes} field. */ + public IOURingSQ sqes(@NativeType("struct io_uring_sqe *") IOURingSQE value) { nsqes(address(), value); return this; } + /** Sets the specified value to the {@code sqe_head} field. */ + public IOURingSQ sqe_head(@NativeType("unsigned") int value) { nsqe_head(address(), value); return this; } + /** Sets the specified value to the {@code sqe_tail} field. */ + public IOURingSQ sqe_tail(@NativeType("unsigned") int value) { nsqe_tail(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code ring_ptr} field. */ + public IOURingSQ ring_ptr(@NativeType("void *") ByteBuffer value) { nring_ptr(address(), value); return this; } + /** Sets the specified value to the {@code ring_mask} field. */ + public IOURingSQ ring_mask(@NativeType("unsigned") int value) { nring_mask(address(), value); return this; } + /** Sets the specified value to the {@code ring_entries} field. */ + public IOURingSQ ring_entries(@NativeType("unsigned") int value) { nring_entries(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingSQ set( + IntBuffer khead, + IntBuffer ktail, + IntBuffer kring_mask, + IntBuffer kring_entries, + IntBuffer kflags, + IntBuffer kdropped, + IntBuffer array, + IOURingSQE sqes, + int sqe_head, + int sqe_tail, + ByteBuffer ring_ptr, + int ring_mask, + int ring_entries + ) { + khead(khead); + ktail(ktail); + kring_mask(kring_mask); + kring_entries(kring_entries); + kflags(kflags); + kdropped(kdropped); + array(array); + sqes(sqes); + sqe_head(sqe_head); + sqe_tail(sqe_tail); + ring_ptr(ring_ptr); + ring_mask(ring_mask); + ring_entries(ring_entries); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingSQ set(IOURingSQ src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingSQ} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingSQ malloc() { + return new IOURingSQ(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingSQ} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingSQ calloc() { + return new IOURingSQ(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingSQ} instance allocated with {@link BufferUtils}. */ + public static IOURingSQ create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingSQ(memAddress(container), container); + } + + /** Returns a new {@code IOURingSQ} instance for the specified memory address. */ + public static IOURingSQ create(long address) { + return new IOURingSQ(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingSQ createSafe(long address) { + return address == NULL ? null : new IOURingSQ(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingSQ} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingSQ malloc(MemoryStack stack) { + return new IOURingSQ(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingSQ} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingSQ calloc(MemoryStack stack) { + return new IOURingSQ(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #khead(int) khead}. */ + public static IntBuffer nkhead(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingSQ.KHEAD), capacity); } + /** Unsafe version of {@link #ktail(int) ktail}. */ + public static IntBuffer nktail(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingSQ.KTAIL), capacity); } + /** Unsafe version of {@link #kring_mask(int) kring_mask}. */ + public static IntBuffer nkring_mask(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingSQ.KRING_MASK), capacity); } + /** Unsafe version of {@link #kring_entries(int) kring_entries}. */ + public static IntBuffer nkring_entries(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingSQ.KRING_ENTRIES), capacity); } + /** Unsafe version of {@link #kflags(int) kflags}. */ + public static IntBuffer nkflags(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingSQ.KFLAGS), capacity); } + /** Unsafe version of {@link #kdropped(int) kdropped}. */ + public static IntBuffer nkdropped(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingSQ.KDROPPED), capacity); } + /** Unsafe version of {@link #array(int) array}. */ + public static IntBuffer narray(long struct, int capacity) { return memIntBuffer(memGetAddress(struct + IOURingSQ.ARRAY), capacity); } + /** Unsafe version of {@link #sqes}. */ + public static IOURingSQE nsqes(long struct) { return IOURingSQE.create(memGetAddress(struct + IOURingSQ.SQES)); } + /** Unsafe version of {@link #sqe_head}. */ + public static int nsqe_head(long struct) { return UNSAFE.getInt(null, struct + IOURingSQ.SQE_HEAD); } + /** Unsafe version of {@link #sqe_tail}. */ + public static int nsqe_tail(long struct) { return UNSAFE.getInt(null, struct + IOURingSQ.SQE_TAIL); } + /** Unsafe version of {@link #ring_sz}. */ + public static long nring_sz(long struct) { return memGetAddress(struct + IOURingSQ.RING_SZ); } + /** Unsafe version of {@link #ring_ptr() ring_ptr}. */ + public static ByteBuffer nring_ptr(long struct) { return memByteBuffer(memGetAddress(struct + IOURingSQ.RING_PTR), (int)nring_sz(struct)); } + /** Unsafe version of {@link #ring_mask}. */ + public static int nring_mask(long struct) { return UNSAFE.getInt(null, struct + IOURingSQ.RING_MASK); } + /** Unsafe version of {@link #ring_entries}. */ + public static int nring_entries(long struct) { return UNSAFE.getInt(null, struct + IOURingSQ.RING_ENTRIES); } + public static IntBuffer npad(long struct) { return memIntBuffer(struct + IOURingSQ.PAD, 2); } + public static int npad(long struct, int index) { + return UNSAFE.getInt(null, struct + IOURingSQ.PAD + check(index, 2) * 4); + } + + /** Unsafe version of {@link #khead(IntBuffer) khead}. */ + public static void nkhead(long struct, IntBuffer value) { memPutAddress(struct + IOURingSQ.KHEAD, memAddress(value)); } + /** Unsafe version of {@link #ktail(IntBuffer) ktail}. */ + public static void nktail(long struct, IntBuffer value) { memPutAddress(struct + IOURingSQ.KTAIL, memAddress(value)); } + /** Unsafe version of {@link #kring_mask(IntBuffer) kring_mask}. */ + public static void nkring_mask(long struct, IntBuffer value) { memPutAddress(struct + IOURingSQ.KRING_MASK, memAddress(value)); } + /** Unsafe version of {@link #kring_entries(IntBuffer) kring_entries}. */ + public static void nkring_entries(long struct, IntBuffer value) { memPutAddress(struct + IOURingSQ.KRING_ENTRIES, memAddress(value)); } + /** Unsafe version of {@link #kflags(IntBuffer) kflags}. */ + public static void nkflags(long struct, IntBuffer value) { memPutAddress(struct + IOURingSQ.KFLAGS, memAddress(value)); } + /** Unsafe version of {@link #kdropped(IntBuffer) kdropped}. */ + public static void nkdropped(long struct, IntBuffer value) { memPutAddress(struct + IOURingSQ.KDROPPED, memAddress(value)); } + /** Unsafe version of {@link #array(IntBuffer) array}. */ + public static void narray(long struct, IntBuffer value) { memPutAddress(struct + IOURingSQ.ARRAY, memAddress(value)); } + /** Unsafe version of {@link #sqes(IOURingSQE) sqes}. */ + public static void nsqes(long struct, IOURingSQE value) { memPutAddress(struct + IOURingSQ.SQES, value.address()); } + /** Unsafe version of {@link #sqe_head(int) sqe_head}. */ + public static void nsqe_head(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQ.SQE_HEAD, value); } + /** Unsafe version of {@link #sqe_tail(int) sqe_tail}. */ + public static void nsqe_tail(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQ.SQE_TAIL, value); } + /** Sets the specified value to the {@code ring_sz} field of the specified {@code struct}. */ + public static void nring_sz(long struct, long value) { memPutAddress(struct + IOURingSQ.RING_SZ, value); } + /** Unsafe version of {@link #ring_ptr(ByteBuffer) ring_ptr}. */ + public static void nring_ptr(long struct, ByteBuffer value) { memPutAddress(struct + IOURingSQ.RING_PTR, memAddress(value)); nring_sz(struct, value.remaining()); } + /** Unsafe version of {@link #ring_mask(int) ring_mask}. */ + public static void nring_mask(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQ.RING_MASK, value); } + /** Unsafe version of {@link #ring_entries(int) ring_entries}. */ + public static void nring_entries(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQ.RING_ENTRIES, value); } + public static void npad(long struct, IntBuffer value) { + if (CHECKS) { checkGT(value, 2); } + memCopy(memAddress(value), struct + IOURingSQ.PAD, value.remaining() * 4); + } + public static void npad(long struct, int index, int value) { + UNSAFE.putInt(null, struct + IOURingSQ.PAD + check(index, 2) * 4, value); + } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + IOURingSQ.KHEAD)); + check(memGetAddress(struct + IOURingSQ.KTAIL)); + check(memGetAddress(struct + IOURingSQ.KRING_MASK)); + check(memGetAddress(struct + IOURingSQ.KRING_ENTRIES)); + check(memGetAddress(struct + IOURingSQ.KFLAGS)); + check(memGetAddress(struct + IOURingSQ.KDROPPED)); + check(memGetAddress(struct + IOURingSQ.ARRAY)); + check(memGetAddress(struct + IOURingSQ.SQES)); + check(memGetAddress(struct + IOURingSQ.RING_PTR)); + } + + // ----------------------------------- + + /** An array of {@link IOURingSQ} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingSQ ELEMENT_FACTORY = IOURingSQ.create(-1L); + + /** + * Creates a new {@code IOURingSQ.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingSQ#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingSQ getElementFactory() { + return ELEMENT_FACTORY; + } + + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code khead} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer khead(int capacity) { return IOURingSQ.nkhead(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code ktail} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer ktail(int capacity) { return IOURingSQ.nktail(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@link IOURingSQ#kring_mask} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer kring_mask(int capacity) { return IOURingSQ.nkring_mask(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@link IOURingSQ#kring_entries} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer kring_entries(int capacity) { return IOURingSQ.nkring_entries(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code kflags} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer kflags(int capacity) { return IOURingSQ.nkflags(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code kdropped} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer kdropped(int capacity) { return IOURingSQ.nkdropped(address(), capacity); } + /** + * @return a {@link IntBuffer} view of the data pointed to by the {@code array} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("unsigned *") + public IntBuffer array(int capacity) { return IOURingSQ.narray(address(), capacity); } + /** @return a {@link IOURingSQE} view of the struct pointed to by the {@code sqes} field. */ + @NativeType("struct io_uring_sqe *") + public IOURingSQE sqes() { return IOURingSQ.nsqes(address()); } + /** @return the value of the {@code sqe_head} field. */ + @NativeType("unsigned") + public int sqe_head() { return IOURingSQ.nsqe_head(address()); } + /** @return the value of the {@code sqe_tail} field. */ + @NativeType("unsigned") + public int sqe_tail() { return IOURingSQ.nsqe_tail(address()); } + /** @return the value of the {@code ring_sz} field. */ + @NativeType("size_t") + public long ring_sz() { return IOURingSQ.nring_sz(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code ring_ptr} field. */ + @NativeType("void *") + public ByteBuffer ring_ptr() { return IOURingSQ.nring_ptr(address()); } + /** @return the value of the {@code ring_mask} field. */ + @NativeType("unsigned") + public int ring_mask() { return IOURingSQ.nring_mask(address()); } + /** @return the value of the {@code ring_entries} field. */ + @NativeType("unsigned") + public int ring_entries() { return IOURingSQ.nring_entries(address()); } + + /** Sets the address of the specified {@link IntBuffer} to the {@code khead} field. */ + public Buffer khead(@NativeType("unsigned *") IntBuffer value) { IOURingSQ.nkhead(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code ktail} field. */ + public Buffer ktail(@NativeType("unsigned *") IntBuffer value) { IOURingSQ.nktail(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@link IOURingSQ#kring_mask} field. */ + public Buffer kring_mask(@NativeType("unsigned *") IntBuffer value) { IOURingSQ.nkring_mask(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@link IOURingSQ#kring_entries} field. */ + public Buffer kring_entries(@NativeType("unsigned *") IntBuffer value) { IOURingSQ.nkring_entries(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code kflags} field. */ + public Buffer kflags(@NativeType("unsigned *") IntBuffer value) { IOURingSQ.nkflags(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code kdropped} field. */ + public Buffer kdropped(@NativeType("unsigned *") IntBuffer value) { IOURingSQ.nkdropped(address(), value); return this; } + /** Sets the address of the specified {@link IntBuffer} to the {@code array} field. */ + public Buffer array(@NativeType("unsigned *") IntBuffer value) { IOURingSQ.narray(address(), value); return this; } + /** Sets the address of the specified {@link IOURingSQE} to the {@code sqes} field. */ + public Buffer sqes(@NativeType("struct io_uring_sqe *") IOURingSQE value) { IOURingSQ.nsqes(address(), value); return this; } + /** Sets the specified value to the {@code sqe_head} field. */ + public Buffer sqe_head(@NativeType("unsigned") int value) { IOURingSQ.nsqe_head(address(), value); return this; } + /** Sets the specified value to the {@code sqe_tail} field. */ + public Buffer sqe_tail(@NativeType("unsigned") int value) { IOURingSQ.nsqe_tail(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code ring_ptr} field. */ + public Buffer ring_ptr(@NativeType("void *") ByteBuffer value) { IOURingSQ.nring_ptr(address(), value); return this; } + /** Sets the specified value to the {@code ring_mask} field. */ + public Buffer ring_mask(@NativeType("unsigned") int value) { IOURingSQ.nring_mask(address(), value); return this; } + /** Sets the specified value to the {@code ring_entries} field. */ + public Buffer ring_entries(@NativeType("unsigned") int value) { IOURingSQ.nring_entries(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSQE.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSQE.java new file mode 100644 index 000000000..18e062ae5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSQE.java @@ -0,0 +1,1080 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * IO submission data structure (Submission Queue Entry). + * + *

    Once the submission queue entry is initialized, I/O is submitted by placing the index of the submission queue entry into the tail of the submission + * queue. After one or more indexes are added to the queue, and the queue tail is advanced, the {@link LibURing#io_uring_enter enter} system call can be invoked to initiate the I/O.

    + * + *

    Layout

    + * + *
    
    + * struct io_uring_sqe {
    + *     __u8 {@link #opcode};
    + *     __u8 {@link #flags};
    + *     __u16 {@link #ioprio};
    + *     __s32 {@link #fd};
    + *     union {
    + *         __u64 {@link #off};
    + *         __u64 addr2;
    + *         struct {
    + *             __u32 cmd_op;
    + *             __u32 __pad1;
    + *         };
    + *     };
    + *     union {
    + *         __u64 {@link #addr};
    + *         __u64 splice_off_in;
    + *     };
    + *     __u32 {@link #len};
    + *     union {
    + *         __kernel_rwf_t {@link #rw_flags};
    + *         __u32 {@link #fsync_flags};
    + *         __u16 {@link #poll_events};
    + *         __u32 {@link #poll32_events};
    + *         __u32 sync_range_flags;
    + *         __u32 msg_flags;
    + *         __u32 timeout_flags;
    + *         __u32 accept_flags;
    + *         __u32 cancel_flags;
    + *         __u32 open_flags;
    + *         __u32 statx_flags;
    + *         __u32 fadvise_advice;
    + *         __u32 splice_flags;
    + *         __u32 rename_flags;
    + *         __u32 unlink_flags;
    + *         __u32 hardlink_flags;
    + *         __u32 xattr_flags;
    + *         __u32 msg_ring_flags;
    + *         __u32 uring_cmd_flags;
    + *     };
    + *     __u64 {@link #user_data};
    + *     union {
    + *         __u16 {@link #buf_index};
    + *         __u16 {@link #buf_group};
    + *     };
    + *     __u16 {@link #personality};
    + *     union {
    + *         __s32 splice_fd_in;
    + *         __u32 file_index;
    + *         struct {
    + *             __u16 addr_len;
    + *             __u16 __pad3[1];
    + *         };
    + *     };
    + *     union {
    + *         struct {
    + *             __u64 addr3;
    + *             __u64 __pad2[1];
    + *         };
    + *         __u8 {@link #cmd}[0];
    + *     };
    + * }
    + */ +@NativeType("struct io_uring_sqe") +public class IOURingSQE extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + OPCODE, + FLAGS, + IOPRIO, + FD, + OFF, + ADDR2, + CMD_OP, + __PAD1, + ADDR, + SPLICE_OFF_IN, + LEN, + RW_FLAGS, + FSYNC_FLAGS, + POLL_EVENTS, + POLL32_EVENTS, + SYNC_RANGE_FLAGS, + MSG_FLAGS, + TIMEOUT_FLAGS, + ACCEPT_FLAGS, + CANCEL_FLAGS, + OPEN_FLAGS, + STATX_FLAGS, + FADVISE_ADVICE, + SPLICE_FLAGS, + RENAME_FLAGS, + UNLINK_FLAGS, + HARDLINK_FLAGS, + XATTR_FLAGS, + MSG_RING_FLAGS, + URING_CMD_FLAGS, + USER_DATA, + BUF_INDEX, + BUF_GROUP, + PERSONALITY, + SPLICE_FD_IN, + FILE_INDEX, + ADDR_LEN, + __PAD3, + ADDR3, + __PAD2, + CMD; + + static { + Layout layout = __struct( + __member(1), + __member(1), + __member(2), + __member(4), + __union( + __member(8), + __member(8), + __struct( + __member(4), + __member(4) + ) + ), + __union( + __member(8), + __member(8) + ), + __member(4), + __union( + __member(4), + __member(4), + __member(2), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ), + __member(8), + __union( + __member(2), + __member(2) + ), + __member(2), + __union( + __member(4), + __member(4), + __struct( + __member(2), + __array(2, 1) + ) + ), + __union( + __struct( + __member(8), + __array(8, 1) + ), + __array(1, 0) + ) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + OPCODE = layout.offsetof(0); + FLAGS = layout.offsetof(1); + IOPRIO = layout.offsetof(2); + FD = layout.offsetof(3); + OFF = layout.offsetof(5); + ADDR2 = layout.offsetof(6); + CMD_OP = layout.offsetof(8); + __PAD1 = layout.offsetof(9); + ADDR = layout.offsetof(11); + SPLICE_OFF_IN = layout.offsetof(12); + LEN = layout.offsetof(13); + RW_FLAGS = layout.offsetof(15); + FSYNC_FLAGS = layout.offsetof(16); + POLL_EVENTS = layout.offsetof(17); + POLL32_EVENTS = layout.offsetof(18); + SYNC_RANGE_FLAGS = layout.offsetof(19); + MSG_FLAGS = layout.offsetof(20); + TIMEOUT_FLAGS = layout.offsetof(21); + ACCEPT_FLAGS = layout.offsetof(22); + CANCEL_FLAGS = layout.offsetof(23); + OPEN_FLAGS = layout.offsetof(24); + STATX_FLAGS = layout.offsetof(25); + FADVISE_ADVICE = layout.offsetof(26); + SPLICE_FLAGS = layout.offsetof(27); + RENAME_FLAGS = layout.offsetof(28); + UNLINK_FLAGS = layout.offsetof(29); + HARDLINK_FLAGS = layout.offsetof(30); + XATTR_FLAGS = layout.offsetof(31); + MSG_RING_FLAGS = layout.offsetof(32); + URING_CMD_FLAGS = layout.offsetof(33); + USER_DATA = layout.offsetof(34); + BUF_INDEX = layout.offsetof(36); + BUF_GROUP = layout.offsetof(37); + PERSONALITY = layout.offsetof(38); + SPLICE_FD_IN = layout.offsetof(40); + FILE_INDEX = layout.offsetof(41); + ADDR_LEN = layout.offsetof(43); + __PAD3 = layout.offsetof(44); + ADDR3 = layout.offsetof(47); + __PAD2 = layout.offsetof(48); + CMD = layout.offsetof(49); + } + + protected IOURingSQE(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingSQE create(long address, @Nullable ByteBuffer container) { + return new IOURingSQE(address, container); + } + + /** + * Creates a {@code IOURingSQE} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingSQE(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** type of operation for this sqe */ + @NativeType("__u8") + public byte opcode() { return nopcode(address()); } + /** {@code IOSQE_} flags. One or more of:
    {@link LibIOURing#IOSQE_FIXED_FILE_BIT}{@link LibIOURing#IOSQE_IO_DRAIN_BIT}{@link LibIOURing#IOSQE_IO_LINK_BIT}{@link LibIOURing#IOSQE_IO_HARDLINK_BIT}
    {@link LibIOURing#IOSQE_ASYNC_BIT}{@link LibIOURing#IOSQE_BUFFER_SELECT_BIT}{@link LibIOURing#IOSQE_CQE_SKIP_SUCCESS_BIT}{@link LibIOURing#IOSQE_FIXED_FILE}
    {@link LibIOURing#IOSQE_IO_DRAIN}{@link LibIOURing#IOSQE_IO_LINK}{@link LibIOURing#IOSQE_IO_HARDLINK}{@link LibIOURing#IOSQE_ASYNC}
    {@link LibIOURing#IOSQE_BUFFER_SELECT}{@link LibIOURing#IOSQE_CQE_SKIP_SUCCESS}
    */ + @NativeType("__u8") + public byte flags() { return nflags(address()); } + /** specifies the I/O priority. See {@code ioprio_get(2)} for a description of Linux I/O priorities. */ + @NativeType("__u16") + public short ioprio() { return nioprio(address()); } + /** specifies the file descriptor against which the operation will be performed */ + @NativeType("__s32") + public int fd() { return nfd(address()); } + /** offset into file */ + @NativeType("__u64") + public long off() { return noff(address()); } + /** @return the value of the {@code addr2} field. */ + @NativeType("__u64") + public long addr2() { return naddr2(address()); } + /** @return the value of the {@code cmd_op} field. */ + @NativeType("__u32") + public int cmd_op() { return ncmd_op(address()); } + /** @return the value of the {@code __pad1} field. */ + @NativeType("__u32") + public int __pad1() { return n__pad1(address()); } + /** pointer to buffer or {@code iovecs} */ + @NativeType("__u64") + public long addr() { return naddr(address()); } + /** @return the value of the {@code splice_off_in} field. */ + @NativeType("__u64") + public long splice_off_in() { return nsplice_off_in(address()); } + /** buffer size or number of {@code iovecs} */ + @NativeType("__u32") + public int len() { return nlen(address()); } + /** specified for read and write operations, contains a bitwise OR of per-I/O flags, as described in the {@code preadv2(2)} man page */ + @NativeType("__kernel_rwf_t") + public int rw_flags() { return nrw_flags(address()); } + /** + * may contain either 0, for a normal file integrity sync, or {@link LibIOURing#IORING_FSYNC_DATASYNC FSYNC_DATASYNC} to provide data sync only semantics. + * + *

    See the descriptions of {@code O_SYNC} and {@code O_DSYNC} in the {@code open(2)} manual page for more information.

    + */ + @NativeType("__u32") + public int fsync_flags() { return nfsync_flags(address()); } + /** the bits that may be set in {@code poll_events} are defined in {@code }, and documented in {@code poll(2)} */ + @NativeType("__u16") + public short poll_events() { return npoll_events(address()); } + /** word-reversed for BE */ + @NativeType("__u32") + public int poll32_events() { return npoll32_events(address()); } + /** @return the value of the {@code sync_range_flags} field. */ + @NativeType("__u32") + public int sync_range_flags() { return nsync_range_flags(address()); } + /** @return the value of the {@code msg_flags} field. */ + @NativeType("__u32") + public int msg_flags() { return nmsg_flags(address()); } + /** @return the value of the {@code timeout_flags} field. */ + @NativeType("__u32") + public int timeout_flags() { return ntimeout_flags(address()); } + /** @return the value of the {@code accept_flags} field. */ + @NativeType("__u32") + public int accept_flags() { return naccept_flags(address()); } + /** @return the value of the {@code cancel_flags} field. */ + @NativeType("__u32") + public int cancel_flags() { return ncancel_flags(address()); } + /** @return the value of the {@code open_flags} field. */ + @NativeType("__u32") + public int open_flags() { return nopen_flags(address()); } + /** @return the value of the {@code statx_flags} field. */ + @NativeType("__u32") + public int statx_flags() { return nstatx_flags(address()); } + /** @return the value of the {@code fadvise_advice} field. */ + @NativeType("__u32") + public int fadvise_advice() { return nfadvise_advice(address()); } + /** @return the value of the {@code splice_flags} field. */ + @NativeType("__u32") + public int splice_flags() { return nsplice_flags(address()); } + /** @return the value of the {@code rename_flags} field. */ + @NativeType("__u32") + public int rename_flags() { return nrename_flags(address()); } + /** @return the value of the {@code unlink_flags} field. */ + @NativeType("__u32") + public int unlink_flags() { return nunlink_flags(address()); } + /** @return the value of the {@code hardlink_flags} field. */ + @NativeType("__u32") + public int hardlink_flags() { return nhardlink_flags(address()); } + /** @return the value of the {@code xattr_flags} field. */ + @NativeType("__u32") + public int xattr_flags() { return nxattr_flags(address()); } + /** @return the value of the {@code msg_ring_flags} field. */ + @NativeType("__u32") + public int msg_ring_flags() { return nmsg_ring_flags(address()); } + /** @return the value of the {@code uring_cmd_flags} field. */ + @NativeType("__u32") + public int uring_cmd_flags() { return nuring_cmd_flags(address()); } + /** an application-supplied value that will be copied into the completion queue entry */ + @NativeType("__u64") + public long user_data() { return nuser_data(address()); } + /** an index into an array of fixed buffers, and is only valid if fixed buffers were registered */ + @NativeType("__u16") + public short buf_index() { return nbuf_index(address()); } + /** for grouped buffer selection */ + @NativeType("__u16") + public short buf_group() { return nbuf_group(address()); } + /** + * the credentials id to use for this operation. + * + *

    See {@link LibURing#io_uring_register register} for how to register personalities with {@code io_uring}. If set to 0, the current personality of the submitting task is used.

    + */ + @NativeType("__u16") + public short personality() { return npersonality(address()); } + /** @return the value of the {@code splice_fd_in} field. */ + @NativeType("__s32") + public int splice_fd_in() { return nsplice_fd_in(address()); } + /** @return the value of the {@code file_index} field. */ + @NativeType("__u32") + public int file_index() { return nfile_index(address()); } + /** @return the value of the {@code addr_len} field. */ + @NativeType("__u16") + public short addr_len() { return naddr_len(address()); } + /** @return a {@link ShortBuffer} view of the {@code __pad3} field. */ + @NativeType("__u16[1]") + public ShortBuffer __pad3() { return n__pad3(address()); } + /** @return the value at the specified index of the {@code __pad3} field. */ + @NativeType("__u16") + public short __pad3(int index) { return n__pad3(address(), index); } + /** @return the value of the {@code addr3} field. */ + @NativeType("__u64") + public long addr3() { return naddr3(address()); } + /** @return a {@link LongBuffer} view of the {@code __pad2} field. */ + @NativeType("__u64[1]") + public LongBuffer __pad2() { return n__pad2(address()); } + /** @return the value at the specified index of the {@code __pad2} field. */ + @NativeType("__u64") + public long __pad2(int index) { return n__pad2(address(), index); } + /** If the ring is initialized with {@link LibIOURing#IORING_SETUP_SQE128 SETUP_SQE128}, then this field is used for 80 bytes of arbitrary command data */ + @NativeType("__u8[0]") + public ByteBuffer cmd() { return ncmd(address()); } + /** If the ring is initialized with {@link LibIOURing#IORING_SETUP_SQE128 SETUP_SQE128}, then this field is used for 80 bytes of arbitrary command data */ + @NativeType("__u8") + public byte cmd(int index) { return ncmd(address(), index); } + + /** Sets the specified value to the {@link #opcode} field. */ + public IOURingSQE opcode(@NativeType("__u8") byte value) { nopcode(address(), value); return this; } + /** Sets the specified value to the {@link #flags} field. */ + public IOURingSQE flags(@NativeType("__u8") byte value) { nflags(address(), value); return this; } + /** Sets the specified value to the {@link #ioprio} field. */ + public IOURingSQE ioprio(@NativeType("__u16") short value) { nioprio(address(), value); return this; } + /** Sets the specified value to the {@link #fd} field. */ + public IOURingSQE fd(@NativeType("__s32") int value) { nfd(address(), value); return this; } + /** Sets the specified value to the {@link #off} field. */ + public IOURingSQE off(@NativeType("__u64") long value) { noff(address(), value); return this; } + /** Sets the specified value to the {@code addr2} field. */ + public IOURingSQE addr2(@NativeType("__u64") long value) { naddr2(address(), value); return this; } + /** Sets the specified value to the {@code cmd_op} field. */ + public IOURingSQE cmd_op(@NativeType("__u32") int value) { ncmd_op(address(), value); return this; } + /** Sets the specified value to the {@code __pad1} field. */ + public IOURingSQE __pad1(@NativeType("__u32") int value) { n__pad1(address(), value); return this; } + /** Sets the specified value to the {@link #addr} field. */ + public IOURingSQE addr(@NativeType("__u64") long value) { naddr(address(), value); return this; } + /** Sets the specified value to the {@code splice_off_in} field. */ + public IOURingSQE splice_off_in(@NativeType("__u64") long value) { nsplice_off_in(address(), value); return this; } + /** Sets the specified value to the {@link #len} field. */ + public IOURingSQE len(@NativeType("__u32") int value) { nlen(address(), value); return this; } + /** Sets the specified value to the {@link #rw_flags} field. */ + public IOURingSQE rw_flags(@NativeType("__kernel_rwf_t") int value) { nrw_flags(address(), value); return this; } + /** Sets the specified value to the {@link #fsync_flags} field. */ + public IOURingSQE fsync_flags(@NativeType("__u32") int value) { nfsync_flags(address(), value); return this; } + /** Sets the specified value to the {@link #poll_events} field. */ + public IOURingSQE poll_events(@NativeType("__u16") short value) { npoll_events(address(), value); return this; } + /** Sets the specified value to the {@link #poll32_events} field. */ + public IOURingSQE poll32_events(@NativeType("__u32") int value) { npoll32_events(address(), value); return this; } + /** Sets the specified value to the {@code sync_range_flags} field. */ + public IOURingSQE sync_range_flags(@NativeType("__u32") int value) { nsync_range_flags(address(), value); return this; } + /** Sets the specified value to the {@code msg_flags} field. */ + public IOURingSQE msg_flags(@NativeType("__u32") int value) { nmsg_flags(address(), value); return this; } + /** Sets the specified value to the {@code timeout_flags} field. */ + public IOURingSQE timeout_flags(@NativeType("__u32") int value) { ntimeout_flags(address(), value); return this; } + /** Sets the specified value to the {@code accept_flags} field. */ + public IOURingSQE accept_flags(@NativeType("__u32") int value) { naccept_flags(address(), value); return this; } + /** Sets the specified value to the {@code cancel_flags} field. */ + public IOURingSQE cancel_flags(@NativeType("__u32") int value) { ncancel_flags(address(), value); return this; } + /** Sets the specified value to the {@code open_flags} field. */ + public IOURingSQE open_flags(@NativeType("__u32") int value) { nopen_flags(address(), value); return this; } + /** Sets the specified value to the {@code statx_flags} field. */ + public IOURingSQE statx_flags(@NativeType("__u32") int value) { nstatx_flags(address(), value); return this; } + /** Sets the specified value to the {@code fadvise_advice} field. */ + public IOURingSQE fadvise_advice(@NativeType("__u32") int value) { nfadvise_advice(address(), value); return this; } + /** Sets the specified value to the {@code splice_flags} field. */ + public IOURingSQE splice_flags(@NativeType("__u32") int value) { nsplice_flags(address(), value); return this; } + /** Sets the specified value to the {@code rename_flags} field. */ + public IOURingSQE rename_flags(@NativeType("__u32") int value) { nrename_flags(address(), value); return this; } + /** Sets the specified value to the {@code unlink_flags} field. */ + public IOURingSQE unlink_flags(@NativeType("__u32") int value) { nunlink_flags(address(), value); return this; } + /** Sets the specified value to the {@code hardlink_flags} field. */ + public IOURingSQE hardlink_flags(@NativeType("__u32") int value) { nhardlink_flags(address(), value); return this; } + /** Sets the specified value to the {@code xattr_flags} field. */ + public IOURingSQE xattr_flags(@NativeType("__u32") int value) { nxattr_flags(address(), value); return this; } + /** Sets the specified value to the {@code msg_ring_flags} field. */ + public IOURingSQE msg_ring_flags(@NativeType("__u32") int value) { nmsg_ring_flags(address(), value); return this; } + /** Sets the specified value to the {@code uring_cmd_flags} field. */ + public IOURingSQE uring_cmd_flags(@NativeType("__u32") int value) { nuring_cmd_flags(address(), value); return this; } + /** Sets the specified value to the {@link #user_data} field. */ + public IOURingSQE user_data(@NativeType("__u64") long value) { nuser_data(address(), value); return this; } + /** Sets the specified value to the {@link #buf_index} field. */ + public IOURingSQE buf_index(@NativeType("__u16") short value) { nbuf_index(address(), value); return this; } + /** Sets the specified value to the {@link #buf_group} field. */ + public IOURingSQE buf_group(@NativeType("__u16") short value) { nbuf_group(address(), value); return this; } + /** Sets the specified value to the {@link #personality} field. */ + public IOURingSQE personality(@NativeType("__u16") short value) { npersonality(address(), value); return this; } + /** Sets the specified value to the {@code splice_fd_in} field. */ + public IOURingSQE splice_fd_in(@NativeType("__s32") int value) { nsplice_fd_in(address(), value); return this; } + /** Sets the specified value to the {@code file_index} field. */ + public IOURingSQE file_index(@NativeType("__u32") int value) { nfile_index(address(), value); return this; } + /** Sets the specified value to the {@code addr_len} field. */ + public IOURingSQE addr_len(@NativeType("__u16") short value) { naddr_len(address(), value); return this; } + /** Copies the specified {@link ShortBuffer} to the {@code __pad3} field. */ + public IOURingSQE __pad3(@NativeType("__u16[1]") ShortBuffer value) { n__pad3(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code __pad3} field. */ + public IOURingSQE __pad3(int index, @NativeType("__u16") short value) { n__pad3(address(), index, value); return this; } + /** Sets the specified value to the {@code addr3} field. */ + public IOURingSQE addr3(@NativeType("__u64") long value) { naddr3(address(), value); return this; } + /** Copies the specified {@link LongBuffer} to the {@code __pad2} field. */ + public IOURingSQE __pad2(@NativeType("__u64[1]") LongBuffer value) { n__pad2(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code __pad2} field. */ + public IOURingSQE __pad2(int index, @NativeType("__u64") long value) { n__pad2(address(), index, value); return this; } + /** Copies the specified {@link ByteBuffer} to the {@link #cmd} field. */ + public IOURingSQE cmd(@NativeType("__u8[0]") ByteBuffer value) { ncmd(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link #cmd} field. */ + public IOURingSQE cmd(int index, @NativeType("__u8") byte value) { ncmd(address(), index, value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingSQE set(IOURingSQE src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingSQE} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingSQE malloc() { + return new IOURingSQE(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingSQE} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingSQE calloc() { + return new IOURingSQE(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingSQE} instance allocated with {@link BufferUtils}. */ + public static IOURingSQE create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingSQE(memAddress(container), container); + } + + /** Returns a new {@code IOURingSQE} instance for the specified memory address. */ + public static IOURingSQE create(long address) { + return new IOURingSQE(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingSQE createSafe(long address) { + return address == NULL ? null : new IOURingSQE(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingSQE} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingSQE malloc(MemoryStack stack) { + return new IOURingSQE(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingSQE} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingSQE calloc(MemoryStack stack) { + return new IOURingSQE(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #opcode}. */ + public static byte nopcode(long struct) { return UNSAFE.getByte(null, struct + IOURingSQE.OPCODE); } + /** Unsafe version of {@link #flags}. */ + public static byte nflags(long struct) { return UNSAFE.getByte(null, struct + IOURingSQE.FLAGS); } + /** Unsafe version of {@link #ioprio}. */ + public static short nioprio(long struct) { return UNSAFE.getShort(null, struct + IOURingSQE.IOPRIO); } + /** Unsafe version of {@link #fd}. */ + public static int nfd(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.FD); } + /** Unsafe version of {@link #off}. */ + public static long noff(long struct) { return UNSAFE.getLong(null, struct + IOURingSQE.OFF); } + /** Unsafe version of {@link #addr2}. */ + public static long naddr2(long struct) { return UNSAFE.getLong(null, struct + IOURingSQE.ADDR2); } + /** Unsafe version of {@link #cmd_op}. */ + public static int ncmd_op(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.CMD_OP); } + public static int n__pad1(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.__PAD1); } + /** Unsafe version of {@link #addr}. */ + public static long naddr(long struct) { return UNSAFE.getLong(null, struct + IOURingSQE.ADDR); } + /** Unsafe version of {@link #splice_off_in}. */ + public static long nsplice_off_in(long struct) { return UNSAFE.getLong(null, struct + IOURingSQE.SPLICE_OFF_IN); } + /** Unsafe version of {@link #len}. */ + public static int nlen(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.LEN); } + /** Unsafe version of {@link #rw_flags}. */ + public static int nrw_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.RW_FLAGS); } + /** Unsafe version of {@link #fsync_flags}. */ + public static int nfsync_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.FSYNC_FLAGS); } + /** Unsafe version of {@link #poll_events}. */ + public static short npoll_events(long struct) { return UNSAFE.getShort(null, struct + IOURingSQE.POLL_EVENTS); } + /** Unsafe version of {@link #poll32_events}. */ + public static int npoll32_events(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.POLL32_EVENTS); } + /** Unsafe version of {@link #sync_range_flags}. */ + public static int nsync_range_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.SYNC_RANGE_FLAGS); } + /** Unsafe version of {@link #msg_flags}. */ + public static int nmsg_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.MSG_FLAGS); } + /** Unsafe version of {@link #timeout_flags}. */ + public static int ntimeout_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.TIMEOUT_FLAGS); } + /** Unsafe version of {@link #accept_flags}. */ + public static int naccept_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.ACCEPT_FLAGS); } + /** Unsafe version of {@link #cancel_flags}. */ + public static int ncancel_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.CANCEL_FLAGS); } + /** Unsafe version of {@link #open_flags}. */ + public static int nopen_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.OPEN_FLAGS); } + /** Unsafe version of {@link #statx_flags}. */ + public static int nstatx_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.STATX_FLAGS); } + /** Unsafe version of {@link #fadvise_advice}. */ + public static int nfadvise_advice(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.FADVISE_ADVICE); } + /** Unsafe version of {@link #splice_flags}. */ + public static int nsplice_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.SPLICE_FLAGS); } + /** Unsafe version of {@link #rename_flags}. */ + public static int nrename_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.RENAME_FLAGS); } + /** Unsafe version of {@link #unlink_flags}. */ + public static int nunlink_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.UNLINK_FLAGS); } + /** Unsafe version of {@link #hardlink_flags}. */ + public static int nhardlink_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.HARDLINK_FLAGS); } + /** Unsafe version of {@link #xattr_flags}. */ + public static int nxattr_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.XATTR_FLAGS); } + /** Unsafe version of {@link #msg_ring_flags}. */ + public static int nmsg_ring_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.MSG_RING_FLAGS); } + /** Unsafe version of {@link #uring_cmd_flags}. */ + public static int nuring_cmd_flags(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.URING_CMD_FLAGS); } + /** Unsafe version of {@link #user_data}. */ + public static long nuser_data(long struct) { return UNSAFE.getLong(null, struct + IOURingSQE.USER_DATA); } + /** Unsafe version of {@link #buf_index}. */ + public static short nbuf_index(long struct) { return UNSAFE.getShort(null, struct + IOURingSQE.BUF_INDEX); } + /** Unsafe version of {@link #buf_group}. */ + public static short nbuf_group(long struct) { return UNSAFE.getShort(null, struct + IOURingSQE.BUF_GROUP); } + /** Unsafe version of {@link #personality}. */ + public static short npersonality(long struct) { return UNSAFE.getShort(null, struct + IOURingSQE.PERSONALITY); } + /** Unsafe version of {@link #splice_fd_in}. */ + public static int nsplice_fd_in(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.SPLICE_FD_IN); } + /** Unsafe version of {@link #file_index}. */ + public static int nfile_index(long struct) { return UNSAFE.getInt(null, struct + IOURingSQE.FILE_INDEX); } + /** Unsafe version of {@link #addr_len}. */ + public static short naddr_len(long struct) { return UNSAFE.getShort(null, struct + IOURingSQE.ADDR_LEN); } + public static ShortBuffer n__pad3(long struct) { return memShortBuffer(struct + IOURingSQE.__PAD3, 1); } + public static short n__pad3(long struct, int index) { + return UNSAFE.getShort(null, struct + IOURingSQE.__PAD3 + check(index, 1) * 2); + } + /** Unsafe version of {@link #addr3}. */ + public static long naddr3(long struct) { return UNSAFE.getLong(null, struct + IOURingSQE.ADDR3); } + public static LongBuffer n__pad2(long struct) { return memLongBuffer(struct + IOURingSQE.__PAD2, 1); } + public static long n__pad2(long struct, int index) { + return UNSAFE.getLong(null, struct + IOURingSQE.__PAD2 + check(index, 1) * 8); + } + /** Unsafe version of {@link #cmd}. */ + public static ByteBuffer ncmd(long struct) { return memByteBuffer(struct + IOURingSQE.CMD, 0); } + /** Unsafe version of {@link #cmd(int) cmd}. */ + public static byte ncmd(long struct, int index) { + return UNSAFE.getByte(null, struct + IOURingSQE.CMD + check(index, 0) * 1); + } + + /** Unsafe version of {@link #opcode(byte) opcode}. */ + public static void nopcode(long struct, byte value) { UNSAFE.putByte(null, struct + IOURingSQE.OPCODE, value); } + /** Unsafe version of {@link #flags(byte) flags}. */ + public static void nflags(long struct, byte value) { UNSAFE.putByte(null, struct + IOURingSQE.FLAGS, value); } + /** Unsafe version of {@link #ioprio(short) ioprio}. */ + public static void nioprio(long struct, short value) { UNSAFE.putShort(null, struct + IOURingSQE.IOPRIO, value); } + /** Unsafe version of {@link #fd(int) fd}. */ + public static void nfd(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.FD, value); } + /** Unsafe version of {@link #off(long) off}. */ + public static void noff(long struct, long value) { UNSAFE.putLong(null, struct + IOURingSQE.OFF, value); } + /** Unsafe version of {@link #addr2(long) addr2}. */ + public static void naddr2(long struct, long value) { UNSAFE.putLong(null, struct + IOURingSQE.ADDR2, value); } + /** Unsafe version of {@link #cmd_op(int) cmd_op}. */ + public static void ncmd_op(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.CMD_OP, value); } + public static void n__pad1(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.__PAD1, value); } + /** Unsafe version of {@link #addr(long) addr}. */ + public static void naddr(long struct, long value) { UNSAFE.putLong(null, struct + IOURingSQE.ADDR, value); } + /** Unsafe version of {@link #splice_off_in(long) splice_off_in}. */ + public static void nsplice_off_in(long struct, long value) { UNSAFE.putLong(null, struct + IOURingSQE.SPLICE_OFF_IN, value); } + /** Unsafe version of {@link #len(int) len}. */ + public static void nlen(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.LEN, value); } + /** Unsafe version of {@link #rw_flags(int) rw_flags}. */ + public static void nrw_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.RW_FLAGS, value); } + /** Unsafe version of {@link #fsync_flags(int) fsync_flags}. */ + public static void nfsync_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.FSYNC_FLAGS, value); } + /** Unsafe version of {@link #poll_events(short) poll_events}. */ + public static void npoll_events(long struct, short value) { UNSAFE.putShort(null, struct + IOURingSQE.POLL_EVENTS, value); } + /** Unsafe version of {@link #poll32_events(int) poll32_events}. */ + public static void npoll32_events(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.POLL32_EVENTS, value); } + /** Unsafe version of {@link #sync_range_flags(int) sync_range_flags}. */ + public static void nsync_range_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.SYNC_RANGE_FLAGS, value); } + /** Unsafe version of {@link #msg_flags(int) msg_flags}. */ + public static void nmsg_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.MSG_FLAGS, value); } + /** Unsafe version of {@link #timeout_flags(int) timeout_flags}. */ + public static void ntimeout_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.TIMEOUT_FLAGS, value); } + /** Unsafe version of {@link #accept_flags(int) accept_flags}. */ + public static void naccept_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.ACCEPT_FLAGS, value); } + /** Unsafe version of {@link #cancel_flags(int) cancel_flags}. */ + public static void ncancel_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.CANCEL_FLAGS, value); } + /** Unsafe version of {@link #open_flags(int) open_flags}. */ + public static void nopen_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.OPEN_FLAGS, value); } + /** Unsafe version of {@link #statx_flags(int) statx_flags}. */ + public static void nstatx_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.STATX_FLAGS, value); } + /** Unsafe version of {@link #fadvise_advice(int) fadvise_advice}. */ + public static void nfadvise_advice(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.FADVISE_ADVICE, value); } + /** Unsafe version of {@link #splice_flags(int) splice_flags}. */ + public static void nsplice_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.SPLICE_FLAGS, value); } + /** Unsafe version of {@link #rename_flags(int) rename_flags}. */ + public static void nrename_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.RENAME_FLAGS, value); } + /** Unsafe version of {@link #unlink_flags(int) unlink_flags}. */ + public static void nunlink_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.UNLINK_FLAGS, value); } + /** Unsafe version of {@link #hardlink_flags(int) hardlink_flags}. */ + public static void nhardlink_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.HARDLINK_FLAGS, value); } + /** Unsafe version of {@link #xattr_flags(int) xattr_flags}. */ + public static void nxattr_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.XATTR_FLAGS, value); } + /** Unsafe version of {@link #msg_ring_flags(int) msg_ring_flags}. */ + public static void nmsg_ring_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.MSG_RING_FLAGS, value); } + /** Unsafe version of {@link #uring_cmd_flags(int) uring_cmd_flags}. */ + public static void nuring_cmd_flags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.URING_CMD_FLAGS, value); } + /** Unsafe version of {@link #user_data(long) user_data}. */ + public static void nuser_data(long struct, long value) { UNSAFE.putLong(null, struct + IOURingSQE.USER_DATA, value); } + /** Unsafe version of {@link #buf_index(short) buf_index}. */ + public static void nbuf_index(long struct, short value) { UNSAFE.putShort(null, struct + IOURingSQE.BUF_INDEX, value); } + /** Unsafe version of {@link #buf_group(short) buf_group}. */ + public static void nbuf_group(long struct, short value) { UNSAFE.putShort(null, struct + IOURingSQE.BUF_GROUP, value); } + /** Unsafe version of {@link #personality(short) personality}. */ + public static void npersonality(long struct, short value) { UNSAFE.putShort(null, struct + IOURingSQE.PERSONALITY, value); } + /** Unsafe version of {@link #splice_fd_in(int) splice_fd_in}. */ + public static void nsplice_fd_in(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.SPLICE_FD_IN, value); } + /** Unsafe version of {@link #file_index(int) file_index}. */ + public static void nfile_index(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSQE.FILE_INDEX, value); } + /** Unsafe version of {@link #addr_len(short) addr_len}. */ + public static void naddr_len(long struct, short value) { UNSAFE.putShort(null, struct + IOURingSQE.ADDR_LEN, value); } + public static void n__pad3(long struct, ShortBuffer value) { + if (CHECKS) { checkGT(value, 1); } + memCopy(memAddress(value), struct + IOURingSQE.__PAD3, value.remaining() * 2); + } + public static void n__pad3(long struct, int index, short value) { + UNSAFE.putShort(null, struct + IOURingSQE.__PAD3 + check(index, 1) * 2, value); + } + /** Unsafe version of {@link #addr3(long) addr3}. */ + public static void naddr3(long struct, long value) { UNSAFE.putLong(null, struct + IOURingSQE.ADDR3, value); } + public static void n__pad2(long struct, LongBuffer value) { + if (CHECKS) { checkGT(value, 1); } + memCopy(memAddress(value), struct + IOURingSQE.__PAD2, value.remaining() * 8); + } + public static void n__pad2(long struct, int index, long value) { + UNSAFE.putLong(null, struct + IOURingSQE.__PAD2 + check(index, 1) * 8, value); + } + /** Unsafe version of {@link #cmd(ByteBuffer) cmd}. */ + public static void ncmd(long struct, ByteBuffer value) { + if (CHECKS) { checkGT(value, 0); } + memCopy(memAddress(value), struct + IOURingSQE.CMD, value.remaining() * 1); + } + /** Unsafe version of {@link #cmd(int, byte) cmd}. */ + public static void ncmd(long struct, int index, byte value) { + UNSAFE.putByte(null, struct + IOURingSQE.CMD + check(index, 0) * 1, value); + } + + // ----------------------------------- + + /** An array of {@link IOURingSQE} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingSQE ELEMENT_FACTORY = IOURingSQE.create(-1L); + + /** + * Creates a new {@code IOURingSQE.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingSQE#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingSQE getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link IOURingSQE#opcode} field. */ + @NativeType("__u8") + public byte opcode() { return IOURingSQE.nopcode(address()); } + /** @return the value of the {@link IOURingSQE#flags} field. */ + @NativeType("__u8") + public byte flags() { return IOURingSQE.nflags(address()); } + /** @return the value of the {@link IOURingSQE#ioprio} field. */ + @NativeType("__u16") + public short ioprio() { return IOURingSQE.nioprio(address()); } + /** @return the value of the {@link IOURingSQE#fd} field. */ + @NativeType("__s32") + public int fd() { return IOURingSQE.nfd(address()); } + /** @return the value of the {@link IOURingSQE#off} field. */ + @NativeType("__u64") + public long off() { return IOURingSQE.noff(address()); } + /** @return the value of the {@code addr2} field. */ + @NativeType("__u64") + public long addr2() { return IOURingSQE.naddr2(address()); } + /** @return the value of the {@code cmd_op} field. */ + @NativeType("__u32") + public int cmd_op() { return IOURingSQE.ncmd_op(address()); } + /** @return the value of the {@code __pad1} field. */ + @NativeType("__u32") + public int __pad1() { return IOURingSQE.n__pad1(address()); } + /** @return the value of the {@link IOURingSQE#addr} field. */ + @NativeType("__u64") + public long addr() { return IOURingSQE.naddr(address()); } + /** @return the value of the {@code splice_off_in} field. */ + @NativeType("__u64") + public long splice_off_in() { return IOURingSQE.nsplice_off_in(address()); } + /** @return the value of the {@link IOURingSQE#len} field. */ + @NativeType("__u32") + public int len() { return IOURingSQE.nlen(address()); } + /** @return the value of the {@link IOURingSQE#rw_flags} field. */ + @NativeType("__kernel_rwf_t") + public int rw_flags() { return IOURingSQE.nrw_flags(address()); } + /** @return the value of the {@link IOURingSQE#fsync_flags} field. */ + @NativeType("__u32") + public int fsync_flags() { return IOURingSQE.nfsync_flags(address()); } + /** @return the value of the {@link IOURingSQE#poll_events} field. */ + @NativeType("__u16") + public short poll_events() { return IOURingSQE.npoll_events(address()); } + /** @return the value of the {@link IOURingSQE#poll32_events} field. */ + @NativeType("__u32") + public int poll32_events() { return IOURingSQE.npoll32_events(address()); } + /** @return the value of the {@code sync_range_flags} field. */ + @NativeType("__u32") + public int sync_range_flags() { return IOURingSQE.nsync_range_flags(address()); } + /** @return the value of the {@code msg_flags} field. */ + @NativeType("__u32") + public int msg_flags() { return IOURingSQE.nmsg_flags(address()); } + /** @return the value of the {@code timeout_flags} field. */ + @NativeType("__u32") + public int timeout_flags() { return IOURingSQE.ntimeout_flags(address()); } + /** @return the value of the {@code accept_flags} field. */ + @NativeType("__u32") + public int accept_flags() { return IOURingSQE.naccept_flags(address()); } + /** @return the value of the {@code cancel_flags} field. */ + @NativeType("__u32") + public int cancel_flags() { return IOURingSQE.ncancel_flags(address()); } + /** @return the value of the {@code open_flags} field. */ + @NativeType("__u32") + public int open_flags() { return IOURingSQE.nopen_flags(address()); } + /** @return the value of the {@code statx_flags} field. */ + @NativeType("__u32") + public int statx_flags() { return IOURingSQE.nstatx_flags(address()); } + /** @return the value of the {@code fadvise_advice} field. */ + @NativeType("__u32") + public int fadvise_advice() { return IOURingSQE.nfadvise_advice(address()); } + /** @return the value of the {@code splice_flags} field. */ + @NativeType("__u32") + public int splice_flags() { return IOURingSQE.nsplice_flags(address()); } + /** @return the value of the {@code rename_flags} field. */ + @NativeType("__u32") + public int rename_flags() { return IOURingSQE.nrename_flags(address()); } + /** @return the value of the {@code unlink_flags} field. */ + @NativeType("__u32") + public int unlink_flags() { return IOURingSQE.nunlink_flags(address()); } + /** @return the value of the {@code hardlink_flags} field. */ + @NativeType("__u32") + public int hardlink_flags() { return IOURingSQE.nhardlink_flags(address()); } + /** @return the value of the {@code xattr_flags} field. */ + @NativeType("__u32") + public int xattr_flags() { return IOURingSQE.nxattr_flags(address()); } + /** @return the value of the {@code msg_ring_flags} field. */ + @NativeType("__u32") + public int msg_ring_flags() { return IOURingSQE.nmsg_ring_flags(address()); } + /** @return the value of the {@code uring_cmd_flags} field. */ + @NativeType("__u32") + public int uring_cmd_flags() { return IOURingSQE.nuring_cmd_flags(address()); } + /** @return the value of the {@link IOURingSQE#user_data} field. */ + @NativeType("__u64") + public long user_data() { return IOURingSQE.nuser_data(address()); } + /** @return the value of the {@link IOURingSQE#buf_index} field. */ + @NativeType("__u16") + public short buf_index() { return IOURingSQE.nbuf_index(address()); } + /** @return the value of the {@link IOURingSQE#buf_group} field. */ + @NativeType("__u16") + public short buf_group() { return IOURingSQE.nbuf_group(address()); } + /** @return the value of the {@link IOURingSQE#personality} field. */ + @NativeType("__u16") + public short personality() { return IOURingSQE.npersonality(address()); } + /** @return the value of the {@code splice_fd_in} field. */ + @NativeType("__s32") + public int splice_fd_in() { return IOURingSQE.nsplice_fd_in(address()); } + /** @return the value of the {@code file_index} field. */ + @NativeType("__u32") + public int file_index() { return IOURingSQE.nfile_index(address()); } + /** @return the value of the {@code addr_len} field. */ + @NativeType("__u16") + public short addr_len() { return IOURingSQE.naddr_len(address()); } + /** @return a {@link ShortBuffer} view of the {@code __pad3} field. */ + @NativeType("__u16[1]") + public ShortBuffer __pad3() { return IOURingSQE.n__pad3(address()); } + /** @return the value at the specified index of the {@code __pad3} field. */ + @NativeType("__u16") + public short __pad3(int index) { return IOURingSQE.n__pad3(address(), index); } + /** @return the value of the {@code addr3} field. */ + @NativeType("__u64") + public long addr3() { return IOURingSQE.naddr3(address()); } + /** @return a {@link LongBuffer} view of the {@code __pad2} field. */ + @NativeType("__u64[1]") + public LongBuffer __pad2() { return IOURingSQE.n__pad2(address()); } + /** @return the value at the specified index of the {@code __pad2} field. */ + @NativeType("__u64") + public long __pad2(int index) { return IOURingSQE.n__pad2(address(), index); } + /** @return a {@link ByteBuffer} view of the {@link IOURingSQE#cmd} field. */ + @NativeType("__u8[0]") + public ByteBuffer cmd() { return IOURingSQE.ncmd(address()); } + /** @return the value at the specified index of the {@link IOURingSQE#cmd} field. */ + @NativeType("__u8") + public byte cmd(int index) { return IOURingSQE.ncmd(address(), index); } + + /** Sets the specified value to the {@link IOURingSQE#opcode} field. */ + public Buffer opcode(@NativeType("__u8") byte value) { IOURingSQE.nopcode(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#flags} field. */ + public Buffer flags(@NativeType("__u8") byte value) { IOURingSQE.nflags(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#ioprio} field. */ + public Buffer ioprio(@NativeType("__u16") short value) { IOURingSQE.nioprio(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#fd} field. */ + public Buffer fd(@NativeType("__s32") int value) { IOURingSQE.nfd(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#off} field. */ + public Buffer off(@NativeType("__u64") long value) { IOURingSQE.noff(address(), value); return this; } + /** Sets the specified value to the {@code addr2} field. */ + public Buffer addr2(@NativeType("__u64") long value) { IOURingSQE.naddr2(address(), value); return this; } + /** Sets the specified value to the {@code cmd_op} field. */ + public Buffer cmd_op(@NativeType("__u32") int value) { IOURingSQE.ncmd_op(address(), value); return this; } + /** Sets the specified value to the {@code __pad1} field. */ + public Buffer __pad1(@NativeType("__u32") int value) { IOURingSQE.n__pad1(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#addr} field. */ + public Buffer addr(@NativeType("__u64") long value) { IOURingSQE.naddr(address(), value); return this; } + /** Sets the specified value to the {@code splice_off_in} field. */ + public Buffer splice_off_in(@NativeType("__u64") long value) { IOURingSQE.nsplice_off_in(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#len} field. */ + public Buffer len(@NativeType("__u32") int value) { IOURingSQE.nlen(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#rw_flags} field. */ + public Buffer rw_flags(@NativeType("__kernel_rwf_t") int value) { IOURingSQE.nrw_flags(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#fsync_flags} field. */ + public Buffer fsync_flags(@NativeType("__u32") int value) { IOURingSQE.nfsync_flags(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#poll_events} field. */ + public Buffer poll_events(@NativeType("__u16") short value) { IOURingSQE.npoll_events(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#poll32_events} field. */ + public Buffer poll32_events(@NativeType("__u32") int value) { IOURingSQE.npoll32_events(address(), value); return this; } + /** Sets the specified value to the {@code sync_range_flags} field. */ + public Buffer sync_range_flags(@NativeType("__u32") int value) { IOURingSQE.nsync_range_flags(address(), value); return this; } + /** Sets the specified value to the {@code msg_flags} field. */ + public Buffer msg_flags(@NativeType("__u32") int value) { IOURingSQE.nmsg_flags(address(), value); return this; } + /** Sets the specified value to the {@code timeout_flags} field. */ + public Buffer timeout_flags(@NativeType("__u32") int value) { IOURingSQE.ntimeout_flags(address(), value); return this; } + /** Sets the specified value to the {@code accept_flags} field. */ + public Buffer accept_flags(@NativeType("__u32") int value) { IOURingSQE.naccept_flags(address(), value); return this; } + /** Sets the specified value to the {@code cancel_flags} field. */ + public Buffer cancel_flags(@NativeType("__u32") int value) { IOURingSQE.ncancel_flags(address(), value); return this; } + /** Sets the specified value to the {@code open_flags} field. */ + public Buffer open_flags(@NativeType("__u32") int value) { IOURingSQE.nopen_flags(address(), value); return this; } + /** Sets the specified value to the {@code statx_flags} field. */ + public Buffer statx_flags(@NativeType("__u32") int value) { IOURingSQE.nstatx_flags(address(), value); return this; } + /** Sets the specified value to the {@code fadvise_advice} field. */ + public Buffer fadvise_advice(@NativeType("__u32") int value) { IOURingSQE.nfadvise_advice(address(), value); return this; } + /** Sets the specified value to the {@code splice_flags} field. */ + public Buffer splice_flags(@NativeType("__u32") int value) { IOURingSQE.nsplice_flags(address(), value); return this; } + /** Sets the specified value to the {@code rename_flags} field. */ + public Buffer rename_flags(@NativeType("__u32") int value) { IOURingSQE.nrename_flags(address(), value); return this; } + /** Sets the specified value to the {@code unlink_flags} field. */ + public Buffer unlink_flags(@NativeType("__u32") int value) { IOURingSQE.nunlink_flags(address(), value); return this; } + /** Sets the specified value to the {@code hardlink_flags} field. */ + public Buffer hardlink_flags(@NativeType("__u32") int value) { IOURingSQE.nhardlink_flags(address(), value); return this; } + /** Sets the specified value to the {@code xattr_flags} field. */ + public Buffer xattr_flags(@NativeType("__u32") int value) { IOURingSQE.nxattr_flags(address(), value); return this; } + /** Sets the specified value to the {@code msg_ring_flags} field. */ + public Buffer msg_ring_flags(@NativeType("__u32") int value) { IOURingSQE.nmsg_ring_flags(address(), value); return this; } + /** Sets the specified value to the {@code uring_cmd_flags} field. */ + public Buffer uring_cmd_flags(@NativeType("__u32") int value) { IOURingSQE.nuring_cmd_flags(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#user_data} field. */ + public Buffer user_data(@NativeType("__u64") long value) { IOURingSQE.nuser_data(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#buf_index} field. */ + public Buffer buf_index(@NativeType("__u16") short value) { IOURingSQE.nbuf_index(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#buf_group} field. */ + public Buffer buf_group(@NativeType("__u16") short value) { IOURingSQE.nbuf_group(address(), value); return this; } + /** Sets the specified value to the {@link IOURingSQE#personality} field. */ + public Buffer personality(@NativeType("__u16") short value) { IOURingSQE.npersonality(address(), value); return this; } + /** Sets the specified value to the {@code splice_fd_in} field. */ + public Buffer splice_fd_in(@NativeType("__s32") int value) { IOURingSQE.nsplice_fd_in(address(), value); return this; } + /** Sets the specified value to the {@code file_index} field. */ + public Buffer file_index(@NativeType("__u32") int value) { IOURingSQE.nfile_index(address(), value); return this; } + /** Sets the specified value to the {@code addr_len} field. */ + public Buffer addr_len(@NativeType("__u16") short value) { IOURingSQE.naddr_len(address(), value); return this; } + /** Copies the specified {@link ShortBuffer} to the {@code __pad3} field. */ + public Buffer __pad3(@NativeType("__u16[1]") ShortBuffer value) { IOURingSQE.n__pad3(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code __pad3} field. */ + public Buffer __pad3(int index, @NativeType("__u16") short value) { IOURingSQE.n__pad3(address(), index, value); return this; } + /** Sets the specified value to the {@code addr3} field. */ + public Buffer addr3(@NativeType("__u64") long value) { IOURingSQE.naddr3(address(), value); return this; } + /** Copies the specified {@link LongBuffer} to the {@code __pad2} field. */ + public Buffer __pad2(@NativeType("__u64[1]") LongBuffer value) { IOURingSQE.n__pad2(address(), value); return this; } + /** Sets the specified value at the specified index of the {@code __pad2} field. */ + public Buffer __pad2(int index, @NativeType("__u64") long value) { IOURingSQE.n__pad2(address(), index, value); return this; } + /** Copies the specified {@link ByteBuffer} to the {@link IOURingSQE#cmd} field. */ + public Buffer cmd(@NativeType("__u8[0]") ByteBuffer value) { IOURingSQE.ncmd(address(), value); return this; } + /** Sets the specified value at the specified index of the {@link IOURingSQE#cmd} field. */ + public Buffer cmd(int index, @NativeType("__u8") byte value) { IOURingSQE.ncmd(address(), index, value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSyncCancelReg.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSyncCancelReg.java new file mode 100644 index 000000000..e314ae93f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/IOURingSyncCancelReg.java @@ -0,0 +1,350 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +import org.lwjgl.system.linux.*; + +/** + * Argument for {@link LibIOURing#IORING_REGISTER_SYNC_CANCEL REGISTER_SYNC_CANCEL}. + * + *

    Layout

    + * + *
    
    + * struct io_uring_sync_cancel_reg {
    + *     __u64 addr;
    + *     __s32 fd;
    + *     __u32 flags;
    + *     {@link KernelTimespec struct __kernel_timespec} timeout;
    + *     __u64 pad[4];
    + * }
    + */ +@NativeType("struct io_uring_sync_cancel_reg") +public class IOURingSyncCancelReg extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ADDR, + FD, + FLAGS, + TIMEOUT, + PAD; + + static { + Layout layout = __struct( + __member(8), + __member(4), + __member(4), + __member(KernelTimespec.SIZEOF, KernelTimespec.ALIGNOF), + __array(8, 4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + ADDR = layout.offsetof(0); + FD = layout.offsetof(1); + FLAGS = layout.offsetof(2); + TIMEOUT = layout.offsetof(3); + PAD = layout.offsetof(4); + } + + protected IOURingSyncCancelReg(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected IOURingSyncCancelReg create(long address, @Nullable ByteBuffer container) { + return new IOURingSyncCancelReg(address, container); + } + + /** + * Creates a {@code IOURingSyncCancelReg} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public IOURingSyncCancelReg(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code addr} field. */ + @NativeType("__u64") + public long addr() { return naddr(address()); } + /** @return the value of the {@code fd} field. */ + @NativeType("__s32") + public int fd() { return nfd(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u32") + public int flags() { return nflags(address()); } + /** @return a {@link KernelTimespec} view of the {@code timeout} field. */ + @NativeType("struct __kernel_timespec") + public KernelTimespec timeout() { return ntimeout(address()); } + + /** Sets the specified value to the {@code addr} field. */ + public IOURingSyncCancelReg addr(@NativeType("__u64") long value) { naddr(address(), value); return this; } + /** Sets the specified value to the {@code fd} field. */ + public IOURingSyncCancelReg fd(@NativeType("__s32") int value) { nfd(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public IOURingSyncCancelReg flags(@NativeType("__u32") int value) { nflags(address(), value); return this; } + /** Copies the specified {@link KernelTimespec} to the {@code timeout} field. */ + public IOURingSyncCancelReg timeout(@NativeType("struct __kernel_timespec") KernelTimespec value) { ntimeout(address(), value); return this; } + /** Passes the {@code timeout} field to the specified {@link java.util.function.Consumer Consumer}. */ + public IOURingSyncCancelReg timeout(java.util.function.Consumer consumer) { consumer.accept(timeout()); return this; } + + /** Initializes this struct with the specified values. */ + public IOURingSyncCancelReg set( + long addr, + int fd, + int flags, + KernelTimespec timeout + ) { + addr(addr); + fd(fd); + flags(flags); + timeout(timeout); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public IOURingSyncCancelReg set(IOURingSyncCancelReg src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code IOURingSyncCancelReg} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static IOURingSyncCancelReg malloc() { + return new IOURingSyncCancelReg(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code IOURingSyncCancelReg} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static IOURingSyncCancelReg calloc() { + return new IOURingSyncCancelReg(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code IOURingSyncCancelReg} instance allocated with {@link BufferUtils}. */ + public static IOURingSyncCancelReg create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new IOURingSyncCancelReg(memAddress(container), container); + } + + /** Returns a new {@code IOURingSyncCancelReg} instance for the specified memory address. */ + public static IOURingSyncCancelReg create(long address) { + return new IOURingSyncCancelReg(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static IOURingSyncCancelReg createSafe(long address) { + return address == NULL ? null : new IOURingSyncCancelReg(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code IOURingSyncCancelReg} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static IOURingSyncCancelReg malloc(MemoryStack stack) { + return new IOURingSyncCancelReg(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code IOURingSyncCancelReg} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static IOURingSyncCancelReg calloc(MemoryStack stack) { + return new IOURingSyncCancelReg(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #addr}. */ + public static long naddr(long struct) { return UNSAFE.getLong(null, struct + IOURingSyncCancelReg.ADDR); } + /** Unsafe version of {@link #fd}. */ + public static int nfd(long struct) { return UNSAFE.getInt(null, struct + IOURingSyncCancelReg.FD); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + IOURingSyncCancelReg.FLAGS); } + /** Unsafe version of {@link #timeout}. */ + public static KernelTimespec ntimeout(long struct) { return KernelTimespec.create(struct + IOURingSyncCancelReg.TIMEOUT); } + public static LongBuffer npad(long struct) { return memLongBuffer(struct + IOURingSyncCancelReg.PAD, 4); } + public static long npad(long struct, int index) { + return UNSAFE.getLong(null, struct + IOURingSyncCancelReg.PAD + check(index, 4) * 8); + } + + /** Unsafe version of {@link #addr(long) addr}. */ + public static void naddr(long struct, long value) { UNSAFE.putLong(null, struct + IOURingSyncCancelReg.ADDR, value); } + /** Unsafe version of {@link #fd(int) fd}. */ + public static void nfd(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSyncCancelReg.FD, value); } + /** Unsafe version of {@link #flags(int) flags}. */ + public static void nflags(long struct, int value) { UNSAFE.putInt(null, struct + IOURingSyncCancelReg.FLAGS, value); } + /** Unsafe version of {@link #timeout(KernelTimespec) timeout}. */ + public static void ntimeout(long struct, KernelTimespec value) { memCopy(value.address(), struct + IOURingSyncCancelReg.TIMEOUT, KernelTimespec.SIZEOF); } + public static void npad(long struct, LongBuffer value) { + if (CHECKS) { checkGT(value, 4); } + memCopy(memAddress(value), struct + IOURingSyncCancelReg.PAD, value.remaining() * 8); + } + public static void npad(long struct, int index, long value) { + UNSAFE.putLong(null, struct + IOURingSyncCancelReg.PAD + check(index, 4) * 8, value); + } + + // ----------------------------------- + + /** An array of {@link IOURingSyncCancelReg} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final IOURingSyncCancelReg ELEMENT_FACTORY = IOURingSyncCancelReg.create(-1L); + + /** + * Creates a new {@code IOURingSyncCancelReg.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link IOURingSyncCancelReg#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected IOURingSyncCancelReg getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code addr} field. */ + @NativeType("__u64") + public long addr() { return IOURingSyncCancelReg.naddr(address()); } + /** @return the value of the {@code fd} field. */ + @NativeType("__s32") + public int fd() { return IOURingSyncCancelReg.nfd(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("__u32") + public int flags() { return IOURingSyncCancelReg.nflags(address()); } + /** @return a {@link KernelTimespec} view of the {@code timeout} field. */ + @NativeType("struct __kernel_timespec") + public KernelTimespec timeout() { return IOURingSyncCancelReg.ntimeout(address()); } + + /** Sets the specified value to the {@code addr} field. */ + public Buffer addr(@NativeType("__u64") long value) { IOURingSyncCancelReg.naddr(address(), value); return this; } + /** Sets the specified value to the {@code fd} field. */ + public Buffer fd(@NativeType("__s32") int value) { IOURingSyncCancelReg.nfd(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public Buffer flags(@NativeType("__u32") int value) { IOURingSyncCancelReg.nflags(address(), value); return this; } + /** Copies the specified {@link KernelTimespec} to the {@code timeout} field. */ + public Buffer timeout(@NativeType("struct __kernel_timespec") KernelTimespec value) { IOURingSyncCancelReg.ntimeout(address(), value); return this; } + /** Passes the {@code timeout} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer timeout(java.util.function.Consumer consumer) { consumer.accept(timeout()); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/LibIOURing.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/LibIOURing.java new file mode 100644 index 000000000..98cafd0f4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/LibIOURing.java @@ -0,0 +1,1787 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import org.lwjgl.system.*; + +/** + * Native bindings to io_uring, a Linux-specific API for asynchronous I/O. + * + *

    It allows the user to submit one or more I/O requests, which are processed asynchronously without blocking the calling process. {@code io_uring} gets + * its name from ring buffers which are shared between user space and kernel space. This arrangement allows for efficient I/O, while avoiding the overhead + * of copying buffers between them, where possible. This interface makes {@code io_uring} different from other UNIX I/O APIs, wherein, rather than just + * communicate between kernel and user space with system calls, ring buffers are used as the main mode of communication. This arrangement has various + * performance benefits which are discussed in a separate section below. This man page uses the terms shared buffers, shared ring buffers and queues + * interchangeably.

    + * + *

    The general programming model you need to follow for io_uring is outlined below

    + * + *
      + *
    • Set up shared buffers with {@link #io_uring_setup setup} and {@code mmap(2)}, mapping into user space shared buffers for the submission queue (SQ) and the completion + * queue (CQ). You place I/O requests you want to make on the SQ, while the kernel places the results of those operations on the CQ.
    • + *
    • For every I/O request you need to make (like to read a file, write a file, accept a socket connection, etc), you create a submission queue entry, + * or SQE, describe the I/O operation you need to get done and add it to the tail of the submission queue (SQ). Each I/O operation is, in essence, the + * equivalent of a system call you would have made otherwise, if you were not using {@code io_uring}. You can add more than one SQE to the queue + * depending on the number of operations you want to request.
    • + *
    • After you add one or more SQEs, you need to call {@link #io_uring_enter enter} to tell the kernel to dequeue your I/O requests off the SQ and begin processing them.
    • + *
    • For each SQE you submit, once it is done processing the request, the kernel places a completion queue event or CQE at the tail of the completion + * queue or CQ. The kernel places exactly one matching CQE in the CQ for every SQE you submit on the SQ. After you retrieve a CQE, minimally, you + * might be interested in checking the res field of the CQE structure, which corresponds to the return value of the system call's equivalent, had you + * used it directly without using {@code io_uring}. For instance, a read operation under {@code io_uring}, started with the {@link #IORING_OP_READ OP_READ} operation, which + * issues the equivalent of the {@code read(2)} system call, would return as part of {@code res} what {@code read(2)} would have returned if called + * directly, without using {@code io_uring}.
    • + *
    • Optionally, {@link #io_uring_enter enter} can also wait for a specified number of requests to be processed by the kernel before it returns. If you specified a certain + * number of completions to wait for, the kernel would have placed at least those many number of CQEs on the CQ, which you can then readily read, + * right after the return from {@code io_uring_enter(2)}.
    • + *
    • It is important to remember that I/O requests submitted to the kernel can complete in any order. It is not necessary for the kernel to process one + * request after another, in the order you placed them. Given that the interface is a ring, the requests are attempted in order, however that doesn't + * imply any sort of ordering on their completion. When more than one request is in flight, it is not possible to determine which one will complete + * first. When you dequeue CQEs off the CQ, you should always check which submitted request it corresponds to. The most common method for doing so is + * utilizing the {@code user_data} field in the request, which is passed back on the completion side.
    • + *
    + * + *

    Adding to and reading from the queues:

    + * + *
      + *
    • You add SQEs to the tail of the SQ. The kernel reads SQEs off the head of the queue.
    • + *
    • The kernel adds CQEs to the tail of the CQ. You read CQEs off the head of the queue.
    • + *
    + * + *

    Submission queue polling

    + * + *

    One of the goals of {@code io_uring} is to provide a means for efficient I/O. To this end, {@code io_uring} supports a polling mode that lets you avoid + * the call to {@link #io_uring_enter enter}, which you use to inform the kernel that you have queued SQEs on to the SQ. With SQ Polling, {@code io_uring} starts a kernel + * thread that polls the submission queue for any I/O requests you submit by adding SQEs. With SQ Polling enabled, there is no need for you to call + * {@code io_uring_enter(2)}, letting you avoid the overhead of system calls. A designated kernel thread dequeues SQEs off the SQ as you add them and + * dispatches them for asynchronous processing.

    + * + *

    Setting up io_uring

    + * + *

    The main steps in setting up {@code io_uring} consist of mapping in the shared buffers with {@code mmap(2)} calls.

    + * + *

    Submitting I/O requests

    + * + *

    The process of submitting a request consists of describing the I/O operation you need to get done using an {@code io_uring_sqe} structure instance. + * These details describe the equivalent system call and its parameters. Because the range of I/O operations Linux supports are very varied and the + * {@code io_uring_sqe} structure needs to be able to describe them, it has several fields, some packed into unions for space efficiency.

    + * + *

    To submit an I/O request to {@code io_uring}, you need to acquire a submission queue entry (SQE) from the submission queue (SQ), fill it up with + * details of the operation you want to submit and call {@link #io_uring_enter enter}. If you want to avoid calling {@code io_uring_enter(2)}, you have the option of setting + * up Submission Queue Polling.

    + * + *

    SQEs are added to the tail of the submission queue. The kernel picks up SQEs off the head of the SQ. The general algorithm to get the next available + * SQE and update the tail is as follows.

    + * + *
    
    + * struct io_uring_sqe *sqe;
    + * unsigned tail, index;
    + * tail = *sqring->tail;
    + * index = tail & (*sqring->ring_mask);
    + * sqe = &sqring->sqes[index];
    + * // fill up details about this I/O request
    + * describe_io(sqe);
    + * // fill the sqe index into the SQ ring array
    + * sqring->array[index] = index;
    + * tail++;
    + * atomic_store_release(sqring->tail, tail);
    + * + *

    To get the index of an entry, the application must mask the current tail index with the size mask of the ring. This holds true for both SQs and CQs. + * Once the SQE is acquired, the necessary fields are filled in, describing the request. While the CQ ring directly indexes the shared array of CQEs, the + * submission side has an indirection array between them. The submission side ring buffer is an index into this array, which in turn contains the index + * into the SQEs.

    + * + *

    The following code snippet demonstrates how a read operation, an equivalent of a preadv2(2) system call is described by filling up an SQE with the + * necessary parameters.

    + * + *
    
    + * struct iovec iovecs[16];
    + *  ...
    + * sqe->opcode = IORING_OP_READV;
    + * sqe->fd = fd;
    + * sqe->addr = (unsigned long) iovecs;
    + * sqe->len = 16;
    + * sqe->off = offset;
    + * sqe->flags = 0;
    + * + *

    Memory ordering

    + * + *

    Modern compilers and CPUs freely reorder reads and writes without affecting the program's outcome to optimize performance. Some aspects of this need to + * be kept in mind on SMP systems since {@code io_uring} involves buffers shared between kernel and user space. These buffers are both visible and + * modifiable from kernel and user space. As heads and tails belonging to these shared buffers are updated by kernel and user space, changes need to be + * coherently visible on either side, irrespective of whether a CPU switch took place after the kernel-user mode switch happened. We use memory barriers + * to enforce this coherency. Being significantly large subjects on their own, memory barriers are out of scope for further discussion on this man page.

    + * + *

    Letting the kernel know about I/O submissions

    + * + *

    Once you place one or more SQEs on to the SQ, you need to let the kernel know that you've done so. You can do this by calling the {@link #io_uring_enter enter} system call. + * This system call is also capable of waiting for a specified count of events to complete. This way, you can be sure to find completion events in the + * completion queue without having to poll it for events later.

    + * + *

    Reading completion events

    + * + *

    Similar to the submission queue (SQ), the completion queue (CQ) is a shared buffer between the kernel and user space. Whereas you placed submission + * queue entries on the tail of the SQ and the kernel read off the head, when it comes to the CQ, the kernel places completion queue events or CQEs on the + * tail of the CQ and you read off its head.

    + * + *

    Submission is flexible (and thus a bit more complicated) since it needs to be able to encode different types of system calls that take various + * parameters. Completion, on the other hand is simpler since we're looking only for a return value back from the kernel. This is easily understood by + * looking at the completion queue event structure, {@link IOURingCQE}.

    + * + *

    Here, {@code user_data} is custom data that is passed unchanged from submission to completion. That is, from SQEs to CQEs. This field can be used to + * set context, uniquely identifying submissions that got completed. Given that I/O requests can complete in any order, this field can be used to + * correlate a submission with a completion. {@code res} is the result from the system call that was performed as part of the submission; its return + * value. The {@code flags} field could carry request-specific metadata in the future, but is currently unused.

    + * + *

    The general sequence to read completion events off the completion queue is as follows:

    + * + *
    
    + * unsigned head;
    + * head = *cqring->head;
    + * if (head != atomic_load_acquire(cqring->tail)) {
    + *     struct io_uring_cqe *cqe;
    + * 
    + *     unsigned index;
    + * 
    + *     index = head & (cqring->mask);
    + * 
    + *     cqe = &cqring->cqes[index];
    + * 
    + *     // process completed CQE
    + * 
    + *     process_cqe(cqe);
    + * 
    + *     // CQE consumption complete
    + * 
    + *     head++;
    + * }
    + * atomic_store_release(cqring->head, head);
    + * + *

    It helps to be reminded that the kernel adds CQEs to the tail of the CQ, while you need to dequeue them off the head. To get the index of an entry at + * the head, the application must mask the current head index with the size mask of the ring. Once the CQE has been consumed or processed, the head needs + * to be updated to reflect the consumption of the CQE. Attention should be paid to the read and write barriers to ensure successful read and update of + * the head.

    + * + *

    io_uring performance

    + * + *

    Because of the shared ring buffers between kernel and user space, {@code io_uring} can be a zero-copy system. Copying buffers to and from becomes + * necessary when system calls that transfer data between kernel and user space are involved. But since the bulk of the communication in {@code io_uring} + * is via buffers shared between the kernel and user space, this huge performance overhead is completely avoided.

    + * + *

    While system calls may not seem like a significant overhead, in high performance applications, making a lot of them will begin to matter. While + * workarounds the operating system has in place to deal with Spectre and Meltdown are ideally best done away with, unfortunately, some of these + * workarounds are around the system call interface, making system calls not as cheap as before on affected hardware. While newer hardware should not need + * these workarounds, hardware with these vulnerabilities can be expected to be in the wild for a long time. While using synchronous programming + * interfaces or even when using asynchronous programming interfaces under Linux, there is at least one system call involved in the submission of each + * request. In {@code io_uring}, on the other hand, you can batch several requests in one go, simply by queueing up multiple SQEs, each describing an I/O + * operation you want and make a single call to {@link #io_uring_enter enter}. This is possible due to {@code io_uring}'s shared buffers based design.

    + * + *

    While this batching in itself can avoid the overhead associated with potentially multiple and frequent system calls, you can reduce even this overhead + * further with Submission Queue Polling, by having the kernel poll and pick up your SQEs for processing as you add them to the submission queue. This + * avoids the {@code io_uring_enter(2)} call you need to make to tell the kernel to pick SQEs up. For high-performance applications, this means even + * lesser system call overheads.

    + */ +public class LibIOURing { + + static { Library.initialize(); } + + /** + * If {@code sqe->file_index} is set to this for opcodes that instantiate a new direct descriptor (like {@code openat/openat2/accept}), then io_uring will + * allocate an available direct descriptor instead of having the application pass one in. + * + *

    The picked direct descriptor will be returned in {@code cqe->res}, or {@code -ENFILE} if the space is full.

    + */ + public static final int IORING_FILE_INDEX_ALLOC = ~0; + + public static final int IORING_MAX_ENTRIES = 4096; + + /** + * {@code io_uring_sqe->flags} bits + * + *
    Enum values:
    + * + *
      + *
    • {@link #IOSQE_FIXED_FILE_BIT IOSQE_FIXED_FILE_BIT}
    • + *
    • {@link #IOSQE_IO_DRAIN_BIT IOSQE_IO_DRAIN_BIT}
    • + *
    • {@link #IOSQE_IO_LINK_BIT IOSQE_IO_LINK_BIT}
    • + *
    • {@link #IOSQE_IO_HARDLINK_BIT IOSQE_IO_HARDLINK_BIT}
    • + *
    • {@link #IOSQE_ASYNC_BIT IOSQE_ASYNC_BIT}
    • + *
    • {@link #IOSQE_BUFFER_SELECT_BIT IOSQE_BUFFER_SELECT_BIT}
    • + *
    • {@link #IOSQE_CQE_SKIP_SUCCESS_BIT IOSQE_CQE_SKIP_SUCCESS_BIT}
    • + *
    + */ + public static final int + IOSQE_FIXED_FILE_BIT = 0, + IOSQE_IO_DRAIN_BIT = 1, + IOSQE_IO_LINK_BIT = 2, + IOSQE_IO_HARDLINK_BIT = 3, + IOSQE_ASYNC_BIT = 4, + IOSQE_BUFFER_SELECT_BIT = 5, + IOSQE_CQE_SKIP_SUCCESS_BIT = 6; + + /** + * {@code io_uring_sqe->flags} bitfield values + * + *
    Enum values:
    + * + *
      + *
    • {@link #IOSQE_FIXED_FILE IOSQE_FIXED_FILE} - + * When this flag is specified, {@code fd} is an index into the files array registered with the {@code io_uring} instance (see the {@link #IORING_REGISTER_FILES REGISTER_FILES} + * section of the {@link #io_uring_register register} man page). + * + *

      Note that this isn't always available for all commands. If used on a command that doesn't support fixed files, the SQE will error with + * {@code -EBADF}.

      + * + *

      Available since 5.1.

      + *
    • + *
    • {@link #IOSQE_IO_DRAIN IOSQE_IO_DRAIN} - + * When this flag is specified, the SQE will not be started before previously submitted SQEs have completed, and new SQEs will not be started before + * this one completes. + * + *

      Available since 5.2.

      + *
    • + *
    • {@link #IOSQE_IO_LINK IOSQE_IO_LINK} - + * When this flag is specified, it forms a link with the next SQE in the submission ring. + * + *

      That next SQE will not be started before the previous request completes. This, in effect, forms a chain of SQEs, which can be arbitrarily long. The + * tail of the chain is denoted by the first SQE that does not have this flag set. Chains are not supported across submission boundaries. Even if the + * last SQE in a submission has this flag set, it will still terminate the current chain. This flag has no effect on previous SQE submissions, nor + * does it impact SQEs that are outside of the chain tail. This means that multiple chains can be executing in parallel, or chains and individual + * SQEs. Only members inside the chain are serialized. A chain of SQEs will be broken, if any request in that chain ends in error. {@code io_uring} + * considers any unexpected result an error. This means that, eg, a short read will also terminate the remainder of the chain. If a chain of SQE links + * is broken, the remaining unstarted part of the chain will be terminated and completed with {@code -ECANCELED} as the error code.

      + * + *

      Available since 5.3.

      + *
    • + *
    • {@link #IOSQE_IO_HARDLINK IOSQE_IO_HARDLINK} - + * Like {@link #IOSQE_IO_LINK}, but it doesn't sever regardless of the completion result. + * + *

      Note that the link will still sever if we fail submitting the parent request, hard links are only resilient in the presence of completion results + * for requests that did submit correctly. {@code IOSQE_IO_HARDLINK} implies {@code IOSQE_IO_LINK}.

      + * + *

      Available since 5.5.

      + *
    • + *
    • {@link #IOSQE_ASYNC IOSQE_ASYNC} - + * Normal operation for {@code io_uring} is to try and issue an sqe as non-blocking first, and if that fails, execute it in an async manner. + * + *

      To support more efficient overlapped operation of requests that the application knows/assumes will always (or most of the time) block, the + * application can ask for an sqe to be issued async from the start.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IOSQE_BUFFER_SELECT IOSQE_BUFFER_SELECT} - + * Used in conjunction with the {@link #IORING_OP_PROVIDE_BUFFERS OP_PROVIDE_BUFFERS} command, which registers a pool of buffers to be used by commands that read or receive data. + * + *

      When buffers are registered for this use case, and this flag is set in the command, {@code io_uring} will grab a buffer from this pool when the + * request is ready to receive or read data. If successful, the resulting CQE will have {@link #IORING_CQE_F_BUFFER CQE_F_BUFFER} set in the flags part of the struct, and the + * upper {@link #IORING_CQE_BUFFER_SHIFT CQE_BUFFER_SHIFT} bits will contain the ID of the selected buffers. This allows the application to know exactly which buffer was selected for + * the operation. If no buffers are available and this flag is set, then the request will fail with {@code -ENOBUFS} as the error code. Once a buffer + * has been used, it is no longer available in the kernel pool. The application must re-register the given buffer again when it is ready to recycle it + * (eg has completed using it).

      + * + *

      Available since 5.7.

      + *
    • + *
    • {@link #IOSQE_CQE_SKIP_SUCCESS IOSQE_CQE_SKIP_SUCCESS} - + * Don't generate a CQE if the request completes successfully. + * + *

      If the request fails, an appropriate CQE will be posted as usual and if there is no {@link #IOSQE_IO_HARDLINK}, CQEs for all linked requests will be + * omitted. The notion of failure/success is {@code opcode} specific and is the same as with breaking chains of {@link #IOSQE_IO_LINK}. One special case is + * when the request has a linked timeout, then the CQE generation for the linked timeout is decided solely by whether it has + * {@code IOSQE_CQE_SKIP_SUCCESS} set, regardless whether it timed out or was cancelled. In other words, if a linked timeout has the flag set, it's + * guaranteed to not post a CQE.

      + * + *

      The semantics are chosen to accommodate several use cases. First, when all but the last request of a normal link without linked timeouts are marked + * with the flag, only one CQE per link is posted. Additionally, it enables supression of CQEs in cases where the side effects of a successfully + * executed operation is enough for userspace to know the state of the system. One such example would be writing to a synchronisation file.

      + * + *

      This flag is incompatible with {@link #IOSQE_IO_DRAIN}. Using both of them in a single ring is undefined behavior, even when they are not used together in + * a single request. Currently, after the first request with {@code IOSQE_CQE_SKIP_SUCCESS}, all subsequent requests marked with drain will be failed + * at submission time. Note that the error reporting is best effort only, and restrictions may change in the future.

      + * + *

      Available since 5.17.

      + *
    • + *
    + */ + public static final int + IOSQE_FIXED_FILE = 1 << IOSQE_FIXED_FILE_BIT, + IOSQE_IO_DRAIN = 1 << IOSQE_IO_DRAIN_BIT, + IOSQE_IO_LINK = 1 << IOSQE_IO_LINK_BIT, + IOSQE_IO_HARDLINK = 1 << IOSQE_IO_HARDLINK_BIT, + IOSQE_ASYNC = 1 << IOSQE_ASYNC_BIT, + IOSQE_BUFFER_SELECT = 1 << IOSQE_BUFFER_SELECT_BIT, + IOSQE_CQE_SKIP_SUCCESS = 1 << IOSQE_CQE_SKIP_SUCCESS_BIT; + + /** + * {@code io_uring_setup()} flags + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_SETUP_IOPOLL SETUP_IOPOLL} - + * Perform busy-waiting for an I/O completion, as opposed to getting notifications via an asynchronous IRQ (Interrupt Request). + * + *

      The file system (if any) and block device must support polling in order for this to work. Busy-waiting provides lower latency, but may consume more + * CPU resources than interrupt driven I/O. Currently, this feature is usable only on a file descriptor opened using the {@code O_DIRECT} flag. When a + * read or write is submitted to a polled context, the application must poll for completions on the CQ ring by calling {@link #io_uring_enter enter}. It is illegal to mix + * and match polled and non-polled I/O on an io_uring instance.

      + *
    • + *
    • {@link #IORING_SETUP_SQPOLL SETUP_SQPOLL} - + * When this flag is specified, a kernel thread is created to perform submission queue polling. + * + *

      An {@code io_uring} instance configured in this way enables an application to issue I/O without ever context switching into the kernel. By using + * the submission queue to fill in new submission queue entries and watching for completions on the completion queue, the application can submit and + * reap I/Os without doing a single system call.

      + * + *

      If the kernel thread is idle for more than {@code sq_thread_idle} milliseconds, it will set the {@link #IORING_SQ_NEED_WAKEUP SQ_NEED_WAKEUP} bit in the flags field of the + * struct {@code io_sq_ring}. When this happens, the application must call {@link #io_uring_enter enter} to wake the kernel thread. If I/O is kept busy, the kernel thread + * will never sleep. An application making use of this feature will need to guard the {@code io_uring_enter()} call with the following code sequence:

      + * + *
      
      +     * // Ensure that the wakeup flag is read after the tail pointer
      +     * // has been written. It's important to use memory load acquire
      +     * // semantics for the flags read, as otherwise the application
      +     * // and the kernel might not agree on the consistency of the
      +     * // wakeup flag.
      +     * unsigned flags = atomic_load_relaxed(sq_ring->flags);
      +     * if (flags & IORING_SQ_NEED_WAKEUP)
      +     *     io_uring_enter(fd, 0, 0, IORING_ENTER_SQ_WAKEUP);
      + * + *

      where {@code sq_ring} is a submission queue ring setup using the struct {@code io_sqring_offsets} described below.

      + * + *

      Before version 5.11 of the Linux kernel, to successfully use this feature, the application must register a set of files to be used for IO through + * {@link #io_uring_register register} using the {@link #IORING_REGISTER_FILES REGISTER_FILES} opcode. Failure to do so will result in submitted IO being errored with {@code EBADF}. The presence of this + * feature can be detected by the {@link #IORING_FEAT_SQPOLL_NONFIXED FEAT_SQPOLL_NONFIXED} feature flag. In version 5.11 and later, it is no longer necessary to register files to use + * this feature. 5.11 also allows using this as non-root, if the user has the {@code CAP_SYS_NICE} capability.

      + *
    • + *
    • {@link #IORING_SETUP_SQ_AFF SETUP_SQ_AFF} - + * If this flag is specified, then the poll thread will be bound to the cpu set in the {@code sq_thread_cpu} field of the struct + * {@code io_uring_params}. This flag is only meaningful when {@link #IORING_SETUP_SQPOLL SETUP_SQPOLL} is specified. When {@code cgroup} setting {@code cpuset.cpus} changes + * (typically in container environment), the bounded cpu set may be changed as well. + *
    • + *
    • {@link #IORING_SETUP_CQSIZE SETUP_CQSIZE} - + * Create the completion queue with struct {@code io_uring_params.cq_entries} entries. + * + *

      The value must be greater than entries, and may be rounded up to the next power-of-two.

      + *
    • + *
    • {@link #IORING_SETUP_CLAMP SETUP_CLAMP} - + * If this flag is specified, and if entries exceeds {@link #IORING_MAX_ENTRIES MAX_ENTRIES}, then entries will be clamped at {@code IORING_MAX_ENTRIES}. + * + *

      If the flag {@link #IORING_SETUP_SQPOLL SETUP_SQPOLL} is set, and if the value of struct {@code io_uring_params.cq_entries} exceeds {@code IORING_MAX_CQ_ENTRIES}, then it will + * be clamped at {@code IORING_MAX_CQ_ENTRIES}.

      + *
    • + *
    • {@link #IORING_SETUP_ATTACH_WQ SETUP_ATTACH_WQ} - + * This flag should be set in conjunction with struct {@code io_uring_params.wq_fd} being set to an existing {@code io_uring} ring file descriptor. + * + *

      When set, the {@code io_uring} instance being created will share the asynchronous worker thread backend of the specified {@code io_uring} ring, + * rather than create a new separate thread pool.

      + *
    • + *
    • {@link #IORING_SETUP_R_DISABLED SETUP_R_DISABLED} - + * If this flag is specified, the io_uring ring starts in a disabled state. + * + *

      In this state, restrictions can be registered, but submissions are not allowed. See {@link #io_uring_register register} for details on how to enable the ring.

      + * + *

      Available since 5.10.

      + *
    • + *
    • {@link #IORING_SETUP_SUBMIT_ALL SETUP_SUBMIT_ALL} - + * Continue submit on error. + * + *

      Normally io_uring stops submitting a batch of request, if one of these requests results in an error. This can cause submission of less than what is + * expected, if a request ends in error while being submitted. If the ring is created with this flag, {@link #io_uring_enter enter} will continue submitting requests even + * if it encounters an error submitting a request. CQEs are still posted for errored request regardless of whether or not this flag is set at ring + * creation time, the only difference is if the submit sequence is halted or continued when an error is observed.

      + * + *

      Available since 5.18.

      + *
    • + *
    • {@link #IORING_SETUP_COOP_TASKRUN SETUP_COOP_TASKRUN} - + * Cooperative task running. + * + *

      By default, io_uring will interrupt a task running in userspace when a completion event comes in. This is to ensure that completions run in a + * timely manner. For a lot of use cases, this is overkill and can cause reduced performance from both the inter-processor interrupt used to do this, + * the kernel/user transition, the needless interruption of the tasks userspace activities, and reduced batching if completions come in at a rapid + * rate. Most applications don't need the forceful interruption, as the events are processed at any kernel/user transition. The exception are setups + * where the application uses multiple threads operating on the same ring, where the application waiting on completions isn't the one that submitted + * them. For most other use cases, setting this flag will improve performance.

      + * + *

      Available since 5.19.

      + *
    • + *
    • {@link #IORING_SETUP_TASKRUN_FLAG SETUP_TASKRUN_FLAG} - + * Used in conjunction with {@link #IORING_SETUP_COOP_TASKRUN SETUP_COOP_TASKRUN}, this provides a flag, {@link #IORING_SQ_TASKRUN SQ_TASKRUN}, which is set in the SQ ring {@code flags} whenever completions are + * pending that should be processed. liburing will check for this flag even when doing {@link LibURing#io_uring_peek_cqe peek_cqe} and enter the kernel to process them, and + * applications can do the same. This makes {@code IORING_SETUP_TASKRUN_FLAG} safe to use even when applications rely on a peek style operation on the + * CQ ring to see if anything might be pending to reap. + * + *

      Available since 5.19.

      + *
    • + *
    • {@link #IORING_SETUP_SQE128 SETUP_SQE128} - + * If set, io_uring will use 128-byte SQEs rather than the normal 64-byte sized variant. + * + *

      This is a requirement for using certain request types, as of 5.19 only the {@link #IORING_OP_URING_CMD OP_URING_CMD} passthrough command for NVMe passthrough needs this.

      + * + *

      Available since 5.19.

      + *
    • + *
    • {@link #IORING_SETUP_CQE32 SETUP_CQE32} - + * If set, io_uring will use 32-byte CQEs rather than the normal 32-byte sized variant. + * + *

      This is a requirement for using certain request types, as of 5.19 only the {@link #IORING_OP_URING_CMD OP_URING_CMD} passthrough command for NVMe passthrough needs this.

      + * + *

      Available since 5.19.

      + *
    • + *
    • {@link #IORING_SETUP_SINGLE_ISSUER SETUP_SINGLE_ISSUER} - + * A hint to the kernel that only a single task can submit requests, which is used for internal optimisations. + * + *

      The kernel enforces the rule, which only affects {@link #io_uring_enter enter} calls submitting requests and will fail them with {@code -EEXIST} if the restriction is + * violated. The submitter task may differ from the task that created the ring. Note that when {@link #IORING_SETUP_SQPOLL SETUP_SQPOLL} is set it is considered that the polling + * task is doing all submissions on behalf of the userspace and so it always complies with the rule disregarding how many userspace tasks do + * {@code io_uring_enter}.

      + * + *

      Available since 5.20.

      + *
    • + *
    • {@link #IORING_SETUP_DEFER_TASKRUN SETUP_DEFER_TASKRUN} - + * Defer running task work to get events. + * + *

      By default, io_uring will process all outstanding work at the end of any system call or thread interrupt. This can delay the application from + * making other progress. Setting this flag will hint to io_uring that it should defer work until an {@link #io_uring_enter enter} call with the {@link #IORING_ENTER_GETEVENTS ENTER_GETEVENTS} flag set. + * This allows the application to request work to run just before it wants to process completions. This flag requires the {@link #IORING_SETUP_SINGLE_ISSUER SETUP_SINGLE_ISSUER} flag to + * be set, and also enforces that the call to {@code io_uring_enter} is called from the same thread that submitted requests. Note that if this flag is + * set then it is the application's responsibility to periodically trigger work (for example via any of the CQE waiting functions) or else completions + * may not be delivered.

      + * + *

      Available since 6.1.

      + *
    • + *
    + */ + public static final int + IORING_SETUP_IOPOLL = 1 << 0, + IORING_SETUP_SQPOLL = 1 << 1, + IORING_SETUP_SQ_AFF = 1 << 2, + IORING_SETUP_CQSIZE = 1 << 3, + IORING_SETUP_CLAMP = 1 << 4, + IORING_SETUP_ATTACH_WQ = 1 << 5, + IORING_SETUP_R_DISABLED = 1 << 6, + IORING_SETUP_SUBMIT_ALL = 1 << 7, + IORING_SETUP_COOP_TASKRUN = 1 << 8, + IORING_SETUP_TASKRUN_FLAG = 1 << 9, + IORING_SETUP_SQE128 = 1 << 10, + IORING_SETUP_CQE32 = 1 << 11, + IORING_SETUP_SINGLE_ISSUER = 1 << 12, + IORING_SETUP_DEFER_TASKRUN = 1 << 13; + + /** + * {@code io_uring_op} + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_OP_NOP OP_NOP} - Do not perform any I/O. This is useful for testing the performance of the {@code io_uring} implementation itself.
    • + *
    • {@link #IORING_OP_READV OP_READV} - Vectored read operation, similar to {@code preadv2(2)}. If the file is not seekable, {@code off} must be set to zero.
    • + *
    • {@link #IORING_OP_WRITEV OP_WRITEV} - Vectored write operation, similar to {@code pwritev2(2)}. If the file is not seekable, {@code off} must be set to zero.
    • + *
    • {@link #IORING_OP_FSYNC OP_FSYNC} - + * File sync. See also {@code fsync(2)}. + * + *

      Note that, while I/O is initiated in the order in which it appears inthe submission queue, completions are unordered. For example, an application + * which places a write I/O followed by an fsync in the submission queue cannot expect the fsync to apply to the write. The two operations execute in + * parallel, so the fsync may complete before the write is issued to the storage. The same is also true for previously issued writes that have not + * completed prior to the fsync.

      + *
    • + *
    • {@link #IORING_OP_READ_FIXED OP_READ_FIXED} - Read from pre-mapped buffers. See {@link #io_uring_register register} for details on how to setup a context for fixed reads.
    • + *
    • {@link #IORING_OP_WRITE_FIXED OP_WRITE_FIXED} - Write to pre-mapped buffers. See {@link #io_uring_register register} for details on how to setup a context for fixed writes.
    • + *
    • {@link #IORING_OP_POLL_ADD OP_POLL_ADD} - + * Poll the {@code fd} specified in the submission queue entry for the events specified in the {@code poll_events} field. + * + *

      Unlike poll or epoll without {@code EPOLLONESHOT}, by default this interface always works in one shot mode. That is, once the poll operation is + * completed, it will have to be resubmitted.

      + * + *

      If {@link #IORING_POLL_ADD_MULTI POLL_ADD_MULTI} is set in the SQE {@code len} field, then the poll will work in multi shot mode instead. That means it'll repatedly trigger when + * the requested event becomes true, and hence multiple CQEs can be generated from this single SQE. The CQE {@code flags} field will have {@link #IORING_CQE_F_MORE CQE_F_MORE} + * set on completion if the application should expect further CQE entries from the original request. If this flag isn't set on completion, then the + * poll request has been terminated and no further events will be generated. This mode is available since 5.13.

      + * + *

      If {@link #IORING_POLL_UPDATE_EVENTS POLL_UPDATE_EVENTS} is set in the SQE {@code len} field, then the request will update an existing poll request with the mask of events passed in + * with this request. The lookup is based on the {@code user_data} field of the original SQE submitted, and this values is passed in the {@code addr} + * field of the SQE. This mode is available since 5.13.

      + * + *

      If {@link #IORING_POLL_UPDATE_USER_DATA POLL_UPDATE_USER_DATA} is set in the SQE {@code len} field, then the request will update the {@code user_data} of an existing poll request based + * on the value passed in the {@code off} field. This mode is available since 5.13.

      + * + *

      This command works like an {@code asyncpoll(2)} and the completion event result is the returned mask of events. For the variants that update + * {@code user_data} or {@code events}, the completion result will be similar to {@link #IORING_OP_POLL_REMOVE OP_POLL_REMOVE}.

      + *
    • + *
    • {@link #IORING_OP_POLL_REMOVE OP_POLL_REMOVE} - + * Remove an existing poll request. + * + *

      If found, the {@code res} field of the struct {@code io_uring_cqe} will contain 0. If not found, {@code res} will contain {@code -ENOENT}, or + * {@code -EALREADY} if the poll request was in the process of completing already.

      + *
    • + *
    • {@link #IORING_OP_SYNC_FILE_RANGE OP_SYNC_FILE_RANGE} - + * Issue the equivalent of a {@code sync_file_range(2)} on the file descriptor. + * + *

      The {@code fd} field is the file descriptor to sync, the {@code off} field holds the offset in bytes, the {@code len} field holds the length in + * bytes, and the {@code sync_range_flags} field holds the flags for the command. See also {@code sync_file_range(2)} for the general description of + * the related system call.

      + * + *

      Available since 5.2.

      + *
    • + *
    • {@link #IORING_OP_SENDMSG OP_SENDMSG} - + * Issue the equivalent of a {@code sendmsg(2)} system call. + * + *

      {@code fd} must be set to the socket file descriptor, {@code addr} must contain a pointer to the {@code msghdr} structure, and {@code msg_flags} + * holds the flags associated with the system call. See also {@code sendmsg(2)} for the general description of the related system call.

      + * + *

      Available since 5.3.

      + *
    • + *
    • {@link #IORING_OP_RECVMSG OP_RECVMSG} - + * Works just like {@link #IORING_OP_SENDMSG OP_SENDMSG}, except for {@code recvmsg(2)} instead. See the description of {@code IORING_OP_SENDMSG}. + * + *

      Available since 5.3.

      + *
    • + *
    • {@link #IORING_OP_TIMEOUT OP_TIMEOUT} - + * This command will register a timeout operation. + * + *

      The {@code addr} field must contain a pointer to a {@code struct timespec64} structure, {@code len} must contain 1 to signify one + * {@code timespec64} structure, {@code timeout_flags} may contain {@link #IORING_TIMEOUT_ABS TIMEOUT_ABS} for an absolute timeout value, or 0 for a relative timeout. + * {@code off} may contain a completion event count. A timeout will trigger a wakeup event on the completion ring for anyone waiting for events. A + * timeout condition is met when either the specified timeout expires, or the specified number of events have completed. Either condition will trigger + * the event. If set to 0, completed events are not counted, which effectively acts like a timer. {@code io_uring} timeouts use the + * {@code CLOCK_MONOTONIC} clock source. The request will complete with {@code -ETIME} if the timeout got completed through expiration of the timer, + * or 0 if the timeout got completed through requests completing on their own. If the timeout was cancelled before it expired, the request will + * complete with {@code -ECANCELED}.

      + * + *

      Available since 5.4.

      + * + *

      Since 5.15, this command also supports the following modifiers in {@code timeout_flags}:

      + * + *
        + *
      • {@link #IORING_TIMEOUT_BOOTTIME TIMEOUT_BOOTTIME}: If set, then the clock source used is {@code CLOCK_BOOTTIME} instead of {@code CLOCK_MONOTONIC}. This clock source differs + * in that it includes time elapsed if the system was suspend while having a timeout request in-flight.
      • + *
      • {@link #IORING_TIMEOUT_REALTIME TIMEOUT_REALTIME}: If set, then the clock source used is {@code CLOCK_BOOTTIME} instead of {@code CLOCK_MONOTONIC}.
      • + *
      + *
    • + *
    • {@link #IORING_OP_TIMEOUT_REMOVE OP_TIMEOUT_REMOVE} - + * If {@code timeout_flags} are zero, then it attempts to remove an existing timeout operation. {@code addr} must contain the {@code user_data} field + * of the previously issued timeout operation. If the specified timeout request is found and cancelled successfully, this request will terminate with + * a result value of 0. If the timeout request was found but expiration was already in progress, this request will terminate with a result value of + * {@code -EBUSY}. If the timeout request wasn't found, the request will terminate with a result value of {@code -ENOENT}. + * + *

      Available since 5.5.

      + * + *

      If {@code timeout_flags} contain {@link #IORING_TIMEOUT_UPDATE TIMEOUT_UPDATE}, instead of removing an existing operation, it updates it. {@code addr} and return values are same + * as before. {@code addr2} field must contain a pointer to a {@code struct timespec64} structure. {@code timeout_flags} may also contain + * {@link #IORING_TIMEOUT_ABS TIMEOUT_ABS}, in which case the value given is an absolute one, not a relative one.

      + * + *

      Available since 5.11.

      + *
    • + *
    • {@link #IORING_OP_ACCEPT OP_ACCEPT} - + * Issue the equivalent of an {@code accept4(2)} system call. + * + *

      {@code fd} must be set to the socket file descriptor, {@code addr} must contain the pointer to the {@code sockaddr} structure, and {@code addr2} + * must contain a pointer to the {@code socklen_t} {@code addrlen} field. Flags can be passed using the {@code accept_flags} field. See also + * {@code accept4(2)} for the general description of the related system call.

      + * + *

      Available since 5.5.

      + * + *

      If the {@code file_index} field is set to a positive number, the file won't be installed into the normal file table as usual but will be placed + * into the fixed file table at index {@code file_index - 1}. In this case, instead of returning a file descriptor, the result will contain either 0 + * on success or an error. If the index points to a valid empty slot, the installation is guaranteed to not fail. If there is already a file in the + * slot, it will be replaced, similar to {@link #IORING_OP_FILES_UPDATE OP_FILES_UPDATE}. Please note that only {@code io_uring} has access to such files and no other syscall can + * use them. See {@link #IOSQE_FIXED_FILE} and {@link #IORING_REGISTER_FILES REGISTER_FILES}.

      + * + *

      Available since 5.5.

      + *
    • + *
    • {@link #IORING_OP_ASYNC_CANCEL OP_ASYNC_CANCEL} - + * Attempt to cancel an already issued request. + * + *

      {@code addr} must contain the {@code user_data} field of the request that should be cancelled. The cancellation request will complete with one of + * the following results codes. If found, the {@code res} field of the cqe will contain 0. If not found, {@code res} will contain {@code -ENOENT}. If + * found and attempted cancelled, the {@code res} field will contain {@code -EALREADY}. In this case, the request may or may not terminate. In + * general, requests that are interruptible (like socket IO) will get cancelled, while disk IO requests cannot be cancelled if already started.

      + * + *

      Available since 5.5.

      + *
    • + *
    • {@link #IORING_OP_LINK_TIMEOUT OP_LINK_TIMEOUT} - + * This request must be linked with another request through {@link #IOSQE_IO_LINK} which is described below. + * + *

      Unlike {@link #IORING_OP_TIMEOUT OP_TIMEOUT}, {@code IORING_OP_LINK_TIMEOUT} acts on the linked request, not the completion queue. The format of the command is otherwise + * like {@code IORING_OP_TIMEOUT}, except there's no completion event count as it's tied to a specific request. If used, the timeout specified in the + * command will cancel the linked command, unless the linked command completes before the timeout. The timeout will complete with {@code -ETIME} if + * the timer expired and the linked request was attempted cancelled, or {@code -ECANCELED} if the timer got cancelled because of completion of the + * linked request. Like {@code IORING_OP_TIMEOUT} the clock source used is {@code CLOCK_MONOTONIC}.

      + * + *

      Available since 5.5.

      + *
    • + *
    • {@link #IORING_OP_CONNECT OP_CONNECT} - + * Issue the equivalent of a {@code connect(2)} system call. + * + *

      {@code fd} must be set to the socket file descriptor, {@code addr} must contain the const pointer to the {@code sockaddr} structure, and + * {@code off} must contain the {@code socklen_t} {@code addrlen} field. See also {@code connect(2)} for the general description of the related system + * call.

      + * + *

      Available since 5.5.

      + *
    • + *
    • {@link #IORING_OP_FALLOCATE OP_FALLOCATE} - + * Issue the equivalent of a {@code fallocate(2)} system call. + * + *

      {@code fd} must be set to the file descriptor, {@code len} must contain the mode associated with the operation, {@code off} must contain the offset + * on which to operate, and {@code addr} must contain the length. See also {@code fallocate(2)} for the general description of the related system + * call.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_OP_OPENAT OP_OPENAT} - + * Issue the equivalent of a {@code openat(2)} system call. + * + *

      {@code fd} is the {@code dirfd} argument, {@code addr} must contain a pointer to the {@code *pathname} argument, {@code open_flags} should contain + * any flags passed in, and {@code len} is access mode of the file. See also {@code openat(2)} for the general description of the related system call.

      + * + *

      Available since 5.6.

      + * + *

      If the {@code file_index} field is set to a positive number, the file won't be installed into the normal file table as usual but will be placed + * into the fixed file table at index {@code file_index - 1}. In this case, instead of returning a file descriptor, the result will contain either 0 + * on success or an error. If there is already a file registered at this index, the request will fail with {@code -EBADF}. Only {@code io_uring} has + * access to such files and no other syscall can use them. See {@link #IOSQE_FIXED_FILE} and {@link #IORING_REGISTER_FILES REGISTER_FILES}.

      + * + *

      Available since 5.15.

      + *
    • + *
    • {@link #IORING_OP_CLOSE OP_CLOSE} - + * Issue the equivalent of a {@code close(2)} system call. + * + *

      {@code fd} is the file descriptor to be closed. See also {@code close(2)} for the general description of the related system call.

      + * + *

      Available since 5.6.

      + * + *

      If the {@code file_index} field is set to a positive number, this command can be used to close files that were direct opened through {@link #IORING_OP_OPENAT OP_OPENAT}, + * {@link #IORING_OP_OPENAT2 OP_OPENAT2}, or {@link #IORING_OP_ACCEPT OP_ACCEPT} using the {@code io_uring} specific direct descriptors. Note that only one of the descriptor fields may be set. The + * direct close feature is available since the 5.15 kernel, where direct descriptors were introduced.

      + *
    • + *
    • {@link #IORING_OP_FILES_UPDATE OP_FILES_UPDATE} - + * This command is an alternative to using {@link #IORING_REGISTER_FILES_UPDATE REGISTER_FILES_UPDATE} which then works in an async fashion, like the rest of the {@code io_uring} + * commands. + * + *

      The arguments passed in are the same. {@code addr} must contain a pointer to the array of file descriptors, {@code len} must contain the length of + * the array, and {@code off} must contain the offset at which to operate. Note that the array of file descriptors pointed to in {@code addr} must + * remain valid until this operation has completed.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_OP_STATX OP_STATX} - + * Issue the equivalent of a {@code statx(2)} system call. + * + *

      {@code fd} is the {@code dirfd} argument, {@code addr} must contain a pointer to the {@code *pathname} string, {@code statx_flags} is the + * {@code flags} argument, {@code len} should be the {@code mask} argument, and {@code off} must contain a pointer to the {@code statxbuf} to be + * filled in. See also {@code statx(2)} for the general description of the related system call.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_OP_READ OP_READ} - + * Issue the equivalent of a {@code pread(2)} or {@code pwrite(2)} system call. + * + *

      {@code fd} is the file descriptor to be operated on, {@code addr} contains the buffer in question, {@code len} contains the length of the IO + * operation, and {@code offs} contains the read or write offset. If {@code fd} does not refer to a seekable file, {@code off} must be set to zero. + * If {@code offs} is set to -1, the offset will use (and advance) the file position, like the {@code read(2)} and {@code write(2)} system calls. + * These are non-vectored versions of the {@link #IORING_OP_READV OP_READV} and {@link #IORING_OP_WRITEV OP_WRITEV} opcodes. See also {@code read(2)} and {@code write(2)} for the general description + * of the related system call.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_OP_WRITE OP_WRITE} - See {@link #IORING_OP_READ OP_READ}.
    • + *
    • {@link #IORING_OP_FADVISE OP_FADVISE} - + * Issue the equivalent of a {@code posix_fadvise(2)} system call. + * + *

      {@code fd} must be set to the file descriptor, {@code off} must contain the offset on which to operate, {@code len} must contain the length, and + * {@code fadvise_advice} must contain the advice associated with the operation. See also {@code posix_fadvise(2)} for the general description of the + * related system call.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_OP_MADVISE OP_MADVISE} - + * Issue the equivalent of a {@code madvise(2)} system call. + * + *

      {@code addr} must contain the address to operate on, {@code len} must contain the length on which to operate, and {@code fadvise_advice} must + * contain the advice associated with the operation. See also {@code madvise(2)} for the general description of the related system call.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_OP_SEND OP_SEND} - + * Issue the equivalent of a {@code send(2)} system call. + * + *

      {@code fd} must be set to the socket file descriptor, {@code addr} must contain a pointer to the buffer, {@code len} denotes the length of the + * buffer to send, and {@code msg_flags} holds the flags associated with the system call. See also {@code send(2)} for the general description of the + * related system call.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_OP_RECV OP_RECV} - + * Works just like {@link #IORING_OP_SEND OP_SEND}, except for {@code recv(2)} instead. See the description of {@code IORING_OP_SEND}. + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_OP_OPENAT2 OP_OPENAT2} - + * Issue the equivalent of a {@code openat2(2)} system call. + * + *

      {@code fd} is the {@code dirfd} argument, {@code addr} must contain a pointer to the {@code *pathname} argument, {@code len} should contain the + * size of the {@code open_how} structure, and {@code off} should be set to the address of the {@code open_how} structure. See also {@code openat2(2)} + * for the general description of the related system call.

      + * + *

      Available since 5.6.

      + * + *

      If the {@code file_index} field is set to a positive number, the file won't be installed into the normal file table as usual but will be placed + * into the fixed file table at index {@code file_index - 1}. In this case, instead of returning a file descriptor, the result will contain either 0 + * on success or an error. If there is already a file registered at this index, the request will fail with {@code -EBADF}. Only {@code io_uring} has + * access to such files and no other syscall can use them. See {@link #IOSQE_FIXED_FILE} and {@link #IORING_REGISTER_FILES REGISTER_FILES}.

      + * + *

      Available since 5.15.

      + *
    • + *
    • {@link #IORING_OP_EPOLL_CTL OP_EPOLL_CTL} - + * Add, remove or modify entries in the interest list of {@code epoll(7)}. See {@code epoll_ctl(2)} for details of the system call. + * + *

      {@code fd} holds the file descriptor that represents the epoll instance, {@code addr} holds the file descriptor to add, remove or modify, + * {@code len} holds the operation ({@code EPOLL_CTL_ADD}, {@code EPOLL_CTL_DEL}, {@code EPOLL_CTL_MOD}) to perform and, {@code off} holds a pointer + * to the {@code epoll_events} structure.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_OP_SPLICE OP_SPLICE} - + * Issue the equivalent of a {@code splice(2)} system call. + * + *

      {@code splice_fd_in} is the file descriptor to read from, {@code splice_off_in} is an offset to read from, {@code fd} is the file descriptor to + * write to, {@code off} is an offset from which to start writing to. A sentinel value of -1 is used to pass the equivalent of a {@code NULL} for the offsets + * to {@code splice(2)}. {@code len} contains the number of bytes to copy. {@code splice_flags} contains a bit mask for the flag field associated with + * the system call. Please note that one of the file descriptors must refer to a pipe. See also {@code splice(2)} for the general description of the + * related system call.

      + * + *

      Available since 5.7.

      + *
    • + *
    • {@link #IORING_OP_PROVIDE_BUFFERS OP_PROVIDE_BUFFERS} - + * This command allows an application to register a group of buffers to be used by commands that read/receive data. + * + *

      Using buffers in this manner can eliminate the need to separate the poll + read, which provides a convenient point in time to allocate a buffer for + * a given request. It's often infeasible to have as many buffers available as pending reads or receive. With this feature, the application can have + * its pool of buffers ready in the kernel, and when the file or socket is ready to read/receive data, a buffer can be selected for the operation.

      + * + *

      {@code fd} must contain the number of buffers to provide, {@code addr} must contain the starting address to add buffers from, {@code len} must + * contain the length of each buffer to add from the range, {@code buf_group} must contain the group ID of this range of buffers, and {@code off} must + * contain the starting buffer ID of this range of buffers. With that set, the kernel adds buffers starting with the memory address in {@code addr}, + * each with a length of {@code len}. Hence the application should provide {@code len * fd} worth of memory in {@code addr}. Buffers are grouped by + * the group ID, and each buffer within this group will be identical in size according to the above arguments. This allows the application to provide + * different groups of buffers, and this is often used to have differently sized buffers available depending on what the expectations are of the + * individual request. When submitting a request that should use a provided buffer, the {@link #IOSQE_BUFFER_SELECT} flag must be set, and {@code buf_group} + * must be set to the desired buffer group ID where the buffer should be selected from.

      + * + *

      Available since 5.7.

      + *
    • + *
    • {@link #IORING_OP_REMOVE_BUFFERS OP_REMOVE_BUFFERS} - + * Remove buffers previously registered with {@link #IORING_OP_PROVIDE_BUFFERS OP_PROVIDE_BUFFERS}. + * + *

      {@code fd} must contain the number of buffers to remove, and {@code buf_group} must contain the buffer group ID from which to remove the buffers.

      + * + *

      Available since 5.7.

      + *
    • + *
    • {@link #IORING_OP_TEE OP_TEE} - + * Issue the equivalent of a {@code tee(2)} system call. + * + *

      {@code splice_fd_in} is the file descriptor to read from, {@code fd} is the file descriptor to write to, {@code len} contains the number of bytes + * to copy, and {@code splice_flags} contains a bit mask for the flag field associated with the system call. Please note that both of the file + * descriptors must refer to a pipe. See also {@code tee(2)} for the general description of the related system call.

      + * + *

      Available since 5.8.

      + *
    • + *
    • {@link #IORING_OP_SHUTDOWN OP_SHUTDOWN} - + * Issue the equivalent of a {@code shutdown(2)} system call. + * + *

      {@code fd} is the file descriptor to the socket being shutdown and {@code len} must be set to the {@code how} argument. No other fields should be + * set.

      + * + *

      Available since 5.11.

      + *
    • + *
    • {@link #IORING_OP_RENAMEAT OP_RENAMEAT} - + * Issue the equivalent of a {@code renameat2(2)} system call. + * + *

      {@code fd} should be set to the {@code olddirfd}, {@code addr} should be set to the {@code oldpath}, {@code len} should be set to the + * {@code newdirfd}, {@code addr} should be set to the {@code oldpath}, {@code addr2} should be set to the {@code newpath}, and finally + * {@code rename_flags} should be set to the {@code flags} passed in to {@code renameat2(2)}.

      + * + *

      Available since 5.11.

      + *
    • + *
    • {@link #IORING_OP_UNLINKAT OP_UNLINKAT} - + * Issue the equivalent of a {@code unlinkat2(2)} system call. + * + *

      {@code fd} should be set to the {@code dirfd}, {@code addr} should be set to the {@code pathname}, and {@code unlink_flags} should be set to the + * {@code flags} being passed in to {@code unlinkat(2)}.

      + * + *

      Available since 5.11.

      + *
    • + *
    • {@link #IORING_OP_MKDIRAT OP_MKDIRAT} - + * Issue the equivalent of a {@code mkdirat2(2)} system call. + * + *

      {@code fd} should be set to the {@code dirfd}, {@code addr} should be set to the {@code pathname}, and {@code len} should be set to the + * {@code mode} being passed in to {@code mkdirat(2)}.

      + * + *

      Available since 5.15.

      + *
    • + *
    • {@link #IORING_OP_SYMLINKAT OP_SYMLINKAT} - + * Issue the equivalent of a {@code symlinkat2(2)} system call. + * + *

      {@code fd} should be set to the {@code newdirfd}, {@code addr} should be set to the {@code target} and {@code addr2} should be set to the + * {@code linkpath} being passed in to {@code symlinkat(2)}.

      + * + *

      Available since 5.15.

      + *
    • + *
    • {@link #IORING_OP_LINKAT OP_LINKAT} - + * Issue the equivalent of a {@code linkat2(2)} system call. + * + *

      {@code fd} should be set to the {@code olddirfd}, {@code addr} should be set to the {@code oldpath}, {@code len} should be set to the + * {@code newdirfd}, {@code addr2} should be set to the {@code newpath}, and {@code hardlink_flags} should be set to the {@code flags} being passed in + * {@code tolinkat(2)}.

      + * + *

      Available since 5.15.

      + *
    • + *
    • {@link #IORING_OP_MSG_RING OP_MSG_RING} - + * Send a message to an io_uring. + * + *

      {@code fd} must be set to a file descriptor of a ring that the application has access to, {@code len} can be set to any 32-bit value that the + * application wishes to pass on, and {@code off} should be set any 64-bit value that the application wishes to send. On the target ring, a CQE will + * be posted with the {@code res} field matching the {@code len} set, and a {@code user_data} field matching the {@code off} value being passed in. + * This request type can be used to either just wake or interrupt anyone waiting for completions on the target ring, or it can be used to pass + * messages via the two fields.

      + * + *

      Available since 5.18.

      + *
    • + *
    • {@link #IORING_OP_FSETXATTR OP_FSETXATTR}
    • + *
    • {@link #IORING_OP_SETXATTR OP_SETXATTR}
    • + *
    • {@link #IORING_OP_FGETXATTR OP_FGETXATTR}
    • + *
    • {@link #IORING_OP_GETXATTR OP_GETXATTR}
    • + *
    • {@link #IORING_OP_SOCKET OP_SOCKET}
    • + *
    • {@link #IORING_OP_URING_CMD OP_URING_CMD}
    • + *
    • {@link #IORING_OP_SEND_ZC OP_SEND_ZC} - + * Issue the zerocopy equivalent of a {@code send(2)} system call. + * + *

      Similar to {@link #IORING_OP_SEND OP_SEND}, but tries to avoid making intermediate copies of data. Zerocopy execution is not guaranteed and it may fall back to copying.

      + * + *

      The {@code flags} field of the first {@code "struct io_uring_cqe"} may likely contain {@link #IORING_CQE_F_MORE CQE_F_MORE}, which means that there will be a second + * completion event / notification for the request, with the {@code user_data} field set to the same value. The user must not modify the data buffer + * until the notification is posted. The first cqe follows the usual rules and so its {@code res} field will contain the number of bytes sent or a + * negative error code. The notification's {@code res} field will be set to zero and the {@code flags} field will contain {@link #IORING_CQE_F_NOTIF CQE_F_NOTIF}. The two step + * model is needed because the kernel may hold on to buffers for a long time, e.g. waiting for a TCP ACK, and having a separate cqe for request + * completions allows userspace to push more data without extra delays. Note, notifications are only responsible for controlling the lifetime of the + * buffers, and as such don't mean anything about whether the data has atually been sent out or received by the other end.

      + * + *

      {@code fd} must be set to the socket file descriptor, {@code addr} must contain a pointer to the buffer, {@code len} denotes the length of the + * buffer to send, and {@code msg_flags} holds the flags associated with the system call. When {@code addr2} is non-zero it points to the address of + * the target with {@code addr_len} specifying its size, turning the request into a {@code sendto(2)} system call equivalent.

      + * + *

      Available since 6.0.

      + *
    • + *
    • {@link #IORING_OP_SENDMSG_ZC OP_SENDMSG_ZC}
    • + *
    • {@link #IORING_OP_LAST OP_LAST}
    • + *
    + */ + public static final byte + IORING_OP_NOP = 0, + IORING_OP_READV = 1, + IORING_OP_WRITEV = 2, + IORING_OP_FSYNC = 3, + IORING_OP_READ_FIXED = 4, + IORING_OP_WRITE_FIXED = 5, + IORING_OP_POLL_ADD = 6, + IORING_OP_POLL_REMOVE = 7, + IORING_OP_SYNC_FILE_RANGE = 8, + IORING_OP_SENDMSG = 9, + IORING_OP_RECVMSG = 10, + IORING_OP_TIMEOUT = 11, + IORING_OP_TIMEOUT_REMOVE = 12, + IORING_OP_ACCEPT = 13, + IORING_OP_ASYNC_CANCEL = 14, + IORING_OP_LINK_TIMEOUT = 15, + IORING_OP_CONNECT = 16, + IORING_OP_FALLOCATE = 17, + IORING_OP_OPENAT = 18, + IORING_OP_CLOSE = 19, + IORING_OP_FILES_UPDATE = 20, + IORING_OP_STATX = 21, + IORING_OP_READ = 22, + IORING_OP_WRITE = 23, + IORING_OP_FADVISE = 24, + IORING_OP_MADVISE = 25, + IORING_OP_SEND = 26, + IORING_OP_RECV = 27, + IORING_OP_OPENAT2 = 28, + IORING_OP_EPOLL_CTL = 29, + IORING_OP_SPLICE = 30, + IORING_OP_PROVIDE_BUFFERS = 31, + IORING_OP_REMOVE_BUFFERS = 32, + IORING_OP_TEE = 33, + IORING_OP_SHUTDOWN = 34, + IORING_OP_RENAMEAT = 35, + IORING_OP_UNLINKAT = 36, + IORING_OP_MKDIRAT = 37, + IORING_OP_SYMLINKAT = 38, + IORING_OP_LINKAT = 39, + IORING_OP_MSG_RING = 40, + IORING_OP_FSETXATTR = 41, + IORING_OP_SETXATTR = 42, + IORING_OP_FGETXATTR = 43, + IORING_OP_GETXATTR = 44, + IORING_OP_SOCKET = 45, + IORING_OP_URING_CMD = 46, + IORING_OP_SEND_ZC = 47, + IORING_OP_SENDMSG_ZC = 48, + IORING_OP_LAST = 49; + + public static final int IORING_URING_CMD_FIXED = 1 << 0; + + /** {@code sqe->fsync_flags} */ + public static final int IORING_FSYNC_DATASYNC = 1 << 0; + + /** + * {@code sqe->timeout_flags} + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_TIMEOUT_ABS TIMEOUT_ABS}
    • + *
    • {@link #IORING_TIMEOUT_UPDATE TIMEOUT_UPDATE}
    • + *
    • {@link #IORING_TIMEOUT_BOOTTIME TIMEOUT_BOOTTIME}
    • + *
    • {@link #IORING_TIMEOUT_REALTIME TIMEOUT_REALTIME}
    • + *
    • {@link #IORING_LINK_TIMEOUT_UPDATE LINK_TIMEOUT_UPDATE}
    • + *
    • {@link #IORING_TIMEOUT_ETIME_SUCCESS TIMEOUT_ETIME_SUCCESS}
    • + *
    • {@link #IORING_TIMEOUT_MULTISHOT TIMEOUT_MULTISHOT}
    • + *
    • {@link #IORING_TIMEOUT_CLOCK_MASK TIMEOUT_CLOCK_MASK}
    • + *
    • {@link #IORING_TIMEOUT_UPDATE_MASK TIMEOUT_UPDATE_MASK}
    • + *
    + */ + public static final int + IORING_TIMEOUT_ABS = 1 << 0, + IORING_TIMEOUT_UPDATE = 1 << 1, + IORING_TIMEOUT_BOOTTIME = 1 << 2, + IORING_TIMEOUT_REALTIME = 1 << 3, + IORING_LINK_TIMEOUT_UPDATE = 1 << 4, + IORING_TIMEOUT_ETIME_SUCCESS = 1 << 5, + IORING_TIMEOUT_MULTISHOT = 1 << 6, + IORING_TIMEOUT_CLOCK_MASK = IORING_TIMEOUT_BOOTTIME | IORING_TIMEOUT_REALTIME, + IORING_TIMEOUT_UPDATE_MASK = IORING_TIMEOUT_UPDATE | IORING_LINK_TIMEOUT_UPDATE; + + /** {@code sqe->splice_flags}, extends {@code splice(2)} flags */ + public static final int IORING_SPLICE_F_FD_IN_FIXED = 1 << 31; + + /** + * {@code POLL_ADD} flags. Note that since {@code sqe->poll_events} is the flag space, the command flags for {@code POLL_ADD} are stored in + * {@code sqe->len}. + * + *

    {@code IORING_POLL_UPDATE}: Update existing poll request, matching {@code sqe->addr} as the old {@code user_data} field.

    + * + *

    {@code IORING_POLL_LEVEL}: Level triggered poll.

    + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_POLL_ADD_MULTI POLL_ADD_MULTI} - Multishot poll. Sets {@code IORING_CQE_F_MORE} if the poll handler will continue to report CQEs on behalf of the same SQE.
    • + *
    • {@link #IORING_POLL_UPDATE_EVENTS POLL_UPDATE_EVENTS}
    • + *
    • {@link #IORING_POLL_UPDATE_USER_DATA POLL_UPDATE_USER_DATA}
    • + *
    • {@link #IORING_POLL_ADD_LEVEL POLL_ADD_LEVEL}
    • + *
    + */ + public static final int + IORING_POLL_ADD_MULTI = 1 << 0, + IORING_POLL_UPDATE_EVENTS = 1 << 1, + IORING_POLL_UPDATE_USER_DATA = 1 << 2, + IORING_POLL_ADD_LEVEL = 1 << 3; + + /** + * {@code ASYNC_CANCEL} flags. + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_ASYNC_CANCEL_ALL ASYNC_CANCEL_ALL} - + * Cancel all requests that match the given criteria, rather than just canceling the first one found. + * + *

      Available since 5.19.

      + *
    • + *
    • {@link #IORING_ASYNC_CANCEL_FD ASYNC_CANCEL_FD} - + * Match based on the file descriptor used in the original request rather than the {@code user_data}. + * + *

      This is what {@link LibURing#io_uring_prep_cancel_fd prep_cancel_fd} sets up.

      + * + *

      Available since 5.19.

      + *
    • + *
    • {@link #IORING_ASYNC_CANCEL_ANY ASYNC_CANCEL_ANY} - + * Match any request in the ring, regardless of {@code user_data} or file descriptor. + * + *

      Can be used to cancel any pending request in the ring.

      + * + *

      Available since 5.19.

      + *
    • + *
    • {@link #IORING_ASYNC_CANCEL_FD_FIXED ASYNC_CANCEL_FD_FIXED} - {@code fd} passed in is a fixed descriptor
    • + *
    + */ + public static final int + IORING_ASYNC_CANCEL_ALL = 1 << 0, + IORING_ASYNC_CANCEL_FD = 1 << 1, + IORING_ASYNC_CANCEL_ANY = 1 << 2, + IORING_ASYNC_CANCEL_FD_FIXED = 1 << 3; + + /** + * {@code send/sendmsg} and {@code recv/recvmsg} flags ({@code sqe->ioprio}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_RECVSEND_POLL_FIRST RECVSEND_POLL_FIRST} - + * If set, io_uring will assume the socket is currently empty and attempting to receive data will be unsuccessful. + * + *

      For this case, io_uring will arm internal poll and trigger a receive of the data when the socket has data to be read. This initial receive attempt + * can be wasteful for the case where the socket is expected to be empty, setting this flag will bypass the initial receive attempt and go straight to + * arming poll. If poll does indicate that data is ready to be received, the operation will proceed.

      + * + *

      Can be used with the CQE {@link #IORING_CQE_F_SOCK_NONEMPTY CQE_F_SOCK_NONEMPTY} flag, which io_uring will set on CQEs after a {@code recv(2)} or {@code recvmsg(2)} operation. If + * set, the socket still had data to be read after the operation completed.

      + * + *

      Both these flags are available since 5.19.

      + *
    • + *
    • {@link #IORING_RECV_MULTISHOT RECV_MULTISHOT} - + * Multishot {@code recv}. + * + *

      Sets {@link #IORING_CQE_F_MORE CQE_F_MORE} if the handler will continue to report CQEs on behalf of the same SQE.

      + *
    • + *
    • {@link #IORING_RECVSEND_FIXED_BUF RECVSEND_FIXED_BUF} - Use registered buffers, the index is stored in the {@code buf_index} field.
    • + *
    • {@link #IORING_SEND_ZC_REPORT_USAGE SEND_ZC_REPORT_USAGE}
    • + *
    + */ + public static final int + IORING_RECVSEND_POLL_FIRST = 1 << 0, + IORING_RECV_MULTISHOT = 1 << 1, + IORING_RECVSEND_FIXED_BUF = 1 << 2, + IORING_SEND_ZC_REPORT_USAGE = 1 << 3; + + public static final int IORING_NOTIF_USAGE_ZC_COPIED = 1 << 31; + + /** Accept flags stored in {@code sqe->ioprio} */ + public static final int IORING_ACCEPT_MULTISHOT = 1 << 0; + + /** + * {@link #IORING_OP_MSG_RING OP_MSG_RING} command types, stored in {@code sqe->addr} + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_MSG_DATA MSG_DATA} - pass {@code sqe->len} as {@code res} and {@code off} as {@code user_data}
    • + *
    • {@link #IORING_MSG_SEND_FD MSG_SEND_FD} - send a registered fd to another ring
    • + *
    + */ + public static final int + IORING_MSG_DATA = 0, + IORING_MSG_SEND_FD = 1; + + /** + * {@link #IORING_OP_MSG_RING OP_MSG_RING} flags ({@code sqe->msg_ring_flags}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_MSG_RING_CQE_SKIP MSG_RING_CQE_SKIP} - Don't post a CQE to the target ring. Not applicable for {@link #IORING_MSG_DATA MSG_DATA}, obviously.
    • + *
    • {@link #IORING_MSG_RING_FLAGS_PASS MSG_RING_FLAGS_PASS}
    • + *
    + */ + public static final int + IORING_MSG_RING_CQE_SKIP = 1 << 0, + IORING_MSG_RING_FLAGS_PASS = 1 << 1; + + /** + * {@code cqe->flags} + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_CQE_F_BUFFER CQE_F_BUFFER} - If set, the upper 16 bits are the buffer ID
    • + *
    • {@link #IORING_CQE_F_MORE CQE_F_MORE} - If set, parent SQE will generate more CQE entries
    • + *
    • {@link #IORING_CQE_F_SOCK_NONEMPTY CQE_F_SOCK_NONEMPTY} - If set, more data to read after socket {@code recv}.
    • + *
    • {@link #IORING_CQE_F_NOTIF CQE_F_NOTIF} - Set for notification CQEs. Can be used to distinct them from sends.
    • + *
    + */ + public static final int + IORING_CQE_F_BUFFER = 1 << 0, + IORING_CQE_F_MORE = 1 << 1, + IORING_CQE_F_SOCK_NONEMPTY = 1 << 2, + IORING_CQE_F_NOTIF = 1 << 3; + + public static final int IORING_CQE_BUFFER_SHIFT = 16; + + /** Magic offsets for the application to {@code mmap} the data it needs */ + public static final long + IORING_OFF_SQ_RING = 0L, + IORING_OFF_CQ_RING = 0x8000000L, + IORING_OFF_SQES = 0x10000000L, + IORING_OFF_PBUF_RING = 0x80000000L, + IORING_OFF_PBUF_SHIFT = 16, + IORING_OFF_MMAP_MASK = 0xf8000000L; + + /** + * {@code sq_ring->flags} + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_SQ_NEED_WAKEUP SQ_NEED_WAKEUP} - needs {@code io_uring_enter} wakeup
    • + *
    • {@link #IORING_SQ_CQ_OVERFLOW SQ_CQ_OVERFLOW} - CQ ring is overflown
    • + *
    • {@link #IORING_SQ_TASKRUN SQ_TASKRUN} - task should enter the kernel
    • + *
    + */ + public static final int + IORING_SQ_NEED_WAKEUP = 1 << 0, + IORING_SQ_CQ_OVERFLOW = 1 << 1, + IORING_SQ_TASKRUN = 1 << 2; + + /** + * {@code cq_ring->flags} + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_CQ_EVENTFD_DISABLED CQ_EVENTFD_DISABLED} - disable {@code eventfd} notifications
    • + *
    + */ + public static final int IORING_CQ_EVENTFD_DISABLED = 1 << 0; + + /** + * {@code io_uring_enter(2)} flags + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_ENTER_GETEVENTS ENTER_GETEVENTS} - + * If this flag is set, then the system call will wait for the specificied number of events in {@code min_complete} before returning. + * + *

      This flag can be set along with {@code to_submit} to both submit and complete events in a single system call.

      + *
    • + *
    • {@link #IORING_ENTER_SQ_WAKEUP ENTER_SQ_WAKEUP} - If the ring has been created with {@link #IORING_SETUP_SQPOLL SETUP_SQPOLL}, then this flag asks the kernel to wakeup the SQ kernel thread to submit IO.
    • + *
    • {@link #IORING_ENTER_SQ_WAIT ENTER_SQ_WAIT} - + * If the ring has been created with {@link #IORING_SETUP_SQPOLL SETUP_SQPOLL}, then the application has no real insight into when the SQ kernel thread has consumed entries from + * the SQ ring. This can lead to a situation where the application can no longer get a free SQE entry to submit, without knowing when it one becomes + * available as the SQ kernel thread consumes them. If the system call is used with this flag set, then it will wait until at least one entry is free + * in the SQ ring. + *
    • + *
    • {@link #IORING_ENTER_EXT_ARG ENTER_EXT_ARG} - + * Since kernel 5.11, the system calls arguments have been modified to look like the following: + * + *
      
      +     * int io_uring_enter(unsigned int fd, unsigned int to_submit,
      +     *                    unsigned int min_complete, unsigned int flags,
      +     *                    const void *arg, size_t argsz);
      + * + *

      which is behaves just like the original definition by default. However, if {@code IORING_ENTER_EXT_ARG} is set, then instead of a {@code sigset_t} + * being passed in, a pointer to a struct {@code io_uring_getevents_arg} is used instead and {@code argsz} must be set to the size of this structure.

      + * + *

      The definition is {@link IOURingGeteventsArg} which allows passing in both a signal mask as well as pointer to a struct {@code __kernel_timespec} timeout + * value. If {@code ts} is set to a valid pointer, then this time value indicates the timeout for waiting on events. If an application is waiting on + * events and wishes to stop waiting after a specified amount of time, then this can be accomplished directly in version 5.11 and newer by using this + * feature.

      + *
    • + *
    • {@link #IORING_ENTER_REGISTERED_RING ENTER_REGISTERED_RING} - + * If the ring file descriptor has been registered through use of {@link #IORING_REGISTER_RING_FDS REGISTER_RING_FDS}, then setting this flag will tell the kernel that the + * {@code ring_fd} passed in is the registered ring offset rather than a normal file descriptor. + *
    • + *
    + */ + public static final int + IORING_ENTER_GETEVENTS = 1 << 0, + IORING_ENTER_SQ_WAKEUP = 1 << 1, + IORING_ENTER_SQ_WAIT = 1 << 2, + IORING_ENTER_EXT_ARG = 1 << 3, + IORING_ENTER_REGISTERED_RING = 1 << 4; + + /** + * {@code io_uring_params->features} flags + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_FEAT_SINGLE_MMAP FEAT_SINGLE_MMAP} - + * If this flag is set, the two SQ and CQ rings can be mapped with a single {@code mmap(2)} call. + * + *

      The SQEs must still be allocated separately. This brings the necessary {@code mmap(2)} calls down from three to two.

      + * + *

      Available since kernel 5.4.

      + *
    • + *
    • {@link #IORING_FEAT_NODROP FEAT_NODROP} - + * If this flag is set, {@code io_uring} supports never dropping completion events. + * + *

      If a completion event occurs and the CQ ring is full, the kernel stores the event internally until such a time that the CQ ring has room for more + * entries. If this overflow condition is entered, attempting to submit more IO will fail with the {@code -EBUSY} error value, if it can't flush the + * overflown events to the CQ ring. If this happens, the application must reap events from the CQ ring and attempt the submit again.

      + * + *

      Available since kernel 5.5.

      + *
    • + *
    • {@link #IORING_FEAT_SUBMIT_STABLE FEAT_SUBMIT_STABLE} - + * If this flag is set, applications can be certain that any data for async offload has been consumed when the kernel has consumed the SQE. + * + *

      Available since kernel 5.5.

      + *
    • + *
    • {@link #IORING_FEAT_RW_CUR_POS FEAT_RW_CUR_POS} - + * If this flag is set, applications can specify {@code offset == -1} with {@code IORING_OP_{READV,WRITEV}}, {@code IORING_OP_{READ,WRITE}_FIXED}, and + * {@code IORING_OP_{READ,WRITE}} to mean current file position, which behaves like {@code preadv2(2)} and {@code pwritev2(2)} with + * {@code offset == -1}. + * + *

      It'll use (and update) the current file position. This obviously comes with the caveat that if the application has multiple reads or writes in + * flight, then the end result will not be as expected. This is similar to threads sharing a file descriptor and doing IO using the current file + * position.

      + * + *

      Available since kernel 5.6.

      + *
    • + *
    • {@link #IORING_FEAT_CUR_PERSONALITY FEAT_CUR_PERSONALITY} - + * If this flag is set, then {@code io_uring} guarantees that both sync and async execution of a request assumes the credentials of the task that + * called {@link #io_uring_enter enter} to queue the requests. + * + *

      If this flag isn't set, then requests are issued with the credentials of the task that originally registered the {@code io_uring}. If only one task + * is using a ring, then this flag doesn't matter as the credentials will always be the same. Note that this is the default behavior, tasks can still + * register different personalities through {@link #io_uring_register register} with {@link #IORING_REGISTER_PERSONALITY REGISTER_PERSONALITY} and specify the personality to use in the sqe.

      + * + *

      Available since kernel 5.6.

      + *
    • + *
    • {@link #IORING_FEAT_FAST_POLL FEAT_FAST_POLL} - + * If this flag is set, then {@code io_uring} supports using an internal poll mechanism to drive data/space readiness. + * + *

      This means that requests that cannot read or write data to a file no longer need to be punted to an async thread for handling, instead they will + * begin operation when the file is ready. This is similar to doing poll + read/write in userspace, but eliminates the need to do so. If this flag is + * set, requests waiting on space/data consume a lot less resources doing so as they are not blocking a thread.

      + * + *

      Available since kernel 5.7.

      + *
    • + *
    • {@link #IORING_FEAT_POLL_32BITS FEAT_POLL_32BITS} - + * If this flag is set, the {@link #IORING_OP_POLL_ADD OP_POLL_ADD} command accepts the full 32-bit range of epoll based flags. + * + *

      Most notably {@code EPOLLEXCLUSIVE} which allows exclusive (waking single waiters) behavior.

      + * + *

      Available since kernel 5.9.

      + *
    • + *
    • {@link #IORING_FEAT_SQPOLL_NONFIXED FEAT_SQPOLL_NONFIXED} - + * If this flag is set, the {@link #IORING_SETUP_SQPOLL SETUP_SQPOLL} feature no longer requires the use of fixed files. + * + *

      Any normal file descriptor can be used for IO commands without needing registration.

      + * + *

      Available since kernel 5.11.

      + *
    • + *
    • {@link #IORING_FEAT_EXT_ARG FEAT_EXT_ARG} - + * If this flag is set, then the {@link #io_uring_enter enter} system call supports passing in an extended argument instead of just the {@code sigset_t} of earlier + * kernels. + * + *

      This extended argument is of type {@code struct io_uring_getevents_arg} and allows the caller to pass in both a {@code sigset_t} and a timeout + * argument for waiting on events. A pointer to this struct must be passed in if {@link #IORING_ENTER_EXT_ARG ENTER_EXT_ARG} is set in the flags for the enter system call.

      + * + *

      Available since kernel 5.11.

      + *
    • + *
    • {@link #IORING_FEAT_NATIVE_WORKERS FEAT_NATIVE_WORKERS} - + * If this flag is set, {@code io_uring} is using native workers for its async helpers. + * + *

      Previous kernels used kernel threads that assumed the identity of the original {@code io_uring} owning task, but later kernels will actively create + * what looks more like regular process threads instead.

      + * + *

      Available since kernel 5.12.

      + *
    • + *
    • {@link #IORING_FEAT_RSRC_TAGS FEAT_RSRC_TAGS} - + * If this flag is set, then {@code io_uring} supports a variety of features related to fixed files and buffers. + * + *

      In particular, it indicates that registered buffers can be updated in-place, whereas before the full set would have to be unregistered first.

      + * + *

      Available since kernel 5.13.

      + *
    • + *
    • {@link #IORING_FEAT_CQE_SKIP FEAT_CQE_SKIP} - + * If this flag is set, then io_uring supports setting {@link #IOSQE_CQE_SKIP_SUCCESS} in the submitted SQE, indicating that no CQE should be generated for + * this SQE if it executes normally. If an error happens processing the SQE, a CQE with the appropriate error value will still be generated. + * + *

      Available since kernel 5.17.

      + *
    • + *
    • {@link #IORING_FEAT_LINKED_FILE FEAT_LINKED_FILE} - + * If this flag is set, then io_uring supports sane assignment of files for SQEs that have dependencies. For example, if a chain of SQEs are submitted + * with {@link #IOSQE_IO_LINK}, then kernels without this flag will prepare the file for each link upfront. If a previous link opens a file with a known + * index, eg if direct descriptors are used with open or accept, then file assignment needs to happen post execution of that SQE. If this flag is set, + * then the kernel will defer file assignment until execution of a given request is started. + * + *

      Available since kernel 5.17.

      + *
    • + *
    • {@link #IORING_FEAT_REG_REG_RING FEAT_REG_REG_RING}
    • + *
    + */ + public static final int + IORING_FEAT_SINGLE_MMAP = 1 << 0, + IORING_FEAT_NODROP = 1 << 1, + IORING_FEAT_SUBMIT_STABLE = 1 << 2, + IORING_FEAT_RW_CUR_POS = 1 << 3, + IORING_FEAT_CUR_PERSONALITY = 1 << 4, + IORING_FEAT_FAST_POLL = 1 << 5, + IORING_FEAT_POLL_32BITS = 1 << 6, + IORING_FEAT_SQPOLL_NONFIXED = 1 << 7, + IORING_FEAT_EXT_ARG = 1 << 8, + IORING_FEAT_NATIVE_WORKERS = 1 << 9, + IORING_FEAT_RSRC_TAGS = 1 << 10, + IORING_FEAT_CQE_SKIP = 1 << 11, + IORING_FEAT_LINKED_FILE = 1 << 12, + IORING_FEAT_REG_REG_RING = 1 << 13; + + /** + * {@link #io_uring_register register} {@code opcodes} and arguments + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_REGISTER_BUFFERS REGISTER_BUFFERS} - + * {@code arg} points to a struct {@code iovec} array of {@code nr_args} entries. + * + *

      The buffers associated with the {@code iovecs} will be locked in memory and charged against the user's {@code RLIMIT_MEMLOCK} resource limit. + * See {@code getrlimit(2)} for more information. Additionally, there is a size limit of 1GiB per buffer. Currently, the buffers must be anonymous, + * non-file-backed memory, such as that returned by {@code malloc(3)} or {@code mmap(2)} with the {@code MAP_ANONYMOUS} flag set. It is expected that + * this limitation will be lifted in the future. Huge pages are supported as well. Note that the entire huge page will be pinned in the kernel, even + * if only a portion of it is used.

      + * + *

      After a successful call, the supplied buffers are mapped into the kernel and eligible for I/O. To make use of them, the application must specify + * the {@link #IORING_OP_READ_FIXED OP_READ_FIXED} or {@link #IORING_OP_WRITE_FIXED OP_WRITE_FIXED} {@code opcodes} in the submission queue entry (see the struct {@code io_uring_sqe} definition in {@link #io_uring_enter enter}), + * and set the {@code buf_index} field to the desired buffer index. The memory range described by the submission queue entry's {@code addr} and + * {@code len} fields must fall within the indexed buffer.

      + * + *

      It is perfectly valid to setup a large buffer and then only use part of it for an I/O, as long as the range is within the originally mapped region.

      + * + *

      An application can increase or decrease the size or number of registered buffers by first unregistering the existing buffers, and then issuing a + * new call to {@code io_uring_register()} with the new buffers.

      + * + *

      Note that before 5.13 registering buffers would wait for the ring to idle. If the application currently has requests in-flight, the registration + * will wait for those to finish before proceeding.

      + * + *

      An application need not unregister buffers explicitly before shutting down the io_uring instance.

      + * + *

      Available since 5.1.

      + *
    • + *
    • {@link #IORING_UNREGISTER_BUFFERS UNREGISTER_BUFFERS} - + * This operation takes no argument, and {@code arg} must be passed as {@code NULL}. + * + *

      All previously registered buffers associated with the {@code io_uring} instance will be released.

      + * + *

      Available since 5.1.

      + *
    • + *
    • {@link #IORING_REGISTER_FILES REGISTER_FILES} - + * Register files for I/O. + * + *

      {@code arg} contains a pointer to an array of {@code nr_args} file descriptors (signed 32 bit integers). To make use of the registered files, the + * {@link #IOSQE_FIXED_FILE} flag must be set in the {@code flags} member of the struct {@code io_uring_sqe}, and the {@code fd} member is set to the index of + * the file in the file descriptor array.

      + * + *

      The file set may be sparse, meaning that the {@code fd} field in the array may be set to -1. See {@link #IORING_REGISTER_FILES_UPDATE REGISTER_FILES_UPDATE} for how to update files in + * place.

      + * + *

      Note that before 5.13 registering files would wait for the ring to idle. If the application currently has requests in-flight, the registration will + * wait for those to finish before proceeding. See {@link #IORING_REGISTER_FILES_UPDATE REGISTER_FILES_UPDATE} for how to update an existing set without that limitation.

      + * + *

      Files are automatically unregistered when the io_uring instance is torn down. An application needs only unregister if it wishes to register a new + * set of fds.

      + * + *

      Available since 5.1.

      + *
    • + *
    • {@link #IORING_UNREGISTER_FILES UNREGISTER_FILES} - + * This operation requires no argument, and {@code arg} must be passed as {@code NULL}. + * + *

      All previously registered files associated with the {@code io_uring} instance will be unregistered.

      + * + *

      Available since 5.1.

      + *
    • + *
    • {@link #IORING_REGISTER_EVENTFD REGISTER_EVENTFD} - + * It's possible to use {@code eventfd(2)} to get notified of completion events on an {@code io_uring} instance. If this is desired, an eventfd file + * descriptor can be registered through this operation. + * + *

      {@code arg} must contain a pointer to the eventfd file descriptor, and {@code nr_args} must be 1.

      + * + *

      Available since 5.2.

      + * + *

      An application can temporarily disable notifications, coming through the registered eventfd, by setting the {@link #IORING_CQ_EVENTFD_DISABLED CQ_EVENTFD_DISABLED} bit in the + * {@code flags} field of the CQ ring.

      + * + *

      Available since 5.8.

      + *
    • + *
    • {@link #IORING_UNREGISTER_EVENTFD UNREGISTER_EVENTFD} - + * Unregister an eventfd file descriptor to stop notifications. + * + *

      Since only one eventfd descriptor is currently supported, this operation takes no argument, and {@code arg} must be passed as {@code NULL} and + * {@code nr_args} must be zero.

      + * + *

      Available since 5.2.

      + *
    • + *
    • {@link #IORING_REGISTER_FILES_UPDATE REGISTER_FILES_UPDATE} - + * This operation replaces existing files in the registered file set with new ones, either turning a sparse entry (one where {@code fd} is equal to + * -1) into a real one, removing an existing entry (new one is set to -1), or replacing an existing entry with a new existing entry. + * + *

      {@code arg} must contain a pointer to a struct {@code io_uring_files_update}, which contains an offset on which to start the update, and an array + * of file descriptors to use for the update. {@code nr_args} must contain the number of descriptors in the passed in array.

      + * + *

      Available since 5.5.

      + * + *

      File descriptors can be skipped if they are set to {@link #IORING_REGISTER_FILES_SKIP REGISTER_FILES_SKIP}. Skipping an fd will not touch the file associated with the previous fd at + * that index.

      + * + *

      Available since 5.12.

      + *
    • + *
    • {@link #IORING_REGISTER_EVENTFD_ASYNC REGISTER_EVENTFD_ASYNC} - + * This works just like {@link #IORING_REGISTER_EVENTFD REGISTER_EVENTFD}, except notifications are only posted for events that complete in an async manner. + * + *

      This means that events that complete inline while being submitted do not trigger a notification event. The arguments supplied are the same as for + * {@code IORING_REGISTER_EVENTFD}.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_REGISTER_PROBE REGISTER_PROBE} - + * This operation returns a structure, {@code io_uring_probe}, which contains information about the {@code opcodes} supported by {@code io_uring} on + * the running kernel. + * + *

      {@code arg} must contain a pointer to a struct {@code io_uring_probe}, and {@code nr_args} must contain the size of the ops array in that probe + * struct. The {@code ops} array is of the type {@code io_uring_probe_op}, which holds the value of the {@code opcode} and a {@code flags} field. If + * the flags field has {@link #IO_URING_OP_SUPPORTED} set, then this opcode is supported on the running kernel.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_REGISTER_PERSONALITY REGISTER_PERSONALITY} - + * This operation registers credentials of the running application with {@code io_uring}, and returns an id associated with these credentials. + * + *

      Applications wishing to share a ring between separate users/processes can pass in this credential id in the sqe personality field. If set, that + * particular sqe will be issued with these credentials. Must be invoked with {@code arg} set to {@code NULL} and {@code nr_args} set to zero.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_UNREGISTER_PERSONALITY UNREGISTER_PERSONALITY} - + * This operation unregisters a previously registered personality with {@code io_uring}. + * + *

      {@code nr_args} must be set to the id in question, and {@code arg} must be set to {@code NULL}.

      + * + *

      Available since 5.6.

      + *
    • + *
    • {@link #IORING_REGISTER_RESTRICTIONS REGISTER_RESTRICTIONS} - + * {@code arg} points to a struct {@code io_uring_restriction} array of {@code nr_args} entries. + * + *

      With an entry it is possible to allow an {@link #io_uring_register register} {@code opcode}, or specify which {@code opcode} and flags of the submission queue entry are + * allowed, or require certain flags to be specified (these flags must be set on each submission queue entry).

      + * + *

      All the restrictions must be submitted with a single {@code io_uring_register()} call and they are handled as an allowlist ({@code opcodes} and + * flags not registered, are not allowed).

      + * + *

      Restrictions can be registered only if the {@code io_uring} ring started in a disabled state ({@link #IORING_SETUP_R_DISABLED SETUP_R_DISABLED} must be specified in the call to + * {@link #io_uring_setup setup}).

      + * + *

      Available since 5.10.

      + *
    • + *
    • {@link #IORING_REGISTER_ENABLE_RINGS REGISTER_ENABLE_RINGS} - + * This operation enables an {@code io_uring} ring started in a disabled state ({@link #IORING_SETUP_R_DISABLED SETUP_R_DISABLED} was specified in the call to {@link #io_uring_setup setup}). + * + *

      While the {@code io_uring} ring is disabled, submissions are not allowed and registrations are not restricted. After the execution of this + * operation, the {@code io_uring} ring is enabled: submissions and registration are allowed, but they will be validated following the registered + * restrictions (if any). This operation takes no argument, must be invoked with {@code arg} set to {@code NULL} and {@code nr_args} set to zero.

      + * + *

      Available since 5.10.

      + *
    • + *
    • {@link #IORING_REGISTER_FILES2 REGISTER_FILES2} - + * Register files for I/O. Similar to {@link #IORING_REGISTER_FILES REGISTER_FILES}. + * + *

      {@code arg} points to a struct {@code io_uring_rsrc_register}, and {@code nr_args} should be set to the number of bytes in the structure.

      + * + *

      The {@code data} field contains a pointer to an array of {@code nr} file descriptors (signed 32 bit integers). {@code tags} field should either be + * 0 or or point to an array of {@code nr} "tags" (unsigned 64 bit integers). See {@link #IORING_REGISTER_BUFFERS2 REGISTER_BUFFERS2} for more info on resource tagging.

      + * + *

      Note that resource updates, e.g. {@link #IORING_REGISTER_FILES_UPDATE REGISTER_FILES_UPDATE}, don't necessarily deallocate resources, they might be held until all requests using that + * resource complete.

      + * + *

      Available since 5.13.

      + *
    • + *
    • {@link #IORING_REGISTER_FILES_UPDATE2 REGISTER_FILES_UPDATE2} - + * Similar to {@link #IORING_REGISTER_FILES_UPDATE REGISTER_FILES_UPDATE}, replaces existing files in the registered file set with new ones, either turning a sparse entry (one where fd is + * equal to -1) into a real one, removing an existing entry (new one is set to -1), or replacing an existing entry with a new existing entry. + * + *

      {@code arg} must contain a pointer to a struct {@code io_uring_rsrc_update2}, which contains an offset on which to start the update, and an array + * of file descriptors to use for the update stored in data. {@code tags} points to an array of tags. {@code nr} must contain the number of + * descriptors in the passed in arrays. See {@link #IORING_REGISTER_BUFFERS2 REGISTER_BUFFERS2} for the resource tagging description.

      + * + *

      Available since 5.13.

      + *
    • + *
    • {@link #IORING_REGISTER_BUFFERS2 REGISTER_BUFFERS2} - + * Register buffers for I/O. + * + *

      Similar to {@link #IORING_REGISTER_BUFFERS REGISTER_BUFFERS} but aims to have a more extensible ABI. {@code arg} points to a struct {@code io_uring_rsrc_register}, and + * {@code nr_args} should be set to the number of bytes in the structure.

      + * + *

      The data field contains a pointer to a struct {@code iovec} array of {@code nr} entries. The {@code tags} field should either be 0, then tagging is + * disabled, or point to an array of {@code nr} "tags" (unsigned 64 bit integers). If a tag is zero, then tagging for this particular resource (a + * buffer in this case) is disabled. Otherwise, after the resource had been unregistered and it's not used anymore, a CQE will be posted with + * {@code user_data} set to the specified tag and all other fields zeroed.

      + * + *

      Note that resource updates, e.g. {@link #IORING_REGISTER_BUFFERS_UPDATE REGISTER_BUFFERS_UPDATE}, don't necessarily deallocate resources by the time it returns, but they might be held + * alive until all requests using it complete.

      + * + *

      Available since 5.13.

      + *
    • + *
    • {@link #IORING_REGISTER_BUFFERS_UPDATE REGISTER_BUFFERS_UPDATE} - + * Updates registered buffers with new ones, either turning a sparse entry into a real one, or replacing an existing entry. + * + *

      {@code arg} must contain a pointer to a struct {@code io_uring_rsrc_update2}, which contains an offset on which to start the update, and an array + * of struct {@code iovec}. {@code tags} points to an array of tags. {@code nr} must contain the number of descriptors in the passed in arrays. See + * {@link #IORING_REGISTER_BUFFERS2 REGISTER_BUFFERS2} for the resource tagging description.

      + * + *

      Available since 5.13.

      + *
    • + *
    • {@link #IORING_REGISTER_IOWQ_AFF REGISTER_IOWQ_AFF} - + * By default, async workers created by {@code io_uring} will inherit the CPU mask of its parent. + * + *

      This is usually all the CPUs in the system, unless the parent is being run with a limited set. If this isn't the desired outcome, the application + * may explicitly tell {@code io_uring} what CPUs the async workers may run on.

      + * + *

      {@code arg} must point to a {@code cpu_set_t} mask, and {@code nr_args} the byte size of that mask.

      + * + *

      Available since 5.14.

      + *
    • + *
    • {@link #IORING_UNREGISTER_IOWQ_AFF UNREGISTER_IOWQ_AFF} - + * Undoes a CPU mask previously set with {@link #IORING_REGISTER_IOWQ_AFF REGISTER_IOWQ_AFF}. + * + *

      Must not have {@code arg} or {@code nr_args} set.

      + * + *

      Available since 5.14.

      + *
    • + *
    • {@link #IORING_REGISTER_IOWQ_MAX_WORKERS REGISTER_IOWQ_MAX_WORKERS} - + * By default, {@code io_uring} limits the unbounded workers created to the maximum processor count set by {@code RLIMIT_NPROC} and the bounded + * workers is a function of the SQ ring size and the number of CPUs in the system. Sometimes this can be excessive (or too little, for bounded), and + * this command provides a way to change the count per ring (per NUMA node) instead. + * + *

      {@code arg} must be set to an unsigned int pointer to an array of two values, with the values in the array being set to the maximum count of + * workers per NUMA node. Index 0 holds the bounded worker count, and index 1 holds the unbounded worker count. On successful return, the passed in + * array will contain the previous maximum valyes for each type. If the count being passed in is 0, then this command returns the current maximum + * values and doesn't modify the current setting. {@code nr_args} must be set to 2, as the command takes two values.

      + * + *

      Available since 5.15.

      + *
    • + *
    • {@link #IORING_REGISTER_RING_FDS REGISTER_RING_FDS} - + * Whenever {@link #io_uring_enter enter} is called to submit request or wait for completions, the kernel must grab a reference to the file descriptor. If the application + * using io_uring is threaded, the file table is marked as shared, and the reference grab and put of the file descriptor count is more expensive than + * it is for a non-threaded application. + * + *

      Similarly to how io_uring allows registration of files, this allow registration of the ring file descriptor itself. This reduces the overhead of + * the {@code io_uring_enter (2)} system call.

      + * + *

      {@code arg} must be set to an unsigned int pointer to an array of type {@code struct io_uring_rsrc_register} of {@code nr_args} number of entries. + * The {@code data} field of this struct must point to an io_uring file descriptor, and the {@code offset} field can be either {@code -1} or an + * explicit offset desired for the registered file descriptor value. If {@code -1} is used, then upon successful return of this system call, the field + * will contain the value of the registered file descriptor to be used for future {@code io_uring_enter (2)} system calls.

      + * + *

      On successful completion of this request, the returned descriptors may be used instead of the real file descriptor for {@code io_uring_enter (2)}, + * provided that {@code IORING_ENTER_REGISTERED_RING} is set in the {@code flags} for the system call. This flag tells the kernel that a registered + * descriptor is used rather than a real file descriptor.

      + * + *

      Each thread or process using a ring must register the file descriptor directly by issuing this request.

      + * + *

      The maximum number of supported registered ring descriptors is currently limited to {@code 16}.

      + * + *

      Available since 5.18.

      + *
    • + *
    • {@link #IORING_UNREGISTER_RING_FDS UNREGISTER_RING_FDS} - + * Unregister descriptors previously registered with {@link #IORING_REGISTER_RING_FDS REGISTER_RING_FDS}. + * + *

      {@code arg} must be set to an unsigned int pointer to an array of type {@code struct io_uring_rsrc_register} of {@code nr_args} number of entries. + * Only the {@code offset} field should be set in the structure, containing the registered file descriptor offset previously returned from + * {@code IORING_REGISTER_RING_FDS} that the application wishes to unregister.

      + * + *

      Note that this isn't done automatically on ring exit, if the thread or task that previously registered a ring file descriptor isn't exiting. It is + * recommended to manually unregister any previously registered ring descriptors if the ring is closed and the task persists. This will free up a + * registration slot, making it available for future use.

      + * + *

      Available since 5.18.

      + *
    • + *
    • {@link #IORING_REGISTER_PBUF_RING REGISTER_PBUF_RING} - register ring based provide buffer group
    • + *
    • {@link #IORING_UNREGISTER_PBUF_RING UNREGISTER_PBUF_RING} - unregister ring based provide buffer group
    • + *
    • {@link #IORING_REGISTER_SYNC_CANCEL REGISTER_SYNC_CANCEL} - sync cancelation API
    • + *
    • {@link #IORING_REGISTER_FILE_ALLOC_RANGE REGISTER_FILE_ALLOC_RANGE} - register a range of fixed file slots for automatic slot allocation
    • + *
    • {@link #IORING_REGISTER_LAST REGISTER_LAST}
    • + *
    • {@link #IORING_REGISTER_USE_REGISTERED_RING REGISTER_USE_REGISTERED_RING}
    • + *
    + */ + public static final int + IORING_REGISTER_BUFFERS = 0, + IORING_UNREGISTER_BUFFERS = 1, + IORING_REGISTER_FILES = 2, + IORING_UNREGISTER_FILES = 3, + IORING_REGISTER_EVENTFD = 4, + IORING_UNREGISTER_EVENTFD = 5, + IORING_REGISTER_FILES_UPDATE = 6, + IORING_REGISTER_EVENTFD_ASYNC = 7, + IORING_REGISTER_PROBE = 8, + IORING_REGISTER_PERSONALITY = 9, + IORING_UNREGISTER_PERSONALITY = 10, + IORING_REGISTER_RESTRICTIONS = 11, + IORING_REGISTER_ENABLE_RINGS = 12, + IORING_REGISTER_FILES2 = 13, + IORING_REGISTER_FILES_UPDATE2 = 14, + IORING_REGISTER_BUFFERS2 = 15, + IORING_REGISTER_BUFFERS_UPDATE = 16, + IORING_REGISTER_IOWQ_AFF = 17, + IORING_UNREGISTER_IOWQ_AFF = 18, + IORING_REGISTER_IOWQ_MAX_WORKERS = 19, + IORING_REGISTER_RING_FDS = 20, + IORING_UNREGISTER_RING_FDS = 21, + IORING_REGISTER_PBUF_RING = 22, + IORING_UNREGISTER_PBUF_RING = 23, + IORING_REGISTER_SYNC_CANCEL = 24, + IORING_REGISTER_FILE_ALLOC_RANGE = 25, + IORING_REGISTER_LAST = 26, + IORING_REGISTER_USE_REGISTERED_RING = 1 << 31; + + /** Register a fully sparse file space, rather than pass in an array of all -1 file descriptors. */ + public static final int IORING_RSRC_REGISTER_SPARSE = 1 << 0; + + /** + * {@code io-wq} worker categories + * + *
    Enum values:
    + * + *
      + *
    • {@link #IO_WQ_BOUND IO_WQ_BOUND}
    • + *
    • {@link #IO_WQ_UNBOUND IO_WQ_UNBOUND}
    • + *
    + */ + public static final int + IO_WQ_BOUND = 0, + IO_WQ_UNBOUND = 1; + + /** Skip updating fd indexes set to this value in the fd table. */ + public static final int IORING_REGISTER_FILES_SKIP = -2; + + public static final int IO_URING_OP_SUPPORTED = 1 << 0; + + public static final int IOU_PBUF_RING_MMAP = 1; + + /** + * {@code io_uring_restriction->opcode} values + * + *
    Enum values:
    + * + *
      + *
    • {@link #IORING_RESTRICTION_REGISTER_OP RESTRICTION_REGISTER_OP} - Allow an {@code io_uring_register(2)} opcode
    • + *
    • {@link #IORING_RESTRICTION_SQE_OP RESTRICTION_SQE_OP} - Allow an sqe opcode
    • + *
    • {@link #IORING_RESTRICTION_SQE_FLAGS_ALLOWED RESTRICTION_SQE_FLAGS_ALLOWED} - Allow sqe flags
    • + *
    • {@link #IORING_RESTRICTION_SQE_FLAGS_REQUIRED RESTRICTION_SQE_FLAGS_REQUIRED} - Require sqe flags (these flags must be set on each submission)
    • + *
    • {@link #IORING_RESTRICTION_LAST RESTRICTION_LAST} - Require sqe flags (these flags must be set on each submission)
    • + *
    + */ + public static final int + IORING_RESTRICTION_REGISTER_OP = 0, + IORING_RESTRICTION_SQE_OP = 1, + IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2, + IORING_RESTRICTION_SQE_FLAGS_REQUIRED = 3, + IORING_RESTRICTION_LAST = 4; + + protected LibIOURing() { + throw new UnsupportedOperationException(); + } + + // --- [ io_uring_setup ] --- + + /** Unsafe version of: {@link #io_uring_setup setup} */ + public static native int nio_uring_setup(int entries, long p); + + /** + * The {@code io_uring_setup()} system call sets up a submission queue (SQ) and completion queue (CQ) with at least {@code entries} entries, and returns a + * file descriptor which can be used to perform subsequent operations on the {@code io_uring} instance. + * + *

    The submission and completion queues are shared between userspace and the kernel, which eliminates the need to copy data when initiating and completing + * I/O.

    + * + *

    Closing the file descriptor returned by {@code io_uring_setup(2)} will free all resources associated with the {@code io_uring} context.

    + * + * @param p used by the application to pass options to the kernel, and by the kernel to convey information about the ring buffers + * + * @return a new file descriptor on success. + * + *

    The application may then provide the file descriptor in a subsequent {@code mmap(2)} call to map the submission and completion queues, or to the + * {@link #io_uring_register register} or {@link #io_uring_enter enter} system calls.

    + * + *

    On error, {@code -1} is returned and {@code errno} is set appropriately.

    + */ + public static int io_uring_setup(@NativeType("unsigned") int entries, @NativeType("struct io_uring_params *") IOURingParams p) { + return nio_uring_setup(entries, p.address()); + } + + // --- [ io_uring_register ] --- + + /** Unsafe version of: {@link #io_uring_register register} */ + public static native int nio_uring_register(int fd, int opcode, long arg, int nr_args); + + /** + * The {@code io_uring_register()} system call registers resources (e.g. user buffers, files, eventfd, personality, restrictions) for use in an + * {@code io_uring} instance referenced by {@code fd}. + * + *

    Registering files or user buffers allows the kernel to take long term references to internal data structures or create long term mappings of + * application memory, greatly reducing per-I/O overhead.

    + * + * @param fd the file descriptor returned by a call to {@link #io_uring_setup setup} + * @param opcode one of:
    {@link #IORING_REGISTER_BUFFERS REGISTER_BUFFERS}{@link #IORING_REGISTER_FILES REGISTER_FILES}{@link #IORING_REGISTER_EVENTFD REGISTER_EVENTFD}{@link #IORING_REGISTER_FILES_UPDATE REGISTER_FILES_UPDATE}
    {@link #IORING_REGISTER_EVENTFD_ASYNC REGISTER_EVENTFD_ASYNC}{@link #IORING_REGISTER_PROBE REGISTER_PROBE}{@link #IORING_REGISTER_PERSONALITY REGISTER_PERSONALITY}{@link #IORING_REGISTER_RESTRICTIONS REGISTER_RESTRICTIONS}
    {@link #IORING_REGISTER_ENABLE_RINGS REGISTER_ENABLE_RINGS}{@link #IORING_REGISTER_FILES2 REGISTER_FILES2}{@link #IORING_REGISTER_FILES_UPDATE2 REGISTER_FILES_UPDATE2}{@link #IORING_REGISTER_BUFFERS2 REGISTER_BUFFERS2}
    {@link #IORING_REGISTER_BUFFERS_UPDATE REGISTER_BUFFERS_UPDATE}{@link #IORING_REGISTER_IOWQ_AFF REGISTER_IOWQ_AFF}{@link #IORING_REGISTER_IOWQ_MAX_WORKERS REGISTER_IOWQ_MAX_WORKERS}{@link #IORING_REGISTER_RING_FDS REGISTER_RING_FDS}
    {@link #IORING_REGISTER_PBUF_RING REGISTER_PBUF_RING}{@link #IORING_REGISTER_SYNC_CANCEL REGISTER_SYNC_CANCEL}{@link #IORING_REGISTER_FILE_ALLOC_RANGE REGISTER_FILE_ALLOC_RANGE}{@link #IORING_REGISTER_LAST REGISTER_LAST}
    {@link #IORING_REGISTER_USE_REGISTERED_RING REGISTER_USE_REGISTERED_RING}{@link #IORING_REGISTER_FILES_SKIP REGISTER_FILES_SKIP}
    + * + * @return on success, returns 0. On error, -1 is returned, and {@code errno} is set accordingly. + */ + public static int io_uring_register(int fd, @NativeType("unsigned") int opcode, @NativeType("void *") long arg, @NativeType("unsigned") int nr_args) { + return nio_uring_register(fd, opcode, arg, nr_args); + } + + // --- [ io_uring_enter2 ] --- + + public static native int nio_uring_enter2(int fd, int to_submit, int min_complete, int flags, long sig, int sz); + + public static int io_uring_enter2(int fd, @NativeType("unsigned") int to_submit, @NativeType("unsigned") int min_complete, @NativeType("unsigned") int flags, @NativeType("sigset_t *") long sig, int sz) { + return nio_uring_enter2(fd, to_submit, min_complete, flags, sig, sz); + } + + // --- [ io_uring_enter ] --- + + /** Unsafe version of: {@link #io_uring_enter enter} */ + public static native int nio_uring_enter(int fd, int to_submit, int min_complete, int flags, long sig); + + /** + * {@code io_uring_enter()} is used to initiate and complete I/O using the shared submission and completion queues setup by a call to {@link #io_uring_setup setup}. + * + *

    A single call can both submit new I/O and wait for completions of I/O initiated by this call or previous calls to {@code io_uring_enter()}.

    + * + *

    If the {@code io_uring} instance was configured for polling, by specifying {@link #IORING_SETUP_IOPOLL SETUP_IOPOLL} in the call to {@code io_uring_setup()}, then + * {@code min_complete} has a slightly different meaning. Passing a value of 0 instructs the kernel to return any events which are already complete, + * without blocking. If {@code min_complete} is a non-zero value, the kernel will still return immediately if any completion events are available. If no + * event completions are available, then the call will poll either until one or more completions become available, or until the process has exceeded its + * scheduler time slice.

    + * + *

    Note that, for interrupt driven I/O (where {@code IORING_SETUP_IOPOLL} was not specified in the call to {@code io_uring_setup()}), an application may + * check the completion queue for event completions without entering the kernel at all.

    + * + *

    When the system call returns that a certain amount of SQEs have been consumed and submitted, it's safe to reuse SQE entries in the ring. This is true + * even if the actual IO submission had to be punted to async context, which means that the SQE may in fact not have been submitted yet. If the kernel + * requires later use of a particular SQE entry, it will have made a private copy of it.

    + * + * @param fd the file descriptor returned by {@link #io_uring_setup setup} + * @param to_submit the number of I/Os to submit from the submission queue + * @param flags one or more of:
    {@link #IORING_ENTER_GETEVENTS ENTER_GETEVENTS}{@link #IORING_ENTER_SQ_WAKEUP ENTER_SQ_WAKEUP}{@link #IORING_ENTER_SQ_WAIT ENTER_SQ_WAIT}{@link #IORING_ENTER_EXT_ARG ENTER_EXT_ARG}{@link #IORING_ENTER_REGISTERED_RING ENTER_REGISTERED_RING}
    + * @param sig a pointer to a signal mask (see {@code sigprocmask(2)}); if {@code sig} is not {@code NULL}, {@code io_uring_enter()} first replaces the current signal + * mask by the one pointed to by sig, then waits for events to become available in the completion queue, and then restores the original signal mask. + * The following {@code io_uring_enter()} call: + * + *
    
    +     *                  ret = io_uring_enter(fd, 0, 1, IORING_ENTER_GETEVENTS, &sig);
    + * + *

    is equivalent to atomically executing the following calls:

    + * + *
    
    +     *                  pthread_sigmask(SIG_SETMASK, &sig, &orig);
    +     *                  ret = io_uring_enter(fd, 0, 1, IORING_ENTER_GETEVENTS, NULL);
    +     *                  pthread_sigmask(SIG_SETMASK, &orig, NULL);
    + * + *

    See the description of {@code pselect(2)} for an explanation of why the {@code sig} parameter is necessary.

    + * + * @return the number of I/Os successfully consumed. + * + *

    This can be zero if {@code to_submit} was zero or if the submission queue was empty. Note that if the ring was created with {@link #IORING_SETUP_SQPOLL SETUP_SQPOLL} specified, + * then the return value will generally be the same as {@code to_submit} as submission happens outside the context of the system call.

    + * + *

    The errors related to a submission queue entry will be returned through a completion queue entry, rather than through the system call itself.

    + * + *

    Errors that occur not on behalf of a submission queue entry are returned via the system call directly. On such an error, -1 is returned and + * {@code errno} is set appropriately.

    + */ + public static int io_uring_enter(int fd, @NativeType("unsigned") int to_submit, @NativeType("unsigned") int min_complete, @NativeType("unsigned") int flags, @NativeType("sigset_t *") long sig) { + return nio_uring_enter(fd, to_submit, min_complete, flags, sig); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/LibURing.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/LibURing.java new file mode 100644 index 000000000..9328a9c5f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/linux/liburing/LibURing.java @@ -0,0 +1,2237 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.linux.liburing; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +import org.lwjgl.system.linux.*; + +/** Native bindings to liburing. */ +public class LibURing { + + static { Library.initialize(); } + + public static final long LIBURING_UDATA_TIMEOUT = -1L; + + protected LibURing() { + throw new UnsupportedOperationException(); + } + + // --- [ io_uring_get_probe_ring ] --- + + /** Unsafe version of: {@link #io_uring_get_probe_ring get_probe_ring} */ + public static native long nio_uring_get_probe_ring(long ring); + + /** + * Return an allocated {@code io_uring_probe} structure, or {@code NULL} if probe fails (for example, if it is not available). + * + *

    The caller is responsible for freeing it.

    + */ + @Nullable + @NativeType("struct io_uring_probe *") + public static IOURingProbe io_uring_get_probe_ring(@NativeType("struct io_uring *") IOURing ring) { + long __result = nio_uring_get_probe_ring(ring.address()); + return IOURingProbe.createSafe(__result); + } + + // --- [ io_uring_get_probe ] --- + + /** Unsafe version of: {@link #io_uring_get_probe get_probe} */ + public static native long nio_uring_get_probe(); + + /** + * Returns an allocated {@code io_uring_probe} structure to the caller. + * + *

    The caller is responsible for freeing the structure with the function {@link #io_uring_free_probe free_probe}.

    + * + *

    Note: Earlier versions of the Linux kernel (≤ 5.5) do not support probe. If the kernel doesn't support probe, this function will return {@code NULL}.

    + */ + @Nullable + @NativeType("struct io_uring_probe *") + public static IOURingProbe io_uring_get_probe() { + long __result = nio_uring_get_probe(); + return IOURingProbe.createSafe(__result); + } + + // --- [ io_uring_free_probe ] --- + + /** Unsafe version of: {@link #io_uring_free_probe free_probe} */ + public static native void nio_uring_free_probe(long probe); + + /** Frees the {@code probe} instance allocated with the {@link #io_uring_get_probe get_probe} function. */ + public static void io_uring_free_probe(@NativeType("struct io_uring_probe *") IOURingProbe probe) { + nio_uring_free_probe(probe.address()); + } + + // --- [ io_uring_opcode_supported ] --- + + /** Unsafe version of: {@link #io_uring_opcode_supported opcode_supported} */ + public static native int nio_uring_opcode_supported(long p, int op); + + /** + * Allows the caller to determine if the passed in {@code opcode} belonging to the {@code probe} param is supported. + * + *

    An instance of the {@code io_uring_probe} instance can be obtained by calling the function {@link #io_uring_get_probe get_probe}.

    + */ + public static int io_uring_opcode_supported(@NativeType("struct io_uring_probe const *") IOURingProbe p, int op) { + return nio_uring_opcode_supported(p.address(), op); + } + + // --- [ io_uring_queue_init_params ] --- + + public static native int nio_uring_queue_init_params(int entries, long ring, long p); + + public static int io_uring_queue_init_params(@NativeType("unsigned") int entries, @NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_params *") IOURingParams p) { + return nio_uring_queue_init_params(entries, ring.address(), p.address()); + } + + // --- [ io_uring_queue_init ] --- + + /** Unsafe version of: {@link #io_uring_queue_init queue_init} */ + public static native int nio_uring_queue_init(int entries, long ring, int flags); + + /** + * Executes the {@link #io_uring_setup setup} syscall to initialize the submission and completion queues in the kernel with at least {@code entries} entries and then maps the + * resulting file descriptor to memory shared between the application and the kernel. + * + *

    On success, the resources held by {@code ring} should be released via a corresponding call to {@link #io_uring_queue_exit queue_exit}.

    + * + * @param flags will be passed through to the {@link #io_uring_setup setup} syscall + * + * @return 0 on success and {@code ring} will point to the shared memory containing the {@code io_uring} queues. On failure {@code -errno} is returned. + */ + public static int io_uring_queue_init(@NativeType("unsigned") int entries, @NativeType("struct io_uring *") IOURing ring, @NativeType("unsigned") int flags) { + return nio_uring_queue_init(entries, ring.address(), flags); + } + + // --- [ io_uring_queue_mmap ] --- + + /** Unsafe version of: {@link #io_uring_queue_mmap queue_mmap} */ + public static native int nio_uring_queue_mmap(int fd, long p, long ring); + + /** + * For users that want to specify {@code sq_thread_cpu} or {@code sq_thread_idle}, this interface is a convenient helper for {@code mmap()}ing the rings. + * + * @param fd a file descriptor returned by {@link #io_uring_setup setup} + * @param ring on success, contains the necessary information to read/write to the rings + * + * @return {@code -errno} on error, or zero on success + */ + public static int io_uring_queue_mmap(int fd, @NativeType("struct io_uring_params *") IOURingParams p, @NativeType("struct io_uring *") IOURing ring) { + return nio_uring_queue_mmap(fd, p.address(), ring.address()); + } + + // --- [ io_uring_ring_dontfork ] --- + + /** Unsafe version of: {@link #io_uring_ring_dontfork ring_dontfork} */ + public static native int nio_uring_ring_dontfork(long ring); + + /** + * Ensure that the {@code mmap}'ed rings aren't available to a child after a {@code fork(2)}. + * + *

    This uses {@code madvise(..., MADV_DONTFORK)} on the {@code mmap}'ed ranges.

    + */ + public static int io_uring_ring_dontfork(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_ring_dontfork(ring.address()); + } + + // --- [ io_uring_queue_exit ] --- + + /** Unsafe version of: {@link #io_uring_queue_exit queue_exit} */ + public static native void nio_uring_queue_exit(long ring); + + /** + * Will release all resources acquired and initialized by {@link #io_uring_queue_init queue_init}. + * + *

    It first unmaps the memory shared between the application and the kernel and then closes the {@code io_uring} file descriptor.

    + */ + public static void io_uring_queue_exit(@NativeType("struct io_uring *") IOURing ring) { + nio_uring_queue_exit(ring.address()); + } + + // --- [ io_uring_peek_batch_cqe ] --- + + /** Unsafe version of: {@link #io_uring_peek_batch_cqe peek_batch_cqe} */ + public static native int nio_uring_peek_batch_cqe(long ring, long cqes, int count); + + /** + * Fill in an array of IO completions up to count, if any are available. + * + * @return the amount of IO completions filled + */ + @NativeType("unsigned") + public static int io_uring_peek_batch_cqe(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_cqe **") PointerBuffer cqes) { + return nio_uring_peek_batch_cqe(ring.address(), memAddress(cqes), cqes.remaining()); + } + + // --- [ io_uring_wait_cqes ] --- + + /** Unsafe version of: {@link #io_uring_wait_cqes wait_cqes} */ + public static native int nio_uring_wait_cqes(long ring, long cqe_ptr, int wait_nr, long ts, long sigmask); + + /** + * Returns {@code wait_nr} IO completions from the queue belonging to the {@code ring} param, waiting for it if necessary or until the timeout {@code ts} + * expires. + * + *

    If {@code ts} is specified, the application does not need to call {@link #io_uring_submit submit} before calling {@code io_uring_wait_cqes()}.

    + * + * @param cqe_ptr filled in on success + * @param sigmask the set of signals to block. The prevailing signal mask is restored before returning. + * + * @return 0 on success and the {@code cqe_ptr} param is filled in. On failure it returns {@code -errno}. + */ + public static int io_uring_wait_cqes(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_cqe **") PointerBuffer cqe_ptr, @Nullable @NativeType("struct __kernel_timespec *") KernelTimespec ts, @NativeType("sigset_t *") long sigmask) { + return nio_uring_wait_cqes(ring.address(), memAddress(cqe_ptr), cqe_ptr.remaining(), memAddressSafe(ts), sigmask); + } + + // --- [ io_uring_wait_cqe_timeout ] --- + + /** Unsafe version of: {@link #io_uring_wait_cqe_timeout wait_cqe_timeout} */ + public static native int nio_uring_wait_cqe_timeout(long ring, long cqe_ptr, long ts); + + /** + * Returns one IO completion from the queue belonging to the {@code ring} param, waiting for it if necessary or until the timeout {@code ts} expires. + * + *

    If {@code ts} is specified, the application does not need to call {@link #io_uring_submit submit} before calling {@code io_uring_wait_cqe_timeout()}.

    + * + * @param cqe_ptr filled in on success + * + * @return 0 on success and the {@code cqe_ptr} param is filled in. On failure it returns {@code -errno}. + */ + public static int io_uring_wait_cqe_timeout(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_cqe **") PointerBuffer cqe_ptr, @Nullable @NativeType("struct __kernel_timespec *") KernelTimespec ts) { + if (CHECKS) { + check(cqe_ptr, 1); + } + return nio_uring_wait_cqe_timeout(ring.address(), memAddress(cqe_ptr), memAddressSafe(ts)); + } + + // --- [ io_uring_submit ] --- + + /** Unsafe version of: {@link #io_uring_submit submit} */ + public static native int nio_uring_submit(long ring); + + /** + * Submits the next events to the submission queue belonging to the {@code ring}. + * + *

    After the caller retrieves a submission queue entry (SQE) with {@link #io_uring_get_sqe get_sqe}, prepares the SQE, it can be submitted with {@code io_uring_submit()}.

    + * + * @return the number of submitted submission queue entries on success. On failure it returns {@code -errno}. + */ + public static int io_uring_submit(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_submit(ring.address()); + } + + // --- [ io_uring_submit_and_wait ] --- + + /** Unsafe version of: {@link #io_uring_submit_and_wait submit_and_wait} */ + public static native int nio_uring_submit_and_wait(long ring, int wait_nr); + + /** + * Submits the next events to the submission queue belonging to the {@code ring} and waits for {@code wait_nr} completion events. + * + *

    After the caller retrieves a submission queue entry (SQE) with {@link #io_uring_get_sqe get_sqe}, prepares the SQE, it can be submitted with + * {@code io_uring_submit_and_wait()}.

    + * + * @return the number of submitted submission queue entries on success. On failure it returns {@code -errno}. + */ + public static int io_uring_submit_and_wait(@NativeType("struct io_uring *") IOURing ring, @NativeType("unsigned") int wait_nr) { + return nio_uring_submit_and_wait(ring.address(), wait_nr); + } + + // --- [ io_uring_submit_and_wait_timeout ] --- + + /** Unsafe version of: {@link #io_uring_submit_and_wait_timeout submit_and_wait_timeout} */ + public static native int nio_uring_submit_and_wait_timeout(long ring, long cqe_ptr, int wait_nr, long ts, long sigmask); + + /** + * Submits the next events to the submission queue belonging to the {@code ring} and waits for {@code wait_nr} completion events or until the timeout + * {@code ts} expires.The completion events are stored in the {@code cqe_ptr} array. + * + *

    After the caller retrieves a submission queue entry (SQE) with {@link #io_uring_get_sqe get_sqe}, prepares the SQE, it can be submitted with + * {@code io_uring_submit_and_wait_timeout()}.

    + * + * @param sigmask the set of signals to block. The prevailing signal mask is restored before returning. + * + * @return the number of submitted submission queue entries on success. On failure it returns {@code -errno}. + */ + public static int io_uring_submit_and_wait_timeout(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_cqe **") PointerBuffer cqe_ptr, @Nullable @NativeType("struct __kernel_timespec *") KernelTimespec ts, @NativeType("sigset_t *") long sigmask) { + return nio_uring_submit_and_wait_timeout(ring.address(), memAddress(cqe_ptr), cqe_ptr.remaining(), memAddressSafe(ts), sigmask); + } + + // --- [ io_uring_register_buffers ] --- + + /** Unsafe version of: {@link #io_uring_register_buffers register_buffers} */ + public static native int nio_uring_register_buffers(long ring, long iovecs, int nr_iovecs); + + /** + * Registers {@code nr_iovecs} number of buffers defined by the array {@code iovecs} belonging to the {@code ring}. + * + *

    After the caller has registered the buffers, they can be used with one of the fixed buffers functions.

    + * + *

    Registered buffers is an optimization that is useful in conjunction with {@code O_DIRECT} reads and writes, where maps the specified range into the + * kernel once when the buffer is registered, rather than doing a map and unmap for each IO every time IO is performed to that region. Additionally, it + * also avoids manipulating the page reference counts for each IO.

    + * + * @return 0 on success. On failure it returns {@code -errno}. + */ + public static int io_uring_register_buffers(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct iovec const *") IOVec.Buffer iovecs) { + return nio_uring_register_buffers(ring.address(), iovecs.address(), iovecs.remaining()); + } + + // --- [ io_uring_register_buffers_tags ] --- + + public static native int nio_uring_register_buffers_tags(long ring, long iovecs, long tags, int nr); + + public static int io_uring_register_buffers_tags(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct iovec const *") IOVec.Buffer iovecs, @NativeType("__u64 const *") LongBuffer tags) { + if (CHECKS) { + check(tags, iovecs.remaining()); + } + return nio_uring_register_buffers_tags(ring.address(), iovecs.address(), memAddress(tags), iovecs.remaining()); + } + + // --- [ io_uring_register_buffers_sparse ] --- + + /** Unsafe version of: {@link #io_uring_register_buffers_sparse register_buffers_sparse} */ + public static native int nio_uring_register_buffers_sparse(long ring, int nr_iovecs); + + /** + * Registers {@code nr_iovecs} empty buffers belonging to the {@code ring}. + * + *

    These buffers must be updated before use, using eg {@link #io_uring_register_buffers_update_tag register_buffers_update_tag}.

    + * + *

    After the caller has registered the buffers, they can be used with one of the fixed buffers functions.

    + * + *

    Registered buffers is an optimization that is useful in conjunction with {@code O_DIRECT} reads and writes, where it maps the specified range into the + * kernel once when the buffer is registered rather than doing a map and unmap for each IO every time IO is performed to that region. Additionally, it + * also avoids manipulating the page reference counts for each IO.

    + */ + public static int io_uring_register_buffers_sparse(@NativeType("struct io_uring *") IOURing ring, @NativeType("unsigned") int nr_iovecs) { + return nio_uring_register_buffers_sparse(ring.address(), nr_iovecs); + } + + // --- [ io_uring_register_buffers_update_tag ] --- + + public static native int nio_uring_register_buffers_update_tag(long ring, int off, long iovecs, long tags, int nr); + + public static int io_uring_register_buffers_update_tag(@NativeType("struct io_uring *") IOURing ring, @NativeType("unsigned") int off, @NativeType("struct iovec const *") IOVec.Buffer iovecs, @NativeType("__u64 const *") LongBuffer tags) { + if (CHECKS) { + check(tags, iovecs.remaining()); + } + return nio_uring_register_buffers_update_tag(ring.address(), off, iovecs.address(), memAddress(tags), iovecs.remaining()); + } + + // --- [ io_uring_unregister_buffers ] --- + + /** Unsafe version of: {@link #io_uring_unregister_buffers unregister_buffers} */ + public static native int nio_uring_unregister_buffers(long ring); + + /** + * Unregisters the fixed buffers previously registered to the {@code ring}. + * + * @return 0 on success. On failure it returns {@code -errno}. + */ + public static int io_uring_unregister_buffers(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_unregister_buffers(ring.address()); + } + + // --- [ io_uring_register_files ] --- + + /** Unsafe version of: {@link #io_uring_register_files register_files} */ + public static native int nio_uring_register_files(long ring, long files, int nr_files); + + /** + * Registers {@code nr_files} number of file descriptors defined by the array {@code files} belonging to the {@code ring} for subsequent operations. + * + *

    After the caller has registered the buffers, they can be used with the submission queue polling operations.

    + * + * @return 0 on success. On failure it returns {@code -errno}. + */ + public static int io_uring_register_files(@NativeType("struct io_uring *") IOURing ring, @NativeType("int const *") IntBuffer files) { + return nio_uring_register_files(ring.address(), memAddress(files), files.remaining()); + } + + // --- [ io_uring_register_files_tags ] --- + + public static native int nio_uring_register_files_tags(long ring, long files, long tags, int nr); + + public static int io_uring_register_files_tags(@NativeType("struct io_uring *") IOURing ring, @NativeType("int const *") IntBuffer files, @NativeType("__u64 const *") LongBuffer tags) { + if (CHECKS) { + check(tags, files.remaining()); + } + return nio_uring_register_files_tags(ring.address(), memAddress(files), memAddress(tags), files.remaining()); + } + + // --- [ io_uring_register_files_sparse ] --- + + /** Unsafe version of: {@link #io_uring_register_files_sparse register_files_sparse} */ + public static native int nio_uring_register_files_sparse(long ring, int nr_files); + + /** + * Registers an empty file table of {@code nr_files} number of file descriptors. + * + *

    Registering a file table is a prerequisite for using any request that uses direct descriptors.

    + * + *

    The sparse variant is available in kernels 5.19 and later.

    + */ + public static int io_uring_register_files_sparse(@NativeType("struct io_uring *") IOURing ring, @NativeType("unsigned") int nr_files) { + return nio_uring_register_files_sparse(ring.address(), nr_files); + } + + // --- [ io_uring_register_files_update_tag ] --- + + public static native int nio_uring_register_files_update_tag(long ring, int off, long files, long tags, int nr_files); + + public static int io_uring_register_files_update_tag(@NativeType("struct io_uring *") IOURing ring, @NativeType("unsigned") int off, @NativeType("int const *") IntBuffer files, @NativeType("__u64 const *") LongBuffer tags) { + if (CHECKS) { + check(tags, files.remaining()); + } + return nio_uring_register_files_update_tag(ring.address(), off, memAddress(files), memAddress(tags), files.remaining()); + } + + // --- [ io_uring_unregister_files ] --- + + public static native int nio_uring_unregister_files(long ring); + + public static int io_uring_unregister_files(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_unregister_files(ring.address()); + } + + // --- [ io_uring_register_files_update ] --- + + public static native int nio_uring_register_files_update(long ring, int off, long files, int nr_files); + + public static int io_uring_register_files_update(@NativeType("struct io_uring *") IOURing ring, @NativeType("unsigned") int off, @NativeType("int const *") IntBuffer files) { + return nio_uring_register_files_update(ring.address(), off, memAddress(files), files.remaining()); + } + + // --- [ io_uring_register_eventfd ] --- + + public static native int nio_uring_register_eventfd(long ring, int fd); + + public static int io_uring_register_eventfd(@NativeType("struct io_uring *") IOURing ring, int fd) { + return nio_uring_register_eventfd(ring.address(), fd); + } + + // --- [ io_uring_register_eventfd_async ] --- + + public static native int nio_uring_register_eventfd_async(long ring, int fd); + + public static int io_uring_register_eventfd_async(@NativeType("struct io_uring *") IOURing ring, int fd) { + return nio_uring_register_eventfd_async(ring.address(), fd); + } + + // --- [ io_uring_unregister_eventfd ] --- + + public static native int nio_uring_unregister_eventfd(long ring); + + public static int io_uring_unregister_eventfd(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_unregister_eventfd(ring.address()); + } + + // --- [ io_uring_register_probe ] --- + + public static native int nio_uring_register_probe(long ring, long p, int nr); + + public static int io_uring_register_probe(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_probe *") IOURingProbe p, @NativeType("unsigned") int nr) { + return nio_uring_register_probe(ring.address(), p.address(), nr); + } + + // --- [ io_uring_register_personality ] --- + + public static native int nio_uring_register_personality(long ring); + + public static int io_uring_register_personality(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_register_personality(ring.address()); + } + + // --- [ io_uring_unregister_personality ] --- + + public static native int nio_uring_unregister_personality(long ring, int id); + + public static int io_uring_unregister_personality(@NativeType("struct io_uring *") IOURing ring, int id) { + return nio_uring_unregister_personality(ring.address(), id); + } + + // --- [ io_uring_register_restrictions ] --- + + public static native int nio_uring_register_restrictions(long ring, long res, int nr_res); + + public static int io_uring_register_restrictions(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_restriction *") IOURingRestriction.Buffer res) { + return nio_uring_register_restrictions(ring.address(), res.address(), res.remaining()); + } + + // --- [ io_uring_enable_rings ] --- + + public static native int nio_uring_enable_rings(long ring); + + public static int io_uring_enable_rings(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_enable_rings(ring.address()); + } + + // --- [ __io_uring_sqring_wait ] --- + + public static native int n__io_uring_sqring_wait(long ring); + + public static int __io_uring_sqring_wait(@NativeType("struct io_uring *") IOURing ring) { + return n__io_uring_sqring_wait(ring.address()); + } + + // --- [ io_uring_register_iowq_aff ] --- + + public static native int nio_uring_register_iowq_aff(long ring, long cpusz, long mask); + + public static int io_uring_register_iowq_aff(@NativeType("struct io_uring *") IOURing ring, @NativeType("size_t") long cpusz, @NativeType("cpu_set_t const *") long mask) { + if (CHECKS) { + check(mask); + } + return nio_uring_register_iowq_aff(ring.address(), cpusz, mask); + } + + // --- [ io_uring_unregister_iowq_aff ] --- + + public static native int nio_uring_unregister_iowq_aff(long ring); + + public static int io_uring_unregister_iowq_aff(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_unregister_iowq_aff(ring.address()); + } + + // --- [ io_uring_register_iowq_max_workers ] --- + + public static native int nio_uring_register_iowq_max_workers(long ring, long values); + + public static int io_uring_register_iowq_max_workers(@NativeType("struct io_uring *") IOURing ring, @NativeType("unsigned int *") IntBuffer values) { + if (CHECKS) { + check(values, 2); + } + return nio_uring_register_iowq_max_workers(ring.address(), memAddress(values)); + } + + // --- [ io_uring_register_ring_fd ] --- + + /** Unsafe version of: {@link #io_uring_register_ring_fd register_ring_fd} */ + public static native int nio_uring_register_ring_fd(long ring); + + /** + * Registers the file descriptor of the ring. + * + *

    Whenever {@link #io_uring_enter enter} is called to submit request or wait for completions, the kernel must grab a reference to the file descriptor. If the application + * using io_uring is threaded, the file table is marked as shared, and the reference grab and put of the file descriptor count is more expensive than it + * is for a non-threaded application.

    + * + *

    Similarly to how io_uring allows registration of files, this allow registration of the ring file descriptor itself. This reduces the overhead of the + * {@code io_uring_enter (2)} system call.

    + * + *

    If an application using liburing is threaded, then an application should call this function to register the ring descriptor when a ring is set up. See + * NOTES for restrictions when a ring is shared.

    + * + *
    Note
    + * + *

    When the ring descriptor is registered, it is stored internally in the {@code struct io_uring} structure. For applications that share a ring between + * threads, for example having one thread do submits and another reap events, then this optimization cannot be used as each thread may have a different + * index for the registered ring fd.

    + *
    + * + * @return 1 on success, indicating that one file descriptor was registered, or {@code -errno} on error + */ + public static int io_uring_register_ring_fd(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_register_ring_fd(ring.address()); + } + + // --- [ io_uring_unregister_ring_fd ] --- + + /** Unsafe version of: {@link #io_uring_unregister_ring_fd unregister_ring_fd} */ + public static native int nio_uring_unregister_ring_fd(long ring); + + /** + * Unregisters the file descriptor of the ring. + * + *

    Unregisters a ring descriptor previously registered with the task. This is done automatically when {@link #io_uring_queue_exit queue_exit} is called, but can also be done to + * free up space for new ring registrations. For more information on ring descriptor registration, see {@link #io_uring_register_ring_fd register_ring_fd}.

    + * + * @return 1 on success, indicating that one file descriptor was unregistered, or {@code -errno} on error + */ + public static int io_uring_unregister_ring_fd(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_unregister_ring_fd(ring.address()); + } + + // --- [ io_uring_close_ring_fd ] --- + + public static native int nio_uring_close_ring_fd(long ring); + + public static int io_uring_close_ring_fd(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_close_ring_fd(ring.address()); + } + + // --- [ io_uring_register_buf_ring ] --- + + /** Unsafe version of: {@link #io_uring_register_buf_ring register_buf_ring} */ + public static native int nio_uring_register_buf_ring(long ring, long reg, int flags); + + /** + * Registers a shared buffer ring to be used with provided buffers. + * + *

    For the request types that support it, provided buffers are given to the ring and one is selected by a request if it has {@link LibIOURing#IOSQE_BUFFER_SELECT} set in + * the SQE {@code flags}, when the request is ready to receive data. This allows both clear ownership of the buffer lifetime, and a way to have more + * read/receive type of operations in flight than buffers available.

    + * + *

    The {@code reg} argument must be filled in with the appropriate information. It looks as follows:

    + * + *
    
    +     * struct io_uring_buf_reg {
    +     *     __u64 ring_addr;
    +     *     __u32 ring_entries;
    +     *     __u16 bgid;
    +     *     __u16 pad;
    +     *     __u64 resv[3];
    +     * };
    + * + *

    The {@code ring_addr} field must contain the address to the memory allocated to fit this ring. The memory must be page aligned and hence allocated + * appropriately using eg {@code posix_memalign (3)} or similar. The size of the ring is the product of {@code ring_entries} and the size of + * {@code "struct io_uring_buf"}. {@code ring_entries} is the desired size of the ring, and must be a power-of-2 in size. {@code bgid} is the buffer group + * ID associated with this ring. SQEs that select a buffer has a buffer group associated with them in their {@code buf_group} field, and the associated + * CQE will have {@link LibIOURing#IORING_CQE_F_BUFFER} set in their {@code flags} member, which will also contain the specific ID of the buffer selected. The + * rest of the fields are reserved and must be cleared to zero.

    + * + *

    The {@code flags} argument is currently unused and must be set to zero.

    + * + *

    A shared buffer ring looks as follows:

    + * + *
    
    +     * struct io_uring_buf_ring {
    +     *     union {
    +     *     struct {
    +     *             __u64 resv1;
    +     *             __u32 resv2;
    +     *             __u16 resv3;
    +     *             __u16 tail;
    +     *     };
    +     *     struct io_uring_buf bufs[0];
    +     *     };
    +     * };
    + * + *

    where {@code tail} is the index at which the application can insert new buffers for consumption by requests, and {@code struct io_uring_buf} is buffer + * definition:

    + * + *
    
    +     * struct io_uring_buf {
    +     *     __u64 addr;
    +     *     __u32 len;
    +     *     __u16 bid;
    +     *     __u16 resv;
    +     * };
    + * + *

    where {@code addr} is the address for the buffer, {@code len} is the length of the buffer in bytes, and {@code bid} is the buffer ID that will be + * returned in the CQE once consumed.

    + * + *

    Reserved fields must not be touched. Applications must use {@link #io_uring_buf_ring_init buf_ring_init} to initialise the buffer ring. Applications may use + * {@link #io_uring_buf_ring_add buf_ring_add} and {@link #io_uring_buf_ring_advance buf_ring_advance} or {@link #io_uring_buf_ring_advance buf_ring_advance} to provide buffers, which will set these fields and update the tail.

    + * + *

    Available since 5.19.

    + * + * @return 0 on success, {@code -errno} on failure + */ + public static int io_uring_register_buf_ring(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_buf_reg *") IOURingBufReg reg, @NativeType("unsigned int") int flags) { + return nio_uring_register_buf_ring(ring.address(), reg.address(), flags); + } + + // --- [ io_uring_unregister_buf_ring ] --- + + /** Unsafe version of: {@link #io_uring_unregister_buf_ring unregister_buf_ring} */ + public static native int nio_uring_unregister_buf_ring(long ring, int bgid); + + /** + * Function unregisters a previously registered shared buffer ring indicated by {@code bgid}. + * + * @return 0 on success, {@code -errno} on failure + */ + public static int io_uring_unregister_buf_ring(@NativeType("struct io_uring *") IOURing ring, int bgid) { + return nio_uring_unregister_buf_ring(ring.address(), bgid); + } + + // --- [ io_uring_register_sync_cancel ] --- + + public static native int nio_uring_register_sync_cancel(long ring, long reg); + + public static int io_uring_register_sync_cancel(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_sync_cancel_reg *") IOURingSyncCancelReg reg) { + return nio_uring_register_sync_cancel(ring.address(), reg.address()); + } + + // --- [ io_uring_register_file_alloc_range ] --- + + public static native int nio_uring_register_file_alloc_range(long ring, int off, int len); + + public static int io_uring_register_file_alloc_range(@NativeType("struct io_uring *") IOURing ring, @NativeType("unsigned") int off, @NativeType("unsigned") int len) { + return nio_uring_register_file_alloc_range(ring.address(), off, len); + } + + // --- [ io_uring_get_events ] --- + + /** Unsafe version of: {@link #io_uring_get_events get_events} */ + public static native int nio_uring_get_events(long ring); + + /** + * Runs outstanding work and flushes completion events to the CQE ring. + * + *

    There can be events needing to be flushed if the ring was full and had overflowed. Alternatively if the ring was setup with the {@link LibIOURing#IORING_SETUP_DEFER_TASKRUN SETUP_DEFER_TASKRUN} + * flag then this will process outstanding tasks, possibly resulting in more CQEs.

    + * + * @return 0 on success, {@code -errno} on failure + */ + public static int io_uring_get_events(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_get_events(ring.address()); + } + + // --- [ io_uring_submit_and_get_events ] --- + + /** Unsafe version of: {@link #io_uring_submit_and_get_events submit_and_get_events} */ + public static native int nio_uring_submit_and_get_events(long ring); + + /** + * Submits the next events to the submission queue as with {@link #io_uring_submit submit}. + * + *

    After submission it will flush CQEs as with {@link #io_uring_get_events get_events}.

    + * + *

    The benefit of this function is that it does both with only one system call.

    + * + * @return the number of submitted submission queue entries on success, {@code -errno} on failure + */ + public static int io_uring_submit_and_get_events(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_submit_and_get_events(ring.address()); + } + + // --- [ io_uring_enter ] --- + + /** Unsafe version of: {@link #io_uring_enter enter} */ + public static native int nio_uring_enter(int fd, int to_submit, int min_complete, int flags, long sig); + + /** See {@link LibIOURing#io_uring_enter enter}. */ + public static int io_uring_enter(@NativeType("unsigned int") int fd, @NativeType("unsigned int") int to_submit, @NativeType("unsigned int") int min_complete, @NativeType("unsigned int") int flags, @NativeType("sigset_t *") long sig) { + if (CHECKS) { + check(sig); + } + return nio_uring_enter(fd, to_submit, min_complete, flags, sig); + } + + // --- [ io_uring_enter2 ] --- + + /** Unsafe version of: {@link #io_uring_enter2 enter2} */ + public static native int nio_uring_enter2(int fd, int to_submit, int min_complete, int flags, long sig, long sz); + + /** See {@link LibIOURing#io_uring_enter2 enter2}. */ + public static int io_uring_enter2(@NativeType("unsigned int") int fd, @NativeType("unsigned int") int to_submit, @NativeType("unsigned int") int min_complete, @NativeType("unsigned int") int flags, @NativeType("sigset_t *") long sig, @NativeType("size_t") long sz) { + if (CHECKS) { + check(sig); + } + return nio_uring_enter2(fd, to_submit, min_complete, flags, sig, sz); + } + + // --- [ io_uring_setup ] --- + + /** Unsafe version of: {@link #io_uring_setup setup} */ + public static native int nio_uring_setup(int entries, long p); + + /** See {@link LibIOURing#io_uring_setup setup}. */ + public static int io_uring_setup(@NativeType("unsigned int") int entries, @NativeType("struct io_uring_params *") IOURingParams p) { + return nio_uring_setup(entries, p.address()); + } + + // --- [ io_uring_register ] --- + + /** See {@link LibIOURing#io_uring_register register}. */ + public static native int io_uring_register(@NativeType("unsigned int") int fd, @NativeType("unsigned int") int opcode, @NativeType("void *") long arg, @NativeType("unsigned int") int nr_args); + + // --- [ io_uring_setup_buf_ring ] --- + + public static native long nio_uring_setup_buf_ring(long ring, int nentries, int bgid, int flags, long ret); + + @Nullable + @NativeType("struct io_uring_buf_ring *") + public static IOURingBufRing io_uring_setup_buf_ring(@NativeType("struct io_uring *") IOURing ring, @NativeType("unsigned int") int nentries, int bgid, @NativeType("unsigned int") int flags, @NativeType("int *") IntBuffer ret) { + if (CHECKS) { + check(ret, 1); + } + long __result = nio_uring_setup_buf_ring(ring.address(), nentries, bgid, flags, memAddress(ret)); + return IOURingBufRing.createSafe(__result); + } + + // --- [ io_uring_free_buf_ring ] --- + + public static native int nio_uring_free_buf_ring(long ring, long br, int nentries, int bgid); + + public static int io_uring_free_buf_ring(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_buf_ring *") IOURingBufRing br, @NativeType("unsigned int") int nentries, int bgid) { + return nio_uring_free_buf_ring(ring.address(), br.address(), nentries, bgid); + } + + // --- [ io_uring_cqe_seen ] --- + + /** Unsafe version of: {@link #io_uring_cqe_seen cqe_seen} */ + public static native void nio_uring_cqe_seen(long ring, long cqe); + + /** + * Marks the IO completion {@code cqe} belonging to the {@code ring} param as processed. + * + *

    After the caller has submitted a request with {@link #io_uring_submit submit}, they can retrieve the completion with {@link #io_uring_wait_cqe wait_cqe} and mark it then as processed with + * {@code io_uring_cqe_seen()}.

    + * + *

    Completions must be marked as completed, so their slot can get reused.

    + */ + public static void io_uring_cqe_seen(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_cqe *") IOURingCQE cqe) { + nio_uring_cqe_seen(ring.address(), cqe.address()); + } + + // --- [ io_uring_sqe_set_data ] --- + + /** Unsafe version of: {@link #io_uring_sqe_set_data sqe_set_data} */ + public static native void nio_uring_sqe_set_data(long sqe, long data); + + /** + * Stores a {@code user_data} pointer with the submission queue entry {@code sqe}. + * + *

    After the caller has requested an submission queue entry (SQE) with {@link #io_uring_get_sqe get_sqe}, they can associate a data pointer with the SQE. Once the completion + * arrives, the function {@link #io_uring_cqe_get_data cqe_get_data} can be called to identify the user request.

    + */ + public static void io_uring_sqe_set_data(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("void *") long data) { + if (CHECKS) { + check(data); + } + nio_uring_sqe_set_data(sqe.address(), data); + } + + // --- [ io_uring_cqe_get_data ] --- + + /** Unsafe version of: {@link #io_uring_cqe_get_data cqe_get_data} */ + public static native long nio_uring_cqe_get_data(long cqe); + + /** + * Returns the {@code user_data} with the completion queue entry {@code cqe}. + * + *

    After the caller has received a completion queue entry (CQE) with {@link #io_uring_wait_cqe wait_cqe}, they can call the {@code io_uring_cqe_get_data()} function to retrieve + * the {@code user_data} value. This requires that {@code user_data} has been set earlier with the function {@link #io_uring_sqe_set_data sqe_set_data}.

    + */ + @NativeType("void *") + public static long io_uring_cqe_get_data(@NativeType("struct io_uring_cqe const *") IOURingCQE cqe) { + return nio_uring_cqe_get_data(cqe.address()); + } + + // --- [ io_uring_sqe_set_data64 ] --- + + /** Unsafe version of: {@link #io_uring_sqe_set_data64 sqe_set_data64} */ + public static native void nio_uring_sqe_set_data64(long sqe, long data); + + /** + * Assign a 64-bit value to this {@code sqe}, which can get retrieved at completion time with {@link #io_uring_cqe_get_data64 cqe_get_data64}. + * + *

    Just like the non-64 variants, except these store a 64-bit type rather than a data pointer.

    + */ + public static void io_uring_sqe_set_data64(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("__u64") long data) { + nio_uring_sqe_set_data64(sqe.address(), data); + } + + // --- [ io_uring_cqe_get_data64 ] --- + + /** Unsafe version of: {@link #io_uring_cqe_get_data64 cqe_get_data64} */ + public static native long nio_uring_cqe_get_data64(long cqe); + + /** See {@link #io_uring_sqe_set_data64 sqe_set_data64}. */ + @NativeType("__u64") + public static long io_uring_cqe_get_data64(@NativeType("struct io_uring_cqe const *") IOURingCQE cqe) { + return nio_uring_cqe_get_data64(cqe.address()); + } + + // --- [ io_uring_sqe_set_flags ] --- + + /** Unsafe version of: {@link #io_uring_sqe_set_flags sqe_set_flags} */ + public static native void nio_uring_sqe_set_flags(long sqe, int flags); + + /** + * Allows the caller to change the behavior of the submission queue entry by specifying flags. + * + *

    It enables the {@code flags} belonging to the {@code sqe} submission queue entry param.

    + */ + public static void io_uring_sqe_set_flags(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("unsigned int") int flags) { + nio_uring_sqe_set_flags(sqe.address(), flags); + } + + // --- [ io_uring_prep_splice ] --- + + /** Unsafe version of: {@link #io_uring_prep_splice prep_splice} */ + public static native void nio_uring_prep_splice(long sqe, int fd_in, long off_in, int fd_out, long off_out, int nbytes, int splice_flags); + + /** + * Precondition: Either {@code fd_in} or {@code fd_out} must be a pipe. + * + *

    This splice operation can be used to implement {@code sendfile} by splicing to an intermediate pipe first, then splice to the final destination. In + * fact, the implementation of {@code sendfile} in kernel uses {@code splice} internally.

    + * + *

    NOTE that even if {@code fd_in} or {@code fd_out} refers to a pipe, the splice operation can still fail with {@code EINVAL} if one of the fd doesn't + * explicitly support splice operation, e.g. reading from terminal is unsupported from kernel 5.7 to 5.11. Check issue #291 for more information.

    + * + * @param off_in if {@code fd_in} refers to a pipe, {@code off_in} must be {@code (int64_t) -1}; If {@code fd_in} does not refer to a pipe and {@code off_in} is + * {@code (int64_t) -1}, then bytes are read from {@code fd_in} starting from the file offset and it is adjust appropriately; If {@code fd_in} does + * not refer to a pipe and {@code off_in} is not {@code (int64_t) -1}, then the starting {@code offset} of {@code fd_in} will be {@code off_in}. + * @param off_out the description of {@code off_in} also applied to {@code off_out} + * @param splice_flags see man {@code splice(2)} for description of flags + */ + public static void io_uring_prep_splice(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd_in, @NativeType("int64_t") long off_in, int fd_out, @NativeType("int64_t") long off_out, @NativeType("unsigned int") int nbytes, @NativeType("unsigned int") int splice_flags) { + nio_uring_prep_splice(sqe.address(), fd_in, off_in, fd_out, off_out, nbytes, splice_flags); + } + + // --- [ io_uring_prep_tee ] --- + + public static native void nio_uring_prep_tee(long sqe, int fd_in, int fd_out, int nbytes, int splice_flags); + + public static void io_uring_prep_tee(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd_in, int fd_out, @NativeType("unsigned int") int nbytes, @NativeType("unsigned int") int splice_flags) { + nio_uring_prep_tee(sqe.address(), fd_in, fd_out, nbytes, splice_flags); + } + + // --- [ io_uring_prep_readv ] --- + + /** Unsafe version of: {@link #io_uring_prep_readv prep_readv} */ + public static native void nio_uring_prep_readv(long sqe, int fd, long iovecs, int nr_vecs, int offset); + + /** + * Prepares a vectored IO read request. + * + *

    The submission queue entry {@code sqe} is setup to use the file descriptor {@code fd} to start reading {@code nr_vecs} into the {@code iovecs} array at + * the specified {@code offset}.

    + * + *

    On files that support seeking, if the {@code offset} is set to -1, the read operation commences at the file offset, and the file offset is incremented + * by the number of bytes read. See {@code read(2)} for more details.

    + * + *

    On files that are not capable of seeking, the offset is ignored.

    + * + *

    After the write has been prepared it can be submitted with one of the submit functions.

    + */ + public static void io_uring_prep_readv(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct iovec const *") IOVec.Buffer iovecs, int offset) { + nio_uring_prep_readv(sqe.address(), fd, iovecs.address(), iovecs.remaining(), offset); + } + + // --- [ io_uring_prep_readv2 ] --- + + /** Unsafe version of: {@link #io_uring_prep_readv2 prep_readv2} */ + public static native void nio_uring_prep_readv2(long sqe, int fd, long iovecs, int nr_vecs, int offset, int flags); + + /** + * Prepares a vectored IO read request. + * + *

    The submission queue entry {@code sqe} is setup to use the file descriptor {@code fd} to start reading {@code nr_vecs} into the {@code iovecs} array at + * the specified {@code offset}.

    + * + *

    The behavior of the function can be controlled with the {@code flags} parameter. Supported values for flags are:

    + * + *
      + *
    • {@code RWF_HIPRI} - High priority request, poll if possible
    • + *
    • {@code RWF_DSYNC} - per-IO {@code O_DSYNC}
    • + *
    • {@code RWF_SYNC} - per-IO {@code O_SYNC}
    • + *
    • {@code RWF_NOWAIT} - per-IO, return {@code -EAGAIN} if operation would block
    • + *
    • {@code RWF_APPEND} - per-IO {@code O_APPEND}
    • + *
    + * + *

    On files that support seeking, if the {@code offset} is set to -1, the read operation commences at the file offset, and the file offset is incremented + * by the number of bytes read. See {@code read(2)} for more details.

    + * + *

    On files that are not capable of seeking, the offset is ignored.

    + * + *

    After the write has been prepared, it can be submitted with one of the submit functions.

    + */ + public static void io_uring_prep_readv2(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct iovec const *") IOVec.Buffer iovecs, int offset, int flags) { + nio_uring_prep_readv2(sqe.address(), fd, iovecs.address(), iovecs.remaining(), offset, flags); + } + + // --- [ io_uring_prep_read_fixed ] --- + + /** Unsafe version of: {@link #io_uring_prep_read_fixed prep_read_fixed} */ + public static native void nio_uring_prep_read_fixed(long sqe, int fd, long buf, int nbytes, int offset, int buf_index); + + /** + * Prepares an IO read request with a previously registered IO buffer. + * + *

    The submission queue entry {@code sqe} is setup to use the file descriptor {@code fd} to start reading {@code nbytes} into the buffer {@code buf} at + * the specified {@code offset}, and with the buffer matching the registered index of {@code buf_index}.

    + * + *

    This work just like {@link #io_uring_prep_read prep_read} except it requires the user of buffers that have been registered with {@link #io_uring_register_buffers register_buffers}. The {@code buf} and + * {@code nbytes} arguments must fall within a region specificed by {@code buf_index} in the previously registered buffer. The buffer need not be aligned + * with the start of the registered buffer.

    + * + *

    After the read has been prepared it can be submitted with one of the submit functions.

    + */ + public static void io_uring_prep_read_fixed(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("void *") ByteBuffer buf, int offset, int buf_index) { + nio_uring_prep_read_fixed(sqe.address(), fd, memAddress(buf), buf.remaining(), offset, buf_index); + } + + // --- [ io_uring_prep_writev ] --- + + /** Unsafe version of: {@link #io_uring_prep_writev prep_writev} */ + public static native void nio_uring_prep_writev(long sqe, int fd, long iovecs, int nr_vecs, int offset); + + /** + * Prepares a vectored IO write request. + * + *

    The submission queue entry {@code sqe} is setup to use the file descriptor {@code fd} to start writing {@code nr_vecs} from the {@code iovecs} array at + * the specified {@code offset}.

    + * + *

    On files that support seeking, if the {@code offset} is set to -1, the write operation commences at the file offset, and the file offset is incremented + * by the number of bytes written. See {@code write(2)} for more details.

    + * + *

    On files that are not capable of seeking, the offset is ignored.

    + * + *

    After the write has been prepared it can be submitted with one of the submit functions.

    + */ + public static void io_uring_prep_writev(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct iovec const *") IOVec.Buffer iovecs, int offset) { + nio_uring_prep_writev(sqe.address(), fd, iovecs.address(), iovecs.remaining(), offset); + } + + // --- [ io_uring_prep_writev2 ] --- + + /** Unsafe version of: {@link #io_uring_prep_writev2 prep_writev2} */ + public static native void nio_uring_prep_writev2(long sqe, int fd, long iovecs, int nr_vecs, int offset, int flags); + + /** + * Prepares a vectored IO write request. + * + *

    The submission queue entry {@code sqe} is setup to use the file descriptor {@code fd} to start writing {@code nr_vecs} from the {@code iovecs} array at + * the specified {@code offset}.

    + * + *

    The behavior of the function can be controlled with the {@code flags} parameter. Supported values for flags are:

    + * + *
      + *
    • {@code RWF_HIPRI} - High priority request, poll if possible
    • + *
    • {@code RWF_DSYNC} - per-IO {@code O_DSYNC}
    • + *
    • {@code RWF_SYNC} - per-IO {@code O_SYNC}
    • + *
    • {@code RWF_NOWAIT} - per-IO, return {@code -EAGAIN} if operation would block
    • + *
    • {@code RWF_APPEND} - per-IO {@code O_APPEND}
    • + *
    + * + *

    On files that support seeking, if the {@code offset} is set to -1, the write operation commences at the file offset, and the file offset is incremented + * by the number of bytes written. See {@code write(2)} for more details.

    + * + *

    On files that are not capable of seeking, the offset is ignored.

    + * + *

    After the write has been prepared, it can be submitted with one of the submit functions.

    + */ + public static void io_uring_prep_writev2(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct iovec const *") IOVec.Buffer iovecs, int offset, int flags) { + nio_uring_prep_writev2(sqe.address(), fd, iovecs.address(), iovecs.remaining(), offset, flags); + } + + // --- [ io_uring_prep_write_fixed ] --- + + /** Unsafe version of: {@link #io_uring_prep_write_fixed prep_write_fixed} */ + public static native void nio_uring_prep_write_fixed(long sqe, int fd, long buf, int nbytes, int offset, int buf_index); + + /** + * Prepares an IO write request with a previously registered IO buffer. + * + *

    The submission queue entry {@code sqe} is setup to use the file descriptor {@code fd} to start writing {@code nbytes} from the buffer {@code buf} at + * the specified {@code offset}, and with the buffer matching the registered index of {@code buf_index}.

    + * + *

    This work just like {@link #io_uring_prep_write prep_write} except it requires the user of buffers that have been registered with {@link #io_uring_register_buffers register_buffers}. The {@code buf} and + * {@code nbytes} arguments must fall within a region specificed by {@code buf_index} in the previously registered buffer. The buffer need not be aligned + * with the start of the registered buffer.

    + * + *

    After the read has been prepared it can be submitted with one of the submit functions.

    + */ + public static void io_uring_prep_write_fixed(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("void const *") ByteBuffer buf, int offset, int buf_index) { + nio_uring_prep_write_fixed(sqe.address(), fd, memAddress(buf), buf.remaining(), offset, buf_index); + } + + // --- [ io_uring_prep_recvmsg ] --- + + public static native void nio_uring_prep_recvmsg(long sqe, int fd, long msg, int flags); + + public static void io_uring_prep_recvmsg(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct msghdr *") Msghdr msg, @NativeType("unsigned int") int flags) { + nio_uring_prep_recvmsg(sqe.address(), fd, msg.address(), flags); + } + + // --- [ io_uring_prep_recvmsg_multishot ] --- + + public static native void nio_uring_prep_recvmsg_multishot(long sqe, int fd, long msg, int flags); + + public static void io_uring_prep_recvmsg_multishot(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct msghdr *") Msghdr msg, @NativeType("unsigned") int flags) { + nio_uring_prep_recvmsg_multishot(sqe.address(), fd, msg.address(), flags); + } + + // --- [ io_uring_prep_sendmsg ] --- + + public static native void nio_uring_prep_sendmsg(long sqe, int fd, long msg, int flags); + + public static void io_uring_prep_sendmsg(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct msghdr const *") Msghdr msg, @NativeType("unsigned int") int flags) { + if (CHECKS) { + Msghdr.validate(msg.address()); + } + nio_uring_prep_sendmsg(sqe.address(), fd, msg.address(), flags); + } + + // --- [ io_uring_prep_poll_add ] --- + + public static native void nio_uring_prep_poll_add(long sqe, int fd, int poll_mask); + + public static void io_uring_prep_poll_add(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("unsigned int") int poll_mask) { + nio_uring_prep_poll_add(sqe.address(), fd, poll_mask); + } + + // --- [ io_uring_prep_poll_multishot ] --- + + public static native void nio_uring_prep_poll_multishot(long sqe, int fd, int poll_mask); + + public static void io_uring_prep_poll_multishot(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("unsigned int") int poll_mask) { + nio_uring_prep_poll_multishot(sqe.address(), fd, poll_mask); + } + + // --- [ io_uring_prep_poll_remove ] --- + + public static native void nio_uring_prep_poll_remove(long sqe, long user_data); + + public static void io_uring_prep_poll_remove(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("__u64") long user_data) { + nio_uring_prep_poll_remove(sqe.address(), user_data); + } + + // --- [ io_uring_prep_poll_update ] --- + + public static native void nio_uring_prep_poll_update(long sqe, long old_user_data, long new_user_data, int poll_mask, int flags); + + public static void io_uring_prep_poll_update(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("__u64") long old_user_data, @NativeType("__u64") long new_user_data, @NativeType("unsigned int") int poll_mask, @NativeType("unsigned int") int flags) { + nio_uring_prep_poll_update(sqe.address(), old_user_data, new_user_data, poll_mask, flags); + } + + // --- [ io_uring_prep_fsync ] --- + + public static native void nio_uring_prep_fsync(long sqe, int fd, int fsync_flags); + + public static void io_uring_prep_fsync(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("unsigned int") int fsync_flags) { + nio_uring_prep_fsync(sqe.address(), fd, fsync_flags); + } + + // --- [ io_uring_prep_nop ] --- + + public static native void nio_uring_prep_nop(long sqe); + + public static void io_uring_prep_nop(@NativeType("struct io_uring_sqe *") IOURingSQE sqe) { + nio_uring_prep_nop(sqe.address()); + } + + // --- [ io_uring_prep_timeout ] --- + + public static native void nio_uring_prep_timeout(long sqe, long ts, int count, int flags); + + public static void io_uring_prep_timeout(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("struct __kernel_timespec *") KernelTimespec ts, @NativeType("unsigned int") int count, @NativeType("unsigned int") int flags) { + nio_uring_prep_timeout(sqe.address(), ts.address(), count, flags); + } + + // --- [ io_uring_prep_timeout_remove ] --- + + public static native void nio_uring_prep_timeout_remove(long sqe, long user_data, int flags); + + public static void io_uring_prep_timeout_remove(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("__u64") long user_data, @NativeType("unsigned int") int flags) { + nio_uring_prep_timeout_remove(sqe.address(), user_data, flags); + } + + // --- [ io_uring_prep_timeout_update ] --- + + public static native void nio_uring_prep_timeout_update(long sqe, long ts, long user_data, int flags); + + public static void io_uring_prep_timeout_update(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("struct __kernel_timespec *") KernelTimespec ts, @NativeType("__u64") long user_data, @NativeType("unsigned int") int flags) { + nio_uring_prep_timeout_update(sqe.address(), ts.address(), user_data, flags); + } + + // --- [ io_uring_prep_accept ] --- + + public static native void nio_uring_prep_accept(long sqe, int fd, long addr, long addrlen, int flags); + + public static void io_uring_prep_accept(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct sockaddr *") Sockaddr addr, @NativeType("socklen_t *") IntBuffer addrlen, int flags) { + if (CHECKS) { + check(addrlen, 1); + } + nio_uring_prep_accept(sqe.address(), fd, addr.address(), memAddress(addrlen), flags); + } + + // --- [ io_uring_prep_accept_direct ] --- + + public static native void nio_uring_prep_accept_direct(long sqe, int fd, long addr, long addrlen, int flags, int file_index); + + public static void io_uring_prep_accept_direct(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct sockaddr *") Sockaddr addr, @NativeType("socklen_t *") IntBuffer addrlen, int flags, @NativeType("unsigned int") int file_index) { + if (CHECKS) { + check(addrlen, 1); + } + nio_uring_prep_accept_direct(sqe.address(), fd, addr.address(), memAddress(addrlen), flags, file_index); + } + + // --- [ io_uring_prep_multishot_accept ] --- + + public static native void nio_uring_prep_multishot_accept(long sqe, int fd, long addr, long addrlen, int flags); + + public static void io_uring_prep_multishot_accept(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct sockaddr *") Sockaddr addr, @NativeType("socklen_t *") IntBuffer addrlen, int flags) { + if (CHECKS) { + check(addrlen, 1); + } + nio_uring_prep_multishot_accept(sqe.address(), fd, addr.address(), memAddress(addrlen), flags); + } + + // --- [ io_uring_prep_multishot_accept_direct ] --- + + public static native void nio_uring_prep_multishot_accept_direct(long sqe, int fd, long addr, long addrlen, int flags); + + public static void io_uring_prep_multishot_accept_direct(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct sockaddr *") Sockaddr addr, @NativeType("socklen_t *") IntBuffer addrlen, int flags) { + if (CHECKS) { + check(addrlen, 1); + } + nio_uring_prep_multishot_accept_direct(sqe.address(), fd, addr.address(), memAddress(addrlen), flags); + } + + // --- [ io_uring_prep_cancel64 ] --- + + public static native void nio_uring_prep_cancel64(long sqe, long user_data, int flags); + + public static void io_uring_prep_cancel64(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("__u64") long user_data, int flags) { + nio_uring_prep_cancel64(sqe.address(), user_data, flags); + } + + // --- [ io_uring_prep_cancel ] --- + + public static native void nio_uring_prep_cancel(long sqe, long user_data, int flags); + + public static void io_uring_prep_cancel(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("void *") long user_data, int flags) { + if (CHECKS) { + check(user_data); + } + nio_uring_prep_cancel(sqe.address(), user_data, flags); + } + + // --- [ io_uring_prep_cancel_fd ] --- + + public static native void nio_uring_prep_cancel_fd(long sqe, int fd, int flags); + + public static void io_uring_prep_cancel_fd(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("unsigned int") int flags) { + nio_uring_prep_cancel_fd(sqe.address(), fd, flags); + } + + // --- [ io_uring_prep_link_timeout ] --- + + public static native void nio_uring_prep_link_timeout(long sqe, long ts, int flags); + + public static void io_uring_prep_link_timeout(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("struct __kernel_timespec *") KernelTimespec ts, @NativeType("unsigned int") int flags) { + nio_uring_prep_link_timeout(sqe.address(), ts.address(), flags); + } + + // --- [ io_uring_prep_connect ] --- + + public static native void nio_uring_prep_connect(long sqe, int fd, long addr, int addrlen); + + public static void io_uring_prep_connect(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct sockaddr const *") Sockaddr addr, @NativeType("socklen_t") int addrlen) { + nio_uring_prep_connect(sqe.address(), fd, addr.address(), addrlen); + } + + // --- [ io_uring_prep_files_update ] --- + + public static native void nio_uring_prep_files_update(long sqe, long fds, int nr_fds, int offset); + + public static void io_uring_prep_files_update(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("int *") IntBuffer fds, int offset) { + nio_uring_prep_files_update(sqe.address(), memAddress(fds), fds.remaining(), offset); + } + + // --- [ io_uring_prep_fallocate ] --- + + public static native void nio_uring_prep_fallocate(long sqe, int fd, int mode, long offset, long len); + + public static void io_uring_prep_fallocate(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, int mode, @NativeType("off_t") long offset, @NativeType("off_t") long len) { + nio_uring_prep_fallocate(sqe.address(), fd, mode, offset, len); + } + + // --- [ io_uring_prep_openat ] --- + + public static native void nio_uring_prep_openat(long sqe, int dfd, long path, int flags, int mode); + + public static void io_uring_prep_openat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") ByteBuffer path, int flags, int mode) { + if (CHECKS) { + checkNT1(path); + } + nio_uring_prep_openat(sqe.address(), dfd, memAddress(path), flags, mode); + } + + public static void io_uring_prep_openat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") CharSequence path, int flags, int mode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(path, true); + long pathEncoded = stack.getPointerAddress(); + nio_uring_prep_openat(sqe.address(), dfd, pathEncoded, flags, mode); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_openat_direct ] --- + + public static native void nio_uring_prep_openat_direct(long sqe, int dfd, long path, int flags, int mode, int file_index); + + public static void io_uring_prep_openat_direct(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") ByteBuffer path, int flags, int mode, @NativeType("unsigned int") int file_index) { + if (CHECKS) { + checkNT1(path); + } + nio_uring_prep_openat_direct(sqe.address(), dfd, memAddress(path), flags, mode, file_index); + } + + public static void io_uring_prep_openat_direct(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") CharSequence path, int flags, int mode, @NativeType("unsigned int") int file_index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(path, true); + long pathEncoded = stack.getPointerAddress(); + nio_uring_prep_openat_direct(sqe.address(), dfd, pathEncoded, flags, mode, file_index); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_close ] --- + + public static native void nio_uring_prep_close(long sqe, int fd); + + public static void io_uring_prep_close(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd) { + nio_uring_prep_close(sqe.address(), fd); + } + + // --- [ io_uring_prep_close_direct ] --- + + public static native void nio_uring_prep_close_direct(long sqe, int file_index); + + public static void io_uring_prep_close_direct(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("unsigned int") int file_index) { + nio_uring_prep_close_direct(sqe.address(), file_index); + } + + // --- [ io_uring_prep_read ] --- + + /** Unsafe version of: {@link #io_uring_prep_read prep_read} */ + public static native void nio_uring_prep_read(long sqe, int fd, long buf, int nbytes, int offset); + + /** + * Prepares an IO read request. + * + *

    The submission queue entry {@code sqe} is setup to use the file descriptor {@code fd} to start reading {@code nbytes} into the buffer {@code buf} at + * the specified {@code offset}.

    + * + *

    On files that support seeking, if the {@code offset} is set to -1, the read operation commences at the file offset, and the file offset is incremented + * by the number of bytes read. See {@code read(2)} for more details.

    + * + *

    On files that are not capable of seeking, the {@code offset} is ignored.

    + * + *

    After the read has been prepared it can be submitted with one of the submit functions.

    + */ + public static void io_uring_prep_read(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("void *") ByteBuffer buf, int offset) { + nio_uring_prep_read(sqe.address(), fd, memAddress(buf), buf.remaining(), offset); + } + + // --- [ io_uring_prep_write ] --- + + /** Unsafe version of: {@link #io_uring_prep_write prep_write} */ + public static native void nio_uring_prep_write(long sqe, int fd, long buf, int nbytes, int offset); + + /** + * Prepares an IO write request. + * + *

    The submission queue entry {@code sqe} is setup to use the file descriptor {@code fd} to start writing {@code nbytes} from the buffer {@code buf} at + * the specified {@code offset}.

    + * + *

    On files that support seeking, if the {@code offset} is set to -1, the write operation commences at the file offset, and the file offset is incremented + * by the number of bytes written. See {@code write(2)} for more details.

    + * + *

    On files that are not capable of seeking, the offset is ignored.

    + * + *

    After the write has been prepared, it can be submitted with one of the submit functions.

    + */ + public static void io_uring_prep_write(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("void const *") ByteBuffer buf, int offset) { + nio_uring_prep_write(sqe.address(), fd, memAddress(buf), buf.remaining(), offset); + } + + // --- [ io_uring_prep_statx ] --- + + public static native void nio_uring_prep_statx(long sqe, int dfd, long path, int flags, int mask, long statxbuf); + + public static void io_uring_prep_statx(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") ByteBuffer path, int flags, @NativeType("unsigned int") int mask, @NativeType("struct statx *") Statx statxbuf) { + if (CHECKS) { + checkNT1(path); + } + nio_uring_prep_statx(sqe.address(), dfd, memAddress(path), flags, mask, statxbuf.address()); + } + + public static void io_uring_prep_statx(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") CharSequence path, int flags, @NativeType("unsigned int") int mask, @NativeType("struct statx *") Statx statxbuf) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(path, true); + long pathEncoded = stack.getPointerAddress(); + nio_uring_prep_statx(sqe.address(), dfd, pathEncoded, flags, mask, statxbuf.address()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_fadvise ] --- + + public static native void nio_uring_prep_fadvise(long sqe, int fd, int offset, long len, int advice); + + public static void io_uring_prep_fadvise(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, int offset, @NativeType("off_t") long len, int advice) { + nio_uring_prep_fadvise(sqe.address(), fd, offset, len, advice); + } + + // --- [ io_uring_prep_madvise ] --- + + public static native void nio_uring_prep_madvise(long sqe, long addr, long length, int advice); + + public static void io_uring_prep_madvise(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("void *") ByteBuffer addr, int advice) { + nio_uring_prep_madvise(sqe.address(), memAddress(addr), addr.remaining(), advice); + } + + // --- [ io_uring_prep_send ] --- + + public static native void nio_uring_prep_send(long sqe, int sockfd, long buf, long len, int flags); + + public static void io_uring_prep_send(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int sockfd, @NativeType("void const *") ByteBuffer buf, int flags) { + nio_uring_prep_send(sqe.address(), sockfd, memAddress(buf), buf.remaining(), flags); + } + + // --- [ io_uring_prep_send_set_addr ] --- + + public static native void nio_uring_prep_send_set_addr(long sqe, long dest_addr, short addr_len); + + public static void io_uring_prep_send_set_addr(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("struct sockaddr const *") Sockaddr dest_addr, @NativeType("__u16") short addr_len) { + nio_uring_prep_send_set_addr(sqe.address(), dest_addr.address(), addr_len); + } + + // --- [ io_uring_prep_sendto ] --- + + public static native void nio_uring_prep_sendto(long sqe, int sockfd, long buf, long len, int flags, long addr, int addrlen); + + public static void io_uring_prep_sendto(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int sockfd, @NativeType("void const *") ByteBuffer buf, int flags, @NativeType("struct sockaddr const *") Sockaddr addr, @NativeType("socklen_t") int addrlen) { + nio_uring_prep_sendto(sqe.address(), sockfd, memAddress(buf), buf.remaining(), flags, addr.address(), addrlen); + } + + // --- [ io_uring_prep_send_zc ] --- + + public static native void nio_uring_prep_send_zc(long sqe, int sockfd, long buf, long len, int flags, int zc_flags); + + public static void io_uring_prep_send_zc(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int sockfd, @NativeType("void const *") ByteBuffer buf, int flags, @NativeType("unsigned") int zc_flags) { + nio_uring_prep_send_zc(sqe.address(), sockfd, memAddress(buf), buf.remaining(), flags, zc_flags); + } + + // --- [ io_uring_prep_send_zc_fixed ] --- + + public static native void nio_uring_prep_send_zc_fixed(long sqe, int sockfd, long buf, long len, int flags, int zc_flags, int buf_index); + + public static void io_uring_prep_send_zc_fixed(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int sockfd, @NativeType("void const *") ByteBuffer buf, int flags, @NativeType("unsigned") int zc_flags, @NativeType("unsigned") int buf_index) { + nio_uring_prep_send_zc_fixed(sqe.address(), sockfd, memAddress(buf), buf.remaining(), flags, zc_flags, buf_index); + } + + // --- [ io_uring_prep_sendmsg_zc ] --- + + public static native void nio_uring_prep_sendmsg_zc(long sqe, int fd, long msg, int flags); + + public static void io_uring_prep_sendmsg_zc(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("struct msghdr const *") Msghdr msg, @NativeType("unsigned") int flags) { + if (CHECKS) { + Msghdr.validate(msg.address()); + } + nio_uring_prep_sendmsg_zc(sqe.address(), fd, msg.address(), flags); + } + + // --- [ io_uring_prep_recv ] --- + + public static native void nio_uring_prep_recv(long sqe, int sockfd, long buf, long len, int flags); + + public static void io_uring_prep_recv(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int sockfd, @NativeType("void *") ByteBuffer buf, int flags) { + nio_uring_prep_recv(sqe.address(), sockfd, memAddress(buf), buf.remaining(), flags); + } + + // --- [ io_uring_prep_recv_multishot ] --- + + public static native void nio_uring_prep_recv_multishot(long sqe, int sockfd, long buf, long len, int flags); + + public static void io_uring_prep_recv_multishot(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int sockfd, @NativeType("void *") ByteBuffer buf, int flags) { + nio_uring_prep_recv_multishot(sqe.address(), sockfd, memAddress(buf), buf.remaining(), flags); + } + + // --- [ io_uring_recvmsg_validate ] --- + + public static native long nio_uring_recvmsg_validate(long buf, int buf_len, long msgh); + + @Nullable + @NativeType("struct io_uring_recvmsg_out *") + public static IOURingRecvmsgOut io_uring_recvmsg_validate(@NativeType("void *") ByteBuffer buf, @NativeType("struct msghdr *") Msghdr msgh) { + long __result = nio_uring_recvmsg_validate(memAddress(buf), buf.remaining(), msgh.address()); + return IOURingRecvmsgOut.createSafe(__result); + } + + // --- [ io_uring_recvmsg_name ] --- + + public static native long nio_uring_recvmsg_name(long o); + + @NativeType("void *") + public static long io_uring_recvmsg_name(@NativeType("struct io_uring_recvmsg_out *") IOURingRecvmsgOut o) { + return nio_uring_recvmsg_name(o.address()); + } + + // --- [ io_uring_recvmsg_cmsg_firsthdr ] --- + + public static native long nio_uring_recvmsg_cmsg_firsthdr(long o, long msgh); + + @Nullable + @NativeType("struct cmsghdr *") + public static CMsghdr io_uring_recvmsg_cmsg_firsthdr(@NativeType("struct io_uring_recvmsg_out *") IOURingRecvmsgOut o, @NativeType("struct msghdr *") Msghdr msgh) { + long __result = nio_uring_recvmsg_cmsg_firsthdr(o.address(), msgh.address()); + return CMsghdr.createSafe(__result); + } + + // --- [ io_uring_recvmsg_cmsg_nexthdr ] --- + + public static native long nio_uring_recvmsg_cmsg_nexthdr(long o, long msgh, long cmsg); + + @Nullable + @NativeType("struct cmsghdr *") + public static CMsghdr io_uring_recvmsg_cmsg_nexthdr(@NativeType("struct io_uring_recvmsg_out *") IOURingRecvmsgOut o, @NativeType("struct msghdr *") Msghdr msgh, @NativeType("struct cmsghdr *") CMsghdr cmsg) { + long __result = nio_uring_recvmsg_cmsg_nexthdr(o.address(), msgh.address(), cmsg.address()); + return CMsghdr.createSafe(__result); + } + + // --- [ io_uring_recvmsg_payload ] --- + + public static native long nio_uring_recvmsg_payload(long o, long msgh); + + @NativeType("void *") + public static long io_uring_recvmsg_payload(@NativeType("struct io_uring_recvmsg_out *") IOURingRecvmsgOut o, @NativeType("struct msghdr *") Msghdr msgh) { + return nio_uring_recvmsg_payload(o.address(), msgh.address()); + } + + // --- [ io_uring_recvmsg_payload_length ] --- + + public static native int nio_uring_recvmsg_payload_length(long o, int buf_len, long msgh); + + @NativeType("unsigned int") + public static int io_uring_recvmsg_payload_length(@NativeType("struct io_uring_recvmsg_out *") IOURingRecvmsgOut o, int buf_len, @NativeType("struct msghdr *") Msghdr msgh) { + return nio_uring_recvmsg_payload_length(o.address(), buf_len, msgh.address()); + } + + // --- [ io_uring_prep_openat2 ] --- + + public static native void nio_uring_prep_openat2(long sqe, int dfd, long path, long how); + + public static void io_uring_prep_openat2(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") ByteBuffer path, @NativeType("struct open_how *") OpenHow how) { + if (CHECKS) { + checkNT1(path); + } + nio_uring_prep_openat2(sqe.address(), dfd, memAddress(path), how.address()); + } + + public static void io_uring_prep_openat2(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") CharSequence path, @NativeType("struct open_how *") OpenHow how) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(path, true); + long pathEncoded = stack.getPointerAddress(); + nio_uring_prep_openat2(sqe.address(), dfd, pathEncoded, how.address()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_openat2_direct ] --- + + /** Unsafe version of: {@link #io_uring_prep_openat2_direct prep_openat2_direct} */ + public static native void nio_uring_prep_openat2_direct(long sqe, int dfd, long path, long how, int file_index); + + /** open directly into the fixed file table */ + public static void io_uring_prep_openat2_direct(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") ByteBuffer path, @NativeType("struct open_how *") OpenHow how, @NativeType("unsigned int") int file_index) { + if (CHECKS) { + checkNT1(path); + } + nio_uring_prep_openat2_direct(sqe.address(), dfd, memAddress(path), how.address(), file_index); + } + + /** open directly into the fixed file table */ + public static void io_uring_prep_openat2_direct(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") CharSequence path, @NativeType("struct open_how *") OpenHow how, @NativeType("unsigned int") int file_index) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(path, true); + long pathEncoded = stack.getPointerAddress(); + nio_uring_prep_openat2_direct(sqe.address(), dfd, pathEncoded, how.address(), file_index); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_epoll_ctl ] --- + + public static native void nio_uring_prep_epoll_ctl(long sqe, int epfd, int fd, int op, long ev); + + public static void io_uring_prep_epoll_ctl(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int epfd, int fd, int op, @NativeType("struct epoll_event *") EpollEvent ev) { + nio_uring_prep_epoll_ctl(sqe.address(), epfd, fd, op, ev.address()); + } + + // --- [ io_uring_prep_provide_buffers ] --- + + public static native void nio_uring_prep_provide_buffers(long sqe, long addr, int len, int nr, int bgid, int bid); + + public static void io_uring_prep_provide_buffers(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("void *") ByteBuffer addr, int nr, int bgid, int bid) { + nio_uring_prep_provide_buffers(sqe.address(), memAddress(addr), addr.remaining(), nr, bgid, bid); + } + + // --- [ io_uring_prep_remove_buffers ] --- + + public static native void nio_uring_prep_remove_buffers(long sqe, int nr, int bgid); + + public static void io_uring_prep_remove_buffers(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int nr, int bgid) { + nio_uring_prep_remove_buffers(sqe.address(), nr, bgid); + } + + // --- [ io_uring_prep_shutdown ] --- + + public static native void nio_uring_prep_shutdown(long sqe, int fd, int how); + + public static void io_uring_prep_shutdown(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, int how) { + nio_uring_prep_shutdown(sqe.address(), fd, how); + } + + // --- [ io_uring_prep_unlinkat ] --- + + public static native void nio_uring_prep_unlinkat(long sqe, int dfd, long path, int flags); + + public static void io_uring_prep_unlinkat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") ByteBuffer path, int flags) { + if (CHECKS) { + checkNT1(path); + } + nio_uring_prep_unlinkat(sqe.address(), dfd, memAddress(path), flags); + } + + public static void io_uring_prep_unlinkat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") CharSequence path, int flags) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(path, true); + long pathEncoded = stack.getPointerAddress(); + nio_uring_prep_unlinkat(sqe.address(), dfd, pathEncoded, flags); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_unlink ] --- + + public static native void nio_uring_prep_unlink(long sqe, long path, int flags); + + public static void io_uring_prep_unlink(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") ByteBuffer path, int flags) { + if (CHECKS) { + checkNT1(path); + } + nio_uring_prep_unlink(sqe.address(), memAddress(path), flags); + } + + public static void io_uring_prep_unlink(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") CharSequence path, int flags) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(path, true); + long pathEncoded = stack.getPointerAddress(); + nio_uring_prep_unlink(sqe.address(), pathEncoded, flags); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_renameat ] --- + + public static native void nio_uring_prep_renameat(long sqe, int olddfd, long oldpath, int newdfd, long newpath, int flags); + + public static void io_uring_prep_renameat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int olddfd, @NativeType("char const *") ByteBuffer oldpath, int newdfd, @NativeType("char const *") ByteBuffer newpath, @NativeType("unsigned int") int flags) { + if (CHECKS) { + checkNT1(oldpath); + checkNT1(newpath); + } + nio_uring_prep_renameat(sqe.address(), olddfd, memAddress(oldpath), newdfd, memAddress(newpath), flags); + } + + public static void io_uring_prep_renameat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int olddfd, @NativeType("char const *") CharSequence oldpath, int newdfd, @NativeType("char const *") CharSequence newpath, @NativeType("unsigned int") int flags) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(oldpath, true); + long oldpathEncoded = stack.getPointerAddress(); + stack.nUTF8(newpath, true); + long newpathEncoded = stack.getPointerAddress(); + nio_uring_prep_renameat(sqe.address(), olddfd, oldpathEncoded, newdfd, newpathEncoded, flags); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_rename ] --- + + public static native void nio_uring_prep_rename(long sqe, long oldpath, long newpath); + + public static void io_uring_prep_rename(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") ByteBuffer oldpath, @NativeType("char const *") ByteBuffer newpath) { + if (CHECKS) { + checkNT1(oldpath); + checkNT1(newpath); + } + nio_uring_prep_rename(sqe.address(), memAddress(oldpath), memAddress(newpath)); + } + + public static void io_uring_prep_rename(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") CharSequence oldpath, @NativeType("char const *") CharSequence newpath) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(oldpath, true); + long oldpathEncoded = stack.getPointerAddress(); + stack.nUTF8(newpath, true); + long newpathEncoded = stack.getPointerAddress(); + nio_uring_prep_rename(sqe.address(), oldpathEncoded, newpathEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_sync_file_range ] --- + + public static native void nio_uring_prep_sync_file_range(long sqe, int fd, int len, int offset, int flags); + + public static void io_uring_prep_sync_file_range(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("unsigned int") int len, int offset, int flags) { + nio_uring_prep_sync_file_range(sqe.address(), fd, len, offset, flags); + } + + // --- [ io_uring_prep_mkdirat ] --- + + public static native void nio_uring_prep_mkdirat(long sqe, int dfd, long path, int mode); + + public static void io_uring_prep_mkdirat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") ByteBuffer path, int mode) { + if (CHECKS) { + checkNT1(path); + } + nio_uring_prep_mkdirat(sqe.address(), dfd, memAddress(path), mode); + } + + public static void io_uring_prep_mkdirat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int dfd, @NativeType("char const *") CharSequence path, int mode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(path, true); + long pathEncoded = stack.getPointerAddress(); + nio_uring_prep_mkdirat(sqe.address(), dfd, pathEncoded, mode); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_mkdir ] --- + + public static native void nio_uring_prep_mkdir(long sqe, long path, int mode); + + public static void io_uring_prep_mkdir(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") ByteBuffer path, int mode) { + if (CHECKS) { + checkNT1(path); + } + nio_uring_prep_mkdir(sqe.address(), memAddress(path), mode); + } + + public static void io_uring_prep_mkdir(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") CharSequence path, int mode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(path, true); + long pathEncoded = stack.getPointerAddress(); + nio_uring_prep_mkdir(sqe.address(), pathEncoded, mode); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_symlinkat ] --- + + public static native void nio_uring_prep_symlinkat(long sqe, long target, int newdirfd, long linkpath); + + public static void io_uring_prep_symlinkat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") ByteBuffer target, int newdirfd, @NativeType("char const *") ByteBuffer linkpath) { + if (CHECKS) { + checkNT1(target); + checkNT1(linkpath); + } + nio_uring_prep_symlinkat(sqe.address(), memAddress(target), newdirfd, memAddress(linkpath)); + } + + public static void io_uring_prep_symlinkat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") CharSequence target, int newdirfd, @NativeType("char const *") CharSequence linkpath) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(target, true); + long targetEncoded = stack.getPointerAddress(); + stack.nUTF8(linkpath, true); + long linkpathEncoded = stack.getPointerAddress(); + nio_uring_prep_symlinkat(sqe.address(), targetEncoded, newdirfd, linkpathEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_symlink ] --- + + public static native void nio_uring_prep_symlink(long sqe, long target, long linkpath); + + public static void io_uring_prep_symlink(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") ByteBuffer target, @NativeType("char const *") ByteBuffer linkpath) { + if (CHECKS) { + checkNT1(target); + checkNT1(linkpath); + } + nio_uring_prep_symlink(sqe.address(), memAddress(target), memAddress(linkpath)); + } + + public static void io_uring_prep_symlink(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") CharSequence target, @NativeType("char const *") CharSequence linkpath) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(target, true); + long targetEncoded = stack.getPointerAddress(); + stack.nUTF8(linkpath, true); + long linkpathEncoded = stack.getPointerAddress(); + nio_uring_prep_symlink(sqe.address(), targetEncoded, linkpathEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_linkat ] --- + + public static native void nio_uring_prep_linkat(long sqe, int olddfd, long oldpath, int newdfd, long newpath, int flags); + + public static void io_uring_prep_linkat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int olddfd, @NativeType("char const *") ByteBuffer oldpath, int newdfd, @NativeType("char const *") ByteBuffer newpath, int flags) { + if (CHECKS) { + checkNT1(oldpath); + checkNT1(newpath); + } + nio_uring_prep_linkat(sqe.address(), olddfd, memAddress(oldpath), newdfd, memAddress(newpath), flags); + } + + public static void io_uring_prep_linkat(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int olddfd, @NativeType("char const *") CharSequence oldpath, int newdfd, @NativeType("char const *") CharSequence newpath, int flags) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(oldpath, true); + long oldpathEncoded = stack.getPointerAddress(); + stack.nUTF8(newpath, true); + long newpathEncoded = stack.getPointerAddress(); + nio_uring_prep_linkat(sqe.address(), olddfd, oldpathEncoded, newdfd, newpathEncoded, flags); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_link ] --- + + public static native void nio_uring_prep_link(long sqe, long oldpath, long newpath, int flags); + + public static void io_uring_prep_link(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") ByteBuffer oldpath, @NativeType("char const *") ByteBuffer newpath, int flags) { + if (CHECKS) { + checkNT1(oldpath); + checkNT1(newpath); + } + nio_uring_prep_link(sqe.address(), memAddress(oldpath), memAddress(newpath), flags); + } + + public static void io_uring_prep_link(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") CharSequence oldpath, @NativeType("char const *") CharSequence newpath, int flags) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(oldpath, true); + long oldpathEncoded = stack.getPointerAddress(); + stack.nUTF8(newpath, true); + long newpathEncoded = stack.getPointerAddress(); + nio_uring_prep_link(sqe.address(), oldpathEncoded, newpathEncoded, flags); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_msg_ring_cqe_flags ] --- + + public static native void nio_uring_prep_msg_ring_cqe_flags(long sqe, int fd, int len, long data, int flags, int cqe_flags); + + public static void io_uring_prep_msg_ring_cqe_flags(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("unsigned int") int len, @NativeType("__u64") long data, @NativeType("unsigned int") int flags, @NativeType("unsigned int") int cqe_flags) { + nio_uring_prep_msg_ring_cqe_flags(sqe.address(), fd, len, data, flags, cqe_flags); + } + + // --- [ io_uring_prep_msg_ring ] --- + + public static native void nio_uring_prep_msg_ring(long sqe, int fd, int len, long data, int flags); + + public static void io_uring_prep_msg_ring(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("unsigned int") int len, @NativeType("__u64") long data, @NativeType("unsigned int") int flags) { + nio_uring_prep_msg_ring(sqe.address(), fd, len, data, flags); + } + + // --- [ io_uring_prep_msg_ring_fd ] --- + + public static native void nio_uring_prep_msg_ring_fd(long sqe, int fd, int source_fd, int target_fd, long data, int flags); + + public static void io_uring_prep_msg_ring_fd(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, int source_fd, int target_fd, @NativeType("__u64") long data, @NativeType("unsigned int") int flags) { + nio_uring_prep_msg_ring_fd(sqe.address(), fd, source_fd, target_fd, data, flags); + } + + // --- [ io_uring_prep_msg_ring_fd_alloc ] --- + + public static native void nio_uring_prep_msg_ring_fd_alloc(long sqe, int fd, int source_fd, long data, int flags); + + public static void io_uring_prep_msg_ring_fd_alloc(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, int source_fd, @NativeType("__u64") long data, @NativeType("unsigned int") int flags) { + nio_uring_prep_msg_ring_fd_alloc(sqe.address(), fd, source_fd, data, flags); + } + + // --- [ io_uring_prep_getxattr ] --- + + public static native void nio_uring_prep_getxattr(long sqe, long name, long value, long path, int len); + + public static void io_uring_prep_getxattr(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") ByteBuffer name, @NativeType("char *") ByteBuffer value, @NativeType("char const *") ByteBuffer path) { + if (CHECKS) { + checkNT1(name); + checkNT1(path); + } + nio_uring_prep_getxattr(sqe.address(), memAddress(name), memAddress(value), memAddress(path), value.remaining()); + } + + public static void io_uring_prep_getxattr(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") CharSequence name, @NativeType("char *") ByteBuffer value, @NativeType("char const *") CharSequence path) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + stack.nUTF8(path, true); + long pathEncoded = stack.getPointerAddress(); + nio_uring_prep_getxattr(sqe.address(), nameEncoded, memAddress(value), pathEncoded, value.remaining()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_setxattr ] --- + + public static native void nio_uring_prep_setxattr(long sqe, long name, long value, long path, int flags, int len); + + public static void io_uring_prep_setxattr(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") ByteBuffer name, @NativeType("char const *") ByteBuffer value, @NativeType("char const *") ByteBuffer path, int flags) { + if (CHECKS) { + checkNT1(name); + checkNT1(path); + } + nio_uring_prep_setxattr(sqe.address(), memAddress(name), memAddress(value), memAddress(path), flags, value.remaining()); + } + + public static void io_uring_prep_setxattr(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, @NativeType("char const *") CharSequence name, @NativeType("char const *") ByteBuffer value, @NativeType("char const *") CharSequence path, int flags) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + stack.nUTF8(path, true); + long pathEncoded = stack.getPointerAddress(); + nio_uring_prep_setxattr(sqe.address(), nameEncoded, memAddress(value), pathEncoded, flags, value.remaining()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_fgetxattr ] --- + + public static native void nio_uring_prep_fgetxattr(long sqe, int fd, long name, long value, int len); + + public static void io_uring_prep_fgetxattr(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("char const *") ByteBuffer name, @NativeType("char *") ByteBuffer value) { + if (CHECKS) { + checkNT1(name); + } + nio_uring_prep_fgetxattr(sqe.address(), fd, memAddress(name), memAddress(value), value.remaining()); + } + + public static void io_uring_prep_fgetxattr(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("char const *") CharSequence name, @NativeType("char *") ByteBuffer value) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + nio_uring_prep_fgetxattr(sqe.address(), fd, nameEncoded, memAddress(value), value.remaining()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_fsetxattr ] --- + + public static native void nio_uring_prep_fsetxattr(long sqe, int fd, long name, long value, int flags, int len); + + public static void io_uring_prep_fsetxattr(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("char const *") ByteBuffer name, @NativeType("char const *") ByteBuffer value, int flags) { + if (CHECKS) { + checkNT1(name); + } + nio_uring_prep_fsetxattr(sqe.address(), fd, memAddress(name), memAddress(value), flags, value.remaining()); + } + + public static void io_uring_prep_fsetxattr(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int fd, @NativeType("char const *") CharSequence name, @NativeType("char const *") ByteBuffer value, int flags) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + nio_uring_prep_fsetxattr(sqe.address(), fd, nameEncoded, memAddress(value), flags, value.remaining()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ io_uring_prep_socket ] --- + + public static native void nio_uring_prep_socket(long sqe, int domain, int type, int protocol, int flags); + + public static void io_uring_prep_socket(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int domain, int type, int protocol, @NativeType("unsigned int") int flags) { + nio_uring_prep_socket(sqe.address(), domain, type, protocol, flags); + } + + // --- [ io_uring_prep_socket_direct ] --- + + public static native void nio_uring_prep_socket_direct(long sqe, int domain, int type, int protocol, int file_index, int flags); + + public static void io_uring_prep_socket_direct(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int domain, int type, int protocol, @NativeType("unsigned int") int file_index, @NativeType("unsigned int") int flags) { + nio_uring_prep_socket_direct(sqe.address(), domain, type, protocol, file_index, flags); + } + + // --- [ io_uring_prep_socket_direct_alloc ] --- + + public static native void nio_uring_prep_socket_direct_alloc(long sqe, int domain, int type, int protocol, int flags); + + public static void io_uring_prep_socket_direct_alloc(@NativeType("struct io_uring_sqe *") IOURingSQE sqe, int domain, int type, int protocol, @NativeType("unsigned int") int flags) { + nio_uring_prep_socket_direct_alloc(sqe.address(), domain, type, protocol, flags); + } + + // --- [ io_uring_sq_ready ] --- + + /** Unsafe version of: {@link #io_uring_sq_ready sq_ready} */ + public static native int nio_uring_sq_ready(long ring); + + /** Returns the number of unconsumed (if {@code SQPOLL}) or unsubmitted entries that exist in the SQ ring belonging to the {@code ring} param. */ + @NativeType("unsigned int") + public static int io_uring_sq_ready(@NativeType("struct io_uring const *") IOURing ring) { + if (CHECKS) { + IOURing.validate(ring.address()); + } + return nio_uring_sq_ready(ring.address()); + } + + // --- [ io_uring_sq_space_left ] --- + + /** Unsafe version of: {@link #io_uring_sq_space_left sq_space_left} */ + public static native int nio_uring_sq_space_left(long ring); + + /** Returns how much space is left in the SQ ring belonging to the {@code ring} param. */ + @NativeType("unsigned int") + public static int io_uring_sq_space_left(@NativeType("struct io_uring const *") IOURing ring) { + if (CHECKS) { + IOURing.validate(ring.address()); + } + return nio_uring_sq_space_left(ring.address()); + } + + // --- [ io_uring_sqring_wait ] --- + + /** Unsafe version of: {@link #io_uring_sqring_wait sqring_wait} */ + public static native int nio_uring_sqring_wait(long ring); + + /** + * Allows the caller to wait for space to free up in the SQ ring belonging to the {@code ring} param, which happens when the kernel side thread has + * consumed one or more entries. + * + *

    If the SQ ring is currently non-full, no action is taken.

    + * + *

    This feature can only be used when {@code SQPOLL} is enabled.

    + */ + public static int io_uring_sqring_wait(@NativeType("struct io_uring *") IOURing ring) { + return nio_uring_sqring_wait(ring.address()); + } + + // --- [ io_uring_cq_ready ] --- + + /** Unsafe version of: {@link #io_uring_cq_ready cq_ready} */ + public static native int nio_uring_cq_ready(long ring); + + /** Retuns the number of unconsumed entries that are ready belonging to the {@code ring} param. */ + @NativeType("unsigned int") + public static int io_uring_cq_ready(@NativeType("struct io_uring const *") IOURing ring) { + if (CHECKS) { + IOURing.validate(ring.address()); + } + return nio_uring_cq_ready(ring.address()); + } + + // --- [ io_uring_cq_has_overflow ] --- + + /** Unsafe version of: {@link #io_uring_cq_has_overflow cq_has_overflow} */ + public static native boolean nio_uring_cq_has_overflow(long ring); + + /** Returns true if there are overflow entries waiting to be flushed onto the CQ ring */ + @NativeType("bool") + public static boolean io_uring_cq_has_overflow(@NativeType("struct io_uring const *") IOURing ring) { + if (CHECKS) { + IOURing.validate(ring.address()); + } + return nio_uring_cq_has_overflow(ring.address()); + } + + // --- [ io_uring_cq_eventfd_enabled ] --- + + /** Unsafe version of: {@link #io_uring_cq_eventfd_enabled cq_eventfd_enabled} */ + public static native boolean nio_uring_cq_eventfd_enabled(long ring); + + /** Returns true if the {@code eventfd} notification is currently enabled. */ + @NativeType("bool") + public static boolean io_uring_cq_eventfd_enabled(@NativeType("struct io_uring const *") IOURing ring) { + if (CHECKS) { + IOURing.validate(ring.address()); + } + return nio_uring_cq_eventfd_enabled(ring.address()); + } + + // --- [ io_uring_cq_eventfd_toggle ] --- + + /** Unsafe version of: {@link #io_uring_cq_eventfd_toggle cq_eventfd_toggle} */ + public static native int nio_uring_cq_eventfd_toggle(long ring, boolean enabled); + + /** Toggle {@code eventfd} notification on or off, if an {@code eventfd} is registered with the ring. */ + public static int io_uring_cq_eventfd_toggle(@NativeType("struct io_uring *") IOURing ring, @NativeType("bool") boolean enabled) { + return nio_uring_cq_eventfd_toggle(ring.address(), enabled); + } + + // --- [ io_uring_wait_cqe_nr ] --- + + /** Unsafe version of: {@link #io_uring_wait_cqe_nr wait_cqe_nr} */ + public static native int nio_uring_wait_cqe_nr(long ring, long cqe_ptr, int wait_nr); + + /** + * Returns {@code wait_nr} IO completion events from the queue belonging to the {@code ring} param, waiting for it if necessary. The {@code cqe_ptr} param + * is filled in on success. + * + *

    After the caller has submitted a request with {@link #io_uring_submit submit}, they can retrieve the completion with {@code io_uring_wait_cqe_nr()}.

    + * + * @return 0 on success and the {@code cqe_ptr} param is filled in. On failure it returns {@code -errno}. + */ + public static int io_uring_wait_cqe_nr(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_cqe **") PointerBuffer cqe_ptr) { + return nio_uring_wait_cqe_nr(ring.address(), memAddress(cqe_ptr), cqe_ptr.remaining()); + } + + // --- [ io_uring_peek_cqe ] --- + + /** Unsafe version of: {@link #io_uring_peek_cqe peek_cqe} */ + public static native int nio_uring_peek_cqe(long ring, long cqe_ptr); + + /** + * Returns an IO completion, if one is readily available. + * + * @return 0 with {@code cqe_ptr} filled in on success, {@code -errno} on failure + */ + public static int io_uring_peek_cqe(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_cqe **") PointerBuffer cqe_ptr) { + if (CHECKS) { + check(cqe_ptr, 1); + } + return nio_uring_peek_cqe(ring.address(), memAddress(cqe_ptr)); + } + + // --- [ io_uring_wait_cqe ] --- + + /** Unsafe version of: {@link #io_uring_wait_cqe wait_cqe} */ + public static native int nio_uring_wait_cqe(long ring, long cqe_ptr); + + /** + * Returns an IO completion from the queue belonging to the {@code ring} param, waiting for it if necessary. The {@code cqe_ptr} param is filled in on + * success. + * + *

    After the caller has submitted a request with {@link #io_uring_submit submit}, they can retrieve the completion with {@code io_uring_wait_cqe()}.

    + * + * @return 0 on success and the {@code cqe_ptr} param is filled in. On failure it returns {@code -errno}. + */ + public static int io_uring_wait_cqe(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_cqe **") PointerBuffer cqe_ptr) { + if (CHECKS) { + check(cqe_ptr, 1); + } + return nio_uring_wait_cqe(ring.address(), memAddress(cqe_ptr)); + } + + // --- [ io_uring_buf_ring_advance ] --- + + public static native void nio_uring_buf_ring_advance(long br, int count); + + public static void io_uring_buf_ring_advance(@NativeType("struct io_uring_buf_ring *") IOURingBufRing br, int count) { + nio_uring_buf_ring_advance(br.address(), count); + } + + // --- [ io_uring_buf_ring_cq_advance ] --- + + public static native void nio_uring_buf_ring_cq_advance(long ring, long br, int count); + + public static void io_uring_buf_ring_cq_advance(@NativeType("struct io_uring *") IOURing ring, @NativeType("struct io_uring_buf_ring *") IOURingBufRing br, int count) { + nio_uring_buf_ring_cq_advance(ring.address(), br.address(), count); + } + + // --- [ io_uring_get_sqe ] --- + + /** Unsafe version of: {@link #io_uring_get_sqe get_sqe} */ + public static native long nio_uring_get_sqe(long ring); + + /** + * Gets the next available submission queue entry from the submission queue belonging to the {@code ring} param. + * + *

    If a submission queue event is returned, it should be filled out via one of the prep functions such as {@link #io_uring_prep_read prep_read} and submitted via {@link #io_uring_submit submit}.

    + * + * @return a pointer to the next submission queue event on success and {@code NULL} on failure + */ + @Nullable + @NativeType("struct io_uring_sqe *") + public static IOURingSQE io_uring_get_sqe(@NativeType("struct io_uring *") IOURing ring) { + long __result = nio_uring_get_sqe(ring.address()); + return IOURingSQE.createSafe(__result); + } + + // --- [ io_uring_mlock_size ] --- + + /** + * Return required {@code ulimit -l} memory space for a given ring setup. See {@link #io_uring_mlock_size_params mlock_size_params}. + * + * @param flags {@code io_uring_params} flags + */ + public static native int io_uring_mlock_size(@NativeType("unsigned") int entries, @NativeType("unsigned") int flags); + + // --- [ io_uring_mlock_size_params ] --- + + /** Unsafe version of: {@link #io_uring_mlock_size_params mlock_size_params} */ + public static native int nio_uring_mlock_size_params(int entries, long p); + + /** + * Returns the required {@code ulimit -l memlock} memory required for a given ring setup, in bytes. + * + *

    May return {@code -errno} on error. On newer (5.12+) kernels, {@code io_uring} no longer requires any {@code memlock} memory, and hence this function + * will return 0 for that case. On older (5.11 and prior) kernels, this will return the required memory so that the caller can ensure that enough space is + * available before setting up a ring with the specified parameters.

    + */ + public static int io_uring_mlock_size_params(@NativeType("unsigned") int entries, @NativeType("struct io_uring_params *") IOURingParams p) { + return nio_uring_mlock_size_params(entries, p.address()); + } + + // --- [ io_uring_major_version ] --- + + public static native int io_uring_major_version(); + + // --- [ io_uring_minor_version ] --- + + public static native int io_uring_minor_version(); + + // --- [ io_uring_check_version ] --- + + @NativeType("bool") + public static native boolean io_uring_check_version(int major, int minor); + + /** Return the appropriate mask for a buffer ring of size {@code ring_entries} */ + public static int io_uring_buf_ring_mask(@NativeType("__u32") int ring_entries) { + return ring_entries - 1; + } + + public static void io_uring_buf_ring_init(@NativeType("struct io_uring_buf_ring *") IOURingBufRing br) { + br.tail((short)0); + } + + public static void io_uring_buf_ring_add(@NativeType("struct io_uring_buf_ring *") IOURingBufRing br, @NativeType("void *") ByteBuffer addr, @NativeType("unsigned short") short bid, int mask, int buf_offset) { + IOURingBuf buf = br.bufs((br.tail() + buf_offset) & mask); + + buf.addr(memAddress(addr)); + buf.len(addr.remaining()); + buf.bid(bid); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapCallBack.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapCallBack.java new file mode 100644 index 000000000..8b3b542d6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapCallBack.java @@ -0,0 +1,78 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Instances of this class may be passed to the {@link CoreGraphics#CGEventTapCreate EventTapCreate} method. + * + *

    Type

    + * + *
    
    + * CGEventRef (*{@link #invoke}) (
    + *     CGEventTapProxy proxy,
    + *     CGEventType type,
    + *     CGEventRef event,
    + *     void *userInfo
    + * )
    + */ +public abstract class CGEventTapCallBack extends Callback implements CGEventTapCallBackI { + + /** + * Creates a {@code CGEventTapCallBack} instance from the specified function pointer. + * + * @return the new {@code CGEventTapCallBack} + */ + public static CGEventTapCallBack create(long functionPointer) { + CGEventTapCallBackI instance = Callback.get(functionPointer); + return instance instanceof CGEventTapCallBack + ? (CGEventTapCallBack)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static CGEventTapCallBack createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code CGEventTapCallBack} instance that delegates to the specified {@code CGEventTapCallBackI} instance. */ + public static CGEventTapCallBack create(CGEventTapCallBackI instance) { + return instance instanceof CGEventTapCallBack + ? (CGEventTapCallBack)instance + : new Container(instance.address(), instance); + } + + protected CGEventTapCallBack() { + super(CIF); + } + + CGEventTapCallBack(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends CGEventTapCallBack { + + private final CGEventTapCallBackI delegate; + + Container(long functionPointer, CGEventTapCallBackI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public long invoke(long proxy, int type, long event, long userInfo) { + return delegate.invoke(proxy, type, event, userInfo); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapCallBackI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapCallBackI.java new file mode 100644 index 000000000..ed6fdc4a1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapCallBackI.java @@ -0,0 +1,63 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * Instances of this interface may be passed to the {@link CoreGraphics#CGEventTapCreate EventTapCreate} method. + * + *

    Type

    + * + *
    
    + * CGEventRef (*{@link #invoke}) (
    + *     CGEventTapProxy proxy,
    + *     CGEventType type,
    + *     CGEventRef event,
    + *     void *userInfo
    + * )
    + */ +@FunctionalInterface +@NativeType("CGEventRef (*) (CGEventTapProxy, CGEventType, CGEventRef, void *)") +public interface CGEventTapCallBackI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_pointer, + ffi_type_pointer, ffi_type_uint32, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + long __result = invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)) + ); + apiClosureRetP(ret, __result); + } + + /** + * A client-supplied callback function that’s invoked whenever an associated event tap receives a Quartz event. + * + *

    The callback is passed a proxy for the tap, the event type, the incoming event, and the user-defined data specified when the event tap was created. The + * function should return the (possibly modified) passed-in event, a newly constructed event, or {@code NULL} if the event is to be deleted. The event passed to + * the callback is retained by the calling code, and is released after the callback returns and the data is passed back to the event system. If a + * different event is returned by the callback function, then that event will be released by the calling code along with the original event, after the + * event data has been passed back to the event system.

    + */ + @NativeType("CGEventRef") long invoke(@NativeType("CGEventTapProxy") long proxy, @NativeType("CGEventType") int type, @NativeType("CGEventRef") long event, @NativeType("void *") long userInfo); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapInformation.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapInformation.java new file mode 100644 index 000000000..3085e47ab --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGEventTapInformation.java @@ -0,0 +1,358 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * The structure used to report information about event taps. + * + *

    Layout

    + * + *
    
    + * struct CGEventTapInformation {
    + *     uint32_t eventTapID;
    + *     CGEventTapLocation {@link #tapPoint};
    + *     CGEventTapOptions {@link #options};
    + *     CGEventMask {@link #eventsOfInterest};
    + *     pid_t {@link #tappingProcess};
    + *     pid_t {@link #processBeingTapped};
    + *     bool {@link #enabled};
    + *     float {@link #minUsecLatency};
    + *     float {@link #avgUsecLatency};
    + *     float {@link #maxUsecLatency};
    + * }
    + */ +public class CGEventTapInformation extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + EVENTTAPID, + TAPPOINT, + OPTIONS, + EVENTSOFINTEREST, + TAPPINGPROCESS, + PROCESSBEINGTAPPED, + ENABLED, + MINUSECLATENCY, + AVGUSECLATENCY, + MAXUSECLATENCY; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(8), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(1), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + EVENTTAPID = layout.offsetof(0); + TAPPOINT = layout.offsetof(1); + OPTIONS = layout.offsetof(2); + EVENTSOFINTEREST = layout.offsetof(3); + TAPPINGPROCESS = layout.offsetof(4); + PROCESSBEINGTAPPED = layout.offsetof(5); + ENABLED = layout.offsetof(6); + MINUSECLATENCY = layout.offsetof(7); + AVGUSECLATENCY = layout.offsetof(8); + MAXUSECLATENCY = layout.offsetof(9); + } + + protected CGEventTapInformation(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected CGEventTapInformation create(long address, @Nullable ByteBuffer container) { + return new CGEventTapInformation(address, container); + } + + /** + * Creates a {@code CGEventTapInformation} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public CGEventTapInformation(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code eventTapID} field. */ + @NativeType("uint32_t") + public int eventTapID() { return neventTapID(address()); } + /** HID, session, annotated session */ + @NativeType("CGEventTapLocation") + public int tapPoint() { return ntapPoint(address()); } + /** listener, filter */ + @NativeType("CGEventTapOptions") + public int options() { return noptions(address()); } + /** mask of events being tapped */ + @NativeType("CGEventMask") + public long eventsOfInterest() { return neventsOfInterest(address()); } + /** process that is tapping events */ + @NativeType("pid_t") + public long tappingProcess() { return ntappingProcess(address()); } + /** zero if not a per-process tap */ + @NativeType("pid_t") + public long processBeingTapped() { return nprocessBeingTapped(address()); } + /** true if tap is enabled */ + @NativeType("bool") + public boolean enabled() { return nenabled(address()); } + /** minimum latency in microseconds */ + public float minUsecLatency() { return nminUsecLatency(address()); } + /** average latency in microseconds */ + public float avgUsecLatency() { return navgUsecLatency(address()); } + /** maximum latency in microseconds */ + public float maxUsecLatency() { return nmaxUsecLatency(address()); } + + // ----------------------------------- + + /** Returns a new {@code CGEventTapInformation} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static CGEventTapInformation malloc() { + return new CGEventTapInformation(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code CGEventTapInformation} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static CGEventTapInformation calloc() { + return new CGEventTapInformation(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code CGEventTapInformation} instance allocated with {@link BufferUtils}. */ + public static CGEventTapInformation create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new CGEventTapInformation(memAddress(container), container); + } + + /** Returns a new {@code CGEventTapInformation} instance for the specified memory address. */ + public static CGEventTapInformation create(long address) { + return new CGEventTapInformation(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static CGEventTapInformation createSafe(long address) { + return address == NULL ? null : new CGEventTapInformation(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static CGEventTapInformation mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static CGEventTapInformation callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static CGEventTapInformation mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static CGEventTapInformation callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code CGEventTapInformation} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static CGEventTapInformation malloc(MemoryStack stack) { + return new CGEventTapInformation(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code CGEventTapInformation} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static CGEventTapInformation calloc(MemoryStack stack) { + return new CGEventTapInformation(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #eventTapID}. */ + public static int neventTapID(long struct) { return UNSAFE.getInt(null, struct + CGEventTapInformation.EVENTTAPID); } + /** Unsafe version of {@link #tapPoint}. */ + public static int ntapPoint(long struct) { return UNSAFE.getInt(null, struct + CGEventTapInformation.TAPPOINT); } + /** Unsafe version of {@link #options}. */ + public static int noptions(long struct) { return UNSAFE.getInt(null, struct + CGEventTapInformation.OPTIONS); } + /** Unsafe version of {@link #eventsOfInterest}. */ + public static long neventsOfInterest(long struct) { return UNSAFE.getLong(null, struct + CGEventTapInformation.EVENTSOFINTEREST); } + /** Unsafe version of {@link #tappingProcess}. */ + public static long ntappingProcess(long struct) { return memGetAddress(struct + CGEventTapInformation.TAPPINGPROCESS); } + /** Unsafe version of {@link #processBeingTapped}. */ + public static long nprocessBeingTapped(long struct) { return memGetAddress(struct + CGEventTapInformation.PROCESSBEINGTAPPED); } + /** Unsafe version of {@link #enabled}. */ + public static boolean nenabled(long struct) { return UNSAFE.getByte(null, struct + CGEventTapInformation.ENABLED) != 0; } + /** Unsafe version of {@link #minUsecLatency}. */ + public static float nminUsecLatency(long struct) { return UNSAFE.getFloat(null, struct + CGEventTapInformation.MINUSECLATENCY); } + /** Unsafe version of {@link #avgUsecLatency}. */ + public static float navgUsecLatency(long struct) { return UNSAFE.getFloat(null, struct + CGEventTapInformation.AVGUSECLATENCY); } + /** Unsafe version of {@link #maxUsecLatency}. */ + public static float nmaxUsecLatency(long struct) { return UNSAFE.getFloat(null, struct + CGEventTapInformation.MAXUSECLATENCY); } + + // ----------------------------------- + + /** An array of {@link CGEventTapInformation} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final CGEventTapInformation ELEMENT_FACTORY = CGEventTapInformation.create(-1L); + + /** + * Creates a new {@code CGEventTapInformation.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link CGEventTapInformation#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected CGEventTapInformation getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code eventTapID} field. */ + @NativeType("uint32_t") + public int eventTapID() { return CGEventTapInformation.neventTapID(address()); } + /** @return the value of the {@link CGEventTapInformation#tapPoint} field. */ + @NativeType("CGEventTapLocation") + public int tapPoint() { return CGEventTapInformation.ntapPoint(address()); } + /** @return the value of the {@link CGEventTapInformation#options} field. */ + @NativeType("CGEventTapOptions") + public int options() { return CGEventTapInformation.noptions(address()); } + /** @return the value of the {@link CGEventTapInformation#eventsOfInterest} field. */ + @NativeType("CGEventMask") + public long eventsOfInterest() { return CGEventTapInformation.neventsOfInterest(address()); } + /** @return the value of the {@link CGEventTapInformation#tappingProcess} field. */ + @NativeType("pid_t") + public long tappingProcess() { return CGEventTapInformation.ntappingProcess(address()); } + /** @return the value of the {@link CGEventTapInformation#processBeingTapped} field. */ + @NativeType("pid_t") + public long processBeingTapped() { return CGEventTapInformation.nprocessBeingTapped(address()); } + /** @return the value of the {@link CGEventTapInformation#enabled} field. */ + @NativeType("bool") + public boolean enabled() { return CGEventTapInformation.nenabled(address()); } + /** @return the value of the {@link CGEventTapInformation#minUsecLatency} field. */ + public float minUsecLatency() { return CGEventTapInformation.nminUsecLatency(address()); } + /** @return the value of the {@link CGEventTapInformation#avgUsecLatency} field. */ + public float avgUsecLatency() { return CGEventTapInformation.navgUsecLatency(address()); } + /** @return the value of the {@link CGEventTapInformation#maxUsecLatency} field. */ + public float maxUsecLatency() { return CGEventTapInformation.nmaxUsecLatency(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGPoint.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGPoint.java new file mode 100644 index 000000000..63d1ddb83 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CGPoint.java @@ -0,0 +1,306 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure that contains a point in a two-dimensional coordinate system. + * + *

    Layout

    + * + *
    
    + * struct CGPoint {
    + *     CGFloat {@link #x};
    + *     CGFloat {@link #y};
    + * }
    + */ +public class CGPoint extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X, + Y; + + static { + Layout layout = __struct( + __member(8), + __member(8) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X = layout.offsetof(0); + Y = layout.offsetof(1); + } + + protected CGPoint(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected CGPoint create(long address, @Nullable ByteBuffer container) { + return new CGPoint(address, container); + } + + /** + * Creates a {@code CGPoint} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public CGPoint(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the x-coordinate of the point */ + @NativeType("CGFloat") + public double x() { return nx(address()); } + /** the y-coordinate of the point */ + @NativeType("CGFloat") + public double y() { return ny(address()); } + + /** Sets the specified value to the {@link #x} field. */ + public CGPoint x(@NativeType("CGFloat") double value) { nx(address(), value); return this; } + /** Sets the specified value to the {@link #y} field. */ + public CGPoint y(@NativeType("CGFloat") double value) { ny(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public CGPoint set( + double x, + double y + ) { + x(x); + y(y); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public CGPoint set(CGPoint src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code CGPoint} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static CGPoint malloc() { + return new CGPoint(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code CGPoint} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static CGPoint calloc() { + return new CGPoint(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code CGPoint} instance allocated with {@link BufferUtils}. */ + public static CGPoint create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new CGPoint(memAddress(container), container); + } + + /** Returns a new {@code CGPoint} instance for the specified memory address. */ + public static CGPoint create(long address) { + return new CGPoint(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static CGPoint createSafe(long address) { + return address == NULL ? null : new CGPoint(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static CGPoint mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static CGPoint callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static CGPoint mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static CGPoint callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code CGPoint} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static CGPoint malloc(MemoryStack stack) { + return new CGPoint(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code CGPoint} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static CGPoint calloc(MemoryStack stack) { + return new CGPoint(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x}. */ + public static double nx(long struct) { return UNSAFE.getDouble(null, struct + CGPoint.X); } + /** Unsafe version of {@link #y}. */ + public static double ny(long struct) { return UNSAFE.getDouble(null, struct + CGPoint.Y); } + + /** Unsafe version of {@link #x(double) x}. */ + public static void nx(long struct, double value) { UNSAFE.putDouble(null, struct + CGPoint.X, value); } + /** Unsafe version of {@link #y(double) y}. */ + public static void ny(long struct, double value) { UNSAFE.putDouble(null, struct + CGPoint.Y, value); } + + // ----------------------------------- + + /** An array of {@link CGPoint} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final CGPoint ELEMENT_FACTORY = CGPoint.create(-1L); + + /** + * Creates a new {@code CGPoint.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link CGPoint#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected CGPoint getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link CGPoint#x} field. */ + @NativeType("CGFloat") + public double x() { return CGPoint.nx(address()); } + /** @return the value of the {@link CGPoint#y} field. */ + @NativeType("CGFloat") + public double y() { return CGPoint.ny(address()); } + + /** Sets the specified value to the {@link CGPoint#x} field. */ + public Buffer x(@NativeType("CGFloat") double value) { CGPoint.nx(address(), value); return this; } + /** Sets the specified value to the {@link CGPoint#y} field. */ + public Buffer y(@NativeType("CGFloat") double value) { CGPoint.ny(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CoreFoundation.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CoreFoundation.java new file mode 100644 index 000000000..30b25508b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CoreFoundation.java @@ -0,0 +1,268 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to <CoreFoundation.h>. */ +public class CoreFoundation { + + static { Library.initialize(); } + + /** Boolean values. */ + public static final byte + TRUE = 1, + FALSE = 0; + + /** Platform-independent built-in encodings; always available on all platforms. */ + public static final int + kCFStringEncodingMacRoman = 0, + kCFStringEncodingWindowsLatin1 = 0x500, + kCFStringEncodingISOLatin1 = 0x201, + kCFStringEncodingNextStepLatin = 0xB01, + kCFStringEncodingASCII = 0x600, + kCFStringEncodingUnicode = 0x100, + kCFStringEncodingUTF8 = 0x8000100, + kCFStringEncodingNonLossyASCII = 0xBFF, + kCFStringEncodingUTF16 = 0x100, + kCFStringEncodingUTF16BE = 0x10000100, + kCFStringEncodingUTF16LE = 0x14000100, + kCFStringEncodingUTF32 = 0xC000100, + kCFStringEncodingUTF32BE = 0x18000100, + kCFStringEncodingUTF32LE = 0x1C000100; + + /** URL path styles. */ + public static final int + kCFURLPOSIXPathStyle = 0, + kCFURLHFSPathStyle = 1, + kCFURLWindowsPathStyle = 2; + + protected CoreFoundation() { + throw new UnsupportedOperationException(); + } + + // --- [ kCFAllocatorDefault ] --- + + @NativeType("CFAllocatorRef") + private static native long kCFAllocatorDefault(); + + /** This is a synonym for {@code NULL}, if you'd rather use a named constant. */ + public static final long kCFAllocatorDefault = kCFAllocatorDefault(); + + // --- [ kCFAllocatorSystemDefault ] --- + + @NativeType("CFAllocatorRef") + private static native long kCFAllocatorSystemDefault(); + + /** Default system allocator; you rarely need to use this. */ + public static final long kCFAllocatorSystemDefault = kCFAllocatorSystemDefault(); + + // --- [ kCFAllocatorMalloc ] --- + + @NativeType("CFAllocatorRef") + private static native long kCFAllocatorMalloc(); + + /** + * This allocator uses {@code malloc()}, {@code realloc()}, and {@code free()}. This should not be generally used; stick to {@link #kCFAllocatorDefault} + * whenever possible. This allocator is useful as the "bytesDeallocator" in {@code CFData} or "contentsDeallocator" in {@code CFString} where the memory + * was obtained as a result of {@code malloc()} type functions. + */ + public static final long kCFAllocatorMalloc = kCFAllocatorMalloc(); + + // --- [ kCFAllocatorMallocZone ] --- + + @NativeType("CFAllocatorRef") + private static native long kCFAllocatorMallocZone(); + + /** + * This allocator explicitly uses the default malloc zone, returned by {@code malloc_default_zone()}. It should only be used when an object is safe to be + * allocated in non-scanned memory. + */ + public static final long kCFAllocatorMallocZone = kCFAllocatorMallocZone(); + + // --- [ kCFAllocatorNull ] --- + + @NativeType("CFAllocatorRef") + private static native long kCFAllocatorNull(); + + /** + * Null allocator which does nothing and allocates no memory. This allocator is useful as the "bytesDeallocator" in {@code CFData} or "contentsDeallocator" + * in {@code CFString} where the memory should not be freed. + */ + public static final long kCFAllocatorNull = kCFAllocatorNull(); + + // --- [ kCFAllocatorUseContext ] --- + + @NativeType("CFAllocatorRef") + private static native long kCFAllocatorUseContext(); + + /** Special allocator argument to CFAllocatorCreate which means "use the functions given in the context to allocate the allocator itself as well". */ + public static final long kCFAllocatorUseContext = kCFAllocatorUseContext(); + + // --- [ CFRetain ] --- + + /** Unsafe version of: {@link #CFRetain} */ + public static native long nCFRetain(long cf); + + /** + * Retains a Core Foundation object. + * + *

    You should retain a Core Foundation object when you receive it from elsewhere (that is, you did not create or copy it) and you want it to persist. If + * you retain a Core Foundation object you are responsible for releasing it.

    + * + * @param cf the CFType object to retain + */ + @NativeType("CFTypeRef") + public static long CFRetain(@NativeType("CFTypeRef") long cf) { + if (CHECKS) { + check(cf); + } + return nCFRetain(cf); + } + + // --- [ CFRelease ] --- + + /** Unsafe version of: {@link #CFRelease} */ + public static native void nCFRelease(long cf); + + /** + * Releases a Core Foundation object. + * + *

    If the retain count of {@code cf} becomes zero the memory allocated to the object is deallocated and the object is destroyed. If you create, copy, or + * explicitly retain (see the {@link #CFRetain} function) a Core Foundation object, you are responsible for releasing it when you no longer need it.

    + * + * @param cf the CFType object to release + */ + public static void CFRelease(@NativeType("CFTypeRef") long cf) { + if (CHECKS) { + check(cf); + } + nCFRelease(cf); + } + + // --- [ CFBundleCreate ] --- + + /** Unsafe version of: {@link #CFBundleCreate} */ + public static native long nCFBundleCreate(long allocator, long bundleURL); + + /** + * Creates a {@code CFBundle} object. + * + * @param allocator the allocator to use to allocate memory for the new object. Pass {@code NULL} or {@code kCFAllocatorDefault} to use the current default allocator. + * @param bundleURL the location of the bundle for which to create a {@code CFBundle} object + */ + @NativeType("CFBundleRef") + public static long CFBundleCreate(@NativeType("CFAllocatorRef") long allocator, @NativeType("CFURLRef") long bundleURL) { + if (CHECKS) { + check(bundleURL); + } + return nCFBundleCreate(allocator, bundleURL); + } + + // --- [ CFBundleGetBundleWithIdentifier ] --- + + /** Unsafe version of: {@link #CFBundleGetBundleWithIdentifier} */ + public static native long nCFBundleGetBundleWithIdentifier(long bundleID); + + /** + * Locates a bundle given its program-defined identifier. + * + * @param bundleID the identifier of the bundle to locate. Note that identifier names are case-sensitive. + */ + @NativeType("CFBundleRef") + public static long CFBundleGetBundleWithIdentifier(@NativeType("CFStringRef") long bundleID) { + if (CHECKS) { + check(bundleID); + } + return nCFBundleGetBundleWithIdentifier(bundleID); + } + + // --- [ CFBundleGetFunctionPointerForName ] --- + + /** Unsafe version of: {@link #CFBundleGetFunctionPointerForName} */ + public static native long nCFBundleGetFunctionPointerForName(long bundle, long functionName); + + /** + * Returns a pointer to a function in a bundle’s executable code using the function name as the search key. + * + * @param bundle the bundle to examine + * @param functionName the name of the function to locate + */ + @NativeType("void *") + public static long CFBundleGetFunctionPointerForName(@NativeType("CFBundleRef") long bundle, @NativeType("CFStringRef") long functionName) { + if (CHECKS) { + check(bundle); + check(functionName); + } + return nCFBundleGetFunctionPointerForName(bundle, functionName); + } + + // --- [ CFStringCreateWithCString ] --- + + /** Unsafe version of: {@link #CFStringCreateWithCString} */ + public static native long nCFStringCreateWithCString(long allocator, long cStr, int encoding); + + /** + * Creates an immutable string from a C string. + * + * @param allocator the allocator to use to allocate memory for the new object. Pass {@code NULL} or {@code kCFAllocatorDefault} to use the current default allocator. + * @param cStr the {@code NULL}-terminated C string to be used to create the {@code CFString} object. The string must use an 8-bit encoding. + * @param encoding the encoding of the characters in the C string. The encoding must specify an 8-bit encoding. One of:
    {@link #kCFStringEncodingMacRoman}{@link #kCFStringEncodingWindowsLatin1}{@link #kCFStringEncodingISOLatin1}
    {@link #kCFStringEncodingNextStepLatin}{@link #kCFStringEncodingASCII}{@link #kCFStringEncodingUnicode}
    {@link #kCFStringEncodingUTF8}{@link #kCFStringEncodingNonLossyASCII}{@link #kCFStringEncodingUTF16}
    {@link #kCFStringEncodingUTF16BE}{@link #kCFStringEncodingUTF16LE}{@link #kCFStringEncodingUTF32}
    {@link #kCFStringEncodingUTF32BE}{@link #kCFStringEncodingUTF32LE}
    + */ + @NativeType("CFStringRef") + public static long CFStringCreateWithCString(@NativeType("CFAllocatorRef") long allocator, @NativeType("char const *") ByteBuffer cStr, @NativeType("CFStringEncoding") int encoding) { + return nCFStringCreateWithCString(allocator, memAddress(cStr), encoding); + } + + // --- [ CFStringCreateWithCStringNoCopy ] --- + + /** Unsafe version of: {@link #CFStringCreateWithCStringNoCopy} */ + public static native long nCFStringCreateWithCStringNoCopy(long allocator, long cStr, int encoding, long contentsDeallocator); + + /** + * Creates a CFString object from an external C string buffer that might serve as the backing store for the object. + * + * @param allocator the allocator to use to allocate memory for the new object. Pass {@code NULL} or {@code kCFAllocatorDefault} to use the current default allocator. + * @param cStr the {@code NULL}-terminated C string to be used to create the {@code CFString} object. The string must use an 8-bit encoding. + * @param encoding the encoding of the characters in the C string. The encoding must specify an 8-bit encoding. One of:
    {@link #kCFStringEncodingMacRoman}{@link #kCFStringEncodingWindowsLatin1}{@link #kCFStringEncodingISOLatin1}
    {@link #kCFStringEncodingNextStepLatin}{@link #kCFStringEncodingASCII}{@link #kCFStringEncodingUnicode}
    {@link #kCFStringEncodingUTF8}{@link #kCFStringEncodingNonLossyASCII}{@link #kCFStringEncodingUTF16}
    {@link #kCFStringEncodingUTF16BE}{@link #kCFStringEncodingUTF16LE}{@link #kCFStringEncodingUTF32}
    {@link #kCFStringEncodingUTF32BE}{@link #kCFStringEncodingUTF32LE}
    + * @param contentsDeallocator the {@code CFAllocator} object to use to deallocate the external string buffer when it is no longer needed. You can pass {@code NULL} or + * {@code kCFAllocatorDefault} to request the default allocator for this purpose. If the buffer does not need to be deallocated, or if you want to + * assume responsibility for deallocating the buffer (and not have the {@code CFString} object deallocate it), pass {@code kCFAllocatorNull}. + */ + @NativeType("CFStringRef") + public static long CFStringCreateWithCStringNoCopy(@NativeType("CFAllocatorRef") long allocator, @NativeType("char const *") ByteBuffer cStr, @NativeType("CFStringEncoding") int encoding, @NativeType("CFAllocatorRef") long contentsDeallocator) { + return nCFStringCreateWithCStringNoCopy(allocator, memAddress(cStr), encoding, contentsDeallocator); + } + + // --- [ CFURLCreateWithFileSystemPath ] --- + + /** Unsafe version of: {@link #CFURLCreateWithFileSystemPath} */ + public static native long nCFURLCreateWithFileSystemPath(long allocator, long filePath, long pathStyle, boolean isDirectory); + + /** + * Creates a {@code CFURL} object using a local file system path string. + * + * @param allocator the allocator to use to allocate memory for the new object. Pass {@code NULL} or {@code kCFAllocatorDefault} to use the current default allocator. + * @param filePath the path string to convert to a {@code CFURL} object. If {@code filePath} is not absolute, the resulting URL will be considered relative to the + * current working directory (evaluated when this function is being invoked). + * @param pathStyle the operating system path style used in {@code filePath}. One of:
    {@link #kCFURLPOSIXPathStyle}{@link #kCFURLHFSPathStyle}{@link #kCFURLWindowsPathStyle}
    + * @param isDirectory a Boolean value that specifies whether filePath is treated as a directory path when resolving against relative path components. Pass true if the + * pathname indicates a directory, false otherwise. + */ + @NativeType("CFURLRef") + public static long CFURLCreateWithFileSystemPath(@NativeType("CFAllocatorRef") long allocator, @NativeType("CFStringRef") long filePath, @NativeType("CFURLPathStyle") long pathStyle, @NativeType("Boolean") boolean isDirectory) { + if (CHECKS) { + check(filePath); + } + return nCFURLCreateWithFileSystemPath(allocator, filePath, pathStyle, isDirectory); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CoreGraphics.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CoreGraphics.java new file mode 100644 index 000000000..8fd7bbd18 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/CoreGraphics.java @@ -0,0 +1,1001 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to <CoreGraphics.h>. */ +public class CoreGraphics { + + private static final SharedLibrary COREGRAPHICS = Library.loadNative(CoreGraphics.class, "org.lwjgl", "/System/Library/Frameworks/CoreGraphics.framework"); + + /** Contains the function pointers loaded from the CoreGraphics {@link SharedLibrary}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + EventGetTypeID = apiGetFunctionAddress(COREGRAPHICS, "CGEventGetTypeID"), + EventCreate = apiGetFunctionAddress(COREGRAPHICS, "CGEventCreate"), + EventCreateData = apiGetFunctionAddress(COREGRAPHICS, "CGEventCreateData"), + EventCreateFromData = apiGetFunctionAddress(COREGRAPHICS, "CGEventCreateFromData"), + EventCreateMouseEvent = apiGetFunctionAddress(COREGRAPHICS, "CGEventCreateMouseEvent"), + EventCreateKeyboardEvent = apiGetFunctionAddress(COREGRAPHICS, "CGEventCreateKeyboardEvent"), + EventCreateScrollWheelEvent = apiGetFunctionAddress(COREGRAPHICS, "CGEventCreateScrollWheelEvent"), + EventCreateScrollWheelEvent2 = apiGetFunctionAddressOptional(COREGRAPHICS, "CGEventCreateScrollWheelEvent2"), + EventCreateCopy = apiGetFunctionAddress(COREGRAPHICS, "CGEventCreateCopy"), + EventCreateSourceFromEvent = apiGetFunctionAddress(COREGRAPHICS, "CGEventCreateSourceFromEvent"), + EventSetSource = apiGetFunctionAddress(COREGRAPHICS, "CGEventSetSource"), + EventGetType = apiGetFunctionAddress(COREGRAPHICS, "CGEventGetType"), + EventSetType = apiGetFunctionAddress(COREGRAPHICS, "CGEventSetType"), + EventGetTimestamp = apiGetFunctionAddress(COREGRAPHICS, "CGEventGetTimestamp"), + EventSetTimestamp = apiGetFunctionAddress(COREGRAPHICS, "CGEventSetTimestamp"), + EventGetLocation = apiGetFunctionAddress(COREGRAPHICS, "CGEventGetLocation"), + EventGetUnflippedLocation = apiGetFunctionAddress(COREGRAPHICS, "CGEventGetUnflippedLocation"), + EventSetLocation = apiGetFunctionAddress(COREGRAPHICS, "CGEventSetLocation"), + EventGetFlags = apiGetFunctionAddress(COREGRAPHICS, "CGEventGetFlags"), + EventSetFlags = apiGetFunctionAddress(COREGRAPHICS, "CGEventSetFlags"), + EventKeyboardGetUnicodeString = apiGetFunctionAddress(COREGRAPHICS, "CGEventKeyboardGetUnicodeString"), + EventKeyboardSetUnicodeString = apiGetFunctionAddress(COREGRAPHICS, "CGEventKeyboardSetUnicodeString"), + EventGetIntegerValueField = apiGetFunctionAddress(COREGRAPHICS, "CGEventGetIntegerValueField"), + EventSetIntegerValueField = apiGetFunctionAddress(COREGRAPHICS, "CGEventSetIntegerValueField"), + EventGetDoubleValueField = apiGetFunctionAddress(COREGRAPHICS, "CGEventGetDoubleValueField"), + EventSetDoubleValueField = apiGetFunctionAddress(COREGRAPHICS, "CGEventSetDoubleValueField"), + EventTapCreate = apiGetFunctionAddress(COREGRAPHICS, "CGEventTapCreate"), + EventTapCreateForPid = apiGetFunctionAddressOptional(COREGRAPHICS, "CGEventTapCreateForPid"), + EventTapEnable = apiGetFunctionAddress(COREGRAPHICS, "CGEventTapEnable"), + EventTapIsEnabled = apiGetFunctionAddress(COREGRAPHICS, "CGEventTapIsEnabled"), + EventTapPostEvent = apiGetFunctionAddress(COREGRAPHICS, "CGEventTapPostEvent"), + EventPost = apiGetFunctionAddress(COREGRAPHICS, "CGEventPost"), + EventPostToPid = apiGetFunctionAddressOptional(COREGRAPHICS, "CGEventPostToPid"), + GetEventTapList = apiGetFunctionAddress(COREGRAPHICS, "CGGetEventTapList"); + + } + + /** Returns the CoreGraphics {@link SharedLibrary}. */ + public static SharedLibrary getLibrary() { + return COREGRAPHICS; + } + + /** + * Types used for errors and error handlers. ({@code CGError}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #kCGErrorSuccess ErrorSuccess}
    • + *
    • {@link #kCGErrorFailure ErrorFailure}
    • + *
    • {@link #kCGErrorIllegalArgument ErrorIllegalArgument}
    • + *
    • {@link #kCGErrorInvalidConnection ErrorInvalidConnection}
    • + *
    • {@link #kCGErrorInvalidContext ErrorInvalidContext}
    • + *
    • {@link #kCGErrorCannotComplete ErrorCannotComplete}
    • + *
    • {@link #kCGErrorNotImplemented ErrorNotImplemented}
    • + *
    • {@link #kCGErrorRangeCheck ErrorRangeCheck}
    • + *
    • {@link #kCGErrorTypeCheck ErrorTypeCheck}
    • + *
    • {@link #kCGErrorInvalidOperation ErrorInvalidOperation}
    • + *
    • {@link #kCGErrorNoneAvailable ErrorNoneAvailable}
    • + *
    + */ + public static final int + kCGErrorSuccess = 0, + kCGErrorFailure = 1000, + kCGErrorIllegalArgument = 1001, + kCGErrorInvalidConnection = 1002, + kCGErrorInvalidContext = 1003, + kCGErrorCannotComplete = 1004, + kCGErrorNotImplemented = 1006, + kCGErrorRangeCheck = 1007, + kCGErrorTypeCheck = 1008, + kCGErrorInvalidOperation = 1010, + kCGErrorNoneAvailable = 1011; + + /** + * Event types. ({@code CGEventType}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #kCGEventNull EventNull}
    • + *
    • {@link #kCGEventLeftMouseDown EventLeftMouseDown}
    • + *
    • {@link #kCGEventLeftMouseUp EventLeftMouseUp}
    • + *
    • {@link #kCGEventRightMouseDown EventRightMouseDown}
    • + *
    • {@link #kCGEventRightMouseUp EventRightMouseUp}
    • + *
    • {@link #kCGEventMouseMoved EventMouseMoved}
    • + *
    • {@link #kCGEventLeftMouseDragged EventLeftMouseDragged}
    • + *
    • {@link #kCGEventRightMouseDragged EventRightMouseDragged}
    • + *
    • {@link #kCGEventKeyDown EventKeyDown}
    • + *
    • {@link #kCGEventKeyUp EventKeyUp}
    • + *
    • {@link #kCGEventFlagsChanged EventFlagsChanged}
    • + *
    • {@link #kCGEventScrollWheel EventScrollWheel}
    • + *
    • {@link #kCGEventTabletPointer EventTabletPointer}
    • + *
    • {@link #kCGEventTabletProximity EventTabletProximity}
    • + *
    • {@link #kCGEventOtherMouseDown EventOtherMouseDown}
    • + *
    • {@link #kCGEventOtherMouseUp EventOtherMouseUp}
    • + *
    • {@link #kCGEventOtherMouseDragged EventOtherMouseDragged}
    • + *
    • {@link #kCGEventTapDisabledByTimeout EventTapDisabledByTimeout}
    • + *
    • {@link #kCGEventTapDisabledByUserInput EventTapDisabledByUserInput}
    • + *
    + */ + public static final int + kCGEventNull = 0, + kCGEventLeftMouseDown = 1, + kCGEventLeftMouseUp = 2, + kCGEventRightMouseDown = 3, + kCGEventRightMouseUp = 4, + kCGEventMouseMoved = 5, + kCGEventLeftMouseDragged = 6, + kCGEventRightMouseDragged = 7, + kCGEventKeyDown = 0xA, + kCGEventKeyUp = 0xB, + kCGEventFlagsChanged = 0xC, + kCGEventScrollWheel = 0x16, + kCGEventTabletPointer = 0x17, + kCGEventTabletProximity = 0x18, + kCGEventOtherMouseDown = 0x19, + kCGEventOtherMouseUp = 0x1A, + kCGEventOtherMouseDragged = 0x1B, + kCGEventTapDisabledByTimeout = 0xFFFFFFFE, + kCGEventTapDisabledByUserInput = 0xFFFFFFFF; + + /** + * Constants that specify buttons on a one, two, or three-button mouse. ({@code CGMouseButton}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #kCGMouseButtonLeft MouseButtonLeft}
    • + *
    • {@link #kCGMouseButtonRight MouseButtonRight}
    • + *
    • {@link #kCGMouseButtonCenter MouseButtonCenter}
    • + *
    + */ + public static final int + kCGMouseButtonLeft = 0, + kCGMouseButtonRight = 1, + kCGMouseButtonCenter = 2; + + /** + * {@code CGEventTapLocation} + * + *
    Enum values:
    + * + *
      + *
    • {@link #kCGHIDEventTap HIDEventTap} - Specifies that an event tap is placed at the point where HID system events enter the window server.
    • + *
    • {@link #kCGSessionEventTap SessionEventTap} - Specifies that an event tap is placed at the point where HID system and remote control events enter a login session.
    • + *
    • {@link #kCGAnnotatedSessionEventTap AnnotatedSessionEventTap} - Specifies that an event tap is placed at the point where session events have been annotated to flow to an application.
    • + *
    + */ + public static final int + kCGHIDEventTap = 0x0, + kCGSessionEventTap = 0x1, + kCGAnnotatedSessionEventTap = 0x2; + + /** + * Constants that specify the unit of measurement for a scrolling event. ({@code CGScrollEventUnit}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #kCGScrollEventUnitPixel ScrollEventUnitPixel} - Specifies that the unit of measurement is pixels.
    • + *
    • {@link #kCGScrollEventUnitLine ScrollEventUnitLine} - Specifies that the unit of measurement is lines.
    • + *
    + */ + public static final int + kCGScrollEventUnitPixel = 0, + kCGScrollEventUnitLine = 1; + + /** + * Constants used as keys to access specialized fields in low-level events. ({@code CGEventField}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #kCGMouseEventNumber MouseEventNumber} - + * Key to access an integer field that contains the mouse button event number. + * + *

      Matching mouse-down and mouse-up events will have the same event number.

      + *
    • + *
    • {@link #kCGMouseEventClickState MouseEventClickState} - + * Key to access an integer field that contains the mouse button click state. + * + *

      A click state of 1 represents a single click. A click state of 2 represents a double-click. A click state of 3 represents a triple-click.

      + *
    • + *
    • {@link #kCGMouseEventPressure MouseEventPressure} - + * Key to access a double field that contains the mouse button pressure. + * + *

      The pressure value may range from 0 to 1, with 0 representing the mouse being up. This value is commonly set by tablet pens mimicking a mouse.

      + *
    • + *
    • {@link #kCGMouseEventButtonNumber MouseEventButtonNumber} - Key to access an integer field that contains the mouse button number.
    • + *
    • {@link #kCGMouseEventDeltaX MouseEventDeltaX} - Key to access an integer field that contains the horizontal mouse delta since the last mouse movement event.
    • + *
    • {@link #kCGMouseEventDeltaY MouseEventDeltaY} - Key to access an integer field that contains the vertical mouse delta since the last mouse movement event.
    • + *
    • {@link #kCGMouseEventInstantMouser MouseEventInstantMouser} - Key to access an integer field. The value is non-zero if the event should be ignored by the Inkwell subsystem.
    • + *
    • {@link #kCGMouseEventSubtype MouseEventSubtype} - Key to access an integer field that encodes the mouse event subtype as a {@code kCFNumberIntType}.
    • + *
    • {@link #kCGKeyboardEventAutorepeat KeyboardEventAutorepeat} - Key to access an integer field, non-zero when this is an autorepeat of a key-down, and zero otherwise.
    • + *
    • {@link #kCGKeyboardEventKeycode KeyboardEventKeycode} - Key to access an integer field that contains the virtual keycode of the key-down or key-up event.
    • + *
    • {@link #kCGKeyboardEventKeyboardType KeyboardEventKeyboardType} - Key to access an integer field that contains the keyboard type identifier.
    • + *
    • {@link #kCGScrollWheelEventDeltaAxis1 ScrollWheelEventDeltaAxis1} - + * Key to access an integer field that contains scrolling data. + * + *

      This field typically contains the change in vertical position since the last scrolling event from a Mighty Mouse scroller or a single-wheel mouse + * scroller.

      + *
    • + *
    • {@link #kCGScrollWheelEventDeltaAxis2 ScrollWheelEventDeltaAxis2} - + * Key to access an integer field that contains scrolling data. + * + *

      This field typically contains the change in horizontal position since the last scrolling event from a Mighty Mouse scroller.

      + *
    • + *
    • {@link #kCGScrollWheelEventDeltaAxis3 ScrollWheelEventDeltaAxis3} - This field is not used.
    • + *
    • {@link #kCGScrollWheelEventFixedPtDeltaAxis1 ScrollWheelEventFixedPtDeltaAxis1} - + * Key to access a field that contains scrolling data. + * + *

      The scrolling data represents a line-based or pixel-based change in vertical position since the last scrolling event from a Mighty Mouse scroller + * or a single-wheel mouse scroller. The scrolling data uses a fixed-point 16.16 signed integer format. If this key is passed to + * {@link #CGEventGetDoubleValueField EventGetDoubleValueField}, the fixed-point value is converted to a double value.

      + *
    • + *
    • {@link #kCGScrollWheelEventFixedPtDeltaAxis2 ScrollWheelEventFixedPtDeltaAxis2} - + * Key to access a field that contains scrolling data. + * + *

      The scrolling data represents a line-based or pixel-based change in horizontal position since the last scrolling event from a Mighty Mouse + * scroller. The scrolling data uses a fixed-point 16.16 signed integer format. If this key is passed to {@link #CGEventGetDoubleValueField EventGetDoubleValueField}, the fixed-point + * value is converted to a double value.

      + *
    • + *
    • {@link #kCGScrollWheelEventFixedPtDeltaAxis3 ScrollWheelEventFixedPtDeltaAxis3} - This field is not used.
    • + *
    • {@link #kCGScrollWheelEventPointDeltaAxis1 ScrollWheelEventPointDeltaAxis1} - + * Key to access an integer field that contains pixel-based scrolling data. + * + *

      The scrolling data represents the change in vertical position since the last scrolling event from a Mighty Mouse scroller or a single-wheel mouse + * scroller.

      + *
    • + *
    • {@link #kCGScrollWheelEventPointDeltaAxis2 ScrollWheelEventPointDeltaAxis2} - + * Key to access an integer field that contains pixel-based scrolling data. + * + *

      The scrolling data represents the change in horizontal position since the last scrolling event from a Mighty Mouse scroller.

      + *
    • + *
    • {@link #kCGScrollWheelEventPointDeltaAxis3 ScrollWheelEventPointDeltaAxis3} - This field is not used.
    • + *
    • {@link #kCGScrollWheelEventScrollPhase ScrollWheelEventScrollPhase}
    • + *
    • {@link #kCGScrollWheelEventScrollCount ScrollWheelEventScrollCount} - rdar://11259169
    • + *
    • {@link #kCGScrollWheelEventMomentumPhase ScrollWheelEventMomentumPhase}
    • + *
    • {@link #kCGScrollWheelEventInstantMouser ScrollWheelEventInstantMouser} - + * Key to access an integer field that indicates whether the event should be ignored by the Inkwell subsystem. + * + *

      If the value is non-zero, the event should be ignored.

      + *
    • + *
    • {@link #kCGTabletEventPointX TabletEventPointX} - Key to access an integer field that contains the absolute X coordinate in tablet space at full tablet resolution.
    • + *
    • {@link #kCGTabletEventPointY TabletEventPointY} - Key to access an integer field that contains the absolute Y coordinate in tablet space at full tablet resolution.
    • + *
    • {@link #kCGTabletEventPointZ TabletEventPointZ} - Key to access an integer field that contains the absolute Z coordinate in tablet space at full tablet resolution.
    • + *
    • {@link #kCGTabletEventPointButtons TabletEventPointButtons} - + * Key to access an integer field that contains the tablet button state. + * + *

      Bit 0 is the first button, and a set bit represents a closed or pressed button. Up to 16 buttons are supported.

      + *
    • + *
    • {@link #kCGTabletEventPointPressure TabletEventPointPressure} - + * Key to access a double field that contains the tablet pen pressure. + * + *

      A value of 0.0 represents no pressure, and 1.0 represents maximum pressure.

      + *
    • + *
    • {@link #kCGTabletEventTiltX TabletEventTiltX} - + * Key to access a double field that contains the horizontal tablet pen tilt. + * + *

      A value of 0 represents no tilt, and 1 represents maximum tilt.

      + *
    • + *
    • {@link #kCGTabletEventTiltY TabletEventTiltY} - + * Key to access a double field that contains the vertical tablet pen tilt. + * + *

      A value of 0 represents no tilt, and 1 represents maximum tilt.

      + *
    • + *
    • {@link #kCGTabletEventRotation TabletEventRotation} - Key to access a double field that contains the tablet pen rotation.
    • + *
    • {@link #kCGTabletEventTangentialPressure TabletEventTangentialPressure} - + * Key to access a double field that contains the tangential pressure on the device. + * + *

      A value of 0.0 represents no pressure, and 1.0 represents maximum pressure.

      + *
    • + *
    • {@link #kCGTabletEventDeviceID TabletEventDeviceID} - Key to access an integer field that contains the system-assigned unique device ID.
    • + *
    • {@link #kCGTabletEventVendor1 TabletEventVendor1} - Key to access an integer field that contains a vendor-specified value.
    • + *
    • {@link #kCGTabletEventVendor2 TabletEventVendor2} - Key to access an integer field that contains a vendor-specified value.
    • + *
    • {@link #kCGTabletEventVendor3 TabletEventVendor3} - Key to access an integer field that contains a vendor-specified value.
    • + *
    • {@link #kCGTabletProximityEventVendorID TabletProximityEventVendorID} - Key to access an integer field that contains the vendor-defined ID, typically the USB vendor ID.
    • + *
    • {@link #kCGTabletProximityEventTabletID TabletProximityEventTabletID} - Key to access an integer field that contains the vendor-defined tablet ID, typically the USB product ID.
    • + *
    • {@link #kCGTabletProximityEventPointerID TabletProximityEventPointerID} - Key to access an integer field that contains the vendor-defined ID of the pointing device.
    • + *
    • {@link #kCGTabletProximityEventDeviceID TabletProximityEventDeviceID} - Key to access an integer field that contains the system-assigned device ID.
    • + *
    • {@link #kCGTabletProximityEventSystemTabletID TabletProximityEventSystemTabletID} - Key to access an integer field that contains the system-assigned unique tablet ID.
    • + *
    • {@link #kCGTabletProximityEventVendorPointerType TabletProximityEventVendorPointerType} - Key to access an integer field that contains the vendor-assigned pointer type.
    • + *
    • {@link #kCGTabletProximityEventVendorPointerSerialNumber TabletProximityEventVendorPointerSerialNumber} - Key to access an integer field that contains the vendor-defined pointer serial number.
    • + *
    • {@link #kCGTabletProximityEventVendorUniqueID TabletProximityEventVendorUniqueID} - Key to access an integer field that contains the vendor-defined unique ID.
    • + *
    • {@link #kCGTabletProximityEventCapabilityMask TabletProximityEventCapabilityMask} - Key to access an integer field that contains the device capabilities mask.
    • + *
    • {@link #kCGTabletProximityEventPointerType TabletProximityEventPointerType} - Key to access an integer field that contains the pointer type.
    • + *
    • {@link #kCGTabletProximityEventEnterProximity TabletProximityEventEnterProximity} - + * Key to access an integer field that indicates whether the pen is in proximity to the tablet. + * + *

      The value is non-zero if the pen is in proximity to the tablet and zero when leaving the tablet.

      + *
    • + *
    • {@link #kCGEventTargetProcessSerialNumber EventTargetProcessSerialNumber} - Key to access a field that contains the event target process serial number. The value is a 64-bit value.
    • + *
    • {@link #kCGEventTargetUnixProcessID EventTargetUnixProcessID} - Key to access a field that contains the event target Unix process ID.
    • + *
    • {@link #kCGEventSourceUnixProcessID EventSourceUnixProcessID} - Key to access a field that contains the event source Unix process ID.
    • + *
    • {@link #kCGEventSourceUserData EventSourceUserData} - Key to access a field that contains the event source user-supplied data, up to 64 bits.
    • + *
    • {@link #kCGEventSourceUserID EventSourceUserID} - Key to access a field that contains the event source Unix effective UID.
    • + *
    • {@link #kCGEventSourceGroupID EventSourceGroupID} - Key to access a field that contains the event source Unix effective GID.
    • + *
    • {@link #kCGEventSourceStateID EventSourceStateID} - Key to access a field that contains the event source state ID used to create this event.
    • + *
    • {@link #kCGScrollWheelEventIsContinuous ScrollWheelEventIsContinuous} - + * Key to access an integer field that indicates whether a scrolling event contains continuous, pixel-based scrolling data. + * + *

      The value is non-zero when the scrolling data is pixel-based and zero when the scrolling data is line-based.

      + *
    • + *
    • {@link #kCGMouseEventWindowUnderMousePointer MouseEventWindowUnderMousePointer}
    • + *
    • {@link #kCGMouseEventWindowUnderMousePointerThatCanHandleThisEvent MouseEventWindowUnderMousePointerThatCanHandleThisEvent}
    • + *
    + */ + public static final int + kCGMouseEventNumber = 0, + kCGMouseEventClickState = 1, + kCGMouseEventPressure = 2, + kCGMouseEventButtonNumber = 3, + kCGMouseEventDeltaX = 4, + kCGMouseEventDeltaY = 5, + kCGMouseEventInstantMouser = 6, + kCGMouseEventSubtype = 7, + kCGKeyboardEventAutorepeat = 8, + kCGKeyboardEventKeycode = 9, + kCGKeyboardEventKeyboardType = 10, + kCGScrollWheelEventDeltaAxis1 = 11, + kCGScrollWheelEventDeltaAxis2 = 12, + kCGScrollWheelEventDeltaAxis3 = 13, + kCGScrollWheelEventFixedPtDeltaAxis1 = 93, + kCGScrollWheelEventFixedPtDeltaAxis2 = 94, + kCGScrollWheelEventFixedPtDeltaAxis3 = 95, + kCGScrollWheelEventPointDeltaAxis1 = 96, + kCGScrollWheelEventPointDeltaAxis2 = 97, + kCGScrollWheelEventPointDeltaAxis3 = 98, + kCGScrollWheelEventScrollPhase = 99, + kCGScrollWheelEventScrollCount = 100, + kCGScrollWheelEventMomentumPhase = 123, + kCGScrollWheelEventInstantMouser = 14, + kCGTabletEventPointX = 15, + kCGTabletEventPointY = 16, + kCGTabletEventPointZ = 17, + kCGTabletEventPointButtons = 18, + kCGTabletEventPointPressure = 19, + kCGTabletEventTiltX = 20, + kCGTabletEventTiltY = 21, + kCGTabletEventRotation = 22, + kCGTabletEventTangentialPressure = 23, + kCGTabletEventDeviceID = 24, + kCGTabletEventVendor1 = 25, + kCGTabletEventVendor2 = 26, + kCGTabletEventVendor3 = 27, + kCGTabletProximityEventVendorID = 28, + kCGTabletProximityEventTabletID = 29, + kCGTabletProximityEventPointerID = 30, + kCGTabletProximityEventDeviceID = 31, + kCGTabletProximityEventSystemTabletID = 32, + kCGTabletProximityEventVendorPointerType = 33, + kCGTabletProximityEventVendorPointerSerialNumber = 34, + kCGTabletProximityEventVendorUniqueID = 35, + kCGTabletProximityEventCapabilityMask = 36, + kCGTabletProximityEventPointerType = 37, + kCGTabletProximityEventEnterProximity = 38, + kCGEventTargetProcessSerialNumber = 39, + kCGEventTargetUnixProcessID = 40, + kCGEventSourceUnixProcessID = 41, + kCGEventSourceUserData = 42, + kCGEventSourceUserID = 43, + kCGEventSourceGroupID = 44, + kCGEventSourceStateID = 45, + kCGScrollWheelEventIsContinuous = 88, + kCGMouseEventWindowUnderMousePointer = 91, + kCGMouseEventWindowUnderMousePointerThatCanHandleThisEvent = 92; + + /** + * Constants used with the {@link #kCGMouseEventSubtype MouseEventSubtype} event field. ({@code CGEventMouseSubtype}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #kCGEventMouseSubtypeDefault EventMouseSubtypeDefault}
    • + *
    • {@link #kCGEventMouseSubtypeTabletPoint EventMouseSubtypeTabletPoint}
    • + *
    • {@link #kCGEventMouseSubtypeTabletProximity EventMouseSubtypeTabletProximity}
    • + *
    + */ + public static final int + kCGEventMouseSubtypeDefault = 0, + kCGEventMouseSubtypeTabletPoint = 1, + kCGEventMouseSubtypeTabletProximity = 2; + + protected CoreGraphics() { + throw new UnsupportedOperationException(); + } + + // --- [ CGEventGetTypeID ] --- + + /** Returns the type identifier for the opaque type {@code CGEventRef}. */ + @NativeType("CFTypeID") + public static long CGEventGetTypeID() { + long __functionAddress = Functions.EventGetTypeID; + return invokeJ(__functionAddress); + } + + // --- [ CGEventCreate ] --- + + /** Returns a new event using the event source {@code source}. If {@code source} is {@code NULL}, the default source is used. */ + @NativeType("CGEventRef") + public static long CGEventCreate(@NativeType("CGEventSourceRef") long source) { + long __functionAddress = Functions.EventCreate; + return invokePP(source, __functionAddress); + } + + // --- [ CGEventCreateData ] --- + + /** Return a "flattened" data representation of an event. */ + @NativeType("CFDataRef") + public static long CGEventCreateData(@NativeType("CFAllocatorRef") long allocator, @NativeType("CGEventRef") long event) { + long __functionAddress = Functions.EventCreateData; + return invokePPP(allocator, event, __functionAddress); + } + + // --- [ CGEventCreateFromData ] --- + + /** Returns an event created from a "flattened" data representation of the event. */ + @NativeType("CGEventRef") + public static long CGEventCreateFromData(@NativeType("CFAllocatorRef") long allocator, @NativeType("CFDataRef") long data) { + long __functionAddress = Functions.EventCreateFromData; + return invokePPP(allocator, data, __functionAddress); + } + + // --- [ CGEventCreateMouseEvent ] --- + + /** Unsafe version of: {@link #CGEventCreateMouseEvent EventCreateMouseEvent} */ + public static native long nCGEventCreateMouseEvent(long source, int mouseType, long mouseCursorPosition, int mouseButton, long __functionAddress); + + /** Unsafe version of: {@link #CGEventCreateMouseEvent EventCreateMouseEvent} */ + public static long nCGEventCreateMouseEvent(long source, int mouseType, long mouseCursorPosition, int mouseButton) { + long __functionAddress = Functions.EventCreateMouseEvent; + return nCGEventCreateMouseEvent(source, mouseType, mouseCursorPosition, mouseButton, __functionAddress); + } + + /** + * Returns a new mouse event. + * + *

    The event source may be taken from another event, or may be {@code NULL}. {@code mouseType} should be one of the mouse event types. + * {@code mouseCursorPosition} should be the position of the mouse cursor in global coordinates. {@code mouseButton} should be the button that's changing + * state; {@code mouseButton} is ignored unless {@code mouseType} is one of {@link #kCGEventOtherMouseDown EventOtherMouseDown}, {@link #kCGEventOtherMouseDragged EventOtherMouseDragged}, or {@link #kCGEventOtherMouseUp EventOtherMouseUp}.

    + * + *

    The current implemementation of the event system supports a maximum of thirty-two buttons. Mouse button 0 is the primary button on the mouse. Mouse + * button 1 is the secondary mouse button (right). Mouse button 2 is the center button, and the remaining buttons are in USB device order.

    + */ + @NativeType("CGEventRef") + public static long CGEventCreateMouseEvent(@NativeType("CGEventSourceRef") long source, @NativeType("CGEventType") int mouseType, CGPoint mouseCursorPosition, @NativeType("CGMouseButton") int mouseButton) { + return nCGEventCreateMouseEvent(source, mouseType, mouseCursorPosition.address(), mouseButton); + } + + // --- [ CGEventCreateKeyboardEvent ] --- + + /** + * Returns a new keyboard event. + * + *

    The event source may be taken from another event, or may be {@code NULL}. Based on the virtual key code values entered, the appropriate key down, key up, or + * flags changed events are generated.

    + * + *

    All keystrokes needed to generate a character must be entered, including SHIFT, CONTROL, OPTION, and COMMAND keys. For example, to produce a 'Z', the + * SHIFT key must be down, the 'z' key must go down, and then the SHIFT and 'z' key must be released:

    + * + *
    
    +     * CGEventCreateKeyboardEvent(source, (CGKeyCode)56, true);  // shift down
    +     * CGEventCreateKeyboardEvent(source, (CGKeyCode) 6, true);  // 'z' down
    +     * CGEventCreateKeyboardEvent(source, (CGKeyCode) 6, false); // 'z' up
    +     * CGEventCreateKeyboardEvent(source, (CGKeyCode)56, false); // 'shift up
    + */ + @NativeType("CGEventRef") + public static long CGEventCreateKeyboardEvent(@NativeType("CGEventSourceRef") long source, @NativeType("CGKeyCode") short virtualKey, @NativeType("bool") boolean keyDown) { + long __functionAddress = Functions.EventCreateKeyboardEvent; + return invokePCP(source, virtualKey, keyDown, __functionAddress); + } + + // --- [ CGEventCreateScrollWheelEvent ] --- + + /** + * Returns a new scrollwheel event. + * + *

    The event source may be taken from another event, or may be {@code NULL}. The scrolling units may be specified in lines using {@link #kCGScrollEventUnitLine ScrollEventUnitLine} or in + * pixels using {@link #kCGScrollEventUnitPixel ScrollEventUnitPixel}. {@link #kCGScrollEventUnitPixel ScrollEventUnitPixel} will produce an event that most applications interpret as a smooth scrolling event.

    + * + *

    One or more wheels must be specified. The current implementation supports up to three wheels.

    + * + *

    Every scrollwheel event can be interpreted to be scrolling by pixel or by line. The scale between the two is about 10 pixels per line by default. + * The scale can be altered by setting a custom value for the event source, using {@code CGEventSourceSetPixelsPerLine}.

    + */ + @NativeType("CGEventRef") + public static long CGEventCreateScrollWheelEvent(@NativeType("CGEventSourceRef") long source, @NativeType("CGScrollEventUnit") int units, @NativeType("uint32_t") int wheelCount, @NativeType("int32_t") int wheel1) { + long __functionAddress = Functions.EventCreateScrollWheelEvent; + return invokePP(source, units, wheelCount, wheel1, __functionAddress); + } + + /** + * Returns a new scrollwheel event. + * + *

    The event source may be taken from another event, or may be {@code NULL}. The scrolling units may be specified in lines using {@link #kCGScrollEventUnitLine ScrollEventUnitLine} or in + * pixels using {@link #kCGScrollEventUnitPixel ScrollEventUnitPixel}. {@link #kCGScrollEventUnitPixel ScrollEventUnitPixel} will produce an event that most applications interpret as a smooth scrolling event.

    + * + *

    One or more wheels must be specified. The current implementation supports up to three wheels.

    + * + *

    Every scrollwheel event can be interpreted to be scrolling by pixel or by line. The scale between the two is about 10 pixels per line by default. + * The scale can be altered by setting a custom value for the event source, using {@code CGEventSourceSetPixelsPerLine}.

    + */ + @NativeType("CGEventRef") + public static long CGEventCreateScrollWheelEvent(@NativeType("CGEventSourceRef") long source, @NativeType("CGScrollEventUnit") int units, @NativeType("int32_t") int wheel1) { + long __functionAddress = Functions.EventCreateScrollWheelEvent; + return invokePP(source, units, 1, wheel1, __functionAddress); + } + + // --- [ CGEventCreateScrollWheelEvent2 ] --- + + /** + * A non-variadic variant version of {@link #CGEventCreateScrollWheelEvent EventCreateScrollWheelEvent}. + * + * @since macOS 10.13 + */ + @NativeType("CGEventRef") + public static long CGEventCreateScrollWheelEvent2(@NativeType("CGEventSourceRef") long source, @NativeType("CGScrollEventUnit") int units, @NativeType("uint32_t") int wheelCount, @NativeType("int32_t") int wheel1, @NativeType("int32_t") int wheel2, @NativeType("int32_t") int wheel3) { + long __functionAddress = Functions.EventCreateScrollWheelEvent2; + if (CHECKS) { + check(__functionAddress); + } + return invokePP(source, units, wheelCount, wheel1, wheel2, wheel3, __functionAddress); + } + + // --- [ CGEventCreateCopy ] --- + + /** Return a copy of {@code event}. */ + @NativeType("CGEventRef") + public static long CGEventCreateCopy(@NativeType("CGEventRef") long event) { + long __functionAddress = Functions.EventCreateCopy; + return invokePP(event, __functionAddress); + } + + // --- [ CGEventCreateSourceFromEvent ] --- + + /** + * Returns an event source created from an existing event. + * + *

    Event filters may use the event source to generate events that are compatible with an event being filtered.

    + * + *

    Note that {@code CGEventCreateSourceFromEvent} may return {@code NULL} if the event was generated with a private {@code CGEventSourceStateID} owned by another + * process. Such events should be filtered based on the public state.

    + */ + @NativeType("CGEventSourceRef") + public static long CGEventCreateSourceFromEvent(@NativeType("CGEventRef") long event) { + long __functionAddress = Functions.EventCreateSourceFromEvent; + return invokePP(event, __functionAddress); + } + + // --- [ CGEventSetSource ] --- + + /** Set the event source of an event. */ + public static void CGEventSetSource(@NativeType("CGEventRef") long event, @NativeType("CGEventSourceRef") long source) { + long __functionAddress = Functions.EventSetSource; + invokePPV(event, source, __functionAddress); + } + + // --- [ CGEventGetType ] --- + + /** Returns the event type of an event (left mouse down, for example). */ + @NativeType("CGEventType") + public static int CGEventGetType(@NativeType("CGEventRef") long event) { + long __functionAddress = Functions.EventGetType; + return invokePI(event, __functionAddress); + } + + // --- [ CGEventSetType ] --- + + /** Sets the event type of an event. */ + public static void CGEventSetType(@NativeType("CGEventRef") long event, @NativeType("CGEventType") int type) { + long __functionAddress = Functions.EventSetType; + invokePV(event, type, __functionAddress); + } + + // --- [ CGEventGetTimestamp ] --- + + /** Returns the timestamp of an event. */ + @NativeType("CGEventTimestamp") + public static long CGEventGetTimestamp(@NativeType("CGEventRef") long event) { + long __functionAddress = Functions.EventGetTimestamp; + return invokePJ(event, __functionAddress); + } + + // --- [ CGEventSetTimestamp ] --- + + /** Sets the timestamp of an event. */ + public static void CGEventSetTimestamp(@NativeType("CGEventRef") long event, @NativeType("CGEventTimestamp") long timestamp) { + long __functionAddress = Functions.EventSetTimestamp; + invokePJV(event, timestamp, __functionAddress); + } + + // --- [ CGEventGetLocation ] --- + + /** Unsafe version of: {@link #CGEventGetLocation EventGetLocation} */ + public static native void nCGEventGetLocation(long event, long __functionAddress, long __result); + + /** Unsafe version of: {@link #CGEventGetLocation EventGetLocation} */ + public static void nCGEventGetLocation(long event, long __result) { + long __functionAddress = Functions.EventGetLocation; + nCGEventGetLocation(event, __functionAddress, __result); + } + + /** + * Returns the location of an event in global display coordinates. + * + *

    {@code CGPointZero} is returned if {@code event} is not a valid {@code CGEventRef}.

    + */ + public static CGPoint CGEventGetLocation(@NativeType("CGEventRef") long event, CGPoint __result) { + nCGEventGetLocation(event, __result.address()); + return __result; + } + + // --- [ CGEventGetUnflippedLocation ] --- + + /** Unsafe version of: {@link #CGEventGetUnflippedLocation EventGetUnflippedLocation} */ + public static native void nCGEventGetUnflippedLocation(long event, long __functionAddress, long __result); + + /** Unsafe version of: {@link #CGEventGetUnflippedLocation EventGetUnflippedLocation} */ + public static void nCGEventGetUnflippedLocation(long event, long __result) { + long __functionAddress = Functions.EventGetUnflippedLocation; + nCGEventGetUnflippedLocation(event, __functionAddress, __result); + } + + /** + * Return the location of an event relative to the lower-left corner of the main display. + * + *

    {@code CGPointZero} is returned if {@code event} is not a valid {@code CGEventRef}.

    + */ + public static CGPoint CGEventGetUnflippedLocation(@NativeType("CGEventRef") long event, CGPoint __result) { + nCGEventGetUnflippedLocation(event, __result.address()); + return __result; + } + + // --- [ CGEventSetLocation ] --- + + /** Unsafe version of: {@link #CGEventSetLocation EventSetLocation} */ + public static native void nCGEventSetLocation(long event, long location, long __functionAddress); + + /** Unsafe version of: {@link #CGEventSetLocation EventSetLocation} */ + public static void nCGEventSetLocation(long event, long location) { + long __functionAddress = Functions.EventSetLocation; + nCGEventSetLocation(event, location, __functionAddress); + } + + /** Sets the location of an event in global display coordinates. */ + public static void CGEventSetLocation(@NativeType("CGEventRef") long event, CGPoint location) { + nCGEventSetLocation(event, location.address()); + } + + // --- [ CGEventGetFlags ] --- + + /** + * Returns the event flags of an event. + * + *

    {@code (CGEventFlags)0} if {@code event} is not a valid {@code CGEventRef}.

    + */ + @NativeType("CGEventFlags") + public static long CGEventGetFlags(@NativeType("CGEventRef") long event) { + long __functionAddress = Functions.EventGetFlags; + return invokePJ(event, __functionAddress); + } + + // --- [ CGEventSetFlags ] --- + + /** Sets the event flags of an event. */ + public static void CGEventSetFlags(@NativeType("CGEventRef") long event, @NativeType("CGEventFlags") long flags) { + long __functionAddress = Functions.EventSetFlags; + invokePJV(event, flags, __functionAddress); + } + + // --- [ CGEventKeyboardGetUnicodeString ] --- + + /** Unsafe version of: {@link #CGEventKeyboardGetUnicodeString EventKeyboardGetUnicodeString} */ + public static void nCGEventKeyboardGetUnicodeString(long event, long maxStringLength, long actualStringLength, long unicodeString) { + long __functionAddress = Functions.EventKeyboardGetUnicodeString; + invokePNPPV(event, maxStringLength, actualStringLength, unicodeString, __functionAddress); + } + + /** + * Returns the Unicode string associated with a keyboard event. + * + *

    When you call this function with a {@code NULL} string or a maximum string length of 0, the function still returns the actual count of Unicode characters in + * the event.

    + */ + public static void CGEventKeyboardGetUnicodeString(@NativeType("CGEventRef") long event, @Nullable @NativeType("UniCharCount *") CLongBuffer actualStringLength, @Nullable @NativeType("UniChar *") ShortBuffer unicodeString) { + if (CHECKS) { + checkSafe(actualStringLength, 1); + } + nCGEventKeyboardGetUnicodeString(event, remainingSafe(unicodeString), memAddressSafe(actualStringLength), memAddressSafe(unicodeString)); + } + + // --- [ CGEventKeyboardSetUnicodeString ] --- + + /** Unsafe version of: {@link #CGEventKeyboardSetUnicodeString EventKeyboardSetUnicodeString} */ + public static void nCGEventKeyboardSetUnicodeString(long event, long stringLength, long unicodeString) { + long __functionAddress = Functions.EventKeyboardSetUnicodeString; + invokePNPV(event, stringLength, unicodeString, __functionAddress); + } + + /** + * Sets the Unicode string associated with a keyboard event. + * + *

    By default, the system translates the virtual key code in a keyboard event into a Unicode string based on the keyboard ID in the event source. This + * function allows you to manually override this string. Note that application frameworks may ignore the Unicode string in a keyboard event and do their + * own translation based on the virtual keycode and perceived event state.

    + */ + public static void CGEventKeyboardSetUnicodeString(@NativeType("CGEventRef") long event, @NativeType("UniChar const *") ShortBuffer unicodeString) { + nCGEventKeyboardSetUnicodeString(event, unicodeString.remaining(), memAddress(unicodeString)); + } + + // --- [ CGEventGetIntegerValueField ] --- + + /** Returns the integer value of a field in an event. */ + @NativeType("int64_t") + public static long CGEventGetIntegerValueField(@NativeType("CGEventRef") long event, @NativeType("CGEventField") int field) { + long __functionAddress = Functions.EventGetIntegerValueField; + return invokePJ(event, field, __functionAddress); + } + + // --- [ CGEventSetIntegerValueField ] --- + + /** + * Sets the integer value of a field in an event. + * + *

    Before calling this function, the event type must be set using a typed event creation function such as {@link #CGEventCreateMouseEvent EventCreateMouseEvent}, or by calling + * {@link #CGEventSetType EventSetType}.

    + * + *

    If you are creating a mouse event generated by a tablet, call this function and specify the field {@link #kCGMouseEventSubtype MouseEventSubtype} with a value of + * {@link #kCGEventMouseSubtypeTabletPoint EventMouseSubtypeTabletPoint} or {@link #kCGEventMouseSubtypeTabletProximity EventMouseSubtypeTabletProximity} before setting other parameters.

    + */ + public static void CGEventSetIntegerValueField(@NativeType("CGEventRef") long event, @NativeType("CGEventField") int field, @NativeType("int64_t") long value) { + long __functionAddress = Functions.EventSetIntegerValueField; + invokePJV(event, field, value, __functionAddress); + } + + // --- [ CGEventGetDoubleValueField ] --- + + /** + * Returns the floating-point value of a field in an event. + * + *

    In cases where the field value is represented within the event by a fixed point number or an integer, the result is scaled to the appropriate range as + * part of creating the floating-point representation.

    + */ + public static double CGEventGetDoubleValueField(@NativeType("CGEventRef") long event, @NativeType("CGEventField") int field) { + long __functionAddress = Functions.EventGetDoubleValueField; + return invokePD(event, field, __functionAddress); + } + + // --- [ CGEventSetDoubleValueField ] --- + + /** + * Sets the floating-point value of a field in an event. + * + *

    Before calling this function, the event type must be set using a typed event creation function such as {@link #CGEventCreateMouseEvent EventCreateMouseEvent}, or by calling + * {@link #CGEventSetType EventSetType}.

    + * + *

    In cases where the field’s value is represented within the event by a fixed point number or integer, the value parameter is scaled as needed and + * converted to the appropriate type.

    + */ + public static void CGEventSetDoubleValueField(@NativeType("CGEventRef") long event, @NativeType("CGEventField") int field, double value) { + long __functionAddress = Functions.EventSetDoubleValueField; + invokePV(event, field, value, __functionAddress); + } + + // --- [ CGEventTapCreate ] --- + + /** Unsafe version of: {@link #CGEventTapCreate EventTapCreate} */ + public static long nCGEventTapCreate(int tap, int place, int options, long eventsOfInterest, long callback, long userInfo) { + long __functionAddress = Functions.EventTapCreate; + return invokeJPPP(tap, place, options, eventsOfInterest, callback, userInfo, __functionAddress); + } + + /** + * Creates an event tap. + * + *

    Taps may be placed at the point where {@code HIDSystem} events enter the server, at the point where {@code HIDSystem} and remote control events enter a + * session, at the point where events have been annotated to flow to a specific application, or at the point where events are delivered to the + * application. Taps may be inserted at a specified point at the head of pre-existing filters, or appended after any pre-existing filters.

    + * + *

    Taps may be passive event listeners, or active filters. An active filter may pass an event through unmodified, modify an event, or discard an event. + * When a tap is registered, it identifies the set of events to be observed with a mask, and indicates if it is a passive or active event filter. Multiple + * event type bitmasks may be ORed together.

    + * + *

    Taps may only be placed at {@link #kCGHIDEventTap HIDEventTap} by a process running as the root user. {@code NULL} is returned for other users.

    + * + *

    Taps placed at {@link #kCGHIDEventTap HIDEventTap}, {@link #kCGSessionEventTap SessionEventTap}, {@link #kCGAnnotatedSessionEventTap AnnotatedSessionEventTap}, or on a specific process may only receive key up and down events if access + * for assistive devices is enabled (Preferences Accessibility panel, Keyboard view) or the caller is enabled for assistive device access, as by + * {@code AXMakeProcessTrusted}. If the tap is not permitted to monitor these events when the tap is created, then the appropriate bits in the mask are + * cleared. If that results in an empty mask, then {@code NULL} is returned.

    + * + *

    An event tap is represented as a {@code CFMachPortRef}. The event tap may be added to an appropriate run loop by calling {@code CFRunLoopAddSource}.

    + * + *

    Releasing the {@code CFMachPortRef} will release the tap.

    + * + *

    A {@code CGEventTapProxy} is an opaque reference to state within the client application associated with the tap. The tap function may pass this + * reference to other functions, such as the event-posting routines.

    + * + *

    The event tap callback runs from the {@code CFRunLoop} to which the tap {@code CFMachPort} is added as a source. Thread safety is defined by the + * {@code CFRunLoop} and its environment.

    + */ + @NativeType("CFMachPortRef") + public static long CGEventTapCreate(@NativeType("CGEventTapLocation") int tap, @NativeType("CGEventTapPlacement") int place, @NativeType("CGEventTapOptions") int options, @NativeType("CGEventMask") long eventsOfInterest, @NativeType("CGEventRef (*) (CGEventTapProxy, CGEventType, CGEventRef, void *)") CGEventTapCallBackI callback, @NativeType("void *") long userInfo) { + return nCGEventTapCreate(tap, place, options, eventsOfInterest, callback.address(), userInfo); + } + + // --- [ CGEventTapCreateForPid ] --- + + /** Unsafe version of: {@link #CGEventTapCreateForPid EventTapCreateForPid} */ + public static long nCGEventTapCreateForPid(long pid, int place, int options, long eventsOfInterest, long callback, long userInfo) { + long __functionAddress = Functions.EventTapCreateForPid; + if (CHECKS) { + check(__functionAddress); + check(pid); + } + return invokePJPPP(pid, place, options, eventsOfInterest, callback, userInfo, __functionAddress); + } + + /** + * Create an event tap for a specified process. + * + *

    Events routed to individual applications may be tapped using another function. {@code CGEventTapCreateForPSN} will report all events routed to the + * specified application.

    + * + * @since macOS 10.11 + */ + @NativeType("CFMachPortRef") + public static long CGEventTapCreateForPid(@NativeType("pid_t") long pid, @NativeType("CGEventTapPlacement") int place, @NativeType("CGEventTapOptions") int options, @NativeType("CGEventMask") long eventsOfInterest, @NativeType("CGEventRef (*) (CGEventTapProxy, CGEventType, CGEventRef, void *)") CGEventTapCallBackI callback, @NativeType("void *") long userInfo) { + return nCGEventTapCreateForPid(pid, place, options, eventsOfInterest, callback.address(), userInfo); + } + + // --- [ CGEventTapEnable ] --- + + /** + * Enables or disables an event tap. + * + *

    Taps are normally enabled when created. If a tap becomes unresponsive or a user requests taps be disabled, an appropriate + * {@code kCGEventTapDisabled...} event is passed to the registered {@link CGEventTapCallBack} function. An event tap may be re-enabled by calling this + * function.

    + */ + public static void CGEventTapEnable(@NativeType("CFMachPortRef") long tap, @NativeType("bool") boolean enable) { + long __functionAddress = Functions.EventTapEnable; + if (CHECKS) { + check(tap); + } + invokePV(tap, enable, __functionAddress); + } + + // --- [ CGEventTapIsEnabled ] --- + + /** Return true if {@code tap} is enabled; false otherwise. */ + @NativeType("bool") + public static boolean CGEventTapIsEnabled(@NativeType("CFMachPortRef") long tap) { + long __functionAddress = Functions.EventTapIsEnabled; + if (CHECKS) { + check(tap); + } + return invokePZ(tap, __functionAddress); + } + + // --- [ CGEventTapPostEvent ] --- + + /** + * Post an event from an event tap into the event stream. + * + *

    You can use this function to post a new event at the same point to which an event returned from an event tap callback function would be posted. The new + * event enters the system before the event returned by the callback enters the system. Events posted into the system will be seen by all taps placed + * after the tap posting the event.

    + */ + public static void CGEventTapPostEvent(@NativeType("CGEventTapProxy") long proxy, @NativeType("CGEventRef") long event) { + long __functionAddress = Functions.EventTapPostEvent; + invokePPV(proxy, event, __functionAddress); + } + + // --- [ CGEventPost ] --- + + /** + * Posts an event into the event stream at a specified location. + * + *

    This function posts the specified event immediately before any event taps instantiated for that location, and the event passes through any such + * taps.

    + * + * @param tap the location at which to post the event + * @param event the event to post + */ + public static void CGEventPost(@NativeType("CGEventTapLocation") int tap, @NativeType("CGEventRef") long event) { + long __functionAddress = Functions.EventPost; + if (CHECKS) { + check(event); + } + invokePV(tap, event, __functionAddress); + } + + // --- [ CGEventPostToPid ] --- + + /** + * Post an event into the event stream for a specific application. + * + *

    This function makes it possible for an application to establish an event routing policy, for example, by tapping events at the + * {@link #kCGAnnotatedSessionEventTap AnnotatedSessionEventTap} location and then posting the events to another desired process.

    + * + *

    This function posts the specified event immediately before any event taps instantiated for the specified process, and the event passes through any such + * taps.

    + * + * @since macOS 10.11 + */ + public static void CGEventPostToPid(@NativeType("pid_t") long pid, @NativeType("CGEventRef") long event) { + long __functionAddress = Functions.EventPostToPid; + if (CHECKS) { + check(__functionAddress); + check(pid); + } + invokePPV(pid, event, __functionAddress); + } + + // --- [ CGGetEventTapList ] --- + + /** Unsafe version of: {@link #CGGetEventTapList GetEventTapList} */ + public static int nCGGetEventTapList(int maxNumberOfTaps, long tapList, long eventTapCount) { + long __functionAddress = Functions.GetEventTapList; + return invokePPI(maxNumberOfTaps, tapList, eventTapCount, __functionAddress); + } + + /** + * Gets a list of currently installed event taps. + * + *

    {@code tapList} is an array of event tap information structures of length {@code maxNumberOfTaps}. You are responsible for allocating storage for this + * array. On return, your array contains a list of currently installed event taps. On return, the number of event taps that are currently installed is + * stored in {@code eventTapCount}. If you pass {@code NULL} in this parameter, the {@code maxNumberOfTaps} parameter is ignored, and the number of event taps + * that are currently installed is stored in {@code eventTapCount}.

    + * + *

    Each call to this function has the side effect of resetting the minimum and maximum latencies in the {@code tapList} parameter to the corresponding + * average values. Values reported in these fields reflect the minimum and maximum values seen since the preceding call, or the instantiation of the tap. + * This allows a monitoring tool to evaluate the best and worst case latency over time and under various operating conditions.

    + */ + @NativeType("CGError") + public static int CGGetEventTapList(@Nullable @NativeType("CGEventTapInformation *") CGEventTapInformation.Buffer tapList, @Nullable @NativeType("uint32_t *") IntBuffer eventTapCount) { + if (CHECKS) { + checkSafe(eventTapCount, 1); + } + return nCGGetEventTapList(remainingSafe(tapList), memAddressSafe(tapList), memAddressSafe(eventTapCount)); + } + + /** Array version of: {@link #CGEventKeyboardGetUnicodeString EventKeyboardGetUnicodeString} */ + public static void CGEventKeyboardGetUnicodeString(@NativeType("CGEventRef") long event, @Nullable @NativeType("UniCharCount *") CLongBuffer actualStringLength, @Nullable @NativeType("UniChar *") short[] unicodeString) { + long __functionAddress = Functions.EventKeyboardGetUnicodeString; + if (CHECKS) { + checkSafe(actualStringLength, 1); + } + invokePNPPV(event, (long)lengthSafe(unicodeString), memAddressSafe(actualStringLength), unicodeString, __functionAddress); + } + + /** Array version of: {@link #CGEventKeyboardSetUnicodeString EventKeyboardSetUnicodeString} */ + public static void CGEventKeyboardSetUnicodeString(@NativeType("CGEventRef") long event, @NativeType("UniChar const *") short[] unicodeString) { + long __functionAddress = Functions.EventKeyboardSetUnicodeString; + invokePNPV(event, (long)unicodeString.length, unicodeString, __functionAddress); + } + + /** Array version of: {@link #CGGetEventTapList GetEventTapList} */ + @NativeType("CGError") + public static int CGGetEventTapList(@Nullable @NativeType("CGEventTapInformation *") CGEventTapInformation.Buffer tapList, @Nullable @NativeType("uint32_t *") int[] eventTapCount) { + long __functionAddress = Functions.GetEventTapList; + if (CHECKS) { + checkSafe(eventTapCount, 1); + } + return invokePPI(remainingSafe(tapList), memAddressSafe(tapList), eventTapCount, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/DynamicLinkLoader.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/DynamicLinkLoader.java new file mode 100644 index 000000000..73d702a18 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/DynamicLinkLoader.java @@ -0,0 +1,290 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to <dlfcn.h>. */ +public class DynamicLinkLoader { + + static { Library.initialize(); } + + /** The {@code mode} argument to {@link #dlopen} contains one of the following. */ + public static final int + RTLD_LAZY = 0x1, + RTLD_NOW = 0x2, + RTLD_LOCAL = 0x4, + RTLD_GLOBAL = 0x8; + + /** Special-handle values for {@link #dlsym}. */ + public static final long + RTLD_NEXT = 0xFFFFFFFFFFFFFFFFL, + RTLD_DEFAULT = 0xFFFFFFFFFFFFFFFEL, + RTLD_SELF = 0xFFFFFFFFFFFFFFFDL, + RTLD_MAIN_ONLY = 0xFFFFFFFFFFFFFFFBL; + + protected DynamicLinkLoader() { + throw new UnsupportedOperationException(); + } + + // --- [ dlopen ] --- + + /** Unsafe version of: {@link #dlopen} */ + public static native long ndlopen(long path, int mode); + + /** + * Loads and links a dynamic library or bundle. + * + *

    This function examines the Mach-O file specified by path. If the image is compatible with the current process and has not already been loaded into the + * process, the image is loaded and linked. If the image contains initializer functions, they are executed before this function returns.

    + * + *

    Subsequent calls to {@code dlopen} to load the same image return the same handle, but the internal reference count for the handle is incremented. + * Therefore, all {@code dlopen} calls must be balanced with {@link #dlclose} calls.

    + * + *

    For efficiency, the {@link #RTLD_LAZY} binding mode is preferred over {@link #RTLD_NOW}. However, using {@link #RTLD_NOW} ensures that any undefined + * symbols are discovered during the call to {@code dlopen}.

    + * + *

    The dynamic loader looks in the paths specified by a set of environment variables, and in the process's current directory, when it searches for a + * library. These paths are called dynamic loader search paths. The environment variables are {@code LD_LIBRARY_PATH}, {@code DYLD_LIBRARY_PATH}, and + * {@code DYLD_FALLBACK_LIBRARY_PATH}. The default value of {@code DYLD_FALLBACK_LIBRARY_PATH} (used when this variable is not set), is + * {@code $HOME/lib;/usr/local/lib;/usr/lib}.

    + * + *

    The order in which the search paths are searched depends on whether path is a filename (it does not contain a slash) or a pathname (it contains at least + * one slash).

    + * + *

    When path is a filename, the dynamic loader searches for the library in the search paths in the following order:

    + * + *
      + *
    • $LD_LIBRARY_PATH
    • + *
    • $DYLD_LIBRARY_PATH
    • + *
    • The process's working directory
    • + *
    • $DYLD_FALLBACK_LIBRARY_PATH
    • + *
    + * + *

    When path is a pathname, the dynamic loader searches for the library in the search paths in the following order:

    + * + *
      + *
    • $DYLD_LIBRARY_PATH
    • + *
    • The given pathname
    • + *
    • $DYLD_FALLBACK_LIBRARY_PATH using the filename
    • + *
    + * + * @param path path to the image to open + * @param mode specifies when the loaded image's external symbols are bound to their definitions in dependent libraries (lazy or at load time) and the visibility + * of the image's exported symbols (global or local). The value of this parameter is made up by ORing one binding behavior value with one visibility + * specification value. + * + *

    The following values specify the binding behavior:

    + * + *
      + *
    • {@link #RTLD_LAZY} (default): Each external symbol reference is bound the first time it's used.
    • + *
    • {@link #RTLD_NOW}: All external symbol references are bound immediately.
    • + *
    + * + *

    The following values specify external symbol visibility:

    + * + *
      + *
    • {@link #RTLD_GLOBAL} (default): The loaded image's exported symbols are available to any images that use a flat namespace or to calls to + * dlsym when using a special handle (see {@link #dlsym} for details).
    • + *
    • {@link #RTLD_LOCAL}: The loaded image's exported symbols are generally hidden. They are available only to {@link #dlsym} invocations that + * use the handle returned by this function.
    • + *
    + */ + @NativeType("void *") + public static long dlopen(@Nullable @NativeType("char const *") ByteBuffer path, int mode) { + if (CHECKS) { + checkNT1Safe(path); + } + return ndlopen(memAddressSafe(path), mode); + } + + /** + * Loads and links a dynamic library or bundle. + * + *

    This function examines the Mach-O file specified by path. If the image is compatible with the current process and has not already been loaded into the + * process, the image is loaded and linked. If the image contains initializer functions, they are executed before this function returns.

    + * + *

    Subsequent calls to {@code dlopen} to load the same image return the same handle, but the internal reference count for the handle is incremented. + * Therefore, all {@code dlopen} calls must be balanced with {@link #dlclose} calls.

    + * + *

    For efficiency, the {@link #RTLD_LAZY} binding mode is preferred over {@link #RTLD_NOW}. However, using {@link #RTLD_NOW} ensures that any undefined + * symbols are discovered during the call to {@code dlopen}.

    + * + *

    The dynamic loader looks in the paths specified by a set of environment variables, and in the process's current directory, when it searches for a + * library. These paths are called dynamic loader search paths. The environment variables are {@code LD_LIBRARY_PATH}, {@code DYLD_LIBRARY_PATH}, and + * {@code DYLD_FALLBACK_LIBRARY_PATH}. The default value of {@code DYLD_FALLBACK_LIBRARY_PATH} (used when this variable is not set), is + * {@code $HOME/lib;/usr/local/lib;/usr/lib}.

    + * + *

    The order in which the search paths are searched depends on whether path is a filename (it does not contain a slash) or a pathname (it contains at least + * one slash).

    + * + *

    When path is a filename, the dynamic loader searches for the library in the search paths in the following order:

    + * + *
      + *
    • $LD_LIBRARY_PATH
    • + *
    • $DYLD_LIBRARY_PATH
    • + *
    • The process's working directory
    • + *
    • $DYLD_FALLBACK_LIBRARY_PATH
    • + *
    + * + *

    When path is a pathname, the dynamic loader searches for the library in the search paths in the following order:

    + * + *
      + *
    • $DYLD_LIBRARY_PATH
    • + *
    • The given pathname
    • + *
    • $DYLD_FALLBACK_LIBRARY_PATH using the filename
    • + *
    + * + * @param path path to the image to open + * @param mode specifies when the loaded image's external symbols are bound to their definitions in dependent libraries (lazy or at load time) and the visibility + * of the image's exported symbols (global or local). The value of this parameter is made up by ORing one binding behavior value with one visibility + * specification value. + * + *

    The following values specify the binding behavior:

    + * + *
      + *
    • {@link #RTLD_LAZY} (default): Each external symbol reference is bound the first time it's used.
    • + *
    • {@link #RTLD_NOW}: All external symbol references are bound immediately.
    • + *
    + * + *

    The following values specify external symbol visibility:

    + * + *
      + *
    • {@link #RTLD_GLOBAL} (default): The loaded image's exported symbols are available to any images that use a flat namespace or to calls to + * dlsym when using a special handle (see {@link #dlsym} for details).
    • + *
    • {@link #RTLD_LOCAL}: The loaded image's exported symbols are generally hidden. They are available only to {@link #dlsym} invocations that + * use the handle returned by this function.
    • + *
    + */ + @NativeType("void *") + public static long dlopen(@Nullable @NativeType("char const *") CharSequence path, int mode) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(path, true); + long pathEncoded = path == null ? NULL : stack.getPointerAddress(); + return ndlopen(pathEncoded, mode); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ dlerror ] --- + + /** Unsafe version of: {@link #dlerror} */ + public static native long ndlerror(); + + /** + * Provides diagnostic information corresponding to problems with calls to {@link #dlopen}, {@link #dlsym}, and {@link #dlclose} in the same thread. + * + *

    When there's a problem to report, this function returns a pointer to a null-terminated string describing the problem. Otherwise, this function returns + * {@code NULL}.

    + * + *

    Each call to {@code dlerror} resets its diagnostic buffer. If a program needs to keep a record of past error messages, it must store them itself. + * Subsequent calls to {@code dlerror} in the same thread with no calls to {@link #dlopen}, {@link #dlsym}, or {@link #dlclose}, return {@code NULL}.

    + */ + @Nullable + @NativeType("char const *") + public static String dlerror() { + long __result = ndlerror(); + return memUTF8Safe(__result); + } + + // --- [ dlsym ] --- + + /** Unsafe version of: {@link #dlsym} */ + public static native long ndlsym(long handle, long name); + + /** + * Returns the address of a symbol. + * + *

    The value of handle specifies what images this function searches for to locate the symbol specified by the symbol parameter. The following table + * describes the possible values for the handle parameter:

    + * + * + * + * + * + * + *
    Handle valueSearch scope
    {@code dlopen} handleImage associated with the {@link #dlopen} handle.
    {@link #RTLD_DEFAULT}Every dependent library or {@link #RTLD_GLOBAL}–opened library in the current process, in the order they were loaded.
    {@link #RTLD_NEXT}Dependent libraries that were loaded after the one calling this function. Libraries opened with {@link #dlopen} are not searched.
    + * + *

    Unlike in the NS... functions, the symbol parameter doesn't require a leading underscore to be part of the symbol name.

    + * + * @param handle a handle obtained by a call to {@link #dlopen}, or a special handle. If the handle was obtained by a call to {@link #dlopen}, it must not have been + * closed with a call to {@link #dlclose}. These are the possible special-handle values: {@link #RTLD_DEFAULT}, and {@link #RTLD_NEXT}. + * @param name the null-terminated character string containing the C name of the symbol being sought + */ + @NativeType("void *") + public static long dlsym(@NativeType("void *") long handle, @NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + check(handle); + checkNT1(name); + } + return ndlsym(handle, memAddress(name)); + } + + /** + * Returns the address of a symbol. + * + *

    The value of handle specifies what images this function searches for to locate the symbol specified by the symbol parameter. The following table + * describes the possible values for the handle parameter:

    + * + * + * + * + * + * + *
    Handle valueSearch scope
    {@code dlopen} handleImage associated with the {@link #dlopen} handle.
    {@link #RTLD_DEFAULT}Every dependent library or {@link #RTLD_GLOBAL}–opened library in the current process, in the order they were loaded.
    {@link #RTLD_NEXT}Dependent libraries that were loaded after the one calling this function. Libraries opened with {@link #dlopen} are not searched.
    + * + *

    Unlike in the NS... functions, the symbol parameter doesn't require a leading underscore to be part of the symbol name.

    + * + * @param handle a handle obtained by a call to {@link #dlopen}, or a special handle. If the handle was obtained by a call to {@link #dlopen}, it must not have been + * closed with a call to {@link #dlclose}. These are the possible special-handle values: {@link #RTLD_DEFAULT}, and {@link #RTLD_NEXT}. + * @param name the null-terminated character string containing the C name of the symbol being sought + */ + @NativeType("void *") + public static long dlsym(@NativeType("void *") long handle, @NativeType("char const *") CharSequence name) { + if (CHECKS) { + check(handle); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return ndlsym(handle, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ dlclose ] --- + + /** Unsafe version of: {@link #dlclose} */ + public static native int ndlclose(long handle); + + /** + * Closes a dynamic library or bundle. + * + *

    This function decreases the reference count of the image referenced by handle. When the reference count for handle becomes 0, the termination routines + * in the image are called, and the image is removed from the address space of the current process. After that point, handle is rendered invalid.

    + * + * @param handle a handle obtained through a call to {@link #dlopen}. + */ + public static int dlclose(@NativeType("void *") long handle) { + if (CHECKS) { + check(handle); + } + return ndlclose(handle); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/EnumerationMutationHandler.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/EnumerationMutationHandler.java new file mode 100644 index 000000000..da8de7741 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/EnumerationMutationHandler.java @@ -0,0 +1,75 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A mutation handler. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     id id
    + * )
    + */ +public abstract class EnumerationMutationHandler extends Callback implements EnumerationMutationHandlerI { + + /** + * Creates a {@code EnumerationMutationHandler} instance from the specified function pointer. + * + * @return the new {@code EnumerationMutationHandler} + */ + public static EnumerationMutationHandler create(long functionPointer) { + EnumerationMutationHandlerI instance = Callback.get(functionPointer); + return instance instanceof EnumerationMutationHandler + ? (EnumerationMutationHandler)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static EnumerationMutationHandler createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code EnumerationMutationHandler} instance that delegates to the specified {@code EnumerationMutationHandlerI} instance. */ + public static EnumerationMutationHandler create(EnumerationMutationHandlerI instance) { + return instance instanceof EnumerationMutationHandler + ? (EnumerationMutationHandler)instance + : new Container(instance.address(), instance); + } + + protected EnumerationMutationHandler() { + super(CIF); + } + + EnumerationMutationHandler(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends EnumerationMutationHandler { + + private final EnumerationMutationHandlerI delegate; + + Container(long functionPointer, EnumerationMutationHandlerI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long id) { + delegate.invoke(id); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/EnumerationMutationHandlerI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/EnumerationMutationHandlerI.java new file mode 100644 index 000000000..58ea9a74c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/EnumerationMutationHandlerI.java @@ -0,0 +1,52 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * A mutation handler. + * + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     id id
    + * )
    + */ +@FunctionalInterface +@NativeType("EnumerationMutationHandler") +public interface EnumerationMutationHandlerI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)) + ); + } + + /** + * Will be called when an object is mutated during a foreach iteration. + * + * @param id the object that was mutated + */ + void invoke(@NativeType("id") long id); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/LibC.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/LibC.java new file mode 100644 index 000000000..dcf2aa576 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/LibC.java @@ -0,0 +1,40 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.JNI.*; + +/** Native bindings to libc, the Standard C Library. */ +public class LibC { + + /** Contains the function pointers loaded from {@code LibSystem.getLibrary()}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + getpid = apiGetFunctionAddress(LibSystem.getLibrary(), "getpid"); + + } + + protected LibC() { + throw new UnsupportedOperationException(); + } + + // --- [ getpid ] --- + + /** Returns the process ID of the calling process. */ + @NativeType("pid_t") + public static long getpid() { + long __functionAddress = Functions.getpid; + return invokeP(__functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/LibSystem.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/LibSystem.java new file mode 100644 index 000000000..65338faf1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/LibSystem.java @@ -0,0 +1,29 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import org.lwjgl.system.*; + +/** + * Native bindings to libSystem, the MacOS system library. + * + *

    This class contains no functionality and is only responsible for loading the system library. Other libraries (contained in libSystem) reuse the library + * handle loaded by this class.

    + */ +public final class LibSystem { + + private static final SharedLibrary SYSTEM = Library.loadNative(LibSystem.class, "org.lwjgl", "System"); + + /** Returns the System {@link SharedLibrary}. */ + public static SharedLibrary getLibrary() { + return SYSTEM; + } + + private LibSystem() { + throw new UnsupportedOperationException(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibrary.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibrary.java new file mode 100644 index 000000000..75bf3718d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibrary.java @@ -0,0 +1,32 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system.macosx; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; + +/** Implements a {@link SharedLibrary} on the macOS. */ +public abstract class MacOSXLibrary extends SharedLibrary.Default { + + protected MacOSXLibrary(String name, long handle) { + super(name, handle); + } + + public static MacOSXLibrary getWithIdentifier(String bundleID) { + apiLog("Loading library: " + bundleID); + MacOSXLibraryBundle lib = MacOSXLibraryBundle.getWithIdentifier(bundleID); + apiLogMore("Success"); + return lib; + } + + public static MacOSXLibrary create(String name) { + return name.endsWith(".framework") + ? MacOSXLibraryBundle.create(name) + : new MacOSXLibraryDL(name); + } + +} + diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibraryBundle.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibraryBundle.java new file mode 100644 index 000000000..536b6a061 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibraryBundle.java @@ -0,0 +1,90 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system.macosx; + +import org.lwjgl.system.*; + +import javax.annotation.*; +import java.nio.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.macosx.CoreFoundation.*; + +/** Implements a {@link SharedLibrary} on the macOS using {@code CFBundle}. */ +public class MacOSXLibraryBundle extends MacOSXLibrary { + + public MacOSXLibraryBundle(String name, long bundleRef) { + super(name, bundleRef); + } + + public static MacOSXLibraryBundle getWithIdentifier(String bundleID) { + long filePath = NULL; + try (MemoryStack stack = stackPush()) { + filePath = CString2CFString(stack.UTF8(bundleID), kCFStringEncodingUTF8); + + long bundleRef = CFBundleGetBundleWithIdentifier(filePath); + if (bundleRef == NULL) { + throw new UnsatisfiedLinkError("Failed to retrieve bundle with identifier: " + bundleID); + } + + CFRetain(bundleRef); + return new MacOSXLibraryBundle(bundleID, bundleRef); + } finally { + if (filePath != NULL) { + CFRelease(filePath); + } + } + } + + public static MacOSXLibraryBundle create(String path) { + long filePath = NULL; + long url = NULL; + try (MemoryStack stack = stackPush()) { + filePath = CString2CFString(stack.UTF8(path), kCFStringEncodingUTF8); + url = check(CFURLCreateWithFileSystemPath(NULL, filePath, kCFURLPOSIXPathStyle, true)); + + long bundleRef = CFBundleCreate(NULL, url); + if (bundleRef == NULL) { + throw new UnsatisfiedLinkError("Failed to create bundle: " + path); + } + + return new MacOSXLibraryBundle(path, bundleRef); + } finally { + if (url != NULL) { + CFRelease(url); + } + if (filePath != NULL) { + CFRelease(filePath); + } + } + } + + @Nullable + @Override public String getPath() { + return null; + } + + @Override + public long getFunctionAddress(ByteBuffer functionName) { + long nameRef = CString2CFString(functionName, kCFStringEncodingASCII); + try { + return CFBundleGetFunctionPointerForName(address(), nameRef); + } finally { + CFRelease(nameRef); + } + } + + private static long CString2CFString(ByteBuffer name, int encoding) { + return check(CFStringCreateWithCStringNoCopy(NULL, name, encoding, kCFAllocatorNull)); + } + + @Override + public void free() { + CFRelease(address()); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibraryDL.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibraryDL.java new file mode 100644 index 000000000..8acb30895 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/MacOSXLibraryDL.java @@ -0,0 +1,54 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system.macosx; + +import org.lwjgl.system.*; + +import javax.annotation.*; +import java.nio.*; + +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.macosx.DynamicLinkLoader.*; + +/** Implements a {@link SharedLibrary} on the macOS using {@link DynamicLinkLoader#dlopen dlopen}. */ +public class MacOSXLibraryDL extends MacOSXLibrary { + + public MacOSXLibraryDL(String name) { + this(name, loadLibrary(name)); + } + + public MacOSXLibraryDL(String name, long handle) { + super(name, handle); + } + + private static long loadLibrary(String name) { + long handle; + try (MemoryStack stack = stackPush()) { + handle = dlopen(stack.UTF8(name), RTLD_LAZY | RTLD_LOCAL); + } + if (handle == NULL) { + throw new UnsatisfiedLinkError("Failed to dynamically load library: " + name + "(error = " + dlerror() + ")"); + } + return handle; + } + + @Nullable + @Override + public String getPath() { + return SharedLibraryUtil.getLibraryPath(address()); + } + + @Override + public long getFunctionAddress(ByteBuffer functionName) { + return dlsym(address(), functionName); + } + + @Override + public void free() { + dlclose(address()); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCMethodDescription.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCMethodDescription.java new file mode 100644 index 000000000..2c07c4dfa --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCMethodDescription.java @@ -0,0 +1,277 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Defines a method. + * + *

    Layout

    + * + *
    
    + * struct objc_method_description {
    + *     SEL {@link #name};
    + *     char * {@link #types};
    + * }
    + */ +@NativeType("struct objc_method_description") +public class ObjCMethodDescription extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NAME, + TYPES; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NAME = layout.offsetof(0); + TYPES = layout.offsetof(1); + } + + protected ObjCMethodDescription(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected ObjCMethodDescription create(long address, @Nullable ByteBuffer container) { + return new ObjCMethodDescription(address, container); + } + + /** + * Creates a {@code ObjCMethodDescription} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public ObjCMethodDescription(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the name of the method at runtime */ + @NativeType("SEL") + public long name() { return nname(address()); } + /** the types of the method arguments */ + @NativeType("char *") + public ByteBuffer types() { return ntypes(address()); } + /** the types of the method arguments */ + @NativeType("char *") + public String typesString() { return ntypesString(address()); } + + // ----------------------------------- + + /** Returns a new {@code ObjCMethodDescription} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static ObjCMethodDescription malloc() { + return new ObjCMethodDescription(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code ObjCMethodDescription} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static ObjCMethodDescription calloc() { + return new ObjCMethodDescription(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code ObjCMethodDescription} instance allocated with {@link BufferUtils}. */ + public static ObjCMethodDescription create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new ObjCMethodDescription(memAddress(container), container); + } + + /** Returns a new {@code ObjCMethodDescription} instance for the specified memory address. */ + public static ObjCMethodDescription create(long address) { + return new ObjCMethodDescription(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static ObjCMethodDescription createSafe(long address) { + return address == NULL ? null : new ObjCMethodDescription(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static ObjCMethodDescription mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static ObjCMethodDescription callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static ObjCMethodDescription mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static ObjCMethodDescription callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code ObjCMethodDescription} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static ObjCMethodDescription malloc(MemoryStack stack) { + return new ObjCMethodDescription(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code ObjCMethodDescription} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static ObjCMethodDescription calloc(MemoryStack stack) { + return new ObjCMethodDescription(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #name}. */ + public static long nname(long struct) { return memGetAddress(struct + ObjCMethodDescription.NAME); } + /** Unsafe version of {@link #types}. */ + public static ByteBuffer ntypes(long struct) { return memByteBufferNT1(memGetAddress(struct + ObjCMethodDescription.TYPES)); } + /** Unsafe version of {@link #typesString}. */ + public static String ntypesString(long struct) { return memUTF8(memGetAddress(struct + ObjCMethodDescription.TYPES)); } + + // ----------------------------------- + + /** An array of {@link ObjCMethodDescription} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final ObjCMethodDescription ELEMENT_FACTORY = ObjCMethodDescription.create(-1L); + + /** + * Creates a new {@code ObjCMethodDescription.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link ObjCMethodDescription#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected ObjCMethodDescription getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link ObjCMethodDescription#name} field. */ + @NativeType("SEL") + public long name() { return ObjCMethodDescription.nname(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@link ObjCMethodDescription#types} field. */ + @NativeType("char *") + public ByteBuffer types() { return ObjCMethodDescription.ntypes(address()); } + /** @return the null-terminated string pointed to by the {@link ObjCMethodDescription#types} field. */ + @NativeType("char *") + public String typesString() { return ObjCMethodDescription.ntypesString(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCPropertyAttribute.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCPropertyAttribute.java new file mode 100644 index 000000000..1e30fb276 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCPropertyAttribute.java @@ -0,0 +1,340 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Defines a property attribute. + * + *

    Layout

    + * + *
    
    + * struct objc_property_attribute_t {
    + *     char * {@link #name};
    + *     char * {@link #value};
    + * }
    + */ +@NativeType("struct objc_property_attribute_t") +public class ObjCPropertyAttribute extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NAME, + VALUE; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NAME = layout.offsetof(0); + VALUE = layout.offsetof(1); + } + + protected ObjCPropertyAttribute(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected ObjCPropertyAttribute create(long address, @Nullable ByteBuffer container) { + return new ObjCPropertyAttribute(address, container); + } + + /** + * Creates a {@code ObjCPropertyAttribute} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public ObjCPropertyAttribute(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the name of the attribute */ + @NativeType("char *") + public ByteBuffer name() { return nname(address()); } + /** the name of the attribute */ + @NativeType("char *") + public String nameString() { return nnameString(address()); } + /** the value of the attribute (usually empty) */ + @NativeType("char *") + public ByteBuffer value() { return nvalue(address()); } + /** the value of the attribute (usually empty) */ + @NativeType("char *") + public String valueString() { return nvalueString(address()); } + + /** Sets the address of the specified encoded string to the {@link #name} field. */ + public ObjCPropertyAttribute name(@NativeType("char *") ByteBuffer value) { nname(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@link #value} field. */ + public ObjCPropertyAttribute value(@NativeType("char *") ByteBuffer value) { nvalue(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public ObjCPropertyAttribute set( + ByteBuffer name, + ByteBuffer value + ) { + name(name); + value(value); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public ObjCPropertyAttribute set(ObjCPropertyAttribute src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code ObjCPropertyAttribute} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static ObjCPropertyAttribute malloc() { + return new ObjCPropertyAttribute(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code ObjCPropertyAttribute} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static ObjCPropertyAttribute calloc() { + return new ObjCPropertyAttribute(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code ObjCPropertyAttribute} instance allocated with {@link BufferUtils}. */ + public static ObjCPropertyAttribute create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new ObjCPropertyAttribute(memAddress(container), container); + } + + /** Returns a new {@code ObjCPropertyAttribute} instance for the specified memory address. */ + public static ObjCPropertyAttribute create(long address) { + return new ObjCPropertyAttribute(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static ObjCPropertyAttribute createSafe(long address) { + return address == NULL ? null : new ObjCPropertyAttribute(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static ObjCPropertyAttribute mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static ObjCPropertyAttribute callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static ObjCPropertyAttribute mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static ObjCPropertyAttribute callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code ObjCPropertyAttribute} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static ObjCPropertyAttribute malloc(MemoryStack stack) { + return new ObjCPropertyAttribute(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code ObjCPropertyAttribute} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static ObjCPropertyAttribute calloc(MemoryStack stack) { + return new ObjCPropertyAttribute(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #name}. */ + public static ByteBuffer nname(long struct) { return memByteBufferNT1(memGetAddress(struct + ObjCPropertyAttribute.NAME)); } + /** Unsafe version of {@link #nameString}. */ + public static String nnameString(long struct) { return memUTF8(memGetAddress(struct + ObjCPropertyAttribute.NAME)); } + /** Unsafe version of {@link #value}. */ + public static ByteBuffer nvalue(long struct) { return memByteBufferNT1(memGetAddress(struct + ObjCPropertyAttribute.VALUE)); } + /** Unsafe version of {@link #valueString}. */ + public static String nvalueString(long struct) { return memUTF8(memGetAddress(struct + ObjCPropertyAttribute.VALUE)); } + + /** Unsafe version of {@link #name(ByteBuffer) name}. */ + public static void nname(long struct, ByteBuffer value) { + if (CHECKS) { checkNT1(value); } + memPutAddress(struct + ObjCPropertyAttribute.NAME, memAddress(value)); + } + /** Unsafe version of {@link #value(ByteBuffer) value}. */ + public static void nvalue(long struct, ByteBuffer value) { + if (CHECKS) { checkNT1(value); } + memPutAddress(struct + ObjCPropertyAttribute.VALUE, memAddress(value)); + } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + ObjCPropertyAttribute.NAME)); + check(memGetAddress(struct + ObjCPropertyAttribute.VALUE)); + } + + // ----------------------------------- + + /** An array of {@link ObjCPropertyAttribute} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final ObjCPropertyAttribute ELEMENT_FACTORY = ObjCPropertyAttribute.create(-1L); + + /** + * Creates a new {@code ObjCPropertyAttribute.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link ObjCPropertyAttribute#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected ObjCPropertyAttribute getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@link ObjCPropertyAttribute#name} field. */ + @NativeType("char *") + public ByteBuffer name() { return ObjCPropertyAttribute.nname(address()); } + /** @return the null-terminated string pointed to by the {@link ObjCPropertyAttribute#name} field. */ + @NativeType("char *") + public String nameString() { return ObjCPropertyAttribute.nnameString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@link ObjCPropertyAttribute#value} field. */ + @NativeType("char *") + public ByteBuffer value() { return ObjCPropertyAttribute.nvalue(address()); } + /** @return the null-terminated string pointed to by the {@link ObjCPropertyAttribute#value} field. */ + @NativeType("char *") + public String valueString() { return ObjCPropertyAttribute.nvalueString(address()); } + + /** Sets the address of the specified encoded string to the {@link ObjCPropertyAttribute#name} field. */ + public Buffer name(@NativeType("char *") ByteBuffer value) { ObjCPropertyAttribute.nname(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@link ObjCPropertyAttribute#value} field. */ + public Buffer value(@NativeType("char *") ByteBuffer value) { ObjCPropertyAttribute.nvalue(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCRuntime.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCRuntime.java new file mode 100644 index 000000000..34812a5cc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/macosx/ObjCRuntime.java @@ -0,0 +1,3405 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.macosx; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to the Objective-C Runtime. + * + *

    Due to the nature of the {@code objc_msgSend*} functions, they are not directly exposed in this binding. Advanced users with good understanding of the + * complexity involved with using these functions, may access them via the {@link #getLibrary} method:

    + * + *
    
    + * SharedLibrary objc = ObjCRuntime.getLibrary();
    + * long objc_msgSend = objc.getFunctionAddress("objc_msgSend");
    + * 
    + * // example usage
    + * long NSThread = objc_getClass("NSThread");
    + * long currentThread = invokePPP(NSThread, sel_getUid("currentThread"), objc_msgSend);
    + * + *

    The safe way to use objc_msgSend in C code is to cast it to an appropriate function pointer. This is exactly what the {@link JNI JNI} + * class does. If a particular function signature is not available, {@link org.lwjgl.system.libffi.LibFFI LibFFI} may be used to invoke it.

    + * + *

    The functions not exposed are:

    + * + *
      + *
    • objc_msgSend
    • + *
    • objc_msgSend_stret
    • + *
    • objc_msgSendSuper
    • + *
    • objc_msgSendSuper_stret
    • + *
    + */ +public class ObjCRuntime { + + private static final SharedLibrary OBJC = Library.loadNative(ObjCRuntime.class, "org.lwjgl", "objc"); + + /** Contains the function pointers loaded from the objc {@link SharedLibrary}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + object_copy = apiGetFunctionAddress(OBJC, "object_copy"), + object_dispose = apiGetFunctionAddress(OBJC, "object_dispose"), + object_getClass = apiGetFunctionAddress(OBJC, "object_getClass"), + object_setClass = apiGetFunctionAddress(OBJC, "object_setClass"), + object_getClassName = apiGetFunctionAddress(OBJC, "object_getClassName"), + object_getIndexedIvars = apiGetFunctionAddress(OBJC, "object_getIndexedIvars"), + object_getIvar = apiGetFunctionAddress(OBJC, "object_getIvar"), + object_setIvar = apiGetFunctionAddress(OBJC, "object_setIvar"), + object_setInstanceVariable = apiGetFunctionAddress(OBJC, "object_setInstanceVariable"), + object_getInstanceVariable = apiGetFunctionAddress(OBJC, "object_getInstanceVariable"), + objc_getClass = apiGetFunctionAddress(OBJC, "objc_getClass"), + objc_getMetaClass = apiGetFunctionAddress(OBJC, "objc_getMetaClass"), + objc_lookUpClass = apiGetFunctionAddress(OBJC, "objc_lookUpClass"), + objc_getRequiredClass = apiGetFunctionAddress(OBJC, "objc_getRequiredClass"), + objc_getClassList = apiGetFunctionAddress(OBJC, "objc_getClassList"), + objc_copyClassList = apiGetFunctionAddress(OBJC, "objc_copyClassList"), + class_getName = apiGetFunctionAddress(OBJC, "class_getName"), + class_isMetaClass = apiGetFunctionAddress(OBJC, "class_isMetaClass"), + class_getSuperclass = apiGetFunctionAddress(OBJC, "class_getSuperclass"), + class_getVersion = apiGetFunctionAddress(OBJC, "class_getVersion"), + class_setVersion = apiGetFunctionAddress(OBJC, "class_setVersion"), + class_getInstanceSize = apiGetFunctionAddress(OBJC, "class_getInstanceSize"), + class_getInstanceVariable = apiGetFunctionAddress(OBJC, "class_getInstanceVariable"), + class_getClassVariable = apiGetFunctionAddress(OBJC, "class_getClassVariable"), + class_copyIvarList = apiGetFunctionAddress(OBJC, "class_copyIvarList"), + class_getInstanceMethod = apiGetFunctionAddress(OBJC, "class_getInstanceMethod"), + class_getClassMethod = apiGetFunctionAddress(OBJC, "class_getClassMethod"), + class_getMethodImplementation = apiGetFunctionAddress(OBJC, "class_getMethodImplementation"), + class_respondsToSelector = apiGetFunctionAddress(OBJC, "class_respondsToSelector"), + class_copyMethodList = apiGetFunctionAddress(OBJC, "class_copyMethodList"), + class_conformsToProtocol = apiGetFunctionAddress(OBJC, "class_conformsToProtocol"), + class_copyProtocolList = apiGetFunctionAddress(OBJC, "class_copyProtocolList"), + class_getProperty = apiGetFunctionAddress(OBJC, "class_getProperty"), + class_copyPropertyList = apiGetFunctionAddress(OBJC, "class_copyPropertyList"), + class_getIvarLayout = apiGetFunctionAddress(OBJC, "class_getIvarLayout"), + class_getWeakIvarLayout = apiGetFunctionAddress(OBJC, "class_getWeakIvarLayout"), + class_addMethod = apiGetFunctionAddress(OBJC, "class_addMethod"), + class_replaceMethod = apiGetFunctionAddress(OBJC, "class_replaceMethod"), + class_addIvar = apiGetFunctionAddress(OBJC, "class_addIvar"), + class_addProtocol = apiGetFunctionAddress(OBJC, "class_addProtocol"), + class_addProperty = apiGetFunctionAddress(OBJC, "class_addProperty"), + class_replaceProperty = apiGetFunctionAddress(OBJC, "class_replaceProperty"), + class_setIvarLayout = apiGetFunctionAddress(OBJC, "class_setIvarLayout"), + class_setWeakIvarLayout = apiGetFunctionAddress(OBJC, "class_setWeakIvarLayout"), + class_createInstance = apiGetFunctionAddress(OBJC, "class_createInstance"), + objc_constructInstance = apiGetFunctionAddress(OBJC, "objc_constructInstance"), + objc_destructInstance = apiGetFunctionAddress(OBJC, "objc_destructInstance"), + objc_allocateClassPair = apiGetFunctionAddress(OBJC, "objc_allocateClassPair"), + objc_registerClassPair = apiGetFunctionAddress(OBJC, "objc_registerClassPair"), + objc_disposeClassPair = apiGetFunctionAddress(OBJC, "objc_disposeClassPair"), + method_getName = apiGetFunctionAddress(OBJC, "method_getName"), + method_getImplementation = apiGetFunctionAddress(OBJC, "method_getImplementation"), + method_getTypeEncoding = apiGetFunctionAddress(OBJC, "method_getTypeEncoding"), + method_getNumberOfArguments = apiGetFunctionAddress(OBJC, "method_getNumberOfArguments"), + method_copyReturnType = apiGetFunctionAddress(OBJC, "method_copyReturnType"), + method_copyArgumentType = apiGetFunctionAddress(OBJC, "method_copyArgumentType"), + method_getReturnType = apiGetFunctionAddress(OBJC, "method_getReturnType"), + method_getArgumentType = apiGetFunctionAddress(OBJC, "method_getArgumentType"), + method_setImplementation = apiGetFunctionAddress(OBJC, "method_setImplementation"), + method_exchangeImplementations = apiGetFunctionAddress(OBJC, "method_exchangeImplementations"), + ivar_getName = apiGetFunctionAddress(OBJC, "ivar_getName"), + ivar_getTypeEncoding = apiGetFunctionAddress(OBJC, "ivar_getTypeEncoding"), + ivar_getOffset = apiGetFunctionAddress(OBJC, "ivar_getOffset"), + property_getName = apiGetFunctionAddress(OBJC, "property_getName"), + property_getAttributes = apiGetFunctionAddress(OBJC, "property_getAttributes"), + property_copyAttributeList = apiGetFunctionAddress(OBJC, "property_copyAttributeList"), + property_copyAttributeValue = apiGetFunctionAddress(OBJC, "property_copyAttributeValue"), + objc_getProtocol = apiGetFunctionAddress(OBJC, "objc_getProtocol"), + objc_copyProtocolList = apiGetFunctionAddress(OBJC, "objc_copyProtocolList"), + protocol_conformsToProtocol = apiGetFunctionAddress(OBJC, "protocol_conformsToProtocol"), + protocol_isEqual = apiGetFunctionAddress(OBJC, "protocol_isEqual"), + protocol_getName = apiGetFunctionAddress(OBJC, "protocol_getName"), + protocol_getMethodDescription = apiGetFunctionAddress(OBJC, "protocol_getMethodDescription"), + protocol_copyMethodDescriptionList = apiGetFunctionAddress(OBJC, "protocol_copyMethodDescriptionList"), + protocol_getProperty = apiGetFunctionAddress(OBJC, "protocol_getProperty"), + protocol_copyPropertyList = apiGetFunctionAddress(OBJC, "protocol_copyPropertyList"), + protocol_copyProtocolList = apiGetFunctionAddress(OBJC, "protocol_copyProtocolList"), + objc_allocateProtocol = apiGetFunctionAddress(OBJC, "objc_allocateProtocol"), + objc_registerProtocol = apiGetFunctionAddress(OBJC, "objc_registerProtocol"), + protocol_addMethodDescription = apiGetFunctionAddress(OBJC, "protocol_addMethodDescription"), + protocol_addProtocol = apiGetFunctionAddress(OBJC, "protocol_addProtocol"), + protocol_addProperty = apiGetFunctionAddress(OBJC, "protocol_addProperty"), + objc_copyImageNames = apiGetFunctionAddress(OBJC, "objc_copyImageNames"), + class_getImageName = apiGetFunctionAddress(OBJC, "class_getImageName"), + objc_copyClassNamesForImage = apiGetFunctionAddress(OBJC, "objc_copyClassNamesForImage"), + sel_getName = apiGetFunctionAddress(OBJC, "sel_getName"), + sel_getUid = apiGetFunctionAddress(OBJC, "sel_getUid"), + sel_registerName = apiGetFunctionAddress(OBJC, "sel_registerName"), + sel_isEqual = apiGetFunctionAddress(OBJC, "sel_isEqual"), + objc_enumerationMutation = apiGetFunctionAddress(OBJC, "objc_enumerationMutation"), + objc_setEnumerationMutationHandler = apiGetFunctionAddress(OBJC, "objc_setEnumerationMutationHandler"), + imp_implementationWithBlock = apiGetFunctionAddress(OBJC, "imp_implementationWithBlock"), + imp_getBlock = apiGetFunctionAddress(OBJC, "imp_getBlock"), + imp_removeBlock = apiGetFunctionAddress(OBJC, "imp_removeBlock"), + objc_loadWeak = apiGetFunctionAddress(OBJC, "objc_loadWeak"), + objc_storeWeak = apiGetFunctionAddress(OBJC, "objc_storeWeak"), + objc_setAssociatedObject = apiGetFunctionAddress(OBJC, "objc_setAssociatedObject"), + objc_getAssociatedObject = apiGetFunctionAddress(OBJC, "objc_getAssociatedObject"), + objc_removeAssociatedObjects = apiGetFunctionAddress(OBJC, "objc_removeAssociatedObjects"); + + } + + /** Returns the objc {@link SharedLibrary}. */ + public static SharedLibrary getLibrary() { + return OBJC; + } + + /** Nil value. */ + public static final long nil = 0x0L; + + /** Boolean values. */ + public static final byte + YES = 1, + NO = 0; + + /** Types. */ + public static final char + _C_ID = '@', + _C_CLASS = '#', + _C_SEL = ':', + _C_CHR = 'c', + _C_UCHR = 'C', + _C_SHT = 's', + _C_USHT = 'S', + _C_INT = 'i', + _C_UINT = 'I', + _C_LNG = 'l', + _C_ULNG = 'L', + _C_LNG_LNG = 'q', + _C_ULNG_LNG = 'Q', + _C_FLT = 'f', + _C_DBL = 'd', + _C_BFLD = 'b', + _C_BOOL = 'B', + _C_VOID = 'v', + _C_UNDEF = '?', + _C_PTR = '^', + _C_CHARPTR = '*', + _C_ATOM = '%', + _C_ARY_B = '[', + _C_ARY_E = ']', + _C_UNION_B = '(', + _C_UNION_E = ')', + _C_STRUCT_B = '{', + _C_STRUCT_E = '}', + _C_VECTOR = '!', + _C_CONST = 'r'; + + /** Policies related to associative references. */ + public static final int + OBJC_ASSOCIATION_ASSIGN = 0, + OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, + OBJC_ASSOCIATION_COPY_NONATOMIC = 3, + OBJC_ASSOCIATION_RETAIN = 1401, + OBJC_ASSOCIATION_COPY = 1403; + + protected ObjCRuntime() { + throw new UnsupportedOperationException(); + } + + // --- [ object_copy ] --- + + /** + * Returns a copy of a given object. + * + * @param obj an Objective-C object + * @param size the size of the object {@code obj} + * + * @return a copy of obj + */ + @NativeType("id") + public static long object_copy(@NativeType("id") long obj, @NativeType("size_t") long size) { + long __functionAddress = Functions.object_copy; + if (CHECKS) { + check(obj); + } + return invokePPP(obj, size, __functionAddress); + } + + // --- [ object_dispose ] --- + + /** + * Frees the memory occupied by a given object. + * + * @param obj an Objective-C object + * + * @return {@link #nil} + */ + @NativeType("id") + public static long object_dispose(@NativeType("id") long obj) { + long __functionAddress = Functions.object_dispose; + if (CHECKS) { + check(obj); + } + return invokePP(obj, __functionAddress); + } + + // --- [ object_getClass ] --- + + /** + * Returns the class of an object. + * + * @param obj an Objective-C object + * + * @return the class object of which object is an instance, or Nil if {@code obj} is {@link #nil} + */ + @NativeType("Class") + public static long object_getClass(@NativeType("id") long obj) { + long __functionAddress = Functions.object_getClass; + return invokePP(obj, __functionAddress); + } + + // --- [ object_setClass ] --- + + /** + * Sets the class of an object. + * + * @param obj the object to modify + * @param cls a class object + * + * @return the previous value of object's class, or Nil if {@code obj} is {@link #nil} + */ + @NativeType("Class") + public static long object_setClass(@NativeType("id") long obj, @NativeType("Class") long cls) { + long __functionAddress = Functions.object_setClass; + if (CHECKS) { + check(cls); + } + return invokePPP(obj, cls, __functionAddress); + } + + // --- [ object_getClassName ] --- + + /** Unsafe version of: {@link #object_getClassName} */ + public static long nobject_getClassName(long obj) { + long __functionAddress = Functions.object_getClassName; + return invokePP(obj, __functionAddress); + } + + /** + * Returns the class name of a given object. + * + * @param obj an Objective-C object + * + * @return the name of the class of which {@code obj} is an instance + */ + @Nullable + @NativeType("char const *") + public static String object_getClassName(@NativeType("id") long obj) { + long __result = nobject_getClassName(obj); + return memUTF8Safe(__result); + } + + // --- [ object_getIndexedIvars ] --- + + /** + * This function returns a pointer to any extra bytes allocated with the instance (as specified by {@link #class_createInstance} with extraBytes>0). This + * memory follows the object's ordinary ivars, but may not be adjacent to the last ivar. + * + *

    The returned pointer is guaranteed to be pointer-size aligned, even if the area following the object's last ivar is less aligned than that. Alignment + * greater than pointer-size is never guaranteed, even if the area following the object's last ivar is more aligned than that.

    + * + *

    In a garbage-collected environment, the memory is scanned conservatively.

    + * + * @param obj an Objective-C object + * + * @return a pointer to any extra bytes allocated with {@code obj}. If {@code obj} was not allocated with any extra bytes, then dereferencing the returned pointer + * is undefined. + */ + @NativeType("void *") + public static long object_getIndexedIvars(@NativeType("id") long obj) { + long __functionAddress = Functions.object_getIndexedIvars; + if (CHECKS) { + check(obj); + } + return invokePP(obj, __functionAddress); + } + + // --- [ object_getIvar ] --- + + /** + * Reads the value of an instance variable in an object. + * + * @param obj the object containing the instance variable whose value you want to read + * @param ivar the Ivar describing the instance variable whose value you want to read + * + * @return the value of the instance variable specified by {@code ivar}, or {@link #nil} if {@code obj} is {@link #nil} + */ + @NativeType("id") + public static long object_getIvar(@NativeType("id") long obj, @NativeType("Ivar") long ivar) { + long __functionAddress = Functions.object_getIvar; + if (CHECKS) { + check(ivar); + } + return invokePPP(obj, ivar, __functionAddress); + } + + // --- [ object_setIvar ] --- + + /** + * Sets the value of an instance variable in an object. + * + *

    object_setIvar is faster than {@link #object_setInstanceVariable} if the Ivar for the instance variable is already known.

    + * + * @param obj the object containing the instance variable whose value you want to set + * @param ivar the Ivar describing the instance variable whose value you want to set + * @param value the new value for the instance variable + */ + public static void object_setIvar(@NativeType("id") long obj, @NativeType("Ivar") long ivar, @NativeType("id") long value) { + long __functionAddress = Functions.object_setIvar; + if (CHECKS) { + check(obj); + check(ivar); + check(value); + } + invokePPPV(obj, ivar, value, __functionAddress); + } + + // --- [ object_setInstanceVariable ] --- + + /** Unsafe version of: {@link #object_setInstanceVariable} */ + public static long nobject_setInstanceVariable(long obj, long name, long value) { + long __functionAddress = Functions.object_setInstanceVariable; + if (CHECKS) { + check(obj); + } + return invokePPPP(obj, name, value, __functionAddress); + } + + /** + * Changes the value of an instance variable of a class instance. + * + * @param obj a pointer to an instance of a class. Pass the object containing the instance variable whose value you wish to modify + * @param name a C string. Pass the name of the instance variable whose value you wish to modify + * @param value the new value for the instance variable + * + * @return a pointer to the Ivar data structure that defines the type and name of the instance variable specified by name + */ + @NativeType("Ivar") + public static long object_setInstanceVariable(@NativeType("id") long obj, @NativeType("char const *") ByteBuffer name, @NativeType("void *") ByteBuffer value) { + if (CHECKS) { + checkNT1(name); + } + return nobject_setInstanceVariable(obj, memAddress(name), memAddress(value)); + } + + /** + * Changes the value of an instance variable of a class instance. + * + * @param obj a pointer to an instance of a class. Pass the object containing the instance variable whose value you wish to modify + * @param name a C string. Pass the name of the instance variable whose value you wish to modify + * @param value the new value for the instance variable + * + * @return a pointer to the Ivar data structure that defines the type and name of the instance variable specified by name + */ + @NativeType("Ivar") + public static long object_setInstanceVariable(@NativeType("id") long obj, @NativeType("char const *") CharSequence name, @NativeType("void *") ByteBuffer value) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nobject_setInstanceVariable(obj, nameEncoded, memAddress(value)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ object_getInstanceVariable ] --- + + /** Unsafe version of: {@link #object_getInstanceVariable} */ + public static long nobject_getInstanceVariable(long obj, long name, long outValue) { + long __functionAddress = Functions.object_getInstanceVariable; + if (CHECKS) { + check(obj); + } + return invokePPPP(obj, name, outValue, __functionAddress); + } + + /** + * Obtains the value of an instance variable of a class instance. + * + * @param obj a pointer to an instance of a class. Pass the object containing the instance variable whose value you wish to obtain + * @param name a C string. Pass the name of the instance variable whose value you wish to obtain + * @param outValue on return, contains a pointer to the value of the instance variable + * + * @return a pointer to the Ivar data structure that defines the type and name of the instance variable specified by name + */ + @NativeType("Ivar") + public static long object_getInstanceVariable(@NativeType("id") long obj, @NativeType("char const *") ByteBuffer name, @NativeType("void **") PointerBuffer outValue) { + if (CHECKS) { + checkNT1(name); + check(outValue, 1); + } + return nobject_getInstanceVariable(obj, memAddress(name), memAddress(outValue)); + } + + /** + * Obtains the value of an instance variable of a class instance. + * + * @param obj a pointer to an instance of a class. Pass the object containing the instance variable whose value you wish to obtain + * @param name a C string. Pass the name of the instance variable whose value you wish to obtain + * @param outValue on return, contains a pointer to the value of the instance variable + * + * @return a pointer to the Ivar data structure that defines the type and name of the instance variable specified by name + */ + @NativeType("Ivar") + public static long object_getInstanceVariable(@NativeType("id") long obj, @NativeType("char const *") CharSequence name, @NativeType("void **") PointerBuffer outValue) { + if (CHECKS) { + check(outValue, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nobject_getInstanceVariable(obj, nameEncoded, memAddress(outValue)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ objc_getClass ] --- + + /** Unsafe version of: {@link #objc_getClass} */ + public static long nobjc_getClass(long name) { + long __functionAddress = Functions.objc_getClass; + return invokePP(name, __functionAddress); + } + + /** + * Returns the class definition of a specified class. + * + *

    objc_getClass is different from {@link #objc_lookUpClass} in that if the class is not registered, objc_getClass calls the class handler callback and then + * checks a second time to see whether the class is registered. objc_lookUpClass does not call the class handler callback.

    + * + * @param name the name of the class to look up + * + * @return the Class object for the named class, or {@link #nil} if the class is not registered with the Objective-C runtime + */ + @NativeType("Class") + public static long objc_getClass(@NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nobjc_getClass(memAddress(name)); + } + + /** + * Returns the class definition of a specified class. + * + *

    objc_getClass is different from {@link #objc_lookUpClass} in that if the class is not registered, objc_getClass calls the class handler callback and then + * checks a second time to see whether the class is registered. objc_lookUpClass does not call the class handler callback.

    + * + * @param name the name of the class to look up + * + * @return the Class object for the named class, or {@link #nil} if the class is not registered with the Objective-C runtime + */ + @NativeType("Class") + public static long objc_getClass(@NativeType("char const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nobjc_getClass(nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ objc_getMetaClass ] --- + + /** Unsafe version of: {@link #objc_getMetaClass} */ + public static long nobjc_getMetaClass(long name) { + long __functionAddress = Functions.objc_getMetaClass; + return invokePP(name, __functionAddress); + } + + /** + * Returns the metaclass definition of a specified class. + * + *

    If the definition for the named class is not registered, this function calls the class handler callback and then checks a second time to see if the + * class is registered. However, every class definition must have a valid metaclass definition, and so the metaclass definition is always returned, + * whether it’s valid or not.

    + * + * @param name the name of the class to look up + * + * @return the Class object for the metaclass of the named class, or {@link #nil} if the class is not registered with the Objective-C runtime + */ + @NativeType("Class") + public static long objc_getMetaClass(@NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nobjc_getMetaClass(memAddress(name)); + } + + /** + * Returns the metaclass definition of a specified class. + * + *

    If the definition for the named class is not registered, this function calls the class handler callback and then checks a second time to see if the + * class is registered. However, every class definition must have a valid metaclass definition, and so the metaclass definition is always returned, + * whether it’s valid or not.

    + * + * @param name the name of the class to look up + * + * @return the Class object for the metaclass of the named class, or {@link #nil} if the class is not registered with the Objective-C runtime + */ + @NativeType("Class") + public static long objc_getMetaClass(@NativeType("char const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nobjc_getMetaClass(nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ objc_lookUpClass ] --- + + /** Unsafe version of: {@link #objc_lookUpClass} */ + public static long nobjc_lookUpClass(long name) { + long __functionAddress = Functions.objc_lookUpClass; + return invokePP(name, __functionAddress); + } + + /** + * Returns the class definition of a specified class. + * + *

    {@link #objc_getClass} is different from this function in that if the class is not registered, objc_getClass calls the class handler callback and then checks + * a second time to see whether the class is registered. This function does not call the class handler callback.

    + * + * @param name the name of the class to look up + * + * @return the Class object for the named class, or {@link #nil} if the class is not registered with the Objective-C runtime + */ + @NativeType("Class") + public static long objc_lookUpClass(@NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nobjc_lookUpClass(memAddress(name)); + } + + /** + * Returns the class definition of a specified class. + * + *

    {@link #objc_getClass} is different from this function in that if the class is not registered, objc_getClass calls the class handler callback and then checks + * a second time to see whether the class is registered. This function does not call the class handler callback.

    + * + * @param name the name of the class to look up + * + * @return the Class object for the named class, or {@link #nil} if the class is not registered with the Objective-C runtime + */ + @NativeType("Class") + public static long objc_lookUpClass(@NativeType("char const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nobjc_lookUpClass(nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ objc_getRequiredClass ] --- + + /** Unsafe version of: {@link #objc_getRequiredClass} */ + public static long nobjc_getRequiredClass(long name) { + long __functionAddress = Functions.objc_getRequiredClass; + return invokePP(name, __functionAddress); + } + + /** + * Returns the class definition of a specified class. + * + *

    This function is the same as {@link #objc_getClass}, but kills the process if the class is not found.

    + * + *

    This function is used by ZeroLink, where failing to find a class would be a compile-time link error without ZeroLink.

    + * + * @param name the name of the class to look up + * + * @return the Class object for the named class + */ + @NativeType("Class") + public static long objc_getRequiredClass(@NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nobjc_getRequiredClass(memAddress(name)); + } + + /** + * Returns the class definition of a specified class. + * + *

    This function is the same as {@link #objc_getClass}, but kills the process if the class is not found.

    + * + *

    This function is used by ZeroLink, where failing to find a class would be a compile-time link error without ZeroLink.

    + * + * @param name the name of the class to look up + * + * @return the Class object for the named class + */ + @NativeType("Class") + public static long objc_getRequiredClass(@NativeType("char const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nobjc_getRequiredClass(nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ objc_getClassList ] --- + + /** + * Unsafe version of: {@link #objc_getClassList} + * + * @param bufferCount the number of pointers for which you have allocated space in buffer. On return, this function fills in only this number of elements. If this number + * is less than the number of registered classes, this function returns an arbitrary subset of the registered classes. + */ + public static int nobjc_getClassList(long buffer, int bufferCount) { + long __functionAddress = Functions.objc_getClassList; + return invokePI(buffer, bufferCount, __functionAddress); + } + + /** + * Obtains the list of registered class definitions. + * + *

    The Objective-C runtime library automatically registers all the classes defined in your source code. You can create class definitions at runtime and + * register them with the {@link #objc_allocateClassPair} and {@link #objc_registerClassPair} functions.

    + * + *
    Special Considerations
    + * + *

    You cannot assume that class objects you get from this function are classes that inherit from NSObject, so you cannot safely call any methods on such + * classes without detecting that the method is implemented first.

    + * + * @param buffer an array of Class values. On output, each Class value points to one class definition, up to either {@code bufferCount} or the total number of + * registered classes, whichever is less. You can pass {@code NULL} to obtain the total number of registered class definitions without actually retrieving + * any class definitions. + * + * @return an integer value indicating the total number of registered classes + */ + public static int objc_getClassList(@Nullable @NativeType("Class *") PointerBuffer buffer) { + return nobjc_getClassList(memAddressSafe(buffer), remainingSafe(buffer)); + } + + // --- [ objc_copyClassList ] --- + + /** + * Unsafe version of: {@link #objc_copyClassList} + * + * @param outCount an integer pointer used to store the number of classes returned by this function in the list. This parameter may be {@link #nil} + */ + public static long nobjc_copyClassList(long outCount) { + long __functionAddress = Functions.objc_copyClassList; + return invokePP(outCount, __functionAddress); + } + + /** + * Creates and returns a list of pointers to all registered class definitions. + * + * @return a {@link #nil} terminated array of classes. You must free the array with free() + */ + @Nullable + @NativeType("Class *") + public static PointerBuffer objc_copyClassList() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nobjc_copyClassList(memAddress(outCount)); + return memPointerBufferSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_getName ] --- + + /** Unsafe version of: {@link #class_getName} */ + public static long nclass_getName(long cls) { + long __functionAddress = Functions.class_getName; + return invokePP(cls, __functionAddress); + } + + /** + * Returns the name of a class. + * + * @param cls a class object + * + * @return the name of the class, or the empty string if cls is Nil + */ + @Nullable + @NativeType("char const *") + public static String class_getName(@NativeType("Class") long cls) { + long __result = nclass_getName(cls); + return memUTF8Safe(__result); + } + + // --- [ class_isMetaClass ] --- + + /** + * Returns a Boolean value that indicates whether a class object is a metaclass. + * + * @param cls a class object + * + * @return {@link #YES} if cls is a metaclass, {@link #NO} if cls is a non-meta class, {@link #NO} if cls is Nil + */ + @NativeType("BOOL") + public static boolean class_isMetaClass(@NativeType("Class") long cls) { + long __functionAddress = Functions.class_isMetaClass; + return invokePZ(cls, __functionAddress); + } + + // --- [ class_getSuperclass ] --- + + /** + * Returns the superclass of a class. + * + * @param cls a class object + * + * @return the superclass of the class, or Nil if cls is a root class, or Nil if cls is Nil + */ + @NativeType("Class") + public static long class_getSuperclass(@NativeType("Class") long cls) { + long __functionAddress = Functions.class_getSuperclass; + return invokePP(cls, __functionAddress); + } + + // --- [ class_getVersion ] --- + + /** + * Returns the version number of a class definition. + * + *

    You can use the version number of the class definition to provide versioning of the interface that your class represents to other classes. This is + * especially useful for object serialization (that is, archiving of the object in a flattened form), where it is important to recognize changes to the + * layout of the instance variables in different class-definition versions.

    + * + *

    Classes derived from the Foundation framework NSObject class can obtain the class-definition version number using the getVersion class method, which is + * implemented using the class_getVersion function.

    + * + * @param cls a pointer to an Class data structure. Pass the class definition for which you wish to obtain the version + * + * @return an integer indicating the version number of the class definition + */ + public static int class_getVersion(@NativeType("Class") long cls) { + long __functionAddress = Functions.class_getVersion; + if (CHECKS) { + check(cls); + } + return invokePI(cls, __functionAddress); + } + + // --- [ class_setVersion ] --- + + /** + * Sets the version number of a class definition. + * + *

    You can use the version number of the class definition to provide versioning of the interface that your class represents to other classes. This is + * especially useful for object serialization (that is, archiving of the object in a flattened form), where it is important to recognize changes to the + * layout of the instance variables in different class-definition versions.

    + * + *

    Classes derived from the Foundation framework NSObject class can set the class-definition version number using the setVersion: class method, which is + * implemented using the class_setVersion function.

    + * + * @param cls a pointer to an Class data structure. Pass the class definition for which you wish to set the version + * @param version the new version number of the class definition + */ + public static void class_setVersion(@NativeType("Class") long cls, int version) { + long __functionAddress = Functions.class_setVersion; + if (CHECKS) { + check(cls); + } + invokePV(cls, version, __functionAddress); + } + + // --- [ class_getInstanceSize ] --- + + /** + * Returns the size of instances of a class. + * + * @param cls a class object + * + * @return the size in bytes of instances of the class {@code cls}, or 0 if {@code cls} is Nil + */ + @NativeType("size_t") + public static long class_getInstanceSize(@NativeType("Class") long cls) { + long __functionAddress = Functions.class_getInstanceSize; + return invokePP(cls, __functionAddress); + } + + // --- [ class_getInstanceVariable ] --- + + /** Unsafe version of: {@link #class_getInstanceVariable} */ + public static long nclass_getInstanceVariable(long cls, long name) { + long __functionAddress = Functions.class_getInstanceVariable; + if (CHECKS) { + check(cls); + } + return invokePPP(cls, name, __functionAddress); + } + + /** + * Returns the Ivar for a specified instance variable of a given class. + * + * @param cls the class whose instance variable you wish to obtain + * @param name the name of the instance variable definition to obtain + * + * @return a pointer to an Ivar data structure containing information about the instance variable specified by name + */ + @NativeType("Ivar") + public static long class_getInstanceVariable(@NativeType("Class") long cls, @NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nclass_getInstanceVariable(cls, memAddress(name)); + } + + /** + * Returns the Ivar for a specified instance variable of a given class. + * + * @param cls the class whose instance variable you wish to obtain + * @param name the name of the instance variable definition to obtain + * + * @return a pointer to an Ivar data structure containing information about the instance variable specified by name + */ + @NativeType("Ivar") + public static long class_getInstanceVariable(@NativeType("Class") long cls, @NativeType("char const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nclass_getInstanceVariable(cls, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_getClassVariable ] --- + + /** Unsafe version of: {@link #class_getClassVariable} */ + public static long nclass_getClassVariable(long cls, long name) { + long __functionAddress = Functions.class_getClassVariable; + if (CHECKS) { + check(cls); + } + return invokePPP(cls, name, __functionAddress); + } + + /** + * Returns the Ivar for a specified class variable of a given class. + * + * @param cls the class definition whose class variable you wish to obtain + * @param name the name of the class variable definition to obtain + * + * @return a pointer to an Ivar data structure containing information about the class variable specified by name + */ + @NativeType("Ivar") + public static long class_getClassVariable(@NativeType("Class") long cls, @NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nclass_getClassVariable(cls, memAddress(name)); + } + + /** + * Returns the Ivar for a specified class variable of a given class. + * + * @param cls the class definition whose class variable you wish to obtain + * @param name the name of the class variable definition to obtain + * + * @return a pointer to an Ivar data structure containing information about the class variable specified by name + */ + @NativeType("Ivar") + public static long class_getClassVariable(@NativeType("Class") long cls, @NativeType("char const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nclass_getClassVariable(cls, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_copyIvarList ] --- + + /** + * Unsafe version of: {@link #class_copyIvarList} + * + * @param outCount on return, contains the length of the returned array. If {@code outCount} is {@code NULL}, the length is not returned + */ + public static long nclass_copyIvarList(long cls, long outCount) { + long __functionAddress = Functions.class_copyIvarList; + return invokePPP(cls, outCount, __functionAddress); + } + + /** + * Describes the instance variables declared by a class. + * + * @param cls the class to inspect + * + * @return an array of pointers of type Ivar describing the instance variables declared by the class. Any instance variables declared by superclasses are not + * included. The array contains {@code *outCount} pointers followed by a {@code NULL} terminator. You must free the array with free(). + * + *

    If the class declares no instance variables, or {@code cls} is Nil, {@code NULL} is returned and {@code *outCount} is 0.

    + */ + @Nullable + @NativeType("Ivar *") + public static PointerBuffer class_copyIvarList(@NativeType("Class") long cls) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nclass_copyIvarList(cls, memAddress(outCount)); + return memPointerBufferSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_getInstanceMethod ] --- + + /** + * Returns a specified instance method for a given class. + * + *

    Note that this function searches superclasses for implementations, whereas {@link #class_copyMethodList} does not.

    + * + * @param cls the class you want to inspect + * @param name the selector of the method you want to retrieve + * + * @return the method that corresponds to the implementation of the selector specified by aSelector for the class specified by {@code cls}, or {@code NULL} if the + * specified class or its superclasses do not contain an instance method with the specified selector. + */ + @NativeType("Method") + public static long class_getInstanceMethod(@NativeType("Class") long cls, @NativeType("SEL") long name) { + long __functionAddress = Functions.class_getInstanceMethod; + if (CHECKS) { + check(cls); + check(name); + } + return invokePPP(cls, name, __functionAddress); + } + + // --- [ class_getClassMethod ] --- + + /** + * Returns a pointer to the data structure describing a given class method for a given class. + * + *

    Note that this function searches superclasses for implementations, whereas {@link #class_copyMethodList} does not.

    + * + * @param cls a pointer to a class definition. Pass the class that contains the method you want to retrieve + * @param name a pointer of type SEL. Pass the selector of the method you want to retrieve + * + * @return a pointer to the Method data structure that corresponds to the implementation of the selector specified by {@code name} for the class specified by + * {@code cls}, or {@code NULL} if the specified class or its superclasses do not contain a class method with the specified selector. + */ + @NativeType("Method") + public static long class_getClassMethod(@NativeType("Class") long cls, @NativeType("SEL") long name) { + long __functionAddress = Functions.class_getClassMethod; + if (CHECKS) { + check(cls); + check(name); + } + return invokePPP(cls, name, __functionAddress); + } + + // --- [ class_getMethodImplementation ] --- + + /** + * Returns the function pointer that would be called if a particular message were sent to an instance of a class. + * + *

    class_getMethodImplementation may be faster than {@code method_getImplementation(class_getInstanceMethod(cls, name))}.

    + * + *

    The function pointer returned may be a function internal to the runtime instead of an actual method implementation. For example, if instances of the + * class do not respond to the selector, the function pointer returned will be part of the runtime's message forwarding machinery.

    + * + * @param cls the class you want to inspect + * @param name a selector + * + * @return the function pointer that would be called if {@code [object name]} were called with an instance of the class, or {@code NULL} if {@code cls} is Nil + */ + @NativeType("IMP") + public static long class_getMethodImplementation(@NativeType("Class") long cls, @NativeType("SEL") long name) { + long __functionAddress = Functions.class_getMethodImplementation; + if (CHECKS) { + check(name); + } + return invokePPP(cls, name, __functionAddress); + } + + // --- [ class_respondsToSelector ] --- + + /** + * Returns a Boolean value that indicates whether instances of a class respond to a particular selector. + * + *

    You should usually use NSObject's respondsToSelector: or instancesRespondToSelector: methods instead of this function.

    + * + * @param cls the class you want to inspect + * @param name a selector + * + * @return {@link #YES} if instances of the class respond to the selector, otherwise {@link #NO} + */ + @NativeType("BOOL") + public static boolean class_respondsToSelector(@NativeType("Class") long cls, @NativeType("SEL") long name) { + long __functionAddress = Functions.class_respondsToSelector; + if (CHECKS) { + check(cls); + check(name); + } + return invokePPZ(cls, name, __functionAddress); + } + + // --- [ class_copyMethodList ] --- + + /** + * Unsafe version of: {@link #class_copyMethodList} + * + * @param outCount on return, contains the length of the returned array. If {@code outCount} is {@code NULL}, the length is not returned + */ + public static long nclass_copyMethodList(long cls, long outCount) { + long __functionAddress = Functions.class_copyMethodList; + return invokePPP(cls, outCount, __functionAddress); + } + + /** + * Describes the instance methods implemented by a class. + * + * @param cls the class you want to inspect + * + * @return an array of pointers of type Method describing the instance methods implemented by the class—any instance methods implemented by superclasses are not + * included. The array contains {@code *outCount} pointers followed by a {@code NULL} terminator. You must free the array with free(). + * + *

    If {@code cls} implements no instance methods, or {@code cls} is Nil, returns {@code NULL} and {@code *outCount} is 0.

    + */ + @Nullable + @NativeType("Method *") + public static PointerBuffer class_copyMethodList(@NativeType("Class") long cls) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nclass_copyMethodList(cls, memAddress(outCount)); + return memPointerBufferSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_conformsToProtocol ] --- + + /** + * Returns a Boolean value that indicates whether a class conforms to a given protocol. + * + *

    You should usually use NSObject's conformsToProtocol: method instead of this function.

    + * + * @param cls the class you want to inspect + * @param protocol a protocol + * + * @return {@link #YES} if {@code cls} conforms to {@code protocol}, otherwise {@link #NO} + */ + @NativeType("BOOL") + public static boolean class_conformsToProtocol(@NativeType("Class") long cls, @NativeType("Protocol *") long protocol) { + long __functionAddress = Functions.class_conformsToProtocol; + if (CHECKS) { + check(cls); + check(protocol); + } + return invokePPZ(cls, protocol, __functionAddress); + } + + // --- [ class_copyProtocolList ] --- + + /** + * Unsafe version of: {@link #class_copyProtocolList} + * + * @param outCount on return, contains the length of the returned array. If {@code outCount} is {@code NULL}, the length is not returned + */ + public static long nclass_copyProtocolList(long cls, long outCount) { + long __functionAddress = Functions.class_copyProtocolList; + return invokePPP(cls, outCount, __functionAddress); + } + + /** + * Describes the protocols adopted by a class. + * + * @param cls the class you want to inspect + * + * @return an array of pointers of type Protocol* describing the protocols adopted by the class. Any protocols adopted by superclasses or other protocols are not + * included. The array contains {@code *outCount} pointers followed by a {@code NULL} terminator. You must free the array with free(). + * + *

    If {@code cls} adopts no protocols, or {@code cls} is Nil, returns {@code NULL} and {@code *outCount} is 0.

    + */ + @Nullable + @NativeType("Protocol **") + public static PointerBuffer class_copyProtocolList(@NativeType("Class") long cls) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nclass_copyProtocolList(cls, memAddress(outCount)); + return memPointerBufferSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_getProperty ] --- + + /** Unsafe version of: {@link #class_getProperty} */ + public static long nclass_getProperty(long cls, long name) { + long __functionAddress = Functions.class_getProperty; + return invokePPP(cls, name, __functionAddress); + } + + /** + * Returns a property with a given name of a given class. + * + * @param cls the class you want to inspect + * @param name a C string. Pass the name of the instance variable whose value you wish to modify. + * + * @return a pointer of type {@code objc_property_t} describing the property, or {@code NULL} if the class does not declare a property with that name, or {@code NULL} if + * {@code cls} is Nil. + */ + @NativeType("objc_property_t") + public static long class_getProperty(@NativeType("Class") long cls, @NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nclass_getProperty(cls, memAddress(name)); + } + + /** + * Returns a property with a given name of a given class. + * + * @param cls the class you want to inspect + * @param name a C string. Pass the name of the instance variable whose value you wish to modify. + * + * @return a pointer of type {@code objc_property_t} describing the property, or {@code NULL} if the class does not declare a property with that name, or {@code NULL} if + * {@code cls} is Nil. + */ + @NativeType("objc_property_t") + public static long class_getProperty(@NativeType("Class") long cls, @NativeType("char const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nclass_getProperty(cls, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_copyPropertyList ] --- + + /** + * Unsafe version of: {@link #class_copyPropertyList} + * + * @param outCount on return, contains the length of the returned array. If {@code outCount} is {@code NULL}, the length is not returned + */ + public static long nclass_copyPropertyList(long cls, long outCount) { + long __functionAddress = Functions.class_copyPropertyList; + return invokePPP(cls, outCount, __functionAddress); + } + + /** + * Describes the properties declared by a class. + * + * @param cls the class you want to inspect + * + * @return an array of pointers of type {@code objc_property_t} describing the properties declared by the class. Any properties declared by superclasses are not + * included. The array contains {@code *outCount} pointers followed by a {@code NULL} terminator. You must free the array with free(). + * + *

    If {@code cls} declares no properties, or {@code cls} is Nil, returns {@code NULL} and {@code *outCount} is 0.

    + */ + @Nullable + @NativeType("objc_property_t *") + public static PointerBuffer class_copyPropertyList(@NativeType("Class") long cls) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nclass_copyPropertyList(cls, memAddress(outCount)); + return memPointerBufferSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_getIvarLayout ] --- + + /** Unsafe version of: {@link #class_getIvarLayout} */ + public static long nclass_getIvarLayout(long cls) { + long __functionAddress = Functions.class_getIvarLayout; + if (CHECKS) { + check(cls); + } + return invokePP(cls, __functionAddress); + } + + /** + * Returns a description of the Ivar layout for a given class. + * + * @param cls the class to inspect + * + * @return a description of the Ivar layout for {@code cls} + */ + @Nullable + @NativeType("uint8_t const *") + public static String class_getIvarLayout(@NativeType("Class") long cls) { + long __result = nclass_getIvarLayout(cls); + return memASCIISafe(__result); + } + + // --- [ class_getWeakIvarLayout ] --- + + /** Unsafe version of: {@link #class_getWeakIvarLayout} */ + public static long nclass_getWeakIvarLayout(long cls) { + long __functionAddress = Functions.class_getWeakIvarLayout; + if (CHECKS) { + check(cls); + } + return invokePP(cls, __functionAddress); + } + + /** + * Returns a description of the layout of weak Ivars for a given class. + * + * @param cls the class to inspect + * + * @return a description of the layout of the weak Ivars for {@code cls} + */ + @Nullable + @NativeType("uint8_t const *") + public static String class_getWeakIvarLayout(@NativeType("Class") long cls) { + long __result = nclass_getWeakIvarLayout(cls); + return memASCIISafe(__result); + } + + // --- [ class_addMethod ] --- + + /** Unsafe version of: {@link #class_addMethod} */ + public static boolean nclass_addMethod(long cls, long name, long imp, long types) { + long __functionAddress = Functions.class_addMethod; + if (CHECKS) { + check(cls); + check(name); + check(imp); + } + return invokePPPPZ(cls, name, imp, types, __functionAddress); + } + + /** + * Adds a new method to a class with a given name and implementation. + * + *
    Discussion
    + * + *

    class_addMethod will add an override of a superclass's implementation, but will not replace an existing implementation in this class. To change an + * existing implementation, use {@link #method_setImplementation}.

    + * + *

    An Objective-C method is simply a C function that takes at least two arguments – {@code self} and {@code _cmd}. For example, given the following + * function:

    + * + *
    
    +     * void myMethodIMP(id self, SEL _cmd)
    +     * {
    +     *     // implementation ....
    +     * }
    + * + *

    you can dynamically add it to a class as a method (called {@code resolveThisMethodDynamically}) like this:

    + * + *
    
    +     * class_addMethod([self class], @selector(resolveThisMethodDynamically), (IMP) myMethodIMP, "v@:");
    + * + * @param cls the class to which to add a method + * @param name a selector that specifies the name of the method being added + * @param imp a function which is the implementation of the new method. The function must take at least two arguments – {@code self} and {@code _cmd}. + * @param types an array of characters that describe the types of the arguments to the method. For possible values, see Objective-C Runtime Programming + * Guide > Type Encodings in Objective-C Runtime Programming Guide. Since the function must take at least two arguments – {@code self} + * and {@code _cmd}, the second and third characters must be “@:” (the first character is the return type). + * + * @return {@link #YES} if the method was added successfully, otherwise {@link #NO} (for example, the class already contains a method implementation with that name) + */ + @NativeType("BOOL") + public static boolean class_addMethod(@NativeType("Class") long cls, @NativeType("SEL") long name, @NativeType("IMP") long imp, @NativeType("char const *") ByteBuffer types) { + if (CHECKS) { + checkNT1(types); + } + return nclass_addMethod(cls, name, imp, memAddress(types)); + } + + /** + * Adds a new method to a class with a given name and implementation. + * + *
    Discussion
    + * + *

    class_addMethod will add an override of a superclass's implementation, but will not replace an existing implementation in this class. To change an + * existing implementation, use {@link #method_setImplementation}.

    + * + *

    An Objective-C method is simply a C function that takes at least two arguments – {@code self} and {@code _cmd}. For example, given the following + * function:

    + * + *
    
    +     * void myMethodIMP(id self, SEL _cmd)
    +     * {
    +     *     // implementation ....
    +     * }
    + * + *

    you can dynamically add it to a class as a method (called {@code resolveThisMethodDynamically}) like this:

    + * + *
    
    +     * class_addMethod([self class], @selector(resolveThisMethodDynamically), (IMP) myMethodIMP, "v@:");
    + * + * @param cls the class to which to add a method + * @param name a selector that specifies the name of the method being added + * @param imp a function which is the implementation of the new method. The function must take at least two arguments – {@code self} and {@code _cmd}. + * @param types an array of characters that describe the types of the arguments to the method. For possible values, see Objective-C Runtime Programming + * Guide > Type Encodings in Objective-C Runtime Programming Guide. Since the function must take at least two arguments – {@code self} + * and {@code _cmd}, the second and third characters must be “@:” (the first character is the return type). + * + * @return {@link #YES} if the method was added successfully, otherwise {@link #NO} (for example, the class already contains a method implementation with that name) + */ + @NativeType("BOOL") + public static boolean class_addMethod(@NativeType("Class") long cls, @NativeType("SEL") long name, @NativeType("IMP") long imp, @NativeType("char const *") CharSequence types) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(types, true); + long typesEncoded = stack.getPointerAddress(); + return nclass_addMethod(cls, name, imp, typesEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_replaceMethod ] --- + + /** Unsafe version of: {@link #class_replaceMethod} */ + public static long nclass_replaceMethod(long cls, long name, long imp, long types) { + long __functionAddress = Functions.class_replaceMethod; + if (CHECKS) { + check(cls); + check(name); + check(imp); + } + return invokePPPPP(cls, name, imp, types, __functionAddress); + } + + /** + * Replaces the implementation of a method for a given class. + * + *
    Discussion
    + * + *

    This function behaves in two different ways:

    + * + *
      + *
    • If the method identified by name does not yet exist, it is added as if class_addMethod were called. The type encoding specified by types is used as + * given.
    • + *
    • If the method identified by name does exist, its IMP is replaced as if method_setImplementation were called. The type encoding specified by types + * is ignored.
    • + *
    + * + * @param cls the class you want to modify + * @param name a selector that identifies the method whose implementation you want to replace + * @param imp the new implementation for the method identified by {@code name} for the class identified by {@code cls} + * @param types an array of characters that describe the types of the arguments to the method. For possible values, see Objective-C Runtime Programming + * Guide > Type Encodings in Objective-C Runtime Programming Guide. Since the function must take at least two arguments – {@code self} + * and {@code _cmd}, the second and third characters must be “@:” (the first character is the return type). + * + * @return the previous implementation of the method identified by {@code name} for the class identified by {@code cls} + */ + @NativeType("IMP") + public static long class_replaceMethod(@NativeType("Class") long cls, @NativeType("SEL") long name, @NativeType("IMP") long imp, @NativeType("char const *") ByteBuffer types) { + if (CHECKS) { + checkNT1(types); + } + return nclass_replaceMethod(cls, name, imp, memAddress(types)); + } + + /** + * Replaces the implementation of a method for a given class. + * + *
    Discussion
    + * + *

    This function behaves in two different ways:

    + * + *
      + *
    • If the method identified by name does not yet exist, it is added as if class_addMethod were called. The type encoding specified by types is used as + * given.
    • + *
    • If the method identified by name does exist, its IMP is replaced as if method_setImplementation were called. The type encoding specified by types + * is ignored.
    • + *
    + * + * @param cls the class you want to modify + * @param name a selector that identifies the method whose implementation you want to replace + * @param imp the new implementation for the method identified by {@code name} for the class identified by {@code cls} + * @param types an array of characters that describe the types of the arguments to the method. For possible values, see Objective-C Runtime Programming + * Guide > Type Encodings in Objective-C Runtime Programming Guide. Since the function must take at least two arguments – {@code self} + * and {@code _cmd}, the second and third characters must be “@:” (the first character is the return type). + * + * @return the previous implementation of the method identified by {@code name} for the class identified by {@code cls} + */ + @NativeType("IMP") + public static long class_replaceMethod(@NativeType("Class") long cls, @NativeType("SEL") long name, @NativeType("IMP") long imp, @NativeType("char const *") CharSequence types) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(types, true); + long typesEncoded = stack.getPointerAddress(); + return nclass_replaceMethod(cls, name, imp, typesEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_addIvar ] --- + + /** Unsafe version of: {@link #class_addIvar} */ + public static boolean nclass_addIvar(long cls, long name, long size, byte alignment, long types) { + long __functionAddress = Functions.class_addIvar; + if (CHECKS) { + check(cls); + } + return invokePPPUPZ(cls, name, size, alignment, types, __functionAddress); + } + + /** + * Adds a new instance variable to a class. + * + *

    This function may only be called after {@link #objc_allocateClassPair} and before {@link #objc_registerClassPair}. Adding an instance variable to an existing class + * is not supported.

    + * + *

    The class must not be a metaclass. Adding an instance variable to a metaclass is not supported.

    + * + *

    The instance variable's minimum alignment in bytes is {@code 1< + * + * @return {@link #YES} if the instance variable was added successfully, otherwise {@link #NO} (for example, the class already contains an instance variable with that name) + */ + @NativeType("BOOL") + public static boolean class_addIvar(@NativeType("Class") long cls, @NativeType("char const *") ByteBuffer name, @NativeType("size_t") long size, @NativeType("uint8_t") byte alignment, @NativeType("char const *") ByteBuffer types) { + if (CHECKS) { + checkNT1(name); + checkNT1(types); + } + return nclass_addIvar(cls, memAddress(name), size, alignment, memAddress(types)); + } + + /** + * Adds a new instance variable to a class. + * + *

    This function may only be called after {@link #objc_allocateClassPair} and before {@link #objc_registerClassPair}. Adding an instance variable to an existing class + * is not supported.

    + * + *

    The class must not be a metaclass. Adding an instance variable to a metaclass is not supported.

    + * + *

    The instance variable's minimum alignment in bytes is {@code 1< + * + * @return {@link #YES} if the instance variable was added successfully, otherwise {@link #NO} (for example, the class already contains an instance variable with that name) + */ + @NativeType("BOOL") + public static boolean class_addIvar(@NativeType("Class") long cls, @NativeType("char const *") CharSequence name, @NativeType("size_t") long size, @NativeType("uint8_t") byte alignment, @NativeType("char const *") CharSequence types) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + stack.nUTF8(types, true); + long typesEncoded = stack.getPointerAddress(); + return nclass_addIvar(cls, nameEncoded, size, alignment, typesEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_addProtocol ] --- + + /** + * Adds a protocol to a class. + * + * @param cls the class to modify + * @param protocol the protocol to add to {@code cls} + * + * @return {@link #YES} if the protocol was added successfully, otherwise {@link #NO} (for example, the class already conforms to that protocol) + */ + @NativeType("BOOL") + public static boolean class_addProtocol(@NativeType("Class") long cls, @NativeType("Protocol *") long protocol) { + long __functionAddress = Functions.class_addProtocol; + if (CHECKS) { + check(cls); + check(protocol); + } + return invokePPZ(cls, protocol, __functionAddress); + } + + // --- [ class_addProperty ] --- + + /** + * Unsafe version of: {@link #class_addProperty} + * + * @param attributeCount the number of attributes in {@code attributes} + */ + public static boolean nclass_addProperty(long cls, long name, long attributes, int attributeCount) { + long __functionAddress = Functions.class_addProperty; + if (CHECKS) { + check(cls); + Struct.validate(attributes, attributeCount, ObjCPropertyAttribute.SIZEOF, ObjCPropertyAttribute::validate); + } + return invokePPPZ(cls, name, attributes, attributeCount, __functionAddress); + } + + /** + * Adds a property to a class. + * + * @param cls the class to modify + * @param name the name of the property + * @param attributes an array of property attributes + * + * @return {@link #YES} if the property was added successfully; otherwise {@link #NO} (for example, this function returns {@link #NO} if the class already has that property) + */ + @NativeType("BOOL") + public static boolean class_addProperty(@NativeType("Class") long cls, @NativeType("char const *") ByteBuffer name, @NativeType("objc_property_attribute_t const *") ObjCPropertyAttribute.Buffer attributes) { + if (CHECKS) { + checkNT1(name); + } + return nclass_addProperty(cls, memAddress(name), attributes.address(), attributes.remaining()); + } + + /** + * Adds a property to a class. + * + * @param cls the class to modify + * @param name the name of the property + * @param attributes an array of property attributes + * + * @return {@link #YES} if the property was added successfully; otherwise {@link #NO} (for example, this function returns {@link #NO} if the class already has that property) + */ + @NativeType("BOOL") + public static boolean class_addProperty(@NativeType("Class") long cls, @NativeType("char const *") CharSequence name, @NativeType("objc_property_attribute_t const *") ObjCPropertyAttribute.Buffer attributes) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nclass_addProperty(cls, nameEncoded, attributes.address(), attributes.remaining()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_replaceProperty ] --- + + /** + * Unsafe version of: {@link #class_replaceProperty} + * + * @param attributeCount the number of attributes in {@code attributes} + */ + public static void nclass_replaceProperty(long cls, long name, long attributes, int attributeCount) { + long __functionAddress = Functions.class_replaceProperty; + if (CHECKS) { + check(cls); + Struct.validate(attributes, attributeCount, ObjCPropertyAttribute.SIZEOF, ObjCPropertyAttribute::validate); + } + invokePPPV(cls, name, attributes, attributeCount, __functionAddress); + } + + /** + * Replaces a property of a class. + * + * @param cls the class to modify + * @param name the name of the property + * @param attributes an array of property attributes + */ + public static void class_replaceProperty(@NativeType("Class") long cls, @NativeType("char const *") ByteBuffer name, @NativeType("objc_property_attribute_t const *") ObjCPropertyAttribute.Buffer attributes) { + if (CHECKS) { + checkNT1(name); + } + nclass_replaceProperty(cls, memAddress(name), attributes.address(), attributes.remaining()); + } + + /** + * Replaces a property of a class. + * + * @param cls the class to modify + * @param name the name of the property + * @param attributes an array of property attributes + */ + public static void class_replaceProperty(@NativeType("Class") long cls, @NativeType("char const *") CharSequence name, @NativeType("objc_property_attribute_t const *") ObjCPropertyAttribute.Buffer attributes) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + nclass_replaceProperty(cls, nameEncoded, attributes.address(), attributes.remaining()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_setIvarLayout ] --- + + /** Unsafe version of: {@link #class_setIvarLayout} */ + public static void nclass_setIvarLayout(long cls, long layout) { + long __functionAddress = Functions.class_setIvarLayout; + if (CHECKS) { + check(cls); + } + invokePPV(cls, layout, __functionAddress); + } + + /** + * Sets the Ivar layout for a given class. + * + * @param cls the class to modify + * @param layout the layout of the Ivars for {@code cls} + */ + public static void class_setIvarLayout(@NativeType("Class") long cls, @NativeType("uint8_t const *") ByteBuffer layout) { + if (CHECKS) { + checkNT1(layout); + } + nclass_setIvarLayout(cls, memAddress(layout)); + } + + /** + * Sets the Ivar layout for a given class. + * + * @param cls the class to modify + * @param layout the layout of the Ivars for {@code cls} + */ + public static void class_setIvarLayout(@NativeType("Class") long cls, @NativeType("uint8_t const *") CharSequence layout) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(layout, true); + long layoutEncoded = stack.getPointerAddress(); + nclass_setIvarLayout(cls, layoutEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_setWeakIvarLayout ] --- + + /** Unsafe version of: {@link #class_setWeakIvarLayout} */ + public static void nclass_setWeakIvarLayout(long cls, long layout) { + long __functionAddress = Functions.class_setWeakIvarLayout; + if (CHECKS) { + check(cls); + } + invokePPV(cls, layout, __functionAddress); + } + + /** + * Sets the layout for weak Ivars for a given class. + * + * @param cls the class to modify + * @param layout the layout of the weak Ivars for {@code cls} + */ + public static void class_setWeakIvarLayout(@NativeType("Class") long cls, @NativeType("uint8_t const *") ByteBuffer layout) { + if (CHECKS) { + checkNT1(layout); + } + nclass_setWeakIvarLayout(cls, memAddress(layout)); + } + + /** + * Sets the layout for weak Ivars for a given class. + * + * @param cls the class to modify + * @param layout the layout of the weak Ivars for {@code cls} + */ + public static void class_setWeakIvarLayout(@NativeType("Class") long cls, @NativeType("uint8_t const *") CharSequence layout) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(layout, true); + long layoutEncoded = stack.getPointerAddress(); + nclass_setWeakIvarLayout(cls, layoutEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_createInstance ] --- + + /** + * Creates an instance of a class, allocating memory for the class in the default malloc memory zone. + * + * @param cls the class that you want to allocate an instance of + * @param extraBytes an integer indicating the number of extra bytes to allocate. The additional bytes can be used to store additional instance variables beyond those + * defined in the class definition. + * + * @return an instance of the class {@code cls} + */ + @NativeType("id") + public static long class_createInstance(@NativeType("Class") long cls, @NativeType("size_t") long extraBytes) { + long __functionAddress = Functions.class_createInstance; + if (CHECKS) { + check(cls); + } + return invokePPP(cls, extraBytes, __functionAddress); + } + + // --- [ objc_constructInstance ] --- + + /** Unsafe version of: {@link #objc_constructInstance} */ + public static long nobjc_constructInstance(long cls, long bytes) { + long __functionAddress = Functions.objc_constructInstance; + return invokePPP(cls, bytes, __functionAddress); + } + + /** + * Creates an instance of a class at the specified location. + * + * @param cls the class that you want to allocate an instance of + * @param bytes the location at which to allocate an instance of the {@code cls} class. {@code bytes} must point to at least {@code class_getInstanceSize(cls)} + * bytes of well-aligned, zero-filled memory. + * + * @return an instance of the class {@code cls} at {@code bytes}, if successful; otherwise {@link #nil} (for example, if {@code cls} or {@code bytes} are themselves {@link #nil}) + */ + @NativeType("id") + public static long objc_constructInstance(@NativeType("Class") long cls, @Nullable @NativeType("void *") ByteBuffer bytes) { + if (CHECKS) { + if (DEBUG) { + checkSafe(bytes, class_getInstanceSize(cls)); + } + } + return nobjc_constructInstance(cls, memAddressSafe(bytes)); + } + + // --- [ objc_destructInstance ] --- + + /** + * Destroys an instance of a class without freeing memory and removes any of its associated references. + * + *

    This method does nothing if obj is {@link #nil}.

    + * + *
    Important
    + * + *

    The garbage collector does not call this function. As a result, if you edit this function, you should also edit finalize. That said, Core Foundation + * and other clients do call this function under garbage collection.

    + * + * @param obj the instance to destroy + */ + @NativeType("void *") + public static long objc_destructInstance(@NativeType("id") long obj) { + long __functionAddress = Functions.objc_destructInstance; + if (CHECKS) { + check(obj); + } + return invokePP(obj, __functionAddress); + } + + // --- [ objc_allocateClassPair ] --- + + /** Unsafe version of: {@link #objc_allocateClassPair} */ + public static long nobjc_allocateClassPair(long superclass, long name, long extraBytes) { + long __functionAddress = Functions.objc_allocateClassPair; + return invokePPPP(superclass, name, extraBytes, __functionAddress); + } + + /** + * Creates a new class and metaclass. + * + *

    You can get a pointer to the new metaclass by calling {@code object_getClass(newClass)}.

    + * + *

    To create a new class, start by calling objc_allocateClassPair. Then set the class's attributes with functions like {@link #class_addMethod} and + * {@link #class_addIvar}. When you are done building the class, call {@link #objc_registerClassPair}. The new class is now ready for use.

    + * + *

    Instance methods and instance variables should be added to the class itself. Class methods should be added to the metaclass.

    + * + * @param superclass the class to use as the new class's superclass, or Nil to create a new root class + * @param name the string to use as the new class's name. The string will be copied. + * @param extraBytes the number of bytes to allocate for indexed ivars at the end of the class and metaclass objects. This should usually be 0. + * + * @return the new class, or Nil if the class could not be created (for example, the desired name is already in use) + */ + @NativeType("Class") + public static long objc_allocateClassPair(@NativeType("Class") long superclass, @NativeType("char const *") ByteBuffer name, @NativeType("size_t") long extraBytes) { + if (CHECKS) { + checkNT1(name); + } + return nobjc_allocateClassPair(superclass, memAddress(name), extraBytes); + } + + /** + * Creates a new class and metaclass. + * + *

    You can get a pointer to the new metaclass by calling {@code object_getClass(newClass)}.

    + * + *

    To create a new class, start by calling objc_allocateClassPair. Then set the class's attributes with functions like {@link #class_addMethod} and + * {@link #class_addIvar}. When you are done building the class, call {@link #objc_registerClassPair}. The new class is now ready for use.

    + * + *

    Instance methods and instance variables should be added to the class itself. Class methods should be added to the metaclass.

    + * + * @param superclass the class to use as the new class's superclass, or Nil to create a new root class + * @param name the string to use as the new class's name. The string will be copied. + * @param extraBytes the number of bytes to allocate for indexed ivars at the end of the class and metaclass objects. This should usually be 0. + * + * @return the new class, or Nil if the class could not be created (for example, the desired name is already in use) + */ + @NativeType("Class") + public static long objc_allocateClassPair(@NativeType("Class") long superclass, @NativeType("char const *") CharSequence name, @NativeType("size_t") long extraBytes) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nobjc_allocateClassPair(superclass, nameEncoded, extraBytes); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ objc_registerClassPair ] --- + + /** + * Registers a class that was allocated using {@link #objc_allocateClassPair}. + * + * @param cls the class you want to register + */ + public static void objc_registerClassPair(@NativeType("Class") long cls) { + long __functionAddress = Functions.objc_registerClassPair; + if (CHECKS) { + check(cls); + } + invokePV(cls, __functionAddress); + } + + // --- [ objc_disposeClassPair ] --- + + /** + * Destroys a class and its associated metaclass. + * + *

    Do not call this function if instances of the {@code cls} class or any subclass exist.

    + * + * @param cls the class to be destroyed. This class must have been allocated using {@link #objc_allocateClassPair}. + */ + public static void objc_disposeClassPair(@NativeType("Class") long cls) { + long __functionAddress = Functions.objc_disposeClassPair; + if (CHECKS) { + check(cls); + } + invokePV(cls, __functionAddress); + } + + // --- [ method_getName ] --- + + /** + * Returns the name of a method. + * + *

    To get the method name as a C string, call {@code sel_getName(method_getName(method))}.

    + * + * @param m the method to inspect + * + * @return a pointer of type SEL + */ + @NativeType("SEL") + public static long method_getName(@NativeType("Method") long m) { + long __functionAddress = Functions.method_getName; + if (CHECKS) { + check(m); + } + return invokePP(m, __functionAddress); + } + + // --- [ method_getImplementation ] --- + + /** + * Returns the implementation of a method. + * + * @param m the method to inspect + * + * @return a function pointer of type IMP + */ + @NativeType("IMP") + public static long method_getImplementation(@NativeType("Method") long m) { + long __functionAddress = Functions.method_getImplementation; + if (CHECKS) { + check(m); + } + return invokePP(m, __functionAddress); + } + + // --- [ method_getTypeEncoding ] --- + + /** Unsafe version of: {@link #method_getTypeEncoding} */ + public static long nmethod_getTypeEncoding(long m) { + long __functionAddress = Functions.method_getTypeEncoding; + if (CHECKS) { + check(m); + } + return invokePP(m, __functionAddress); + } + + /** + * Returns a string describing a method's parameter and return types. + * + * @param m the method to inspect + * + * @return a C string. The string may be {@code NULL} + */ + @Nullable + @NativeType("char const *") + public static String method_getTypeEncoding(@NativeType("Method") long m) { + long __result = nmethod_getTypeEncoding(m); + return memUTF8Safe(__result); + } + + // --- [ method_getNumberOfArguments ] --- + + /** + * Returns the number of arguments accepted by a method. + * + * @param m a pointer to a Method data structure. Pass the method in question. + * + * @return an integer containing the number of arguments accepted by the given method + */ + @NativeType("unsigned int") + public static int method_getNumberOfArguments(@NativeType("Method") long m) { + long __functionAddress = Functions.method_getNumberOfArguments; + if (CHECKS) { + check(m); + } + return invokePI(m, __functionAddress); + } + + // --- [ method_copyReturnType ] --- + + /** Unsafe version of: {@link #method_copyReturnType} */ + public static long nmethod_copyReturnType(long m) { + long __functionAddress = Functions.method_copyReturnType; + if (CHECKS) { + check(m); + } + return invokePP(m, __functionAddress); + } + + /** + * Returns a string describing a method's return type. + * + * @param m the method to inspect + * + * @return a C string describing the return type. You must free the string with free(). + */ + @Nullable + @NativeType("char *") + public static String method_copyReturnType(@NativeType("Method") long m) { + long __result = nmethod_copyReturnType(m); + return memUTF8Safe(__result); + } + + // --- [ method_copyArgumentType ] --- + + /** Unsafe version of: {@link #method_copyArgumentType} */ + public static long nmethod_copyArgumentType(long m, int index) { + long __functionAddress = Functions.method_copyArgumentType; + if (CHECKS) { + check(m); + } + return invokePP(m, index, __functionAddress); + } + + /** + * Returns a string describing a single parameter type of a method. + * + * @param m the method to inspect + * @param index the index of the parameter to inspect + * + * @return a C string describing the type of the parameter at index {@code index}, or {@code NULL} if method has no parameter index {@code index}. You must free the + * string with free(). + */ + @Nullable + @NativeType("char *") + public static String method_copyArgumentType(@NativeType("Method") long m, @NativeType("unsigned int") int index) { + long __result = NULL; + try { + __result = nmethod_copyArgumentType(m, index); + return memUTF8Safe(__result); + } finally { + if (__result != NULL) org.lwjgl.system.libc.LibCStdlib.nfree(__result); + } + } + + // --- [ method_getReturnType ] --- + + /** + * Unsafe version of: {@link #method_getReturnType} + * + * @param dst_len the maximum number of characters that can be stored in {@code dst} + */ + public static void nmethod_getReturnType(long m, long dst, long dst_len) { + long __functionAddress = Functions.method_getReturnType; + if (CHECKS) { + check(m); + } + invokePPPV(m, dst, dst_len, __functionAddress); + } + + /** + * Returns by reference a string describing a method's return type. + * + *

    The method's return type string is copied to {@code dst}. {@code dst} is filled as if {@code strncpy(dst, parameter_type, dst_len)} were called.

    + * + * @param m the method to inspect + * @param dst the reference string to store the description + */ + public static void method_getReturnType(@NativeType("Method") long m, @NativeType("char *") ByteBuffer dst) { + nmethod_getReturnType(m, memAddress(dst), dst.remaining()); + } + + /** + * Returns by reference a string describing a method's return type. + * + *

    The method's return type string is copied to {@code dst}. {@code dst} is filled as if {@code strncpy(dst, parameter_type, dst_len)} were called.

    + * + * @param m the method to inspect + * @param dst_len the maximum number of characters that can be stored in {@code dst} + */ + @NativeType("void") + public static String method_getReturnType(@NativeType("Method") long m, @NativeType("size_t") long dst_len) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + ByteBuffer dst = stack.malloc((int)dst_len); + nmethod_getReturnType(m, memAddress(dst), dst_len); + return memUTF8(memByteBufferNT1(memAddress(dst), (int)dst_len)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ method_getArgumentType ] --- + + /** + * Unsafe version of: {@link #method_getArgumentType} + * + * @param dst_len the maximum number of characters that can be stored in {@code dst} + */ + public static void nmethod_getArgumentType(long m, int index, long dst, long dst_len) { + long __functionAddress = Functions.method_getArgumentType; + if (CHECKS) { + check(m); + } + invokePPPV(m, index, dst, dst_len, __functionAddress); + } + + /** + * Returns by reference a string describing a single parameter type of a method. + * + *

    The parameter type string is copied to {@code dst}. {@code dst} is filled as if {@code strncpy(dst, parameter_type, dst_len)} were called. If the + * method contains no parameter with that index, {@code dst} is filled as if {@code strncpy(dst, "", dst_len)} were called.

    + * + * @param m the method you want to inquire about + * @param index the index of the parameter you want to inquire about + * @param dst the reference string to store the description + */ + public static void method_getArgumentType(@NativeType("Method") long m, @NativeType("unsigned int") int index, @NativeType("char *") ByteBuffer dst) { + nmethod_getArgumentType(m, index, memAddress(dst), dst.remaining()); + } + + /** + * Returns by reference a string describing a single parameter type of a method. + * + *

    The parameter type string is copied to {@code dst}. {@code dst} is filled as if {@code strncpy(dst, parameter_type, dst_len)} were called. If the + * method contains no parameter with that index, {@code dst} is filled as if {@code strncpy(dst, "", dst_len)} were called.

    + * + * @param m the method you want to inquire about + * @param index the index of the parameter you want to inquire about + * @param dst_len the maximum number of characters that can be stored in {@code dst} + */ + @NativeType("void") + public static String method_getArgumentType(@NativeType("Method") long m, @NativeType("unsigned int") int index, @NativeType("size_t") long dst_len) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + ByteBuffer dst = stack.malloc((int)dst_len); + nmethod_getArgumentType(m, index, memAddress(dst), dst_len); + return memUTF8(memByteBufferNT1(memAddress(dst), (int)dst_len)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ method_setImplementation ] --- + + /** + * Sets the implementation of a method. + * + * @param m the method for which to set an implementation + * @param imp the implemention to set to this method + * + * @return the previous implementation of the method + */ + @NativeType("IMP") + public static long method_setImplementation(@NativeType("Method") long m, @NativeType("IMP") long imp) { + long __functionAddress = Functions.method_setImplementation; + if (CHECKS) { + check(m); + check(imp); + } + return invokePPP(m, imp, __functionAddress); + } + + // --- [ method_exchangeImplementations ] --- + + /** + * Exchanges the implementations of two methods. + * + * @param m1 the method to exchange with second method + * @param m2 the method to exchange with first method + */ + public static void method_exchangeImplementations(@NativeType("Method") long m1, @NativeType("Method") long m2) { + long __functionAddress = Functions.method_exchangeImplementations; + if (CHECKS) { + check(m1); + check(m2); + } + invokePPV(m1, m2, __functionAddress); + } + + // --- [ ivar_getName ] --- + + /** Unsafe version of: {@link #ivar_getName} */ + public static long nivar_getName(long v) { + long __functionAddress = Functions.ivar_getName; + if (CHECKS) { + check(v); + } + return invokePP(v, __functionAddress); + } + + /** + * Returns the name of an instance variable. + * + * @param v the instance variable + * + * @return a C string containing the instance variable's name + */ + @Nullable + @NativeType("char const *") + public static String ivar_getName(@NativeType("Ivar") long v) { + long __result = nivar_getName(v); + return memUTF8Safe(__result); + } + + // --- [ ivar_getTypeEncoding ] --- + + /** Unsafe version of: {@link #ivar_getTypeEncoding} */ + public static long nivar_getTypeEncoding(long v) { + long __functionAddress = Functions.ivar_getTypeEncoding; + if (CHECKS) { + check(v); + } + return invokePP(v, __functionAddress); + } + + /** + * Returns the type string of an instance variable. + * + * @param v the instance variable + * + * @return a C string containing the instance variable's type encoding + */ + @Nullable + @NativeType("char const *") + public static String ivar_getTypeEncoding(@NativeType("Ivar") long v) { + long __result = nivar_getTypeEncoding(v); + return memUTF8Safe(__result); + } + + // --- [ ivar_getOffset ] --- + + /** + * Returns the offset of an instance variable. + * + *

    For instance variables of type {@code id} or other object types, call {@link #object_getIvar} and {@link #object_setIvar} instead of using this offset to access + * the instance variable data directly.

    + * + * @param v the instance variable + * + * @return the offset of {@code v} + */ + @NativeType("ptrdiff_t") + public static long ivar_getOffset(@NativeType("Ivar") long v) { + long __functionAddress = Functions.ivar_getOffset; + if (CHECKS) { + check(v); + } + return invokePP(v, __functionAddress); + } + + // --- [ property_getName ] --- + + /** Unsafe version of: {@link #property_getName} */ + public static long nproperty_getName(long property) { + long __functionAddress = Functions.property_getName; + if (CHECKS) { + check(property); + } + return invokePP(property, __functionAddress); + } + + /** + * Returns the name of a property. + * + * @param property the property you want to inquire about + * + * @return a C string containing the property's name + */ + @Nullable + @NativeType("char const *") + public static String property_getName(@NativeType("objc_property_t") long property) { + long __result = nproperty_getName(property); + return memUTF8Safe(__result); + } + + // --- [ property_getAttributes ] --- + + /** Unsafe version of: {@link #property_getAttributes} */ + public static long nproperty_getAttributes(long property) { + long __functionAddress = Functions.property_getAttributes; + if (CHECKS) { + check(property); + } + return invokePP(property, __functionAddress); + } + + /** + * Returns the attribute string of a property. + * + * @param property a property + * + * @return a C string containing the property's attributes + */ + @Nullable + @NativeType("char const *") + public static String property_getAttributes(@NativeType("objc_property_t") long property) { + long __result = nproperty_getAttributes(property); + return memUTF8Safe(__result); + } + + // --- [ property_copyAttributeList ] --- + + /** + * Unsafe version of: {@link #property_copyAttributeList} + * + * @param outCount the number of attributes returned in the array + */ + public static long nproperty_copyAttributeList(long property, long outCount) { + long __functionAddress = Functions.property_copyAttributeList; + if (CHECKS) { + check(property); + } + return invokePPP(property, outCount, __functionAddress); + } + + /** + * Returns an array of property attributes for a given property. + * + * @param property the property whose attributes you want to copy + * + * @return an array of property attributes. You must free the array with free(). + */ + @Nullable + @NativeType("objc_property_attribute_t *") + public static ObjCPropertyAttribute.Buffer property_copyAttributeList(@NativeType("objc_property_t") long property) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nproperty_copyAttributeList(property, memAddress(outCount)); + return ObjCPropertyAttribute.createSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ property_copyAttributeValue ] --- + + /** Unsafe version of: {@link #property_copyAttributeValue} */ + public static long nproperty_copyAttributeValue(long property, long attributeName) { + long __functionAddress = Functions.property_copyAttributeValue; + if (CHECKS) { + check(property); + } + return invokePPP(property, attributeName, __functionAddress); + } + + /** + * Returns the value of a property attribute given the attribute name. + * + * @param property the property whose value you are interested in + * @param attributeName a C string representing the name of the attribute + * + * @return The value string of the {@code attributeName} attribute, if one exists in {@code property}; otherwise, {@link #nil}. You must free the returned value string + * with free(). + */ + @Nullable + @NativeType("char *") + public static String property_copyAttributeValue(@NativeType("objc_property_t") long property, @NativeType("char const *") ByteBuffer attributeName) { + if (CHECKS) { + checkNT1(attributeName); + } + long __result = NULL; + try { + __result = nproperty_copyAttributeValue(property, memAddress(attributeName)); + return memUTF8Safe(__result); + } finally { + if (__result != NULL) org.lwjgl.system.libc.LibCStdlib.nfree(__result); + } + } + + /** + * Returns the value of a property attribute given the attribute name. + * + * @param property the property whose value you are interested in + * @param attributeName a C string representing the name of the attribute + * + * @return The value string of the {@code attributeName} attribute, if one exists in {@code property}; otherwise, {@link #nil}. You must free the returned value string + * with free(). + */ + @Nullable + @NativeType("char *") + public static String property_copyAttributeValue(@NativeType("objc_property_t") long property, @NativeType("char const *") CharSequence attributeName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + long __result = NULL; + try { + stack.nUTF8(attributeName, true); + long attributeNameEncoded = stack.getPointerAddress(); + __result = nproperty_copyAttributeValue(property, attributeNameEncoded); + return memUTF8Safe(__result); + } finally { + if (__result != NULL) org.lwjgl.system.libc.LibCStdlib.nfree(__result); + stack.setPointer(stackPointer); + } + } + + // --- [ objc_getProtocol ] --- + + /** Unsafe version of: {@link #objc_getProtocol} */ + public static long nobjc_getProtocol(long name) { + long __functionAddress = Functions.objc_getProtocol; + return invokePP(name, __functionAddress); + } + + /** + * Returns a specified protocol. + * + *

    This function acquires the runtime lock.

    + * + * @param name the name of a protocol + * + * @return the protocol named {@code name}{, or {@code NULL} if no protocol named name could be found + */ + @NativeType("Protocol *") + public static long objc_getProtocol(@NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nobjc_getProtocol(memAddress(name)); + } + + /** + * Returns a specified protocol. + * + *

    This function acquires the runtime lock.

    + * + * @param name the name of a protocol + * + * @return the protocol named {@code name}{, or {@code NULL} if no protocol named name could be found + */ + @NativeType("Protocol *") + public static long objc_getProtocol(@NativeType("char const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nobjc_getProtocol(nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ objc_copyProtocolList ] --- + + /** + * Unsafe version of: {@link #objc_copyProtocolList} + * + * @param outCount upon return, contains the number of protocols in the returned array + */ + public static long nobjc_copyProtocolList(long outCount) { + long __functionAddress = Functions.objc_copyProtocolList; + return invokePP(outCount, __functionAddress); + } + + /** + * Returns an array of all the protocols known to the runtime. + * + * @return a C array of all the protocols known to the runtime. The array contains {@code *outCount} pointers followed by a {@code NULL} terminator. You must free the + * list with free(). + */ + @Nullable + @NativeType("Protocol **") + public static PointerBuffer objc_copyProtocolList() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nobjc_copyProtocolList(memAddress(outCount)); + return memPointerBufferSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ protocol_conformsToProtocol ] --- + + /** + * Returns a Boolean value that indicates whether one protocol conforms to another protocol. + * + *
    Discussion
    + * + *

    One protocol can incorporate other protocols using the same syntax that classes use to adopt a protocol:

    + * + *

    {@code @protocol ProtocolName < protocol list >}

    + * + *

    All the protocols listed between angle brackets are considered part of the {@code ProtocolName} protocol.

    + * + * @param proto a protocol + * @param other a protocol + * + * @return {@link #YES} if {@code proto} conforms to {@code other}, otherwise {@link #NO} + */ + @NativeType("BOOL") + public static boolean protocol_conformsToProtocol(@NativeType("Protocol *") long proto, @NativeType("Protocol *") long other) { + long __functionAddress = Functions.protocol_conformsToProtocol; + if (CHECKS) { + check(proto); + check(other); + } + return invokePPZ(proto, other, __functionAddress); + } + + // --- [ protocol_isEqual ] --- + + /** + * Returns a Boolean value that indicates whether two protocols are equal. + * + * @param proto a protocol + * @param other a protocol + * + * @return {@link #YES} if proto is the same as other, otherwise {@link #NO} + */ + @NativeType("BOOL") + public static boolean protocol_isEqual(@NativeType("Protocol *") long proto, @NativeType("Protocol *") long other) { + long __functionAddress = Functions.protocol_isEqual; + if (CHECKS) { + check(proto); + check(other); + } + return invokePPZ(proto, other, __functionAddress); + } + + // --- [ protocol_getName ] --- + + /** Unsafe version of: {@link #protocol_getName} */ + public static long nprotocol_getName(long p) { + long __functionAddress = Functions.protocol_getName; + if (CHECKS) { + check(p); + } + return invokePP(p, __functionAddress); + } + + /** + * Returns a the name of a protocol. + * + * @param p a protocol + * + * @return the name of the protocol {@code p} as a C string + */ + @Nullable + @NativeType("char const *") + public static String protocol_getName(@NativeType("Protocol *") long p) { + long __result = nprotocol_getName(p); + return memUTF8Safe(__result); + } + + // --- [ protocol_getMethodDescription ] --- + + /** Unsafe version of: {@link #protocol_getMethodDescription} */ + public static native void nprotocol_getMethodDescription(long p, long aSel, boolean isRequiredMethod, boolean isInstanceMethod, long __functionAddress, long __result); + + /** Unsafe version of: {@link #protocol_getMethodDescription} */ + public static void nprotocol_getMethodDescription(long p, long aSel, boolean isRequiredMethod, boolean isInstanceMethod, long __result) { + long __functionAddress = Functions.protocol_getMethodDescription; + if (CHECKS) { + check(p); + check(aSel); + } + nprotocol_getMethodDescription(p, aSel, isRequiredMethod, isInstanceMethod, __functionAddress, __result); + } + + /** + * Returns a method description structure for a specified method of a given protocol. + * + * @param p a protocol + * @param aSel a selector + * @param isRequiredMethod a Boolean value that indicates whether {@code aSel} is a required method + * @param isInstanceMethod a Boolean value that indicates whether {@code aSel} is a instance method + * @param __result an objc_method_description structure that describes the method specified by {@code aSel}, {@code isRequiredMethod}, and {@code isInstanceMethod} for + * the protocol {@code p}. + * + *

    If the protocol does not contain the specified method, returns an objc_method_description structure with the value {@code {NULL, NULL}}.

    + */ + @NativeType("struct objc_method_description") + public static ObjCMethodDescription protocol_getMethodDescription(@NativeType("Protocol *") long p, @NativeType("SEL") long aSel, @NativeType("BOOL") boolean isRequiredMethod, @NativeType("BOOL") boolean isInstanceMethod, @NativeType("struct objc_method_description") ObjCMethodDescription __result) { + nprotocol_getMethodDescription(p, aSel, isRequiredMethod, isInstanceMethod, __result.address()); + return __result; + } + + // --- [ protocol_copyMethodDescriptionList ] --- + + /** + * Unsafe version of: {@link #protocol_copyMethodDescriptionList} + * + * @param outCount upon return, contains the number of method description structures in the returned array + */ + public static long nprotocol_copyMethodDescriptionList(long p, boolean isRequiredMethod, boolean isInstanceMethod, long outCount) { + long __functionAddress = Functions.protocol_copyMethodDescriptionList; + if (CHECKS) { + check(p); + } + return invokePPP(p, isRequiredMethod, isInstanceMethod, outCount, __functionAddress); + } + + /** + * Returns an array of method descriptions of methods meeting a given specification for a given protocol. + * + *

    Methods in other protocols adopted by this protocol are not included.

    + * + * @param p a protocol + * @param isRequiredMethod a Boolean value that indicates whether returned methods should be required methods (pass {@link #YES} to specify required methods) + * @param isInstanceMethod a Boolean value that indicates whether returned methods should be instance methods (pass {@link #YES} to specify instance methods) + * + * @return a C array of objc_method_description structures containing the names and types of {@code p}'s methods specified by {@code isRequiredMethod} and + * {@code isInstanceMethod}. The array contains {@code *outCount} pointers followed by a {@code NULL} terminator. You must free the list with free(). + * + *

    If the protocol declares no methods that meet the specification, {@code NULL} is returned and {@code *outCount} is 0.

    + */ + @Nullable + @NativeType("struct objc_method_description *") + public static ObjCMethodDescription.Buffer protocol_copyMethodDescriptionList(@NativeType("Protocol *") long p, @NativeType("BOOL") boolean isRequiredMethod, @NativeType("BOOL") boolean isInstanceMethod) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nprotocol_copyMethodDescriptionList(p, isRequiredMethod, isInstanceMethod, memAddress(outCount)); + return ObjCMethodDescription.createSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ protocol_getProperty ] --- + + /** Unsafe version of: {@link #protocol_getProperty} */ + public static long nprotocol_getProperty(long proto, long name, boolean isRequiredProperty, boolean isInstanceProperty) { + long __functionAddress = Functions.protocol_getProperty; + if (CHECKS) { + check(proto); + } + return invokePPP(proto, name, isRequiredProperty, isInstanceProperty, __functionAddress); + } + + /** + * Returns the specified property of a given protocol. + * + * @param proto a protocol + * @param name the name of a property + * @param isRequiredProperty a Boolean value that indicates whether {@code name} is a required property + * @param isInstanceProperty a Boolean value that indicates whether {@code name} is a instance property + * + * @return the property specified by {@code name}, {@code isRequiredProperty}, and {@code isInstanceProperty} for {@code proto}, or {@code NULL} if none of + * {@code proto}'s properties meets the specification + */ + @NativeType("objc_property_t") + public static long protocol_getProperty(@NativeType("Protocol *") long proto, @NativeType("char const *") ByteBuffer name, @NativeType("BOOL") boolean isRequiredProperty, @NativeType("BOOL") boolean isInstanceProperty) { + if (CHECKS) { + checkNT1(name); + } + return nprotocol_getProperty(proto, memAddress(name), isRequiredProperty, isInstanceProperty); + } + + /** + * Returns the specified property of a given protocol. + * + * @param proto a protocol + * @param name the name of a property + * @param isRequiredProperty a Boolean value that indicates whether {@code name} is a required property + * @param isInstanceProperty a Boolean value that indicates whether {@code name} is a instance property + * + * @return the property specified by {@code name}, {@code isRequiredProperty}, and {@code isInstanceProperty} for {@code proto}, or {@code NULL} if none of + * {@code proto}'s properties meets the specification + */ + @NativeType("objc_property_t") + public static long protocol_getProperty(@NativeType("Protocol *") long proto, @NativeType("char const *") CharSequence name, @NativeType("BOOL") boolean isRequiredProperty, @NativeType("BOOL") boolean isInstanceProperty) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nprotocol_getProperty(proto, nameEncoded, isRequiredProperty, isInstanceProperty); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ protocol_copyPropertyList ] --- + + /** + * Unsafe version of: {@link #protocol_copyPropertyList} + * + * @param outCount upon return, contains the number of elements in the returned array + */ + public static long nprotocol_copyPropertyList(long proto, long outCount) { + long __functionAddress = Functions.protocol_copyPropertyList; + if (CHECKS) { + check(proto); + } + return invokePPP(proto, outCount, __functionAddress); + } + + /** + * Returns an array of the properties declared by a protocol. + * + * @param proto a protocol + * + * @return a C array of pointers of type objc_property_t describing the properties declared by {@code proto}. Any properties declared by other protocols adopted + * by this protocol are not included. The array contains {@code *outCount} pointers followed by a {@code NULL} terminator. You must free the array with free(). + * + *

    If the protocol declares no properties, {@code NULL} is returned and {@code *outCount} is 0.

    + */ + @Nullable + @NativeType("objc_property_t *") + public static PointerBuffer protocol_copyPropertyList(@NativeType("Protocol *") long proto) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nprotocol_copyPropertyList(proto, memAddress(outCount)); + return memPointerBufferSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ protocol_copyProtocolList ] --- + + /** + * Unsafe version of: {@link #protocol_copyProtocolList} + * + * @param outCount upon return, contains the number of elements in the returned array + */ + public static long nprotocol_copyProtocolList(long proto, long outCount) { + long __functionAddress = Functions.protocol_copyProtocolList; + if (CHECKS) { + check(proto); + } + return invokePPP(proto, outCount, __functionAddress); + } + + /** + * eturns an array of the protocols adopted by a protocol. + * + * @param proto a protocol + * + * @return a C array of protocols adopted by {@code proto}. The array contains {@code *outCount} pointers followed by a {@code NULL} terminator. You must free the array + * with free(). + * + *

    If the protocol declares no properties, {@code NULL} is returned and {@code *outCount} is 0.

    + */ + @Nullable + @NativeType("Protocol **") + public static PointerBuffer protocol_copyProtocolList(@NativeType("Protocol *") long proto) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nprotocol_copyProtocolList(proto, memAddress(outCount)); + return memPointerBufferSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ objc_allocateProtocol ] --- + + /** Unsafe version of: {@link #objc_allocateProtocol} */ + public static long nobjc_allocateProtocol(long name) { + long __functionAddress = Functions.objc_allocateProtocol; + return invokePP(name, __functionAddress); + } + + /** + * Creates a new protocol instance. + * + *

    You must register the returned protocol instance with the {@link #objc_registerProtocol} function before you can use it.

    + * + *

    There is no dispose method associated with this function.

    + * + * @param name the name of the protocol you want to create + * + * @return a new protocol instance or {@link #nil} if a protocol with the same name as {@code name} already exists + */ + @NativeType("Protocol *") + public static long objc_allocateProtocol(@NativeType("char const *") ByteBuffer name) { + if (CHECKS) { + checkNT1(name); + } + return nobjc_allocateProtocol(memAddress(name)); + } + + /** + * Creates a new protocol instance. + * + *

    You must register the returned protocol instance with the {@link #objc_registerProtocol} function before you can use it.

    + * + *

    There is no dispose method associated with this function.

    + * + * @param name the name of the protocol you want to create + * + * @return a new protocol instance or {@link #nil} if a protocol with the same name as {@code name} already exists + */ + @NativeType("Protocol *") + public static long objc_allocateProtocol(@NativeType("char const *") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + return nobjc_allocateProtocol(nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ objc_registerProtocol ] --- + + /** + * Registers a newly created protocol with the Objective-C runtime. + * + *

    When you create a new protocol using the {@link #objc_allocateProtocol}, you then register it with the Objective-C runtime by calling this function. After a + * protocol is successfully registered, it is immutable and ready to use.

    + * + * @param proto the protocol you want to register with the Objective-C runtime + */ + public static void objc_registerProtocol(@NativeType("Protocol *") long proto) { + long __functionAddress = Functions.objc_registerProtocol; + if (CHECKS) { + check(proto); + } + invokePV(proto, __functionAddress); + } + + // --- [ protocol_addMethodDescription ] --- + + /** Unsafe version of: {@link #protocol_addMethodDescription} */ + public static void nprotocol_addMethodDescription(long proto, long name, long types, boolean isRequiredMethod, boolean isInstanceMethod) { + long __functionAddress = Functions.protocol_addMethodDescription; + if (CHECKS) { + check(proto); + check(name); + } + invokePPPV(proto, name, types, isRequiredMethod, isInstanceMethod, __functionAddress); + } + + /** + * Adds a method to a protocol. + * + *

    To add a method to a protocol using this function, the protocol must be under construction. That is, you must add any methods to proto before you + * register it with the Objective-C runtime (via the {@link #objc_registerProtocol} function).

    + * + * @param proto the protocol you want to add a method to + * @param name the name of the method you want to add + * @param types a C string representing the signature of the method you want to add + * @param isRequiredMethod a Boolean indicating whether the method is a required method of the {@code proto} protocol. If {@link #YES}, the method is a required method; if {@link #NO}, the + * method is an optional method. + * @param isInstanceMethod a Boolean indicating whether the method is an instance method. If {@link #YES}, the method is an instance method; if {@link #NO}, the method is a class method. + */ + public static void protocol_addMethodDescription(@NativeType("Protocol *") long proto, @NativeType("SEL") long name, @NativeType("char const *") ByteBuffer types, @NativeType("BOOL") boolean isRequiredMethod, @NativeType("BOOL") boolean isInstanceMethod) { + if (CHECKS) { + checkNT1(types); + } + nprotocol_addMethodDescription(proto, name, memAddress(types), isRequiredMethod, isInstanceMethod); + } + + /** + * Adds a method to a protocol. + * + *

    To add a method to a protocol using this function, the protocol must be under construction. That is, you must add any methods to proto before you + * register it with the Objective-C runtime (via the {@link #objc_registerProtocol} function).

    + * + * @param proto the protocol you want to add a method to + * @param name the name of the method you want to add + * @param types a C string representing the signature of the method you want to add + * @param isRequiredMethod a Boolean indicating whether the method is a required method of the {@code proto} protocol. If {@link #YES}, the method is a required method; if {@link #NO}, the + * method is an optional method. + * @param isInstanceMethod a Boolean indicating whether the method is an instance method. If {@link #YES}, the method is an instance method; if {@link #NO}, the method is a class method. + */ + public static void protocol_addMethodDescription(@NativeType("Protocol *") long proto, @NativeType("SEL") long name, @NativeType("char const *") CharSequence types, @NativeType("BOOL") boolean isRequiredMethod, @NativeType("BOOL") boolean isInstanceMethod) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(types, true); + long typesEncoded = stack.getPointerAddress(); + nprotocol_addMethodDescription(proto, name, typesEncoded, isRequiredMethod, isInstanceMethod); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ protocol_addProtocol ] --- + + /** + * Adds a registered protocol to another protocol that is under construction. + * + *

    The protocol you want to add to ({@code proto}) must be under construction – allocated but not yet registered with the Objective-C runtime. The + * protocol you want to add ({@code addition}) must be registered already.

    + * + * @param proto the protocol you want to add the registered protocol to + * @param addition the registered protocol you want to add to {@code proto} + */ + public static void protocol_addProtocol(@NativeType("Protocol *") long proto, @NativeType("Protocol *") long addition) { + long __functionAddress = Functions.protocol_addProtocol; + if (CHECKS) { + check(proto); + check(addition); + } + invokePPV(proto, addition, __functionAddress); + } + + // --- [ protocol_addProperty ] --- + + /** + * Unsafe version of: {@link #protocol_addProperty} + * + * @param attributeCount the number of properties in {@code attributes} + */ + public static void nprotocol_addProperty(long proto, long name, long attributes, int attributeCount, boolean isRequiredProperty, boolean isInstanceProperty) { + long __functionAddress = Functions.protocol_addProperty; + if (CHECKS) { + check(proto); + Struct.validate(attributes, attributeCount, ObjCPropertyAttribute.SIZEOF, ObjCPropertyAttribute::validate); + } + invokePPPV(proto, name, attributes, attributeCount, isRequiredProperty, isInstanceProperty, __functionAddress); + } + + /** + * Adds a property to a protocol that is under construction. + * + *

    The protocol you want to add the property to must be under construction – allocated but not yet registered with the Objective-C runtime (via the + * {@link #objc_registerProtocol} function).

    + * + * @param proto the protocol you want to add a property to + * @param name the name of the property you want to add. + * @param attributes an array of property attributes + * @param isRequiredProperty a Boolean indicating whether the property's accessor methods are required methods of the {@code proto} protocol. If {@link #YES}, the property's accessor + * methods are required methods; if {@link #NO}, the property's accessor methods are optional methods. + * @param isInstanceProperty a Boolean indicating whether the property's accessor methods are instance methods. If {@link #YES}, the property's accessor methods are instance methods. + * {@link #YES} is the only value allowed for a property. As a result, if you set this value to {@link #NO}, the property will not be added to the protocol. + */ + public static void protocol_addProperty(@NativeType("Protocol *") long proto, @NativeType("char const *") ByteBuffer name, @NativeType("objc_property_attribute_t const *") ObjCPropertyAttribute.Buffer attributes, @NativeType("BOOL") boolean isRequiredProperty, @NativeType("BOOL") boolean isInstanceProperty) { + if (CHECKS) { + checkNT1(name); + } + nprotocol_addProperty(proto, memAddress(name), attributes.address(), attributes.remaining(), isRequiredProperty, isInstanceProperty); + } + + /** + * Adds a property to a protocol that is under construction. + * + *

    The protocol you want to add the property to must be under construction – allocated but not yet registered with the Objective-C runtime (via the + * {@link #objc_registerProtocol} function).

    + * + * @param proto the protocol you want to add a property to + * @param name the name of the property you want to add. + * @param attributes an array of property attributes + * @param isRequiredProperty a Boolean indicating whether the property's accessor methods are required methods of the {@code proto} protocol. If {@link #YES}, the property's accessor + * methods are required methods; if {@link #NO}, the property's accessor methods are optional methods. + * @param isInstanceProperty a Boolean indicating whether the property's accessor methods are instance methods. If {@link #YES}, the property's accessor methods are instance methods. + * {@link #YES} is the only value allowed for a property. As a result, if you set this value to {@link #NO}, the property will not be added to the protocol. + */ + public static void protocol_addProperty(@NativeType("Protocol *") long proto, @NativeType("char const *") CharSequence name, @NativeType("objc_property_attribute_t const *") ObjCPropertyAttribute.Buffer attributes, @NativeType("BOOL") boolean isRequiredProperty, @NativeType("BOOL") boolean isInstanceProperty) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(name, true); + long nameEncoded = stack.getPointerAddress(); + nprotocol_addProperty(proto, nameEncoded, attributes.address(), attributes.remaining(), isRequiredProperty, isInstanceProperty); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ objc_copyImageNames ] --- + + /** + * Unsafe version of: {@link #objc_copyImageNames} + * + * @param outCount the number of names in the returned array + */ + public static long nobjc_copyImageNames(long outCount) { + long __functionAddress = Functions.objc_copyImageNames; + return invokePP(outCount, __functionAddress); + } + + /** + * Returns the names of all the loaded Objective-C frameworks and dynamic libraries. + * + * @return an array of C strings representing the names of all the loaded Objective-C frameworks and dynamic libraries + */ + @Nullable + @NativeType("char const **") + public static PointerBuffer objc_copyImageNames() { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nobjc_copyImageNames(memAddress(outCount)); + return memPointerBufferSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ class_getImageName ] --- + + /** Unsafe version of: {@link #class_getImageName} */ + public static long nclass_getImageName(long cls) { + long __functionAddress = Functions.class_getImageName; + if (CHECKS) { + check(cls); + } + return invokePP(cls, __functionAddress); + } + + /** + * Returns the name of the dynamic library a class originated from. + * + * @param cls the class you are inquiring about + * + * @return a C string representing the name of the library containing the {@code cls} class. + */ + @Nullable + @NativeType("char const *") + public static String class_getImageName(@NativeType("Class") long cls) { + long __result = nclass_getImageName(cls); + return memUTF8Safe(__result); + } + + // --- [ objc_copyClassNamesForImage ] --- + + /** + * Unsafe version of: {@link #objc_copyClassNamesForImage} + * + * @param outCount the number of names in the returned array + */ + public static long nobjc_copyClassNamesForImage(long image, long outCount) { + long __functionAddress = Functions.objc_copyClassNamesForImage; + return invokePPP(image, outCount, __functionAddress); + } + + /** + * Returns the names of all the classes within a specified library or framework. + * + * @param image the library or framework you are inquiring about + * + * @return an array of C strings representing all of the class names within the specified library or framework + */ + @Nullable + @NativeType("char const **") + public static PointerBuffer objc_copyClassNamesForImage(@NativeType("char const *") ByteBuffer image) { + if (CHECKS) { + checkNT1(image); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + IntBuffer outCount = stack.callocInt(1); + try { + long __result = nobjc_copyClassNamesForImage(memAddress(image), memAddress(outCount)); + return memPointerBufferSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + /** + * Returns the names of all the classes within a specified library or framework. + * + * @param image the library or framework you are inquiring about + * + * @return an array of C strings representing all of the class names within the specified library or framework + */ + @Nullable + @NativeType("char const **") + public static PointerBuffer objc_copyClassNamesForImage(@NativeType("char const *") CharSequence image) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + IntBuffer outCount = stack.callocInt(1); + stack.nUTF8(image, true); + long imageEncoded = stack.getPointerAddress(); + long __result = nobjc_copyClassNamesForImage(imageEncoded, memAddress(outCount)); + return memPointerBufferSafe(__result, outCount.get(0)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ sel_getName ] --- + + /** Unsafe version of: {@link #sel_getName} */ + public static long nsel_getName(long sel) { + long __functionAddress = Functions.sel_getName; + if (CHECKS) { + check(sel); + } + return invokePP(sel, __functionAddress); + } + + /** + * Returns the name of the method specified by a given selector. + * + * @param sel a pointer of type SEL. Pass the selector whose name you wish to determine. + * + * @return a C string indicating the name of the selector + */ + @Nullable + @NativeType("char const *") + public static String sel_getName(@NativeType("SEL") long sel) { + long __result = nsel_getName(sel); + return memUTF8Safe(__result); + } + + // --- [ sel_getUid ] --- + + /** Unsafe version of: {@link #sel_getUid} */ + public static long nsel_getUid(long str) { + long __functionAddress = Functions.sel_getUid; + return invokePP(str, __functionAddress); + } + + /** + * Registers a method name with the Objective-C runtime system. + * + *

    The implementation of this method is identical to the implementation of {@link #sel_registerName}.

    + * + * @param str a pointer to a C string. Pass the name of the method you wish to register + * + * @return a pointer of type SEL specifying the selector for the named method + */ + @NativeType("SEL") + public static long sel_getUid(@NativeType("char const *") ByteBuffer str) { + if (CHECKS) { + checkNT1(str); + } + return nsel_getUid(memAddress(str)); + } + + /** + * Registers a method name with the Objective-C runtime system. + * + *

    The implementation of this method is identical to the implementation of {@link #sel_registerName}.

    + * + * @param str a pointer to a C string. Pass the name of the method you wish to register + * + * @return a pointer of type SEL specifying the selector for the named method + */ + @NativeType("SEL") + public static long sel_getUid(@NativeType("char const *") CharSequence str) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(str, true); + long strEncoded = stack.getPointerAddress(); + return nsel_getUid(strEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ sel_registerName ] --- + + /** Unsafe version of: {@link #sel_registerName} */ + public static long nsel_registerName(long str) { + long __functionAddress = Functions.sel_registerName; + return invokePP(str, __functionAddress); + } + + /** + * Registers a method with the Objective-C runtime system, maps the method name to a selector, and returns the selector value. + * + *

    You must register a method name with the Objective-C runtime system to obtain the method’s selector before you can add the method to a class + * definition. If the method name has already been registered, this function simply returns the selector.

    + * + * @param str a pointer to a C string. Pass the name of the method you wish to register + * + * @return a pointer of type SEL specifying the selector for the named method + */ + @NativeType("SEL") + public static long sel_registerName(@NativeType("char const *") ByteBuffer str) { + if (CHECKS) { + checkNT1(str); + } + return nsel_registerName(memAddress(str)); + } + + /** + * Registers a method with the Objective-C runtime system, maps the method name to a selector, and returns the selector value. + * + *

    You must register a method name with the Objective-C runtime system to obtain the method’s selector before you can add the method to a class + * definition. If the method name has already been registered, this function simply returns the selector.

    + * + * @param str a pointer to a C string. Pass the name of the method you wish to register + * + * @return a pointer of type SEL specifying the selector for the named method + */ + @NativeType("SEL") + public static long sel_registerName(@NativeType("char const *") CharSequence str) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(str, true); + long strEncoded = stack.getPointerAddress(); + return nsel_registerName(strEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ sel_isEqual ] --- + + /** + * Returns a Boolean value that indicates whether two selectors are equal. + * + *

    sel_isEqual is equivalent to {@code ==}.

    + * + * @param lhs the selector to compare with {@code rhs} + * @param rhs the selector to compare with {@code lhs} + * + * @return {@link #YES} if rhs and rhs are equal, otherwise {@link #NO} + */ + @NativeType("BOOL") + public static boolean sel_isEqual(@NativeType("SEL") long lhs, @NativeType("SEL") long rhs) { + long __functionAddress = Functions.sel_isEqual; + if (CHECKS) { + check(lhs); + check(rhs); + } + return invokePPZ(lhs, rhs, __functionAddress); + } + + // --- [ objc_enumerationMutation ] --- + + /** + * Inserted by the compiler when a mutation is detected during a foreach iteration. + * + *

    The compiler inserts this function when it detects that an object is mutated during a foreach iteration. The function is called when a mutation occurs, + * and the enumeration mutation handler is enacted if it is set up (via the {@link #objc_setEnumerationMutationHandler} function). If the handler is not set up, + * a fatal error occurs.

    + * + * @param obj the object being mutated + */ + public static void objc_enumerationMutation(@NativeType("id") long obj) { + long __functionAddress = Functions.objc_enumerationMutation; + if (CHECKS) { + check(obj); + } + invokePV(obj, __functionAddress); + } + + // --- [ objc_setEnumerationMutationHandler ] --- + + /** Unsafe version of: {@link #objc_setEnumerationMutationHandler} */ + public static void nobjc_setEnumerationMutationHandler(long handler) { + long __functionAddress = Functions.objc_setEnumerationMutationHandler; + invokePV(handler, __functionAddress); + } + + /** + * Sets the current mutation handler. + * + * @param handler a function pointer to the new mutation handler + */ + public static void objc_setEnumerationMutationHandler(@NativeType("EnumerationMutationHandler") EnumerationMutationHandlerI handler) { + nobjc_setEnumerationMutationHandler(handler.address()); + } + + // --- [ imp_implementationWithBlock ] --- + + /** + * Creates a pointer to a function that calls the specified block when the method is called. + * + * @param block the block that implements this method. The signature of {@code block} should be {@code method_return_type ^(id self, self, method_args …)}. The + * selector of the method is not available to {@code block}. {@code block} is copied with {@code Block_copy()}. + * + * @return the IMP that calls {@code block}. You must dispose of the returned IMP using the function. + */ + @NativeType("IMP") + public static long imp_implementationWithBlock(@NativeType("id") long block) { + long __functionAddress = Functions.imp_implementationWithBlock; + if (CHECKS) { + check(block); + } + return invokePP(block, __functionAddress); + } + + // --- [ imp_getBlock ] --- + + /** + * Returns the block associated with an IMP that was created using {@link #imp_implementationWithBlock}. + * + * @param anImp the IMP that calls this block + * + * @return the block called by {@code anImp} + */ + @NativeType("id") + public static long imp_getBlock(@NativeType("IMP") long anImp) { + long __functionAddress = Functions.imp_getBlock; + if (CHECKS) { + check(anImp); + } + return invokePP(anImp, __functionAddress); + } + + // --- [ imp_removeBlock ] --- + + /** + * Disassociates a block from an IMP that was created using {@link #imp_implementationWithBlock}, and releases the copy of the block that was created. + * + * @param anImp an IMP that was created using the {@link #imp_implementationWithBlock} function. + * + * @return {@link #YES} if the block was released successfully; otherwise, {@link #NO} (for example, the function returns {@link #NO} if the block was not used to create {@code anImp} + * previously). + */ + @NativeType("BOOL") + public static boolean imp_removeBlock(@NativeType("IMP") long anImp) { + long __functionAddress = Functions.imp_removeBlock; + if (CHECKS) { + check(anImp); + } + return invokePZ(anImp, __functionAddress); + } + + // --- [ objc_loadWeak ] --- + + /** Unsafe version of: {@link #objc_loadWeak} */ + public static long nobjc_loadWeak(long location) { + long __functionAddress = Functions.objc_loadWeak; + return invokePP(location, __functionAddress); + } + + /** + * Loads the object referenced by a weak pointer and returns it. + * + *

    This function loads the object referenced by a weak pointer and returns it after retaining and autoreleasing the object. As a result, the object stays + * alive long enough for the caller to use it. This function is typically used anywhere a {@code __weak} variable is used in an expression.

    + * + * @param location the address of the weak pointer + * + * @return the object pointed to by location, or {@link #nil} if location is {@link #nil} + */ + @NativeType("id") + public static long objc_loadWeak(@Nullable @NativeType("id *") PointerBuffer location) { + if (CHECKS) { + checkSafe(location, 1); + } + return nobjc_loadWeak(memAddressSafe(location)); + } + + // --- [ objc_storeWeak ] --- + + /** Unsafe version of: {@link #objc_storeWeak} */ + public static long nobjc_storeWeak(long location, long obj) { + long __functionAddress = Functions.objc_storeWeak; + if (CHECKS) { + check(obj); + } + return invokePPP(location, obj, __functionAddress); + } + + /** + * Stores a new value in a {@code __weak} variable. + * + *

    This function is typically used anywhere a {@code __weak} variable is the target of an assignment.

    + * + * @param location the address of the weak pointer + * @param obj the new object you want the weak pointer to now point to + * + * @return the value stored in location (that is, {@code obj}) + */ + @NativeType("id") + public static long objc_storeWeak(@NativeType("id *") PointerBuffer location, @NativeType("id") long obj) { + if (CHECKS) { + check(location, 1); + } + return nobjc_storeWeak(memAddress(location), obj); + } + + // --- [ objc_setAssociatedObject ] --- + + /** + * Sets an associated value for a given object using a given key and association policy. + * + * @param object the source object for the association + * @param key the key for the association + * @param value the value to associate with the key {@code key} for {@code object}. Pass {@link #nil} to clear an existing association. + * @param policy the policy for the association. One of:
    {@link #OBJC_ASSOCIATION_ASSIGN}{@link #OBJC_ASSOCIATION_RETAIN_NONATOMIC}{@link #OBJC_ASSOCIATION_COPY_NONATOMIC}
    {@link #OBJC_ASSOCIATION_RETAIN}{@link #OBJC_ASSOCIATION_COPY}
    + */ + public static void objc_setAssociatedObject(@NativeType("id") long object, @NativeType("void const *") long key, @NativeType("id") long value, @NativeType("objc_AssociationPolicy") long policy) { + long __functionAddress = Functions.objc_setAssociatedObject; + if (CHECKS) { + check(object); + check(key); + check(value); + } + invokePPPPV(object, key, value, policy, __functionAddress); + } + + // --- [ objc_getAssociatedObject ] --- + + /** + * Returns the value associated with a given object for a given key. + * + * @param object the source object for the association + * @param key the key for the association + * + * @return the value associated with the key {@code key} for {@code object}. + */ + @NativeType("id") + public static long objc_getAssociatedObject(@NativeType("id") long object, @NativeType("void const *") long key) { + long __functionAddress = Functions.objc_getAssociatedObject; + if (CHECKS) { + check(object); + check(key); + } + return invokePPP(object, key, __functionAddress); + } + + // --- [ objc_removeAssociatedObjects ] --- + + /** + * Removes all associations for a given object. + * + *

    The main purpose of this function is to make it easy to return an object to a "pristine state". You should not use this function for general removal of + * associations from objects, since it also removes associations that other clients may have added to the object. Typically you should use + * {@link #objc_setAssociatedObject} with a {@link #nil} value to clear an association.

    + * + * @param object an object that maintains associated objects + */ + public static void objc_removeAssociatedObjects(@NativeType("id") long object) { + long __functionAddress = Functions.objc_removeAssociatedObjects; + if (CHECKS) { + check(object); + } + invokePV(object, __functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/CRYPTPROTECT_PROMPTSTRUCT.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/CRYPTPROTECT_PROMPTSTRUCT.java new file mode 100644 index 000000000..dab5b9694 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/CRYPTPROTECT_PROMPTSTRUCT.java @@ -0,0 +1,223 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Provides the text of a prompt and information about when and where that prompt is to be displayed when using the {@link Crypt32#CryptProtectData} and + * {@link Crypt32#CryptUnprotectData} functions. + * + *

    Layout

    + * + *
    
    + * struct CRYPTPROTECT_PROMPTSTRUCT {
    + *     DWORD {@link #cbSize};
    + *     DWORD {@link #dwPromptFlags};
    + *     HWND {@link #hwndApp};
    + *     LPCWSTR {@link #szPrompt};
    + * }
    + */ +public class CRYPTPROTECT_PROMPTSTRUCT extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + CBSIZE, + DWPROMPTFLAGS, + HWNDAPP, + SZPROMPT; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + CBSIZE = layout.offsetof(0); + DWPROMPTFLAGS = layout.offsetof(1); + HWNDAPP = layout.offsetof(2); + SZPROMPT = layout.offsetof(3); + } + + protected CRYPTPROTECT_PROMPTSTRUCT(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected CRYPTPROTECT_PROMPTSTRUCT create(long address, @Nullable ByteBuffer container) { + return new CRYPTPROTECT_PROMPTSTRUCT(address, container); + } + + /** + * Creates a {@code CRYPTPROTECT_PROMPTSTRUCT} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public CRYPTPROTECT_PROMPTSTRUCT(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the size, in bytes, of this structure */ + @NativeType("DWORD") + public int cbSize() { return ncbSize(address()); } + /** flags that indicate when prompts to the user are to be displayed. One or more of:
    {@link Crypt32#CRYPTPROTECT_PROMPT_ON_UNPROTECT}{@link Crypt32#CRYPTPROTECT_PROMPT_ON_PROTECT}
    */ + @NativeType("DWORD") + public int dwPromptFlags() { return ndwPromptFlags(address()); } + /** window handle to the parent window */ + @NativeType("HWND") + public long hwndApp() { return nhwndApp(address()); } + /** a string containing the text of a prompt to be displayed */ + @NativeType("LPCWSTR") + public ByteBuffer szPrompt() { return nszPrompt(address()); } + /** a string containing the text of a prompt to be displayed */ + @NativeType("LPCWSTR") + public String szPromptString() { return nszPromptString(address()); } + + /** Sets the specified value to the {@link #cbSize} field. */ + public CRYPTPROTECT_PROMPTSTRUCT cbSize(@NativeType("DWORD") int value) { ncbSize(address(), value); return this; } + /** Sets the default value to the {@link #cbSize} field. */ + public CRYPTPROTECT_PROMPTSTRUCT cbSize$Default() { return cbSize(SIZEOF); } + /** Sets the specified value to the {@link #dwPromptFlags} field. */ + public CRYPTPROTECT_PROMPTSTRUCT dwPromptFlags(@NativeType("DWORD") int value) { ndwPromptFlags(address(), value); return this; } + /** Sets the specified value to the {@link #hwndApp} field. */ + public CRYPTPROTECT_PROMPTSTRUCT hwndApp(@NativeType("HWND") long value) { nhwndApp(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@link #szPrompt} field. */ + public CRYPTPROTECT_PROMPTSTRUCT szPrompt(@NativeType("LPCWSTR") ByteBuffer value) { nszPrompt(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public CRYPTPROTECT_PROMPTSTRUCT set( + int cbSize, + int dwPromptFlags, + long hwndApp, + ByteBuffer szPrompt + ) { + cbSize(cbSize); + dwPromptFlags(dwPromptFlags); + hwndApp(hwndApp); + szPrompt(szPrompt); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public CRYPTPROTECT_PROMPTSTRUCT set(CRYPTPROTECT_PROMPTSTRUCT src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code CRYPTPROTECT_PROMPTSTRUCT} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static CRYPTPROTECT_PROMPTSTRUCT malloc() { + return new CRYPTPROTECT_PROMPTSTRUCT(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code CRYPTPROTECT_PROMPTSTRUCT} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static CRYPTPROTECT_PROMPTSTRUCT calloc() { + return new CRYPTPROTECT_PROMPTSTRUCT(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code CRYPTPROTECT_PROMPTSTRUCT} instance allocated with {@link BufferUtils}. */ + public static CRYPTPROTECT_PROMPTSTRUCT create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new CRYPTPROTECT_PROMPTSTRUCT(memAddress(container), container); + } + + /** Returns a new {@code CRYPTPROTECT_PROMPTSTRUCT} instance for the specified memory address. */ + public static CRYPTPROTECT_PROMPTSTRUCT create(long address) { + return new CRYPTPROTECT_PROMPTSTRUCT(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static CRYPTPROTECT_PROMPTSTRUCT createSafe(long address) { + return address == NULL ? null : new CRYPTPROTECT_PROMPTSTRUCT(address, null); + } + + /** + * Returns a new {@code CRYPTPROTECT_PROMPTSTRUCT} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static CRYPTPROTECT_PROMPTSTRUCT malloc(MemoryStack stack) { + return new CRYPTPROTECT_PROMPTSTRUCT(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code CRYPTPROTECT_PROMPTSTRUCT} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static CRYPTPROTECT_PROMPTSTRUCT calloc(MemoryStack stack) { + return new CRYPTPROTECT_PROMPTSTRUCT(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + // ----------------------------------- + + /** Unsafe version of {@link #cbSize}. */ + public static int ncbSize(long struct) { return UNSAFE.getInt(null, struct + CRYPTPROTECT_PROMPTSTRUCT.CBSIZE); } + /** Unsafe version of {@link #dwPromptFlags}. */ + public static int ndwPromptFlags(long struct) { return UNSAFE.getInt(null, struct + CRYPTPROTECT_PROMPTSTRUCT.DWPROMPTFLAGS); } + /** Unsafe version of {@link #hwndApp}. */ + public static long nhwndApp(long struct) { return memGetAddress(struct + CRYPTPROTECT_PROMPTSTRUCT.HWNDAPP); } + /** Unsafe version of {@link #szPrompt}. */ + public static ByteBuffer nszPrompt(long struct) { return memByteBufferNT2(memGetAddress(struct + CRYPTPROTECT_PROMPTSTRUCT.SZPROMPT)); } + /** Unsafe version of {@link #szPromptString}. */ + public static String nszPromptString(long struct) { return memUTF16(memGetAddress(struct + CRYPTPROTECT_PROMPTSTRUCT.SZPROMPT)); } + + /** Unsafe version of {@link #cbSize(int) cbSize}. */ + public static void ncbSize(long struct, int value) { UNSAFE.putInt(null, struct + CRYPTPROTECT_PROMPTSTRUCT.CBSIZE, value); } + /** Unsafe version of {@link #dwPromptFlags(int) dwPromptFlags}. */ + public static void ndwPromptFlags(long struct, int value) { UNSAFE.putInt(null, struct + CRYPTPROTECT_PROMPTSTRUCT.DWPROMPTFLAGS, value); } + /** Unsafe version of {@link #hwndApp(long) hwndApp}. */ + public static void nhwndApp(long struct, long value) { memPutAddress(struct + CRYPTPROTECT_PROMPTSTRUCT.HWNDAPP, check(value)); } + /** Unsafe version of {@link #szPrompt(ByteBuffer) szPrompt}. */ + public static void nszPrompt(long struct, ByteBuffer value) { + if (CHECKS) { checkNT2(value); } + memPutAddress(struct + CRYPTPROTECT_PROMPTSTRUCT.SZPROMPT, memAddress(value)); + } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + CRYPTPROTECT_PROMPTSTRUCT.HWNDAPP)); + check(memGetAddress(struct + CRYPTPROTECT_PROMPTSTRUCT.SZPROMPT)); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/Crypt32.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/Crypt32.java new file mode 100644 index 000000000..c3f5756c9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/Crypt32.java @@ -0,0 +1,269 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to {@code dpapi.h} and {@code crypt32.dll}. */ +public class Crypt32 { + + private static final SharedLibrary CRYPT32 = Library.loadNative(Crypt32.class, "org.lwjgl", "crypt32"); + + /** Contains the function pointers loaded from the crypt32 {@link SharedLibrary}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + CryptProtectData = apiGetFunctionAddress(CRYPT32, "CryptProtectData"), + CryptProtectMemory = apiGetFunctionAddressOptional(CRYPT32, "CryptProtectMemory"), + CryptUnprotectData = apiGetFunctionAddress(CRYPT32, "CryptUnprotectData"), + CryptUnprotectMemory = apiGetFunctionAddressOptional(CRYPT32, "CryptUnprotectMemory"); + + } + + /** Returns the crypt32 {@link SharedLibrary}. */ + public static SharedLibrary getLibrary() { + return CRYPT32; + } + + /** Flags for the {@code dwFlags} parameter of {@link #CryptProtectData} and/or {@link #CryptUnprotectData}. */ + public static final int + CRYPTPROTECT_UI_FORBIDDEN = 0x1, + CRYPTPROTECT_LOCAL_MACHINE = 0x4, + CRYPTPROTECT_AUDIT = 0x10, + CRYPTPROTECT_VERIFY_PROTECTION = 0x40; + + /** Flags for the {@code dwFlags} parameter of {@link #CryptProtectMemory} and {@link #CryptUnprotectMemory}. */ + public static final int + CRYPTPROTECTMEMORY_SAME_PROCESS = 0x0, + CRYPTPROTECTMEMORY_CROSS_PROCESS = 0x1, + CRYPTPROTECTMEMORY_SAME_LOGON = 0x2; + + /** Flags for the {@code dwPromptFlags} member of {@link DATA_BLOB}. */ + public static final int + CRYPTPROTECT_PROMPT_ON_UNPROTECT = 0x1, + CRYPTPROTECT_PROMPT_ON_PROTECT = 0x2; + + /** The block size for data encrypted via {@link #CryptProtectMemory}. */ + public static final int CRYPTPROTECTMEMORY_BLOCK_SIZE = 16; + + protected Crypt32() { + throw new UnsupportedOperationException(); + } + + // --- [ CryptProtectData ] --- + + /** Unsafe version of: {@link #CryptProtectData} */ + public static native int nCryptProtectData(long pDataIn, long szDataDescr, long pOptionalEntropy, long pvReserved, long pPromptStruct, int dwFlags, long pDataOut, long __functionAddress); + + /** Unsafe version of: {@link #CryptProtectData} */ + public static int nCryptProtectData(long pDataIn, long szDataDescr, long pOptionalEntropy, long pvReserved, long pPromptStruct, int dwFlags, long pDataOut) { + long __functionAddress = Functions.CryptProtectData; + return nCryptProtectData(pDataIn, szDataDescr, pOptionalEntropy, pvReserved, pPromptStruct, dwFlags, pDataOut, __functionAddress); + } + + /** + * The {@code CryptProtectData} function performs encryption on the data in a {@link DATA_BLOB} structure. + * + *

    Typically, only a user with the same logon credential as the user who encrypted the data can decrypt the data. In addition, the encryption and + * decryption usually must be done on the same computer.

    + * + * @param pDataIn a pointer to a {@link DATA_BLOB} structure that contains the plaintext to be encrypted + * @param szDataDescr a string with a readable description of the data to be encrypted. + * + *

    This description string is included with the encrypted data. This parameter is optional and can be set to {@code NULL}.

    + * @param pOptionalEntropy a pointer to a {@link DATA_BLOB} structure that contains a password or other additional entropy used to encrypt the data. + * + *

    The {@code DATA_BLOB} structure used in the encryption phase must also be used in the decryption phase. This parameter can be set to {@code NULL} for no + * additional entropy.

    + * @param pvReserved reserved for future use and must be set to {@code NULL} + * @param pPromptStruct a pointer to a {@link CRYPTPROTECT_PROMPTSTRUCT} structure that provides information about where and when prompts are to be displayed and what the + * content of those prompts should be. + * + *

    This parameter can be set to {@code NULL} in both the encryption and decryption phases.

    + * @param dwFlags one or more of:
    {@link #CRYPTPROTECT_LOCAL_MACHINE},{@link #CRYPTPROTECT_UI_FORBIDDEN},{@link #CRYPTPROTECT_AUDIT}
    + * @param pDataOut a pointer to a {@link DATA_BLOB} structure that receives the encrypted data. + * + *

    When you have finished using the {@code DATA_BLOB} structure, free its {@code pbData} member by calling the {@link WinBase#LocalFree} function.

    + */ + @NativeType("BOOL") + public static boolean CryptProtectData(@NativeType("DATA_BLOB *") DATA_BLOB pDataIn, @Nullable @NativeType("LPCWSTR") ByteBuffer szDataDescr, @Nullable @NativeType("DATA_BLOB *") DATA_BLOB pOptionalEntropy, @NativeType("PVOID") long pvReserved, @Nullable @NativeType("CRYPTPROTECT_PROMPTSTRUCT *") CRYPTPROTECT_PROMPTSTRUCT pPromptStruct, @NativeType("DWORD") int dwFlags, @NativeType("DATA_BLOB *") DATA_BLOB pDataOut) { + if (CHECKS) { + checkNT2Safe(szDataDescr); + } + return nCryptProtectData(pDataIn.address(), memAddressSafe(szDataDescr), memAddressSafe(pOptionalEntropy), pvReserved, memAddressSafe(pPromptStruct), dwFlags, pDataOut.address()) != 0; + } + + /** + * The {@code CryptProtectData} function performs encryption on the data in a {@link DATA_BLOB} structure. + * + *

    Typically, only a user with the same logon credential as the user who encrypted the data can decrypt the data. In addition, the encryption and + * decryption usually must be done on the same computer.

    + * + * @param pDataIn a pointer to a {@link DATA_BLOB} structure that contains the plaintext to be encrypted + * @param szDataDescr a string with a readable description of the data to be encrypted. + * + *

    This description string is included with the encrypted data. This parameter is optional and can be set to {@code NULL}.

    + * @param pOptionalEntropy a pointer to a {@link DATA_BLOB} structure that contains a password or other additional entropy used to encrypt the data. + * + *

    The {@code DATA_BLOB} structure used in the encryption phase must also be used in the decryption phase. This parameter can be set to {@code NULL} for no + * additional entropy.

    + * @param pvReserved reserved for future use and must be set to {@code NULL} + * @param pPromptStruct a pointer to a {@link CRYPTPROTECT_PROMPTSTRUCT} structure that provides information about where and when prompts are to be displayed and what the + * content of those prompts should be. + * + *

    This parameter can be set to {@code NULL} in both the encryption and decryption phases.

    + * @param dwFlags one or more of:
    {@link #CRYPTPROTECT_LOCAL_MACHINE},{@link #CRYPTPROTECT_UI_FORBIDDEN},{@link #CRYPTPROTECT_AUDIT}
    + * @param pDataOut a pointer to a {@link DATA_BLOB} structure that receives the encrypted data. + * + *

    When you have finished using the {@code DATA_BLOB} structure, free its {@code pbData} member by calling the {@link WinBase#LocalFree} function.

    + */ + @NativeType("BOOL") + public static boolean CryptProtectData(@NativeType("DATA_BLOB *") DATA_BLOB pDataIn, @Nullable @NativeType("LPCWSTR") CharSequence szDataDescr, @Nullable @NativeType("DATA_BLOB *") DATA_BLOB pOptionalEntropy, @NativeType("PVOID") long pvReserved, @Nullable @NativeType("CRYPTPROTECT_PROMPTSTRUCT *") CRYPTPROTECT_PROMPTSTRUCT pPromptStruct, @NativeType("DWORD") int dwFlags, @NativeType("DATA_BLOB *") DATA_BLOB pDataOut) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF16Safe(szDataDescr, true); + long szDataDescrEncoded = szDataDescr == null ? NULL : stack.getPointerAddress(); + return nCryptProtectData(pDataIn.address(), szDataDescrEncoded, memAddressSafe(pOptionalEntropy), pvReserved, memAddressSafe(pPromptStruct), dwFlags, pDataOut.address()) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ CryptProtectMemory ] --- + + /** + * Unsafe version of: {@link #CryptProtectMemory} + * + * @param cbDataIn number of bytes of memory pointed to by the {@code pData} parameter to encrypt. + * + *

    The number of bytes must be a multiple of the {@link #CRYPTPROTECTMEMORY_BLOCK_SIZE} constant.

    + */ + public static native int nCryptProtectMemory(long pDataIn, int cbDataIn, int dwFlags, long __functionAddress); + + /** + * Unsafe version of: {@link #CryptProtectMemory} + * + * @param cbDataIn number of bytes of memory pointed to by the {@code pData} parameter to encrypt. + * + *

    The number of bytes must be a multiple of the {@link #CRYPTPROTECTMEMORY_BLOCK_SIZE} constant.

    + */ + public static int nCryptProtectMemory(long pDataIn, int cbDataIn, int dwFlags) { + long __functionAddress = Functions.CryptProtectMemory; + if (CHECKS) { + check(__functionAddress); + } + return nCryptProtectMemory(pDataIn, cbDataIn, dwFlags, __functionAddress); + } + + /** + * Encrypts memory to prevent others from viewing sensitive information in your process. + * + *

    For example, use the {@code CryptProtectMemory} function to encrypt memory that contains a password. Encrypting the password prevents others from + * viewing it when the process is paged out to the swap file. Otherwise, the password is in plaintext and viewable by others.

    + * + * @param pDataIn a pointer to the block of memory to encrypt + * @param dwFlags this parameter can be one of the following flags. You must specify the same flag when encrypting and decrypting the memory. One of:
    {@link #CRYPTPROTECTMEMORY_SAME_PROCESS}{@link #CRYPTPROTECTMEMORY_CROSS_PROCESS}
    {@link #CRYPTPROTECTMEMORY_SAME_LOGON}
    + */ + @NativeType("BOOL") + public static boolean CryptProtectMemory(@NativeType("LPVOID") ByteBuffer pDataIn, @NativeType("DWORD") int dwFlags) { + return nCryptProtectMemory(memAddress(pDataIn), pDataIn.remaining(), dwFlags) != 0; + } + + // --- [ CryptUnprotectData ] --- + + /** Unsafe version of: {@link #CryptUnprotectData} */ + public static native int nCryptUnprotectData(long pDataIn, long ppszDataDescr, long pOptionalEntropy, long pvReserved, long pPromptStruct, int dwFlags, long pDataOut, long __functionAddress); + + /** Unsafe version of: {@link #CryptUnprotectData} */ + public static int nCryptUnprotectData(long pDataIn, long ppszDataDescr, long pOptionalEntropy, long pvReserved, long pPromptStruct, int dwFlags, long pDataOut) { + long __functionAddress = Functions.CryptUnprotectData; + return nCryptUnprotectData(pDataIn, ppszDataDescr, pOptionalEntropy, pvReserved, pPromptStruct, dwFlags, pDataOut, __functionAddress); + } + + /** + * The {@code CryptUnprotectData} function decrypts and does an integrity check of the data in a {@link DATA_BLOB} structure. + * + *

    Usually, the only user who can decrypt the data is a user with the same logon credentials as the user who encrypted the data. In addition, the + * encryption and decryption must be done on the same computer.

    + * + * @param pDataIn a pointer to a {@link DATA_BLOB} structure that holds the encrypted data + * @param ppszDataDescr a pointer to a string-readable description of the encrypted data included with the encrypted data. + * + *

    This parameter can be set to {@code NULL}. When you have finished using {@code ppszDataDescr}, free it by calling the {@link WinBase#LocalFree} function.

    + * @param pOptionalEntropy a pointer to a {@link DATA_BLOB} structure that contains a password or other additional entropy used when the data was encrypted. + * + *

    This parameter can be set to {@code NULL}; however, if an optional entropy {@code DATA_BLOB} structure was used in the encryption phase, that same + * {@code DATA_BLOB} structure must be used for the decryption phase.

    + * @param pvReserved reserved for future use and must be set to {@code NULL} + * @param pPromptStruct a pointer to a {@link CRYPTPROTECT_PROMPTSTRUCT} structure that provides information about where and when prompts are to be displayed and what the content + * of those prompts should be. + * + *

    This parameter can be set to {@code NULL}.

    + * @param dwFlags one or more of:
    {@link #CRYPTPROTECT_UI_FORBIDDEN}{@link #CRYPTPROTECT_VERIFY_PROTECTION}
    + * @param pDataOut a pointer to a {@link DATA_BLOB} structure where the function stores the decrypted data. + * + *

    When you have finished using the {@code DATA_BLOB} structure, free its {@code pbData} member by calling the {@link WinBase#LocalFree} function.

    + */ + @NativeType("BOOL") + public static boolean CryptUnprotectData(@NativeType("DATA_BLOB *") DATA_BLOB pDataIn, @Nullable @NativeType("LPWSTR *") PointerBuffer ppszDataDescr, @Nullable @NativeType("DATA_BLOB *") DATA_BLOB pOptionalEntropy, @NativeType("PVOID") long pvReserved, @Nullable @NativeType("CRYPTPROTECT_PROMPTSTRUCT *") CRYPTPROTECT_PROMPTSTRUCT pPromptStruct, @NativeType("DWORD") int dwFlags, @NativeType("DATA_BLOB *") DATA_BLOB pDataOut) { + if (CHECKS) { + checkSafe(ppszDataDescr, 1); + } + return nCryptUnprotectData(pDataIn.address(), memAddressSafe(ppszDataDescr), memAddressSafe(pOptionalEntropy), pvReserved, memAddressSafe(pPromptStruct), dwFlags, pDataOut.address()) != 0; + } + + // --- [ CryptUnprotectMemory ] --- + + /** + * Unsafe version of: {@link #CryptUnprotectMemory} + * + * @param cbDataIn number of bytes of memory pointed to by the {@code pData} parameter to decrypt. + * + *

    The number of bytes must be a multiple of the {@link #CRYPTPROTECTMEMORY_BLOCK_SIZE} constant.

    + */ + public static native int nCryptUnprotectMemory(long pDataIn, int cbDataIn, int dwFlags, long __functionAddress); + + /** + * Unsafe version of: {@link #CryptUnprotectMemory} + * + * @param cbDataIn number of bytes of memory pointed to by the {@code pData} parameter to decrypt. + * + *

    The number of bytes must be a multiple of the {@link #CRYPTPROTECTMEMORY_BLOCK_SIZE} constant.

    + */ + public static int nCryptUnprotectMemory(long pDataIn, int cbDataIn, int dwFlags) { + long __functionAddress = Functions.CryptUnprotectMemory; + if (CHECKS) { + check(__functionAddress); + } + return nCryptUnprotectMemory(pDataIn, cbDataIn, dwFlags, __functionAddress); + } + + /** + * The {@code CryptUnprotectMemory} function decrypts memory that was encrypted using the {@link #CryptProtectMemory} function. + * + * @param pDataIn a pointer to the block of memory to decrypt + * @param dwFlags this parameter can be one of the following flags. You must specify the same flag when encrypting and decrypting the memory. One of:
    {@link #CRYPTPROTECTMEMORY_SAME_PROCESS}{@link #CRYPTPROTECTMEMORY_CROSS_PROCESS}
    {@link #CRYPTPROTECTMEMORY_SAME_LOGON}
    + */ + @NativeType("BOOL") + public static boolean CryptUnprotectMemory(@NativeType("LPVOID") ByteBuffer pDataIn, @NativeType("DWORD") int dwFlags) { + return nCryptUnprotectMemory(memAddress(pDataIn), pDataIn.remaining(), dwFlags) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DATA_BLOB.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DATA_BLOB.java new file mode 100644 index 000000000..96fe914f2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DATA_BLOB.java @@ -0,0 +1,282 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * The {@code DATA_BLOB} structure contains an arbitrary array of bytes. + * + *

    Layout

    + * + *
    
    + * struct DATA_BLOB {
    + *     DWORD {@link #cbData};
    + *     BYTE * {@link #pbData};
    + * }
    + */ +public class DATA_BLOB extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + CBDATA, + PBDATA; + + static { + Layout layout = __struct( + __member(4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + CBDATA = layout.offsetof(0); + PBDATA = layout.offsetof(1); + } + + protected DATA_BLOB(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected DATA_BLOB create(long address, @Nullable ByteBuffer container) { + return new DATA_BLOB(address, container); + } + + /** + * Creates a {@code DATA_BLOB} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public DATA_BLOB(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the count, in bytes, of data */ + @NativeType("DWORD") + public int cbData() { return ncbData(address()); } + /** a pointer to the data buffer */ + @NativeType("BYTE *") + public ByteBuffer pbData() { return npbData(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@link #pbData} field. */ + public DATA_BLOB pbData(@NativeType("BYTE *") ByteBuffer value) { npbData(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public DATA_BLOB set(DATA_BLOB src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code DATA_BLOB} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static DATA_BLOB malloc() { + return new DATA_BLOB(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code DATA_BLOB} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static DATA_BLOB calloc() { + return new DATA_BLOB(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code DATA_BLOB} instance allocated with {@link BufferUtils}. */ + public static DATA_BLOB create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new DATA_BLOB(memAddress(container), container); + } + + /** Returns a new {@code DATA_BLOB} instance for the specified memory address. */ + public static DATA_BLOB create(long address) { + return new DATA_BLOB(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static DATA_BLOB createSafe(long address) { + return address == NULL ? null : new DATA_BLOB(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code DATA_BLOB} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static DATA_BLOB malloc(MemoryStack stack) { + return new DATA_BLOB(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code DATA_BLOB} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static DATA_BLOB calloc(MemoryStack stack) { + return new DATA_BLOB(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #cbData}. */ + public static int ncbData(long struct) { return UNSAFE.getInt(null, struct + DATA_BLOB.CBDATA); } + /** Unsafe version of {@link #pbData() pbData}. */ + public static ByteBuffer npbData(long struct) { return memByteBuffer(memGetAddress(struct + DATA_BLOB.PBDATA), ncbData(struct)); } + + /** Sets the specified value to the {@code cbData} field of the specified {@code struct}. */ + public static void ncbData(long struct, int value) { UNSAFE.putInt(null, struct + DATA_BLOB.CBDATA, value); } + /** Unsafe version of {@link #pbData(ByteBuffer) pbData}. */ + public static void npbData(long struct, ByteBuffer value) { memPutAddress(struct + DATA_BLOB.PBDATA, memAddress(value)); ncbData(struct, value.remaining()); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + DATA_BLOB.PBDATA)); + } + + // ----------------------------------- + + /** An array of {@link DATA_BLOB} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final DATA_BLOB ELEMENT_FACTORY = DATA_BLOB.create(-1L); + + /** + * Creates a new {@code DATA_BLOB.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link DATA_BLOB#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected DATA_BLOB getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link DATA_BLOB#cbData} field. */ + @NativeType("DWORD") + public int cbData() { return DATA_BLOB.ncbData(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@link DATA_BLOB#pbData} field. */ + @NativeType("BYTE *") + public ByteBuffer pbData() { return DATA_BLOB.npbData(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@link DATA_BLOB#pbData} field. */ + public Buffer pbData(@NativeType("BYTE *") ByteBuffer value) { DATA_BLOB.npbData(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DEVMODE.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DEVMODE.java new file mode 100644 index 000000000..172c07f56 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DEVMODE.java @@ -0,0 +1,780 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains information about the initialization and environment of a printer or a display device. + * + *

    Layout

    + * + *
    
    + * struct DEVMODE {
    + *     TCHAR {@link #dmDeviceName}[32];
    + *     WORD {@link #dmSpecVersion};
    + *     WORD {@link #dmDriverVersion};
    + *     WORD {@link #dmSize};
    + *     WORD {@link #dmDriverExtra};
    + *     DWORD {@link #dmFields};
    + *     union {
    + *         struct {
    + *             short {@link #dmOrientation};
    + *             short {@link #dmPaperSize};
    + *             short {@link #dmPaperLength};
    + *             short {@link #dmPaperWidth};
    + *             short {@link #dmScale};
    + *             short {@link #dmCopies};
    + *             short {@link #dmDefaultSource};
    + *             short {@link #dmPrintQuality};
    + *         };
    + *         struct {
    + *             {@link POINTL POINTL} {@link #dmPosition};
    + *             DWORD {@link #dmDisplayOrientation};
    + *             DWORD {@link #dmDisplayFixedOutput};
    + *         };
    + *     };
    + *     short {@link #dmColor};
    + *     short {@link #dmDuplex};
    + *     short {@link #dmYResolution};
    + *     short {@link #dmTTOption};
    + *     short {@link #dmCollate};
    + *     TCHAR {@link #dmFormName}[32];
    + *     WORD {@link #dmLogPixels};
    + *     DWORD {@link #dmBitsPerPel};
    + *     DWORD {@link #dmPelsWidth};
    + *     DWORD {@link #dmPelsHeight};
    + *     union {
    + *         DWORD {@link #dmDisplayFlags};
    + *         DWORD {@link #dmNup};
    + *     };
    + *     DWORD {@link #dmDisplayFrequency};
    + *     DWORD {@link #dmICMMethod};
    + *     DWORD {@link #dmICMIntent};
    + *     DWORD {@link #dmMediaType};
    + *     DWORD {@link #dmDitherType};
    + *     DWORD {@link #dmReserved1};
    + *     DWORD {@link #dmReserved2};
    + *     DWORD {@link #dmPanningWidth};
    + *     DWORD {@link #dmPanningHeight};
    + * }
    + */ +public class DEVMODE extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + DMDEVICENAME, + DMSPECVERSION, + DMDRIVERVERSION, + DMSIZE, + DMDRIVEREXTRA, + DMFIELDS, + DMORIENTATION, + DMPAPERSIZE, + DMPAPERLENGTH, + DMPAPERWIDTH, + DMSCALE, + DMCOPIES, + DMDEFAULTSOURCE, + DMPRINTQUALITY, + DMPOSITION, + DMDISPLAYORIENTATION, + DMDISPLAYFIXEDOUTPUT, + DMCOLOR, + DMDUPLEX, + DMYRESOLUTION, + DMTTOPTION, + DMCOLLATE, + DMFORMNAME, + DMLOGPIXELS, + DMBITSPERPEL, + DMPELSWIDTH, + DMPELSHEIGHT, + DMDISPLAYFLAGS, + DMNUP, + DMDISPLAYFREQUENCY, + DMICMMETHOD, + DMICMINTENT, + DMMEDIATYPE, + DMDITHERTYPE, + DMRESERVED1, + DMRESERVED2, + DMPANNINGWIDTH, + DMPANNINGHEIGHT; + + static { + Layout layout = __struct( + __array(2, 32), + __member(2), + __member(2), + __member(2), + __member(2), + __member(4), + __union( + __struct( + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2) + ), + __struct( + __member(POINTL.SIZEOF, POINTL.ALIGNOF), + __member(4), + __member(4) + ) + ), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __array(2, 32), + __member(2), + __member(4), + __member(4), + __member(4), + __union( + __member(4), + __member(4) + ), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + DMDEVICENAME = layout.offsetof(0); + DMSPECVERSION = layout.offsetof(1); + DMDRIVERVERSION = layout.offsetof(2); + DMSIZE = layout.offsetof(3); + DMDRIVEREXTRA = layout.offsetof(4); + DMFIELDS = layout.offsetof(5); + DMORIENTATION = layout.offsetof(8); + DMPAPERSIZE = layout.offsetof(9); + DMPAPERLENGTH = layout.offsetof(10); + DMPAPERWIDTH = layout.offsetof(11); + DMSCALE = layout.offsetof(12); + DMCOPIES = layout.offsetof(13); + DMDEFAULTSOURCE = layout.offsetof(14); + DMPRINTQUALITY = layout.offsetof(15); + DMPOSITION = layout.offsetof(17); + DMDISPLAYORIENTATION = layout.offsetof(18); + DMDISPLAYFIXEDOUTPUT = layout.offsetof(19); + DMCOLOR = layout.offsetof(20); + DMDUPLEX = layout.offsetof(21); + DMYRESOLUTION = layout.offsetof(22); + DMTTOPTION = layout.offsetof(23); + DMCOLLATE = layout.offsetof(24); + DMFORMNAME = layout.offsetof(25); + DMLOGPIXELS = layout.offsetof(26); + DMBITSPERPEL = layout.offsetof(27); + DMPELSWIDTH = layout.offsetof(28); + DMPELSHEIGHT = layout.offsetof(29); + DMDISPLAYFLAGS = layout.offsetof(31); + DMNUP = layout.offsetof(32); + DMDISPLAYFREQUENCY = layout.offsetof(33); + DMICMMETHOD = layout.offsetof(34); + DMICMINTENT = layout.offsetof(35); + DMMEDIATYPE = layout.offsetof(36); + DMDITHERTYPE = layout.offsetof(37); + DMRESERVED1 = layout.offsetof(38); + DMRESERVED2 = layout.offsetof(39); + DMPANNINGWIDTH = layout.offsetof(40); + DMPANNINGHEIGHT = layout.offsetof(41); + } + + protected DEVMODE(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected DEVMODE create(long address, @Nullable ByteBuffer container) { + return new DEVMODE(address, container); + } + + /** + * Creates a {@code DEVMODE} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public DEVMODE(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** + * A zero-terminated character array that specifies the "friendly" name of the printer or display; for example, "PCL/HP LaserJet" in the case of PCL/HP + * LaserJet. This string is unique among device drivers. Note that this name may be truncated to fit in the {@code dmDeviceName} array. + */ + @NativeType("TCHAR[32]") + public ByteBuffer dmDeviceName() { return ndmDeviceName(address()); } + /** + * A zero-terminated character array that specifies the "friendly" name of the printer or display; for example, "PCL/HP LaserJet" in the case of PCL/HP + * LaserJet. This string is unique among device drivers. Note that this name may be truncated to fit in the {@code dmDeviceName} array. + */ + @NativeType("TCHAR[32]") + public String dmDeviceNameString() { return ndmDeviceNameString(address()); } + /** + * the version number of the initialization data specification on which the structure is based. To ensure the correct version is used for any operating + * system, use {@link GDI32#DM_SPECVERSION}. + */ + @NativeType("WORD") + public short dmSpecVersion() { return ndmSpecVersion(address()); } + /** the driver version number assigned by the driver developer */ + @NativeType("WORD") + public short dmDriverVersion() { return ndmDriverVersion(address()); } + /** + * specifies the size, in bytes, of the {@code DEVMODE} structure, not including any private driver-specific data that might follow the structure's + * public members. Set this member to {@link #SIZEOF} to indicate the version of the {@code DEVMODE} structure being used. + */ + @NativeType("WORD") + public short dmSize() { return ndmSize(address()); } + /** + * contains the number of bytes of private driver-data that follow this structure. If a device driver does not use device-specific information, set this + * member to zero. + */ + @NativeType("WORD") + public short dmDriverExtra() { return ndmDriverExtra(address()); } + /** + * specifies whether certain members of the {@code DEVMODE} structure have been initialized. If a member is initialized, its corresponding bit is set + * otherwise the bit is clear. A driver supports only those {@code DEVMODE} members that are appropriate for the printer or display technology. + */ + @NativeType("DWORD") + public int dmFields() { return ndmFields(address()); } + /** for printer devices only */ + public short dmOrientation() { return ndmOrientation(address()); } + /** for printer devices only */ + public short dmPaperSize() { return ndmPaperSize(address()); } + /** for printer devices only */ + public short dmPaperLength() { return ndmPaperLength(address()); } + /** for printer devices only */ + public short dmPaperWidth() { return ndmPaperWidth(address()); } + /** for printer devices only */ + public short dmScale() { return ndmScale(address()); } + /** for printer devices only */ + public short dmCopies() { return ndmCopies(address()); } + /** for printer devices only */ + public short dmDefaultSource() { return ndmDefaultSource(address()); } + /** for printer devices only */ + public short dmPrintQuality() { return ndmPrintQuality(address()); } + /** + * for display devices only, a {@link POINTL} structure that indicates the positional coordinates of the display device in reference to the desktop + * area. The primary display device is always located at coordinates (0,0). + */ + public POINTL dmPosition() { return ndmPosition(address()); } + /** + * for display devices only, the orientation at which images should be presented. If {@link GDI32#DM_DISPLAYORIENTATION} is not set, this member must be + * zero. If {@link GDI32#DM_DISPLAYORIENTATION} is set, this member must be one of the following values:
    {@link GDI32#DMDO_DEFAULT}, {@link GDI32#DMDO_90}, {@link GDI32#DMDO_180}, {@link GDI32#DMDO_270} + * + *

    To determine whether the display orientation is portrait or landscape orientation, check the ratio of {@code dmPelsWidth} to + * {@code dmPelsHeight}.

    + */ + @NativeType("DWORD") + public int dmDisplayOrientation() { return ndmDisplayOrientation(address()); } + /** + * for fixed-resolution display devices only, how the display presents a low-resolution mode on a higher-resolution display. For example, if a + * display device's resolution is fixed at 1024 x 768 pixels but its mode is set to 640 x 480 pixels, the device can either display a 640 x 480 + * image somewhere in the interior of the 1024 x 768 screen space or stretch the 640 x 480 image to fill the larger screen space. If + * {@link GDI32#DM_DISPLAYFIXEDOUTPUT} is not set, this member must be zero. If {@link GDI32#DM_DISPLAYFIXEDOUTPUT} is set, this member must be one of the + * following values:
    {@link GDI32#DMDFO_DEFAULT}, {@link GDI32#DMDFO_CENTER}, {@link GDI32#DMDFO_STRETCH} + */ + @NativeType("DWORD") + public int dmDisplayFixedOutput() { return ndmDisplayFixedOutput(address()); } + /** for printer devices only */ + public short dmColor() { return ndmColor(address()); } + /** for printer devices only */ + public short dmDuplex() { return ndmDuplex(address()); } + /** for printer devices only */ + public short dmYResolution() { return ndmYResolution(address()); } + /** for printer devices only */ + public short dmTTOption() { return ndmTTOption(address()); } + /** for printer devices only */ + public short dmCollate() { return ndmCollate(address()); } + /** for printer devices only */ + @NativeType("TCHAR[32]") + public ByteBuffer dmFormName() { return ndmFormName(address()); } + /** for printer devices only */ + @NativeType("TCHAR[32]") + public String dmFormNameString() { return ndmFormNameString(address()); } + /** the number of pixels per logical inch */ + @NativeType("WORD") + public short dmLogPixels() { return ndmLogPixels(address()); } + /** + * specifies the color resolution, in bits per pixel, of the display device (for example: 4 bits for 16 colors, 8 bits for 256 colors, or 16 bits for + * 65,536 colors) + */ + @NativeType("DWORD") + public int dmBitsPerPel() { return ndmBitsPerPel(address()); } + /** specifies the width, in pixels, of the visible device surface */ + @NativeType("DWORD") + public int dmPelsWidth() { return ndmPelsWidth(address()); } + /** specifies the height, in pixels, of the visible device surface */ + @NativeType("DWORD") + public int dmPelsHeight() { return ndmPelsHeight(address()); } + /** specifies the device's display mode, one or more of:
    {@link GDI32#DM_INTERLACED}, {@link GDI32#DMDISPLAYFLAGS_TEXTMODE} */ + @NativeType("DWORD") + public int dmDisplayFlags() { return ndmDisplayFlags(address()); } + /** for printer devices only */ + @NativeType("DWORD") + public int dmNup() { return ndmNup(address()); } + /** + * specifies the frequency, in hertz (cycles per second), of the display device in a particular mode. This value is also known as the display device's + * vertical refresh rate. + * + *

    When you call the {@link User32#EnumDisplaySettingsEx} function, the {@code dmDisplayFrequency} member may return with the value 0 or 1. These values + * represent the display hardware's default refresh rate. This default rate is typically set by switches on a display card or computer motherboard, or by + * a configuration program that does not use display functions such as {@code ChangeDisplaySettingsEx}.

    + */ + @NativeType("DWORD") + public int dmDisplayFrequency() { return ndmDisplayFrequency(address()); } + /** for printer devices only */ + @NativeType("DWORD") + public int dmICMMethod() { return ndmICMMethod(address()); } + /** for printer devices only */ + @NativeType("DWORD") + public int dmICMIntent() { return ndmICMIntent(address()); } + /** for printer devices only */ + @NativeType("DWORD") + public int dmMediaType() { return ndmMediaType(address()); } + /** for printer devices only */ + @NativeType("DWORD") + public int dmDitherType() { return ndmDitherType(address()); } + /** not used; must be zero */ + @NativeType("DWORD") + public int dmReserved1() { return ndmReserved1(address()); } + /** not used; must be zero */ + @NativeType("DWORD") + public int dmReserved2() { return ndmReserved2(address()); } + /** this member must be zero */ + @NativeType("DWORD") + public int dmPanningWidth() { return ndmPanningWidth(address()); } + /** this member must be zero */ + @NativeType("DWORD") + public int dmPanningHeight() { return ndmPanningHeight(address()); } + + /** Sets the specified value to the {@link #dmSpecVersion} field. */ + public DEVMODE dmSpecVersion(@NativeType("WORD") short value) { ndmSpecVersion(address(), value); return this; } + /** Sets the specified value to the {@link #dmSize} field. */ + public DEVMODE dmSize(@NativeType("WORD") short value) { ndmSize(address(), value); return this; } + /** Sets the specified value to the {@link #dmDriverExtra} field. */ + public DEVMODE dmDriverExtra(@NativeType("WORD") short value) { ndmDriverExtra(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public DEVMODE set(DEVMODE src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code DEVMODE} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static DEVMODE malloc() { + return new DEVMODE(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code DEVMODE} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static DEVMODE calloc() { + return new DEVMODE(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code DEVMODE} instance allocated with {@link BufferUtils}. */ + public static DEVMODE create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new DEVMODE(memAddress(container), container); + } + + /** Returns a new {@code DEVMODE} instance for the specified memory address. */ + public static DEVMODE create(long address) { + return new DEVMODE(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static DEVMODE createSafe(long address) { + return address == NULL ? null : new DEVMODE(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static DEVMODE mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static DEVMODE callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static DEVMODE mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static DEVMODE callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code DEVMODE} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static DEVMODE malloc(MemoryStack stack) { + return new DEVMODE(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code DEVMODE} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static DEVMODE calloc(MemoryStack stack) { + return new DEVMODE(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #dmDeviceName}. */ + public static ByteBuffer ndmDeviceName(long struct) { return memByteBuffer(struct + DEVMODE.DMDEVICENAME, 32 * 2); } + /** Unsafe version of {@link #dmDeviceNameString}. */ + public static String ndmDeviceNameString(long struct) { return memUTF16(struct + DEVMODE.DMDEVICENAME); } + /** Unsafe version of {@link #dmSpecVersion}. */ + public static short ndmSpecVersion(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMSPECVERSION); } + /** Unsafe version of {@link #dmDriverVersion}. */ + public static short ndmDriverVersion(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMDRIVERVERSION); } + /** Unsafe version of {@link #dmSize}. */ + public static short ndmSize(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMSIZE); } + /** Unsafe version of {@link #dmDriverExtra}. */ + public static short ndmDriverExtra(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMDRIVEREXTRA); } + /** Unsafe version of {@link #dmFields}. */ + public static int ndmFields(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMFIELDS); } + /** Unsafe version of {@link #dmOrientation}. */ + public static short ndmOrientation(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMORIENTATION); } + /** Unsafe version of {@link #dmPaperSize}. */ + public static short ndmPaperSize(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMPAPERSIZE); } + /** Unsafe version of {@link #dmPaperLength}. */ + public static short ndmPaperLength(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMPAPERLENGTH); } + /** Unsafe version of {@link #dmPaperWidth}. */ + public static short ndmPaperWidth(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMPAPERWIDTH); } + /** Unsafe version of {@link #dmScale}. */ + public static short ndmScale(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMSCALE); } + /** Unsafe version of {@link #dmCopies}. */ + public static short ndmCopies(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMCOPIES); } + /** Unsafe version of {@link #dmDefaultSource}. */ + public static short ndmDefaultSource(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMDEFAULTSOURCE); } + /** Unsafe version of {@link #dmPrintQuality}. */ + public static short ndmPrintQuality(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMPRINTQUALITY); } + /** Unsafe version of {@link #dmPosition}. */ + public static POINTL ndmPosition(long struct) { return POINTL.create(struct + DEVMODE.DMPOSITION); } + /** Unsafe version of {@link #dmDisplayOrientation}. */ + public static int ndmDisplayOrientation(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMDISPLAYORIENTATION); } + /** Unsafe version of {@link #dmDisplayFixedOutput}. */ + public static int ndmDisplayFixedOutput(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMDISPLAYFIXEDOUTPUT); } + /** Unsafe version of {@link #dmColor}. */ + public static short ndmColor(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMCOLOR); } + /** Unsafe version of {@link #dmDuplex}. */ + public static short ndmDuplex(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMDUPLEX); } + /** Unsafe version of {@link #dmYResolution}. */ + public static short ndmYResolution(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMYRESOLUTION); } + /** Unsafe version of {@link #dmTTOption}. */ + public static short ndmTTOption(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMTTOPTION); } + /** Unsafe version of {@link #dmCollate}. */ + public static short ndmCollate(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMCOLLATE); } + /** Unsafe version of {@link #dmFormName}. */ + public static ByteBuffer ndmFormName(long struct) { return memByteBuffer(struct + DEVMODE.DMFORMNAME, 32 * 2); } + /** Unsafe version of {@link #dmFormNameString}. */ + public static String ndmFormNameString(long struct) { return memUTF16(struct + DEVMODE.DMFORMNAME); } + /** Unsafe version of {@link #dmLogPixels}. */ + public static short ndmLogPixels(long struct) { return UNSAFE.getShort(null, struct + DEVMODE.DMLOGPIXELS); } + /** Unsafe version of {@link #dmBitsPerPel}. */ + public static int ndmBitsPerPel(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMBITSPERPEL); } + /** Unsafe version of {@link #dmPelsWidth}. */ + public static int ndmPelsWidth(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMPELSWIDTH); } + /** Unsafe version of {@link #dmPelsHeight}. */ + public static int ndmPelsHeight(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMPELSHEIGHT); } + /** Unsafe version of {@link #dmDisplayFlags}. */ + public static int ndmDisplayFlags(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMDISPLAYFLAGS); } + /** Unsafe version of {@link #dmNup}. */ + public static int ndmNup(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMNUP); } + /** Unsafe version of {@link #dmDisplayFrequency}. */ + public static int ndmDisplayFrequency(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMDISPLAYFREQUENCY); } + /** Unsafe version of {@link #dmICMMethod}. */ + public static int ndmICMMethod(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMICMMETHOD); } + /** Unsafe version of {@link #dmICMIntent}. */ + public static int ndmICMIntent(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMICMINTENT); } + /** Unsafe version of {@link #dmMediaType}. */ + public static int ndmMediaType(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMMEDIATYPE); } + /** Unsafe version of {@link #dmDitherType}. */ + public static int ndmDitherType(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMDITHERTYPE); } + /** Unsafe version of {@link #dmReserved1}. */ + public static int ndmReserved1(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMRESERVED1); } + /** Unsafe version of {@link #dmReserved2}. */ + public static int ndmReserved2(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMRESERVED2); } + /** Unsafe version of {@link #dmPanningWidth}. */ + public static int ndmPanningWidth(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMPANNINGWIDTH); } + /** Unsafe version of {@link #dmPanningHeight}. */ + public static int ndmPanningHeight(long struct) { return UNSAFE.getInt(null, struct + DEVMODE.DMPANNINGHEIGHT); } + + /** Unsafe version of {@link #dmSpecVersion(short) dmSpecVersion}. */ + public static void ndmSpecVersion(long struct, short value) { UNSAFE.putShort(null, struct + DEVMODE.DMSPECVERSION, value); } + /** Unsafe version of {@link #dmSize(short) dmSize}. */ + public static void ndmSize(long struct, short value) { UNSAFE.putShort(null, struct + DEVMODE.DMSIZE, value); } + /** Unsafe version of {@link #dmDriverExtra(short) dmDriverExtra}. */ + public static void ndmDriverExtra(long struct, short value) { UNSAFE.putShort(null, struct + DEVMODE.DMDRIVEREXTRA, value); } + + // ----------------------------------- + + /** An array of {@link DEVMODE} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final DEVMODE ELEMENT_FACTORY = DEVMODE.create(-1L); + + /** + * Creates a new {@code DEVMODE.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link DEVMODE#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected DEVMODE getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the {@link DEVMODE#dmDeviceName} field. */ + @NativeType("TCHAR[32]") + public ByteBuffer dmDeviceName() { return DEVMODE.ndmDeviceName(address()); } + /** @return the null-terminated string stored in the {@link DEVMODE#dmDeviceName} field. */ + @NativeType("TCHAR[32]") + public String dmDeviceNameString() { return DEVMODE.ndmDeviceNameString(address()); } + /** @return the value of the {@link DEVMODE#dmSpecVersion} field. */ + @NativeType("WORD") + public short dmSpecVersion() { return DEVMODE.ndmSpecVersion(address()); } + /** @return the value of the {@link DEVMODE#dmDriverVersion} field. */ + @NativeType("WORD") + public short dmDriverVersion() { return DEVMODE.ndmDriverVersion(address()); } + /** @return the value of the {@link DEVMODE#dmSize} field. */ + @NativeType("WORD") + public short dmSize() { return DEVMODE.ndmSize(address()); } + /** @return the value of the {@link DEVMODE#dmDriverExtra} field. */ + @NativeType("WORD") + public short dmDriverExtra() { return DEVMODE.ndmDriverExtra(address()); } + /** @return the value of the {@link DEVMODE#dmFields} field. */ + @NativeType("DWORD") + public int dmFields() { return DEVMODE.ndmFields(address()); } + /** @return the value of the {@link DEVMODE#dmOrientation} field. */ + public short dmOrientation() { return DEVMODE.ndmOrientation(address()); } + /** @return the value of the {@link DEVMODE#dmPaperSize} field. */ + public short dmPaperSize() { return DEVMODE.ndmPaperSize(address()); } + /** @return the value of the {@link DEVMODE#dmPaperLength} field. */ + public short dmPaperLength() { return DEVMODE.ndmPaperLength(address()); } + /** @return the value of the {@link DEVMODE#dmPaperWidth} field. */ + public short dmPaperWidth() { return DEVMODE.ndmPaperWidth(address()); } + /** @return the value of the {@link DEVMODE#dmScale} field. */ + public short dmScale() { return DEVMODE.ndmScale(address()); } + /** @return the value of the {@link DEVMODE#dmCopies} field. */ + public short dmCopies() { return DEVMODE.ndmCopies(address()); } + /** @return the value of the {@link DEVMODE#dmDefaultSource} field. */ + public short dmDefaultSource() { return DEVMODE.ndmDefaultSource(address()); } + /** @return the value of the {@link DEVMODE#dmPrintQuality} field. */ + public short dmPrintQuality() { return DEVMODE.ndmPrintQuality(address()); } + /** @return a {@link POINTL} view of the {@link DEVMODE#dmPosition} field. */ + public POINTL dmPosition() { return DEVMODE.ndmPosition(address()); } + /** @return the value of the {@link DEVMODE#dmDisplayOrientation} field. */ + @NativeType("DWORD") + public int dmDisplayOrientation() { return DEVMODE.ndmDisplayOrientation(address()); } + /** @return the value of the {@link DEVMODE#dmDisplayFixedOutput} field. */ + @NativeType("DWORD") + public int dmDisplayFixedOutput() { return DEVMODE.ndmDisplayFixedOutput(address()); } + /** @return the value of the {@link DEVMODE#dmColor} field. */ + public short dmColor() { return DEVMODE.ndmColor(address()); } + /** @return the value of the {@link DEVMODE#dmDuplex} field. */ + public short dmDuplex() { return DEVMODE.ndmDuplex(address()); } + /** @return the value of the {@link DEVMODE#dmYResolution} field. */ + public short dmYResolution() { return DEVMODE.ndmYResolution(address()); } + /** @return the value of the {@link DEVMODE#dmTTOption} field. */ + public short dmTTOption() { return DEVMODE.ndmTTOption(address()); } + /** @return the value of the {@link DEVMODE#dmCollate} field. */ + public short dmCollate() { return DEVMODE.ndmCollate(address()); } + /** @return a {@link ByteBuffer} view of the {@link DEVMODE#dmFormName} field. */ + @NativeType("TCHAR[32]") + public ByteBuffer dmFormName() { return DEVMODE.ndmFormName(address()); } + /** @return the null-terminated string stored in the {@link DEVMODE#dmFormName} field. */ + @NativeType("TCHAR[32]") + public String dmFormNameString() { return DEVMODE.ndmFormNameString(address()); } + /** @return the value of the {@link DEVMODE#dmLogPixels} field. */ + @NativeType("WORD") + public short dmLogPixels() { return DEVMODE.ndmLogPixels(address()); } + /** @return the value of the {@link DEVMODE#dmBitsPerPel} field. */ + @NativeType("DWORD") + public int dmBitsPerPel() { return DEVMODE.ndmBitsPerPel(address()); } + /** @return the value of the {@link DEVMODE#dmPelsWidth} field. */ + @NativeType("DWORD") + public int dmPelsWidth() { return DEVMODE.ndmPelsWidth(address()); } + /** @return the value of the {@link DEVMODE#dmPelsHeight} field. */ + @NativeType("DWORD") + public int dmPelsHeight() { return DEVMODE.ndmPelsHeight(address()); } + /** @return the value of the {@link DEVMODE#dmDisplayFlags} field. */ + @NativeType("DWORD") + public int dmDisplayFlags() { return DEVMODE.ndmDisplayFlags(address()); } + /** @return the value of the {@link DEVMODE#dmNup} field. */ + @NativeType("DWORD") + public int dmNup() { return DEVMODE.ndmNup(address()); } + /** @return the value of the {@link DEVMODE#dmDisplayFrequency} field. */ + @NativeType("DWORD") + public int dmDisplayFrequency() { return DEVMODE.ndmDisplayFrequency(address()); } + /** @return the value of the {@link DEVMODE#dmICMMethod} field. */ + @NativeType("DWORD") + public int dmICMMethod() { return DEVMODE.ndmICMMethod(address()); } + /** @return the value of the {@link DEVMODE#dmICMIntent} field. */ + @NativeType("DWORD") + public int dmICMIntent() { return DEVMODE.ndmICMIntent(address()); } + /** @return the value of the {@link DEVMODE#dmMediaType} field. */ + @NativeType("DWORD") + public int dmMediaType() { return DEVMODE.ndmMediaType(address()); } + /** @return the value of the {@link DEVMODE#dmDitherType} field. */ + @NativeType("DWORD") + public int dmDitherType() { return DEVMODE.ndmDitherType(address()); } + /** @return the value of the {@link DEVMODE#dmReserved1} field. */ + @NativeType("DWORD") + public int dmReserved1() { return DEVMODE.ndmReserved1(address()); } + /** @return the value of the {@link DEVMODE#dmReserved2} field. */ + @NativeType("DWORD") + public int dmReserved2() { return DEVMODE.ndmReserved2(address()); } + /** @return the value of the {@link DEVMODE#dmPanningWidth} field. */ + @NativeType("DWORD") + public int dmPanningWidth() { return DEVMODE.ndmPanningWidth(address()); } + /** @return the value of the {@link DEVMODE#dmPanningHeight} field. */ + @NativeType("DWORD") + public int dmPanningHeight() { return DEVMODE.ndmPanningHeight(address()); } + + /** Sets the specified value to the {@link DEVMODE#dmSpecVersion} field. */ + public Buffer dmSpecVersion(@NativeType("WORD") short value) { DEVMODE.ndmSpecVersion(address(), value); return this; } + /** Sets the specified value to the {@link DEVMODE#dmSize} field. */ + public Buffer dmSize(@NativeType("WORD") short value) { DEVMODE.ndmSize(address(), value); return this; } + /** Sets the specified value to the {@link DEVMODE#dmDriverExtra} field. */ + public Buffer dmDriverExtra(@NativeType("WORD") short value) { DEVMODE.ndmDriverExtra(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DISPLAY_DEVICE.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DISPLAY_DEVICE.java new file mode 100644 index 000000000..8addcb4bf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/DISPLAY_DEVICE.java @@ -0,0 +1,373 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Receives information about the display device specified by the {@code iDevNum} parameter of the {@link User32#EnumDisplayDevices} function. + * + *

    The four string members are set based on the parameters passed to {@code EnumDisplayDevices}. If the {@code lpDevice} param is {@code NULL}, then + * {@code DISPLAY_DEVICE} is filled in with information about the display adapter(s). If it is a valid device name, then it is filled in with information + * about the monitor(s) for that device.

    + * + *

    Layout

    + * + *
    
    + * struct DISPLAY_DEVICE {
    + *     DWORD {@link #cb};
    + *     TCHAR {@link #DeviceName}[32];
    + *     TCHAR {@link #DeviceString}[128];
    + *     DWORD {@link #StateFlags};
    + *     TCHAR {@link #DeviceID}[128];
    + *     TCHAR {@link #DeviceKey}[128];
    + * }
    + */ +public class DISPLAY_DEVICE extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + CB, + DEVICENAME, + DEVICESTRING, + STATEFLAGS, + DEVICEID, + DEVICEKEY; + + static { + Layout layout = __struct( + __member(4), + __array(2, 32), + __array(2, 128), + __member(4), + __array(2, 128), + __array(2, 128) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + CB = layout.offsetof(0); + DEVICENAME = layout.offsetof(1); + DEVICESTRING = layout.offsetof(2); + STATEFLAGS = layout.offsetof(3); + DEVICEID = layout.offsetof(4); + DEVICEKEY = layout.offsetof(5); + } + + protected DISPLAY_DEVICE(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected DISPLAY_DEVICE create(long address, @Nullable ByteBuffer container) { + return new DISPLAY_DEVICE(address, container); + } + + /** + * Creates a {@code DISPLAY_DEVICE} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public DISPLAY_DEVICE(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** size, in bytes, of the {@code DISPLAY_DEVICE} structure. This must be initialized prior to calling {@link User32#EnumDisplayDevices}. */ + @NativeType("DWORD") + public int cb() { return ncb(address()); } + /** an array of characters identifying the device name. This is either the adapter device or the monitor device. */ + @NativeType("TCHAR[32]") + public ByteBuffer DeviceName() { return nDeviceName(address()); } + /** an array of characters identifying the device name. This is either the adapter device or the monitor device. */ + @NativeType("TCHAR[32]") + public String DeviceNameString() { return nDeviceNameString(address()); } + /** an array of characters containing the device context string. This is either a description of the display adapter or of the display monitor. */ + @NativeType("TCHAR[128]") + public ByteBuffer DeviceString() { return nDeviceString(address()); } + /** an array of characters containing the device context string. This is either a description of the display adapter or of the display monitor. */ + @NativeType("TCHAR[128]") + public String DeviceStringString() { return nDeviceStringString(address()); } + /** device state flags */ + @NativeType("DWORD") + public int StateFlags() { return nStateFlags(address()); } + /** not used */ + @NativeType("TCHAR[128]") + public ByteBuffer DeviceID() { return nDeviceID(address()); } + /** not used */ + @NativeType("TCHAR[128]") + public String DeviceIDString() { return nDeviceIDString(address()); } + /** reserved */ + @NativeType("TCHAR[128]") + public ByteBuffer DeviceKey() { return nDeviceKey(address()); } + /** reserved */ + @NativeType("TCHAR[128]") + public String DeviceKeyString() { return nDeviceKeyString(address()); } + + /** Sets the specified value to the {@link #cb} field. */ + public DISPLAY_DEVICE cb(@NativeType("DWORD") int value) { ncb(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public DISPLAY_DEVICE set(DISPLAY_DEVICE src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code DISPLAY_DEVICE} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static DISPLAY_DEVICE malloc() { + return new DISPLAY_DEVICE(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code DISPLAY_DEVICE} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static DISPLAY_DEVICE calloc() { + return new DISPLAY_DEVICE(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code DISPLAY_DEVICE} instance allocated with {@link BufferUtils}. */ + public static DISPLAY_DEVICE create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new DISPLAY_DEVICE(memAddress(container), container); + } + + /** Returns a new {@code DISPLAY_DEVICE} instance for the specified memory address. */ + public static DISPLAY_DEVICE create(long address) { + return new DISPLAY_DEVICE(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static DISPLAY_DEVICE createSafe(long address) { + return address == NULL ? null : new DISPLAY_DEVICE(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static DISPLAY_DEVICE mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static DISPLAY_DEVICE callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static DISPLAY_DEVICE mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static DISPLAY_DEVICE callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code DISPLAY_DEVICE} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static DISPLAY_DEVICE malloc(MemoryStack stack) { + return new DISPLAY_DEVICE(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code DISPLAY_DEVICE} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static DISPLAY_DEVICE calloc(MemoryStack stack) { + return new DISPLAY_DEVICE(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #cb}. */ + public static int ncb(long struct) { return UNSAFE.getInt(null, struct + DISPLAY_DEVICE.CB); } + /** Unsafe version of {@link #DeviceName}. */ + public static ByteBuffer nDeviceName(long struct) { return memByteBuffer(struct + DISPLAY_DEVICE.DEVICENAME, 32 * 2); } + /** Unsafe version of {@link #DeviceNameString}. */ + public static String nDeviceNameString(long struct) { return memUTF16(struct + DISPLAY_DEVICE.DEVICENAME); } + /** Unsafe version of {@link #DeviceString}. */ + public static ByteBuffer nDeviceString(long struct) { return memByteBuffer(struct + DISPLAY_DEVICE.DEVICESTRING, 128 * 2); } + /** Unsafe version of {@link #DeviceStringString}. */ + public static String nDeviceStringString(long struct) { return memUTF16(struct + DISPLAY_DEVICE.DEVICESTRING); } + /** Unsafe version of {@link #StateFlags}. */ + public static int nStateFlags(long struct) { return UNSAFE.getInt(null, struct + DISPLAY_DEVICE.STATEFLAGS); } + /** Unsafe version of {@link #DeviceID}. */ + public static ByteBuffer nDeviceID(long struct) { return memByteBuffer(struct + DISPLAY_DEVICE.DEVICEID, 128 * 2); } + /** Unsafe version of {@link #DeviceIDString}. */ + public static String nDeviceIDString(long struct) { return memUTF16(struct + DISPLAY_DEVICE.DEVICEID); } + /** Unsafe version of {@link #DeviceKey}. */ + public static ByteBuffer nDeviceKey(long struct) { return memByteBuffer(struct + DISPLAY_DEVICE.DEVICEKEY, 128 * 2); } + /** Unsafe version of {@link #DeviceKeyString}. */ + public static String nDeviceKeyString(long struct) { return memUTF16(struct + DISPLAY_DEVICE.DEVICEKEY); } + + /** Unsafe version of {@link #cb(int) cb}. */ + public static void ncb(long struct, int value) { UNSAFE.putInt(null, struct + DISPLAY_DEVICE.CB, value); } + + // ----------------------------------- + + /** An array of {@link DISPLAY_DEVICE} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final DISPLAY_DEVICE ELEMENT_FACTORY = DISPLAY_DEVICE.create(-1L); + + /** + * Creates a new {@code DISPLAY_DEVICE.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link DISPLAY_DEVICE#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected DISPLAY_DEVICE getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link DISPLAY_DEVICE#cb} field. */ + @NativeType("DWORD") + public int cb() { return DISPLAY_DEVICE.ncb(address()); } + /** @return a {@link ByteBuffer} view of the {@link DISPLAY_DEVICE#DeviceName} field. */ + @NativeType("TCHAR[32]") + public ByteBuffer DeviceName() { return DISPLAY_DEVICE.nDeviceName(address()); } + /** @return the null-terminated string stored in the {@link DISPLAY_DEVICE#DeviceName} field. */ + @NativeType("TCHAR[32]") + public String DeviceNameString() { return DISPLAY_DEVICE.nDeviceNameString(address()); } + /** @return a {@link ByteBuffer} view of the {@link DISPLAY_DEVICE#DeviceString} field. */ + @NativeType("TCHAR[128]") + public ByteBuffer DeviceString() { return DISPLAY_DEVICE.nDeviceString(address()); } + /** @return the null-terminated string stored in the {@link DISPLAY_DEVICE#DeviceString} field. */ + @NativeType("TCHAR[128]") + public String DeviceStringString() { return DISPLAY_DEVICE.nDeviceStringString(address()); } + /** @return the value of the {@link DISPLAY_DEVICE#StateFlags} field. */ + @NativeType("DWORD") + public int StateFlags() { return DISPLAY_DEVICE.nStateFlags(address()); } + /** @return a {@link ByteBuffer} view of the {@link DISPLAY_DEVICE#DeviceID} field. */ + @NativeType("TCHAR[128]") + public ByteBuffer DeviceID() { return DISPLAY_DEVICE.nDeviceID(address()); } + /** @return the null-terminated string stored in the {@link DISPLAY_DEVICE#DeviceID} field. */ + @NativeType("TCHAR[128]") + public String DeviceIDString() { return DISPLAY_DEVICE.nDeviceIDString(address()); } + /** @return a {@link ByteBuffer} view of the {@link DISPLAY_DEVICE#DeviceKey} field. */ + @NativeType("TCHAR[128]") + public ByteBuffer DeviceKey() { return DISPLAY_DEVICE.nDeviceKey(address()); } + /** @return the null-terminated string stored in the {@link DISPLAY_DEVICE#DeviceKey} field. */ + @NativeType("TCHAR[128]") + public String DeviceKeyString() { return DISPLAY_DEVICE.nDeviceKeyString(address()); } + + /** Sets the specified value to the {@link DISPLAY_DEVICE#cb} field. */ + public Buffer cb(@NativeType("DWORD") int value) { DISPLAY_DEVICE.ncb(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/GDI32.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/GDI32.java new file mode 100644 index 000000000..97b6edd31 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/GDI32.java @@ -0,0 +1,286 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to wingdi.h and gdi32.dll. */ +public class GDI32 { + + private static final SharedLibrary GDI32 = Library.loadNative(GDI32.class, "org.lwjgl", "gdi32"); + + /** Contains the function pointers loaded from the gdi32 {@link SharedLibrary}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + ChoosePixelFormat = apiGetFunctionAddress(GDI32, "ChoosePixelFormat"), + DescribePixelFormat = apiGetFunctionAddress(GDI32, "DescribePixelFormat"), + GetPixelFormat = apiGetFunctionAddress(GDI32, "GetPixelFormat"), + SetPixelFormat = apiGetFunctionAddress(GDI32, "SetPixelFormat"), + SwapBuffers = apiGetFunctionAddress(GDI32, "SwapBuffers"); + + } + + /** Returns the gdi32 {@link SharedLibrary}. */ + public static SharedLibrary getLibrary() { + return GDI32; + } + + /** Display device state flags. */ + public static final int + DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = 0x1, + DISPLAY_DEVICE_MULTI_DRIVER = 0x2, + DISPLAY_DEVICE_PRIMARY_DEVICE = 0x4, + DISPLAY_DEVICE_MIRRORING_DRIVER = 0x8, + DISPLAY_DEVICE_VGA_COMPATIBLE = 0x10, + DISPLAY_DEVICE_REMOVABLE = 0x20, + DISPLAY_DEVICE_MODESPRUNED = 0x8000000, + DISPLAY_DEVICE_REMOTE = 0x4000000, + DISPLAY_DEVICE_DISCONNECT = 0x2000000, + DISPLAY_DEVICE_TS_COMPATIBLE = 0x200000, + DISPLAY_DEVICE_UNSAFE_MODES_ON = 0x80000; + + /** Child display device state flags. */ + public static final int + DISPLAY_DEVICE_ACTIVE = 0x1, + DISPLAY_DEVICE_ATTACHED = 0x2; + + /** {@link DEVMODE} specification version. */ + public static final int DM_SPECVERSION = 0x401; + + /** {@link DEVMODE} field selection bits. */ + public static final int + DM_ORIENTATION = 0x1, + DM_PAPERSIZE = 0x2, + DM_PAPERLENGTH = 0x4, + DM_PAPERWIDTH = 0x8, + DM_SCALE = 0x10, + DM_POSITION = 0x20, + DM_NUP = 0x40, + DM_DISPLAYORIENTATION = 0x80, + DM_COPIES = 0x100, + DM_DEFAULTSOURCE = 0x200, + DM_PRINTQUALITY = 0x400, + DM_COLOR = 0x800, + DM_DUPLEX = 0x1000, + DM_YRESOLUTION = 0x2000, + DM_TTOPTION = 0x4000, + DM_COLLATE = 0x8000, + DM_FORMNAME = 0x10000, + DM_LOGPIXELS = 0x20000, + DM_BITSPERPEL = 0x40000, + DM_PELSWIDTH = 0x80000, + DM_PELSHEIGHT = 0x100000, + DM_DISPLAYFLAGS = 0x200000, + DM_DISPLAYFREQUENCY = 0x400000, + DM_ICMMETHOD = 0x800000, + DM_ICMINTENT = 0x1000000, + DM_MEDIATYPE = 0x2000000, + DM_DITHERTYPE = 0x4000000, + DM_PANNINGWIDTH = 0x8000000, + DM_PANNINGHEIGHT = 0x10000000, + DM_DISPLAYFIXEDOUTPUT = 0x20000000; + + /** {@link DEVMODE} {@code dmDisplayOrientation} specifications. */ + public static final int + DMDO_DEFAULT = 0, + DMDO_90 = 1, + DMDO_180 = 2, + DMDO_270 = 3; + + /** {@link DEVMODE} {@code dmDisplayFixedOutput} specifications. */ + public static final int + DMDFO_DEFAULT = 0, + DMDFO_STRETCH = 1, + DMDFO_CENTER = 2; + + /** {@link DEVMODE} {@code dmDisplayFlags} flags. */ + public static final int + DM_INTERLACED = 0x2, + DMDISPLAYFLAGS_TEXTMODE = 0x4; + + /** {@link PIXELFORMATDESCRIPTOR} flags. */ + public static final int + PFD_DOUBLEBUFFER = 0x1, + PFD_STEREO = 0x2, + PFD_DRAW_TO_WINDOW = 0x4, + PFD_DRAW_TO_BITMAP = 0x8, + PFD_SUPPORT_GDI = 0x10, + PFD_SUPPORT_OPENGL = 0x20, + PFD_GENERIC_FORMAT = 0x40, + PFD_NEED_PALETTE = 0x80, + PFD_NEED_SYSTEM_PALETTE = 0x100, + PFD_SWAP_EXCHANGE = 0x200, + PFD_SWAP_COPY = 0x400, + PFD_SWAP_LAYER_BUFFERS = 0x800, + PFD_GENERIC_ACCELERATED = 0x1000, + PFD_SUPPORT_DIRECTDRAW = 0x2000, + PFD_DIRECT3D_ACCELERATED = 0x4000, + PFD_SUPPORT_COMPOSITION = 0x8000, + PFD_DEPTH_DONTCARE = 0x20000000, + PFD_DOUBLEBUFFER_DONTCARE = 0x40000000, + PFD_STEREO_DONTCARE = 0x80000000; + + /** {@link PIXELFORMATDESCRIPTOR} pixel types. */ + public static final byte + PFD_TYPE_RGBA = 0, + PFD_TYPE_COLORINDEX = 1; + + /** {@link PIXELFORMATDESCRIPTOR} layer types. */ + public static final byte + PFD_MAIN_PLANE = 0, + PFD_OVERLAY_PLANE = 1, + PFD_UNDERLAY_PLANE = (byte)-1; + + protected GDI32() { + throw new UnsupportedOperationException(); + } + + // --- [ ChoosePixelFormat ] --- + + /** Unsafe version of: {@link #ChoosePixelFormat} */ + public static native int nChoosePixelFormat(long hdc, long pixelFormatDescriptor, long __functionAddress); + + /** Unsafe version of: {@link #ChoosePixelFormat} */ + public static int nChoosePixelFormat(long hdc, long pixelFormatDescriptor) { + long __functionAddress = Functions.ChoosePixelFormat; + if (CHECKS) { + check(hdc); + } + return nChoosePixelFormat(hdc, pixelFormatDescriptor, __functionAddress); + } + + /** + * Attempts to match an appropriate pixel format supported by a device context to a given pixel format specification. + * + * @param hdc the device context that the function examines to determine the best match for the pixel format descriptor pointed to by {@code pixelFormatDescriptor} + * @param pixelFormatDescriptor a {@link PIXELFORMATDESCRIPTOR} structure that specifies the requested pixel format + */ + public static int ChoosePixelFormat(@NativeType("HDC") long hdc, @NativeType("PIXELFORMATDESCRIPTOR const *") PIXELFORMATDESCRIPTOR pixelFormatDescriptor) { + return nChoosePixelFormat(hdc, pixelFormatDescriptor.address()); + } + + // --- [ DescribePixelFormat ] --- + + /** Unsafe version of: {@link #DescribePixelFormat} */ + public static native int nDescribePixelFormat(long hdc, int pixelFormat, int bytes, long pixelFormatDescriptor, long __functionAddress); + + /** Unsafe version of: {@link #DescribePixelFormat} */ + public static int nDescribePixelFormat(long hdc, int pixelFormat, int bytes, long pixelFormatDescriptor) { + long __functionAddress = Functions.DescribePixelFormat; + if (CHECKS) { + check(hdc); + } + return nDescribePixelFormat(hdc, pixelFormat, bytes, pixelFormatDescriptor, __functionAddress); + } + + /** + * Obtains information about the pixel format identified by pixelFormat of the device associated with dc. The function sets the members of the + * {@link PIXELFORMATDESCRIPTOR} structure pointed to by pixelFormatDescriptor with that pixel format data. The return value is the maximum pixel format + * index of the device context. + * + * @param hdc the device context + * @param pixelFormat index that specifies the pixel format. The pixel formats that a device context supports are identified by positive one-based integer indexes. + * @param bytes the size, in bytes, of the structure pointed to by {@code pixelFormatDescriptor}. The {@code wglDescribePixelFormat} function stores no more than + * {@code bytes} bytes of data to that structure. Set this value to {@link PIXELFORMATDESCRIPTOR#SIZEOF}. + * @param pixelFormatDescriptor a {@link PIXELFORMATDESCRIPTOR} structure whose members the function sets with pixel format data. The function stores the number of bytes copied to + * the structure in the structure's {@code size} member. If, upon entry, {@code pixelFormatDescriptor} is {@code NULL}, the function writes no data to the + * structure. This is useful when you only want to obtain the maximum pixel format index of a device context. + */ + public static int DescribePixelFormat(@NativeType("HDC") long hdc, int pixelFormat, @NativeType("UINT") int bytes, @Nullable @NativeType("LPPIXELFORMATDESCRIPTOR") PIXELFORMATDESCRIPTOR pixelFormatDescriptor) { + return nDescribePixelFormat(hdc, pixelFormat, bytes, memAddressSafe(pixelFormatDescriptor)); + } + + /** + * Obtains information about the pixel format identified by pixelFormat of the device associated with dc. The function sets the members of the + * {@link PIXELFORMATDESCRIPTOR} structure pointed to by pixelFormatDescriptor with that pixel format data. The return value is the maximum pixel format + * index of the device context. + * + * @param hdc the device context + * @param pixelFormat index that specifies the pixel format. The pixel formats that a device context supports are identified by positive one-based integer indexes. + * @param pixelFormatDescriptor a {@link PIXELFORMATDESCRIPTOR} structure whose members the function sets with pixel format data. The function stores the number of bytes copied to + * the structure in the structure's {@code size} member. If, upon entry, {@code pixelFormatDescriptor} is {@code NULL}, the function writes no data to the + * structure. This is useful when you only want to obtain the maximum pixel format index of a device context. + */ + public static int DescribePixelFormat(@NativeType("HDC") long hdc, int pixelFormat, @Nullable @NativeType("LPPIXELFORMATDESCRIPTOR") PIXELFORMATDESCRIPTOR pixelFormatDescriptor) { + return nDescribePixelFormat(hdc, pixelFormat, PIXELFORMATDESCRIPTOR.SIZEOF, memAddressSafe(pixelFormatDescriptor)); + } + + // --- [ GetPixelFormat ] --- + + /** Unsafe version of: {@link #GetPixelFormat} */ + public static native int nGetPixelFormat(long hdc, long __functionAddress); + + /** + * Obtains the index of the currently selected pixel format of the specified device context. + * + * @param hdc the device context of the currently selected pixel format index returned by the function + */ + public static int GetPixelFormat(@NativeType("HDC") long hdc) { + long __functionAddress = Functions.GetPixelFormat; + if (CHECKS) { + check(hdc); + } + return nGetPixelFormat(hdc, __functionAddress); + } + + // --- [ SetPixelFormat ] --- + + /** Unsafe version of: {@link #SetPixelFormat} */ + public static native int nSetPixelFormat(long hdc, int pixelFormat, long pixelFormatDescriptor, long __functionAddress); + + /** Unsafe version of: {@link #SetPixelFormat} */ + public static int nSetPixelFormat(long hdc, int pixelFormat, long pixelFormatDescriptor) { + long __functionAddress = Functions.SetPixelFormat; + if (CHECKS) { + check(hdc); + } + return nSetPixelFormat(hdc, pixelFormat, pixelFormatDescriptor, __functionAddress); + } + + /** + * Sets the pixel format of the specified device context to the format specified by the pixelFormat index. + * + * @param hdc the device context whose pixel format the function attempts to set + * @param pixelFormat index that identifies the pixel format to set. The various pixel formats supported by a device context are identified by one-based indexes. + * @param pixelFormatDescriptor a {@link PIXELFORMATDESCRIPTOR} structure that contains the logical pixel format specification. The system's metafile component uses this structure + * to record the logical pixel format specification. The structure has no other effect upon the behavior of the SetPixelFormat function. + */ + @NativeType("BOOL") + public static boolean SetPixelFormat(@NativeType("HDC") long hdc, int pixelFormat, @Nullable @NativeType("PIXELFORMATDESCRIPTOR const *") PIXELFORMATDESCRIPTOR pixelFormatDescriptor) { + return nSetPixelFormat(hdc, pixelFormat, memAddressSafe(pixelFormatDescriptor)) != 0; + } + + // --- [ SwapBuffers ] --- + + /** Unsafe version of: {@link #SwapBuffers} */ + public static native int nSwapBuffers(long dc, long __functionAddress); + + /** + * Exchanges the front and back buffers if the current pixel format for the window referenced by the specified device context includes a back buffer. + * + * @param dc a device context. If the current pixel format for the window referenced by this device context includes a back buffer, the function exchanges the + * front and back buffers. + */ + @NativeType("BOOL") + public static boolean SwapBuffers(@NativeType("HDC") long dc) { + long __functionAddress = Functions.SwapBuffers; + if (CHECKS) { + check(dc); + } + return nSwapBuffers(dc, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/HARDWAREINPUT.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/HARDWAREINPUT.java new file mode 100644 index 000000000..b3dd4991c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/HARDWAREINPUT.java @@ -0,0 +1,326 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains information about a simulated message generated by an input device other than a keyboard or mouse. + * + *

    Layout

    + * + *
    
    + * struct HARDWAREINPUT {
    + *     DWORD {@link #uMsg};
    + *     WORD {@link #wParamL};
    + *     WORD {@link #wParamH};
    + * }
    + */ +public class HARDWAREINPUT extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + UMSG, + WPARAML, + WPARAMH; + + static { + Layout layout = __struct( + __member(4), + __member(2), + __member(2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + UMSG = layout.offsetof(0); + WPARAML = layout.offsetof(1); + WPARAMH = layout.offsetof(2); + } + + protected HARDWAREINPUT(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected HARDWAREINPUT create(long address, @Nullable ByteBuffer container) { + return new HARDWAREINPUT(address, container); + } + + /** + * Creates a {@code HARDWAREINPUT} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public HARDWAREINPUT(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the message generated by the input hardware */ + @NativeType("DWORD") + public int uMsg() { return nuMsg(address()); } + /** the low-order word of the {@code lParam} parameter for {@code uMsg} */ + @NativeType("WORD") + public short wParamL() { return nwParamL(address()); } + /** the high-order word of the {@code lParam} parameter for {@code uMsg} */ + @NativeType("WORD") + public short wParamH() { return nwParamH(address()); } + + /** Sets the specified value to the {@link #uMsg} field. */ + public HARDWAREINPUT uMsg(@NativeType("DWORD") int value) { nuMsg(address(), value); return this; } + /** Sets the specified value to the {@link #wParamL} field. */ + public HARDWAREINPUT wParamL(@NativeType("WORD") short value) { nwParamL(address(), value); return this; } + /** Sets the specified value to the {@link #wParamH} field. */ + public HARDWAREINPUT wParamH(@NativeType("WORD") short value) { nwParamH(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public HARDWAREINPUT set( + int uMsg, + short wParamL, + short wParamH + ) { + uMsg(uMsg); + wParamL(wParamL); + wParamH(wParamH); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public HARDWAREINPUT set(HARDWAREINPUT src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code HARDWAREINPUT} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static HARDWAREINPUT malloc() { + return new HARDWAREINPUT(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code HARDWAREINPUT} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static HARDWAREINPUT calloc() { + return new HARDWAREINPUT(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code HARDWAREINPUT} instance allocated with {@link BufferUtils}. */ + public static HARDWAREINPUT create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new HARDWAREINPUT(memAddress(container), container); + } + + /** Returns a new {@code HARDWAREINPUT} instance for the specified memory address. */ + public static HARDWAREINPUT create(long address) { + return new HARDWAREINPUT(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static HARDWAREINPUT createSafe(long address) { + return address == NULL ? null : new HARDWAREINPUT(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static HARDWAREINPUT mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static HARDWAREINPUT callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static HARDWAREINPUT mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static HARDWAREINPUT callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code HARDWAREINPUT} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static HARDWAREINPUT malloc(MemoryStack stack) { + return new HARDWAREINPUT(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code HARDWAREINPUT} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static HARDWAREINPUT calloc(MemoryStack stack) { + return new HARDWAREINPUT(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #uMsg}. */ + public static int nuMsg(long struct) { return UNSAFE.getInt(null, struct + HARDWAREINPUT.UMSG); } + /** Unsafe version of {@link #wParamL}. */ + public static short nwParamL(long struct) { return UNSAFE.getShort(null, struct + HARDWAREINPUT.WPARAML); } + /** Unsafe version of {@link #wParamH}. */ + public static short nwParamH(long struct) { return UNSAFE.getShort(null, struct + HARDWAREINPUT.WPARAMH); } + + /** Unsafe version of {@link #uMsg(int) uMsg}. */ + public static void nuMsg(long struct, int value) { UNSAFE.putInt(null, struct + HARDWAREINPUT.UMSG, value); } + /** Unsafe version of {@link #wParamL(short) wParamL}. */ + public static void nwParamL(long struct, short value) { UNSAFE.putShort(null, struct + HARDWAREINPUT.WPARAML, value); } + /** Unsafe version of {@link #wParamH(short) wParamH}. */ + public static void nwParamH(long struct, short value) { UNSAFE.putShort(null, struct + HARDWAREINPUT.WPARAMH, value); } + + // ----------------------------------- + + /** An array of {@link HARDWAREINPUT} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final HARDWAREINPUT ELEMENT_FACTORY = HARDWAREINPUT.create(-1L); + + /** + * Creates a new {@code HARDWAREINPUT.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link HARDWAREINPUT#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected HARDWAREINPUT getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link HARDWAREINPUT#uMsg} field. */ + @NativeType("DWORD") + public int uMsg() { return HARDWAREINPUT.nuMsg(address()); } + /** @return the value of the {@link HARDWAREINPUT#wParamL} field. */ + @NativeType("WORD") + public short wParamL() { return HARDWAREINPUT.nwParamL(address()); } + /** @return the value of the {@link HARDWAREINPUT#wParamH} field. */ + @NativeType("WORD") + public short wParamH() { return HARDWAREINPUT.nwParamH(address()); } + + /** Sets the specified value to the {@link HARDWAREINPUT#uMsg} field. */ + public Buffer uMsg(@NativeType("DWORD") int value) { HARDWAREINPUT.nuMsg(address(), value); return this; } + /** Sets the specified value to the {@link HARDWAREINPUT#wParamL} field. */ + public Buffer wParamL(@NativeType("WORD") short value) { HARDWAREINPUT.nwParamL(address(), value); return this; } + /** Sets the specified value to the {@link HARDWAREINPUT#wParamH} field. */ + public Buffer wParamH(@NativeType("WORD") short value) { HARDWAREINPUT.nwParamH(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/INPUT.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/INPUT.java new file mode 100644 index 000000000..96cd5fdfb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/INPUT.java @@ -0,0 +1,343 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Used by {@link User32#SendInput} to store information for synthesizing input events such as keystrokes, mouse movement, and mouse clicks. + * + *

    Layout

    + * + *
    
    + * struct INPUT {
    + *     DWORD {@link #type};
    + *     union {
    + *         {@link MOUSEINPUT MOUSEINPUT} {@link #DUMMYUNIONNAME_mi mi};
    + *         {@link KEYBDINPUT KEYBDINPUT} {@link #DUMMYUNIONNAME_ki ki};
    + *         {@link HARDWAREINPUT HARDWAREINPUT} {@link #DUMMYUNIONNAME_hi hi};
    + *     } DUMMYUNIONNAME;
    + * }
    + */ +public class INPUT extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + DUMMYUNIONNAME, + DUMMYUNIONNAME_MI, + DUMMYUNIONNAME_KI, + DUMMYUNIONNAME_HI; + + static { + Layout layout = __struct( + __member(4), + __union( + __member(MOUSEINPUT.SIZEOF, MOUSEINPUT.ALIGNOF), + __member(KEYBDINPUT.SIZEOF, KEYBDINPUT.ALIGNOF), + __member(HARDWAREINPUT.SIZEOF, HARDWAREINPUT.ALIGNOF) + ) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + DUMMYUNIONNAME = layout.offsetof(1); + DUMMYUNIONNAME_MI = layout.offsetof(2); + DUMMYUNIONNAME_KI = layout.offsetof(3); + DUMMYUNIONNAME_HI = layout.offsetof(4); + } + + protected INPUT(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected INPUT create(long address, @Nullable ByteBuffer container) { + return new INPUT(address, container); + } + + /** + * Creates a {@code INPUT} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public INPUT(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the type of the input event. One of:
    {@link User32#INPUT_MOUSE}{@link User32#INPUT_KEYBOARD}{@link User32#INPUT_HARDWARE}
    */ + @NativeType("DWORD") + public int type() { return ntype(address()); } + /** the information about a simulated mouse event */ + public MOUSEINPUT DUMMYUNIONNAME_mi() { return nDUMMYUNIONNAME_mi(address()); } + /** the information about a simulated keyboard event */ + public KEYBDINPUT DUMMYUNIONNAME_ki() { return nDUMMYUNIONNAME_ki(address()); } + /** the information about a simulated hardware event */ + public HARDWAREINPUT DUMMYUNIONNAME_hi() { return nDUMMYUNIONNAME_hi(address()); } + + /** Sets the specified value to the {@link #type} field. */ + public INPUT type(@NativeType("DWORD") int value) { ntype(address(), value); return this; } + /** Copies the specified {@link MOUSEINPUT} to the {@link #DUMMYUNIONNAME_mi} field. */ + public INPUT DUMMYUNIONNAME_mi(MOUSEINPUT value) { nDUMMYUNIONNAME_mi(address(), value); return this; } + /** Passes the {@link #DUMMYUNIONNAME_mi} field to the specified {@link java.util.function.Consumer Consumer}. */ + public INPUT DUMMYUNIONNAME_mi(java.util.function.Consumer consumer) { consumer.accept(DUMMYUNIONNAME_mi()); return this; } + /** Copies the specified {@link KEYBDINPUT} to the {@link #DUMMYUNIONNAME_ki} field. */ + public INPUT DUMMYUNIONNAME_ki(KEYBDINPUT value) { nDUMMYUNIONNAME_ki(address(), value); return this; } + /** Passes the {@link #DUMMYUNIONNAME_ki} field to the specified {@link java.util.function.Consumer Consumer}. */ + public INPUT DUMMYUNIONNAME_ki(java.util.function.Consumer consumer) { consumer.accept(DUMMYUNIONNAME_ki()); return this; } + /** Copies the specified {@link HARDWAREINPUT} to the {@link #DUMMYUNIONNAME_hi} field. */ + public INPUT DUMMYUNIONNAME_hi(HARDWAREINPUT value) { nDUMMYUNIONNAME_hi(address(), value); return this; } + /** Passes the {@link #DUMMYUNIONNAME_hi} field to the specified {@link java.util.function.Consumer Consumer}. */ + public INPUT DUMMYUNIONNAME_hi(java.util.function.Consumer consumer) { consumer.accept(DUMMYUNIONNAME_hi()); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public INPUT set(INPUT src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code INPUT} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static INPUT malloc() { + return new INPUT(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code INPUT} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static INPUT calloc() { + return new INPUT(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code INPUT} instance allocated with {@link BufferUtils}. */ + public static INPUT create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new INPUT(memAddress(container), container); + } + + /** Returns a new {@code INPUT} instance for the specified memory address. */ + public static INPUT create(long address) { + return new INPUT(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static INPUT createSafe(long address) { + return address == NULL ? null : new INPUT(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static INPUT mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static INPUT callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static INPUT mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static INPUT callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code INPUT} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static INPUT malloc(MemoryStack stack) { + return new INPUT(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code INPUT} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static INPUT calloc(MemoryStack stack) { + return new INPUT(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + INPUT.TYPE); } + /** Unsafe version of {@link #DUMMYUNIONNAME_mi}. */ + public static MOUSEINPUT nDUMMYUNIONNAME_mi(long struct) { return MOUSEINPUT.create(struct + INPUT.DUMMYUNIONNAME_MI); } + /** Unsafe version of {@link #DUMMYUNIONNAME_ki}. */ + public static KEYBDINPUT nDUMMYUNIONNAME_ki(long struct) { return KEYBDINPUT.create(struct + INPUT.DUMMYUNIONNAME_KI); } + /** Unsafe version of {@link #DUMMYUNIONNAME_hi}. */ + public static HARDWAREINPUT nDUMMYUNIONNAME_hi(long struct) { return HARDWAREINPUT.create(struct + INPUT.DUMMYUNIONNAME_HI); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + INPUT.TYPE, value); } + /** Unsafe version of {@link #DUMMYUNIONNAME_mi(MOUSEINPUT) DUMMYUNIONNAME_mi}. */ + public static void nDUMMYUNIONNAME_mi(long struct, MOUSEINPUT value) { memCopy(value.address(), struct + INPUT.DUMMYUNIONNAME_MI, MOUSEINPUT.SIZEOF); } + /** Unsafe version of {@link #DUMMYUNIONNAME_ki(KEYBDINPUT) DUMMYUNIONNAME_ki}. */ + public static void nDUMMYUNIONNAME_ki(long struct, KEYBDINPUT value) { memCopy(value.address(), struct + INPUT.DUMMYUNIONNAME_KI, KEYBDINPUT.SIZEOF); } + /** Unsafe version of {@link #DUMMYUNIONNAME_hi(HARDWAREINPUT) DUMMYUNIONNAME_hi}. */ + public static void nDUMMYUNIONNAME_hi(long struct, HARDWAREINPUT value) { memCopy(value.address(), struct + INPUT.DUMMYUNIONNAME_HI, HARDWAREINPUT.SIZEOF); } + + // ----------------------------------- + + /** An array of {@link INPUT} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final INPUT ELEMENT_FACTORY = INPUT.create(-1L); + + /** + * Creates a new {@code INPUT.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link INPUT#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected INPUT getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link INPUT#type} field. */ + @NativeType("DWORD") + public int type() { return INPUT.ntype(address()); } + /** @return a {@link MOUSEINPUT} view of the {@link INPUT#DUMMYUNIONNAME_mi} field. */ + public MOUSEINPUT DUMMYUNIONNAME_mi() { return INPUT.nDUMMYUNIONNAME_mi(address()); } + /** @return a {@link KEYBDINPUT} view of the {@link INPUT#DUMMYUNIONNAME_ki} field. */ + public KEYBDINPUT DUMMYUNIONNAME_ki() { return INPUT.nDUMMYUNIONNAME_ki(address()); } + /** @return a {@link HARDWAREINPUT} view of the {@link INPUT#DUMMYUNIONNAME_hi} field. */ + public HARDWAREINPUT DUMMYUNIONNAME_hi() { return INPUT.nDUMMYUNIONNAME_hi(address()); } + + /** Sets the specified value to the {@link INPUT#type} field. */ + public Buffer type(@NativeType("DWORD") int value) { INPUT.ntype(address(), value); return this; } + /** Copies the specified {@link MOUSEINPUT} to the {@link INPUT#DUMMYUNIONNAME_mi} field. */ + public Buffer DUMMYUNIONNAME_mi(MOUSEINPUT value) { INPUT.nDUMMYUNIONNAME_mi(address(), value); return this; } + /** Passes the {@link INPUT#DUMMYUNIONNAME_mi} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer DUMMYUNIONNAME_mi(java.util.function.Consumer consumer) { consumer.accept(DUMMYUNIONNAME_mi()); return this; } + /** Copies the specified {@link KEYBDINPUT} to the {@link INPUT#DUMMYUNIONNAME_ki} field. */ + public Buffer DUMMYUNIONNAME_ki(KEYBDINPUT value) { INPUT.nDUMMYUNIONNAME_ki(address(), value); return this; } + /** Passes the {@link INPUT#DUMMYUNIONNAME_ki} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer DUMMYUNIONNAME_ki(java.util.function.Consumer consumer) { consumer.accept(DUMMYUNIONNAME_ki()); return this; } + /** Copies the specified {@link HARDWAREINPUT} to the {@link INPUT#DUMMYUNIONNAME_hi} field. */ + public Buffer DUMMYUNIONNAME_hi(HARDWAREINPUT value) { INPUT.nDUMMYUNIONNAME_hi(address(), value); return this; } + /** Passes the {@link INPUT#DUMMYUNIONNAME_hi} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer DUMMYUNIONNAME_hi(java.util.function.Consumer consumer) { consumer.accept(DUMMYUNIONNAME_hi()); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/KEYBDINPUT.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/KEYBDINPUT.java new file mode 100644 index 000000000..52ed6f7ce --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/KEYBDINPUT.java @@ -0,0 +1,374 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains information about a simulated keyboard event. + * + *

    Layout

    + * + *
    
    + * struct KEYBDINPUT {
    + *     WORD {@link #wVk};
    + *     WORD {@link #wScan};
    + *     DWORD {@link #dwFlags};
    + *     DWORD {@link #time};
    + *     ULONG_PTR {@link #dwExtraInfo};
    + * }
    + */ +public class KEYBDINPUT extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + WVK, + WSCAN, + DWFLAGS, + TIME, + DWEXTRAINFO; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(4), + __member(4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + WVK = layout.offsetof(0); + WSCAN = layout.offsetof(1); + DWFLAGS = layout.offsetof(2); + TIME = layout.offsetof(3); + DWEXTRAINFO = layout.offsetof(4); + } + + protected KEYBDINPUT(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected KEYBDINPUT create(long address, @Nullable ByteBuffer container) { + return new KEYBDINPUT(address, container); + } + + /** + * Creates a {@code KEYBDINPUT} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public KEYBDINPUT(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** + * A virtual-key code. + * + *

    The code must be a value in the range 1 to 254. If the {@code dwFlags} member specifies {@link User32#KEYEVENTF_UNICODE}, {@code wVk} must be 0.

    + */ + @NativeType("WORD") + public short wVk() { return nwVk(address()); } + /** + * A hardware scan code for the key. + * + *

    If {@code dwFlags} specifies {@link User32#KEYEVENTF_UNICODE}, {@code wScan} specifies a Unicode character which is to be sent to the foreground application.

    + */ + @NativeType("WORD") + public short wScan() { return nwScan(address()); } + /** specifies various aspects of a keystroke. One of:
    {@link User32#KEYEVENTF_EXTENDEDKEY}{@link User32#KEYEVENTF_KEYUP}{@link User32#KEYEVENTF_SCANCODE}{@link User32#KEYEVENTF_UNICODE}
    */ + @NativeType("DWORD") + public int dwFlags() { return ndwFlags(address()); } + /** the time stamp for the event, in milliseconds. If this parameter is zero, the system will provide its own time stamp. */ + @NativeType("DWORD") + public int time() { return ntime(address()); } + /** an additional value associated with the keystroke. Use the {@link User32#GetMessageExtraInfo} function to obtain this information. */ + @NativeType("ULONG_PTR") + public long dwExtraInfo() { return ndwExtraInfo(address()); } + + /** Sets the specified value to the {@link #wVk} field. */ + public KEYBDINPUT wVk(@NativeType("WORD") short value) { nwVk(address(), value); return this; } + /** Sets the specified value to the {@link #wScan} field. */ + public KEYBDINPUT wScan(@NativeType("WORD") short value) { nwScan(address(), value); return this; } + /** Sets the specified value to the {@link #dwFlags} field. */ + public KEYBDINPUT dwFlags(@NativeType("DWORD") int value) { ndwFlags(address(), value); return this; } + /** Sets the specified value to the {@link #time} field. */ + public KEYBDINPUT time(@NativeType("DWORD") int value) { ntime(address(), value); return this; } + /** Sets the specified value to the {@link #dwExtraInfo} field. */ + public KEYBDINPUT dwExtraInfo(@NativeType("ULONG_PTR") long value) { ndwExtraInfo(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public KEYBDINPUT set( + short wVk, + short wScan, + int dwFlags, + int time, + long dwExtraInfo + ) { + wVk(wVk); + wScan(wScan); + dwFlags(dwFlags); + time(time); + dwExtraInfo(dwExtraInfo); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public KEYBDINPUT set(KEYBDINPUT src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code KEYBDINPUT} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static KEYBDINPUT malloc() { + return new KEYBDINPUT(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code KEYBDINPUT} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static KEYBDINPUT calloc() { + return new KEYBDINPUT(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code KEYBDINPUT} instance allocated with {@link BufferUtils}. */ + public static KEYBDINPUT create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new KEYBDINPUT(memAddress(container), container); + } + + /** Returns a new {@code KEYBDINPUT} instance for the specified memory address. */ + public static KEYBDINPUT create(long address) { + return new KEYBDINPUT(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static KEYBDINPUT createSafe(long address) { + return address == NULL ? null : new KEYBDINPUT(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static KEYBDINPUT mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static KEYBDINPUT callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static KEYBDINPUT mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static KEYBDINPUT callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code KEYBDINPUT} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static KEYBDINPUT malloc(MemoryStack stack) { + return new KEYBDINPUT(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code KEYBDINPUT} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static KEYBDINPUT calloc(MemoryStack stack) { + return new KEYBDINPUT(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #wVk}. */ + public static short nwVk(long struct) { return UNSAFE.getShort(null, struct + KEYBDINPUT.WVK); } + /** Unsafe version of {@link #wScan}. */ + public static short nwScan(long struct) { return UNSAFE.getShort(null, struct + KEYBDINPUT.WSCAN); } + /** Unsafe version of {@link #dwFlags}. */ + public static int ndwFlags(long struct) { return UNSAFE.getInt(null, struct + KEYBDINPUT.DWFLAGS); } + /** Unsafe version of {@link #time}. */ + public static int ntime(long struct) { return UNSAFE.getInt(null, struct + KEYBDINPUT.TIME); } + /** Unsafe version of {@link #dwExtraInfo}. */ + public static long ndwExtraInfo(long struct) { return memGetAddress(struct + KEYBDINPUT.DWEXTRAINFO); } + + /** Unsafe version of {@link #wVk(short) wVk}. */ + public static void nwVk(long struct, short value) { UNSAFE.putShort(null, struct + KEYBDINPUT.WVK, value); } + /** Unsafe version of {@link #wScan(short) wScan}. */ + public static void nwScan(long struct, short value) { UNSAFE.putShort(null, struct + KEYBDINPUT.WSCAN, value); } + /** Unsafe version of {@link #dwFlags(int) dwFlags}. */ + public static void ndwFlags(long struct, int value) { UNSAFE.putInt(null, struct + KEYBDINPUT.DWFLAGS, value); } + /** Unsafe version of {@link #time(int) time}. */ + public static void ntime(long struct, int value) { UNSAFE.putInt(null, struct + KEYBDINPUT.TIME, value); } + /** Unsafe version of {@link #dwExtraInfo(long) dwExtraInfo}. */ + public static void ndwExtraInfo(long struct, long value) { memPutAddress(struct + KEYBDINPUT.DWEXTRAINFO, value); } + + // ----------------------------------- + + /** An array of {@link KEYBDINPUT} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final KEYBDINPUT ELEMENT_FACTORY = KEYBDINPUT.create(-1L); + + /** + * Creates a new {@code KEYBDINPUT.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link KEYBDINPUT#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected KEYBDINPUT getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link KEYBDINPUT#wVk} field. */ + @NativeType("WORD") + public short wVk() { return KEYBDINPUT.nwVk(address()); } + /** @return the value of the {@link KEYBDINPUT#wScan} field. */ + @NativeType("WORD") + public short wScan() { return KEYBDINPUT.nwScan(address()); } + /** @return the value of the {@link KEYBDINPUT#dwFlags} field. */ + @NativeType("DWORD") + public int dwFlags() { return KEYBDINPUT.ndwFlags(address()); } + /** @return the value of the {@link KEYBDINPUT#time} field. */ + @NativeType("DWORD") + public int time() { return KEYBDINPUT.ntime(address()); } + /** @return the value of the {@link KEYBDINPUT#dwExtraInfo} field. */ + @NativeType("ULONG_PTR") + public long dwExtraInfo() { return KEYBDINPUT.ndwExtraInfo(address()); } + + /** Sets the specified value to the {@link KEYBDINPUT#wVk} field. */ + public Buffer wVk(@NativeType("WORD") short value) { KEYBDINPUT.nwVk(address(), value); return this; } + /** Sets the specified value to the {@link KEYBDINPUT#wScan} field. */ + public Buffer wScan(@NativeType("WORD") short value) { KEYBDINPUT.nwScan(address(), value); return this; } + /** Sets the specified value to the {@link KEYBDINPUT#dwFlags} field. */ + public Buffer dwFlags(@NativeType("DWORD") int value) { KEYBDINPUT.ndwFlags(address(), value); return this; } + /** Sets the specified value to the {@link KEYBDINPUT#time} field. */ + public Buffer time(@NativeType("DWORD") int value) { KEYBDINPUT.ntime(address(), value); return this; } + /** Sets the specified value to the {@link KEYBDINPUT#dwExtraInfo} field. */ + public Buffer dwExtraInfo(@NativeType("ULONG_PTR") long value) { KEYBDINPUT.ndwExtraInfo(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/Kernel32.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/Kernel32.java new file mode 100644 index 000000000..74e14a63c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/Kernel32.java @@ -0,0 +1,124 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; + +/** Native bindings to Kernel32 library. */ +public class Kernel32 { + + private static final SharedLibrary KERNEL32 = Library.loadNative(Kernel32.class, "org.lwjgl", "kernel32"); + + /** Contains the function pointers loaded from the kernel32 {@link SharedLibrary}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + GetCurrentProcess = apiGetFunctionAddress(KERNEL32, "GetCurrentProcess"), + GetCurrentProcessId = apiGetFunctionAddress(KERNEL32, "GetCurrentProcessId"), + GetProcessId = apiGetFunctionAddress(KERNEL32, "GetProcessId"), + GetCurrentThread = apiGetFunctionAddress(KERNEL32, "GetCurrentThread"), + GetCurrentThreadId = apiGetFunctionAddress(KERNEL32, "GetCurrentThreadId"), + GetThreadId = apiGetFunctionAddressOptional(KERNEL32, "GetThreadId"), + GetProcessIdOfThread = apiGetFunctionAddressOptional(KERNEL32, "GetProcessIdOfThread"), + GetCurrentProcessorNumber = apiGetFunctionAddressOptional(KERNEL32, "GetCurrentProcessorNumber"); + + } + + /** Returns the kernel32 {@link SharedLibrary}. */ + public static SharedLibrary getLibrary() { + return KERNEL32; + } + + protected Kernel32() { + throw new UnsupportedOperationException(); + } + + // --- [ GetCurrentProcess ] --- + + @NativeType("HANDLE") + public static long GetCurrentProcess() { + long __functionAddress = Functions.GetCurrentProcess; + return callP(__functionAddress); + } + + // --- [ GetCurrentProcessId ] --- + + @NativeType("DWORD") + public static int GetCurrentProcessId() { + long __functionAddress = Functions.GetCurrentProcessId; + return callI(__functionAddress); + } + + // --- [ GetProcessId ] --- + + @NativeType("DWORD") + public static int GetProcessId(@NativeType("HANDLE") long Process) { + long __functionAddress = Functions.GetProcessId; + if (CHECKS) { + check(Process); + } + return callPI(Process, __functionAddress); + } + + // --- [ GetCurrentThread ] --- + + @NativeType("HANDLE") + public static long GetCurrentThread() { + long __functionAddress = Functions.GetCurrentThread; + return callP(__functionAddress); + } + + // --- [ GetCurrentThreadId ] --- + + @NativeType("DWORD") + public static int GetCurrentThreadId() { + long __functionAddress = Functions.GetCurrentThreadId; + return callI(__functionAddress); + } + + // --- [ GetThreadId ] --- + + @NativeType("DWORD") + public static int GetThreadId(@NativeType("HANDLE") long Thread) { + long __functionAddress = Functions.GetThreadId; + if (CHECKS) { + check(__functionAddress); + check(Thread); + } + return callPI(Thread, __functionAddress); + } + + // --- [ GetProcessIdOfThread ] --- + + @NativeType("DWORD") + public static int GetProcessIdOfThread(@NativeType("HANDLE") long Thread) { + long __functionAddress = Functions.GetProcessIdOfThread; + if (CHECKS) { + check(__functionAddress); + check(Thread); + } + return callPI(Thread, __functionAddress); + } + + // --- [ GetCurrentProcessorNumber ] --- + + @NativeType("DWORD") + public static int GetCurrentProcessorNumber() { + long __functionAddress = Functions.GetCurrentProcessorNumber; + if (CHECKS) { + check(__functionAddress); + } + return callI(__functionAddress); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/LARGE_INTEGER.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/LARGE_INTEGER.java new file mode 100644 index 000000000..bea27f7e6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/LARGE_INTEGER.java @@ -0,0 +1,298 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * union LARGE_INTEGER {
    + *     struct {
    + *         DWORD LowPart;
    + *         LONG HighPart;
    + *     } u;
    + *     LONGLONG QuadPart;
    + * }
    + */ +public class LARGE_INTEGER extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + U, + U_LOWPART, + U_HIGHPART, + QUADPART; + + static { + Layout layout = __union( + __struct( + __member(4), + __member(4) + ), + __member(8) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + U = layout.offsetof(0); + U_LOWPART = layout.offsetof(1); + U_HIGHPART = layout.offsetof(2); + QUADPART = layout.offsetof(3); + } + + protected LARGE_INTEGER(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected LARGE_INTEGER create(long address, @Nullable ByteBuffer container) { + return new LARGE_INTEGER(address, container); + } + + /** + * Creates a {@code LARGE_INTEGER} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public LARGE_INTEGER(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code u.LowPart} field. */ + @NativeType("DWORD") + public int u_LowPart() { return nu_LowPart(address()); } + /** @return the value of the {@code u.HighPart} field. */ + @NativeType("LONG") + public int u_HighPart() { return nu_HighPart(address()); } + /** @return the value of the {@code QuadPart} field. */ + @NativeType("LONGLONG") + public long QuadPart() { return nQuadPart(address()); } + + /** Sets the specified value to the {@code LowPart} field. */ + public LARGE_INTEGER u_LowPart(@NativeType("DWORD") int value) { nu_LowPart(address(), value); return this; } + /** Sets the specified value to the {@code HighPart} field. */ + public LARGE_INTEGER u_HighPart(@NativeType("LONG") int value) { nu_HighPart(address(), value); return this; } + /** Sets the specified value to the {@code QuadPart} field. */ + public LARGE_INTEGER QuadPart(@NativeType("LONGLONG") long value) { nQuadPart(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public LARGE_INTEGER set(LARGE_INTEGER src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code LARGE_INTEGER} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static LARGE_INTEGER malloc() { + return new LARGE_INTEGER(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code LARGE_INTEGER} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static LARGE_INTEGER calloc() { + return new LARGE_INTEGER(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code LARGE_INTEGER} instance allocated with {@link BufferUtils}. */ + public static LARGE_INTEGER create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new LARGE_INTEGER(memAddress(container), container); + } + + /** Returns a new {@code LARGE_INTEGER} instance for the specified memory address. */ + public static LARGE_INTEGER create(long address) { + return new LARGE_INTEGER(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static LARGE_INTEGER createSafe(long address) { + return address == NULL ? null : new LARGE_INTEGER(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code LARGE_INTEGER} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static LARGE_INTEGER malloc(MemoryStack stack) { + return new LARGE_INTEGER(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code LARGE_INTEGER} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static LARGE_INTEGER calloc(MemoryStack stack) { + return new LARGE_INTEGER(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #u_LowPart}. */ + public static int nu_LowPart(long struct) { return UNSAFE.getInt(null, struct + LARGE_INTEGER.U_LOWPART); } + /** Unsafe version of {@link #u_HighPart}. */ + public static int nu_HighPart(long struct) { return UNSAFE.getInt(null, struct + LARGE_INTEGER.U_HIGHPART); } + /** Unsafe version of {@link #QuadPart}. */ + public static long nQuadPart(long struct) { return UNSAFE.getLong(null, struct + LARGE_INTEGER.QUADPART); } + + /** Unsafe version of {@link #u_LowPart(int) u_LowPart}. */ + public static void nu_LowPart(long struct, int value) { UNSAFE.putInt(null, struct + LARGE_INTEGER.U_LOWPART, value); } + /** Unsafe version of {@link #u_HighPart(int) u_HighPart}. */ + public static void nu_HighPart(long struct, int value) { UNSAFE.putInt(null, struct + LARGE_INTEGER.U_HIGHPART, value); } + /** Unsafe version of {@link #QuadPart(long) QuadPart}. */ + public static void nQuadPart(long struct, long value) { UNSAFE.putLong(null, struct + LARGE_INTEGER.QUADPART, value); } + + // ----------------------------------- + + /** An array of {@link LARGE_INTEGER} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final LARGE_INTEGER ELEMENT_FACTORY = LARGE_INTEGER.create(-1L); + + /** + * Creates a new {@code LARGE_INTEGER.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link LARGE_INTEGER#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected LARGE_INTEGER getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code u.LowPart} field. */ + @NativeType("DWORD") + public int u_LowPart() { return LARGE_INTEGER.nu_LowPart(address()); } + /** @return the value of the {@code u.HighPart} field. */ + @NativeType("LONG") + public int u_HighPart() { return LARGE_INTEGER.nu_HighPart(address()); } + /** @return the value of the {@code QuadPart} field. */ + @NativeType("LONGLONG") + public long QuadPart() { return LARGE_INTEGER.nQuadPart(address()); } + + /** Sets the specified value to the {@code LowPart} field. */ + public Buffer u_LowPart(@NativeType("DWORD") int value) { LARGE_INTEGER.nu_LowPart(address(), value); return this; } + /** Sets the specified value to the {@code HighPart} field. */ + public Buffer u_HighPart(@NativeType("LONG") int value) { LARGE_INTEGER.nu_HighPart(address(), value); return this; } + /** Sets the specified value to the {@code QuadPart} field. */ + public Buffer QuadPart(@NativeType("LONGLONG") long value) { LARGE_INTEGER.nQuadPart(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MONITORINFOEX.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MONITORINFOEX.java new file mode 100644 index 000000000..9bfeb11c9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MONITORINFOEX.java @@ -0,0 +1,342 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains information about a display monitor. + * + *

    Layout

    + * + *
    
    + * struct MONITORINFOEX {
    + *     DWORD {@link #cbSize};
    + *     {@link RECT RECT} {@link #rcMonitor};
    + *     {@link RECT RECT} {@link #rcWork};
    + *     DWORD {@link #dwFlags};
    + *     TCHAR {@link #szDevice}[32];
    + * }
    + */ +public class MONITORINFOEX extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + CBSIZE, + RCMONITOR, + RCWORK, + DWFLAGS, + SZDEVICE; + + static { + Layout layout = __struct( + __member(4), + __member(RECT.SIZEOF, RECT.ALIGNOF), + __member(RECT.SIZEOF, RECT.ALIGNOF), + __member(4), + __array(2, 32) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + CBSIZE = layout.offsetof(0); + RCMONITOR = layout.offsetof(1); + RCWORK = layout.offsetof(2); + DWFLAGS = layout.offsetof(3); + SZDEVICE = layout.offsetof(4); + } + + protected MONITORINFOEX(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected MONITORINFOEX create(long address, @Nullable ByteBuffer container) { + return new MONITORINFOEX(address, container); + } + + /** + * Creates a {@code MONITORINFOEX} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public MONITORINFOEX(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** + * the size, in bytes, of the structure. + * + *

    Set this member to {@link #SIZEOF} before calling the {@link User32#GetMonitorInfo} function. Doing so lets the function determine the type of structure you + * are passing to it.

    + */ + @NativeType("DWORD") + public int cbSize() { return ncbSize(address()); } + /** + * a {@link RECT} structure that specifies the display monitor rectangle, expressed in virtual-screen coordinates. Note that if the monitor is not the primary + * display monitor, some of the rectangle's coordinates may be negative values. + */ + public RECT rcMonitor() { return nrcMonitor(address()); } + /** + * a {@link RECT} structure that specifies the work area rectangle of the display monitor that can be used by applications, expressed in virtual-screen + * coordinates. Windows uses this rectangle to maximize an application on the monitor. The rest of the area in {@code rcMonitor} contains system windows + * such as the task bar and side bars. Note that if the monitor is not the primary display monitor, some of the rectangle's coordinates may be negative + * values. + */ + public RECT rcWork() { return nrcWork(address()); } + /** the attributes of the display monitor. May be:
    {@link User32#MONITORINFOF_PRIMARY} */ + @NativeType("DWORD") + public int dwFlags() { return ndwFlags(address()); } + /** a string that specifies the device name of the monitor being used */ + @NativeType("TCHAR[32]") + public ByteBuffer szDevice() { return nszDevice(address()); } + /** a string that specifies the device name of the monitor being used */ + @NativeType("TCHAR[32]") + public String szDeviceString() { return nszDeviceString(address()); } + + /** Sets the specified value to the {@link #cbSize} field. */ + public MONITORINFOEX cbSize(@NativeType("DWORD") int value) { ncbSize(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public MONITORINFOEX set(MONITORINFOEX src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code MONITORINFOEX} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static MONITORINFOEX malloc() { + return new MONITORINFOEX(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code MONITORINFOEX} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static MONITORINFOEX calloc() { + return new MONITORINFOEX(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code MONITORINFOEX} instance allocated with {@link BufferUtils}. */ + public static MONITORINFOEX create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new MONITORINFOEX(memAddress(container), container); + } + + /** Returns a new {@code MONITORINFOEX} instance for the specified memory address. */ + public static MONITORINFOEX create(long address) { + return new MONITORINFOEX(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static MONITORINFOEX createSafe(long address) { + return address == NULL ? null : new MONITORINFOEX(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static MONITORINFOEX mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static MONITORINFOEX callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static MONITORINFOEX mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static MONITORINFOEX callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code MONITORINFOEX} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static MONITORINFOEX malloc(MemoryStack stack) { + return new MONITORINFOEX(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code MONITORINFOEX} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static MONITORINFOEX calloc(MemoryStack stack) { + return new MONITORINFOEX(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #cbSize}. */ + public static int ncbSize(long struct) { return UNSAFE.getInt(null, struct + MONITORINFOEX.CBSIZE); } + /** Unsafe version of {@link #rcMonitor}. */ + public static RECT nrcMonitor(long struct) { return RECT.create(struct + MONITORINFOEX.RCMONITOR); } + /** Unsafe version of {@link #rcWork}. */ + public static RECT nrcWork(long struct) { return RECT.create(struct + MONITORINFOEX.RCWORK); } + /** Unsafe version of {@link #dwFlags}. */ + public static int ndwFlags(long struct) { return UNSAFE.getInt(null, struct + MONITORINFOEX.DWFLAGS); } + /** Unsafe version of {@link #szDevice}. */ + public static ByteBuffer nszDevice(long struct) { return memByteBuffer(struct + MONITORINFOEX.SZDEVICE, 32 * 2); } + /** Unsafe version of {@link #szDeviceString}. */ + public static String nszDeviceString(long struct) { return memUTF16(struct + MONITORINFOEX.SZDEVICE); } + + /** Unsafe version of {@link #cbSize(int) cbSize}. */ + public static void ncbSize(long struct, int value) { UNSAFE.putInt(null, struct + MONITORINFOEX.CBSIZE, value); } + + // ----------------------------------- + + /** An array of {@link MONITORINFOEX} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final MONITORINFOEX ELEMENT_FACTORY = MONITORINFOEX.create(-1L); + + /** + * Creates a new {@code MONITORINFOEX.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link MONITORINFOEX#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected MONITORINFOEX getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link MONITORINFOEX#cbSize} field. */ + @NativeType("DWORD") + public int cbSize() { return MONITORINFOEX.ncbSize(address()); } + /** @return a {@link RECT} view of the {@link MONITORINFOEX#rcMonitor} field. */ + public RECT rcMonitor() { return MONITORINFOEX.nrcMonitor(address()); } + /** @return a {@link RECT} view of the {@link MONITORINFOEX#rcWork} field. */ + public RECT rcWork() { return MONITORINFOEX.nrcWork(address()); } + /** @return the value of the {@link MONITORINFOEX#dwFlags} field. */ + @NativeType("DWORD") + public int dwFlags() { return MONITORINFOEX.ndwFlags(address()); } + /** @return a {@link ByteBuffer} view of the {@link MONITORINFOEX#szDevice} field. */ + @NativeType("TCHAR[32]") + public ByteBuffer szDevice() { return MONITORINFOEX.nszDevice(address()); } + /** @return the null-terminated string stored in the {@link MONITORINFOEX#szDevice} field. */ + @NativeType("TCHAR[32]") + public String szDeviceString() { return MONITORINFOEX.nszDeviceString(address()); } + + /** Sets the specified value to the {@link MONITORINFOEX#cbSize} field. */ + public Buffer cbSize(@NativeType("DWORD") int value) { MONITORINFOEX.ncbSize(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MOUSEINPUT.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MOUSEINPUT.java new file mode 100644 index 000000000..5d6242fc4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MOUSEINPUT.java @@ -0,0 +1,418 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains information about a simulated mouse event. + * + *

    Layout

    + * + *
    
    + * struct MOUSEINPUT {
    + *     LONG {@link #dx};
    + *     LONG {@link #dy};
    + *     DWORD {@link #mouseData};
    + *     DWORD {@link #dwFlags};
    + *     DWORD {@link #time};
    + *     ULONG_PTR {@link #dwExtraInfo};
    + * }
    + */ +public class MOUSEINPUT extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + DX, + DY, + MOUSEDATA, + DWFLAGS, + TIME, + DWEXTRAINFO; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4), + __member(4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + DX = layout.offsetof(0); + DY = layout.offsetof(1); + MOUSEDATA = layout.offsetof(2); + DWFLAGS = layout.offsetof(3); + TIME = layout.offsetof(4); + DWEXTRAINFO = layout.offsetof(5); + } + + protected MOUSEINPUT(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected MOUSEINPUT create(long address, @Nullable ByteBuffer container) { + return new MOUSEINPUT(address, container); + } + + /** + * Creates a {@code MOUSEINPUT} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public MOUSEINPUT(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** + * the absolute position of the mouse, or the amount of motion since the last mouse event was generated, depending on the value of the {@code dwFlags} + * member. + * + *

    Absolute data is specified as the x coordinate of the mouse; relative data is specified as the number of pixels moved.

    + */ + @NativeType("LONG") + public int dx() { return ndx(address()); } + /** + * the absolute position of the mouse, or the amount of motion since the last mouse event was generated, depending on the value of the {@code dwFlags} + * member. + * + *

    Absolute data is specified as the y coordinate of the mouse; relative data is specified as the number of pixels moved.

    + */ + @NativeType("LONG") + public int dy() { return ndy(address()); } + /** + * If {@code dwFlags} contains {@link User32#MOUSEEVENTF_WHEEL}, then {@code mouseData} specifies the amount of wheel movement. A positive value indicates that the + * wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is + * defined as {@link User32#WHEEL_DELTA}, which is 120. + * + *

    Windows Vista: If {@code dwFlags} contains {@link User32#MOUSEEVENTF_HWHEEL}, then {@code dwData} specifies the amount of wheel movement. A positive value indicates + * that the wheel was rotated to the right; a negative value indicates that the wheel was rotated to the left. One wheel click is defined as + * {@code WHEEL_DELTA}, which is 120.

    + * + *

    If {@code dwFlags} does not contain {@link User32#MOUSEEVENTF_WHEEL}, {@link User32#MOUSEEVENTF_XDOWN}, or {@link User32#MOUSEEVENTF_XUP}, then {@code mouseData} should be zero.

    + * + *

    If {@code dwFlags} contains {@link User32#MOUSEEVENTF_XDOWN} or {@link User32#MOUSEEVENTF_XUP}, then {@code mouseData} specifies which X buttons were pressed or released. This + * value may be any combination of the following flags: {@link User32#XBUTTON1}, {@link User32#XBUTTON2}. One of:

    {@link User32#XBUTTON1}{@link User32#XBUTTON2}
    + */ + @NativeType("DWORD") + public int mouseData() { return nmouseData(address()); } + /** + * A set of bit flags that specify various aspects of mouse motion and button clicks. + * + *

    The bit flags that specify mouse button status are set to indicate changes in status, not ongoing conditions. For example, if the left mouse button is + * pressed and held down, {@link User32#MOUSEEVENTF_LEFTDOWN} is set when the left button is first pressed, but not for subsequent motions. Similarly, + * {@link User32#MOUSEEVENTF_LEFTUP} is set only when the button is first released.

    + * + *

    You cannot specify both the {@link User32#MOUSEEVENTF_WHEEL} flag and either {@link User32#MOUSEEVENTF_XDOWN} or {@link User32#MOUSEEVENTF_XUP} flags simultaneously in the {@code dwFlags} + * parameter, because they both require use of the {@code mouseData} field. One of:

    {@link User32#MOUSEEVENTF_ABSOLUTE}{@link User32#MOUSEEVENTF_HWHEEL}{@link User32#MOUSEEVENTF_MOVE}{@link User32#MOUSEEVENTF_MOVE_NOCOALESCE}
    {@link User32#MOUSEEVENTF_LEFTDOWN}{@link User32#MOUSEEVENTF_LEFTUP}{@link User32#MOUSEEVENTF_RIGHTDOWN}{@link User32#MOUSEEVENTF_RIGHTUP}
    {@link User32#MOUSEEVENTF_MIDDLEDOWN}{@link User32#MOUSEEVENTF_MIDDLEUP}{@link User32#MOUSEEVENTF_VIRTUALDESK}{@link User32#MOUSEEVENTF_WHEEL}
    {@link User32#MOUSEEVENTF_XDOWN}{@link User32#MOUSEEVENTF_XUP}
    + */ + @NativeType("DWORD") + public int dwFlags() { return ndwFlags(address()); } + /** the time stamp for the event, in milliseconds. If this parameter is 0, the system will provide its own time stamp. */ + @NativeType("DWORD") + public int time() { return ntime(address()); } + /** an additional value associated with the mouse event. An application calls {@link User32#GetMessageExtraInfo} to obtain this extra information. */ + @NativeType("ULONG_PTR") + public long dwExtraInfo() { return ndwExtraInfo(address()); } + + /** Sets the specified value to the {@link #dx} field. */ + public MOUSEINPUT dx(@NativeType("LONG") int value) { ndx(address(), value); return this; } + /** Sets the specified value to the {@link #dy} field. */ + public MOUSEINPUT dy(@NativeType("LONG") int value) { ndy(address(), value); return this; } + /** Sets the specified value to the {@link #mouseData} field. */ + public MOUSEINPUT mouseData(@NativeType("DWORD") int value) { nmouseData(address(), value); return this; } + /** Sets the specified value to the {@link #dwFlags} field. */ + public MOUSEINPUT dwFlags(@NativeType("DWORD") int value) { ndwFlags(address(), value); return this; } + /** Sets the specified value to the {@link #time} field. */ + public MOUSEINPUT time(@NativeType("DWORD") int value) { ntime(address(), value); return this; } + /** Sets the specified value to the {@link #dwExtraInfo} field. */ + public MOUSEINPUT dwExtraInfo(@NativeType("ULONG_PTR") long value) { ndwExtraInfo(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public MOUSEINPUT set( + int dx, + int dy, + int mouseData, + int dwFlags, + int time, + long dwExtraInfo + ) { + dx(dx); + dy(dy); + mouseData(mouseData); + dwFlags(dwFlags); + time(time); + dwExtraInfo(dwExtraInfo); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public MOUSEINPUT set(MOUSEINPUT src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code MOUSEINPUT} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static MOUSEINPUT malloc() { + return new MOUSEINPUT(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code MOUSEINPUT} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static MOUSEINPUT calloc() { + return new MOUSEINPUT(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code MOUSEINPUT} instance allocated with {@link BufferUtils}. */ + public static MOUSEINPUT create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new MOUSEINPUT(memAddress(container), container); + } + + /** Returns a new {@code MOUSEINPUT} instance for the specified memory address. */ + public static MOUSEINPUT create(long address) { + return new MOUSEINPUT(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static MOUSEINPUT createSafe(long address) { + return address == NULL ? null : new MOUSEINPUT(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static MOUSEINPUT mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static MOUSEINPUT callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static MOUSEINPUT mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static MOUSEINPUT callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code MOUSEINPUT} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static MOUSEINPUT malloc(MemoryStack stack) { + return new MOUSEINPUT(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code MOUSEINPUT} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static MOUSEINPUT calloc(MemoryStack stack) { + return new MOUSEINPUT(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #dx}. */ + public static int ndx(long struct) { return UNSAFE.getInt(null, struct + MOUSEINPUT.DX); } + /** Unsafe version of {@link #dy}. */ + public static int ndy(long struct) { return UNSAFE.getInt(null, struct + MOUSEINPUT.DY); } + /** Unsafe version of {@link #mouseData}. */ + public static int nmouseData(long struct) { return UNSAFE.getInt(null, struct + MOUSEINPUT.MOUSEDATA); } + /** Unsafe version of {@link #dwFlags}. */ + public static int ndwFlags(long struct) { return UNSAFE.getInt(null, struct + MOUSEINPUT.DWFLAGS); } + /** Unsafe version of {@link #time}. */ + public static int ntime(long struct) { return UNSAFE.getInt(null, struct + MOUSEINPUT.TIME); } + /** Unsafe version of {@link #dwExtraInfo}. */ + public static long ndwExtraInfo(long struct) { return memGetAddress(struct + MOUSEINPUT.DWEXTRAINFO); } + + /** Unsafe version of {@link #dx(int) dx}. */ + public static void ndx(long struct, int value) { UNSAFE.putInt(null, struct + MOUSEINPUT.DX, value); } + /** Unsafe version of {@link #dy(int) dy}. */ + public static void ndy(long struct, int value) { UNSAFE.putInt(null, struct + MOUSEINPUT.DY, value); } + /** Unsafe version of {@link #mouseData(int) mouseData}. */ + public static void nmouseData(long struct, int value) { UNSAFE.putInt(null, struct + MOUSEINPUT.MOUSEDATA, value); } + /** Unsafe version of {@link #dwFlags(int) dwFlags}. */ + public static void ndwFlags(long struct, int value) { UNSAFE.putInt(null, struct + MOUSEINPUT.DWFLAGS, value); } + /** Unsafe version of {@link #time(int) time}. */ + public static void ntime(long struct, int value) { UNSAFE.putInt(null, struct + MOUSEINPUT.TIME, value); } + /** Unsafe version of {@link #dwExtraInfo(long) dwExtraInfo}. */ + public static void ndwExtraInfo(long struct, long value) { memPutAddress(struct + MOUSEINPUT.DWEXTRAINFO, value); } + + // ----------------------------------- + + /** An array of {@link MOUSEINPUT} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final MOUSEINPUT ELEMENT_FACTORY = MOUSEINPUT.create(-1L); + + /** + * Creates a new {@code MOUSEINPUT.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link MOUSEINPUT#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected MOUSEINPUT getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link MOUSEINPUT#dx} field. */ + @NativeType("LONG") + public int dx() { return MOUSEINPUT.ndx(address()); } + /** @return the value of the {@link MOUSEINPUT#dy} field. */ + @NativeType("LONG") + public int dy() { return MOUSEINPUT.ndy(address()); } + /** @return the value of the {@link MOUSEINPUT#mouseData} field. */ + @NativeType("DWORD") + public int mouseData() { return MOUSEINPUT.nmouseData(address()); } + /** @return the value of the {@link MOUSEINPUT#dwFlags} field. */ + @NativeType("DWORD") + public int dwFlags() { return MOUSEINPUT.ndwFlags(address()); } + /** @return the value of the {@link MOUSEINPUT#time} field. */ + @NativeType("DWORD") + public int time() { return MOUSEINPUT.ntime(address()); } + /** @return the value of the {@link MOUSEINPUT#dwExtraInfo} field. */ + @NativeType("ULONG_PTR") + public long dwExtraInfo() { return MOUSEINPUT.ndwExtraInfo(address()); } + + /** Sets the specified value to the {@link MOUSEINPUT#dx} field. */ + public Buffer dx(@NativeType("LONG") int value) { MOUSEINPUT.ndx(address(), value); return this; } + /** Sets the specified value to the {@link MOUSEINPUT#dy} field. */ + public Buffer dy(@NativeType("LONG") int value) { MOUSEINPUT.ndy(address(), value); return this; } + /** Sets the specified value to the {@link MOUSEINPUT#mouseData} field. */ + public Buffer mouseData(@NativeType("DWORD") int value) { MOUSEINPUT.nmouseData(address(), value); return this; } + /** Sets the specified value to the {@link MOUSEINPUT#dwFlags} field. */ + public Buffer dwFlags(@NativeType("DWORD") int value) { MOUSEINPUT.ndwFlags(address(), value); return this; } + /** Sets the specified value to the {@link MOUSEINPUT#time} field. */ + public Buffer time(@NativeType("DWORD") int value) { MOUSEINPUT.ntime(address(), value); return this; } + /** Sets the specified value to the {@link MOUSEINPUT#dwExtraInfo} field. */ + public Buffer dwExtraInfo(@NativeType("ULONG_PTR") long value) { MOUSEINPUT.ndwExtraInfo(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MSG.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MSG.java new file mode 100644 index 000000000..0c378ebfb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/MSG.java @@ -0,0 +1,388 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains message information from a thread's message queue. + * + *

    Layout

    + * + *
    
    + * struct MSG {
    + *     HWND {@link #hwnd};
    + *     UINT {@link #message};
    + *     WPARAM {@link #wParam};
    + *     LPARAM {@link #lParam};
    + *     DWORD {@link #time};
    + *     {@link POINT POINT} {@link #pt};
    + * }
    + */ +public class MSG extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + HWND, + MESSAGE, + WPARAM, + LPARAM, + TIME, + PT; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(POINT.SIZEOF, POINT.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + HWND = layout.offsetof(0); + MESSAGE = layout.offsetof(1); + WPARAM = layout.offsetof(2); + LPARAM = layout.offsetof(3); + TIME = layout.offsetof(4); + PT = layout.offsetof(5); + } + + protected MSG(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected MSG create(long address, @Nullable ByteBuffer container) { + return new MSG(address, container); + } + + /** + * Creates a {@code MSG} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public MSG(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** a handle to the window whose window procedure receives the message. This member is {@code NULL} when the message is a thread message. */ + @NativeType("HWND") + public long hwnd() { return nhwnd(address()); } + /** the message identifier. Applications can only use the low word; the high word is reserved by the system. */ + @NativeType("UINT") + public int message() { return nmessage(address()); } + /** additional information about the message. The exact meaning depends on the value of the message member. */ + @NativeType("WPARAM") + public long wParam() { return nwParam(address()); } + /** additional information about the message. The exact meaning depends on the value of the message member. */ + @NativeType("LPARAM") + public long lParam() { return nlParam(address()); } + /** the time at which the message was posted */ + @NativeType("DWORD") + public int time() { return ntime(address()); } + /** the cursor position, in screen coordinates, when the message was posted. */ + public POINT pt() { return npt(address()); } + + /** Sets the specified value to the {@link #hwnd} field. */ + public MSG hwnd(@NativeType("HWND") long value) { nhwnd(address(), value); return this; } + /** Sets the specified value to the {@link #message} field. */ + public MSG message(@NativeType("UINT") int value) { nmessage(address(), value); return this; } + /** Sets the specified value to the {@link #wParam} field. */ + public MSG wParam(@NativeType("WPARAM") long value) { nwParam(address(), value); return this; } + /** Sets the specified value to the {@link #lParam} field. */ + public MSG lParam(@NativeType("LPARAM") long value) { nlParam(address(), value); return this; } + /** Sets the specified value to the {@link #time} field. */ + public MSG time(@NativeType("DWORD") int value) { ntime(address(), value); return this; } + /** Copies the specified {@link POINT} to the {@link #pt} field. */ + public MSG pt(POINT value) { npt(address(), value); return this; } + /** Passes the {@link #pt} field to the specified {@link java.util.function.Consumer Consumer}. */ + public MSG pt(java.util.function.Consumer consumer) { consumer.accept(pt()); return this; } + + /** Initializes this struct with the specified values. */ + public MSG set( + long hwnd, + int message, + long wParam, + long lParam, + int time, + POINT pt + ) { + hwnd(hwnd); + message(message); + wParam(wParam); + lParam(lParam); + time(time); + pt(pt); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public MSG set(MSG src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code MSG} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static MSG malloc() { + return new MSG(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code MSG} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static MSG calloc() { + return new MSG(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code MSG} instance allocated with {@link BufferUtils}. */ + public static MSG create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new MSG(memAddress(container), container); + } + + /** Returns a new {@code MSG} instance for the specified memory address. */ + public static MSG create(long address) { + return new MSG(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static MSG createSafe(long address) { + return address == NULL ? null : new MSG(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static MSG mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static MSG callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static MSG mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static MSG callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code MSG} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static MSG malloc(MemoryStack stack) { + return new MSG(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code MSG} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static MSG calloc(MemoryStack stack) { + return new MSG(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #hwnd}. */ + public static long nhwnd(long struct) { return memGetAddress(struct + MSG.HWND); } + /** Unsafe version of {@link #message}. */ + public static int nmessage(long struct) { return UNSAFE.getInt(null, struct + MSG.MESSAGE); } + /** Unsafe version of {@link #wParam}. */ + public static long nwParam(long struct) { return memGetAddress(struct + MSG.WPARAM); } + /** Unsafe version of {@link #lParam}. */ + public static long nlParam(long struct) { return memGetAddress(struct + MSG.LPARAM); } + /** Unsafe version of {@link #time}. */ + public static int ntime(long struct) { return UNSAFE.getInt(null, struct + MSG.TIME); } + /** Unsafe version of {@link #pt}. */ + public static POINT npt(long struct) { return POINT.create(struct + MSG.PT); } + + /** Unsafe version of {@link #hwnd(long) hwnd}. */ + public static void nhwnd(long struct, long value) { memPutAddress(struct + MSG.HWND, value); } + /** Unsafe version of {@link #message(int) message}. */ + public static void nmessage(long struct, int value) { UNSAFE.putInt(null, struct + MSG.MESSAGE, value); } + /** Unsafe version of {@link #wParam(long) wParam}. */ + public static void nwParam(long struct, long value) { memPutAddress(struct + MSG.WPARAM, value); } + /** Unsafe version of {@link #lParam(long) lParam}. */ + public static void nlParam(long struct, long value) { memPutAddress(struct + MSG.LPARAM, value); } + /** Unsafe version of {@link #time(int) time}. */ + public static void ntime(long struct, int value) { UNSAFE.putInt(null, struct + MSG.TIME, value); } + /** Unsafe version of {@link #pt(POINT) pt}. */ + public static void npt(long struct, POINT value) { memCopy(value.address(), struct + MSG.PT, POINT.SIZEOF); } + + // ----------------------------------- + + /** An array of {@link MSG} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final MSG ELEMENT_FACTORY = MSG.create(-1L); + + /** + * Creates a new {@code MSG.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link MSG#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected MSG getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link MSG#hwnd} field. */ + @NativeType("HWND") + public long hwnd() { return MSG.nhwnd(address()); } + /** @return the value of the {@link MSG#message} field. */ + @NativeType("UINT") + public int message() { return MSG.nmessage(address()); } + /** @return the value of the {@link MSG#wParam} field. */ + @NativeType("WPARAM") + public long wParam() { return MSG.nwParam(address()); } + /** @return the value of the {@link MSG#lParam} field. */ + @NativeType("LPARAM") + public long lParam() { return MSG.nlParam(address()); } + /** @return the value of the {@link MSG#time} field. */ + @NativeType("DWORD") + public int time() { return MSG.ntime(address()); } + /** @return a {@link POINT} view of the {@link MSG#pt} field. */ + public POINT pt() { return MSG.npt(address()); } + + /** Sets the specified value to the {@link MSG#hwnd} field. */ + public Buffer hwnd(@NativeType("HWND") long value) { MSG.nhwnd(address(), value); return this; } + /** Sets the specified value to the {@link MSG#message} field. */ + public Buffer message(@NativeType("UINT") int value) { MSG.nmessage(address(), value); return this; } + /** Sets the specified value to the {@link MSG#wParam} field. */ + public Buffer wParam(@NativeType("WPARAM") long value) { MSG.nwParam(address(), value); return this; } + /** Sets the specified value to the {@link MSG#lParam} field. */ + public Buffer lParam(@NativeType("LPARAM") long value) { MSG.nlParam(address(), value); return this; } + /** Sets the specified value to the {@link MSG#time} field. */ + public Buffer time(@NativeType("DWORD") int value) { MSG.ntime(address(), value); return this; } + /** Copies the specified {@link POINT} to the {@link MSG#pt} field. */ + public Buffer pt(POINT value) { MSG.npt(address(), value); return this; } + /** Passes the {@link MSG#pt} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer pt(java.util.function.Consumer consumer) { consumer.accept(pt()); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/PIXELFORMATDESCRIPTOR.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/PIXELFORMATDESCRIPTOR.java new file mode 100644 index 000000000..5f130f942 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/PIXELFORMATDESCRIPTOR.java @@ -0,0 +1,795 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Describes the pixel format of a drawing surface. + * + *

    Layout

    + * + *
    
    + * struct PIXELFORMATDESCRIPTOR {
    + *     WORD {@link #nSize};
    + *     WORD {@link #nVersion};
    + *     DWORD {@link #dwFlags};
    + *     BYTE {@link #iPixelType};
    + *     BYTE {@link #cColorBits};
    + *     BYTE {@link #cRedBits};
    + *     BYTE {@link #cRedShift};
    + *     BYTE {@link #cGreenBits};
    + *     BYTE {@link #cGreenShift};
    + *     BYTE {@link #cBlueBits};
    + *     BYTE {@link #cBlueShift};
    + *     BYTE {@link #cAlphaBits};
    + *     BYTE {@link #cAlphaShift};
    + *     BYTE {@link #cAccumBits};
    + *     BYTE {@link #cAccumRedBits};
    + *     BYTE {@link #cAccumGreenBits};
    + *     BYTE {@link #cAccumBlueBits};
    + *     BYTE {@link #cAccumAlphaBits};
    + *     BYTE {@link #cDepthBits};
    + *     BYTE {@link #cStencilBits};
    + *     BYTE {@link #cAuxBuffers};
    + *     BYTE {@link #iLayerType};
    + *     BYTE {@link #bReserved};
    + *     DWORD {@link #dwLayerMask};
    + *     DWORD {@link #dwVisibleMask};
    + *     DWORD {@link #dwDamageMask};
    + * }
    + */ +public class PIXELFORMATDESCRIPTOR extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NSIZE, + NVERSION, + DWFLAGS, + IPIXELTYPE, + CCOLORBITS, + CREDBITS, + CREDSHIFT, + CGREENBITS, + CGREENSHIFT, + CBLUEBITS, + CBLUESHIFT, + CALPHABITS, + CALPHASHIFT, + CACCUMBITS, + CACCUMREDBITS, + CACCUMGREENBITS, + CACCUMBLUEBITS, + CACCUMALPHABITS, + CDEPTHBITS, + CSTENCILBITS, + CAUXBUFFERS, + ILAYERTYPE, + BRESERVED, + DWLAYERMASK, + DWVISIBLEMASK, + DWDAMAGEMASK; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(4), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NSIZE = layout.offsetof(0); + NVERSION = layout.offsetof(1); + DWFLAGS = layout.offsetof(2); + IPIXELTYPE = layout.offsetof(3); + CCOLORBITS = layout.offsetof(4); + CREDBITS = layout.offsetof(5); + CREDSHIFT = layout.offsetof(6); + CGREENBITS = layout.offsetof(7); + CGREENSHIFT = layout.offsetof(8); + CBLUEBITS = layout.offsetof(9); + CBLUESHIFT = layout.offsetof(10); + CALPHABITS = layout.offsetof(11); + CALPHASHIFT = layout.offsetof(12); + CACCUMBITS = layout.offsetof(13); + CACCUMREDBITS = layout.offsetof(14); + CACCUMGREENBITS = layout.offsetof(15); + CACCUMBLUEBITS = layout.offsetof(16); + CACCUMALPHABITS = layout.offsetof(17); + CDEPTHBITS = layout.offsetof(18); + CSTENCILBITS = layout.offsetof(19); + CAUXBUFFERS = layout.offsetof(20); + ILAYERTYPE = layout.offsetof(21); + BRESERVED = layout.offsetof(22); + DWLAYERMASK = layout.offsetof(23); + DWVISIBLEMASK = layout.offsetof(24); + DWDAMAGEMASK = layout.offsetof(25); + } + + protected PIXELFORMATDESCRIPTOR(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected PIXELFORMATDESCRIPTOR create(long address, @Nullable ByteBuffer container) { + return new PIXELFORMATDESCRIPTOR(address, container); + } + + /** + * Creates a {@code PIXELFORMATDESCRIPTOR} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public PIXELFORMATDESCRIPTOR(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** specifies the size of this data structure. This value should be set to {@link #SIZEOF}. */ + @NativeType("WORD") + public short nSize() { return nnSize(address()); } + /** specifies the version of this data structure. This value should be set to 1 */ + @NativeType("WORD") + public short nVersion() { return nnVersion(address()); } + /** a set of bit flags that specify properties of the pixel buffer */ + @NativeType("DWORD") + public int dwFlags() { return ndwFlags(address()); } + /** specifies the type of pixel data */ + @NativeType("BYTE") + public byte iPixelType() { return niPixelType(address()); } + /** + * specifies the number of color bitplanes in each color buffer. For RGBA pixel types, it is the size of the color buffer, excluding the alpha bitplanes. + * For color-index pixels, it is the size of the color-index buffer. + */ + @NativeType("BYTE") + public byte cColorBits() { return ncColorBits(address()); } + /** specifies the number of red bitplanes in each RGBA color buffer */ + @NativeType("BYTE") + public byte cRedBits() { return ncRedBits(address()); } + /** specifies the shift count for red bitplanes in each RGBA color buffer */ + @NativeType("BYTE") + public byte cRedShift() { return ncRedShift(address()); } + /** specifies the number of green bitplanes in each RGBA color buffer */ + @NativeType("BYTE") + public byte cGreenBits() { return ncGreenBits(address()); } + /** specifies the shift count for green bitplanes in each RGBA color buffer */ + @NativeType("BYTE") + public byte cGreenShift() { return ncGreenShift(address()); } + /** specifies the number of blue bitplanes in each RGBA color buffer */ + @NativeType("BYTE") + public byte cBlueBits() { return ncBlueBits(address()); } + /** specifies the shift count for blue bitplanes in each RGBA color buffer */ + @NativeType("BYTE") + public byte cBlueShift() { return ncBlueShift(address()); } + /** specifies the number of alpha bitplanes in each RGBA color buffer. Alpha bitplanes are not supported */ + @NativeType("BYTE") + public byte cAlphaBits() { return ncAlphaBits(address()); } + /** specifies the shift count for alpha bitplanes in each RGBA color buffer. Alpha bitplanes are not supported */ + @NativeType("BYTE") + public byte cAlphaShift() { return ncAlphaShift(address()); } + /** specifies the total number of bitplanes in the accumulation buffer */ + @NativeType("BYTE") + public byte cAccumBits() { return ncAccumBits(address()); } + /** specifies the number of red bitplanes in the accumulation buffer */ + @NativeType("BYTE") + public byte cAccumRedBits() { return ncAccumRedBits(address()); } + /** specifies the number of green bitplanes in the accumulation buffer */ + @NativeType("BYTE") + public byte cAccumGreenBits() { return ncAccumGreenBits(address()); } + /** specifies the number of blue bitplanes in the accumulation buffer */ + @NativeType("BYTE") + public byte cAccumBlueBits() { return ncAccumBlueBits(address()); } + /** specifies the number of alpha bitplanes in the accumulation buffer */ + @NativeType("BYTE") + public byte cAccumAlphaBits() { return ncAccumAlphaBits(address()); } + /** specifies the depth of the depth (z-axis) buffer */ + @NativeType("BYTE") + public byte cDepthBits() { return ncDepthBits(address()); } + /** specifies the depth of the stencil buffer */ + @NativeType("BYTE") + public byte cStencilBits() { return ncStencilBits(address()); } + /** specifies the number of auxiliary buffers. Auxiliary buffers are not supported */ + @NativeType("BYTE") + public byte cAuxBuffers() { return ncAuxBuffers(address()); } + /** Ignored. Earlier implementations of OpenGL used this member, but it is no longer used. */ + @NativeType("BYTE") + public byte iLayerType() { return niLayerType(address()); } + /** + * specifies the number of overlay and underlay planes. Bits 0 through 3 specify up to 15 overlay planes and bits 4 through 7 specify up to 15 underlay + * planes + */ + @NativeType("BYTE") + public byte bReserved() { return nbReserved(address()); } + /** Ignored. Earlier implementations of OpenGL used this member, but it is no longer used. */ + @NativeType("DWORD") + public int dwLayerMask() { return ndwLayerMask(address()); } + /** + * specifies the transparent color or index of an underlay plane. When the pixel type is RGBA, {@code dwVisibleMask} is a transparent RGB color value. + * When the pixel type is color index, it is a transparent index value. + */ + @NativeType("DWORD") + public int dwVisibleMask() { return ndwVisibleMask(address()); } + /** Ignored. Earlier implementations of OpenGL used this member, but it is no longer used. */ + @NativeType("DWORD") + public int dwDamageMask() { return ndwDamageMask(address()); } + + /** Sets the specified value to the {@link #nSize} field. */ + public PIXELFORMATDESCRIPTOR nSize(@NativeType("WORD") short value) { nnSize(address(), value); return this; } + /** Sets the specified value to the {@link #nVersion} field. */ + public PIXELFORMATDESCRIPTOR nVersion(@NativeType("WORD") short value) { nnVersion(address(), value); return this; } + /** Sets the specified value to the {@link #dwFlags} field. */ + public PIXELFORMATDESCRIPTOR dwFlags(@NativeType("DWORD") int value) { ndwFlags(address(), value); return this; } + /** Sets the specified value to the {@link #iPixelType} field. */ + public PIXELFORMATDESCRIPTOR iPixelType(@NativeType("BYTE") byte value) { niPixelType(address(), value); return this; } + /** Sets the specified value to the {@link #cColorBits} field. */ + public PIXELFORMATDESCRIPTOR cColorBits(@NativeType("BYTE") byte value) { ncColorBits(address(), value); return this; } + /** Sets the specified value to the {@link #cRedBits} field. */ + public PIXELFORMATDESCRIPTOR cRedBits(@NativeType("BYTE") byte value) { ncRedBits(address(), value); return this; } + /** Sets the specified value to the {@link #cRedShift} field. */ + public PIXELFORMATDESCRIPTOR cRedShift(@NativeType("BYTE") byte value) { ncRedShift(address(), value); return this; } + /** Sets the specified value to the {@link #cGreenBits} field. */ + public PIXELFORMATDESCRIPTOR cGreenBits(@NativeType("BYTE") byte value) { ncGreenBits(address(), value); return this; } + /** Sets the specified value to the {@link #cGreenShift} field. */ + public PIXELFORMATDESCRIPTOR cGreenShift(@NativeType("BYTE") byte value) { ncGreenShift(address(), value); return this; } + /** Sets the specified value to the {@link #cBlueBits} field. */ + public PIXELFORMATDESCRIPTOR cBlueBits(@NativeType("BYTE") byte value) { ncBlueBits(address(), value); return this; } + /** Sets the specified value to the {@link #cBlueShift} field. */ + public PIXELFORMATDESCRIPTOR cBlueShift(@NativeType("BYTE") byte value) { ncBlueShift(address(), value); return this; } + /** Sets the specified value to the {@link #cAlphaBits} field. */ + public PIXELFORMATDESCRIPTOR cAlphaBits(@NativeType("BYTE") byte value) { ncAlphaBits(address(), value); return this; } + /** Sets the specified value to the {@link #cAlphaShift} field. */ + public PIXELFORMATDESCRIPTOR cAlphaShift(@NativeType("BYTE") byte value) { ncAlphaShift(address(), value); return this; } + /** Sets the specified value to the {@link #cAccumBits} field. */ + public PIXELFORMATDESCRIPTOR cAccumBits(@NativeType("BYTE") byte value) { ncAccumBits(address(), value); return this; } + /** Sets the specified value to the {@link #cAccumRedBits} field. */ + public PIXELFORMATDESCRIPTOR cAccumRedBits(@NativeType("BYTE") byte value) { ncAccumRedBits(address(), value); return this; } + /** Sets the specified value to the {@link #cAccumGreenBits} field. */ + public PIXELFORMATDESCRIPTOR cAccumGreenBits(@NativeType("BYTE") byte value) { ncAccumGreenBits(address(), value); return this; } + /** Sets the specified value to the {@link #cAccumBlueBits} field. */ + public PIXELFORMATDESCRIPTOR cAccumBlueBits(@NativeType("BYTE") byte value) { ncAccumBlueBits(address(), value); return this; } + /** Sets the specified value to the {@link #cAccumAlphaBits} field. */ + public PIXELFORMATDESCRIPTOR cAccumAlphaBits(@NativeType("BYTE") byte value) { ncAccumAlphaBits(address(), value); return this; } + /** Sets the specified value to the {@link #cDepthBits} field. */ + public PIXELFORMATDESCRIPTOR cDepthBits(@NativeType("BYTE") byte value) { ncDepthBits(address(), value); return this; } + /** Sets the specified value to the {@link #cStencilBits} field. */ + public PIXELFORMATDESCRIPTOR cStencilBits(@NativeType("BYTE") byte value) { ncStencilBits(address(), value); return this; } + /** Sets the specified value to the {@link #cAuxBuffers} field. */ + public PIXELFORMATDESCRIPTOR cAuxBuffers(@NativeType("BYTE") byte value) { ncAuxBuffers(address(), value); return this; } + /** Sets the specified value to the {@link #iLayerType} field. */ + public PIXELFORMATDESCRIPTOR iLayerType(@NativeType("BYTE") byte value) { niLayerType(address(), value); return this; } + /** Sets the specified value to the {@link #bReserved} field. */ + public PIXELFORMATDESCRIPTOR bReserved(@NativeType("BYTE") byte value) { nbReserved(address(), value); return this; } + /** Sets the specified value to the {@link #dwLayerMask} field. */ + public PIXELFORMATDESCRIPTOR dwLayerMask(@NativeType("DWORD") int value) { ndwLayerMask(address(), value); return this; } + /** Sets the specified value to the {@link #dwVisibleMask} field. */ + public PIXELFORMATDESCRIPTOR dwVisibleMask(@NativeType("DWORD") int value) { ndwVisibleMask(address(), value); return this; } + /** Sets the specified value to the {@link #dwDamageMask} field. */ + public PIXELFORMATDESCRIPTOR dwDamageMask(@NativeType("DWORD") int value) { ndwDamageMask(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public PIXELFORMATDESCRIPTOR set( + short nSize, + short nVersion, + int dwFlags, + byte iPixelType, + byte cColorBits, + byte cRedBits, + byte cRedShift, + byte cGreenBits, + byte cGreenShift, + byte cBlueBits, + byte cBlueShift, + byte cAlphaBits, + byte cAlphaShift, + byte cAccumBits, + byte cAccumRedBits, + byte cAccumGreenBits, + byte cAccumBlueBits, + byte cAccumAlphaBits, + byte cDepthBits, + byte cStencilBits, + byte cAuxBuffers, + byte iLayerType, + byte bReserved, + int dwLayerMask, + int dwVisibleMask, + int dwDamageMask + ) { + nSize(nSize); + nVersion(nVersion); + dwFlags(dwFlags); + iPixelType(iPixelType); + cColorBits(cColorBits); + cRedBits(cRedBits); + cRedShift(cRedShift); + cGreenBits(cGreenBits); + cGreenShift(cGreenShift); + cBlueBits(cBlueBits); + cBlueShift(cBlueShift); + cAlphaBits(cAlphaBits); + cAlphaShift(cAlphaShift); + cAccumBits(cAccumBits); + cAccumRedBits(cAccumRedBits); + cAccumGreenBits(cAccumGreenBits); + cAccumBlueBits(cAccumBlueBits); + cAccumAlphaBits(cAccumAlphaBits); + cDepthBits(cDepthBits); + cStencilBits(cStencilBits); + cAuxBuffers(cAuxBuffers); + iLayerType(iLayerType); + bReserved(bReserved); + dwLayerMask(dwLayerMask); + dwVisibleMask(dwVisibleMask); + dwDamageMask(dwDamageMask); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public PIXELFORMATDESCRIPTOR set(PIXELFORMATDESCRIPTOR src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code PIXELFORMATDESCRIPTOR} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static PIXELFORMATDESCRIPTOR malloc() { + return new PIXELFORMATDESCRIPTOR(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code PIXELFORMATDESCRIPTOR} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static PIXELFORMATDESCRIPTOR calloc() { + return new PIXELFORMATDESCRIPTOR(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code PIXELFORMATDESCRIPTOR} instance allocated with {@link BufferUtils}. */ + public static PIXELFORMATDESCRIPTOR create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new PIXELFORMATDESCRIPTOR(memAddress(container), container); + } + + /** Returns a new {@code PIXELFORMATDESCRIPTOR} instance for the specified memory address. */ + public static PIXELFORMATDESCRIPTOR create(long address) { + return new PIXELFORMATDESCRIPTOR(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static PIXELFORMATDESCRIPTOR createSafe(long address) { + return address == NULL ? null : new PIXELFORMATDESCRIPTOR(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static PIXELFORMATDESCRIPTOR mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static PIXELFORMATDESCRIPTOR callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static PIXELFORMATDESCRIPTOR mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static PIXELFORMATDESCRIPTOR callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code PIXELFORMATDESCRIPTOR} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static PIXELFORMATDESCRIPTOR malloc(MemoryStack stack) { + return new PIXELFORMATDESCRIPTOR(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code PIXELFORMATDESCRIPTOR} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static PIXELFORMATDESCRIPTOR calloc(MemoryStack stack) { + return new PIXELFORMATDESCRIPTOR(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #nSize}. */ + public static short nnSize(long struct) { return UNSAFE.getShort(null, struct + PIXELFORMATDESCRIPTOR.NSIZE); } + /** Unsafe version of {@link #nVersion}. */ + public static short nnVersion(long struct) { return UNSAFE.getShort(null, struct + PIXELFORMATDESCRIPTOR.NVERSION); } + /** Unsafe version of {@link #dwFlags}. */ + public static int ndwFlags(long struct) { return UNSAFE.getInt(null, struct + PIXELFORMATDESCRIPTOR.DWFLAGS); } + /** Unsafe version of {@link #iPixelType}. */ + public static byte niPixelType(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.IPIXELTYPE); } + /** Unsafe version of {@link #cColorBits}. */ + public static byte ncColorBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CCOLORBITS); } + /** Unsafe version of {@link #cRedBits}. */ + public static byte ncRedBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CREDBITS); } + /** Unsafe version of {@link #cRedShift}. */ + public static byte ncRedShift(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CREDSHIFT); } + /** Unsafe version of {@link #cGreenBits}. */ + public static byte ncGreenBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CGREENBITS); } + /** Unsafe version of {@link #cGreenShift}. */ + public static byte ncGreenShift(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CGREENSHIFT); } + /** Unsafe version of {@link #cBlueBits}. */ + public static byte ncBlueBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CBLUEBITS); } + /** Unsafe version of {@link #cBlueShift}. */ + public static byte ncBlueShift(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CBLUESHIFT); } + /** Unsafe version of {@link #cAlphaBits}. */ + public static byte ncAlphaBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CALPHABITS); } + /** Unsafe version of {@link #cAlphaShift}. */ + public static byte ncAlphaShift(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CALPHASHIFT); } + /** Unsafe version of {@link #cAccumBits}. */ + public static byte ncAccumBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CACCUMBITS); } + /** Unsafe version of {@link #cAccumRedBits}. */ + public static byte ncAccumRedBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CACCUMREDBITS); } + /** Unsafe version of {@link #cAccumGreenBits}. */ + public static byte ncAccumGreenBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CACCUMGREENBITS); } + /** Unsafe version of {@link #cAccumBlueBits}. */ + public static byte ncAccumBlueBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CACCUMBLUEBITS); } + /** Unsafe version of {@link #cAccumAlphaBits}. */ + public static byte ncAccumAlphaBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CACCUMALPHABITS); } + /** Unsafe version of {@link #cDepthBits}. */ + public static byte ncDepthBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CDEPTHBITS); } + /** Unsafe version of {@link #cStencilBits}. */ + public static byte ncStencilBits(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CSTENCILBITS); } + /** Unsafe version of {@link #cAuxBuffers}. */ + public static byte ncAuxBuffers(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.CAUXBUFFERS); } + /** Unsafe version of {@link #iLayerType}. */ + public static byte niLayerType(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.ILAYERTYPE); } + /** Unsafe version of {@link #bReserved}. */ + public static byte nbReserved(long struct) { return UNSAFE.getByte(null, struct + PIXELFORMATDESCRIPTOR.BRESERVED); } + /** Unsafe version of {@link #dwLayerMask}. */ + public static int ndwLayerMask(long struct) { return UNSAFE.getInt(null, struct + PIXELFORMATDESCRIPTOR.DWLAYERMASK); } + /** Unsafe version of {@link #dwVisibleMask}. */ + public static int ndwVisibleMask(long struct) { return UNSAFE.getInt(null, struct + PIXELFORMATDESCRIPTOR.DWVISIBLEMASK); } + /** Unsafe version of {@link #dwDamageMask}. */ + public static int ndwDamageMask(long struct) { return UNSAFE.getInt(null, struct + PIXELFORMATDESCRIPTOR.DWDAMAGEMASK); } + + /** Unsafe version of {@link #nSize(short) nSize}. */ + public static void nnSize(long struct, short value) { UNSAFE.putShort(null, struct + PIXELFORMATDESCRIPTOR.NSIZE, value); } + /** Unsafe version of {@link #nVersion(short) nVersion}. */ + public static void nnVersion(long struct, short value) { UNSAFE.putShort(null, struct + PIXELFORMATDESCRIPTOR.NVERSION, value); } + /** Unsafe version of {@link #dwFlags(int) dwFlags}. */ + public static void ndwFlags(long struct, int value) { UNSAFE.putInt(null, struct + PIXELFORMATDESCRIPTOR.DWFLAGS, value); } + /** Unsafe version of {@link #iPixelType(byte) iPixelType}. */ + public static void niPixelType(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.IPIXELTYPE, value); } + /** Unsafe version of {@link #cColorBits(byte) cColorBits}. */ + public static void ncColorBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CCOLORBITS, value); } + /** Unsafe version of {@link #cRedBits(byte) cRedBits}. */ + public static void ncRedBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CREDBITS, value); } + /** Unsafe version of {@link #cRedShift(byte) cRedShift}. */ + public static void ncRedShift(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CREDSHIFT, value); } + /** Unsafe version of {@link #cGreenBits(byte) cGreenBits}. */ + public static void ncGreenBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CGREENBITS, value); } + /** Unsafe version of {@link #cGreenShift(byte) cGreenShift}. */ + public static void ncGreenShift(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CGREENSHIFT, value); } + /** Unsafe version of {@link #cBlueBits(byte) cBlueBits}. */ + public static void ncBlueBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CBLUEBITS, value); } + /** Unsafe version of {@link #cBlueShift(byte) cBlueShift}. */ + public static void ncBlueShift(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CBLUESHIFT, value); } + /** Unsafe version of {@link #cAlphaBits(byte) cAlphaBits}. */ + public static void ncAlphaBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CALPHABITS, value); } + /** Unsafe version of {@link #cAlphaShift(byte) cAlphaShift}. */ + public static void ncAlphaShift(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CALPHASHIFT, value); } + /** Unsafe version of {@link #cAccumBits(byte) cAccumBits}. */ + public static void ncAccumBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CACCUMBITS, value); } + /** Unsafe version of {@link #cAccumRedBits(byte) cAccumRedBits}. */ + public static void ncAccumRedBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CACCUMREDBITS, value); } + /** Unsafe version of {@link #cAccumGreenBits(byte) cAccumGreenBits}. */ + public static void ncAccumGreenBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CACCUMGREENBITS, value); } + /** Unsafe version of {@link #cAccumBlueBits(byte) cAccumBlueBits}. */ + public static void ncAccumBlueBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CACCUMBLUEBITS, value); } + /** Unsafe version of {@link #cAccumAlphaBits(byte) cAccumAlphaBits}. */ + public static void ncAccumAlphaBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CACCUMALPHABITS, value); } + /** Unsafe version of {@link #cDepthBits(byte) cDepthBits}. */ + public static void ncDepthBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CDEPTHBITS, value); } + /** Unsafe version of {@link #cStencilBits(byte) cStencilBits}. */ + public static void ncStencilBits(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CSTENCILBITS, value); } + /** Unsafe version of {@link #cAuxBuffers(byte) cAuxBuffers}. */ + public static void ncAuxBuffers(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.CAUXBUFFERS, value); } + /** Unsafe version of {@link #iLayerType(byte) iLayerType}. */ + public static void niLayerType(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.ILAYERTYPE, value); } + /** Unsafe version of {@link #bReserved(byte) bReserved}. */ + public static void nbReserved(long struct, byte value) { UNSAFE.putByte(null, struct + PIXELFORMATDESCRIPTOR.BRESERVED, value); } + /** Unsafe version of {@link #dwLayerMask(int) dwLayerMask}. */ + public static void ndwLayerMask(long struct, int value) { UNSAFE.putInt(null, struct + PIXELFORMATDESCRIPTOR.DWLAYERMASK, value); } + /** Unsafe version of {@link #dwVisibleMask(int) dwVisibleMask}. */ + public static void ndwVisibleMask(long struct, int value) { UNSAFE.putInt(null, struct + PIXELFORMATDESCRIPTOR.DWVISIBLEMASK, value); } + /** Unsafe version of {@link #dwDamageMask(int) dwDamageMask}. */ + public static void ndwDamageMask(long struct, int value) { UNSAFE.putInt(null, struct + PIXELFORMATDESCRIPTOR.DWDAMAGEMASK, value); } + + // ----------------------------------- + + /** An array of {@link PIXELFORMATDESCRIPTOR} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final PIXELFORMATDESCRIPTOR ELEMENT_FACTORY = PIXELFORMATDESCRIPTOR.create(-1L); + + /** + * Creates a new {@code PIXELFORMATDESCRIPTOR.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link PIXELFORMATDESCRIPTOR#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected PIXELFORMATDESCRIPTOR getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#nSize} field. */ + @NativeType("WORD") + public short nSize() { return PIXELFORMATDESCRIPTOR.nnSize(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#nVersion} field. */ + @NativeType("WORD") + public short nVersion() { return PIXELFORMATDESCRIPTOR.nnVersion(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#dwFlags} field. */ + @NativeType("DWORD") + public int dwFlags() { return PIXELFORMATDESCRIPTOR.ndwFlags(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#iPixelType} field. */ + @NativeType("BYTE") + public byte iPixelType() { return PIXELFORMATDESCRIPTOR.niPixelType(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cColorBits} field. */ + @NativeType("BYTE") + public byte cColorBits() { return PIXELFORMATDESCRIPTOR.ncColorBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cRedBits} field. */ + @NativeType("BYTE") + public byte cRedBits() { return PIXELFORMATDESCRIPTOR.ncRedBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cRedShift} field. */ + @NativeType("BYTE") + public byte cRedShift() { return PIXELFORMATDESCRIPTOR.ncRedShift(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cGreenBits} field. */ + @NativeType("BYTE") + public byte cGreenBits() { return PIXELFORMATDESCRIPTOR.ncGreenBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cGreenShift} field. */ + @NativeType("BYTE") + public byte cGreenShift() { return PIXELFORMATDESCRIPTOR.ncGreenShift(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cBlueBits} field. */ + @NativeType("BYTE") + public byte cBlueBits() { return PIXELFORMATDESCRIPTOR.ncBlueBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cBlueShift} field. */ + @NativeType("BYTE") + public byte cBlueShift() { return PIXELFORMATDESCRIPTOR.ncBlueShift(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cAlphaBits} field. */ + @NativeType("BYTE") + public byte cAlphaBits() { return PIXELFORMATDESCRIPTOR.ncAlphaBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cAlphaShift} field. */ + @NativeType("BYTE") + public byte cAlphaShift() { return PIXELFORMATDESCRIPTOR.ncAlphaShift(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cAccumBits} field. */ + @NativeType("BYTE") + public byte cAccumBits() { return PIXELFORMATDESCRIPTOR.ncAccumBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cAccumRedBits} field. */ + @NativeType("BYTE") + public byte cAccumRedBits() { return PIXELFORMATDESCRIPTOR.ncAccumRedBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cAccumGreenBits} field. */ + @NativeType("BYTE") + public byte cAccumGreenBits() { return PIXELFORMATDESCRIPTOR.ncAccumGreenBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cAccumBlueBits} field. */ + @NativeType("BYTE") + public byte cAccumBlueBits() { return PIXELFORMATDESCRIPTOR.ncAccumBlueBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cAccumAlphaBits} field. */ + @NativeType("BYTE") + public byte cAccumAlphaBits() { return PIXELFORMATDESCRIPTOR.ncAccumAlphaBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cDepthBits} field. */ + @NativeType("BYTE") + public byte cDepthBits() { return PIXELFORMATDESCRIPTOR.ncDepthBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cStencilBits} field. */ + @NativeType("BYTE") + public byte cStencilBits() { return PIXELFORMATDESCRIPTOR.ncStencilBits(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#cAuxBuffers} field. */ + @NativeType("BYTE") + public byte cAuxBuffers() { return PIXELFORMATDESCRIPTOR.ncAuxBuffers(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#iLayerType} field. */ + @NativeType("BYTE") + public byte iLayerType() { return PIXELFORMATDESCRIPTOR.niLayerType(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#bReserved} field. */ + @NativeType("BYTE") + public byte bReserved() { return PIXELFORMATDESCRIPTOR.nbReserved(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#dwLayerMask} field. */ + @NativeType("DWORD") + public int dwLayerMask() { return PIXELFORMATDESCRIPTOR.ndwLayerMask(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#dwVisibleMask} field. */ + @NativeType("DWORD") + public int dwVisibleMask() { return PIXELFORMATDESCRIPTOR.ndwVisibleMask(address()); } + /** @return the value of the {@link PIXELFORMATDESCRIPTOR#dwDamageMask} field. */ + @NativeType("DWORD") + public int dwDamageMask() { return PIXELFORMATDESCRIPTOR.ndwDamageMask(address()); } + + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#nSize} field. */ + public Buffer nSize(@NativeType("WORD") short value) { PIXELFORMATDESCRIPTOR.nnSize(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#nVersion} field. */ + public Buffer nVersion(@NativeType("WORD") short value) { PIXELFORMATDESCRIPTOR.nnVersion(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#dwFlags} field. */ + public Buffer dwFlags(@NativeType("DWORD") int value) { PIXELFORMATDESCRIPTOR.ndwFlags(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#iPixelType} field. */ + public Buffer iPixelType(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.niPixelType(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cColorBits} field. */ + public Buffer cColorBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncColorBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cRedBits} field. */ + public Buffer cRedBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncRedBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cRedShift} field. */ + public Buffer cRedShift(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncRedShift(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cGreenBits} field. */ + public Buffer cGreenBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncGreenBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cGreenShift} field. */ + public Buffer cGreenShift(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncGreenShift(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cBlueBits} field. */ + public Buffer cBlueBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncBlueBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cBlueShift} field. */ + public Buffer cBlueShift(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncBlueShift(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cAlphaBits} field. */ + public Buffer cAlphaBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncAlphaBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cAlphaShift} field. */ + public Buffer cAlphaShift(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncAlphaShift(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cAccumBits} field. */ + public Buffer cAccumBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncAccumBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cAccumRedBits} field. */ + public Buffer cAccumRedBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncAccumRedBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cAccumGreenBits} field. */ + public Buffer cAccumGreenBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncAccumGreenBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cAccumBlueBits} field. */ + public Buffer cAccumBlueBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncAccumBlueBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cAccumAlphaBits} field. */ + public Buffer cAccumAlphaBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncAccumAlphaBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cDepthBits} field. */ + public Buffer cDepthBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncDepthBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cStencilBits} field. */ + public Buffer cStencilBits(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncStencilBits(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#cAuxBuffers} field. */ + public Buffer cAuxBuffers(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.ncAuxBuffers(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#iLayerType} field. */ + public Buffer iLayerType(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.niLayerType(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#bReserved} field. */ + public Buffer bReserved(@NativeType("BYTE") byte value) { PIXELFORMATDESCRIPTOR.nbReserved(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#dwLayerMask} field. */ + public Buffer dwLayerMask(@NativeType("DWORD") int value) { PIXELFORMATDESCRIPTOR.ndwLayerMask(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#dwVisibleMask} field. */ + public Buffer dwVisibleMask(@NativeType("DWORD") int value) { PIXELFORMATDESCRIPTOR.ndwVisibleMask(address(), value); return this; } + /** Sets the specified value to the {@link PIXELFORMATDESCRIPTOR#dwDamageMask} field. */ + public Buffer dwDamageMask(@NativeType("DWORD") int value) { PIXELFORMATDESCRIPTOR.ndwDamageMask(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/POINT.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/POINT.java new file mode 100644 index 000000000..a90b95453 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/POINT.java @@ -0,0 +1,306 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Defines the x- and y- coordinates of a point. + * + *

    Layout

    + * + *
    
    + * struct POINT {
    + *     LONG {@link #x};
    + *     LONG {@link #y};
    + * }
    + */ +public class POINT extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X, + Y; + + static { + Layout layout = __struct( + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X = layout.offsetof(0); + Y = layout.offsetof(1); + } + + protected POINT(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected POINT create(long address, @Nullable ByteBuffer container) { + return new POINT(address, container); + } + + /** + * Creates a {@code POINT} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public POINT(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the x-coordinate of the point */ + @NativeType("LONG") + public int x() { return nx(address()); } + /** the y-coordinate of the point */ + @NativeType("LONG") + public int y() { return ny(address()); } + + /** Sets the specified value to the {@link #x} field. */ + public POINT x(@NativeType("LONG") int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@link #y} field. */ + public POINT y(@NativeType("LONG") int value) { ny(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public POINT set( + int x, + int y + ) { + x(x); + y(y); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public POINT set(POINT src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code POINT} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static POINT malloc() { + return new POINT(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code POINT} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static POINT calloc() { + return new POINT(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code POINT} instance allocated with {@link BufferUtils}. */ + public static POINT create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new POINT(memAddress(container), container); + } + + /** Returns a new {@code POINT} instance for the specified memory address. */ + public static POINT create(long address) { + return new POINT(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static POINT createSafe(long address) { + return address == NULL ? null : new POINT(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static POINT mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static POINT callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static POINT mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static POINT callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code POINT} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static POINT malloc(MemoryStack stack) { + return new POINT(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code POINT} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static POINT calloc(MemoryStack stack) { + return new POINT(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + POINT.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + POINT.Y); } + + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + POINT.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + POINT.Y, value); } + + // ----------------------------------- + + /** An array of {@link POINT} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final POINT ELEMENT_FACTORY = POINT.create(-1L); + + /** + * Creates a new {@code POINT.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link POINT#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected POINT getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link POINT#x} field. */ + @NativeType("LONG") + public int x() { return POINT.nx(address()); } + /** @return the value of the {@link POINT#y} field. */ + @NativeType("LONG") + public int y() { return POINT.ny(address()); } + + /** Sets the specified value to the {@link POINT#x} field. */ + public Buffer x(@NativeType("LONG") int value) { POINT.nx(address(), value); return this; } + /** Sets the specified value to the {@link POINT#y} field. */ + public Buffer y(@NativeType("LONG") int value) { POINT.ny(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/POINTL.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/POINTL.java new file mode 100644 index 000000000..f79f563f0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/POINTL.java @@ -0,0 +1,306 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains the coordinates of a point. + * + *

    Layout

    + * + *
    
    + * struct POINTL {
    + *     LONG {@link #x};
    + *     LONG {@link #y};
    + * }
    + */ +public class POINTL extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X, + Y; + + static { + Layout layout = __struct( + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X = layout.offsetof(0); + Y = layout.offsetof(1); + } + + protected POINTL(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected POINTL create(long address, @Nullable ByteBuffer container) { + return new POINTL(address, container); + } + + /** + * Creates a {@code POINTL} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public POINTL(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the horizontal (x) coordinate of the point */ + @NativeType("LONG") + public int x() { return nx(address()); } + /** the vertical (y) coordinate of the point. */ + @NativeType("LONG") + public int y() { return ny(address()); } + + /** Sets the specified value to the {@link #x} field. */ + public POINTL x(@NativeType("LONG") int value) { nx(address(), value); return this; } + /** Sets the specified value to the {@link #y} field. */ + public POINTL y(@NativeType("LONG") int value) { ny(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public POINTL set( + int x, + int y + ) { + x(x); + y(y); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public POINTL set(POINTL src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code POINTL} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static POINTL malloc() { + return new POINTL(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code POINTL} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static POINTL calloc() { + return new POINTL(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code POINTL} instance allocated with {@link BufferUtils}. */ + public static POINTL create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new POINTL(memAddress(container), container); + } + + /** Returns a new {@code POINTL} instance for the specified memory address. */ + public static POINTL create(long address) { + return new POINTL(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static POINTL createSafe(long address) { + return address == NULL ? null : new POINTL(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static POINTL mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static POINTL callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static POINTL mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static POINTL callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code POINTL} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static POINTL malloc(MemoryStack stack) { + return new POINTL(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code POINTL} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static POINTL calloc(MemoryStack stack) { + return new POINTL(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + POINTL.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + POINTL.Y); } + + /** Unsafe version of {@link #x(int) x}. */ + public static void nx(long struct, int value) { UNSAFE.putInt(null, struct + POINTL.X, value); } + /** Unsafe version of {@link #y(int) y}. */ + public static void ny(long struct, int value) { UNSAFE.putInt(null, struct + POINTL.Y, value); } + + // ----------------------------------- + + /** An array of {@link POINTL} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final POINTL ELEMENT_FACTORY = POINTL.create(-1L); + + /** + * Creates a new {@code POINTL.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link POINTL#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected POINTL getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link POINTL#x} field. */ + @NativeType("LONG") + public int x() { return POINTL.nx(address()); } + /** @return the value of the {@link POINTL#y} field. */ + @NativeType("LONG") + public int y() { return POINTL.ny(address()); } + + /** Sets the specified value to the {@link POINTL#x} field. */ + public Buffer x(@NativeType("LONG") int value) { POINTL.nx(address(), value); return this; } + /** Sets the specified value to the {@link POINTL#y} field. */ + public Buffer y(@NativeType("LONG") int value) { POINTL.ny(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/RECT.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/RECT.java new file mode 100644 index 000000000..473723ae8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/RECT.java @@ -0,0 +1,346 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Defines the coordinates of the upper-left and lower-right corners of a rectangle. + * + *

    Layout

    + * + *
    
    + * struct RECT {
    + *     LONG {@link #left};
    + *     LONG {@link #top};
    + *     LONG {@link #right};
    + *     LONG {@link #bottom};
    + * }
    + */ +public class RECT extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + LEFT, + TOP, + RIGHT, + BOTTOM; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + LEFT = layout.offsetof(0); + TOP = layout.offsetof(1); + RIGHT = layout.offsetof(2); + BOTTOM = layout.offsetof(3); + } + + protected RECT(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected RECT create(long address, @Nullable ByteBuffer container) { + return new RECT(address, container); + } + + /** + * Creates a {@code RECT} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public RECT(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the x-coordinate of the upper-left corner of the rectangle */ + @NativeType("LONG") + public int left() { return nleft(address()); } + /** the y-coordinate of the upper-left corner of the rectangle */ + @NativeType("LONG") + public int top() { return ntop(address()); } + /** the x-coordinate of the lower-right corner of the rectangle */ + @NativeType("LONG") + public int right() { return nright(address()); } + /** the y-coordinate of the lower-right corner of the rectangle */ + @NativeType("LONG") + public int bottom() { return nbottom(address()); } + + /** Sets the specified value to the {@link #left} field. */ + public RECT left(@NativeType("LONG") int value) { nleft(address(), value); return this; } + /** Sets the specified value to the {@link #top} field. */ + public RECT top(@NativeType("LONG") int value) { ntop(address(), value); return this; } + /** Sets the specified value to the {@link #right} field. */ + public RECT right(@NativeType("LONG") int value) { nright(address(), value); return this; } + /** Sets the specified value to the {@link #bottom} field. */ + public RECT bottom(@NativeType("LONG") int value) { nbottom(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public RECT set( + int left, + int top, + int right, + int bottom + ) { + left(left); + top(top); + right(right); + bottom(bottom); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public RECT set(RECT src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code RECT} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static RECT malloc() { + return new RECT(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code RECT} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static RECT calloc() { + return new RECT(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code RECT} instance allocated with {@link BufferUtils}. */ + public static RECT create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new RECT(memAddress(container), container); + } + + /** Returns a new {@code RECT} instance for the specified memory address. */ + public static RECT create(long address) { + return new RECT(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static RECT createSafe(long address) { + return address == NULL ? null : new RECT(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static RECT mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static RECT callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static RECT mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static RECT callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code RECT} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static RECT malloc(MemoryStack stack) { + return new RECT(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code RECT} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static RECT calloc(MemoryStack stack) { + return new RECT(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #left}. */ + public static int nleft(long struct) { return UNSAFE.getInt(null, struct + RECT.LEFT); } + /** Unsafe version of {@link #top}. */ + public static int ntop(long struct) { return UNSAFE.getInt(null, struct + RECT.TOP); } + /** Unsafe version of {@link #right}. */ + public static int nright(long struct) { return UNSAFE.getInt(null, struct + RECT.RIGHT); } + /** Unsafe version of {@link #bottom}. */ + public static int nbottom(long struct) { return UNSAFE.getInt(null, struct + RECT.BOTTOM); } + + /** Unsafe version of {@link #left(int) left}. */ + public static void nleft(long struct, int value) { UNSAFE.putInt(null, struct + RECT.LEFT, value); } + /** Unsafe version of {@link #top(int) top}. */ + public static void ntop(long struct, int value) { UNSAFE.putInt(null, struct + RECT.TOP, value); } + /** Unsafe version of {@link #right(int) right}. */ + public static void nright(long struct, int value) { UNSAFE.putInt(null, struct + RECT.RIGHT, value); } + /** Unsafe version of {@link #bottom(int) bottom}. */ + public static void nbottom(long struct, int value) { UNSAFE.putInt(null, struct + RECT.BOTTOM, value); } + + // ----------------------------------- + + /** An array of {@link RECT} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final RECT ELEMENT_FACTORY = RECT.create(-1L); + + /** + * Creates a new {@code RECT.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link RECT#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected RECT getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link RECT#left} field. */ + @NativeType("LONG") + public int left() { return RECT.nleft(address()); } + /** @return the value of the {@link RECT#top} field. */ + @NativeType("LONG") + public int top() { return RECT.ntop(address()); } + /** @return the value of the {@link RECT#right} field. */ + @NativeType("LONG") + public int right() { return RECT.nright(address()); } + /** @return the value of the {@link RECT#bottom} field. */ + @NativeType("LONG") + public int bottom() { return RECT.nbottom(address()); } + + /** Sets the specified value to the {@link RECT#left} field. */ + public Buffer left(@NativeType("LONG") int value) { RECT.nleft(address(), value); return this; } + /** Sets the specified value to the {@link RECT#top} field. */ + public Buffer top(@NativeType("LONG") int value) { RECT.ntop(address(), value); return this; } + /** Sets the specified value to the {@link RECT#right} field. */ + public Buffer right(@NativeType("LONG") int value) { RECT.nright(address(), value); return this; } + /** Sets the specified value to the {@link RECT#bottom} field. */ + public Buffer bottom(@NativeType("LONG") int value) { RECT.nbottom(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/SECURITY_ATTRIBUTES.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/SECURITY_ATTRIBUTES.java new file mode 100644 index 000000000..7af9ef18a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/SECURITY_ATTRIBUTES.java @@ -0,0 +1,343 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains the security descriptor for an object and specifies whether the handle retrieved by specifying this structure is inheritable. This structure + * provides security settings for objects created by various functions, such as {@code CreateFile}, {@code CreatePipe}, {@code CreateProcess}, + * {@code RegCreateKeyEx}, or {@code RegSaveKeyEx}. + * + *

    Layout

    + * + *
    
    + * struct SECURITY_ATTRIBUTES {
    + *     DWORD {@link #nLength};
    + *     LPVOID {@link #lpSecurityDescriptor};
    + *     BOOL {@link #bInheritHandle};
    + * }
    + */ +public class SECURITY_ATTRIBUTES extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NLENGTH, + LPSECURITYDESCRIPTOR, + BINHERITHANDLE; + + static { + Layout layout = __struct( + __member(4), + __member(POINTER_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NLENGTH = layout.offsetof(0); + LPSECURITYDESCRIPTOR = layout.offsetof(1); + BINHERITHANDLE = layout.offsetof(2); + } + + protected SECURITY_ATTRIBUTES(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected SECURITY_ATTRIBUTES create(long address, @Nullable ByteBuffer container) { + return new SECURITY_ATTRIBUTES(address, container); + } + + /** + * Creates a {@code SECURITY_ATTRIBUTES} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public SECURITY_ATTRIBUTES(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the size, in bytes, of this structure. Set this value to {@link #SIZEOF}. */ + @NativeType("DWORD") + public int nLength() { return nnLength(address()); } + /** + * a pointer to a {@code SECURITY_DESCRIPTOR} structure that controls access to the object. If the value of this member is {@code NULL}, the object is assigned + * the default security descriptor associated with the access token of the calling process. This is not the same as granting access to everyone by + * assigning a {@code NULL} discretionary access control list (DACL). By default, the default DACL in the access token of a process allows access only to the + * user represented by the access token. + */ + @NativeType("LPVOID") + public long lpSecurityDescriptor() { return nlpSecurityDescriptor(address()); } + /** specifies whether the returned handle is inherited when a new process is created. If this member is {@code TRUE}, the new process inherits the handle. */ + @NativeType("BOOL") + public boolean bInheritHandle() { return nbInheritHandle(address()) != 0; } + + /** Sets the specified value to the {@link #nLength} field. */ + public SECURITY_ATTRIBUTES nLength(@NativeType("DWORD") int value) { nnLength(address(), value); return this; } + /** Sets the specified value to the {@link #lpSecurityDescriptor} field. */ + public SECURITY_ATTRIBUTES lpSecurityDescriptor(@NativeType("LPVOID") long value) { nlpSecurityDescriptor(address(), value); return this; } + /** Sets the specified value to the {@link #bInheritHandle} field. */ + public SECURITY_ATTRIBUTES bInheritHandle(@NativeType("BOOL") boolean value) { nbInheritHandle(address(), value ? 1 : 0); return this; } + + /** Initializes this struct with the specified values. */ + public SECURITY_ATTRIBUTES set( + int nLength, + long lpSecurityDescriptor, + boolean bInheritHandle + ) { + nLength(nLength); + lpSecurityDescriptor(lpSecurityDescriptor); + bInheritHandle(bInheritHandle); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public SECURITY_ATTRIBUTES set(SECURITY_ATTRIBUTES src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code SECURITY_ATTRIBUTES} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static SECURITY_ATTRIBUTES malloc() { + return new SECURITY_ATTRIBUTES(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code SECURITY_ATTRIBUTES} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static SECURITY_ATTRIBUTES calloc() { + return new SECURITY_ATTRIBUTES(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code SECURITY_ATTRIBUTES} instance allocated with {@link BufferUtils}. */ + public static SECURITY_ATTRIBUTES create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new SECURITY_ATTRIBUTES(memAddress(container), container); + } + + /** Returns a new {@code SECURITY_ATTRIBUTES} instance for the specified memory address. */ + public static SECURITY_ATTRIBUTES create(long address) { + return new SECURITY_ATTRIBUTES(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static SECURITY_ATTRIBUTES createSafe(long address) { + return address == NULL ? null : new SECURITY_ATTRIBUTES(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static SECURITY_ATTRIBUTES mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static SECURITY_ATTRIBUTES callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static SECURITY_ATTRIBUTES mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static SECURITY_ATTRIBUTES callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code SECURITY_ATTRIBUTES} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static SECURITY_ATTRIBUTES malloc(MemoryStack stack) { + return new SECURITY_ATTRIBUTES(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code SECURITY_ATTRIBUTES} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static SECURITY_ATTRIBUTES calloc(MemoryStack stack) { + return new SECURITY_ATTRIBUTES(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #nLength}. */ + public static int nnLength(long struct) { return UNSAFE.getInt(null, struct + SECURITY_ATTRIBUTES.NLENGTH); } + /** Unsafe version of {@link #lpSecurityDescriptor}. */ + public static long nlpSecurityDescriptor(long struct) { return memGetAddress(struct + SECURITY_ATTRIBUTES.LPSECURITYDESCRIPTOR); } + /** Unsafe version of {@link #bInheritHandle}. */ + public static int nbInheritHandle(long struct) { return UNSAFE.getInt(null, struct + SECURITY_ATTRIBUTES.BINHERITHANDLE); } + + /** Unsafe version of {@link #nLength(int) nLength}. */ + public static void nnLength(long struct, int value) { UNSAFE.putInt(null, struct + SECURITY_ATTRIBUTES.NLENGTH, value); } + /** Unsafe version of {@link #lpSecurityDescriptor(long) lpSecurityDescriptor}. */ + public static void nlpSecurityDescriptor(long struct, long value) { memPutAddress(struct + SECURITY_ATTRIBUTES.LPSECURITYDESCRIPTOR, check(value)); } + /** Unsafe version of {@link #bInheritHandle(boolean) bInheritHandle}. */ + public static void nbInheritHandle(long struct, int value) { UNSAFE.putInt(null, struct + SECURITY_ATTRIBUTES.BINHERITHANDLE, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + SECURITY_ATTRIBUTES.LPSECURITYDESCRIPTOR)); + } + + // ----------------------------------- + + /** An array of {@link SECURITY_ATTRIBUTES} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final SECURITY_ATTRIBUTES ELEMENT_FACTORY = SECURITY_ATTRIBUTES.create(-1L); + + /** + * Creates a new {@code SECURITY_ATTRIBUTES.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link SECURITY_ATTRIBUTES#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected SECURITY_ATTRIBUTES getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link SECURITY_ATTRIBUTES#nLength} field. */ + @NativeType("DWORD") + public int nLength() { return SECURITY_ATTRIBUTES.nnLength(address()); } + /** @return the value of the {@link SECURITY_ATTRIBUTES#lpSecurityDescriptor} field. */ + @NativeType("LPVOID") + public long lpSecurityDescriptor() { return SECURITY_ATTRIBUTES.nlpSecurityDescriptor(address()); } + /** @return the value of the {@link SECURITY_ATTRIBUTES#bInheritHandle} field. */ + @NativeType("BOOL") + public boolean bInheritHandle() { return SECURITY_ATTRIBUTES.nbInheritHandle(address()) != 0; } + + /** Sets the specified value to the {@link SECURITY_ATTRIBUTES#nLength} field. */ + public Buffer nLength(@NativeType("DWORD") int value) { SECURITY_ATTRIBUTES.nnLength(address(), value); return this; } + /** Sets the specified value to the {@link SECURITY_ATTRIBUTES#lpSecurityDescriptor} field. */ + public Buffer lpSecurityDescriptor(@NativeType("LPVOID") long value) { SECURITY_ATTRIBUTES.nlpSecurityDescriptor(address(), value); return this; } + /** Sets the specified value to the {@link SECURITY_ATTRIBUTES#bInheritHandle} field. */ + public Buffer bInheritHandle(@NativeType("BOOL") boolean value) { SECURITY_ATTRIBUTES.nbInheritHandle(address(), value ? 1 : 0); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/TOUCHINPUT.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/TOUCHINPUT.java new file mode 100644 index 000000000..66e16a34d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/TOUCHINPUT.java @@ -0,0 +1,384 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Encapsulates data for touch input. + * + *

    Layout

    + * + *
    
    + * struct TOUCHINPUT {
    + *     LONG {@link #x};
    + *     LONG {@link #y};
    + *     HANDLE {@link #hSource};
    + *     DWORD {@link #dwID};
    + *     DWORD {@link #dwFlags};
    + *     DWORD {@link #dwMask};
    + *     DWORD {@link #dwTime};
    + *     ULONG_PTR {@link #dwExtraInfo};
    + *     DWORD {@link #cxContact};
    + *     DWORD {@link #cyContact};
    + * }
    + */ +public class TOUCHINPUT extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X, + Y, + HSOURCE, + DWID, + DWFLAGS, + DWMASK, + DWTIME, + DWEXTRAINFO, + CXCONTACT, + CYCONTACT; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X = layout.offsetof(0); + Y = layout.offsetof(1); + HSOURCE = layout.offsetof(2); + DWID = layout.offsetof(3); + DWFLAGS = layout.offsetof(4); + DWMASK = layout.offsetof(5); + DWTIME = layout.offsetof(6); + DWEXTRAINFO = layout.offsetof(7); + CXCONTACT = layout.offsetof(8); + CYCONTACT = layout.offsetof(9); + } + + protected TOUCHINPUT(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected TOUCHINPUT create(long address, @Nullable ByteBuffer container) { + return new TOUCHINPUT(address, container); + } + + /** + * Creates a {@code TOUCHINPUT} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public TOUCHINPUT(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the x-coordinate (horizontal point) of the touch input. This member is indicated in hundredths of a pixel of physical screen coordinates. */ + @NativeType("LONG") + public int x() { return nx(address()); } + /** the y-coordinate (vertical point) of the touch input. This member is indicated in hundredths of a pixel of physical screen coordinates. */ + @NativeType("LONG") + public int y() { return ny(address()); } + /** a device handle for the source input device. Each device is given a unique provider at run time by the touch input provider. */ + @NativeType("HANDLE") + public long hSource() { return nhSource(address()); } + /** + * a touch point identifier that distinguishes a particular touch input. This value stays consistent in a touch contact sequence from the point a contact + * comes down until it comes back up. An ID may be reused later for subsequent contacts. + */ + @NativeType("DWORD") + public int dwID() { return ndwID(address()); } + /** + * a set of bit flags that specify various aspects of touch point press, release, and motion. The bits in this member can be any reasonable combination of + * the values in the Remarks section. + */ + @NativeType("DWORD") + public int dwFlags() { return ndwFlags(address()); } + /** + * a set of bit flags that specify which of the optional fields in the structure contain valid values. The availability of valid information in the + * optional fields is device-specific. Applications should use an optional field value only when the corresponding bit is set in {@code dwMask}. This + * field may contain a combination of the {@code dwMask} flags mentioned in the Remarks section. + */ + @NativeType("DWORD") + public int dwMask() { return ndwMask(address()); } + /** + * the time stamp for the event, in milliseconds. The consuming application should note that the system performs no validation on this field; when the + * {@link User32#TOUCHINPUTMASKF_TIMEFROMSYSTEM} flag is not set, the accuracy and sequencing of values in this field are completely dependent on the touch input + * provider. + */ + @NativeType("DWORD") + public int dwTime() { return ndwTime(address()); } + /** an additional value associated with the touch event. */ + @NativeType("ULONG_PTR") + public long dwExtraInfo() { return ndwExtraInfo(address()); } + /** + * the width of the touch contact area in hundredths of a pixel in physical screen coordinates. This value is only valid if the {@code dwMask} member has + * the {@link User32#TOUCHINPUTMASKF_CONTACTAREA} flag set. + */ + @NativeType("DWORD") + public int cxContact() { return ncxContact(address()); } + /** + * the height of the touch contact area in hundredths of a pixel in physical screen coordinates. This value is only valid if the {@code dwMask} member has + * the {@link User32#TOUCHINPUTMASKF_CONTACTAREA} flag set. + */ + @NativeType("DWORD") + public int cyContact() { return ncyContact(address()); } + + // ----------------------------------- + + /** Returns a new {@code TOUCHINPUT} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static TOUCHINPUT malloc() { + return new TOUCHINPUT(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code TOUCHINPUT} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static TOUCHINPUT calloc() { + return new TOUCHINPUT(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code TOUCHINPUT} instance allocated with {@link BufferUtils}. */ + public static TOUCHINPUT create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new TOUCHINPUT(memAddress(container), container); + } + + /** Returns a new {@code TOUCHINPUT} instance for the specified memory address. */ + public static TOUCHINPUT create(long address) { + return new TOUCHINPUT(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static TOUCHINPUT createSafe(long address) { + return address == NULL ? null : new TOUCHINPUT(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static TOUCHINPUT mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static TOUCHINPUT callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static TOUCHINPUT mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static TOUCHINPUT callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code TOUCHINPUT} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static TOUCHINPUT malloc(MemoryStack stack) { + return new TOUCHINPUT(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code TOUCHINPUT} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static TOUCHINPUT calloc(MemoryStack stack) { + return new TOUCHINPUT(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x}. */ + public static int nx(long struct) { return UNSAFE.getInt(null, struct + TOUCHINPUT.X); } + /** Unsafe version of {@link #y}. */ + public static int ny(long struct) { return UNSAFE.getInt(null, struct + TOUCHINPUT.Y); } + /** Unsafe version of {@link #hSource}. */ + public static long nhSource(long struct) { return memGetAddress(struct + TOUCHINPUT.HSOURCE); } + /** Unsafe version of {@link #dwID}. */ + public static int ndwID(long struct) { return UNSAFE.getInt(null, struct + TOUCHINPUT.DWID); } + /** Unsafe version of {@link #dwFlags}. */ + public static int ndwFlags(long struct) { return UNSAFE.getInt(null, struct + TOUCHINPUT.DWFLAGS); } + /** Unsafe version of {@link #dwMask}. */ + public static int ndwMask(long struct) { return UNSAFE.getInt(null, struct + TOUCHINPUT.DWMASK); } + /** Unsafe version of {@link #dwTime}. */ + public static int ndwTime(long struct) { return UNSAFE.getInt(null, struct + TOUCHINPUT.DWTIME); } + /** Unsafe version of {@link #dwExtraInfo}. */ + public static long ndwExtraInfo(long struct) { return memGetAddress(struct + TOUCHINPUT.DWEXTRAINFO); } + /** Unsafe version of {@link #cxContact}. */ + public static int ncxContact(long struct) { return UNSAFE.getInt(null, struct + TOUCHINPUT.CXCONTACT); } + /** Unsafe version of {@link #cyContact}. */ + public static int ncyContact(long struct) { return UNSAFE.getInt(null, struct + TOUCHINPUT.CYCONTACT); } + + // ----------------------------------- + + /** An array of {@link TOUCHINPUT} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final TOUCHINPUT ELEMENT_FACTORY = TOUCHINPUT.create(-1L); + + /** + * Creates a new {@code TOUCHINPUT.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link TOUCHINPUT#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected TOUCHINPUT getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link TOUCHINPUT#x} field. */ + @NativeType("LONG") + public int x() { return TOUCHINPUT.nx(address()); } + /** @return the value of the {@link TOUCHINPUT#y} field. */ + @NativeType("LONG") + public int y() { return TOUCHINPUT.ny(address()); } + /** @return the value of the {@link TOUCHINPUT#hSource} field. */ + @NativeType("HANDLE") + public long hSource() { return TOUCHINPUT.nhSource(address()); } + /** @return the value of the {@link TOUCHINPUT#dwID} field. */ + @NativeType("DWORD") + public int dwID() { return TOUCHINPUT.ndwID(address()); } + /** @return the value of the {@link TOUCHINPUT#dwFlags} field. */ + @NativeType("DWORD") + public int dwFlags() { return TOUCHINPUT.ndwFlags(address()); } + /** @return the value of the {@link TOUCHINPUT#dwMask} field. */ + @NativeType("DWORD") + public int dwMask() { return TOUCHINPUT.ndwMask(address()); } + /** @return the value of the {@link TOUCHINPUT#dwTime} field. */ + @NativeType("DWORD") + public int dwTime() { return TOUCHINPUT.ndwTime(address()); } + /** @return the value of the {@link TOUCHINPUT#dwExtraInfo} field. */ + @NativeType("ULONG_PTR") + public long dwExtraInfo() { return TOUCHINPUT.ndwExtraInfo(address()); } + /** @return the value of the {@link TOUCHINPUT#cxContact} field. */ + @NativeType("DWORD") + public int cxContact() { return TOUCHINPUT.ncxContact(address()); } + /** @return the value of the {@link TOUCHINPUT#cyContact} field. */ + @NativeType("DWORD") + public int cyContact() { return TOUCHINPUT.ncyContact(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/User32.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/User32.java new file mode 100644 index 000000000..e2a81af8b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/User32.java @@ -0,0 +1,2842 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to WinUser.h and user32.dll. */ +public class User32 { + + private static final SharedLibrary USER32 = Library.loadNative(User32.class, "org.lwjgl", "user32"); + + /** Contains the function pointers loaded from the user32 {@link SharedLibrary}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + RegisterClassEx = apiGetFunctionAddress(USER32, "RegisterClassExW"), + UnregisterClass = apiGetFunctionAddress(USER32, "UnregisterClassW"), + CreateWindowEx = apiGetFunctionAddress(USER32, "CreateWindowExW"), + DestroyWindow = apiGetFunctionAddress(USER32, "DestroyWindow"), + DefWindowProc = apiGetFunctionAddress(USER32, "DefWindowProcW"), + CallWindowProc = apiGetFunctionAddress(USER32, "CallWindowProcW"), + ShowWindow = apiGetFunctionAddress(USER32, "ShowWindow"), + UpdateWindow = apiGetFunctionAddress(USER32, "UpdateWindow"), + SetWindowPos = apiGetFunctionAddress(USER32, "SetWindowPos"), + SetWindowText = apiGetFunctionAddress(USER32, "SetWindowTextW"), + GetMessage = apiGetFunctionAddress(USER32, "GetMessageW"), + PeekMessage = apiGetFunctionAddress(USER32, "PeekMessageW"), + TranslateMessage = apiGetFunctionAddress(USER32, "TranslateMessage"), + WaitMessage = apiGetFunctionAddress(USER32, "WaitMessage"), + DispatchMessage = apiGetFunctionAddress(USER32, "DispatchMessageW"), + PostMessage = apiGetFunctionAddress(USER32, "PostMessageW"), + SendMessage = apiGetFunctionAddress(USER32, "SendMessageW"), + AdjustWindowRectEx = apiGetFunctionAddress(USER32, "AdjustWindowRectEx"), + GetWindowRect = apiGetFunctionAddress(USER32, "GetWindowRect"), + MoveWindow = apiGetFunctionAddress(USER32, "MoveWindow"), + GetWindowPlacement = apiGetFunctionAddress(USER32, "GetWindowPlacement"), + SetWindowPlacement = apiGetFunctionAddress(USER32, "SetWindowPlacement"), + IsWindowVisible = apiGetFunctionAddress(USER32, "IsWindowVisible"), + IsIconic = apiGetFunctionAddress(USER32, "IsIconic"), + IsZoomed = apiGetFunctionAddress(USER32, "IsZoomed"), + BringWindowToTop = apiGetFunctionAddress(USER32, "BringWindowToTop"), + SetWindowLongPtr = apiGetFunctionAddress(USER32, Pointer.BITS64 ? "SetWindowLongPtrW" : "SetWindowLongW"), + GetWindowLongPtr = apiGetFunctionAddress(USER32, Pointer.BITS64 ? "GetWindowLongPtrW" : "GetWindowLongW"), + SetClassLongPtr = apiGetFunctionAddress(USER32, Pointer.BITS64 ? "SetClassLongPtrW" : "SetClassLongW"), + GetClassLongPtr = apiGetFunctionAddress(USER32, Pointer.BITS64 ? "GetClassLongPtrW" : "GetClassLongW"), + SetLayeredWindowAttributes = apiGetFunctionAddress(USER32, "SetLayeredWindowAttributes"), + LoadIcon = apiGetFunctionAddress(USER32, "LoadIconW"), + LoadCursor = apiGetFunctionAddress(USER32, "LoadCursorW"), + GetDC = apiGetFunctionAddress(USER32, "GetDC"), + ReleaseDC = apiGetFunctionAddress(USER32, "ReleaseDC"), + GetSystemMetrics = apiGetFunctionAddress(USER32, "GetSystemMetrics"), + RegisterTouchWindow = apiGetFunctionAddressOptional(USER32, "RegisterTouchWindow"), + UnregisterTouchWindow = apiGetFunctionAddressOptional(USER32, "UnregisterTouchWindow"), + IsTouchWindow = apiGetFunctionAddressOptional(USER32, "IsTouchWindow"), + GetTouchInputInfo = apiGetFunctionAddressOptional(USER32, "GetTouchInputInfo"), + CloseTouchInputHandle = apiGetFunctionAddressOptional(USER32, "CloseTouchInputHandle"), + MonitorFromWindow = apiGetFunctionAddress(USER32, "MonitorFromWindow"), + GetMonitorInfo = apiGetFunctionAddress(USER32, "GetMonitorInfoW"), + EnumDisplayDevices = apiGetFunctionAddress(USER32, "EnumDisplayDevicesW"), + EnumDisplaySettingsEx = apiGetFunctionAddress(USER32, "EnumDisplaySettingsExW"), + ChangeDisplaySettingsEx = apiGetFunctionAddress(USER32, "ChangeDisplaySettingsExW"), + GetCursorPos = apiGetFunctionAddress(USER32, "GetCursorPos"), + SetCursorPos = apiGetFunctionAddress(USER32, "SetCursorPos"), + ClipCursor = apiGetFunctionAddress(USER32, "ClipCursor"), + ShowCursor = apiGetFunctionAddress(USER32, "ShowCursor"), + SetCursor = apiGetFunctionAddress(USER32, "SetCursor"), + ClientToScreen = apiGetFunctionAddress(USER32, "ClientToScreen"), + GetAsyncKeyState = apiGetFunctionAddress(USER32, "GetAsyncKeyState"), + GetMessageExtraInfo = apiGetFunctionAddress(USER32, "GetMessageExtraInfo"), + SendInput = apiGetFunctionAddress(USER32, "SendInput"), + GetDpiForSystem = apiGetFunctionAddressOptional(USER32, "GetDpiForSystem"), + GetDpiForWindow = apiGetFunctionAddressOptional(USER32, "GetDpiForWindow"), + GetAwarenessFromDpiAwarenessContext = apiGetFunctionAddressOptional(USER32, "GetAwarenessFromDpiAwarenessContext"), + GetThreadDpiAwarenessContext = apiGetFunctionAddressOptional(USER32, "GetThreadDpiAwarenessContext"), + GetWindowDpiAwarenessContext = apiGetFunctionAddressOptional(USER32, "GetWindowDpiAwarenessContext"), + IsValidDpiAwarenessContext = apiGetFunctionAddressOptional(USER32, "IsValidDpiAwarenessContext"), + SetThreadDpiAwarenessContext = apiGetFunctionAddressOptional(USER32, "SetThreadDpiAwarenessContext"); + + } + + /** Returns the user32 {@link SharedLibrary}. */ + public static SharedLibrary getLibrary() { + return USER32; + } + + /** Window Styles */ + public static final int + WS_OVERLAPPED = 0x0, + WS_POPUP = 0x80000000, + WS_CHILD = 0x40000000, + WS_MINIMIZE = 0x20000000, + WS_VISIBLE = 0x10000000, + WS_DISABLED = 0x8000000, + WS_CLIPSIBLINGS = 0x4000000, + WS_CLIPCHILDREN = 0x2000000, + WS_MAXIMIZE = 0x1000000, + WS_CAPTION = 0xC00000, + WS_BORDER = 0x800000, + WS_DLGFRAME = 0x400000, + WS_VSCROLL = 0x200000, + WS_HSCROLL = 0x100000, + WS_SYSMENU = 0x80000, + WS_THICKFRAME = 0x40000, + WS_GROUP = 0x20000, + WS_TABSTOP = 0x10000, + WS_MINIMIZEBOX = 0x20000, + WS_MAXIMIZEBOX = 0x10000, + WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, + WS_POPUPWINDOW = WS_POPUP | WS_BORDER | WS_SYSMENU, + WS_CHILDWINDOW = WS_CHILD, + WS_TILED = WS_OVERLAPPED, + WS_ICONIC = WS_MINIMIZE, + WS_SIZEBOX = WS_THICKFRAME, + WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW; + + /** Extended Window Styles */ + public static final int + WS_EX_DLGMODALFRAME = 0x1, + WS_EX_NOPARENTNOTIFY = 0x4, + WS_EX_TOPMOST = 0x8, + WS_EX_ACCEPTFILES = 0x10, + WS_EX_TRANSPARENT = 0x20, + WS_EX_MDICHILD = 0x40, + WS_EX_TOOLWINDOW = 0x80, + WS_EX_WINDOWEDGE = 0x100, + WS_EX_CLIENTEDGE = 0x200, + WS_EX_CONTEXTHELP = 0x400, + WS_EX_RIGHT = 0x1000, + WS_EX_LEFT = 0x0, + WS_EX_RTLREADING = 0x2000, + WS_EX_LTRREADING = 0x0, + WS_EX_LEFTSCROLLBAR = 0x4000, + WS_EX_RIGHTSCROLLBAR = 0x0, + WS_EX_CONTROLPARENT = 0x10000, + WS_EX_STATICEDGE = 0x20000, + WS_EX_APPWINDOW = 0x40000, + WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, + WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST, + WS_EX_LAYERED = 0x80000, + WS_EX_NOINHERITLAYOUT = 0x100000, + WS_EX_LAYOUTRTL = 0x400000, + WS_EX_COMPOSITED = 0x2000000, + WS_EX_NOACTIVATE = 0x8000000; + + /** May be used in {@link #CreateWindowEx} for the x, y, width, height parameters. */ + public static final int CW_USEDEFAULT = 0x80000000; + + /** Class styles */ + public static final int + CS_VREDRAW = 0x1, + CS_HREDRAW = 0x2, + CS_DBLCLKS = 0x8, + CS_OWNDC = 0x20, + CS_CLASSDC = 0x40, + CS_PARENTDC = 0x80, + CS_NOCLOSE = 0x200, + CS_SAVEBITS = 0x800, + CS_BYTEALIGNCLIENT = 0x1000, + CS_BYTEALIGNWINDOW = 0x2000, + CS_GLOBALCLASS = 0x4000, + CS_IME = 0x10000, + CS_DROPSHADOW = 0x20000; + + /** Windows messages. */ + public static final int + WM_NULL = 0x0, + WM_CREATE = 0x1, + WM_DESTROY = 0x2, + WM_MOVE = 0x3, + WM_SIZE = 0x5, + WM_ACTIVATE = 0x6, + WM_SETFOCUS = 0x7, + WM_KILLFOCUS = 0x8, + WM_ENABLE = 0xA, + WM_SETREDRAW = 0xB, + WM_SETTEXT = 0xC, + WM_GETTEXT = 0xD, + WM_GETTEXTLENGTH = 0xE, + WM_PAINT = 0xF, + WM_CLOSE = 0x10, + WM_QUERYENDSESSION = 0x11, + WM_QUERYOPEN = 0x13, + WM_ENDSESSION = 0x16, + WM_QUIT = 0x12, + WM_ERASEBKGND = 0x14, + WM_SYSCOLORCHANGE = 0x15, + WM_SHOWWINDOW = 0x18, + WM_WININICHANGE = 0x1A, + WM_SETTINGCHANGE = WM_WININICHANGE, + WM_DEVMODECHANGE = 0x1B, + WM_ACTIVATEAPP = 0x1C, + WM_FONTCHANGE = 0x1D, + WM_TIMECHANGE = 0x1E, + WM_CANCELMODE = 0x1F, + WM_SETCURSOR = 0x20, + WM_MOUSEACTIVATE = 0x21, + WM_CHILDACTIVATE = 0x22, + WM_QUEUESYNC = 0x23, + WM_GETMINMAXINFO = 0x24, + WM_PAINTICON = 0x26, + WM_ICONERASEBKGND = 0x27, + WM_NEXTDLGCTL = 0x28, + WM_SPOOLERSTATUS = 0x2A, + WM_DRAWITEM = 0x2B, + WM_MEASUREITEM = 0x2C, + WM_DELETEITEM = 0x2D, + WM_VKEYTOITEM = 0x2E, + WM_CHARTOITEM = 0x2F, + WM_SETFONT = 0x30, + WM_GETFONT = 0x31, + WM_SETHOTKEY = 0x32, + WM_GETHOTKEY = 0x33, + WM_QUERYDRAGICON = 0x37, + WM_COMPAREITEM = 0x39, + WM_GETOBJECT = 0x3D, + WM_COMPACTING = 0x41, + WM_COMMNOTIFY = 0x44, + WM_WINDOWPOSCHANGING = 0x46, + WM_WINDOWPOSCHANGED = 0x47, + WM_POWER = 0x48, + WM_COPYDATA = 0x4A, + WM_CANCELJOURNAL = 0x4B, + WM_NOTIFY = 0x4E, + WM_INPUTLANGCHANGEREQUEST = 0x50, + WM_INPUTLANGCHANGE = 0x51, + WM_TCARD = 0x52, + WM_HELP = 0x53, + WM_USERCHANGED = 0x54, + WM_NOTIFYFORMAT = 0x55, + WM_CONTEXTMENU = 0x7B, + WM_STYLECHANGING = 0x7C, + WM_STYLECHANGED = 0x7D, + WM_DISPLAYCHANGE = 0x7E, + WM_GETICON = 0x7F, + WM_SETICON = 0x80, + WM_NCCREATE = 0x81, + WM_NCDESTROY = 0x82, + WM_NCCALCSIZE = 0x83, + WM_NCHITTEST = 0x84, + WM_NCPAINT = 0x85, + WM_NCACTIVATE = 0x86, + WM_GETDLGCODE = 0x87, + WM_SYNCPAINT = 0x88, + WM_NCMOUSEMOVE = 0xA0, + WM_NCLBUTTONDOWN = 0xA1, + WM_NCLBUTTONUP = 0xA2, + WM_NCLBUTTONDBLCLK = 0xA3, + WM_NCRBUTTONDOWN = 0xA4, + WM_NCRBUTTONUP = 0xA5, + WM_NCRBUTTONDBLCLK = 0xA6, + WM_NCMBUTTONDOWN = 0xA7, + WM_NCMBUTTONUP = 0xA8, + WM_NCMBUTTONDBLCLK = 0xA9, + WM_NCXBUTTONDOWN = 0xAB, + WM_NCXBUTTONUP = 0xAC, + WM_NCXBUTTONDBLCLK = 0xAD, + WM_INPUT_DEVICE_CHANGE = 0xFE, + WM_INPUT = 0xFF, + WM_KEYFIRST = 0x100, + WM_KEYDOWN = 0x100, + WM_KEYUP = 0x101, + WM_CHAR = 0x102, + WM_DEADCHAR = 0x103, + WM_SYSKEYDOWN = 0x104, + WM_SYSKEYUP = 0x105, + WM_SYSCHAR = 0x106, + WM_SYSDEADCHAR = 0x107, + WM_UNICHAR = 0x109, + UNICODE_NOCHAR = 0xFFFF, + WM_IME_STARTCOMPOSITION = 0x10D, + WM_IME_ENDCOMPOSITION = 0x10E, + WM_IME_COMPOSITION = 0x10F, + WM_IME_KEYLAST = 0x10F, + WM_INITDIALOG = 0x110, + WM_COMMAND = 0x111, + WM_SYSCOMMAND = 0x112, + WM_TIMER = 0x113, + WM_HSCROLL = 0x114, + WM_VSCROLL = 0x115, + WM_INITMENU = 0x116, + WM_INITMENUPOPUP = 0x117, + WM_GESTURE = 0x119, + WM_GESTURENOTIFY = 0x11A, + WM_MENUSELECT = 0x11F, + WM_MENUCHAR = 0x120, + WM_ENTERIDLE = 0x121, + WM_MENURBUTTONUP = 0x122, + WM_MENUDRAG = 0x123, + WM_MENUGETOBJECT = 0x124, + WM_UNINITMENUPOPUP = 0x125, + WM_MENUCOMMAND = 0x126, + WM_CHANGEUISTATE = 0x127, + WM_UPDATEUISTATE = 0x128, + WM_QUERYUISTATE = 0x129, + WM_CTLCOLORMSGBOX = 0x132, + WM_CTLCOLOREDIT = 0x133, + WM_CTLCOLORLISTBOX = 0x134, + WM_CTLCOLORBTN = 0x135, + WM_CTLCOLORDLG = 0x136, + WM_CTLCOLORSCROLLBAR = 0x137, + WM_CTLCOLORSTATIC = 0x138, + MN_GETHMENU = 0x1E1, + WM_MOUSEFIRST = 0x200, + WM_MOUSEMOVE = 0x200, + WM_LBUTTONDOWN = 0x201, + WM_LBUTTONUP = 0x202, + WM_LBUTTONDBLCLK = 0x203, + WM_RBUTTONDOWN = 0x204, + WM_RBUTTONUP = 0x205, + WM_RBUTTONDBLCLK = 0x206, + WM_MBUTTONDOWN = 0x207, + WM_MBUTTONUP = 0x208, + WM_MBUTTONDBLCLK = 0x209, + WM_MOUSEWHEEL = 0x20A, + WM_XBUTTONDOWN = 0x20B, + WM_XBUTTONUP = 0x20C, + WM_XBUTTONDBLCLK = 0x20D, + WM_MOUSEHWHEEL = 0x20E, + WM_PARENTNOTIFY = 0x210, + WM_ENTERMENULOOP = 0x211, + WM_EXITMENULOOP = 0x212, + WM_NEXTMENU = 0x213, + WM_SIZING = 0x214, + WM_CAPTURECHANGED = 0x215, + WM_MOVING = 0x216, + WM_POWERBROADCAST = 0x218, + WM_DEVICECHANGE = 0x219, + WM_MDICREATE = 0x220, + WM_MDIDESTROY = 0x221, + WM_MDIACTIVATE = 0x222, + WM_MDIRESTORE = 0x223, + WM_MDINEXT = 0x224, + WM_MDIMAXIMIZE = 0x225, + WM_MDITILE = 0x226, + WM_MDICASCADE = 0x227, + WM_MDIICONARRANGE = 0x228, + WM_MDIGETACTIVE = 0x229, + WM_MDISETMENU = 0x230, + WM_ENTERSIZEMOVE = 0x231, + WM_EXITSIZEMOVE = 0x232, + WM_DROPFILES = 0x233, + WM_MDIREFRESHMENU = 0x234, + WM_TOUCH = 0x240, + WM_IME_SETCONTEXT = 0x281, + WM_IME_NOTIFY = 0x282, + WM_IME_CONTROL = 0x283, + WM_IME_COMPOSITIONFULL = 0x284, + WM_IME_SELECT = 0x285, + WM_IME_CHAR = 0x286, + WM_IME_REQUEST = 0x288, + WM_IME_KEYDOWN = 0x290, + WM_IME_KEYUP = 0x291, + WM_MOUSEHOVER = 0x2A1, + WM_MOUSELEAVE = 0x2A3, + WM_NCMOUSEHOVER = 0x2A0, + WM_NCMOUSELEAVE = 0x2A2, + WM_WTSSESSION_CHANGE = 0x2B1, + WM_TABLET_FIRST = 0x2C0, + WM_TABLET_LAST = 0x2DF, + WM_CUT = 0x300, + WM_COPY = 0x301, + WM_PASTE = 0x302, + WM_CLEAR = 0x303, + WM_UNDO = 0x304, + WM_RENDERFORMAT = 0x305, + WM_RENDERALLFORMATS = 0x306, + WM_DESTROYCLIPBOARD = 0x307, + WM_DRAWCLIPBOARD = 0x308, + WM_PAINTCLIPBOARD = 0x309, + WM_VSCROLLCLIPBOARD = 0x30A, + WM_SIZECLIPBOARD = 0x30B, + WM_ASKCBFORMATNAME = 0x30C, + WM_CHANGECBCHAIN = 0x30D, + WM_HSCROLLCLIPBOARD = 0x30E, + WM_QUERYNEWPALETTE = 0x30F, + WM_PALETTEISCHANGING = 0x310, + WM_PALETTECHANGED = 0x311, + WM_HOTKEY = 0x312, + WM_PRINT = 0x317, + WM_PRINTCLIENT = 0x318, + WM_APPCOMMAND = 0x319, + WM_THEMECHANGED = 0x31A, + WM_CLIPBOARDUPDATE = 0x31D, + WM_DWMCOMPOSITIONCHANGED = 0x31E, + WM_DWMNCRENDERINGCHANGED = 0x31F, + WM_DWMCOLORIZATIONCOLORCHANGED = 0x320, + WM_DWMWINDOWMAXIMIZEDCHANGE = 0x321, + WM_DWMSENDICONICTHUMBNAIL = 0x323, + WM_DWMSENDICONICLIVEPREVIEWBITMAP = 0x326, + WM_GETTITLEBARINFOEX = 0x33F, + WM_HANDHELDFIRST = 0x358, + WM_HANDHELDLAST = 0x35F, + WM_AFXFIRST = 0x360, + WM_AFXLAST = 0x37F, + WM_PENWINFIRST = 0x380, + WM_PENWINLAST = 0x38F, + WM_APP = 0x8000, + WM_USER = 0x400; + + /** {@link #WM_ACTIVATE} message {@code wParam} values. */ + public static final int + WA_ACTIVE = 1, + WA_CLICKACTIVE = 2, + WA_INACTIVE = 0; + + /** {@link #WM_SIZE} message {@code wParam} values. */ + public static final int + SIZE_RESTORED = 0, + SIZE_MINIMIZED = 1, + SIZE_MAXIMIZED = 2, + SIZE_MAXSHOW = 3, + SIZE_MAXHIDE = 4; + + /** {@link #WM_DEVICECHANGE} message {@code wParam} params. */ + public static final int + DBT_APPYBEGIN = 0x0, + DBT_APPYEND = 0x1, + DBT_DEVNODES_CHANGED = 0x7, + DBT_QUERYCHANGECONFIG = 0x17, + DBT_CONFIGCHANGED = 0x18, + DBT_CONFIGCHANGECANCELED = 0x19, + DBT_MONITORCHANGE = 0x1B; + + /** System menu command values. */ + public static final int + SC_SIZE = 0xF000, + SC_MOVE = 0xF010, + SC_MINIMIZE = 0xF020, + SC_MAXIMIZE = 0xF030, + SC_NEXTWINDOW = 0xF040, + SC_PREVWINDOW = 0xF050, + SC_CLOSE = 0xF060, + SC_VSCROLL = 0xF070, + SC_HSCROLL = 0xF080, + SC_MOUSEMENU = 0xF090, + SC_KEYMENU = 0xF100, + SC_ARRANGE = 0xF110, + SC_RESTORE = 0xF120, + SC_TASKLIST = 0xF130, + SC_SCREENSAVE = 0xF140, + SC_HOTKEY = 0xF150, + SC_DEFAULT = 0xF160, + SC_MONITORPOWER = 0xF170, + SC_CONTEXTHELP = 0xF180, + SC_SEPARATOR = 0xF00F; + + /** Key state masks for mouse messages. */ + public static final int + MK_LBUTTON = 0x1, + MK_RBUTTON = 0x2, + MK_SHIFT = 0x4, + MK_CONTROL = 0x8, + MK_MBUTTON = 0x10, + MK_XBUTTON1 = 0x20, + MK_XBUTTON2 = 0x40; + + /** Mouse position codes. */ + public static final int + HTERROR = -2, + HTTRANSPARENT = -1, + HTNOWHERE = 0, + HTCLIENT = 1, + HTCAPTION = 2, + HTSYSMENU = 3, + HTGROWBOX = 4, + HTSIZE = HTGROWBOX, + HTMENU = 5, + HTHSCROLL = 6, + HTVSCROLL = 7, + HTMINBUTTON = 8, + HTMAXBUTTON = 9, + HTLEFT = 10, + HTRIGHT = 11, + HTTOP = 12, + HTTOPLEFT = 13, + HTTOPRIGHT = 14, + HTBOTTOM = 15, + HTBOTTOMLEFT = 16, + HTBOTTOMRIGHT = 17, + HTBORDER = 18, + HTREDUCE = HTMINBUTTON, + HTZOOM = HTMAXBUTTON, + HTSIZEFIRST = HTLEFT, + HTSIZELAST = HTBOTTOMRIGHT, + HTOBJECT = 19, + HTCLOSE = 20, + HTHELP = 21; + + /** Window field offsets for {@link #GetWindowLongPtr}. */ + public static final int + GWL_WNDPROC = -4, + GWL_HINSTANCE = -6, + GWL_HWNDPARENT = -8, + GWL_STYLE = -16, + GWL_EXSTYLE = -20, + GWL_USERDATA = -21, + GWL_ID = -12; + + /** {@link #ShowWindow} commands. */ + public static final int + SW_HIDE = 0, + SW_SHOWNORMAL = 1, + SW_NORMAL = 1, + SW_SHOWMINIMIZED = 2, + SW_SHOWMAXIMIZED = 3, + SW_MAXIMIZE = 3, + SW_SHOWNOACTIVATE = 4, + SW_SHOW = 5, + SW_MINIMIZE = 6, + SW_SHOWMINNOACTIVE = 7, + SW_SHOWNA = 8, + SW_RESTORE = 9, + SW_SHOWDEFAULT = 10, + SW_FORCEMINIMIZE = 11, + SW_MAX = 11; + + /** Virtual window handles used by the {@link #SetWindowPos} insertAfter argument. */ + public static final long + HWND_TOP = 0x0L, + HWND_BOTTOM = 0x1L, + HWND_TOPMOST = 0xFFFFFFFFFFFFFFFFL, + HWND_NOTOPMOST = 0xFFFFFFFFFFFFFFFEL; + + /** + * Virtual window handle used by {@link #PostMessage} that matches all top-level windows in the system, including disabled or invisible unowned windows, + * overlapped windows, and pop-up windows. + */ + public static final long HWND_BROADCAST = 0xFFFFL; + + /** Window sizing and positiong flags used by the {@link #SetWindowPos} flags argument. */ + public static final int + SWP_NOSIZE = 0x1, + SWP_NOMOVE = 0x2, + SWP_NOZORDER = 0x4, + SWP_NOREDRAW = 0x8, + SWP_NOACTIVATE = 0x10, + SWP_FRAMECHANGED = 0x20, + SWP_SHOWWINDOW = 0x40, + SWP_HIDEWINDOW = 0x80, + SWP_NOCOPYBITS = 0x100, + SWP_NOOWNERZORDER = 0x200, + SWP_NOSENDCHANGING = 0x400, + SWP_DRAWFRAME = SWP_FRAMECHANGED, + SWP_NOREPOSITION = SWP_NOOWNERZORDER, + SWP_DEFERERASE = 0x2000, + SWP_ASYNCWINDOWPOS = 0x4000; + + /** Standard Icon IDs. Use with {@link #LoadIcon}. */ + public static final int + IDI_APPLICATION = 32512, + IDI_HAND = 32513, + IDI_QUESTION = 32514, + IDI_EXCLAMATION = 32515, + IDI_ASTERISK = 32516, + IDI_WINLOGO = 32517, + IDI_SHIELD = 32518, + IDI_WARNING = IDI_EXCLAMATION, + IDI_ERROR = IDI_HAND, + IDI_INFORMATION = IDI_ASTERISK; + + /** Standard Cursor IDs. Use with {@link #LoadCursor}. */ + public static final int + IDC_ARROW = 32512, + IDC_IBEAM = 32513, + IDC_WAIT = 32514, + IDC_CROSS = 32515, + IDC_UPARROW = 32516, + IDC_SIZE = 32640, + IDC_ICON = 32641, + IDC_SIZENWSE = 32642, + IDC_SIZENESW = 32643, + IDC_SIZEWE = 32644, + IDC_SIZENS = 32645, + IDC_SIZEALL = 32646, + IDC_NO = 32648, + IDC_HAND = 32649, + IDC_APPSTARTING = 32650, + IDC_HELP = 32651; + + /** Class field offsets for {@link #GetClassLongPtr}. */ + public static final int + GCL_MENUNAME = -8, + GCL_HBRBACKGROUND = -10, + GCL_HCURSOR = -12, + GCL_HICON = -14, + GCL_HMODULE = -16, + GCL_CBWNDEXTRA = -18, + GCL_CBCLSEXTRA = -20, + GCL_WNDPROC = -24, + GCL_STYLE = -26, + GCW_ATOM = -32, + GCL_HICONSM = -34; + + /** Queue status flags for {@code GetQueueStatus} and {@code MsgWaitForMultipleObjects} */ + public static final int + QS_KEY = 0x1, + QS_MOUSEMOVE = 0x2, + QS_MOUSEBUTTON = 0x4, + QS_POSTMESSAGE = 0x8, + QS_TIMER = 0x10, + QS_PAINT = 0x20, + QS_SENDMESSAGE = 0x40, + QS_HOTKEY = 0x80, + QS_ALLPOSTMESSAGE = 0x100, + QS_RAWINPUT = 0x400, + QS_MOUSE = QS_MOUSEMOVE | QS_MOUSEBUTTON, + QS_INPUT = QS_MOUSE | QS_KEY, + QS_ALLEVENTS = QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY, + QS_ALLINPUT = QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY | QS_SENDMESSAGE; + + /** Remove message flags for {@link #PeekMessage}. */ + public static final int + PM_NOREMOVE = 0x0, + PM_REMOVE = 0x1, + PM_NOYIELD = 0x2, + PM_QS_INPUT = QS_INPUT << 16, + PM_QS_POSTMESSAGE = (QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER) << 16, + PM_QS_PAINT = QS_PAINT << 16, + PM_QS_SENDMESSAGE = QS_SENDMESSAGE << 16; + + /** Virtual Keys. */ + public static final int + VK_LBUTTON = 0x1, + VK_RBUTTON = 0x2, + VK_CANCEL = 0x3, + VK_MBUTTON = 0x4, + VK_XBUTTON1 = 0x5, + VK_XBUTTON2 = 0x6, + VK_BACK = 0x8, + VK_TAB = 0x9, + VK_CLEAR = 0xC, + VK_RETURN = 0xD, + VK_SHIFT = 0x10, + VK_CONTROL = 0x11, + VK_MENU = 0x12, + VK_PAUSE = 0x13, + VK_CAPITAL = 0x14, + VK_KANA = 0x15, + VK_HANGEUL = 0x15, + VK_HANGUL = 0x15, + VK_JUNJA = 0x17, + VK_FINAL = 0x18, + VK_HANJA = 0x19, + VK_KANJI = 0x19, + VK_ESCAPE = 0x1B, + VK_CONVERT = 0x1C, + VK_NONCONVERT = 0x1D, + VK_ACCEPT = 0x1E, + VK_MODECHANGE = 0x1F, + VK_SPACE = 0x20, + VK_PRIOR = 0x21, + VK_NEXT = 0x22, + VK_END = 0x23, + VK_HOME = 0x24, + VK_LEFT = 0x25, + VK_UP = 0x26, + VK_RIGHT = 0x27, + VK_DOWN = 0x28, + VK_SELECT = 0x29, + VK_PRINT = 0x2A, + VK_EXECUTE = 0x2B, + VK_SNAPSHOT = 0x2C, + VK_INSERT = 0x2D, + VK_DELETE = 0x2E, + VK_HELP = 0x2F, + VK_LWIN = 0x5B, + VK_RWIN = 0x5C, + VK_APPS = 0x5D, + VK_SLEEP = 0x5F, + VK_NUMPAD0 = 0x60, + VK_NUMPAD1 = 0x61, + VK_NUMPAD2 = 0x62, + VK_NUMPAD3 = 0x63, + VK_NUMPAD4 = 0x64, + VK_NUMPAD5 = 0x65, + VK_NUMPAD6 = 0x66, + VK_NUMPAD7 = 0x67, + VK_NUMPAD8 = 0x68, + VK_NUMPAD9 = 0x69, + VK_MULTIPLY = 0x6A, + VK_ADD = 0x6B, + VK_SEPARATOR = 0x6C, + VK_SUBTRACT = 0x6D, + VK_DECIMAL = 0x6E, + VK_DIVIDE = 0x6F, + VK_F1 = 0x70, + VK_F2 = 0x71, + VK_F3 = 0x72, + VK_F4 = 0x73, + VK_F5 = 0x74, + VK_F6 = 0x75, + VK_F7 = 0x76, + VK_F8 = 0x77, + VK_F9 = 0x78, + VK_F10 = 0x79, + VK_F11 = 0x7A, + VK_F12 = 0x7B, + VK_F13 = 0x7C, + VK_F14 = 0x7D, + VK_F15 = 0x7E, + VK_F16 = 0x7F, + VK_F17 = 0x80, + VK_F18 = 0x81, + VK_F19 = 0x82, + VK_F20 = 0x83, + VK_F21 = 0x84, + VK_F22 = 0x85, + VK_F23 = 0x86, + VK_F24 = 0x87, + VK_NUMLOCK = 0x90, + VK_SCROLL = 0x91, + VK_OEM_NEC_EQUAL = 0x92, + VK_OEM_FJ_JISHO = 0x92, + VK_OEM_FJ_MASSHOU = 0x93, + VK_OEM_FJ_TOUROKU = 0x94, + VK_OEM_FJ_LOYA = 0x95, + VK_OEM_FJ_ROYA = 0x96, + VK_LSHIFT = 0xA0, + VK_RSHIFT = 0xA1, + VK_LCONTROL = 0xA2, + VK_RCONTROL = 0xA3, + VK_LMENU = 0xA4, + VK_RMENU = 0xA5, + VK_BROWSER_BACK = 0xA6, + VK_BROWSER_FORWARD = 0xA7, + VK_BROWSER_REFRESH = 0xA8, + VK_BROWSER_STOP = 0xA9, + VK_BROWSER_SEARCH = 0xAA, + VK_BROWSER_FAVORITES = 0xAB, + VK_BROWSER_HOME = 0xAC, + VK_VOLUME_MUTE = 0xAD, + VK_VOLUME_DOWN = 0xAE, + VK_VOLUME_UP = 0xAF, + VK_MEDIA_NEXT_TRACK = 0xB0, + VK_MEDIA_PREV_TRACK = 0xB1, + VK_MEDIA_STOP = 0xB2, + VK_MEDIA_PLAY_PAUSE = 0xB3, + VK_LAUNCH_MAIL = 0xB4, + VK_LAUNCH_MEDIA_SELECT = 0xB5, + VK_LAUNCH_APP1 = 0xB6, + VK_LAUNCH_APP2 = 0xB7, + VK_OEM_1 = 0xBA, + VK_OEM_PLUS = 0xBB, + VK_OEM_COMMA = 0xBC, + VK_OEM_MINUS = 0xBD, + VK_OEM_PERIOD = 0xBE, + VK_OEM_2 = 0xBF, + VK_OEM_3 = 0xC0, + VK_OEM_4 = 0xDB, + VK_OEM_5 = 0xDC, + VK_OEM_6 = 0xDD, + VK_OEM_7 = 0xDE, + VK_OEM_8 = 0xDF, + VK_OEM_AX = 0xE1, + VK_OEM_102 = 0xE2, + VK_ICO_HELP = 0xE3, + VK_ICO_00 = 0xE4, + VK_PROCESSKEY = 0xE5, + VK_ICO_CLEAR = 0xE6, + VK_PACKET = 0xE7, + VK_OEM_RESET = 0xE9, + VK_OEM_JUMP = 0xEA, + VK_OEM_PA1 = 0xEB, + VK_OEM_PA2 = 0xEC, + VK_OEM_PA3 = 0xED, + VK_OEM_WSCTRL = 0xEE, + VK_OEM_CUSEL = 0xEF, + VK_OEM_ATTN = 0xF0, + VK_OEM_FINISH = 0xF1, + VK_OEM_COPY = 0xF2, + VK_OEM_AUTO = 0xF3, + VK_OEM_ENLW = 0xF4, + VK_OEM_BACKTAB = 0xF5, + VK_ATTN = 0xF6, + VK_CRSEL = 0xF7, + VK_EXSEL = 0xF8, + VK_EREOF = 0xF9, + VK_PLAY = 0xFA, + VK_ZOOM = 0xFB, + VK_NONAME = 0xFC, + VK_PA1 = 0xFD, + VK_OEM_CLEAR = 0xFE; + + /** XButton values. */ + public static final int + XBUTTON1 = 0x1, + XBUTTON2 = 0x2; + + /** Value for rolling one detent. */ + public static final int WHEEL_DELTA = 120; + + /** + * Identifies the dots per inch (dpi) setting for a thread, process, or window. ({@code DPI_AWARENESS}) + * + *
    Enum values:
    + * + *
      + *
    • {@link #DPI_AWARENESS_INVALID DPI_AWARENESS_INVALID} - + * Invalid DPI awareness. + * + *

      This is an invalid DPI awareness value.

      + *
    • + *
    • {@link #DPI_AWARENESS_UNAWARE DPI_AWARENESS_UNAWARE} - + * DPI unaware. + * + *

      This process does not scale for DPI changes and is always assumed to have a scale factor of 100% (96 DPI). It will be automatically scaled by the + * system on any other DPI setting.

      + *
    • + *
    • {@link #DPI_AWARENESS_SYSTEM_AWARE DPI_AWARENESS_SYSTEM_AWARE} - + * System DPI aware. + * + *

      This process does not scale for DPI changes. It will query for the DPI once and use that value for the lifetime of the process. If the DPI changes, + * the process will not adjust to the new DPI value. It will be automatically scaled up or down by the system when the DPI changes from the system + * value.

      + *
    • + *
    • {@link #DPI_AWARENESS_PER_MONITOR_AWARE DPI_AWARENESS_PER_MONITOR_AWARE} - + * Per monitor DPI aware. + * + *

      This process checks for the DPI when it is created and adjusts the scale factor whenever the DPI changes. These processes are not automatically + * scaled by the system.

      + *
    • + *
    + */ + public static final int + DPI_AWARENESS_INVALID = -1, + DPI_AWARENESS_UNAWARE = 0, + DPI_AWARENESS_SYSTEM_AWARE = 1, + DPI_AWARENESS_PER_MONITOR_AWARE = 2; + + /** + * DPI unaware. + * + *

    This window does not scale for DPI changes and is always assumed to have a scale factor of 100% (96 DPI). It will be automatically scaled by the system + * on any other DPI setting.

    + */ + public static final long DPI_AWARENESS_CONTEXT_UNAWARE = -1L; + + /** + * System DPI aware. + * + *

    This window does not scale for DPI changes. It will query for the DPI once and use that value for the lifetime of the process. If the DPI changes, the + * process will not adjust to the new DPI value. It will be automatically scaled up or down by the system when the DPI changes from the system value.

    + */ + public static final long DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = -2L; + + /** + * Per monitor DPI aware. + * + *

    This window checks for the DPI when it is created and adjusts the scale factor whenever the DPI changes. These processes are not automatically scaled + * by the system.

    + */ + public static final long DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = -3L; + + /** + * Also known as Per Monitor v2. + * + *

    An advancement over the original per-monitor DPI awareness mode, which enables applications to access new DPI-related scaling behaviors on a per + * top-level window basis.

    + * + *

    Per Monitor v2 was made available in the Creators Update of Windows 10, and is not available on earlier versions of the operating system.

    + * + *

    The additional behaviors introduced are as follows:

    + * + *
      + *
    • Child window DPI change notifications - In Per Monitor v2 contexts, the entire window tree is notified of any DPI changes that occur.
    • + *
    • Scaling of non-client area - All windows will automatically have their non-client area drawn in a DPI sensitive fashion. Calls to + * {@code EnableNonClientDpiScaling} are unnecessary.
    • + *
    • Scaling of Win32 menus - All {@code NTUSER} menus created in Per Monitor v2 contexts will be scaling in a per-monitor fashion.
    • + *
    • Dialog Scaling - Win32 dialogs created in Per Monitor v2 contexts will automatically respond to DPI changes.
    • + *
    • Improved scaling of {@code comctl32} controls - Various {@code comctl32} controls have improved DPI scaling behavior in Per Monitor v2 contexts.
    • + *
    • Improved theming behavior - {@code UxTheme} handles opened in the context of a Per Monitor v2 window will operate in terms of the DPI associated + * with that window.
    • + *
    + */ + public static final long DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = -4L; + + /** {@link WINDOWPLACEMENT} flags. */ + public static final int + WPF_SETMINPOSITION = 0x1, + WPF_RESTORETOMAXIMIZED = 0x2, + WPF_ASYNCWINDOWPLACEMENT = 0x4; + + /** Actions for {@link #SetLayeredWindowAttributes}. */ + public static final int + LWA_COLORKEY = 0x1, + LWA_ALPHA = 0x2; + + /** {@link #GetSystemMetrics} codes. */ + public static final int + SM_CXSCREEN = 0, + SM_CYSCREEN = 1, + SM_CXVSCROLL = 2, + SM_CYHSCROLL = 3, + SM_CYCAPTION = 4, + SM_CXBORDER = 5, + SM_CYBORDER = 6, + SM_CXDLGFRAME = 7, + SM_CYDLGFRAME = 8, + SM_CYVTHUMB = 9, + SM_CXHTHUMB = 10, + SM_CXICON = 11, + SM_CYICON = 12, + SM_CXCURSOR = 13, + SM_CYCURSOR = 14, + SM_CYMENU = 15, + SM_CXFULLSCREEN = 16, + SM_CYFULLSCREEN = 17, + SM_CYKANJIWINDOW = 18, + SM_MOUSEPRESENT = 19, + SM_CYVSCROLL = 20, + SM_CXHSCROLL = 21, + SM_DEBUG = 22, + SM_SWAPBUTTON = 23, + SM_RESERVED1 = 24, + SM_RESERVED2 = 25, + SM_RESERVED3 = 26, + SM_RESERVED4 = 27, + SM_CXMIN = 28, + SM_CYMIN = 29, + SM_CXSIZE = 30, + SM_CYSIZE = 31, + SM_CXFRAME = 32, + SM_CYFRAME = 33, + SM_CXMINTRACK = 34, + SM_CYMINTRACK = 35, + SM_CXDOUBLECLK = 36, + SM_CYDOUBLECLK = 37, + SM_CXICONSPACING = 38, + SM_CYICONSPACING = 39, + SM_MENUDROPALIGNMENT = 40, + SM_PENWINDOWS = 41, + SM_DBCSENABLED = 42, + SM_CMOUSEBUTTONS = 43, + SM_CXFIXEDFRAME = SM_CXDLGFRAME, + SM_CYFIXEDFRAME = SM_CYDLGFRAME, + SM_CXSIZEFRAME = SM_CXFRAME, + SM_CYSIZEFRAME = SM_CYFRAME, + SM_SECURE = 44, + SM_CXEDGE = 45, + SM_CYEDGE = 46, + SM_CXMINSPACING = 47, + SM_CYMINSPACING = 48, + SM_CXSMICON = 49, + SM_CYSMICON = 50, + SM_CYSMCAPTION = 51, + SM_CXSMSIZE = 52, + SM_CYSMSIZE = 53, + SM_CXMENUSIZE = 54, + SM_CYMENUSIZE = 55, + SM_ARRANGE = 56, + SM_CXMINIMIZED = 57, + SM_CYMINIMIZED = 58, + SM_CXMAXTRACK = 59, + SM_CYMAXTRACK = 60, + SM_CXMAXIMIZED = 61, + SM_CYMAXIMIZED = 62, + SM_NETWORK = 63, + SM_CLEANBOOT = 67, + SM_CXDRAG = 68, + SM_CYDRAG = 69, + SM_SHOWSOUNDS = 70, + SM_CXMENUCHECK = 71, + SM_CYMENUCHECK = 72, + SM_SLOWMACHINE = 73, + SM_MIDEASTENABLED = 74, + SM_MOUSEWHEELPRESENT = 75, + SM_XVIRTUALSCREEN = 76, + SM_YVIRTUALSCREEN = 77, + SM_CXVIRTUALSCREEN = 78, + SM_CYVIRTUALSCREEN = 79, + SM_CMONITORS = 80, + SM_SAMEDISPLAYFORMAT = 81, + SM_IMMENABLED = 82, + SM_REMOTESESSION = 0x1000, + SM_SHUTTINGDOWN = 0x2000, + SM_REMOTECONTROL = 0x2001, + SM_CARETBLINKINGENABLED = 0x2002, + SM_CXFOCUSBORDER = 83, + SM_CYFOCUSBORDER = 84, + SM_TABLETPC = 86, + SM_MEDIACENTER = 87, + SM_STARTER = 88, + SM_SERVERR2 = 89, + SM_MOUSEHORIZONTALWHEELPRESENT = 91, + SM_CXPADDEDBORDER = 92, + SM_DIGITIZER = 94, + SM_MAXIMUMTOUCHES = 95; + + /** {@link #RegisterTouchWindow} flags. */ + public static final int + TWF_FINETOUCH = 0x1, + TWF_WANTPALM = 0x2; + + /** Touch input flag values ({@link TOUCHINPUT#dwFlags}). */ + public static final int + TOUCHEVENTF_MOVE = 0x1, + TOUCHEVENTF_DOWN = 0x2, + TOUCHEVENTF_UP = 0x4, + TOUCHEVENTF_INRANGE = 0x8, + TOUCHEVENTF_PRIMARY = 0x10, + TOUCHEVENTF_NOCOALESCE = 0x20, + TOUCHEVENTF_PEN = 0x40, + TOUCHEVENTF_PALM = 0x80; + + /** Touch input mask values ({@link TOUCHINPUT#dwMask}). */ + public static final int + TOUCHINPUTMASKF_TIMEFROMSYSTEM = 0x1, + TOUCHINPUTMASKF_EXTRAINFO = 0x2, + TOUCHINPUTMASKF_CONTACTAREA = 0x4; + + /** {@link #MonitorFromWindow} flags. */ + public static final int + MONITOR_DEFAULTTONULL = 0x0, + MONITOR_DEFAULTTOPRIMARY = 0x1, + MONITOR_DEFAULTTONEAREST = 0x2; + + /** {@link MONITORINFOEX} flags. */ + public static final int MONITORINFOF_PRIMARY = 0x1; + + /** Flag for {@link #EnumDisplayDevices}. */ + public static final int EDD_GET_DEVICE_INTERFACE_NAME = 0x1; + + /** {@link #EnumDisplaySettingsEx} mode. */ + public static final int + ENUM_CURRENT_SETTINGS = -1, + ENUM_REGISTRY_SETTINGS = -2; + + /** Flags for {@link #EnumDisplaySettingsEx}. */ + public static final int + EDS_RAWMODE = 0x2, + EDS_ROTATEDMODE = 0x4; + + /** Flags for {@link #ChangeDisplaySettingsEx}. */ + public static final int + CDS_UPDATEREGISTRY = 0x1, + CDS_TEST = 0x2, + CDS_FULLSCREEN = 0x4, + CDS_GLOBAL = 0x8, + CDS_SET_PRIMARY = 0x10, + CDS_VIDEOPARAMETERS = 0x20, + CDS_ENABLE_UNSAFE_MODES = 0x100, + CDS_DISABLE_UNSAFE_MODES = 0x200, + CDS_RESET = 0x40000000, + CDS_RESET_EX = 0x20000000, + CDS_NORESET = 0x10000000; + + /** Return values for {@link #ChangeDisplaySettingsEx}. */ + public static final int + DISP_CHANGE_SUCCESSFUL = 0, + DISP_CHANGE_RESTART = 1, + DISP_CHANGE_FAILED = -1, + DISP_CHANGE_BADMODE = -2, + DISP_CHANGE_NOTUPDATED = -3, + DISP_CHANGE_BADFLAGS = -4, + DISP_CHANGE_BADPARAM = -5, + DISP_CHANGE_BADDUALVIEW = -6; + + /** The type of input event. */ + public static final int + INPUT_MOUSE = 0, + INPUT_KEYBOARD = 1, + INPUT_HARDWARE = 2; + + /** {@link MOUSEINPUT} flags. */ + public static final int + MOUSEEVENTF_ABSOLUTE = 0x8000, + MOUSEEVENTF_HWHEEL = 0x1000, + MOUSEEVENTF_MOVE = 0x1, + MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000, + MOUSEEVENTF_LEFTDOWN = 0x2, + MOUSEEVENTF_LEFTUP = 0x4, + MOUSEEVENTF_RIGHTDOWN = 0x8, + MOUSEEVENTF_RIGHTUP = 0x10, + MOUSEEVENTF_MIDDLEDOWN = 0x20, + MOUSEEVENTF_MIDDLEUP = 0x40, + MOUSEEVENTF_VIRTUALDESK = 0x4000, + MOUSEEVENTF_WHEEL = 0x800, + MOUSEEVENTF_XDOWN = 0x80, + MOUSEEVENTF_XUP = 0x100; + + /** {@link KEYBDINPUT} flags. */ + public static final int + KEYEVENTF_EXTENDEDKEY = 0x1, + KEYEVENTF_KEYUP = 0x2, + KEYEVENTF_SCANCODE = 0x8, + KEYEVENTF_UNICODE = 0x4; + + protected User32() { + throw new UnsupportedOperationException(); + } + + // --- [ RegisterClassEx ] --- + + /** Unsafe version of: {@link #RegisterClassEx} */ + public static native short nRegisterClassEx(long lpwcx, long __functionAddress); + + /** Unsafe version of: {@link #RegisterClassEx} */ + public static short nRegisterClassEx(long lpwcx) { + long __functionAddress = Functions.RegisterClassEx; + if (CHECKS) { + WNDCLASSEX.validate(lpwcx); + } + return nRegisterClassEx(lpwcx, __functionAddress); + } + + /** + * Registers a window class for subsequent use in calls to the {@link #CreateWindowEx} function. + * + * @param lpwcx a {@link WNDCLASSEX} structure. You must fill the structure with the appropriate class attributes before passing it to the function. + */ + @NativeType("ATOM") + public static short RegisterClassEx(@NativeType("WNDCLASSEX const *") WNDCLASSEX lpwcx) { + return nRegisterClassEx(lpwcx.address()); + } + + // --- [ UnregisterClass ] --- + + /** Unsafe version of: {@link #UnregisterClass} */ + public static native int nUnregisterClass(long lpClassName, long hInstance, long __functionAddress); + + /** Unsafe version of: {@link #UnregisterClass} */ + public static int nUnregisterClass(long lpClassName, long hInstance) { + long __functionAddress = Functions.UnregisterClass; + return nUnregisterClass(lpClassName, hInstance, __functionAddress); + } + + /** + * Unregisters a window class, freeing the memory required for the class. + * + * @param lpClassName a null-terminated string or a class atom. If {@code lpClassName} is a string, it specifies the window class name. This class name must have been + * registered by a previous call to the {@link #RegisterClassEx} function. System classes, such as dialog box controls, cannot be unregistered. If this + * parameter is an atom, it must be a class atom created by a previous call to the {@link #RegisterClassEx} function. The atom must be in the low-order + * word of {@code lpClassName}; the high-order word must be zero. + * @param hInstance a handle to the instance of the module that created the class + */ + @NativeType("BOOL") + public static boolean UnregisterClass(@NativeType("LPCTSTR") ByteBuffer lpClassName, @NativeType("HINSTANCE") long hInstance) { + if (CHECKS) { + checkNT2(lpClassName); + } + return nUnregisterClass(memAddress(lpClassName), hInstance) != 0; + } + + /** + * Unregisters a window class, freeing the memory required for the class. + * + * @param lpClassName a null-terminated string or a class atom. If {@code lpClassName} is a string, it specifies the window class name. This class name must have been + * registered by a previous call to the {@link #RegisterClassEx} function. System classes, such as dialog box controls, cannot be unregistered. If this + * parameter is an atom, it must be a class atom created by a previous call to the {@link #RegisterClassEx} function. The atom must be in the low-order + * word of {@code lpClassName}; the high-order word must be zero. + * @param hInstance a handle to the instance of the module that created the class + */ + @NativeType("BOOL") + public static boolean UnregisterClass(@NativeType("LPCTSTR") CharSequence lpClassName, @NativeType("HINSTANCE") long hInstance) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF16(lpClassName, true); + long lpClassNameEncoded = stack.getPointerAddress(); + return nUnregisterClass(lpClassNameEncoded, hInstance) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ CreateWindowEx ] --- + + /** Unsafe version of: {@link #CreateWindowEx} */ + public static native long nCreateWindowEx(int dwExStyle, long lpClassName, long lpWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, long hWndParent, long hMenu, long hInstance, long lpParam, long __functionAddress); + + /** Unsafe version of: {@link #CreateWindowEx} */ + public static long nCreateWindowEx(int dwExStyle, long lpClassName, long lpWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, long hWndParent, long hMenu, long hInstance, long lpParam) { + long __functionAddress = Functions.CreateWindowEx; + return nCreateWindowEx(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam, __functionAddress); + } + + /** + * Creates an overlapped, pop-up, or child window with an extended window style; otherwise, this function is identical to the CreateWindow function. + * + * @param dwExStyle the extended window style of the window being created + * @param lpClassName a null-terminated string or a class atom created by a previous call to the {@link #RegisterClassEx(WNDCLASSEX)} function. + * @param lpWindowName the window name. If the window style specifies a title bar, the window title pointed to by {@code lpWindowName} is displayed in the title bar. + * @param dwStyle the style of the window being created + * @param x the initial horizontal position of the window + * @param y the initial vertical position of the window + * @param nWidth the width, in device units, of the window + * @param nHeight the height, in device units, of the window + * @param hWndParent a handle to the parent or owner window of the window being created. To create a child window or an owned window, supply a valid window handle. + * @param hMenu a handle to a menu, or specifies a child-window identifier, depending on the window style + * @param hInstance a handle to the instance of the module to be associated with the window + * @param lpParam a value to be passed to the window through the {@code CREATESTRUCT} structure ({@code createParams} member) pointed to by the {@code lParam} param + * of the {@link #WM_CREATE} message. + */ + @NativeType("HWND") + public static long CreateWindowEx(@NativeType("DWORD") int dwExStyle, @Nullable @NativeType("LPCTSTR") ByteBuffer lpClassName, @Nullable @NativeType("LPCTSTR") ByteBuffer lpWindowName, @NativeType("DWORD") int dwStyle, int x, int y, int nWidth, int nHeight, @NativeType("HWND") long hWndParent, @NativeType("HMENU") long hMenu, @NativeType("HINSTANCE") long hInstance, @NativeType("LPVOID") long lpParam) { + if (CHECKS) { + checkNT2Safe(lpClassName); + checkNT2Safe(lpWindowName); + } + return nCreateWindowEx(dwExStyle, memAddressSafe(lpClassName), memAddressSafe(lpWindowName), dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); + } + + /** + * Creates an overlapped, pop-up, or child window with an extended window style; otherwise, this function is identical to the CreateWindow function. + * + * @param dwExStyle the extended window style of the window being created + * @param lpClassName a null-terminated string or a class atom created by a previous call to the {@link #RegisterClassEx(WNDCLASSEX)} function. + * @param lpWindowName the window name. If the window style specifies a title bar, the window title pointed to by {@code lpWindowName} is displayed in the title bar. + * @param dwStyle the style of the window being created + * @param x the initial horizontal position of the window + * @param y the initial vertical position of the window + * @param nWidth the width, in device units, of the window + * @param nHeight the height, in device units, of the window + * @param hWndParent a handle to the parent or owner window of the window being created. To create a child window or an owned window, supply a valid window handle. + * @param hMenu a handle to a menu, or specifies a child-window identifier, depending on the window style + * @param hInstance a handle to the instance of the module to be associated with the window + * @param lpParam a value to be passed to the window through the {@code CREATESTRUCT} structure ({@code createParams} member) pointed to by the {@code lParam} param + * of the {@link #WM_CREATE} message. + */ + @NativeType("HWND") + public static long CreateWindowEx(@NativeType("DWORD") int dwExStyle, @Nullable @NativeType("LPCTSTR") CharSequence lpClassName, @Nullable @NativeType("LPCTSTR") CharSequence lpWindowName, @NativeType("DWORD") int dwStyle, int x, int y, int nWidth, int nHeight, @NativeType("HWND") long hWndParent, @NativeType("HMENU") long hMenu, @NativeType("HINSTANCE") long hInstance, @NativeType("LPVOID") long lpParam) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF16Safe(lpClassName, true); + long lpClassNameEncoded = lpClassName == null ? NULL : stack.getPointerAddress(); + stack.nUTF16Safe(lpWindowName, true); + long lpWindowNameEncoded = lpWindowName == null ? NULL : stack.getPointerAddress(); + return nCreateWindowEx(dwExStyle, lpClassNameEncoded, lpWindowNameEncoded, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ DestroyWindow ] --- + + /** Unsafe version of: {@link #DestroyWindow} */ + public static native int nDestroyWindow(long hWnd, long __functionAddress); + + /** + * Destroys the specified window. The function sends {@link #WM_DESTROY} and {@link #WM_NCDESTROY} messages to the window to deactivate it and remove the keyboard focus + * from it. The function also destroys the window's menu, flushes the thread message queue, destroys timers, removes clipboard ownership, and breaks the + * clipboard viewer chain (if the window is at the top of the viewer chain). + * + *

    If the specified window is a parent or owner window, DestroyWindow automatically destroys the associated child or owned windows when it destroys the + * parent or owner window. The function first destroys child or owned windows, and then it destroys the parent or owner window.

    + * + * @param hWnd a handle to the window to be destroyed + */ + @NativeType("BOOL") + public static boolean DestroyWindow(@NativeType("HWND") long hWnd) { + long __functionAddress = Functions.DestroyWindow; + if (CHECKS) { + check(hWnd); + } + return nDestroyWindow(hWnd, __functionAddress) != 0; + } + + // --- [ DefWindowProc ] --- + + /** + * Calls the default window procedure to provide default processing for any window messages that an application does not process. This function ensures + * that every message is processed. DefWindowProc is called with the same parameters received by the window procedure. + * + * @param hWnd a handle to the window that received the message + * @param Msg the message + * @param wParam additional message information. The content of this parameter depends on the value of the {@code Msg} parameter. + * @param lParam additional message information. The content of this parameter depends on the value of the {@code Msg} parameter. + */ + @NativeType("LRESULT") + public static long DefWindowProc(@NativeType("HWND") long hWnd, @NativeType("UINT") int Msg, @NativeType("WPARAM") long wParam, @NativeType("LPARAM") long lParam) { + long __functionAddress = Functions.DefWindowProc; + if (CHECKS) { + check(hWnd); + } + return callPPPP(hWnd, Msg, wParam, lParam, __functionAddress); + } + + // --- [ CallWindowProc ] --- + + /** Unsafe version of: {@link #CallWindowProc} */ + public static long nCallWindowProc(long lpPrevWndFunc, long hWnd, int Msg, long wParam, long lParam) { + long __functionAddress = Functions.CallWindowProc; + if (CHECKS) { + check(hWnd); + } + return callPPPPP(lpPrevWndFunc, hWnd, Msg, wParam, lParam, __functionAddress); + } + + /** + * Passes message information to the specified window procedure. + * + * @param lpPrevWndFunc the previous window procedure. + * + *

    If this value is obtained by calling the {@link #GetWindowLongPtr} function with the {@code nIndex} parameter set to {@link #GWL_WNDPROC} or {@code DWL_DLGPROC}, + * it is actually either the address of a window or dialog box procedure, or a special internal value meaningful only to {@code CallWindowProc}.

    + * @param hWnd a handle to the window procedure to receive the message + * @param Msg the message + * @param wParam additional message information. The content of this parameter depends on the value of the {@code Msg} parameter. + * @param lParam additional message information. The content of this parameter depends on the value of the {@code Msg} parameter. + */ + @NativeType("LRESULT") + public static long CallWindowProc(@NativeType("WNDPROC") WindowProcI lpPrevWndFunc, @NativeType("HWND") long hWnd, @NativeType("UINT") int Msg, @NativeType("WPARAM") long wParam, @NativeType("LPARAM") long lParam) { + return nCallWindowProc(lpPrevWndFunc.address(), hWnd, Msg, wParam, lParam); + } + + // --- [ ShowWindow ] --- + + /** + * Sets the specified window's show state. + * + * @param hWnd a handle to the window + * @param nCmdShow controls how the window is to be shown. This parameter is ignored the first time an application calls {@code ShowWindow}, if the program that + * launched the application provides a {@code STARTUPINFO} structure. Otherwise, the first time {@code ShowWindow} is called, the value should be the + * value obtained by the {@code WinMain} function in its {@code nCmdShow} parameter. In subsequent calls, this parameter can be one of:
    {@link #SW_HIDE}{@link #SW_SHOWNORMAL}{@link #SW_NORMAL}{@link #SW_SHOWMINIMIZED}{@link #SW_SHOWMAXIMIZED}{@link #SW_MAXIMIZE}
    {@link #SW_SHOWNOACTIVATE}{@link #SW_SHOW}{@link #SW_MINIMIZE}{@link #SW_SHOWMINNOACTIVE}{@link #SW_SHOWNA}{@link #SW_RESTORE}
    {@link #SW_SHOWDEFAULT}{@link #SW_FORCEMINIMIZE}{@link #SW_MAX}
    + */ + @NativeType("BOOL") + public static boolean ShowWindow(@NativeType("HWND") long hWnd, int nCmdShow) { + long __functionAddress = Functions.ShowWindow; + if (CHECKS) { + check(hWnd); + } + return callPI(hWnd, nCmdShow, __functionAddress) != 0; + } + + // --- [ UpdateWindow ] --- + + /** + * Updates the client area of the specified window by sending a {@link #WM_PAINT} message to the window if the window's update region is not empty. The function + * sends a {@link #WM_PAINT} message directly to the window procedure of the specified window, bypassing the application queue. If the update region is empty, no + * message is sent. + * + * @param hWnd handle to the window to be updated + */ + @NativeType("BOOL") + public static boolean UpdateWindow(@NativeType("HWND") long hWnd) { + long __functionAddress = Functions.UpdateWindow; + if (CHECKS) { + check(hWnd); + } + return callPI(hWnd, __functionAddress) != 0; + } + + // --- [ SetWindowPos ] --- + + /** Unsafe version of: {@link #SetWindowPos} */ + public static native int nSetWindowPos(long hWnd, long hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags, long __functionAddress); + + /** + * Changes the size, position, and Z order of a child, pop-up, or top-level window. These windows are ordered according to their appearance on the screen. + * The topmost window receives the highest rank and is the first window in the Z order. + * + * @param hWnd a handle to the window + * @param hWndInsertAfter a handle to the window to precede the positioned window in the Z order. This parameter must be a window handle or one of:
    {@link #HWND_TOP}{@link #HWND_BOTTOM}{@link #HWND_TOPMOST}{@link #HWND_NOTOPMOST}
    + * @param X the new position of the left side of the window, in client coordinates + * @param Y the new position of the top of the window, in client coordinates + * @param cx the new width of the window, in pixels + * @param cy the new height of the window, in pixels + * @param uFlags the window sizing and positioning flags. One or more of:
    {@link #SWP_NOSIZE}{@link #SWP_NOMOVE}{@link #SWP_NOZORDER}{@link #SWP_NOREDRAW}{@link #SWP_NOACTIVATE}
    {@link #SWP_FRAMECHANGED}{@link #SWP_SHOWWINDOW}{@link #SWP_HIDEWINDOW}{@link #SWP_NOCOPYBITS}{@link #SWP_NOOWNERZORDER}
    {@link #SWP_NOSENDCHANGING}{@link #SWP_DRAWFRAME}{@link #SWP_NOREPOSITION}{@link #SWP_DEFERERASE}{@link #SWP_ASYNCWINDOWPOS}
    + */ + @NativeType("BOOL") + public static boolean SetWindowPos(@NativeType("HWND") long hWnd, @NativeType("HWND") long hWndInsertAfter, int X, int Y, int cx, int cy, @NativeType("UINT") int uFlags) { + long __functionAddress = Functions.SetWindowPos; + if (CHECKS) { + check(hWnd); + } + return nSetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, uFlags, __functionAddress) != 0; + } + + // --- [ SetWindowText ] --- + + /** Unsafe version of: {@link #SetWindowText} */ + public static native int nSetWindowText(long hWnd, long lpString, long __functionAddress); + + /** Unsafe version of: {@link #SetWindowText} */ + public static int nSetWindowText(long hWnd, long lpString) { + long __functionAddress = Functions.SetWindowText; + if (CHECKS) { + check(hWnd); + } + return nSetWindowText(hWnd, lpString, __functionAddress); + } + + /** + * Changes the text of the specified window's title bar (if it has one). If the specified window is a control, the text of the control is changed. + * However, {@code SetWindowText} cannot change the text of a control in another application. + * + * @param hWnd a handle to the window or control whose text is to be changed + * @param lpString the new title or control text + */ + @NativeType("BOOL") + public static boolean SetWindowText(@NativeType("HWND") long hWnd, @NativeType("LPCTSTR") ByteBuffer lpString) { + if (CHECKS) { + checkNT2(lpString); + } + return nSetWindowText(hWnd, memAddress(lpString)) != 0; + } + + /** + * Changes the text of the specified window's title bar (if it has one). If the specified window is a control, the text of the control is changed. + * However, {@code SetWindowText} cannot change the text of a control in another application. + * + * @param hWnd a handle to the window or control whose text is to be changed + * @param lpString the new title or control text + */ + @NativeType("BOOL") + public static boolean SetWindowText(@NativeType("HWND") long hWnd, @NativeType("LPCTSTR") CharSequence lpString) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF16(lpString, true); + long lpStringEncoded = stack.getPointerAddress(); + return nSetWindowText(hWnd, lpStringEncoded) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ GetMessage ] --- + + /** Unsafe version of: {@link #GetMessage} */ + public static native int nGetMessage(long lpMsg, long hWnd, int wMsgFilterMin, int wMsgFilterMax, long __functionAddress); + + /** Unsafe version of: {@link #GetMessage} */ + public static int nGetMessage(long lpMsg, long hWnd, int wMsgFilterMin, int wMsgFilterMax) { + long __functionAddress = Functions.GetMessage; + return nGetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, __functionAddress); + } + + /** + * Retrieves a message from the calling thread's message queue. The function dispatches incoming sent messages until a posted message is available for + * retrieval. Unlike GetMessage, the {@link #PeekMessage} function does not wait for a message to be posted before returning. + * + * @param lpMsg a pointer to an {@link MSG} structure that receives message information from the thread's message queue + * @param hWnd a handle to the window whose messages are to be retrieved. The window must belong to the current thread. + * + *

    If {@code hWnd} is {@code NULL}, {@code GetMessage} retrieves messages for any window that belongs to the current thread, and any messages on the current + * thread's message queue whose {@code hwnd} value is {@code NULL} (see the {@link MSG} structure). Therefore if {@code hWnd} is {@code NULL}, both window messages and + * thread messages are processed.

    + * + *

    If {@code hWnd} is -1, {@code GetMessage} retrieves only messages on the current thread's message queue whose {@code hwnd} value is {@code NULL}, that is, + * thread messages as posted by {@link #PostMessage} (when the {@code hWnd} parameter is {@code NULL}) or {@code PostThreadMessage}.

    + * @param wMsgFilterMin the integer value of the lowest message value to be retrieved + * @param wMsgFilterMax the integer value of the highest message value to be retrieved + */ + @NativeType("BOOL") + public static boolean GetMessage(@NativeType("LPMSG") MSG lpMsg, @NativeType("HWND") long hWnd, @NativeType("UINT") int wMsgFilterMin, @NativeType("UINT") int wMsgFilterMax) { + return nGetMessage(lpMsg.address(), hWnd, wMsgFilterMin, wMsgFilterMax) != 0; + } + + // --- [ PeekMessage ] --- + + /** Unsafe version of: {@link #PeekMessage} */ + public static int nPeekMessage(long lpMsg, long hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg) { + long __functionAddress = Functions.PeekMessage; + return callPPI(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, __functionAddress); + } + + /** + * Dispatches incoming sent messages, checks the thread message queue for a posted message, and retrieves the message (if any exist). + * + * @param lpMsg a pointer to an {@link MSG} structure that receives message information + * @param hWnd a handle to the window whose messages are to be retrieved. The window must belong to the current thread. + * + *

    If {@code hWnd} is {@code NULL}, {@code GetMessage} retrieves messages for any window that belongs to the current thread, and any messages on the current + * thread's message queue whose {@code hwnd} value is {@code NULL} (see the {@link MSG} structure). Therefore if {@code hWnd} is {@code NULL}, both window messages and + * thread messages are processed.

    + * + *

    If {@code hWnd} is -1, {@code GetMessage} retrieves only messages on the current thread's message queue whose {@code hwnd} value is {@code NULL}, that is, + * thread messages as posted by {@link #PostMessage} (when the {@code hWnd} parameter is {@code NULL}) or {@code PostThreadMessage}.

    + * @param wMsgFilterMin the integer value of the lowest message value to be retrieved + * @param wMsgFilterMax the integer value of the highest message value to be retrieved + * @param wRemoveMsg specifies how messages are to be handled. One of:
    {@link #PM_NOREMOVE}{@link #PM_REMOVE}{@link #PM_NOYIELD}
    + */ + @NativeType("BOOL") + public static boolean PeekMessage(@NativeType("LPMSG") MSG lpMsg, @NativeType("HWND") long hWnd, @NativeType("UINT") int wMsgFilterMin, @NativeType("UINT") int wMsgFilterMax, @NativeType("UINT") int wRemoveMsg) { + return nPeekMessage(lpMsg.address(), hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg) != 0; + } + + // --- [ TranslateMessage ] --- + + /** Unsafe version of: {@link #TranslateMessage} */ + public static int nTranslateMessage(long lpMsg) { + long __functionAddress = Functions.TranslateMessage; + return callPI(lpMsg, __functionAddress); + } + + /** + * Translates virtual-key messages into character messages. The character messages are posted to the calling thread's message queue, to be read the next + * time the thread calls the {@link #GetMessage} or {@link #PeekMessage} function. + * + * @param lpMsg an {@link MSG} structure that contains message information retrieved from the calling thread's message queue by using the {@link #GetMessage} or {@link #PeekMessage} + * function. + */ + @NativeType("BOOL") + public static boolean TranslateMessage(@NativeType("MSG const *") MSG lpMsg) { + return nTranslateMessage(lpMsg.address()) != 0; + } + + // --- [ WaitMessage ] --- + + /** Unsafe version of: {@link #WaitMessage} */ + public static native int nWaitMessage(long __functionAddress); + + /** + * Yields control to other threads when a thread has no other messages in its message queue. The WaitMessage function suspends the thread and does not + * return until a new message is placed in the thread's message queue. + */ + @NativeType("BOOL") + public static boolean WaitMessage() { + long __functionAddress = Functions.WaitMessage; + return nWaitMessage(__functionAddress) != 0; + } + + // --- [ DispatchMessage ] --- + + /** Unsafe version of: {@link #DispatchMessage} */ + public static long nDispatchMessage(long lpmsg) { + long __functionAddress = Functions.DispatchMessage; + return callPP(lpmsg, __functionAddress); + } + + /** + * Dispatches a message to a window procedure. It is typically used to dispatch a message retrieved by the {@link #GetMessage} function. + * + * @param lpmsg a pointer to a structure that contains the message. + */ + @NativeType("LRESULT") + public static long DispatchMessage(@NativeType("MSG const *") MSG lpmsg) { + return nDispatchMessage(lpmsg.address()); + } + + // --- [ PostMessage ] --- + + /** Unsafe version of: {@link #PostMessage} */ + public static native int nPostMessage(long hWnd, int Msg, long wParam, long lParam, long __functionAddress); + + /** + * Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread + * to process the message. + * + * @param hWnd a handle to the window whose window procedure is to receive the message. The following values have special meanings: + * + *
      + *
    • {@link #HWND_BROADCAST} - The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped + * windows, and pop-up windows. The message is not posted to child windows.
    • + *
    • {@code NULL} - The function behaves like a call to PostThreadMessage with the dwThreadId parameter set to the identifier of the current thread.
    • + *
    + * @param Msg the message to be posted + * @param wParam additional message-specific information + * @param lParam additional message-specific information + */ + @NativeType("BOOL") + public static boolean PostMessage(@NativeType("HWND") long hWnd, @NativeType("UINT") int Msg, @NativeType("WPARAM") long wParam, @NativeType("LPARAM") long lParam) { + long __functionAddress = Functions.PostMessage; + return nPostMessage(hWnd, Msg, wParam, lParam, __functionAddress) != 0; + } + + // --- [ SendMessage ] --- + + /** Unsafe version of: {@link #SendMessage} */ + public static native int nSendMessage(long hWnd, int Msg, long wParam, long lParam, long __functionAddress); + + /** + * Sends the specified message to a window or windows. The {@code SendMessage} function calls the window procedure for the specified window and does not + * return until the window procedure has processed the message. + * + * @param hWnd a handle to the window whose window procedure will receive the message. If this parameter is {@link #HWND_BROADCAST}, the message is sent to all top-level + * windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows; but the message is not sent to + * child windows. + * + *

    Message sending is subject to UIPI. The thread of a process can send messages only to message queues of threads in processes of lesser or equal + * integrity level.

    + * @param Msg the message to be sent + * @param wParam additional message-specific information + * @param lParam additional message-specific information + */ + @NativeType("BOOL") + public static boolean SendMessage(@NativeType("HWND") long hWnd, @NativeType("UINT") int Msg, @NativeType("WPARAM") long wParam, @NativeType("LPARAM") long lParam) { + long __functionAddress = Functions.SendMessage; + if (CHECKS) { + check(hWnd); + } + return nSendMessage(hWnd, Msg, wParam, lParam, __functionAddress) != 0; + } + + // --- [ AdjustWindowRectEx ] --- + + /** Unsafe version of: {@link #AdjustWindowRectEx} */ + public static native int nAdjustWindowRectEx(long lpRect, int dwStyle, int bMenu, int dwExStyle, long __functionAddress); + + /** Unsafe version of: {@link #AdjustWindowRectEx} */ + public static int nAdjustWindowRectEx(long lpRect, int dwStyle, int bMenu, int dwExStyle) { + long __functionAddress = Functions.AdjustWindowRectEx; + return nAdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle, __functionAddress); + } + + /** + * Calculates the required size of the window rectangle, based on the desired size of the client rectangle. The window rectangle can then be passed to the + * {@link #CreateWindowEx} function to create a window whose client area is the desired size. + * + * @param lpRect a pointer to a {@link RECT} structure that contains the coordinates of the top-left and bottom-right corners of the desired client area. When the + * function returns, the structure contains the coordinates of the top-left and bottom-right corners of the window to accommodate the desired client + * area. + * @param dwStyle the window style of the window whose required size is to be calculated. Note that you cannot specify the {@link #WS_OVERLAPPED} style. + * @param bMenu indicates whether the window has a menu + * @param dwExStyle the extended window style of the window whose required size is to be calculated + */ + @NativeType("BOOL") + public static boolean AdjustWindowRectEx(@NativeType("LPRECT") RECT lpRect, @NativeType("DWORD") int dwStyle, @NativeType("BOOL") boolean bMenu, @NativeType("DWORD") int dwExStyle) { + return nAdjustWindowRectEx(lpRect.address(), dwStyle, bMenu ? 1 : 0, dwExStyle) != 0; + } + + // --- [ GetWindowRect ] --- + + /** Unsafe version of: {@link #GetWindowRect} */ + public static native int nGetWindowRect(long hWnd, long lpRect, long __functionAddress); + + /** Unsafe version of: {@link #GetWindowRect} */ + public static int nGetWindowRect(long hWnd, long lpRect) { + long __functionAddress = Functions.GetWindowRect; + if (CHECKS) { + check(hWnd); + } + return nGetWindowRect(hWnd, lpRect, __functionAddress); + } + + /** + * Retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the + * upper-left corner of the screen. + * + * @param hWnd a handle to the window + * @param lpRect a pointer to a {@link RECT} structure that receives the screen coordinates of the upper-left and lower-right corners of the window + */ + @NativeType("BOOL") + public static boolean GetWindowRect(@NativeType("HWND") long hWnd, @NativeType("LPRECT") RECT lpRect) { + return nGetWindowRect(hWnd, lpRect.address()) != 0; + } + + // --- [ MoveWindow ] --- + + /** Unsafe version of: {@link #MoveWindow} */ + public static native int nMoveWindow(long hWnd, int X, int Y, int nWidth, int nHeight, int bRepaint, long __functionAddress); + + /** + * Changes the position and dimensions of the specified window. For a top-level window, the position and dimensions are relative to the upper-left corner + * of the screen. For a child window, they are relative to the upper-left corner of the parent window's client area. + * + * @param hWnd a handle to the window + * @param X the new position of the left side of the window + * @param Y the new position of the top of the window + * @param nWidth the new width of the window + * @param nHeight the new height of the window + * @param bRepaint indicates whether the window is to be repainted. If this parameter is TRUE, the window receives a message. If the parameter is FALSE, no repainting + * of any kind occurs. This applies to the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent + * window uncovered as a result of moving a child window. + */ + @NativeType("BOOL") + public static boolean MoveWindow(@NativeType("HWND") long hWnd, int X, int Y, int nWidth, int nHeight, @NativeType("BOOL") boolean bRepaint) { + long __functionAddress = Functions.MoveWindow; + if (CHECKS) { + check(hWnd); + } + return nMoveWindow(hWnd, X, Y, nWidth, nHeight, bRepaint ? 1 : 0, __functionAddress) != 0; + } + + // --- [ GetWindowPlacement ] --- + + /** Unsafe version of: {@link #GetWindowPlacement} */ + public static native int nGetWindowPlacement(long hWnd, long lpwndpl, long __functionAddress); + + /** Unsafe version of: {@link #GetWindowPlacement} */ + public static int nGetWindowPlacement(long hWnd, long lpwndpl) { + long __functionAddress = Functions.GetWindowPlacement; + if (CHECKS) { + check(hWnd); + } + return nGetWindowPlacement(hWnd, lpwndpl, __functionAddress); + } + + /** + * Retrieves the show state and the restored, minimized, and maximized positions of the specified window. + * + * @param hWnd a handle to the window + * @param lpwndpl a pointer to the {@link WINDOWPLACEMENT} structure that receives the show state and position information. + * + *

    Before calling {@code GetWindowPlacement}, set the length member to {@link WINDOWPLACEMENT#SIZEOF}. {@code GetWindowPlacement} fails if + * {@code lpwndpl->length} is not set correctly.

    + */ + @NativeType("BOOL") + public static boolean GetWindowPlacement(@NativeType("HWND") long hWnd, @NativeType("WINDOWPLACEMENT *") WINDOWPLACEMENT lpwndpl) { + return nGetWindowPlacement(hWnd, lpwndpl.address()) != 0; + } + + // --- [ SetWindowPlacement ] --- + + /** Unsafe version of: {@link #SetWindowPlacement} */ + public static native int nSetWindowPlacement(long hWnd, long lpwndpl, long __functionAddress); + + /** Unsafe version of: {@link #SetWindowPlacement} */ + public static int nSetWindowPlacement(long hWnd, long lpwndpl) { + long __functionAddress = Functions.SetWindowPlacement; + if (CHECKS) { + check(hWnd); + } + return nSetWindowPlacement(hWnd, lpwndpl, __functionAddress); + } + + /** + * Sets the show state and the restored, minimized, and maximized positions of the specified window. + * + * @param hWnd a handle to the window + * @param lpwndpl a pointer to the {@link WINDOWPLACEMENT} structure that specifies the new show state and window positions. + * + *

    Before calling {@code SetWindowPlacement}, set the {@code length} member of the {@code WINDOWPLACEMENT} structure to {@link WINDOWPLACEMENT#SIZEOF}. + * {@code SetWindowPlacement} fails if the length member is not set correctly.

    + */ + @NativeType("BOOL") + public static boolean SetWindowPlacement(@NativeType("HWND") long hWnd, @NativeType("WINDOWPLACEMENT const *") WINDOWPLACEMENT lpwndpl) { + return nSetWindowPlacement(hWnd, lpwndpl.address()) != 0; + } + + // --- [ IsWindowVisible ] --- + + /** + * Determines the visibility state of the specified window. + * + * @param hWnd a handle to the window to be tested + */ + @NativeType("BOOL") + public static boolean IsWindowVisible(@NativeType("HWND") long hWnd) { + long __functionAddress = Functions.IsWindowVisible; + if (CHECKS) { + check(hWnd); + } + return callPI(hWnd, __functionAddress) != 0; + } + + // --- [ IsIconic ] --- + + /** + * Determines whether the specified window is minimized (iconic). + * + * @param hWnd a handle to the window to be tested + */ + @NativeType("BOOL") + public static boolean IsIconic(@NativeType("HWND") long hWnd) { + long __functionAddress = Functions.IsIconic; + if (CHECKS) { + check(hWnd); + } + return callPI(hWnd, __functionAddress) != 0; + } + + // --- [ IsZoomed ] --- + + /** + * Determines whether a window is maximized. + * + * @param hWnd a handle to the window to be tested + */ + @NativeType("BOOL") + public static boolean IsZoomed(@NativeType("HWND") long hWnd) { + long __functionAddress = Functions.IsZoomed; + if (CHECKS) { + check(hWnd); + } + return callPI(hWnd, __functionAddress) != 0; + } + + // --- [ BringWindowToTop ] --- + + /** + * Brings the specified window to the top of the Z order. If the window is a top-level window, it is activated. If the window is a child window, the + * top-level parent window associated with the child window is activated. + * + * @param hWnd a handle to the window to bring to the top of the Z order + */ + @NativeType("BOOL") + public static boolean BringWindowToTop(@NativeType("HWND") long hWnd) { + long __functionAddress = Functions.BringWindowToTop; + if (CHECKS) { + check(hWnd); + } + return callPI(hWnd, __functionAddress) != 0; + } + + // --- [ SetWindowLongPtr ] --- + + /** Unsafe version of: {@link #SetWindowLongPtr} */ + public static native long nSetWindowLongPtr(long hWnd, int nIndex, long dwNewLong, long __functionAddress); + + /** + * Changes an attribute of the specified window. The function also sets a value at the specified offset in the extra window memory. + * + * @param hWnd a handle to the window and, indirectly, the class to which the window belongs + * @param nIndex the zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size + * of an integer. To set any other value, specify one of:
    {@link #GWL_WNDPROC}{@link #GWL_HINSTANCE}{@link #GWL_HWNDPARENT}{@link #GWL_STYLE}{@link #GWL_EXSTYLE}{@link #GWL_USERDATA}{@link #GWL_ID}
    + * @param dwNewLong the replacement value + * + * @return the previous value at the given {@code index} + */ + @NativeType("LONG_PTR") + public static long SetWindowLongPtr(@NativeType("HWND") long hWnd, int nIndex, @NativeType("LONG_PTR") long dwNewLong) { + long __functionAddress = Functions.SetWindowLongPtr; + if (CHECKS) { + check(hWnd); + } + return nSetWindowLongPtr(hWnd, nIndex, dwNewLong, __functionAddress); + } + + // --- [ GetWindowLongPtr ] --- + + /** Unsafe version of: {@link #GetWindowLongPtr} */ + public static native long nGetWindowLongPtr(long hWnd, int nIndex, long __functionAddress); + + /** + * Retrieves information about the specified window. The function also retrieves the value at a specified offset into the extra window memory. + * + * @param hWnd a handle to the window and, indirectly, the class to which the window belongs + * @param nIndex the zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size + * of an integer. To set any other value, specify one of:
    {@link #GWL_WNDPROC}{@link #GWL_HINSTANCE}{@link #GWL_HWNDPARENT}{@link #GWL_STYLE}{@link #GWL_EXSTYLE}{@link #GWL_USERDATA}{@link #GWL_ID}
    + */ + @NativeType("LONG_PTR") + public static long GetWindowLongPtr(@NativeType("HWND") long hWnd, int nIndex) { + long __functionAddress = Functions.GetWindowLongPtr; + if (CHECKS) { + check(hWnd); + } + return nGetWindowLongPtr(hWnd, nIndex, __functionAddress); + } + + // --- [ SetClassLongPtr ] --- + + /** Unsafe version of: {@link #SetClassLongPtr} */ + public static native long nSetClassLongPtr(long hWnd, int nIndex, long dwNewLong, long __functionAddress); + + /** + * Replaces the specified value at the specified offset in the extra class memory or the {@link WNDCLASSEX} structure for the class to which the specified + * window belongs. + * + * @param hWnd a handle to the window and, indirectly, the class to which the window belongs + * @param nIndex the value to be replaced. To set a value in the extra class memory, specify the positive, zero-based byte offset of the value to be set. Valid + * values are in the range zero through the number of bytes of extra class memory, minus eight; for example, if you specified 24 or more bytes of + * extra class memory, a value of 16 would be an index to the third integer. To set a value other than the {@link WNDCLASSEX} structure, specify one of:
    {@link #GCL_MENUNAME}{@link #GCL_HBRBACKGROUND}{@link #GCL_HCURSOR}{@link #GCL_HICON}{@link #GCL_HMODULE}{@link #GCL_CBWNDEXTRA}
    {@link #GCL_CBCLSEXTRA}{@link #GCL_WNDPROC}{@link #GCL_STYLE}{@link #GCW_ATOM}{@link #GCL_HICONSM}
    + * @param dwNewLong the replacement value + * + * @return if the function succeeds, the return value is the previous value of the specified offset. If this was not previously set, the return value is zero. + * + *

    If the function fails, the return value is zero. To get extended error information, call {@link WinBase#getLastError}.

    + */ + @NativeType("LONG_PTR") + public static long SetClassLongPtr(@NativeType("HWND") long hWnd, int nIndex, @NativeType("LONG_PTR") long dwNewLong) { + long __functionAddress = Functions.SetClassLongPtr; + if (CHECKS) { + check(hWnd); + } + return nSetClassLongPtr(hWnd, nIndex, dwNewLong, __functionAddress); + } + + // --- [ GetClassLongPtr ] --- + + /** Unsafe version of: {@link #GetClassLongPtr} */ + public static native long nGetClassLongPtr(long hWnd, int nIndex, long __functionAddress); + + /** + * Retrieves the specified value from the {@link WNDCLASSEX} structure associated with the specified window. + * + * @param hWnd a handle to the window and, indirectly, the class to which the window belongs + * @param nIndex the value to be retrieved. To retrieve a value from the extra class memory, specify the positive, zero-based byte offset of the value to be + * retrieved. Valid values are in the range zero through the number of bytes of extra class memory, minus eight; for example, if you specified 24 or + * more bytes of extra class memory, a value of 16 would be an index to the third integer. To retrieve any other value from the {@link WNDCLASSEX} + * structure, specify one of:
    {@link #GCL_MENUNAME}{@link #GCL_HBRBACKGROUND}{@link #GCL_HCURSOR}{@link #GCL_HICON}{@link #GCL_HMODULE}{@link #GCL_CBWNDEXTRA}
    {@link #GCL_CBCLSEXTRA}{@link #GCL_WNDPROC}{@link #GCL_STYLE}{@link #GCW_ATOM}{@link #GCL_HICONSM}
    + */ + @NativeType("LONG_PTR") + public static long GetClassLongPtr(@NativeType("HWND") long hWnd, int nIndex) { + long __functionAddress = Functions.GetClassLongPtr; + if (CHECKS) { + check(hWnd); + } + return nGetClassLongPtr(hWnd, nIndex, __functionAddress); + } + + // --- [ SetLayeredWindowAttributes ] --- + + /** Unsafe version of: {@link #SetLayeredWindowAttributes} */ + public static native int nSetLayeredWindowAttributes(long hwnd, int crKey, byte bAlpha, int dwFlags, long __functionAddress); + + /** + * @param hwnd a handle to the layered window. A layered window is created by specifying {@link #WS_EX_LAYERED} when creating the window with the {@link #CreateWindowEx} + * function or by setting {@link #WS_EX_LAYERED} via {@link #SetWindowLongPtr} after the window has been created. + * @param crKey the transparency color key (0x00bbggrr) to be used when composing the layered window. All pixels painted by the window in this color will be + * transparent. + * @param bAlpha the alpha value used to describe the opacity of the layered window. When {@code bAlpha} is 0, the window is completely transparent. When + * {@code bAlpha} is 255, the window is opaque. + * @param dwFlags an action to be taken. One or more of:
    {@link #LWA_COLORKEY}{@link #LWA_ALPHA}
    + */ + @NativeType("BOOL") + public static boolean SetLayeredWindowAttributes(@NativeType("HWND") long hwnd, @NativeType("COLORREF") int crKey, @NativeType("BYTE") byte bAlpha, @NativeType("DWORD") int dwFlags) { + long __functionAddress = Functions.SetLayeredWindowAttributes; + if (CHECKS) { + check(hwnd); + } + return nSetLayeredWindowAttributes(hwnd, crKey, bAlpha, dwFlags, __functionAddress) != 0; + } + + // --- [ LoadIcon ] --- + + /** Unsafe version of: {@link #LoadIcon} */ + public static native long nLoadIcon(long instance, long iconName, long __functionAddress); + + /** Unsafe version of: {@link #LoadIcon} */ + public static long nLoadIcon(long instance, long iconName) { + long __functionAddress = Functions.LoadIcon; + return nLoadIcon(instance, iconName, __functionAddress); + } + + /** + * Loads the specified icon resource from the executable (.exe) file associated with an application instance. + * + * @param instance a handle to an instance of the module whose executable file contains the icon to be loaded. This parameter must be {@code NULL} when a standard icon is + * being loaded. + * @param iconName the name of the icon resource to be loaded or one of:
    {@link #IDI_APPLICATION}{@link #IDI_HAND}{@link #IDI_QUESTION}{@link #IDI_EXCLAMATION}{@link #IDI_ASTERISK}{@link #IDI_WINLOGO}
    {@link #IDI_SHIELD}{@link #IDI_WARNING}{@link #IDI_ERROR}{@link #IDI_INFORMATION}
    + */ + @NativeType("HICON") + public static long LoadIcon(@NativeType("HINSTANCE") long instance, @NativeType("LPCTSTR") ByteBuffer iconName) { + if (CHECKS) { + checkNT2(iconName); + } + return nLoadIcon(instance, memAddress(iconName)); + } + + /** + * Loads the specified icon resource from the executable (.exe) file associated with an application instance. + * + * @param instance a handle to an instance of the module whose executable file contains the icon to be loaded. This parameter must be {@code NULL} when a standard icon is + * being loaded. + * @param iconName the name of the icon resource to be loaded or one of:
    {@link #IDI_APPLICATION}{@link #IDI_HAND}{@link #IDI_QUESTION}{@link #IDI_EXCLAMATION}{@link #IDI_ASTERISK}{@link #IDI_WINLOGO}
    {@link #IDI_SHIELD}{@link #IDI_WARNING}{@link #IDI_ERROR}{@link #IDI_INFORMATION}
    + */ + @NativeType("HICON") + public static long LoadIcon(@NativeType("HINSTANCE") long instance, @NativeType("LPCTSTR") CharSequence iconName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF16(iconName, true); + long iconNameEncoded = stack.getPointerAddress(); + return nLoadIcon(instance, iconNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ LoadCursor ] --- + + /** Unsafe version of: {@link #LoadCursor} */ + public static native long nLoadCursor(long instance, long cursorName, long __functionAddress); + + /** Unsafe version of: {@link #LoadCursor} */ + public static long nLoadCursor(long instance, long cursorName) { + long __functionAddress = Functions.LoadCursor; + return nLoadCursor(instance, cursorName, __functionAddress); + } + + /** + * Loads the specified cursor resource from the executable (.EXE) file associated with an application instance. + * + * @param instance a handle to an instance of the module whose executable file contains the cursor to be loaded. + * @param cursorName the name of the cursor resource to be loaded or one of:
    {@link #IDC_ARROW}{@link #IDC_IBEAM}{@link #IDC_WAIT}{@link #IDC_CROSS}{@link #IDC_UPARROW}{@link #IDC_SIZE}{@link #IDC_ICON}{@link #IDC_SIZENWSE}
    {@link #IDC_SIZENESW}{@link #IDC_SIZEWE}{@link #IDC_SIZENS}{@link #IDC_SIZEALL}{@link #IDC_NO}{@link #IDC_HAND}{@link #IDC_APPSTARTING}{@link #IDC_HELP}
    + */ + @NativeType("HCURSOR") + public static long LoadCursor(@NativeType("HINSTANCE") long instance, @NativeType("LPCTSTR") ByteBuffer cursorName) { + if (CHECKS) { + checkNT2(cursorName); + } + return nLoadCursor(instance, memAddress(cursorName)); + } + + /** + * Loads the specified cursor resource from the executable (.EXE) file associated with an application instance. + * + * @param instance a handle to an instance of the module whose executable file contains the cursor to be loaded. + * @param cursorName the name of the cursor resource to be loaded or one of:
    {@link #IDC_ARROW}{@link #IDC_IBEAM}{@link #IDC_WAIT}{@link #IDC_CROSS}{@link #IDC_UPARROW}{@link #IDC_SIZE}{@link #IDC_ICON}{@link #IDC_SIZENWSE}
    {@link #IDC_SIZENESW}{@link #IDC_SIZEWE}{@link #IDC_SIZENS}{@link #IDC_SIZEALL}{@link #IDC_NO}{@link #IDC_HAND}{@link #IDC_APPSTARTING}{@link #IDC_HELP}
    + */ + @NativeType("HCURSOR") + public static long LoadCursor(@NativeType("HINSTANCE") long instance, @NativeType("LPCTSTR") CharSequence cursorName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF16(cursorName, true); + long cursorNameEncoded = stack.getPointerAddress(); + return nLoadCursor(instance, cursorNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ GetDC ] --- + + /** + * Retrieves a handle to a device context (DC) for the client area of a specified window or for the entire screen. You can use the returned handle in + * subsequent GDI functions to draw in the DC. The device context is an opaque data structure, whose values are used internally by GDI. + * + * @param hWnd a handle to the window whose DC is to be retrieved. If this value is {@code NULL}, GetDC retrieves the DC for the entire screen. + */ + @NativeType("HDC") + public static long GetDC(@NativeType("HWND") long hWnd) { + long __functionAddress = Functions.GetDC; + return callPP(hWnd, __functionAddress); + } + + // --- [ ReleaseDC ] --- + + /** + * Releases a device context (DC), freeing it for use by other applications. The effect of the ReleaseDC function depends on the type of DC. It frees only + * common and window DCs. It has no effect on class or private DCs. + * + * @param hWnd a handle to the window whose DC is to be released + * @param hDC a handle to the DC to be released + */ + @NativeType("BOOL") + public static boolean ReleaseDC(@NativeType("HWND") long hWnd, @NativeType("HDC") long hDC) { + long __functionAddress = Functions.ReleaseDC; + if (CHECKS) { + check(hWnd); + check(hDC); + } + return callPPI(hWnd, hDC, __functionAddress) != 0; + } + + // --- [ GetSystemMetrics ] --- + + /** + * Retrieves the specified system metric or system configuration setting. + * + * @param index the system metric or configuration setting to be retrieved. One of:
    {@link #SM_CXSCREEN}{@link #SM_CYSCREEN}{@link #SM_CXVSCROLL}{@link #SM_CYHSCROLL}{@link #SM_CYCAPTION}{@link #SM_CXBORDER}
    {@link #SM_CYBORDER}{@link #SM_CXDLGFRAME}{@link #SM_CYDLGFRAME}{@link #SM_CYVTHUMB}{@link #SM_CXHTHUMB}{@link #SM_CXICON}
    {@link #SM_CYICON}{@link #SM_CXCURSOR}{@link #SM_CYCURSOR}{@link #SM_CYMENU}{@link #SM_CXFULLSCREEN}{@link #SM_CYFULLSCREEN}
    {@link #SM_CYKANJIWINDOW}{@link #SM_MOUSEPRESENT}{@link #SM_CYVSCROLL}{@link #SM_CXHSCROLL}{@link #SM_DEBUG}{@link #SM_SWAPBUTTON}
    {@link #SM_RESERVED1}{@link #SM_RESERVED2}{@link #SM_RESERVED3}{@link #SM_RESERVED4}{@link #SM_CXMIN}{@link #SM_CYMIN}
    {@link #SM_CXSIZE}{@link #SM_CYSIZE}{@link #SM_CXFRAME}{@link #SM_CYFRAME}{@link #SM_CXMINTRACK}{@link #SM_CYMINTRACK}
    {@link #SM_CXDOUBLECLK}{@link #SM_CYDOUBLECLK}{@link #SM_CXICONSPACING}{@link #SM_CYICONSPACING}{@link #SM_MENUDROPALIGNMENT}{@link #SM_PENWINDOWS}
    {@link #SM_DBCSENABLED}{@link #SM_CMOUSEBUTTONS}{@link #SM_CXFIXEDFRAME}{@link #SM_CYFIXEDFRAME}{@link #SM_CXSIZEFRAME}{@link #SM_CYSIZEFRAME}
    {@link #SM_SECURE}{@link #SM_CXEDGE}{@link #SM_CYEDGE}{@link #SM_CXMINSPACING}{@link #SM_CYMINSPACING}{@link #SM_CXSMICON}
    {@link #SM_CYSMICON}{@link #SM_CYSMCAPTION}{@link #SM_CXSMSIZE}{@link #SM_CYSMSIZE}{@link #SM_CXMENUSIZE}{@link #SM_CYMENUSIZE}
    {@link #SM_ARRANGE}{@link #SM_CXMINIMIZED}{@link #SM_CYMINIMIZED}{@link #SM_CXMAXTRACK}{@link #SM_CYMAXTRACK}{@link #SM_CXMAXIMIZED}
    {@link #SM_CYMAXIMIZED}{@link #SM_NETWORK}{@link #SM_CLEANBOOT}{@link #SM_CXDRAG}{@link #SM_CYDRAG}{@link #SM_SHOWSOUNDS}
    {@link #SM_CXMENUCHECK}{@link #SM_CYMENUCHECK}{@link #SM_SLOWMACHINE}{@link #SM_MIDEASTENABLED}{@link #SM_MOUSEWHEELPRESENT}{@link #SM_XVIRTUALSCREEN}
    {@link #SM_YVIRTUALSCREEN}{@link #SM_CXVIRTUALSCREEN}{@link #SM_CYVIRTUALSCREEN}{@link #SM_CMONITORS}{@link #SM_SAMEDISPLAYFORMAT}{@link #SM_IMMENABLED}
    {@link #SM_REMOTESESSION}{@link #SM_SHUTTINGDOWN}{@link #SM_REMOTECONTROL}{@link #SM_CARETBLINKINGENABLED}{@link #SM_CXFOCUSBORDER}{@link #SM_CYFOCUSBORDER}
    {@link #SM_TABLETPC}{@link #SM_MEDIACENTER}{@link #SM_STARTER}{@link #SM_SERVERR2}{@link #SM_MOUSEHORIZONTALWHEELPRESENT}{@link #SM_CXPADDEDBORDER}
    {@link #SM_DIGITIZER}{@link #SM_MAXIMUMTOUCHES}
    + */ + public static int GetSystemMetrics(int index) { + long __functionAddress = Functions.GetSystemMetrics; + return callI(index, __functionAddress); + } + + // --- [ RegisterTouchWindow ] --- + + /** Unsafe version of: {@link #RegisterTouchWindow} */ + public static native int nRegisterTouchWindow(long hWnd, int ulFlags, long __functionAddress); + + /** + * Registers a window as being touch-capable. + * + *

    {@code RegisterTouchWindow} must be called on every window that will be used for touch input. This means that if you have an application that has + * multiple windows within it, {@code RegisterTouchWindow} must be called on every window in that application that uses touch features. Also, an + * application can call {@code RegisterTouchWindow} any number of times for the same window if it desires to change the modifier flags. A window can be + * marked as no longer requiring touch input using the {@link #UnregisterTouchWindow} function.

    + * + * @param hWnd the handle of the window being registered. The function fails with {@code ERROR_ACCESS_DENIED} if the calling thread does not own the specified + * window. + * @param ulFlags a set of bit flags that specify optional modifications. This field may contain 0 or one or more of:
    {@link #TWF_FINETOUCH}{@link #TWF_WANTPALM}
    + * + * @since Windows 7 (desktop apps only) + */ + @NativeType("BOOL") + public static boolean RegisterTouchWindow(@NativeType("HWND") long hWnd, @NativeType("ULONG") int ulFlags) { + long __functionAddress = Functions.RegisterTouchWindow; + if (CHECKS) { + check(__functionAddress); + check(hWnd); + } + return nRegisterTouchWindow(hWnd, ulFlags, __functionAddress) != 0; + } + + // --- [ UnregisterTouchWindow ] --- + + /** Unsafe version of: {@link #UnregisterTouchWindow} */ + public static native int nUnregisterTouchWindow(long hWnd, long __functionAddress); + + /** + * Registers a window as no longer being touch-capable. + * + * @param hWnd the handle of the window. The function fails with {@code ERROR_ACCESS_DENIED} if the calling thread does not own the specified window. + * + * @since Windows 7 (desktop apps only) + */ + @NativeType("BOOL") + public static boolean UnregisterTouchWindow(@NativeType("HWND") long hWnd) { + long __functionAddress = Functions.UnregisterTouchWindow; + if (CHECKS) { + check(__functionAddress); + check(hWnd); + } + return nUnregisterTouchWindow(hWnd, __functionAddress) != 0; + } + + // --- [ IsTouchWindow ] --- + + /** Unsafe version of: {@link #IsTouchWindow} */ + public static int nIsTouchWindow(long hWnd, long pulFlags) { + long __functionAddress = Functions.IsTouchWindow; + if (CHECKS) { + check(__functionAddress); + check(hWnd); + } + return callPPI(hWnd, pulFlags, __functionAddress); + } + + /** + * Checks whether a specified window is touch-capable and, optionally, retrieves the modifier flags set for the window's touch capability. + * + * @param hWnd the handle of the window. The function fails with {@code ERROR_ACCESS_DENIED} if the calling thread is not on the same desktop as the specified + * window. + * @param pulFlags an optional address of the {@code ULONG} variable to receive the modifier flags for the specified window's touch capability. + * + * @since Windows 7 (desktop apps only) + */ + @NativeType("BOOL") + public static boolean IsTouchWindow(@NativeType("HWND") long hWnd, @Nullable @NativeType("PULONG") IntBuffer pulFlags) { + if (CHECKS) { + checkSafe(pulFlags, 1); + } + return nIsTouchWindow(hWnd, memAddressSafe(pulFlags)) != 0; + } + + // --- [ GetTouchInputInfo ] --- + + /** + * Unsafe version of: {@link #GetTouchInputInfo} + * + * @param cInputs The number of structures in the {@code pInputs} array. This should ideally be at least equal to the number of touch points associated with the + * message as indicated in the message {@code WPARAM}. If {@code cInputs} is less than the number of touch points, the function will still succeed and + * populate the {@code pInputs} buffer with information about {@code cInputs} touch points. + */ + public static native int nGetTouchInputInfo(long hTouchInput, int cInputs, long pInputs, int cbSize, long __functionAddress); + + /** + * Unsafe version of: {@link #GetTouchInputInfo} + * + * @param cInputs The number of structures in the {@code pInputs} array. This should ideally be at least equal to the number of touch points associated with the + * message as indicated in the message {@code WPARAM}. If {@code cInputs} is less than the number of touch points, the function will still succeed and + * populate the {@code pInputs} buffer with information about {@code cInputs} touch points. + */ + public static int nGetTouchInputInfo(long hTouchInput, int cInputs, long pInputs, int cbSize) { + long __functionAddress = Functions.GetTouchInputInfo; + if (CHECKS) { + check(__functionAddress); + check(hTouchInput); + } + return nGetTouchInputInfo(hTouchInput, cInputs, pInputs, cbSize, __functionAddress); + } + + /** + * Retrieves detailed information about touch inputs associated with a particular touch input handle. + * + * @param hTouchInput the touch input handle received in the {@code LPARAM} of a touch message. The function fails with {@code ERROR_INVALID_HANDLE} if this handle is + * not valid. Note that the handle is not valid after it has been used in a successful call to {@link #CloseTouchInputHandle} or after it has been passed to + * {@link #DefWindowProc}, {@link #PostMessage}, {@link #SendMessage} or one of their variants. + * @param pInputs a pointer to an array of {@link TOUCHINPUT} structures to receive information about the touch points associated with the specified touch input handle + * @param cbSize the size, in bytes, of a single {@link TOUCHINPUT} structure. If {@code cbSize} is not the size of a single {@code TOUCHINPUT} structure, the function + * fails with {@code ERROR_INVALID_PARAMETER}. + * + * @since Windows 7 (desktop apps only) + */ + @NativeType("BOOL") + public static boolean GetTouchInputInfo(@NativeType("HTOUCHINPUT") long hTouchInput, @NativeType("PTOUCHINPUT") TOUCHINPUT.Buffer pInputs, int cbSize) { + return nGetTouchInputInfo(hTouchInput, pInputs.remaining(), pInputs.address(), cbSize) != 0; + } + + // --- [ CloseTouchInputHandle ] --- + + /** Unsafe version of: {@link #CloseTouchInputHandle} */ + public static native int nCloseTouchInputHandle(long hTouchInput, long __functionAddress); + + /** + * Closes a touch input handle, frees process memory associated with it, and invalidates the handle. + * + * @param hTouchInput the touch input handle received in the {@code LPARAM} of a touch message. The function fails with {@code ERROR_INVALID_HANDLE} if this handle is + * not valid. Note that the handle is not valid after it has been used in a successful call to {@link #CloseTouchInputHandle} or after it has been passed to + * {@link #DefWindowProc}, {@link #PostMessage}, {@link #SendMessage} or one of their variants. + * + * @since Windows 7 (desktop apps only) + */ + @NativeType("BOOL") + public static boolean CloseTouchInputHandle(@NativeType("HTOUCHINPUT") long hTouchInput) { + long __functionAddress = Functions.CloseTouchInputHandle; + if (CHECKS) { + check(__functionAddress); + check(hTouchInput); + } + return nCloseTouchInputHandle(hTouchInput, __functionAddress) != 0; + } + + // --- [ MonitorFromWindow ] --- + + /** + * Retrieves a handle to the display monitor that has the largest area of intersection with the bounding rectangle of a specified window. + * + * @param hWnd a handle to the window of interest + * @param dwFlags determines the function's return value if the window does not intersect any display monitor. One of:
    {@link #MONITOR_DEFAULTTONULL}{@link #MONITOR_DEFAULTTOPRIMARY}{@link #MONITOR_DEFAULTTONEAREST}
    + */ + @NativeType("HMONITOR") + public static long MonitorFromWindow(@NativeType("HWND") long hWnd, @NativeType("DWORD") int dwFlags) { + long __functionAddress = Functions.MonitorFromWindow; + if (CHECKS) { + check(hWnd); + } + return callPP(hWnd, dwFlags, __functionAddress); + } + + // --- [ GetMonitorInfo ] --- + + /** Unsafe version of: {@link #GetMonitorInfo} */ + public static int nGetMonitorInfo(long hMonitor, long lpmi) { + long __functionAddress = Functions.GetMonitorInfo; + if (CHECKS) { + check(hMonitor); + } + return callPPI(hMonitor, lpmi, __functionAddress); + } + + /** + * Retrieves information about a display monitor. + * + * @param hMonitor a handle to the display monitor of interest + * @param lpmi a pointer to a {@link MONITORINFOEX} structure that receives information about the specified display monitor. + * + *

    You must set the {@code cbSize} member of the structure to {@link MONITORINFOEX#SIZEOF} before calling the {@code GetMonitorInfo} function. Doing so lets + * the function determine the type of structure you are passing to it.

    + */ + @NativeType("BOOL") + public static boolean GetMonitorInfo(@NativeType("HMONITOR") long hMonitor, @NativeType("LPMONITORINFOEX") MONITORINFOEX lpmi) { + return nGetMonitorInfo(hMonitor, lpmi.address()) != 0; + } + + // --- [ EnumDisplayDevices ] --- + + /** Unsafe version of: {@link #EnumDisplayDevices} */ + public static int nEnumDisplayDevices(long lpDevice, int iDevNum, long lpDisplayDevice, int dwFlags) { + long __functionAddress = Functions.EnumDisplayDevices; + return callPPI(lpDevice, iDevNum, lpDisplayDevice, dwFlags, __functionAddress); + } + + /** + * Obtains information about the display devices in the current session. + * + * @param lpDevice the device name. If {@code NULL}, function returns information for the display adapter(s) on the machine, based on {@code devNum}. + * @param iDevNum an index value that specifies the display device of interest. + * + *

    The operating system identifies each display device in the current session with an index value. The index values are consecutive integers, starting + * at 0. If the current session has three display devices, for example, they are specified by the index values 0, 1, and 2.

    + * @param lpDisplayDevice a pointer to a {@link DISPLAY_DEVICE} structure that receives information about the display device specified by {@code iDevNum}. + * + *

    Before calling {@code EnumDisplayDevices}, you must initialize the {@code cb} member of {@code DISPLAY_DEVICE} to the size, in bytes, of + * {@code DISPLAY_DEVICE}.

    + * @param dwFlags set this flag to {@link #EDD_GET_DEVICE_INTERFACE_NAME} to retrieve the device interface name for {@code GUID_DEVINTERFACE_MONITOR}, which is registered by + * the operating system on a per monitor basis. The value is placed in the {@code DeviceID} member of the {@link DISPLAY_DEVICE} structure returned in + * {@code lpDisplayDevice}. The resulting device interface name can be used with SetupAPI functions and serves as a link between GDI monitor devices + * and SetupAPI monitor devices. + */ + @NativeType("BOOL") + public static boolean EnumDisplayDevices(@Nullable @NativeType("LPCTSTR") ByteBuffer lpDevice, @NativeType("DWORD") int iDevNum, @NativeType("PDISPLAY_DEVICE") DISPLAY_DEVICE lpDisplayDevice, @NativeType("DWORD") int dwFlags) { + if (CHECKS) { + checkNT2Safe(lpDevice); + } + return nEnumDisplayDevices(memAddressSafe(lpDevice), iDevNum, lpDisplayDevice.address(), dwFlags) != 0; + } + + /** + * Obtains information about the display devices in the current session. + * + * @param lpDevice the device name. If {@code NULL}, function returns information for the display adapter(s) on the machine, based on {@code devNum}. + * @param iDevNum an index value that specifies the display device of interest. + * + *

    The operating system identifies each display device in the current session with an index value. The index values are consecutive integers, starting + * at 0. If the current session has three display devices, for example, they are specified by the index values 0, 1, and 2.

    + * @param lpDisplayDevice a pointer to a {@link DISPLAY_DEVICE} structure that receives information about the display device specified by {@code iDevNum}. + * + *

    Before calling {@code EnumDisplayDevices}, you must initialize the {@code cb} member of {@code DISPLAY_DEVICE} to the size, in bytes, of + * {@code DISPLAY_DEVICE}.

    + * @param dwFlags set this flag to {@link #EDD_GET_DEVICE_INTERFACE_NAME} to retrieve the device interface name for {@code GUID_DEVINTERFACE_MONITOR}, which is registered by + * the operating system on a per monitor basis. The value is placed in the {@code DeviceID} member of the {@link DISPLAY_DEVICE} structure returned in + * {@code lpDisplayDevice}. The resulting device interface name can be used with SetupAPI functions and serves as a link between GDI monitor devices + * and SetupAPI monitor devices. + */ + @NativeType("BOOL") + public static boolean EnumDisplayDevices(@Nullable @NativeType("LPCTSTR") CharSequence lpDevice, @NativeType("DWORD") int iDevNum, @NativeType("PDISPLAY_DEVICE") DISPLAY_DEVICE lpDisplayDevice, @NativeType("DWORD") int dwFlags) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF16Safe(lpDevice, true); + long lpDeviceEncoded = lpDevice == null ? NULL : stack.getPointerAddress(); + return nEnumDisplayDevices(lpDeviceEncoded, iDevNum, lpDisplayDevice.address(), dwFlags) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ EnumDisplaySettingsEx ] --- + + /** Unsafe version of: {@link #EnumDisplaySettingsEx} */ + public static int nEnumDisplaySettingsEx(long lpszDeviceName, int iModeNum, long lpDevMode, int dwFlags) { + long __functionAddress = Functions.EnumDisplaySettingsEx; + return callPPI(lpszDeviceName, iModeNum, lpDevMode, dwFlags, __functionAddress); + } + + /** + * Retrieves information about one of the graphics modes for a display device. To retrieve information for all the graphics modes for a display device, + * make a series of calls to this function. + * + * @param lpszDeviceName a pointer to a null-terminated string that specifies the display device about which graphics mode the function will obtain information. + * + *

    This parameter is either {@code NULL} or a {@link DISPLAY_DEVICE#DeviceName} returned from {@link #EnumDisplayDevices}. A {@code NULL} value specifies the current display + * device on the computer that the calling thread is running on.

    + * @param iModeNum indicates the type of information to be retrieved. + * + *

    Graphics mode indexes start at zero. To obtain information for all of a display device's graphics modes, make a series of calls to + * {@code EnumDisplaySettingsEx}, as follows: Set {@code iModeNum} to zero for the first call, and increment {@code iModeNum} by one for each + * subsequent call. Continue calling the function until the return value is zero.

    + * + *

    When you call {@code EnumDisplaySettingsEx} with {@code iModeNum} set to zero, the operating system initializes and caches information about the + * display device. When you call {@code EnumDisplaySettingsEx} with {@code iModeNum} set to a nonzero value, the function returns the information that + * was cached the last time the function was called with {@code iModeNum} set to zero.

    + * + *

    This value can be a graphics mode index or one of:

    {@link #ENUM_CURRENT_SETTINGS}{@link #ENUM_REGISTRY_SETTINGS}
    + * @param lpDevMode a pointer to a {@link DEVMODE} structure into which the function stores information about the specified graphics mode. Before calling + * {@code EnumDisplaySettingsEx}, set the {@code dmSize} member to {@link DEVMODE#SIZEOF}, and set the {@code dmDriverExtra} member to indicate the size, in + * bytes, of the additional space available to receive private driver data. + * + *

    The {@code EnumDisplaySettingsEx} function will populate the {@code dmFields} member of the {@code lpDevMode} and one or more other members of the + * {@code DEVMODE} structure. To determine which members were set by the call to {@code EnumDisplaySettingsEx}, inspect the {@code dmFields} bitmask.

    + * @param dwFlags this parameter can be one of:
    {@link #EDS_RAWMODE}{@link #EDS_ROTATEDMODE}
    + */ + @NativeType("BOOL") + public static boolean EnumDisplaySettingsEx(@Nullable @NativeType("LPCTSTR") ByteBuffer lpszDeviceName, @NativeType("DWORD") int iModeNum, @NativeType("DEVMODE *") DEVMODE lpDevMode, @NativeType("DWORD") int dwFlags) { + if (CHECKS) { + checkNT2Safe(lpszDeviceName); + } + return nEnumDisplaySettingsEx(memAddressSafe(lpszDeviceName), iModeNum, lpDevMode.address(), dwFlags) != 0; + } + + /** + * Retrieves information about one of the graphics modes for a display device. To retrieve information for all the graphics modes for a display device, + * make a series of calls to this function. + * + * @param lpszDeviceName a pointer to a null-terminated string that specifies the display device about which graphics mode the function will obtain information. + * + *

    This parameter is either {@code NULL} or a {@link DISPLAY_DEVICE#DeviceName} returned from {@link #EnumDisplayDevices}. A {@code NULL} value specifies the current display + * device on the computer that the calling thread is running on.

    + * @param iModeNum indicates the type of information to be retrieved. + * + *

    Graphics mode indexes start at zero. To obtain information for all of a display device's graphics modes, make a series of calls to + * {@code EnumDisplaySettingsEx}, as follows: Set {@code iModeNum} to zero for the first call, and increment {@code iModeNum} by one for each + * subsequent call. Continue calling the function until the return value is zero.

    + * + *

    When you call {@code EnumDisplaySettingsEx} with {@code iModeNum} set to zero, the operating system initializes and caches information about the + * display device. When you call {@code EnumDisplaySettingsEx} with {@code iModeNum} set to a nonzero value, the function returns the information that + * was cached the last time the function was called with {@code iModeNum} set to zero.

    + * + *

    This value can be a graphics mode index or one of:

    {@link #ENUM_CURRENT_SETTINGS}{@link #ENUM_REGISTRY_SETTINGS}
    + * @param lpDevMode a pointer to a {@link DEVMODE} structure into which the function stores information about the specified graphics mode. Before calling + * {@code EnumDisplaySettingsEx}, set the {@code dmSize} member to {@link DEVMODE#SIZEOF}, and set the {@code dmDriverExtra} member to indicate the size, in + * bytes, of the additional space available to receive private driver data. + * + *

    The {@code EnumDisplaySettingsEx} function will populate the {@code dmFields} member of the {@code lpDevMode} and one or more other members of the + * {@code DEVMODE} structure. To determine which members were set by the call to {@code EnumDisplaySettingsEx}, inspect the {@code dmFields} bitmask.

    + * @param dwFlags this parameter can be one of:
    {@link #EDS_RAWMODE}{@link #EDS_ROTATEDMODE}
    + */ + @NativeType("BOOL") + public static boolean EnumDisplaySettingsEx(@Nullable @NativeType("LPCTSTR") CharSequence lpszDeviceName, @NativeType("DWORD") int iModeNum, @NativeType("DEVMODE *") DEVMODE lpDevMode, @NativeType("DWORD") int dwFlags) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF16Safe(lpszDeviceName, true); + long lpszDeviceNameEncoded = lpszDeviceName == null ? NULL : stack.getPointerAddress(); + return nEnumDisplaySettingsEx(lpszDeviceNameEncoded, iModeNum, lpDevMode.address(), dwFlags) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ ChangeDisplaySettingsEx ] --- + + /** Unsafe version of: {@link #ChangeDisplaySettingsEx} */ + public static int nChangeDisplaySettingsEx(long lpszDeviceName, long lpDevMode, long hwnd, int dwflags, long lParam) { + long __functionAddress = Functions.ChangeDisplaySettingsEx; + return callPPPPI(lpszDeviceName, lpDevMode, hwnd, dwflags, lParam, __functionAddress); + } + + /** + * Changes the settings of the specified display device to the specified graphics mode. + * + * @param lpszDeviceName a pointer to a null-terminated string that specifies the display device whose graphics mode will change. Only display device names as returned by + * {@link #EnumDisplayDevices} are valid. + * + *

    The {@code lpszDeviceName} parameter can be {@code NULL}. A {@code NULL} value specifies the default display device. The default device can be determined by + * calling {@code EnumDisplayDevices} and checking for the {@link GDI32#DISPLAY_DEVICE_PRIMARY_DEVICE} flag.

    + * @param lpDevMode a pointer to a {@link DEVMODE} structure that describes the new graphics mode. If {@code lpDevMode} is {@code NULL}, all the values currently in the registry + * will be used for the display setting. Passing {@code NULL} for the {@code lpDevMode} parameter and 0 for the {@code dwFlags} parameter is the easiest way + * to return to the default mode after a dynamic mode change. + * + *

    The {@code dmSize} member must be initialized to the size, in bytes, of the {@code DEVMODE} structure. The {@code dmDriverExtra} member must be + * initialized to indicate the number of bytes of private driver data following the {@code DEVMODE} structure.

    + * @param hwnd reserved; must be {@code NULL} + * @param dwflags indicates how the graphics mode should be changed. One of:
    {@link #CDS_UPDATEREGISTRY}{@link #CDS_TEST}{@link #CDS_FULLSCREEN}{@link #CDS_GLOBAL}{@link #CDS_SET_PRIMARY}
    {@link #CDS_VIDEOPARAMETERS}{@link #CDS_ENABLE_UNSAFE_MODES}{@link #CDS_DISABLE_UNSAFE_MODES}{@link #CDS_RESET}{@link #CDS_RESET_EX}
    {@link #CDS_NORESET}
    + * @param lParam if {@code flags} is {@link #CDS_VIDEOPARAMETERS}, {@code lParam} is a pointer to a {@code VIDEOPARAMETERS} structure. Otherwise {@code lParam} must be {@code NULL}. + * + * @return one of the following values: {@link #DISP_CHANGE_SUCCESSFUL} {@link #DISP_CHANGE_RESTART} {@link #DISP_CHANGE_FAILED} {@link #DISP_CHANGE_BADMODE} {@link #DISP_CHANGE_NOTUPDATED} {@link #DISP_CHANGE_BADFLAGS} {@link #DISP_CHANGE_BADPARAM} {@link #DISP_CHANGE_BADDUALVIEW} + */ + @NativeType("LONG") + public static int ChangeDisplaySettingsEx(@Nullable @NativeType("LPCTSTR") ByteBuffer lpszDeviceName, @Nullable @NativeType("DEVMODE *") DEVMODE lpDevMode, @NativeType("HWND") long hwnd, @NativeType("DWORD") int dwflags, @NativeType("LPVOID") long lParam) { + if (CHECKS) { + checkNT2Safe(lpszDeviceName); + } + return nChangeDisplaySettingsEx(memAddressSafe(lpszDeviceName), memAddressSafe(lpDevMode), hwnd, dwflags, lParam); + } + + /** + * Changes the settings of the specified display device to the specified graphics mode. + * + * @param lpszDeviceName a pointer to a null-terminated string that specifies the display device whose graphics mode will change. Only display device names as returned by + * {@link #EnumDisplayDevices} are valid. + * + *

    The {@code lpszDeviceName} parameter can be {@code NULL}. A {@code NULL} value specifies the default display device. The default device can be determined by + * calling {@code EnumDisplayDevices} and checking for the {@link GDI32#DISPLAY_DEVICE_PRIMARY_DEVICE} flag.

    + * @param lpDevMode a pointer to a {@link DEVMODE} structure that describes the new graphics mode. If {@code lpDevMode} is {@code NULL}, all the values currently in the registry + * will be used for the display setting. Passing {@code NULL} for the {@code lpDevMode} parameter and 0 for the {@code dwFlags} parameter is the easiest way + * to return to the default mode after a dynamic mode change. + * + *

    The {@code dmSize} member must be initialized to the size, in bytes, of the {@code DEVMODE} structure. The {@code dmDriverExtra} member must be + * initialized to indicate the number of bytes of private driver data following the {@code DEVMODE} structure.

    + * @param hwnd reserved; must be {@code NULL} + * @param dwflags indicates how the graphics mode should be changed. One of:
    {@link #CDS_UPDATEREGISTRY}{@link #CDS_TEST}{@link #CDS_FULLSCREEN}{@link #CDS_GLOBAL}{@link #CDS_SET_PRIMARY}
    {@link #CDS_VIDEOPARAMETERS}{@link #CDS_ENABLE_UNSAFE_MODES}{@link #CDS_DISABLE_UNSAFE_MODES}{@link #CDS_RESET}{@link #CDS_RESET_EX}
    {@link #CDS_NORESET}
    + * @param lParam if {@code flags} is {@link #CDS_VIDEOPARAMETERS}, {@code lParam} is a pointer to a {@code VIDEOPARAMETERS} structure. Otherwise {@code lParam} must be {@code NULL}. + * + * @return one of the following values: {@link #DISP_CHANGE_SUCCESSFUL} {@link #DISP_CHANGE_RESTART} {@link #DISP_CHANGE_FAILED} {@link #DISP_CHANGE_BADMODE} {@link #DISP_CHANGE_NOTUPDATED} {@link #DISP_CHANGE_BADFLAGS} {@link #DISP_CHANGE_BADPARAM} {@link #DISP_CHANGE_BADDUALVIEW} + */ + @NativeType("LONG") + public static int ChangeDisplaySettingsEx(@Nullable @NativeType("LPCTSTR") CharSequence lpszDeviceName, @Nullable @NativeType("DEVMODE *") DEVMODE lpDevMode, @NativeType("HWND") long hwnd, @NativeType("DWORD") int dwflags, @NativeType("LPVOID") long lParam) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF16Safe(lpszDeviceName, true); + long lpszDeviceNameEncoded = lpszDeviceName == null ? NULL : stack.getPointerAddress(); + return nChangeDisplaySettingsEx(lpszDeviceNameEncoded, memAddressSafe(lpDevMode), hwnd, dwflags, lParam); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ GetCursorPos ] --- + + /** Unsafe version of: {@link #GetCursorPos} */ + public static int nGetCursorPos(long point) { + long __functionAddress = Functions.GetCursorPos; + return callPI(point, __functionAddress); + } + + /** + * Retrieves the position of the mouse cursor, in screen coordinates. + * + * @param point a pointer to a {@link POINT} structure that receives the screen coordinates of the cursor + */ + @NativeType("BOOL") + public static boolean GetCursorPos(@NativeType("LPPOINT") POINT point) { + return nGetCursorPos(point.address()) != 0; + } + + // --- [ SetCursorPos ] --- + + /** + * Moves the cursor to the specified screen coordinates. If the new coordinates are not within the screen rectangle set by the most recent {@link #ClipCursor} + * function call, the system automatically adjusts the coordinates so that the cursor stays within the rectangle. + * + * @param X the new x-coordinate of the cursor, in screen coordinates. + * @param Y the new y-coordinate of the cursor, in screen coordinates. + */ + @NativeType("BOOL") + public static boolean SetCursorPos(int X, int Y) { + long __functionAddress = Functions.SetCursorPos; + return callI(X, Y, __functionAddress) != 0; + } + + // --- [ ClipCursor ] --- + + /** Unsafe version of: {@link #ClipCursor} */ + public static int nClipCursor(long rect) { + long __functionAddress = Functions.ClipCursor; + return callPI(rect, __functionAddress); + } + + /** + * Confines the cursor to a rectangular area on the screen. If a subsequent cursor position (set by the {@link #SetCursorPos} function or the mouse) lies + * outside the rectangle, the system automatically adjusts the position to keep the cursor inside the rectangular area. + * + * @param rect a pointer to the structure that contains the screen coordinates of the upper-left and lower-right corners of the confining rectangle. If this + * parameter is {@code NULL}, the cursor is free to move anywhere on the screen. + */ + @NativeType("BOOL") + public static boolean ClipCursor(@Nullable @NativeType("RECT const *") RECT rect) { + return nClipCursor(memAddressSafe(rect)) != 0; + } + + // --- [ ShowCursor ] --- + + /** + * Displays or hides the cursor. + * + *

    This function sets an internal display counter that determines whether the cursor should be displayed. The cursor is displayed only if the display + * count is greater than or equal to 0. If a mouse is installed, the initial display count is 0. If no mouse is installed, the display count is –1.

    + * + * @param show If {@code show} is {@link WinBase#TRUE}, the display count is incremented by one. If {@code show} is {@link WinBase#FALSE}, the display count is decremented by one. + * + * @return the new display counter + */ + public static int ShowCursor(@NativeType("BOOL") boolean show) { + long __functionAddress = Functions.ShowCursor; + return callI(show ? 1 : 0, __functionAddress); + } + + // --- [ SetCursor ] --- + + /** + * Sets the cursor shape. + * + *

    The cursor is set only if the new cursor is different from the previous cursor; otherwise, the function returns immediately.

    + * + *

    The cursor is a shared resource. A window should set the cursor shape only when the cursor is in its client area or when the window is capturing mouse + * input. In systems without a mouse, the window should restore the previous cursor before the cursor leaves the client area or before it relinquishes + * control to another window.

    + * + *

    If your application must set the cursor while it is in a window, make sure the class cursor for the specified window's class is set to {@code NULL}. If the + * class cursor is not {@code NULL}, the system restores the class cursor each time the mouse is moved.

    + * + *

    The cursor is not shown on the screen if the internal cursor display count is less than zero. This occurs if the application uses the {@link #ShowCursor} + * function to hide the cursor more times than to show the cursor.

    + * + * @param hCursor a handle to the cursor. The cursor must have been created by the {@code CreateCursor} function or loaded by the {@link #LoadCursor} or {@code LoadImage} + * function. If this parameter is {@code NULL}, the cursor is removed from the screen. + * + * @return the handle to the previous cursor, if there was one + */ + @NativeType("HCURSOR") + public static long SetCursor(@NativeType("HCURSOR") long hCursor) { + long __functionAddress = Functions.SetCursor; + return callPP(hCursor, __functionAddress); + } + + // --- [ ClientToScreen ] --- + + /** Unsafe version of: {@link #ClientToScreen} */ + public static int nClientToScreen(long hWnd, long lpPoint) { + long __functionAddress = Functions.ClientToScreen; + if (CHECKS) { + check(hWnd); + } + return callPPI(hWnd, lpPoint, __functionAddress); + } + + /** + * Converts the client-area coordinates of a specified point to screen coordinates. + * + *

    The {@code ClientToScreen} function replaces the client-area coordinates in the {@link POINT} structure with the screen coordinates. The screen coordinates + * are relative to the upper-left corner of the screen. Note, a screen-coordinate point that is above the window's client area has a negative + * y-coordinate. Similarly, a screen coordinate to the left of a client area has a negative x-coordinate.

    + * + *

    All coordinates are device coordinates.

    + * + * @param hWnd a handle to the window whose client area is used for the conversion + * @param lpPoint a pointer to a {@code POINT} structure that contains the client coordinates to be converted. The new screen coordinates are copied into this + * structure if the function succeeds. + */ + @NativeType("BOOL") + public static boolean ClientToScreen(@NativeType("HWND") long hWnd, @NativeType("LPPOINT") POINT lpPoint) { + return nClientToScreen(hWnd, lpPoint.address()) != 0; + } + + // --- [ GetAsyncKeyState ] --- + + /** + * Determines whether a key is up or down at the time the function is called, and whether the key was pressed after a previous call to + * {@code GetAsyncKeyState}. + * + *

    The {@code GetAsyncKeyState} function works with mouse buttons. However, it checks on the state of the physical mouse buttons, not on the logical mouse + * buttons that the physical buttons are mapped to. For example, the call {@code GetAsyncKeyState(VK_LBUTTON)} always returns the state of the left + * physical mouse button, regardless of whether it is mapped to the left or right logical mouse button. You can determine the system's current mapping of + * physical mouse buttons to logical mouse buttons by calling {@code GetSystemMetrics(SM_SWAPBUTTON)} which returns {@link WinBase#TRUE} if the mouse buttons have been + * swapped.

    + * + *

    Although the least significant bit of the return value indicates whether the key has been pressed since the last query, due to the pre-emptive + * multitasking nature of Windows, another application can call {@code GetAsyncKeyState} and receive the "recently pressed" bit instead of your + * application. The behavior of the least significant bit of the return value is retained strictly for compatibility with 16-bit Windows applications + * (which are non-preemptive) and should not be relied upon.

    + * + *

    You can use the virtual-key code constants {@link #VK_SHIFT}, {@link #VK_CONTROL}, and {@link #VK_MENU} as values for the {@code vKey} parameter. This gives the state of the + * SHIFT, CTRL, or ALT keys without distinguishing between left and right.

    + * + * @param vKey the virtual-key code. You can use left- and right-distinguishing constants to specify certain keys. + * + * @return if the function succeeds, the return value specifies whether the key was pressed since the last call to {@code GetAsyncKeyState}, and whether the key + * is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the + * previous call to {@code GetAsyncKeyState}. However, you should not rely on this last behavior; for more information, see the Remarks. + * + *

    The return value is zero for the following cases:

    + * + *
      + *
    • The current desktop is not the active desktop
    • + *
    • The foreground thread belongs to another process and the desktop does not allow the hook or the journal record.
    • + *
    + */ + @NativeType("SHORT") + public static short GetAsyncKeyState(int vKey) { + long __functionAddress = Functions.GetAsyncKeyState; + return callS(vKey, __functionAddress); + } + + // --- [ GetMessageExtraInfo ] --- + + /** + * Retrieves the extra message information for the current thread. + * + *

    Extra message information is an application- or driver-defined value associated with the current thread's message queue.

    + * + * @return the extra information. The meaning of the extra information is device specific. + */ + @NativeType("LPARAM") + public static long GetMessageExtraInfo() { + long __functionAddress = Functions.GetMessageExtraInfo; + return callP(__functionAddress); + } + + // --- [ SendInput ] --- + + /** + * Unsafe version of: {@link #SendInput} + * + * @param cInputs the number of structures in the {@code pInputs} array + */ + public static int nSendInput(int cInputs, long pInputs, int cbSize) { + long __functionAddress = Functions.SendInput; + return callPI(cInputs, pInputs, cbSize, __functionAddress); + } + + /** + * Synthesizes keystrokes, mouse motions, and button clicks. + * + *

    This function is subject to UIPI. Applications are permitted to inject input only into applications that are at an equal or lesser integrity level.

    + * + *

    The {@code SendInput} function inserts the events in the {@link INPUT} structures serially into the keyboard or mouse input stream. These events are not + * interspersed with other keyboard or mouse input events inserted either by the user (with the keyboard or mouse) or by calls to {@code keybd_event}, + * {@code mouse_event}, or other calls to {@code SendInput}.

    + * + *

    This function does not reset the keyboard's current state. Any keys that are already pressed when the function is called might interfere with the + * events that this function generates. To avoid this problem, check the keyboard's state with the {@link #GetAsyncKeyState} function and correct as necessary.

    + * + *

    Because the touch keyboard uses the surrogate macros defined in {@code winnls.h} to send input to the system, a listener on the keyboard event hook + * must decode input originating from the touch keyboard.

    + * + *

    An accessibility application can use {@code SendInput} to inject keystrokes corresponding to application launch shortcut keys that are handled by the + * shell. This functionality is not guaranteed to work for other types of applications.

    + * + * @param pInputs an array of {@code INPUT} structures. Each structure represents an event to be inserted into the keyboard or mouse input stream. + * @param cbSize the size, in bytes, of an {@code INPUT} structure. If {@code cbSiz}e is not the size of an {@code INPUT} structure, the function fails. + * + * @return the number of events that it successfully inserted into the keyboard or mouse input stream. If the function returns zero, the input was already blocked + * by another thread. To get extended error information, call {@link WinBase#GetLastError}. + * + *

    This function fails when it is blocked by UIPI. Note that neither GetLastError nor the return value will indicate the failure was caused by UIPI + * blocking.

    + */ + @NativeType("UINT") + public static int SendInput(@NativeType("PINPUT") INPUT.Buffer pInputs, int cbSize) { + return nSendInput(pInputs.remaining(), pInputs.address(), cbSize); + } + + // --- [ GetDpiForSystem ] --- + + /** + * Returns the system DPI. + * + *

    The return value will be dependent based upon the calling context. If the current thread has a {@code DPI_AWARENESS} value of {@link #DPI_AWARENESS_UNAWARE}, + * the return value will be 96. That is because the current context always assumes a DPI of 96. For any other {@code DPI_AWARENESS} value, the return + * value will be the actual system DPI.

    + * + *

    You should not cache the system DPI, but should use {@code GetDpiForSystem} whenever you need the system DPI value.

    + * + * @return the system DPI value + * + * @since Windows 10 + */ + @NativeType("UINT") + public static int GetDpiForSystem() { + long __functionAddress = Functions.GetDpiForSystem; + if (CHECKS) { + check(__functionAddress); + } + return callI(__functionAddress); + } + + // --- [ GetDpiForWindow ] --- + + /** + * Returns the dots per inch (dpi) value for the associated window. + * + * @param hwnd the window you want to get information about + * + * @return the DPI for the window which depends on the {@code DPI_AWARENESS} of the window. An invalid {@code hwnd} value will result in a return value of 0. + * + * @since Windows 10 + */ + @NativeType("UINT") + public static int GetDpiForWindow(@NativeType("HWND") long hwnd) { + long __functionAddress = Functions.GetDpiForWindow; + if (CHECKS) { + check(__functionAddress); + check(hwnd); + } + return callPI(hwnd, __functionAddress); + } + + // --- [ GetAwarenessFromDpiAwarenessContext ] --- + + /** + * Retrieves the {@code DPI_AWARENESS} value from a {@code DPI_AWARENESS_CONTEXT}. + * + * @param value the {@code DPI_AWARENESS_CONTEXT} you want to examine + * + * @return the {@code DPI_AWARENESS}. If the provided value is null or invalid, this method will return {@link #DPI_AWARENESS_INVALID}. + * + * @since Windows 10 + */ + @NativeType("DPI_AWARENESS") + public static int GetAwarenessFromDpiAwarenessContext(@NativeType("DPI_AWARENESS_CONTEXT") long value) { + long __functionAddress = Functions.GetAwarenessFromDpiAwarenessContext; + if (CHECKS) { + check(__functionAddress); + check(value); + } + return callPI(value, __functionAddress); + } + + // --- [ GetThreadDpiAwarenessContext ] --- + + /** + * Gets the {@code DPI_AWARENESS_CONTEXT} for the current thread. + * + *

    If {@link #SetThreadDpiAwarenessContext} was never called for this thread, then the return value will equal the default {@code DPI_AWARENESS_CONTEXT} for the + * process.

    + * + * @return the current {@code DPI_AWARENESS_CONTEXT} for the thread. + * + * @since Windows 10 + */ + @NativeType("DPI_AWARENESS_CONTEXT") + public static long GetThreadDpiAwarenessContext() { + long __functionAddress = Functions.GetThreadDpiAwarenessContext; + if (CHECKS) { + check(__functionAddress); + } + return callP(__functionAddress); + } + + // --- [ GetWindowDpiAwarenessContext ] --- + + /** + * Returns the {@code DPI_AWARENESS_CONTEXT} associated with a window. + * + * @param hwnd the window to query + * + * @return the {@code DPI_AWARENESS_CONTEXT} for the provided window. If the window is not valid, the return value is {@code NULL}. + * + * @since Windows 10 + */ + @NativeType("DPI_AWARENESS_CONTEXT") + public static long GetWindowDpiAwarenessContext(@NativeType("HWND") long hwnd) { + long __functionAddress = Functions.GetWindowDpiAwarenessContext; + if (CHECKS) { + check(__functionAddress); + check(hwnd); + } + return callPP(hwnd, __functionAddress); + } + + // --- [ IsValidDpiAwarenessContext ] --- + + /** + * Determines if a specified {@code DPI_AWARENESS_CONTEXT} is valid and supported by the current system. + * + * @param value the context that you want to determine if it is supported + * + * @return {@link WinBase#TRUE} if the provided context is supported, otherwise {@link WinBase#FALSE} + * + * @since Windows 10 + */ + @NativeType("BOOL") + public static boolean IsValidDpiAwarenessContext(@NativeType("DPI_AWARENESS_CONTEXT") long value) { + long __functionAddress = Functions.IsValidDpiAwarenessContext; + if (CHECKS) { + check(__functionAddress); + } + return callPI(value, __functionAddress) != 0; + } + + // --- [ SetThreadDpiAwarenessContext ] --- + + /** + * Set the DPI awareness for the current thread to the provided value. + * + * @param dpiContext the DPI awareness value to set + * + * @return The old {@code DPI_AWARENESS_CONTEXT} for the thread. If the {@code dpiContext} is invalid, the thread will not be updated and the return value will be + * {@code NULL}. You can use this value to restore the old {@code DPI_AWARENESS_CONTEXT} after overriding it with a predefined value. + * + * @since Windows 10 + */ + @NativeType("DPI_AWARENESS_CONTEXT") + public static long SetThreadDpiAwarenessContext(@NativeType("DPI_AWARENESS_CONTEXT") long dpiContext) { + long __functionAddress = Functions.SetThreadDpiAwarenessContext; + if (CHECKS) { + check(__functionAddress); + check(dpiContext); + } + return callPP(dpiContext, __functionAddress); + } + + /** Array version of: {@link #IsTouchWindow} */ + @NativeType("BOOL") + public static boolean IsTouchWindow(@NativeType("HWND") long hWnd, @Nullable @NativeType("PULONG") int[] pulFlags) { + long __functionAddress = Functions.IsTouchWindow; + if (CHECKS) { + check(__functionAddress); + check(hWnd); + checkSafe(pulFlags, 1); + } + return callPPI(hWnd, pulFlags, __functionAddress) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WINDOWPLACEMENT.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WINDOWPLACEMENT.java new file mode 100644 index 000000000..97b90cbb3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WINDOWPLACEMENT.java @@ -0,0 +1,395 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains information about the placement of a window on the screen. + * + *

    Layout

    + * + *
    
    + * struct WINDOWPLACEMENT {
    + *     UINT {@link #length};
    + *     UINT {@link #flags};
    + *     UINT {@link #showCmd};
    + *     {@link POINT POINT} {@link #ptMinPosition};
    + *     {@link POINT POINT} {@link #ptMaxPosition};
    + *     {@link RECT RECT} {@link #rcNormalPosition};
    + * }
    + */ +public class WINDOWPLACEMENT extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + LENGTH, + FLAGS, + SHOWCMD, + PTMINPOSITION, + PTMAXPOSITION, + RCNORMALPOSITION; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(POINT.SIZEOF, POINT.ALIGNOF), + __member(POINT.SIZEOF, POINT.ALIGNOF), + __member(RECT.SIZEOF, RECT.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + LENGTH = layout.offsetof(0); + FLAGS = layout.offsetof(1); + SHOWCMD = layout.offsetof(2); + PTMINPOSITION = layout.offsetof(3); + PTMAXPOSITION = layout.offsetof(4); + RCNORMALPOSITION = layout.offsetof(5); + } + + protected WINDOWPLACEMENT(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected WINDOWPLACEMENT create(long address, @Nullable ByteBuffer container) { + return new WINDOWPLACEMENT(address, container); + } + + /** + * Creates a {@code WINDOWPLACEMENT} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public WINDOWPLACEMENT(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** + * the length of the structure, in bytes. Before calling the {@link User32#GetWindowPlacement} or {@link User32#SetWindowPlacement} functions, set this member to + * {@link #SIZEOF}. + */ + @NativeType("UINT") + public int length() { return nlength(address()); } + /** the flags that control the position of the minimized window and the method by which the window is restored. This member can be one or more of thefollowing values:
    {@link User32#WPF_SETMINPOSITION} {@link User32#WPF_RESTORETOMAXIMIZED} {@link User32#WPF_ASYNCWINDOWPLACEMENT} */ + @NativeType("UINT") + public int flags() { return nflags(address()); } + /** the current show state of the window */ + @NativeType("UINT") + public int showCmd() { return nshowCmd(address()); } + /** the coordinates of the window's upper-left corner when the window is minimized */ + public POINT ptMinPosition() { return nptMinPosition(address()); } + /** the coordinates of the window's upper-left corner when the window is maximized */ + public POINT ptMaxPosition() { return nptMaxPosition(address()); } + /** the window's coordinates when the window is in the restored position */ + public RECT rcNormalPosition() { return nrcNormalPosition(address()); } + + /** Sets the specified value to the {@link #length} field. */ + public WINDOWPLACEMENT length(@NativeType("UINT") int value) { nlength(address(), value); return this; } + /** Sets the specified value to the {@link #flags} field. */ + public WINDOWPLACEMENT flags(@NativeType("UINT") int value) { nflags(address(), value); return this; } + /** Sets the specified value to the {@link #showCmd} field. */ + public WINDOWPLACEMENT showCmd(@NativeType("UINT") int value) { nshowCmd(address(), value); return this; } + /** Copies the specified {@link POINT} to the {@link #ptMinPosition} field. */ + public WINDOWPLACEMENT ptMinPosition(POINT value) { nptMinPosition(address(), value); return this; } + /** Passes the {@link #ptMinPosition} field to the specified {@link java.util.function.Consumer Consumer}. */ + public WINDOWPLACEMENT ptMinPosition(java.util.function.Consumer consumer) { consumer.accept(ptMinPosition()); return this; } + /** Copies the specified {@link POINT} to the {@link #ptMaxPosition} field. */ + public WINDOWPLACEMENT ptMaxPosition(POINT value) { nptMaxPosition(address(), value); return this; } + /** Passes the {@link #ptMaxPosition} field to the specified {@link java.util.function.Consumer Consumer}. */ + public WINDOWPLACEMENT ptMaxPosition(java.util.function.Consumer consumer) { consumer.accept(ptMaxPosition()); return this; } + /** Copies the specified {@link RECT} to the {@link #rcNormalPosition} field. */ + public WINDOWPLACEMENT rcNormalPosition(RECT value) { nrcNormalPosition(address(), value); return this; } + /** Passes the {@link #rcNormalPosition} field to the specified {@link java.util.function.Consumer Consumer}. */ + public WINDOWPLACEMENT rcNormalPosition(java.util.function.Consumer consumer) { consumer.accept(rcNormalPosition()); return this; } + + /** Initializes this struct with the specified values. */ + public WINDOWPLACEMENT set( + int length, + int flags, + int showCmd, + POINT ptMinPosition, + POINT ptMaxPosition, + RECT rcNormalPosition + ) { + length(length); + flags(flags); + showCmd(showCmd); + ptMinPosition(ptMinPosition); + ptMaxPosition(ptMaxPosition); + rcNormalPosition(rcNormalPosition); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public WINDOWPLACEMENT set(WINDOWPLACEMENT src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code WINDOWPLACEMENT} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static WINDOWPLACEMENT malloc() { + return new WINDOWPLACEMENT(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code WINDOWPLACEMENT} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static WINDOWPLACEMENT calloc() { + return new WINDOWPLACEMENT(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code WINDOWPLACEMENT} instance allocated with {@link BufferUtils}. */ + public static WINDOWPLACEMENT create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new WINDOWPLACEMENT(memAddress(container), container); + } + + /** Returns a new {@code WINDOWPLACEMENT} instance for the specified memory address. */ + public static WINDOWPLACEMENT create(long address) { + return new WINDOWPLACEMENT(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static WINDOWPLACEMENT createSafe(long address) { + return address == NULL ? null : new WINDOWPLACEMENT(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static WINDOWPLACEMENT mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static WINDOWPLACEMENT callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static WINDOWPLACEMENT mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static WINDOWPLACEMENT callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code WINDOWPLACEMENT} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static WINDOWPLACEMENT malloc(MemoryStack stack) { + return new WINDOWPLACEMENT(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code WINDOWPLACEMENT} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static WINDOWPLACEMENT calloc(MemoryStack stack) { + return new WINDOWPLACEMENT(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #length}. */ + public static int nlength(long struct) { return UNSAFE.getInt(null, struct + WINDOWPLACEMENT.LENGTH); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + WINDOWPLACEMENT.FLAGS); } + /** Unsafe version of {@link #showCmd}. */ + public static int nshowCmd(long struct) { return UNSAFE.getInt(null, struct + WINDOWPLACEMENT.SHOWCMD); } + /** Unsafe version of {@link #ptMinPosition}. */ + public static POINT nptMinPosition(long struct) { return POINT.create(struct + WINDOWPLACEMENT.PTMINPOSITION); } + /** Unsafe version of {@link #ptMaxPosition}. */ + public static POINT nptMaxPosition(long struct) { return POINT.create(struct + WINDOWPLACEMENT.PTMAXPOSITION); } + /** Unsafe version of {@link #rcNormalPosition}. */ + public static RECT nrcNormalPosition(long struct) { return RECT.create(struct + WINDOWPLACEMENT.RCNORMALPOSITION); } + + /** Unsafe version of {@link #length(int) length}. */ + public static void nlength(long struct, int value) { UNSAFE.putInt(null, struct + WINDOWPLACEMENT.LENGTH, value); } + /** Unsafe version of {@link #flags(int) flags}. */ + public static void nflags(long struct, int value) { UNSAFE.putInt(null, struct + WINDOWPLACEMENT.FLAGS, value); } + /** Unsafe version of {@link #showCmd(int) showCmd}. */ + public static void nshowCmd(long struct, int value) { UNSAFE.putInt(null, struct + WINDOWPLACEMENT.SHOWCMD, value); } + /** Unsafe version of {@link #ptMinPosition(POINT) ptMinPosition}. */ + public static void nptMinPosition(long struct, POINT value) { memCopy(value.address(), struct + WINDOWPLACEMENT.PTMINPOSITION, POINT.SIZEOF); } + /** Unsafe version of {@link #ptMaxPosition(POINT) ptMaxPosition}. */ + public static void nptMaxPosition(long struct, POINT value) { memCopy(value.address(), struct + WINDOWPLACEMENT.PTMAXPOSITION, POINT.SIZEOF); } + /** Unsafe version of {@link #rcNormalPosition(RECT) rcNormalPosition}. */ + public static void nrcNormalPosition(long struct, RECT value) { memCopy(value.address(), struct + WINDOWPLACEMENT.RCNORMALPOSITION, RECT.SIZEOF); } + + // ----------------------------------- + + /** An array of {@link WINDOWPLACEMENT} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final WINDOWPLACEMENT ELEMENT_FACTORY = WINDOWPLACEMENT.create(-1L); + + /** + * Creates a new {@code WINDOWPLACEMENT.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link WINDOWPLACEMENT#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected WINDOWPLACEMENT getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link WINDOWPLACEMENT#length} field. */ + @NativeType("UINT") + public int length() { return WINDOWPLACEMENT.nlength(address()); } + /** @return the value of the {@link WINDOWPLACEMENT#flags} field. */ + @NativeType("UINT") + public int flags() { return WINDOWPLACEMENT.nflags(address()); } + /** @return the value of the {@link WINDOWPLACEMENT#showCmd} field. */ + @NativeType("UINT") + public int showCmd() { return WINDOWPLACEMENT.nshowCmd(address()); } + /** @return a {@link POINT} view of the {@link WINDOWPLACEMENT#ptMinPosition} field. */ + public POINT ptMinPosition() { return WINDOWPLACEMENT.nptMinPosition(address()); } + /** @return a {@link POINT} view of the {@link WINDOWPLACEMENT#ptMaxPosition} field. */ + public POINT ptMaxPosition() { return WINDOWPLACEMENT.nptMaxPosition(address()); } + /** @return a {@link RECT} view of the {@link WINDOWPLACEMENT#rcNormalPosition} field. */ + public RECT rcNormalPosition() { return WINDOWPLACEMENT.nrcNormalPosition(address()); } + + /** Sets the specified value to the {@link WINDOWPLACEMENT#length} field. */ + public Buffer length(@NativeType("UINT") int value) { WINDOWPLACEMENT.nlength(address(), value); return this; } + /** Sets the specified value to the {@link WINDOWPLACEMENT#flags} field. */ + public Buffer flags(@NativeType("UINT") int value) { WINDOWPLACEMENT.nflags(address(), value); return this; } + /** Sets the specified value to the {@link WINDOWPLACEMENT#showCmd} field. */ + public Buffer showCmd(@NativeType("UINT") int value) { WINDOWPLACEMENT.nshowCmd(address(), value); return this; } + /** Copies the specified {@link POINT} to the {@link WINDOWPLACEMENT#ptMinPosition} field. */ + public Buffer ptMinPosition(POINT value) { WINDOWPLACEMENT.nptMinPosition(address(), value); return this; } + /** Passes the {@link WINDOWPLACEMENT#ptMinPosition} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer ptMinPosition(java.util.function.Consumer consumer) { consumer.accept(ptMinPosition()); return this; } + /** Copies the specified {@link POINT} to the {@link WINDOWPLACEMENT#ptMaxPosition} field. */ + public Buffer ptMaxPosition(POINT value) { WINDOWPLACEMENT.nptMaxPosition(address(), value); return this; } + /** Passes the {@link WINDOWPLACEMENT#ptMaxPosition} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer ptMaxPosition(java.util.function.Consumer consumer) { consumer.accept(ptMaxPosition()); return this; } + /** Copies the specified {@link RECT} to the {@link WINDOWPLACEMENT#rcNormalPosition} field. */ + public Buffer rcNormalPosition(RECT value) { WINDOWPLACEMENT.nrcNormalPosition(address(), value); return this; } + /** Passes the {@link WINDOWPLACEMENT#rcNormalPosition} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer rcNormalPosition(java.util.function.Consumer consumer) { consumer.accept(rcNormalPosition()); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WNDCLASSEX.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WNDCLASSEX.java new file mode 100644 index 000000000..0e25349ca --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WNDCLASSEX.java @@ -0,0 +1,554 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Contains the window class attributes that are registered by the {@link User32#RegisterClassEx} function. + * + *

    Layout

    + * + *
    
    + * struct WNDCLASSEX {
    + *     UINT {@link #cbSize};
    + *     UINT {@link #style};
    + *     {@link WindowProcI WNDPROC} {@link #lpfnWndProc};
    + *     int {@link #cbClsExtra};
    + *     int {@link #cbWndExtra};
    + *     HINSTANCE {@link #hInstance};
    + *     HICON {@link #hIcon};
    + *     HCURSOR {@link #hCursor};
    + *     HBRUSH {@link #hbrBackground};
    + *     LPCTSTR {@link #lpszMenuName};
    + *     LPCTSTR {@link #lpszClassName};
    + *     HICON {@link #hIconSm};
    + * }
    + */ +public class WNDCLASSEX extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + CBSIZE, + STYLE, + LPFNWNDPROC, + CBCLSEXTRA, + CBWNDEXTRA, + HINSTANCE, + HICON, + HCURSOR, + HBRBACKGROUND, + LPSZMENUNAME, + LPSZCLASSNAME, + HICONSM; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + CBSIZE = layout.offsetof(0); + STYLE = layout.offsetof(1); + LPFNWNDPROC = layout.offsetof(2); + CBCLSEXTRA = layout.offsetof(3); + CBWNDEXTRA = layout.offsetof(4); + HINSTANCE = layout.offsetof(5); + HICON = layout.offsetof(6); + HCURSOR = layout.offsetof(7); + HBRBACKGROUND = layout.offsetof(8); + LPSZMENUNAME = layout.offsetof(9); + LPSZCLASSNAME = layout.offsetof(10); + HICONSM = layout.offsetof(11); + } + + protected WNDCLASSEX(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected WNDCLASSEX create(long address, @Nullable ByteBuffer container) { + return new WNDCLASSEX(address, container); + } + + /** + * Creates a {@code WNDCLASSEX} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public WNDCLASSEX(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the size, in bytes, of this structure */ + @NativeType("UINT") + public int cbSize() { return ncbSize(address()); } + /** the class style(s) */ + @NativeType("UINT") + public int style() { return nstyle(address()); } + /** a pointer to the window procedure */ + @NativeType("WNDPROC") + public WindowProc lpfnWndProc() { return nlpfnWndProc(address()); } + /** the number of extra bytes to allocate following the window-class structure. The system initializes the bytes to zero. */ + public int cbClsExtra() { return ncbClsExtra(address()); } + /** the number of extra bytes to allocate following the window instance. The system initializes the bytes to zero. */ + public int cbWndExtra() { return ncbWndExtra(address()); } + /** a handle to the instance that contains the window procedure for the class */ + @NativeType("HINSTANCE") + public long hInstance() { return nhInstance(address()); } + /** a handle to the class icon. This member must be a handle to an icon resource. If this member is {@code NULL}, the system provides a default icon. */ + @NativeType("HICON") + public long hIcon() { return nhIcon(address()); } + /** + * a handle to the class cursor. This member must be a handle to a cursor resource. If this member is {@code NULL}, an application must explicitly set the cursor + * shape whenever the mouse moves into the application's window. + */ + @NativeType("HCURSOR") + public long hCursor() { return nhCursor(address()); } + /** + * a handle to the class background brush. This member can be a handle to the brush to be used for painting the background, or it can be a color value. + * When this member is {@code NULL}, an application must paint its own background whenever it is requested to paint in its client area. + */ + @NativeType("HBRUSH") + public long hbrBackground() { return nhbrBackground(address()); } + /** + * pointer to a null-terminated character string that specifies the resource name of the class menu, as the name appears in the resource file. If this + * member is {@code NULL}, windows belonging to this class have no default menu. + */ + @Nullable + @NativeType("LPCTSTR") + public ByteBuffer lpszMenuName() { return nlpszMenuName(address()); } + /** + * pointer to a null-terminated character string that specifies the resource name of the class menu, as the name appears in the resource file. If this + * member is {@code NULL}, windows belonging to this class have no default menu. + */ + @Nullable + @NativeType("LPCTSTR") + public String lpszMenuNameString() { return nlpszMenuNameString(address()); } + /** a pointer to a null-terminated string or is an atom */ + @NativeType("LPCTSTR") + public ByteBuffer lpszClassName() { return nlpszClassName(address()); } + /** a pointer to a null-terminated string or is an atom */ + @NativeType("LPCTSTR") + public String lpszClassNameString() { return nlpszClassNameString(address()); } + /** + * a handle to a small icon that is associated with the window class. If this member is {@code NULL}, the system searches the icon resource specified by the + * {@code hIcon} member for an icon of the appropriate size to use as the small icon. + */ + @NativeType("HICON") + public long hIconSm() { return nhIconSm(address()); } + + /** Sets the specified value to the {@link #cbSize} field. */ + public WNDCLASSEX cbSize(@NativeType("UINT") int value) { ncbSize(address(), value); return this; } + /** Sets the specified value to the {@link #style} field. */ + public WNDCLASSEX style(@NativeType("UINT") int value) { nstyle(address(), value); return this; } + /** Sets the specified value to the {@link #lpfnWndProc} field. */ + public WNDCLASSEX lpfnWndProc(@NativeType("WNDPROC") WindowProcI value) { nlpfnWndProc(address(), value); return this; } + /** Sets the specified value to the {@link #cbClsExtra} field. */ + public WNDCLASSEX cbClsExtra(int value) { ncbClsExtra(address(), value); return this; } + /** Sets the specified value to the {@link #cbWndExtra} field. */ + public WNDCLASSEX cbWndExtra(int value) { ncbWndExtra(address(), value); return this; } + /** Sets the specified value to the {@link #hInstance} field. */ + public WNDCLASSEX hInstance(@NativeType("HINSTANCE") long value) { nhInstance(address(), value); return this; } + /** Sets the specified value to the {@link #hIcon} field. */ + public WNDCLASSEX hIcon(@NativeType("HICON") long value) { nhIcon(address(), value); return this; } + /** Sets the specified value to the {@link #hCursor} field. */ + public WNDCLASSEX hCursor(@NativeType("HCURSOR") long value) { nhCursor(address(), value); return this; } + /** Sets the specified value to the {@link #hbrBackground} field. */ + public WNDCLASSEX hbrBackground(@NativeType("HBRUSH") long value) { nhbrBackground(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@link #lpszMenuName} field. */ + public WNDCLASSEX lpszMenuName(@Nullable @NativeType("LPCTSTR") ByteBuffer value) { nlpszMenuName(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@link #lpszClassName} field. */ + public WNDCLASSEX lpszClassName(@NativeType("LPCTSTR") ByteBuffer value) { nlpszClassName(address(), value); return this; } + /** Sets the specified value to the {@link #hIconSm} field. */ + public WNDCLASSEX hIconSm(@NativeType("HICON") long value) { nhIconSm(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public WNDCLASSEX set( + int cbSize, + int style, + WindowProcI lpfnWndProc, + int cbClsExtra, + int cbWndExtra, + long hInstance, + long hIcon, + long hCursor, + long hbrBackground, + @Nullable ByteBuffer lpszMenuName, + ByteBuffer lpszClassName, + long hIconSm + ) { + cbSize(cbSize); + style(style); + lpfnWndProc(lpfnWndProc); + cbClsExtra(cbClsExtra); + cbWndExtra(cbWndExtra); + hInstance(hInstance); + hIcon(hIcon); + hCursor(hCursor); + hbrBackground(hbrBackground); + lpszMenuName(lpszMenuName); + lpszClassName(lpszClassName); + hIconSm(hIconSm); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public WNDCLASSEX set(WNDCLASSEX src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code WNDCLASSEX} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static WNDCLASSEX malloc() { + return new WNDCLASSEX(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code WNDCLASSEX} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static WNDCLASSEX calloc() { + return new WNDCLASSEX(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code WNDCLASSEX} instance allocated with {@link BufferUtils}. */ + public static WNDCLASSEX create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new WNDCLASSEX(memAddress(container), container); + } + + /** Returns a new {@code WNDCLASSEX} instance for the specified memory address. */ + public static WNDCLASSEX create(long address) { + return new WNDCLASSEX(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static WNDCLASSEX createSafe(long address) { + return address == NULL ? null : new WNDCLASSEX(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static WNDCLASSEX mallocStack() { return malloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static WNDCLASSEX callocStack() { return calloc(stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(MemoryStack)} instead. */ + @Deprecated public static WNDCLASSEX mallocStack(MemoryStack stack) { return malloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(MemoryStack)} instead. */ + @Deprecated public static WNDCLASSEX callocStack(MemoryStack stack) { return calloc(stack); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity) { return malloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity) { return calloc(capacity, stackGet()); } + /** Deprecated for removal in 3.4.0. Use {@link #malloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer mallocStack(int capacity, MemoryStack stack) { return malloc(capacity, stack); } + /** Deprecated for removal in 3.4.0. Use {@link #calloc(int, MemoryStack)} instead. */ + @Deprecated public static Buffer callocStack(int capacity, MemoryStack stack) { return calloc(capacity, stack); } + + /** + * Returns a new {@code WNDCLASSEX} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static WNDCLASSEX malloc(MemoryStack stack) { + return new WNDCLASSEX(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code WNDCLASSEX} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static WNDCLASSEX calloc(MemoryStack stack) { + return new WNDCLASSEX(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #cbSize}. */ + public static int ncbSize(long struct) { return UNSAFE.getInt(null, struct + WNDCLASSEX.CBSIZE); } + /** Unsafe version of {@link #style}. */ + public static int nstyle(long struct) { return UNSAFE.getInt(null, struct + WNDCLASSEX.STYLE); } + /** Unsafe version of {@link #lpfnWndProc}. */ + public static WindowProc nlpfnWndProc(long struct) { return WindowProc.create(memGetAddress(struct + WNDCLASSEX.LPFNWNDPROC)); } + /** Unsafe version of {@link #cbClsExtra}. */ + public static int ncbClsExtra(long struct) { return UNSAFE.getInt(null, struct + WNDCLASSEX.CBCLSEXTRA); } + /** Unsafe version of {@link #cbWndExtra}. */ + public static int ncbWndExtra(long struct) { return UNSAFE.getInt(null, struct + WNDCLASSEX.CBWNDEXTRA); } + /** Unsafe version of {@link #hInstance}. */ + public static long nhInstance(long struct) { return memGetAddress(struct + WNDCLASSEX.HINSTANCE); } + /** Unsafe version of {@link #hIcon}. */ + public static long nhIcon(long struct) { return memGetAddress(struct + WNDCLASSEX.HICON); } + /** Unsafe version of {@link #hCursor}. */ + public static long nhCursor(long struct) { return memGetAddress(struct + WNDCLASSEX.HCURSOR); } + /** Unsafe version of {@link #hbrBackground}. */ + public static long nhbrBackground(long struct) { return memGetAddress(struct + WNDCLASSEX.HBRBACKGROUND); } + /** Unsafe version of {@link #lpszMenuName}. */ + @Nullable public static ByteBuffer nlpszMenuName(long struct) { return memByteBufferNT2Safe(memGetAddress(struct + WNDCLASSEX.LPSZMENUNAME)); } + /** Unsafe version of {@link #lpszMenuNameString}. */ + @Nullable public static String nlpszMenuNameString(long struct) { return memUTF16Safe(memGetAddress(struct + WNDCLASSEX.LPSZMENUNAME)); } + /** Unsafe version of {@link #lpszClassName}. */ + public static ByteBuffer nlpszClassName(long struct) { return memByteBufferNT2(memGetAddress(struct + WNDCLASSEX.LPSZCLASSNAME)); } + /** Unsafe version of {@link #lpszClassNameString}. */ + public static String nlpszClassNameString(long struct) { return memUTF16(memGetAddress(struct + WNDCLASSEX.LPSZCLASSNAME)); } + /** Unsafe version of {@link #hIconSm}. */ + public static long nhIconSm(long struct) { return memGetAddress(struct + WNDCLASSEX.HICONSM); } + + /** Unsafe version of {@link #cbSize(int) cbSize}. */ + public static void ncbSize(long struct, int value) { UNSAFE.putInt(null, struct + WNDCLASSEX.CBSIZE, value); } + /** Unsafe version of {@link #style(int) style}. */ + public static void nstyle(long struct, int value) { UNSAFE.putInt(null, struct + WNDCLASSEX.STYLE, value); } + /** Unsafe version of {@link #lpfnWndProc(WindowProcI) lpfnWndProc}. */ + public static void nlpfnWndProc(long struct, WindowProcI value) { memPutAddress(struct + WNDCLASSEX.LPFNWNDPROC, value.address()); } + /** Unsafe version of {@link #cbClsExtra(int) cbClsExtra}. */ + public static void ncbClsExtra(long struct, int value) { UNSAFE.putInt(null, struct + WNDCLASSEX.CBCLSEXTRA, value); } + /** Unsafe version of {@link #cbWndExtra(int) cbWndExtra}. */ + public static void ncbWndExtra(long struct, int value) { UNSAFE.putInt(null, struct + WNDCLASSEX.CBWNDEXTRA, value); } + /** Unsafe version of {@link #hInstance(long) hInstance}. */ + public static void nhInstance(long struct, long value) { memPutAddress(struct + WNDCLASSEX.HINSTANCE, value); } + /** Unsafe version of {@link #hIcon(long) hIcon}. */ + public static void nhIcon(long struct, long value) { memPutAddress(struct + WNDCLASSEX.HICON, value); } + /** Unsafe version of {@link #hCursor(long) hCursor}. */ + public static void nhCursor(long struct, long value) { memPutAddress(struct + WNDCLASSEX.HCURSOR, value); } + /** Unsafe version of {@link #hbrBackground(long) hbrBackground}. */ + public static void nhbrBackground(long struct, long value) { memPutAddress(struct + WNDCLASSEX.HBRBACKGROUND, value); } + /** Unsafe version of {@link #lpszMenuName(ByteBuffer) lpszMenuName}. */ + public static void nlpszMenuName(long struct, @Nullable ByteBuffer value) { + if (CHECKS) { checkNT2Safe(value); } + memPutAddress(struct + WNDCLASSEX.LPSZMENUNAME, memAddressSafe(value)); + } + /** Unsafe version of {@link #lpszClassName(ByteBuffer) lpszClassName}. */ + public static void nlpszClassName(long struct, ByteBuffer value) { + if (CHECKS) { checkNT2(value); } + memPutAddress(struct + WNDCLASSEX.LPSZCLASSNAME, memAddress(value)); + } + /** Unsafe version of {@link #hIconSm(long) hIconSm}. */ + public static void nhIconSm(long struct, long value) { memPutAddress(struct + WNDCLASSEX.HICONSM, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + WNDCLASSEX.LPFNWNDPROC)); + check(memGetAddress(struct + WNDCLASSEX.LPSZCLASSNAME)); + } + + // ----------------------------------- + + /** An array of {@link WNDCLASSEX} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final WNDCLASSEX ELEMENT_FACTORY = WNDCLASSEX.create(-1L); + + /** + * Creates a new {@code WNDCLASSEX.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link WNDCLASSEX#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected WNDCLASSEX getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link WNDCLASSEX#cbSize} field. */ + @NativeType("UINT") + public int cbSize() { return WNDCLASSEX.ncbSize(address()); } + /** @return the value of the {@link WNDCLASSEX#style} field. */ + @NativeType("UINT") + public int style() { return WNDCLASSEX.nstyle(address()); } + /** @return the value of the {@link WNDCLASSEX#lpfnWndProc} field. */ + @NativeType("WNDPROC") + public WindowProc lpfnWndProc() { return WNDCLASSEX.nlpfnWndProc(address()); } + /** @return the value of the {@link WNDCLASSEX#cbClsExtra} field. */ + public int cbClsExtra() { return WNDCLASSEX.ncbClsExtra(address()); } + /** @return the value of the {@link WNDCLASSEX#cbWndExtra} field. */ + public int cbWndExtra() { return WNDCLASSEX.ncbWndExtra(address()); } + /** @return the value of the {@link WNDCLASSEX#hInstance} field. */ + @NativeType("HINSTANCE") + public long hInstance() { return WNDCLASSEX.nhInstance(address()); } + /** @return the value of the {@link WNDCLASSEX#hIcon} field. */ + @NativeType("HICON") + public long hIcon() { return WNDCLASSEX.nhIcon(address()); } + /** @return the value of the {@link WNDCLASSEX#hCursor} field. */ + @NativeType("HCURSOR") + public long hCursor() { return WNDCLASSEX.nhCursor(address()); } + /** @return the value of the {@link WNDCLASSEX#hbrBackground} field. */ + @NativeType("HBRUSH") + public long hbrBackground() { return WNDCLASSEX.nhbrBackground(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@link WNDCLASSEX#lpszMenuName} field. */ + @Nullable + @NativeType("LPCTSTR") + public ByteBuffer lpszMenuName() { return WNDCLASSEX.nlpszMenuName(address()); } + /** @return the null-terminated string pointed to by the {@link WNDCLASSEX#lpszMenuName} field. */ + @Nullable + @NativeType("LPCTSTR") + public String lpszMenuNameString() { return WNDCLASSEX.nlpszMenuNameString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@link WNDCLASSEX#lpszClassName} field. */ + @NativeType("LPCTSTR") + public ByteBuffer lpszClassName() { return WNDCLASSEX.nlpszClassName(address()); } + /** @return the null-terminated string pointed to by the {@link WNDCLASSEX#lpszClassName} field. */ + @NativeType("LPCTSTR") + public String lpszClassNameString() { return WNDCLASSEX.nlpszClassNameString(address()); } + /** @return the value of the {@link WNDCLASSEX#hIconSm} field. */ + @NativeType("HICON") + public long hIconSm() { return WNDCLASSEX.nhIconSm(address()); } + + /** Sets the specified value to the {@link WNDCLASSEX#cbSize} field. */ + public Buffer cbSize(@NativeType("UINT") int value) { WNDCLASSEX.ncbSize(address(), value); return this; } + /** Sets the specified value to the {@link WNDCLASSEX#style} field. */ + public Buffer style(@NativeType("UINT") int value) { WNDCLASSEX.nstyle(address(), value); return this; } + /** Sets the specified value to the {@link WNDCLASSEX#lpfnWndProc} field. */ + public Buffer lpfnWndProc(@NativeType("WNDPROC") WindowProcI value) { WNDCLASSEX.nlpfnWndProc(address(), value); return this; } + /** Sets the specified value to the {@link WNDCLASSEX#cbClsExtra} field. */ + public Buffer cbClsExtra(int value) { WNDCLASSEX.ncbClsExtra(address(), value); return this; } + /** Sets the specified value to the {@link WNDCLASSEX#cbWndExtra} field. */ + public Buffer cbWndExtra(int value) { WNDCLASSEX.ncbWndExtra(address(), value); return this; } + /** Sets the specified value to the {@link WNDCLASSEX#hInstance} field. */ + public Buffer hInstance(@NativeType("HINSTANCE") long value) { WNDCLASSEX.nhInstance(address(), value); return this; } + /** Sets the specified value to the {@link WNDCLASSEX#hIcon} field. */ + public Buffer hIcon(@NativeType("HICON") long value) { WNDCLASSEX.nhIcon(address(), value); return this; } + /** Sets the specified value to the {@link WNDCLASSEX#hCursor} field. */ + public Buffer hCursor(@NativeType("HCURSOR") long value) { WNDCLASSEX.nhCursor(address(), value); return this; } + /** Sets the specified value to the {@link WNDCLASSEX#hbrBackground} field. */ + public Buffer hbrBackground(@NativeType("HBRUSH") long value) { WNDCLASSEX.nhbrBackground(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@link WNDCLASSEX#lpszMenuName} field. */ + public Buffer lpszMenuName(@Nullable @NativeType("LPCTSTR") ByteBuffer value) { WNDCLASSEX.nlpszMenuName(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@link WNDCLASSEX#lpszClassName} field. */ + public Buffer lpszClassName(@NativeType("LPCTSTR") ByteBuffer value) { WNDCLASSEX.nlpszClassName(address(), value); return this; } + /** Sets the specified value to the {@link WNDCLASSEX#hIconSm} field. */ + public Buffer hIconSm(@NativeType("HICON") long value) { WNDCLASSEX.nhIconSm(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WinBase.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WinBase.java new file mode 100644 index 000000000..b6a7bab1b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WinBase.java @@ -0,0 +1,311 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** Native bindings to WinBase.h. */ +public class WinBase { + + static { Library.initialize(); } + + /** BOOL return values. */ + public static final int + FALSE = 0, + TRUE = 1; + + protected WinBase() { + throw new UnsupportedOperationException(); + } + + // --- [ LocalFree ] --- + + /** Unsafe version of: {@link #LocalFree} */ + public static native long nLocalFree(long hMem); + + /** + * Frees the specified local memory object and invalidates its handle. + * + * @param hMem a handle to the local memory object + * + * @return if the function succeeds, the return value is {@code NULL}. + * + *

    If the function fails, the return value is equal to a handle to the local memory object. To get extended error information, call {@link #GetLastError}.

    + */ + @NativeType("HLOCAL") + public static long LocalFree(@NativeType("HLOCAL") long hMem) { + if (CHECKS) { + check(hMem); + } + return nLocalFree(hMem); + } + + // --- [ GetLastError ] --- + + /** + * Retrieves the calling thread's last-error code value. The last-error code is maintained on a per-thread basis. Multiple threads do not overwrite each + * other's last-error code. + * + *

    LWJGL note: This function cannot be used after another JNI call to a Windows function, because the last error resets before that call returns. + * For this reason, LWJGL stores the last error in thread-local storage, you can use {@link #getLastError} to access it.

    + */ + @NativeType("DWORD") + public static native int GetLastError(); + + // --- [ getLastError ] --- + + /** + * Retrieves the calling thread's last-error code value. The last-error code is maintained on a per-thread basis. Multiple threads do not overwrite each + * other's last-error code. + * + *

    LWJGL note: This method has a meaningful value only after another LWJGL JNI call. It does not call {@code GetLastError()} from WinBase.h, it + * returns the thread-local error code stored by a previous JNI call.

    + */ + @NativeType("DWORD") + public static native int getLastError(); + + // --- [ GetModuleHandle ] --- + + /** Unsafe version of: {@link #GetModuleHandle} */ + public static native long nGetModuleHandle(long moduleName); + + /** + * Retrieves a module handle for the specified module. The module must have been loaded by the calling process. + * + * @param moduleName the name of the loaded module (either a .dll or .exe file). If the file name extension is omitted, the default library extension .dll is appended. + * The file name string can include a trailing point character (.) to indicate that the module name has no extension. The string does not have to + * specify a path. When specifying a path, be sure to use backslashes (\), not forward slashes (/). The name is compared (case independently) to the + * names of modules currently mapped into the address space of the calling process. + * + *

    If this parameter is {@code NULL}, {@code GetModuleHandle} returns a handle to the file used to create the calling process (.exe file).

    + */ + @NativeType("HMODULE") + public static long GetModuleHandle(@Nullable @NativeType("LPCTSTR") ByteBuffer moduleName) { + if (CHECKS) { + checkNT2Safe(moduleName); + } + return nGetModuleHandle(memAddressSafe(moduleName)); + } + + /** + * Retrieves a module handle for the specified module. The module must have been loaded by the calling process. + * + * @param moduleName the name of the loaded module (either a .dll or .exe file). If the file name extension is omitted, the default library extension .dll is appended. + * The file name string can include a trailing point character (.) to indicate that the module name has no extension. The string does not have to + * specify a path. When specifying a path, be sure to use backslashes (\), not forward slashes (/). The name is compared (case independently) to the + * names of modules currently mapped into the address space of the calling process. + * + *

    If this parameter is {@code NULL}, {@code GetModuleHandle} returns a handle to the file used to create the calling process (.exe file).

    + */ + @NativeType("HMODULE") + public static long GetModuleHandle(@Nullable @NativeType("LPCTSTR") CharSequence moduleName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF16Safe(moduleName, true); + long moduleNameEncoded = moduleName == null ? NULL : stack.getPointerAddress(); + return nGetModuleHandle(moduleNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ GetModuleFileName ] --- + + /** + * Unsafe version of: {@link #GetModuleFileName} + * + * @param nSize the size of the {@code lpFilename} buffer, in {@code TCHAR}s. + */ + public static native int nGetModuleFileName(long hModule, long lpFilename, int nSize); + + /** + * Retrieves the fully qualified path for the file that contains the specified module. The module must have been loaded by the current process. + * + * @param hModule a handle to the loaded module whose path is being requested. + * + *

    If this parameter is NULL, {@code GetModuleFileName} retrieves the path of the executable file of the current process.

    + * @param lpFilename a pointer to a buffer that receives the fully qualified path of the module. + * + *

    If the length of the path is less than the size that the {@code nSize} parameter specifies, the function succeeds and the path is returned as a + * null-terminated string.

    + * + *

    If the length of the path exceeds the size that the {@code nSize} parameter specifies, the function succeeds and the string is truncated to + * {@code nSize} characters including the terminating null character.

    + * + *

    The string returned will use the same format that was specified when the module was loaded. Therefore, the path can be a long or short file name, + * and can use the prefix "\?".

    + * + * @return if the function succeeds, the return value is the length of the string that is copied to the buffer, in characters, not including the terminating null + * character. + * + *

    If the buffer is too small to hold the module name, the string is truncated to {@code nSize} characters including the terminating null character, the + * function returns {@code nSize}, and the function sets the last error to {@code ERROR_INSUFFICIENT_BUFFER}.

    + * + *

    If the function fails, the return value is 0 (zero). To get extended error information, call {@link #GetLastError}.

    + */ + @NativeType("DWORD") + public static int GetModuleFileName(@NativeType("HMODULE") long hModule, @NativeType("LPTSTR") ByteBuffer lpFilename) { + return nGetModuleFileName(hModule, memAddress(lpFilename), lpFilename.remaining() >> 1); + } + + /** + * Retrieves the fully qualified path for the file that contains the specified module. The module must have been loaded by the current process. + * + * @param hModule a handle to the loaded module whose path is being requested. + * + *

    If this parameter is NULL, {@code GetModuleFileName} retrieves the path of the executable file of the current process.

    + * @param nSize the size of the {@code lpFilename} buffer, in {@code TCHAR}s. + * + * @return if the function succeeds, the return value is the length of the string that is copied to the buffer, in characters, not including the terminating null + * character. + * + *

    If the buffer is too small to hold the module name, the string is truncated to {@code nSize} characters including the terminating null character, the + * function returns {@code nSize}, and the function sets the last error to {@code ERROR_INSUFFICIENT_BUFFER}.

    + * + *

    If the function fails, the return value is 0 (zero). To get extended error information, call {@link #GetLastError}.

    + */ + @NativeType("DWORD") + public static String GetModuleFileName(@NativeType("HMODULE") long hModule, @NativeType("DWORD") int nSize) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + ByteBuffer lpFilename = stack.malloc(nSize); + int __result = nGetModuleFileName(hModule, memAddress(lpFilename), nSize); + return memUTF16(lpFilename, __result); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ LoadLibrary ] --- + + /** Unsafe version of: {@link #LoadLibrary} */ + public static native long nLoadLibrary(long name); + + /** + * Loads the specified module into the address space of the calling process. The specified module may cause other modules to be loaded. + * + * @param name the name of the module. This can be either a library module (a .dll file) or an executable module (an .exe file). The name specified is the file + * name of the module and is not related to the name stored in the library module itself, as specified by the LIBRARY keyword in the module-definition + * (.def) file. + * + *

    If the string specifies a full path, the function searches only that path for the module.

    + * + *

    If the string specifies a relative path or a module name without a path, the function uses a standard search strategy to find the module.

    + * + *

    If the function cannot find the module, the function fails. When specifying a path, be sure to use backslashes (\), not forward slashes (/).

    + * + *

    If the string specifies a module name without a path and the file name extension is omitted, the function appends the default library extension + * .dll to the module name. To prevent the function from appending .dll to the module name, include a trailing point character (.) in the module name + * string.

    + */ + @NativeType("HMODULE") + public static long LoadLibrary(@NativeType("LPCTSTR") ByteBuffer name) { + if (CHECKS) { + checkNT2(name); + } + return nLoadLibrary(memAddress(name)); + } + + /** + * Loads the specified module into the address space of the calling process. The specified module may cause other modules to be loaded. + * + * @param name the name of the module. This can be either a library module (a .dll file) or an executable module (an .exe file). The name specified is the file + * name of the module and is not related to the name stored in the library module itself, as specified by the LIBRARY keyword in the module-definition + * (.def) file. + * + *

    If the string specifies a full path, the function searches only that path for the module.

    + * + *

    If the string specifies a relative path or a module name without a path, the function uses a standard search strategy to find the module.

    + * + *

    If the function cannot find the module, the function fails. When specifying a path, be sure to use backslashes (\), not forward slashes (/).

    + * + *

    If the string specifies a module name without a path and the file name extension is omitted, the function appends the default library extension + * .dll to the module name. To prevent the function from appending .dll to the module name, include a trailing point character (.) in the module name + * string.

    + */ + @NativeType("HMODULE") + public static long LoadLibrary(@NativeType("LPCTSTR") CharSequence name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF16(name, true); + long nameEncoded = stack.getPointerAddress(); + return nLoadLibrary(nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ GetProcAddress ] --- + + /** Unsafe version of: {@link #GetProcAddress} */ + public static native long nGetProcAddress(long handle, long name); + + /** + * Retrieves the address of an exported function or variable from the specified dynamic-link library (DLL). + * + * @param handle a handle to the DLL module that contains the function or variable + * @param name the function or variable name, or the function's ordinal value. If this parameter is an ordinal value, it must be in the low-order word; the + * high-order word must be zero. + */ + @NativeType("FARPROC") + public static long GetProcAddress(@NativeType("HMODULE") long handle, @NativeType("LPCSTR") ByteBuffer name) { + if (CHECKS) { + check(handle); + checkNT1(name); + } + return nGetProcAddress(handle, memAddress(name)); + } + + /** + * Retrieves the address of an exported function or variable from the specified dynamic-link library (DLL). + * + * @param handle a handle to the DLL module that contains the function or variable + * @param name the function or variable name, or the function's ordinal value. If this parameter is an ordinal value, it must be in the low-order word; the + * high-order word must be zero. + */ + @NativeType("FARPROC") + public static long GetProcAddress(@NativeType("HMODULE") long handle, @NativeType("LPCSTR") CharSequence name) { + if (CHECKS) { + check(handle); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(name, true); + long nameEncoded = stack.getPointerAddress(); + return nGetProcAddress(handle, nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ FreeLibrary ] --- + + /** Unsafe version of: {@link #FreeLibrary} */ + public static native int nFreeLibrary(long handle); + + /** + * Frees the loaded dynamic-link library (DLL) module and, if necessary, decrements its reference count. When the reference count reaches zero, the module + * is unloaded from the address space of the calling process and the handle is no longer valid. + * + * @param handle a handle to the loaded library module + */ + @NativeType("BOOL") + public static boolean FreeLibrary(@NativeType("HMODULE") long handle) { + if (CHECKS) { + check(handle); + } + return nFreeLibrary(handle) != 0; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowProc.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowProc.java new file mode 100644 index 000000000..c5e5d3c94 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowProc.java @@ -0,0 +1,78 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * An application-defined function that processes messages sent to a window. + * + *

    Type

    + * + *
    
    + * LRESULT (*{@link #invoke}) (
    + *     HWND hwnd,
    + *     UINT uMsg,
    + *     WPARAM wParam,
    + *     LPARAM lParam
    + * )
    + */ +public abstract class WindowProc extends Callback implements WindowProcI { + + /** + * Creates a {@code WindowProc} instance from the specified function pointer. + * + * @return the new {@code WindowProc} + */ + public static WindowProc create(long functionPointer) { + WindowProcI instance = Callback.get(functionPointer); + return instance instanceof WindowProc + ? (WindowProc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static WindowProc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code WindowProc} instance that delegates to the specified {@code WindowProcI} instance. */ + public static WindowProc create(WindowProcI instance) { + return instance instanceof WindowProc + ? (WindowProc)instance + : new Container(instance.address(), instance); + } + + protected WindowProc() { + super(CIF); + } + + WindowProc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends WindowProc { + + private final WindowProcI delegate; + + Container(long functionPointer, WindowProcI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public long invoke(long hwnd, int uMsg, long wParam, long lParam) { + return delegate.invoke(hwnd, uMsg, wParam, lParam); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowProcI.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowProcI.java new file mode 100644 index 000000000..ab7c37c16 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowProcI.java @@ -0,0 +1,62 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.system.windows; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + * An application-defined function that processes messages sent to a window. + * + *

    Type

    + * + *
    
    + * LRESULT (*{@link #invoke}) (
    + *     HWND hwnd,
    + *     UINT uMsg,
    + *     WPARAM wParam,
    + *     LPARAM lParam
    + * )
    + */ +@FunctionalInterface +@NativeType("WNDPROC") +public interface WindowProcI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + apiStdcall(), + ffi_type_pointer, + ffi_type_pointer, ffi_type_uint32, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + long __result = invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)) + ); + apiClosureRetP(ret, __result); + } + + /** + * Will be called for each message sent to the window. + * + * @param hwnd a handle to the window procedure that received the message + * @param uMsg the message + * @param wParam additional message information. The content of this parameter depends on the value of the {@code uMsg} parameter. + * @param lParam additional message information. The content of this parameter depends on the value of the {@code uMsg} parameter. + */ + @NativeType("LRESULT") long invoke(@NativeType("HWND") long hwnd, @NativeType("UINT") int uMsg, @NativeType("WPARAM") long wParam, @NativeType("LPARAM") long lParam); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowsLibrary.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowsLibrary.java new file mode 100644 index 000000000..f3e51cde7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowsLibrary.java @@ -0,0 +1,86 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system.windows; + +import org.lwjgl.system.*; + +import javax.annotation.*; +import java.nio.*; + +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.windows.WinBase.*; +import static org.lwjgl.system.windows.WindowsUtil.*; + +/** Implements a {@link SharedLibrary} on the Windows OS. */ +public class WindowsLibrary extends SharedLibrary.Default { + + /** The LWJGL dll handle. */ + public static final long HINSTANCE; + + static { + try (MemoryStack stack = stackPush()) { + HINSTANCE = GetModuleHandle(stack.UTF16(Library.JNI_LIBRARY_NAME)); + if (HINSTANCE == NULL) { + throw new RuntimeException("Failed to retrieve LWJGL module handle."); + } + } + } + + public WindowsLibrary(String name) { + this(name, loadLibrary(name)); + } + + public WindowsLibrary(String name, long handle) { + super(name, handle); + } + + private static long loadLibrary(String name) { + long handle; + try (MemoryStack stack = stackPush()) { + handle = LoadLibrary(stack.UTF16(name)); + } + if (handle == NULL) { + throw new UnsatisfiedLinkError("Failed to load library: " + name + " (error code = " + getLastError() + ")"); + } + return handle; + } + + @Nullable + @Override + public String getPath() { + int maxLen = 256; + + ByteBuffer buffer = memAlloc(maxLen); + try { + while (true) { + int len = GetModuleFileName(address(), buffer); + int err = getLastError(); + if (err == 0) { + return len == 0 ? null : memUTF16(buffer, len); + } + if (err != 0x7A/*ERROR_INSUFFICIENT_BUFFER*/) { + return null; + } + buffer = memRealloc(buffer, maxLen = maxLen * 3 / 2); + } + } finally { + memFree(buffer); + } + } + + @Override + public long getFunctionAddress(ByteBuffer functionName) { + return GetProcAddress(address(), functionName); + } + + @Override + public void free() { + if (!FreeLibrary(address())) { + windowsThrowException("Failed to unload library: " + getName()); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowsUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowsUtil.java new file mode 100644 index 000000000..e61aa0c17 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/system/windows/WindowsUtil.java @@ -0,0 +1,18 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + */ +package org.lwjgl.system.windows; + +import static org.lwjgl.system.windows.WinBase.*; + +public final class WindowsUtil { + + private WindowsUtil() { + } + + public static void windowsThrowException(String msg) { + throw new RuntimeException(msg + " (error code = " + getLastError() + ")"); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/Color.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/Color.java new file mode 100644 index 000000000..8e03aaf09 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/Color.java @@ -0,0 +1,494 @@ +/* + * Copyright (c) 2002-2008 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; +import java.io.Serializable; +import java.nio.ByteBuffer; + +/** + * A mutable Color class + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public final class Color implements ReadableColor, Serializable, WritableColor { + + static final long serialVersionUID = 1L; + + /** Color components, publicly accessible */ + private byte red, green, blue, alpha; + + /** + * Constructor for Color. + */ + public Color() { + this(0, 0, 0, 255); + } + + /** + * Constructor for Color. Alpha defaults to 255. + */ + public Color(int r, int g, int b) { + this(r, g, b, 255); + } + + /** + * Constructor for Color. Alpha defaults to 255. + */ + public Color(byte r, byte g, byte b) { + this(r, g, b, (byte) 255); + } + + /** + * Constructor for Color. + */ + public Color(int r, int g, int b, int a) { + set(r, g, b, a); + } + + /** + * Constructor for Color. + */ + public Color(byte r, byte g, byte b, byte a) { + set(r, g, b, a); + } + + /** + * Constructor for Color + */ + public Color(ReadableColor c) { + setColor(c); + } + + /** + * Set a color + */ + public void set(int r, int g, int b, int a) { + red = (byte) r; + green = (byte) g; + blue = (byte) b; + alpha = (byte) a; + } + + /** + * Set a color + */ + public void set(byte r, byte g, byte b, byte a) { + this.red = r; + this.green = g; + this.blue = b; + this.alpha = a; + } + + /** + * Set a color + */ + public void set(int r, int g, int b) { + set(r, g, b, 255); + } + + /** + * Set a color + */ + public void set(byte r, byte g, byte b) { + set(r, g, b, (byte) 255); + } + + /** + * Accessor + */ + public int getRed() { + return red & 0xFF; + } + + /** + * Accessor + */ + public int getGreen() { + return green & 0xFF; + } + + /** + * Accessor + */ + public int getBlue() { + return blue & 0xFF; + } + + /** + * Accessor + */ + public int getAlpha() { + return alpha & 0xFF; + } + + /** + * Set the Red component + */ + public void setRed(int red) { + this.red = (byte) red; + } + + /** + * Set the Green component + */ + public void setGreen(int green) { + this.green = (byte) green; + } + + /** + * Set the Blue component + */ + public void setBlue(int blue) { + this.blue = (byte) blue; + } + + /** + * Set the Alpha component + */ + public void setAlpha(int alpha) { + this.alpha = (byte) alpha; + } + + /** + * Set the Red component + */ + public void setRed(byte red) { + this.red = red; + } + + /** + * Set the Green component + */ + public void setGreen(byte green) { + this.green = green; + } + + /** + * Set the Blue component + */ + public void setBlue(byte blue) { + this.blue = blue; + } + + /** + * Set the Alpha component + */ + public void setAlpha(byte alpha) { + this.alpha = alpha; + } + + /** + * Stringify + */ + public String toString() { + return "Color [" + getRed() + ", " + getGreen() + ", " + getBlue() + ", " + getAlpha() + "]"; + } + + /** + * Equals + */ + public boolean equals(Object o) { + return (o != null) + && (o instanceof ReadableColor) + && (((ReadableColor) o).getRed() == this.getRed()) + && (((ReadableColor) o).getGreen() == this.getGreen()) + && (((ReadableColor) o).getBlue() == this.getBlue()) + && (((ReadableColor) o).getAlpha() == this.getAlpha()); + } + + /** + * Hashcode + */ + public int hashCode() { + return (red << 24) | (green << 16) | (blue << 8) | alpha; + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#getAlphaByte() + */ + public byte getAlphaByte() { + return alpha; + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#getBlueByte() + */ + public byte getBlueByte() { + return blue; + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#getGreenByte() + */ + public byte getGreenByte() { + return green; + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#getRedByte() + */ + public byte getRedByte() { + return red; + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeRGBA(java.nio.ByteBuffer) + */ + public void writeRGBA(ByteBuffer dest) { + dest.put(red); + dest.put(green); + dest.put(blue); + dest.put(alpha); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeRGB(java.nio.ByteBuffer) + */ + public void writeRGB(ByteBuffer dest) { + dest.put(red); + dest.put(green); + dest.put(blue); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeABGR(java.nio.ByteBuffer) + */ + public void writeABGR(ByteBuffer dest) { + dest.put(alpha); + dest.put(blue); + dest.put(green); + dest.put(red); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeARGB(java.nio.ByteBuffer) + */ + public void writeARGB(ByteBuffer dest) { + dest.put(alpha); + dest.put(red); + dest.put(green); + dest.put(blue); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeBGR(java.nio.ByteBuffer) + */ + public void writeBGR(ByteBuffer dest) { + dest.put(blue); + dest.put(green); + dest.put(red); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeBGRA(java.nio.ByteBuffer) + */ + public void writeBGRA(ByteBuffer dest) { + dest.put(blue); + dest.put(green); + dest.put(red); + dest.put(alpha); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readRGBA(ByteBuffer src) { + red = src.get(); + green = src.get(); + blue = src.get(); + alpha = src.get(); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readRGB(ByteBuffer src) { + red = src.get(); + green = src.get(); + blue = src.get(); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readARGB(ByteBuffer src) { + alpha = src.get(); + red = src.get(); + green = src.get(); + blue = src.get(); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readBGRA(ByteBuffer src) { + blue = src.get(); + green = src.get(); + red = src.get(); + alpha = src.get(); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readBGR(ByteBuffer src) { + blue = src.get(); + green = src.get(); + red = src.get(); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readABGR(ByteBuffer src) { + alpha = src.get(); + blue = src.get(); + green = src.get(); + red = src.get(); + } + + /** + * Set this color's color by copying another color + * @param src The source color + */ + public void setColor(ReadableColor src) { + red = src.getRedByte(); + green = src.getGreenByte(); + blue = src.getBlueByte(); + alpha = src.getAlphaByte(); + } + + /** + * HSB to RGB conversion, pinched from java.awt.Color. + * @param hue (0..1.0f) + * @param saturation (0..1.0f) + * @param brightness (0..1.0f) + */ + public void fromHSB(float hue, float saturation, float brightness) { + if (saturation == 0.0F) { + red = green = blue = (byte) (brightness * 255F + 0.5F); + } else { + float f3 = (hue - (float) Math.floor(hue)) * 6F; + float f4 = f3 - (float) Math.floor(f3); + float f5 = brightness * (1.0F - saturation); + float f6 = brightness * (1.0F - saturation * f4); + float f7 = brightness * (1.0F - saturation * (1.0F - f4)); + switch ((int) f3) { + case 0 : + red = (byte) (brightness * 255F + 0.5F); + green = (byte) (f7 * 255F + 0.5F); + blue = (byte) (f5 * 255F + 0.5F); + break; + case 1 : + red = (byte) (f6 * 255F + 0.5F); + green = (byte) (brightness * 255F + 0.5F); + blue = (byte) (f5 * 255F + 0.5F); + break; + case 2 : + red = (byte) (f5 * 255F + 0.5F); + green = (byte) (brightness * 255F + 0.5F); + blue = (byte) (f7 * 255F + 0.5F); + break; + case 3 : + red = (byte) (f5 * 255F + 0.5F); + green = (byte) (f6 * 255F + 0.5F); + blue = (byte) (brightness * 255F + 0.5F); + break; + case 4 : + red = (byte) (f7 * 255F + 0.5F); + green = (byte) (f5 * 255F + 0.5F); + blue = (byte) (brightness * 255F + 0.5F); + break; + case 5 : + red = (byte) (brightness * 255F + 0.5F); + green = (byte) (f5 * 255F + 0.5F); + blue = (byte) (f6 * 255F + 0.5F); + break; + } + } + } + + /** + * RGB to HSB conversion, pinched from java.awt.Color. + * The HSB value is returned in dest[] if dest[] is supplied. + * Values range from 0..1 + * @param dest Destination floats, or null + * @return dest, or a new float array + */ + public float[] toHSB(float dest[]) { + int r = getRed(); + int g = getGreen(); + int b = getBlue(); + if (dest == null) + dest = new float[3]; + int l = r <= g ? g : r; + if (b > l) + l = b; + int i1 = r >= g ? g : r; + if (b < i1) + i1 = b; + float brightness = l / 255F; + float saturation; + if (l != 0) + saturation = (float) (l - i1) / (float) l; + else + saturation = 0.0F; + float hue; + if (saturation == 0.0F) { + hue = 0.0F; + } else { + float f3 = (float) (l - r) / (float) (l - i1); + float f4 = (float) (l - g) / (float) (l - i1); + float f5 = (float) (l - b) / (float) (l - i1); + if (r == l) + hue = f5 - f4; + else if (g == l) + hue = (2.0F + f3) - f5; + else + hue = (4F + f4) - f3; + hue /= 6F; + if (hue < 0.0F) + hue++; + } + dest[0] = hue; + dest[1] = saturation; + dest[2] = brightness; + return dest; + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/Dimension.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/Dimension.java new file mode 100644 index 000000000..1b8ae7c32 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/Dimension.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2002-2008 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; + +import java.io.Serializable; + +/** + * A 2D integer Dimension class, which looks remarkably like an AWT one. + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public final class Dimension implements Serializable, ReadableDimension, WritableDimension { + + static final long serialVersionUID = 1L; + + /** The dimensions! */ + private int width, height; + + /** + * Constructor for Dimension. + */ + public Dimension() { + super(); + } + + /** + * Constructor for Dimension. + */ + public Dimension(int w, int h) { + this.width = w; + this.height = h; + } + + /** + * Constructor for Dimension. + */ + public Dimension(ReadableDimension d) { + setSize(d); + } + + public void setSize(int w, int h) { + this.width = w; + this.height = h; + } + + public void setSize(ReadableDimension d) { + this.width = d.getWidth(); + this.height = d.getHeight(); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableDimension#getSize(com.shavenpuppy.jglib.Dimension) + */ + public void getSize(WritableDimension dest) { + dest.setSize(this); + } + + /** + * Checks whether two dimension objects have equal values. + */ + public boolean equals(Object obj) { + if (obj instanceof ReadableDimension) { + ReadableDimension d = (ReadableDimension) obj; + return (width == d.getWidth()) && (height == d.getHeight()); + } + return false; + } + + /** + * Returns the hash code for this Dimension. + * + * @return a hash code for this Dimension + */ + public int hashCode() { + int sum = width + height; + return sum * (sum + 1) / 2 + width; + } + + /** + * Returns a string representation of the values of this + * Dimension object's height and + * width fields. This method is intended to be used only + * for debugging purposes, and the content and format of the returned + * string may vary between implementations. The returned string may be + * empty but may not be null. + * + * @return a string representation of this Dimension + * object + */ + public String toString() { + return getClass().getName() + "[width=" + width + ",height=" + height + "]"; + } + + /** + * Gets the height. + * @return Returns a int + */ + public int getHeight() { + return height; + } + + /** + * Sets the height. + * @param height The height to set + */ + public void setHeight(int height) { + this.height = height; + } + + /** + * Gets the width. + * @return Returns a int + */ + public int getWidth() { + return width; + } + + /** + * Sets the width. + * @param width The width to set + */ + public void setWidth(int width) { + this.width = width; + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/Display.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/Display.java new file mode 100644 index 000000000..2279429db --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/Display.java @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2002-2008 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; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.opengl.DisplayMode; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; + +/** + * Display initialization utility, that can be used to find display modes and pick + * one for you based on your criteria. + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public final class Display { + + private static final boolean DEBUG = false; + + /** + * Determine the available display modes that match the specified minimum and maximum criteria. + * If any given criterium is specified as -1 then it is ignored. + * + * @param minWidth the minimum display resolution in pixels + * @param minHeight the minimum display resolution in pixels + * @param maxWidth the maximum display resolution in pixels + * @param maxHeight the maximum display resolution in pixels + * @param minBPP the minimum bit depth per pixel + * @param maxBPP the maximum bit depth per pixel + * @param minFreq the minimum display frequency in Hz + * @param maxFreq the maximum display frequency in Hz + * @return an array of matching display modes + */ + public static DisplayMode[] getAvailableDisplayModes(int minWidth, int minHeight, int maxWidth, int maxHeight, int minBPP, int maxBPP, + int minFreq, int maxFreq) throws LWJGLException + { + // First get the available display modes + DisplayMode[] modes = org.lwjgl.opengl.Display.getAvailableDisplayModes(); + + if (LWJGLUtil.DEBUG || DEBUG) { + System.out.println("Available screen modes:"); + for ( DisplayMode mode : modes ) { + System.out.println(mode); + } + } + + ArrayList matches = new ArrayList(modes.length); + + for (int i = 0; i < modes.length; i ++) { + assert modes[i] != null : ""+i+" "+modes.length; + if (minWidth != -1 && modes[i].getWidth() < minWidth) + continue; + if (maxWidth != -1 && modes[i].getWidth() > maxWidth) + continue; + if (minHeight != -1 && modes[i].getHeight() < minHeight) + continue; + if (maxHeight != -1 && modes[i].getHeight() > maxHeight) + continue; + if (minBPP != -1 && modes[i].getBitsPerPixel() < minBPP) + continue; + if (maxBPP != -1 && modes[i].getBitsPerPixel() > maxBPP) + continue; + //if (modes[i].bpp == 24) + // continue; + if (modes[i].getFrequency() != 0) { + if (minFreq != -1 && modes[i].getFrequency() < minFreq) + continue; + if (maxFreq != -1 && modes[i].getFrequency() > maxFreq) + continue; + } + matches.add(modes[i]); + } + + DisplayMode[] ret = new DisplayMode[matches.size()]; + matches.toArray(ret); + if (LWJGLUtil.DEBUG && DEBUG) { + System.out.println("Filtered screen modes:"); + for ( DisplayMode mode : ret ) { + System.out.println(mode); + } + } + + return ret; + } + + /** + * Create the display by choosing from a list of display modes based on an order of preference. + * You must supply a list of allowable display modes, probably by calling getAvailableDisplayModes(), + * and an array with the order in which you would like them sorted in descending order. + * This method attempts to create the topmost display mode; if that fails, it will try the next one, + * and so on, until there are no modes left. If no mode is set at the end, an exception is thrown. + * @param dm a list of display modes to choose from + * @param param the names of the DisplayMode fields in the order in which you would like them sorted. + * @return the chosen display mode + * @throws NoSuchFieldException if one of the params is not a field in DisplayMode + * @throws Exception if no display mode could be set + * @see DisplayMode + */ + public static DisplayMode setDisplayMode(DisplayMode[] dm, final String[] param) throws Exception { + + class FieldAccessor { + final String fieldName; + final int order; + final int preferred; + final boolean usePreferred; + FieldAccessor(String fieldName, int order, int preferred, boolean usePreferred) { + this.fieldName = fieldName; + this.order = order; + this.preferred = preferred; + this.usePreferred = usePreferred; + } + int getInt(DisplayMode mode) { + if ("width".equals(fieldName)) { + return mode.getWidth(); + } + if ("height".equals(fieldName)) { + return mode.getHeight(); + } + if ("freq".equals(fieldName)) { + return mode.getFrequency(); + } + if ("bpp".equals(fieldName)) { + return mode.getBitsPerPixel(); + } + throw new IllegalArgumentException("Unknown field "+fieldName); + } + } + + class Sorter implements Comparator { + + final FieldAccessor[] accessors; + + Sorter() { + accessors = new FieldAccessor[param.length]; + for (int i = 0; i < accessors.length; i ++) { + int idx = param[i].indexOf('='); + if (idx > 0) { + accessors[i] = new FieldAccessor(param[i].substring(0, idx), 0, Integer.parseInt(param[i].substring(idx + 1, param[i].length())), true); + } else if (param[i].charAt(0) == '-') { + accessors[i] = new FieldAccessor(param[i].substring(1), -1, 0, false); + } else { + accessors[i] = new FieldAccessor(param[i], 1, 0, false); + } + } + } + + /** + * @see Comparator#compare(Object, Object) + */ + public int compare(DisplayMode dm1, DisplayMode dm2) { + for ( FieldAccessor accessor : accessors ) { + int f1 = accessor.getInt(dm1); + int f2 = accessor.getInt(dm2); + + if ( accessor.usePreferred && f1 != f2 ) { + if ( f1 == accessor.preferred ) + return -1; + else if ( f2 == accessor.preferred ) + return 1; + else { + // Score according to the difference between the values + int absf1 = Math.abs(f1 - accessor.preferred); + int absf2 = Math.abs(f2 - accessor.preferred); + if ( absf1 < absf2 ) + return -1; + else if ( absf1 > absf2 ) + return 1; + else + continue; + } + } else if ( f1 < f2 ) + return accessor.order; + else if ( f1 == f2 ) + continue; + else + return -accessor.order; + } + + return 0; + } + } + + // Sort the display modes + Arrays.sort(dm, new Sorter()); + + // Try them out in the appropriate order + if (LWJGLUtil.DEBUG || DEBUG) { + System.out.println("Sorted display modes:"); + for ( DisplayMode aDm : dm ) { + System.out.println(aDm); + } + } + for ( DisplayMode aDm : dm ) { + try { + if ( LWJGLUtil.DEBUG || DEBUG ) + System.out.println("Attempting to set displaymode: " + aDm); + org.lwjgl.opengl.Display.setDisplayMode(aDm); + return aDm; + } catch (Exception e) { + if ( LWJGLUtil.DEBUG || DEBUG ) { + System.out.println("Failed to set display mode to " + aDm); + e.printStackTrace(); + } + } + } + + throw new Exception("Failed to set display mode."); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/Point.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/Point.java new file mode 100644 index 000000000..5d17362e4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/Point.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2002-2008 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; + +import java.io.Serializable; + +/** + * A 2D integer point class, which looks remarkably like an AWT one. + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public final class Point implements ReadablePoint, WritablePoint, Serializable { + + static final long serialVersionUID = 1L; + + /** The location */ + private int x, y; + + /** + * Constructor for Point. + */ + public Point() { + super(); + } + + /** + * Constructor for Point. + */ + public Point(int x, int y) { + setLocation(x, y); + } + + /** + * Constructor for Point. + */ + public Point(ReadablePoint p) { + setLocation(p); + } + + public void setLocation(int x, int y) { + this.x = x; + this.y = y; + } + + public void setLocation(ReadablePoint p) { + this.x = p.getX(); + this.y = p.getY(); + } + + public void setX(int x) { + this.x = x; + } + + public void setY(int y) { + this.y = y; + } + + /** + * Translate a point. + * @param dx The translation to apply + * @param dy The translation to apply + */ + public void translate(int dx, int dy) { + this.x += dx; + this.y += dy; + } + + /** + * Translate a point. + * @param p The translation to apply + */ + public void translate(ReadablePoint p) { + this.x += p.getX(); + this.y += p.getY(); + } + + /** + * Un-translate a point. + * @param p The translation to apply + */ + public void untranslate(ReadablePoint p) { + this.x -= p.getX(); + this.y -= p.getY(); + } + + /** + * Determines whether an instance of Point2D is equal + * to this point. Two instances of Point2D are equal if + * the values of their x and y member + * fields, representing their position in the coordinate space, are + * the same. + * @param obj an object to be compared with this point + * @return true if the object to be compared is + * an instance of Point and has + * the same values; false otherwise + */ + public boolean equals(Object obj) { + if (obj instanceof Point) { + Point pt = (Point) obj; + return (x == pt.x) && (y == pt.y); + } + return super.equals(obj); + } + + /** + * Returns a string representation of this point and its location + * in the (xy) coordinate space. This method is + * intended to be used only for debugging purposes, and the content + * and format of the returned string may vary between implementations. + * The returned string may be empty but may not be null. + * + * @return a string representation of this point + */ + public String toString() { + return getClass().getName() + "[x=" + x + ",y=" + y + "]"; + } + + /** + * Returns the hash code for this Point. + * + * @return a hash code for this Point + */ + public int hashCode() { + int sum = x + y; + return sum * (sum + 1) / 2 + x; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public void getLocation(WritablePoint dest) { + dest.setLocation(x, y); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableColor.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableColor.java new file mode 100644 index 000000000..9371cc87e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableColor.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2002-2008 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; + +import java.nio.ByteBuffer; + +/** + * Readonly interface for Colors + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface ReadableColor { + + /** + * Return the red component (0..255) + * @return int + */ + int getRed(); + + /** + * Return the red component (0..255) + * @return int + */ + int getGreen(); + + /** + * Return the red component (0..255) + * @return int + */ + int getBlue(); + + /** + * Return the red component (0..255) + * @return int + */ + int getAlpha(); + + /** + * Return the red component + * @return int + */ + byte getRedByte(); + + /** + * Return the red component + * @return int + */ + byte getGreenByte(); + + /** + * Return the red component + * @return int + */ + byte getBlueByte(); + + /** + * Return the red component + * @return int + */ + byte getAlphaByte(); + + /** + * Write the RGBA color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeRGBA(ByteBuffer dest); + + /** + * Write the RGB color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeRGB(ByteBuffer dest); + + /** + * Write the ABGR color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeABGR(ByteBuffer dest); + + /** + * Write the BGR color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeBGR(ByteBuffer dest); + + /** + * Write the BGRA color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeBGRA(ByteBuffer dest); + + /** + * Write the ARGB color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeARGB(ByteBuffer dest); + + /* + * Some standard colors + */ + ReadableColor RED = new Color(255, 0, 0); + ReadableColor ORANGE = new Color(255, 128, 0); + ReadableColor YELLOW = new Color(255, 255, 0); + ReadableColor GREEN = new Color(0, 255, 0); + ReadableColor CYAN = new Color(0, 255, 255); + ReadableColor BLUE = new Color(0, 0, 255); + ReadableColor PURPLE = new Color(255, 0, 255); + ReadableColor WHITE = new Color(255, 255, 255); + ReadableColor BLACK = new Color(0, 0, 0); + ReadableColor LTGREY = new Color(192, 192, 192); + ReadableColor DKGREY = new Color(64, 64, 64); + ReadableColor GREY = new Color(128, 128, 128); + + + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableDimension.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableDimension.java new file mode 100644 index 000000000..cb38a0a95 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableDimension.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2008 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; + +/** + * Readonly interface for Dimensions + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface ReadableDimension { + + /** + * Get the width + * @return int + */ + int getWidth(); + + /** + * Get the height + * @return int + */ + int getHeight(); + + /** + * Copy this ReadableDimension into a destination Dimension + * @param dest The destination + */ + void getSize(WritableDimension dest); + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadablePoint.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadablePoint.java new file mode 100644 index 000000000..a256459dd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadablePoint.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 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; + +/** + * Readonly interface for Points + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface ReadablePoint { + + /** + * @return int + */ + int getX(); + + /** + * @return int + */ + int getY(); + + /** + * Copy this ReadablePoint into a destination Point + * @param dest The destination Point, or null, to create a new Point + */ + void getLocation(WritablePoint dest); +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableRectangle.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableRectangle.java new file mode 100644 index 000000000..cced54f21 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/ReadableRectangle.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2008 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; + +/** + * Readonly interface for Rectangles + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface ReadableRectangle extends ReadableDimension, ReadablePoint { + + /** + * Copy this readable rectangle's bounds into a destination Rectangle + * @param dest The destination Rectangle, or null, to create a new Rectangle + */ + void getBounds(WritableRectangle dest); + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/Rectangle.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/Rectangle.java new file mode 100644 index 000000000..88d233489 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/Rectangle.java @@ -0,0 +1,581 @@ +/* + * Copyright (c) 2002-2008 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; + +import java.io.Serializable; + +/** + * A 2D integer Rectangle class which looks remarkably like an AWT one. + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public final class Rectangle implements ReadableRectangle, WritableRectangle, Serializable { + + static final long serialVersionUID = 1L; + + /** Rectangle's bounds */ + private int x, y, width, height; + + /** + * Constructor for Rectangle. + */ + public Rectangle() { + super(); + } + /** + * Constructor for Rectangle. + */ + public Rectangle(int x, int y, int w, int h) { + this.x = x; + this.y = y; + this.width = w; + this.height = h; + } + /** + * Constructor for Rectangle. + */ + public Rectangle(ReadablePoint p, ReadableDimension d) { + x = p.getX(); + y = p.getY(); + width = d.getWidth(); + height = d.getHeight(); + } + /** + * Constructor for Rectangle. + */ + public Rectangle(ReadableRectangle r) { + x = r.getX(); + y = r.getY(); + width = r.getWidth(); + height = r.getHeight(); + } + + public void setLocation(int x, int y) { + this.x = x; + this.y = y; + } + + public void setLocation(ReadablePoint p) { + this.x = p.getX(); + this.y = p.getY(); + } + + public void setSize(int w, int h) { + this.width = w; + this.height = h; + } + + public void setSize(ReadableDimension d) { + this.width = d.getWidth(); + this.height = d.getHeight(); + } + + public void setBounds(int x, int y, int w, int h) { + this.x = x; + this.y = y; + this.width = w; + this.height = h; + } + + public void setBounds(ReadablePoint p, ReadableDimension d) { + x = p.getX(); + y = p.getY(); + width = d.getWidth(); + height = d.getHeight(); + } + + public void setBounds(ReadableRectangle r) { + x = r.getX(); + y = r.getY(); + width = r.getWidth(); + height = r.getHeight(); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableRectangle#getBounds(com.shavenpuppy.jglib.Rectangle) + */ + public void getBounds(WritableRectangle dest) { + dest.setBounds(x, y, width, height); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadablePoint#getLocation(com.shavenpuppy.jglib.Point) + */ + public void getLocation(WritablePoint dest) { + dest.setLocation(x, y); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableDimension#getSize(com.shavenpuppy.jglib.Dimension) + */ + public void getSize(WritableDimension dest) { + dest.setSize(width, height); + } + + /** + * Translate the rectangle by an amount. + * @param x The translation amount on the x axis + * @param y The translation amount on the y axis + */ + public void translate(int x, int y) { + this.x += x; + this.y += y; + } + + /** + * Translate the rectangle by an amount. + * @param point The translation amount + */ + public void translate(ReadablePoint point) { + this.x += point.getX(); + this.y += point.getY(); + } + + /** + * Un-translate the rectangle by an amount. + * @param point The translation amount + */ + public void untranslate(ReadablePoint point) { + this.x -= point.getX(); + this.y -= point.getY(); + } + + /** + * Checks whether or not this Rectangle contains the + * specified Point. + * @param p the Point to test + * @return true if the Point + * (xy) is inside this + * Rectangle; + * false otherwise. + */ + public boolean contains(ReadablePoint p) { + return contains(p.getX(), p.getY()); + } + + /** + * Checks whether or not this Rectangle contains the + * point at the specified location + * (xy). + * @param X the specified x coordinate + * @param Y the specified y coordinate + * @return true if the point + * (xy) is inside this + * Rectangle; + * false otherwise. + */ + public boolean contains(int X, int Y) { + int w = this.width; + int h = this.height; + if ((w | h) < 0) { + // At least one of the dimensions is negative... + return false; + } + // Note: if either dimension is zero, tests below must return false... + int x = this.x; + int y = this.y; + if (X < x || Y < y) { + return false; + } + w += x; + h += y; + // overflow || intersect + return ((w < x || w > X) && (h < y || h > Y)); + } + + /** + * Checks whether or not this Rectangle entirely contains + * the specified Rectangle. + * @param r the specified Rectangle + * @return true if the Rectangle + * is contained entirely inside this Rectangle; + * false otherwise. + */ + public boolean contains(ReadableRectangle r) { + return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + + /** + * Checks whether this Rectangle entirely contains + * the Rectangle + * at the specified location (XY) with the + * specified dimensions (WH). + * @param X the specified x coordinate + * @param Y the specified y coordinate + * @param W the width of the Rectangle + * @param H the height of the Rectangle + * @return true if the Rectangle specified by + * (XYWH) + * is entirely enclosed inside this Rectangle; + * false otherwise. + */ + public boolean contains(int X, int Y, int W, int H) { + int w = this.width; + int h = this.height; + if ((w | h | W | H) < 0) { + // At least one of the dimensions is negative... + return false; + } + // Note: if any dimension is zero, tests below must return false... + int x = this.x; + int y = this.y; + if (X < x || Y < y) { + return false; + } + w += x; + W += X; + if (W <= X) { + // X+W overflowed or W was zero, return false if... + // either original w or W was zero or + // x+w did not overflow or + // the overflowed x+w is smaller than the overflowed X+W + if (w >= x || W > w) + return false; + } else { + // X+W did not overflow and W was not zero, return false if... + // original w was zero or + // x+w did not overflow and x+w is smaller than X+W + if (w >= x && W > w) + return false; + } + h += y; + H += Y; + if (H <= Y) { + if (h >= y || H > h) + return false; + } else { + if (h >= y && H > h) + return false; + } + return true; + } + + /** + * Determines whether or not this Rectangle and the specified + * Rectangle intersect. Two rectangles intersect if + * their intersection is nonempty. + * + * @param r the specified Rectangle + * @return true if the specified Rectangle + * and this Rectangle intersect; + * false otherwise. + */ + public boolean intersects(ReadableRectangle r) { + int tw = this.width; + int th = this.height; + int rw = r.getWidth(); + int rh = r.getHeight(); + if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) { + return false; + } + int tx = this.x; + int ty = this.y; + int rx = r.getX(); + int ry = r.getY(); + rw += rx; + rh += ry; + tw += tx; + th += ty; + // overflow || intersect + return ((rw < rx || rw > tx) && (rh < ry || rh > ty) && (tw < tx || tw > rx) && (th < ty || th > ry)); + } + + /** + * Computes the intersection of this Rectangle with the + * specified Rectangle. Returns a new Rectangle + * that represents the intersection of the two rectangles. + * If the two rectangles do not intersect, the result will be + * an empty rectangle. + * + * @param r the specified Rectangle + * @return the largest Rectangle contained in both the + * specified Rectangle and in + * this Rectangle; or if the rectangles + * do not intersect, an empty rectangle. + */ + public Rectangle intersection(ReadableRectangle r, Rectangle dest) { + int tx1 = this.x; + int ty1 = this.y; + int rx1 = r.getX(); + int ry1 = r.getY(); + long tx2 = tx1; + tx2 += this.width; + long ty2 = ty1; + ty2 += this.height; + long rx2 = rx1; + rx2 += r.getWidth(); + long ry2 = ry1; + ry2 += r.getHeight(); + if (tx1 < rx1) + tx1 = rx1; + if (ty1 < ry1) + ty1 = ry1; + if (tx2 > rx2) + tx2 = rx2; + if (ty2 > ry2) + ty2 = ry2; + tx2 -= tx1; + ty2 -= ty1; + // tx2,ty2 will never overflow (they will never be + // larger than the smallest of the two source w,h) + // they might underflow, though... + if (tx2 < Integer.MIN_VALUE) + tx2 = Integer.MIN_VALUE; + if (ty2 < Integer.MIN_VALUE) + ty2 = Integer.MIN_VALUE; + if (dest == null) + dest = new Rectangle(tx1, ty1, (int) tx2, (int) ty2); + else + dest.setBounds(tx1, ty1, (int) tx2, (int) ty2); + return dest; + + } + + /** + * Computes the union of this Rectangle with the + * specified Rectangle. Returns a new + * Rectangle that + * represents the union of the two rectangles + * @param r the specified Rectangle + * @return the smallest Rectangle containing both + * the specified Rectangle and this + * Rectangle. + */ + public WritableRectangle union(ReadableRectangle r, WritableRectangle dest) { + int x1 = Math.min(x, r.getX()); + int x2 = Math.max(x + width, r.getX() + r.getWidth()); + int y1 = Math.min(y, r.getY()); + int y2 = Math.max(y + height, r.getY() + r.getHeight()); + dest.setBounds(x1, y1, x2 - x1, y2 - y1); + return dest; + } + + /** + * Adds a point, specified by the integer arguments newx + * and newy, to this Rectangle. The + * resulting Rectangle is + * the smallest Rectangle that contains both the + * original Rectangle and the specified point. + *

    + * After adding a point, a call to contains with the + * added point as an argument does not necessarily return + * true. The contains method does not + * return true for points on the right or bottom + * edges of a Rectangle. Therefore, if the added point + * falls on the right or bottom edge of the enlarged + * Rectangle, contains returns + * false for that point. + * @param newx the x coordinates of the new point + * @param newy the y coordinates of the new point + */ + public void add(int newx, int newy) { + int x1 = Math.min(x, newx); + int x2 = Math.max(x + width, newx); + int y1 = Math.min(y, newy); + int y2 = Math.max(y + height, newy); + x = x1; + y = y1; + width = x2 - x1; + height = y2 - y1; + } + + /** + * Adds the specified Point to this + * Rectangle. The resulting Rectangle + * is the smallest Rectangle that contains both the + * original Rectangle and the specified + * Point. + *

    + * After adding a Point, a call to contains + * with the added Point as an argument does not + * necessarily return true. The contains + * method does not return true for points on the right + * or bottom edges of a Rectangle. Therefore if the added + * Point falls on the right or bottom edge of the + * enlarged Rectangle, contains returns + * false for that Point. + * @param pt the new Point to add to this + * Rectangle + */ + public void add(ReadablePoint pt) { + add(pt.getX(), pt.getY()); + } + + /** + * Adds a Rectangle to this Rectangle. + * The resulting Rectangle is the union of the two + * rectangles. + * @param r the specified Rectangle + */ + public void add(ReadableRectangle r) { + int x1 = Math.min(x, r.getX()); + int x2 = Math.max(x + width, r.getX() + r.getWidth()); + int y1 = Math.min(y, r.getY()); + int y2 = Math.max(y + height, r.getY() + r.getHeight()); + x = x1; + y = y1; + width = x2 - x1; + height = y2 - y1; + } + + /** + * Resizes the Rectangle both horizontally and vertically. + *

    + * This method modifies the Rectangle so that it is + * h units larger on both the left and right side, + * and v units larger at both the top and bottom. + *

    + * The new Rectangle has (x - h, + * y - v) as its top-left corner, a + * width of + * width + 2h, + * and a height of + * height + 2v. + *

    + * If negative values are supplied for h and + * v, the size of the Rectangle + * decreases accordingly. + * The grow method does not check whether the resulting + * values of width and height are + * non-negative. + * @param h the horizontal expansion + * @param v the vertical expansion + */ + public void grow(int h, int v) { + x -= h; + y -= v; + width += h * 2; + height += v * 2; + } + + /** + * Determines whether or not this Rectangle is empty. A + * Rectangle is empty if its width or its height is less + * than or equal to zero. + * @return true if this Rectangle is empty; + * false otherwise. + */ + public boolean isEmpty() { + return (width <= 0) || (height <= 0); + } + /** + * Checks whether two rectangles are equal. + *

    + * The result is true if and only if the argument is not + * null and is a Rectangle object that has the + * same top-left corner, width, and height as this Rectangle. + * @param obj the Object to compare with + * this Rectangle + * @return true if the objects are equal; + * false otherwise. + */ + public boolean equals(Object obj) { + if (obj instanceof Rectangle) { + Rectangle r = (Rectangle) obj; + return ((x == r.x) && (y == r.y) && (width == r.width) && (height == r.height)); + } + return super.equals(obj); + } + + /** + * Debugging + * @return a String + */ + public String toString() { + return getClass().getName() + "[x=" + x + ",y=" + y + ",width=" + width + ",height=" + height + "]"; + } + /** + * Gets the height. + * @return Returns a int + */ + public int getHeight() { + return height; + } + + /** + * Sets the height. + * @param height The height to set + */ + public void setHeight(int height) { + this.height = height; + } + + /** + * Gets the width. + * @return Returns a int + */ + public int getWidth() { + return width; + } + + /** + * Sets the width. + * @param width The width to set + */ + public void setWidth(int width) { + this.width = width; + } + + /** + * Gets the x. + * @return Returns a int + */ + public int getX() { + return x; + } + + /** + * Sets the x. + * @param x The x to set + */ + public void setX(int x) { + this.x = x; + } + + /** + * Gets the y. + * @return Returns a int + */ + public int getY() { + return y; + } + + /** + * Sets the y. + * @param y The y to set + */ + public void setY(int y) { + this.y = y; + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/Renderable.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/Renderable.java new file mode 100644 index 000000000..fcb73ea7f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/Renderable.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 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; + +/** + * + * Simple interface to things that can be Rendered. + * + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface Renderable { + + /** + * "Render" this thing. This will involve calls to the GL. + */ + void render(); + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/Timer.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/Timer.java new file mode 100644 index 000000000..df148e91d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/Timer.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2002-2008 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; + +import org.lwjgl.Sys; + +/** + * + * A hires timer. This measures time in seconds as floating point values. + * All Timers created are updated simultaneously by calling the static method + * tick(). This ensures that within a single iteration of a game loop that + * all timers are updated consistently with each other. + * + * @author cix_foo + * @version $Revision$ + * $Id$ + */ +public class Timer { + + // Record the timer resolution on classload + private static long resolution = Sys.getTimerResolution(); + + // Every so often we will re-query the timer resolution + private static final int QUERY_INTERVAL = 50; // in calls to tick() + private static int queryCount; + + // Globally keeps track of time for all instances of Timer + private static long currentTime; + + // When the timer was started + private long startTime; + + // The last time recorded by getTime() + private long lastTime; + + // Whether the timer is paused + private boolean paused; + + static { + tick(); + } + + /** + * Constructs a timer. The timer will be reset to 0.0 and resumed immediately. + */ + public Timer() { + reset(); + resume(); + } + + /** + * @return the time in seconds, as a float + */ + public float getTime() { + if (!paused) { + lastTime = currentTime - startTime; + } + + return (float) ((double) lastTime / (double) resolution); + } + /** + * @return whether this timer is paused + */ + public boolean isPaused() { + return paused; + } + + /** + * Pause the timer. Whilst paused the time will not change for this timer + * when tick() is called. + * + * @see #resume() + */ + public void pause() { + paused = true; + } + + /** + * Reset the timer. Equivalent to set(0.0f); + * @see #set(float) + */ + public void reset() { + set(0.0f); + } + + /** + * Resume the timer. + * @see #pause() + */ + public void resume() { + paused = false; + startTime = currentTime - lastTime; + } + + /** + * Set the time of this timer + * @param newTime the new time, in seconds + */ + public void set(float newTime) { + long newTimeInTicks = (long) ((double) newTime * (double) resolution); + startTime = currentTime - newTimeInTicks; + lastTime = newTimeInTicks; + } + + /** + * Get the next time update from the system's hires timer. This method should + * be called once per main loop iteration; all timers are updated simultaneously + * from it. + */ + public static void tick() { + currentTime = Sys.getTime(); + + // Periodically refresh the timer resolution: + queryCount ++; + if (queryCount > QUERY_INTERVAL) { + queryCount = 0; + resolution = Sys.getTimerResolution(); + } + } + + /** + * Debug output. + */ + public String toString() { + return "Timer[Time=" + getTime() + ", Paused=" + paused + "]"; + } +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/WaveData.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/WaveData.java new file mode 100644 index 000000000..dc62ad7df --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/WaveData.java @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2002-2008 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; + +import com.sun.media.sound.WaveFileReader; + +import org.lwjgl.openal.AL10; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.ShortBuffer; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; + +/** + * + * Utitlity class for loading wavefiles. + * + * @author Brian Matzon + * @version $Revision$ + * $Id$ + */ +public class WaveData { + /** actual wave data */ + public final ByteBuffer data; + + /** format type of data */ + public final int format; + + /** sample rate of data */ + public final int samplerate; + + /** + * Creates a new WaveData + * + * @param data actual wavedata + * @param format format of wave data + * @param samplerate sample rate of data + */ + private WaveData(ByteBuffer data, int format, int samplerate) { + this.data = data; + this.format = format; + this.samplerate = samplerate; + } + + /** + * Disposes the wavedata + */ + public void dispose() { + data.clear(); + } + + /** + * Creates a WaveData container from the specified url + * + * @param path URL to file + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(URL path) { + try { + // due to an issue with AudioSystem.getAudioInputStream + // and mixing unsigned and signed code + // we will use the reader directly + WaveFileReader wfr = new WaveFileReader(); + return create(wfr.getAudioInputStream(new BufferedInputStream(path.openStream()))); + } catch (Exception e) { + org.lwjgl.LWJGLUtil.log("Unable to create from: " + path + ", " + e.getMessage()); + return null; + } + } + + /** + * Creates a WaveData container from the specified in the classpath + * + * @param path path to file (relative, and in classpath) + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(String path) { + return create(Thread.currentThread().getContextClassLoader().getResource(path)); + } + + /** + * Creates a WaveData container from the specified inputstream + * + * @param is InputStream to read from + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(InputStream is) { + try { + return create( + AudioSystem.getAudioInputStream(is)); + } catch (Exception e) { + org.lwjgl.LWJGLUtil.log("Unable to create from inputstream, " + e.getMessage()); + return null; + } + } + + /** + * Creates a WaveData container from the specified bytes + * + * @param buffer array of bytes containing the complete wave file + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(byte[] buffer) { + try { + return create( + AudioSystem.getAudioInputStream( + new BufferedInputStream(new ByteArrayInputStream(buffer)))); + } catch (Exception e) { + org.lwjgl.LWJGLUtil.log("Unable to create from byte array, " + e.getMessage()); + return null; + } + } + + /** + * Creates a WaveData container from the specified ByetBuffer. + * If the buffer is backed by an array, it will be used directly, + * else the contents of the buffer will be copied using get(byte[]). + * + * @param buffer ByteBuffer containing sound file + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(ByteBuffer buffer) { + try { + byte[] bytes = null; + + if(buffer.hasArray()) { + bytes = buffer.array(); + } else { + bytes = new byte[buffer.capacity()]; + buffer.get(bytes); + } + return create(bytes); + } catch (Exception e) { + org.lwjgl.LWJGLUtil.log("Unable to create from ByteBuffer, " + e.getMessage()); + return null; + } + } + + /** + * Creates a WaveData container from the specified stream + * + * @param ais AudioInputStream to read from + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(AudioInputStream ais) { + //get format of data + AudioFormat audioformat = ais.getFormat(); + + // get channels + int channels = 0; + if (audioformat.getChannels() == 1) { + if (audioformat.getSampleSizeInBits() == 8) { + channels = AL10.AL_FORMAT_MONO8; + } else if (audioformat.getSampleSizeInBits() == 16) { + channels = AL10.AL_FORMAT_MONO16; + } else { + assert false : "Illegal sample size"; + } + } else if (audioformat.getChannels() == 2) { + if (audioformat.getSampleSizeInBits() == 8) { + channels = AL10.AL_FORMAT_STEREO8; + } else if (audioformat.getSampleSizeInBits() == 16) { + channels = AL10.AL_FORMAT_STEREO16; + } else { + assert false : "Illegal sample size"; + } + } else { + assert false : "Only mono or stereo is supported"; + } + + //read data into buffer + ByteBuffer buffer = null; + try { + int available = ais.available(); + if(available <= 0) { + available = ais.getFormat().getChannels() * (int) ais.getFrameLength() * ais.getFormat().getSampleSizeInBits() / 8; + } + byte[] buf = new byte[ais.available()]; + int read = 0, total = 0; + while ((read = ais.read(buf, total, buf.length - total)) != -1 + && total < buf.length) { + total += read; + } + buffer = convertAudioBytes(buf, audioformat.getSampleSizeInBits() == 16, audioformat.isBigEndian() ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); + } catch (IOException ioe) { + return null; + } + + + //create our result + WaveData wavedata = + new WaveData(buffer, channels, (int) audioformat.getSampleRate()); + + //close stream + try { + ais.close(); + } catch (IOException ioe) { + } + + return wavedata; + } + + private static ByteBuffer convertAudioBytes(byte[] audio_bytes, boolean two_bytes_data, ByteOrder order) { + ByteBuffer dest = ByteBuffer.allocateDirect(audio_bytes.length); + dest.order(ByteOrder.nativeOrder()); + ByteBuffer src = ByteBuffer.wrap(audio_bytes); + src.order(order); + if (two_bytes_data) { + ShortBuffer dest_short = dest.asShortBuffer(); + ShortBuffer src_short = src.asShortBuffer(); + while (src_short.hasRemaining()) + dest_short.put(src_short.get()); + } else { + while (src.hasRemaining()) + dest.put(src.get()); + } + dest.rewind(); + return dest; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/WritableColor.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/WritableColor.java new file mode 100644 index 000000000..a1fb49cac --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/WritableColor.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2002-2008 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; + +import java.nio.ByteBuffer; + +/** + * Write interface for Colors + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface WritableColor { + /** + * Set a color + */ + void set(int r, int g, int b, int a); + /** + * Set a color + */ + void set(byte r, byte g, byte b, byte a); + /** + * Set a color + */ + void set(int r, int g, int b); + /** + * Set a color + */ + void set(byte r, byte g, byte b); + /** + * Set the Red component + */ + void setRed(int red); + /** + * Set the Green component + */ + void setGreen(int green); + /** + * Set the Blue component + */ + void setBlue(int blue); + /** + * Set the Alpha component + */ + void setAlpha(int alpha); + /** + * Set the Red component + */ + void setRed(byte red); + /** + * Set the Green component + */ + void setGreen(byte green); + /** + * Set the Blue component + */ + void setBlue(byte blue); + /** + * Set the Alpha component + */ + void setAlpha(byte alpha); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readRGBA(ByteBuffer src); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readRGB(ByteBuffer src); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readARGB(ByteBuffer src); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readBGRA(ByteBuffer src); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readBGR(ByteBuffer src); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readABGR(ByteBuffer src); + /** + * Set this color's color by copying another color + * @param src The source color + */ + void setColor(ReadableColor src); +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/WritableDimension.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/WritableDimension.java new file mode 100644 index 000000000..5e0497691 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/WritableDimension.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2008 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; + +/** + * Write interface for Dimensions + * @author $Author$ + * @version $Revision$ + * $Id$ + + */ +public interface WritableDimension { + void setSize(int w, int h); + void setSize(ReadableDimension d); + /** + * Sets the height. + * @param height The height to set + */ + void setHeight(int height); + /** + * Sets the width. + * @param width The width to set + */ + void setWidth(int width); +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/WritablePoint.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/WritablePoint.java new file mode 100644 index 000000000..6a398cb08 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/WritablePoint.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2008 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; + +/** + * Write interface for Points + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface WritablePoint { + void setLocation(int x, int y); + void setLocation(ReadablePoint p); + void setX(int x); + void setY(int y); +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/WritableRectangle.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/WritableRectangle.java new file mode 100644 index 000000000..2b1da1681 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/WritableRectangle.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2002-2008 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; + +/** + * Write interface for Rectangles + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface WritableRectangle extends WritablePoint, WritableDimension { + + /** + * Sets the bounds of the rectangle + * @param x Position of rectangle on x axis + * @param y Position of rectangle on y axis + * @param width Width of rectangle + * @param height Height of rectangle + */ + void setBounds(int x, int y, int width, int height); + + /** + * Sets the bounds of the rectangle + * @param location + * @param size + */ + void setBounds(ReadablePoint location, ReadableDimension size); + + /** + * Sets the bounds of the rectangle + * @param src + */ + void setBounds(ReadableRectangle src); +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/XPMFile.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/XPMFile.java new file mode 100644 index 000000000..9b71de0d4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/XPMFile.java @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2002-2008 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; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.util.HashMap; +import java.util.StringTokenizer; + +/** + *

    + * NOTE: This simple XPM reader does not support extensions nor hotspots + *

    + * + * @author Brian Matzon + * @author Jos Hirth + * @version $Revision$ + * $Id$ + */ + +public class XPMFile { + + /** Array of bytes (RGBA) */ + private byte bytes[]; + + private static final int WIDTH = 0; + + private static final int HEIGHT = 1; + + private static final int NUMBER_OF_COLORS = 2; + + private static final int CHARACTERS_PER_PIXEL = 3; + + private static int[] format = new int[4]; + + /* + * Private constructor, use load(String filename) + */ + private XPMFile() { + } + + /** + * Loads the XPM file + * + * @param file + * path to file + * @return XPMFile loaded, or exception + * @throws IOException + * If any IO exceptions occurs while reading file + */ + public static XPMFile load(String file) throws IOException { + return load(new FileInputStream(new File(file))); + } + + /** + * Loads the XPM file + * + * @param is + * InputStream to read file from + * @return XPMFile loaded, or exception + */ + public static XPMFile load(InputStream is) { + XPMFile xFile = new XPMFile(); + xFile.readImage(is); + return xFile; + } + + /** + * @return the height of the image. + */ + public int getHeight() { + return format[HEIGHT]; + } + + /** + * @return the width of the image. + */ + public int getWidth() { + return format[WIDTH]; + } + + /** + * @return The data of the image. + */ + public byte[] getBytes() { + return bytes; + } + + /** + * Read the image from the specified file. + */ + private void readImage(InputStream is) { + try { + LineNumberReader reader = new LineNumberReader( + new InputStreamReader(is)); + HashMap colors = new HashMap(); + + format = parseFormat(nextLineOfInterest(reader)); + + // setup color mapping + for (int i = 0; i < format[NUMBER_OF_COLORS]; i++) { + Object[] colorDefinition = parseColor(nextLineOfInterest(reader)); + colors.put((String)colorDefinition[0], (Integer)colorDefinition[1]); + } + + // read actual image (convert to RGBA) + bytes = new byte[format[WIDTH] * format[HEIGHT] * 4]; + for (int i = 0; i < format[HEIGHT]; i++) { + parseImageLine(nextLineOfInterest(reader), format, colors, i); + } + } catch (Exception e) { + e.printStackTrace(); + throw new IllegalArgumentException("Unable to parse XPM File"); + } + } + + /** + * Finds the next interesting line of text. + * + * @param reader + * The LineNumberReader to read from + * @return The next interesting String (with stripped quotes) + * @throws IOException + * If any IO exceptions occurs while reading file + */ + private static String nextLineOfInterest(LineNumberReader reader) + throws IOException { + String ret; + do { + ret = reader.readLine(); + } while (!ret.startsWith("\"")); + // lacks sanity check + return ret.substring(1, ret.lastIndexOf('\"')); + } + + /** + * Parses the format of the xpm file given a format string + * + * @param format + * String to parse + * @return Array specifying width, height, colors, characters per pixel + */ + private static int[] parseFormat(String format) { + // format should look like this: + // 16 16 122 2 + + // tokenize it + StringTokenizer st = new StringTokenizer(format); + + return new int[] { Integer.parseInt(st.nextToken()), /* width */ + Integer.parseInt(st.nextToken()), /* height */ + Integer.parseInt(st.nextToken()), /* colors */ + Integer.parseInt(st.nextToken()) /* chars per pixel */ + }; + } + + /** + * Given a line defining a color/pixel, parses this into an array containing + * a key and a color + * + * @param line + * Line to parse + * @return Array containing a key (String) and a color (Integer) + */ + private static Object[] parseColor(String line) { + // line should look like this: + // # c #0A0A0A + + // NOTE: will break if the color is something like "black" or "gray50" + // etc (instead of #rrggbb). + + String key = line.substring(0, format[CHARACTERS_PER_PIXEL]); + // since we always assume color as type we dont need to read it + // String type = line.substring(format[CHARACTERS_PER_PIXEL] + 1, + // format[CHARACTERS_PER_PIXEL] + 2); + String color = line.substring(format[CHARACTERS_PER_PIXEL] + 4); + + // we always assume type is color, and supplied as # + return new Object[] { key, Integer.parseInt(color, 16) }; + } + + /** + * Parses an Image line into its byte values + * + * @param line + * Line of chars to parse + * @param format + * Format to expext it in + * @param colors + * Colors to lookup + * @param index + * current index into lines, we've reached + */ + private void parseImageLine(String line, int[] format, HashMap colors, + int index) { + // offset for next line + int offset = index * 4 * format[WIDTH]; + + // read characters times, + // each iteration equals one pixel + for (int i = 0; i < format[WIDTH]; i++) { + String key = line + .substring( + i * format[CHARACTERS_PER_PIXEL], + (i * format[CHARACTERS_PER_PIXEL] + format[CHARACTERS_PER_PIXEL])); + int color = colors.get(key); + bytes[offset + (i * 4)] = (byte) ((color & 0x00ff0000) >> 16); + bytes[offset + ((i * 4) + 1)] = (byte) ((color & 0x0000ff00) >> 8); + bytes[offset + ((i * 4) + 2)] = (byte) ((color & 0x000000ff) >> 0); // looks + // better + // :) + bytes[offset + ((i * 4) + 3)] = (byte) 0xff; // always 0xff alpha + } + } + + /** + * @param args + */ + public static void main(String[] args) { + if (args.length != 1) { + System.out.println("usage:\nXPMFile "); + } + + try { + String out = args[0].substring(0, args[0].indexOf(".")) + ".raw"; + XPMFile file = XPMFile.load(args[0]); + BufferedOutputStream bos = new BufferedOutputStream( + new FileOutputStream(new File(out))); + bos.write(file.getBytes()); + bos.close(); + + // showResult(file.getBytes()); + } catch (Exception e) { + e.printStackTrace(); + } + } + /* + private static void showResult(byte[] bytes) { + final BufferedImage i = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB); + int c = 0; + for (int y = 0; y < 16; y++) { + for (int x = 0; x < 16; x++) { + i.setRGB(x, y, (bytes[c] << 16) + (bytes[c + 1] << 8) + (bytes[c + 2] << 0) + (bytes[c + 3] << 24));//+(128<<24));// + c += 4; + } + } + + final Frame frame = new Frame("XPM Result"); + frame.add(new Canvas() { + + public void paint(Graphics g) { + g.drawImage(i, 0, 0, frame); + } + }); + + frame.addWindowListener(new WindowAdapter() { + + public void windowClosing(WindowEvent e) { + frame.dispose(); + } + + }); + + frame.setSize(100, 100); + frame.setVisible(true); + }*/ +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/BDF_Property.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/BDF_Property.java new file mode 100644 index 000000000..4ff56604c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/BDF_Property.java @@ -0,0 +1,292 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * This structure models a given BDF/PCF property. + * + *

    Layout

    + * + *
    
    + * struct BDF_PropertyRec {
    + *     BDF_PropertyType type;
    + *     union {
    + *         char const * atom;
    + *         FT_Int32 integer;
    + *         FT_UInt32 cardinal;
    + *     } u;
    + * }
    + */ +@NativeType("struct BDF_PropertyRec") +public class BDF_Property extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + U, + U_ATOM, + U_INTEGER, + U_CARDINAL; + + static { + Layout layout = __struct( + __member(4), + __union( + __member(POINTER_SIZE), + __member(4), + __member(4) + ) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + U = layout.offsetof(1); + U_ATOM = layout.offsetof(2); + U_INTEGER = layout.offsetof(3); + U_CARDINAL = layout.offsetof(4); + } + + protected BDF_Property(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected BDF_Property create(long address, @Nullable ByteBuffer container) { + return new BDF_Property(address, container); + } + + /** + * Creates a {@code BDF_Property} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public BDF_Property(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + @NativeType("BDF_PropertyType") + public int type() { return ntype(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code u.atom} field. */ + @Nullable + @NativeType("char const *") + public ByteBuffer u_atom() { return nu_atom(address()); } + /** @return the null-terminated string pointed to by the {@code u.atom} field. */ + @Nullable + @NativeType("char const *") + public String u_atomString() { return nu_atomString(address()); } + /** @return the value of the {@code u.integer} field. */ + @NativeType("FT_Int32") + public int u_integer() { return nu_integer(address()); } + /** @return the value of the {@code u.cardinal} field. */ + @NativeType("FT_UInt32") + public int u_cardinal() { return nu_cardinal(address()); } + + // ----------------------------------- + + /** Returns a new {@code BDF_Property} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static BDF_Property malloc() { + return new BDF_Property(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code BDF_Property} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static BDF_Property calloc() { + return new BDF_Property(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code BDF_Property} instance allocated with {@link BufferUtils}. */ + public static BDF_Property create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new BDF_Property(memAddress(container), container); + } + + /** Returns a new {@code BDF_Property} instance for the specified memory address. */ + public static BDF_Property create(long address) { + return new BDF_Property(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static BDF_Property createSafe(long address) { + return address == NULL ? null : new BDF_Property(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code BDF_Property} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static BDF_Property malloc(MemoryStack stack) { + return new BDF_Property(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code BDF_Property} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static BDF_Property calloc(MemoryStack stack) { + return new BDF_Property(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + BDF_Property.TYPE); } + /** Unsafe version of {@link #u_atom}. */ + @Nullable public static ByteBuffer nu_atom(long struct) { return memByteBufferNT1Safe(memGetAddress(struct + BDF_Property.U_ATOM)); } + /** Unsafe version of {@link #u_atomString}. */ + @Nullable public static String nu_atomString(long struct) { return memASCIISafe(memGetAddress(struct + BDF_Property.U_ATOM)); } + /** Unsafe version of {@link #u_integer}. */ + public static int nu_integer(long struct) { return UNSAFE.getInt(null, struct + BDF_Property.U_INTEGER); } + /** Unsafe version of {@link #u_cardinal}. */ + public static int nu_cardinal(long struct) { return UNSAFE.getInt(null, struct + BDF_Property.U_CARDINAL); } + + // ----------------------------------- + + /** An array of {@link BDF_Property} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final BDF_Property ELEMENT_FACTORY = BDF_Property.create(-1L); + + /** + * Creates a new {@code BDF_Property.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link BDF_Property#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected BDF_Property getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + @NativeType("BDF_PropertyType") + public int type() { return BDF_Property.ntype(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code u.atom} field. */ + @Nullable + @NativeType("char const *") + public ByteBuffer u_atom() { return BDF_Property.nu_atom(address()); } + /** @return the null-terminated string pointed to by the {@code u.atom} field. */ + @Nullable + @NativeType("char const *") + public String u_atomString() { return BDF_Property.nu_atomString(address()); } + /** @return the value of the {@code u.integer} field. */ + @NativeType("FT_Int32") + public int u_integer() { return BDF_Property.nu_integer(address()); } + /** @return the value of the {@code u.cardinal} field. */ + @NativeType("FT_UInt32") + public int u_cardinal() { return BDF_Property.nu_cardinal(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/CID_FaceDict.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/CID_FaceDict.java new file mode 100644 index 000000000..97280f400 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/CID_FaceDict.java @@ -0,0 +1,282 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used to represent data in a CID top-level dictionary. + * + *

    Layout

    + * + *
    
    + * struct CID_FaceDictRec {
    + *     {@link PS_Private PS_PrivateRec} private_dict;
    + *     FT_UInt len_buildchar;
    + *     FT_Fixed forcebold_threshold;
    + *     FT_Pos stroke_width;
    + *     FT_Fixed expansion_factor;
    + *     FT_Byte paint_type;
    + *     FT_Byte font_type;
    + *     {@link FT_Matrix FT_Matrix} font_matrix;
    + *     {@link FT_Vector FT_Vector} font_offset;
    + *     FT_UInt num_subrs;
    + *     FT_ULong subrmap_offset;
    + *     FT_UInt sd_bytes;
    + * }
    + */ +@NativeType("struct CID_FaceDictRec") +public class CID_FaceDict extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PRIVATE_DICT, + LEN_BUILDCHAR, + FORCEBOLD_THRESHOLD, + STROKE_WIDTH, + EXPANSION_FACTOR, + PAINT_TYPE, + FONT_TYPE, + FONT_MATRIX, + FONT_OFFSET, + NUM_SUBRS, + SUBRMAP_OFFSET, + SD_BYTES; + + static { + Layout layout = __struct( + __member(PS_Private.SIZEOF, PS_Private.ALIGNOF), + __member(4), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(1), + __member(1), + __member(FT_Matrix.SIZEOF, FT_Matrix.ALIGNOF), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF), + __member(4), + __member(CLONG_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PRIVATE_DICT = layout.offsetof(0); + LEN_BUILDCHAR = layout.offsetof(1); + FORCEBOLD_THRESHOLD = layout.offsetof(2); + STROKE_WIDTH = layout.offsetof(3); + EXPANSION_FACTOR = layout.offsetof(4); + PAINT_TYPE = layout.offsetof(5); + FONT_TYPE = layout.offsetof(6); + FONT_MATRIX = layout.offsetof(7); + FONT_OFFSET = layout.offsetof(8); + NUM_SUBRS = layout.offsetof(9); + SUBRMAP_OFFSET = layout.offsetof(10); + SD_BYTES = layout.offsetof(11); + } + + protected CID_FaceDict(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected CID_FaceDict create(long address, @Nullable ByteBuffer container) { + return new CID_FaceDict(address, container); + } + + /** + * Creates a {@code CID_FaceDict} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public CID_FaceDict(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link PS_Private} view of the {@code private_dict} field. */ + @NativeType("PS_PrivateRec") + public PS_Private private_dict() { return nprivate_dict(address()); } + /** @return the value of the {@code len_buildchar} field. */ + @NativeType("FT_UInt") + public int len_buildchar() { return nlen_buildchar(address()); } + /** @return the value of the {@code forcebold_threshold} field. */ + @NativeType("FT_Fixed") + public long forcebold_threshold() { return nforcebold_threshold(address()); } + /** @return the value of the {@code stroke_width} field. */ + @NativeType("FT_Pos") + public long stroke_width() { return nstroke_width(address()); } + /** @return the value of the {@code expansion_factor} field. */ + @NativeType("FT_Fixed") + public long expansion_factor() { return nexpansion_factor(address()); } + /** @return the value of the {@code paint_type} field. */ + @NativeType("FT_Byte") + public byte paint_type() { return npaint_type(address()); } + /** @return the value of the {@code font_type} field. */ + @NativeType("FT_Byte") + public byte font_type() { return nfont_type(address()); } + /** @return a {@link FT_Matrix} view of the {@code font_matrix} field. */ + public FT_Matrix font_matrix() { return nfont_matrix(address()); } + /** @return a {@link FT_Vector} view of the {@code font_offset} field. */ + public FT_Vector font_offset() { return nfont_offset(address()); } + /** @return the value of the {@code num_subrs} field. */ + @NativeType("FT_UInt") + public int num_subrs() { return nnum_subrs(address()); } + /** @return the value of the {@code subrmap_offset} field. */ + @NativeType("FT_ULong") + public long subrmap_offset() { return nsubrmap_offset(address()); } + /** @return the value of the {@code sd_bytes} field. */ + @NativeType("FT_UInt") + public int sd_bytes() { return nsd_bytes(address()); } + + // ----------------------------------- + + /** Returns a new {@code CID_FaceDict} instance for the specified memory address. */ + public static CID_FaceDict create(long address) { + return new CID_FaceDict(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static CID_FaceDict createSafe(long address) { + return address == NULL ? null : new CID_FaceDict(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #private_dict}. */ + public static PS_Private nprivate_dict(long struct) { return PS_Private.create(struct + CID_FaceDict.PRIVATE_DICT); } + /** Unsafe version of {@link #len_buildchar}. */ + public static int nlen_buildchar(long struct) { return UNSAFE.getInt(null, struct + CID_FaceDict.LEN_BUILDCHAR); } + /** Unsafe version of {@link #forcebold_threshold}. */ + public static long nforcebold_threshold(long struct) { return memGetCLong(struct + CID_FaceDict.FORCEBOLD_THRESHOLD); } + /** Unsafe version of {@link #stroke_width}. */ + public static long nstroke_width(long struct) { return memGetCLong(struct + CID_FaceDict.STROKE_WIDTH); } + /** Unsafe version of {@link #expansion_factor}. */ + public static long nexpansion_factor(long struct) { return memGetCLong(struct + CID_FaceDict.EXPANSION_FACTOR); } + /** Unsafe version of {@link #paint_type}. */ + public static byte npaint_type(long struct) { return UNSAFE.getByte(null, struct + CID_FaceDict.PAINT_TYPE); } + /** Unsafe version of {@link #font_type}. */ + public static byte nfont_type(long struct) { return UNSAFE.getByte(null, struct + CID_FaceDict.FONT_TYPE); } + /** Unsafe version of {@link #font_matrix}. */ + public static FT_Matrix nfont_matrix(long struct) { return FT_Matrix.create(struct + CID_FaceDict.FONT_MATRIX); } + /** Unsafe version of {@link #font_offset}. */ + public static FT_Vector nfont_offset(long struct) { return FT_Vector.create(struct + CID_FaceDict.FONT_OFFSET); } + /** Unsafe version of {@link #num_subrs}. */ + public static int nnum_subrs(long struct) { return UNSAFE.getInt(null, struct + CID_FaceDict.NUM_SUBRS); } + /** Unsafe version of {@link #subrmap_offset}. */ + public static long nsubrmap_offset(long struct) { return memGetCLong(struct + CID_FaceDict.SUBRMAP_OFFSET); } + /** Unsafe version of {@link #sd_bytes}. */ + public static int nsd_bytes(long struct) { return UNSAFE.getInt(null, struct + CID_FaceDict.SD_BYTES); } + + // ----------------------------------- + + /** An array of {@link CID_FaceDict} structs. */ + public static class Buffer extends StructBuffer { + + private static final CID_FaceDict ELEMENT_FACTORY = CID_FaceDict.create(-1L); + + /** + * Creates a new {@code CID_FaceDict.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link CID_FaceDict#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected CID_FaceDict getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link PS_Private} view of the {@code private_dict} field. */ + @NativeType("PS_PrivateRec") + public PS_Private private_dict() { return CID_FaceDict.nprivate_dict(address()); } + /** @return the value of the {@code len_buildchar} field. */ + @NativeType("FT_UInt") + public int len_buildchar() { return CID_FaceDict.nlen_buildchar(address()); } + /** @return the value of the {@code forcebold_threshold} field. */ + @NativeType("FT_Fixed") + public long forcebold_threshold() { return CID_FaceDict.nforcebold_threshold(address()); } + /** @return the value of the {@code stroke_width} field. */ + @NativeType("FT_Pos") + public long stroke_width() { return CID_FaceDict.nstroke_width(address()); } + /** @return the value of the {@code expansion_factor} field. */ + @NativeType("FT_Fixed") + public long expansion_factor() { return CID_FaceDict.nexpansion_factor(address()); } + /** @return the value of the {@code paint_type} field. */ + @NativeType("FT_Byte") + public byte paint_type() { return CID_FaceDict.npaint_type(address()); } + /** @return the value of the {@code font_type} field. */ + @NativeType("FT_Byte") + public byte font_type() { return CID_FaceDict.nfont_type(address()); } + /** @return a {@link FT_Matrix} view of the {@code font_matrix} field. */ + public FT_Matrix font_matrix() { return CID_FaceDict.nfont_matrix(address()); } + /** @return a {@link FT_Vector} view of the {@code font_offset} field. */ + public FT_Vector font_offset() { return CID_FaceDict.nfont_offset(address()); } + /** @return the value of the {@code num_subrs} field. */ + @NativeType("FT_UInt") + public int num_subrs() { return CID_FaceDict.nnum_subrs(address()); } + /** @return the value of the {@code subrmap_offset} field. */ + @NativeType("FT_ULong") + public long subrmap_offset() { return CID_FaceDict.nsubrmap_offset(address()); } + /** @return the value of the {@code sd_bytes} field. */ + @NativeType("FT_UInt") + public int sd_bytes() { return CID_FaceDict.nsd_bytes(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/CID_FaceInfo.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/CID_FaceInfo.java new file mode 100644 index 000000000..987038472 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/CID_FaceInfo.java @@ -0,0 +1,390 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used to represent CID Face information. + * + *

    Layout

    + * + *
    
    + * struct CID_FaceInfoRec {
    + *     FT_String * cid_font_name;
    + *     FT_Fixed cid_version;
    + *     FT_Int cid_font_type;
    + *     FT_String * registry;
    + *     FT_String * ordering;
    + *     FT_Int supplement;
    + *     {@link PS_FontInfo PS_FontInfoRec} font_info;
    + *     {@link FT_BBox FT_BBox} font_bbox;
    + *     FT_ULong uid_base;
    + *     FT_Int num_xuid;
    + *     FT_ULong xuid[16];
    + *     FT_ULong cidmap_offset;
    + *     FT_UInt fd_bytes;
    + *     FT_UInt gd_bytes;
    + *     FT_ULong cid_count;
    + *     FT_UInt num_dicts;
    + *     {@link CID_FaceDict CID_FaceDict} font_dicts;
    + *     FT_ULong data_offset;
    + * }
    + */ +@NativeType("struct CID_FaceInfoRec") +public class CID_FaceInfo extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + CID_FONT_NAME, + CID_VERSION, + CID_FONT_TYPE, + REGISTRY, + ORDERING, + SUPPLEMENT, + FONT_INFO, + FONT_BBOX, + UID_BASE, + NUM_XUID, + XUID, + CIDMAP_OFFSET, + FD_BYTES, + GD_BYTES, + CID_COUNT, + NUM_DICTS, + FONT_DICTS, + DATA_OFFSET; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(PS_FontInfo.SIZEOF, PS_FontInfo.ALIGNOF), + __member(FT_BBox.SIZEOF, FT_BBox.ALIGNOF), + __member(CLONG_SIZE), + __member(4), + __array(CLONG_SIZE, 16), + __member(CLONG_SIZE), + __member(4), + __member(4), + __member(CLONG_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + CID_FONT_NAME = layout.offsetof(0); + CID_VERSION = layout.offsetof(1); + CID_FONT_TYPE = layout.offsetof(2); + REGISTRY = layout.offsetof(3); + ORDERING = layout.offsetof(4); + SUPPLEMENT = layout.offsetof(5); + FONT_INFO = layout.offsetof(6); + FONT_BBOX = layout.offsetof(7); + UID_BASE = layout.offsetof(8); + NUM_XUID = layout.offsetof(9); + XUID = layout.offsetof(10); + CIDMAP_OFFSET = layout.offsetof(11); + FD_BYTES = layout.offsetof(12); + GD_BYTES = layout.offsetof(13); + CID_COUNT = layout.offsetof(14); + NUM_DICTS = layout.offsetof(15); + FONT_DICTS = layout.offsetof(16); + DATA_OFFSET = layout.offsetof(17); + } + + protected CID_FaceInfo(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected CID_FaceInfo create(long address, @Nullable ByteBuffer container) { + return new CID_FaceInfo(address, container); + } + + /** + * Creates a {@code CID_FaceInfo} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public CID_FaceInfo(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code cid_font_name} field. */ + @NativeType("FT_String *") + public ByteBuffer cid_font_name() { return ncid_font_name(address()); } + /** @return the null-terminated string pointed to by the {@code cid_font_name} field. */ + @NativeType("FT_String *") + public String cid_font_nameString() { return ncid_font_nameString(address()); } + /** @return the value of the {@code cid_version} field. */ + @NativeType("FT_Fixed") + public long cid_version() { return ncid_version(address()); } + /** @return the value of the {@code cid_font_type} field. */ + @NativeType("FT_Int") + public int cid_font_type() { return ncid_font_type(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code registry} field. */ + @NativeType("FT_String *") + public ByteBuffer registry() { return nregistry(address()); } + /** @return the null-terminated string pointed to by the {@code registry} field. */ + @NativeType("FT_String *") + public String registryString() { return nregistryString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code ordering} field. */ + @NativeType("FT_String *") + public ByteBuffer ordering() { return nordering(address()); } + /** @return the null-terminated string pointed to by the {@code ordering} field. */ + @NativeType("FT_String *") + public String orderingString() { return norderingString(address()); } + /** @return the value of the {@code supplement} field. */ + @NativeType("FT_Int") + public int supplement() { return nsupplement(address()); } + /** @return a {@link PS_FontInfo} view of the {@code font_info} field. */ + @NativeType("PS_FontInfoRec") + public PS_FontInfo font_info() { return nfont_info(address()); } + /** @return a {@link FT_BBox} view of the {@code font_bbox} field. */ + public FT_BBox font_bbox() { return nfont_bbox(address()); } + /** @return the value of the {@code uid_base} field. */ + @NativeType("FT_ULong") + public long uid_base() { return nuid_base(address()); } + /** @return the value of the {@code num_xuid} field. */ + @NativeType("FT_Int") + public int num_xuid() { return nnum_xuid(address()); } + /** @return a {@link CLongBuffer} view of the {@code xuid} field. */ + @NativeType("FT_ULong[16]") + public CLongBuffer xuid() { return nxuid(address()); } + /** @return the value at the specified index of the {@code xuid} field. */ + @NativeType("FT_ULong") + public long xuid(int index) { return nxuid(address(), index); } + /** @return the value of the {@code cidmap_offset} field. */ + @NativeType("FT_ULong") + public long cidmap_offset() { return ncidmap_offset(address()); } + /** @return the value of the {@code fd_bytes} field. */ + @NativeType("FT_UInt") + public int fd_bytes() { return nfd_bytes(address()); } + /** @return the value of the {@code gd_bytes} field. */ + @NativeType("FT_UInt") + public int gd_bytes() { return ngd_bytes(address()); } + /** @return the value of the {@code cid_count} field. */ + @NativeType("FT_ULong") + public long cid_count() { return ncid_count(address()); } + /** @return the value of the {@code num_dicts} field. */ + @NativeType("FT_UInt") + public int num_dicts() { return nnum_dicts(address()); } + /** @return a {@link CID_FaceDict} view of the struct pointed to by the {@code font_dicts} field. */ + public CID_FaceDict font_dicts() { return nfont_dicts(address()); } + /** @return the value of the {@code data_offset} field. */ + @NativeType("FT_ULong") + public long data_offset() { return ndata_offset(address()); } + + // ----------------------------------- + + /** Returns a new {@code CID_FaceInfo} instance for the specified memory address. */ + public static CID_FaceInfo create(long address) { + return new CID_FaceInfo(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static CID_FaceInfo createSafe(long address) { + return address == NULL ? null : new CID_FaceInfo(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #cid_font_name}. */ + public static ByteBuffer ncid_font_name(long struct) { return memByteBufferNT1(memGetAddress(struct + CID_FaceInfo.CID_FONT_NAME)); } + /** Unsafe version of {@link #cid_font_nameString}. */ + public static String ncid_font_nameString(long struct) { return memUTF8(memGetAddress(struct + CID_FaceInfo.CID_FONT_NAME)); } + /** Unsafe version of {@link #cid_version}. */ + public static long ncid_version(long struct) { return memGetCLong(struct + CID_FaceInfo.CID_VERSION); } + /** Unsafe version of {@link #cid_font_type}. */ + public static int ncid_font_type(long struct) { return UNSAFE.getInt(null, struct + CID_FaceInfo.CID_FONT_TYPE); } + /** Unsafe version of {@link #registry}. */ + public static ByteBuffer nregistry(long struct) { return memByteBufferNT1(memGetAddress(struct + CID_FaceInfo.REGISTRY)); } + /** Unsafe version of {@link #registryString}. */ + public static String nregistryString(long struct) { return memUTF8(memGetAddress(struct + CID_FaceInfo.REGISTRY)); } + /** Unsafe version of {@link #ordering}. */ + public static ByteBuffer nordering(long struct) { return memByteBufferNT1(memGetAddress(struct + CID_FaceInfo.ORDERING)); } + /** Unsafe version of {@link #orderingString}. */ + public static String norderingString(long struct) { return memUTF8(memGetAddress(struct + CID_FaceInfo.ORDERING)); } + /** Unsafe version of {@link #supplement}. */ + public static int nsupplement(long struct) { return UNSAFE.getInt(null, struct + CID_FaceInfo.SUPPLEMENT); } + /** Unsafe version of {@link #font_info}. */ + public static PS_FontInfo nfont_info(long struct) { return PS_FontInfo.create(struct + CID_FaceInfo.FONT_INFO); } + /** Unsafe version of {@link #font_bbox}. */ + public static FT_BBox nfont_bbox(long struct) { return FT_BBox.create(struct + CID_FaceInfo.FONT_BBOX); } + /** Unsafe version of {@link #uid_base}. */ + public static long nuid_base(long struct) { return memGetCLong(struct + CID_FaceInfo.UID_BASE); } + /** Unsafe version of {@link #num_xuid}. */ + public static int nnum_xuid(long struct) { return UNSAFE.getInt(null, struct + CID_FaceInfo.NUM_XUID); } + /** Unsafe version of {@link #xuid}. */ + public static CLongBuffer nxuid(long struct) { return memCLongBuffer(struct + CID_FaceInfo.XUID, 16); } + /** Unsafe version of {@link #xuid(int) xuid}. */ + public static long nxuid(long struct, int index) { + return memGetCLong(struct + CID_FaceInfo.XUID + check(index, 16) * CLONG_SIZE); + } + /** Unsafe version of {@link #cidmap_offset}. */ + public static long ncidmap_offset(long struct) { return memGetCLong(struct + CID_FaceInfo.CIDMAP_OFFSET); } + /** Unsafe version of {@link #fd_bytes}. */ + public static int nfd_bytes(long struct) { return UNSAFE.getInt(null, struct + CID_FaceInfo.FD_BYTES); } + /** Unsafe version of {@link #gd_bytes}. */ + public static int ngd_bytes(long struct) { return UNSAFE.getInt(null, struct + CID_FaceInfo.GD_BYTES); } + /** Unsafe version of {@link #cid_count}. */ + public static long ncid_count(long struct) { return memGetCLong(struct + CID_FaceInfo.CID_COUNT); } + /** Unsafe version of {@link #num_dicts}. */ + public static int nnum_dicts(long struct) { return UNSAFE.getInt(null, struct + CID_FaceInfo.NUM_DICTS); } + /** Unsafe version of {@link #font_dicts}. */ + public static CID_FaceDict nfont_dicts(long struct) { return CID_FaceDict.create(memGetAddress(struct + CID_FaceInfo.FONT_DICTS)); } + /** Unsafe version of {@link #data_offset}. */ + public static long ndata_offset(long struct) { return memGetCLong(struct + CID_FaceInfo.DATA_OFFSET); } + + // ----------------------------------- + + /** An array of {@link CID_FaceInfo} structs. */ + public static class Buffer extends StructBuffer { + + private static final CID_FaceInfo ELEMENT_FACTORY = CID_FaceInfo.create(-1L); + + /** + * Creates a new {@code CID_FaceInfo.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link CID_FaceInfo#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected CID_FaceInfo getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code cid_font_name} field. */ + @NativeType("FT_String *") + public ByteBuffer cid_font_name() { return CID_FaceInfo.ncid_font_name(address()); } + /** @return the null-terminated string pointed to by the {@code cid_font_name} field. */ + @NativeType("FT_String *") + public String cid_font_nameString() { return CID_FaceInfo.ncid_font_nameString(address()); } + /** @return the value of the {@code cid_version} field. */ + @NativeType("FT_Fixed") + public long cid_version() { return CID_FaceInfo.ncid_version(address()); } + /** @return the value of the {@code cid_font_type} field. */ + @NativeType("FT_Int") + public int cid_font_type() { return CID_FaceInfo.ncid_font_type(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code registry} field. */ + @NativeType("FT_String *") + public ByteBuffer registry() { return CID_FaceInfo.nregistry(address()); } + /** @return the null-terminated string pointed to by the {@code registry} field. */ + @NativeType("FT_String *") + public String registryString() { return CID_FaceInfo.nregistryString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code ordering} field. */ + @NativeType("FT_String *") + public ByteBuffer ordering() { return CID_FaceInfo.nordering(address()); } + /** @return the null-terminated string pointed to by the {@code ordering} field. */ + @NativeType("FT_String *") + public String orderingString() { return CID_FaceInfo.norderingString(address()); } + /** @return the value of the {@code supplement} field. */ + @NativeType("FT_Int") + public int supplement() { return CID_FaceInfo.nsupplement(address()); } + /** @return a {@link PS_FontInfo} view of the {@code font_info} field. */ + @NativeType("PS_FontInfoRec") + public PS_FontInfo font_info() { return CID_FaceInfo.nfont_info(address()); } + /** @return a {@link FT_BBox} view of the {@code font_bbox} field. */ + public FT_BBox font_bbox() { return CID_FaceInfo.nfont_bbox(address()); } + /** @return the value of the {@code uid_base} field. */ + @NativeType("FT_ULong") + public long uid_base() { return CID_FaceInfo.nuid_base(address()); } + /** @return the value of the {@code num_xuid} field. */ + @NativeType("FT_Int") + public int num_xuid() { return CID_FaceInfo.nnum_xuid(address()); } + /** @return a {@link CLongBuffer} view of the {@code xuid} field. */ + @NativeType("FT_ULong[16]") + public CLongBuffer xuid() { return CID_FaceInfo.nxuid(address()); } + /** @return the value at the specified index of the {@code xuid} field. */ + @NativeType("FT_ULong") + public long xuid(int index) { return CID_FaceInfo.nxuid(address(), index); } + /** @return the value of the {@code cidmap_offset} field. */ + @NativeType("FT_ULong") + public long cidmap_offset() { return CID_FaceInfo.ncidmap_offset(address()); } + /** @return the value of the {@code fd_bytes} field. */ + @NativeType("FT_UInt") + public int fd_bytes() { return CID_FaceInfo.nfd_bytes(address()); } + /** @return the value of the {@code gd_bytes} field. */ + @NativeType("FT_UInt") + public int gd_bytes() { return CID_FaceInfo.ngd_bytes(address()); } + /** @return the value of the {@code cid_count} field. */ + @NativeType("FT_ULong") + public long cid_count() { return CID_FaceInfo.ncid_count(address()); } + /** @return the value of the {@code num_dicts} field. */ + @NativeType("FT_UInt") + public int num_dicts() { return CID_FaceInfo.nnum_dicts(address()); } + /** @return a {@link CID_FaceDict} view of the struct pointed to by the {@code font_dicts} field. */ + public CID_FaceDict font_dicts() { return CID_FaceInfo.nfont_dicts(address()); } + /** @return the value of the {@code data_offset} field. */ + @NativeType("FT_ULong") + public long data_offset() { return CID_FaceInfo.ndata_offset(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Face_Requester.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Face_Requester.java new file mode 100644 index 000000000..4c0c968f5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Face_Requester.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FTC_FaceID face_id,
    + *     FT_Library library,
    + *     FT_Pointer req_data,
    + *     FT_Face *aface
    + * )
    + */ +public abstract class FTC_Face_Requester extends Callback implements FTC_Face_RequesterI { + + /** + * Creates a {@code FTC_Face_Requester} instance from the specified function pointer. + * + * @return the new {@code FTC_Face_Requester} + */ + public static FTC_Face_Requester create(long functionPointer) { + FTC_Face_RequesterI instance = Callback.get(functionPointer); + return instance instanceof FTC_Face_Requester + ? (FTC_Face_Requester)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FTC_Face_Requester createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FTC_Face_Requester} instance that delegates to the specified {@code FTC_Face_RequesterI} instance. */ + public static FTC_Face_Requester create(FTC_Face_RequesterI instance) { + return instance instanceof FTC_Face_Requester + ? (FTC_Face_Requester)instance + : new Container(instance.address(), instance); + } + + protected FTC_Face_Requester() { + super(CIF); + } + + FTC_Face_Requester(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FTC_Face_Requester { + + private final FTC_Face_RequesterI delegate; + + Container(long functionPointer, FTC_Face_RequesterI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long face_id, long library, long req_data, long aface) { + return delegate.invoke(face_id, library, req_data, aface); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Face_RequesterI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Face_RequesterI.java new file mode 100644 index 000000000..2176716cb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Face_RequesterI.java @@ -0,0 +1,56 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FTC_FaceID face_id,
    + *     FT_Library library,
    + *     FT_Pointer req_data,
    + *     FT_Face *aface
    + * )
    + */ +@FunctionalInterface +@NativeType("FTC_Face_Requester") +public interface FTC_Face_RequesterI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** + * A callback function provided by client applications. It is used by the cache manager to translate a given FTC _FaceID into a new valid {@code FT_Face} + * object, on demand. + */ + @NativeType("FT_Error") int invoke(@NativeType("FTC_FaceID") long face_id, @NativeType("FT_Library") long library, @NativeType("FT_Pointer") long req_data, @NativeType("FT_Face *") long aface); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_ImageType.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_ImageType.java new file mode 100644 index 000000000..64156f100 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_ImageType.java @@ -0,0 +1,190 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used to model the type of images in a glyph cache. + * + *

    Layout

    + * + *
    
    + * struct FTC_ImageTypeRec {
    + *     FTC_FaceID face_id;
    + *     FT_UInt width;
    + *     FT_UInt height;
    + *     FT_Int32 flags;
    + * }
    + */ +@NativeType("struct FTC_ImageTypeRec") +public class FTC_ImageType extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FACE_ID, + WIDTH, + HEIGHT, + FLAGS; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FACE_ID = layout.offsetof(0); + WIDTH = layout.offsetof(1); + HEIGHT = layout.offsetof(2); + FLAGS = layout.offsetof(3); + } + + protected FTC_ImageType(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FTC_ImageType create(long address, @Nullable ByteBuffer container) { + return new FTC_ImageType(address, container); + } + + /** + * Creates a {@code FTC_ImageType} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FTC_ImageType(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code face_id} field. */ + @NativeType("FTC_FaceID") + public long face_id() { return nface_id(address()); } + /** @return the value of the {@code width} field. */ + @NativeType("FT_UInt") + public int width() { return nwidth(address()); } + /** @return the value of the {@code height} field. */ + @NativeType("FT_UInt") + public int height() { return nheight(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("FT_Int32") + public int flags() { return nflags(address()); } + + // ----------------------------------- + + /** Returns a new {@code FTC_ImageType} instance for the specified memory address. */ + public static FTC_ImageType create(long address) { + return new FTC_ImageType(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FTC_ImageType createSafe(long address) { + return address == NULL ? null : new FTC_ImageType(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #face_id}. */ + public static long nface_id(long struct) { return memGetAddress(struct + FTC_ImageType.FACE_ID); } + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + FTC_ImageType.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + FTC_ImageType.HEIGHT); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + FTC_ImageType.FLAGS); } + + // ----------------------------------- + + /** An array of {@link FTC_ImageType} structs. */ + public static class Buffer extends StructBuffer { + + private static final FTC_ImageType ELEMENT_FACTORY = FTC_ImageType.create(-1L); + + /** + * Creates a new {@code FTC_ImageType.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FTC_ImageType#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FTC_ImageType getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code face_id} field. */ + @NativeType("FTC_FaceID") + public long face_id() { return FTC_ImageType.nface_id(address()); } + /** @return the value of the {@code width} field. */ + @NativeType("FT_UInt") + public int width() { return FTC_ImageType.nwidth(address()); } + /** @return the value of the {@code height} field. */ + @NativeType("FT_UInt") + public int height() { return FTC_ImageType.nheight(address()); } + /** @return the value of the {@code flags} field. */ + @NativeType("FT_Int32") + public int flags() { return FTC_ImageType.nflags(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_SBit.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_SBit.java new file mode 100644 index 000000000..d8b32a495 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_SBit.java @@ -0,0 +1,270 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A very compact structure used to describe a small glyph bitmap. + * + *

    Layout

    + * + *
    
    + * struct FTC_SBitRec {
    + *     FT_Byte width;
    + *     FT_Byte height;
    + *     FT_Char left;
    + *     FT_Char top;
    + *     FT_Byte format;
    + *     FT_Byte max_grays;
    + *     FT_Short pitch;
    + *     FT_Char xadvance;
    + *     FT_Char yadvance;
    + *     FT_Byte * buffer;
    + * }
    + */ +@NativeType("struct FTC_SBitRec") +public class FTC_SBit extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + WIDTH, + HEIGHT, + LEFT, + TOP, + FORMAT, + MAX_GRAYS, + PITCH, + XADVANCE, + YADVANCE, + BUFFER; + + static { + Layout layout = __struct( + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(1), + __member(2), + __member(1), + __member(1), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + WIDTH = layout.offsetof(0); + HEIGHT = layout.offsetof(1); + LEFT = layout.offsetof(2); + TOP = layout.offsetof(3); + FORMAT = layout.offsetof(4); + MAX_GRAYS = layout.offsetof(5); + PITCH = layout.offsetof(6); + XADVANCE = layout.offsetof(7); + YADVANCE = layout.offsetof(8); + BUFFER = layout.offsetof(9); + } + + protected FTC_SBit(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FTC_SBit create(long address, @Nullable ByteBuffer container) { + return new FTC_SBit(address, container); + } + + /** + * Creates a {@code FTC_SBit} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FTC_SBit(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code width} field. */ + @NativeType("FT_Byte") + public byte width() { return nwidth(address()); } + /** @return the value of the {@code height} field. */ + @NativeType("FT_Byte") + public byte height() { return nheight(address()); } + /** @return the value of the {@code left} field. */ + @NativeType("FT_Char") + public byte left() { return nleft(address()); } + /** @return the value of the {@code top} field. */ + @NativeType("FT_Char") + public byte top() { return ntop(address()); } + /** @return the value of the {@code format} field. */ + @NativeType("FT_Byte") + public byte format() { return nformat(address()); } + /** @return the value of the {@code max_grays} field. */ + @NativeType("FT_Byte") + public byte max_grays() { return nmax_grays(address()); } + /** @return the value of the {@code pitch} field. */ + @NativeType("FT_Short") + public short pitch() { return npitch(address()); } + /** @return the value of the {@code xadvance} field. */ + @NativeType("FT_Char") + public byte xadvance() { return nxadvance(address()); } + /** @return the value of the {@code yadvance} field. */ + @NativeType("FT_Char") + public byte yadvance() { return nyadvance(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code buffer} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("FT_Byte *") + public ByteBuffer buffer(int capacity) { return nbuffer(address(), capacity); } + + // ----------------------------------- + + /** Returns a new {@code FTC_SBit} instance for the specified memory address. */ + public static FTC_SBit create(long address) { + return new FTC_SBit(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FTC_SBit createSafe(long address) { + return address == NULL ? null : new FTC_SBit(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #width}. */ + public static byte nwidth(long struct) { return UNSAFE.getByte(null, struct + FTC_SBit.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static byte nheight(long struct) { return UNSAFE.getByte(null, struct + FTC_SBit.HEIGHT); } + /** Unsafe version of {@link #left}. */ + public static byte nleft(long struct) { return UNSAFE.getByte(null, struct + FTC_SBit.LEFT); } + /** Unsafe version of {@link #top}. */ + public static byte ntop(long struct) { return UNSAFE.getByte(null, struct + FTC_SBit.TOP); } + /** Unsafe version of {@link #format}. */ + public static byte nformat(long struct) { return UNSAFE.getByte(null, struct + FTC_SBit.FORMAT); } + /** Unsafe version of {@link #max_grays}. */ + public static byte nmax_grays(long struct) { return UNSAFE.getByte(null, struct + FTC_SBit.MAX_GRAYS); } + /** Unsafe version of {@link #pitch}. */ + public static short npitch(long struct) { return UNSAFE.getShort(null, struct + FTC_SBit.PITCH); } + /** Unsafe version of {@link #xadvance}. */ + public static byte nxadvance(long struct) { return UNSAFE.getByte(null, struct + FTC_SBit.XADVANCE); } + /** Unsafe version of {@link #yadvance}. */ + public static byte nyadvance(long struct) { return UNSAFE.getByte(null, struct + FTC_SBit.YADVANCE); } + /** Unsafe version of {@link #buffer(int) buffer}. */ + public static ByteBuffer nbuffer(long struct, int capacity) { return memByteBuffer(memGetAddress(struct + FTC_SBit.BUFFER), capacity); } + + // ----------------------------------- + + /** An array of {@link FTC_SBit} structs. */ + public static class Buffer extends StructBuffer { + + private static final FTC_SBit ELEMENT_FACTORY = FTC_SBit.create(-1L); + + /** + * Creates a new {@code FTC_SBit.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FTC_SBit#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FTC_SBit getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code width} field. */ + @NativeType("FT_Byte") + public byte width() { return FTC_SBit.nwidth(address()); } + /** @return the value of the {@code height} field. */ + @NativeType("FT_Byte") + public byte height() { return FTC_SBit.nheight(address()); } + /** @return the value of the {@code left} field. */ + @NativeType("FT_Char") + public byte left() { return FTC_SBit.nleft(address()); } + /** @return the value of the {@code top} field. */ + @NativeType("FT_Char") + public byte top() { return FTC_SBit.ntop(address()); } + /** @return the value of the {@code format} field. */ + @NativeType("FT_Byte") + public byte format() { return FTC_SBit.nformat(address()); } + /** @return the value of the {@code max_grays} field. */ + @NativeType("FT_Byte") + public byte max_grays() { return FTC_SBit.nmax_grays(address()); } + /** @return the value of the {@code pitch} field. */ + @NativeType("FT_Short") + public short pitch() { return FTC_SBit.npitch(address()); } + /** @return the value of the {@code xadvance} field. */ + @NativeType("FT_Char") + public byte xadvance() { return FTC_SBit.nxadvance(address()); } + /** @return the value of the {@code yadvance} field. */ + @NativeType("FT_Char") + public byte yadvance() { return FTC_SBit.nyadvance(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code buffer} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("FT_Byte *") + public ByteBuffer buffer(int capacity) { return FTC_SBit.nbuffer(address(), capacity); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Scaler.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Scaler.java new file mode 100644 index 000000000..563f5dd34 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FTC_Scaler.java @@ -0,0 +1,214 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used to describe a given character size in either pixels or points to the cache manager. See {@link FreeType#FTC_Manager_LookupSize}. + * + *

    Layout

    + * + *
    
    + * struct FTC_ScalerRec {
    + *     FTC_FaceID face_id;
    + *     FT_UInt width;
    + *     FT_UInt height;
    + *     FT_Int pixel;
    + *     FT_UInt x_res;
    + *     FT_UInt y_res;
    + * }
    + */ +@NativeType("struct FTC_ScalerRec") +public class FTC_Scaler extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FACE_ID, + WIDTH, + HEIGHT, + PIXEL, + X_RES, + Y_RES; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4), + __member(4), + __member(4), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FACE_ID = layout.offsetof(0); + WIDTH = layout.offsetof(1); + HEIGHT = layout.offsetof(2); + PIXEL = layout.offsetof(3); + X_RES = layout.offsetof(4); + Y_RES = layout.offsetof(5); + } + + protected FTC_Scaler(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FTC_Scaler create(long address, @Nullable ByteBuffer container) { + return new FTC_Scaler(address, container); + } + + /** + * Creates a {@code FTC_Scaler} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FTC_Scaler(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code face_id} field. */ + @NativeType("FTC_FaceID") + public long face_id() { return nface_id(address()); } + /** @return the value of the {@code width} field. */ + @NativeType("FT_UInt") + public int width() { return nwidth(address()); } + /** @return the value of the {@code height} field. */ + @NativeType("FT_UInt") + public int height() { return nheight(address()); } + /** @return the value of the {@code pixel} field. */ + @NativeType("FT_Int") + public int pixel() { return npixel(address()); } + /** @return the value of the {@code x_res} field. */ + @NativeType("FT_UInt") + public int x_res() { return nx_res(address()); } + /** @return the value of the {@code y_res} field. */ + @NativeType("FT_UInt") + public int y_res() { return ny_res(address()); } + + // ----------------------------------- + + /** Returns a new {@code FTC_Scaler} instance for the specified memory address. */ + public static FTC_Scaler create(long address) { + return new FTC_Scaler(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FTC_Scaler createSafe(long address) { + return address == NULL ? null : new FTC_Scaler(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #face_id}. */ + public static long nface_id(long struct) { return memGetAddress(struct + FTC_Scaler.FACE_ID); } + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + FTC_Scaler.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static int nheight(long struct) { return UNSAFE.getInt(null, struct + FTC_Scaler.HEIGHT); } + /** Unsafe version of {@link #pixel}. */ + public static int npixel(long struct) { return UNSAFE.getInt(null, struct + FTC_Scaler.PIXEL); } + /** Unsafe version of {@link #x_res}. */ + public static int nx_res(long struct) { return UNSAFE.getInt(null, struct + FTC_Scaler.X_RES); } + /** Unsafe version of {@link #y_res}. */ + public static int ny_res(long struct) { return UNSAFE.getInt(null, struct + FTC_Scaler.Y_RES); } + + // ----------------------------------- + + /** An array of {@link FTC_Scaler} structs. */ + public static class Buffer extends StructBuffer { + + private static final FTC_Scaler ELEMENT_FACTORY = FTC_Scaler.create(-1L); + + /** + * Creates a new {@code FTC_Scaler.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FTC_Scaler#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FTC_Scaler getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code face_id} field. */ + @NativeType("FTC_FaceID") + public long face_id() { return FTC_Scaler.nface_id(address()); } + /** @return the value of the {@code width} field. */ + @NativeType("FT_UInt") + public int width() { return FTC_Scaler.nwidth(address()); } + /** @return the value of the {@code height} field. */ + @NativeType("FT_UInt") + public int height() { return FTC_Scaler.nheight(address()); } + /** @return the value of the {@code pixel} field. */ + @NativeType("FT_Int") + public int pixel() { return FTC_Scaler.npixel(address()); } + /** @return the value of the {@code x_res} field. */ + @NativeType("FT_UInt") + public int x_res() { return FTC_Scaler.nx_res(address()); } + /** @return the value of the {@code y_res} field. */ + @NativeType("FT_UInt") + public int y_res() { return FTC_Scaler.ny_res(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Affine23.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Affine23.java new file mode 100644 index 000000000..fdf9fdd4c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Affine23.java @@ -0,0 +1,213 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used to store a 2x3 matrix. Coefficients are in 16.16 fixed-point format. + * + *

    Layout

    + * + *
    
    + * struct FT_Affine23 {
    + *     FT_Fixed xx;
    + *     FT_Fixed xy;
    + *     FT_Fixed dx;
    + *     FT_Fixed yx;
    + *     FT_Fixed yy;
    + *     FT_Fixed dy;
    + * }
    + */ +public class FT_Affine23 extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + XX, + XY, + DX, + YX, + YY, + DY; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + XX = layout.offsetof(0); + XY = layout.offsetof(1); + DX = layout.offsetof(2); + YX = layout.offsetof(3); + YY = layout.offsetof(4); + DY = layout.offsetof(5); + } + + protected FT_Affine23(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Affine23 create(long address, @Nullable ByteBuffer container) { + return new FT_Affine23(address, container); + } + + /** + * Creates a {@code FT_Affine23} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Affine23(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code xx} field. */ + @NativeType("FT_Fixed") + public long xx() { return nxx(address()); } + /** @return the value of the {@code xy} field. */ + @NativeType("FT_Fixed") + public long xy() { return nxy(address()); } + /** @return the value of the {@code dx} field. */ + @NativeType("FT_Fixed") + public long dx() { return ndx(address()); } + /** @return the value of the {@code yx} field. */ + @NativeType("FT_Fixed") + public long yx() { return nyx(address()); } + /** @return the value of the {@code yy} field. */ + @NativeType("FT_Fixed") + public long yy() { return nyy(address()); } + /** @return the value of the {@code dy} field. */ + @NativeType("FT_Fixed") + public long dy() { return ndy(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Affine23} instance for the specified memory address. */ + public static FT_Affine23 create(long address) { + return new FT_Affine23(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Affine23 createSafe(long address) { + return address == NULL ? null : new FT_Affine23(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #xx}. */ + public static long nxx(long struct) { return memGetCLong(struct + FT_Affine23.XX); } + /** Unsafe version of {@link #xy}. */ + public static long nxy(long struct) { return memGetCLong(struct + FT_Affine23.XY); } + /** Unsafe version of {@link #dx}. */ + public static long ndx(long struct) { return memGetCLong(struct + FT_Affine23.DX); } + /** Unsafe version of {@link #yx}. */ + public static long nyx(long struct) { return memGetCLong(struct + FT_Affine23.YX); } + /** Unsafe version of {@link #yy}. */ + public static long nyy(long struct) { return memGetCLong(struct + FT_Affine23.YY); } + /** Unsafe version of {@link #dy}. */ + public static long ndy(long struct) { return memGetCLong(struct + FT_Affine23.DY); } + + // ----------------------------------- + + /** An array of {@link FT_Affine23} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Affine23 ELEMENT_FACTORY = FT_Affine23.create(-1L); + + /** + * Creates a new {@code FT_Affine23.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Affine23#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Affine23 getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code xx} field. */ + @NativeType("FT_Fixed") + public long xx() { return FT_Affine23.nxx(address()); } + /** @return the value of the {@code xy} field. */ + @NativeType("FT_Fixed") + public long xy() { return FT_Affine23.nxy(address()); } + /** @return the value of the {@code dx} field. */ + @NativeType("FT_Fixed") + public long dx() { return FT_Affine23.ndx(address()); } + /** @return the value of the {@code yx} field. */ + @NativeType("FT_Fixed") + public long yx() { return FT_Affine23.nyx(address()); } + /** @return the value of the {@code yy} field. */ + @NativeType("FT_Fixed") + public long yy() { return FT_Affine23.nyy(address()); } + /** @return the value of the {@code dy} field. */ + @NativeType("FT_Fixed") + public long dy() { return FT_Affine23.ndy(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Alloc_Func.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Alloc_Func.java new file mode 100644 index 000000000..c712461bc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Alloc_Func.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     FT_Memory memory,
    + *     long size
    + * )
    + */ +public abstract class FT_Alloc_Func extends Callback implements FT_Alloc_FuncI { + + /** + * Creates a {@code FT_Alloc_Func} instance from the specified function pointer. + * + * @return the new {@code FT_Alloc_Func} + */ + public static FT_Alloc_Func create(long functionPointer) { + FT_Alloc_FuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Alloc_Func + ? (FT_Alloc_Func)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Alloc_Func createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Alloc_Func} instance that delegates to the specified {@code FT_Alloc_FuncI} instance. */ + public static FT_Alloc_Func create(FT_Alloc_FuncI instance) { + return instance instanceof FT_Alloc_Func + ? (FT_Alloc_Func)instance + : new Container(instance.address(), instance); + } + + protected FT_Alloc_Func() { + super(CIF); + } + + FT_Alloc_Func(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Alloc_Func { + + private final FT_Alloc_FuncI delegate; + + Container(long functionPointer, FT_Alloc_FuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public long invoke(long memory, long size) { + return delegate.invoke(memory, size); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Alloc_FuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Alloc_FuncI.java new file mode 100644 index 000000000..e5dea4c44 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Alloc_FuncI.java @@ -0,0 +1,49 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     FT_Memory memory,
    + *     long size
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Alloc_Func") +public interface FT_Alloc_FuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_pointer, + ffi_type_pointer, ffi_type_slong + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + long __result = invoke( + memGetAddress(memGetAddress(args)), + memGetCLong(memGetAddress(args + POINTER_SIZE)) + ); + apiClosureRetP(ret, __result); + } + + /** A function used to allocate {@code size} bytes from {@code memory}. */ + @NativeType("void *") long invoke(@NativeType("FT_Memory") long memory, long size); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_BBox.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_BBox.java new file mode 100644 index 000000000..138ccff7e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_BBox.java @@ -0,0 +1,327 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure used to hold an outline's bounding box, i.e., the coordinates of its extrema in the horizontal and vertical directions. + * + *

    Layout

    + * + *
    
    + * struct FT_BBox {
    + *     FT_Pos xMin;
    + *     FT_Pos yMin;
    + *     FT_Pos xMax;
    + *     FT_Pos yMax;
    + * }
    + */ +public class FT_BBox extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + XMIN, + YMIN, + XMAX, + YMAX; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + XMIN = layout.offsetof(0); + YMIN = layout.offsetof(1); + XMAX = layout.offsetof(2); + YMAX = layout.offsetof(3); + } + + protected FT_BBox(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_BBox create(long address, @Nullable ByteBuffer container) { + return new FT_BBox(address, container); + } + + /** + * Creates a {@code FT_BBox} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_BBox(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code xMin} field. */ + @NativeType("FT_Pos") + public long xMin() { return nxMin(address()); } + /** @return the value of the {@code yMin} field. */ + @NativeType("FT_Pos") + public long yMin() { return nyMin(address()); } + /** @return the value of the {@code xMax} field. */ + @NativeType("FT_Pos") + public long xMax() { return nxMax(address()); } + /** @return the value of the {@code yMax} field. */ + @NativeType("FT_Pos") + public long yMax() { return nyMax(address()); } + + /** Sets the specified value to the {@code xMin} field. */ + public FT_BBox xMin(@NativeType("FT_Pos") long value) { nxMin(address(), value); return this; } + /** Sets the specified value to the {@code yMin} field. */ + public FT_BBox yMin(@NativeType("FT_Pos") long value) { nyMin(address(), value); return this; } + /** Sets the specified value to the {@code xMax} field. */ + public FT_BBox xMax(@NativeType("FT_Pos") long value) { nxMax(address(), value); return this; } + /** Sets the specified value to the {@code yMax} field. */ + public FT_BBox yMax(@NativeType("FT_Pos") long value) { nyMax(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_BBox set( + long xMin, + long yMin, + long xMax, + long yMax + ) { + xMin(xMin); + yMin(yMin); + xMax(xMax); + yMax(yMax); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_BBox set(FT_BBox src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_BBox} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_BBox malloc() { + return new FT_BBox(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_BBox} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_BBox calloc() { + return new FT_BBox(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_BBox} instance allocated with {@link BufferUtils}. */ + public static FT_BBox create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_BBox(memAddress(container), container); + } + + /** Returns a new {@code FT_BBox} instance for the specified memory address. */ + public static FT_BBox create(long address) { + return new FT_BBox(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_BBox createSafe(long address) { + return address == NULL ? null : new FT_BBox(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_BBox} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_BBox malloc(MemoryStack stack) { + return new FT_BBox(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_BBox} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_BBox calloc(MemoryStack stack) { + return new FT_BBox(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #xMin}. */ + public static long nxMin(long struct) { return memGetCLong(struct + FT_BBox.XMIN); } + /** Unsafe version of {@link #yMin}. */ + public static long nyMin(long struct) { return memGetCLong(struct + FT_BBox.YMIN); } + /** Unsafe version of {@link #xMax}. */ + public static long nxMax(long struct) { return memGetCLong(struct + FT_BBox.XMAX); } + /** Unsafe version of {@link #yMax}. */ + public static long nyMax(long struct) { return memGetCLong(struct + FT_BBox.YMAX); } + + /** Unsafe version of {@link #xMin(long) xMin}. */ + public static void nxMin(long struct, long value) { memPutCLong(struct + FT_BBox.XMIN, value); } + /** Unsafe version of {@link #yMin(long) yMin}. */ + public static void nyMin(long struct, long value) { memPutCLong(struct + FT_BBox.YMIN, value); } + /** Unsafe version of {@link #xMax(long) xMax}. */ + public static void nxMax(long struct, long value) { memPutCLong(struct + FT_BBox.XMAX, value); } + /** Unsafe version of {@link #yMax(long) yMax}. */ + public static void nyMax(long struct, long value) { memPutCLong(struct + FT_BBox.YMAX, value); } + + // ----------------------------------- + + /** An array of {@link FT_BBox} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_BBox ELEMENT_FACTORY = FT_BBox.create(-1L); + + /** + * Creates a new {@code FT_BBox.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_BBox#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_BBox getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code xMin} field. */ + @NativeType("FT_Pos") + public long xMin() { return FT_BBox.nxMin(address()); } + /** @return the value of the {@code yMin} field. */ + @NativeType("FT_Pos") + public long yMin() { return FT_BBox.nyMin(address()); } + /** @return the value of the {@code xMax} field. */ + @NativeType("FT_Pos") + public long xMax() { return FT_BBox.nxMax(address()); } + /** @return the value of the {@code yMax} field. */ + @NativeType("FT_Pos") + public long yMax() { return FT_BBox.nyMax(address()); } + + /** Sets the specified value to the {@code xMin} field. */ + public Buffer xMin(@NativeType("FT_Pos") long value) { FT_BBox.nxMin(address(), value); return this; } + /** Sets the specified value to the {@code yMin} field. */ + public Buffer yMin(@NativeType("FT_Pos") long value) { FT_BBox.nyMin(address(), value); return this; } + /** Sets the specified value to the {@code xMax} field. */ + public Buffer xMax(@NativeType("FT_Pos") long value) { FT_BBox.nxMax(address(), value); return this; } + /** Sets the specified value to the {@code yMax} field. */ + public Buffer yMax(@NativeType("FT_Pos") long value) { FT_BBox.nyMax(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Bitmap.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Bitmap.java new file mode 100644 index 000000000..0f0c365c9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Bitmap.java @@ -0,0 +1,329 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure used to describe a bitmap or pixmap to the raster. Note that we now manage pixmaps of various depths through the {@code pixel_mode} field. + * + *

    Layout

    + * + *
    
    + * struct FT_Bitmap {
    + *     unsigned int rows;
    + *     unsigned int width;
    + *     int pitch;
    + *     unsigned char * buffer;
    + *     unsigned short num_grays;
    + *     unsigned char pixel_mode;
    + *     unsigned char palette_mode;
    + *     void * palette;
    + * }
    + */ +public class FT_Bitmap extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ROWS, + WIDTH, + PITCH, + BUFFER, + NUM_GRAYS, + PIXEL_MODE, + PALETTE_MODE, + PALETTE; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(2), + __member(1), + __member(1), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + ROWS = layout.offsetof(0); + WIDTH = layout.offsetof(1); + PITCH = layout.offsetof(2); + BUFFER = layout.offsetof(3); + NUM_GRAYS = layout.offsetof(4); + PIXEL_MODE = layout.offsetof(5); + PALETTE_MODE = layout.offsetof(6); + PALETTE = layout.offsetof(7); + } + + protected FT_Bitmap(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Bitmap create(long address, @Nullable ByteBuffer container) { + return new FT_Bitmap(address, container); + } + + /** + * Creates a {@code FT_Bitmap} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Bitmap(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code rows} field. */ + @NativeType("unsigned int") + public int rows() { return nrows(address()); } + /** @return the value of the {@code width} field. */ + @NativeType("unsigned int") + public int width() { return nwidth(address()); } + /** @return the value of the {@code pitch} field. */ + public int pitch() { return npitch(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code buffer} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("unsigned char *") + public ByteBuffer buffer(int capacity) { return nbuffer(address(), capacity); } + /** @return the value of the {@code num_grays} field. */ + @NativeType("unsigned short") + public short num_grays() { return nnum_grays(address()); } + /** @return the value of the {@code pixel_mode} field. */ + @NativeType("unsigned char") + public byte pixel_mode() { return npixel_mode(address()); } + /** @return the value of the {@code palette_mode} field. */ + @NativeType("unsigned char") + public byte palette_mode() { return npalette_mode(address()); } + /** @return the value of the {@code palette} field. */ + @NativeType("void *") + public long palette() { return npalette(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Bitmap} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Bitmap malloc() { + return new FT_Bitmap(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Bitmap} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Bitmap calloc() { + return new FT_Bitmap(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Bitmap} instance allocated with {@link BufferUtils}. */ + public static FT_Bitmap create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Bitmap(memAddress(container), container); + } + + /** Returns a new {@code FT_Bitmap} instance for the specified memory address. */ + public static FT_Bitmap create(long address) { + return new FT_Bitmap(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Bitmap createSafe(long address) { + return address == NULL ? null : new FT_Bitmap(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Bitmap} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Bitmap malloc(MemoryStack stack) { + return new FT_Bitmap(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Bitmap} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Bitmap calloc(MemoryStack stack) { + return new FT_Bitmap(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #rows}. */ + public static int nrows(long struct) { return UNSAFE.getInt(null, struct + FT_Bitmap.ROWS); } + /** Unsafe version of {@link #width}. */ + public static int nwidth(long struct) { return UNSAFE.getInt(null, struct + FT_Bitmap.WIDTH); } + /** Unsafe version of {@link #pitch}. */ + public static int npitch(long struct) { return UNSAFE.getInt(null, struct + FT_Bitmap.PITCH); } + /** Unsafe version of {@link #buffer(int) buffer}. */ + @Nullable public static ByteBuffer nbuffer(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + FT_Bitmap.BUFFER), capacity); } + /** Unsafe version of {@link #num_grays}. */ + public static short nnum_grays(long struct) { return UNSAFE.getShort(null, struct + FT_Bitmap.NUM_GRAYS); } + /** Unsafe version of {@link #pixel_mode}. */ + public static byte npixel_mode(long struct) { return UNSAFE.getByte(null, struct + FT_Bitmap.PIXEL_MODE); } + /** Unsafe version of {@link #palette_mode}. */ + public static byte npalette_mode(long struct) { return UNSAFE.getByte(null, struct + FT_Bitmap.PALETTE_MODE); } + /** Unsafe version of {@link #palette}. */ + public static long npalette(long struct) { return memGetAddress(struct + FT_Bitmap.PALETTE); } + + // ----------------------------------- + + /** An array of {@link FT_Bitmap} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Bitmap ELEMENT_FACTORY = FT_Bitmap.create(-1L); + + /** + * Creates a new {@code FT_Bitmap.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Bitmap#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Bitmap getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code rows} field. */ + @NativeType("unsigned int") + public int rows() { return FT_Bitmap.nrows(address()); } + /** @return the value of the {@code width} field. */ + @NativeType("unsigned int") + public int width() { return FT_Bitmap.nwidth(address()); } + /** @return the value of the {@code pitch} field. */ + public int pitch() { return FT_Bitmap.npitch(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code buffer} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("unsigned char *") + public ByteBuffer buffer(int capacity) { return FT_Bitmap.nbuffer(address(), capacity); } + /** @return the value of the {@code num_grays} field. */ + @NativeType("unsigned short") + public short num_grays() { return FT_Bitmap.nnum_grays(address()); } + /** @return the value of the {@code pixel_mode} field. */ + @NativeType("unsigned char") + public byte pixel_mode() { return FT_Bitmap.npixel_mode(address()); } + /** @return the value of the {@code palette_mode} field. */ + @NativeType("unsigned char") + public byte palette_mode() { return FT_Bitmap.npalette_mode(address()); } + /** @return the value of the {@code palette} field. */ + @NativeType("void *") + public long palette() { return FT_Bitmap.npalette(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_BitmapGlyph.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_BitmapGlyph.java new file mode 100644 index 000000000..0fc8efe53 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_BitmapGlyph.java @@ -0,0 +1,188 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used for bitmap glyph images. This really is a 'sub-class' of {@link FT_Glyph}. + * + *

    Layout

    + * + *
    
    + * struct FT_BitmapGlyphRec {
    + *     {@link FT_Glyph FT_GlyphRec} root;
    + *     FT_Int left;
    + *     FT_Int top;
    + *     {@link FT_Bitmap FT_Bitmap} bitmap;
    + * }
    + */ +@NativeType("struct FT_BitmapGlyphRec") +public class FT_BitmapGlyph extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ROOT, + LEFT, + TOP, + BITMAP; + + static { + Layout layout = __struct( + __member(FT_Glyph.SIZEOF, FT_Glyph.ALIGNOF), + __member(4), + __member(4), + __member(FT_Bitmap.SIZEOF, FT_Bitmap.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + ROOT = layout.offsetof(0); + LEFT = layout.offsetof(1); + TOP = layout.offsetof(2); + BITMAP = layout.offsetof(3); + } + + protected FT_BitmapGlyph(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_BitmapGlyph create(long address, @Nullable ByteBuffer container) { + return new FT_BitmapGlyph(address, container); + } + + /** + * Creates a {@code FT_BitmapGlyph} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_BitmapGlyph(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_Glyph} view of the {@code root} field. */ + @NativeType("FT_GlyphRec") + public FT_Glyph root() { return nroot(address()); } + /** @return the value of the {@code left} field. */ + @NativeType("FT_Int") + public int left() { return nleft(address()); } + /** @return the value of the {@code top} field. */ + @NativeType("FT_Int") + public int top() { return ntop(address()); } + /** @return a {@link FT_Bitmap} view of the {@code bitmap} field. */ + public FT_Bitmap bitmap() { return nbitmap(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_BitmapGlyph} instance for the specified memory address. */ + public static FT_BitmapGlyph create(long address) { + return new FT_BitmapGlyph(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_BitmapGlyph createSafe(long address) { + return address == NULL ? null : new FT_BitmapGlyph(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #root}. */ + public static FT_Glyph nroot(long struct) { return FT_Glyph.create(struct + FT_BitmapGlyph.ROOT); } + /** Unsafe version of {@link #left}. */ + public static int nleft(long struct) { return UNSAFE.getInt(null, struct + FT_BitmapGlyph.LEFT); } + /** Unsafe version of {@link #top}. */ + public static int ntop(long struct) { return UNSAFE.getInt(null, struct + FT_BitmapGlyph.TOP); } + /** Unsafe version of {@link #bitmap}. */ + public static FT_Bitmap nbitmap(long struct) { return FT_Bitmap.create(struct + FT_BitmapGlyph.BITMAP); } + + // ----------------------------------- + + /** An array of {@link FT_BitmapGlyph} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_BitmapGlyph ELEMENT_FACTORY = FT_BitmapGlyph.create(-1L); + + /** + * Creates a new {@code FT_BitmapGlyph.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_BitmapGlyph#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_BitmapGlyph getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_Glyph} view of the {@code root} field. */ + @NativeType("FT_GlyphRec") + public FT_Glyph root() { return FT_BitmapGlyph.nroot(address()); } + /** @return the value of the {@code left} field. */ + @NativeType("FT_Int") + public int left() { return FT_BitmapGlyph.nleft(address()); } + /** @return the value of the {@code top} field. */ + @NativeType("FT_Int") + public int top() { return FT_BitmapGlyph.ntop(address()); } + /** @return a {@link FT_Bitmap} view of the {@code bitmap} field. */ + public FT_Bitmap bitmap() { return FT_BitmapGlyph.nbitmap(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Bitmap_Size.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Bitmap_Size.java new file mode 100644 index 000000000..ca0a5f080 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Bitmap_Size.java @@ -0,0 +1,212 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * This structure models the metrics of a bitmap strike (i.e., a set of glyphs for a given point size and resolution) in a bitmap font. It + * is used for the {@code available_sizes} field of {@code FT_Face}. + * + *
    Note
    + * + *

    Windows FNT: The nominal size given in a FNT font is not reliable. If the driver finds it incorrect, it sets {@code size} to some calculated + * values, and {@code x_ppem} and {@code y_ppem} to the pixel width and height given in the font, respectively.

    + * + *
    Note
    + * + *

    TrueType embedded bitmaps: {@code size}, {@code width}, and {@code height} values are not contained in the bitmap strike itself. They are + * computed from the global font parameters.

    + * + *

    Layout

    + * + *
    
    + * struct FT_Bitmap_Size {
    + *     FT_Short {@link #height};
    + *     FT_Short {@link #width};
    + *     FT_Pos {@link #size};
    + *     FT_Pos {@link #x_ppem};
    + *     FT_Pos {@link #y_ppem};
    + * }
    + */ +public class FT_Bitmap_Size extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + HEIGHT, + WIDTH, + SIZE, + X_PPEM, + Y_PPEM; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + HEIGHT = layout.offsetof(0); + WIDTH = layout.offsetof(1); + SIZE = layout.offsetof(2); + X_PPEM = layout.offsetof(3); + Y_PPEM = layout.offsetof(4); + } + + protected FT_Bitmap_Size(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Bitmap_Size create(long address, @Nullable ByteBuffer container) { + return new FT_Bitmap_Size(address, container); + } + + /** + * Creates a {@code FT_Bitmap_Size} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Bitmap_Size(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the vertical distance, in pixels, between two consecutive baselines. It is always positive. */ + @NativeType("FT_Short") + public short height() { return nheight(address()); } + /** the average width, in pixels, of all glyphs in the strike */ + @NativeType("FT_Short") + public short width() { return nwidth(address()); } + /** the nominal size of the strike in 26.6 fractional points. This field is not very useful. */ + @NativeType("FT_Pos") + public long size() { return nsize(address()); } + /** the horizontal ppem (nominal width) in 26.6 fractional pixels */ + @NativeType("FT_Pos") + public long x_ppem() { return nx_ppem(address()); } + /** the vertical ppem (nominal height) in 26.6 fractional pixels */ + @NativeType("FT_Pos") + public long y_ppem() { return ny_ppem(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Bitmap_Size} instance for the specified memory address. */ + public static FT_Bitmap_Size create(long address) { + return new FT_Bitmap_Size(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Bitmap_Size createSafe(long address) { + return address == NULL ? null : new FT_Bitmap_Size(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #height}. */ + public static short nheight(long struct) { return UNSAFE.getShort(null, struct + FT_Bitmap_Size.HEIGHT); } + /** Unsafe version of {@link #width}. */ + public static short nwidth(long struct) { return UNSAFE.getShort(null, struct + FT_Bitmap_Size.WIDTH); } + /** Unsafe version of {@link #size}. */ + public static long nsize(long struct) { return memGetCLong(struct + FT_Bitmap_Size.SIZE); } + /** Unsafe version of {@link #x_ppem}. */ + public static long nx_ppem(long struct) { return memGetCLong(struct + FT_Bitmap_Size.X_PPEM); } + /** Unsafe version of {@link #y_ppem}. */ + public static long ny_ppem(long struct) { return memGetCLong(struct + FT_Bitmap_Size.Y_PPEM); } + + // ----------------------------------- + + /** An array of {@link FT_Bitmap_Size} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Bitmap_Size ELEMENT_FACTORY = FT_Bitmap_Size.create(-1L); + + /** + * Creates a new {@code FT_Bitmap_Size.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Bitmap_Size#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Bitmap_Size getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link FT_Bitmap_Size#height} field. */ + @NativeType("FT_Short") + public short height() { return FT_Bitmap_Size.nheight(address()); } + /** @return the value of the {@link FT_Bitmap_Size#width} field. */ + @NativeType("FT_Short") + public short width() { return FT_Bitmap_Size.nwidth(address()); } + /** @return the value of the {@link FT_Bitmap_Size#size} field. */ + @NativeType("FT_Pos") + public long size() { return FT_Bitmap_Size.nsize(address()); } + /** @return the value of the {@link FT_Bitmap_Size#x_ppem} field. */ + @NativeType("FT_Pos") + public long x_ppem() { return FT_Bitmap_Size.nx_ppem(address()); } + /** @return the value of the {@link FT_Bitmap_Size#y_ppem} field. */ + @NativeType("FT_Pos") + public long y_ppem() { return FT_Bitmap_Size.ny_ppem(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_COLR_Paint.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_COLR_Paint.java new file mode 100644 index 000000000..97fca11bc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_COLR_Paint.java @@ -0,0 +1,373 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A union object representing format and details of a paint table of a {@code COLR} v1 font. + * + *

    Layout

    + * + *
    
    + * struct FT_COLR_Paint {
    + *     FT_PaintFormat format;
    + *     union {
    + *         {@link FT_PaintColrLayers FT_PaintColrLayers} colr_layers;
    + *         {@link FT_PaintGlyph FT_PaintGlyph} glyph;
    + *         {@link FT_PaintSolid FT_PaintSolid} solid;
    + *         {@link FT_PaintLinearGradient FT_PaintLinearGradient} linear_gradient;
    + *         {@link FT_PaintRadialGradient FT_PaintRadialGradient} radial_gradient;
    + *         {@link FT_PaintSweepGradient FT_PaintSweepGradient} sweep_gradient;
    + *         {@link FT_PaintTransform FT_PaintTransform} transform;
    + *         {@link FT_PaintTranslate FT_PaintTranslate} translate;
    + *         {@link FT_PaintScale FT_PaintScale} scale;
    + *         {@link FT_PaintRotate FT_PaintRotate} rotate;
    + *         {@link FT_PaintSkew FT_PaintSkew} skew;
    + *         {@link FT_PaintComposite FT_PaintComposite} composite;
    + *         {@link FT_PaintColrGlyph FT_PaintColrGlyph} colr_glyph;
    + *     } u;
    + * }
    + */ +public class FT_COLR_Paint extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FORMAT, + U, + U_COLR_LAYERS, + U_GLYPH, + U_SOLID, + U_LINEAR_GRADIENT, + U_RADIAL_GRADIENT, + U_SWEEP_GRADIENT, + U_TRANSFORM, + U_TRANSLATE, + U_SCALE, + U_ROTATE, + U_SKEW, + U_COMPOSITE, + U_COLR_GLYPH; + + static { + Layout layout = __struct( + __member(4), + __union( + __member(FT_PaintColrLayers.SIZEOF, FT_PaintColrLayers.ALIGNOF), + __member(FT_PaintGlyph.SIZEOF, FT_PaintGlyph.ALIGNOF), + __member(FT_PaintSolid.SIZEOF, FT_PaintSolid.ALIGNOF), + __member(FT_PaintLinearGradient.SIZEOF, FT_PaintLinearGradient.ALIGNOF), + __member(FT_PaintRadialGradient.SIZEOF, FT_PaintRadialGradient.ALIGNOF), + __member(FT_PaintSweepGradient.SIZEOF, FT_PaintSweepGradient.ALIGNOF), + __member(FT_PaintTransform.SIZEOF, FT_PaintTransform.ALIGNOF), + __member(FT_PaintTranslate.SIZEOF, FT_PaintTranslate.ALIGNOF), + __member(FT_PaintScale.SIZEOF, FT_PaintScale.ALIGNOF), + __member(FT_PaintRotate.SIZEOF, FT_PaintRotate.ALIGNOF), + __member(FT_PaintSkew.SIZEOF, FT_PaintSkew.ALIGNOF), + __member(FT_PaintComposite.SIZEOF, FT_PaintComposite.ALIGNOF), + __member(FT_PaintColrGlyph.SIZEOF, FT_PaintColrGlyph.ALIGNOF) + ) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FORMAT = layout.offsetof(0); + U = layout.offsetof(1); + U_COLR_LAYERS = layout.offsetof(2); + U_GLYPH = layout.offsetof(3); + U_SOLID = layout.offsetof(4); + U_LINEAR_GRADIENT = layout.offsetof(5); + U_RADIAL_GRADIENT = layout.offsetof(6); + U_SWEEP_GRADIENT = layout.offsetof(7); + U_TRANSFORM = layout.offsetof(8); + U_TRANSLATE = layout.offsetof(9); + U_SCALE = layout.offsetof(10); + U_ROTATE = layout.offsetof(11); + U_SKEW = layout.offsetof(12); + U_COMPOSITE = layout.offsetof(13); + U_COLR_GLYPH = layout.offsetof(14); + } + + protected FT_COLR_Paint(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_COLR_Paint create(long address, @Nullable ByteBuffer container) { + return new FT_COLR_Paint(address, container); + } + + /** + * Creates a {@code FT_COLR_Paint} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_COLR_Paint(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code format} field. */ + @NativeType("FT_PaintFormat") + public int format() { return nformat(address()); } + /** @return a {@link FT_PaintColrLayers} view of the {@code u.colr_layers} field. */ + public FT_PaintColrLayers u_colr_layers() { return nu_colr_layers(address()); } + /** @return a {@link FT_PaintGlyph} view of the {@code u.glyph} field. */ + public FT_PaintGlyph u_glyph() { return nu_glyph(address()); } + /** @return a {@link FT_PaintSolid} view of the {@code u.solid} field. */ + public FT_PaintSolid u_solid() { return nu_solid(address()); } + /** @return a {@link FT_PaintLinearGradient} view of the {@code u.linear_gradient} field. */ + public FT_PaintLinearGradient u_linear_gradient() { return nu_linear_gradient(address()); } + /** @return a {@link FT_PaintRadialGradient} view of the {@code u.radial_gradient} field. */ + public FT_PaintRadialGradient u_radial_gradient() { return nu_radial_gradient(address()); } + /** @return a {@link FT_PaintSweepGradient} view of the {@code u.sweep_gradient} field. */ + public FT_PaintSweepGradient u_sweep_gradient() { return nu_sweep_gradient(address()); } + /** @return a {@link FT_PaintTransform} view of the {@code u.transform} field. */ + public FT_PaintTransform u_transform() { return nu_transform(address()); } + /** @return a {@link FT_PaintTranslate} view of the {@code u.translate} field. */ + public FT_PaintTranslate u_translate() { return nu_translate(address()); } + /** @return a {@link FT_PaintScale} view of the {@code u.scale} field. */ + public FT_PaintScale u_scale() { return nu_scale(address()); } + /** @return a {@link FT_PaintRotate} view of the {@code u.rotate} field. */ + public FT_PaintRotate u_rotate() { return nu_rotate(address()); } + /** @return a {@link FT_PaintSkew} view of the {@code u.skew} field. */ + public FT_PaintSkew u_skew() { return nu_skew(address()); } + /** @return a {@link FT_PaintComposite} view of the {@code u.composite} field. */ + public FT_PaintComposite u_composite() { return nu_composite(address()); } + /** @return a {@link FT_PaintColrGlyph} view of the {@code u.colr_glyph} field. */ + public FT_PaintColrGlyph u_colr_glyph() { return nu_colr_glyph(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_COLR_Paint} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_COLR_Paint malloc() { + return new FT_COLR_Paint(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_COLR_Paint} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_COLR_Paint calloc() { + return new FT_COLR_Paint(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_COLR_Paint} instance allocated with {@link BufferUtils}. */ + public static FT_COLR_Paint create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_COLR_Paint(memAddress(container), container); + } + + /** Returns a new {@code FT_COLR_Paint} instance for the specified memory address. */ + public static FT_COLR_Paint create(long address) { + return new FT_COLR_Paint(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_COLR_Paint createSafe(long address) { + return address == NULL ? null : new FT_COLR_Paint(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_COLR_Paint} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_COLR_Paint malloc(MemoryStack stack) { + return new FT_COLR_Paint(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_COLR_Paint} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_COLR_Paint calloc(MemoryStack stack) { + return new FT_COLR_Paint(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #format}. */ + public static int nformat(long struct) { return UNSAFE.getInt(null, struct + FT_COLR_Paint.FORMAT); } + /** Unsafe version of {@link #u_colr_layers}. */ + public static FT_PaintColrLayers nu_colr_layers(long struct) { return FT_PaintColrLayers.create(struct + FT_COLR_Paint.U_COLR_LAYERS); } + /** Unsafe version of {@link #u_glyph}. */ + public static FT_PaintGlyph nu_glyph(long struct) { return FT_PaintGlyph.create(struct + FT_COLR_Paint.U_GLYPH); } + /** Unsafe version of {@link #u_solid}. */ + public static FT_PaintSolid nu_solid(long struct) { return FT_PaintSolid.create(struct + FT_COLR_Paint.U_SOLID); } + /** Unsafe version of {@link #u_linear_gradient}. */ + public static FT_PaintLinearGradient nu_linear_gradient(long struct) { return FT_PaintLinearGradient.create(struct + FT_COLR_Paint.U_LINEAR_GRADIENT); } + /** Unsafe version of {@link #u_radial_gradient}. */ + public static FT_PaintRadialGradient nu_radial_gradient(long struct) { return FT_PaintRadialGradient.create(struct + FT_COLR_Paint.U_RADIAL_GRADIENT); } + /** Unsafe version of {@link #u_sweep_gradient}. */ + public static FT_PaintSweepGradient nu_sweep_gradient(long struct) { return FT_PaintSweepGradient.create(struct + FT_COLR_Paint.U_SWEEP_GRADIENT); } + /** Unsafe version of {@link #u_transform}. */ + public static FT_PaintTransform nu_transform(long struct) { return FT_PaintTransform.create(struct + FT_COLR_Paint.U_TRANSFORM); } + /** Unsafe version of {@link #u_translate}. */ + public static FT_PaintTranslate nu_translate(long struct) { return FT_PaintTranslate.create(struct + FT_COLR_Paint.U_TRANSLATE); } + /** Unsafe version of {@link #u_scale}. */ + public static FT_PaintScale nu_scale(long struct) { return FT_PaintScale.create(struct + FT_COLR_Paint.U_SCALE); } + /** Unsafe version of {@link #u_rotate}. */ + public static FT_PaintRotate nu_rotate(long struct) { return FT_PaintRotate.create(struct + FT_COLR_Paint.U_ROTATE); } + /** Unsafe version of {@link #u_skew}. */ + public static FT_PaintSkew nu_skew(long struct) { return FT_PaintSkew.create(struct + FT_COLR_Paint.U_SKEW); } + /** Unsafe version of {@link #u_composite}. */ + public static FT_PaintComposite nu_composite(long struct) { return FT_PaintComposite.create(struct + FT_COLR_Paint.U_COMPOSITE); } + /** Unsafe version of {@link #u_colr_glyph}. */ + public static FT_PaintColrGlyph nu_colr_glyph(long struct) { return FT_PaintColrGlyph.create(struct + FT_COLR_Paint.U_COLR_GLYPH); } + + // ----------------------------------- + + /** An array of {@link FT_COLR_Paint} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_COLR_Paint ELEMENT_FACTORY = FT_COLR_Paint.create(-1L); + + /** + * Creates a new {@code FT_COLR_Paint.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_COLR_Paint#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_COLR_Paint getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code format} field. */ + @NativeType("FT_PaintFormat") + public int format() { return FT_COLR_Paint.nformat(address()); } + /** @return a {@link FT_PaintColrLayers} view of the {@code u.colr_layers} field. */ + public FT_PaintColrLayers u_colr_layers() { return FT_COLR_Paint.nu_colr_layers(address()); } + /** @return a {@link FT_PaintGlyph} view of the {@code u.glyph} field. */ + public FT_PaintGlyph u_glyph() { return FT_COLR_Paint.nu_glyph(address()); } + /** @return a {@link FT_PaintSolid} view of the {@code u.solid} field. */ + public FT_PaintSolid u_solid() { return FT_COLR_Paint.nu_solid(address()); } + /** @return a {@link FT_PaintLinearGradient} view of the {@code u.linear_gradient} field. */ + public FT_PaintLinearGradient u_linear_gradient() { return FT_COLR_Paint.nu_linear_gradient(address()); } + /** @return a {@link FT_PaintRadialGradient} view of the {@code u.radial_gradient} field. */ + public FT_PaintRadialGradient u_radial_gradient() { return FT_COLR_Paint.nu_radial_gradient(address()); } + /** @return a {@link FT_PaintSweepGradient} view of the {@code u.sweep_gradient} field. */ + public FT_PaintSweepGradient u_sweep_gradient() { return FT_COLR_Paint.nu_sweep_gradient(address()); } + /** @return a {@link FT_PaintTransform} view of the {@code u.transform} field. */ + public FT_PaintTransform u_transform() { return FT_COLR_Paint.nu_transform(address()); } + /** @return a {@link FT_PaintTranslate} view of the {@code u.translate} field. */ + public FT_PaintTranslate u_translate() { return FT_COLR_Paint.nu_translate(address()); } + /** @return a {@link FT_PaintScale} view of the {@code u.scale} field. */ + public FT_PaintScale u_scale() { return FT_COLR_Paint.nu_scale(address()); } + /** @return a {@link FT_PaintRotate} view of the {@code u.rotate} field. */ + public FT_PaintRotate u_rotate() { return FT_COLR_Paint.nu_rotate(address()); } + /** @return a {@link FT_PaintSkew} view of the {@code u.skew} field. */ + public FT_PaintSkew u_skew() { return FT_COLR_Paint.nu_skew(address()); } + /** @return a {@link FT_PaintComposite} view of the {@code u.composite} field. */ + public FT_PaintComposite u_composite() { return FT_COLR_Paint.nu_composite(address()); } + /** @return a {@link FT_PaintColrGlyph} view of the {@code u.colr_glyph} field. */ + public FT_PaintColrGlyph u_colr_glyph() { return FT_COLR_Paint.nu_colr_glyph(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_CharMap.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_CharMap.java new file mode 100644 index 000000000..f6d543a3c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_CharMap.java @@ -0,0 +1,191 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The base charmap structure. + * + *

    Layout

    + * + *
    
    + * struct FT_CharMapRec {
    + *     {@link FT_Face FT_Face} {@link #face};
    + *     FT_Encoding {@link #encoding};
    + *     FT_UShort {@link #platform_id};
    + *     FT_UShort {@link #encoding_id};
    + * }
    + */ +@NativeType("struct FT_CharMapRec") +public class FT_CharMap extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FACE, + ENCODING, + PLATFORM_ID, + ENCODING_ID; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4), + __member(2), + __member(2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FACE = layout.offsetof(0); + ENCODING = layout.offsetof(1); + PLATFORM_ID = layout.offsetof(2); + ENCODING_ID = layout.offsetof(3); + } + + protected FT_CharMap(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_CharMap create(long address, @Nullable ByteBuffer container) { + return new FT_CharMap(address, container); + } + + /** + * Creates a {@code FT_CharMap} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_CharMap(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** a handle to the parent face object */ + public FT_Face face() { return nface(address()); } + /** an {@code FT_Encoding} tag identifying the charmap. Use this with {@link FreeType#FT_Select_Charmap Select_Charmap}. */ + @NativeType("FT_Encoding") + public int encoding() { return nencoding(address()); } + /** + * an ID number describing the platform for the following encoding ID. This comes directly from the TrueType specification and gets emulated for other + * formats. + */ + @NativeType("FT_UShort") + public short platform_id() { return nplatform_id(address()); } + /** a platform-specific encoding number. This also comes from the TrueType specification and gets emulated similarly. */ + @NativeType("FT_UShort") + public short encoding_id() { return nencoding_id(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_CharMap} instance for the specified memory address. */ + public static FT_CharMap create(long address) { + return new FT_CharMap(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_CharMap createSafe(long address) { + return address == NULL ? null : new FT_CharMap(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #face}. */ + public static FT_Face nface(long struct) { return FT_Face.create(memGetAddress(struct + FT_CharMap.FACE)); } + /** Unsafe version of {@link #encoding}. */ + public static int nencoding(long struct) { return UNSAFE.getInt(null, struct + FT_CharMap.ENCODING); } + /** Unsafe version of {@link #platform_id}. */ + public static short nplatform_id(long struct) { return UNSAFE.getShort(null, struct + FT_CharMap.PLATFORM_ID); } + /** Unsafe version of {@link #encoding_id}. */ + public static short nencoding_id(long struct) { return UNSAFE.getShort(null, struct + FT_CharMap.ENCODING_ID); } + + // ----------------------------------- + + /** An array of {@link FT_CharMap} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_CharMap ELEMENT_FACTORY = FT_CharMap.create(-1L); + + /** + * Creates a new {@code FT_CharMap.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_CharMap#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_CharMap getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_Face} view of the struct pointed to by the {@link FT_CharMap#face} field. */ + public FT_Face face() { return FT_CharMap.nface(address()); } + /** @return the value of the {@link FT_CharMap#encoding} field. */ + @NativeType("FT_Encoding") + public int encoding() { return FT_CharMap.nencoding(address()); } + /** @return the value of the {@link FT_CharMap#platform_id} field. */ + @NativeType("FT_UShort") + public short platform_id() { return FT_CharMap.nplatform_id(address()); } + /** @return the value of the {@link FT_CharMap#encoding_id} field. */ + @NativeType("FT_UShort") + public short encoding_id() { return FT_CharMap.nencoding_id(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ClipBox.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ClipBox.java new file mode 100644 index 000000000..c1411a9ac --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ClipBox.java @@ -0,0 +1,265 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure representing a {@code COLR} v1 {@code ClipBox} table. + * + *

    Layout

    + * + *
    
    + * struct FT_ClipBox {
    + *     {@link FT_Vector FT_Vector} bottom_left;
    + *     {@link FT_Vector FT_Vector} top_left;
    + *     {@link FT_Vector FT_Vector} top_right;
    + *     {@link FT_Vector FT_Vector} bottom_right;
    + * }
    + */ +public class FT_ClipBox extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + BOTTOM_LEFT, + TOP_LEFT, + TOP_RIGHT, + BOTTOM_RIGHT; + + static { + Layout layout = __struct( + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + BOTTOM_LEFT = layout.offsetof(0); + TOP_LEFT = layout.offsetof(1); + TOP_RIGHT = layout.offsetof(2); + BOTTOM_RIGHT = layout.offsetof(3); + } + + protected FT_ClipBox(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_ClipBox create(long address, @Nullable ByteBuffer container) { + return new FT_ClipBox(address, container); + } + + /** + * Creates a {@code FT_ClipBox} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_ClipBox(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_Vector} view of the {@code bottom_left} field. */ + public FT_Vector bottom_left() { return nbottom_left(address()); } + /** @return a {@link FT_Vector} view of the {@code top_left} field. */ + public FT_Vector top_left() { return ntop_left(address()); } + /** @return a {@link FT_Vector} view of the {@code top_right} field. */ + public FT_Vector top_right() { return ntop_right(address()); } + /** @return a {@link FT_Vector} view of the {@code bottom_right} field. */ + public FT_Vector bottom_right() { return nbottom_right(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_ClipBox} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_ClipBox malloc() { + return new FT_ClipBox(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_ClipBox} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_ClipBox calloc() { + return new FT_ClipBox(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_ClipBox} instance allocated with {@link BufferUtils}. */ + public static FT_ClipBox create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_ClipBox(memAddress(container), container); + } + + /** Returns a new {@code FT_ClipBox} instance for the specified memory address. */ + public static FT_ClipBox create(long address) { + return new FT_ClipBox(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_ClipBox createSafe(long address) { + return address == NULL ? null : new FT_ClipBox(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_ClipBox} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_ClipBox malloc(MemoryStack stack) { + return new FT_ClipBox(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_ClipBox} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_ClipBox calloc(MemoryStack stack) { + return new FT_ClipBox(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #bottom_left}. */ + public static FT_Vector nbottom_left(long struct) { return FT_Vector.create(struct + FT_ClipBox.BOTTOM_LEFT); } + /** Unsafe version of {@link #top_left}. */ + public static FT_Vector ntop_left(long struct) { return FT_Vector.create(struct + FT_ClipBox.TOP_LEFT); } + /** Unsafe version of {@link #top_right}. */ + public static FT_Vector ntop_right(long struct) { return FT_Vector.create(struct + FT_ClipBox.TOP_RIGHT); } + /** Unsafe version of {@link #bottom_right}. */ + public static FT_Vector nbottom_right(long struct) { return FT_Vector.create(struct + FT_ClipBox.BOTTOM_RIGHT); } + + // ----------------------------------- + + /** An array of {@link FT_ClipBox} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_ClipBox ELEMENT_FACTORY = FT_ClipBox.create(-1L); + + /** + * Creates a new {@code FT_ClipBox.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_ClipBox#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_ClipBox getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_Vector} view of the {@code bottom_left} field. */ + public FT_Vector bottom_left() { return FT_ClipBox.nbottom_left(address()); } + /** @return a {@link FT_Vector} view of the {@code top_left} field. */ + public FT_Vector top_left() { return FT_ClipBox.ntop_left(address()); } + /** @return a {@link FT_Vector} view of the {@code top_right} field. */ + public FT_Vector top_right() { return FT_ClipBox.ntop_right(address()); } + /** @return a {@link FT_Vector} view of the {@code bottom_right} field. */ + public FT_Vector bottom_right() { return FT_ClipBox.nbottom_right(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Color.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Color.java new file mode 100644 index 000000000..50a33d600 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Color.java @@ -0,0 +1,327 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * This structure models a BGRA color value of a {@code CPAL} palette entry. + * + *

    Layout

    + * + *
    
    + * struct FT_Color {
    + *     FT_Byte blue;
    + *     FT_Byte green;
    + *     FT_Byte red;
    + *     FT_Byte alpha;
    + * }
    + */ +public class FT_Color extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + BLUE, + GREEN, + RED, + ALPHA; + + static { + Layout layout = __struct( + __member(1), + __member(1), + __member(1), + __member(1) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + BLUE = layout.offsetof(0); + GREEN = layout.offsetof(1); + RED = layout.offsetof(2); + ALPHA = layout.offsetof(3); + } + + protected FT_Color(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Color create(long address, @Nullable ByteBuffer container) { + return new FT_Color(address, container); + } + + /** + * Creates a {@code FT_Color} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Color(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code blue} field. */ + @NativeType("FT_Byte") + public byte blue() { return nblue(address()); } + /** @return the value of the {@code green} field. */ + @NativeType("FT_Byte") + public byte green() { return ngreen(address()); } + /** @return the value of the {@code red} field. */ + @NativeType("FT_Byte") + public byte red() { return nred(address()); } + /** @return the value of the {@code alpha} field. */ + @NativeType("FT_Byte") + public byte alpha() { return nalpha(address()); } + + /** Sets the specified value to the {@code blue} field. */ + public FT_Color blue(@NativeType("FT_Byte") byte value) { nblue(address(), value); return this; } + /** Sets the specified value to the {@code green} field. */ + public FT_Color green(@NativeType("FT_Byte") byte value) { ngreen(address(), value); return this; } + /** Sets the specified value to the {@code red} field. */ + public FT_Color red(@NativeType("FT_Byte") byte value) { nred(address(), value); return this; } + /** Sets the specified value to the {@code alpha} field. */ + public FT_Color alpha(@NativeType("FT_Byte") byte value) { nalpha(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Color set( + byte blue, + byte green, + byte red, + byte alpha + ) { + blue(blue); + green(green); + red(red); + alpha(alpha); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Color set(FT_Color src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Color} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Color malloc() { + return new FT_Color(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Color} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Color calloc() { + return new FT_Color(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Color} instance allocated with {@link BufferUtils}. */ + public static FT_Color create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Color(memAddress(container), container); + } + + /** Returns a new {@code FT_Color} instance for the specified memory address. */ + public static FT_Color create(long address) { + return new FT_Color(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Color createSafe(long address) { + return address == NULL ? null : new FT_Color(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Color} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Color malloc(MemoryStack stack) { + return new FT_Color(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Color} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Color calloc(MemoryStack stack) { + return new FT_Color(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #blue}. */ + public static byte nblue(long struct) { return UNSAFE.getByte(null, struct + FT_Color.BLUE); } + /** Unsafe version of {@link #green}. */ + public static byte ngreen(long struct) { return UNSAFE.getByte(null, struct + FT_Color.GREEN); } + /** Unsafe version of {@link #red}. */ + public static byte nred(long struct) { return UNSAFE.getByte(null, struct + FT_Color.RED); } + /** Unsafe version of {@link #alpha}. */ + public static byte nalpha(long struct) { return UNSAFE.getByte(null, struct + FT_Color.ALPHA); } + + /** Unsafe version of {@link #blue(byte) blue}. */ + public static void nblue(long struct, byte value) { UNSAFE.putByte(null, struct + FT_Color.BLUE, value); } + /** Unsafe version of {@link #green(byte) green}. */ + public static void ngreen(long struct, byte value) { UNSAFE.putByte(null, struct + FT_Color.GREEN, value); } + /** Unsafe version of {@link #red(byte) red}. */ + public static void nred(long struct, byte value) { UNSAFE.putByte(null, struct + FT_Color.RED, value); } + /** Unsafe version of {@link #alpha(byte) alpha}. */ + public static void nalpha(long struct, byte value) { UNSAFE.putByte(null, struct + FT_Color.ALPHA, value); } + + // ----------------------------------- + + /** An array of {@link FT_Color} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Color ELEMENT_FACTORY = FT_Color.create(-1L); + + /** + * Creates a new {@code FT_Color.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Color#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Color getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code blue} field. */ + @NativeType("FT_Byte") + public byte blue() { return FT_Color.nblue(address()); } + /** @return the value of the {@code green} field. */ + @NativeType("FT_Byte") + public byte green() { return FT_Color.ngreen(address()); } + /** @return the value of the {@code red} field. */ + @NativeType("FT_Byte") + public byte red() { return FT_Color.nred(address()); } + /** @return the value of the {@code alpha} field. */ + @NativeType("FT_Byte") + public byte alpha() { return FT_Color.nalpha(address()); } + + /** Sets the specified value to the {@code blue} field. */ + public Buffer blue(@NativeType("FT_Byte") byte value) { FT_Color.nblue(address(), value); return this; } + /** Sets the specified value to the {@code green} field. */ + public Buffer green(@NativeType("FT_Byte") byte value) { FT_Color.ngreen(address(), value); return this; } + /** Sets the specified value to the {@code red} field. */ + public Buffer red(@NativeType("FT_Byte") byte value) { FT_Color.nred(address(), value); return this; } + /** Sets the specified value to the {@code alpha} field. */ + public Buffer alpha(@NativeType("FT_Byte") byte value) { FT_Color.nalpha(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorIndex.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorIndex.java new file mode 100644 index 000000000..48c239231 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorIndex.java @@ -0,0 +1,165 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code ColorIndex} value of the {@code COLR} v1 extensions. + * + *

    Layout

    + * + *
    
    + * struct FT_ColorIndex {
    + *     FT_UInt16 palette_index;
    + *     FT_F2Dot14 alpha;
    + * }
    + */ +public class FT_ColorIndex extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PALETTE_INDEX, + ALPHA; + + static { + Layout layout = __struct( + __member(2), + __member(2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PALETTE_INDEX = layout.offsetof(0); + ALPHA = layout.offsetof(1); + } + + protected FT_ColorIndex(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_ColorIndex create(long address, @Nullable ByteBuffer container) { + return new FT_ColorIndex(address, container); + } + + /** + * Creates a {@code FT_ColorIndex} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_ColorIndex(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code palette_index} field. */ + @NativeType("FT_UInt16") + public short palette_index() { return npalette_index(address()); } + /** @return the value of the {@code alpha} field. */ + @NativeType("FT_F2Dot14") + public short alpha() { return nalpha(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_ColorIndex} instance for the specified memory address. */ + public static FT_ColorIndex create(long address) { + return new FT_ColorIndex(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_ColorIndex createSafe(long address) { + return address == NULL ? null : new FT_ColorIndex(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #palette_index}. */ + public static short npalette_index(long struct) { return UNSAFE.getShort(null, struct + FT_ColorIndex.PALETTE_INDEX); } + /** Unsafe version of {@link #alpha}. */ + public static short nalpha(long struct) { return UNSAFE.getShort(null, struct + FT_ColorIndex.ALPHA); } + + // ----------------------------------- + + /** An array of {@link FT_ColorIndex} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_ColorIndex ELEMENT_FACTORY = FT_ColorIndex.create(-1L); + + /** + * Creates a new {@code FT_ColorIndex.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_ColorIndex#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_ColorIndex getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code palette_index} field. */ + @NativeType("FT_UInt16") + public short palette_index() { return FT_ColorIndex.npalette_index(address()); } + /** @return the value of the {@code alpha} field. */ + @NativeType("FT_F2Dot14") + public short alpha() { return FT_ColorIndex.nalpha(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorLine.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorLine.java new file mode 100644 index 000000000..c0b3712ab --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorLine.java @@ -0,0 +1,163 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code ColorLine} value of the {@code COLR} v1 extensions. + * + *

    Layout

    + * + *
    
    + * struct FT_ColorLine {
    + *     FT_PaintExtend extend;
    + *     {@link FT_ColorStopIterator FT_ColorStopIterator} color_stop_iterator;
    + * }
    + */ +public class FT_ColorLine extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + EXTEND, + COLOR_STOP_ITERATOR; + + static { + Layout layout = __struct( + __member(4), + __member(FT_ColorStopIterator.SIZEOF, FT_ColorStopIterator.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + EXTEND = layout.offsetof(0); + COLOR_STOP_ITERATOR = layout.offsetof(1); + } + + protected FT_ColorLine(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_ColorLine create(long address, @Nullable ByteBuffer container) { + return new FT_ColorLine(address, container); + } + + /** + * Creates a {@code FT_ColorLine} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_ColorLine(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code extend} field. */ + @NativeType("FT_PaintExtend") + public int extend() { return nextend(address()); } + /** @return a {@link FT_ColorStopIterator} view of the {@code color_stop_iterator} field. */ + public FT_ColorStopIterator color_stop_iterator() { return ncolor_stop_iterator(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_ColorLine} instance for the specified memory address. */ + public static FT_ColorLine create(long address) { + return new FT_ColorLine(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_ColorLine createSafe(long address) { + return address == NULL ? null : new FT_ColorLine(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #extend}. */ + public static int nextend(long struct) { return UNSAFE.getInt(null, struct + FT_ColorLine.EXTEND); } + /** Unsafe version of {@link #color_stop_iterator}. */ + public static FT_ColorStopIterator ncolor_stop_iterator(long struct) { return FT_ColorStopIterator.create(struct + FT_ColorLine.COLOR_STOP_ITERATOR); } + + // ----------------------------------- + + /** An array of {@link FT_ColorLine} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_ColorLine ELEMENT_FACTORY = FT_ColorLine.create(-1L); + + /** + * Creates a new {@code FT_ColorLine.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_ColorLine#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_ColorLine getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code extend} field. */ + @NativeType("FT_PaintExtend") + public int extend() { return FT_ColorLine.nextend(address()); } + /** @return a {@link FT_ColorStopIterator} view of the {@code color_stop_iterator} field. */ + public FT_ColorStopIterator color_stop_iterator() { return FT_ColorLine.ncolor_stop_iterator(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorStop.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorStop.java new file mode 100644 index 000000000..3b3b8399c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorStop.java @@ -0,0 +1,247 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure representing a {@code ColorStop} value of the 'COLR' v1 extensions. + * + *

    Layout

    + * + *
    
    + * struct FT_ColorStop {
    + *     FT_Fixed stop_offset;
    + *     {@link FT_ColorIndex FT_ColorIndex} color;
    + * }
    + */ +public class FT_ColorStop extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + STOP_OFFSET, + COLOR; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(FT_ColorIndex.SIZEOF, FT_ColorIndex.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + STOP_OFFSET = layout.offsetof(0); + COLOR = layout.offsetof(1); + } + + protected FT_ColorStop(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_ColorStop create(long address, @Nullable ByteBuffer container) { + return new FT_ColorStop(address, container); + } + + /** + * Creates a {@code FT_ColorStop} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_ColorStop(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code stop_offset} field. */ + @NativeType("FT_Fixed") + public long stop_offset() { return nstop_offset(address()); } + /** @return a {@link FT_ColorIndex} view of the {@code color} field. */ + public FT_ColorIndex color() { return ncolor(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_ColorStop} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_ColorStop malloc() { + return new FT_ColorStop(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_ColorStop} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_ColorStop calloc() { + return new FT_ColorStop(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_ColorStop} instance allocated with {@link BufferUtils}. */ + public static FT_ColorStop create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_ColorStop(memAddress(container), container); + } + + /** Returns a new {@code FT_ColorStop} instance for the specified memory address. */ + public static FT_ColorStop create(long address) { + return new FT_ColorStop(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_ColorStop createSafe(long address) { + return address == NULL ? null : new FT_ColorStop(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_ColorStop} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_ColorStop malloc(MemoryStack stack) { + return new FT_ColorStop(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_ColorStop} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_ColorStop calloc(MemoryStack stack) { + return new FT_ColorStop(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #stop_offset}. */ + public static long nstop_offset(long struct) { return memGetCLong(struct + FT_ColorStop.STOP_OFFSET); } + /** Unsafe version of {@link #color}. */ + public static FT_ColorIndex ncolor(long struct) { return FT_ColorIndex.create(struct + FT_ColorStop.COLOR); } + + // ----------------------------------- + + /** An array of {@link FT_ColorStop} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_ColorStop ELEMENT_FACTORY = FT_ColorStop.create(-1L); + + /** + * Creates a new {@code FT_ColorStop.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_ColorStop#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_ColorStop getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code stop_offset} field. */ + @NativeType("FT_Fixed") + public long stop_offset() { return FT_ColorStop.nstop_offset(address()); } + /** @return a {@link FT_ColorIndex} view of the {@code color} field. */ + public FT_ColorIndex color() { return FT_ColorStop.ncolor(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorStopIterator.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorStopIterator.java new file mode 100644 index 000000000..b6a852b27 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ColorStopIterator.java @@ -0,0 +1,283 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * This iterator object is needed for {@link FreeType#FT_Get_Colorline_Stops Get_Colorline_Stops}. + * + *

    Layout

    + * + *
    
    + * struct FT_ColorStopIterator {
    + *     FT_UInt num_color_stops;
    + *     FT_UInt current_color_stop;
    + *     FT_Byte * p;
    + *     FT_Bool read_variable;
    + * }
    + */ +public class FT_ColorStopIterator extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NUM_COLOR_STOPS, + CURRENT_COLOR_STOP, + P, + READ_VARIABLE; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(1) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NUM_COLOR_STOPS = layout.offsetof(0); + CURRENT_COLOR_STOP = layout.offsetof(1); + P = layout.offsetof(2); + READ_VARIABLE = layout.offsetof(3); + } + + protected FT_ColorStopIterator(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_ColorStopIterator create(long address, @Nullable ByteBuffer container) { + return new FT_ColorStopIterator(address, container); + } + + /** + * Creates a {@code FT_ColorStopIterator} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_ColorStopIterator(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code num_color_stops} field. */ + @NativeType("FT_UInt") + public int num_color_stops() { return nnum_color_stops(address()); } + /** @return the value of the {@code current_color_stop} field. */ + @NativeType("FT_UInt") + public int current_color_stop() { return ncurrent_color_stop(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code p} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("FT_Byte *") + public ByteBuffer p(int capacity) { return np(address(), capacity); } + /** @return the value of the {@code read_variable} field. */ + @NativeType("FT_Bool") + public boolean read_variable() { return nread_variable(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_ColorStopIterator} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_ColorStopIterator malloc() { + return new FT_ColorStopIterator(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_ColorStopIterator} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_ColorStopIterator calloc() { + return new FT_ColorStopIterator(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_ColorStopIterator} instance allocated with {@link BufferUtils}. */ + public static FT_ColorStopIterator create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_ColorStopIterator(memAddress(container), container); + } + + /** Returns a new {@code FT_ColorStopIterator} instance for the specified memory address. */ + public static FT_ColorStopIterator create(long address) { + return new FT_ColorStopIterator(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_ColorStopIterator createSafe(long address) { + return address == NULL ? null : new FT_ColorStopIterator(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_ColorStopIterator} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_ColorStopIterator malloc(MemoryStack stack) { + return new FT_ColorStopIterator(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_ColorStopIterator} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_ColorStopIterator calloc(MemoryStack stack) { + return new FT_ColorStopIterator(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #num_color_stops}. */ + public static int nnum_color_stops(long struct) { return UNSAFE.getInt(null, struct + FT_ColorStopIterator.NUM_COLOR_STOPS); } + /** Unsafe version of {@link #current_color_stop}. */ + public static int ncurrent_color_stop(long struct) { return UNSAFE.getInt(null, struct + FT_ColorStopIterator.CURRENT_COLOR_STOP); } + /** Unsafe version of {@link #p(int) p}. */ + @Nullable public static ByteBuffer np(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + FT_ColorStopIterator.P), capacity); } + /** Unsafe version of {@link #read_variable}. */ + public static boolean nread_variable(long struct) { return UNSAFE.getByte(null, struct + FT_ColorStopIterator.READ_VARIABLE) != 0; } + + // ----------------------------------- + + /** An array of {@link FT_ColorStopIterator} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_ColorStopIterator ELEMENT_FACTORY = FT_ColorStopIterator.create(-1L); + + /** + * Creates a new {@code FT_ColorStopIterator.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_ColorStopIterator#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_ColorStopIterator getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code num_color_stops} field. */ + @NativeType("FT_UInt") + public int num_color_stops() { return FT_ColorStopIterator.nnum_color_stops(address()); } + /** @return the value of the {@code current_color_stop} field. */ + @NativeType("FT_UInt") + public int current_color_stop() { return FT_ColorStopIterator.ncurrent_color_stop(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code p} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("FT_Byte *") + public ByteBuffer p(int capacity) { return FT_ColorStopIterator.np(address(), capacity); } + /** @return the value of the {@code read_variable} field. */ + @NativeType("FT_Bool") + public boolean read_variable() { return FT_ColorStopIterator.nread_variable(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Data.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Data.java new file mode 100644 index 000000000..3484e6a6a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Data.java @@ -0,0 +1,282 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Read-only binary data represented as a pointer and a length. + * + *

    Layout

    + * + *
    
    + * struct FT_Data {
    + *     FT_Byte const * pointer;
    + *     FT_UInt length;
    + * }
    + */ +public class FT_Data extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + POINTER, + LENGTH; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + POINTER = layout.offsetof(0); + LENGTH = layout.offsetof(1); + } + + protected FT_Data(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Data create(long address, @Nullable ByteBuffer container) { + return new FT_Data(address, container); + } + + /** + * Creates a {@code FT_Data} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Data(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code pointer} field. */ + @NativeType("FT_Byte const *") + public ByteBuffer pointer() { return npointer(address()); } + /** @return the value of the {@code length} field. */ + @NativeType("FT_UInt") + public int length() { return nlength(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@code pointer} field. */ + public FT_Data pointer(@NativeType("FT_Byte const *") ByteBuffer value) { npointer(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Data set(FT_Data src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Data} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Data malloc() { + return new FT_Data(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Data} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Data calloc() { + return new FT_Data(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Data} instance allocated with {@link BufferUtils}. */ + public static FT_Data create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Data(memAddress(container), container); + } + + /** Returns a new {@code FT_Data} instance for the specified memory address. */ + public static FT_Data create(long address) { + return new FT_Data(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Data createSafe(long address) { + return address == NULL ? null : new FT_Data(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Data} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Data malloc(MemoryStack stack) { + return new FT_Data(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Data} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Data calloc(MemoryStack stack) { + return new FT_Data(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #pointer() pointer}. */ + public static ByteBuffer npointer(long struct) { return memByteBuffer(memGetAddress(struct + FT_Data.POINTER), nlength(struct)); } + /** Unsafe version of {@link #length}. */ + public static int nlength(long struct) { return UNSAFE.getInt(null, struct + FT_Data.LENGTH); } + + /** Unsafe version of {@link #pointer(ByteBuffer) pointer}. */ + public static void npointer(long struct, ByteBuffer value) { memPutAddress(struct + FT_Data.POINTER, memAddress(value)); nlength(struct, value.remaining()); } + /** Sets the specified value to the {@code length} field of the specified {@code struct}. */ + public static void nlength(long struct, int value) { UNSAFE.putInt(null, struct + FT_Data.LENGTH, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + FT_Data.POINTER)); + } + + // ----------------------------------- + + /** An array of {@link FT_Data} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Data ELEMENT_FACTORY = FT_Data.create(-1L); + + /** + * Creates a new {@code FT_Data.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Data#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Data getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code pointer} field. */ + @NativeType("FT_Byte const *") + public ByteBuffer pointer() { return FT_Data.npointer(address()); } + /** @return the value of the {@code length} field. */ + @NativeType("FT_UInt") + public int length() { return FT_Data.nlength(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@code pointer} field. */ + public Buffer pointer(@NativeType("FT_Byte const *") ByteBuffer value) { FT_Data.npointer(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_DebugHook_Func.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_DebugHook_Func.java new file mode 100644 index 000000000..4e755a4d4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_DebugHook_Func.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     void *arg
    + * )
    + */ +public abstract class FT_DebugHook_Func extends Callback implements FT_DebugHook_FuncI { + + /** + * Creates a {@code FT_DebugHook_Func} instance from the specified function pointer. + * + * @return the new {@code FT_DebugHook_Func} + */ + public static FT_DebugHook_Func create(long functionPointer) { + FT_DebugHook_FuncI instance = Callback.get(functionPointer); + return instance instanceof FT_DebugHook_Func + ? (FT_DebugHook_Func)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_DebugHook_Func createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_DebugHook_Func} instance that delegates to the specified {@code FT_DebugHook_FuncI} instance. */ + public static FT_DebugHook_Func create(FT_DebugHook_FuncI instance) { + return instance instanceof FT_DebugHook_Func + ? (FT_DebugHook_Func)instance + : new Container(instance.address(), instance); + } + + protected FT_DebugHook_Func() { + super(CIF); + } + + FT_DebugHook_Func(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_DebugHook_Func { + + private final FT_DebugHook_FuncI delegate; + + Container(long functionPointer, FT_DebugHook_FuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long arg) { + return delegate.invoke(arg); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_DebugHook_FuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_DebugHook_FuncI.java new file mode 100644 index 000000000..c4518d08b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_DebugHook_FuncI.java @@ -0,0 +1,47 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     void *arg
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_DebugHook_Func") +public interface FT_DebugHook_FuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)) + ); + apiClosureRet(ret, __result); + } + + /** A drop-in replacement (or rather a wrapper) for the bytecode or charstring interpreter's main loop function. */ + @NativeType("FT_Error") int invoke(@NativeType("void *") long arg); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Face.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Face.java new file mode 100644 index 000000000..23c30bf9b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Face.java @@ -0,0 +1,480 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * FreeType root face class structure. A face object models a typeface in a font file. + * + *

    Layout

    + * + *
    
    + * struct FT_FaceRec {
    + *     FT_Long num_faces;
    + *     FT_Long face_index;
    + *     FT_Long face_flags;
    + *     FT_Long style_flags;
    + *     FT_Long num_glyphs;
    + *     FT_String * family_name;
    + *     FT_String * style_name;
    + *     FT_Int num_fixed_sizes;
    + *     {@link FT_Bitmap_Size FT_Bitmap_Size} * available_sizes;
    + *     FT_Int num_charmaps;
    + *     {@link FT_CharMap FT_CharMap} * charmaps;
    + *     {@link FT_Generic FT_Generic} generic;
    + *     {@link FT_BBox FT_BBox} bbox;
    + *     FT_UShort units_per_EM;
    + *     FT_Short ascender;
    + *     FT_Short descender;
    + *     FT_Short height;
    + *     FT_Short max_advance_width;
    + *     FT_Short max_advance_height;
    + *     FT_Short underline_position;
    + *     FT_Short underline_thickness;
    + *     {@link FT_GlyphSlot FT_GlyphSlot} glyph;
    + *     {@link FT_Size FT_Size} size;
    + *     {@link FT_CharMap FT_CharMap} charmap;
    + *     FT_Driver driver;
    + *     FT_Memory memory;
    + *     {@link FT_Stream FT_Stream} stream;
    + *     {@link FT_List FT_ListRec} sizes_list;
    + *     {@link FT_Generic FT_Generic} autohint;
    + *     void * extensions;
    + *     FT_Face_Internal internal;
    + * }
    + */ +@NativeType("struct FT_FaceRec") +public class FT_Face extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NUM_FACES, + FACE_INDEX, + FACE_FLAGS, + STYLE_FLAGS, + NUM_GLYPHS, + FAMILY_NAME, + STYLE_NAME, + NUM_FIXED_SIZES, + AVAILABLE_SIZES, + NUM_CHARMAPS, + CHARMAPS, + GENERIC, + BBOX, + UNITS_PER_EM, + ASCENDER, + DESCENDER, + HEIGHT, + MAX_ADVANCE_WIDTH, + MAX_ADVANCE_HEIGHT, + UNDERLINE_POSITION, + UNDERLINE_THICKNESS, + GLYPH, + SIZE, + CHARMAP, + DRIVER, + MEMORY, + STREAM, + SIZES_LIST, + AUTOHINT, + EXTENSIONS, + INTERNAL; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(FT_Generic.SIZEOF, FT_Generic.ALIGNOF), + __member(FT_BBox.SIZEOF, FT_BBox.ALIGNOF), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(FT_List.SIZEOF, FT_List.ALIGNOF), + __member(FT_Generic.SIZEOF, FT_Generic.ALIGNOF), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NUM_FACES = layout.offsetof(0); + FACE_INDEX = layout.offsetof(1); + FACE_FLAGS = layout.offsetof(2); + STYLE_FLAGS = layout.offsetof(3); + NUM_GLYPHS = layout.offsetof(4); + FAMILY_NAME = layout.offsetof(5); + STYLE_NAME = layout.offsetof(6); + NUM_FIXED_SIZES = layout.offsetof(7); + AVAILABLE_SIZES = layout.offsetof(8); + NUM_CHARMAPS = layout.offsetof(9); + CHARMAPS = layout.offsetof(10); + GENERIC = layout.offsetof(11); + BBOX = layout.offsetof(12); + UNITS_PER_EM = layout.offsetof(13); + ASCENDER = layout.offsetof(14); + DESCENDER = layout.offsetof(15); + HEIGHT = layout.offsetof(16); + MAX_ADVANCE_WIDTH = layout.offsetof(17); + MAX_ADVANCE_HEIGHT = layout.offsetof(18); + UNDERLINE_POSITION = layout.offsetof(19); + UNDERLINE_THICKNESS = layout.offsetof(20); + GLYPH = layout.offsetof(21); + SIZE = layout.offsetof(22); + CHARMAP = layout.offsetof(23); + DRIVER = layout.offsetof(24); + MEMORY = layout.offsetof(25); + STREAM = layout.offsetof(26); + SIZES_LIST = layout.offsetof(27); + AUTOHINT = layout.offsetof(28); + EXTENSIONS = layout.offsetof(29); + INTERNAL = layout.offsetof(30); + } + + protected FT_Face(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Face create(long address, @Nullable ByteBuffer container) { + return new FT_Face(address, container); + } + + /** + * Creates a {@code FT_Face} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Face(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code num_faces} field. */ + @NativeType("FT_Long") + public long num_faces() { return nnum_faces(address()); } + /** @return the value of the {@code face_index} field. */ + @NativeType("FT_Long") + public long face_index() { return nface_index(address()); } + /** @return the value of the {@code face_flags} field. */ + @NativeType("FT_Long") + public long face_flags() { return nface_flags(address()); } + /** @return the value of the {@code style_flags} field. */ + @NativeType("FT_Long") + public long style_flags() { return nstyle_flags(address()); } + /** @return the value of the {@code num_glyphs} field. */ + @NativeType("FT_Long") + public long num_glyphs() { return nnum_glyphs(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code family_name} field. */ + @NativeType("FT_String *") + public ByteBuffer family_name() { return nfamily_name(address()); } + /** @return the null-terminated string pointed to by the {@code family_name} field. */ + @NativeType("FT_String *") + public String family_nameString() { return nfamily_nameString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code style_name} field. */ + @NativeType("FT_String *") + public ByteBuffer style_name() { return nstyle_name(address()); } + /** @return the null-terminated string pointed to by the {@code style_name} field. */ + @NativeType("FT_String *") + public String style_nameString() { return nstyle_nameString(address()); } + /** @return the value of the {@code num_fixed_sizes} field. */ + @NativeType("FT_Int") + public int num_fixed_sizes() { return nnum_fixed_sizes(address()); } + /** @return a {@link FT_Bitmap_Size.Buffer} view of the struct array pointed to by the {@code available_sizes} field. */ + @Nullable + @NativeType("FT_Bitmap_Size *") + public FT_Bitmap_Size.Buffer available_sizes() { return navailable_sizes(address()); } + /** @return the value of the {@code num_charmaps} field. */ + @NativeType("FT_Int") + public int num_charmaps() { return nnum_charmaps(address()); } + /** @return a {@link PointerBuffer} view of the data pointed to by the {@code charmaps} field. */ + @NativeType("FT_CharMap *") + public PointerBuffer charmaps() { return ncharmaps(address()); } + /** @return a {@link FT_Generic} view of the {@code generic} field. */ + public FT_Generic generic() { return ngeneric(address()); } + /** @return a {@link FT_BBox} view of the {@code bbox} field. */ + public FT_BBox bbox() { return nbbox(address()); } + /** @return the value of the {@code units_per_EM} field. */ + @NativeType("FT_UShort") + public short units_per_EM() { return nunits_per_EM(address()); } + /** @return the value of the {@code ascender} field. */ + @NativeType("FT_Short") + public short ascender() { return nascender(address()); } + /** @return the value of the {@code descender} field. */ + @NativeType("FT_Short") + public short descender() { return ndescender(address()); } + /** @return the value of the {@code height} field. */ + @NativeType("FT_Short") + public short height() { return nheight(address()); } + /** @return the value of the {@code max_advance_width} field. */ + @NativeType("FT_Short") + public short max_advance_width() { return nmax_advance_width(address()); } + /** @return the value of the {@code max_advance_height} field. */ + @NativeType("FT_Short") + public short max_advance_height() { return nmax_advance_height(address()); } + /** @return the value of the {@code underline_position} field. */ + @NativeType("FT_Short") + public short underline_position() { return nunderline_position(address()); } + /** @return the value of the {@code underline_thickness} field. */ + @NativeType("FT_Short") + public short underline_thickness() { return nunderline_thickness(address()); } + /** @return a {@link FT_GlyphSlot} view of the struct pointed to by the {@code glyph} field. */ + @Nullable + public FT_GlyphSlot glyph() { return nglyph(address()); } + /** @return a {@link FT_Size} view of the struct pointed to by the {@code size} field. */ + @Nullable + public FT_Size size() { return nsize(address()); } + /** @return a {@link FT_CharMap} view of the struct pointed to by the {@code charmap} field. */ + @Nullable + public FT_CharMap charmap() { return ncharmap(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Face} instance for the specified memory address. */ + public static FT_Face create(long address) { + return new FT_Face(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Face createSafe(long address) { + return address == NULL ? null : new FT_Face(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #num_faces}. */ + public static long nnum_faces(long struct) { return memGetCLong(struct + FT_Face.NUM_FACES); } + /** Unsafe version of {@link #face_index}. */ + public static long nface_index(long struct) { return memGetCLong(struct + FT_Face.FACE_INDEX); } + /** Unsafe version of {@link #face_flags}. */ + public static long nface_flags(long struct) { return memGetCLong(struct + FT_Face.FACE_FLAGS); } + /** Unsafe version of {@link #style_flags}. */ + public static long nstyle_flags(long struct) { return memGetCLong(struct + FT_Face.STYLE_FLAGS); } + /** Unsafe version of {@link #num_glyphs}. */ + public static long nnum_glyphs(long struct) { return memGetCLong(struct + FT_Face.NUM_GLYPHS); } + /** Unsafe version of {@link #family_name}. */ + public static ByteBuffer nfamily_name(long struct) { return memByteBufferNT1(memGetAddress(struct + FT_Face.FAMILY_NAME)); } + /** Unsafe version of {@link #family_nameString}. */ + public static String nfamily_nameString(long struct) { return memUTF8(memGetAddress(struct + FT_Face.FAMILY_NAME)); } + /** Unsafe version of {@link #style_name}. */ + public static ByteBuffer nstyle_name(long struct) { return memByteBufferNT1(memGetAddress(struct + FT_Face.STYLE_NAME)); } + /** Unsafe version of {@link #style_nameString}. */ + public static String nstyle_nameString(long struct) { return memUTF8(memGetAddress(struct + FT_Face.STYLE_NAME)); } + /** Unsafe version of {@link #num_fixed_sizes}. */ + public static int nnum_fixed_sizes(long struct) { return UNSAFE.getInt(null, struct + FT_Face.NUM_FIXED_SIZES); } + /** Unsafe version of {@link #available_sizes}. */ + @Nullable public static FT_Bitmap_Size.Buffer navailable_sizes(long struct) { return FT_Bitmap_Size.createSafe(memGetAddress(struct + FT_Face.AVAILABLE_SIZES), nnum_fixed_sizes(struct)); } + /** Unsafe version of {@link #num_charmaps}. */ + public static int nnum_charmaps(long struct) { return UNSAFE.getInt(null, struct + FT_Face.NUM_CHARMAPS); } + /** Unsafe version of {@link #charmaps() charmaps}. */ + public static PointerBuffer ncharmaps(long struct) { return memPointerBuffer(memGetAddress(struct + FT_Face.CHARMAPS), nnum_charmaps(struct)); } + /** Unsafe version of {@link #generic}. */ + public static FT_Generic ngeneric(long struct) { return FT_Generic.create(struct + FT_Face.GENERIC); } + /** Unsafe version of {@link #bbox}. */ + public static FT_BBox nbbox(long struct) { return FT_BBox.create(struct + FT_Face.BBOX); } + /** Unsafe version of {@link #units_per_EM}. */ + public static short nunits_per_EM(long struct) { return UNSAFE.getShort(null, struct + FT_Face.UNITS_PER_EM); } + /** Unsafe version of {@link #ascender}. */ + public static short nascender(long struct) { return UNSAFE.getShort(null, struct + FT_Face.ASCENDER); } + /** Unsafe version of {@link #descender}. */ + public static short ndescender(long struct) { return UNSAFE.getShort(null, struct + FT_Face.DESCENDER); } + /** Unsafe version of {@link #height}. */ + public static short nheight(long struct) { return UNSAFE.getShort(null, struct + FT_Face.HEIGHT); } + /** Unsafe version of {@link #max_advance_width}. */ + public static short nmax_advance_width(long struct) { return UNSAFE.getShort(null, struct + FT_Face.MAX_ADVANCE_WIDTH); } + /** Unsafe version of {@link #max_advance_height}. */ + public static short nmax_advance_height(long struct) { return UNSAFE.getShort(null, struct + FT_Face.MAX_ADVANCE_HEIGHT); } + /** Unsafe version of {@link #underline_position}. */ + public static short nunderline_position(long struct) { return UNSAFE.getShort(null, struct + FT_Face.UNDERLINE_POSITION); } + /** Unsafe version of {@link #underline_thickness}. */ + public static short nunderline_thickness(long struct) { return UNSAFE.getShort(null, struct + FT_Face.UNDERLINE_THICKNESS); } + /** Unsafe version of {@link #glyph}. */ + @Nullable public static FT_GlyphSlot nglyph(long struct) { return FT_GlyphSlot.createSafe(memGetAddress(struct + FT_Face.GLYPH)); } + /** Unsafe version of {@link #size}. */ + @Nullable public static FT_Size nsize(long struct) { return FT_Size.createSafe(memGetAddress(struct + FT_Face.SIZE)); } + /** Unsafe version of {@link #charmap}. */ + @Nullable public static FT_CharMap ncharmap(long struct) { return FT_CharMap.createSafe(memGetAddress(struct + FT_Face.CHARMAP)); } + public static long ndriver(long struct) { return memGetAddress(struct + FT_Face.DRIVER); } + @Nullable public static FT_Memory nmemory(long struct) { return FT_Memory.createSafe(memGetAddress(struct + FT_Face.MEMORY)); } + @Nullable public static FT_Stream nstream$(long struct) { return FT_Stream.createSafe(memGetAddress(struct + FT_Face.STREAM)); } + public static FT_List nsizes_list(long struct) { return FT_List.create(struct + FT_Face.SIZES_LIST); } + public static FT_Generic nautohint(long struct) { return FT_Generic.create(struct + FT_Face.AUTOHINT); } + public static long nextensions(long struct) { return memGetAddress(struct + FT_Face.EXTENSIONS); } + public static long ninternal(long struct) { return memGetAddress(struct + FT_Face.INTERNAL); } + + // ----------------------------------- + + /** An array of {@link FT_Face} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Face ELEMENT_FACTORY = FT_Face.create(-1L); + + /** + * Creates a new {@code FT_Face.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Face#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Face getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code num_faces} field. */ + @NativeType("FT_Long") + public long num_faces() { return FT_Face.nnum_faces(address()); } + /** @return the value of the {@code face_index} field. */ + @NativeType("FT_Long") + public long face_index() { return FT_Face.nface_index(address()); } + /** @return the value of the {@code face_flags} field. */ + @NativeType("FT_Long") + public long face_flags() { return FT_Face.nface_flags(address()); } + /** @return the value of the {@code style_flags} field. */ + @NativeType("FT_Long") + public long style_flags() { return FT_Face.nstyle_flags(address()); } + /** @return the value of the {@code num_glyphs} field. */ + @NativeType("FT_Long") + public long num_glyphs() { return FT_Face.nnum_glyphs(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code family_name} field. */ + @NativeType("FT_String *") + public ByteBuffer family_name() { return FT_Face.nfamily_name(address()); } + /** @return the null-terminated string pointed to by the {@code family_name} field. */ + @NativeType("FT_String *") + public String family_nameString() { return FT_Face.nfamily_nameString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code style_name} field. */ + @NativeType("FT_String *") + public ByteBuffer style_name() { return FT_Face.nstyle_name(address()); } + /** @return the null-terminated string pointed to by the {@code style_name} field. */ + @NativeType("FT_String *") + public String style_nameString() { return FT_Face.nstyle_nameString(address()); } + /** @return the value of the {@code num_fixed_sizes} field. */ + @NativeType("FT_Int") + public int num_fixed_sizes() { return FT_Face.nnum_fixed_sizes(address()); } + /** @return a {@link FT_Bitmap_Size.Buffer} view of the struct array pointed to by the {@code available_sizes} field. */ + @Nullable + @NativeType("FT_Bitmap_Size *") + public FT_Bitmap_Size.Buffer available_sizes() { return FT_Face.navailable_sizes(address()); } + /** @return the value of the {@code num_charmaps} field. */ + @NativeType("FT_Int") + public int num_charmaps() { return FT_Face.nnum_charmaps(address()); } + /** @return a {@link PointerBuffer} view of the data pointed to by the {@code charmaps} field. */ + @NativeType("FT_CharMap *") + public PointerBuffer charmaps() { return FT_Face.ncharmaps(address()); } + /** @return a {@link FT_Generic} view of the {@code generic} field. */ + public FT_Generic generic() { return FT_Face.ngeneric(address()); } + /** @return a {@link FT_BBox} view of the {@code bbox} field. */ + public FT_BBox bbox() { return FT_Face.nbbox(address()); } + /** @return the value of the {@code units_per_EM} field. */ + @NativeType("FT_UShort") + public short units_per_EM() { return FT_Face.nunits_per_EM(address()); } + /** @return the value of the {@code ascender} field. */ + @NativeType("FT_Short") + public short ascender() { return FT_Face.nascender(address()); } + /** @return the value of the {@code descender} field. */ + @NativeType("FT_Short") + public short descender() { return FT_Face.ndescender(address()); } + /** @return the value of the {@code height} field. */ + @NativeType("FT_Short") + public short height() { return FT_Face.nheight(address()); } + /** @return the value of the {@code max_advance_width} field. */ + @NativeType("FT_Short") + public short max_advance_width() { return FT_Face.nmax_advance_width(address()); } + /** @return the value of the {@code max_advance_height} field. */ + @NativeType("FT_Short") + public short max_advance_height() { return FT_Face.nmax_advance_height(address()); } + /** @return the value of the {@code underline_position} field. */ + @NativeType("FT_Short") + public short underline_position() { return FT_Face.nunderline_position(address()); } + /** @return the value of the {@code underline_thickness} field. */ + @NativeType("FT_Short") + public short underline_thickness() { return FT_Face.nunderline_thickness(address()); } + /** @return a {@link FT_GlyphSlot} view of the struct pointed to by the {@code glyph} field. */ + @Nullable + public FT_GlyphSlot glyph() { return FT_Face.nglyph(address()); } + /** @return a {@link FT_Size} view of the struct pointed to by the {@code size} field. */ + @Nullable + public FT_Size size() { return FT_Face.nsize(address()); } + /** @return a {@link FT_CharMap} view of the struct pointed to by the {@code charmap} field. */ + @Nullable + public FT_CharMap charmap() { return FT_Face.ncharmap(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Free_Func.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Free_Func.java new file mode 100644 index 000000000..dc0a5e03b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Free_Func.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Memory memory,
    + *     void *block
    + * )
    + */ +public abstract class FT_Free_Func extends Callback implements FT_Free_FuncI { + + /** + * Creates a {@code FT_Free_Func} instance from the specified function pointer. + * + * @return the new {@code FT_Free_Func} + */ + public static FT_Free_Func create(long functionPointer) { + FT_Free_FuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Free_Func + ? (FT_Free_Func)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Free_Func createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Free_Func} instance that delegates to the specified {@code FT_Free_FuncI} instance. */ + public static FT_Free_Func create(FT_Free_FuncI instance) { + return instance instanceof FT_Free_Func + ? (FT_Free_Func)instance + : new Container(instance.address(), instance); + } + + protected FT_Free_Func() { + super(CIF); + } + + FT_Free_Func(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Free_Func { + + private final FT_Free_FuncI delegate; + + Container(long functionPointer, FT_Free_FuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long memory, long block) { + delegate.invoke(memory, block); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Free_FuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Free_FuncI.java new file mode 100644 index 000000000..a018838cf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Free_FuncI.java @@ -0,0 +1,48 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Memory memory,
    + *     void *block
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Free_Func") +public interface FT_Free_FuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + } + + /** A function used to release a given block of memory. */ + void invoke(@NativeType("FT_Memory") long memory, @NativeType("void *") long block); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic.java new file mode 100644 index 000000000..2124f7f91 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic.java @@ -0,0 +1,296 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * Client applications often need to associate their own data to a variety of FreeType core objects. For example, a text layout API might + * want to associate a glyph cache to a given size object. + * + *

    Layout

    + * + *
    
    + * struct FT_Generic {
    + *     void * data;
    + *     {@link FT_Generic_FinalizerI FT_Generic_Finalizer} finalizer;
    + * }
    + */ +public class FT_Generic extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + DATA, + FINALIZER; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + DATA = layout.offsetof(0); + FINALIZER = layout.offsetof(1); + } + + protected FT_Generic(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Generic create(long address, @Nullable ByteBuffer container) { + return new FT_Generic(address, container); + } + + /** + * Creates a {@code FT_Generic} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Generic(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code data} field. */ + @NativeType("void *") + public long data() { return ndata(address()); } + /** @return the value of the {@code finalizer} field. */ + public FT_Generic_Finalizer finalizer() { return nfinalizer(address()); } + + /** Sets the specified value to the {@code data} field. */ + public FT_Generic data(@NativeType("void *") long value) { ndata(address(), value); return this; } + /** Sets the specified value to the {@code finalizer} field. */ + public FT_Generic finalizer(@NativeType("FT_Generic_Finalizer") FT_Generic_FinalizerI value) { nfinalizer(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Generic set( + long data, + FT_Generic_FinalizerI finalizer + ) { + data(data); + finalizer(finalizer); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Generic set(FT_Generic src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Generic} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Generic malloc() { + return new FT_Generic(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Generic} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Generic calloc() { + return new FT_Generic(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Generic} instance allocated with {@link BufferUtils}. */ + public static FT_Generic create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Generic(memAddress(container), container); + } + + /** Returns a new {@code FT_Generic} instance for the specified memory address. */ + public static FT_Generic create(long address) { + return new FT_Generic(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Generic createSafe(long address) { + return address == NULL ? null : new FT_Generic(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Generic} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Generic malloc(MemoryStack stack) { + return new FT_Generic(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Generic} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Generic calloc(MemoryStack stack) { + return new FT_Generic(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #data}. */ + public static long ndata(long struct) { return memGetAddress(struct + FT_Generic.DATA); } + /** Unsafe version of {@link #finalizer}. */ + public static FT_Generic_Finalizer nfinalizer(long struct) { return FT_Generic_Finalizer.create(memGetAddress(struct + FT_Generic.FINALIZER)); } + + /** Unsafe version of {@link #data(long) data}. */ + public static void ndata(long struct, long value) { memPutAddress(struct + FT_Generic.DATA, value); } + /** Unsafe version of {@link #finalizer(FT_Generic_FinalizerI) finalizer}. */ + public static void nfinalizer(long struct, FT_Generic_FinalizerI value) { memPutAddress(struct + FT_Generic.FINALIZER, value.address()); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + FT_Generic.FINALIZER)); + } + + // ----------------------------------- + + /** An array of {@link FT_Generic} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Generic ELEMENT_FACTORY = FT_Generic.create(-1L); + + /** + * Creates a new {@code FT_Generic.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Generic#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Generic getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code data} field. */ + @NativeType("void *") + public long data() { return FT_Generic.ndata(address()); } + /** @return the value of the {@code finalizer} field. */ + public FT_Generic_Finalizer finalizer() { return FT_Generic.nfinalizer(address()); } + + /** Sets the specified value to the {@code data} field. */ + public Buffer data(@NativeType("void *") long value) { FT_Generic.ndata(address(), value); return this; } + /** Sets the specified value to the {@code finalizer} field. */ + public Buffer finalizer(@NativeType("FT_Generic_Finalizer") FT_Generic_FinalizerI value) { FT_Generic.nfinalizer(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic_Finalizer.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic_Finalizer.java new file mode 100644 index 000000000..e7a98696e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic_Finalizer.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     void *object
    + * )
    + */ +public abstract class FT_Generic_Finalizer extends Callback implements FT_Generic_FinalizerI { + + /** + * Creates a {@code FT_Generic_Finalizer} instance from the specified function pointer. + * + * @return the new {@code FT_Generic_Finalizer} + */ + public static FT_Generic_Finalizer create(long functionPointer) { + FT_Generic_FinalizerI instance = Callback.get(functionPointer); + return instance instanceof FT_Generic_Finalizer + ? (FT_Generic_Finalizer)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Generic_Finalizer createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Generic_Finalizer} instance that delegates to the specified {@code FT_Generic_FinalizerI} instance. */ + public static FT_Generic_Finalizer create(FT_Generic_FinalizerI instance) { + return instance instanceof FT_Generic_Finalizer + ? (FT_Generic_Finalizer)instance + : new Container(instance.address(), instance); + } + + protected FT_Generic_Finalizer() { + super(CIF); + } + + FT_Generic_Finalizer(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Generic_Finalizer { + + private final FT_Generic_FinalizerI delegate; + + Container(long functionPointer, FT_Generic_FinalizerI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long object) { + delegate.invoke(object); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic_FinalizerI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic_FinalizerI.java new file mode 100644 index 000000000..dd032aceb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Generic_FinalizerI.java @@ -0,0 +1,50 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     void *object
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Generic_Finalizer") +public interface FT_Generic_FinalizerI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)) + ); + } + + /** + * Describe a function used to destroy the {@code client} data of any FreeType object. + * + * @param object the address of the FreeType object that is under finalization. Its client data is accessed through its {@code generic} field. + */ + void invoke(@NativeType("void *") long object); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Glyph.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Glyph.java new file mode 100644 index 000000000..77fbbcff7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Glyph.java @@ -0,0 +1,181 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The root glyph structure contains a given glyph image plus its advance width in 16.16 fixed-point format. + * + *

    Layout

    + * + *
    
    + * struct FT_GlyphRec {
    + *     FT_Library library;
    + *     FT_Glyph_Class const * clazz;
    + *     FT_Glyph_Format format;
    + *     {@link FT_Vector FT_Vector} advance;
    + * }
    + */ +@NativeType("struct FT_GlyphRec") +public class FT_Glyph extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + LIBRARY, + CLAZZ, + FORMAT, + ADVANCE; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + LIBRARY = layout.offsetof(0); + CLAZZ = layout.offsetof(1); + FORMAT = layout.offsetof(2); + ADVANCE = layout.offsetof(3); + } + + protected FT_Glyph(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Glyph create(long address, @Nullable ByteBuffer container) { + return new FT_Glyph(address, container); + } + + /** + * Creates a {@code FT_Glyph} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Glyph(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code library} field. */ + @NativeType("FT_Library") + public long library() { return nlibrary(address()); } + /** @return the value of the {@code format} field. */ + @NativeType("FT_Glyph_Format") + public int format() { return nformat(address()); } + /** @return a {@link FT_Vector} view of the {@code advance} field. */ + public FT_Vector advance() { return nadvance(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Glyph} instance for the specified memory address. */ + public static FT_Glyph create(long address) { + return new FT_Glyph(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Glyph createSafe(long address) { + return address == NULL ? null : new FT_Glyph(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #library}. */ + public static long nlibrary(long struct) { return memGetAddress(struct + FT_Glyph.LIBRARY); } + public static long nclazz(long struct) { return memGetAddress(struct + FT_Glyph.CLAZZ); } + /** Unsafe version of {@link #format}. */ + public static int nformat(long struct) { return UNSAFE.getInt(null, struct + FT_Glyph.FORMAT); } + /** Unsafe version of {@link #advance}. */ + public static FT_Vector nadvance(long struct) { return FT_Vector.create(struct + FT_Glyph.ADVANCE); } + + // ----------------------------------- + + /** An array of {@link FT_Glyph} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Glyph ELEMENT_FACTORY = FT_Glyph.create(-1L); + + /** + * Creates a new {@code FT_Glyph.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Glyph#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Glyph getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code library} field. */ + @NativeType("FT_Library") + public long library() { return FT_Glyph.nlibrary(address()); } + /** @return the value of the {@code format} field. */ + @NativeType("FT_Glyph_Format") + public int format() { return FT_Glyph.nformat(address()); } + /** @return a {@link FT_Vector} view of the {@code advance} field. */ + public FT_Vector advance() { return FT_Glyph.nadvance(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_GlyphSlot.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_GlyphSlot.java new file mode 100644 index 000000000..cf0f922d4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_GlyphSlot.java @@ -0,0 +1,352 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * FreeType root glyph slot class structure. A glyph slot is a container where individual glyphs can be loaded, be they in outline or bitmap format. + * + *

    Layout

    + * + *
    
    + * struct FT_GlyphSlotRec {
    + *     FT_Library library;
    + *     {@link FT_Face FT_Face} face;
    + *     {@link FT_GlyphSlot FT_GlyphSlot} next;
    + *     FT_UInt glyph_index;
    + *     {@link FT_Generic FT_Generic} generic;
    + *     {@link FT_Glyph_Metrics FT_Glyph_Metrics} metrics;
    + *     FT_Fixed linearHoriAdvance;
    + *     FT_Fixed linearVertAdvance;
    + *     {@link FT_Vector FT_Vector} advance;
    + *     FT_Glyph_Format format;
    + *     {@link FT_Bitmap FT_Bitmap} bitmap;
    + *     FT_Int bitmap_left;
    + *     FT_Int bitmap_top;
    + *     {@link FT_Outline FT_Outline} outline;
    + *     FT_UInt num_subglyphs;
    + *     FT_SubGlyph subglyphs;
    + *     void * control_data;
    + *     long control_len;
    + *     FT_Pos lsb_delta;
    + *     FT_Pos rsb_delta;
    + *     void * other;
    + *     FT_Slot_Internal internal;
    + * }
    + */ +@NativeType("struct FT_GlyphSlotRec") +public class FT_GlyphSlot extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + LIBRARY, + FACE, + NEXT, + GLYPH_INDEX, + GENERIC, + METRICS, + LINEARHORIADVANCE, + LINEARVERTADVANCE, + ADVANCE, + FORMAT, + BITMAP, + BITMAP_LEFT, + BITMAP_TOP, + OUTLINE, + NUM_SUBGLYPHS, + SUBGLYPHS, + CONTROL_DATA, + CONTROL_LEN, + LSB_DELTA, + RSB_DELTA, + OTHER, + INTERNAL; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(FT_Generic.SIZEOF, FT_Generic.ALIGNOF), + __member(FT_Glyph_Metrics.SIZEOF, FT_Glyph_Metrics.ALIGNOF), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF), + __member(4), + __member(FT_Bitmap.SIZEOF, FT_Bitmap.ALIGNOF), + __member(4), + __member(4), + __member(FT_Outline.SIZEOF, FT_Outline.ALIGNOF), + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + LIBRARY = layout.offsetof(0); + FACE = layout.offsetof(1); + NEXT = layout.offsetof(2); + GLYPH_INDEX = layout.offsetof(3); + GENERIC = layout.offsetof(4); + METRICS = layout.offsetof(5); + LINEARHORIADVANCE = layout.offsetof(6); + LINEARVERTADVANCE = layout.offsetof(7); + ADVANCE = layout.offsetof(8); + FORMAT = layout.offsetof(9); + BITMAP = layout.offsetof(10); + BITMAP_LEFT = layout.offsetof(11); + BITMAP_TOP = layout.offsetof(12); + OUTLINE = layout.offsetof(13); + NUM_SUBGLYPHS = layout.offsetof(14); + SUBGLYPHS = layout.offsetof(15); + CONTROL_DATA = layout.offsetof(16); + CONTROL_LEN = layout.offsetof(17); + LSB_DELTA = layout.offsetof(18); + RSB_DELTA = layout.offsetof(19); + OTHER = layout.offsetof(20); + INTERNAL = layout.offsetof(21); + } + + protected FT_GlyphSlot(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_GlyphSlot create(long address, @Nullable ByteBuffer container) { + return new FT_GlyphSlot(address, container); + } + + /** + * Creates a {@code FT_GlyphSlot} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_GlyphSlot(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code library} field. */ + @NativeType("FT_Library") + public long library() { return nlibrary(address()); } + /** @return a {@link FT_Face} view of the struct pointed to by the {@code face} field. */ + public FT_Face face() { return nface(address()); } + /** @return a {@link FT_GlyphSlot} view of the struct pointed to by the {@code next} field. */ + @Nullable + public FT_GlyphSlot next() { return nnext(address()); } + /** @return the value of the {@code glyph_index} field. */ + @NativeType("FT_UInt") + public int glyph_index() { return nglyph_index(address()); } + /** @return a {@link FT_Generic} view of the {@code generic} field. */ + public FT_Generic generic() { return ngeneric(address()); } + /** @return a {@link FT_Glyph_Metrics} view of the {@code metrics} field. */ + public FT_Glyph_Metrics metrics() { return nmetrics(address()); } + /** @return the value of the {@code linearHoriAdvance} field. */ + @NativeType("FT_Fixed") + public long linearHoriAdvance() { return nlinearHoriAdvance(address()); } + /** @return the value of the {@code linearVertAdvance} field. */ + @NativeType("FT_Fixed") + public long linearVertAdvance() { return nlinearVertAdvance(address()); } + /** @return a {@link FT_Vector} view of the {@code advance} field. */ + public FT_Vector advance() { return nadvance(address()); } + /** @return the value of the {@code format} field. */ + @NativeType("FT_Glyph_Format") + public int format() { return nformat(address()); } + /** @return a {@link FT_Bitmap} view of the {@code bitmap} field. */ + public FT_Bitmap bitmap() { return nbitmap(address()); } + /** @return the value of the {@code bitmap_left} field. */ + @NativeType("FT_Int") + public int bitmap_left() { return nbitmap_left(address()); } + /** @return the value of the {@code bitmap_top} field. */ + @NativeType("FT_Int") + public int bitmap_top() { return nbitmap_top(address()); } + /** @return a {@link FT_Outline} view of the {@code outline} field. */ + public FT_Outline outline() { return noutline(address()); } + /** @return the value of the {@code lsb_delta} field. */ + @NativeType("FT_Pos") + public long lsb_delta() { return nlsb_delta(address()); } + /** @return the value of the {@code rsb_delta} field. */ + @NativeType("FT_Pos") + public long rsb_delta() { return nrsb_delta(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_GlyphSlot} instance for the specified memory address. */ + public static FT_GlyphSlot create(long address) { + return new FT_GlyphSlot(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_GlyphSlot createSafe(long address) { + return address == NULL ? null : new FT_GlyphSlot(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #library}. */ + public static long nlibrary(long struct) { return memGetAddress(struct + FT_GlyphSlot.LIBRARY); } + /** Unsafe version of {@link #face}. */ + public static FT_Face nface(long struct) { return FT_Face.create(memGetAddress(struct + FT_GlyphSlot.FACE)); } + /** Unsafe version of {@link #next}. */ + @Nullable public static FT_GlyphSlot nnext(long struct) { return FT_GlyphSlot.createSafe(memGetAddress(struct + FT_GlyphSlot.NEXT)); } + /** Unsafe version of {@link #glyph_index}. */ + public static int nglyph_index(long struct) { return UNSAFE.getInt(null, struct + FT_GlyphSlot.GLYPH_INDEX); } + /** Unsafe version of {@link #generic}. */ + public static FT_Generic ngeneric(long struct) { return FT_Generic.create(struct + FT_GlyphSlot.GENERIC); } + /** Unsafe version of {@link #metrics}. */ + public static FT_Glyph_Metrics nmetrics(long struct) { return FT_Glyph_Metrics.create(struct + FT_GlyphSlot.METRICS); } + /** Unsafe version of {@link #linearHoriAdvance}. */ + public static long nlinearHoriAdvance(long struct) { return memGetCLong(struct + FT_GlyphSlot.LINEARHORIADVANCE); } + /** Unsafe version of {@link #linearVertAdvance}. */ + public static long nlinearVertAdvance(long struct) { return memGetCLong(struct + FT_GlyphSlot.LINEARVERTADVANCE); } + /** Unsafe version of {@link #advance}. */ + public static FT_Vector nadvance(long struct) { return FT_Vector.create(struct + FT_GlyphSlot.ADVANCE); } + /** Unsafe version of {@link #format}. */ + public static int nformat(long struct) { return UNSAFE.getInt(null, struct + FT_GlyphSlot.FORMAT); } + /** Unsafe version of {@link #bitmap}. */ + public static FT_Bitmap nbitmap(long struct) { return FT_Bitmap.create(struct + FT_GlyphSlot.BITMAP); } + /** Unsafe version of {@link #bitmap_left}. */ + public static int nbitmap_left(long struct) { return UNSAFE.getInt(null, struct + FT_GlyphSlot.BITMAP_LEFT); } + /** Unsafe version of {@link #bitmap_top}. */ + public static int nbitmap_top(long struct) { return UNSAFE.getInt(null, struct + FT_GlyphSlot.BITMAP_TOP); } + /** Unsafe version of {@link #outline}. */ + public static FT_Outline noutline(long struct) { return FT_Outline.create(struct + FT_GlyphSlot.OUTLINE); } + public static int nnum_subglyphs(long struct) { return UNSAFE.getInt(null, struct + FT_GlyphSlot.NUM_SUBGLYPHS); } + public static long nsubglyphs(long struct) { return memGetAddress(struct + FT_GlyphSlot.SUBGLYPHS); } + @Nullable public static ByteBuffer ncontrol_data(long struct) { return memByteBufferSafe(memGetAddress(struct + FT_GlyphSlot.CONTROL_DATA), (int)ncontrol_len(struct)); } + public static long ncontrol_len(long struct) { return memGetCLong(struct + FT_GlyphSlot.CONTROL_LEN); } + /** Unsafe version of {@link #lsb_delta}. */ + public static long nlsb_delta(long struct) { return memGetCLong(struct + FT_GlyphSlot.LSB_DELTA); } + /** Unsafe version of {@link #rsb_delta}. */ + public static long nrsb_delta(long struct) { return memGetCLong(struct + FT_GlyphSlot.RSB_DELTA); } + public static long nother(long struct) { return memGetAddress(struct + FT_GlyphSlot.OTHER); } + public static long ninternal(long struct) { return memGetAddress(struct + FT_GlyphSlot.INTERNAL); } + + // ----------------------------------- + + /** An array of {@link FT_GlyphSlot} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_GlyphSlot ELEMENT_FACTORY = FT_GlyphSlot.create(-1L); + + /** + * Creates a new {@code FT_GlyphSlot.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_GlyphSlot#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_GlyphSlot getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code library} field. */ + @NativeType("FT_Library") + public long library() { return FT_GlyphSlot.nlibrary(address()); } + /** @return a {@link FT_Face} view of the struct pointed to by the {@code face} field. */ + public FT_Face face() { return FT_GlyphSlot.nface(address()); } + /** @return a {@link FT_GlyphSlot} view of the struct pointed to by the {@code next} field. */ + @Nullable + public FT_GlyphSlot next() { return FT_GlyphSlot.nnext(address()); } + /** @return the value of the {@code glyph_index} field. */ + @NativeType("FT_UInt") + public int glyph_index() { return FT_GlyphSlot.nglyph_index(address()); } + /** @return a {@link FT_Generic} view of the {@code generic} field. */ + public FT_Generic generic() { return FT_GlyphSlot.ngeneric(address()); } + /** @return a {@link FT_Glyph_Metrics} view of the {@code metrics} field. */ + public FT_Glyph_Metrics metrics() { return FT_GlyphSlot.nmetrics(address()); } + /** @return the value of the {@code linearHoriAdvance} field. */ + @NativeType("FT_Fixed") + public long linearHoriAdvance() { return FT_GlyphSlot.nlinearHoriAdvance(address()); } + /** @return the value of the {@code linearVertAdvance} field. */ + @NativeType("FT_Fixed") + public long linearVertAdvance() { return FT_GlyphSlot.nlinearVertAdvance(address()); } + /** @return a {@link FT_Vector} view of the {@code advance} field. */ + public FT_Vector advance() { return FT_GlyphSlot.nadvance(address()); } + /** @return the value of the {@code format} field. */ + @NativeType("FT_Glyph_Format") + public int format() { return FT_GlyphSlot.nformat(address()); } + /** @return a {@link FT_Bitmap} view of the {@code bitmap} field. */ + public FT_Bitmap bitmap() { return FT_GlyphSlot.nbitmap(address()); } + /** @return the value of the {@code bitmap_left} field. */ + @NativeType("FT_Int") + public int bitmap_left() { return FT_GlyphSlot.nbitmap_left(address()); } + /** @return the value of the {@code bitmap_top} field. */ + @NativeType("FT_Int") + public int bitmap_top() { return FT_GlyphSlot.nbitmap_top(address()); } + /** @return a {@link FT_Outline} view of the {@code outline} field. */ + public FT_Outline outline() { return FT_GlyphSlot.noutline(address()); } + /** @return the value of the {@code lsb_delta} field. */ + @NativeType("FT_Pos") + public long lsb_delta() { return FT_GlyphSlot.nlsb_delta(address()); } + /** @return the value of the {@code rsb_delta} field. */ + @NativeType("FT_Pos") + public long rsb_delta() { return FT_GlyphSlot.nrsb_delta(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Glyph_Metrics.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Glyph_Metrics.java new file mode 100644 index 000000000..6642ed8dc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Glyph_Metrics.java @@ -0,0 +1,250 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure to model the metrics of a single glyph. + * + *

    The values are expressed in 26.6 fractional pixel format; if the flag {@link FreeType#FT_LOAD_NO_SCALE LOAD_NO_SCALE} has been used while loading the glyph, values are expressed in + * font units instead.

    + * + *
    Note
    + * + *

    If not disabled with {@link FreeType#FT_LOAD_NO_HINTING LOAD_NO_HINTING}, the values represent dimensions of the hinted glyph (in case hinting is applicable).

    + * + *

    Stroking a glyph with an outside border does not increase {@code horiAdvance} or {@code vertAdvance}; you have to manually adjust these values to + * account for the added width and height.

    + * + *

    FreeType doesn't use the {@code VORG} table data for CFF fonts because it doesn't have an interface to quickly retrieve the glyph height. The + * y~coordinate of the vertical origin can be simply computed as {@code vertBearingY + height} after loading a glyph.

    + * + *

    Layout

    + * + *
    
    + * struct FT_Glyph_Metrics {
    + *     FT_Pos {@link #width};
    + *     FT_Pos {@link #height};
    + *     FT_Pos {@link #horiBearingX};
    + *     FT_Pos {@link #horiBearingY};
    + *     FT_Pos {@link #horiAdvance};
    + *     FT_Pos {@link #vertBearingX};
    + *     FT_Pos {@link #vertBearingY};
    + *     FT_Pos {@link #vertAdvance};
    + * }
    + */ +public class FT_Glyph_Metrics extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + WIDTH, + HEIGHT, + HORIBEARINGX, + HORIBEARINGY, + HORIADVANCE, + VERTBEARINGX, + VERTBEARINGY, + VERTADVANCE; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + WIDTH = layout.offsetof(0); + HEIGHT = layout.offsetof(1); + HORIBEARINGX = layout.offsetof(2); + HORIBEARINGY = layout.offsetof(3); + HORIADVANCE = layout.offsetof(4); + VERTBEARINGX = layout.offsetof(5); + VERTBEARINGY = layout.offsetof(6); + VERTADVANCE = layout.offsetof(7); + } + + protected FT_Glyph_Metrics(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Glyph_Metrics create(long address, @Nullable ByteBuffer container) { + return new FT_Glyph_Metrics(address, container); + } + + /** + * Creates a {@code FT_Glyph_Metrics} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Glyph_Metrics(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** the glyph's width */ + @NativeType("FT_Pos") + public long width() { return nwidth(address()); } + /** the glyph's height */ + @NativeType("FT_Pos") + public long height() { return nheight(address()); } + /** left side bearing for horizontal layout */ + @NativeType("FT_Pos") + public long horiBearingX() { return nhoriBearingX(address()); } + /** top side bearing for horizontal layout */ + @NativeType("FT_Pos") + public long horiBearingY() { return nhoriBearingY(address()); } + /** advance width for horizontal layout */ + @NativeType("FT_Pos") + public long horiAdvance() { return nhoriAdvance(address()); } + /** left side bearing for vertical layout */ + @NativeType("FT_Pos") + public long vertBearingX() { return nvertBearingX(address()); } + /** top side bearing for vertical layout. Larger positive values mean further below the vertical glyph origin */ + @NativeType("FT_Pos") + public long vertBearingY() { return nvertBearingY(address()); } + /** advance height for vertical layout. Positive values mean the glyph has a positive advance downward */ + @NativeType("FT_Pos") + public long vertAdvance() { return nvertAdvance(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Glyph_Metrics} instance for the specified memory address. */ + public static FT_Glyph_Metrics create(long address) { + return new FT_Glyph_Metrics(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Glyph_Metrics createSafe(long address) { + return address == NULL ? null : new FT_Glyph_Metrics(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #width}. */ + public static long nwidth(long struct) { return memGetCLong(struct + FT_Glyph_Metrics.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static long nheight(long struct) { return memGetCLong(struct + FT_Glyph_Metrics.HEIGHT); } + /** Unsafe version of {@link #horiBearingX}. */ + public static long nhoriBearingX(long struct) { return memGetCLong(struct + FT_Glyph_Metrics.HORIBEARINGX); } + /** Unsafe version of {@link #horiBearingY}. */ + public static long nhoriBearingY(long struct) { return memGetCLong(struct + FT_Glyph_Metrics.HORIBEARINGY); } + /** Unsafe version of {@link #horiAdvance}. */ + public static long nhoriAdvance(long struct) { return memGetCLong(struct + FT_Glyph_Metrics.HORIADVANCE); } + /** Unsafe version of {@link #vertBearingX}. */ + public static long nvertBearingX(long struct) { return memGetCLong(struct + FT_Glyph_Metrics.VERTBEARINGX); } + /** Unsafe version of {@link #vertBearingY}. */ + public static long nvertBearingY(long struct) { return memGetCLong(struct + FT_Glyph_Metrics.VERTBEARINGY); } + /** Unsafe version of {@link #vertAdvance}. */ + public static long nvertAdvance(long struct) { return memGetCLong(struct + FT_Glyph_Metrics.VERTADVANCE); } + + // ----------------------------------- + + /** An array of {@link FT_Glyph_Metrics} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Glyph_Metrics ELEMENT_FACTORY = FT_Glyph_Metrics.create(-1L); + + /** + * Creates a new {@code FT_Glyph_Metrics.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Glyph_Metrics#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Glyph_Metrics getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link FT_Glyph_Metrics#width} field. */ + @NativeType("FT_Pos") + public long width() { return FT_Glyph_Metrics.nwidth(address()); } + /** @return the value of the {@link FT_Glyph_Metrics#height} field. */ + @NativeType("FT_Pos") + public long height() { return FT_Glyph_Metrics.nheight(address()); } + /** @return the value of the {@link FT_Glyph_Metrics#horiBearingX} field. */ + @NativeType("FT_Pos") + public long horiBearingX() { return FT_Glyph_Metrics.nhoriBearingX(address()); } + /** @return the value of the {@link FT_Glyph_Metrics#horiBearingY} field. */ + @NativeType("FT_Pos") + public long horiBearingY() { return FT_Glyph_Metrics.nhoriBearingY(address()); } + /** @return the value of the {@link FT_Glyph_Metrics#horiAdvance} field. */ + @NativeType("FT_Pos") + public long horiAdvance() { return FT_Glyph_Metrics.nhoriAdvance(address()); } + /** @return the value of the {@link FT_Glyph_Metrics#vertBearingX} field. */ + @NativeType("FT_Pos") + public long vertBearingX() { return FT_Glyph_Metrics.nvertBearingX(address()); } + /** @return the value of the {@link FT_Glyph_Metrics#vertBearingY} field. */ + @NativeType("FT_Pos") + public long vertBearingY() { return FT_Glyph_Metrics.nvertBearingY(address()); } + /** @return the value of the {@link FT_Glyph_Metrics#vertAdvance} field. */ + @NativeType("FT_Pos") + public long vertAdvance() { return FT_Glyph_Metrics.nvertAdvance(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_FreeGlyphDataFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_FreeGlyphDataFunc.java new file mode 100644 index 000000000..94dfe4ed2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_FreeGlyphDataFunc.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Incremental incremental,
    + *     FT_Data *data
    + * )
    + */ +public abstract class FT_Incremental_FreeGlyphDataFunc extends Callback implements FT_Incremental_FreeGlyphDataFuncI { + + /** + * Creates a {@code FT_Incremental_FreeGlyphDataFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Incremental_FreeGlyphDataFunc} + */ + public static FT_Incremental_FreeGlyphDataFunc create(long functionPointer) { + FT_Incremental_FreeGlyphDataFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Incremental_FreeGlyphDataFunc + ? (FT_Incremental_FreeGlyphDataFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Incremental_FreeGlyphDataFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Incremental_FreeGlyphDataFunc} instance that delegates to the specified {@code FT_Incremental_FreeGlyphDataFuncI} instance. */ + public static FT_Incremental_FreeGlyphDataFunc create(FT_Incremental_FreeGlyphDataFuncI instance) { + return instance instanceof FT_Incremental_FreeGlyphDataFunc + ? (FT_Incremental_FreeGlyphDataFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Incremental_FreeGlyphDataFunc() { + super(CIF); + } + + FT_Incremental_FreeGlyphDataFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Incremental_FreeGlyphDataFunc { + + private final FT_Incremental_FreeGlyphDataFuncI delegate; + + Container(long functionPointer, FT_Incremental_FreeGlyphDataFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long incremental, long data) { + delegate.invoke(incremental, data); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_FreeGlyphDataFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_FreeGlyphDataFuncI.java new file mode 100644 index 000000000..e70c4bd32 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_FreeGlyphDataFuncI.java @@ -0,0 +1,48 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Incremental incremental,
    + *     FT_Data *data
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Incremental_FreeGlyphDataFunc") +public interface FT_Incremental_FreeGlyphDataFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + } + + /** A function used to release the glyph data bytes returned by a successful call to {@link FT_Incremental_GetGlyphDataFunc}. */ + void invoke(@NativeType("FT_Incremental") long incremental, @NativeType("FT_Data *") long data); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Funcs.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Funcs.java new file mode 100644 index 000000000..30df7fed2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Funcs.java @@ -0,0 +1,315 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A table of functions for accessing fonts that load data incrementally. Used in {@link FT_Incremental_Interface}. + * + *

    Layout

    + * + *
    
    + * struct FT_Incremental_FuncsRec {
    + *     {@link FT_Incremental_GetGlyphDataFuncI FT_Incremental_GetGlyphDataFunc} get_glyph_data;
    + *     {@link FT_Incremental_FreeGlyphDataFuncI FT_Incremental_FreeGlyphDataFunc} free_glyph_data;
    + *     {@link FT_Incremental_GetGlyphMetricsFuncI FT_Incremental_GetGlyphMetricsFunc} get_glyph_metrics;
    + * }
    + */ +@NativeType("struct FT_Incremental_FuncsRec") +public class FT_Incremental_Funcs extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + GET_GLYPH_DATA, + FREE_GLYPH_DATA, + GET_GLYPH_METRICS; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + GET_GLYPH_DATA = layout.offsetof(0); + FREE_GLYPH_DATA = layout.offsetof(1); + GET_GLYPH_METRICS = layout.offsetof(2); + } + + protected FT_Incremental_Funcs(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Incremental_Funcs create(long address, @Nullable ByteBuffer container) { + return new FT_Incremental_Funcs(address, container); + } + + /** + * Creates a {@code FT_Incremental_Funcs} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Incremental_Funcs(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code get_glyph_data} field. */ + public FT_Incremental_GetGlyphDataFunc get_glyph_data() { return nget_glyph_data(address()); } + /** @return the value of the {@code free_glyph_data} field. */ + public FT_Incremental_FreeGlyphDataFunc free_glyph_data() { return nfree_glyph_data(address()); } + /** @return the value of the {@code get_glyph_metrics} field. */ + @Nullable + public FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics() { return nget_glyph_metrics(address()); } + + /** Sets the specified value to the {@code get_glyph_data} field. */ + public FT_Incremental_Funcs get_glyph_data(@NativeType("FT_Incremental_GetGlyphDataFunc") FT_Incremental_GetGlyphDataFuncI value) { nget_glyph_data(address(), value); return this; } + /** Sets the specified value to the {@code free_glyph_data} field. */ + public FT_Incremental_Funcs free_glyph_data(@NativeType("FT_Incremental_FreeGlyphDataFunc") FT_Incremental_FreeGlyphDataFuncI value) { nfree_glyph_data(address(), value); return this; } + /** Sets the specified value to the {@code get_glyph_metrics} field. */ + public FT_Incremental_Funcs get_glyph_metrics(@Nullable @NativeType("FT_Incremental_GetGlyphMetricsFunc") FT_Incremental_GetGlyphMetricsFuncI value) { nget_glyph_metrics(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Incremental_Funcs set( + FT_Incremental_GetGlyphDataFuncI get_glyph_data, + FT_Incremental_FreeGlyphDataFuncI free_glyph_data, + FT_Incremental_GetGlyphMetricsFuncI get_glyph_metrics + ) { + get_glyph_data(get_glyph_data); + free_glyph_data(free_glyph_data); + get_glyph_metrics(get_glyph_metrics); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Incremental_Funcs set(FT_Incremental_Funcs src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Incremental_Funcs} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Incremental_Funcs malloc() { + return new FT_Incremental_Funcs(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Incremental_Funcs} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Incremental_Funcs calloc() { + return new FT_Incremental_Funcs(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Incremental_Funcs} instance allocated with {@link BufferUtils}. */ + public static FT_Incremental_Funcs create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Incremental_Funcs(memAddress(container), container); + } + + /** Returns a new {@code FT_Incremental_Funcs} instance for the specified memory address. */ + public static FT_Incremental_Funcs create(long address) { + return new FT_Incremental_Funcs(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Incremental_Funcs createSafe(long address) { + return address == NULL ? null : new FT_Incremental_Funcs(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Incremental_Funcs} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Incremental_Funcs malloc(MemoryStack stack) { + return new FT_Incremental_Funcs(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Incremental_Funcs} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Incremental_Funcs calloc(MemoryStack stack) { + return new FT_Incremental_Funcs(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #get_glyph_data}. */ + public static FT_Incremental_GetGlyphDataFunc nget_glyph_data(long struct) { return FT_Incremental_GetGlyphDataFunc.create(memGetAddress(struct + FT_Incremental_Funcs.GET_GLYPH_DATA)); } + /** Unsafe version of {@link #free_glyph_data}. */ + public static FT_Incremental_FreeGlyphDataFunc nfree_glyph_data(long struct) { return FT_Incremental_FreeGlyphDataFunc.create(memGetAddress(struct + FT_Incremental_Funcs.FREE_GLYPH_DATA)); } + /** Unsafe version of {@link #get_glyph_metrics}. */ + @Nullable public static FT_Incremental_GetGlyphMetricsFunc nget_glyph_metrics(long struct) { return FT_Incremental_GetGlyphMetricsFunc.createSafe(memGetAddress(struct + FT_Incremental_Funcs.GET_GLYPH_METRICS)); } + + /** Unsafe version of {@link #get_glyph_data(FT_Incremental_GetGlyphDataFuncI) get_glyph_data}. */ + public static void nget_glyph_data(long struct, FT_Incremental_GetGlyphDataFuncI value) { memPutAddress(struct + FT_Incremental_Funcs.GET_GLYPH_DATA, value.address()); } + /** Unsafe version of {@link #free_glyph_data(FT_Incremental_FreeGlyphDataFuncI) free_glyph_data}. */ + public static void nfree_glyph_data(long struct, FT_Incremental_FreeGlyphDataFuncI value) { memPutAddress(struct + FT_Incremental_Funcs.FREE_GLYPH_DATA, value.address()); } + /** Unsafe version of {@link #get_glyph_metrics(FT_Incremental_GetGlyphMetricsFuncI) get_glyph_metrics}. */ + public static void nget_glyph_metrics(long struct, @Nullable FT_Incremental_GetGlyphMetricsFuncI value) { memPutAddress(struct + FT_Incremental_Funcs.GET_GLYPH_METRICS, memAddressSafe(value)); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + FT_Incremental_Funcs.GET_GLYPH_DATA)); + check(memGetAddress(struct + FT_Incremental_Funcs.FREE_GLYPH_DATA)); + } + + // ----------------------------------- + + /** An array of {@link FT_Incremental_Funcs} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Incremental_Funcs ELEMENT_FACTORY = FT_Incremental_Funcs.create(-1L); + + /** + * Creates a new {@code FT_Incremental_Funcs.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Incremental_Funcs#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Incremental_Funcs getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code get_glyph_data} field. */ + public FT_Incremental_GetGlyphDataFunc get_glyph_data() { return FT_Incremental_Funcs.nget_glyph_data(address()); } + /** @return the value of the {@code free_glyph_data} field. */ + public FT_Incremental_FreeGlyphDataFunc free_glyph_data() { return FT_Incremental_Funcs.nfree_glyph_data(address()); } + /** @return the value of the {@code get_glyph_metrics} field. */ + @Nullable + public FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics() { return FT_Incremental_Funcs.nget_glyph_metrics(address()); } + + /** Sets the specified value to the {@code get_glyph_data} field. */ + public Buffer get_glyph_data(@NativeType("FT_Incremental_GetGlyphDataFunc") FT_Incremental_GetGlyphDataFuncI value) { FT_Incremental_Funcs.nget_glyph_data(address(), value); return this; } + /** Sets the specified value to the {@code free_glyph_data} field. */ + public Buffer free_glyph_data(@NativeType("FT_Incremental_FreeGlyphDataFunc") FT_Incremental_FreeGlyphDataFuncI value) { FT_Incremental_Funcs.nfree_glyph_data(address(), value); return this; } + /** Sets the specified value to the {@code get_glyph_metrics} field. */ + public Buffer get_glyph_metrics(@Nullable @NativeType("FT_Incremental_GetGlyphMetricsFunc") FT_Incremental_GetGlyphMetricsFuncI value) { FT_Incremental_Funcs.nget_glyph_metrics(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphDataFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphDataFunc.java new file mode 100644 index 000000000..74ae8b85a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphDataFunc.java @@ -0,0 +1,75 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_Incremental incremental,
    + *     FT_UInt glyph_index,
    + *     FT_Data *adata
    + * )
    + */ +public abstract class FT_Incremental_GetGlyphDataFunc extends Callback implements FT_Incremental_GetGlyphDataFuncI { + + /** + * Creates a {@code FT_Incremental_GetGlyphDataFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Incremental_GetGlyphDataFunc} + */ + public static FT_Incremental_GetGlyphDataFunc create(long functionPointer) { + FT_Incremental_GetGlyphDataFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Incremental_GetGlyphDataFunc + ? (FT_Incremental_GetGlyphDataFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Incremental_GetGlyphDataFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Incremental_GetGlyphDataFunc} instance that delegates to the specified {@code FT_Incremental_GetGlyphDataFuncI} instance. */ + public static FT_Incremental_GetGlyphDataFunc create(FT_Incremental_GetGlyphDataFuncI instance) { + return instance instanceof FT_Incremental_GetGlyphDataFunc + ? (FT_Incremental_GetGlyphDataFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Incremental_GetGlyphDataFunc() { + super(CIF); + } + + FT_Incremental_GetGlyphDataFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Incremental_GetGlyphDataFunc { + + private final FT_Incremental_GetGlyphDataFuncI delegate; + + Container(long functionPointer, FT_Incremental_GetGlyphDataFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long incremental, int glyph_index, long adata) { + return delegate.invoke(incremental, glyph_index, adata); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphDataFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphDataFuncI.java new file mode 100644 index 000000000..1fa3ad8ee --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphDataFuncI.java @@ -0,0 +1,51 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_Incremental incremental,
    + *     FT_UInt glyph_index,
    + *     FT_Data *adata
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Incremental_GetGlyphDataFunc") +public interface FT_Incremental_GetGlyphDataFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_uint32, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** A function called by FreeType to access a given glyph's data bytes during {@link FreeType#FT_Load_Glyph Load_Glyph} or {@link FreeType#FT_Load_Char Load_Char} if incremental loading is enabled. */ + @NativeType("FT_Error") int invoke(@NativeType("FT_Incremental") long incremental, @NativeType("FT_UInt") int glyph_index, @NativeType("FT_Data *") long adata); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphMetricsFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphMetricsFunc.java new file mode 100644 index 000000000..ad6b6ab33 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphMetricsFunc.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_Incremental incremental,
    + *     FT_UInt glyph_index,
    + *     FT_Bool vertical,
    + *     FT_Incremental_MetricsRec *ametrics
    + * )
    + */ +public abstract class FT_Incremental_GetGlyphMetricsFunc extends Callback implements FT_Incremental_GetGlyphMetricsFuncI { + + /** + * Creates a {@code FT_Incremental_GetGlyphMetricsFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Incremental_GetGlyphMetricsFunc} + */ + public static FT_Incremental_GetGlyphMetricsFunc create(long functionPointer) { + FT_Incremental_GetGlyphMetricsFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Incremental_GetGlyphMetricsFunc + ? (FT_Incremental_GetGlyphMetricsFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Incremental_GetGlyphMetricsFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Incremental_GetGlyphMetricsFunc} instance that delegates to the specified {@code FT_Incremental_GetGlyphMetricsFuncI} instance. */ + public static FT_Incremental_GetGlyphMetricsFunc create(FT_Incremental_GetGlyphMetricsFuncI instance) { + return instance instanceof FT_Incremental_GetGlyphMetricsFunc + ? (FT_Incremental_GetGlyphMetricsFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Incremental_GetGlyphMetricsFunc() { + super(CIF); + } + + FT_Incremental_GetGlyphMetricsFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Incremental_GetGlyphMetricsFunc { + + private final FT_Incremental_GetGlyphMetricsFuncI delegate; + + Container(long functionPointer, FT_Incremental_GetGlyphMetricsFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long incremental, int glyph_index, boolean vertical, long ametrics) { + return delegate.invoke(incremental, glyph_index, vertical, ametrics); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphMetricsFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphMetricsFuncI.java new file mode 100644 index 000000000..b0d0ed1a8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_GetGlyphMetricsFuncI.java @@ -0,0 +1,53 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_Incremental incremental,
    + *     FT_UInt glyph_index,
    + *     FT_Bool vertical,
    + *     FT_Incremental_MetricsRec *ametrics
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Incremental_GetGlyphMetricsFunc") +public interface FT_Incremental_GetGlyphMetricsFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_uint32, ffi_type_uint8, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetByte(memGetAddress(args + 2 * POINTER_SIZE)) != 0, + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** A function used to retrieve the basic metrics of a given glyph index before accessing its data. */ + @NativeType("FT_Error") int invoke(@NativeType("FT_Incremental") long incremental, @NativeType("FT_UInt") int glyph_index, @NativeType("FT_Bool") boolean vertical, @NativeType("FT_Incremental_MetricsRec *") long ametrics); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Interface.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Interface.java new file mode 100644 index 000000000..e993128a8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Interface.java @@ -0,0 +1,300 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure to be used with {@link FreeType#FT_Open_Face Open_Face} to indicate that the user wants to support incremental glyph loading. + * + *

    Layout

    + * + *
    
    + * struct FT_Incremental_InterfaceRec {
    + *     {@link FT_Incremental_Funcs FT_Incremental_FuncsRec} const * funcs;
    + *     FT_Incremental object;
    + * }
    + */ +@NativeType("struct FT_Incremental_InterfaceRec") +public class FT_Incremental_Interface extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FUNCS, + OBJECT; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FUNCS = layout.offsetof(0); + OBJECT = layout.offsetof(1); + } + + protected FT_Incremental_Interface(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Incremental_Interface create(long address, @Nullable ByteBuffer container) { + return new FT_Incremental_Interface(address, container); + } + + /** + * Creates a {@code FT_Incremental_Interface} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Incremental_Interface(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_Incremental_Funcs} view of the struct pointed to by the {@code funcs} field. */ + @NativeType("FT_Incremental_FuncsRec const *") + public FT_Incremental_Funcs funcs() { return nfuncs(address()); } + /** @return the value of the {@code object} field. */ + @NativeType("FT_Incremental") + public long object() { return nobject(address()); } + + /** Sets the address of the specified {@link FT_Incremental_Funcs} to the {@code funcs} field. */ + public FT_Incremental_Interface funcs(@NativeType("FT_Incremental_FuncsRec const *") FT_Incremental_Funcs value) { nfuncs(address(), value); return this; } + /** Sets the specified value to the {@code object} field. */ + public FT_Incremental_Interface object(@NativeType("FT_Incremental") long value) { nobject(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Incremental_Interface set( + FT_Incremental_Funcs funcs, + long object + ) { + funcs(funcs); + object(object); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Incremental_Interface set(FT_Incremental_Interface src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Incremental_Interface} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Incremental_Interface malloc() { + return new FT_Incremental_Interface(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Incremental_Interface} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Incremental_Interface calloc() { + return new FT_Incremental_Interface(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Incremental_Interface} instance allocated with {@link BufferUtils}. */ + public static FT_Incremental_Interface create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Incremental_Interface(memAddress(container), container); + } + + /** Returns a new {@code FT_Incremental_Interface} instance for the specified memory address. */ + public static FT_Incremental_Interface create(long address) { + return new FT_Incremental_Interface(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Incremental_Interface createSafe(long address) { + return address == NULL ? null : new FT_Incremental_Interface(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Incremental_Interface} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Incremental_Interface malloc(MemoryStack stack) { + return new FT_Incremental_Interface(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Incremental_Interface} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Incremental_Interface calloc(MemoryStack stack) { + return new FT_Incremental_Interface(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #funcs}. */ + public static FT_Incremental_Funcs nfuncs(long struct) { return FT_Incremental_Funcs.create(memGetAddress(struct + FT_Incremental_Interface.FUNCS)); } + /** Unsafe version of {@link #object}. */ + public static long nobject(long struct) { return memGetAddress(struct + FT_Incremental_Interface.OBJECT); } + + /** Unsafe version of {@link #funcs(FT_Incremental_Funcs) funcs}. */ + public static void nfuncs(long struct, FT_Incremental_Funcs value) { memPutAddress(struct + FT_Incremental_Interface.FUNCS, value.address()); } + /** Unsafe version of {@link #object(long) object}. */ + public static void nobject(long struct, long value) { memPutAddress(struct + FT_Incremental_Interface.OBJECT, value); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + long funcs = memGetAddress(struct + FT_Incremental_Interface.FUNCS); + check(funcs); + FT_Incremental_Funcs.validate(funcs); + } + + // ----------------------------------- + + /** An array of {@link FT_Incremental_Interface} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Incremental_Interface ELEMENT_FACTORY = FT_Incremental_Interface.create(-1L); + + /** + * Creates a new {@code FT_Incremental_Interface.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Incremental_Interface#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Incremental_Interface getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_Incremental_Funcs} view of the struct pointed to by the {@code funcs} field. */ + @NativeType("FT_Incremental_FuncsRec const *") + public FT_Incremental_Funcs funcs() { return FT_Incremental_Interface.nfuncs(address()); } + /** @return the value of the {@code object} field. */ + @NativeType("FT_Incremental") + public long object() { return FT_Incremental_Interface.nobject(address()); } + + /** Sets the address of the specified {@link FT_Incremental_Funcs} to the {@code funcs} field. */ + public Buffer funcs(@NativeType("FT_Incremental_FuncsRec const *") FT_Incremental_Funcs value) { FT_Incremental_Interface.nfuncs(address(), value); return this; } + /** Sets the specified value to the {@code object} field. */ + public Buffer object(@NativeType("FT_Incremental") long value) { FT_Incremental_Interface.nobject(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Metrics.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Metrics.java new file mode 100644 index 000000000..700d88517 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Incremental_Metrics.java @@ -0,0 +1,190 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A small structure used to contain the basic glyph metrics returned by the {@link FT_Incremental_GetGlyphMetricsFunc} method. + * + *

    Layout

    + * + *
    
    + * struct FT_Incremental_MetricsRec {
    + *     FT_Long bearing_x;
    + *     FT_Long bearing_y;
    + *     FT_Long advance;
    + *     FT_Long advance_v;
    + * }
    + */ +@NativeType("struct FT_Incremental_MetricsRec") +public class FT_Incremental_Metrics extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + BEARING_X, + BEARING_Y, + ADVANCE, + ADVANCE_V; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + BEARING_X = layout.offsetof(0); + BEARING_Y = layout.offsetof(1); + ADVANCE = layout.offsetof(2); + ADVANCE_V = layout.offsetof(3); + } + + protected FT_Incremental_Metrics(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Incremental_Metrics create(long address, @Nullable ByteBuffer container) { + return new FT_Incremental_Metrics(address, container); + } + + /** + * Creates a {@code FT_Incremental_Metrics} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Incremental_Metrics(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code bearing_x} field. */ + @NativeType("FT_Long") + public long bearing_x() { return nbearing_x(address()); } + /** @return the value of the {@code bearing_y} field. */ + @NativeType("FT_Long") + public long bearing_y() { return nbearing_y(address()); } + /** @return the value of the {@code advance} field. */ + @NativeType("FT_Long") + public long advance() { return nadvance(address()); } + /** @return the value of the {@code advance_v} field. */ + @NativeType("FT_Long") + public long advance_v() { return nadvance_v(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Incremental_Metrics} instance for the specified memory address. */ + public static FT_Incremental_Metrics create(long address) { + return new FT_Incremental_Metrics(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Incremental_Metrics createSafe(long address) { + return address == NULL ? null : new FT_Incremental_Metrics(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #bearing_x}. */ + public static long nbearing_x(long struct) { return memGetCLong(struct + FT_Incremental_Metrics.BEARING_X); } + /** Unsafe version of {@link #bearing_y}. */ + public static long nbearing_y(long struct) { return memGetCLong(struct + FT_Incremental_Metrics.BEARING_Y); } + /** Unsafe version of {@link #advance}. */ + public static long nadvance(long struct) { return memGetCLong(struct + FT_Incremental_Metrics.ADVANCE); } + /** Unsafe version of {@link #advance_v}. */ + public static long nadvance_v(long struct) { return memGetCLong(struct + FT_Incremental_Metrics.ADVANCE_V); } + + // ----------------------------------- + + /** An array of {@link FT_Incremental_Metrics} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Incremental_Metrics ELEMENT_FACTORY = FT_Incremental_Metrics.create(-1L); + + /** + * Creates a new {@code FT_Incremental_Metrics.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Incremental_Metrics#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Incremental_Metrics getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code bearing_x} field. */ + @NativeType("FT_Long") + public long bearing_x() { return FT_Incremental_Metrics.nbearing_x(address()); } + /** @return the value of the {@code bearing_y} field. */ + @NativeType("FT_Long") + public long bearing_y() { return FT_Incremental_Metrics.nbearing_y(address()); } + /** @return the value of the {@code advance} field. */ + @NativeType("FT_Long") + public long advance() { return FT_Incremental_Metrics.nadvance(address()); } + /** @return the value of the {@code advance_v} field. */ + @NativeType("FT_Long") + public long advance_v() { return FT_Incremental_Metrics.nadvance_v(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_LayerIterator.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_LayerIterator.java new file mode 100644 index 000000000..465c82454 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_LayerIterator.java @@ -0,0 +1,271 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * This iterator object is needed for {@link FreeType#FT_Get_Color_Glyph_Layer Get_Color_Glyph_Layer}. + * + *

    Layout

    + * + *
    
    + * struct FT_LayerIterator {
    + *     FT_UInt num_layers;
    + *     FT_UInt layer;
    + *     FT_Byte * p;
    + * }
    + */ +public class FT_LayerIterator extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NUM_LAYERS, + LAYER, + P; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NUM_LAYERS = layout.offsetof(0); + LAYER = layout.offsetof(1); + P = layout.offsetof(2); + } + + protected FT_LayerIterator(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_LayerIterator create(long address, @Nullable ByteBuffer container) { + return new FT_LayerIterator(address, container); + } + + /** + * Creates a {@code FT_LayerIterator} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_LayerIterator(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code num_layers} field. */ + @NativeType("FT_UInt") + public int num_layers() { return nnum_layers(address()); } + /** @return the value of the {@code layer} field. */ + @NativeType("FT_UInt") + public int layer() { return nlayer(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code p} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("FT_Byte *") + public ByteBuffer p(int capacity) { return np(address(), capacity); } + + // ----------------------------------- + + /** Returns a new {@code FT_LayerIterator} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_LayerIterator malloc() { + return new FT_LayerIterator(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_LayerIterator} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_LayerIterator calloc() { + return new FT_LayerIterator(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_LayerIterator} instance allocated with {@link BufferUtils}. */ + public static FT_LayerIterator create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_LayerIterator(memAddress(container), container); + } + + /** Returns a new {@code FT_LayerIterator} instance for the specified memory address. */ + public static FT_LayerIterator create(long address) { + return new FT_LayerIterator(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_LayerIterator createSafe(long address) { + return address == NULL ? null : new FT_LayerIterator(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_LayerIterator} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_LayerIterator malloc(MemoryStack stack) { + return new FT_LayerIterator(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_LayerIterator} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_LayerIterator calloc(MemoryStack stack) { + return new FT_LayerIterator(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #num_layers}. */ + public static int nnum_layers(long struct) { return UNSAFE.getInt(null, struct + FT_LayerIterator.NUM_LAYERS); } + /** Unsafe version of {@link #layer}. */ + public static int nlayer(long struct) { return UNSAFE.getInt(null, struct + FT_LayerIterator.LAYER); } + /** Unsafe version of {@link #p(int) p}. */ + @Nullable public static ByteBuffer np(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + FT_LayerIterator.P), capacity); } + + // ----------------------------------- + + /** An array of {@link FT_LayerIterator} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_LayerIterator ELEMENT_FACTORY = FT_LayerIterator.create(-1L); + + /** + * Creates a new {@code FT_LayerIterator.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_LayerIterator#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_LayerIterator getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code num_layers} field. */ + @NativeType("FT_UInt") + public int num_layers() { return FT_LayerIterator.nnum_layers(address()); } + /** @return the value of the {@code layer} field. */ + @NativeType("FT_UInt") + public int layer() { return FT_LayerIterator.nlayer(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code p} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("FT_Byte *") + public ByteBuffer p(int capacity) { return FT_LayerIterator.np(address(), capacity); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List.java new file mode 100644 index 000000000..1ffee56b8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List.java @@ -0,0 +1,166 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used to hold a simple doubly-linked list. These are used in many parts of FreeType. + * + *

    Layout

    + * + *
    
    + * struct FT_ListRec {
    + *     {@link FT_ListNode FT_ListNode} head;
    + *     {@link FT_ListNode FT_ListNode} tail;
    + * }
    + */ +@NativeType("struct FT_ListRec") +public class FT_List extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + HEAD, + TAIL; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + HEAD = layout.offsetof(0); + TAIL = layout.offsetof(1); + } + + protected FT_List(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_List create(long address, @Nullable ByteBuffer container) { + return new FT_List(address, container); + } + + /** + * Creates a {@code FT_List} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_List(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_ListNode} view of the struct pointed to by the {@code head} field. */ + @Nullable + public FT_ListNode head() { return nhead(address()); } + /** @return a {@link FT_ListNode} view of the struct pointed to by the {@code tail} field. */ + @Nullable + public FT_ListNode tail() { return ntail(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_List} instance for the specified memory address. */ + public static FT_List create(long address) { + return new FT_List(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_List createSafe(long address) { + return address == NULL ? null : new FT_List(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #head}. */ + @Nullable public static FT_ListNode nhead(long struct) { return FT_ListNode.createSafe(memGetAddress(struct + FT_List.HEAD)); } + /** Unsafe version of {@link #tail}. */ + @Nullable public static FT_ListNode ntail(long struct) { return FT_ListNode.createSafe(memGetAddress(struct + FT_List.TAIL)); } + + // ----------------------------------- + + /** An array of {@link FT_List} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_List ELEMENT_FACTORY = FT_List.create(-1L); + + /** + * Creates a new {@code FT_List.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_List#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_List getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_ListNode} view of the struct pointed to by the {@code head} field. */ + @Nullable + public FT_ListNode head() { return FT_List.nhead(address()); } + /** @return a {@link FT_ListNode} view of the struct pointed to by the {@code tail} field. */ + @Nullable + public FT_ListNode tail() { return FT_List.ntail(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ListNode.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ListNode.java new file mode 100644 index 000000000..d43d5e2c2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_ListNode.java @@ -0,0 +1,186 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used to hold a single list element. + * + *

    Layout

    + * + *
    
    + * struct FT_ListNodeRec {
    + *     {@link FT_ListNode FT_ListNode} prev;
    + *     {@link FT_ListNode FT_ListNode} next;
    + *     void * data;
    + * }
    + */ +@NativeType("struct FT_ListNodeRec") +public class FT_ListNode extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PREV, + NEXT, + DATA; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PREV = layout.offsetof(0); + NEXT = layout.offsetof(1); + DATA = layout.offsetof(2); + } + + protected FT_ListNode(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_ListNode create(long address, @Nullable ByteBuffer container) { + return new FT_ListNode(address, container); + } + + /** + * Creates a {@code FT_ListNode} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_ListNode(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_ListNode} view of the struct pointed to by the {@code prev} field. */ + @Nullable + public FT_ListNode prev() { return nprev(address()); } + /** @return a {@link FT_ListNode} view of the struct pointed to by the {@code next} field. */ + @Nullable + public FT_ListNode next() { return nnext(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code data} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("void *") + public ByteBuffer data(int capacity) { return ndata(address(), capacity); } + + // ----------------------------------- + + /** Returns a new {@code FT_ListNode} instance for the specified memory address. */ + public static FT_ListNode create(long address) { + return new FT_ListNode(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_ListNode createSafe(long address) { + return address == NULL ? null : new FT_ListNode(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #prev}. */ + @Nullable public static FT_ListNode nprev(long struct) { return FT_ListNode.createSafe(memGetAddress(struct + FT_ListNode.PREV)); } + /** Unsafe version of {@link #next}. */ + @Nullable public static FT_ListNode nnext(long struct) { return FT_ListNode.createSafe(memGetAddress(struct + FT_ListNode.NEXT)); } + /** Unsafe version of {@link #data(int) data}. */ + public static ByteBuffer ndata(long struct, int capacity) { return memByteBuffer(memGetAddress(struct + FT_ListNode.DATA), capacity); } + + // ----------------------------------- + + /** An array of {@link FT_ListNode} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_ListNode ELEMENT_FACTORY = FT_ListNode.create(-1L); + + /** + * Creates a new {@code FT_ListNode.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_ListNode#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_ListNode getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_ListNode} view of the struct pointed to by the {@code prev} field. */ + @Nullable + public FT_ListNode prev() { return FT_ListNode.nprev(address()); } + /** @return a {@link FT_ListNode} view of the struct pointed to by the {@code next} field. */ + @Nullable + public FT_ListNode next() { return FT_ListNode.nnext(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code data} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("void *") + public ByteBuffer data(int capacity) { return FT_ListNode.ndata(address(), capacity); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_Destructor.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_Destructor.java new file mode 100644 index 000000000..a71a7ab27 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_Destructor.java @@ -0,0 +1,75 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Memory memory,
    + *     void *data,
    + *     void *user
    + * )
    + */ +public abstract class FT_List_Destructor extends Callback implements FT_List_DestructorI { + + /** + * Creates a {@code FT_List_Destructor} instance from the specified function pointer. + * + * @return the new {@code FT_List_Destructor} + */ + public static FT_List_Destructor create(long functionPointer) { + FT_List_DestructorI instance = Callback.get(functionPointer); + return instance instanceof FT_List_Destructor + ? (FT_List_Destructor)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_List_Destructor createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_List_Destructor} instance that delegates to the specified {@code FT_List_DestructorI} instance. */ + public static FT_List_Destructor create(FT_List_DestructorI instance) { + return instance instanceof FT_List_Destructor + ? (FT_List_Destructor)instance + : new Container(instance.address(), instance); + } + + protected FT_List_Destructor() { + super(CIF); + } + + FT_List_Destructor(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_List_Destructor { + + private final FT_List_DestructorI delegate; + + Container(long functionPointer, FT_List_DestructorI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long memory, long data, long user) { + delegate.invoke(memory, data, user); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_DestructorI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_DestructorI.java new file mode 100644 index 000000000..30361d641 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_DestructorI.java @@ -0,0 +1,50 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Memory memory,
    + *     void *data,
    + *     void *user
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_List_Destructor") +public interface FT_List_DestructorI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)) + ); + } + + /** An {@code FT_List} iterator function that is called during a list finalization by {@link FreeType#FT_List_Finalize List_Finalize} to destroy all elements in a given list. */ + void invoke(@NativeType("FT_Memory") long memory, @NativeType("void *") long data, @NativeType("void *") long user); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_Iterator.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_Iterator.java new file mode 100644 index 000000000..15679d7c2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_Iterator.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_ListNode node,
    + *     void *user
    + * )
    + */ +public abstract class FT_List_Iterator extends Callback implements FT_List_IteratorI { + + /** + * Creates a {@code FT_List_Iterator} instance from the specified function pointer. + * + * @return the new {@code FT_List_Iterator} + */ + public static FT_List_Iterator create(long functionPointer) { + FT_List_IteratorI instance = Callback.get(functionPointer); + return instance instanceof FT_List_Iterator + ? (FT_List_Iterator)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_List_Iterator createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_List_Iterator} instance that delegates to the specified {@code FT_List_IteratorI} instance. */ + public static FT_List_Iterator create(FT_List_IteratorI instance) { + return instance instanceof FT_List_Iterator + ? (FT_List_Iterator)instance + : new Container(instance.address(), instance); + } + + protected FT_List_Iterator() { + super(CIF); + } + + FT_List_Iterator(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_List_Iterator { + + private final FT_List_IteratorI delegate; + + Container(long functionPointer, FT_List_IteratorI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long node, long user) { + return delegate.invoke(node, user); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_IteratorI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_IteratorI.java new file mode 100644 index 000000000..86ed1a1f4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_List_IteratorI.java @@ -0,0 +1,49 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_ListNode node,
    + *     void *user
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_List_Iterator") +public interface FT_List_IteratorI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** An {@code FT_List} iterator function that is called during a list parse by {@link FreeType#FT_List_Iterate List_Iterate}. */ + @NativeType("FT_Error") int invoke(@NativeType("FT_ListNode") long node, @NativeType("void *") long user); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_MM_Axis.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_MM_Axis.java new file mode 100644 index 000000000..262d05dd3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_MM_Axis.java @@ -0,0 +1,185 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure to model a given axis in design space for Multiple Masters fonts. + * + *

    Layout

    + * + *
    
    + * struct FT_MM_Axis {
    + *     FT_String * name;
    + *     FT_Long minimum;
    + *     FT_Long maximum;
    + * }
    + */ +public class FT_MM_Axis extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NAME, + MINIMUM, + MAXIMUM; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NAME = layout.offsetof(0); + MINIMUM = layout.offsetof(1); + MAXIMUM = layout.offsetof(2); + } + + protected FT_MM_Axis(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_MM_Axis create(long address, @Nullable ByteBuffer container) { + return new FT_MM_Axis(address, container); + } + + /** + * Creates a {@code FT_MM_Axis} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_MM_Axis(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code name} field. */ + @NativeType("FT_String *") + public ByteBuffer name() { return nname(address()); } + /** @return the null-terminated string pointed to by the {@code name} field. */ + @NativeType("FT_String *") + public String nameString() { return nnameString(address()); } + /** @return the value of the {@code minimum} field. */ + @NativeType("FT_Long") + public long minimum() { return nminimum(address()); } + /** @return the value of the {@code maximum} field. */ + @NativeType("FT_Long") + public long maximum() { return nmaximum(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_MM_Axis} instance for the specified memory address. */ + public static FT_MM_Axis create(long address) { + return new FT_MM_Axis(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_MM_Axis createSafe(long address) { + return address == NULL ? null : new FT_MM_Axis(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #name}. */ + public static ByteBuffer nname(long struct) { return memByteBufferNT1(memGetAddress(struct + FT_MM_Axis.NAME)); } + /** Unsafe version of {@link #nameString}. */ + public static String nnameString(long struct) { return memUTF8(memGetAddress(struct + FT_MM_Axis.NAME)); } + /** Unsafe version of {@link #minimum}. */ + public static long nminimum(long struct) { return memGetCLong(struct + FT_MM_Axis.MINIMUM); } + /** Unsafe version of {@link #maximum}. */ + public static long nmaximum(long struct) { return memGetCLong(struct + FT_MM_Axis.MAXIMUM); } + + // ----------------------------------- + + /** An array of {@link FT_MM_Axis} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_MM_Axis ELEMENT_FACTORY = FT_MM_Axis.create(-1L); + + /** + * Creates a new {@code FT_MM_Axis.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_MM_Axis#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_MM_Axis getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code name} field. */ + @NativeType("FT_String *") + public ByteBuffer name() { return FT_MM_Axis.nname(address()); } + /** @return the null-terminated string pointed to by the {@code name} field. */ + @NativeType("FT_String *") + public String nameString() { return FT_MM_Axis.nnameString(address()); } + /** @return the value of the {@code minimum} field. */ + @NativeType("FT_Long") + public long minimum() { return FT_MM_Axis.nminimum(address()); } + /** @return the value of the {@code maximum} field. */ + @NativeType("FT_Long") + public long maximum() { return FT_MM_Axis.nmaximum(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_MM_Var.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_MM_Var.java new file mode 100644 index 000000000..1d3922097 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_MM_Var.java @@ -0,0 +1,285 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure to model the axes and space of an Adobe MM, TrueType GX, or OpenType variation font. + * + *

    Layout

    + * + *
    
    + * struct FT_MM_Var {
    + *     FT_UInt num_axis;
    + *     FT_UInt num_designs;
    + *     FT_UInt num_namedstyles;
    + *     {@link FT_Var_Axis FT_Var_Axis} * axis;
    + *     {@link FT_Var_Named_Style FT_Var_Named_Style} * namedstyle;
    + * }
    + */ +public class FT_MM_Var extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NUM_AXIS, + NUM_DESIGNS, + NUM_NAMEDSTYLES, + AXIS, + NAMEDSTYLE; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NUM_AXIS = layout.offsetof(0); + NUM_DESIGNS = layout.offsetof(1); + NUM_NAMEDSTYLES = layout.offsetof(2); + AXIS = layout.offsetof(3); + NAMEDSTYLE = layout.offsetof(4); + } + + protected FT_MM_Var(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_MM_Var create(long address, @Nullable ByteBuffer container) { + return new FT_MM_Var(address, container); + } + + /** + * Creates a {@code FT_MM_Var} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_MM_Var(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code num_axis} field. */ + @NativeType("FT_UInt") + public int num_axis() { return nnum_axis(address()); } + /** @return the value of the {@code num_designs} field. */ + @NativeType("FT_UInt") + public int num_designs() { return nnum_designs(address()); } + /** @return the value of the {@code num_namedstyles} field. */ + @NativeType("FT_UInt") + public int num_namedstyles() { return nnum_namedstyles(address()); } + /** @return a {@link FT_Var_Axis.Buffer} view of the struct array pointed to by the {@code axis} field. */ + @NativeType("FT_Var_Axis *") + public FT_Var_Axis.Buffer axis() { return naxis(address()); } + /** @return a {@link FT_Var_Named_Style.Buffer} view of the struct array pointed to by the {@code namedstyle} field. */ + @NativeType("FT_Var_Named_Style *") + public FT_Var_Named_Style.Buffer namedstyle() { return nnamedstyle(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_MM_Var} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_MM_Var malloc() { + return new FT_MM_Var(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_MM_Var} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_MM_Var calloc() { + return new FT_MM_Var(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_MM_Var} instance allocated with {@link BufferUtils}. */ + public static FT_MM_Var create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_MM_Var(memAddress(container), container); + } + + /** Returns a new {@code FT_MM_Var} instance for the specified memory address. */ + public static FT_MM_Var create(long address) { + return new FT_MM_Var(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_MM_Var createSafe(long address) { + return address == NULL ? null : new FT_MM_Var(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_MM_Var} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_MM_Var malloc(MemoryStack stack) { + return new FT_MM_Var(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_MM_Var} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_MM_Var calloc(MemoryStack stack) { + return new FT_MM_Var(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #num_axis}. */ + public static int nnum_axis(long struct) { return UNSAFE.getInt(null, struct + FT_MM_Var.NUM_AXIS); } + /** Unsafe version of {@link #num_designs}. */ + public static int nnum_designs(long struct) { return UNSAFE.getInt(null, struct + FT_MM_Var.NUM_DESIGNS); } + /** Unsafe version of {@link #num_namedstyles}. */ + public static int nnum_namedstyles(long struct) { return UNSAFE.getInt(null, struct + FT_MM_Var.NUM_NAMEDSTYLES); } + /** Unsafe version of {@link #axis}. */ + public static FT_Var_Axis.Buffer naxis(long struct) { return FT_Var_Axis.create(memGetAddress(struct + FT_MM_Var.AXIS), nnum_axis(struct)); } + /** Unsafe version of {@link #namedstyle}. */ + public static FT_Var_Named_Style.Buffer nnamedstyle(long struct) { return FT_Var_Named_Style.create(memGetAddress(struct + FT_MM_Var.NAMEDSTYLE), nnum_namedstyles(struct)); } + + // ----------------------------------- + + /** An array of {@link FT_MM_Var} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_MM_Var ELEMENT_FACTORY = FT_MM_Var.create(-1L); + + /** + * Creates a new {@code FT_MM_Var.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_MM_Var#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_MM_Var getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code num_axis} field. */ + @NativeType("FT_UInt") + public int num_axis() { return FT_MM_Var.nnum_axis(address()); } + /** @return the value of the {@code num_designs} field. */ + @NativeType("FT_UInt") + public int num_designs() { return FT_MM_Var.nnum_designs(address()); } + /** @return the value of the {@code num_namedstyles} field. */ + @NativeType("FT_UInt") + public int num_namedstyles() { return FT_MM_Var.nnum_namedstyles(address()); } + /** @return a {@link FT_Var_Axis.Buffer} view of the struct array pointed to by the {@code axis} field. */ + @NativeType("FT_Var_Axis *") + public FT_Var_Axis.Buffer axis() { return FT_MM_Var.naxis(address()); } + /** @return a {@link FT_Var_Named_Style.Buffer} view of the struct array pointed to by the {@code namedstyle} field. */ + @NativeType("FT_Var_Named_Style *") + public FT_Var_Named_Style.Buffer namedstyle() { return FT_MM_Var.nnamedstyle(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Matrix.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Matrix.java new file mode 100644 index 000000000..a31021912 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Matrix.java @@ -0,0 +1,327 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A simple structure used to store a 2x2 matrix. Coefficients are in 16.16 fixed-point format. + * + *

    Layout

    + * + *
    
    + * struct FT_Matrix {
    + *     FT_Fixed xx;
    + *     FT_Fixed xy;
    + *     FT_Fixed yx;
    + *     FT_Fixed yy;
    + * }
    + */ +public class FT_Matrix extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + XX, + XY, + YX, + YY; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + XX = layout.offsetof(0); + XY = layout.offsetof(1); + YX = layout.offsetof(2); + YY = layout.offsetof(3); + } + + protected FT_Matrix(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Matrix create(long address, @Nullable ByteBuffer container) { + return new FT_Matrix(address, container); + } + + /** + * Creates a {@code FT_Matrix} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Matrix(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code xx} field. */ + @NativeType("FT_Fixed") + public long xx() { return nxx(address()); } + /** @return the value of the {@code xy} field. */ + @NativeType("FT_Fixed") + public long xy() { return nxy(address()); } + /** @return the value of the {@code yx} field. */ + @NativeType("FT_Fixed") + public long yx() { return nyx(address()); } + /** @return the value of the {@code yy} field. */ + @NativeType("FT_Fixed") + public long yy() { return nyy(address()); } + + /** Sets the specified value to the {@code xx} field. */ + public FT_Matrix xx(@NativeType("FT_Fixed") long value) { nxx(address(), value); return this; } + /** Sets the specified value to the {@code xy} field. */ + public FT_Matrix xy(@NativeType("FT_Fixed") long value) { nxy(address(), value); return this; } + /** Sets the specified value to the {@code yx} field. */ + public FT_Matrix yx(@NativeType("FT_Fixed") long value) { nyx(address(), value); return this; } + /** Sets the specified value to the {@code yy} field. */ + public FT_Matrix yy(@NativeType("FT_Fixed") long value) { nyy(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Matrix set( + long xx, + long xy, + long yx, + long yy + ) { + xx(xx); + xy(xy); + yx(yx); + yy(yy); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Matrix set(FT_Matrix src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Matrix} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Matrix malloc() { + return new FT_Matrix(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Matrix} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Matrix calloc() { + return new FT_Matrix(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Matrix} instance allocated with {@link BufferUtils}. */ + public static FT_Matrix create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Matrix(memAddress(container), container); + } + + /** Returns a new {@code FT_Matrix} instance for the specified memory address. */ + public static FT_Matrix create(long address) { + return new FT_Matrix(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Matrix createSafe(long address) { + return address == NULL ? null : new FT_Matrix(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Matrix} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Matrix malloc(MemoryStack stack) { + return new FT_Matrix(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Matrix} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Matrix calloc(MemoryStack stack) { + return new FT_Matrix(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #xx}. */ + public static long nxx(long struct) { return memGetCLong(struct + FT_Matrix.XX); } + /** Unsafe version of {@link #xy}. */ + public static long nxy(long struct) { return memGetCLong(struct + FT_Matrix.XY); } + /** Unsafe version of {@link #yx}. */ + public static long nyx(long struct) { return memGetCLong(struct + FT_Matrix.YX); } + /** Unsafe version of {@link #yy}. */ + public static long nyy(long struct) { return memGetCLong(struct + FT_Matrix.YY); } + + /** Unsafe version of {@link #xx(long) xx}. */ + public static void nxx(long struct, long value) { memPutCLong(struct + FT_Matrix.XX, value); } + /** Unsafe version of {@link #xy(long) xy}. */ + public static void nxy(long struct, long value) { memPutCLong(struct + FT_Matrix.XY, value); } + /** Unsafe version of {@link #yx(long) yx}. */ + public static void nyx(long struct, long value) { memPutCLong(struct + FT_Matrix.YX, value); } + /** Unsafe version of {@link #yy(long) yy}. */ + public static void nyy(long struct, long value) { memPutCLong(struct + FT_Matrix.YY, value); } + + // ----------------------------------- + + /** An array of {@link FT_Matrix} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Matrix ELEMENT_FACTORY = FT_Matrix.create(-1L); + + /** + * Creates a new {@code FT_Matrix.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Matrix#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Matrix getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code xx} field. */ + @NativeType("FT_Fixed") + public long xx() { return FT_Matrix.nxx(address()); } + /** @return the value of the {@code xy} field. */ + @NativeType("FT_Fixed") + public long xy() { return FT_Matrix.nxy(address()); } + /** @return the value of the {@code yx} field. */ + @NativeType("FT_Fixed") + public long yx() { return FT_Matrix.nyx(address()); } + /** @return the value of the {@code yy} field. */ + @NativeType("FT_Fixed") + public long yy() { return FT_Matrix.nyy(address()); } + + /** Sets the specified value to the {@code xx} field. */ + public Buffer xx(@NativeType("FT_Fixed") long value) { FT_Matrix.nxx(address(), value); return this; } + /** Sets the specified value to the {@code xy} field. */ + public Buffer xy(@NativeType("FT_Fixed") long value) { FT_Matrix.nxy(address(), value); return this; } + /** Sets the specified value to the {@code yx} field. */ + public Buffer yx(@NativeType("FT_Fixed") long value) { FT_Matrix.nyx(address(), value); return this; } + /** Sets the specified value to the {@code yy} field. */ + public Buffer yy(@NativeType("FT_Fixed") long value) { FT_Matrix.nyy(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Memory.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Memory.java new file mode 100644 index 000000000..b22dc1281 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Memory.java @@ -0,0 +1,328 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure used to describe a given memory manager to FreeType~2. + * + *

    Layout

    + * + *
    
    + * struct FT_MemoryRec_ {
    + *     void * user;
    + *     {@link FT_Alloc_FuncI FT_Alloc_Func} alloc;
    + *     {@link FT_Free_FuncI FT_Free_Func} free;
    + *     {@link FT_Realloc_FuncI FT_Realloc_Func} realloc;
    + * }
    + */ +@NativeType("struct FT_MemoryRec_") +public class FT_Memory extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + USER, + ALLOC, + FREE, + REALLOC; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + USER = layout.offsetof(0); + ALLOC = layout.offsetof(1); + FREE = layout.offsetof(2); + REALLOC = layout.offsetof(3); + } + + protected FT_Memory(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Memory create(long address, @Nullable ByteBuffer container) { + return new FT_Memory(address, container); + } + + /** + * Creates a {@code FT_Memory} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Memory(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code user} field. */ + @NativeType("void *") + public long user() { return nuser(address()); } + /** @return the value of the {@code alloc} field. */ + @Nullable + public FT_Alloc_Func alloc() { return nalloc(address()); } + /** @return the value of the {@code free} field. */ + @Nullable + public FT_Free_Func free$() { return nfree$(address()); } + /** @return the value of the {@code realloc} field. */ + @Nullable + public FT_Realloc_Func realloc() { return nrealloc(address()); } + + /** Sets the specified value to the {@code user} field. */ + public FT_Memory user(@NativeType("void *") long value) { nuser(address(), value); return this; } + /** Sets the specified value to the {@code alloc} field. */ + public FT_Memory alloc(@Nullable @NativeType("FT_Alloc_Func") FT_Alloc_FuncI value) { nalloc(address(), value); return this; } + /** Sets the specified value to the {@code free} field. */ + public FT_Memory free$(@Nullable @NativeType("FT_Free_Func") FT_Free_FuncI value) { nfree$(address(), value); return this; } + /** Sets the specified value to the {@code realloc} field. */ + public FT_Memory realloc(@Nullable @NativeType("FT_Realloc_Func") FT_Realloc_FuncI value) { nrealloc(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Memory set( + long user, + FT_Alloc_FuncI alloc, + FT_Free_FuncI free$, + FT_Realloc_FuncI realloc + ) { + user(user); + alloc(alloc); + free$(free$); + realloc(realloc); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Memory set(FT_Memory src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Memory} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Memory malloc() { + return new FT_Memory(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Memory} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Memory calloc() { + return new FT_Memory(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Memory} instance allocated with {@link BufferUtils}. */ + public static FT_Memory create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Memory(memAddress(container), container); + } + + /** Returns a new {@code FT_Memory} instance for the specified memory address. */ + public static FT_Memory create(long address) { + return new FT_Memory(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Memory createSafe(long address) { + return address == NULL ? null : new FT_Memory(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Memory} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Memory malloc(MemoryStack stack) { + return new FT_Memory(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Memory} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Memory calloc(MemoryStack stack) { + return new FT_Memory(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #user}. */ + public static long nuser(long struct) { return memGetAddress(struct + FT_Memory.USER); } + /** Unsafe version of {@link #alloc}. */ + @Nullable public static FT_Alloc_Func nalloc(long struct) { return FT_Alloc_Func.createSafe(memGetAddress(struct + FT_Memory.ALLOC)); } + /** Unsafe version of {@link #free$}. */ + @Nullable public static FT_Free_Func nfree$(long struct) { return FT_Free_Func.createSafe(memGetAddress(struct + FT_Memory.FREE)); } + /** Unsafe version of {@link #realloc}. */ + @Nullable public static FT_Realloc_Func nrealloc(long struct) { return FT_Realloc_Func.createSafe(memGetAddress(struct + FT_Memory.REALLOC)); } + + /** Unsafe version of {@link #user(long) user}. */ + public static void nuser(long struct, long value) { memPutAddress(struct + FT_Memory.USER, value); } + /** Unsafe version of {@link #alloc(FT_Alloc_FuncI) alloc}. */ + public static void nalloc(long struct, @Nullable FT_Alloc_FuncI value) { memPutAddress(struct + FT_Memory.ALLOC, memAddressSafe(value)); } + /** Unsafe version of {@link #free$(FT_Free_FuncI) free$}. */ + public static void nfree$(long struct, @Nullable FT_Free_FuncI value) { memPutAddress(struct + FT_Memory.FREE, memAddressSafe(value)); } + /** Unsafe version of {@link #realloc(FT_Realloc_FuncI) realloc}. */ + public static void nrealloc(long struct, @Nullable FT_Realloc_FuncI value) { memPutAddress(struct + FT_Memory.REALLOC, memAddressSafe(value)); } + + // ----------------------------------- + + /** An array of {@link FT_Memory} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Memory ELEMENT_FACTORY = FT_Memory.create(-1L); + + /** + * Creates a new {@code FT_Memory.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Memory#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Memory getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code user} field. */ + @NativeType("void *") + public long user() { return FT_Memory.nuser(address()); } + /** @return the value of the {@code alloc} field. */ + @Nullable + public FT_Alloc_Func alloc() { return FT_Memory.nalloc(address()); } + /** @return the value of the {@code free} field. */ + @Nullable + public FT_Free_Func free$() { return FT_Memory.nfree$(address()); } + /** @return the value of the {@code realloc} field. */ + @Nullable + public FT_Realloc_Func realloc() { return FT_Memory.nrealloc(address()); } + + /** Sets the specified value to the {@code user} field. */ + public Buffer user(@NativeType("void *") long value) { FT_Memory.nuser(address(), value); return this; } + /** Sets the specified value to the {@code alloc} field. */ + public Buffer alloc(@Nullable @NativeType("FT_Alloc_Func") FT_Alloc_FuncI value) { FT_Memory.nalloc(address(), value); return this; } + /** Sets the specified value to the {@code free} field. */ + public Buffer free$(@Nullable @NativeType("FT_Free_Func") FT_Free_FuncI value) { FT_Memory.nfree$(address(), value); return this; } + /** Sets the specified value to the {@code realloc} field. */ + public Buffer realloc(@Nullable @NativeType("FT_Realloc_Func") FT_Realloc_FuncI value) { FT_Memory.nrealloc(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Class.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Class.java new file mode 100644 index 000000000..a634970ee --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Class.java @@ -0,0 +1,458 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * The module class descriptor. + * + *

    Layout

    + * + *
    
    + * struct FT_Module_Class {
    + *     FT_ULong module_flags;
    + *     FT_Long module_size;
    + *     FT_String const * module_name;
    + *     FT_Fixed module_version;
    + *     FT_Fixed module_requires;
    + *     void const * module_interface;
    + *     {@link FT_Module_ConstructorI FT_Module_Constructor} module_init;
    + *     {@link FT_Module_DestructorI FT_Module_Destructor} module_done;
    + *     {@link FT_Module_RequesterI FT_Module_Requester} get_interface;
    + * }
    + */ +public class FT_Module_Class extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + MODULE_FLAGS, + MODULE_SIZE, + MODULE_NAME, + MODULE_VERSION, + MODULE_REQUIRES, + MODULE_INTERFACE, + MODULE_INIT, + MODULE_DONE, + GET_INTERFACE; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + MODULE_FLAGS = layout.offsetof(0); + MODULE_SIZE = layout.offsetof(1); + MODULE_NAME = layout.offsetof(2); + MODULE_VERSION = layout.offsetof(3); + MODULE_REQUIRES = layout.offsetof(4); + MODULE_INTERFACE = layout.offsetof(5); + MODULE_INIT = layout.offsetof(6); + MODULE_DONE = layout.offsetof(7); + GET_INTERFACE = layout.offsetof(8); + } + + protected FT_Module_Class(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Module_Class create(long address, @Nullable ByteBuffer container) { + return new FT_Module_Class(address, container); + } + + /** + * Creates a {@code FT_Module_Class} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Module_Class(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code module_flags} field. */ + @NativeType("FT_ULong") + public long module_flags() { return nmodule_flags(address()); } + /** @return the value of the {@code module_size} field. */ + @NativeType("FT_Long") + public long module_size() { return nmodule_size(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code module_name} field. */ + @NativeType("FT_String const *") + public ByteBuffer module_name() { return nmodule_name(address()); } + /** @return the null-terminated string pointed to by the {@code module_name} field. */ + @NativeType("FT_String const *") + public String module_nameString() { return nmodule_nameString(address()); } + /** @return the value of the {@code module_version} field. */ + @NativeType("FT_Fixed") + public long module_version() { return nmodule_version(address()); } + /** @return the value of the {@code module_requires} field. */ + @NativeType("FT_Fixed") + public long module_requires() { return nmodule_requires(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code module_interface} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void const *") + public ByteBuffer module_interface(int capacity) { return nmodule_interface(address(), capacity); } + /** @return the value of the {@code module_init} field. */ + @Nullable + public FT_Module_Constructor module_init() { return nmodule_init(address()); } + /** @return the value of the {@code module_done} field. */ + @Nullable + public FT_Module_Destructor module_done() { return nmodule_done(address()); } + /** @return the value of the {@code get_interface} field. */ + @Nullable + public FT_Module_Requester get_interface() { return nget_interface(address()); } + + /** Sets the specified value to the {@code module_flags} field. */ + public FT_Module_Class module_flags(@NativeType("FT_ULong") long value) { nmodule_flags(address(), value); return this; } + /** Sets the specified value to the {@code module_size} field. */ + public FT_Module_Class module_size(@NativeType("FT_Long") long value) { nmodule_size(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@code module_name} field. */ + public FT_Module_Class module_name(@NativeType("FT_String const *") ByteBuffer value) { nmodule_name(address(), value); return this; } + /** Sets the specified value to the {@code module_version} field. */ + public FT_Module_Class module_version(@NativeType("FT_Fixed") long value) { nmodule_version(address(), value); return this; } + /** Sets the specified value to the {@code module_requires} field. */ + public FT_Module_Class module_requires(@NativeType("FT_Fixed") long value) { nmodule_requires(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code module_interface} field. */ + public FT_Module_Class module_interface(@Nullable @NativeType("void const *") ByteBuffer value) { nmodule_interface(address(), value); return this; } + /** Sets the specified value to the {@code module_init} field. */ + public FT_Module_Class module_init(@Nullable @NativeType("FT_Module_Constructor") FT_Module_ConstructorI value) { nmodule_init(address(), value); return this; } + /** Sets the specified value to the {@code module_done} field. */ + public FT_Module_Class module_done(@Nullable @NativeType("FT_Module_Destructor") FT_Module_DestructorI value) { nmodule_done(address(), value); return this; } + /** Sets the specified value to the {@code get_interface} field. */ + public FT_Module_Class get_interface(@Nullable @NativeType("FT_Module_Requester") FT_Module_RequesterI value) { nget_interface(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Module_Class set( + long module_flags, + long module_size, + ByteBuffer module_name, + long module_version, + long module_requires, + @Nullable ByteBuffer module_interface, + @Nullable FT_Module_ConstructorI module_init, + @Nullable FT_Module_DestructorI module_done, + @Nullable FT_Module_RequesterI get_interface + ) { + module_flags(module_flags); + module_size(module_size); + module_name(module_name); + module_version(module_version); + module_requires(module_requires); + module_interface(module_interface); + module_init(module_init); + module_done(module_done); + get_interface(get_interface); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Module_Class set(FT_Module_Class src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Module_Class} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Module_Class malloc() { + return new FT_Module_Class(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Module_Class} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Module_Class calloc() { + return new FT_Module_Class(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Module_Class} instance allocated with {@link BufferUtils}. */ + public static FT_Module_Class create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Module_Class(memAddress(container), container); + } + + /** Returns a new {@code FT_Module_Class} instance for the specified memory address. */ + public static FT_Module_Class create(long address) { + return new FT_Module_Class(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Module_Class createSafe(long address) { + return address == NULL ? null : new FT_Module_Class(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Module_Class} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Module_Class malloc(MemoryStack stack) { + return new FT_Module_Class(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Module_Class} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Module_Class calloc(MemoryStack stack) { + return new FT_Module_Class(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #module_flags}. */ + public static long nmodule_flags(long struct) { return memGetCLong(struct + FT_Module_Class.MODULE_FLAGS); } + /** Unsafe version of {@link #module_size}. */ + public static long nmodule_size(long struct) { return memGetCLong(struct + FT_Module_Class.MODULE_SIZE); } + /** Unsafe version of {@link #module_name}. */ + public static ByteBuffer nmodule_name(long struct) { return memByteBufferNT1(memGetAddress(struct + FT_Module_Class.MODULE_NAME)); } + /** Unsafe version of {@link #module_nameString}. */ + public static String nmodule_nameString(long struct) { return memUTF8(memGetAddress(struct + FT_Module_Class.MODULE_NAME)); } + /** Unsafe version of {@link #module_version}. */ + public static long nmodule_version(long struct) { return memGetCLong(struct + FT_Module_Class.MODULE_VERSION); } + /** Unsafe version of {@link #module_requires}. */ + public static long nmodule_requires(long struct) { return memGetCLong(struct + FT_Module_Class.MODULE_REQUIRES); } + /** Unsafe version of {@link #module_interface(int) module_interface}. */ + @Nullable public static ByteBuffer nmodule_interface(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + FT_Module_Class.MODULE_INTERFACE), capacity); } + /** Unsafe version of {@link #module_init}. */ + @Nullable public static FT_Module_Constructor nmodule_init(long struct) { return FT_Module_Constructor.createSafe(memGetAddress(struct + FT_Module_Class.MODULE_INIT)); } + /** Unsafe version of {@link #module_done}. */ + @Nullable public static FT_Module_Destructor nmodule_done(long struct) { return FT_Module_Destructor.createSafe(memGetAddress(struct + FT_Module_Class.MODULE_DONE)); } + /** Unsafe version of {@link #get_interface}. */ + @Nullable public static FT_Module_Requester nget_interface(long struct) { return FT_Module_Requester.createSafe(memGetAddress(struct + FT_Module_Class.GET_INTERFACE)); } + + /** Unsafe version of {@link #module_flags(long) module_flags}. */ + public static void nmodule_flags(long struct, long value) { memPutCLong(struct + FT_Module_Class.MODULE_FLAGS, value); } + /** Unsafe version of {@link #module_size(long) module_size}. */ + public static void nmodule_size(long struct, long value) { memPutCLong(struct + FT_Module_Class.MODULE_SIZE, value); } + /** Unsafe version of {@link #module_name(ByteBuffer) module_name}. */ + public static void nmodule_name(long struct, ByteBuffer value) { + if (CHECKS) { checkNT1(value); } + memPutAddress(struct + FT_Module_Class.MODULE_NAME, memAddress(value)); + } + /** Unsafe version of {@link #module_version(long) module_version}. */ + public static void nmodule_version(long struct, long value) { memPutCLong(struct + FT_Module_Class.MODULE_VERSION, value); } + /** Unsafe version of {@link #module_requires(long) module_requires}. */ + public static void nmodule_requires(long struct, long value) { memPutCLong(struct + FT_Module_Class.MODULE_REQUIRES, value); } + /** Unsafe version of {@link #module_interface(ByteBuffer) module_interface}. */ + public static void nmodule_interface(long struct, @Nullable ByteBuffer value) { memPutAddress(struct + FT_Module_Class.MODULE_INTERFACE, memAddressSafe(value)); } + /** Unsafe version of {@link #module_init(FT_Module_ConstructorI) module_init}. */ + public static void nmodule_init(long struct, @Nullable FT_Module_ConstructorI value) { memPutAddress(struct + FT_Module_Class.MODULE_INIT, memAddressSafe(value)); } + /** Unsafe version of {@link #module_done(FT_Module_DestructorI) module_done}. */ + public static void nmodule_done(long struct, @Nullable FT_Module_DestructorI value) { memPutAddress(struct + FT_Module_Class.MODULE_DONE, memAddressSafe(value)); } + /** Unsafe version of {@link #get_interface(FT_Module_RequesterI) get_interface}. */ + public static void nget_interface(long struct, @Nullable FT_Module_RequesterI value) { memPutAddress(struct + FT_Module_Class.GET_INTERFACE, memAddressSafe(value)); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + FT_Module_Class.MODULE_NAME)); + } + + // ----------------------------------- + + /** An array of {@link FT_Module_Class} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Module_Class ELEMENT_FACTORY = FT_Module_Class.create(-1L); + + /** + * Creates a new {@code FT_Module_Class.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Module_Class#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Module_Class getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code module_flags} field. */ + @NativeType("FT_ULong") + public long module_flags() { return FT_Module_Class.nmodule_flags(address()); } + /** @return the value of the {@code module_size} field. */ + @NativeType("FT_Long") + public long module_size() { return FT_Module_Class.nmodule_size(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code module_name} field. */ + @NativeType("FT_String const *") + public ByteBuffer module_name() { return FT_Module_Class.nmodule_name(address()); } + /** @return the null-terminated string pointed to by the {@code module_name} field. */ + @NativeType("FT_String const *") + public String module_nameString() { return FT_Module_Class.nmodule_nameString(address()); } + /** @return the value of the {@code module_version} field. */ + @NativeType("FT_Fixed") + public long module_version() { return FT_Module_Class.nmodule_version(address()); } + /** @return the value of the {@code module_requires} field. */ + @NativeType("FT_Fixed") + public long module_requires() { return FT_Module_Class.nmodule_requires(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code module_interface} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void const *") + public ByteBuffer module_interface(int capacity) { return FT_Module_Class.nmodule_interface(address(), capacity); } + /** @return the value of the {@code module_init} field. */ + @Nullable + public FT_Module_Constructor module_init() { return FT_Module_Class.nmodule_init(address()); } + /** @return the value of the {@code module_done} field. */ + @Nullable + public FT_Module_Destructor module_done() { return FT_Module_Class.nmodule_done(address()); } + /** @return the value of the {@code get_interface} field. */ + @Nullable + public FT_Module_Requester get_interface() { return FT_Module_Class.nget_interface(address()); } + + /** Sets the specified value to the {@code module_flags} field. */ + public Buffer module_flags(@NativeType("FT_ULong") long value) { FT_Module_Class.nmodule_flags(address(), value); return this; } + /** Sets the specified value to the {@code module_size} field. */ + public Buffer module_size(@NativeType("FT_Long") long value) { FT_Module_Class.nmodule_size(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@code module_name} field. */ + public Buffer module_name(@NativeType("FT_String const *") ByteBuffer value) { FT_Module_Class.nmodule_name(address(), value); return this; } + /** Sets the specified value to the {@code module_version} field. */ + public Buffer module_version(@NativeType("FT_Fixed") long value) { FT_Module_Class.nmodule_version(address(), value); return this; } + /** Sets the specified value to the {@code module_requires} field. */ + public Buffer module_requires(@NativeType("FT_Fixed") long value) { FT_Module_Class.nmodule_requires(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code module_interface} field. */ + public Buffer module_interface(@Nullable @NativeType("void const *") ByteBuffer value) { FT_Module_Class.nmodule_interface(address(), value); return this; } + /** Sets the specified value to the {@code module_init} field. */ + public Buffer module_init(@Nullable @NativeType("FT_Module_Constructor") FT_Module_ConstructorI value) { FT_Module_Class.nmodule_init(address(), value); return this; } + /** Sets the specified value to the {@code module_done} field. */ + public Buffer module_done(@Nullable @NativeType("FT_Module_Destructor") FT_Module_DestructorI value) { FT_Module_Class.nmodule_done(address(), value); return this; } + /** Sets the specified value to the {@code get_interface} field. */ + public Buffer get_interface(@Nullable @NativeType("FT_Module_Requester") FT_Module_RequesterI value) { FT_Module_Class.nget_interface(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Constructor.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Constructor.java new file mode 100644 index 000000000..9a688163e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Constructor.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_Module module
    + * )
    + */ +public abstract class FT_Module_Constructor extends Callback implements FT_Module_ConstructorI { + + /** + * Creates a {@code FT_Module_Constructor} instance from the specified function pointer. + * + * @return the new {@code FT_Module_Constructor} + */ + public static FT_Module_Constructor create(long functionPointer) { + FT_Module_ConstructorI instance = Callback.get(functionPointer); + return instance instanceof FT_Module_Constructor + ? (FT_Module_Constructor)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Module_Constructor createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Module_Constructor} instance that delegates to the specified {@code FT_Module_ConstructorI} instance. */ + public static FT_Module_Constructor create(FT_Module_ConstructorI instance) { + return instance instanceof FT_Module_Constructor + ? (FT_Module_Constructor)instance + : new Container(instance.address(), instance); + } + + protected FT_Module_Constructor() { + super(CIF); + } + + FT_Module_Constructor(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Module_Constructor { + + private final FT_Module_ConstructorI delegate; + + Container(long functionPointer, FT_Module_ConstructorI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long module) { + return delegate.invoke(module); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_ConstructorI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_ConstructorI.java new file mode 100644 index 000000000..bcf5e91f2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_ConstructorI.java @@ -0,0 +1,47 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_Module module
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Module_Constructor") +public interface FT_Module_ConstructorI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)) + ); + apiClosureRet(ret, __result); + } + + /** A function used to initialize (not create) a new module object. */ + @NativeType("FT_Error") int invoke(@NativeType("FT_Module") long module); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Destructor.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Destructor.java new file mode 100644 index 000000000..c19f5ac3d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Destructor.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Module module
    + * )
    + */ +public abstract class FT_Module_Destructor extends Callback implements FT_Module_DestructorI { + + /** + * Creates a {@code FT_Module_Destructor} instance from the specified function pointer. + * + * @return the new {@code FT_Module_Destructor} + */ + public static FT_Module_Destructor create(long functionPointer) { + FT_Module_DestructorI instance = Callback.get(functionPointer); + return instance instanceof FT_Module_Destructor + ? (FT_Module_Destructor)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Module_Destructor createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Module_Destructor} instance that delegates to the specified {@code FT_Module_DestructorI} instance. */ + public static FT_Module_Destructor create(FT_Module_DestructorI instance) { + return instance instanceof FT_Module_Destructor + ? (FT_Module_Destructor)instance + : new Container(instance.address(), instance); + } + + protected FT_Module_Destructor() { + super(CIF); + } + + FT_Module_Destructor(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Module_Destructor { + + private final FT_Module_DestructorI delegate; + + Container(long functionPointer, FT_Module_DestructorI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long module) { + delegate.invoke(module); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_DestructorI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_DestructorI.java new file mode 100644 index 000000000..96a5b1858 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_DestructorI.java @@ -0,0 +1,46 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Module module
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Module_Destructor") +public interface FT_Module_DestructorI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)) + ); + } + + /** A function used to finalize (not destroy) a given module object. */ + void invoke(@NativeType("FT_Module") long module); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Requester.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Requester.java new file mode 100644 index 000000000..2aed1f413 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_Requester.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * FT_Module_Interface (*{@link #invoke}) (
    + *     FT_Module module,
    + *     char const *name
    + * )
    + */ +public abstract class FT_Module_Requester extends Callback implements FT_Module_RequesterI { + + /** + * Creates a {@code FT_Module_Requester} instance from the specified function pointer. + * + * @return the new {@code FT_Module_Requester} + */ + public static FT_Module_Requester create(long functionPointer) { + FT_Module_RequesterI instance = Callback.get(functionPointer); + return instance instanceof FT_Module_Requester + ? (FT_Module_Requester)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Module_Requester createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Module_Requester} instance that delegates to the specified {@code FT_Module_RequesterI} instance. */ + public static FT_Module_Requester create(FT_Module_RequesterI instance) { + return instance instanceof FT_Module_Requester + ? (FT_Module_Requester)instance + : new Container(instance.address(), instance); + } + + protected FT_Module_Requester() { + super(CIF); + } + + FT_Module_Requester(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Module_Requester { + + private final FT_Module_RequesterI delegate; + + Container(long functionPointer, FT_Module_RequesterI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public long invoke(long module, long name) { + return delegate.invoke(module, name); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_RequesterI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_RequesterI.java new file mode 100644 index 000000000..f11dae5d9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Module_RequesterI.java @@ -0,0 +1,49 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * FT_Module_Interface (*{@link #invoke}) (
    + *     FT_Module module,
    + *     char const *name
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Module_Requester") +public interface FT_Module_RequesterI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_pointer, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + long __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + apiClosureRetP(ret, __result); + } + + /** A function used to query a given module for a specific interface. */ + @NativeType("FT_Module_Interface") long invoke(@NativeType("FT_Module") long module, @NativeType("char const *") long name); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Multi_Master.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Multi_Master.java new file mode 100644 index 000000000..28b4d0dcc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Multi_Master.java @@ -0,0 +1,272 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +import static org.lwjgl.util.freetype.FreeType.*; + +/** + * A structure to model the axes and space of a Multiple Masters font. + * + *

    Layout

    + * + *
    
    + * struct FT_Multi_Master {
    + *     FT_UInt num_axis;
    + *     FT_UInt num_designs;
    + *     {@link FT_MM_Axis FT_MM_Axis} axis[T1_MAX_MM_AXIS];
    + * }
    + */ +public class FT_Multi_Master extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NUM_AXIS, + NUM_DESIGNS, + AXIS; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __array(FT_MM_Axis.SIZEOF, FT_MM_Axis.ALIGNOF, T1_MAX_MM_AXIS) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NUM_AXIS = layout.offsetof(0); + NUM_DESIGNS = layout.offsetof(1); + AXIS = layout.offsetof(2); + } + + protected FT_Multi_Master(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Multi_Master create(long address, @Nullable ByteBuffer container) { + return new FT_Multi_Master(address, container); + } + + /** + * Creates a {@code FT_Multi_Master} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Multi_Master(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code num_axis} field. */ + @NativeType("FT_UInt") + public int num_axis() { return nnum_axis(address()); } + /** @return the value of the {@code num_designs} field. */ + @NativeType("FT_UInt") + public int num_designs() { return nnum_designs(address()); } + /** @return a {@link FT_MM_Axis}.Buffer view of the {@code axis} field. */ + @NativeType("FT_MM_Axis[T1_MAX_MM_AXIS]") + public FT_MM_Axis.Buffer axis() { return naxis(address()); } + /** @return a {@link FT_MM_Axis} view of the struct at the specified index of the {@code axis} field. */ + public FT_MM_Axis axis(int index) { return naxis(address(), index); } + + // ----------------------------------- + + /** Returns a new {@code FT_Multi_Master} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Multi_Master malloc() { + return new FT_Multi_Master(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Multi_Master} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Multi_Master calloc() { + return new FT_Multi_Master(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Multi_Master} instance allocated with {@link BufferUtils}. */ + public static FT_Multi_Master create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Multi_Master(memAddress(container), container); + } + + /** Returns a new {@code FT_Multi_Master} instance for the specified memory address. */ + public static FT_Multi_Master create(long address) { + return new FT_Multi_Master(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Multi_Master createSafe(long address) { + return address == NULL ? null : new FT_Multi_Master(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Multi_Master} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Multi_Master malloc(MemoryStack stack) { + return new FT_Multi_Master(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Multi_Master} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Multi_Master calloc(MemoryStack stack) { + return new FT_Multi_Master(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #num_axis}. */ + public static int nnum_axis(long struct) { return UNSAFE.getInt(null, struct + FT_Multi_Master.NUM_AXIS); } + /** Unsafe version of {@link #num_designs}. */ + public static int nnum_designs(long struct) { return UNSAFE.getInt(null, struct + FT_Multi_Master.NUM_DESIGNS); } + /** Unsafe version of {@link #axis}. */ + public static FT_MM_Axis.Buffer naxis(long struct) { return FT_MM_Axis.create(struct + FT_Multi_Master.AXIS, T1_MAX_MM_AXIS); } + /** Unsafe version of {@link #axis(int) axis}. */ + public static FT_MM_Axis naxis(long struct, int index) { + return FT_MM_Axis.create(struct + FT_Multi_Master.AXIS + check(index, T1_MAX_MM_AXIS) * FT_MM_Axis.SIZEOF); + } + + // ----------------------------------- + + /** An array of {@link FT_Multi_Master} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Multi_Master ELEMENT_FACTORY = FT_Multi_Master.create(-1L); + + /** + * Creates a new {@code FT_Multi_Master.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Multi_Master#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Multi_Master getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code num_axis} field. */ + @NativeType("FT_UInt") + public int num_axis() { return FT_Multi_Master.nnum_axis(address()); } + /** @return the value of the {@code num_designs} field. */ + @NativeType("FT_UInt") + public int num_designs() { return FT_Multi_Master.nnum_designs(address()); } + /** @return a {@link FT_MM_Axis}.Buffer view of the {@code axis} field. */ + @NativeType("FT_MM_Axis[T1_MAX_MM_AXIS]") + public FT_MM_Axis.Buffer axis() { return FT_Multi_Master.naxis(address()); } + /** @return a {@link FT_MM_Axis} view of the struct at the specified index of the {@code axis} field. */ + public FT_MM_Axis axis(int index) { return FT_Multi_Master.naxis(address(), index); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_OpaquePaint.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_OpaquePaint.java new file mode 100644 index 000000000..8f321de81 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_OpaquePaint.java @@ -0,0 +1,260 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure representing an offset to a {@code Paint} value stored in any of the paint tables of a {@code COLR} v1 font. + * + *

    Layout

    + * + *
    
    + * struct FT_OpaquePaintRec {
    + *     FT_Byte * p;
    + *     FT_Bool insert_root_transform;
    + * }
    + */ +@NativeType("struct FT_OpaquePaintRec") +public class FT_OpaquePaint extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + P, + INSERT_ROOT_TRANSFORM; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(1) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + P = layout.offsetof(0); + INSERT_ROOT_TRANSFORM = layout.offsetof(1); + } + + protected FT_OpaquePaint(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_OpaquePaint create(long address, @Nullable ByteBuffer container) { + return new FT_OpaquePaint(address, container); + } + + /** + * Creates a {@code FT_OpaquePaint} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_OpaquePaint(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code p} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("FT_Byte *") + public ByteBuffer p(int capacity) { return np(address(), capacity); } + /** @return the value of the {@code insert_root_transform} field. */ + @NativeType("FT_Bool") + public boolean insert_root_transform() { return ninsert_root_transform(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_OpaquePaint} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_OpaquePaint malloc() { + return new FT_OpaquePaint(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_OpaquePaint} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_OpaquePaint calloc() { + return new FT_OpaquePaint(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_OpaquePaint} instance allocated with {@link BufferUtils}. */ + public static FT_OpaquePaint create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_OpaquePaint(memAddress(container), container); + } + + /** Returns a new {@code FT_OpaquePaint} instance for the specified memory address. */ + public static FT_OpaquePaint create(long address) { + return new FT_OpaquePaint(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_OpaquePaint createSafe(long address) { + return address == NULL ? null : new FT_OpaquePaint(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_OpaquePaint} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_OpaquePaint malloc(MemoryStack stack) { + return new FT_OpaquePaint(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_OpaquePaint} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_OpaquePaint calloc(MemoryStack stack) { + return new FT_OpaquePaint(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #p(int) p}. */ + @Nullable public static ByteBuffer np(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + FT_OpaquePaint.P), capacity); } + /** Unsafe version of {@link #insert_root_transform}. */ + public static boolean ninsert_root_transform(long struct) { return UNSAFE.getByte(null, struct + FT_OpaquePaint.INSERT_ROOT_TRANSFORM) != 0; } + + // ----------------------------------- + + /** An array of {@link FT_OpaquePaint} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_OpaquePaint ELEMENT_FACTORY = FT_OpaquePaint.create(-1L); + + /** + * Creates a new {@code FT_OpaquePaint.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_OpaquePaint#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_OpaquePaint getElementFactory() { + return ELEMENT_FACTORY; + } + + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code p} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("FT_Byte *") + public ByteBuffer p(int capacity) { return FT_OpaquePaint.np(address(), capacity); } + /** @return the value of the {@code insert_root_transform} field. */ + @NativeType("FT_Bool") + public boolean insert_root_transform() { return FT_OpaquePaint.ninsert_root_transform(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Open_Args.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Open_Args.java new file mode 100644 index 000000000..952e2b701 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Open_Args.java @@ -0,0 +1,428 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure to indicate how to open a new font file or stream. A pointer to such a structure can be used as a parameter for the functions + * {@link FreeType#FT_Open_Face Open_Face} and {@link FreeType#FT_Attach_Stream Attach_Stream}. + * + *

    Layout

    + * + *
    
    + * struct FT_Open_Args {
    + *     FT_UInt flags;
    + *     FT_Byte const * memory_base;
    + *     FT_Long memory_size;
    + *     FT_String * pathname;
    + *     {@link FT_Stream FT_Stream} stream;
    + *     FT_Module driver;
    + *     FT_Int num_params;
    + *     {@link FT_Parameter FT_Parameter} * params;
    + * }
    + */ +public class FT_Open_Args extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FLAGS, + MEMORY_BASE, + MEMORY_SIZE, + PATHNAME, + STREAM, + DRIVER, + NUM_PARAMS, + PARAMS; + + static { + Layout layout = __struct( + __member(4), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FLAGS = layout.offsetof(0); + MEMORY_BASE = layout.offsetof(1); + MEMORY_SIZE = layout.offsetof(2); + PATHNAME = layout.offsetof(3); + STREAM = layout.offsetof(4); + DRIVER = layout.offsetof(5); + NUM_PARAMS = layout.offsetof(6); + PARAMS = layout.offsetof(7); + } + + protected FT_Open_Args(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Open_Args create(long address, @Nullable ByteBuffer container) { + return new FT_Open_Args(address, container); + } + + /** + * Creates a {@code FT_Open_Args} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Open_Args(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code flags} field. */ + @NativeType("FT_UInt") + public int flags() { return nflags(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code memory_base} field. */ + @Nullable + @NativeType("FT_Byte const *") + public ByteBuffer memory_base() { return nmemory_base(address()); } + /** @return the value of the {@code memory_size} field. */ + @NativeType("FT_Long") + public long memory_size() { return nmemory_size(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code pathname} field. */ + @Nullable + @NativeType("FT_String *") + public ByteBuffer pathname() { return npathname(address()); } + /** @return the null-terminated string pointed to by the {@code pathname} field. */ + @Nullable + @NativeType("FT_String *") + public String pathnameString() { return npathnameString(address()); } + /** @return a {@link FT_Stream} view of the struct pointed to by the {@code stream} field. */ + @Nullable + public FT_Stream stream$() { return nstream$(address()); } + /** @return the value of the {@code driver} field. */ + @NativeType("FT_Module") + public long driver() { return ndriver(address()); } + /** @return the value of the {@code num_params} field. */ + @NativeType("FT_Int") + public int num_params() { return nnum_params(address()); } + /** @return a {@link FT_Parameter.Buffer} view of the struct array pointed to by the {@code params} field. */ + @Nullable + @NativeType("FT_Parameter *") + public FT_Parameter.Buffer params() { return nparams(address()); } + + /** Sets the specified value to the {@code flags} field. */ + public FT_Open_Args flags(@NativeType("FT_UInt") int value) { nflags(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code memory_base} field. */ + public FT_Open_Args memory_base(@Nullable @NativeType("FT_Byte const *") ByteBuffer value) { nmemory_base(address(), value); return this; } + /** Sets the specified value to the {@code memory_size} field. */ + public FT_Open_Args memory_size(@NativeType("FT_Long") long value) { nmemory_size(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@code pathname} field. */ + public FT_Open_Args pathname(@Nullable @NativeType("FT_String *") ByteBuffer value) { npathname(address(), value); return this; } + /** Sets the address of the specified {@link FT_Stream} to the {@code stream} field. */ + public FT_Open_Args stream$(@Nullable FT_Stream value) { nstream$(address(), value); return this; } + /** Sets the specified value to the {@code driver} field. */ + public FT_Open_Args driver(@NativeType("FT_Module") long value) { ndriver(address(), value); return this; } + /** Sets the specified value to the {@code num_params} field. */ + public FT_Open_Args num_params(@NativeType("FT_Int") int value) { nnum_params(address(), value); return this; } + /** Sets the address of the specified {@link FT_Parameter.Buffer} to the {@code params} field. */ + public FT_Open_Args params(@Nullable @NativeType("FT_Parameter *") FT_Parameter.Buffer value) { nparams(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Open_Args set( + int flags, + @Nullable ByteBuffer memory_base, + long memory_size, + @Nullable ByteBuffer pathname, + @Nullable FT_Stream stream$, + long driver, + int num_params, + @Nullable FT_Parameter.Buffer params + ) { + flags(flags); + memory_base(memory_base); + memory_size(memory_size); + pathname(pathname); + stream$(stream$); + driver(driver); + num_params(num_params); + params(params); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Open_Args set(FT_Open_Args src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Open_Args} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Open_Args malloc() { + return new FT_Open_Args(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Open_Args} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Open_Args calloc() { + return new FT_Open_Args(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Open_Args} instance allocated with {@link BufferUtils}. */ + public static FT_Open_Args create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Open_Args(memAddress(container), container); + } + + /** Returns a new {@code FT_Open_Args} instance for the specified memory address. */ + public static FT_Open_Args create(long address) { + return new FT_Open_Args(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Open_Args createSafe(long address) { + return address == NULL ? null : new FT_Open_Args(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Open_Args} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Open_Args malloc(MemoryStack stack) { + return new FT_Open_Args(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Open_Args} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Open_Args calloc(MemoryStack stack) { + return new FT_Open_Args(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + FT_Open_Args.FLAGS); } + /** Unsafe version of {@link #memory_base() memory_base}. */ + @Nullable public static ByteBuffer nmemory_base(long struct) { return memByteBufferSafe(memGetAddress(struct + FT_Open_Args.MEMORY_BASE), (int)nmemory_size(struct)); } + /** Unsafe version of {@link #memory_size}. */ + public static long nmemory_size(long struct) { return memGetCLong(struct + FT_Open_Args.MEMORY_SIZE); } + /** Unsafe version of {@link #pathname}. */ + @Nullable public static ByteBuffer npathname(long struct) { return memByteBufferNT1Safe(memGetAddress(struct + FT_Open_Args.PATHNAME)); } + /** Unsafe version of {@link #pathnameString}. */ + @Nullable public static String npathnameString(long struct) { return memUTF8Safe(memGetAddress(struct + FT_Open_Args.PATHNAME)); } + /** Unsafe version of {@link #stream$}. */ + @Nullable public static FT_Stream nstream$(long struct) { return FT_Stream.createSafe(memGetAddress(struct + FT_Open_Args.STREAM)); } + /** Unsafe version of {@link #driver}. */ + public static long ndriver(long struct) { return memGetAddress(struct + FT_Open_Args.DRIVER); } + /** Unsafe version of {@link #num_params}. */ + public static int nnum_params(long struct) { return UNSAFE.getInt(null, struct + FT_Open_Args.NUM_PARAMS); } + /** Unsafe version of {@link #params}. */ + @Nullable public static FT_Parameter.Buffer nparams(long struct) { return FT_Parameter.createSafe(memGetAddress(struct + FT_Open_Args.PARAMS), nnum_params(struct)); } + + /** Unsafe version of {@link #flags(int) flags}. */ + public static void nflags(long struct, int value) { UNSAFE.putInt(null, struct + FT_Open_Args.FLAGS, value); } + /** Unsafe version of {@link #memory_base(ByteBuffer) memory_base}. */ + public static void nmemory_base(long struct, @Nullable ByteBuffer value) { memPutAddress(struct + FT_Open_Args.MEMORY_BASE, memAddressSafe(value)); nmemory_size(struct, value == null ? 0 : value.remaining()); } + /** Sets the specified value to the {@code memory_size} field of the specified {@code struct}. */ + public static void nmemory_size(long struct, long value) { memPutCLong(struct + FT_Open_Args.MEMORY_SIZE, value); } + /** Unsafe version of {@link #pathname(ByteBuffer) pathname}. */ + public static void npathname(long struct, @Nullable ByteBuffer value) { + if (CHECKS) { checkNT1Safe(value); } + memPutAddress(struct + FT_Open_Args.PATHNAME, memAddressSafe(value)); + } + /** Unsafe version of {@link #stream$(FT_Stream) stream$}. */ + public static void nstream$(long struct, @Nullable FT_Stream value) { memPutAddress(struct + FT_Open_Args.STREAM, memAddressSafe(value)); } + /** Unsafe version of {@link #driver(long) driver}. */ + public static void ndriver(long struct, long value) { memPutAddress(struct + FT_Open_Args.DRIVER, value); } + /** Sets the specified value to the {@code num_params} field of the specified {@code struct}. */ + public static void nnum_params(long struct, int value) { UNSAFE.putInt(null, struct + FT_Open_Args.NUM_PARAMS, value); } + /** Unsafe version of {@link #params(FT_Parameter.Buffer) params}. */ + public static void nparams(long struct, @Nullable FT_Parameter.Buffer value) { memPutAddress(struct + FT_Open_Args.PARAMS, memAddressSafe(value)); nnum_params(struct, value == null ? 0 : value.remaining()); } + + // ----------------------------------- + + /** An array of {@link FT_Open_Args} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Open_Args ELEMENT_FACTORY = FT_Open_Args.create(-1L); + + /** + * Creates a new {@code FT_Open_Args.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Open_Args#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Open_Args getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code flags} field. */ + @NativeType("FT_UInt") + public int flags() { return FT_Open_Args.nflags(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code memory_base} field. */ + @Nullable + @NativeType("FT_Byte const *") + public ByteBuffer memory_base() { return FT_Open_Args.nmemory_base(address()); } + /** @return the value of the {@code memory_size} field. */ + @NativeType("FT_Long") + public long memory_size() { return FT_Open_Args.nmemory_size(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code pathname} field. */ + @Nullable + @NativeType("FT_String *") + public ByteBuffer pathname() { return FT_Open_Args.npathname(address()); } + /** @return the null-terminated string pointed to by the {@code pathname} field. */ + @Nullable + @NativeType("FT_String *") + public String pathnameString() { return FT_Open_Args.npathnameString(address()); } + /** @return a {@link FT_Stream} view of the struct pointed to by the {@code stream} field. */ + @Nullable + public FT_Stream stream$() { return FT_Open_Args.nstream$(address()); } + /** @return the value of the {@code driver} field. */ + @NativeType("FT_Module") + public long driver() { return FT_Open_Args.ndriver(address()); } + /** @return the value of the {@code num_params} field. */ + @NativeType("FT_Int") + public int num_params() { return FT_Open_Args.nnum_params(address()); } + /** @return a {@link FT_Parameter.Buffer} view of the struct array pointed to by the {@code params} field. */ + @Nullable + @NativeType("FT_Parameter *") + public FT_Parameter.Buffer params() { return FT_Open_Args.nparams(address()); } + + /** Sets the specified value to the {@code flags} field. */ + public Buffer flags(@NativeType("FT_UInt") int value) { FT_Open_Args.nflags(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code memory_base} field. */ + public Buffer memory_base(@Nullable @NativeType("FT_Byte const *") ByteBuffer value) { FT_Open_Args.nmemory_base(address(), value); return this; } + /** Sets the specified value to the {@code memory_size} field. */ + public Buffer memory_size(@NativeType("FT_Long") long value) { FT_Open_Args.nmemory_size(address(), value); return this; } + /** Sets the address of the specified encoded string to the {@code pathname} field. */ + public Buffer pathname(@Nullable @NativeType("FT_String *") ByteBuffer value) { FT_Open_Args.npathname(address(), value); return this; } + /** Sets the address of the specified {@link FT_Stream} to the {@code stream} field. */ + public Buffer stream$(@Nullable FT_Stream value) { FT_Open_Args.nstream$(address(), value); return this; } + /** Sets the specified value to the {@code driver} field. */ + public Buffer driver(@NativeType("FT_Module") long value) { FT_Open_Args.ndriver(address(), value); return this; } + /** Sets the specified value to the {@code num_params} field. */ + public Buffer num_params(@NativeType("FT_Int") int value) { FT_Open_Args.nnum_params(address(), value); return this; } + /** Sets the address of the specified {@link FT_Parameter.Buffer} to the {@code params} field. */ + public Buffer params(@Nullable @NativeType("FT_Parameter *") FT_Parameter.Buffer value) { FT_Open_Args.nparams(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline.java new file mode 100644 index 000000000..76f533004 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline.java @@ -0,0 +1,291 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * This structure is used to describe an outline to the scan-line converter. + * + *

    Layout

    + * + *
    
    + * struct FT_Outline {
    + *     short {@link #n_contours};
    + *     short {@link #n_points};
    + *     {@link FT_Vector FT_Vector} * {@link #points};
    + *     char * {@link #tags};
    + *     short * {@link #contours};
    + *     int {@link #flags};
    + * }
    + */ +public class FT_Outline extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + N_CONTOURS, + N_POINTS, + POINTS, + TAGS, + CONTOURS, + FLAGS; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + N_CONTOURS = layout.offsetof(0); + N_POINTS = layout.offsetof(1); + POINTS = layout.offsetof(2); + TAGS = layout.offsetof(3); + CONTOURS = layout.offsetof(4); + FLAGS = layout.offsetof(5); + } + + protected FT_Outline(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Outline create(long address, @Nullable ByteBuffer container) { + return new FT_Outline(address, container); + } + + /** + * Creates a {@code FT_Outline} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Outline(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** number of contours in glyph */ + public short n_contours() { return nn_contours(address()); } + /** number of points in the glyph */ + public short n_points() { return nn_points(address()); } + /** the outline's points */ + @NativeType("FT_Vector *") + public FT_Vector.Buffer points() { return npoints(address()); } + /** the points flags */ + @NativeType("char *") + public ByteBuffer tags() { return ntags(address()); } + /** the contour end points */ + @NativeType("short *") + public ShortBuffer contours() { return ncontours(address()); } + /** outline masks */ + public int flags() { return nflags(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Outline} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Outline malloc() { + return new FT_Outline(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Outline} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Outline calloc() { + return new FT_Outline(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Outline} instance allocated with {@link BufferUtils}. */ + public static FT_Outline create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Outline(memAddress(container), container); + } + + /** Returns a new {@code FT_Outline} instance for the specified memory address. */ + public static FT_Outline create(long address) { + return new FT_Outline(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Outline createSafe(long address) { + return address == NULL ? null : new FT_Outline(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Outline} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Outline malloc(MemoryStack stack) { + return new FT_Outline(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Outline} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Outline calloc(MemoryStack stack) { + return new FT_Outline(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #n_contours}. */ + public static short nn_contours(long struct) { return UNSAFE.getShort(null, struct + FT_Outline.N_CONTOURS); } + /** Unsafe version of {@link #n_points}. */ + public static short nn_points(long struct) { return UNSAFE.getShort(null, struct + FT_Outline.N_POINTS); } + /** Unsafe version of {@link #points}. */ + public static FT_Vector.Buffer npoints(long struct) { return FT_Vector.create(memGetAddress(struct + FT_Outline.POINTS), nn_points(struct)); } + /** Unsafe version of {@link #tags() tags}. */ + public static ByteBuffer ntags(long struct) { return memByteBuffer(memGetAddress(struct + FT_Outline.TAGS), nn_points(struct)); } + /** Unsafe version of {@link #contours() contours}. */ + public static ShortBuffer ncontours(long struct) { return memShortBuffer(memGetAddress(struct + FT_Outline.CONTOURS), nn_contours(struct)); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + FT_Outline.FLAGS); } + + // ----------------------------------- + + /** An array of {@link FT_Outline} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Outline ELEMENT_FACTORY = FT_Outline.create(-1L); + + /** + * Creates a new {@code FT_Outline.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Outline#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Outline getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link FT_Outline#n_contours} field. */ + public short n_contours() { return FT_Outline.nn_contours(address()); } + /** @return the value of the {@link FT_Outline#n_points} field. */ + public short n_points() { return FT_Outline.nn_points(address()); } + /** @return a {@link FT_Vector.Buffer} view of the struct array pointed to by the {@link FT_Outline#points} field. */ + @NativeType("FT_Vector *") + public FT_Vector.Buffer points() { return FT_Outline.npoints(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@link FT_Outline#tags} field. */ + @NativeType("char *") + public ByteBuffer tags() { return FT_Outline.ntags(address()); } + /** @return a {@link ShortBuffer} view of the data pointed to by the {@link FT_Outline#contours} field. */ + @NativeType("short *") + public ShortBuffer contours() { return FT_Outline.ncontours(address()); } + /** @return the value of the {@link FT_Outline#flags} field. */ + public int flags() { return FT_Outline.nflags(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_OutlineGlyph.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_OutlineGlyph.java new file mode 100644 index 000000000..5a314bef9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_OutlineGlyph.java @@ -0,0 +1,164 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used for outline (vectorial) glyph images. This really is a 'sub-class' of {@link FT_Glyph}. + * + *

    Layout

    + * + *
    
    + * struct FT_OutlineGlyphRec {
    + *     {@link FT_Glyph FT_GlyphRec} root;
    + *     {@link FT_Outline FT_Outline} outline;
    + * }
    + */ +@NativeType("struct FT_OutlineGlyphRec") +public class FT_OutlineGlyph extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ROOT, + OUTLINE; + + static { + Layout layout = __struct( + __member(FT_Glyph.SIZEOF, FT_Glyph.ALIGNOF), + __member(FT_Outline.SIZEOF, FT_Outline.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + ROOT = layout.offsetof(0); + OUTLINE = layout.offsetof(1); + } + + protected FT_OutlineGlyph(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_OutlineGlyph create(long address, @Nullable ByteBuffer container) { + return new FT_OutlineGlyph(address, container); + } + + /** + * Creates a {@code FT_OutlineGlyph} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_OutlineGlyph(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_Glyph} view of the {@code root} field. */ + @NativeType("FT_GlyphRec") + public FT_Glyph root() { return nroot(address()); } + /** @return a {@link FT_Outline} view of the {@code outline} field. */ + public FT_Outline outline() { return noutline(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_OutlineGlyph} instance for the specified memory address. */ + public static FT_OutlineGlyph create(long address) { + return new FT_OutlineGlyph(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_OutlineGlyph createSafe(long address) { + return address == NULL ? null : new FT_OutlineGlyph(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #root}. */ + public static FT_Glyph nroot(long struct) { return FT_Glyph.create(struct + FT_OutlineGlyph.ROOT); } + /** Unsafe version of {@link #outline}. */ + public static FT_Outline noutline(long struct) { return FT_Outline.create(struct + FT_OutlineGlyph.OUTLINE); } + + // ----------------------------------- + + /** An array of {@link FT_OutlineGlyph} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_OutlineGlyph ELEMENT_FACTORY = FT_OutlineGlyph.create(-1L); + + /** + * Creates a new {@code FT_OutlineGlyph.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_OutlineGlyph#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_OutlineGlyph getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_Glyph} view of the {@code root} field. */ + @NativeType("FT_GlyphRec") + public FT_Glyph root() { return FT_OutlineGlyph.nroot(address()); } + /** @return a {@link FT_Outline} view of the {@code outline} field. */ + public FT_Outline outline() { return FT_OutlineGlyph.noutline(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_ConicToFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_ConicToFunc.java new file mode 100644 index 000000000..324fe0c7b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_ConicToFunc.java @@ -0,0 +1,75 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Vector const *control,
    + *     FT_Vector const *to,
    + *     void *user
    + * )
    + */ +public abstract class FT_Outline_ConicToFunc extends Callback implements FT_Outline_ConicToFuncI { + + /** + * Creates a {@code FT_Outline_ConicToFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Outline_ConicToFunc} + */ + public static FT_Outline_ConicToFunc create(long functionPointer) { + FT_Outline_ConicToFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Outline_ConicToFunc + ? (FT_Outline_ConicToFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Outline_ConicToFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Outline_ConicToFunc} instance that delegates to the specified {@code FT_Outline_ConicToFuncI} instance. */ + public static FT_Outline_ConicToFunc create(FT_Outline_ConicToFuncI instance) { + return instance instanceof FT_Outline_ConicToFunc + ? (FT_Outline_ConicToFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Outline_ConicToFunc() { + super(CIF); + } + + FT_Outline_ConicToFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Outline_ConicToFunc { + + private final FT_Outline_ConicToFuncI delegate; + + Container(long functionPointer, FT_Outline_ConicToFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long control, long to, long user) { + return delegate.invoke(control, to, user); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_ConicToFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_ConicToFuncI.java new file mode 100644 index 000000000..2f7083276 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_ConicToFuncI.java @@ -0,0 +1,51 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Vector const *control,
    + *     FT_Vector const *to,
    + *     void *user
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Outline_ConicToFunc") +public interface FT_Outline_ConicToFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** A function pointer type used to describe the signature of a 'conic to' function during outline walking or decomposition. */ + int invoke(@NativeType("FT_Vector const *") long control, @NativeType("FT_Vector const *") long to, @NativeType("void *") long user); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_CubicToFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_CubicToFunc.java new file mode 100644 index 000000000..964b8658c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_CubicToFunc.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Vector const *control1,
    + *     FT_Vector const *control2,
    + *     FT_Vector const *to,
    + *     void *user
    + * )
    + */ +public abstract class FT_Outline_CubicToFunc extends Callback implements FT_Outline_CubicToFuncI { + + /** + * Creates a {@code FT_Outline_CubicToFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Outline_CubicToFunc} + */ + public static FT_Outline_CubicToFunc create(long functionPointer) { + FT_Outline_CubicToFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Outline_CubicToFunc + ? (FT_Outline_CubicToFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Outline_CubicToFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Outline_CubicToFunc} instance that delegates to the specified {@code FT_Outline_CubicToFuncI} instance. */ + public static FT_Outline_CubicToFunc create(FT_Outline_CubicToFuncI instance) { + return instance instanceof FT_Outline_CubicToFunc + ? (FT_Outline_CubicToFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Outline_CubicToFunc() { + super(CIF); + } + + FT_Outline_CubicToFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Outline_CubicToFunc { + + private final FT_Outline_CubicToFuncI delegate; + + Container(long functionPointer, FT_Outline_CubicToFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long control1, long control2, long to, long user) { + return delegate.invoke(control1, control2, to, user); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_CubicToFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_CubicToFuncI.java new file mode 100644 index 000000000..b5eeb9dbf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_CubicToFuncI.java @@ -0,0 +1,53 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Vector const *control1,
    + *     FT_Vector const *control2,
    + *     FT_Vector const *to,
    + *     void *user
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Outline_CubicToFunc") +public interface FT_Outline_CubicToFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_pointer, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** A function pointer type used to describe the signature of a 'cubic to' function during outline walking or decomposition. */ + int invoke(@NativeType("FT_Vector const *") long control1, @NativeType("FT_Vector const *") long control2, @NativeType("FT_Vector const *") long to, @NativeType("void *") long user); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_Funcs.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_Funcs.java new file mode 100644 index 000000000..be744ffae --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_Funcs.java @@ -0,0 +1,365 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure to hold various function pointers used during outline decomposition in order to emit segments, conic, and cubic Beziers. + * + *

    Layout

    + * + *
    
    + * struct FT_Outline_Funcs {
    + *     {@link FT_Outline_MoveToFuncI FT_Outline_MoveToFunc} move_to;
    + *     {@link FT_Outline_LineToFuncI FT_Outline_LineToFunc} line_to;
    + *     {@link FT_Outline_ConicToFuncI FT_Outline_ConicToFunc} conic_to;
    + *     {@link FT_Outline_CubicToFuncI FT_Outline_CubicToFunc} cubic_to;
    + *     int shift;
    + *     FT_Pos delta;
    + * }
    + */ +public class FT_Outline_Funcs extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + MOVE_TO, + LINE_TO, + CONIC_TO, + CUBIC_TO, + SHIFT, + DELTA; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + MOVE_TO = layout.offsetof(0); + LINE_TO = layout.offsetof(1); + CONIC_TO = layout.offsetof(2); + CUBIC_TO = layout.offsetof(3); + SHIFT = layout.offsetof(4); + DELTA = layout.offsetof(5); + } + + protected FT_Outline_Funcs(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Outline_Funcs create(long address, @Nullable ByteBuffer container) { + return new FT_Outline_Funcs(address, container); + } + + /** + * Creates a {@code FT_Outline_Funcs} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Outline_Funcs(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code move_to} field. */ + @Nullable + public FT_Outline_MoveToFunc move_to() { return nmove_to(address()); } + /** @return the value of the {@code line_to} field. */ + @Nullable + public FT_Outline_LineToFunc line_to() { return nline_to(address()); } + /** @return the value of the {@code conic_to} field. */ + @Nullable + public FT_Outline_ConicToFunc conic_to() { return nconic_to(address()); } + /** @return the value of the {@code cubic_to} field. */ + @Nullable + public FT_Outline_CubicToFunc cubic_to() { return ncubic_to(address()); } + /** @return the value of the {@code shift} field. */ + public int shift() { return nshift(address()); } + /** @return the value of the {@code delta} field. */ + @NativeType("FT_Pos") + public long delta() { return ndelta(address()); } + + /** Sets the specified value to the {@code move_to} field. */ + public FT_Outline_Funcs move_to(@Nullable @NativeType("FT_Outline_MoveToFunc") FT_Outline_MoveToFuncI value) { nmove_to(address(), value); return this; } + /** Sets the specified value to the {@code line_to} field. */ + public FT_Outline_Funcs line_to(@Nullable @NativeType("FT_Outline_LineToFunc") FT_Outline_LineToFuncI value) { nline_to(address(), value); return this; } + /** Sets the specified value to the {@code conic_to} field. */ + public FT_Outline_Funcs conic_to(@Nullable @NativeType("FT_Outline_ConicToFunc") FT_Outline_ConicToFuncI value) { nconic_to(address(), value); return this; } + /** Sets the specified value to the {@code cubic_to} field. */ + public FT_Outline_Funcs cubic_to(@Nullable @NativeType("FT_Outline_CubicToFunc") FT_Outline_CubicToFuncI value) { ncubic_to(address(), value); return this; } + /** Sets the specified value to the {@code shift} field. */ + public FT_Outline_Funcs shift(int value) { nshift(address(), value); return this; } + /** Sets the specified value to the {@code delta} field. */ + public FT_Outline_Funcs delta(@NativeType("FT_Pos") long value) { ndelta(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Outline_Funcs set( + FT_Outline_MoveToFuncI move_to, + FT_Outline_LineToFuncI line_to, + FT_Outline_ConicToFuncI conic_to, + FT_Outline_CubicToFuncI cubic_to, + int shift, + long delta + ) { + move_to(move_to); + line_to(line_to); + conic_to(conic_to); + cubic_to(cubic_to); + shift(shift); + delta(delta); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Outline_Funcs set(FT_Outline_Funcs src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Outline_Funcs} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Outline_Funcs malloc() { + return new FT_Outline_Funcs(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Outline_Funcs} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Outline_Funcs calloc() { + return new FT_Outline_Funcs(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Outline_Funcs} instance allocated with {@link BufferUtils}. */ + public static FT_Outline_Funcs create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Outline_Funcs(memAddress(container), container); + } + + /** Returns a new {@code FT_Outline_Funcs} instance for the specified memory address. */ + public static FT_Outline_Funcs create(long address) { + return new FT_Outline_Funcs(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Outline_Funcs createSafe(long address) { + return address == NULL ? null : new FT_Outline_Funcs(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Outline_Funcs} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Outline_Funcs malloc(MemoryStack stack) { + return new FT_Outline_Funcs(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Outline_Funcs} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Outline_Funcs calloc(MemoryStack stack) { + return new FT_Outline_Funcs(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #move_to}. */ + @Nullable public static FT_Outline_MoveToFunc nmove_to(long struct) { return FT_Outline_MoveToFunc.createSafe(memGetAddress(struct + FT_Outline_Funcs.MOVE_TO)); } + /** Unsafe version of {@link #line_to}. */ + @Nullable public static FT_Outline_LineToFunc nline_to(long struct) { return FT_Outline_LineToFunc.createSafe(memGetAddress(struct + FT_Outline_Funcs.LINE_TO)); } + /** Unsafe version of {@link #conic_to}. */ + @Nullable public static FT_Outline_ConicToFunc nconic_to(long struct) { return FT_Outline_ConicToFunc.createSafe(memGetAddress(struct + FT_Outline_Funcs.CONIC_TO)); } + /** Unsafe version of {@link #cubic_to}. */ + @Nullable public static FT_Outline_CubicToFunc ncubic_to(long struct) { return FT_Outline_CubicToFunc.createSafe(memGetAddress(struct + FT_Outline_Funcs.CUBIC_TO)); } + /** Unsafe version of {@link #shift}. */ + public static int nshift(long struct) { return UNSAFE.getInt(null, struct + FT_Outline_Funcs.SHIFT); } + /** Unsafe version of {@link #delta}. */ + public static long ndelta(long struct) { return memGetCLong(struct + FT_Outline_Funcs.DELTA); } + + /** Unsafe version of {@link #move_to(FT_Outline_MoveToFuncI) move_to}. */ + public static void nmove_to(long struct, @Nullable FT_Outline_MoveToFuncI value) { memPutAddress(struct + FT_Outline_Funcs.MOVE_TO, memAddressSafe(value)); } + /** Unsafe version of {@link #line_to(FT_Outline_LineToFuncI) line_to}. */ + public static void nline_to(long struct, @Nullable FT_Outline_LineToFuncI value) { memPutAddress(struct + FT_Outline_Funcs.LINE_TO, memAddressSafe(value)); } + /** Unsafe version of {@link #conic_to(FT_Outline_ConicToFuncI) conic_to}. */ + public static void nconic_to(long struct, @Nullable FT_Outline_ConicToFuncI value) { memPutAddress(struct + FT_Outline_Funcs.CONIC_TO, memAddressSafe(value)); } + /** Unsafe version of {@link #cubic_to(FT_Outline_CubicToFuncI) cubic_to}. */ + public static void ncubic_to(long struct, @Nullable FT_Outline_CubicToFuncI value) { memPutAddress(struct + FT_Outline_Funcs.CUBIC_TO, memAddressSafe(value)); } + /** Unsafe version of {@link #shift(int) shift}. */ + public static void nshift(long struct, int value) { UNSAFE.putInt(null, struct + FT_Outline_Funcs.SHIFT, value); } + /** Unsafe version of {@link #delta(long) delta}. */ + public static void ndelta(long struct, long value) { memPutCLong(struct + FT_Outline_Funcs.DELTA, value); } + + // ----------------------------------- + + /** An array of {@link FT_Outline_Funcs} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Outline_Funcs ELEMENT_FACTORY = FT_Outline_Funcs.create(-1L); + + /** + * Creates a new {@code FT_Outline_Funcs.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Outline_Funcs#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Outline_Funcs getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code move_to} field. */ + @Nullable + public FT_Outline_MoveToFunc move_to() { return FT_Outline_Funcs.nmove_to(address()); } + /** @return the value of the {@code line_to} field. */ + @Nullable + public FT_Outline_LineToFunc line_to() { return FT_Outline_Funcs.nline_to(address()); } + /** @return the value of the {@code conic_to} field. */ + @Nullable + public FT_Outline_ConicToFunc conic_to() { return FT_Outline_Funcs.nconic_to(address()); } + /** @return the value of the {@code cubic_to} field. */ + @Nullable + public FT_Outline_CubicToFunc cubic_to() { return FT_Outline_Funcs.ncubic_to(address()); } + /** @return the value of the {@code shift} field. */ + public int shift() { return FT_Outline_Funcs.nshift(address()); } + /** @return the value of the {@code delta} field. */ + @NativeType("FT_Pos") + public long delta() { return FT_Outline_Funcs.ndelta(address()); } + + /** Sets the specified value to the {@code move_to} field. */ + public Buffer move_to(@Nullable @NativeType("FT_Outline_MoveToFunc") FT_Outline_MoveToFuncI value) { FT_Outline_Funcs.nmove_to(address(), value); return this; } + /** Sets the specified value to the {@code line_to} field. */ + public Buffer line_to(@Nullable @NativeType("FT_Outline_LineToFunc") FT_Outline_LineToFuncI value) { FT_Outline_Funcs.nline_to(address(), value); return this; } + /** Sets the specified value to the {@code conic_to} field. */ + public Buffer conic_to(@Nullable @NativeType("FT_Outline_ConicToFunc") FT_Outline_ConicToFuncI value) { FT_Outline_Funcs.nconic_to(address(), value); return this; } + /** Sets the specified value to the {@code cubic_to} field. */ + public Buffer cubic_to(@Nullable @NativeType("FT_Outline_CubicToFunc") FT_Outline_CubicToFuncI value) { FT_Outline_Funcs.ncubic_to(address(), value); return this; } + /** Sets the specified value to the {@code shift} field. */ + public Buffer shift(int value) { FT_Outline_Funcs.nshift(address(), value); return this; } + /** Sets the specified value to the {@code delta} field. */ + public Buffer delta(@NativeType("FT_Pos") long value) { FT_Outline_Funcs.ndelta(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_LineToFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_LineToFunc.java new file mode 100644 index 000000000..8b2152888 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_LineToFunc.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Vector const *to,
    + *     void *user
    + * )
    + */ +public abstract class FT_Outline_LineToFunc extends Callback implements FT_Outline_LineToFuncI { + + /** + * Creates a {@code FT_Outline_LineToFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Outline_LineToFunc} + */ + public static FT_Outline_LineToFunc create(long functionPointer) { + FT_Outline_LineToFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Outline_LineToFunc + ? (FT_Outline_LineToFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Outline_LineToFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Outline_LineToFunc} instance that delegates to the specified {@code FT_Outline_LineToFuncI} instance. */ + public static FT_Outline_LineToFunc create(FT_Outline_LineToFuncI instance) { + return instance instanceof FT_Outline_LineToFunc + ? (FT_Outline_LineToFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Outline_LineToFunc() { + super(CIF); + } + + FT_Outline_LineToFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Outline_LineToFunc { + + private final FT_Outline_LineToFuncI delegate; + + Container(long functionPointer, FT_Outline_LineToFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long to, long user) { + return delegate.invoke(to, user); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_LineToFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_LineToFuncI.java new file mode 100644 index 000000000..7043291d4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_LineToFuncI.java @@ -0,0 +1,49 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Vector const *to,
    + *     void *user
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Outline_LineToFunc") +public interface FT_Outline_LineToFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** A function pointer type used to describe the signature of a 'line to' function during outline walking/decomposition. */ + int invoke(@NativeType("FT_Vector const *") long to, @NativeType("void *") long user); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_MoveToFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_MoveToFunc.java new file mode 100644 index 000000000..dbf091d19 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_MoveToFunc.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Vector const *to,
    + *     void *user
    + * )
    + */ +public abstract class FT_Outline_MoveToFunc extends Callback implements FT_Outline_MoveToFuncI { + + /** + * Creates a {@code FT_Outline_MoveToFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Outline_MoveToFunc} + */ + public static FT_Outline_MoveToFunc create(long functionPointer) { + FT_Outline_MoveToFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Outline_MoveToFunc + ? (FT_Outline_MoveToFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Outline_MoveToFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Outline_MoveToFunc} instance that delegates to the specified {@code FT_Outline_MoveToFuncI} instance. */ + public static FT_Outline_MoveToFunc create(FT_Outline_MoveToFuncI instance) { + return instance instanceof FT_Outline_MoveToFunc + ? (FT_Outline_MoveToFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Outline_MoveToFunc() { + super(CIF); + } + + FT_Outline_MoveToFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Outline_MoveToFunc { + + private final FT_Outline_MoveToFuncI delegate; + + Container(long functionPointer, FT_Outline_MoveToFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long to, long user) { + return delegate.invoke(to, user); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_MoveToFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_MoveToFuncI.java new file mode 100644 index 000000000..b60195941 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Outline_MoveToFuncI.java @@ -0,0 +1,49 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Vector const *to,
    + *     void *user
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Outline_MoveToFunc") +public interface FT_Outline_MoveToFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** A function pointer type used to describe the signature of a 'move to' function during outline walking/decomposition. */ + int invoke(@NativeType("FT_Vector const *") long to, @NativeType("void *") long user); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintColrGlyph.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintColrGlyph.java new file mode 100644 index 000000000..8ae8f5bf8 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintColrGlyph.java @@ -0,0 +1,153 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code COLR} v1 {@code PaintColorGlyph} paint table. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintColrGlyph {
    + *     FT_UInt glyphID;
    + * }
    + */ +public class FT_PaintColrGlyph extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + GLYPHID; + + static { + Layout layout = __struct( + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + GLYPHID = layout.offsetof(0); + } + + protected FT_PaintColrGlyph(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintColrGlyph create(long address, @Nullable ByteBuffer container) { + return new FT_PaintColrGlyph(address, container); + } + + /** + * Creates a {@code FT_PaintColrGlyph} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintColrGlyph(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code glyphID} field. */ + @NativeType("FT_UInt") + public int glyphID() { return nglyphID(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintColrGlyph} instance for the specified memory address. */ + public static FT_PaintColrGlyph create(long address) { + return new FT_PaintColrGlyph(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintColrGlyph createSafe(long address) { + return address == NULL ? null : new FT_PaintColrGlyph(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #glyphID}. */ + public static int nglyphID(long struct) { return UNSAFE.getInt(null, struct + FT_PaintColrGlyph.GLYPHID); } + + // ----------------------------------- + + /** An array of {@link FT_PaintColrGlyph} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintColrGlyph ELEMENT_FACTORY = FT_PaintColrGlyph.create(-1L); + + /** + * Creates a new {@code FT_PaintColrGlyph.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintColrGlyph#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintColrGlyph getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code glyphID} field. */ + @NativeType("FT_UInt") + public int glyphID() { return FT_PaintColrGlyph.nglyphID(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintColrLayers.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintColrLayers.java new file mode 100644 index 000000000..ed941bb58 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintColrLayers.java @@ -0,0 +1,151 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code PaintColrLayers} table of a {@code COLR} v1 font. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintColrLayers {
    + *     {@link FT_LayerIterator FT_LayerIterator} layer_iterator;
    + * }
    + */ +public class FT_PaintColrLayers extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + LAYER_ITERATOR; + + static { + Layout layout = __struct( + __member(FT_LayerIterator.SIZEOF, FT_LayerIterator.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + LAYER_ITERATOR = layout.offsetof(0); + } + + protected FT_PaintColrLayers(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintColrLayers create(long address, @Nullable ByteBuffer container) { + return new FT_PaintColrLayers(address, container); + } + + /** + * Creates a {@code FT_PaintColrLayers} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintColrLayers(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_LayerIterator} view of the {@code layer_iterator} field. */ + public FT_LayerIterator layer_iterator() { return nlayer_iterator(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintColrLayers} instance for the specified memory address. */ + public static FT_PaintColrLayers create(long address) { + return new FT_PaintColrLayers(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintColrLayers createSafe(long address) { + return address == NULL ? null : new FT_PaintColrLayers(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #layer_iterator}. */ + public static FT_LayerIterator nlayer_iterator(long struct) { return FT_LayerIterator.create(struct + FT_PaintColrLayers.LAYER_ITERATOR); } + + // ----------------------------------- + + /** An array of {@link FT_PaintColrLayers} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintColrLayers ELEMENT_FACTORY = FT_PaintColrLayers.create(-1L); + + /** + * Creates a new {@code FT_PaintColrLayers.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintColrLayers#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintColrLayers getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_LayerIterator} view of the {@code layer_iterator} field. */ + public FT_LayerIterator layer_iterator() { return FT_PaintColrLayers.nlayer_iterator(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintComposite.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintComposite.java new file mode 100644 index 000000000..f3ec4ba19 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintComposite.java @@ -0,0 +1,178 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code COLR} v1 {@code PaintComposite} paint table. Used for compositing two paints in a {@code COLR} v1 directed acyclic + * graph. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintComposite {
    + *     {@link FT_OpaquePaint FT_OpaquePaintRec} source_paint;
    + *     FT_Composite_Mode composite_mode;
    + *     {@link FT_OpaquePaint FT_OpaquePaintRec} backdrop_paint;
    + * }
    + */ +public class FT_PaintComposite extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + SOURCE_PAINT, + COMPOSITE_MODE, + BACKDROP_PAINT; + + static { + Layout layout = __struct( + __member(FT_OpaquePaint.SIZEOF, FT_OpaquePaint.ALIGNOF), + __member(4), + __member(FT_OpaquePaint.SIZEOF, FT_OpaquePaint.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + SOURCE_PAINT = layout.offsetof(0); + COMPOSITE_MODE = layout.offsetof(1); + BACKDROP_PAINT = layout.offsetof(2); + } + + protected FT_PaintComposite(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintComposite create(long address, @Nullable ByteBuffer container) { + return new FT_PaintComposite(address, container); + } + + /** + * Creates a {@code FT_PaintComposite} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintComposite(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_OpaquePaint} view of the {@code source_paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint source_paint() { return nsource_paint(address()); } + /** @return the value of the {@code composite_mode} field. */ + @NativeType("FT_Composite_Mode") + public int composite_mode() { return ncomposite_mode(address()); } + /** @return a {@link FT_OpaquePaint} view of the {@code backdrop_paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint backdrop_paint() { return nbackdrop_paint(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintComposite} instance for the specified memory address. */ + public static FT_PaintComposite create(long address) { + return new FT_PaintComposite(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintComposite createSafe(long address) { + return address == NULL ? null : new FT_PaintComposite(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #source_paint}. */ + public static FT_OpaquePaint nsource_paint(long struct) { return FT_OpaquePaint.create(struct + FT_PaintComposite.SOURCE_PAINT); } + /** Unsafe version of {@link #composite_mode}. */ + public static int ncomposite_mode(long struct) { return UNSAFE.getInt(null, struct + FT_PaintComposite.COMPOSITE_MODE); } + /** Unsafe version of {@link #backdrop_paint}. */ + public static FT_OpaquePaint nbackdrop_paint(long struct) { return FT_OpaquePaint.create(struct + FT_PaintComposite.BACKDROP_PAINT); } + + // ----------------------------------- + + /** An array of {@link FT_PaintComposite} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintComposite ELEMENT_FACTORY = FT_PaintComposite.create(-1L); + + /** + * Creates a new {@code FT_PaintComposite.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintComposite#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintComposite getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_OpaquePaint} view of the {@code source_paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint source_paint() { return FT_PaintComposite.nsource_paint(address()); } + /** @return the value of the {@code composite_mode} field. */ + @NativeType("FT_Composite_Mode") + public int composite_mode() { return FT_PaintComposite.ncomposite_mode(address()); } + /** @return a {@link FT_OpaquePaint} view of the {@code backdrop_paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint backdrop_paint() { return FT_PaintComposite.nbackdrop_paint(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintGlyph.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintGlyph.java new file mode 100644 index 000000000..397c00099 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintGlyph.java @@ -0,0 +1,165 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code COLR} v1 {@code PaintGlyph} paint table. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintGlyph {
    + *     {@link FT_OpaquePaint FT_OpaquePaintRec} paint;
    + *     FT_UInt glyphID;
    + * }
    + */ +public class FT_PaintGlyph extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PAINT, + GLYPHID; + + static { + Layout layout = __struct( + __member(FT_OpaquePaint.SIZEOF, FT_OpaquePaint.ALIGNOF), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PAINT = layout.offsetof(0); + GLYPHID = layout.offsetof(1); + } + + protected FT_PaintGlyph(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintGlyph create(long address, @Nullable ByteBuffer container) { + return new FT_PaintGlyph(address, container); + } + + /** + * Creates a {@code FT_PaintGlyph} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintGlyph(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return npaint(address()); } + /** @return the value of the {@code glyphID} field. */ + @NativeType("FT_UInt") + public int glyphID() { return nglyphID(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintGlyph} instance for the specified memory address. */ + public static FT_PaintGlyph create(long address) { + return new FT_PaintGlyph(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintGlyph createSafe(long address) { + return address == NULL ? null : new FT_PaintGlyph(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #paint}. */ + public static FT_OpaquePaint npaint(long struct) { return FT_OpaquePaint.create(struct + FT_PaintGlyph.PAINT); } + /** Unsafe version of {@link #glyphID}. */ + public static int nglyphID(long struct) { return UNSAFE.getInt(null, struct + FT_PaintGlyph.GLYPHID); } + + // ----------------------------------- + + /** An array of {@link FT_PaintGlyph} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintGlyph ELEMENT_FACTORY = FT_PaintGlyph.create(-1L); + + /** + * Creates a new {@code FT_PaintGlyph.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintGlyph#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintGlyph getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return FT_PaintGlyph.npaint(address()); } + /** @return the value of the {@code glyphID} field. */ + @NativeType("FT_UInt") + public int glyphID() { return FT_PaintGlyph.nglyphID(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintLinearGradient.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintLinearGradient.java new file mode 100644 index 000000000..55a94298e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintLinearGradient.java @@ -0,0 +1,181 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code PaintLinearGradient} value of the {@code COLR} v1 extensions. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintLinearGradient {
    + *     {@link FT_ColorLine FT_ColorLine} colorline;
    + *     {@link FT_Vector FT_Vector} p0;
    + *     {@link FT_Vector FT_Vector} p1;
    + *     {@link FT_Vector FT_Vector} p2;
    + * }
    + */ +public class FT_PaintLinearGradient extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + COLORLINE, + P0, + P1, + P2; + + static { + Layout layout = __struct( + __member(FT_ColorLine.SIZEOF, FT_ColorLine.ALIGNOF), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + COLORLINE = layout.offsetof(0); + P0 = layout.offsetof(1); + P1 = layout.offsetof(2); + P2 = layout.offsetof(3); + } + + protected FT_PaintLinearGradient(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintLinearGradient create(long address, @Nullable ByteBuffer container) { + return new FT_PaintLinearGradient(address, container); + } + + /** + * Creates a {@code FT_PaintLinearGradient} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintLinearGradient(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_ColorLine} view of the {@code colorline} field. */ + public FT_ColorLine colorline() { return ncolorline(address()); } + /** @return a {@link FT_Vector} view of the {@code p0} field. */ + public FT_Vector p0() { return np0(address()); } + /** @return a {@link FT_Vector} view of the {@code p1} field. */ + public FT_Vector p1() { return np1(address()); } + /** @return a {@link FT_Vector} view of the {@code p2} field. */ + public FT_Vector p2() { return np2(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintLinearGradient} instance for the specified memory address. */ + public static FT_PaintLinearGradient create(long address) { + return new FT_PaintLinearGradient(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintLinearGradient createSafe(long address) { + return address == NULL ? null : new FT_PaintLinearGradient(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #colorline}. */ + public static FT_ColorLine ncolorline(long struct) { return FT_ColorLine.create(struct + FT_PaintLinearGradient.COLORLINE); } + /** Unsafe version of {@link #p0}. */ + public static FT_Vector np0(long struct) { return FT_Vector.create(struct + FT_PaintLinearGradient.P0); } + /** Unsafe version of {@link #p1}. */ + public static FT_Vector np1(long struct) { return FT_Vector.create(struct + FT_PaintLinearGradient.P1); } + /** Unsafe version of {@link #p2}. */ + public static FT_Vector np2(long struct) { return FT_Vector.create(struct + FT_PaintLinearGradient.P2); } + + // ----------------------------------- + + /** An array of {@link FT_PaintLinearGradient} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintLinearGradient ELEMENT_FACTORY = FT_PaintLinearGradient.create(-1L); + + /** + * Creates a new {@code FT_PaintLinearGradient.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintLinearGradient#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintLinearGradient getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_ColorLine} view of the {@code colorline} field. */ + public FT_ColorLine colorline() { return FT_PaintLinearGradient.ncolorline(address()); } + /** @return a {@link FT_Vector} view of the {@code p0} field. */ + public FT_Vector p0() { return FT_PaintLinearGradient.np0(address()); } + /** @return a {@link FT_Vector} view of the {@code p1} field. */ + public FT_Vector p1() { return FT_PaintLinearGradient.np1(address()); } + /** @return a {@link FT_Vector} view of the {@code p2} field. */ + public FT_Vector p2() { return FT_PaintLinearGradient.np2(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintRadialGradient.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintRadialGradient.java new file mode 100644 index 000000000..e251bfd17 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintRadialGradient.java @@ -0,0 +1,195 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code PaintRadialGradient} value of the {@code COLR} v1 extensions. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintRadialGradient {
    + *     {@link FT_ColorLine FT_ColorLine} colorline;
    + *     {@link FT_Vector FT_Vector} c0;
    + *     FT_Pos r0;
    + *     {@link FT_Vector FT_Vector} c1;
    + *     FT_Pos r1;
    + * }
    + */ +public class FT_PaintRadialGradient extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + COLORLINE, + C0, + R0, + C1, + R1; + + static { + Layout layout = __struct( + __member(FT_ColorLine.SIZEOF, FT_ColorLine.ALIGNOF), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF), + __member(CLONG_SIZE), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + COLORLINE = layout.offsetof(0); + C0 = layout.offsetof(1); + R0 = layout.offsetof(2); + C1 = layout.offsetof(3); + R1 = layout.offsetof(4); + } + + protected FT_PaintRadialGradient(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintRadialGradient create(long address, @Nullable ByteBuffer container) { + return new FT_PaintRadialGradient(address, container); + } + + /** + * Creates a {@code FT_PaintRadialGradient} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintRadialGradient(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_ColorLine} view of the {@code colorline} field. */ + public FT_ColorLine colorline() { return ncolorline(address()); } + /** @return a {@link FT_Vector} view of the {@code c0} field. */ + public FT_Vector c0() { return nc0(address()); } + /** @return the value of the {@code r0} field. */ + @NativeType("FT_Pos") + public long r0() { return nr0(address()); } + /** @return a {@link FT_Vector} view of the {@code c1} field. */ + public FT_Vector c1() { return nc1(address()); } + /** @return the value of the {@code r1} field. */ + @NativeType("FT_Pos") + public long r1() { return nr1(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintRadialGradient} instance for the specified memory address. */ + public static FT_PaintRadialGradient create(long address) { + return new FT_PaintRadialGradient(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintRadialGradient createSafe(long address) { + return address == NULL ? null : new FT_PaintRadialGradient(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #colorline}. */ + public static FT_ColorLine ncolorline(long struct) { return FT_ColorLine.create(struct + FT_PaintRadialGradient.COLORLINE); } + /** Unsafe version of {@link #c0}. */ + public static FT_Vector nc0(long struct) { return FT_Vector.create(struct + FT_PaintRadialGradient.C0); } + /** Unsafe version of {@link #r0}. */ + public static long nr0(long struct) { return memGetCLong(struct + FT_PaintRadialGradient.R0); } + /** Unsafe version of {@link #c1}. */ + public static FT_Vector nc1(long struct) { return FT_Vector.create(struct + FT_PaintRadialGradient.C1); } + /** Unsafe version of {@link #r1}. */ + public static long nr1(long struct) { return memGetCLong(struct + FT_PaintRadialGradient.R1); } + + // ----------------------------------- + + /** An array of {@link FT_PaintRadialGradient} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintRadialGradient ELEMENT_FACTORY = FT_PaintRadialGradient.create(-1L); + + /** + * Creates a new {@code FT_PaintRadialGradient.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintRadialGradient#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintRadialGradient getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_ColorLine} view of the {@code colorline} field. */ + public FT_ColorLine colorline() { return FT_PaintRadialGradient.ncolorline(address()); } + /** @return a {@link FT_Vector} view of the {@code c0} field. */ + public FT_Vector c0() { return FT_PaintRadialGradient.nc0(address()); } + /** @return the value of the {@code r0} field. */ + @NativeType("FT_Pos") + public long r0() { return FT_PaintRadialGradient.nr0(address()); } + /** @return a {@link FT_Vector} view of the {@code c1} field. */ + public FT_Vector c1() { return FT_PaintRadialGradient.nc1(address()); } + /** @return the value of the {@code r1} field. */ + @NativeType("FT_Pos") + public long r1() { return FT_PaintRadialGradient.nr1(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintRotate.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintRotate.java new file mode 100644 index 000000000..3458d154b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintRotate.java @@ -0,0 +1,189 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code COLR} v1 {@code PaintRotate} paint table. Used for rotating downstream paints with a given center and angle. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintRotate {
    + *     {@link FT_OpaquePaint FT_OpaquePaintRec} paint;
    + *     FT_Fixed angle;
    + *     FT_Fixed center_x;
    + *     FT_Fixed center_y;
    + * }
    + */ +public class FT_PaintRotate extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PAINT, + ANGLE, + CENTER_X, + CENTER_Y; + + static { + Layout layout = __struct( + __member(FT_OpaquePaint.SIZEOF, FT_OpaquePaint.ALIGNOF), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PAINT = layout.offsetof(0); + ANGLE = layout.offsetof(1); + CENTER_X = layout.offsetof(2); + CENTER_Y = layout.offsetof(3); + } + + protected FT_PaintRotate(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintRotate create(long address, @Nullable ByteBuffer container) { + return new FT_PaintRotate(address, container); + } + + /** + * Creates a {@code FT_PaintRotate} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintRotate(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return npaint(address()); } + /** @return the value of the {@code angle} field. */ + @NativeType("FT_Fixed") + public long angle() { return nangle(address()); } + /** @return the value of the {@code center_x} field. */ + @NativeType("FT_Fixed") + public long center_x() { return ncenter_x(address()); } + /** @return the value of the {@code center_y} field. */ + @NativeType("FT_Fixed") + public long center_y() { return ncenter_y(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintRotate} instance for the specified memory address. */ + public static FT_PaintRotate create(long address) { + return new FT_PaintRotate(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintRotate createSafe(long address) { + return address == NULL ? null : new FT_PaintRotate(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #paint}. */ + public static FT_OpaquePaint npaint(long struct) { return FT_OpaquePaint.create(struct + FT_PaintRotate.PAINT); } + /** Unsafe version of {@link #angle}. */ + public static long nangle(long struct) { return memGetCLong(struct + FT_PaintRotate.ANGLE); } + /** Unsafe version of {@link #center_x}. */ + public static long ncenter_x(long struct) { return memGetCLong(struct + FT_PaintRotate.CENTER_X); } + /** Unsafe version of {@link #center_y}. */ + public static long ncenter_y(long struct) { return memGetCLong(struct + FT_PaintRotate.CENTER_Y); } + + // ----------------------------------- + + /** An array of {@link FT_PaintRotate} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintRotate ELEMENT_FACTORY = FT_PaintRotate.create(-1L); + + /** + * Creates a new {@code FT_PaintRotate.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintRotate#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintRotate getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return FT_PaintRotate.npaint(address()); } + /** @return the value of the {@code angle} field. */ + @NativeType("FT_Fixed") + public long angle() { return FT_PaintRotate.nangle(address()); } + /** @return the value of the {@code center_x} field. */ + @NativeType("FT_Fixed") + public long center_x() { return FT_PaintRotate.ncenter_x(address()); } + /** @return the value of the {@code center_y} field. */ + @NativeType("FT_Fixed") + public long center_y() { return FT_PaintRotate.ncenter_y(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintScale.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintScale.java new file mode 100644 index 000000000..c8b599950 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintScale.java @@ -0,0 +1,201 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing all of the {@code COLR} v1 {@code PaintScale*} paint tables. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintScale {
    + *     {@link FT_OpaquePaint FT_OpaquePaintRec} paint;
    + *     FT_Fixed scale_x;
    + *     FT_Fixed scale_y;
    + *     FT_Fixed center_x;
    + *     FT_Fixed center_y;
    + * }
    + */ +public class FT_PaintScale extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PAINT, + SCALE_X, + SCALE_Y, + CENTER_X, + CENTER_Y; + + static { + Layout layout = __struct( + __member(FT_OpaquePaint.SIZEOF, FT_OpaquePaint.ALIGNOF), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PAINT = layout.offsetof(0); + SCALE_X = layout.offsetof(1); + SCALE_Y = layout.offsetof(2); + CENTER_X = layout.offsetof(3); + CENTER_Y = layout.offsetof(4); + } + + protected FT_PaintScale(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintScale create(long address, @Nullable ByteBuffer container) { + return new FT_PaintScale(address, container); + } + + /** + * Creates a {@code FT_PaintScale} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintScale(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return npaint(address()); } + /** @return the value of the {@code scale_x} field. */ + @NativeType("FT_Fixed") + public long scale_x() { return nscale_x(address()); } + /** @return the value of the {@code scale_y} field. */ + @NativeType("FT_Fixed") + public long scale_y() { return nscale_y(address()); } + /** @return the value of the {@code center_x} field. */ + @NativeType("FT_Fixed") + public long center_x() { return ncenter_x(address()); } + /** @return the value of the {@code center_y} field. */ + @NativeType("FT_Fixed") + public long center_y() { return ncenter_y(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintScale} instance for the specified memory address. */ + public static FT_PaintScale create(long address) { + return new FT_PaintScale(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintScale createSafe(long address) { + return address == NULL ? null : new FT_PaintScale(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #paint}. */ + public static FT_OpaquePaint npaint(long struct) { return FT_OpaquePaint.create(struct + FT_PaintScale.PAINT); } + /** Unsafe version of {@link #scale_x}. */ + public static long nscale_x(long struct) { return memGetCLong(struct + FT_PaintScale.SCALE_X); } + /** Unsafe version of {@link #scale_y}. */ + public static long nscale_y(long struct) { return memGetCLong(struct + FT_PaintScale.SCALE_Y); } + /** Unsafe version of {@link #center_x}. */ + public static long ncenter_x(long struct) { return memGetCLong(struct + FT_PaintScale.CENTER_X); } + /** Unsafe version of {@link #center_y}. */ + public static long ncenter_y(long struct) { return memGetCLong(struct + FT_PaintScale.CENTER_Y); } + + // ----------------------------------- + + /** An array of {@link FT_PaintScale} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintScale ELEMENT_FACTORY = FT_PaintScale.create(-1L); + + /** + * Creates a new {@code FT_PaintScale.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintScale#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintScale getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return FT_PaintScale.npaint(address()); } + /** @return the value of the {@code scale_x} field. */ + @NativeType("FT_Fixed") + public long scale_x() { return FT_PaintScale.nscale_x(address()); } + /** @return the value of the {@code scale_y} field. */ + @NativeType("FT_Fixed") + public long scale_y() { return FT_PaintScale.nscale_y(address()); } + /** @return the value of the {@code center_x} field. */ + @NativeType("FT_Fixed") + public long center_x() { return FT_PaintScale.ncenter_x(address()); } + /** @return the value of the {@code center_y} field. */ + @NativeType("FT_Fixed") + public long center_y() { return FT_PaintScale.ncenter_y(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSkew.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSkew.java new file mode 100644 index 000000000..cd8f4424e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSkew.java @@ -0,0 +1,201 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code COLR} v1 {@code PaintSkew} paint table. Used for skewing or shearing downstream paints by a given center and angle. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintSkew {
    + *     {@link FT_OpaquePaint FT_OpaquePaintRec} paint;
    + *     FT_Fixed x_skew_angle;
    + *     FT_Fixed y_skew_angle;
    + *     FT_Fixed center_x;
    + *     FT_Fixed center_y;
    + * }
    + */ +public class FT_PaintSkew extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PAINT, + X_SKEW_ANGLE, + Y_SKEW_ANGLE, + CENTER_X, + CENTER_Y; + + static { + Layout layout = __struct( + __member(FT_OpaquePaint.SIZEOF, FT_OpaquePaint.ALIGNOF), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PAINT = layout.offsetof(0); + X_SKEW_ANGLE = layout.offsetof(1); + Y_SKEW_ANGLE = layout.offsetof(2); + CENTER_X = layout.offsetof(3); + CENTER_Y = layout.offsetof(4); + } + + protected FT_PaintSkew(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintSkew create(long address, @Nullable ByteBuffer container) { + return new FT_PaintSkew(address, container); + } + + /** + * Creates a {@code FT_PaintSkew} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintSkew(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return npaint(address()); } + /** @return the value of the {@code x_skew_angle} field. */ + @NativeType("FT_Fixed") + public long x_skew_angle() { return nx_skew_angle(address()); } + /** @return the value of the {@code y_skew_angle} field. */ + @NativeType("FT_Fixed") + public long y_skew_angle() { return ny_skew_angle(address()); } + /** @return the value of the {@code center_x} field. */ + @NativeType("FT_Fixed") + public long center_x() { return ncenter_x(address()); } + /** @return the value of the {@code center_y} field. */ + @NativeType("FT_Fixed") + public long center_y() { return ncenter_y(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintSkew} instance for the specified memory address. */ + public static FT_PaintSkew create(long address) { + return new FT_PaintSkew(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintSkew createSafe(long address) { + return address == NULL ? null : new FT_PaintSkew(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #paint}. */ + public static FT_OpaquePaint npaint(long struct) { return FT_OpaquePaint.create(struct + FT_PaintSkew.PAINT); } + /** Unsafe version of {@link #x_skew_angle}. */ + public static long nx_skew_angle(long struct) { return memGetCLong(struct + FT_PaintSkew.X_SKEW_ANGLE); } + /** Unsafe version of {@link #y_skew_angle}. */ + public static long ny_skew_angle(long struct) { return memGetCLong(struct + FT_PaintSkew.Y_SKEW_ANGLE); } + /** Unsafe version of {@link #center_x}. */ + public static long ncenter_x(long struct) { return memGetCLong(struct + FT_PaintSkew.CENTER_X); } + /** Unsafe version of {@link #center_y}. */ + public static long ncenter_y(long struct) { return memGetCLong(struct + FT_PaintSkew.CENTER_Y); } + + // ----------------------------------- + + /** An array of {@link FT_PaintSkew} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintSkew ELEMENT_FACTORY = FT_PaintSkew.create(-1L); + + /** + * Creates a new {@code FT_PaintSkew.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintSkew#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintSkew getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return FT_PaintSkew.npaint(address()); } + /** @return the value of the {@code x_skew_angle} field. */ + @NativeType("FT_Fixed") + public long x_skew_angle() { return FT_PaintSkew.nx_skew_angle(address()); } + /** @return the value of the {@code y_skew_angle} field. */ + @NativeType("FT_Fixed") + public long y_skew_angle() { return FT_PaintSkew.ny_skew_angle(address()); } + /** @return the value of the {@code center_x} field. */ + @NativeType("FT_Fixed") + public long center_x() { return FT_PaintSkew.ncenter_x(address()); } + /** @return the value of the {@code center_y} field. */ + @NativeType("FT_Fixed") + public long center_y() { return FT_PaintSkew.ncenter_y(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSolid.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSolid.java new file mode 100644 index 000000000..16fc4126f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSolid.java @@ -0,0 +1,151 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code PaintSolid} value of the {@code COLR} v1 extensions. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintSolid {
    + *     {@link FT_ColorIndex FT_ColorIndex} color;
    + * }
    + */ +public class FT_PaintSolid extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + COLOR; + + static { + Layout layout = __struct( + __member(FT_ColorIndex.SIZEOF, FT_ColorIndex.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + COLOR = layout.offsetof(0); + } + + protected FT_PaintSolid(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintSolid create(long address, @Nullable ByteBuffer container) { + return new FT_PaintSolid(address, container); + } + + /** + * Creates a {@code FT_PaintSolid} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintSolid(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_ColorIndex} view of the {@code color} field. */ + public FT_ColorIndex color() { return ncolor(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintSolid} instance for the specified memory address. */ + public static FT_PaintSolid create(long address) { + return new FT_PaintSolid(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintSolid createSafe(long address) { + return address == NULL ? null : new FT_PaintSolid(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #color}. */ + public static FT_ColorIndex ncolor(long struct) { return FT_ColorIndex.create(struct + FT_PaintSolid.COLOR); } + + // ----------------------------------- + + /** An array of {@link FT_PaintSolid} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintSolid ELEMENT_FACTORY = FT_PaintSolid.create(-1L); + + /** + * Creates a new {@code FT_PaintSolid.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintSolid#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintSolid getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_ColorIndex} view of the {@code color} field. */ + public FT_ColorIndex color() { return FT_PaintSolid.ncolor(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSweepGradient.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSweepGradient.java new file mode 100644 index 000000000..b95f6b1c6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintSweepGradient.java @@ -0,0 +1,185 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code PaintSweepGradient} value of the {@code COLR} v1 extensions. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintSweepGradient {
    + *     {@link FT_ColorLine FT_ColorLine} colorline;
    + *     {@link FT_Vector FT_Vector} center;
    + *     FT_Fixed start_angle;
    + *     FT_Fixed end_angle;
    + * }
    + */ +public class FT_PaintSweepGradient extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + COLORLINE, + CENTER, + START_ANGLE, + END_ANGLE; + + static { + Layout layout = __struct( + __member(FT_ColorLine.SIZEOF, FT_ColorLine.ALIGNOF), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + COLORLINE = layout.offsetof(0); + CENTER = layout.offsetof(1); + START_ANGLE = layout.offsetof(2); + END_ANGLE = layout.offsetof(3); + } + + protected FT_PaintSweepGradient(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintSweepGradient create(long address, @Nullable ByteBuffer container) { + return new FT_PaintSweepGradient(address, container); + } + + /** + * Creates a {@code FT_PaintSweepGradient} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintSweepGradient(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_ColorLine} view of the {@code colorline} field. */ + public FT_ColorLine colorline() { return ncolorline(address()); } + /** @return a {@link FT_Vector} view of the {@code center} field. */ + public FT_Vector center() { return ncenter(address()); } + /** @return the value of the {@code start_angle} field. */ + @NativeType("FT_Fixed") + public long start_angle() { return nstart_angle(address()); } + /** @return the value of the {@code end_angle} field. */ + @NativeType("FT_Fixed") + public long end_angle() { return nend_angle(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintSweepGradient} instance for the specified memory address. */ + public static FT_PaintSweepGradient create(long address) { + return new FT_PaintSweepGradient(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintSweepGradient createSafe(long address) { + return address == NULL ? null : new FT_PaintSweepGradient(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #colorline}. */ + public static FT_ColorLine ncolorline(long struct) { return FT_ColorLine.create(struct + FT_PaintSweepGradient.COLORLINE); } + /** Unsafe version of {@link #center}. */ + public static FT_Vector ncenter(long struct) { return FT_Vector.create(struct + FT_PaintSweepGradient.CENTER); } + /** Unsafe version of {@link #start_angle}. */ + public static long nstart_angle(long struct) { return memGetCLong(struct + FT_PaintSweepGradient.START_ANGLE); } + /** Unsafe version of {@link #end_angle}. */ + public static long nend_angle(long struct) { return memGetCLong(struct + FT_PaintSweepGradient.END_ANGLE); } + + // ----------------------------------- + + /** An array of {@link FT_PaintSweepGradient} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintSweepGradient ELEMENT_FACTORY = FT_PaintSweepGradient.create(-1L); + + /** + * Creates a new {@code FT_PaintSweepGradient.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintSweepGradient#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintSweepGradient getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_ColorLine} view of the {@code colorline} field. */ + public FT_ColorLine colorline() { return FT_PaintSweepGradient.ncolorline(address()); } + /** @return a {@link FT_Vector} view of the {@code center} field. */ + public FT_Vector center() { return FT_PaintSweepGradient.ncenter(address()); } + /** @return the value of the {@code start_angle} field. */ + @NativeType("FT_Fixed") + public long start_angle() { return FT_PaintSweepGradient.nstart_angle(address()); } + /** @return the value of the {@code end_angle} field. */ + @NativeType("FT_Fixed") + public long end_angle() { return FT_PaintSweepGradient.nend_angle(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintTransform.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintTransform.java new file mode 100644 index 000000000..bfffeacf7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintTransform.java @@ -0,0 +1,163 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code COLR} v1 {@code PaintTransform} paint table. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintTransform {
    + *     {@link FT_OpaquePaint FT_OpaquePaintRec} paint;
    + *     {@link FT_Affine23 FT_Affine23} affine;
    + * }
    + */ +public class FT_PaintTransform extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PAINT, + AFFINE; + + static { + Layout layout = __struct( + __member(FT_OpaquePaint.SIZEOF, FT_OpaquePaint.ALIGNOF), + __member(FT_Affine23.SIZEOF, FT_Affine23.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PAINT = layout.offsetof(0); + AFFINE = layout.offsetof(1); + } + + protected FT_PaintTransform(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintTransform create(long address, @Nullable ByteBuffer container) { + return new FT_PaintTransform(address, container); + } + + /** + * Creates a {@code FT_PaintTransform} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintTransform(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return npaint(address()); } + /** @return a {@link FT_Affine23} view of the {@code affine} field. */ + public FT_Affine23 affine() { return naffine(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintTransform} instance for the specified memory address. */ + public static FT_PaintTransform create(long address) { + return new FT_PaintTransform(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintTransform createSafe(long address) { + return address == NULL ? null : new FT_PaintTransform(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #paint}. */ + public static FT_OpaquePaint npaint(long struct) { return FT_OpaquePaint.create(struct + FT_PaintTransform.PAINT); } + /** Unsafe version of {@link #affine}. */ + public static FT_Affine23 naffine(long struct) { return FT_Affine23.create(struct + FT_PaintTransform.AFFINE); } + + // ----------------------------------- + + /** An array of {@link FT_PaintTransform} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintTransform ELEMENT_FACTORY = FT_PaintTransform.create(-1L); + + /** + * Creates a new {@code FT_PaintTransform.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintTransform#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintTransform getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return FT_PaintTransform.npaint(address()); } + /** @return a {@link FT_Affine23} view of the {@code affine} field. */ + public FT_Affine23 affine() { return FT_PaintTransform.naffine(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintTranslate.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintTranslate.java new file mode 100644 index 000000000..f68064c38 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_PaintTranslate.java @@ -0,0 +1,177 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure representing a {@code COLR} v1 {@code PaintTranslate} paint table. Used for translating downstream paints by a given x and y~delta. + * + *

    Layout

    + * + *
    
    + * struct FT_PaintTranslate {
    + *     {@link FT_OpaquePaint FT_OpaquePaintRec} paint;
    + *     FT_Fixed dx;
    + *     FT_Fixed dy;
    + * }
    + */ +public class FT_PaintTranslate extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PAINT, + DX, + DY; + + static { + Layout layout = __struct( + __member(FT_OpaquePaint.SIZEOF, FT_OpaquePaint.ALIGNOF), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PAINT = layout.offsetof(0); + DX = layout.offsetof(1); + DY = layout.offsetof(2); + } + + protected FT_PaintTranslate(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_PaintTranslate create(long address, @Nullable ByteBuffer container) { + return new FT_PaintTranslate(address, container); + } + + /** + * Creates a {@code FT_PaintTranslate} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_PaintTranslate(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return npaint(address()); } + /** @return the value of the {@code dx} field. */ + @NativeType("FT_Fixed") + public long dx() { return ndx(address()); } + /** @return the value of the {@code dy} field. */ + @NativeType("FT_Fixed") + public long dy() { return ndy(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_PaintTranslate} instance for the specified memory address. */ + public static FT_PaintTranslate create(long address) { + return new FT_PaintTranslate(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_PaintTranslate createSafe(long address) { + return address == NULL ? null : new FT_PaintTranslate(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #paint}. */ + public static FT_OpaquePaint npaint(long struct) { return FT_OpaquePaint.create(struct + FT_PaintTranslate.PAINT); } + /** Unsafe version of {@link #dx}. */ + public static long ndx(long struct) { return memGetCLong(struct + FT_PaintTranslate.DX); } + /** Unsafe version of {@link #dy}. */ + public static long ndy(long struct) { return memGetCLong(struct + FT_PaintTranslate.DY); } + + // ----------------------------------- + + /** An array of {@link FT_PaintTranslate} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_PaintTranslate ELEMENT_FACTORY = FT_PaintTranslate.create(-1L); + + /** + * Creates a new {@code FT_PaintTranslate.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_PaintTranslate#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_PaintTranslate getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_OpaquePaint} view of the {@code paint} field. */ + @NativeType("FT_OpaquePaintRec") + public FT_OpaquePaint paint() { return FT_PaintTranslate.npaint(address()); } + /** @return the value of the {@code dx} field. */ + @NativeType("FT_Fixed") + public long dx() { return FT_PaintTranslate.ndx(address()); } + /** @return the value of the {@code dy} field. */ + @NativeType("FT_Fixed") + public long dy() { return FT_PaintTranslate.ndy(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Palette_Data.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Palette_Data.java new file mode 100644 index 000000000..399f30bba --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Palette_Data.java @@ -0,0 +1,291 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * This structure holds the data of the {@code CPAL} table. + * + *

    Layout

    + * + *
    
    + * struct FT_Palette_Data {
    + *     FT_UShort num_palettes;
    + *     FT_UShort const * palette_name_ids;
    + *     FT_UShort const * palette_flags;
    + *     FT_UShort num_palette_entries;
    + *     FT_UShort const * palette_entry_name_ids;
    + * }
    + */ +public class FT_Palette_Data extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NUM_PALETTES, + PALETTE_NAME_IDS, + PALETTE_FLAGS, + NUM_PALETTE_ENTRIES, + PALETTE_ENTRY_NAME_IDS; + + static { + Layout layout = __struct( + __member(2), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(2), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NUM_PALETTES = layout.offsetof(0); + PALETTE_NAME_IDS = layout.offsetof(1); + PALETTE_FLAGS = layout.offsetof(2); + NUM_PALETTE_ENTRIES = layout.offsetof(3); + PALETTE_ENTRY_NAME_IDS = layout.offsetof(4); + } + + protected FT_Palette_Data(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Palette_Data create(long address, @Nullable ByteBuffer container) { + return new FT_Palette_Data(address, container); + } + + /** + * Creates a {@code FT_Palette_Data} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Palette_Data(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code num_palettes} field. */ + @NativeType("FT_UShort") + public short num_palettes() { return nnum_palettes(address()); } + /** @return a {@link ShortBuffer} view of the data pointed to by the {@code palette_name_ids} field. */ + @Nullable + @NativeType("FT_UShort const *") + public ShortBuffer palette_name_ids() { return npalette_name_ids(address()); } + /** @return a {@link ShortBuffer} view of the data pointed to by the {@code palette_flags} field. */ + @Nullable + @NativeType("FT_UShort const *") + public ShortBuffer palette_flags() { return npalette_flags(address()); } + /** @return the value of the {@code num_palette_entries} field. */ + @NativeType("FT_UShort") + public short num_palette_entries() { return nnum_palette_entries(address()); } + /** @return a {@link ShortBuffer} view of the data pointed to by the {@code palette_entry_name_ids} field. */ + @Nullable + @NativeType("FT_UShort const *") + public ShortBuffer palette_entry_name_ids() { return npalette_entry_name_ids(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Palette_Data} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Palette_Data malloc() { + return new FT_Palette_Data(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Palette_Data} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Palette_Data calloc() { + return new FT_Palette_Data(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Palette_Data} instance allocated with {@link BufferUtils}. */ + public static FT_Palette_Data create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Palette_Data(memAddress(container), container); + } + + /** Returns a new {@code FT_Palette_Data} instance for the specified memory address. */ + public static FT_Palette_Data create(long address) { + return new FT_Palette_Data(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Palette_Data createSafe(long address) { + return address == NULL ? null : new FT_Palette_Data(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Palette_Data} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Palette_Data malloc(MemoryStack stack) { + return new FT_Palette_Data(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Palette_Data} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Palette_Data calloc(MemoryStack stack) { + return new FT_Palette_Data(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #num_palettes}. */ + public static short nnum_palettes(long struct) { return UNSAFE.getShort(null, struct + FT_Palette_Data.NUM_PALETTES); } + /** Unsafe version of {@link #palette_name_ids() palette_name_ids}. */ + @Nullable public static ShortBuffer npalette_name_ids(long struct) { return memShortBufferSafe(memGetAddress(struct + FT_Palette_Data.PALETTE_NAME_IDS), Short.toUnsignedInt(nnum_palettes(struct))); } + /** Unsafe version of {@link #palette_flags() palette_flags}. */ + @Nullable public static ShortBuffer npalette_flags(long struct) { return memShortBufferSafe(memGetAddress(struct + FT_Palette_Data.PALETTE_FLAGS), Short.toUnsignedInt(nnum_palettes(struct))); } + /** Unsafe version of {@link #num_palette_entries}. */ + public static short nnum_palette_entries(long struct) { return UNSAFE.getShort(null, struct + FT_Palette_Data.NUM_PALETTE_ENTRIES); } + /** Unsafe version of {@link #palette_entry_name_ids() palette_entry_name_ids}. */ + @Nullable public static ShortBuffer npalette_entry_name_ids(long struct) { return memShortBufferSafe(memGetAddress(struct + FT_Palette_Data.PALETTE_ENTRY_NAME_IDS), Short.toUnsignedInt(nnum_palette_entries(struct))); } + + // ----------------------------------- + + /** An array of {@link FT_Palette_Data} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Palette_Data ELEMENT_FACTORY = FT_Palette_Data.create(-1L); + + /** + * Creates a new {@code FT_Palette_Data.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Palette_Data#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Palette_Data getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code num_palettes} field. */ + @NativeType("FT_UShort") + public short num_palettes() { return FT_Palette_Data.nnum_palettes(address()); } + /** @return a {@link ShortBuffer} view of the data pointed to by the {@code palette_name_ids} field. */ + @Nullable + @NativeType("FT_UShort const *") + public ShortBuffer palette_name_ids() { return FT_Palette_Data.npalette_name_ids(address()); } + /** @return a {@link ShortBuffer} view of the data pointed to by the {@code palette_flags} field. */ + @Nullable + @NativeType("FT_UShort const *") + public ShortBuffer palette_flags() { return FT_Palette_Data.npalette_flags(address()); } + /** @return the value of the {@code num_palette_entries} field. */ + @NativeType("FT_UShort") + public short num_palette_entries() { return FT_Palette_Data.nnum_palette_entries(address()); } + /** @return a {@link ShortBuffer} view of the data pointed to by the {@code palette_entry_name_ids} field. */ + @Nullable + @NativeType("FT_UShort const *") + public ShortBuffer palette_entry_name_ids() { return FT_Palette_Data.npalette_entry_name_ids(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Parameter.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Parameter.java new file mode 100644 index 000000000..153604a44 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Parameter.java @@ -0,0 +1,297 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A simple structure to pass more or less generic parameters to {@link FreeType#FT_Open_Face Open_Face} and {@link FreeType#FT_Face_Properties Face_Properties}. + * + *

    Layout

    + * + *
    
    + * struct FT_Parameter {
    + *     FT_ULong tag;
    + *     FT_Pointer data;
    + * }
    + */ +public class FT_Parameter extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TAG, + DATA; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TAG = layout.offsetof(0); + DATA = layout.offsetof(1); + } + + protected FT_Parameter(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Parameter create(long address, @Nullable ByteBuffer container) { + return new FT_Parameter(address, container); + } + + /** + * Creates a {@code FT_Parameter} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Parameter(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code tag} field. */ + @NativeType("FT_ULong") + public long tag() { return ntag(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code data} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("FT_Pointer") + public ByteBuffer data(int capacity) { return ndata(address(), capacity); } + + /** Sets the specified value to the {@code tag} field. */ + public FT_Parameter tag(@NativeType("FT_ULong") long value) { ntag(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code data} field. */ + public FT_Parameter data(@Nullable @NativeType("FT_Pointer") ByteBuffer value) { ndata(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Parameter set( + long tag, + @Nullable ByteBuffer data + ) { + tag(tag); + data(data); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Parameter set(FT_Parameter src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Parameter} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Parameter malloc() { + return new FT_Parameter(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Parameter} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Parameter calloc() { + return new FT_Parameter(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Parameter} instance allocated with {@link BufferUtils}. */ + public static FT_Parameter create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Parameter(memAddress(container), container); + } + + /** Returns a new {@code FT_Parameter} instance for the specified memory address. */ + public static FT_Parameter create(long address) { + return new FT_Parameter(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Parameter createSafe(long address) { + return address == NULL ? null : new FT_Parameter(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Parameter} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Parameter malloc(MemoryStack stack) { + return new FT_Parameter(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Parameter} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Parameter calloc(MemoryStack stack) { + return new FT_Parameter(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #tag}. */ + public static long ntag(long struct) { return memGetCLong(struct + FT_Parameter.TAG); } + /** Unsafe version of {@link #data(int) data}. */ + @Nullable public static ByteBuffer ndata(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + FT_Parameter.DATA), capacity); } + + /** Unsafe version of {@link #tag(long) tag}. */ + public static void ntag(long struct, long value) { memPutCLong(struct + FT_Parameter.TAG, value); } + /** Unsafe version of {@link #data(ByteBuffer) data}. */ + public static void ndata(long struct, @Nullable ByteBuffer value) { memPutAddress(struct + FT_Parameter.DATA, memAddressSafe(value)); } + + // ----------------------------------- + + /** An array of {@link FT_Parameter} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Parameter ELEMENT_FACTORY = FT_Parameter.create(-1L); + + /** + * Creates a new {@code FT_Parameter.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Parameter#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Parameter getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code tag} field. */ + @NativeType("FT_ULong") + public long tag() { return FT_Parameter.ntag(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code data} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("FT_Pointer") + public ByteBuffer data(int capacity) { return FT_Parameter.ndata(address(), capacity); } + + /** Sets the specified value to the {@code tag} field. */ + public Buffer tag(@NativeType("FT_ULong") long value) { FT_Parameter.ntag(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code data} field. */ + public Buffer data(@Nullable @NativeType("FT_Pointer") ByteBuffer value) { FT_Parameter.ndata(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Prop_GlyphToScriptMap.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Prop_GlyphToScriptMap.java new file mode 100644 index 000000000..f497b363f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Prop_GlyphToScriptMap.java @@ -0,0 +1,173 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The data exchange structure for the glyph -to-script-map property. + * + *

    Layout

    + * + *
    
    + * struct FT_Prop_GlyphToScriptMap {
    + *     {@link FT_Face FT_Face} face;
    + *     FT_UShort * map;
    + * }
    + */ +public class FT_Prop_GlyphToScriptMap extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FACE, + MAP; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FACE = layout.offsetof(0); + MAP = layout.offsetof(1); + } + + protected FT_Prop_GlyphToScriptMap(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Prop_GlyphToScriptMap create(long address, @Nullable ByteBuffer container) { + return new FT_Prop_GlyphToScriptMap(address, container); + } + + /** + * Creates a {@code FT_Prop_GlyphToScriptMap} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Prop_GlyphToScriptMap(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_Face} view of the struct pointed to by the {@code face} field. */ + public FT_Face face() { return nface(address()); } + /** + * @return a {@link ShortBuffer} view of the data pointed to by the {@code map} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("FT_UShort *") + public ShortBuffer map(int capacity) { return nmap(address(), capacity); } + + // ----------------------------------- + + /** Returns a new {@code FT_Prop_GlyphToScriptMap} instance for the specified memory address. */ + public static FT_Prop_GlyphToScriptMap create(long address) { + return new FT_Prop_GlyphToScriptMap(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Prop_GlyphToScriptMap createSafe(long address) { + return address == NULL ? null : new FT_Prop_GlyphToScriptMap(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #face}. */ + public static FT_Face nface(long struct) { return FT_Face.create(memGetAddress(struct + FT_Prop_GlyphToScriptMap.FACE)); } + /** Unsafe version of {@link #map(int) map}. */ + @Nullable public static ShortBuffer nmap(long struct, int capacity) { return memShortBufferSafe(memGetAddress(struct + FT_Prop_GlyphToScriptMap.MAP), capacity); } + + // ----------------------------------- + + /** An array of {@link FT_Prop_GlyphToScriptMap} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Prop_GlyphToScriptMap ELEMENT_FACTORY = FT_Prop_GlyphToScriptMap.create(-1L); + + /** + * Creates a new {@code FT_Prop_GlyphToScriptMap.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Prop_GlyphToScriptMap#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Prop_GlyphToScriptMap getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_Face} view of the struct pointed to by the {@code face} field. */ + public FT_Face face() { return FT_Prop_GlyphToScriptMap.nface(address()); } + /** + * @return a {@link ShortBuffer} view of the data pointed to by the {@code map} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("FT_UShort *") + public ShortBuffer map(int capacity) { return FT_Prop_GlyphToScriptMap.nmap(address(), capacity); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Prop_IncreaseXHeight.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Prop_IncreaseXHeight.java new file mode 100644 index 000000000..a024bb78a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Prop_IncreaseXHeight.java @@ -0,0 +1,163 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The data exchange structure for the {@code increase-x-height} property. + * + *

    Layout

    + * + *
    
    + * struct FT_Prop_IncreaseXHeight {
    + *     {@link FT_Face FT_Face} face;
    + *     FT_UInt limit;
    + * }
    + */ +public class FT_Prop_IncreaseXHeight extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FACE, + LIMIT; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FACE = layout.offsetof(0); + LIMIT = layout.offsetof(1); + } + + protected FT_Prop_IncreaseXHeight(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Prop_IncreaseXHeight create(long address, @Nullable ByteBuffer container) { + return new FT_Prop_IncreaseXHeight(address, container); + } + + /** + * Creates a {@code FT_Prop_IncreaseXHeight} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Prop_IncreaseXHeight(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_Face} view of the struct pointed to by the {@code face} field. */ + public FT_Face face() { return nface(address()); } + /** @return the value of the {@code limit} field. */ + @NativeType("FT_UInt") + public int limit$() { return nlimit$(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Prop_IncreaseXHeight} instance for the specified memory address. */ + public static FT_Prop_IncreaseXHeight create(long address) { + return new FT_Prop_IncreaseXHeight(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Prop_IncreaseXHeight createSafe(long address) { + return address == NULL ? null : new FT_Prop_IncreaseXHeight(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #face}. */ + public static FT_Face nface(long struct) { return FT_Face.create(memGetAddress(struct + FT_Prop_IncreaseXHeight.FACE)); } + /** Unsafe version of {@link #limit$}. */ + public static int nlimit$(long struct) { return UNSAFE.getInt(null, struct + FT_Prop_IncreaseXHeight.LIMIT); } + + // ----------------------------------- + + /** An array of {@link FT_Prop_IncreaseXHeight} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Prop_IncreaseXHeight ELEMENT_FACTORY = FT_Prop_IncreaseXHeight.create(-1L); + + /** + * Creates a new {@code FT_Prop_IncreaseXHeight.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Prop_IncreaseXHeight#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Prop_IncreaseXHeight getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_Face} view of the struct pointed to by the {@code face} field. */ + public FT_Face face() { return FT_Prop_IncreaseXHeight.nface(address()); } + /** @return the value of the {@code limit} field. */ + @NativeType("FT_UInt") + public int limit$() { return FT_Prop_IncreaseXHeight.nlimit$(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_DoneFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_DoneFunc.java new file mode 100644 index 000000000..8b51a7ad6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_DoneFunc.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Raster raster
    + * )
    + */ +public abstract class FT_Raster_DoneFunc extends Callback implements FT_Raster_DoneFuncI { + + /** + * Creates a {@code FT_Raster_DoneFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Raster_DoneFunc} + */ + public static FT_Raster_DoneFunc create(long functionPointer) { + FT_Raster_DoneFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Raster_DoneFunc + ? (FT_Raster_DoneFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Raster_DoneFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Raster_DoneFunc} instance that delegates to the specified {@code FT_Raster_DoneFuncI} instance. */ + public static FT_Raster_DoneFunc create(FT_Raster_DoneFuncI instance) { + return instance instanceof FT_Raster_DoneFunc + ? (FT_Raster_DoneFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Raster_DoneFunc() { + super(CIF); + } + + FT_Raster_DoneFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Raster_DoneFunc { + + private final FT_Raster_DoneFuncI delegate; + + Container(long functionPointer, FT_Raster_DoneFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long raster) { + delegate.invoke(raster); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_DoneFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_DoneFuncI.java new file mode 100644 index 000000000..830d3109e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_DoneFuncI.java @@ -0,0 +1,46 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Raster raster
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Raster_DoneFunc") +public interface FT_Raster_DoneFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)) + ); + } + + /** A function used to destroy a given raster object. */ + void invoke(@NativeType("FT_Raster") long raster); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_Funcs.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_Funcs.java new file mode 100644 index 000000000..e4881cad1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_Funcs.java @@ -0,0 +1,367 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure used to describe a given raster class to the library. + * + *

    Layout

    + * + *
    
    + * struct FT_Raster_Funcs {
    + *     FT_Glyph_Format glyph_format;
    + *     {@link FT_Raster_NewFuncI FT_Raster_NewFunc} raster_new;
    + *     {@link FT_Raster_ResetFuncI FT_Raster_ResetFunc} raster_reset;
    + *     {@link FT_Raster_SetModeFuncI FT_Raster_SetModeFunc} raster_set_mode;
    + *     {@link FT_Raster_RenderFuncI FT_Raster_RenderFunc} raster_render;
    + *     {@link FT_Raster_DoneFuncI FT_Raster_DoneFunc} raster_done;
    + * }
    + */ +public class FT_Raster_Funcs extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + GLYPH_FORMAT, + RASTER_NEW, + RASTER_RESET, + RASTER_SET_MODE, + RASTER_RENDER, + RASTER_DONE; + + static { + Layout layout = __struct( + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + GLYPH_FORMAT = layout.offsetof(0); + RASTER_NEW = layout.offsetof(1); + RASTER_RESET = layout.offsetof(2); + RASTER_SET_MODE = layout.offsetof(3); + RASTER_RENDER = layout.offsetof(4); + RASTER_DONE = layout.offsetof(5); + } + + protected FT_Raster_Funcs(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Raster_Funcs create(long address, @Nullable ByteBuffer container) { + return new FT_Raster_Funcs(address, container); + } + + /** + * Creates a {@code FT_Raster_Funcs} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Raster_Funcs(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code glyph_format} field. */ + @NativeType("FT_Glyph_Format") + public int glyph_format() { return nglyph_format(address()); } + /** @return the value of the {@code raster_new} field. */ + @Nullable + public FT_Raster_NewFunc raster_new() { return nraster_new(address()); } + /** @return the value of the {@code raster_reset} field. */ + @Nullable + public FT_Raster_ResetFunc raster_reset() { return nraster_reset(address()); } + /** @return the value of the {@code raster_set_mode} field. */ + @Nullable + public FT_Raster_SetModeFunc raster_set_mode() { return nraster_set_mode(address()); } + /** @return the value of the {@code raster_render} field. */ + @Nullable + public FT_Raster_RenderFunc raster_render() { return nraster_render(address()); } + /** @return the value of the {@code raster_done} field. */ + @Nullable + public FT_Raster_DoneFunc raster_done() { return nraster_done(address()); } + + /** Sets the specified value to the {@code glyph_format} field. */ + public FT_Raster_Funcs glyph_format(@NativeType("FT_Glyph_Format") int value) { nglyph_format(address(), value); return this; } + /** Sets the specified value to the {@code raster_new} field. */ + public FT_Raster_Funcs raster_new(@Nullable @NativeType("FT_Raster_NewFunc") FT_Raster_NewFuncI value) { nraster_new(address(), value); return this; } + /** Sets the specified value to the {@code raster_reset} field. */ + public FT_Raster_Funcs raster_reset(@Nullable @NativeType("FT_Raster_ResetFunc") FT_Raster_ResetFuncI value) { nraster_reset(address(), value); return this; } + /** Sets the specified value to the {@code raster_set_mode} field. */ + public FT_Raster_Funcs raster_set_mode(@Nullable @NativeType("FT_Raster_SetModeFunc") FT_Raster_SetModeFuncI value) { nraster_set_mode(address(), value); return this; } + /** Sets the specified value to the {@code raster_render} field. */ + public FT_Raster_Funcs raster_render(@Nullable @NativeType("FT_Raster_RenderFunc") FT_Raster_RenderFuncI value) { nraster_render(address(), value); return this; } + /** Sets the specified value to the {@code raster_done} field. */ + public FT_Raster_Funcs raster_done(@Nullable @NativeType("FT_Raster_DoneFunc") FT_Raster_DoneFuncI value) { nraster_done(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Raster_Funcs set( + int glyph_format, + FT_Raster_NewFuncI raster_new, + FT_Raster_ResetFuncI raster_reset, + FT_Raster_SetModeFuncI raster_set_mode, + FT_Raster_RenderFuncI raster_render, + FT_Raster_DoneFuncI raster_done + ) { + glyph_format(glyph_format); + raster_new(raster_new); + raster_reset(raster_reset); + raster_set_mode(raster_set_mode); + raster_render(raster_render); + raster_done(raster_done); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Raster_Funcs set(FT_Raster_Funcs src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Raster_Funcs} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Raster_Funcs malloc() { + return new FT_Raster_Funcs(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Raster_Funcs} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Raster_Funcs calloc() { + return new FT_Raster_Funcs(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Raster_Funcs} instance allocated with {@link BufferUtils}. */ + public static FT_Raster_Funcs create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Raster_Funcs(memAddress(container), container); + } + + /** Returns a new {@code FT_Raster_Funcs} instance for the specified memory address. */ + public static FT_Raster_Funcs create(long address) { + return new FT_Raster_Funcs(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Raster_Funcs createSafe(long address) { + return address == NULL ? null : new FT_Raster_Funcs(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Raster_Funcs} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Raster_Funcs malloc(MemoryStack stack) { + return new FT_Raster_Funcs(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Raster_Funcs} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Raster_Funcs calloc(MemoryStack stack) { + return new FT_Raster_Funcs(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #glyph_format}. */ + public static int nglyph_format(long struct) { return UNSAFE.getInt(null, struct + FT_Raster_Funcs.GLYPH_FORMAT); } + /** Unsafe version of {@link #raster_new}. */ + @Nullable public static FT_Raster_NewFunc nraster_new(long struct) { return FT_Raster_NewFunc.createSafe(memGetAddress(struct + FT_Raster_Funcs.RASTER_NEW)); } + /** Unsafe version of {@link #raster_reset}. */ + @Nullable public static FT_Raster_ResetFunc nraster_reset(long struct) { return FT_Raster_ResetFunc.createSafe(memGetAddress(struct + FT_Raster_Funcs.RASTER_RESET)); } + /** Unsafe version of {@link #raster_set_mode}. */ + @Nullable public static FT_Raster_SetModeFunc nraster_set_mode(long struct) { return FT_Raster_SetModeFunc.createSafe(memGetAddress(struct + FT_Raster_Funcs.RASTER_SET_MODE)); } + /** Unsafe version of {@link #raster_render}. */ + @Nullable public static FT_Raster_RenderFunc nraster_render(long struct) { return FT_Raster_RenderFunc.createSafe(memGetAddress(struct + FT_Raster_Funcs.RASTER_RENDER)); } + /** Unsafe version of {@link #raster_done}. */ + @Nullable public static FT_Raster_DoneFunc nraster_done(long struct) { return FT_Raster_DoneFunc.createSafe(memGetAddress(struct + FT_Raster_Funcs.RASTER_DONE)); } + + /** Unsafe version of {@link #glyph_format(int) glyph_format}. */ + public static void nglyph_format(long struct, int value) { UNSAFE.putInt(null, struct + FT_Raster_Funcs.GLYPH_FORMAT, value); } + /** Unsafe version of {@link #raster_new(FT_Raster_NewFuncI) raster_new}. */ + public static void nraster_new(long struct, @Nullable FT_Raster_NewFuncI value) { memPutAddress(struct + FT_Raster_Funcs.RASTER_NEW, memAddressSafe(value)); } + /** Unsafe version of {@link #raster_reset(FT_Raster_ResetFuncI) raster_reset}. */ + public static void nraster_reset(long struct, @Nullable FT_Raster_ResetFuncI value) { memPutAddress(struct + FT_Raster_Funcs.RASTER_RESET, memAddressSafe(value)); } + /** Unsafe version of {@link #raster_set_mode(FT_Raster_SetModeFuncI) raster_set_mode}. */ + public static void nraster_set_mode(long struct, @Nullable FT_Raster_SetModeFuncI value) { memPutAddress(struct + FT_Raster_Funcs.RASTER_SET_MODE, memAddressSafe(value)); } + /** Unsafe version of {@link #raster_render(FT_Raster_RenderFuncI) raster_render}. */ + public static void nraster_render(long struct, @Nullable FT_Raster_RenderFuncI value) { memPutAddress(struct + FT_Raster_Funcs.RASTER_RENDER, memAddressSafe(value)); } + /** Unsafe version of {@link #raster_done(FT_Raster_DoneFuncI) raster_done}. */ + public static void nraster_done(long struct, @Nullable FT_Raster_DoneFuncI value) { memPutAddress(struct + FT_Raster_Funcs.RASTER_DONE, memAddressSafe(value)); } + + // ----------------------------------- + + /** An array of {@link FT_Raster_Funcs} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Raster_Funcs ELEMENT_FACTORY = FT_Raster_Funcs.create(-1L); + + /** + * Creates a new {@code FT_Raster_Funcs.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Raster_Funcs#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Raster_Funcs getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code glyph_format} field. */ + @NativeType("FT_Glyph_Format") + public int glyph_format() { return FT_Raster_Funcs.nglyph_format(address()); } + /** @return the value of the {@code raster_new} field. */ + @Nullable + public FT_Raster_NewFunc raster_new() { return FT_Raster_Funcs.nraster_new(address()); } + /** @return the value of the {@code raster_reset} field. */ + @Nullable + public FT_Raster_ResetFunc raster_reset() { return FT_Raster_Funcs.nraster_reset(address()); } + /** @return the value of the {@code raster_set_mode} field. */ + @Nullable + public FT_Raster_SetModeFunc raster_set_mode() { return FT_Raster_Funcs.nraster_set_mode(address()); } + /** @return the value of the {@code raster_render} field. */ + @Nullable + public FT_Raster_RenderFunc raster_render() { return FT_Raster_Funcs.nraster_render(address()); } + /** @return the value of the {@code raster_done} field. */ + @Nullable + public FT_Raster_DoneFunc raster_done() { return FT_Raster_Funcs.nraster_done(address()); } + + /** Sets the specified value to the {@code glyph_format} field. */ + public Buffer glyph_format(@NativeType("FT_Glyph_Format") int value) { FT_Raster_Funcs.nglyph_format(address(), value); return this; } + /** Sets the specified value to the {@code raster_new} field. */ + public Buffer raster_new(@Nullable @NativeType("FT_Raster_NewFunc") FT_Raster_NewFuncI value) { FT_Raster_Funcs.nraster_new(address(), value); return this; } + /** Sets the specified value to the {@code raster_reset} field. */ + public Buffer raster_reset(@Nullable @NativeType("FT_Raster_ResetFunc") FT_Raster_ResetFuncI value) { FT_Raster_Funcs.nraster_reset(address(), value); return this; } + /** Sets the specified value to the {@code raster_set_mode} field. */ + public Buffer raster_set_mode(@Nullable @NativeType("FT_Raster_SetModeFunc") FT_Raster_SetModeFuncI value) { FT_Raster_Funcs.nraster_set_mode(address(), value); return this; } + /** Sets the specified value to the {@code raster_render} field. */ + public Buffer raster_render(@Nullable @NativeType("FT_Raster_RenderFunc") FT_Raster_RenderFuncI value) { FT_Raster_Funcs.nraster_render(address(), value); return this; } + /** Sets the specified value to the {@code raster_done} field. */ + public Buffer raster_done(@Nullable @NativeType("FT_Raster_DoneFunc") FT_Raster_DoneFuncI value) { FT_Raster_Funcs.nraster_done(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_NewFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_NewFunc.java new file mode 100644 index 000000000..d033ff5af --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_NewFunc.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     void *memory,
    + *     FT_Raster *raster
    + * )
    + */ +public abstract class FT_Raster_NewFunc extends Callback implements FT_Raster_NewFuncI { + + /** + * Creates a {@code FT_Raster_NewFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Raster_NewFunc} + */ + public static FT_Raster_NewFunc create(long functionPointer) { + FT_Raster_NewFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Raster_NewFunc + ? (FT_Raster_NewFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Raster_NewFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Raster_NewFunc} instance that delegates to the specified {@code FT_Raster_NewFuncI} instance. */ + public static FT_Raster_NewFunc create(FT_Raster_NewFuncI instance) { + return instance instanceof FT_Raster_NewFunc + ? (FT_Raster_NewFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Raster_NewFunc() { + super(CIF); + } + + FT_Raster_NewFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Raster_NewFunc { + + private final FT_Raster_NewFuncI delegate; + + Container(long functionPointer, FT_Raster_NewFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long memory, long raster) { + return delegate.invoke(memory, raster); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_NewFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_NewFuncI.java new file mode 100644 index 000000000..7b89f11c7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_NewFuncI.java @@ -0,0 +1,49 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     void *memory,
    + *     FT_Raster *raster
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Raster_NewFunc") +public interface FT_Raster_NewFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** A function used to create a new raster object. */ + int invoke(@NativeType("void *") long memory, @NativeType("FT_Raster *") long raster); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_Params.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_Params.java new file mode 100644 index 000000000..2f9189454 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_Params.java @@ -0,0 +1,397 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure to hold the parameters used by a raster's render function, passed as an argument to {@link FreeType#FT_Outline_Render Outline_Render}. + * + *

    Layout

    + * + *
    
    + * struct FT_Raster_Params {
    + *     {@link FT_Bitmap FT_Bitmap} const * target;
    + *     void const * source;
    + *     int flags;
    + *     {@link FT_SpanFuncI FT_SpanFunc} gray_spans;
    + *     {@link FT_SpanFuncI FT_SpanFunc} black_spans;
    + *     FT_Raster_BitTest_Func bit_test;
    + *     FT_Raster_BitTest_Func bit_set;
    + *     void * user;
    + *     {@link FT_BBox FT_BBox} clip_box;
    + * }
    + */ +public class FT_Raster_Params extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TARGET, + SOURCE, + FLAGS, + GRAY_SPANS, + BLACK_SPANS, + BIT_TEST, + BIT_SET, + USER, + CLIP_BOX; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(4), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(FT_BBox.SIZEOF, FT_BBox.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TARGET = layout.offsetof(0); + SOURCE = layout.offsetof(1); + FLAGS = layout.offsetof(2); + GRAY_SPANS = layout.offsetof(3); + BLACK_SPANS = layout.offsetof(4); + BIT_TEST = layout.offsetof(5); + BIT_SET = layout.offsetof(6); + USER = layout.offsetof(7); + CLIP_BOX = layout.offsetof(8); + } + + protected FT_Raster_Params(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Raster_Params create(long address, @Nullable ByteBuffer container) { + return new FT_Raster_Params(address, container); + } + + /** + * Creates a {@code FT_Raster_Params} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Raster_Params(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_Bitmap} view of the struct pointed to by the {@code target} field. */ + @Nullable + @NativeType("FT_Bitmap const *") + public FT_Bitmap target() { return ntarget(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code source} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void const *") + public ByteBuffer source(int capacity) { return nsource(address(), capacity); } + /** @return the value of the {@code flags} field. */ + public int flags() { return nflags(address()); } + /** @return the value of the {@code gray_spans} field. */ + @Nullable + public FT_SpanFunc gray_spans() { return ngray_spans(address()); } + /** @return the value of the {@code user} field. */ + @NativeType("void *") + public long user() { return nuser(address()); } + /** @return a {@link FT_BBox} view of the {@code clip_box} field. */ + public FT_BBox clip_box() { return nclip_box(address()); } + + /** Sets the address of the specified {@link FT_Bitmap} to the {@code target} field. */ + public FT_Raster_Params target(@Nullable @NativeType("FT_Bitmap const *") FT_Bitmap value) { ntarget(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code source} field. */ + public FT_Raster_Params source(@Nullable @NativeType("void const *") ByteBuffer value) { nsource(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public FT_Raster_Params flags(int value) { nflags(address(), value); return this; } + /** Sets the specified value to the {@code gray_spans} field. */ + public FT_Raster_Params gray_spans(@Nullable @NativeType("FT_SpanFunc") FT_SpanFuncI value) { ngray_spans(address(), value); return this; } + /** Sets the specified value to the {@code user} field. */ + public FT_Raster_Params user(@NativeType("void *") long value) { nuser(address(), value); return this; } + /** Copies the specified {@link FT_BBox} to the {@code clip_box} field. */ + public FT_Raster_Params clip_box(FT_BBox value) { nclip_box(address(), value); return this; } + /** Passes the {@code clip_box} field to the specified {@link java.util.function.Consumer Consumer}. */ + public FT_Raster_Params clip_box(java.util.function.Consumer consumer) { consumer.accept(clip_box()); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Raster_Params set( + @Nullable FT_Bitmap target, + @Nullable ByteBuffer source, + int flags, + @Nullable FT_SpanFuncI gray_spans, + long user, + FT_BBox clip_box + ) { + target(target); + source(source); + flags(flags); + gray_spans(gray_spans); + user(user); + clip_box(clip_box); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Raster_Params set(FT_Raster_Params src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Raster_Params} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Raster_Params malloc() { + return new FT_Raster_Params(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Raster_Params} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Raster_Params calloc() { + return new FT_Raster_Params(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Raster_Params} instance allocated with {@link BufferUtils}. */ + public static FT_Raster_Params create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Raster_Params(memAddress(container), container); + } + + /** Returns a new {@code FT_Raster_Params} instance for the specified memory address. */ + public static FT_Raster_Params create(long address) { + return new FT_Raster_Params(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Raster_Params createSafe(long address) { + return address == NULL ? null : new FT_Raster_Params(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Raster_Params} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Raster_Params malloc(MemoryStack stack) { + return new FT_Raster_Params(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Raster_Params} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Raster_Params calloc(MemoryStack stack) { + return new FT_Raster_Params(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #target}. */ + @Nullable public static FT_Bitmap ntarget(long struct) { return FT_Bitmap.createSafe(memGetAddress(struct + FT_Raster_Params.TARGET)); } + /** Unsafe version of {@link #source(int) source}. */ + @Nullable public static ByteBuffer nsource(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + FT_Raster_Params.SOURCE), capacity); } + /** Unsafe version of {@link #flags}. */ + public static int nflags(long struct) { return UNSAFE.getInt(null, struct + FT_Raster_Params.FLAGS); } + /** Unsafe version of {@link #gray_spans}. */ + @Nullable public static FT_SpanFunc ngray_spans(long struct) { return FT_SpanFunc.createSafe(memGetAddress(struct + FT_Raster_Params.GRAY_SPANS)); } + @Nullable public static FT_SpanFunc nblack_spans(long struct) { return FT_SpanFunc.createSafe(memGetAddress(struct + FT_Raster_Params.BLACK_SPANS)); } + public static long nbit_test(long struct) { return memGetAddress(struct + FT_Raster_Params.BIT_TEST); } + public static long nbit_set(long struct) { return memGetAddress(struct + FT_Raster_Params.BIT_SET); } + /** Unsafe version of {@link #user}. */ + public static long nuser(long struct) { return memGetAddress(struct + FT_Raster_Params.USER); } + /** Unsafe version of {@link #clip_box}. */ + public static FT_BBox nclip_box(long struct) { return FT_BBox.create(struct + FT_Raster_Params.CLIP_BOX); } + + /** Unsafe version of {@link #target(FT_Bitmap) target}. */ + public static void ntarget(long struct, @Nullable FT_Bitmap value) { memPutAddress(struct + FT_Raster_Params.TARGET, memAddressSafe(value)); } + /** Unsafe version of {@link #source(ByteBuffer) source}. */ + public static void nsource(long struct, @Nullable ByteBuffer value) { memPutAddress(struct + FT_Raster_Params.SOURCE, memAddressSafe(value)); } + /** Unsafe version of {@link #flags(int) flags}. */ + public static void nflags(long struct, int value) { UNSAFE.putInt(null, struct + FT_Raster_Params.FLAGS, value); } + /** Unsafe version of {@link #gray_spans(FT_SpanFuncI) gray_spans}. */ + public static void ngray_spans(long struct, @Nullable FT_SpanFuncI value) { memPutAddress(struct + FT_Raster_Params.GRAY_SPANS, memAddressSafe(value)); } + public static void nblack_spans(long struct, @Nullable FT_SpanFuncI value) { memPutAddress(struct + FT_Raster_Params.BLACK_SPANS, memAddressSafe(value)); } + public static void nbit_test(long struct, long value) { memPutAddress(struct + FT_Raster_Params.BIT_TEST, value); } + public static void nbit_set(long struct, long value) { memPutAddress(struct + FT_Raster_Params.BIT_SET, value); } + /** Unsafe version of {@link #user(long) user}. */ + public static void nuser(long struct, long value) { memPutAddress(struct + FT_Raster_Params.USER, value); } + /** Unsafe version of {@link #clip_box(FT_BBox) clip_box}. */ + public static void nclip_box(long struct, FT_BBox value) { memCopy(value.address(), struct + FT_Raster_Params.CLIP_BOX, FT_BBox.SIZEOF); } + + // ----------------------------------- + + /** An array of {@link FT_Raster_Params} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Raster_Params ELEMENT_FACTORY = FT_Raster_Params.create(-1L); + + /** + * Creates a new {@code FT_Raster_Params.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Raster_Params#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Raster_Params getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_Bitmap} view of the struct pointed to by the {@code target} field. */ + @Nullable + @NativeType("FT_Bitmap const *") + public FT_Bitmap target() { return FT_Raster_Params.ntarget(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code source} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void const *") + public ByteBuffer source(int capacity) { return FT_Raster_Params.nsource(address(), capacity); } + /** @return the value of the {@code flags} field. */ + public int flags() { return FT_Raster_Params.nflags(address()); } + /** @return the value of the {@code gray_spans} field. */ + @Nullable + public FT_SpanFunc gray_spans() { return FT_Raster_Params.ngray_spans(address()); } + /** @return the value of the {@code user} field. */ + @NativeType("void *") + public long user() { return FT_Raster_Params.nuser(address()); } + /** @return a {@link FT_BBox} view of the {@code clip_box} field. */ + public FT_BBox clip_box() { return FT_Raster_Params.nclip_box(address()); } + + /** Sets the address of the specified {@link FT_Bitmap} to the {@code target} field. */ + public Buffer target(@Nullable @NativeType("FT_Bitmap const *") FT_Bitmap value) { FT_Raster_Params.ntarget(address(), value); return this; } + /** Sets the address of the specified {@link ByteBuffer} to the {@code source} field. */ + public Buffer source(@Nullable @NativeType("void const *") ByteBuffer value) { FT_Raster_Params.nsource(address(), value); return this; } + /** Sets the specified value to the {@code flags} field. */ + public Buffer flags(int value) { FT_Raster_Params.nflags(address(), value); return this; } + /** Sets the specified value to the {@code gray_spans} field. */ + public Buffer gray_spans(@Nullable @NativeType("FT_SpanFunc") FT_SpanFuncI value) { FT_Raster_Params.ngray_spans(address(), value); return this; } + /** Sets the specified value to the {@code user} field. */ + public Buffer user(@NativeType("void *") long value) { FT_Raster_Params.nuser(address(), value); return this; } + /** Copies the specified {@link FT_BBox} to the {@code clip_box} field. */ + public Buffer clip_box(FT_BBox value) { FT_Raster_Params.nclip_box(address(), value); return this; } + /** Passes the {@code clip_box} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer clip_box(java.util.function.Consumer consumer) { consumer.accept(clip_box()); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_RenderFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_RenderFunc.java new file mode 100644 index 000000000..fb5a78402 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_RenderFunc.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Raster raster,
    + *     FT_Raster_Params const *params
    + * )
    + */ +public abstract class FT_Raster_RenderFunc extends Callback implements FT_Raster_RenderFuncI { + + /** + * Creates a {@code FT_Raster_RenderFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Raster_RenderFunc} + */ + public static FT_Raster_RenderFunc create(long functionPointer) { + FT_Raster_RenderFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Raster_RenderFunc + ? (FT_Raster_RenderFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Raster_RenderFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Raster_RenderFunc} instance that delegates to the specified {@code FT_Raster_RenderFuncI} instance. */ + public static FT_Raster_RenderFunc create(FT_Raster_RenderFuncI instance) { + return instance instanceof FT_Raster_RenderFunc + ? (FT_Raster_RenderFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Raster_RenderFunc() { + super(CIF); + } + + FT_Raster_RenderFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Raster_RenderFunc { + + private final FT_Raster_RenderFuncI delegate; + + Container(long functionPointer, FT_Raster_RenderFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long raster, long params) { + return delegate.invoke(raster, params); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_RenderFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_RenderFuncI.java new file mode 100644 index 000000000..144db4fad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_RenderFuncI.java @@ -0,0 +1,49 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Raster raster,
    + *     FT_Raster_Params const *params
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Raster_RenderFunc") +public interface FT_Raster_RenderFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** Invoke a given raster to scan-convert a given glyph image into a target bitmap. */ + int invoke(@NativeType("FT_Raster") long raster, @NativeType("FT_Raster_Params const *") long params); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_ResetFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_ResetFunc.java new file mode 100644 index 000000000..59d7dc3e6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_ResetFunc.java @@ -0,0 +1,75 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Raster raster,
    + *     unsigned char *pool_base,
    + *     unsigned long pool_size
    + * )
    + */ +public abstract class FT_Raster_ResetFunc extends Callback implements FT_Raster_ResetFuncI { + + /** + * Creates a {@code FT_Raster_ResetFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Raster_ResetFunc} + */ + public static FT_Raster_ResetFunc create(long functionPointer) { + FT_Raster_ResetFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Raster_ResetFunc + ? (FT_Raster_ResetFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Raster_ResetFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Raster_ResetFunc} instance that delegates to the specified {@code FT_Raster_ResetFuncI} instance. */ + public static FT_Raster_ResetFunc create(FT_Raster_ResetFuncI instance) { + return instance instanceof FT_Raster_ResetFunc + ? (FT_Raster_ResetFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Raster_ResetFunc() { + super(CIF); + } + + FT_Raster_ResetFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Raster_ResetFunc { + + private final FT_Raster_ResetFuncI delegate; + + Container(long functionPointer, FT_Raster_ResetFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long raster, long pool_base, long pool_size) { + delegate.invoke(raster, pool_base, pool_size); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_ResetFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_ResetFuncI.java new file mode 100644 index 000000000..ff0ab45da --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_ResetFuncI.java @@ -0,0 +1,55 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Raster raster,
    + *     unsigned char *pool_base,
    + *     unsigned long pool_size
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Raster_ResetFunc") +public interface FT_Raster_ResetFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer, ffi_type_pointer, ffi_type_ulong + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)), + memGetCLong(memGetAddress(args + 2 * POINTER_SIZE)) + ); + } + + /** + * FreeType used to provide an area of memory called the 'render pool' available to all registered rasterizers. This was not thread safe, however, and now + * FreeType never allocates this pool. + * + *

    This function is called after a new raster object is created.

    + */ + void invoke(@NativeType("FT_Raster") long raster, @NativeType("unsigned char *") long pool_base, @NativeType("unsigned long") long pool_size); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_SetModeFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_SetModeFunc.java new file mode 100644 index 000000000..f987583c2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_SetModeFunc.java @@ -0,0 +1,75 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Raster raster,
    + *     unsigned long mode,
    + *     void *args
    + * )
    + */ +public abstract class FT_Raster_SetModeFunc extends Callback implements FT_Raster_SetModeFuncI { + + /** + * Creates a {@code FT_Raster_SetModeFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Raster_SetModeFunc} + */ + public static FT_Raster_SetModeFunc create(long functionPointer) { + FT_Raster_SetModeFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Raster_SetModeFunc + ? (FT_Raster_SetModeFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Raster_SetModeFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Raster_SetModeFunc} instance that delegates to the specified {@code FT_Raster_SetModeFuncI} instance. */ + public static FT_Raster_SetModeFunc create(FT_Raster_SetModeFuncI instance) { + return instance instanceof FT_Raster_SetModeFunc + ? (FT_Raster_SetModeFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Raster_SetModeFunc() { + super(CIF); + } + + FT_Raster_SetModeFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Raster_SetModeFunc { + + private final FT_Raster_SetModeFuncI delegate; + + Container(long functionPointer, FT_Raster_SetModeFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long raster, long mode, long args) { + return delegate.invoke(raster, mode, args); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_SetModeFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_SetModeFuncI.java new file mode 100644 index 000000000..d8a031c7e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Raster_SetModeFuncI.java @@ -0,0 +1,54 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * int (*{@link #invoke}) (
    + *     FT_Raster raster,
    + *     unsigned long mode,
    + *     void *args
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Raster_SetModeFunc") +public interface FT_Raster_SetModeFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_ulong, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetCLong(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** + * This function is a generic facility to change modes or attributes in a given raster. This can be used for debugging purposes, or simply + * to allow implementation-specific 'features' in a given raster module. + */ + int invoke(@NativeType("FT_Raster") long raster, @NativeType("unsigned long") long mode, @NativeType("void *") long args); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Realloc_Func.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Realloc_Func.java new file mode 100644 index 000000000..dc4ed70fd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Realloc_Func.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     FT_Memory memory,
    + *     long cur_size,
    + *     long new_size,
    + *     void *block
    + * )
    + */ +public abstract class FT_Realloc_Func extends Callback implements FT_Realloc_FuncI { + + /** + * Creates a {@code FT_Realloc_Func} instance from the specified function pointer. + * + * @return the new {@code FT_Realloc_Func} + */ + public static FT_Realloc_Func create(long functionPointer) { + FT_Realloc_FuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Realloc_Func + ? (FT_Realloc_Func)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Realloc_Func createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Realloc_Func} instance that delegates to the specified {@code FT_Realloc_FuncI} instance. */ + public static FT_Realloc_Func create(FT_Realloc_FuncI instance) { + return instance instanceof FT_Realloc_Func + ? (FT_Realloc_Func)instance + : new Container(instance.address(), instance); + } + + protected FT_Realloc_Func() { + super(CIF); + } + + FT_Realloc_Func(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Realloc_Func { + + private final FT_Realloc_FuncI delegate; + + Container(long functionPointer, FT_Realloc_FuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public long invoke(long memory, long cur_size, long new_size, long block) { + return delegate.invoke(memory, cur_size, new_size, block); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Realloc_FuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Realloc_FuncI.java new file mode 100644 index 000000000..ae94e1916 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Realloc_FuncI.java @@ -0,0 +1,53 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void * (*{@link #invoke}) (
    + *     FT_Memory memory,
    + *     long cur_size,
    + *     long new_size,
    + *     void *block
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Realloc_Func") +public interface FT_Realloc_FuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_pointer, + ffi_type_pointer, ffi_type_slong, ffi_type_slong, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + long __result = invoke( + memGetAddress(memGetAddress(args)), + memGetCLong(memGetAddress(args + POINTER_SIZE)), + memGetCLong(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)) + ); + apiClosureRetP(ret, __result); + } + + /** A function used to re-allocate a given block of memory. */ + @NativeType("void *") long invoke(@NativeType("FT_Memory") long memory, long cur_size, long new_size, @NativeType("void *") long block); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SVG_Document.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SVG_Document.java new file mode 100644 index 000000000..c4f22acfd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SVG_Document.java @@ -0,0 +1,232 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure that models one SVG document. + * + *

    Layout

    + * + *
    
    + * struct FT_SVG_DocumentRec {
    + *     FT_Byte * svg_document;
    + *     FT_ULong svg_document_length;
    + *     {@link FT_Size_Metrics FT_Size_Metrics} metrics;
    + *     FT_UShort units_per_EM;
    + *     FT_UShort start_glyph_id;
    + *     FT_UShort end_glyph_id;
    + *     {@link FT_Matrix FT_Matrix} transform;
    + *     {@link FT_Vector FT_Vector} delta;
    + * }
    + */ +@NativeType("struct FT_SVG_DocumentRec") +public class FT_SVG_Document extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + SVG_DOCUMENT, + SVG_DOCUMENT_LENGTH, + METRICS, + UNITS_PER_EM, + START_GLYPH_ID, + END_GLYPH_ID, + TRANSFORM, + DELTA; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(FT_Size_Metrics.SIZEOF, FT_Size_Metrics.ALIGNOF), + __member(2), + __member(2), + __member(2), + __member(FT_Matrix.SIZEOF, FT_Matrix.ALIGNOF), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + SVG_DOCUMENT = layout.offsetof(0); + SVG_DOCUMENT_LENGTH = layout.offsetof(1); + METRICS = layout.offsetof(2); + UNITS_PER_EM = layout.offsetof(3); + START_GLYPH_ID = layout.offsetof(4); + END_GLYPH_ID = layout.offsetof(5); + TRANSFORM = layout.offsetof(6); + DELTA = layout.offsetof(7); + } + + protected FT_SVG_Document(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_SVG_Document create(long address, @Nullable ByteBuffer container) { + return new FT_SVG_Document(address, container); + } + + /** + * Creates a {@code FT_SVG_Document} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_SVG_Document(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code svg_document} field. */ + @NativeType("FT_Byte *") + public ByteBuffer svg_document() { return nsvg_document(address()); } + /** @return the value of the {@code svg_document_length} field. */ + @NativeType("FT_ULong") + public long svg_document_length() { return nsvg_document_length(address()); } + /** @return a {@link FT_Size_Metrics} view of the {@code metrics} field. */ + public FT_Size_Metrics metrics() { return nmetrics(address()); } + /** @return the value of the {@code units_per_EM} field. */ + @NativeType("FT_UShort") + public short units_per_EM() { return nunits_per_EM(address()); } + /** @return the value of the {@code start_glyph_id} field. */ + @NativeType("FT_UShort") + public short start_glyph_id() { return nstart_glyph_id(address()); } + /** @return the value of the {@code end_glyph_id} field. */ + @NativeType("FT_UShort") + public short end_glyph_id() { return nend_glyph_id(address()); } + /** @return a {@link FT_Matrix} view of the {@code transform} field. */ + public FT_Matrix transform() { return ntransform(address()); } + /** @return a {@link FT_Vector} view of the {@code delta} field. */ + public FT_Vector delta() { return ndelta(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_SVG_Document} instance for the specified memory address. */ + public static FT_SVG_Document create(long address) { + return new FT_SVG_Document(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_SVG_Document createSafe(long address) { + return address == NULL ? null : new FT_SVG_Document(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #svg_document() svg_document}. */ + public static ByteBuffer nsvg_document(long struct) { return memByteBuffer(memGetAddress(struct + FT_SVG_Document.SVG_DOCUMENT), (int)nsvg_document_length(struct)); } + /** Unsafe version of {@link #svg_document_length}. */ + public static long nsvg_document_length(long struct) { return memGetCLong(struct + FT_SVG_Document.SVG_DOCUMENT_LENGTH); } + /** Unsafe version of {@link #metrics}. */ + public static FT_Size_Metrics nmetrics(long struct) { return FT_Size_Metrics.create(struct + FT_SVG_Document.METRICS); } + /** Unsafe version of {@link #units_per_EM}. */ + public static short nunits_per_EM(long struct) { return UNSAFE.getShort(null, struct + FT_SVG_Document.UNITS_PER_EM); } + /** Unsafe version of {@link #start_glyph_id}. */ + public static short nstart_glyph_id(long struct) { return UNSAFE.getShort(null, struct + FT_SVG_Document.START_GLYPH_ID); } + /** Unsafe version of {@link #end_glyph_id}. */ + public static short nend_glyph_id(long struct) { return UNSAFE.getShort(null, struct + FT_SVG_Document.END_GLYPH_ID); } + /** Unsafe version of {@link #transform}. */ + public static FT_Matrix ntransform(long struct) { return FT_Matrix.create(struct + FT_SVG_Document.TRANSFORM); } + /** Unsafe version of {@link #delta}. */ + public static FT_Vector ndelta(long struct) { return FT_Vector.create(struct + FT_SVG_Document.DELTA); } + + // ----------------------------------- + + /** An array of {@link FT_SVG_Document} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_SVG_Document ELEMENT_FACTORY = FT_SVG_Document.create(-1L); + + /** + * Creates a new {@code FT_SVG_Document.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_SVG_Document#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_SVG_Document getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code svg_document} field. */ + @NativeType("FT_Byte *") + public ByteBuffer svg_document() { return FT_SVG_Document.nsvg_document(address()); } + /** @return the value of the {@code svg_document_length} field. */ + @NativeType("FT_ULong") + public long svg_document_length() { return FT_SVG_Document.nsvg_document_length(address()); } + /** @return a {@link FT_Size_Metrics} view of the {@code metrics} field. */ + public FT_Size_Metrics metrics() { return FT_SVG_Document.nmetrics(address()); } + /** @return the value of the {@code units_per_EM} field. */ + @NativeType("FT_UShort") + public short units_per_EM() { return FT_SVG_Document.nunits_per_EM(address()); } + /** @return the value of the {@code start_glyph_id} field. */ + @NativeType("FT_UShort") + public short start_glyph_id() { return FT_SVG_Document.nstart_glyph_id(address()); } + /** @return the value of the {@code end_glyph_id} field. */ + @NativeType("FT_UShort") + public short end_glyph_id() { return FT_SVG_Document.nend_glyph_id(address()); } + /** @return a {@link FT_Matrix} view of the {@code transform} field. */ + public FT_Matrix transform() { return FT_SVG_Document.ntransform(address()); } + /** @return a {@link FT_Vector} view of the {@code delta} field. */ + public FT_Vector delta() { return FT_SVG_Document.ndelta(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SfntLangTag.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SfntLangTag.java new file mode 100644 index 000000000..636bc77ad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SfntLangTag.java @@ -0,0 +1,247 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct FT_SfntLangTag {
    + *     FT_Byte * string;
    + *     FT_UInt string_len;
    + * }
    + */ +public class FT_SfntLangTag extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + STRING, + STRING_LEN; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + STRING = layout.offsetof(0); + STRING_LEN = layout.offsetof(1); + } + + protected FT_SfntLangTag(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_SfntLangTag create(long address, @Nullable ByteBuffer container) { + return new FT_SfntLangTag(address, container); + } + + /** + * Creates a {@code FT_SfntLangTag} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_SfntLangTag(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code string} field. */ + @NativeType("FT_Byte *") + public ByteBuffer string() { return nstring(address()); } + /** @return the value of the {@code string_len} field. */ + @NativeType("FT_UInt") + public int string_len() { return nstring_len(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_SfntLangTag} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_SfntLangTag malloc() { + return new FT_SfntLangTag(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_SfntLangTag} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_SfntLangTag calloc() { + return new FT_SfntLangTag(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_SfntLangTag} instance allocated with {@link BufferUtils}. */ + public static FT_SfntLangTag create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_SfntLangTag(memAddress(container), container); + } + + /** Returns a new {@code FT_SfntLangTag} instance for the specified memory address. */ + public static FT_SfntLangTag create(long address) { + return new FT_SfntLangTag(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_SfntLangTag createSafe(long address) { + return address == NULL ? null : new FT_SfntLangTag(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_SfntLangTag} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_SfntLangTag malloc(MemoryStack stack) { + return new FT_SfntLangTag(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_SfntLangTag} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_SfntLangTag calloc(MemoryStack stack) { + return new FT_SfntLangTag(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #string() string}. */ + public static ByteBuffer nstring(long struct) { return memByteBuffer(memGetAddress(struct + FT_SfntLangTag.STRING), nstring_len(struct)); } + /** Unsafe version of {@link #string_len}. */ + public static int nstring_len(long struct) { return UNSAFE.getInt(null, struct + FT_SfntLangTag.STRING_LEN); } + + // ----------------------------------- + + /** An array of {@link FT_SfntLangTag} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_SfntLangTag ELEMENT_FACTORY = FT_SfntLangTag.create(-1L); + + /** + * Creates a new {@code FT_SfntLangTag.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_SfntLangTag#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_SfntLangTag getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code string} field. */ + @NativeType("FT_Byte *") + public ByteBuffer string() { return FT_SfntLangTag.nstring(address()); } + /** @return the value of the {@code string_len} field. */ + @NativeType("FT_UInt") + public int string_len() { return FT_SfntLangTag.nstring_len(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SfntName.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SfntName.java new file mode 100644 index 000000000..eb26b887f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SfntName.java @@ -0,0 +1,295 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + *

    Layout

    + * + *
    
    + * struct FT_SfntName {
    + *     FT_UShort platform_id;
    + *     FT_UShort encoding_id;
    + *     FT_UShort language_id;
    + *     FT_UShort name_id;
    + *     FT_Byte * string;
    + *     FT_UInt string_len;
    + * }
    + */ +public class FT_SfntName extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + PLATFORM_ID, + ENCODING_ID, + LANGUAGE_ID, + NAME_ID, + STRING, + STRING_LEN; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(2), + __member(2), + __member(POINTER_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + PLATFORM_ID = layout.offsetof(0); + ENCODING_ID = layout.offsetof(1); + LANGUAGE_ID = layout.offsetof(2); + NAME_ID = layout.offsetof(3); + STRING = layout.offsetof(4); + STRING_LEN = layout.offsetof(5); + } + + protected FT_SfntName(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_SfntName create(long address, @Nullable ByteBuffer container) { + return new FT_SfntName(address, container); + } + + /** + * Creates a {@code FT_SfntName} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_SfntName(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code platform_id} field. */ + @NativeType("FT_UShort") + public short platform_id() { return nplatform_id(address()); } + /** @return the value of the {@code encoding_id} field. */ + @NativeType("FT_UShort") + public short encoding_id() { return nencoding_id(address()); } + /** @return the value of the {@code language_id} field. */ + @NativeType("FT_UShort") + public short language_id() { return nlanguage_id(address()); } + /** @return the value of the {@code name_id} field. */ + @NativeType("FT_UShort") + public short name_id() { return nname_id(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code string} field. */ + @NativeType("FT_Byte *") + public ByteBuffer string() { return nstring(address()); } + /** @return the value of the {@code string_len} field. */ + @NativeType("FT_UInt") + public int string_len() { return nstring_len(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_SfntName} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_SfntName malloc() { + return new FT_SfntName(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_SfntName} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_SfntName calloc() { + return new FT_SfntName(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_SfntName} instance allocated with {@link BufferUtils}. */ + public static FT_SfntName create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_SfntName(memAddress(container), container); + } + + /** Returns a new {@code FT_SfntName} instance for the specified memory address. */ + public static FT_SfntName create(long address) { + return new FT_SfntName(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_SfntName createSafe(long address) { + return address == NULL ? null : new FT_SfntName(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_SfntName} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_SfntName malloc(MemoryStack stack) { + return new FT_SfntName(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_SfntName} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_SfntName calloc(MemoryStack stack) { + return new FT_SfntName(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #platform_id}. */ + public static short nplatform_id(long struct) { return UNSAFE.getShort(null, struct + FT_SfntName.PLATFORM_ID); } + /** Unsafe version of {@link #encoding_id}. */ + public static short nencoding_id(long struct) { return UNSAFE.getShort(null, struct + FT_SfntName.ENCODING_ID); } + /** Unsafe version of {@link #language_id}. */ + public static short nlanguage_id(long struct) { return UNSAFE.getShort(null, struct + FT_SfntName.LANGUAGE_ID); } + /** Unsafe version of {@link #name_id}. */ + public static short nname_id(long struct) { return UNSAFE.getShort(null, struct + FT_SfntName.NAME_ID); } + /** Unsafe version of {@link #string() string}. */ + public static ByteBuffer nstring(long struct) { return memByteBuffer(memGetAddress(struct + FT_SfntName.STRING), nstring_len(struct)); } + /** Unsafe version of {@link #string_len}. */ + public static int nstring_len(long struct) { return UNSAFE.getInt(null, struct + FT_SfntName.STRING_LEN); } + + // ----------------------------------- + + /** An array of {@link FT_SfntName} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_SfntName ELEMENT_FACTORY = FT_SfntName.create(-1L); + + /** + * Creates a new {@code FT_SfntName.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_SfntName#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_SfntName getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code platform_id} field. */ + @NativeType("FT_UShort") + public short platform_id() { return FT_SfntName.nplatform_id(address()); } + /** @return the value of the {@code encoding_id} field. */ + @NativeType("FT_UShort") + public short encoding_id() { return FT_SfntName.nencoding_id(address()); } + /** @return the value of the {@code language_id} field. */ + @NativeType("FT_UShort") + public short language_id() { return FT_SfntName.nlanguage_id(address()); } + /** @return the value of the {@code name_id} field. */ + @NativeType("FT_UShort") + public short name_id() { return FT_SfntName.nname_id(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code string} field. */ + @NativeType("FT_Byte *") + public ByteBuffer string() { return FT_SfntName.nstring(address()); } + /** @return the value of the {@code string_len} field. */ + @NativeType("FT_UInt") + public int string_len() { return FT_SfntName.nstring_len(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size.java new file mode 100644 index 000000000..bc76589cf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size.java @@ -0,0 +1,323 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * FreeType root size class structure. A size object models a face object at a given size. + * + *

    Layout

    + * + *
    
    + * struct FT_SizeRec {
    + *     {@link FT_Face FT_Face} {@link #face};
    + *     {@link FT_Generic FT_Generic} {@link #generic};
    + *     {@link FT_Size_Metrics FT_Size_Metrics} {@link #metrics};
    + *     {@link FT_Size_Internal FT_Size_Internal} * internal;
    + * }
    + */ +@NativeType("struct FT_SizeRec") +public class FT_Size extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FACE, + GENERIC, + METRICS, + INTERNAL; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(FT_Generic.SIZEOF, FT_Generic.ALIGNOF), + __member(FT_Size_Metrics.SIZEOF, FT_Size_Metrics.ALIGNOF), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FACE = layout.offsetof(0); + GENERIC = layout.offsetof(1); + METRICS = layout.offsetof(2); + INTERNAL = layout.offsetof(3); + } + + protected FT_Size(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Size create(long address, @Nullable ByteBuffer container) { + return new FT_Size(address, container); + } + + /** + * Creates a {@code FT_Size} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Size(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** parent face object */ + public FT_Face face() { return nface(address()); } + /** generic pointer for client uses */ + public FT_Generic generic() { return ngeneric(address()); } + /** size metrics */ + public FT_Size_Metrics metrics() { return nmetrics(address()); } + + /** Sets the address of the specified {@link FT_Face} to the {@link #face} field. */ + public FT_Size face(FT_Face value) { nface(address(), value); return this; } + /** Copies the specified {@link FT_Generic} to the {@link #generic} field. */ + public FT_Size generic(FT_Generic value) { ngeneric(address(), value); return this; } + /** Passes the {@link #generic} field to the specified {@link java.util.function.Consumer Consumer}. */ + public FT_Size generic(java.util.function.Consumer consumer) { consumer.accept(generic()); return this; } + /** Copies the specified {@link FT_Size_Metrics} to the {@link #metrics} field. */ + public FT_Size metrics(FT_Size_Metrics value) { nmetrics(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Size set( + FT_Face face, + FT_Generic generic, + FT_Size_Metrics metrics + ) { + face(face); + generic(generic); + metrics(metrics); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Size set(FT_Size src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Size} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Size malloc() { + return new FT_Size(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Size} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Size calloc() { + return new FT_Size(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Size} instance allocated with {@link BufferUtils}. */ + public static FT_Size create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Size(memAddress(container), container); + } + + /** Returns a new {@code FT_Size} instance for the specified memory address. */ + public static FT_Size create(long address) { + return new FT_Size(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Size createSafe(long address) { + return address == NULL ? null : new FT_Size(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Size} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Size malloc(MemoryStack stack) { + return new FT_Size(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Size} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Size calloc(MemoryStack stack) { + return new FT_Size(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #face}. */ + public static FT_Face nface(long struct) { return FT_Face.create(memGetAddress(struct + FT_Size.FACE)); } + /** Unsafe version of {@link #generic}. */ + public static FT_Generic ngeneric(long struct) { return FT_Generic.create(struct + FT_Size.GENERIC); } + /** Unsafe version of {@link #metrics}. */ + public static FT_Size_Metrics nmetrics(long struct) { return FT_Size_Metrics.create(struct + FT_Size.METRICS); } + public static FT_Size_Internal ninternal(long struct) { return FT_Size_Internal.create(memGetAddress(struct + FT_Size.INTERNAL)); } + + /** Unsafe version of {@link #face(FT_Face) face}. */ + public static void nface(long struct, FT_Face value) { memPutAddress(struct + FT_Size.FACE, value.address()); } + /** Unsafe version of {@link #generic(FT_Generic) generic}. */ + public static void ngeneric(long struct, FT_Generic value) { memCopy(value.address(), struct + FT_Size.GENERIC, FT_Generic.SIZEOF); } + /** Unsafe version of {@link #metrics(FT_Size_Metrics) metrics}. */ + public static void nmetrics(long struct, FT_Size_Metrics value) { memCopy(value.address(), struct + FT_Size.METRICS, FT_Size_Metrics.SIZEOF); } + public static void ninternal(long struct, FT_Size_Internal value) { memPutAddress(struct + FT_Size.INTERNAL, value.address()); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + FT_Size.FACE)); + FT_Generic.validate(struct + FT_Size.GENERIC); + } + + // ----------------------------------- + + /** An array of {@link FT_Size} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Size ELEMENT_FACTORY = FT_Size.create(-1L); + + /** + * Creates a new {@code FT_Size.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Size#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Size getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_Face} view of the struct pointed to by the {@link FT_Size#face} field. */ + public FT_Face face() { return FT_Size.nface(address()); } + /** @return a {@link FT_Generic} view of the {@link FT_Size#generic} field. */ + public FT_Generic generic() { return FT_Size.ngeneric(address()); } + /** @return a {@link FT_Size_Metrics} view of the {@link FT_Size#metrics} field. */ + public FT_Size_Metrics metrics() { return FT_Size.nmetrics(address()); } + + /** Sets the address of the specified {@link FT_Face} to the {@link FT_Size#face} field. */ + public Buffer face(FT_Face value) { FT_Size.nface(address(), value); return this; } + /** Copies the specified {@link FT_Generic} to the {@link FT_Size#generic} field. */ + public Buffer generic(FT_Generic value) { FT_Size.ngeneric(address(), value); return this; } + /** Passes the {@link FT_Size#generic} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer generic(java.util.function.Consumer consumer) { consumer.accept(generic()); return this; } + /** Copies the specified {@link FT_Size_Metrics} to the {@link FT_Size#metrics} field. */ + public Buffer metrics(FT_Size_Metrics value) { FT_Size.nmetrics(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Internal.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Internal.java new file mode 100644 index 000000000..922b88c06 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Internal.java @@ -0,0 +1,173 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Layout

    + * + *
    
    + * struct FT_Size_Internal {
    + *     void * module_data;
    + *     FT_Render_Mode autohint_mode;
    + *     {@link FT_Size_Metrics FT_Size_Metrics} autohint_metrics;
    + * }
    + */ +public class FT_Size_Internal extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + MODULE_DATA, + AUTOHINT_MODE, + AUTOHINT_METRICS; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4), + __member(FT_Size_Metrics.SIZEOF, FT_Size_Metrics.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + MODULE_DATA = layout.offsetof(0); + AUTOHINT_MODE = layout.offsetof(1); + AUTOHINT_METRICS = layout.offsetof(2); + } + + protected FT_Size_Internal(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Size_Internal create(long address, @Nullable ByteBuffer container) { + return new FT_Size_Internal(address, container); + } + + /** + * Creates a {@code FT_Size_Internal} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Size_Internal(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code module_data} field. */ + @NativeType("void *") + public long module_data() { return nmodule_data(address()); } + /** @return the value of the {@code autohint_mode} field. */ + @NativeType("FT_Render_Mode") + public int autohint_mode() { return nautohint_mode(address()); } + /** @return a {@link FT_Size_Metrics} view of the {@code autohint_metrics} field. */ + public FT_Size_Metrics autohint_metrics() { return nautohint_metrics(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Size_Internal} instance for the specified memory address. */ + public static FT_Size_Internal create(long address) { + return new FT_Size_Internal(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Size_Internal createSafe(long address) { + return address == NULL ? null : new FT_Size_Internal(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #module_data}. */ + public static long nmodule_data(long struct) { return memGetAddress(struct + FT_Size_Internal.MODULE_DATA); } + /** Unsafe version of {@link #autohint_mode}. */ + public static int nautohint_mode(long struct) { return UNSAFE.getInt(null, struct + FT_Size_Internal.AUTOHINT_MODE); } + /** Unsafe version of {@link #autohint_metrics}. */ + public static FT_Size_Metrics nautohint_metrics(long struct) { return FT_Size_Metrics.create(struct + FT_Size_Internal.AUTOHINT_METRICS); } + + // ----------------------------------- + + /** An array of {@link FT_Size_Internal} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Size_Internal ELEMENT_FACTORY = FT_Size_Internal.create(-1L); + + /** + * Creates a new {@code FT_Size_Internal.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Size_Internal#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Size_Internal getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code module_data} field. */ + @NativeType("void *") + public long module_data() { return FT_Size_Internal.nmodule_data(address()); } + /** @return the value of the {@code autohint_mode} field. */ + @NativeType("FT_Render_Mode") + public int autohint_mode() { return FT_Size_Internal.nautohint_mode(address()); } + /** @return a {@link FT_Size_Metrics} view of the {@code autohint_metrics} field. */ + public FT_Size_Metrics autohint_metrics() { return FT_Size_Internal.nautohint_metrics(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Metrics.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Metrics.java new file mode 100644 index 000000000..5317bf629 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Metrics.java @@ -0,0 +1,237 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The size metrics structure gives the metrics of a size object. + * + *

    Layout

    + * + *
    
    + * struct FT_Size_Metrics {
    + *     FT_UShort {@link #x_ppem};
    + *     FT_UShort {@link #y_ppem};
    + *     FT_Fixed {@link #x_scale};
    + *     FT_Fixed {@link #y_scale};
    + *     FT_Pos {@link #ascender};
    + *     FT_Pos {@link #descender};
    + *     FT_Pos {@link #height};
    + *     FT_Pos {@link #max_advance};
    + * }
    + */ +public class FT_Size_Metrics extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X_PPEM, + Y_PPEM, + X_SCALE, + Y_SCALE, + ASCENDER, + DESCENDER, + HEIGHT, + MAX_ADVANCE; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X_PPEM = layout.offsetof(0); + Y_PPEM = layout.offsetof(1); + X_SCALE = layout.offsetof(2); + Y_SCALE = layout.offsetof(3); + ASCENDER = layout.offsetof(4); + DESCENDER = layout.offsetof(5); + HEIGHT = layout.offsetof(6); + MAX_ADVANCE = layout.offsetof(7); + } + + protected FT_Size_Metrics(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Size_Metrics create(long address, @Nullable ByteBuffer container) { + return new FT_Size_Metrics(address, container); + } + + /** + * Creates a {@code FT_Size_Metrics} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Size_Metrics(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** horizontal pixels per EM */ + @NativeType("FT_UShort") + public short x_ppem() { return nx_ppem(address()); } + /** vertical pixels per EM */ + @NativeType("FT_UShort") + public short y_ppem() { return ny_ppem(address()); } + /** scaling values used to convert font */ + @NativeType("FT_Fixed") + public long x_scale() { return nx_scale(address()); } + /** units to 26.6 fractional pixels */ + @NativeType("FT_Fixed") + public long y_scale() { return ny_scale(address()); } + /** ascender in 26.6 frac. pixels */ + @NativeType("FT_Pos") + public long ascender() { return nascender(address()); } + /** descender in 26.6 frac. pixels */ + @NativeType("FT_Pos") + public long descender() { return ndescender(address()); } + /** text height in 26.6 frac. pixels */ + @NativeType("FT_Pos") + public long height() { return nheight(address()); } + /** max horizontal advance, in 26.6 pixels */ + @NativeType("FT_Pos") + public long max_advance() { return nmax_advance(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Size_Metrics} instance for the specified memory address. */ + public static FT_Size_Metrics create(long address) { + return new FT_Size_Metrics(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Size_Metrics createSafe(long address) { + return address == NULL ? null : new FT_Size_Metrics(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x_ppem}. */ + public static short nx_ppem(long struct) { return UNSAFE.getShort(null, struct + FT_Size_Metrics.X_PPEM); } + /** Unsafe version of {@link #y_ppem}. */ + public static short ny_ppem(long struct) { return UNSAFE.getShort(null, struct + FT_Size_Metrics.Y_PPEM); } + /** Unsafe version of {@link #x_scale}. */ + public static long nx_scale(long struct) { return memGetCLong(struct + FT_Size_Metrics.X_SCALE); } + /** Unsafe version of {@link #y_scale}. */ + public static long ny_scale(long struct) { return memGetCLong(struct + FT_Size_Metrics.Y_SCALE); } + /** Unsafe version of {@link #ascender}. */ + public static long nascender(long struct) { return memGetCLong(struct + FT_Size_Metrics.ASCENDER); } + /** Unsafe version of {@link #descender}. */ + public static long ndescender(long struct) { return memGetCLong(struct + FT_Size_Metrics.DESCENDER); } + /** Unsafe version of {@link #height}. */ + public static long nheight(long struct) { return memGetCLong(struct + FT_Size_Metrics.HEIGHT); } + /** Unsafe version of {@link #max_advance}. */ + public static long nmax_advance(long struct) { return memGetCLong(struct + FT_Size_Metrics.MAX_ADVANCE); } + + // ----------------------------------- + + /** An array of {@link FT_Size_Metrics} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Size_Metrics ELEMENT_FACTORY = FT_Size_Metrics.create(-1L); + + /** + * Creates a new {@code FT_Size_Metrics.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Size_Metrics#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Size_Metrics getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@link FT_Size_Metrics#x_ppem} field. */ + @NativeType("FT_UShort") + public short x_ppem() { return FT_Size_Metrics.nx_ppem(address()); } + /** @return the value of the {@link FT_Size_Metrics#y_ppem} field. */ + @NativeType("FT_UShort") + public short y_ppem() { return FT_Size_Metrics.ny_ppem(address()); } + /** @return the value of the {@link FT_Size_Metrics#x_scale} field. */ + @NativeType("FT_Fixed") + public long x_scale() { return FT_Size_Metrics.nx_scale(address()); } + /** @return the value of the {@link FT_Size_Metrics#y_scale} field. */ + @NativeType("FT_Fixed") + public long y_scale() { return FT_Size_Metrics.ny_scale(address()); } + /** @return the value of the {@link FT_Size_Metrics#ascender} field. */ + @NativeType("FT_Pos") + public long ascender() { return FT_Size_Metrics.nascender(address()); } + /** @return the value of the {@link FT_Size_Metrics#descender} field. */ + @NativeType("FT_Pos") + public long descender() { return FT_Size_Metrics.ndescender(address()); } + /** @return the value of the {@link FT_Size_Metrics#height} field. */ + @NativeType("FT_Pos") + public long height() { return FT_Size_Metrics.nheight(address()); } + /** @return the value of the {@link FT_Size_Metrics#max_advance} field. */ + @NativeType("FT_Pos") + public long max_advance() { return FT_Size_Metrics.nmax_advance(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Request.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Request.java new file mode 100644 index 000000000..6b98a129e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Size_Request.java @@ -0,0 +1,348 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure to model a size request. + * + *

    Layout

    + * + *
    
    + * struct FT_Size_RequestRec {
    + *     FT_Size_Request_Type type;
    + *     FT_Long width;
    + *     FT_Long height;
    + *     FT_UInt horiResolution;
    + *     FT_UInt vertResolution;
    + * }
    + */ +@NativeType("struct FT_Size_RequestRec") +public class FT_Size_Request extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TYPE, + WIDTH, + HEIGHT, + HORIRESOLUTION, + VERTRESOLUTION; + + static { + Layout layout = __struct( + __member(4), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TYPE = layout.offsetof(0); + WIDTH = layout.offsetof(1); + HEIGHT = layout.offsetof(2); + HORIRESOLUTION = layout.offsetof(3); + VERTRESOLUTION = layout.offsetof(4); + } + + protected FT_Size_Request(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Size_Request create(long address, @Nullable ByteBuffer container) { + return new FT_Size_Request(address, container); + } + + /** + * Creates a {@code FT_Size_Request} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Size_Request(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code type} field. */ + @NativeType("FT_Size_Request_Type") + public int type() { return ntype(address()); } + /** @return the value of the {@code width} field. */ + @NativeType("FT_Long") + public long width() { return nwidth(address()); } + /** @return the value of the {@code height} field. */ + @NativeType("FT_Long") + public long height() { return nheight(address()); } + /** @return the value of the {@code horiResolution} field. */ + @NativeType("FT_UInt") + public int horiResolution() { return nhoriResolution(address()); } + /** @return the value of the {@code vertResolution} field. */ + @NativeType("FT_UInt") + public int vertResolution() { return nvertResolution(address()); } + + /** Sets the specified value to the {@code type} field. */ + public FT_Size_Request type(@NativeType("FT_Size_Request_Type") int value) { ntype(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public FT_Size_Request width(@NativeType("FT_Long") long value) { nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public FT_Size_Request height(@NativeType("FT_Long") long value) { nheight(address(), value); return this; } + /** Sets the specified value to the {@code horiResolution} field. */ + public FT_Size_Request horiResolution(@NativeType("FT_UInt") int value) { nhoriResolution(address(), value); return this; } + /** Sets the specified value to the {@code vertResolution} field. */ + public FT_Size_Request vertResolution(@NativeType("FT_UInt") int value) { nvertResolution(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Size_Request set( + int type, + long width, + long height, + int horiResolution, + int vertResolution + ) { + type(type); + width(width); + height(height); + horiResolution(horiResolution); + vertResolution(vertResolution); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Size_Request set(FT_Size_Request src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Size_Request} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Size_Request malloc() { + return new FT_Size_Request(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Size_Request} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Size_Request calloc() { + return new FT_Size_Request(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Size_Request} instance allocated with {@link BufferUtils}. */ + public static FT_Size_Request create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Size_Request(memAddress(container), container); + } + + /** Returns a new {@code FT_Size_Request} instance for the specified memory address. */ + public static FT_Size_Request create(long address) { + return new FT_Size_Request(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Size_Request createSafe(long address) { + return address == NULL ? null : new FT_Size_Request(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Size_Request} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Size_Request malloc(MemoryStack stack) { + return new FT_Size_Request(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Size_Request} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Size_Request calloc(MemoryStack stack) { + return new FT_Size_Request(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #type}. */ + public static int ntype(long struct) { return UNSAFE.getInt(null, struct + FT_Size_Request.TYPE); } + /** Unsafe version of {@link #width}. */ + public static long nwidth(long struct) { return memGetCLong(struct + FT_Size_Request.WIDTH); } + /** Unsafe version of {@link #height}. */ + public static long nheight(long struct) { return memGetCLong(struct + FT_Size_Request.HEIGHT); } + /** Unsafe version of {@link #horiResolution}. */ + public static int nhoriResolution(long struct) { return UNSAFE.getInt(null, struct + FT_Size_Request.HORIRESOLUTION); } + /** Unsafe version of {@link #vertResolution}. */ + public static int nvertResolution(long struct) { return UNSAFE.getInt(null, struct + FT_Size_Request.VERTRESOLUTION); } + + /** Unsafe version of {@link #type(int) type}. */ + public static void ntype(long struct, int value) { UNSAFE.putInt(null, struct + FT_Size_Request.TYPE, value); } + /** Unsafe version of {@link #width(long) width}. */ + public static void nwidth(long struct, long value) { memPutCLong(struct + FT_Size_Request.WIDTH, value); } + /** Unsafe version of {@link #height(long) height}. */ + public static void nheight(long struct, long value) { memPutCLong(struct + FT_Size_Request.HEIGHT, value); } + /** Unsafe version of {@link #horiResolution(int) horiResolution}. */ + public static void nhoriResolution(long struct, int value) { UNSAFE.putInt(null, struct + FT_Size_Request.HORIRESOLUTION, value); } + /** Unsafe version of {@link #vertResolution(int) vertResolution}. */ + public static void nvertResolution(long struct, int value) { UNSAFE.putInt(null, struct + FT_Size_Request.VERTRESOLUTION, value); } + + // ----------------------------------- + + /** An array of {@link FT_Size_Request} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Size_Request ELEMENT_FACTORY = FT_Size_Request.create(-1L); + + /** + * Creates a new {@code FT_Size_Request.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Size_Request#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Size_Request getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code type} field. */ + @NativeType("FT_Size_Request_Type") + public int type() { return FT_Size_Request.ntype(address()); } + /** @return the value of the {@code width} field. */ + @NativeType("FT_Long") + public long width() { return FT_Size_Request.nwidth(address()); } + /** @return the value of the {@code height} field. */ + @NativeType("FT_Long") + public long height() { return FT_Size_Request.nheight(address()); } + /** @return the value of the {@code horiResolution} field. */ + @NativeType("FT_UInt") + public int horiResolution() { return FT_Size_Request.nhoriResolution(address()); } + /** @return the value of the {@code vertResolution} field. */ + @NativeType("FT_UInt") + public int vertResolution() { return FT_Size_Request.nvertResolution(address()); } + + /** Sets the specified value to the {@code type} field. */ + public Buffer type(@NativeType("FT_Size_Request_Type") int value) { FT_Size_Request.ntype(address(), value); return this; } + /** Sets the specified value to the {@code width} field. */ + public Buffer width(@NativeType("FT_Long") long value) { FT_Size_Request.nwidth(address(), value); return this; } + /** Sets the specified value to the {@code height} field. */ + public Buffer height(@NativeType("FT_Long") long value) { FT_Size_Request.nheight(address(), value); return this; } + /** Sets the specified value to the {@code horiResolution} field. */ + public Buffer horiResolution(@NativeType("FT_UInt") int value) { FT_Size_Request.nhoriResolution(address(), value); return this; } + /** Sets the specified value to the {@code vertResolution} field. */ + public Buffer vertResolution(@NativeType("FT_UInt") int value) { FT_Size_Request.nvertResolution(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Span.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Span.java new file mode 100644 index 000000000..625e57e84 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Span.java @@ -0,0 +1,175 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure to model a single span of consecutive pixels when rendering an anti-aliased bitmap. + * + *

    Layout

    + * + *
    
    + * struct FT_Span {
    + *     short x;
    + *     unsigned short len;
    + *     unsigned char coverage;
    + * }
    + */ +public class FT_Span extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X, + LEN, + COVERAGE; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(1) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X = layout.offsetof(0); + LEN = layout.offsetof(1); + COVERAGE = layout.offsetof(2); + } + + protected FT_Span(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Span create(long address, @Nullable ByteBuffer container) { + return new FT_Span(address, container); + } + + /** + * Creates a {@code FT_Span} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Span(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code x} field. */ + public short x() { return nx(address()); } + /** @return the value of the {@code len} field. */ + @NativeType("unsigned short") + public short len() { return nlen(address()); } + /** @return the value of the {@code coverage} field. */ + @NativeType("unsigned char") + public byte coverage() { return ncoverage(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Span} instance for the specified memory address. */ + public static FT_Span create(long address) { + return new FT_Span(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Span createSafe(long address) { + return address == NULL ? null : new FT_Span(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x}. */ + public static short nx(long struct) { return UNSAFE.getShort(null, struct + FT_Span.X); } + /** Unsafe version of {@link #len}. */ + public static short nlen(long struct) { return UNSAFE.getShort(null, struct + FT_Span.LEN); } + /** Unsafe version of {@link #coverage}. */ + public static byte ncoverage(long struct) { return UNSAFE.getByte(null, struct + FT_Span.COVERAGE); } + + // ----------------------------------- + + /** An array of {@link FT_Span} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Span ELEMENT_FACTORY = FT_Span.create(-1L); + + /** + * Creates a new {@code FT_Span.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Span#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Span getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code x} field. */ + public short x() { return FT_Span.nx(address()); } + /** @return the value of the {@code len} field. */ + @NativeType("unsigned short") + public short len() { return FT_Span.nlen(address()); } + /** @return the value of the {@code coverage} field. */ + @NativeType("unsigned char") + public byte coverage() { return FT_Span.ncoverage(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SpanFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SpanFunc.java new file mode 100644 index 000000000..708a1deae --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SpanFunc.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     int y,
    + *     int count,
    + *     FT_Span const *spans,
    + *     void *user
    + * )
    + */ +public abstract class FT_SpanFunc extends Callback implements FT_SpanFuncI { + + /** + * Creates a {@code FT_SpanFunc} instance from the specified function pointer. + * + * @return the new {@code FT_SpanFunc} + */ + public static FT_SpanFunc create(long functionPointer) { + FT_SpanFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_SpanFunc + ? (FT_SpanFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_SpanFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_SpanFunc} instance that delegates to the specified {@code FT_SpanFuncI} instance. */ + public static FT_SpanFunc create(FT_SpanFuncI instance) { + return instance instanceof FT_SpanFunc + ? (FT_SpanFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_SpanFunc() { + super(CIF); + } + + FT_SpanFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_SpanFunc { + + private final FT_SpanFuncI delegate; + + Container(long functionPointer, FT_SpanFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(int y, int count, long spans, long user) { + delegate.invoke(y, count, spans, user); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SpanFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SpanFuncI.java new file mode 100644 index 000000000..37a84bf6b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SpanFuncI.java @@ -0,0 +1,52 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     int y,
    + *     int count,
    + *     FT_Span const *spans,
    + *     void *user
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_SpanFunc") +public interface FT_SpanFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_sint32, ffi_type_sint32, ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetInt(memGetAddress(args)), + memGetInt(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetAddress(memGetAddress(args + 3 * POINTER_SIZE)) + ); + } + + /** A function used as a call-back by the anti-aliased renderer in order to let client applications draw themselves the pixel spans on each scan line. */ + void invoke(int y, int count, @NativeType("FT_Span const *") long spans, @NativeType("void *") long user); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream.java new file mode 100644 index 000000000..3ca7208bf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream.java @@ -0,0 +1,412 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure used to describe an input stream. + * + *

    Layout

    + * + *
    
    + * struct FT_StreamRec {
    + *     unsigned char * base;
    + *     unsigned long size;
    + *     unsigned long pos;
    + *     {@link FT_StreamDesc FT_StreamDesc} descriptor;
    + *     {@link FT_StreamDesc FT_StreamDesc} pathname;
    + *     {@link FT_Stream_IoFuncI FT_Stream_IoFunc} read;
    + *     {@link FT_Stream_CloseFuncI FT_Stream_CloseFunc} close;
    + *     FT_Memory memory;
    + *     unsigned char * cursor;
    + *     unsigned char * limit;
    + * }
    + */ +@NativeType("struct FT_StreamRec") +public class FT_Stream extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + BASE, + SIZE, + POS, + DESCRIPTOR, + PATHNAME, + READ, + CLOSE, + MEMORY, + CURSOR, + LIMIT; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(FT_StreamDesc.SIZEOF, FT_StreamDesc.ALIGNOF), + __member(FT_StreamDesc.SIZEOF, FT_StreamDesc.ALIGNOF), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + BASE = layout.offsetof(0); + SIZE = layout.offsetof(1); + POS = layout.offsetof(2); + DESCRIPTOR = layout.offsetof(3); + PATHNAME = layout.offsetof(4); + READ = layout.offsetof(5); + CLOSE = layout.offsetof(6); + MEMORY = layout.offsetof(7); + CURSOR = layout.offsetof(8); + LIMIT = layout.offsetof(9); + } + + protected FT_Stream(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Stream create(long address, @Nullable ByteBuffer container) { + return new FT_Stream(address, container); + } + + /** + * Creates a {@code FT_Stream} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Stream(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code base} field. */ + @Nullable + @NativeType("unsigned char *") + public ByteBuffer base() { return nbase(address()); } + /** @return the value of the {@code size} field. */ + @NativeType("unsigned long") + public long size() { return nsize(address()); } + /** @return the value of the {@code pos} field. */ + @NativeType("unsigned long") + public long pos() { return npos(address()); } + /** @return a {@link FT_StreamDesc} view of the {@code descriptor} field. */ + public FT_StreamDesc descriptor() { return ndescriptor(address()); } + /** @return a {@link FT_StreamDesc} view of the {@code pathname} field. */ + public FT_StreamDesc pathname() { return npathname(address()); } + /** @return the value of the {@code read} field. */ + @Nullable + public FT_Stream_IoFunc read() { return nread(address()); } + /** @return the value of the {@code close} field. */ + @Nullable + public FT_Stream_CloseFunc close$() { return nclose$(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@code base} field. */ + public FT_Stream base(@Nullable @NativeType("unsigned char *") ByteBuffer value) { nbase(address(), value); return this; } + /** Sets the specified value to the {@code size} field. */ + public FT_Stream size(@NativeType("unsigned long") long value) { nsize(address(), value); return this; } + /** Sets the specified value to the {@code pos} field. */ + public FT_Stream pos(@NativeType("unsigned long") long value) { npos(address(), value); return this; } + /** Copies the specified {@link FT_StreamDesc} to the {@code descriptor} field. */ + public FT_Stream descriptor(FT_StreamDesc value) { ndescriptor(address(), value); return this; } + /** Passes the {@code descriptor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public FT_Stream descriptor(java.util.function.Consumer consumer) { consumer.accept(descriptor()); return this; } + /** Copies the specified {@link FT_StreamDesc} to the {@code pathname} field. */ + public FT_Stream pathname(FT_StreamDesc value) { npathname(address(), value); return this; } + /** Passes the {@code pathname} field to the specified {@link java.util.function.Consumer Consumer}. */ + public FT_Stream pathname(java.util.function.Consumer consumer) { consumer.accept(pathname()); return this; } + /** Sets the specified value to the {@code read} field. */ + public FT_Stream read(@Nullable @NativeType("FT_Stream_IoFunc") FT_Stream_IoFuncI value) { nread(address(), value); return this; } + /** Sets the specified value to the {@code close} field. */ + public FT_Stream close$(@Nullable @NativeType("FT_Stream_CloseFunc") FT_Stream_CloseFuncI value) { nclose$(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Stream set( + @Nullable ByteBuffer base, + long size, + long pos, + FT_StreamDesc descriptor, + FT_StreamDesc pathname, + @Nullable FT_Stream_IoFuncI read, + @Nullable FT_Stream_CloseFuncI close$ + ) { + base(base); + size(size); + pos(pos); + descriptor(descriptor); + pathname(pathname); + read(read); + close$(close$); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Stream set(FT_Stream src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Stream} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Stream malloc() { + return new FT_Stream(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Stream} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Stream calloc() { + return new FT_Stream(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Stream} instance allocated with {@link BufferUtils}. */ + public static FT_Stream create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Stream(memAddress(container), container); + } + + /** Returns a new {@code FT_Stream} instance for the specified memory address. */ + public static FT_Stream create(long address) { + return new FT_Stream(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Stream createSafe(long address) { + return address == NULL ? null : new FT_Stream(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Stream} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Stream malloc(MemoryStack stack) { + return new FT_Stream(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Stream} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Stream calloc(MemoryStack stack) { + return new FT_Stream(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #base() base}. */ + @Nullable public static ByteBuffer nbase(long struct) { return memByteBufferSafe(memGetAddress(struct + FT_Stream.BASE), (int)nsize(struct)); } + /** Unsafe version of {@link #size}. */ + public static long nsize(long struct) { return memGetCLong(struct + FT_Stream.SIZE); } + /** Unsafe version of {@link #pos}. */ + public static long npos(long struct) { return memGetCLong(struct + FT_Stream.POS); } + /** Unsafe version of {@link #descriptor}. */ + public static FT_StreamDesc ndescriptor(long struct) { return FT_StreamDesc.create(struct + FT_Stream.DESCRIPTOR); } + /** Unsafe version of {@link #pathname}. */ + public static FT_StreamDesc npathname(long struct) { return FT_StreamDesc.create(struct + FT_Stream.PATHNAME); } + /** Unsafe version of {@link #read}. */ + @Nullable public static FT_Stream_IoFunc nread(long struct) { return FT_Stream_IoFunc.createSafe(memGetAddress(struct + FT_Stream.READ)); } + /** Unsafe version of {@link #close$}. */ + @Nullable public static FT_Stream_CloseFunc nclose$(long struct) { return FT_Stream_CloseFunc.createSafe(memGetAddress(struct + FT_Stream.CLOSE)); } + @Nullable public static FT_Memory nmemory(long struct) { return FT_Memory.createSafe(memGetAddress(struct + FT_Stream.MEMORY)); } + @Nullable public static ByteBuffer ncursor(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + FT_Stream.CURSOR), capacity); } + @Nullable public static ByteBuffer nlimit$(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + FT_Stream.LIMIT), capacity); } + + /** Unsafe version of {@link #base(ByteBuffer) base}. */ + public static void nbase(long struct, @Nullable ByteBuffer value) { memPutAddress(struct + FT_Stream.BASE, memAddressSafe(value)); nsize(struct, value == null ? 0 : value.remaining()); } + /** Sets the specified value to the {@code size} field of the specified {@code struct}. */ + public static void nsize(long struct, long value) { memPutCLong(struct + FT_Stream.SIZE, value); } + /** Unsafe version of {@link #pos(long) pos}. */ + public static void npos(long struct, long value) { memPutCLong(struct + FT_Stream.POS, value); } + /** Unsafe version of {@link #descriptor(FT_StreamDesc) descriptor}. */ + public static void ndescriptor(long struct, FT_StreamDesc value) { memCopy(value.address(), struct + FT_Stream.DESCRIPTOR, FT_StreamDesc.SIZEOF); } + /** Unsafe version of {@link #pathname(FT_StreamDesc) pathname}. */ + public static void npathname(long struct, FT_StreamDesc value) { memCopy(value.address(), struct + FT_Stream.PATHNAME, FT_StreamDesc.SIZEOF); } + /** Unsafe version of {@link #read(FT_Stream_IoFuncI) read}. */ + public static void nread(long struct, @Nullable FT_Stream_IoFuncI value) { memPutAddress(struct + FT_Stream.READ, memAddressSafe(value)); } + /** Unsafe version of {@link #close$(FT_Stream_CloseFuncI) close$}. */ + public static void nclose$(long struct, @Nullable FT_Stream_CloseFuncI value) { memPutAddress(struct + FT_Stream.CLOSE, memAddressSafe(value)); } + public static void nmemory(long struct, @Nullable FT_Memory value) { memPutAddress(struct + FT_Stream.MEMORY, memAddressSafe(value)); } + public static void ncursor(long struct, @Nullable ByteBuffer value) { memPutAddress(struct + FT_Stream.CURSOR, memAddressSafe(value)); } + public static void nlimit$(long struct, @Nullable ByteBuffer value) { memPutAddress(struct + FT_Stream.LIMIT, memAddressSafe(value)); } + + // ----------------------------------- + + /** An array of {@link FT_Stream} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Stream ELEMENT_FACTORY = FT_Stream.create(-1L); + + /** + * Creates a new {@code FT_Stream.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Stream#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Stream getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code base} field. */ + @Nullable + @NativeType("unsigned char *") + public ByteBuffer base() { return FT_Stream.nbase(address()); } + /** @return the value of the {@code size} field. */ + @NativeType("unsigned long") + public long size() { return FT_Stream.nsize(address()); } + /** @return the value of the {@code pos} field. */ + @NativeType("unsigned long") + public long pos() { return FT_Stream.npos(address()); } + /** @return a {@link FT_StreamDesc} view of the {@code descriptor} field. */ + public FT_StreamDesc descriptor() { return FT_Stream.ndescriptor(address()); } + /** @return a {@link FT_StreamDesc} view of the {@code pathname} field. */ + public FT_StreamDesc pathname() { return FT_Stream.npathname(address()); } + /** @return the value of the {@code read} field. */ + @Nullable + public FT_Stream_IoFunc read() { return FT_Stream.nread(address()); } + /** @return the value of the {@code close} field. */ + @Nullable + public FT_Stream_CloseFunc close$() { return FT_Stream.nclose$(address()); } + + /** Sets the address of the specified {@link ByteBuffer} to the {@code base} field. */ + public Buffer base(@Nullable @NativeType("unsigned char *") ByteBuffer value) { FT_Stream.nbase(address(), value); return this; } + /** Sets the specified value to the {@code size} field. */ + public Buffer size(@NativeType("unsigned long") long value) { FT_Stream.nsize(address(), value); return this; } + /** Sets the specified value to the {@code pos} field. */ + public Buffer pos(@NativeType("unsigned long") long value) { FT_Stream.npos(address(), value); return this; } + /** Copies the specified {@link FT_StreamDesc} to the {@code descriptor} field. */ + public Buffer descriptor(FT_StreamDesc value) { FT_Stream.ndescriptor(address(), value); return this; } + /** Passes the {@code descriptor} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer descriptor(java.util.function.Consumer consumer) { consumer.accept(descriptor()); return this; } + /** Copies the specified {@link FT_StreamDesc} to the {@code pathname} field. */ + public Buffer pathname(FT_StreamDesc value) { FT_Stream.npathname(address(), value); return this; } + /** Passes the {@code pathname} field to the specified {@link java.util.function.Consumer Consumer}. */ + public Buffer pathname(java.util.function.Consumer consumer) { consumer.accept(pathname()); return this; } + /** Sets the specified value to the {@code read} field. */ + public Buffer read(@Nullable @NativeType("FT_Stream_IoFunc") FT_Stream_IoFuncI value) { FT_Stream.nread(address(), value); return this; } + /** Sets the specified value to the {@code close} field. */ + public Buffer close$(@Nullable @NativeType("FT_Stream_CloseFunc") FT_Stream_CloseFuncI value) { FT_Stream.nclose$(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_StreamDesc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_StreamDesc.java new file mode 100644 index 000000000..8065aa54e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_StreamDesc.java @@ -0,0 +1,274 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A union type used to store either a long or a pointer. This is used to store a file descriptor or a {@code FILE*} in an input stream. + * + *

    Layout

    + * + *
    
    + * union FT_StreamDesc {
    + *     long value;
    + *     void * pointer;
    + * }
    + */ +public class FT_StreamDesc extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + VALUE, + POINTER; + + static { + Layout layout = __union( + __member(CLONG_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + VALUE = layout.offsetof(0); + POINTER = layout.offsetof(1); + } + + protected FT_StreamDesc(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_StreamDesc create(long address, @Nullable ByteBuffer container) { + return new FT_StreamDesc(address, container); + } + + /** + * Creates a {@code FT_StreamDesc} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_StreamDesc(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code value} field. */ + public long value() { return nvalue(address()); } + /** @return the value of the {@code pointer} field. */ + @NativeType("void *") + public long pointer() { return npointer(address()); } + + /** Sets the specified value to the {@code value} field. */ + public FT_StreamDesc value(long value) { nvalue(address(), value); return this; } + /** Sets the specified value to the {@code pointer} field. */ + public FT_StreamDesc pointer(@NativeType("void *") long value) { npointer(address(), value); return this; } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_StreamDesc set(FT_StreamDesc src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_StreamDesc} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_StreamDesc malloc() { + return new FT_StreamDesc(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_StreamDesc} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_StreamDesc calloc() { + return new FT_StreamDesc(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_StreamDesc} instance allocated with {@link BufferUtils}. */ + public static FT_StreamDesc create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_StreamDesc(memAddress(container), container); + } + + /** Returns a new {@code FT_StreamDesc} instance for the specified memory address. */ + public static FT_StreamDesc create(long address) { + return new FT_StreamDesc(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_StreamDesc createSafe(long address) { + return address == NULL ? null : new FT_StreamDesc(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_StreamDesc} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_StreamDesc malloc(MemoryStack stack) { + return new FT_StreamDesc(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_StreamDesc} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_StreamDesc calloc(MemoryStack stack) { + return new FT_StreamDesc(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #value}. */ + public static long nvalue(long struct) { return memGetCLong(struct + FT_StreamDesc.VALUE); } + /** Unsafe version of {@link #pointer}. */ + public static long npointer(long struct) { return memGetAddress(struct + FT_StreamDesc.POINTER); } + + /** Unsafe version of {@link #value(long) value}. */ + public static void nvalue(long struct, long value) { memPutCLong(struct + FT_StreamDesc.VALUE, value); } + /** Unsafe version of {@link #pointer(long) pointer}. */ + public static void npointer(long struct, long value) { memPutAddress(struct + FT_StreamDesc.POINTER, value); } + + // ----------------------------------- + + /** An array of {@link FT_StreamDesc} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_StreamDesc ELEMENT_FACTORY = FT_StreamDesc.create(-1L); + + /** + * Creates a new {@code FT_StreamDesc.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_StreamDesc#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_StreamDesc getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code value} field. */ + public long value() { return FT_StreamDesc.nvalue(address()); } + /** @return the value of the {@code pointer} field. */ + @NativeType("void *") + public long pointer() { return FT_StreamDesc.npointer(address()); } + + /** Sets the specified value to the {@code value} field. */ + public Buffer value(long value) { FT_StreamDesc.nvalue(address(), value); return this; } + /** Sets the specified value to the {@code pointer} field. */ + public Buffer pointer(@NativeType("void *") long value) { FT_StreamDesc.npointer(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_CloseFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_CloseFunc.java new file mode 100644 index 000000000..d683aac62 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_CloseFunc.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Stream stream
    + * )
    + */ +public abstract class FT_Stream_CloseFunc extends Callback implements FT_Stream_CloseFuncI { + + /** + * Creates a {@code FT_Stream_CloseFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Stream_CloseFunc} + */ + public static FT_Stream_CloseFunc create(long functionPointer) { + FT_Stream_CloseFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Stream_CloseFunc + ? (FT_Stream_CloseFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Stream_CloseFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Stream_CloseFunc} instance that delegates to the specified {@code FT_Stream_CloseFuncI} instance. */ + public static FT_Stream_CloseFunc create(FT_Stream_CloseFuncI instance) { + return instance instanceof FT_Stream_CloseFunc + ? (FT_Stream_CloseFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Stream_CloseFunc() { + super(CIF); + } + + FT_Stream_CloseFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Stream_CloseFunc { + + private final FT_Stream_CloseFuncI delegate; + + Container(long functionPointer, FT_Stream_CloseFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long stream) { + delegate.invoke(stream); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_CloseFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_CloseFuncI.java new file mode 100644 index 000000000..3f23c1399 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_CloseFuncI.java @@ -0,0 +1,45 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Stream stream
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Stream_CloseFunc") +public interface FT_Stream_CloseFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)) + ); + } + + void invoke(@NativeType("FT_Stream") long stream); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_IoFunc.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_IoFunc.java new file mode 100644 index 000000000..47155dac2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_IoFunc.java @@ -0,0 +1,76 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * unsigned long (*{@link #invoke}) (
    + *     FT_Stream stream,
    + *     unsigned long offset,
    + *     unsigned char *buffer,
    + *     unsigned long count
    + * )
    + */ +public abstract class FT_Stream_IoFunc extends Callback implements FT_Stream_IoFuncI { + + /** + * Creates a {@code FT_Stream_IoFunc} instance from the specified function pointer. + * + * @return the new {@code FT_Stream_IoFunc} + */ + public static FT_Stream_IoFunc create(long functionPointer) { + FT_Stream_IoFuncI instance = Callback.get(functionPointer); + return instance instanceof FT_Stream_IoFunc + ? (FT_Stream_IoFunc)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static FT_Stream_IoFunc createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code FT_Stream_IoFunc} instance that delegates to the specified {@code FT_Stream_IoFuncI} instance. */ + public static FT_Stream_IoFunc create(FT_Stream_IoFuncI instance) { + return instance instanceof FT_Stream_IoFunc + ? (FT_Stream_IoFunc)instance + : new Container(instance.address(), instance); + } + + protected FT_Stream_IoFunc() { + super(CIF); + } + + FT_Stream_IoFunc(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends FT_Stream_IoFunc { + + private final FT_Stream_IoFuncI delegate; + + Container(long functionPointer, FT_Stream_IoFuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public long invoke(long stream, long offset, long buffer, long count) { + return delegate.invoke(stream, offset, buffer, count); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_IoFuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_IoFuncI.java new file mode 100644 index 000000000..0a57b71c9 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Stream_IoFuncI.java @@ -0,0 +1,53 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * unsigned long (*{@link #invoke}) (
    + *     FT_Stream stream,
    + *     unsigned long offset,
    + *     unsigned char *buffer,
    + *     unsigned long count
    + * )
    + */ +@FunctionalInterface +@NativeType("FT_Stream_IoFunc") +public interface FT_Stream_IoFuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_ulong, + ffi_type_pointer, ffi_type_ulong, ffi_type_pointer, ffi_type_ulong + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + long __result = invoke( + memGetAddress(memGetAddress(args)), + memGetCLong(memGetAddress(args + POINTER_SIZE)), + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)), + memGetCLong(memGetAddress(args + 3 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** A function used to seek and read data from a given input stream. */ + @NativeType("unsigned long") long invoke(@NativeType("FT_Stream") long stream, @NativeType("unsigned long") long offset, @NativeType("unsigned char *") long buffer, @NativeType("unsigned long") long count); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SvgGlyph.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SvgGlyph.java new file mode 100644 index 000000000..4193955e6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_SvgGlyph.java @@ -0,0 +1,256 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used for OT-SVG glyphs. This is a 'sub-class' of {@link FT_Glyph}. + * + *

    Layout

    + * + *
    
    + * struct FT_SvgGlyphRec {
    + *     {@link FT_Glyph FT_GlyphRec} root;
    + *     FT_Byte * svg_document;
    + *     FT_ULong svg_document_length;
    + *     FT_UInt glyph_index;
    + *     {@link FT_Size_Metrics FT_Size_Metrics} metrics;
    + *     FT_UShort units_per_EM;
    + *     FT_UShort start_glyph_id;
    + *     FT_UShort end_glyph_id;
    + *     {@link FT_Matrix FT_Matrix} transform;
    + *     {@link FT_Vector FT_Vector} delta;
    + * }
    + */ +@NativeType("struct FT_SvgGlyphRec") +public class FT_SvgGlyph extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + ROOT, + SVG_DOCUMENT, + SVG_DOCUMENT_LENGTH, + GLYPH_INDEX, + METRICS, + UNITS_PER_EM, + START_GLYPH_ID, + END_GLYPH_ID, + TRANSFORM, + DELTA; + + static { + Layout layout = __struct( + __member(FT_Glyph.SIZEOF, FT_Glyph.ALIGNOF), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(4), + __member(FT_Size_Metrics.SIZEOF, FT_Size_Metrics.ALIGNOF), + __member(2), + __member(2), + __member(2), + __member(FT_Matrix.SIZEOF, FT_Matrix.ALIGNOF), + __member(FT_Vector.SIZEOF, FT_Vector.ALIGNOF) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + ROOT = layout.offsetof(0); + SVG_DOCUMENT = layout.offsetof(1); + SVG_DOCUMENT_LENGTH = layout.offsetof(2); + GLYPH_INDEX = layout.offsetof(3); + METRICS = layout.offsetof(4); + UNITS_PER_EM = layout.offsetof(5); + START_GLYPH_ID = layout.offsetof(6); + END_GLYPH_ID = layout.offsetof(7); + TRANSFORM = layout.offsetof(8); + DELTA = layout.offsetof(9); + } + + protected FT_SvgGlyph(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_SvgGlyph create(long address, @Nullable ByteBuffer container) { + return new FT_SvgGlyph(address, container); + } + + /** + * Creates a {@code FT_SvgGlyph} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_SvgGlyph(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link FT_Glyph} view of the {@code root} field. */ + @NativeType("FT_GlyphRec") + public FT_Glyph root() { return nroot(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code svg_document} field. */ + @NativeType("FT_Byte *") + public ByteBuffer svg_document() { return nsvg_document(address()); } + /** @return the value of the {@code svg_document_length} field. */ + @NativeType("FT_ULong") + public long svg_document_length() { return nsvg_document_length(address()); } + /** @return the value of the {@code glyph_index} field. */ + @NativeType("FT_UInt") + public int glyph_index() { return nglyph_index(address()); } + /** @return a {@link FT_Size_Metrics} view of the {@code metrics} field. */ + public FT_Size_Metrics metrics() { return nmetrics(address()); } + /** @return the value of the {@code units_per_EM} field. */ + @NativeType("FT_UShort") + public short units_per_EM() { return nunits_per_EM(address()); } + /** @return the value of the {@code start_glyph_id} field. */ + @NativeType("FT_UShort") + public short start_glyph_id() { return nstart_glyph_id(address()); } + /** @return the value of the {@code end_glyph_id} field. */ + @NativeType("FT_UShort") + public short end_glyph_id() { return nend_glyph_id(address()); } + /** @return a {@link FT_Matrix} view of the {@code transform} field. */ + public FT_Matrix transform() { return ntransform(address()); } + /** @return a {@link FT_Vector} view of the {@code delta} field. */ + public FT_Vector delta() { return ndelta(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_SvgGlyph} instance for the specified memory address. */ + public static FT_SvgGlyph create(long address) { + return new FT_SvgGlyph(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_SvgGlyph createSafe(long address) { + return address == NULL ? null : new FT_SvgGlyph(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #root}. */ + public static FT_Glyph nroot(long struct) { return FT_Glyph.create(struct + FT_SvgGlyph.ROOT); } + /** Unsafe version of {@link #svg_document() svg_document}. */ + public static ByteBuffer nsvg_document(long struct) { return memByteBuffer(memGetAddress(struct + FT_SvgGlyph.SVG_DOCUMENT), (int)nsvg_document_length(struct)); } + /** Unsafe version of {@link #svg_document_length}. */ + public static long nsvg_document_length(long struct) { return memGetCLong(struct + FT_SvgGlyph.SVG_DOCUMENT_LENGTH); } + /** Unsafe version of {@link #glyph_index}. */ + public static int nglyph_index(long struct) { return UNSAFE.getInt(null, struct + FT_SvgGlyph.GLYPH_INDEX); } + /** Unsafe version of {@link #metrics}. */ + public static FT_Size_Metrics nmetrics(long struct) { return FT_Size_Metrics.create(struct + FT_SvgGlyph.METRICS); } + /** Unsafe version of {@link #units_per_EM}. */ + public static short nunits_per_EM(long struct) { return UNSAFE.getShort(null, struct + FT_SvgGlyph.UNITS_PER_EM); } + /** Unsafe version of {@link #start_glyph_id}. */ + public static short nstart_glyph_id(long struct) { return UNSAFE.getShort(null, struct + FT_SvgGlyph.START_GLYPH_ID); } + /** Unsafe version of {@link #end_glyph_id}. */ + public static short nend_glyph_id(long struct) { return UNSAFE.getShort(null, struct + FT_SvgGlyph.END_GLYPH_ID); } + /** Unsafe version of {@link #transform}. */ + public static FT_Matrix ntransform(long struct) { return FT_Matrix.create(struct + FT_SvgGlyph.TRANSFORM); } + /** Unsafe version of {@link #delta}. */ + public static FT_Vector ndelta(long struct) { return FT_Vector.create(struct + FT_SvgGlyph.DELTA); } + + // ----------------------------------- + + /** An array of {@link FT_SvgGlyph} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_SvgGlyph ELEMENT_FACTORY = FT_SvgGlyph.create(-1L); + + /** + * Creates a new {@code FT_SvgGlyph.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_SvgGlyph#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_SvgGlyph getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link FT_Glyph} view of the {@code root} field. */ + @NativeType("FT_GlyphRec") + public FT_Glyph root() { return FT_SvgGlyph.nroot(address()); } + /** @return a {@link ByteBuffer} view of the data pointed to by the {@code svg_document} field. */ + @NativeType("FT_Byte *") + public ByteBuffer svg_document() { return FT_SvgGlyph.nsvg_document(address()); } + /** @return the value of the {@code svg_document_length} field. */ + @NativeType("FT_ULong") + public long svg_document_length() { return FT_SvgGlyph.nsvg_document_length(address()); } + /** @return the value of the {@code glyph_index} field. */ + @NativeType("FT_UInt") + public int glyph_index() { return FT_SvgGlyph.nglyph_index(address()); } + /** @return a {@link FT_Size_Metrics} view of the {@code metrics} field. */ + public FT_Size_Metrics metrics() { return FT_SvgGlyph.nmetrics(address()); } + /** @return the value of the {@code units_per_EM} field. */ + @NativeType("FT_UShort") + public short units_per_EM() { return FT_SvgGlyph.nunits_per_EM(address()); } + /** @return the value of the {@code start_glyph_id} field. */ + @NativeType("FT_UShort") + public short start_glyph_id() { return FT_SvgGlyph.nstart_glyph_id(address()); } + /** @return the value of the {@code end_glyph_id} field. */ + @NativeType("FT_UShort") + public short end_glyph_id() { return FT_SvgGlyph.nend_glyph_id(address()); } + /** @return a {@link FT_Matrix} view of the {@code transform} field. */ + public FT_Matrix transform() { return FT_SvgGlyph.ntransform(address()); } + /** @return a {@link FT_Vector} view of the {@code delta} field. */ + public FT_Vector delta() { return FT_SvgGlyph.ndelta(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_UnitVector.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_UnitVector.java new file mode 100644 index 000000000..b14967415 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_UnitVector.java @@ -0,0 +1,287 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A simple structure used to store a 2D vector unit vector. Uses {@code FT_F2Dot14} types. + * + *

    Layout

    + * + *
    
    + * struct FT_UnitVector {
    + *     FT_F2Dot14 x;
    + *     FT_F2Dot14 y;
    + * }
    + */ +public class FT_UnitVector extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X, + Y; + + static { + Layout layout = __struct( + __member(2), + __member(2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X = layout.offsetof(0); + Y = layout.offsetof(1); + } + + protected FT_UnitVector(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_UnitVector create(long address, @Nullable ByteBuffer container) { + return new FT_UnitVector(address, container); + } + + /** + * Creates a {@code FT_UnitVector} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_UnitVector(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code x} field. */ + @NativeType("FT_F2Dot14") + public short x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + @NativeType("FT_F2Dot14") + public short y() { return ny(address()); } + + /** Sets the specified value to the {@code x} field. */ + public FT_UnitVector x(@NativeType("FT_F2Dot14") short value) { nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public FT_UnitVector y(@NativeType("FT_F2Dot14") short value) { ny(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_UnitVector set( + short x, + short y + ) { + x(x); + y(y); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_UnitVector set(FT_UnitVector src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_UnitVector} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_UnitVector malloc() { + return new FT_UnitVector(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_UnitVector} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_UnitVector calloc() { + return new FT_UnitVector(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_UnitVector} instance allocated with {@link BufferUtils}. */ + public static FT_UnitVector create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_UnitVector(memAddress(container), container); + } + + /** Returns a new {@code FT_UnitVector} instance for the specified memory address. */ + public static FT_UnitVector create(long address) { + return new FT_UnitVector(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_UnitVector createSafe(long address) { + return address == NULL ? null : new FT_UnitVector(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_UnitVector} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_UnitVector malloc(MemoryStack stack) { + return new FT_UnitVector(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_UnitVector} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_UnitVector calloc(MemoryStack stack) { + return new FT_UnitVector(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x}. */ + public static short nx(long struct) { return UNSAFE.getShort(null, struct + FT_UnitVector.X); } + /** Unsafe version of {@link #y}. */ + public static short ny(long struct) { return UNSAFE.getShort(null, struct + FT_UnitVector.Y); } + + /** Unsafe version of {@link #x(short) x}. */ + public static void nx(long struct, short value) { UNSAFE.putShort(null, struct + FT_UnitVector.X, value); } + /** Unsafe version of {@link #y(short) y}. */ + public static void ny(long struct, short value) { UNSAFE.putShort(null, struct + FT_UnitVector.Y, value); } + + // ----------------------------------- + + /** An array of {@link FT_UnitVector} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_UnitVector ELEMENT_FACTORY = FT_UnitVector.create(-1L); + + /** + * Creates a new {@code FT_UnitVector.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_UnitVector#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_UnitVector getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code x} field. */ + @NativeType("FT_F2Dot14") + public short x() { return FT_UnitVector.nx(address()); } + /** @return the value of the {@code y} field. */ + @NativeType("FT_F2Dot14") + public short y() { return FT_UnitVector.ny(address()); } + + /** Sets the specified value to the {@code x} field. */ + public Buffer x(@NativeType("FT_F2Dot14") short value) { FT_UnitVector.nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public Buffer y(@NativeType("FT_F2Dot14") short value) { FT_UnitVector.ny(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Var_Axis.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Var_Axis.java new file mode 100644 index 000000000..fcae9a712 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Var_Axis.java @@ -0,0 +1,221 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure to model a given axis in design space for Multiple Masters, TrueType GX, and OpenType variation fonts. + * + *

    Layout

    + * + *
    
    + * struct FT_Var_Axis {
    + *     FT_String * name;
    + *     FT_Fixed minimum;
    + *     FT_Fixed def;
    + *     FT_Fixed maximum;
    + *     FT_ULong tag;
    + *     FT_UInt strid;
    + * }
    + */ +public class FT_Var_Axis extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + NAME, + MINIMUM, + DEF, + MAXIMUM, + TAG, + STRID; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + NAME = layout.offsetof(0); + MINIMUM = layout.offsetof(1); + DEF = layout.offsetof(2); + MAXIMUM = layout.offsetof(3); + TAG = layout.offsetof(4); + STRID = layout.offsetof(5); + } + + protected FT_Var_Axis(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Var_Axis create(long address, @Nullable ByteBuffer container) { + return new FT_Var_Axis(address, container); + } + + /** + * Creates a {@code FT_Var_Axis} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Var_Axis(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code name} field. */ + @NativeType("FT_String *") + public ByteBuffer name() { return nname(address()); } + /** @return the null-terminated string pointed to by the {@code name} field. */ + @NativeType("FT_String *") + public String nameString() { return nnameString(address()); } + /** @return the value of the {@code minimum} field. */ + @NativeType("FT_Fixed") + public long minimum() { return nminimum(address()); } + /** @return the value of the {@code def} field. */ + @NativeType("FT_Fixed") + public long def() { return ndef(address()); } + /** @return the value of the {@code maximum} field. */ + @NativeType("FT_Fixed") + public long maximum() { return nmaximum(address()); } + /** @return the value of the {@code tag} field. */ + @NativeType("FT_ULong") + public long tag() { return ntag(address()); } + /** @return the value of the {@code strid} field. */ + @NativeType("FT_UInt") + public int strid() { return nstrid(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Var_Axis} instance for the specified memory address. */ + public static FT_Var_Axis create(long address) { + return new FT_Var_Axis(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Var_Axis createSafe(long address) { + return address == NULL ? null : new FT_Var_Axis(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #name}. */ + public static ByteBuffer nname(long struct) { return memByteBufferNT1(memGetAddress(struct + FT_Var_Axis.NAME)); } + /** Unsafe version of {@link #nameString}. */ + public static String nnameString(long struct) { return memUTF8(memGetAddress(struct + FT_Var_Axis.NAME)); } + /** Unsafe version of {@link #minimum}. */ + public static long nminimum(long struct) { return memGetCLong(struct + FT_Var_Axis.MINIMUM); } + /** Unsafe version of {@link #def}. */ + public static long ndef(long struct) { return memGetCLong(struct + FT_Var_Axis.DEF); } + /** Unsafe version of {@link #maximum}. */ + public static long nmaximum(long struct) { return memGetCLong(struct + FT_Var_Axis.MAXIMUM); } + /** Unsafe version of {@link #tag}. */ + public static long ntag(long struct) { return memGetCLong(struct + FT_Var_Axis.TAG); } + /** Unsafe version of {@link #strid}. */ + public static int nstrid(long struct) { return UNSAFE.getInt(null, struct + FT_Var_Axis.STRID); } + + // ----------------------------------- + + /** An array of {@link FT_Var_Axis} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Var_Axis ELEMENT_FACTORY = FT_Var_Axis.create(-1L); + + /** + * Creates a new {@code FT_Var_Axis.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Var_Axis#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Var_Axis getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code name} field. */ + @NativeType("FT_String *") + public ByteBuffer name() { return FT_Var_Axis.nname(address()); } + /** @return the null-terminated string pointed to by the {@code name} field. */ + @NativeType("FT_String *") + public String nameString() { return FT_Var_Axis.nnameString(address()); } + /** @return the value of the {@code minimum} field. */ + @NativeType("FT_Fixed") + public long minimum() { return FT_Var_Axis.nminimum(address()); } + /** @return the value of the {@code def} field. */ + @NativeType("FT_Fixed") + public long def() { return FT_Var_Axis.ndef(address()); } + /** @return the value of the {@code maximum} field. */ + @NativeType("FT_Fixed") + public long maximum() { return FT_Var_Axis.nmaximum(address()); } + /** @return the value of the {@code tag} field. */ + @NativeType("FT_ULong") + public long tag() { return FT_Var_Axis.ntag(address()); } + /** @return the value of the {@code strid} field. */ + @NativeType("FT_UInt") + public int strid() { return FT_Var_Axis.nstrid(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Var_Named_Style.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Var_Named_Style.java new file mode 100644 index 000000000..9df3cd2f4 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Var_Named_Style.java @@ -0,0 +1,186 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure to model a named instance in a TrueType GX or OpenType variation font. + * + *

    Layout

    + * + *
    
    + * struct FT_Var_Named_Style {
    + *     FT_Fixed * coords;
    + *     FT_UInt strid;
    + *     FT_UInt psid;
    + * }
    + */ +public class FT_Var_Named_Style extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + COORDS, + STRID, + PSID; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(4), + __member(4) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + COORDS = layout.offsetof(0); + STRID = layout.offsetof(1); + PSID = layout.offsetof(2); + } + + protected FT_Var_Named_Style(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Var_Named_Style create(long address, @Nullable ByteBuffer container) { + return new FT_Var_Named_Style(address, container); + } + + /** + * Creates a {@code FT_Var_Named_Style} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Var_Named_Style(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** + * @return a {@link CLongBuffer} view of the data pointed to by the {@code coords} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("FT_Fixed *") + public CLongBuffer coords(int capacity) { return ncoords(address(), capacity); } + /** @return the value of the {@code strid} field. */ + @NativeType("FT_UInt") + public int strid() { return nstrid(address()); } + /** @return the value of the {@code psid} field. */ + @NativeType("FT_UInt") + public int psid() { return npsid(address()); } + + // ----------------------------------- + + /** Returns a new {@code FT_Var_Named_Style} instance for the specified memory address. */ + public static FT_Var_Named_Style create(long address) { + return new FT_Var_Named_Style(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Var_Named_Style createSafe(long address) { + return address == NULL ? null : new FT_Var_Named_Style(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #coords(int) coords}. */ + public static CLongBuffer ncoords(long struct, int capacity) { return memCLongBuffer(memGetAddress(struct + FT_Var_Named_Style.COORDS), capacity); } + /** Unsafe version of {@link #strid}. */ + public static int nstrid(long struct) { return UNSAFE.getInt(null, struct + FT_Var_Named_Style.STRID); } + /** Unsafe version of {@link #psid}. */ + public static int npsid(long struct) { return UNSAFE.getInt(null, struct + FT_Var_Named_Style.PSID); } + + // ----------------------------------- + + /** An array of {@link FT_Var_Named_Style} structs. */ + public static class Buffer extends StructBuffer { + + private static final FT_Var_Named_Style ELEMENT_FACTORY = FT_Var_Named_Style.create(-1L); + + /** + * Creates a new {@code FT_Var_Named_Style.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Var_Named_Style#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Var_Named_Style getElementFactory() { + return ELEMENT_FACTORY; + } + + /** + * @return a {@link CLongBuffer} view of the data pointed to by the {@code coords} field. + * + * @param capacity the number of elements in the returned buffer + */ + @NativeType("FT_Fixed *") + public CLongBuffer coords(int capacity) { return FT_Var_Named_Style.ncoords(address(), capacity); } + /** @return the value of the {@code strid} field. */ + @NativeType("FT_UInt") + public int strid() { return FT_Var_Named_Style.nstrid(address()); } + /** @return the value of the {@code psid} field. */ + @NativeType("FT_UInt") + public int psid() { return FT_Var_Named_Style.npsid(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Vector.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Vector.java new file mode 100644 index 000000000..a54e26f64 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FT_Vector.java @@ -0,0 +1,287 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A simple structure used to store a 2D vector; coordinates are of the {@code FT_Pos} type. + * + *

    Layout

    + * + *
    
    + * struct FT_Vector {
    + *     FT_Pos x;
    + *     FT_Pos y;
    + * }
    + */ +public class FT_Vector extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + X, + Y; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + X = layout.offsetof(0); + Y = layout.offsetof(1); + } + + protected FT_Vector(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected FT_Vector create(long address, @Nullable ByteBuffer container) { + return new FT_Vector(address, container); + } + + /** + * Creates a {@code FT_Vector} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public FT_Vector(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code x} field. */ + @NativeType("FT_Pos") + public long x() { return nx(address()); } + /** @return the value of the {@code y} field. */ + @NativeType("FT_Pos") + public long y() { return ny(address()); } + + /** Sets the specified value to the {@code x} field. */ + public FT_Vector x(@NativeType("FT_Pos") long value) { nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public FT_Vector y(@NativeType("FT_Pos") long value) { ny(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public FT_Vector set( + long x, + long y + ) { + x(x); + y(y); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public FT_Vector set(FT_Vector src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code FT_Vector} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static FT_Vector malloc() { + return new FT_Vector(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code FT_Vector} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static FT_Vector calloc() { + return new FT_Vector(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code FT_Vector} instance allocated with {@link BufferUtils}. */ + public static FT_Vector create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new FT_Vector(memAddress(container), container); + } + + /** Returns a new {@code FT_Vector} instance for the specified memory address. */ + public static FT_Vector create(long address) { + return new FT_Vector(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static FT_Vector createSafe(long address) { + return address == NULL ? null : new FT_Vector(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code FT_Vector} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static FT_Vector malloc(MemoryStack stack) { + return new FT_Vector(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code FT_Vector} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static FT_Vector calloc(MemoryStack stack) { + return new FT_Vector(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #x}. */ + public static long nx(long struct) { return memGetCLong(struct + FT_Vector.X); } + /** Unsafe version of {@link #y}. */ + public static long ny(long struct) { return memGetCLong(struct + FT_Vector.Y); } + + /** Unsafe version of {@link #x(long) x}. */ + public static void nx(long struct, long value) { memPutCLong(struct + FT_Vector.X, value); } + /** Unsafe version of {@link #y(long) y}. */ + public static void ny(long struct, long value) { memPutCLong(struct + FT_Vector.Y, value); } + + // ----------------------------------- + + /** An array of {@link FT_Vector} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final FT_Vector ELEMENT_FACTORY = FT_Vector.create(-1L); + + /** + * Creates a new {@code FT_Vector.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link FT_Vector#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected FT_Vector getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code x} field. */ + @NativeType("FT_Pos") + public long x() { return FT_Vector.nx(address()); } + /** @return the value of the {@code y} field. */ + @NativeType("FT_Pos") + public long y() { return FT_Vector.ny(address()); } + + /** Sets the specified value to the {@code x} field. */ + public Buffer x(@NativeType("FT_Pos") long value) { FT_Vector.nx(address(), value); return this; } + /** Sets the specified value to the {@code y} field. */ + public Buffer y(@NativeType("FT_Pos") long value) { FT_Vector.ny(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FreeType.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FreeType.java new file mode 100644 index 000000000..da644f07a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/FreeType.java @@ -0,0 +1,5951 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.JNI.*; +import static org.lwjgl.system.libffi.LibFFI.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Native bindings to FreeType, a freely available software library to render fonts. + * + *

    It is written in C, designed to be small, efficient, highly customizable, and portable while capable of producing high-quality output (glyph images) of + * most vector and bitmap font formats.

    + * + *

    FreeType is a library that provides access to glyphs in font files. It scales the glyph images and their metrics to a requested size, and it rasterizes + * the glyph images to produce pixel or subpixel alpha coverage bitmaps.

    + * + *

    Note that FreeType is not a text layout engine. You have to use higher-level libraries like HarfBuzz, Pango, or ICU for that.

    + * + *

    Note also that FreeType does not perform alpha blending or compositing the resulting bitmaps or pixmaps by itself. Use your favourite graphics + * library (for example, Cairo or Skia) to further process FreeType's output.

    + * + *

    HarfBuzz interop

    + * + *

    The default LWJGL FreeType build includes HarfBuzz and exports its full API. See the HarfBuzz bindings for more information.

    + */ +public class FreeType { + + private static final SharedLibrary FREETYPE = Library.loadNative(FreeType.class, "org.lwjgl.freetype", Configuration.FREETYPE_LIBRARY_NAME.get(Platform.mapLibraryNameBundled("freetype")), true); + + /** Contains the function pointers loaded from the freetype {@link SharedLibrary}. */ + public static final class Functions { + + private Functions() {} + + /** Function address. */ + public static final long + Init_FreeType = apiGetFunctionAddress(FREETYPE, "FT_Init_FreeType"), + Done_FreeType = apiGetFunctionAddress(FREETYPE, "FT_Done_FreeType"), + New_Face = apiGetFunctionAddress(FREETYPE, "FT_New_Face"), + New_Memory_Face = apiGetFunctionAddress(FREETYPE, "FT_New_Memory_Face"), + Open_Face = apiGetFunctionAddress(FREETYPE, "FT_Open_Face"), + Attach_File = apiGetFunctionAddress(FREETYPE, "FT_Attach_File"), + Attach_Stream = apiGetFunctionAddress(FREETYPE, "FT_Attach_Stream"), + Reference_Face = apiGetFunctionAddress(FREETYPE, "FT_Reference_Face"), + Done_Face = apiGetFunctionAddress(FREETYPE, "FT_Done_Face"), + Select_Size = apiGetFunctionAddress(FREETYPE, "FT_Select_Size"), + Request_Size = apiGetFunctionAddress(FREETYPE, "FT_Request_Size"), + Set_Char_Size = apiGetFunctionAddress(FREETYPE, "FT_Set_Char_Size"), + Set_Pixel_Sizes = apiGetFunctionAddress(FREETYPE, "FT_Set_Pixel_Sizes"), + Load_Glyph = apiGetFunctionAddress(FREETYPE, "FT_Load_Glyph"), + Load_Char = apiGetFunctionAddress(FREETYPE, "FT_Load_Char"), + Set_Transform = apiGetFunctionAddress(FREETYPE, "FT_Set_Transform"), + Get_Transform = apiGetFunctionAddress(FREETYPE, "FT_Get_Transform"), + Render_Glyph = apiGetFunctionAddress(FREETYPE, "FT_Render_Glyph"), + Get_Kerning = apiGetFunctionAddress(FREETYPE, "FT_Get_Kerning"), + Get_Track_Kerning = apiGetFunctionAddress(FREETYPE, "FT_Get_Track_Kerning"), + Select_Charmap = apiGetFunctionAddress(FREETYPE, "FT_Select_Charmap"), + Set_Charmap = apiGetFunctionAddress(FREETYPE, "FT_Set_Charmap"), + Get_Charmap_Index = apiGetFunctionAddress(FREETYPE, "FT_Get_Charmap_Index"), + Get_Char_Index = apiGetFunctionAddress(FREETYPE, "FT_Get_Char_Index"), + Get_First_Char = apiGetFunctionAddress(FREETYPE, "FT_Get_First_Char"), + Get_Next_Char = apiGetFunctionAddress(FREETYPE, "FT_Get_Next_Char"), + Face_Properties = apiGetFunctionAddress(FREETYPE, "FT_Face_Properties"), + Get_Name_Index = apiGetFunctionAddress(FREETYPE, "FT_Get_Name_Index"), + Get_Glyph_Name = apiGetFunctionAddress(FREETYPE, "FT_Get_Glyph_Name"), + Get_Postscript_Name = apiGetFunctionAddress(FREETYPE, "FT_Get_Postscript_Name"), + Get_SubGlyph_Info = apiGetFunctionAddress(FREETYPE, "FT_Get_SubGlyph_Info"), + Get_FSType_Flags = apiGetFunctionAddress(FREETYPE, "FT_Get_FSType_Flags"), + Face_GetCharVariantIndex = apiGetFunctionAddress(FREETYPE, "FT_Face_GetCharVariantIndex"), + Face_GetCharVariantIsDefault = apiGetFunctionAddress(FREETYPE, "FT_Face_GetCharVariantIsDefault"), + Face_GetVariantSelectors = apiGetFunctionAddress(FREETYPE, "FT_Face_GetVariantSelectors"), + Face_GetVariantsOfChar = apiGetFunctionAddress(FREETYPE, "FT_Face_GetVariantsOfChar"), + Face_GetCharsOfVariant = apiGetFunctionAddress(FREETYPE, "FT_Face_GetCharsOfVariant"), + MulDiv = apiGetFunctionAddress(FREETYPE, "FT_MulDiv"), + MulFix = apiGetFunctionAddress(FREETYPE, "FT_MulFix"), + DivFix = apiGetFunctionAddress(FREETYPE, "FT_DivFix"), + RoundFix = apiGetFunctionAddress(FREETYPE, "FT_RoundFix"), + CeilFix = apiGetFunctionAddress(FREETYPE, "FT_CeilFix"), + FloorFix = apiGetFunctionAddress(FREETYPE, "FT_FloorFix"), + Vector_Transform = apiGetFunctionAddress(FREETYPE, "FT_Vector_Transform"), + Library_Version = apiGetFunctionAddress(FREETYPE, "FT_Library_Version"), + Face_CheckTrueTypePatents = apiGetFunctionAddress(FREETYPE, "FT_Face_CheckTrueTypePatents"), + Face_SetUnpatentedHinting = apiGetFunctionAddress(FREETYPE, "FT_Face_SetUnpatentedHinting"), + Get_Advance = apiGetFunctionAddress(FREETYPE, "FT_Get_Advance"), + Get_Advances = apiGetFunctionAddress(FREETYPE, "FT_Get_Advances"), + Outline_Get_BBox = apiGetFunctionAddress(FREETYPE, "FT_Outline_Get_BBox"), + Get_BDF_Charset_ID = apiGetFunctionAddress(FREETYPE, "FT_Get_BDF_Charset_ID"), + Get_BDF_Property = apiGetFunctionAddress(FREETYPE, "FT_Get_BDF_Property"), + Bitmap_Init = apiGetFunctionAddress(FREETYPE, "FT_Bitmap_Init"), + Bitmap_Copy = apiGetFunctionAddress(FREETYPE, "FT_Bitmap_Copy"), + Bitmap_Embolden = apiGetFunctionAddress(FREETYPE, "FT_Bitmap_Embolden"), + Bitmap_Convert = apiGetFunctionAddress(FREETYPE, "FT_Bitmap_Convert"), + Bitmap_Blend = apiGetFunctionAddress(FREETYPE, "FT_Bitmap_Blend"), + GlyphSlot_Own_Bitmap = apiGetFunctionAddress(FREETYPE, "FT_GlyphSlot_Own_Bitmap"), + Bitmap_Done = apiGetFunctionAddress(FREETYPE, "FT_Bitmap_Done"), + Stream_OpenBzip2 = apiGetFunctionAddressOptional(FREETYPE, "FT_Stream_OpenBzip2"), + FTC_Manager_New = apiGetFunctionAddress(FREETYPE, "FTC_Manager_New"), + FTC_Manager_Reset = apiGetFunctionAddress(FREETYPE, "FTC_Manager_Reset"), + FTC_Manager_Done = apiGetFunctionAddress(FREETYPE, "FTC_Manager_Done"), + FTC_Manager_LookupFace = apiGetFunctionAddress(FREETYPE, "FTC_Manager_LookupFace"), + FTC_Manager_LookupSize = apiGetFunctionAddress(FREETYPE, "FTC_Manager_LookupSize"), + FTC_Node_Unref = apiGetFunctionAddress(FREETYPE, "FTC_Node_Unref"), + FTC_Manager_RemoveFaceID = apiGetFunctionAddress(FREETYPE, "FTC_Manager_RemoveFaceID"), + FTC_CMapCache_New = apiGetFunctionAddress(FREETYPE, "FTC_CMapCache_New"), + FTC_CMapCache_Lookup = apiGetFunctionAddress(FREETYPE, "FTC_CMapCache_Lookup"), + FTC_ImageCache_New = apiGetFunctionAddress(FREETYPE, "FTC_ImageCache_New"), + FTC_ImageCache_Lookup = apiGetFunctionAddress(FREETYPE, "FTC_ImageCache_Lookup"), + FTC_ImageCache_LookupScaler = apiGetFunctionAddress(FREETYPE, "FTC_ImageCache_LookupScaler"), + FTC_SBitCache_New = apiGetFunctionAddress(FREETYPE, "FTC_SBitCache_New"), + FTC_SBitCache_Lookup = apiGetFunctionAddress(FREETYPE, "FTC_SBitCache_Lookup"), + FTC_SBitCache_LookupScaler = apiGetFunctionAddress(FREETYPE, "FTC_SBitCache_LookupScaler"), + Get_CID_Registry_Ordering_Supplement = apiGetFunctionAddress(FREETYPE, "FT_Get_CID_Registry_Ordering_Supplement"), + Get_CID_Is_Internally_CID_Keyed = apiGetFunctionAddress(FREETYPE, "FT_Get_CID_Is_Internally_CID_Keyed"), + Get_CID_From_Glyph_Index = apiGetFunctionAddress(FREETYPE, "FT_Get_CID_From_Glyph_Index"), + Palette_Data_Get = apiGetFunctionAddress(FREETYPE, "FT_Palette_Data_Get"), + Palette_Select = apiGetFunctionAddress(FREETYPE, "FT_Palette_Select"), + Palette_Set_Foreground_Color = apiGetFunctionAddress(FREETYPE, "FT_Palette_Set_Foreground_Color"), + Get_Color_Glyph_Layer = apiGetFunctionAddress(FREETYPE, "FT_Get_Color_Glyph_Layer"), + Get_Color_Glyph_Paint = apiGetFunctionAddress(FREETYPE, "FT_Get_Color_Glyph_Paint"), + Get_Color_Glyph_ClipBox = apiGetFunctionAddress(FREETYPE, "FT_Get_Color_Glyph_ClipBox"), + Get_Paint_Layers = apiGetFunctionAddress(FREETYPE, "FT_Get_Paint_Layers"), + Get_Colorline_Stops = apiGetFunctionAddress(FREETYPE, "FT_Get_Colorline_Stops"), + Get_Paint = apiGetFunctionAddress(FREETYPE, "FT_Get_Paint"), + Error_String = apiGetFunctionAddress(FREETYPE, "FT_Error_String"), + Get_Font_Format = apiGetFunctionAddress(FREETYPE, "FT_Get_Font_Format"), + Get_Gasp = apiGetFunctionAddress(FREETYPE, "FT_Get_Gasp"), + New_Glyph = apiGetFunctionAddress(FREETYPE, "FT_New_Glyph"), + Get_Glyph = apiGetFunctionAddress(FREETYPE, "FT_Get_Glyph"), + Glyph_Copy = apiGetFunctionAddress(FREETYPE, "FT_Glyph_Copy"), + Glyph_Transform = apiGetFunctionAddress(FREETYPE, "FT_Glyph_Transform"), + Glyph_Get_CBox = apiGetFunctionAddress(FREETYPE, "FT_Glyph_Get_CBox"), + Glyph_To_Bitmap = apiGetFunctionAddress(FREETYPE, "FT_Glyph_To_Bitmap"), + Done_Glyph = apiGetFunctionAddress(FREETYPE, "FT_Done_Glyph"), + Matrix_Multiply = apiGetFunctionAddress(FREETYPE, "FT_Matrix_Multiply"), + Matrix_Invert = apiGetFunctionAddress(FREETYPE, "FT_Matrix_Invert"), + TrueTypeGX_Validate = apiGetFunctionAddress(FREETYPE, "FT_TrueTypeGX_Validate"), + TrueTypeGX_Free = apiGetFunctionAddress(FREETYPE, "FT_TrueTypeGX_Free"), + ClassicKern_Validate = apiGetFunctionAddress(FREETYPE, "FT_ClassicKern_Validate"), + ClassicKern_Free = apiGetFunctionAddress(FREETYPE, "FT_ClassicKern_Free"), + Stream_OpenGzip = apiGetFunctionAddress(FREETYPE, "FT_Stream_OpenGzip"), + Gzip_Uncompress = apiGetFunctionAddress(FREETYPE, "FT_Gzip_Uncompress"), + Library_SetLcdFilter = apiGetFunctionAddress(FREETYPE, "FT_Library_SetLcdFilter"), + Library_SetLcdFilterWeights = apiGetFunctionAddress(FREETYPE, "FT_Library_SetLcdFilterWeights"), + Library_SetLcdGeometry = apiGetFunctionAddress(FREETYPE, "FT_Library_SetLcdGeometry"), + List_Find = apiGetFunctionAddress(FREETYPE, "FT_List_Find"), + List_Add = apiGetFunctionAddress(FREETYPE, "FT_List_Add"), + List_Insert = apiGetFunctionAddress(FREETYPE, "FT_List_Insert"), + List_Remove = apiGetFunctionAddress(FREETYPE, "FT_List_Remove"), + List_Up = apiGetFunctionAddress(FREETYPE, "FT_List_Up"), + List_Iterate = apiGetFunctionAddress(FREETYPE, "FT_List_Iterate"), + List_Finalize = apiGetFunctionAddress(FREETYPE, "FT_List_Finalize"), + Stream_OpenLZW = apiGetFunctionAddress(FREETYPE, "FT_Stream_OpenLZW"), + Get_Multi_Master = apiGetFunctionAddress(FREETYPE, "FT_Get_Multi_Master"), + Get_MM_Var = apiGetFunctionAddress(FREETYPE, "FT_Get_MM_Var"), + Done_MM_Var = apiGetFunctionAddress(FREETYPE, "FT_Done_MM_Var"), + Set_MM_Design_Coordinates = apiGetFunctionAddress(FREETYPE, "FT_Set_MM_Design_Coordinates"), + Set_Var_Design_Coordinates = apiGetFunctionAddress(FREETYPE, "FT_Set_Var_Design_Coordinates"), + Get_Var_Design_Coordinates = apiGetFunctionAddress(FREETYPE, "FT_Get_Var_Design_Coordinates"), + Set_MM_Blend_Coordinates = apiGetFunctionAddress(FREETYPE, "FT_Set_MM_Blend_Coordinates"), + Get_MM_Blend_Coordinates = apiGetFunctionAddress(FREETYPE, "FT_Get_MM_Blend_Coordinates"), + Set_Var_Blend_Coordinates = apiGetFunctionAddress(FREETYPE, "FT_Set_Var_Blend_Coordinates"), + Get_Var_Blend_Coordinates = apiGetFunctionAddress(FREETYPE, "FT_Get_Var_Blend_Coordinates"), + Set_MM_WeightVector = apiGetFunctionAddress(FREETYPE, "FT_Set_MM_WeightVector"), + Get_MM_WeightVector = apiGetFunctionAddress(FREETYPE, "FT_Get_MM_WeightVector"), + Get_Var_Axis_Flags = apiGetFunctionAddress(FREETYPE, "FT_Get_Var_Axis_Flags"), + Set_Named_Instance = apiGetFunctionAddress(FREETYPE, "FT_Set_Named_Instance"), + Get_Default_Named_Instance = apiGetFunctionAddress(FREETYPE, "FT_Get_Default_Named_Instance"), + Add_Module = apiGetFunctionAddress(FREETYPE, "FT_Add_Module"), + Get_Module = apiGetFunctionAddress(FREETYPE, "FT_Get_Module"), + Remove_Module = apiGetFunctionAddress(FREETYPE, "FT_Remove_Module"), + Property_Set = apiGetFunctionAddress(FREETYPE, "FT_Property_Set"), + Property_Get = apiGetFunctionAddress(FREETYPE, "FT_Property_Get"), + Set_Default_Properties = apiGetFunctionAddress(FREETYPE, "FT_Set_Default_Properties"), + Reference_Library = apiGetFunctionAddress(FREETYPE, "FT_Reference_Library"), + New_Library = apiGetFunctionAddress(FREETYPE, "FT_New_Library"), + Done_Library = apiGetFunctionAddress(FREETYPE, "FT_Done_Library"), + Set_Debug_Hook = apiGetFunctionAddress(FREETYPE, "FT_Set_Debug_Hook"), + Add_Default_Modules = apiGetFunctionAddress(FREETYPE, "FT_Add_Default_Modules"), + Get_TrueType_Engine_Type = apiGetFunctionAddress(FREETYPE, "FT_Get_TrueType_Engine_Type"), + OpenType_Validate = apiGetFunctionAddress(FREETYPE, "FT_OpenType_Validate"), + OpenType_Free = apiGetFunctionAddress(FREETYPE, "FT_OpenType_Free"), + Outline_Decompose = apiGetFunctionAddress(FREETYPE, "FT_Outline_Decompose"), + Outline_New = apiGetFunctionAddress(FREETYPE, "FT_Outline_New"), + Outline_Done = apiGetFunctionAddress(FREETYPE, "FT_Outline_Done"), + Outline_Check = apiGetFunctionAddress(FREETYPE, "FT_Outline_Check"), + Outline_Get_CBox = apiGetFunctionAddress(FREETYPE, "FT_Outline_Get_CBox"), + Outline_Translate = apiGetFunctionAddress(FREETYPE, "FT_Outline_Translate"), + Outline_Copy = apiGetFunctionAddress(FREETYPE, "FT_Outline_Copy"), + Outline_Transform = apiGetFunctionAddress(FREETYPE, "FT_Outline_Transform"), + Outline_Embolden = apiGetFunctionAddress(FREETYPE, "FT_Outline_Embolden"), + Outline_EmboldenXY = apiGetFunctionAddress(FREETYPE, "FT_Outline_EmboldenXY"), + Outline_Reverse = apiGetFunctionAddress(FREETYPE, "FT_Outline_Reverse"), + Outline_Get_Bitmap = apiGetFunctionAddress(FREETYPE, "FT_Outline_Get_Bitmap"), + Outline_Render = apiGetFunctionAddress(FREETYPE, "FT_Outline_Render"), + Outline_Get_Orientation = apiGetFunctionAddress(FREETYPE, "FT_Outline_Get_Orientation"), + Get_PFR_Metrics = apiGetFunctionAddress(FREETYPE, "FT_Get_PFR_Metrics"), + Get_PFR_Kerning = apiGetFunctionAddress(FREETYPE, "FT_Get_PFR_Kerning"), + Get_PFR_Advance = apiGetFunctionAddress(FREETYPE, "FT_Get_PFR_Advance"), + Get_Renderer = apiGetFunctionAddress(FREETYPE, "FT_Get_Renderer"), + Set_Renderer = apiGetFunctionAddress(FREETYPE, "FT_Set_Renderer"), + New_Size = apiGetFunctionAddress(FREETYPE, "FT_New_Size"), + Done_Size = apiGetFunctionAddress(FREETYPE, "FT_Done_Size"), + Activate_Size = apiGetFunctionAddress(FREETYPE, "FT_Activate_Size"), + Get_Sfnt_Name_Count = apiGetFunctionAddress(FREETYPE, "FT_Get_Sfnt_Name_Count"), + Get_Sfnt_Name = apiGetFunctionAddress(FREETYPE, "FT_Get_Sfnt_Name"), + Get_Sfnt_LangTag = apiGetFunctionAddress(FREETYPE, "FT_Get_Sfnt_LangTag"), + Outline_GetInsideBorder = apiGetFunctionAddress(FREETYPE, "FT_Outline_GetInsideBorder"), + Outline_GetOutsideBorder = apiGetFunctionAddress(FREETYPE, "FT_Outline_GetOutsideBorder"), + Stroker_New = apiGetFunctionAddress(FREETYPE, "FT_Stroker_New"), + Stroker_Set = apiGetFunctionAddress(FREETYPE, "FT_Stroker_Set"), + Stroker_Rewind = apiGetFunctionAddress(FREETYPE, "FT_Stroker_Rewind"), + Stroker_ParseOutline = apiGetFunctionAddress(FREETYPE, "FT_Stroker_ParseOutline"), + Stroker_BeginSubPath = apiGetFunctionAddress(FREETYPE, "FT_Stroker_BeginSubPath"), + Stroker_EndSubPath = apiGetFunctionAddress(FREETYPE, "FT_Stroker_EndSubPath"), + Stroker_LineTo = apiGetFunctionAddress(FREETYPE, "FT_Stroker_LineTo"), + Stroker_ConicTo = apiGetFunctionAddress(FREETYPE, "FT_Stroker_ConicTo"), + Stroker_CubicTo = apiGetFunctionAddress(FREETYPE, "FT_Stroker_CubicTo"), + Stroker_GetBorderCounts = apiGetFunctionAddress(FREETYPE, "FT_Stroker_GetBorderCounts"), + Stroker_ExportBorder = apiGetFunctionAddress(FREETYPE, "FT_Stroker_ExportBorder"), + Stroker_GetCounts = apiGetFunctionAddress(FREETYPE, "FT_Stroker_GetCounts"), + Stroker_Export = apiGetFunctionAddress(FREETYPE, "FT_Stroker_Export"), + Stroker_Done = apiGetFunctionAddress(FREETYPE, "FT_Stroker_Done"), + Glyph_Stroke = apiGetFunctionAddress(FREETYPE, "FT_Glyph_Stroke"), + Glyph_StrokeBorder = apiGetFunctionAddress(FREETYPE, "FT_Glyph_StrokeBorder"), + GlyphSlot_Embolden = apiGetFunctionAddress(FREETYPE, "FT_GlyphSlot_Embolden"), + GlyphSlot_AdjustWeight = apiGetFunctionAddress(FREETYPE, "FT_GlyphSlot_AdjustWeight"), + GlyphSlot_Oblique = apiGetFunctionAddress(FREETYPE, "FT_GlyphSlot_Oblique"), + GlyphSlot_Slant = apiGetFunctionAddress(FREETYPE, "FT_GlyphSlot_Slant"), + Sin = apiGetFunctionAddress(FREETYPE, "FT_Sin"), + Cos = apiGetFunctionAddress(FREETYPE, "FT_Cos"), + Tan = apiGetFunctionAddress(FREETYPE, "FT_Tan"), + Atan2 = apiGetFunctionAddress(FREETYPE, "FT_Atan2"), + Angle_Diff = apiGetFunctionAddress(FREETYPE, "FT_Angle_Diff"), + Vector_Unit = apiGetFunctionAddress(FREETYPE, "FT_Vector_Unit"), + Vector_Rotate = apiGetFunctionAddress(FREETYPE, "FT_Vector_Rotate"), + Vector_Length = apiGetFunctionAddress(FREETYPE, "FT_Vector_Length"), + Vector_Polarize = apiGetFunctionAddress(FREETYPE, "FT_Vector_Polarize"), + Vector_From_Polar = apiGetFunctionAddress(FREETYPE, "FT_Vector_From_Polar"), + Has_PS_Glyph_Names = apiGetFunctionAddress(FREETYPE, "FT_Has_PS_Glyph_Names"), + Get_PS_Font_Info = apiGetFunctionAddress(FREETYPE, "FT_Get_PS_Font_Info"), + Get_PS_Font_Private = apiGetFunctionAddress(FREETYPE, "FT_Get_PS_Font_Private"), + Get_PS_Font_Value = apiGetFunctionAddress(FREETYPE, "FT_Get_PS_Font_Value"), + Get_Sfnt_Table = apiGetFunctionAddress(FREETYPE, "FT_Get_Sfnt_Table"), + Load_Sfnt_Table = apiGetFunctionAddress(FREETYPE, "FT_Load_Sfnt_Table"), + Sfnt_Table_Info = apiGetFunctionAddress(FREETYPE, "FT_Sfnt_Table_Info"), + Get_CMap_Language_ID = apiGetFunctionAddress(FREETYPE, "FT_Get_CMap_Language_ID"), + Get_CMap_Format = apiGetFunctionAddress(FREETYPE, "FT_Get_CMap_Format"); + + } + + /** Returns the freetype {@link SharedLibrary}. */ + public static SharedLibrary getLibrary() { + return FREETYPE; + } + + /** + * {@code FT_Encoding} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_ENCODING_NONE ENCODING_NONE}
    • + *
    • {@link #FT_ENCODING_MS_SYMBOL ENCODING_MS_SYMBOL}
    • + *
    • {@link #FT_ENCODING_UNICODE ENCODING_UNICODE}
    • + *
    • {@link #FT_ENCODING_SJIS ENCODING_SJIS}
    • + *
    • {@link #FT_ENCODING_PRC ENCODING_PRC}
    • + *
    • {@link #FT_ENCODING_BIG5 ENCODING_BIG5}
    • + *
    • {@link #FT_ENCODING_WANSUNG ENCODING_WANSUNG}
    • + *
    • {@link #FT_ENCODING_JOHAB ENCODING_JOHAB}
    • + *
    • {@link #FT_ENCODING_GB2312 ENCODING_GB2312} - for backward compatibility
    • + *
    • {@link #FT_ENCODING_MS_SJIS ENCODING_MS_SJIS} - for backward compatibility
    • + *
    • {@link #FT_ENCODING_MS_GB2312 ENCODING_MS_GB2312} - for backward compatibility
    • + *
    • {@link #FT_ENCODING_MS_BIG5 ENCODING_MS_BIG5} - for backward compatibility
    • + *
    • {@link #FT_ENCODING_MS_WANSUNG ENCODING_MS_WANSUNG} - for backward compatibility
    • + *
    • {@link #FT_ENCODING_MS_JOHAB ENCODING_MS_JOHAB} - for backward compatibility
    • + *
    • {@link #FT_ENCODING_ADOBE_STANDARD ENCODING_ADOBE_STANDARD}
    • + *
    • {@link #FT_ENCODING_ADOBE_EXPERT ENCODING_ADOBE_EXPERT}
    • + *
    • {@link #FT_ENCODING_ADOBE_CUSTOM ENCODING_ADOBE_CUSTOM}
    • + *
    • {@link #FT_ENCODING_ADOBE_LATIN_1 ENCODING_ADOBE_LATIN_1}
    • + *
    • {@link #FT_ENCODING_OLD_LATIN_2 ENCODING_OLD_LATIN_2}
    • + *
    • {@link #FT_ENCODING_APPLE_ROMAN ENCODING_APPLE_ROMAN}
    • + *
    + */ + public static final int + FT_ENCODING_NONE = FT_ENC_TAG( 0, 0, 0, 0 ), + FT_ENCODING_MS_SYMBOL = FT_ENC_TAG( 's', 'y', 'm', 'b' ), + FT_ENCODING_UNICODE = FT_ENC_TAG( 'u', 'n', 'i', 'c' ), + FT_ENCODING_SJIS = FT_ENC_TAG( 's', 'j', 'i', 's' ), + FT_ENCODING_PRC = FT_ENC_TAG( 'g', 'b', ' ', ' ' ), + FT_ENCODING_BIG5 = FT_ENC_TAG( 'b', 'i', 'g', '5' ), + FT_ENCODING_WANSUNG = FT_ENC_TAG( 'w', 'a', 'n', 's' ), + FT_ENCODING_JOHAB = FT_ENC_TAG( 'j', 'o', 'h', 'a' ), + FT_ENCODING_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, + FT_ENCODING_MS_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, + FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, + FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, + FT_ENCODING_ADOBE_STANDARD = FT_ENC_TAG( 'A', 'D', 'O', 'B' ), + FT_ENCODING_ADOBE_EXPERT = FT_ENC_TAG( 'A', 'D', 'B', 'E' ), + FT_ENCODING_ADOBE_CUSTOM = FT_ENC_TAG( 'A', 'D', 'B', 'C' ), + FT_ENCODING_ADOBE_LATIN_1 = FT_ENC_TAG( 'l', 'a', 't', '1' ), + FT_ENCODING_OLD_LATIN_2 = FT_ENC_TAG( 'l', 'a', 't', '2' ), + FT_ENCODING_APPLE_ROMAN = FT_ENC_TAG( 'a', 'r', 'm', 'n' ); + + /** + * {@code FT_FACE_FLAG_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_FACE_FLAG_SCALABLE FACE_FLAG_SCALABLE}
    • + *
    • {@link #FT_FACE_FLAG_FIXED_SIZES FACE_FLAG_FIXED_SIZES}
    • + *
    • {@link #FT_FACE_FLAG_FIXED_WIDTH FACE_FLAG_FIXED_WIDTH}
    • + *
    • {@link #FT_FACE_FLAG_SFNT FACE_FLAG_SFNT}
    • + *
    • {@link #FT_FACE_FLAG_HORIZONTAL FACE_FLAG_HORIZONTAL}
    • + *
    • {@link #FT_FACE_FLAG_VERTICAL FACE_FLAG_VERTICAL}
    • + *
    • {@link #FT_FACE_FLAG_KERNING FACE_FLAG_KERNING}
    • + *
    • {@link #FT_FACE_FLAG_FAST_GLYPHS FACE_FLAG_FAST_GLYPHS}
    • + *
    • {@link #FT_FACE_FLAG_MULTIPLE_MASTERS FACE_FLAG_MULTIPLE_MASTERS}
    • + *
    • {@link #FT_FACE_FLAG_GLYPH_NAMES FACE_FLAG_GLYPH_NAMES}
    • + *
    • {@link #FT_FACE_FLAG_EXTERNAL_STREAM FACE_FLAG_EXTERNAL_STREAM}
    • + *
    • {@link #FT_FACE_FLAG_HINTER FACE_FLAG_HINTER}
    • + *
    • {@link #FT_FACE_FLAG_CID_KEYED FACE_FLAG_CID_KEYED}
    • + *
    • {@link #FT_FACE_FLAG_TRICKY FACE_FLAG_TRICKY}
    • + *
    • {@link #FT_FACE_FLAG_COLOR FACE_FLAG_COLOR}
    • + *
    • {@link #FT_FACE_FLAG_VARIATION FACE_FLAG_VARIATION}
    • + *
    • {@link #FT_FACE_FLAG_SVG FACE_FLAG_SVG}
    • + *
    • {@link #FT_FACE_FLAG_SBIX FACE_FLAG_SBIX}
    • + *
    • {@link #FT_FACE_FLAG_SBIX_OVERLAY FACE_FLAG_SBIX_OVERLAY}
    • + *
    + */ + public static final int + FT_FACE_FLAG_SCALABLE = 1 << 0, + FT_FACE_FLAG_FIXED_SIZES = 1 << 1, + FT_FACE_FLAG_FIXED_WIDTH = 1 << 2, + FT_FACE_FLAG_SFNT = 1 << 3, + FT_FACE_FLAG_HORIZONTAL = 1 << 4, + FT_FACE_FLAG_VERTICAL = 1 << 5, + FT_FACE_FLAG_KERNING = 1 << 6, + FT_FACE_FLAG_FAST_GLYPHS = 1 << 7, + FT_FACE_FLAG_MULTIPLE_MASTERS = 1 << 8, + FT_FACE_FLAG_GLYPH_NAMES = 1 << 9, + FT_FACE_FLAG_EXTERNAL_STREAM = 1 << 10, + FT_FACE_FLAG_HINTER = 1 << 11, + FT_FACE_FLAG_CID_KEYED = 1 << 12, + FT_FACE_FLAG_TRICKY = 1 << 13, + FT_FACE_FLAG_COLOR = 1 << 14, + FT_FACE_FLAG_VARIATION = 1 << 15, + FT_FACE_FLAG_SVG = 1 << 16, + FT_FACE_FLAG_SBIX = 1 << 17, + FT_FACE_FLAG_SBIX_OVERLAY = 1 << 18; + + /** + * {@code FT_STYLE_FLAG_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_STYLE_FLAG_ITALIC STYLE_FLAG_ITALIC}
    • + *
    • {@link #FT_STYLE_FLAG_BOLD STYLE_FLAG_BOLD}
    • + *
    + */ + public static final int + FT_STYLE_FLAG_ITALIC = 1 << 0, + FT_STYLE_FLAG_BOLD = 1 << 1; + + /** + * {@code FT_FFT_OPEN_XXXACE_FLAG_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_OPEN_MEMORY OPEN_MEMORY}
    • + *
    • {@link #FT_OPEN_STREAM OPEN_STREAM}
    • + *
    • {@link #FT_OPEN_PATHNAME OPEN_PATHNAME}
    • + *
    • {@link #FT_OPEN_DRIVER OPEN_DRIVER}
    • + *
    • {@link #FT_OPEN_PARAMS OPEN_PARAMS}
    • + *
    + */ + public static final int + FT_OPEN_MEMORY = 0x1, + FT_OPEN_STREAM = 0x2, + FT_OPEN_PATHNAME = 0x4, + FT_OPEN_DRIVER = 0x8, + FT_OPEN_PARAMS = 0x10; + + /** + * {@code FT_Size_Request_Type} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_SIZE_REQUEST_TYPE_NOMINAL SIZE_REQUEST_TYPE_NOMINAL}
    • + *
    • {@link #FT_SIZE_REQUEST_TYPE_REAL_DIM SIZE_REQUEST_TYPE_REAL_DIM}
    • + *
    • {@link #FT_SIZE_REQUEST_TYPE_BBOX SIZE_REQUEST_TYPE_BBOX}
    • + *
    • {@link #FT_SIZE_REQUEST_TYPE_CELL SIZE_REQUEST_TYPE_CELL}
    • + *
    • {@link #FT_SIZE_REQUEST_TYPE_SCALES SIZE_REQUEST_TYPE_SCALES}
    • + *
    • {@link #FT_SIZE_REQUEST_TYPE_MAX SIZE_REQUEST_TYPE_MAX}
    • + *
    + */ + public static final int + FT_SIZE_REQUEST_TYPE_NOMINAL = 0, + FT_SIZE_REQUEST_TYPE_REAL_DIM = 1, + FT_SIZE_REQUEST_TYPE_BBOX = 2, + FT_SIZE_REQUEST_TYPE_CELL = 3, + FT_SIZE_REQUEST_TYPE_SCALES = 4, + FT_SIZE_REQUEST_TYPE_MAX = 5; + + /** + * {@code FT_LOAD_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_LOAD_DEFAULT LOAD_DEFAULT}
    • + *
    • {@link #FT_LOAD_NO_SCALE LOAD_NO_SCALE}
    • + *
    • {@link #FT_LOAD_NO_HINTING LOAD_NO_HINTING}
    • + *
    • {@link #FT_LOAD_RENDER LOAD_RENDER}
    • + *
    • {@link #FT_LOAD_NO_BITMAP LOAD_NO_BITMAP}
    • + *
    • {@link #FT_LOAD_VERTICAL_LAYOUT LOAD_VERTICAL_LAYOUT}
    • + *
    • {@link #FT_LOAD_FORCE_AUTOHINT LOAD_FORCE_AUTOHINT}
    • + *
    • {@link #FT_LOAD_CROP_BITMAP LOAD_CROP_BITMAP}
    • + *
    • {@link #FT_LOAD_PEDANTIC LOAD_PEDANTIC}
    • + *
    • {@link #FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH}
    • + *
    • {@link #FT_LOAD_NO_RECURSE LOAD_NO_RECURSE}
    • + *
    • {@link #FT_LOAD_IGNORE_TRANSFORM LOAD_IGNORE_TRANSFORM}
    • + *
    • {@link #FT_LOAD_MONOCHROME LOAD_MONOCHROME}
    • + *
    • {@link #FT_LOAD_LINEAR_DESIGN LOAD_LINEAR_DESIGN}
    • + *
    • {@link #FT_LOAD_SBITS_ONLY LOAD_SBITS_ONLY}
    • + *
    • {@link #FT_LOAD_NO_AUTOHINT LOAD_NO_AUTOHINT}
    • + *
    • {@link #FT_LOAD_COLOR LOAD_COLOR}
    • + *
    • {@link #FT_LOAD_COMPUTE_METRICS LOAD_COMPUTE_METRICS}
    • + *
    • {@link #FT_LOAD_BITMAP_METRICS_ONLY LOAD_BITMAP_METRICS_ONLY}
    • + *
    • {@link #FT_LOAD_NO_SVG LOAD_NO_SVG}
    • + *
    • {@link #FT_LOAD_ADVANCE_ONLY LOAD_ADVANCE_ONLY}
    • + *
    • {@link #FT_LOAD_SVG_ONLY LOAD_SVG_ONLY}
    • + *
    + */ + public static final int + FT_LOAD_DEFAULT = 0x0, + FT_LOAD_NO_SCALE = 1 << 0, + FT_LOAD_NO_HINTING = 1 << 1, + FT_LOAD_RENDER = 1 << 2, + FT_LOAD_NO_BITMAP = 1 << 3, + FT_LOAD_VERTICAL_LAYOUT = 1 << 4, + FT_LOAD_FORCE_AUTOHINT = 1 << 5, + FT_LOAD_CROP_BITMAP = 1 << 6, + FT_LOAD_PEDANTIC = 1 << 7, + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH = 1 << 9, + FT_LOAD_NO_RECURSE = 1 << 10, + FT_LOAD_IGNORE_TRANSFORM = 1 << 11, + FT_LOAD_MONOCHROME = 1 << 12, + FT_LOAD_LINEAR_DESIGN = 1 << 13, + FT_LOAD_SBITS_ONLY = 1 << 14, + FT_LOAD_NO_AUTOHINT = 1 << 15, + FT_LOAD_COLOR = 1 << 20, + FT_LOAD_COMPUTE_METRICS = 1 << 21, + FT_LOAD_BITMAP_METRICS_ONLY = 1 << 22, + FT_LOAD_NO_SVG = 1 << 24, + FT_LOAD_ADVANCE_ONLY = 1 << 8, + FT_LOAD_SVG_ONLY = 1 << 23; + + /** + * {@code FT_Render_Mode} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_RENDER_MODE_NORMAL RENDER_MODE_NORMAL}
    • + *
    • {@link #FT_RENDER_MODE_LIGHT RENDER_MODE_LIGHT}
    • + *
    • {@link #FT_RENDER_MODE_MONO RENDER_MODE_MONO}
    • + *
    • {@link #FT_RENDER_MODE_LCD RENDER_MODE_LCD}
    • + *
    • {@link #FT_RENDER_MODE_LCD_V RENDER_MODE_LCD_V}
    • + *
    • {@link #FT_RENDER_MODE_SDF RENDER_MODE_SDF}
    • + *
    • {@link #FT_RENDER_MODE_MAX RENDER_MODE_MAX}
    • + *
    + */ + public static final int + FT_RENDER_MODE_NORMAL = 0, + FT_RENDER_MODE_LIGHT = 1, + FT_RENDER_MODE_MONO = 2, + FT_RENDER_MODE_LCD = 3, + FT_RENDER_MODE_LCD_V = 4, + FT_RENDER_MODE_SDF = 5, + FT_RENDER_MODE_MAX = 6; + + /** + * {@code FT_LOAD_TARGET_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_NORMAL}
    • + *
    • {@link #FT_FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_LIGHT}
    • + *
    • {@link #FT_FT_LOAD_TARGET_MONO FT_LOAD_TARGET_MONO}
    • + *
    • {@link #FT_FT_LOAD_TARGET_LCD FT_LOAD_TARGET_LCD}
    • + *
    • {@link #FT_FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_LCD_V}
    • + *
    + */ + public static final int + FT_FT_LOAD_TARGET_NORMAL = FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ), + FT_FT_LOAD_TARGET_LIGHT = FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ), + FT_FT_LOAD_TARGET_MONO = FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ), + FT_FT_LOAD_TARGET_LCD = FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ), + FT_FT_LOAD_TARGET_LCD_V = FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ); + + /** + * {@code FT_Kerning_Mode} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_KERNING_DEFAULT KERNING_DEFAULT}
    • + *
    • {@link #FT_KERNING_UNFITTED KERNING_UNFITTED}
    • + *
    • {@link #FT_KERNING_UNSCALED KERNING_UNSCALED}
    • + *
    + */ + public static final int + FT_KERNING_DEFAULT = 0, + FT_KERNING_UNFITTED = 1, + FT_KERNING_UNSCALED = 2; + + /** + * {@code FT_SUBGLYPH_FLAG_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS SUBGLYPH_FLAG_ARGS_ARE_WORDS}
    • + *
    • {@link #FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES}
    • + *
    • {@link #FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID SUBGLYPH_FLAG_ROUND_XY_TO_GRID}
    • + *
    • {@link #FT_SUBGLYPH_FLAG_SCALE SUBGLYPH_FLAG_SCALE}
    • + *
    • {@link #FT_SUBGLYPH_FLAG_XY_SCALE SUBGLYPH_FLAG_XY_SCALE}
    • + *
    • {@link #FT_SUBGLYPH_FLAG_2X2 SUBGLYPH_FLAG_2X2}
    • + *
    • {@link #FT_SUBGLYPH_FLAG_USE_MY_METRICS SUBGLYPH_FLAG_USE_MY_METRICS}
    • + *
    + */ + public static final int + FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS = 1, + FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES = 2, + FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID = 4, + FT_SUBGLYPH_FLAG_SCALE = 8, + FT_SUBGLYPH_FLAG_XY_SCALE = 0x40, + FT_SUBGLYPH_FLAG_2X2 = 0x80, + FT_SUBGLYPH_FLAG_USE_MY_METRICS = 0x200; + + /** + * {@code FT_FSTYPE_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_FSTYPE_INSTALLABLE_EMBEDDING FSTYPE_INSTALLABLE_EMBEDDING}
    • + *
    • {@link #FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING FSTYPE_RESTRICTED_LICENSE_EMBEDDING}
    • + *
    • {@link #FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING FSTYPE_PREVIEW_AND_PRINT_EMBEDDING}
    • + *
    • {@link #FT_FSTYPE_EDITABLE_EMBEDDING FSTYPE_EDITABLE_EMBEDDING}
    • + *
    • {@link #FT_FSTYPE_NO_SUBSETTING FSTYPE_NO_SUBSETTING}
    • + *
    • {@link #FT_FSTYPE_BITMAP_EMBEDDING_ONLY FSTYPE_BITMAP_EMBEDDING_ONLY}
    • + *
    + */ + public static final int + FT_FSTYPE_INSTALLABLE_EMBEDDING = 0x0000, + FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING = 0x0002, + FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING = 0x0004, + FT_FSTYPE_EDITABLE_EMBEDDING = 0x0008, + FT_FSTYPE_NO_SUBSETTING = 0x0100, + FT_FSTYPE_BITMAP_EMBEDDING_ONLY = 0x0200; + + public static final int FREETYPE_MAJOR = 2; + + public static final int FREETYPE_MINOR = 13; + + public static final int FREETYPE_PATCH = 2; + + public static final int FT_ADVANCE_FLAG_FAST_ONLY = 0x20000000; + + /** + * {@code BDF_PropertyType} + * + *
    Enum values:
    + * + *
      + *
    • {@link #BDF_PROPERTY_TYPE_NONE BDF_PROPERTY_TYPE_NONE}
    • + *
    • {@link #BDF_PROPERTY_TYPE_ATOM BDF_PROPERTY_TYPE_ATOM}
    • + *
    • {@link #BDF_PROPERTY_TYPE_INTEGER BDF_PROPERTY_TYPE_INTEGER}
    • + *
    • {@link #BDF_PROPERTY_TYPE_CARDINAL BDF_PROPERTY_TYPE_CARDINAL}
    • + *
    + */ + public static final int + BDF_PROPERTY_TYPE_NONE = 0, + BDF_PROPERTY_TYPE_ATOM = 1, + BDF_PROPERTY_TYPE_INTEGER = 2, + BDF_PROPERTY_TYPE_CARDINAL = 3; + + /** + * {@code FT_PALETTE_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_PALETTE_FOR_LIGHT_BACKGROUND PALETTE_FOR_LIGHT_BACKGROUND}
    • + *
    • {@link #FT_PALETTE_FOR_DARK_BACKGROUND PALETTE_FOR_DARK_BACKGROUND}
    • + *
    + */ + public static final int + FT_PALETTE_FOR_LIGHT_BACKGROUND = 0x01, + FT_PALETTE_FOR_DARK_BACKGROUND = 0x02; + + /** + * {@code FT_PaintFormat} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_COLR_PAINTFORMAT_COLR_LAYERS COLR_PAINTFORMAT_COLR_LAYERS}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_SOLID COLR_PAINTFORMAT_SOLID}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_LINEAR_GRADIENT COLR_PAINTFORMAT_LINEAR_GRADIENT}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_RADIAL_GRADIENT COLR_PAINTFORMAT_RADIAL_GRADIENT}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_SWEEP_GRADIENT COLR_PAINTFORMAT_SWEEP_GRADIENT}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_GLYPH COLR_PAINTFORMAT_GLYPH}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_COLR_GLYPH COLR_PAINTFORMAT_COLR_GLYPH}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_TRANSFORM COLR_PAINTFORMAT_TRANSFORM}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_TRANSLATE COLR_PAINTFORMAT_TRANSLATE}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_SCALE COLR_PAINTFORMAT_SCALE}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_ROTATE COLR_PAINTFORMAT_ROTATE}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_SKEW COLR_PAINTFORMAT_SKEW}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_COMPOSITE COLR_PAINTFORMAT_COMPOSITE}
    • + *
    • {@link #FT_COLR_PAINT_FORMAT_MAX COLR_PAINT_FORMAT_MAX}
    • + *
    • {@link #FT_COLR_PAINTFORMAT_UNSUPPORTED COLR_PAINTFORMAT_UNSUPPORTED}
    • + *
    + */ + public static final int + FT_COLR_PAINTFORMAT_COLR_LAYERS = 1, + FT_COLR_PAINTFORMAT_SOLID = 2, + FT_COLR_PAINTFORMAT_LINEAR_GRADIENT = 4, + FT_COLR_PAINTFORMAT_RADIAL_GRADIENT = 6, + FT_COLR_PAINTFORMAT_SWEEP_GRADIENT = 8, + FT_COLR_PAINTFORMAT_GLYPH = 10, + FT_COLR_PAINTFORMAT_COLR_GLYPH = 11, + FT_COLR_PAINTFORMAT_TRANSFORM = 12, + FT_COLR_PAINTFORMAT_TRANSLATE = 14, + FT_COLR_PAINTFORMAT_SCALE = 16, + FT_COLR_PAINTFORMAT_ROTATE = 24, + FT_COLR_PAINTFORMAT_SKEW = 28, + FT_COLR_PAINTFORMAT_COMPOSITE = 32, + FT_COLR_PAINT_FORMAT_MAX = 33, + FT_COLR_PAINTFORMAT_UNSUPPORTED = 255; + + /** + * {@code FT_PaintExtend} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_COLR_PAINT_EXTEND_PAD COLR_PAINT_EXTEND_PAD}
    • + *
    • {@link #FT_COLR_PAINT_EXTEND_REPEAT COLR_PAINT_EXTEND_REPEAT}
    • + *
    • {@link #FT_COLR_PAINT_EXTEND_REFLECT COLR_PAINT_EXTEND_REFLECT}
    • + *
    + */ + public static final int + FT_COLR_PAINT_EXTEND_PAD = 0, + FT_COLR_PAINT_EXTEND_REPEAT = 1, + FT_COLR_PAINT_EXTEND_REFLECT = 2; + + /** + * {@code FT_Composite_Mode} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_COLR_COMPOSITE_CLEAR COLR_COMPOSITE_CLEAR}
    • + *
    • {@link #FT_COLR_COMPOSITE_SRC COLR_COMPOSITE_SRC}
    • + *
    • {@link #FT_COLR_COMPOSITE_DEST COLR_COMPOSITE_DEST}
    • + *
    • {@link #FT_COLR_COMPOSITE_SRC_OVER COLR_COMPOSITE_SRC_OVER}
    • + *
    • {@link #FT_COLR_COMPOSITE_DEST_OVER COLR_COMPOSITE_DEST_OVER}
    • + *
    • {@link #FT_COLR_COMPOSITE_SRC_IN COLR_COMPOSITE_SRC_IN}
    • + *
    • {@link #FT_COLR_COMPOSITE_DEST_IN COLR_COMPOSITE_DEST_IN}
    • + *
    • {@link #FT_COLR_COMPOSITE_SRC_OUT COLR_COMPOSITE_SRC_OUT}
    • + *
    • {@link #FT_COLR_COMPOSITE_DEST_OUT COLR_COMPOSITE_DEST_OUT}
    • + *
    • {@link #FT_COLR_COMPOSITE_SRC_ATOP COLR_COMPOSITE_SRC_ATOP}
    • + *
    • {@link #FT_COLR_COMPOSITE_DEST_ATOP COLR_COMPOSITE_DEST_ATOP}
    • + *
    • {@link #FT_COLR_COMPOSITE_XOR COLR_COMPOSITE_XOR}
    • + *
    • {@link #FT_COLR_COMPOSITE_PLUS COLR_COMPOSITE_PLUS}
    • + *
    • {@link #FT_COLR_COMPOSITE_SCREEN COLR_COMPOSITE_SCREEN}
    • + *
    • {@link #FT_COLR_COMPOSITE_OVERLAY COLR_COMPOSITE_OVERLAY}
    • + *
    • {@link #FT_COLR_COMPOSITE_DARKEN COLR_COMPOSITE_DARKEN}
    • + *
    • {@link #FT_COLR_COMPOSITE_LIGHTEN COLR_COMPOSITE_LIGHTEN}
    • + *
    • {@link #FT_COLR_COMPOSITE_COLOR_DODGE COLR_COMPOSITE_COLOR_DODGE}
    • + *
    • {@link #FT_COLR_COMPOSITE_COLOR_BURN COLR_COMPOSITE_COLOR_BURN}
    • + *
    • {@link #FT_COLR_COMPOSITE_HARD_LIGHT COLR_COMPOSITE_HARD_LIGHT}
    • + *
    • {@link #FT_COLR_COMPOSITE_SOFT_LIGHT COLR_COMPOSITE_SOFT_LIGHT}
    • + *
    • {@link #FT_COLR_COMPOSITE_DIFFERENCE COLR_COMPOSITE_DIFFERENCE}
    • + *
    • {@link #FT_COLR_COMPOSITE_EXCLUSION COLR_COMPOSITE_EXCLUSION}
    • + *
    • {@link #FT_COLR_COMPOSITE_MULTIPLY COLR_COMPOSITE_MULTIPLY}
    • + *
    • {@link #FT_COLR_COMPOSITE_HSL_HUE COLR_COMPOSITE_HSL_HUE}
    • + *
    • {@link #FT_COLR_COMPOSITE_HSL_SATURATION COLR_COMPOSITE_HSL_SATURATION}
    • + *
    • {@link #FT_COLR_COMPOSITE_HSL_COLOR COLR_COMPOSITE_HSL_COLOR}
    • + *
    • {@link #FT_COLR_COMPOSITE_HSL_LUMINOSITY COLR_COMPOSITE_HSL_LUMINOSITY}
    • + *
    • {@link #FT_COLR_COMPOSITE_MAX COLR_COMPOSITE_MAX}
    • + *
    + */ + public static final int + FT_COLR_COMPOSITE_CLEAR = 0, + FT_COLR_COMPOSITE_SRC = 1, + FT_COLR_COMPOSITE_DEST = 2, + FT_COLR_COMPOSITE_SRC_OVER = 3, + FT_COLR_COMPOSITE_DEST_OVER = 4, + FT_COLR_COMPOSITE_SRC_IN = 5, + FT_COLR_COMPOSITE_DEST_IN = 6, + FT_COLR_COMPOSITE_SRC_OUT = 7, + FT_COLR_COMPOSITE_DEST_OUT = 8, + FT_COLR_COMPOSITE_SRC_ATOP = 9, + FT_COLR_COMPOSITE_DEST_ATOP = 10, + FT_COLR_COMPOSITE_XOR = 11, + FT_COLR_COMPOSITE_PLUS = 12, + FT_COLR_COMPOSITE_SCREEN = 13, + FT_COLR_COMPOSITE_OVERLAY = 14, + FT_COLR_COMPOSITE_DARKEN = 15, + FT_COLR_COMPOSITE_LIGHTEN = 16, + FT_COLR_COMPOSITE_COLOR_DODGE = 17, + FT_COLR_COMPOSITE_COLOR_BURN = 18, + FT_COLR_COMPOSITE_HARD_LIGHT = 19, + FT_COLR_COMPOSITE_SOFT_LIGHT = 20, + FT_COLR_COMPOSITE_DIFFERENCE = 21, + FT_COLR_COMPOSITE_EXCLUSION = 22, + FT_COLR_COMPOSITE_MULTIPLY = 23, + FT_COLR_COMPOSITE_HSL_HUE = 24, + FT_COLR_COMPOSITE_HSL_SATURATION = 25, + FT_COLR_COMPOSITE_HSL_COLOR = 26, + FT_COLR_COMPOSITE_HSL_LUMINOSITY = 27, + FT_COLR_COMPOSITE_MAX = 28; + + /** + * {@code FT_Color_Root_Transform} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_COLOR_INCLUDE_ROOT_TRANSFORM COLOR_INCLUDE_ROOT_TRANSFORM}
    • + *
    • {@link #FT_COLOR_NO_ROOT_TRANSFORM COLOR_NO_ROOT_TRANSFORM}
    • + *
    • {@link #FT_COLOR_ROOT_TRANSFORM_MAX COLOR_ROOT_TRANSFORM_MAX}
    • + *
    + */ + public static final int + FT_COLOR_INCLUDE_ROOT_TRANSFORM = 0, + FT_COLOR_NO_ROOT_TRANSFORM = 1, + FT_COLOR_ROOT_TRANSFORM_MAX = 2; + + /** + * {@code FT_HINTING_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_HINTING_FREETYPE HINTING_FREETYPE}
    • + *
    • {@link #FT_HINTING_ADOBE HINTING_ADOBE}
    • + *
    + */ + public static final int + FT_HINTING_FREETYPE = 0, + FT_HINTING_ADOBE = 1; + + public static final int TT_INTERPRETER_VERSION_35 = 35; + + public static final int TT_INTERPRETER_VERSION_38 = 38; + + public static final int TT_INTERPRETER_VERSION_40 = 40; + + /** + * {@code FT_AUTOHINTER_SCRIPT_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_AUTOHINTER_SCRIPT_NONE AUTOHINTER_SCRIPT_NONE}
    • + *
    • {@link #FT_AUTOHINTER_SCRIPT_LATIN AUTOHINTER_SCRIPT_LATIN}
    • + *
    • {@link #FT_AUTOHINTER_SCRIPT_CJK AUTOHINTER_SCRIPT_CJK}
    • + *
    • {@link #FT_AUTOHINTER_SCRIPT_INDIC AUTOHINTER_SCRIPT_INDIC}
    • + *
    + */ + public static final int + FT_AUTOHINTER_SCRIPT_NONE = 0, + FT_AUTOHINTER_SCRIPT_LATIN = 1, + FT_AUTOHINTER_SCRIPT_CJK = 2, + FT_AUTOHINTER_SCRIPT_INDIC = 3; + + /** + * {@code FT_Err_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_Err_Ok Err_Ok}
    • + *
    • {@link #FT_Err_Cannot_Open_Resource Err_Cannot_Open_Resource}
    • + *
    • {@link #FT_Err_Unknown_File_Format Err_Unknown_File_Format}
    • + *
    • {@link #FT_Err_Invalid_File_Format Err_Invalid_File_Format}
    • + *
    • {@link #FT_Err_Invalid_Version Err_Invalid_Version}
    • + *
    • {@link #FT_Err_Lower_Module_Version Err_Lower_Module_Version}
    • + *
    • {@link #FT_Err_Invalid_Argument Err_Invalid_Argument}
    • + *
    • {@link #FT_Err_Unimplemented_Feature Err_Unimplemented_Feature}
    • + *
    • {@link #FT_Err_Invalid_Table Err_Invalid_Table}
    • + *
    • {@link #FT_Err_Invalid_Offset Err_Invalid_Offset}
    • + *
    • {@link #FT_Err_Array_Too_Large Err_Array_Too_Large}
    • + *
    • {@link #FT_Err_Missing_Module Err_Missing_Module}
    • + *
    • {@link #FT_Err_Missing_Property Err_Missing_Property}
    • + *
    • {@link #FT_Err_Invalid_Glyph_Index Err_Invalid_Glyph_Index}
    • + *
    • {@link #FT_Err_Invalid_Character_Code Err_Invalid_Character_Code}
    • + *
    • {@link #FT_Err_Invalid_Glyph_Format Err_Invalid_Glyph_Format}
    • + *
    • {@link #FT_Err_Cannot_Render_Glyph Err_Cannot_Render_Glyph}
    • + *
    • {@link #FT_Err_Invalid_Outline Err_Invalid_Outline}
    • + *
    • {@link #FT_Err_Invalid_Composite Err_Invalid_Composite}
    • + *
    • {@link #FT_Err_Too_Many_Hints Err_Too_Many_Hints}
    • + *
    • {@link #FT_Err_Invalid_Pixel_Size Err_Invalid_Pixel_Size}
    • + *
    • {@link #FT_Err_Invalid_SVG_Document Err_Invalid_SVG_Document}
    • + *
    • {@link #FT_Err_Invalid_Handle Err_Invalid_Handle}
    • + *
    • {@link #FT_Err_Invalid_Library_Handle Err_Invalid_Library_Handle}
    • + *
    • {@link #FT_Err_Invalid_Driver_Handle Err_Invalid_Driver_Handle}
    • + *
    • {@link #FT_Err_Invalid_Face_Handle Err_Invalid_Face_Handle}
    • + *
    • {@link #FT_Err_Invalid_Size_Handle Err_Invalid_Size_Handle}
    • + *
    • {@link #FT_Err_Invalid_Slot_Handle Err_Invalid_Slot_Handle}
    • + *
    • {@link #FT_Err_Invalid_CharMap_Handle Err_Invalid_CharMap_Handle}
    • + *
    • {@link #FT_Err_Invalid_Cache_Handle Err_Invalid_Cache_Handle}
    • + *
    • {@link #FT_Err_Invalid_Stream_Handle Err_Invalid_Stream_Handle}
    • + *
    • {@link #FT_Err_Too_Many_Drivers Err_Too_Many_Drivers}
    • + *
    • {@link #FT_Err_Too_Many_Extensions Err_Too_Many_Extensions}
    • + *
    • {@link #FT_Err_Out_Of_Memory Err_Out_Of_Memory}
    • + *
    • {@link #FT_Err_Unlisted_Object Err_Unlisted_Object}
    • + *
    • {@link #FT_Err_Cannot_Open_Stream Err_Cannot_Open_Stream}
    • + *
    • {@link #FT_Err_Invalid_Stream_Seek Err_Invalid_Stream_Seek}
    • + *
    • {@link #FT_Err_Invalid_Stream_Skip Err_Invalid_Stream_Skip}
    • + *
    • {@link #FT_Err_Invalid_Stream_Read Err_Invalid_Stream_Read}
    • + *
    • {@link #FT_Err_Invalid_Stream_Operation Err_Invalid_Stream_Operation}
    • + *
    • {@link #FT_Err_Invalid_Frame_Operation Err_Invalid_Frame_Operation}
    • + *
    • {@link #FT_Err_Nested_Frame_Access Err_Nested_Frame_Access}
    • + *
    • {@link #FT_Err_Invalid_Frame_Read Err_Invalid_Frame_Read}
    • + *
    • {@link #FT_Err_Raster_Uninitialized Err_Raster_Uninitialized}
    • + *
    • {@link #FT_Err_Raster_Corrupted Err_Raster_Corrupted}
    • + *
    • {@link #FT_Err_Raster_Overflow Err_Raster_Overflow}
    • + *
    • {@link #FT_Err_Raster_Negative_Height Err_Raster_Negative_Height}
    • + *
    • {@link #FT_Err_Too_Many_Caches Err_Too_Many_Caches}
    • + *
    • {@link #FT_Err_Invalid_Opcode Err_Invalid_Opcode}
    • + *
    • {@link #FT_Err_Too_Few_Arguments Err_Too_Few_Arguments}
    • + *
    • {@link #FT_Err_Stack_Overflow Err_Stack_Overflow}
    • + *
    • {@link #FT_Err_Code_Overflow Err_Code_Overflow}
    • + *
    • {@link #FT_Err_Bad_Argument Err_Bad_Argument}
    • + *
    • {@link #FT_Err_Divide_By_Zero Err_Divide_By_Zero}
    • + *
    • {@link #FT_Err_Invalid_Reference Err_Invalid_Reference}
    • + *
    • {@link #FT_Err_Debug_OpCode Err_Debug_OpCode}
    • + *
    • {@link #FT_Err_ENDF_In_Exec_Stream Err_ENDF_In_Exec_Stream}
    • + *
    • {@link #FT_Err_Nested_DEFS Err_Nested_DEFS}
    • + *
    • {@link #FT_Err_Invalid_CodeRange Err_Invalid_CodeRange}
    • + *
    • {@link #FT_Err_Execution_Too_Long Err_Execution_Too_Long}
    • + *
    • {@link #FT_Err_Too_Many_Function_Defs Err_Too_Many_Function_Defs}
    • + *
    • {@link #FT_Err_Too_Many_Instruction_Defs Err_Too_Many_Instruction_Defs}
    • + *
    • {@link #FT_Err_Table_Missing Err_Table_Missing}
    • + *
    • {@link #FT_Err_Horiz_Header_Missing Err_Horiz_Header_Missing}
    • + *
    • {@link #FT_Err_Locations_Missing Err_Locations_Missing}
    • + *
    • {@link #FT_Err_Name_Table_Missing Err_Name_Table_Missing}
    • + *
    • {@link #FT_Err_CMap_Table_Missing Err_CMap_Table_Missing}
    • + *
    • {@link #FT_Err_Hmtx_Table_Missing Err_Hmtx_Table_Missing}
    • + *
    • {@link #FT_Err_Post_Table_Missing Err_Post_Table_Missing}
    • + *
    • {@link #FT_Err_Invalid_Horiz_Metrics Err_Invalid_Horiz_Metrics}
    • + *
    • {@link #FT_Err_Invalid_CharMap_Format Err_Invalid_CharMap_Format}
    • + *
    • {@link #FT_Err_Invalid_PPem Err_Invalid_PPem}
    • + *
    • {@link #FT_Err_Invalid_Vert_Metrics Err_Invalid_Vert_Metrics}
    • + *
    • {@link #FT_Err_Could_Not_Find_Context Err_Could_Not_Find_Context}
    • + *
    • {@link #FT_Err_Invalid_Post_Table_Format Err_Invalid_Post_Table_Format}
    • + *
    • {@link #FT_Err_Invalid_Post_Table Err_Invalid_Post_Table}
    • + *
    • {@link #FT_Err_DEF_In_Glyf_Bytecode Err_DEF_In_Glyf_Bytecode}
    • + *
    • {@link #FT_Err_Missing_Bitmap Err_Missing_Bitmap}
    • + *
    • {@link #FT_Err_Missing_SVG_Hooks Err_Missing_SVG_Hooks}
    • + *
    • {@link #FT_Err_Syntax_Error Err_Syntax_Error}
    • + *
    • {@link #FT_Err_Stack_Underflow Err_Stack_Underflow}
    • + *
    • {@link #FT_Err_Ignore Err_Ignore}
    • + *
    • {@link #FT_Err_No_Unicode_Glyph_Name Err_No_Unicode_Glyph_Name}
    • + *
    • {@link #FT_Err_Glyph_Too_Big Err_Glyph_Too_Big}
    • + *
    • {@link #FT_Err_Missing_Startfont_Field Err_Missing_Startfont_Field}
    • + *
    • {@link #FT_Err_Missing_Font_Field Err_Missing_Font_Field}
    • + *
    • {@link #FT_Err_Missing_Size_Field Err_Missing_Size_Field}
    • + *
    • {@link #FT_Err_Missing_Fontboundingbox_Field Err_Missing_Fontboundingbox_Field}
    • + *
    • {@link #FT_Err_Missing_Chars_Field Err_Missing_Chars_Field}
    • + *
    • {@link #FT_Err_Missing_Startchar_Field Err_Missing_Startchar_Field}
    • + *
    • {@link #FT_Err_Missing_Encoding_Field Err_Missing_Encoding_Field}
    • + *
    • {@link #FT_Err_Missing_Bbx_Field Err_Missing_Bbx_Field}
    • + *
    • {@link #FT_Err_Bbx_Too_Big Err_Bbx_Too_Big}
    • + *
    • {@link #FT_Err_Corrupted_Font_Header Err_Corrupted_Font_Header}
    • + *
    • {@link #FT_Err_Corrupted_Font_Glyphs Err_Corrupted_Font_Glyphs}
    • + *
    • {@link #FT_Err_Max Err_Max}
    • + *
    + */ + public static final int + FT_Err_Ok = 0x00, + FT_Err_Cannot_Open_Resource = 0x01, + FT_Err_Unknown_File_Format = 0x02, + FT_Err_Invalid_File_Format = 0x03, + FT_Err_Invalid_Version = 0x04, + FT_Err_Lower_Module_Version = 0x05, + FT_Err_Invalid_Argument = 0x06, + FT_Err_Unimplemented_Feature = 0x07, + FT_Err_Invalid_Table = 0x08, + FT_Err_Invalid_Offset = 0x09, + FT_Err_Array_Too_Large = 0x0A, + FT_Err_Missing_Module = 0x0B, + FT_Err_Missing_Property = 0x0C, + FT_Err_Invalid_Glyph_Index = 0x10, + FT_Err_Invalid_Character_Code = 0x11, + FT_Err_Invalid_Glyph_Format = 0x12, + FT_Err_Cannot_Render_Glyph = 0x13, + FT_Err_Invalid_Outline = 0x14, + FT_Err_Invalid_Composite = 0x15, + FT_Err_Too_Many_Hints = 0x16, + FT_Err_Invalid_Pixel_Size = 0x17, + FT_Err_Invalid_SVG_Document = 0x18, + FT_Err_Invalid_Handle = 0x20, + FT_Err_Invalid_Library_Handle = 0x21, + FT_Err_Invalid_Driver_Handle = 0x22, + FT_Err_Invalid_Face_Handle = 0x23, + FT_Err_Invalid_Size_Handle = 0x24, + FT_Err_Invalid_Slot_Handle = 0x25, + FT_Err_Invalid_CharMap_Handle = 0x26, + FT_Err_Invalid_Cache_Handle = 0x27, + FT_Err_Invalid_Stream_Handle = 0x28, + FT_Err_Too_Many_Drivers = 0x30, + FT_Err_Too_Many_Extensions = 0x31, + FT_Err_Out_Of_Memory = 0x40, + FT_Err_Unlisted_Object = 0x41, + FT_Err_Cannot_Open_Stream = 0x51, + FT_Err_Invalid_Stream_Seek = 0x52, + FT_Err_Invalid_Stream_Skip = 0x53, + FT_Err_Invalid_Stream_Read = 0x54, + FT_Err_Invalid_Stream_Operation = 0x55, + FT_Err_Invalid_Frame_Operation = 0x56, + FT_Err_Nested_Frame_Access = 0x57, + FT_Err_Invalid_Frame_Read = 0x58, + FT_Err_Raster_Uninitialized = 0x60, + FT_Err_Raster_Corrupted = 0x61, + FT_Err_Raster_Overflow = 0x62, + FT_Err_Raster_Negative_Height = 0x63, + FT_Err_Too_Many_Caches = 0x70, + FT_Err_Invalid_Opcode = 0x80, + FT_Err_Too_Few_Arguments = 0x81, + FT_Err_Stack_Overflow = 0x82, + FT_Err_Code_Overflow = 0x83, + FT_Err_Bad_Argument = 0x84, + FT_Err_Divide_By_Zero = 0x85, + FT_Err_Invalid_Reference = 0x86, + FT_Err_Debug_OpCode = 0x87, + FT_Err_ENDF_In_Exec_Stream = 0x88, + FT_Err_Nested_DEFS = 0x89, + FT_Err_Invalid_CodeRange = 0x8A, + FT_Err_Execution_Too_Long = 0x8B, + FT_Err_Too_Many_Function_Defs = 0x8C, + FT_Err_Too_Many_Instruction_Defs = 0x8D, + FT_Err_Table_Missing = 0x8E, + FT_Err_Horiz_Header_Missing = 0x8F, + FT_Err_Locations_Missing = 0x90, + FT_Err_Name_Table_Missing = 0x91, + FT_Err_CMap_Table_Missing = 0x92, + FT_Err_Hmtx_Table_Missing = 0x93, + FT_Err_Post_Table_Missing = 0x94, + FT_Err_Invalid_Horiz_Metrics = 0x95, + FT_Err_Invalid_CharMap_Format = 0x96, + FT_Err_Invalid_PPem = 0x97, + FT_Err_Invalid_Vert_Metrics = 0x98, + FT_Err_Could_Not_Find_Context = 0x99, + FT_Err_Invalid_Post_Table_Format = 0x9A, + FT_Err_Invalid_Post_Table = 0x9B, + FT_Err_DEF_In_Glyf_Bytecode = 0x9C, + FT_Err_Missing_Bitmap = 0x9D, + FT_Err_Missing_SVG_Hooks = 0x9E, + FT_Err_Syntax_Error = 0xA0, + FT_Err_Stack_Underflow = 0xA1, + FT_Err_Ignore = 0xA2, + FT_Err_No_Unicode_Glyph_Name = 0xA3, + FT_Err_Glyph_Too_Big = 0xA4, + FT_Err_Missing_Startfont_Field = 0xB0, + FT_Err_Missing_Font_Field = 0xB1, + FT_Err_Missing_Size_Field = 0xB2, + FT_Err_Missing_Fontboundingbox_Field = 0xB3, + FT_Err_Missing_Chars_Field = 0xB4, + FT_Err_Missing_Startchar_Field = 0xB5, + FT_Err_Missing_Encoding_Field = 0xB6, + FT_Err_Missing_Bbx_Field = 0xB7, + FT_Err_Bbx_Too_Big = 0xB8, + FT_Err_Corrupted_Font_Header = 0xB9, + FT_Err_Corrupted_Font_Glyphs = 0xBA, + FT_Err_Max = 187; + + /** + * {@code FT_GASP_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_GASP_NO_TABLE GASP_NO_TABLE}
    • + *
    • {@link #FT_GASP_DO_GRIDFIT GASP_DO_GRIDFIT}
    • + *
    • {@link #FT_GASP_DO_GRAY GASP_DO_GRAY}
    • + *
    • {@link #FT_GASP_SYMMETRIC_GRIDFIT GASP_SYMMETRIC_GRIDFIT}
    • + *
    • {@link #FT_GASP_SYMMETRIC_SMOOTHING GASP_SYMMETRIC_SMOOTHING}
    • + *
    + */ + public static final int + FT_GASP_NO_TABLE = -1, + FT_GASP_DO_GRIDFIT = 0x01, + FT_GASP_DO_GRAY = 0x02, + FT_GASP_SYMMETRIC_GRIDFIT = 0x04, + FT_GASP_SYMMETRIC_SMOOTHING = 0x08; + + /** + * {@code FT_Glyph_BBox_Mode} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_GLYPH_BBOX_UNSCALED GLYPH_BBOX_UNSCALED}
    • + *
    • {@link #FT_GLYPH_BBOX_SUBPIXELS GLYPH_BBOX_SUBPIXELS}
    • + *
    • {@link #FT_GLYPH_BBOX_GRIDFIT GLYPH_BBOX_GRIDFIT}
    • + *
    • {@link #FT_GLYPH_BBOX_TRUNCATE GLYPH_BBOX_TRUNCATE}
    • + *
    • {@link #FT_GLYPH_BBOX_PIXELS GLYPH_BBOX_PIXELS}
    • + *
    + */ + public static final int + FT_GLYPH_BBOX_UNSCALED = 0, + FT_GLYPH_BBOX_SUBPIXELS = 0, + FT_GLYPH_BBOX_GRIDFIT = 1, + FT_GLYPH_BBOX_TRUNCATE = 2, + FT_GLYPH_BBOX_PIXELS = 3; + + public static final int FT_VALIDATE_feat_INDEX = 0; + + public static final int FT_VALIDATE_mort_INDEX = 1; + + public static final int FT_VALIDATE_morx_INDEX = 2; + + public static final int FT_VALIDATE_bsln_INDEX = 3; + + public static final int FT_VALIDATE_just_INDEX = 4; + + public static final int FT_VALIDATE_kern_INDEX = 5; + + public static final int FT_VALIDATE_opbd_INDEX = 6; + + public static final int FT_VALIDATE_trak_INDEX = 7; + + public static final int FT_VALIDATE_prop_INDEX = 8; + + public static final int FT_VALIDATE_lcar_INDEX = 9; + + public static final int FT_VALIDATE_GX_LAST_INDEX = FT_VALIDATE_lcar_INDEX; + + public static final int FT_VALIDATE_GX_LENGTH = FT_VALIDATE_GX_LAST_INDEX + 1; + + public static final int FT_VALIDATE_GX_START = 0x4000; + + public static final int FT_VALIDATE_feat = FT_VALIDATE_GX_START << 0; + + public static final int FT_VALIDATE_mort = FT_VALIDATE_GX_START << 1; + + public static final int FT_VALIDATE_morx = FT_VALIDATE_GX_START << 2; + + public static final int FT_VALIDATE_bsln = FT_VALIDATE_GX_START << 3; + + public static final int FT_VALIDATE_just = FT_VALIDATE_GX_START << 4; + + public static final int FT_VALIDATE_kern = FT_VALIDATE_GX_START << 5; + + public static final int FT_VALIDATE_opbd = FT_VALIDATE_GX_START << 6; + + public static final int FT_VALIDATE_trak = FT_VALIDATE_GX_START << 7; + + public static final int FT_VALIDATE_prop = FT_VALIDATE_GX_START << 8; + + public static final int FT_VALIDATE_lcar = FT_VALIDATE_GX_START << 9; + + public static final int FT_FT_VALIDATE_GX = + FT_VALIDATE_feat | + FT_VALIDATE_mort | + FT_VALIDATE_morx | + FT_VALIDATE_bsln | + FT_VALIDATE_just | + FT_VALIDATE_kern | + FT_VALIDATE_opbd | + FT_VALIDATE_trak | + FT_VALIDATE_prop | + FT_VALIDATE_lcar; + + /** + * {@code FT_VALIDATE_CKERNXXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_VALIDATE_MS VALIDATE_MS}
    • + *
    • {@link #FT_VALIDATE_APPLE VALIDATE_APPLE}
    • + *
    • {@link #FT_VALIDATE_CKERN VALIDATE_CKERN}
    • + *
    + */ + public static final int + FT_VALIDATE_MS = FT_VALIDATE_GX_START << 0, + FT_VALIDATE_APPLE = FT_VALIDATE_GX_START << 1, + FT_VALIDATE_CKERN = FT_VALIDATE_MS | FT_VALIDATE_APPLE; + + /** + * {@code FT_Pixel_Mode} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_PIXEL_MODE_NONE PIXEL_MODE_NONE}
    • + *
    • {@link #FT_PIXEL_MODE_MONO PIXEL_MODE_MONO}
    • + *
    • {@link #FT_PIXEL_MODE_GRAY PIXEL_MODE_GRAY}
    • + *
    • {@link #FT_PIXEL_MODE_GRAY2 PIXEL_MODE_GRAY2}
    • + *
    • {@link #FT_PIXEL_MODE_GRAY4 PIXEL_MODE_GRAY4}
    • + *
    • {@link #FT_PIXEL_MODE_LCD PIXEL_MODE_LCD}
    • + *
    • {@link #FT_PIXEL_MODE_LCD_V PIXEL_MODE_LCD_V}
    • + *
    • {@link #FT_PIXEL_MODE_BGRA PIXEL_MODE_BGRA}
    • + *
    • {@link #FT_PIXEL_MODE_MAX PIXEL_MODE_MAX}
    • + *
    + */ + public static final int + FT_PIXEL_MODE_NONE = 0, + FT_PIXEL_MODE_MONO = 1, + FT_PIXEL_MODE_GRAY = 2, + FT_PIXEL_MODE_GRAY2 = 3, + FT_PIXEL_MODE_GRAY4 = 4, + FT_PIXEL_MODE_LCD = 5, + FT_PIXEL_MODE_LCD_V = 6, + FT_PIXEL_MODE_BGRA = 7, + FT_PIXEL_MODE_MAX = 8; + + public static final int + FT_OUTLINE_CONTOURS_MAX = 0xFFFF, + FT_OUTLINE_POINTS_MAX = 0xFFFF; + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #FT_OUTLINE_NONE OUTLINE_NONE}
    • + *
    • {@link #FT_OUTLINE_OWNER OUTLINE_OWNER}
    • + *
    • {@link #FT_OUTLINE_EVEN_ODD_FILL OUTLINE_EVEN_ODD_FILL}
    • + *
    • {@link #FT_OUTLINE_REVERSE_FILL OUTLINE_REVERSE_FILL}
    • + *
    • {@link #FT_OUTLINE_IGNORE_DROPOUTS OUTLINE_IGNORE_DROPOUTS}
    • + *
    • {@link #FT_OUTLINE_SMART_DROPOUTS OUTLINE_SMART_DROPOUTS}
    • + *
    • {@link #FT_OUTLINE_INCLUDE_STUBS OUTLINE_INCLUDE_STUBS}
    • + *
    • {@link #FT_OUTLINE_OVERLAP OUTLINE_OVERLAP}
    • + *
    • {@link #FT_OUTLINE_HIGH_PRECISION OUTLINE_HIGH_PRECISION}
    • + *
    • {@link #FT_OUTLINE_SINGLE_PASS OUTLINE_SINGLE_PASS}
    • + *
    + */ + public static final int + FT_OUTLINE_NONE = 0x0, + FT_OUTLINE_OWNER = 0x1, + FT_OUTLINE_EVEN_ODD_FILL = 0x2, + FT_OUTLINE_REVERSE_FILL = 0x4, + FT_OUTLINE_IGNORE_DROPOUTS = 0x8, + FT_OUTLINE_SMART_DROPOUTS = 0x10, + FT_OUTLINE_INCLUDE_STUBS = 0x20, + FT_OUTLINE_OVERLAP = 0x40, + FT_OUTLINE_HIGH_PRECISION = 0x100, + FT_OUTLINE_SINGLE_PASS = 0x200; + + public static final int + FT_CURVE_TAG_ON = 0x01, + FT_CURVE_TAG_CONIC = 0x00, + FT_CURVE_TAG_CUBIC = 0x02, + FT_CURVE_TAG_HAS_SCANMODE = 0x04, + FT_CURVE_TAG_TOUCH_X = 0x08, + FT_CURVE_TAG_TOUCH_Y = 0x10, + FT_CURVE_TAG_TOUCH_BOTH = FT_CURVE_TAG_TOUCH_X | FT_CURVE_TAG_TOUCH_Y; + + /** + * {@code FT_Glyph_Format} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_GLYPH_FORMAT_NONE GLYPH_FORMAT_NONE}
    • + *
    • {@link #FT_GLYPH_FORMAT_COMPOSITE GLYPH_FORMAT_COMPOSITE}
    • + *
    • {@link #FT_GLYPH_FORMAT_BITMAP GLYPH_FORMAT_BITMAP}
    • + *
    • {@link #FT_GLYPH_FORMAT_OUTLINE GLYPH_FORMAT_OUTLINE}
    • + *
    • {@link #FT_GLYPH_FORMAT_PLOTTER GLYPH_FORMAT_PLOTTER}
    • + *
    • {@link #FT_GLYPH_FORMAT_SVG GLYPH_FORMAT_SVG}
    • + *
    + */ + public static final int + FT_GLYPH_FORMAT_NONE = FT_IMAGE_TAG( 0, 0, 0, 0 ), + FT_GLYPH_FORMAT_COMPOSITE = FT_IMAGE_TAG( 'c', 'o', 'm', 'p' ), + FT_GLYPH_FORMAT_BITMAP = FT_IMAGE_TAG( 'b', 'i', 't', 's' ), + FT_GLYPH_FORMAT_OUTLINE = FT_IMAGE_TAG( 'o', 'u', 't', 'l' ), + FT_GLYPH_FORMAT_PLOTTER = FT_IMAGE_TAG( 'p', 'l', 'o', 't' ), + FT_GLYPH_FORMAT_SVG = FT_IMAGE_TAG( 'S', 'V', 'G', ' ' ); + + /** + * {@code FT_RASTER_FLAG_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_RASTER_FLAG_DEFAULT RASTER_FLAG_DEFAULT}
    • + *
    • {@link #FT_RASTER_FLAG_AA RASTER_FLAG_AA}
    • + *
    • {@link #FT_RASTER_FLAG_DIRECT RASTER_FLAG_DIRECT}
    • + *
    • {@link #FT_RASTER_FLAG_CLIP RASTER_FLAG_CLIP}
    • + *
    • {@link #FT_RASTER_FLAG_SDF RASTER_FLAG_SDF}
    • + *
    + */ + public static final int + FT_RASTER_FLAG_DEFAULT = 0x0, + FT_RASTER_FLAG_AA = 0x1, + FT_RASTER_FLAG_DIRECT = 0x2, + FT_RASTER_FLAG_CLIP = 0x4, + FT_RASTER_FLAG_SDF = 0x8; + + /** + * {@code FT_LcdFilter} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_LCD_FILTER_NONE LCD_FILTER_NONE}
    • + *
    • {@link #FT_LCD_FILTER_DEFAULT LCD_FILTER_DEFAULT}
    • + *
    • {@link #FT_LCD_FILTER_LIGHT LCD_FILTER_LIGHT}
    • + *
    • {@link #FT_LCD_FILTER_LEGACY1 LCD_FILTER_LEGACY1}
    • + *
    • {@link #FT_LCD_FILTER_LEGACY LCD_FILTER_LEGACY}
    • + *
    • {@link #FT_LCD_FILTER_MAX LCD_FILTER_MAX}
    • + *
    + */ + public static final int + FT_LCD_FILTER_NONE = 0, + FT_LCD_FILTER_DEFAULT = 1, + FT_LCD_FILTER_LIGHT = 2, + FT_LCD_FILTER_LEGACY1 = 3, + FT_LCD_FILTER_LEGACY = 16, + FT_LCD_FILTER_MAX = 17; + + public static final int FT_LCD_FILTER_FIVE_TAPS = 5; + + public static final int FT_VAR_AXIS_FLAG_HIDDEN = 1; + + public static final int FT_MODULE_FONT_DRIVER = 1; + + public static final int FT_MODULE_RENDERER = 2; + + public static final int FT_MODULE_HINTER = 4; + + public static final int FT_MODULE_STYLER = 8; + + public static final int FT_MODULE_DRIVER_SCALABLE = 0x100; + + public static final int FT_MODULE_DRIVER_NO_OUTLINES = 0x200; + + public static final int FT_MODULE_DRIVER_HAS_HINTER = 0x400; + + public static final int FT_MODULE_DRIVER_HINTS_LIGHTLY = 0x800; + + public static final int FT_DEBUG_HOOK_TRUETYPE = 0; + + /** + * {@code FT_TrueTypeEngineType} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_TRUETYPE_ENGINE_TYPE_NONE TRUETYPE_ENGINE_TYPE_NONE}
    • + *
    • {@link #FT_TRUETYPE_ENGINE_TYPE_UNPATENTED TRUETYPE_ENGINE_TYPE_UNPATENTED}
    • + *
    • {@link #FT_TRUETYPE_ENGINE_TYPE_PATENTED TRUETYPE_ENGINE_TYPE_PATENTED}
    • + *
    + */ + public static final int + FT_TRUETYPE_ENGINE_TYPE_NONE = 0, + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED = 1, + FT_TRUETYPE_ENGINE_TYPE_PATENTED = 2; + + /** + * {@code FT_Mod_Err_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_Mod_Err_Base Mod_Err_Base}
    • + *
    • {@link #FT_Mod_Err_Autofit Mod_Err_Autofit}
    • + *
    • {@link #FT_Mod_Err_BDF Mod_Err_BDF}
    • + *
    • {@link #FT_Mod_Err_Bzip2 Mod_Err_Bzip2}
    • + *
    • {@link #FT_Mod_Err_Cache Mod_Err_Cache}
    • + *
    • {@link #FT_Mod_Err_CFF Mod_Err_CFF}
    • + *
    • {@link #FT_Mod_Err_CID Mod_Err_CID}
    • + *
    • {@link #FT_Mod_Err_Gzip Mod_Err_Gzip}
    • + *
    • {@link #FT_Mod_Err_LZW Mod_Err_LZW}
    • + *
    • {@link #FT_Mod_Err_OTvalid Mod_Err_OTvalid}
    • + *
    • {@link #FT_Mod_Err_PCF Mod_Err_PCF}
    • + *
    • {@link #FT_Mod_Err_PFR Mod_Err_PFR}
    • + *
    • {@link #FT_Mod_Err_PSaux Mod_Err_PSaux}
    • + *
    • {@link #FT_Mod_Err_PShinter Mod_Err_PShinter}
    • + *
    • {@link #FT_Mod_Err_PSnames Mod_Err_PSnames}
    • + *
    • {@link #FT_Mod_Err_Raster Mod_Err_Raster}
    • + *
    • {@link #FT_Mod_Err_SFNT Mod_Err_SFNT}
    • + *
    • {@link #FT_Mod_Err_Smooth Mod_Err_Smooth}
    • + *
    • {@link #FT_Mod_Err_TrueType Mod_Err_TrueType}
    • + *
    • {@link #FT_Mod_Err_Type1 Mod_Err_Type1}
    • + *
    • {@link #FT_Mod_Err_Type42 Mod_Err_Type42}
    • + *
    • {@link #FT_Mod_Err_Winfonts Mod_Err_Winfonts}
    • + *
    • {@link #FT_Mod_Err_GXvalid Mod_Err_GXvalid}
    • + *
    • {@link #FT_Mod_Err_Sdf Mod_Err_Sdf}
    • + *
    • {@link #FT_Mod_Err_Max Mod_Err_Max}
    • + *
    + */ + public static final int + FT_Mod_Err_Base = 0x00, + FT_Mod_Err_Autofit = 0x100, + FT_Mod_Err_BDF = 0x200, + FT_Mod_Err_Bzip2 = 0x300, + FT_Mod_Err_Cache = 0x400, + FT_Mod_Err_CFF = 0x500, + FT_Mod_Err_CID = 0x600, + FT_Mod_Err_Gzip = 0x700, + FT_Mod_Err_LZW = 0x800, + FT_Mod_Err_OTvalid = 0x900, + FT_Mod_Err_PCF = 0xA00, + FT_Mod_Err_PFR = 0xB00, + FT_Mod_Err_PSaux = 0xC00, + FT_Mod_Err_PShinter = 0xD00, + FT_Mod_Err_PSnames = 0xE00, + FT_Mod_Err_Raster = 0xF00, + FT_Mod_Err_SFNT = 0x1000, + FT_Mod_Err_Smooth = 0x1100, + FT_Mod_Err_TrueType = 0x1200, + FT_Mod_Err_Type1 = 0x1300, + FT_Mod_Err_Type42 = 0x1400, + FT_Mod_Err_Winfonts = 0x1500, + FT_Mod_Err_GXvalid = 0x1600, + FT_Mod_Err_Sdf = 0x1700, + FT_Mod_Err_Max = FT_Mod_Err_Sdf + 1; + + /** + * {@code FT_VALIDATE_OTXXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_VALIDATE_BASE VALIDATE_BASE}
    • + *
    • {@link #FT_VALIDATE_GDEF VALIDATE_GDEF}
    • + *
    • {@link #FT_VALIDATE_GPOS VALIDATE_GPOS}
    • + *
    • {@link #FT_VALIDATE_GSUB VALIDATE_GSUB}
    • + *
    • {@link #FT_VALIDATE_JSTF VALIDATE_JSTF}
    • + *
    • {@link #FT_VALIDATE_MATH VALIDATE_MATH}
    • + *
    • {@link #FT_VALIDATE_OT VALIDATE_OT}
    • + *
    + */ + public static final int + FT_VALIDATE_BASE = 0x0100, + FT_VALIDATE_GDEF = 0x0200, + FT_VALIDATE_GPOS = 0x0400, + FT_VALIDATE_GSUB = 0x0800, + FT_VALIDATE_JSTF = 0x1000, + FT_VALIDATE_MATH = 0x2000, + FT_VALIDATE_OT = + FT_VALIDATE_BASE | + FT_VALIDATE_GDEF | + FT_VALIDATE_GPOS | + FT_VALIDATE_GSUB | + FT_VALIDATE_JSTF | + FT_VALIDATE_MATH; + + /** + * {@code FT_Orientation} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_ORIENTATION_TRUETYPE ORIENTATION_TRUETYPE}
    • + *
    • {@link #FT_ORIENTATION_POSTSCRIPT ORIENTATION_POSTSCRIPT}
    • + *
    • {@link #FT_ORIENTATION_FILL_RIGHT ORIENTATION_FILL_RIGHT}
    • + *
    • {@link #FT_ORIENTATION_FILL_LEFT ORIENTATION_FILL_LEFT}
    • + *
    • {@link #FT_ORIENTATION_NONE ORIENTATION_NONE}
    • + *
    + */ + public static final int + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, + FT_ORIENTATION_NONE = 2; + + public static final int + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY = FT_MAKE_TAG( 'i', 'g', 'p', 'f' ), + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY = FT_MAKE_TAG( 'i', 'g', 'p', 's' ), + FT_PARAM_TAG_INCREMENTAL = FT_MAKE_TAG( 'i', 'n', 'c', 'r' ), + FT_PARAM_TAG_IGNORE_SBIX = FT_MAKE_TAG( 'i', 's', 'b', 'x' ), + FT_PARAM_TAG_LCD_FILTER_WEIGHTS = FT_MAKE_TAG( 'l', 'c', 'd', 'f' ), + FT_PARAM_TAG_RANDOM_SEED = FT_MAKE_TAG( 's', 'e', 'e', 'd' ), + FT_PARAM_TAG_STEM_DARKENING = FT_MAKE_TAG( 'd', 'a', 'r', 'k' ), + FT_PARAM_TAG_UNPATENTED_HINTING = FT_MAKE_TAG( 'u', 'n', 'p', 'a' ); + + /** + * {@code FT_Stroker_LineJoin} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_STROKER_LINEJOIN_ROUND STROKER_LINEJOIN_ROUND}
    • + *
    • {@link #FT_STROKER_LINEJOIN_BEVEL STROKER_LINEJOIN_BEVEL}
    • + *
    • {@link #FT_STROKER_LINEJOIN_MITER_VARIABLE STROKER_LINEJOIN_MITER_VARIABLE}
    • + *
    • {@link #FT_STROKER_LINEJOIN_MITER STROKER_LINEJOIN_MITER}
    • + *
    • {@link #FT_STROKER_LINEJOIN_MITER_FIXED STROKER_LINEJOIN_MITER_FIXED}
    • + *
    + */ + public static final int + FT_STROKER_LINEJOIN_ROUND = 0, + FT_STROKER_LINEJOIN_BEVEL = 1, + FT_STROKER_LINEJOIN_MITER_VARIABLE = 2, + FT_STROKER_LINEJOIN_MITER = FT_STROKER_LINEJOIN_MITER_VARIABLE, + FT_STROKER_LINEJOIN_MITER_FIXED = 3; + + /** + * {@code FT_Stroker_LineCap} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_STROKER_LINECAP_BUTT STROKER_LINECAP_BUTT}
    • + *
    • {@link #FT_STROKER_LINECAP_ROUND STROKER_LINECAP_ROUND}
    • + *
    • {@link #FT_STROKER_LINECAP_SQUARE STROKER_LINECAP_SQUARE}
    • + *
    + */ + public static final int + FT_STROKER_LINECAP_BUTT = 0, + FT_STROKER_LINECAP_ROUND = 1, + FT_STROKER_LINECAP_SQUARE = 2; + + /** + * {@code FT_StrokerBorder} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_STROKER_BORDER_LEFT STROKER_BORDER_LEFT}
    • + *
    • {@link #FT_STROKER_BORDER_RIGHT STROKER_BORDER_RIGHT}
    • + *
    + */ + public static final int + FT_STROKER_BORDER_LEFT = 0, + FT_STROKER_BORDER_RIGHT = 1; + + public static final int + FT_ANGLE_PI = 180 << 16, + FT_ANGLE_2PI = FT_ANGLE_PI * 2, + FT_ANGLE_PI2 = FT_ANGLE_PI / 2, + FT_ANGLE_PI4 = FT_ANGLE_PI / 4; + + /** + * {@code T1_Blend_Flags} + * + *
    Enum values:
    + * + *
      + *
    • {@link #T1_BLEND_UNDERLINE_POSITION T1_BLEND_UNDERLINE_POSITION}
    • + *
    • {@link #T1_BLEND_UNDERLINE_THICKNESS T1_BLEND_UNDERLINE_THICKNESS}
    • + *
    • {@link #T1_BLEND_ITALIC_ANGLE T1_BLEND_ITALIC_ANGLE}
    • + *
    • {@link #T1_BLEND_BLUE_VALUES T1_BLEND_BLUE_VALUES}
    • + *
    • {@link #T1_BLEND_OTHER_BLUES T1_BLEND_OTHER_BLUES}
    • + *
    • {@link #T1_BLEND_STANDARD_WIDTH T1_BLEND_STANDARD_WIDTH}
    • + *
    • {@link #T1_BLEND_STANDARD_HEIGHT T1_BLEND_STANDARD_HEIGHT}
    • + *
    • {@link #T1_BLEND_STEM_SNAP_WIDTHS T1_BLEND_STEM_SNAP_WIDTHS}
    • + *
    • {@link #T1_BLEND_STEM_SNAP_HEIGHTS T1_BLEND_STEM_SNAP_HEIGHTS}
    • + *
    • {@link #T1_BLEND_BLUE_SCALE T1_BLEND_BLUE_SCALE}
    • + *
    • {@link #T1_BLEND_BLUE_SHIFT T1_BLEND_BLUE_SHIFT}
    • + *
    • {@link #T1_BLEND_FAMILY_BLUES T1_BLEND_FAMILY_BLUES}
    • + *
    • {@link #T1_BLEND_FAMILY_OTHER_BLUES T1_BLEND_FAMILY_OTHER_BLUES}
    • + *
    • {@link #T1_BLEND_FORCE_BOLD T1_BLEND_FORCE_BOLD}
    • + *
    • {@link #T1_BLEND_MAX T1_BLEND_MAX}
    • + *
    + */ + public static final int + T1_BLEND_UNDERLINE_POSITION = 0, + T1_BLEND_UNDERLINE_THICKNESS = 1, + T1_BLEND_ITALIC_ANGLE = 2, + T1_BLEND_BLUE_VALUES = 3, + T1_BLEND_OTHER_BLUES = 4, + T1_BLEND_STANDARD_WIDTH = 5, + T1_BLEND_STANDARD_HEIGHT = 6, + T1_BLEND_STEM_SNAP_WIDTHS = 7, + T1_BLEND_STEM_SNAP_HEIGHTS = 8, + T1_BLEND_BLUE_SCALE = 9, + T1_BLEND_BLUE_SHIFT = 10, + T1_BLEND_FAMILY_BLUES = 11, + T1_BLEND_FAMILY_OTHER_BLUES = 12, + T1_BLEND_FORCE_BOLD = 13, + T1_BLEND_MAX = 14; + + public static final int T1_MAX_MM_DESIGNS = 16; + + public static final int T1_MAX_MM_AXIS = 4; + + public static final int T1_MAX_MM_MAP_POINTS = 20; + + /** + * {@code T1_EncodingType} + * + *
    Enum values:
    + * + *
      + *
    • {@link #T1_ENCODING_TYPE_NONE T1_ENCODING_TYPE_NONE}
    • + *
    • {@link #T1_ENCODING_TYPE_ARRAY T1_ENCODING_TYPE_ARRAY}
    • + *
    • {@link #T1_ENCODING_TYPE_STANDARD T1_ENCODING_TYPE_STANDARD}
    • + *
    • {@link #T1_ENCODING_TYPE_ISOLATIN1 T1_ENCODING_TYPE_ISOLATIN1}
    • + *
    • {@link #T1_ENCODING_TYPE_EXPERT T1_ENCODING_TYPE_EXPERT}
    • + *
    + */ + public static final int + T1_ENCODING_TYPE_NONE = 0, + T1_ENCODING_TYPE_ARRAY = 1, + T1_ENCODING_TYPE_STANDARD = 2, + T1_ENCODING_TYPE_ISOLATIN1 = 3, + T1_ENCODING_TYPE_EXPERT = 4; + + /** + * {@code PS_Dict_Keys} + * + *
    Enum values:
    + * + *
      + *
    • {@link #PS_DICT_FONT_TYPE PS_DICT_FONT_TYPE}
    • + *
    • {@link #PS_DICT_FONT_MATRIX PS_DICT_FONT_MATRIX}
    • + *
    • {@link #PS_DICT_FONT_BBOX PS_DICT_FONT_BBOX}
    • + *
    • {@link #PS_DICT_PAINT_TYPE PS_DICT_PAINT_TYPE}
    • + *
    • {@link #PS_DICT_FONT_NAME PS_DICT_FONT_NAME}
    • + *
    • {@link #PS_DICT_UNIQUE_ID PS_DICT_UNIQUE_ID}
    • + *
    • {@link #PS_DICT_NUM_CHAR_STRINGS PS_DICT_NUM_CHAR_STRINGS}
    • + *
    • {@link #PS_DICT_CHAR_STRING_KEY PS_DICT_CHAR_STRING_KEY}
    • + *
    • {@link #PS_DICT_CHAR_STRING PS_DICT_CHAR_STRING}
    • + *
    • {@link #PS_DICT_ENCODING_TYPE PS_DICT_ENCODING_TYPE}
    • + *
    • {@link #PS_DICT_ENCODING_ENTRY PS_DICT_ENCODING_ENTRY}
    • + *
    • {@link #PS_DICT_NUM_SUBRS PS_DICT_NUM_SUBRS}
    • + *
    • {@link #PS_DICT_SUBR PS_DICT_SUBR}
    • + *
    • {@link #PS_DICT_STD_HW PS_DICT_STD_HW}
    • + *
    • {@link #PS_DICT_STD_VW PS_DICT_STD_VW}
    • + *
    • {@link #PS_DICT_NUM_BLUE_VALUES PS_DICT_NUM_BLUE_VALUES}
    • + *
    • {@link #PS_DICT_BLUE_VALUE PS_DICT_BLUE_VALUE}
    • + *
    • {@link #PS_DICT_BLUE_FUZZ PS_DICT_BLUE_FUZZ}
    • + *
    • {@link #PS_DICT_NUM_OTHER_BLUES PS_DICT_NUM_OTHER_BLUES}
    • + *
    • {@link #PS_DICT_OTHER_BLUE PS_DICT_OTHER_BLUE}
    • + *
    • {@link #PS_DICT_NUM_FAMILY_BLUES PS_DICT_NUM_FAMILY_BLUES}
    • + *
    • {@link #PS_DICT_FAMILY_BLUE PS_DICT_FAMILY_BLUE}
    • + *
    • {@link #PS_DICT_NUM_FAMILY_OTHER_BLUES PS_DICT_NUM_FAMILY_OTHER_BLUES}
    • + *
    • {@link #PS_DICT_FAMILY_OTHER_BLUE PS_DICT_FAMILY_OTHER_BLUE}
    • + *
    • {@link #PS_DICT_BLUE_SCALE PS_DICT_BLUE_SCALE}
    • + *
    • {@link #PS_DICT_BLUE_SHIFT PS_DICT_BLUE_SHIFT}
    • + *
    • {@link #PS_DICT_NUM_STEM_SNAP_H PS_DICT_NUM_STEM_SNAP_H}
    • + *
    • {@link #PS_DICT_STEM_SNAP_H PS_DICT_STEM_SNAP_H}
    • + *
    • {@link #PS_DICT_NUM_STEM_SNAP_V PS_DICT_NUM_STEM_SNAP_V}
    • + *
    • {@link #PS_DICT_STEM_SNAP_V PS_DICT_STEM_SNAP_V}
    • + *
    • {@link #PS_DICT_FORCE_BOLD PS_DICT_FORCE_BOLD}
    • + *
    • {@link #PS_DICT_RND_STEM_UP PS_DICT_RND_STEM_UP}
    • + *
    • {@link #PS_DICT_MIN_FEATURE PS_DICT_MIN_FEATURE}
    • + *
    • {@link #PS_DICT_LEN_IV PS_DICT_LEN_IV}
    • + *
    • {@link #PS_DICT_PASSWORD PS_DICT_PASSWORD}
    • + *
    • {@link #PS_DICT_LANGUAGE_GROUP PS_DICT_LANGUAGE_GROUP}
    • + *
    • {@link #PS_DICT_VERSION PS_DICT_VERSION}
    • + *
    • {@link #PS_DICT_NOTICE PS_DICT_NOTICE}
    • + *
    • {@link #PS_DICT_FULL_NAME PS_DICT_FULL_NAME}
    • + *
    • {@link #PS_DICT_FAMILY_NAME PS_DICT_FAMILY_NAME}
    • + *
    • {@link #PS_DICT_WEIGHT PS_DICT_WEIGHT}
    • + *
    • {@link #PS_DICT_IS_FIXED_PITCH PS_DICT_IS_FIXED_PITCH}
    • + *
    • {@link #PS_DICT_UNDERLINE_POSITION PS_DICT_UNDERLINE_POSITION}
    • + *
    • {@link #PS_DICT_UNDERLINE_THICKNESS PS_DICT_UNDERLINE_THICKNESS}
    • + *
    • {@link #PS_DICT_FS_TYPE PS_DICT_FS_TYPE}
    • + *
    • {@link #PS_DICT_ITALIC_ANGLE PS_DICT_ITALIC_ANGLE}
    • + *
    • {@link #PS_DICT_MAX PS_DICT_MAX}
    • + *
    + */ + public static final int + PS_DICT_FONT_TYPE = 0, + PS_DICT_FONT_MATRIX = 1, + PS_DICT_FONT_BBOX = 2, + PS_DICT_PAINT_TYPE = 3, + PS_DICT_FONT_NAME = 4, + PS_DICT_UNIQUE_ID = 5, + PS_DICT_NUM_CHAR_STRINGS = 6, + PS_DICT_CHAR_STRING_KEY = 7, + PS_DICT_CHAR_STRING = 8, + PS_DICT_ENCODING_TYPE = 9, + PS_DICT_ENCODING_ENTRY = 10, + PS_DICT_NUM_SUBRS = 11, + PS_DICT_SUBR = 12, + PS_DICT_STD_HW = 13, + PS_DICT_STD_VW = 14, + PS_DICT_NUM_BLUE_VALUES = 15, + PS_DICT_BLUE_VALUE = 16, + PS_DICT_BLUE_FUZZ = 17, + PS_DICT_NUM_OTHER_BLUES = 18, + PS_DICT_OTHER_BLUE = 19, + PS_DICT_NUM_FAMILY_BLUES = 20, + PS_DICT_FAMILY_BLUE = 21, + PS_DICT_NUM_FAMILY_OTHER_BLUES = 22, + PS_DICT_FAMILY_OTHER_BLUE = 23, + PS_DICT_BLUE_SCALE = 24, + PS_DICT_BLUE_SHIFT = 25, + PS_DICT_NUM_STEM_SNAP_H = 26, + PS_DICT_STEM_SNAP_H = 27, + PS_DICT_NUM_STEM_SNAP_V = 28, + PS_DICT_STEM_SNAP_V = 29, + PS_DICT_FORCE_BOLD = 30, + PS_DICT_RND_STEM_UP = 31, + PS_DICT_MIN_FEATURE = 32, + PS_DICT_LEN_IV = 33, + PS_DICT_PASSWORD = 34, + PS_DICT_LANGUAGE_GROUP = 35, + PS_DICT_VERSION = 36, + PS_DICT_NOTICE = 37, + PS_DICT_FULL_NAME = 38, + PS_DICT_FAMILY_NAME = 39, + PS_DICT_WEIGHT = 40, + PS_DICT_IS_FIXED_PITCH = 41, + PS_DICT_UNDERLINE_POSITION = 42, + PS_DICT_UNDERLINE_THICKNESS = 43, + PS_DICT_FS_TYPE = 44, + PS_DICT_ITALIC_ANGLE = 45, + PS_DICT_MAX = PS_DICT_ITALIC_ANGLE; + + /** + * {@code TT_PLATFORM_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #TT_PLATFORM_APPLE_UNICODE TT_PLATFORM_APPLE_UNICODE}
    • + *
    • {@link #TT_PLATFORM_MACINTOSH TT_PLATFORM_MACINTOSH}
    • + *
    • {@link #TT_PLATFORM_ISO TT_PLATFORM_ISO}
    • + *
    • {@link #TT_PLATFORM_MICROSOFT TT_PLATFORM_MICROSOFT}
    • + *
    • {@link #TT_PLATFORM_CUSTOM TT_PLATFORM_CUSTOM}
    • + *
    • {@link #TT_PLATFORM_ADOBE TT_PLATFORM_ADOBE}
    • + *
    + */ + public static final int + TT_PLATFORM_APPLE_UNICODE = 0, + TT_PLATFORM_MACINTOSH = 1, + TT_PLATFORM_ISO = 2, + TT_PLATFORM_MICROSOFT = 3, + TT_PLATFORM_CUSTOM = 4, + TT_PLATFORM_ADOBE = 7; + + /** + * {@code TT_APPLE_ID_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #TT_APPLE_ID_DEFAULT TT_APPLE_ID_DEFAULT}
    • + *
    • {@link #TT_APPLE_ID_UNICODE_1_1 TT_APPLE_ID_UNICODE_1_1}
    • + *
    • {@link #TT_APPLE_ID_ISO_10646 TT_APPLE_ID_ISO_10646}
    • + *
    • {@link #TT_APPLE_ID_UNICODE_2_0 TT_APPLE_ID_UNICODE_2_0}
    • + *
    • {@link #TT_APPLE_ID_UNICODE_32 TT_APPLE_ID_UNICODE_32}
    • + *
    • {@link #TT_APPLE_ID_VARIANT_SELECTOR TT_APPLE_ID_VARIANT_SELECTOR}
    • + *
    • {@link #TT_APPLE_ID_FULL_UNICODE TT_APPLE_ID_FULL_UNICODE}
    • + *
    + */ + public static final int + TT_APPLE_ID_DEFAULT = 0, + TT_APPLE_ID_UNICODE_1_1 = 1, + TT_APPLE_ID_ISO_10646 = 2, + TT_APPLE_ID_UNICODE_2_0 = 3, + TT_APPLE_ID_UNICODE_32 = 4, + TT_APPLE_ID_VARIANT_SELECTOR = 5, + TT_APPLE_ID_FULL_UNICODE = 6; + + /** + * {@code TT_MAC_ID_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #TT_MAC_ID_ROMAN TT_MAC_ID_ROMAN}
    • + *
    • {@link #TT_MAC_ID_JAPANESE TT_MAC_ID_JAPANESE}
    • + *
    • {@link #TT_MAC_ID_TRADITIONAL_CHINESE TT_MAC_ID_TRADITIONAL_CHINESE}
    • + *
    • {@link #TT_MAC_ID_KOREAN TT_MAC_ID_KOREAN}
    • + *
    • {@link #TT_MAC_ID_ARABIC TT_MAC_ID_ARABIC}
    • + *
    • {@link #TT_MAC_ID_HEBREW TT_MAC_ID_HEBREW}
    • + *
    • {@link #TT_MAC_ID_GREEK TT_MAC_ID_GREEK}
    • + *
    • {@link #TT_MAC_ID_RUSSIAN TT_MAC_ID_RUSSIAN}
    • + *
    • {@link #TT_MAC_ID_RSYMBOL TT_MAC_ID_RSYMBOL}
    • + *
    • {@link #TT_MAC_ID_DEVANAGARI TT_MAC_ID_DEVANAGARI}
    • + *
    • {@link #TT_MAC_ID_GURMUKHI TT_MAC_ID_GURMUKHI}
    • + *
    • {@link #TT_MAC_ID_GUJARATI TT_MAC_ID_GUJARATI}
    • + *
    • {@link #TT_MAC_ID_ORIYA TT_MAC_ID_ORIYA}
    • + *
    • {@link #TT_MAC_ID_BENGALI TT_MAC_ID_BENGALI}
    • + *
    • {@link #TT_MAC_ID_TAMIL TT_MAC_ID_TAMIL}
    • + *
    • {@link #TT_MAC_ID_TELUGU TT_MAC_ID_TELUGU}
    • + *
    • {@link #TT_MAC_ID_KANNADA TT_MAC_ID_KANNADA}
    • + *
    • {@link #TT_MAC_ID_MALAYALAM TT_MAC_ID_MALAYALAM}
    • + *
    • {@link #TT_MAC_ID_SINHALESE TT_MAC_ID_SINHALESE}
    • + *
    • {@link #TT_MAC_ID_BURMESE TT_MAC_ID_BURMESE}
    • + *
    • {@link #TT_MAC_ID_KHMER TT_MAC_ID_KHMER}
    • + *
    • {@link #TT_MAC_ID_THAI TT_MAC_ID_THAI}
    • + *
    • {@link #TT_MAC_ID_LAOTIAN TT_MAC_ID_LAOTIAN}
    • + *
    • {@link #TT_MAC_ID_GEORGIAN TT_MAC_ID_GEORGIAN}
    • + *
    • {@link #TT_MAC_ID_ARMENIAN TT_MAC_ID_ARMENIAN}
    • + *
    • {@link #TT_MAC_ID_MALDIVIAN TT_MAC_ID_MALDIVIAN}
    • + *
    • {@link #TT_MAC_ID_SIMPLIFIED_CHINESE TT_MAC_ID_SIMPLIFIED_CHINESE}
    • + *
    • {@link #TT_MAC_ID_TIBETAN TT_MAC_ID_TIBETAN}
    • + *
    • {@link #TT_MAC_ID_MONGOLIAN TT_MAC_ID_MONGOLIAN}
    • + *
    • {@link #TT_MAC_ID_GEEZ TT_MAC_ID_GEEZ}
    • + *
    • {@link #TT_MAC_ID_SLAVIC TT_MAC_ID_SLAVIC}
    • + *
    • {@link #TT_MAC_ID_VIETNAMESE TT_MAC_ID_VIETNAMESE}
    • + *
    • {@link #TT_MAC_ID_SINDHI TT_MAC_ID_SINDHI}
    • + *
    • {@link #TT_MAC_ID_UNINTERP TT_MAC_ID_UNINTERP}
    • + *
    + */ + public static final int + TT_MAC_ID_ROMAN = 0, + TT_MAC_ID_JAPANESE = 1, + TT_MAC_ID_TRADITIONAL_CHINESE = 2, + TT_MAC_ID_KOREAN = 3, + TT_MAC_ID_ARABIC = 4, + TT_MAC_ID_HEBREW = 5, + TT_MAC_ID_GREEK = 6, + TT_MAC_ID_RUSSIAN = 7, + TT_MAC_ID_RSYMBOL = 8, + TT_MAC_ID_DEVANAGARI = 9, + TT_MAC_ID_GURMUKHI = 10, + TT_MAC_ID_GUJARATI = 11, + TT_MAC_ID_ORIYA = 12, + TT_MAC_ID_BENGALI = 13, + TT_MAC_ID_TAMIL = 14, + TT_MAC_ID_TELUGU = 15, + TT_MAC_ID_KANNADA = 16, + TT_MAC_ID_MALAYALAM = 17, + TT_MAC_ID_SINHALESE = 18, + TT_MAC_ID_BURMESE = 19, + TT_MAC_ID_KHMER = 20, + TT_MAC_ID_THAI = 21, + TT_MAC_ID_LAOTIAN = 22, + TT_MAC_ID_GEORGIAN = 23, + TT_MAC_ID_ARMENIAN = 24, + TT_MAC_ID_MALDIVIAN = 25, + TT_MAC_ID_SIMPLIFIED_CHINESE = 26, + TT_MAC_ID_TIBETAN = 27, + TT_MAC_ID_MONGOLIAN = 28, + TT_MAC_ID_GEEZ = 29, + TT_MAC_ID_SLAVIC = 30, + TT_MAC_ID_VIETNAMESE = 31, + TT_MAC_ID_SINDHI = 32, + TT_MAC_ID_UNINTERP = 33; + + /** + * {@code TT_ISO_ID_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #TT_ISO_ID_7BIT_ASCII TT_ISO_ID_7BIT_ASCII}
    • + *
    • {@link #TT_ISO_ID_10646 TT_ISO_ID_10646}
    • + *
    • {@link #TT_ISO_ID_8859_1 TT_ISO_ID_8859_1}
    • + *
    + */ + public static final int + TT_ISO_ID_7BIT_ASCII = 0, + TT_ISO_ID_10646 = 1, + TT_ISO_ID_8859_1 = 2; + + /** + * {@code TT_MS_ID_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #TT_MS_ID_SYMBOL_CS TT_MS_ID_SYMBOL_CS}
    • + *
    • {@link #TT_MS_ID_UNICODE_CS TT_MS_ID_UNICODE_CS}
    • + *
    • {@link #TT_MS_ID_SJIS TT_MS_ID_SJIS}
    • + *
    • {@link #TT_MS_ID_PRC TT_MS_ID_PRC}
    • + *
    • {@link #TT_MS_ID_BIG_5 TT_MS_ID_BIG_5}
    • + *
    • {@link #TT_MS_ID_WANSUNG TT_MS_ID_WANSUNG}
    • + *
    • {@link #TT_MS_ID_JOHAB TT_MS_ID_JOHAB}
    • + *
    • {@link #TT_MS_ID_UCS_4 TT_MS_ID_UCS_4}
    • + *
    + */ + public static final int + TT_MS_ID_SYMBOL_CS = 0, + TT_MS_ID_UNICODE_CS = 1, + TT_MS_ID_SJIS = 2, + TT_MS_ID_PRC = 3, + TT_MS_ID_BIG_5 = 4, + TT_MS_ID_WANSUNG = 5, + TT_MS_ID_JOHAB = 6, + TT_MS_ID_UCS_4 = 10; + + /** + * {@code TT_ADOBE_ID_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #TT_ADOBE_ID_STANDARD TT_ADOBE_ID_STANDARD}
    • + *
    • {@link #TT_ADOBE_ID_EXPERT TT_ADOBE_ID_EXPERT}
    • + *
    • {@link #TT_ADOBE_ID_CUSTOM TT_ADOBE_ID_CUSTOM}
    • + *
    • {@link #TT_ADOBE_ID_LATIN_1 TT_ADOBE_ID_LATIN_1}
    • + *
    + */ + public static final int + TT_ADOBE_ID_STANDARD = 0, + TT_ADOBE_ID_EXPERT = 1, + TT_ADOBE_ID_CUSTOM = 2, + TT_ADOBE_ID_LATIN_1 = 3; + + /** + * {@code TT_MAC_LANGID_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #TT_MAC_LANGID_ENGLISH TT_MAC_LANGID_ENGLISH}
    • + *
    • {@link #TT_MAC_LANGID_FRENCH TT_MAC_LANGID_FRENCH}
    • + *
    • {@link #TT_MAC_LANGID_GERMAN TT_MAC_LANGID_GERMAN}
    • + *
    • {@link #TT_MAC_LANGID_ITALIAN TT_MAC_LANGID_ITALIAN}
    • + *
    • {@link #TT_MAC_LANGID_DUTCH TT_MAC_LANGID_DUTCH}
    • + *
    • {@link #TT_MAC_LANGID_SWEDISH TT_MAC_LANGID_SWEDISH}
    • + *
    • {@link #TT_MAC_LANGID_SPANISH TT_MAC_LANGID_SPANISH}
    • + *
    • {@link #TT_MAC_LANGID_DANISH TT_MAC_LANGID_DANISH}
    • + *
    • {@link #TT_MAC_LANGID_PORTUGUESE TT_MAC_LANGID_PORTUGUESE}
    • + *
    • {@link #TT_MAC_LANGID_NORWEGIAN TT_MAC_LANGID_NORWEGIAN}
    • + *
    • {@link #TT_MAC_LANGID_HEBREW TT_MAC_LANGID_HEBREW}
    • + *
    • {@link #TT_MAC_LANGID_JAPANESE TT_MAC_LANGID_JAPANESE}
    • + *
    • {@link #TT_MAC_LANGID_ARABIC TT_MAC_LANGID_ARABIC}
    • + *
    • {@link #TT_MAC_LANGID_FINNISH TT_MAC_LANGID_FINNISH}
    • + *
    • {@link #TT_MAC_LANGID_GREEK TT_MAC_LANGID_GREEK}
    • + *
    • {@link #TT_MAC_LANGID_ICELANDIC TT_MAC_LANGID_ICELANDIC}
    • + *
    • {@link #TT_MAC_LANGID_MALTESE TT_MAC_LANGID_MALTESE}
    • + *
    • {@link #TT_MAC_LANGID_TURKISH TT_MAC_LANGID_TURKISH}
    • + *
    • {@link #TT_MAC_LANGID_CROATIAN TT_MAC_LANGID_CROATIAN}
    • + *
    • {@link #TT_MAC_LANGID_CHINESE_TRADITIONAL TT_MAC_LANGID_CHINESE_TRADITIONAL}
    • + *
    • {@link #TT_MAC_LANGID_URDU TT_MAC_LANGID_URDU}
    • + *
    • {@link #TT_MAC_LANGID_HINDI TT_MAC_LANGID_HINDI}
    • + *
    • {@link #TT_MAC_LANGID_THAI TT_MAC_LANGID_THAI}
    • + *
    • {@link #TT_MAC_LANGID_KOREAN TT_MAC_LANGID_KOREAN}
    • + *
    • {@link #TT_MAC_LANGID_LITHUANIAN TT_MAC_LANGID_LITHUANIAN}
    • + *
    • {@link #TT_MAC_LANGID_POLISH TT_MAC_LANGID_POLISH}
    • + *
    • {@link #TT_MAC_LANGID_HUNGARIAN TT_MAC_LANGID_HUNGARIAN}
    • + *
    • {@link #TT_MAC_LANGID_ESTONIAN TT_MAC_LANGID_ESTONIAN}
    • + *
    • {@link #TT_MAC_LANGID_LETTISH TT_MAC_LANGID_LETTISH}
    • + *
    • {@link #TT_MAC_LANGID_SAAMISK TT_MAC_LANGID_SAAMISK}
    • + *
    • {@link #TT_MAC_LANGID_FAEROESE TT_MAC_LANGID_FAEROESE}
    • + *
    • {@link #TT_MAC_LANGID_FARSI TT_MAC_LANGID_FARSI}
    • + *
    • {@link #TT_MAC_LANGID_RUSSIAN TT_MAC_LANGID_RUSSIAN}
    • + *
    • {@link #TT_MAC_LANGID_CHINESE_SIMPLIFIED TT_MAC_LANGID_CHINESE_SIMPLIFIED}
    • + *
    • {@link #TT_MAC_LANGID_FLEMISH TT_MAC_LANGID_FLEMISH}
    • + *
    • {@link #TT_MAC_LANGID_IRISH TT_MAC_LANGID_IRISH}
    • + *
    • {@link #TT_MAC_LANGID_ALBANIAN TT_MAC_LANGID_ALBANIAN}
    • + *
    • {@link #TT_MAC_LANGID_ROMANIAN TT_MAC_LANGID_ROMANIAN}
    • + *
    • {@link #TT_MAC_LANGID_CZECH TT_MAC_LANGID_CZECH}
    • + *
    • {@link #TT_MAC_LANGID_SLOVAK TT_MAC_LANGID_SLOVAK}
    • + *
    • {@link #TT_MAC_LANGID_SLOVENIAN TT_MAC_LANGID_SLOVENIAN}
    • + *
    • {@link #TT_MAC_LANGID_YIDDISH TT_MAC_LANGID_YIDDISH}
    • + *
    • {@link #TT_MAC_LANGID_SERBIAN TT_MAC_LANGID_SERBIAN}
    • + *
    • {@link #TT_MAC_LANGID_MACEDONIAN TT_MAC_LANGID_MACEDONIAN}
    • + *
    • {@link #TT_MAC_LANGID_BULGARIAN TT_MAC_LANGID_BULGARIAN}
    • + *
    • {@link #TT_MAC_LANGID_UKRAINIAN TT_MAC_LANGID_UKRAINIAN}
    • + *
    • {@link #TT_MAC_LANGID_BYELORUSSIAN TT_MAC_LANGID_BYELORUSSIAN}
    • + *
    • {@link #TT_MAC_LANGID_UZBEK TT_MAC_LANGID_UZBEK}
    • + *
    • {@link #TT_MAC_LANGID_KAZAKH TT_MAC_LANGID_KAZAKH}
    • + *
    • {@link #TT_MAC_LANGID_AZERBAIJANI TT_MAC_LANGID_AZERBAIJANI}
    • + *
    • {@link #TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT}
    • + *
    • {@link #TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT}
    • + *
    • {@link #TT_MAC_LANGID_ARMENIAN TT_MAC_LANGID_ARMENIAN}
    • + *
    • {@link #TT_MAC_LANGID_GEORGIAN TT_MAC_LANGID_GEORGIAN}
    • + *
    • {@link #TT_MAC_LANGID_MOLDAVIAN TT_MAC_LANGID_MOLDAVIAN}
    • + *
    • {@link #TT_MAC_LANGID_KIRGHIZ TT_MAC_LANGID_KIRGHIZ}
    • + *
    • {@link #TT_MAC_LANGID_TAJIKI TT_MAC_LANGID_TAJIKI}
    • + *
    • {@link #TT_MAC_LANGID_TURKMEN TT_MAC_LANGID_TURKMEN}
    • + *
    • {@link #TT_MAC_LANGID_MONGOLIAN TT_MAC_LANGID_MONGOLIAN}
    • + *
    • {@link #TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT}
    • + *
    • {@link #TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT}
    • + *
    • {@link #TT_MAC_LANGID_PASHTO TT_MAC_LANGID_PASHTO}
    • + *
    • {@link #TT_MAC_LANGID_KURDISH TT_MAC_LANGID_KURDISH}
    • + *
    • {@link #TT_MAC_LANGID_KASHMIRI TT_MAC_LANGID_KASHMIRI}
    • + *
    • {@link #TT_MAC_LANGID_SINDHI TT_MAC_LANGID_SINDHI}
    • + *
    • {@link #TT_MAC_LANGID_TIBETAN TT_MAC_LANGID_TIBETAN}
    • + *
    • {@link #TT_MAC_LANGID_NEPALI TT_MAC_LANGID_NEPALI}
    • + *
    • {@link #TT_MAC_LANGID_SANSKRIT TT_MAC_LANGID_SANSKRIT}
    • + *
    • {@link #TT_MAC_LANGID_MARATHI TT_MAC_LANGID_MARATHI}
    • + *
    • {@link #TT_MAC_LANGID_BENGALI TT_MAC_LANGID_BENGALI}
    • + *
    • {@link #TT_MAC_LANGID_ASSAMESE TT_MAC_LANGID_ASSAMESE}
    • + *
    • {@link #TT_MAC_LANGID_GUJARATI TT_MAC_LANGID_GUJARATI}
    • + *
    • {@link #TT_MAC_LANGID_PUNJABI TT_MAC_LANGID_PUNJABI}
    • + *
    • {@link #TT_MAC_LANGID_ORIYA TT_MAC_LANGID_ORIYA}
    • + *
    • {@link #TT_MAC_LANGID_MALAYALAM TT_MAC_LANGID_MALAYALAM}
    • + *
    • {@link #TT_MAC_LANGID_KANNADA TT_MAC_LANGID_KANNADA}
    • + *
    • {@link #TT_MAC_LANGID_TAMIL TT_MAC_LANGID_TAMIL}
    • + *
    • {@link #TT_MAC_LANGID_TELUGU TT_MAC_LANGID_TELUGU}
    • + *
    • {@link #TT_MAC_LANGID_SINHALESE TT_MAC_LANGID_SINHALESE}
    • + *
    • {@link #TT_MAC_LANGID_BURMESE TT_MAC_LANGID_BURMESE}
    • + *
    • {@link #TT_MAC_LANGID_KHMER TT_MAC_LANGID_KHMER}
    • + *
    • {@link #TT_MAC_LANGID_LAO TT_MAC_LANGID_LAO}
    • + *
    • {@link #TT_MAC_LANGID_VIETNAMESE TT_MAC_LANGID_VIETNAMESE}
    • + *
    • {@link #TT_MAC_LANGID_INDONESIAN TT_MAC_LANGID_INDONESIAN}
    • + *
    • {@link #TT_MAC_LANGID_TAGALOG TT_MAC_LANGID_TAGALOG}
    • + *
    • {@link #TT_MAC_LANGID_MALAY_ROMAN_SCRIPT TT_MAC_LANGID_MALAY_ROMAN_SCRIPT}
    • + *
    • {@link #TT_MAC_LANGID_MALAY_ARABIC_SCRIPT TT_MAC_LANGID_MALAY_ARABIC_SCRIPT}
    • + *
    • {@link #TT_MAC_LANGID_AMHARIC TT_MAC_LANGID_AMHARIC}
    • + *
    • {@link #TT_MAC_LANGID_TIGRINYA TT_MAC_LANGID_TIGRINYA}
    • + *
    • {@link #TT_MAC_LANGID_GALLA TT_MAC_LANGID_GALLA}
    • + *
    • {@link #TT_MAC_LANGID_SOMALI TT_MAC_LANGID_SOMALI}
    • + *
    • {@link #TT_MAC_LANGID_SWAHILI TT_MAC_LANGID_SWAHILI}
    • + *
    • {@link #TT_MAC_LANGID_RUANDA TT_MAC_LANGID_RUANDA}
    • + *
    • {@link #TT_MAC_LANGID_RUNDI TT_MAC_LANGID_RUNDI}
    • + *
    • {@link #TT_MAC_LANGID_CHEWA TT_MAC_LANGID_CHEWA}
    • + *
    • {@link #TT_MAC_LANGID_MALAGASY TT_MAC_LANGID_MALAGASY}
    • + *
    • {@link #TT_MAC_LANGID_ESPERANTO TT_MAC_LANGID_ESPERANTO}
    • + *
    • {@link #TT_MAC_LANGID_WELSH TT_MAC_LANGID_WELSH}
    • + *
    • {@link #TT_MAC_LANGID_BASQUE TT_MAC_LANGID_BASQUE}
    • + *
    • {@link #TT_MAC_LANGID_CATALAN TT_MAC_LANGID_CATALAN}
    • + *
    • {@link #TT_MAC_LANGID_LATIN TT_MAC_LANGID_LATIN}
    • + *
    • {@link #TT_MAC_LANGID_QUECHUA TT_MAC_LANGID_QUECHUA}
    • + *
    • {@link #TT_MAC_LANGID_GUARANI TT_MAC_LANGID_GUARANI}
    • + *
    • {@link #TT_MAC_LANGID_AYMARA TT_MAC_LANGID_AYMARA}
    • + *
    • {@link #TT_MAC_LANGID_TATAR TT_MAC_LANGID_TATAR}
    • + *
    • {@link #TT_MAC_LANGID_UIGHUR TT_MAC_LANGID_UIGHUR}
    • + *
    • {@link #TT_MAC_LANGID_DZONGKHA TT_MAC_LANGID_DZONGKHA}
    • + *
    • {@link #TT_MAC_LANGID_JAVANESE TT_MAC_LANGID_JAVANESE}
    • + *
    • {@link #TT_MAC_LANGID_SUNDANESE TT_MAC_LANGID_SUNDANESE}
    • + *
    • {@link #TT_MAC_LANGID_GALICIAN TT_MAC_LANGID_GALICIAN}
    • + *
    • {@link #TT_MAC_LANGID_AFRIKAANS TT_MAC_LANGID_AFRIKAANS}
    • + *
    • {@link #TT_MAC_LANGID_BRETON TT_MAC_LANGID_BRETON}
    • + *
    • {@link #TT_MAC_LANGID_INUKTITUT TT_MAC_LANGID_INUKTITUT}
    • + *
    • {@link #TT_MAC_LANGID_SCOTTISH_GAELIC TT_MAC_LANGID_SCOTTISH_GAELIC}
    • + *
    • {@link #TT_MAC_LANGID_MANX_GAELIC TT_MAC_LANGID_MANX_GAELIC}
    • + *
    • {@link #TT_MAC_LANGID_IRISH_GAELIC TT_MAC_LANGID_IRISH_GAELIC}
    • + *
    • {@link #TT_MAC_LANGID_TONGAN TT_MAC_LANGID_TONGAN}
    • + *
    • {@link #TT_MAC_LANGID_GREEK_POLYTONIC TT_MAC_LANGID_GREEK_POLYTONIC}
    • + *
    • {@link #TT_MAC_LANGID_GREELANDIC TT_MAC_LANGID_GREELANDIC}
    • + *
    • {@link #TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT}
    • + *
    + */ + public static final int + TT_MAC_LANGID_ENGLISH = 0, + TT_MAC_LANGID_FRENCH = 1, + TT_MAC_LANGID_GERMAN = 2, + TT_MAC_LANGID_ITALIAN = 3, + TT_MAC_LANGID_DUTCH = 4, + TT_MAC_LANGID_SWEDISH = 5, + TT_MAC_LANGID_SPANISH = 6, + TT_MAC_LANGID_DANISH = 7, + TT_MAC_LANGID_PORTUGUESE = 8, + TT_MAC_LANGID_NORWEGIAN = 9, + TT_MAC_LANGID_HEBREW = 10, + TT_MAC_LANGID_JAPANESE = 11, + TT_MAC_LANGID_ARABIC = 12, + TT_MAC_LANGID_FINNISH = 13, + TT_MAC_LANGID_GREEK = 14, + TT_MAC_LANGID_ICELANDIC = 15, + TT_MAC_LANGID_MALTESE = 16, + TT_MAC_LANGID_TURKISH = 17, + TT_MAC_LANGID_CROATIAN = 18, + TT_MAC_LANGID_CHINESE_TRADITIONAL = 19, + TT_MAC_LANGID_URDU = 20, + TT_MAC_LANGID_HINDI = 21, + TT_MAC_LANGID_THAI = 22, + TT_MAC_LANGID_KOREAN = 23, + TT_MAC_LANGID_LITHUANIAN = 24, + TT_MAC_LANGID_POLISH = 25, + TT_MAC_LANGID_HUNGARIAN = 26, + TT_MAC_LANGID_ESTONIAN = 27, + TT_MAC_LANGID_LETTISH = 28, + TT_MAC_LANGID_SAAMISK = 29, + TT_MAC_LANGID_FAEROESE = 30, + TT_MAC_LANGID_FARSI = 31, + TT_MAC_LANGID_RUSSIAN = 32, + TT_MAC_LANGID_CHINESE_SIMPLIFIED = 33, + TT_MAC_LANGID_FLEMISH = 34, + TT_MAC_LANGID_IRISH = 35, + TT_MAC_LANGID_ALBANIAN = 36, + TT_MAC_LANGID_ROMANIAN = 37, + TT_MAC_LANGID_CZECH = 38, + TT_MAC_LANGID_SLOVAK = 39, + TT_MAC_LANGID_SLOVENIAN = 40, + TT_MAC_LANGID_YIDDISH = 41, + TT_MAC_LANGID_SERBIAN = 42, + TT_MAC_LANGID_MACEDONIAN = 43, + TT_MAC_LANGID_BULGARIAN = 44, + TT_MAC_LANGID_UKRAINIAN = 45, + TT_MAC_LANGID_BYELORUSSIAN = 46, + TT_MAC_LANGID_UZBEK = 47, + TT_MAC_LANGID_KAZAKH = 48, + TT_MAC_LANGID_AZERBAIJANI = 49, + TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT = 50, + TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT = 51, + TT_MAC_LANGID_ARMENIAN = 52, + TT_MAC_LANGID_GEORGIAN = 53, + TT_MAC_LANGID_MOLDAVIAN = 54, + TT_MAC_LANGID_KIRGHIZ = 55, + TT_MAC_LANGID_TAJIKI = 56, + TT_MAC_LANGID_TURKMEN = 57, + TT_MAC_LANGID_MONGOLIAN = 58, + TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT = 59, + TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT = 60, + TT_MAC_LANGID_PASHTO = 61, + TT_MAC_LANGID_KURDISH = 62, + TT_MAC_LANGID_KASHMIRI = 63, + TT_MAC_LANGID_SINDHI = 64, + TT_MAC_LANGID_TIBETAN = 65, + TT_MAC_LANGID_NEPALI = 66, + TT_MAC_LANGID_SANSKRIT = 67, + TT_MAC_LANGID_MARATHI = 68, + TT_MAC_LANGID_BENGALI = 69, + TT_MAC_LANGID_ASSAMESE = 70, + TT_MAC_LANGID_GUJARATI = 71, + TT_MAC_LANGID_PUNJABI = 72, + TT_MAC_LANGID_ORIYA = 73, + TT_MAC_LANGID_MALAYALAM = 74, + TT_MAC_LANGID_KANNADA = 75, + TT_MAC_LANGID_TAMIL = 76, + TT_MAC_LANGID_TELUGU = 77, + TT_MAC_LANGID_SINHALESE = 78, + TT_MAC_LANGID_BURMESE = 79, + TT_MAC_LANGID_KHMER = 80, + TT_MAC_LANGID_LAO = 81, + TT_MAC_LANGID_VIETNAMESE = 82, + TT_MAC_LANGID_INDONESIAN = 83, + TT_MAC_LANGID_TAGALOG = 84, + TT_MAC_LANGID_MALAY_ROMAN_SCRIPT = 85, + TT_MAC_LANGID_MALAY_ARABIC_SCRIPT = 86, + TT_MAC_LANGID_AMHARIC = 87, + TT_MAC_LANGID_TIGRINYA = 88, + TT_MAC_LANGID_GALLA = 89, + TT_MAC_LANGID_SOMALI = 90, + TT_MAC_LANGID_SWAHILI = 91, + TT_MAC_LANGID_RUANDA = 92, + TT_MAC_LANGID_RUNDI = 93, + TT_MAC_LANGID_CHEWA = 94, + TT_MAC_LANGID_MALAGASY = 95, + TT_MAC_LANGID_ESPERANTO = 96, + TT_MAC_LANGID_WELSH = 128, + TT_MAC_LANGID_BASQUE = 129, + TT_MAC_LANGID_CATALAN = 130, + TT_MAC_LANGID_LATIN = 131, + TT_MAC_LANGID_QUECHUA = 132, + TT_MAC_LANGID_GUARANI = 133, + TT_MAC_LANGID_AYMARA = 134, + TT_MAC_LANGID_TATAR = 135, + TT_MAC_LANGID_UIGHUR = 136, + TT_MAC_LANGID_DZONGKHA = 137, + TT_MAC_LANGID_JAVANESE = 138, + TT_MAC_LANGID_SUNDANESE = 139, + TT_MAC_LANGID_GALICIAN = 140, + TT_MAC_LANGID_AFRIKAANS = 141, + TT_MAC_LANGID_BRETON = 142, + TT_MAC_LANGID_INUKTITUT = 143, + TT_MAC_LANGID_SCOTTISH_GAELIC = 144, + TT_MAC_LANGID_MANX_GAELIC = 145, + TT_MAC_LANGID_IRISH_GAELIC = 146, + TT_MAC_LANGID_TONGAN = 147, + TT_MAC_LANGID_GREEK_POLYTONIC = 148, + TT_MAC_LANGID_GREELANDIC = 149, + TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT = 150; + + /** + * {@code TT_MS_LANGID_XXX} + * + *
    Enum values:
    + * + *
      + *
    • {@link #TT_MS_LANGID_ARABIC_SAUDI_ARABIA TT_MS_LANGID_ARABIC_SAUDI_ARABIA}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_IRAQ TT_MS_LANGID_ARABIC_IRAQ}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_EGYPT TT_MS_LANGID_ARABIC_EGYPT}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_LIBYA TT_MS_LANGID_ARABIC_LIBYA}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_ALGERIA TT_MS_LANGID_ARABIC_ALGERIA}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_MOROCCO TT_MS_LANGID_ARABIC_MOROCCO}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_TUNISIA TT_MS_LANGID_ARABIC_TUNISIA}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_OMAN TT_MS_LANGID_ARABIC_OMAN}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_YEMEN TT_MS_LANGID_ARABIC_YEMEN}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_SYRIA TT_MS_LANGID_ARABIC_SYRIA}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_JORDAN TT_MS_LANGID_ARABIC_JORDAN}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_LEBANON TT_MS_LANGID_ARABIC_LEBANON}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_KUWAIT TT_MS_LANGID_ARABIC_KUWAIT}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_UAE TT_MS_LANGID_ARABIC_UAE}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_BAHRAIN TT_MS_LANGID_ARABIC_BAHRAIN}
    • + *
    • {@link #TT_MS_LANGID_ARABIC_QATAR TT_MS_LANGID_ARABIC_QATAR}
    • + *
    • {@link #TT_MS_LANGID_BULGARIAN_BULGARIA TT_MS_LANGID_BULGARIAN_BULGARIA}
    • + *
    • {@link #TT_MS_LANGID_CATALAN_CATALAN TT_MS_LANGID_CATALAN_CATALAN}
    • + *
    • {@link #TT_MS_LANGID_CHINESE_TAIWAN TT_MS_LANGID_CHINESE_TAIWAN}
    • + *
    • {@link #TT_MS_LANGID_CHINESE_PRC TT_MS_LANGID_CHINESE_PRC}
    • + *
    • {@link #TT_MS_LANGID_CHINESE_HONG_KONG TT_MS_LANGID_CHINESE_HONG_KONG}
    • + *
    • {@link #TT_MS_LANGID_CHINESE_SINGAPORE TT_MS_LANGID_CHINESE_SINGAPORE}
    • + *
    • {@link #TT_MS_LANGID_CHINESE_MACAO TT_MS_LANGID_CHINESE_MACAO}
    • + *
    • {@link #TT_MS_LANGID_CZECH_CZECH_REPUBLIC TT_MS_LANGID_CZECH_CZECH_REPUBLIC}
    • + *
    • {@link #TT_MS_LANGID_DANISH_DENMARK TT_MS_LANGID_DANISH_DENMARK}
    • + *
    • {@link #TT_MS_LANGID_GERMAN_GERMANY TT_MS_LANGID_GERMAN_GERMANY}
    • + *
    • {@link #TT_MS_LANGID_GERMAN_SWITZERLAND TT_MS_LANGID_GERMAN_SWITZERLAND}
    • + *
    • {@link #TT_MS_LANGID_GERMAN_AUSTRIA TT_MS_LANGID_GERMAN_AUSTRIA}
    • + *
    • {@link #TT_MS_LANGID_GERMAN_LUXEMBOURG TT_MS_LANGID_GERMAN_LUXEMBOURG}
    • + *
    • {@link #TT_MS_LANGID_GERMAN_LIECHTENSTEIN TT_MS_LANGID_GERMAN_LIECHTENSTEIN}
    • + *
    • {@link #TT_MS_LANGID_GREEK_GREECE TT_MS_LANGID_GREEK_GREECE}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_UNITED_STATES TT_MS_LANGID_ENGLISH_UNITED_STATES}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_UNITED_KINGDOM TT_MS_LANGID_ENGLISH_UNITED_KINGDOM}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_AUSTRALIA TT_MS_LANGID_ENGLISH_AUSTRALIA}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_CANADA TT_MS_LANGID_ENGLISH_CANADA}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_NEW_ZEALAND TT_MS_LANGID_ENGLISH_NEW_ZEALAND}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_IRELAND TT_MS_LANGID_ENGLISH_IRELAND}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_SOUTH_AFRICA TT_MS_LANGID_ENGLISH_SOUTH_AFRICA}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_JAMAICA TT_MS_LANGID_ENGLISH_JAMAICA}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_CARIBBEAN TT_MS_LANGID_ENGLISH_CARIBBEAN}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_BELIZE TT_MS_LANGID_ENGLISH_BELIZE}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_TRINIDAD TT_MS_LANGID_ENGLISH_TRINIDAD}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_ZIMBABWE TT_MS_LANGID_ENGLISH_ZIMBABWE}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_PHILIPPINES TT_MS_LANGID_ENGLISH_PHILIPPINES}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_INDIA TT_MS_LANGID_ENGLISH_INDIA}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_MALAYSIA TT_MS_LANGID_ENGLISH_MALAYSIA}
    • + *
    • {@link #TT_MS_LANGID_ENGLISH_SINGAPORE TT_MS_LANGID_ENGLISH_SINGAPORE}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_MEXICO TT_MS_LANGID_SPANISH_MEXICO}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_GUATEMALA TT_MS_LANGID_SPANISH_GUATEMALA}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_COSTA_RICA TT_MS_LANGID_SPANISH_COSTA_RICA}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_PANAMA TT_MS_LANGID_SPANISH_PANAMA}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_VENEZUELA TT_MS_LANGID_SPANISH_VENEZUELA}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_COLOMBIA TT_MS_LANGID_SPANISH_COLOMBIA}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_PERU TT_MS_LANGID_SPANISH_PERU}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_ARGENTINA TT_MS_LANGID_SPANISH_ARGENTINA}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_ECUADOR TT_MS_LANGID_SPANISH_ECUADOR}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_CHILE TT_MS_LANGID_SPANISH_CHILE}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_URUGUAY TT_MS_LANGID_SPANISH_URUGUAY}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_PARAGUAY TT_MS_LANGID_SPANISH_PARAGUAY}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_BOLIVIA TT_MS_LANGID_SPANISH_BOLIVIA}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_EL_SALVADOR TT_MS_LANGID_SPANISH_EL_SALVADOR}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_HONDURAS TT_MS_LANGID_SPANISH_HONDURAS}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_NICARAGUA TT_MS_LANGID_SPANISH_NICARAGUA}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_PUERTO_RICO TT_MS_LANGID_SPANISH_PUERTO_RICO}
    • + *
    • {@link #TT_MS_LANGID_SPANISH_UNITED_STATES TT_MS_LANGID_SPANISH_UNITED_STATES}
    • + *
    • {@link #TT_MS_LANGID_FINNISH_FINLAND TT_MS_LANGID_FINNISH_FINLAND}
    • + *
    • {@link #TT_MS_LANGID_FRENCH_FRANCE TT_MS_LANGID_FRENCH_FRANCE}
    • + *
    • {@link #TT_MS_LANGID_FRENCH_BELGIUM TT_MS_LANGID_FRENCH_BELGIUM}
    • + *
    • {@link #TT_MS_LANGID_FRENCH_CANADA TT_MS_LANGID_FRENCH_CANADA}
    • + *
    • {@link #TT_MS_LANGID_FRENCH_SWITZERLAND TT_MS_LANGID_FRENCH_SWITZERLAND}
    • + *
    • {@link #TT_MS_LANGID_FRENCH_LUXEMBOURG TT_MS_LANGID_FRENCH_LUXEMBOURG}
    • + *
    • {@link #TT_MS_LANGID_FRENCH_MONACO TT_MS_LANGID_FRENCH_MONACO}
    • + *
    • {@link #TT_MS_LANGID_HEBREW_ISRAEL TT_MS_LANGID_HEBREW_ISRAEL}
    • + *
    • {@link #TT_MS_LANGID_HUNGARIAN_HUNGARY TT_MS_LANGID_HUNGARIAN_HUNGARY}
    • + *
    • {@link #TT_MS_LANGID_ICELANDIC_ICELAND TT_MS_LANGID_ICELANDIC_ICELAND}
    • + *
    • {@link #TT_MS_LANGID_ITALIAN_ITALY TT_MS_LANGID_ITALIAN_ITALY}
    • + *
    • {@link #TT_MS_LANGID_ITALIAN_SWITZERLAND TT_MS_LANGID_ITALIAN_SWITZERLAND}
    • + *
    • {@link #TT_MS_LANGID_JAPANESE_JAPAN TT_MS_LANGID_JAPANESE_JAPAN}
    • + *
    • {@link #TT_MS_LANGID_KOREAN_KOREA TT_MS_LANGID_KOREAN_KOREA}
    • + *
    • {@link #TT_MS_LANGID_DUTCH_NETHERLANDS TT_MS_LANGID_DUTCH_NETHERLANDS}
    • + *
    • {@link #TT_MS_LANGID_DUTCH_BELGIUM TT_MS_LANGID_DUTCH_BELGIUM}
    • + *
    • {@link #TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL}
    • + *
    • {@link #TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK}
    • + *
    • {@link #TT_MS_LANGID_POLISH_POLAND TT_MS_LANGID_POLISH_POLAND}
    • + *
    • {@link #TT_MS_LANGID_PORTUGUESE_BRAZIL TT_MS_LANGID_PORTUGUESE_BRAZIL}
    • + *
    • {@link #TT_MS_LANGID_PORTUGUESE_PORTUGAL TT_MS_LANGID_PORTUGUESE_PORTUGAL}
    • + *
    • {@link #TT_MS_LANGID_ROMANSH_SWITZERLAND TT_MS_LANGID_ROMANSH_SWITZERLAND}
    • + *
    • {@link #TT_MS_LANGID_ROMANIAN_ROMANIA TT_MS_LANGID_ROMANIAN_ROMANIA}
    • + *
    • {@link #TT_MS_LANGID_RUSSIAN_RUSSIA TT_MS_LANGID_RUSSIAN_RUSSIA}
    • + *
    • {@link #TT_MS_LANGID_CROATIAN_CROATIA TT_MS_LANGID_CROATIAN_CROATIA}
    • + *
    • {@link #TT_MS_LANGID_SERBIAN_SERBIA_LATIN TT_MS_LANGID_SERBIAN_SERBIA_LATIN}
    • + *
    • {@link #TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC}
    • + *
    • {@link #TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA}
    • + *
    • {@link #TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA}
    • + *
    • {@link #TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN}
    • + *
    • {@link #TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC}
    • + *
    • {@link #TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC}
    • + *
    • {@link #TT_MS_LANGID_SLOVAK_SLOVAKIA TT_MS_LANGID_SLOVAK_SLOVAKIA}
    • + *
    • {@link #TT_MS_LANGID_ALBANIAN_ALBANIA TT_MS_LANGID_ALBANIAN_ALBANIA}
    • + *
    • {@link #TT_MS_LANGID_SWEDISH_SWEDEN TT_MS_LANGID_SWEDISH_SWEDEN}
    • + *
    • {@link #TT_MS_LANGID_SWEDISH_FINLAND TT_MS_LANGID_SWEDISH_FINLAND}
    • + *
    • {@link #TT_MS_LANGID_THAI_THAILAND TT_MS_LANGID_THAI_THAILAND}
    • + *
    • {@link #TT_MS_LANGID_TURKISH_TURKEY TT_MS_LANGID_TURKISH_TURKEY}
    • + *
    • {@link #TT_MS_LANGID_URDU_PAKISTAN TT_MS_LANGID_URDU_PAKISTAN}
    • + *
    • {@link #TT_MS_LANGID_INDONESIAN_INDONESIA TT_MS_LANGID_INDONESIAN_INDONESIA}
    • + *
    • {@link #TT_MS_LANGID_UKRAINIAN_UKRAINE TT_MS_LANGID_UKRAINIAN_UKRAINE}
    • + *
    • {@link #TT_MS_LANGID_BELARUSIAN_BELARUS TT_MS_LANGID_BELARUSIAN_BELARUS}
    • + *
    • {@link #TT_MS_LANGID_SLOVENIAN_SLOVENIA TT_MS_LANGID_SLOVENIAN_SLOVENIA}
    • + *
    • {@link #TT_MS_LANGID_ESTONIAN_ESTONIA TT_MS_LANGID_ESTONIAN_ESTONIA}
    • + *
    • {@link #TT_MS_LANGID_LATVIAN_LATVIA TT_MS_LANGID_LATVIAN_LATVIA}
    • + *
    • {@link #TT_MS_LANGID_LITHUANIAN_LITHUANIA TT_MS_LANGID_LITHUANIAN_LITHUANIA}
    • + *
    • {@link #TT_MS_LANGID_TAJIK_TAJIKISTAN TT_MS_LANGID_TAJIK_TAJIKISTAN}
    • + *
    • {@link #TT_MS_LANGID_VIETNAMESE_VIET_NAM TT_MS_LANGID_VIETNAMESE_VIET_NAM}
    • + *
    • {@link #TT_MS_LANGID_ARMENIAN_ARMENIA TT_MS_LANGID_ARMENIAN_ARMENIA}
    • + *
    • {@link #TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN}
    • + *
    • {@link #TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC}
    • + *
    • {@link #TT_MS_LANGID_BASQUE_BASQUE TT_MS_LANGID_BASQUE_BASQUE}
    • + *
    • {@link #TT_MS_LANGID_UPPER_SORBIAN_GERMANY TT_MS_LANGID_UPPER_SORBIAN_GERMANY}
    • + *
    • {@link #TT_MS_LANGID_LOWER_SORBIAN_GERMANY TT_MS_LANGID_LOWER_SORBIAN_GERMANY}
    • + *
    • {@link #TT_MS_LANGID_MACEDONIAN_MACEDONIA TT_MS_LANGID_MACEDONIAN_MACEDONIA}
    • + *
    • {@link #TT_MS_LANGID_SETSWANA_SOUTH_AFRICA TT_MS_LANGID_SETSWANA_SOUTH_AFRICA}
    • + *
    • {@link #TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA}
    • + *
    • {@link #TT_MS_LANGID_ISIZULU_SOUTH_AFRICA TT_MS_LANGID_ISIZULU_SOUTH_AFRICA}
    • + *
    • {@link #TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA}
    • + *
    • {@link #TT_MS_LANGID_GEORGIAN_GEORGIA TT_MS_LANGID_GEORGIAN_GEORGIA}
    • + *
    • {@link #TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS}
    • + *
    • {@link #TT_MS_LANGID_HINDI_INDIA TT_MS_LANGID_HINDI_INDIA}
    • + *
    • {@link #TT_MS_LANGID_MALTESE_MALTA TT_MS_LANGID_MALTESE_MALTA}
    • + *
    • {@link #TT_MS_LANGID_SAMI_NORTHERN_NORWAY TT_MS_LANGID_SAMI_NORTHERN_NORWAY}
    • + *
    • {@link #TT_MS_LANGID_SAMI_NORTHERN_SWEDEN TT_MS_LANGID_SAMI_NORTHERN_SWEDEN}
    • + *
    • {@link #TT_MS_LANGID_SAMI_NORTHERN_FINLAND TT_MS_LANGID_SAMI_NORTHERN_FINLAND}
    • + *
    • {@link #TT_MS_LANGID_SAMI_LULE_NORWAY TT_MS_LANGID_SAMI_LULE_NORWAY}
    • + *
    • {@link #TT_MS_LANGID_SAMI_LULE_SWEDEN TT_MS_LANGID_SAMI_LULE_SWEDEN}
    • + *
    • {@link #TT_MS_LANGID_SAMI_SOUTHERN_NORWAY TT_MS_LANGID_SAMI_SOUTHERN_NORWAY}
    • + *
    • {@link #TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN}
    • + *
    • {@link #TT_MS_LANGID_SAMI_SKOLT_FINLAND TT_MS_LANGID_SAMI_SKOLT_FINLAND}
    • + *
    • {@link #TT_MS_LANGID_SAMI_INARI_FINLAND TT_MS_LANGID_SAMI_INARI_FINLAND}
    • + *
    • {@link #TT_MS_LANGID_IRISH_IRELAND TT_MS_LANGID_IRISH_IRELAND}
    • + *
    • {@link #TT_MS_LANGID_MALAY_MALAYSIA TT_MS_LANGID_MALAY_MALAYSIA}
    • + *
    • {@link #TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM}
    • + *
    • {@link #TT_MS_LANGID_KAZAKH_KAZAKHSTAN TT_MS_LANGID_KAZAKH_KAZAKHSTAN}
    • + *
    • {@link #TT_MS_LANGID_KYRGYZ_KYRGYZSTAN TT_MS_LANGID_KYRGYZ_KYRGYZSTAN}
    • + *
    • {@link #TT_MS_LANGID_KISWAHILI_KENYA TT_MS_LANGID_KISWAHILI_KENYA}
    • + *
    • {@link #TT_MS_LANGID_TURKMEN_TURKMENISTAN TT_MS_LANGID_TURKMEN_TURKMENISTAN}
    • + *
    • {@link #TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN}
    • + *
    • {@link #TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC}
    • + *
    • {@link #TT_MS_LANGID_TATAR_RUSSIA TT_MS_LANGID_TATAR_RUSSIA}
    • + *
    • {@link #TT_MS_LANGID_BENGALI_INDIA TT_MS_LANGID_BENGALI_INDIA}
    • + *
    • {@link #TT_MS_LANGID_BENGALI_BANGLADESH TT_MS_LANGID_BENGALI_BANGLADESH}
    • + *
    • {@link #TT_MS_LANGID_PUNJABI_INDIA TT_MS_LANGID_PUNJABI_INDIA}
    • + *
    • {@link #TT_MS_LANGID_GUJARATI_INDIA TT_MS_LANGID_GUJARATI_INDIA}
    • + *
    • {@link #TT_MS_LANGID_ODIA_INDIA TT_MS_LANGID_ODIA_INDIA}
    • + *
    • {@link #TT_MS_LANGID_TAMIL_INDIA TT_MS_LANGID_TAMIL_INDIA}
    • + *
    • {@link #TT_MS_LANGID_TELUGU_INDIA TT_MS_LANGID_TELUGU_INDIA}
    • + *
    • {@link #TT_MS_LANGID_KANNADA_INDIA TT_MS_LANGID_KANNADA_INDIA}
    • + *
    • {@link #TT_MS_LANGID_MALAYALAM_INDIA TT_MS_LANGID_MALAYALAM_INDIA}
    • + *
    • {@link #TT_MS_LANGID_ASSAMESE_INDIA TT_MS_LANGID_ASSAMESE_INDIA}
    • + *
    • {@link #TT_MS_LANGID_MARATHI_INDIA TT_MS_LANGID_MARATHI_INDIA}
    • + *
    • {@link #TT_MS_LANGID_SANSKRIT_INDIA TT_MS_LANGID_SANSKRIT_INDIA}
    • + *
    • {@link #TT_MS_LANGID_MONGOLIAN_MONGOLIA TT_MS_LANGID_MONGOLIAN_MONGOLIA}
    • + *
    • {@link #TT_MS_LANGID_MONGOLIAN_PRC TT_MS_LANGID_MONGOLIAN_PRC}
    • + *
    • {@link #TT_MS_LANGID_TIBETAN_PRC TT_MS_LANGID_TIBETAN_PRC}
    • + *
    • {@link #TT_MS_LANGID_WELSH_UNITED_KINGDOM TT_MS_LANGID_WELSH_UNITED_KINGDOM}
    • + *
    • {@link #TT_MS_LANGID_KHMER_CAMBODIA TT_MS_LANGID_KHMER_CAMBODIA}
    • + *
    • {@link #TT_MS_LANGID_LAO_LAOS TT_MS_LANGID_LAO_LAOS}
    • + *
    • {@link #TT_MS_LANGID_GALICIAN_GALICIAN TT_MS_LANGID_GALICIAN_GALICIAN}
    • + *
    • {@link #TT_MS_LANGID_KONKANI_INDIA TT_MS_LANGID_KONKANI_INDIA}
    • + *
    • {@link #TT_MS_LANGID_SYRIAC_SYRIA TT_MS_LANGID_SYRIAC_SYRIA}
    • + *
    • {@link #TT_MS_LANGID_SINHALA_SRI_LANKA TT_MS_LANGID_SINHALA_SRI_LANKA}
    • + *
    • {@link #TT_MS_LANGID_INUKTITUT_CANADA TT_MS_LANGID_INUKTITUT_CANADA}
    • + *
    • {@link #TT_MS_LANGID_INUKTITUT_CANADA_LATIN TT_MS_LANGID_INUKTITUT_CANADA_LATIN}
    • + *
    • {@link #TT_MS_LANGID_AMHARIC_ETHIOPIA TT_MS_LANGID_AMHARIC_ETHIOPIA}
    • + *
    • {@link #TT_MS_LANGID_TAMAZIGHT_ALGERIA TT_MS_LANGID_TAMAZIGHT_ALGERIA}
    • + *
    • {@link #TT_MS_LANGID_NEPALI_NEPAL TT_MS_LANGID_NEPALI_NEPAL}
    • + *
    • {@link #TT_MS_LANGID_FRISIAN_NETHERLANDS TT_MS_LANGID_FRISIAN_NETHERLANDS}
    • + *
    • {@link #TT_MS_LANGID_PASHTO_AFGHANISTAN TT_MS_LANGID_PASHTO_AFGHANISTAN}
    • + *
    • {@link #TT_MS_LANGID_FILIPINO_PHILIPPINES TT_MS_LANGID_FILIPINO_PHILIPPINES}
    • + *
    • {@link #TT_MS_LANGID_DHIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES}
    • + *
    • {@link #TT_MS_LANGID_HAUSA_NIGERIA TT_MS_LANGID_HAUSA_NIGERIA}
    • + *
    • {@link #TT_MS_LANGID_YORUBA_NIGERIA TT_MS_LANGID_YORUBA_NIGERIA}
    • + *
    • {@link #TT_MS_LANGID_QUECHUA_BOLIVIA TT_MS_LANGID_QUECHUA_BOLIVIA}
    • + *
    • {@link #TT_MS_LANGID_QUECHUA_ECUADOR TT_MS_LANGID_QUECHUA_ECUADOR}
    • + *
    • {@link #TT_MS_LANGID_QUECHUA_PERU TT_MS_LANGID_QUECHUA_PERU}
    • + *
    • {@link #TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA}
    • + *
    • {@link #TT_MS_LANGID_BASHKIR_RUSSIA TT_MS_LANGID_BASHKIR_RUSSIA}
    • + *
    • {@link #TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG}
    • + *
    • {@link #TT_MS_LANGID_GREENLANDIC_GREENLAND TT_MS_LANGID_GREENLANDIC_GREENLAND}
    • + *
    • {@link #TT_MS_LANGID_IGBO_NIGERIA TT_MS_LANGID_IGBO_NIGERIA}
    • + *
    • {@link #TT_MS_LANGID_YI_PRC TT_MS_LANGID_YI_PRC}
    • + *
    • {@link #TT_MS_LANGID_MAPUDUNGUN_CHILE TT_MS_LANGID_MAPUDUNGUN_CHILE}
    • + *
    • {@link #TT_MS_LANGID_MOHAWK_MOHAWK TT_MS_LANGID_MOHAWK_MOHAWK}
    • + *
    • {@link #TT_MS_LANGID_BRETON_FRANCE TT_MS_LANGID_BRETON_FRANCE}
    • + *
    • {@link #TT_MS_LANGID_UIGHUR_PRC TT_MS_LANGID_UIGHUR_PRC}
    • + *
    • {@link #TT_MS_LANGID_MAORI_NEW_ZEALAND TT_MS_LANGID_MAORI_NEW_ZEALAND}
    • + *
    • {@link #TT_MS_LANGID_OCCITAN_FRANCE TT_MS_LANGID_OCCITAN_FRANCE}
    • + *
    • {@link #TT_MS_LANGID_CORSICAN_FRANCE TT_MS_LANGID_CORSICAN_FRANCE}
    • + *
    • {@link #TT_MS_LANGID_ALSATIAN_FRANCE TT_MS_LANGID_ALSATIAN_FRANCE}
    • + *
    • {@link #TT_MS_LANGID_YAKUT_RUSSIA TT_MS_LANGID_YAKUT_RUSSIA}
    • + *
    • {@link #TT_MS_LANGID_KICHE_GUATEMALA TT_MS_LANGID_KICHE_GUATEMALA}
    • + *
    • {@link #TT_MS_LANGID_KINYARWANDA_RWANDA TT_MS_LANGID_KINYARWANDA_RWANDA}
    • + *
    • {@link #TT_MS_LANGID_WOLOF_SENEGAL TT_MS_LANGID_WOLOF_SENEGAL}
    • + *
    • {@link #TT_MS_LANGID_DARI_AFGHANISTAN TT_MS_LANGID_DARI_AFGHANISTAN}
    • + *
    + */ + public static final int + TT_MS_LANGID_ARABIC_SAUDI_ARABIA = 0x0401, + TT_MS_LANGID_ARABIC_IRAQ = 0x0801, + TT_MS_LANGID_ARABIC_EGYPT = 0x0C01, + TT_MS_LANGID_ARABIC_LIBYA = 0x1001, + TT_MS_LANGID_ARABIC_ALGERIA = 0x1401, + TT_MS_LANGID_ARABIC_MOROCCO = 0x1801, + TT_MS_LANGID_ARABIC_TUNISIA = 0x1C01, + TT_MS_LANGID_ARABIC_OMAN = 0x2001, + TT_MS_LANGID_ARABIC_YEMEN = 0x2401, + TT_MS_LANGID_ARABIC_SYRIA = 0x2801, + TT_MS_LANGID_ARABIC_JORDAN = 0x2C01, + TT_MS_LANGID_ARABIC_LEBANON = 0x3001, + TT_MS_LANGID_ARABIC_KUWAIT = 0x3401, + TT_MS_LANGID_ARABIC_UAE = 0x3801, + TT_MS_LANGID_ARABIC_BAHRAIN = 0x3C01, + TT_MS_LANGID_ARABIC_QATAR = 0x4001, + TT_MS_LANGID_BULGARIAN_BULGARIA = 0x0402, + TT_MS_LANGID_CATALAN_CATALAN = 0x0403, + TT_MS_LANGID_CHINESE_TAIWAN = 0x0404, + TT_MS_LANGID_CHINESE_PRC = 0x0804, + TT_MS_LANGID_CHINESE_HONG_KONG = 0x0C04, + TT_MS_LANGID_CHINESE_SINGAPORE = 0x1004, + TT_MS_LANGID_CHINESE_MACAO = 0x1404, + TT_MS_LANGID_CZECH_CZECH_REPUBLIC = 0x0405, + TT_MS_LANGID_DANISH_DENMARK = 0x0406, + TT_MS_LANGID_GERMAN_GERMANY = 0x0407, + TT_MS_LANGID_GERMAN_SWITZERLAND = 0x0807, + TT_MS_LANGID_GERMAN_AUSTRIA = 0x0C07, + TT_MS_LANGID_GERMAN_LUXEMBOURG = 0x1007, + TT_MS_LANGID_GERMAN_LIECHTENSTEIN = 0x1407, + TT_MS_LANGID_GREEK_GREECE = 0x0408, + TT_MS_LANGID_ENGLISH_UNITED_STATES = 0x0409, + TT_MS_LANGID_ENGLISH_UNITED_KINGDOM = 0x0809, + TT_MS_LANGID_ENGLISH_AUSTRALIA = 0x0C09, + TT_MS_LANGID_ENGLISH_CANADA = 0x1009, + TT_MS_LANGID_ENGLISH_NEW_ZEALAND = 0x1409, + TT_MS_LANGID_ENGLISH_IRELAND = 0x1809, + TT_MS_LANGID_ENGLISH_SOUTH_AFRICA = 0x1C09, + TT_MS_LANGID_ENGLISH_JAMAICA = 0x2009, + TT_MS_LANGID_ENGLISH_CARIBBEAN = 0x2409, + TT_MS_LANGID_ENGLISH_BELIZE = 0x2809, + TT_MS_LANGID_ENGLISH_TRINIDAD = 0x2C09, + TT_MS_LANGID_ENGLISH_ZIMBABWE = 0x3009, + TT_MS_LANGID_ENGLISH_PHILIPPINES = 0x3409, + TT_MS_LANGID_ENGLISH_INDIA = 0x4009, + TT_MS_LANGID_ENGLISH_MALAYSIA = 0x4409, + TT_MS_LANGID_ENGLISH_SINGAPORE = 0x4809, + TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT = 0x040A, + TT_MS_LANGID_SPANISH_MEXICO = 0x080A, + TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT = 0x0C0A, + TT_MS_LANGID_SPANISH_GUATEMALA = 0x100A, + TT_MS_LANGID_SPANISH_COSTA_RICA = 0x140A, + TT_MS_LANGID_SPANISH_PANAMA = 0x180A, + TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC = 0x1C0A, + TT_MS_LANGID_SPANISH_VENEZUELA = 0x200A, + TT_MS_LANGID_SPANISH_COLOMBIA = 0x240A, + TT_MS_LANGID_SPANISH_PERU = 0x280A, + TT_MS_LANGID_SPANISH_ARGENTINA = 0x2C0A, + TT_MS_LANGID_SPANISH_ECUADOR = 0x300A, + TT_MS_LANGID_SPANISH_CHILE = 0x340A, + TT_MS_LANGID_SPANISH_URUGUAY = 0x380A, + TT_MS_LANGID_SPANISH_PARAGUAY = 0x3C0A, + TT_MS_LANGID_SPANISH_BOLIVIA = 0x400A, + TT_MS_LANGID_SPANISH_EL_SALVADOR = 0x440A, + TT_MS_LANGID_SPANISH_HONDURAS = 0x480A, + TT_MS_LANGID_SPANISH_NICARAGUA = 0x4C0A, + TT_MS_LANGID_SPANISH_PUERTO_RICO = 0x500A, + TT_MS_LANGID_SPANISH_UNITED_STATES = 0x540A, + TT_MS_LANGID_FINNISH_FINLAND = 0x040B, + TT_MS_LANGID_FRENCH_FRANCE = 0x040C, + TT_MS_LANGID_FRENCH_BELGIUM = 0x080C, + TT_MS_LANGID_FRENCH_CANADA = 0x0C0C, + TT_MS_LANGID_FRENCH_SWITZERLAND = 0x100C, + TT_MS_LANGID_FRENCH_LUXEMBOURG = 0x140C, + TT_MS_LANGID_FRENCH_MONACO = 0x180C, + TT_MS_LANGID_HEBREW_ISRAEL = 0x040D, + TT_MS_LANGID_HUNGARIAN_HUNGARY = 0x040E, + TT_MS_LANGID_ICELANDIC_ICELAND = 0x040F, + TT_MS_LANGID_ITALIAN_ITALY = 0x0410, + TT_MS_LANGID_ITALIAN_SWITZERLAND = 0x0810, + TT_MS_LANGID_JAPANESE_JAPAN = 0x0411, + TT_MS_LANGID_KOREAN_KOREA = 0x0412, + TT_MS_LANGID_DUTCH_NETHERLANDS = 0x0413, + TT_MS_LANGID_DUTCH_BELGIUM = 0x0813, + TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL = 0x0414, + TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK = 0x0814, + TT_MS_LANGID_POLISH_POLAND = 0x0415, + TT_MS_LANGID_PORTUGUESE_BRAZIL = 0x0416, + TT_MS_LANGID_PORTUGUESE_PORTUGAL = 0x0816, + TT_MS_LANGID_ROMANSH_SWITZERLAND = 0x0417, + TT_MS_LANGID_ROMANIAN_ROMANIA = 0x0418, + TT_MS_LANGID_RUSSIAN_RUSSIA = 0x0419, + TT_MS_LANGID_CROATIAN_CROATIA = 0x041A, + TT_MS_LANGID_SERBIAN_SERBIA_LATIN = 0x081A, + TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC = 0x0C1A, + TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA = 0x101A, + TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA = 0x141A, + TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN = 0x181A, + TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC = 0x1C1A, + TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC = 0x201A, + TT_MS_LANGID_SLOVAK_SLOVAKIA = 0x041B, + TT_MS_LANGID_ALBANIAN_ALBANIA = 0x041C, + TT_MS_LANGID_SWEDISH_SWEDEN = 0x041D, + TT_MS_LANGID_SWEDISH_FINLAND = 0x081D, + TT_MS_LANGID_THAI_THAILAND = 0x041E, + TT_MS_LANGID_TURKISH_TURKEY = 0x041F, + TT_MS_LANGID_URDU_PAKISTAN = 0x0420, + TT_MS_LANGID_INDONESIAN_INDONESIA = 0x0421, + TT_MS_LANGID_UKRAINIAN_UKRAINE = 0x0422, + TT_MS_LANGID_BELARUSIAN_BELARUS = 0x0423, + TT_MS_LANGID_SLOVENIAN_SLOVENIA = 0x0424, + TT_MS_LANGID_ESTONIAN_ESTONIA = 0x0425, + TT_MS_LANGID_LATVIAN_LATVIA = 0x0426, + TT_MS_LANGID_LITHUANIAN_LITHUANIA = 0x0427, + TT_MS_LANGID_TAJIK_TAJIKISTAN = 0x0428, + TT_MS_LANGID_VIETNAMESE_VIET_NAM = 0x042A, + TT_MS_LANGID_ARMENIAN_ARMENIA = 0x042B, + TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN = 0x042C, + TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC = 0x082C, + TT_MS_LANGID_BASQUE_BASQUE = 0x042D, + TT_MS_LANGID_UPPER_SORBIAN_GERMANY = 0x042E, + TT_MS_LANGID_LOWER_SORBIAN_GERMANY = 0x082E, + TT_MS_LANGID_MACEDONIAN_MACEDONIA = 0x042F, + TT_MS_LANGID_SETSWANA_SOUTH_AFRICA = 0x0432, + TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA = 0x0434, + TT_MS_LANGID_ISIZULU_SOUTH_AFRICA = 0x0435, + TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA = 0x0436, + TT_MS_LANGID_GEORGIAN_GEORGIA = 0x0437, + TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS = 0x0438, + TT_MS_LANGID_HINDI_INDIA = 0x0439, + TT_MS_LANGID_MALTESE_MALTA = 0x043A, + TT_MS_LANGID_SAMI_NORTHERN_NORWAY = 0x043B, + TT_MS_LANGID_SAMI_NORTHERN_SWEDEN = 0x083B, + TT_MS_LANGID_SAMI_NORTHERN_FINLAND = 0x0C3B, + TT_MS_LANGID_SAMI_LULE_NORWAY = 0x103B, + TT_MS_LANGID_SAMI_LULE_SWEDEN = 0x143B, + TT_MS_LANGID_SAMI_SOUTHERN_NORWAY = 0x183B, + TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN = 0x1C3B, + TT_MS_LANGID_SAMI_SKOLT_FINLAND = 0x203B, + TT_MS_LANGID_SAMI_INARI_FINLAND = 0x243B, + TT_MS_LANGID_IRISH_IRELAND = 0x083C, + TT_MS_LANGID_MALAY_MALAYSIA = 0x043E, + TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM = 0x083E, + TT_MS_LANGID_KAZAKH_KAZAKHSTAN = 0x043F, + TT_MS_LANGID_KYRGYZ_KYRGYZSTAN = 0x0440, + TT_MS_LANGID_KISWAHILI_KENYA = 0x0441, + TT_MS_LANGID_TURKMEN_TURKMENISTAN = 0x0442, + TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN = 0x0443, + TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC = 0x0843, + TT_MS_LANGID_TATAR_RUSSIA = 0x0444, + TT_MS_LANGID_BENGALI_INDIA = 0x0445, + TT_MS_LANGID_BENGALI_BANGLADESH = 0x0845, + TT_MS_LANGID_PUNJABI_INDIA = 0x0446, + TT_MS_LANGID_GUJARATI_INDIA = 0x0447, + TT_MS_LANGID_ODIA_INDIA = 0x0448, + TT_MS_LANGID_TAMIL_INDIA = 0x0449, + TT_MS_LANGID_TELUGU_INDIA = 0x044A, + TT_MS_LANGID_KANNADA_INDIA = 0x044B, + TT_MS_LANGID_MALAYALAM_INDIA = 0x044C, + TT_MS_LANGID_ASSAMESE_INDIA = 0x044D, + TT_MS_LANGID_MARATHI_INDIA = 0x044E, + TT_MS_LANGID_SANSKRIT_INDIA = 0x044F, + TT_MS_LANGID_MONGOLIAN_MONGOLIA = 0x0450, + TT_MS_LANGID_MONGOLIAN_PRC = 0x0850, + TT_MS_LANGID_TIBETAN_PRC = 0x0451, + TT_MS_LANGID_WELSH_UNITED_KINGDOM = 0x0452, + TT_MS_LANGID_KHMER_CAMBODIA = 0x0453, + TT_MS_LANGID_LAO_LAOS = 0x0454, + TT_MS_LANGID_GALICIAN_GALICIAN = 0x0456, + TT_MS_LANGID_KONKANI_INDIA = 0x0457, + TT_MS_LANGID_SYRIAC_SYRIA = 0x045A, + TT_MS_LANGID_SINHALA_SRI_LANKA = 0x045B, + TT_MS_LANGID_INUKTITUT_CANADA = 0x045D, + TT_MS_LANGID_INUKTITUT_CANADA_LATIN = 0x085D, + TT_MS_LANGID_AMHARIC_ETHIOPIA = 0x045E, + TT_MS_LANGID_TAMAZIGHT_ALGERIA = 0x085F, + TT_MS_LANGID_NEPALI_NEPAL = 0x0461, + TT_MS_LANGID_FRISIAN_NETHERLANDS = 0x0462, + TT_MS_LANGID_PASHTO_AFGHANISTAN = 0x0463, + TT_MS_LANGID_FILIPINO_PHILIPPINES = 0x0464, + TT_MS_LANGID_DHIVEHI_MALDIVES = 0x0465, + TT_MS_LANGID_HAUSA_NIGERIA = 0x0468, + TT_MS_LANGID_YORUBA_NIGERIA = 0x046A, + TT_MS_LANGID_QUECHUA_BOLIVIA = 0x046B, + TT_MS_LANGID_QUECHUA_ECUADOR = 0x086B, + TT_MS_LANGID_QUECHUA_PERU = 0x0C6B, + TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA = 0x046C, + TT_MS_LANGID_BASHKIR_RUSSIA = 0x046D, + TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG = 0x046E, + TT_MS_LANGID_GREENLANDIC_GREENLAND = 0x046F, + TT_MS_LANGID_IGBO_NIGERIA = 0x0470, + TT_MS_LANGID_YI_PRC = 0x0478, + TT_MS_LANGID_MAPUDUNGUN_CHILE = 0x047A, + TT_MS_LANGID_MOHAWK_MOHAWK = 0x047C, + TT_MS_LANGID_BRETON_FRANCE = 0x047E, + TT_MS_LANGID_UIGHUR_PRC = 0x0480, + TT_MS_LANGID_MAORI_NEW_ZEALAND = 0x0481, + TT_MS_LANGID_OCCITAN_FRANCE = 0x0482, + TT_MS_LANGID_CORSICAN_FRANCE = 0x0483, + TT_MS_LANGID_ALSATIAN_FRANCE = 0x0484, + TT_MS_LANGID_YAKUT_RUSSIA = 0x0485, + TT_MS_LANGID_KICHE_GUATEMALA = 0x0486, + TT_MS_LANGID_KINYARWANDA_RWANDA = 0x0487, + TT_MS_LANGID_WOLOF_SENEGAL = 0x0488, + TT_MS_LANGID_DARI_AFGHANISTAN = 0x048C; + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #TT_NAME_ID_COPYRIGHT TT_NAME_ID_COPYRIGHT}
    • + *
    • {@link #TT_NAME_ID_FONT_FAMILY TT_NAME_ID_FONT_FAMILY}
    • + *
    • {@link #TT_NAME_ID_FONT_SUBFAMILY TT_NAME_ID_FONT_SUBFAMILY}
    • + *
    • {@link #TT_NAME_ID_UNIQUE_ID TT_NAME_ID_UNIQUE_ID}
    • + *
    • {@link #TT_NAME_ID_FULL_NAME TT_NAME_ID_FULL_NAME}
    • + *
    • {@link #TT_NAME_ID_VERSION_STRING TT_NAME_ID_VERSION_STRING}
    • + *
    • {@link #TT_NAME_ID_PS_NAME TT_NAME_ID_PS_NAME}
    • + *
    • {@link #TT_NAME_ID_TRADEMARK TT_NAME_ID_TRADEMARK}
    • + *
    • {@link #TT_NAME_ID_MANUFACTURER TT_NAME_ID_MANUFACTURER}
    • + *
    • {@link #TT_NAME_ID_DESIGNER TT_NAME_ID_DESIGNER}
    • + *
    • {@link #TT_NAME_ID_DESCRIPTION TT_NAME_ID_DESCRIPTION}
    • + *
    • {@link #TT_NAME_ID_VENDOR_URL TT_NAME_ID_VENDOR_URL}
    • + *
    • {@link #TT_NAME_ID_DESIGNER_URL TT_NAME_ID_DESIGNER_URL}
    • + *
    • {@link #TT_NAME_ID_LICENSE TT_NAME_ID_LICENSE}
    • + *
    • {@link #TT_NAME_ID_LICENSE_URL TT_NAME_ID_LICENSE_URL}
    • + *
    • {@link #TT_NAME_ID_TYPOGRAPHIC_FAMILY TT_NAME_ID_TYPOGRAPHIC_FAMILY}
    • + *
    • {@link #TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY}
    • + *
    • {@link #TT_NAME_ID_MAC_FULL_NAME TT_NAME_ID_MAC_FULL_NAME}
    • + *
    • {@link #TT_NAME_ID_SAMPLE_TEXT TT_NAME_ID_SAMPLE_TEXT}
    • + *
    • {@link #TT_NAME_ID_CID_FINDFONT_NAME TT_NAME_ID_CID_FINDFONT_NAME}
    • + *
    • {@link #TT_NAME_ID_WWS_FAMILY TT_NAME_ID_WWS_FAMILY}
    • + *
    • {@link #TT_NAME_ID_WWS_SUBFAMILY TT_NAME_ID_WWS_SUBFAMILY}
    • + *
    • {@link #TT_NAME_ID_LIGHT_BACKGROUND TT_NAME_ID_LIGHT_BACKGROUND}
    • + *
    • {@link #TT_NAME_ID_DARK_BACKGROUND TT_NAME_ID_DARK_BACKGROUND}
    • + *
    • {@link #TT_NAME_ID_VARIATIONS_PREFIX TT_NAME_ID_VARIATIONS_PREFIX}
    • + *
    + */ + public static final int + TT_NAME_ID_COPYRIGHT = 0, + TT_NAME_ID_FONT_FAMILY = 1, + TT_NAME_ID_FONT_SUBFAMILY = 2, + TT_NAME_ID_UNIQUE_ID = 3, + TT_NAME_ID_FULL_NAME = 4, + TT_NAME_ID_VERSION_STRING = 5, + TT_NAME_ID_PS_NAME = 6, + TT_NAME_ID_TRADEMARK = 7, + TT_NAME_ID_MANUFACTURER = 8, + TT_NAME_ID_DESIGNER = 9, + TT_NAME_ID_DESCRIPTION = 10, + TT_NAME_ID_VENDOR_URL = 11, + TT_NAME_ID_DESIGNER_URL = 12, + TT_NAME_ID_LICENSE = 13, + TT_NAME_ID_LICENSE_URL = 14, + TT_NAME_ID_TYPOGRAPHIC_FAMILY = 16, + TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY = 17, + TT_NAME_ID_MAC_FULL_NAME = 18, + TT_NAME_ID_SAMPLE_TEXT = 19, + TT_NAME_ID_CID_FINDFONT_NAME = 20, + TT_NAME_ID_WWS_FAMILY = 21, + TT_NAME_ID_WWS_SUBFAMILY = 22, + TT_NAME_ID_LIGHT_BACKGROUND = 23, + TT_NAME_ID_DARK_BACKGROUND = 24, + TT_NAME_ID_VARIATIONS_PREFIX = 25; + + /** + *
    Enum values:
    + * + *
      + *
    • {@link #TT_UCR_BASIC_LATIN TT_UCR_BASIC_LATIN}
    • + *
    • {@link #TT_UCR_LATIN1_SUPPLEMENT TT_UCR_LATIN1_SUPPLEMENT}
    • + *
    • {@link #TT_UCR_LATIN_EXTENDED_A TT_UCR_LATIN_EXTENDED_A}
    • + *
    • {@link #TT_UCR_LATIN_EXTENDED_B TT_UCR_LATIN_EXTENDED_B}
    • + *
    • {@link #TT_UCR_IPA_EXTENSIONS TT_UCR_IPA_EXTENSIONS}
    • + *
    • {@link #TT_UCR_SPACING_MODIFIER TT_UCR_SPACING_MODIFIER}
    • + *
    • {@link #TT_UCR_COMBINING_DIACRITICAL_MARKS TT_UCR_COMBINING_DIACRITICAL_MARKS}
    • + *
    • {@link #TT_UCR_GREEK TT_UCR_GREEK}
    • + *
    • {@link #TT_UCR_COPTIC TT_UCR_COPTIC}
    • + *
    • {@link #TT_UCR_CYRILLIC TT_UCR_CYRILLIC}
    • + *
    • {@link #TT_UCR_ARMENIAN TT_UCR_ARMENIAN}
    • + *
    • {@link #TT_UCR_HEBREW TT_UCR_HEBREW}
    • + *
    • {@link #TT_UCR_VAI TT_UCR_VAI}
    • + *
    • {@link #TT_UCR_ARABIC TT_UCR_ARABIC}
    • + *
    • {@link #TT_UCR_NKO TT_UCR_NKO}
    • + *
    • {@link #TT_UCR_DEVANAGARI TT_UCR_DEVANAGARI}
    • + *
    • {@link #TT_UCR_BENGALI TT_UCR_BENGALI}
    • + *
    • {@link #TT_UCR_GURMUKHI TT_UCR_GURMUKHI}
    • + *
    • {@link #TT_UCR_GUJARATI TT_UCR_GUJARATI}
    • + *
    • {@link #TT_UCR_ORIYA TT_UCR_ORIYA}
    • + *
    • {@link #TT_UCR_TAMIL TT_UCR_TAMIL}
    • + *
    • {@link #TT_UCR_TELUGU TT_UCR_TELUGU}
    • + *
    • {@link #TT_UCR_KANNADA TT_UCR_KANNADA}
    • + *
    • {@link #TT_UCR_MALAYALAM TT_UCR_MALAYALAM}
    • + *
    • {@link #TT_UCR_THAI TT_UCR_THAI}
    • + *
    • {@link #TT_UCR_LAO TT_UCR_LAO}
    • + *
    • {@link #TT_UCR_GEORGIAN TT_UCR_GEORGIAN}
    • + *
    • {@link #TT_UCR_BALINESE TT_UCR_BALINESE}
    • + *
    • {@link #TT_UCR_HANGUL_JAMO TT_UCR_HANGUL_JAMO}
    • + *
    • {@link #TT_UCR_LATIN_EXTENDED_ADDITIONAL TT_UCR_LATIN_EXTENDED_ADDITIONAL}
    • + *
    • {@link #TT_UCR_GREEK_EXTENDED TT_UCR_GREEK_EXTENDED}
    • + *
    • {@link #TT_UCR_GENERAL_PUNCTUATION TT_UCR_GENERAL_PUNCTUATION}
    • + *
    • {@link #TT_UCR_SUPERSCRIPTS_SUBSCRIPTS TT_UCR_SUPERSCRIPTS_SUBSCRIPTS}
    • + *
    • {@link #TT_UCR_CURRENCY_SYMBOLS TT_UCR_CURRENCY_SYMBOLS}
    • + *
    • {@link #TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB}
    • + *
    • {@link #TT_UCR_LETTERLIKE_SYMBOLS TT_UCR_LETTERLIKE_SYMBOLS}
    • + *
    • {@link #TT_UCR_NUMBER_FORMS TT_UCR_NUMBER_FORMS}
    • + *
    • {@link #TT_UCR_ARROWS TT_UCR_ARROWS}
    • + *
    • {@link #TT_UCR_MATHEMATICAL_OPERATORS TT_UCR_MATHEMATICAL_OPERATORS}
    • + *
    • {@link #TT_UCR_MISCELLANEOUS_TECHNICAL TT_UCR_MISCELLANEOUS_TECHNICAL}
    • + *
    • {@link #TT_UCR_CONTROL_PICTURES TT_UCR_CONTROL_PICTURES}
    • + *
    • {@link #TT_UCR_OCR TT_UCR_OCR}
    • + *
    • {@link #TT_UCR_ENCLOSED_ALPHANUMERICS TT_UCR_ENCLOSED_ALPHANUMERICS}
    • + *
    • {@link #TT_UCR_BOX_DRAWING TT_UCR_BOX_DRAWING}
    • + *
    • {@link #TT_UCR_BLOCK_ELEMENTS TT_UCR_BLOCK_ELEMENTS}
    • + *
    • {@link #TT_UCR_GEOMETRIC_SHAPES TT_UCR_GEOMETRIC_SHAPES}
    • + *
    • {@link #TT_UCR_MISCELLANEOUS_SYMBOLS TT_UCR_MISCELLANEOUS_SYMBOLS}
    • + *
    • {@link #TT_UCR_DINGBATS TT_UCR_DINGBATS}
    • + *
    • {@link #TT_UCR_CJK_SYMBOLS TT_UCR_CJK_SYMBOLS}
    • + *
    • {@link #TT_UCR_HIRAGANA TT_UCR_HIRAGANA}
    • + *
    • {@link #TT_UCR_KATAKANA TT_UCR_KATAKANA}
    • + *
    • {@link #TT_UCR_BOPOMOFO TT_UCR_BOPOMOFO}
    • + *
    • {@link #TT_UCR_HANGUL_COMPATIBILITY_JAMO TT_UCR_HANGUL_COMPATIBILITY_JAMO}
    • + *
    • {@link #TT_UCR_CJK_MISC TT_UCR_CJK_MISC}
    • + *
    • {@link #TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS}
    • + *
    • {@link #TT_UCR_CJK_COMPATIBILITY TT_UCR_CJK_COMPATIBILITY}
    • + *
    • {@link #TT_UCR_HANGUL TT_UCR_HANGUL}
    • + *
    • {@link #TT_UCR_SURROGATES TT_UCR_SURROGATES}
    • + *
    • {@link #TT_UCR_PHOENICIAN TT_UCR_PHOENICIAN}
    • + *
    • {@link #TT_UCR_CJK_UNIFIED_IDEOGRAPHS TT_UCR_CJK_UNIFIED_IDEOGRAPHS}
    • + *
    • {@link #TT_UCR_PRIVATE_USE TT_UCR_PRIVATE_USE}
    • + *
    • {@link #TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS}
    • + *
    • {@link #TT_UCR_ALPHABETIC_PRESENTATION_FORMS TT_UCR_ALPHABETIC_PRESENTATION_FORMS}
    • + *
    • {@link #TT_UCR_ARABIC_PRESENTATION_FORMS_A TT_UCR_ARABIC_PRESENTATION_FORMS_A}
    • + *
    • {@link #TT_UCR_COMBINING_HALF_MARKS TT_UCR_COMBINING_HALF_MARKS}
    • + *
    • {@link #TT_UCR_CJK_COMPATIBILITY_FORMS TT_UCR_CJK_COMPATIBILITY_FORMS}
    • + *
    • {@link #TT_UCR_SMALL_FORM_VARIANTS TT_UCR_SMALL_FORM_VARIANTS}
    • + *
    • {@link #TT_UCR_ARABIC_PRESENTATION_FORMS_B TT_UCR_ARABIC_PRESENTATION_FORMS_B}
    • + *
    • {@link #TT_UCR_HALFWIDTH_FULLWIDTH_FORMS TT_UCR_HALFWIDTH_FULLWIDTH_FORMS}
    • + *
    • {@link #TT_UCR_SPECIALS TT_UCR_SPECIALS}
    • + *
    • {@link #TT_UCR_TIBETAN TT_UCR_TIBETAN}
    • + *
    • {@link #TT_UCR_SYRIAC TT_UCR_SYRIAC}
    • + *
    • {@link #TT_UCR_THAANA TT_UCR_THAANA}
    • + *
    • {@link #TT_UCR_SINHALA TT_UCR_SINHALA}
    • + *
    • {@link #TT_UCR_MYANMAR TT_UCR_MYANMAR}
    • + *
    • {@link #TT_UCR_ETHIOPIC TT_UCR_ETHIOPIC}
    • + *
    • {@link #TT_UCR_CHEROKEE TT_UCR_CHEROKEE}
    • + *
    • {@link #TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS}
    • + *
    • {@link #TT_UCR_OGHAM TT_UCR_OGHAM}
    • + *
    • {@link #TT_UCR_RUNIC TT_UCR_RUNIC}
    • + *
    • {@link #TT_UCR_KHMER TT_UCR_KHMER}
    • + *
    • {@link #TT_UCR_MONGOLIAN TT_UCR_MONGOLIAN}
    • + *
    • {@link #TT_UCR_BRAILLE TT_UCR_BRAILLE}
    • + *
    • {@link #TT_UCR_YI TT_UCR_YI}
    • + *
    • {@link #TT_UCR_PHILIPPINE TT_UCR_PHILIPPINE}
    • + *
    • {@link #TT_UCR_OLD_ITALIC TT_UCR_OLD_ITALIC}
    • + *
    • {@link #TT_UCR_GOTHIC TT_UCR_GOTHIC}
    • + *
    • {@link #TT_UCR_DESERET TT_UCR_DESERET}
    • + *
    • {@link #TT_UCR_MUSICAL_SYMBOLS TT_UCR_MUSICAL_SYMBOLS}
    • + *
    • {@link #TT_UCR_MATH_ALPHANUMERIC_SYMBOLS TT_UCR_MATH_ALPHANUMERIC_SYMBOLS}
    • + *
    • {@link #TT_UCR_PRIVATE_USE_SUPPLEMENTARY TT_UCR_PRIVATE_USE_SUPPLEMENTARY}
    • + *
    • {@link #TT_UCR_VARIATION_SELECTORS TT_UCR_VARIATION_SELECTORS}
    • + *
    • {@link #TT_UCR_TAGS TT_UCR_TAGS}
    • + *
    • {@link #TT_UCR_LIMBU TT_UCR_LIMBU}
    • + *
    • {@link #TT_UCR_TAI_LE TT_UCR_TAI_LE}
    • + *
    • {@link #TT_UCR_NEW_TAI_LUE TT_UCR_NEW_TAI_LUE}
    • + *
    • {@link #TT_UCR_BUGINESE TT_UCR_BUGINESE}
    • + *
    • {@link #TT_UCR_GLAGOLITIC TT_UCR_GLAGOLITIC}
    • + *
    • {@link #TT_UCR_TIFINAGH TT_UCR_TIFINAGH}
    • + *
    • {@link #TT_UCR_YIJING TT_UCR_YIJING}
    • + *
    • {@link #TT_UCR_SYLOTI_NAGRI TT_UCR_SYLOTI_NAGRI}
    • + *
    • {@link #TT_UCR_LINEAR_B TT_UCR_LINEAR_B}
    • + *
    • {@link #TT_UCR_ANCIENT_GREEK_NUMBERS TT_UCR_ANCIENT_GREEK_NUMBERS}
    • + *
    • {@link #TT_UCR_UGARITIC TT_UCR_UGARITIC}
    • + *
    • {@link #TT_UCR_OLD_PERSIAN TT_UCR_OLD_PERSIAN}
    • + *
    • {@link #TT_UCR_SHAVIAN TT_UCR_SHAVIAN}
    • + *
    • {@link #TT_UCR_OSMANYA TT_UCR_OSMANYA}
    • + *
    • {@link #TT_UCR_CYPRIOT_SYLLABARY TT_UCR_CYPRIOT_SYLLABARY}
    • + *
    • {@link #TT_UCR_KHAROSHTHI TT_UCR_KHAROSHTHI}
    • + *
    • {@link #TT_UCR_TAI_XUAN_JING TT_UCR_TAI_XUAN_JING}
    • + *
    • {@link #TT_UCR_CUNEIFORM TT_UCR_CUNEIFORM}
    • + *
    • {@link #TT_UCR_COUNTING_ROD_NUMERALS TT_UCR_COUNTING_ROD_NUMERALS}
    • + *
    • {@link #TT_UCR_SUNDANESE TT_UCR_SUNDANESE}
    • + *
    • {@link #TT_UCR_LEPCHA TT_UCR_LEPCHA}
    • + *
    • {@link #TT_UCR_OL_CHIKI TT_UCR_OL_CHIKI}
    • + *
    • {@link #TT_UCR_SAURASHTRA TT_UCR_SAURASHTRA}
    • + *
    • {@link #TT_UCR_KAYAH_LI TT_UCR_KAYAH_LI}
    • + *
    • {@link #TT_UCR_REJANG TT_UCR_REJANG}
    • + *
    • {@link #TT_UCR_CHAM TT_UCR_CHAM}
    • + *
    • {@link #TT_UCR_ANCIENT_SYMBOLS TT_UCR_ANCIENT_SYMBOLS}
    • + *
    • {@link #TT_UCR_PHAISTOS_DISC TT_UCR_PHAISTOS_DISC}
    • + *
    • {@link #TT_UCR_OLD_ANATOLIAN TT_UCR_OLD_ANATOLIAN}
    • + *
    • {@link #TT_UCR_GAME_TILES TT_UCR_GAME_TILES}
    • + *
    + */ + public static final int + TT_UCR_BASIC_LATIN = 1 << 0, + TT_UCR_LATIN1_SUPPLEMENT = 1 << 1, + TT_UCR_LATIN_EXTENDED_A = 1 << 2, + TT_UCR_LATIN_EXTENDED_B = 1 << 3, + TT_UCR_IPA_EXTENSIONS = 1 << 4, + TT_UCR_SPACING_MODIFIER = 1 << 5, + TT_UCR_COMBINING_DIACRITICAL_MARKS = 1 << 6, + TT_UCR_GREEK = 1 << 7, + TT_UCR_COPTIC = 1 << 8, + TT_UCR_CYRILLIC = 1 << 9, + TT_UCR_ARMENIAN = 1 << 10, + TT_UCR_HEBREW = 1 << 11, + TT_UCR_VAI = 1 << 12, + TT_UCR_ARABIC = 1 << 13, + TT_UCR_NKO = 1 << 14, + TT_UCR_DEVANAGARI = 1 << 15, + TT_UCR_BENGALI = 1 << 16, + TT_UCR_GURMUKHI = 1 << 17, + TT_UCR_GUJARATI = 1 << 18, + TT_UCR_ORIYA = 1 << 19, + TT_UCR_TAMIL = 1 << 20, + TT_UCR_TELUGU = 1 << 21, + TT_UCR_KANNADA = 1 << 22, + TT_UCR_MALAYALAM = 1 << 23, + TT_UCR_THAI = 1 << 24, + TT_UCR_LAO = 1 << 25, + TT_UCR_GEORGIAN = 1 << 26, + TT_UCR_BALINESE = 1 << 27, + TT_UCR_HANGUL_JAMO = 1 << 28, + TT_UCR_LATIN_EXTENDED_ADDITIONAL = 1 << 29, + TT_UCR_GREEK_EXTENDED = 1 << 30, + TT_UCR_GENERAL_PUNCTUATION = 1 << 31, + TT_UCR_SUPERSCRIPTS_SUBSCRIPTS = 1 << 0, + TT_UCR_CURRENCY_SYMBOLS = 1 << 1, + TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB = 1 << 2, + TT_UCR_LETTERLIKE_SYMBOLS = 1 << 3, + TT_UCR_NUMBER_FORMS = 1 << 4, + TT_UCR_ARROWS = 1 << 5, + TT_UCR_MATHEMATICAL_OPERATORS = 1 << 6, + TT_UCR_MISCELLANEOUS_TECHNICAL = 1 << 7, + TT_UCR_CONTROL_PICTURES = 1 << 8, + TT_UCR_OCR = 1 << 9, + TT_UCR_ENCLOSED_ALPHANUMERICS = 1 << 10, + TT_UCR_BOX_DRAWING = 1 << 11, + TT_UCR_BLOCK_ELEMENTS = 1 << 12, + TT_UCR_GEOMETRIC_SHAPES = 1 << 13, + TT_UCR_MISCELLANEOUS_SYMBOLS = 1 << 14, + TT_UCR_DINGBATS = 1 << 15, + TT_UCR_CJK_SYMBOLS = 1 << 16, + TT_UCR_HIRAGANA = 1 << 17, + TT_UCR_KATAKANA = 1 << 18, + TT_UCR_BOPOMOFO = 1 << 19, + TT_UCR_HANGUL_COMPATIBILITY_JAMO = 1 << 20, + TT_UCR_CJK_MISC = 1 << 21, + TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS = 1 << 22, + TT_UCR_CJK_COMPATIBILITY = 1 << 23, + TT_UCR_HANGUL = 1 << 24, + TT_UCR_SURROGATES = 1 << 25, + TT_UCR_PHOENICIAN = 1 << 26, + TT_UCR_CJK_UNIFIED_IDEOGRAPHS = 1 << 27, + TT_UCR_PRIVATE_USE = 1 << 28, + TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS = 1 << 29, + TT_UCR_ALPHABETIC_PRESENTATION_FORMS = 1 << 30, + TT_UCR_ARABIC_PRESENTATION_FORMS_A = 1 << 31, + TT_UCR_COMBINING_HALF_MARKS = 1 << 0, + TT_UCR_CJK_COMPATIBILITY_FORMS = 1 << 1, + TT_UCR_SMALL_FORM_VARIANTS = 1 << 2, + TT_UCR_ARABIC_PRESENTATION_FORMS_B = 1 << 3, + TT_UCR_HALFWIDTH_FULLWIDTH_FORMS = 1 << 4, + TT_UCR_SPECIALS = 1 << 5, + TT_UCR_TIBETAN = 1 << 6, + TT_UCR_SYRIAC = 1 << 7, + TT_UCR_THAANA = 1 << 8, + TT_UCR_SINHALA = 1 << 9, + TT_UCR_MYANMAR = 1 << 10, + TT_UCR_ETHIOPIC = 1 << 11, + TT_UCR_CHEROKEE = 1 << 12, + TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS = 1 << 13, + TT_UCR_OGHAM = 1 << 14, + TT_UCR_RUNIC = 1 << 15, + TT_UCR_KHMER = 1 << 16, + TT_UCR_MONGOLIAN = 1 << 17, + TT_UCR_BRAILLE = 1 << 18, + TT_UCR_YI = 1 << 19, + TT_UCR_PHILIPPINE = 1 << 20, + TT_UCR_OLD_ITALIC = 1 << 21, + TT_UCR_GOTHIC = 1 << 22, + TT_UCR_DESERET = 1 << 23, + TT_UCR_MUSICAL_SYMBOLS = 1 << 24, + TT_UCR_MATH_ALPHANUMERIC_SYMBOLS = 1 << 25, + TT_UCR_PRIVATE_USE_SUPPLEMENTARY = 1 << 26, + TT_UCR_VARIATION_SELECTORS = 1 << 27, + TT_UCR_TAGS = 1 << 28, + TT_UCR_LIMBU = 1 << 29, + TT_UCR_TAI_LE = 1 << 30, + TT_UCR_NEW_TAI_LUE = 1 << 31, + TT_UCR_BUGINESE = 1 << 0, + TT_UCR_GLAGOLITIC = 1 << 1, + TT_UCR_TIFINAGH = 1 << 2, + TT_UCR_YIJING = 1 << 3, + TT_UCR_SYLOTI_NAGRI = 1 << 4, + TT_UCR_LINEAR_B = 1 << 5, + TT_UCR_ANCIENT_GREEK_NUMBERS = 1 << 6, + TT_UCR_UGARITIC = 1 << 7, + TT_UCR_OLD_PERSIAN = 1 << 8, + TT_UCR_SHAVIAN = 1 << 9, + TT_UCR_OSMANYA = 1 << 10, + TT_UCR_CYPRIOT_SYLLABARY = 1 << 11, + TT_UCR_KHAROSHTHI = 1 << 12, + TT_UCR_TAI_XUAN_JING = 1 << 13, + TT_UCR_CUNEIFORM = 1 << 14, + TT_UCR_COUNTING_ROD_NUMERALS = 1 << 15, + TT_UCR_SUNDANESE = 1 << 16, + TT_UCR_LEPCHA = 1 << 17, + TT_UCR_OL_CHIKI = 1 << 18, + TT_UCR_SAURASHTRA = 1 << 19, + TT_UCR_KAYAH_LI = 1 << 20, + TT_UCR_REJANG = 1 << 21, + TT_UCR_CHAM = 1 << 22, + TT_UCR_ANCIENT_SYMBOLS = 1 << 23, + TT_UCR_PHAISTOS_DISC = 1 << 24, + TT_UCR_OLD_ANATOLIAN = 1 << 25, + TT_UCR_GAME_TILES = 1 << 26; + + /** + * {@code FT_Sfnt_Tag} + * + *
    Enum values:
    + * + *
      + *
    • {@link #FT_SFNT_HEAD SFNT_HEAD}
    • + *
    • {@link #FT_SFNT_MAXP SFNT_MAXP}
    • + *
    • {@link #FT_SFNT_OS2 SFNT_OS2}
    • + *
    • {@link #FT_SFNT_HHEA SFNT_HHEA}
    • + *
    • {@link #FT_SFNT_VHEA SFNT_VHEA}
    • + *
    • {@link #FT_SFNT_POST SFNT_POST}
    • + *
    • {@link #FT_SFNT_PCLT SFNT_PCLT}
    • + *
    • {@link #FT_SFNT_MAX SFNT_MAX}
    • + *
    + */ + public static final int + FT_SFNT_HEAD = 0, + FT_SFNT_MAXP = 1, + FT_SFNT_OS2 = 2, + FT_SFNT_HHEA = 3, + FT_SFNT_VHEA = 4, + FT_SFNT_POST = 5, + FT_SFNT_PCLT = 6, + FT_SFNT_MAX = 7; + + public static final int + TTAG_avar = FT_MAKE_TAG( 'a', 'v', 'a', 'r' ), + TTAG_BASE = FT_MAKE_TAG( 'B', 'A', 'S', 'E' ), + TTAG_bdat = FT_MAKE_TAG( 'b', 'd', 'a', 't' ), + TTAG_BDF = FT_MAKE_TAG( 'B', 'D', 'F', ' ' ), + TTAG_bhed = FT_MAKE_TAG( 'b', 'h', 'e', 'd' ), + TTAG_bloc = FT_MAKE_TAG( 'b', 'l', 'o', 'c' ), + TTAG_bsln = FT_MAKE_TAG( 'b', 's', 'l', 'n' ), + TTAG_CBDT = FT_MAKE_TAG( 'C', 'B', 'D', 'T' ), + TTAG_CBLC = FT_MAKE_TAG( 'C', 'B', 'L', 'C' ), + TTAG_CFF = FT_MAKE_TAG( 'C', 'F', 'F', ' ' ), + TTAG_CFF2 = FT_MAKE_TAG( 'C', 'F', 'F', '2' ), + TTAG_CID = FT_MAKE_TAG( 'C', 'I', 'D', ' ' ), + TTAG_cmap = FT_MAKE_TAG( 'c', 'm', 'a', 'p' ), + TTAG_COLR = FT_MAKE_TAG( 'C', 'O', 'L', 'R' ), + TTAG_CPAL = FT_MAKE_TAG( 'C', 'P', 'A', 'L' ), + TTAG_cvar = FT_MAKE_TAG( 'c', 'v', 'a', 'r' ), + TTAG_cvt = FT_MAKE_TAG( 'c', 'v', 't', ' ' ), + TTAG_DSIG = FT_MAKE_TAG( 'D', 'S', 'I', 'G' ), + TTAG_EBDT = FT_MAKE_TAG( 'E', 'B', 'D', 'T' ), + TTAG_EBLC = FT_MAKE_TAG( 'E', 'B', 'L', 'C' ), + TTAG_EBSC = FT_MAKE_TAG( 'E', 'B', 'S', 'C' ), + TTAG_feat = FT_MAKE_TAG( 'f', 'e', 'a', 't' ), + TTAG_FOND = FT_MAKE_TAG( 'F', 'O', 'N', 'D' ), + TTAG_fpgm = FT_MAKE_TAG( 'f', 'p', 'g', 'm' ), + TTAG_fvar = FT_MAKE_TAG( 'f', 'v', 'a', 'r' ), + TTAG_gasp = FT_MAKE_TAG( 'g', 'a', 's', 'p' ), + TTAG_GDEF = FT_MAKE_TAG( 'G', 'D', 'E', 'F' ), + TTAG_glyf = FT_MAKE_TAG( 'g', 'l', 'y', 'f' ), + TTAG_GPOS = FT_MAKE_TAG( 'G', 'P', 'O', 'S' ), + TTAG_GSUB = FT_MAKE_TAG( 'G', 'S', 'U', 'B' ), + TTAG_gvar = FT_MAKE_TAG( 'g', 'v', 'a', 'r' ), + TTAG_HVAR = FT_MAKE_TAG( 'H', 'V', 'A', 'R' ), + TTAG_hdmx = FT_MAKE_TAG( 'h', 'd', 'm', 'x' ), + TTAG_head = FT_MAKE_TAG( 'h', 'e', 'a', 'd' ), + TTAG_hhea = FT_MAKE_TAG( 'h', 'h', 'e', 'a' ), + TTAG_hmtx = FT_MAKE_TAG( 'h', 'm', 't', 'x' ), + TTAG_JSTF = FT_MAKE_TAG( 'J', 'S', 'T', 'F' ), + TTAG_just = FT_MAKE_TAG( 'j', 'u', 's', 't' ), + TTAG_kern = FT_MAKE_TAG( 'k', 'e', 'r', 'n' ), + TTAG_lcar = FT_MAKE_TAG( 'l', 'c', 'a', 'r' ), + TTAG_loca = FT_MAKE_TAG( 'l', 'o', 'c', 'a' ), + TTAG_LTSH = FT_MAKE_TAG( 'L', 'T', 'S', 'H' ), + TTAG_LWFN = FT_MAKE_TAG( 'L', 'W', 'F', 'N' ), + TTAG_MATH = FT_MAKE_TAG( 'M', 'A', 'T', 'H' ), + TTAG_maxp = FT_MAKE_TAG( 'm', 'a', 'x', 'p' ), + TTAG_META = FT_MAKE_TAG( 'M', 'E', 'T', 'A' ), + TTAG_MMFX = FT_MAKE_TAG( 'M', 'M', 'F', 'X' ), + TTAG_MMSD = FT_MAKE_TAG( 'M', 'M', 'S', 'D' ), + TTAG_mort = FT_MAKE_TAG( 'm', 'o', 'r', 't' ), + TTAG_morx = FT_MAKE_TAG( 'm', 'o', 'r', 'x' ), + TTAG_MVAR = FT_MAKE_TAG( 'M', 'V', 'A', 'R' ), + TTAG_name = FT_MAKE_TAG( 'n', 'a', 'm', 'e' ), + TTAG_opbd = FT_MAKE_TAG( 'o', 'p', 'b', 'd' ), + TTAG_OS2 = FT_MAKE_TAG( 'O', 'S', '/', '2' ), + TTAG_OTTO = FT_MAKE_TAG( 'O', 'T', 'T', 'O' ), + TTAG_PCLT = FT_MAKE_TAG( 'P', 'C', 'L', 'T' ), + TTAG_POST = FT_MAKE_TAG( 'P', 'O', 'S', 'T' ), + TTAG_post = FT_MAKE_TAG( 'p', 'o', 's', 't' ), + TTAG_prep = FT_MAKE_TAG( 'p', 'r', 'e', 'p' ), + TTAG_prop = FT_MAKE_TAG( 'p', 'r', 'o', 'p' ), + TTAG_sbix = FT_MAKE_TAG( 's', 'b', 'i', 'x' ), + TTAG_sfnt = FT_MAKE_TAG( 's', 'f', 'n', 't' ), + TTAG_SING = FT_MAKE_TAG( 'S', 'I', 'N', 'G' ), + TTAG_SVG = FT_MAKE_TAG( 'S', 'V', 'G', ' ' ), + TTAG_trak = FT_MAKE_TAG( 't', 'r', 'a', 'k' ), + TTAG_true = FT_MAKE_TAG( 't', 'r', 'u', 'e' ), + TTAG_ttc = FT_MAKE_TAG( 't', 't', 'c', ' ' ), + TTAG_ttcf = FT_MAKE_TAG( 't', 't', 'c', 'f' ), + TTAG_TYP1 = FT_MAKE_TAG( 'T', 'Y', 'P', '1' ), + TTAG_typ1 = FT_MAKE_TAG( 't', 'y', 'p', '1' ), + TTAG_VDMX = FT_MAKE_TAG( 'V', 'D', 'M', 'X' ), + TTAG_vhea = FT_MAKE_TAG( 'v', 'h', 'e', 'a' ), + TTAG_vmtx = FT_MAKE_TAG( 'v', 'm', 't', 'x' ), + TTAG_VVAR = FT_MAKE_TAG( 'V', 'V', 'A', 'R' ), + TTAG_wOFF = FT_MAKE_TAG( 'w', 'O', 'F', 'F' ), + TTAG_wOF2 = FT_MAKE_TAG( 'w', 'O', 'F', '2' ), + TTAG_0xA5kbd = FT_MAKE_TAG( 0xA5, 'k', 'b', 'd' ), + TTAG_0xA5lst = FT_MAKE_TAG( 0xA5, 'l', 's', 't' ); + + protected FreeType() { + throw new UnsupportedOperationException(); + } + + // --- [ FT_Init_FreeType ] --- + + public static int nFT_Init_FreeType(long alibrary) { + long __functionAddress = Functions.Init_FreeType; + return invokePI(alibrary, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Init_FreeType(@NativeType("FT_Library *") PointerBuffer alibrary) { + if (CHECKS) { + check(alibrary, 1); + } + return nFT_Init_FreeType(memAddress(alibrary)); + } + + // --- [ FT_Done_FreeType ] --- + + @NativeType("FT_Error") + public static int FT_Done_FreeType(@NativeType("FT_Library") long library) { + long __functionAddress = Functions.Done_FreeType; + if (CHECKS) { + check(library); + } + return invokePI(library, __functionAddress); + } + + // --- [ FT_New_Face ] --- + + public static int nFT_New_Face(long library, long filepathname, long face_index, long aface) { + long __functionAddress = Functions.New_Face; + if (CHECKS) { + check(library); + } + return invokePPNPI(library, filepathname, face_index, aface, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_New_Face(@NativeType("FT_Library") long library, @NativeType("char const *") ByteBuffer filepathname, @NativeType("FT_Long") long face_index, @NativeType("FT_Face *") PointerBuffer aface) { + if (CHECKS) { + checkNT1(filepathname); + check(aface, 1); + } + return nFT_New_Face(library, memAddress(filepathname), face_index, memAddress(aface)); + } + + @NativeType("FT_Error") + public static int FT_New_Face(@NativeType("FT_Library") long library, @NativeType("char const *") CharSequence filepathname, @NativeType("FT_Long") long face_index, @NativeType("FT_Face *") PointerBuffer aface) { + if (CHECKS) { + check(aface, 1); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filepathname, true); + long filepathnameEncoded = stack.getPointerAddress(); + return nFT_New_Face(library, filepathnameEncoded, face_index, memAddress(aface)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ FT_New_Memory_Face ] --- + + public static int nFT_New_Memory_Face(long library, long file_base, long file_size, long face_index, long aface) { + long __functionAddress = Functions.New_Memory_Face; + if (CHECKS) { + check(library); + } + return invokePPNNPI(library, file_base, file_size, face_index, aface, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_New_Memory_Face(@NativeType("FT_Library") long library, @NativeType("FT_Byte const *") ByteBuffer file_base, @NativeType("FT_Long") long face_index, @NativeType("FT_Face *") PointerBuffer aface) { + if (CHECKS) { + check(aface, 1); + } + return nFT_New_Memory_Face(library, memAddress(file_base), file_base.remaining(), face_index, memAddress(aface)); + } + + // --- [ FT_Open_Face ] --- + + public static int nFT_Open_Face(long library, long args, long face_index, long aface) { + long __functionAddress = Functions.Open_Face; + if (CHECKS) { + check(library); + } + return invokePPNPI(library, args, face_index, aface, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Open_Face(@NativeType("FT_Library") long library, @NativeType("FT_Open_Args const *") FT_Open_Args args, @NativeType("FT_Long") long face_index, @NativeType("FT_Face *") PointerBuffer aface) { + if (CHECKS) { + check(aface, 1); + } + return nFT_Open_Face(library, args.address(), face_index, memAddress(aface)); + } + + // --- [ FT_Attach_File ] --- + + public static int nFT_Attach_File(long face, long filepathname) { + long __functionAddress = Functions.Attach_File; + return invokePPI(face, filepathname, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Attach_File(FT_Face face, @NativeType("char const *") ByteBuffer filepathname) { + if (CHECKS) { + checkNT1(filepathname); + } + return nFT_Attach_File(face.address(), memAddress(filepathname)); + } + + @NativeType("FT_Error") + public static int FT_Attach_File(FT_Face face, @NativeType("char const *") CharSequence filepathname) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(filepathname, true); + long filepathnameEncoded = stack.getPointerAddress(); + return nFT_Attach_File(face.address(), filepathnameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ FT_Attach_Stream ] --- + + public static int nFT_Attach_Stream(long face, long parameters) { + long __functionAddress = Functions.Attach_Stream; + return invokePPI(face, parameters, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Attach_Stream(FT_Face face, @NativeType("FT_Open_Args const *") FT_Open_Args parameters) { + return nFT_Attach_Stream(face.address(), parameters.address()); + } + + // --- [ FT_Reference_Face ] --- + + public static int nFT_Reference_Face(long face) { + long __functionAddress = Functions.Reference_Face; + return invokePI(face, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Reference_Face(FT_Face face) { + return nFT_Reference_Face(face.address()); + } + + // --- [ FT_Done_Face ] --- + + public static int nFT_Done_Face(long face) { + long __functionAddress = Functions.Done_Face; + return invokePI(face, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Done_Face(FT_Face face) { + return nFT_Done_Face(face.address()); + } + + // --- [ FT_Select_Size ] --- + + public static int nFT_Select_Size(long face, int strike_index) { + long __functionAddress = Functions.Select_Size; + return invokePI(face, strike_index, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Select_Size(FT_Face face, @NativeType("FT_Int") int strike_index) { + return nFT_Select_Size(face.address(), strike_index); + } + + // --- [ FT_Request_Size ] --- + + public static int nFT_Request_Size(long face, long req) { + long __functionAddress = Functions.Request_Size; + return invokePPI(face, req, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Request_Size(FT_Face face, FT_Size_Request req) { + return nFT_Request_Size(face.address(), req.address()); + } + + // --- [ FT_Set_Char_Size ] --- + + public static int nFT_Set_Char_Size(long face, long char_width, long char_height, int horz_resolution, int vert_resolution) { + long __functionAddress = Functions.Set_Char_Size; + return invokePNNI(face, char_width, char_height, horz_resolution, vert_resolution, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Set_Char_Size(FT_Face face, @NativeType("FT_F26Dot6") long char_width, @NativeType("FT_F26Dot6") long char_height, @NativeType("FT_UInt") int horz_resolution, @NativeType("FT_UInt") int vert_resolution) { + return nFT_Set_Char_Size(face.address(), char_width, char_height, horz_resolution, vert_resolution); + } + + // --- [ FT_Set_Pixel_Sizes ] --- + + public static int nFT_Set_Pixel_Sizes(long face, int pixel_width, int pixel_height) { + long __functionAddress = Functions.Set_Pixel_Sizes; + return invokePI(face, pixel_width, pixel_height, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Set_Pixel_Sizes(FT_Face face, @NativeType("FT_UInt") int pixel_width, @NativeType("FT_UInt") int pixel_height) { + return nFT_Set_Pixel_Sizes(face.address(), pixel_width, pixel_height); + } + + // --- [ FT_Load_Glyph ] --- + + public static int nFT_Load_Glyph(long face, int glyph_index, int load_flags) { + long __functionAddress = Functions.Load_Glyph; + return invokePI(face, glyph_index, load_flags, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Load_Glyph(FT_Face face, @NativeType("FT_UInt") int glyph_index, @NativeType("FT_Int32") int load_flags) { + return nFT_Load_Glyph(face.address(), glyph_index, load_flags); + } + + // --- [ FT_Load_Char ] --- + + public static int nFT_Load_Char(long face, long char_code, int load_flags) { + long __functionAddress = Functions.Load_Char; + return invokePNI(face, char_code, load_flags, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Load_Char(FT_Face face, @NativeType("FT_ULong") long char_code, @NativeType("FT_Int32") int load_flags) { + return nFT_Load_Char(face.address(), char_code, load_flags); + } + + // --- [ FT_Set_Transform ] --- + + public static void nFT_Set_Transform(long face, long matrix, long delta) { + long __functionAddress = Functions.Set_Transform; + invokePPPV(face, matrix, delta, __functionAddress); + } + + public static void FT_Set_Transform(FT_Face face, @Nullable @NativeType("FT_Matrix *") FT_Matrix matrix, @Nullable @NativeType("FT_Vector *") FT_Vector delta) { + nFT_Set_Transform(face.address(), memAddressSafe(matrix), memAddressSafe(delta)); + } + + // --- [ FT_Get_Transform ] --- + + public static void nFT_Get_Transform(long face, long matrix, long delta) { + long __functionAddress = Functions.Get_Transform; + invokePPPV(face, matrix, delta, __functionAddress); + } + + public static void FT_Get_Transform(FT_Face face, @Nullable @NativeType("FT_Matrix *") FT_Matrix matrix, @Nullable @NativeType("FT_Vector *") FT_Vector delta) { + nFT_Get_Transform(face.address(), memAddressSafe(matrix), memAddressSafe(delta)); + } + + // --- [ FT_Render_Glyph ] --- + + public static int nFT_Render_Glyph(long slot, int render_mode) { + long __functionAddress = Functions.Render_Glyph; + return invokePI(slot, render_mode, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Render_Glyph(FT_GlyphSlot slot, @NativeType("FT_Render_Mode") int render_mode) { + return nFT_Render_Glyph(slot.address(), render_mode); + } + + // --- [ FT_Get_Kerning ] --- + + public static int nFT_Get_Kerning(long face, int left_glyph, int right_glyph, int kern_mode, long akerning) { + long __functionAddress = Functions.Get_Kerning; + return invokePPI(face, left_glyph, right_glyph, kern_mode, akerning, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Kerning(FT_Face face, @NativeType("FT_UInt") int left_glyph, @NativeType("FT_UInt") int right_glyph, @NativeType("FT_UInt") int kern_mode, @NativeType("FT_Vector *") FT_Vector akerning) { + return nFT_Get_Kerning(face.address(), left_glyph, right_glyph, kern_mode, akerning.address()); + } + + // --- [ FT_Get_Track_Kerning ] --- + + public static int nFT_Get_Track_Kerning(long face, long point_size, int degree, long akerning) { + long __functionAddress = Functions.Get_Track_Kerning; + return invokePNPI(face, point_size, degree, akerning, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Track_Kerning(FT_Face face, @NativeType("FT_Fixed") long point_size, @NativeType("FT_Int") int degree, @NativeType("FT_Fixed *") CLongBuffer akerning) { + if (CHECKS) { + check(akerning, 1); + } + return nFT_Get_Track_Kerning(face.address(), point_size, degree, memAddress(akerning)); + } + + // --- [ FT_Select_Charmap ] --- + + public static int nFT_Select_Charmap(long face, int encoding) { + long __functionAddress = Functions.Select_Charmap; + return invokePI(face, encoding, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Select_Charmap(FT_Face face, @NativeType("FT_Encoding") int encoding) { + return nFT_Select_Charmap(face.address(), encoding); + } + + // --- [ FT_Set_Charmap ] --- + + public static int nFT_Set_Charmap(long face, long charmap) { + long __functionAddress = Functions.Set_Charmap; + return invokePPI(face, charmap, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Set_Charmap(FT_Face face, FT_CharMap charmap) { + return nFT_Set_Charmap(face.address(), charmap.address()); + } + + // --- [ FT_Get_Charmap_Index ] --- + + public static int nFT_Get_Charmap_Index(long charmap) { + long __functionAddress = Functions.Get_Charmap_Index; + return invokePI(charmap, __functionAddress); + } + + @NativeType("FT_Int") + public static int FT_Get_Charmap_Index(FT_CharMap charmap) { + return nFT_Get_Charmap_Index(charmap.address()); + } + + // --- [ FT_Get_Char_Index ] --- + + public static int nFT_Get_Char_Index(long face, long charcode) { + long __functionAddress = Functions.Get_Char_Index; + return invokePNI(face, charcode, __functionAddress); + } + + @NativeType("FT_UInt") + public static int FT_Get_Char_Index(FT_Face face, @NativeType("FT_ULong") long charcode) { + return nFT_Get_Char_Index(face.address(), charcode); + } + + // --- [ FT_Get_First_Char ] --- + + public static long nFT_Get_First_Char(long face, long agindex) { + long __functionAddress = Functions.Get_First_Char; + return invokePPN(face, agindex, __functionAddress); + } + + @NativeType("FT_ULong") + public static long FT_Get_First_Char(FT_Face face, @NativeType("FT_UInt *") IntBuffer agindex) { + if (CHECKS) { + check(agindex, 1); + } + return nFT_Get_First_Char(face.address(), memAddress(agindex)); + } + + // --- [ FT_Get_Next_Char ] --- + + /** Unsafe version of: {@link #FT_Get_Next_Char Get_Next_Char} */ + public static long nFT_Get_Next_Char(long face, long char_code, long agindex) { + long __functionAddress = Functions.Get_Next_Char; + return invokePNPN(face, char_code, agindex, __functionAddress); + } + + /** @return : The charmap's next character code */ + @NativeType("FT_ULong") + public static long FT_Get_Next_Char(FT_Face face, @NativeType("FT_ULong") long char_code, @NativeType("FT_UInt *") IntBuffer agindex) { + if (CHECKS) { + check(agindex, 1); + } + return nFT_Get_Next_Char(face.address(), char_code, memAddress(agindex)); + } + + // --- [ FT_Face_Properties ] --- + + public static int nFT_Face_Properties(long face, int num_properties, long properties) { + long __functionAddress = Functions.Face_Properties; + return invokePPI(face, num_properties, properties, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Face_Properties(FT_Face face, @NativeType("FT_Parameter *") FT_Parameter.Buffer properties) { + return nFT_Face_Properties(face.address(), properties.remaining(), properties.address()); + } + + // --- [ FT_Get_Name_Index ] --- + + public static int nFT_Get_Name_Index(long face, long glyph_name) { + long __functionAddress = Functions.Get_Name_Index; + return invokePPI(face, glyph_name, __functionAddress); + } + + @NativeType("FT_UInt") + public static int FT_Get_Name_Index(FT_Face face, @NativeType("FT_String const *") ByteBuffer glyph_name) { + if (CHECKS) { + checkNT1(glyph_name); + } + return nFT_Get_Name_Index(face.address(), memAddress(glyph_name)); + } + + @NativeType("FT_UInt") + public static int FT_Get_Name_Index(FT_Face face, @NativeType("FT_String const *") CharSequence glyph_name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(glyph_name, true); + long glyph_nameEncoded = stack.getPointerAddress(); + return nFT_Get_Name_Index(face.address(), glyph_nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ FT_Get_Glyph_Name ] --- + + public static int nFT_Get_Glyph_Name(long face, int glyph_index, long buffer, int buffer_max) { + long __functionAddress = Functions.Get_Glyph_Name; + return invokePPI(face, glyph_index, buffer, buffer_max, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Glyph_Name(FT_Face face, @NativeType("FT_UInt") int glyph_index, @NativeType("FT_Pointer") ByteBuffer buffer) { + return nFT_Get_Glyph_Name(face.address(), glyph_index, memAddress(buffer), buffer.remaining()); + } + + // --- [ FT_Get_Postscript_Name ] --- + + public static long nFT_Get_Postscript_Name(long face) { + long __functionAddress = Functions.Get_Postscript_Name; + return invokePP(face, __functionAddress); + } + + @Nullable + @NativeType("char const *") + public static String FT_Get_Postscript_Name(FT_Face face) { + long __result = nFT_Get_Postscript_Name(face.address()); + return memASCIISafe(__result); + } + + // --- [ FT_Get_SubGlyph_Info ] --- + + public static int nFT_Get_SubGlyph_Info(long glyph, int sub_index, long p_index, long p_flags, long p_arg1, long p_arg2, long p_transform) { + long __functionAddress = Functions.Get_SubGlyph_Info; + return invokePPPPPPI(glyph, sub_index, p_index, p_flags, p_arg1, p_arg2, p_transform, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_SubGlyph_Info(FT_GlyphSlot glyph, @NativeType("FT_UInt") int sub_index, @NativeType("FT_Int *") IntBuffer p_index, @NativeType("FT_UInt *") IntBuffer p_flags, @NativeType("FT_Int *") IntBuffer p_arg1, @NativeType("FT_Int *") IntBuffer p_arg2, @NativeType("FT_Matrix *") FT_Matrix p_transform) { + if (CHECKS) { + check(p_index, 1); + check(p_flags, 1); + check(p_arg1, 1); + check(p_arg2, 1); + } + return nFT_Get_SubGlyph_Info(glyph.address(), sub_index, memAddress(p_index), memAddress(p_flags), memAddress(p_arg1), memAddress(p_arg2), p_transform.address()); + } + + // --- [ FT_Get_FSType_Flags ] --- + + public static short nFT_Get_FSType_Flags(long face) { + long __functionAddress = Functions.Get_FSType_Flags; + return invokePC(face, __functionAddress); + } + + @NativeType("FT_UShort") + public static short FT_Get_FSType_Flags(FT_Face face) { + return nFT_Get_FSType_Flags(face.address()); + } + + // --- [ FT_Face_GetCharVariantIndex ] --- + + public static int nFT_Face_GetCharVariantIndex(long face, long charcode, long variantSelector) { + long __functionAddress = Functions.Face_GetCharVariantIndex; + return invokePNNI(face, charcode, variantSelector, __functionAddress); + } + + @NativeType("FT_UInt") + public static int FT_Face_GetCharVariantIndex(FT_Face face, @NativeType("FT_ULong") long charcode, @NativeType("FT_ULong") long variantSelector) { + return nFT_Face_GetCharVariantIndex(face.address(), charcode, variantSelector); + } + + // --- [ FT_Face_GetCharVariantIsDefault ] --- + + public static int nFT_Face_GetCharVariantIsDefault(long face, long charcode, long variantSelector) { + long __functionAddress = Functions.Face_GetCharVariantIsDefault; + return invokePNNI(face, charcode, variantSelector, __functionAddress); + } + + @NativeType("FT_Int") + public static int FT_Face_GetCharVariantIsDefault(FT_Face face, @NativeType("FT_ULong") long charcode, @NativeType("FT_ULong") long variantSelector) { + return nFT_Face_GetCharVariantIsDefault(face.address(), charcode, variantSelector); + } + + // --- [ FT_Face_GetVariantSelectors ] --- + + public static long nFT_Face_GetVariantSelectors(long face) { + long __functionAddress = Functions.Face_GetVariantSelectors; + return invokePP(face, __functionAddress); + } + + @NativeType("FT_UInt32 *") + public static long FT_Face_GetVariantSelectors(FT_Face face) { + return nFT_Face_GetVariantSelectors(face.address()); + } + + // --- [ FT_Face_GetVariantsOfChar ] --- + + public static long nFT_Face_GetVariantsOfChar(long face, long charcode) { + long __functionAddress = Functions.Face_GetVariantsOfChar; + return invokePNP(face, charcode, __functionAddress); + } + + @NativeType("FT_UInt32 *") + public static long FT_Face_GetVariantsOfChar(FT_Face face, @NativeType("FT_ULong") long charcode) { + return nFT_Face_GetVariantsOfChar(face.address(), charcode); + } + + // --- [ FT_Face_GetCharsOfVariant ] --- + + public static long nFT_Face_GetCharsOfVariant(long face, long variantSelector) { + long __functionAddress = Functions.Face_GetCharsOfVariant; + return invokePNP(face, variantSelector, __functionAddress); + } + + @NativeType("FT_UInt32 *") + public static long FT_Face_GetCharsOfVariant(FT_Face face, @NativeType("FT_ULong") long variantSelector) { + return nFT_Face_GetCharsOfVariant(face.address(), variantSelector); + } + + // --- [ FT_MulDiv ] --- + + @NativeType("FT_Long") + public static long FT_MulDiv(@NativeType("FT_Long") long a, @NativeType("FT_Long") long b, @NativeType("FT_Long") long c) { + long __functionAddress = Functions.MulDiv; + return invokeNNNN(a, b, c, __functionAddress); + } + + // --- [ FT_MulFix ] --- + + @NativeType("FT_Long") + public static long FT_MulFix(@NativeType("FT_Long") long a, @NativeType("FT_Long") long b) { + long __functionAddress = Functions.MulFix; + return invokeNNN(a, b, __functionAddress); + } + + // --- [ FT_DivFix ] --- + + @NativeType("FT_Long") + public static long FT_DivFix(@NativeType("FT_Long") long a, @NativeType("FT_Long") long b) { + long __functionAddress = Functions.DivFix; + return invokeNNN(a, b, __functionAddress); + } + + // --- [ FT_RoundFix ] --- + + @NativeType("FT_Fixed") + public static long FT_RoundFix(@NativeType("FT_Fixed") long a) { + long __functionAddress = Functions.RoundFix; + return invokeNN(a, __functionAddress); + } + + // --- [ FT_CeilFix ] --- + + @NativeType("FT_Fixed") + public static long FT_CeilFix(@NativeType("FT_Fixed") long a) { + long __functionAddress = Functions.CeilFix; + return invokeNN(a, __functionAddress); + } + + // --- [ FT_FloorFix ] --- + + @NativeType("FT_Fixed") + public static long FT_FloorFix(@NativeType("FT_Fixed") long a) { + long __functionAddress = Functions.FloorFix; + return invokeNN(a, __functionAddress); + } + + // --- [ FT_Vector_Transform ] --- + + public static void nFT_Vector_Transform(long vector, long matrix) { + long __functionAddress = Functions.Vector_Transform; + invokePPV(vector, matrix, __functionAddress); + } + + public static void FT_Vector_Transform(@NativeType("FT_Vector *") FT_Vector vector, @NativeType("FT_Matrix const *") FT_Matrix matrix) { + nFT_Vector_Transform(vector.address(), matrix.address()); + } + + // --- [ FT_Library_Version ] --- + + public static void nFT_Library_Version(long library, long amajor, long aminor, long apatch) { + long __functionAddress = Functions.Library_Version; + if (CHECKS) { + check(library); + } + invokePPPPV(library, amajor, aminor, apatch, __functionAddress); + } + + public static void FT_Library_Version(@NativeType("FT_Library") long library, @NativeType("FT_Int *") IntBuffer amajor, @NativeType("FT_Int *") IntBuffer aminor, @NativeType("FT_Int *") IntBuffer apatch) { + if (CHECKS) { + check(amajor, 1); + check(aminor, 1); + check(apatch, 1); + } + nFT_Library_Version(library, memAddress(amajor), memAddress(aminor), memAddress(apatch)); + } + + // --- [ FT_Face_CheckTrueTypePatents ] --- + + public static boolean nFT_Face_CheckTrueTypePatents(long face) { + long __functionAddress = Functions.Face_CheckTrueTypePatents; + return invokePZ(face, __functionAddress); + } + + @NativeType("FT_Bool") + public static boolean FT_Face_CheckTrueTypePatents(FT_Face face) { + return nFT_Face_CheckTrueTypePatents(face.address()); + } + + // --- [ FT_Face_SetUnpatentedHinting ] --- + + public static boolean nFT_Face_SetUnpatentedHinting(long face, boolean value) { + long __functionAddress = Functions.Face_SetUnpatentedHinting; + return invokePZ(face, value, __functionAddress); + } + + @NativeType("FT_Bool") + public static boolean FT_Face_SetUnpatentedHinting(FT_Face face, @NativeType("FT_Bool") boolean value) { + return nFT_Face_SetUnpatentedHinting(face.address(), value); + } + + // --- [ FT_Get_Advance ] --- + + public static int nFT_Get_Advance(long face, int gindex, int load_flags, long padvance) { + long __functionAddress = Functions.Get_Advance; + return invokePPI(face, gindex, load_flags, padvance, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Advance(FT_Face face, @NativeType("FT_UInt") int gindex, @NativeType("FT_Int32") int load_flags, @NativeType("FT_Fixed *") CLongBuffer padvance) { + if (CHECKS) { + check(padvance, 1); + } + return nFT_Get_Advance(face.address(), gindex, load_flags, memAddress(padvance)); + } + + // --- [ FT_Get_Advances ] --- + + public static int nFT_Get_Advances(long face, int start, int count, int load_flags, long padvances) { + long __functionAddress = Functions.Get_Advances; + return invokePPI(face, start, count, load_flags, padvances, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Advances(FT_Face face, @NativeType("FT_UInt") int start, @NativeType("FT_Int32") int load_flags, @NativeType("FT_Fixed *") CLongBuffer padvances) { + return nFT_Get_Advances(face.address(), start, padvances.remaining(), load_flags, memAddress(padvances)); + } + + // --- [ FT_Outline_Get_BBox ] --- + + public static int nFT_Outline_Get_BBox(long outline, long abbox) { + long __functionAddress = Functions.Outline_Get_BBox; + return invokePPI(outline, abbox, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Outline_Get_BBox(@NativeType("FT_Outline *") FT_Outline outline, @NativeType("FT_BBox *") FT_BBox abbox) { + return nFT_Outline_Get_BBox(outline.address(), abbox.address()); + } + + // --- [ FT_Get_BDF_Charset_ID ] --- + + public static int nFT_Get_BDF_Charset_ID(long face, long acharset_encoding, long acharset_registry) { + long __functionAddress = Functions.Get_BDF_Charset_ID; + return invokePPPI(face, acharset_encoding, acharset_registry, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_BDF_Charset_ID(FT_Face face, @NativeType("char const **") PointerBuffer acharset_encoding, @NativeType("char const **") PointerBuffer acharset_registry) { + if (CHECKS) { + check(acharset_encoding, 1); + check(acharset_registry, 1); + } + return nFT_Get_BDF_Charset_ID(face.address(), memAddress(acharset_encoding), memAddress(acharset_registry)); + } + + // --- [ FT_Get_BDF_Property ] --- + + public static int nFT_Get_BDF_Property(long face, long prop_name, long aproperty) { + long __functionAddress = Functions.Get_BDF_Property; + return invokePPPI(face, prop_name, aproperty, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_BDF_Property(FT_Face face, @NativeType("char const *") ByteBuffer prop_name, @NativeType("BDF_PropertyRec *") BDF_Property aproperty) { + if (CHECKS) { + checkNT1(prop_name); + } + return nFT_Get_BDF_Property(face.address(), memAddress(prop_name), aproperty.address()); + } + + @NativeType("FT_Error") + public static int FT_Get_BDF_Property(FT_Face face, @NativeType("char const *") CharSequence prop_name, @NativeType("BDF_PropertyRec *") BDF_Property aproperty) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(prop_name, true); + long prop_nameEncoded = stack.getPointerAddress(); + return nFT_Get_BDF_Property(face.address(), prop_nameEncoded, aproperty.address()); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ FT_Bitmap_Init ] --- + + public static void nFT_Bitmap_Init(long abitmap) { + long __functionAddress = Functions.Bitmap_Init; + invokePV(abitmap, __functionAddress); + } + + public static void FT_Bitmap_Init(@NativeType("FT_Bitmap *") FT_Bitmap abitmap) { + nFT_Bitmap_Init(abitmap.address()); + } + + // --- [ FT_Bitmap_Copy ] --- + + public static int nFT_Bitmap_Copy(long library, long source, long target) { + long __functionAddress = Functions.Bitmap_Copy; + if (CHECKS) { + check(library); + } + return invokePPPI(library, source, target, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Bitmap_Copy(@NativeType("FT_Library") long library, @NativeType("FT_Bitmap const *") FT_Bitmap source, @NativeType("FT_Bitmap *") FT_Bitmap target) { + return nFT_Bitmap_Copy(library, source.address(), target.address()); + } + + // --- [ FT_Bitmap_Embolden ] --- + + public static int nFT_Bitmap_Embolden(long library, long bitmap, long xStrength, long yStrength) { + long __functionAddress = Functions.Bitmap_Embolden; + if (CHECKS) { + check(library); + } + return invokePPNNI(library, bitmap, xStrength, yStrength, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Bitmap_Embolden(@NativeType("FT_Library") long library, @NativeType("FT_Bitmap *") FT_Bitmap bitmap, @NativeType("FT_Pos") long xStrength, @NativeType("FT_Pos") long yStrength) { + return nFT_Bitmap_Embolden(library, bitmap.address(), xStrength, yStrength); + } + + // --- [ FT_Bitmap_Convert ] --- + + public static int nFT_Bitmap_Convert(long library, long source, long target, int alignment) { + long __functionAddress = Functions.Bitmap_Convert; + if (CHECKS) { + check(library); + } + return invokePPPI(library, source, target, alignment, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Bitmap_Convert(@NativeType("FT_Library") long library, @NativeType("FT_Bitmap const *") FT_Bitmap source, @NativeType("FT_Bitmap *") FT_Bitmap target, @NativeType("FT_Int") int alignment) { + return nFT_Bitmap_Convert(library, source.address(), target.address(), alignment); + } + + // --- [ FT_Bitmap_Blend ] --- + + private static final FFICIF FT_Bitmap_BlendCIF = apiCreateCIF( + FFI_DEFAULT_ABI, ffi_type_sint32, + ffi_type_pointer, ffi_type_pointer, apiCreateStruct(ffi_type_slong, ffi_type_slong), ffi_type_pointer, ffi_type_pointer, apiCreateStruct(ffi_type_uint8, ffi_type_uint8, ffi_type_uint8, ffi_type_uint8) + ); + + public static int nFT_Bitmap_Blend(long library, long source, long source_offset, long target, long atarget_offset, long color) { + long __functionAddress = Functions.Bitmap_Blend; + if (CHECKS) { + check(library); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long __result = stack.nint(0); + long arguments = stack.nmalloc(POINTER_SIZE, POINTER_SIZE * 6); + memPutAddress(arguments, stack.npointer(library)); + memPutAddress(arguments + POINTER_SIZE, stack.npointer(source)); + memPutAddress(arguments + 2 * POINTER_SIZE, source_offset); + memPutAddress(arguments + 3 * POINTER_SIZE, stack.npointer(target)); + memPutAddress(arguments + 4 * POINTER_SIZE, stack.npointer(atarget_offset)); + memPutAddress(arguments + 5 * POINTER_SIZE, color); + + nffi_call(FT_Bitmap_BlendCIF.address(), __functionAddress, __result, arguments); + + return memGetInt(__result); + } finally { + stack.setPointer(stackPointer); + } + } + + @NativeType("FT_Error") + public static int FT_Bitmap_Blend(@NativeType("FT_Library") long library, @NativeType("FT_Bitmap const *") FT_Bitmap source, @NativeType("FT_Vector const") FT_Vector source_offset, @NativeType("FT_Bitmap *") FT_Bitmap target, @NativeType("FT_Vector *") FT_Vector atarget_offset, FT_Color color) { + return nFT_Bitmap_Blend(library, source.address(), source_offset.address(), target.address(), atarget_offset.address(), color.address()); + } + + // --- [ FT_GlyphSlot_Own_Bitmap ] --- + + public static int nFT_GlyphSlot_Own_Bitmap(long slot) { + long __functionAddress = Functions.GlyphSlot_Own_Bitmap; + return invokePI(slot, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_GlyphSlot_Own_Bitmap(FT_GlyphSlot slot) { + return nFT_GlyphSlot_Own_Bitmap(slot.address()); + } + + // --- [ FT_Bitmap_Done ] --- + + public static int nFT_Bitmap_Done(long library, long bitmap) { + long __functionAddress = Functions.Bitmap_Done; + if (CHECKS) { + check(library); + } + return invokePPI(library, bitmap, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Bitmap_Done(@NativeType("FT_Library") long library, @NativeType("FT_Bitmap *") FT_Bitmap bitmap) { + return nFT_Bitmap_Done(library, bitmap.address()); + } + + // --- [ FT_Stream_OpenBzip2 ] --- + + public static int nFT_Stream_OpenBzip2(long stream, long source) { + long __functionAddress = Functions.Stream_OpenBzip2; + if (CHECKS) { + check(__functionAddress); + } + return invokePPI(stream, source, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Stream_OpenBzip2(FT_Stream stream, FT_Stream source) { + return nFT_Stream_OpenBzip2(stream.address(), source.address()); + } + + // --- [ FTC_Manager_New ] --- + + public static int nFTC_Manager_New(long library, int max_faces, int max_sizes, long max_bytes, long requester, long req_data, long amanager) { + long __functionAddress = Functions.FTC_Manager_New; + if (CHECKS) { + check(library); + } + return invokePNPPPI(library, max_faces, max_sizes, max_bytes, requester, req_data, amanager, __functionAddress); + } + + @NativeType("FT_Error") + public static int FTC_Manager_New(@NativeType("FT_Library") long library, @NativeType("FT_UInt") int max_faces, @NativeType("FT_UInt") int max_sizes, @NativeType("FT_ULong") long max_bytes, @NativeType("FTC_Face_Requester") FTC_Face_RequesterI requester, @Nullable @NativeType("FT_Pointer") ByteBuffer req_data, @NativeType("FTC_Manager *") PointerBuffer amanager) { + if (CHECKS) { + check(amanager, 1); + } + return nFTC_Manager_New(library, max_faces, max_sizes, max_bytes, requester.address(), memAddressSafe(req_data), memAddress(amanager)); + } + + // --- [ FTC_Manager_Reset ] --- + + public static void FTC_Manager_Reset(@NativeType("FTC_Manager") long manager) { + long __functionAddress = Functions.FTC_Manager_Reset; + if (CHECKS) { + check(manager); + } + invokePV(manager, __functionAddress); + } + + // --- [ FTC_Manager_Done ] --- + + public static void FTC_Manager_Done(@NativeType("FTC_Manager") long manager) { + long __functionAddress = Functions.FTC_Manager_Done; + if (CHECKS) { + check(manager); + } + invokePV(manager, __functionAddress); + } + + // --- [ FTC_Manager_LookupFace ] --- + + public static int nFTC_Manager_LookupFace(long manager, long face_id, long aface) { + long __functionAddress = Functions.FTC_Manager_LookupFace; + if (CHECKS) { + check(manager); + check(face_id); + } + return invokePPPI(manager, face_id, aface, __functionAddress); + } + + @NativeType("FT_Error") + public static int FTC_Manager_LookupFace(@NativeType("FTC_Manager") long manager, @NativeType("FTC_FaceID") long face_id, @NativeType("FT_Face *") PointerBuffer aface) { + if (CHECKS) { + check(aface, 1); + } + return nFTC_Manager_LookupFace(manager, face_id, memAddress(aface)); + } + + // --- [ FTC_Manager_LookupSize ] --- + + public static int nFTC_Manager_LookupSize(long manager, long scaler, long asize) { + long __functionAddress = Functions.FTC_Manager_LookupSize; + if (CHECKS) { + check(manager); + } + return invokePPPI(manager, scaler, asize, __functionAddress); + } + + @NativeType("FT_Error") + public static int FTC_Manager_LookupSize(@NativeType("FTC_Manager") long manager, FTC_Scaler scaler, @NativeType("FT_Size *") PointerBuffer asize) { + if (CHECKS) { + check(asize, 1); + } + return nFTC_Manager_LookupSize(manager, scaler.address(), memAddress(asize)); + } + + // --- [ FTC_Node_Unref ] --- + + public static void FTC_Node_Unref(@NativeType("FTC_Node") long node, @NativeType("FTC_Manager") long manager) { + long __functionAddress = Functions.FTC_Node_Unref; + if (CHECKS) { + check(node); + check(manager); + } + invokePPV(node, manager, __functionAddress); + } + + // --- [ FTC_Manager_RemoveFaceID ] --- + + public static void FTC_Manager_RemoveFaceID(@NativeType("FTC_Manager") long manager, @NativeType("FTC_FaceID") long face_id) { + long __functionAddress = Functions.FTC_Manager_RemoveFaceID; + if (CHECKS) { + check(manager); + check(face_id); + } + invokePPV(manager, face_id, __functionAddress); + } + + // --- [ FTC_CMapCache_New ] --- + + public static int nFTC_CMapCache_New(long manager, long acache) { + long __functionAddress = Functions.FTC_CMapCache_New; + if (CHECKS) { + check(manager); + } + return invokePPI(manager, acache, __functionAddress); + } + + @NativeType("FT_Error") + public static int FTC_CMapCache_New(@NativeType("FTC_Manager") long manager, @NativeType("FTC_CMapCache *") PointerBuffer acache) { + if (CHECKS) { + check(acache, 1); + } + return nFTC_CMapCache_New(manager, memAddress(acache)); + } + + // --- [ FTC_CMapCache_Lookup ] --- + + @NativeType("FT_UInt") + public static int FTC_CMapCache_Lookup(@NativeType("FTC_CMapCache") long cache, @NativeType("FTC_FaceID") long face_id, @NativeType("FT_Int") int cmap_index, @NativeType("FT_UInt32") int char_code) { + long __functionAddress = Functions.FTC_CMapCache_Lookup; + if (CHECKS) { + check(cache); + check(face_id); + } + return invokePPI(cache, face_id, cmap_index, char_code, __functionAddress); + } + + // --- [ FTC_ImageCache_New ] --- + + public static int nFTC_ImageCache_New(long manager, long acache) { + long __functionAddress = Functions.FTC_ImageCache_New; + if (CHECKS) { + check(manager); + } + return invokePPI(manager, acache, __functionAddress); + } + + @NativeType("FT_Error") + public static int FTC_ImageCache_New(@NativeType("FTC_Manager") long manager, @NativeType("FTC_ImageCache *") PointerBuffer acache) { + if (CHECKS) { + check(acache, 1); + } + return nFTC_ImageCache_New(manager, memAddress(acache)); + } + + // --- [ FTC_ImageCache_Lookup ] --- + + public static int nFTC_ImageCache_Lookup(long cache, long type, int gindex, long aglyph, long anode) { + long __functionAddress = Functions.FTC_ImageCache_Lookup; + if (CHECKS) { + check(cache); + } + return invokePPPPI(cache, type, gindex, aglyph, anode, __functionAddress); + } + + @NativeType("FT_Error") + public static int FTC_ImageCache_Lookup(@NativeType("FTC_ImageCache") long cache, FTC_ImageType type, @NativeType("FT_UInt") int gindex, @NativeType("FT_Glyph *") PointerBuffer aglyph, @Nullable @NativeType("FTC_Node *") PointerBuffer anode) { + if (CHECKS) { + check(aglyph, 1); + checkSafe(anode, 1); + } + return nFTC_ImageCache_Lookup(cache, type.address(), gindex, memAddress(aglyph), memAddressSafe(anode)); + } + + // --- [ FTC_ImageCache_LookupScaler ] --- + + public static int nFTC_ImageCache_LookupScaler(long cache, long scaler, long load_flags, int gindex, long aglyph, long anode) { + long __functionAddress = Functions.FTC_ImageCache_LookupScaler; + if (CHECKS) { + check(cache); + } + return invokePPNPPI(cache, scaler, load_flags, gindex, aglyph, anode, __functionAddress); + } + + @NativeType("FT_Error") + public static int FTC_ImageCache_LookupScaler(@NativeType("FTC_ImageCache") long cache, FTC_Scaler scaler, @NativeType("FT_ULong") long load_flags, @NativeType("FT_UInt") int gindex, @NativeType("FT_Glyph *") PointerBuffer aglyph, @Nullable @NativeType("FTC_Node *") PointerBuffer anode) { + if (CHECKS) { + check(aglyph, 1); + checkSafe(anode, 1); + } + return nFTC_ImageCache_LookupScaler(cache, scaler.address(), load_flags, gindex, memAddress(aglyph), memAddressSafe(anode)); + } + + // --- [ FTC_SBitCache_New ] --- + + public static int nFTC_SBitCache_New(long manager, long acache) { + long __functionAddress = Functions.FTC_SBitCache_New; + if (CHECKS) { + check(manager); + } + return invokePPI(manager, acache, __functionAddress); + } + + @NativeType("FT_Error") + public static int FTC_SBitCache_New(@NativeType("FTC_Manager") long manager, @NativeType("FTC_SBitCache *") PointerBuffer acache) { + if (CHECKS) { + check(acache, 1); + } + return nFTC_SBitCache_New(manager, memAddress(acache)); + } + + // --- [ FTC_SBitCache_Lookup ] --- + + public static int nFTC_SBitCache_Lookup(long cache, long type, int gindex, long sbit, long anode) { + long __functionAddress = Functions.FTC_SBitCache_Lookup; + if (CHECKS) { + check(cache); + } + return invokePPPPI(cache, type, gindex, sbit, anode, __functionAddress); + } + + @NativeType("FT_Error") + public static int FTC_SBitCache_Lookup(@NativeType("FTC_SBitCache") long cache, FTC_ImageType type, @NativeType("FT_UInt") int gindex, @NativeType("FTC_SBit *") PointerBuffer sbit, @Nullable @NativeType("FTC_Node *") PointerBuffer anode) { + if (CHECKS) { + check(sbit, 1); + checkSafe(anode, 1); + } + return nFTC_SBitCache_Lookup(cache, type.address(), gindex, memAddress(sbit), memAddressSafe(anode)); + } + + // --- [ FTC_SBitCache_LookupScaler ] --- + + public static int nFTC_SBitCache_LookupScaler(long cache, long scaler, long load_flags, int gindex, long sbit, long anode) { + long __functionAddress = Functions.FTC_SBitCache_LookupScaler; + if (CHECKS) { + check(cache); + } + return invokePPNPPI(cache, scaler, load_flags, gindex, sbit, anode, __functionAddress); + } + + @NativeType("FT_Error") + public static int FTC_SBitCache_LookupScaler(@NativeType("FTC_SBitCache") long cache, FTC_Scaler scaler, @NativeType("FT_ULong") long load_flags, @NativeType("FT_UInt") int gindex, @NativeType("FTC_SBit *") PointerBuffer sbit, @Nullable @NativeType("FTC_Node *") PointerBuffer anode) { + if (CHECKS) { + check(sbit, 1); + checkSafe(anode, 1); + } + return nFTC_SBitCache_LookupScaler(cache, scaler.address(), load_flags, gindex, memAddress(sbit), memAddressSafe(anode)); + } + + // --- [ FT_Get_CID_Registry_Ordering_Supplement ] --- + + public static int nFT_Get_CID_Registry_Ordering_Supplement(long face, long registry, long ordering, long supplement) { + long __functionAddress = Functions.Get_CID_Registry_Ordering_Supplement; + return invokePPPPI(face, registry, ordering, supplement, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_CID_Registry_Ordering_Supplement(FT_Face face, @NativeType("char const **") PointerBuffer registry, @NativeType("char const **") PointerBuffer ordering, @NativeType("FT_Int *") IntBuffer supplement) { + if (CHECKS) { + check(registry, 1); + check(ordering, 1); + check(supplement, 1); + } + return nFT_Get_CID_Registry_Ordering_Supplement(face.address(), memAddress(registry), memAddress(ordering), memAddress(supplement)); + } + + // --- [ FT_Get_CID_Is_Internally_CID_Keyed ] --- + + public static int nFT_Get_CID_Is_Internally_CID_Keyed(long face, long is_cid) { + long __functionAddress = Functions.Get_CID_Is_Internally_CID_Keyed; + return invokePPI(face, is_cid, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_CID_Is_Internally_CID_Keyed(FT_Face face, @NativeType("FT_Bool *") ByteBuffer is_cid) { + if (CHECKS) { + check(is_cid, 1); + } + return nFT_Get_CID_Is_Internally_CID_Keyed(face.address(), memAddress(is_cid)); + } + + // --- [ FT_Get_CID_From_Glyph_Index ] --- + + public static int nFT_Get_CID_From_Glyph_Index(long face, int glyph_index, long cid) { + long __functionAddress = Functions.Get_CID_From_Glyph_Index; + return invokePPI(face, glyph_index, cid, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_CID_From_Glyph_Index(FT_Face face, @NativeType("FT_UInt") int glyph_index, @NativeType("FT_UInt *") IntBuffer cid) { + if (CHECKS) { + check(cid, 1); + } + return nFT_Get_CID_From_Glyph_Index(face.address(), glyph_index, memAddress(cid)); + } + + // --- [ FT_Palette_Data_Get ] --- + + public static int nFT_Palette_Data_Get(long face, long apalette) { + long __functionAddress = Functions.Palette_Data_Get; + return invokePPI(face, apalette, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Palette_Data_Get(FT_Face face, @NativeType("FT_Palette_Data *") FT_Palette_Data apalette) { + return nFT_Palette_Data_Get(face.address(), apalette.address()); + } + + // --- [ FT_Palette_Select ] --- + + public static int nFT_Palette_Select(long face, short palette_index, long apalette) { + long __functionAddress = Functions.Palette_Select; + return invokePCPI(face, palette_index, apalette, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Palette_Select(FT_Face face, @NativeType("FT_UShort") short palette_index, @Nullable @NativeType("FT_Color **") PointerBuffer apalette) { + if (CHECKS) { + checkSafe(apalette, 1); + } + return nFT_Palette_Select(face.address(), palette_index, memAddressSafe(apalette)); + } + + // --- [ FT_Palette_Set_Foreground_Color ] --- + + private static final FFICIF FT_Palette_Set_Foreground_ColorCIF = apiCreateCIF( + FFI_DEFAULT_ABI, ffi_type_sint32, + ffi_type_pointer, apiCreateStruct(ffi_type_uint8, ffi_type_uint8, ffi_type_uint8, ffi_type_uint8) + ); + + public static int nFT_Palette_Set_Foreground_Color(long face, long foreground_color) { + long __functionAddress = Functions.Palette_Set_Foreground_Color; + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long __result = stack.nint(0); + long arguments = stack.nmalloc(POINTER_SIZE, POINTER_SIZE * 2); + memPutAddress(arguments, stack.npointer(face)); + memPutAddress(arguments + POINTER_SIZE, foreground_color); + + nffi_call(FT_Palette_Set_Foreground_ColorCIF.address(), __functionAddress, __result, arguments); + + return memGetInt(__result); + } finally { + stack.setPointer(stackPointer); + } + } + + @NativeType("FT_Error") + public static int FT_Palette_Set_Foreground_Color(FT_Face face, FT_Color foreground_color) { + return nFT_Palette_Set_Foreground_Color(face.address(), foreground_color.address()); + } + + // --- [ FT_Get_Color_Glyph_Layer ] --- + + public static boolean nFT_Get_Color_Glyph_Layer(long face, int base_glyph, long aglyph_index, long acolor_index, long iterator) { + long __functionAddress = Functions.Get_Color_Glyph_Layer; + return invokePPPPZ(face, base_glyph, aglyph_index, acolor_index, iterator, __functionAddress); + } + + @NativeType("FT_Bool") + public static boolean FT_Get_Color_Glyph_Layer(FT_Face face, @NativeType("FT_UInt") int base_glyph, @NativeType("FT_UInt *") IntBuffer aglyph_index, @NativeType("FT_UInt *") IntBuffer acolor_index, @NativeType("FT_LayerIterator *") FT_LayerIterator iterator) { + if (CHECKS) { + check(aglyph_index, 1); + check(acolor_index, 1); + } + return nFT_Get_Color_Glyph_Layer(face.address(), base_glyph, memAddress(aglyph_index), memAddress(acolor_index), iterator.address()); + } + + // --- [ FT_Get_Color_Glyph_Paint ] --- + + public static boolean nFT_Get_Color_Glyph_Paint(long face, int base_glyph, int root_transform, long paint) { + long __functionAddress = Functions.Get_Color_Glyph_Paint; + return invokePPZ(face, base_glyph, root_transform, paint, __functionAddress); + } + + @NativeType("FT_Bool") + public static boolean FT_Get_Color_Glyph_Paint(FT_Face face, @NativeType("FT_UInt") int base_glyph, @NativeType("FT_Color_Root_Transform") int root_transform, @NativeType("FT_OpaquePaintRec *") FT_OpaquePaint paint) { + return nFT_Get_Color_Glyph_Paint(face.address(), base_glyph, root_transform, paint.address()); + } + + // --- [ FT_Get_Color_Glyph_ClipBox ] --- + + public static boolean nFT_Get_Color_Glyph_ClipBox(long face, int base_glyph, long clip_box) { + long __functionAddress = Functions.Get_Color_Glyph_ClipBox; + return invokePPZ(face, base_glyph, clip_box, __functionAddress); + } + + @NativeType("FT_Bool") + public static boolean FT_Get_Color_Glyph_ClipBox(FT_Face face, @NativeType("FT_UInt") int base_glyph, @NativeType("FT_ClipBox *") FT_ClipBox clip_box) { + return nFT_Get_Color_Glyph_ClipBox(face.address(), base_glyph, clip_box.address()); + } + + // --- [ FT_Get_Paint_Layers ] --- + + public static boolean nFT_Get_Paint_Layers(long face, long iterator, long paint) { + long __functionAddress = Functions.Get_Paint_Layers; + return invokePPPZ(face, iterator, paint, __functionAddress); + } + + @NativeType("FT_Bool") + public static boolean FT_Get_Paint_Layers(FT_Face face, @NativeType("FT_LayerIterator *") FT_LayerIterator iterator, @NativeType("FT_OpaquePaintRec *") FT_OpaquePaint paint) { + return nFT_Get_Paint_Layers(face.address(), iterator.address(), paint.address()); + } + + // --- [ FT_Get_Colorline_Stops ] --- + + public static boolean nFT_Get_Colorline_Stops(long face, long color_stop, long iterator) { + long __functionAddress = Functions.Get_Colorline_Stops; + return invokePPPZ(face, color_stop, iterator, __functionAddress); + } + + @NativeType("FT_Bool") + public static boolean FT_Get_Colorline_Stops(FT_Face face, @NativeType("FT_ColorStop *") FT_ColorStop color_stop, @NativeType("FT_ColorStopIterator *") FT_ColorStopIterator iterator) { + return nFT_Get_Colorline_Stops(face.address(), color_stop.address(), iterator.address()); + } + + // --- [ FT_Get_Paint ] --- + + private static final FFICIF FT_Get_PaintCIF = apiCreateCIF( + FFI_DEFAULT_ABI, ffi_type_uint8, + ffi_type_pointer, apiCreateStruct(ffi_type_pointer, ffi_type_uint8), ffi_type_pointer + ); + + public static boolean nFT_Get_Paint(long face, long opaque_paint, long paint) { + long __functionAddress = Functions.Get_Paint; + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + long __result = stack.nbyte((byte)0); + long arguments = stack.nmalloc(POINTER_SIZE, POINTER_SIZE * 3); + memPutAddress(arguments, stack.npointer(face)); + memPutAddress(arguments + POINTER_SIZE, opaque_paint); + memPutAddress(arguments + 2 * POINTER_SIZE, stack.npointer(paint)); + + nffi_call(FT_Get_PaintCIF.address(), __functionAddress, __result, arguments); + + return memGetByte(__result) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + @NativeType("FT_Bool") + public static boolean FT_Get_Paint(FT_Face face, @NativeType("FT_OpaquePaintRec") FT_OpaquePaint opaque_paint, @NativeType("FT_COLR_Paint *") FT_COLR_Paint paint) { + return nFT_Get_Paint(face.address(), opaque_paint.address(), paint.address()); + } + + // --- [ FT_Error_String ] --- + + public static long nFT_Error_String(int error_code) { + long __functionAddress = Functions.Error_String; + return invokeP(error_code, __functionAddress); + } + + @Nullable + @NativeType("char const *") + public static String FT_Error_String(@NativeType("FT_Error") int error_code) { + long __result = nFT_Error_String(error_code); + return memASCIISafe(__result); + } + + // --- [ FT_Get_Font_Format ] --- + + public static long nFT_Get_Font_Format(long face) { + long __functionAddress = Functions.Get_Font_Format; + return invokePP(face, __functionAddress); + } + + @Nullable + @NativeType("char const *") + public static String FT_Get_Font_Format(FT_Face face) { + long __result = nFT_Get_Font_Format(face.address()); + return memASCIISafe(__result); + } + + // --- [ FT_Get_Gasp ] --- + + public static int nFT_Get_Gasp(long face, int ppem) { + long __functionAddress = Functions.Get_Gasp; + return invokePI(face, ppem, __functionAddress); + } + + @NativeType("FT_Int") + public static int FT_Get_Gasp(FT_Face face, @NativeType("FT_UInt") int ppem) { + return nFT_Get_Gasp(face.address(), ppem); + } + + // --- [ FT_New_Glyph ] --- + + public static int nFT_New_Glyph(long library, int format, long aglyph) { + long __functionAddress = Functions.New_Glyph; + if (CHECKS) { + check(library); + } + return invokePPI(library, format, aglyph, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_New_Glyph(@NativeType("FT_Library") long library, @NativeType("FT_Glyph_Format") int format, @NativeType("FT_Glyph *") PointerBuffer aglyph) { + if (CHECKS) { + check(aglyph, 1); + } + return nFT_New_Glyph(library, format, memAddress(aglyph)); + } + + // --- [ FT_Get_Glyph ] --- + + public static int nFT_Get_Glyph(long slot, long aglyph) { + long __functionAddress = Functions.Get_Glyph; + return invokePPI(slot, aglyph, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Glyph(FT_GlyphSlot slot, @NativeType("FT_Glyph *") PointerBuffer aglyph) { + if (CHECKS) { + check(aglyph, 1); + } + return nFT_Get_Glyph(slot.address(), memAddress(aglyph)); + } + + // --- [ FT_Glyph_Copy ] --- + + public static int nFT_Glyph_Copy(long source, long target) { + long __functionAddress = Functions.Glyph_Copy; + return invokePPI(source, target, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Glyph_Copy(FT_Glyph source, @NativeType("FT_Glyph *") PointerBuffer target) { + if (CHECKS) { + check(target, 1); + } + return nFT_Glyph_Copy(source.address(), memAddress(target)); + } + + // --- [ FT_Glyph_Transform ] --- + + public static int nFT_Glyph_Transform(long glyph, long matrix, long delta) { + long __functionAddress = Functions.Glyph_Transform; + return invokePPPI(glyph, matrix, delta, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Glyph_Transform(FT_Glyph glyph, @Nullable @NativeType("FT_Matrix const *") FT_Matrix matrix, @Nullable @NativeType("FT_Vector const *") FT_Vector delta) { + return nFT_Glyph_Transform(glyph.address(), memAddressSafe(matrix), memAddressSafe(delta)); + } + + // --- [ FT_Glyph_Get_CBox ] --- + + public static void nFT_Glyph_Get_CBox(long glyph, int bbox_mode, long acbox) { + long __functionAddress = Functions.Glyph_Get_CBox; + invokePPV(glyph, bbox_mode, acbox, __functionAddress); + } + + public static void FT_Glyph_Get_CBox(FT_Glyph glyph, @NativeType("FT_UInt") int bbox_mode, @NativeType("FT_BBox *") FT_BBox acbox) { + nFT_Glyph_Get_CBox(glyph.address(), bbox_mode, acbox.address()); + } + + // --- [ FT_Glyph_To_Bitmap ] --- + + public static int nFT_Glyph_To_Bitmap(long the_glyph, int render_mode, long origin, boolean destroy) { + long __functionAddress = Functions.Glyph_To_Bitmap; + return invokePPI(the_glyph, render_mode, origin, destroy, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Glyph_To_Bitmap(@NativeType("FT_Glyph *") PointerBuffer the_glyph, @NativeType("FT_Render_Mode") int render_mode, @Nullable @NativeType("FT_Vector const *") FT_Vector origin, @NativeType("FT_Bool") boolean destroy) { + if (CHECKS) { + check(the_glyph, 1); + } + return nFT_Glyph_To_Bitmap(memAddress(the_glyph), render_mode, memAddressSafe(origin), destroy); + } + + // --- [ FT_Done_Glyph ] --- + + public static void nFT_Done_Glyph(long glyph) { + long __functionAddress = Functions.Done_Glyph; + invokePV(glyph, __functionAddress); + } + + public static void FT_Done_Glyph(@Nullable FT_Glyph glyph) { + nFT_Done_Glyph(memAddressSafe(glyph)); + } + + // --- [ FT_Matrix_Multiply ] --- + + public static void nFT_Matrix_Multiply(long a, long b) { + long __functionAddress = Functions.Matrix_Multiply; + invokePPV(a, b, __functionAddress); + } + + public static void FT_Matrix_Multiply(@NativeType("FT_Matrix const *") FT_Matrix a, @NativeType("FT_Matrix *") FT_Matrix b) { + nFT_Matrix_Multiply(a.address(), b.address()); + } + + // --- [ FT_Matrix_Invert ] --- + + public static int nFT_Matrix_Invert(long matrix) { + long __functionAddress = Functions.Matrix_Invert; + return invokePI(matrix, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Matrix_Invert(@NativeType("FT_Matrix *") FT_Matrix matrix) { + return nFT_Matrix_Invert(matrix.address()); + } + + // --- [ FT_TrueTypeGX_Validate ] --- + + public static int nFT_TrueTypeGX_Validate(long face, int validation_flags, long tables, int table_length) { + long __functionAddress = Functions.TrueTypeGX_Validate; + return invokePPI(face, validation_flags, tables, table_length, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_TrueTypeGX_Validate(FT_Face face, @NativeType("FT_UInt") int validation_flags, @NativeType("FT_Bytes *") PointerBuffer tables) { + return nFT_TrueTypeGX_Validate(face.address(), validation_flags, memAddress(tables), tables.remaining()); + } + + // --- [ FT_TrueTypeGX_Free ] --- + + public static void nFT_TrueTypeGX_Free(long face, long table) { + long __functionAddress = Functions.TrueTypeGX_Free; + invokePPV(face, table, __functionAddress); + } + + public static void FT_TrueTypeGX_Free(FT_Face face, @NativeType("FT_Bytes") ByteBuffer table) { + nFT_TrueTypeGX_Free(face.address(), memAddress(table)); + } + + // --- [ FT_ClassicKern_Validate ] --- + + public static int nFT_ClassicKern_Validate(long face, int validation_flags, long ckern_table) { + long __functionAddress = Functions.ClassicKern_Validate; + return invokePPI(face, validation_flags, ckern_table, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_ClassicKern_Validate(FT_Face face, @NativeType("FT_UInt") int validation_flags, @NativeType("FT_Bytes *") PointerBuffer ckern_table) { + if (CHECKS) { + check(ckern_table, 1); + } + return nFT_ClassicKern_Validate(face.address(), validation_flags, memAddress(ckern_table)); + } + + // --- [ FT_ClassicKern_Free ] --- + + public static void nFT_ClassicKern_Free(long face, long table) { + long __functionAddress = Functions.ClassicKern_Free; + invokePPV(face, table, __functionAddress); + } + + public static void FT_ClassicKern_Free(FT_Face face, @NativeType("FT_Bytes") ByteBuffer table) { + nFT_ClassicKern_Free(face.address(), memAddress(table)); + } + + // --- [ FT_Stream_OpenGzip ] --- + + public static int nFT_Stream_OpenGzip(long stream, long source) { + long __functionAddress = Functions.Stream_OpenGzip; + return invokePPI(stream, source, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Stream_OpenGzip(FT_Stream stream, FT_Stream source) { + return nFT_Stream_OpenGzip(stream.address(), source.address()); + } + + // --- [ FT_Gzip_Uncompress ] --- + + public static int nFT_Gzip_Uncompress(long memory, long output, long output_len, long input, long input_len) { + long __functionAddress = Functions.Gzip_Uncompress; + return invokePPPPNI(memory, output, output_len, input, input_len, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Gzip_Uncompress(FT_Memory memory, @NativeType("FT_Byte *") ByteBuffer output, @NativeType("FT_ULong *") CLongBuffer output_len, @NativeType("FT_Byte const *") ByteBuffer input) { + if (CHECKS) { + check(output_len, 1); + check(output, output_len.get(output_len.position())); + } + return nFT_Gzip_Uncompress(memory.address(), memAddress(output), memAddress(output_len), memAddress(input), input.remaining()); + } + + // --- [ FT_Library_SetLcdFilter ] --- + + @NativeType("FT_Error") + public static int FT_Library_SetLcdFilter(@NativeType("FT_Library") long library, @NativeType("FT_LcdFilter") int filter) { + long __functionAddress = Functions.Library_SetLcdFilter; + if (CHECKS) { + check(library); + } + return invokePI(library, filter, __functionAddress); + } + + // --- [ FT_Library_SetLcdFilterWeights ] --- + + public static int nFT_Library_SetLcdFilterWeights(long library, long weights) { + long __functionAddress = Functions.Library_SetLcdFilterWeights; + if (CHECKS) { + check(library); + } + return invokePPI(library, weights, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Library_SetLcdFilterWeights(@NativeType("FT_Library") long library, @NativeType("unsigned char *") ByteBuffer weights) { + if (CHECKS) { + check(weights, 5); + } + return nFT_Library_SetLcdFilterWeights(library, memAddress(weights)); + } + + // --- [ FT_Library_SetLcdGeometry ] --- + + public static int nFT_Library_SetLcdGeometry(long library, long sub) { + long __functionAddress = Functions.Library_SetLcdGeometry; + if (CHECKS) { + check(library); + } + return invokePPI(library, sub, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Library_SetLcdGeometry(@NativeType("FT_Library") long library, @NativeType("FT_Vector *") FT_Vector.Buffer sub) { + if (CHECKS) { + check(sub, 3); + } + return nFT_Library_SetLcdGeometry(library, sub.address()); + } + + // --- [ FT_List_Find ] --- + + public static long nFT_List_Find(long list, long data) { + long __functionAddress = Functions.List_Find; + if (CHECKS) { + check(data); + } + return invokePPP(list, data, __functionAddress); + } + + @Nullable + public static FT_ListNode FT_List_Find(FT_List list, @NativeType("void *") long data) { + long __result = nFT_List_Find(list.address(), data); + return FT_ListNode.createSafe(__result); + } + + // --- [ FT_List_Add ] --- + + public static void nFT_List_Add(long list, long node) { + long __functionAddress = Functions.List_Add; + invokePPV(list, node, __functionAddress); + } + + public static void FT_List_Add(FT_List list, FT_ListNode node) { + nFT_List_Add(list.address(), node.address()); + } + + // --- [ FT_List_Insert ] --- + + public static void nFT_List_Insert(long list, long node) { + long __functionAddress = Functions.List_Insert; + invokePPV(list, node, __functionAddress); + } + + public static void FT_List_Insert(FT_List list, FT_ListNode node) { + nFT_List_Insert(list.address(), node.address()); + } + + // --- [ FT_List_Remove ] --- + + public static void nFT_List_Remove(long list, long node) { + long __functionAddress = Functions.List_Remove; + invokePPV(list, node, __functionAddress); + } + + public static void FT_List_Remove(FT_List list, FT_ListNode node) { + nFT_List_Remove(list.address(), node.address()); + } + + // --- [ FT_List_Up ] --- + + public static void nFT_List_Up(long list, long node) { + long __functionAddress = Functions.List_Up; + invokePPV(list, node, __functionAddress); + } + + public static void FT_List_Up(FT_List list, FT_ListNode node) { + nFT_List_Up(list.address(), node.address()); + } + + // --- [ FT_List_Iterate ] --- + + public static int nFT_List_Iterate(long list, long iterator, long user) { + long __functionAddress = Functions.List_Iterate; + return invokePPPI(list, iterator, user, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_List_Iterate(FT_List list, @NativeType("FT_List_Iterator") FT_List_IteratorI iterator, @NativeType("void *") long user) { + return nFT_List_Iterate(list.address(), iterator.address(), user); + } + + // --- [ FT_List_Finalize ] --- + + public static void nFT_List_Finalize(long list, long destroy, long memory, long user) { + long __functionAddress = Functions.List_Finalize; + invokePPPPV(list, destroy, memory, user, __functionAddress); + } + + public static void FT_List_Finalize(FT_List list, @Nullable @NativeType("FT_List_Destructor") FT_List_DestructorI destroy, FT_Memory memory, @NativeType("void *") long user) { + nFT_List_Finalize(list.address(), memAddressSafe(destroy), memory.address(), user); + } + + // --- [ FT_Stream_OpenLZW ] --- + + public static int nFT_Stream_OpenLZW(long stream, long source) { + long __functionAddress = Functions.Stream_OpenLZW; + return invokePPI(stream, source, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Stream_OpenLZW(FT_Stream stream, FT_Stream source) { + return nFT_Stream_OpenLZW(stream.address(), source.address()); + } + + // --- [ FT_Get_Multi_Master ] --- + + public static int nFT_Get_Multi_Master(long face, long amaster) { + long __functionAddress = Functions.Get_Multi_Master; + return invokePPI(face, amaster, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Multi_Master(FT_Face face, @NativeType("FT_Multi_Master *") FT_Multi_Master amaster) { + return nFT_Get_Multi_Master(face.address(), amaster.address()); + } + + // --- [ FT_Get_MM_Var ] --- + + public static int nFT_Get_MM_Var(long face, long amaster) { + long __functionAddress = Functions.Get_MM_Var; + return invokePPI(face, amaster, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_MM_Var(FT_Face face, @NativeType("FT_MM_Var **") PointerBuffer amaster) { + if (CHECKS) { + check(amaster, 1); + } + return nFT_Get_MM_Var(face.address(), memAddress(amaster)); + } + + // --- [ FT_Done_MM_Var ] --- + + public static int nFT_Done_MM_Var(long library, long amaster) { + long __functionAddress = Functions.Done_MM_Var; + if (CHECKS) { + check(library); + } + return invokePPI(library, amaster, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Done_MM_Var(@NativeType("FT_Library") long library, @NativeType("FT_MM_Var *") FT_MM_Var amaster) { + return nFT_Done_MM_Var(library, amaster.address()); + } + + // --- [ FT_Set_MM_Design_Coordinates ] --- + + public static int nFT_Set_MM_Design_Coordinates(long face, int num_coords, long coords) { + long __functionAddress = Functions.Set_MM_Design_Coordinates; + return invokePPI(face, num_coords, coords, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Set_MM_Design_Coordinates(FT_Face face, @NativeType("FT_Long *") CLongBuffer coords) { + return nFT_Set_MM_Design_Coordinates(face.address(), coords.remaining(), memAddress(coords)); + } + + // --- [ FT_Set_Var_Design_Coordinates ] --- + + public static int nFT_Set_Var_Design_Coordinates(long face, int num_coords, long coords) { + long __functionAddress = Functions.Set_Var_Design_Coordinates; + return invokePPI(face, num_coords, coords, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Set_Var_Design_Coordinates(FT_Face face, @NativeType("FT_Fixed *") CLongBuffer coords) { + return nFT_Set_Var_Design_Coordinates(face.address(), coords.remaining(), memAddress(coords)); + } + + // --- [ FT_Get_Var_Design_Coordinates ] --- + + public static int nFT_Get_Var_Design_Coordinates(long face, int num_coords, long coords) { + long __functionAddress = Functions.Get_Var_Design_Coordinates; + return invokePPI(face, num_coords, coords, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Var_Design_Coordinates(FT_Face face, @NativeType("FT_Fixed *") CLongBuffer coords) { + return nFT_Get_Var_Design_Coordinates(face.address(), coords.remaining(), memAddress(coords)); + } + + // --- [ FT_Set_MM_Blend_Coordinates ] --- + + public static int nFT_Set_MM_Blend_Coordinates(long face, int num_coords, long coords) { + long __functionAddress = Functions.Set_MM_Blend_Coordinates; + return invokePPI(face, num_coords, coords, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Set_MM_Blend_Coordinates(FT_Face face, @NativeType("FT_Fixed *") CLongBuffer coords) { + return nFT_Set_MM_Blend_Coordinates(face.address(), coords.remaining(), memAddress(coords)); + } + + // --- [ FT_Get_MM_Blend_Coordinates ] --- + + public static int nFT_Get_MM_Blend_Coordinates(long face, int num_coords, long coords) { + long __functionAddress = Functions.Get_MM_Blend_Coordinates; + return invokePPI(face, num_coords, coords, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_MM_Blend_Coordinates(FT_Face face, @NativeType("FT_Fixed *") CLongBuffer coords) { + return nFT_Get_MM_Blend_Coordinates(face.address(), coords.remaining(), memAddress(coords)); + } + + // --- [ FT_Set_Var_Blend_Coordinates ] --- + + public static int nFT_Set_Var_Blend_Coordinates(long face, int num_coords, long coords) { + long __functionAddress = Functions.Set_Var_Blend_Coordinates; + return invokePPI(face, num_coords, coords, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Set_Var_Blend_Coordinates(FT_Face face, @NativeType("FT_Fixed *") CLongBuffer coords) { + return nFT_Set_Var_Blend_Coordinates(face.address(), coords.remaining(), memAddress(coords)); + } + + // --- [ FT_Get_Var_Blend_Coordinates ] --- + + public static int nFT_Get_Var_Blend_Coordinates(long face, int num_coords, long coords) { + long __functionAddress = Functions.Get_Var_Blend_Coordinates; + return invokePPI(face, num_coords, coords, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Var_Blend_Coordinates(FT_Face face, @NativeType("FT_Fixed *") CLongBuffer coords) { + return nFT_Get_Var_Blend_Coordinates(face.address(), coords.remaining(), memAddress(coords)); + } + + // --- [ FT_Set_MM_WeightVector ] --- + + /** Unsafe version of: {@link #FT_Set_MM_WeightVector Set_MM_WeightVector} */ + public static int nFT_Set_MM_WeightVector(long face, int len, long weightvector) { + long __functionAddress = Functions.Set_MM_WeightVector; + return invokePPI(face, len, weightvector, __functionAddress); + } + + /** @return : FreeType error code. 0~means success. */ + @NativeType("FT_Error") + public static int FT_Set_MM_WeightVector(FT_Face face, @Nullable @NativeType("FT_Fixed *") CLongBuffer weightvector) { + return nFT_Set_MM_WeightVector(face.address(), remainingSafe(weightvector), memAddressSafe(weightvector)); + } + + // --- [ FT_Get_MM_WeightVector ] --- + + public static int nFT_Get_MM_WeightVector(long face, long len, long weightvector) { + long __functionAddress = Functions.Get_MM_WeightVector; + return invokePPPI(face, len, weightvector, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_MM_WeightVector(FT_Face face, @NativeType("FT_UInt *") IntBuffer len, @NativeType("FT_Fixed *") CLongBuffer weightvector) { + if (CHECKS) { + check(len, 1); + check(weightvector, len.get(len.position())); + } + return nFT_Get_MM_WeightVector(face.address(), memAddress(len), memAddress(weightvector)); + } + + // --- [ FT_Get_Var_Axis_Flags ] --- + + public static int nFT_Get_Var_Axis_Flags(long master, int axis_index, long flags) { + long __functionAddress = Functions.Get_Var_Axis_Flags; + return invokePPI(master, axis_index, flags, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Var_Axis_Flags(@NativeType("FT_MM_Var *") FT_MM_Var master, @NativeType("FT_UInt") int axis_index, @NativeType("FT_UInt *") IntBuffer flags) { + if (CHECKS) { + check(flags, 1); + } + return nFT_Get_Var_Axis_Flags(master.address(), axis_index, memAddress(flags)); + } + + // --- [ FT_Set_Named_Instance ] --- + + public static int nFT_Set_Named_Instance(long face, int instance_index) { + long __functionAddress = Functions.Set_Named_Instance; + return invokePI(face, instance_index, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Set_Named_Instance(FT_Face face, @NativeType("FT_UInt") int instance_index) { + return nFT_Set_Named_Instance(face.address(), instance_index); + } + + // --- [ FT_Get_Default_Named_Instance ] --- + + public static int nFT_Get_Default_Named_Instance(long face, long instance_index) { + long __functionAddress = Functions.Get_Default_Named_Instance; + return invokePPI(face, instance_index, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Default_Named_Instance(FT_Face face, @NativeType("FT_UInt *") IntBuffer instance_index) { + if (CHECKS) { + check(instance_index, 1); + } + return nFT_Get_Default_Named_Instance(face.address(), memAddress(instance_index)); + } + + // --- [ FT_Add_Module ] --- + + public static int nFT_Add_Module(long library, long clazz) { + long __functionAddress = Functions.Add_Module; + if (CHECKS) { + check(library); + FT_Module_Class.validate(clazz); + } + return invokePPI(library, clazz, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Add_Module(@NativeType("FT_Library") long library, @NativeType("FT_Module_Class const *") FT_Module_Class clazz) { + return nFT_Add_Module(library, clazz.address()); + } + + // --- [ FT_Get_Module ] --- + + public static long nFT_Get_Module(long library, long module_name) { + long __functionAddress = Functions.Get_Module; + if (CHECKS) { + check(library); + } + return invokePPP(library, module_name, __functionAddress); + } + + @NativeType("FT_Module") + public static long FT_Get_Module(@NativeType("FT_Library") long library, @NativeType("char const *") ByteBuffer module_name) { + if (CHECKS) { + checkNT1(module_name); + } + return nFT_Get_Module(library, memAddress(module_name)); + } + + @NativeType("FT_Module") + public static long FT_Get_Module(@NativeType("FT_Library") long library, @NativeType("char const *") CharSequence module_name) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(module_name, true); + long module_nameEncoded = stack.getPointerAddress(); + return nFT_Get_Module(library, module_nameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ FT_Remove_Module ] --- + + @NativeType("FT_Error") + public static int FT_Remove_Module(@NativeType("FT_Library") long library, @NativeType("FT_Module") long module) { + long __functionAddress = Functions.Remove_Module; + if (CHECKS) { + check(library); + check(module); + } + return invokePPI(library, module, __functionAddress); + } + + // --- [ FT_Property_Set ] --- + + public static int nFT_Property_Set(long library, long module_name, long property_name, long value) { + long __functionAddress = Functions.Property_Set; + if (CHECKS) { + check(library); + } + return invokePPPPI(library, module_name, property_name, value, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Property_Set(@NativeType("FT_Library") long library, @NativeType("FT_String const *") ByteBuffer module_name, @NativeType("FT_String const *") ByteBuffer property_name, @NativeType("void const *") ByteBuffer value) { + if (CHECKS) { + checkNT1(module_name); + checkNT1(property_name); + } + return nFT_Property_Set(library, memAddress(module_name), memAddress(property_name), memAddress(value)); + } + + @NativeType("FT_Error") + public static int FT_Property_Set(@NativeType("FT_Library") long library, @NativeType("FT_String const *") CharSequence module_name, @NativeType("FT_String const *") CharSequence property_name, @NativeType("void const *") ByteBuffer value) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(module_name, true); + long module_nameEncoded = stack.getPointerAddress(); + stack.nUTF8(property_name, true); + long property_nameEncoded = stack.getPointerAddress(); + return nFT_Property_Set(library, module_nameEncoded, property_nameEncoded, memAddress(value)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ FT_Property_Get ] --- + + public static int nFT_Property_Get(long library, long module_name, long property_name, long value) { + long __functionAddress = Functions.Property_Get; + if (CHECKS) { + check(library); + } + return invokePPPPI(library, module_name, property_name, value, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Property_Get(@NativeType("FT_Library") long library, @NativeType("FT_String const *") ByteBuffer module_name, @NativeType("FT_String const *") ByteBuffer property_name, @NativeType("void *") ByteBuffer value) { + if (CHECKS) { + checkNT1(module_name); + checkNT1(property_name); + } + return nFT_Property_Get(library, memAddress(module_name), memAddress(property_name), memAddress(value)); + } + + @NativeType("FT_Error") + public static int FT_Property_Get(@NativeType("FT_Library") long library, @NativeType("FT_String const *") CharSequence module_name, @NativeType("FT_String const *") CharSequence property_name, @NativeType("void *") ByteBuffer value) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(module_name, true); + long module_nameEncoded = stack.getPointerAddress(); + stack.nUTF8(property_name, true); + long property_nameEncoded = stack.getPointerAddress(); + return nFT_Property_Get(library, module_nameEncoded, property_nameEncoded, memAddress(value)); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ FT_Set_Default_Properties ] --- + + public static void FT_Set_Default_Properties(@NativeType("FT_Library") long library) { + long __functionAddress = Functions.Set_Default_Properties; + if (CHECKS) { + check(library); + } + invokePV(library, __functionAddress); + } + + // --- [ FT_Reference_Library ] --- + + @NativeType("FT_Error") + public static int FT_Reference_Library(@NativeType("FT_Library") long library) { + long __functionAddress = Functions.Reference_Library; + if (CHECKS) { + check(library); + } + return invokePI(library, __functionAddress); + } + + // --- [ FT_New_Library ] --- + + public static int nFT_New_Library(long memory, long alibrary) { + long __functionAddress = Functions.New_Library; + return invokePPI(memory, alibrary, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_New_Library(FT_Memory memory, @NativeType("FT_Library *") PointerBuffer alibrary) { + if (CHECKS) { + check(alibrary, 1); + } + return nFT_New_Library(memory.address(), memAddress(alibrary)); + } + + // --- [ FT_Done_Library ] --- + + @NativeType("FT_Error") + public static int FT_Done_Library(@NativeType("FT_Library") long library) { + long __functionAddress = Functions.Done_Library; + if (CHECKS) { + check(library); + } + return invokePI(library, __functionAddress); + } + + // --- [ FT_Set_Debug_Hook ] --- + + public static void nFT_Set_Debug_Hook(long library, int hook_index, long debug_hook) { + long __functionAddress = Functions.Set_Debug_Hook; + if (CHECKS) { + check(library); + } + invokePPV(library, hook_index, debug_hook, __functionAddress); + } + + public static void FT_Set_Debug_Hook(@NativeType("FT_Library") long library, @NativeType("FT_UInt") int hook_index, @Nullable @NativeType("FT_DebugHook_Func") FT_DebugHook_FuncI debug_hook) { + nFT_Set_Debug_Hook(library, hook_index, memAddressSafe(debug_hook)); + } + + // --- [ FT_Add_Default_Modules ] --- + + public static void FT_Add_Default_Modules(@NativeType("FT_Library") long library) { + long __functionAddress = Functions.Add_Default_Modules; + if (CHECKS) { + check(library); + } + invokePV(library, __functionAddress); + } + + // --- [ FT_Get_TrueType_Engine_Type ] --- + + @NativeType("FT_TrueTypeEngineType") + public static int FT_Get_TrueType_Engine_Type(@NativeType("FT_Library") long library) { + long __functionAddress = Functions.Get_TrueType_Engine_Type; + if (CHECKS) { + check(library); + } + return invokePI(library, __functionAddress); + } + + // --- [ FT_OpenType_Validate ] --- + + public static int nFT_OpenType_Validate(long face, int validation_flags, long BASE_table, long GDEF_table, long GPOS_table, long GSUB_table, long JSTF_table) { + long __functionAddress = Functions.OpenType_Validate; + return invokePPPPPPI(face, validation_flags, BASE_table, GDEF_table, GPOS_table, GSUB_table, JSTF_table, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_OpenType_Validate(FT_Face face, @NativeType("FT_UInt") int validation_flags, @NativeType("FT_Bytes *") PointerBuffer BASE_table, @NativeType("FT_Bytes *") PointerBuffer GDEF_table, @NativeType("FT_Bytes *") PointerBuffer GPOS_table, @NativeType("FT_Bytes *") PointerBuffer GSUB_table, @NativeType("FT_Bytes *") PointerBuffer JSTF_table) { + if (CHECKS) { + check(BASE_table, 1); + check(GDEF_table, 1); + check(GPOS_table, 1); + check(GSUB_table, 1); + check(JSTF_table, 1); + } + return nFT_OpenType_Validate(face.address(), validation_flags, memAddress(BASE_table), memAddress(GDEF_table), memAddress(GPOS_table), memAddress(GSUB_table), memAddress(JSTF_table)); + } + + // --- [ FT_OpenType_Free ] --- + + public static void nFT_OpenType_Free(long face, long table) { + long __functionAddress = Functions.OpenType_Free; + invokePPV(face, table, __functionAddress); + } + + public static void FT_OpenType_Free(FT_Face face, @NativeType("FT_Bytes") ByteBuffer table) { + nFT_OpenType_Free(face.address(), memAddress(table)); + } + + // --- [ FT_Outline_Decompose ] --- + + public static int nFT_Outline_Decompose(long outline, long func_interface, long user) { + long __functionAddress = Functions.Outline_Decompose; + return invokePPPI(outline, func_interface, user, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Outline_Decompose(@NativeType("FT_Outline *") FT_Outline outline, @NativeType("FT_Outline_Funcs const *") FT_Outline_Funcs func_interface, @NativeType("void *") long user) { + return nFT_Outline_Decompose(outline.address(), func_interface.address(), user); + } + + // --- [ FT_Outline_New ] --- + + public static int nFT_Outline_New(long library, int numPoints, int numContours, long anoutline) { + long __functionAddress = Functions.Outline_New; + if (CHECKS) { + check(library); + } + return invokePPI(library, numPoints, numContours, anoutline, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Outline_New(@NativeType("FT_Library") long library, @NativeType("FT_UInt") int numPoints, @NativeType("FT_Int") int numContours, @NativeType("FT_Outline *") FT_Outline anoutline) { + return nFT_Outline_New(library, numPoints, numContours, anoutline.address()); + } + + // --- [ FT_Outline_Done ] --- + + public static int nFT_Outline_Done(long library, long outline) { + long __functionAddress = Functions.Outline_Done; + if (CHECKS) { + check(library); + } + return invokePPI(library, outline, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Outline_Done(@NativeType("FT_Library") long library, @NativeType("FT_Outline *") FT_Outline outline) { + return nFT_Outline_Done(library, outline.address()); + } + + // --- [ FT_Outline_Check ] --- + + public static int nFT_Outline_Check(long outline) { + long __functionAddress = Functions.Outline_Check; + return invokePI(outline, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Outline_Check(@NativeType("FT_Outline *") FT_Outline outline) { + return nFT_Outline_Check(outline.address()); + } + + // --- [ FT_Outline_Get_CBox ] --- + + public static void nFT_Outline_Get_CBox(long outline, long acbox) { + long __functionAddress = Functions.Outline_Get_CBox; + invokePPV(outline, acbox, __functionAddress); + } + + public static void FT_Outline_Get_CBox(@NativeType("FT_Outline const *") FT_Outline outline, @NativeType("FT_BBox *") FT_BBox acbox) { + nFT_Outline_Get_CBox(outline.address(), acbox.address()); + } + + // --- [ FT_Outline_Translate ] --- + + public static void nFT_Outline_Translate(long outline, long xOffset, long yOffset) { + long __functionAddress = Functions.Outline_Translate; + invokePNNV(outline, xOffset, yOffset, __functionAddress); + } + + public static void FT_Outline_Translate(@NativeType("FT_Outline const *") FT_Outline outline, @NativeType("FT_Pos") long xOffset, @NativeType("FT_Pos") long yOffset) { + nFT_Outline_Translate(outline.address(), xOffset, yOffset); + } + + // --- [ FT_Outline_Copy ] --- + + public static int nFT_Outline_Copy(long source, long target) { + long __functionAddress = Functions.Outline_Copy; + return invokePPI(source, target, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Outline_Copy(@NativeType("FT_Outline const *") FT_Outline source, @NativeType("FT_Outline *") FT_Outline target) { + return nFT_Outline_Copy(source.address(), target.address()); + } + + // --- [ FT_Outline_Transform ] --- + + public static void nFT_Outline_Transform(long outline, long matrix) { + long __functionAddress = Functions.Outline_Transform; + invokePPV(outline, matrix, __functionAddress); + } + + public static void FT_Outline_Transform(@NativeType("FT_Outline const *") FT_Outline outline, @NativeType("FT_Matrix const *") FT_Matrix matrix) { + nFT_Outline_Transform(outline.address(), matrix.address()); + } + + // --- [ FT_Outline_Embolden ] --- + + public static int nFT_Outline_Embolden(long outline, long strength) { + long __functionAddress = Functions.Outline_Embolden; + return invokePNI(outline, strength, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Outline_Embolden(@NativeType("FT_Outline *") FT_Outline outline, @NativeType("FT_Pos") long strength) { + return nFT_Outline_Embolden(outline.address(), strength); + } + + // --- [ FT_Outline_EmboldenXY ] --- + + public static int nFT_Outline_EmboldenXY(long outline, long xstrength, long ystrength) { + long __functionAddress = Functions.Outline_EmboldenXY; + return invokePNNI(outline, xstrength, ystrength, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Outline_EmboldenXY(@NativeType("FT_Outline *") FT_Outline outline, @NativeType("FT_Pos") long xstrength, @NativeType("FT_Pos") long ystrength) { + return nFT_Outline_EmboldenXY(outline.address(), xstrength, ystrength); + } + + // --- [ FT_Outline_Reverse ] --- + + public static void nFT_Outline_Reverse(long outline) { + long __functionAddress = Functions.Outline_Reverse; + invokePV(outline, __functionAddress); + } + + public static void FT_Outline_Reverse(@NativeType("FT_Outline *") FT_Outline outline) { + nFT_Outline_Reverse(outline.address()); + } + + // --- [ FT_Outline_Get_Bitmap ] --- + + public static int nFT_Outline_Get_Bitmap(long library, long outline, long abitmap) { + long __functionAddress = Functions.Outline_Get_Bitmap; + if (CHECKS) { + check(library); + } + return invokePPPI(library, outline, abitmap, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Outline_Get_Bitmap(@NativeType("FT_Library") long library, @NativeType("FT_Outline *") FT_Outline outline, @NativeType("FT_Bitmap const *") FT_Bitmap abitmap) { + return nFT_Outline_Get_Bitmap(library, outline.address(), abitmap.address()); + } + + // --- [ FT_Outline_Render ] --- + + public static int nFT_Outline_Render(long library, long outline, long params) { + long __functionAddress = Functions.Outline_Render; + if (CHECKS) { + check(library); + } + return invokePPPI(library, outline, params, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Outline_Render(@NativeType("FT_Library") long library, @NativeType("FT_Outline *") FT_Outline outline, @NativeType("FT_Raster_Params *") FT_Raster_Params params) { + return nFT_Outline_Render(library, outline.address(), params.address()); + } + + // --- [ FT_Outline_Get_Orientation ] --- + + public static int nFT_Outline_Get_Orientation(long outline) { + long __functionAddress = Functions.Outline_Get_Orientation; + return invokePI(outline, __functionAddress); + } + + @NativeType("FT_Orientation") + public static int FT_Outline_Get_Orientation(@NativeType("FT_Outline *") FT_Outline outline) { + return nFT_Outline_Get_Orientation(outline.address()); + } + + // --- [ FT_Get_PFR_Metrics ] --- + + public static int nFT_Get_PFR_Metrics(long face, long aoutline_resolution, long ametrics_resolution, long ametrics_x_scale, long ametrics_y_scale) { + long __functionAddress = Functions.Get_PFR_Metrics; + return invokePPPPPI(face, aoutline_resolution, ametrics_resolution, ametrics_x_scale, ametrics_y_scale, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_PFR_Metrics(FT_Face face, @Nullable @NativeType("FT_UInt *") IntBuffer aoutline_resolution, @Nullable @NativeType("FT_UInt *") IntBuffer ametrics_resolution, @Nullable @NativeType("FT_Fixed *") CLongBuffer ametrics_x_scale, @Nullable @NativeType("FT_Fixed *") CLongBuffer ametrics_y_scale) { + if (CHECKS) { + checkSafe(aoutline_resolution, 1); + checkSafe(ametrics_resolution, 1); + checkSafe(ametrics_x_scale, 1); + checkSafe(ametrics_y_scale, 1); + } + return nFT_Get_PFR_Metrics(face.address(), memAddressSafe(aoutline_resolution), memAddressSafe(ametrics_resolution), memAddressSafe(ametrics_x_scale), memAddressSafe(ametrics_y_scale)); + } + + // --- [ FT_Get_PFR_Kerning ] --- + + public static int nFT_Get_PFR_Kerning(long face, int left, int right, long avector) { + long __functionAddress = Functions.Get_PFR_Kerning; + return invokePPI(face, left, right, avector, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_PFR_Kerning(FT_Face face, @NativeType("FT_UInt") int left, @NativeType("FT_UInt") int right, @NativeType("FT_Vector *") FT_Vector avector) { + return nFT_Get_PFR_Kerning(face.address(), left, right, avector.address()); + } + + // --- [ FT_Get_PFR_Advance ] --- + + public static int nFT_Get_PFR_Advance(long face, int gindex, long aadvance) { + long __functionAddress = Functions.Get_PFR_Advance; + return invokePPI(face, gindex, aadvance, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_PFR_Advance(FT_Face face, @NativeType("FT_UInt") int gindex, @NativeType("FT_Pos *") CLongBuffer aadvance) { + if (CHECKS) { + check(aadvance, 1); + } + return nFT_Get_PFR_Advance(face.address(), gindex, memAddress(aadvance)); + } + + // --- [ FT_Get_Renderer ] --- + + @NativeType("FT_Renderer") + public static long FT_Get_Renderer(@NativeType("FT_Library") long library, @NativeType("FT_Glyph_Format") int format) { + long __functionAddress = Functions.Get_Renderer; + if (CHECKS) { + check(library); + } + return invokePP(library, format, __functionAddress); + } + + // --- [ FT_Set_Renderer ] --- + + public static int nFT_Set_Renderer(long library, long renderer, int num_params, long parameters) { + long __functionAddress = Functions.Set_Renderer; + if (CHECKS) { + check(library); + check(renderer); + } + return invokePPPI(library, renderer, num_params, parameters, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Set_Renderer(@NativeType("FT_Library") long library, @NativeType("FT_Renderer") long renderer, @NativeType("FT_Parameter *") FT_Parameter.Buffer parameters) { + return nFT_Set_Renderer(library, renderer, parameters.remaining(), parameters.address()); + } + + // --- [ FT_New_Size ] --- + + public static int nFT_New_Size(long face, long size) { + long __functionAddress = Functions.New_Size; + return invokePPI(face, size, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_New_Size(FT_Face face, @NativeType("FT_Size *") PointerBuffer size) { + if (CHECKS) { + check(size, 1); + } + return nFT_New_Size(face.address(), memAddress(size)); + } + + // --- [ FT_Done_Size ] --- + + public static int nFT_Done_Size(long size) { + long __functionAddress = Functions.Done_Size; + return invokePI(size, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Done_Size(FT_Size size) { + return nFT_Done_Size(size.address()); + } + + // --- [ FT_Activate_Size ] --- + + public static int nFT_Activate_Size(long size) { + long __functionAddress = Functions.Activate_Size; + return invokePI(size, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Activate_Size(FT_Size size) { + return nFT_Activate_Size(size.address()); + } + + // --- [ FT_Get_Sfnt_Name_Count ] --- + + public static int nFT_Get_Sfnt_Name_Count(long face) { + long __functionAddress = Functions.Get_Sfnt_Name_Count; + return invokePI(face, __functionAddress); + } + + @NativeType("FT_UInt") + public static int FT_Get_Sfnt_Name_Count(FT_Face face) { + return nFT_Get_Sfnt_Name_Count(face.address()); + } + + // --- [ FT_Get_Sfnt_Name ] --- + + public static int nFT_Get_Sfnt_Name(long face, int idx, long aname) { + long __functionAddress = Functions.Get_Sfnt_Name; + return invokePPI(face, idx, aname, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Sfnt_Name(FT_Face face, @NativeType("FT_UInt") int idx, @NativeType("FT_SfntName *") FT_SfntName aname) { + return nFT_Get_Sfnt_Name(face.address(), idx, aname.address()); + } + + // --- [ FT_Get_Sfnt_LangTag ] --- + + public static int nFT_Get_Sfnt_LangTag(long face, int langID, long alangTag) { + long __functionAddress = Functions.Get_Sfnt_LangTag; + return invokePPI(face, langID, alangTag, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_Sfnt_LangTag(FT_Face face, @NativeType("FT_UInt") int langID, @NativeType("FT_SfntLangTag *") FT_SfntLangTag alangTag) { + return nFT_Get_Sfnt_LangTag(face.address(), langID, alangTag.address()); + } + + // --- [ FT_Outline_GetInsideBorder ] --- + + public static int nFT_Outline_GetInsideBorder(long outline) { + long __functionAddress = Functions.Outline_GetInsideBorder; + return invokePI(outline, __functionAddress); + } + + @NativeType("FT_StrokerBorder") + public static int FT_Outline_GetInsideBorder(@NativeType("FT_Outline *") FT_Outline outline) { + return nFT_Outline_GetInsideBorder(outline.address()); + } + + // --- [ FT_Outline_GetOutsideBorder ] --- + + public static int nFT_Outline_GetOutsideBorder(long outline) { + long __functionAddress = Functions.Outline_GetOutsideBorder; + return invokePI(outline, __functionAddress); + } + + @NativeType("FT_StrokerBorder") + public static int FT_Outline_GetOutsideBorder(@NativeType("FT_Outline *") FT_Outline outline) { + return nFT_Outline_GetOutsideBorder(outline.address()); + } + + // --- [ FT_Stroker_New ] --- + + public static int nFT_Stroker_New(long library, long astroker) { + long __functionAddress = Functions.Stroker_New; + if (CHECKS) { + check(library); + } + return invokePPI(library, astroker, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Stroker_New(@NativeType("FT_Library") long library, @NativeType("FT_Stroker *") PointerBuffer astroker) { + if (CHECKS) { + check(astroker, 1); + } + return nFT_Stroker_New(library, memAddress(astroker)); + } + + // --- [ FT_Stroker_Set ] --- + + public static void FT_Stroker_Set(@NativeType("FT_Stroker") long stroker, @NativeType("FT_Fixed") long radius, @NativeType("FT_Stroker_LineCap") int line_cap, @NativeType("FT_Stroker_LineJoin") int line_join, @NativeType("FT_Fixed") long miter_limit) { + long __functionAddress = Functions.Stroker_Set; + if (CHECKS) { + check(stroker); + } + invokePNNV(stroker, radius, line_cap, line_join, miter_limit, __functionAddress); + } + + // --- [ FT_Stroker_Rewind ] --- + + public static void FT_Stroker_Rewind(@NativeType("FT_Stroker") long stroker) { + long __functionAddress = Functions.Stroker_Rewind; + if (CHECKS) { + check(stroker); + } + invokePV(stroker, __functionAddress); + } + + // --- [ FT_Stroker_ParseOutline ] --- + + public static int nFT_Stroker_ParseOutline(long stroker, long outline, boolean opened) { + long __functionAddress = Functions.Stroker_ParseOutline; + if (CHECKS) { + check(stroker); + } + return invokePPI(stroker, outline, opened, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Stroker_ParseOutline(@NativeType("FT_Stroker") long stroker, @NativeType("FT_Outline *") FT_Outline outline, @NativeType("FT_Bool") boolean opened) { + return nFT_Stroker_ParseOutline(stroker, outline.address(), opened); + } + + // --- [ FT_Stroker_BeginSubPath ] --- + + public static int nFT_Stroker_BeginSubPath(long stroker, long to, boolean open) { + long __functionAddress = Functions.Stroker_BeginSubPath; + if (CHECKS) { + check(stroker); + } + return invokePPI(stroker, to, open, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Stroker_BeginSubPath(@NativeType("FT_Stroker") long stroker, @NativeType("FT_Vector *") FT_Vector to, @NativeType("FT_Bool") boolean open) { + return nFT_Stroker_BeginSubPath(stroker, to.address(), open); + } + + // --- [ FT_Stroker_EndSubPath ] --- + + @NativeType("FT_Error") + public static int FT_Stroker_EndSubPath(@NativeType("FT_Stroker") long stroker) { + long __functionAddress = Functions.Stroker_EndSubPath; + if (CHECKS) { + check(stroker); + } + return invokePI(stroker, __functionAddress); + } + + // --- [ FT_Stroker_LineTo ] --- + + public static int nFT_Stroker_LineTo(long stroker, long to) { + long __functionAddress = Functions.Stroker_LineTo; + if (CHECKS) { + check(stroker); + } + return invokePPI(stroker, to, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Stroker_LineTo(@NativeType("FT_Stroker") long stroker, @NativeType("FT_Vector *") FT_Vector to) { + return nFT_Stroker_LineTo(stroker, to.address()); + } + + // --- [ FT_Stroker_ConicTo ] --- + + public static int nFT_Stroker_ConicTo(long stroker, long control, long to) { + long __functionAddress = Functions.Stroker_ConicTo; + if (CHECKS) { + check(stroker); + } + return invokePPPI(stroker, control, to, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Stroker_ConicTo(@NativeType("FT_Stroker") long stroker, @NativeType("FT_Vector *") FT_Vector control, @NativeType("FT_Vector *") FT_Vector to) { + return nFT_Stroker_ConicTo(stroker, control.address(), to.address()); + } + + // --- [ FT_Stroker_CubicTo ] --- + + public static int nFT_Stroker_CubicTo(long stroker, long control1, long control2, long to) { + long __functionAddress = Functions.Stroker_CubicTo; + if (CHECKS) { + check(stroker); + } + return invokePPPPI(stroker, control1, control2, to, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Stroker_CubicTo(@NativeType("FT_Stroker") long stroker, @NativeType("FT_Vector *") FT_Vector control1, @NativeType("FT_Vector *") FT_Vector control2, @NativeType("FT_Vector *") FT_Vector to) { + return nFT_Stroker_CubicTo(stroker, control1.address(), control2.address(), to.address()); + } + + // --- [ FT_Stroker_GetBorderCounts ] --- + + public static int nFT_Stroker_GetBorderCounts(long stroker, int border, long anum_points, long anum_contours) { + long __functionAddress = Functions.Stroker_GetBorderCounts; + if (CHECKS) { + check(stroker); + } + return invokePPPI(stroker, border, anum_points, anum_contours, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Stroker_GetBorderCounts(@NativeType("FT_Stroker") long stroker, @NativeType("FT_StrokerBorder") int border, @NativeType("FT_UInt *") IntBuffer anum_points, @NativeType("FT_UInt *") IntBuffer anum_contours) { + if (CHECKS) { + check(anum_points, 1); + check(anum_contours, 1); + } + return nFT_Stroker_GetBorderCounts(stroker, border, memAddress(anum_points), memAddress(anum_contours)); + } + + // --- [ FT_Stroker_ExportBorder ] --- + + public static void nFT_Stroker_ExportBorder(long stroker, int border, long outline) { + long __functionAddress = Functions.Stroker_ExportBorder; + if (CHECKS) { + check(stroker); + } + invokePPV(stroker, border, outline, __functionAddress); + } + + public static void FT_Stroker_ExportBorder(@NativeType("FT_Stroker") long stroker, @NativeType("FT_StrokerBorder") int border, @NativeType("FT_Outline *") FT_Outline outline) { + nFT_Stroker_ExportBorder(stroker, border, outline.address()); + } + + // --- [ FT_Stroker_GetCounts ] --- + + public static int nFT_Stroker_GetCounts(long stroker, long anum_points, long anum_contours) { + long __functionAddress = Functions.Stroker_GetCounts; + if (CHECKS) { + check(stroker); + } + return invokePPPI(stroker, anum_points, anum_contours, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Stroker_GetCounts(@NativeType("FT_Stroker") long stroker, @NativeType("FT_UInt *") IntBuffer anum_points, @NativeType("FT_UInt *") IntBuffer anum_contours) { + if (CHECKS) { + check(anum_points, 1); + check(anum_contours, 1); + } + return nFT_Stroker_GetCounts(stroker, memAddress(anum_points), memAddress(anum_contours)); + } + + // --- [ FT_Stroker_Export ] --- + + public static void nFT_Stroker_Export(long stroker, long outline) { + long __functionAddress = Functions.Stroker_Export; + if (CHECKS) { + check(stroker); + } + invokePPV(stroker, outline, __functionAddress); + } + + public static void FT_Stroker_Export(@NativeType("FT_Stroker") long stroker, @NativeType("FT_Outline *") FT_Outline outline) { + nFT_Stroker_Export(stroker, outline.address()); + } + + // --- [ FT_Stroker_Done ] --- + + public static void FT_Stroker_Done(@NativeType("FT_Stroker") long stroker) { + long __functionAddress = Functions.Stroker_Done; + if (CHECKS) { + check(stroker); + } + invokePV(stroker, __functionAddress); + } + + // --- [ FT_Glyph_Stroke ] --- + + public static int nFT_Glyph_Stroke(long pglyph, long stroker, boolean destroy) { + long __functionAddress = Functions.Glyph_Stroke; + if (CHECKS) { + check(stroker); + } + return invokePPI(pglyph, stroker, destroy, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Glyph_Stroke(@NativeType("FT_Glyph *") PointerBuffer pglyph, @NativeType("FT_Stroker") long stroker, @NativeType("FT_Bool") boolean destroy) { + if (CHECKS) { + check(pglyph, 1); + } + return nFT_Glyph_Stroke(memAddress(pglyph), stroker, destroy); + } + + // --- [ FT_Glyph_StrokeBorder ] --- + + public static int nFT_Glyph_StrokeBorder(long pglyph, long stroker, boolean inside, boolean destroy) { + long __functionAddress = Functions.Glyph_StrokeBorder; + if (CHECKS) { + check(stroker); + } + return invokePPI(pglyph, stroker, inside, destroy, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Glyph_StrokeBorder(@NativeType("FT_Glyph *") PointerBuffer pglyph, @NativeType("FT_Stroker") long stroker, @NativeType("FT_Bool") boolean inside, @NativeType("FT_Bool") boolean destroy) { + if (CHECKS) { + check(pglyph, 1); + } + return nFT_Glyph_StrokeBorder(memAddress(pglyph), stroker, inside, destroy); + } + + // --- [ FT_GlyphSlot_Embolden ] --- + + public static void nFT_GlyphSlot_Embolden(long slot) { + long __functionAddress = Functions.GlyphSlot_Embolden; + invokePV(slot, __functionAddress); + } + + public static void FT_GlyphSlot_Embolden(FT_GlyphSlot slot) { + nFT_GlyphSlot_Embolden(slot.address()); + } + + // --- [ FT_GlyphSlot_AdjustWeight ] --- + + public static void nFT_GlyphSlot_AdjustWeight(long slot, long xdelta, long ydelta) { + long __functionAddress = Functions.GlyphSlot_AdjustWeight; + invokePNNV(slot, xdelta, ydelta, __functionAddress); + } + + public static void FT_GlyphSlot_AdjustWeight(FT_GlyphSlot slot, @NativeType("FT_Fixed") long xdelta, @NativeType("FT_Fixed") long ydelta) { + nFT_GlyphSlot_AdjustWeight(slot.address(), xdelta, ydelta); + } + + // --- [ FT_GlyphSlot_Oblique ] --- + + public static void nFT_GlyphSlot_Oblique(long slot) { + long __functionAddress = Functions.GlyphSlot_Oblique; + invokePV(slot, __functionAddress); + } + + public static void FT_GlyphSlot_Oblique(FT_GlyphSlot slot) { + nFT_GlyphSlot_Oblique(slot.address()); + } + + // --- [ FT_GlyphSlot_Slant ] --- + + public static void nFT_GlyphSlot_Slant(long slot, long xslant, long yslant) { + long __functionAddress = Functions.GlyphSlot_Slant; + invokePNNV(slot, xslant, yslant, __functionAddress); + } + + public static void FT_GlyphSlot_Slant(FT_GlyphSlot slot, @NativeType("FT_Fixed") long xslant, @NativeType("FT_Fixed") long yslant) { + nFT_GlyphSlot_Slant(slot.address(), xslant, yslant); + } + + // --- [ FT_Sin ] --- + + @NativeType("FT_Fixed") + public static long FT_Sin(@NativeType("FT_Angle") long angle) { + long __functionAddress = Functions.Sin; + return invokeNN(angle, __functionAddress); + } + + // --- [ FT_Cos ] --- + + @NativeType("FT_Fixed") + public static long FT_Cos(@NativeType("FT_Angle") long angle) { + long __functionAddress = Functions.Cos; + return invokeNN(angle, __functionAddress); + } + + // --- [ FT_Tan ] --- + + @NativeType("FT_Fixed") + public static long FT_Tan(@NativeType("FT_Angle") long angle) { + long __functionAddress = Functions.Tan; + return invokeNN(angle, __functionAddress); + } + + // --- [ FT_Atan2 ] --- + + @NativeType("FT_Angle") + public static long FT_Atan2(@NativeType("FT_Fixed") long x, @NativeType("FT_Fixed") long y) { + long __functionAddress = Functions.Atan2; + return invokeNNN(x, y, __functionAddress); + } + + // --- [ FT_Angle_Diff ] --- + + @NativeType("FT_Angle") + public static long FT_Angle_Diff(@NativeType("FT_Angle") long angle1, @NativeType("FT_Angle") long angle2) { + long __functionAddress = Functions.Angle_Diff; + return invokeNNN(angle1, angle2, __functionAddress); + } + + // --- [ FT_Vector_Unit ] --- + + public static void nFT_Vector_Unit(long vec, long angle) { + long __functionAddress = Functions.Vector_Unit; + invokePNV(vec, angle, __functionAddress); + } + + public static void FT_Vector_Unit(@NativeType("FT_Vector *") FT_Vector vec, @NativeType("FT_Angle") long angle) { + nFT_Vector_Unit(vec.address(), angle); + } + + // --- [ FT_Vector_Rotate ] --- + + public static void nFT_Vector_Rotate(long vec, long angle) { + long __functionAddress = Functions.Vector_Rotate; + invokePNV(vec, angle, __functionAddress); + } + + public static void FT_Vector_Rotate(@NativeType("FT_Vector *") FT_Vector vec, @NativeType("FT_Angle") long angle) { + nFT_Vector_Rotate(vec.address(), angle); + } + + // --- [ FT_Vector_Length ] --- + + public static long nFT_Vector_Length(long vec) { + long __functionAddress = Functions.Vector_Length; + return invokePN(vec, __functionAddress); + } + + @NativeType("FT_Fixed") + public static long FT_Vector_Length(@NativeType("FT_Vector *") FT_Vector vec) { + return nFT_Vector_Length(vec.address()); + } + + // --- [ FT_Vector_Polarize ] --- + + public static void nFT_Vector_Polarize(long vec, long length, long angle) { + long __functionAddress = Functions.Vector_Polarize; + invokePPPV(vec, length, angle, __functionAddress); + } + + public static void FT_Vector_Polarize(@NativeType("FT_Vector *") FT_Vector vec, @NativeType("FT_Fixed *") CLongBuffer length, @NativeType("FT_Angle *") CLongBuffer angle) { + if (CHECKS) { + check(length, 1); + check(angle, 1); + } + nFT_Vector_Polarize(vec.address(), memAddress(length), memAddress(angle)); + } + + // --- [ FT_Vector_From_Polar ] --- + + public static void nFT_Vector_From_Polar(long vec, long length, long angle) { + long __functionAddress = Functions.Vector_From_Polar; + invokePNNV(vec, length, angle, __functionAddress); + } + + public static void FT_Vector_From_Polar(@NativeType("FT_Vector *") FT_Vector vec, @NativeType("FT_Fixed") long length, @NativeType("FT_Angle") long angle) { + nFT_Vector_From_Polar(vec.address(), length, angle); + } + + // --- [ FT_Has_PS_Glyph_Names ] --- + + public static int nFT_Has_PS_Glyph_Names(long face) { + long __functionAddress = Functions.Has_PS_Glyph_Names; + return invokePI(face, __functionAddress); + } + + @NativeType("FT_Int") + public static int FT_Has_PS_Glyph_Names(FT_Face face) { + return nFT_Has_PS_Glyph_Names(face.address()); + } + + // --- [ FT_Get_PS_Font_Info ] --- + + public static int nFT_Get_PS_Font_Info(long face, long afont_info) { + long __functionAddress = Functions.Get_PS_Font_Info; + return invokePPI(face, afont_info, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_PS_Font_Info(FT_Face face, PS_FontInfo afont_info) { + return nFT_Get_PS_Font_Info(face.address(), afont_info.address()); + } + + // --- [ FT_Get_PS_Font_Private ] --- + + public static int nFT_Get_PS_Font_Private(long face, long afont_private) { + long __functionAddress = Functions.Get_PS_Font_Private; + if (CHECKS) { + check(afont_private); + } + return invokePPI(face, afont_private, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Get_PS_Font_Private(FT_Face face, @NativeType("PS_Private") long afont_private) { + return nFT_Get_PS_Font_Private(face.address(), afont_private); + } + + // --- [ FT_Get_PS_Font_Value ] --- + + public static long nFT_Get_PS_Font_Value(long face, int key, int idx, long value, long value_len) { + long __functionAddress = Functions.Get_PS_Font_Value; + return invokePPNN(face, key, idx, value, value_len, __functionAddress); + } + + @NativeType("FT_Long") + public static long FT_Get_PS_Font_Value(FT_Face face, @NativeType("PS_Dict_Keys") int key, @NativeType("FT_UInt") int idx, @Nullable @NativeType("void *") ByteBuffer value) { + return nFT_Get_PS_Font_Value(face.address(), key, idx, memAddressSafe(value), remainingSafe(value)); + } + + // --- [ FT_Get_Sfnt_Table ] --- + + public static long nFT_Get_Sfnt_Table(long face, int tag) { + long __functionAddress = Functions.Get_Sfnt_Table; + return invokePP(face, tag, __functionAddress); + } + + @NativeType("void *") + public static long FT_Get_Sfnt_Table(FT_Face face, @NativeType("FT_Sfnt_Tag") int tag) { + return nFT_Get_Sfnt_Table(face.address(), tag); + } + + // --- [ FT_Load_Sfnt_Table ] --- + + public static int nFT_Load_Sfnt_Table(long face, long tag, long offset, long buffer, long length) { + long __functionAddress = Functions.Load_Sfnt_Table; + return invokePNNPPI(face, tag, offset, buffer, length, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Load_Sfnt_Table(FT_Face face, @NativeType("FT_ULong") long tag, @NativeType("FT_Long") long offset, @Nullable @NativeType("FT_Byte *") ByteBuffer buffer, @Nullable @NativeType("FT_ULong *") CLongBuffer length) { + if (CHECKS) { + checkSafe(length, 1); + } + return nFT_Load_Sfnt_Table(face.address(), tag, offset, memAddressSafe(buffer), memAddressSafe(length)); + } + + // --- [ FT_Sfnt_Table_Info ] --- + + public static int nFT_Sfnt_Table_Info(long face, int table_index, long tag, long length) { + long __functionAddress = Functions.Sfnt_Table_Info; + return invokePPPI(face, table_index, tag, length, __functionAddress); + } + + @NativeType("FT_Error") + public static int FT_Sfnt_Table_Info(FT_Face face, @NativeType("FT_UInt") int table_index, @Nullable @NativeType("FT_ULong *") CLongBuffer tag, @Nullable @NativeType("FT_ULong *") CLongBuffer length) { + if (CHECKS) { + checkSafe(length, 1); + } + return nFT_Sfnt_Table_Info(face.address(), table_index, memAddressSafe(tag), memAddressSafe(length)); + } + + // --- [ FT_Get_CMap_Language_ID ] --- + + public static long nFT_Get_CMap_Language_ID(long charmap) { + long __functionAddress = Functions.Get_CMap_Language_ID; + return invokePN(charmap, __functionAddress); + } + + @NativeType("FT_ULong") + public static long FT_Get_CMap_Language_ID(FT_CharMap charmap) { + return nFT_Get_CMap_Language_ID(charmap.address()); + } + + // --- [ FT_Get_CMap_Format ] --- + + public static long nFT_Get_CMap_Format(long charmap) { + long __functionAddress = Functions.Get_CMap_Format; + return invokePN(charmap, __functionAddress); + } + + @NativeType("FT_Long") + public static long FT_Get_CMap_Format(FT_CharMap charmap) { + return nFT_Get_CMap_Format(charmap.address()); + } + + public static int FT_ENC_TAG(int a, int b, int c, int d) { + return ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((c & 0xFF) << 8) | (d & 0xFF); + } + + public static boolean FT_HAS_HORIZONTAL(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_HORIZONTAL) != 0; + } + + public static boolean FT_HAS_VERTICAL(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_VERTICAL) != 0; + } + + public static boolean FT_HAS_KERNING(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_KERNING) != 0; + } + + public static boolean FT_IS_SCALABLE(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_SCALABLE) != 0; + } + + public static boolean FT_IS_SFNT(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_SFNT) != 0; + } + + public static boolean FT_IS_FIXED_WIDTH(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_FIXED_WIDTH) != 0; + } + + public static boolean FT_HAS_FIXED_SIZES(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_FIXED_SIZES) != 0; + } + + public static boolean FT_HAS_GLYPH_NAMES(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_GLYPH_NAMES) != 0; + } + + public static boolean FT_HAS_MULTIPLE_MASTERS(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_MULTIPLE_MASTERS) != 0; + } + + public static boolean FT_IS_NAMED_INSTANCE(FT_Face face) { + return (face.face_index() & 0x7FFF0000) != 0; + } + + public static boolean FT_IS_VARIATION(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_VARIATION) != 0; + } + + public static boolean FT_IS_CID_KEYED(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_CID_KEYED) != 0; + } + + public static boolean FT_IS_TRICKY(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_TRICKY) != 0; + } + + public static boolean FT_HAS_COLOR(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_COLOR) != 0; + } + + public static boolean FT_HAS_SVG(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_SVG) != 0; + } + + public static boolean FT_HAS_SBIX(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_SBIX) != 0; + } + + public static boolean FT_HAS_SBIX_OVERLAY(FT_Face face) { + return (face.face_flags() & FT_FACE_FLAG_SBIX_OVERLAY) != 0; + } + + private static int FT_LOAD_TARGET_(int x) { + return (x & 15) << 16; + } + + public static int FT_LOAD_TARGET_MODE(int x) { + return (x >> 16) & 15; + } + + public static boolean FTC_IMAGE_TYPE_COMPARE(FTC_ImageType d1, FTC_ImageType d2) { + return d1.face_id() == d2.face_id() && d1.width() == d2.width() && d1.flags() == d2.flags(); + } + + public static int FT_CURVE_TAG(int flag) { + return flag & 0x03; + } + + public static int FT_IMAGE_TAG(int _x1, int _x2, int _x3, int _x4) { + return ((_x1 & 0xFF) << 24) | ((_x2 & 0xFF) << 16) | ((_x3 & 0xFF) << 8) | (_x4 & 0xFF); + } + + public static int FT_MAKE_TAG(int _x1, int _x2, int _x3, int _x4) { + return ((_x1 & 0xFF) << 24) | ((_x2 & 0xFF) << 16) | ((_x3 & 0xFF) << 8) | (_x4 & 0xFF); + } + + public static boolean FT_IS_EMPTY(FT_List list) { + return list.head() == null; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/PS_FontInfo.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/PS_FontInfo.java new file mode 100644 index 000000000..b76630e3b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/PS_FontInfo.java @@ -0,0 +1,290 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used to model a Type~1 or Type~2 FontInfo dictionary. Note that for Multiple Master fonts, each instance has its own FontInfo dictionary. + * + *

    Layout

    + * + *
    
    + * struct PS_FontInfoRec {
    + *     FT_String * version;
    + *     FT_String * notice;
    + *     FT_String * full_name;
    + *     FT_String * family_name;
    + *     FT_String * weight;
    + *     FT_Long italic_angle;
    + *     FT_Bool is_fixed_pitch;
    + *     FT_Short underline_position;
    + *     FT_UShort underline_thickness;
    + * }
    + */ +@NativeType("struct PS_FontInfoRec") +public class PS_FontInfo extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + VERSION, + NOTICE, + FULL_NAME, + FAMILY_NAME, + WEIGHT, + ITALIC_ANGLE, + IS_FIXED_PITCH, + UNDERLINE_POSITION, + UNDERLINE_THICKNESS; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(CLONG_SIZE), + __member(1), + __member(2), + __member(2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + VERSION = layout.offsetof(0); + NOTICE = layout.offsetof(1); + FULL_NAME = layout.offsetof(2); + FAMILY_NAME = layout.offsetof(3); + WEIGHT = layout.offsetof(4); + ITALIC_ANGLE = layout.offsetof(5); + IS_FIXED_PITCH = layout.offsetof(6); + UNDERLINE_POSITION = layout.offsetof(7); + UNDERLINE_THICKNESS = layout.offsetof(8); + } + + protected PS_FontInfo(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected PS_FontInfo create(long address, @Nullable ByteBuffer container) { + return new PS_FontInfo(address, container); + } + + /** + * Creates a {@code PS_FontInfo} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public PS_FontInfo(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code version} field. */ + @NativeType("FT_String *") + public ByteBuffer version() { return nversion(address()); } + /** @return the null-terminated string pointed to by the {@code version} field. */ + @NativeType("FT_String *") + public String versionString() { return nversionString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code notice} field. */ + @NativeType("FT_String *") + public ByteBuffer notice() { return nnotice(address()); } + /** @return the null-terminated string pointed to by the {@code notice} field. */ + @NativeType("FT_String *") + public String noticeString() { return nnoticeString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code full_name} field. */ + @NativeType("FT_String *") + public ByteBuffer full_name() { return nfull_name(address()); } + /** @return the null-terminated string pointed to by the {@code full_name} field. */ + @NativeType("FT_String *") + public String full_nameString() { return nfull_nameString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code family_name} field. */ + @NativeType("FT_String *") + public ByteBuffer family_name() { return nfamily_name(address()); } + /** @return the null-terminated string pointed to by the {@code family_name} field. */ + @NativeType("FT_String *") + public String family_nameString() { return nfamily_nameString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code weight} field. */ + @NativeType("FT_String *") + public ByteBuffer weight() { return nweight(address()); } + /** @return the null-terminated string pointed to by the {@code weight} field. */ + @NativeType("FT_String *") + public String weightString() { return nweightString(address()); } + /** @return the value of the {@code italic_angle} field. */ + @NativeType("FT_Long") + public long italic_angle() { return nitalic_angle(address()); } + /** @return the value of the {@code is_fixed_pitch} field. */ + @NativeType("FT_Bool") + public boolean is_fixed_pitch() { return nis_fixed_pitch(address()); } + /** @return the value of the {@code underline_position} field. */ + @NativeType("FT_Short") + public short underline_position() { return nunderline_position(address()); } + /** @return the value of the {@code underline_thickness} field. */ + @NativeType("FT_UShort") + public short underline_thickness() { return nunderline_thickness(address()); } + + // ----------------------------------- + + /** Returns a new {@code PS_FontInfo} instance for the specified memory address. */ + public static PS_FontInfo create(long address) { + return new PS_FontInfo(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static PS_FontInfo createSafe(long address) { + return address == NULL ? null : new PS_FontInfo(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #version}. */ + public static ByteBuffer nversion(long struct) { return memByteBufferNT1(memGetAddress(struct + PS_FontInfo.VERSION)); } + /** Unsafe version of {@link #versionString}. */ + public static String nversionString(long struct) { return memUTF8(memGetAddress(struct + PS_FontInfo.VERSION)); } + /** Unsafe version of {@link #notice}. */ + public static ByteBuffer nnotice(long struct) { return memByteBufferNT1(memGetAddress(struct + PS_FontInfo.NOTICE)); } + /** Unsafe version of {@link #noticeString}. */ + public static String nnoticeString(long struct) { return memUTF8(memGetAddress(struct + PS_FontInfo.NOTICE)); } + /** Unsafe version of {@link #full_name}. */ + public static ByteBuffer nfull_name(long struct) { return memByteBufferNT1(memGetAddress(struct + PS_FontInfo.FULL_NAME)); } + /** Unsafe version of {@link #full_nameString}. */ + public static String nfull_nameString(long struct) { return memUTF8(memGetAddress(struct + PS_FontInfo.FULL_NAME)); } + /** Unsafe version of {@link #family_name}. */ + public static ByteBuffer nfamily_name(long struct) { return memByteBufferNT1(memGetAddress(struct + PS_FontInfo.FAMILY_NAME)); } + /** Unsafe version of {@link #family_nameString}. */ + public static String nfamily_nameString(long struct) { return memUTF8(memGetAddress(struct + PS_FontInfo.FAMILY_NAME)); } + /** Unsafe version of {@link #weight}. */ + public static ByteBuffer nweight(long struct) { return memByteBufferNT1(memGetAddress(struct + PS_FontInfo.WEIGHT)); } + /** Unsafe version of {@link #weightString}. */ + public static String nweightString(long struct) { return memUTF8(memGetAddress(struct + PS_FontInfo.WEIGHT)); } + /** Unsafe version of {@link #italic_angle}. */ + public static long nitalic_angle(long struct) { return memGetCLong(struct + PS_FontInfo.ITALIC_ANGLE); } + /** Unsafe version of {@link #is_fixed_pitch}. */ + public static boolean nis_fixed_pitch(long struct) { return UNSAFE.getByte(null, struct + PS_FontInfo.IS_FIXED_PITCH) != 0; } + /** Unsafe version of {@link #underline_position}. */ + public static short nunderline_position(long struct) { return UNSAFE.getShort(null, struct + PS_FontInfo.UNDERLINE_POSITION); } + /** Unsafe version of {@link #underline_thickness}. */ + public static short nunderline_thickness(long struct) { return UNSAFE.getShort(null, struct + PS_FontInfo.UNDERLINE_THICKNESS); } + + // ----------------------------------- + + /** An array of {@link PS_FontInfo} structs. */ + public static class Buffer extends StructBuffer { + + private static final PS_FontInfo ELEMENT_FACTORY = PS_FontInfo.create(-1L); + + /** + * Creates a new {@code PS_FontInfo.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link PS_FontInfo#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected PS_FontInfo getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code version} field. */ + @NativeType("FT_String *") + public ByteBuffer version() { return PS_FontInfo.nversion(address()); } + /** @return the null-terminated string pointed to by the {@code version} field. */ + @NativeType("FT_String *") + public String versionString() { return PS_FontInfo.nversionString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code notice} field. */ + @NativeType("FT_String *") + public ByteBuffer notice() { return PS_FontInfo.nnotice(address()); } + /** @return the null-terminated string pointed to by the {@code notice} field. */ + @NativeType("FT_String *") + public String noticeString() { return PS_FontInfo.nnoticeString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code full_name} field. */ + @NativeType("FT_String *") + public ByteBuffer full_name() { return PS_FontInfo.nfull_name(address()); } + /** @return the null-terminated string pointed to by the {@code full_name} field. */ + @NativeType("FT_String *") + public String full_nameString() { return PS_FontInfo.nfull_nameString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code family_name} field. */ + @NativeType("FT_String *") + public ByteBuffer family_name() { return PS_FontInfo.nfamily_name(address()); } + /** @return the null-terminated string pointed to by the {@code family_name} field. */ + @NativeType("FT_String *") + public String family_nameString() { return PS_FontInfo.nfamily_nameString(address()); } + /** @return a {@link ByteBuffer} view of the null-terminated string pointed to by the {@code weight} field. */ + @NativeType("FT_String *") + public ByteBuffer weight() { return PS_FontInfo.nweight(address()); } + /** @return the null-terminated string pointed to by the {@code weight} field. */ + @NativeType("FT_String *") + public String weightString() { return PS_FontInfo.nweightString(address()); } + /** @return the value of the {@code italic_angle} field. */ + @NativeType("FT_Long") + public long italic_angle() { return PS_FontInfo.nitalic_angle(address()); } + /** @return the value of the {@code is_fixed_pitch} field. */ + @NativeType("FT_Bool") + public boolean is_fixed_pitch() { return PS_FontInfo.nis_fixed_pitch(address()); } + /** @return the value of the {@code underline_position} field. */ + @NativeType("FT_Short") + public short underline_position() { return PS_FontInfo.nunderline_position(address()); } + /** @return the value of the {@code underline_thickness} field. */ + @NativeType("FT_UShort") + public short underline_thickness() { return PS_FontInfo.nunderline_thickness(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/PS_Private.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/PS_Private.java new file mode 100644 index 000000000..b399ba89e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/PS_Private.java @@ -0,0 +1,533 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used to model a Type~1 or Type~2 private dictionary. Note that for Multiple Master fonts, each instance has its own Private dictionary. + * + *

    Layout

    + * + *
    
    + * struct PS_PrivateRec {
    + *     FT_Int unique_id;
    + *     FT_Int lenIV;
    + *     FT_Byte num_blue_values;
    + *     FT_Byte num_other_blues;
    + *     FT_Byte num_family_blues;
    + *     FT_Byte num_family_other_blues;
    + *     FT_Short blue_values[14];
    + *     FT_Short other_blues[10];
    + *     FT_Short family_blues[14];
    + *     FT_Short family_other_blues[10];
    + *     FT_Fixed blue_scale;
    + *     FT_Int blue_shift;
    + *     FT_Int blue_fuzz;
    + *     FT_UShort standard_width[1];
    + *     FT_UShort standard_height[1];
    + *     FT_Byte num_snap_widths;
    + *     FT_Byte num_snap_heights;
    + *     FT_Bool force_bold;
    + *     FT_Bool round_stem_up;
    + *     FT_Short {@link #snap_widths}[13];
    + *     FT_Short {@link #snap_heights}[13];
    + *     FT_Fixed expansion_factor;
    + *     FT_Long language_group;
    + *     FT_Long password;
    + *     FT_Short min_feature[2];
    + * }
    + */ +@NativeType("struct PS_PrivateRec") +public class PS_Private extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + UNIQUE_ID, + LENIV, + NUM_BLUE_VALUES, + NUM_OTHER_BLUES, + NUM_FAMILY_BLUES, + NUM_FAMILY_OTHER_BLUES, + BLUE_VALUES, + OTHER_BLUES, + FAMILY_BLUES, + FAMILY_OTHER_BLUES, + BLUE_SCALE, + BLUE_SHIFT, + BLUE_FUZZ, + STANDARD_WIDTH, + STANDARD_HEIGHT, + NUM_SNAP_WIDTHS, + NUM_SNAP_HEIGHTS, + FORCE_BOLD, + ROUND_STEM_UP, + SNAP_WIDTHS, + SNAP_HEIGHTS, + EXPANSION_FACTOR, + LANGUAGE_GROUP, + PASSWORD, + MIN_FEATURE; + + static { + Layout layout = __struct( + __member(4), + __member(4), + __member(1), + __member(1), + __member(1), + __member(1), + __array(2, 14), + __array(2, 10), + __array(2, 14), + __array(2, 10), + __member(CLONG_SIZE), + __member(4), + __member(4), + __array(2, 1), + __array(2, 1), + __member(1), + __member(1), + __member(1), + __member(1), + __array(2, 13), + __array(2, 13), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __array(2, 2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + UNIQUE_ID = layout.offsetof(0); + LENIV = layout.offsetof(1); + NUM_BLUE_VALUES = layout.offsetof(2); + NUM_OTHER_BLUES = layout.offsetof(3); + NUM_FAMILY_BLUES = layout.offsetof(4); + NUM_FAMILY_OTHER_BLUES = layout.offsetof(5); + BLUE_VALUES = layout.offsetof(6); + OTHER_BLUES = layout.offsetof(7); + FAMILY_BLUES = layout.offsetof(8); + FAMILY_OTHER_BLUES = layout.offsetof(9); + BLUE_SCALE = layout.offsetof(10); + BLUE_SHIFT = layout.offsetof(11); + BLUE_FUZZ = layout.offsetof(12); + STANDARD_WIDTH = layout.offsetof(13); + STANDARD_HEIGHT = layout.offsetof(14); + NUM_SNAP_WIDTHS = layout.offsetof(15); + NUM_SNAP_HEIGHTS = layout.offsetof(16); + FORCE_BOLD = layout.offsetof(17); + ROUND_STEM_UP = layout.offsetof(18); + SNAP_WIDTHS = layout.offsetof(19); + SNAP_HEIGHTS = layout.offsetof(20); + EXPANSION_FACTOR = layout.offsetof(21); + LANGUAGE_GROUP = layout.offsetof(22); + PASSWORD = layout.offsetof(23); + MIN_FEATURE = layout.offsetof(24); + } + + protected PS_Private(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected PS_Private create(long address, @Nullable ByteBuffer container) { + return new PS_Private(address, container); + } + + /** + * Creates a {@code PS_Private} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public PS_Private(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code unique_id} field. */ + @NativeType("FT_Int") + public int unique_id() { return nunique_id(address()); } + /** @return the value of the {@code lenIV} field. */ + @NativeType("FT_Int") + public int lenIV() { return nlenIV(address()); } + /** @return the value of the {@code num_blue_values} field. */ + @NativeType("FT_Byte") + public byte num_blue_values() { return nnum_blue_values(address()); } + /** @return the value of the {@code num_other_blues} field. */ + @NativeType("FT_Byte") + public byte num_other_blues() { return nnum_other_blues(address()); } + /** @return the value of the {@code num_family_blues} field. */ + @NativeType("FT_Byte") + public byte num_family_blues() { return nnum_family_blues(address()); } + /** @return the value of the {@code num_family_other_blues} field. */ + @NativeType("FT_Byte") + public byte num_family_other_blues() { return nnum_family_other_blues(address()); } + /** @return a {@link ShortBuffer} view of the {@code blue_values} field. */ + @NativeType("FT_Short[14]") + public ShortBuffer blue_values() { return nblue_values(address()); } + /** @return the value at the specified index of the {@code blue_values} field. */ + @NativeType("FT_Short") + public short blue_values(int index) { return nblue_values(address(), index); } + /** @return a {@link ShortBuffer} view of the {@code other_blues} field. */ + @NativeType("FT_Short[10]") + public ShortBuffer other_blues() { return nother_blues(address()); } + /** @return the value at the specified index of the {@code other_blues} field. */ + @NativeType("FT_Short") + public short other_blues(int index) { return nother_blues(address(), index); } + /** @return a {@link ShortBuffer} view of the {@code family_blues} field. */ + @NativeType("FT_Short[14]") + public ShortBuffer family_blues() { return nfamily_blues(address()); } + /** @return the value at the specified index of the {@code family_blues} field. */ + @NativeType("FT_Short") + public short family_blues(int index) { return nfamily_blues(address(), index); } + /** @return a {@link ShortBuffer} view of the {@code family_other_blues} field. */ + @NativeType("FT_Short[10]") + public ShortBuffer family_other_blues() { return nfamily_other_blues(address()); } + /** @return the value at the specified index of the {@code family_other_blues} field. */ + @NativeType("FT_Short") + public short family_other_blues(int index) { return nfamily_other_blues(address(), index); } + /** @return the value of the {@code blue_scale} field. */ + @NativeType("FT_Fixed") + public long blue_scale() { return nblue_scale(address()); } + /** @return the value of the {@code blue_shift} field. */ + @NativeType("FT_Int") + public int blue_shift() { return nblue_shift(address()); } + /** @return the value of the {@code blue_fuzz} field. */ + @NativeType("FT_Int") + public int blue_fuzz() { return nblue_fuzz(address()); } + /** @return a {@link ShortBuffer} view of the {@code standard_width} field. */ + @NativeType("FT_UShort[1]") + public ShortBuffer standard_width() { return nstandard_width(address()); } + /** @return the value at the specified index of the {@code standard_width} field. */ + @NativeType("FT_UShort") + public short standard_width(int index) { return nstandard_width(address(), index); } + /** @return a {@link ShortBuffer} view of the {@code standard_height} field. */ + @NativeType("FT_UShort[1]") + public ShortBuffer standard_height() { return nstandard_height(address()); } + /** @return the value at the specified index of the {@code standard_height} field. */ + @NativeType("FT_UShort") + public short standard_height(int index) { return nstandard_height(address(), index); } + /** @return the value of the {@code num_snap_widths} field. */ + @NativeType("FT_Byte") + public byte num_snap_widths() { return nnum_snap_widths(address()); } + /** @return the value of the {@code num_snap_heights} field. */ + @NativeType("FT_Byte") + public byte num_snap_heights() { return nnum_snap_heights(address()); } + /** @return the value of the {@code force_bold} field. */ + @NativeType("FT_Bool") + public boolean force_bold() { return nforce_bold(address()); } + /** @return the value of the {@code round_stem_up} field. */ + @NativeType("FT_Bool") + public boolean round_stem_up() { return nround_stem_up(address()); } + /** including std width */ + @NativeType("FT_Short[13]") + public ShortBuffer snap_widths() { return nsnap_widths(address()); } + /** including std width */ + @NativeType("FT_Short") + public short snap_widths(int index) { return nsnap_widths(address(), index); } + /** including std height */ + @NativeType("FT_Short[13]") + public ShortBuffer snap_heights() { return nsnap_heights(address()); } + /** including std height */ + @NativeType("FT_Short") + public short snap_heights(int index) { return nsnap_heights(address(), index); } + /** @return the value of the {@code expansion_factor} field. */ + @NativeType("FT_Fixed") + public long expansion_factor() { return nexpansion_factor(address()); } + /** @return the value of the {@code language_group} field. */ + @NativeType("FT_Long") + public long language_group() { return nlanguage_group(address()); } + /** @return the value of the {@code password} field. */ + @NativeType("FT_Long") + public long password() { return npassword(address()); } + /** @return a {@link ShortBuffer} view of the {@code min_feature} field. */ + @NativeType("FT_Short[2]") + public ShortBuffer min_feature() { return nmin_feature(address()); } + /** @return the value at the specified index of the {@code min_feature} field. */ + @NativeType("FT_Short") + public short min_feature(int index) { return nmin_feature(address(), index); } + + // ----------------------------------- + + /** Returns a new {@code PS_Private} instance for the specified memory address. */ + public static PS_Private create(long address) { + return new PS_Private(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static PS_Private createSafe(long address) { + return address == NULL ? null : new PS_Private(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #unique_id}. */ + public static int nunique_id(long struct) { return UNSAFE.getInt(null, struct + PS_Private.UNIQUE_ID); } + /** Unsafe version of {@link #lenIV}. */ + public static int nlenIV(long struct) { return UNSAFE.getInt(null, struct + PS_Private.LENIV); } + /** Unsafe version of {@link #num_blue_values}. */ + public static byte nnum_blue_values(long struct) { return UNSAFE.getByte(null, struct + PS_Private.NUM_BLUE_VALUES); } + /** Unsafe version of {@link #num_other_blues}. */ + public static byte nnum_other_blues(long struct) { return UNSAFE.getByte(null, struct + PS_Private.NUM_OTHER_BLUES); } + /** Unsafe version of {@link #num_family_blues}. */ + public static byte nnum_family_blues(long struct) { return UNSAFE.getByte(null, struct + PS_Private.NUM_FAMILY_BLUES); } + /** Unsafe version of {@link #num_family_other_blues}. */ + public static byte nnum_family_other_blues(long struct) { return UNSAFE.getByte(null, struct + PS_Private.NUM_FAMILY_OTHER_BLUES); } + /** Unsafe version of {@link #blue_values}. */ + public static ShortBuffer nblue_values(long struct) { return memShortBuffer(struct + PS_Private.BLUE_VALUES, 14); } + /** Unsafe version of {@link #blue_values(int) blue_values}. */ + public static short nblue_values(long struct, int index) { + return UNSAFE.getShort(null, struct + PS_Private.BLUE_VALUES + check(index, 14) * 2); + } + /** Unsafe version of {@link #other_blues}. */ + public static ShortBuffer nother_blues(long struct) { return memShortBuffer(struct + PS_Private.OTHER_BLUES, 10); } + /** Unsafe version of {@link #other_blues(int) other_blues}. */ + public static short nother_blues(long struct, int index) { + return UNSAFE.getShort(null, struct + PS_Private.OTHER_BLUES + check(index, 10) * 2); + } + /** Unsafe version of {@link #family_blues}. */ + public static ShortBuffer nfamily_blues(long struct) { return memShortBuffer(struct + PS_Private.FAMILY_BLUES, 14); } + /** Unsafe version of {@link #family_blues(int) family_blues}. */ + public static short nfamily_blues(long struct, int index) { + return UNSAFE.getShort(null, struct + PS_Private.FAMILY_BLUES + check(index, 14) * 2); + } + /** Unsafe version of {@link #family_other_blues}. */ + public static ShortBuffer nfamily_other_blues(long struct) { return memShortBuffer(struct + PS_Private.FAMILY_OTHER_BLUES, 10); } + /** Unsafe version of {@link #family_other_blues(int) family_other_blues}. */ + public static short nfamily_other_blues(long struct, int index) { + return UNSAFE.getShort(null, struct + PS_Private.FAMILY_OTHER_BLUES + check(index, 10) * 2); + } + /** Unsafe version of {@link #blue_scale}. */ + public static long nblue_scale(long struct) { return memGetCLong(struct + PS_Private.BLUE_SCALE); } + /** Unsafe version of {@link #blue_shift}. */ + public static int nblue_shift(long struct) { return UNSAFE.getInt(null, struct + PS_Private.BLUE_SHIFT); } + /** Unsafe version of {@link #blue_fuzz}. */ + public static int nblue_fuzz(long struct) { return UNSAFE.getInt(null, struct + PS_Private.BLUE_FUZZ); } + /** Unsafe version of {@link #standard_width}. */ + public static ShortBuffer nstandard_width(long struct) { return memShortBuffer(struct + PS_Private.STANDARD_WIDTH, 1); } + /** Unsafe version of {@link #standard_width(int) standard_width}. */ + public static short nstandard_width(long struct, int index) { + return UNSAFE.getShort(null, struct + PS_Private.STANDARD_WIDTH + check(index, 1) * 2); + } + /** Unsafe version of {@link #standard_height}. */ + public static ShortBuffer nstandard_height(long struct) { return memShortBuffer(struct + PS_Private.STANDARD_HEIGHT, 1); } + /** Unsafe version of {@link #standard_height(int) standard_height}. */ + public static short nstandard_height(long struct, int index) { + return UNSAFE.getShort(null, struct + PS_Private.STANDARD_HEIGHT + check(index, 1) * 2); + } + /** Unsafe version of {@link #num_snap_widths}. */ + public static byte nnum_snap_widths(long struct) { return UNSAFE.getByte(null, struct + PS_Private.NUM_SNAP_WIDTHS); } + /** Unsafe version of {@link #num_snap_heights}. */ + public static byte nnum_snap_heights(long struct) { return UNSAFE.getByte(null, struct + PS_Private.NUM_SNAP_HEIGHTS); } + /** Unsafe version of {@link #force_bold}. */ + public static boolean nforce_bold(long struct) { return UNSAFE.getByte(null, struct + PS_Private.FORCE_BOLD) != 0; } + /** Unsafe version of {@link #round_stem_up}. */ + public static boolean nround_stem_up(long struct) { return UNSAFE.getByte(null, struct + PS_Private.ROUND_STEM_UP) != 0; } + /** Unsafe version of {@link #snap_widths}. */ + public static ShortBuffer nsnap_widths(long struct) { return memShortBuffer(struct + PS_Private.SNAP_WIDTHS, 13); } + /** Unsafe version of {@link #snap_widths(int) snap_widths}. */ + public static short nsnap_widths(long struct, int index) { + return UNSAFE.getShort(null, struct + PS_Private.SNAP_WIDTHS + check(index, 13) * 2); + } + /** Unsafe version of {@link #snap_heights}. */ + public static ShortBuffer nsnap_heights(long struct) { return memShortBuffer(struct + PS_Private.SNAP_HEIGHTS, 13); } + /** Unsafe version of {@link #snap_heights(int) snap_heights}. */ + public static short nsnap_heights(long struct, int index) { + return UNSAFE.getShort(null, struct + PS_Private.SNAP_HEIGHTS + check(index, 13) * 2); + } + /** Unsafe version of {@link #expansion_factor}. */ + public static long nexpansion_factor(long struct) { return memGetCLong(struct + PS_Private.EXPANSION_FACTOR); } + /** Unsafe version of {@link #language_group}. */ + public static long nlanguage_group(long struct) { return memGetCLong(struct + PS_Private.LANGUAGE_GROUP); } + /** Unsafe version of {@link #password}. */ + public static long npassword(long struct) { return memGetCLong(struct + PS_Private.PASSWORD); } + /** Unsafe version of {@link #min_feature}. */ + public static ShortBuffer nmin_feature(long struct) { return memShortBuffer(struct + PS_Private.MIN_FEATURE, 2); } + /** Unsafe version of {@link #min_feature(int) min_feature}. */ + public static short nmin_feature(long struct, int index) { + return UNSAFE.getShort(null, struct + PS_Private.MIN_FEATURE + check(index, 2) * 2); + } + + // ----------------------------------- + + /** An array of {@link PS_Private} structs. */ + public static class Buffer extends StructBuffer { + + private static final PS_Private ELEMENT_FACTORY = PS_Private.create(-1L); + + /** + * Creates a new {@code PS_Private.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link PS_Private#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected PS_Private getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code unique_id} field. */ + @NativeType("FT_Int") + public int unique_id() { return PS_Private.nunique_id(address()); } + /** @return the value of the {@code lenIV} field. */ + @NativeType("FT_Int") + public int lenIV() { return PS_Private.nlenIV(address()); } + /** @return the value of the {@code num_blue_values} field. */ + @NativeType("FT_Byte") + public byte num_blue_values() { return PS_Private.nnum_blue_values(address()); } + /** @return the value of the {@code num_other_blues} field. */ + @NativeType("FT_Byte") + public byte num_other_blues() { return PS_Private.nnum_other_blues(address()); } + /** @return the value of the {@code num_family_blues} field. */ + @NativeType("FT_Byte") + public byte num_family_blues() { return PS_Private.nnum_family_blues(address()); } + /** @return the value of the {@code num_family_other_blues} field. */ + @NativeType("FT_Byte") + public byte num_family_other_blues() { return PS_Private.nnum_family_other_blues(address()); } + /** @return a {@link ShortBuffer} view of the {@code blue_values} field. */ + @NativeType("FT_Short[14]") + public ShortBuffer blue_values() { return PS_Private.nblue_values(address()); } + /** @return the value at the specified index of the {@code blue_values} field. */ + @NativeType("FT_Short") + public short blue_values(int index) { return PS_Private.nblue_values(address(), index); } + /** @return a {@link ShortBuffer} view of the {@code other_blues} field. */ + @NativeType("FT_Short[10]") + public ShortBuffer other_blues() { return PS_Private.nother_blues(address()); } + /** @return the value at the specified index of the {@code other_blues} field. */ + @NativeType("FT_Short") + public short other_blues(int index) { return PS_Private.nother_blues(address(), index); } + /** @return a {@link ShortBuffer} view of the {@code family_blues} field. */ + @NativeType("FT_Short[14]") + public ShortBuffer family_blues() { return PS_Private.nfamily_blues(address()); } + /** @return the value at the specified index of the {@code family_blues} field. */ + @NativeType("FT_Short") + public short family_blues(int index) { return PS_Private.nfamily_blues(address(), index); } + /** @return a {@link ShortBuffer} view of the {@code family_other_blues} field. */ + @NativeType("FT_Short[10]") + public ShortBuffer family_other_blues() { return PS_Private.nfamily_other_blues(address()); } + /** @return the value at the specified index of the {@code family_other_blues} field. */ + @NativeType("FT_Short") + public short family_other_blues(int index) { return PS_Private.nfamily_other_blues(address(), index); } + /** @return the value of the {@code blue_scale} field. */ + @NativeType("FT_Fixed") + public long blue_scale() { return PS_Private.nblue_scale(address()); } + /** @return the value of the {@code blue_shift} field. */ + @NativeType("FT_Int") + public int blue_shift() { return PS_Private.nblue_shift(address()); } + /** @return the value of the {@code blue_fuzz} field. */ + @NativeType("FT_Int") + public int blue_fuzz() { return PS_Private.nblue_fuzz(address()); } + /** @return a {@link ShortBuffer} view of the {@code standard_width} field. */ + @NativeType("FT_UShort[1]") + public ShortBuffer standard_width() { return PS_Private.nstandard_width(address()); } + /** @return the value at the specified index of the {@code standard_width} field. */ + @NativeType("FT_UShort") + public short standard_width(int index) { return PS_Private.nstandard_width(address(), index); } + /** @return a {@link ShortBuffer} view of the {@code standard_height} field. */ + @NativeType("FT_UShort[1]") + public ShortBuffer standard_height() { return PS_Private.nstandard_height(address()); } + /** @return the value at the specified index of the {@code standard_height} field. */ + @NativeType("FT_UShort") + public short standard_height(int index) { return PS_Private.nstandard_height(address(), index); } + /** @return the value of the {@code num_snap_widths} field. */ + @NativeType("FT_Byte") + public byte num_snap_widths() { return PS_Private.nnum_snap_widths(address()); } + /** @return the value of the {@code num_snap_heights} field. */ + @NativeType("FT_Byte") + public byte num_snap_heights() { return PS_Private.nnum_snap_heights(address()); } + /** @return the value of the {@code force_bold} field. */ + @NativeType("FT_Bool") + public boolean force_bold() { return PS_Private.nforce_bold(address()); } + /** @return the value of the {@code round_stem_up} field. */ + @NativeType("FT_Bool") + public boolean round_stem_up() { return PS_Private.nround_stem_up(address()); } + /** @return a {@link ShortBuffer} view of the {@link PS_Private#snap_widths} field. */ + @NativeType("FT_Short[13]") + public ShortBuffer snap_widths() { return PS_Private.nsnap_widths(address()); } + /** @return the value at the specified index of the {@link PS_Private#snap_widths} field. */ + @NativeType("FT_Short") + public short snap_widths(int index) { return PS_Private.nsnap_widths(address(), index); } + /** @return a {@link ShortBuffer} view of the {@link PS_Private#snap_heights} field. */ + @NativeType("FT_Short[13]") + public ShortBuffer snap_heights() { return PS_Private.nsnap_heights(address()); } + /** @return the value at the specified index of the {@link PS_Private#snap_heights} field. */ + @NativeType("FT_Short") + public short snap_heights(int index) { return PS_Private.nsnap_heights(address(), index); } + /** @return the value of the {@code expansion_factor} field. */ + @NativeType("FT_Fixed") + public long expansion_factor() { return PS_Private.nexpansion_factor(address()); } + /** @return the value of the {@code language_group} field. */ + @NativeType("FT_Long") + public long language_group() { return PS_Private.nlanguage_group(address()); } + /** @return the value of the {@code password} field. */ + @NativeType("FT_Long") + public long password() { return PS_Private.npassword(address()); } + /** @return a {@link ShortBuffer} view of the {@code min_feature} field. */ + @NativeType("FT_Short[2]") + public ShortBuffer min_feature() { return PS_Private.nmin_feature(address()); } + /** @return the value at the specified index of the {@code min_feature} field. */ + @NativeType("FT_Short") + public short min_feature(int index) { return PS_Private.nmin_feature(address(), index); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Free_Func.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Free_Func.java new file mode 100644 index 000000000..b94c78aab --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Free_Func.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Pointer *data_pointer
    + * )
    + */ +public abstract class SVG_Lib_Free_Func extends Callback implements SVG_Lib_Free_FuncI { + + /** + * Creates a {@code SVG_Lib_Free_Func} instance from the specified function pointer. + * + * @return the new {@code SVG_Lib_Free_Func} + */ + public static SVG_Lib_Free_Func create(long functionPointer) { + SVG_Lib_Free_FuncI instance = Callback.get(functionPointer); + return instance instanceof SVG_Lib_Free_Func + ? (SVG_Lib_Free_Func)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static SVG_Lib_Free_Func createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code SVG_Lib_Free_Func} instance that delegates to the specified {@code SVG_Lib_Free_FuncI} instance. */ + public static SVG_Lib_Free_Func create(SVG_Lib_Free_FuncI instance) { + return instance instanceof SVG_Lib_Free_Func + ? (SVG_Lib_Free_Func)instance + : new Container(instance.address(), instance); + } + + protected SVG_Lib_Free_Func() { + super(CIF); + } + + SVG_Lib_Free_Func(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends SVG_Lib_Free_Func { + + private final SVG_Lib_Free_FuncI delegate; + + Container(long functionPointer, SVG_Lib_Free_FuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public void invoke(long data_pointer) { + delegate.invoke(data_pointer); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Free_FuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Free_FuncI.java new file mode 100644 index 000000000..5af5b89cd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Free_FuncI.java @@ -0,0 +1,46 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * void (*{@link #invoke}) (
    + *     FT_Pointer *data_pointer
    + * )
    + */ +@FunctionalInterface +@NativeType("SVG_Lib_Free_Func") +public interface SVG_Lib_Free_FuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_void, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + invoke( + memGetAddress(memGetAddress(args)) + ); + } + + /** A callback that is called when the {@code ot-svg} module is being freed. */ + void invoke(@NativeType("FT_Pointer *") long data_pointer); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Init_Func.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Init_Func.java new file mode 100644 index 000000000..8a040daaa --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Init_Func.java @@ -0,0 +1,73 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_Pointer *data_pointer
    + * )
    + */ +public abstract class SVG_Lib_Init_Func extends Callback implements SVG_Lib_Init_FuncI { + + /** + * Creates a {@code SVG_Lib_Init_Func} instance from the specified function pointer. + * + * @return the new {@code SVG_Lib_Init_Func} + */ + public static SVG_Lib_Init_Func create(long functionPointer) { + SVG_Lib_Init_FuncI instance = Callback.get(functionPointer); + return instance instanceof SVG_Lib_Init_Func + ? (SVG_Lib_Init_Func)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static SVG_Lib_Init_Func createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code SVG_Lib_Init_Func} instance that delegates to the specified {@code SVG_Lib_Init_FuncI} instance. */ + public static SVG_Lib_Init_Func create(SVG_Lib_Init_FuncI instance) { + return instance instanceof SVG_Lib_Init_Func + ? (SVG_Lib_Init_Func)instance + : new Container(instance.address(), instance); + } + + protected SVG_Lib_Init_Func() { + super(CIF); + } + + SVG_Lib_Init_Func(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends SVG_Lib_Init_Func { + + private final SVG_Lib_Init_FuncI delegate; + + Container(long functionPointer, SVG_Lib_Init_FuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long data_pointer) { + return delegate.invoke(data_pointer); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Init_FuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Init_FuncI.java new file mode 100644 index 000000000..781711755 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Init_FuncI.java @@ -0,0 +1,47 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_Pointer *data_pointer
    + * )
    + */ +@FunctionalInterface +@NativeType("SVG_Lib_Init_Func") +public interface SVG_Lib_Init_FuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)) + ); + apiClosureRet(ret, __result); + } + + /** A callback that is called when the first OT-SVG glyph is rendered in the lifetime of an {@code FT_Library} object. */ + @NativeType("FT_Error") int invoke(@NativeType("FT_Pointer *") long data_pointer); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Preset_Slot_Func.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Preset_Slot_Func.java new file mode 100644 index 000000000..fff90782e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Preset_Slot_Func.java @@ -0,0 +1,75 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_GlyphSlot slot,
    + *     FT_Bool cache,
    + *     FT_Pointer *state
    + * )
    + */ +public abstract class SVG_Lib_Preset_Slot_Func extends Callback implements SVG_Lib_Preset_Slot_FuncI { + + /** + * Creates a {@code SVG_Lib_Preset_Slot_Func} instance from the specified function pointer. + * + * @return the new {@code SVG_Lib_Preset_Slot_Func} + */ + public static SVG_Lib_Preset_Slot_Func create(long functionPointer) { + SVG_Lib_Preset_Slot_FuncI instance = Callback.get(functionPointer); + return instance instanceof SVG_Lib_Preset_Slot_Func + ? (SVG_Lib_Preset_Slot_Func)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static SVG_Lib_Preset_Slot_Func createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code SVG_Lib_Preset_Slot_Func} instance that delegates to the specified {@code SVG_Lib_Preset_Slot_FuncI} instance. */ + public static SVG_Lib_Preset_Slot_Func create(SVG_Lib_Preset_Slot_FuncI instance) { + return instance instanceof SVG_Lib_Preset_Slot_Func + ? (SVG_Lib_Preset_Slot_Func)instance + : new Container(instance.address(), instance); + } + + protected SVG_Lib_Preset_Slot_Func() { + super(CIF); + } + + SVG_Lib_Preset_Slot_Func(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends SVG_Lib_Preset_Slot_Func { + + private final SVG_Lib_Preset_Slot_FuncI delegate; + + Container(long functionPointer, SVG_Lib_Preset_Slot_FuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long slot, boolean cache, long state) { + return delegate.invoke(slot, cache, state); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Preset_Slot_FuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Preset_Slot_FuncI.java new file mode 100644 index 000000000..2a49a415c --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Preset_Slot_FuncI.java @@ -0,0 +1,51 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_GlyphSlot slot,
    + *     FT_Bool cache,
    + *     FT_Pointer *state
    + * )
    + */ +@FunctionalInterface +@NativeType("SVG_Lib_Preset_Slot_Func") +public interface SVG_Lib_Preset_Slot_FuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_uint8, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetByte(memGetAddress(args + POINTER_SIZE)) != 0, + memGetAddress(memGetAddress(args + 2 * POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** A callback that is called to preset the glyph slot. */ + @NativeType("FT_Error") int invoke(@NativeType("FT_GlyphSlot") long slot, @NativeType("FT_Bool") boolean cache, @NativeType("FT_Pointer *") long state); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Render_Func.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Render_Func.java new file mode 100644 index 000000000..88c7553c7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Render_Func.java @@ -0,0 +1,74 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_GlyphSlot slot,
    + *     FT_Pointer *data_pointer
    + * )
    + */ +public abstract class SVG_Lib_Render_Func extends Callback implements SVG_Lib_Render_FuncI { + + /** + * Creates a {@code SVG_Lib_Render_Func} instance from the specified function pointer. + * + * @return the new {@code SVG_Lib_Render_Func} + */ + public static SVG_Lib_Render_Func create(long functionPointer) { + SVG_Lib_Render_FuncI instance = Callback.get(functionPointer); + return instance instanceof SVG_Lib_Render_Func + ? (SVG_Lib_Render_Func)instance + : new Container(functionPointer, instance); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code functionPointer} is {@code NULL}. */ + @Nullable + public static SVG_Lib_Render_Func createSafe(long functionPointer) { + return functionPointer == NULL ? null : create(functionPointer); + } + + /** Creates a {@code SVG_Lib_Render_Func} instance that delegates to the specified {@code SVG_Lib_Render_FuncI} instance. */ + public static SVG_Lib_Render_Func create(SVG_Lib_Render_FuncI instance) { + return instance instanceof SVG_Lib_Render_Func + ? (SVG_Lib_Render_Func)instance + : new Container(instance.address(), instance); + } + + protected SVG_Lib_Render_Func() { + super(CIF); + } + + SVG_Lib_Render_Func(long functionPointer) { + super(functionPointer); + } + + private static final class Container extends SVG_Lib_Render_Func { + + private final SVG_Lib_Render_FuncI delegate; + + Container(long functionPointer, SVG_Lib_Render_FuncI delegate) { + super(functionPointer); + this.delegate = delegate; + } + + @Override + public int invoke(long slot, long data_pointer) { + return delegate.invoke(slot, data_pointer); + } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Render_FuncI.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Render_FuncI.java new file mode 100644 index 000000000..5496cb21d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_Lib_Render_FuncI.java @@ -0,0 +1,49 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import org.lwjgl.system.*; +import org.lwjgl.system.libffi.*; + +import static org.lwjgl.system.APIUtil.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.libffi.LibFFI.*; + +/** + *

    Type

    + * + *
    
    + * FT_Error (*{@link #invoke}) (
    + *     FT_GlyphSlot slot,
    + *     FT_Pointer *data_pointer
    + * )
    + */ +@FunctionalInterface +@NativeType("SVG_Lib_Render_Func") +public interface SVG_Lib_Render_FuncI extends CallbackI { + + FFICIF CIF = apiCreateCIF( + FFI_DEFAULT_ABI, + ffi_type_sint32, + ffi_type_pointer, ffi_type_pointer + ); + + @Override + default FFICIF getCallInterface() { return CIF; } + + @Override + default void callback(long ret, long args) { + int __result = invoke( + memGetAddress(memGetAddress(args)), + memGetAddress(memGetAddress(args + POINTER_SIZE)) + ); + apiClosureRet(ret, __result); + } + + /** A callback that is called to render an OT-SVG glyph. */ + @NativeType("FT_Error") int invoke(@NativeType("FT_GlyphSlot") long slot, @NativeType("FT_Pointer *") long data_pointer); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_RendererHooks.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_RendererHooks.java new file mode 100644 index 000000000..57109058a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/SVG_RendererHooks.java @@ -0,0 +1,332 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.MemoryStack.*; + +/** + * A structure that stores the four hooks needed to render OT-SVG glyphs properly. + * + *

    Layout

    + * + *
    
    + * struct SVG_RendererHooks {
    + *     {@link SVG_Lib_Init_FuncI SVG_Lib_Init_Func} init_svg;
    + *     {@link SVG_Lib_Free_FuncI SVG_Lib_Free_Func} free_svg;
    + *     {@link SVG_Lib_Render_FuncI SVG_Lib_Render_Func} render_svg;
    + *     {@link SVG_Lib_Preset_Slot_FuncI SVG_Lib_Preset_Slot_Func} preset_slot;
    + * }
    + */ +public class SVG_RendererHooks extends Struct implements NativeResource { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + INIT_SVG, + FREE_SVG, + RENDER_SVG, + PRESET_SLOT; + + static { + Layout layout = __struct( + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + INIT_SVG = layout.offsetof(0); + FREE_SVG = layout.offsetof(1); + RENDER_SVG = layout.offsetof(2); + PRESET_SLOT = layout.offsetof(3); + } + + protected SVG_RendererHooks(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected SVG_RendererHooks create(long address, @Nullable ByteBuffer container) { + return new SVG_RendererHooks(address, container); + } + + /** + * Creates a {@code SVG_RendererHooks} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public SVG_RendererHooks(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code init_svg} field. */ + public SVG_Lib_Init_Func init_svg() { return ninit_svg(address()); } + /** @return the value of the {@code free_svg} field. */ + public SVG_Lib_Free_Func free_svg() { return nfree_svg(address()); } + /** @return the value of the {@code render_svg} field. */ + public SVG_Lib_Render_Func render_svg() { return nrender_svg(address()); } + /** @return the value of the {@code preset_slot} field. */ + public SVG_Lib_Preset_Slot_Func preset_slot() { return npreset_slot(address()); } + + /** Sets the specified value to the {@code init_svg} field. */ + public SVG_RendererHooks init_svg(@NativeType("SVG_Lib_Init_Func") SVG_Lib_Init_FuncI value) { ninit_svg(address(), value); return this; } + /** Sets the specified value to the {@code free_svg} field. */ + public SVG_RendererHooks free_svg(@NativeType("SVG_Lib_Free_Func") SVG_Lib_Free_FuncI value) { nfree_svg(address(), value); return this; } + /** Sets the specified value to the {@code render_svg} field. */ + public SVG_RendererHooks render_svg(@NativeType("SVG_Lib_Render_Func") SVG_Lib_Render_FuncI value) { nrender_svg(address(), value); return this; } + /** Sets the specified value to the {@code preset_slot} field. */ + public SVG_RendererHooks preset_slot(@NativeType("SVG_Lib_Preset_Slot_Func") SVG_Lib_Preset_Slot_FuncI value) { npreset_slot(address(), value); return this; } + + /** Initializes this struct with the specified values. */ + public SVG_RendererHooks set( + SVG_Lib_Init_FuncI init_svg, + SVG_Lib_Free_FuncI free_svg, + SVG_Lib_Render_FuncI render_svg, + SVG_Lib_Preset_Slot_FuncI preset_slot + ) { + init_svg(init_svg); + free_svg(free_svg); + render_svg(render_svg); + preset_slot(preset_slot); + + return this; + } + + /** + * Copies the specified struct data to this struct. + * + * @param src the source struct + * + * @return this struct + */ + public SVG_RendererHooks set(SVG_RendererHooks src) { + memCopy(src.address(), address(), SIZEOF); + return this; + } + + // ----------------------------------- + + /** Returns a new {@code SVG_RendererHooks} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. */ + public static SVG_RendererHooks malloc() { + return new SVG_RendererHooks(nmemAllocChecked(SIZEOF), null); + } + + /** Returns a new {@code SVG_RendererHooks} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. */ + public static SVG_RendererHooks calloc() { + return new SVG_RendererHooks(nmemCallocChecked(1, SIZEOF), null); + } + + /** Returns a new {@code SVG_RendererHooks} instance allocated with {@link BufferUtils}. */ + public static SVG_RendererHooks create() { + ByteBuffer container = BufferUtils.createByteBuffer(SIZEOF); + return new SVG_RendererHooks(memAddress(container), container); + } + + /** Returns a new {@code SVG_RendererHooks} instance for the specified memory address. */ + public static SVG_RendererHooks create(long address) { + return new SVG_RendererHooks(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static SVG_RendererHooks createSafe(long address) { + return address == NULL ? null : new SVG_RendererHooks(address, null); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memAlloc memAlloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity) { + return new Buffer(nmemAllocChecked(__checkMalloc(capacity, SIZEOF)), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link MemoryUtil#memCalloc memCalloc}. The instance must be explicitly freed. + * + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity) { + return new Buffer(nmemCallocChecked(capacity, SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated with {@link BufferUtils}. + * + * @param capacity the buffer capacity + */ + public static Buffer create(int capacity) { + ByteBuffer container = __create(capacity, SIZEOF); + return new Buffer(memAddress(container), container, -1, 0, capacity, capacity); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + /** + * Returns a new {@code SVG_RendererHooks} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + */ + public static SVG_RendererHooks malloc(MemoryStack stack) { + return new SVG_RendererHooks(stack.nmalloc(ALIGNOF, SIZEOF), null); + } + + /** + * Returns a new {@code SVG_RendererHooks} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + */ + public static SVG_RendererHooks calloc(MemoryStack stack) { + return new SVG_RendererHooks(stack.ncalloc(ALIGNOF, 1, SIZEOF), null); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack}. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer malloc(int capacity, MemoryStack stack) { + return new Buffer(stack.nmalloc(ALIGNOF, capacity * SIZEOF), capacity); + } + + /** + * Returns a new {@link Buffer} instance allocated on the specified {@link MemoryStack} and initializes all its bits to zero. + * + * @param stack the stack from which to allocate + * @param capacity the buffer capacity + */ + public static Buffer calloc(int capacity, MemoryStack stack) { + return new Buffer(stack.ncalloc(ALIGNOF, capacity, SIZEOF), capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #init_svg}. */ + public static SVG_Lib_Init_Func ninit_svg(long struct) { return SVG_Lib_Init_Func.create(memGetAddress(struct + SVG_RendererHooks.INIT_SVG)); } + /** Unsafe version of {@link #free_svg}. */ + public static SVG_Lib_Free_Func nfree_svg(long struct) { return SVG_Lib_Free_Func.create(memGetAddress(struct + SVG_RendererHooks.FREE_SVG)); } + /** Unsafe version of {@link #render_svg}. */ + public static SVG_Lib_Render_Func nrender_svg(long struct) { return SVG_Lib_Render_Func.create(memGetAddress(struct + SVG_RendererHooks.RENDER_SVG)); } + /** Unsafe version of {@link #preset_slot}. */ + public static SVG_Lib_Preset_Slot_Func npreset_slot(long struct) { return SVG_Lib_Preset_Slot_Func.create(memGetAddress(struct + SVG_RendererHooks.PRESET_SLOT)); } + + /** Unsafe version of {@link #init_svg(SVG_Lib_Init_FuncI) init_svg}. */ + public static void ninit_svg(long struct, SVG_Lib_Init_FuncI value) { memPutAddress(struct + SVG_RendererHooks.INIT_SVG, value.address()); } + /** Unsafe version of {@link #free_svg(SVG_Lib_Free_FuncI) free_svg}. */ + public static void nfree_svg(long struct, SVG_Lib_Free_FuncI value) { memPutAddress(struct + SVG_RendererHooks.FREE_SVG, value.address()); } + /** Unsafe version of {@link #render_svg(SVG_Lib_Render_FuncI) render_svg}. */ + public static void nrender_svg(long struct, SVG_Lib_Render_FuncI value) { memPutAddress(struct + SVG_RendererHooks.RENDER_SVG, value.address()); } + /** Unsafe version of {@link #preset_slot(SVG_Lib_Preset_Slot_FuncI) preset_slot}. */ + public static void npreset_slot(long struct, SVG_Lib_Preset_Slot_FuncI value) { memPutAddress(struct + SVG_RendererHooks.PRESET_SLOT, value.address()); } + + /** + * Validates pointer members that should not be {@code NULL}. + * + * @param struct the struct to validate + */ + public static void validate(long struct) { + check(memGetAddress(struct + SVG_RendererHooks.INIT_SVG)); + check(memGetAddress(struct + SVG_RendererHooks.FREE_SVG)); + check(memGetAddress(struct + SVG_RendererHooks.RENDER_SVG)); + check(memGetAddress(struct + SVG_RendererHooks.PRESET_SLOT)); + } + + // ----------------------------------- + + /** An array of {@link SVG_RendererHooks} structs. */ + public static class Buffer extends StructBuffer implements NativeResource { + + private static final SVG_RendererHooks ELEMENT_FACTORY = SVG_RendererHooks.create(-1L); + + /** + * Creates a new {@code SVG_RendererHooks.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link SVG_RendererHooks#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected SVG_RendererHooks getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code init_svg} field. */ + public SVG_Lib_Init_Func init_svg() { return SVG_RendererHooks.ninit_svg(address()); } + /** @return the value of the {@code free_svg} field. */ + public SVG_Lib_Free_Func free_svg() { return SVG_RendererHooks.nfree_svg(address()); } + /** @return the value of the {@code render_svg} field. */ + public SVG_Lib_Render_Func render_svg() { return SVG_RendererHooks.nrender_svg(address()); } + /** @return the value of the {@code preset_slot} field. */ + public SVG_Lib_Preset_Slot_Func preset_slot() { return SVG_RendererHooks.npreset_slot(address()); } + + /** Sets the specified value to the {@code init_svg} field. */ + public Buffer init_svg(@NativeType("SVG_Lib_Init_Func") SVG_Lib_Init_FuncI value) { SVG_RendererHooks.ninit_svg(address(), value); return this; } + /** Sets the specified value to the {@code free_svg} field. */ + public Buffer free_svg(@NativeType("SVG_Lib_Free_Func") SVG_Lib_Free_FuncI value) { SVG_RendererHooks.nfree_svg(address(), value); return this; } + /** Sets the specified value to the {@code render_svg} field. */ + public Buffer render_svg(@NativeType("SVG_Lib_Render_Func") SVG_Lib_Render_FuncI value) { SVG_RendererHooks.nrender_svg(address(), value); return this; } + /** Sets the specified value to the {@code preset_slot} field. */ + public Buffer preset_slot(@NativeType("SVG_Lib_Preset_Slot_Func") SVG_Lib_Preset_Slot_FuncI value) { SVG_RendererHooks.npreset_slot(address(), value); return this; } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_Header.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_Header.java new file mode 100644 index 000000000..733eb1aad --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_Header.java @@ -0,0 +1,367 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure to model a TrueType font header table. + * + *

    Layout

    + * + *
    
    + * struct TT_Header {
    + *     FT_Fixed Table_Version;
    + *     FT_Fixed Font_Revision;
    + *     FT_Long CheckSum_Adjust;
    + *     FT_Long Magic_Number;
    + *     FT_UShort Flags;
    + *     FT_UShort Units_Per_EM;
    + *     FT_ULong Created[2];
    + *     FT_ULong Modified[2];
    + *     FT_Short xMin;
    + *     FT_Short yMin;
    + *     FT_Short xMax;
    + *     FT_Short yMax;
    + *     FT_UShort Mac_Style;
    + *     FT_UShort Lowest_Rec_PPEM;
    + *     FT_Short Font_Direction;
    + *     FT_Short Index_To_Loc_Format;
    + *     FT_Short Glyph_Data_Format;
    + * }
    + */ +public class TT_Header extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + TABLE_VERSION, + FONT_REVISION, + CHECKSUM_ADJUST, + MAGIC_NUMBER, + FLAGS, + UNITS_PER_EM, + CREATED, + MODIFIED, + XMIN, + YMIN, + XMAX, + YMAX, + MAC_STYLE, + LOWEST_REC_PPEM, + FONT_DIRECTION, + INDEX_TO_LOC_FORMAT, + GLYPH_DATA_FORMAT; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(2), + __member(2), + __array(CLONG_SIZE, 2), + __array(CLONG_SIZE, 2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + TABLE_VERSION = layout.offsetof(0); + FONT_REVISION = layout.offsetof(1); + CHECKSUM_ADJUST = layout.offsetof(2); + MAGIC_NUMBER = layout.offsetof(3); + FLAGS = layout.offsetof(4); + UNITS_PER_EM = layout.offsetof(5); + CREATED = layout.offsetof(6); + MODIFIED = layout.offsetof(7); + XMIN = layout.offsetof(8); + YMIN = layout.offsetof(9); + XMAX = layout.offsetof(10); + YMAX = layout.offsetof(11); + MAC_STYLE = layout.offsetof(12); + LOWEST_REC_PPEM = layout.offsetof(13); + FONT_DIRECTION = layout.offsetof(14); + INDEX_TO_LOC_FORMAT = layout.offsetof(15); + GLYPH_DATA_FORMAT = layout.offsetof(16); + } + + protected TT_Header(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected TT_Header create(long address, @Nullable ByteBuffer container) { + return new TT_Header(address, container); + } + + /** + * Creates a {@code TT_Header} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public TT_Header(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code Table_Version} field. */ + @NativeType("FT_Fixed") + public long Table_Version() { return nTable_Version(address()); } + /** @return the value of the {@code Font_Revision} field. */ + @NativeType("FT_Fixed") + public long Font_Revision() { return nFont_Revision(address()); } + /** @return the value of the {@code CheckSum_Adjust} field. */ + @NativeType("FT_Long") + public long CheckSum_Adjust() { return nCheckSum_Adjust(address()); } + /** @return the value of the {@code Magic_Number} field. */ + @NativeType("FT_Long") + public long Magic_Number() { return nMagic_Number(address()); } + /** @return the value of the {@code Flags} field. */ + @NativeType("FT_UShort") + public short Flags() { return nFlags(address()); } + /** @return the value of the {@code Units_Per_EM} field. */ + @NativeType("FT_UShort") + public short Units_Per_EM() { return nUnits_Per_EM(address()); } + /** @return a {@link CLongBuffer} view of the {@code Created} field. */ + @NativeType("FT_ULong[2]") + public CLongBuffer Created() { return nCreated(address()); } + /** @return the value at the specified index of the {@code Created} field. */ + @NativeType("FT_ULong") + public long Created(int index) { return nCreated(address(), index); } + /** @return a {@link CLongBuffer} view of the {@code Modified} field. */ + @NativeType("FT_ULong[2]") + public CLongBuffer Modified() { return nModified(address()); } + /** @return the value at the specified index of the {@code Modified} field. */ + @NativeType("FT_ULong") + public long Modified(int index) { return nModified(address(), index); } + /** @return the value of the {@code xMin} field. */ + @NativeType("FT_Short") + public short xMin() { return nxMin(address()); } + /** @return the value of the {@code yMin} field. */ + @NativeType("FT_Short") + public short yMin() { return nyMin(address()); } + /** @return the value of the {@code xMax} field. */ + @NativeType("FT_Short") + public short xMax() { return nxMax(address()); } + /** @return the value of the {@code yMax} field. */ + @NativeType("FT_Short") + public short yMax() { return nyMax(address()); } + /** @return the value of the {@code Mac_Style} field. */ + @NativeType("FT_UShort") + public short Mac_Style() { return nMac_Style(address()); } + /** @return the value of the {@code Lowest_Rec_PPEM} field. */ + @NativeType("FT_UShort") + public short Lowest_Rec_PPEM() { return nLowest_Rec_PPEM(address()); } + /** @return the value of the {@code Font_Direction} field. */ + @NativeType("FT_Short") + public short Font_Direction() { return nFont_Direction(address()); } + /** @return the value of the {@code Index_To_Loc_Format} field. */ + @NativeType("FT_Short") + public short Index_To_Loc_Format() { return nIndex_To_Loc_Format(address()); } + /** @return the value of the {@code Glyph_Data_Format} field. */ + @NativeType("FT_Short") + public short Glyph_Data_Format() { return nGlyph_Data_Format(address()); } + + // ----------------------------------- + + /** Returns a new {@code TT_Header} instance for the specified memory address. */ + public static TT_Header create(long address) { + return new TT_Header(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static TT_Header createSafe(long address) { + return address == NULL ? null : new TT_Header(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #Table_Version}. */ + public static long nTable_Version(long struct) { return memGetCLong(struct + TT_Header.TABLE_VERSION); } + /** Unsafe version of {@link #Font_Revision}. */ + public static long nFont_Revision(long struct) { return memGetCLong(struct + TT_Header.FONT_REVISION); } + /** Unsafe version of {@link #CheckSum_Adjust}. */ + public static long nCheckSum_Adjust(long struct) { return memGetCLong(struct + TT_Header.CHECKSUM_ADJUST); } + /** Unsafe version of {@link #Magic_Number}. */ + public static long nMagic_Number(long struct) { return memGetCLong(struct + TT_Header.MAGIC_NUMBER); } + /** Unsafe version of {@link #Flags}. */ + public static short nFlags(long struct) { return UNSAFE.getShort(null, struct + TT_Header.FLAGS); } + /** Unsafe version of {@link #Units_Per_EM}. */ + public static short nUnits_Per_EM(long struct) { return UNSAFE.getShort(null, struct + TT_Header.UNITS_PER_EM); } + /** Unsafe version of {@link #Created}. */ + public static CLongBuffer nCreated(long struct) { return memCLongBuffer(struct + TT_Header.CREATED, 2); } + /** Unsafe version of {@link #Created(int) Created}. */ + public static long nCreated(long struct, int index) { + return memGetCLong(struct + TT_Header.CREATED + check(index, 2) * CLONG_SIZE); + } + /** Unsafe version of {@link #Modified}. */ + public static CLongBuffer nModified(long struct) { return memCLongBuffer(struct + TT_Header.MODIFIED, 2); } + /** Unsafe version of {@link #Modified(int) Modified}. */ + public static long nModified(long struct, int index) { + return memGetCLong(struct + TT_Header.MODIFIED + check(index, 2) * CLONG_SIZE); + } + /** Unsafe version of {@link #xMin}. */ + public static short nxMin(long struct) { return UNSAFE.getShort(null, struct + TT_Header.XMIN); } + /** Unsafe version of {@link #yMin}. */ + public static short nyMin(long struct) { return UNSAFE.getShort(null, struct + TT_Header.YMIN); } + /** Unsafe version of {@link #xMax}. */ + public static short nxMax(long struct) { return UNSAFE.getShort(null, struct + TT_Header.XMAX); } + /** Unsafe version of {@link #yMax}. */ + public static short nyMax(long struct) { return UNSAFE.getShort(null, struct + TT_Header.YMAX); } + /** Unsafe version of {@link #Mac_Style}. */ + public static short nMac_Style(long struct) { return UNSAFE.getShort(null, struct + TT_Header.MAC_STYLE); } + /** Unsafe version of {@link #Lowest_Rec_PPEM}. */ + public static short nLowest_Rec_PPEM(long struct) { return UNSAFE.getShort(null, struct + TT_Header.LOWEST_REC_PPEM); } + /** Unsafe version of {@link #Font_Direction}. */ + public static short nFont_Direction(long struct) { return UNSAFE.getShort(null, struct + TT_Header.FONT_DIRECTION); } + /** Unsafe version of {@link #Index_To_Loc_Format}. */ + public static short nIndex_To_Loc_Format(long struct) { return UNSAFE.getShort(null, struct + TT_Header.INDEX_TO_LOC_FORMAT); } + /** Unsafe version of {@link #Glyph_Data_Format}. */ + public static short nGlyph_Data_Format(long struct) { return UNSAFE.getShort(null, struct + TT_Header.GLYPH_DATA_FORMAT); } + + // ----------------------------------- + + /** An array of {@link TT_Header} structs. */ + public static class Buffer extends StructBuffer { + + private static final TT_Header ELEMENT_FACTORY = TT_Header.create(-1L); + + /** + * Creates a new {@code TT_Header.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link TT_Header#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected TT_Header getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code Table_Version} field. */ + @NativeType("FT_Fixed") + public long Table_Version() { return TT_Header.nTable_Version(address()); } + /** @return the value of the {@code Font_Revision} field. */ + @NativeType("FT_Fixed") + public long Font_Revision() { return TT_Header.nFont_Revision(address()); } + /** @return the value of the {@code CheckSum_Adjust} field. */ + @NativeType("FT_Long") + public long CheckSum_Adjust() { return TT_Header.nCheckSum_Adjust(address()); } + /** @return the value of the {@code Magic_Number} field. */ + @NativeType("FT_Long") + public long Magic_Number() { return TT_Header.nMagic_Number(address()); } + /** @return the value of the {@code Flags} field. */ + @NativeType("FT_UShort") + public short Flags() { return TT_Header.nFlags(address()); } + /** @return the value of the {@code Units_Per_EM} field. */ + @NativeType("FT_UShort") + public short Units_Per_EM() { return TT_Header.nUnits_Per_EM(address()); } + /** @return a {@link CLongBuffer} view of the {@code Created} field. */ + @NativeType("FT_ULong[2]") + public CLongBuffer Created() { return TT_Header.nCreated(address()); } + /** @return the value at the specified index of the {@code Created} field. */ + @NativeType("FT_ULong") + public long Created(int index) { return TT_Header.nCreated(address(), index); } + /** @return a {@link CLongBuffer} view of the {@code Modified} field. */ + @NativeType("FT_ULong[2]") + public CLongBuffer Modified() { return TT_Header.nModified(address()); } + /** @return the value at the specified index of the {@code Modified} field. */ + @NativeType("FT_ULong") + public long Modified(int index) { return TT_Header.nModified(address(), index); } + /** @return the value of the {@code xMin} field. */ + @NativeType("FT_Short") + public short xMin() { return TT_Header.nxMin(address()); } + /** @return the value of the {@code yMin} field. */ + @NativeType("FT_Short") + public short yMin() { return TT_Header.nyMin(address()); } + /** @return the value of the {@code xMax} field. */ + @NativeType("FT_Short") + public short xMax() { return TT_Header.nxMax(address()); } + /** @return the value of the {@code yMax} field. */ + @NativeType("FT_Short") + public short yMax() { return TT_Header.nyMax(address()); } + /** @return the value of the {@code Mac_Style} field. */ + @NativeType("FT_UShort") + public short Mac_Style() { return TT_Header.nMac_Style(address()); } + /** @return the value of the {@code Lowest_Rec_PPEM} field. */ + @NativeType("FT_UShort") + public short Lowest_Rec_PPEM() { return TT_Header.nLowest_Rec_PPEM(address()); } + /** @return the value of the {@code Font_Direction} field. */ + @NativeType("FT_Short") + public short Font_Direction() { return TT_Header.nFont_Direction(address()); } + /** @return the value of the {@code Index_To_Loc_Format} field. */ + @NativeType("FT_Short") + public short Index_To_Loc_Format() { return TT_Header.nIndex_To_Loc_Format(address()); } + /** @return the value of the {@code Glyph_Data_Format} field. */ + @NativeType("FT_Short") + public short Glyph_Data_Format() { return TT_Header.nGlyph_Data_Format(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_HoriHeader.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_HoriHeader.java new file mode 100644 index 000000000..4cd20af4d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_HoriHeader.java @@ -0,0 +1,364 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure to model a TrueType horizontal header, the {@code hhea} table, as well as the corresponding horizontal metrics table, {@code hmtx}. + * + *

    Layout

    + * + *
    
    + * struct TT_HoriHeader {
    + *     FT_Fixed Version;
    + *     FT_Short Ascender;
    + *     FT_Short Descender;
    + *     FT_Short Line_Gap;
    + *     FT_UShort {@link #advance_Width_Max};
    + *     FT_Short {@link #min_Left_Side_Bearing};
    + *     FT_Short {@link #min_Right_Side_Bearing};
    + *     FT_Short {@link #xMax_Extent};
    + *     FT_Short caret_Slope_Rise;
    + *     FT_Short caret_Slope_Run;
    + *     FT_Short caret_Offset;
    + *     FT_Short Reserved[4];
    + *     FT_Short metric_Data_Format;
    + *     FT_UShort number_Of_HMetrics;
    + *     void * long_metrics;
    + *     void * short_metrics;
    + * }
    + */ +public class TT_HoriHeader extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + VERSION, + ASCENDER, + DESCENDER, + LINE_GAP, + ADVANCE_WIDTH_MAX, + MIN_LEFT_SIDE_BEARING, + MIN_RIGHT_SIDE_BEARING, + XMAX_EXTENT, + CARET_SLOPE_RISE, + CARET_SLOPE_RUN, + CARET_OFFSET, + RESERVED, + METRIC_DATA_FORMAT, + NUMBER_OF_HMETRICS, + LONG_METRICS, + SHORT_METRICS; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __array(2, 4), + __member(2), + __member(2), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + VERSION = layout.offsetof(0); + ASCENDER = layout.offsetof(1); + DESCENDER = layout.offsetof(2); + LINE_GAP = layout.offsetof(3); + ADVANCE_WIDTH_MAX = layout.offsetof(4); + MIN_LEFT_SIDE_BEARING = layout.offsetof(5); + MIN_RIGHT_SIDE_BEARING = layout.offsetof(6); + XMAX_EXTENT = layout.offsetof(7); + CARET_SLOPE_RISE = layout.offsetof(8); + CARET_SLOPE_RUN = layout.offsetof(9); + CARET_OFFSET = layout.offsetof(10); + RESERVED = layout.offsetof(11); + METRIC_DATA_FORMAT = layout.offsetof(12); + NUMBER_OF_HMETRICS = layout.offsetof(13); + LONG_METRICS = layout.offsetof(14); + SHORT_METRICS = layout.offsetof(15); + } + + protected TT_HoriHeader(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected TT_HoriHeader create(long address, @Nullable ByteBuffer container) { + return new TT_HoriHeader(address, container); + } + + /** + * Creates a {@code TT_HoriHeader} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public TT_HoriHeader(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code Version} field. */ + @NativeType("FT_Fixed") + public long Version() { return nVersion(address()); } + /** @return the value of the {@code Ascender} field. */ + @NativeType("FT_Short") + public short Ascender() { return nAscender(address()); } + /** @return the value of the {@code Descender} field. */ + @NativeType("FT_Short") + public short Descender() { return nDescender(address()); } + /** @return the value of the {@code Line_Gap} field. */ + @NativeType("FT_Short") + public short Line_Gap() { return nLine_Gap(address()); } + /** advance width maximum */ + @NativeType("FT_UShort") + public short advance_Width_Max() { return nadvance_Width_Max(address()); } + /** minimum left-sb */ + @NativeType("FT_Short") + public short min_Left_Side_Bearing() { return nmin_Left_Side_Bearing(address()); } + /** minimum right-sb */ + @NativeType("FT_Short") + public short min_Right_Side_Bearing() { return nmin_Right_Side_Bearing(address()); } + /** xmax extents */ + @NativeType("FT_Short") + public short xMax_Extent() { return nxMax_Extent(address()); } + /** @return the value of the {@code caret_Slope_Rise} field. */ + @NativeType("FT_Short") + public short caret_Slope_Rise() { return ncaret_Slope_Rise(address()); } + /** @return the value of the {@code caret_Slope_Run} field. */ + @NativeType("FT_Short") + public short caret_Slope_Run() { return ncaret_Slope_Run(address()); } + /** @return the value of the {@code caret_Offset} field. */ + @NativeType("FT_Short") + public short caret_Offset() { return ncaret_Offset(address()); } + /** @return a {@link ShortBuffer} view of the {@code Reserved} field. */ + @NativeType("FT_Short[4]") + public ShortBuffer Reserved() { return nReserved(address()); } + /** @return the value at the specified index of the {@code Reserved} field. */ + @NativeType("FT_Short") + public short Reserved(int index) { return nReserved(address(), index); } + /** @return the value of the {@code metric_Data_Format} field. */ + @NativeType("FT_Short") + public short metric_Data_Format() { return nmetric_Data_Format(address()); } + /** @return the value of the {@code number_Of_HMetrics} field. */ + @NativeType("FT_UShort") + public short number_Of_HMetrics() { return nnumber_Of_HMetrics(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code long_metrics} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void *") + public ByteBuffer long_metrics(int capacity) { return nlong_metrics(address(), capacity); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code short_metrics} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void *") + public ByteBuffer short_metrics(int capacity) { return nshort_metrics(address(), capacity); } + + // ----------------------------------- + + /** Returns a new {@code TT_HoriHeader} instance for the specified memory address. */ + public static TT_HoriHeader create(long address) { + return new TT_HoriHeader(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static TT_HoriHeader createSafe(long address) { + return address == NULL ? null : new TT_HoriHeader(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #Version}. */ + public static long nVersion(long struct) { return memGetCLong(struct + TT_HoriHeader.VERSION); } + /** Unsafe version of {@link #Ascender}. */ + public static short nAscender(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.ASCENDER); } + /** Unsafe version of {@link #Descender}. */ + public static short nDescender(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.DESCENDER); } + /** Unsafe version of {@link #Line_Gap}. */ + public static short nLine_Gap(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.LINE_GAP); } + /** Unsafe version of {@link #advance_Width_Max}. */ + public static short nadvance_Width_Max(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.ADVANCE_WIDTH_MAX); } + /** Unsafe version of {@link #min_Left_Side_Bearing}. */ + public static short nmin_Left_Side_Bearing(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.MIN_LEFT_SIDE_BEARING); } + /** Unsafe version of {@link #min_Right_Side_Bearing}. */ + public static short nmin_Right_Side_Bearing(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.MIN_RIGHT_SIDE_BEARING); } + /** Unsafe version of {@link #xMax_Extent}. */ + public static short nxMax_Extent(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.XMAX_EXTENT); } + /** Unsafe version of {@link #caret_Slope_Rise}. */ + public static short ncaret_Slope_Rise(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.CARET_SLOPE_RISE); } + /** Unsafe version of {@link #caret_Slope_Run}. */ + public static short ncaret_Slope_Run(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.CARET_SLOPE_RUN); } + /** Unsafe version of {@link #caret_Offset}. */ + public static short ncaret_Offset(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.CARET_OFFSET); } + /** Unsafe version of {@link #Reserved}. */ + public static ShortBuffer nReserved(long struct) { return memShortBuffer(struct + TT_HoriHeader.RESERVED, 4); } + /** Unsafe version of {@link #Reserved(int) Reserved}. */ + public static short nReserved(long struct, int index) { + return UNSAFE.getShort(null, struct + TT_HoriHeader.RESERVED + check(index, 4) * 2); + } + /** Unsafe version of {@link #metric_Data_Format}. */ + public static short nmetric_Data_Format(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.METRIC_DATA_FORMAT); } + /** Unsafe version of {@link #number_Of_HMetrics}. */ + public static short nnumber_Of_HMetrics(long struct) { return UNSAFE.getShort(null, struct + TT_HoriHeader.NUMBER_OF_HMETRICS); } + /** Unsafe version of {@link #long_metrics(int) long_metrics}. */ + @Nullable public static ByteBuffer nlong_metrics(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + TT_HoriHeader.LONG_METRICS), capacity); } + /** Unsafe version of {@link #short_metrics(int) short_metrics}. */ + @Nullable public static ByteBuffer nshort_metrics(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + TT_HoriHeader.SHORT_METRICS), capacity); } + + // ----------------------------------- + + /** An array of {@link TT_HoriHeader} structs. */ + public static class Buffer extends StructBuffer { + + private static final TT_HoriHeader ELEMENT_FACTORY = TT_HoriHeader.create(-1L); + + /** + * Creates a new {@code TT_HoriHeader.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link TT_HoriHeader#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected TT_HoriHeader getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code Version} field. */ + @NativeType("FT_Fixed") + public long Version() { return TT_HoriHeader.nVersion(address()); } + /** @return the value of the {@code Ascender} field. */ + @NativeType("FT_Short") + public short Ascender() { return TT_HoriHeader.nAscender(address()); } + /** @return the value of the {@code Descender} field. */ + @NativeType("FT_Short") + public short Descender() { return TT_HoriHeader.nDescender(address()); } + /** @return the value of the {@code Line_Gap} field. */ + @NativeType("FT_Short") + public short Line_Gap() { return TT_HoriHeader.nLine_Gap(address()); } + /** @return the value of the {@link TT_HoriHeader#advance_Width_Max} field. */ + @NativeType("FT_UShort") + public short advance_Width_Max() { return TT_HoriHeader.nadvance_Width_Max(address()); } + /** @return the value of the {@link TT_HoriHeader#min_Left_Side_Bearing} field. */ + @NativeType("FT_Short") + public short min_Left_Side_Bearing() { return TT_HoriHeader.nmin_Left_Side_Bearing(address()); } + /** @return the value of the {@link TT_HoriHeader#min_Right_Side_Bearing} field. */ + @NativeType("FT_Short") + public short min_Right_Side_Bearing() { return TT_HoriHeader.nmin_Right_Side_Bearing(address()); } + /** @return the value of the {@link TT_HoriHeader#xMax_Extent} field. */ + @NativeType("FT_Short") + public short xMax_Extent() { return TT_HoriHeader.nxMax_Extent(address()); } + /** @return the value of the {@code caret_Slope_Rise} field. */ + @NativeType("FT_Short") + public short caret_Slope_Rise() { return TT_HoriHeader.ncaret_Slope_Rise(address()); } + /** @return the value of the {@code caret_Slope_Run} field. */ + @NativeType("FT_Short") + public short caret_Slope_Run() { return TT_HoriHeader.ncaret_Slope_Run(address()); } + /** @return the value of the {@code caret_Offset} field. */ + @NativeType("FT_Short") + public short caret_Offset() { return TT_HoriHeader.ncaret_Offset(address()); } + /** @return a {@link ShortBuffer} view of the {@code Reserved} field. */ + @NativeType("FT_Short[4]") + public ShortBuffer Reserved() { return TT_HoriHeader.nReserved(address()); } + /** @return the value at the specified index of the {@code Reserved} field. */ + @NativeType("FT_Short") + public short Reserved(int index) { return TT_HoriHeader.nReserved(address(), index); } + /** @return the value of the {@code metric_Data_Format} field. */ + @NativeType("FT_Short") + public short metric_Data_Format() { return TT_HoriHeader.nmetric_Data_Format(address()); } + /** @return the value of the {@code number_Of_HMetrics} field. */ + @NativeType("FT_UShort") + public short number_Of_HMetrics() { return TT_HoriHeader.nnumber_Of_HMetrics(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code long_metrics} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void *") + public ByteBuffer long_metrics(int capacity) { return TT_HoriHeader.nlong_metrics(address(), capacity); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code short_metrics} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void *") + public ByteBuffer short_metrics(int capacity) { return TT_HoriHeader.nshort_metrics(address(), capacity); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_MaxProfile.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_MaxProfile.java new file mode 100644 index 000000000..d91de98af --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_MaxProfile.java @@ -0,0 +1,321 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * The maximum profile ({@code maxp}) table contains many max values, which can be used to pre-allocate arrays for speeding up glyph loading and hinting. + * + *

    Layout

    + * + *
    
    + * struct TT_MaxProfile {
    + *     FT_Fixed version;
    + *     FT_UShort numGlyphs;
    + *     FT_UShort maxPoints;
    + *     FT_UShort maxContours;
    + *     FT_UShort maxCompositePoints;
    + *     FT_UShort maxCompositeContours;
    + *     FT_UShort maxZones;
    + *     FT_UShort maxTwilightPoints;
    + *     FT_UShort maxStorage;
    + *     FT_UShort maxFunctionDefs;
    + *     FT_UShort maxInstructionDefs;
    + *     FT_UShort maxStackElements;
    + *     FT_UShort maxSizeOfInstructions;
    + *     FT_UShort maxComponentElements;
    + *     FT_UShort maxComponentDepth;
    + * }
    + */ +public class TT_MaxProfile extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + VERSION, + NUMGLYPHS, + MAXPOINTS, + MAXCONTOURS, + MAXCOMPOSITEPOINTS, + MAXCOMPOSITECONTOURS, + MAXZONES, + MAXTWILIGHTPOINTS, + MAXSTORAGE, + MAXFUNCTIONDEFS, + MAXINSTRUCTIONDEFS, + MAXSTACKELEMENTS, + MAXSIZEOFINSTRUCTIONS, + MAXCOMPONENTELEMENTS, + MAXCOMPONENTDEPTH; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + VERSION = layout.offsetof(0); + NUMGLYPHS = layout.offsetof(1); + MAXPOINTS = layout.offsetof(2); + MAXCONTOURS = layout.offsetof(3); + MAXCOMPOSITEPOINTS = layout.offsetof(4); + MAXCOMPOSITECONTOURS = layout.offsetof(5); + MAXZONES = layout.offsetof(6); + MAXTWILIGHTPOINTS = layout.offsetof(7); + MAXSTORAGE = layout.offsetof(8); + MAXFUNCTIONDEFS = layout.offsetof(9); + MAXINSTRUCTIONDEFS = layout.offsetof(10); + MAXSTACKELEMENTS = layout.offsetof(11); + MAXSIZEOFINSTRUCTIONS = layout.offsetof(12); + MAXCOMPONENTELEMENTS = layout.offsetof(13); + MAXCOMPONENTDEPTH = layout.offsetof(14); + } + + protected TT_MaxProfile(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected TT_MaxProfile create(long address, @Nullable ByteBuffer container) { + return new TT_MaxProfile(address, container); + } + + /** + * Creates a {@code TT_MaxProfile} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public TT_MaxProfile(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code version} field. */ + @NativeType("FT_Fixed") + public long version() { return nversion(address()); } + /** @return the value of the {@code numGlyphs} field. */ + @NativeType("FT_UShort") + public short numGlyphs() { return nnumGlyphs(address()); } + /** @return the value of the {@code maxPoints} field. */ + @NativeType("FT_UShort") + public short maxPoints() { return nmaxPoints(address()); } + /** @return the value of the {@code maxContours} field. */ + @NativeType("FT_UShort") + public short maxContours() { return nmaxContours(address()); } + /** @return the value of the {@code maxCompositePoints} field. */ + @NativeType("FT_UShort") + public short maxCompositePoints() { return nmaxCompositePoints(address()); } + /** @return the value of the {@code maxCompositeContours} field. */ + @NativeType("FT_UShort") + public short maxCompositeContours() { return nmaxCompositeContours(address()); } + /** @return the value of the {@code maxZones} field. */ + @NativeType("FT_UShort") + public short maxZones() { return nmaxZones(address()); } + /** @return the value of the {@code maxTwilightPoints} field. */ + @NativeType("FT_UShort") + public short maxTwilightPoints() { return nmaxTwilightPoints(address()); } + /** @return the value of the {@code maxStorage} field. */ + @NativeType("FT_UShort") + public short maxStorage() { return nmaxStorage(address()); } + /** @return the value of the {@code maxFunctionDefs} field. */ + @NativeType("FT_UShort") + public short maxFunctionDefs() { return nmaxFunctionDefs(address()); } + /** @return the value of the {@code maxInstructionDefs} field. */ + @NativeType("FT_UShort") + public short maxInstructionDefs() { return nmaxInstructionDefs(address()); } + /** @return the value of the {@code maxStackElements} field. */ + @NativeType("FT_UShort") + public short maxStackElements() { return nmaxStackElements(address()); } + /** @return the value of the {@code maxSizeOfInstructions} field. */ + @NativeType("FT_UShort") + public short maxSizeOfInstructions() { return nmaxSizeOfInstructions(address()); } + /** @return the value of the {@code maxComponentElements} field. */ + @NativeType("FT_UShort") + public short maxComponentElements() { return nmaxComponentElements(address()); } + /** @return the value of the {@code maxComponentDepth} field. */ + @NativeType("FT_UShort") + public short maxComponentDepth() { return nmaxComponentDepth(address()); } + + // ----------------------------------- + + /** Returns a new {@code TT_MaxProfile} instance for the specified memory address. */ + public static TT_MaxProfile create(long address) { + return new TT_MaxProfile(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static TT_MaxProfile createSafe(long address) { + return address == NULL ? null : new TT_MaxProfile(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #version}. */ + public static long nversion(long struct) { return memGetCLong(struct + TT_MaxProfile.VERSION); } + /** Unsafe version of {@link #numGlyphs}. */ + public static short nnumGlyphs(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.NUMGLYPHS); } + /** Unsafe version of {@link #maxPoints}. */ + public static short nmaxPoints(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXPOINTS); } + /** Unsafe version of {@link #maxContours}. */ + public static short nmaxContours(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXCONTOURS); } + /** Unsafe version of {@link #maxCompositePoints}. */ + public static short nmaxCompositePoints(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXCOMPOSITEPOINTS); } + /** Unsafe version of {@link #maxCompositeContours}. */ + public static short nmaxCompositeContours(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXCOMPOSITECONTOURS); } + /** Unsafe version of {@link #maxZones}. */ + public static short nmaxZones(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXZONES); } + /** Unsafe version of {@link #maxTwilightPoints}. */ + public static short nmaxTwilightPoints(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXTWILIGHTPOINTS); } + /** Unsafe version of {@link #maxStorage}. */ + public static short nmaxStorage(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXSTORAGE); } + /** Unsafe version of {@link #maxFunctionDefs}. */ + public static short nmaxFunctionDefs(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXFUNCTIONDEFS); } + /** Unsafe version of {@link #maxInstructionDefs}. */ + public static short nmaxInstructionDefs(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXINSTRUCTIONDEFS); } + /** Unsafe version of {@link #maxStackElements}. */ + public static short nmaxStackElements(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXSTACKELEMENTS); } + /** Unsafe version of {@link #maxSizeOfInstructions}. */ + public static short nmaxSizeOfInstructions(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXSIZEOFINSTRUCTIONS); } + /** Unsafe version of {@link #maxComponentElements}. */ + public static short nmaxComponentElements(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXCOMPONENTELEMENTS); } + /** Unsafe version of {@link #maxComponentDepth}. */ + public static short nmaxComponentDepth(long struct) { return UNSAFE.getShort(null, struct + TT_MaxProfile.MAXCOMPONENTDEPTH); } + + // ----------------------------------- + + /** An array of {@link TT_MaxProfile} structs. */ + public static class Buffer extends StructBuffer { + + private static final TT_MaxProfile ELEMENT_FACTORY = TT_MaxProfile.create(-1L); + + /** + * Creates a new {@code TT_MaxProfile.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link TT_MaxProfile#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected TT_MaxProfile getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code version} field. */ + @NativeType("FT_Fixed") + public long version() { return TT_MaxProfile.nversion(address()); } + /** @return the value of the {@code numGlyphs} field. */ + @NativeType("FT_UShort") + public short numGlyphs() { return TT_MaxProfile.nnumGlyphs(address()); } + /** @return the value of the {@code maxPoints} field. */ + @NativeType("FT_UShort") + public short maxPoints() { return TT_MaxProfile.nmaxPoints(address()); } + /** @return the value of the {@code maxContours} field. */ + @NativeType("FT_UShort") + public short maxContours() { return TT_MaxProfile.nmaxContours(address()); } + /** @return the value of the {@code maxCompositePoints} field. */ + @NativeType("FT_UShort") + public short maxCompositePoints() { return TT_MaxProfile.nmaxCompositePoints(address()); } + /** @return the value of the {@code maxCompositeContours} field. */ + @NativeType("FT_UShort") + public short maxCompositeContours() { return TT_MaxProfile.nmaxCompositeContours(address()); } + /** @return the value of the {@code maxZones} field. */ + @NativeType("FT_UShort") + public short maxZones() { return TT_MaxProfile.nmaxZones(address()); } + /** @return the value of the {@code maxTwilightPoints} field. */ + @NativeType("FT_UShort") + public short maxTwilightPoints() { return TT_MaxProfile.nmaxTwilightPoints(address()); } + /** @return the value of the {@code maxStorage} field. */ + @NativeType("FT_UShort") + public short maxStorage() { return TT_MaxProfile.nmaxStorage(address()); } + /** @return the value of the {@code maxFunctionDefs} field. */ + @NativeType("FT_UShort") + public short maxFunctionDefs() { return TT_MaxProfile.nmaxFunctionDefs(address()); } + /** @return the value of the {@code maxInstructionDefs} field. */ + @NativeType("FT_UShort") + public short maxInstructionDefs() { return TT_MaxProfile.nmaxInstructionDefs(address()); } + /** @return the value of the {@code maxStackElements} field. */ + @NativeType("FT_UShort") + public short maxStackElements() { return TT_MaxProfile.nmaxStackElements(address()); } + /** @return the value of the {@code maxSizeOfInstructions} field. */ + @NativeType("FT_UShort") + public short maxSizeOfInstructions() { return TT_MaxProfile.nmaxSizeOfInstructions(address()); } + /** @return the value of the {@code maxComponentElements} field. */ + @NativeType("FT_UShort") + public short maxComponentElements() { return TT_MaxProfile.nmaxComponentElements(address()); } + /** @return the value of the {@code maxComponentDepth} field. */ + @NativeType("FT_UShort") + public short maxComponentDepth() { return TT_MaxProfile.nmaxComponentDepth(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_OS2.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_OS2.java new file mode 100644 index 000000000..43de32e41 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_OS2.java @@ -0,0 +1,630 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure to model a TrueType {@code OS/2} table. + * + *

    Layout

    + * + *
    
    + * struct TT_OS2 {
    + *     FT_UShort version;
    + *     FT_Short xAvgCharWidth;
    + *     FT_UShort usWeightClass;
    + *     FT_UShort usWidthClass;
    + *     FT_UShort fsType;
    + *     FT_Short ySubscriptXSize;
    + *     FT_Short ySubscriptYSize;
    + *     FT_Short ySubscriptXOffset;
    + *     FT_Short ySubscriptYOffset;
    + *     FT_Short ySuperscriptXSize;
    + *     FT_Short ySuperscriptYSize;
    + *     FT_Short ySuperscriptXOffset;
    + *     FT_Short ySuperscriptYOffset;
    + *     FT_Short yStrikeoutSize;
    + *     FT_Short yStrikeoutPosition;
    + *     FT_Short sFamilyClass;
    + *     FT_Byte panose[10];
    + *     FT_ULong ulUnicodeRange1;
    + *     FT_ULong ulUnicodeRange2;
    + *     FT_ULong ulUnicodeRange3;
    + *     FT_ULong ulUnicodeRange4;
    + *     FT_Char achVendID[4];
    + *     FT_UShort fsSelection;
    + *     FT_UShort usFirstCharIndex;
    + *     FT_UShort usLastCharIndex;
    + *     FT_Short sTypoAscender;
    + *     FT_Short sTypoDescender;
    + *     FT_Short sTypoLineGap;
    + *     FT_UShort usWinAscent;
    + *     FT_UShort usWinDescent;
    + *     FT_ULong ulCodePageRange1;
    + *     FT_ULong ulCodePageRange2;
    + *     FT_Short sxHeight;
    + *     FT_Short sCapHeight;
    + *     FT_UShort usDefaultChar;
    + *     FT_UShort usBreakChar;
    + *     FT_UShort usMaxContext;
    + *     FT_UShort usLowerOpticalPointSize;
    + *     FT_UShort usUpperOpticalPointSize;
    + * }
    + */ +public class TT_OS2 extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + VERSION, + XAVGCHARWIDTH, + USWEIGHTCLASS, + USWIDTHCLASS, + FSTYPE, + YSUBSCRIPTXSIZE, + YSUBSCRIPTYSIZE, + YSUBSCRIPTXOFFSET, + YSUBSCRIPTYOFFSET, + YSUPERSCRIPTXSIZE, + YSUPERSCRIPTYSIZE, + YSUPERSCRIPTXOFFSET, + YSUPERSCRIPTYOFFSET, + YSTRIKEOUTSIZE, + YSTRIKEOUTPOSITION, + SFAMILYCLASS, + PANOSE, + ULUNICODERANGE1, + ULUNICODERANGE2, + ULUNICODERANGE3, + ULUNICODERANGE4, + ACHVENDID, + FSSELECTION, + USFIRSTCHARINDEX, + USLASTCHARINDEX, + STYPOASCENDER, + STYPODESCENDER, + STYPOLINEGAP, + USWINASCENT, + USWINDESCENT, + ULCODEPAGERANGE1, + ULCODEPAGERANGE2, + SXHEIGHT, + SCAPHEIGHT, + USDEFAULTCHAR, + USBREAKCHAR, + USMAXCONTEXT, + USLOWEROPTICALPOINTSIZE, + USUPPEROPTICALPOINTSIZE; + + static { + Layout layout = __struct( + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __array(1, 10), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __array(1, 4), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + VERSION = layout.offsetof(0); + XAVGCHARWIDTH = layout.offsetof(1); + USWEIGHTCLASS = layout.offsetof(2); + USWIDTHCLASS = layout.offsetof(3); + FSTYPE = layout.offsetof(4); + YSUBSCRIPTXSIZE = layout.offsetof(5); + YSUBSCRIPTYSIZE = layout.offsetof(6); + YSUBSCRIPTXOFFSET = layout.offsetof(7); + YSUBSCRIPTYOFFSET = layout.offsetof(8); + YSUPERSCRIPTXSIZE = layout.offsetof(9); + YSUPERSCRIPTYSIZE = layout.offsetof(10); + YSUPERSCRIPTXOFFSET = layout.offsetof(11); + YSUPERSCRIPTYOFFSET = layout.offsetof(12); + YSTRIKEOUTSIZE = layout.offsetof(13); + YSTRIKEOUTPOSITION = layout.offsetof(14); + SFAMILYCLASS = layout.offsetof(15); + PANOSE = layout.offsetof(16); + ULUNICODERANGE1 = layout.offsetof(17); + ULUNICODERANGE2 = layout.offsetof(18); + ULUNICODERANGE3 = layout.offsetof(19); + ULUNICODERANGE4 = layout.offsetof(20); + ACHVENDID = layout.offsetof(21); + FSSELECTION = layout.offsetof(22); + USFIRSTCHARINDEX = layout.offsetof(23); + USLASTCHARINDEX = layout.offsetof(24); + STYPOASCENDER = layout.offsetof(25); + STYPODESCENDER = layout.offsetof(26); + STYPOLINEGAP = layout.offsetof(27); + USWINASCENT = layout.offsetof(28); + USWINDESCENT = layout.offsetof(29); + ULCODEPAGERANGE1 = layout.offsetof(30); + ULCODEPAGERANGE2 = layout.offsetof(31); + SXHEIGHT = layout.offsetof(32); + SCAPHEIGHT = layout.offsetof(33); + USDEFAULTCHAR = layout.offsetof(34); + USBREAKCHAR = layout.offsetof(35); + USMAXCONTEXT = layout.offsetof(36); + USLOWEROPTICALPOINTSIZE = layout.offsetof(37); + USUPPEROPTICALPOINTSIZE = layout.offsetof(38); + } + + protected TT_OS2(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected TT_OS2 create(long address, @Nullable ByteBuffer container) { + return new TT_OS2(address, container); + } + + /** + * Creates a {@code TT_OS2} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public TT_OS2(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code version} field. */ + @NativeType("FT_UShort") + public short version() { return nversion(address()); } + /** @return the value of the {@code xAvgCharWidth} field. */ + @NativeType("FT_Short") + public short xAvgCharWidth() { return nxAvgCharWidth(address()); } + /** @return the value of the {@code usWeightClass} field. */ + @NativeType("FT_UShort") + public short usWeightClass() { return nusWeightClass(address()); } + /** @return the value of the {@code usWidthClass} field. */ + @NativeType("FT_UShort") + public short usWidthClass() { return nusWidthClass(address()); } + /** @return the value of the {@code fsType} field. */ + @NativeType("FT_UShort") + public short fsType() { return nfsType(address()); } + /** @return the value of the {@code ySubscriptXSize} field. */ + @NativeType("FT_Short") + public short ySubscriptXSize() { return nySubscriptXSize(address()); } + /** @return the value of the {@code ySubscriptYSize} field. */ + @NativeType("FT_Short") + public short ySubscriptYSize() { return nySubscriptYSize(address()); } + /** @return the value of the {@code ySubscriptXOffset} field. */ + @NativeType("FT_Short") + public short ySubscriptXOffset() { return nySubscriptXOffset(address()); } + /** @return the value of the {@code ySubscriptYOffset} field. */ + @NativeType("FT_Short") + public short ySubscriptYOffset() { return nySubscriptYOffset(address()); } + /** @return the value of the {@code ySuperscriptXSize} field. */ + @NativeType("FT_Short") + public short ySuperscriptXSize() { return nySuperscriptXSize(address()); } + /** @return the value of the {@code ySuperscriptYSize} field. */ + @NativeType("FT_Short") + public short ySuperscriptYSize() { return nySuperscriptYSize(address()); } + /** @return the value of the {@code ySuperscriptXOffset} field. */ + @NativeType("FT_Short") + public short ySuperscriptXOffset() { return nySuperscriptXOffset(address()); } + /** @return the value of the {@code ySuperscriptYOffset} field. */ + @NativeType("FT_Short") + public short ySuperscriptYOffset() { return nySuperscriptYOffset(address()); } + /** @return the value of the {@code yStrikeoutSize} field. */ + @NativeType("FT_Short") + public short yStrikeoutSize() { return nyStrikeoutSize(address()); } + /** @return the value of the {@code yStrikeoutPosition} field. */ + @NativeType("FT_Short") + public short yStrikeoutPosition() { return nyStrikeoutPosition(address()); } + /** @return the value of the {@code sFamilyClass} field. */ + @NativeType("FT_Short") + public short sFamilyClass() { return nsFamilyClass(address()); } + /** @return a {@link ByteBuffer} view of the {@code panose} field. */ + @NativeType("FT_Byte[10]") + public ByteBuffer panose() { return npanose(address()); } + /** @return the value at the specified index of the {@code panose} field. */ + @NativeType("FT_Byte") + public byte panose(int index) { return npanose(address(), index); } + /** @return the value of the {@code ulUnicodeRange1} field. */ + @NativeType("FT_ULong") + public long ulUnicodeRange1() { return nulUnicodeRange1(address()); } + /** @return the value of the {@code ulUnicodeRange2} field. */ + @NativeType("FT_ULong") + public long ulUnicodeRange2() { return nulUnicodeRange2(address()); } + /** @return the value of the {@code ulUnicodeRange3} field. */ + @NativeType("FT_ULong") + public long ulUnicodeRange3() { return nulUnicodeRange3(address()); } + /** @return the value of the {@code ulUnicodeRange4} field. */ + @NativeType("FT_ULong") + public long ulUnicodeRange4() { return nulUnicodeRange4(address()); } + /** @return a {@link ByteBuffer} view of the {@code achVendID} field. */ + @NativeType("FT_Char[4]") + public ByteBuffer achVendID() { return nachVendID(address()); } + /** @return the value at the specified index of the {@code achVendID} field. */ + @NativeType("FT_Char") + public byte achVendID(int index) { return nachVendID(address(), index); } + /** @return the value of the {@code fsSelection} field. */ + @NativeType("FT_UShort") + public short fsSelection() { return nfsSelection(address()); } + /** @return the value of the {@code usFirstCharIndex} field. */ + @NativeType("FT_UShort") + public short usFirstCharIndex() { return nusFirstCharIndex(address()); } + /** @return the value of the {@code usLastCharIndex} field. */ + @NativeType("FT_UShort") + public short usLastCharIndex() { return nusLastCharIndex(address()); } + /** @return the value of the {@code sTypoAscender} field. */ + @NativeType("FT_Short") + public short sTypoAscender() { return nsTypoAscender(address()); } + /** @return the value of the {@code sTypoDescender} field. */ + @NativeType("FT_Short") + public short sTypoDescender() { return nsTypoDescender(address()); } + /** @return the value of the {@code sTypoLineGap} field. */ + @NativeType("FT_Short") + public short sTypoLineGap() { return nsTypoLineGap(address()); } + /** @return the value of the {@code usWinAscent} field. */ + @NativeType("FT_UShort") + public short usWinAscent() { return nusWinAscent(address()); } + /** @return the value of the {@code usWinDescent} field. */ + @NativeType("FT_UShort") + public short usWinDescent() { return nusWinDescent(address()); } + /** @return the value of the {@code ulCodePageRange1} field. */ + @NativeType("FT_ULong") + public long ulCodePageRange1() { return nulCodePageRange1(address()); } + /** @return the value of the {@code ulCodePageRange2} field. */ + @NativeType("FT_ULong") + public long ulCodePageRange2() { return nulCodePageRange2(address()); } + /** @return the value of the {@code sxHeight} field. */ + @NativeType("FT_Short") + public short sxHeight() { return nsxHeight(address()); } + /** @return the value of the {@code sCapHeight} field. */ + @NativeType("FT_Short") + public short sCapHeight() { return nsCapHeight(address()); } + /** @return the value of the {@code usDefaultChar} field. */ + @NativeType("FT_UShort") + public short usDefaultChar() { return nusDefaultChar(address()); } + /** @return the value of the {@code usBreakChar} field. */ + @NativeType("FT_UShort") + public short usBreakChar() { return nusBreakChar(address()); } + /** @return the value of the {@code usMaxContext} field. */ + @NativeType("FT_UShort") + public short usMaxContext() { return nusMaxContext(address()); } + /** @return the value of the {@code usLowerOpticalPointSize} field. */ + @NativeType("FT_UShort") + public short usLowerOpticalPointSize() { return nusLowerOpticalPointSize(address()); } + /** @return the value of the {@code usUpperOpticalPointSize} field. */ + @NativeType("FT_UShort") + public short usUpperOpticalPointSize() { return nusUpperOpticalPointSize(address()); } + + // ----------------------------------- + + /** Returns a new {@code TT_OS2} instance for the specified memory address. */ + public static TT_OS2 create(long address) { + return new TT_OS2(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static TT_OS2 createSafe(long address) { + return address == NULL ? null : new TT_OS2(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #version}. */ + public static short nversion(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.VERSION); } + /** Unsafe version of {@link #xAvgCharWidth}. */ + public static short nxAvgCharWidth(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.XAVGCHARWIDTH); } + /** Unsafe version of {@link #usWeightClass}. */ + public static short nusWeightClass(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.USWEIGHTCLASS); } + /** Unsafe version of {@link #usWidthClass}. */ + public static short nusWidthClass(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.USWIDTHCLASS); } + /** Unsafe version of {@link #fsType}. */ + public static short nfsType(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.FSTYPE); } + /** Unsafe version of {@link #ySubscriptXSize}. */ + public static short nySubscriptXSize(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.YSUBSCRIPTXSIZE); } + /** Unsafe version of {@link #ySubscriptYSize}. */ + public static short nySubscriptYSize(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.YSUBSCRIPTYSIZE); } + /** Unsafe version of {@link #ySubscriptXOffset}. */ + public static short nySubscriptXOffset(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.YSUBSCRIPTXOFFSET); } + /** Unsafe version of {@link #ySubscriptYOffset}. */ + public static short nySubscriptYOffset(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.YSUBSCRIPTYOFFSET); } + /** Unsafe version of {@link #ySuperscriptXSize}. */ + public static short nySuperscriptXSize(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.YSUPERSCRIPTXSIZE); } + /** Unsafe version of {@link #ySuperscriptYSize}. */ + public static short nySuperscriptYSize(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.YSUPERSCRIPTYSIZE); } + /** Unsafe version of {@link #ySuperscriptXOffset}. */ + public static short nySuperscriptXOffset(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.YSUPERSCRIPTXOFFSET); } + /** Unsafe version of {@link #ySuperscriptYOffset}. */ + public static short nySuperscriptYOffset(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.YSUPERSCRIPTYOFFSET); } + /** Unsafe version of {@link #yStrikeoutSize}. */ + public static short nyStrikeoutSize(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.YSTRIKEOUTSIZE); } + /** Unsafe version of {@link #yStrikeoutPosition}. */ + public static short nyStrikeoutPosition(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.YSTRIKEOUTPOSITION); } + /** Unsafe version of {@link #sFamilyClass}. */ + public static short nsFamilyClass(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.SFAMILYCLASS); } + /** Unsafe version of {@link #panose}. */ + public static ByteBuffer npanose(long struct) { return memByteBuffer(struct + TT_OS2.PANOSE, 10); } + /** Unsafe version of {@link #panose(int) panose}. */ + public static byte npanose(long struct, int index) { + return UNSAFE.getByte(null, struct + TT_OS2.PANOSE + check(index, 10) * 1); + } + /** Unsafe version of {@link #ulUnicodeRange1}. */ + public static long nulUnicodeRange1(long struct) { return memGetCLong(struct + TT_OS2.ULUNICODERANGE1); } + /** Unsafe version of {@link #ulUnicodeRange2}. */ + public static long nulUnicodeRange2(long struct) { return memGetCLong(struct + TT_OS2.ULUNICODERANGE2); } + /** Unsafe version of {@link #ulUnicodeRange3}. */ + public static long nulUnicodeRange3(long struct) { return memGetCLong(struct + TT_OS2.ULUNICODERANGE3); } + /** Unsafe version of {@link #ulUnicodeRange4}. */ + public static long nulUnicodeRange4(long struct) { return memGetCLong(struct + TT_OS2.ULUNICODERANGE4); } + /** Unsafe version of {@link #achVendID}. */ + public static ByteBuffer nachVendID(long struct) { return memByteBuffer(struct + TT_OS2.ACHVENDID, 4); } + /** Unsafe version of {@link #achVendID(int) achVendID}. */ + public static byte nachVendID(long struct, int index) { + return UNSAFE.getByte(null, struct + TT_OS2.ACHVENDID + check(index, 4) * 1); + } + /** Unsafe version of {@link #fsSelection}. */ + public static short nfsSelection(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.FSSELECTION); } + /** Unsafe version of {@link #usFirstCharIndex}. */ + public static short nusFirstCharIndex(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.USFIRSTCHARINDEX); } + /** Unsafe version of {@link #usLastCharIndex}. */ + public static short nusLastCharIndex(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.USLASTCHARINDEX); } + /** Unsafe version of {@link #sTypoAscender}. */ + public static short nsTypoAscender(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.STYPOASCENDER); } + /** Unsafe version of {@link #sTypoDescender}. */ + public static short nsTypoDescender(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.STYPODESCENDER); } + /** Unsafe version of {@link #sTypoLineGap}. */ + public static short nsTypoLineGap(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.STYPOLINEGAP); } + /** Unsafe version of {@link #usWinAscent}. */ + public static short nusWinAscent(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.USWINASCENT); } + /** Unsafe version of {@link #usWinDescent}. */ + public static short nusWinDescent(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.USWINDESCENT); } + /** Unsafe version of {@link #ulCodePageRange1}. */ + public static long nulCodePageRange1(long struct) { return memGetCLong(struct + TT_OS2.ULCODEPAGERANGE1); } + /** Unsafe version of {@link #ulCodePageRange2}. */ + public static long nulCodePageRange2(long struct) { return memGetCLong(struct + TT_OS2.ULCODEPAGERANGE2); } + /** Unsafe version of {@link #sxHeight}. */ + public static short nsxHeight(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.SXHEIGHT); } + /** Unsafe version of {@link #sCapHeight}. */ + public static short nsCapHeight(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.SCAPHEIGHT); } + /** Unsafe version of {@link #usDefaultChar}. */ + public static short nusDefaultChar(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.USDEFAULTCHAR); } + /** Unsafe version of {@link #usBreakChar}. */ + public static short nusBreakChar(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.USBREAKCHAR); } + /** Unsafe version of {@link #usMaxContext}. */ + public static short nusMaxContext(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.USMAXCONTEXT); } + /** Unsafe version of {@link #usLowerOpticalPointSize}. */ + public static short nusLowerOpticalPointSize(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.USLOWEROPTICALPOINTSIZE); } + /** Unsafe version of {@link #usUpperOpticalPointSize}. */ + public static short nusUpperOpticalPointSize(long struct) { return UNSAFE.getShort(null, struct + TT_OS2.USUPPEROPTICALPOINTSIZE); } + + // ----------------------------------- + + /** An array of {@link TT_OS2} structs. */ + public static class Buffer extends StructBuffer { + + private static final TT_OS2 ELEMENT_FACTORY = TT_OS2.create(-1L); + + /** + * Creates a new {@code TT_OS2.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link TT_OS2#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected TT_OS2 getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code version} field. */ + @NativeType("FT_UShort") + public short version() { return TT_OS2.nversion(address()); } + /** @return the value of the {@code xAvgCharWidth} field. */ + @NativeType("FT_Short") + public short xAvgCharWidth() { return TT_OS2.nxAvgCharWidth(address()); } + /** @return the value of the {@code usWeightClass} field. */ + @NativeType("FT_UShort") + public short usWeightClass() { return TT_OS2.nusWeightClass(address()); } + /** @return the value of the {@code usWidthClass} field. */ + @NativeType("FT_UShort") + public short usWidthClass() { return TT_OS2.nusWidthClass(address()); } + /** @return the value of the {@code fsType} field. */ + @NativeType("FT_UShort") + public short fsType() { return TT_OS2.nfsType(address()); } + /** @return the value of the {@code ySubscriptXSize} field. */ + @NativeType("FT_Short") + public short ySubscriptXSize() { return TT_OS2.nySubscriptXSize(address()); } + /** @return the value of the {@code ySubscriptYSize} field. */ + @NativeType("FT_Short") + public short ySubscriptYSize() { return TT_OS2.nySubscriptYSize(address()); } + /** @return the value of the {@code ySubscriptXOffset} field. */ + @NativeType("FT_Short") + public short ySubscriptXOffset() { return TT_OS2.nySubscriptXOffset(address()); } + /** @return the value of the {@code ySubscriptYOffset} field. */ + @NativeType("FT_Short") + public short ySubscriptYOffset() { return TT_OS2.nySubscriptYOffset(address()); } + /** @return the value of the {@code ySuperscriptXSize} field. */ + @NativeType("FT_Short") + public short ySuperscriptXSize() { return TT_OS2.nySuperscriptXSize(address()); } + /** @return the value of the {@code ySuperscriptYSize} field. */ + @NativeType("FT_Short") + public short ySuperscriptYSize() { return TT_OS2.nySuperscriptYSize(address()); } + /** @return the value of the {@code ySuperscriptXOffset} field. */ + @NativeType("FT_Short") + public short ySuperscriptXOffset() { return TT_OS2.nySuperscriptXOffset(address()); } + /** @return the value of the {@code ySuperscriptYOffset} field. */ + @NativeType("FT_Short") + public short ySuperscriptYOffset() { return TT_OS2.nySuperscriptYOffset(address()); } + /** @return the value of the {@code yStrikeoutSize} field. */ + @NativeType("FT_Short") + public short yStrikeoutSize() { return TT_OS2.nyStrikeoutSize(address()); } + /** @return the value of the {@code yStrikeoutPosition} field. */ + @NativeType("FT_Short") + public short yStrikeoutPosition() { return TT_OS2.nyStrikeoutPosition(address()); } + /** @return the value of the {@code sFamilyClass} field. */ + @NativeType("FT_Short") + public short sFamilyClass() { return TT_OS2.nsFamilyClass(address()); } + /** @return a {@link ByteBuffer} view of the {@code panose} field. */ + @NativeType("FT_Byte[10]") + public ByteBuffer panose() { return TT_OS2.npanose(address()); } + /** @return the value at the specified index of the {@code panose} field. */ + @NativeType("FT_Byte") + public byte panose(int index) { return TT_OS2.npanose(address(), index); } + /** @return the value of the {@code ulUnicodeRange1} field. */ + @NativeType("FT_ULong") + public long ulUnicodeRange1() { return TT_OS2.nulUnicodeRange1(address()); } + /** @return the value of the {@code ulUnicodeRange2} field. */ + @NativeType("FT_ULong") + public long ulUnicodeRange2() { return TT_OS2.nulUnicodeRange2(address()); } + /** @return the value of the {@code ulUnicodeRange3} field. */ + @NativeType("FT_ULong") + public long ulUnicodeRange3() { return TT_OS2.nulUnicodeRange3(address()); } + /** @return the value of the {@code ulUnicodeRange4} field. */ + @NativeType("FT_ULong") + public long ulUnicodeRange4() { return TT_OS2.nulUnicodeRange4(address()); } + /** @return a {@link ByteBuffer} view of the {@code achVendID} field. */ + @NativeType("FT_Char[4]") + public ByteBuffer achVendID() { return TT_OS2.nachVendID(address()); } + /** @return the value at the specified index of the {@code achVendID} field. */ + @NativeType("FT_Char") + public byte achVendID(int index) { return TT_OS2.nachVendID(address(), index); } + /** @return the value of the {@code fsSelection} field. */ + @NativeType("FT_UShort") + public short fsSelection() { return TT_OS2.nfsSelection(address()); } + /** @return the value of the {@code usFirstCharIndex} field. */ + @NativeType("FT_UShort") + public short usFirstCharIndex() { return TT_OS2.nusFirstCharIndex(address()); } + /** @return the value of the {@code usLastCharIndex} field. */ + @NativeType("FT_UShort") + public short usLastCharIndex() { return TT_OS2.nusLastCharIndex(address()); } + /** @return the value of the {@code sTypoAscender} field. */ + @NativeType("FT_Short") + public short sTypoAscender() { return TT_OS2.nsTypoAscender(address()); } + /** @return the value of the {@code sTypoDescender} field. */ + @NativeType("FT_Short") + public short sTypoDescender() { return TT_OS2.nsTypoDescender(address()); } + /** @return the value of the {@code sTypoLineGap} field. */ + @NativeType("FT_Short") + public short sTypoLineGap() { return TT_OS2.nsTypoLineGap(address()); } + /** @return the value of the {@code usWinAscent} field. */ + @NativeType("FT_UShort") + public short usWinAscent() { return TT_OS2.nusWinAscent(address()); } + /** @return the value of the {@code usWinDescent} field. */ + @NativeType("FT_UShort") + public short usWinDescent() { return TT_OS2.nusWinDescent(address()); } + /** @return the value of the {@code ulCodePageRange1} field. */ + @NativeType("FT_ULong") + public long ulCodePageRange1() { return TT_OS2.nulCodePageRange1(address()); } + /** @return the value of the {@code ulCodePageRange2} field. */ + @NativeType("FT_ULong") + public long ulCodePageRange2() { return TT_OS2.nulCodePageRange2(address()); } + /** @return the value of the {@code sxHeight} field. */ + @NativeType("FT_Short") + public short sxHeight() { return TT_OS2.nsxHeight(address()); } + /** @return the value of the {@code sCapHeight} field. */ + @NativeType("FT_Short") + public short sCapHeight() { return TT_OS2.nsCapHeight(address()); } + /** @return the value of the {@code usDefaultChar} field. */ + @NativeType("FT_UShort") + public short usDefaultChar() { return TT_OS2.nusDefaultChar(address()); } + /** @return the value of the {@code usBreakChar} field. */ + @NativeType("FT_UShort") + public short usBreakChar() { return TT_OS2.nusBreakChar(address()); } + /** @return the value of the {@code usMaxContext} field. */ + @NativeType("FT_UShort") + public short usMaxContext() { return TT_OS2.nusMaxContext(address()); } + /** @return the value of the {@code usLowerOpticalPointSize} field. */ + @NativeType("FT_UShort") + public short usLowerOpticalPointSize() { return TT_OS2.nusLowerOpticalPointSize(address()); } + /** @return the value of the {@code usUpperOpticalPointSize} field. */ + @NativeType("FT_UShort") + public short usUpperOpticalPointSize() { return TT_OS2.nusUpperOpticalPointSize(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_PCLT.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_PCLT.java new file mode 100644 index 000000000..e4534abc5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_PCLT.java @@ -0,0 +1,352 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure to model a TrueType {@code PCLT} table. + * + *

    Layout

    + * + *
    
    + * struct TT_PCLT {
    + *     FT_Fixed Version;
    + *     FT_ULong FontNumber;
    + *     FT_UShort Pitch;
    + *     FT_UShort xHeight;
    + *     FT_UShort Style;
    + *     FT_UShort TypeFamily;
    + *     FT_UShort CapHeight;
    + *     FT_UShort SymbolSet;
    + *     FT_Char TypeFace[16];
    + *     FT_Char CharacterComplement[8];
    + *     FT_Char FileName[6];
    + *     FT_Char StrokeWeight;
    + *     FT_Char WidthType;
    + *     FT_Byte SerifStyle;
    + *     FT_Byte Reserved;
    + * }
    + */ +public class TT_PCLT extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + VERSION, + FONTNUMBER, + PITCH, + XHEIGHT, + STYLE, + TYPEFAMILY, + CAPHEIGHT, + SYMBOLSET, + TYPEFACE, + CHARACTERCOMPLEMENT, + FILENAME, + STROKEWEIGHT, + WIDTHTYPE, + SERIFSTYLE, + RESERVED; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __array(1, 16), + __array(1, 8), + __array(1, 6), + __member(1), + __member(1), + __member(1), + __member(1) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + VERSION = layout.offsetof(0); + FONTNUMBER = layout.offsetof(1); + PITCH = layout.offsetof(2); + XHEIGHT = layout.offsetof(3); + STYLE = layout.offsetof(4); + TYPEFAMILY = layout.offsetof(5); + CAPHEIGHT = layout.offsetof(6); + SYMBOLSET = layout.offsetof(7); + TYPEFACE = layout.offsetof(8); + CHARACTERCOMPLEMENT = layout.offsetof(9); + FILENAME = layout.offsetof(10); + STROKEWEIGHT = layout.offsetof(11); + WIDTHTYPE = layout.offsetof(12); + SERIFSTYLE = layout.offsetof(13); + RESERVED = layout.offsetof(14); + } + + protected TT_PCLT(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected TT_PCLT create(long address, @Nullable ByteBuffer container) { + return new TT_PCLT(address, container); + } + + /** + * Creates a {@code TT_PCLT} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public TT_PCLT(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code Version} field. */ + @NativeType("FT_Fixed") + public long Version() { return nVersion(address()); } + /** @return the value of the {@code FontNumber} field. */ + @NativeType("FT_ULong") + public long FontNumber() { return nFontNumber(address()); } + /** @return the value of the {@code Pitch} field. */ + @NativeType("FT_UShort") + public short Pitch() { return nPitch(address()); } + /** @return the value of the {@code xHeight} field. */ + @NativeType("FT_UShort") + public short xHeight() { return nxHeight(address()); } + /** @return the value of the {@code Style} field. */ + @NativeType("FT_UShort") + public short Style() { return nStyle(address()); } + /** @return the value of the {@code TypeFamily} field. */ + @NativeType("FT_UShort") + public short TypeFamily() { return nTypeFamily(address()); } + /** @return the value of the {@code CapHeight} field. */ + @NativeType("FT_UShort") + public short CapHeight() { return nCapHeight(address()); } + /** @return the value of the {@code SymbolSet} field. */ + @NativeType("FT_UShort") + public short SymbolSet() { return nSymbolSet(address()); } + /** @return a {@link ByteBuffer} view of the {@code TypeFace} field. */ + @NativeType("FT_Char[16]") + public ByteBuffer TypeFace() { return nTypeFace(address()); } + /** @return the value at the specified index of the {@code TypeFace} field. */ + @NativeType("FT_Char") + public byte TypeFace(int index) { return nTypeFace(address(), index); } + /** @return a {@link ByteBuffer} view of the {@code CharacterComplement} field. */ + @NativeType("FT_Char[8]") + public ByteBuffer CharacterComplement() { return nCharacterComplement(address()); } + /** @return the value at the specified index of the {@code CharacterComplement} field. */ + @NativeType("FT_Char") + public byte CharacterComplement(int index) { return nCharacterComplement(address(), index); } + /** @return a {@link ByteBuffer} view of the {@code FileName} field. */ + @NativeType("FT_Char[6]") + public ByteBuffer FileName() { return nFileName(address()); } + /** @return the value at the specified index of the {@code FileName} field. */ + @NativeType("FT_Char") + public byte FileName(int index) { return nFileName(address(), index); } + /** @return the value of the {@code StrokeWeight} field. */ + @NativeType("FT_Char") + public byte StrokeWeight() { return nStrokeWeight(address()); } + /** @return the value of the {@code WidthType} field. */ + @NativeType("FT_Char") + public byte WidthType() { return nWidthType(address()); } + /** @return the value of the {@code SerifStyle} field. */ + @NativeType("FT_Byte") + public byte SerifStyle() { return nSerifStyle(address()); } + /** @return the value of the {@code Reserved} field. */ + @NativeType("FT_Byte") + public byte Reserved() { return nReserved(address()); } + + // ----------------------------------- + + /** Returns a new {@code TT_PCLT} instance for the specified memory address. */ + public static TT_PCLT create(long address) { + return new TT_PCLT(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static TT_PCLT createSafe(long address) { + return address == NULL ? null : new TT_PCLT(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #Version}. */ + public static long nVersion(long struct) { return memGetCLong(struct + TT_PCLT.VERSION); } + /** Unsafe version of {@link #FontNumber}. */ + public static long nFontNumber(long struct) { return memGetCLong(struct + TT_PCLT.FONTNUMBER); } + /** Unsafe version of {@link #Pitch}. */ + public static short nPitch(long struct) { return UNSAFE.getShort(null, struct + TT_PCLT.PITCH); } + /** Unsafe version of {@link #xHeight}. */ + public static short nxHeight(long struct) { return UNSAFE.getShort(null, struct + TT_PCLT.XHEIGHT); } + /** Unsafe version of {@link #Style}. */ + public static short nStyle(long struct) { return UNSAFE.getShort(null, struct + TT_PCLT.STYLE); } + /** Unsafe version of {@link #TypeFamily}. */ + public static short nTypeFamily(long struct) { return UNSAFE.getShort(null, struct + TT_PCLT.TYPEFAMILY); } + /** Unsafe version of {@link #CapHeight}. */ + public static short nCapHeight(long struct) { return UNSAFE.getShort(null, struct + TT_PCLT.CAPHEIGHT); } + /** Unsafe version of {@link #SymbolSet}. */ + public static short nSymbolSet(long struct) { return UNSAFE.getShort(null, struct + TT_PCLT.SYMBOLSET); } + /** Unsafe version of {@link #TypeFace}. */ + public static ByteBuffer nTypeFace(long struct) { return memByteBuffer(struct + TT_PCLT.TYPEFACE, 16); } + /** Unsafe version of {@link #TypeFace(int) TypeFace}. */ + public static byte nTypeFace(long struct, int index) { + return UNSAFE.getByte(null, struct + TT_PCLT.TYPEFACE + check(index, 16) * 1); + } + /** Unsafe version of {@link #CharacterComplement}. */ + public static ByteBuffer nCharacterComplement(long struct) { return memByteBuffer(struct + TT_PCLT.CHARACTERCOMPLEMENT, 8); } + /** Unsafe version of {@link #CharacterComplement(int) CharacterComplement}. */ + public static byte nCharacterComplement(long struct, int index) { + return UNSAFE.getByte(null, struct + TT_PCLT.CHARACTERCOMPLEMENT + check(index, 8) * 1); + } + /** Unsafe version of {@link #FileName}. */ + public static ByteBuffer nFileName(long struct) { return memByteBuffer(struct + TT_PCLT.FILENAME, 6); } + /** Unsafe version of {@link #FileName(int) FileName}. */ + public static byte nFileName(long struct, int index) { + return UNSAFE.getByte(null, struct + TT_PCLT.FILENAME + check(index, 6) * 1); + } + /** Unsafe version of {@link #StrokeWeight}. */ + public static byte nStrokeWeight(long struct) { return UNSAFE.getByte(null, struct + TT_PCLT.STROKEWEIGHT); } + /** Unsafe version of {@link #WidthType}. */ + public static byte nWidthType(long struct) { return UNSAFE.getByte(null, struct + TT_PCLT.WIDTHTYPE); } + /** Unsafe version of {@link #SerifStyle}. */ + public static byte nSerifStyle(long struct) { return UNSAFE.getByte(null, struct + TT_PCLT.SERIFSTYLE); } + /** Unsafe version of {@link #Reserved}. */ + public static byte nReserved(long struct) { return UNSAFE.getByte(null, struct + TT_PCLT.RESERVED); } + + // ----------------------------------- + + /** An array of {@link TT_PCLT} structs. */ + public static class Buffer extends StructBuffer { + + private static final TT_PCLT ELEMENT_FACTORY = TT_PCLT.create(-1L); + + /** + * Creates a new {@code TT_PCLT.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link TT_PCLT#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected TT_PCLT getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code Version} field. */ + @NativeType("FT_Fixed") + public long Version() { return TT_PCLT.nVersion(address()); } + /** @return the value of the {@code FontNumber} field. */ + @NativeType("FT_ULong") + public long FontNumber() { return TT_PCLT.nFontNumber(address()); } + /** @return the value of the {@code Pitch} field. */ + @NativeType("FT_UShort") + public short Pitch() { return TT_PCLT.nPitch(address()); } + /** @return the value of the {@code xHeight} field. */ + @NativeType("FT_UShort") + public short xHeight() { return TT_PCLT.nxHeight(address()); } + /** @return the value of the {@code Style} field. */ + @NativeType("FT_UShort") + public short Style() { return TT_PCLT.nStyle(address()); } + /** @return the value of the {@code TypeFamily} field. */ + @NativeType("FT_UShort") + public short TypeFamily() { return TT_PCLT.nTypeFamily(address()); } + /** @return the value of the {@code CapHeight} field. */ + @NativeType("FT_UShort") + public short CapHeight() { return TT_PCLT.nCapHeight(address()); } + /** @return the value of the {@code SymbolSet} field. */ + @NativeType("FT_UShort") + public short SymbolSet() { return TT_PCLT.nSymbolSet(address()); } + /** @return a {@link ByteBuffer} view of the {@code TypeFace} field. */ + @NativeType("FT_Char[16]") + public ByteBuffer TypeFace() { return TT_PCLT.nTypeFace(address()); } + /** @return the value at the specified index of the {@code TypeFace} field. */ + @NativeType("FT_Char") + public byte TypeFace(int index) { return TT_PCLT.nTypeFace(address(), index); } + /** @return a {@link ByteBuffer} view of the {@code CharacterComplement} field. */ + @NativeType("FT_Char[8]") + public ByteBuffer CharacterComplement() { return TT_PCLT.nCharacterComplement(address()); } + /** @return the value at the specified index of the {@code CharacterComplement} field. */ + @NativeType("FT_Char") + public byte CharacterComplement(int index) { return TT_PCLT.nCharacterComplement(address(), index); } + /** @return a {@link ByteBuffer} view of the {@code FileName} field. */ + @NativeType("FT_Char[6]") + public ByteBuffer FileName() { return TT_PCLT.nFileName(address()); } + /** @return the value at the specified index of the {@code FileName} field. */ + @NativeType("FT_Char") + public byte FileName(int index) { return TT_PCLT.nFileName(address(), index); } + /** @return the value of the {@code StrokeWeight} field. */ + @NativeType("FT_Char") + public byte StrokeWeight() { return TT_PCLT.nStrokeWeight(address()); } + /** @return the value of the {@code WidthType} field. */ + @NativeType("FT_Char") + public byte WidthType() { return TT_PCLT.nWidthType(address()); } + /** @return the value of the {@code SerifStyle} field. */ + @NativeType("FT_Byte") + public byte SerifStyle() { return TT_PCLT.nSerifStyle(address()); } + /** @return the value of the {@code Reserved} field. */ + @NativeType("FT_Byte") + public byte Reserved() { return TT_PCLT.nReserved(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_Postscript.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_Postscript.java new file mode 100644 index 000000000..0268220a2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_Postscript.java @@ -0,0 +1,249 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure to model a TrueType 'post' table. + * + *

    Layout

    + * + *
    
    + * struct TT_Postscript {
    + *     FT_Fixed FormatType;
    + *     FT_Fixed italicAngle;
    + *     FT_Short underlinePosition;
    + *     FT_Short underlineThickness;
    + *     FT_ULong isFixedPitch;
    + *     FT_ULong minMemType42;
    + *     FT_ULong maxMemType42;
    + *     FT_ULong minMemType1;
    + *     FT_ULong maxMemType1;
    + * }
    + */ +public class TT_Postscript extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + FORMATTYPE, + ITALICANGLE, + UNDERLINEPOSITION, + UNDERLINETHICKNESS, + ISFIXEDPITCH, + MINMEMTYPE42, + MAXMEMTYPE42, + MINMEMTYPE1, + MAXMEMTYPE1; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(2), + __member(2), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE), + __member(CLONG_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + FORMATTYPE = layout.offsetof(0); + ITALICANGLE = layout.offsetof(1); + UNDERLINEPOSITION = layout.offsetof(2); + UNDERLINETHICKNESS = layout.offsetof(3); + ISFIXEDPITCH = layout.offsetof(4); + MINMEMTYPE42 = layout.offsetof(5); + MAXMEMTYPE42 = layout.offsetof(6); + MINMEMTYPE1 = layout.offsetof(7); + MAXMEMTYPE1 = layout.offsetof(8); + } + + protected TT_Postscript(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected TT_Postscript create(long address, @Nullable ByteBuffer container) { + return new TT_Postscript(address, container); + } + + /** + * Creates a {@code TT_Postscript} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public TT_Postscript(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code FormatType} field. */ + @NativeType("FT_Fixed") + public long FormatType() { return nFormatType(address()); } + /** @return the value of the {@code italicAngle} field. */ + @NativeType("FT_Fixed") + public long italicAngle() { return nitalicAngle(address()); } + /** @return the value of the {@code underlinePosition} field. */ + @NativeType("FT_Short") + public short underlinePosition() { return nunderlinePosition(address()); } + /** @return the value of the {@code underlineThickness} field. */ + @NativeType("FT_Short") + public short underlineThickness() { return nunderlineThickness(address()); } + /** @return the value of the {@code isFixedPitch} field. */ + @NativeType("FT_ULong") + public long isFixedPitch() { return nisFixedPitch(address()); } + /** @return the value of the {@code minMemType42} field. */ + @NativeType("FT_ULong") + public long minMemType42() { return nminMemType42(address()); } + /** @return the value of the {@code maxMemType42} field. */ + @NativeType("FT_ULong") + public long maxMemType42() { return nmaxMemType42(address()); } + /** @return the value of the {@code minMemType1} field. */ + @NativeType("FT_ULong") + public long minMemType1() { return nminMemType1(address()); } + /** @return the value of the {@code maxMemType1} field. */ + @NativeType("FT_ULong") + public long maxMemType1() { return nmaxMemType1(address()); } + + // ----------------------------------- + + /** Returns a new {@code TT_Postscript} instance for the specified memory address. */ + public static TT_Postscript create(long address) { + return new TT_Postscript(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static TT_Postscript createSafe(long address) { + return address == NULL ? null : new TT_Postscript(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #FormatType}. */ + public static long nFormatType(long struct) { return memGetCLong(struct + TT_Postscript.FORMATTYPE); } + /** Unsafe version of {@link #italicAngle}. */ + public static long nitalicAngle(long struct) { return memGetCLong(struct + TT_Postscript.ITALICANGLE); } + /** Unsafe version of {@link #underlinePosition}. */ + public static short nunderlinePosition(long struct) { return UNSAFE.getShort(null, struct + TT_Postscript.UNDERLINEPOSITION); } + /** Unsafe version of {@link #underlineThickness}. */ + public static short nunderlineThickness(long struct) { return UNSAFE.getShort(null, struct + TT_Postscript.UNDERLINETHICKNESS); } + /** Unsafe version of {@link #isFixedPitch}. */ + public static long nisFixedPitch(long struct) { return memGetCLong(struct + TT_Postscript.ISFIXEDPITCH); } + /** Unsafe version of {@link #minMemType42}. */ + public static long nminMemType42(long struct) { return memGetCLong(struct + TT_Postscript.MINMEMTYPE42); } + /** Unsafe version of {@link #maxMemType42}. */ + public static long nmaxMemType42(long struct) { return memGetCLong(struct + TT_Postscript.MAXMEMTYPE42); } + /** Unsafe version of {@link #minMemType1}. */ + public static long nminMemType1(long struct) { return memGetCLong(struct + TT_Postscript.MINMEMTYPE1); } + /** Unsafe version of {@link #maxMemType1}. */ + public static long nmaxMemType1(long struct) { return memGetCLong(struct + TT_Postscript.MAXMEMTYPE1); } + + // ----------------------------------- + + /** An array of {@link TT_Postscript} structs. */ + public static class Buffer extends StructBuffer { + + private static final TT_Postscript ELEMENT_FACTORY = TT_Postscript.create(-1L); + + /** + * Creates a new {@code TT_Postscript.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link TT_Postscript#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected TT_Postscript getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code FormatType} field. */ + @NativeType("FT_Fixed") + public long FormatType() { return TT_Postscript.nFormatType(address()); } + /** @return the value of the {@code italicAngle} field. */ + @NativeType("FT_Fixed") + public long italicAngle() { return TT_Postscript.nitalicAngle(address()); } + /** @return the value of the {@code underlinePosition} field. */ + @NativeType("FT_Short") + public short underlinePosition() { return TT_Postscript.nunderlinePosition(address()); } + /** @return the value of the {@code underlineThickness} field. */ + @NativeType("FT_Short") + public short underlineThickness() { return TT_Postscript.nunderlineThickness(address()); } + /** @return the value of the {@code isFixedPitch} field. */ + @NativeType("FT_ULong") + public long isFixedPitch() { return TT_Postscript.nisFixedPitch(address()); } + /** @return the value of the {@code minMemType42} field. */ + @NativeType("FT_ULong") + public long minMemType42() { return TT_Postscript.nminMemType42(address()); } + /** @return the value of the {@code maxMemType42} field. */ + @NativeType("FT_ULong") + public long maxMemType42() { return TT_Postscript.nmaxMemType42(address()); } + /** @return the value of the {@code minMemType1} field. */ + @NativeType("FT_ULong") + public long minMemType1() { return TT_Postscript.nminMemType1(address()); } + /** @return the value of the {@code maxMemType1} field. */ + @NativeType("FT_ULong") + public long maxMemType1() { return TT_Postscript.nmaxMemType1(address()); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_VertHeader.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_VertHeader.java new file mode 100644 index 000000000..effba0b0b --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/TT_VertHeader.java @@ -0,0 +1,364 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.freetype; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * A structure used to model a TrueType vertical header, the {@code vhea} table, as well as the corresponding vertical metrics table, {@code vmtx}. + * + *

    Layout

    + * + *
    
    + * struct TT_VertHeader {
    + *     FT_Fixed Version;
    + *     FT_Short Ascender;
    + *     FT_Short Descender;
    + *     FT_Short Line_Gap;
    + *     FT_UShort {@link #advance_Height_Max};
    + *     FT_Short {@link #min_Top_Side_Bearing};
    + *     FT_Short {@link #min_Bottom_Side_Bearing};
    + *     FT_Short {@link #yMax_Extent};
    + *     FT_Short caret_Slope_Rise;
    + *     FT_Short caret_Slope_Run;
    + *     FT_Short caret_Offset;
    + *     FT_Short Reserved[4];
    + *     FT_Short metric_Data_Format;
    + *     FT_UShort number_Of_VMetrics;
    + *     void * long_metrics;
    + *     void * short_metrics;
    + * }
    + */ +public class TT_VertHeader extends Struct { + + /** The struct size in bytes. */ + public static final int SIZEOF; + + /** The struct alignment in bytes. */ + public static final int ALIGNOF; + + /** The struct member offsets. */ + public static final int + VERSION, + ASCENDER, + DESCENDER, + LINE_GAP, + ADVANCE_HEIGHT_MAX, + MIN_TOP_SIDE_BEARING, + MIN_BOTTOM_SIDE_BEARING, + YMAX_EXTENT, + CARET_SLOPE_RISE, + CARET_SLOPE_RUN, + CARET_OFFSET, + RESERVED, + METRIC_DATA_FORMAT, + NUMBER_OF_VMETRICS, + LONG_METRICS, + SHORT_METRICS; + + static { + Layout layout = __struct( + __member(CLONG_SIZE), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __member(2), + __array(2, 4), + __member(2), + __member(2), + __member(POINTER_SIZE), + __member(POINTER_SIZE) + ); + + SIZEOF = layout.getSize(); + ALIGNOF = layout.getAlignment(); + + VERSION = layout.offsetof(0); + ASCENDER = layout.offsetof(1); + DESCENDER = layout.offsetof(2); + LINE_GAP = layout.offsetof(3); + ADVANCE_HEIGHT_MAX = layout.offsetof(4); + MIN_TOP_SIDE_BEARING = layout.offsetof(5); + MIN_BOTTOM_SIDE_BEARING = layout.offsetof(6); + YMAX_EXTENT = layout.offsetof(7); + CARET_SLOPE_RISE = layout.offsetof(8); + CARET_SLOPE_RUN = layout.offsetof(9); + CARET_OFFSET = layout.offsetof(10); + RESERVED = layout.offsetof(11); + METRIC_DATA_FORMAT = layout.offsetof(12); + NUMBER_OF_VMETRICS = layout.offsetof(13); + LONG_METRICS = layout.offsetof(14); + SHORT_METRICS = layout.offsetof(15); + } + + protected TT_VertHeader(long address, @Nullable ByteBuffer container) { + super(address, container); + } + + @Override + protected TT_VertHeader create(long address, @Nullable ByteBuffer container) { + return new TT_VertHeader(address, container); + } + + /** + * Creates a {@code TT_VertHeader} instance at the current position of the specified {@link ByteBuffer} container. Changes to the buffer's content will be + * visible to the struct instance and vice versa. + * + *

    The created instance holds a strong reference to the container object.

    + */ + public TT_VertHeader(ByteBuffer container) { + super(memAddress(container), __checkContainer(container, SIZEOF)); + } + + @Override + public int sizeof() { return SIZEOF; } + + /** @return the value of the {@code Version} field. */ + @NativeType("FT_Fixed") + public long Version() { return nVersion(address()); } + /** @return the value of the {@code Ascender} field. */ + @NativeType("FT_Short") + public short Ascender() { return nAscender(address()); } + /** @return the value of the {@code Descender} field. */ + @NativeType("FT_Short") + public short Descender() { return nDescender(address()); } + /** @return the value of the {@code Line_Gap} field. */ + @NativeType("FT_Short") + public short Line_Gap() { return nLine_Gap(address()); } + /** advance height maximum */ + @NativeType("FT_UShort") + public short advance_Height_Max() { return nadvance_Height_Max(address()); } + /** minimum top-sb */ + @NativeType("FT_Short") + public short min_Top_Side_Bearing() { return nmin_Top_Side_Bearing(address()); } + /** minimum bottom-sb */ + @NativeType("FT_Short") + public short min_Bottom_Side_Bearing() { return nmin_Bottom_Side_Bearing(address()); } + /** ymax extents */ + @NativeType("FT_Short") + public short yMax_Extent() { return nyMax_Extent(address()); } + /** @return the value of the {@code caret_Slope_Rise} field. */ + @NativeType("FT_Short") + public short caret_Slope_Rise() { return ncaret_Slope_Rise(address()); } + /** @return the value of the {@code caret_Slope_Run} field. */ + @NativeType("FT_Short") + public short caret_Slope_Run() { return ncaret_Slope_Run(address()); } + /** @return the value of the {@code caret_Offset} field. */ + @NativeType("FT_Short") + public short caret_Offset() { return ncaret_Offset(address()); } + /** @return a {@link ShortBuffer} view of the {@code Reserved} field. */ + @NativeType("FT_Short[4]") + public ShortBuffer Reserved() { return nReserved(address()); } + /** @return the value at the specified index of the {@code Reserved} field. */ + @NativeType("FT_Short") + public short Reserved(int index) { return nReserved(address(), index); } + /** @return the value of the {@code metric_Data_Format} field. */ + @NativeType("FT_Short") + public short metric_Data_Format() { return nmetric_Data_Format(address()); } + /** @return the value of the {@code number_Of_VMetrics} field. */ + @NativeType("FT_UShort") + public short number_Of_VMetrics() { return nnumber_Of_VMetrics(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code long_metrics} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void *") + public ByteBuffer long_metrics(int capacity) { return nlong_metrics(address(), capacity); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code short_metrics} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void *") + public ByteBuffer short_metrics(int capacity) { return nshort_metrics(address(), capacity); } + + // ----------------------------------- + + /** Returns a new {@code TT_VertHeader} instance for the specified memory address. */ + public static TT_VertHeader create(long address) { + return new TT_VertHeader(address, null); + } + + /** Like {@link #create(long) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static TT_VertHeader createSafe(long address) { + return address == NULL ? null : new TT_VertHeader(address, null); + } + + /** + * Create a {@link Buffer} instance at the specified memory. + * + * @param address the memory address + * @param capacity the buffer capacity + */ + public static Buffer create(long address, int capacity) { + return new Buffer(address, capacity); + } + + /** Like {@link #create(long, int) create}, but returns {@code null} if {@code address} is {@code NULL}. */ + @Nullable + public static Buffer createSafe(long address, int capacity) { + return address == NULL ? null : new Buffer(address, capacity); + } + + // ----------------------------------- + + /** Unsafe version of {@link #Version}. */ + public static long nVersion(long struct) { return memGetCLong(struct + TT_VertHeader.VERSION); } + /** Unsafe version of {@link #Ascender}. */ + public static short nAscender(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.ASCENDER); } + /** Unsafe version of {@link #Descender}. */ + public static short nDescender(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.DESCENDER); } + /** Unsafe version of {@link #Line_Gap}. */ + public static short nLine_Gap(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.LINE_GAP); } + /** Unsafe version of {@link #advance_Height_Max}. */ + public static short nadvance_Height_Max(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.ADVANCE_HEIGHT_MAX); } + /** Unsafe version of {@link #min_Top_Side_Bearing}. */ + public static short nmin_Top_Side_Bearing(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.MIN_TOP_SIDE_BEARING); } + /** Unsafe version of {@link #min_Bottom_Side_Bearing}. */ + public static short nmin_Bottom_Side_Bearing(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.MIN_BOTTOM_SIDE_BEARING); } + /** Unsafe version of {@link #yMax_Extent}. */ + public static short nyMax_Extent(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.YMAX_EXTENT); } + /** Unsafe version of {@link #caret_Slope_Rise}. */ + public static short ncaret_Slope_Rise(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.CARET_SLOPE_RISE); } + /** Unsafe version of {@link #caret_Slope_Run}. */ + public static short ncaret_Slope_Run(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.CARET_SLOPE_RUN); } + /** Unsafe version of {@link #caret_Offset}. */ + public static short ncaret_Offset(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.CARET_OFFSET); } + /** Unsafe version of {@link #Reserved}. */ + public static ShortBuffer nReserved(long struct) { return memShortBuffer(struct + TT_VertHeader.RESERVED, 4); } + /** Unsafe version of {@link #Reserved(int) Reserved}. */ + public static short nReserved(long struct, int index) { + return UNSAFE.getShort(null, struct + TT_VertHeader.RESERVED + check(index, 4) * 2); + } + /** Unsafe version of {@link #metric_Data_Format}. */ + public static short nmetric_Data_Format(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.METRIC_DATA_FORMAT); } + /** Unsafe version of {@link #number_Of_VMetrics}. */ + public static short nnumber_Of_VMetrics(long struct) { return UNSAFE.getShort(null, struct + TT_VertHeader.NUMBER_OF_VMETRICS); } + /** Unsafe version of {@link #long_metrics(int) long_metrics}. */ + @Nullable public static ByteBuffer nlong_metrics(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + TT_VertHeader.LONG_METRICS), capacity); } + /** Unsafe version of {@link #short_metrics(int) short_metrics}. */ + @Nullable public static ByteBuffer nshort_metrics(long struct, int capacity) { return memByteBufferSafe(memGetAddress(struct + TT_VertHeader.SHORT_METRICS), capacity); } + + // ----------------------------------- + + /** An array of {@link TT_VertHeader} structs. */ + public static class Buffer extends StructBuffer { + + private static final TT_VertHeader ELEMENT_FACTORY = TT_VertHeader.create(-1L); + + /** + * Creates a new {@code TT_VertHeader.Buffer} instance backed by the specified container. + * + *

    Changes to the container's content will be visible to the struct buffer instance and vice versa. The two buffers' position, limit, and mark values + * will be independent. The new buffer's position will be zero, its capacity and its limit will be the number of bytes remaining in this buffer divided + * by {@link TT_VertHeader#SIZEOF}, and its mark will be undefined.

    + * + *

    The created buffer instance holds a strong reference to the container object.

    + */ + public Buffer(ByteBuffer container) { + super(container, container.remaining() / SIZEOF); + } + + public Buffer(long address, int cap) { + super(address, null, -1, 0, cap, cap); + } + + Buffer(long address, @Nullable ByteBuffer container, int mark, int pos, int lim, int cap) { + super(address, container, mark, pos, lim, cap); + } + + @Override + protected Buffer self() { + return this; + } + + @Override + protected TT_VertHeader getElementFactory() { + return ELEMENT_FACTORY; + } + + /** @return the value of the {@code Version} field. */ + @NativeType("FT_Fixed") + public long Version() { return TT_VertHeader.nVersion(address()); } + /** @return the value of the {@code Ascender} field. */ + @NativeType("FT_Short") + public short Ascender() { return TT_VertHeader.nAscender(address()); } + /** @return the value of the {@code Descender} field. */ + @NativeType("FT_Short") + public short Descender() { return TT_VertHeader.nDescender(address()); } + /** @return the value of the {@code Line_Gap} field. */ + @NativeType("FT_Short") + public short Line_Gap() { return TT_VertHeader.nLine_Gap(address()); } + /** @return the value of the {@link TT_VertHeader#advance_Height_Max} field. */ + @NativeType("FT_UShort") + public short advance_Height_Max() { return TT_VertHeader.nadvance_Height_Max(address()); } + /** @return the value of the {@link TT_VertHeader#min_Top_Side_Bearing} field. */ + @NativeType("FT_Short") + public short min_Top_Side_Bearing() { return TT_VertHeader.nmin_Top_Side_Bearing(address()); } + /** @return the value of the {@link TT_VertHeader#min_Bottom_Side_Bearing} field. */ + @NativeType("FT_Short") + public short min_Bottom_Side_Bearing() { return TT_VertHeader.nmin_Bottom_Side_Bearing(address()); } + /** @return the value of the {@link TT_VertHeader#yMax_Extent} field. */ + @NativeType("FT_Short") + public short yMax_Extent() { return TT_VertHeader.nyMax_Extent(address()); } + /** @return the value of the {@code caret_Slope_Rise} field. */ + @NativeType("FT_Short") + public short caret_Slope_Rise() { return TT_VertHeader.ncaret_Slope_Rise(address()); } + /** @return the value of the {@code caret_Slope_Run} field. */ + @NativeType("FT_Short") + public short caret_Slope_Run() { return TT_VertHeader.ncaret_Slope_Run(address()); } + /** @return the value of the {@code caret_Offset} field. */ + @NativeType("FT_Short") + public short caret_Offset() { return TT_VertHeader.ncaret_Offset(address()); } + /** @return a {@link ShortBuffer} view of the {@code Reserved} field. */ + @NativeType("FT_Short[4]") + public ShortBuffer Reserved() { return TT_VertHeader.nReserved(address()); } + /** @return the value at the specified index of the {@code Reserved} field. */ + @NativeType("FT_Short") + public short Reserved(int index) { return TT_VertHeader.nReserved(address(), index); } + /** @return the value of the {@code metric_Data_Format} field. */ + @NativeType("FT_Short") + public short metric_Data_Format() { return TT_VertHeader.nmetric_Data_Format(address()); } + /** @return the value of the {@code number_Of_VMetrics} field. */ + @NativeType("FT_UShort") + public short number_Of_VMetrics() { return TT_VertHeader.nnumber_Of_VMetrics(address()); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code long_metrics} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void *") + public ByteBuffer long_metrics(int capacity) { return TT_VertHeader.nlong_metrics(address(), capacity); } + /** + * @return a {@link ByteBuffer} view of the data pointed to by the {@code short_metrics} field. + * + * @param capacity the number of elements in the returned buffer + */ + @Nullable + @NativeType("void *") + public ByteBuffer short_metrics(int capacity) { return TT_VertHeader.nshort_metrics(address(), capacity); } + + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/package-info.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/package-info.java new file mode 100644 index 000000000..13e53fdb0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/freetype/package-info.java @@ -0,0 +1,15 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ + +/** + * Contains bindings to the FreeType, a freely available software library to render fonts. + * + *

    It is written in C, designed to be small, efficient, highly customizable, and portable while capable of producing high-quality output (glyph images) of + * most vector and bitmap font formats.

    + */ +@org.lwjgl.system.NonnullDefault +package org.lwjgl.util.freetype; + diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Cylinder.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Cylinder.java new file mode 100644 index 000000000..87166a0f3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Cylinder.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +import static org.lwjgl.opengl.GL11.GL_LINES; +import static org.lwjgl.opengl.GL11.GL_LINE_LOOP; +import static org.lwjgl.opengl.GL11.GL_POINTS; +import static org.lwjgl.opengl.GL11.GL_QUAD_STRIP; +import static org.lwjgl.opengl.GL11.glBegin; +import static org.lwjgl.opengl.GL11.glEnd; +import static org.lwjgl.opengl.GL11.glVertex3f; +import static org.lwjgl.util.glu.GLU.GLU_FILL; +import static org.lwjgl.util.glu.GLU.GLU_INSIDE; +import static org.lwjgl.util.glu.GLU.GLU_LINE; +import static org.lwjgl.util.glu.GLU.GLU_POINT; +import static org.lwjgl.util.glu.GLU.GLU_SILHOUETTE; +import static org.lwjgl.util.glu.GLU.PI; + +/** + * Cylinder.java + * + * + * Created 23-dec-2003 + * @author Erik Duijs + */ +public class Cylinder extends Quadric { + + /** + * Constructor for Cylinder. + */ + public Cylinder() { + super(); + } + + /** + * draws a cylinder oriented along the z axis. The base of the + * cylinder is placed at z = 0, and the top at z=height. Like a sphere, a + * cylinder is subdivided around the z axis into slices, and along the z axis + * into stacks. + * + * Note that if topRadius is set to zero, then this routine will generate a + * cone. + * + * If the orientation is set to GLU.OUTSIDE (with glu.quadricOrientation), then + * any generated normals point away from the z axis. Otherwise, they point + * toward the z axis. + * + * If texturing is turned on (with glu.quadricTexture), then texture + * coordinates are generated so that t ranges linearly from 0.0 at z = 0 to + * 1.0 at z = height, and s ranges from 0.0 at the +y axis, to 0.25 at the +x + * axis, to 0.5 at the -y axis, to 0.75 at the -x axis, and back to 1.0 at the + * +y axis. + * + * @param baseRadius Specifies the radius of the cylinder at z = 0. + * @param topRadius Specifies the radius of the cylinder at z = height. + * @param height Specifies the height of the cylinder. + * @param slices Specifies the number of subdivisions around the z axis. + * @param stacks Specifies the number of subdivisions along the z axis. + */ + public void draw(float baseRadius, float topRadius, float height, int slices, int stacks) { + + float da, r, dr, dz; + float x, y, z, nz, nsign; + int i, j; + + if (super.orientation == GLU_INSIDE) { + nsign = -1.0f; + } else { + nsign = 1.0f; + } + + da = 2.0f * PI / slices; + dr = (topRadius - baseRadius) / stacks; + dz = height / stacks; + nz = (baseRadius - topRadius) / height; + // Z component of normal vectors + + if (super.drawStyle == GLU_POINT) { + glBegin(GL_POINTS); + for (i = 0; i < slices; i++) { + x = cos((i * da)); + y = sin((i * da)); + normal3f(x * nsign, y * nsign, nz * nsign); + + z = 0.0f; + r = baseRadius; + for (j = 0; j <= stacks; j++) { + glVertex3f((x * r), (y * r), z); + z += dz; + r += dr; + } + } + glEnd(); + } else if (super.drawStyle == GLU_LINE || super.drawStyle == GLU_SILHOUETTE) { + // Draw rings + if (super.drawStyle == GLU_LINE) { + z = 0.0f; + r = baseRadius; + for (j = 0; j <= stacks; j++) { + glBegin(GL_LINE_LOOP); + for (i = 0; i < slices; i++) { + x = cos((i * da)); + y = sin((i * da)); + normal3f(x * nsign, y * nsign, nz * nsign); + glVertex3f((x * r), (y * r), z); + } + glEnd(); + z += dz; + r += dr; + } + } else { + // draw one ring at each end + if (baseRadius != 0.0) { + glBegin(GL_LINE_LOOP); + for (i = 0; i < slices; i++) { + x = cos((i * da)); + y = sin((i * da)); + normal3f(x * nsign, y * nsign, nz * nsign); + glVertex3f((x * baseRadius), (y * baseRadius), 0.0f); + } + glEnd(); + glBegin(GL_LINE_LOOP); + for (i = 0; i < slices; i++) { + x = cos((i * da)); + y = sin((i * da)); + normal3f(x * nsign, y * nsign, nz * nsign); + glVertex3f((x * topRadius), (y * topRadius), height); + } + glEnd(); + } + } + // draw length lines + glBegin(GL_LINES); + for (i = 0; i < slices; i++) { + x = cos((i * da)); + y = sin((i * da)); + normal3f(x * nsign, y * nsign, nz * nsign); + glVertex3f((x * baseRadius), (y * baseRadius), 0.0f); + glVertex3f((x * topRadius), (y * topRadius), (height)); + } + glEnd(); + } else if (super.drawStyle == GLU_FILL) { + float ds = 1.0f / slices; + float dt = 1.0f / stacks; + float t = 0.0f; + z = 0.0f; + r = baseRadius; + for (j = 0; j < stacks; j++) { + float s = 0.0f; + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= slices; i++) { + if (i == slices) { + x = sin(0.0f); + y = cos(0.0f); + } else { + x = sin((i * da)); + y = cos((i * da)); + } + if (nsign == 1.0f) { + normal3f((x * nsign), (y * nsign), (nz * nsign)); + TXTR_COORD(s, t); + glVertex3f((x * r), (y * r), z); + normal3f((x * nsign), (y * nsign), (nz * nsign)); + TXTR_COORD(s, t + dt); + glVertex3f((x * (r + dr)), (y * (r + dr)), (z + dz)); + } else { + normal3f(x * nsign, y * nsign, nz * nsign); + TXTR_COORD(s, t); + glVertex3f((x * r), (y * r), z); + normal3f(x * nsign, y * nsign, nz * nsign); + TXTR_COORD(s, t + dt); + glVertex3f((x * (r + dr)), (y * (r + dr)), (z + dz)); + } + s += ds; + } // for slices + glEnd(); + r += dr; + t += dt; + z += dz; + } // for stacks + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Disk.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Disk.java new file mode 100644 index 000000000..9fbed43c2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Disk.java @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +import static org.lwjgl.opengl.GL11.GL_LINE_LOOP; +import static org.lwjgl.opengl.GL11.GL_LINE_STRIP; +import static org.lwjgl.opengl.GL11.GL_POINTS; +import static org.lwjgl.opengl.GL11.GL_QUAD_STRIP; +import static org.lwjgl.opengl.GL11.glBegin; +import static org.lwjgl.opengl.GL11.glEnd; +import static org.lwjgl.opengl.GL11.glNormal3f; +import static org.lwjgl.opengl.GL11.glVertex2f; +import static org.lwjgl.util.glu.GLU.GLU_FILL; +import static org.lwjgl.util.glu.GLU.GLU_LINE; +import static org.lwjgl.util.glu.GLU.GLU_NONE; +import static org.lwjgl.util.glu.GLU.GLU_OUTSIDE; +import static org.lwjgl.util.glu.GLU.GLU_POINT; +import static org.lwjgl.util.glu.GLU.GLU_SILHOUETTE; +import static org.lwjgl.util.glu.GLU.PI; + +/** + * Disk.java + * + * + * Created 23-dec-2003 + * @author Erik Duijs + */ +public class Disk extends Quadric { + + /** + * Constructor for Disk. + */ + public Disk() { + super(); + } + + /** + * renders a disk on the z = 0 plane. The disk has a radius of + * outerRadius, and contains a concentric circular hole with a radius of + * innerRadius. If innerRadius is 0, then no hole is generated. The disk is + * subdivided around the z axis into slices (like pizza slices), and also + * about the z axis into rings (as specified by slices and loops, + * respectively). + * + * With respect to orientation, the +z side of the disk is considered to be + * "outside" (see glu.quadricOrientation). This means that if the orientation + * is set to GLU.OUTSIDE, then any normals generated point along the +z axis. + * Otherwise, they point along the -z axis. + * + * If texturing is turned on (with glu.quadricTexture), texture coordinates are + * generated linearly such that where r=outerRadius, the value at (r, 0, 0) is + * (1, 0.5), at (0, r, 0) it is (0.5, 1), at (-r, 0, 0) it is (0, 0.5), and at + * (0, -r, 0) it is (0.5, 0). + */ + public void draw(float innerRadius, float outerRadius, int slices, int loops) + { + float da, dr; + + /* Normal vectors */ + if (super.normals != GLU_NONE) { + if (super.orientation == GLU_OUTSIDE) { + glNormal3f(0.0f, 0.0f, +1.0f); + } + else { + glNormal3f(0.0f, 0.0f, -1.0f); + } + } + + da = 2.0f * PI / slices; + dr = (outerRadius - innerRadius) / loops; + + switch (super.drawStyle) { + case GLU_FILL: + { + /* texture of a gluDisk is a cut out of the texture unit square + * x, y in [-outerRadius, +outerRadius]; s, t in [0, 1] + * (linear mapping) + */ + float dtc = 2.0f * outerRadius; + float sa, ca; + float r1 = innerRadius; + int l; + for (l = 0; l < loops; l++) { + float r2 = r1 + dr; + if (super.orientation == GLU_OUTSIDE) { + int s; + glBegin(GL_QUAD_STRIP); + for (s = 0; s <= slices; s++) { + float a; + if (s == slices) + a = 0.0f; + else + a = s * da; + sa = sin(a); + ca = cos(a); + TXTR_COORD(0.5f + sa * r2 / dtc, 0.5f + ca * r2 / dtc); + glVertex2f(r2 * sa, r2 * ca); + TXTR_COORD(0.5f + sa * r1 / dtc, 0.5f + ca * r1 / dtc); + glVertex2f(r1 * sa, r1 * ca); + } + glEnd(); + } + else { + int s; + glBegin(GL_QUAD_STRIP); + for (s = slices; s >= 0; s--) { + float a; + if (s == slices) + a = 0.0f; + else + a = s * da; + sa = sin(a); + ca = cos(a); + TXTR_COORD(0.5f - sa * r2 / dtc, 0.5f + ca * r2 / dtc); + glVertex2f(r2 * sa, r2 * ca); + TXTR_COORD(0.5f - sa * r1 / dtc, 0.5f + ca * r1 / dtc); + glVertex2f(r1 * sa, r1 * ca); + } + glEnd(); + } + r1 = r2; + } + break; + } + case GLU_LINE: + { + int l, s; + /* draw loops */ + for (l = 0; l <= loops; l++) { + float r = innerRadius + l * dr; + glBegin(GL_LINE_LOOP); + for (s = 0; s < slices; s++) { + float a = s * da; + glVertex2f(r * sin(a), r * cos(a)); + } + glEnd(); + } + /* draw spokes */ + for (s = 0; s < slices; s++) { + float a = s * da; + float x = sin(a); + float y = cos(a); + glBegin(GL_LINE_STRIP); + for (l = 0; l <= loops; l++) { + float r = innerRadius + l * dr; + glVertex2f(r * x, r * y); + } + glEnd(); + } + break; + } + case GLU_POINT: + { + int s; + glBegin(GL_POINTS); + for (s = 0; s < slices; s++) { + float a = s * da; + float x = sin(a); + float y = cos(a); + int l; + for (l = 0; l <= loops; l++) { + float r = innerRadius * l * dr; + glVertex2f(r * x, r * y); + } + } + glEnd(); + break; + } + case GLU_SILHOUETTE: + { + if (innerRadius != 0.0) { + float a; + glBegin(GL_LINE_LOOP); + for (a = 0.0f; a < 2.0 * PI; a += da) { + float x = innerRadius * sin(a); + float y = innerRadius * cos(a); + glVertex2f(x, y); + } + glEnd(); + } + { + float a; + glBegin(GL_LINE_LOOP); + for (a = 0; a < 2.0f * PI; a += da) { + float x = outerRadius * sin(a); + float y = outerRadius * cos(a); + glVertex2f(x, y); + } + glEnd(); + } + break; + } + default: + return; + } + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLU.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLU.java new file mode 100644 index 000000000..bf57e42dd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLU.java @@ -0,0 +1,430 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +import static org.lwjgl.opengl.GL11.glOrtho; + +import org.lwjgl.opengl.Util; +import org.lwjgl.util.glu.tessellation.GLUtessellatorImpl; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +/** + * GLU.java + * + * + * Created 23-dec-2003 + * @author Erik Duijs + */ +public class GLU { + static final float PI = (float)Math.PI; + + /* Errors: (return value 0 = no error) */ + public static final int GLU_INVALID_ENUM = 100900; + public static final int GLU_INVALID_VALUE = 100901; + public static final int GLU_OUT_OF_MEMORY = 100902; + public static final int GLU_INCOMPATIBLE_GL_VERSION = 100903; + + /* StringName */ + public static final int GLU_VERSION = 100800; + public static final int GLU_EXTENSIONS = 100801; + + /* Boolean */ + public static final boolean GLU_TRUE = true; + public static final boolean GLU_FALSE = false; + + + /**** Quadric constants ****/ + + /* QuadricNormal */ + public static final int GLU_SMOOTH = 100000; + public static final int GLU_FLAT = 100001; + public static final int GLU_NONE = 100002; + + /* QuadricDrawStyle */ + public static final int GLU_POINT = 100010; + public static final int GLU_LINE = 100011; + public static final int GLU_FILL = 100012; + public static final int GLU_SILHOUETTE = 100013; + + /* QuadricOrientation */ + public static final int GLU_OUTSIDE = 100020; + public static final int GLU_INSIDE = 100021; + + /* Callback types: */ + /* ERROR = 100103 */ + + + /**** Tesselation constants ****/ + + public static final double GLU_TESS_MAX_COORD = 1.0e150; + public static final double TESS_MAX_COORD = 1.0e150; + + /* TessProperty */ + public static final int GLU_TESS_WINDING_RULE = 100140; + public static final int GLU_TESS_BOUNDARY_ONLY = 100141; + public static final int GLU_TESS_TOLERANCE = 100142; + + /* TessWinding */ + public static final int GLU_TESS_WINDING_ODD = 100130; + public static final int GLU_TESS_WINDING_NONZERO = 100131; + public static final int GLU_TESS_WINDING_POSITIVE = 100132; + public static final int GLU_TESS_WINDING_NEGATIVE = 100133; + public static final int GLU_TESS_WINDING_ABS_GEQ_TWO = 100134; + + /* TessCallback */ + public static final int GLU_TESS_BEGIN = 100100; /* void (CALLBACK*)(GLenum type) */ + public static final int GLU_TESS_VERTEX = 100101; /* void (CALLBACK*)(void *data) */ + public static final int GLU_TESS_END = 100102; /* void (CALLBACK*)(void) */ + public static final int GLU_TESS_ERROR = 100103; /* void (CALLBACK*)(GLenum errno) */ + public static final int GLU_TESS_EDGE_FLAG = 100104; /* void (CALLBACK*)(GLboolean boundaryEdge) */ + public static final int GLU_TESS_COMBINE = 100105; /* void (CALLBACK*)(GLdouble coords[3], + void *data[4], + GLfloat weight[4], + void **dataOut) */ + public static final int GLU_TESS_BEGIN_DATA = 100106; /* void (CALLBACK*)(GLenum type, + void *polygon_data) */ + public static final int GLU_TESS_VERTEX_DATA = 100107; /* void (CALLBACK*)(void *data, + void *polygon_data) */ + public static final int GLU_TESS_END_DATA = 100108; /* void (CALLBACK*)(void *polygon_data) */ + public static final int GLU_TESS_ERROR_DATA = 100109; /* void (CALLBACK*)(GLenum errno, + void *polygon_data) */ + public static final int GLU_TESS_EDGE_FLAG_DATA = 100110; /* void (CALLBACK*)(GLboolean boundaryEdge, + void *polygon_data) */ + public static final int GLU_TESS_COMBINE_DATA = 100111; /* void (CALLBACK*)(GLdouble coords[3], + void *data[4], + GLfloat weight[4], + void **dataOut, + void *polygon_data) */ + + /* TessError */ + public static final int GLU_TESS_ERROR1 = 100151; + public static final int GLU_TESS_ERROR2 = 100152; + public static final int GLU_TESS_ERROR3 = 100153; + public static final int GLU_TESS_ERROR4 = 100154; + public static final int GLU_TESS_ERROR5 = 100155; + public static final int GLU_TESS_ERROR6 = 100156; + public static final int GLU_TESS_ERROR7 = 100157; + public static final int GLU_TESS_ERROR8 = 100158; + + public static final int GLU_TESS_MISSING_BEGIN_POLYGON = GLU_TESS_ERROR1; + public static final int GLU_TESS_MISSING_BEGIN_CONTOUR = GLU_TESS_ERROR2; + public static final int GLU_TESS_MISSING_END_POLYGON = GLU_TESS_ERROR3; + public static final int GLU_TESS_MISSING_END_CONTOUR = GLU_TESS_ERROR4; + public static final int GLU_TESS_COORD_TOO_LARGE = GLU_TESS_ERROR5; + public static final int GLU_TESS_NEED_COMBINE_CALLBACK = GLU_TESS_ERROR6; + + /**** NURBS constants ****/ + + /* NurbsProperty */ + public static final int GLU_AUTO_LOAD_MATRIX = 100200; + public static final int GLU_CULLING = 100201; + public static final int GLU_SAMPLING_TOLERANCE = 100203; + public static final int GLU_DISPLAY_MODE = 100204; + public static final int GLU_PARAMETRIC_TOLERANCE = 100202; + public static final int GLU_SAMPLING_METHOD = 100205; + public static final int GLU_U_STEP = 100206; + public static final int GLU_V_STEP = 100207; + + /* NurbsSampling */ + public static final int GLU_PATH_LENGTH = 100215; + public static final int GLU_PARAMETRIC_ERROR = 100216; + public static final int GLU_DOMAIN_DISTANCE = 100217; + + + /* NurbsTrim */ + public static final int GLU_MAP1_TRIM_2 = 100210; + public static final int GLU_MAP1_TRIM_3 = 100211; + + /* NurbsDisplay */ + /* FILL = 100012 */ + public static final int GLU_OUTLINE_POLYGON = 100240; + public static final int GLU_OUTLINE_PATCH = 100241; + + /* NurbsCallback */ + /* ERROR = 100103 */ + + /* NurbsErrors */ + public static final int GLU_NURBS_ERROR1 = 100251; + public static final int GLU_NURBS_ERROR2 = 100252; + public static final int GLU_NURBS_ERROR3 = 100253; + public static final int GLU_NURBS_ERROR4 = 100254; + public static final int GLU_NURBS_ERROR5 = 100255; + public static final int GLU_NURBS_ERROR6 = 100256; + public static final int GLU_NURBS_ERROR7 = 100257; + public static final int GLU_NURBS_ERROR8 = 100258; + public static final int GLU_NURBS_ERROR9 = 100259; + public static final int GLU_NURBS_ERROR10 = 100260; + public static final int GLU_NURBS_ERROR11 = 100261; + public static final int GLU_NURBS_ERROR12 = 100262; + public static final int GLU_NURBS_ERROR13 = 100263; + public static final int GLU_NURBS_ERROR14 = 100264; + public static final int GLU_NURBS_ERROR15 = 100265; + public static final int GLU_NURBS_ERROR16 = 100266; + public static final int GLU_NURBS_ERROR17 = 100267; + public static final int GLU_NURBS_ERROR18 = 100268; + public static final int GLU_NURBS_ERROR19 = 100269; + public static final int GLU_NURBS_ERROR20 = 100270; + public static final int GLU_NURBS_ERROR21 = 100271; + public static final int GLU_NURBS_ERROR22 = 100272; + public static final int GLU_NURBS_ERROR23 = 100273; + public static final int GLU_NURBS_ERROR24 = 100274; + public static final int GLU_NURBS_ERROR25 = 100275; + public static final int GLU_NURBS_ERROR26 = 100276; + public static final int GLU_NURBS_ERROR27 = 100277; + public static final int GLU_NURBS_ERROR28 = 100278; + public static final int GLU_NURBS_ERROR29 = 100279; + public static final int GLU_NURBS_ERROR30 = 100280; + public static final int GLU_NURBS_ERROR31 = 100281; + public static final int GLU_NURBS_ERROR32 = 100282; + public static final int GLU_NURBS_ERROR33 = 100283; + public static final int GLU_NURBS_ERROR34 = 100284; + public static final int GLU_NURBS_ERROR35 = 100285; + public static final int GLU_NURBS_ERROR36 = 100286; + public static final int GLU_NURBS_ERROR37 = 100287; + + /* Contours types -- obsolete! */ + public static final int GLU_CW = 100120; + public static final int GLU_CCW = 100121; + public static final int GLU_INTERIOR = 100122; + public static final int GLU_EXTERIOR = 100123; + public static final int GLU_UNKNOWN = 100124; + + /* Names without "TESS_" prefix */ + public static final int GLU_BEGIN = GLU_TESS_BEGIN; + public static final int GLU_VERTEX = GLU_TESS_VERTEX; + public static final int GLU_END = GLU_TESS_END; + public static final int GLU_ERROR = GLU_TESS_ERROR; + public static final int GLU_EDGE_FLAG = GLU_TESS_EDGE_FLAG; + + /** + * Method gluLookAt + * @param eyex + * @param eyey + * @param eyez + * @param centerx + * @param centery + * @param centerz + * @param upx + * @param upy + * @param upz + */ + public static void gluLookAt( + float eyex, + float eyey, + float eyez, + float centerx, + float centery, + float centerz, + float upx, + float upy, + float upz) { + + Project.gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz); + } + + /** + * Method gluOrtho2D + * @param left + * @param right + * @param bottom + * @param top + */ + public static void gluOrtho2D( + float left, + float right, + float bottom, + float top) { + + glOrtho(left, right, bottom, top, -1.0, 1.0); + } + + /** + * Method gluPerspective + * @param fovy + * @param aspect + * @param zNear + * @param zFar + */ + public static void gluPerspective( + float fovy, + float aspect, + float zNear, + float zFar) { + + Project.gluPerspective(fovy, aspect, zNear, zFar); + } + + /** + * Method gluProject + * @param objx + * @param objy + * @param objz + * @param modelMatrix + * @param projMatrix + * @param viewport + * @param win_pos + */ + public static boolean gluProject(float objx, float objy, float objz, + FloatBuffer modelMatrix, + FloatBuffer projMatrix, + IntBuffer viewport, + FloatBuffer win_pos) + { + return Project.gluProject(objx, objy, objz, modelMatrix, projMatrix, viewport, win_pos); + } + + /** + * Method gluUnproject + * @param winx + * @param winy + * @param winz + * @param modelMatrix + * @param projMatrix + * @param viewport + * @param obj_pos + */ + public static boolean gluUnProject(float winx, float winy, float winz, + FloatBuffer modelMatrix, + FloatBuffer projMatrix, + IntBuffer viewport, + FloatBuffer obj_pos) + { + return Project.gluUnProject(winx, winy, winz, modelMatrix, projMatrix, viewport, obj_pos); + } + + /** + * Method gluPickMatrix + * @param x + * @param y + * @param width + * @param height + * @param viewport + */ + public static void gluPickMatrix( + float x, + float y, + float width, + float height, + IntBuffer viewport) { + + Project.gluPickMatrix(x, y, width, height, viewport); + } + + /** + * Method gluGetString. + * @param name + * @return String + */ + public static String gluGetString(int name) { + return Registry.gluGetString(name); + } + + /** + * Method gluCheckExtension. + * @param extName + * @param extString + * @return boolean + */ + public static boolean gluCheckExtension(String extName, String extString) { + return Registry.gluCheckExtension(extName, extString); + } + + /** + * Method gluBuild2DMipmaps + * @param target + * @param components + * @param width + * @param height + * @param format + * @param type + * @param data + * @return int + */ + public static int gluBuild2DMipmaps( + int target, + int components, + int width, + int height, + int format, + int type, + ByteBuffer data) { + + return MipMap.gluBuild2DMipmaps(target, components, width, height, format, type, data); + } + + /** + * Method gluScaleImage. + * @param format + * @param widthIn + * @param heightIn + * @param typeIn + * @param dataIn + * @param widthOut + * @param heightOut + * @param typeOut + * @param dataOut + * @return int + */ + public static int gluScaleImage( + int format, + int widthIn, + int heightIn, + int typeIn, + ByteBuffer dataIn, + int widthOut, + int heightOut, + int typeOut, + ByteBuffer dataOut) { + + return MipMap.gluScaleImage(format, widthIn, heightIn, typeIn, dataIn, widthOut, heightOut, typeOut, dataOut); + } + + public static String gluErrorString(int error_code) { + switch (error_code) { + case GLU_INVALID_ENUM: + return "Invalid enum (glu)"; + case GLU_INVALID_VALUE: + return "Invalid value (glu)"; + case GLU_OUT_OF_MEMORY: + return "Out of memory (glu)"; + default: + return Util.translateGLErrorString(error_code); + } + } + + public static GLUtessellator gluNewTess() { + return new GLUtessellatorImpl(); + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellator.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellator.java new file mode 100644 index 000000000..60bf2c241 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellator.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +public interface GLUtessellator { + + void gluDeleteTess(); + + void gluTessProperty(int which, double value); + + /* Returns tessellator property */ + void gluGetTessProperty(int which, double[] value, + int value_offset); /* gluGetTessProperty() */ + + void gluTessNormal(double x, double y, double z); + + void gluTessCallback(int which, + GLUtessellatorCallback aCallback); + + void gluTessVertex(double[] coords, int coords_offset, + Object vertexData); + + void gluTessBeginPolygon(Object data); + + void gluTessBeginContour(); + + void gluTessEndContour(); + + void gluTessEndPolygon(); + + /*******************************************************/ + + /* Obsolete calls -- for backward compatibility */ + + void gluBeginPolygon(); + + /*ARGSUSED*/ + void gluNextContour(int type); + + void gluEndPolygon(); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellatorCallback.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellatorCallback.java new file mode 100644 index 000000000..0f913f778 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellatorCallback.java @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu; + +/** + * GLUtessellatorCallback interface provides methods that the user will + * override to define the callbacks for a tessellation object. + * + * @author Eric Veach, July 1994 + * @author Java Port: Pepijn Van Eeckhoudt, July 2003 + * @author Java Port: Nathan Parker Burg, August 2003 + */ +public interface GLUtessellatorCallback { + /** + * The begin callback method is invoked like + * {@link javax.media.opengl.GL#glBegin glBegin} to indicate the start of a + * (triangle) primitive. The method takes a single argument of type int. If + * the GLU_TESS_BOUNDARY_ONLY property is set to GL_FALSE, then + * the argument is set to either GL_TRIANGLE_FAN, + * GL_TRIANGLE_STRIP, or GL_TRIANGLES. If the + * GLU_TESS_BOUNDARY_ONLY property is set to GL_TRUE, then the + * argument will be set to GL_LINE_LOOP. + * + * @param type + * Specifics the type of begin/end pair being defined. The following + * values are valid: GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, + * GL_TRIANGLES or GL_LINE_LOOP. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #end end + * @see #begin begin + */ + void begin(int type); + + /** + * The same as the {@link #begin begin} callback method except that + * it takes an additional reference argument. This reference is + * identical to the opaque reference provided when {@link + * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param type + * Specifics the type of begin/end pair being defined. The following + * values are valid: GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, + * GL_TRIANGLES or GL_LINE_LOOP. + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #endData endData + * @see #begin begin + */ + void beginData(int type, Object polygonData); + + + /** + * The edgeFlag callback method is similar to + * {@link javax.media.opengl.GL#glEdgeFlag glEdgeFlag}. The method takes + * a single boolean boundaryEdge that indicates which edges lie on the + * polygon boundary. If the boundaryEdge is GL_TRUE, then each vertex + * that follows begins an edge that lies on the polygon boundary, that is, + * an edge that separates an interior region from an exterior one. If the + * boundaryEdge is GL_FALSE, then each vertex that follows begins an + * edge that lies in the polygon interior. The edge flag callback (if + * defined) is invoked before the first vertex callback.

    + * + * Since triangle fans and triangle strips do not support edge flags, the + * begin callback is not called with GL_TRIANGLE_FAN or + * GL_TRIANGLE_STRIP if a non-null edge flag callback is provided. + * (If the callback is initialized to null, there is no impact on + * performance). Instead, the fans and strips are converted to independent + * triangles. + * + * @param boundaryEdge + * Specifics which edges lie on the polygon boundary. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #edgeFlagData edgeFlagData + */ + void edgeFlag(boolean boundaryEdge); + + + /** + * The same as the {@link #edgeFlag edgeFlage} callback method + * except that it takes an additional reference argument. This + * reference is identical to the opaque reference provided when + * {@link GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param boundaryEdge + * Specifics which edges lie on the polygon boundary. + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #edgeFlag edgeFlag + */ + void edgeFlagData(boolean boundaryEdge, Object polygonData); + + + /** + * The vertex callback method is invoked between the {@link + * #begin begin} and {@link #end end} callback methods. It is + * similar to {@link javax.media.opengl.GL#glVertex3f glVertex3f}, + * and it defines the vertices of the triangles created by the + * tessellation process. The method takes a reference as its only + * argument. This reference is identical to the opaque reference + * provided by the user when the vertex was described (see {@link + * GLU#gluTessVertex gluTessVertex}). + * + * @param vertexData + * Specifics a reference to the vertices of the triangles created + * byt the tessellatin process. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #vertexData vertexData + */ + void vertex(Object vertexData); + + + /** + * The same as the {@link #vertex vertex} callback method except + * that it takes an additional reference argument. This reference is + * identical to the opaque reference provided when {@link + * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param vertexData + * Specifics a reference to the vertices of the triangles created + * byt the tessellatin process. + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #vertex vertex + */ + void vertexData(Object vertexData, Object polygonData); + + + /** + * The end callback serves the same purpose as + * {@link javax.media.opengl.GL#glEnd glEnd}. It indicates the end of a + * primitive and it takes no arguments. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #begin begin + * @see #endData endData + */ + void end(); + + + /** + * The same as the {@link #end end} callback method except that it + * takes an additional reference argument. This reference is + * identical to the opaque reference provided when {@link + * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #beginData beginData + * @see #end end + */ + void endData(Object polygonData); + + + /** + * The combine callback method is called to create a new vertex when + * the tessellation detects an intersection, or wishes to merge features. The + * method takes four arguments: an array of three elements each of type + * double, an array of four references, an array of four elements each of + * type float, and a reference to a reference.

    + * + * The vertex is defined as a linear combination of up to four existing + * vertices, stored in data. The coefficients of the linear combination + * are given by weight; these weights always add up to 1. All vertex + * pointers are valid even when some of the weights are 0. coords gives + * the location of the new vertex.

    + * + * The user must allocate another vertex, interpolate parameters using + * data and weight, and return the new vertex pointer in + * outData. This handle is supplied during rendering callbacks. The + * user is responsible for freeing the memory some time after + * {@link GLU#gluTessEndPolygon gluTessEndPolygon} is + * called.

    + * + * For example, if the polygon lies in an arbitrary plane in 3-space, and a + * color is associated with each vertex, the GLU_TESS_COMBINE + * callback might look like this: + * + *

    +   *         void myCombine(double[] coords, Object[] data,
    +   *                        float[] weight, Object[] outData)
    +   *         {
    +   *            MyVertex newVertex = new MyVertex();
    +   *
    +   *            newVertex.x = coords[0];
    +   *            newVertex.y = coords[1];
    +   *            newVertex.z = coords[2];
    +   *            newVertex.r = weight[0]*data[0].r +
    +   *                          weight[1]*data[1].r +
    +   *                          weight[2]*data[2].r +
    +   *                          weight[3]*data[3].r;
    +   *            newVertex.g = weight[0]*data[0].g +
    +   *                          weight[1]*data[1].g +
    +   *                          weight[2]*data[2].g +
    +   *                          weight[3]*data[3].g;
    +   *            newVertex.b = weight[0]*data[0].b +
    +   *                          weight[1]*data[1].b +
    +   *                          weight[2]*data[2].b +
    +   *                          weight[3]*data[3].b;
    +   *            newVertex.a = weight[0]*data[0].a +
    +   *                          weight[1]*data[1].a +
    +   *                          weight[2]*data[2].a +
    +   *                          weight[3]*data[3].a;
    +   *            outData = newVertex;
    +   *         }
    + * + * @param coords + * Specifics the location of the new vertex. + * @param data + * Specifics the vertices used to create the new vertex. + * @param weight + * Specifics the weights used to create the new vertex. + * @param outData + * Reference user the put the coodinates of the new vertex. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #combineData combineData + */ + void combine(double[] coords, Object[] data, + float[] weight, Object[] outData); + + + /** + * The same as the {@link #combine combine} callback method except + * that it takes an additional reference argument. This reference is + * identical to the opaque reference provided when {@link + * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param coords + * Specifics the location of the new vertex. + * @param data + * Specifics the vertices used to create the new vertex. + * @param weight + * Specifics the weights used to create the new vertex. + * @param outData + * Reference user the put the coodinates of the new vertex. + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #combine combine + */ + void combineData(double[] coords, Object[] data, + float[] weight, Object[] outData, + Object polygonData); + + + /** + * The error callback method is called when an error is encountered. + * The one argument is of type int; it indicates the specific error that + * occurred and will be set to one of GLU_TESS_MISSING_BEGIN_POLYGON, + * GLU_TESS_MISSING_END_POLYGON, GLU_TESS_MISSING_BEGIN_CONTOUR, + * GLU_TESS_MISSING_END_CONTOUR, GLU_TESS_COORD_TOO_LARGE, + * GLU_TESS_NEED_COMBINE_CALLBACK or GLU_OUT_OF_MEMORY. + * Character strings describing these errors can be retrieved with the + * {@link GLU#gluErrorString gluErrorString} call.

    + * + * The GLU library will recover from the first four errors by inserting the + * missing call(s). GLU_TESS_COORD_TOO_LARGE indicates that some + * vertex coordinate exceeded the predefined constant + * GLU_TESS_MAX_COORD in absolute value, and that the value has been + * clamped. (Coordinate values must be small enough so that two can be + * multiplied together without overflow.) + * GLU_TESS_NEED_COMBINE_CALLBACK indicates that the tessellation + * detected an intersection between two edges in the input data, and the + * GLU_TESS_COMBINE or GLU_TESS_COMBINE_DATA callback was not + * provided. No output is generated. GLU_OUT_OF_MEMORY indicates that + * there is not enough memory so no output is generated. + * + * @param errnum + * Specifics the error number code. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #errorData errorData + */ + void error(int errnum); + + + /** + * The same as the {@link #error error} callback method except that + * it takes an additional reference argument. This reference is + * identical to the opaque reference provided when {@link + * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param errnum + * Specifics the error number code. + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #error error + */ + void errorData(int errnum, Object polygonData); + + //void mesh(com.sun.opengl.impl.tessellator.GLUmesh mesh); +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellatorCallbackAdapter.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellatorCallbackAdapter.java new file mode 100644 index 000000000..742529b47 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/GLUtessellatorCallbackAdapter.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu; + +/** + * The GLUtessellatorCallbackAdapter provides a default implementation of + * {@link GLUtessellatorCallback GLUtessellatorCallback} + * with empty callback methods. This class can be extended to provide user + * defined callback methods. + * + * @author Eric Veach, July 1994 + * @author Java Port: Pepijn Van Eechhoudt, July 2003 + * @author Java Port: Nathan Parker Burg, August 2003 + */ + +public class GLUtessellatorCallbackAdapter implements GLUtessellatorCallback { + public void begin(int type) {} + public void edgeFlag(boolean boundaryEdge) {} + public void vertex(Object vertexData) {} + public void end() {} +// public void mesh(com.sun.opengl.impl.tessellator.GLUmesh mesh) {} + public void error(int errnum) {} + public void combine(double[] coords, Object[] data, + float[] weight, Object[] outData) {} + public void beginData(int type, Object polygonData) {} + public void edgeFlagData(boolean boundaryEdge, + Object polygonData) {} + public void vertexData(Object vertexData, Object polygonData) {} + public void endData(Object polygonData) {} + public void errorData(int errnum, Object polygonData) {} + public void combineData(double[] coords, Object[] data, + float[] weight, Object[] outData, + Object polygonData) {} +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/MipMap.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/MipMap.java new file mode 100644 index 000000000..08ee91d75 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/MipMap.java @@ -0,0 +1,367 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +import static org.lwjgl.opengl.GL11.GL_FLOAT; +import static org.lwjgl.opengl.GL11.GL_INVALID_ENUM; +import static org.lwjgl.opengl.GL11.GL_MAX_TEXTURE_SIZE; +import static org.lwjgl.opengl.GL11.GL_PACK_ALIGNMENT; +import static org.lwjgl.opengl.GL11.GL_PACK_ROW_LENGTH; +import static org.lwjgl.opengl.GL11.GL_PACK_SKIP_PIXELS; +import static org.lwjgl.opengl.GL11.GL_PACK_SKIP_ROWS; +import static org.lwjgl.opengl.GL11.GL_UNPACK_ALIGNMENT; +import static org.lwjgl.opengl.GL11.GL_UNPACK_ROW_LENGTH; +import static org.lwjgl.opengl.GL11.GL_UNPACK_SKIP_PIXELS; +import static org.lwjgl.opengl.GL11.GL_UNPACK_SKIP_ROWS; +import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE; +import static org.lwjgl.opengl.GL11.glPixelStorei; +import static org.lwjgl.opengl.GL11.glTexImage2D; +import static org.lwjgl.util.glu.GLU.GLU_INVALID_ENUM; +import static org.lwjgl.util.glu.GLU.GLU_INVALID_VALUE; + +import org.lwjgl.BufferUtils; + +import java.nio.ByteBuffer; + +/** + * MipMap.java + * + * + * Created 11-jan-2004 + * @author Erik Duijs + */ +public class MipMap extends Util { + + /** + * Method gluBuild2DMipmaps + * + * @param target + * @param components + * @param width + * @param height + * @param format + * @param type + * @param data + * @return int + */ + public static int gluBuild2DMipmaps(final int target, + final int components, final int width, final int height, + final int format, final int type, final ByteBuffer data) { + if ( width < 1 || height < 1 ) return GLU_INVALID_VALUE; + + final int bpp = bytesPerPixel(format, type); + if ( bpp == 0 ) + return GLU_INVALID_ENUM; + + final int maxSize = glGetIntegerv(GL_MAX_TEXTURE_SIZE); + + int w = nearestPower(width); + if ( w > maxSize ) + w = maxSize; + + int h = nearestPower(height); + if ( h > maxSize ) + h = maxSize; + + // Get current glPixelStore state + PixelStoreState pss = new PixelStoreState(); + + // set pixel packing + glPixelStorei(GL_PACK_ROW_LENGTH, 0); + glPixelStorei(GL_PACK_ALIGNMENT, 1); + glPixelStorei(GL_PACK_SKIP_ROWS, 0); + glPixelStorei(GL_PACK_SKIP_PIXELS, 0); + + ByteBuffer image; + int retVal = 0; + boolean done = false; + + if ( w != width || h != height ) { + // must rescale image to get "top" mipmap texture image + image = BufferUtils.createByteBuffer((w + 4) * h * bpp); + int error = gluScaleImage(format, width, height, type, data, w, h, type, image); + if ( error != 0 ) { + retVal = error; + done = true; + } + + /* set pixel unpacking */ + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + } else { + image = data; + } + + ByteBuffer bufferA = null; + ByteBuffer bufferB = null; + + int level = 0; + while ( !done ) { + if (image != data) { + /* set pixel unpacking */ + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + } + + glTexImage2D(target, level, components, w, h, 0, format, type, image); + + if ( w == 1 && h == 1 ) + break; + + final int newW = (w < 2) ? 1 : w >> 1; + final int newH = (h < 2) ? 1 : h >> 1; + + final ByteBuffer newImage; + + if ( bufferA == null ) + newImage = (bufferA = BufferUtils.createByteBuffer((newW + 4) * newH * bpp)); + else if ( bufferB == null ) + newImage = (bufferB = BufferUtils.createByteBuffer((newW + 4) * newH * bpp)); + else + newImage = bufferB; + + int error = gluScaleImage(format, w, h, type, image, newW, newH, type, newImage); + if ( error != 0 ) { + retVal = error; + done = true; + } + + image = newImage; + if ( bufferB != null ) + bufferB = bufferA; + + w = newW; + h = newH; + level++; + } + + // Restore original glPixelStore state + pss.save(); + + return retVal; + } + + /** + * Method gluScaleImage. + * @param format + * @param widthIn + * @param heightIn + * @param typein + * @param dataIn + * @param widthOut + * @param heightOut + * @param typeOut + * @param dataOut + * @return int + */ + public static int gluScaleImage(int format, + int widthIn, int heightIn, int typein, ByteBuffer dataIn, + int widthOut, int heightOut, int typeOut, ByteBuffer dataOut) { + + final int components = compPerPix(format); + if ( components == -1 ) + return GLU_INVALID_ENUM; + + int i, j, k; + float[] tempIn, tempOut; + float sx, sy; + int sizein, sizeout; + int rowstride, rowlen; + + // temp image data + tempIn = new float[widthIn * heightIn * components]; + tempOut = new float[widthOut * heightOut * components]; + + // Determine bytes per input type + switch ( typein ) { + case GL_UNSIGNED_BYTE: + sizein = 1; + break; + case GL_FLOAT: + sizein = 4; + break; + default: + return GL_INVALID_ENUM; + } + + // Determine bytes per output type + switch ( typeOut ) { + case GL_UNSIGNED_BYTE: + sizeout = 1; + break; + case GL_FLOAT: + sizeout = 4; + break; + default: + return GL_INVALID_ENUM; + } + + // Get glPixelStore state + PixelStoreState pss = new PixelStoreState(); + + //Unpack the pixel data and convert to floating point + if ( pss.unpackRowLength > 0 ) + rowlen = pss.unpackRowLength; + else + rowlen = widthIn; + + if ( sizein >= pss.unpackAlignment ) + rowstride = components * rowlen; + else + rowstride = pss.unpackAlignment / sizein * ceil(components * rowlen * sizein, pss.unpackAlignment); + + switch ( typein ) { + case GL_UNSIGNED_BYTE: + k = 0; + dataIn.rewind(); + for ( i = 0; i < heightIn; i++ ) { + int ubptr = i * rowstride + pss.unpackSkipRows * rowstride + pss.unpackSkipPixels * components; + for ( j = 0; j < widthIn * components; j++ ) { + tempIn[k++] = dataIn.get(ubptr++) & 0xff; + } + } + break; + case GL_FLOAT: + k = 0; + dataIn.rewind(); + for ( i = 0; i < heightIn; i++ ) + { + int fptr = 4 * (i * rowstride + pss.unpackSkipRows * rowstride + pss.unpackSkipPixels * components); + for ( j = 0; j < widthIn * components; j++ ) + { + tempIn[k++] = dataIn.getFloat(fptr); + fptr += 4; + } + } + break; + default: + return GLU_INVALID_ENUM; + } + + // Do scaling + sx = (float)widthIn / (float)widthOut; + sy = (float)heightIn / (float)heightOut; + + float[] c = new float[components]; + int src, dst; + + for ( int iy = 0; iy < heightOut; iy++ ) { + for ( int ix = 0; ix < widthOut; ix++ ) { + int x0 = (int)(ix * sx); + int x1 = (int)((ix + 1) * sx); + int y0 = (int)(iy * sy); + int y1 = (int)((iy + 1) * sy); + + int readPix = 0; + + // reset weighted pixel + for ( int ic = 0; ic < components; ic++ ) { + c[ic] = 0; + } + + // create weighted pixel + for ( int ix0 = x0; ix0 < x1; ix0++ ) { + for ( int iy0 = y0; iy0 < y1; iy0++ ) { + + src = (iy0 * widthIn + ix0) * components; + + for ( int ic = 0; ic < components; ic++ ) { + c[ic] += tempIn[src + ic]; + } + + readPix++; + } + } + + // store weighted pixel + dst = (iy * widthOut + ix) * components; + + if ( readPix == 0 ) { + // Image is sized up, caused by non power of two texture as input + src = (y0 * widthIn + x0) * components; + for ( int ic = 0; ic < components; ic++ ) { + tempOut[dst++] = tempIn[src + ic]; + } + } else { + // sized down + for ( k = 0; k < components; k++ ) { + tempOut[dst++] = c[k] / readPix; + } + } + } + } + + + // Convert temp output + if ( pss.packRowLength > 0 ) + rowlen = pss.packRowLength; + else + rowlen = widthOut; + + if ( sizeout >= pss.packAlignment ) + rowstride = components * rowlen; + else + rowstride = pss.packAlignment / sizeout * ceil(components * rowlen * sizeout, pss.packAlignment); + + switch ( typeOut ) { + case GL_UNSIGNED_BYTE: + k = 0; + for ( i = 0; i < heightOut; i++ ) { + int ubptr = i * rowstride + pss.packSkipRows * rowstride + pss.packSkipPixels * components; + + for ( j = 0; j < widthOut * components; j++ ) { + dataOut.put(ubptr++, (byte)tempOut[k++]); + } + } + break; + case GL_FLOAT: + k = 0; + for ( i = 0; i < heightOut; i++ ) { + int fptr = 4 * (i * rowstride + pss.unpackSkipRows * rowstride + pss.unpackSkipPixels * components); + + for ( j = 0; j < widthOut * components; j++ ) { + dataOut.putFloat(fptr, tempOut[k++]); + fptr += 4; + } + } + break; + default: + return GLU_INVALID_ENUM; + } + + return 0; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/PartialDisk.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/PartialDisk.java new file mode 100644 index 000000000..3fc893436 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/PartialDisk.java @@ -0,0 +1,374 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +import static org.lwjgl.opengl.GL11.GL_LINE_STRIP; +import static org.lwjgl.opengl.GL11.GL_POINTS; +import static org.lwjgl.opengl.GL11.GL_QUAD_STRIP; +import static org.lwjgl.opengl.GL11.GL_TRIANGLE_FAN; +import static org.lwjgl.opengl.GL11.glBegin; +import static org.lwjgl.opengl.GL11.glEnd; +import static org.lwjgl.opengl.GL11.glNormal3f; +import static org.lwjgl.opengl.GL11.glTexCoord2f; +import static org.lwjgl.opengl.GL11.glVertex3f; +import static org.lwjgl.util.glu.GLU.GLU_FILL; +import static org.lwjgl.util.glu.GLU.GLU_FLAT; +import static org.lwjgl.util.glu.GLU.GLU_LINE; +import static org.lwjgl.util.glu.GLU.GLU_NONE; +import static org.lwjgl.util.glu.GLU.GLU_OUTSIDE; +import static org.lwjgl.util.glu.GLU.GLU_POINT; +import static org.lwjgl.util.glu.GLU.GLU_SILHOUETTE; +import static org.lwjgl.util.glu.GLU.GLU_SMOOTH; +import static org.lwjgl.util.glu.GLU.PI; + +/** + * PartialDisk.java + * + * + * Created 23-dec-2003 + * + * @author Erik Duijs + */ +public class PartialDisk extends Quadric { + + private static final int CACHE_SIZE = 240; + + /** + * Constructor for PartialDisk. + */ + public PartialDisk() { + super(); + } + + /** + * renders a partial disk on the z=0 plane. A partial disk is similar to a + * full disk, except that only the subset of the disk from startAngle + * through startAngle + sweepAngle is included (where 0 degrees is along + * the +y axis, 90 degrees along the +x axis, 180 along the -y axis, and + * 270 along the -x axis). + * + * The partial disk has a radius of outerRadius, and contains a concentric + * circular hole with a radius of innerRadius. If innerRadius is zero, then + * no hole is generated. The partial disk is subdivided around the z axis + * into slices (like pizza slices), and also about the z axis into rings + * (as specified by slices and loops, respectively). + * + * With respect to orientation, the +z side of the partial disk is + * considered to be outside (see gluQuadricOrientation). This means that if + * the orientation is set to GLU.GLU_OUTSIDE, then any normals generated point + * along the +z axis. Otherwise, they point along the -z axis. + * + * If texturing is turned on (with gluQuadricTexture), texture coordinates + * are generated linearly such that where r=outerRadius, the value at (r, 0, 0) + * is (1, 0.5), at (0, r, 0) it is (0.5, 1), at (-r, 0, 0) it is (0, 0.5), + * and at (0, -r, 0) it is (0.5, 0). + */ + public void draw( + float innerRadius, + float outerRadius, + int slices, + int loops, + float startAngle, + float sweepAngle) { + + int i, j; + float[] sinCache = new float[CACHE_SIZE]; + float[] cosCache = new float[CACHE_SIZE]; + float angle; + float sintemp, costemp; + float deltaRadius; + float radiusLow, radiusHigh; + float texLow = 0, texHigh = 0; + float angleOffset; + int slices2; + int finish; + + if (slices >= CACHE_SIZE) + slices = CACHE_SIZE - 1; + if (slices < 2 + || loops < 1 + || outerRadius <= 0.0f + || innerRadius < 0.0f + || innerRadius > outerRadius) { + //gluQuadricError(qobj, GLU.GLU_INVALID_VALUE); + System.err.println("PartialDisk: GLU_INVALID_VALUE"); + return; + } + + if (sweepAngle < -360.0f) + sweepAngle = 360.0f; + if (sweepAngle > 360.0f) + sweepAngle = 360.0f; + if (sweepAngle < 0) { + startAngle += sweepAngle; + sweepAngle = -sweepAngle; + } + + if (sweepAngle == 360.0f) { + slices2 = slices; + } else { + slices2 = slices + 1; + } + + /* Compute length (needed for normal calculations) */ + deltaRadius = outerRadius - innerRadius; + + /* Cache is the vertex locations cache */ + + angleOffset = startAngle / 180.0f * PI; + for (i = 0; i <= slices; i++) { + angle = angleOffset + ((PI * sweepAngle) / 180.0f) * i / slices; + sinCache[i] = sin(angle); + cosCache[i] = cos(angle); + } + + if (sweepAngle == 360.0f) { + sinCache[slices] = sinCache[0]; + cosCache[slices] = cosCache[0]; + } + + switch (super.normals) { + case GLU_FLAT : + case GLU_SMOOTH : + if (super.orientation == GLU_OUTSIDE) { + glNormal3f(0.0f, 0.0f, 1.0f); + } else { + glNormal3f(0.0f, 0.0f, -1.0f); + } + break; + default : + case GLU_NONE : + break; + } + + switch (super.drawStyle) { + case GLU_FILL : + if (innerRadius == .0f) { + finish = loops - 1; + /* Triangle strip for inner polygons */ + glBegin(GL_TRIANGLE_FAN); + if (super.textureFlag) { + glTexCoord2f(0.5f, 0.5f); + } + glVertex3f(0.0f, 0.0f, 0.0f); + radiusLow = outerRadius - deltaRadius * ((float) (loops - 1) / loops); + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + } + + if (super.orientation == GLU_OUTSIDE) { + for (i = slices; i >= 0; i--) { + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + } + } else { + for (i = 0; i <= slices; i++) { + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + } + } + glEnd(); + } else { + finish = loops; + } + for (j = 0; j < finish; j++) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + radiusHigh = outerRadius - deltaRadius * ((float) (j + 1) / loops); + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + texHigh = radiusHigh / outerRadius / 2; + } + + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= slices; i++) { + if (super.orientation == GLU_OUTSIDE) { + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + + if (super.textureFlag) { + glTexCoord2f( + texHigh * sinCache[i] + 0.5f, + texHigh * cosCache[i] + 0.5f); + } + glVertex3f( + radiusHigh * sinCache[i], + radiusHigh * cosCache[i], + 0.0f); + } else { + if (super.textureFlag) { + glTexCoord2f( + texHigh * sinCache[i] + 0.5f, + texHigh * cosCache[i] + 0.5f); + } + glVertex3f( + radiusHigh * sinCache[i], + radiusHigh * cosCache[i], + 0.0f); + + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + } + } + glEnd(); + } + break; + case GLU_POINT : + glBegin(GL_POINTS); + for (i = 0; i < slices2; i++) { + sintemp = sinCache[i]; + costemp = cosCache[i]; + for (j = 0; j <= loops; j++) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); + } + } + glEnd(); + break; + case GLU_LINE : + if (innerRadius == outerRadius) { + glBegin(GL_LINE_STRIP); + + for (i = 0; i <= slices; i++) { + if (super.textureFlag) { + glTexCoord2f(sinCache[i] / 2 + 0.5f, cosCache[i] / 2 + 0.5f); + } + glVertex3f(innerRadius * sinCache[i], innerRadius * cosCache[i], 0.0f); + } + glEnd(); + break; + } + for (j = 0; j <= loops; j++) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + } + + glBegin(GL_LINE_STRIP); + for (i = 0; i <= slices; i++) { + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + } + glEnd(); + } + for (i = 0; i < slices2; i++) { + sintemp = sinCache[i]; + costemp = cosCache[i]; + glBegin(GL_LINE_STRIP); + for (j = 0; j <= loops; j++) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + } + + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); + } + glEnd(); + } + break; + case GLU_SILHOUETTE : + if (sweepAngle < 360.0f) { + for (i = 0; i <= slices; i += slices) { + sintemp = sinCache[i]; + costemp = cosCache[i]; + glBegin(GL_LINE_STRIP); + for (j = 0; j <= loops; j++) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); + } + glEnd(); + } + } + for (j = 0; j <= loops; j += loops) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + } + + glBegin(GL_LINE_STRIP); + for (i = 0; i <= slices; i++) { + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + } + glEnd(); + if (innerRadius == outerRadius) + break; + } + break; + default : + break; + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/PixelStoreState.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/PixelStoreState.java new file mode 100644 index 000000000..e532079ec --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/PixelStoreState.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +import static org.lwjgl.opengl.GL11.GL_PACK_ALIGNMENT; +import static org.lwjgl.opengl.GL11.GL_PACK_ROW_LENGTH; +import static org.lwjgl.opengl.GL11.GL_PACK_SKIP_PIXELS; +import static org.lwjgl.opengl.GL11.GL_PACK_SKIP_ROWS; +import static org.lwjgl.opengl.GL11.GL_UNPACK_ALIGNMENT; +import static org.lwjgl.opengl.GL11.GL_UNPACK_ROW_LENGTH; +import static org.lwjgl.opengl.GL11.GL_UNPACK_SKIP_PIXELS; +import static org.lwjgl.opengl.GL11.GL_UNPACK_SKIP_ROWS; +import static org.lwjgl.opengl.GL11.glPixelStorei; + +/** + * PixelStoreState.java + * + * + * Created 11-jan-2004 + * @author Erik Duijs + */ +class PixelStoreState extends Util { + + public int unpackRowLength; + public int unpackAlignment; + public int unpackSkipRows; + public int unpackSkipPixels; + public int packRowLength; + public int packAlignment; + public int packSkipRows; + public int packSkipPixels; + + /** + * Constructor for PixelStoreState. + */ + PixelStoreState() { + super(); + load(); + } + + public void load() { + unpackRowLength = glGetIntegerv(GL_UNPACK_ROW_LENGTH); + unpackAlignment = glGetIntegerv(GL_UNPACK_ALIGNMENT); + unpackSkipRows = glGetIntegerv(GL_UNPACK_SKIP_ROWS); + unpackSkipPixels = glGetIntegerv(GL_UNPACK_SKIP_PIXELS); + packRowLength = glGetIntegerv(GL_PACK_ROW_LENGTH); + packAlignment = glGetIntegerv(GL_PACK_ALIGNMENT); + packSkipRows = glGetIntegerv(GL_PACK_SKIP_ROWS); + packSkipPixels = glGetIntegerv(GL_PACK_SKIP_PIXELS); + } + + public void save() { + glPixelStorei(GL_UNPACK_ROW_LENGTH, unpackRowLength); + glPixelStorei(GL_UNPACK_ALIGNMENT, unpackAlignment); + glPixelStorei(GL_UNPACK_SKIP_ROWS, unpackSkipRows); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, unpackSkipPixels); + glPixelStorei(GL_PACK_ROW_LENGTH, packRowLength); + glPixelStorei(GL_PACK_ALIGNMENT, packAlignment); + glPixelStorei(GL_PACK_SKIP_ROWS, packSkipRows); + glPixelStorei(GL_PACK_SKIP_PIXELS, packSkipPixels); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Project.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Project.java new file mode 100644 index 000000000..504402e4f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Project.java @@ -0,0 +1,413 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +import static org.lwjgl.opengl.GL11.glMultMatrix; +import static org.lwjgl.opengl.GL11.glScalef; +import static org.lwjgl.opengl.GL11.glTranslatef; + +import org.lwjgl.BufferUtils; + +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +/** + * Project.java + *

    + *

    + * Created 11-jan-2004 + * + * @author Erik Duijs + */ +public class Project extends Util { + + private static final float[] IDENTITY_MATRIX = + new float[] { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; + + private static final FloatBuffer matrix = BufferUtils.createFloatBuffer(16); + private static final FloatBuffer finalMatrix = BufferUtils.createFloatBuffer(16); + + private static final FloatBuffer tempMatrix = BufferUtils.createFloatBuffer(16); + private static final float[] in = new float[4]; + private static final float[] out = new float[4]; + + private static final float[] forward = new float[3]; + private static final float[] side = new float[3]; + private static final float[] up = new float[3]; + + /** + * Make matrix an identity matrix + */ + private static void __gluMakeIdentityf(FloatBuffer m) { + int oldPos = m.position(); + m.put(IDENTITY_MATRIX); + m.position(oldPos); + } + + /** + * Method __gluMultMatrixVecf + * + * @param m + * @param in + * @param out + */ + private static void __gluMultMatrixVecf(FloatBuffer m, float[] in, float[] out) { + for (int i = 0; i < 4; i++) { + out[i] = + in[0] * m.get(m.position() + 0*4 + i) + + in[1] * m.get(m.position() + 1*4 + i) + + in[2] * m.get(m.position() + 2*4 + i) + + in[3] * m.get(m.position() + 3*4 + i); + + } + } + + /** + * @param src + * @param inverse + * + * @return true if the matrix was succesfully inverted + */ + private static boolean __gluInvertMatrixf(FloatBuffer src, FloatBuffer inverse) { + int i, j, k, swap; + float t; + FloatBuffer temp = Project.tempMatrix; + + + for (i = 0; i < 16; i++) { + temp.put(i, src.get(i + src.position())); + } + __gluMakeIdentityf(inverse); + + for (i = 0; i < 4; i++) { + /* + * * Look for largest element in column + */ + swap = i; + for (j = i + 1; j < 4; j++) { + /* + * if (fabs(temp[j][i]) > fabs(temp[i][i])) { swap = j; + */ + if (Math.abs(temp.get(j*4 + i)) > Math.abs(temp.get(i* 4 + i))) { + swap = j; + } + } + + if (swap != i) { + /* + * * Swap rows. + */ + for (k = 0; k < 4; k++) { + t = temp.get(i*4 + k); + temp.put(i*4 + k, temp.get(swap*4 + k)); + temp.put(swap*4 + k, t); + + t = inverse.get(i*4 + k); + inverse.put(i*4 + k, inverse.get(swap*4 + k)); + //inverse.put((i << 2) + k, inverse.get((swap << 2) + k)); + inverse.put(swap*4 + k, t); + //inverse.put((swap << 2) + k, t); + } + } + + if (temp.get(i*4 + i) == 0) { + /* + * * No non-zero pivot. The matrix is singular, which shouldn't * + * happen. This means the user gave us a bad matrix. + */ + return false; + } + + t = temp.get(i*4 + i); + for (k = 0; k < 4; k++) { + temp.put(i*4 + k, temp.get(i*4 + k)/t); + inverse.put(i*4 + k, inverse.get(i*4 + k)/t); + } + for (j = 0; j < 4; j++) { + if (j != i) { + t = temp.get(j*4 + i); + for (k = 0; k < 4; k++) { + temp.put(j*4 + k, temp.get(j*4 + k) - temp.get(i*4 + k) * t); + inverse.put(j*4 + k, inverse.get(j*4 + k) - inverse.get(i*4 + k) * t); + /*inverse.put( + (j << 2) + k, + inverse.get((j << 2) + k) - inverse.get((i << 2) + k) * t);*/ + } + } + } + } + return true; + } + + /** + * @param a + * @param b + * @param r + */ + private static void __gluMultMatricesf(FloatBuffer a, FloatBuffer b, FloatBuffer r) { + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + r.put(r.position() + i*4 + j, + a.get(a.position() + i*4 + 0) * b.get(b.position() + 0*4 + j) + a.get(a.position() + i*4 + 1) * b.get(b.position() + 1*4 + j) + a.get(a.position() + i*4 + 2) * b.get(b.position() + 2*4 + j) + a.get(a.position() + i*4 + 3) * b.get(b.position() + 3*4 + j)); + } + } + } + + /** + * Method gluPerspective. + * + * @param fovy + * @param aspect + * @param zNear + * @param zFar + */ + public static void gluPerspective(float fovy, float aspect, float zNear, float zFar) { + float sine, cotangent, deltaZ; + float radians = fovy / 2 * GLU.PI / 180; + + deltaZ = zFar - zNear; + sine = (float) Math.sin(radians); + + if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) { + return; + } + + cotangent = (float) Math.cos(radians) / sine; + + __gluMakeIdentityf(matrix); + + matrix.put(0 * 4 + 0, cotangent / aspect); + matrix.put(1 * 4 + 1, cotangent); + matrix.put(2 * 4 + 2, - (zFar + zNear) / deltaZ); + matrix.put(2 * 4 + 3, -1); + matrix.put(3 * 4 + 2, -2 * zNear * zFar / deltaZ); + matrix.put(3 * 4 + 3, 0); + + glMultMatrix(matrix); + } + + /** + * Method gluLookAt + * + * @param eyex + * @param eyey + * @param eyez + * @param centerx + * @param centery + * @param centerz + * @param upx + * @param upy + * @param upz + */ + public static void gluLookAt( + float eyex, + float eyey, + float eyez, + float centerx, + float centery, + float centerz, + float upx, + float upy, + float upz) { + float[] forward = Project.forward; + float[] side = Project.side; + float[] up = Project.up; + + forward[0] = centerx - eyex; + forward[1] = centery - eyey; + forward[2] = centerz - eyez; + + up[0] = upx; + up[1] = upy; + up[2] = upz; + + normalize(forward); + + /* Side = forward x up */ + cross(forward, up, side); + normalize(side); + + /* Recompute up as: up = side x forward */ + cross(side, forward, up); + + __gluMakeIdentityf(matrix); + matrix.put(0 * 4 + 0, side[0]); + matrix.put(1 * 4 + 0, side[1]); + matrix.put(2 * 4 + 0, side[2]); + + matrix.put(0 * 4 + 1, up[0]); + matrix.put(1 * 4 + 1, up[1]); + matrix.put(2 * 4 + 1, up[2]); + + matrix.put(0 * 4 + 2, -forward[0]); + matrix.put(1 * 4 + 2, -forward[1]); + matrix.put(2 * 4 + 2, -forward[2]); + + glMultMatrix(matrix); + glTranslatef(-eyex, -eyey, -eyez); + } + + /** + * Method gluProject + * + * @param objx + * @param objy + * @param objz + * @param modelMatrix + * @param projMatrix + * @param viewport + * @param win_pos + */ + public static boolean gluProject( + float objx, + float objy, + float objz, + FloatBuffer modelMatrix, + FloatBuffer projMatrix, + IntBuffer viewport, + FloatBuffer win_pos) { + + float[] in = Project.in; + float[] out = Project.out; + + in[0] = objx; + in[1] = objy; + in[2] = objz; + in[3] = 1.0f; + + __gluMultMatrixVecf(modelMatrix, in, out); + __gluMultMatrixVecf(projMatrix, out, in); + + if (in[3] == 0.0) + return false; + + in[3] = (1.0f / in[3]) * 0.5f; + + // Map x, y and z to range 0-1 + in[0] = in[0] * in[3] + 0.5f; + in[1] = in[1] * in[3] + 0.5f; + in[2] = in[2] * in[3] + 0.5f; + + // Map x,y to viewport + win_pos.put(0, in[0] * viewport.get(viewport.position() + 2) + viewport.get(viewport.position() + 0)); + win_pos.put(1, in[1] * viewport.get(viewport.position() + 3) + viewport.get(viewport.position() + 1)); + win_pos.put(2, in[2]); + + return true; + } + + /** + * Method gluUnproject + * + * @param winx + * @param winy + * @param winz + * @param modelMatrix + * @param projMatrix + * @param viewport + * @param obj_pos + */ + public static boolean gluUnProject( + float winx, + float winy, + float winz, + FloatBuffer modelMatrix, + FloatBuffer projMatrix, + IntBuffer viewport, + FloatBuffer obj_pos) { + float[] in = Project.in; + float[] out = Project.out; + + __gluMultMatricesf(modelMatrix, projMatrix, finalMatrix); + + if (!__gluInvertMatrixf(finalMatrix, finalMatrix)) + return false; + + in[0] = winx; + in[1] = winy; + in[2] = winz; + in[3] = 1.0f; + + // Map x and y from window coordinates + in[0] = (in[0] - viewport.get(viewport.position() + 0)) / viewport.get(viewport.position() + 2); + in[1] = (in[1] - viewport.get(viewport.position() + 1)) / viewport.get(viewport.position() + 3); + + // Map to range -1 to 1 + in[0] = in[0] * 2 - 1; + in[1] = in[1] * 2 - 1; + in[2] = in[2] * 2 - 1; + + __gluMultMatrixVecf(finalMatrix, in, out); + + if (out[3] == 0.0) + return false; + + out[3] = 1.0f / out[3]; + + obj_pos.put(obj_pos.position() + 0, out[0] * out[3]); + obj_pos.put(obj_pos.position() + 1, out[1] * out[3]); + obj_pos.put(obj_pos.position() + 2, out[2] * out[3]); + + return true; + } + + /** + * Method gluPickMatrix + * + * @param x + * @param y + * @param deltaX + * @param deltaY + * @param viewport + */ + public static void gluPickMatrix( + float x, + float y, + float deltaX, + float deltaY, + IntBuffer viewport) { + if (deltaX <= 0 || deltaY <= 0) { + return; + } + + /* Translate and scale the picked region to the entire window */ + glTranslatef( + (viewport.get(viewport.position() + 2) - 2 * (x - viewport.get(viewport.position() + 0))) / deltaX, + (viewport.get(viewport.position() + 3) - 2 * (y - viewport.get(viewport.position() + 1))) / deltaY, + 0); + glScalef(viewport.get(viewport.position() + 2) / deltaX, viewport.get(viewport.position() + 3) / deltaY, 1.0f); + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Quadric.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Quadric.java new file mode 100644 index 000000000..8cdb50ec2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Quadric.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +import static org.lwjgl.opengl.GL11.glNormal3f; +import static org.lwjgl.opengl.GL11.glTexCoord2f; +import static org.lwjgl.util.glu.GLU.GLU_FILL; +import static org.lwjgl.util.glu.GLU.GLU_OUTSIDE; +import static org.lwjgl.util.glu.GLU.GLU_SMOOTH; + +/** + * Quadric.java + * + * + * Created 22-dec-2003 + * @author Erik Duijs + */ +public class Quadric { + + protected int drawStyle; + protected int orientation; + protected boolean textureFlag; + protected int normals; + + /** + * Constructor for Quadric. + */ + public Quadric() { + super(); + + drawStyle = GLU_FILL; + orientation = GLU_OUTSIDE; + textureFlag = false; + normals = GLU_SMOOTH; + } + + /** + * Call glNormal3f after scaling normal to unit length. + * + * @param x + * @param y + * @param z + */ + protected void normal3f(float x, float y, float z) { + float mag; + + mag = (float)Math.sqrt(x * x + y * y + z * z); + if (mag > 0.00001F) { + x /= mag; + y /= mag; + z /= mag; + } + glNormal3f(x, y, z); + } + + /** + * specifies the draw style for quadrics. + * + * The legal values are as follows: + * + * GLU.FILL: Quadrics are rendered with polygon primitives. The polygons + * are drawn in a counterclockwise fashion with respect to + * their normals (as defined with glu.quadricOrientation). + * + * GLU.LINE: Quadrics are rendered as a set of lines. + * + * GLU.SILHOUETTE: Quadrics are rendered as a set of lines, except that edges + * separating coplanar faces will not be drawn. + * + * GLU.POINT: Quadrics are rendered as a set of points. + * + * @param drawStyle The drawStyle to set + */ + public void setDrawStyle(int drawStyle) { + this.drawStyle = drawStyle; + } + + /** + * specifies what kind of normals are desired for quadrics. + * The legal values are as follows: + * + * GLU.NONE: No normals are generated. + * + * GLU.FLAT: One normal is generated for every facet of a quadric. + * + * GLU.SMOOTH: One normal is generated for every vertex of a quadric. This + * is the default. + * + * @param normals The normals to set + */ + public void setNormals(int normals) { + this.normals = normals; + } + + /** + * specifies what kind of orientation is desired for. + * The orientation values are as follows: + * + * GLU.OUTSIDE: Quadrics are drawn with normals pointing outward. + * + * GLU.INSIDE: Normals point inward. The default is GLU.OUTSIDE. + * + * Note that the interpretation of outward and inward depends on the quadric + * being drawn. + * + * @param orientation The orientation to set + */ + public void setOrientation(int orientation) { + this.orientation = orientation; + } + + /** + * specifies if texture coordinates should be generated for + * quadrics rendered with qobj. If the value of textureCoords is true, + * then texture coordinates are generated, and if textureCoords is false, + * they are not.. The default is false. + * + * The manner in which texture coordinates are generated depends upon the + * specific quadric rendered. + * + * @param textureFlag The textureFlag to set + */ + public void setTextureFlag(boolean textureFlag) { + this.textureFlag = textureFlag; + } + + + /** + * Returns the drawStyle. + * @return int + */ + public int getDrawStyle() { + return drawStyle; + } + + /** + * Returns the normals. + * @return int + */ + public int getNormals() { + return normals; + } + + /** + * Returns the orientation. + * @return int + */ + public int getOrientation() { + return orientation; + } + + /** + * Returns the textureFlag. + * @return boolean + */ + public boolean getTextureFlag() { + return textureFlag; + } + + protected void TXTR_COORD(float x, float y) { + if (textureFlag) glTexCoord2f(x,y); + } + + + protected float sin(float r) { + return (float)Math.sin(r); + } + + protected float cos(float r) { + return (float)Math.cos(r); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Registry.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Registry.java new file mode 100644 index 000000000..2ed0b9927 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Registry.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +import static org.lwjgl.util.glu.GLU.GLU_EXTENSIONS; +import static org.lwjgl.util.glu.GLU.GLU_VERSION; + +/** + * Registry.java + * + * + * Created 11-jan-2004 + * @author Erik Duijs + */ +public class Registry extends Util { + + private static final String versionString = "1.3"; + private static final String extensionString = + "GLU_EXT_nurbs_tessellator " + "GLU_EXT_object_space_tess "; + + /** + * Method gluGetString + * @param name + * @return String + */ + public static String gluGetString(int name) { + + if (name == GLU_VERSION) { + return versionString; + } else if (name == GLU_EXTENSIONS) { + return extensionString; + } + return null; + } + + /** + * Method gluCheckExtension + * + * @param extName is an extension name. + * @param extString is a string of extensions separated by blank(s). There may or + * may not be leading or trailing blank(s) in extString. + * This works in cases of extensions being prefixes of another like + * GL_EXT_texture and GL_EXT_texture3D. + * @return boolean true if extName is found otherwise it returns false. + */ + public static boolean gluCheckExtension(String extName, String extString) { + if (extString == null || extName == null) + return false; + + return extString.indexOf(extName) != -1; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Sphere.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Sphere.java new file mode 100644 index 000000000..9ad006011 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Sphere.java @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +import static org.lwjgl.opengl.GL11.GL_LINE_LOOP; +import static org.lwjgl.opengl.GL11.GL_LINE_STRIP; +import static org.lwjgl.opengl.GL11.GL_POINTS; +import static org.lwjgl.opengl.GL11.GL_QUAD_STRIP; +import static org.lwjgl.opengl.GL11.GL_TRIANGLE_FAN; +import static org.lwjgl.opengl.GL11.glBegin; +import static org.lwjgl.opengl.GL11.glEnd; +import static org.lwjgl.opengl.GL11.glNormal3f; +import static org.lwjgl.opengl.GL11.glVertex3f; +import static org.lwjgl.util.glu.GLU.GLU_FILL; +import static org.lwjgl.util.glu.GLU.GLU_INSIDE; +import static org.lwjgl.util.glu.GLU.GLU_LINE; +import static org.lwjgl.util.glu.GLU.GLU_NONE; +import static org.lwjgl.util.glu.GLU.GLU_POINT; +import static org.lwjgl.util.glu.GLU.GLU_SILHOUETTE; +import static org.lwjgl.util.glu.GLU.PI; + +/** + * Sphere.java + * + * + * Created 23-dec-2003 + * @author Erik Duijs + */ +public class Sphere extends Quadric { + + /** + * Constructor + */ + public Sphere() { + super(); + } + + /** + * draws a sphere of the given radius centered around the origin. + * The sphere is subdivided around the z axis into slices and along the z axis + * into stacks (similar to lines of longitude and latitude). + * + * If the orientation is set to GLU.OUTSIDE (with glu.quadricOrientation), then + * any normals generated point away from the center of the sphere. Otherwise, + * they point toward the center of the sphere. + + * If texturing is turned on (with glu.quadricTexture), then texture + * coordinates are generated so that t ranges from 0.0 at z=-radius to 1.0 at + * z=radius (t increases linearly along longitudinal lines), and s ranges from + * 0.0 at the +y axis, to 0.25 at the +x axis, to 0.5 at the -y axis, to 0.75 + * at the -x axis, and back to 1.0 at the +y axis. + */ + public void draw(float radius, int slices, int stacks) { + // TODO + + float rho, drho, theta, dtheta; + float x, y, z; + float s, t, ds, dt; + int i, j, imin, imax; + boolean normals; + float nsign; + + normals = super.normals != GLU_NONE; + + if (super.orientation == GLU_INSIDE) { + nsign = -1.0f; + } else { + nsign = 1.0f; + } + + drho = PI / stacks; + dtheta = 2.0f * PI / slices; + + if (super.drawStyle == GLU_FILL) { + if (!super.textureFlag) { + // draw +Z end as a triangle fan + glBegin(GL_TRIANGLE_FAN); + glNormal3f(0.0f, 0.0f, 1.0f); + glVertex3f(0.0f, 0.0f, nsign * radius); + for (j = 0; j <= slices; j++) { + theta = (j == slices) ? 0.0f : j * dtheta; + x = -sin(theta) * sin(drho); + y = cos(theta) * sin(drho); + z = nsign * cos(drho); + if (normals) { + glNormal3f(x * nsign, y * nsign, z * nsign); + } + glVertex3f(x * radius, y * radius, z * radius); + } + glEnd(); + } + + ds = 1.0f / slices; + dt = 1.0f / stacks; + t = 1.0f; // because loop now runs from 0 + if (super.textureFlag) { + imin = 0; + imax = stacks; + } else { + imin = 1; + imax = stacks - 1; + } + + // draw intermediate stacks as quad strips + for (i = imin; i < imax; i++) { + rho = i * drho; + glBegin(GL_QUAD_STRIP); + s = 0.0f; + for (j = 0; j <= slices; j++) { + theta = (j == slices) ? 0.0f : j * dtheta; + x = -sin(theta) * sin(rho); + y = cos(theta) * sin(rho); + z = nsign * cos(rho); + if (normals) { + glNormal3f(x * nsign, y * nsign, z * nsign); + } + TXTR_COORD(s, t); + glVertex3f(x * radius, y * radius, z * radius); + x = -sin(theta) * sin(rho + drho); + y = cos(theta) * sin(rho + drho); + z = nsign * cos(rho + drho); + if (normals) { + glNormal3f(x * nsign, y * nsign, z * nsign); + } + TXTR_COORD(s, t - dt); + s += ds; + glVertex3f(x * radius, y * radius, z * radius); + } + glEnd(); + t -= dt; + } + + if (!super.textureFlag) { + // draw -Z end as a triangle fan + glBegin(GL_TRIANGLE_FAN); + glNormal3f(0.0f, 0.0f, -1.0f); + glVertex3f(0.0f, 0.0f, -radius * nsign); + rho = PI - drho; + s = 1.0f; + for (j = slices; j >= 0; j--) { + theta = (j == slices) ? 0.0f : j * dtheta; + x = -sin(theta) * sin(rho); + y = cos(theta) * sin(rho); + z = nsign * cos(rho); + if (normals) + glNormal3f(x * nsign, y * nsign, z * nsign); + s -= ds; + glVertex3f(x * radius, y * radius, z * radius); + } + glEnd(); + } + } else if ( + super.drawStyle == GLU_LINE + || super.drawStyle == GLU_SILHOUETTE) { + // draw stack lines + for (i = 1; + i < stacks; + i++) { // stack line at i==stacks-1 was missing here + rho = i * drho; + glBegin(GL_LINE_LOOP); + for (j = 0; j < slices; j++) { + theta = j * dtheta; + x = cos(theta) * sin(rho); + y = sin(theta) * sin(rho); + z = cos(rho); + if (normals) + glNormal3f(x * nsign, y * nsign, z * nsign); + glVertex3f(x * radius, y * radius, z * radius); + } + glEnd(); + } + // draw slice lines + for (j = 0; j < slices; j++) { + theta = j * dtheta; + glBegin(GL_LINE_STRIP); + for (i = 0; i <= stacks; i++) { + rho = i * drho; + x = cos(theta) * sin(rho); + y = sin(theta) * sin(rho); + z = cos(rho); + if (normals) + glNormal3f(x * nsign, y * nsign, z * nsign); + glVertex3f(x * radius, y * radius, z * radius); + } + glEnd(); + } + } else if (super.drawStyle == GLU_POINT) { + // top and bottom-most points + glBegin(GL_POINTS); + if (normals) + glNormal3f(0.0f, 0.0f, nsign); + glVertex3f(0.0f, 0.0f, radius); + if (normals) + glNormal3f(0.0f, 0.0f, -nsign); + glVertex3f(0.0f, 0.0f, -radius); + + // loop over stacks + for (i = 1; i < stacks - 1; i++) { + rho = i * drho; + for (j = 0; j < slices; j++) { + theta = j * dtheta; + x = cos(theta) * sin(rho); + y = sin(theta) * sin(rho); + z = cos(rho); + if (normals) + glNormal3f(x * nsign, y * nsign, z * nsign); + glVertex3f(x * radius, y * radius, z * radius); + } + } + glEnd(); + } + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Util.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Util.java new file mode 100644 index 000000000..0ecbaec10 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/Util.java @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2002-2008 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.glu; + +import static org.lwjgl.opengl.GL11.GL_ALPHA; +import static org.lwjgl.opengl.GL11.GL_BITMAP; +import static org.lwjgl.opengl.GL11.GL_BLUE; +import static org.lwjgl.opengl.GL11.GL_BYTE; +import static org.lwjgl.opengl.GL11.GL_COLOR_INDEX; +import static org.lwjgl.opengl.GL11.GL_DEPTH_COMPONENT; +import static org.lwjgl.opengl.GL11.GL_FLOAT; +import static org.lwjgl.opengl.GL11.GL_GREEN; +import static org.lwjgl.opengl.GL11.GL_INT; +import static org.lwjgl.opengl.GL11.GL_LUMINANCE; +import static org.lwjgl.opengl.GL11.GL_LUMINANCE_ALPHA; +import static org.lwjgl.opengl.GL11.GL_RED; +import static org.lwjgl.opengl.GL11.GL_RGB; +import static org.lwjgl.opengl.GL11.GL_RGBA; +import static org.lwjgl.opengl.GL11.GL_SHORT; +import static org.lwjgl.opengl.GL11.GL_STENCIL_INDEX; +import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE; +import static org.lwjgl.opengl.GL11.GL_UNSIGNED_INT; +import static org.lwjgl.opengl.GL11.GL_UNSIGNED_SHORT; +import static org.lwjgl.opengl.GL11.glGetInteger; +import static org.lwjgl.opengl.GL12.GL_BGR; +import static org.lwjgl.opengl.GL12.GL_BGRA; + +import org.lwjgl.BufferUtils; + +import java.nio.IntBuffer; + +/** + * Util.java + *

    + *

    + * Created 7-jan-2004 + * + * @author Erik Duijs + */ +public class Util { + + /** + * temp IntBuffer of one for getting an int from some GL functions + */ + private static IntBuffer scratch = BufferUtils.createIntBuffer(16); + + /** + * Return ceiling of integer division + * + * @param a + * @param b + * + * @return int + */ + protected static int ceil(int a, int b) { + return (a % b == 0 ? a / b : a / b + 1); + } + + /** + * Normalize vector + * + * @param v + * + * @return float[] + */ + protected static float[] normalize(float[] v) { + float r; + + r = (float)Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + if ( r == 0.0 ) + return v; + + r = 1.0f / r; + + v[0] *= r; + v[1] *= r; + v[2] *= r; + + return v; + } + + /** + * Calculate cross-product + * + * @param v1 + * @param v2 + * @param result + */ + protected static void cross(float[] v1, float[] v2, float[] result) { + result[0] = v1[1] * v2[2] - v1[2] * v2[1]; + result[1] = v1[2] * v2[0] - v1[0] * v2[2]; + result[2] = v1[0] * v2[1] - v1[1] * v2[0]; + } + + /** + * Method compPerPix. + * + * @param format + * + * @return int + */ + protected static int compPerPix(int format) { + /* Determine number of components per pixel */ + switch ( format ) { + case GL_COLOR_INDEX: + case GL_STENCIL_INDEX: + case GL_DEPTH_COMPONENT: + case GL_RED: + case GL_GREEN: + case GL_BLUE: + case GL_ALPHA: + case GL_LUMINANCE: + return 1; + case GL_LUMINANCE_ALPHA: + return 2; + case GL_RGB: + case GL_BGR: + return 3; + case GL_RGBA: + case GL_BGRA: + return 4; + default : + return -1; + } + } + + /** + * Method nearestPower. + *

    + * Compute the nearest power of 2 number. This algorithm is a little strange, but it works quite well. + * + * @param value + * + * @return int + */ + protected static int nearestPower(int value) { + int i; + + i = 1; + + /* Error! */ + if ( value == 0 ) + return -1; + + for ( ; ; ) { + if ( value == 1 ) { + return i; + } else if ( value == 3 ) { + return i << 2; + } + value >>= 1; + i <<= 1; + } + } + + /** + * Method bytesPerPixel. + * + * @param format + * @param type + * + * @return int + */ + protected static int bytesPerPixel(int format, int type) { + int n, m; + + switch ( format ) { + case GL_COLOR_INDEX: + case GL_STENCIL_INDEX: + case GL_DEPTH_COMPONENT: + case GL_RED: + case GL_GREEN: + case GL_BLUE: + case GL_ALPHA: + case GL_LUMINANCE: + n = 1; + break; + case GL_LUMINANCE_ALPHA: + n = 2; + break; + case GL_RGB: + case GL_BGR: + n = 3; + break; + case GL_RGBA: + case GL_BGRA: + n = 4; + break; + default : + n = 0; + } + + switch ( type ) { + case GL_UNSIGNED_BYTE: + m = 1; + break; + case GL_BYTE: + m = 1; + break; + case GL_BITMAP: + m = 1; + break; + case GL_UNSIGNED_SHORT: + m = 2; + break; + case GL_SHORT: + m = 2; + break; + case GL_UNSIGNED_INT: + m = 4; + break; + case GL_INT: + m = 4; + break; + case GL_FLOAT: + m = 4; + break; + default : + m = 0; + } + + return n * m; + } + + /** + * Convenience method for returning an int, rather than getting it out of a buffer yourself. + * + * @param what + * + * @return int + */ + protected static int glGetIntegerv(int what) { + scratch.rewind(); + glGetInteger(what, scratch); + return scratch.get(); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/ActiveRegion.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/ActiveRegion.java new file mode 100644 index 000000000..7b566ec0f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/ActiveRegion.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class ActiveRegion { + GLUhalfEdge eUp; /* upper edge, directed right to left */ + DictNode nodeUp; /* dictionary node corresponding to eUp */ + int windingNumber; /* used to determine which regions are + * inside the polygon */ + boolean inside; /* is this region inside the polygon? */ + boolean sentinel; /* marks fake edges at t = +/-infinity */ + boolean dirty; /* marks regions where the upper or lower + * edge has changed, but we haven't checked + * whether they intersect yet */ + boolean fixUpperEdge; /* marks temporary edges introduced when + * we process a "right vertex" (one without + * any edges leaving to the right) */ +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/CachedVertex.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/CachedVertex.java new file mode 100644 index 000000000..d69547609 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/CachedVertex.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class CachedVertex { + public double[] coords = new double[3]; + public Object data; +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Dict.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Dict.java new file mode 100644 index 000000000..55c332092 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Dict.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class Dict { + DictNode head; + Object frame; + DictLeq leq; + + private Dict() { + } + + static Dict dictNewDict(Object frame, DictLeq leq) { + Dict dict = new Dict(); + dict.head = new DictNode(); + + dict.head.key = null; + dict.head.next = dict.head; + dict.head.prev = dict.head; + + dict.frame = frame; + dict.leq = leq; + + return dict; + } + + static void dictDeleteDict(Dict dict) { + dict.head = null; + dict.frame = null; + dict.leq = null; + } + + static DictNode dictInsert(Dict dict, Object key) { + return dictInsertBefore(dict, dict.head, key); + } + + static DictNode dictInsertBefore(Dict dict, DictNode node, Object key) { + do { + node = node.prev; + } while (node.key != null && !dict.leq.leq(dict.frame, node.key, key)); + + DictNode newNode = new DictNode(); + newNode.key = key; + newNode.next = node.next; + node.next.prev = newNode; + newNode.prev = node; + node.next = newNode; + + return newNode; + } + + static Object dictKey(DictNode aNode) { + return aNode.key; + } + + static DictNode dictSucc(DictNode aNode) { + return aNode.next; + } + + static DictNode dictPred(DictNode aNode) { + return aNode.prev; + } + + static DictNode dictMin(Dict aDict) { + return aDict.head.next; + } + + static DictNode dictMax(Dict aDict) { + return aDict.head.prev; + } + + static void dictDelete(Dict dict, DictNode node) { + node.next.prev = node.prev; + node.prev.next = node.next; + } + + static DictNode dictSearch(Dict dict, Object key) { + DictNode node = dict.head; + + do { + node = node.next; + } while (node.key != null && !(dict.leq.leq(dict.frame, key, node.key))); + + return node; + } + + public interface DictLeq { + boolean leq(Object frame, Object key1, Object key2); + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/DictNode.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/DictNode.java new file mode 100644 index 000000000..ec93eb5b1 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/DictNode.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class DictNode { + Object key; + DictNode next; + DictNode prev; +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUface.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUface.java new file mode 100644 index 000000000..40ba208ae --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUface.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class GLUface { + public GLUface next; /* next face (never NULL) */ + public GLUface prev; /* previous face (never NULL) */ + public GLUhalfEdge anEdge; /* a half edge with this left face */ + public Object data; /* room for client's data */ + + /* Internal data (keep hidden) */ + public GLUface trail; /* "stack" for conversion to strips */ + public boolean marked; /* flag for conversion to strips */ + public boolean inside; /* this face is in the polygon interior */ +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUhalfEdge.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUhalfEdge.java new file mode 100644 index 000000000..65824c633 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUhalfEdge.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + + + +class GLUhalfEdge { + public GLUhalfEdge next; /* doubly-linked list (prev==Sym->next) */ + public GLUhalfEdge Sym; /* same edge, opposite direction */ + public GLUhalfEdge Onext; /* next edge CCW around origin */ + public GLUhalfEdge Lnext; /* next edge CCW around left face */ + public GLUvertex Org; /* origin vertex (Overtex too long) */ + public GLUface Lface; /* left face */ + + /* Internal data (keep hidden) */ + public ActiveRegion activeRegion; /* a region with this upper edge (sweep.c) */ + public int winding; /* change in winding number when crossing */ + public boolean first; + + GLUhalfEdge(boolean first) { + this.first = first; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUmesh.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUmesh.java new file mode 100644 index 000000000..3aa41edbc --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUmesh.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + + + +class GLUmesh { + GLUvertex vHead = new GLUvertex(); /* dummy header for vertex list */ + GLUface fHead = new GLUface(); /* dummy header for face list */ + GLUhalfEdge eHead = new GLUhalfEdge(true); /* dummy header for edge list */ + GLUhalfEdge eHeadSym = new GLUhalfEdge(false); /* and its symmetric counterpart */ +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUtessellatorImpl.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUtessellatorImpl.java new file mode 100644 index 000000000..9edcb163f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUtessellatorImpl.java @@ -0,0 +1,697 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +import static org.lwjgl.util.glu.GLU.GLU_INVALID_ENUM; +import static org.lwjgl.util.glu.GLU.GLU_INVALID_VALUE; +import static org.lwjgl.util.glu.GLU.GLU_OUT_OF_MEMORY; +import static org.lwjgl.util.glu.GLU.GLU_TESS_BEGIN; +import static org.lwjgl.util.glu.GLU.GLU_TESS_BEGIN_DATA; +import static org.lwjgl.util.glu.GLU.GLU_TESS_BOUNDARY_ONLY; +import static org.lwjgl.util.glu.GLU.GLU_TESS_COMBINE; +import static org.lwjgl.util.glu.GLU.GLU_TESS_COMBINE_DATA; +import static org.lwjgl.util.glu.GLU.GLU_TESS_COORD_TOO_LARGE; +import static org.lwjgl.util.glu.GLU.GLU_TESS_EDGE_FLAG; +import static org.lwjgl.util.glu.GLU.GLU_TESS_EDGE_FLAG_DATA; +import static org.lwjgl.util.glu.GLU.GLU_TESS_END; +import static org.lwjgl.util.glu.GLU.GLU_TESS_END_DATA; +import static org.lwjgl.util.glu.GLU.GLU_TESS_ERROR; +import static org.lwjgl.util.glu.GLU.GLU_TESS_ERROR_DATA; +import static org.lwjgl.util.glu.GLU.GLU_TESS_MAX_COORD; +import static org.lwjgl.util.glu.GLU.GLU_TESS_MISSING_BEGIN_CONTOUR; +import static org.lwjgl.util.glu.GLU.GLU_TESS_MISSING_BEGIN_POLYGON; +import static org.lwjgl.util.glu.GLU.GLU_TESS_MISSING_END_CONTOUR; +import static org.lwjgl.util.glu.GLU.GLU_TESS_MISSING_END_POLYGON; +import static org.lwjgl.util.glu.GLU.GLU_TESS_TOLERANCE; +import static org.lwjgl.util.glu.GLU.GLU_TESS_VERTEX; +import static org.lwjgl.util.glu.GLU.GLU_TESS_VERTEX_DATA; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_ABS_GEQ_TWO; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_NEGATIVE; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_NONZERO; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_ODD; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_POSITIVE; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_RULE; + +import org.lwjgl.util.glu.GLUtessellator; +import org.lwjgl.util.glu.GLUtessellatorCallback; +import org.lwjgl.util.glu.GLUtessellatorCallbackAdapter; + +public class GLUtessellatorImpl implements GLUtessellator { + public static final int TESS_MAX_CACHE = 100; + + private int state; /* what begin/end calls have we seen? */ + + private GLUhalfEdge lastEdge; /* lastEdge->Org is the most recent vertex */ + GLUmesh mesh; /* stores the input contours, and eventually + the tessellation itself */ + + /*** state needed for projecting onto the sweep plane ***/ + + double[] normal = new double[3]; /* user-specified normal (if provided) */ + double[] sUnit = new double[3]; /* unit vector in s-direction (debugging) */ + double[] tUnit = new double[3]; /* unit vector in t-direction (debugging) */ + + /*** state needed for the line sweep ***/ + + private double relTolerance; /* tolerance for merging features */ + int windingRule; /* rule for determining polygon interior */ + boolean fatalError; /* fatal error: needed combine callback */ + + Dict dict; /* edge dictionary for sweep line */ + PriorityQ pq; /* priority queue of vertex events */ + GLUvertex event; /* current sweep event being processed */ + + /*** state needed for rendering callbacks (see render.c) ***/ + + boolean flagBoundary; /* mark boundary edges (use EdgeFlag) */ + boolean boundaryOnly; /* Extract contours, not triangles */ + GLUface lonelyTriList; + /* list of triangles which could not be rendered as strips or fans */ + + + + /*** state needed to cache single-contour polygons for renderCache() */ + + private boolean flushCacheOnNextVertex; /* empty cache on next vertex() call */ + int cacheCount; /* number of cached vertices */ + CachedVertex[] cache = new CachedVertex[TESS_MAX_CACHE]; /* the vertex data */ + + /*** rendering callbacks that also pass polygon data ***/ + private Object polygonData; /* client data for current polygon */ + + private GLUtessellatorCallback callBegin; + private GLUtessellatorCallback callEdgeFlag; + private GLUtessellatorCallback callVertex; + private GLUtessellatorCallback callEnd; +// private GLUtessellatorCallback callMesh; + private GLUtessellatorCallback callError; + private GLUtessellatorCallback callCombine; + + private GLUtessellatorCallback callBeginData; + private GLUtessellatorCallback callEdgeFlagData; + private GLUtessellatorCallback callVertexData; + private GLUtessellatorCallback callEndData; +// private GLUtessellatorCallback callMeshData; + private GLUtessellatorCallback callErrorData; + private GLUtessellatorCallback callCombineData; + + private static final double GLU_TESS_DEFAULT_TOLERANCE = 0.0; +// private static final int GLU_TESS_MESH = 100112; /* void (*)(GLUmesh *mesh) */ + private static GLUtessellatorCallback NULL_CB = new GLUtessellatorCallbackAdapter(); + +// #define MAX_FAST_ALLOC (MAX(sizeof(EdgePair), \ +// MAX(sizeof(GLUvertex),sizeof(GLUface)))) + + public GLUtessellatorImpl() { + state = TessState.T_DORMANT; + + normal[0] = 0; + normal[1] = 0; + normal[2] = 0; + + relTolerance = GLU_TESS_DEFAULT_TOLERANCE; + windingRule = GLU_TESS_WINDING_ODD; + flagBoundary = false; + boundaryOnly = false; + + callBegin = NULL_CB; + callEdgeFlag = NULL_CB; + callVertex = NULL_CB; + callEnd = NULL_CB; + callError = NULL_CB; + callCombine = NULL_CB; +// callMesh = NULL_CB; + + callBeginData = NULL_CB; + callEdgeFlagData = NULL_CB; + callVertexData = NULL_CB; + callEndData = NULL_CB; + callErrorData = NULL_CB; + callCombineData = NULL_CB; + + polygonData = null; + + for (int i = 0; i < cache.length; i++) { + cache[i] = new CachedVertex(); + } + } + + public static GLUtessellator gluNewTess() + { + return new GLUtessellatorImpl(); + } + + + private void makeDormant() { + /* Return the tessellator to its original dormant state. */ + + if (mesh != null) { + Mesh.__gl_meshDeleteMesh(mesh); + } + state = TessState.T_DORMANT; + lastEdge = null; + mesh = null; + } + + private void requireState(int newState) { + if (state != newState) gotoState(newState); + } + + private void gotoState(int newState) { + while (state != newState) { + /* We change the current state one level at a time, to get to + * the desired state. + */ + if (state < newState) { + if (state == TessState.T_DORMANT) { + callErrorOrErrorData(GLU_TESS_MISSING_BEGIN_POLYGON); + gluTessBeginPolygon(null); + } else if (state == TessState.T_IN_POLYGON) { + callErrorOrErrorData(GLU_TESS_MISSING_BEGIN_CONTOUR); + gluTessBeginContour(); + } + } else { + if (state == TessState.T_IN_CONTOUR) { + callErrorOrErrorData(GLU_TESS_MISSING_END_CONTOUR); + gluTessEndContour(); + } else if (state == TessState.T_IN_POLYGON) { + callErrorOrErrorData(GLU_TESS_MISSING_END_POLYGON); + /* gluTessEndPolygon( tess ) is too much work! */ + makeDormant(); + } + } + } + } + + public void gluDeleteTess() { + requireState(TessState.T_DORMANT); + } + + public void gluTessProperty(int which, double value) { + switch (which) { + case GLU_TESS_TOLERANCE: + if (value < 0.0 || value > 1.0) break; + relTolerance = value; + return; + + case GLU_TESS_WINDING_RULE: + int windingRule = (int) value; + if (windingRule != value) break; /* not an integer */ + + switch (windingRule) { + case GLU_TESS_WINDING_ODD: + case GLU_TESS_WINDING_NONZERO: + case GLU_TESS_WINDING_POSITIVE: + case GLU_TESS_WINDING_NEGATIVE: + case GLU_TESS_WINDING_ABS_GEQ_TWO: + this.windingRule = windingRule; + return; + default: + break; + } + + case GLU_TESS_BOUNDARY_ONLY: + boundaryOnly = (value != 0); + return; + + default: + callErrorOrErrorData(GLU_INVALID_ENUM); + return; + } + callErrorOrErrorData(GLU_INVALID_VALUE); + } + +/* Returns tessellator property */ + public void gluGetTessProperty(int which, double[] value, int value_offset) { + switch (which) { + case GLU_TESS_TOLERANCE: +/* tolerance should be in range [0..1] */ + assert (0.0 <= relTolerance && relTolerance <= 1.0); + value[value_offset] = relTolerance; + break; + case GLU_TESS_WINDING_RULE: + assert (windingRule == GLU_TESS_WINDING_ODD || + windingRule == GLU_TESS_WINDING_NONZERO || + windingRule == GLU_TESS_WINDING_POSITIVE || + windingRule == GLU_TESS_WINDING_NEGATIVE || + windingRule == GLU_TESS_WINDING_ABS_GEQ_TWO); + value[value_offset] = windingRule; + break; + case GLU_TESS_BOUNDARY_ONLY: + assert (boundaryOnly == true || boundaryOnly == false); + value[value_offset] = boundaryOnly ? 1 : 0; + break; + default: + value[value_offset] = 0.0; + callErrorOrErrorData(GLU_INVALID_ENUM); + break; + } + } /* gluGetTessProperty() */ + + public void gluTessNormal(double x, double y, double z) { + normal[0] = x; + normal[1] = y; + normal[2] = z; + } + + public void gluTessCallback(int which, GLUtessellatorCallback aCallback) { + switch (which) { + case GLU_TESS_BEGIN: + callBegin = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_BEGIN_DATA: + callBeginData = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_EDGE_FLAG: + callEdgeFlag = aCallback == null ? NULL_CB : aCallback; +/* If the client wants boundary edges to be flagged, + * we render everything as separate triangles (no strips or fans). + */ + flagBoundary = aCallback != null; + return; + case GLU_TESS_EDGE_FLAG_DATA: + callEdgeFlagData = callBegin = aCallback == null ? NULL_CB : aCallback; +/* If the client wants boundary edges to be flagged, + * we render everything as separate triangles (no strips or fans). + */ + flagBoundary = (aCallback != null); + return; + case GLU_TESS_VERTEX: + callVertex = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_VERTEX_DATA: + callVertexData = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_END: + callEnd = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_END_DATA: + callEndData = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_ERROR: + callError = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_ERROR_DATA: + callErrorData = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_COMBINE: + callCombine = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_COMBINE_DATA: + callCombineData = aCallback == null ? NULL_CB : aCallback; + return; +// case GLU_TESS_MESH: +// callMesh = aCallback == null ? NULL_CB : aCallback; +// return; + default: + callErrorOrErrorData(GLU_INVALID_ENUM); + return; + } + } + + private boolean addVertex(double[] coords, Object vertexData) { + GLUhalfEdge e; + + e = lastEdge; + if (e == null) { +/* Make a self-loop (one vertex, one edge). */ + + e = Mesh.__gl_meshMakeEdge(mesh); + if (e == null) return false; + if (!Mesh.__gl_meshSplice(e, e.Sym)) return false; + } else { +/* Create a new vertex and edge which immediately follow e + * in the ordering around the left face. + */ + if (Mesh.__gl_meshSplitEdge(e) == null) return false; + e = e.Lnext; + } + +/* The new vertex is now e.Org. */ + e.Org.data = vertexData; + e.Org.coords[0] = coords[0]; + e.Org.coords[1] = coords[1]; + e.Org.coords[2] = coords[2]; + +/* The winding of an edge says how the winding number changes as we + * cross from the edge''s right face to its left face. We add the + * vertices in such an order that a CCW contour will add +1 to + * the winding number of the region inside the contour. + */ + e.winding = 1; + e.Sym.winding = -1; + + lastEdge = e; + + return true; + } + + private void cacheVertex(double[] coords, Object vertexData) { + if (cache[cacheCount] == null) { + cache[cacheCount] = new CachedVertex(); + } + + CachedVertex v = cache[cacheCount]; + + v.data = vertexData; + v.coords[0] = coords[0]; + v.coords[1] = coords[1]; + v.coords[2] = coords[2]; + ++cacheCount; + } + + + private boolean flushCache() { + CachedVertex[] v = cache; + + mesh = Mesh.__gl_meshNewMesh(); + if (mesh == null) return false; + + for (int i = 0; i < cacheCount; i++) { + CachedVertex vertex = v[i]; + if (!addVertex(vertex.coords, vertex.data)) return false; + } + cacheCount = 0; + flushCacheOnNextVertex = false; + + return true; + } + + public void gluTessVertex(double[] coords, int coords_offset, Object vertexData) { + int i; + boolean tooLarge = false; + double x; + double[] clamped = new double[3]; + + requireState(TessState.T_IN_CONTOUR); + + if (flushCacheOnNextVertex) { + if (!flushCache()) { + callErrorOrErrorData(GLU_OUT_OF_MEMORY); + return; + } + lastEdge = null; + } + for (i = 0; i < 3; ++i) { + x = coords[i+coords_offset]; + if (x < -GLU_TESS_MAX_COORD) { + x = -GLU_TESS_MAX_COORD; + tooLarge = true; + } + if (x > GLU_TESS_MAX_COORD) { + x = GLU_TESS_MAX_COORD; + tooLarge = true; + } + clamped[i] = x; + } + if (tooLarge) { + callErrorOrErrorData(GLU_TESS_COORD_TOO_LARGE); + } + + if (mesh == null) { + if (cacheCount < TESS_MAX_CACHE) { + cacheVertex(clamped, vertexData); + return; + } + if (!flushCache()) { + callErrorOrErrorData(GLU_OUT_OF_MEMORY); + return; + } + } + + if (!addVertex(clamped, vertexData)) { + callErrorOrErrorData(GLU_OUT_OF_MEMORY); + } + } + + + public void gluTessBeginPolygon(Object data) { + requireState(TessState.T_DORMANT); + + state = TessState.T_IN_POLYGON; + cacheCount = 0; + flushCacheOnNextVertex = false; + mesh = null; + + polygonData = data; + } + + + public void gluTessBeginContour() { + requireState(TessState.T_IN_POLYGON); + + state = TessState.T_IN_CONTOUR; + lastEdge = null; + if (cacheCount > 0) { +/* Just set a flag so we don't get confused by empty contours + * -- these can be generated accidentally with the obsolete + * NextContour() interface. + */ + flushCacheOnNextVertex = true; + } + } + + + public void gluTessEndContour() { + requireState(TessState.T_IN_CONTOUR); + state = TessState.T_IN_POLYGON; + } + + public void gluTessEndPolygon() { + GLUmesh mesh; + + try { + requireState(TessState.T_IN_POLYGON); + state = TessState.T_DORMANT; + + if (this.mesh == null) { + if (!flagBoundary /*&& callMesh == NULL_CB*/) { + +/* Try some special code to make the easy cases go quickly + * (eg. convex polygons). This code does NOT handle multiple contours, + * intersections, edge flags, and of course it does not generate + * an explicit mesh either. + */ + if (Render.__gl_renderCache(this)) { + polygonData = null; + return; + } + } + if (!flushCache()) throw new RuntimeException(); /* could've used a label*/ + } + +/* Determine the polygon normal and project vertices onto the plane + * of the polygon. + */ + Normal.__gl_projectPolygon(this); + +/* __gl_computeInterior( tess ) computes the planar arrangement specified + * by the given contours, and further subdivides this arrangement + * into regions. Each region is marked "inside" if it belongs + * to the polygon, according to the rule given by windingRule. + * Each interior region is guaranteed be monotone. + */ + if (!Sweep.__gl_computeInterior(this)) { + throw new RuntimeException(); /* could've used a label */ + } + + mesh = this.mesh; + if (!fatalError) { + boolean rc = true; + +/* If the user wants only the boundary contours, we throw away all edges + * except those which separate the interior from the exterior. + * Otherwise we tessellate all the regions marked "inside". + */ + if (boundaryOnly) { + rc = TessMono.__gl_meshSetWindingNumber(mesh, 1, true); + } else { + rc = TessMono.__gl_meshTessellateInterior(mesh); + } + if (!rc) throw new RuntimeException(); /* could've used a label */ + + Mesh.__gl_meshCheckMesh(mesh); + + if (callBegin != NULL_CB || callEnd != NULL_CB + || callVertex != NULL_CB || callEdgeFlag != NULL_CB + || callBeginData != NULL_CB + || callEndData != NULL_CB + || callVertexData != NULL_CB + || callEdgeFlagData != NULL_CB) { + if (boundaryOnly) { + Render.__gl_renderBoundary(this, mesh); /* output boundary contours */ + } else { + Render.__gl_renderMesh(this, mesh); /* output strips and fans */ + } + } +// if (callMesh != NULL_CB) { +// +///* Throw away the exterior faces, so that all faces are interior. +// * This way the user doesn't have to check the "inside" flag, +// * and we don't need to even reveal its existence. It also leaves +// * the freedom for an implementation to not generate the exterior +// * faces in the first place. +// */ +// TessMono.__gl_meshDiscardExterior(mesh); +// callMesh.mesh(mesh); /* user wants the mesh itself */ +// mesh = null; +// polygonData = null; +// return; +// } + } + Mesh.__gl_meshDeleteMesh(mesh); + polygonData = null; + mesh = null; + } catch (Exception e) { + e.printStackTrace(); + callErrorOrErrorData(GLU_OUT_OF_MEMORY); + } + } + + /*******************************************************/ + +/* Obsolete calls -- for backward compatibility */ + + public void gluBeginPolygon() { + gluTessBeginPolygon(null); + gluTessBeginContour(); + } + + +/*ARGSUSED*/ + public void gluNextContour(int type) { + gluTessEndContour(); + gluTessBeginContour(); + } + + + public void gluEndPolygon() { + gluTessEndContour(); + gluTessEndPolygon(); + } + + void callBeginOrBeginData(int a) { + if (callBeginData != NULL_CB) + callBeginData.beginData(a, polygonData); + else + callBegin.begin(a); + } + + void callVertexOrVertexData(Object a) { + if (callVertexData != NULL_CB) + callVertexData.vertexData(a, polygonData); + else + callVertex.vertex(a); + } + + void callEdgeFlagOrEdgeFlagData(boolean a) { + if (callEdgeFlagData != NULL_CB) + callEdgeFlagData.edgeFlagData(a, polygonData); + else + callEdgeFlag.edgeFlag(a); + } + + void callEndOrEndData() { + if (callEndData != NULL_CB) + callEndData.endData(polygonData); + else + callEnd.end(); + } + + void callCombineOrCombineData(double[] coords, Object[] vertexData, float[] weights, Object[] outData) { + if (callCombineData != NULL_CB) + callCombineData.combineData(coords, vertexData, weights, outData, polygonData); + else + callCombine.combine(coords, vertexData, weights, outData); + } + + void callErrorOrErrorData(int a) { + if (callErrorData != NULL_CB) + callErrorData.errorData(a, polygonData); + else + callError.error(a); + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUvertex.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUvertex.java new file mode 100644 index 000000000..374c968c3 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/GLUvertex.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class GLUvertex { + public GLUvertex next; /* next vertex (never NULL) */ + public GLUvertex prev; /* previous vertex (never NULL) */ + public GLUhalfEdge anEdge; /* a half-edge with this origin */ + public Object data; /* client's data */ + + /* Internal data (keep hidden) */ + public double[] coords = new double[3]; /* vertex location in 3D */ + public double s, t; /* projection onto the sweep plane */ + public int pqHandle; /* to allow deletion from priority queue */ +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Geom.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Geom.java new file mode 100644 index 000000000..23fef1fc6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Geom.java @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class Geom { + private Geom() { + } + + /* Given three vertices u,v,w such that VertLeq(u,v) && VertLeq(v,w), + * evaluates the t-coord of the edge uw at the s-coord of the vertex v. + * Returns v->t - (uw)(v->s), ie. the signed distance from uw to v. + * If uw is vertical (and thus passes thru v), the result is zero. + * + * The calculation is extremely accurate and stable, even when v + * is very close to u or w. In particular if we set v->t = 0 and + * let r be the negated result (this evaluates (uw)(v->s)), then + * r is guaranteed to satisfy MIN(u->t,w->t) <= r <= MAX(u->t,w->t). + */ + static double EdgeEval(GLUvertex u, GLUvertex v, GLUvertex w) { + double gapL, gapR; + + assert (VertLeq(u, v) && VertLeq(v, w)); + + gapL = v.s - u.s; + gapR = w.s - v.s; + + if (gapL + gapR > 0) { + if (gapL < gapR) { + return (v.t - u.t) + (u.t - w.t) * (gapL / (gapL + gapR)); + } else { + return (v.t - w.t) + (w.t - u.t) * (gapR / (gapL + gapR)); + } + } + /* vertical line */ + return 0; + } + + static double EdgeSign(GLUvertex u, GLUvertex v, GLUvertex w) { + double gapL, gapR; + + assert (VertLeq(u, v) && VertLeq(v, w)); + + gapL = v.s - u.s; + gapR = w.s - v.s; + + if (gapL + gapR > 0) { + return (v.t - w.t) * gapL + (v.t - u.t) * gapR; + } + /* vertical line */ + return 0; + } + + + /*********************************************************************** + * Define versions of EdgeSign, EdgeEval with s and t transposed. + */ + + static double TransEval(GLUvertex u, GLUvertex v, GLUvertex w) { + /* Given three vertices u,v,w such that TransLeq(u,v) && TransLeq(v,w), + * evaluates the t-coord of the edge uw at the s-coord of the vertex v. + * Returns v->s - (uw)(v->t), ie. the signed distance from uw to v. + * If uw is vertical (and thus passes thru v), the result is zero. + * + * The calculation is extremely accurate and stable, even when v + * is very close to u or w. In particular if we set v->s = 0 and + * let r be the negated result (this evaluates (uw)(v->t)), then + * r is guaranteed to satisfy MIN(u->s,w->s) <= r <= MAX(u->s,w->s). + */ + double gapL, gapR; + + assert (TransLeq(u, v) && TransLeq(v, w)); + + gapL = v.t - u.t; + gapR = w.t - v.t; + + if (gapL + gapR > 0) { + if (gapL < gapR) { + return (v.s - u.s) + (u.s - w.s) * (gapL / (gapL + gapR)); + } else { + return (v.s - w.s) + (w.s - u.s) * (gapR / (gapL + gapR)); + } + } + /* vertical line */ + return 0; + } + + static double TransSign(GLUvertex u, GLUvertex v, GLUvertex w) { + /* Returns a number whose sign matches TransEval(u,v,w) but which + * is cheaper to evaluate. Returns > 0, == 0 , or < 0 + * as v is above, on, or below the edge uw. + */ + double gapL, gapR; + + assert (TransLeq(u, v) && TransLeq(v, w)); + + gapL = v.t - u.t; + gapR = w.t - v.t; + + if (gapL + gapR > 0) { + return (v.s - w.s) * gapL + (v.s - u.s) * gapR; + } + /* vertical line */ + return 0; + } + + + static boolean VertCCW(GLUvertex u, GLUvertex v, GLUvertex w) { + /* For almost-degenerate situations, the results are not reliable. + * Unless the floating-point arithmetic can be performed without + * rounding errors, *any* implementation will give incorrect results + * on some degenerate inputs, so the client must have some way to + * handle this situation. + */ + return (u.s * (v.t - w.t) + v.s * (w.t - u.t) + w.s * (u.t - v.t)) >= 0; + } + +/* Given parameters a,x,b,y returns the value (b*x+a*y)/(a+b), + * or (x+y)/2 if a==b==0. It requires that a,b >= 0, and enforces + * this in the rare case that one argument is slightly negative. + * The implementation is extremely stable numerically. + * In particular it guarantees that the result r satisfies + * MIN(x,y) <= r <= MAX(x,y), and the results are very accurate + * even when a and b differ greatly in magnitude. + */ + static double Interpolate(double a, double x, double b, double y) { + a = (a < 0) ? 0 : a; + b = (b < 0) ? 0 : b; + if (a <= b) { + if (b == 0) { + return (x + y) / 2.0; + } else { + return (x + (y - x) * (a / (a + b))); + } + } else { + return (y + (x - y) * (b / (a + b))); + } + } + + static void EdgeIntersect(GLUvertex o1, GLUvertex d1, + GLUvertex o2, GLUvertex d2, + GLUvertex v) +/* Given edges (o1,d1) and (o2,d2), compute their point of intersection. + * The computed point is guaranteed to lie in the intersection of the + * bounding rectangles defined by each edge. + */ { + double z1, z2; + + /* This is certainly not the most efficient way to find the intersection + * of two line segments, but it is very numerically stable. + * + * Strategy: find the two middle vertices in the VertLeq ordering, + * and interpolate the intersection s-value from these. Then repeat + * using the TransLeq ordering to find the intersection t-value. + */ + + if (!VertLeq(o1, d1)) { + GLUvertex temp = o1; + o1 = d1; + d1 = temp; + } + if (!VertLeq(o2, d2)) { + GLUvertex temp = o2; + o2 = d2; + d2 = temp; + } + if (!VertLeq(o1, o2)) { + GLUvertex temp = o1; + o1 = o2; + o2 = temp; + temp = d1; + d1 = d2; + d2 = temp; + } + + if (!VertLeq(o2, d1)) { + /* Technically, no intersection -- do our best */ + v.s = (o2.s + d1.s) / 2.0; + } else if (VertLeq(d1, d2)) { + /* Interpolate between o2 and d1 */ + z1 = EdgeEval(o1, o2, d1); + z2 = EdgeEval(o2, d1, d2); + if (z1 + z2 < 0) { + z1 = -z1; + z2 = -z2; + } + v.s = Interpolate(z1, o2.s, z2, d1.s); + } else { + /* Interpolate between o2 and d2 */ + z1 = EdgeSign(o1, o2, d1); + z2 = -EdgeSign(o1, d2, d1); + if (z1 + z2 < 0) { + z1 = -z1; + z2 = -z2; + } + v.s = Interpolate(z1, o2.s, z2, d2.s); + } + + /* Now repeat the process for t */ + + if (!TransLeq(o1, d1)) { + GLUvertex temp = o1; + o1 = d1; + d1 = temp; + } + if (!TransLeq(o2, d2)) { + GLUvertex temp = o2; + o2 = d2; + d2 = temp; + } + if (!TransLeq(o1, o2)) { + GLUvertex temp = o2; + o2 = o1; + o1 = temp; + temp = d2; + d2 = d1; + d1 = temp; + } + + if (!TransLeq(o2, d1)) { + /* Technically, no intersection -- do our best */ + v.t = (o2.t + d1.t) / 2.0; + } else if (TransLeq(d1, d2)) { + /* Interpolate between o2 and d1 */ + z1 = TransEval(o1, o2, d1); + z2 = TransEval(o2, d1, d2); + if (z1 + z2 < 0) { + z1 = -z1; + z2 = -z2; + } + v.t = Interpolate(z1, o2.t, z2, d1.t); + } else { + /* Interpolate between o2 and d2 */ + z1 = TransSign(o1, o2, d1); + z2 = -TransSign(o1, d2, d1); + if (z1 + z2 < 0) { + z1 = -z1; + z2 = -z2; + } + v.t = Interpolate(z1, o2.t, z2, d2.t); + } + } + + static boolean VertEq(GLUvertex u, GLUvertex v) { + return u.s == v.s && u.t == v.t; + } + + static boolean VertLeq(GLUvertex u, GLUvertex v) { + return u.s < v.s || (u.s == v.s && u.t <= v.t); + } + +/* Versions of VertLeq, EdgeSign, EdgeEval with s and t transposed. */ + + static boolean TransLeq(GLUvertex u, GLUvertex v) { + return u.t < v.t || (u.t == v.t && u.s <= v.s); + } + + static boolean EdgeGoesLeft(GLUhalfEdge e) { + return VertLeq(e.Sym.Org, e.Org); + } + + static boolean EdgeGoesRight(GLUhalfEdge e) { + return VertLeq(e.Org, e.Sym.Org); + } + + static double VertL1dist(GLUvertex u, GLUvertex v) { + return Math.abs(u.s - v.s) + Math.abs(u.t - v.t); + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Mesh.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Mesh.java new file mode 100644 index 000000000..11d10f4d0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Mesh.java @@ -0,0 +1,766 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class Mesh { + private Mesh() { + } + + /************************ Utility Routines ************************/ +/* MakeEdge creates a new pair of half-edges which form their own loop. + * No vertex or face structures are allocated, but these must be assigned + * before the current edge operation is completed. + */ + static GLUhalfEdge MakeEdge(GLUhalfEdge eNext) { + GLUhalfEdge e; + GLUhalfEdge eSym; + GLUhalfEdge ePrev; + +// EdgePair * pair = (EdgePair *) +// memAlloc(sizeof(EdgePair)); +// if (pair == NULL) return NULL; +// +// e = &pair - > e; + e = new GLUhalfEdge(true); +// eSym = &pair - > eSym; + eSym = new GLUhalfEdge(false); + + + /* Make sure eNext points to the first edge of the edge pair */ + if (!eNext.first) { + eNext = eNext.Sym; + } + + /* Insert in circular doubly-linked list before eNext. + * Note that the prev pointer is stored in Sym->next. + */ + ePrev = eNext.Sym.next; + eSym.next = ePrev; + ePrev.Sym.next = e; + e.next = eNext; + eNext.Sym.next = eSym; + + e.Sym = eSym; + e.Onext = e; + e.Lnext = eSym; + e.Org = null; + e.Lface = null; + e.winding = 0; + e.activeRegion = null; + + eSym.Sym = e; + eSym.Onext = eSym; + eSym.Lnext = e; + eSym.Org = null; + eSym.Lface = null; + eSym.winding = 0; + eSym.activeRegion = null; + + return e; + } + +/* Splice( a, b ) is best described by the Guibas/Stolfi paper or the + * CS348a notes (see mesh.h). Basically it modifies the mesh so that + * a->Onext and b->Onext are exchanged. This can have various effects + * depending on whether a and b belong to different face or vertex rings. + * For more explanation see __gl_meshSplice() below. + */ + static void Splice(GLUhalfEdge a, GLUhalfEdge b) { + GLUhalfEdge aOnext = a.Onext; + GLUhalfEdge bOnext = b.Onext; + + aOnext.Sym.Lnext = b; + bOnext.Sym.Lnext = a; + a.Onext = bOnext; + b.Onext = aOnext; + } + +/* MakeVertex( newVertex, eOrig, vNext ) attaches a new vertex and makes it the + * origin of all edges in the vertex loop to which eOrig belongs. "vNext" gives + * a place to insert the new vertex in the global vertex list. We insert + * the new vertex *before* vNext so that algorithms which walk the vertex + * list will not see the newly created vertices. + */ + static void MakeVertex(GLUvertex newVertex, + GLUhalfEdge eOrig, GLUvertex vNext) { + GLUhalfEdge e; + GLUvertex vPrev; + GLUvertex vNew = newVertex; + + assert (vNew != null); + + /* insert in circular doubly-linked list before vNext */ + vPrev = vNext.prev; + vNew.prev = vPrev; + vPrev.next = vNew; + vNew.next = vNext; + vNext.prev = vNew; + + vNew.anEdge = eOrig; + vNew.data = null; + /* leave coords, s, t undefined */ + + /* fix other edges on this vertex loop */ + e = eOrig; + do { + e.Org = vNew; + e = e.Onext; + } while (e != eOrig); + } + +/* MakeFace( newFace, eOrig, fNext ) attaches a new face and makes it the left + * face of all edges in the face loop to which eOrig belongs. "fNext" gives + * a place to insert the new face in the global face list. We insert + * the new face *before* fNext so that algorithms which walk the face + * list will not see the newly created faces. + */ + static void MakeFace(GLUface newFace, GLUhalfEdge eOrig, GLUface fNext) { + GLUhalfEdge e; + GLUface fPrev; + GLUface fNew = newFace; + + assert (fNew != null); + + /* insert in circular doubly-linked list before fNext */ + fPrev = fNext.prev; + fNew.prev = fPrev; + fPrev.next = fNew; + fNew.next = fNext; + fNext.prev = fNew; + + fNew.anEdge = eOrig; + fNew.data = null; + fNew.trail = null; + fNew.marked = false; + + /* The new face is marked "inside" if the old one was. This is a + * convenience for the common case where a face has been split in two. + */ + fNew.inside = fNext.inside; + + /* fix other edges on this face loop */ + e = eOrig; + do { + e.Lface = fNew; + e = e.Lnext; + } while (e != eOrig); + } + +/* KillEdge( eDel ) destroys an edge (the half-edges eDel and eDel->Sym), + * and removes from the global edge list. + */ + static void KillEdge(GLUhalfEdge eDel) { + GLUhalfEdge ePrev, eNext; + + /* Half-edges are allocated in pairs, see EdgePair above */ + if (!eDel.first) { + eDel = eDel.Sym; + } + + /* delete from circular doubly-linked list */ + eNext = eDel.next; + ePrev = eDel.Sym.next; + eNext.Sym.next = ePrev; + ePrev.Sym.next = eNext; + } + + +/* KillVertex( vDel ) destroys a vertex and removes it from the global + * vertex list. It updates the vertex loop to point to a given new vertex. + */ + static void KillVertex(GLUvertex vDel, GLUvertex newOrg) { + GLUhalfEdge e, eStart = vDel.anEdge; + GLUvertex vPrev, vNext; + + /* change the origin of all affected edges */ + e = eStart; + do { + e.Org = newOrg; + e = e.Onext; + } while (e != eStart); + + /* delete from circular doubly-linked list */ + vPrev = vDel.prev; + vNext = vDel.next; + vNext.prev = vPrev; + vPrev.next = vNext; + } + +/* KillFace( fDel ) destroys a face and removes it from the global face + * list. It updates the face loop to point to a given new face. + */ + static void KillFace(GLUface fDel, GLUface newLface) { + GLUhalfEdge e, eStart = fDel.anEdge; + GLUface fPrev, fNext; + + /* change the left face of all affected edges */ + e = eStart; + do { + e.Lface = newLface; + e = e.Lnext; + } while (e != eStart); + + /* delete from circular doubly-linked list */ + fPrev = fDel.prev; + fNext = fDel.next; + fNext.prev = fPrev; + fPrev.next = fNext; + } + + + /****************** Basic Edge Operations **********************/ + +/* __gl_meshMakeEdge creates one edge, two vertices, and a loop (face). + * The loop consists of the two new half-edges. + */ + public static GLUhalfEdge __gl_meshMakeEdge(GLUmesh mesh) { + GLUvertex newVertex1 = new GLUvertex(); + GLUvertex newVertex2 = new GLUvertex(); + GLUface newFace = new GLUface(); + GLUhalfEdge e; + + e = MakeEdge(mesh.eHead); + if (e == null) return null; + + MakeVertex(newVertex1, e, mesh.vHead); + MakeVertex(newVertex2, e.Sym, mesh.vHead); + MakeFace(newFace, e, mesh.fHead); + return e; + } + + +/* __gl_meshSplice( eOrg, eDst ) is the basic operation for changing the + * mesh connectivity and topology. It changes the mesh so that + * eOrg->Onext <- OLD( eDst->Onext ) + * eDst->Onext <- OLD( eOrg->Onext ) + * where OLD(...) means the value before the meshSplice operation. + * + * This can have two effects on the vertex structure: + * - if eOrg->Org != eDst->Org, the two vertices are merged together + * - if eOrg->Org == eDst->Org, the origin is split into two vertices + * In both cases, eDst->Org is changed and eOrg->Org is untouched. + * + * Similarly (and independently) for the face structure, + * - if eOrg->Lface == eDst->Lface, one loop is split into two + * - if eOrg->Lface != eDst->Lface, two distinct loops are joined into one + * In both cases, eDst->Lface is changed and eOrg->Lface is unaffected. + * + * Some special cases: + * If eDst == eOrg, the operation has no effect. + * If eDst == eOrg->Lnext, the new face will have a single edge. + * If eDst == eOrg->Lprev, the old face will have a single edge. + * If eDst == eOrg->Onext, the new vertex will have a single edge. + * If eDst == eOrg->Oprev, the old vertex will have a single edge. + */ + public static boolean __gl_meshSplice(GLUhalfEdge eOrg, GLUhalfEdge eDst) { + boolean joiningLoops = false; + boolean joiningVertices = false; + + if (eOrg == eDst) return true; + + if (eDst.Org != eOrg.Org) { + /* We are merging two disjoint vertices -- destroy eDst->Org */ + joiningVertices = true; + KillVertex(eDst.Org, eOrg.Org); + } + if (eDst.Lface != eOrg.Lface) { + /* We are connecting two disjoint loops -- destroy eDst.Lface */ + joiningLoops = true; + KillFace(eDst.Lface, eOrg.Lface); + } + + /* Change the edge structure */ + Splice(eDst, eOrg); + + if (!joiningVertices) { + GLUvertex newVertex = new GLUvertex(); + + /* We split one vertex into two -- the new vertex is eDst.Org. + * Make sure the old vertex points to a valid half-edge. + */ + MakeVertex(newVertex, eDst, eOrg.Org); + eOrg.Org.anEdge = eOrg; + } + if (!joiningLoops) { + GLUface newFace = new GLUface(); + + /* We split one loop into two -- the new loop is eDst.Lface. + * Make sure the old face points to a valid half-edge. + */ + MakeFace(newFace, eDst, eOrg.Lface); + eOrg.Lface.anEdge = eOrg; + } + + return true; + } + + +/* __gl_meshDelete( eDel ) removes the edge eDel. There are several cases: + * if (eDel.Lface != eDel.Rface), we join two loops into one; the loop + * eDel.Lface is deleted. Otherwise, we are splitting one loop into two; + * the newly created loop will contain eDel.Dst. If the deletion of eDel + * would create isolated vertices, those are deleted as well. + * + * This function could be implemented as two calls to __gl_meshSplice + * plus a few calls to memFree, but this would allocate and delete + * unnecessary vertices and faces. + */ + static boolean __gl_meshDelete(GLUhalfEdge eDel) { + GLUhalfEdge eDelSym = eDel.Sym; + boolean joiningLoops = false; + + /* First step: disconnect the origin vertex eDel.Org. We make all + * changes to get a consistent mesh in this "intermediate" state. + */ + if (eDel.Lface != eDel.Sym.Lface) { + /* We are joining two loops into one -- remove the left face */ + joiningLoops = true; + KillFace(eDel.Lface, eDel.Sym.Lface); + } + + if (eDel.Onext == eDel) { + KillVertex(eDel.Org, null); + } else { + /* Make sure that eDel.Org and eDel.Sym.Lface point to valid half-edges */ + eDel.Sym.Lface.anEdge = eDel.Sym.Lnext; + eDel.Org.anEdge = eDel.Onext; + + Splice(eDel, eDel.Sym.Lnext); + if (!joiningLoops) { + GLUface newFace = new GLUface(); + + /* We are splitting one loop into two -- create a new loop for eDel. */ + MakeFace(newFace, eDel, eDel.Lface); + } + } + + /* Claim: the mesh is now in a consistent state, except that eDel.Org + * may have been deleted. Now we disconnect eDel.Dst. + */ + if (eDelSym.Onext == eDelSym) { + KillVertex(eDelSym.Org, null); + KillFace(eDelSym.Lface, null); + } else { + /* Make sure that eDel.Dst and eDel.Lface point to valid half-edges */ + eDel.Lface.anEdge = eDelSym.Sym.Lnext; + eDelSym.Org.anEdge = eDelSym.Onext; + Splice(eDelSym, eDelSym.Sym.Lnext); + } + + /* Any isolated vertices or faces have already been freed. */ + KillEdge(eDel); + + return true; + } + + + /******************** Other Edge Operations **********************/ + +/* All these routines can be implemented with the basic edge + * operations above. They are provided for convenience and efficiency. + */ + + +/* __gl_meshAddEdgeVertex( eOrg ) creates a new edge eNew such that + * eNew == eOrg.Lnext, and eNew.Dst is a newly created vertex. + * eOrg and eNew will have the same left face. + */ + static GLUhalfEdge __gl_meshAddEdgeVertex(GLUhalfEdge eOrg) { + GLUhalfEdge eNewSym; + GLUhalfEdge eNew = MakeEdge(eOrg); + + eNewSym = eNew.Sym; + + /* Connect the new edge appropriately */ + Splice(eNew, eOrg.Lnext); + + /* Set the vertex and face information */ + eNew.Org = eOrg.Sym.Org; + { + GLUvertex newVertex = new GLUvertex(); + + MakeVertex(newVertex, eNewSym, eNew.Org); + } + eNew.Lface = eNewSym.Lface = eOrg.Lface; + + return eNew; + } + + +/* __gl_meshSplitEdge( eOrg ) splits eOrg into two edges eOrg and eNew, + * such that eNew == eOrg.Lnext. The new vertex is eOrg.Sym.Org == eNew.Org. + * eOrg and eNew will have the same left face. + */ + public static GLUhalfEdge __gl_meshSplitEdge(GLUhalfEdge eOrg) { + GLUhalfEdge eNew; + GLUhalfEdge tempHalfEdge = __gl_meshAddEdgeVertex(eOrg); + + eNew = tempHalfEdge.Sym; + + /* Disconnect eOrg from eOrg.Sym.Org and connect it to eNew.Org */ + Splice(eOrg.Sym, eOrg.Sym.Sym.Lnext); + Splice(eOrg.Sym, eNew); + + /* Set the vertex and face information */ + eOrg.Sym.Org = eNew.Org; + eNew.Sym.Org.anEdge = eNew.Sym; /* may have pointed to eOrg.Sym */ + eNew.Sym.Lface = eOrg.Sym.Lface; + eNew.winding = eOrg.winding; /* copy old winding information */ + eNew.Sym.winding = eOrg.Sym.winding; + + return eNew; + } + + +/* __gl_meshConnect( eOrg, eDst ) creates a new edge from eOrg.Sym.Org + * to eDst.Org, and returns the corresponding half-edge eNew. + * If eOrg.Lface == eDst.Lface, this splits one loop into two, + * and the newly created loop is eNew.Lface. Otherwise, two disjoint + * loops are merged into one, and the loop eDst.Lface is destroyed. + * + * If (eOrg == eDst), the new face will have only two edges. + * If (eOrg.Lnext == eDst), the old face is reduced to a single edge. + * If (eOrg.Lnext.Lnext == eDst), the old face is reduced to two edges. + */ + static GLUhalfEdge __gl_meshConnect(GLUhalfEdge eOrg, GLUhalfEdge eDst) { + GLUhalfEdge eNewSym; + boolean joiningLoops = false; + GLUhalfEdge eNew = MakeEdge(eOrg); + + eNewSym = eNew.Sym; + + if (eDst.Lface != eOrg.Lface) { + /* We are connecting two disjoint loops -- destroy eDst.Lface */ + joiningLoops = true; + KillFace(eDst.Lface, eOrg.Lface); + } + + /* Connect the new edge appropriately */ + Splice(eNew, eOrg.Lnext); + Splice(eNewSym, eDst); + + /* Set the vertex and face information */ + eNew.Org = eOrg.Sym.Org; + eNewSym.Org = eDst.Org; + eNew.Lface = eNewSym.Lface = eOrg.Lface; + + /* Make sure the old face points to a valid half-edge */ + eOrg.Lface.anEdge = eNewSym; + + if (!joiningLoops) { + GLUface newFace = new GLUface(); + + /* We split one loop into two -- the new loop is eNew.Lface */ + MakeFace(newFace, eNew, eOrg.Lface); + } + return eNew; + } + + + /******************** Other Operations **********************/ + +/* __gl_meshZapFace( fZap ) destroys a face and removes it from the + * global face list. All edges of fZap will have a null pointer as their + * left face. Any edges which also have a null pointer as their right face + * are deleted entirely (along with any isolated vertices this produces). + * An entire mesh can be deleted by zapping its faces, one at a time, + * in any order. Zapped faces cannot be used in further mesh operations! + */ + static void __gl_meshZapFace(GLUface fZap) { + GLUhalfEdge eStart = fZap.anEdge; + GLUhalfEdge e, eNext, eSym; + GLUface fPrev, fNext; + + /* walk around face, deleting edges whose right face is also null */ + eNext = eStart.Lnext; + do { + e = eNext; + eNext = e.Lnext; + + e.Lface = null; + if (e.Sym.Lface == null) { + /* delete the edge -- see __gl_MeshDelete above */ + + if (e.Onext == e) { + KillVertex(e.Org, null); + } else { + /* Make sure that e.Org points to a valid half-edge */ + e.Org.anEdge = e.Onext; + Splice(e, e.Sym.Lnext); + } + eSym = e.Sym; + if (eSym.Onext == eSym) { + KillVertex(eSym.Org, null); + } else { + /* Make sure that eSym.Org points to a valid half-edge */ + eSym.Org.anEdge = eSym.Onext; + Splice(eSym, eSym.Sym.Lnext); + } + KillEdge(e); + } + } while (e != eStart); + + /* delete from circular doubly-linked list */ + fPrev = fZap.prev; + fNext = fZap.next; + fNext.prev = fPrev; + fPrev.next = fNext; + } + + +/* __gl_meshNewMesh() creates a new mesh with no edges, no vertices, + * and no loops (what we usually call a "face"). + */ + public static GLUmesh __gl_meshNewMesh() { + GLUvertex v; + GLUface f; + GLUhalfEdge e; + GLUhalfEdge eSym; + GLUmesh mesh = new GLUmesh(); + + v = mesh.vHead; + f = mesh.fHead; + e = mesh.eHead; + eSym = mesh.eHeadSym; + + v.next = v.prev = v; + v.anEdge = null; + v.data = null; + + f.next = f.prev = f; + f.anEdge = null; + f.data = null; + f.trail = null; + f.marked = false; + f.inside = false; + + e.next = e; + e.Sym = eSym; + e.Onext = null; + e.Lnext = null; + e.Org = null; + e.Lface = null; + e.winding = 0; + e.activeRegion = null; + + eSym.next = eSym; + eSym.Sym = e; + eSym.Onext = null; + eSym.Lnext = null; + eSym.Org = null; + eSym.Lface = null; + eSym.winding = 0; + eSym.activeRegion = null; + + return mesh; + } + + +/* __gl_meshUnion( mesh1, mesh2 ) forms the union of all structures in + * both meshes, and returns the new mesh (the old meshes are destroyed). + */ + static GLUmesh __gl_meshUnion(GLUmesh mesh1, GLUmesh mesh2) { + GLUface f1 = mesh1.fHead; + GLUvertex v1 = mesh1.vHead; + GLUhalfEdge e1 = mesh1.eHead; + GLUface f2 = mesh2.fHead; + GLUvertex v2 = mesh2.vHead; + GLUhalfEdge e2 = mesh2.eHead; + + /* Add the faces, vertices, and edges of mesh2 to those of mesh1 */ + if (f2.next != f2) { + f1.prev.next = f2.next; + f2.next.prev = f1.prev; + f2.prev.next = f1; + f1.prev = f2.prev; + } + + if (v2.next != v2) { + v1.prev.next = v2.next; + v2.next.prev = v1.prev; + v2.prev.next = v1; + v1.prev = v2.prev; + } + + if (e2.next != e2) { + e1.Sym.next.Sym.next = e2.next; + e2.next.Sym.next = e1.Sym.next; + e2.Sym.next.Sym.next = e1; + e1.Sym.next = e2.Sym.next; + } + + return mesh1; + } + + +/* __gl_meshDeleteMesh( mesh ) will free all storage for any valid mesh. + */ + static void __gl_meshDeleteMeshZap(GLUmesh mesh) { + GLUface fHead = mesh.fHead; + + while (fHead.next != fHead) { + __gl_meshZapFace(fHead.next); + } + assert (mesh.vHead.next == mesh.vHead); + } + +/* __gl_meshDeleteMesh( mesh ) will free all storage for any valid mesh. + */ + public static void __gl_meshDeleteMesh(GLUmesh mesh) { + GLUface f, fNext; + GLUvertex v, vNext; + GLUhalfEdge e, eNext; + + for (f = mesh.fHead.next; f != mesh.fHead; f = fNext) { + fNext = f.next; + } + + for (v = mesh.vHead.next; v != mesh.vHead; v = vNext) { + vNext = v.next; + } + + for (e = mesh.eHead.next; e != mesh.eHead; e = eNext) { + /* One call frees both e and e.Sym (see EdgePair above) */ + eNext = e.next; + } + } + +/* __gl_meshCheckMesh( mesh ) checks a mesh for self-consistency. + */ + public static void __gl_meshCheckMesh(GLUmesh mesh) { + GLUface fHead = mesh.fHead; + GLUvertex vHead = mesh.vHead; + GLUhalfEdge eHead = mesh.eHead; + GLUface f, fPrev; + GLUvertex v, vPrev; + GLUhalfEdge e, ePrev; + + fPrev = fHead; + for (fPrev = fHead; (f = fPrev.next) != fHead; fPrev = f) { + assert (f.prev == fPrev); + e = f.anEdge; + do { + assert (e.Sym != e); + assert (e.Sym.Sym == e); + assert (e.Lnext.Onext.Sym == e); + assert (e.Onext.Sym.Lnext == e); + assert (e.Lface == f); + e = e.Lnext; + } while (e != f.anEdge); + } + assert (f.prev == fPrev && f.anEdge == null && f.data == null); + + vPrev = vHead; + for (vPrev = vHead; (v = vPrev.next) != vHead; vPrev = v) { + assert (v.prev == vPrev); + e = v.anEdge; + do { + assert (e.Sym != e); + assert (e.Sym.Sym == e); + assert (e.Lnext.Onext.Sym == e); + assert (e.Onext.Sym.Lnext == e); + assert (e.Org == v); + e = e.Onext; + } while (e != v.anEdge); + } + assert (v.prev == vPrev && v.anEdge == null && v.data == null); + + ePrev = eHead; + for (ePrev = eHead; (e = ePrev.next) != eHead; ePrev = e) { + assert (e.Sym.next == ePrev.Sym); + assert (e.Sym != e); + assert (e.Sym.Sym == e); + assert (e.Org != null); + assert (e.Sym.Org != null); + assert (e.Lnext.Onext.Sym == e); + assert (e.Onext.Sym.Lnext == e); + } + assert (e.Sym.next == ePrev.Sym + && e.Sym == mesh.eHeadSym + && e.Sym.Sym == e + && e.Org == null && e.Sym.Org == null + && e.Lface == null && e.Sym.Lface == null); + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Normal.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Normal.java new file mode 100644 index 000000000..334081a78 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Normal.java @@ -0,0 +1,319 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +import org.lwjgl.util.glu.GLU; + +class Normal { + private Normal() { + } + + static boolean SLANTED_SWEEP; + static double S_UNIT_X; /* Pre-normalized */ + static double S_UNIT_Y; + private static final boolean TRUE_PROJECT = false; + + static { + if (SLANTED_SWEEP) { +/* The "feature merging" is not intended to be complete. There are + * special cases where edges are nearly parallel to the sweep line + * which are not implemented. The algorithm should still behave + * robustly (ie. produce a reasonable tesselation) in the presence + * of such edges, however it may miss features which could have been + * merged. We could minimize this effect by choosing the sweep line + * direction to be something unusual (ie. not parallel to one of the + * coordinate axes). + */ + S_UNIT_X = 0.50941539564955385; /* Pre-normalized */ + S_UNIT_Y = 0.86052074622010633; + } else { + S_UNIT_X = 1.0; + S_UNIT_Y = 0.0; + } + } + + private static double Dot(double[] u, double[] v) { + return (u[0] * v[0] + u[1] * v[1] + u[2] * v[2]); + } + + static void Normalize(double[] v) { + double len = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; + + assert (len > 0); + len = Math.sqrt(len); + v[0] /= len; + v[1] /= len; + v[2] /= len; + } + + static int LongAxis(double[] v) { + int i = 0; + + if (Math.abs(v[1]) > Math.abs(v[0])) { + i = 1; + } + if (Math.abs(v[2]) > Math.abs(v[i])) { + i = 2; + } + return i; + } + + static void ComputeNormal(GLUtessellatorImpl tess, double[] norm) { + GLUvertex v, v1, v2; + double c, tLen2, maxLen2; + double[] maxVal, minVal, d1, d2, tNorm; + GLUvertex[] maxVert, minVert; + GLUvertex vHead = tess.mesh.vHead; + int i; + + maxVal = new double[3]; + minVal = new double[3]; + minVert = new GLUvertex[3]; + maxVert = new GLUvertex[3]; + d1 = new double[3]; + d2 = new double[3]; + tNorm = new double[3]; + + maxVal[0] = maxVal[1] = maxVal[2] = -2 * GLU.TESS_MAX_COORD; + minVal[0] = minVal[1] = minVal[2] = 2 * GLU.TESS_MAX_COORD; + + for (v = vHead.next; v != vHead; v = v.next) { + for (i = 0; i < 3; ++i) { + c = v.coords[i]; + if (c < minVal[i]) { + minVal[i] = c; + minVert[i] = v; + } + if (c > maxVal[i]) { + maxVal[i] = c; + maxVert[i] = v; + } + } + } + +/* Find two vertices separated by at least 1/sqrt(3) of the maximum + * distance between any two vertices + */ + i = 0; + if (maxVal[1] - minVal[1] > maxVal[0] - minVal[0]) { + i = 1; + } + if (maxVal[2] - minVal[2] > maxVal[i] - minVal[i]) { + i = 2; + } + if (minVal[i] >= maxVal[i]) { +/* All vertices are the same -- normal doesn't matter */ + norm[0] = 0; + norm[1] = 0; + norm[2] = 1; + return; + } + +/* Look for a third vertex which forms the triangle with maximum area + * (Length of normal == twice the triangle area) + */ + maxLen2 = 0; + v1 = minVert[i]; + v2 = maxVert[i]; + d1[0] = v1.coords[0] - v2.coords[0]; + d1[1] = v1.coords[1] - v2.coords[1]; + d1[2] = v1.coords[2] - v2.coords[2]; + for (v = vHead.next; v != vHead; v = v.next) { + d2[0] = v.coords[0] - v2.coords[0]; + d2[1] = v.coords[1] - v2.coords[1]; + d2[2] = v.coords[2] - v2.coords[2]; + tNorm[0] = d1[1] * d2[2] - d1[2] * d2[1]; + tNorm[1] = d1[2] * d2[0] - d1[0] * d2[2]; + tNorm[2] = d1[0] * d2[1] - d1[1] * d2[0]; + tLen2 = tNorm[0] * tNorm[0] + tNorm[1] * tNorm[1] + tNorm[2] * tNorm[2]; + if (tLen2 > maxLen2) { + maxLen2 = tLen2; + norm[0] = tNorm[0]; + norm[1] = tNorm[1]; + norm[2] = tNorm[2]; + } + } + + if (maxLen2 <= 0) { +/* All points lie on a single line -- any decent normal will do */ + norm[0] = norm[1] = norm[2] = 0; + norm[LongAxis(d1)] = 1; + } + } + + static void CheckOrientation(GLUtessellatorImpl tess) { + double area; + GLUface f, fHead = tess.mesh.fHead; + GLUvertex v, vHead = tess.mesh.vHead; + GLUhalfEdge e; + +/* When we compute the normal automatically, we choose the orientation + * so that the the sum of the signed areas of all contours is non-negative. + */ + area = 0; + for (f = fHead.next; f != fHead; f = f.next) { + e = f.anEdge; + if (e.winding <= 0) continue; + do { + area += (e.Org.s - e.Sym.Org.s) * (e.Org.t + e.Sym.Org.t); + e = e.Lnext; + } while (e != f.anEdge); + } + if (area < 0) { +/* Reverse the orientation by flipping all the t-coordinates */ + for (v = vHead.next; v != vHead; v = v.next) { + v.t = -v.t; + } + tess.tUnit[0] = -tess.tUnit[0]; + tess.tUnit[1] = -tess.tUnit[1]; + tess.tUnit[2] = -tess.tUnit[2]; + } + } + +/* Determine the polygon normal and project vertices onto the plane + * of the polygon. + */ + public static void __gl_projectPolygon(GLUtessellatorImpl tess) { + GLUvertex v, vHead = tess.mesh.vHead; + double w; + double[] norm = new double[3]; + double[] sUnit, tUnit; + int i; + boolean computedNormal = false; + + norm[0] = tess.normal[0]; + norm[1] = tess.normal[1]; + norm[2] = tess.normal[2]; + if (norm[0] == 0 && norm[1] == 0 && norm[2] == 0) { + ComputeNormal(tess, norm); + computedNormal = true; + } + sUnit = tess.sUnit; + tUnit = tess.tUnit; + i = LongAxis(norm); + + if (TRUE_PROJECT) { +/* Choose the initial sUnit vector to be approximately perpendicular + * to the normal. + */ + Normalize(norm); + + sUnit[i] = 0; + sUnit[(i + 1) % 3] = S_UNIT_X; + sUnit[(i + 2) % 3] = S_UNIT_Y; + +/* Now make it exactly perpendicular */ + w = Dot(sUnit, norm); + sUnit[0] -= w * norm[0]; + sUnit[1] -= w * norm[1]; + sUnit[2] -= w * norm[2]; + Normalize(sUnit); + +/* Choose tUnit so that (sUnit,tUnit,norm) form a right-handed frame */ + tUnit[0] = norm[1] * sUnit[2] - norm[2] * sUnit[1]; + tUnit[1] = norm[2] * sUnit[0] - norm[0] * sUnit[2]; + tUnit[2] = norm[0] * sUnit[1] - norm[1] * sUnit[0]; + Normalize(tUnit); + } else { +/* Project perpendicular to a coordinate axis -- better numerically */ + sUnit[i] = 0; + sUnit[(i + 1) % 3] = S_UNIT_X; + sUnit[(i + 2) % 3] = S_UNIT_Y; + + tUnit[i] = 0; + tUnit[(i + 1) % 3] = (norm[i] > 0) ? -S_UNIT_Y : S_UNIT_Y; + tUnit[(i + 2) % 3] = (norm[i] > 0) ? S_UNIT_X : -S_UNIT_X; + } + +/* Project the vertices onto the sweep plane */ + for (v = vHead.next; v != vHead; v = v.next) { + v.s = Dot(v.coords, sUnit); + v.t = Dot(v.coords, tUnit); + } + if (computedNormal) { + CheckOrientation(tess); + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQ.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQ.java new file mode 100644 index 000000000..92bee8233 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQ.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +abstract class PriorityQ { + public static final int INIT_SIZE = 32; + + public static class PQnode { + int handle; + } + + public static class PQhandleElem { + Object key; + int node; + } + + public interface Leq { + boolean leq(Object key1, Object key2); + } + + // #ifdef FOR_TRITE_TEST_PROGRAM +// private static boolean LEQ(PriorityQCommon.Leq leq, Object x,Object y) { +// return pq.leq.leq(x,y); +// } +// #else +/* Violates modularity, but a little faster */ +// #include "geom.h" + public static boolean LEQ(Leq leq, Object x, Object y) { + return Geom.VertLeq((GLUvertex) x, (GLUvertex) y); + } + + static PriorityQ pqNewPriorityQ(Leq leq) { + return new PriorityQSort(leq); + } + + abstract void pqDeletePriorityQ(); + + abstract boolean pqInit(); + + abstract int pqInsert(Object keyNew); + + abstract Object pqExtractMin(); + + abstract void pqDelete(int hCurr); + + abstract Object pqMinimum(); + + abstract boolean pqIsEmpty(); +// #endif +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQHeap.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQHeap.java new file mode 100644 index 000000000..6b3ee1116 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQHeap.java @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + + + +class PriorityQHeap extends PriorityQ { + PQnode[] nodes; + PQhandleElem[] handles; + int size, max; + int freeList; + boolean initialized; + Leq leq; + +/* really __gl_pqHeapNewPriorityQ */ +PriorityQHeap(Leq leq) { + size = 0; + max = PriorityQ.INIT_SIZE; + nodes = new PQnode[PriorityQ.INIT_SIZE + 1]; + for (int i = 0; i < nodes.length; i++) { + nodes[i] = new PQnode(); + } + handles = new PQhandleElem[PriorityQ.INIT_SIZE + 1]; + for (int i = 0; i < handles.length; i++) { + handles[i] = new PQhandleElem(); + } + initialized = false; + freeList = 0; + this.leq = leq; + + nodes[1].handle = 1; /* so that Minimum() returns NULL */ + handles[1].key = null; + } + +/* really __gl_pqHeapDeletePriorityQ */ + void pqDeletePriorityQ() { + handles = null; + nodes = null; + } + + void FloatDown(int curr) { + PQnode[] n = nodes; + PQhandleElem[] h = handles; + int hCurr, hChild; + int child; + + hCurr = n[curr].handle; + for (; ;) { + child = curr << 1; + if (child < size && LEQ(leq, h[n[child + 1].handle].key, + h[n[child].handle].key)) { + ++child; + } + + assert (child <= max); + + hChild = n[child].handle; + if (child > size || LEQ(leq, h[hCurr].key, h[hChild].key)) { + n[curr].handle = hCurr; + h[hCurr].node = curr; + break; + } + n[curr].handle = hChild; + h[hChild].node = curr; + curr = child; + } + } + + + void FloatUp(int curr) { + PQnode[] n = nodes; + PQhandleElem[] h = handles; + int hCurr, hParent; + int parent; + + hCurr = n[curr].handle; + for (; ;) { + parent = curr >> 1; + hParent = n[parent].handle; + if (parent == 0 || LEQ(leq, h[hParent].key, h[hCurr].key)) { + n[curr].handle = hCurr; + h[hCurr].node = curr; + break; + } + n[curr].handle = hParent; + h[hParent].node = curr; + curr = parent; + } + } + +/* really __gl_pqHeapInit */ + boolean pqInit() { + int i; + + /* This method of building a heap is O(n), rather than O(n lg n). */ + + for (i = size; i >= 1; --i) { + FloatDown(i); + } + initialized = true; + + return true; + } + +/* really __gl_pqHeapInsert */ +/* returns LONG_MAX iff out of memory */ + int pqInsert(Object keyNew) { + int curr; + int free; + + curr = ++size; + if ((curr * 2) > max) { + PQnode[] saveNodes = nodes; + PQhandleElem[] saveHandles = handles; + + /* If the heap overflows, double its size. */ + max <<= 1; +// pq->nodes = (PQnode *)memRealloc( pq->nodes, (size_t) ((pq->max + 1) * sizeof( pq->nodes[0] ))); + PQnode[] pqNodes = new PQnode[max + 1]; + System.arraycopy( nodes, 0, pqNodes, 0, nodes.length ); + for (int i = nodes.length; i < pqNodes.length; i++) { + pqNodes[i] = new PQnode(); + } + nodes = pqNodes; + if (nodes == null) { + nodes = saveNodes; /* restore ptr to free upon return */ + return Integer.MAX_VALUE; + } + +// pq->handles = (PQhandleElem *)memRealloc( pq->handles,(size_t)((pq->max + 1) * sizeof( pq->handles[0] ))); + PQhandleElem[] pqHandles = new PQhandleElem[max + 1]; + System.arraycopy( handles, 0, pqHandles, 0, handles.length ); + for (int i = handles.length; i < pqHandles.length; i++) { + pqHandles[i] = new PQhandleElem(); + } + handles = pqHandles; + if (handles == null) { + handles = saveHandles; /* restore ptr to free upon return */ + return Integer.MAX_VALUE; + } + } + + if (freeList == 0) { + free = curr; + } else { + free = freeList; + freeList = handles[free].node; + } + + nodes[curr].handle = free; + handles[free].node = curr; + handles[free].key = keyNew; + + if (initialized) { + FloatUp(curr); + } + assert (free != Integer.MAX_VALUE); + return free; + } + +/* really __gl_pqHeapExtractMin */ + Object pqExtractMin() { + PQnode[] n = nodes; + PQhandleElem[] h = handles; + int hMin = n[1].handle; + Object min = h[hMin].key; + + if (size > 0) { + n[1].handle = n[size].handle; + h[n[1].handle].node = 1; + + h[hMin].key = null; + h[hMin].node = freeList; + freeList = hMin; + + if (--size > 0) { + FloatDown(1); + } + } + return min; + } + +/* really __gl_pqHeapDelete */ + void pqDelete(int hCurr) { + PQnode[] n = nodes; + PQhandleElem[] h = handles; + int curr; + + assert (hCurr >= 1 && hCurr <= max && h[hCurr].key != null); + + curr = h[hCurr].node; + n[curr].handle = n[size].handle; + h[n[curr].handle].node = curr; + + if (curr <= --size) { + if (curr <= 1 || LEQ(leq, h[n[curr >> 1].handle].key, h[n[curr].handle].key)) { + FloatDown(curr); + } else { + FloatUp(curr); + } + } + h[hCurr].key = null; + h[hCurr].node = freeList; + freeList = hCurr; + } + + Object pqMinimum() { + return handles[nodes[1].handle].key; + } + + boolean pqIsEmpty() { + return size == 0; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQSort.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQSort.java new file mode 100644 index 000000000..0d96fd5e6 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/PriorityQSort.java @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + + + +class PriorityQSort extends PriorityQ { + PriorityQHeap heap; + Object[] keys; + + // JAVA: 'order' contains indices into the keys array. + // This simulates the indirect pointers used in the original C code + // (from Frank Suykens, Luciad.com). + int[] order; + int size, max; + boolean initialized; + Leq leq; + + PriorityQSort(Leq leq) { + heap = new PriorityQHeap(leq); + + keys = new Object[PriorityQ.INIT_SIZE]; + + size = 0; + max = PriorityQ.INIT_SIZE; + initialized = false; + this.leq = leq; + } + +/* really __gl_pqSortDeletePriorityQ */ + void pqDeletePriorityQ() { + if (heap != null) heap.pqDeletePriorityQ(); + order = null; + keys = null; + } + + private static boolean LT(Leq leq, Object x, Object y) { + return (!PriorityQHeap.LEQ(leq, y, x)); + } + + private static boolean GT(Leq leq, Object x, Object y) { + return (!PriorityQHeap.LEQ(leq, x, y)); + } + + private static void Swap(int[] array, int a, int b) { + if (true) { + int tmp = array[a]; + array[a] = array[b]; + array[b] = tmp; + } else { + + } + } + + private static class Stack { + int p, r; + } + +/* really __gl_pqSortInit */ + boolean pqInit() { + int p, r, i, j; + int piv; + Stack[] stack = new Stack[50]; + for (int k = 0; k < stack.length; k++) { + stack[k] = new Stack(); + } + int top = 0; + + int seed = 2016473283; + + /* Create an array of indirect pointers to the keys, so that we + * the handles we have returned are still valid. + */ + order = new int[size + 1]; +/* the previous line is a patch to compensate for the fact that IBM */ +/* machines return a null on a malloc of zero bytes (unlike SGI), */ +/* so we have to put in this defense to guard against a memory */ +/* fault four lines down. from fossum@austin.ibm.com. */ + p = 0; + r = size - 1; + for (piv = 0, i = p; i <= r; ++piv, ++i) { + // indirect pointers: keep an index into the keys array, not a direct pointer to its contents + order[i] = piv; + } + + /* Sort the indirect pointers in descending order, + * using randomized Quicksort + */ + stack[top].p = p; + stack[top].r = r; + ++top; + while (--top >= 0) { + p = stack[top].p; + r = stack[top].r; + while (r > p + 10) { + seed = Math.abs( seed * 1539415821 + 1 ); + i = p + seed % (r - p + 1); + piv = order[i]; + order[i] = order[p]; + order[p] = piv; + i = p - 1; + j = r + 1; + do { + do { + ++i; + } while (GT(leq, keys[order[i]], keys[piv])); + do { + --j; + } while (LT(leq, keys[order[j]], keys[piv])); + Swap(order, i, j); + } while (i < j); + Swap(order, i, j); /* Undo last swap */ + if (i - p < r - j) { + stack[top].p = j + 1; + stack[top].r = r; + ++top; + r = i - 1; + } else { + stack[top].p = p; + stack[top].r = i - 1; + ++top; + p = j + 1; + } + } + /* Insertion sort small lists */ + for (i = p + 1; i <= r; ++i) { + piv = order[i]; + for (j = i; j > p && LT(leq, keys[order[j - 1]], keys[piv]); --j) { + order[j] = order[j - 1]; + } + order[j] = piv; + } + } + max = size; + initialized = true; + heap.pqInit(); /* always succeeds */ + +/* #ifndef NDEBUG + p = order; + r = p + size - 1; + for (i = p; i < r; ++i) { + Assertion.doAssert(LEQ( * * (i + 1), **i )); + } + #endif*/ + + return true; + } + +/* really __gl_pqSortInsert */ +/* returns LONG_MAX iff out of memory */ + int pqInsert(Object keyNew) { + int curr; + + if (initialized) { + return heap.pqInsert(keyNew); + } + curr = size; + if (++size >= max) { + Object[] saveKey = keys; + + /* If the heap overflows, double its size. */ + max <<= 1; +// pq->keys = (PQHeapKey *)memRealloc( pq->keys,(size_t)(pq->max * sizeof( pq->keys[0] ))); + Object[] pqKeys = new Object[max]; + System.arraycopy( keys, 0, pqKeys, 0, keys.length ); + keys = pqKeys; + if (keys == null) { + keys = saveKey; /* restore ptr to free upon return */ + return Integer.MAX_VALUE; + } + } + assert curr != Integer.MAX_VALUE; + keys[curr] = keyNew; + + /* Negative handles index the sorted array. */ + return -(curr + 1); + } + +/* really __gl_pqSortExtractMin */ + Object pqExtractMin() { + Object sortMin, heapMin; + + if (size == 0) { + return heap.pqExtractMin(); + } + sortMin = keys[order[size - 1]]; + if (!heap.pqIsEmpty()) { + heapMin = heap.pqMinimum(); + if (LEQ(leq, heapMin, sortMin)) { + return heap.pqExtractMin(); + } + } + do { + --size; + } while (size > 0 && keys[order[size - 1]] == null); + return sortMin; + } + +/* really __gl_pqSortMinimum */ + Object pqMinimum() { + Object sortMin, heapMin; + + if (size == 0) { + return heap.pqMinimum(); + } + sortMin = keys[order[size - 1]]; + if (!heap.pqIsEmpty()) { + heapMin = heap.pqMinimum(); + if (PriorityQHeap.LEQ(leq, heapMin, sortMin)) { + return heapMin; + } + } + return sortMin; + } + +/* really __gl_pqSortIsEmpty */ + boolean pqIsEmpty() { + return (size == 0) && heap.pqIsEmpty(); + } + +/* really __gl_pqSortDelete */ + void pqDelete(int curr) { + if (curr >= 0) { + heap.pqDelete(curr); + return; + } + curr = -(curr + 1); + assert curr < max && keys[curr] != null; + + keys[curr] = null; + while (size > 0 && keys[order[size - 1]] == null) { + --size; + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Render.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Render.java new file mode 100644 index 000000000..672cd8df0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Render.java @@ -0,0 +1,596 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +import static org.lwjgl.opengl.GL11.GL_LINE_LOOP; +import static org.lwjgl.opengl.GL11.GL_TRIANGLES; +import static org.lwjgl.opengl.GL11.GL_TRIANGLE_FAN; +import static org.lwjgl.opengl.GL11.GL_TRIANGLE_STRIP; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_ABS_GEQ_TWO; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_NEGATIVE; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_NONZERO; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_ODD; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_POSITIVE; + +class Render { + private static final boolean USE_OPTIMIZED_CODE_PATH = false; + + private Render() { + } + + private static final RenderFan renderFan = new RenderFan(); + private static final RenderStrip renderStrip = new RenderStrip(); + private static final RenderTriangle renderTriangle = new RenderTriangle(); + +/* This structure remembers the information we need about a primitive + * to be able to render it later, once we have determined which + * primitive is able to use the most triangles. + */ + private static class FaceCount { + private FaceCount() { + } + + private FaceCount(long size, GLUhalfEdge eStart, renderCallBack render) { + this.size = size; + this.eStart = eStart; + this.render = render; + } + + long size; /* number of triangles used */ + GLUhalfEdge eStart; /* edge where this primitive starts */ + renderCallBack render; + }; + + private interface renderCallBack { + void render(GLUtessellatorImpl tess, GLUhalfEdge e, long size); + } + + /************************ Strips and Fans decomposition ******************/ + +/* __gl_renderMesh( tess, mesh ) takes a mesh and breaks it into triangle + * fans, strips, and separate triangles. A substantial effort is made + * to use as few rendering primitives as possible (ie. to make the fans + * and strips as large as possible). + * + * The rendering output is provided as callbacks (see the api). + */ + public static void __gl_renderMesh(GLUtessellatorImpl tess, GLUmesh mesh) { + GLUface f; + + /* Make a list of separate triangles so we can render them all at once */ + tess.lonelyTriList = null; + + for (f = mesh.fHead.next; f != mesh.fHead; f = f.next) { + f.marked = false; + } + for (f = mesh.fHead.next; f != mesh.fHead; f = f.next) { + + /* We examine all faces in an arbitrary order. Whenever we find + * an unprocessed face F, we output a group of faces including F + * whose size is maximum. + */ + if (f.inside && !f.marked) { + RenderMaximumFaceGroup(tess, f); + assert (f.marked); + } + } + if (tess.lonelyTriList != null) { + RenderLonelyTriangles(tess, tess.lonelyTriList); + tess.lonelyTriList = null; + } + } + + + static void RenderMaximumFaceGroup(GLUtessellatorImpl tess, GLUface fOrig) { + /* We want to find the largest triangle fan or strip of unmarked faces + * which includes the given face fOrig. There are 3 possible fans + * passing through fOrig (one centered at each vertex), and 3 possible + * strips (one for each CCW permutation of the vertices). Our strategy + * is to try all of these, and take the primitive which uses the most + * triangles (a greedy approach). + */ + GLUhalfEdge e = fOrig.anEdge; + FaceCount max = new FaceCount(); + FaceCount newFace; + + max.size = 1; + max.eStart = e; + max.render = renderTriangle; + + if (!tess.flagBoundary) { + newFace = MaximumFan(e); + if (newFace.size > max.size) { + max = newFace; + } + newFace = MaximumFan(e.Lnext); + if (newFace.size > max.size) { + max = newFace; + } + newFace = MaximumFan(e.Onext.Sym); + if (newFace.size > max.size) { + max = newFace; + } + + newFace = MaximumStrip(e); + if (newFace.size > max.size) { + max = newFace; + } + newFace = MaximumStrip(e.Lnext); + if (newFace.size > max.size) { + max = newFace; + } + newFace = MaximumStrip(e.Onext.Sym); + if (newFace.size > max.size) { + max = newFace; + } + } + max.render.render(tess, max.eStart, max.size); + } + + +/* Macros which keep track of faces we have marked temporarily, and allow + * us to backtrack when necessary. With triangle fans, this is not + * really necessary, since the only awkward case is a loop of triangles + * around a single origin vertex. However with strips the situation is + * more complicated, and we need a general tracking method like the + * one here. + */ + private static boolean Marked(GLUface f) { + return !f.inside || f.marked; + } + + private static GLUface AddToTrail(GLUface f, GLUface t) { + f.trail = t; + f.marked = true; + return f; + } + + private static void FreeTrail(GLUface t) { + if (true) { + while (t != null) { + t.marked = false; + t = t.trail; + } + } else { + /* absorb trailing semicolon */ + } + } + + static FaceCount MaximumFan(GLUhalfEdge eOrig) { + /* eOrig.Lface is the face we want to render. We want to find the size + * of a maximal fan around eOrig.Org. To do this we just walk around + * the origin vertex as far as possible in both directions. + */ + FaceCount newFace = new FaceCount(0, null, renderFan); + GLUface trail = null; + GLUhalfEdge e; + + for (e = eOrig; !Marked(e.Lface); e = e.Onext) { + trail = AddToTrail(e.Lface, trail); + ++newFace.size; + } + for (e = eOrig; !Marked(e.Sym.Lface); e = e.Sym.Lnext) { + trail = AddToTrail(e.Sym.Lface, trail); + ++newFace.size; + } + newFace.eStart = e; + /*LINTED*/ + FreeTrail(trail); + return newFace; + } + + + private static boolean IsEven(long n) { + return (n & 0x1L) == 0; + } + + static FaceCount MaximumStrip(GLUhalfEdge eOrig) { + /* Here we are looking for a maximal strip that contains the vertices + * eOrig.Org, eOrig.Dst, eOrig.Lnext.Dst (in that order or the + * reverse, such that all triangles are oriented CCW). + * + * Again we walk forward and backward as far as possible. However for + * strips there is a twist: to get CCW orientations, there must be + * an *even* number of triangles in the strip on one side of eOrig. + * We walk the strip starting on a side with an even number of triangles; + * if both side have an odd number, we are forced to shorten one side. + */ + FaceCount newFace = new FaceCount(0, null, renderStrip); + long headSize = 0, tailSize = 0; + GLUface trail = null; + GLUhalfEdge e, eTail, eHead; + + for (e = eOrig; !Marked(e.Lface); ++tailSize, e = e.Onext) { + trail = AddToTrail(e.Lface, trail); + ++tailSize; + e = e.Lnext.Sym; + if (Marked(e.Lface)) break; + trail = AddToTrail(e.Lface, trail); + } + eTail = e; + + for (e = eOrig; !Marked(e.Sym.Lface); ++headSize, e = e.Sym.Onext.Sym) { + trail = AddToTrail(e.Sym.Lface, trail); + ++headSize; + e = e.Sym.Lnext; + if (Marked(e.Sym.Lface)) break; + trail = AddToTrail(e.Sym.Lface, trail); + } + eHead = e; + + newFace.size = tailSize + headSize; + if (IsEven(tailSize)) { + newFace.eStart = eTail.Sym; + } else if (IsEven(headSize)) { + newFace.eStart = eHead; + } else { + /* Both sides have odd length, we must shorten one of them. In fact, + * we must start from eHead to guarantee inclusion of eOrig.Lface. + */ + --newFace.size; + newFace.eStart = eHead.Onext; + } + /*LINTED*/ + FreeTrail(trail); + return newFace; + } + + private static class RenderTriangle implements renderCallBack { + public void render(GLUtessellatorImpl tess, GLUhalfEdge e, long size) { + /* Just add the triangle to a triangle list, so we can render all + * the separate triangles at once. + */ + assert (size == 1); + tess.lonelyTriList = AddToTrail(e.Lface, tess.lonelyTriList); + } + } + + + static void RenderLonelyTriangles(GLUtessellatorImpl tess, GLUface f) { + /* Now we render all the separate triangles which could not be + * grouped into a triangle fan or strip. + */ + GLUhalfEdge e; + int newState; + int edgeState = -1; /* force edge state output for first vertex */ + + tess.callBeginOrBeginData(GL_TRIANGLES); + + for (; f != null; f = f.trail) { + /* Loop once for each edge (there will always be 3 edges) */ + + e = f.anEdge; + do { + if (tess.flagBoundary) { + /* Set the "edge state" to true just before we output the + * first vertex of each edge on the polygon boundary. + */ + newState = (!e.Sym.Lface.inside) ? 1 : 0; + if (edgeState != newState) { + edgeState = newState; + tess.callEdgeFlagOrEdgeFlagData( edgeState != 0); + } + } + tess.callVertexOrVertexData( e.Org.data); + + e = e.Lnext; + } while (e != f.anEdge); + } + tess.callEndOrEndData(); + } + + private static class RenderFan implements renderCallBack { + public void render(GLUtessellatorImpl tess, GLUhalfEdge e, long size) { + /* Render as many CCW triangles as possible in a fan starting from + * edge "e". The fan *should* contain exactly "size" triangles + * (otherwise we've goofed up somewhere). + */ + tess.callBeginOrBeginData(GL_TRIANGLE_FAN); + tess.callVertexOrVertexData( e.Org.data); + tess.callVertexOrVertexData( e.Sym.Org.data); + + while (!Marked(e.Lface)) { + e.Lface.marked = true; + --size; + e = e.Onext; + tess.callVertexOrVertexData( e.Sym.Org.data); + } + + assert (size == 0); + tess.callEndOrEndData(); + } + } + + private static class RenderStrip implements renderCallBack { + public void render(GLUtessellatorImpl tess, GLUhalfEdge e, long size) { + /* Render as many CCW triangles as possible in a strip starting from + * edge "e". The strip *should* contain exactly "size" triangles + * (otherwise we've goofed up somewhere). + */ + tess.callBeginOrBeginData(GL_TRIANGLE_STRIP); + tess.callVertexOrVertexData( e.Org.data); + tess.callVertexOrVertexData( e.Sym.Org.data); + + while (!Marked(e.Lface)) { + e.Lface.marked = true; + --size; + e = e.Lnext.Sym; + tess.callVertexOrVertexData( e.Org.data); + if (Marked(e.Lface)) break; + + e.Lface.marked = true; + --size; + e = e.Onext; + tess.callVertexOrVertexData( e.Sym.Org.data); + } + + assert (size == 0); + tess.callEndOrEndData(); + } + } + + /************************ Boundary contour decomposition ******************/ + +/* __gl_renderBoundary( tess, mesh ) takes a mesh, and outputs one + * contour for each face marked "inside". The rendering output is + * provided as callbacks (see the api). + */ + public static void __gl_renderBoundary(GLUtessellatorImpl tess, GLUmesh mesh) { + GLUface f; + GLUhalfEdge e; + + for (f = mesh.fHead.next; f != mesh.fHead; f = f.next) { + if (f.inside) { + tess.callBeginOrBeginData(GL_LINE_LOOP); + e = f.anEdge; + do { + tess.callVertexOrVertexData( e.Org.data); + e = e.Lnext; + } while (e != f.anEdge); + tess.callEndOrEndData(); + } + } + } + + + /************************ Quick-and-dirty decomposition ******************/ + + private static final int SIGN_INCONSISTENT = 2; + + static int ComputeNormal(GLUtessellatorImpl tess, double[] norm, boolean check) +/* + * If check==false, we compute the polygon normal and place it in norm[]. + * If check==true, we check that each triangle in the fan from v0 has a + * consistent orientation with respect to norm[]. If triangles are + * consistently oriented CCW, return 1; if CW, return -1; if all triangles + * are degenerate return 0; otherwise (no consistent orientation) return + * SIGN_INCONSISTENT. + */ { + CachedVertex[] v = tess.cache; +// CachedVertex vn = v0 + tess.cacheCount; + int vn = tess.cacheCount; +// CachedVertex vc; + int vc; + double dot, xc, yc, zc, xp, yp, zp; + double[] n = new double[3]; + int sign = 0; + + /* Find the polygon normal. It is important to get a reasonable + * normal even when the polygon is self-intersecting (eg. a bowtie). + * Otherwise, the computed normal could be very tiny, but perpendicular + * to the true plane of the polygon due to numerical noise. Then all + * the triangles would appear to be degenerate and we would incorrectly + * decompose the polygon as a fan (or simply not render it at all). + * + * We use a sum-of-triangles normal algorithm rather than the more + * efficient sum-of-trapezoids method (used in CheckOrientation() + * in normal.c). This lets us explicitly reverse the signed area + * of some triangles to get a reasonable normal in the self-intersecting + * case. + */ + if (!check) { + norm[0] = norm[1] = norm[2] = 0.0; + } + + vc = 1; + xc = v[vc].coords[0] - v[0].coords[0]; + yc = v[vc].coords[1] - v[0].coords[1]; + zc = v[vc].coords[2] - v[0].coords[2]; + while (++vc < vn) { + xp = xc; + yp = yc; + zp = zc; + xc = v[vc].coords[0] - v[0].coords[0]; + yc = v[vc].coords[1] - v[0].coords[1]; + zc = v[vc].coords[2] - v[0].coords[2]; + + /* Compute (vp - v0) cross (vc - v0) */ + n[0] = yp * zc - zp * yc; + n[1] = zp * xc - xp * zc; + n[2] = xp * yc - yp * xc; + + dot = n[0] * norm[0] + n[1] * norm[1] + n[2] * norm[2]; + if (!check) { + /* Reverse the contribution of back-facing triangles to get + * a reasonable normal for self-intersecting polygons (see above) + */ + if (dot >= 0) { + norm[0] += n[0]; + norm[1] += n[1]; + norm[2] += n[2]; + } else { + norm[0] -= n[0]; + norm[1] -= n[1]; + norm[2] -= n[2]; + } + } else if (dot != 0) { + /* Check the new orientation for consistency with previous triangles */ + if (dot > 0) { + if (sign < 0) return SIGN_INCONSISTENT; + sign = 1; + } else { + if (sign > 0) return SIGN_INCONSISTENT; + sign = -1; + } + } + } + return sign; + } + +/* __gl_renderCache( tess ) takes a single contour and tries to render it + * as a triangle fan. This handles convex polygons, as well as some + * non-convex polygons if we get lucky. + * + * Returns true if the polygon was successfully rendered. The rendering + * output is provided as callbacks (see the api). + */ + public static boolean __gl_renderCache(GLUtessellatorImpl tess) { + CachedVertex[] v = tess.cache; +// CachedVertex vn = v0 + tess.cacheCount; + int vn = tess.cacheCount; +// CachedVertex vc; + int vc; + double[] norm = new double[3]; + int sign; + + if (tess.cacheCount < 3) { + /* Degenerate contour -- no output */ + return true; + } + + norm[0] = tess.normal[0]; + norm[1] = tess.normal[1]; + norm[2] = tess.normal[2]; + if (norm[0] == 0 && norm[1] == 0 && norm[2] == 0) { + ComputeNormal( tess, norm, false); + } + + sign = ComputeNormal( tess, norm, true); + if (sign == SIGN_INCONSISTENT) { + /* Fan triangles did not have a consistent orientation */ + return false; + } + if (sign == 0) { + /* All triangles were degenerate */ + return true; + } + + if ( !USE_OPTIMIZED_CODE_PATH ) { + return false; + } else { + /* Make sure we do the right thing for each winding rule */ + switch (tess.windingRule) { + case GLU_TESS_WINDING_ODD: + case GLU_TESS_WINDING_NONZERO: + break; + case GLU_TESS_WINDING_POSITIVE: + if (sign < 0) return true; + break; + case GLU_TESS_WINDING_NEGATIVE: + if (sign > 0) return true; + break; + case GLU_TESS_WINDING_ABS_GEQ_TWO: + return true; + } + + tess.callBeginOrBeginData( tess.boundaryOnly ? GL_LINE_LOOP + : (tess.cacheCount > 3) ? GL_TRIANGLE_FAN + : GL_TRIANGLES); + + tess.callVertexOrVertexData( v[0].data); + if (sign > 0) { + for (vc = 1; vc < vn; ++vc) { + tess.callVertexOrVertexData( v[vc].data); + } + } else { + for (vc = vn - 1; vc > 0; --vc) { + tess.callVertexOrVertexData( v[vc].data); + } + } + tess.callEndOrEndData(); + return true; + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Sweep.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Sweep.java new file mode 100644 index 000000000..10f569785 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/Sweep.java @@ -0,0 +1,1390 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +import static org.lwjgl.util.glu.GLU.GLU_TESS_MAX_COORD; +import static org.lwjgl.util.glu.GLU.GLU_TESS_NEED_COMBINE_CALLBACK; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_ABS_GEQ_TWO; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_NEGATIVE; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_NONZERO; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_ODD; +import static org.lwjgl.util.glu.GLU.GLU_TESS_WINDING_POSITIVE; + +class Sweep { + private Sweep() { + } + +// #ifdef FOR_TRITE_TEST_PROGRAM +// extern void DebugEvent( GLUtessellator *tess ); +// #else + private static void DebugEvent(GLUtessellatorImpl tess) { + + } +// #endif + +/* + * Invariants for the Edge Dictionary. + * - each pair of adjacent edges e2=Succ(e1) satisfies EdgeLeq(e1,e2) + * at any valid location of the sweep event + * - if EdgeLeq(e2,e1) as well (at any valid sweep event), then e1 and e2 + * share a common endpoint + * - for each e, e.Dst has been processed, but not e.Org + * - each edge e satisfies VertLeq(e.Dst,event) && VertLeq(event,e.Org) + * where "event" is the current sweep line event. + * - no edge e has zero length + * + * Invariants for the Mesh (the processed portion). + * - the portion of the mesh left of the sweep line is a planar graph, + * ie. there is *some* way to embed it in the plane + * - no processed edge has zero length + * - no two processed vertices have identical coordinates + * - each "inside" region is monotone, ie. can be broken into two chains + * of monotonically increasing vertices according to VertLeq(v1,v2) + * - a non-invariant: these chains may intersect (very slightly) + * + * Invariants for the Sweep. + * - if none of the edges incident to the event vertex have an activeRegion + * (ie. none of these edges are in the edge dictionary), then the vertex + * has only right-going edges. + * - if an edge is marked "fixUpperEdge" (it is a temporary edge introduced + * by ConnectRightVertex), then it is the only right-going edge from + * its associated vertex. (This says that these edges exist only + * when it is necessary.) + */ + +/* When we merge two edges into one, we need to compute the combined + * winding of the new edge. + */ + private static void AddWinding(GLUhalfEdge eDst, GLUhalfEdge eSrc) { + eDst.winding += eSrc.winding; + eDst.Sym.winding += eSrc.Sym.winding; + } + + + private static ActiveRegion RegionBelow(ActiveRegion r) { + return ((ActiveRegion) Dict.dictKey(Dict.dictPred(r.nodeUp))); + } + + private static ActiveRegion RegionAbove(ActiveRegion r) { + return ((ActiveRegion) Dict.dictKey(Dict.dictSucc(r.nodeUp))); + } + + static boolean EdgeLeq(GLUtessellatorImpl tess, ActiveRegion reg1, ActiveRegion reg2) +/* + * Both edges must be directed from right to left (this is the canonical + * direction for the upper edge of each region). + * + * The strategy is to evaluate a "t" value for each edge at the + * current sweep line position, given by tess.event. The calculations + * are designed to be very stable, but of course they are not perfect. + * + * Special case: if both edge destinations are at the sweep event, + * we sort the edges by slope (they would otherwise compare equally). + */ { + GLUvertex event = tess.event; + GLUhalfEdge e1, e2; + double t1, t2; + + e1 = reg1.eUp; + e2 = reg2.eUp; + + if (e1.Sym.Org == event) { + if (e2.Sym.Org == event) { + /* Two edges right of the sweep line which meet at the sweep event. + * Sort them by slope. + */ + if (Geom.VertLeq(e1.Org, e2.Org)) { + return Geom.EdgeSign(e2.Sym.Org, e1.Org, e2.Org) <= 0; + } + return Geom.EdgeSign(e1.Sym.Org, e2.Org, e1.Org) >= 0; + } + return Geom.EdgeSign(e2.Sym.Org, event, e2.Org) <= 0; + } + if (e2.Sym.Org == event) { + return Geom.EdgeSign(e1.Sym.Org, event, e1.Org) >= 0; + } + + /* General case - compute signed distance *from* e1, e2 to event */ + t1 = Geom.EdgeEval(e1.Sym.Org, event, e1.Org); + t2 = Geom.EdgeEval(e2.Sym.Org, event, e2.Org); + return (t1 >= t2); + } + + + static void DeleteRegion(GLUtessellatorImpl tess, ActiveRegion reg) { + if (reg.fixUpperEdge) { + /* It was created with zero winding number, so it better be + * deleted with zero winding number (ie. it better not get merged + * with a real edge). + */ + assert (reg.eUp.winding == 0); + } + reg.eUp.activeRegion = null; + Dict.dictDelete(tess.dict, reg.nodeUp); /* __gl_dictListDelete */ + } + + + static boolean FixUpperEdge(ActiveRegion reg, GLUhalfEdge newEdge) +/* + * Replace an upper edge which needs fixing (see ConnectRightVertex). + */ { + assert (reg.fixUpperEdge); + if (!Mesh.__gl_meshDelete(reg.eUp)) return false; + reg.fixUpperEdge = false; + reg.eUp = newEdge; + newEdge.activeRegion = reg; + + return true; + } + + static ActiveRegion TopLeftRegion(ActiveRegion reg) { + GLUvertex org = reg.eUp.Org; + GLUhalfEdge e; + + /* Find the region above the uppermost edge with the same origin */ + do { + reg = RegionAbove(reg); + } while (reg.eUp.Org == org); + + /* If the edge above was a temporary edge introduced by ConnectRightVertex, + * now is the time to fix it. + */ + if (reg.fixUpperEdge) { + e = Mesh.__gl_meshConnect(RegionBelow(reg).eUp.Sym, reg.eUp.Lnext); + if (e == null) return null; + if (!FixUpperEdge(reg, e)) return null; + reg = RegionAbove(reg); + } + return reg; + } + + static ActiveRegion TopRightRegion(ActiveRegion reg) { + GLUvertex dst = reg.eUp.Sym.Org; + + /* Find the region above the uppermost edge with the same destination */ + do { + reg = RegionAbove(reg); + } while (reg.eUp.Sym.Org == dst); + return reg; + } + + static ActiveRegion AddRegionBelow(GLUtessellatorImpl tess, + ActiveRegion regAbove, + GLUhalfEdge eNewUp) +/* + * Add a new active region to the sweep line, *somewhere* below "regAbove" + * (according to where the new edge belongs in the sweep-line dictionary). + * The upper edge of the new region will be "eNewUp". + * Winding number and "inside" flag are not updated. + */ { + ActiveRegion regNew = new ActiveRegion(); + if (regNew == null) throw new RuntimeException(); + + regNew.eUp = eNewUp; + /* __gl_dictListInsertBefore */ + regNew.nodeUp = Dict.dictInsertBefore(tess.dict, regAbove.nodeUp, regNew); + if (regNew.nodeUp == null) throw new RuntimeException(); + regNew.fixUpperEdge = false; + regNew.sentinel = false; + regNew.dirty = false; + + eNewUp.activeRegion = regNew; + return regNew; + } + + static boolean IsWindingInside(GLUtessellatorImpl tess, int n) { + switch (tess.windingRule) { + case GLU_TESS_WINDING_ODD: + return (n & 1) != 0; + case GLU_TESS_WINDING_NONZERO: + return (n != 0); + case GLU_TESS_WINDING_POSITIVE: + return (n > 0); + case GLU_TESS_WINDING_NEGATIVE: + return (n < 0); + case GLU_TESS_WINDING_ABS_GEQ_TWO: + return (n >= 2) || (n <= -2); + } + /*LINTED*/ +// assert (false); + throw new InternalError(); + /*NOTREACHED*/ + } + + + static void ComputeWinding(GLUtessellatorImpl tess, ActiveRegion reg) { + reg.windingNumber = RegionAbove(reg).windingNumber + reg.eUp.winding; + reg.inside = IsWindingInside(tess, reg.windingNumber); + } + + + static void FinishRegion(GLUtessellatorImpl tess, ActiveRegion reg) +/* + * Delete a region from the sweep line. This happens when the upper + * and lower chains of a region meet (at a vertex on the sweep line). + * The "inside" flag is copied to the appropriate mesh face (we could + * not do this before -- since the structure of the mesh is always + * changing, this face may not have even existed until now). + */ { + GLUhalfEdge e = reg.eUp; + GLUface f = e.Lface; + + f.inside = reg.inside; + f.anEdge = e; /* optimization for __gl_meshTessellateMonoRegion() */ + DeleteRegion(tess, reg); + } + + + static GLUhalfEdge FinishLeftRegions(GLUtessellatorImpl tess, + ActiveRegion regFirst, ActiveRegion regLast) +/* + * We are given a vertex with one or more left-going edges. All affected + * edges should be in the edge dictionary. Starting at regFirst.eUp, + * we walk down deleting all regions where both edges have the same + * origin vOrg. At the same time we copy the "inside" flag from the + * active region to the face, since at this point each face will belong + * to at most one region (this was not necessarily true until this point + * in the sweep). The walk stops at the region above regLast; if regLast + * is null we walk as far as possible. At the same time we relink the + * mesh if necessary, so that the ordering of edges around vOrg is the + * same as in the dictionary. + */ { + ActiveRegion reg, regPrev; + GLUhalfEdge e, ePrev; + + regPrev = regFirst; + ePrev = regFirst.eUp; + while (regPrev != regLast) { + regPrev.fixUpperEdge = false; /* placement was OK */ + reg = RegionBelow(regPrev); + e = reg.eUp; + if (e.Org != ePrev.Org) { + if (!reg.fixUpperEdge) { + /* Remove the last left-going edge. Even though there are no further + * edges in the dictionary with this origin, there may be further + * such edges in the mesh (if we are adding left edges to a vertex + * that has already been processed). Thus it is important to call + * FinishRegion rather than just DeleteRegion. + */ + FinishRegion(tess, regPrev); + break; + } + /* If the edge below was a temporary edge introduced by + * ConnectRightVertex, now is the time to fix it. + */ + e = Mesh.__gl_meshConnect(ePrev.Onext.Sym, e.Sym); + if (e == null) throw new RuntimeException(); + if (!FixUpperEdge(reg, e)) throw new RuntimeException(); + } + + /* Relink edges so that ePrev.Onext == e */ + if (ePrev.Onext != e) { + if (!Mesh.__gl_meshSplice(e.Sym.Lnext, e)) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(ePrev, e)) throw new RuntimeException(); + } + FinishRegion(tess, regPrev); /* may change reg.eUp */ + ePrev = reg.eUp; + regPrev = reg; + } + return ePrev; + } + + + static void AddRightEdges(GLUtessellatorImpl tess, ActiveRegion regUp, + GLUhalfEdge eFirst, GLUhalfEdge eLast, GLUhalfEdge eTopLeft, + boolean cleanUp) +/* + * Purpose: insert right-going edges into the edge dictionary, and update + * winding numbers and mesh connectivity appropriately. All right-going + * edges share a common origin vOrg. Edges are inserted CCW starting at + * eFirst; the last edge inserted is eLast.Sym.Lnext. If vOrg has any + * left-going edges already processed, then eTopLeft must be the edge + * such that an imaginary upward vertical segment from vOrg would be + * contained between eTopLeft.Sym.Lnext and eTopLeft; otherwise eTopLeft + * should be null. + */ { + ActiveRegion reg, regPrev; + GLUhalfEdge e, ePrev; + boolean firstTime = true; + + /* Insert the new right-going edges in the dictionary */ + e = eFirst; + do { + assert (Geom.VertLeq(e.Org, e.Sym.Org)); + AddRegionBelow(tess, regUp, e.Sym); + e = e.Onext; + } while (e != eLast); + + /* Walk *all* right-going edges from e.Org, in the dictionary order, + * updating the winding numbers of each region, and re-linking the mesh + * edges to match the dictionary ordering (if necessary). + */ + if (eTopLeft == null) { + eTopLeft = RegionBelow(regUp).eUp.Sym.Onext; + } + regPrev = regUp; + ePrev = eTopLeft; + for (; ;) { + reg = RegionBelow(regPrev); + e = reg.eUp.Sym; + if (e.Org != ePrev.Org) break; + + if (e.Onext != ePrev) { + /* Unlink e from its current position, and relink below ePrev */ + if (!Mesh.__gl_meshSplice(e.Sym.Lnext, e)) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(ePrev.Sym.Lnext, e)) throw new RuntimeException(); + } + /* Compute the winding number and "inside" flag for the new regions */ + reg.windingNumber = regPrev.windingNumber - e.winding; + reg.inside = IsWindingInside(tess, reg.windingNumber); + + /* Check for two outgoing edges with same slope -- process these + * before any intersection tests (see example in __gl_computeInterior). + */ + regPrev.dirty = true; + if (!firstTime && CheckForRightSplice(tess, regPrev)) { + AddWinding(e, ePrev); + DeleteRegion(tess, regPrev); + if (!Mesh.__gl_meshDelete(ePrev)) throw new RuntimeException(); + } + firstTime = false; + regPrev = reg; + ePrev = e; + } + regPrev.dirty = true; + assert (regPrev.windingNumber - e.winding == reg.windingNumber); + + if (cleanUp) { + /* Check for intersections between newly adjacent edges. */ + WalkDirtyRegions(tess, regPrev); + } + } + + + static void CallCombine(GLUtessellatorImpl tess, GLUvertex isect, + Object[] data, float[] weights, boolean needed) { + double[] coords = new double[3]; + + /* Copy coord data in case the callback changes it. */ + coords[0] = isect.coords[0]; + coords[1] = isect.coords[1]; + coords[2] = isect.coords[2]; + + Object[] outData = new Object[1]; + tess.callCombineOrCombineData(coords, data, weights, outData); + isect.data = outData[0]; + if (isect.data == null) { + if (!needed) { + isect.data = data[0]; + } else if (!tess.fatalError) { + /* The only way fatal error is when two edges are found to intersect, + * but the user has not provided the callback necessary to handle + * generated intersection points. + */ + tess.callErrorOrErrorData(GLU_TESS_NEED_COMBINE_CALLBACK); + tess.fatalError = true; + } + } + } + + static void SpliceMergeVertices(GLUtessellatorImpl tess, GLUhalfEdge e1, + GLUhalfEdge e2) +/* + * Two vertices with idential coordinates are combined into one. + * e1.Org is kept, while e2.Org is discarded. + */ { + Object[] data = new Object[4]; + float[] weights = new float[]{0.5f, 0.5f, 0.0f, 0.0f}; + + data[0] = e1.Org.data; + data[1] = e2.Org.data; + CallCombine(tess, e1.Org, data, weights, false); + if (!Mesh.__gl_meshSplice(e1, e2)) throw new RuntimeException(); + } + + static void VertexWeights(GLUvertex isect, GLUvertex org, GLUvertex dst, + float[] weights) +/* + * Find some weights which describe how the intersection vertex is + * a linear combination of "org" and "dest". Each of the two edges + * which generated "isect" is allocated 50% of the weight; each edge + * splits the weight between its org and dst according to the + * relative distance to "isect". + */ { + double t1 = Geom.VertL1dist(org, isect); + double t2 = Geom.VertL1dist(dst, isect); + + weights[0] = (float) (0.5 * t2 / (t1 + t2)); + weights[1] = (float) (0.5 * t1 / (t1 + t2)); + isect.coords[0] += weights[0] * org.coords[0] + weights[1] * dst.coords[0]; + isect.coords[1] += weights[0] * org.coords[1] + weights[1] * dst.coords[1]; + isect.coords[2] += weights[0] * org.coords[2] + weights[1] * dst.coords[2]; + } + + + static void GetIntersectData(GLUtessellatorImpl tess, GLUvertex isect, + GLUvertex orgUp, GLUvertex dstUp, + GLUvertex orgLo, GLUvertex dstLo) +/* + * We've computed a new intersection point, now we need a "data" pointer + * from the user so that we can refer to this new vertex in the + * rendering callbacks. + */ { + Object[] data = new Object[4]; + float[] weights = new float[4]; + float[] weights1 = new float[2]; + float[] weights2 = new float[2]; + + data[0] = orgUp.data; + data[1] = dstUp.data; + data[2] = orgLo.data; + data[3] = dstLo.data; + + isect.coords[0] = isect.coords[1] = isect.coords[2] = 0; + VertexWeights(isect, orgUp, dstUp, weights1); + VertexWeights(isect, orgLo, dstLo, weights2); + System.arraycopy(weights1, 0, weights, 0, 2); + System.arraycopy(weights2, 0, weights, 2, 2); + + CallCombine(tess, isect, data, weights, true); + } + + static boolean CheckForRightSplice(GLUtessellatorImpl tess, ActiveRegion regUp) +/* + * Check the upper and lower edge of "regUp", to make sure that the + * eUp.Org is above eLo, or eLo.Org is below eUp (depending on which + * origin is leftmost). + * + * The main purpose is to splice right-going edges with the same + * dest vertex and nearly identical slopes (ie. we can't distinguish + * the slopes numerically). However the splicing can also help us + * to recover from numerical errors. For example, suppose at one + * point we checked eUp and eLo, and decided that eUp.Org is barely + * above eLo. Then later, we split eLo into two edges (eg. from + * a splice operation like this one). This can change the result of + * our test so that now eUp.Org is incident to eLo, or barely below it. + * We must correct this condition to maintain the dictionary invariants. + * + * One possibility is to check these edges for intersection again + * (ie. CheckForIntersect). This is what we do if possible. However + * CheckForIntersect requires that tess.event lies between eUp and eLo, + * so that it has something to fall back on when the intersection + * calculation gives us an unusable answer. So, for those cases where + * we can't check for intersection, this routine fixes the problem + * by just splicing the offending vertex into the other edge. + * This is a guaranteed solution, no matter how degenerate things get. + * Basically this is a combinatorial solution to a numerical problem. + */ { + ActiveRegion regLo = RegionBelow(regUp); + GLUhalfEdge eUp = regUp.eUp; + GLUhalfEdge eLo = regLo.eUp; + + if (Geom.VertLeq(eUp.Org, eLo.Org)) { + if (Geom.EdgeSign(eLo.Sym.Org, eUp.Org, eLo.Org) > 0) return false; + + /* eUp.Org appears to be below eLo */ + if (!Geom.VertEq(eUp.Org, eLo.Org)) { + /* Splice eUp.Org into eLo */ + if (Mesh.__gl_meshSplitEdge(eLo.Sym) == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eUp, eLo.Sym.Lnext)) throw new RuntimeException(); + regUp.dirty = regLo.dirty = true; + + } else if (eUp.Org != eLo.Org) { + /* merge the two vertices, discarding eUp.Org */ + tess.pq.pqDelete(eUp.Org.pqHandle); /* __gl_pqSortDelete */ + SpliceMergeVertices(tess, eLo.Sym.Lnext, eUp); + } + } else { + if (Geom.EdgeSign(eUp.Sym.Org, eLo.Org, eUp.Org) < 0) return false; + + /* eLo.Org appears to be above eUp, so splice eLo.Org into eUp */ + RegionAbove(regUp).dirty = regUp.dirty = true; + if (Mesh.__gl_meshSplitEdge(eUp.Sym) == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eLo.Sym.Lnext, eUp)) throw new RuntimeException(); + } + return true; + } + + static boolean CheckForLeftSplice(GLUtessellatorImpl tess, ActiveRegion regUp) +/* + * Check the upper and lower edge of "regUp", to make sure that the + * eUp.Sym.Org is above eLo, or eLo.Sym.Org is below eUp (depending on which + * destination is rightmost). + * + * Theoretically, this should always be true. However, splitting an edge + * into two pieces can change the results of previous tests. For example, + * suppose at one point we checked eUp and eLo, and decided that eUp.Sym.Org + * is barely above eLo. Then later, we split eLo into two edges (eg. from + * a splice operation like this one). This can change the result of + * the test so that now eUp.Sym.Org is incident to eLo, or barely below it. + * We must correct this condition to maintain the dictionary invariants + * (otherwise new edges might get inserted in the wrong place in the + * dictionary, and bad stuff will happen). + * + * We fix the problem by just splicing the offending vertex into the + * other edge. + */ { + ActiveRegion regLo = RegionBelow(regUp); + GLUhalfEdge eUp = regUp.eUp; + GLUhalfEdge eLo = regLo.eUp; + GLUhalfEdge e; + + assert (!Geom.VertEq(eUp.Sym.Org, eLo.Sym.Org)); + + if (Geom.VertLeq(eUp.Sym.Org, eLo.Sym.Org)) { + if (Geom.EdgeSign(eUp.Sym.Org, eLo.Sym.Org, eUp.Org) < 0) return false; + + /* eLo.Sym.Org is above eUp, so splice eLo.Sym.Org into eUp */ + RegionAbove(regUp).dirty = regUp.dirty = true; + e = Mesh.__gl_meshSplitEdge(eUp); + if (e == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eLo.Sym, e)) throw new RuntimeException(); + e.Lface.inside = regUp.inside; + } else { + if (Geom.EdgeSign(eLo.Sym.Org, eUp.Sym.Org, eLo.Org) > 0) return false; + + /* eUp.Sym.Org is below eLo, so splice eUp.Sym.Org into eLo */ + regUp.dirty = regLo.dirty = true; + e = Mesh.__gl_meshSplitEdge(eLo); + if (e == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eUp.Lnext, eLo.Sym)) throw new RuntimeException(); + e.Sym.Lface.inside = regUp.inside; + } + return true; + } + + + static boolean CheckForIntersect(GLUtessellatorImpl tess, ActiveRegion regUp) +/* + * Check the upper and lower edges of the given region to see if + * they intersect. If so, create the intersection and add it + * to the data structures. + * + * Returns true if adding the new intersection resulted in a recursive + * call to AddRightEdges(); in this case all "dirty" regions have been + * checked for intersections, and possibly regUp has been deleted. + */ { + ActiveRegion regLo = RegionBelow(regUp); + GLUhalfEdge eUp = regUp.eUp; + GLUhalfEdge eLo = regLo.eUp; + GLUvertex orgUp = eUp.Org; + GLUvertex orgLo = eLo.Org; + GLUvertex dstUp = eUp.Sym.Org; + GLUvertex dstLo = eLo.Sym.Org; + double tMinUp, tMaxLo; + GLUvertex isect = new GLUvertex(); + GLUvertex orgMin; + GLUhalfEdge e; + + assert (!Geom.VertEq(dstLo, dstUp)); + assert (Geom.EdgeSign(dstUp, tess.event, orgUp) <= 0); + assert (Geom.EdgeSign(dstLo, tess.event, orgLo) >= 0); + assert (orgUp != tess.event && orgLo != tess.event); + assert (!regUp.fixUpperEdge && !regLo.fixUpperEdge); + + if (orgUp == orgLo) return false; /* right endpoints are the same */ + + tMinUp = Math.min(orgUp.t, dstUp.t); + tMaxLo = Math.max(orgLo.t, dstLo.t); + if (tMinUp > tMaxLo) return false; /* t ranges do not overlap */ + + if (Geom.VertLeq(orgUp, orgLo)) { + if (Geom.EdgeSign(dstLo, orgUp, orgLo) > 0) return false; + } else { + if (Geom.EdgeSign(dstUp, orgLo, orgUp) < 0) return false; + } + + /* At this point the edges intersect, at least marginally */ + DebugEvent(tess); + + Geom.EdgeIntersect(dstUp, orgUp, dstLo, orgLo, isect); + /* The following properties are guaranteed: */ + assert (Math.min(orgUp.t, dstUp.t) <= isect.t); + assert (isect.t <= Math.max(orgLo.t, dstLo.t)); + assert (Math.min(dstLo.s, dstUp.s) <= isect.s); + assert (isect.s <= Math.max(orgLo.s, orgUp.s)); + + if (Geom.VertLeq(isect, tess.event)) { + /* The intersection point lies slightly to the left of the sweep line, + * so move it until it''s slightly to the right of the sweep line. + * (If we had perfect numerical precision, this would never happen + * in the first place). The easiest and safest thing to do is + * replace the intersection by tess.event. + */ + isect.s = tess.event.s; + isect.t = tess.event.t; + } + /* Similarly, if the computed intersection lies to the right of the + * rightmost origin (which should rarely happen), it can cause + * unbelievable inefficiency on sufficiently degenerate inputs. + * (If you have the test program, try running test54.d with the + * "X zoom" option turned on). + */ + orgMin = Geom.VertLeq(orgUp, orgLo) ? orgUp : orgLo; + if (Geom.VertLeq(orgMin, isect)) { + isect.s = orgMin.s; + isect.t = orgMin.t; + } + + if (Geom.VertEq(isect, orgUp) || Geom.VertEq(isect, orgLo)) { + /* Easy case -- intersection at one of the right endpoints */ + CheckForRightSplice(tess, regUp); + return false; + } + + if ((!Geom.VertEq(dstUp, tess.event) + && Geom.EdgeSign(dstUp, tess.event, isect) >= 0) + || (!Geom.VertEq(dstLo, tess.event) + && Geom.EdgeSign(dstLo, tess.event, isect) <= 0)) { + /* Very unusual -- the new upper or lower edge would pass on the + * wrong side of the sweep event, or through it. This can happen + * due to very small numerical errors in the intersection calculation. + */ + if (dstLo == tess.event) { + /* Splice dstLo into eUp, and process the new region(s) */ + if (Mesh.__gl_meshSplitEdge(eUp.Sym) == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eLo.Sym, eUp)) throw new RuntimeException(); + regUp = TopLeftRegion(regUp); + if (regUp == null) throw new RuntimeException(); + eUp = RegionBelow(regUp).eUp; + FinishLeftRegions(tess, RegionBelow(regUp), regLo); + AddRightEdges(tess, regUp, eUp.Sym.Lnext, eUp, eUp, true); + return true; + } + if (dstUp == tess.event) { + /* Splice dstUp into eLo, and process the new region(s) */ + if (Mesh.__gl_meshSplitEdge(eLo.Sym) == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eUp.Lnext, eLo.Sym.Lnext)) throw new RuntimeException(); + regLo = regUp; + regUp = TopRightRegion(regUp); + e = RegionBelow(regUp).eUp.Sym.Onext; + regLo.eUp = eLo.Sym.Lnext; + eLo = FinishLeftRegions(tess, regLo, null); + AddRightEdges(tess, regUp, eLo.Onext, eUp.Sym.Onext, e, true); + return true; + } + /* Special case: called from ConnectRightVertex. If either + * edge passes on the wrong side of tess.event, split it + * (and wait for ConnectRightVertex to splice it appropriately). + */ + if (Geom.EdgeSign(dstUp, tess.event, isect) >= 0) { + RegionAbove(regUp).dirty = regUp.dirty = true; + if (Mesh.__gl_meshSplitEdge(eUp.Sym) == null) throw new RuntimeException(); + eUp.Org.s = tess.event.s; + eUp.Org.t = tess.event.t; + } + if (Geom.EdgeSign(dstLo, tess.event, isect) <= 0) { + regUp.dirty = regLo.dirty = true; + if (Mesh.__gl_meshSplitEdge(eLo.Sym) == null) throw new RuntimeException(); + eLo.Org.s = tess.event.s; + eLo.Org.t = tess.event.t; + } + /* leave the rest for ConnectRightVertex */ + return false; + } + + /* General case -- split both edges, splice into new vertex. + * When we do the splice operation, the order of the arguments is + * arbitrary as far as correctness goes. However, when the operation + * creates a new face, the work done is proportional to the size of + * the new face. We expect the faces in the processed part of + * the mesh (ie. eUp.Lface) to be smaller than the faces in the + * unprocessed original contours (which will be eLo.Sym.Lnext.Lface). + */ + if (Mesh.__gl_meshSplitEdge(eUp.Sym) == null) throw new RuntimeException(); + if (Mesh.__gl_meshSplitEdge(eLo.Sym) == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eLo.Sym.Lnext, eUp)) throw new RuntimeException(); + eUp.Org.s = isect.s; + eUp.Org.t = isect.t; + eUp.Org.pqHandle = tess.pq.pqInsert(eUp.Org); /* __gl_pqSortInsert */ + if (eUp.Org.pqHandle == Long.MAX_VALUE) { + tess.pq.pqDeletePriorityQ(); /* __gl_pqSortDeletePriorityQ */ + tess.pq = null; + throw new RuntimeException(); + } + GetIntersectData(tess, eUp.Org, orgUp, dstUp, orgLo, dstLo); + RegionAbove(regUp).dirty = regUp.dirty = regLo.dirty = true; + return false; + } + + static void WalkDirtyRegions(GLUtessellatorImpl tess, ActiveRegion regUp) +/* + * When the upper or lower edge of any region changes, the region is + * marked "dirty". This routine walks through all the dirty regions + * and makes sure that the dictionary invariants are satisfied + * (see the comments at the beginning of this file). Of course + * new dirty regions can be created as we make changes to restore + * the invariants. + */ { + ActiveRegion regLo = RegionBelow(regUp); + GLUhalfEdge eUp, eLo; + + for (; ;) { + /* Find the lowest dirty region (we walk from the bottom up). */ + while (regLo.dirty) { + regUp = regLo; + regLo = RegionBelow(regLo); + } + if (!regUp.dirty) { + regLo = regUp; + regUp = RegionAbove(regUp); + if (regUp == null || !regUp.dirty) { + /* We've walked all the dirty regions */ + return; + } + } + regUp.dirty = false; + eUp = regUp.eUp; + eLo = regLo.eUp; + + if (eUp.Sym.Org != eLo.Sym.Org) { + /* Check that the edge ordering is obeyed at the Dst vertices. */ + if (CheckForLeftSplice(tess, regUp)) { + + /* If the upper or lower edge was marked fixUpperEdge, then + * we no longer need it (since these edges are needed only for + * vertices which otherwise have no right-going edges). + */ + if (regLo.fixUpperEdge) { + DeleteRegion(tess, regLo); + if (!Mesh.__gl_meshDelete(eLo)) throw new RuntimeException(); + regLo = RegionBelow(regUp); + eLo = regLo.eUp; + } else if (regUp.fixUpperEdge) { + DeleteRegion(tess, regUp); + if (!Mesh.__gl_meshDelete(eUp)) throw new RuntimeException(); + regUp = RegionAbove(regLo); + eUp = regUp.eUp; + } + } + } + if (eUp.Org != eLo.Org) { + if (eUp.Sym.Org != eLo.Sym.Org + && !regUp.fixUpperEdge && !regLo.fixUpperEdge + && (eUp.Sym.Org == tess.event || eLo.Sym.Org == tess.event)) { + /* When all else fails in CheckForIntersect(), it uses tess.event + * as the intersection location. To make this possible, it requires + * that tess.event lie between the upper and lower edges, and also + * that neither of these is marked fixUpperEdge (since in the worst + * case it might splice one of these edges into tess.event, and + * violate the invariant that fixable edges are the only right-going + * edge from their associated vertex). + */ + if (CheckForIntersect(tess, regUp)) { + /* WalkDirtyRegions() was called recursively; we're done */ + return; + } + } else { + /* Even though we can't use CheckForIntersect(), the Org vertices + * may violate the dictionary edge ordering. Check and correct this. + */ + CheckForRightSplice(tess, regUp); + } + } + if (eUp.Org == eLo.Org && eUp.Sym.Org == eLo.Sym.Org) { + /* A degenerate loop consisting of only two edges -- delete it. */ + AddWinding(eLo, eUp); + DeleteRegion(tess, regUp); + if (!Mesh.__gl_meshDelete(eUp)) throw new RuntimeException(); + regUp = RegionAbove(regLo); + } + } + } + + + static void ConnectRightVertex(GLUtessellatorImpl tess, ActiveRegion regUp, + GLUhalfEdge eBottomLeft) +/* + * Purpose: connect a "right" vertex vEvent (one where all edges go left) + * to the unprocessed portion of the mesh. Since there are no right-going + * edges, two regions (one above vEvent and one below) are being merged + * into one. "regUp" is the upper of these two regions. + * + * There are two reasons for doing this (adding a right-going edge): + * - if the two regions being merged are "inside", we must add an edge + * to keep them separated (the combined region would not be monotone). + * - in any case, we must leave some record of vEvent in the dictionary, + * so that we can merge vEvent with features that we have not seen yet. + * For example, maybe there is a vertical edge which passes just to + * the right of vEvent; we would like to splice vEvent into this edge. + * + * However, we don't want to connect vEvent to just any vertex. We don''t + * want the new edge to cross any other edges; otherwise we will create + * intersection vertices even when the input data had no self-intersections. + * (This is a bad thing; if the user's input data has no intersections, + * we don't want to generate any false intersections ourselves.) + * + * Our eventual goal is to connect vEvent to the leftmost unprocessed + * vertex of the combined region (the union of regUp and regLo). + * But because of unseen vertices with all right-going edges, and also + * new vertices which may be created by edge intersections, we don''t + * know where that leftmost unprocessed vertex is. In the meantime, we + * connect vEvent to the closest vertex of either chain, and mark the region + * as "fixUpperEdge". This flag says to delete and reconnect this edge + * to the next processed vertex on the boundary of the combined region. + * Quite possibly the vertex we connected to will turn out to be the + * closest one, in which case we won''t need to make any changes. + */ { + GLUhalfEdge eNew; + GLUhalfEdge eTopLeft = eBottomLeft.Onext; + ActiveRegion regLo = RegionBelow(regUp); + GLUhalfEdge eUp = regUp.eUp; + GLUhalfEdge eLo = regLo.eUp; + boolean degenerate = false; + + if (eUp.Sym.Org != eLo.Sym.Org) { + CheckForIntersect(tess, regUp); + } + + /* Possible new degeneracies: upper or lower edge of regUp may pass + * through vEvent, or may coincide with new intersection vertex + */ + if (Geom.VertEq(eUp.Org, tess.event)) { + if (!Mesh.__gl_meshSplice(eTopLeft.Sym.Lnext, eUp)) throw new RuntimeException(); + regUp = TopLeftRegion(regUp); + if (regUp == null) throw new RuntimeException(); + eTopLeft = RegionBelow(regUp).eUp; + FinishLeftRegions(tess, RegionBelow(regUp), regLo); + degenerate = true; + } + if (Geom.VertEq(eLo.Org, tess.event)) { + if (!Mesh.__gl_meshSplice(eBottomLeft, eLo.Sym.Lnext)) throw new RuntimeException(); + eBottomLeft = FinishLeftRegions(tess, regLo, null); + degenerate = true; + } + if (degenerate) { + AddRightEdges(tess, regUp, eBottomLeft.Onext, eTopLeft, eTopLeft, true); + return; + } + + /* Non-degenerate situation -- need to add a temporary, fixable edge. + * Connect to the closer of eLo.Org, eUp.Org. + */ + if (Geom.VertLeq(eLo.Org, eUp.Org)) { + eNew = eLo.Sym.Lnext; + } else { + eNew = eUp; + } + eNew = Mesh.__gl_meshConnect(eBottomLeft.Onext.Sym, eNew); + if (eNew == null) throw new RuntimeException(); + + /* Prevent cleanup, otherwise eNew might disappear before we've even + * had a chance to mark it as a temporary edge. + */ + AddRightEdges(tess, regUp, eNew, eNew.Onext, eNew.Onext, false); + eNew.Sym.activeRegion.fixUpperEdge = true; + WalkDirtyRegions(tess, regUp); + } + +/* Because vertices at exactly the same location are merged together + * before we process the sweep event, some degenerate cases can't occur. + * However if someone eventually makes the modifications required to + * merge features which are close together, the cases below marked + * TOLERANCE_NONZERO will be useful. They were debugged before the + * code to merge identical vertices in the main loop was added. + */ + private static final boolean TOLERANCE_NONZERO = false; + + static void ConnectLeftDegenerate(GLUtessellatorImpl tess, + ActiveRegion regUp, GLUvertex vEvent) +/* + * The event vertex lies exacty on an already-processed edge or vertex. + * Adding the new vertex involves splicing it into the already-processed + * part of the mesh. + */ { + GLUhalfEdge e, eTopLeft, eTopRight, eLast; + ActiveRegion reg; + + e = regUp.eUp; + if (Geom.VertEq(e.Org, vEvent)) { + /* e.Org is an unprocessed vertex - just combine them, and wait + * for e.Org to be pulled from the queue + */ + assert (TOLERANCE_NONZERO); + SpliceMergeVertices(tess, e, vEvent.anEdge); + return; + } + + if (!Geom.VertEq(e.Sym.Org, vEvent)) { + /* General case -- splice vEvent into edge e which passes through it */ + if (Mesh.__gl_meshSplitEdge(e.Sym) == null) throw new RuntimeException(); + if (regUp.fixUpperEdge) { + /* This edge was fixable -- delete unused portion of original edge */ + if (!Mesh.__gl_meshDelete(e.Onext)) throw new RuntimeException(); + regUp.fixUpperEdge = false; + } + if (!Mesh.__gl_meshSplice(vEvent.anEdge, e)) throw new RuntimeException(); + SweepEvent(tess, vEvent); /* recurse */ + return; + } + + /* vEvent coincides with e.Sym.Org, which has already been processed. + * Splice in the additional right-going edges. + */ + assert (TOLERANCE_NONZERO); + regUp = TopRightRegion(regUp); + reg = RegionBelow(regUp); + eTopRight = reg.eUp.Sym; + eTopLeft = eLast = eTopRight.Onext; + if (reg.fixUpperEdge) { + /* Here e.Sym.Org has only a single fixable edge going right. + * We can delete it since now we have some real right-going edges. + */ + assert (eTopLeft != eTopRight); /* there are some left edges too */ + DeleteRegion(tess, reg); + if (!Mesh.__gl_meshDelete(eTopRight)) throw new RuntimeException(); + eTopRight = eTopLeft.Sym.Lnext; + } + if (!Mesh.__gl_meshSplice(vEvent.anEdge, eTopRight)) throw new RuntimeException(); + if (!Geom.EdgeGoesLeft(eTopLeft)) { + /* e.Sym.Org had no left-going edges -- indicate this to AddRightEdges() */ + eTopLeft = null; + } + AddRightEdges(tess, regUp, eTopRight.Onext, eLast, eTopLeft, true); + } + + + static void ConnectLeftVertex(GLUtessellatorImpl tess, GLUvertex vEvent) +/* + * Purpose: connect a "left" vertex (one where both edges go right) + * to the processed portion of the mesh. Let R be the active region + * containing vEvent, and let U and L be the upper and lower edge + * chains of R. There are two possibilities: + * + * - the normal case: split R into two regions, by connecting vEvent to + * the rightmost vertex of U or L lying to the left of the sweep line + * + * - the degenerate case: if vEvent is close enough to U or L, we + * merge vEvent into that edge chain. The subcases are: + * - merging with the rightmost vertex of U or L + * - merging with the active edge of U or L + * - merging with an already-processed portion of U or L + */ { + ActiveRegion regUp, regLo, reg; + GLUhalfEdge eUp, eLo, eNew; + ActiveRegion tmp = new ActiveRegion(); + + /* assert ( vEvent.anEdge.Onext.Onext == vEvent.anEdge ); */ + + /* Get a pointer to the active region containing vEvent */ + tmp.eUp = vEvent.anEdge.Sym; + /* __GL_DICTLISTKEY */ /* __gl_dictListSearch */ + regUp = (ActiveRegion) Dict.dictKey(Dict.dictSearch(tess.dict, tmp)); + regLo = RegionBelow(regUp); + eUp = regUp.eUp; + eLo = regLo.eUp; + + /* Try merging with U or L first */ + if (Geom.EdgeSign(eUp.Sym.Org, vEvent, eUp.Org) == 0) { + ConnectLeftDegenerate(tess, regUp, vEvent); + return; + } + + /* Connect vEvent to rightmost processed vertex of either chain. + * e.Sym.Org is the vertex that we will connect to vEvent. + */ + reg = Geom.VertLeq(eLo.Sym.Org, eUp.Sym.Org) ? regUp : regLo; + + if (regUp.inside || reg.fixUpperEdge) { + if (reg == regUp) { + eNew = Mesh.__gl_meshConnect(vEvent.anEdge.Sym, eUp.Lnext); + if (eNew == null) throw new RuntimeException(); + } else { + GLUhalfEdge tempHalfEdge = Mesh.__gl_meshConnect(eLo.Sym.Onext.Sym, vEvent.anEdge); + if (tempHalfEdge == null) throw new RuntimeException(); + + eNew = tempHalfEdge.Sym; + } + if (reg.fixUpperEdge) { + if (!FixUpperEdge(reg, eNew)) throw new RuntimeException(); + } else { + ComputeWinding(tess, AddRegionBelow(tess, regUp, eNew)); + } + SweepEvent(tess, vEvent); + } else { + /* The new vertex is in a region which does not belong to the polygon. + * We don''t need to connect this vertex to the rest of the mesh. + */ + AddRightEdges(tess, regUp, vEvent.anEdge, vEvent.anEdge, null, true); + } + } + + + static void SweepEvent(GLUtessellatorImpl tess, GLUvertex vEvent) +/* + * Does everything necessary when the sweep line crosses a vertex. + * Updates the mesh and the edge dictionary. + */ { + ActiveRegion regUp, reg; + GLUhalfEdge e, eTopLeft, eBottomLeft; + + tess.event = vEvent; /* for access in EdgeLeq() */ + DebugEvent(tess); + + /* Check if this vertex is the right endpoint of an edge that is + * already in the dictionary. In this case we don't need to waste + * time searching for the location to insert new edges. + */ + e = vEvent.anEdge; + while (e.activeRegion == null) { + e = e.Onext; + if (e == vEvent.anEdge) { + /* All edges go right -- not incident to any processed edges */ + ConnectLeftVertex(tess, vEvent); + return; + } + } + + /* Processing consists of two phases: first we "finish" all the + * active regions where both the upper and lower edges terminate + * at vEvent (ie. vEvent is closing off these regions). + * We mark these faces "inside" or "outside" the polygon according + * to their winding number, and delete the edges from the dictionary. + * This takes care of all the left-going edges from vEvent. + */ + regUp = TopLeftRegion(e.activeRegion); + if (regUp == null) throw new RuntimeException(); + reg = RegionBelow(regUp); + eTopLeft = reg.eUp; + eBottomLeft = FinishLeftRegions(tess, reg, null); + + /* Next we process all the right-going edges from vEvent. This + * involves adding the edges to the dictionary, and creating the + * associated "active regions" which record information about the + * regions between adjacent dictionary edges. + */ + if (eBottomLeft.Onext == eTopLeft) { + /* No right-going edges -- add a temporary "fixable" edge */ + ConnectRightVertex(tess, regUp, eBottomLeft); + } else { + AddRightEdges(tess, regUp, eBottomLeft.Onext, eTopLeft, eTopLeft, true); + } + } + + +/* Make the sentinel coordinates big enough that they will never be + * merged with real input features. (Even with the largest possible + * input contour and the maximum tolerance of 1.0, no merging will be + * done with coordinates larger than 3 * GLU_TESS_MAX_COORD). + */ + private static final double SENTINEL_COORD = (4.0 * GLU_TESS_MAX_COORD); + + static void AddSentinel(GLUtessellatorImpl tess, double t) +/* + * We add two sentinel edges above and below all other edges, + * to avoid special cases at the top and bottom. + */ { + GLUhalfEdge e; + ActiveRegion reg = new ActiveRegion(); + if (reg == null) throw new RuntimeException(); + + e = Mesh.__gl_meshMakeEdge(tess.mesh); + if (e == null) throw new RuntimeException(); + + e.Org.s = SENTINEL_COORD; + e.Org.t = t; + e.Sym.Org.s = -SENTINEL_COORD; + e.Sym.Org.t = t; + tess.event = e.Sym.Org; /* initialize it */ + + reg.eUp = e; + reg.windingNumber = 0; + reg.inside = false; + reg.fixUpperEdge = false; + reg.sentinel = true; + reg.dirty = false; + reg.nodeUp = Dict.dictInsert(tess.dict, reg); /* __gl_dictListInsertBefore */ + if (reg.nodeUp == null) throw new RuntimeException(); + } + + + static void InitEdgeDict(final GLUtessellatorImpl tess) +/* + * We maintain an ordering of edge intersections with the sweep line. + * This order is maintained in a dynamic dictionary. + */ { + /* __gl_dictListNewDict */ + tess.dict = Dict.dictNewDict(tess, new Dict.DictLeq() { + public boolean leq(Object frame, Object key1, Object key2) { + return EdgeLeq(tess, (ActiveRegion) key1, (ActiveRegion) key2); + } + }); + if (tess.dict == null) throw new RuntimeException(); + + AddSentinel(tess, -SENTINEL_COORD); + AddSentinel(tess, SENTINEL_COORD); + } + + + static void DoneEdgeDict(GLUtessellatorImpl tess) { + ActiveRegion reg; + int fixedEdges = 0; + + /* __GL_DICTLISTKEY */ /* __GL_DICTLISTMIN */ + while ((reg = (ActiveRegion) Dict.dictKey(Dict.dictMin(tess.dict))) != null) { + /* + * At the end of all processing, the dictionary should contain + * only the two sentinel edges, plus at most one "fixable" edge + * created by ConnectRightVertex(). + */ + if (!reg.sentinel) { + assert (reg.fixUpperEdge); + assert (++fixedEdges == 1); + } + assert (reg.windingNumber == 0); + DeleteRegion(tess, reg); +/* __gl_meshDelete( reg.eUp );*/ + } + Dict.dictDeleteDict(tess.dict); /* __gl_dictListDeleteDict */ + } + + + static void RemoveDegenerateEdges(GLUtessellatorImpl tess) +/* + * Remove zero-length edges, and contours with fewer than 3 vertices. + */ { + GLUhalfEdge e, eNext, eLnext; + GLUhalfEdge eHead = tess.mesh.eHead; + + /*LINTED*/ + for (e = eHead.next; e != eHead; e = eNext) { + eNext = e.next; + eLnext = e.Lnext; + + if (Geom.VertEq(e.Org, e.Sym.Org) && e.Lnext.Lnext != e) { + /* Zero-length edge, contour has at least 3 edges */ + + SpliceMergeVertices(tess, eLnext, e); /* deletes e.Org */ + if (!Mesh.__gl_meshDelete(e)) throw new RuntimeException(); /* e is a self-loop */ + e = eLnext; + eLnext = e.Lnext; + } + if (eLnext.Lnext == e) { + /* Degenerate contour (one or two edges) */ + + if (eLnext != e) { + if (eLnext == eNext || eLnext == eNext.Sym) { + eNext = eNext.next; + } + if (!Mesh.__gl_meshDelete(eLnext)) throw new RuntimeException(); + } + if (e == eNext || e == eNext.Sym) { + eNext = eNext.next; + } + if (!Mesh.__gl_meshDelete(e)) throw new RuntimeException(); + } + } + } + + static boolean InitPriorityQ(GLUtessellatorImpl tess) +/* + * Insert all vertices into the priority queue which determines the + * order in which vertices cross the sweep line. + */ { + PriorityQ pq; + GLUvertex v, vHead; + + /* __gl_pqSortNewPriorityQ */ + pq = tess.pq = PriorityQ.pqNewPriorityQ(new PriorityQ.Leq() { + public boolean leq(Object key1, Object key2) { + return Geom.VertLeq(((GLUvertex) key1), (GLUvertex) key2); + } + }); + if (pq == null) return false; + + vHead = tess.mesh.vHead; + for (v = vHead.next; v != vHead; v = v.next) { + v.pqHandle = pq.pqInsert(v); /* __gl_pqSortInsert */ + if (v.pqHandle == Long.MAX_VALUE) break; + } + if (v != vHead || !pq.pqInit()) { /* __gl_pqSortInit */ + tess.pq.pqDeletePriorityQ(); /* __gl_pqSortDeletePriorityQ */ + tess.pq = null; + return false; + } + + return true; + } + + + static void DonePriorityQ(GLUtessellatorImpl tess) { + tess.pq.pqDeletePriorityQ(); /* __gl_pqSortDeletePriorityQ */ + } + + + static boolean RemoveDegenerateFaces(GLUmesh mesh) +/* + * Delete any degenerate faces with only two edges. WalkDirtyRegions() + * will catch almost all of these, but it won't catch degenerate faces + * produced by splice operations on already-processed edges. + * The two places this can happen are in FinishLeftRegions(), when + * we splice in a "temporary" edge produced by ConnectRightVertex(), + * and in CheckForLeftSplice(), where we splice already-processed + * edges to ensure that our dictionary invariants are not violated + * by numerical errors. + * + * In both these cases it is *very* dangerous to delete the offending + * edge at the time, since one of the routines further up the stack + * will sometimes be keeping a pointer to that edge. + */ { + GLUface f, fNext; + GLUhalfEdge e; + + /*LINTED*/ + for (f = mesh.fHead.next; f != mesh.fHead; f = fNext) { + fNext = f.next; + e = f.anEdge; + assert (e.Lnext != e); + + if (e.Lnext.Lnext == e) { + /* A face with only two edges */ + AddWinding(e.Onext, e); + if (!Mesh.__gl_meshDelete(e)) return false; + } + } + return true; + } + + public static boolean __gl_computeInterior(GLUtessellatorImpl tess) +/* + * __gl_computeInterior( tess ) computes the planar arrangement specified + * by the given contours, and further subdivides this arrangement + * into regions. Each region is marked "inside" if it belongs + * to the polygon, according to the rule given by tess.windingRule. + * Each interior region is guaranteed be monotone. + */ { + GLUvertex v, vNext; + + tess.fatalError = false; + + /* Each vertex defines an event for our sweep line. Start by inserting + * all the vertices in a priority queue. Events are processed in + * lexicographic order, ie. + * + * e1 < e2 iff e1.x < e2.x || (e1.x == e2.x && e1.y < e2.y) + */ + RemoveDegenerateEdges(tess); + if (!InitPriorityQ(tess)) return false; /* if error */ + InitEdgeDict(tess); + + /* __gl_pqSortExtractMin */ + while ((v = (GLUvertex) tess.pq.pqExtractMin()) != null) { + for (; ;) { + vNext = (GLUvertex) tess.pq.pqMinimum(); /* __gl_pqSortMinimum */ + if (vNext == null || !Geom.VertEq(vNext, v)) break; + + /* Merge together all vertices at exactly the same location. + * This is more efficient than processing them one at a time, + * simplifies the code (see ConnectLeftDegenerate), and is also + * important for correct handling of certain degenerate cases. + * For example, suppose there are two identical edges A and B + * that belong to different contours (so without this code they would + * be processed by separate sweep events). Suppose another edge C + * crosses A and B from above. When A is processed, we split it + * at its intersection point with C. However this also splits C, + * so when we insert B we may compute a slightly different + * intersection point. This might leave two edges with a small + * gap between them. This kind of error is especially obvious + * when using boundary extraction (GLU_TESS_BOUNDARY_ONLY). + */ + vNext = (GLUvertex) tess.pq.pqExtractMin(); /* __gl_pqSortExtractMin*/ + SpliceMergeVertices(tess, v.anEdge, vNext.anEdge); + } + SweepEvent(tess, v); + } + + /* Set tess.event for debugging purposes */ + /* __GL_DICTLISTKEY */ /* __GL_DICTLISTMIN */ + tess.event = ((ActiveRegion) Dict.dictKey(Dict.dictMin(tess.dict))).eUp.Org; + DebugEvent(tess); + DoneEdgeDict(tess); + DonePriorityQ(tess); + + if (!RemoveDegenerateFaces(tess.mesh)) return false; + Mesh.__gl_meshCheckMesh(tess.mesh); + + return true; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/TessMono.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/TessMono.java new file mode 100644 index 000000000..10890e661 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/TessMono.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class TessMono { +/* __gl_meshTessellateMonoRegion( face ) tessellates a monotone region + * (what else would it do??) The region must consist of a single + * loop of half-edges (see mesh.h) oriented CCW. "Monotone" in this + * case means that any vertical line intersects the interior of the + * region in a single interval. + * + * Tessellation consists of adding interior edges (actually pairs of + * half-edges), to split the region into non-overlapping triangles. + * + * The basic idea is explained in Preparata and Shamos (which I don''t + * have handy right now), although their implementation is more + * complicated than this one. The are two edge chains, an upper chain + * and a lower chain. We process all vertices from both chains in order, + * from right to left. + * + * The algorithm ensures that the following invariant holds after each + * vertex is processed: the untessellated region consists of two + * chains, where one chain (say the upper) is a single edge, and + * the other chain is concave. The left vertex of the single edge + * is always to the left of all vertices in the concave chain. + * + * Each step consists of adding the rightmost unprocessed vertex to one + * of the two chains, and forming a fan of triangles from the rightmost + * of two chain endpoints. Determining whether we can add each triangle + * to the fan is a simple orientation test. By making the fan as large + * as possible, we restore the invariant (check it yourself). + */ + static boolean __gl_meshTessellateMonoRegion(GLUface face) { + GLUhalfEdge up, lo; + + /* All edges are oriented CCW around the boundary of the region. + * First, find the half-edge whose origin vertex is rightmost. + * Since the sweep goes from left to right, face->anEdge should + * be close to the edge we want. + */ + up = face.anEdge; + assert (up.Lnext != up && up.Lnext.Lnext != up); + + for (; Geom.VertLeq(up.Sym.Org, up.Org); up = up.Onext.Sym) + ; + for (; Geom.VertLeq(up.Org, up.Sym.Org); up = up.Lnext) + ; + lo = up.Onext.Sym; + + while (up.Lnext != lo) { + if (Geom.VertLeq(up.Sym.Org, lo.Org)) { + /* up.Sym.Org is on the left. It is safe to form triangles from lo.Org. + * The EdgeGoesLeft test guarantees progress even when some triangles + * are CW, given that the upper and lower chains are truly monotone. + */ + while (lo.Lnext != up && (Geom.EdgeGoesLeft(lo.Lnext) + || Geom.EdgeSign(lo.Org, lo.Sym.Org, lo.Lnext.Sym.Org) <= 0)) { + GLUhalfEdge tempHalfEdge = Mesh.__gl_meshConnect(lo.Lnext, lo); + if (tempHalfEdge == null) return false; + lo = tempHalfEdge.Sym; + } + lo = lo.Onext.Sym; + } else { + /* lo.Org is on the left. We can make CCW triangles from up.Sym.Org. */ + while (lo.Lnext != up && (Geom.EdgeGoesRight(up.Onext.Sym) + || Geom.EdgeSign(up.Sym.Org, up.Org, up.Onext.Sym.Org) >= 0)) { + GLUhalfEdge tempHalfEdge = Mesh.__gl_meshConnect(up, up.Onext.Sym); + if (tempHalfEdge == null) return false; + up = tempHalfEdge.Sym; + } + up = up.Lnext; + } + } + + /* Now lo.Org == up.Sym.Org == the leftmost vertex. The remaining region + * can be tessellated in a fan from this leftmost vertex. + */ + assert (lo.Lnext != up); + while (lo.Lnext.Lnext != up) { + GLUhalfEdge tempHalfEdge = Mesh.__gl_meshConnect(lo.Lnext, lo); + if (tempHalfEdge == null) return false; + lo = tempHalfEdge.Sym; + } + + return true; + } + + +/* __gl_meshTessellateInterior( mesh ) tessellates each region of + * the mesh which is marked "inside" the polygon. Each such region + * must be monotone. + */ + public static boolean __gl_meshTessellateInterior(GLUmesh mesh) { + GLUface f, next; + + /*LINTED*/ + for (f = mesh.fHead.next; f != mesh.fHead; f = next) { + /* Make sure we don''t try to tessellate the new triangles. */ + next = f.next; + if (f.inside) { + if (!__gl_meshTessellateMonoRegion(f)) return false; + } + } + + return true; + } + + +/* __gl_meshDiscardExterior( mesh ) zaps (ie. sets to NULL) all faces + * which are not marked "inside" the polygon. Since further mesh operations + * on NULL faces are not allowed, the main purpose is to clean up the + * mesh so that exterior loops are not represented in the data structure. + */ + public static void __gl_meshDiscardExterior(GLUmesh mesh) { + GLUface f, next; + + /*LINTED*/ + for (f = mesh.fHead.next; f != mesh.fHead; f = next) { + /* Since f will be destroyed, save its next pointer. */ + next = f.next; + if (!f.inside) { + Mesh.__gl_meshZapFace(f); + } + } + } + +// private static final int MARKED_FOR_DELETION = 0x7fffffff; + +/* __gl_meshSetWindingNumber( mesh, value, keepOnlyBoundary ) resets the + * winding numbers on all edges so that regions marked "inside" the + * polygon have a winding number of "value", and regions outside + * have a winding number of 0. + * + * If keepOnlyBoundary is TRUE, it also deletes all edges which do not + * separate an interior region from an exterior one. + */ + public static boolean __gl_meshSetWindingNumber(GLUmesh mesh, int value, boolean keepOnlyBoundary) { + GLUhalfEdge e, eNext; + + for (e = mesh.eHead.next; e != mesh.eHead; e = eNext) { + eNext = e.next; + if (e.Sym.Lface.inside != e.Lface.inside) { + + /* This is a boundary edge (one side is interior, one is exterior). */ + e.winding = (e.Lface.inside) ? value : -value; + } else { + + /* Both regions are interior, or both are exterior. */ + if (!keepOnlyBoundary) { + e.winding = 0; + } else { + if (!Mesh.__gl_meshDelete(e)) return false; + } + } + } + return true; + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/TessState.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/TessState.java new file mode 100644 index 000000000..1c5c396e5 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/glu/tessellation/TessState.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2002-2008 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. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class TessState { + public static final int T_DORMANT = 0; + public static final int T_IN_POLYGON = 1; + public static final int T_IN_CONTOUR = 2; +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/input/ControllerAdapter.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/input/ControllerAdapter.java new file mode 100644 index 000000000..07a9e5d38 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/input/ControllerAdapter.java @@ -0,0 +1,340 @@ +/* + * Copyright (c) 2002-2008 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.input; + +import org.lwjgl.input.Controller; + +/** + * Adapter for the Controller interface. It can be used as placeholder + * Controller, which doesn't do anything (eg if Controllers.create() fails and + * you don't want to take care of that). + * + * @author Onyx, Aho and all the other aliases... + */ +public class ControllerAdapter implements Controller { + + /** + * Get the name assigned to this controller. + * + * @return The name assigned to this controller + */ + public String getName() { + return "Dummy Controller"; + } + + /** + * Get the index of this controller in the collection + * + * @return The index of this controller in the collection + */ + public int getIndex() { + return 0; //-1 maybe? + } + + /** + * Retrieve the number of buttons available on this controller + * + * @return The number of butotns available on this controller + */ + public int getButtonCount() { + return 0; + } + + /** + * Get the name of the specified button. Be warned, often this is as + * exciting as "Button X" + * + * @param index The index of the button whose name should be retrieved + * @return The name of the button requested + */ + public String getButtonName(int index) { + return "button n/a"; + } + + /** + * Check if a button is currently pressed + * + * @param index The button to check + * @return True if the button is currently pressed + */ + public boolean isButtonPressed(int index) { + return false; + } + + /** + * Poll the controller for new data. This will also update events + */ + public void poll() { + } + + /** + * Get the X-Axis value of the POV on this controller + * + * @return The X-Axis value of the POV on this controller + */ + public float getPovX() { + return 0f; + } + + /** + * Get the Y-Axis value of the POV on this controller + * + * @return The Y-Axis value of the POV on this controller + */ + public float getPovY() { + return 0f; + } + + /** + * Get the dead zone for a specified axis + * + * @param index The index of the axis for which to retrieve the dead zone + * @return The dead zone for the specified axis + */ + public float getDeadZone(int index) { + return 0f; + } + + /** + * Set the dead zone for the specified axis + * + * @param index The index of hte axis for which to set the dead zone + * @param zone The dead zone to use for the specified axis + */ + public void setDeadZone(int index, float zone) { + } + + /** + * Retrieve the number of axes available on this controller. + * + * @return The number of axes available on this controller. + */ + public int getAxisCount() { + return 0; + } + + /** + * Get the name that's given to the specified axis + * + * @param index The index of the axis whose name should be retrieved + * @return The name of the specified axis. + */ + public String getAxisName(int index) { + return "axis n/a"; + } + + /** + * Retrieve the value thats currently available on a specified axis. The + * value will always be between 1.0 and -1.0 and will calibrate as values + * are passed read. It may be useful to get the player to wiggle the + * joystick from side to side to get the calibration right. + * + * @param index The index of axis to be read + * @return The value from the specified axis. + */ + public float getAxisValue(int index) { + return 0f; + } + + /** + * Get the value from the X axis if there is one. If no X axis is defined a + * zero value will be returned. + * + * @return The value from the X axis + */ + public float getXAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the X axis. + * + * @return The dead zone for the X axis + */ + public float getXAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the X axis + * + * @param zone The dead zone to use for the X axis + */ + public void setXAxisDeadZone(float zone) { + } + + /** + * Get the value from the Y axis if there is one. If no Y axis is defined a + * zero value will be returned. + * + * @return The value from the Y axis + */ + public float getYAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the Y axis. + * + * @return The dead zone for the Y axis + */ + public float getYAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the Y axis + * + * @param zone The dead zone to use for the Y axis + */ + public void setYAxisDeadZone(float zone) { + } + + /** + * Get the value from the Z axis if there is one. If no Z axis is defined a + * zero value will be returned. + * + * @return The value from the Z axis + */ + public float getZAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the Z axis. + * + * @return The dead zone for the Z axis + */ + public float getZAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the Z axis + * + * @param zone The dead zone to use for the Z axis + */ + public void setZAxisDeadZone(float zone) { + } + + /** + * Get the value from the RX axis if there is one. If no RX axis is defined + * a zero value will be returned. + * + * @return The value from the RX axis + */ + public float getRXAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the RX axis. + * + * @return The dead zone for the RX axis + */ + public float getRXAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the RX axis + * + * @param zone The dead zone to use for the RX axis + */ + public void setRXAxisDeadZone(float zone) { + } + + /** + * Get the value from the RY axis if there is one. If no RY axis is defined + * a zero value will be returned. + * + * @return The value from the RY axis + */ + public float getRYAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the RY axis. + * + * @return The dead zone for the RY axis + */ + public float getRYAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the RY axis + * + * @param zone The dead zone to use for the RY axis + */ + public void setRYAxisDeadZone(float zone) { + } + + /** + * Get the value from the RZ axis if there is one. If no RZ axis is defined + * a zero value will be returned. + * + * @return The value from the RZ axis + */ + public float getRZAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the RZ axis. + * + * @return The dead zone for the RZ axis + */ + public float getRZAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the RZ axis + * + * @param zone The dead zone to use for the RZ axis + */ + public void setRZAxisDeadZone(float zone) { + } + + public int getRumblerCount() { + return 0; + } + + public String getRumblerName(int index) { + return "rumber n/a"; + } + + public void setRumblerStrength(int index, float strength) { + } +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/KeyMap.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/KeyMap.java new file mode 100644 index 000000000..b589c1290 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/KeyMap.java @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2002-2008 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.jinput; + +import net.java.games.input.Component; + +import org.lwjgl.input.Keyboard; + +/** + * @author elias + */ +final class KeyMap { + public static Component.Identifier.Key map(int lwjgl_key_code) { + switch (lwjgl_key_code) { + case Keyboard.KEY_ESCAPE: + return Component.Identifier.Key.ESCAPE; + case Keyboard.KEY_1: + return Component.Identifier.Key._1; + case Keyboard.KEY_2: + return Component.Identifier.Key._2; + case Keyboard.KEY_3: + return Component.Identifier.Key._3; + case Keyboard.KEY_4: + return Component.Identifier.Key._4; + case Keyboard.KEY_5: + return Component.Identifier.Key._5; + case Keyboard.KEY_6: + return Component.Identifier.Key._6; + case Keyboard.KEY_7: + return Component.Identifier.Key._7; + case Keyboard.KEY_8: + return Component.Identifier.Key._8; + case Keyboard.KEY_9: + return Component.Identifier.Key._9; + case Keyboard.KEY_0: + return Component.Identifier.Key._0; + case Keyboard.KEY_MINUS: + return Component.Identifier.Key.MINUS; + case Keyboard.KEY_EQUALS: + return Component.Identifier.Key.EQUALS; + case Keyboard.KEY_BACK: + return Component.Identifier.Key.BACK; + case Keyboard.KEY_TAB: + return Component.Identifier.Key.TAB; + case Keyboard.KEY_Q: + return Component.Identifier.Key.Q; + case Keyboard.KEY_W: + return Component.Identifier.Key.W; + case Keyboard.KEY_E: + return Component.Identifier.Key.E; + case Keyboard.KEY_R: + return Component.Identifier.Key.R; + case Keyboard.KEY_T: + return Component.Identifier.Key.T; + case Keyboard.KEY_Y: + return Component.Identifier.Key.Y; + case Keyboard.KEY_U: + return Component.Identifier.Key.U; + case Keyboard.KEY_I: + return Component.Identifier.Key.I; + case Keyboard.KEY_O: + return Component.Identifier.Key.O; + case Keyboard.KEY_P: + return Component.Identifier.Key.P; + case Keyboard.KEY_LBRACKET: + return Component.Identifier.Key.LBRACKET; + case Keyboard.KEY_RBRACKET: + return Component.Identifier.Key.RBRACKET; + case Keyboard.KEY_RETURN: + return Component.Identifier.Key.RETURN; + case Keyboard.KEY_LCONTROL: + return Component.Identifier.Key.LCONTROL; + case Keyboard.KEY_A: + return Component.Identifier.Key.A; + case Keyboard.KEY_S: + return Component.Identifier.Key.S; + case Keyboard.KEY_D: + return Component.Identifier.Key.D; + case Keyboard.KEY_F: + return Component.Identifier.Key.F; + case Keyboard.KEY_G: + return Component.Identifier.Key.G; + case Keyboard.KEY_H: + return Component.Identifier.Key.H; + case Keyboard.KEY_J: + return Component.Identifier.Key.J; + case Keyboard.KEY_K: + return Component.Identifier.Key.K; + case Keyboard.KEY_L: + return Component.Identifier.Key.L; + case Keyboard.KEY_SEMICOLON: + return Component.Identifier.Key.SEMICOLON; + case Keyboard.KEY_APOSTROPHE: + return Component.Identifier.Key.APOSTROPHE; + case Keyboard.KEY_GRAVE: + return Component.Identifier.Key.GRAVE; + case Keyboard.KEY_LSHIFT: + return Component.Identifier.Key.LSHIFT; + case Keyboard.KEY_BACKSLASH: + return Component.Identifier.Key.BACKSLASH; + case Keyboard.KEY_Z: + return Component.Identifier.Key.Z; + case Keyboard.KEY_X: + return Component.Identifier.Key.X; + case Keyboard.KEY_C: + return Component.Identifier.Key.C; + case Keyboard.KEY_V: + return Component.Identifier.Key.V; + case Keyboard.KEY_B: + return Component.Identifier.Key.B; + case Keyboard.KEY_N: + return Component.Identifier.Key.N; + case Keyboard.KEY_M: + return Component.Identifier.Key.M; + case Keyboard.KEY_COMMA: + return Component.Identifier.Key.COMMA; + case Keyboard.KEY_PERIOD: + return Component.Identifier.Key.PERIOD; + case Keyboard.KEY_SLASH: + return Component.Identifier.Key.SLASH; + case Keyboard.KEY_RSHIFT: + return Component.Identifier.Key.RSHIFT; + case Keyboard.KEY_MULTIPLY: + return Component.Identifier.Key.MULTIPLY; + case Keyboard.KEY_LMENU: + return Component.Identifier.Key.LALT; + case Keyboard.KEY_SPACE: + return Component.Identifier.Key.SPACE; + case Keyboard.KEY_CAPITAL: + return Component.Identifier.Key.CAPITAL; + case Keyboard.KEY_F1: + return Component.Identifier.Key.F1; + case Keyboard.KEY_F2: + return Component.Identifier.Key.F2; + case Keyboard.KEY_F3: + return Component.Identifier.Key.F3; + case Keyboard.KEY_F4: + return Component.Identifier.Key.F4; + case Keyboard.KEY_F5: + return Component.Identifier.Key.F5; + case Keyboard.KEY_F6: + return Component.Identifier.Key.F6; + case Keyboard.KEY_F7: + return Component.Identifier.Key.F7; + case Keyboard.KEY_F8: + return Component.Identifier.Key.F8; + case Keyboard.KEY_F9: + return Component.Identifier.Key.F9; + case Keyboard.KEY_F10: + return Component.Identifier.Key.F10; + case Keyboard.KEY_NUMLOCK: + return Component.Identifier.Key.NUMLOCK; + case Keyboard.KEY_SCROLL: + return Component.Identifier.Key.SCROLL; + case Keyboard.KEY_NUMPAD7: + return Component.Identifier.Key.NUMPAD7; + case Keyboard.KEY_NUMPAD8: + return Component.Identifier.Key.NUMPAD8; + case Keyboard.KEY_NUMPAD9: + return Component.Identifier.Key.NUMPAD9; + case Keyboard.KEY_SUBTRACT: + return Component.Identifier.Key.SUBTRACT; + case Keyboard.KEY_NUMPAD4: + return Component.Identifier.Key.NUMPAD4; + case Keyboard.KEY_NUMPAD5: + return Component.Identifier.Key.NUMPAD5; + case Keyboard.KEY_NUMPAD6: + return Component.Identifier.Key.NUMPAD6; + case Keyboard.KEY_ADD: + return Component.Identifier.Key.ADD; + case Keyboard.KEY_NUMPAD1: + return Component.Identifier.Key.NUMPAD1; + case Keyboard.KEY_NUMPAD2: + return Component.Identifier.Key.NUMPAD2; + case Keyboard.KEY_NUMPAD3: + return Component.Identifier.Key.NUMPAD3; + case Keyboard.KEY_NUMPAD0: + return Component.Identifier.Key.NUMPAD0; + case Keyboard.KEY_DECIMAL: + return Component.Identifier.Key.DECIMAL; + case Keyboard.KEY_F11: + return Component.Identifier.Key.F11; + case Keyboard.KEY_F12: + return Component.Identifier.Key.F12; + case Keyboard.KEY_F13: + return Component.Identifier.Key.F13; + case Keyboard.KEY_F14: + return Component.Identifier.Key.F14; + case Keyboard.KEY_F15: + return Component.Identifier.Key.F15; + case Keyboard.KEY_KANA: + return Component.Identifier.Key.KANA; + case Keyboard.KEY_CONVERT: + return Component.Identifier.Key.CONVERT; + case Keyboard.KEY_NOCONVERT: + return Component.Identifier.Key.NOCONVERT; + case Keyboard.KEY_YEN: + return Component.Identifier.Key.YEN; + case Keyboard.KEY_NUMPADEQUALS: + return Component.Identifier.Key.NUMPADEQUAL; + case Keyboard.KEY_CIRCUMFLEX: + return Component.Identifier.Key.CIRCUMFLEX; + case Keyboard.KEY_AT: + return Component.Identifier.Key.AT; + case Keyboard.KEY_COLON: + return Component.Identifier.Key.COLON; + case Keyboard.KEY_UNDERLINE: + return Component.Identifier.Key.UNDERLINE; + case Keyboard.KEY_KANJI: + return Component.Identifier.Key.KANJI; + case Keyboard.KEY_STOP: + return Component.Identifier.Key.STOP; + case Keyboard.KEY_AX: + return Component.Identifier.Key.AX; + case Keyboard.KEY_UNLABELED: + return Component.Identifier.Key.UNLABELED; + case Keyboard.KEY_NUMPADENTER: + return Component.Identifier.Key.NUMPADENTER; + case Keyboard.KEY_RCONTROL: + return Component.Identifier.Key.RCONTROL; + case Keyboard.KEY_NUMPADCOMMA: + return Component.Identifier.Key.NUMPADCOMMA; + case Keyboard.KEY_DIVIDE: + return Component.Identifier.Key.DIVIDE; + case Keyboard.KEY_SYSRQ: + return Component.Identifier.Key.SYSRQ; + case Keyboard.KEY_RMENU: + return Component.Identifier.Key.RALT; + case Keyboard.KEY_PAUSE: + return Component.Identifier.Key.PAUSE; + case Keyboard.KEY_HOME: + return Component.Identifier.Key.HOME; + case Keyboard.KEY_UP: + return Component.Identifier.Key.UP; + case Keyboard.KEY_PRIOR: + return Component.Identifier.Key.PAGEUP; + case Keyboard.KEY_LEFT: + return Component.Identifier.Key.LEFT; + case Keyboard.KEY_RIGHT: + return Component.Identifier.Key.RIGHT; + case Keyboard.KEY_END: + return Component.Identifier.Key.END; + case Keyboard.KEY_DOWN: + return Component.Identifier.Key.DOWN; + case Keyboard.KEY_NEXT: + return Component.Identifier.Key.PAGEDOWN; + case Keyboard.KEY_INSERT: + return Component.Identifier.Key.INSERT; + case Keyboard.KEY_DELETE: + return Component.Identifier.Key.DELETE; + case Keyboard.KEY_LMETA: + return Component.Identifier.Key.LWIN; + case Keyboard.KEY_RMETA: + return Component.Identifier.Key.RWIN; + case Keyboard.KEY_APPS: + return Component.Identifier.Key.APPS; + case Keyboard.KEY_POWER: + return Component.Identifier.Key.POWER; + case Keyboard.KEY_SLEEP: + return Component.Identifier.Key.SLEEP; + default: + return Component.Identifier.Key.UNKNOWN; + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLEnvironmentPlugin.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLEnvironmentPlugin.java new file mode 100644 index 000000000..c84c85486 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLEnvironmentPlugin.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2008 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.jinput; + +import net.java.games.input.Controller; +import net.java.games.input.ControllerEnvironment; +import net.java.games.util.plugins.Plugin; + +/** + * @author elias + */ +public class LWJGLEnvironmentPlugin extends ControllerEnvironment implements Plugin { + private final Controller[] controllers; + + public LWJGLEnvironmentPlugin() { + this.controllers = new Controller[]{new LWJGLKeyboard(), new LWJGLMouse()}; + } + + public Controller[] getControllers() { + return controllers; + } + + public boolean isSupported() { + return true; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLKeyboard.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLKeyboard.java new file mode 100644 index 000000000..1361892db --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLKeyboard.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2002-2008 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.jinput; + +import net.java.games.input.AbstractComponent; +import net.java.games.input.Component; +import net.java.games.input.Controller; +import net.java.games.input.Event; +import net.java.games.input.Keyboard; +import net.java.games.input.Rumbler; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; + +/** + * @author elias + */ +final class LWJGLKeyboard extends Keyboard { + LWJGLKeyboard() { + super("LWJGLKeyboard", createComponents(), new Controller[]{}, new Rumbler[]{}); + } + + private static Component[] createComponents() { + List components = new ArrayList(); + Field[] vkey_fields = org.lwjgl.input.Keyboard.class.getFields(); + for ( Field vkey_field : vkey_fields ) { + try { + if (Modifier.isStatic(vkey_field.getModifiers()) && vkey_field.getType() == int.class && + vkey_field.getName().startsWith("KEY_")) { + int vkey_code = vkey_field.getInt(null); + Component.Identifier.Key key_id = KeyMap.map(vkey_code); + if (key_id != Component.Identifier.Key.UNKNOWN) + components.add(new Key(key_id, vkey_code)); + } + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + return components.toArray(new Component[components.size()]); + } + + public synchronized void pollDevice() throws IOException { + if (!org.lwjgl.input.Keyboard.isCreated()) + return; + org.lwjgl.input.Keyboard.poll(); + for ( Component component : getComponents() ) { + Key key = (Key)component; + key.update(); + } + } + + protected synchronized boolean getNextDeviceEvent(Event event) throws IOException { + if (!org.lwjgl.input.Keyboard.isCreated()) + return false; + if (!org.lwjgl.input.Keyboard.next()) + return false; + int lwjgl_key = org.lwjgl.input.Keyboard.getEventKey(); + if (lwjgl_key == org.lwjgl.input.Keyboard.KEY_NONE) + return false; + Component.Identifier.Key key_id = KeyMap.map(lwjgl_key); + if (key_id == null) + return false; + Component key = getComponent(key_id); + if (key == null) + return false; + float value = org.lwjgl.input.Keyboard.getEventKeyState() ? 1 : 0; + event.set(key, value, org.lwjgl.input.Keyboard.getEventNanoseconds()); + return true; + } + + + private static final class Key extends AbstractComponent { + private final int lwjgl_key; + private float value; + + Key(Component.Identifier.Key key_id, int lwjgl_key) { + super(key_id.getName(), key_id); + this.lwjgl_key = lwjgl_key; + } + + public void update() { + this.value = org.lwjgl.input.Keyboard.isKeyDown(lwjgl_key) ? 1 : 0; + } + + protected float poll() { + return value; + } + + public boolean isRelative() { + return false; + } + + public boolean isAnalog() { + return false; + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLMouse.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLMouse.java new file mode 100644 index 000000000..02f01b2a0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/jinput/LWJGLMouse.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2002-2008 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.jinput; + +import net.java.games.input.AbstractComponent; +import net.java.games.input.Component; +import net.java.games.input.Controller; +import net.java.games.input.Event; +import net.java.games.input.Mouse; +import net.java.games.input.Rumbler; + +import java.io.IOException; + +/** + * @author elias + */ +final class LWJGLMouse extends Mouse { + private static final int EVENT_X = 1; + private static final int EVENT_Y = 2; + private static final int EVENT_WHEEL = 3; + private static final int EVENT_BUTTON = 4; + private static final int EVENT_DONE = 5; + + private int event_state = EVENT_DONE; + + LWJGLMouse() { + super("LWJGLMouse", createComponents(), new Controller[]{}, new Rumbler[]{}); + } + + private static Component[] createComponents() { + return new Component[]{new Axis(Component.Identifier.Axis.X), + new Axis(Component.Identifier.Axis.Y), + new Axis(Component.Identifier.Axis.Z), + new Button(Component.Identifier.Button.LEFT), + new Button(Component.Identifier.Button.MIDDLE), + new Button(Component.Identifier.Button.RIGHT)}; + } + + public synchronized void pollDevice() throws IOException { + if (!org.lwjgl.input.Mouse.isCreated()) + return; + org.lwjgl.input.Mouse.poll(); + for (int i = 0; i < 3; i++) + setButtonState(i); + } + + private Button map(int lwjgl_button) { + switch (lwjgl_button) { + case 0: + return (Button)getLeft(); + case 1: + return (Button)getRight(); + case 2: + return (Button)getMiddle(); + default: + return null; + } + } + + private void setButtonState(int lwjgl_button) { + Button button = map(lwjgl_button); + if (button != null) + button.setValue(org.lwjgl.input.Mouse.isButtonDown(lwjgl_button) ? 1 : 0); + } + + protected synchronized boolean getNextDeviceEvent(Event event) throws IOException { + if (!org.lwjgl.input.Mouse.isCreated()) + return false; + while (true) { + long nanos = org.lwjgl.input.Mouse.getEventNanoseconds(); + switch (event_state) { + case EVENT_X: + event_state = EVENT_Y; + int dx = org.lwjgl.input.Mouse.getEventDX(); + if (dx != 0) { + event.set(getX(), dx, nanos); + return true; + } + break; + case EVENT_Y: + event_state = EVENT_WHEEL; + /* We must negate the y coord since lwjgl uses the + * OpenGL coordinate system + */ + int dy = -org.lwjgl.input.Mouse.getEventDY(); + if (dy != 0) { + event.set(getY(), dy, nanos); + return true; + } + break; + case EVENT_WHEEL: + event_state = EVENT_BUTTON; + int dwheel = org.lwjgl.input.Mouse.getEventDWheel(); + if (dwheel != 0) { + event.set(getWheel(), dwheel, nanos); + return true; + } + break; + case EVENT_BUTTON: + event_state = EVENT_DONE; + int lwjgl_button = org.lwjgl.input.Mouse.getEventButton(); + if (lwjgl_button != -1) { + Button button = map(lwjgl_button); + if (button != null) { + event.set(button, org.lwjgl.input.Mouse.getEventButtonState() ? 1f : 0f, nanos); + return true; + } + } + break; + case EVENT_DONE: + if (!org.lwjgl.input.Mouse.next()) + return false; + event_state = EVENT_X; + break; + default: + break; + } + } + } + + static final class Axis extends AbstractComponent { + Axis(Component.Identifier.Axis axis_id) { + super(axis_id.getName(), axis_id); + } + + public boolean isRelative() { + return true; + } + + protected float poll() throws IOException { + return 0; + } + + public boolean isAnalog() { + return true; + } + } + + static final class Button extends AbstractComponent { + private float value; + + Button(Component.Identifier.Button button_id) { + super(button_id.getName(), button_id); + } + + void setValue(float value) { + this.value = value; + } + + protected float poll() throws IOException { + return value; + } + + public boolean isRelative() { + return false; + } + + public boolean isAnalog() { + return false; + } + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheLinePad.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheLinePad.java new file mode 100644 index 000000000..bda9dc161 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheLinePad.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * When this annotation is used on a field, automatic cache-line-sized padding + * will be inserted around the field. This is useful in multi-threaded algorithms + * to avoid cache line false sharing. The annotation defaults to padding after + * the field, but can be changed to before or both before and after. It can be + * applied to both mapped object fields and POJO primitive fields. + * + * @author Spasi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface CacheLinePad { + + /** + * When true, cache-line padding will be inserted before the field. + * + * @return true if cache-line padding will be inserted before the field + */ + boolean before() default false; + + /** + * When true, cache-line padding will be inserted after the field. + * + * @return true if cache-line padding will be inserted after the field + */ + boolean after() default true; + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheLineSize.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheLineSize.java new file mode 100644 index 000000000..38f541677 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheLineSize.java @@ -0,0 +1,142 @@ +package org.lwjgl.util.mapped; + +import static org.lwjgl.util.mapped.MappedHelper.ivget; +import static org.lwjgl.util.mapped.MappedHelper.ivput; + +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * This micro-benchmark tries to detect the CPU's cache line size. This is + * done by exploiting cache line false sharing in multi-threaded code: + * When 2 threads simultaneously access the same cache line (and at least + * 1 access is a write), performance drops considerably. We detect this + * performance drop while decreasing the memory padding in every test step. + * + * @author Spasi + */ +final class CacheLineSize { + + private CacheLineSize() { + } + + static int getCacheLineSize() { + final int THREADS = 2; + final int REPEATS = 100000 * THREADS; + final int LOCAL_REPEATS = REPEATS / THREADS; + + // Detection will start from CacheLineMaxSize bytes. + final int MAX_SIZE = LWJGLUtil.getPrivilegedInteger("org.lwjgl.util.mapped.CacheLineMaxSize", 1024) / 4; // in # of integers + // Detection will stop when the execution time increases by more than CacheLineTimeThreshold %. + final double TIME_THRESHOLD = 1.0 + LWJGLUtil.getPrivilegedInteger("org.lwjgl.util.mapped.CacheLineTimeThreshold", 50) / 100.0; + + final ExecutorService executorService = Executors.newFixedThreadPool(THREADS); + final ExecutorCompletionService completionService = new ExecutorCompletionService(executorService); + + try { + // We need to use a NIO buffer in order to guarantee memory alignment. + final IntBuffer memory = getMemory(MAX_SIZE); + + // -- WARMUP -- + + final int WARMUP = 10; + for ( int i = 0; i < WARMUP; i++ ) + doTest(THREADS, LOCAL_REPEATS, 0, memory, completionService); + + // -- CACHE LINE SIZE DETECTION -- + + long totalTime = 0; + int count = 0; + int cacheLineSize = 64; // fallback to the most common size these days + boolean found = false; + for ( int i = MAX_SIZE; i >= 1; i >>= 1 ) { + final long time = doTest(THREADS, LOCAL_REPEATS, i, memory, completionService); + if ( totalTime > 0 ) { // Ignore first run + final long avgTime = totalTime / count; + if ( (double)time / (double)avgTime > TIME_THRESHOLD ) { // Try to detect a noticeable jump in execution time + cacheLineSize = (i << 1) * 4; + found = true; + break; + } + } + totalTime += time; + count++; + } + + if ( LWJGLUtil.DEBUG ) { + if ( found ) + LWJGLUtil.log("Cache line size detected: " + cacheLineSize + " bytes"); + else + LWJGLUtil.log("Failed to detect cache line size, assuming " + cacheLineSize + " bytes"); + } + + return cacheLineSize; + } finally { + executorService.shutdown(); + } + } + + public static void main(String[] args) { + CacheUtil.getCacheLineSize(); + } + + static long memoryLoop(final int index, final int repeats, final IntBuffer memory, final int padding) { + final long address = MemoryUtil.getAddress(memory) + (index * padding * 4); + + final long time = System.nanoTime(); + for ( int i = 0; i < repeats; i++ ) { + // Use volatile access to avoid server VM optimizations. + ivput(ivget(address) + 1, address); + } + + return System.nanoTime() - time; + } + + private static IntBuffer getMemory(final int START_SIZE) { + final int PAGE_SIZE = MappedObjectUnsafe.INSTANCE.pageSize(); + + final ByteBuffer buffer = ByteBuffer.allocateDirect((START_SIZE * 4) + PAGE_SIZE).order(ByteOrder.nativeOrder()); + + // Align to page and, consequently, to cache line. Otherwise results will be inconsistent. + if ( MemoryUtil.getAddress(buffer) % PAGE_SIZE != 0 ) { + // Round up to page boundary + buffer.position(PAGE_SIZE - (int)(MemoryUtil.getAddress(buffer) & (PAGE_SIZE - 1))); + } + + return buffer.asIntBuffer(); + } + + private static long doTest(final int threads, final int repeats, final int padding, final IntBuffer memory, final ExecutorCompletionService completionService) { + for ( int i = 0; i < threads; i++ ) + submitTest(completionService, i, repeats, memory, padding); + return waitForResults(threads, completionService); + } + + private static void submitTest(final ExecutorCompletionService completionService, final int index, final int repeats, final IntBuffer memory, final int padding) { + completionService.submit(new Callable() { + public Long call() throws Exception { + return memoryLoop(index, repeats, memory, padding); + } + }); + } + + private static long waitForResults(final int count, final ExecutorCompletionService completionService) { + try { + long totalTime = 0; + for ( int i = 0; i < count; i++ ) + totalTime += completionService.take().get(); + return totalTime; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheUtil.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheUtil.java new file mode 100644 index 000000000..3c87440b7 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/CacheUtil.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; +import org.lwjgl.PointerBuffer; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.CharBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; +import java.nio.ShortBuffer; + +/** + * This class provides utility methods for allocating cache-line-aligned + * NIO buffers. The CPU cache line size is detected using a micro-benchmark + * that exploits the performation degredation that occurs when different + * threads write to different locations of the same cache line. The detection + * should be reasonably robust on both the server and client VM, but there + * are a few system properties that can be used to tune it. + * + * @author Spasi + */ +public final class CacheUtil { + + private static final int CACHE_LINE_SIZE; + + static { + final Integer size = LWJGLUtil.getPrivilegedInteger("org.lwjgl.util.mapped.CacheLineSize"); // forces a specific cache line size + + if ( size != null ) { + if ( size < 1 ) + throw new IllegalStateException("Invalid CacheLineSize specified: " + size); + CACHE_LINE_SIZE = size; + } else if ( Runtime.getRuntime().availableProcessors() == 1 ) { // We cannot use false sharing to detect it + /* + Spasi: + + I have implemented a single-threaded benchmark for this, but it requires + lots of memory allocations and could not tune it for both the client and + server VM. It's not a big deal anyway, 64 bytes should be ok for any + single-core CPU. + */ + if ( LWJGLUtil.DEBUG ) + LWJGLUtil.log("Cannot detect cache line size on single-core CPUs, assuming 64 bytes."); + CACHE_LINE_SIZE = 64; + } else + CACHE_LINE_SIZE = CacheLineSize.getCacheLineSize(); + } + + private CacheUtil() { + } + + /** + * Returns the CPU cache line size, in number of bytes. + * + * @return the cache line size + */ + public static int getCacheLineSize() { + return CACHE_LINE_SIZE; + } + + /** + * Construct a direct, native-ordered and cache-line-aligned bytebuffer with the specified size. + * + * @param size The size, in bytes + * + * @return a ByteBuffer + */ + public static ByteBuffer createByteBuffer(int size) { + ByteBuffer buffer = ByteBuffer.allocateDirect(size + CACHE_LINE_SIZE); + + // Align to cache line. + if ( MemoryUtil.getAddress(buffer) % CACHE_LINE_SIZE != 0 ) { + // Round up to cache line boundary + buffer.position(CACHE_LINE_SIZE - (int)(MemoryUtil.getAddress(buffer) & (CACHE_LINE_SIZE - 1))); + } + + buffer.limit(buffer.position() + size); + return buffer.slice().order(ByteOrder.nativeOrder()); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned shortbuffer with the specified number + * of elements. + * + * @param size The size, in shorts + * + * @return a ShortBuffer + */ + public static ShortBuffer createShortBuffer(int size) { + return createByteBuffer(size << 1).asShortBuffer(); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned charbuffer with the specified number + * of elements. + * + * @param size The size, in chars + * + * @return an CharBuffer + */ + public static CharBuffer createCharBuffer(int size) { + return createByteBuffer(size << 1).asCharBuffer(); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned intbuffer with the specified number + * of elements. + * + * @param size The size, in ints + * + * @return an IntBuffer + */ + public static IntBuffer createIntBuffer(int size) { + return createByteBuffer(size << 2).asIntBuffer(); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned longbuffer with the specified number + * of elements. + * + * @param size The size, in longs + * + * @return an LongBuffer + */ + public static LongBuffer createLongBuffer(int size) { + return createByteBuffer(size << 3).asLongBuffer(); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned floatbuffer with the specified number + * of elements. + * + * @param size The size, in floats + * + * @return a FloatBuffer + */ + public static FloatBuffer createFloatBuffer(int size) { + return createByteBuffer(size << 2).asFloatBuffer(); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned doublebuffer with the specified number + * of elements. + * + * @param size The size, in floats + * + * @return a FloatBuffer + */ + public static DoubleBuffer createDoubleBuffer(int size) { + return createByteBuffer(size << 3).asDoubleBuffer(); + } + + /** + * Construct a cache-line-aligned PointerBuffer with the specified number + * of elements. + * + * @param size The size, in memory addresses + * + * @return a PointerBuffer + */ + public static PointerBuffer createPointerBuffer(int size) { + return new PointerBuffer(createByteBuffer(size * PointerBuffer.getPointerSize())); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedField.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedField.java new file mode 100644 index 000000000..c31f40230 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedField.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation can be used on fields of {@link MappedObject} subclasses, + * to manually specify byte offsets and lengths. This is useful when the + * mapped fields require custom alignment. {@link java.nio.ByteBuffer} + * fields are required to have this annotation with a hardcoded byte length. + * + * @author Riven + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface MappedField { + + /** + * Specifies the field byte offset within the mapped object. + * + * @return the field byte offset + */ + long byteOffset() default -1; + + /** + * Specifies the field byte length. Required for {@link java.nio.ByteBuffer} fields. + * + * @return the field byte length + */ + long byteLength() default -1; + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedForeach.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedForeach.java new file mode 100644 index 000000000..750cf59bb --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedForeach.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +import java.util.Iterator; + +/** + * Iterable implementation for {@link MappedObject}. + * + * @author Riven + */ +final class MappedForeach implements Iterable { + + final T mapped; + final int elementCount; + + MappedForeach(T mapped, int elementCount) { + this.mapped = mapped; + this.elementCount = elementCount; + } + + public Iterator iterator() { + return new Iterator() { + + private int index; + + public boolean hasNext() { + return this.index < (MappedForeach.this.elementCount); + } + + public T next() { + mapped.setViewAddress(mapped.getViewAddress(this.index++)); + return mapped; + } + + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedHelper.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedHelper.java new file mode 100644 index 000000000..b104096c2 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedHelper.java @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +import static org.lwjgl.util.mapped.MappedObjectUnsafe.INSTANCE; + +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; + +import java.nio.ByteBuffer; + +/** + * [INTERNAL USE ONLY] + *

    + * Helper class used by the bytecode transformer. + * + * @author Riven + */ +public class MappedHelper { + + public static void setup(MappedObject mo, ByteBuffer buffer, int align, int sizeof) { + if ( LWJGLUtil.CHECKS && mo.baseAddress != 0L ) + throw new IllegalStateException("this method should not be called by user-code"); + + if ( LWJGLUtil.CHECKS && !buffer.isDirect() ) + throw new IllegalArgumentException("bytebuffer must be direct"); + mo.preventGC = buffer; + + if ( LWJGLUtil.CHECKS && align <= 0 ) + throw new IllegalArgumentException("invalid alignment"); + + if ( LWJGLUtil.CHECKS && (sizeof <= 0 || sizeof % align != 0) ) + throw new IllegalStateException("sizeof not a multiple of alignment"); + + long addr = MemoryUtil.getAddress(buffer); + if ( LWJGLUtil.CHECKS && addr % align != 0 ) + throw new IllegalStateException("buffer address not aligned on " + align + " bytes"); + + mo.baseAddress = mo.viewAddress = addr; + } + + public static void checkAddress(long viewAddress, MappedObject mapped) { + mapped.checkAddress(viewAddress); + } + + public static void put_views(MappedSet2 set, int view) { + set.view(view); + } + + public static void put_views(MappedSet3 set, int view) { + set.view(view); + } + + public static void put_views(MappedSet4 set, int view) { + set.view(view); + } + + public static void put_view(MappedObject mapped, int view, int sizeof) { + mapped.setViewAddress(mapped.baseAddress + view * sizeof); + } + + public static int get_view(MappedObject mapped, int sizeof) { + return (int)(mapped.viewAddress - mapped.baseAddress) / sizeof; + } + + public static void put_view_shift(MappedObject mapped, int view, int sizeof_shift) { + mapped.setViewAddress(mapped.baseAddress + (view << sizeof_shift)); + } + + public static int get_view_shift(MappedObject mapped, int sizeof_shift) { + return ((int)(mapped.viewAddress - mapped.baseAddress)) >> sizeof_shift; + } + + public static void put_view_next(MappedObject mapped, int sizeof) { + mapped.setViewAddress(mapped.viewAddress + sizeof); + } + + public static MappedObject dup(MappedObject src, MappedObject dst) { + dst.baseAddress = src.baseAddress; + dst.viewAddress = src.viewAddress; + dst.preventGC = src.preventGC; + return dst; + } + + public static MappedObject slice(MappedObject src, MappedObject dst) { + dst.baseAddress = src.viewAddress; // ! + dst.viewAddress = src.viewAddress; + dst.preventGC = src.preventGC; + return dst; + } + + public static void copy(MappedObject src, MappedObject dst, int bytes) { + if ( MappedObject.CHECKS ) { + src.checkRange(bytes); + dst.checkRange(bytes); + } + + INSTANCE.copyMemory(src.viewAddress, dst.viewAddress, bytes); + } + + public static ByteBuffer newBuffer(long address, int capacity) { + return MappedObjectUnsafe.newBuffer(address, capacity); + } + + // ---- primitive fields read/write + + // byte + + public static void bput(byte value, long addr) { + INSTANCE.putByte(addr, value); + } + + public static void bput(MappedObject mapped, byte value, int fieldOffset) { + INSTANCE.putByte(mapped.viewAddress + fieldOffset, value); + } + + public static byte bget(long addr) { + return INSTANCE.getByte(addr); + } + + public static byte bget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getByte(mapped.viewAddress + fieldOffset); + } + + public static void bvput(byte value, long addr) { + INSTANCE.putByteVolatile(null, addr, value); + } + + public static void bvput(MappedObject mapped, byte value, int fieldOffset) { + INSTANCE.putByteVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static byte bvget(long addr) { + return INSTANCE.getByteVolatile(null, addr); + } + + public static byte bvget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getByteVolatile(null, mapped.viewAddress + fieldOffset); + } + + // short + + public static void sput(short value, long addr) { + INSTANCE.putShort(addr, value); + } + + public static void sput(MappedObject mapped, short value, int fieldOffset) { + INSTANCE.putShort(mapped.viewAddress + fieldOffset, value); + } + + public static short sget(long addr) { + return INSTANCE.getShort(addr); + } + + public static short sget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getShort(mapped.viewAddress + fieldOffset); + } + + public static void svput(short value, long addr) { + INSTANCE.putShortVolatile(null, addr, value); + } + + public static void svput(MappedObject mapped, short value, int fieldOffset) { + INSTANCE.putShortVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static short svget(long addr) { + return INSTANCE.getShortVolatile(null, addr); + } + + public static short svget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getShortVolatile(null, mapped.viewAddress + fieldOffset); + } + + // char + + public static void cput(char value, long addr) { + INSTANCE.putChar(addr, value); + } + + public static void cput(MappedObject mapped, char value, int fieldOffset) { + INSTANCE.putChar(mapped.viewAddress + fieldOffset, value); + } + + public static char cget(long addr) { + return INSTANCE.getChar(addr); + } + + public static char cget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getChar(mapped.viewAddress + fieldOffset); + } + + public static void cvput(char value, long addr) { + INSTANCE.putCharVolatile(null, addr, value); + } + + public static void cvput(MappedObject mapped, char value, int fieldOffset) { + INSTANCE.putCharVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static char cvget(long addr) { + return INSTANCE.getCharVolatile(null, addr); + } + + public static char cvget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getCharVolatile(null, mapped.viewAddress + fieldOffset); + } + + // int + + public static void iput(int value, long addr) { + INSTANCE.putInt(addr, value); + } + + public static void iput(MappedObject mapped, int value, int fieldOffset) { + INSTANCE.putInt(mapped.viewAddress + fieldOffset, value); + } + + public static int iget(long address) { + return INSTANCE.getInt(address); + } + + public static int iget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getInt(mapped.viewAddress + fieldOffset); + } + + public static void ivput(int value, long addr) { + INSTANCE.putIntVolatile(null, addr, value); + } + + public static void ivput(MappedObject mapped, int value, int fieldOffset) { + INSTANCE.putIntVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static int ivget(long address) { + return INSTANCE.getIntVolatile(null, address); + } + + public static int ivget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getIntVolatile(null, mapped.viewAddress + fieldOffset); + } + + // float + + public static void fput(float value, long addr) { + INSTANCE.putFloat(addr, value); + } + + public static void fput(MappedObject mapped, float value, int fieldOffset) { + INSTANCE.putFloat(mapped.viewAddress + fieldOffset, value); + } + + public static float fget(long addr) { + return INSTANCE.getFloat(addr); + } + + public static float fget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getFloat(mapped.viewAddress + fieldOffset); + } + + public static void fvput(float value, long addr) { + INSTANCE.putFloatVolatile(null, addr, value); + } + + public static void fvput(MappedObject mapped, float value, int fieldOffset) { + INSTANCE.putFloatVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static float fvget(long addr) { + return INSTANCE.getFloatVolatile(null, addr); + } + + public static float fvget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getFloatVolatile(null, mapped.viewAddress + fieldOffset); + } + + // long + + public static void jput(long value, long addr) { + INSTANCE.putLong(addr, value); + } + + public static void jput(MappedObject mapped, long value, int fieldOffset) { + INSTANCE.putLong(mapped.viewAddress + fieldOffset, value); + } + + public static long jget(long addr) { + return INSTANCE.getLong(addr); + } + + public static long jget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getLong(mapped.viewAddress + fieldOffset); + } + + public static void jvput(long value, long addr) { + INSTANCE.putLongVolatile(null, addr, value); + } + + public static void jvput(MappedObject mapped, long value, int fieldOffset) { + INSTANCE.putLongVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static long jvget(long addr) { + return INSTANCE.getLongVolatile(null, addr); + } + + public static long jvget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getLongVolatile(null, mapped.viewAddress + fieldOffset); + } + + // address + + public static void aput(long value, long addr) { + INSTANCE.putAddress(addr, value); + } + + public static void aput(MappedObject mapped, long value, int fieldOffset) { + INSTANCE.putAddress(mapped.viewAddress + fieldOffset, value); + } + + public static long aget(long addr) { + return INSTANCE.getAddress(addr); + } + + public static long aget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getAddress(mapped.viewAddress + fieldOffset); + } + + // double + + public static void dput(double value, long addr) { + INSTANCE.putDouble(addr, value); + } + + public static void dput(MappedObject mapped, double value, int fieldOffset) { + INSTANCE.putDouble(mapped.viewAddress + fieldOffset, value); + } + + public static double dget(long addr) { + return INSTANCE.getDouble(addr); + } + + public static double dget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getDouble(mapped.viewAddress + fieldOffset); + } + + public static void dvput(double value, long addr) { + INSTANCE.putDoubleVolatile(null, addr, value); + } + + public static void dvput(MappedObject mapped, double value, int fieldOffset) { + INSTANCE.putDoubleVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static double dvget(long addr) { + return INSTANCE.getDoubleVolatile(null, addr); + } + + public static double dvget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getDoubleVolatile(null, mapped.viewAddress + fieldOffset); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObject.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObject.java new file mode 100644 index 000000000..bbeba4443 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObject.java @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; + +import java.nio.BufferOverflowException; +import java.nio.ByteBuffer; + +/** + * Base superclass of all mapped objects. Classes that require + * data mapping should extend this class and registered with + * {@link MappedObjectTransformer#register(Class)}. + *

    + * Subclasses may only specify the default constructor. Any code + * inside that constructor is optional, but will not run when the + * view is instantiated, see {@link #runViewConstructor()}. + *

    + * Bounds checking may be enabled through a JVM system property: org.lwjgl.util.mapped.Checks=true + * + * @author Riven + */ +public abstract class MappedObject { + + static final boolean CHECKS = LWJGLUtil.getPrivilegedBoolean("org.lwjgl.util.mapped.Checks"); + + protected MappedObject() { + // + } + + /** The mapped object base memory address, in bytes. Read-only. */ + public long baseAddress; + + /** The mapped object view memory address, in bytes. Read-only. */ + public long viewAddress; + + /** The mapped buffer. */ + ByteBuffer preventGC; + + /** + * Holds the value of sizeof of the sub-type of this MappedObject
    + *
    + * The behavior of this (transformed) method does not follow the normal Java behavior.
    + * Vec2.SIZEOF will yield 8 (2 floats)
    + * Vec3.SIZEOF will yield 12 (3 floats)
    + * This (required) notation might cause compiler warnings, which can be suppressed with @SuppressWarnings("static-access").
    + * Using Java 5.0's static-import on this method will break functionality. + */ + public static int SIZEOF = -1; // any method that calls these field will have its call-site modified ('final' per subtype) + + /** + * The mapped object view offset, in elements. Read/write. + * This is a virtual field, used as a convenient getter/setter for {@see viewAddress}. + */ + public int view; + + protected final long getViewAddress(final int view) { + // No call-site modification for this, we override in every subclass instead, + // so that we can use it in MappedForeach. + throw new InternalError("type not registered"); + } + + public final void setViewAddress(final long address) { + if ( CHECKS ) + checkAddress(address); + this.viewAddress = address; + } + + final void checkAddress(final long address) { + final long base = MemoryUtil.getAddress0(preventGC); + final int offset = (int)(address - base); + if ( address < base || preventGC.capacity() < (offset + getSizeof()) ) + throw new IndexOutOfBoundsException(Integer.toString(offset / getSizeof())); + } + + final void checkRange(final int bytes) { + if ( bytes < 0 ) + throw new IllegalArgumentException(); + + if ( preventGC.capacity() < (viewAddress - MemoryUtil.getAddress0(preventGC) + bytes) ) + throw new BufferOverflowException(); + } + + /** The mapped object memory alignment, in bytes. Read-only. */ + /** + * Returns the mapped object memory alignment, in bytes. + * + * @return the memory alignment + */ + public final int getAlign() { + // No call-site modification for this, we override in every subclass instead. + throw new InternalError("type not registered"); + } + + /** + * Returns the mapped object memory sizeof, in bytes. + * + * @return the sizeof value + */ + public final int getSizeof() { + // No call-site modification for this, we override in every subclass instead. + throw new InternalError("type not registered"); + } + + /** + * Returns the number of mapped objects that fit in the mapped buffer. + * + * @return the mapped object capacity + */ + public final int capacity() { + // No call-site modification for this, we override in every subclass instead. + throw new InternalError("type not registered"); + } + + /** + * Creates a MappedObject instance, mapping the memory region of the specified direct ByteBuffer. + *

    + * The behavior of this (transformed) method does not follow the normal Java behavior.
    + * Vec2.map(buffer) will return a mapped Vec2 instance.
    + * Vec3.map(buffer) will return a mapped Vec3 instance.
    + * This (required) notation might cause compiler warnings, which can be suppressed with @SuppressWarnings("static-access").
    + * Using Java 5.0's static-import on this method will break functionality. + */ + @SuppressWarnings("unused") + public static T map(ByteBuffer bb) { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Creates a MappedObject instance, mapping the memory region specified. This is useful for mapping + * arbitrary regions in memory, e.g. OpenCL CLMem objects, without creating a ByteBuffer first. + *

    + * The behavior of this (transformed) method does not follow the normal Java behavior.
    + * Vec2.map(buffer) will return a mapped Vec2 instance.
    + * Vec3.map(buffer) will return a mapped Vec3 instance.
    + * This (required) notation might cause compiler warnings, which can be suppressed with @SuppressWarnings("static-access").
    + * Using Java 5.0's static-import on this method will break functionality. + */ + @SuppressWarnings("unused") + public static T map(long address, int capacity) { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Creates a MappedObject instance, mapping the memory region of an allocated direct ByteBuffer with a capacity of elementCount*SIZEOF + *

    + * The behavior of this (transformed) method does not follow the normal Java behavior.
    + * Vec2.malloc(int) will return a mapped Vec2 instance.
    + * Vec3.malloc(int) will return a mapped Vec3 instance.
    + * This (required) notation might cause compiler warnings, which can be suppressed with @SuppressWarnings("static-access").
    + * Using Java 5.0's static-import on this method will break functionality. + */ + @SuppressWarnings("unused") + public static T malloc(int elementCount) { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Creates an identical new MappedObject instance, comparable to the + * contract of {@link ByteBuffer#duplicate}. This is useful when more than one + * views of the mapped object are required at the same time, e.g. in + * multithreaded access. + */ + public final T dup() { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Creates a new MappedObject instance, with a base offset equal to + * the offset of the current view, comparable to the contract of {@link ByteBuffer#slice}. + */ + public final T slice() { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Any code in the default constructor will not run automatically. This method + * can be used to execute that code on the current view. + */ + public final void runViewConstructor() { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** Moves the current view to the next element. */ + public final void next() { + // No call-site modification for this, we override in every subclass instead, + // so that we can use it in MappedSetX. + throw new InternalError("type not registered"); + } + + /** + * Copies and amount of SIZEOF - padding bytes, from the current + * mapped object, to the specified mapped object. + */ + @SuppressWarnings("unused") + public final void copyTo(T target) { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Copies and amount of SIZEOF * instances bytes, from the + * current mapped object, to the specified mapped object. Note that + * this includes any padding bytes that are part of SIZEOF. + */ + @SuppressWarnings("unused") + public final void copyRange(T target, int instances) { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Creates an {@link Iterable} that will step through + * capacity() views, leaving the view at + * the last valid value.
    + *

    + * For convenience you are encouraged to static-import this specific method: + * import static org.lwjgl.util.mapped.MappedObject.foreach; + */ + public static Iterable foreach(T mapped) { + return foreach(mapped, mapped.capacity()); + } + + /** + * Creates an {@link Iterable} that will step through + * elementCount views, leaving the view at + * the last valid value.
    + *

    + * For convenience you are encouraged to static-import this specific method: + * import static org.lwjgl.util.mapped.MappedObject.foreach; + */ + public static Iterable foreach(T mapped, int elementCount) { + return new MappedForeach(mapped, elementCount); + } + + @SuppressWarnings("unused") + public final T[] asArray() { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Returns the {@link ByteBuffer} that backs this mapped object. + * + * @return the backing buffer + */ + public final ByteBuffer backingByteBuffer() { + return this.preventGC; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java new file mode 100644 index 000000000..4653a3027 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +import org.lwjgl.LWJGLUtil; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URLClassLoader; + +/** + * This classloader is responsible for applying the bytecode transformation to mapped objects. + * The transformation can either be applied using a Java agent, or with the convenient {@link #fork} method. + * + * @author Riven + */ +public class MappedObjectClassLoader extends URLClassLoader { + + static final String MAPPEDOBJECT_PACKAGE_PREFIX = MappedObjectClassLoader.class.getPackage().getName() + "."; + + static boolean FORKED; + + /** + * Forks the specified class containing a main method, passing the specified arguments. + * + * @param mainClass the class containing the main method + * @param args the arguments to pass + * + * @return true if the fork was successful. + */ + public static boolean fork(Class mainClass, String[] args) { + if ( FORKED ) { + return false; + } + + FORKED = true; + + try { + MappedObjectClassLoader loader = new MappedObjectClassLoader(mainClass); + loader.loadMappedObject(); + + Class replacedMainClass = loader.loadClass(mainClass.getName()); + Method mainMethod = replacedMainClass.getMethod("main", String[].class); + mainMethod.invoke(null, new Object[] { args }); + } catch (InvocationTargetException exc) { + Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), exc.getCause()); + } catch (Throwable cause) { + throw new Error("failed to fork", cause); + } + + return true; + } + + private MappedObjectClassLoader(Class mainClass) { + super(((URLClassLoader)mainClass.getClassLoader()).getURLs()); + } + + protected synchronized Class loadMappedObject() throws ClassNotFoundException { + final String name = MappedObject.class.getName(); + String className = name.replace('.', '/'); + + byte[] bytecode = readStream(this.getResourceAsStream(className.concat(".class"))); + + long t0 = System.nanoTime(); + bytecode = MappedObjectTransformer.transformMappedObject(bytecode); + long t1 = System.nanoTime(); + total_time_transforming += (t1 - t0); + + if ( MappedObjectTransformer.PRINT_ACTIVITY ) + printActivity(className, t0, t1); + + Class clazz = super.defineClass(name, bytecode, 0, bytecode.length); + resolveClass(clazz); + return clazz; + } + + private static long total_time_transforming; + + @Override + protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + if ( name.startsWith("java.") + || name.startsWith("javax.") + || name.startsWith("sun.") + || name.startsWith("sunw.") + || name.startsWith("org.objectweb.asm.") + ) + return super.loadClass(name, resolve); + + final String className = name.replace('.', '/'); + final boolean inThisPackage = name.startsWith(MAPPEDOBJECT_PACKAGE_PREFIX); + + if ( inThisPackage && ( + name.equals(MappedObjectClassLoader.class.getName()) + || name.equals((MappedObjectTransformer.class.getName())) + || name.equals((CacheUtil.class.getName())) + ) ) + return super.loadClass(name, resolve); + + byte[] bytecode = readStream(this.getResourceAsStream(className.concat(".class"))); + + // Classes in this package do not get transformed, but need to go through here because we have transformed MappedObject. + if ( !(inThisPackage && name.substring(MAPPEDOBJECT_PACKAGE_PREFIX.length()).indexOf('.') == -1) ) { + long t0 = System.nanoTime(); + final byte[] newBytecode = MappedObjectTransformer.transformMappedAPI(className, bytecode); + long t1 = System.nanoTime(); + + total_time_transforming += (t1 - t0); + + if ( bytecode != newBytecode ) { + bytecode = newBytecode; + if ( MappedObjectTransformer.PRINT_ACTIVITY ) + printActivity(className, t0, t1); + } + } + + Class clazz = super.defineClass(name, bytecode, 0, bytecode.length); + if ( resolve ) + resolveClass(clazz); + return clazz; + } + + private static void printActivity(final String className, final long t0, final long t1) { + final StringBuilder msg = new StringBuilder(MappedObjectClassLoader.class.getSimpleName() + ": " + className); + + if ( MappedObjectTransformer.PRINT_TIMING ) + msg.append("\n\ttransforming took " + (t1 - t0) / 1000 + " micros (total: " + (total_time_transforming / 1000 / 1000) + "ms)"); + + LWJGLUtil.log(msg); + } + + private static byte[] readStream(InputStream in) { + byte[] bytecode = new byte[256]; + int len = 0; + try { + while ( true ) { + if ( bytecode.length == len ) + bytecode = copyOf(bytecode, len * 2); + int got = in.read(bytecode, len, bytecode.length - len); + if ( got == -1 ) + break; + len += got; + } + } catch (IOException exc) { + // stop! + } finally { + try { + in.close(); + } catch (IOException exc) { + // ignore... + } + } + return copyOf(bytecode, len); + } + + private static byte[] copyOf(byte[] original, int newLength) { + byte[] copy = new byte[newLength]; + System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); + return copy; + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectTransformer.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectTransformer.java new file mode 100644 index 000000000..ba12c9a32 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectTransformer.java @@ -0,0 +1,1340 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +import static org.objectweb.asm.ClassWriter.*; +import static org.objectweb.asm.Opcodes.*; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; +import org.objectweb.asm.ClassAdapter; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.AnnotationNode; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.tree.FieldNode; +import org.objectweb.asm.tree.InsnList; +import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.IntInsnNode; +import org.objectweb.asm.tree.LdcInsnNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.TypeInsnNode; +import org.objectweb.asm.tree.VarInsnNode; +import org.objectweb.asm.tree.analysis.Analyzer; +import org.objectweb.asm.tree.analysis.AnalyzerException; +import org.objectweb.asm.tree.analysis.BasicValue; +import org.objectweb.asm.tree.analysis.Frame; +import org.objectweb.asm.tree.analysis.SimpleVerifier; +import org.objectweb.asm.util.TraceClassVisitor; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +/** + * This class implements the bytecode transformation that mapped object go through. + * Mapped object classes need to first be registered with the transformer, see {@link #register(Class)}. + *

    + * The transformer supports some debugging tools, enabled through JVM system properties:
    + * org.lwjgl.util.mapped.PrintTiming=true, prints timing information for the transformation step.
    + * org.lwjgl.util.mapped.PrintActivity=true, prints activity information.
    + * org.lwjgl.util.mapped.PrintBytecode=true, prints the transformed bytecode.
    + * org.lwjgl.util.Debug must also be set to true for the above to work. + * + * @author Riven + */ +public class MappedObjectTransformer { + + static final boolean PRINT_ACTIVITY = LWJGLUtil.DEBUG && LWJGLUtil.getPrivilegedBoolean("org.lwjgl.util.mapped.PrintActivity"); + static final boolean PRINT_TIMING = PRINT_ACTIVITY && LWJGLUtil.getPrivilegedBoolean("org.lwjgl.util.mapped.PrintTiming"); + static final boolean PRINT_BYTECODE = LWJGLUtil.DEBUG && LWJGLUtil.getPrivilegedBoolean("org.lwjgl.util.mapped.PrintBytecode"); + + static final Map className_to_subtype; + + static final String MAPPED_OBJECT_JVM = jvmClassName(MappedObject.class); + static final String MAPPED_HELPER_JVM = jvmClassName(MappedHelper.class); + + static final String MAPPEDSET_PREFIX = jvmClassName(MappedSet.class); + static final String MAPPED_SET2_JVM = jvmClassName(MappedSet2.class); + static final String MAPPED_SET3_JVM = jvmClassName(MappedSet3.class); + static final String MAPPED_SET4_JVM = jvmClassName(MappedSet4.class); + + static final String CACHE_LINE_PAD_JVM = "L" + jvmClassName(CacheLinePad.class) + ";"; + + // Public methods + static final String VIEWADDRESS_METHOD_NAME = "getViewAddress"; + static final String NEXT_METHOD_NAME = "next"; + static final String ALIGN_METHOD_NAME = "getAlign"; + static final String SIZEOF_METHOD_NAME = "getSizeof"; + static final String CAPACITY_METHOD_NAME = "capacity"; // Used for .asArray().length + + // Internal methods + static final String VIEW_CONSTRUCTOR_NAME = "constructView$LWJGL"; // Used by runViewConstructor + + static final Map OPCODE_TO_NAME = new HashMap(); + static final Map INSNTYPE_TO_NAME = new HashMap(); + + static boolean is_currently_computing_frames; + + static { + getClassEnums(Opcodes.class, OPCODE_TO_NAME, "V1_", "ACC_", "T_", "F_", "MH_"); + getClassEnums(AbstractInsnNode.class, INSNTYPE_TO_NAME); + + className_to_subtype = new HashMap(); + + { + // HACK: required for mapped.view++ + // + // because the compiler generates: + // => GETFIELD MappedObject.view + // => ICONST_1 + // => IADD + // => PUTFIELD MyMappedType.view + // + // instead of: + // => GETFIELD MyMappedType.view + // => ICONST_1 + // => IADD + // => PUTFIELD MyMappedType.view + // + className_to_subtype.put(MAPPED_OBJECT_JVM, new MappedSubtypeInfo(MAPPED_OBJECT_JVM, null, -1, -1, -1, false)); + } + + final String vmName = System.getProperty("java.vm.name"); + if ( vmName != null && !vmName.contains("Server") ) { + System.err.println("Warning: " + MappedObject.class.getSimpleName() + "s have inferiour performance on Client VMs, please consider switching to a Server VM."); + } + } + + /** + * Registers a class as a mapped object. + * The class must extend {@link MappedObject} and be annotated with {@link MappedField}. + * + * @param type the mapped object class. + */ + public static void register(Class type) { + if ( MappedObjectClassLoader.FORKED ) + return; + + final MappedType mapped = type.getAnnotation(MappedType.class); + + if ( mapped != null && mapped.padding() < 0 ) + throw new ClassFormatError("Invalid mapped type padding: " + mapped.padding()); + + if ( type.getEnclosingClass() != null && !Modifier.isStatic(type.getModifiers()) ) + throw new InternalError("only top-level or static inner classes are allowed"); + + final String className = jvmClassName(type); + final Map fields = new HashMap(); + + long sizeof = 0; + for ( Field field : type.getDeclaredFields() ) { + FieldInfo fieldInfo = registerField(mapped == null || mapped.autoGenerateOffsets(), className, sizeof, field); + if ( fieldInfo == null ) + continue; + + fields.put(field.getName(), fieldInfo); + + sizeof = Math.max(sizeof, fieldInfo.offset + fieldInfo.lengthPadded); + } + + int align = 4; + int padding = 0; + boolean cacheLinePadded = false; + + if ( mapped != null ) { + align = mapped.align(); + if ( mapped.cacheLinePadding() ) { + if ( mapped.padding() != 0 ) + throw new ClassFormatError("Mapped type padding cannot be specified together with cacheLinePadding."); + + final int cacheLineMod = (int)(sizeof % CacheUtil.getCacheLineSize()); + if ( cacheLineMod != 0 ) + padding = CacheUtil.getCacheLineSize() - cacheLineMod; + + cacheLinePadded = true; + } else + padding = mapped.padding(); + } + + sizeof += padding; + + final MappedSubtypeInfo mappedType = new MappedSubtypeInfo(className, fields, (int)sizeof, align, padding, cacheLinePadded); + if ( className_to_subtype.put(className, mappedType) != null ) + throw new InternalError("duplicate mapped type: " + mappedType.className); + } + + private static FieldInfo registerField(final boolean autoGenerateOffsets, final String className, long advancingOffset, final Field field) { + if ( Modifier.isStatic(field.getModifiers()) ) // static fields are never mapped + return null; + + // we only support primitives and ByteBuffers + if ( !field.getType().isPrimitive() && field.getType() != ByteBuffer.class ) + throw new ClassFormatError("field '" + className + "." + field.getName() + "' not supported: " + field.getType()); + + MappedField meta = field.getAnnotation(MappedField.class); + if ( meta == null && !autoGenerateOffsets ) + throw new ClassFormatError("field '" + className + "." + field.getName() + "' missing annotation " + MappedField.class.getName() + ": " + className); + + Pointer pointer = field.getAnnotation(Pointer.class); + if ( pointer != null && field.getType() != long.class ) + throw new ClassFormatError("The @Pointer annotation can only be used on long fields. @Pointer field found: " + className + "." + field.getName() + ": " + field.getType()); + + if ( Modifier.isVolatile(field.getModifiers()) && (pointer != null || field.getType() == ByteBuffer.class) ) + throw new ClassFormatError("The volatile keyword is not supported for @Pointer or ByteBuffer fields. Volatile field found: " + className + "." + field.getName() + ": " + field.getType()); + + // quick hack + long byteLength; + if ( field.getType() == long.class || field.getType() == double.class ) { + if ( pointer == null ) + byteLength = 8; + else + byteLength = MappedObjectUnsafe.INSTANCE.addressSize(); + } else if ( field.getType() == double.class ) + byteLength = 8; + else if ( field.getType() == int.class || field.getType() == float.class ) + byteLength = 4; + else if ( field.getType() == char.class || field.getType() == short.class ) + byteLength = 2; + else if ( field.getType() == byte.class ) + byteLength = 1; + else if ( field.getType() == ByteBuffer.class ) { + byteLength = meta.byteLength(); + if ( byteLength < 0 ) + throw new IllegalStateException("invalid byte length for mapped ByteBuffer field: " + className + "." + field.getName() + " [length=" + byteLength + "]"); + } else + throw new ClassFormatError(field.getType().getName()); + + if ( field.getType() != ByteBuffer.class && (advancingOffset % byteLength) != 0 ) + throw new IllegalStateException("misaligned mapped type: " + className + "." + field.getName()); + + CacheLinePad pad = field.getAnnotation(CacheLinePad.class); + + long byteOffset = advancingOffset; + if ( meta != null && meta.byteOffset() != -1 ) { + if ( meta.byteOffset() < 0 ) + throw new ClassFormatError("Invalid field byte offset: " + className + "." + field.getName() + " [byteOffset=" + meta.byteOffset() + "]"); + if ( pad != null ) + throw new ClassFormatError("A field byte offset cannot be specified together with cache-line padding: " + className + "." + field.getName()); + + byteOffset = meta.byteOffset(); + } + + long byteLengthPadded = byteLength; + if ( pad != null ) { + // Pad before + if ( pad.before() && byteOffset % CacheUtil.getCacheLineSize() != 0 ) + byteOffset += CacheUtil.getCacheLineSize() - (byteOffset & (CacheUtil.getCacheLineSize() - 1)); + + // Pad after + if ( pad.after() && (byteOffset + byteLength) % CacheUtil.getCacheLineSize() != 0 ) + byteLengthPadded += CacheUtil.getCacheLineSize() - (byteOffset + byteLength) % CacheUtil.getCacheLineSize(); + + assert !pad.before() || (byteOffset % CacheUtil.getCacheLineSize() == 0); + assert !pad.after() || ((byteOffset + byteLengthPadded) % CacheUtil.getCacheLineSize() == 0); + } + + if ( PRINT_ACTIVITY ) + LWJGLUtil.log(MappedObjectTransformer.class.getSimpleName() + ": " + className + "." + field.getName() + " [type=" + field.getType().getSimpleName() + ", offset=" + byteOffset + "]"); + + return new FieldInfo(byteOffset, byteLength, byteLengthPadded, Type.getType(field.getType()), Modifier.isVolatile(field.getModifiers()), pointer != null); + } + + /** Removes final from methods that will be overriden by subclasses. */ + static byte[] transformMappedObject(byte[] bytecode) { + final ClassWriter cw = new ClassWriter(0); + + ClassVisitor cv = new ClassAdapter(cw) { + + private final String[] DEFINALIZE_LIST = { + VIEWADDRESS_METHOD_NAME, + NEXT_METHOD_NAME, + ALIGN_METHOD_NAME, + SIZEOF_METHOD_NAME, + CAPACITY_METHOD_NAME, + }; + + public MethodVisitor visitMethod(int access, final String name, final String desc, final String signature, final String[] exceptions) { + for ( String method : DEFINALIZE_LIST ) { + if ( name.equals(method) ) { + access &= ~ACC_FINAL; + break; + } + } + return super.visitMethod(access, name, desc, signature, exceptions); + } + }; + + new ClassReader(bytecode).accept(cv, 0); + return cw.toByteArray(); + } + + static byte[] transformMappedAPI(final String className, byte[] bytecode) { + final ClassWriter cw = new ClassWriter(COMPUTE_FRAMES) { + + @Override + protected String getCommonSuperClass(String a, String b) { + // HACK: prevent user-code static-initialization-blocks to be executed + if ( is_currently_computing_frames && !a.startsWith("java/") || !b.startsWith("java/") ) + return "java/lang/Object"; + + return super.getCommonSuperClass(a, b); + } + + }; + + final TransformationAdapter ta = new TransformationAdapter(cw, className); + + ClassVisitor cv = ta; + if ( className_to_subtype.containsKey(className) ) // Do a first pass to generate address getters + cv = getMethodGenAdapter(className, cv); + + new ClassReader(bytecode).accept(cv, ClassReader.SKIP_FRAMES); + + if ( !ta.transformed ) + return bytecode; + + bytecode = cw.toByteArray(); + if ( PRINT_BYTECODE ) + printBytecode(bytecode); + + return bytecode; + } + + private static ClassAdapter getMethodGenAdapter(final String className, final ClassVisitor cv) { + return new ClassAdapter(cv) { + + @Override + public void visitEnd() { + final MappedSubtypeInfo mappedSubtype = className_to_subtype.get(className); + + generateViewAddressGetter(); + generateCapacity(); + generateAlignGetter(mappedSubtype); + generateSizeofGetter(); + generateNext(); + + for ( String fieldName : mappedSubtype.fields.keySet() ) { + final FieldInfo field = mappedSubtype.fields.get(fieldName); + + if ( field.type.getDescriptor().length() > 1 ) { // ByteBuffer, getter only + generateByteBufferGetter(fieldName, field); + } else { + generateFieldGetter(fieldName, field); + generateFieldSetter(fieldName, field); + } + } + + super.visitEnd(); + } + + private void generateViewAddressGetter() { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC, VIEWADDRESS_METHOD_NAME, "(I)J", null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitFieldInsn(GETFIELD, MAPPED_OBJECT_JVM, "baseAddress", "J"); + mv.visitVarInsn(ILOAD, 1); + mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I"); + mv.visitInsn(IMUL); + mv.visitInsn(I2L); + mv.visitInsn(LADD); + if ( MappedObject.CHECKS ) { + mv.visitInsn(DUP2); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, "checkAddress", "(JL" + MAPPED_OBJECT_JVM + ";)V"); + } + mv.visitInsn(LRETURN); + mv.visitMaxs(3, 2); + mv.visitEnd(); + } + + private void generateCapacity() { + // return (backingByteBuffer().capacity() + (int)(MemoryUtil.getAddress0(backingByteBuffer()) - baseAddress)) / SIZEOF; + MethodVisitor mv = super.visitMethod(ACC_PUBLIC, CAPACITY_METHOD_NAME, "()I", null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKEVIRTUAL, MAPPED_OBJECT_JVM, "backingByteBuffer", "()L" + jvmClassName(ByteBuffer.class) + ";"); + mv.visitInsn(DUP); + mv.visitMethodInsn(INVOKEVIRTUAL, jvmClassName(ByteBuffer.class), "capacity", "()I"); + mv.visitInsn(SWAP); + mv.visitMethodInsn(INVOKESTATIC, jvmClassName(MemoryUtil.class), "getAddress0", "(L" + jvmClassName(Buffer.class) + ";)J"); + mv.visitVarInsn(ALOAD, 0); + mv.visitFieldInsn(GETFIELD, MAPPED_OBJECT_JVM, "baseAddress", "J"); + mv.visitInsn(LSUB); + mv.visitInsn(L2I); + mv.visitInsn(IADD); + mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I"); + mv.visitInsn(IDIV); + mv.visitInsn(IRETURN); + mv.visitMaxs(3, 1); + mv.visitEnd(); + } + + private void generateAlignGetter(final MappedSubtypeInfo mappedSubtype) { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC, ALIGN_METHOD_NAME, "()I", null, null); + mv.visitCode(); + visitIntNode(mv, mappedSubtype.sizeof); + mv.visitInsn(IRETURN); + mv.visitMaxs(1, 1); + mv.visitEnd(); + } + + private void generateSizeofGetter() { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC, SIZEOF_METHOD_NAME, "()I", null, null); + mv.visitCode(); + mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I"); + mv.visitInsn(IRETURN); + mv.visitMaxs(1, 1); + mv.visitEnd(); + } + + private void generateNext() { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC, NEXT_METHOD_NAME, "()V", null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitInsn(DUP); + mv.visitFieldInsn(GETFIELD, MAPPED_OBJECT_JVM, "viewAddress", "J"); + mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I"); + mv.visitInsn(I2L); + mv.visitInsn(LADD); + mv.visitMethodInsn(INVOKEVIRTUAL, className, "setViewAddress", "(J)V"); + mv.visitInsn(RETURN); + mv.visitMaxs(3, 1); + mv.visitEnd(); + } + + private void generateByteBufferGetter(final String fieldName, final FieldInfo field) { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC | ACC_STATIC, getterName(fieldName), "(L" + className + ";I)" + field.type.getDescriptor(), null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ILOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, className, VIEWADDRESS_METHOD_NAME, "(I)J"); + visitIntNode(mv, (int)field.offset); + mv.visitInsn(I2L); + mv.visitInsn(LADD); + visitIntNode(mv, (int)field.length); + mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, "newBuffer", "(JI)L" + jvmClassName(ByteBuffer.class) + ";"); + mv.visitInsn(ARETURN); + mv.visitMaxs(3, 2); + mv.visitEnd(); + } + + private void generateFieldGetter(final String fieldName, final FieldInfo field) { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC | ACC_STATIC, getterName(fieldName), "(L" + className + ";I)" + field.type.getDescriptor(), null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ILOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, className, VIEWADDRESS_METHOD_NAME, "(I)J"); + visitIntNode(mv, (int)field.offset); + mv.visitInsn(I2L); + mv.visitInsn(LADD); + mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "get", "(J)" + field.type.getDescriptor()); + mv.visitInsn(field.type.getOpcode(IRETURN)); + mv.visitMaxs(3, 2); + mv.visitEnd(); + } + + private void generateFieldSetter(final String fieldName, final FieldInfo field) { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC | ACC_STATIC, setterName(fieldName), "(L" + className + ";I" + field.type.getDescriptor() + ")V", null, null); + mv.visitCode(); + int load = 0; + switch ( field.type.getSort() ) { + case Type.BOOLEAN: + case Type.CHAR: + case Type.BYTE: + case Type.SHORT: + case Type.INT: + load = ILOAD; + break; + case Type.FLOAT: + load = FLOAD; + break; + case Type.LONG: + load = LLOAD; + break; + case Type.DOUBLE: + load = DLOAD; + break; + } + mv.visitVarInsn(load, 2); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ILOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, className, VIEWADDRESS_METHOD_NAME, "(I)J"); + visitIntNode(mv, (int)field.offset); + mv.visitInsn(I2L); + mv.visitInsn(LADD); + mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "put", "(" + field.type.getDescriptor() + "J)V"); + mv.visitInsn(RETURN); + mv.visitMaxs(4, 4); + mv.visitEnd(); + } + + }; + } + + private static class TransformationAdapter extends ClassAdapter { + + final String className; + + boolean transformed; + + TransformationAdapter(final ClassVisitor cv, final String className) { + super(cv); + this.className = className; + } + + @Override + public FieldVisitor visitField(final int access, final String name, final String desc, final String signature, final Object value) { + // remove redirected fields + final MappedSubtypeInfo mappedSubtype = className_to_subtype.get(className); + if ( mappedSubtype != null && mappedSubtype.fields.containsKey(name) ) { + if ( PRINT_ACTIVITY ) + LWJGLUtil.log(MappedObjectTransformer.class.getSimpleName() + ": discarding field: " + className + "." + name + ":" + desc); + return null; + } + + if ( (access & ACC_STATIC) == 0 ) { + return new FieldNode(access, name, desc, signature, value) { + public void visitEnd() { + if ( visibleAnnotations == null ) { // early-out + accept(cv); + return; + } + + boolean before = false; + boolean after = false; + int byteLength = 0; + for ( AnnotationNode pad : visibleAnnotations ) { + if ( CACHE_LINE_PAD_JVM.equals(pad.desc) ) { + if ( "J".equals(desc) || "D".equals(desc) ) + byteLength = 8; + else if ( "I".equals(desc) || "F".equals(desc) ) + byteLength = 4; + else if ( "S".equals(desc) || "C".equals(desc) ) + byteLength = 2; + else if ( "B".equals(desc) || "Z".equals(desc) ) + byteLength = 1; + else + throw new ClassFormatError("The @CacheLinePad annotation cannot be used on non-primitive fields: " + className + "." + name); + + transformed = true; + + after = true; + if ( pad.values != null ) { + for ( int i = 0; i < pad.values.size(); i += 2 ) { + final boolean value = pad.values.get(i + 1).equals(Boolean.TRUE); + if ( "before".equals(pad.values.get(i)) ) + before = value; + else + after = value; + } + } + break; + } + } + + /* + We make the fields public to force the JVM to keep the fields in the object. + Instead of using only longs or integers, we use the same type as the original + field. That's because modern JVMs usually reorder fields by type: + longs, then doubles, then integers, then booleans, etc. This way it's more + likely that the padding will work as expected. + */ + + if ( before ) { + final int count = CacheUtil.getCacheLineSize() / byteLength - 1; + for ( int i = count; i >= 1; i-- ) + cv.visitField(access | ACC_PUBLIC | ACC_SYNTHETIC, name + "$PAD_" + i, desc, signature, null); + } + + accept(cv); + + if ( after ) { + final int count = CacheUtil.getCacheLineSize() / byteLength - 1; + for ( int i = 1; i <= count; i++ ) + cv.visitField(access | ACC_PUBLIC | ACC_SYNTHETIC, name + "$PAD" + i, desc, signature, null); + } + } + }; + } else + return super.visitField(access, name, desc, signature, value); + } + + @Override + public MethodVisitor visitMethod(final int access, String name, final String desc, final String signature, final String[] exceptions) { + // Move MappedSubtype constructors to another method + if ( "".equals(name) ) { + final MappedSubtypeInfo mappedSubtype = className_to_subtype.get(className); + if ( mappedSubtype != null ) { + if ( !"()V".equals(desc) ) + throw new ClassFormatError(className + " can only have a default constructor, found: " + desc); + + final MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, MAPPED_OBJECT_JVM, "", "()V"); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 0); + + // put the method body in another method + name = VIEW_CONSTRUCTOR_NAME; + } + } + + final MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); + return new MethodNode(access, name, desc, signature, exceptions) { + + /** When true, the method has touched a mapped object and needs to be transformed. We track this + * so we can skip the expensive frame analysis and tree API usage. */ + boolean needsTransformation; + + @Override + public void visitMaxs(int a, int b) { + try { + is_currently_computing_frames = true; + super.visitMaxs(a, b); + } finally { + is_currently_computing_frames = false; + } + } + + @Override + public void visitFieldInsn(final int opcode, final String owner, final String name, final String desc) { + if ( className_to_subtype.containsKey(owner) || owner.startsWith(MAPPEDSET_PREFIX) ) + needsTransformation = true; + + super.visitFieldInsn(opcode, owner, name, desc); + } + + @Override + public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) { + if ( className_to_subtype.containsKey(owner) ) + needsTransformation = true; + + super.visitMethodInsn(opcode, owner, name, desc); + } + + @Override + public void visitEnd() { + if ( needsTransformation ) { // Early-out for methods that do not touch a mapped object. + //System.err.println("\nTRANSFORMING: " + className + "." + name + desc); + transformed = true; + try { + transformMethod(analyse()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + // Pass the instruction stream to the adapter's MethodVisitor + accept(mv); + } + + private Frame[] analyse() throws AnalyzerException { + final Analyzer a = new Analyzer(new SimpleVerifier()); + a.analyze(className, this); + return a.getFrames(); + } + + private void transformMethod(final Frame[] frames) { + final InsnList instructions = this.instructions; + + final Map arrayVars = new HashMap(); + + /* + We need this map because we insert/remove instructions from the stream and we need a way + to match each original instruction with the corresponding frame. + TODO: Can we keep track of everything more efficiently without a map? + */ + final Map> frameMap = new HashMap>(); + for ( int i = 0; i < frames.length; i++ ) + frameMap.put(instructions.get(i), frames[i]); + + for ( int i = 0; i < instructions.size(); i++ ) { // f is a separate cursor for frames + final AbstractInsnNode instruction = instructions.get(i); + + //System.out.println("MAIN LOOP #" + i + " - " + getOpcodeName(instruction)); + + switch ( instruction.getType() ) { + case AbstractInsnNode.VAR_INSN: + if ( instruction.getOpcode() == ALOAD ) { + VarInsnNode varInsn = (VarInsnNode)instruction; + final MappedSubtypeInfo mappedSubtype = arrayVars.get(varInsn.var); + if ( mappedSubtype != null ) + i = transformArrayAccess(instructions, i, frameMap, varInsn, mappedSubtype, varInsn.var); + } + break; + case AbstractInsnNode.FIELD_INSN: + FieldInsnNode fieldInsn = (FieldInsnNode)instruction; + + final InsnList list = transformFieldAccess(fieldInsn); + if ( list != null ) + i = replace(instructions, i, instruction, list); + + break; + case AbstractInsnNode.METHOD_INSN: + MethodInsnNode methodInsn = (MethodInsnNode)instruction; + final MappedSubtypeInfo mappedType = className_to_subtype.get(methodInsn.owner); + if ( mappedType != null ) + i = transformMethodCall(instructions, i, frameMap, methodInsn, mappedType, arrayVars); + break; + } + } + } + }; + } + } + + static int transformMethodCall(final InsnList instructions, int i, final Map> frameMap, final MethodInsnNode methodInsn, final MappedSubtypeInfo mappedType, final Map arrayVars) { + switch ( methodInsn.getOpcode() ) { + case INVOKEVIRTUAL: + if ( "asArray".equals(methodInsn.name) && methodInsn.desc.equals("()[L" + MAPPED_OBJECT_JVM + ";") ) { + // Go forward and store the local variable index. + // We only allow this pattern: INVOKEVIRTUAL -> CHECKCAST -> ASTORE. + // We remove the first two and store the target MappedSubtype in the ASTORE variable + AbstractInsnNode nextInstruction; + checkInsnAfterIsArray(nextInstruction = methodInsn.getNext(), CHECKCAST); + checkInsnAfterIsArray(nextInstruction = nextInstruction.getNext(), ASTORE); + + final Frame frame = frameMap.get(nextInstruction); + final String targetType = frame.getStack(frame.getStackSize() - 1).getType().getElementType().getInternalName(); + if ( !methodInsn.owner.equals(targetType) ) { + /* + This may happen with the current API, like so: + MappedA foo = MappedA.malloc(...); + MappedB[] cursor = foo.asArray(); + We have to parameterize MappedObject to avoid this. + */ + throw new ClassCastException("Source: " + methodInsn.owner + " - Target: " + targetType); + } + + final VarInsnNode varInstruction = (VarInsnNode)nextInstruction; + + arrayVars.put(varInstruction.var, mappedType); + + instructions.remove(methodInsn.getNext()); // Remove CHECKCAST + instructions.remove(methodInsn); // Remove INVOKEVIRTUAL + } + + if ( "dup".equals(methodInsn.name) && methodInsn.desc.equals("()L" + MAPPED_OBJECT_JVM + ";") ) { + i = replace(instructions, i, methodInsn, generateDupInstructions(methodInsn)); + break; + } + + if ( "slice".equals(methodInsn.name) && methodInsn.desc.equals("()L" + MAPPED_OBJECT_JVM + ";") ) { + i = replace(instructions, i, methodInsn, generateSliceInstructions(methodInsn)); + break; + } + + if ( "runViewConstructor".equals(methodInsn.name) && "()V".equals(methodInsn.desc) ) { + i = replace(instructions, i, methodInsn, generateRunViewConstructorInstructions(methodInsn)); + break; + } + + if ( "copyTo".equals(methodInsn.name) && methodInsn.desc.equals("(L" + MAPPED_OBJECT_JVM + ";)V") ) { + i = replace(instructions, i, methodInsn, generateCopyToInstructions(mappedType)); + break; + } + + if ( "copyRange".equals(methodInsn.name) && methodInsn.desc.equals("(L" + MAPPED_OBJECT_JVM + ";I)V") ) { + i = replace(instructions, i, methodInsn, generateCopyRangeInstructions(mappedType)); + break; + } + + break; + case INVOKESPECIAL: + // super() in VIEW_CONSTRUCTOR_NAME, remove + if ( methodInsn.owner.equals(MAPPED_OBJECT_JVM) && "".equals(methodInsn.name) && "()V".equals(methodInsn.desc) ) { + instructions.remove(methodInsn.getPrevious()); // ALOAD + instructions.remove(methodInsn); // INVOKESPECIAL + + i -= 2; + } + break; + case INVOKESTATIC: + boolean isMapDirectMethod = "map".equals(methodInsn.name) && methodInsn.desc.equals("(JI)L" + MAPPED_OBJECT_JVM + ";"); + boolean isMapBufferMethod = "map".equals(methodInsn.name) && methodInsn.desc.equals("(Ljava/nio/ByteBuffer;)L" + MAPPED_OBJECT_JVM + ";"); + boolean isMallocMethod = "malloc".equals(methodInsn.name) && methodInsn.desc.equals("(I)L" + MAPPED_OBJECT_JVM + ";"); + + if ( (isMapDirectMethod || isMapBufferMethod) || isMallocMethod ) + i = replace(instructions, i, methodInsn, generateMapInstructions(mappedType, methodInsn.owner, isMapDirectMethod, isMallocMethod)); + break; + } + + return i; + } + + private static InsnList generateCopyRangeInstructions(final MappedSubtypeInfo mappedType) { + final InsnList list = new InsnList(); + + // stack: instances, target, this + list.add(getIntNode(mappedType.sizeof)); + // stack: sizeof, instances, target, this + list.add(new InsnNode(IMUL)); + // stack: bytes, target, this + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "copy", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";I)V")); + // stack: - + + return list; + } + + private static InsnList generateCopyToInstructions(final MappedSubtypeInfo mappedType) { + final InsnList list = new InsnList(); + + // stack: target, this + list.add(getIntNode(mappedType.sizeof - mappedType.padding)); + // stack: sizeof, target, this + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "copy", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";I)V")); + // stack: - + + return list; + } + + private static InsnList generateRunViewConstructorInstructions(final MethodInsnNode methodInsn) { + final InsnList list = new InsnList(); + + // stack: this + list.add(new InsnNode(DUP)); + // stack: this, this + list.add(new MethodInsnNode(INVOKEVIRTUAL, methodInsn.owner, VIEW_CONSTRUCTOR_NAME, "()V")); + // stack: this + + return list; + } + + private static InsnList generateSliceInstructions(final MethodInsnNode methodInsn) { + final InsnList list = new InsnList(); + + // stack: this + list.add(new TypeInsnNode(NEW, methodInsn.owner)); + // stack: new, this + list.add(new InsnNode(DUP)); + // stack: new, new, this + list.add(new MethodInsnNode(INVOKESPECIAL, methodInsn.owner, "", "()V")); + // stack: new, this + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "slice", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";)L" + MAPPED_OBJECT_JVM + ";")); + // stack: new + + return list; + } + + private static InsnList generateDupInstructions(final MethodInsnNode methodInsn) { + final InsnList list = new InsnList(); + + // stack: this + list.add(new TypeInsnNode(NEW, methodInsn.owner)); + // stack: new, this + list.add(new InsnNode(DUP)); + // stack: new, new, this + list.add(new MethodInsnNode(INVOKESPECIAL, methodInsn.owner, "", "()V")); + // stack: new, this + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "dup", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";)L" + MAPPED_OBJECT_JVM + ";")); + // stack: new + + return list; + } + + private static InsnList generateMapInstructions(final MappedSubtypeInfo mappedType, final String className, final boolean mapDirectMethod, final boolean mallocMethod) { + final InsnList trg = new InsnList(); + + if ( mallocMethod ) { + // stack: count + trg.add(getIntNode(mappedType.sizeof)); + // stack: sizeof, count + trg.add(new InsnNode(IMUL)); + // stack: bytes + trg.add(new MethodInsnNode(INVOKESTATIC, mappedType.cacheLinePadded ? jvmClassName(CacheUtil.class) : jvmClassName(BufferUtils.class), "createByteBuffer", "(I)L" + jvmClassName(ByteBuffer.class) + ";")); + // stack: buffer + } else if ( mapDirectMethod ) { + // stack: capacity, address + trg.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "newBuffer", "(JI)L" + jvmClassName(ByteBuffer.class) + ";")); + // stack: buffer + } + + // stack: buffer + trg.add(new TypeInsnNode(NEW, className)); + // stack: new, buffer + trg.add(new InsnNode(DUP)); + // stack: new, new, buffer + trg.add(new MethodInsnNode(INVOKESPECIAL, className, "", "()V")); + // stack: new, buffer + trg.add(new InsnNode(DUP_X1)); + // stack: new, buffer, new + trg.add(new InsnNode(SWAP)); + // stack: buffer, new, new + trg.add(getIntNode(mappedType.align)); + // stack: int, buffer, new, new + trg.add(getIntNode(mappedType.sizeof)); + // stack: int, int, buffer, new, new + trg.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "setup", "(L" + MAPPED_OBJECT_JVM + ";Ljava/nio/ByteBuffer;II)V")); + // stack: new + + return trg; + } + + static InsnList transformFieldAccess(final FieldInsnNode fieldInsn) { + final MappedSubtypeInfo mappedSubtype; + mappedSubtype = className_to_subtype.get(fieldInsn.owner); + if ( mappedSubtype == null ) { // early out + // MappedSet.view + outer: + if ( "view".equals(fieldInsn.name) && fieldInsn.owner.startsWith(MAPPEDSET_PREFIX) ) + return generateSetViewInstructions(fieldInsn); + + return null; // early out + } + + if ( "SIZEOF".equals(fieldInsn.name) ) + return generateSIZEOFInstructions(fieldInsn, mappedSubtype); + + if ( "view".equals(fieldInsn.name) ) + return generateViewInstructions(fieldInsn, mappedSubtype); + + if ( "baseAddress".equals(fieldInsn.name) || "viewAddress".equals(fieldInsn.name) ) { + return generateAddressInstructions(fieldInsn); + } + + final FieldInfo field = mappedSubtype.fields.get(fieldInsn.name); + if ( field == null ) // early out + return null; + + // now we're going to transform ByteBuffer-typed field access + if ( fieldInsn.desc.equals("L" + jvmClassName(ByteBuffer.class) + ";") ) + return generateByteBufferInstructions(fieldInsn, mappedSubtype, field.offset); + + // we're now going to transform the field access + return generateFieldInstructions(fieldInsn, field); + } + + private static InsnList generateSetViewInstructions(final FieldInsnNode fieldInsn) { + if ( fieldInsn.getOpcode() == GETFIELD ) + throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name); + if ( fieldInsn.getOpcode() != PUTFIELD ) + throw new InternalError(); + + final InsnList list = new InsnList(); + + // stack: index, this + if ( MAPPED_SET2_JVM.equals(fieldInsn.owner) ) + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_views", "(L" + MAPPED_SET2_JVM + ";I)V")); + else if ( MAPPED_SET3_JVM.equals(fieldInsn.owner) ) + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_views", "(L" + MAPPED_SET3_JVM + ";I)V")); + else if ( MAPPED_SET4_JVM.equals(fieldInsn.owner) ) + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_views", "(L" + MAPPED_SET4_JVM + ";I)V")); + else + throw new InternalError(); + // stack: - + + return list; + } + + private static InsnList generateSIZEOFInstructions(final FieldInsnNode fieldInsn, final MappedSubtypeInfo mappedSubtype) { + if ( !"I".equals(fieldInsn.desc) ) + throw new InternalError(); + + final InsnList list = new InsnList(); + + if ( fieldInsn.getOpcode() == GETSTATIC ) { + list.add(getIntNode(mappedSubtype.sizeof)); + return list; + } + + if ( fieldInsn.getOpcode() == PUTSTATIC ) + throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name); + + throw new InternalError(); + } + + private static InsnList generateViewInstructions(final FieldInsnNode fieldInsn, final MappedSubtypeInfo mappedSubtype) { + if ( !"I".equals(fieldInsn.desc) ) + throw new InternalError(); + + final InsnList list = new InsnList(); + + if ( fieldInsn.getOpcode() == GETFIELD ) { + if ( mappedSubtype.sizeof_shift != 0 ) { + // stack: instance + list.add(getIntNode(mappedSubtype.sizeof_shift)); + // stack: sizeof, instance + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "get_view_shift", "(L" + MAPPED_OBJECT_JVM + ";I)I")); + // stack: view + } else { + // stack: instance + list.add(getIntNode(mappedSubtype.sizeof)); + // stack: sizeof, instance + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "get_view", "(L" + MAPPED_OBJECT_JVM + ";I)I")); + // stack: view + } + return list; + } + + if ( fieldInsn.getOpcode() == PUTFIELD ) { + if ( mappedSubtype.sizeof_shift != 0 ) { + // stack: view, instance + list.add(getIntNode(mappedSubtype.sizeof_shift)); + // stack: sizeof, view, instance + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_view_shift", "(L" + MAPPED_OBJECT_JVM + ";II)V")); + // stack: - + } else { + // stack: view, instance + list.add(getIntNode(mappedSubtype.sizeof)); + // stack: sizeof, view, instance + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_view", "(L" + MAPPED_OBJECT_JVM + ";II)V")); + // stack: - + } + return list; + } + + throw new InternalError(); + } + + private static InsnList generateAddressInstructions(final FieldInsnNode fieldInsn) { + if ( !"J".equals(fieldInsn.desc) ) + throw new IllegalStateException(); + + if ( fieldInsn.getOpcode() == GETFIELD ) // do not change a thing + return null; + + if ( fieldInsn.getOpcode() == PUTFIELD ) + throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name); + + throw new InternalError(); + } + + private static InsnList generateByteBufferInstructions(final FieldInsnNode fieldInsn, final MappedSubtypeInfo mappedSubtype, final long fieldOffset) { + if ( fieldInsn.getOpcode() == PUTFIELD ) + throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name); + + if ( fieldInsn.getOpcode() == GETFIELD ) { + final InsnList list = new InsnList(); + + // stack: ref + list.add(new FieldInsnNode(GETFIELD, mappedSubtype.className, "viewAddress", "J")); + // stack: long + list.add(new LdcInsnNode(fieldOffset)); + // stack: long, long + list.add(new InsnNode(LADD)); + // stack: long + list.add(new LdcInsnNode(mappedSubtype.fields.get(fieldInsn.name).length)); + // stack: long, long + list.add(new InsnNode(L2I)); + // stack: int, long + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "newBuffer", "(JI)L" + jvmClassName(ByteBuffer.class) + ";")); + // stack: buffer + + return list; + } + + throw new InternalError(); + } + + private static InsnList generateFieldInstructions(final FieldInsnNode fieldInsn, final FieldInfo field) { + final InsnList list = new InsnList(); + + if ( fieldInsn.getOpcode() == PUTFIELD ) { + // stack: value, ref + list.add(getIntNode((int)field.offset)); + // stack: fieldOffset, value, ref + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "put", "(L" + MAPPED_OBJECT_JVM + ";" + fieldInsn.desc + "I)V")); + // stack - + return list; + } + + if ( fieldInsn.getOpcode() == GETFIELD ) { + // stack: ref + list.add(getIntNode((int)field.offset)); + // stack: fieldOffset, ref + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "get", "(L" + MAPPED_OBJECT_JVM + ";I)" + fieldInsn.desc)); + // stack: - + return list; + } + + throw new InternalError(); + } + + static int transformArrayAccess(final InsnList instructions, int i, final Map> frameMap, final VarInsnNode loadInsn, final MappedSubtypeInfo mappedSubtype, final int var) { + // We need to go forward in time to find how we use the array var + final int loadStackSize = frameMap.get(loadInsn).getStackSize() + 1; + + AbstractInsnNode nextInsn = loadInsn; + + while ( true ) { + nextInsn = nextInsn.getNext(); + if ( nextInsn == null ) + throw new InternalError(); + + Frame frame = frameMap.get(nextInsn); + if ( frame == null ) + continue; + + int stackSize = frame.getStackSize(); + + if ( stackSize == loadStackSize + 1 && nextInsn.getOpcode() == AALOAD ) { + final AbstractInsnNode aaLoadInsn = nextInsn; + + while ( true ) { + nextInsn = nextInsn.getNext(); + if ( nextInsn == null ) + break; + + frame = frameMap.get(nextInsn); + if ( frame == null ) + continue; + stackSize = frame.getStackSize(); + + if ( stackSize == loadStackSize + 1 && nextInsn.getOpcode() == PUTFIELD ) { + final FieldInsnNode fieldInsn = (FieldInsnNode)nextInsn; + + // stack: value, view, ref + instructions.insert(nextInsn, new MethodInsnNode(INVOKESTATIC, mappedSubtype.className, setterName(fieldInsn.name), "(L" + mappedSubtype.className + ";I" + fieldInsn.desc + ")V")); + // stack: - + instructions.remove(nextInsn); + + break; + } else if ( stackSize == loadStackSize && nextInsn.getOpcode() == GETFIELD ) { + final FieldInsnNode fieldInsn = (FieldInsnNode)nextInsn; + + // stack: view, ref + instructions.insert(nextInsn, new MethodInsnNode(INVOKESTATIC, mappedSubtype.className, getterName(fieldInsn.name), "(L" + mappedSubtype.className + ";I)" + fieldInsn.desc)); + // stack: value + instructions.remove(nextInsn); + + break; + } else if ( stackSize == loadStackSize && nextInsn.getOpcode() == DUP && nextInsn.getNext().getOpcode() == GETFIELD ) { + // May happen with operator+assignment (e.g. cursor[i].value += 10) + final FieldInsnNode fieldInsn = (FieldInsnNode)nextInsn.getNext(); + + final MethodInsnNode getter = new MethodInsnNode(INVOKESTATIC, mappedSubtype.className, getterName(fieldInsn.name), "(L" + mappedSubtype.className + ";I)" + fieldInsn.desc); + + // stack: view, ref + instructions.insert(nextInsn, new InsnNode(DUP2)); + // stack: view, ref, view, ref + instructions.insert(nextInsn.getNext(), getter); + // stack: value, view, ref + + instructions.remove(nextInsn); + instructions.remove(fieldInsn); + + nextInsn = getter; + continue; + } else if ( stackSize < loadStackSize ) + throw new ClassFormatError("Invalid " + mappedSubtype.className + " view array usage detected: " + getOpcodeName(nextInsn)); + } + + instructions.remove(aaLoadInsn); + + return i; + } else if ( stackSize == loadStackSize && nextInsn.getOpcode() == ARRAYLENGTH ) { + if ( LWJGLUtil.DEBUG && loadInsn.getNext() != nextInsn ) + throw new InternalError(); + + instructions.remove(nextInsn); + loadInsn.var = var; + instructions.insert(loadInsn, new MethodInsnNode(INVOKEVIRTUAL, mappedSubtype.className, CAPACITY_METHOD_NAME, "()I")); + + return i + 1; + } else if ( stackSize < loadStackSize ) // Consumed by something other than AALOAD or ARRAYLENGTH + throw new ClassFormatError("Invalid " + mappedSubtype.className + " view array usage detected: " + getOpcodeName(nextInsn)); + } + } + + private static class FieldInfo { + + final long offset; + final long length; + final long lengthPadded; + final Type type; + final boolean isVolatile; + final boolean isPointer; + + FieldInfo(final long offset, final long length, final long lengthPadded, final Type type, final boolean isVolatile, final boolean isPointer) { + this.offset = offset; + this.length = length; + this.lengthPadded = lengthPadded; + this.type = type; + this.isVolatile = isVolatile; + this.isPointer = isPointer; + } + + String getAccessType() { + return isPointer ? "a" : type.getDescriptor().toLowerCase() + (isVolatile ? "v" : ""); + } + + } + + private static class MappedSubtypeInfo { + + final String className; + + final int sizeof; + final int sizeof_shift; + final int align; + final int padding; + final boolean cacheLinePadded; + + final Map fields; + + MappedSubtypeInfo(String className, Map fields, int sizeof, int align, int padding, final boolean cacheLinePadded) { + this.className = className; + + this.sizeof = sizeof; + if ( ((sizeof - 1) & sizeof) == 0 ) + this.sizeof_shift = getPoT(sizeof); + else + this.sizeof_shift = 0; + this.align = align; + this.padding = padding; + this.cacheLinePadded = cacheLinePadded; + + this.fields = fields; + } + + private static int getPoT(int value) { + int pot = -1; + while ( value > 0 ) { + pot++; + value >>= 1; + } + return pot; + } + + } + + // ------------------------------------------------------- + // -------------------[ MACROS & UTILS ]------------------ + // ------------------------------------------------------- + + private static void getClassEnums(final Class clazz, final Map map, final String... prefixFilters) { + try { + OUTER: + for ( Field field : clazz.getFields() ) { + if ( !Modifier.isStatic(field.getModifiers()) || field.getType() != int.class ) + continue; + + for ( String filter : prefixFilters ) { + if ( field.getName().startsWith(filter) ) + continue OUTER; + } + + if ( map.put((Integer)field.get(null), field.getName()) != null ) + throw new IllegalStateException(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + static String getOpcodeName(final AbstractInsnNode insn) { + final String op = OPCODE_TO_NAME.get(insn.getOpcode()); + return INSNTYPE_TO_NAME.get(insn.getType()) + ": " + insn.getOpcode() + (op == null ? "" : " [" + OPCODE_TO_NAME.get(insn.getOpcode()) + "]"); + } + + static String jvmClassName(Class type) { + return type.getName().replace('.', '/'); + } + + static String getterName(final String fieldName) { + return "get$" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1) + "$LWJGL"; + } + + static String setterName(final String fieldName) { + return "set$" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1) + "$LWJGL"; + } + + private static void checkInsnAfterIsArray(final AbstractInsnNode instruction, final int opcode) { + if ( instruction == null ) + throw new ClassFormatError("Unexpected end of instructions after .asArray() method."); + + if ( instruction.getOpcode() != opcode ) + throw new ClassFormatError("The result of .asArray() must be stored to a local variable. Found: " + getOpcodeName(instruction)); + } + + static AbstractInsnNode getIntNode(final int value) { + if ( value <= 5 && -1 <= value ) + return new InsnNode(ICONST_M1 + value + 1); + + if ( value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE ) + return new IntInsnNode(BIPUSH, value); + + if ( value >= Short.MIN_VALUE && value <= Short.MAX_VALUE ) + return new IntInsnNode(SIPUSH, value); + + return new LdcInsnNode(value); + } + + static void visitIntNode(final MethodVisitor mv, final int value) { + if ( value <= 5 && -1 <= value ) + mv.visitInsn(ICONST_M1 + value + 1); + else if ( value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE ) + mv.visitIntInsn(BIPUSH, value); + else if ( value >= Short.MIN_VALUE && value <= Short.MAX_VALUE ) + mv.visitIntInsn(SIPUSH, value); + else + mv.visitLdcInsn(value); + } + + /** Replace an instruction with a list of instructions. */ + static int replace(final InsnList instructions, final int i, final AbstractInsnNode location, final InsnList list) { + final int size = list.size(); + + instructions.insert(location, list); + instructions.remove(location); + + return i + (size - 1); + } + + private static void throwAccessErrorOnReadOnlyField(String className, String fieldName) { + throw new IllegalAccessError("The " + className + "." + fieldName + " field is final."); + } + + private static void printBytecode(byte[] bytecode) { + StringWriter sw = new StringWriter(); + ClassVisitor tracer = new TraceClassVisitor(new ClassWriter(0), new PrintWriter(sw)); + new ClassReader(bytecode).accept(tracer, 0); + String dump = sw.toString(); + + LWJGLUtil.log(dump); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectUnsafe.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectUnsafe.java new file mode 100644 index 000000000..562b5ec78 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedObjectUnsafe.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import sun.misc.Unsafe; + +/** + * [INTERNAL USE ONLY] + * + * @author Riven + */ +final class MappedObjectUnsafe { + + static final Unsafe INSTANCE = getUnsafeInstance(); + + private static final long BUFFER_ADDRESS_OFFSET = getObjectFieldOffset(ByteBuffer.class, "address"); + private static final long BUFFER_CAPACITY_OFFSET = getObjectFieldOffset(ByteBuffer.class, "capacity"); + + private static final ByteBuffer global = ByteBuffer.allocateDirect(4 * 1024); + + static ByteBuffer newBuffer(long address, int capacity) { + if ( address <= 0L || capacity < 0 ) + throw new IllegalStateException("you almost crashed the jvm"); + + ByteBuffer buffer = global.duplicate().order(ByteOrder.nativeOrder()); + INSTANCE.putLong(buffer, BUFFER_ADDRESS_OFFSET, address); + INSTANCE.putInt(buffer, BUFFER_CAPACITY_OFFSET, capacity); + buffer.position(0); + buffer.limit(capacity); + return buffer; + } + + private static long getObjectFieldOffset(Class type, String fieldName) { + while ( type != null ) { + try { + return INSTANCE.objectFieldOffset(type.getDeclaredField(fieldName)); + } catch (Throwable t) { + type = type.getSuperclass(); + } + } + + throw new UnsupportedOperationException(); + } + + private static Unsafe getUnsafeInstance() { + final Field[] fields = Unsafe.class.getDeclaredFields(); + + /* + Different runtimes use different names for the Unsafe singleton, + so we cannot use .getDeclaredField and we scan instead. For example: + + Oracle: theUnsafe + PERC : m_unsafe_instance + Android: THE_ONE + */ + for ( Field field : fields ) { + if ( !field.getType().equals(Unsafe.class) ) + continue; + + final int modifiers = field.getModifiers(); + if ( !(Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) ) + continue; + + field.setAccessible(true); + try { + return (Unsafe)field.get(null); + } catch (IllegalAccessException e) { + // ignore + } + break; + } + + throw new UnsupportedOperationException(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet.java new file mode 100644 index 000000000..fbf3cb7fd --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +/** + * Factory for mapped sets. A mapped set can be used as a Structure of Arrays by + * linking together the view of two or more mapped objects. Changing the view + * of the mapped set, changes the corresponding view of all the mapped objects in + * the set. + */ +public class MappedSet { + + /** + * Creates a MappedSet by linking the specified MappedObjects. + * + * @return the mapped set. + */ + public static MappedSet2 create(MappedObject a, MappedObject b) { + return new MappedSet2(a, b); + } + + /** + * Creates a MappedSet by linking the specified MappedObjects. + * + * @return the mapped set. + */ + public static MappedSet3 create(MappedObject a, MappedObject b, MappedObject c) { + return new MappedSet3(a, b, c); + } + + /** + * Creates a MappedSet by linking the specified MappedObjects. + * + * @return the mapped set. + */ + public static MappedSet4 create(MappedObject a, MappedObject b, MappedObject c, MappedObject d) { + return new MappedSet4(a, b, c, d); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet2.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet2.java new file mode 100644 index 000000000..b597e128a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet2.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +/** MappedSet implementation for two MappedObjects. */ +public class MappedSet2 { + + private final MappedObject a, b; + + MappedSet2(MappedObject a, MappedObject b) { + this.a = a; + this.b = b; + } + + public int view; + + void view(int view) { + a.setViewAddress(a.getViewAddress(view)); + b.setViewAddress(b.getViewAddress(view)); + } + + public void next() { + this.a.next(); + this.b.next(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet3.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet3.java new file mode 100644 index 000000000..196d71f67 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet3.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +/** MappedSet implementation for three MappedObjects. */ +public class MappedSet3 { + + private final MappedObject a, b, c; + + MappedSet3(MappedObject a, MappedObject b, MappedObject c) { + this.a = a; + this.b = b; + this.c = c; + } + + public int view; + + void view(int view) { + a.setViewAddress(a.getViewAddress(view)); + b.setViewAddress(b.getViewAddress(view)); + c.setViewAddress(c.getViewAddress(view)); + } + + public void next() { + this.a.next(); + this.b.next(); + this.c.next(); + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet4.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet4.java new file mode 100644 index 000000000..bbb102a97 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedSet4.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +/** MappedSet implementation for four MappedObjects. */ +public class MappedSet4 { + + private final MappedObject a, b, c, d; + + MappedSet4(MappedObject a, MappedObject b, MappedObject c, MappedObject d) { + this.a = a; + this.b = b; + this.c = c; + this.d = d; + } + + public int view; + + void view(int view) { + a.setViewAddress(a.getViewAddress(view)); + b.setViewAddress(b.getViewAddress(view)); + c.setViewAddress(c.getViewAddress(view)); + d.setViewAddress(d.getViewAddress(view)); + } + + public void next() { + this.a.next(); + this.b.next(); + this.c.next(); + this.d.next(); + } +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedType.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedType.java new file mode 100644 index 000000000..52e991cbe --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/MappedType.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation marks a class as a mapped object, which will go under bytecode + * transformation at runtime. Mapped objects cannot be instantiated directly; a data + * buffer must be mapped first and the mapped object instance will then be used as a + * view on top of the buffer. Instead of a separate instance per "element" in the buffer, + * only a single instance is used to manage everything. See {@link MappedObject} + * for API details and {@link org.lwjgl.test.mapped.TestMappedObject} for examples. + *

    + * The instance fields of the annotated class should only be limited to primitive types or + * {@link java.nio.ByteBuffer}. Static fields are supported and they can have any type. + *

    + * The purpose of mapped objects is to reduce the memory requirements required for the type + * of data that are often used in OpenGL/OpenCL programming, while at the same time enabling + * clean Java code. There are also performance benefits related to not having to copy data + * between buffers and Java objects and the removal of bounds checking when accessing + * buffer data. + * + * @author Riven + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface MappedType { + + /** + * The number of bytes to add to the total byte size. + * SIZEOF will be calculated as SIZEOF = max(field_offset + field_length) + padding. + *

    + * Cannot be used with {@link #cacheLinePadding()}. + * + * @return the padding amount + */ + int padding() default 0; + + /** + * When true, SIZEOF will be increased (if necessary) so that it's a multiple of the CPU cache line size. + * Additionally, {@link MappedObject#malloc(int)} on the mapped object type will automatically use + * {@link CacheUtil#createByteBuffer(int)} instead of the unaligned {@link org.lwjgl.BufferUtils#createByteBuffer(int)}. + *

    + * Cannot be used with {@link #padding()}. + * + * @return if cache-line padding should be applied + * + * @see CacheUtil + */ + boolean cacheLinePadding() default false; + + /** + * The mapped data memory alignment, in bytes. + * + * @return the memory alignment + */ + int align() default 4; + + /** + * When autoGenerateOffsets is true, byte offsets of the mapped fields will + * be generated automatically. This is convenient for packed data. For manually + * aligned data, autoGenerateOffsets must be set to false and the user needs + * to manually specify byte offsets using the {@link MappedField} annotation. + * + * @return true if automatic byte offset generation is required. + */ + boolean autoGenerateOffsets() default true; + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/Pointer.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/Pointer.java new file mode 100644 index 000000000..305712d41 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/mapped/Pointer.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2011 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.mapped; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation can be used on long fields of {@link MappedObject} subclasses, + * to specify that the long value should be interpreted as a pointer. This + * will determine the actual byte size of the field at runtime (4 or 8 bytes). + * + * @author Spasi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Pointer { + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/tinyfd/TinyFileDialogs.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/tinyfd/TinyFileDialogs.java new file mode 100644 index 000000000..8a8f36d33 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/tinyfd/TinyFileDialogs.java @@ -0,0 +1,588 @@ +/* + * Copyright LWJGL. All rights reserved. + * License terms: https://www.lwjgl.org/license + * MACHINE GENERATED FILE, DO NOT EDIT + */ +package org.lwjgl.util.tinyfd; + +import javax.annotation.*; + +import java.nio.*; + +import org.lwjgl.*; + +import org.lwjgl.system.*; + +import static org.lwjgl.system.Checks.*; +import static org.lwjgl.system.MemoryStack.*; +import static org.lwjgl.system.MemoryUtil.*; + +/** + * Bindings to tiny file dialogs, a native dialog library with support for: + * + *

      + *
    • message / question
    • + *
    • input / password
    • + *
    • save file
    • + *
    • open file & multiple files
    • + *
    • select folder
    • + *
    • color picker
    • + *
    + * + *

    The dialogs can be forced into console mode.

    + */ +public class TinyFileDialogs { + + static { + Library.loadSystem(System::load, System::loadLibrary, TinyFileDialogs.class, "org.lwjgl.tinyfd", Platform.mapLibraryNameBundled("lwjgl_tinyfd")); + if (Platform.get() == Platform.WINDOWS) { + tinyfd_setGlobalInt("tinyfd_winUtf8", 1); + } + } + + /** Contains tinyfd current version number. */ + public static final String tinyfd_version = "tinyfd_version"; + + /** Contains info about requirements. */ + public static final String tinyfd_needs = "tinyfd_needs"; + + /** + * If you pass "tinyfd_query" as {@code aTitle}, the functions will not display the dialogs but will fill {@code tinyfd_response} with the retain solution + * and return 0 for console mode, 1 for graphic mode. + * + *

    Possible values for {@code tinyfd_response} are (all lowercase) for the graphic mode:

    + * + *
    
    +     * windows_wchar windows applescript kdialog zenity zenity3 matedialog
    +     * shellementary qarma yad python2-tkinter python3-tkinter python-dbus
    +     * perl-dbus gxmessage gmessage xmessage xdialog gdialog
    + * + *

    For the console mode:

    + * + *
    
    +     * dialog whiptail basicinput no_solution
    + */ + public static final String tinyfd_response = "tinyfd_response"; + + /** 0 (default) or 1 : on unix, prints the command line calls */ + public static final String tinyfd_verbose = "tinyfd_verbose"; + + /** 1 (default) or 0 : on unix, hide errors and warnings from called dialogs */ + public static final String tinyfd_silent = "tinyfd_silent"; + + /** Curses dialogs are difficult to use, on windows they are only ascii and uses the unix backslash */ + public static final String tinyfd_allowCursesDialogs = "tinyfd_allowCursesDialogs"; + + /** + * 0 (default) or 1. For unix & windows: 0 (graphic mode) or 1 (console mode). + * + *

    0: try to use a graphic solution, if it fails then it uses console mode.

    + * + *

    1: forces all dialogs into console mode even when an X server is present, it can use the package dialog or dialog.exe. On windows it only make sense + * for console applications

    + */ + public static final String tinyfd_forceConsole = "tinyfd_forceConsole"; + + /** + * 0 (default) or 1. + * + *

    Some systems don't set the environment variable {@code DISPLAY} even when a graphic display is present. Set this to 1 to tell tinyfiledialogs to + * assume the existence of a graphic display.

    + */ + public static final String tinyfd_assumeGraphicDisplay = "tinyfd_assumeGraphicDisplay"; + + /** + * On windows, set to 1 if you want to use UTF-8. + * + *

    LWJGL note: this is automatically set to 1.

    + */ + public static final String tinyfd_winUtf8 = "tinyfd_winUtf8"; + + protected TinyFileDialogs() { + throw new UnsupportedOperationException(); + } + + // --- [ tinyfd_getGlobalChar ] --- + + /** Unsafe version of: {@link #tinyfd_getGlobalChar getGlobalChar} */ + public static native long ntinyfd_getGlobalChar(long aCharVariableName); + + /** + * @param aCharVariableName one of:
    {@link #tinyfd_version version}{@link #tinyfd_needs needs}{@link #tinyfd_response response}
    + * + * @return {@code NULL} on error + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_getGlobalChar(@NativeType("char const *") ByteBuffer aCharVariableName) { + if (CHECKS) { + checkNT1(aCharVariableName); + } + long __result = ntinyfd_getGlobalChar(memAddress(aCharVariableName)); + return memASCIISafe(__result); + } + + /** + * @param aCharVariableName one of:
    {@link #tinyfd_version version}{@link #tinyfd_needs needs}{@link #tinyfd_response response}
    + * + * @return {@code NULL} on error + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_getGlobalChar(@NativeType("char const *") CharSequence aCharVariableName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(aCharVariableName, true); + long aCharVariableNameEncoded = stack.getPointerAddress(); + long __result = ntinyfd_getGlobalChar(aCharVariableNameEncoded); + return memASCIISafe(__result); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ tinyfd_getGlobalInt ] --- + + /** Unsafe version of: {@link #tinyfd_getGlobalInt getGlobalInt} */ + public static native int ntinyfd_getGlobalInt(long aIntVariableName); + + /** + * @param aIntVariableName one of:
    {@link #tinyfd_verbose verbose}{@link #tinyfd_silent silent}{@link #tinyfd_allowCursesDialogs allowCursesDialogs}{@link #tinyfd_forceConsole forceConsole}{@link #tinyfd_assumeGraphicDisplay assumeGraphicDisplay}{@link #tinyfd_winUtf8 winUtf8}
    + * + * @return -1 on error + */ + public static int tinyfd_getGlobalInt(@NativeType("char const *") ByteBuffer aIntVariableName) { + if (CHECKS) { + checkNT1(aIntVariableName); + } + return ntinyfd_getGlobalInt(memAddress(aIntVariableName)); + } + + /** + * @param aIntVariableName one of:
    {@link #tinyfd_verbose verbose}{@link #tinyfd_silent silent}{@link #tinyfd_allowCursesDialogs allowCursesDialogs}{@link #tinyfd_forceConsole forceConsole}{@link #tinyfd_assumeGraphicDisplay assumeGraphicDisplay}{@link #tinyfd_winUtf8 winUtf8}
    + * + * @return -1 on error + */ + public static int tinyfd_getGlobalInt(@NativeType("char const *") CharSequence aIntVariableName) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(aIntVariableName, true); + long aIntVariableNameEncoded = stack.getPointerAddress(); + return ntinyfd_getGlobalInt(aIntVariableNameEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ tinyfd_setGlobalInt ] --- + + /** Unsafe version of: {@link #tinyfd_setGlobalInt setGlobalInt} */ + public static native int ntinyfd_setGlobalInt(long aIntVariableName, int aValue); + + /** + * @param aIntVariableName one of:
    {@link #tinyfd_verbose verbose}{@link #tinyfd_silent silent}{@link #tinyfd_allowCursesDialogs allowCursesDialogs}{@link #tinyfd_forceConsole forceConsole}{@link #tinyfd_assumeGraphicDisplay assumeGraphicDisplay}{@link #tinyfd_winUtf8 winUtf8}
    + * + * @return -1 on error + */ + public static int tinyfd_setGlobalInt(@NativeType("char const *") ByteBuffer aIntVariableName, int aValue) { + if (CHECKS) { + checkNT1(aIntVariableName); + } + return ntinyfd_setGlobalInt(memAddress(aIntVariableName), aValue); + } + + /** + * @param aIntVariableName one of:
    {@link #tinyfd_verbose verbose}{@link #tinyfd_silent silent}{@link #tinyfd_allowCursesDialogs allowCursesDialogs}{@link #tinyfd_forceConsole forceConsole}{@link #tinyfd_assumeGraphicDisplay assumeGraphicDisplay}{@link #tinyfd_winUtf8 winUtf8}
    + * + * @return -1 on error + */ + public static int tinyfd_setGlobalInt(@NativeType("char const *") CharSequence aIntVariableName, int aValue) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nASCII(aIntVariableName, true); + long aIntVariableNameEncoded = stack.getPointerAddress(); + return ntinyfd_setGlobalInt(aIntVariableNameEncoded, aValue); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ tinyfd_beep ] --- + + public static native void tinyfd_beep(); + + // --- [ tinyfd_notifyPopup ] --- + + /** Unsafe version of: {@link #tinyfd_notifyPopup notifyPopup} */ + public static native int ntinyfd_notifyPopup(long aTitle, long aMessage, long aIconType); + + /** + * Displays a notification popup. + * + * @param aTitle the dialog title or {@code NULL} + * @param aMessage the message or {@code NULL}. It may contain \n and \t characters. + * @param aIconType the icon type. One of:
    "info""warning""error"
    + */ + public static int tinyfd_notifyPopup(@Nullable @NativeType("char const *") ByteBuffer aTitle, @Nullable @NativeType("char const *") ByteBuffer aMessage, @NativeType("char const *") ByteBuffer aIconType) { + if (CHECKS) { + checkNT1Safe(aTitle); + checkNT1Safe(aMessage); + checkNT1(aIconType); + } + return ntinyfd_notifyPopup(memAddressSafe(aTitle), memAddressSafe(aMessage), memAddress(aIconType)); + } + + /** + * Displays a notification popup. + * + * @param aTitle the dialog title or {@code NULL} + * @param aMessage the message or {@code NULL}. It may contain \n and \t characters. + * @param aIconType the icon type. One of:
    "info""warning""error"
    + */ + public static int tinyfd_notifyPopup(@Nullable @NativeType("char const *") CharSequence aTitle, @Nullable @NativeType("char const *") CharSequence aMessage, @NativeType("char const *") CharSequence aIconType) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(aTitle, true); + long aTitleEncoded = aTitle == null ? NULL : stack.getPointerAddress(); + stack.nUTF8Safe(aMessage, true); + long aMessageEncoded = aMessage == null ? NULL : stack.getPointerAddress(); + stack.nASCII(aIconType, true); + long aIconTypeEncoded = stack.getPointerAddress(); + return ntinyfd_notifyPopup(aTitleEncoded, aMessageEncoded, aIconTypeEncoded); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ tinyfd_messageBox ] --- + + /** Unsafe version of: {@link #tinyfd_messageBox messageBox} */ + public static native int ntinyfd_messageBox(long aTitle, long aMessage, long aDialogType, long aIconType, int aDefaultButton); + + /** + * Displays a message dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aMessage the message or {@code NULL}. It may contain \n and \t characters. + * @param aDialogType the dialog type. One of:
    "ok""okcancel""yesno""yesnocancel"
    + * @param aIconType the icon type. One of:
    "info""warning""error""question"
    + * @param aDefaultButton 0 for cancel/no, 1 for ok/yes + * + * @return 0 for cancel/no, 1 for ok/yes, 2 for no in yesnocancel + */ + @NativeType("int") + public static boolean tinyfd_messageBox(@Nullable @NativeType("char const *") ByteBuffer aTitle, @Nullable @NativeType("char const *") ByteBuffer aMessage, @NativeType("char const *") ByteBuffer aDialogType, @NativeType("char const *") ByteBuffer aIconType, @NativeType("int") boolean aDefaultButton) { + if (CHECKS) { + checkNT1Safe(aTitle); + checkNT1Safe(aMessage); + checkNT1(aDialogType); + checkNT1(aIconType); + } + return ntinyfd_messageBox(memAddressSafe(aTitle), memAddressSafe(aMessage), memAddress(aDialogType), memAddress(aIconType), aDefaultButton ? 1 : 0) != 0; + } + + /** + * Displays a message dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aMessage the message or {@code NULL}. It may contain \n and \t characters. + * @param aDialogType the dialog type. One of:
    "ok""okcancel""yesno""yesnocancel"
    + * @param aIconType the icon type. One of:
    "info""warning""error""question"
    + * @param aDefaultButton 0 for cancel/no, 1 for ok/yes + * + * @return 0 for cancel/no, 1 for ok/yes, 2 for no in yesnocancel + */ + @NativeType("int") + public static boolean tinyfd_messageBox(@Nullable @NativeType("char const *") CharSequence aTitle, @Nullable @NativeType("char const *") CharSequence aMessage, @NativeType("char const *") CharSequence aDialogType, @NativeType("char const *") CharSequence aIconType, @NativeType("int") boolean aDefaultButton) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(aTitle, true); + long aTitleEncoded = aTitle == null ? NULL : stack.getPointerAddress(); + stack.nUTF8Safe(aMessage, true); + long aMessageEncoded = aMessage == null ? NULL : stack.getPointerAddress(); + stack.nASCII(aDialogType, true); + long aDialogTypeEncoded = stack.getPointerAddress(); + stack.nASCII(aIconType, true); + long aIconTypeEncoded = stack.getPointerAddress(); + return ntinyfd_messageBox(aTitleEncoded, aMessageEncoded, aDialogTypeEncoded, aIconTypeEncoded, aDefaultButton ? 1 : 0) != 0; + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ tinyfd_inputBox ] --- + + /** Unsafe version of: {@link #tinyfd_inputBox inputBox} */ + public static native long ntinyfd_inputBox(long aTitle, long aMessage, long aDefaultInput); + + /** + * Displays an input dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aMessage the message or {@code NULL}. May NOT contain \n and \t characters on Windows. + * @param aDefaultInput if {@code NULL} it's a password box + * + * @return the input value or {@code NULL} on cancel + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_inputBox(@Nullable @NativeType("char const *") ByteBuffer aTitle, @Nullable @NativeType("char const *") ByteBuffer aMessage, @Nullable @NativeType("char const *") ByteBuffer aDefaultInput) { + if (CHECKS) { + checkNT1Safe(aTitle); + checkNT1Safe(aMessage); + checkNT1Safe(aDefaultInput); + } + long __result = ntinyfd_inputBox(memAddressSafe(aTitle), memAddressSafe(aMessage), memAddressSafe(aDefaultInput)); + return memUTF8Safe(__result); + } + + /** + * Displays an input dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aMessage the message or {@code NULL}. May NOT contain \n and \t characters on Windows. + * @param aDefaultInput if {@code NULL} it's a password box + * + * @return the input value or {@code NULL} on cancel + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_inputBox(@Nullable @NativeType("char const *") CharSequence aTitle, @Nullable @NativeType("char const *") CharSequence aMessage, @Nullable @NativeType("char const *") CharSequence aDefaultInput) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(aTitle, true); + long aTitleEncoded = aTitle == null ? NULL : stack.getPointerAddress(); + stack.nUTF8Safe(aMessage, true); + long aMessageEncoded = aMessage == null ? NULL : stack.getPointerAddress(); + stack.nUTF8Safe(aDefaultInput, true); + long aDefaultInputEncoded = aDefaultInput == null ? NULL : stack.getPointerAddress(); + long __result = ntinyfd_inputBox(aTitleEncoded, aMessageEncoded, aDefaultInputEncoded); + return memUTF8Safe(__result); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ tinyfd_saveFileDialog ] --- + + /** + * Unsafe version of: {@link #tinyfd_saveFileDialog saveFileDialog} + * + * @param aNumOfFilterPatterns the number of patterns in {@code aFilterPatterns} + */ + public static native long ntinyfd_saveFileDialog(long aTitle, long aDefaultPathAndFile, int aNumOfFilterPatterns, long aFilterPatterns, long aSingleFilterDescription); + + /** + * Displays a file save dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aDefaultPathAndFile the default path and/or file or {@code NULL} + * @param aFilterPatterns an array of file type patterns ({@code NULL} or {"*.jpg","*.png"} + * @param aSingleFilterDescription {@code NULL} or "image files" + * + * @return the selected file path or {@code NULL} on cancel + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_saveFileDialog(@Nullable @NativeType("char const *") ByteBuffer aTitle, @Nullable @NativeType("char const *") ByteBuffer aDefaultPathAndFile, @Nullable @NativeType("char const * const *") PointerBuffer aFilterPatterns, @Nullable @NativeType("char const *") ByteBuffer aSingleFilterDescription) { + if (CHECKS) { + checkNT1Safe(aTitle); + checkNT1Safe(aDefaultPathAndFile); + checkNT1Safe(aSingleFilterDescription); + } + long __result = ntinyfd_saveFileDialog(memAddressSafe(aTitle), memAddressSafe(aDefaultPathAndFile), remainingSafe(aFilterPatterns), memAddressSafe(aFilterPatterns), memAddressSafe(aSingleFilterDescription)); + return memUTF8Safe(__result); + } + + /** + * Displays a file save dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aDefaultPathAndFile the default path and/or file or {@code NULL} + * @param aFilterPatterns an array of file type patterns ({@code NULL} or {"*.jpg","*.png"} + * @param aSingleFilterDescription {@code NULL} or "image files" + * + * @return the selected file path or {@code NULL} on cancel + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_saveFileDialog(@Nullable @NativeType("char const *") CharSequence aTitle, @Nullable @NativeType("char const *") CharSequence aDefaultPathAndFile, @Nullable @NativeType("char const * const *") PointerBuffer aFilterPatterns, @Nullable @NativeType("char const *") CharSequence aSingleFilterDescription) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(aTitle, true); + long aTitleEncoded = aTitle == null ? NULL : stack.getPointerAddress(); + stack.nUTF8Safe(aDefaultPathAndFile, true); + long aDefaultPathAndFileEncoded = aDefaultPathAndFile == null ? NULL : stack.getPointerAddress(); + stack.nUTF8Safe(aSingleFilterDescription, true); + long aSingleFilterDescriptionEncoded = aSingleFilterDescription == null ? NULL : stack.getPointerAddress(); + long __result = ntinyfd_saveFileDialog(aTitleEncoded, aDefaultPathAndFileEncoded, remainingSafe(aFilterPatterns), memAddressSafe(aFilterPatterns), aSingleFilterDescriptionEncoded); + return memUTF8Safe(__result); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ tinyfd_openFileDialog ] --- + + /** + * Unsafe version of: {@link #tinyfd_openFileDialog openFileDialog} + * + * @param aNumOfFilterPatterns the number of patterns in {@code aFilterPatterns} + */ + public static native long ntinyfd_openFileDialog(long aTitle, long aDefaultPathAndFile, int aNumOfFilterPatterns, long aFilterPatterns, long aSingleFilterDescription, int aAllowMultipleSelects); + + /** + * Displays a file open dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aDefaultPathAndFile the default path and/or file or {@code NULL} + * @param aFilterPatterns an array of file type patterns ({@code NULL} or {"*.jpg","*.png"} + * @param aSingleFilterDescription {@code NULL} or "image files" + * @param aAllowMultipleSelects if true, multiple selections are allowed + * + * @return the file(s) selected or {@code NULL} on cancel. In case of multiple files, the separator is '|'. + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_openFileDialog(@Nullable @NativeType("char const *") ByteBuffer aTitle, @Nullable @NativeType("char const *") ByteBuffer aDefaultPathAndFile, @Nullable @NativeType("char const * const *") PointerBuffer aFilterPatterns, @Nullable @NativeType("char const *") ByteBuffer aSingleFilterDescription, @NativeType("int") boolean aAllowMultipleSelects) { + if (CHECKS) { + checkNT1Safe(aTitle); + checkNT1Safe(aDefaultPathAndFile); + checkNT1Safe(aSingleFilterDescription); + } + long __result = ntinyfd_openFileDialog(memAddressSafe(aTitle), memAddressSafe(aDefaultPathAndFile), remainingSafe(aFilterPatterns), memAddressSafe(aFilterPatterns), memAddressSafe(aSingleFilterDescription), aAllowMultipleSelects ? 1 : 0); + return memUTF8Safe(__result); + } + + /** + * Displays a file open dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aDefaultPathAndFile the default path and/or file or {@code NULL} + * @param aFilterPatterns an array of file type patterns ({@code NULL} or {"*.jpg","*.png"} + * @param aSingleFilterDescription {@code NULL} or "image files" + * @param aAllowMultipleSelects if true, multiple selections are allowed + * + * @return the file(s) selected or {@code NULL} on cancel. In case of multiple files, the separator is '|'. + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_openFileDialog(@Nullable @NativeType("char const *") CharSequence aTitle, @Nullable @NativeType("char const *") CharSequence aDefaultPathAndFile, @Nullable @NativeType("char const * const *") PointerBuffer aFilterPatterns, @Nullable @NativeType("char const *") CharSequence aSingleFilterDescription, @NativeType("int") boolean aAllowMultipleSelects) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(aTitle, true); + long aTitleEncoded = aTitle == null ? NULL : stack.getPointerAddress(); + stack.nUTF8Safe(aDefaultPathAndFile, true); + long aDefaultPathAndFileEncoded = aDefaultPathAndFile == null ? NULL : stack.getPointerAddress(); + stack.nUTF8Safe(aSingleFilterDescription, true); + long aSingleFilterDescriptionEncoded = aSingleFilterDescription == null ? NULL : stack.getPointerAddress(); + long __result = ntinyfd_openFileDialog(aTitleEncoded, aDefaultPathAndFileEncoded, remainingSafe(aFilterPatterns), memAddressSafe(aFilterPatterns), aSingleFilterDescriptionEncoded, aAllowMultipleSelects ? 1 : 0); + return memUTF8Safe(__result); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ tinyfd_selectFolderDialog ] --- + + /** Unsafe version of: {@link #tinyfd_selectFolderDialog selectFolderDialog} */ + public static native long ntinyfd_selectFolderDialog(long aTitle, long aDefaultPath); + + /** + * Displays a folder selection dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aDefaultPath the default path or {@code NULL} + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_selectFolderDialog(@Nullable @NativeType("char const *") ByteBuffer aTitle, @NativeType("char const *") ByteBuffer aDefaultPath) { + if (CHECKS) { + checkNT1Safe(aTitle); + checkNT1(aDefaultPath); + } + long __result = ntinyfd_selectFolderDialog(memAddressSafe(aTitle), memAddress(aDefaultPath)); + return memUTF8Safe(__result); + } + + /** + * Displays a folder selection dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aDefaultPath the default path or {@code NULL} + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_selectFolderDialog(@Nullable @NativeType("char const *") CharSequence aTitle, @NativeType("char const *") CharSequence aDefaultPath) { + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(aTitle, true); + long aTitleEncoded = aTitle == null ? NULL : stack.getPointerAddress(); + stack.nUTF8(aDefaultPath, true); + long aDefaultPathEncoded = stack.getPointerAddress(); + long __result = ntinyfd_selectFolderDialog(aTitleEncoded, aDefaultPathEncoded); + return memUTF8Safe(__result); + } finally { + stack.setPointer(stackPointer); + } + } + + // --- [ tinyfd_colorChooser ] --- + + /** Unsafe version of: {@link #tinyfd_colorChooser colorChooser} */ + public static native long ntinyfd_colorChooser(long aTitle, long aDefaultHexRGB, long aDefaultRGB, long aoResultRGB); + + /** + * Displays a color chooser dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aDefaultHexRGB {@code NULL} or "#FF0000" + * @param aDefaultRGB { 0 , 255 , 255 }. Used only if {@code aDefaultHexRGB} is {@code NULL}. + * @param aoResultRGB returns the selected color. {@code aDefaultRGB} and {@code aoResultRGB} can be the same array. + * + * @return the selected hexcolor as a string "#FF0000" or {@code NULL} on cancel + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_colorChooser(@Nullable @NativeType("char const *") ByteBuffer aTitle, @Nullable @NativeType("char const *") ByteBuffer aDefaultHexRGB, @Nullable @NativeType("unsigned char *") ByteBuffer aDefaultRGB, @NativeType("unsigned char *") ByteBuffer aoResultRGB) { + if (CHECKS) { + checkNT1Safe(aTitle); + checkNT1Safe(aDefaultHexRGB); + checkSafe(aDefaultRGB, 3); + check(aoResultRGB, 3); + } + long __result = ntinyfd_colorChooser(memAddressSafe(aTitle), memAddressSafe(aDefaultHexRGB), memAddressSafe(aDefaultRGB), memAddress(aoResultRGB)); + return memUTF8Safe(__result); + } + + /** + * Displays a color chooser dialog. + * + * @param aTitle the dialog title or {@code NULL} + * @param aDefaultHexRGB {@code NULL} or "#FF0000" + * @param aDefaultRGB { 0 , 255 , 255 }. Used only if {@code aDefaultHexRGB} is {@code NULL}. + * @param aoResultRGB returns the selected color. {@code aDefaultRGB} and {@code aoResultRGB} can be the same array. + * + * @return the selected hexcolor as a string "#FF0000" or {@code NULL} on cancel + */ + @Nullable + @NativeType("char const *") + public static String tinyfd_colorChooser(@Nullable @NativeType("char const *") CharSequence aTitle, @Nullable @NativeType("char const *") CharSequence aDefaultHexRGB, @Nullable @NativeType("unsigned char *") ByteBuffer aDefaultRGB, @NativeType("unsigned char *") ByteBuffer aoResultRGB) { + if (CHECKS) { + checkSafe(aDefaultRGB, 3); + check(aoResultRGB, 3); + } + MemoryStack stack = stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8Safe(aTitle, true); + long aTitleEncoded = aTitle == null ? NULL : stack.getPointerAddress(); + stack.nASCIISafe(aDefaultHexRGB, true); + long aDefaultHexRGBEncoded = aDefaultHexRGB == null ? NULL : stack.getPointerAddress(); + long __result = ntinyfd_colorChooser(aTitleEncoded, aDefaultHexRGBEncoded, memAddressSafe(aDefaultRGB), memAddress(aoResultRGB)); + return memUTF8Safe(__result); + } finally { + stack.setPointer(stackPointer); + } + } + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix.java new file mode 100644 index 000000000..4346d562d --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Base class for matrices. When a matrix is constructed it will be the identity + * matrix unless otherwise stated. + * + * @author cix_foo + * @version $Revision$ + * $Id$ + */ +public abstract class Matrix implements Serializable { + + /** + * Constructor for Matrix. + */ + protected Matrix() { + super(); + } + + /** + * Set this matrix to be the identity matrix. + * @return this + */ + public abstract Matrix setIdentity(); + + + /** + * Invert this matrix + * @return this + */ + public abstract Matrix invert(); + + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public abstract Matrix load(FloatBuffer buf); + + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (mathematical) order. + * + * @param buf A float buffer to read from + * @return this + */ + public abstract Matrix loadTranspose(FloatBuffer buf); + + + /** + * Negate this matrix + * @return this + */ + public abstract Matrix negate(); + + + /** + * Store this matrix in a float buffer. The matrix is stored in column + * major (openGL) order. + * @param buf The buffer to store this matrix in + * @return this + */ + public abstract Matrix store(FloatBuffer buf); + + + /** + * Store this matrix in a float buffer. The matrix is stored in row + * major (maths) order. + * @param buf The buffer to store this matrix in + * @return this + */ + public abstract Matrix storeTranspose(FloatBuffer buf); + + + /** + * Transpose this matrix + * @return this + */ + public abstract Matrix transpose(); + + + /** + * Set this matrix to 0. + * @return this + */ + public abstract Matrix setZero(); + + + /** + * @return the determinant of the matrix + */ + public abstract float determinant(); + + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix2f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix2f.java new file mode 100644 index 000000000..2f9e2ffda --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix2f.java @@ -0,0 +1,400 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 2x2 matrix + * + * @author cix_foo + * @version $Revision$ + * $Id$ + */ + +public class Matrix2f extends Matrix implements Serializable { + + private static final long serialVersionUID = 1L; + + public float m00, m01, m10, m11; + + /** + * Constructor for Matrix2f. The matrix is initialised to the identity. + */ + public Matrix2f() { + setIdentity(); + } + + /** + * Constructor + */ + public Matrix2f(Matrix2f src) { + load(src); + } + + /** + * Load from another matrix + * @param src The source matrix + * @return this + */ + public Matrix2f load(Matrix2f src) { + return load(src, this); + } + + /** + * Copy the source matrix to the destination matrix. + * @param src The source matrix + * @param dest The destination matrix, or null if a new one should be created. + * @return The copied matrix + */ + public static Matrix2f load(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = src.m00; + dest.m01 = src.m01; + dest.m10 = src.m10; + dest.m11 = src.m11; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (mathematical) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column + * major (openGL) order. + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m10); + buf.put(m11); + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row + * major (maths) order. + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m01); + buf.put(m11); + return this; + } + + + + /** + * Add two matrices together and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f add(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f sub(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f mul(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + float m00 = left.m00 * right.m00 + left.m10 * right.m01; + float m01 = left.m01 * right.m00 + left.m11 * right.m01; + float m10 = left.m00 * right.m10 + left.m10 * right.m11; + float m11 = left.m01 * right.m10 + left.m11 * right.m11; + + dest.m00 = m00; + dest.m01 = m01; + dest.m10 = m10; + dest.m11 = m11; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination + * vector. + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector2f transform(Matrix2f left, Vector2f right, Vector2f dest) { + if (dest == null) + dest = new Vector2f(); + + float x = left.m00 * right.x + left.m10 * right.y; + float y = left.m01 * right.x + left.m11 * right.y; + + dest.x = x; + dest.y = y; + + return dest; + } + + /** + * Transpose this matrix + * @return this + */ + public Matrix transpose() { + return transpose(this); + } + + /** + * Transpose this matrix and place the result in another matrix. + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix2f transpose(Matrix2f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result in the destination matrix. + * @param src The source matrix or null if a new matrix is to be created + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix2f transpose(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + float m01 = src.m10; + float m10 = src.m01; + + dest.m01 = m01; + dest.m10 = m10; + + return dest; + } + + /** + * Invert this matrix + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and place the result in the destination matrix. + * @param src The source matrix to be inverted + * @param dest The destination matrix or null if a new matrix is to be created + * @return The inverted matrix, or null if source can't be reverted. + */ + public static Matrix2f invert(Matrix2f src, Matrix2f dest) { + /* + *inv(A) = 1/det(A) * adj(A); + */ + + float determinant = src.determinant(); + if (determinant != 0) { + if (dest == null) + dest = new Matrix2f(); + float determinant_inv = 1f/determinant; + float t00 = src.m11*determinant_inv; + float t01 = -src.m01*determinant_inv; + float t11 = src.m00*determinant_inv; + float t10 = -src.m10*determinant_inv; + + dest.m00 = t00; + dest.m01 = t01; + dest.m10 = t10; + dest.m11 = t11; + return dest; + } else + return null; + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append('\n'); + return buf.toString(); + } + + /** + * Negate this matrix + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and stash the result in another matrix. + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix2f negate(Matrix2f dest) { + return negate(this, dest); + } + + /** + * Negate the source matrix and stash the result in the destination matrix. + * @param src The source matrix to be negated + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public static Matrix2f negate(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m01; + dest.m10 = -src.m10; + dest.m11 = -src.m11; + + return dest; + } + + /** + * Set this matrix to be the identity matrix. + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the source matrix to be the identity matrix. + * @param src The matrix to set to the identity. + * @return The source matrix + */ + public static Matrix2f setIdentity(Matrix2f src) { + src.m00 = 1.0f; + src.m01 = 0.0f; + src.m10 = 0.0f; + src.m11 = 1.0f; + return src; + } + + /** + * Set this matrix to 0. + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + public static Matrix2f setZero(Matrix2f src) { + src.m00 = 0.0f; + src.m01 = 0.0f; + src.m10 = 0.0f; + src.m11 = 0.0f; + return src; + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Matrix#determinant() + */ + public float determinant() { + return m00 * m11 - m01*m10; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix3f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix3f.java new file mode 100644 index 000000000..63c20de69 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix3f.java @@ -0,0 +1,510 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 3x3 matrix. + * + * @author cix_foo + * @version $Revision$ + * $Id$ + */ + +public class Matrix3f extends Matrix implements Serializable { + + private static final long serialVersionUID = 1L; + + public float m00, + m01, + m02, + m10, + m11, + m12, + m20, + m21, + m22; + + /** + * Constructor for Matrix3f. Matrix is initialised to the identity. + */ + public Matrix3f() { + super(); + setIdentity(); + } + + /** + * Load from another matrix + * @param src The source matrix + * @return this + */ + public Matrix3f load(Matrix3f src) { + return load(src, this); + } + + /** + * Copy source matrix to destination matrix + * @param src The source matrix + * @param dest The destination matrix, or null of a new matrix is to be created + * @return The copied matrix + */ + public static Matrix3f load(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = src.m00; + dest.m10 = src.m10; + dest.m20 = src.m20; + dest.m01 = src.m01; + dest.m11 = src.m11; + dest.m21 = src.m21; + dest.m02 = src.m02; + dest.m12 = src.m12; + dest.m22 = src.m22; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m02 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + m12 = buf.get(); + m20 = buf.get(); + m21 = buf.get(); + m22 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (maths) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m20 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + m21 = buf.get(); + m02 = buf.get(); + m12 = buf.get(); + m22 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column + * major (openGL) order. + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m20); + buf.put(m21); + buf.put(m22); + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row + * major (maths) order. + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m20); + buf.put(m01); + buf.put(m11); + buf.put(m21); + buf.put(m02); + buf.put(m12); + buf.put(m22); + return this; + } + + /** + * Add two matrices together and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f add(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m02 = left.m02 + right.m02; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + dest.m12 = left.m12 + right.m12; + dest.m20 = left.m20 + right.m20; + dest.m21 = left.m21 + right.m21; + dest.m22 = left.m22 + right.m22; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f sub(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m02 = left.m02 - right.m02; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + dest.m12 = left.m12 - right.m12; + dest.m20 = left.m20 - right.m20; + dest.m21 = left.m21 - right.m21; + dest.m22 = left.m22 - right.m22; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f mul(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + float m00 = + left.m00 * right.m00 + left.m10 * right.m01 + left.m20 * right.m02; + float m01 = + left.m01 * right.m00 + left.m11 * right.m01 + left.m21 * right.m02; + float m02 = + left.m02 * right.m00 + left.m12 * right.m01 + left.m22 * right.m02; + float m10 = + left.m00 * right.m10 + left.m10 * right.m11 + left.m20 * right.m12; + float m11 = + left.m01 * right.m10 + left.m11 * right.m11 + left.m21 * right.m12; + float m12 = + left.m02 * right.m10 + left.m12 * right.m11 + left.m22 * right.m12; + float m20 = + left.m00 * right.m20 + left.m10 * right.m21 + left.m20 * right.m22; + float m21 = + left.m01 * right.m20 + left.m11 * right.m21 + left.m21 * right.m22; + float m22 = + left.m02 * right.m20 + left.m12 * right.m21 + left.m22 * right.m22; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination + * vector. + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector3f transform(Matrix3f left, Vector3f right, Vector3f dest) { + if (dest == null) + dest = new Vector3f(); + + float x = left.m00 * right.x + left.m10 * right.y + left.m20 * right.z; + float y = left.m01 * right.x + left.m11 * right.y + left.m21 * right.z; + float z = left.m02 * right.x + left.m12 * right.y + left.m22 * right.z; + + dest.x = x; + dest.y = y; + dest.z = z; + + return dest; + } + + /** + * Transpose this matrix + * @return this + */ + public Matrix transpose() { + return transpose(this, this); + } + + /** + * Transpose this matrix and place the result in another matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix3f transpose(Matrix3f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result into the destination matrix + * @param src The source matrix to be transposed + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix3f transpose(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + float m00 = src.m00; + float m01 = src.m10; + float m02 = src.m20; + float m10 = src.m01; + float m11 = src.m11; + float m12 = src.m21; + float m20 = src.m02; + float m21 = src.m12; + float m22 = src.m22; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + return dest; + } + + /** + * @return the determinant of the matrix + */ + public float determinant() { + float f = + m00 * (m11 * m22 - m12 * m21) + + m01 * (m12 * m20 - m10 * m22) + + m02 * (m10 * m21 - m11 * m20); + return f; + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append(m20).append(' ').append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append(m21).append(' ').append('\n'); + buf.append(m02).append(' ').append(m12).append(' ').append(m22).append(' ').append('\n'); + return buf.toString(); + } + + /** + * Invert this matrix + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and put the result into the destination matrix + * @param src The source matrix to be inverted + * @param dest The destination matrix, or null if a new one is to be created + * @return The inverted matrix if successful, null otherwise + */ + public static Matrix3f invert(Matrix3f src, Matrix3f dest) { + float determinant = src.determinant(); + + if (determinant != 0) { + if (dest == null) + dest = new Matrix3f(); + /* do it the ordinary way + * + * inv(A) = 1/det(A) * adj(T), where adj(T) = transpose(Conjugate Matrix) + * + * m00 m01 m02 + * m10 m11 m12 + * m20 m21 m22 + */ + float determinant_inv = 1f/determinant; + + // get the conjugate matrix + float t00 = src.m11 * src.m22 - src.m12* src.m21; + float t01 = - src.m10 * src.m22 + src.m12 * src.m20; + float t02 = src.m10 * src.m21 - src.m11 * src.m20; + float t10 = - src.m01 * src.m22 + src.m02 * src.m21; + float t11 = src.m00 * src.m22 - src.m02 * src.m20; + float t12 = - src.m00 * src.m21 + src.m01 * src.m20; + float t20 = src.m01 * src.m12 - src.m02 * src.m11; + float t21 = -src.m00 * src.m12 + src.m02 * src.m10; + float t22 = src.m00 * src.m11 - src.m01 * src.m10; + + dest.m00 = t00*determinant_inv; + dest.m11 = t11*determinant_inv; + dest.m22 = t22*determinant_inv; + dest.m01 = t10*determinant_inv; + dest.m10 = t01*determinant_inv; + dest.m20 = t02*determinant_inv; + dest.m02 = t20*determinant_inv; + dest.m12 = t21*determinant_inv; + dest.m21 = t12*determinant_inv; + return dest; + } else + return null; + } + + + /** + * Negate this matrix + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix3f negate(Matrix3f dest) { + return negate(this, dest); + } + + /** + * Negate the source matrix and place the result in the destination matrix. + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public static Matrix3f negate(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m02; + dest.m02 = -src.m01; + dest.m10 = -src.m10; + dest.m11 = -src.m12; + dest.m12 = -src.m11; + dest.m20 = -src.m20; + dest.m21 = -src.m22; + dest.m22 = -src.m21; + return dest; + } + + /** + * Set this matrix to be the identity matrix. + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the matrix to be the identity matrix. + * @param m The matrix to be set to the identity + * @return m + */ + public static Matrix3f setIdentity(Matrix3f m) { + m.m00 = 1.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m10 = 0.0f; + m.m11 = 1.0f; + m.m12 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 1.0f; + return m; + } + + /** + * Set this matrix to 0. + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + /** + * Set the matrix matrix to 0. + * @param m The matrix to be set to 0 + * @return m + */ + public static Matrix3f setZero(Matrix3f m) { + m.m00 = 0.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m10 = 0.0f; + m.m11 = 0.0f; + m.m12 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 0.0f; + return m; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix4f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix4f.java new file mode 100644 index 000000000..b24dca626 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Matrix4f.java @@ -0,0 +1,849 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * Holds a 4x4 float matrix. + * + * @author foo + */ +public class Matrix4f extends Matrix implements Serializable { + private static final long serialVersionUID = 1L; + + public float m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33; + + /** + * Construct a new matrix, initialized to the identity. + */ + public Matrix4f() { + super(); + setIdentity(); + } + + public Matrix4f(final Matrix4f src) { + super(); + load(src); + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append(m20).append(' ').append(m30).append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append(m21).append(' ').append(m31).append('\n'); + buf.append(m02).append(' ').append(m12).append(' ').append(m22).append(' ').append(m32).append('\n'); + buf.append(m03).append(' ').append(m13).append(' ').append(m23).append(' ').append(m33).append('\n'); + return buf.toString(); + } + + /** + * Set this matrix to be the identity matrix. + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the given matrix to be the identity matrix. + * @param m The matrix to set to the identity + * @return m + */ + public static Matrix4f setIdentity(Matrix4f m) { + m.m00 = 1.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m03 = 0.0f; + m.m10 = 0.0f; + m.m11 = 1.0f; + m.m12 = 0.0f; + m.m13 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 1.0f; + m.m23 = 0.0f; + m.m30 = 0.0f; + m.m31 = 0.0f; + m.m32 = 0.0f; + m.m33 = 1.0f; + + return m; + } + + /** + * Set this matrix to 0. + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + /** + * Set the given matrix to 0. + * @param m The matrix to set to 0 + * @return m + */ + public static Matrix4f setZero(Matrix4f m) { + m.m00 = 0.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m03 = 0.0f; + m.m10 = 0.0f; + m.m11 = 0.0f; + m.m12 = 0.0f; + m.m13 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 0.0f; + m.m23 = 0.0f; + m.m30 = 0.0f; + m.m31 = 0.0f; + m.m32 = 0.0f; + m.m33 = 0.0f; + + return m; + } + + /** + * Load from another matrix4f + * @param src The source matrix + * @return this + */ + public Matrix4f load(Matrix4f src) { + return load(src, this); + } + + /** + * Copy the source matrix to the destination matrix + * @param src The source matrix + * @param dest The destination matrix, or null of a new one is to be created + * @return The copied matrix + */ + public static Matrix4f load(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + dest.m00 = src.m00; + dest.m01 = src.m01; + dest.m02 = src.m02; + dest.m03 = src.m03; + dest.m10 = src.m10; + dest.m11 = src.m11; + dest.m12 = src.m12; + dest.m13 = src.m13; + dest.m20 = src.m20; + dest.m21 = src.m21; + dest.m22 = src.m22; + dest.m23 = src.m23; + dest.m30 = src.m30; + dest.m31 = src.m31; + dest.m32 = src.m32; + dest.m33 = src.m33; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m02 = buf.get(); + m03 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + m12 = buf.get(); + m13 = buf.get(); + m20 = buf.get(); + m21 = buf.get(); + m22 = buf.get(); + m23 = buf.get(); + m30 = buf.get(); + m31 = buf.get(); + m32 = buf.get(); + m33 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (maths) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m20 = buf.get(); + m30 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + m21 = buf.get(); + m31 = buf.get(); + m02 = buf.get(); + m12 = buf.get(); + m22 = buf.get(); + m32 = buf.get(); + m03 = buf.get(); + m13 = buf.get(); + m23 = buf.get(); + m33 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column + * major (openGL) order. + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m03); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m13); + buf.put(m20); + buf.put(m21); + buf.put(m22); + buf.put(m23); + buf.put(m30); + buf.put(m31); + buf.put(m32); + buf.put(m33); + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row + * major (maths) order. + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m20); + buf.put(m30); + buf.put(m01); + buf.put(m11); + buf.put(m21); + buf.put(m31); + buf.put(m02); + buf.put(m12); + buf.put(m22); + buf.put(m32); + buf.put(m03); + buf.put(m13); + buf.put(m23); + buf.put(m33); + return this; + } + + /** + * Store the rotation portion of this matrix in a float buffer. The matrix is stored in column + * major (openGL) order. + * @param buf The buffer to store this matrix in + */ + public Matrix store3f(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m20); + buf.put(m21); + buf.put(m22); + return this; + } + + /** + * Add two matrices together and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f add(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m02 = left.m02 + right.m02; + dest.m03 = left.m03 + right.m03; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + dest.m12 = left.m12 + right.m12; + dest.m13 = left.m13 + right.m13; + dest.m20 = left.m20 + right.m20; + dest.m21 = left.m21 + right.m21; + dest.m22 = left.m22 + right.m22; + dest.m23 = left.m23 + right.m23; + dest.m30 = left.m30 + right.m30; + dest.m31 = left.m31 + right.m31; + dest.m32 = left.m32 + right.m32; + dest.m33 = left.m33 + right.m33; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f sub(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m02 = left.m02 - right.m02; + dest.m03 = left.m03 - right.m03; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + dest.m12 = left.m12 - right.m12; + dest.m13 = left.m13 - right.m13; + dest.m20 = left.m20 - right.m20; + dest.m21 = left.m21 - right.m21; + dest.m22 = left.m22 - right.m22; + dest.m23 = left.m23 - right.m23; + dest.m30 = left.m30 - right.m30; + dest.m31 = left.m31 - right.m31; + dest.m32 = left.m32 - right.m32; + dest.m33 = left.m33 - right.m33; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f mul(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + float m00 = left.m00 * right.m00 + left.m10 * right.m01 + left.m20 * right.m02 + left.m30 * right.m03; + float m01 = left.m01 * right.m00 + left.m11 * right.m01 + left.m21 * right.m02 + left.m31 * right.m03; + float m02 = left.m02 * right.m00 + left.m12 * right.m01 + left.m22 * right.m02 + left.m32 * right.m03; + float m03 = left.m03 * right.m00 + left.m13 * right.m01 + left.m23 * right.m02 + left.m33 * right.m03; + float m10 = left.m00 * right.m10 + left.m10 * right.m11 + left.m20 * right.m12 + left.m30 * right.m13; + float m11 = left.m01 * right.m10 + left.m11 * right.m11 + left.m21 * right.m12 + left.m31 * right.m13; + float m12 = left.m02 * right.m10 + left.m12 * right.m11 + left.m22 * right.m12 + left.m32 * right.m13; + float m13 = left.m03 * right.m10 + left.m13 * right.m11 + left.m23 * right.m12 + left.m33 * right.m13; + float m20 = left.m00 * right.m20 + left.m10 * right.m21 + left.m20 * right.m22 + left.m30 * right.m23; + float m21 = left.m01 * right.m20 + left.m11 * right.m21 + left.m21 * right.m22 + left.m31 * right.m23; + float m22 = left.m02 * right.m20 + left.m12 * right.m21 + left.m22 * right.m22 + left.m32 * right.m23; + float m23 = left.m03 * right.m20 + left.m13 * right.m21 + left.m23 * right.m22 + left.m33 * right.m23; + float m30 = left.m00 * right.m30 + left.m10 * right.m31 + left.m20 * right.m32 + left.m30 * right.m33; + float m31 = left.m01 * right.m30 + left.m11 * right.m31 + left.m21 * right.m32 + left.m31 * right.m33; + float m32 = left.m02 * right.m30 + left.m12 * right.m31 + left.m22 * right.m32 + left.m32 * right.m33; + float m33 = left.m03 * right.m30 + left.m13 * right.m31 + left.m23 * right.m32 + left.m33 * right.m33; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m03 = m03; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m13 = m13; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + dest.m23 = m23; + dest.m30 = m30; + dest.m31 = m31; + dest.m32 = m32; + dest.m33 = m33; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination + * vector. + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector4f transform(Matrix4f left, Vector4f right, Vector4f dest) { + if (dest == null) + dest = new Vector4f(); + + float x = left.m00 * right.x + left.m10 * right.y + left.m20 * right.z + left.m30 * right.w; + float y = left.m01 * right.x + left.m11 * right.y + left.m21 * right.z + left.m31 * right.w; + float z = left.m02 * right.x + left.m12 * right.y + left.m22 * right.z + left.m32 * right.w; + float w = left.m03 * right.x + left.m13 * right.y + left.m23 * right.z + left.m33 * right.w; + + dest.x = x; + dest.y = y; + dest.z = z; + dest.w = w; + + return dest; + } + + /** + * Transpose this matrix + * @return this + */ + public Matrix transpose() { + return transpose(this); + } + + /** + * Translate this matrix + * @param vec The vector to translate by + * @return this + */ + public Matrix4f translate(Vector2f vec) { + return translate(vec, this); + } + + /** + * Translate this matrix + * @param vec The vector to translate by + * @return this + */ + public Matrix4f translate(Vector3f vec) { + return translate(vec, this); + } + + /** + * Scales this matrix + * @param vec The vector to scale by + * @return this + */ + public Matrix4f scale(Vector3f vec) { + return scale(vec, this, this); + } + + /** + * Scales the source matrix and put the result in the destination matrix + * @param vec The vector to scale by + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The scaled matrix + */ + public static Matrix4f scale(Vector3f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + dest.m00 = src.m00 * vec.x; + dest.m01 = src.m01 * vec.x; + dest.m02 = src.m02 * vec.x; + dest.m03 = src.m03 * vec.x; + dest.m10 = src.m10 * vec.y; + dest.m11 = src.m11 * vec.y; + dest.m12 = src.m12 * vec.y; + dest.m13 = src.m13 * vec.y; + dest.m20 = src.m20 * vec.z; + dest.m21 = src.m21 * vec.z; + dest.m22 = src.m22 * vec.z; + dest.m23 = src.m23 * vec.z; + return dest; + } + + /** + * Rotates the matrix around the given axis the specified angle + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @return this + */ + public Matrix4f rotate(float angle, Vector3f axis) { + return rotate(angle, axis, this); + } + + /** + * Rotates the matrix around the given axis the specified angle + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @param dest The matrix to put the result, or null if a new matrix is to be created + * @return The rotated matrix + */ + public Matrix4f rotate(float angle, Vector3f axis, Matrix4f dest) { + return rotate(angle, axis, this, dest); + } + + /** + * Rotates the source matrix around the given axis the specified angle and + * put the result in the destination matrix. + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @param src The matrix to rotate + * @param dest The matrix to put the result, or null if a new matrix is to be created + * @return The rotated matrix + */ + public static Matrix4f rotate(float angle, Vector3f axis, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + float c = (float) Math.cos(angle); + float s = (float) Math.sin(angle); + float oneminusc = 1.0f - c; + float xy = axis.x*axis.y; + float yz = axis.y*axis.z; + float xz = axis.x*axis.z; + float xs = axis.x*s; + float ys = axis.y*s; + float zs = axis.z*s; + + float f00 = axis.x*axis.x*oneminusc+c; + float f01 = xy*oneminusc+zs; + float f02 = xz*oneminusc-ys; + // n[3] not used + float f10 = xy*oneminusc-zs; + float f11 = axis.y*axis.y*oneminusc+c; + float f12 = yz*oneminusc+xs; + // n[7] not used + float f20 = xz*oneminusc+ys; + float f21 = yz*oneminusc-xs; + float f22 = axis.z*axis.z*oneminusc+c; + + float t00 = src.m00 * f00 + src.m10 * f01 + src.m20 * f02; + float t01 = src.m01 * f00 + src.m11 * f01 + src.m21 * f02; + float t02 = src.m02 * f00 + src.m12 * f01 + src.m22 * f02; + float t03 = src.m03 * f00 + src.m13 * f01 + src.m23 * f02; + float t10 = src.m00 * f10 + src.m10 * f11 + src.m20 * f12; + float t11 = src.m01 * f10 + src.m11 * f11 + src.m21 * f12; + float t12 = src.m02 * f10 + src.m12 * f11 + src.m22 * f12; + float t13 = src.m03 * f10 + src.m13 * f11 + src.m23 * f12; + dest.m20 = src.m00 * f20 + src.m10 * f21 + src.m20 * f22; + dest.m21 = src.m01 * f20 + src.m11 * f21 + src.m21 * f22; + dest.m22 = src.m02 * f20 + src.m12 * f21 + src.m22 * f22; + dest.m23 = src.m03 * f20 + src.m13 * f21 + src.m23 * f22; + dest.m00 = t00; + dest.m01 = t01; + dest.m02 = t02; + dest.m03 = t03; + dest.m10 = t10; + dest.m11 = t11; + dest.m12 = t12; + dest.m13 = t13; + return dest; + } + + /** + * Translate this matrix and stash the result in another matrix + * @param vec The vector to translate by + * @param dest The destination matrix or null if a new matrix is to be created + * @return the translated matrix + */ + public Matrix4f translate(Vector3f vec, Matrix4f dest) { + return translate(vec, this, dest); + } + + /** + * Translate the source matrix and stash the result in the destination matrix + * @param vec The vector to translate by + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return The translated matrix + */ + public static Matrix4f translate(Vector3f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m30 += src.m00 * vec.x + src.m10 * vec.y + src.m20 * vec.z; + dest.m31 += src.m01 * vec.x + src.m11 * vec.y + src.m21 * vec.z; + dest.m32 += src.m02 * vec.x + src.m12 * vec.y + src.m22 * vec.z; + dest.m33 += src.m03 * vec.x + src.m13 * vec.y + src.m23 * vec.z; + + return dest; + } + + /** + * Translate this matrix and stash the result in another matrix + * @param vec The vector to translate by + * @param dest The destination matrix or null if a new matrix is to be created + * @return the translated matrix + */ + public Matrix4f translate(Vector2f vec, Matrix4f dest) { + return translate(vec, this, dest); + } + + /** + * Translate the source matrix and stash the result in the destination matrix + * @param vec The vector to translate by + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return The translated matrix + */ + public static Matrix4f translate(Vector2f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m30 += src.m00 * vec.x + src.m10 * vec.y; + dest.m31 += src.m01 * vec.x + src.m11 * vec.y; + dest.m32 += src.m02 * vec.x + src.m12 * vec.y; + dest.m33 += src.m03 * vec.x + src.m13 * vec.y; + + return dest; + } + + /** + * Transpose this matrix and place the result in another matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix4f transpose(Matrix4f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result in the destination matrix + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix4f transpose(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + float m00 = src.m00; + float m01 = src.m10; + float m02 = src.m20; + float m03 = src.m30; + float m10 = src.m01; + float m11 = src.m11; + float m12 = src.m21; + float m13 = src.m31; + float m20 = src.m02; + float m21 = src.m12; + float m22 = src.m22; + float m23 = src.m32; + float m30 = src.m03; + float m31 = src.m13; + float m32 = src.m23; + float m33 = src.m33; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m03 = m03; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m13 = m13; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + dest.m23 = m23; + dest.m30 = m30; + dest.m31 = m31; + dest.m32 = m32; + dest.m33 = m33; + + return dest; + } + + /** + * @return the determinant of the matrix + */ + public float determinant() { + float f = + m00 + * ((m11 * m22 * m33 + m12 * m23 * m31 + m13 * m21 * m32) + - m13 * m22 * m31 + - m11 * m23 * m32 + - m12 * m21 * m33); + f -= m01 + * ((m10 * m22 * m33 + m12 * m23 * m30 + m13 * m20 * m32) + - m13 * m22 * m30 + - m10 * m23 * m32 + - m12 * m20 * m33); + f += m02 + * ((m10 * m21 * m33 + m11 * m23 * m30 + m13 * m20 * m31) + - m13 * m21 * m30 + - m10 * m23 * m31 + - m11 * m20 * m33); + f -= m03 + * ((m10 * m21 * m32 + m11 * m22 * m30 + m12 * m20 * m31) + - m12 * m21 * m30 + - m10 * m22 * m31 + - m11 * m20 * m32); + return f; + } + + /** + * Calculate the determinant of a 3x3 matrix + * @return result + */ + + private static float determinant3x3(float t00, float t01, float t02, + float t10, float t11, float t12, + float t20, float t21, float t22) + { + return t00 * (t11 * t22 - t12 * t21) + + t01 * (t12 * t20 - t10 * t22) + + t02 * (t10 * t21 - t11 * t20); + } + + /** + * Invert this matrix + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and put the result in the destination + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The inverted matrix if successful, null otherwise + */ + public static Matrix4f invert(Matrix4f src, Matrix4f dest) { + float determinant = src.determinant(); + + if (determinant != 0) { + /* + * m00 m01 m02 m03 + * m10 m11 m12 m13 + * m20 m21 m22 m23 + * m30 m31 m32 m33 + */ + if (dest == null) + dest = new Matrix4f(); + float determinant_inv = 1f/determinant; + + // first row + float t00 = determinant3x3(src.m11, src.m12, src.m13, src.m21, src.m22, src.m23, src.m31, src.m32, src.m33); + float t01 = -determinant3x3(src.m10, src.m12, src.m13, src.m20, src.m22, src.m23, src.m30, src.m32, src.m33); + float t02 = determinant3x3(src.m10, src.m11, src.m13, src.m20, src.m21, src.m23, src.m30, src.m31, src.m33); + float t03 = -determinant3x3(src.m10, src.m11, src.m12, src.m20, src.m21, src.m22, src.m30, src.m31, src.m32); + // second row + float t10 = -determinant3x3(src.m01, src.m02, src.m03, src.m21, src.m22, src.m23, src.m31, src.m32, src.m33); + float t11 = determinant3x3(src.m00, src.m02, src.m03, src.m20, src.m22, src.m23, src.m30, src.m32, src.m33); + float t12 = -determinant3x3(src.m00, src.m01, src.m03, src.m20, src.m21, src.m23, src.m30, src.m31, src.m33); + float t13 = determinant3x3(src.m00, src.m01, src.m02, src.m20, src.m21, src.m22, src.m30, src.m31, src.m32); + // third row + float t20 = determinant3x3(src.m01, src.m02, src.m03, src.m11, src.m12, src.m13, src.m31, src.m32, src.m33); + float t21 = -determinant3x3(src.m00, src.m02, src.m03, src.m10, src.m12, src.m13, src.m30, src.m32, src.m33); + float t22 = determinant3x3(src.m00, src.m01, src.m03, src.m10, src.m11, src.m13, src.m30, src.m31, src.m33); + float t23 = -determinant3x3(src.m00, src.m01, src.m02, src.m10, src.m11, src.m12, src.m30, src.m31, src.m32); + // fourth row + float t30 = -determinant3x3(src.m01, src.m02, src.m03, src.m11, src.m12, src.m13, src.m21, src.m22, src.m23); + float t31 = determinant3x3(src.m00, src.m02, src.m03, src.m10, src.m12, src.m13, src.m20, src.m22, src.m23); + float t32 = -determinant3x3(src.m00, src.m01, src.m03, src.m10, src.m11, src.m13, src.m20, src.m21, src.m23); + float t33 = determinant3x3(src.m00, src.m01, src.m02, src.m10, src.m11, src.m12, src.m20, src.m21, src.m22); + + // transpose and divide by the determinant + dest.m00 = t00*determinant_inv; + dest.m11 = t11*determinant_inv; + dest.m22 = t22*determinant_inv; + dest.m33 = t33*determinant_inv; + dest.m01 = t10*determinant_inv; + dest.m10 = t01*determinant_inv; + dest.m20 = t02*determinant_inv; + dest.m02 = t20*determinant_inv; + dest.m12 = t21*determinant_inv; + dest.m21 = t12*determinant_inv; + dest.m03 = t30*determinant_inv; + dest.m30 = t03*determinant_inv; + dest.m13 = t31*determinant_inv; + dest.m31 = t13*determinant_inv; + dest.m32 = t23*determinant_inv; + dest.m23 = t32*determinant_inv; + return dest; + } else + return null; + } + + /** + * Negate this matrix + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix4f negate(Matrix4f dest) { + return negate(this, dest); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The negated matrix + */ + public static Matrix4f negate(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m01; + dest.m02 = -src.m02; + dest.m03 = -src.m03; + dest.m10 = -src.m10; + dest.m11 = -src.m11; + dest.m12 = -src.m12; + dest.m13 = -src.m13; + dest.m20 = -src.m20; + dest.m21 = -src.m21; + dest.m22 = -src.m22; + dest.m23 = -src.m23; + dest.m30 = -src.m30; + dest.m31 = -src.m31; + dest.m32 = -src.m32; + dest.m33 = -src.m33; + + return dest; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Quaternion.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Quaternion.java new file mode 100644 index 000000000..99d21b27e --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Quaternion.java @@ -0,0 +1,530 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +/** + * + * Quaternions for LWJGL! + * + * @author fbi + * @version $Revision$ + * $Id$ + */ + +import java.nio.FloatBuffer; + +public class Quaternion extends Vector implements ReadableVector4f { + private static final long serialVersionUID = 1L; + + public float x, y, z, w; + + /** + * C'tor. The quaternion will be initialized to the identity. + */ + public Quaternion() { + super(); + setIdentity(); + } + + /** + * C'tor + * + * @param src + */ + public Quaternion(ReadableVector4f src) { + set(src); + } + + /** + * C'tor + * + */ + public Quaternion(float x, float y, float z, float w) { + set(x, y, z, w); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector4f#set(float, float, float, + * float) + */ + public void set(float x, float y, float z, float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + /** + * Load from another Vector4f + * + * @param src + * The source vector + * @return this + */ + public Quaternion set(ReadableVector4f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + w = src.getW(); + return this; + } + + /** + * Set this quaternion to the multiplication identity. + * @return this + */ + public Quaternion setIdentity() { + return setIdentity(this); + } + + /** + * Set the given quaternion to the multiplication identity. + * @param q The quaternion + * @return q + */ + public static Quaternion setIdentity(Quaternion q) { + q.x = 0; + q.y = 0; + q.z = 0; + q.w = 1; + return q; + } + + /** + * @return the length squared of the quaternion + */ + public float lengthSquared() { + return x * x + y * y + z * z + w * w; + } + + /** + * Normalise the source quaternion and place the result in another quaternion. + * + * @param src + * The source quaternion + * @param dest + * The destination quaternion, or null if a new quaternion is to be + * created + * @return The normalised quaternion + */ + public static Quaternion normalise(Quaternion src, Quaternion dest) { + float inv_l = 1f/src.length(); + + if (dest == null) + dest = new Quaternion(); + + dest.set(src.x * inv_l, src.y * inv_l, src.z * inv_l, src.w * inv_l); + + return dest; + } + + /** + * Normalise this quaternion and place the result in another quaternion. + * + * @param dest + * The destination quaternion, or null if a new quaternion is to be + * created + * @return the normalised quaternion + */ + public Quaternion normalise(Quaternion dest) { + return normalise(this, dest); + } + + /** + * The dot product of two quaternions + * + * @param left + * The LHS quat + * @param right + * The RHS quat + * @return left dot right + */ + public static float dot(Quaternion left, Quaternion right) { + return left.x * right.x + left.y * right.y + left.z * right.z + left.w + * right.w; + } + + /** + * Calculate the conjugate of this quaternion and put it into the given one + * + * @param dest + * The quaternion which should be set to the conjugate of this + * quaternion + */ + public Quaternion negate(Quaternion dest) { + return negate(this, dest); + } + + /** + * Calculate the conjugate of this quaternion and put it into the given one + * + * @param src + * The source quaternion + * @param dest + * The quaternion which should be set to the conjugate of this + * quaternion + */ + public static Quaternion negate(Quaternion src, Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + + dest.x = -src.x; + dest.y = -src.y; + dest.z = -src.z; + dest.w = src.w; + + return dest; + } + + /** + * Calculate the conjugate of this quaternion + */ + public Vector negate() { + return negate(this, this); + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.Vector#load(java.nio.FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + w = buf.get(); + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + return scale(scale, this, this); + } + + /** + * Scale the source quaternion by scale and put the result in the destination + * @param scale The amount to scale by + * @param src The source quaternion + * @param dest The destination quaternion, or null if a new quaternion is to be created + * @return The scaled quaternion + */ + public static Quaternion scale(float scale, Quaternion src, Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + dest.x = src.x * scale; + dest.y = src.y * scale; + dest.z = src.z * scale; + dest.w = src.w * scale; + return dest; + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.ReadableVector#store(java.nio.FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + buf.put(x); + buf.put(y); + buf.put(z); + buf.put(w); + + return this; + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + /** + * Set W + * + * @param w + */ + public void setW(float w) { + this.w = w; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getW() + */ + public float getW() { + return w; + } + + public String toString() { + return "Quaternion: " + x + " " + y + " " + z + " " + w; + } + + /** + * Sets the value of this quaternion to the quaternion product of + * quaternions left and right (this = left * right). Note that this is safe + * for aliasing (e.g. this can be left or right). + * + * @param left + * the first quaternion + * @param right + * the second quaternion + */ + public static Quaternion mul(Quaternion left, Quaternion right, + Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + dest.set(left.x * right.w + left.w * right.x + left.y * right.z + - left.z * right.y, left.y * right.w + left.w * right.y + + left.z * right.x - left.x * right.z, left.z * right.w + + left.w * right.z + left.x * right.y - left.y * right.x, + left.w * right.w - left.x * right.x - left.y * right.y + - left.z * right.z); + return dest; + } + + /** + * + * Multiplies quaternion left by the inverse of quaternion right and places + * the value into this quaternion. The value of both argument quaternions is + * preservered (this = left * right^-1). + * + * @param left + * the left quaternion + * @param right + * the right quaternion + */ + public static Quaternion mulInverse(Quaternion left, Quaternion right, + Quaternion dest) { + float n = right.lengthSquared(); + // zero-div may occur. + n = (n == 0.0 ? n : 1 / n); + // store on stack once for aliasing-safty + if (dest == null) + dest = new Quaternion(); + dest + .set((left.x * right.w - left.w * right.x - left.y + * right.z + left.z * right.y) + * n, (left.y * right.w - left.w * right.y - left.z + * right.x + left.x * right.z) + * n, (left.z * right.w - left.w * right.z - left.x + * right.y + left.y * right.x) + * n, (left.w * right.w + left.x * right.x + left.y + * right.y + left.z * right.z) + * n); + + return dest; + } + + /** + * Sets the value of this quaternion to the equivalent rotation of the + * Axis-Angle argument. + * + * @param a1 + * the axis-angle: (x,y,z) is the axis and w is the angle + */ + public final void setFromAxisAngle(Vector4f a1) { + x = a1.x; + y = a1.y; + z = a1.z; + float n = (float) Math.sqrt(x * x + y * y + z * z); + // zero-div may occur. + float s = (float) (Math.sin(0.5 * a1.w) / n); + x *= s; + y *= s; + z *= s; + w = (float) Math.cos(0.5 * a1.w); + } + + /** + * Sets the value of this quaternion using the rotational component of the + * passed matrix. + * + * @param m + * The matrix + * @return this + */ + public final Quaternion setFromMatrix(Matrix4f m) { + return setFromMatrix(m, this); + } + + /** + * Sets the value of the source quaternion using the rotational component of the + * passed matrix. + * + * @param m + * The source matrix + * @param q + * The destination quaternion, or null if a new quaternion is to be created + * @return q + */ + public static Quaternion setFromMatrix(Matrix4f m, Quaternion q) { + return q.setFromMat(m.m00, m.m01, m.m02, m.m10, m.m11, m.m12, m.m20, + m.m21, m.m22); + } + + /** + * Sets the value of this quaternion using the rotational component of the + * passed matrix. + * + * @param m + * The source matrix + */ + public final Quaternion setFromMatrix(Matrix3f m) { + return setFromMatrix(m, this); + } + + /** + * Sets the value of the source quaternion using the rotational component of the + * passed matrix. + * + * @param m + * The source matrix + * @param q + * The destination quaternion, or null if a new quaternion is to be created + * @return q + */ + public static Quaternion setFromMatrix(Matrix3f m, Quaternion q) { + return q.setFromMat(m.m00, m.m01, m.m02, m.m10, m.m11, m.m12, m.m20, + m.m21, m.m22); + } + + /** + * Private method to perform the matrix-to-quaternion conversion + */ + private Quaternion setFromMat(float m00, float m01, float m02, float m10, + float m11, float m12, float m20, float m21, float m22) { + + float s; + float tr = m00 + m11 + m22; + if (tr >= 0.0) { + s = (float) Math.sqrt(tr + 1.0); + w = s * 0.5f; + s = 0.5f / s; + x = (m21 - m12) * s; + y = (m02 - m20) * s; + z = (m10 - m01) * s; + } else { + float max = Math.max(Math.max(m00, m11), m22); + if (max == m00) { + s = (float) Math.sqrt(m00 - (m11 + m22) + 1.0); + x = s * 0.5f; + s = 0.5f / s; + y = (m01 + m10) * s; + z = (m20 + m02) * s; + w = (m21 - m12) * s; + } else if (max == m11) { + s = (float) Math.sqrt(m11 - (m22 + m00) + 1.0); + y = s * 0.5f; + s = 0.5f / s; + z = (m12 + m21) * s; + x = (m01 + m10) * s; + w = (m02 - m20) * s; + } else { + s = (float) Math.sqrt(m22 - (m00 + m11) + 1.0); + z = s * 0.5f; + s = 0.5f / s; + x = (m20 + m02) * s; + y = (m12 + m21) * s; + w = (m10 - m01) * s; + } + } + return this; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector.java new file mode 100644 index 000000000..7690fe7d0 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +import java.nio.FloatBuffer; + +/** + * @author foo + */ +public interface ReadableVector { + /** + * @return the length of the vector + */ + float length(); + /** + * @return the length squared of the vector + */ + float lengthSquared(); + /** + * Store this vector in a FloatBuffer + * @param buf The buffer to store it in, at the current position + * @return this + */ + Vector store(FloatBuffer buf); +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector2f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector2f.java new file mode 100644 index 000000000..2342bce88 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector2f.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +/** + * @author foo + */ +public interface ReadableVector2f extends ReadableVector { + /** + * @return x + */ + float getX(); + /** + * @return y + */ + float getY(); +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector3f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector3f.java new file mode 100644 index 000000000..5f77f5acf --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector3f.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +/** + * @author foo + */ +public interface ReadableVector3f extends ReadableVector2f { + /** + * @return z + */ + float getZ(); +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector4f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector4f.java new file mode 100644 index 000000000..5dee3e3ba --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/ReadableVector4f.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +/** + * @author foo + */ +public interface ReadableVector4f extends ReadableVector3f { + + /** + * @return w + */ + float getW(); + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector.java new file mode 100644 index 000000000..465969c6f --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Base class for vectors. + * + * @author cix_foo + * @version $Revision$ + * $Id$ + */ +public abstract class Vector implements Serializable, ReadableVector { + + /** + * Constructor for Vector. + */ + protected Vector() { + super(); + } + + /** + * @return the length of the vector + */ + public final float length() { + return (float) Math.sqrt(lengthSquared()); + } + + + /** + * @return the length squared of the vector + */ + public abstract float lengthSquared(); + + /** + * Load this vector from a FloatBuffer + * @param buf The buffer to load it from, at the current position + * @return this + */ + public abstract Vector load(FloatBuffer buf); + + /** + * Negate a vector + * @return this + */ + public abstract Vector negate(); + + + /** + * Normalise this vector + * @return this + */ + public final Vector normalise() { + float len = length(); + if (len != 0.0f) { + float l = 1.0f / len; + return scale(l); + } else + throw new IllegalStateException("Zero length vector"); + } + + + /** + * Store this vector in a FloatBuffer + * @param buf The buffer to store it in, at the current position + * @return this + */ + public abstract Vector store(FloatBuffer buf); + + + /** + * Scale this vector + * @param scale The scale factor + * @return this + */ + public abstract Vector scale(float scale); + + + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector2f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector2f.java new file mode 100644 index 000000000..ac5b04300 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector2f.java @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 2-tuple vector. + * + * @author cix_foo + * @version $Revision$ + * $Id$ + */ + +public class Vector2f extends Vector implements Serializable, ReadableVector2f, WritableVector2f { + + private static final long serialVersionUID = 1L; + + public float x, y; + + /** + * Constructor for Vector3f. + */ + public Vector2f() { + super(); + } + + /** + * Constructor + */ + public Vector2f(ReadableVector2f src) { + set(src); + } + + /** + * Constructor + */ + public Vector2f(float x, float y) { + set(x, y); + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /** + * Load from another Vector2f + * @param src The source vector + * @return this + */ + public Vector2f set(ReadableVector2f src) { + x = src.getX(); + y = src.getY(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y; + } + + /** + * Translate a vector + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector2f translate(float x, float y) { + this.x += x; + this.y += y; + return this; + } + + /** + * Negate a vector + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector2f negate(Vector2f dest) { + if (dest == null) + dest = new Vector2f(); + dest.x = -x; + dest.y = -y; + return dest; + } + + + /** + * Normalise this vector and place the result in another vector. + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector2f normalise(Vector2f dest) { + float l = length(); + + if (dest == null) + dest = new Vector2f(x / l, y / l); + else + dest.set(x / l, y / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as + * v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector2f left, Vector2f right) { + return left.x * right.x + left.y * right.y; + } + + + + /** + * Calculate the angle between two vectors, in radians + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector2f a, Vector2f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float)Math.acos(dls); + } + + /** + * Add a vector to another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector2f add(Vector2f left, Vector2f right, Vector2f dest) { + if (dest == null) + return new Vector2f(left.x + right.x, left.y + right.y); + else { + dest.set(left.x + right.x, left.y + right.y); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector2f sub(Vector2f left, Vector2f right, Vector2f dest) { + if (dest == null) + return new Vector2f(left.x - right.x, left.y - right.y); + else { + dest.set(left.x - right.x, left.y - right.y); + return dest; + } + } + + /** + * Store this vector in a FloatBuffer + * @param buf The buffer to store it in, at the current position + * @return this + */ + public Vector store(FloatBuffer buf) { + buf.put(x); + buf.put(y); + return this; + } + + /** + * Load this vector from a FloatBuffer + * @param buf The buffer to load it from, at the current position + * @return this + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + return this; + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + + x *= scale; + y *= scale; + + return this; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuilder sb = new StringBuilder(64); + + sb.append("Vector2f["); + sb.append(x); + sb.append(", "); + sb.append(y); + sb.append(']'); + return sb.toString(); + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + Vector2f other = (Vector2f)obj; + + if (x == other.x && y == other.y) return true; + + return false; + } + +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector3f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector3f.java new file mode 100644 index 000000000..39cd6be7a --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector3f.java @@ -0,0 +1,358 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 3-tuple vector. + * + * @author cix_foo + * @version $Revision$ + * $Id$ + */ + +public class Vector3f extends Vector implements Serializable, ReadableVector3f, WritableVector3f { + + private static final long serialVersionUID = 1L; + + public float x, y, z; + + /** + * Constructor for Vector3f. + */ + public Vector3f() { + super(); + } + + /** + * Constructor + */ + public Vector3f(ReadableVector3f src) { + set(src); + } + + /** + * Constructor + */ + public Vector3f(float x, float y, float z) { + set(x, y, z); + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /** + * Load from another Vector3f + * @param src The source vector + * @return this + */ + public Vector3f set(ReadableVector3f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y + z * z; + } + + /** + * Translate a vector + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector3f translate(float x, float y, float z) { + this.x += x; + this.y += y; + this.z += z; + return this; + } + + /** + * Add a vector to another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector3f add(Vector3f left, Vector3f right, Vector3f dest) { + if (dest == null) + return new Vector3f(left.x + right.x, left.y + right.y, left.z + right.z); + else { + dest.set(left.x + right.x, left.y + right.y, left.z + right.z); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector3f sub(Vector3f left, Vector3f right, Vector3f dest) { + if (dest == null) + return new Vector3f(left.x - right.x, left.y - right.y, left.z - right.z); + else { + dest.set(left.x - right.x, left.y - right.y, left.z - right.z); + return dest; + } + } + + /** + * The cross product of two vectors. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination result, or null if a new vector is to be created + * @return left cross right + */ + public static Vector3f cross( + Vector3f left, + Vector3f right, + Vector3f dest) + { + + if (dest == null) + dest = new Vector3f(); + + dest.set( + left.y * right.z - left.z * right.y, + right.x * left.z - right.z * left.x, + left.x * right.y - left.y * right.x + ); + + return dest; + } + + + + /** + * Negate a vector + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + z = -z; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector3f negate(Vector3f dest) { + if (dest == null) + dest = new Vector3f(); + dest.x = -x; + dest.y = -y; + dest.z = -z; + return dest; + } + + + /** + * Normalise this vector and place the result in another vector. + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector3f normalise(Vector3f dest) { + float l = length(); + + if (dest == null) + dest = new Vector3f(x / l, y / l, z / l); + else + dest.set(x / l, y / l, z / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as + * v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector3f left, Vector3f right) { + return left.x * right.x + left.y * right.y + left.z * right.z; + } + + /** + * Calculate the angle between two vectors, in radians + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector3f a, Vector3f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float)Math.acos(dls); + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#load(FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + return this; + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + + x *= scale; + y *= scale; + z *= scale; + + return this; + + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#store(FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + + buf.put(x); + buf.put(y); + buf.put(z); + + return this; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuilder sb = new StringBuilder(64); + + sb.append("Vector3f["); + sb.append(x); + sb.append(", "); + sb.append(y); + sb.append(", "); + sb.append(z); + sb.append(']'); + return sb.toString(); + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + /* (Overrides) + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + Vector3f other = (Vector3f)obj; + + if (x == other.x && y == other.y && z == other.z) return true; + + return false; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector4f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector4f.java new file mode 100644 index 000000000..d3b533c78 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/Vector4f.java @@ -0,0 +1,349 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 4-tuple vector. + * + * @author cix_foo + * @version $Revision$ + * $Id$ + */ + +public class Vector4f extends Vector implements Serializable, ReadableVector4f, WritableVector4f { + + private static final long serialVersionUID = 1L; + + public float x, y, z, w; + + /** + * Constructor for Vector4f. + */ + public Vector4f() { + super(); + } + + /** + * Constructor + */ + public Vector4f(ReadableVector4f src) { + set(src); + } + + /** + * Constructor + */ + public Vector4f(float x, float y, float z, float w) { + set(x, y, z, w); + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector4f#set(float, float, float, float) + */ + public void set(float x, float y, float z, float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + /** + * Load from another Vector4f + * @param src The source vector + * @return this + */ + public Vector4f set(ReadableVector4f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + w = src.getW(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y + z * z + w * w; + } + + /** + * Translate a vector + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector4f translate(float x, float y, float z, float w) { + this.x += x; + this.y += y; + this.z += z; + this.w += w; + return this; + } + + /** + * Add a vector to another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector4f add(Vector4f left, Vector4f right, Vector4f dest) { + if (dest == null) + return new Vector4f(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); + else { + dest.set(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector4f sub(Vector4f left, Vector4f right, Vector4f dest) { + if (dest == null) + return new Vector4f(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); + else { + dest.set(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); + return dest; + } + } + + + /** + * Negate a vector + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + z = -z; + w = -w; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector4f negate(Vector4f dest) { + if (dest == null) + dest = new Vector4f(); + dest.x = -x; + dest.y = -y; + dest.z = -z; + dest.w = -w; + return dest; + } + + + /** + * Normalise this vector and place the result in another vector. + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector4f normalise(Vector4f dest) { + float l = length(); + + if (dest == null) + dest = new Vector4f(x / l, y / l, z / l, w / l); + else + dest.set(x / l, y / l, z / l, w / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as + * v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector4f left, Vector4f right) { + return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; + } + + /** + * Calculate the angle between two vectors, in radians + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector4f a, Vector4f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float)Math.acos(dls); + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#load(FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + w = buf.get(); + return this; + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + x *= scale; + y *= scale; + z *= scale; + w *= scale; + return this; + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#store(FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + + buf.put(x); + buf.put(y); + buf.put(z); + buf.put(w); + + return this; + } + + public String toString() { + return "Vector4f: " + x + " " + y + " " + z + " " + w; + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + + /* (Overrides) + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + /** + * Set W + * @param w + */ + public void setW(float w) { + this.w = w; + } + + /* (Overrides) + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getW() { + return w; + } + + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + Vector4f other = (Vector4f)obj; + + if (x == other.x && y == other.y && z == other.z && w == other.w) return true; + + return false; + } +} diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector2f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector2f.java new file mode 100644 index 000000000..a664a43ba --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector2f.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +/** + * Writable interface to Vector2fs + * @author $author$ + * @version $revision$ + * $Id$ + */ +public interface WritableVector2f { + + /** + * Set the X value + * @param x + */ + void setX(float x); + + /** + * Set the Y value + * @param y + */ + void setY(float y); + + /** + * Set the X,Y values + * @param x + * @param y + */ + void set(float x, float y); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector3f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector3f.java new file mode 100644 index 000000000..f626f3700 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector3f.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +/** + * Writable interface to Vector3fs + * @author $author$ + * @version $revision$ + * $Id$ + */ +public interface WritableVector3f extends WritableVector2f { + + /** + * Set the Z value + * @param z + */ + void setZ(float z); + + /** + * Set the X,Y,Z values + * @param x + * @param y + * @param z + */ + void set(float x, float y, float z); + +} \ No newline at end of file diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector4f.java b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector4f.java new file mode 100644 index 000000000..ac8d3af83 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/util/vector/WritableVector4f.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 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.vector; + +/** + * Writable interface to Vector4fs + * @author $author$ + * @version $revision$ + * $Id$ + */ +public interface WritableVector4f extends WritableVector3f { + + /** + * Set the W value + * @param w + */ + void setW(float w); + + /** + * Set the X,Y,Z,W values + * @param x + * @param y + * @param z + * @param w + */ + void set(float x, float y, float z, float w); + +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index d9d6e71dc..ff7e8c71e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -21,4 +21,5 @@ include ':FCLCore' include ':FCLauncher' include ':FCLLibrary' include ':LWJGL-Pojav' +include ':LWJGL-Boat' include ':ZipFileSystem'

    (WeDc5#Q&pXucgG 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 literal 0 HcmV?d00001 diff --git a/LWJGL-Boat/src/main/java/org/lwjgl/BufferChecks.java b/LWJGL-Boat/src/main/java/org/lwjgl/BufferChecks.java new file mode 100644 index 000000000..a0707f180 --- /dev/null +++ b/LWJGL-Boat/src/main/java/org/lwjgl/BufferChecks.java @@ -0,0 +1,292 @@ +/* + * Copyright (c) 2002-2008 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; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; +import java.nio.ShortBuffer; + +/** + *

    %g&CEq{tNi6_lV3S+<*sG5d~Y;9O}zNvitq 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­vrl_k_w;7jPBL*h=0Q7v<3*Q2iM)kHgBlSi%Xg8OYE!=r3N!-`&~_@Io6=539dsKxRp1|GY7wU`2} zlhJ%W)f!;s=2~W@i}VI9`98;jmGawHDz2bbVZVKuk$gjP&fe!*vOBxLIUcIT-wbH{ zodw}n0UnT`DSB$XX=msbwP5R0Al!X#n zk)lHN(&%}?Wxp~s&RN`_jB_pbaI2ne7O^P*a7la5v__yat~J8ZGil5F!(p#NYg|u7 z3td2K95vm##Vk&2G|OSzuX2)Z=Uza4nBmZWZluE<{ssBZ+ZT~kAibgA zt8(SvA;$lK38Q9d>h56g`S$RrX*>xw6sF>=_hT6-mr5!xGpV;44k^{#~gLU>3yHK z=OX3+#pVC5N(TLd{j`~t!!ivUBIjl{%j%h18Sc2ry0sLT%3 z?xwwa=_8-qjie$>h@Vpvj)jckyA@7%Y^`a{8xT*AGn$&yV-_uRJ>7D>-s0|1Z6JO5 zWHLz`jKa=1a$gnC3jEi1#-|fnrBw-xHOo6L2!H?wCPKGDi}vhk+`|4uKu@(A5p6%i z4>`7GnK@!!g{4bXCJIfHb7mKqiTRSovvbkH%hRSC(dm`Q&7aMd^C&;LzR@2Ka zSm>&a7%B7G2B}&Gf2^8K0iBox=fF5$eM_1&;Sjbxn;9EcrU#-)<(pQTm52H8!0FvBoQF9+;a6TH6yxx3qc8O*D0S zc4|(EBJs=^HGxW~{)*~7Re33;iC?u%dJL=y1AxCxAa&{T&1W<%t67UlHL(}S?$wPs zsN!tNsq58rm0uxSH10|&qTr;cc?Vq}+95%XsKO2*90f**b(I*yO_5A1D%A(Ik#GgR zghOd<eRFE; zO3U7MmzbgMw~c}J7-VhAEO#Sqdg^ka1g1^~0 zr7u;t%Ft5b_I1@!_LUdBX2PWWCM{H}zGg{8(+)kNuHFGe0_Z`-`JMrEK%JFlMp2q) zXrU$>l{AdlKQXyDgwV%;8M=t{x%gZxuSk8N>Jo5D>oi~I1+RL>*4C8k$xj(_`(M(% zxEO?(NW?Hl^-{@Mb`4C~V)tDItn7DX2awYZ5uEV^g}|RhLN&weElx2%pZvLmY(zm~ z`^ZbxfM4c-;}GNLMi}VC&u)`a{I>~C37WSO_E5h5e5X^)dl$fZ!hNTbZ`Hpy>QrB^ z{|{^D*q#a7W$BoADz|!09hur!^nfBV0v*E?XqX@tH%>uF6Li{a*oD7 znP#>)UM@MzSQ%^SJ>U2!D4f6T(LKC;vo`-5{Dl8UPN_x=B&p(DJM7U4&&PN6XW^MY z!Hn~CXrs<>4PY~p}S)T+{EIpZyo z)XMTLss!fb^PM-;9Tx?^>Wr(^8jnem)Lr~DKa)0ZDSU87f6pfA6~ng64C>nZ1%SWD zGd4eAW7oW77sT5awu1gHOFMNX@IkDC*Pk)xiGRp*E!y@5%)&vR_tmYmaVUXO9>5l7 zVZC$*GMg`gVelUmC9yhRiTIDayE9E-HV_kfxr@nE*XOXs-j@$ zm>^h)GeZH`gC(ySU7^H{+_Ff@7hp>o^lka*wpSL)RW%~9s^!ZLHZ?U{&EK29+j4fU zE!)hr-%KA)9rE}3zUicWzxn=>_qX~b=i#`WGhPrDq-xa$R^S)}5ifDqA6jcS0vwA^ zDYy#y?CyY#Pi$a-%{LgRIDZR+5I^sv7Hpb!{GI2fC|q&w77L+>jZZ-o2vl5f%IQ^{ zy~W1KbLvgL)rQS0?4IGyClFAqVw^pX{`QK(Cm%mEdrOC4Sh~lZbVb|r!G~a2GEz5p z8w}p_Z6|+;6ZTWL>74^%r(m!1n-{V{A?Z%h*3H5#IJDSaIK(?C^e2|TO0XnBPL#zP zclQS*!mpHFO}4*4CV$zg9qwHNuT9>`2WFxI{MRcyNQbOmI_CvnWfy_!{bUt0?m^R&9!bLS%tkX3lkDci@yOBJ<~m` zu#ypft$?D1inssO!bX#>JQQ4pL~LfiguR(H6vyr|iX6DPx77*kzfN@X(u(W=ALuS< z!;wf4lG?(LCs)bKNRq1bCr3f7;*SJn-&3TfUP@MSew2VV?Ga+FtOEeZ7RgM0DnOC< zX|a_MLE+R4E15yLe$3CQQ3cy25vNpWN>d@Tmr$%1&S9~@3>Cs~B%>N0Yq&6O^|*1# z$qVZi&+Hh)sau`C^5q?awzgdck*ge9;41f9-&+{1{*WmSsc;inQnGjc;iDb(Ai_IA+Au3bio=^}QEa@s17qf#gxv=z8B<>!L7Po=n+$4$HHYq&8Q( z!quI-{kIVc8bO{5w0sP8EJ+T6Szau~iAy3nUyG~h@kkTut~8C<+^J1B@&OP_p51pW z-3e|QNAr!wnH)>z%6RtVGRMxB?iC=zF5WIse(1xVrxfDl2BI35CN?1BHp>4@FhqlJ zZVk*icrb0ni6no%1y4T3(N#HEb#eg$OcZYZij^`et`!v~XfY3XRZQN>2;mk&%|c-W zMV+=a3G&;dZB!LOVdwU(QD|SX)%L{pQ}v!GWUUy{=PAL#-1e))lrXaOR`HyL2Tmv! zwZVs54JGw=kz--VqiV>|%p034(&Z-Yvg>)?v4=>ohQ6)CLeSiW0}J7n453ys@f|aZ zz3l8cF5ur6&FFGrR2+A2AC`bfPtLX!{g%|)sNZRmy{;9*`dJ=@7((x-K=4xbFm$$L2JD@9?eY2Dp;tT zsEs#;vBD!h6|kX*$webLND|Wa2yZ(8f5|xh1_#LA0s()6II-o?kmtj6>9-*$HW(ze9^Ij9WC)v#KJu zA;_#fcS*h1ILBh#3DY*;xCMaOHk$`DsmS`SUG%R`0ab%amxY`Ti6YAp z2J~n!#zJ!|pAd~i4mYjY*o(pv{5ME+;8hSbHzL6d{eo`A64 z1S<~GLqQ%nD^*i(mv!+2PwKZfQR-%GlPWAaE_y$vg&&`Ilc4Zkfqgy+`DtGS&zx?P zYqSRnX3xlW-AMs~ItW^K0VRm+yRm3RjU4ioOY(TpxuQ0@U;#XQE^s|Ck4vG?HXE^J zFF=csAc!HP5p9%6)q^qawL#zo3WvJZYtb>zxyqlI zbE0igND)fzsOl?tG~jcGSa~;?8t0gDgZx_|$b>fI1rL`;|uM|08 zuYmmhF9v4fp{epkI-@4*t3QIUc`}>m+yo^~!FhDmjt|QRZ8zhc$X}UL5vVEC(d|WH z)k3PxNn%-Y-3f&&XeF8RRNzySi#B zobg0o#TfF*sSc>oxC~@=YfvIHE&oDUB>es{uMbOqg4&5uh~M#x7O z{q4dUU!%FVBg(LuL^2%W=5Vc#K~IvSM<=3Pqg>w|?7Vf!dCRgO^MW88DB^86dsiN8 z>!nXVU|FCu*j|BW^Q*oKd0v*MxPrSl+C?h+E|RTo2_kDtJff=yT^pvpVV0QD6vI~> zQ?nVY3F|(&f7TlRm`W2mQ=qMskm+)x_Jp9;& z628W;51JzPy0Cu+PFHYDzTEV!Y2lEzd51YU=22`4#Nf#K&s86+PcaG&2D}$mKt?nK zQbfSRAxA5qIul|rBHZB>Q@(6mWC6&U&cOy5Zmq=ESy8nS5=W$M0yaj!&&eOCK$H#^ z)gv(;QRNsXeDx)Fp%rk)s)%7!s&lpSz?&awDUep5c~jFzH)EntGxD(WaT8&XN9R&y z2oD>(y1lO)KGq?>Cr4Rm#3+aKmWk3HL#5LB}~?19Kl&)*8f#3%32m z0w)jYN1|J+>J8VWsTKR$d9B8Pb zwGxkO1F2g3u1MTD;O%LUjj>lsLBF2>=or}^aPXB%K*kjlIQxi+v!HiW1Q-Ze-F{P5 zdo_Xl6hCQq0hO)-P25H7#Rt39yQ|TvTUdBf z-l{1LbTI98F9Yd9xJFZejTGn-b{*dbRExyoVhDmK9l=ONOB%aFO_TZRo10#^zansd zLT&HZq}HHBfi1U|E4Rq3W?^V+?`hh@{@y29To0!X_xTluhHQIr6TH@rr5zsmTK#ac zNEp@_KY$Ym$YG_B$A9v#hPSK6mB~P?)Iyvz>aGubIudBEsy~Xz4=p|tA+AC=-aXN4 zfh$sQB$6KTxx~K4@X)UP7&Ai4g0E7K?mLkW@*leOzwBfGohMGm!=v>H(PYh;_BFWtdFNd*F>TrU)h_k3 z!OBYf2e?~Nguv(ZP0-nFw81*Sa@PU1$FpeH(!}y7MrWzVWp;;hq<_jElcvxpQw?d( zymt^^m{ZI^MAygoUdcCKLOYNzI_jrKJ&^>g*q*q+PITY9aIr(*+sZ4uIwAqbghBtN z9i%Q0e?t-Sc|z(1?h|0}_AiMmr7sf-!V#kY#h2!1{Ivo87wwP#vHgjeJGohj+F3h^ zIy$(yINFK2m>av9OFLLN{@?jnd(E$WtUtwCJu$<*N<$Bta1>53&Q28+GE5&7sg{&# zNwWv6sNT;tc~4F%!IGW#8pCzh#k`QFudXK_g}*9Sxnp1THqHDNGi#Z=j4$mk0NN>LV+Ai}9NNsJK1I ztnp$GHCO@|Q=W+{=g1GGaqRfw_!ofgOub_R3+BIG{uH@}I{u?f*{u2DLkwpKKsbE56|isntYWocxXb;MY@Jakv>l zM?6hWZDM|DY`Do|Ls|Claig?TC(lp=Td!WwXQzyJM5YgLp26OYSZ&)J1A5SOFc`l- zJyO5ic!ZSGao6NVikqVH$Dj6syQzmHHTKS+L7~AM>lZ$ebwx>TwcHA@y;vErsXIFt5k4N_kFtBOp{gi zK`muHpw|rf#zpP-{OPpCkk%3obE(O~%_Sq_4 zZd06=!;mohIw;}B06Y-R?RORTiEvYIe~6|t{|dUX?|qS(8Bob063t4PPC`qZ=T7P< zCfl5K&O7vH?n@ZlkVM54f%Mlv5w0c6=NnIfFXaGZ;SapL;sGM^;jhHH|sEckJYE{qfK~AzIYv6BETB7>(jqi z`rN@-2Gj!0$PmB&1NwAbakjsI!3p)YnPOJ}(l>h>Mg+P{yDHXttUu-_v$zxqyJ`RM zo&LG5ch_7>Z-a!$pi^#K`q%;cs)39JF6DP+@vmE04E|%2NLd!%3a+FZ>KV{AYm)73 z^Oj+&MI%)A#_d`T_vHL>n)*?a<`ES89oNP4EQ!yN_|+phH3*mr`ZKA(UD#bvg!`)5 zNdX$YBcWyI)oll_WE6i$PQ~0IH0GsQ!aYASU22Pf+Av?Y-LUEf#*eJbrKWOT-&4hcw7 zRQqPE(j05Kv7L=U`5HA)y3GbQ%}qKr8bk0)U>tVQCELwUDmTj$gaIELh5|ajZYI~p zE-f%0i796CT#qN;wr_qjobXy2{Cb$j6L zATT=hRnj&&72ft%9~GZ+-alq$li4bTuKC3b35t$ z@{r>8c27_q(-Xh`9;zQ)WoN(rlwaZ>Cr{0`x@?@JO;lFXWdTTppyxPeKN-Z#2D5VW zbrw7IPR=LV+a`)|1W0v!=7rO7GGL6_4*|5Y%=I`kwfL8d3M|11>3DVwQU!Yau|+E? ze+yqWf~@gDN;lR;!8z1yw*Am~Le^?A12(cNnRKXU zGX49l)3_9B&U|e?i%gXp3MJwqrg_zFToLv{6uFcrkA$1gV@e(q9qE!?mb7fEiF9(W z2JBuV@m40l-F)BqSP`kG+^E2)K1C6uzX?4k>CbbC=}F9CMDTqt1zb7j7AL>78_vD_ zM59$~w2BXpJ$9rLW_LD=R!Wn1*`pWGbX9Q9wuD8QHkrjv?ZzzKc^Rc+bZA|Tg=169 zUqM%1cpPg13!Q1JbS}MEq8eANzHMc`2sQV;7~muRS4@@#``7o*U?-xVMBjAiCbyk> zvF2EvNxX>aiR$-+KEU<>3@~vlQs&W{SsbIoEkeb9#zr&H4us~y5h-P=$}(r61o4#K zNU7kzx+i>|kY#?vg^gw+C?J0&mz ztcO+VpN~7xVxUR>I`X*2J!SsH@V3GfZ&Qgh>1Q;<-osRrw3&QM9hfLM#q{HS+4vKE zPjl5^iy`Tu$i|>ZMoWXX}FGRsYl)P<-7|yo&;A-mxOQ+&<2* ze}es5tdF)2h>hHuC^Fnz!SNq}YT84(T2}FvY{1&Ljh-Q}dZqU-+j{}rL4PU_TyRzI zDQzXada~*nw3mTJUxxQ4YtRSrqER`urj>MdbU2N9a%HA!h8AtC7 ztEntyQs*P@Y_uSIcu|20PaU1df{;sL8$Q z(n{UN2S#us#IU-9kB`jjg34qf>Zp|~NFGNxYI?LmDHt=_7ZllDM}9COHBi6Cxj%6b z7FT)6OY)ckQ5xLX+$QA~8lE!b(O z#ye)iX<7zyBDa=_d6PLX?c~I$9)5qu^ysQ0%a#}L&(7fq`KJg;LjC0WBIpamsD>`R*}YS9V=*dYH~&=|OovY=J{&_qMVoeabBTR}U$ja%+?&OZY7VdV&D8 z65B_&SiuGU*t&&dS>BF1gr#z#xOu^+b-Hg@%1!YON!D4Rp(hUiB7Wc8e&8QVc#v=h zgjHF6!Z_*PdWh;4P)vT%C0FD;7Ym(hFb=(5?trI-c)lL9Un=DXZMXff6{dv54L^QY zo2p~z)HA)B)>^fN?8w7bMI_kD^vFUnQ5`hO>*Pb(rcV}DBKd5J>$!`FN!E!@o1Wk$ z+fF8t!XfXIk2RwaTXw$qNBYZT8PLkjaC1iE6bxM%EtHfj&#B1jD9nBLa7P&D;d5l- zMt4+II?k-i`R$M6n4TAz2*&vI)Te%!anM()y-0w#{N1AAv29{pr-8LBVg&nsL7Q%f zyN{ge_yV8d32i<%*p~mTPMoQRQde<~N25x%8ChiClRew=imxP=HCa4Ywxk=;(uy$8 zGgJSdys|)SThS>sg2(wAj4stjTj*-SQxqLp)I?%@!eTvXbEE|%iR_zwgZa=P0eJ(5 zWOZ1|on0;!$pm7fTSAl!Q=QA21)qYqd*2ufdbBulP%kg_oyX`r+4+u6iPZ1!4Anf5ON{rwCIcdpB<(bRROeqFAWOT}v3);t zug21%wsR!ntm^`%hWRqKyU`7mb7`;MahLPE=+^{hCFU^#AG_cymW6Fx6XIr3b+?UB zb(Z=f3j5Pj>&SYS!a&=FOK!|H|EZaR8>j8;Vg1Yq-I3%--zd;#uJ>?94z4>y2ieHw zGg)LoE@s9qHbtRjlwwfxOfYaQSmrKwM_EFzUF~v;ok7GbIYF-`hMp?4^6AdQtc9hq z@n{>yXI#BFcTpk;TG9esIC`I@4n&bCD}kJg=fgyUb4mZX9XCyclrE%^9w9l0Pq*Beq4ZoUSLF{PP)ZdFr&Wt>`xYPuUkDH6x`nxd$xw z_f^9}2-5P*skR*zU*_M`)?cnLU;j7`jH5dVWr9Zp8f6`8d`hFG9QG$pbLm!$5kJ6VuH42DHxDp|v-M;o5hQt1asG zotAcnx<(i@3*q|FHAAO>>U`0g>S9k}JhNWm9obbjrCJN*OZYP0+UlbH6Y>RevQNYtB0Ia=+pEL3Je;b145su=-bG z?LVJLI~GYk*{`kM^b2~W{NMXTihG&bxw~3>n5&vvyZ+zktN(1|(fs$#9%%PPz7j^; zNeGU>3C@bLZw_w4N-e%#s8CjZKbHz$jSqH=n<3-8E$a@%QG!&2QA-$p5gf zK+}p>^A2-1+j$#b+GjSupD5gK{1E&Lwu|qJJAx9WuQfctHJwj3IHJ!LtGG`_Fl4>g z@a5mR%S8GCe-{>&Iy&eX@JX}%t}=NlQVpk!;c6>#durGxIayb=s&pq7);F6wW_ipS zc9eSQ=HqRAhAhhA$csz;@V0=!s{Sw~za^8(ff-A~i4dI*_|s*>YhY1j_g<@fF!Xb; zqeb=6Exrt2fyJ_BBWxZ*^rYArdmC*aQ|wQL!Gh{n&C|90_s_gvJ=3|7b0{H6Eh}6N zqo^Kzb=5AG+J@}brJRoG?v2H~K(B8U=r@sjC{Fl+!V}sUp7W*G9XZD*8~wgy`6ILH zE%b_%x-LsAZt#G)K|KXKv89z|ylWJAju9m43-x&y0C;43X&U$YD2SSyWip_WBU3`I zsGq6pP&ZGRc(_)0!(b7=yPyABPB%^73}K^C^Mm|cL&j0A6t2fQiVK-`=;)YdK*XeJ zikQ2nuRCUpcJuzH&st-yJ#dY~8+pzxy|pUkRLUg9#M2{y==mzZC|=fc8DiMlx1Iypj@c$NF{B3Oq^z&&BZk6J8DAMF?FrTLbuDs>9~a*A_MypA`bJ{2d_;IDgp9 zXj|FtmQv{CrjcK-_o!k}QW&J@EF6HbL=>cUGWw{ZHRz~(-tg*d-Cbe&25X*#ot5sqKk zM_Y^5kXKp-*NLbz!WU>Wi@b{3^c_dA7e?`BZHtA_VKa>S6|Vii%{zDyZ84xUV&Na7&jF|C?|G=|@`Af@$^Hc3WIKgrbZBm~UUb|X&v2LIJd-OCUHO^c z07)^?>KxHUbm7E40_p+T36dZc`u*l#<{VA1N$)`zbgm>kGyKG$pcSS5K<~k|E(kmk zv95IxK9LiLl)%um!3@0;R%s0|pX_{7HV;bZx+iMCxt?i(X4p@XxCUqxe~e16ZqS{r zz?-y5Qk71LIJ63VN_v`RH0xXyR5rCPdJ{?tEC-{PqKG0qyU)sha94j;i596XRz<&x zqU)f{(B@#lCN6?X?osCIuMYTIWQ-=t8#m!hSQLu1qR9;lT%pfjh(A*KpBsArw0z;N zJ|4RdOoD;ZoA%$ZK8PXOe7JVe5D1%0R?#g+5ura5fY!y?;KKvNtU6zI99nv?su-{j|#Ssd<=oFrS zJrZEZ=+6M~f3y>|RqVcsjfpy9eNN}iN?h!k@x^_}$0&9MF{`WP`RHwVX}M6;QaZap zm-&l4hD~lV^pjon5GiBUQ;k5kNtrTQmz@b-Gj%v2Dh|DJ{%<$VzfJD!0O+1C0+!+z z0ZZop)8zhl37}gO)=N+QKg>936x7;Tz?NONju?9L#1tzY>2>J^=~FXnkcztGbhoTb z&NI4#3K$i@2LnU?ZWLAUtOhU<&H*N3pP`M`fhsB@B7(|i+Ru~1(O{c2jFB*z@nzfd zhWGE=O#4fo>vmDy<_idjolyyj?<_d(o&>DJeIU5QBS;8h>fY(VqZccCtJ1&2u13n= zxY&Or>?X&xWdHCFC2%M?R$bhbm@2Dy1F*NMK4|xMhh*_qyyZY&2X~TlN!f<;%|e7* zKYHVA9R$&B%Eois^axG)E#eXD7#1&mRCosx{1Tf==f6dNrHSp4*hQQ_y;$Ts3<}>v z*7*%Z&nGj*$DH;oDp?Eg#eTPMBXnx$Ou@NJlMx&~~4bQ#maj z3~<121Kcl!IH&H6lQ9(8)l@CIbOW2s>$}ejm1>k>G{t9j=|ZJKq5TmOxFr#DB}@5b ztc?v7>P`s-bc#N6PQ}@m`(rgBDQ3Pg!>!a)GSS}Ck%ap?KDX17@A${~AO+f#Aln>a zu9|5C3!3^&t{mBd{s&2e91TwikaSLsCJ|7U+JqxjxeC?XAZAsLK(8(#nQQ|`tc@7* zQ%XdZ7AELVMWflI(b{uNTHLU*EKO9(dulO?=7P;n(FK%pqO4h@>PYyT2ih>{04mhz zL1hNTz4?%JR*%n%l1|EYscF+Ch5H5~xzjL>18nZ*dKJ=2;o}vU!_L z!v1FJR59gjTbW36E5>k&{xdU*q-ipB{3Uj5m6wus2De7O)QGs2!aCJ64MHCsc5M_X zB50_R%9lP(8g7-Q zG890&R;@-K{#jwinPB6qyXl)MNY$20tLLFal{tN9$9l?FD3#9jdBi$=>pmE6l`$BD z(KeK5aw{Zc@OT2s{&6gW0=SeIIXhJfZ?ZwWk^F#y>D$Y=6p0jRauj(*R<41K#@^cu zGVGKK3m4njK?Qe~3W?h#WvC~g`Y7u4wg3+T?NrGa7Sru^XRB-+MY6Itc=%Sv+LYS* zqopV2*{(j$;Q33Ac6Q|2Tr9$1v`O!-5=dlgYfw@9ZVOaBOlwzBnvetg{@Azuj#E3p zT~GKsDpTTAK+xTgyJX^B=-)>)5la_SG731@Ny3y4lW{ka=pd*ZI+W58#e2?eM8Qy zG#T#4-oEB z-=nL%l72=?D9YYiV*de~8Lh{hPA8V0GH6SXShXWz{7ena3;Q*8i}$Gy1aXtP?E?G_ z#56lC#{45)-D$NbZ_7BI5F9Xe`-QgxrjMQe?F}&Zg7g?=0tvygy;NYnK4qws-Fg=S z{xv2Z!XjxzIZnt#CC-S(;Y`M&Yw0ttcgu5))U@uY`lMldSeZlBJivcjU#|rWfv7jT zTAH=uWWr2pY};1v44awhC(4%7BxDSx91S}S9w?_uoKssuz~m&!vdcrJ6mk>vB#3QQ zv-8mC;~nakQ0{8mn?=#b!x@irB=+cU8zs!jIvb#UBCwg0_6$<6LETAmu>aBl3e)px z+m{AcF4-b0M6;$9A5|epPo(2II4V(I5&*(@JMOCLIyh73KJTn(_6ZkNw1D|$CDw3; zgqjP&WpiTLoFG zUNY81D=^h%>0~1RK=^w^ENG{x9eB|ct#j=Rx3z^#M8h*yMMps#{pm5X%D4SccyBts zf1|^{&13)3#_vy@D}DOHGAe{QT(!{=Bjc1sE`3)gIT8 zCRoHB;TazJ2qBsHp3sTsUk7@IB91Fm~j`j_*E(5GNCz*PT;r=vy6X3b~=YIY#B=>+|2;C5z;h%(-J6+$tkN`pB8_hK zrGSn`$a&0nX3d+`1@x3N+?E5S@r-TyR9FIvyK-pXf&01Nyy;Mt>t=}8_l!7^KO)J)RP?8=(jeLBjytr$l6l~ciferXUq%MksOgn?sM6S9BQXZy zQSHJxmU-?^$@lJH`aXwjg=2l#!daA!dlN=((SwNNMi=brjYBqaQos@QV#BoQA%NZ0ymMLg>nwVz8fkM+eE~K8~nnw zwd`!QjR)_^0>Sq&yx2%CG7&Uo54q(G{ijA>?FBi-jHLJ=Mh;3Q`(ZJNW4WV5LVK*y zNbZ%cf)(ru#>X1A&BDkr!i?4%;CKgI^X)nvB}{DRC7lam@<3;7zjQR89~wT z+(Q-NWMW$EMTbVs6>jF+g*i!*ZG&keII;u+vIOb<<|L=humnpH^=S`QeU+Th{*56T zxPg_BO3qfiAnEWnpgAQ{I@}k9Uoz%fKJ2{Xt#?Ua@!T2-+e|My*lo>zQMKL+hQY48 zMZG&z{XLi#cOA8C+ri~(O@oE!KHnun7;PA0xOm@2`G=GHw`J14B}C$_C2cNbTeW_U zVnmN5(9VXyt>f1PhT<-XwnHM5 zxvGKr-%j%p;I89id&ph0Ww$}H0UpsOcsU*Dv;(bpP@EoR_`n0dIJzc$V5$J+jpmzP zm*Iiyga1{vt>Q2k{4J__|Acl}CFTL0em6ST$q?VUq-IWxb`SoV2k8`27GG#4w__}( zpkQ6tiwpEtuksG`&B<@*+XN6gQPC`?8hlPGG=k&b?po7&@$;0%fAJIk{)=b-pDkgR z>0;*WOW(0U{%`9$s#eBk)((~`|5!EbjV;ap6Bg?~>pL3u|A4W+oEvT%^^XWqU0ON@ zDQsa-a5Sqr`Sx(s_BtCVB|1*o4g>R34x4sx>JVaLzhV7v@qWFD&mi+b`+V*q-gX8^ zc6t5`Ws?u|NpfXj^M^S=^<58z)I%_3taX0SMtv4SRBgm6 z4P)b!-Nf3Yb4}hm?to+Ex?Omk>3V{isdh4TPCgnwh78ZvJI(xi@HV5~MsrWY7nJrY z=F5_o)5+oCZ{}cg9M!uTdSGF)JcWx*+oDsi;l`V$lgZ%e3G1a8VWxXYHRy(%yr+8nV^8rE+0%;bd#lDR+EpG;wO;8*2 zINZ+%Ox}9r*)54&9ba7@2}XPv)h?ovk-l9bPb zE@OIlIdPx!%cPc=y&-y1+tuxiye|@_{H{rEQ$6Q{t1UO28`HdK&qm`MGVbLKooc4x z#CHjfwBly<5Kt^@^;WnX?TS?G8T#VxU|X~X(e`5JiDVusmGw$f26xr`2Ln$vBh8** z^G$|Qf~!2tRfXaO+GL+;#nIu#@%jTT$`5PnrB>HL;^ihaCi@$+zw9{Ilc{S0HM+nP zY`1p}$oHyFhll5TtjoHdy)fj3M6vFJ9(}0e+wz8LOuBgWm=)b2H?yAY1d}|P+}^EG zja)rPl95(|BR^b~0mVBLnuYTqn<~<a8J2Wh0&G7K+e z-+BScj#>vioO1VL%a|@zrv=~ZfkqcLi~Bpi--1m~&id-kssr>n$_=G^@OTULgoZ8) zWqa~&HWB;Pz>Qa#0sPG+r+7(2S69NFTaozQ0{Iq7)zo$NoMG}|uU;(vn7IM09UCvq z8|z0QFUbK>UrMKnxV+-?xA|Rox9Pgrz%~l? zNsultec?(_ZsGb(48S}{M|EWbH%{4JP>|x|_P<1;WCayKx5RAhVyjqZoI4eMK^*W~ zGu$Uw){r`E05XjuV_$2^t}fX_KHiX2B8lXPHCj>;Dw|CLX=y>>k70X0;mlA>!LW&7 z$5-Vum_n4_-D2fImVZ@~b~_7AQ6 z1S21n3o-9?z;>!aa% z>^tj>T_r1UinKNXO*NVSv0Pw3p0Z&+LZ>IQ!30GO8zv_rZwJ^EqyDS#nzCf|{Qo_+y9+CkR8NN6kJ88uz&NYV3?=Vu zbdDFQHc~Hd*(TX;X=$Dptr6+0)wwdSX>Rts(!bhTpDB!lbjZO6D-WL3A zJDc<7_pb-P9Zv7(*pWPlz$Lpp2tt=Wo;J;3#Lix*myW^?N^`4{#DeH(@k?v3$X=O`fesNY}7aWn$QlIVk7KDJddMNC9~*Jt+EP^&jM_^~BXv&RQ7*yAD0Gs4rW(|c^;HFhnN8(1it2yMfW^+x236* z6}d+%HkPTrJ>3Y63&rmX(5|B28>{7CA5`$*fl$OFGk0=8PTFZhRcs-5eX*m`xQ^#?1l_MK!=aDR~Z(EK|_pb z9x_Q(r@dPWtr!0eC>hqQs87>tcEMG!9Y%OQQzo%tsh}WxMF>fCP<>F?A;8kgdGHB& z15%TJI{dBnu8H|Dx$|)slNMJ>S8$Eofos~?Vvp9+wLplr?>n3}YW-eXo5>EVG08_| z2aDeA8o9C4JoGmp`GZF_c?!>Z8R94TKCv95GC4}*92pq}1OEkNDstB#f1|s8X_qpd z%5bU@7x&mM-&d8z#VsCkiRGjsXV`i!p0M8iqZ<=;xBcf`&cNz!phJFosBCxh$qfUi}iQ z_7qt@GqHLA0f}F<^{-&rw9x_Gwlwx1(7J>(rMQ6pDz=Ywh`O;`M=yOKzf&sUd*o$M zl{L@|9Q#Pn?G(XFb$EZu>=fk3V3e7KsRuTXGq`KQqW}83xEZOv)3_6LvYE!DjM=dW zZoLY{L^YsgoC#v}l3h!j!^fMq`AET!q|rr#xKYMLZK%?m1DaS1AyJ0|GdUdcTZs5b zggVrOrN>%4iQ993N1;s<`$vKCQnKlI)n*HQlPE%Lv!Wj`$EF8&BKz$mGPHW#^gs(D zH>1bvPvv3+zj}cOSec8uxa^h8HjbhvmDp7Z$Cr#npVFyPx1+i#g)YlI9!irf_T<_2 z+h2rn*!}KFRZeQ74brI16=gMQ&Rd|V0NICdLaBIR#Fn04K%73gWiTZ8_BUO~bC-XMPW^@yk^G8I{lcUIz@KUq zJj>vn={Ha!3}I7I^93aC`8II1vF$zU!mU`6GnmQ+c}F#$xm;SA|^_J!4B1jX{gZ#HESVU zGtmMWZDVYx)=B7@GMkoiFPDVicUz=TWm@TzZRnbP0Mt1G%lX*7Ko@&BfTD7IObs%9 z7a&XPvAxFR88Y3Jbl>%j`$weR3_v0PN%3kbSEs*OT#V;vKAxV5*8?IR;V7>8>y%lu zm+8MJ!E@C&c{4`K*ny)3yF0f@o}3?J>9gwv8`P?^h-grZlOdhxGw&q-G%p5|eq4Jd z5u~)B2od%ucht(<}7uF6Mr z0WjCjk#CDd!n*=9-^4}rmSAU1VraWzP(P2rdLZ3f&T6f(Y_yC>c4fU+v^XiJ7!Jte za@^XTRDSi2yC#7yoffAfl(Ta$;sn_^t)N3*uZJt!99&{J6K!S$l>+D(0B4#^t_zCK zubppqwDfU5^t?XR7Y;slX`DA{J21l~Z#mX4*+W$EGc0!Cjfi8hH^;)9>Ifc_VgM>qPaYcwudNQ7_aFl9e!XGm4)o6rm-C*&x@JkBO{tr;PxrI2cRJ z8=mv~-^9z(D4_=n%^JWVS;x5S5{3V+=lp3F2|!_n-=H?Kjj5+9#6C~zg3lGN87nXV zUx8a>g|vAy)*8q8Ht_Se42}Z*sea~4z6-Y=B~Aa6lW1+}>QhQ6%)|>V_AN%!Wi@x* z{~+xhgDVT)XwTTTZFX#%9os&!ZQHhOCmpkc6Wi$69kVC@dv9G$P0g*Ds$J*ft~y`# z`#$SgzqQKEQ0-e&O~a}PYUGbPC(z2)F^h)3tG#%f%t5W zI;3kl;93Br+EkAziLDQfg}NUZ^+z}h+h(w9wn&}VIDycOHcNS|G<}HYZWRnu180?Y z%@xZ3%mLiseAYvpY8)#T1NF1UtM}=e4c44SZjc2VX%|gIyHuW>_+QqE;cW2tPiIsG zY>>p)qia_?r1F0eOy*aT4ygBPN%7OWTSCM#Emv-%!~)#ULnzYO8r{jC>P`qisgW3^ z2CkaQ_P59zr%g`|ofAS5==l`|IejPu>vNl3;Wy9=!6hz75_E*7Lzt`vsID{!4R!0wZGZ*=*&+Y|5&Az{!T)b!+W(SyG@6m% zL74WGdEGap%HWe_^@CKXr_4 zn{RqAcl;R*ynp=n=&$!>1KXc;8yxz5k)@DIiAXk0StN%>OF2aEfWO4&sO#$V|5(c< zGNd`Zk47!X7OFi`*JoRzRS?MMVx&H#iO+6SYo;|_A@~;GmJoorXq~N=51Gw{BZ$CQ zVm;TTkg#>_WxO>3N)(w)Ho8{=$^|V_5AimtG;-cFTYQd|Xu&cqJRzSj)RRgJ^iBwr zMAh&j9a#M)yR=E@m7}W4n(PqjQ)iyBlR4I@(%(=sW;m=C@-z1)ZFvR70}@yGSwD%ORf=e z0;rmkVRucz_4l=j)sc1QEnx3H?yKyex+iMXRW&@zj*_XhraCcTtMxGxZ00|ij?dDT zA1}+jx@;dwG~??0!oYpz-Iw%yW6!bFpnd>E=HYuJ%a7UO)qnFs$}u)w+?$@mjz5Yx zh#356%Tn}?YG1@Hnbg+LBKKYOT8>Y}<6!nwhfN8EW5;42?kac4Zl3?>vTqN?hID_O z{oN%wwb*6X<*1!zYss<6$vFE{RZ!KN>WLVl`*R)LdgTn?fT|;(UgsF;vDDh<6?pxA zPNZR(7JU8Vhd%!8SN@M}^m3DRYsrZtH@B^9A&q0c;n8E?x0}LVR({%#Wk4MT48%1yXG6r%}m8Z2^EhkSxazT(6`ts zrmOyC?5kmuIMKysKf1E0}yfQd@9+^Kw=oara}AIk^LIp zCS2@O(bxrVgFSBlgO0IYTSo$n$TD3ckwhVl8s|QRAabvb}%-%34{kAz) z^9Kcayym*E#F+XTxhY75`3G#n1a}-8tHH@u!Fo?nacoPj?oiHFX@SXN8+nh{%`&S> z=JA)q1kSiItb@xNHs_yzgo?Xqw?q{IX}5wE0V%hj6#*Hyq!s^+WL{MSJI>{B>+JM;%8OqbUGNmR#Q@xBFn)SiWoYza8# ztVic4A>7*jWCq~WkSbIzAqa-kBMPkI$3A7F0sc+F|E>oq6@$ttI%vhWMohNSBYjkh zX$$8f`;96cmWobg07qVBU5I9&l9_2)7+x7-;Gso1=rm=-7!)!Pln6J2?ep+ZDh5fc z`T=^r*-FN}H%xi)hSF*8x9dy*k}HLtXB))Yh|cmLx+nYQa3Y5!%y)FynSE*CjVA(; zL$i%`am6T_J4p4(aIUC2LG_Rn=UnFr0z44W6PwLQ)iEWm2jAMta1vY(leqy?*!m>X4UVDfH~OUI}7gu4IV8d=p1LSHCtJ|e@ z{dC20{)7Y|=#CsReNjno^~5^R9_s2Hx!GSsIb%4vK+|a693!dJ4+5JIU|}a6j=(m0 zwZ0@?1fQV%%lJ?!D4%q+mB2G1sr6W#t5(p__b;|Cy2dYXc|zVM`+hc@;@`b3tVnI- zqzKA()w5`b52KZ4(7y?F6bF>7{BM-N!vv(U8Yy{ciEBdW@Pm< z2$)7U8>;G+@yoYdfX0DkXHofEfhkTYM0+2L&Ld{LDW$o(C#^p5BaKEp9{ea}P7A>S?FdVv33B)Lp_{Z3?Zk8R^BPv7eLLVr2S^q_$t<`_M7%9of|w zk&w{S6W1+E=+JzzVtluvB-ZxWjW?x=ln(jIMZU`uE_!!>lHr8mEy+} z-!d3MB0hKz5(knK!ISy-MYV-y@3895akN`i@r5Dpv+PaLt8jtq2K zlmG4v_t*x9QNK`LTG?rRaAy@uPc%gT z+soy!^WOjOdFCG%|9t`VPtXA!1ln6lu7|-EIR2AxGS3x67(=F#EzOs^8r#0H;|trq z!DBDZU9)>e&RvUpLe5?FJ)d0v0wD6*#~dQ_K#VQKSi;t==?m=lHGuXb7V*d*ssH;j zU^vvUrgXh}i_clS?y&w554>6b2m%tXe?$Qb)<434hU*`3gfDzK0gbN}_+OC!H1>o( zuKVq^;)Hp`XMm2Ts95)=u=v>cVG6Xb3FaRw!17#TbxutC+^80AO_@FJ92b|hX>--1 zF)!`{7x=Z@lQHYseJuE{zpu7fUHk5}Zo~Sv(T+{QZn;eRZ`jWERrvX1F>4H_E=|Ei zkQwBioMqt=kKDoM3E~f(%(awg-ocaLUpBhkI;e9Ah3sxGo4l`86mxuY+oAvu%c&;= zSzW&D4KNr?zpwPK>-u~H!_{_0Iu8#^xYIJc+gI?QdZO3*T3x|K`qgkHid0+i%BNP3 z%jGAV$0Vgz|3xhoF3&o{od~7N7^E|p7G6=*UN(+y-GpcBU&Csw736qJLw-8^BeTto z++Eb-NVQjyV^ZhC&`#fDaoCHKb))du3=A~6ipxA})ZC^ONkt!#fu?`qa|T% zi>!Pb4W_VGJj#cRE#y(^3kw71_SxZ7U5@z^4l}#aip0EKaf*Jo?!JHUd5j>%$_w7(M$$J|tJ&l1<-zG*x zT%P|;mF#BV%|oyv3FAM3D`3q*r+%5y;Hyj)t&|NXk(^PFTUyJP4oFu@bjp2E@;*o@T9uLgps>y@_8_FR&YV;VpUBY)<3!X>BLGug28CF z649oXNuzHuYwTR;mj6WC-ZP;p&1a|~2`$=JbgyBlDIdjo1!cjxxJ{MAf29@C$@DG@eWX&bXOjqBJQy>fE#Q?<`HpXR=;9QH-uT%OoWbB(8eIK}EBLc-wvQlCARza@{ECL<;C^6nb`18?Z4Gwu z?dQ=MgvHU>Q>=J$aME_lNDy<9>#-d5)|$Y#|6R-1XhP&tMf!wmujz#3Q{x6psB{#{ zA$QDmF?0XRZC@t27Nt+;e#k+08B7TGREaZSfLVVCx9MpHO$)u+GT$j$0EcYU5BIB! z;y2}HmznUWO;Yw{>EMXIXI^wjqRKv0VQ1e8plESu4H(ov^}Etjz?zPg70O9kB9Fu| z69{uHqO}(o(&(8yD$n)x2O8XNVj@12?In4A*m-mA64(2?0qj*CYl!2g6inD2bD|>YycTIHRa`h+ zg_^Wc+ZO>DLH4z17WcR`{tTsth!tJpVAc>}7-tr*%{8r!t&Un7UlY~HkKQ^=XidVl78 zlR~ua7Lngwzp_Rs9?4t*_)-FHMEF4|%!+B!RN_ixSvZ47cle?Do4nu(b&Tv5gi&gx z{_LqRD-JOfH137zEesNBe&Rphw4rC7GgG}*uX|lz>ajOkgTwPP&3~?hS#r;Yp|vIu zQ_;;^kFyz8iu>Typt+5zK>dSs{}^3s0pG651!r@44n#iePafLbyH}ng>pC5v zRH~pfJ%na4@I&DBtSVDw^w&!=`j129$(caZW_wvs(Y@f_#t3IO@vv&;2?LO%O=#od zu`cDvxlNj*sZP{0hvv~*OEc!2BJqa{rn3X}7ZysQ5_cDu02^svoY ziZ2Rf9;4i;wcJqkPD-}Eyf7_B@~&LFl?7MzDz3o~IiacI`jq(-ghPDRq<$sB%5l$V zkTTR2rJFW1M;>K6?5Xi$S#6(;ruvCY5RmJ;C->ly15|g^n3JF&^>9%n|nu3ftV{{_tww@+G_Mv7P^5%<$sW<)7k16 z3^j44_$CN-2edWPpE1V%rkT8MF^b>=dhfy9*iMI>bk;Q1Ix^FnyjEl96{VUq)us*Q z8j3;Lu-rpRYdz^tDvaYX-|VQyWZmsl8#5?1ZEZEEIy?!E6-hiA$h#U5yK*4jY$&@d zL^FJ{Zfh2PFe8pQ2el=5@LnFWWQ$@%Hh75gGb1i@Mn3b9^@))6&BHcPA;R0C>>fsX zCW!l{pdY*fw9G<0M^Nv8Xm^Z?k!=7i+mM$)@&jGUgUwu&iv`CZ#DkFdNC)glEsWkL|F;ow?`z^-- z)K~aEUsF_tLg$fROweDxk=xKW=>q%`0;$Rydu6>W6}xg%<|6$b22OZP<)sve`Th=V z^oUbuGBP0<`Lc_R#k=BWu!LC%e}YwAN&GO5hX9p92}!(f+@5>rO2`Fh6h7j;;S3W{ zymB5e)Oc2)5n=F%-!bGcj0?gsX3#QFGux6W`)FN!mGY=vd=rBz`+H!JtU}@EzpE17 ztvpIFRG8)mFEIg!SR}oUo&*}%A3y$#x451PS>i3NYxlM6_okBH$>Q_7$ofEt;hAYD zLj9qnc|^}HKl8G73us?<-bW;Lrtg@yP1A3=QE9<%268G}>giCns(xbGUr{n10nu&4 z@tNm-^k(*wV^pGihePhzQ0(Yb{SLjXk-%SnW?N)5jTDgdB=MQDO@dKxGk@+O#PCH~ z;;$t`UvZGvQb)V+8|YX?c(w>bDg|%0mUnfA*kJ}3P;Te@plKj4!R+E&W!fkX;L-2) zXTN32oh%@Mx&>fahtzUO2@|H1JA{b;bCz~#mgX``sxP8`>e(Q11wfO-8S|A?hJ&o? zP(e%;Vr-YYsWXbm0rYX3zY`;qZ{z;BB(ZSRKwHmtkZPrM+{NwxAt;$aNqI=jEww|V zcSx46ESDL=L$_APYLhL_F24v#KjW3HX_a>E(2B)XCy2<19X3y=jB~qf^vnZ%knbC{d#{4t1Xi917O3gn8p21Z!)9buB}T^eERfb=k$fggWFs zzqX=JCl-swz?!H}13kkq=XFUAl)0Hu8%m$}KkKtGIT19ou_EOToZ@?>pzGUzqi5Fh z+WaABS3r-4;YCXrOl$qtzITqLho}C=!3Y&rJXmgB&9uK7BoMm-A7O@feW*P(W*8#3i>z$Ht)iy@&i`cZ%@+habPs>|z5Z zWlN%vn#Ly_cA}Mq#(6aF{lJN%ti*J#Ay}N*9oq0OSM;Ifh&CsyW{AN~@*Bko68`<) zrYVdG`tAJruHtv=#Rwb4xuFTaOI&&%EI3Ko;T^1Lt%xG9E`Hch6|SSv{0sD*Owy@g zY%64JQ!QwBWP|KtUGy96aq0m-K* zvXPhVkL|XJeQb6nXiprc7gG3YkQajvLPNcH2)?E79&EmmJlL)#tOM3_s< z(oVj#5+nzprN3mWSMfvYgG-cBc7ubvCK{5nQjWDuNvFy?Ro&^GB|{$0wSs8Fq%aYZW5CVXUxwXF z=QD;2!cn}**xE+W8wJ|85LpH1xz5}KGvSnSt)?tje%k-#mHy=sS!_jkO=ihZL6c-ShDp0;WX_5@bqX5R2^I$~D9Q zq>0I?Idu|fq&$l+@D{L;9TU~!MdVb*F(lzQHh=SMNti*FFKJDq}Q-T zuug^|q=_$HPsB~GGO>=N(W0p%Yv800a{)WlW5je?8b&lUY!B1ZK)t*PCWdmV6!_I+ z2Nu1|mP?f_EiWzBgSP6X+N`^eziz!lh}(a>@*30_Hi31gHa1YRUD;D9oYYyIF&dl& zMyCX;3fp-`+yr?(mCLQ2Rl0Xo>KQ-PVA~ay+`I#we>^lB!j#pV=i`i9H4D z1Je#Lag1a)!-^0TtU<~M{DA{}(J4PmIbpJSV#QTsU`52?h1^^7U3PtBMRjxKy>bJt zOn&zWl>XNq0UcfvW#aL+F(ZCm4upLo6HM1mWix3Bspm2DUdrnkoSta~t};x$DFgG) zPCmzdK1<^^(Rl=MsR>mnPGX-$0CbMKvj$;C#-Vn0jnjA5n02-?=2?p2OqYAxo`#*l zIFfqvM-%;XVP_?WoFQI$Bk#3iELBXn2H8s!S5Y3CO$$czCx?T=0@)bCezkqKTeBK)G0WGO0+&W^_9 z*Jz?^@Xpd#dMmIX?aZts{2N3gWib?i-$dW&@MpwM#8(TjUmFPTd zB(fsd9V$W2RvuiEDBvQ!^^l}maWXGnl;%)|k1#1p-dHjD`5fy+TQ~j#XEdx<{FX9A zs!;*+&$2bAmg2iL<=Yl=L6>YDsS@F;c62}+Ci>ns+`&KWy;XeGjKO{)`I-9*O!NeI zI9@40r_?WVLeOEpzfx6-|1RI8iAQ`WA}TXPQ3#jZ$H&H21`P^_J);I(@XiK)Ohjgy zb2S!hQ?T#Vy;&0sLkBJij!1=4{wN_jRu6^6T*JmUAq*NE%z$YJ+Yt%fP754{i7Z1L z@N>mAg`j9i~2GOsO)bsybCfE=lVsxZ&?(1g!qyV<(pte zl(-?YK||BV4Ir(`Bdb%j4h|1qEPaj!4QKOwgdE*|Lh}DlX~2lT4azwNxvfmH@kC+shHmc!=jl2t9mju41Bx`J!%Qzuw*vpl#q_S55kFlDrF@yc()gbEqGtYQsFZGsz=9;@($>(?P{Ux89rWm!Yx03h|&iGIic*~|Kw_xe_FYVD9c zwV}*cz;g?y(YPqdK%hAb?Pa2<6`pAqe$T?7vBrtFSJ}FRF2srRUCpbT_-$XD0>b<^ zMl=9s(~xF(e}Y->D7%Uf3D!ifwRN3Yh@Bs;I{3VAupWp#Tpwg`tLXhtP4Q1RgTGXD zA9#o#rl8BuhzuSH@Sm@ZBj=FY!76gL@T$R6?zGMPVv&1;Sj-nV^qylAWco(#QQo+2 zpKf3TGL(J79K#g9!o>5W6x-o(f@n?&)s7wZ{9KKp%B}u)cc@|A%oNi^9YDwD!4BlD}YNNvr2!(MJGi<4c!#Wvesj0>7}g?C$i!R`shr&LCy zNES1(We<{uj*h6Xb=ehi5FZs;iGM)%ZU`O~6;-7F2DmwKX;u#KS6(#S_2Ikk`}h1W z{@Krg$nWth0>nt5CT$O#Xbr+c=2irmdyfhE$BPndy`a3%P5C}KyKicE!u+ih-gVKw z0p7PUl$ub%!&OjG=(=Pd22l#YEje6a^}>#*3gMp{PJmc&H}H8I2vJbxf$Tj1k34_w z()!i|-3MY=T3}ebKgI4F79J6`sd;ww{o*)(LD}I|fm_5Es=7Xjy@dI5C%is|VGsUW z2;Yo$--I3iUGNgKRho}L;ev+&)mt&0Pw8Od#Sc}qH{3e^>!8hjZ1#`j@CwS8G>CqS zy`5Y_A`Ml9KSpFlEq=IYNcXB3s{t>~r;}ky{yc57y$5w=}g>|CorG=^dKn?X^7l zI0%#X=eQBD!}YbwWSED9C-LzmoZ<(m%98M9b9JjcgSs1gh|qqA#k} zpSXCkRRD1leFRyu32{jgnFrZ8N@b`icQf=XD}upAWwV8n($vmuWmU!~aWqWv6j%t| zp)hK&=&v6rlVc|0grr-jioqfUd3?u!Wm-X9=3k5R;MUHWLBkzjhZnNXit(f=-J&&c zu{_HIR03Hum3P80yKyxX(HnY)vJ7%b7sQB`D(lizIVv1#t6I`|za8~Y^}YCU39W^( zE7%bIeR&8}B~kkB%;aquJPi{aHl&2p1W!JX2iU zQTpdBFe1mWqjM)+NBT9KKVYYyvJ47s}~ z6yg2!0$?0lDwTy24Jglg`r!8Iq10r_O0yh$ur*)Ec&;TIx3@wH)u!_qO&gUo@ZdtB zipMf}`4`Bbu({;P$}zz;z4=<-T3+!rVvSSTxA!k`!j)kQR=FY1b0*gV4idbE~-N~tBxG* z*}69z%~gzo>Kc2^s&afZb;693e9*yZ8@P&qcZrg2!-rByK|m-&v($$pzhSrgqaoMY zzS*XnZ^@N4Ct6ADG4!=sKo&cXr?7!)*7&`7Vx&)=ol1<$)^v^?8UNe&$xl9vWtFo3 zd<%^`^n+rU!?6xwb?}jOOSlFf@LdN`jvaBgz%FK3xmzj~zA6$-Vow@5O!1vSirT3b zZtUHJtit+%`b9BZAT!l+iw&Efvfpsa9|F7=();#)8j#!+9`_H&w7x|^Fi+h6^wbWA z<)#>>Kty-ssB^TUhW>~NH3-r)f8jE4ECk=67&FrtAz*bqfI6mV7WsC34r^@eB^xJx zN5M9kWTh1jPJ{pYZ5ctSLC2OQ4rNTeLij6nH1N7eu3A_3cWrFilr1Q2tx+0ljVOP6 zVz{-&uu&2sQb<{g8M(piv18@W0qy_<0Vj@~Fys;wU>&P=s}+Bgs=~k3!ac76OiRnoqpm#h^nKdH-szS z_k2IPbi19t$+^eh^0N^~)G0PSGFpaWigWc_rrL4SWb~|CNh9Ude86&wvN4v&;waP_ z^pO-uk1kJJFZRO&wR{85=VspS-_qCXL*}B)U1d@fW1J4fkH@%%90_ZK$l;cd?Q=5$Ay`{Mtag_ zF9u}lAfrh_`-5MmqFVkKcAs-&5DuE7+K$hMunmmvje)I()Ih1lZSIk+fevUIpGwfR zo`?AR@_pyzqnXe^MMkG7Tb)5*uO4`T5QLQe_A03V4HR+5P4#r8B+`!>*MSvNWg28@ z2;EV8!FSoS=7;;QXM?D=fLC)PZn7|N zuuab(aR)CN@CmOYaI^3kVO02`v_LViQO}sSfRA}8p@B8xwnPqHlMYbw&^+gm?pjGB znKIFN`s2(BXJJaxz?zcjufTOD_g9<1(E;Z)@z!L$$M&{ms85#SL6UT{L#lEA?3l^b zuLkF0+3_u6&j|NhE0!nRN|)8n-N9(g3J1h6dT)T`4W$nvED^j*ihCShJ~E5+Bfa34 z7g`J$9_9vbfCl8*z+oZcJS>|qg7j2$-8s_@0~=A0hD|!tE(~XPz1%(xvyIXq0Nyb1PD_bnnd(%**ahgvsWi5 zb!9dZ+!hU$ayi)Ijp~V(*))S$4XA?-_33U`V$P@Jd<9x)?#2ekL8lyCCrr!_cq@!+1p{zB3X{ z0I_C-^gBiCJfHQCdL9VlSkHnE&Y&UbUd}hOjD>e&)VmtIw+IQX>Ox%y(-sMR28UWI z7^IFu0bb1_J&U7MLR_;hR!th^_W&7zt0FRc1;+bU=!GfW|2T<>W4*zZu zcrdFSO&lsF%1`3mKgH~d@AuS0TFJy<=K$GgYzpboje8xI63Q2;eMoZ|8`I@B1&n0I za+PEhsfFDj=^KlES&$(k3ax=WfTa1k@4;-}YV^`fDzXKZpkXG^vTq&5A96q%3wCm)kMrUywW3Xhi-$*w9(IRYvnFRyX%*Gia4fv9T;@IhJ_v*beio(^hhf%! z(Yzqjs?J$;Bd`_>{&DuqIfeN?BfNh)SyRHIY7nV7H%_|ln|}r8e-q1t>EqUNMD&ba zTUIe>jpEvNQO@W)g6yeO#tM{VwfieehmbtbHb8p=Q;_PVp!z}jSg57w_ev<{O!s;Z zxEWrP;O~CT6);dSdI^lji#;q*&!QI?hUJf~#E@@vxdqXvj8}`c-yO>-W3x%u4tTw# zy|!%ykJAXnAAmKGbNf~S>K-NMUWXN#rrJovSU>)HNswzgX2-g>a^BhYu^`*&5aDr( z4aPWdE2k?D^Bjdhx}mJ_`r?F zU$3&=(UWC=t^#oXs9BrxD?7;>aBst4_m9@=KnX3|^QQQ`C{(MF6VNrN6O!RLD@FY5 zCPc)uVV@zUhluE!o+QvMH~b#xQ};WAcz^1hYJk5G74!gW>uk(-IWW8AKCIv_QqCSy zsvz-6LEs1R|Ed%HHZAns{?>_3zKbYj{?7&tO;uB4+i$-4e{*8~->_y~O>|9+FGW^k zl6bvfEe9AKTQQ|#D`u={Q3SjZBiOh!>nj{6g3RfWuE3@CC;wMi{hAv;z-qNSqxoZz zgWnnRX+zcaiCLtvv>H}cn?(VeWx?mw#k%F!>&QvTr0lV`o%CF?XPDuJ2ax zr&5Wyy;PL)o>@M6TneNj7Ec%XH)-~7>yvr6dqgvxhlQKg*~B?~REGBNQozfbK5jdL zRQS|fdcLfojHRW6LTs5ug=IZktfKal$%2-?4tp|vep7As#K&Lt-csD|sv|eMHna8X zHofl{$I;xHZk@@MNQ-Gm`W#{lE4+DyZ9?-k>;fGX&85;R-HAI6P5fspEOwtxp;?l$ zTCcd)pQsiq^gAn;+K=rb^i8xeiTBlY_YMKd&Nrt>pc$Yzsj&cS_emu}sglQsc!ukH zpotZ&R(VY_Le*(CfLDw{Fl!&__xZ;+#!;H5z#0l~9c6+0U7Km9Fo7U2bXRQ6oFY6y zHs4r;jT=AXSzd!Zp&~`?(NNv4v!n+kVpE8TU1m&aC&H+FPPR5@$$CTx8IPziGODADj@ad6pLNdR4`mx689Z4gd8B4x@jB~wi>X%JwyXe(r zPNO+U9D)!4BslmDL|%__ZG0eCTiRINOH-GxyF{VQCAFI#UJYbx51*)Tp6VfL<#UeE zO151PeodSX{l#qigKgmA@3qw&yC^oYktnZi#?i#T?fMgWyBJW5@sKyO0yjLd0Sa$l zAOBvYb7^^O7;TA{w!ck=>4)74xy+`AB(P3%DtFfl0*~`ZjoVe6v@c z`W~jsq;x=3HLBnhZ-Yq>10;tWz9~>kSz^&~{_Yd``)2X-i^x;k*Ua*yg;WHeu-?Pj zl70N|C74j}d~T+~=|^JTR(QI|4y1W4U1vlK>k5W%FghI4p&)e#98!_42-pdRZ}cpN zZ#*d)E|y`-Yid!3Gi6($U8UwNCzDH}1Glsg^w|l?E}bX31FdU7 zf6*SF?`)#A@M-0l0M{=B0p`fsSYn)bhYB-XUYjiqHP?2H(wxM0*4WDtuI@IMtgeR# zh_?5Qe((bwTh`AUkz&r&{at_Tlij5;LzWAUYYn!!Og>=URp!3hcOqZUu)N171($u~ z^}|&g@wKvuc#yGeMO+#K&y&izQ>gzVQeZbqFZ7FYVZgLvHnAk~yun*`U?@slT~tue zxKRQMYd*ElWHQr=3k+ly6;>-07F!6oV(d42@CX%mmq{;0&xAru zU?Sxd{tY-wBbsX*#<42LZ)4IumM_U6eWedDNrjhjblMXc=1Y+?Z!EaQN%z_43G=N; zud9JQI+VMYQ~l%zQ$OTyB11d?IHO$~fxv!9kP|}$&-`$f*!MsHabqvS+Fx|DGi+&N zdq5|gXA@lKHnieAzDVUGKm2*8uvoVNM)4pGL+{!tEFKe?D!!xU4@L{Z0nUw4_z~zl zjIQp>koe^O4-g5S(?K^HUAiOtWtJF?NzQ0gI#H@K@)xHU5vXwU+I}xjj zNs}%W=@M51uGo|jFO;#zTGj4g7z6!7C~F)|rr_EH|3wc0D!pBrAU9VS#%1$Hoia*| zc{Fmy#gP-p`JlPfhg5v(Lpm|(jp`mf!p8%m&4Z1N_5%Z^v}fxg|i~b4N76kafHveP&YmqYuHqeYeWSZ0p_7KC4YP z$l^rN&0gUHz5P^5LIZ9rGy9p+T9NeyIj3UqZN>=+|G@v(Gvu~gf-US@tSTi30TKQG zd4~KqwMy%M3eaoj1juZZ2VrC?id6vC@kJK_8}iwTV$@lQWJ{|Pa=gIl9B#RdLdKZ7 z;y{Kn5+zL~CD5W}V-OJu2?!5Rr%^;MadGhxNdA*Pz7#HIhmB+SY+s(|K98Hv*?<{= z=iK+dBlyUIU?3IEUT9m#!OM=nAPT-W&GsIkAwScNZ;-ruQbsDIeX~a_rMDyw?9rYR zUuq$qH#7+KUKj+nqz+J`hA9N44(=&fDXyuLDDOb3yb?#mDEjt-zk~2#`=m_`okh@n zv%C{jZs?g_=zQadh{^BV&=OK!pqhMxB?~C-6udvMq8xth@!jg5`y~wY|Li4B^o$-^ zWb%aamsZU$nmu4KmS~Sgx=Sr@K-qCLgQy1bin0aEtQg7 z`mV5S09X%Ut0&8FMBRjZG3w{6uo(G6saQ4y_yy(@41N{$G17P8aW#a$!Kzy>> z*b>5d*e@M;s~0}WHpo>AUz(jU`(wf(I5co<5bSd;{q!@QJS|+b1+G@xsxT#2 zzI-W@E6^03j#0uc9+on@yca$WQZ>qzJ58~Yx7w7y@LJYM|J1;Xj0o3Wl9*Z*NQ6)g zn?k9d-PgtK10Rlshefnm85_gMjQIU69WSBR+*7hIV~($Nq9L4Dq1Ut>wZH0I7m|VX zA2;gST&Oyp2%0b;Ve3Xt&@&|E=gTs~gy4zJg;5 zPX&O=_OY-pXxlMo+qTeEk(j04`pReg`p32^kUqoX9;%JrNQrJN56eP{7pF?iz{?~c z_6;iYdv3QNKF}Iwgr_-C638g9-v090A=9cIL6~&I_nZ;_vRS?h#T%;{&a`~c!%=Tl zzFG1yQzhc8@A@qu0JKvxy&It@_~B#8m)u=kPJUth!DW%w7HV0s6{=_-MDM*lvxQwaLneMuU}=!#CE21!iG!n~+gTpTr)xv%(F~*PZC6)mogTE?muxnu-u$jjR-dTN z##nCD$pVVNXh;?314nz5AR-2fOCTsiRY(Z;b5gjy# zP5Y{TebKJ8Gzn@4fJ;|SViS+k9gl2{q^Pz@o>%3*z~r7QBKH2Jg}m`(5<`1bT{*3E zO-}S^Gw`fvO`?_XQiD2n3E z%Rkg?kGm1u{1)2@>5d%?Cg{GED+Xd@Y9iIfJ3LcAdLES`=lBXY-uv29M@_VXz6Xqg z$tt5|W^H&zdtyJQk6Kh^-E<{WoVv;^2M77w#q^0fqfG_Zn{-Cl@YZ zJ12d6R#P#DCl|S)@2DfQvP+@8Gc+2#nUg}(2jt|Qz2&nCe5{YdcSa%0frdCFBH%|p zAhxSf?!8vOBrdS+60Epx-6_|q{s_ZD+)gC?bho9PEmpmbNPchB1>#99?I!Y7k>^0|-BB`Do3 z97)qWn51{orZ={lgrsqiwJP0cVTX?|ix|j)oER#PDTHfxc5``r^>SO*gH4C?#Mk?7 zlex2GhrYXJP1+e#HuKXf+*80=J-28WNFS3Gz@-6-W_f)^8v9jg^<(~HQRWweo$<`7N z!^s!zCBo@L>hHQ>x+X5t0#*BCT%{St2y>>m5Vg>$PxBD075u8q$`SSSgF(%Ex)D7* zlO?<|*uaec$631ZR;P!s=yx({A%mB74V#i__>Q>|!x1=agO-=G`==R7mxOj@p5*mG z@t-%w-)AC;Xs6h4i#ALs(?0C5{v+XionXCWP|q{am8R*D9Wd^ z$;VTgrbp4a|m5=!>%6o}Z83lxK7$DS;W2 zeHPVX)(a*(9Ixx@8&>ApK?Yj%CE&SE2TggtQjeb$ZjAQmAhrGU+<`lj0avjj0?;J5 z5(y?9A@UX-`oJb-?4#+DgXJ6TBv$-j6S9k}fdbWub}GX*4(`_*@F)aw`q^ZMXJcuh z_}1^?TwIs#nD>m#Q|U8t0)&k)ZNFjVPMKMJrHj9nZeYue`Zt_*s|K+u_?jJ&;QJ#C zt!BneJf((#e!kot9|FFwJ~0eJ^F1FDQ%64ga7|nE_RL5Lb9N8wa^VVY1MfeGMNm04 z9I3PS4Fn}SdvQ40heUUN*YQonzQ~G@u7Zzb8=;P*03#cS$PWzUr+E+7JHJEz);pJi zzca@{oZ$G+lOAhfzC->1@`eR0f9lrup-s4tr-?{^c$@G#Bgcc25X;ziNUB- z%7H_2MQUS8@W#Y4A$*h%((!^xZ!Q;`>;5@0KwJKcUf1?V7aDx00c!mqYkm!_y8tEW zP_v&bR!=!SA752r`5%;e`bpC+O5_g8go~KsR_$U>2IZ$=L^8K}w3Q{2Avk*l^qrHI z#)Zpc4RED65IXrp%|TERV1xrLv8Do#w+NJC?<~X_$E99cU}-)X+6RYY2?)QY??U>8 zpu@}%z@m{8T+557Hg`8&uJb*nN!K1|f26#oZ-~(d#Jg=R0lALI87W7Ib_kL5Q`Kp4 zjV z)A-fq$ouwA@KumzzZQvW3*vq20|56Ic|4ALIH=X#AKr2x-ajP{OSpSF?A!*SF7#92 zZijkigqpp5A~}CWsTYLbEC~59{2xP(>9?UuT0AlvGdsi7V zIcb&ug-cG$_^0t*&N$vL#%UW#zlV$=0Y|rtvZU6!fj43uh=w2?WYVUgH-x6i`RnXU z*ehI6-0-`@;hg998L?lWpxUMn^(IGD4)~wk>8-r=_pEmpuz-K}Cx#&QCe(2^jZ0zX zwWae3H(pv-LjZoo#app#&ivck)CgiP&#~d3botbO`)8J3>NpI%2190sc^lHa)}+7i z{XMspnyQM656XmRT>;+y-p1y3$Nt7g^9$%f_mtyxe`;47=rrv48rxm@I=b6V@$!w| zN8=(|7+*WrDus&(iwpPHYz^1lI22pa+l3_m8DCAyb1}jORcp7df$l&%5{Q zPcN|Q2$*@yw{@2FQwoM9Mgsue5cS{?t;Kfu_Ja!ovxSe-{*rN_)bOrpgqy2pO2rSO zI@F2N)0pd$>bq+sFoYz>5NPJTk}AqZKiIHqv`Z5n>Z*U~mMXbOa~Nl-2f@n)UFE2o zEFt3nI`e`OPamWTd=F%2e6TWxn->p2xvU1oo0!e9iqu*0& zuxEU?S9$_pt!znYgFK95o-KT_-i+^Jkw3fp*sm4tc-Co1GgPUDLn35Kgp=RwXX%qX zNYXK5#C6Ojh+a^3zLfpr&s?+B-E|x=5^o+I5xJ|38m6}ZVvM5v=gzb{4(Tc?ci^_&WW-G54w~c+wLZx}^R~}nU|8oDU zCS5+YmYlcdf*i^||FiJCL$(?AozghQp_2@KvFEdoBye_pqLZ_TTH?^s8*N3tPkSQr zR{|)&M{K@DVPVMe_2t?c(+Hod*7s;EM^A`T%mVy%fE6FTiBo=}`q&Z04<>!)qDO|s z#vC#2RT>FLFo6^mKeD$6O;b0(CmquRfkZyoAUQy;mRSN}LL0-uJRiOOo8kx0m{O3TX9N~u(&t|4F=I$nB; z?C}cvf1{>zcl4|%X0lHSzY7%&P$2=a8oP*b%ALldK%1iSzep1r+v`yJluMXPfgQt{ zv5V6_RhLY>&xKzr#X`G<1#pl3$#`Fu|c97Hh&uBIe}!}J(xMungt zoSBrC2bxFAL%!?TEBEJI$qpNrX3e3>W%E-(+FDxHvuBT^NzUuDp&amPl&^<<2ExgK z3*Gf?U+{*vyxj>BW>*^C&Hk~C&36BkR+~E(o9)Rlj_&5cdAsciEMI3rhO7M_8=LE+ zV_uu>fhkXnXYb9{HZO(xOc-rO6R@4Vg}+@WWv{>wQKRl;}Ng zv&!6V>{vO=QM;!Pc9L=zqNL1qo-5n5`BgH~v#?!Nu;l7UGME_AM!)N$V~kKT>)0%f z44}N3lVjo<^=XPo9-^|(S)zLUe6(qEmr0> zk+V=Oe3SKl36U0O6VVJ?P%%QG8`a(ilPuOOVD?rnAU9XFFXbFj zB-wCOegN4-Q&IDjo?9;#NhBz%Py4uRzc$lGwHf!K<+QhEO`CGNBf&(7s0(;>KQm$l98n%ehRsc*=O9f)BC^(ll{%!{-FHh< zR~vA>p;T)4MMjw38Uu7rRqp^^Dk6|6W$XbOfR+6v%Ibr;$5#K77{#+J2r+cj>LIdnZJ1{!!Z$o3lOL{~N(-YgR3|)88{>Dp8023NoJY{#}i8`C0FYeC4 z+_Q>ym<^pz?tWLvLS=(kB{C zc!#K<1v_%kYPvi!4;ZyT2Qiu=v#qbsxj+x6cH8THyXHR|dDDz&&~)MFQq%Hq5AxL! zMpaDe+-jS=;45S(i+_}JRGG;fGQ^pu%?0_1K+1ywd5JdAfU5M0t)KBeuK56JtIOmz9z^*&j&B%FcI% z)D+klVD@XiEwbnEiZu5Jl2*q*3@r^Fi9Ybu?~uMn8tqWMHS8W^MnPZZmi**tD|-fC z&io{&j9I7!{#<-3g#bt(&<@CAHYJFAz@ZtU;foT${shCl8pf}>&bvd}F2t9v%8*J* ztcOVwjJQG3KA;}`3?msO;;*iUy3-K!O8%MC@H1GsEoeR9r*0WcMc>|<`OS~x_x)soe@<}7{ z^Pf!3pDGT2dEZnPCdogC=UWro?H&Aya&PvKdLR1zQj}apI6{_+U=iqG-AJ6(^m~|c zHP25h$AOmTwJznM-X!(KWCEUkAFL_yf?JOjkjg`QW=-Wh-C`8{Rui5rm8?@hz^CNt zlu&#EPhL8fSA+HrjILX8VBEr`cCcZxNZU;3K0k@;sH1NC0pU;_I9}Fmh5I)3H|e~% z#fi*mJpJg;Y;2N9PU5NaxYvq|LVOxhH5nA{xfTeG(MBD=Cp?^?zo;vGw4s0TIJRok zno)Hw3b;)HPD{ejO|Qe|H_3&B-3ryR3N=&}`nOGAT~a3lK6-QfQM*WyISCD!IRsOs z{lEv+Vid)=uShaq?5cVXuW1Oi@oOEo>N!h`e>;`V3wa{|&6>*d)mhh0}_EZOm@(&OZ z<7MRoMCiQ(RenzeB1&A)?V!O8>WfnHW$Or`y6H8=e(JfX-?fScEy8AIS`N=Vx0DF{ zH2n^1wYV+%EaKEcg_^;(DQFT3INbBjRtFdoe+0{(?v>0iY*E`=;?pwlhRzkc<<^X- zM=AyxMnmZMohP1?p-K(s?`6ej)_*5!hzp_4lRONjv!w;CgJURQivg-lfVGv*f1i{> z^V&vMkV0vS*c;=D!sf)^@)R~qILS=7X;pyqp+(#;F_XojHwm&+kYqK=82~uOLM&Y8 zBUu;0VVVT;*Ef^0PpT)qTov51`MEI2Lz`sx9u?y{>YX6duE*6?>31y2`P;yjF=W;M zQbN}NFEdxuQUFEwD+CS2aET9Mch?00P1{nNsNeQy99Y7KxTPzY8rpaYh zFMU{|QfQG}EF!CwHRtk=G1P>oqvB{t0?!ziI_qU=NZ`$=`f$nE6M!_uUASkjIK<4W zBp<&4?sqnJf5CCDbT|~iyJ7_DAddAAJVoJNKLw8$JHses-tapok+)C9=~IxXiZ$UV zw>*(vOdohVAo*Qk&03T6n;SF1+<^vXophJgU7(t^YAJgpM6s5IwblZrQZw@g&~JCN z`kJ*?rQ^5t*ebDZC#}nyE`wz=dSFG^x@Vr>K@b}4q{ptCIX=#b<RC`3s32ZZ$gHejo#kY&-eUfS3GOIrlK88o@ zT=*neUUQ|a&t*0(cMf)DX$+(D;d$!NnQ)D&A5o|9MrU?VBIm!d>)g*@gH~$WizV`x zv{Nv3HW>9yhabK@se4*is$)9uYeD|sPpAL%z7lk5d4!NaK>XjmFYW)_``Vb;{`b8? zQHr}AmKx4T4_$IsbA4Ub00(AN)*w`Urtp*kZRqb8$-@_MYc+ErsntgLojaE9lqSDNAG#IeDZ?Q*&wF_ECp*GV`GVpytu82#U=rC# z^J6}6Rh~eZX`;{cX?!}15d0ZR+cI%fVefKXr8$-a zkBJd1=7Rmye0+PAR;UbG znz$nb+zgDCDyz+DO^E;Ep@zpDRO}G>00o;`Y%{S@sc~2!` z{#;(m)Ti#QlG2StUWE@}s5O2eDzEgsL=K(QuqG6by`dq<=rl)7PM;9eASt~xT)kGI z*2lv}I|;}7(-uk`8H)vv#Z2aXY*%ml%~Er;epb3torfy9*t0aNe$tj-R-`*8?;V13 z<-AvvCx4tC&Xh0_SAA^mps0 zF(;Q&@UcZ_E0&3NOzpk$x$S)SheonK3glkZ!KBGCrHCx7SIu;^w%a^|L)YePa#QGV zk4Nzm5rH28Xe%(p@&Z=&z5`QLE(d%7p@>TM06nEUXYSm6fopG&9pyWkYo5U_+XF62 zToXq?Xelr`1}GR+B^jV#7UM|=z=mJE>$%C>Z=%`v+~%#^htTRR-FLA0CEtg<`6b>L z+vcsM53n5qcdWb5!}R<;QrnQu=r607gK63} zF8K6X^t#g%bWerWtnzzJ!Vf`35u`CmVhtF_xSX4<&Q&=+0E{!Ggl23x3s9m=`8W9_ zxp-GR2}AK$k6aj|yR)mayWB6mVEbg!37Mh4M5v|{sSR6&YcVZOoAWFg%?~jV5wA8@ zd4Knw`G3)U>I{Uk`MI3yg`UKF?_GA9T06phF@Mt1*~9O+eZb zXGNj>n-?NEe-afD+!;J#W*-+>gEw57Ks7D2&NWe>z8EowKH5EZ*VUshrLJFwBm-hBEx@1QB}|I$Yc!Y4CMXO{3lQnk?hJ)XXiZLzmEIPF@PJz4MkU625<(J2NwOZwcun z3&6hc`WLfv*?IfijI`>a))F^vqVxz_8U^t>f39abuN&9aZk=u4kBL)&<*e#dbint= zf4yO-m3aE|C?^(KXz^3L^bRs_rKXOIOZ(vR%6XUG#jg_OK<8y(Hurt zMp+e(bLYLk=ns~}H7!{>E(x?`!-S$3ehCKH6a0*Cl);)uflT#Sb7(bR=O_4ygq{8% zS;Ne88iy+p+bGffZ6aJ-n~Q3c?Besj@w7eu{BAWyp1*8AmgV%iA%QwpIiS9V;Rs&* zL47Ym3|{=P&_8rIEPUmbeDUvog!>ZT$q|2(ZF+vc5QO`Z+}RR;Wexg@-xlmIlkMzn z`AYBeNqnSWePMltf{ML|V|}50#e%B(Lh}*b`DgqvBp0VL82Wzb7m!|l8DR2l@m${6r>Em!jsT(D~J^243aXcOe~3)`DZYszX2T8GUn$xm%1q@(RYKZsj8%&N#tf~BMiLAN8ag-n9Tma#y<+?KKvhyx+ zE^y`@P`jG*)kOAP8C$)YV~4oq*CchZgV8oF$d&~V?p;ShtNtLBUNRb{~m-dS>8=6GPUPX*18m@dKeiJn& zj~fk6&Z^g6nwZVaJ|c#4&qzK?#b9Bsbsbj(!tO_5zox^SWsFv}p7A7Kg>;#ZH6b=(N5!Pe zr{+ApR>C9eN((h>C8=T@v5RBu)G23^?cEDZMu#LXQ3ltd1Xu@SYrm3u4^8%Vzb>rD zrS66N3H|D|8#AEcfgIL(Sh2H>5bnHV;v*Zj={;ub+OlTwikGqDREYkf~WsoN#A-?eR+ zf&nv7*&tUw1O-^wwvX*uSuWmbUV=YId#*H{^KP#!RL%?wy;imGTJNuHTGqI`L#BdcfB;l_9l@4z?P2G4@3 zCUm+3n(gz(E{bA3o?NsO)?n1BuMhSr7sJ(;p70N$EJ2Wpk)@Ni0s-8#iedQ{z%bG_k45=BU8+oCuSh z8skmaJLE;~cn8LGN&iHAAB+&Q_VP4t5v(@AV(7R9AS*;*X=y_578oEo!HY{d$dMDW zb0hKZXS@9rQ<4aW%io@H2FJ?$$$DWc|GV!tvG`||k=^LoBM(?*jdzu-GAaZ^`u9C> zx;;?)0(v1SZ#$wcQ1pj+=fFCaOb8L<;Exi+gZQset1vL5)By9et;rDM)KCaxH=OO? zdopfPAvFn4ter#yY~r3Njkf(QMsBf#7j{r>ufRlMmX##mej+l+%MC_uAOuP3FcPf1 zaU~?IBIxR1drI55)gP3$Nvqb%xQVM*%G(5WLdx3|48h|AhjZ_Tb0qht-uI_mhlmlO zdm0$H1d*l^To8K6d-f>QgQP~q2I5xnG7_)@a1BJT+`-rKX;bvPl_^H76ZDnrk&@J; z4IS#*AuzWp81uxmy({8Eh{X&tzsQn}DAK0t3K+5d&BJjL*0{N72VlEy2{4Z!E$F3| z5E?p+XG<}Q&c#YGiLOB3OJQB(To5cS4KE8PuZIMTOIE#GQ;b|NW#^rA@-ez%2R|P! zeZqP08z9C;p5ayh+(MOXzlbW37;JWP%{HmT1T zOJtR^**RFtT~hwp7SjxM4pg`AKXQHhZRDfGb{J9QI^9^72?m3B*~Df3l22Sew(?VtrD6YJJ<->=j%%M@nS=fi5Bm(8S9mAQ z{V(;3>lnva6|AAhjg>RNt+Al&)wMO~9hP>QN4AK|+FCQ=x4R$!QrLs~|&=Ums{| zp1(ReP_n)PF5*!XIZ=Klponz5l-w}CGcsjMUXc1{1b#RR-?C(FV&_Fm52y%Tt|ll& zq7C&A7PQGdgkK=-K{b5}?BKmk?(8wN@lOOV^t@eIj}GU9yF}ztVH%KBJo4jJt$P0Z zAV#H!?gPIg1F_jK?6E{QLl9fK5JU1d0~sxYvKQT2Omdwr-0h6{>%-4fOrrMUtO)<`0whaCZFxN|M*)x~MiL&KQJEEH=+gmUwX@pE6xrz7= zAZZZvoja^EvO?{=#+Xhz?a0a0%JF{#oAw@?Ydc__&e}W8L7aBRZx@FT>!F0JSg0k1 zgHy$tVJ8k*xYfvp#O*C};FlG&#;UN5~=l=kZ4Sr+aOaos!iS}!t2WPklSc~+# z;P&0c2KA7`dai?73E;4-fBH@!-oXIhnUf7pEYyyHGhBtei1@!?$%bVt*agEG3?tr2 z0pGD@{cI`Rlf)WK!9mQ~3qu%aaM41Xp_&O;`YJ!L@RhB6!Zb-?&SLfa0}O+f(zNyn zdw$sC`r}P4`C%ujx@3WlE7w-X?@LAO;lz6Oaq~Q=+xo}b4PCemj;CZJ-7fDuO=k$| zc%9XqfoLh#^FFCL`ZH@{q5gYoOE)tdSM9N6AOZ{poSMEua!9g$0#S;gCd3OV=L1b{ ztUA>m5_5k`9A-BH?u*cEpKDvfz(*JAz!>V}^8$Ams&?;)J0wl(ZT10ZB^cT$^F8tW zv_VGXcSWNPw~Q@N9R|^+v1iXR@s}uJ*F$;lj|DQyb+OdsEBj5HHQu{a%8q4Mb$yjT{`dil?d?Jlwp|%I$yv3Tb+H3g!~v3kzHpA=r*l@5XXwO0ju^i zS#g5AX=~7JygkwrR8V{Iy`x;fU^X}hLIr#1P%2b~>@QMzEYv0+KK;2lD<-3ED2VQnh*MGA&{7jY^XaVpqC zWbpYZ^@33>r_kyfGU4gt$OtUNTkwgX+9vto<+SC0QicbdiyYkpd{ugH22vv*%htSe z&8wmV)sC&byxAp)772MJY9b^s0qX7vMuIGI^Df91S^k=2@-hpL>BjA}`;;`t$IE{h z2GE#h)BSmpNv2%-Z*E7{uJyiWiIu!}UCU=ns}8+E>I&Cqe;+8yN9c`XhK^ZlCC+F-u;vO#QnGzZdi z-)L#Xc3BFH)8@^Ov}D)s#FXyqQ?b}8JO(Yk?GRVtc}sxLB4I$z`&^=b1nh$*1i1}x zIe`DQ>LTMciZ_Jw@5kgnAl16=?jqq*yc z;@twiwbXza_%P&-*LF7Z9vjAs%*T0NPD_(Kv+6xlJ4B+mcyXj;>f;1qm3&F<+vNaf zld$@Yfx5*AT|@4&xS(WzA#b;g_CF$a`gxs@Z0?Z@ zb}u5Qx8DH_6I$aFxHXX}J~e|AytWv0?_Df!fdaPCU&OyNIvKdXfZz>aTMl?zL6&<7 zI#ssATWG<=j_Hr9emeDoW;a0S0~P-QO}VkQ1JyFUMe_%pBy3sUB^KU;9lU*VL-PW6 z!0-hEzWx5lYxi%w)+bfxUxioi)WLeh4cCL52+MuXu(y-d3;ZB;h*7?O%f&SMzKB#B zL{8X)0s(Qr00Ghek2?xQV^ecmoBw_jNm8{|!xTgD5k*C{BT5JTV*n>ABTOGZSS(Y( zq5=#Eq!W?Kco?c?pO2oXHg&B#a(%FU5K72SaC^(+%jGM-%CeXG{j1@c<6COU^_+In zJ$1jb^ADI#=<-{66O115!W~0U8J34KfUkPM%pIMOPaVR-P#LK&M9w;NEAoQ(7x4lB z(4uTs@f!P0o(N+Z{CJhMuju1ha38g&y5@4u@uvjMnaOpL8NrE4jc3)Vb%Lg*|02Yi zN2hF(Nf;G&;uaO7x_E-_fr!Tx!^NiU=h4*nk!a!QcZSx+a4SOqwKOWHzwUyEUL z-VQ2-WpmIKvwI{a1TPoHTw1&X^ZJ*n5GoU<#kc+rS~lnW)%RfNw@0ii7o48Ve0%;DulWU zobCXloh0xHNg;d@yV?__>;a?Xp*2(Srmw^Uz3_&>Tm95kClS({i6uS(z4#8g3y_x^ zd+aaG`i^-Cc$;K{>?%y+)h=S7ZM@{9twq!>c-~9c3Sxy8KLc0%roxSQO|l3>0ZwNM z)%DDr9^evfda=S95<#(r#I3ABo{-P%fsy7xNsE%9Gb=%zB6ACv$r#JHBuFr1MdK|H zUhH9Op`dzzRjh0W$kuP6#<+=#Hk^JF7E#3aD@rDy#Kq_48KfT))bU>hw!{*ykGpz_ zf(Miu`B)-HgaKGd#>~hxbD{{_=UXx#X_C|+T{otkRw=t_wys()Mh zYjmETIWG&kKY1|pM4Mq9X+L8P-27raK}0*Cc-TSc1v(h#bpv=4srl{%&?px3o%Vs9 z4$diSq_h8V>5Oc_5gFN!}((LA0~k8K{rO!H^nPXj9>|L!7>&j#e=W#;73 zXU*=wRXYn4djZQ1Yj~{>sKfk{*4G&{+;P)(AgxZZ-$M`ILG+=Z+NJ3Sa{rqqtkYkg z`RB#&IFcAnF)|iEBvu~qr{_OctpAiRak^SqzHc!j_V+=T;(u4Z{qbJ=;0bvE3XV>uh#rWIWdnerp#~ zGM?M+e7t&t-`%f&uwmYQpP#}!@mvmw+BQVY~QnGG>tn z)`b&Alfe)4X*kPC2tQ~cCX^Ns_Z>y(vs3Ry+MmTvzRhEMB?Ts@7`MF|6U~i z)<`lH=eP68evBQwnjF^YSu5mZN)5-Hvy|*g%I#Pt6!%M-TWHd@{_Okwrc%M|yG1$7Zb~YQ z>+kflQ&hog8GCR?vW@8Tpvp~#gOP~k6PoWg>0-+E?R6Hu>9Nqh)Gm`#gB_vF1F1zR z6XF!RF4bC@fZ>P`+Vmh(vePR2vMQNVIn&MFTazdYntO`R9$Kv;$Bh38jKE&$EM-NL zE75jKd=r>co7IKY?`jM1D;JET5RxiFPAt)^JMxr-wo)^#TjwYwJ2(?gy(r-#_JAPt z`bDD`RiDHo5Go#58(T=I0LWS`_@x7tsjNN7rgAw*3y9sb2fW|X0GQkoB8U|?r5tTl zhxDV$(fbhrJHyD7-GO8(UT8axdlUe*JW!*$@PWcOlPqhIX-3wT@(_RWC^M~Y6&0R#q z&Tb2(Pv}m?3rGN^hd|q=CiU@Q9~AFamWkMZh!PLg?*2`b7@!0yCa_`LU-?VO{LB}s zehtNCS!vgAT)>&4AY6Cvl8ZquN7wWfI9+_xhyT9}_!@icZuKF!(V?d{FY zb_qi|046U-#ct@ZT_EzpeYoaGMgj2CQ3j?sjgsAUER6GynY#Rx3xK3ac->h&TL6&F z?>9$fuDxBD?p_-9a!%Mp!q3NQy;L+#WsaEihL3l9g`44#s8_8c`ef&fvBtD;29+9= zMf90>4Z?HS@Qcy<#URdTmCbVYx#$PP1=T~=d}!r}?Zfrnv& zL~O&@L3Yvj-EpBilgo6TH2BB`CFtD(wSIy7Tx|n8F3`T6a-7+CKJW}|o=^j_lrnFG z+?r@O5z<=PX36<=1+?Q+T6n3?pZ~Aj%q+Wa8071v{qggr8^_)LOB++aNFC%{QaZCj z4VNUDsI=*b@-P|M+0%&Hm4g9hFXo%qx@?Y`S|0Y4w#%7gU0Owkn=VyO$B-jPRi0oB z<7H6`P*>8z!jbic!w+NAGOZ9=i>(LHC2O(|H=M_H2{4+0i#fQkZQgVRVOu^AvnQa( z3U%>50gH(?YDt=|(w~}}XnW{}B1fhU5t+b;xgz0QC4*T?`^{?kzbU*IO_FY@b7rEjlVJHK}V>J$`ioEzf)fPs9J`qU6D+P^0uYPO=>vC&?)+Vdgbr7G1{og7i!n(puhyRTQKkBraDJe+|Ro1QXQ>;#ENT^a$52p+4pd!72oI zfiIDXc0J-w#=f)37MnthOvYruBCsAAV^NUGUpj1D`pxG8#mX}H=@GA;XlB@|P%P}1 z>sH)txE%#rG+YL2LBlyE%_R}jvu2>cbsg7_|Gb*@EOlp)x*b-rI zw_;7qlAW+FTmT$bv{|g)m9?5hyqtl&AvW&Ts9=>)6so>1wK1I0!Y0FXok!ziOWUBW zPT2enyq7_;4c+uI2yLNc<@(^2vPpkWM`RYHA8->VWNud7`irkUZeHrH4iB>of?6pW z&hmp+#Q0hlt)K8Li_z)wz%c$;*W6`5ggL4Sasz8@iUw^~dGwheG6wuK-=+TGdu?&p zUIcue_|SDPz21F9{mC9sY2F?rO9?O zfFR5C`bC1pCMbN()V>JVbQq;K^Yx{Vi3mKjeX@wK7L*7+Ln>Ywl75uuv3b3{r1mOa z&uOGZ=)qq=BHxJnCX{|2J;F_9<7lG4)MkjwRn)>>1UJ<5$b;G6o=KJ9FuLS0_UKmO zO__UaA5*DNxPcUEsQpB@O~Z>MLT&3fGzRZi7NUify?rDBk~?hGh2qRmYY9)18sSud z1Ejd%^Y{zQ2Kgi4iYfSurOx=|p?tZe0HG2I6o~$P0|uGFOUmgU>L<3NOWXJ-rXgyp znjq`Oek2jDMcRj=PXD~$Jpyh%Z}=fk{KiG0T&3LG^yHwLEMP(;$sF2 z5-F7SR!IHrN}AvoT4zW}eE_h*L`E3-F3@p03MO$W3m?oQXw?pW>m_d1Od7w++Eq;| zf;KjCDFdX2_#;GvF+Up8i75=L$=-%n3gwo086)Ja67&s4bU+GN2TAA_AuYFwz7xMW zZL9y{Rf&35B4>++&D9@ur-F5}JF%x>UAvsJ!pN~qr?KzOQ_59^J0ykyLS?V9a+@AhjXVUm$hD3W{wrTDc z+JAPT|Hul*mu31XzRijca6mxcw|*d72U9vLR|``sIu~avOMM$URZIDQnHB#vL_7XJ zQ*_FO>NmY>`-m8q^Q7q1M)6y_RNtc3MwSlh;)3)WO{dfT5Fl>`T9DL17f>11eQ{dF$BvYn+;XL z?G8Jj?v|dtWf#Dbb8{OXV8ZR*-?Ic*#+BuGhP+hSx`~|ZaUh83YMu0jeIb9jc?*e1 z3>8Bw<#KVQcqeA*X-sTQRZ>&)ptf?Kv=%i!8dMk+xdK~iwJcO@L{{%%H1`-KN{>9@ z@~WpJoo2FHFXSMeN=;jzae1t>W<6Y1+fIUGVTEw9)KlgfWjY7SrZHI?@{;qhZ2~^q zM5uTiWffXfomUP|>=f?UWMX?&{QQzztOusl+fOhWdAH+@2lnoO@A3`bIkTiow?jyw zg%g6gvC7XcE`;-ygaz;w7paJkz`)~!L(<*f#$b}2T{BQ9;mbs+8>sEHQ?Q+5vWlYAq?= zY~*kLmda~$5G?E z=dOcAJJNdpWI06t%%IiOm&)B$v>!~Fim!4!1@o~0uPK*nNzS)!`(;wD5l@Sejod0C zyEs^%=s?Pr+YR0bMXL-*4q>z@t7TzFU$Vmm;0`lq3iX5#Uz@$4R)ZsShxirYbnZ4$ zEh-_T$?SIOI2jk6tGbnjWQ;QIksw#o>#G&m4uoQo+UpFszUcmHghP|h`l?w01CPD^ z9f1d`SVb1!TLyj=ujpSbsbalO;=iYA!=K}S^pS8W81p87a1(jiljX8nk3!kQ%@=wV zoKx20wDE{TV)J+9n_bu}-vCh_)Qtwln^N9YwQj6LvDq$H9MiZ?aoQ z=Tsw|Lt8+$2;b><1YRp^{H9q?=n2$&ESN4Vq8{v-lYIW<3;Sp*7AFie_V{1CC_%puEKg_qg_Osg&Q+c=fJ2( z9~iWAn?my%Z*nUlgA9>0+5etr{ZHMU#k}_@{9ard;sF6s{x9q9zsCP2wSOaC%@bSC zvq~+@f@gk%uCydYH1p4x&B|(3<%vF~6ZiUpot6UKfnOvg8yW`&i)O zYv$xFL6o_N;qpmMooL^>zW_&fi|^{?&!v>PuY$$)s+m1jG~SZ4=sEVGdu82r6ZEl_ z`9|q_XNvB)^fle$SaeHGJrlolgYx~_-OR?sQ#*h)>M1U>*Atc?UId+n_&jlabY}Vw z(v|5yq^rKTFWSp@5S@2$3~DHN*Qa+E=Qoht{DGpoj)q>M&$n=!|*Dm{hifdO& z2gB#;cr&2H5d4O=9Ajd;D%ne%6$`*)RKL+xcU0~qIf;6EjdXO-+WN|e)99O8s29Rf zQ$##Gq74XNT|d93c-s4=`U60nocKJ9x?%Jxt1k9awaAP=(nwyXw7rYS`Y&?XDQ2YB;19 zhUl+=pVg#62SIkxuxNb(7$};MeTA@mfjJYmFi7{rABq8bW4D$saDmMtLCvr|!6o84 zD0f_L>7qR;yBHW>Kr`cZkTK&wOOAhPOA=W%C*=DU%FOiT7`fqoQ3oP$lDG+k^z=qD zUgn~GNmjO-Ey`H>CJ_AaP1(b{mBaWFk^IEcjo&j~B^$uM975J1|2<1l;N)$84ubI& z_?XHdY(g?g%ETo|55Xc!%Al?Q6xw$VCK&2p^5Xai9n@et08lB&TANVM^MoUfD*t>J zf>@j_w7o80w)tcwwY{Lq49fSaqmaInokZf6Q8p*ecBqZ*rO;4YNR%7PIM4u-Se!O5 zD43_<-&XMuNKX(gM>$j=P+lV%PaC*;M)shXj{MF#kpZlBm-A=eAH+IYcojv(D7x9N zN~rmpw20VD)clN3uIi3Yrs1FN%r$c<=AOo@bM=3$%|8dxV3j6QiIgm&@CN|!uSR#jKnGa;t^EaRY+ zItEthajUE+U-@L{+>Z#O8PE=n!(1k9wJg{Vs-Eh}RL3zSCVzf@1qsvvc|UWEyqQr| z%y|z8ZbloPS;B(yMjWIAOAIQQhE&CqtR$yk<&Ak3eha82QsT=D!3*EGCA!zP6T~^P z{Rpcrco_D~Idu)|mU`Igd=AKx1WokA%lUXQ8qvM4wCO>Rl-;cb^{92$N1*ou4yeTv zn<7Wj3)Ec&=@t8NDg@1Z9{R`58EC|~F?97fBme4za;w6e)7f5$)Jio!OLg3(-YL< z;|Io)Kqr?>p-K$l#RYJ%{^JJO;&u>ERg%ZNe7Zm5pRZbd-?CL--mjE{Nw61RePG?# zEs@%tZ!}d36n#DYE>^7)Gy^poQxpv>dxQ?8j6M{3#%Crukb1anoDkS4d&@x(&=vnk zLWwr$`fq>eSPYl-T{*)S?J$BFx7ktZol=O|xAssr=<#?{b7Rc%$=Oi2sG`h-JI(|m z)0Kkc(W+_wM{Wl(==h5U{1UFx-{(>%d3yEaOU|}3nt2Ch8mtJPW&#gk{51xDbkM+L z#MvW|GFRC=FlUL*kISU~jJgS!xw1G) z78G7Tnr~Usu47((vE!I(i&x($QGxXSNZ zqq--OU67i@Ro<{-L-B|p3lh2#yTAmc7uR3d0EcgZJK!cy`8n78s1W@{@~S{(e-)2E z)DWoD8e_#xW0p;|sQU!O9JT1Ug*7+%_}oXyv=jP&D0`>y%)fPAGq!Epwr!gg+eyVq zg%#VjZKGn_wpFqF`_H-8wdTIMcXzMD9DFA^czXJtxK`3xVpLQ<7r2Y+d7{oq84cAO%zIYnIByV;d;&16&q*udDA_odv4bq_)?g=g z#{5WHZ);n^gEE{Ha)D4_{r#YNE76m+^7_wco|FoG3n>j+4=NGDi#t^b)CKWIw+Xqxw z5ak5Dk9|(RalnQ$Vu1`&-&%^TH-hNV$Dc6!I?au~90>}F|B&H>EM7|2W*(ww2CZ4baLJE8q3(Z7fl?~h4^*z7`UPBmt9eGERxwgtqCntaOc>Oe_$lByHFjN9c* z;Mz4I3#?xi;7WehyrJ%>*%^oy)QK9?>1E9DxC&`Ry6_yeXmM;EN=3)oZ8|_b8a_$M z7t4P@yXN4Q&4FlV0+R1}&7e8;h<{!!U#?^Ra3?nyaK%N4gmvh)A8^B74F+4`k8)ip z-jnMpL}|(QVX6i06!@(_!x-=NS_fRo>bs$S)%WL_gV?2TkCh!hbE?$6a0q|vp;!wB z;9ZAG%o3venxp22vWQ--E3t)+*$wbxC**ptDD{}`TkE_tf5`xBZCz)nI(CetgjSd4 zEt#D7W{&i~|BOw1zBrNV1ZULx1(9@{pb?Uz6|i$S^}@d$=wi=TXHe7#-tJCxVsDDy z*GtT%sDaDr=huU}Jq7QIFX@ZemHND55(iWzERN$?4T{eenu>Z}J9IJG>G-U@>JNMP z4f5Y_EdP)`%!Br0Za`209zgs4-``l&tnADr6%{4r#Q%3IRLc85ReJweq1H^-Fp%a| zs6$DriO~X;%3%ulP%^LxM8tFn+u%X%*Djr(0{;GfF+AmN;V(UU3G)BtpLF$4i{9W+ zDF5%ZPL~tE;~w)rg5O_{oWHzZqz70uRJ6o}MF}H}wPf=#5!rBLaHz+PUsT}GnX6!j zLa{gwYX3-1I+VZ247EhyhvtYB*BPvqU8ARJRAg=-VqdG_Ju^9c{ym%>&jnkKH#%{T zZPB}S+NjNN>uG6k*PxzcCBu;0c)-MlXiTOY4v%k@r|k7PzdzdD{ndGY&39X=x!+Osa1hW-&p&S7v>AgBt$R$ShQAii-jeRmh^3)JZvw2VRDM4ugxqXNlG} z&o*-9t@CxZSb30xv6*m;=6P=KG~I}CcquVim?xG7l+&?M-s1+Ch4aN}MvPR0hWh;c zNFaX3ckcah$5S3DG3CCg8fyC+Ex!I>*wiXHa4bgkgL4|vg&}kgqssmKwJT?bXbZYF zhai$_pE49(NjovX>b;TGTOipt*SlomS(hV~H+ewa<$18;%=WAyK+$3%l^vTWHI?ZX z{tmpgfR%%|l_toH`?^4eGw)(o6J8H6`YPAAky-L5AK#09~o>O z)ZM?~>cL#dOlwG`)$({#jr8mH_EMGB16K0ug`x3;<>>4{I>*kGL7>lkqonB{k+h*7 zsPhvauE)$M7G!vG6pEIhK9Fh}GEu&PDzvr-pV{vC=kL>!u4g48k_3pT8H(wop{b!c z)uIwNDJig=J?^OrTn74X#>L`j+XXWb$OqwY%AgrrjYA4^^T%puyznh-~5AfOej|F1WP|DHqt6*=&B zMbpIomjBt92q#KF28==^l;5@nHL;;Xgp~kASqF0lSFQzpP_Zt##4)mh1oC>hH-{I&#zL;?BxD`Nuhid(Hc1^R;K^`Rh8{ z#=+1Ny6@+Q=+JL=+dthj*9%B}-8g7IML8OTMKL9^4+~1qvK4`yfDX3u zniXFXfM4zPzgQhqAvde6o%U#NxPo1sZ=!5*nTr>#+g2RLGe6#ESuo&0D@%~UFR zrAa;gu-)chog?;gU&hPMHrle8!8rpdH_(*Qerl@CZluiv4InOIvZ_h68 z_)}jobq<55A&)zn8B72@QelA&qbcbL%X64;co!9~U}1%fpgDytBSSDX79PwjKCPQo z7k!vMFdQ{%eNG9(p?T5sSS(j9i^D3xVm3pwibBvO{?nQl27?;|+D>Z7FEN2iT1SCK z>zvGBy{@DX_MOa4d48%<(8pH*pM!O6vx=x}d#KqHvhIG^18;NnTl6pxmwiH=M|gY^ z3o|vFmW=vFhpzX~f@b_n=jkmi4bpR4MZ8@$1QjGVsEs#0ML$6%;)2I+(j2xW;=~dk z(+1pzhPcX|3aU&XKBEP$Gmi9=f+qf^h5?Vilg2F^nKhUGFkzFrDOl@D(aF%@8niLo zSGc=Dq$y^tyeY_6`+aw_bkazAdj1a)3vLtC}<#u9nWg%x%z7Z3Ice zRd0|SpYe7h*H~f54FCQmJ@8t06bWC`G5L|~A@@Mspu1=vlgD6~(GBl+xk=XV1Fj)j zoR-GWTBe2C+lm;&19p7gI{6_7*RGhI^VKo1m0MnXhuvqM?Lk7X&GgTSozz0 zbY~2nuQ0*07uK(WgIcb#0|&mYkX~9X4PcS}^UUA}i2X>bGP6lJhdZHaR}N((wrsw1 zJ~N7$2YS3#+|TlIn^(dCn(*_9X(b0(Ww-FZ)(u*GoVfxJCk#t~MlgxBoH7ZO0=s@3 z$Yj)*2YY9pyFfOM;sS!mV(Q;!gthP^#`}kbzMkW)_Zr|&>gYNmQD3Vi$(+_^Wa6$v zpgtfq(CmVoqQ+*b>Jn3rDK>vLy%CPS;5O zS}nwAlet^1x}m@+W^t6;g%gyci1XRVYmykHvw}mKrW1xZ{*oa>h+vF{;(O&Gh5e!b z%6z6t-U%jJAMhNaxEa;M@}s=Hp&GiwVQwi+qua{589Ncaaza6V4m{+>NLYnFwAr^mRgrlb^$AKXfVw35?6VhUVmc~=34JtJTX z$_Vl2oHcwn5zG1-XqY%Sa0`~-w>ghg{B%mLC*5Moqs5TLYr0m)?r!nii&KT$6S<;77Ch3%Ydqm0|f{{0E zd;0;)de@u4b;4XAVi?6(45P?ZimNQxqUV{XU=gLhl&p-@CwWof!(d7)FARM&Yk{Q( zdjJB6-ZA{>g4)nb+usWPz-46v?&^p=MVS|Z2JYS960>?ACN;)Y9HTSrhHYHuzvTBqi^cqC3KW0iP5W#IrAYo7^^*#hw+ev=u<7wX!m(u+L z+5z1I6JHUGox=S6MzP}rhPd$!TLRuo=!-gXMmS}8(S&-xF|V6x_Ta`dggh5+kd~`& zNqP*HAF{#jH0wb2Wf=FHX^`Qw62jb31b+)I&RrGm;nsjbOY<4jKgxjX`^MKUJWT0I zlsJ@L=z=v5Mrw(Rb3^W=JZWf0ItC8Y7eFnMp6Ns?2?sQf@0r)wi9?92cuEjoK}{j;5vq&s)XeXmP-}lFVSkd%C;TsEp(Q_gI0df4lvZ8;^Z7$LP z|Ih!!B{EynP89&^{TQTIku;Uinn}RvtBIkMeQdz3$jQ>M`bA_an}^tKe;74pUfa(; z9Ob%}_~&Jp|CC7gJ4HN=wf3H#QV4cag-ajnwz%m&X`k`jI=u1!`he|Y|48a%(eP6G zg9)A0PlIUqw9D2bGkeP;xkCaAZqkJV&mbUD{c8M|-vQ+0qqc%=LMS zCQC&}W-HCppZR$aW?uSPeiN-wPFhC_?ale0O-*L2XYHY-GfTASTj>P4=warUZrL?7 zI4M0^wE|1o2~Uef$zKKf%aiI;%r9$(QC^v$vVHPE!0Zm%9f{2BD@#_s=UZpdZ+Ku{ z<1I&4uKauO!GF=h$YDLrD=jZBz$7)p1BHsJmZZjE;mBe00kB?*wlbqp9)>+rjkH7= zy{%5Km2bbvx(#CONyw$C;`(eFf1-hZiq$qU20>==#HzYE&7dlif;UJ@Tz{(yN>4Th zfB5hVEjn_g{p+?Hwk#7o=z`E4b3o4;?d2I-ZGtQtQv0 z13b3sx++y|$bPPn8G#?ZJ_LkP+vrSX;sn@hP!=qYo;OcUx#Qw$;Kp2?Xec`!dg2@yYB@ zw$rlhQ+p>mY*w;aP8^K^-?JdyB_-ZbX$C9sk_Z}mnmV;rEKMf_b^?ZSu1H~Y=}nD0 zd^~gpK6JN~pMY9a2AHTGGa*#(ZAY7uy!b_DH9E}%m z>6T0Ti5oj*nmInfci*twa^y$t{^dfgsZdb`{M7&UjSsUcdgP3uEB?U!IpQAgNBp?)7P*EU6m~5@(?)fdN5gr z%q}+FJyc*i-DN0tKx%0y1w*M$lG()|4~v5?i1<{PYIZ(|P}G)wB=im0CVDs~7?z~7UAS&>Bg?^G&()##2=p6$@K_n z%xHSJO|(gLfk}RjLNNO3;v?iDC|!EyzXAU613{PXKa1A?nZhd)pC#1*V&4HE_Kg3N zDg58qUTq0ofU~j7^sfktR3BY%*qj1IFfy1m_(CXgUoca+oD@{SOIlYjF{{HLx&Wm} zbX@VK$m(iYyDMXxW*zWzreqm+yQ`8d-OjZsz-7Am=gL#o`?cJ5R~NBd@6W$S+wa@H zCxYMH&zmmSz8_1!6@mL;G-&#(8MHuKr5!tAZ5=aVvASB}B;98Z-pf1%+1*v{fvp9k zrhb>b)`7XNY3$Tr!g#$vu>;V(y|sYE6#wF;?9>SKvw-z==`kvU2M|HhF4Yvii!dl& z=^UliLmce9V;}+RqEAG|?{aSGCIR`zSS6PT0zuI!3;kQ}7ry8opmJc5ck-7UupNtCy-XZz<^PS_ z_aMHtxBp+g1-D&Te;cU zL?7(WsKZeB$yDaz{(PxSfmVwV$z6=cU)6iDSOlb{uc~OX_LpJ)Ewv*(= z++LBcNDLy$BQ0l0*4x<~tGxMfaKCVSw1>YC`9_R}rNnYOpuXoHA&IF!R|Un#x|FS` z!%b*T&C;koHo-7=lF1g_xCk?Sc^*eo+j0U%(2%Z*4vG^5fZU&7ss0DKH{~iJ)&j-c zzEO8(><&;P6A?rHgB?*RgF^idgKd}uZ_y6xHJc7asANJ4XM3%oM=e?4?~M1je6$fK z>6KRs4Yu|5oxW{V%flXDe%Y4!ku>5_kq;ejY6;RPS8P5_n^0nb3UM;i zgF5Af-xLhmbyMPpO>tV#5)hY8Uk)pH2Ax!3DNjWLLt?Hdvx#iRk|HB>D~k7g%Nzs{ zGtj?bLaAZE#ahE0nL-qX2pFo0QMpzzs3EqLg=^6e6lCne{GEGaTG|TIKg;gAYL;ru$56J@PBHiq7eojAFiQ-Qn34Y zCOaIB@%UqQjqKDyiLuCEaizYX#&)O%j_M>KLMTL-CF&U-Hp&dK`e&l1}obNaP6NE9#NFRFpaTS{!7 zS?YdSmJe)$6eE1!Tg-xG@xn*8XH9IBTTbjRgzvb$T+_AQU36@N5IdHK0gcVm5D{2R z3(V}_S#Lt2{w8)7aPivEjboEBNRz_RiPCTwXnjU?mML6+3U!fnuh^m*H-`R&?+^6z zMNy99DzbS+JC|nD9NunM>_6E{+%H7)gDZUMo#;RmCh_>()U1kfP?`YvK2dXlHaFop z#sY^-nb$5lMrH%pQ}fKt22hKx5+@nLWY$>bh0waAcv}2oki~s*st$Y?0TC)%dT^=AzE!Gs6|=g4^KLd4n-xt(V!1l z!X>Abuf4rjWDoZo)1TPm_A#K#-o16s0s2@&ztz!3;xWiFAGsVz~ z--{vR@GZCEa48X07tE(?Dm(UN=3|abqmQgqj#8i0@Np_M2CRtsN7S#6Nhw`lJVL&8 zwpP z+5){;{DBQ9M}L?57r?&<0DSaKib;bQ{;B^3@EZZt+mPn4^}wIIrycFvootuolHqsu z@~@hA`CsvCz_on})Pr@KlS~}Ey9}2ir!cZYYhBafAit7d(CN#7@b~=i(DU%yZktpX zKmaS;AtP|SMp^)Xf7usj!DnfjagyYl3Jn1G_WuI-?*M?mNpet6Avs+mNguD9 z6mX7xh=4}6Vk4|zm?u&)lO5n^rd)DS$!;DJ(`mj9_Yed=M+(v%F{Rf*WhpWsytq5q zGq>=o2mgVsG~awy)kabDDz9`pKJ+yRBKzJ67L+v8`_o>v;AWFCS2A)dx<`!L>b z3Ai|g>3U?%!cD|f`^2_}E#bg@-tIw6MMcDMgZ0hB)R?Rt2FZNtP%dN$Y_ zV~o8452VbhvJsOx>l!Btm08hrzW$6`-6A?MT7%O<#ICaj(@1b=Mp==7R^j928k&!f zr39Ob3|YHZ5E)S72dGN6^!!0EGG237PSYUYJ+R3}Eb^DbZjPPHsP{Z+i$>t2TwJ6+ zxr=0P!vO{9(Cm*$B#e^eEnZ-HrUr48Ot1o0VU;}p?tCH*++p11oi)z{XfH(NqcOm8 z$2V#_c&)_B$bI6UBE{Ef>i%Mk{j%08Duw@tY2yS~Yt=|EIOF$GH9NUQav}Mp1sua= z*&&=+>_+?W(E5>M`l|xp4Vm9r&<`QrK8WrcC=cNizXAU8 zzW}}klW)7FY1hY$9C8{;Y=3(j^@3xLx{NnDqxfm01T_il5^+!En8+IUvJG8b8Y^S5 zS^ZN%|EqXu3MHT;-LxJzT-y{+!>q2C!@|G1E|<#Oh!bWN=U*M^)iWEj+KU-@=frIi zc?MKUCwQQoHarm30M!Cti3^DhM;agGHVMriG`-A!_dSVhBqaopmlV?KW@)N6K&_x3 z&e@L@4ke5j@yVP@J2dYqM?=YS$5QY;n)liKob`mrvj$GeT}Rkk6DvI)Xibu)E!AI4 z3%!rc004Y}e*peEvC2K#CJ~S!BZJvdN2?%yVWbcZDgPm@w*9<@z)7#dcQ2x{%|BA9<%>gIjOsNC01c1HH+@=?X-wS(zs;cMj8^|rtm*}(fv{FrQU!ys7wSj0Q`PwB>zA8y=Fg%(0~1b{`>t!6>##`L1#oR1@QYnfYU$s|LNp!_0!1JOw7pDNY&QCRn*xG@Yg>N zG5;IK&(^q7*^ofvk2IU$AOXX%{DmX{6V41KN<|$GjRt3bg(Vs=Pw^=gqRk7UZA_LP zT6$LdWn+=y8p`xJ2YD*m+}){x?|7*+8|8kpz2)tCy)y3q`8kpcBp|^ZL6;*IH=u*I zH5zHeAIM-UX7xfMgPUo*iZalG)uUFAD)p7*OM&1+&Sn_7SFRonAMrDRn9V^ew6)KXHDzNZ_9578HT=jVmQgc8{F-d!CstBY_sE$Y_rU(EjAttE z##@ba#&nkc>=Zu0L$Iz%vkf~yzDolXlu}Q3T_m^V#(ieNIOI53+K)uNno^1i8hB|f zl}wB^VGd@bzO&)dChK6L9V#R&NJc#{OE|&NG&xI(Pk%8DjE%Q$io+DmGH`1?^f!uS zhgmOZb7L02dy@Z}PCMo5EXPRKwMns{NA8r}jKq*x9vRWNxNVb;#Rmnqv)}@s{JJ`$ zYm%O^8k28>+dQpWCZVMs-56YruWr@9k=r=BR(45nOfI~AUqK|Fn-=^2R@oFFG? zZN`itL%Zf*C*n1_sm#r0S_R=Eo(}TjCSo1$TmG`d0&umDJmHb52z_|)D67+<9ISmD z`vS=Ud@^=NH1?!hksxBS7-j1-cYY5R{=&KF4yx(v$i_mP>mXOvv}H%2M5ALEKUL3O z&IdS9%;1o{Ac$6|qm@0gj(oVvK_(|`b5~t^vz+Rh(sFuS!-2nEFxq~Qv}()P^-rDh zRgK11oLE~y+Ez+&wLj8&YzfJj#SC-onS7*r4dVIUx|(I%V~2H{WJHBwr&jh44k&-r z&KdUz@1k4j%qp6wT{aLj)f;S^yz?nemdkW zf6=BFGCI}p|V9ji>Lk0 zqkLCe{fQ1_cUa%1+C8KeNXc+PL;b5kv)Zv7b4o_0uq4j01=_G2g*&=VK^c^`#qcG- zf9z0CJqmk!0E$(bFD02J+f7+gad>aOOPkpg-d&eGN`D5nc%2?%w^-8?#@4BkmX0lwE7h`ee)=_|gtVUaytJoZ&v;2~-RjCsJ6 zLk#1852QJF2deLQX#FM6;hgo1!0jb{kr{rZ7s2(+Nh!-!){W#A#mu^m>fw7R^+JmO zPZjJx(=WADHqZ=^8c+bF23Y=w)9=611KJ*_E9e3yvN*bM9{muL=BPyIBt&@o5aS8! z!yJDRSboasYzhe$T^$k`&bA-wXMC?! zdl|mlUDyerp(}hsW}b7}pL4!1PYk;M-eB4z&GA2ICT|~=@;}7M+&rnW^B+=%Y^%ba zcYnMJ5Nyv3p!^dS045M9oBv&b$hYL5ASf_7AnEZ!g&2E#%M9_x^{-HYpI4GV@w`db zvz1_V;SAFwmnx?Arp4z2m~YJQnfsGOKA(O?#W~FMHxv_}^zu^AE834&b%>V?nVH)U z`0aNJ)t$c!+#Q1hjeI`3#W!USSt30(lao>LDpIhSCGqDm7iUfJ!(L=Q4HiY3#N<_R z>)cq^xW|kRrnb&akoTvKGoL1D-jKZSBwT(>=EGG3FwJ0ZkTd77UZYXuqWY03MhAqe z%r$YPyxewFYMfZC(R*_HP4PGjiX-*&Txn6~cTW812M+D0_0xlSqt}31B@Q$}_n#aD zI-`RpuB>bVoEZ`HrzuWitq)RsR&J$mJ|R=-hrm>oii)LCY+A{FA=ZV`fIt)y1xMmNp!`#lF)rI#N%Wl5qaE z^OL6aaEFk#;M;sXtc0^f{&^pQ*hnUUZr1P96cJXKrkz8STmv~>2@*P7CtUO^M`#G?D&Q-^vtj`v_zFJwomTTzEsrH;C0~yw;+FEkgKtbs4aE=e zPkn;}X<;!wn`mrEOj)b{FR69@PgTu)Z83@R9aU7K* zQ;iha8}HteXU!GKbcn8;^&tBAM(e)B%cYi`36g_#F^X8YtJl9I}dM<}2Q{8P_GGZbuZ^q&faJFJ6*r?EJn z;Sg+Ztcd>kD`+~p5R&=J8%2HeuA`;3f<|OK_n4mTok+>*g6!!0CSoTYskN{A#fpXQ z$vt1{Vdo0dg#)ij$pv&5@)$Ey&6)ktRv|bZ<+_YosOp=BapW8{loSs&t?z#u09k@6 z0@`9~(S}NI&^@NYl^^;&3_2d=aPK87)nrlrwhP0$%|agilZLbv>Ajjh0d>`ZH-nBv zjhHt*q5ZDIaOB2kmZ!n#!@i*XZsM|B0ybJksLFbzqR1;#YqO(gjSx6#r%AMXlL7g3tS(y{qyUxtnYN{rS6Azul)mNv#@={G}f3kySNbtj+4 zJ#(|3BRy$7+ZL43@dq`r3<)N!>)ck@D>~pBA`pxoOelC{1n{`wD&Pwoqpk}%QK2gm zJBTvM?Rf&X2xglngGXp35ILc#kEk9@sJ|}M_{ReIX1D`=Kukx;2XCP6ctt*nL#UX@ zqnH_k-Oqz~T@JTALwvYZWLMdQ-CTQ-T89O0!YVOEZnsPQaN^23hd3vJw~I-N36ZEW zx*3(xnjV0yp0?6FYbnx-Gw_x$?iJf#Y{ck=E-{d4F9?SaK?T>6IXC>qoB!>MSdP46b=0jfb2`EDsmP%Hq8t>kOVVKNCHDI)*KSoS9_2p za(|$JY33al%1J?@1Wh#>eE`^Y(O{<}2hQ9S2Q7KWT4Ie@lQ$M=*Oc@iaQJLf`%^uo zlzI+vHBjYx$YT?1rL^%GNq^;sq1bHV9{Juf#>< zWA|Y~eMZR;e}Bx3D1Ooj4)|iigAaAliM~`cf=X_XE1aRNXJqwksIUauXGet>KM*Gd zYs*D|8DJMNu{qg0NZ6|;klti{aP{Pbn| z-VaS2LhQ73W44vxj-3Lk9s4xGVC!U7wG=w9ikt7ZWIEqS%eI=TT7RynvdISQ(?O-Q zZAKadv70JORJbeanTmDyU|NlsHfI$6Fhy~zQ$;ek%P#DMa4fy*kP(pUter3U;g%wz zX(c;LdR#4Bo7T#x+l)I+#8<4|#dmQRWdLi1d%Fdbd>yRP`NIe@%LS^t9P;~Krq$Rz z07HDIjc9gT;RflR*NXA@QOodmZ|B~ji^pOvUOHQ>S%r`whc%v@Zu_!X!&UDMM>cKLcq#U{S@%j zB2jj}<+5%4^qKnR?x+*BcZ^!u`S^k_pm-yMd8|Bzgdh8u7FkZii0AE`8{ovQQd*(j zGuz!WE;%mK{G2;q_m7-F6!qBRh#D`q3XleU)l~55R1Iy_M3@=xeBQaWRezKD2(NEf z*af;Ke!B_S-sU5Ht@yvRJfoqZZzdzjp3GOC`Rw(N8&^15eC7n-WnJ0Y99tl^%2#W! zySvKLURQBT$Um<(T%X~VTovO>^q4Xs$*lh_y&nzWgd)Tfyg)vhO(3HBInBfB?W1(&|oZDM+qae3x+k=)d( z?)nlJtWyzqf0Lz7sn$|T6QPWwIn`*1vqsI^0Qsq9@L7fWGz!HcVvp0cZbC)hTRoe+=P2Ol94#B?|w?Pw;CP;Y4;X8>KtyM23djn0U93-ZfXK-|k@2}IrBK`-PLslh!4 zRuAmzZv34nTz0vP>0j)~GPexj_N(fpgBoz#x0<vQTd~r*^=050GLBD>*`5avHc-UAm3h73Ar6SACcwUOREW^D!ZD^s@QLUc8VOZlb!~9qE2BL~$kcfK z{iOHzXOIFUD8ecUhG2mt#z&mQ64m~XL!%!a@1x3u)c)bK%9l64>l$K{Jq}*DweyHP zX6FtC4!2982=Bi}^5?~a)Wn#D1Efiqk~?#YzM(NWEi+(@aVXJFloGba1=eF#zCER~ zP{Ilk5C+FcMnv?!RbBB=pI5^7Lvg}7r57&4^Ce^Jzqiy*UGyUd1#TK+!TIMpW2Xxz zckm-Vv<2DrGlw&Q4W$lA5-xXsufy!f?`Ia2T@=rKh@zI9&hW=F=#`S*dK~P=BtNnl z+q=>y2Djpbar@&iPb_jplZ0m@RP9|gdKlQwv2F>-O1Zm=Y#EkT}V?m zGyzel-~OQOeXdE7gAr7_#T*dqN=eqjI$-g^zcA6dn%0@&SQ6wcS%j^c-LJaWm!JAm zpQ2x2Av1Fng;)KYo?`V( zYl$#|y7CClZ=IfgS}(rg20UAE~la>f3BUF zdsHx!!ydkwJZf4iuF6?sC@YTnx14(`LSZ_4JOj4F4(_Z)Abxx`NINLUcv=K9!JL4=Gu^_iaQftW$>lptg0u9rZG&5 z_n}K9_lA_@$XG9U5c}+Q$5=ZwZ>Hk z;Tf@k3wulCoaRNWYvOw<;>7nST57@<>z3e{f9fr&KCO~ERtz=CmYTOGq0-$5a1ze+ zPMFE#_ble8@VviK$z1l>a1)d%Szc}Du{d5uR-1n!ATVWRxTa6$G)^Uj>aSK4bxdD2 ztjgk$c<2uBwu!fnTK8FMwuai{Ejr@fSbHG0vON?iiVD_t#}dF3?ux<_?wP>5J9368 zviU^Ju=&I=mf@>wIO6mSYT6Q5z2iK4{4^ZkJcZuZh2OdBgnTg=u)&&j1go_?6-y2D zy#U~Ks;<fibBN(qi+m&M zguoIZnakkuo@Q3zf2_a|0&YOJApAq8W0Jl7QX5|*WpB|X>Z_uKGQC9gKtK1zGn!F< zwGc;jgP<0H+~n1Y=3EW76YQ5Pk&LIDB7HM?;F^Cm^q= z6mv^1D^8~JS++DK{{%ba43HWzdC~Nmm!@!qCeO^)uSxhNv``99C}rg+SiY}sZ3-Qb zVg@q<@V0wu83ZBb|K4s)$00Q=@&E12B`4^bS5%CLf!r=-a)q*(d^!M9J+{kZ8L|;% zlQk2Lio4Phb)td2qPyG{gEEX?ocq;KV^ewhdExx2{+1s~qR$zAUAm)G6vCGq(Zpyp zphkA6`)8Oswm?Fefl_J@3Y;WV9t&ND)R_N}23~pED_EJ>xkEG!jRe%&lCYAWVre*R z@CJuxl=|l-^7%Dg;Wl6qK2dtnX#Bu1sIme$h^_FO@W-gUsn!d~qKiK7D1^91>wfsE zSpv_s%vG_vuqpKtvJD-13R%5^<|P*O!4gG+)^Le(N(@~gwTf#N9;bP^qg-oL;3|F)CuF#$I#*J)Ot`3(C(ImogdEmSSSK}<3>_OnJ~5?NY#rpv^??TdDvB{4Vwf%& zd}x&n6K5MWDr^zG3{SO=?lWi+%odm(PSvzlf#G}FtM040e)I)Wr4fC#+|3m#C3n+9 z+4yTOsc44s1@i0?%BQY1W=q+?aQvjGn2PgiFk6H4IPbE4UqyX(Sxfk(Wh)GO~jO?NGbSIN81EhV%8`p%(HisQ0b%&-PE!srN7$5X{{A& z_Ufv3<3R&{VTnTe~Jsj8c?ot5kVjb{Dh z&qf9Kvnkf)JGKOJ(7cwgESXIP$P-TM+rg8(^fajV*MC1=iJ&-dZqR|J@K=e zQT9e~{*()YT1rrVw4`{R9O2S^|Ua{wiU_l{k|m@5{*(Rt@$ z9gNw~Oq%Yhv3gJkOqi?AUIen<&^Pw`5RH$*vHZ|#6^CwB52N40-Bd?9ViIEDL$Boo z?x`Bv-dv3sx;vWwrV;13cUKpEPE4m{Z&t6FEl6WbOyuC+s`PQfG(Se5n`X;%4$U&# zaceLQI1=aVFuP9`nY53+cK@1L;oxjf#i3@gv~mwh%t!AS zxtZyL$H@db;dXjT9{xsW#etC+$-aRh7pIvqb0r^o_cB@@biK7NJba9P4F+pY?byv9 zIvDN*M*4MbkUWnZ6RY%ri3sUJ71~dsL<_U=51{a2lU(pf3l2W{F67c?u7rze84Op21 zq(NJSan(O29WT`CRbW3Dhu}nS@&osRI9g$k<_^$1+UYDJ_uj^Q3Njnx^e5=(l@?lh z6OKZb_R7AN%QhSL^&bm7O3g2wVwwoI;~=>SQ^?6bKu=kYTW`1EU+m93wPXrSr4r}m6G&7##8rML1>^Dz zOI@SGK5!3q=2FmTf%~bV2-lDqu;HB}(b}r;m@K*{vu0QV6?2!cHEV`7ohz`PS<9p< zGj1to$<5L|6@>e`;t73si+>v=`l+4yQ@onJWaUs38qT_6mOuTP6Vw5+*g@oyU*Mml z>Wc!oEC>B5@Vn*{f}V~Ko)fq<^OrZ;ZR&#<5)bc$j@_gT#&J?Kwg^fwHYx`L{_N)X zfru*b2o5;%09tYC*aOZb6Zw7gWK1R0gII2TY>mb#qtI*bR zL>%vOJFZ<;<$|{%z=x3kJT|+N;4LKow;*KKCo#DvG+Ce_A>UWnjZwt&D%w#2a?70f zs_bqp=Ut7&klH+@kEsaF&$ZP=K2YWn*>f&%{x)lJuUw>ZF(zXw3+P51wM zsQwou^VHJQME~YD585NA3m}UFv&1<7n3%@)QK0CNh(sxZnS^BK(*!~x<49*3weMX>2rcRoPRgsb7ACp&08`~Mdy2X%$~D>Rx~c&MO0L8k-$HI;Ri8IFRL867A+e?TKKMXmG@=T1JzLb8fDm`EAIh_ayPIGMz)H_w^3ul)yI>}`&`_?;c zt#YR=z{^)>N}#QE9vt#WLk=*16Ta~mQAIbjLM$pkZ{snr=TVIPQ=}9;X6yqxnS9$Yf;>Un5eXo!7q{Xg^1yDYaK~wv|Oo-fS$&jl5 zwx}+ahgm@^F)epeBZQ_LEOHZ)wNmCUrsOfH_mq(hJ!A&aB@I!0Y1%5P6~vFMO99)5 zBX^@0e=^XWx*z7P+fZfmm@#`PBFI%Ty0N=GO`Ia8v^o`Y8#mFx8%g!QXE-~L~2atrIO$`K2G+Q&7;RdJUAoi$`bJhwp>?1RsLq!3f@r9BGs78YGqsshTDHB_5G zd2ynqYe=MbXp+W1R8y_VxD>Wmpmk5R4NSNJcN1=BUsShZXN3u%- zK0i*zg6N_?>~rw+N@e6z)ipeW$})N`v5T9Ec2q}IOuhGU4FiN_V&y?O1HGd{@^_Z` z0IMvk*z8Af{}$}VT1tTjT~f_OQrGp(%SViX%>A8?%BZUN&?@>qir`1RqAlZSaFMu@ z4P$PYJOS+I_=&nEosV3*$-3*r*)1*vZ}{I}e15m#Dj2dwW<$0txYsaKX`WuGh61Cg zRK-7Ph($k&N8REt2zezQ7ig$FutRg`CXa$$DeR@H8WNFq8pedYg+qd{QqKI`Kap+J zLCs2e>UMVpm-s!C9p^;^Chzrg1~pL_<8n<6F}?7MY>BK3lqEyjxGEYIi*F;LJCbi6 z=M+-koYA*Ge#}|+XYL8%-(&f`EHOhz^vFMTn(Z>YS*)d#DF-2V-z_F(d#ANJ--9P- z6&pkIl)I}U;&9K4e+i+M7nrZbItayh&&gJJHH915ofbM{!&0xwR%cU-+pLQ|)nh!1 zuSsYpeAH)=lmeZxQ#+p|x4Ft}t;nFc6z6VKq4=ww+0XRN`y$N1>0t=q3xPv~cBG8F zWp&8phcE=J0e~Yr#QBnVL!O-i=LbQ=*>_~oLT@08Hg(HSeiZL`C0i(IPzl;3GN#-G zKhTz@6Mcjw7K!Am9_6v;{Y?PrJFkWF#CI>`A_MLuH!23!`UKK@Vy)X;Q^|yWDTC(1 ztsQ(Qj9@IiZxI@OB!Q7Eit`XT;Of*K&45#L+&>1Sdkl8HiYC`Zt+}X=BaUy5k(mC} zDS~8he7y5gLlXgH!u>dEiI_Rda`qrSS!)}C11~@_E+}*E#u&lgUnYA)KJ#vN;>X>B zs|dkx4JehQ`9gv;EscT|ph4!dh%q2}afEkt4gMo22n%uCX%i-xd&z>xQj`4QH-T6SY*}4^jq<8%DaapT@^`r#mSlw zy{x`!1FcE39HzD!0FJ6=rkgW95T=1~QVDwGOth3tHoE#dj`0wiogz!Qe>rU{%E>XqKTWN*0=RkkP*CBilTaExAn zFP88`C@lyf+g9!2!0sF9k?CbMjHLclS%JOIfI&8#;H8cQtLLbLI`{_?&WOSsryV(l zJH2^b<=9epgRUCHMNR-%^C^y~P900rdi#@@aHe{%5=A7#7yhW0eBZVawO}w=2xYqX zi=;v6(nVh$V}hZML(BMs7O>Eu^{}n$bh-rNLPSRqP0cbD<@{-X*UNG8v-%-d{u`2& zP{(ee#WD|~PCZWhO$nDrc;r%$T56SAIy$-GDc;B9$XPhPeG8h*SFv&N;y(Tz>4d_0 zG=tVDEFH4PU2I-gzQc-XITFS9t=f&V)Gc$<+yQ3!A^ZHL{AjQ%&MPz}-%4K&~(^Nw?QDy|QLvy3c$IGD?2jFKs$w#XA})C&!TEDAc~MJFl| zjaH>frk-NBL+>sY4R`-%kYrq1;abdrGMX;jN4tsxd22^|w&8?BjXj_7FRFC~cGJ&? zE*pzD-}?aF^y*;u-R;?p)N|*_%{>kE|I@e?rc!+J9$`s0I73J1W3s-xi8}L6w%=UU zO>32wXdJ2D+d`Tp-($Kk_L``_e~j@1ZXFSV-Er3mS`U)x6nqjzVdZxXt(9*F>Fh}G zCH4XO<{j6iT$!0JCiXzNi7*e&QD8I<}9u{C&Df?9pGc_0D0Q7kW{nUhtL z^%$ECoGEV45jK0hc^gD%^9;TLYL3%CeOqmo@r`hUQE#qcoDi&)J=PQ75UUK@DgH1y zn}*4F$cll<^a2Vx##!2&OFY&ho}zfKAaC^qPA_$dq>LgkJpugbaw3V0wyXN{NF9rm zY1aXTJb8t|}*qPO#d7+K-?2oZR!`YzKX-pnjCrxJhncS3Z z`2CF@Rb@yG4V|6%Rm(DXdx=zSG=RHr^g30}sb>^4e%eho+NwL5v+^kAi@_-Cd!DIo z6k)Mv81p)Ql0FLd))I3pHa;FNoT`3^Na$Vfx+#{QVi8=hJp(a*0;!E#KYZl`(@vzM zn#a+=;+9ShOy`HL?6wUJkT>ju&h)CVEc%gOgwEHp{aS^lZP5YLRRW7NEe|c2UUAwT z5f;PTwWt@wL&G)c2TGWfL5TqYj`wdXZ<{~tYqAf&9Fe?*zYBeU$$ryi4sv_o4lea- z8O8#bV5lx(E(g$D>5OWKB-HXa`6s+ZNJ$;@nnA8f`md<>&_jMNK-8sGeBX~$I>VsZ zWzoenQ2gXhv6?^5=Ff^!;V4PRt#IG@-qwN!1jW=C9QXd>zW5(`Nm)~GNU3g+SsND@ zOGi`5cOVa=oq@Up>_dF_gjB5%-Qdz7|CV`s4iiP@9=M{le0a0li=l|-ugij_Yfgh| z-8jy$YwkAo z=q_GMc}UmsiSXh4;{lOCiFg_^G#MI(TJFKMde2tg3t_e2j4w8nW5f?1Yth(G`1X4< zOz!=C0{)O|w1+;xsFvSDu2(wNtG4u4OXZS9KqFzkHS?1xj_8x|zpVNHyq8wY_6ZBV z&8cWO{~2lZf4`Uh_r7iIgeQsaf5}vU)VmAJ? z!4d^**@Po)dpR@VL#0fF0G#DSmPHW{1T9H~1Tw@iMxro~4zv%W$rV*V_5Jg|OQVUp zetf90SY>^xh$6i2@G04S-Z}TbKF`to{JRw`=EnLVUF-wels!}7W*ETd#vugL-H6fs zO}1jdxVE?@z&O$3>pKv}xHi8Pz__-&1;#*R?i-{N7&{OJeq-_zD+b)P0>H~6XI!rj zw|vNia`P1LZj>;!CeEoy74KI2D0*Z!vJ4tjsV}p$KBdRoh>6@k6 zzU)G-4{*`7^)DSVyGm!;q3?fTl9D7ei0LgdBsek_T)9cZpKsUjzl*ZaR7_yXyG83i zjS0XHM!o+cKEOXdjWSyn)iV0;{SqLm3(GdF9Cm#GH?+)y@z<%GBLJ2-2e zf4;?^cf7ie`@~EYiR36zwvYjJQx`H8EB1FE-(gMYIX17)OrP9I@UX-*ZvzQytlbs(}kpiNjGV~}-w?ac_V{#lXK)Zm`R515svszo2 zT)__Qr=du8e-CpB1y84n?^ZY`L+iZ{ueaqmWf2S3m8DcRKGB8dMk0G{>~20#vxwQj zlZ$|TCg))wSLV;_%MDw1x#5`wRsR(}UTm&sy}Y zZawp<)P2w4cgS*D8Z(Dk4;kBSJAEWi4_oE!vpZ}CV(++^zV&4(p0@`pi?iukI3>|v zaC-BweUN`kmFRBDQ;u4|G1r=EkebIP$k`_zLc(7>h5A1BPd1g!x1Mpw*38}0bmz@S zKj7cYuq=ocUN1ba+2{St_3!H@tawP2U|a;S;S^fODl}jfVqXb&1>%1)(|&{)%%7G% zu*N#%JEZv6%rl;*;ana=w>EgD_!lb+;)^YGUUIHDWGT}2F3+E?KH$ds%l0mwvg0hB zKGS^){ZzBch7A$PtZ8gtWipf-6WWk^#!ysg6@`Yh`zTk9v?gUn)#tHn<(Y-h<<9M; zf(0sP!kV56T7SzH0CEB|ZR(0qFNX!bicG$9xq^v%dyNv&LAH&gm zS;jD_JbN@`iXmRJ)7np8uAR;BPVGUZ8Y78?aXk{3t*L#bAPfCrTDe@7J7!dmOp%sD zBeVA=V2(ylmlmUGtrIp;v2byjNw%Ky_juQdM}Cp~v7Y(4@$=~)kaP*fQA`Ixo$L?Z zs(CX_{R*pETQjRvjC#@Y@NGDbqba_SuVv}ukb*$ddW!|!;w_!#K9yF3zs(H_(VH*} zu_O$dY&;iNCYugGI%rQl#(;D{cwf(`9`jZaRDVf07I7j+8Zcf4TVIJ=3-%BQ^`@pc zO^JAa|GiU!ZvfR`HSv})@Lsv}*mtn;%9#m5<5GEMWP5gE!c@#-1<0Q&gjYIbhO6Rt zjER4c7PHkPJD66@rWw;KF(sT{OMr2b%QlCw_JOX`VM-~%qAdK!8l)}1E>3>#2 zGb&A!ENlEx+P&Bql?kejOB1zSu4Uwhx@_BvMEz! zZRHFPHi(N+b|vO{2(p|D)ykkW2%VYDZZgwd_XA_npK#WQ{Tf36yk1~? zppeMqOajjCF{B9x6y>MwsZJdSwzaQA!pb);Nc|S6;=owf6P{cZ{=wqGDSWVb9|0Oy zq&hNcKd6Ohm8PKzeKROKd}TaQgK`H(Yz0QkMwqhs+f!|*vI%KQqN2PI8(f7i5g9(| zIRta)JU5S8T%>NDLS>EO>6qZjDO-SKw^YJaH=oqf)XEisyaNM9s|rCbQdj--Zdyd6 zn4l4MRBz00KL{gJ)r!1$9MvbBq7dnQCo6Es-lN*#)d}ZwiEe{qi(Fqj$kM7;@|f~z z(6Fur>vE2vL@BG}bJWES@+V8ri?Zm%Udr}g#4A!P=ik$*qSK-=R4*Q(rQiYdDY$ni zo`>eT2JEtPIKNYdTi^s4_I;2VM>jG`>RVzF5PEbpf>vBy6fwp7GT9h7&)SA)Hpy@+ z{E`eB^C4u*gd=S>Ys7{<@f%KtV(_$SRt0xmu^kG1L3#h|5G+CIQ*-LJi_q68BnOH=j$%kGqL!S9vAz|SyL5^ z>XxLrkP7n@f>P%14{UL*%n>x@kUt6cLE==keI4`A=Yr?TF!xHIzSwpA?$iFj6VFcaJ9!DdF^_cVVAVi>pJadHQqzZ zUy{oDmzf#2eZaK%+JSzUlj4#mii;IQt^3Bh^wD2upI9HRzpA)tkXCfCB_=xAqi{!vinQ z+emiCxvTuv=qLPNic3My@}3?hkta92o|sJoR=pw{|MzXhrqR2$@p}WE_&!*3{l9N3 z%I@YaUUH5<u&*3eb`&R~9GOhVz2>)}|T$jCuKkATTp zNm^QL`~J<|ocQ_q@s|+jDj!c6BKHSr^dl5R0;)+NE~qCS@hzDMY^I1EbUpnLCe2;` zZ-C%CIfpN`MGwkBxu+k+(CR;n>D14{16}mpa?hE$##DV>!%2HVMfz$xM>_%YUlSV& z)W$tqwCRzcyIZT(V*X!|v)MK){^`s74(JuS{>3J|1`N4or+Q3ugSuvID3e!bklq6< z7eg+~hm)UI3_lW4y&%ko8C-biY_<4K(tflxR$u>OTg+{S?MPq67wv*fih3S!f^LK8 z%PXdj=A|vU>c~32ZWeW-GwPqyucKF_1PS4qOQsg(N|lD~sW719*(x5?3L{pVqb(}N z4l_+JNwxMa$~E6!rwopgFCku}VvTWlOSMe)+Hr!vyQ;rBHNSGU9B;5we1_XBs1`+e zR2QjLq;To6j&eex9X>i{82nfpdgZ&Ob#|QoZSLSj-MzQ2kU~69@GBy=Q@>itL!=%$ zYG`@UA^Xna1*}2Wo!>y=x7B3;EKs0ZUS z!bo*hWU&jf3#)}o#n&re41(jh(Rp!Te$6?-ixVH<)a+G+ZA#hftt~4Jz`}%S?jT|ncaG`=Ve!d=;{g^x3B_B@xy*`fHmJjLuWb*=se$;adEl1oc6 zPQjwsB$8O}P4RDONhnCQ^Z%NNE?_^VNQTtLfAiVTBL>J^sG zp-UQx`v8suhA+}&*m4-SscW)P*QKoHa|9R7-tzsj~4Xq<>#KT&f? z5`Dnajkw}L8l@~`!^te61#+(u&>qJi0?sg0SVhXl_l_Y$x<^HFQ38f1EM->>YLHie zOG%VJ%tWkNPBbnfqzT<2%Y_V3fTsf851avRhJLr#GdV>0WG!1b`P%dObHktLC1sQJ z-80q9TNGN%A+A%p1O|`3SoHj@$qzWcQx(*Jj$Z#OkXh?4l5G+uFT$R z3MzX9KM>o(N@1w>d!3vlPl##C&=HwEIn?U3ywR(qilRa z4ctbnjPL>XmY@uCH`26yR}y`{*8`##j>3WWNRH%}jKzQu@aNaCnubxAamp&%XV(k+iuH&l_epCUJFkPf)Wx*W=nEt{;v zbf4fqEVs;I`e;%MP6nPw<{=D*>}*19`3&4T!T*Y}tXmjryZ(u#TBBKyfd!E18M~{5y~N zAEdbd^dkH}o3Gn<9P@J|m96C);|L52fht8KCM={%6ewiBZiG!7a|AA`!!u^8s}=pt zqb-re!PzL0?FeDWhuuzUk;ctqXJ9+aV32+;@mYK_{A%g-_V!j#xc0keBN$gH^R94x z*vaO+_W#j)J?+Z4?FrGB{ZbhP*|ipTPqXt!oPEY8f3IJsfZ^tF)6G-;s_Y_W<2#jm+WZBp6u`MKL2Qb;r^VsINxE;ptD#jDe~ zH6g}n(1aaRQJ7RjJp3zsxW}guKulO?m^W#EeNIh2!@(}D;_$Q|%!c2`{^DB|fziJ#;B+ zQs7YfVp3$E9RqW9DG2GJq^pDlLzV#QiaaTLX7sUz#R4`fOG9|_>gXt|L@HN`KX`M! z+r*MILHd@43N!e3vxkZWpLNVoqjMr(p5;T4F;04o8jbxQ3%+cUy5*o(JE2xg&;&h_ z{tA>3%2Z}4bnxz@soJ@yl%58I2eZSIn1_%cn_UW+R9;>-PSM0o*lH@Jonm;kgu}5IImu}`28&~su+Tp_kyw`U#L->l(FuPc(D3UG64SnmXEZKC`^#(P`{!->`MApP&}8gI%!T^`1Sol= zMW)a;W@gArgT^r|im6^!SVPY6gM3>8@sLnTR+rm7NlJZ+w^YbxHHkL?SspebVDi>yoV{A!H_Vwoy*Ie(qv z`(vHKr@PRWU{}OqlThrVSG3BqN{W6YEe~K8*HfE6mZg>8r9uX5V!|+c!&gsEO7b$M z7++H@YKT0TX0CMU4U#by-BHG8Ob`ka7>=p*v*Ja1;OE(zxN>F6f+ybE(J^IBEX<1q z;YO!g{Vg&MQ$ZU(VnKuEXUFDp`O_pkEyuRv?Q$$U*hG4fKCX>NEAy}PCQ<8H1KWp~ z-f66En=%&zwW_!1zOgpV^*D(81yYi%erov{p|aDm3NapE1nTnm*eoVc?N3)xn*_IBc980xdl4Zr91Ou{MCWkF(jIo zw89CIKlF55yz!4=>k&^y4U%@KADg!|g!i5>;}hz#bb%GFK`?`m(l%70Rf)HiB0B<- z{-hiX!oukR$M=Uj!Jlr}2X)z$ZtO9cevDK|1cBHE z2qrHzkgGzhdev^YHgDjJUao~hgjHTrexdK}`Nc*i|6`PiBDh|^qVi1_=XhQVj(>kn zqxn!cytX=PQie&xVH?C;hIv3u`zVM!xzSe}q1y}k?JR0;y`IvkmW^LwjUZ$5y>k3c z`R56rj>N~L{=F8*AEYIcKXjtHjlZE#Cz)tN-iEz1>6>CrT2!f)B@kd>QZ~kZ5nYS}nLV6YAH z3HHLyo)^Ri-rdv9(w+fG>65ng^o+w#O!bfJcH3kzn!4h$TFw#eA4??f;C^E)hsZKn z(H=PEWtjB9AlGd}ovQytIag@Dqnw3tVolyyq^BMgc!^NewziB0K^1%u|0FpB-PZ$` zY3das!D{cG$|EAZAIAL01PIb>c1WiUJWy#zHJ~>)$EPc6Ox5dq0K8^&!NfDr9=-%N zwOgwsc??psX(Am5LN@gYZ+8DCO6$T@Bd`{nuBtCrLOIDh3ppt5wx5kvdO+)ldYQZ1 zhULcJ{2e>Cp=F~TU8$kY-)sC%a<>0F$(a!^jFYMbF6@%W6a3Hx+Po}bpHdd*B+mf7 zy0qY=>}?SJ1yD{w$h=Z#fVX)NpMb95{)C23590t zyjLPsuQLCYIS6mhq9n&$MWQw}_$0liK}lDx1@lM<{$0S=vQhRBNTK{gb}6j#RBgpz z_zm`r&w*CJ`yteFwRKVkQDn_Y*syQp!1VTCLC&^XvVlu-Qx9TX;}R&6IrS8-?OC%eK(PmC@+6U>r=V(UFm9 z4?b$XqTc)(2OGAtleXoP`4oFxEoQQIpK~Usyq*twXZ3;VV83AYIkpS{yf^De9tR2t zKb8wob77U+c*WqKo!Zg{{qU|%ZoCi>onC^181D)V527L4pOl~w50Mdm+#eMZ^M#Fa z&mE=Rq9dsJfEXSLHP`M-BdGoTuDl7fQQXhOD|@2nn+~+u9r?kfbcyYo2D;o6u8OCZ zJ?r8bH~7q*b^LqQl?(M9@I3l#sB}{hL`XFT!!{CT0%IKH&cZMOr2na(OICfUoLW~_m4KN_DM`t)90SwJ zn(*NgyHxN;1od)GK0+ggdo}Yza^J{&%-Jcmy@=vDTOIPUhH6IPx{v&#i<)GsoVQ!I zEI+pTJ!jz{_TXMRk$Pa0g&gdK)vn%So+ddvrG*vsv>U`yi0S%0NJ11hAL-fctF}&D z#?v(0CoLoX6uGGtbwJ6z4 zmO492$Wv+PJvffa~6Djx|(e}#t%>~N@i@=T;2OeHtfU^5z zl|UtS6Y7YT@5VeT-Iu(-b7opeBfr7NL#>;oqiQclwFO)_aqzOJL&XDs3?g7OtfNw~ zu9>Ds$i-QhG=txMoqAc$%JFf#*U=4n!h?}MAwauc?0M(zp=a}Dxl#!9UD*hQ6qwE05E4ubWtG?)V& z<)xC2JcH;`s?AOGjGDt^^f9N0=lf3{)djK?>2q)1B6Lb^H)PlDPsixfU`#HOw8jg0 z1Lh39De{qld!Y8l939S=<|p%oxReRX%5!O~oCGpfp|A>nImHYbUGTtBvm3qV92t4} z6xF)YPBzDxwHO;~T2sokt&owejewaI_iRQ-TwOkJ%R#NavLM1RX9Q4Vy;wr$7b7hF zHGBy|gm7m9L4-pPf0Pkfy}#7qY25EIgI*7b!Swh;pZJ@DZ3IbMk10$Jea7H|CwJ-y zsxbcjN47Bj<45A)y$5&h;JwFp@Zi1scdan~qes{1?}3woG%u)WKQ(SJ8NMp^9Q8i4 zhaVf-3@}zF52)~lq_7~F@J0l06dN$qr`g-<#M89$nx|Bts%~#jngDk6;yZ?%Ng$f) zC6WFHb59gkzEjmNQyJkxxQHy+KcG&JSoW`>^k#&xKCZI7(ZIUWxd-_A|>?VxPOZS?Wu5&e1Qz!0sb7wY}UHO*ZjNkj?~nOrCl+aR>B9`9^b@*LIoa_^aLu_MDcgYS2cZES@l1ZMM)aoTWRTR zhClb7hwr%u&Qu$*I?T##QLo}sf86u>)dOd*LBIW(`{EIJ0BTbHu;~IEu)DDb0BIeB9VtJne@BYW2W>LWxfACb$Rs69K~} zrZXIsk($~Fg$8;pCbe}0vZ*u(I1Yq&qkBe;uw_mht#&h0Wt5mj?TDKgkvd;F7ILj? zZ_&Q(-wmD|>SpjKMDynZI8Ghn>L0N?*yr*h>P4&4pRPcZYn-oWg#~@684h!Th25+e z1}GXi?&)qt5>Y2CdI>lCO7iVRL7(XGGXo3sb?0n$= z-H59BYC*uEgXYp8b|pk*n)QX5>@6Mzj+VVdz+o{!2&fX2byV`50YA@a9BDER^*zFB zX*Y~2pm*ivzlS02BiS47JM7lAxs9W~W_J!IRf=WcG+5C|2x{hOj5`Xmba*)fKg+ue zH#6jwi)~q#xA_w~OX_tTN1i|TD9a}x9Mn#jxMSEhv~_WfrU&84zv9U!n{N1ZI|!*r z*v*(!Bi@Qr-&z35CL^xL4qymPG-UX$kS)!IXdAUoMD^lP-~qo9kykBm6$lTwsplUe zQe)NC1h_^w>Rz5>bF>S=ru>wPBMPj3*7G^^~EbGU^UmB9R zPLLJHBCf{|Xb2BzRSu*9T#TeWoY5YH2bC%ZlKKbAXOLE|V$b)nEDcc_jdbn3geK!z7v4Phg(tA^lXgLXQ;>vzrR)cqz-4M~{`y`5G!O7~Uvt^l zfAdKEGasa+QZM6tS4TX2Q_KHDD&hYzAN*S@YW@Z7`%NtmpPgo5Oy?sK(n28;6T_nr zS_7dW#u5>sfF?F;Kmy)3ze5R=vlyTg+L9e!VQA5)R=2(Uj?Afmo5he=>33*t+GuuK z>0X*}cCKDsazAgUccph_rbEN@X1VUV^txW%U486&UG)O8!2_176a#BF@?mo{_iR1J z!cH#x_Re3m-XQdQgpS2ocFFGPS#~Mz@mY4s@A+96sc-!51c~lNSp*vfCvRY|4L(La zUZCHT;S73UY7_bwX7^6a>Kyg~gHA!L6B2qyL~ zDv(d;)a?utnz_GB7Pm!=@8c>&%l80mz z*0ukZJzMvsNm<{=_8>?HH=EI16A9Jt>uX_NSS^LbE@S95L|l1mQj$X4_iH_G=%{{# z`vr@uvUstvC8F7W^>nqu^H5FizPUNS%DHOi!8*3PqP)6d&)0bGa=8+R;cKi@S=n5( zzN~WMP;338eN(^rrKNh}{5h-=8;uty^Vu4*38t4*sot5Z3U|FqcWa!elw+=v_1D71 z<2ijoKLP(*&Ew0>Ow)0I`oT5eM?1f}h+YngVl{Eq14DbwvVtSPhY!3NiNgx;=BcX3r1}Wmi(B#WKyK|D z4WY(?xd&(PE)@{M+-rSD+5!VwTj6|I(HLA01_g3g059pLI?9fGW4ns2@G60x<82N1 zl+D0X>B0s>=ZLjB?YPm4VO^pfh~X3R)pki(i=2uMYdsX) z+u}^@E^oMj?oWk4tP6a>MFq!Ng0g!bC;Q6P#~p%cR;K-(DuGrhI1ioU30jARa+ARc z_DbF0K!I9ElGo~~tQ-S{6h~WyaW{zUa+g0))*qEEi)aH;vb zvuJi#zGJM1acRou)r5?&48a^;1gN?F)~wEw2xo0x^gr5g^j{c*u~s5=yEB2=c+np6 z*szy;dw|gS3XC|}5_Hc8<$t0$Y~=*fZy>F@dj|DU$A7MLGu15L@omH(--d-_SGllR zzzLnjxeQ6AScX_TEQAMjKpI|%bDK&r<{n?yVs!(YVfl`E;E(;$Dr}+!u%Hm`FuVmiN7FgW^0&rWwJ^5M*#M$7O4P&I0HBAMz4vLbn?KPB+XrYPc+ZXuQ#< zL6j%`mAIo_m>Vsy55p^FuDyF1>IZ428aK-2z>5e$Z-JVe?wZPzlhCs23e59uZQZR+ z7%-os_35VBuCFwpOj@z`rb2@DmNMAf?ozuh9+ZnDx59peBw!*7-b8+SQ#%E(>ZR(Q zQu82oEvp0dsIX&ptzZJuEO&w_po!@#q~Vh&UNj@1bPb!L=8A?as(&v*pH$}p;#69u zRBJ=2QPJY|ZV6#!&?>2extm0933`_attRQ!F;4ltN@Yj?8ja?`{3?sq66c%p zO&qAzScAArQ*p7RZf{K9(w0G(W=H$tVF@4C1B5Nt#nMy`AJ@rODHuP}Y);`Q;aNVw zmwCcC6wUBgHc+g@khh2%)6;BD=%{nSjH>_6(?VPi~K;dFCy9!r{KT0X6ukRNS_~M{GX_&Sb`r%_PiHMQ|7=oKdWH861O=7o6*gR@L9|afgZ+c$98-6)RSIj1r zG5W{!aZKYY8kwNgsBG@D98Wz3Tm5RUZf z*0C`f{R((!f3IF6Em13{vG3J%TNg++TQdFCP99A`I#%jQ)!n%TYc$dAnm2vGTMUO) zViA|m^Jads!#_OkW5@eL&-BabI}w@#Bex8C@KtcF}8?+kuO zj1jj(YtMyiGIUJ{*K(aO`hhjXnKHw^&2P+uUV!6z&VwWy!@S@aT!QWu1K$|SsNsMK z3cwq2=h84^iDZi6NQqeo=n)M2<1}@W`PS3P+SYf}`f$(tX zc|4-AfN3+xGd%glU${$Jf-X)Z68x5d`W7_kMHt&z0qs}^={gm~5n~8(JmS7U$ws(K zQl?8B$uR}_L^6LW=mnbkmP7cxF2>UU4MPh_keqynA%ZXgc@{7r0(;P{a)2M?SsLRh zjE13&be)89jWPt7h`^NSHx_=cO7?6e@|Tm)!vik`zxAiSB~a*+=m1Iqyp90On}D!s zJ7Rjw;6D0ePDkz-3K{W51#^(Mwa(2S%uP=zSql~izMS7JViMlr7VhVGv)h2=E?pL$ zmyfa%P(xwd+Lg89W-vn0Pm`&tE?C4FhnI2o=qzr*YIYO{++IME`&7#wav&i2CL3+` zuDK4ixt$l+#~VEkeD7|vvbhjFTx*ux1gRT5_E9UioB3=m z0;%lcV)|%QUBVQ+f!!CPORmy!6wPS-fB!{FLzF!Hn;aZI0xg3wD^z14a>}e4-W$?< z6}zf4wJ1ii+|7x4 zgLiT#Z?B1m$^idBIPT!Uq^RA1&F9TpYg2z<(;wNxb)3}6*`>!Z!$dB8*7-;gpHNgi z^0~x$33>h=gA9UVp^3}-XI2w@ZQ0SVgh(12Y69&|)ddPzjVumQDx%kvLx$!sNJjYm z#N2L3ui;*0{q*|CT-7B*wrzru@&Kis8)ZsF#xUfWKeH5mPzsY2MTK>|R%E0OS}6u} zg>@T&6i$sPmu#a~+iTbC%`kEqPT-@oYDP-`$?KukBc#`3IN5S#QYB+ul|S67Y@s(e z7G#=UX@vb%V`z!+bSP>YTo4&9t)4rJgK|cjDVJ>ns=6n%<93)?0jY2(F6t1EF!b$$ zSplp30kfwT5@Y`x+j~o*OEg^CFNz5Hn=-L#%S1i;aZ?ukROVMIgvDRvAZbIWO2LHY zXdF6p)^_p(D8_I&^vKL=%~~W;CS`at70o90Qd$cpRfTJNL-LjohIsMf(ZdFEQ#QlS z=^KKiJD=DEAIT7-OLEZ^@3If2HT4&H@yanR<0%uuc z9rE%yaDWJWV=#i)YwEC>MpEN@WP322M1^xZ$$=acQa+05LG$!chDkmJS?bu-z8V8v;` zTSWd~v`k?Yc3?V*#y;|OL0nY#pbOqW>O%zd=MBWF&KD~jZ?OUnMRnnSWBuExSSFO)x7+*^(w$1c|{8*Pqm zG+Uh9_ic^@m%-l2oInm!Rrs>_Ot?JG(bqxZb@-_woGt6{DQl?eb+Ei{oHP^so|3`% zbD#w8f_*>#EFH?%4uQXYljGy?tYYdfv_{ ziz7+}mb$;wXnFmby~}-)lVoVX_l4a@#xZa@lBjjnvJbxnyO@YT8Vpc317+Rq)k4lN z&mWIG>hVnJfHcuYpUlu&31<9|#QQ5IZZQ1ac%#PAoHbD`sFR^svuo%##+1>VT^;he zeMrw*uglTuPMfgnuXH@K6J?(%9ez%rs4LE!t*dBmi6zn)X71?cznqM0qIk9a}rIC zZ-wRGczn6xuvv`PVfw3LIfH}L)}n7b{<^6Y8zhCxVa@fWl6#5i8S5R?)gOy=q&J(X zZT{86VzIcOoudKZ?C9UEt9+$;Hxmf8FBkDW;TT@ZjF|+)m%m?76`jVj5~5pdaWg^P z$n_kF6u{T^73Mu;I@I^1GigTff5W1e7Es=Zp9SycX@(zwm?F9{inZM{_*7OdrIk5s?D0wd>}keQ9va z3~zwi=U-N|@Qw!!T05&q!{qSS2l-L6?7o4*VU?0WNvV&<*1!7P;SCRH;SEid2JLTo zViDQojO9c@4sj$xAE0)b^c+7`D(0{;W(--=Ni%dv<(2Y`ZC@|(8{T&cw0|MDUo{(S z;^qg1m|!_JV3yago!$V}1lALqKIpR|yl^Vpl6!IRc&=Q-ut7S(}zXKc)W~qBsEoJ2%0s zDPTH81cW>g)J)X6VShWWu94knFB3e!tkfbQ3iHc0fIc1d`UFuv3DlgsU$hb@F*zt1$w8DrKPNr> z92}P4D5+qUk59R&8tGi}Yg!SlWdFTH!~N%hhFkntEAd=VXcO6G-*g5=kXes~)iH?{~n$Rauv zG6TKL0ueojF82M9*cfumur)nZrG!q6PVwYh7W~Hp7Gu}yqvKouS}jL zXN|v$?6}F9#8=C)vcXT^ApA?qqSl0hc29>2gk|<|!tyr-1K9(4o95ZSl>h$6L&$#( zI%KuBcYxVufcD>~ul_fK?tiAQQs14h)KEryt-7nGOX_i`mSWdz#RCZw$7GQ(3x=Yr zyN=dsl!jR$g6rZ}pGFpHG^)4I$*+;gV^PU#`SZIV2kE89>0?3}KSt<224+8)aAw*& zHEWBKZIUfV0KFjHCr&f%&sk2j-=90X-w=DuJ2CnAhZfW$dE>tf;`LJ6TBoKZp*_j( zkG&c{9Ah(8Y$LXk+87R&(in-W9PTx2sWD8}wkn6}W*T)9;`@BAZ0xU{7>}T#?%7(p{0bud*yBnO>=K7^JsZUXcmZ_Yr*Y z)qMQ9$dqgtFGC{Sg#S0rzCHb&#`D&=;fzvrf{krOd|8}vm6D~Q29=7K@((fg(|8Ko zM2o8AY@FT&=Ay-w|Lby>jS8ge@B()5d+`>is>~JgR?OcaHC>$ppRr9#0~bvlq;SFFz=j&uAS=S>b=1S7 zvQ+d-Fc%q`)2EQ2#&Oiu3dwv-VuRenxVp@&_M&PHO@C85N%o^54+WN##m&PaZ@qpx zrfh5IRf}q4O)NvfNhll&t}XxUdc@;|b~yR_rw!S^xIT@W1hgZV-ED1~D_3CkQj}LQ z?zX9%bzBBlJ}T4O?S)=@9a`s0oC)#wro)uxYRbHutdamYSC4W8*+dc zqyhaE$z6#bZAbZns+(+IC7?c4`K;5g;jP`@dW!?LJ6s7#Yp5-dGTIXw6|j2K5paD7 z4(S`lX7~~x09d?1`bOj`5Lom4M&TZsT~}Rrfa)6W)*HE@0<+s+g>+PxryrMrZEY8u zwp)wXZJ4{h@d8VA5a~zHQL_Juml*fT_mo~?ddH6Qs4&QbPNZFV?9s<#Yp$OF{uYfR z7j4e#_I`J-b_%JmAgSRLJ)xUK9BdvcV05S**FXi>+)$~dF@`R=-lbM)-b;`d*@fG* zX1N@e-HDb9a=EFML;4}^xcTrGW7ega3wg!5E z4(TN$(V*yT0UcfpR3~dsIDDRI-W@f30vx%hnsk+VAzF za(Yu{)2ELDQNMg#JSe*)P>?~Ok*T{7B@UqF1s-k)xJueOOZA|{uK$t0X$| zLyAidqJ_y)GVXVvg{|rcKJ$M>hlWY`{Z<@=d{u9WUA}B65&qpezG|2@62q#=0i&C#-&21PK8~kZrNrHw}^#!85S~rMqBU> z&BJo&!)6-=uiEfQ(2F3KN{$rm{nR;y>q4wd=XwnV9`#_K`XLE1>&t z7Y=?qM6_}WhkLT^F1_7q?rv>4FKBr6+c0tZAer#s=i%3Xy&1X3pq|Q0V0)&Rec`W-*Y_>R1AmWB2ZL=|MYxJBO`05j#AJ3QV zmGE~&yeAHWg|{P0exAkL__`wvVHGy2RZRYo@pdQE9&);}u5*GxYw1RJ%0EOzdEuh9 zTXMVH8Jf@j&46eBeoSSa` zVu7xqB2q!&JoRcCoB@a!X;XVzaZits9)7%hoyrXrlgC(IegI`*hs+4tfE=|!_31B% z*^}GTdMeZSzhM@jUI@ZDrrh?OsEHkbpEbPagAd)~h;Qj7kn|edhYqMv^%~WUZ)LDO ziQgAvi9SvdW0lpZ8{@cDP3jQ=c(0q6L-r{4oS}Nkx$N8txs%EJ$Y8AY*Um;bP+Hmb z8OagvC*$F%s`ujxTN6~(>(_)r$NlzX1aQe7DaXwHK)e`SLoh& z(4yU=AyRuk`T40dQ=AYdOfWolh^eV$B$xCMu(Eywb{DNQwr%nrAa}8l#(-<7}(` zZ<6Za^ml=+@x!rx$=^)U(crF#j)f{nZK>!>CeUuGg~`kYQkvR4HSW!FDD54hNrmTfQ5UUb^Xzm3CBSt zD|yl;mrZrt65);=d(FI)aylQ4Ijay2I?YK(A^d%;6t}M}!t@7K>pO8yOVUwJnz|G# zSWFb!%EG2^Q_0AbRcO^&tA)(Rn$n1OnSKG3#(AxViuaPyu?63Fr}8?Ozp0+Y+>{_% z6C`6ML}tuhjMl6tojE#Ih=@oiOzfQG)8=* zsvRxY%5A?Bog}Hyz2k~^0(?UXu|mu9Lna;6F|D%}=)+i0OIe`zbYP6qmTr(^exl|4 z%x!i-ovrIfqVS)$@gnk^te8N8NtM?Z&nBQ~`BohyYb)F5rZs4w^}CPj zT&h^4SNKgFZ^(-{^t9$TIp?V-IS=m_;sF@vlv)^fX*?`+qV!$W*kK+yJPiAWJ0{V~ z5BZJImoW7yX|O2^;xI^Tak%i9vAsPi;Z1)LVi5_TP=tN4%svq14-4RW))*zr6wJUX zbR9D1fST>I{Ke1tFLggNKWeb=oX-9|?waS#r4QRW;19mxbmQ)(uS-%4|AVZ&p-m|P8hb6M zrJ7h(>y2W)YL>X6BC2hJxt>KRmj&w5de4@7+wGL3V{^V4)$VXQqFr+OW~04~()-WW z9I0muhuQV1Hs?^gXp7s1=QZow;&=0-Xi0>@!>!DNO<^b3f)v4n_bko%AeVqXlK|dG zm~R`7cR5K_{m-@j&hN_=l!L zVMHtFUVk(Yd0Tmar`?~?OpUJS;Z2RMz+oC{Ta#N^)N93CTe*wrRoq#)YlB-|)Ykg8 z?BRFyuH0d8^bc56w}uz}A9w>glvl@YVj$*y3|BsBUU&vbroe6B9;kSKM!ht)(E3L0 z`JQq0qhg(|k*Imc50to{EWVDIw%(~DXTfgpaSe}V!Efk$`nu^VUJzUL_9bHNuPcGH zLjm*&&Pcnmmy!rOiW|Gh=om~3FwG_AXlLSlGe*&nk@v!r=4V%O`2xtLmYUOco{yso zJoGE8(w5p%pX=WN6*_^JftNTo+w(R1=Ce;v-H;VT-GMwHmz~3fr&Q`IY+UHkP0vVQ z$88w1whHoifB$k8$(;l4FCgtQCooe4s;7k@yW*F^1R6UJO6C)#aOoF7-uywMmz;|Y zJq^X>Mqf2xJsZIfjbAZz${*C(9d7gMh20rb(O0K$=3Z*D;&TAg0MSR(lQ~)T+;l3e z2!_W>czS+m2B%YNT*}9o*v9ym;F+>Kf>gRjHnNhnYMW-+-pe)z6P6sN(5-Zq^y%WF z=fW7~8SA37$)h#53E~he|EBGK!yKsOF=`TNN_58e2Wo*=onF{^!wl}6*si>tg zV7a>Vg^NjOX_+{PN2l%d!(j(lCPt<7s(9$A^{SL&xgJ@= zxM(=@*Rw>w@DOg)Xq)myz;t7d=yX+fP6hBnRZnBUya;%cVvxnBtC8|7$yfqYU}Oj< z)mr;$yN&>x9U6?<1umD|2tJxu;QY+#w{kXy_STdL)r0W@L&Zx`j(AZUQeyV+=9{-i zg^Kx!uPR)u>lHH44Z{R=}XlWv^ByENYX(SvmgFq{6F69}>Quz>u%50f<;Vx=>R z{l0_3qsbd@u;|&CT75nGw{Lm_R&!sahWOMK@uYUiIf&jk;Q_iZiHhmhEd`?vdeLN# zSVq;mH>YYZJTgo1rtGa6$AyN%uQL@61zm69IJQh-BCH&c(8)Lr;&G7%j+8hp0tVtl zC&66FKMj;UGM}{bYIDkv2HlTfKq?QTqte+PY62ZgCz)t!_*$A$^WU~ai4(;}U0|SZ zBDF*_nGQD`eK`~L1uzZ5JTRt*5HKf(p#d_H^_qi)?$U!CYZdzr-eN*C9^dsm;mOnWL?rZ1k;6j;CKMX++F?%AfEnavp zUV(he4#WUrEtlNf2e(pa5b1?NEJ*nan(t(Xj=9O8GD6SNJz@6~@}Dc857j|d+^_7A z-9tD`LhL}k28PY{)tQ38VWpSE5Wsy8=GVjycSLXbOJ|6mK3(W>ScIRYd&UWje%xBV zGJ@g&?2W*GWQUQfYP^r7RI|?36FCshS3az~9tf7!WIcS1tL$!SZ zmCG-}udiC{c{=tdT#r4LPBb(tI_bHX>)E zye!;U`%1`D1IHB^!Q0DtQJSPL;9hT=oTnr5+sWhU`^MZzP;eO-8!i&J4Fv>m-cw_u z=}i~Ll!zT1s8>ApWB3io?*b%X_u52OX6l7znWTeKHUmE!j~tV>1ldv zSVaBzXc@YgyE_8PkiLA|(Beps8;DK0#4xbx9+u8YGlAYlHwncGRfSk4RNFjkLLxj& z)H*E}>EXhiGA#(}wy8Fq)?C7yz;uaR6Y#~Qk>U>iZXbG&^mzTF9hh)2fBIx7PNMj>-8rhKO{adx=GM*?ICFbKld|DMRd8XM|=Pq z=L$*msUiY^vs=mJM-%Yl0Ra3Yisks=sw46jw=!BTtRcpMpicHlAMot2G=8JA&1#(lb;!UjbKW=~WF_KOc6uA8c7<#p5_+r1L%#Xa^^y2!1 zm;Mg=y7l#Ci~LRx2GSFZ)}0t28Ag?*g?9g)p-#bHjc$M54iwX84_-x0o0Uof%}$xX zND9;{kK(Wa0^LR$Tbyq=Him>C#tbQXX5eC{aooc)oQhLbZ7n|VpVpiZxONQ z09f{7N)QEz7e)Sixy`TY{I)9ymTCRroH@vA=<}zba~~%4_R;*>n6@8nF{WKP1)o2u zM<3Or*&shNhdO_1`GKH}sv78lm=vg~uktHwQj%Btb4$-bw~&z7gd@`WscbVEEt5D5 zI^$Mi|5R6Yf>M~ShApkMDPC@R>4c~OMq6)2LJmQIVUW^{dyF`e97Y(~v{2p1S*9Kk z3FJ&`W_2o86y@4&kz27%G)mu$HFrnsd`N0@bS1m9luS=?((lP3k(moA~9@n z7S@H|(M^##Yxka$dCfXe|!CGoIS9$DJh$D-i!%`nasHYTX@K|P0$b=ItHFih-!t_agy zVytNr>9;!hY3n8(nnAh6Z~>@G2iu9mCBr%-Y<(%~I+BB5@}z>g6CI{*7qZ%Y9aK`l zAzMIlnm_C@SH=5eJ@(2Q5gim}~x5kH#-ued^6 zT#bMSmrGrvXS)P8reh7u$q`;IEB)_PIJF5go*);>`@NV=0BMaw>#ZjW^>+~1N?SA zUeSJcl8e*@)n>#GI)Y{cD%p!M6sknc-LdndSs1D!4TPZeD%YTi{XB^DUPR4%PzI6e zy(vSk1HRv4=lp69z)|=r+(+gzW{Oi6U!%>^UzbKEHjqNVIX2fN()g~g(!v89+Do;< zr@Kc@uCQx1TG}VF3oetKEBlIR|JZLIYE+t=-D90;1KQb*)I-=N=TIgu&;N}HGLS!t zHZe@-mSB_#Ejh7s?Cd^M=iZ~eaWE6oW0Fw9V}|DJq~r!&|CAi@yaix_0QcpY0GJ^E z6x_+a4M)P`K4~y8qghV^fZ5sbHe*=?=votyUll#wm-eZ!W>Wvy&vJ?>`E)HybBt24 z51mC^UdDBHi57j#lF&j{CX-B(-irVzh^va*1LAWVlbuFOsaJ^2d?gR!qljQFCDLny zMa0cNP!Q920wk=?Eb*pGdpest#MZ7T-5cwZID;$0Jwn&3k$qkhCU~quahF`z_oP-I z7P9uxno+56?n@kdApAI3=SJ!YGbg)kz+R&E?+v7@J>RUJ`yKQ|q^myGCPjS!C&6FNz@Ly6KCNnBvGEOdmd|?!(^4f{zXu2x&4oD(qHU z&6BbM$a2Oyk{Ci;)Ohw|L8tsEd=_&Ka>FShz$47sqb-2K_Kvw~17rypY!MhP_nLlq z#L-`ar(9nWOK(Cf9p5KGw>9**^Y-Am7H!cIFkbW+sI<7G=e5tr@%i6bk7SNDn+R?gKO34~Hy zDHC^>J`pK{cr+&U>1i=tA{Z%$sp`uloVWrb|NH;B^57iw2C*e-br zL=m$z5Se0|n1Z}mi#WK5*t{$azg>pBOv>Soya2;{)NbOR&h~47W1Vjhm=LA9{y0uv zkm@}Nv8(72tlxcU{x8Sca?;CJ`U=ovF>p&16qEm@X~w5(g!goLJ^8}uE!#_hrZ>kN zZEVzcW9RZ4=>%kE?qQEQWcm@BY!*B#nRfQ|cViNpLMQ^znv=AX&)n6DvQ<&W=dTj- zROw?yqtZ`5b(zB=Iko6kD>3u(&>p=()#_s-%zG8b2x=;cn(s8tN?e0;X-789xXPhB z>Q${>f!r_rRkK1hw+0ZT#iU*CC{!H2M^fG+P>ivm0^-?R@Ve2lufdpL;woW05KH#lW)*Tc^7K z#1J35nqJ>Wlpk&fbd)=PhA-XKhlzBR4-M#$xizH<-R>WFwz^U?8@IY*Ge_Gzv;nXd zuN*I)sl;cedmvlhvFXGu?=XMfscEsc*D^G@eG8P?o5om=`k#0w^JMPMF~dF!k!H6P zw!G7eCv6@(k+XY^+;7-M-Z^4=d(Cur4^q%KCMYNE-;{jsn6W)q!xmkA(~(==Lc?q- z+VXp66S8tx6kwWT%+bp9HKmK987oBjh1*0tkV$dC%}(@7TvJSL#@38mGCuBY?>P)$ z)%#cTIq~!PGyD2(_Qu}sRbI@9XV{Q%At7E6#&%OtCQnr6w~uf+fO5It7*anwP#Hr= zTxM4wz-sgzC*tK1A}Q9C2ztoyZD9==KR5Uy{c6eLIro zrq7L@JvY@ie6n8=rwK|NcV82iAyb0bj>0sgNn?D7LSQUSBrs%e3uRs?Em0KBh)V*X zL*|Rp=OuX8^V^9Pz*?hCr=_V4q=yz53=vn9JO{?m%Vig(O&_GGEfCc!*StydHY5G_ zt+{8GAO?_7xRIk$nZ$xMt8bH=8_00H=EP;G%ARaUVmlU%pqz$^isdVTO;$M8iqIA? zh!D_A%z=Pnl3PXz?<>IFYd6)J|S+UH)6M4>YxjxPnsml`g%FG3gUe@+jR(|hNC z6D5*Jc}i=LY9sFx&=L~PzWPtu`|?xlnC>u_Z~qN}n16Qaz4t5gQ>3bFs8f3uJ-lPi zZx}$Ksi7lo#6Ur_;3gk|`H6F$t+1w(8g2gYgM7Bq>e6YOg7g4$D^k5q_hDzHYH zfO+iB9H|7^vV|}51NqPjeF)S}_V!o_6V^y^5WSY>AR+|2uqUXJvc}>CR=31b-2>Xn z9c| zmK_qA@>UZpxuoYOs`Sc>WvqSU*GQ#KF52q4~_nFMs~;zI|P2V z{kT~$y8&_M<64eCH9wQO9!FzDqCmkci_&F4 zKie{4anV`i0IDi7Eu_xB$HKOBHapwCFnAK#r?uJMH1dmf{W|4yyI}Vh8k(rG0o}A9 zvy(#Y+h(htz_JLYssUcJ?zulcH+#@0^Etl4119VqKE7!7Dd9Xft`_)OnjtOCFu{tTvT3M&vd1qQjlABlWx06K=1ph)vr(VxH7JxtR;djv0m22UU% z+Vj1JMW37Wtza|z)t45+E^_hk2+o)P`UdbqzQpWfokwIP)E?Pt)P;2zn)dZ8H@@%<&tm3c%@ZO=15tBYO{{6+~e zV_!0LBGo;H2+9&}^aWU{8mP%( zBY9*yW7a!c7Ap9UbabsYD-<_#ifp={T4)hRDrE|Yt8n+WeJK&X0yvG!Z;`=f7G2TH z)oCSx|JD7jgo>#!y+TD&vCbieugMaHfLjORz)#3rUF&nKQ8wXW4yL{gTXlk?E`unA z2BiDvQprL4s8DQ0sKr5fVT){8*8|3ibQN-2Yi!D@R^NtU_Z}95ih*PXg7qI@hiCy6)wq?&2K8!=J}xR!8#ttlt>`ybgBn{15loawqlp=Ocl@mpJa?57$FlWqMK< zR;Pa87_ZDa=d*J))k}V08-D+xtl^)G;y!Jb)(Ai>*8s$_#Q%+0R<$rTu@kX1vNJXj zH8C+ZG%&LIcfI^y69(04R)EGwbl(u`24Y&m75QM%I71kq@C{A6e1)j+pGN$77WHVI z#EEUDjg#w8$$E=?b2&-Kv>&&twY@+u zpw;LpH~0~VxFhrt4d^L_VMZjPgN5igRS^a<&=-a;+9D)LuLg&5w*zQ~CsGX7VSkJm zyivZm+=sqaDSH%dt0Tyu2VWJx40^i0it5s|^mMoN$5O0I<5_$CR_GTud)Ak#or_<` zPG)8R5p9&hk;^WXW~;6~4;!UgRwvk19^Iz%r@;40jF7Pa0}S1iedmS;>D`sZ6ob<1 zzwRF~dbLhuOiBjwj-dRlsnC(BpDUzpD~~dXuCghAD{NJrN8vB@m2Pt|X@OdS(3=WO z9LUVhYbGuD{K!WZfoMX^ms_~A(dSWadzLT;#)}K+`IoI&LOY$gvP-{!EZn4AF-sUsk}k(tG@+NM`b;uub{V$)Oz$k<@{IJ_(rBXIT;v&SIbC)Lf8(xp zV_h`aWe)ZWOFnRHoUy0la1yRTx3H(PyF+d53ebJDHVfTVEXeYbQ8#CW*QOGRn z>)0`l*yrhq)$3ovI%tq=g!Awa@4~nuixm5_MsVhT*4b6_UP6|a8UyL+t>+C~+MF#^ zdh(Wi4B%*L;RN*uS70pBdc-!cbeJ+z>%64wKL_@0o&pS*&5GB7CJ`YnF(=O;cNey%FMjw~7{>VvIyW%}pRzocD~QlAR7QeP^PL$0 z(`1BXJ^_*WLo(3af!5)i%%7?tq6_2g7;NgmnzkWg40j&O^X8=U7U=&~y3h-~dg``4 z43l9?xQJ(eQ;OU7unB}_{`MC?WL`H!Z3i|jnRFNOM}S9Y)Y>|5svA!OXyq_~ zRu=sKIV}H^Sne^B!qiG1lKM+LV_K>qkBmrCTteZnwGn}~9&;%iqtpt|lrkD)XmMoe zaPVUrpI>8Q;fIaJzz#4CGXyzdz6p)gr0lxyP3G>$fj#@f%{H6dVLYScslzRY@AY(M z`|jt}TaK>h<2jVDGuEd{@%v{}Dz5yQ0H4Yth_B*lzGfBf@u=JV4KD7??Ts$(&gkH~ zif7SVUvT*M%^8LX2>^1Lxsmp_eu1|zoY-0!6 z#{;oXM(FI#p_#`^Rxa(_iN_<@$O~a@&ybhi@n|i5pPGti#7XUKXYKttmM^Ew?9B}| z+^+JO79~$o^upCi-PR zH|LhqbDChKSI8hysHdlwC#;KGFt}G}$6EpXRaoY&b*UhYzkj~cTL3QOVY&RX;YwW- z&KgHe99dQdD{=)^MCOP+Er&_b=tDWED`u!70}n$@>EQ=88_#;8!`wNxWU-l0_+qIk zQhuX2qr`ss%tj22k`s?V+7$C+2{$qW2GF^Oi z+(E1TY0l8=DN9J<$aIE|`>hFl6|?w!s-lhXJXN!i4We!;Wq$3q+oq|O0M_QJ(e2*? z!T3H$AI%^UH`P<&y|)B*Yk(s!Vla2teKJiSBbaGdC6=GgfAlS3GM>(>->_|On{&tvy{?!AaZRcZgX>k#4{xq#TdY04a$QhSvoT0JhJ zRqzHSfpufg4|yAAUaRx1Qe;l8v-_AoVD#VsC7V?~Z<=&iDT%2l3+-es3QFgIRn zZtUiiLtpBwIdi8ppeQ(#^@4>`&KiR#Wjcj+i*C&4gny?I`eY<6m}e_FI^^|7Ufz#Fuk>lw%$L{F?)vVu9)*}eoB$LfYKCL0FO6g7wg7gP#6-}xrsqqC z35&aBAyNE(eNJKGMBV=V^Td^RLst&}%c~L*>a*?U2z1YEK zCAc(E6BwV#(}CIy@0}u)8^wpV)&2zP{iWj$-3ixFS2Fh&dU*ur4RU`Xcq69uwoh;c zt)YepIKvwQ5)L8Wqdb|ajePLzscc82cvVLkR)q)3h}-f@Oj$}W^7-)TJ}E)-Lm-~j ztzO|dgzAyUjOq~*K0+vBZ}pHJ)omx0g1#iEkpe_-IouUxoZBkN9g4V1J%yx;d3%*@ z^gj-{E_uHl0cM^+c!wDGAod=QlIU9-|9sUmqKH5wUXtl*=c0^chNz#U2)>TUX8rfMz|A>l51yyK{L!HW{`(9M@xJMPJkz+NO zu_VX9c*IeM&X`6|m9gib%W0`@;@RIduQ;NVGlx7c1~zcEzPrQz7H$??I99K_rnfdB zg~GB%W@OX7FzV_OuzY6nr%apT=`f8>{AFlx7bwYT`VySo`i)k}W(54(&JZ0BDhc_Y zCy;VT z;nqhPB<}N=y&hRK+3I!Ic7WMxdj&5hUwJR*>M>C^X!A&I%3xo03V(Bw@mz;E&;Ls& zuZxS_45a{cGAlI0zrdOoKyCHh_-gZRH5_*pA^|J-wN=p@!nbLHUCL2bi9(B zq7te1CN7#eo(*lP3KU=xk{p_BW%u2@z5{;7!%xM+Z_L+!Q428Tj5Dmi*KKh9r7s9Ja0 zIV^C8lFJ@xUTH7d#S(p&9KlozsX3zKYJu9cRyvJl@ELr2HHYb%Q4}wlfNr4K>Ndse z-^bf|>#&~S0(IcodEy-?c4+1b57CVPmHZ&f&>OiEn`IXola6biY{i ziT3Xv$v;#qIgj$gI-nmvl0km_03WzJm3kszOf@n(&WmV>1-NFk+-h|GF#s!d;PRZG%ynTD-e*TPR_X-WphcndAidm&YtCg%Z5;eOo~ucI~rKJ^9B`rS)rKsdY^o0WK+mi^74ZGs6by z8Db!i624n`&8R6lO$CUxCenpHddVY-GveNs12?O{@MM}Zs+|O$k#=d zdm?sEThMLH)AZUTINkLh(gXT{|C;_My<|UNA@T%>^ZsAI@m)+r4Qwo|J%r3njI8YK zENq?S9qsH*9GxvpoEZO0i%7A`zv?Xi*@VEWA+V?_520BK$txmQvLr#KE#V6jGgm(i z$4tVnSi3qs1!sK4_@1_Y`9EPdpZqArdjokZ+}KI~8y@%bu`eevoy+Z*_kOE&eE0jG zMuvwep%QjDxe_0^^$dW)`^@XBsX2u=Fkg#drhq?z!a#@!Y$% znQlxBW^Kmkb=B{+W!?Vk~bA}_Y5 z=?(M=CL}1-ucA>sa35`dNpN?1PzOjEsd*cb}p6NlTM2>|#-X9=!gA zF*r_3hpZAvcK-0DA)9P)&W~LFIx$T48VYv)a24C*34$d1KyJQ-D$*W{4{=JYHba5&FW!o zGpw6X25x3CEveJ`huAs<^!%Ii1v4!?YmzgD+Ak@?7~wRjQxfGpanrQNp^%W4d>7!7 zIO9^3J&~cKc~$^?a=H?fxHvXWwNtspm?S?FbX&^F&-BGpQfgQ!JZT5a7k+e21I!Pv zgL^0B+HUZf>X?DVD1jITXH^0>4l=}{>y=sKJ^pZ289z+&*d$Y4 z&~gn-WW@YZ)R=jlGyadeae23B*W%Lztrks#$!r2n!Hxg))xrvRG0 zoZG@^!s@JGS)cJmYz3qT{w(NweSUXkk6u4b01)W_GTfUwUtiY_oF6BqtNH zbqQ53htoIHwO8tl{fXHnl59k1w^pWb5WKzyjkzp9wF63YKy}iIitP<$Ffqb?COn*s zpu6P`_Q%Qk0J&A0xM%z2aK}|E5A`BA{aoH#Y!-!E0FExY>-X;;!+!=OydyDX9AF9J z3Fs8z`foml|LuVM_wC2OwTrN{pm+UdK!;A_MMYe!`hIr(byb^_le3t(=(WooEhZR% z?R4(+0q7UG?|I*Tr7We?C(>%R2*y_h;XT+dHe3Z)%Xt{iO&lcc4^-d*B-PF&`|~;EY--*MubZ zexHGRW)SJ)g%~dPc^}F>qL_|xWRcn@e6?q4P|f|aGU|>6MepQQ<7*F#+GjD;!#gt6 z?*1k#;zY$;%>P;6)^kIgYHlFKq)5o&pT$QLE)0PBy->;zK_%}MGVqDuTM-^36Z5pd zjd{kyTariP+{VVt&WRWk^@w{76CE2YMmS%e^R=^|bBdquoSu??sXBL#hn}%~@|b5r z8VHWo5K`UZ^d1B(N6ukFZjR1KLzEzu#k^qjHqKsMg(*4m@Dh~6`l$8RaqE636pY;qx)D= z0?rtOFy!UYq%<|MnG>N_l8VdrItn?ctVp9En2ZoZ6?m%2qN?Jr>Z^=ZXEP)s`&h%K zO9ML^(W8zI97tv0chmvP6k)%j1fmq1Sx!HZSx=_pZc#@~fo4Ch;CfP~mN-J#>ftBk z^!oW>qQWBoJMhPvVJd^^on05w%w>3XXwH7`J;ytsD_F+>l)b0r4&0<6uR~8 z20SE?iJnCPIVRvXnM&5p3_Qi7Q-1>j0>AvNh6}$c_R_xZif~yG#~%Xd_c5_m5)FQU zW!6;j_e1!-d=D6m+v!TFwuU0IPBqg_Bm!DAkIuv&TYV z+72VYG^Q=a{VpaLAEZ`$q5np z*&fyvk;>c^B?Z}0Ln6T9jaOT@OaTK3DpG&S4@RHL-x9&_9lO=;lVJkR^exsVC;3)y zpt@=d@G@V2Hm=Vu(A`qO^p4muf22S>=jT?`Dq_YD%H8!}HG{$Q4qmf#{SVUK`ML71 z-SbYzPRF)8wr$(CZQHifadvEUjE-&Fwl(>ld#2{xGxeOQr%ru-*j4)vSZlqm>x~h1 zzaD&+cPJ37&+&e}Yc(({s%?s8?-cGoz+r;*Z%CpArS^9KXHz8))?9YNQ>I2|x)qI2 ztJ9c+E2>{*(4x8xUi(?W zuG~ph=fu!gO7f*Ap~=Rjso8B!j`fKL;7FzJU!oJ>v`_}nFe6)SCqTtyC$Z))h1+!` zCePXGWrI~#8Il`Kf7uwomu17XHLs)h35()R(Bvl`Au*P=p#5$-K>95`b6)W>gY2Dy z{suE7IPCYf(5yD-_R5rnSu90nK~zRAyTNHtE7LS`V$t?~eK02^-M=izCm4ADwyy&a zpkkwYjaeAQ|riy04S z|I3si#NF!KeiiCOX`4o=J* zvn%ewzja6I@1}!$O(8QQ=}#s3!$=JR2bnBRs>e1Gk!xYdANzJ1xHuu#_0J~m38YCW z(QXChz@yxDI_#jWgc@9Bxt_2PVr$vk*Bqd+J%HF(D4&d8o%lYHUbo2|?IRV&25al-F1 za-|9dV4A%zGV!VIiIP06~DO~q)E1htR^|3@DHHWG3QKYK=fED&W*m8NTl7Gf2e8IN0SF$DAIHUUNv*R!e)e|9BuqSDg_Vk!Zm zP7Exfj?=0nT&aEkwd2^2g-MZ$p^AtCQyWHV-GH4+kt+0Imf!>fn1KKFVVnqfBeneS zuvTQv89HQoC0do5>hb#{T`i`qO8#-^c)Dg(3PEViQF!E_bAtJBRq#qnK!O{rh^Lh? z)U25Nm3$!3{Y)Ym-n9p6tzKVZgLuWR27ITN=7mK9D}|Uba~~xSyh&uIOJ&`^de_>8 za!!N33=Lr&!X8tOg`iMYY~pe5s*;ER30y+J|^GQT*<6v3ua$wc262 zoq6&tP94SLDMD+h4uq^3kNLrGtd#N z_J9ru87nNLH5Nc}hTDgF%&1X8qR8b^~0dG-==cYb!a*i}Oh?GnF!6b$g=r~GlgkF{Kq7w#&+ zjk!v2C~et9Z1j0xr*PT_RvmiLNuLN-l4BZNewvO*<|4>M%MGG|kc8SbgMq|&KBN=W zMlf{tFnoQrI_C$LCYL_A1ZyP_9U+;X&5ztX=uT07#aB?wCaDD}RV2@_ympJrG5FZx zMrH04@e|x_F^9w$%4d(`+XpmnJ(w;zhB!(}DF_QmEJDiaqVIej$wX%7=!A7T)cIfT zcjooi#6w~#-z5Clf|egVU+eHq!k7P$Fk8a+Bty|F!oB@s!lzl&cnt7HR*=4)r*Y|G z=9aJ=^eL6)U~PHcL)xqSmzuT@OhZtUw^ zM~`2?*##XVoYIm#FkZ|p5H_}YO=Mata=T~;iDlYY=XqaGS{68Q$EPcEgS4J&`B87n zr&ZqTy+LUIBH>oCs)bm3KZ-wAxWfl>6Ntqp;o7w2$?W-0O&|#8g=lubN#9;*+-SMZ ze@Gb3Dd7fnAk95jC%Pv;p~M-a;;{hTu>fUpvZCi5o!?W9 zuaBK;qppprgk{(18#5CZ*VU7+-6liB)Ynm&8IV3i2Vq|XkT!^0guNROx4jw==(9Xr zEU$DNe*R(M{JPM@5a5NK<@e8>q}=KxyWD~>ud+XJnQ{rwAM@UsnNy(KKiuVmr)Jy3 zfTw|f7tS16I5Pt2`P0qrr2$?TS@iM`D~dj>?jO(QxuxUcAmUE@MG{ILPrI9Fs^o}=cmEc3BbO^q4IOoTqsU`3WSTRABL*^zLSLCW(1EG0YQGvx0T zJcweLDj*stIdYO+QgUC4meLgxwp@ZVd^odtdAV}nr_g7e>d|B;aeq;O70XQmP6mdf z6Enw5R3~2^L_NY&_t-An~e^^0>A_tT`A0d#lCjmGz?{7 z9u-+R9l9DCYza)u0^e^HaxNhZe99i_Rrq``HL@2p_A|84CCu}YYat34W9%W^%vf^+mgUXm^~PK zDf-8+yxNWn-xzc-x=_z(N$@dC&)&NXU422jY1-^zUPsNuhmU!??qJTL3kDdd0e-h% z6LB!#Ept7yw}#F7;r8%DLDtm#W~9L}htQzq5`ei(=_U!F&e_|`6c0N)wPGZWg8c?C z9uX79c>O}&6!^+*(jMEw&OV`{z=k1M7MfnXo}86Bq(vle{M^*-oLZ$ovuy~Z`@VEg z&V5pfo(|BVZxu@*(As2B9JyDD2TSpN`E6tB1h%E6281MTumiA0vObD!>UP*QF_f=# z`c$8s@N*d`U(j!u=?Anv^IrT26Sf%L5I%`(td(g5cMFRe6#e69s5Xk{ zi2zW)&?VAm7=d@xPqN-ELfT$Fzzg}ilz$VdJ?L?(IHZoh5G5QiCh43~+lX=-sQxZ1 z4%Z+fTfO(x%4ru?RQ213n6OHMHM~>l5< zl^E$hh=-1a0!Gp%W5usaqW;koM7D;jl3xQyW!ldt4JPI)440gq&!gy89~+*DlrXg7 z@Yz-O(*4HW4pRN)_$;y{DdPXo?y)uSX1izyPPd>02t2!?43*P8ACMnfY>;<>4pXrQ zY5sBkc&(9-My%?U(3V0d;7eveKTQQs41#Mr9 zuO@aU$S-0KaecPPWSt)%aU4KfE)G2;u3=ORl`f3ZIyl#mOdi=Fmm>HxCE$?uI*3K_ zb8||~RV`kgpoL2MpDDqPZ+5|1txU~MZHDG98%Xn9`DWJEB4haOoLc)Grv8Y3Vu?f} zk^g~c01U_KSfM=(Ia}m1%Dzj!%kYIgzzGTqVU2m7VWXvh43`6|*}tZNd0|KO(pdWR zC*9~c5A;xLD8?vK!yt`R$#*lT9Ew4cOa$hxn|}C~1yk{i;&eCzl0Yj~2XnG3OL#K(uL=x-Tn2yffq-i?S+; zG}EOB-KN=#aJpzrCD*Yjy)v}!g4_$HAQfIeSx7rF>}+>`q$6!K4O9t z0}pF;avOCS9IHeTEtPG5NN6c|K04XPA*Jj?Jln@ir)kE`L2JFJwRKlCTBlo|4pLsY`wtK!!uPT0J8VdMm$~%VO4YdD@~Emvv6ul=C{TkDgkxsmmD^5GY78XU!v8rVNri(mD_zeIX(}M9rI+vvfT;UOGr}OgGYCH*m5y=sE*t0(-j# zzK73(+ATg)y7e3j5E{bJjm;{%gR0OW< zhEzr$#!j%$)DcVnp^3;C(sCdW5tN;bpbsKs4v_lHD6Q1&!}#`5j~0SSey)$ zY1@u1iI1Wh5%f8tqy?Z&X*E{A1UxVoQEk=jQd1g{(0mm+;d4w?aehWc4!|NgRj_|G zuWVVbY>i)#N0Kgs;53iGN1^D*hm_ZUSBtZ1d@C5H6xZXwKD65(Q`L$FSCF!c?Yi_?KgO)^%(R zO5M7ymG&c9JA?{OA21%acB=Ka@9<==28D}Ay}irztL))bW@{nuVKlET_YCEJTcLZb zrnn~k@!K!V@|gBD0xPC^2IJEnvIKb-A=0W=zy14sF~aN7;P1?uQJ5X@zq#nQSPcrS z2UM1b7I?%NB1xo*xUMg}ZjeO8#@;Yi-*!MMzX-I$e6S~5w!bvjx7Tin&*78Xpx@>Q z{7kdMMy8`j+>IS?+a4skZm{023|m4vYsa?}6ZvVMG)#`j~d@G~aDMoNAvs zT)+Hu#%K{cn%XUGI2j6{1$OK@5!$mbgT+TEPAe1_pUTU6Tu;M5c2`hVzdy|+HLE``jg7`QCY#HW2{Yd!_l8qq zQs94tvd<8{=Z1Em1{Ww!s|-YC z-U1u7-Lqxxe7H8_^M+1kc|zmChZ<2>?}0k8F&HsY8Jf}S=lk5c^Jnj|;is;t>$kD< zcb44LWNAa(9n1-N8Fv+*5$D5Ij9xcZ z_MsO)ob=s;EWPoTnh_n9Q#+EygLL77!`8#OVTiz4RUoBa0)KML_0#sP zFWou;pF5ln`@nz*oZVhg=u;iqU>i8{QQ40x=ww4c$h|8`m8;&8Vl@RW+-9xpS;X&ujx#vemg9aBWn@XlMyV7O!y{tDOab3#EGQb z0ZLy{TveSptCn&t9lM7!b(L`Avf2J$y5ddS^c%$2`vF*v1t&i#)!2o;s2*m!ji6<3 zVT4v4W>1h3&P(ki8mAHR25GxOZxb8QI)oUBO#K8Q`HcA0BXrnf+9m5*CRwgvja=DcqA?~bG2(haz(>~VuW{E@FiBqorrLq?|^0SSK>-h z1iD852zeis5Tu&~NkG|9PX)5f@DM>jbWJzKIIttH=pe5V);ET~^WwKkvw%g#^=%4= zgyK)`V{vQb-Y%M8SC6lX(_^9(WnuduU?pLFEVnPhj}3bU!Tt$JX(8hQhQ7MXYckEV zyc4%D?N-59Ptg!<`F-_x>}5eM9uCr4@;~Mvjx84AmzbW$=xwjvg55$OE?uI>=q<;* zONA{L5xk2)KH7P5;`fc?((T*6mN2Wd?ly7I5>U6=dj^e=Vz@L!ce4xoGYXC_a&1^d z!T#+1T}oN(ihex4=Jugp0-I^^YOb#XWSpD909C?88{~uoSZz{1PlHWFFs?k zV`%2c{i+X41SKgx|Dy~t9;MRX1KG^HRE**SF0ez*_V1{`bORUb0?!Gq+$ey%M(ks< z3sAh7xg}A#EhpYjn1A26Utrg_gF*rUMSXAF`Tjd6`2U{in-%;1TwjH< zGW1I_My7H;m-zs5PM6iGsEHWp3RBOQ3!9z4oi05#`nx~x;^cttx9JSl(;VO{42~I3 z>qhzTuB~IjtTFz)cDeC+#`$4zr*l`{U7O%hh~Tk$EGOO|b@esW zgx;`xo|<5i-?-#<_BGgDm)MPd`;|c5o&I)u@Gv)ZgimX^ZQ1>t6Ag|L-RHI zHCTQx-QIWUu{nG33wl{|Kk#qJBZu0Og*IDHtW3M{(h$;H(^?_L7CQ@N{o22@SnTkm zld{uPG8LUDQIR^@x*YTGEJyxBXQKIpyn>FuK1Id~y~45}UbJM3+8D@Met3VrI8o^# zH!-Q+W^wYk7;RE*m0D%>lE8K6gVc9=TVH$-K^!AxKAs+0mFUdLuO-4lnw>*~(VROs z>#0l5W2!7QVbN>~hZSm3(QJzadWMq4hFt!{$e=Q8s^K6Q%$QoT>Ky#Xau9GLO>U$@ zgEKy5SCzCKpkB|4*$c;_MG&8yY(FYCYIk5mla^kBdaqjS3MJ_qrsVpg@-v^Gc!X*c8cr>J?$`YDvo;Q z6$Yt#AhC&4n=Q3T2D;i(Qyeg5Wt{t>?#S)&EV>fCP}|8m^WZ@xl%Jr~ppit5=|;q5 z!ChKyFFv(mX=m416dCSaFoe>`x0>Piu`e5tk2wn6VXZ<(h7dzZ^q$0P`##R|mIf$$ zseIVoJ(WZ^@ICC%l(u_tTlZWeyaSerC$Jo0uv}r5sSaq~)U}58&vg1?<-kwr-4&)* z@rtS0js!M|R$(K5qv;gJ(7bpezvx#HG?eEoataaxhu=R}kcqqm_eTXuCT+1ahJk)~ zkfL1q25)aB-N!?xg~TIIs^!MV^DBW&XNzKZ4INtLanorta=jo0dAO zEa@BOef1-a^YxV1ZOhax(&=-&Ssb((_L}(su4)~0nMP8>ll$XuM6P-{4xc%i+^(wf zM;Pn?{DeXI;aC#W=h%<)m7WKns#@T7wJnb6Q}oNH5%{AdFYcuvgJzDzIqq`X9Mg9k z-CPE*E28-^@`21Dnv?JtfNWk3aPX8*aq)R(L=?P_9^@Jcfw`%+!O;qD0c)P=_-Th= zTWHct{st<7PcOxFI9zwf9=mqj6F6NgRw=@xQ-Bf{ORL~$EQmoQDSCxUiBh~5I}5*P zGP^)3q5WB2oE1AE_Vu$0!OecX)ISOI$sQK-w~rQgK23T7=Ep{y1)a2!AVXe8!=ivF z37Z?~ZwdVAYD~K&4+Au!TiTVCMOBL|i8ap-8=+lk{$SVh?Z2Q`u~*v>?h5mCqvSR(DdsZ_iAc|oH(VZYL8C8ShPll1a?RMP zS9Q!m22zx?F}t@>PxF+zF}yf61$v*PEd7mSbBjeR>yyy5$v0dzNM*l6>}6jo;;?Q2 zh-s%zOF4{gG^y?1{&S&hA`qKGLw6tL-RdKUC6}cFGq9s}aYWRgl}st>zmtR25?EsB z&MARx`V{^e4pk)@rgVJC{l;9?7Q2bAOO&q*$91Yh*txi*2dD!X2UG8}2>%^K{J$LFX=mRKaFm{_csKQ4^hNZ7#b(0rvKmd8 zf}cq0kO&|pyq0@N;MyzayS(xDCiq|CZ=F1)t4as=LT{aZ%4=Tab1cC!b%K*4 zTkBp&n_MHm{XQPKfV2az60aH7WqWX2vw{olzjqQy_Mn&KbuY{jFea9G@`VZw{4yb# z0~puSJx|@A{57;QNDfg76&CmJh@BdZ3@^-m0%O;O)g`L8>^KzRgP;5f0#IQ zarA%U&dY4z8rrj~xEEDfU@EmR60@Ymxl2i{;~mp5K$=yF#A=~CC&_s&fZ0x2!GKSm z)2X9QP*^m}PB}83^UmXfF8zQ-Sz!K?!@@kY!_Iemc$%BQ$sn#wJ+~l_yYB{eIzf<_ zDKGJs-rQ>L1kqxO3@eBV*Ey^VzEKvzFM-O}cUo>*lh;!oQa~tF!^p04FRfN{n|OI_ zepYE}rE=-$waiST=HxQ=S1k_e)Km11oM|rCAl^y7qP9PV6uhu(bK|0xU}X2xI>i!2aPl|`snfRbj0 zlTFR8Cu>auamAeX2CCO~hVT-#&y8_rZ>~z2(qf+u=3kx-XF6SqJ$lMC=g52^^8!ET z@{`xk)?XLv)`Y7rHOv~hSY0}JRO8XG=%WoHE+v4;Ey}4fHzyPA?l|%!#gXlBTiRQf z@i0{ia1L)LHd(v4>-!9at|E_6sr3k*olRLV4>PrCh@g*Lxw7`X@5s79HEf@x8y*BO>&sVqy#wksGW@}TUY-9j8Dgw&j4ljZ83=bP{QgK zqwKkcnE!$E+aJ$bZdVDfZ#vXRtgYq>toCTyv?F+$DceHG!k?t7p8DLN&>rhI!opT) z%Z?5ZgC~OGFp+7Ev8(`28PLTE-XhxRr7zTu={5$*N-I!q@XyXukTnLd*Pp_L4d1Qx z3_S9Y(=5V6byw0)_iiEWL^?Co>Oj6ooazGGLxiF=Z_l#$Ta?TQ5endJ&`~pQ?2+L! z9ylTc;q&3WU^rKWP~hl03*^!xByfCGI05BFevhb;v#?pHqZAJ+Wzy-63X-`=i91I> zEmAud2(VM@VUgdoC4d7Ql<2r9+xeD3yU|@We zLAm>RZNr^^uTRp=7q5FCdl1j->9Js?S=%e?dFaXgJ)k;51NZ}S2)66s%G<42^e0s4XdDE|XDj}lTFDj7%GGrIe_nfA7=5J6g+4nF%j|2OW!>k`n^Um6J8^Es);3uO%=4MCbgv z*aSq`%TJakC8y-=I0dKdOa!m(AH(9;1QRAa(~$W2GeXRs>B-Lk2)qEXvKI^<-|S2| z_wA%>N-UpDdS0QzDaE_*KPN$chYjiIzjIhzpdWvrk6nMHnct4xKcgaW|Ii~f&`a7r zoA*m1_-6~Qbcc(86G~p@5t(@MIQTILzgGqk5*rbofTgMmLk9Wsk^hj$4^G>R&*DpLi2 z_{{C{8U0Z#vb0OHW~Nk5=zO<|2tKLrt!N^@P~c43BlWc3a&A1}=WNrP(Gq>UlCH35Qi`ycS*bSn7L0%=YjhWsnt&(U zWwInHE*sgr%%3oiW#q_^PYUn%#7Gv|^^_DiIS%I3V!_O2PF_^fl*XM!dFkR+#P zDk9so;mJ`_(o_>KLwCK%M;UfmpU8<77O@Mq5<{s-49DDP*4cBgrVui#~=aML3hB$O6F2 ztxEKGl6UK;TP{HyZ0affJs64a;Rh9d1LuONX zCtQIw`b>#mJ;ye0?CJP`tgXEcI=!&VzHr6fq3h2+3$5GB{8mQDuZR?2Fds;Xf))aE zyUcWTk(3adX|4Jk*lBw8LW8KCvpbp^Fj!m-Gtc5{6u;s~{Pk+RjDHH%`L2n7OK13I zcp)i#P5(F9oLM#~9K#(}7LrQI-SJl+C27517-N4K{26*stVr=5787GJqKRn4Hg}M$ z-_%$@1WRl$-j`tJa{l0Mgof=XQO=()T{XbmP2M6w&xYLcofa-3?Q>DI5fpX2_K`E zXi%aj?*Gnf#Pk)V;0x0ezm~%E1)HLGUoeadf$a|6ia(%uZ@K2e`p^x9H&5F}V0=$F z`~;mEy*7J}g3Y;qtzmqJ`=k{@&v-$Y1!Rd5T7E)(C2n(Ie#*S%hM^mSn`0SO3Y)?o z3PUiY{at5F(vO2Jti}G5uWoCoPj)PL#0t(xWn#j3mxrM`X`G=_E197}2!E%j1c#M7 zPNWa3nnUoWE1a;-aQk;&UF&jHU0g{-po?bDYEOar_l;vU}^d?~dSK2mw z0#C{=bhjN(Uz6IcP4(beLBgP0Z@R&kV=x{yTT&i1yN%EI{6H@?zt$?`Zlm(IM2k++ z5>jHC_Ir{=0~BqQ>+jWhMcGe<7e&NKK!IEftn|53g183@fZxoujFPF3kvB_uf|6S~ z_yOG%7XiYswe?Ba=hjCs#=zF{l^MZQI=d<9&W_3z0_h?J0z&YkA6Mu-Fm^O1jw&KJaHOqd z`&HeT4|-f>GtX}-Vi6sJxgssN7j6$7sXVl>nPRa%eY9I)S4qj8Fh;J|^4)(ETs(a{ z)U&|+9i@gmch9HvxLtUQ=Jn@QmIGZX_`B#;f9X$Nj=D79ibX!i*g|&d0NmwSF>Zpg zKL%{~djKe$Mp$tDc)u4Zb%aoPFsu**3^TW#)@W7+jQro=;fNv0w)PH`xnaE=qJi2^ zS%K>~``%GM<0$_cLEkLH7?_V@G;7Evd!E;ECv&`%7|uqE_Who5az-NuOI(Gsg$iQ@cYyouz&h8-9U3>&4pX z#(eEbxWl1vJXK4+?eLI{d`r7A}3+;xGpgMb;K+SLfP^Qh6N_My#wGV#5#%@Kxg`z z2zG4uTqDg^uRjQnD`#{8eE+B57=1Mln=+x+9?hd9`|NT|a0B?cg4$Wpwl6KJC=W41 zp$|+2%h_-wp5(9-v0v(EZ%ij$EwB(fmicJU>w2pUrSST$o?CVdrU<8o)$%xsoL)~yL@$YvwX>e;}c^ijO zHn?%oAL@B66ne-@NThWgv@g{x!HONA*joKvj`89${Ahfq&c74j#vsVB6V$Yw5N^1P zZdC`i0>Y~Y49!)wYp(dV*eoqJN31{Q9bF$EW-o#2T?lGOFif|R*lqEUpnkD)feb~# zbi@SSc^GJnSVK!KI*vy>3PLs=V$ z>5i=o(nun|Ji7=^RP~*cA_(oNgS7aNw*A==P*(w58KGfH#rv&t%o8G8Myady=N|?i zUBu_s5-g;P7n04&dJ~PE!G&bLLMEh5B0-cjx6u>G5gGBBj8u63(2VpjL6HsY7Vc>& zn1KKGLKso`utM|Z4E+e@vT$bL%S0)X5{`F;s_Y=pkgpQ(91PU7Dp-V8mTINd`B^=N z778e;KVmKEgaSjpn5K6Oy627gAt=)n79{)V3r z4a}DAmnpK(VRLJ~ENG-C=vZqc$Fl7YEvpa_)C>7ekI9Mr#Y})2K^->W2y%YZ$R1kD z16DRiiP2tD;Ko#nhD@z5W!G63OfBnZ&7uf`==ms_x{{{#w)Vi|h%3xqMu7*o*^_zs z)PY8uT%Hw*$5_}rSE*x@x{~TXW-5?Si@q8igX=m^9%%_i=I4+Y|C!Z}^Mq`fiig>S zWWvZpM|g_8*%m=wP-{?L#bM6HSP!Nc43JzikZOj%N&#BpmK}=!+Fvt)KRZt))YcTB zTm!(Wwt*>kYhq9c0t^?xkE=PZz!%jaS)kj=K-xaAlO4FDiwWpcnrR_1p=wJe+o-d; zzhcB>Yym}Z)c!4zrsjrc)CH+ysWAb(TTvSm#>`OTm-_+tZ7hkoxKqp&%bJg%j&T+VJB_^>ti{s++jnWyb zJJZvL7W?UiJ;c>kpN^T)7hL?;e=^Ab6NX@s{8}saZ3|%k z7QV9lKeti;TS4$|@_`)H6;*7ppPezHR7N0!w@3u~(uRa+2FPX%%M6esXa-CalIPS# zh%t<&XpD10m2o5Z`-II?bw0Q82*YBeWq2~i@+2S`PRcrS3s0^pE-G=K?`KbZK;FSQ zC};_ChEO3Wuky;f0!W?i=|l>W2?iPwbjj)phANng$?9>RxV)CW#Ia%y)`N8e(@N@; zm1v8jYXc$P9zJ&rLaqZ2RvdRnr7TQt$60UdlPZt+FMa4DwwR_q{VwpqRB$^J41W*d z*5aQqs*P21Z-sIj;K*Cl(+p>}){rmP-9rS%xY`3ac}bT{Lh~%CJ*;)2yvyG=w4T z`fIWKv-Z}SoIh)M$8HXdZ70}dQebW+?}Gmf(Pv?P;Tt?H1XHK?AvIIqmOHO=_U~h+ zhZ8+0>C=12h@@ba3TyM=E!63U#@c(i$U#%Jh&Br;RO18e3&Pg#Pof|E+^m1HxsGrN zkH=rbX-#gfl05{j4kfK~0_^9Ob(o7J(@mC1qn3nM4w}Uhc=Kl1%ECzo*w%Tw`j{j% z(shXN!DFi+JJ%Dd^-_#G7bi2Hcuv$OI>-(yOw}KfkvQM>QxzKi-0MJJq{;5XJ-?qc z_#Gm5vn^46Wc4|Dx0J^cG@+V{2tBOoLkwD|BsnCzct>Qg|KjZGOOIvlQr!i?{b&X3 zVd0&*2iiG%SNwI8^p3N^RZ3rE2>ABI`!nrNVn8m;a5;&WdJAU5e%N@Xz>lJ$ZGeR8 z7!7AHQnf`jOUgl?iIjglrfJ*%kf)punX$pYz@TZU)FjJ>h3VL`Ra*>tVPM4)P zS6@KYRy+w z&CebfuDMEbPF5-wA#Sn6fTmtX3snp_6VA!2Bj@5yS)845rpC1s;tRO5X3X;oZ`Ir^ zy0Vyk0?iczz7Sd!hiSwv5&@wR(xjeF#&(EK+AJkIW{PZyD`_Ky^=1?Y{ge1nbs{f4 zQJc|&*=YcmGo#EDGJNv0tdqYH)$0vX6{c?9BOS`gF-p`#%2)I`L8=3Ia zG+ys}1pw@Ej}W}$O5P_-wX=}~#aFVEBpW=U+V@sU{EqTFS5R(RI4?r%9ZkPU`H0t# zv!ho0Xc!FGUs(!lbOt~pe*bBH@z2SWDJ1oi``ek0`@JWp{r_~qK5e; zQy*uHK@bd@3ACdyJ)yXq+9GJdMhJzS2(jed(F0vpqGG-VrvkC%rkg4@Gvh=Y*cop*H|=-Aj?X ze}GVC-V^5Wh?wi6{N2fg;pdw@LZ0rOI5J1QgLLH^Ia2y^$0W^Lv5Uz))-c8J!kt71 zcqYmFo?!G4jI zqC<%Wt}0bRaK*h;%_~9?PVyw=JG`9HCr4v+20Q$1pOVK_n~u=Z~T>j z$mx?u%py##`cMk4_%V`Oo!`69-_~wb8#cJpwXbh!o@{*1WHYx?lSjI^=BCM4NN&xP zcAV}Ct5()|K@2UJ^M^sGcb0dK6+Ch!Nz_-I&tgW>NRPHqi`a8>-|i2FqijZzPX}Gv zZ*g@qIXU$RCJ`&e7G&Ziu_)1*sd?7@SxGs*uKykUTvY7~~tN7n2Bx zGCK0PiX6n^FItTHaO?QLM4%4~MQybOY$|gE%Xo{}O>%(ex)r0*>}Voc$beID|w1ybTTcz@$t+1DAW!=gic2) z^XN+-#K2l`mFS0L;icNjksK~b+!jQqm9n`SO~1uh)AG^4uj|T&!qA$pO)#Ls4k~`p z)!otR7<(b}2s_B$=-A&5L@RBkShTG_N=+_2$}~9X@SnQR-sOU6+gR9YQVf>W(ix4E zi=(Gr)fCGeMarUVm3aJ4Pr4=uj=6*aE|<$fZoWjhOD@|J7^Y3g(cfN zPe1b4FfpWRhtZT-yZ5Q^IUrO+TP41AVtANc>&i&C5rN;c3!MDHw!w4&u z0do*^D*Rl($#+zmuYZc=9k|AFIpRX$U9rFB+6u1yxyP2w%l(B7t4(9c_I~;SDw5gb zjO6?J;+na}(lxvNPOblTpuhj<#QGfGhkKXk9R%gVO zJHoP9-%fq-;IJ0X1CJ_3{HTuzHY!6Y4Ey6e7gJT}v$C$`P6cEt!|x(KgWq4-r6EH? zS-tiuaYxr;e+Ph7pWD1Khkqp=fvf+kkJW1AWyT_xDiE0 z%W-c&4DI+5iUDT0$3+_;%r$0YU^>D=+Hyt7L69(%r!Moc^?B1$CIW~*3_XJZCWMw6 z;iq)Mgi7#8G*CM^q0fgL!E93mjA4K{88GS);=fh)Q)vS%kc9WNXpOZ3f$~+ zNK18$YFt&fTa1T_I?bfM)^dniZW&cU!8evk!zsmK>0GjZkZZ){*{pI)xVx2Ac_Rmi z)CjKe;@!E7!6TXNl)Pu(G2>or9hv$l2wQL1Nf0wvPw9A~0Jq$Y(3P49i%xizWDyT} zt#K@;y%cyz0g=N|eZ0P5%6GaJkGE&$7&fTQbi`~ex*|qRU3Bio)I(e%KMaP_@*YQ= zVt`Kz?mO^jO%N1~Fw5Gbos+wkZ_(894}792XdPv2sD7}jKptbNrYK~Ql#^=@ zRrI+8);Fq#Yfa7Z z2@(G+I6f0sW%)3_x04GHAt4l;#m;qgS9cAwnZL%ZiI(6a|3_^+)3y{xl!`Cu#cx#7 zKDh7Jc%*q>kLof|)bH|=kJ?Wag;`1U`!P|&;$xhwIqFCdgF4+(afa^5JG;1#36r<1 z;*Uy0sK>luo7=v`NM3*>U{^3rK5GnE;S7trfM%5?B-QL9?phtSs=9)(xDi zCzb{;sJs)I@m8qhPk!j4kn&bIcC-G|9kPBa4v9^B>eSk>$_0n|Aw$57lgF5yRD6dw z<>Z8hT_Lo1VnD~kQlabZlHNzG_!~2$7(rNXuw+KF+}=(iE_9vn96kZF!v(yKqp|ep zC!cUl;)L4I{GDnl^O&Vc!!gvx0U<+ebc84eA8w*SxI4Nbo%t()ssBOQJw-ju+MXz$gLy^ujth~;zDI4!^utLKo*=em=W}zYBJO| z%>%T4)(z}^6ZkW8|bslaSeG-_xHn->xKApulhO;!B@fZ%Cm4JQa+u~Wvk#=(K=ZI`c|D~lgr z&e_eTLbE=md2>ET2wq9-^+FiG`W3SWKVFQdzqV{Pjd%3@vpUV`4eKX#9disldau{` z?SUQa13#2(9YUV3&_+qS*sU;f&Z{1)mF6Kl)itMbvtfWv@6H5h*LXlpM0tDenECKc zP(|_;gY~c*V98ZrvD_t+wQ=>d-IegF`gZq@70^z+W%=cjZhlZ?SO5C@INZPEeXf{f zih(KmWY9yQqm`~&IGOPzuRth1yqM8W7&qaw2P>2Aj(DZ!6MGJ)2X8|K*1BOh1&E** z7?PKfyVcX0k9elGu&;zL6Jx%;zf?%(3ZnvXrwWV>^wrX2k0+C4xrs}~Mr58E?B}dC zl_WtAzrg7IoHNMRPLz}{dbKQ1cJ7|(mWiKbmdLy6FLz!TL4brOZC2w?%Vai)|5>a1 zRa;z*fU;*A0oUnXa(XJuP>lg?L|2SdIlHU?^8skYBq25?HlSc)g&c=pXehzr#tdvC zl9*w3b7%r~pd~`H=I>%E?uYZ2y%kkV($@#4Q=~o~xUPhi+o>&9@RJ)J3nzURRg-nn z95^_IJ`A8+L=kGE#QrUx$QcIWx;RWpNBp4dVDGkQlo^{VQ zdrbV&pH72Fb~JR74rn|HOD7BJGfx2>IEN&qQ0s_%7>9=$wwDubU^8wenAB^IQ2t}c z-q2h?nWnhMn-!sma;_5CgMmgdqgpyXIjTp0w6Bn*aE~dLNr$p7Q<1lI%{Z4R7FkKS z#c>w}1N`W6bLIP*pP|JNc~)RC%SkVE={4v99_PM@9{qh-_M ztc%QPwHy57YUtb3Z_v&~rHi`CV)B^H#@1ozX`eqmuAYw3@p;?EOMTfjoWN0ecZaem;G*MSrxVUtNdz$$H)cBk-DAXd z1iznVxz#c{M3$a zYYf+>5rWPYYK*<3O1pD`jq8lBbwiW|R{lMQ=*mwZfFUwe?;_(z^T#<2eIGx%g1 z8*eSNvD=JRKVZl;yE1BWk7XKa;}rt5>0I6`+a_l6NhsY7DsFvBW_G7ICAKL7ZT>%Q z;s5=)Sr&gD9QzzwU?2hkq5Yry-25~5cc?(QXegrcu*Rn*x3`m+rq>f$&hZgSk=6@{ zf2$|=WfEH*S!9YY2q?QYyou{HN}`j%R}3p@p!fv|ND$JH0q4hG&^53JprYIK!6G6e z+74-=upf4E#Td2D95Z+bqy9cHv;+;(w2jK0HzbqhQF0>_KZ#j%Rt%4cBP zV!_1ls6cUVn%f-`TjSr6LdyPOiyqoW{8W(tT;xuZ8!R2$9Ngc*Fy2j%q;WjQ;PEw% z=<1qBG`4%gc-sqU*&PIz$hRYSOBcyG=6x#mi7S+L_)6$04qTh0Uc^8JEL!f8a{jdp zM%#br==zkXlYb|js8i^ISIRp3$F-%~8(iq+=oR-9&wUor6`ssxFvA<9mn5y%Pkm{` zZfRndwBN=iy;Bmlz2`)@#kIy_Z$E?5x7m@ph_2hgyW+M0U#l!buWhME`K|-|)at2A z2KCfnhTc2BaX48TcYofIEn00xX}Q_GKm@&V)SRE5vw8dQ-(U1Z^+cUla(7;AcYbJk z;=F@(!ts__FZ8*!2l7X@)wy@M@!bdAhd8e~XfU2JSL5i(tf67fVJJA9>Q=HMVlCu> zotPkqBsqwHn%Rg(o_w}Qhwr{RI8@YfB4u8ErTxu|c!w(rPP$OzY+~p9Q^I6*AqF?& zB3!tr-b7&6BLf+%V6QD|rEdE|k`+B$AunRoDZZs>^sz~kbYvMm zb(N5M-?pem-Fs z0{cR_CiY>Y4Yei&!HY@<1p3WS$|1~*1DKa4Uet%1orNIS3gmpD#pAOhH z9b;W+{R^(S)dy4Gk!8)CR^;{E6CEXBhN2Zk1u~G4tkP+)r}mqw7SlY2SdaKGYS*jqJ3o1#)7&4dUT25 zZzv4=t!x|W@{BEw=39zm>ze(Td^B2^VDWPRXz~muqs(a({Al;(!~4|PWK|g@)rl>A z5*D7Kxt7dvAX(uZsQK})8X&BuvS?(UkLhiY%c_{=925cqVx{caF_i@@IKZ_}T$+fm zL`nq77RoE~-D<;F#yWUfXPhrbu8RjzDU_Ekr6#?z!3WmTG%H-s27R0(R*;GBP3Ylv z!zq((mx8n6zMf)u*Mh~9t_lM6C{Pn-F{{QKx*f7hR)_Qn<%#-D%9kHQd5fZ1&DVTO z4G`7qc;~_`SJaZC2?Rp7BRLqTqGz+@ zy$$?N&OTvbu-6W0AjP97^@^ji zfhSYikcSG`5Z}u<=xs>~6Dtj(1XAnmLp%6N>!CuI8-$}C6+uZ1H{fDvm33=rASn%$ zp*BY3ZG5Zl8#8mRu`w48ZE1^$>P@Qq{6vAAG1bamrJ6)&bpRoBIbm(u0;7r**x+a5 zcD@6)$gDFToN4aj-D4n*#L%fGI|I@Wxp|h?``Sr279*|G>Nw!-P5?~fp7f6g54&BD z5M2L>+qw~;RTitYfLGk+#kK2aKPO?hN{p?4poJ!6i{5nFrk9pi5~;{Iv9uuDO z2Q6wO= zTYmBkk^q{fDVt^H;L zcPu*)DJ8V+*?i;Fw*#ITP`@pCC@_x}R5oplpO+HjdAn}Gf^ORJ6S|dVAVCFp=QsCo z4tLShe@Zc!u7IQEfkv~~6%!q-n;!1nFhj96IPWj~8nOWQN`3<_{K%iQp%Kx$&VYC8 zA`Gybo{=pdC!OgpQYH9tAU>AGCT)VN)W2~z+;USyAyN48c%H9HG1N!u+}1s19B7@w zby&qQ)%irxrH+TRxYK$~w}QWbYH?{(kp7|8j`+P=9{~%C=>e02m^Ouczd}sm6@H+ksvC_@ zrIhap$EVvsdVQfkf#2?s@;*+(TBW;Lf5$}tY3r| zbV7wd`%5U}AOvC?2x<#5g}7gB2hX8gJ0u@%;x1WSnvq>65aLdrH8dvKQo-e~9g+ z>u@A{EQC<#l23&(!8^m89JWxU1f!a{Z31Cjl0`|TMd5>&!fLwgYS5rbeOU2^e5>fH zf9Z03;$wM9pcC&f<@G{$UaxjbrKZK3A5fDw#+_I{> zqsSk%tNbIqb}2O%OuC9t6=OaO60z;_eoZ%mCrFOLi%*ul6ZV435_mq$eGOa>Uo{SX zziu(NeBd&!s6bmE-lw4Pz&0q3tM}%@g(o)sbej&SC-Sdn^{@Y)O?HFTmn+`}6}vP* zAVLk=$>J=4+w=BOa;&icIgP}nEUZZM)CbxL(09U6uQO`4Dh%|OHYilmXD<~g5%P$K z3kPDMsHmnJ{A9MCjVGBegE33wW42u4v}-(t%#wp(ZAt^%?nh~suVHx<!8c>9HjY>E3e1MW>Q5zp{-bRmzg*`O%wNJu1z0Oq5_2ALt=md(lxV2_yx-rFgOOX%bD z`qYI>F-yaR2#x6BaTvwgrp%#uJCb~uA@a7Q1g(?nl#kaO<)MDILIz6ZD;dgE`;`Mu zRzMp(zDgN8GEO_F0DFV5#V5*u_{n|lLPE`7t0v}A{J#%}*bM421HRj{F{x)M%FjZI zY;$}I00!6?SxGV{K`Qs$gXY2>%J!D0M1n(2sXiWbS1?fn1ATI}_zb4ax4wRHsd@^b zWb`YO?pbNkaU`kv1*3v#+$xlKp7MK>bk;WhIGheD-F_-z$j{->BO&nzZL@5%Q#jkR zW>v7xSPfX6QJptN^qJCz?PNDQ<8+*#{X02Z^*2}PQ+gZSx^s+*Tei4qCzv#@fp+e` z-M#aomFY!&5RmklXll{bG+kn}X*Un6ZdB8NTe@e9K2}Sz)$9Cb!d+Le3}{w-K<;ll zN|Dze9wAM5K{(5cJ5N||mP3l2n2y%`mDI~0FbT^4fi`sc%msaAee-;ug9;>{*?|3j zk_-OpB1@r?rTlkA6fc_3-a?D9a9}0DPekT|?l{m!=sW~Iq@Utnc2^;cztc1u){UKg zW5IhP{s>hvCfkMZ_TlZhhNx%c$j5uzfjDhpT_yf`7So)%=5BY%KIJ-TKc)F}e2M1; zPUlY>cQh1-VW)Z2XBQWgNThTf8`iMA)&$>$Na2R@W2SO#;|t zyG6lMTxG53q{`L-HmE)#T4@;UOspI1DPEoACqpM|+p;|;)wnQNc#F|i!z;Ef;!On- zq#XEQa32Re#j1Zitf|ZWKxm2G_oNo!THU1!L zd|FUk>~DYmZ}1OijX^vlFW54h=q-1GC)^P(lFBBsSc1x?kuV8Lpwdq@zo0Ps&n9NM zUKlAnp*vlbr)Ctt5(8Y}03^G8X))pQ%OC@knL*t>1B_CS;N_L&E-bx7x};EZM6+Lf zLLqtasrqDKq#@a39~Ik2aj__32BmZ)-{u5g((fkRQi@DT%E%>TK?Nr6%7>1)z$Q4b zhD#CITR;DV%&10SGjmR<*wOw-+YthX*H1Kw?pE<%P;`e3mf&y*T^rA`zc+JVE*rTp zy0B6y!AIjuS+r?`qgVII)-8X~ z{NYXAv}R;nKLmIne2o?b96wcW-9Wi@iJZk+l*k8Y5AOxK1j6(S)5hv`7Z4SRDX+N7@umazU2Pfeu zLXPX|8fAaT8*1x?BYFl^J{@P4mj9wSz=Xw1bKqZOUgpJ0l zRcGlyZ$0@ygc1P#75`yKzJZZu$h@v(g}+3{Skz2v%IJ1&WH{=iXgGpr=o|a)QR=gp zCqEIVrQ2`zeN~ktk6^RNJ1g3jQ^ps+Ec#4hK=AHvbV#mvo=!X`ac)MD{hCTmB+P_~ zQV$EOa$Tz(IEF3lgtlO>q+2uL*gqhn+_(tpRff!HNbRX1bhh(>KXJ%g-`+ND=0C-#)AlA6~O& ze^%!9z$Seck-jz;>Au&ect5b{7$DY11iZ?OITla9cJt#B2G8sjJaPC#iNRk zqLX!A-I#;gL+l*mrmC`Bx;x3LRcp6H=SRqEmz9p0LRAZQiLi{bcbCPS>qxu3+Yk?^ zeK`7$$%UkKUm}THA2&qSmFFu3Xd5Wr{l@c_1HtdzAo;R$;oZSWgjaL3tD@H=^zb@x za=gI4&%{btrp!sWVG0Pk$m0EQh{Xx)y2BO%?1^O~FWBd~NzLn!LSIUnt&AXic?L4g zIOD~Rrk)W(f%T5CJW@`HDdZei^{pyH;}R&pC8nte*V_js70X@8^CW3s;bRv)QpxM@ zG2VHX`0&5vQj;da#U!e<2uk!Z%!}XQ`!4S7w3-A`hLO^oRUwC;YV{N`?|dx}JB3Gh z#D15NjoFz*OxIsXIU=$|N8%ovrg`FGg5D(DJ7#O{t{AMGxt$l4a8)5QC2DxrYwa`0 zAI=DeHk|M*$Ud}zPq(g)=~E=N8lTkpHu+LCd&X`;a_A1Z#AjGlUuGLd_lMawu4R}y zOpz5>`YSlJ3EQ4a) zkuq4LN`wu5S+a*iq@`&Z>_Gm7v;WR8u#GmwW_B!0K5qK=!c`Ax2zj;urGB7CMSJuD zg{nTm>dAa92Eatat5utgo!>_Jpw8~MI-bty037|JlG;Jkt4aC1``DpAB?%ec546qz z4uURo#FACJeSgvFCsAtLV;>O?0coyVC*|ozD3S+Rx|frmIN%-?3_qM@qFFs%7ie0e;l?g7K^evViKz#9%ELok|TZZO25DUaG3vS~S(TMOC@Cw>^%*sV96BV?Z zizs@Tfx6I8&g-CpcvV~1sP)Q4cU?AW?KG*`hzG{yDb5OM-dH9)k(j1gC_<+Du%35hW=Uk zVT)xd=27HO;CKfhd$V4#J-BHes#7jAfhDSzeG!^4XmzflMpQt$)P=AdH3Uzpe>MEK z>vuCzuO+pgfq-((ko&G*aY}kK#LYX?rpN=nDjHN)F*P}1x6`bDSgb!R?LMe#190M( zm3WhgzRGq{uTB$}Q7V~Y6(QgFIrEdPk8&J8otJ_;R(AY|c}DP}DTmQcXdV?rUUzV* zHr8wfRJI@?Tta3hh!0Gv4^H0OAWDzVHSdLzYmRY%U2uFyWL$R07`?uYW8G@2rO{vd zx>&R`OJ>sbRBLkgOe^G$$@>M}Gf<9Qu<0!5@;`))zb$Jc#~#z`pJ7Ag|LUm!s|xs2 zi?ef;GyHr3?I7=<>)>er?_<*cHGEVi{zDHN`Xj)yf`I;oS)m{Vem*Ei5Ma)naHB)e z<0ERKcI>YihflL|R`kj@A#!{Sag_d74^ROi7DaZ;|5Q! z*EsL6wx&_=*7ftLhxDaO=DIMfT7gUVXljqKJhfqhbS1EGBKUhW=D|&)yjbeyh0^$Z zmbH>2rD6roP0LiB+XUTr1CB`8ipyz5qmb`0QLAua7eZTv3sf#ph zayJmfKdFxDf-1H3)b3;oTkP89M|f_NfqIrym`SLM@-fVIzqphI-@=$-a9cfxx-Mkm z9fvA=&`iI$@)Y*_-k^D_JaKR!gkIzK74=lfb>22s{kr4&jQQH`q@Upm(NYa{ z8V5n?l$={RW5YpuQ3!mgoQBl}-I}x{wmjKa%C)hS_Cade@?@@6Q@U}ySem>;E0z<7 zoZNo!0kfyALHIN0dQ0-AZMXI$wftIc8W6ww;`Gkp9KD7ucCV3JoDGBEQ}ee}(xsgE z(6bfc=bv$L*XdHWfG(}3%!6_2Af6LyMdf?97>5}>$C<{7<8+v@&^22?qqMNj8}897M`yK@^J23>SE4t#q3q<|xlKtdCp_k6V9y-B4_5=_|uby#dx^DS-1x-{acOe^ldwY~M z$w&0sgm->!ZdWu7^z@@&XNIJ76E=d=>TI)?V-|@uNRo7-AjTC1L!mQ7qiR3--y?If z%x*S43sF$oA4ElsKBQz4)d-?0mxTBtsVb&i(KP#hj#e zl5@k3sXe^EZPF$N7bF%0qL>2XP?HuFe-X?gF(_ydy307wNp4R_BMu-~yp_R#i;3}A zLxqLlI%$Q?q~-f!2+hlFv7@?B&>~*kb*vqfgLg(y*pY;c0NuiBO>R&LUS+(`uB7Xq zMZo^3Gjzh>P5)^Ohd;K3aBc(3=XC@j-Gq~z(?`PtbW4I@n}E7^`Io(c5ECT?{qB~x z-0}tC68S^tCN)_%$;^`^n*zU>LKr7Hk)on+ke!uj+dh-jU90r7-zGgOd1QBCxhICI zUg|-(28`KN+&!>U>dqnEromCrxn>!ucvv!iXYir)HwRP`9IA6+c=KI1cU(P6hy-8+ znZ(VTlx?1bdJR0@9{RDB4gL+nnBy8|9Se9UAxC@6<=^9(@qxLGZg*%6sr&oUQ|z-N znn$^0Z(tH*9axSbaJl*K$>{GHdg{1M>H9gq-S|1b{r{#H|LL4g5eWPGBtdN7T#{2R3fi1BDQG1(Co)WYHZrV_J(MG~K^SbF90#x$`h zXuU8Lu(d#amRs}V&e`~-x{D)o(t&~du(SM-6rZ27C~cTC_ zVsUuZjm(9L?sqjG6vd}4<`*pdG=d5(9R)DK{SLK;tW;RGG8DNyn5wb^4*eb$+Qij9E0?p-u>$;dx9hz~3jsWf-v+PZ}wy z!ke0ts3>q;k`;24%Emh;WPG8J;c$v8Zd~*p`f6N+{PFCerzHJMSSNBLym7P?f87rn zn;K|Km@d8dlbt(xD#~!yUYG=(^_PF}&|@6;%e=ziFw!Tio>8zMz>+Ywm*3(sNGGdlPdJ#G5hHZrI90qWpUES4>Co~e_iassL%-8ivPWDkauV*; zo?)#ac4fnXqt-py57*jeJg+RKw2T5n_Pk9;DrajX0gU;Q#BD?#jMNZC z0!z#O>4+(7Z0N+yn44;DRH?a^Lcb1DWRi*UHk$U`r%}1$D{?K*D_k4cyZaYGUxdcW zNb_n&rU(6cPT<9y5`IT6rOI?6YRp>B!6$&EAEiQV`CpCsS@y>g!A~MEh zuu}?Hw|9-#wF4*v+UUH2Z+-y0uR)G(H{1yy zPM(xll}1hw)&<3oWVxYECdB+L%YZ|A4)8nQ%i@_}^^iU5&T^(Oc{NP-s|2<6D>YX1 zHV6+n_dSwRSbIhy5tv;_xdF!`Vs$5{%U%Fx^w5ePEi7&(uy>nXgw~J~BH25vhurT7 z^Iq6LW+d-(lAT^ds`NP(A?Ea(P5sQ!_;(!wDxajf09QPFz@tX$Y&@tC z<0Em{&q!{vi47sf%Y_#-S#>^5_CIZwZw+zYF&~sBh9Mt)su9ynVYQ<^S%+gFmu>W0 zh-rg}aXw$5mQ6sbT#(9cK{MbM=XJrNe*1)fK+k1!X?gRJC)4A%Bg8VaLWRDc>0(*} zOgeA2hAd`kAiPtMlo0Wk66BJx2e=t{I12$~){5^0SfjbpD=5m92s5GPt-;bT!tne?FMTCE(-OH)54E5q;WX z&fkD1VwYgOYx*w92?#`5ixsA;d8w!gMTg&143YJW-oX;?;eSh-{sL!`#dSi~z==}V zx|cH$60+$@iz!D{Z48@Wheuq33OA>$gcdxwNwJtnT*f77^ch%`=>4R{63){24<2Np zUd3MmOa}>321F`T%2de3(Lk-`cGmH~`yR2Jiw9cWHd9lMb zo;T6@wXawXURl`A&_>=TE%s#fYehGx$nck^005v(NzOW#Dfy2{^aPmMfPM<7IM@Z; zf+fq62{f}h!G^%GW)h8B^S`nfl;vKIkVQ#?mUU8qd0JWwW>v~Q;I`v{AVFTovLfI< zIqr@^4@acE;!6dhFTp3NPA*p=clXE4{;w=n^eKx`py|R(EE{oBm8wA9U;e{XS1-A9 zC6c{ND!EUduBzAmIppezn7Kc+!)rmZM2KG=-&tMp;*@sG51BrB3Rsi#g8Qf|=nRKE zE_1V}DjDjcIN{fJMk$LFND4G{Fsv6jZAFsfxjpeR&)kTZaDZBM043 zf_q4UwFm?>{>%_&j)W+kXZXeC^xMiQyt#qPWCI#Pe`UW6O_d{Fa^X`I^J>_9hqg+0 zC;_+#e5zvVfNi8Hz|+@b$lp$wR%shvn3g<41dZCl!BgZ1K%UPp^rxfl?*OqbsTd|k zxGugFSI^>h@gvcSxUex^)4e42EME!f2OwPBdD;rsSTOaI6svQIPT7=50y{PB2>fV@ z_dgUHeeZYtKA|1_fcKvt@EX2dDi(i+t^R1I~6!dCg`%=-jPCu!>Ku<`y>8jjG|aoA4OxJ=Ss+8K*%GK45rN*LJld{`PG-9 zhr>A^3pS1-P#gsl8DhTdmIJBl?nI5pTJ8D12D79FN#>8!)$glk$sV}&F%J&_*JsB5 z8HBSgFdK!cAH?R-#X5>44?N~j=<$`p#wNIf6g=*@*Dk4SX)SLUn%X0@t}Kds=^UX1 z5s96P?LDCO>zc*G@7F+x<>u~`g(AAc!WU8%@czt7a-Q@@N=+e)H zo|)2_iXiH14W7k6!hW<;7e?UI_{7@B3<>3zJn{E2N|rv!`bRYfX`O}XD)d1#=WY{n z&CBq~f(>N_#l=8l=wi4GA@?Q}56d%ib+^;GRq2ApW5qRB_jL30jT7th4LoNb>tJw^ z3c@UxcM2b!e33PaHCoa_aawOO0TbU z8&nYPp!gddyUN{w*E2OqY@5Y%P*3M5cM}+^{vxSG+>)#`FIqp!#~(gTGB_C3qm@74 z;Xh3|TfZfMm9LlVn3w68o4v@r&_vI-95ag$1SO#p1)g$h@~LNw>%}w#yu5DmnSw{) zkGc_UQ3v#wGj~%ecsfIhisBK{IF~Yvi1R5!wk94#^>1~gAblGmpl^Wkpso6qj^qU> zbLsfHDeHe3GcF(}KFuGNFenNwaZDqINDhTXaS^*ljsmmm@=BIB3^sH*%7>8HU(Ngz zF;^EXE<$M?c9<+r1a$1WTh2AoCjZ}qkI8e+qv7>9>y_gK^qkjliWRk`iuB%SicYXVXH=bq+!sj-DRW?}m%d+!N zd;MvWlQL$tF)tLx1PK!R(%QKXZ!L*kK|W=mgXxfob%2-5kW%HoKAQIYF!`?vqLvVk(G1fjHXh zGvPz1sy{(jl*iBN0d&uqNhO#bXa{O0uH!XMt?tgkz!YL%$N)fKbS;XJkpj zRZMofKTTC7RYzy#Oial+sU;-R!Lb{14awEVw6@T_w^_T`uqU_gY%bG_uSH{#^sd;w zE+^7kHs3E^vNl{!_m#h#4Q4C0F9n}BYY)77lnlP}kh$bUDZ$_DzPdhvz~k+03vf|= z!r7?sikIGIbK1|JUlEUl;ON??Ay=1_VCknTF%R*9;^%cjp873WEzcn3=-Rlcmn-&v zve~Yu*|-bw6sXf2KPB(YZdXq!__R=mtKoLT<&y{NQ1YvQ+4vy8 zAm0E}n0-0p$ng{}7BSB9ud}w?m~)I!UPJ%l&c#syabi z;Y_3|5g7I(t$>%}%`m!+)eJ4a->6EhsaXn#{a|UJSDq^j3;YD`tR{72XO$R> zN$s)omnG*%_jZ(M^p{JR>jVY?5=R8dZilm>BaQl1qN56F~(6W!3kE-3v5C}KN3DsVIQ#E??JF$pV z?d&vL?x3fCyl&s^GGU+n+E&G`rg>d(_FG|oO*-zygTuJgC2J8(?=#9G^%}i?11$?D zDFSAy2ZGkk9%{1URrbQfr^T#;mT0%nwn5JFSTmF|UO> zlQr)et(ZO0Xie83w=uPcgk!fBKHG8JwxPZQCA1cJhPV(90p!uGM{ zZX?l{KjG?o;Du9EnGEj|174F-y|AWGg zmaZTKnc7GC@UBV!VPPLN^Rs9K3*e`Fk`pdyHh)*(P%FK_n#u^xX53-SEllrgywR3V zru5F25mO}Nmgtz45TYonpE0;!3lo5`lB6)%sf^L8Ck;yr_a4Feo_HJY!ung&<9}<| zIb2|7Z?TY{8g^%UP5q71Cn$u*Q98tY={QQTH$ z;Fv(;RuHPRE_TvD{x`%*17|z~XnkR~(Qa|sFB5Nh z=&b{SzvGr&Nx6kh#|IlRPuHG9m(k4rf_^o0pbAQV)gvb+Co*!T;r8d;PnEofktcVoF7}%^K-j={j%G0d9?J zhM7J%jVNYB@3La+El}vW0?_*$D=R7-pX$BTv zGLc`U@L`qgQJHXA{0Ft3k?)VcD$ER1MC^@E=b;41rl)@QE>onEUUOc8?%SY`tnN(; zIF~5BUhxY?4K+Nq4AwDu^67dkZo!#?pa*l|@`o*SGEM|eTosmzVpm9z+>t#^V;M3$ zha8R_E@w}QhR9zCd)q_EE_f_PUpuRSs%9h-k%iRNGbge+6Vibu?>In0pkvw--gFc} zWGwOOKB~ygZl9*7Aj<_0?I5e4ycGZEuki}g(>xsd(UCwdrIv(c@(+;0Cx06GG;9E{ zIb6xXzt42&zeCtWj!lFOfldGdiRaH69Xmbvc$H;D&Yz<$O@AG1uOv8`j;~>9ewP0T ztC@ep>IpLFWkCNb^b7=j8FFOv0;4 zoR3;`Dp|m-C$N5$ADUBi==d|OHb6DN(dC(BDK4CTYH6l?H}l|HcK?=Ef2ou94H3Wb z|7!US2OJZ8ePICCrleq9&1~13r$8)dhM8^dr+|+8wt!Qxr1@!7f2LK(K=Ye48_cDk z@Y!3W-^2XjD%vz18&uFsC`E?NF#pbA%fOw|{$;Q^fRUBW|4OUu1WGh7-u5lJkuWIL z|8%g2i2mhZyZ_6<{)jDc7N38SFj4+Zo2$>SEogiUbqk+7a-R~rAjX@M@$#_znO47} z-*H({bKiZaDr^G4>jErRdG2rmYRjul(3k*Q~hiANE9WC z<&@;y{c4`(v@R)|J@eEi`tUMy>emU-n0MHt`FL^o)oJ@A=2mI*sbxAsER$ytuR>h) zbA-p!lPZ2ot?@6(Bpz>p#-(?WM~fJA;tgp2(5&zl2r&&)WzYKEHDM&quY2&$Y7ugSsN8>#AU< zt8Z#$EMsb8Xklt)C}3x(>tHBmWn}%|?r~LIJ-#m>W;GC3Q&;N`^#G7GNb!LvoPs@0 zKSOZh1sjnucfnUn#C(Dp>YZ4$DihWdEo0@x$qVlSaQW1aJkiyV)CLNvJ80eJUOUq_ z9-pO;$1jBAlwa$ADg5!udVKi1P{4V4-j2zAy*Y#n;iL5=4Wb46$kOd;;|+qREwIx7 zI}KL-Eyv}D4>Ek53wJ1Mj0<5XYpe@nXj6;}WoT2Z3umZvj05&c7A9)5hhVmtC5#b>-&f0*F2x3}xKJfi#$a%XbQg9b^WVJ~5&aj|)O`7cf6 z(xJ$2NsSVwHPlj37i1iqG{z;(^dyyx;YP^CVin0N#PaZk=8yLlAO>IAN=}m%S1`7= z^0tnkY^7jI?HKB5^+jK2=jP%To7hKvX)_`uOzctahh{^`#nMrVQLs&MfP;d>6lM(E ztNuK@%@u?-fNoy|Sw*pLlzCMWY#Yj7reIkx;jr|?77%Q4eOEQ0?6=^f1VdP82Y1s7 z@_|+X{=ZXFdbI-lAGSiujllnmF9Ab-Q&AMem8g{uL%}UZ7b^-#iOQ-bUlYTJrlrKd zh^>~Fi3u?66@*DFrIdWbr)R~$lAwfk1*kqdh@~FrINR7O!l|$mVhV&M#3<;iL|}?h z_w_`D(T&Kz7?1?2D}7&!@M>{6mY{KMdH@A;6J{+CG=VuhAOihSz%DB`hZ#C4g`vh_ zRKPsa`%pYs0O+gtZTm4!y#J)OCb+J$8X7+r#^!%zIkQrT9b9?sV->?3y)33}w5`WjX&nSEqnD@ZL6hJBat5Yw^f z%E6MP6-!#jU=7<9YDyop>ZRCX%uu|`w5j=V!j)JwuOp0#YzN~!!-ush(dD|m!$p7v z?^ZdIULoHv$q*@$SJZ2=c(LGkT+Ne;8Jg~=Rt^2K&MF? zr}gN|VWKWVMYbv6;Nw;q%?99EKhC~aOrAuIM%d}N%neisd5zK`IPAhCx@_ z(P`sv=k~=b+HEMd=)y@Q6>w)|h@S?9IbZ*YuQ4CoHH`CbiBpi+KwG%(_!Xvpl0bQU zLz{Av0Q<7QH*u&PsutD}<$*r& z< z6_JOgk99XI;0f)%6S%{9rTL{(q~o#=9{dUa-V2-;ZHx3u{)^XFUi2;Wf@=w+uDlge z{D}6j3?GHCRA@T5Zw9v+Ai>*^@Lfd@tVC7^+fDNyQNe##)NubUsD)^zguJJ+y$7-d zhR$h+&TWRwZHCUV?>I!UZJ*&cEBVl~k#+NKWn-vQZV*&hif3WKad0`s1bc5sYU^4Y zZf|1WDI;sKtL)27>?r4oK~*Fmg4iGLw?QDUh7Ql<`uC||wEkhzK^t={(-e52tBaVf z)4ZIyh2&l(*2-@!NRmH?hSSc9jZ1Q6WGM?Y#N1JH#Ds9?me;&=FW02jG-fW9_*SVE z?X0`TRaqthXed5Y$aE#IkiprXhJ*JSFPSJmEYDCZQwPqKwa(LjYz;$Z#%_qmIlmQg z4=0VjHYq2J=^<%E0hKN~>t?~zywJ+#s}kp1J-2X6=?1Cb^Utucj+L?mcSDyCtGXgQ zSi~DV#gHyk4d-EC7Kq(s=NuFFJ}XG|4;WWpH+WYq)vHd|yCAHs`#6q#wfG$0w1KVw z5R2Xqsb-{o8V{_mc=I}Kd3EKK-_|foWG8=~n_`#x@+5pot876@Gh^Z7<>8%BgKg7= z_gPu}_KFZr*T-_eEE8P<5}Apk0km{~RlQ>W!pfgR@_AJesP?}|d#B*s!tYBrw(ab2 z$F^q>t@}on(v%rJVPrJ)Mogv zIaFXdJKX!U=HDoV=zL}<-FRDP^D$G~UN(PiUECXxU2tlv)^q@5K-n?p%RfAyrit#A zOVPPMvzM_3v-VH5qk1{(Bse@VM*d{*4lhBk{Dh{APto>__<>K{gcHb>MG2X<L`Dwfn(%x@IxRG#%3oo3-tDqeTt;$ z%Ct?F*O?XACWi!6uhszCJlJ@R+JED(e<|z}FEm1;qsPh8kHU1u@mc5P*N-5s-kVCA zU~kpU4P`OtCWN{c#Txs?q-VrnH#}Og-w=mrX@<+p3x>dNNl|Y(*$!%GhFdf>PJ+sr zk@Kucc1DGC@`e>%{tWC!?YT43*w8gP z;4ThEV_{S~d>Ms>&Je@4G1GR37!E{TRckD$n(W7!j-XJ_HO;l573_AH z>~9r4^+Wqmfp-9h!aT^@H7@K0(X(v*aW~cL#vbxI5PFpY+Xc;L)qv^eKl%TU!P$Sh zF@NabYT_TB47czPdG!B%b@2bujr~8PGaYCjmE~oA^Tdoa8NEcwK_d+i3M;JnaXPR$ zQn2(t(>6#W2hw*aVKQb1f5D)yVXfF(Xz9w^)vMcooiapeSEyd}u9mEn=s!AFY1gzA zK4rh}&}4YhqlOK}JEytdd}n*lbe!xskLAgKIeZHPG2rf|)b}F*(Li29%!o#w`VnG1E$%_#qs*N>*f3dIV8Z#$Q9Gv>zwN7(>Ra32>4VIcx@v zQDgc%CgCr znT_GX6I`v0&&tw4s zcm@Bai;(lM5~x$5KU7w_Q|BF~wsw~G)uoLMyf-fj>Pz$$C3WDp zIdn!%QD!tQ-rEBsP$MO*Ef>j;QW>jP)Kz$Jm6>9bWi3P|YOkFtAsNSL?7Yd)W zQsLoVFxI{~QDw5XT^%*7J*L*G0 z_zp=xu~GVG%E6U=gBOqBDfycxWc9a3cVSFq8=7kTd$;w&V1^fHO23veEs1(Y@KmfS zm9_hO6dzqlOp@hDb{iqIAl@Yd4ho{N8^ab9-ylJ*ga_h%g7$Guh>95gPpFZs~(k8+zDKg~K(`=C^W^q0)aw)s- zM8Ud+lWS7yyV6YNkI6&GF{DUO%SuMZRJM4gQ`}!^4#Q{CH&mAjAXdfB9S2tjzf9v} zNw!Dg9Xz|1;E%Kw`SaAzrJUbSqGWkpBR6W`JfJMEC9V>nSn8U|r!#UF_EiYmX3Y_D zGRV6+&K!kLrD=a(RhLw5EEl*ujdnaf93;AazE{GE88e$gDA{%bk-?6=NL4XL- znA77b)h97VN>ezVumewy z!P&@_;)jEYcf@V#)fp8asS!ShQpd`hQlb3r^Cd{+)A`l_;lU;}0XT)KlGgq91~xix z^nA3TOS-nDn|T!B8YO%XiQ!*z(4Osa>K0C~&t)f)&-h8$UPPkyBsmjLSfyB} zc)%gWQrnTREv(*mQnZwPOUq|V2vNroz8sq_mMvaz4#OOIDV-zFKJT9auqB)qI~Oke zt$vIe+a{x#*o^ivi`iop-~HGKh7Rux%^~=dq$x^%bfo03I{TMn!{%7Y7WB`Yz012B zhQCLl(typ!kn7gg(UU3r>1(kV!UyzA&JVPaJ$gfl{e9bzQZU}=@mCBxbXbjGn|N6C zUKtegv%V3we`sIozRKFKLwkoNxU~L9rfx*SaR8AI>Cl+Yd&oo?01=z-aN`6J3a9UM zMg39+r$5wZ@&fTiJJiN=$S>1-Sa&nTr=_1LGt8<<@e`>Lo^kTbqyxDs?SY-*!O8w4 zNuaVYD-O!nK7kdNsL z!`?9ZD#;OdM~d|$2QIi?aB$OPOKun7)-62BeM^VU=Jbq!eKVTFls&4pG4jTnW90ym z#O&G6%hVnDJn4Y(oITA;biGbH#JS~6_Z(6YKJ7}tetig$aphyTH4D$QOCGixj5zK9 zJlpvv3-LghiBINyNF4CYbR9~2iSWLLD)GU;SA_DVI6AgR0w!KEi&?C!a#p7tZ0)NX z=!465Er5$IKW;Hnmd-OhOg?1lz_|_l*Nw{44U+%&W^+``>|PTS-xvsQJpK3!abzGp zqbIh$AeMDdFaza?U9m>08BdwRIXwGR950T_;pqQWgtg={i!h6#Cq=-q~ z2_k>h&KE@LTUOZBX^wZdtUy6`8u{Gwo2r*_^TA@VPJX-00|;184{+bGe4Rbf?Bz9u z$GB3iNr^+p$xP{#gXej@AHKpc_Dx4KHlduMi*!@C$Ro8aD`Oa4YZY7bo)tsxK-(i1 zmL2wU`c?(j_S$s8I1gts;)8eUcXiSVE*p)uMMf2Cs>Y4WV>pVRfIP5syK`F zvO2J6Jf1&7f_QCP2Xk!GZz`4NZ$rd>OE+|BPrHvlfj@A+WBmZ_O(&cfsFISGVco{# z_nJ1>X76H8zI|BbPi+1h``F_O~HPiFX=>1RIw+d9S{E zEjMbF)D=k=OvMY$;1pAcbolC5lkIP2m%jM)fPO;Bk8Nr}&RxrDiQ%MI#?r*&iV6K0 zOU{x-<7X^;R5a%N*s`3^e?78rgIsok-WB9<5xFRco&_8lz?cXCAqDLP7|qB4mE$c< z#d>*W>gCp^nV%kKczLGk<<_K~oE~?0dFJZn)}>`V+=29TDpQlw6j zn&3Pe-!|yTs>FEVROC((;0%T*2+&usWugrX8=&7e0#fV(qbnhEyix~PzrEpBn%|R# zOp7qT3ROF6BB%|F^g=RiWGMcNqaeuw@+6ImI1OX@Avx`=~n8M|ji`{%(cX)1spAWPxbjO#ph4vg*ezZ=aVL%oc&x zmxlL1MQ6_fo{S8zFNOG^MQ`h`84c)&jJt1zHsFgjLYx=$7ay@TQ~F0H^|~`&yoKP7 z1^Vx|)a%!Had%Qw*WY3nQmNPdp9jG1xS$w6=d+))!de825@m2X?3j{?kEPB9~8&Umws!=~zLDNHS7KL>YMC z+WU&gZ*{@^nM86318AVbHp;_eF2iHfNQejnL=X|2r4jO{5&lfV**HPM@JP_~Id_2%S{b-+-_}hUK4Sw7_#)Abck-`a-;pVa&7LFS- z!i$LUd#_giF3cNFgr0Gr$5SQei|~rS42YKy8bF0E&{Pr1f2N; zJb6a1lBA%O;*^>B3?dG%lBPABAZ(R2A%-Nb5~RO{YHCns$_e;EoGNR=4DKb)GICJ= z6cccRj4e$3p#IgxBstR^q10s<3~7>1*-#8}G9a7`qGdytc)%s^`=m$18X%_*q3A$S zJ0P>{HyG)j-0N6G)>efg)WaVvSrm-BRcN@viWb8Yhg%e!-m>UEcC_ZWmCG(&7uF?~ zU;V0^MQPDJ%2_YOAf|7O-tY}cBeC)>FTM5s^Y0%lEdgcl)9*xG8#yb{x8^VPy;-k4 z*Mwg*76ZscS1+YLhRRqN!)Fr3gc_i)KQPK%@Of9vIoEfipsBFcB5|7v4N6abb2%In z&huB)QBMifX)h8k>&!VAqC1){Hrs;v<`kBz#?xjgqfskDGN&?8YLC_=C(4sQA+p+| zR(}A+r@-_HRGjW0fox6t#sgL( z$2sB|AG|;OsMLU*Chl8U&KHA@Ff4X=A!#|+ z5RO3$$FVP-b}TO{EH83d;&ATCGO2w|oEE+AK&_MzB!Z!WxNdQc==g&8F3Y;;DaT-O zj*Sv9g{ih8sn!l_R|mUreeo6o!lH!})v#%AAx%$sbRVuTY__AQWu$>YCaIrtT~oZR zCoM!i{}fKf6~spu^(Ew+Q;eTiymuQ^qFINYVxuI|$o*rtN8%_w6a2mEei9B)bn&-N zljSCAXQMPMmmCjpxcT#mFZi;i5{Dk<#A8J<_Pdm#C5$2-yU+*bdv3d3M_(40Xen|z zIYbaa*taknIHi@!KjAEu_m^y&DAsWp&=7wmVqpy9_$ z6X3@2g-r1SC1Ksl+z?n}gUSEs;g@m{VWiOkD90F1lPN0}{Y5a^)EnM_fo5#j)H#%} z`9UKei|$Gj#FP+=-bz~OlogZS${1zpBf8dusp|REYF=j4KS)(O0S9CJ6n616GE{ zztA*k9R84jBD822c8);Y(`qW1PC%rMAh=>+t7$qJ#*!g+(jYXj%+y9vxVMLwO7%B8s5J_Roh$C~rmg@AMj(8Vk0PBgQ zzbV7zIVW#d#xOH%t=-HC8Ce;3I^u=OeS)Ke^PRqOnSP3jQnlV}7K(B)x3mqXUD*Hg zkXvmb@78P(5x6=n}qmtbSTbYeb1h@$@osm)O%vMvZb=VNm zyhs+&Jo$@a8oXHGYvIDxOfM@J{#3DkHja^^RyIUOMV%9er)cTUWunMAe>RSuvdl=| z15}FClYQ4jP4P<)8WNb3Kt~k&dszWuwcqD%38p<&Y43t!sFPr&AHE*LE<|~c9E%h* zPtbWb(AEKYOUiS}Hl#5}Y)6jQyGWQ;IJFZ?pPO{Qvp~xNq7sO4;rdq^I z?Y7Ci!&3IiACYGw{s0r=zGw{w#Cy@RfX6{yvRfrqfh%`5%1c1P;A)mbd5%S~j9&KcY2)|A9@yD;vUvcy&hFO4N_EP87} zY9>}Yt(4lBoRgZ`bIDC>tE382pu8>I_c*G1k(HLVr5y^&#%ldRSu;3~UOm1-CVMh+~G`&LBmK3pWGkFmB9l2{3L< zZ?U4E8$9@<5$j)mMI$!+=SD;EVqtJ}_F@e8z%k1+&=VgDAk8(pr9k8-82k;8#9;YA zLZA8$a$B0hHkYkuPr*KM3oBe&rkkMmjD&;df%PboE8>+*@ zNIb`w$;dpT7+AA^2D_1n!OGlm8i_8>uc)ChSCg;}9k{1KSCTYgsT7adc;CrdHjT@& z$etr@B_`Cw#N+lmc;+=mwx0|LnAI$^lhw?kwPx{y7q_fq>X>*gr+pW~VIqNV34MisK4QR4gcYPpi?>-||_@)uKw{Clag%CXFE6<}g1LmGj7$ zoC47S)HNSUT+4$Q`-FR|wT}KAOxSRi74$5O{>5OG z-dteRS49#t2`zR{5oZ>Nn{TU2Y*J@#=4xUz`qj$m&U&$8UcJ&cG5!ILjV027J$r0F>+Nc}Hy72=hHC3NHZ~6mBD!=g_ z!rRm|jgRzjOu=G^l^o98awKKOP!?l-MMnrkiWlfMe$xa+0JEKc?H=aVS7J?k{l0#~ zw0_exa;s;kt)5{P3r}Qvl;l>~0lSChUac8#Z&>@-BP`rX2NHN+3D(+CS;d~aidr+k z7fRwwwS)&e`uzFlpmLy+tDl0iuFcGSFH}eRC@)Sa(dL`GSz@5_n<-B z)iuj{l6sN0vR&kHW)?oI#jdGSiFiw?g4Dr&yIY_A@*#tuCEiGn)~}YiM=FPJv8cPi zAEk6nH#}4F0`2+YoFF214Q=v=>!H8V@H@AXJV-DOL=?^a|& zUsQ=s0e@BHRjop^8MhxeH(N4Ua5O^m^a3L)N zg9G+}R)60w(l09DaHPE&(|$WCRdJ{YZ*fPNS|uD3+Auw$Q#mVd;^4Mt$oI{6?l*MA zmp;R$m#z?g=+L&beeWOCaiXWdQ(RI({$)~RmbWwoSu+(%{70OOK@#%zK{3hhFCEptN%7BeAdGb@KP^2Y)>)(d{onKL;mGdzAQlGwjV@|KdoW7ey1dceF)3!hE=Iqu zk<54l2gg5rCAxJK$Z-^%?usnSKO9JG_av}&7M-3H(bS8{*FIC$#pbf_%mj1XGZ(JT z*o^S0rvJe1m7kY_JbWj(+kn7(8ExmCpEekoXYN)j9B(tuT(WlXoT}e};5!?(<3u_4 zQgEXc-s>)WT2g*^lA*m)aI^Wx9K&m@!pUKaoj|n0$>R5ewzYIPze;Gt6AA;ReBoY! zk2dHe8hRR_zN%aKjx2YTq&sRH)}oJsL;-w1-sR3TvNMQ%;%T})X~UL#D zmuPc!UwiB8zj&Gc(-^pC3|V_30|Ak-0|EUMkiC;Ry^Xt-xedLWtBtjx9le_M|85~E z_oKhIF?4pW(S-lmN2c(HoBSh7g3Jg3f?xz^4<6XAHCc7f*-xx^b!o_PgCJv{)u4s5ji4G^K~gC zKuXl_7z8U_pA5!2A1H_N1{o=e9qoichk;IGf`O_jW287SI9(Ve${IaEV_K%LXOv~bLUoBC(Mq#+uU7ep^|8Vc1x2 zEzJMWFx1&0GPyrrWVqo=!Gd*S=?xqU9WvE*KFev6832D178jDQ7AiUA8DH6+MvRL7RuN2}|!DDl_5o zy^3^5hei!yrjYnm-Nr2RbBQ=#Hib}p@8E-SiA;`VLoC7JIJm^+LWmyrw=;}PKT_f6t%052i%{annkWQz zu{g(0arujnj3YZomvnY2S_hs;iB!?cD(a}S`vn}ixoLs7%A6wZDur+eRg`ujZZi^1 z+~au6MTd+r<@ymizHeE-`J6C1sIR3(;)F$|eHqm)5D|4 zDk1!iTzWn)rZErUyY5%0fXp%r?J)|0g1eL;;ZlaBQ0$4%h~IO4xd)}q`}O_&*tFti zB}S?$HJg%mNP`S>3rPZXfLOD|c9080`@4TWrXIpDbUK(_PF<-W!x(*VIT$^p3Wl#3 z+}@|f4B1ygi|Zr3S`!?1Ia4%Xe~)CHWKxYzT?t61xvTUwcIAHTMi9Cv24r2KFJjEI zsoZ>@W6w+nrsK4C*)Ym;Q3TrM6CcDgl-L!D6YehRceP{NE)67hFOa_3<+I5ey_ zB{}^G=Z+LN}aTFL7#13Z&aS&~YlNhz-_=~|$ zVvHqT9+nw`j4gf(fvp74#m+TN2ukY^BmVm@c7Zg;P-hg(F3k`ujI3L66u(^=A{KIM zI4nj1UQBbVAJi_@kbQ?(IN951>z?xZwHeOwS`zT%&rE~c?C>OEw;!4vf6-(@+ClL4 zxSs*^BCl@0a6_tLTYVVgr;5DKTFC4DOV)!D1z);?%% zEu+*aVDZPn(T=b*)n5m?#3eaG&Jd5g_!vg(*JdwXTG zugv?Zmt&sAD4wSx-qD`Q7_*5V;m*c=kksP3PHlGCyLxzW9h|v-5-^7S=3B>*w&+bz zpgFx*F+%&Z_;<3K4u|i@LWid;`06W41?)$>k#nk7;C+bo0HeZ7MV!cn4H_|Z|! zU+uX*UmST~xd5)fz=0yccY}B%KPPbQpa^<9WU*Q-;>sM?jl7YKCccv7C`l-Wdfvqs zeCqW;D#rEb00${iI9m(T4;k^^{tZ#WBP6c(n#ucNJl>9QkW6iC5>WkGBzZM8?t+mK zx($YG@$?jjHMIY4jd`rY5CC}g!u!mi@0flMuOkHdn4_DR8W?EdQ zU%;-1tq|nc*_>@+rj5ck8t6>Ql#M0IVY}l1Du9Uiz(T^NPN->*BSw08A2mW*74 z$2y4{!(^4rSQLY6I!MumdmLN11yq8!G6dEhspV&tqD1LwuKNZj_hg+#?Tf$){+&z6kI9%WKVA(#KV-O?|E@muaq zU69v(zORR|Jqu>iq8eCNe-@NS6APe6^|Z-YJ#L;(1Lr}A4tWW5?9*=!3%VmeBKT6s zx;Ok0d|xvd5MJTYAGcrZ6Gk5wzmM!Oj#JN+x37;5;gcREeu>q2kL~B~0~f!6pH=x` zeD7q~FJ9sC7onbu5a1mOOjvdR&7Jc5r0PSe&?30sR%GcZ&`pJ0S?i{;Snz z_Xy-KfjPaWB$}Vt=$7{jX$QhKB@N4|)XsT@WO^#%XK7?j@-6K9_(kzV%6VMe#I)3a zr}21?skB`hc!xLmn>xIcHPkjBI7B}yAtd9~y4&~=^m%YKWOh^hYZ~JAgLFyr zS8jvoM`z#*Jom7sWV&tO3yJn{A5z4-ExXSQR#vaS9Ijs;KxnLH?##2p0PaoRW7k&nSj3WMqB6vZ4 z*(1?_@DEFg2zm;@+Wk|oE%4>2QNApo?wF=f8CW}4A2E${+RiUagti(t*WeVjLGqxA z(o)1yB(p?Nlo|H{=9?0_ASrCgKW)5K`6{`cp}f}24bGQ@LkuH~P32fP(W#1^sS1Ew zrtl6?8Qu2+W9)pz6FC2qR)8#Kr`k)_6bfQr%3Q&xi&V&%RcaUN`yEApU(JGP)LT2u*O8~jg7_-bNy z=zw-H^jdoS?_yqH$*T`$)=K(M^h|dUd|sHAp-!F^aLZ&r8~r#l~u#P z7OnzQ+Zc+2cWAOjXu#bEyk!`Z4P#D~7HD(KObWp^^G7tq2h~D{$ZqC{_PLoB(&gV< zpia)8trO}nd5?vSQd?k3lO(yyJ^5q0f;Ce)D@3JbS8r0AF8w?uE%MYf3R_ViWjisr z`ai-mYs%{*{4)Rj#k!{KFO-qoHy6TF%Y-58YTMTJ$5L6>{@uY{;I;aO zAnjblRd%`dw9}>Jqp+mKP`Ag|h)>S_Vn2au=#5{su=>e5GyGHp4`PEoCvG10%$JV4YIN@ND9sM9c}9g*Kk8=@tIYnXII zWN|803|KV`x3doy7Bnc8IG*P-h_io^Dx0u~jnoLt+a$j!u|LbO-k3*NF1bKkN8zN= zY80N2bxv8VWFa2Wx{dPn4D;oJt%i&}9B>JV}l`dJrF zfQamd5NadYqKkOL6=o^ba}u(fNGZx3I6 zs1cl~3ZBO0 z^V(FClFV(MgOX#Br({iXhQdaF%DbVO9iub@;b zC@Cr}OZcDYh#;Pnxn>Jm{6R2Gwk{XK@-z1{c8l2xuQ;c-Li@K`!pf_h2{s`K5yYeH zt(=^U_pI-&4(Fu4@7F_lptk)H#`sVS8Y9X$IUllVCs;lqIyo~kIZ%D+q_lsymc1!v zs$+)|Z)x|kPAjPE_c<)`C9irzJs54HR1s0=a@y9JoOkc_ec}3R;-gF#2ufCzsjE zduq8|r9Ozl~`IZaaYcn64WkBsxwHkf6Yq# za_nu|2a875X@raW-OE!#^wsl%_9A`DkAPb|O3cSi9OJL_sa_bt_ z)k7(E*=ohldoML!T(T4O%{^G2SrRhPWa257x(`t`Ntc7mmLc6>59K$FOsxO3)C1tR z{dM^EaKPraFXcXw?5gK-ht`VJ}&3Ixl;^y>D4Zd9?7mW zWZ883SNl!ZKd-&$$*u6nOK9*;)zD&pB{WZi*F+v~p`&ZiF?5Iq6dIf!9eWm3k6z_U z6r&<=>h5tg*~#tH><&w3Z0oQ-oB`_VqA{tIq=NxDtE0fwVTb^$JV|Q>i4=7`2Q#yv>pzgct^U z2;`)O;wZI}AQ_u4Tm1}n*e}Q`HRN%G44p1FJc?mEBnJ~e6SCu?W=GM;N-AhW2|{6t z^tn#w`8%^z^pDV^!Dw+6})_i_l`JHBfED&P6_B4U5FR%w1SBM-;F z6xl8PFW9F}Ug*1OBW;w&$jhCA zu$GmqA~oe!CFRT2T1sJYvnH1&kVCTFpB8tGA-H|DAc9JXed^$>Qv|7sMlq8X6k1)pl_$6_eXe=4DU%44cq=&c6}==+JhOL)Le(RB70RAc{}kt#qq}0nFF7ORmFF;4 zPDYDZy#ANai~rbn_GQWg2w{ML{C?Kxg8z5_*Z)p-{SN}C*O=Cr`fyF|l2q@21Gb|2 zPegIS(wZYNbsVj@ql&cKL5R`l-CBkQ4(Gynq_BFw>5b5on#I%xh^-}tg2-ZO3k~?B z+!R76;m0vOKgZVlKTDoOaYtt`F7f9c&--il=l7lNhdgtApnx6#A~FUq#}3J$H}776 zH_xyBcPob{Kd%p<1Vofqqy$9Nj?Sk(srGBF~GXT-R8q)*KFSfo#o z1Ha^vA#vVaf7w1VGC_%Zyk|Z-pK#Oc!lg6m=RLs-h)=@!;lm490=?(n6aYPwR}xEp z{?d|IzXWr3ZUbDXgJO^jr%&vrSFR}=@;ZQ8eH|;Ys^X{4UG^#+w{UjY| z#=uGnIiIfDYSMv?v!dAe&ICk#B}Cbglaahk)$3oh+-Gvs#tm%Q0`u4K`VTYb+lP&j z+WMuy?6^4S6j)aJtg*I~1kt$HUp^TxTZ1s|!La{)~A2L!?>naLBF)O_2Y zFG)x&D=g0iTGmuuwBKS5?7kY=giz(pzp!*=s-hm<0o_q3`KmP4TXR#$NNs{n?%36) zJOI8?C_##g391C^DJW1Ff!O(11C{Tjyx=I)Q=BbPY=Lru8m|bY=!tWvfxCSCa*6C2 zr^@kU0SrL}cg5CZRdslW$8-t{0_PR}#a_O)0N%db)y)-0F`?oWn4#Qop@SVXz|`J~ z1&n5Y`dvPe_ryzWR1 zS2vJceA^7}cO)>nS%%XnRw) zb~=tCLxl~$Ozk4Fah)h7uKz+{S2TCXxI!i<=G;ms=+i+U;2Or}&z`4;U{F?pbdddE z8z~3a7%2y+CA7=96oY(IlgLkG7;q~+YADu}siXsJcPtVH)IJ{3FYI7w=+UzgN#fnG z8wr3e${nwVV#tj&0Q98*$Ty{|8;n0FZJd+hVGMwp`Kc1rCX@z6FAZS!dUk#Z1?vmZ zmzPy{Y2WUfkjU(3mk$bmTkv>v=$pP#8tvu)eR@JHV&rpZ_4C8=}9OVP}i(()T z>R=Xt3H=3w4E-f`#QM?&bTPGOP*C$nWp%DVfiSl?5e}_Z^0*d51MrB7daEqu!`AK+ zxnbFd`(F2XEG42iu!QGk$)3tv_3jlryy%Hc>R>7r0HFmlDQaCUn~x$Zy@FMqyjkwv zQa9@A=WbnE!gPr{^-ziQHD20k&1&@!q{cxhTH~P7 z*+V1@{(S1d;s8az48Jd@>W{bbl6aXbU;7TUl?khIW*axmLCY1?+M^YNa(%p0m@NfDTEFNpbU|h!xP;t%~8)kCzh+qN34Jp4?v~ZBL#C@ z2_$yJ#S8HRV&et_EeDx~Kpq7a=BOhg2Sy-qRchK(f*2Sn_NWaq&IaS8PY>FHGZ`cv zHio%P7vgym0<6FeNx%x7%J$fc6X!GH4Oo)fj}q>i-3%n`sJ=TXS!*C8Sy$|I~r3zkuMLe;Y(w)8G6 zb!?+ZTb~azY=fsVBr06aY42b0bar)g7TU||BAiPX+%#KIX9ABZZ>h{!n$S?TQ6j=m zC3kgIJAtxIVh>Q7zh#=9-t^Kf#!93J>vzHV-geIK0yDW^;zwMMHcYQZ`SJd{7#BQb z)K6lDl;vo5s=rPb-Ql9q4e(AlDftj8b-!0`Apu{*WXl5w}mz}cDZXNwgHT&j!f zRTJ%+&emKH%PEm2St||YXsJFFmz|KNF&XWtVXxSK3Kwr=?(x^iC77}q_<&=GnpGyF z@ZiZX z>mL14X($FZy$W;sFM2_03#)+#DxN*PeQGsH8!Q_>r}>0$5hChfbH;l(r;xGtv@l{Y z1rM;&k7PUOF&n%p!Fakpv+@ou$|0%+i2dg5$T+2{BR;F=iK;oSjbU?hZkkrzz__B9 zUdyC<1Y&n29}TrK{6>2yAEV>s>W^OQuNuaLLGlIK7m-wUT$q+{=!6_j)i?~WEft(U z>h;S#Ruffb2wJh8rr8`|{8Rhh^Jd}5nJc$XY`8xdSt^;K92Sx#DvV-Hf?~xuRWwrA zN>+*Q=6try@>slOl-l7&2ePzq*u{Gkm;7L-`gOXVFI6-;cqJYk$wk=F-cgX`BtzSV zp*MF$FZB9SgW6(XmIeVL4Df3-Dl=5y0ZT_=R7A9CC^Z8r3lK ztD?xL-7LIEv$)PT6dUvn`hiwaPDpzSPVrE&=!q(#p(<2LZWZGqdV+I|Q-8e06iY^&Lc(Qd5WsCI|vyuljHt|~qRZgJehJeN^%#-4BM!=^l4 z>wm)8@kdeJpG_SO>ra?mUhp{EZ<%cFIoI2_PmGFIPt1%@5);_>2Si(_3+W!qhrL+J z@%brR_cq+R9j=GPx-snuc`X2fmoA3g2*ZF%oqAL5oo)N@E{(LVtb$%xdKs2p$ekc# z*xI&(Z}Nvv{0NudPFKUXOcMW9#QC4@Q%*2wun!yv2!Qmz3>NqwS`B3jLlaXcaVL9M zhyOLrrzG{=8C4Z+Y}PiB9DXwuBT9glR)Y~fJ|&H!CX`PpGZ8|@8eQZzaVM-KYr8#O zNI~E>5Ya5#aTMDeFUN7z5f2hy0P;tGK)6R(lIz?Q!ZNX;Zsv5o?fvZYI@J=%?@WTngg{@=$HfB2DqWY#~%!fGHEh3nSf<*GI27cja!(|g&XqC zeQ%rnlFt#lGl63w&j87AAJ;Ik>6|4x4EuWYW9dZ-qc&{+Z=9Wjb7x<-=F>4dwr$%T z+qP}nwr$(Cla6hEla6htC%?Kgb?2)XhoQcF+*HV z4+9%3gD;13a?gCC*|F01&{0+mUE3!Y`)tZP6upc#cR6}%iIk7JIw|!OO_XK;H-Y77 zO6efO7d+-$!NnN_+d8V4_6n>9H?15N6^r3|d=$LA%RWTFVK@WrZ7s|Z2Yd#4@UJ%vI zkjeA(;aOhuwwdYPhmq=E;~?kr)fxx9#Nh$=qS5C=-AUDR$zD; z_IPdp=J$5`vP?9CnYI(&EY%i;s&?x^&tRiS>dKvaeV2R(efO_G=ED5@eGYb0%KR|H zaTk2`rmejl1;#O*ZNj7B&Ws$XpIh9~3#A7aGoDSvwU_CyOoUAF%RLWcN(1e7nG25K zWwiP?zu|Qq@zss$YwVVTK7DV~5L-_*H6jO2k}qN`oIQQ02d>MS;f7ejc0vve+~oq! z?ZpFh+Xas5fxGrF!E(cbf!P5*V0`{s(B9%balgH#kC2(##=Rw**ab}LyG$Ei>d75v z%)tU62v9JB7ll8g%c&Gp3M++GA}Wzk%^>znz+wgZfb)jXVZm3LGSa91dJU#yPhPMF z$+%QfgeH*QsTU{!2N7E(hF`~3{OK4zWvmu`)RS(MWyjJ5KpXOro^DVxImf7w87H4f zMk%PUZ$xic&Rf&aqGv^WJ{FFtx9ab0nh91;PLMKkv>sVshvmFb&Vi)QzU<06gzHgk z*6+g17H-F=86gCNTWjrmJ@J4(0bxCeA+*O4!`xi8upFll*0tci zeN6fr*U4Iya<5@2IZVCYJbMIW$f#iyKe*8u#j1#3$0CuCXv>UILKz3rr5QqK;U<_5 zx48Dk;l?&M@dUkC-^!p{0FH^#gVZJt0vYFu+RsGRm59$xb?qQ7!zsX9cBffZCw(CZBJF>s^q+XcmY#9A)%IgDyJP7-X1huBlshr=^gwd^hRyk8 z(8@t#)q064>IJQuc%eQ0P64>#W`}XGd_w#y{6)aWn*{sL?J^_!_80lT!HIu&Jp4~A zkq+aoJc8;!OVZ`Vo`u~A^#fKvT+%>e81fD>(0nb}ILQRLQG!7~Bx_ox(fHYR3j#?? zYcsM{9VI}$YPr>NS@ZkgXN|1eXsc;$X@P&Qr+;s}-f(NlWp;CQa&w{&xMAH*V|Kcp z`f!@b&Tu-qYO>>bA_1y4Mn&2>3>0nG3iQ&Jhjr`n9~hIYcctgu5!?4g!Y984ija%v z5Zo6)$|Jd@M1oInR}U;2Iln3g_T&)VUnJoZA`;q1L^>eBBmFjV`~HyMf<}-_@QCbN zAmx$f=siLWZcy4ZU0l^w}PdN4wkv4IoKYwEpYpvu$^{iRE+xEa*a`{rd ztr#NZZsc7B{4gNA6nwFPk9EG}LF87(gaA*qkXMpOaCX0hmK8-HXccrnVxaRRr3<{s zrE78CK&0v%^GaE?3rUir5H2({*_U-bJG@NH8%jl@!qlEQ}S)NO`aH?{}WeIFrtEzbw1zXHaRhJm^FC%An19CvLnr9 zz?nr-l6VmDNRz?5O*7nL(ZoF|D` z5+$oD`f%$u72L@BMOTV>X7@5PjwI=~Aq7{#new~1{C3j56QFaV>mcDvQ+vy}az#q_ zz{irtnh01kh}%hCM2$kBCnkUycU}>_dM!ZPjRR|}C)YBfxUr_OFa`^cx}h#pywaeN z^xbhF+~G1AQL$YKH-f5&HgZLd`%Ey-@2yI2bk*6Qh%3LisQgfK_CW*PQ?rb}ougv^ z0S?cvD(_1+h-E+HXl_w~4{`JoOQ~?4LuIgVe<4mr9P<}{N{FJQyL%JUAn}h1O-z$Wid%m zvC8w~;ub3QipI!=EGwoQ`5;Q04x#QQNUR>^ndd)3$Kq2NHV{hxk51#L!YF{3r%ZCJUn@x#?AS zbomLt3OMS5a8F3NkuWat8HU1GIG3oh^){H7ak#=UM+CJvi8zTwarqsEH`j(!!x(SE=G8_tE_nJzZ zid3tI0@dO*C9q{#;0BRwNI1u@2^J=Gu4M?BB4xBA&sDIha-;cdia|^js2Lv_lQKCW z7AB7~Q3v^EOcN-~Y{4F>+cR9sHjv8Y3q5If7+O{ndVL4a9_o8LT(2SGDGm+wMr3U< z-S1#*P20I6$sR_<=|kJ=x9{B!*33U7hkApmy;JHcu#;Zn!qb-zS3_AjQ{}{wY-_gn zk(&}L(L7Qhms+E}&R*TVM_dg*?*nVd)X{|ISs)&q2>xQ5=2sBySD9;sQeSAqTm#&m zQ*m?#6@<#Tm(@X%ENbe|B*Lz`SV>GxaX5GkP+#zsmwsS*I<(r0D9?kRZ@jx25a^BF zi(t~3Hf2tDtT868h)pqK4?LC;;+{qjw$m^+7|f3ML8V_>E-77^ALBD|pEyOt&63gP znY}9y)x36a&=)Kdb~_zNt6PN|F2z+CCo%Ie_@lFQMs3O~@n?tNd&Inat_J5dETe$l z8g*pG^3ZPzVr(gAt0cJ)KVCQ?i9S<$}qf>u@Na2Z5B{CPZ z5JIZo?Boxw)u0+hWx(E!;`zhf2HRQ;wZav%8&!*b%o7T3@EuGN8w{CI3TEw6SOr$3qaq1I(Gn2j;ZEP6BXA9RNkc4jm=*v{)~_2UyC|$&+~xCoFOBb`@)sd*tQE z2mJ_p&0|hx(M0?#1`!OBTyQ2ODWwc%*^sC;k}FbHObs0?r9U0W{YyXlx_Mr zrZS3G#HkZD>PJU{@cRcG~#Lta$PC`P)kHG$jswS7etRxu-jMWbw*euw* z-Ojck`++yM8+g)~P?Ccaem#r_V@4-OO#|o1g`irGIX0 z2pZmh%^0C#tJi(|P6xWc$$Qf{wus-*;mzRg#|l|}*cKd#3|?f688}>P+jc>ud0Y|K z7t8Oi!a7X_Ki_oW(|V(|=sr~aDeo~noEERc7Ej?^n8C4t;Y&DN?iAbsLVU%oE_bH` zPDA4e=IoEi%R+vy)clpxUiW~F0jNWLfirh%xXK*qVZA4({!MlFv#U2-nb;E1ZJ}jQ zVmmP9m;_{bkA!XPSIvY%73lI_ZBNpc%eJu_;E4zNcpunAKV$sKu*Ku56K{ul%SFc) z)!9thM1gIFYc{%t#Lmk^Lv83C8n~b4io!VIAXJ_a`ML=Pc9KDgBhoV1M0i%eWmKWuh*b>m(IW|-imu(5KC6ER>)ywa^9~r@dTl-3 z1c9P{qB^h_7^sP4JvBsAwl?!Cr#H_BgAl^w*m4ah4AQ85IAis7QyeLGH+GZ!ipoK_@gujgCPX8>zvN ze`nQYZ)AV5U3r(O<)FS6Va3QlNSn-$?scU0 z4IKA%l>VU9e%7P@$uc0kM$nZk5I5N$Jl1D`mLt3??u4-InDkOU0>w$kA$m$ob-i?9 zdd62+su#u~sJ8t!T(uY#qNvWDGgrPJ=#OYp2la$YQH*~LbsNrSfA+*b3|64q-mcI_ z>>SujVC&vv#Rh;x#fbC93U%Q;s zT9L0*Ksf#Qg>JbUbJ_(l^GgUlKOkyu*d(1z4Irr#ZLuBZlQ};_P^-cIV2}xapC@Vf zA>;zIxJY2SKo|{)sJ*DuacCL(vmNdVNOH#QPJ=&MFId?ZWfSOnaikvOFMENNU6|-c zath-$+kT9kFY1%`vZ`XFH8fVI#rVZ`ntg#=3*=jg(A#d_RjAID+~LmPJof`p_nPO#fGInM{WdfIB z9G?>Vd(Xf0Hvl#jwiWhgQ0#ofyi-xg>7-Fve>yqv9F|a#m?Qdq5K+Stk_6Ngzar*rXX{oJYqm27qgKAcHYDtED@;-o)#xKZ-lqf zEROGRAax~c*w1^iPEqHY!F<03R-Br_sLUDw6McEACg5kAEN19wd8{cGhf7>OUFou> zS?Asv*9e%31ly_^W_K#anm#1g*#L2Ma+z2&GIJfW7JG0Yea0^~1GS^wYk`2gH@TWKH2R;U~QYPr->BfU#6J z%6nG|1qh@Q%#;mFAd-t@qc|uI3*1u~qj3BrM|pw0V)|`OU_1H1vMveULmiwlutEkw zcoa24?f$zE7+h?%2tf}>sY9yhc#3~+@=bE&xe#M6MOX;6nJ%89FDcKUcU~x zz`Ddg^N{}uH`MhQg_F`!DLARgbz>U2G`O9=I;L_I}?b5d! z8w5)8rjyfSub)^SzCgqeHUVO75qP#BW|5+)AcymYXUFc@bOhNv+-<1XWv zAXM33W?Xj#>GaeCRuRD+ci&n8=$$}N$*Nx_{l)@R;hdC%M6>~8E^1CicM=WCO|0tU3t<0 z_)23CnIPSLcU8r^TUEdTW7Jc>5D%r5Cv0X}5)eY{sS?z0lzWnO_o@ilCqht8k~F9R2T7>rD|Tg@P*)rCv? zL(Y4M?otPwEByeo->-*&-^XRaOts#U@?`)x2iie@b<8i(LBClj^Y{Oz1T8le&f@&W zN4ms7KwSS{_~?I$L0i(Hyit}h`}@*(O`9^}gFq$v5g1!0OY7l?fCuy;r5eXgksApy z>IdsHNTgiN4)DxTyezD3Mk@WwX?toO(acwsM|7X&S~rGtpK5!ot}A;suf3SNGIFNk z5&RCtdY_M`z5YJ?T>D(V?_4bY^>}~+QXfKtx-npX0nq*6+Xu(qIs^xILpQoCdT@u2 z@RHd22Oq)5yT=a;k>HUzWDi6Aklo0P3;8)eG$!tyEu1<`Oj0WD9XMP>f=7JI5urqq zOK>ZJlt)C$C$rB?!gn4@4sZhY&fW1DfP=dcspJ)DDcimwePQDD4H;%8$tAs2X#`k3 zJe`yD3dGGOyp&@1g6)=WxIupDRPxI0dy(|Y?L(0GihueF>-b7{=Rw{mQTd5p`^vWH zwF59d5{K)=KQ#S!A#c8$>*)-D0q6KHSc=GO>nMqeH}5P_I7=61Oa`qyOh!8Q*f+A2-9I*fkGO(Y?vphkV=1fh%< zUCwp-%NPSG69&WtLl8wK$yv=JUS2E_rxkGIaYVg~NFQRx-7jftX+>`kBcBCfKgCGl zl!Tjd783H!q=+eZEydIY$6uJT!Qh$m&KBkrlw}A5T$m_gNRpa^5e@^DGOWh+-SkDp zMGhVWnURIiJ&KBvlNOxol@t-p$+2W8!L)#&x(A6@Q9TOesDzntd(n0zSV7fu20bS< zFPhcmj7VKl@=(k*9%}np+={OV2jzm&xolwSnU#u!O!1P#cKYD!r%4tRGpCC*L(Gk; zfChW6jEG`p35^o2QK7pO3qEwZs&;-v+{&>QnUeFKX0vX&oDd1&le1rLl(-2FsV`DhtPTJ26{#;xqxi*;nDEPIe*^8FRd*1awO#LVXt*f#3i!wZk~KWlRN=`!=M)@uauiH zjKuuliHP5-XTo)*=bZE5IzNlt_!%$vmo6U#f=s}6I8W; zS(6hst)qvVgF_sm11#f=w$yTcy|>X^&hh*-+M9dL1CV=0hC#K0x0uCR~W0JPJp z0-bWQq)g+GV3uy_tF5AxCZ0$BIwDpf7E^=#tz|`wh=cy@!L0Z5n!&pR*CLR=${_vx z`6KI*M};{c*(2DY>6EZVhuGj8BNUfJtYy1#gUI)_i;#P6#nCt zzXqWej!@go+zI1g8ZQo+!s&e7m^0*t`V%ZX9t_9H{yT*xW0kcWXk@?yP>cA z)bjruexo;~Z4YFN0Kh_m*b}WRI2jxZI^)rRajD?yK z;V=kf?ggE-+HDl8@^QnLb+m?Q^4p=&h4wS10 zQ00)EO(DQa&C7s1qO=K$9#3ZEODi>{^d(2*)Lihk*dOO#10Lue&Js;#*L=~3(>x~0 z`wK;;9)9+*W=n`>88Le+3-LQs4+z@B?MFMuXu70RGeBpQPfs^-Y1A7m6`U>iPZoJ7sY6Wzw$S+uFJ2$UU!@9O(;vTFEo$TmuN-7 zaKludvaN}^Fo9Qdu{>d;xjr^&TCcPhO0*U$_rtrlu%MpxLqD@`2ivWFqD{nD>H~#BZm&u`X$J2U)%m- zRQmu#_n|F+N^1QKME8R&e|L*{f7+AdKk2r>bQywSY`Lj!r(0@%nxePC%)X++swYC2 z&Z^4=Su8GKb|xlhXjt=YC(WpLd@-vf-Hxu0@rjO;rTLbjj$t$@nk{V7YCo2chGErjo^|D>2;usz zL+BJBsSjQVT0t~xpqXjhspF0$rjvx<5=b2_jCH6QM$3-eOyAfZxvqf-a z=l+meVE+|(gTKjQL+)xrCCf^df1pZ2mr#E+YqiVvG&v`b-TYFwII|bPXpTXB(#8*t z&gqiaK38EE-PwsIxb4mhnb!Mfi^93uxI)s#L{@_CQUcX|F|Wr0n>W#f`b`ty%U(V)(`x}{ARK;7~Ut$CBoc4p{6X9+Xv@ZUG58andjaLr-% zQ%#$sR;%hjnFR%xtl?}fOO;&B5(Sq{mmGsGvUw>R?@kl%>G}hd>U7|`fs)&zC(kb~ z_75BHmrdGGcC0XZ23)>~bv@iGkjHPEW=p5@)oSgwil6Qf-N^ld*v#5Rh-#c-TO^(_ zH8&FqlQmvB3F<2Lhw`|?+5#~9lEe=4I1x$i+X@lb_B=LyO|A37LnB-e4wgKX36E2P zYD#yoGFG$c-au^@qT&7V-x4uE!BpTZNpZs=7@^=c3p669auga+r6UEmSO7my}?4o(ZCN46dF+l#-#8ey18||oVGsAraa{-18x@U6uc;^Oa*pSoD-ZDDmh+A zc8et!ESCW&b3+$${m0_ukbAf^!=u%VZlLQXOVM`By1b5TLp32Jq!npNCHnw?R#*%A zpJW_>sub@^<{2Wx@S3d?=7^-~b=j?b;BwY&>InGLh-sI9|k?#7quev$kBgc(83v(V*1mXJD_i1 z9-$ZOAPm54Vdw%B&7YUeZ(Qoh`^eA*xVs^CAe^T?`SUJ8ZUl6FArCnA+T!7`Zt8HK zZ!lf}Jsg!_ljy%b{>wlj{Y{)o1M<5jegFZfgZz7I8WRI+Yda$YXA3)9Q5RdIf4(F_ zcDBw2-yvp>|8bX{q9|jx_zS@&i+(KDf?y7aHXbcfoOs@U5B!X@T(K~`PB1?VueE}4 z(|R@K5;WrP@DHfqy?*#TF~XhNLVExL&GgLXt2^_-x?Z2(2j~q#8%VOlwipzdsCWt!lskD79d-{JL-JH(vg)_DmB7c-Anx;ytw{GCwoZBrP<@L-IK158FjLa&c zQWLXsPcDgxzA09%Ws8!LpY9gEAN+~dokxd!O0wXJeM-(T``qoh%>JDLt1wc7fa;Fd zDyTh78u0#?H@iQF)QLmLOJ8k4*EOJh3_|%RXus7uPZ&%Rm5=tvJPZovk0q`eJA|Ar zJ%yKxKuaFA6VRRbJ=!36gu7ONHEZ^eM}GlKG1|{{U=hQwaLyipg-g*rSjdWL)7FFP z=QRcROLMuR!+Kb(Pa3-@{TjADPWkiWm`Eii3(uWHvg`W;q=Qs3}&sNKDMTfdTu$k2>^PKr;%p!-sAV3xI@(SO&gaT z*yCZSg(Mx3o}7#Bga#IxF98jJmH|}hl<9HSi?lqIxg}dSoN1Z03!og+9Up`H%I+!2 zRcsgcds}Cf`OI^?d~@cilUy3E%|458xk4j!{AU5|A}$fRrc(uB045w`_M$yR6V?#} zy^-4?lkBy}ghcEK6$|*%oXn7sI8NR!G6g4_Qbh?f53P$P02@0N(D{`$-wo~*!XtFo z97##lk~w$(3QQ<&!Sl#3-HC%$gkK46ShDMaUbw)${dUqS;)W?R+DBmTuTS}oT<|R4 z1Oa&|@E%)>etW?;h!2G<%wIzV+&n`V=#gEv=wE%KVFSB{_Z=8rV|SQP);b%p$FK zUq+99JWU#F8s}~N#rLf^Z%R%0L~k#>Lbneps`x3L0)10i%!iwHc_&dBZoZf#OS0*Y z5HNAZZ1|PXr||JFt+HH2&4w6;Kt}C=kGW=6PBd{{G=v$Fr+J@50H%kA#kouS2*Q)r zAO#oTSeulXDM~>Uk{9C(=3k4#$TyKj`+L811qTA6`+qMAiT|jI7-gG(eh2kUC0i%a zp(zZs31}@(2fv^~sX&7vWNEh$XO@|Uy&-f;+6vvYcID36=6LM-D>etejQRO3IT$;( zHMA%T$&|SA=s4y%emuJN`+9-tXJTWnzY#%`s%L#JIqJ&W3&X+w|j2xF1~KtbxkM%u+GO%D;r(-p*I?f zoy%&wO9-X93@KozzJq&o04|q*uZFV#jMo{O6&pCY(1r%k=+f01?*3tD(C)?s;bUmE z1~bE*AxNdPJOj^UI4~yG3_ILt0_+olVAyE6g_Z=*eqrA|nbL@niN512daO`e5o9Z<{dg zC7|iyOO_bNd5B1T#h9YJ#yh0OL5g*8kL*D(bKxm?jlaOO2Z;Z4+)=wnv!1PX++u6H z=NRR_GR8T?W@ZgoXS;>?Hl^pcL{$Argc9n*D4e->O=N@l(81qB{!V(AyemIqd1_Kx z#}+?u`ZF4{t`G7!#s@?#Q}$Q*XdN`;tx4FM?0^|HkLC9YJi{w>w3>sT%caH<#1`ou zQ^!a<`76f(r6aqpd11PlGL2K?e*Vcm3YEnYxS!5%9NWhAnI)Qy2{bxcslCeF=XDPk{#ata(je+?&vb#jIH~YS9=-qgPk+W)N!^<_csdP z6;oX~R1Gtv=9rVto|{}9)9M0R`zo<}4{{;5W%BojvlYh=_=e=2_foTKL+{M^6xd;> zCoM2L(`_b}71<(;wxP>`nbdx3!b;KJe8+HswGy&BWVo`IhbLN@)D$CzMjd80Fh2C? zmXM2?rEu-Sa_q81fGHGjny#;W_LEkU%P4h5R+U5-$(6eX(>e&}O6#C@zs4^08;X66 z(JcYACiHJwB%fq?^3~K*;w0z zBMD21Kzz%ZgVBucZ4<7T^NY7_d}k!!?Wfu|N8Z``^GB*4-MmSc@F|>m0yDi}n(K`YT7gAq}a_@da* zH!VE)5pVR629>J-^btyd{B%7DJ5zFOF~ZqPGa`RBKWjVn;kh9E2Fph-rdNzAPQoe> zEmDeFOjS@b$+$&I>bJao*v0wa07J;VoVIo;!!5TXvAE<_TV}p1z@SJmS~CZ3WOzge zHer#F=?gd_YVDTGnrE2Fp-1QfR^;12@``jru0VTOZUvCU%EKCD?tMq(ONGQA6ZWU-8Ia@P5TU)}) zij-p%yT50x8NA2TfKi-2W;&+FGFPRy$h9f=P_WF6S=mCZdELP_*R8bB?QIogZA7wM z8N`y9W7!d1QIW$lk#0xn|mZ?H^H6GYA?GWsIkVf zH;(mHdn|s7{_JZB!M5mt|3BN6f40F9-*$-M?{MmnZ#^~s|7jcikN%`Y&C4C-+jm?B zk9(Xc7y(HVICu_NhpitivW3*bQXOdxAu%y{4u$gP5DCo%@x_c{psKgOkA+B0+=`oz zGFS^JoP|ZziYE1n=I*17&*#DJ*I`-S@m2?ShK?!Q+|~1C4)gQQJ$IkeRmbs8$3tIP zE?7O{U*+3h@wxDo?tTb|?hKG%_~m4$gub5y>}4IV2<-SrN5oq^JP`OJW9n}l?0I`f zh_-kp{&J4@l(u}h!)7-csCfqsvk(mkaSab(sl6D(X*VXmKG|7y_V+5by`xXFHzyjl zy)$*Yko#HgfhA4?()&DpxwWN7gubK}3#K2msJlm3%pZ;cT_G&E!xB8>(@I;~%D2st zW+(ZIB+k{KE1g0rU6G>`D3R~Kj3s``X%+KB3Mk z&SkJY4b^9dUv*qn)gcaq4IJ#an9(G*e9UPOIWwhjR+JI|Lm;IFHfsx_*$*HPOs1(v zl)TWDG0qbUP&qsnH^l{e8v)uAk>t|=cQ#p9+f`=Ih2|+~GpdwUXX;#8sG@3bnnLcJ zgkEi;fni7@ePiiuqDb~PPOZfI!g#x2;Pn>=X5Pwtp5{yXlSJ~!|r@O8&Z_5X~w$(?aM*84av5LOrWfa3u){1l3iy#7&DeBs!!UWtCD&? zus9~M1LrrJC3=~j9ly`FOO$Tmf{#q)j5&F*TcQQ9sVc~kERa$??I_GV`{R+bgm_EL zz%M%)%i|Okr*WH|4{m3f0Mq41Pf^-iFBau8TsT-H(Nl!CwaoJq?n~^uBW<*~wB%MwLr!#12 zjDPDuN(4}Zg&J0E%*Z4ysq{3oywRq0G@De(%+#w>=o@`CYkS(VXF?NAT-V%Yq$3xz zAJyzfe>1>B=VpUmiVEhAImh30d}rM(a7v9dkvv0ZWZwvVpB)7G+rCOX?0wqPv8|IW zZxnHHnINWYIg=RPq2Lf9OSs3HyzF&dvAiV*t7ai?3WN*x)GxUJE4?AN8y&cBvq`w! zAt$WXy>~1!d+i}^dw8kqrMb9G6`nc(gnK}jocUVBk1IT5i@H$!eGxeRK~gyWQ7J0l zLV(FfvLTz6qlG&dzfmmz>J7|CVu@bGOH1hPo(de9Bi3j;qeC>QB^%@XZsWrBjTf9v zyT}MW%L4cVg-~m5ERp%5GB#L7*WUA5_e>#pa_B$C{D+#wiYO=L+J{?LSk3C4>F=45aiGi z3yg`+F(N&%6(V%$THcGg7qe|~#Z0V7fR+|`zBJ?Bi-%3qHXm~zS%x6KWe@#)kXUlr z&)FjEZW1Ye2a7a~lR^oZ>{{CX)#Oo4#S>C#p^VPWySGs1_;AW_vjUHH4)1Zc$Vv3b zO`(5b5dTO?;WRh`*`?!PALawu6}QFY@{2Y;M7$#H#q=$*FLy_j{+V>jbf7kJMXcE2gU(4gmtSBNLO zm1%#DV(AvPDsAv(i++v8=;=?BxfkR{wrqtH#foySGpGpXVV|b%fg9S4K&)fRkp~-Y zoo~&<8pD-_$lbx5yrq#Qb&m^jAMq=BuQFn|JQ!|16)|G=eIZmk|Mzx9d!Tc6^C(Wu z@)9+I2DN$BvR6e8K?|Ok4KwD!j%Ncic59Psx~pY-KF*qLc5$WS#JDZ0)5uJ4KR3lK z+r%ebq-4{+f-;`{C45&hgJ3qo#m5>Q;#pP|zAsAU9Y-@TjazQEtHH8Vwb0&~8roLr zJ_C}Yr8EX(LNbe8iYJ6B-NTLKeP#|q6^ZzD9`S4U z0jVJC$f2UL2&Vs$Elwi%C7Vwzytw~REl1ce;#$Wfa2X1IYMHG`BDjZP(wp&=O`$7f z;=apRLg%{kL9U=>ZTgUo{T}_R(8~>VC+1l^^m+24r{)f`8k3Sdj=aGY>l|E+;+X=B zm`3g(^wQZ*!w>I=r!_}hs{Jd9El=F}AnJaH<7kcw3Q(;MmTf-~QCILEG|k-e(|1$c zo#?C+n6e;6!r4Z!X?OY^2tJsL^Yxx~IiBmX^Q=g1r*$WfNAgJQsMM{{CkJ zX#Cv(R`(xg348!L#hhJpjkz5>1^L~kh*SiN` z_ujO_?+PB)Reh)&EMTQM^C=_$1;yvnOS%ybBs9n==#!`0qNSnX&&|oz(5>b%#-QDl zm0`@QU6nSOWM@~F(pWD)$y8It?sPKiWg3s4!cGOqFyhRnt}fH6G{9x(>YPPa2Yb)Re^+6;#Tt@(qZhisT3Q$%{a{Bl2lAIWZ#Nnp-~)n zQ&Y=@ZCr1WWHH5Z23tnmdx+`cGhz>ScanQn?y|j@V=>vtyUc7Ir5px&#w-Fyo&vVZ z;sF`1vb8)-B}B*F>Sq_XxXX7s`tv5%bBr)QKl1x4m(Ft~% z>xp5b4PQDYIKe^)$juu(yjd`hORvxhWgjVIGghJDPp;YP&+Fs`VB%g2cInW8mBD-l z(2;~|)AZ}J36#2U(jwD}+-n5omMSAJ1Kj@WlO|~9!@s#IN)xy|Tm_7AGk)RXNuNJH zFlN!I0jd__D z%A2U$Ek0rgk2$(X3)KV6A33V|QXj%3*1s7XlmvA`Ll`m14ekla4>)9hbHvGD?hYgX z29p3rQGI+Vr)ZzzgUpz4-m|N|@eXjS9fO>h$n8W2Onk|=#J+|cef((@FkPdung@7z zNpXnm(5PiatEa6@)tWG(B$#KzQX^s^BN}Jb^XPT$IVa7hY)RGZa9_%;&1zw3)$Fvr zNsdYbq&4~DV-jt@lNy$K=#k3`=vYO=D@#wan!U*ECzWe58{0c&XJGDsYF)Gc;au(k3!0V2yz8A1&=V!f~C795Gm)=vk!V24h_{I+Cg*&vUE`a z$q|mK2=((xzQRL>OKC($s8B&P?$5ym%FZ|OvpX^(&yp~WN2C1k!wp-9`@s(%Q5AOc zN$B0DkB7X#VS|Fc0G5a(*eR~4D4rb}EJcD3K!$~O<#*6E4>&*-wx@=vPX}#@Fy?ukXCKu1DD{-ug-wIu_)iZCD3wc_iExc5^ zd~!;7Vz+1JNMd{6(c8F?LVUuHx;IHLw%ZvYA1tWwpF_!ko^51-z}YP|<1Xov=}7-M z%NE1KhZ@iwIScHF>gh=9k=_618@2@!fMzAAWi6N_#DcllE^^LH=)vcdRUD|#OdZIv z8gO6G#<6?-+e6pB7j630p5?d%#GWoRTWWvr3iQ3%9&e+x(DL{rpZJ(j^B9$|sZ

    MJM$=m{v}CM3{fGp?a!Vc$Dr27h3QNJh@7EyLsX5b(xU)qW{hiQ7*{8oY+)(~ zt?RzZ8S+KoI9G8&b#NFJWEHtlBUYU!urBH!b<}BAD3~b}O*YlJHl`ize3nuY-PDUL zZvBpQ!I6>9(?xQA3`V1^S{_~AjJfoh#TsiV1>F$rsf$@XUTgE%{~32LqSrSxN) z2zcxey%DY7;1XF`oyh$VU{)@+<|vxNjAJ8UF>RTNj3ZDZe)~1cl=N~nsMS*v>@8K_ zyU%&Q(ibK-KVd`LomE&S1RE1>M2Fn=ZG!SCNfh{GE)==G0gEwjj z`LP-Ud|CQ>uo~=OJuEQrt$;FMpdE+d0OA{mbH`*mz-T>Wg*k}RmIAdoy!pzai8+BPbBER%Tg1k|^Uh%mnM{Xf^!U%3h?u2}S{=O1&kCWHs5e&t>I=rhh zybE*OrKiW{MLN~VO%Bftw!ij3?)kT2%7vr93(^cF6{5&RuyRl=A6V35^`dIsQ9Dq> zM_jp!ZVKJ~y~F(o!$m~ct6Pmb88S*oJa~<9$L>X&*#lz?z!*Y$m&F}Ix2UkS7E$mf0G-WDe}A1obQD<1IS^! z?gbtGl9+)sO*|n}nHl+Ys1o1OC@+^A_BmH83X%guaCSNvHd;9>70eXHo#TwtDlgt0 zMvFRcUm7AP39ms>{F0R}lPeh68~f|9yeiT?W3+fQ1s(dVVN#IL1znS(c#az;M0wM& zAU<_Pi-Kb^mmkFg8@|EJp3Wo1J(WkK^wnB<&*d3tx(Hi$o1c7PeT0$C^yYx|IlmcU zzG=(U9yQ7aeB>->*_fYdV=Lcj){NO5IW$D9qeaW9xTZUmg|22xQ(MZcV5WvKG;m0g zCjSH=Oh{@2UR)X@Sg}q~Y=d+}TVbWDRlsKh=*?l%<7Zm$y1#LX%gz(TFoT`;*`;Z~`eZ@1)Ff@h+ssnc-)`}G^$ zPwX*RGc8Bh%ChNQ(`~JTR3n8`=)Koe#nFaRb;wj^1?F*@W<=9(rb9(?@P3P`;dfKi zVMd?W=YO#BzN^N6OI`jiFNpspMOxU|{{M6@M-{Q+C4hl|Xuiu(rvG;d`aiB0FmkqV zHTg$XYG?b;nlwdWLK1`#mFEnwyuKc0x7D^-I5nI@6iy$kC}0ETb|%d!6OqA`WbxFf z4Mq13#3$K>(rK>-t3BOK{*sM5`hS^y#FxqOL#Du5VAjmWCT^4VtMEns7iSc+-1U+V z{N$VC9I2Wxm4blUjje*&ASu515m*?q$DF!fYVHNx8{c@Z%J1>lanPK@c6wrPS0UN) z!SOT}Zbnoiiz+5X=0hK}HMP)t{%+?HBdikog+CEYZu*WA+0OKcIoIt0Rc zC=2FcxwAY-<<7YYzqphcg{*9knP(~@x{`q5k~^IV$P&nFl`R#&ywt*l z+E|w5$yNqGd^ZRrW(+Z~{$S#`5=Ql9u3OlA|D(OA;eTC?^qrXG@8iEojF5qmxry;V3;|5s z|CN~d?td^YL*h2#XAw^k_?U^6%XHJB4Ji#H^?|@h$jIvz#mG{TA>3)fgM$$f`h*B; zKtK$Q?%G>=y<&a%c=dLGaSh3X!^VJotie~I>!xP?p;k~ zuwHSgj5T7SIF*u1C?P*PK0;>$$1#Rz71EiFPUU4aqNRD(Ea_9>#qldYc%DvWRHi5y z9s3V?^vqUO3*FOHtu+=!D}$8sS3zT`4DyDS`vgIN)WUKGx6-un`(MZ7TucLhh5=~r z(4a4M=IBpfq)rx$xZ_0-r&wi1Q1vTRx^U;13J)=$xkoVT^Iou-Qyv!|q-sJ+dl^}F zb+<+KC^%TIQU$Tt-v0?wZTs`v`aD)sw#AGX^Lj13ua7wD1}N}tQp%FRZx31qm%OvKNt-Z*xL`iG8!+X z`H8KioiUBC(_g$^JVT+@Js&nwl)WZS?#d4IJ zis&6{GaEcxEX$86@*`kykheKUcI0f(R&%g=KLCQneYZf+KNxhsUA!I|^==d- zuix#b{uOgj4w)!649yhpN%YLNS9SMFM#j$P`xyq1Tw!t_gQ-!v)K8KF?;i$}!|m>D z(`!zKxfo8W*RPpttKO~+?>(^V+TKa{XIv@JO-t9>kl+G{m&TBg^k)So+! z*o?1sU|Y}O95bMklgAQO2#Z{eE%I}DM~xU>Gx8$L~vZ19E@UDRcC7jjuREy z+RZKA)q}x<9tF$!OP258cE4jm3WaOM6tE4MuoFYQT@kWE;Y(!hqczSwg{ui%qzs#oTd19{6awuL0WLg*lYr z&d+%y;|>qw$aGJS=mKI-mrR`65!G-bbY0EgHvY!2@k@KSN*-vhPeh~YG?D+iWwm+0I)X5q?(%pPD2gmrMmjeGr> z)`tFrSYsd}QX*X988R-BYB%06>9F-RwW}-aH9VGbko>NUz$q89SUkcy)!UKp=aLc9 zk}fUYUU=(7+)rjIN#YX!cXdAI&O^PiDyr3*sQ~pc#}^tTEWSThc$=(d({kg1e|7PSd$8-us-Ozs#9?r}@rdAPiNKWYwec^B0i z@gwP$(XR0qv{hNo5m!dqtfK3kx^RwjpqR#rc9|(%pM)3x!raf{X=W~eC-UB%z|5)l zVZmXTnc-0;jC`?14DdYit3`02O8(b)n@Z1GorN9vU^%L!b}sW<{mWD@H#%D z>MKE`rp5Hqz-G8~`$l4kI3yg@7um66WA^NQRh6_$k9e`j+ zg?BdqsrOGWWbz-s3|6vdfRfDqkv9}P*avZ|5bi_)gOWOZ^M0MXvzDiKLjV+8hfxrh zgSdd$8T`r9i}+ijKuuFa=lGn7mcwZzIRDU0ES+2>hx)Jbp=$HAddi0CFI(&uRW7BJ z^G#!0g{_7a?&U5bSUG8n&2nu%E_G-xGL-=iMpF9qu;dG?9L?t*mETv2E5ms!#=For<;8t}fMs!vV|09a}uOn0cFp%~9<{$hw`?i>goy|Y@?I~3) z>*N)r&tb1Ow-u|}n4m_sSfjFo)lMt)x^~RydMlhCtD%NL0ii7yPcxoZ%^0pL90e9h z;$4p=wTR+Qm5UULB$A^cEtXkfyedBC>lKO>Wr_sUA{Iq03KGCiTqnKyh1DRI@}2Y3 z8Nbpp-b{}t-~2o-M)*KxW8M%|zZugmm{1AP*qAW=m8S5!`9yjO3t{gcb-t3=YQ};I zfJj^gW2W#Tj^Cqqh&_=baM_T1R<9iac97?qN<)Pj6ebTaLj~51tSQW;V2;|mH&b-R zQa(TAyhe}$+!*+5poxgrz?`fde8*{|%ccTVh~J#4+(=YLsn&8IQ%xI01UAHb;w6q# zO_|#d4JosvOdX@f5+$PAwI$c2uNfa6xIhE;&Z2*Llck_!TYbF?5r@spnmt6|y_i{z zAPUt{gzo^baybBB$n|E5rJ|$o8kd9uOYW2@xi~U84MjzBv1ZILfxE(l&GJq0T3xJm zxCQI|{bOHo?sd3SFLcS11LfQp5q;(a`*I_cLtiNGa(7=O^;FiLc5~8cpnk7Aoql)ig*?gpB9GwaYG9(^DGSrD``z#T9C62F6yQ@CXA(C-5X-G+`KRO~=a8%n@lh`S9 zjH%c*Q$8}3uZuZLm!O@tJmg9*q2*N(OqiKjaOP`lvZv9dUKqh?hWPC`&0eZz-F@rh z+1$*QTwuQ8b6++WGBi zmD>yoSFOE_SDwSjYM=Kpk9m-g==?t|AVuZ#u%${$%I7vKE8LD=E({~&Lh^hz=#5}b z>oGW4+7|U?J5dMbdw|BwxWq+am9{Yv`GP_O0pb$6*nv3=F9^pFX|Ux}_Nu@~ioA9s zb0Uluwmm`?C)hI7RcPKL-Jk;{yZn8k<-z@xT@Uz_JJ6A+vUjMik?nw+lRNgkxVyZy zw4W-9zrV+|pGqocdi{Z!FmlD1OW|ypm?B9~7YbSqPv+AOrlkkgP@aBSEu~rP6n*H5 z?eulA8=+rGn`0c$MS;N*&6GZ~OdBd3oROjbiEicwp7M#vHm^z129uN9MQT#8!+73T zaO9mXA9cTo$yznGL+9FxTS7CyJ_0-t&*4u_tGmFbJ8HSA2ujxPfit4xzLT0`b zS?^rd12=C2UA0?r^)GV}*7~>k?JPCp1@vV^ZU$z6l#iai@JJ~{thqlUSxxbt0lpW)&Yaz@-MOFpQGh4 zvHTR`GU4ziV#^;L_lJcW<@Fk(jhCxSdL$;hr!O1SQwWJu2NmSZS$^Tm zc)hSj%)2N0hzfBGIkVMkHR1yL{NgAlme1M9#ldeXha?ci`XSC@3&Hn zs%(H>DTe1uS#p=dzU%q+=$H@Y8y9*_;*RE%g5gbWeidKdGqMGLCYV$a9`BYS0j+#7neEOu=*1^gOD%Om@=#h`mg_8TaoZ z3hKDsIl>Sky*WbHjruvqshzD*$C1R*dY;QPvu1M$%eE8qylE93$@&uD^(>Uuxo4h0 z8;gGC)HG@#7M1PNe0!cha!z>IqQw)u3BM(Tx*|1Q^lQnW>ksF!yb_8>-5J?F{*24w zj&LRR1(C^d`ccklW7Z5*u3B2xnr+DE!@1jCQq-psX=OvlWX zqs-L$Z^PK~Zz24OWX1_uwe8Cu6H}v_wN<7@Uw2KObz47;&Q#xt8j$+wrxU(49(M#+ zh+C5lTZEU&XM%#yOm>Bdg4C@GmzSaiMc(?$Am#xxA8|i>_%szIt4gY(V{;AG&iWBm z=3$@lFHs1aV{Fy-861xfU7D5GSEj`nx^qz+7ofOyf~Bo>D*4WeYa8xe)F~BZ?RF*7 z9ji{Zfsb=$?^@mM7rXyiA%#*`g3^3fM>pRG?SD}reQWNT8W{b%K>Ai#;z!J$m_USu z+LIB15D2t7FtKvbL79mE+_64_Pko~t+!mBJjF z%8({Og%x{zh6lrQf7HW=B+Kwv7?BQD6C&|;Wlv-z*8aOu&;mIR`Y#O%__J^TQ@fO1A$L7jw(-W^?)udBQgc#`xcb-Q2+1RK(cq zU!hM?kdgaF0(@Y=ioa(Be0L$Xfrz`^0qK~;!^H{0$snyI))R>(GLmn%W*!V=`0v1< z6bDWAyJV(GKFmoT%yv7z|42aFU@Bw7H;5S40Y4Q$ z!H5{KC_z3FV%{mn>!D;O#b?DyIEQfC6OV}`)5&!p+oFxRZ8X9i8GZ@N(ofMY^-n}zrerI*&ipvOcmVAOQn?vk=wXVpiM>ouGFJ*) zfAtEngN9Paz619q^jC%(n#%oeGl!+)9@qyF1(-jMgZZsp^>z`VuvYD)2bLhbdsvtG z$pZKr#!GzKr3!>w@|!Nvrfxs0X73zJVvv2xL+`=1Mk0}o|B`a6S2-<|aTa^cvRIGO(oC`;Us{mx$KSBPOfx&U|HU9kV0 z?rF|2&cR;bDVXGs^PwM7lp5xW(C0=T0^%%pz}^%G)_1^`Nn3AbiFT&0oI893dO))B z4Do%Tu`(b?*3tvQq9dsRtE+3v^+rEqb&f8}sVj~2#9|5A+K{^X?d6?$HWKM=v^0Ho z5>jdZrqX-z5R$&&wOZ+55P%On3|&wvOfjY)2(fzTP>4on02rjBCXP)2s@mMUl6H8Z z5zM6*uP3l`+C7u`I&E|3A~plV1rcg9-%nKn(=M@!u`Xf1}lQjuJNZ*8j}#kOqvq@>28X zH@GCtltF@sd=GkvM;81OOc?)O{D&b3@QgJa+*wy@bSGbk>+2hy=gePO) z64I2I)c{85Vbf6#tlE6(FqC913J~9Eq~x=GM>Gxv0%ZzTiIP|;FPqV;1v1*szX?s? zVe%S{&H^U6F;0!_xs`TIeMvJvw?0O4V(1Tplj4t=NCAs zlf6|1mcC0vtUokpMk^vm)|2+s9bGuqk?v-VGC_H#Nr(d<&D(f178a!&3fXeaYoc9k zEn`((Nwf-6rsiVDjf=Z^kYhrVXz$dI3fEO|0CR91-l=^X*cLk!>GpKBXNo#TeaACFKq6A@%<8smW>+B_)LeVMj>ggxrD9Gw3>GUZG!r}_Vzwwt1$A|D62Ph z8zHu>F5*o%YY2+gFYTLnmwJjYjX8H3{`73hb{w$OG^YNCMp zXMy5&(q~4?JzE{5J7F}nS_F1m)#lTzb6%Ko{Kg~mCa*8w2b$%> zTeqt0a%Yt;7aytUkugWojSZaS@tNH5>pcrOV@~fYh17`+{FCC_Rd3ZJ}d*w#Z$Hga(aW> zT5JZac+FJXgC8f0ij(uP%TEb|k~(G3u}%<`fCzLvuB7<^_Cy@5buguwAy&oY?zU!H zNfEOp^71>-Yukd?brv1SmPDa7d#9&LnpcMeyV zNz{||S-p5EbJ85H+%O(z6l^8&oH&zV)a0Iexk-dO&e9OWZ3=CTDtOOy3~kILNe^vi zei=%QHmbz4?j^leSIhb+Or{Ck9URU&u>>EdjY5ZKdD8bIvZ4~stUwP+FV%+UzH=*~ zU!lbvXuI;AX<$pJck!aGynMq4W_(#S4~qsRy?7q`;7%BY6>&9jKNb0ILh>L7wzrXC zF3B268rz%(!qYLtL3k^=8-kB_rKrXBEF`(7&F@a*84I^$;dsowi!FQB3b2C-*V-bI z=?=k&iJM9$nzoi99Iv;`r)HO=AX1y=u0eW$7yaHpO(WFW`zx(I#k@Ee6_|B}MRZ*m zukpPh@}=75&oFN(k&NPo$&y7 zv3b+HlVf4qQgYVcGq%y35;XF1q^zRoE#|IN9LxvOiVn&WUvsE~D|LL~w5PE9*kIp! zzooF;^-yH+BtHUQt2*9-8@r3}O%hcR)ript*}SR3tx`I$HiFtj`gy$x!)K`5l=?By zHcNJ;pnIxzZNXkBR!j6-19_mYRqVO0A&Da3d#m8bOB^*2p_(8ZAmc#qVguD~7k>KI zME(g0tfhVp{bsRkoZ<0+=j`}wVQPULIcfluk&~Mb$<;uQE4}?I1KkPb;uS zA{{iB-!wk_vj*VW8*in(9_ZL?uXn{=Oj1HTy167!dPy!AG+#dQPWsH82cA*g3T~2> z`=(I<<;x#4+U%$!-*OO>uU!kkY16e$&I-J@=)y|I`!hV{K1kmRYC^7yEdAXP;q9f| zOpRuEhIoQQ?;mY+Jlm=LlQzg?0aVhg|NcvLF_6(rt9_6LXMT1T*Jf7j5@#(pN8NS0 zq|-E|pDu}%2Kq8bmkkIV#G0P_NlPoEL#N=$W)9s3riPn5fvyOcb{U7MHBGpby~9vn z5W-Vc&n7wzX+}HEoHs1^$Q3(t@d`Xb_wqVRCD&&6{Rh|P8`y6YBS@hLEAdNykRv#R4dGHreFnTaad0QLvgg;zygfeC?9^`GU9sk2w# z^XbnWNKsD}3!#bS$6h*~eYV<9akr!62=kT9wRFvfDLnqM|&A*Yrq z1$d)6^D8!l9qa1+`e<}5>y1FIPf+a$9QaOn7VIaBE2ekj!#g^}&7c`tDC4LpIW zrD?87Vn0nYY|lc!p7X5^{AXfN@8xbMo_Ac3+b{Rlpcjr;-JqyDwA>;s1U(V{3od>6 z0(7lx>Lcdms^G6dQ$O-9Z7^;EPH^hvXWB0$ck9FE1bUXTvyGn#`1iO1Kfh^Da?j8r zx;Ss)4d2a+WE}258lB|opX84+u$+PYY~#&yh&V@U6yK_+Hp==%f;ebvWvim3Y*cV# zNU#r+bOoD_`-w@ndcLrL3%79GQ_l}XgoA!Q6kCA(Koa*Zyz#txJBu<>3M2H+ zfID}9ggf%WE#Bm?QhJ=<5D|KGvpe|29St48$-M7jwXdQcjegdpN3Ntt7~&Op>aP&h zqe58#^h7-DjguJ4J?#-C)2xMuE+w#O)LmLcThgThlx2DTz z1SI-A#v~eHZV?md=k~sd3SycrH>58RQO)glQkwa!wM%KY$0l6batpdn#Y2 z7h&Qg7Gb*OU#R3fZm&EY$X~nX@I*F%=*(Oc-|)ghAIa8{3qf?ib5Rq(AEjO#GD>sL zHrJZXU=W7g){2jGvdnl<^!-&HvxpvoDC-M*1^tZ8Se*QUq)mf*U^%7zDh@X_$xG0h|E|AOp%_Ks%M1E0^X?Kh~pCU7PaBY z;d(hSEPB)?`YhsIhKMJlSLQt>+2p1JBgW*{%caOVa1~Svqb@?q7UNdd&6bAijBQTU z*b6o|%HtRLA3lirqCcO4Z@R;;1@anfdiP!keU%Bm6v*rXN8i&{lYm?cc0M~Pu$ ziE$4lhzrG#55>WnI1w^T&{-w08^%9)Nl_e%ly}L>2hEHdez}M5altLf$UdJl>TGR~ z`!|AIsN$N~Yl==3AyG^{`-EF#`Cwb5G4yme^I@Ceb8T{C3ys)s&h4N#s0^3le(>ZL z_F^Y>mG{~i-s8h6+0AS|seq!LT&_n=CUNB5{W=5Tg(xVq)JWZ$01f30cfvN~Wo)!Bfk zy)9sQ$CoRAf~C_k%adXl7EBffp6sb+#LY;c!Ar8nO2NsF6LC{w9ALc_S2|mMyTnnd zEtQs?%N`t-+6Ow}7d=vr($L!9s%Lk}9@D0jS+B-sm}fn} zZp@6Ipvq0i$f<>+n_PL9*mR&GvCkU1r!^nZYC_GMXmgrqMXFVkgxjtgIswNdXq#H^ z7*+q|(K6IwBQx$Gt0;G8$mZeyPVVjR(Y?Pj!==j%RBzUYz`M57<=&yL@u;!xl`)b_ ztg*ru_SH%I`Nf;Roo9MyOs*1_q>KW)ryxb0+iaC|(8h0(cd{252}pOq#klTAgpW1) z&EtjHn2J34duB?(8xzB0oadz0-rTNzrNrlmcfKp;n2I`zL%CmZp}fDBIrZ9=medz_^oszy(6EVGzkX+)lr`|N%(vP{6m{Z#P!3yi^#(>o)HXlpo%fD#jaK=)lrdt{r ziO*y!@{IVxeoJFEuoQ0`+kG-B-^`70eQz|q^M9Ok12a*JLe$^*bBpJCCW5#_ygjgq z53!vN}t(vP}76ec1d6%De%s|Lww`4$${@wu) z2o*iowIS#mV_UbLzh$E%I8HOJjUJepc@DWu$EP#5E?Hv@_V85~+oPnbi$a>kV9J_4 z(lv5#Xm#8^Lo7lpJlfn>)Z!(a4Km$2xi zm12_ejkv#&TGgpB3h4s8-_UsWSJY{G3tqlbQ!a1nM0Lf|tul||!pCvMN3&L`?CSBo zvPc1X_E}wk=ufpxVm|<#2g2VYA8rZ)OrdXH5;sW7@%Ga5e*T3Pgw779p76<4;=IKUxG7qvM1tYOB32E5xo4OasbCgtcsnHLaPpRLaw$O{H{LHAgViczL9d z>gbL%2=_GfkyR|PW}%m7aH4IVSOs5g`TTQ!(Hwy|Ij;FEhbsNNtwBXvmnM$8vX*~X z9979mOcgBIN{;o*Qo@j}%q17(*EXkoqyxd1>H5Qf`pJ=@jXHp+piCiM- zSCAKP`cJx@E)&@+H!pZ%Q=H&`cE59|PEpEe%tS0{v!YaPg&tLO)_LK#&_MmPV~uV4*&S>>K=J~m2FiP5YC ze_9r-YOr(&X$Hlq;BCt@@3Lq< zprwv*tAg(`bLq%%M6)%b?9BOFWfFgO!e9V}qtE6yb@}mus)iLaS-;lqH)7A{OS(OY zAfM->DMSYoofC%o&e^x}wct{+7E28#ZB`TGt|w>cthGW6=pYRh5J zU)iDury-Pl#ZWb4AYgq}Z=KY${uAsE*=(+&3+DdFWJhRz24On29jZ%loce_Se_sqp{%{HXLtIve&)QJBuD#_X=V&)7(S@`ytaF=9BjmCbOQN9X{Yo{i(o!66AYzwt7Ru zlzzw|c}D9Fg-fpc_6sR;g#c&o3=YZ1zu#UXffUZNTUi0&DVWy^iuC9pp+6Afc=Q;o zV-mOa?gb`XdPdO9%Gz~!cViC=ZnRrE3acqp&BYWhpRgR=#9*Uge@if|G9q{ikmlkjWr?k`*lGsKi z@&6t7liOT&T1y{jg2O?9eM)Er$bWoMR4oj^{qZNl9G3qX)jz2&Oj#0gm%K=4f|ZiI z6rEI75}X^!A+${ASUzIg6~GEja7^t;?>u9WDjNm4sd(ZwX|Ys`{-ALZqTK%aA7Y)5 zqv00|NI*c!WdGf;jLg5A0z(>5?kP(dzBBDFy*L;R{HZXYkVwIuh-|drYoKVPP|%>T zXt!kTP-)u8;(~q6mX(2cBBjeb}aPk*=Vc+xQ9ct2VEGu+wz%iFf1xPHv89+9^zjp_(qqc>=c z@(6wkjIsxBQXlg2{oc*ey@b-ow0$u`^$dQ5Zr2-aeWw7lhH(Ep^d&U4u8qHee5=7g z0B=i%y@a{V8VSCW_lMx4=@u())${b3_fj4OCWHv#COdQ>lyko`_OG0LE;T;1pwETc z)$pE)IzbK1L%q3_c6R;-1UWHCxenmUg_8m`t9O6#to0Z+s(*+#vkilk_I+zN5*^~4Lb4NmW>-Hfbcy%G^KLWE{hY^6xC+nlC$i!icARYD`~ z^?~W5=xvzq+_19b1oCtwlgXMXb+`%G+NaL@7#YJHgY|v24XrZDMhPCF)}^@UI9L~#fcolj%qr;dOQT~*c`7;=&LwYjsGgCWoG}x{JkdL_MK4t>x%Yzqu5C> zrZV9kSrp_7cRPfzz#bb%M&#JC?onQ|CupNzPG*#~Sw zKE4ur>$N6_%%jy7B(p);8=0XSn^am_Yz=v49QlGp9Tw6j2;$|PK48DC)VmA|$Qsei zVzg%$N$xEo|1w$IvPy5x8?AGKrPFCQ^i>ZI%SL7wqTVrEp*6QOkz!HK#(c>>gIUmM zKB|qduf-tZwi>NIPG`4)BW7S3`NvBJ)(H-|6=tA@n81}=9Y6(7fL~MP*2r^4Y0k?z zuAf1*r{lM4O9)9cL^(rC%FHz3ZD3egn}b7DOl?U)_C+Gwrw9(n+v!yw(dy*>`eYAO zYv~%2TCKWy7*0~=2Tf_QJu{cdN>1t@rJwk19p*X`nC73ZvPfVp*6hU}cEZRT<~x{0 z00+rQbC?^{>32?`C!&i$zjs97{9kmMW75Og~>UH7{az7*DQb%sghrp8gwUSpg z%aW`S{+u@%A?bLi&qA6kZ`MwQEKW&`=+sWMk%h@|YI4LV-;dTEyB@3;iL`H|^j#7_ zKdelZX&6(1%yG-az1WofQ{Ad^Fw#Jyx448TFD18)abuqRx}9i!AtS|k!+dOMJURi; zN!u^m2n}-U?Lk3*={Oc=!8%+!r4Jme)%p1DmFB}ME!FnoEg$j`JU0IR@c-I zo`+{BexRb{F7p$;H`>F?zbmf`qQMSJJ9pLJ+b;tcUH#`qu3xn)zF&nF7oCe`|J&X+ zC_c7Tc-+VBqL`8Q?cg(_0XAgfsEi7qL?uLM*ZjSx3jVtg5TZJMhy*>xQ6=h8rMgFV zDGef0*f`P|DDm59Z|*>&SR-D zS1->ai>>u8ZNMT>H3raM$YD2ourCPGkD<9CRvjvFSpt&n3waV=a|IXI+>C*f=!4uaI9iHXG;z;j_Ur3k&$M(!(B@tgF~~e=AvW$J3hK8fP(`Te>m^K0mDIbkYSzdTXus0Z5dE4CgmGS@#Rsuh^DeiQ=Q;6f+ zYy2LIXqn~BMaKe$zn}3URtoee&kokpoAo=uIC5;l;DS^9_rj>CflZ~@eiT2|HAeK` z2VWGnM>#D86I`pmn%DhKq`MR}#e1p%kmO*XBf+{mqeiG-omc^5oi62A8NgpG`k zsN)Pu61uV($sFn`AU><0yikQGv7#PXVv&_$R#uoA=5T?YlqyH3G28H^;U)|>qR(lI z*u1dRs3AK@wTXF+iw;C#%x#IaDwX=k1RRNu$51zCrft?C+Q>O^4#hu6t>CO|+7*GP zc+%_k$v1y^#@*y(esY9CUV^Q{jy`8Sj0nm^1;Oth*6U&%$~K zmh{J*i7p4kSO(aR^!Cu)g(7JPF%ld4G?zap&N8*AV>m{_wN~XWhsNrO5;&F7L@t?$ z<0sP>H;ZsC)#nxSstZMJe({ZQw^`F2D6VmVs}O5!8K}0NV^a|{0hxjJXcQ^9J;7p4Oz#Gd z+DSfZsJeFdP&2NuNF!&>dp@xGv;%q?H4sV<8mYWf>>%=8z(RpP@;j>u|M!pT2gm_%#fRh8tfE~IOc z@g-bDsQ+dt3R4b)1evw%ry)Sjk3n(PTwH`jKPILirjpQ=MVx)!gpSTshEft7Hjx9T za0a%-i~&UoW96K}%S#q!0gLczn8L=O;IU8%oIx3W$cq;ylC`jhZcvLC2(}%fsvTv^ z!wf^z8ShM-#F6^R$?-3VlppbtTIgq&xrBSl9G*uDI%`0fI3m>?*ajN@wyy; z`&Sj2dHr4(-QYG4w&^*?T9p~muAI;yK44rA!tSD(!PLKNtJO0@(H@Y1xusU+m0dku zD+PTSi4-RPDP{~L96qaa8HH6F2lm`yFNaCz95~msjPYRXY%jnb8hNfK%%_1{3=x53 z%ooW^+d^^v*e%5?M&T;tN4VKD=539GN<*+~ULVcX27 z9|m|sUN5BX`*^#TNR1t6-&!i`pzW!3TNGnp2WR3OCEv4h&rr<7ddjjMl(>3*7sG0U z(x*cVj7y)BQch3EMyno`6so95O3>6KV0l|7vx^8HBb&h+-aRtvA5RUafxTYVAxM z>qy;vwqcjtoz2yj_}U8H^$Osrc0CaFhTmR#!t$nRs2gl5u}s=_zLaF~#on0GrtU@G zgi9Q`dui_2Zq;Xm+p8F^68nbv;hOPIM#mn2O?yNK%KBC0ejYQknv8R-yqx`Bc^Muu zT{XB7yL3v}aY3fHAS%#+^c0Qf#h|(p9Q1heHOpxvROE0boXWY}V8afL7~=oi0lsKw`FAb@q&kzyf>X<|99hL%<`; zVyA9I#EfOX$*=pKqM9QH>&3&sO<72ZhgA8@*2zO|F2>|C|0pp7N*;08S*1#zPd+X+ zH)6eVb68hEg|2k~hmBO#tk!=YT0%ApQWhp(A>p2QF#sj-Mq!Plp$jIZ8q1UfONFBHMp60ZndKm{ZV=4 z>YBTu$6bXK_&VG4I=Ru2-9bEn2EW&)d0oSvGO{nR6rp}{Pm6DfX5%XcqK5|X^W}JY z@N$`^m?y)UK^4zL)Lvxp8iN^y-Khv-g!b7fJ%do!Xxt}~@*hN$bM^EP{Q-+t=jB{m zrmgN^xeqqL^3AT`2Qkj_%|7bKj9ci1Pl0b`=PNl?-i|WihplDCXIVz^j{3=2ZiU*% zjb-R(@cB}Y%FL;Lnegk%ImAj=m2cteU)!c-{8OM0{dT1>sQ7O&_>F>7cfEM;b1|8xYElFQ_madF+o1Ja={Kvz8Cc$o+D2$JO^TZG z0`HG{_yMd7Eg%2ZIiE*1D-r(P`)Yyw-TnR_)E3IwI@lQeQ%{(!0sSvOm(S^K&nMHw zOxaQ3`k#nYLZcx?*r>8$1Z0S{?z6BW2&4eE%v$3HZ1zkLFBO$R!=|dL$v6)WwxtnNx?n-Pm9cwDPU(Uu+Gn~ z%8K(?1;F{!8b#85y6Dm3$`h!K^+Q)s9^M7i1#v4V(c)TQZ(PJ<&i$ndvq=!4hFAH< zD$AHfIqOKc3KUjS-{?QX0c}r1)xa|I%5rixjc><0EgCc=PgUA*V||L|C^al3O3(&t z<$;orq0K-n6+0WGUlM%>wW2k7mVq?;acGf)M=VPDcD9bC{6-uVl!!N)ZL(1tQC6h{ z<2zWMH{KtCWnqQV`Ns!c+Dna}&s_033oH2A#~A7c=klzg`%Cre^%Pkzl8uU7a;_-v z3-NgSq@vA=qpT=#{=-wtsrdTS&nY_eMb#!v}Ff^Bt_r!>Vbs^oTSnmCZCcfKj1Hi8N86hdj&G zD3I5#cva=_w*XIp1D%A%>@dB z@tp3{K(=i5_=4Pjp}`p@2fqc|qa>r@39R$}H1DSJp2%OfH7Q>U=D!{uNEpnq1p0-$BE=7Ho0c)3FhWEEydwgS~BL zDxE#0Nn|{@T;idMr&u^YJ>-z_n6#hyiQ$2}g*tf&8Kubn)_1U-q=a9aINzb*hpia2 zrQw%Zi@+}br-@K%0q6&X;VS69-E{;Y)HOBh1i=IvoDWxmof`K*pKN|&`sdn~VPZIy zmaw*St*z7w+WZ=ostslN+0+VXF;|B6Xhskt4h&(2L{FdPlO-y?yuJ!`FM+_7(r3RA zp6C!D5)hBF+#i7&v+WJ@AXS`Bg4oki=#AI2Hl#ma{wmQB^lUS50^eQ0uB4HghKG_f z{T{6R^UP{+$O(ZRE94fCZd6VC$L%TRSBn1qh0j2nY7f0D4ye2G-2tj+CoJBjKf0%4 znD?y#zuXXR)FgKu2JvKY2S&WB5v}Je>7@)}b3TXmtcyz?uC+kNst3U2WNjkH(eL4H z^oby57h(7o2Cwhl4W`Br$9M3+4OxCy-wjFp56bqyf*bw}MX*_N_(>A_OojWifB7(U z`A_=trsw?gL20UB{4(9=I;=kVMGQSP`u*SMHP7ka{Cf49UG#I__xa)j^=h2XQ>sB* z-QwpiD?&Yc)%kMcrNYT3j)fzk>p=nVjH^njqL`s)82b_ugh=fM6>=e37k5kbp5tom zJ*5(=gKh16%9@PW8Kn7SrDO=DW#AeszIBTDK%o_!N@8P!pWd4C6zGwU5e;Y(`)_k4bV6Ufv=Xj!((u3di`&k^mv()U?*cK~v+;wTd$R z(2sZ@7)`3Fc}7(+?sy34zm+WVCFbj56o2R@jnb;5q!)MwB$cPh>(?QJ7M|&#_(%$~ zH3oSsn2Rfuy-qorl)Q5*Xry>97RURwybH|RyDCV7BehbV9|Bi<>lJjYUMCqRar`|| zsL>#KtYAo)-f(Kk1F5qIlS9@@jXAZ8L?=GZPEx|Q=N^C~J1bMB_}CL0mTxino&?K@ z1?u+1ONVM93(rw_CF+eTT#BU4I>QJ{ z0t?I0C6b78$VAT*NvEG8IxQf>CuYd2HV*@pbOqIK0JLct7UrMaoIA^D-{ZpP)5!`Z zwo&U@lX>i$8c0LdD<2Ji#0JjVBo1 zz;Gp6rtc=U&_n%rd4Oz$^IH~7kiCKpWruQHpn6=Wdt9t+ybs7EU+KsYw!*4nTsRIs z47S|wOff7>D?o3#&OkNzLiI<7ru&V$*{K3#5`ja(rxNc!bjw}rmsFOu(_6&8zPANz4TZPx$a+RW`Q)fEdi(S+6Ht1V zUAn&;=2dd0xLxTo&#b@bArpK4e$7pfOz$O7$|mB=rkv+Bvfw+Dqpa|WZPuP4$8#nF zLl>70#`e^CUZLYCXy)M!1$;34RXklsG!M0Z%UW3Kaf$1QqHUv{KJ)KMyYXJwu-}?y!vuO#)r`Ft(Y!C%StWe zYvp9n*mYe3dr3?r1CEB#Hj%6hQ6YHx1x(F28F4s1g~M4=bWS7;PHQyc{hu(3`FWvIS3 z@Id}gQ{NvGR7810IOOB0&anwkPhWS?*&#p}6C2QXTcs(*&IGBjCj&BkfR%xg5AKZd zz8oeMS*8TovRP?1W#K008a$Vgl1K174h3<|ojc7{RanylrzX*ZhQ`s0dfk4BWgh~p zxUvD6mYz8$`8vDUdJbA-Fv(xzxV5B<5zTV<>!jnd>9#}?OWLe)7<{c{&7+jUk6b|( zGq=Pew)oU>{^jRp+!uOL4ME;sxPd=kcbHl|>I1Vcj%bex1W+B&=vICghWw%uo}V@vn$Zng_5okT9BFMd7uA=6xyylE0UIfC0m2-npv6IrIL2&dm-lDvW(-LI4A0OTpzf#U)=loU*8Ff98(F z?H2sGaIhuYZCN;{b4ENT$jhh8_Xo#_PY_(Q@MX}d34~fdO_T92Wunw^3fG}oPAqzi zcgZ#qvp5Q3+w&2XbS1UH2LUwmjY2$$@!Ut`C}b^ z^tR(B<&2Z|W4VOyCfIToFH=>EWY2W`YHB)+f{yy;^iH)Y(2t#7Nx~eFs2>Jlydeu; zY|Jp3VAa86FE(1ElZ;Vcn*qRX51~H_j|w;BD&67sz!;WXlIgBKY05b1Jq%7Ou}qY-hah1r%ksv{Iy?L8)IY$&G)6fB|dwtKaJqJ zDeg=>?Am|H(J2NwlZhv6E)fR5&zV`dNY=#zv~>i~5WnOdMigLsSZ=WlA9kZN%A5q& zT1OTJ*4JLlBfDrW+KiQn5$c?Qc6T9q2%e553aL3KP&1$`WP=x%K3RYE@;ce;p~hBsJ;O zay%`4kW|ctY>IM|2&sF(RGRhIUedbO2mwfT|M3c$b2_g4MEY`=b1%VlhMcsF2I`dR zDmal#s!$;7At2Fn%DzMxSmBTpcQaNdg zAeC(16evPF4%_6qB|Dwu<2I4~*1{(d@&W+DzF~8&4&fm%EtKFo-*2AjiTYh{)?uf* zVx4~xsTUa^X|XOhPwRJ7R_QwIcXg??8m*B+>df?*%|tVwJ>U))!#Ure(a(4f_RgKXHzxF zQ7or`#thg8$`^hA2m)sK0{Y(%?j4{3F{y7`-GJ|Eo&W0HC1GM<_kTBcwuY6R@(Aju zT6?>C0{tplir^|-EY~0!SW8I6Fh;@;u&nh#9w8t~5CeT{f0~Vi$qM&)hHSot6(_CJ zBuT%R4Ki7v)gVc-2hIVOvwQJOKHtU#xlB2I=IrKlG=-i9^>!vm{`37mTU{L|IlSKl zZLf~wr3-ppuv#4XpuLf6gyVfdXwM>9tyO9peT<)%&9n6Mau|Xu*10@jhm05nf>eXy z9|qlcadnNs`3yvcSR!H}p#vCwrNNb7b3*w9#GKGC48wK`gmIYHt`1P9H>PKltGek? ziMp9`#|}*0m;Tp#mjYI=v!DJ>7aDxY09=XKreoacl7%rZOOA#0Oj%en+#(AvUq7+6TfolKK>-0N`%c+=d5cLx*CP}@uIsj z;|#P9mNm)5#sOY@!`~a2s^;0l?eBgQQp z{aVrXCazQm)>zo<7sf5&`oR)UcKS?Ryy>!Ip7sjG&!RpI$(d@;*x82=1G#mqxtH9t zi8yo9X?Cz;e@9Qb$gd7@XR>~ipX@ChNwv1E3)T!8+ z>T3!tW2u99khC($2@alYbFsS#GwxwecV?1_j=x#iyDI*ukfotusPq()a zC1(b%db-@Yc{oyMV;;)axyx%9BQ*Fqc7bzzVx542;w{`7jXZa- z@{F(uRI)#w^ix30qp4}Q#R7dsw^u+=vt@PRUeQ@=h~i82MlnCe@yM+C$=m)a5qm(G zc^QCcxFbQ>V0}U}u|Z|N<+!4W$wF800Ev^Ob+$oHOJ_Kb8h~WBbeMF-vS(vXX%vw) zik-Y`QQDUJ`1VfudEZ(#UHD33`Jg_msnQt*fy{VeCAuKe`_~oBd0l^THm2a`j5w`& ztQ5ew8i2%l5H_YD01x`0uy~0<|B$NO45sSEH<-;ciHm=rdJH)^Y+pG5Ui%ZjAK(>q z_CmoI7Q2V+hLk%n^2gl^$?TSrCs6(yBv+`oeoC~L@026Jj`aIScf^u$SL}Ar;355C zJ0edoH>cI?y=VHmnATLu3hQM$SGp`i4Y8p?Rj~6pR(AP1kfRM_TRBI0TCzk^bG9De zxA}1aMyuwx$;Kq5Kn{gJhMgcw3H<)O2?BCj-w7n(fTYD;%GQo8$22{c48{y&U-Mx% z@^pyfnjFUS)E9w|W>(2YHwEIN( zOA|~u?IMMM?x=#OkaoB-4|!PZ*kc8!l@$NM)!A5WNK9xd=VLgX|3H=0>LAp#f)5Ke zz(He8oW_IF>WJHU7?J5gYm%-m)s@pwq$a~ck4{&dNaToI|0~90THii&33Wt0+?5{B zIg`Qzwn3{oiQn+9^`#S=KN0?m1*4%+oEqz4k>S*%QG~_3gf{`1aHY^2sqb~^AWX`) z3B{|_KdBsX3+2kjibBd%SeqB}@R6c4`BF7YfI-g}kx}<+2{xWnJ~^@{KPw9ULihk1 zrN|cP-4^lH*6|Pu^_E-1UwtfKr51OG)K+hRpj%$|A5t{d?xAP-(pFNTA zuS=U@G^SxSXlK%A3~Bi}xzZ-AJs@4srfJ)w4;9C3dD@q{Q&t*;>jrHC-49Y`6&=wg z%N$Yo4Gq!iUm&N<3P@1^NvRn_#enn*Z4%GqjF@ia)!wk@)0#(e&PS503dd5m;|z=` z?d$KUa^u1po}>I-Xg_dfK2iv@$6+PU#Yjh<*Ffnnr`bFausNNGQyze1d=I4%UR;g^ ziQ4Cp;FcMIG@->)W_r*-6+&O?k);ajCbty;ZMlsSMb4v`Gh0tx@ZL#2u1^`^5HQpv z61 zlcrs(GR?)l+F6~*ymBeViCvO&?#z>TXia;1TtR^rbY-@ z&vMLQbxpG|J;8FFTdfwxr@+Qr|7JLB&t+Sv{4Hq*zI7Mpe?9+i2Vx_ue-czB>F*B; z2%n~Jt6CLRsu$QiZlwXkhP)C((t;Ey_$nUq7fQ+p)kT{4u3vHFeS!SF_@vXrdLZ=Co6B@eq3yK5(bp9EGb@<&l;q&ywZ_F2=yaWDvv>NR zv?=-yJ%!u}qQwm)#X9%*@tYDQB@hWs*bz*74&>QF8urscb|5p>j@{%O)9=<9$BEW^ znelG(z`FsuA)Av9FFX4@o%bx3HNm^{dfRUk{Vm?%M6b@>(%;NNV_|4KysYp4G6AE|l%>uC2Y z`*Le@>i8HEI%o?7>SsS0No|k>VNoX`QW!=AQ1dmJCn+}D+SD}|QiYPurF5Oz#yZH6 zY6)d7QWA|IOWB1C7_l~Qc z&r|Tkk8=A-NNz6Y!K_gM9%#q-*|}n)8j`26d~G;hhgNmC+&Ju;#Kn&U4}lRM^1E9} z?Wg`8Z~n-|KnJ(c=8N+^9CE&3J@OVlno#+PJ?6Vvv!h#1a=ut`CmzdQ#Y%#Fzu5cI2fjoBzjO-jnyel^wsNGGWEe0Tl%QjTFj)x1 zv=>hKn@fp`4Y2uNAv+%(zqO?^=eiQK7n>dEl$_?D!>UxVUL|VGO}H$rtVjdfguD1` z0M}{wd5ZY;n2PbPYtGbC(--L!$Ta>LsR~F#AgmS<_H<_e7}T1s3`$BK}4 z%P>n+UgWWbs?fy~>{4NmC2|Q6J_Ny;wUInk5RUrn-|K;YbNZ?b$43+s5FT42niZ_PcD7f&PVd(r@K#9+(_H^pslJW9g*n?@f*dwG>Sb&V@=#fGhFa7X z>{jgW&y^S)K?9T72ErHINXGzX(_fe=5Hi?$8muZ9%R`2U)tRj$y?B)6vPuSx@+6h> zmbl_DI73&HkKyhe=0q7%s+5hal?TBp@&sqJvgH9saN-7z1andr{>QDs-LHx*n~TWu zX-L&n$=XDU{Y%_(uZyt*N)pr9#}#PA45a46!i>ymaQrn~bEqRS&E(vfWr6%a$ak^3 zO3VgDru#Bek;=?-C8j`dqq$@?Y5HKkgX|z`aqIBWys=E3Cxo5o@pXmoJl27;oiEJv zgpLU9srqm}utd@ca<(r7^)t5;VCNjuN@OpTWPVaNY7I%BElyh(=;`+_WHw62kID zj1<45j3&#T(O~6cVXesMFM*tvf_ET?w|pz$S?k~P^~}jptqJT4>y|?birBS^RVVp5 zDk1X*;$qWMYQ*Ut>=u+YZt%2kd|_xM&Qj9Q19_CR*W+9@8y98P4;~TNp*15B3*I<4 zCw<@;HK9pjHC(5IriMfFU8KPUJS+)jXWh|Boop!x()m|lRii+IH+SBtaV<0pYK0vS z1(Opa48;@+#rh)KaQ1jFvR&;M65V4<{Q+2^spx03@AO>mvCUe45p@hI>N+kWc=ZR2 znH(Z?ABXiiPMiL$<`$FWdLjfz+`D+6)^P zjI}E61g-??2diF88n?YYN3-{_ri$BQjn2#m8h0fYUcX~8ThF?P8h9+V(iYPR^AGZQ zh;fKjpsP|C53e7Nw;bcQAdz#*8WF!W^>Pg6af!HM^TO|S zpSi61ejq}G=ONb&?IyCLoL8+c`A-Rx>+4Vz^3u`1CYaCQbbK4VTF(7WN; z?tz-#h%&;`Mel^KAF6uJS&hIC%YM#hu$OJzZx7oSF97F9gWo6L z2LXhgaO(HT4@n>H^v(=bJO@9c`cQ87UQnSHjG7X)S~SFdcJ-q*MJJJYq)$a8*vX?N znd}!?x5|X5?zdjH%f$ZOXSi0dX#9pNY`>)uwY$M`*CtBpky-MfBaO{0 zwvf01%M!mrAOz~yv{4&ITWe<3U zZ^xYcc+PF#w|rFWTw=_^jv@~OC3^K)Af(*iKOZ z4)EB`2OoOK3&NZ1m149CI%>0+Q2$Mv%i4cOV?28o+?a*$8KRYZ9*?xIOgjLr^!PV= zCw!yxGS18Q2W)M?dm)8klYxQF=TvOGi;5(?@hXP`4bb=;8x(??7rHrYn_CnH82%yGC* z%w0OT%OhH@) zwaG$LAbeE$N?0P@Z*E5W)^z%812L3ZE}~rscakw7koEyiO-A5!n+ZVKPtHSU7UX{= z0HAR{(4qvw|L-YdG|F4^eCvxO(Ese{?4K!%ebZlsZJh!CB(GgbTL2_Qgpn_Bw3K42 z$fbhk;H8LKsZ<{fBg@XX)!`8Hc`9~2++B#s-yQ9j&BG(NvYiC7owxrYT4oJ|3=fK& z29r!qa;Cpb`IjV|sH14Fkx@<02nQ#_W5OW5iTw5J4Mx)* z;}3&jX-h!u&3K}Le!KmlWDC6!J5phMT!OgXZii=83ozYI&*|SGIMk5-oA6nYYy*2F z_O_%M_b1@MkNKxF8qVZc47{&I@4TN@z78s>zjJOxXE5fMv@(O(1MwjBE#14_Q1P8b zorAk;y3>CI=tvFAznwQz?F$N9PFFno$>13EzLf_LiG=^DC=+@l$%dw0TsiaL`%y$8<&$WS>mQHgq3Y#>mY?eH+iQl+ne6r9j z#*!`PgpgSg6gU42nQ&Ssni)0AQZDLIjO&M5<8j|5CiNAHC-O`PqNX^*S+@YqIC zZu!diphBuR=31c;#{SxJ9jla_mR2^ATVuT3wmPsvq_z52@aDgfh$F!J+o!+7&){44 za{mXK_n-af@IR3#Y+!9I^#4?Ebj-JLg8)p3Z)$=-h8mAZ@M%A-(>YjyYPp1jO0B-K zBS{)`JIO5o*UgVlWr#HyLn91)qvvR*$Mx-s-47c^I4c+f0cgZ!Af{K{;w&nmra#Q` zTqh}BY)MCzrr@Hp(K4Rz<9wd<2A}DozthsaZ3iQVmV742T$PRPz@1J8gQxj=CHQlZ z(6IlZ$5Z^5*ZZqnMLp9|uu{ASK#LHt)?`+rwU%-|mjt!z~rb!2q}A2M6% z6i_4qkvAa=L}Z{4joKvzeK%Sx8EPqN@4AU=RysQD=_#-|$Mw%}A4=cenW_lhE6%H@ zPk*0F{<-O`=sgwB80mWhv*Yb_?ips+>%$qdo=>=6P}o>fT(5Ro;ytgOv1KeJ_GHoU zxA{ynRQFl0NzTTMiNoR?HIvX5a2=(42{G3U4r&8gG43?x8jH0>dqzS#VQc0PXWY&; zj5jQku2N z`Hom1%&!EQLARNEfEcaa2W2^`@@;eJmQ85Qb+u?ZM#}EkN3ynPK7iV`SC{Rg46MdK zBAN`700$B{)WGVOZ<=p7w{F|%cX zQ;1HZ0Rz#1QuBC7Kg9g1Cpy$)Sitx5`*ea8G~XlCv0>(yR~ekq-nU$#khrY zl{1fHBsm=H48678Xi}((6Z{2n7VL%uK&i2+u}b%mVRNxsLsWrR><485 zoDY}Odi6UED)+->GwZsh(8tbx+zHX0o7`e^daWS7(k4qS;?z(9GupoD1d9MPSw;2` zwnpW9sH||1i-TRCO9tuK75M6z1M7jUyOL8crcPie@T~leR704I9Y~(aI||VByLv<= z)Bu@i!ZYGOt8_S%0a|D`QCaDSD@=G6jUe&vc!}i1T=%!@Oh>w`x{0dtmk!bi7_TF+(ON~_*=>HCi6V_-+#vo$aD$o@lLD7 zlh(<^@QS{Zs~Nfl_E0uS&}|!ULEzq^;g3XO40lxR_Po@RNO#0ZUJ)x|_(mNX)s|B> z724Fre}cZ^$x+b$0m&X{PczxlcxgEpIPv|6s^&EgUEqHYo8FoAzNhr~q_`w5tQ`Wj z{yjU!K%%rLkm3b12Y2TLPr5$DvNgi#;Ya;I3z&1QJ$>^Vz#ulsqJ@+4geU$xnl0q`f*!PAT^&;B$JD^ganY|-+ zo7X%%RALZ6|6++)n1J!1KuQOunVfO(j-&AM!1ul-pPBj7gzGt?K|}8B>)%YoY?J}l zYv1wj@E!mE3846&$K?P0QFd~$_~+<4S#`@1Srz3g+sme2cb%nJLm_fW=w4AGk}{$U z;v)}DnW#vmtkjx4wbrEL%$lv~^)!)5$XUcx>(h_#xyaDoNo?n%aM96KIFgpxTK}5! zWc&Vw+id3ZW9G&eh(dsZqj;Y{PkoLy7Dx<nkad=;X+aNU$jP;#awo zvvxK2g7kzMW7rh!Ry(I=RrtPWjl&BL$(EUj5d~&6@*C7RBK9%5wb*7ZFseE`VCHlJ zuNF$`^6JI8#Sfcq{9U+0ILO)#TgYp%R%=R~`frI*7<9>{WkohQ`d`%S*{*}SZW?Pc z<>Ea9*id_szNips3Tij~0TUfXg*k@E3asN>{}6b_ygjUAR77gFY&y+PuCW@_)-dX0Qp{5=Gq&6fx)wNb>M~ z6-JyVunzE$)?M|B0v|~Pu02Cz?PlZhMWz}jV#LXuQnAq`+ZA-u(CU2pL?Y7c&VkA^Ad*_; z4iu{FFg|Deyo2~tzw%%YG)>)%;6PN4ahr>{TaF5%Q>^R8iBW0aSSYEp8!Jpg;d_Q- zvZ1<`#_Uu?2b@Hl-zs)-_t>zvOL9i2J0CmxwDOE&-xHqAkOU=sQoP=Xq}@yY4`t`r zoJria`DBtzoJ{OwV%xTDCzD*UZA@(2wtdC6ZQGcbo7#K##on);t?n<-U1xXw>pbuq zU`h9mypf*>yg|-kbeGiMGd^O~2kkroNPSl?ybL)dW{JMo&|+*0k+45Q&5DOw3&vS_ zX&VyW;w-@HBn9 zopd}S5A<7UoyM5@^soRD4(a-YQu@S_t~1ixzhzw+MV=ILStI9KQuD7Fq__9EHizL~ zLH+Un1TEQzu-V1nd;BtLRiJBt@H=?5p9nC9A7<>ym86S;8=myI5%my%ZR2=0fNPHB z>t|UI;<~pgM0|l+H^}GkOL)gWX5%&2=!J!KDpt}yS^JB;DnjxOyY|#J;Xx;~#);)N z;)#D02l587!G!Lu~4W(A9gZ*WqtcfeX|I!_5X(Tg`%_q5%Tc%gR%YGdI=#BNHwp$!+cZ=*Bl&caA&_~M zHCSS_8WZl)c%JEM*@X@6I1b9>gl4^MXqjag^*ESu&pM4xcwM-^T!G}Jvb>ghJlU9o zlrBErx890dHHm+_+M($vO{eNE{S52iKnI1j%=zzq4u@#@)GaNX*pWtL(cS*hs!Ot~ zi#y{;7HyO*ol3cw{ou7e5DSKUR1Bcq4-P|#3nFw@SqX@;7Jl*elJS+LBmJCT`5Y)ylk>v@hGvo4OmZ3k zPS~qd?=mMzIw~RN7y{KvOd3e{8U;<9AW}^NOAF1Vtmo^nt(Y?Q}n0 zv;F%8Esi`S)MpwI?{_l)-+Qdvm{@R^m0=rV=;psR&7q**;G+>FZn2i;^P;e#~J7(uA)$f)F;Q!jD3n{PQU1>0rGE? z29Yfiw6DOk{)i6&QQ<`Rz_OR?Pg99UMQ6!Z-&4Ox>K`;{B@iSGSPB0vHku)ENUtD( zfEa!A>HjCOy#IU~|Iu!mG-16|7Sq0R(mam`Ndrkxn0DcjMr8~!dw%cM34p*KkCoy|E5s(+WbSl=o_Ar3CJsWs1qR9U*VAXyzrmKZXmF_C@3I5aIgODeS!?_<7>JLJmTN)NrTD^5b}rgGr>XcA^Ana z^aA`nHey0K(DH6eGoQ;9++|$8R9y&Cnrfi$MgFSDjosMRzd7?~ z4^Y0m2g7YAa(9vTw|uz4Y$KhtJ6xQCeBw>J-FAZHa~ur%g4YTheZlPrrG1S@TvKDp zo;vZ&r!u|0?SH`RukD{|@XW_elDwh5KQ3!AS1B0vpEFA`XGsipK7%eZEol{`NmVhm zx4HkRT1B(Hz>_dVBeOoym|t~SeJxHdp0reRWoxd|n|EIwdq|-uorKxP@tptAWX{?& zEB?7>gB?Wk#!UP)X?rzEa;DVoN~YutwrW&P7l&OsJ~V1VWo(krdCHZMSI!e7J>p}+ z@&-FB*2mRELa!>P6eJ2LNZ^)GLg7xQv$?dgu(qF(yZ^vW$kdc*(Oh~1`FcCgZV@u43+OKV+0H({FrT8OG?Iotr*8;N${nk1aDO(4h&E=O)RgKO&kM%8cZ^}`0r~ow z`dXig>Dnn5MbQ)q6;$7`2-A-D)=_vbT|n+MEg{hWkBI6g{0N))nN4q9M1z z-P(sCE(gtp=K5B_;78*IbTOqp$b6cis|T(V=KN9=}c0SH|nj4-zbF6F2cUsWT2wu;#7n9%&`?#k`R;Bo2h^85tme#4pc72L7 zGNkRv%u9C4?p2x!ba*&ABWu&COkq>1K-2N02(zq#Teh2-BawfWvN_e|-czz)pbKiF z=D%qcOL(q}nrOb|RVlYr*9xX<6$LV%=>|#--$5ZvUd=S)p9F)}C!`zh zqtwEr-mzrF)QJVQ3^OPFyZztL*-_t!Jp4OcJN!GYJy=TaXb=63G#LH(hc_^tbEJp5 z{)rmvQ#+U!s8y@SIz#_nJ%mkopYEqWZi?Ocb7{{IOcM_Cnc#h>=lr?KZ+jP>ev9P> z-N$yv`n|Wuyb;R{k{yd9K)Mr?4b`q74;Atq?Q^X{C)k0y%5GHbLH6J9Rse<0a~?K= z$3>|7TJvS3D`WH#x&)QhbCs#9_c2DQ02&cMA_b!Ksxxm$C2@?j;mF9hnc?UnSZLdZ zT$C1XyFVZszhuol{`9ku#Q>k#npsWTEI<{l=`G8L`pttR#w5^bC~U@`d)&1m6Ki56 zn+b&&TEn(EZE5{tb+axdjp#7|L!J!ly+U|f>-1f&v52e9|+MJKuL$XBY zx#3(*dnns_%inQ3f^Gs``$rKVkrb~%@qw=04We?@J$o^-$Y{>E-NTcavH53qqw+p^ zq>e2w!Kfw8R?fr#;AQN$b-zIOL*i;Ame&sL-uQ5URArBpPgT6@FYK4e1zDidToWtv zm-as{o%CT#y6RYL5n!r*rOrlcq&_SMv%WAQLBJ;|?1Muz=#&5)_MREJ(Tc=LkH?gc zRgYLmkM=+!`RY|I*AICks4c>0Eer5xnsCbv@tvBuq~2Zi={236haMjl`#XZ31-nW6 zNN(_b5UGnKdvXS!`ELaJS>~6R8&q}z1;V%&E=nbAka5eP1MiUIyC;)7vp+ECZaY$Q zCFF%eAZk+#Z!>!GeJhw-v;Vqp@tMVC7hk#qs~PGUsyeoXB~Nz1m}@{zCyW;LR=$-B zKYJeYdT@!!Hme1duk4~3eL=TFjeJZQwF-C$PG+MttT3mA!{I--mQGAj!5g@Pl$h`! z30a$yuf}3VXdT-AzUd0dLs*sM5WHnu-~g2{-RX*}ycM(1%5J4}yh5yjf22TWiD*zB zjdXcc$mjP)c>qSyN0_+BK*bPv$`Q`V5sZyHY{(N>#33llFI44|CU-|655+eW4VD{?$7#znt*Olub+0x`IsyA2&`_pD`##T)D$yP?~M({!N4-#-*y*& z=CvXoi9Tv@Oh?~+F^yyW(cSlJAL;Zr7xWMexgs?Z+Z%!skN%^jQE(kXFfptWcW5-7 zaEsw~CK_SW8g)H`RyvGK_ZvP{xG9Un!BbKrQ~yW!yIi}I-7`D!5oKNCJ#2KhkyBS> zn42}~HYvJlhHcbB_-XqE4Bqx3>?&6lQp-byaH`yP)@-F#-yRZkOuskCJa~SEIc=P* zQ}kc=fxFDHrQY3Rn#NJi3994$&Ji7Wq%Y4nts$@$Q&D^#YPap&=q(agTL8@G-+wEb zOGtVHT@JLtvvP{fzvL(|l%#}n=4i3{*`D4pS{iX1GJ{()0o`aFq>;+@XzPMxLfiq! zuf{oSPc;(k@3ASn!jH z2=Up>_mD95YcUZKc0cIacnW8(=n&ym!#vFT#O595Q7IG(QK%+Ss4FWL6&qxyM|-e> zQ7_0emTRs|JYje{v2{C*9pXclS4BQ9Ez=wmOjOb&b^!q-Lix(7oMmQdygk`3=;0lxs^?_=X; zyrKNW2mQ?Vi~QsVEgN~*p9Xt8~NnY%h&XK%*sdnPZ;3K=GQ%6qE!EDNae? zSySy3#Z*M*09i$&1n6qa8umJej6Nr%F8)ICR#<%*&#wiC(a2U#nT3BL3{Mp0MHCu? zEzgeqh>qz?JRDxO&lG*c?nazsH?QNnYIrwg@C*xRsikZMLe`=p&P3(aeM0puQiC)3 z&CFydje|d}lqIdyx&M`M`%6Bg8(+QdB!a=Ixr#)bh-$C5G`Cnjcvvgs@CRzSHZECD zhYj+X$~rEwR6}I4ZfefAn&{M2_@*s3`-|;1&KD%NYVVR zL_AAnh!4)IDfZI6&H{gIiri}ET$v5vU6QG>@a(G@a}f^ zhSQb}R($#dJhBHbA<$be z;#BDkVqPiv@_d5Z7p55t^@jG((0HnRf{qs}+{8PJ6Fqca7Hn0+UbE8kw-gr7Xp4c{ z6~<@QO>$XkDHY6TFszkatHJ}ibV&}as=ICf+m^zQU!UO*e3! zjW`+tPqptpnF?VXic?t7AG9`&1X}qb|{Br)DxP?1wMY@XT~Hen50o8_q zMJ8x!+27NfGfe@6lan#98?%qGWaAiSKTf}|)&kL%yUBi8Sc?5@h)7t+YmPI%zBII^ zYCXg=E&`0J0Kt#Hzwj4BEA#z!sQj*|gnL+_QFM}057PZ(ExAnEO>&o5Q6h92X0Fns zCaXD59I|2xE3h}KpGMu7P*Ub33F|IRMB2NUN4){32GW%rUtS(~>|Xi-j+!-@qG z&P?2l==(s+n!~;+% z`21iYD)}RKM*3H58fDA*dc_A3y1e5H-uN&GSp7X934}XBBXvpGm43RLu?u{rSJr~x zsT&OrD}ju2&_9jn*PwlZ`+faaaSg;JBk9ApEcXZef5tjgb~QG(`@iCNmWsCRJOk?I zhKXzj1p3vJ=g?Z^uV6AlmcYOvfrK9taAX4+8R-*)vSMd0d#*P)zvw%D`w8&;&VEr0 z-ET~vaWm5(degc1mz8m;-`)KMQXA<4#>{b?8~l%rj)Nm0f{kt!Xw`388Uws*!i2+2 zE})SYYMPf;;aE@#3d0UIk)#-GnwYyWxc5?@x_kI+)-ovFj4NAk#j;_20-ISgs#R;K z{*xMEM1_y|h8M@bk0+YmuZZs0H0o%65H>fb9pC4?Jg;(45src%R#i5|?h?52m_l(- zj%6aWxvcm(xF=)ZzU`eUJ z{|-@GLx#{fPsWwr%%a87k96$%WA?LLWy@`049N@8#hl>Hil_|NkIu2hYwx;cUmMn1 zS1DyMHZ#T*e)XXLc;?010?@D#OeD|I+3T5>z$5f~{A)_Rs2*{1S2g-PVgd%*gUQ=D zafzhF;l;_I=oNxQ7hw4Untby;qK4Qt2%dJlDD3=ix1ghUqxUrYE_XTXll-{_b&@_4 zAciP2$t-5I?UR=Tx~LOVUd|F%(I%F$eg8|da4CwHoBW=i>Hi@s^FQ;$^q&<=lCrcd z%D07i!)o7URfsb2si2Wk_HVrcp*_@|5-7~toq~Cx!+PP;Qm-b)@aaDPLm%`2sQnQn zp-Fse@-KO5Q0jncv?XEn{?B3AXl-0rxIlt)hCGA&Cc z@N*AwhD>QAx~= z!7#!k<#|u@&@Y>_F7t?#IYKz^vXH5aHjlWLq^nV$^JDq1mKT*N_eUJIe>U4){;LhI^n{wiI|dBe%oH z8ko=UjvQA!M_yY{7@>~tbgv`sIz-qzOx1saIZR=_CQyw#qPP!F|I2k_*uep=P4c~U zQvm__=52!5I+)U1xmuW7(K|btThW_ZIn)0?P4@qLF8(tWi(b&*i?`LMuh#L6v{6|o zzd)JaG-K&$1{j3D>q%(R!6kngDdNUUh6a+571Lp3k){bb7D1EuxJ)@f>eyBG08idw1FL`=&Wg^PW3qANyt>W=6>4`Q8kJkXe+W zN8RtEVjmXpz(^tA^-3G?M-?;1M>d&d@(jP3{g6#;Q!ZR2;m?vvAWb8Z>{5|=$cr!5 zbV?_{n)*9mG=Dnh9h_q_N5jvaN-OENfG)L)>z;Lfd{sb`empFIO?r7e{?}B(p*T{} zNU@GU*jheoj_LAh>Z|A7F21%-=@$;XOY*O`-@smtLzM4*XFApxq{FFe6@@9!U zR>>~9&P7A|}J_YwaC>;a`xaf)|&Qz4Pv1!%&T$Y>l6PZhlP?S^0EYL)= zsEoI3o3T_?o2-eUF0!gbm94r7s!pap$S$%1$}N^+%){@jSXq(MY-Lu5%o=^Ddi8(l zHg%QT2{$%}*`1Bhe=iSDE}lJg``?=$Se4O|lq6E0jbE9On5n6fRhHGhZ=|V9bfgMm z)}$ab)!8y$i%N+obe21>R%`xmTXv(5ls_IO%sz**kQgE(@B;GS{LezC0^3^Bs$lyE01Z`CNqG)wNR`bj>$#7AT@|`=iQxo zUNX;QO_!I&aYRUX#pS1Srz)E)3UIQ@lrR<-F+`~|49`vaL9#*slLM?pi>ej-svbdB zF)Um0c)6b=zCYZ!XlhH=`^K502cuj$k4HsOs;aS@!RCzB=QH%Lb|Hk3ULRyy7`BOT#NGGhnGU6!)(^t=QETqNJy9`(01S zR7|F%&1%wH4*RXRD5p%@Co61@*jClTCQNCQ8olN9Xh(THqDv^-9?X` zpJ7v}FnTJeZN3)&z#r_ZK>r*8BrPthq=-ipz^l#b^FHe+NDo{;;o`1!n)KARf31#4;g+G)YFdL$VorNMTaI0a8 zgW7f!?^zTnbD*q}=<>>dq%i6wi&!k7s<5+IM`skmA^2Og=4h1!IQBVznYXP$L#})_ zxI|8sTUwNBpPMQ8iZ)V>_39OdwZ@%Ri&YRVx~@#1VqOkqT|IulKTe=sUm zzLq~VC;-?+mzSm;()M3z6FVErD7*J2jH z_7Uh~0U)<&vBx2I(lBw$^fB27#r=Ii5=^B#eWQ;x}b?Y~SKSb%*Y9~c|Lj|L0A?e;yF5RQ z=B4|ZQclq_UKN{VYxWobi^crXDeO07`(^8G{lzLe=ChV;opQD-_hjTiQ1-QZ^iJz} zZs6RIput6g+t|>&+t3hV(4cQ#w*xRqLqt*6I!X2`s*3H?zkBUjW9c25{D6GCxV!G} z$@M*A2Fsi^51r1P9YpjlP&U9kRQ7t#Gtgj@OS0kA`xVkaqy-xhk39AW!drk~HBqQp zmSCQo&08u*^S)KqTU0~5u5*1qs^v8GXNCjj#Kx_hHnD62E1vuaHF>9Tv&>jMWt3xj zURv|fZlH(cAc&-cd2W?v`tqDt^U*Skni4NVQQ$4_a>yo#XngvckRDL5egL8Fk2d{! zhnjy#8_eO|fp?x9ind~3mF79ZrJVMX725mGO=8r*9=#gy_O@H2lPu0~6xURY9i{lm zESzqSO4Mfc_0GX$>Idi7OP}#n)Dj~i?Je#C<=$Kkg$xqT0UAw`s(PKW`{&w~fPCRnZ)s~!oRrW&-LGrvPGbWe zqZD$v40IMCmUHson~_5Z-E0JBMGA(g6RDUNYImApNW)`gGUXQt__JLZqsUD9j}Iy5 zsEX2LKz)sjCz{hu?id@p!%e@vMqwUdeQQT`c2Fw&-9XU9b-o1BB~m`D=BA0$FWm&< zWi;N6TwdPjDt&f(C2c~DeJdGik{7kXI5IWdSFNzm$v6mzdJk{wK(KKYETYquouDso z*3U(}ABqKru?6xRzs`kv3XU8>@b?Yk*#WRQM@ynO07wMGa3@Iq>$jdkfC|J)|@mQc;LwpXH10*n;uR?mM-5%+4={6SdPgSq1l`2yyc=RFLudszX15M{gey#u7{WW zqC@Tl!Y>tq>>K*o)dCnba%Yl_zzo%4Ycm(_>~WTH65+dK{J;1I+b>l!{}6iYw&7bS z811kRxKk=($6zrhq+_A$GX?Enn=9z!gLl-X>hNPxkX*}0uZZT|oEqS>*)(GMJoU-_ zYvhSI;J1enL~o{iS;K426>ZK8QR#jDa%U=@ARU$EjBo8LzLR!LBzh5(lwmO}q+j0H z=wLGJzc5j@6!q8$pRr})R!GyyOSiwMX^6qXdD~jysup2Oe#o{AoC5%^i|mZoxg5N@ zQL|;$%c%0l2A;CFCZ6@3VSF$}eWhL|aJ3n`jgXW;oKAa0hdRUpyKnvxD2*sJ+y1YB zi;#&f$XnufO!}e{`1Qd{i9;7hx&62=?dT1+F4T^&cFbQtr|)2< zTe8lxO=34DJ^TBKiw)?HJ7ho^P|b(y2KxA5pYFEdgy_D0yyFaY129X@-|xrVQ((g) z-0A$b!IJ^6Z1>#+of&bILdF+1!ehcC-)+X;_;JVIeZp>^Rgv4s2U58FG)bg8#UF|VWhTKmc9a~$q$k}(#eT{sZ)N8C=_{|z)L<2N zvCG?vdg#@nQTFnXjZ2J>g|z;>y+FMx(Erz?l^iV+gsQ}}i#WQ{pf z=}>;{ZLbv4KYTjQvwL2Nv?ajy+4ufNO;&&N@0J~P=Q=gU6>T-3by`GkfsjlM-LAMD zgx;he%5RV6H`tJ(8y1K-V>IZ_TV%>X5`f>8vxzPMl3N8kOU;NQ!h=0b3_orj5i2<7 zH(rk6Z$4?m{XZ$;sKpn(9B6toiiHelnVwLH?T-AT#G@Ldh`r-?6SU9-NUI13@44cA zgy_Z`!PRy+KU?ks8b+-}j^g3s4hj`gAqeCY(#f^Lcy8i@x(y>4Bqm1i9niRD~>|Kdm zS(u~m1Wtc@3yjy;#cu2E{S7z-32uM&vtGaXgWnBj+aIbHd0})+f#^*UDu{aaHx&~v zKv#ArDZ$mXcydFmFrJzjwLuk275V65MC|}t$gQ3&5P80|Q?BH0D;kp!Js0ag$P357-d*eiA_J=0Ex{#@TAQXSB==u%}41r2spI#>~?NGXH@B2m5LJ z7+(vxOANcStA}mqm(pK#pZmSxKdHo*?wZ6zQ~9gVohcivcnC917#%#N;**PD%o`e;YqLcA)O{grX-2$fje9@7@hS?l+02FPn85d;9jFe2# zKP+y=OwlBclyU`W%i1stJNT+Wx$^!jl^E|v1jtfFMi=~s68?6fr;1I+K;9VPF$Tu* zy$Qa+oc6cVU+aN*QgQfy#%lwD_5hnV)K|NT6f{ALQ=-X1`u`sH_&K^g{an;M!tPeK zJIihUyvA-_TA{U{4exnjPjl=o;47P;s+h^#h1_+H0pZ}>L>=_RPwVvKt<3z(JKzB+ z5++Vv>^tz+HojEfwF_bl)u%;6P)FLJ#M>CPz*K`h`|`pNxNGH}o5oyCc+{KAK5*Bm z%)c!OR^DIv8z{AI5t8hk{;oPb3FPxYPr5%?m9WeolbA{5B9ZICy`Z*#z1wfkcu7`$ zB>PVj-a!#jE+?Ow8govaTsh-Y#boU~{fX0#*q#^MP>@Z&EUhX9woUAG5fF9#keo<| z=2cUL)c2iU@nKGWCeF%g$gl&jSc!#N{=i!g2RY%;6t6pgyN=jZm;Yz3C;&xOET=W{g3;WIQHDy-sTnsX?4gF9isIf9#FnfK zd}hjC(AUQLggKtDbHw-Qd5W;v*fBfO22ff2qZD}cP$tm_9Tp5D(14J;nkbrficL@t|^R5f#L}x)r|IOca*o>MpHY& z`k*me!PmFDtf3MY;%C=xVazx1TGmHd$-8f|!uAJu;M_j(2o8nY8+c!+B1kL+M%AeY zWm>trmo4Cgc@Qhw4xCSlbf%TEt9tjL=8zoBw%4BU7S2LqN)XgLzmQ9v5I2(%>|4Bw z+?upGOt(<&3LmcNU|Ol-7Zy7pz|jQ%4dnbOe2qgjVQ?)+SEgGmV^AzX(l)3>VXAqo zO-8OK=@oe&JHood*f*sNQ5vt9w^e2wPHM4fVQ+q%l&!9XeUR0M?Iy<1`&7KnW2_H#QbbT0~b%aAL^t?+mT@Lk!bZ%Kf`3qtQL&iqLN}^ zkwM%N?6LW&M%9B@z!D^exi^|8RTjixUIS^DbhDkpPOT|y$WPaD-TEM~K<=cNhM=b9 zEI4XJHmW~$cY*4IH-!NG~Tn2(WYV7 z4R_f?F4c#Hj}R1JtdXNh(Izd#x-3?MSMf6ON?hfJqtM{6##caY^KOaUW8+xln6M;o_i-O7a-)LEq5|}B zrj;^71=lD?mdOBJ$uVeaDl8WBc6Drc>K4p1m6HSbRUjcvt!`o&AW zw@+F6OT6Zhy!(@<#CiZ{jSP2@O*!1fV8h4S(D;(84OeBzD|#VSWfUiY>eRjr-?8Ww zSI+)zt6-t%nuBcMko$__=WW5Ysl+&MxXzSGQC%&67<7iN4q^<%{#f;6spFlABghVe znvN3tu{YGeRKT;Qvs6%-CXz>+hM!rnD@TCx<*Rh#fhD=)Jw9KnhguHrc) znA*7)A^oXn?m`wMB|D;%Dok5ObVb~PpR-LHcPA+M?0Khu(I@Ih6c-x3)hpwANkBp@ z@O41VlOC}dIYb=}h%#2zThkmdC9J#uD6^(ebb>o&Q2d>gLtg0=N_8b5gkcRd@r!Ke z!7~+H-lvJRM<1z#<%&X)Koct)ym!6ZC{9{$dtugc|6Fl!ucO^bd2bX*uMCcOg-`-B zucM1s##0J{tn^XlJhl&{xxE9D_7R#2RbTFhb1kAB{T2r*iKhVl<(#Kf%0}I{qa442 z$Sw=T+?yN1{l&RZC2CcOoWNH~w16b^m@ce#sgN|RI&&@sUDO3g>-XeqQHJ<+m8AfN zC2Ca5jWKCNr0Epf+M;AB)1_HIz0rm?86d=bcaPNwopdPWZSnJ#pDB+@JpOsSr6e(F z=a|A+tjplB4Hly@pE3#w70tg=y4JBw{DFKm)VAPcP87%jzL{OStC zsTP)X+>I)XBbsULZ3FHcNx6~Emxq;>-Q#VKFiTD9MAGfyyg3z&I_u$eYfY*7n}37W zqDtp&`c&5@f#U1Iu-0lC z9UJv6lh)?7svaww72g6}S|2lADjqwUl|2R5OFB#O7CuXP%Rj=jI}3RWI{S)zmp+R- zi?!Fz+vGik<>$8+9GhD171!2ZIWF-!72YEF)IHVp^E*q_&92XJ8WHcM8xbGQ8)NRX z)`nm8E>S*^E|ovj*Gyk?8Ue54ZR)=APgucM?62pPLr|M+WG7`}dD$j3bDmh^4^I1D zoh@}**8r=zH|*_2=A_P6Y;zB~yTr*8(sX_kTaM#3oPBOaPk&Z2 zm`;J*OBg;JJ5|!PnL%Zpkb9(FNBMS?{A$zVuC6yX-@Xn^F{bg@wT$tVUcfYGN^#{9 zJ3~GmY+SO_?|ty@8>JdcB;$A(vpEtkl@AGY7mYJqpcdTaDaZ(YpQZlVpWiCOIS zmCLzLc!iWB*yK-??qsg#6GuYvVsX(LnMy5|xs@?SUG2(jgfGj>kL_q`?4EWxE;KQs zRE^U`eaCv23#;R&I3C7}GOIssfE^bxpj{7E8a9JZVSbMVl74VmaI;b)&iKboL5%%! z7Q(t(VJJLGIgRJpfFPIgC^;GYq^^?jEGFvlYnrER&IMTFm=hODq^~FSt0|D>;IR2ZG0a zd@u=&DcO^J8hHU73%J|IsmHAH#<+O>_88(x9jsnF&pWY>h2-My#hzD|WBqgF?t`h+ zU0RIpFNwdBOXu~M18w>*QXSAyHt^Od(8C=K+cD@E-SDa1fd+)GU71tEUB#&_hF7tt zo57JCxieFQ6@-u0-Pj^X#qU9Sb%Ih_JJ4?64+VJVo8A4ia5%@c0BZ4bp2&d0uHZI{ zbG!Q|eaw;7s+*H#2AOKnU?036uMe2H+dVhHxV$<%h}SBOyzQY_;5S(Dnwi992j^8T zcmNNmw;ja$YO_((!hm|!7x0SD(;I#w>CKN&^Fy|}6`5J>o z6f@9&z|Ty3dDW};uIA@h2iDV@Iifkfo_f*zPa)b9gkn1y)=S1nA>BU)67*+$&u||I z6Q)#3YfAaQ9b41wO$`3>fIg+YSQ|HwB?jM|&r6<^nt69UhX$XUG4gx5BcU@IutdCN zSVB^}v+{QL^3fyJ3F-0NuvkS2?Z3G$H$L!6BDhs? zg*2`do7?s=J6X09Y$dSdnO0k~lfdFhOt*P$*tnI4(&xm@AyIEQV>C>oI>wbV<(Yw{noXr$PlnHt)ulq4S6pB~O(2nIc@` z`l{fnSa8}}beV(k`HqP`vJ*J3KygjXd$$u$q#Pt?%3Y|#{HgP`;$gL4P`CdJjm@6IP@gfQCnj<$cW}eQM@p7*b`2S|2YzLgypAUDkGHp&>t6<;6L$s*j~^ig z6Hs|um{B!20J}0qbaw3h8!*5R1S}N$mDIo-oP=9#0L&Ic@t*EJivX4H(>!JV7F;u%TO&W(u2MlGPftzfeIN;kNTIBA8e`*p00|vOwoD(D?v#*Fj zHSsbdCs^j~?u=$LOawQ%DZo3$%OIf}S1Cw{F=Xf-Srl2GG)#r9 z9cuWzR4|8=^o5H@-9n+fBLAF6@65nixi6vzgM>6!81w`lc@$U-4L>)f|48 zB~mYr+^#(dTLCq-uNQG8Mg{PzvS{u5tBuXTZ76`ZjRm{H$roW?i`f}TdSaRx;5Vcc z$&gGu5N*3sYRFSLL{ot67zL|fRoS~L2BwBBTWZqco=``5I%eqj{%q4gJt>)bDdkxG zMi@3l_X;6}fk`1Iary(r6i`|(IF&TWk~%z?V2Xd#Tu}2&M&}7o&+6Z-nDEXr+N!bh@*W zVQVu^0)PICvaA~cMjPMoibUbm4grzQBQt7efmqs+*3Zeak(N=~wf!sKyyR|Xx{R#5 znB7!#I4F0nQnoYFFclDa9c?OCeSP9vJS$vv(rZg=3f)SmZi)lGOaJWQZ*lx|#X* zsZ1@MVEZe{s2fPSeJoyg$n5qrQpGd@Ao`Xf87C%hgCi0)a(F+7gp`lwG|KpD84bIf z5-;TC)XUHif1jqQ!G8gdd6;J8!tyrXa~NG#TUX*5?FL^Upnw}Y!XMP+fUUSoQAH}+ z%f<{cL9X#|jxOZOzny`Cexf2B=ifIX=sV-?q)RJ@57gj~9Vp{DRAkJn}eWQgm7;ywZeH+yq zAG5uO8r%M0<0^_+JF#f(q!Bil7}fp}G8`k0J#(cF29m zx>l^t1jL;CPD#k;efNf*=g^kf<4VTpx*?9}I5F-aMmZBZpX@S&xH3Si`Ht880M&d( zA(kP=75)qxdIu>6@-P8IO3JvEmoNL4nW|8LTo<#iZx&b8_Z^ z568K4*yVj%T^h`|jP%+zBV-Ttm(~K_{?k>7tTE4!FJ4cOsNm>@5a|9tAyC&D&f+U# z1$gq8MFYrPodtCWQ{1r-K#m{`0)fn4+FI9sH0KY%q++VYPsVk)ywG#> zbikh1*Z|8CpFD#(C&%JqhD`o@gI-f4^Ww1L!JVYHwgfp|Ka?C6*$01;y!*)krh*xd zYYJ%d=y6)YDk3n{S37-^`K5+)G;9WhZf-jj(89(tH>@s!%Tw)$14a2 ztf}#9?G|)>{f?_t?ATFe`C(_9{rO3D7|y4H^XDv^&fH7-v{8l?dXFhOQGaFtjU!)h znkmz8xLsT857X3R!?IRnq=p|E6BKkz)b@3nLDCZzIsm=D858M1BHRdjmW9sT&7<%y z5-XL^h}-G09R*_9EISAec(0$9EC3^ockRb87~V>0W-7$JIg_V`ZpfMTe#!i95AQ#bn5T$tQGwK ztQknf*wIne*2eb#f>$D6gPtn1Jz6fS-=&r}J} zBDD82F-**@>cVtcpF!rZ&aU}0@=;wuW~6Fq)kd-1M#wHc6Fi58v3~5R%L)%Tnwnr} zS+=F7PHuS~WjaoOWI6geUg^A?_oaZa?S{e@nN9S`u^8uJPHLL<(t%ddaRA#OVr~pt zV0{|x%d({LyxbOocvr@Yrf8fD2x5?S`h74UJR-H*Tk}Hb&ky@S`FN(_AtCNtZ@@`F zKj12;3e8lO08%0mS1S2R-Bcl%8i>LsS^1Q8mvGJHXCMKcjL7j=YR_o0HZd{x;~p5U zCK{(P;H0d-PhotU6CYP{k&R1l#qVq7d3jLPyl+$UU;8XJFcQqgRg<2xyXZX3BFy5f z;f%e#4Vr94q7ht3d5vt=s6$2*dX=5m&1gTp!ITuX)MTFrQ+b%$q?I7kg$#raWKC~# z59Q1*czy{xuX!>V4Tzg75W{h1F;a4DkVRo1{`zG^(JAUur6seJ6q;>g|`b&9^V4{i(VlVW3Wsj%fYHUKM0l9>MkIU?L(o8mxn%N z!-nJtGhu;4HK&Q`0Dk<=ETmYDMPyG)VvbxwmXx%jfv!{w*V$QY&qKjRjpM~3zOek8 zmra6n2uz4aXZ%ZrWT_x_{LM3=q5^ZhDT_ycTqM^IAk&RGA^O?c;7#hL$|HMR~cUYv%}Ng_;Vglu11u z{<_HwJ-+>c20*eC|BA&e)M`!XwG4hRpX20}Pw-8PH~H!MEUUN1MJ{G`G1CuDj|UT} zczS4`Z#rn5bqE!N{-d#np1|-#F2Ydl-57{%b-^%?8v|Ak8n$4{<(~_h|J05Fpmt7xrw{~^^gi7Zkubyi7`4IT*!dC87!-N`q zP?|rUr{bCyL5LoMonnEwG-s?UmGgt9CiICkp6OKn5+>5>Z;XjpLxBnU1spV%hAD^r zq0feBff?71jmpf$f%ULX<}57tM~{c4N$l)gG}M2!rgtMEdDyXMQiN9LfVWP@_yFwk|=)9;@j5414%9y_X+s(7oLy{%F2gS zm+{H$NUEc3FAP$h{WM{@_9sgYtCCJ07sFlHm?l|6gE^QL!%LnJo$yxh_M#TUY&S^b ztHkrU+CZPBvHa1}NvdgCh+7TT^iOsT{&jifQR|_&6DOZsx$9hfeaX#Ezcpw2=-;6Q zm_reT-dH6!FnqlgslArKzsvT}!#8MKJ+5vjzB{xuI~?Of>of%98iaE7hBEceZaLON zkd>eW^_v{uWLRSK9+q>lK90{zkzgz%0B`x9f<;MlSEW600agnRNwcC1r$~hlXhcb@ zoA^(?gXsbtfhq+p7DT_m{5AK3IWIha%YB|ZSw)Ie@j6PP2w-ck;i-MN@LP|th&E#Y zPj?3Fyo$TW&caAe;7NA>7^NOh%-7IZ5@sfU1W%?g=#(;^Y1n`%^sOjyf7AbB>>a}_ ziMDLfO53(=+qR8LbEj?Fwo&Oy+qO|@+nJTt%hRX(z1OGD?eFd{V(+zotRE4vFvpBB z$2ias6lmA7Bv=c%*)mt`3gj=ah6I@*B53yD1ltgZV`J5)I5OV_0yGoiHxR0Cf!0xi zIY0vo=?=|(cpj14r$KF?1>V2~yru5xk^65m0Hvh?Yh(ax_*&ans_ftoqNCvI2+80b zxW+SXG6e;?GGLU>3GveWv3kOGrYDWock)Ca)0fE(R?PG-Vs(YDM4{AX2?6|`iWj@a zjf@V&SYJnh$)hiKC%c4y7p(OYCGsUs@5#s4mwT2#-j>b?iQ`Lx?H0LXW6~3yg0TtpeL*5SqAIHklv5RiCqB zDMH~|ti3~S3{$Z?zIRVqpi)m^(2^5!nRhvB&Dsy^0AZK;5Zbo;FKSqoQif(!-<0XL z?~~#Gf*SjeZRcC}+4(=U8e-zV9gPGLL$@vGmzRCDdhGD41HEobA(54!nG)F5c~flk z_EOmbOp1CYl6LwCcH)rTf~4d0U5|Voa}3S+d$t6A;2Qseg2-|KEY-1Q5fQh4^O5#g!;3Dac42c62DZ2t@iF#S8x$r#?ho?wb5e5p#VoQIVC(HFeq zc^X9M?2{3m@17Y!yT@WGxvg-lE9XvL{TWc>o6NO4tI&{Mo+ehMSx{nBN1cxDL7%** zT?!QyjcHvo1XaK#9|fSNFS(q3dE?T)G2aq~vFYF0{($7u89`MrLZ3!As;LWuzHo(i z-7U0=Rch!cwEa7tXp6b2J6}m2gx5P5JC+`is*12B_`9UUdP^JXdX{FY1jza%P2(qn z9?tfE-|UG#Z+&&Y_3#Y76`k?^{asi4W+wl0Z?9I<1E8v5^0~R0nRn3J(9t#OC|cFo z!qn3dmnBmxYGc4O?nl;Ub`JOUMDlI|R3V6nU)J za>*95u%b$&*wK3k1wu1jJhB=g9Okaw*Bf?M8(vpWIbKgemDk-624Jsn8#V@}kQ|0; zkWV{X(82aUAuH#w0(-F|+J##Q5HK~Z4RZXMGAFa-9VPRd8H{5y>HyprQRX==A$>wL zJ=%n`8PlaX^gw=%E@A%7{4Ep6WoI(x)l(t6!71BjX_qFZ-sUBPtkVg<;_)wA?53ib?=D+{z$ zUEe>A3tr(Mb2)s~JYIhsWP5)J<|1_EP9BSMS%P_u>eN5RxJWi+Zy#3A1zti1C${Y- z_|k0WXnj5HKX4Q!qe8NE!Dppt6X056MWQdK) zq?#Ss8^@d};cT4Uwi2|?Y%k49zA8~tR&JeL(|R{7&a2{i(LyE`h!qK9ek$11t9~XQ zQq~Q9)!iv0NM)2%OCQlK)Qy+s%>e7$iLwgWf-AlgWsnp?8ztJ;HDSqzlGr$=coRSfVx?E^hN&aH@IOT^|A&s!*vNLKRcn=JlhpLb=O?^L#% zl;F!(1W6DSjk$(lX)|Os3gCICnO%giUVp!QH(hIV{bY_{@5wYS^^-lvvMV0kP2@J0)}5Fm}QTY=oi}MUJY2p~Do#37rjKjf;X+0Pl!C)qd;< z@g;iOiWH+)sj&d3<5#xXb0@1%U^)BsvuRNwQf4$3HZA^Qr&n1{SZe#XK4YOwSvlAk zMi59t#P8kA0Ebs7dG3gmKShvq)NpZTVv>bJqQV915u`cj8@ux_v(;zaqfAS0Qv6ju zL4!qq`ycpM-t>OA>AU&#K7{TCgJ*O~y+U)~7c%@%F_*snH9h{Mt;7HxDL%(R69{=A z39+-|5xvW}@(8^0K%Cn@VT!ySR)#DtTCUmyEOE0pp>Aggp*zH8or8qFsS#}Uj5{Q%YcRAswJ&i(6)`+8~%cSnsSg`uQFfG!*T6=}HaGq7h zDN25UP_9}?g-lKodvm+VV0RYKHPUM8|D<&t7cNk0#$Ny~U>YJYfXY9@@*G(5jy$tV zgFCnqo!e)bZF+zs-feooBi?O(4v{?omOT>JC~(_7`ey##|Ay>4MDPrkcFSXSLs7FA zS+P@DHIC`AG1mUVdCtaqSO9|0E!P-5I-~WwfCZoXxBv#f{iHw!zx{%!qIaoQl&K^; zs7l+ixpGmeJWuutSXE^g`!^P(1DL~9mq`+|^^@rKgq`WbnY^$cPCyvR-(Lo0>a{0$ zcqx&BKSCK5sRB)LDr1jzx)KK*uXpT}?ONw5DisR$;7%wOdj>BOx)L7g*`6bN{>A0* zdnNwytzq;ZAGGi9f2k9(w6%9}W&rt@qNAe#%0;8^f}Z!9PK>Jtg_<$3#)l(pgBkQSc*v`s$%DoDYp*M;5IruYh(OqQyurn0i?0ZWOdrhs$-=$ zF7r3wMXSQOSDP~2WUcuiTp3%#gU^2e7gFj?oYcC)sU}rI8w9adN>YlPm zPOQW)R3ve1f9QxSTOSd*=Iz3xbZCnR#NX8~oqW)B@!GiPLNtm1KUsAt{q7lMT_Myf zxJ*?7Lu!b$n8qh}epOmcnls3QgJxa#>To2*GvEV}TaN2PY~00&Ykz)0*hi7u^FuZV z=7-`h+W+bAJuC#tebW;IPLYrD#d85R3r6K#$o`k}CK)7bp+JG(c{nIkj};CB*Lhw@ zWcP{RaZDssx1QriTOa9L{x%WD4OXG+fNuv6>SfDMo-(#}$h5KzQ%w8BNggTf!--s6 zA`XesDW((KS5P+aY8-k`YC>Bujh%{~#{&ogDi-S=bpOSS1DDZf7+a#B4$%04IP$S* z?HSR5KNnE3-b%6pIjO4V7^4Y=cFg?2-3Mq*ljnXQ`GIsEvi4U0c)N{lAXxqJ>o!5F zU-QQuO%m>iS;H6?wt03RLY&PtmL`u~gd8}cfN`V(7@;5Ym}U3nPuz9kAGh1Gx9dQo z0KzqTmAbPe&Z{Zt@js=`!Bz~p+6q(s!Mpox7%YMIkbqN zKwx0s2Pm#^AdrwDvkddmbU!T=Bz7ocs33a-B;=x=qM}2kc9YdoyT(T3n{v~YT9i87 z_y4&qA{f z{1+y!JY7M0QUM~2gs3sHgI@>Aj#zEk@6ozKHKZB|c}bOHYzNwocx|~Gg0`eRgd7QQ z2WE~iZ7Cb#wiG?2IAeGR@{Sm7SsNl(WKRiiV;~1YcQkj19_hTozH<0vaS0=1CBH>x8GVpQG$|Kriv{DF6zBgt##Z6Nr~&Z}CrY*Tk7Ij02fFG)7_AF%ozs zBPo6=!jR(dzr3Gb&dbTK($m=43y)l7xm%OO}KKAXd-vc;7i zLZy5e`m@0juN~D7r=^+BUL=0gd}TRN*gVm&PCDy2ymB%a9IPJg+&EdhQ8+ql?c97z z8Hc;h>#VpPT$}0!;Fzaq+Ub_30N#401>0iI#rZ_bC$JhM{#1nkRd`(!fM1~VT#yAPh9qo8C1mOwsnG=%ZrHYf26UGh%mE}w0%MS>dV`M2H zl0-&fnUmb5z;2NQpyCP3N!3V2;mMW;$qbQ+l#odpB(q5+6N@F`%E=nWa2+u-WR4OB z#*m6*Cn+rJ{TGu$NJU~v;Y^S$Nu$P)=S4H6U@XaO4k+j4xg{x1i6xRsOt7@%V~J=+ zrRyW#!*OL|Nk)=TMk5YL9htd8s>rQJ%MV!VQ>#dRC9z08=KkjBz`=U8$-^S~sE_KQ z+MM5spx4YUzoun0$HIE+5K zWloW0H5w?8r0z?amiExQun1Yvh_Ul8ZUN5Q)G9;YwW=Kkt(2*a2ZfQX1qGu~gx-wg z+(PbE3AxSPe0L|zh?ID4WWbghE~3}J6ypS2?lfqELGLiAhEZ=bNPt;xMI{5?jb}I$ zzg^bf(qs*28LqJR)WLdMHpsdruMif>E(piSwC{q#-(_UQc|q*vgZqsq(F-A7#efaJ zKlxH8$cs8uZgVB~a=VcLJwU~Q71@TF-mcFvmNwYQpI!BXgE;x`Ui)2O_9~${`)CH7 zqgl}ZubHkzp&3|C7hc?No1B!9cVh^=aTR8y@8>bIm7L4hSoJE5Xwv-pD#&aF`YMhA^{J#^h{L~p=AOL4DW}UxtUO!*(M<$tixc-z@g06vlo@;f z+{`@BtqTo^W9REAJ;8)RXfj-GAHr_yLk6&S%{Sd0 zy3CF0oVGp*x+0-}5k@ibQo;pLsLvaO8u@tKjT_n5A<=sz3JHb5Oi*>-@>P%0>xr+SWHP$NKC*n}n*=g^q1q&c?SX*TdYE+fi4l9qXSc4$Flsb6h9h&PeU3 zdI2@!D@9qe)fOb}IGb_!!f}NZb1W7po=7(0yjNKkFl&*`1(y~OYZ2YZN)TxITV)K` z{@?{f7M$1-;zbUlLDEWGnW1Kc1Qnu7l#$3~=u=`YW%z9QWMybBgwZ-0gtE0pkIroU z&uIG^(Lb4dhyM4*irnV?t4n0t?9|u$AGeZpj-k%e)a#em>g|2Db;tF~w#!%oSGh08 z&YZ8>xHk(20=lcBA)m(9IP|BvJ^nSKucMFF->wH=uAg6jPBvV1ZKK$XWxk^JlaHG< z&C$;%UmXQBj+&R+=$5mGG8;6V(5F#~MV8Xwhu9 zg#asdjF9o%rv)x{9C!E6OV$<39DRvSI8^2>{crTZrZz{`JkY^Zg z@zW^Dt3PiA!o>b-I&Znc*urZSZ_&(z(`zDNUgH4FM^AsT<-pWOg8kg8P zs4unM+3{U7+NzP-R#Qm*68gkja~_}p>VqBwn z5|d|$)3v?MwUnyXSH+}K*6uu$pWWL1SG>SemV%V%a5HeZ<(J-XAq5{b_)uPF}>8cYfk=r)a`ECRI=H@4?jaYs}SeO9S zJsY;wuqiX)GweHx}NZA1Z>-=zJP~E-)?4hE0DTDsl#_U-S**cdE8i$hc zpH|_}-8r%r51Q@=XA{XTU#TUYoRY#w=nB~CuTwaYduT5wM9*EAA>)9#bgDxXan_T# zWI><8x^$gFhC@Z!seF%sdPK2EfAM?Js?(gJS(oV@XN8?my(d_Fv7sBxPX%h~9rP)- z!XMi9x1cVK4q5eQ!NH39_nr(*a#r?pRNyJIkoL_B}rZ zucnD$SPniM9(Nf2`{Q55@t27B4(Z9hv#E6d`{Vx((2eX29Zg8T8~=pgDXKOK3yPS0 zEt`}yVyH?;NI%nSW6}zDbQr~f`($az3)3-C99#6xLu&NaY()j01>V7YnaIfthY>!1 z_$9yot?4fujHc~)+DN<4KIT&RhuW|YM6G`odF);y6bK5}UxRs3pdru{SXrEO!%+_& zotl<5I(?>EW|8Khu2RCz@mVLCSLSY;UNgoCw%w7t5LBWdwMQQ$dN1BcQ4@n$p`JX@ zbOz4u@JqU_z2=E?;`)+pi{VE{MLSUb+xs`AyFpD_3=T}@385HN2;9@CCbKT${*lhT zx#@fq)wY&Ck&LQ^DcN^raab`5NIe}gI}YR1RUI3udY<-YP1%ilB=1WH#`( z_*0~&)w0`klLz5Mt1r*V%5?;H5i${cW&W7n`$aA;v+E6JQ%2u;J(Y%0j*d)E>Nk#{Q0+|#_cn`KM znm@g8_4U>&m}c;%gh9KJ?lHE^uxOF7#GV^&mk*rD-7?_YRPP<@K56JlrLfl>^W85a z(4Ot4qERUZBfrGa#-#*?J8t3)FTSV@Vz-Eb^qJs-q$*Jh>F2Ubdc-s9FKr&_`~!AB1tbf%Z#9{uMVRIM z*EqFmYA&soU?krAqtpWbgwJk3m z?i>Mvv2b;LF($^SkR=8IAedRu6OPcac*e-}spxg$`dssCJB^lW!HrUDr89_<1eTU4 zulY9l)l3CMmVRSg9}=$&2Y>AoeH-pXjx_%~Yc{x+u(RGVLwHeo6y{RPa0x9_gsb>M=!qh5%I zf}F%{WnTk*%tUq@IJn{h801)di$dO3ok=6@E-3=uR-c*}57b!9hBD7LIj?tdi% zqhb#xy}8M2*;86%SI#D5Vvcbq9JpL$IGMBUX*sy9}Tbs*HkdkU)#`7w`2&ot0 zwjr!OjJAFaAGgMBf^^uC3El8s5nfd6*JN<7TgQ4?APXd(BtJ9V$1cYm*RKvN7w7CT ze>PBC64QX2*B<3yxSPEEIlG6&AocARozS$M=e|aVJIVZO&mNWreiv$-fC3CuS*GPD zAclSXVn6Og&1h*xp(^ge;?O!^F>$*g%5UnjJ`~O1V%rf&Y8S-~#~Z8HSQDKTn?;eN zo~uq*?huU=JpkUk`wJL>Zt&iK-%h?fzoLLWAO_|F!+aWx@RkL{ZkJfZe8)yNu@$g` z_rCED{n?10Sne1->^C^NyJnZC*hWpS|In7@1G(O>7`%pi2l8XRp@`3t(7-e{U1Teb z4iMO9h`x2?3B&5ncLW4x*-d5=s2cdO-2l-;0owiQFZ5FI;qq3&`vLU^2Y2v#%Bgv4Yf6HkM=ZWD6ynhb)nW( zG*ZSRP0Y|@=LDYhQ6e&BG_9mQXk}WU95U1spItt*3}7ph9U(&Nd?bn;qLj%wLck+x zWIDyO9L&-X#^cwoB@4+={f_dE!>S!g@&Y$PlzGyRq;KF!z;S8iEv6JBYSABN+d z+|6~3Jzui?Zt{41`i>T0Z(z(+o7oyKp#8hMWP+(D#@MSN^4Ho4kH|qVmS^uq<>Uz^ z8ZkSA?wMA&Ztk5oh)1n%w5Y$uO4fk85CjDQT%~I4$+V@&-_8=c8uQMMU^FRC^Ftf_ z;~VsT;YuY2bvF9b{hCj6qu+J!A&kHezivksK!Mk(@C5yl6*raX%y#bmKn48PCNCaui%P^}-lXAQ&TAYC(9ql<9#+Rl57_e_9+9mulxVhpcy~rIn zz9&KxU5gS6YGPAgR#{ib13#?(Q0C)~4FDIqj^Xbun4Ip%o{`K1-6B-#W0+mR*2w(U z4Nx^8FzC20fR=J*tuFHtf2}i3nMdNOZZnSFIUhqIKkq$zP-yyeuS#Bj9${b1sxy!T z9|f=T^r@BkQ z%S)c-Jv~JQpU`L8IIhjsM3*RwsO5H@I}}o1YC?}*s;nLX=R~rB@PFq6NZAVzrreR~ zk_iTwW)3CFwkHo!7NHaeb~N+SRC&x$3fG_Mfg$EhC=xvDd>6zlwIMl$QH&D0e9bQP>WLs@HtE7wpg;4E=~S)S)v z@t10*I-DV`SNVs?z)v;^V>~nYMBbIT`xq(=#m`CE_ptzd4bG>iZbMGaeJ1>IjM!9( z3Au61G1)E(QXitGL*~n{jCcHnfG6T>3UQKhrC{7%>Y5i;J=I`iD+%28{D`xDoT@Xa{$trd@2Zt^Zq*8<~uHGzcN8S(&M^r*J zi4;{zXw8?aPmf{mNa&*aK#k|L-wBUz^&bpC*eOEXmqP^=jn}R>H#a+;>O5}h`FehZ z>xBb6r}u#okm>%l9~*!cc}ZQI-+HtU>9cDLY5tB1sYFT&nk3I7%`--MbxkRk;7y0^ z`NErOmBI*aD0lS|#FU?2*(mTdGQLPn`@Z2KrS3-q-)4L8YfL&WBF(#b1il}5O=aU z1W~PxY=SPWy&^Ku%n64bSknYNE>LKwY?KIDRYxvF{=e9(#Vj+gUZ(z;N8Cs2-=`V|vygL;~Mtnr!MPkSP}a7I4_ zWAYI*HDi$VQ}J0;A86z*eWJ58?f@=!;cU`?;>fVhagC)H_uFvEBrSrPn7^#xtH7*ho_>|YPB@XAmVd29mLWMB69jkS+GKvjCnUjuc6(E z%xgf&nzARP*KRl}0%JCRBXczD@8Pi8v&Xzh^Pm zMULq2NcZ* z7G$pjGJEdWj7fS&_b?Wd92_+xbSMA1BZpK@hokrO7I`)YwbJ^(NMi$42#s%BKlo$}lF@b6z#uI^N8^B=9#d9L4XxEz3YBcKrU_*;z!1~BRIgwDAsCIaa>Phoyd(jk;?3IgE3fbxYPyx+E?7Tqg_eKeK zlO9Y2`e@W@fb!7or~#S7c9s&g_UyHbNd#p$;#MwdjV4d1YXx=NtsNPWh9!N76iKjJ zP{BPpqvzCTIc)6878t#F0IIu9MJ4k>)$l!9DKcbXCKML%t-lHi3Icq0PqB&de_Q7Z zP-Xu>t4>PYkDc$fW~$+9Htz6Zd)Cno!;&{=lDIl+ywvOoL+Ng%A$fb zmu{X_E4_-9y3tt}Qs!4m$DYAJMq8mL9kwyA-y@$7^FkPpMOl*^SNb-;q6&b4c~?54!TtVN63UX|pUiqDp{isj6*YW~KYv_wff zc3Q=Dx;B{+(7-z;YNjlrBU9lr)SB5mJ67jNRoG&RH$v0C5y!1BJU3U&C+Ztz28cvK1e-xYU74$vaJZ%bMRIe zNKLsj*<)(7{NsHrK6|qh36)l9vIB==x7X?JH!+9+>V~QZFh3+Evjg2DrCE7^?Zg=P%^m7R%v+6wD=$5Q3 zi464e=I(cLQS6oeZJmYrU_)<7!8FgslmeFoTJ?lg2;iNzi2VZ(-WL9&qXxzGR>Xkk zXR8ok5WZ1pAnmX#CZ`xh=0vZ!r#{#>{qGgoUy@=1J>i!7-A>iiKBNawG6iHAB0*S9 zf}fRB1IIn^0t6q_z_+tM4RzJW@q*!QXokEjUGbKl;+gr>ywSYc#7*8crqGjd3@qes zxP?hRts&#Qqes=MuyN=3`c*}HNv@PcZ?Lf?tGXlEf=EIoHY&s8C92SjnRH>bFoJum^qzNq=*>Bs_1#zTW!&tyavuAI;zrt*C(@M}*`Q07 z|M*9Onyh2@BN$`9A!a7_8LjFK6wXO^MPud7Wa;QEp~kqxpI@BK-^@Fz4z_+g>Q?)9GTFNuY5Obq1O@Xb{O;U=>I57#%$A)9}4|>+fFc#(!?O!zwL><{VZG31> zX^|24jbDE>6=;6x@S?c?cV1957Av{_? z;8=AG#qO93g=c&RC^gAWab=7~M)`RpkAYG)`UPb)gTx<~=6=C(LoA@LZ>XnmU$n2L zJBa1&zj8y=agD7%;*xDVzcmP#JtA<6{yBw^{k0QFy)Wds9VNb`#NEZ3xG=n!OUy1w zD=CAcDkRc~ry<6Uc`3j+c$L)Mp=B4475&$~={mHI`Y)C1iCk7D`fMcPxy?>^qjL3y zL`C(DN5VGBi!D(tVT?8gPRohMDIJc|(+TBNPy!fdaiB$?PrQJOL(MVf{S%Sj!E{2Z zpY69|(bvBe=6vs`{~Kq-#?ap0)Z~A#!f=iJk|@3r#^Lu#`9HVh|Li4VXl!9BYiVn$ zXlU}!O*ur7M*&y}@iTRWs=L=bnh6`GFlPOa7FIwoXbPdWK@;vkTbgMct{3KKW{5y9 zfoZl)aNwX(1Is-h`MuAVw=Ym@pOXK_4+tQ5Fli8MGAgJ8hTpHiOFY&nzp~{4IpWkT z^fSnis7s?tXE;QPzVh{~#ii`DRa=!eIcsam5^%qb*;If>HYd6HN;UYFKtx~`%6mQ5 zor;y%6VDLh^&CxnTqY*W#!UcvZ((av(eTH#knId{UCSaOJI+nTzvjbnSs2v!;Y5rd zFQzCCo;Y-3Tyw^xu%+&iB*e|+ak$izpx_Sg`hZhHb{7asXQ8sIH|it{$T{b51@g>m z2o(hrI*{F7_<`}O=n$4ObRJ~^21#EiHO-h?t)2!Y#~kn$rLwwVUx%<{qmi=mVL|ZIr7NXK zGs~1dV$3avHv~>wmTB^xb4~dq&vo z)x7sY(8gy8NBwJ~U`C+8asjPqWH`>|Hn^{yXfR|XCg> zou$q3V(Bc=yAyqpLv@Ffr4Ub`mpun+&U@8Tg8BVu=Ia&6x{5c;d2r?tR7GukM)vvC zIBrKvsRZf__bXzEn6@6wIZJ5-Y}9lO|=CUrHxO_IMT zzA{G{y(0WoeUcY5iMNiBz}9GUw|inlt|;oDWhz#oTSI@}-3UH=KLjqFF<4pQG1!Qe zFN;;SjxjoWvcr;JI`y}>miO)*WyJI`e+Z&mTpAuYdLsY0EujD9QS2>xe)5YYlIaeg z;uP*Ro+#I?l-pq18Nz4U2;yTpcrIY~UGNBJ^U*Ny}u_Z;ua&id=C!w)rlqxkwTZmQZLba}DA4%kmk-yitf$YBCxPuO z-rLuKIAG0aKTB`j)8K}(Ehy6!8+_f8-JDkKfsPwngiz=+4v|mGKM{J=HFJvL)@<29 z=Yz&AX@e`3?s1{Yx~F|!L(lxT?mZ9$i2D#BtvI}`b%-3hW^e@kblCjSeAxVfaaPZm z{Pg%Op0`jNrMs>h1-nVl$)O7SEJn>5h}%?VZV@BqA@dzW`}k;Ytg5^EKqvgStv!ec z20f88mSug%YP@AenghhRicE!jL|~pW#D=Ard*a+SrD&+MO~~qI8NlXcRzbiTNq8)1 z$&K1jPIAq^CuCi)^&D!RwJ*z%whfADZ*zY-n|jiXa~3VhKLqcCtb6Y50)`{Q-l9$B zqeHTyEq+sxx@huDl0i#*O-=^0l{bk67~PI2vAue6SM%4O;HTHJR@gY49n}}xo68Ga&i{1$sy19$j!mVTf{x_TS<7sJ&W%;G)=5(V_ai&X z$C@&`Pz}pCYbji0WC&A!C9?$KM7GEaT=3+VB{&4udf!I5Nld$PJ*TurlU&&YblAe+-XK;a*7v{&X8IdRV>V8 zHDZcHfiVe}Wvc-?iloA?L6eu$o zqLSguE#kQVP+Qg1njqxNzFUC?#X?%Gvi=dYHUX(d!nSsVYcz}Qp29?>rN&=!fQ&15 z*B!y=tI_j87N3LT$uKz8=fPLGCByqUtbw|io#_C4sNwQAUqb@8IrjIiaO&!u>1KM< z9+Q$NnzA3G{Et3X2MA-c;b^l-O+Cetm0P%5_dqbT3!{h<7jG1WvuE_~YJ)!LpqfZ9 z7S~(~%pA%J?$IEcbqO0GR}#E!q3X!%GfsjDRo;?)ujlSaf)jV_nX>1CSc2UVZr{MX zisy{jynPI6-|~Hpz-J`9o?$!HclD9$o2uCDeXhPw2t2>Rdv5*SJm=zsxw$x?TnD?o z@T?9=&NDGQzu}+G?`VE1w~4Vm`=&>igBP>62)qN!oKnE^UJ~l-9^p)Z##zFj0%+Nv z`Y2=bUjc88A^|WSIHUNQXL0pNdDD08ovR03NgIBt3@j% zRlee_BhgB%5XfP|Blw6#aJn^zR6`jalf-crGzqH)gAJf8=fOvHI?u>Qz0lUP(Jteq z9n;NFl~xz6oG%4@$E25X_}*8CQ!(cn%spb7gEq#yr0D8+4ap1yRvAcETyxD7#>c5A z^Rsoq#rDHCw(7AO>x8Mc=4=GVQOZ)R7RK0ujL6EQL|PKb_dqX z6B=%1rcI1g&cs-4*qV8gIGd_xmRbWHy_w{>A1c}ltD>zl(h>u0dfc@KWn|2xF}dD` zXgIf=40>2jZ7GSSYV5oHOjlcs-N}P@YsnXJA-qS`pK~pOCzNJw^7<_~B$|ksfG>CK z3E?DLNCK}!*R^rB3`-QEIA#p&QwK5upw(xu#ajkIw6M^XV}Ze{Lu5(BC(5Srn8UcO zn7VFYYBedbp$*AtWA6pBA)fn(Vjn$&Fo!b*;5-|TAw(|s7Ts{Bjc+CF8fz+Y%3e9ys&o_NvA?O!5`{v+KHPjgIXQ>O4Y4R|2s{u{#4W5S^mcqLoN{ z{{vn^VprJHwZs@c>r2#=!L(4aEx$h%|2AXkYg8!H)bTL@GXP0;J8HFP-82dC7DY^U z2!>FQ{nU`?byj+Ke7FEVSK=aFK%9N3Q5uzSg*M#{3t> z%nza%yI<$fP-yMf$hMNY0sd( zBUEK#khH=bIM0RpH^+q_Hqcuwl$u zl4oLpR4lW@STuT6zp5YpO8Ng;c04NP_>6H`JSo)B7v|wk_jGZOwOA1u3iZxBQfGHG zMbTIua7rg+4e^sl%Tfa03y@R+yzRm4NS8-YWQ{3xC}bx2Gz>e4mYsWFoJ%BSRq3mhk5{Z#dL-#eIy=$s z@43>;BL3GbdTEh{%kg0kH^5IIU`PCSTqWJmo*=>Mq6Yj{<;9^aT=b%{XFtW_o|VY= z4->xFBBk@9v}9j(Cq-fL9L=QjFqFhOj86(DxtPzu=6{FScf$8flynB3vZipHcQSD# z^^VP;0$BoRE9BK ze=-FDJEK!-n9hTy(>oa~tWa6XGX4TdWfdACo`*yME^dc)$Rrf>Ea(h%!mQ;NKIqDu z0N&F>rS(R07T@r78^TN1zPjt6!I;ME%Mh`BeH@B(eC2Ais}lCX?R&j5`k}&=YOL6= zNge|ynb%HMWwQ0Fk0}qlgaXfzyz@MnC843FE_)PZ z<2I{bFv;;nSi!C_t$E^x*ZXcr8$Wi8o93-i>;F4d5aXD$SbJ296=8-VfcpS|nyVm; z|J~jtildNuc`qB?_lQgu_WZNH6W#hw&)vw}YJjV zmQ{(cb0MO9qx;z2aHpRuHsGIw+7b2Q0vDI7$BDO+xW_#?aK$9DQQRpA>}>zj8582E zD|*b;Qd08~do+Vl6U$su6T47SAg%8OdxJRSTc{^dWGw9|wll--_!^qa3u22nXS~Dp z3fAXeDm5M`m5W}!IbB!ZRaIpFJAVHEDrG}7&Ye)cRWRs^H%&T{6ZtJ*gb_pdEg}^K zsfcYT6(wcJ8k@v|ZR+J(0Imz0avqd>FkssVinmbDy~nUSve>5LBM7g30%L}_Gn;Zr zfXv>o+^(k$C*R`@FTdlBzj9e4$!Wi*`uqdH%ow5wHM>)uhQAxb=x13XkmSq%;zppi0{c5i@i~Ty|Kvrf79K#B! zmgV82bhITn-Gx16$=7QO$AZcSg8{gykN5~L!A_f_-8a#ZADY=)cRZWR>2 z_N~mvl^3UjlV!*2rsGj_62qkCrV7aEbsn>cB$8R`@e+{BBCzXC#=3r;GO%$`;oxHH zyy^@r%vUXzQ+b;Eh8XacUTSkCuvIe{w~!i1&7puO&rc_hV8Ksh3nox))*g|twGpGy zx*Q|J$VrKx4&Kq2bS>6htvLRf&>Lwre+fhT!0Rh@=*rX%Lg> zxU9emVHpHDgbiSoR!%C1)Y?cYa2yF)Spl|?lBF5a@$9utG>k%rM&M%JVb>n-gx^U{ z>nAFcJzHOE2#QiFW<9?MWYRVI9Z)4fWi=}jQTd@-z4NA-Pr{G{XW-7ySu6U9mye_x0?e{bC+1oTZQwWPuxW)M zqyoBo4c)&>;bKHbAanjm{vMkdRvN$ewh1 z3yU7M&eFX8g0)>jV*&VOsJ%mfK5qZ z5V@D#>qtr|kG#%ke7vzEI)LuA&d(cK-8j6flIbzH1(8pU;qe-Vo7tl%rZ49I&7 z=HRL(2;+ybXVh3XhJ!SA9)3^l6lCf>7BU2dS=!S`j1a0}oG{aza)Y)b3gB5m;GMH` zXX3-o9)Tm7eZ|fCQS5VmYjh^E>dY#zh)-LoZiqp|eROkw{v_rM19|*^D0{~!S;A~v zv}%`a+qP|cmu=g&ZJWEyUAAr8wq14WoIZWu=pOIB`}#*DA|f**V|?qwTyxD?(*ON$ zV+U9;EH32_?t1>Sk^LXX4w?T3Zbi+Ft^NtUDvZniK(CcYyP{tH)98j?*kL+Zk!*6L z{J#Vk!gRP{W-5h3)PFUg`%DJn?TD3ihJ=w4%QB{yU!9#fO}`JHWBEy4fULmQBI%{Z zS<3OSd2}*(3cg)*h>~k@p}Akm97t}=*FCOIucn`#UkH9vAMi$q;Z&oK2Yp22!nSHM zShb^h^UMZ)np|{X+!SJDHXXKJr`c)AF^^fGQGO=M%RF5mI*E+P{*4}NeTjXbtuJ9p z4#<18TQA>Af(VV2((pj8M>{;-^IE;*=hmDjAp4|Rbm$aj4;Rg^r~8~KU%{#X-3~0* zy&rpU>=tdG##ud@?L)mML52uQ+W7k+NhvgfPh};c))vD5Yuxu&!6b=frJnK@kbq@^ zj;R%Xtl+O){wNtM?|&oHFulI0uKb{{yFbJA{|lMse_*Tsx!tx7#y^<%|3+W`n}Ch% zbG1~ZSw(-G6=4e=SOtVZ-i1$(0X_Mn?OSKrc+V z04*kHGpf^K69>)wW@#}gdEbHi99%SOotok$OV>3$Fw+=n|Dm%OO*dIUQ|+!btZ9<3 zMd#Yqu5oBk!MVnwe0GUQSAJA|-EPY8p0i`BCt{L&K#R+QHp`z1Q5M%TjyZ@Xc)6+* zJ1J*r%MkQ?BbusAnTm;2<{G18L|n(t()vhIbvEnC(rSl4CMv?*i44KVj0P=)L@@#w zJSWKvmo7|cDDkPczZ@AM)BfyzK^#Zxvthx^JCM(YV1=4sM!p+w*^x0`?cr`FSH}bp zxG+dTb~DL@^wPed6RwpB)oU*~3M)~jpLa~bnD$y>7NOcOFch_M&H8_9GCU}?D$c#= zV9aLjkbEBUyUcK zy@2?oYlbqwa@KFO-}O%XIGTb|y-&I`sl^(?n=ziF?HRj^YV&?!J3788Wdw&%Gz3fF z6-4e80RJJ~Vkc@kHg9fE;#J)Rdk~Wsr=X%l{?_&YDL1qOI=#xVCNlmm3zsfD}FdPgym8&1)ME@>c z$$whpHS{a38Ep(#h_h!Kw&)Q1EYFfC0PhSwq>~{!DwJ|$FC>+{P-^ef=imCHX-nbZ z>z}>|@h3g;f5vtHB|!dx>qaZi+8`>x^Pt7iw9ud=t7tZAXr%t+`HSQv-3V9-1iby? z9&QC~PZEq%soOEXCGjwkWIh1+#@wE+1cjsf`m-I6r?NPhCVakc53&51R*ccv$@9a8 zM{fsu^f5pdV6ZXRS#OkjE?&AI*K@L_7q#-(lN-|8kV{XVP zZ9|b*B6J{=Jg!z!6|gD&y}IRM%eYyTeHLI1_z>Z75?Hmjqcwh|G{Rc`VSp$98z|+V z(pFuwH87tK`R;Hst9S`YbP8j1Li#+R9#*YY&i6+4=?+iH(N-|DMmZe18ZfLAnm5X; zX~aPNi^iotT8X?6pSW@HMD~Cyy~LG~ukiWnt#;>(<(+ORU54uLrijmlahVQxa!eGp z@=ympl*sw&thb8UKEWt`CB(QODwDKHeivZbtlKA}hy@sS860)xOPfCVqbzORkRU(@*89Tvw@y66 zD4n;+Zh(W0msSM%StyhCigaLo9~V`QwzpL2b9#CKm|N*3k*MEcuuWKZ?!U6jzE*!~ z=zhciQ7HevGKl|ZHR8rrcK_6rs8aRxQW`|zO|*JS&a?uD$Azfn4w4}hl>i{|GhqW} z1twJI7ofIru}#2YYq!Vq-)U!7p;>%GEmNsjc@q?Y;H6a2T(`hmv#|Vms;IKQl+v`e zUVNI^SRFOF+T8doeEoEIy5jD-&$jJK=X&oWlfwq`BdyWBg-!O-n|=S%el+J<^|Pt>37}I3nZ3(!~N;yA9BsP>-lj1 z?sNmUfv)4!FLfit_7N76YVP(+C%-dx{tsUJ4%tmPmJcMKAWTLM?i?~+zl0` z&YxWvOdpwkTQj%BkY=+N8kp|FU29Aqxqdve7b2MJnHw_9FX?_=vll8D-@;vO%&o%R zYvzx@kZ1E3zYyQK8#*wr6F*<1+M0zu4G$K71KmrNUrqdk<%l;+tJ~+gO$(MU86x{BCyg(X3W_c;^c%c^Ouu z@(I7^(*=H2cq7GJUtFmYogT$}-N?5PRFhzS^qVi{o}LQC>BS{bV~VSh9OA3#vSmu> zl~dr?Lk|DlVh2PV=%uiZ%{b}p>zgH?BDe$|6Fjv$&=Njmp^E2aaj=1Us-URcJhr3@ z0x#C)EGlas5N_v<^0TB*+>&Uowcj0>3tD(cFd-FSu#nKpc{HmGHbDEeSt_I%z{-ji zu%z^3v{}H>fCyhoGlJa)m(^+El2KD@-qv}zq=xAZ+F?naM2J2x`A6b(s~GQB-TAKF(3%}Dwsc)4S$CF#k`f_iyz zs_)sqv^mb}b=mmUw>%*yg*kWX1a}HfF-1GD5-*=$DHxSZL*f<$dHiG2Htb%+9t(bq zFyjskdHC}v3>?e9%WY>S5p*ABhl_cPV8s2ik{_H@F1YQ*#M|fxYd$Snha}l7NxVYX zu?|ig$|vE;5`#OQop%4rgd1#cw#@MW1$!Cn*ppB4nI*(`3~!=qt^cW+#ALCUY)+G; zTrovSsn&=(1sR$m%u!J~HHIT;lz`AEQ%Kh=(OPqXbb_jq2l4^?68j6UcNq3X*#BD) z&7Z@{bGYwzD@2dFw~s2w)e619NNo5|26&Xoon&;Fa*ep1%y3`A)wh zpWm1?s3oUcR=Mf;rkvOz{hUembb{H#BSG1^PC755l*B0%kXInJA+1P_VSiWm!0y?{ zL4u_h#Yz4yi5q=*M-G-IQHEudA($V921)R9G)=GwUg!yiOcybsGJ@?zb{ypno(LUB zuJ^^8x5&0h>0>MoI?4dEl?eoxXT)x zC8$DPlwPScLfN87P_b(hoFyr%C=PW?Ma;i`@wY0uQb8PxyE3lPC_A8;#Oa0m+!N0~ zf&sx94>66KwPru+sS!uhju8??t(mkISB|%S^A~5N;u?-@*`6rN;xa)ETDz+Zt2@f> zyO>lXV?%AlwTlOwRJl;ghvn@=CS!_sAZMI7>^byii=lAaDet^1_U5b07-NiU`=Ch@ zw9JO`i$~=x2-%rS36cjA;{yg5>-jNY%0*)v+FX3EpeU;boOvG?QkO&X(U#5TMao9- z#*Nagdd*>q8|6lzPBYcv1F9Bh=V1SP6RE*2GuLCuVfF8)3)2Q}uceh0%7(g!HU8_`{4U|&zT-jl z&x%`0@t2JwV@JwH$Lhr}r^%pieG(}waaBsTw>P|zS^ieV`@3`$U9RnnmT^qKR2 zF9GG(ct-(#EcxXE^GTh>{BlRfi^xMM%x1{}x1^_h127A0d^rtphF>5{OlF^ou?B+^ zn)N9y_e74+UcL^kC+lshsy`rK$u+@IJQM4+hq89Dsc^ypd7gKE6w6C`lqqjbcKw-w zG|FT;W3`wpLYu^ok^lZQl<(RYdP7rPwGf>uOh20cBI|9qBv(?B#S9+HP)O6_0KpU0 zr_5GXRW;^%2Uo)JH_*^xpt1o;GPDAQWA24k1BKG(Nbz8#9?Vh9#~9ZHS=VC`mS=!z z#1w6O+Mj5bhouxpitrZ^;?rBR%}$+#L$Sff7nk_&sJ;U)iAkbbsx2#e4VCr%x!gjz16-X(K?28E%uXeABe z5(lCRdK(Aor1T?YO<_qz^(huatYBl5J84orCGvbltceAn=N!Y&C0dPYwQMNFYz2&q z9H$bnJ2rZ_J74&iJ6?tF` zMVI$C5~_1b<{MR%%alFk$2VdNi{MiheE6`Z64?wpoRp?NCgEHOzlC$vNBE@d3CMrP z_0$X)02u590hao)ONR=}=A^F_9;b(Yo~!4yxaX7$-WAcyVcr|jPsfSm07Kt#xA*p< znqBFa_7auDPG_k^COvIhKM@%IkRVeA+Xq6|kgRWCfPy6{E4RHpYu@mSHE$zH(dLSkJJ<8wAU`KJ z^<0!&@Gz53)dOJImjP^==D-o^l@|5RnE)t4Rp55$fho@iVzHG+tQ)eoUhqVf;Gtdk zWO)P*s%;GzL<>LF$27)|mSBfOum>Q9YVTYsC;&9A=0GW{y-6K}E?DmPcH7>e3~omd zH{qjM^=`ZPCLQ9_6u=u@_1;eB`!e~1?N@60yKTPKGlJrGbdM?7T`u6EJ=C{0?E=$_ zZM@d0BKud`L3d}uH!a%T;cYJ9BZkuPYRA_))$286e(nWduGX7l$yd7|xY-pS(8N9J zS36=Xi{tm=SaDYv)N8^)w|ByKb|# zP9xIGwBKDu@OL%B8ODbyo$4EBjIYq$f1SAu{(ARw@Qt+mUghV46F*$5X5^l>Zyio; zGvBT?2=ZFLq3N&HUamP?cw@g&$BVlnpp67)hevt0iBDTm^2LKHLA(>nY8u+2E?tIhF6Wnkxe_%fZc->pux%R!p=C+}P3;89mK<~su6 z3xC7QY| z>^7HX*|*IHbOHaZhNtGgc8fi>i~ZMaF=~B)`Dq4X|7ZrJP~V%G%f5d`igWzGxaRwO zpEX{l0X$IOY{h!N+Uat?RYshznIE^kk>02M5PxpK=S$&)aA$Dg3^iJLzQ<>RM=0^* zRVdhfMe_)-6To8RvGR3X(U#DQ<+M^~GMuDyu4(ztJ1P5LkI>{8P>;9>XVKf8t}~bjH~t|$X)^ee_wye8CVz_I{i;sg^H9DvIuf#cDfPoDKIH9 zAWX(hE(Qq_@GCJx#sDzlF9_)uV*I&zMJDqTr&u1I*StMAWWHe(tk~RO&uIaL1R`8@ zj~J@vE3J0dvSHQ5Yza8&yoS?qpU<7ci(6m^>5bS4o8z=&5(b)h?{SJ&l zO}9)TZMfZR_^o7lHa9D?8#j#rW}1B7LS%JcR?9krc5@RzH3%ywrpkl2Ubspd}+;m(_yplsA!~idjRSy=ShIeA%z3>Jj9Oee;zMnL^ z9+^}FhKUR%MmDvKVM+OkDT>tobv1+8v>CGJahmy|;@d}ZM-Js`Moxw@BuI)(HhjO^ z5u~CuTocM8WpAs!v2#e7s_Lh^H8~1XDiJw^ z!tLu{gM)OWpdJe*C5Ss1q;MbYaV$c^a-kq-^Gi%7#|H&v$cXaQ$cK1`xEZ7xjj^Ea zAWKG!J~>7DL0a_z<2={;_361TmOfcoLtbF<0&YWrl?*U3r1=VF*Ju0I+lvvEs1=h(*>wm?uK{fHG zoXgeKvY6eMeDYdz&a4K<9P1iYaH9tM#&*HOZob9^uCUqrT3gnl-wTKyaAwJA2IX6a zK5e-Mkt>8a<_#h^iSpNVL9o5ggqc_jm?BLtN<+CM&~;RolzTizx0Z=u^J*ZKjvbx6 zgWaHG<9=T>Qya%i5!?6X{{FP}-V2zKq!!YaWxA^n)9E{MGl;gqy;62=b`_g98U4Ll zJLHUZAK-e|$mn7SC*VHEM9wEP8%iCC7bwFz+SE^f2^)FXNa$^--gUx*p?Mn>^?8yo z>+gcGUdt2oZ0zNSMX-@H8)@@{EvD4=N9Gtq?UQ(Nv+?r~Xku%~tM@KR69vH;dj)AC zHhFe9XCI<;ZjYt9VNq~Nov6uZ5%cg4S7zBvrD_{x4U0g2wh+Q`jUAn4#n&claRpnF zxn4SHae=)CD?slWV&v{9VsO<#b zKgB&}OK?nfj!$fUY`4z68j(?E=GWA2Ep)emS}#FLL@Jy4D;37am6*f4n?3^ z%p-Pw-3OBd(=t&iuIrBk4C2GVw|WnP!=*riN&SA%@eOzM>r3Mp;P@ zVgTG2xwFCIUw$*^4lQ8beW%h8@%-_@4AM$~=sG<4caXl(C(lx;rtctlGF13D8DWSP z;hCC3+|)XR2ryoikXU^@Wr02@gJLDQnD=q}E`m5tOgJ)MVK*j7@ zrshqdzs0QXaF40oBIDj8ic^_gQ6VJEylTbsk}QDr;DPxF9Agx*LTLy|2?1xjjK%%5 z#q_uA{0#tA;(H?Hf>n7KqLbY#C`kqbkNElQS~WOj zK$h)g8>qAl4(1*~`^pA|^SqdUA4wNGb|^Ge(+$z;HcnG$!Z6*rQ0~Cnv}wWIDDc{s zm$@y}SI^OH<+~7UltfOn!TOGs;R)TslQi~`cF!S$QU@74L|z`CiU85drWeoG#J82r zd~-eN3zMd0>p9W_gI*~^yc*t%12${f7hvZU$`=@-UPRxjB#W_&6a+cDV2k*0Bbilf z*yKdt8qU6Q)xi36l@VkOHYQC9EQTT7;JyGE-)~{xD_{yN@9fcyMo&L5`o^ zm1x7yppAn-RU=m#Q?51zErr%$Q9`n6%NnaOBia5?%4-yQX%+CEDHzS?GYH$I#UUB1 zg?}G%MQiM5hw?Y6v`+WQkH1NV(eVq-9~oP4jY8Tz@%<}0 z2%A%i5d6c9fI|lWVEVu0xc)IZ30dhoI!fE>8~qa~Ojd=^Lte!A(s@c-os8=dL`(q& zcdgF^LJ;W7Cm^;LLL`J3fTw}Y)NiO=jc&(+tyvpi6Y?~(7N|mQR1g*^%_I+7YHDg+ zo6mWwud1q|>4c+^>}G3dMT-o|cE9$$?(X{j-hMxBZO&nb&?{5B6h!5%*s)>T20Pey zv?*mL7ke&kQSJ4HgqC>g2=HOM8U})dZN0^Z9Um65k?!kXbpsYd<}TkUjWD#49z-J^ zHiZ0bgRIBT3yQ*hHH5@oy%*%gN5PVn6#Hkx4O7?2kRd02$ZK?PHubPim3X_s;XxTi zH&I$w_4X&NRO+TP2<7mYnXs?vaJmlJRk+jc@WS)zroh`pSNz4_3%98jf+vybLoLRq zaGT)ut;Fj?`uM3eNQX`Ty{ePEpj+;yK3KEy!s0_j<2D$*z2|y&TOP38ehbz?I{8(Y z^h(AiyPFrm2ZhY4-28W;dcC$Ozp2F9Qp$Pq?d)x>iU!N_{8uW38>Z_?`@>imE{t*$ z>He;nS+QS(P5;ni<2mpEs(*kHb(vTbX+O`wqOB6!Nc6b`HThVprG0%4Ii&3Pv@PQS5K1h= zTX|!n=NS2-dOD04rKgk5PEl3k#MiZ2>re#g3=b?BP)-ICn+MT{yxGN~(841`bEHaS zyJx%3QE`{yHei#eHF&lrG4jSajeXh7Ix=$k9DOPLw#Xr}{yMWvTsVx;H6DRNRoT%) z@H20Swgk3_nkp{bbsC<7whGe$Uar>Hj0`|7|BpI=%S)VJ=4);>Dz8g+-$hGBxEm6F z6V}uSDL{*jAwmi~t7v3}wt@@9$Lhb1wNPS05-m$@3@WAA=AVpQ)0)tXk|@}uQ|hpB z=r}cgXAlrRm2L^0YYA}JvJRg$bxIJKnaHXfYw#vS9`18P*a~;QS>&KXeii7U?Q=l; z2=?kitPA6y^3s~iVZH>DAZ2eQj5b}A)_Gpm(nxNI4-mGqXCTKk&3>a2R)>N=dH*Ut zCT7B^(4i%(2pqkswsW{E`6JpLKI-vmvo?Dw)u|dL?e~Hj zH#Vf$Be(zwZ?q_L(uE23p=@9IXZJq*J%BZGO3S@O$ikVq&F?Fk} z(mSRH{GuHS`y1C+{x0Z8;?M}=ek&8K56pL8cX}p~kyK8=x0xG`E%?i}Kr7WtO~|~P zV!x)K8KKk)vi@?A5PSML#+YvuPvfmy6q)vvOLmVF3Yp>HomDZL;A{}3)&!)Zl*I7x_#r zLRCguj1-F(JezqRm5Esa{Jz`}r2*;A_GoJq zkAgpfq6a*f8Fd0k4FeaB5w`0ylSFiZtLe|nC%ra?NDvw1sE*7GsuS}AUUmFPP=f^o z52Ptk6RBLx3Vlil#eKuSODUIvbWLPq$>)VzrF+e7mQTiGXTvY4Q{GSa4)${F=y9cx zQ`1z9mFv`tiz7-G1`OkX@lk0xKI}h(?KMX9gJSw2;suP%=sp zsZi=72Gtozd1&TAB8EvE9I4gO&Ldr5BC)EBiqh1Zq}9&lvssUfu)9oAjo3XIae`?f zG27Varh4W%ZZq84*PY*1m(n!#Q8#2YIt>0|QZWpbN+e2>B@F3}yzRe^D6*}f#bV7K z%y?1bqb6qsJ2@#PExVO^7A?@t7HT7;N6k-n6@e5e5ZS!h+$2y;DO}BA~W$-zOk4BmaV#2suGE%vhj^b7o zG2_fV2n;LBjj|^s)f8cIyALie7)cv%DL=5Mzxqs%FeJNJ9Td~jm7WdAPa3t2NliPb z##AqMh8GFAu#}4#TI;Jjb^xxj9K+<27`_vb)hOMIPMWWxo7t>uXwRdrV4I!mZO!s4}khkF&>>NjEyhCYU&rC3tYBo577^andE~)-N+vpUo46+hc{4OWA}KUAw*Y zAN3}mtfz?MNxPHyM~zVKnx)o>vBJ7s;U}76gD=t$%TAx9hmR76l(1~fV=+|jk5jZ3 zXxCRyk+cZGAoj;cHNs+L`X{#*tG_gZWc-?ZwE8WHxh1=^5dU6U*O}j?uq9A$9-$z# zo95G^8QYAgNrd^=V!#H6+l0zEpwESs6pGh0s7!**|0@16vT$JSXl~!$yJk`Mm2rSP z&L5fHlP)05=6CUPVW(u`;h%Y6!lRqO27aFigSL(qj^D<%L(Q73;71$5tX6wnlYXUv zNO$MX!wO;Eb}O*!u>#m)DxtOjO(pfn7njCe$k-I@nLoDBpAw}wtg#g=Ag;-qmT1IA zt}7o|mY1JuGt6OG$PTZ>=Lf?KgCRZ#tT@99u+x9*0S|bL`J^W?E#!x%eP6qtrz6c~2mjWGR5*_a@tENIxtsO;t|V&=UJ(7AIn#T4_;3gLwkmT?OY}@4Kcd*% zNVC8MH+XV@i{nBV968v&? zBp0aNDJ$TX7=W|7A|Z)N_)%BZSX&IEUUH$8%NP9dMK?h6 zo+(&8Fm01NZ13>tPGEvTY^pFV^LnBg>y2T8C&K+bPCLbR+7;HIYg*TaijTt&M7eyr zqNH}F0yp1@N=eELjz!_eQszQhkTW%pmN3sa=s_@`C4_!yc1;RGm8-9RH{L5HRF>2r zpx4lIa)y*+te|M|q@VVUIrX;-lksJenm-RV2gP`B=YTNI&_F?uc)S3GAG=VoEXc<~ z$Iypw)#g<2x%50pwVcqijo|RrQUEPgWpKfD77GoydBGO}Sxwz=y!xEqcRk8@UgE$9`I$2)w6E2D%x%d{*sID* zDX0uPnqv#0nb7x|_^OlP%vL_(m+XlX*perijFcLcL$z%#I(>dq{!B1kp~6wgpTbm2 z%M_;*I(benbV|JjmO6c&wCfZT#1tXO>q*c(beAUIfSw`(EzSW{mo!sDI^f(A(&$11 zAinJ*BPjC!)V?`X;1*F!k8=vliFA2R4_98j{ZQs_E4J6$g1JOwJYL47yr=)rgYBx~S|26buk=F&4T2bR81fCQID6kbj*hA4&A zYH>p#I;8JWBbXIZy+h;_jhB#ONjRi@s&S0$k7QA3-S}-Z3uyEniM<(EYHd`XFq15} znUSszwsR5MZg!Mh@jl%loO=H5UhrUO(!esc?x?{%AbHta<_33`1BR7t_2kIIgbx$B^kAD7< zV2oYzHCCaYAqOuA5l*pR;mj>cBSs&`{82g^z+9%NF|H~8uM9eRhyyIr5o$>l_Z`=* zy;mQ11#5cQU{jEvPeO${X_E4Y4-)0Pm^3F$tQ*i2CrITE zycT>-;xaOk&6xQCq_hAsnZQUI zRp*rK;{I=M?)aBc;TyqvF>8jB5mP%*Ua`_4-wu#A}!}0_TvT2yvCa5$7 z%h@F;uA>w%XqEF|_Cu#{|5j^V9w%1y_(LVb`k|7s{Qp|jC^_icIGWfxSQ|V1lT?ZCW(x32=N zI-``B^bJV*1L_N;CTGSLO^Fcxu$JqG;_$llzQuO${@hOn@FQ+vC@#ty0u0F*f>H`8 ziX26Wu4u;+!5TG;znjsmFF53k!G^weO-+rOYAQAO4h1JEVjaA@pkW@!w_841l~L{< zqrX^!PBHsoc-Py`DZ+%_x5FqAdTEpdWtt zqw1N3qQgLuK)uSzrrK)wa{rlk@Z;nl)M2LH2jKvb5d$iGbR;^dl$oPn?!09dR^EmT z{rn4%3buJ8v`G>7zI_HV{{o82gY3b7@%&NEIqq^fCHo9N`8&V0VSwAE?BE=H4x<~noidF)7fj{*kH z-|AHvF|^2#YrAQN5}5aog+CxtY}TnS&qYJ_NQuy={ly!WCkyHZ)LEq*_D+POGqO=DO&cIdyiYJk8R=T{?ps!K>55C8-oWnFP>7Jj&x%0w-WmA-rmoOC zNQ?L%sjjNwpV1l-UJtlG5S}4@r?3S=oe-(>p8Z)&0njE!hMWN)px_TY&_GWGCxc%T z5gale^5|Bi78ZGPF^VfzAWZ6C?ZNbb1&q8y`d4(IQ5*M>@F$L1engS~^EhJsA0S(C zQ}!p0c;-`V%Af`bHE76H7QT85Zu`O*1Pdj8s@zH9dPJBuVU5qfm>U#l#b*ET(-GhH zf!*XsZA(`S`Jr8yFde^hZL^u0_LxKyjPSnlEq zy_KPPoM8x+Z&Y5)&4qac5G>yb-dZ3#1#j$X=W@TQ960!dYGz%|^~V7N(6f1#?DtpkA$$7aAC1s$(fHpqEJNLOEkqs2Qfca}B30 z4RKe~v!f|R=}V{zlR8kh!Nvj&n>CX0kP!Eu1*1z4KCWZ_vFgh2C(j~!?^QX}i+uC6 zAO2}af``5*EeiBStoq%K?&I2Zqtfl&``%Ss!w&Wk=3O>h!62; zdM&~y5UXp6)u?j4yqPUk))9f$dLcK9_Mj#Vrs#7mQQU)y8pjZFQN*46r%;G^`pb8t zHR1@RST_)-9}5zVDtsbuLG=kG!m2WrKODe z1qgyo57PLz^nHc}oG2mWhR(r8(DP~WYGxF4E}iC-ScFnp--IinFvDhd<= z(DH&u-P4t(-BMRu)iC;sqlTeJFY4;L*|+2U>PMtmu}ksFUGB?m*&Co_CI(W4lAQ-e zY-jpZ&5vm=E{KWA4s}Y!PL`7{m#W{LF^jGrgi$LE6a)=oaS)>gIMrl_QH!=81+rSH zmJ){JMT)b!Z}IeI2b0603VM0eu5+YSU@)3eW&EK8dLv5Hs6{!bM!`NaqVdkVJ%URq zi+bMK{G>0te!I$`Ga$$5z%VdE$NjmiMQY0x>X3(Vg9>Q8MQ-qulC|88zc=vI>x}>f zj>=7Vu#gg0@unq$Oo^M~h?`_xuEI@pkQ8N-lC|QcBEr=8l>=ouQig8irXV6!sUvG@ zUR9~1e2=B>!8zYkXfTs<#`~?tzoc>{(Rhw^|NE)eWP2OR0&MfJ#iSZT_G5}T|YQk!DAF{(16MJ#vWydxsEV7g6 zY{?i=q2J{2v}fD%BQmR%Y-kbjpFJw4G`r%*yU=u4BW`MA4k$8X#-i$1n6u&7hYehL;$d2u%WtzkX_{oByU+p5{(x3X(+YuNmrfcj12F8hr5`aH?y5%RvO>*s77MHa zqYNr}a-AOFQA)97HNY+OB{^knqbqao7r$`QpKGdGl80t z4$ak6HF+Xam9@g=>Zh=4?$sHkQ8_CEv`kqr*zK)mQIj}LGA*j8^lr{(U6y~S_93o* zPRNqo9_^vRU0nUJqrP97MKM^bjny{53*!v6qDQhH4QhQ^QYFh*8b!vr!b_?MLVIEB z_u4kDTtup2B^f-?R;)&_T!VD1G8S!G5;-8)+k_uk=cpNmbbg|5ygeby#tM3}bUZrE z?R#r!1_M>`$_0!xm^ct(bYh-(8LXJWN~CWv>J1-y>*gHN4Rv;Ip&c{0GdEY*H(A1K zcD!y2?&vEB){e$-t^|9?uoCGnnxNR@LigxV`B>1Nv{SPK?}YXxBhkb(WytHQ6G2HI zwuJY%jG$E7r9Cqk(C<+X4&d%5ka+`FDuMBIylyNziF z(yq~t&W1*CqK|ri&pnKeJcnCZ^(HKgG8^iSEH}<_S?S+z4Mgkphx|tj4$sm$;fTs` z4M$^f$^hFFVk8!VI2NKbG=Q^FiKJ=F{=ldFrbDV;{XYJ5eDn`ik~qZ*{Rj6VF9%H(G(#vrx+JN%}#$-X-ImoGW!6xj{ZbH`YL+vDjVA56r1g-YbahDolZ zkp>-!n#ZdRkocvH+i6asY|+{HY&$9sfoj{?&OpBX$_i zuRWipGR46W^Uf9BEwBNsbKXACx?z0yoF&=p&iV6nTCPFXW{kc=SJY-8FgvWJ$hJwV z;=^Rai{M@zm^Ca*YPuFs_uh$RivxO0(^|ACBf6|X9rnywzR+1dG-oH=j1w;{ezYCQ zHh9YuLeUR{4XMDZ`ytd}EIjos@r18!NmJB)7{Z~#rVzV$SnKsN$ ztAj~<3whp^LG$#hGm^j0-MA?2GEh(kD;FmO6c~UFz%*11%w!&IOdf6YA8m{mm-6Cl z_5pMwPn|rml?GvzL|~PqaEiAYlQf1TlRZpGU>CmtmR_SNXg_u|#cR>Q z5FOeLO2RVMM29Z-3Aw;FxQ}CxYCPx&Hr=O1|Gb=Ob)-J%U&^|GaA#t4~y#LJ# zXw)c&&NVK}kf8PTJFo~Mk0hxk+#;TBImw`c(YDqt^i+JR2KVF3)SpG@R$a#{#@{=~ z-`n5cJKogwTYT@(KPR5ta(wcz z*2NGHL^4IWM@7urz_?!a}F21FX&{uMzA2}D2(y-C=50zCJKsgw`Okhs}|ue|l}1Ek-v8`)^cXYiRdC)puRNPrv_7D~-oTTx;`ZX?XinjKuRF zLoEMYE-7JSV*8KTdiIZc+5$iFSIDJJd+~giR3S}7-3U<@gToQW9<_BlzNHhPN0Z7tH~=xO>iDQzlR`r~fcSOswzYN1JJ zpCxBW0~H`tE)3$)Fp^GAVNK1Z-vmbQ?ln8$FYh~yL)TSeC>5dGkg8v+aX4tR4bPz^ z$h2;8==K16Ww~;YCg~qan9?V<`InYMmr55qbcw@4D)(=}+SlE24=y?YWQ;!pE~{7l ziSEuy5Un{0STr44G_{^sy$ZT6+_}?SFX<1IGLkMgKC2QeFA;ex*SA)8Mb5jN;7Fpi z^gMS%@T~6hzQGWA%Bu%{d`$gA^<}%dIe3yb>z}R08#@ykF+pNf5r%PmGCi7hO+#b%vfg#r7P&I&DduAWr4I$h}Eq_nzrAkFF9@E z!6=VlsP+8bFx3Y9{7E*7sXU?S?c|VCFi5`?p+bgoy{V3UR?Fq}!-@yNHNUxcB66U( zsez|t59VDJuwK=Db3=?nm1MwCalNgHPUk6eQM=yk=5!-Ju7O3rPW?}cw@F04m48JG zdPZOdf6O(j@W2RoWCT8F&n?fK4XM*-6`sH|oE(5nBGEVeiNb8CiAr0=q!VJ`T43BW ziBu8ovyw>3$CdEItv}8O90No?1W6bpI7?17Q_;y+bdT0KgaJ)z7Di;|SMDi<`}B(f z)+QwqVE@@TXo&>c9E4_;jEKX?DB8mODKAY21ofgauk(3BQ|4glKM+R6$Y#u`e4^G2 z(T7V5i3!dg!NUGvn(d=UU!NFA^AZy9ClN_3lme)P!_J)r7;vk^e@UX07=W`RmC~b` zD}3vh4U%Z#*UZP0PQ+2ZvHdHga-V}@2>Ao20R2z`MgHTs`A36F*f- z<2FbV$UKX*?PNK!dv4--zf8bu>@(o+v2h_F5D@!*>&0Q$@e@T;x~!hgoHngl&(!J- zs!jyZWUkiM@>8q%0o=lib2IDqK?=7tulZ4f66jICZYeG{U-29(Rp51XxNtr-4ge&`v^-(yp*5j_S1T2bCsbll0GTSB84=jh5=nq7$YxQyw}S5!2*@&cf2q`KPld(iAvi@cU##s$GjV7l)4s zKQ@?UvRwSS>}jkZ26dspHVe99jIWR|c6n0{ zVX6phv-LAsO?i42p@9|cXYNB`?W=J5ZF%Rp&Ip5(3yU@qZ{VJ_RsP_9*c@(Fjxi^d zTorU#S{~~;;oWcgCd)_%hDCqgBhVcP2+e6%*Dnw=3m?iInp->6OD}4Ljgs~$n+f88 z2P1I?0_#;s#50NLdRp)CK_(Y*u`*SI=`XWm3#gZfaR8f-jb-Feof+E3u|0W^IBJ9f zyoA_PoAZUA2$jT!=pnOO!o9B(YUk>t*BT7_8$_K->kSLYW*5{5?6l&gS4P1l)I8Zf zbRK8r%C1Cc9SP?_yAT$!TRzJu<&L$eBaqh}4d@P6^uRl66l{eS&p?p35BC)v><|e% zUQPndj!@r^!3q%CAh-|z$OdD;LJ_o1)*PNn25UfrX+?77)h?mYhNuH|iISz++N$}s zBDx?C4@s69gUs@jrO?nyJlVxfZz}`0GvI4nFlsDPQB_s9>O0g$QS<;DE_qsS^mt?h zjrf7Y;ZB!`G(U4Vs1-Q!Vp~ESoshMXtyY-NS}r4$Br3xI>f8>TFOcshv=(F4^OT&)|D6-icQUuN`5(jWe`W`&RL@nhhEcvJ%~abFu{2Yv;9twu z*g>tRKfvn%6%Ex_^!&qnTS}}iL^K8r>MF#kE?TVjNM+|;GrJHIn5Rn~Hdh8$2J91_ zgdAnRgT5d>7ZMZcChY~Up?^vDm^;GSnH)`ZGCg}=SAN}&YF-1ZM0T6MH~_TYCgVTt zRQ&Q_4+FC!6`xs!OhYf_$HZVz#{>l$F(CKDzrYW%mlc!Ms&kGyFB^Ha-RwinRyP|~9XRS2(vcvuEmwgnH54L`jFpxwfWa}>8H@AOXH@MG+^g{a#c;aF3)*Xgp{*dpFMgQ1})2=LEzA+3Dx9xR`2(-~3 zc(7VFpGNeWoc#FW4+st??+lq~c-ZZy` zO;#b_NW4snxM{`JwA^^ZDZc%<}D353}WT2K_ zk5f^>%&3RrG3k%3-$%h_ef0Lzojn;B5q6B&8F5^cu8DN*qMc!=wF9_7q(}ZmP1-bA zBP!{HnohdZn-RM#xFpGj4y@5gD~`!%MWmQ`GhYds%oJWHeRMgjx?keoppF^n3@{$l z#2J1pa?n12H7G6FOxRbr0HvPGL@ztan~2}(Da=W(&#Gh_u#<~5Et!sAoa13!%*pS| zQ{=HJi)&i5+Wq_JYCkTk58ldqTI6UGA9eY+gMiI&hwOzy$f>S;_}+Z3+DyLeim4Wl zkLkwoqpzpIZK?-7XZa?;AMI9ZuCGVRZMBEWEm{Bk+xTzDGIU2wkiRZL{w@qq_YgZr zP2i9|rZuyN8L=6*ff^Sch&sJBW80`;FA15l4`)=UqzkPfO3)ngxzTkT3RfEayikgG zyA2Z()3H-{F$p$StwC`?ayY_}eRi8yFK!)==RyR`nhLF=RTRbxjF07xD?H{U^NnZz zJKl{L!GRp;SCk>>7V=eVKn3Vm00hi3wDewE2o`1ubO*@|Tk!RkD3wS{dHdrHM(<;a zziSZO7RyZz{x{0B!Wk6fX%}_+G<>_1{92H+c0DQ5IDW*L$dDkT8ClS2H~@%or?@)w zad~P@A+>_uZ^_)a;|QBH4N-HY|HaxlHE9B^Svqaowv9^Lwr$(CZQHhO+xpU0rL!u# zqGQfPOkd4K-|c_!#$I^Vg^>|7`hhQtN&rmRS)BZq*b;HD`7b;4OYq8y@D#m#@!r(7 zW~{Ti7uY5*YciecpA93Ux#%!&6_b{8V|NEPIcq06sc;TcjGkK9{2Ra3do&6A_1S!b zO`2=|jMI}tQ5%5elWcV#t(Q2Oq=W%wR3S$yg+RbBNz=v`$*EZ-IFdCPuv!DpP_QU* zJ&iuDarPL+(|Mt2$mL-jy|YNq2)wR~d>&elqBfTV2~%p~lM5J!d2!`2Mgv%7ZR%}I z`b!CGmHygOXoOptPp38ByTt1=x|O2qK1z8CZ1oC^rECl?n{eon@-h=*o?|KDMe=2% zdZky%Q*&0Yj7ig<*>HlaFlz>9{iXR|pnP~jB841yEdtHivE3*TvGRai0w%9%A`+M!{&%Pd zM*{$xSNw-Is9`j=aB*_!zEMEiX~#;q z1Y)FRo$*Ik&o%tj2RyZnNG?2mKS-xJUL|s43od8K$9=D2;nB~WN?t$Ix4iy%OV3-f zb!bwG#{9yE@T^;LZHlJLU&i+^#m?{siU?3`oIm(|{SX18jGQW)!w)#wrxXB1>KGBsjdnrq#4#@@Vgs4jm71#9xYGLU} zs)mK=%7L0ly#n&!Bw&&cUzQL3VGik7_{Dee&<~2*vmE3j9mS~{q*I-x$@>YVes~Kn zb_g$cg5x&NWQPe@Ur7BUx6UCC07k>az`MQg;2S{XFOdB+M0>EnWc53Ld&0d1eQ#77 zN__~SXfQi!Yum1ri4&gH3dx8c6a>M@L zJIDXWWNg#&(p23*|LL27OTZ=oK(NG*ml+xYLB^@Us>>h&*aF3=?Cma0JO^1@Uiu&- zrQ*uV%k5&VtXC|z$Foa0n5_U1I9DhunPqe9<#l?u$@cD#2mbya$@xAOSde(bNKu3? z_g- `pBf|442E27dQlDnJ;A$*~PwivKv$M>g`aBYg-rqkg&DV^v?Qk8Zq!RSsND zxCbY`h)*2{fDsV{x?uv!y4%x{5te@XV;*_gQIC&jQkK`L_k7f@&3jPrzgCBL#g^(qKbTHfYo;*;=-iodXO)kGk_`HF}#E&o*P=JA(o$?@O%Us zdx2Xq+W+qZDK@29ZZZ>fsa2hMNm2N0dn2+cJs(~&QC&vjei_75h#rdhT6mnhL#J8E zSx0vpMuRm(pIi1Cvc281+#U=r`lzkjg}MK~v>=KzgiMXC8fm(@q@r(8qPZ%#>dLAt z^qR13p^u5r;EvTLu!CZpXsfzIUZy&Xo0C*_Qh_RsMxQ9+<+?Jo1k8kJaf5rwc9}P* zb>-fUA+~pAA4ysoyi}(6la5jfn2uVfT1ui`O+@SGykU$vTQxnfc9tgYYfTWv+Tw?c z?b7%kx})-@Mz#QcuLL`q62~tt=7j6sX{f*E{Dk(0BOue6Wa-k5u1+~ut8$_9`WMem zD`aW@^eD|ZbZY^)MyTSGT%<<1h7C(?f;Eh$%HwI6{*nVOVwXpe2A)dl6ja?{dM8)^fhJL%*tn-D|>yMljSXT z`Gv04t+rr3I2z+G3Q^{v4LEb7QH z2wDtzlG7&<-H!WQ-W-?*i`1L z{`pSY>}wUq``lxhpY{|QPavOrmZ^OykXtWyPvS;u>Did;>B!tRQ zT`2LYITXuHIqcT{H&}Ej2M()LuNd&^1di@0H9iBQKLiiMAD4sP8$D-Q6kKpv0i!R{ z7Q2Do8^nn|d(KYB!y}STunJ)8dMcoP=iV=e zPqI!+XYwFhhv374wv@{*QekH9OmFjj4+}OZ)*fnb)E{c#zL6{RV>yyeuTz{uaAptF z9CCQj0UsE-NB{n}va}2HHxd@+ZzwE^d4etr`Zu;3%irREBa>+|Upb*>8=bUh-}pa; z(RtEpst*dfst=6cI>JKIYVty$Z}R~U23HIdr9#Eg-$B{eVjD{A5Zw^u1||{6cku*& zpOxpTLqqeJhlzzPjtaX)CnTf8qU7U4^`(U$M%?YByeCa778h;A_cX6caMXTPPfBIh z=gj?;A6XPuFRa)iL=eAdQS^BpEaKW)aNvCTy=WVjGZ&;zxsp47>5(J*`$#ox!Qf$l27=A5GSiGVln-TMuHxu9&- z*3jklgPIL>r4TPUKC3^%b{dRP&OShf0(Pww%GcjL$6`1S#L)ZH=QSoRL%!mlm z4IgsYJ|b=pm~toB=|*0*kUQgyw_PnTk6N%3V5nC~9+_Nt1-9vZgy9|&n}&znR?IBQ z15GQTVbi^alshvKY3m@49=irR&3%Tv^eYu^s~aYGPf zDx|83Ck3oNk%;!dAk|q16vy0we#km(hnELWw;`S@=Va+IR@imC7!ERx19PEIWlPy* zfmz=Cg$mSl9JuQwc*jNLftSbwtcX(zJ=zIjW8z6rNItKB#T`A%mnnrx%680~&u{u> z^bKsf_G$v?2Jp-Nx-IIk>dTx3&5onalqQZN$(w6Qx(%Nt5asZJQrR2{bw})SV(fZE zPHpr9@nWEM83}UJWPC^;w~Y*Q?u&&-FfOtIgFbs7-i=^exRRLf_CKk=9!cdtS;KHC zlsJ0&ZG4pt(C;jW^RdJ0$mWygA{b$N_0(mAj`T2gWe91@yPo!+Xxv&xu;k3F8eb7lt!Mc2vdssT8!p9lpUzgKQ}$r`)wXc z3xs?-cde2WiVZow&lfiGj-)vubdjZ22i{Ca_AzQp@;I^oOsX*SoE%fdvoIXT zUe?DRQyt-%<(9PW3Rzt`{u!U^8xel zMAErux-TNnmOji@crjm(Ij=`(uO~q9M9tlxwKuJ7&dnPl`Vc5IwRnd2Me4tz$Tw#= zrS}DQY}#-w=ue2fLNGLOJ`!A~+1}V8Pk&JjGC0fgl=b58D8?dOr1JJuaoLFmq9io~ z3x!(Vl2NEYh*{q9o*lw6QN1uMXG{6Y!@L`5UX&)PFNSf_Bna~~)m1Bl2y^LZ`>bbmmdzND?d6fc@Z)5}tk<=i12FK6@Q`78F*@bgGQ2WAB*miUpAU zVX61Ql=a4hHTA6up6iZHo&lrC4(jdSr>|r*iE#WN*$q)ZVo%$rE4J>y`W6r@{(-st z;Nbc}{C}06dJv9%iGPx+DIyS%)c=ms^PeEmwF;^R+RyD-6EPhO@M_>%r6p*vP+dDX zp%@rEir|o(Zs+ReN++Sq7-~kUPU7hhMI$skmZ7a6r+nq56%cT&)LPX=oMUB1GR)kO zMtT~v=5o?ysb~=(SxWfI%14JbgvsJ%i4>PniXCRv-o;5GMK6l+DCdKD$A|o-SJiHz zBSD5eMij#0wvtJ8%;Xr!%2SE-+|}i(GfcP{u(k2djvTm7${qcBYiaSWEajPe%Car+ zOr}yX(&f`a4jT9;r!n)x}9W86iif^}GP-@zL=s-fBB~?lpU<^fa`O*{~_Uz4$oR`chLE4QaWH z+uh%@H5tMR!Rz=Z6ONR_Bef z7M$b&qI`7Z;cF8267^BsOtgpc$PUN2ktIr5T4VRlqVslsBa)5cPcv=z*;(emg^Q4t}$f|sjx)UxDx`I@F+YmL2P%FQdMQ0s8G!( z3%wxP6JY`NU3QdS_xup5Sy&^fWe35jW^Ttg8=^=DGm)In@M2rkP!UHBM46}_PSR=) zW->K7Ju96W*BTU5T$>UxGkHO*6%ZQ8DC!$Ujog9#^xw?kLmlJ;qi7WF89cSLrs~)I zcGO#&lM8R2-KCX-)m_y1aG%e~Lh>p> zh$P@WYiCUrmc0%-&AbMPF6`Q0=*!)P{lT5XQ$*qkW~S*>)XvB)r~tYmK`2Xzz8YP+ zb}vPip0uRa;+bgp`?)r1Z<`Iisd7Ns7Zh2u*0Qn;py^_|$t}%a@QtL$W@(SKw!+oA ze#kMCIbAfnyIVW{&4a+k#_I0UAx4}kJqAbD++*aJgS)(V5F-Qm1TNe~2H7fC_wz9T zUMRo6)7qgfo<#5sK%|%Dh1LQA{8}?YfCK&+p{S6t*(aJ;j*sAtv3`>u)>8gT*?G5V z`(>#+q5nvt>xmt#3^Df5icN3_L5h_c5H-QDfh>JVy|t7_>n+O+Oy{ zH-zp9XK_KpAdo?n(%;-g>MyF!LkpUNrNA|n_LOA0}ydUqpe&K z6AXnv>CfIWA%~dJf8x1q-3A#`4PO~R`sMngxousxU_H(n^C+iw05}2qka@0`>WUqXfjW?L@@3y>2_DNIxAWn6)cYO#c}14cRLPSPR$M(z-sNMNA}iz!jBNFMN5w^Th^#P-c}D9t$vL$riv^Av`6U&v-F2y?Rb3z{bES2wxu zOM?fCaBgtfpJ@#|y)FM>_5M#L$aRVfI5IsDkcGwnZ|nO1dJ+F=UGMoq`>L+3y>q|y zPx-KV39=9eh1w<3n-ardvC-iOCkhf#LmLXljhKRfretxkLL1sSja0iG6ftxvXQ;Dg^Cj;QlFDqySj#n&7-DWnRRjvBPf_72-Oh&RWpx? z*S<3wqQDV0>8(|jt^=6?lVYC9x8{T$4#Go-(Z*UpLbtcpW0`wIwn*dBofc-Wit zM%Hw1mPZlfcq^mwbbTaI5p9eyF+FTLqnErzNBXioRZ$bH03O+%xnKE;V+8sGiEgJ- z_8)v21`sRFnB82{kq251zHGF$2px)a6KpFfeR|Ejiqgx4G zrw-rmqeAo>&X@PL?BNi;)lm!Ye-Qn@RYux)UtHvTi=r6WAJZuQmPIwNKgNYyG?$}S z0}gtpVXNQQg=qfff$}3Cw8-6>`E6B15wbNIphB`i(+PxAD5VIeB)^lO*YB`pl}n|? zm_l1f^@NDJrBL8!%Tn5<{@PiYtG=n2{)>?640J@ns+u+BKuJ&A!p5zbvNZ~oRWc>? zO>l!$W5%ErHhX-9B!{qe!X$^VaRQ~*t;)R|#Qg-N7B8Jqa*E|2dpf}-PFp~Dtfo~s zB`k-*?Z{P?NauctEZUS?IE?}spCs|iv6VL(w}L4fm7P0^PF#NdWGPmwilU-2`3%2i znng`s?UYST{yZN$n^!(%!lqd_g_T`vD0M;Etc=2f=LFh0o}vcpyvx0McEz-f;+*FM zM5|<4J9PHrZe86$MQ`V6vRmCjt&lsiPy-xfUoq?eAHin?>UE31VPNWJx*o9$^ytj6 zat!|w9Q0J~ZatDSbaBAlXf612{3-ggdQ9yF9;!2Sof-GK=1ha0i8DAX>bo<7Yl|vLIDE>TCLHwvqx@+Trd#Ym?Mp~`k@ZCo79f;HY;yeUm>`fs)4?NsEZX5CVK2g%05GoA59|L%>0xK!>L+&2juiY4IN z7_5wB)6_DX@lbDZy?Gb6`aFmZP&jdGaD(vCY0plRl*X^!b@G4~v$!F=kKW&CLz2@RUQP(OhWlKNxGBR(mGLFuMR!dK2SwgU47G`~2N@^=M+ia|oZ-#~BlR!hzVUY0sS z?UV#YzFN0-n!K7f3580U47vPOv9dpT(0hZiI;%ylPb+Jnl@i~@N3Hx(Kv)fbW<#uZ zZGSL&Qo32)Lx;>WIAb`D2T*5akKjXE$_2VBcY7BY;mDLDsif13%sE^cG8{+Ky^Zr5 z9Igg;Y35zq1t>19G#;wN2U{blut;gOgvxC6lIbNw*-d(mT1A~4eDFpx^{;4oqS6Ut z4!8f7tTO`dfyq1ZklT?Ksu-7LtlqJnJ^-O3b65}MDGLf#fhV}8!zjkj$bf9}ICt+b zVJUryN*}3t9%xse3>Cu*TpfR0UO@~c6=_w>&t$z-1R>`V;fq)N%FOdgrUx>* zfBJDC7}4b9R)pa7IK^Vydodm7v37)`_s0d}&jHro04anU`S7|%V;iwXw>@Ey!#e5a z&hl?U_)3kRRKwQjf_*5jsLfT#6eVojTis0z&70?X=2w_%dn;`}LsjJ9&|P14d$r`P z-#p{8hyeWEhcl^+M19QSeI#Pj}fYF5gwh0 z9Ib6Ux9cxj@UON$$*=JqWbM~1|6UAwtdf^SFDS|-*{qJ1LMv5o>rfq4NEk2WqLOKw z9we9`1kVMWz42lcy{6J~$*Qmn#mhC3%W==Z*`AR}a2bW!E=V_6u&3zn%f_i0jZ_h# zz2)ht&EB~h01)WtH?8xLncB&E!Ntp{2Cf?0!)|T)N3Y!XWhd0JQ(#zGwIc7j;bTQ* ze6ISmo;1POPwZZL_*z{X8RJhUypuPTZR<{6dF@jyq&FX2NJ(f#hS6mS zf^8JVyQ+0bW>C(kxbo_ht5mPem7C*A@I$CjW8cj;W!doupr-KE(g(c&o>lJUm z@FdqSn?`lRP9#ucSRX@Vshm;gRmrG0%BqIDWT7Mdl~2Cnwnd?XB%gVZBA79O4+TbA zf2yz1xpw`SbWjK^#B!V#x{YICT1I;blv^&lXvWj>)k%mwkeO!VsvF2Y+E?DLzP+u8 zlTHN=;QtGE?b?;T)faCy$)bruL?2I?W4avP;}TbL$R4!GF+WBYwxg{RQWV)Sg+?M) zmlVO9K@Q11zXpJf$YO`EfU|K+f=}zBd%1lnR8JFFJH?g^w7$~t)|=3oi@HYY&

  • 8eeO%kW2B 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 z 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